diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/CREDITS linux-2.4.23-pre8/CREDITS --- linux-2.4.22/CREDITS 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/CREDITS 2003-10-22 22:47:54.000000000 +0000 @@ -1238,14 +1238,13 @@ N: Christoph Hellwig E: hch@infradead.org -E: hch@sgi.com D: all kinds of driver, filesystem & core kernel hacking D: freevxfs driver D: sysvfs maintainer D: chief codingstyle nitpicker -S: Auweg 38 -S: 85748 Garching -S: Germany +S: Ampferstr. 50 / 4 +S: 6020 Innsbruck +S: Austria N: Richard Henderson E: rth@twiddle.net @@ -2208,6 +2207,15 @@ E: wolfgang@iksw-muees.de D: Auerswald USB driver +N: Paul Mundt +E: lethal@linux-sh.org +P: 1024D/917167DC 563C FC60 83BB A3EE D816 E60D D4AF AD78 9171 67DC +D: Linux/SH and Linux/sh64 +D: Occasional MIPS hacker +D: fbdev hacker +S: Hamilton, Ontario +S: Canada + N: Ian A. Murdock E: imurdock@gnu.ai.mit.edu D: Creator of Debian distribution @@ -2711,7 +2719,7 @@ D: Dosemu N: Duncan Sands -E: duncan.sands@wanadoo.fr +E: duncan.sands@free.fr W: http://topo.math.u-psud.fr/~sands D: Alcatel SpeedTouch USB driver S: 69 rue Dunois @@ -2967,12 +2975,11 @@ S: USA N: Marcelo W. Tosatti -E: marcelo@conectiva.com.br -W: http://bazar.conectiva.com.br/~marcelo/ +E: marcelo.tosatti@cyclades.com D: Miscellaneous kernel hacker (mostly VM/MM work) -S: Conectiva S.A. -S: R. Tocantins, 89 - Cristo Rei -S: 80050-430 - Curitiba - Paraná +D: 2.4 maintainer +S: Av Cristovao Colombo, 462. Floresta. +S: Porto Alegre S: Brazil N: Stefan Traby diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/Configure.help linux-2.4.23-pre8/Documentation/Configure.help --- linux-2.4.22/Documentation/Configure.help 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/Configure.help 2003-10-22 22:49:39.000000000 +0000 @@ -2,8 +2,6 @@ # Eric S. Raymond # Steven Cole # -# Version 3.01: current with 2.4.19+ -# # Translations of this file available on the WWW: # # - Japanese, maintained by the JF Project , at @@ -19,13 +17,6 @@ # - Catalan, by Antoni Bella , at # # -# To access a document on the WWW, you need to have a direct Internet -# connection and a browser program such as netscape or lynx. If you -# only have email access, you can still use FTP and WWW servers: send -# an email to with the text -# send usenet/news.answers/internet-services/access-via-email -# in the body of the message. -# # Information about what a kernel is, what it does, how to patch and # compile it and much more is contained in the Kernel-HOWTO, available # at . Before you start @@ -109,6 +100,15 @@ like MGA monitors that you are very unlikely to see on today's systems. +Prompt for advanced kernel configuration options +CONFIG_ADVANCED_OPTIONS + This option will enable prompting for a variety of advanced kernel + configuration options. These options can cause the kernel to not + work if they are set incorrectly, but can be used to optimize certain + aspects of kernel memory management. + + Unless you know what you are doing you *should not* enable this option. + Symmetric Multi-Processing support CONFIG_SMP This enables support for systems with more than one CPU. If you have @@ -137,6 +137,15 @@ If you don't know what to do here, say N. +Maximum number of CPUs +CONFIG_NR_CPUS + This allows you to specify the maximum number of CPUs which this + kernel will support. The maximum supported value is 32 and the + mimimum value which makes sense is 2. + + This is purely to save memory - each supported CPU adds + approximately eight kilobytes to the kernel image. + Intel or compatible 80x86 processor CONFIG_X86 This is Linux's home port. Linux was originally native to the Intel @@ -1141,6 +1150,15 @@ Say Y here if you have an IDE controller which uses any of these chipsets: CMD643, CMD646 and CMD648. +Compaq Triflex IDE support +CONFIG_BLK_DEV_TRIFLEX + Say Y here if you have a Compaq Triflex IDE controller, such + as those commonly found on Compaq Pentium-Pro systems + + If you want to compile it as a module, say M here and read + . The module will be called + triflex.o. + CY82C693 chipset support CONFIG_BLK_DEV_CY82C693 This driver adds detection and support for the CY82C693 chipset @@ -1210,11 +1228,26 @@ This is a driver for the OPTi 82C621 EIDE controller. Please read the comments at the top of . +National SCx200 chipset support +CONFIG_BLK_DEV_SC1200 + This driver adds support for the built in IDE on the National + SCx200 series of embedded x86 "Geode" systems + + If you want to compile it as a module, say M here and read + . The module will be called + sc1200.o. + ServerWorks OSB4/CSB5 chipset support CONFIG_BLK_DEV_SVWKS This driver adds PIO/(U)DMA support for the ServerWorks OSB4/CSB5 chipsets. +SGI IOC4 chipset support +CONFIG_BLK_DEV_SGIIOC4 + This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4 + chipset. Please say Y here, if you have an Altix System from + Silicon Graphics Inc. + Intel PIIXn chipsets support CONFIG_BLK_DEV_PIIX This driver adds PIO mode setting and tuning for all PIIX IDE @@ -1264,6 +1297,29 @@ If unsure, say N. +PROMISE PDC202{68|69|70|71|75|76|77} support +CONFIG_BLK_DEV_PDC202XX_NEW + Promise Ultra 100 TX2 [PDC20268] + Promise Ultra 133 PTX2 [PDC20269] + Promise FastTrak LP/TX2/TX4 [PDC20270] + Promise FastTrak TX2000 [PDC20271] + Promise MB Ultra 133 [PDC20275] + Promise MB FastTrak 133 [PDC20276] + Promise FastTrak 133 [PDC20277] + + This driver adds up to 4 more EIDE devices sharing a single + interrupt. This device is a bootable PCI UDMA controller. Since + multiple cards can be installed and there are BIOS ROM problems that + happen if the BIOS revisions of all installed cards (max of five) do + not match, the driver attempts to do dynamic tuning of the chipset + at boot-time for max speed. Ultra33 BIOS 1.25 or newer is required + for more than one card. + + If you say Y here, you need to say Y to "Use DMA by default when + available" as well. + + If unsure, say N. + Special UDMA Feature CONFIG_PDC202XX_BURST This option causes the pdc202xx driver to enable UDMA modes on the @@ -2031,6 +2087,17 @@ The board uses the R4300 and a R5230 CPUs. For more information about this board see . +SGI SN2 L1 serial port support +CONFIG_SGI_L1_SERIAL + If you have an SGI SN2 and you want to use the serial port connected + to the system controller (you want this!), say Y. Otherwise, say N. + +SGI SN2 L1 serial console support +CONFIG_SGI_L1_SERIAL_CONSOLE + If you have an SGI SN2 and you would like to use the system + controller serial port as your console (you want this!), say Y. + Otherwise, say N. + Support for BAGET MIPS series CONFIG_BAGET_MIPS This enables support for the Baget, a Russian embedded system. For @@ -3217,6 +3284,255 @@ If you want to compile it as a module, say M here and read . If unsure, say `N'. +IP: virtual server support +CONFIG_IP_VS + IP Virtual Server support will let you build a high-performance + virtual server based on cluster of two or more real servers. This + option must be enabled for at least one of the clustered computers + that will take care of intercepting incomming connections to a + single IP address and scheduling them to real servers. + + Three request dispatching techniques are implemented, they are + virtual server via NAT, virtual server via tunneling and virtual + server via direct routing. The several scheduling algorithms can + be used to choose which server the connection is directed to, + thus load balancing can be achieved among the servers. For more + information and its administration program, please visit the + following URL: + http://www.linuxvirtualserver.org/ + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IP virtual server debugging +CONFIG_IP_VS_DEBUG + Say Y here if you want to get additional messages useful in + debugging the IP virtual server code. You can change the debug + level in /proc/sys/net/ipv4/vs/debug_level + +IPVS connection hash table size (the Nth power of 2) +CONFIG_IP_VS_TAB_BITS + The IPVS connection hash table uses the chaining scheme to handle + hash collisions. Using a big IPVS connection hash table will greatly + reduce conflicts when there are hundreds of thousands of connections + in the hash table. + + Note the table size must be power of 2. The table size will be the + value of 2 to the your input number power. The number to choose is + from 8 to 20, the default number is 12, which means the table size + is 4096. Don't input the number too small, otherwise you will lose + performance on it. You can adapt the table size yourself, according + to your virtual server application. It is good to set the table size + not far less than the number of connections per second multiplying + average lasting time of connection in the table. For example, your + virtual server gets 200 connections per second, the connection lasts + for 200 seconds in average in the connection table, the table size + should be not far less than 200x200, it is good to set the table + size 32768 (2**15). + + Another note that each connection occupies 128 bytes effectively and + each hash entry uses 8 bytes, so you can estimate how much memory is + needed for your box. + +IPVS: round-robin scheduling +CONFIG_IP_VS_RR + The robin-robin scheduling algorithm simply directs network + connections to different real servers in a round-robin manner. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: weighted round-robin scheduling +CONFIG_IP_VS_WRR + The weighted robin-robin scheduling algorithm directs network + connections to different real servers based on server weights + in a round-robin manner. Servers with higher weights receive + new connections first than those with less weights, and servers + with higher weights get more connections than those with less + weights and servers with equal weights get equal connections. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: least-connection scheduling +CONFIG_IP_VS_LC + The least-connection scheduling algorithm directs network + connections to the server with the least number of active + connections. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: weighted least-connection scheduling +CONFIG_IP_VS_WLC + The weighted least-connection scheduling algorithm directs network + connections to the server with the least active connections + normalized by the server weight. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: locality-based least-connection scheduling +CONFIG_IP_VS_LBLC + The locality-based least-connection scheduling algorithm is for + destination IP load balancing. It is usually used in cache cluster. + This algorithm usually directs packet destined for an IP address to + its server if the server is alive and under load. If the server is + overloaded (its active connection numbers is larger than its weight) + and there is a server in its half load, then allocate the weighted + least-connection server to this IP address. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: locality-based least-connection with replication scheduling +CONFIG_IP_VS_LBLCR + The locality-based least-connection with replication scheduling + algorithm is also for destination IP load balancing. It is + usually used in cache cluster. It differs from the LBLC scheduling + as follows: the load balancer maintains mappings from a target + to a set of server nodes that can serve the target. Requests for + a target are assigned to the least-connection node in the target's + server set. If all the node in the server set are over loaded, + it picks up a least-connection node in the cluster and adds it + in the sever set for the target. If the server set has not been + modified for the specified time, the most loaded node is removed + from the server set, in order to avoid high degree of replication. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: destination hashing scheduling +CONFIG_IP_VS_DH + The destination hashing scheduling algorithm assigns network + connections to the servers through looking up a statically assigned + hash table by their destination IP addresses. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: source hashing scheduling +CONFIG_IP_VS_SH + The source hashing scheduling algorithm assigns network + connections to the servers through looking up a statically assigned + hash table by their source IP addresses. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: shortest expected delay scheduling +CONFIG_IP_VS_SED + The shortest expected delay scheduling algorithm assigns network + connections to the server with the shortest expected delay. The + expected delay that the job will experience is (Ci + 1) / Ui if + sent to the ith server, in which Ci is the number of connections + on the the ith server and Ui is the fixed service rate (weight) + of the ith server. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: never queue scheduling +CONFIG_IP_VS_NQ + The never queue scheduling algorithm adopts a two-speed model. + When there is an idle server available, the job will be sent to + the idle server, instead of waiting for a fast one. When there + is no idle server available, the job will be sent to the server + that minimize its expected delay (The Shortest Expected Delay + scheduling algorithm). + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +IPVS: FTP protocol helper +CONFIG_IP_VS_FTP + FTP is a protocol that transfers IP address and/or port number in + the payload. In the virtual server via Network Address Translation, + the IP address and port number of real servers cannot be sent to + clients in ftp connections directly, so FTP protocol helper is + required for tracking the connection and mangling it back to that of + virtual service. + + If you want to compile it in kernel, say Y. If you want to compile + it as a module, say M here and read Documentation/modules.txt. If + unsure, say N. + +AH/ESP match support (EXPERIMENTAL) +CONFIG_IP6_NF_MATCH_AHESP + This module allows one to match AH and ESP packets. + + If you want to compile it as a module, say M here and read + . The modules will be called + ip6t_ah.o and ip6t_esp.o. + + If unsure, say 'N'. + +Routing header match support +CONFIG_IP6_NF_MATCH_RT + rt matching allows you to match packets based on the routing + header of the packet. + + If you want to compile it as a module, say M here and read + . The module will be called + ip6t_rt.o. + + If unsure, say 'N'. + +Hop-by-hop and Dst opts header match support +CONFIG_IP6_NF_MATCH_OPTS + This allows one to match packets based on the hop-by-hop + and destination options headers of a packet. + + If you want to compile it as a module, say M here and read + . The modules will be called + ip6t_hbh.o and ip6t_dst.o. + + If unsure, say 'N'. + +Fragmentation header match support +CONFIG_IP6_NF_MATCH_FRAG + frag matching allows you to match packets based on the fragmentation + header of the packet. + + If you want to compile it as a module, say M here and read + . The module will be called + ip6t_frag.o. + + If unsure, say 'N'. + +HL match support +CONFIG_IP6_NF_MATCH_HL + HL matching allows you to match packets based on the hop + limit of the packet. + + If you want to compile it as a module, say M here and read + . The module will be called + ip6t_hl.o. + + If unsure, say 'N'. + +IPv6 Extension Headers Match (EXPERIMENTAL) +CONFIG_IP6_NF_MATCH_IPV6HEADER + This module allows one to match packets based upon + the ipv6 extension headers. + + If you want to compile it as a module, say M here and read + . The module will be called + ip6t_ipv6header.o. + + If unsure, say 'N'. + SYN flood protection CONFIG_SYN_COOKIES Normal TCP/IP networking is open to an attack known as "SYN @@ -3699,25 +4015,25 @@ CONFIG_AGP_AMD_8151 This option gives you AGP support for the GLX component of - XFree86 on AMD K8 with an AGP 8151 chipset. + XFree86 on an AMD Opteron/Athlon64 using the on-CPU GART. You should say Y here if you use XFree86 3.3.6 or 4.x and want to use GLX or DRI. If unsure, say N. Generic SiS support CONFIG_AGP_SIS - This option gives you AGP support for the GLX component of the "soon - to be released" XFree86 4.x on Silicon Integrated Systems [SiS] - chipsets. + This option gives you AGP support for the GLX component of + XFree86 4.x on Silicon Integrated Systems [SiS] chipsets. - Note that 5591/5592 AGP chipsets are NOT supported. + Note that 5591/5592 AGP chipsets are NOT specifically supported; + However, the driver works well on these, too. You should say Y here if you use XFree86 3.3.6 or 4.x and want to use GLX or DRI. If unsure, say N. Serverworks LE/HE support CONFIG_AGP_SWORKS - Say Y here to support the Serverworks AGP card. See + Say Y here to support the Serverworks AGP card. See for product descriptions and images. NVIDIA chipset support @@ -3748,6 +4064,13 @@ This option gives you AGP GART support for the HP ZX1 chipset for IA64 processors. +CONFIG_AGP_ATI + This option gives you AGP support for the GLX component of + XFree86 4.x on the ATI RadeonIGP family of chipsets. + + You should say Y here if you use XFree86 3.3.6 or 4.x and want to + use GLX or DRI. If unsure, say N. + Support for ISA-bus hardware CONFIG_ISA Find out whether you have ISA slots on your motherboard. ISA is the @@ -5107,21 +5430,23 @@ This is the frame buffer device driver for the Hitachi HD64461 LCD frame buffer card. -SIS acceleration +SIS display support CONFIG_FB_SIS - 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 chipsets. Documentation available at the maintainer's site + at . -SIS 630/540/730 support +SIS 300 series support CONFIG_FB_SIS_300 - This is the frame buffer device driver for the SiS 630 and related - Super Socket 7 UMA cards. Specs available at - . + This enables support for SiS 300 series chipsets (300/305, 540, 630, + 730). Documentation available at the maintainer's website at + . -SIS 315H/315 support +SIS 315/330 series support CONFIG_FB_SIS_315 - This is the frame buffer device driver for the SiS 315 graphics - card. Specs available at . + This enables support for SiS 315/330 series chipsets (315, 550, 650, + M650, 651, 661FX, M661FX, 740, 741, 330). Documentation available at + the maintainer's site . IMS Twin Turbo display support CONFIG_FB_IMSTT @@ -5177,6 +5502,17 @@ is at . +Mach64 Generic LCD support +CONFIG_FB_ATY_GENERIC_LCD + Enabling this option enables the Atyfb driver to drive LCD panels. It + will autodetect the resulution and format of your display and emulate + other resolutions using the hardware stretcher on the chip. + Say Y here if you have computer with a Rage LT Pro, Rage Mobility M1, + Rage XC or Rage XL chip and a laptop LCD display or any other LCD display + that needs to be digitally driven. It is not necessary to enable this + option if you are using an LCD display with a normal VGA connector, + but it won't hurt if you do. + ATI Radeon display support CONFIG_FB_RADEON Choose this option if you want to use an ATI Radeon graphics card as @@ -5781,6 +6117,61 @@ It is safe to say N here for now. +The SCTP Protocol (EXPERIMENTAL) +CONFIG_IP_SCTP + Stream Control Transmission Protocol + + From RFC 2960 (http://www.ietf.org/rfc/rfc2960.txt) + + "SCTP is a reliable transport protocol operating on top of a + connectionless packet network such as IP. It offers the following + services to its users: + + -- acknowledged error-free non-duplicated transfer of user data, + -- data fragmentation to conform to discovered path MTU size, + -- sequenced delivery of user messages within multiple streams, + with an option for order-of-arrival delivery of individual user + messages, + -- optional bundling of multiple user messages into a single SCTP + packet, and + -- network-level fault tolerance through supporting of multi- + homing at either or both ends of an association." + + This protocol support 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 sctp. If you want to compile it + as a module, say M here and read . + + If in doubt, say N. + +SCTP: Use old checksum (Adler-32) +CONFIG_SCTP_ADLER32 + RCF2960 currently specifies the Adler-32 checksum algorithm for SCTP. + This has been deprecated and replaced by an algorithm now referred + to as crc32c. + + If you say Y, this will use the Adler-32 algorithm, this might be + useful for interoperation with downlevel peers. + + If unsure, say N. + +SCTP: Debug messages +CONFIG_SCTP_DBG_MSG + If you say Y, this will enable verbose debugging messages. + + If unsure, say N. However, if you are running into problems, use + this option to gather detailed trace information + +SCTP: Debug object counts +CONFIG_SCTP_DBG_OBJCNT + If you say Y, this will enable debugging support for counting the + type of objects that are currently allocated. This is useful for + identifying memory leaks. If the /proc filesystem is enabled this + debug information can be viewed by + 'cat /proc/net/sctp/sctp_dbg_objcnt' + + If unsure, say N + Kernel httpd acceleration CONFIG_KHTTPD The kernel httpd acceleration daemon (kHTTPd) is a (limited) web @@ -6915,7 +7306,7 @@ CONFIG_CISS_SCSI_TAPE When enabled (Y), this option allows SCSI tape drives and SCSI medium changers (tape robots) to be accessed via a Compaq 5xxx array - controller. (See Documentation/cciss.txt for more details.) + controller. (See for more details.) "SCSI support" and "SCSI tape support" must also be enabled for this option to work. @@ -6923,6 +7314,15 @@ When this option is disabled (N), the SCSI portion of the driver is not compiled. +Enable monitor thread +CONFIG_CISS_MONITOR_THREAD + Intended for use with multipath configurations (see the md driver). + This option allows a per-adapter monitoring thread to periodically + poll the adapter to detect failure modes in which the processor + is unable to receive interrupts from the adapter, thus enabling + fail-over to an alternate adapter in such situations. See + for more details. + QuickNet Internet LineJack/PhoneJack support CONFIG_PHONE_IXJ Say M if you have a telephony card manufactured by Quicknet @@ -7087,6 +7487,16 @@ architecture is based on LSI Logic's Message Passing Interface (MPI) specification. +Maximum number of scatter gather entries +CONFIG_FUSION_MAX_SGE + This option allows you to specify the maximum number of scatter- + gather entries per I/O. The driver defaults to 40, a reasonable number + for most systems. However, the user may increase this up to 128. + Increasing this parameter will require significantly more memory + on a per controller instance. Increasing the parameter is not + necessary (or recommended) unless the user will be running + large I/O's via the raw interface. + Fusion MPT enhanced SCSI error reporting [optional] module CONFIG_FUSION_ISENSE The isense module (roughly stands for Interpret SENSE data) is @@ -7354,6 +7764,27 @@ there should be no noticeable performance impact as long as you have logging turned off. +QDIO base support for IBM S/390 and zSeries +CONFIG_QDIO + This driver provides the Queued Direct I/O base support for the + IBM S/390 (G5 and G6) and eServer zSeries (z800 and z900). + + For details please refer to the documentation provided by IBM at + + + This driver 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 qdio.o. If you want to compile it as a + module, say M here and read . + + If unsure, say Y. + +Performance statistics for QDIO base support +CONFIG_QDIO_PERF_STATS + Say Y here to get performance statistics in /proc/qdio_perf + + If unsure, say N. + SGI WD93C93 SCSI Driver CONFIG_SCSI_SGIWD93 Say Y here to support the on-board WD93C93 SCSI controller found (a) @@ -7964,7 +8395,7 @@ If you want to compile the driver as a module ( = code which can be inserted in and removed from the running kernel whenever you want), say M here and read . The module - will be called sym53c8xx.o. + will be called sym53c8xx_2.o. PCI DMA addressing mode CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE @@ -8627,16 +9058,31 @@ say M here and read . The module will be called AM53C974.o. -AMI MegaRAID support +AMI MegaRAID support (old driver) CONFIG_SCSI_MEGARAID - This driver supports the AMI MegaRAID 418, 428, 438, 466, 762, 490 - and 467 SCSI host adapters. + This driver supports the AMI MegaRAID 418, 428, 438, 466, 762, 490, + 467, 471 and 493 SCSI host adapters. + + This is the old and very heavily tested driver but lacks features + like clustering. If you want to compile this driver as a module ( = code which can be inserted in and removed from the running kernel whenever you want), say M here and read . The module will be called megaraid.o. +AMI MegaRAID support (new driver) +CONFIG_SCSI_MEGARAID2 + This driver supports the AMI MegaRAID 418, 428, 438, 466, 762, 490, + 467, 471, 493 and new Ultra320(518, 520, 531, 532) SCSI host adapters. + + This is the newer less tested but more featureful driver. + + If you want to compile this driver as a module ( = code which can be + inserted in and removed from the running kernel whenever you want), + say M here and read . The module + will be called megaraid2.o. + Intel/ICP (former GDT SCSI Disk Array) RAID Controller support CONFIG_SCSI_GDTH Formerly called GDT SCSI Disk Array Controller Support. @@ -8979,6 +9425,17 @@ Say Y if you really want or need the debugging output, everyone else says N. +CONFIG_IEEE1394_OUI_DB + If you say Y here, then an OUI list (vendor unique ID's) will be + compiled into the ieee1394 module. This doesn't really do much + except being able to display the vendor of a hardware node. The + downside is that it adds about 300k to the size of the module, + or kernel (depending on whether you compile ieee1394 as a + module, or static in the kernel). + + This option is not needed for userspace programs like gscanbus + to show this information. + Network device support CONFIG_NETDEVICES You can say N here if you don't intend to connect your Linux box to @@ -9637,6 +10094,17 @@ Support for these adaptors is so far still incomplete and buggy. You have been warned. +Hermes 802.11b in TMD7160/NCP130 based PCI adaptor support +CONFIG_TMD_HERMES + Enable support for PCMCIA cards supported by the "Hermes" (aka + orinoco) driver when used in TMD7160 based PCI adaptors. These + adaptors are not a full PCMCIA controller but act as a more limited + PCI <-> PCMCIA bridge. Several vendors sell such adaptors so that + 802.11b PCMCIA cards can be used in desktop machines. + + Support for these adaptors is so far still incomplete and buggy. + You have been warned. + Prism 2.5 PCI 802.11b adaptor support CONFIG_PCI_HERMES Enable support for PCI and mini-PCI 802.11b wireless NICs based on @@ -9902,36 +10370,17 @@ This driver supports the FarSync T-Series X.21 (and V.35/V.24) cards from FarSite Communications Ltd. Synchronous communication is supported on all ports at speeds up to - 8Mb/s (128K on V.24) using synchronous PPP or Cisco HDLC. + 8Mb/s (128K on V.24) using synchronous PPP, Cisco HDLC, raw HDLC, + Frame Relay or X.25/LAPB. If you want to compile this driver as a module ( = code which can be inserted in and removed from the running kernel whenever you want) say M here and read . The module will be called farsync.o and if you want the module to be automatically loaded when the interface is referenced then you - should add "alias syncX farsync" to /etc/modules.conf for each + should add "alias hdlcX farsync" to /etc/modules.conf for each interface, where X is 0, 1, 2, ... -CONFIG_HDLC_DEBUG_PKT - This option is for developers only - do NOT use on production - systems. - -CONFIG_HDLC_DEBUG_HARD_HEADER - This option is for developers only - do NOT use on production - systems. - -CONFIG_HDLC_DEBUG_ECN - This option is for developers only - do NOT use on production - systems. - -CONFIG_HDLC_DEBUG_RINGS - If you answer Y here you will be able to get a diagnostic dump of - port's TX and RX packet rings, using "sethdlc hdlcX private" - command. It does not affect normal operations. - - If unsure, say Y here. - - Frame Relay (DLCI) support CONFIG_DLCI This is support for the frame relay protocol; frame relay is a fast @@ -10456,6 +10905,26 @@ The module will be called dscc4.o. For general information about modules read . +PCISYNC feature +CONFIG_DSCC4_PCISYNC + Due to Etinc's design choice for its PCISYNC cards, some operations + are only allowed on specific ports of the DSCC4. This option is the + only way for the driver to know that it shouldn't return a success + code for these operations. + + Please say Y if your card is an Etinc's PCISYNC. + +Hard reset support +CONFIG_DSCC4_PCI_RST + Various DSCC4 bug forbid any reliable software reset of the asic. + As a replacement, some vendors provide a way to assert the PCI #RST + pin of DSCC4 through the GPIO port of the card. If you choose Y, the + driver will make use of this feature before module removal (i.e. rmmod). + This feature is known to exist on Commtech's cards. + Contact your manufacturer for details. + + Say Y if yout card supports this feature. + LanMedia Corp. serial boards (SSI/V.35, T1/E1, HSSI, T3) CONFIG_LANMEDIA This is a driver for the following Lan Media family of serial @@ -10804,6 +11273,15 @@ If unsure, say N here. +Raw HDLC Ethernet device support +CONFIG_HDLC_RAW_ETH + Say Y to this option if you want generic HDLC driver to support + raw HDLC Ethernet device emulation over WAN (Wide Area Network) + connections. + You will need it for Ethernet over HDLC bridges. + + If unsure, say N here. + Cisco HDLC support CONFIG_HDLC_CISCO Say Y to this option if you want generic HDLC driver to support @@ -10818,13 +11296,6 @@ If unsure, say N here. -Frame-Relay bridging support -CONFIG_HDLC_FR_BRIDGE - Say Y to this option if you want generic HDLC driver to support - bridging LAN frames over Frame-Relay links. - - If unsure, say N here. - Synchronous Point-to-Point Protocol (PPP) support CONFIG_HDLC_PPP Say Y to this option if you want generic HDLC driver to support @@ -10867,6 +11338,25 @@ If unsure, say N here. +CONFIG_HDLC_DEBUG_PKT + This option is for developers only - do NOT use on production + systems. + +CONFIG_HDLC_DEBUG_HARD_HEADER + This option is for developers only - do NOT use on production + systems. + +CONFIG_HDLC_DEBUG_ECN + This option is for developers only - do NOT use on production + systems. + +CONFIG_HDLC_DEBUG_RINGS + If you answer Y here you will be able to get a diagnostic dump of + port's TX and RX packet rings, using "sethdlc hdlcX private" + command. It does not affect normal operations. + + If unsure, say Y here. + Ethernet (10 or 100Mbit) CONFIG_NET_ETHERNET Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common @@ -11195,33 +11685,69 @@ The safe and default value for this is N. -SysKonnect SK-98xx and SK-95xx Gigabit Ethernet Adapter family support +Marvell Yukon / SysKonnect SK-98xx and SK-95xx Gigabit Ethernet Adapter family support CONFIG_SK98LIN - Say Y here if you have a SysKonnect SK-98xx or SK-95xx Gigabit - Ethernet Server Adapter. The following adapters are supported by - this driver: - - SK-9521 10/100/1000Base-T Adapter - - SK-9821 Gigabit Ethernet 1000Base-T Server Adapter - - SK-9822 Gigabit Ethernet 1000Base-T Dual Port Server Adapter - - SK-9841 Gigabit Ethernet 1000Base-LX Server Adapter - - SK-9842 Gigabit Ethernet 1000Base-LX Dual Port Server Adapter - - SK-9843 Gigabit Ethernet 1000Base-SX Server Adapter - - SK-9844 Gigabit Ethernet 1000Base-SX Dual Port Server Adapter - - SK-9861 Gigabit Ethernet 1000Base-SX Server Adapter - - SK-9862 Gigabit Ethernet 1000Base-SX Dual Port Server Adapter - - SK-9871 Gigabit Ethernet 1000Base-ZX Server Adapter - - SK-9872 Gigabit Ethernet 1000Base-ZX Dual Port Server Adapter - - SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter - - SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter - - SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter - - SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter - - SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter - - SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter + Say Y here if you have a Marvell Yukon or SysKonnect SK-98xx/SK-95xx + compliant Gigabit Ethernet Adapter. The following adapters are supported + by this driver: + - 3Com 3C940 Gigabit LOM Ethernet Adapter + - 3Com 3C941 Gigabit LOM Ethernet Adapter + - Allied Telesyn AT-2970LX Gigabit Ethernet Adapter + - Allied Telesyn AT-2970LX/2SC Gigabit Ethernet Adapter + - Allied Telesyn AT-2970SX Gigabit Ethernet Adapter + - Allied Telesyn AT-2970SX/2SC Gigabit Ethernet Adapter + - Allied Telesyn AT-2970TX Gigabit Ethernet Adapter + - Allied Telesyn AT-2970TX/2TX Gigabit Ethernet Adapter + - Allied Telesyn AT-2971SX Gigabit Ethernet Adapter + - Allied Telesyn AT-2971T Gigabit Ethernet Adapter + - DGE-530T Gigabit Ethernet Adapter + - EG1032 v2 Instant Gigabit Network Adapter + - EG1064 v2 Instant Gigabit Network Adapter + - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Abit) + - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Asus) + - Marvell 88E8001 Gigabit LOM Ethernet Adapter (ECS) + - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Epox) + - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Gigabyte) + - Marvell 88E8001 Gigabit LOM Ethernet Adapter (Iwill) + - Marvell RDK-8001 Adapter + - Marvell RDK-8002 Adapter + - Marvell RDK-8003 Adapter + - Marvell RDK-8004 Adapter + - Marvell RDK-8006 Adapter + - Marvell RDK-8007 Adapter + - Marvell RDK-8008 Adapter + - Marvell RDK-8009 Adapter + - Marvell RDK-8010 Adapter + - Marvell RDK-8011 Adapter + - Marvell RDK-8012 Adapter + - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (32 bit) + - Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter (64 bit) + - N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L) + - SK-9521 10/100/1000Base-T Adapter + - SK-9521 V2.0 10/100/1000Base-T Adapter + - SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T) + - SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter + - SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link) + - SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX) + - SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter + - SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link) + - SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX) + - SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter + - SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link) + - SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter + - SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition) + - SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter + - SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link) + - SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX) + - SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter + - SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) + - SMC EZ Card 1000 (SMC9452TXV.2) The adapters support Jumbo Frames. The dual link adapters support link-failover and dual port features. - The V2.0 adapters support the scatter-gather functionality with - sendfile(). Read Documentation/networking/sk98lin.txt for information about + Both Marvell Yukon and SysKonnect SK-98xx/SK-95xx adapters support + the scatter-gather functionality with sendfile(). Please refer to + Documentation/networking/sk98lin.txt for more information about optional driver parameters. Questions concerning this driver may be addressed to: linux@syskonnect.de @@ -11231,6 +11757,7 @@ say M here and read Documentation/modules.txt. This is recommended. The module will be called sk98lin.o. + Sun GEM support CONFIG_SUNGEM Support for the Sun GEM chip, aka Sun GigabitEthernet/P 2.0. See also @@ -13126,6 +13653,15 @@ If unsure, say 'N'. +MTD concatenating support +CONFIG_MTD_CONCAT + Support for concatenating several MTD devices into a single + (virtual) one. This allows you to have -for example- a JFFS(2) + file system spanning multiple physical flash chips. If unsure, + say 'Y'. + + If compiled as a module, it will be called mtdconcat.o. + ARM Firmware Suite flash layout / partition parsing CONFIG_MTD_AFS_PARTS The ARM Firmware Suite allows the user to divide flash devices into @@ -13532,6 +14068,14 @@ D-Box 2 board. If you have one of these boards and would like to use the flash chips on it, say 'Y'. +CFI Flash devices mapped on IBM Redwood +CONFIG_MTD_REDWOOD + This enables access routines for the flash chips on the IBM + Redwood board. If you have one of these boards and would like to + use the flash chips on it, say 'Y'. + + If compiled as a module, it will be called redwood.o. + CFI Flash device mapped on the XScale IQ80310 board CONFIG_MTD_IQ80310 This enables access routines for the flash chips on the Intel XScale @@ -13664,6 +14208,20 @@ CONFIG_MTD_NAND_SPIA If you had to ask, you don't have one. Say 'N'. +SmartMediaCard on autronix autcpu12 board +CONFIG_MTD_NAND_AUTCPU12 + This enables the driver for the autronix autcpu12 board to + access the SmartMediaCard. + + If compiled as a module, it will be called autcpu12.o. + +Support for Cirrus Logic EBD7312 evaluation board +CONFIG_MTD_NAND_EDB7312 + This enables the driver for the Cirrus Logic EBD7312 evaluation + board to access the onboard NAND Flash. + + If compiled as a module, it will be called edb7312.o. + M-Systems Disk-On-Chip 1000 support CONFIG_MTD_DOC1000 This provides an MTD device driver for the M-Systems DiskOnChip @@ -14162,8 +14720,8 @@ USB HIDBP Mouse (basic) support CONFIG_USB_MOUSE Say Y here only if you are absolutely sure that you don't want - to use the generic HID driver for your USB keyboard and prefer - to use the keyboard in its limited Boot Protocol mode instead. + to use the generic HID driver for your USB mouse and prefer + to use the mouse in its limited Boot Protocol mode instead. This is almost certainly not what you want. @@ -14523,6 +15081,9 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49W Say Y here to include firmware for the USA-49W converter. +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC + Say Y here to include firmware for the USA-49WLC converter. + USB ZyXEL omni.net LCD Plus Driver CONFIG_USB_SERIAL_OMNINET Say Y here if you want to use a ZyXEL omni.net LCD ISDN TA. @@ -15529,21 +16090,15 @@ architectural foundations. In general, ReiserFS is as fast as ext2, but is very efficient with - large directories and small files. Additional patches are needed - for NFS and quotas, please see for links. - - It is more easily extended to have features currently found in - database and keyword search systems than block allocation based file - systems are. The next version will be so extended, and will support - plugins consistent with our motto ``It takes more than a license to - make source code open.'' + large directories and small files. It is much faster for writes, + and slightly slower for reads than ext2. It is much faster than + ext3. It will be obsoleted by Reiser4 in not too long, so keep + an eye on our website for when Reiser4 ships. - Read to learn more about reiserfs. + Mount with the notail option if performance matters more to you than + saving space (the design flaw underlying this is fixed in reiser4). - Sponsored by Threshold Networks, Emusic.com, and Bigstorage.com. - - If you like it, you can pay us to add new features to it that you - need, buy a support contract, or pay us to port it to another OS. + Read to learn more about reiserfs. Enable extra Reiserfs consistency checks CONFIG_REISERFS_CHECK @@ -17494,6 +18049,24 @@ Enable this option if you intend to use a HIL keyboard. +HP System Device Controller support +CONFIG_HP_SDC + This option enables supports for the the "System Device Controller", + an i8042 carrying microcode to manage a few miscellanous devices + on some Hewlett Packard systems. The SDC itself contains a 10ms + resolution timer/clock capable of delivering interrupts on periodic + and one-shot basis. The SDC may also be connected to a battery-backed + real-time clock, a basic audio waveform generator, and an HP-HIL + Master Link Controller serving up to seven input devices. + + By itself this option is rather useless, but enabling it will + enable selection of drivers for the abovementioned devices. + It is, however, incompatible with the old, reliable HIL keyboard + driver, and the new HIL driver is experimental, so if you plan to + use a HIL keyboard as your primary keyboard, you may wish to + keep using that driver until the new HIL drivers have had more + testing. + Include IOP (IIfx/Quadra 9x0) ADB driver CONFIG_ADB_IOP The I/O Processor (IOP) is an Apple custom IC designed to provide @@ -17809,6 +18382,19 @@ read . The module will be called istallion.o. +PDC software console support +CONFIG_PDC_CONSOLE + Saying Y here will enable the software based PDC console to be + used as the system console. This is useful for machines in + which the hardware based console has not been written yet. The + following steps must be competed to use the PDC console: + + 1. create the device entry (mknod /dev/ttyB0 c 60 0) + 2. Edit the /etc/inittab to start a getty listening on /dev/ttyB0 + 3. Add device ttyB0 to /etc/securetty (if you want to log on as + root on this console.) + 4. Change the kernel command console parameter to: console=ttyB0 + Microgate SyncLink adapter support CONFIG_SYNCLINK Provides support for the SyncLink ISA and PCI multiprotocol serial @@ -18259,6 +18845,15 @@ it as a module, say M here and read . The module will be called i2c-proc.o. +Powermac Keywest I2C interface +CONFIG_I2C_KEYWEST + This supports the use of the I2C interface in the combo-I/O + chip on recent Apple machines. Say Y if you have such a machine. + + This driver is also available as a module. If you want to compile + it as a module, say M here and read Documentation/modules.txt. + The module will be called i2c-keywest.o. + Bus Mouse Support CONFIG_BUSMOUSE Say Y here if your machine has a bus mouse as opposed to a serial @@ -18768,6 +19363,13 @@ selected, the module will be called i810.o. AGP support is required for this driver to work. +Intel 830M, 845G, 852GM, 855GM, 865G +CONFIG_DRM_I830 + Choose this option if you have a system that has Intel 830M, 845G, + 852GM, 855GM or 865G integrated graphics. If M is selected, the + module will be called i830.o. AGP support is required for this driver + to work. + Matrox G200/G400/G450 CONFIG_DRM_MGA Choose this option if you have a Matrox G200, G400 or G450 graphics @@ -18921,6 +19523,21 @@ If unsure, say N. +Intel/AMD/VIA HW Random Number Generator support +CONFIG_HW_RANDOM + This driver provides kernel-side support for the + Random Number Generator hardware found on Intel i8xx-based motherboards, + AMD 76x-based motherboards, and Via Nehemiah CPUs. + + Provides a character driver, used to read() entropy data. + + To compile this driver as a module ( = code which can be inserted in + and removed from the running kernel whenever you want), say M here + and read . The module will be called + hw_random. + + If unsure, say N. + Power Management support CONFIG_PM "Power Management" means that parts of your computer are shut @@ -18970,30 +19587,8 @@ The ACPI Sourceforge project may also be of interest: -ACPI Processor Enumeration for HT -CONFIG_ACPI_HT_ONLY - ACPI enumerates both logical (a.k.a. Hyper-Threaded -- HT) - and physical processors. It is designed to obsolete several older - specifications, including the MultiProcessor Specification (MPS), - which supported only physical processors. - - CONFIG_ACPI_HT_ONLY includes just the minimal ACPI boot-time code - necessary to enumerate logical processors and enable HT. - - CONFIG_ACPI includes this code, plus IO APIC enumeration, - and the hooks to run the ACPI AML interpreter for run-time events. - - When CONFIG_ACPI is selected, the command-line option "acpi=ht" - is available to run just the ACPI boot-time code -- just as if - only CONFIG_ACPI_HT_ONLY were selected. - Note that "acpi=off" can be used to disable all ACPI code in the kernel. -Enable ACPI 2.0 with errata 1.3 -CONFIG_ACPI20 - Enable support for the 2.0 version of the ACPI interpreter. See the - help for ACPI for caveats and discussion. - ACPI kernel configuration manager CONFIG_ACPI_KERNEL_CONFIG If you say `Y' here, Linux's ACPI support will use the @@ -19013,23 +19608,6 @@ particular, many Toshiba laptops require this for correct operation of the AC module. -ACPI Bus Manager -CONFIG_ACPI_BUSMGR - The ACPI Bus Manager enumerates devices in the ACPI namespace, and - handles PnP messages. All ACPI devices use its services, so using - them requires saying Y here. - -ACPI System Driver -CONFIG_ACPI_SYS - This driver will enable your system to shut down using ACPI, and - dump your ACPI DSDT table using /proc/acpi/dsdt. - -ACPI Processor Driver -CONFIG_ACPI_CPU - This driver installs ACPI as the idle handler for Linux, and uses - ACPI C2 and C3 processor states to save power, on systems that - support it. - ACPI Button CONFIG_ACPI_BUTTON This driver registers for events based on buttons, such as the @@ -19064,11 +19642,6 @@ the battery and thermal drivers. If you are compiling for a laptop, say Y. -ACPI Control Method Battery -CONFIG_ACPI_CMBATT - This driver adds support for battery information through - /proc/acpi/battery. If you have a laptop with a battery, say Y. - ACPI Thermal CONFIG_ACPI_THERMAL This driver handles overheating conditions on laptops. It is HIGHLY @@ -19084,6 +19657,9 @@ display brightness and output, switching the LCD backlight on and off, and most importantly, allows you to blink those fancy LEDs intended for reporting mail and wireless status. + + Note: the display switching code is currently considered EXPERIMENTAL, + toying with these values may even lock your machine. All settings are changed via /proc/acpi/asus directory entries. Owner and group for these entries can be set with asus_uid and asus_gid @@ -19561,6 +20137,15 @@ . The module will be called cpuid.o +x86 BIOS Enhanced Disk Drive support +CONFIG_EDD + Say Y or M here if you want to enable BIOS Enhanced Disk Drive + Services real mode BIOS calls to determine which disk + BIOS tries boot from. This information is then exported via /proc. + + This option is experimental, but believed to be safe, + and most disk controller BIOS vendors do not yet implement this feature. + SBC-60XX Watchdog Timer CONFIG_60XX_WDT This driver can be used with the watchdog timer found on some @@ -21540,6 +22125,11 @@ This enables HiSax support for the HFC-S+, HFC-SP and HFC-PCMCIA cards. This code is not finished yet. +Formula-n enter:now PCI card (EXPERIMENTAL) +CONFIG_HISAX_ENTERNOW_PCI + This enables HiSax support for the Formula-n enter:now PCI + ISDN card. + Am7930 CONFIG_HISAX_AMD7930 This enables HiSax support for the AMD7930 chips on some SPARCs. @@ -22687,15 +23277,16 @@ want). The module is called ariadne.o. If you want to compile it as a module, say M here and read . -Ariadne II and X-Surf support -CONFIG_ARIADNE2 - This driver is for the Village Tronic Ariadne II and the Individual +Zorro NS8390-based Ethernet support +CONFIG_ZORRO8390 + This driver is for Zorro Ethernet cards using an NS8390-compatible + chipset, like the Village Tronic Ariadne II and the Individual Computers X-Surf Ethernet cards. If you have such a card, say Y. Otherwise, say N. This driver 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 ariadne2.o. If you want to compile it as + The module is called zorro8390.o. If you want to compile it as a module, say M here and read . A2065 support @@ -23468,6 +24059,38 @@ /proc/sys/dev/mac_hid/mouse_button2_keycode /proc/sys/dev/mac_hid/mouse_button3_keycode +Set high memory pool address +CONFIG_HIGHMEM_START_BOOL + Unless you know what you are doing you *should not* set this option. + + It can be used to override the default PKMAP_BASE address which + is the location of the high memory pool. This can be useful in + optimizing virtual memory usage in a system. + +Set maximum low memory +CONFIG_LOWMEM_SIZE_BOOL + Unless you know what you are doing you *should not* set this option. + + It can be used to override the standard calculated value of + MAX_LOW_MEM. This can be useful in optimizing virtual memory usage + in a system. + +Set custom kernel base address +CONFIG_KERNEL_START_BOOL + Unless you know what you are doing you *should not* set this option. + + It can be used to override the standard PAGE_OFFSET/KERNELBASE + value used by the kernel. This can be useful in controlling + amount of virtual address space available to the kernel. + +Set custom user task size +CONFIG_TASK_SIZE_BOOL + Unless you know what you are doing you *should not* set this option. + + It can be used to override the standard TASK_SIZE value used + by the kernel. This can be useful in controlling amount of + virtual address space available to user tasks. + Enhanced Real Time Clock Support (/dev/rtc) CONFIG_PPC_RTC If you say Y here and create a character special file /dev/rtc with @@ -24735,6 +25358,46 @@ Say Y if you want support for the ARM1020 processor. Otherwise, say N. +Disable I-Cache +CONFIG_CPU_ICACHE_DISABLE + Say Y here to disable the processor instruction cache. Unless + you have a reason not to or are unsure, say N. + +Disable D-Cache +CONFIG_CPU_DCACHE_DISABLE + Say Y here to disable the processor data cache. Unless + you have a reason not to or are unsure, say N. + +Force write through D-cache +CONFIG_CPU_DCACHE_WRITETHROUGH + Say Y here to use the data cache in write-through mode. Unless you + specifically require this or are unsure, say N. + +Round robin I and D cache replacement algorithm +CONFIG_CPU_CACHE_ROUND_ROBIN + Say Y here to use the predictable round-robin cache replacement + policy. Unless you specifically require this or are unsure, say N. + +Disable branch prediction +CONFIG_CPU_BPREDICT_DISABLE + Say Y here to disable branch prediction. If unsure, say N. + +Compressed boot loader in ROM/flash +CONFIG_ZBOOT_ROM + Say Y here if you intend to execute your compressed kernel image (zImage) + directly from ROM or flash. If unsure, say N. + +Compressed ROM boot loader base address +CONFIG_ZBOOT_ROM_TEXT + The base address for zImage. Unless you have special requirements, you + should not change this value. + +Compressed ROM boot loader BSS address +CONFIG_ZBOOT_ROM_BSS + The base address of 64KiB of read/write memory, which must be available + while the decompressor is running. Unless you have special requirements, + you should not change this value. + Support StrongARM SA-110 processor CONFIG_CPU_SA110 The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and @@ -24894,6 +25557,19 @@ output to the second serial port on these devices. Saying N will cause the debug messages to appear on the first serial port. +Kernel log buffer length shift +CONFIG_LOG_BUF_SHIFT + The kernel log buffer has a fixed size of : + 64 kB (2^16) on MULTIQUAD and IA64, + 128 kB (2^17) on S390 + 32 kB (2^15) on SMP systems + 16 kB (2^14) on UP systems + + You have the ability to change this size with this paramter which + fixes the bit shift of to get the buffer length (which must be a + power of 2). Eg: a value of 16 sets the buffer to 64 kB (2^16). + The default value of 0 uses standard values above. + Disable pgtable cache CONFIG_NO_PGT_CACHE Normally the kernel maintains a `quicklist' of preallocated @@ -25250,6 +25926,44 @@ brave people. System crashes and other bad things are likely to occur if you use this driver. If in doubt, select N. +Tieman Voyager USB Braille display support (EXPERIMENTAL) +CONFIG_USB_BRLVGER + Say Y here if you want to use the Voyager USB Braille display from + Tieman. See for more + information. + + 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 brlvger.o. If you want to compile it as + a module, say M here and read . + +KB Gear JamStudio tablet support +CONFIG_USB_KBTAB + Say Y here if you want to use the USB version of the KB Gear + JamStudio tablet. Make sure to say Y to "Mouse support" + (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support" + (CONFIG_INPUT_EVDEV) as well. + + This driver 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 kbtab.o. If you want to compile it as a + module, say M here and read . + +USB Inside Out Edgeport Serial Driver (TI devices) +CONFIG_USB_SERIAL_EDGEPORT_TI + Say Y here if you want to use any of the devices from Inside Out + Networks (Digi) that are not supported by the io_edgeport driver. + This includes the Edgeport/1 device. + + 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 io_ti.o. If you want to compile it + as a module, say M here and read . + +USB Keyspan MPR Firmware +CONFIG_USB_SERIAL_KEYSPAN_MPR + Say Y here to include firmware for the Keyspan MPR converter. + Winbond W83977AF IrDA Device Driver CONFIG_WINBOND_FIR Say Y here if you want to build IrDA support for the Winbond @@ -26294,11 +27008,13 @@ # Choice: ia64type Itanium CONFIG_ITANIUM - Select your IA64 processor type. The default is Intel Itanium. + Select your IA-64 processor type. The default is Intel Itanium. + This choice is safe for all IA-64 systems, but may not perform + optimally on systems with, say, Itanium 2 or newer processors. -McKinley +Itanium 2 CONFIG_MCKINLEY - Select this to configure for a McKinley processor. + Select this to configure for an Itanium 2 (McKinley) processor. # Choice: ia64system IA-64 system type @@ -26355,6 +27071,14 @@ Say Y here to enable machine check support for IA-64. If you're unsure, answer Y. +Use PAL_HALT_LIGHT in idle loop +CONFIG_IA64_PAL_IDLE + Say Y here to enable use of PAL_HALT_LIGHT in the cpu_idle loop. + This allows the CPU to enter a low power state when idle. You + can enable CONFIG_IA64_PALINFO and check /proc/pal/cpu0/power_info + to see the power consumption and latency for this state. If you're + unsure your firmware supports it, answer N. + Disable IA-64 Virtual Hash Page Table CONFIG_DISABLE_VHPT The Virtual Hash Page Table (VHPT) enhances virtual address @@ -26375,12 +27099,31 @@ and restore instructions. It's useful for tracking down spinlock problems, but slow! If you're unsure, select N. -Early printk support (requires VGA!) +Early printk support CONFIG_IA64_EARLY_PRINTK - Selecting this option uses the VGA screen for printk() output before - the consoles are initialised. It is useful for debugging problems - early in the boot process, but only if you have a VGA screen - attached. If you're unsure, select N. + Selecting this option uses a UART or VGA screen (or both) for + printk() output before the consoles are initialised. It is useful + for debugging problems early in the boot process, but only if you + have a serial terminal or a VGA screen attached. If you're unsure, + select N. + +Early printk on serial port +CONFIG_IA64_EARLY_PRINTK_UART + Select this option to use a serial port for early printk() output. + You must also select either CONFIG_IA64_EARLY_PRINTK_UART_BASE or + CONFIG_SERIAL_HCDP. If you select CONFIG_SERIAL_HCDP, early + printk() output will appear on the first console device described by + the HCDP. If you set CONFIG_IA64_EARLY_PRINTK_UART_BASE, the HCDP + will be ignored. + +UART base address +CONFIG_IA64_EARLY_PRINTK_UART_BASE + The physical MMIO address of the UART to use for early printk(). + This overrides any UART located using the EFI HCDP table. + +Early printk on VGA +CONFIG_IA64_EARLY_PRINTK_VGA + Select this option to use VGA for early printk() output. Print possible IA64 hazards to console CONFIG_IA64_PRINT_HAZARDS @@ -26405,6 +27148,58 @@ To use this option, you have to check that the "/proc file system support" (CONFIG_PROC_FS) is enabled, too. +PPC4xx DMA controller support +CONFIG_PPC4xx_DMA + Select this to enable support for the PPC4xx general purpose DMA + controller. + +ttyS0 device +CONFIG_UART0_TTYS0 + This option reverses the mapping between the hardware UART and software + device. Selecting UART0 gives the normal mapping of UART0=ttyS0 and + UART1=ttyS1. Selecting UART1 gives the reverse mapping of UART0=ttyS1 + and UART1=ttyS0. Most people will use UART0. + +PowerPC 405 on-chip ethernet +CONFIG_IBM_OCP_ENET + If you want to use the 405 built-in ethernet select this. + +CONFIG_IBM_OCP_ENET_ERROR_MSG + Enable this option to print verbose debug messages for troubleshooting. + +PowerPC 405 on-chip ethernet -- Number of receive buffers +CONFIG_IBM_OCP_ENET_RX_BUFF + Number of ethernet receive (read) buffers. Unless you know what you + are doing the default should be fine. + +PowerPC 405 on-chip ethernet -- Number of transmit buffers +CONFIG_IBM_OCP_ENET_TX_BUFF + Number of ethernet transmit (write) buffers. Unless you know what + you are doing the default should be fine. + +PowerPC 405 on-chip ethernet -- Amount of bytes to Reserve on a skb +CONFIG_IBM_OCP_ENET_SKB_RES + Many standard ethernet drivers need to reserve 2 bytes of data + on the skb before giving the data ptr to the hardware. This is + so the IP data will be 16-byte aligned when it goes up the stack. + This is a requirement for some processors and it can cause major + slow downs on others. The 405GP dose not have problems with the + misaligned data so the default is 0. If you need to route the + incoming ethernet packets to another device that has alignment + requirements this can help remove a data copy. A value of 2 can + help at getting 16-byte aligned IP data for another device. A + larger value can be used when routing to a IP tunnel device. + Make sure XXX_DESC_SIZE - XXX_SKB_RES >= 1514, or larger if VLANS + are used. + +PPC 405 I2C Algorithm +CONFIG_PPC405_I2C_ALGO + Enable this option to use the built-in I2C on your 405. + +PPC 405 I2C Adapter +CONFIG_PPC405_I2C_ADAP + Enable this option to use the built-in I2C on your 405. + /proc/efi/vars support CONFIG_EFI_VARS If you say Y here, you are able to get EFI (Extensible Firmware @@ -26497,6 +27292,11 @@ best used in conjunction with the NMI watchdog so that spinlock deadlocks are also debuggable. +Additional run-time checks +CONFIG_CHECKING + Enables some internal consistency checks for kernel debugging. + You should normally say N. + Read-write spinlock debugging CONFIG_DEBUG_RWLOCK If you say Y here then read-write lock processing will count how many @@ -27170,6 +27970,12 @@ If unsure, say N. +Hotplug firmware loading support (EXPERIMENTAL) +CONFIG_FW_LOADER + This option is provided for the case where no in-kernel-tree modules require + hotplug firmware loading support, but a module built outside the kernel tree + does. + NatSemi SCx200 support CONFIG_SCx200 This provides basic support for the National Semiconductor SCx200 @@ -27395,6 +28201,82 @@ kernel tree does. Such modules that use library CRC32 functions require that you say M or Y here. +Chassis LCD and LED support +CONFIG_CHASSIS_LCD_LED + Say Y here if you want to enable support for the Heartbeat, + Disk/Network activities LEDs on some PA-RISC machines, + or support for the LCD that can be found on recent material. + + This has nothing to do with LED State support for A, J and E class. + + If unsure, say Y. + +VSC/GSC/HSC bus support +CONFIG_GSC + The VSC, GSC and HSC busses were used from the earliest 700-series + workstations up to and including the C360/J2240 workstations. They + were also used in servers from the E-class to the K-class. They + are not found in B1000, C3000, J5000, A500, L1000, N4000 and upwards. + If in doubt, say "Y". + +Wax I/O support +CONFIG_GSC_WAX + Say Y here to support the Wax multifunction chip found in some + older systems, including B/C/D/R class and 715/64, 715/80 and + 715/100. Wax includes an EISA adapter, a serial port (not always + used), a HIL interface chip and is also known to be used as the + GSC bridge for an X.25 GSC card. + +GSCtoPCI/Dino PCI support +CONFIG_GSC_DINO + Say Y here to support the Dino & Cujo GSC to PCI bridges found in + machines from the B132 to the C360, the J2240 and the A180. Some + GSC/HSC cards (eg gigabit & dual 100 Mbit Ethernet) have a Dino on + the card, and you also need to say Y here if you have such a card. + Note that Dino also supplies one of the serial ports on certain + machines. If in doubt, say Y. + +HPET timers +CONFIG_HPET_TIMER + Use the IA-PC HPET (High Precision Event Timer) to manage + time in preference to the PIT and RTC, if a HPET is + present. The HPET provides a stable time base on SMP + systems, unlike the RTC, but it is more expensive to access, + as it is off-chip. You can find the HPET spec at + . + + If unsure, say Y. + +IOMMU support +CONFIG_GART_IOMMU + Support the K8 IOMMU. Needed to run systems with more than 4GB of memory + properly with 32-bit PCI devices that do not support DAC (Double Address + Cycle). The IOMMU can be turned off at runtime with the iommu=off parameter. + Normally the kernel will take the right choice by itself. + If unsure say Y + +Debug __init statements +CONFIG_INIT_DEBUG + Fill __init and __initdata at the end of boot. This helps debugging + invalid uses of __init and __initdata after initialization. + +Force IOMMU to on +CONFIG_IOMMU_DEBUG + Force the IOMMU to on even when you have less than 4GB of memory and add + debugging code. + Can be disabled at boot time with iommu=noforce. + +IOMMU leak tracing +CONFIG_IOMMU_LEAK + Add a simple leak tracer to the IOMMU code. This is useful when you + are debugging a buggy device driver that leaks IOMMU mappings. + +pSeries Hypervisor Virtual Console support +CONFIG_HVC_CONSOLE + pSeries machines when partitioned support a hypervisor virtual + console. This driver allows each pSeries partition to have a console + which is accessed via the HMC. + CONFIG_CRYPTO This option provides the core Cryptographic API. @@ -27478,6 +28360,12 @@ See http://csrc.nist.gov/encryption/aes/ for more information. +CONFIG_CRYPTO_CAST5 + CAST5 (CAST-128) cipher algorithm. + + The CAST5 encryption algorithm (synonymous with CAST-128) is + described in RFC2144. + CONFIG_CRYPTO_DEFLATE This is the Deflate algorithm (RFC1951), specified for use in IPSec with the IPCOMP protocol (RFC3173, RFC2394). @@ -27486,6 +28374,28 @@ CONFIG_CRYPTO_TEST Quick & dirty crypto test module. + +CONFIG_SOUND_WM97XX + Say Y here to support the Wolfson WM9705 and WM9712 touchscreen + controllers. These controllers are mainly found in PDA's + i.e. Dell Axim and Toshiba e740 + + This is experimental code. + Please see Documentation/wolfson-touchscreen.txt for + a complete list of parameters. + + In order to use this driver, a char device called wm97xx with a major + number of 10 and minor number 16 will have to be created under + /dev/touchscreen. + + e.g. + mknod /dev/touchscreen/wm97xx c 10 16 + + If you want to compile this as a module ( = code which can be + inserted in and removed from the running kernel whenever you want), + say M here. The module will be called ac97_plugin_wm97xx.o. + + If unsure, say N. # # A couple of things I keep forgetting: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/README.nsp32_cb.eng linux-2.4.23-pre8/Documentation/README.nsp32_cb.eng --- linux-2.4.22/Documentation/README.nsp32_cb.eng 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/README.nsp32_cb.eng 2003-10-22 22:49:10.000000000 +0000 @@ -0,0 +1,57 @@ + <> + + +1. What's this? + + This is Workbit corp.'s(http://www.workbit.co.jp/) NinjaSCSI-32Bi +(http://www.workbit.co.jp/ts/z_njsc32bi.html) PCMCIA card and NinjaSCSI-32UDE +PCI card driver module for Linux. + + + +2. Install + +[1] This driver requires Kernel 2.4.x/2.6.x or later. + And you want to load the module when Ninja card was inserted, you also + install "hotplug" (http://linux-hotplug.sourceforge.net/) utility. + +[2] Insert Ninja card to your PC, and check your card is NinjaSCSI-32Bi/UDE + card. + +# lspci +.... +01:00.0 SCSI storage controller: I-O Data Device, Inc. CBSC-II duo SCSI PCMCIA card (rev 01) + +[3] This driver requires Kernel 2.4/2.6's source code. Please install cernel + source code. + +[4] Please check your kernel have PCI, CardBus, PCMCIA and SCSI support. + If not, rebuild your kernel. And also requires PCMCIA-CS if you use + CardBus card. + +[5] Extract this archive somewhere. + +[6] Edit "Makefile" and type "make" to compile the driver. + +[7] Copy "nsp32.o" to /lib/modules//kernel/driver/scsi/pcmcia/ . + +[8] Type "depmod -ae" to re-made "/lib/modules//modules.pcimap" + +[9] Ok. Now you can use Ninja card in CardBus mode. Check your Ninja card is in + CardBus mode, and insert the card to PC card slot. + + + +3. Caution + If you eject card when doing some operation for your SCSI device or suspend +your computer, you encount some *BAD* error like disk crash. + It works good when I using this driver right way. But I'm not guarantee +your data. Please backup your data when you use this driver. + + +4. Copyright. + + No, no, this is Copyleft software. See GPL. + + +YOKOTA Hiroshi diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/README.nsp_cs.eng linux-2.4.23-pre8/Documentation/README.nsp_cs.eng --- linux-2.4.22/Documentation/README.nsp_cs.eng 2001-10-11 18:17:22.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/README.nsp_cs.eng 2003-10-22 22:49:16.000000000 +0000 @@ -8,8 +8,8 @@ for Linux. 2. My Linux environment -Linux kernel: 2.4.7 / 2.2.19 -pcmcia-cs: 3.1.27 +Linux kernel: 2.4.20 / 2.5.63 +pcmcia-cs: 3.1.33 gcc: gcc-2.95.4 PC card: I-O data PCSC-F (NinjaSCSI-3) I-O data CBSC-II in 16 bit mode (NinjaSCSI-32Bi) @@ -46,22 +46,16 @@ $ make config ... -[3] If you use this driver with Kernel 2.2, Unpack pcmcia-cs in some directory - and make & install. This driver requies pcmcia-cs header file. -$ cd /usr/src -$ tar zxvf cs-pcmcia-cs-3.x.x.tar.gz -... - -[4] Extract this driver's archive somewhere, and edit Makefile, then do make. +[3] Extract this driver's archive somewhere, and edit Makefile, then do make. $ tar -zxvf nsp_cs-x.x.tar.gz $ cd nsp_cs-x.x $ emacs Makefile ... $ make -[5] Copy nsp_cs.o to suitable plase, like /lib/modules//pcmcia/ . +[4] Copy nsp_cs.o to suitable plase, like /lib/modules//pcmcia/ . -[6] Add these lines to /etc/pcmcia/config . +[5] Add these lines to /etc/pcmcia/config . If you yse pcmcia-cs-3.1.8 or later, we can use "nsp_cs.conf" file. So, you don't need to edit file. Just copy to /etc/pcmcia/ . @@ -97,7 +91,7 @@ bind "nsp_cs" ------------------------------------- -[7] Start (or restart) pcmcia-cs. +[6] Start (or restart) pcmcia-cs. # /etc/rc.d/rc.pcmcia start (BSD style) or # /etc/init.d/pcmcia start (SYSV style) @@ -113,8 +107,7 @@ your data. Please backup your data when you use this driver. 6. Known Bugs - In 2.4 kernel, you can't use 640MB Optical disk. This error comes from -high level SCSI driver. + Many bugs in this driver. Be careful! 7. Testing Please send me some reports(bug reports etc..) of this software. @@ -127,4 +120,4 @@ See GPL. -2001/08/08 yokota@netlab.is.tsukuba.ac.jp +2002/01/17 yokota@netlab.is.tsukuba.ac.jp diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/SubmittingDrivers linux-2.4.23-pre8/Documentation/SubmittingDrivers --- linux-2.4.22/Documentation/SubmittingDrivers 2002-11-28 23:53:08.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/SubmittingDrivers 2003-10-22 22:49:12.000000000 +0000 @@ -35,12 +35,12 @@ Linux 2.4: The same rules apply as 2.2. The final contact point for Linux 2.4 - submissions is Marcelo Tosatti . + submissions is Marcelo Tosatti . Linux 2.5: The same rules apply as 2.4 except that you should follow linux-kernel to track changes in API's. The final contact point for Linux 2.5 - submissions is Linus Torvalds . + submissions is Linus Torvalds . What Criteria Determine Acceptance ---------------------------------- diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/cciss.txt linux-2.4.23-pre8/Documentation/cciss.txt --- linux-2.4.22/Documentation/cciss.txt 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/cciss.txt 2003-10-22 22:47:47.000000000 +0000 @@ -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 @@ -53,6 +54,56 @@ /dev/cciss/c1d1p2 Controller 1, disk 1, partition 2 /dev/cciss/c1d1p3 Controller 1, disk 1, partition 3 +Support for more than 8 controllers +----------------------------------- +Originally the driver only supports 8 controllers in the system, +and this is due to the major numbers assigned to the driver +(104 thru 111). + +The driver can now support up to 32 controllers in the system. + +For the ninth controller and beyond, the major numbers will be +assigned dynamically by the kernel when it is discovered, +and there is no guarantee what the major number you will get, +but most likely it will start from 254 and goes down from there. + +You can check the assigned major numbers by typing + cat /proc/devices +And look for cciss controllers + +Once you have this, you need to create device nodes in +/dev/cciss directory. The nodes for the first 8 controllers +should already be created by mkdev.cciss script or +/etc/makedev.d/cciss script. You can add the major number(s) +in those scripts, or create the nodes manually by using +the mknod command. + +You can also use mknod_dyn.cciss and rmnod_dyn.cciss scripts +to create or remove nodes easily. These scripts can be found +in the Documentation directory. + +Then you can mount the devices and create partitions +(You also need to make nodes for these partitions). + +As for the minor number, the disk device will have a minor +number divisible by 16 (e.g: 0, 16, 32 etc), and the +partitions on those disk devices will have the minor number +of the disk device plus the partition number (1-15). +For example, disk d2 will have minor number 32, and its +partitions 1 and 2 will have minor numbers 33 and 34. + +Look at the mkdev.cciss script for example. + +Note: + In 2.4 kernel, partition names are hard coded in + /usr/src/linux/fs/partitions/check.c + and only for the first 8 cciss controllers. The rest + will be reported as ccissXX. This should not affect + I/O operation or performance. Please apply the + cciss_2.4_partition_name.patch to address this. This + will not be an issue under 2.5 kernel, since partition + names will be handled by the driver. + SCSI tape drive and medium changer support ------------------------------------------ @@ -127,3 +178,55 @@ access these devices too, as if the array controller were merely a SCSI controller in the same way that we are allowing it to access SCSI tape drives. +Monitor Threads +--------------- + +For multipath configurations (acheived via a higher level driver, such +as the "md" driver) it is important that failure of a controller is detected. +Ordinarily, the driver is entirely interrupt driven. If a failure occurs +in such a way that the processor cannot receive interrupts from an adapter, +the driver will wait forever for i/o's to complete. In a multipath +configuration this is undesirable, as the md driver relies on i/o's being +reported as failed by the low level driver to trigger failing over to an +alternate controller. The monitor threads allow the driver to detect such +situations and report outstanding i/o's as having failed so that recovery +actions such switching to an alternate controller can occur. The monitor +threads periodically sends a trivial "no-operation" command down to +the controllers and expect them to complete within a a reasonable (short) +time period. The firmware on the adapter is designed such that no matter +how busy the adapter is serving i/o, it can respond quickly to a +"no-operation" command. In the event that a deadline elapses before a no +operation command completes, all outstanding commands on that controller +are reported back to the upper layers as having failed, and any new commands +sent to the controller are immediately reported back as failed. + +To enable the monitor threads, the compile time option must be enabled +(via the usual linux kernel configuration) and the monitor thread must +be enabled at runtime as well. A system may have many adapters, but +perhaps only a single pair operating in a multipath configuration. +In this way, it is possible to run monitoring threads only for those +adapters which require it. + +To start a monitoring thread on the first cciss adapter, "cciss0" with +a polling interval of 30 seconds, execute the following command: + + echo "monitor 30" > /proc/driver/cciss/cciss0 + +To change the polling interval, to say, 60 seconds: + + echo "monitor 60" > /proc/driver/cciss/cciss0 + +(Note, the change will not take effect until the previous polling +interval elapses.) + +To disable the monitoring thread, set the polling interval to 0 seconds: + + echo "monitor 0" > /proc/driver/cciss/cciss0 + +(Again, the monitoring thread will not exit until the previous polling +interval elapses.) + +The minimum monitoring period is 10 seconds, and the maximum monitoring +period is 3600 seconds (1 hour). The no-operation command must complete +with 5 seconds of submission in all cases or the controller will be presumed +failed. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/crypto/api-intro.txt linux-2.4.23-pre8/Documentation/crypto/api-intro.txt --- linux-2.4.22/Documentation/crypto/api-intro.txt 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/crypto/api-intro.txt 2003-10-22 22:49:53.000000000 +0000 @@ -186,7 +186,6 @@ Dag Arne Osvik (Serpent) Brian Gladman (AES) - SHA1 algorithm contributors: Jean-Francois Dive @@ -214,6 +213,9 @@ Kyle McMartin Adam J. Richter +CAST5 algorithm contributors: + Kartikey Mahendra Bhatt (original developers unknown, FSF copyright). + Generic scatterwalk code by Adam J. Richter Please send any credits updates or corrections to: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/filesystems/jfs.txt linux-2.4.23-pre8/Documentation/filesystems/jfs.txt --- linux-2.4.22/Documentation/filesystems/jfs.txt 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/filesystems/jfs.txt 2003-10-22 22:49:03.000000000 +0000 @@ -23,6 +23,15 @@ read-write. The resize keyword with no value will grow the volume to the full size of the partition. +nointegrity Do not write to the journal. The primary use of this option + is to allow for higher performance when restoring a volume + from backup media. The integrity of the volume is not + guaranteed if the system abnormally abends. + +integrity Default. Commit metadata changes to the journal. Use this + option to remount a volume where the nointegrity option was + previously specified in order to restore normal behavior. + JFS TODO list: Plans for our near term development items diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/firmware_class/README linux-2.4.23-pre8/Documentation/firmware_class/README --- linux-2.4.22/Documentation/firmware_class/README 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/firmware_class/README 2003-10-22 22:48:21.000000000 +0000 @@ -0,0 +1,58 @@ + + request_firmware() hotplug interface: + ------------------------------------ + Copyright (C) 2003 Manuel Estrada Sainz + + Why: + --- + + Today, the most extended way to use firmware in the Linux kernel is linking + it statically in a header file. Which has political and technical issues: + + 1) Some firmware is not legal to redistribute. + 2) The firmware occupies memory permanently, even though it often is just + used once. + 3) Some people, like the Debian crowd, don't consider some firmware free + enough and remove entire drivers (e.g.: keyspan). + + about in-kernel persistence: + --------------------------- + Under some circumstances, as explained below, it would be interesting to keep + firmware images in non-swappable kernel memory or even in the kernel image + (probably within initramfs). + + Note that this functionality has not been implemented. + + - Why OPTIONAL in-kernel persistence may be a good idea sometimes: + + - If the device that needs the firmware is needed to access the + filesystem. When upon some error the device has to be reset and the + firmware reloaded, it won't be possible to get it from userspace. + e.g.: + - A diskless client with a network card that needs firmware. + - The filesystem is stored in a disk behind an scsi device + that needs firmware. + - Replacing buggy DSDT/SSDT ACPI tables on boot. + Note: this would require the persistent objects to be included + within the kernel image, probably within initramfs. + + And the same device can be needed to access the filesystem or not depending + on the setup, so I think that the choice on what firmware to make + persistent should be left to userspace. + + - Why register_firmware()+__init can be useful: + - For boot devices needing firmware. + - To make the transition easier: + The firmware can be declared __init and register_firmware() + called on module_init. Then the firmware is warranted to be + there even if "firmware hotplug userspace" is not there yet or + it doesn't yet provide the needed firmware. + Once the firmware is widely available in userspace, it can be + removed from the kernel. Or made optional (CONFIG_.*_FIRMWARE). + + In either case, if firmware hotplug support is there, it can move the + firmware out of kernel memory into the real filesystem for later + usage. + + Note: If persistence is implemented on top of initramfs, + register_firmware() may not be appropriate. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/firmware_class/firmware_sample_driver.c linux-2.4.23-pre8/Documentation/firmware_class/firmware_sample_driver.c --- linux-2.4.22/Documentation/firmware_class/firmware_sample_driver.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/firmware_class/firmware_sample_driver.c 2003-10-22 22:48:41.000000000 +0000 @@ -0,0 +1,121 @@ +/* + * firmware_sample_driver.c - + * + * Copyright (c) 2003 Manuel Estrada Sainz + * + * Sample code on how to use request_firmware() from drivers. + * + * Note that register_firmware() is currently useless. + * + */ + +#include +#include +#include +#include + +#include "linux/firmware.h" + +#define WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE +#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE +char __init inkernel_firmware[] = "let's say that this is firmware\n"; +#endif + +static char ghost_device[] = "ghost0"; + +static void sample_firmware_load(char *firmware, int size) +{ + u8 buf[size+1]; + memcpy(buf, firmware, size); + buf[size] = '\0'; + printk("firmware_sample_driver: firmware: %s\n", buf); +} + +static void sample_probe_default(void) +{ + /* uses the default method to get the firmware */ + const struct firmware *fw_entry; + printk("firmware_sample_driver: a ghost device got inserted :)\n"); + + if(request_firmware(&fw_entry, "sample_driver_fw", ghost_device)!=0) + { + printk(KERN_ERR + "firmware_sample_driver: Firmware not available\n"); + return; + } + + sample_firmware_load(fw_entry->data, fw_entry->size); + + release_firmware(fw_entry); + + /* finish setting up the device */ +} +static void sample_probe_specific(void) +{ + /* Uses some specific hotplug support to get the firmware from + * userspace directly into the hardware, or via some sysfs file */ + + /* NOTE: This currently doesn't work */ + + printk("firmware_sample_driver: a ghost device got inserted :)\n"); + + if(request_firmware(NULL, "sample_driver_fw", ghost_device)!=0) + { + printk(KERN_ERR + "firmware_sample_driver: Firmware load failed\n"); + return; + } + + /* request_firmware blocks until userspace finished, so at + * this point the firmware should be already in the device */ + + /* finish setting up the device */ +} +static void sample_probe_async_cont(const struct firmware *fw, void *context) +{ + if(!fw){ + printk(KERN_ERR + "firmware_sample_driver: firmware load failed\n"); + return; + } + + printk("firmware_sample_driver: device pointer \"%s\"\n", + (char *)context); + sample_firmware_load(fw->data, fw->size); +} +static void sample_probe_async(void) +{ + /* Let's say that I can't sleep */ + int error; + error = request_firmware_nowait (THIS_MODULE, + "sample_driver_fw", ghost_device, + "my device pointer", + sample_probe_async_cont); + if(error){ + printk(KERN_ERR + "firmware_sample_driver:" + " request_firmware_nowait failed\n"); + } +} + +static int sample_init(void) +{ +#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE + register_firmware("sample_driver_fw", inkernel_firmware, + sizeof(inkernel_firmware)); +#endif + /* since there is no real hardware insertion I just call the + * sample probe functions here */ + sample_probe_specific(); + sample_probe_default(); + sample_probe_async(); + return 0; +} +static void __exit sample_exit(void) +{ +} + +module_init (sample_init); +module_exit (sample_exit); + +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/firmware_class/hotplug-script linux-2.4.23-pre8/Documentation/firmware_class/hotplug-script --- linux-2.4.22/Documentation/firmware_class/hotplug-script 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/firmware_class/hotplug-script 2003-10-22 22:47:39.000000000 +0000 @@ -0,0 +1,16 @@ +#!/bin/sh + +# Simple hotplug script sample: +# +# Both $DEVPATH and $FIRMWARE are already provided in the environment. + +HOTPLUG_FW_DIR=/usr/lib/hotplug/firmware/ + +echo 1 > /sysfs/$DEVPATH/loading +cat $HOTPLUG_FW_DIR/$FIRMWARE > /sysfs/$DEVPATH/data +echo 0 > /sysfs/$DEVPATH/loading + +# To cancel the load in case of error: +# +# echo -1 > /sysfs/$DEVPATH/loading +# diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/hw_random.txt linux-2.4.23-pre8/Documentation/hw_random.txt --- linux-2.4.22/Documentation/hw_random.txt 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/hw_random.txt 2003-10-22 22:49:18.000000000 +0000 @@ -0,0 +1,138 @@ + Hardware driver for Intel/AMD/VIA Random Number Generators (RNG) + Copyright 2000,2001 Jeff Garzik + Copyright 2000,2001 Philipp Rumpf + +Introduction: + + The hw_random device driver is software that makes use of a + special hardware feature on your CPU or motherboard, + a Random Number Generator (RNG). + + In order to make effective use of this device driver, you + should download the support software as well. Download the + latest version of the "rng-tools" package from the + hw_random driver's official Web site: + + http://sourceforge.net/projects/gkernel/ + +About the Intel RNG hardware, from the firmware hub datasheet: + + The Firmware Hub integrates a Random Number Generator (RNG) + using thermal noise generated from inherently random quantum + mechanical properties of silicon. When not generating new random + bits the RNG circuitry will enter a low power state. Intel will + provide a binary software driver to give third party software + access to our RNG for use as a security feature. At this time, + the RNG is only to be used with a system in an OS-present state. + +Theory of operation: + + Character driver. Using the standard open() + and read() system calls, you can read random data from + the hardware RNG device. This data is NOT CHECKED by any + fitness tests, and could potentially be bogus (if the + hardware is faulty or has been tampered with). Data is only + output if the hardware "has-data" flag is set, but nevertheless + a security-conscious person would run fitness tests on the + data before assuming it is truly random. + + /dev/hwrandom is char device major 10, minor 183. + +Driver notes: + + * FIXME: support poll(2) + + NOTE: request_mem_region was removed, for two reasons: + 1) Only one RNG is supported by this driver, 2) The location + used by the RNG is a fixed location in MMIO-addressable memory, + 3) users with properly working BIOS e820 handling will always + have the region in which the RNG is located reserved, so + request_mem_region calls always fail for proper setups. + However, for people who use mem=XX, BIOS e820 information is + -not- in /proc/iomem, and request_mem_region(RNG_ADDR) can + succeed. + +Driver details: + + Based on: + Intel 82802AB/82802AC Firmware Hub (FWH) Datasheet + May 1999 Order Number: 290658-002 R + + Intel 82802 Firmware Hub: Random Number Generator + Programmer's Reference Manual + December 1999 Order Number: 298029-001 R + + Intel 82802 Firmware HUB Random Number Generator Driver + Copyright (c) 2000 Matt Sottek + + Special thanks to Matt Sottek. I did the "guts", he + did the "brains" and all the testing. + +Change history: + + Version 1.0.0: + * Merge Intel, AMD, VIA RNG drivers into one. + Further changelog in BitKeeper. + + Version 0.9.8: + * Support other i8xx chipsets by adding 82801E detection + * 82801DB detection is the same as for 82801CA. + + Version 0.9.7: + * Support other i8xx chipsets too (by adding 82801BA(M) and + 82801CA(M) detection) + + Version 0.9.6: + * Internal driver cleanups, prep for 1.0.0 release. + + Version 0.9.5: + * Rip out entropy injection via timer. It never ever worked, + and a better solution (rngd) is now available. + + Version 0.9.4: + * Fix: Remove request_mem_region + * Fix: Horrible bugs in FIPS calculation and test execution + + Version 0.9.3: + * Clean up rng_read a bit. + * Update i810_rng driver Web site URL. + * Increase default timer interval to 4 samples per second. + * Abort if mem region is not available. + * BSS zero-initialization cleanup. + * Call misc_register() from rng_init_one. + * Fix O_NONBLOCK to occur before we schedule. + + Version 0.9.2: + * Simplify open blocking logic + + Version 0.9.1: + * Support i815 chipsets too (Matt Sottek) + * Fix reference counting when statically compiled (prumpf) + * Rewrite rng_dev_read (prumpf) + * Make module races less likely (prumpf) + * Small miscellaneous bug fixes (prumpf) + * Use pci table for PCI id list + + Version 0.9.0: + * Don't register a pci_driver, because we are really + using PCI bridge vendor/device ids, and someone + may want to register a driver for the bridge. (bug fix) + * Don't let the usage count go negative (bug fix) + * Clean up spinlocks (bug fix) + * Enable PCI device, if necessary (bug fix) + * iounmap on module unload (bug fix) + * If RNG chrdev is already in use when open(2) is called, + sleep until it is available. + * Remove redundant globals rng_allocated, rng_use_count + * Convert numeric globals to unsigned + * Module unload cleanup + + Version 0.6.2: + * Clean up spinlocks. Since we don't have any interrupts + to worry about, but we do have a timer to worry about, + we use spin_lock_bh everywhere except the timer function + itself. + * Fix module load/unload. + * Fix timer function and h/w enable/disable logic + * New timer interval sysctl + * Clean up sysctl names diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/i386/zero-page.txt linux-2.4.23-pre8/Documentation/i386/zero-page.txt --- linux-2.4.22/Documentation/i386/zero-page.txt 1999-08-30 17:47:02.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/i386/zero-page.txt 2003-10-22 22:48:28.000000000 +0000 @@ -31,6 +31,7 @@ 0x1e0 unsigned long ALT_MEM_K, alternative mem check, in Kb 0x1e8 char number of entries in E820MAP (below) +0x1e9 unsigned char number of entries in EDDBUF (below) 0x1f1 char size of setup.S, number of sectors 0x1f2 unsigned short MOUNT_ROOT_RDONLY (if !=0) 0x1f4 unsigned short size of compressed kernel-part in the @@ -66,6 +67,7 @@ 0x220 4 bytes (setup.S) 0x224 unsigned short setup.S heap end pointer 0x2d0 - 0x600 E820MAP +0x600 - 0x7D4 EDDBUF (setup.S) 0x800 string, 2K max COMMAND_LINE, the kernel commandline as copied using CL_OFFSET. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/ioctl-number.txt linux-2.4.23-pre8/Documentation/ioctl-number.txt --- linux-2.4.22/Documentation/ioctl-number.txt 2001-07-11 23:35:37.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/ioctl-number.txt 2003-10-22 22:49:41.000000000 +0000 @@ -171,10 +171,6 @@ 0xA0 all linux/sdp/sdp.h Industrial Device Project -0xA2 00-0F DVD decoder driver in development: - -0xA3 00-1F Philips SAA7146 dirver in development: - 0xA3 80-8F Port ACL in development: 0xA3 90-9F linux/dtlk.h diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/kernel-parameters.txt linux-2.4.23-pre8/Documentation/kernel-parameters.txt --- linux-2.4.22/Documentation/kernel-parameters.txt 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/kernel-parameters.txt 2003-10-22 22:48:57.000000000 +0000 @@ -278,6 +278,8 @@ keepinitrd [HW, ARM] + lapic [IA-32,APIC] Enable the local APIC even if BIOS disabled it. + load_ramdisk= [RAM] List of ramdisks to load from floppy. lockd.udpport= [NFS] @@ -414,6 +416,8 @@ nointroute [IA-64] + nolapic [IA-32,APIC] Do not enable or use the local APIC. + no-scroll [VGA] nosmp [SMP] Tells an SMP kernel to act as a UP kernel. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/laptop-mode.txt linux-2.4.23-pre8/Documentation/laptop-mode.txt --- linux-2.4.22/Documentation/laptop-mode.txt 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/laptop-mode.txt 2003-10-22 22:47:37.000000000 +0000 @@ -0,0 +1,72 @@ +Laptop mode +=========== + +This small doc describes the 2.4 laptop mode patch. + +Last updated 2003-05-25, Jens Axboe + +Introduction +------------ + +A few properties of the Linux vm makes it virtually impossible to attempt +to spin down the hard drive in a laptop for a longer period of time (more +than a handful of seconds). This means you are lucky if you can even reach +the break even point with regards to power consumption, let alone expect any +decrease. + +One problem is the age time of dirty buffers. Linux uses 30 seconds per +default, so if you dirty any data then flusing of that data will commence +at most 30 seconds from then. Another is the journal commit interval of +journalled file systems such as ext3, which is 5 seconds on a stock kernel. +Both of these are tweakable either from proc/sysctl or as mount options +though, and thus partly solvable from user space. + +The kernel update daemon (kupdated) also runs at specific intervals, flushing +old dirty data out. Default is every 5 seconds, this too can be tweaked +from sysctl. + +So what does the laptop mode patch do? It attempts to fully utilize the +hard drive once it has been spun up, flushing the old dirty data out to +disk. Instead of flushing just the expired data, it will clean everything. +When a read causes the disk to spin up, we kick off this flushing after +a few seconds. This means that once the disk spins down again, everything +is up to date. That allows longer dirty data and journal expire times. + +It follows that you have to set long expire times to get long spin downs. +This means you could potentially loose 10 minutes worth of data, if you +set a 10 minute expire count instead of just 30 seconds worth. The biggest +risk here is undoubtedly running out of battery. + +Settings +-------- + +The main knob is /proc/sys/vm/laptop_mode. Setting that to 1 switches the +vm (and block layer) to laptop mode. Leaving it to 0 makes the kernel work +like before. When in laptop mode, you also want to extend the intervals +desribed above. See the laptop-mode.sh script for how to do that. + +It can happen that the disk still keeps spinning up and you don't quite +know why or what causes it. The laptop mode patch has a little helper for +that as well, /proc/sys/vm/block_dump. When set to 1, it will dump info to +the kernel message buffer about what process caused the io. Be very careful +when playing with this setting, it is advisable to shut down syslog first! + +Result +------ + +Using the laptop-mode.sh script with its default settings, I get the full +10 minutes worth of drive spin down. Provided your work load is cached, +the disk will only spin up every 10 minutes (well actually, 9 minutes and 55 +seconds due to the 5 second delay in flushing dirty data after the last read +completes). I can't tell you exactly how much extra battery life you will +gain in laptop mode, it will vary greatly on the laptop and workload in +question. The only way to know for sure is to try it out. Getting 10% extra +battery life is not unrealistic. + +Notes +----- + +Patch only changes journal expire time for ext3. reiserfs uses a hardwire +value, should be trivial to adapt though (basically just make it call +get_buffer_flushtime() and uses that). I have not looked at other +journalling file systems, I'll happily accept patches to rectify that! diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/mkdev_dyn.cciss linux-2.4.23-pre8/Documentation/mkdev_dyn.cciss --- linux-2.4.22/Documentation/mkdev_dyn.cciss 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/mkdev_dyn.cciss 2003-10-22 22:48:38.000000000 +0000 @@ -0,0 +1,171 @@ +#!/bin/sh +# +# Author: Francis Wiran +# +# Script to create device nodes for SMART Array controllers, idea from +# mkdev.cciss found in Documentation. The argument syntax is different, +# hence, the name change. +# +# Usage: +# mkdev_dyn.cciss [ctlr num] [major num] [num log vol] [num partitions] +# +# With no arguments, the script will check to see if there are any cciss +# nodes already created in the /dev directory. If so, then it will assume +# that the nodes for the first 8 controllers are already created by +# /etc/makedev.d, which is likely. If not, then the script will create +# them, using the major numbers reserved for cciss controllers (104 thru 111). +# +# After that, it will start creating nodes for the controllers which major +# numbers are dynamically allocated by the kernel. It will check +# /proc/devices for any cciss controllers with major numbers other than +# 104 thru 111 and creates the nodes. +# +# Note that it is a good idea to run rmdev_dyn.cciss script if you remove +# those controllers (the ones which major numbers were dynamically allocated) +# This will unclutter /dev, as well as preventing possible problems due to +# referenced devices and major numbers no longer available or taken by +# other non-cciss drivers. +# +# With no arguments, the script assumes 16 logical volumes per controller +# and 16 partitions per volume; +# +# Passing arguments: +# If you know that one of your controllers, say cciss8, has been dynamically +# assigned major number 254, and were planning on no more than 2 logical +# volumes, using a maximum of 4 partitions per volume, you could do: +# +# mkdev_dyn.cciss 8 254 2 4 +# +# Of course, this has no real benefit over "mkdev_dyn.cciss 8 254" except +# that it doesn't create as many device nodes in /dev/cciss. +# + +# Inputs +NR_CTLR=${1-8} +NR_MAJOR=${2-254} +NR_VOL=${3-16} +NR_PART=${4-16} + +echo_usage() +{ + echo "Usage: mkdev_dyn.cciss [ctlr num] [maj] [volumes] [partitions]" + echo "The script assumes that ctlr 0 thru 7 is statically created" + echo "Therefore, if you want to pass arguments make sure that" + echo "ctlr num is equal or greater than 8, and the major number" + echo "is not one that's statically assigned for cciss controller." + echo "Check the correct major number in /proc/devices" + + # Hmm... we don't support volumes and partitions greater than 16 + # either. +} + +echo_create() +{ + echo "created /dev/cciss/c${1}* nodes using major number ${2}" +} + + +# Function: do_mknod() +# Creates devices nodes under /dev/cciss +# Inputs: $1 - ctlr number +# $2 - major number +# $3 - number of devices on controller +# $4 - number of partitions per device +do_mknod() +{ + D=0; + while [ $D -lt $3 ]; do + P=0; + while [ $P -lt $4 ]; do + MIN=`expr $D \* 16 + $P`; + if [ $P -eq 0 ]; then + mknod /dev/cciss/c${1}d${D} b $2 $MIN + else + mknod /dev/cciss/c${1}d${D}p${P} b $2 $MIN + fi + P=`expr $P + 1`; + done + D=`expr $D + 1`; + done +} + +# Function: do_dyn +# Search and create cciss nodes for the controllers which +# major numbers are allocated dynamically by the kernel +# instead of using kernel.org 's value of 104 to 111. +# +# Input: $1 - ctlr num - will create nodes /dev/cciss/c${1} +# $2 - major num - the major number to assign to the nodes +# $3 - volumes - max number of volumes per controller +# $4 - partitions - max number of partitions per volume +# +# Note: Without input, this function will start creating nodes +# for controller c8 and above, making assumption that +# c0 thru c7 are already made, and the name c8 and above +# are not already taken. +do_dyn() +{ + if [ $# -eq 0 ]; then + C=0; + for MAJ in `cat /proc/devices |\ + grep cciss |\ + awk '/cciss[0-9]$/ { sub("cciss", "cciss0") }; {print}' |\ + sort -k 2,2 |\ + awk '{print $1-i}'`; + do + if [ `ls -l /dev/cciss/c* |\ + awk '{print $5-i}' |\ + uniq |\ + grep $MAJ |\ + wc -l` -gt 0 ]; then + : + else + do_mknod $C $MAJ $NR_VOL $NR_PART; + echo_create $C $MAJ; + fi + C=`expr $C + 1`; + done + else + do_mknod $1 $2 $3 $4; + echo_create $1 $2; + fi + + exit +} + +# Start here + +# Check the input values +if [ $NR_CTLR -lt 8 ]; then + echo_usage; + exit +fi + +if [ $NR_CTLR -ge 8 ]; then + if [ \( $NR_MAJOR -ge 104 \) -a \( $NR_MAJOR -le 111 \) ]; then + echo_usage; + exit + fi +fi + +if [ ! -d /dev/cciss ]; then + mkdir -p /dev/cciss +fi + +# Assume that if c0d0p1 node already exist, then all nodes from c0d0p1 +# to c7d15p15 have been created for us. +if [ ! -b /dev/cciss/c0d0p1 ]; then + C=0; + while [ $C -lt 8 ]; do + MAJ=`expr $C + 104`; + do_mknod $C $MAJ $NR_VOL $NR_PART; + echo_create $C $MAJ; + C=`expr $C + 1`; + done +fi + +if [ $# -gt 0 ]; then + do_dyn $NR_CTLR $NR_MAJOR $NR_VOL $NR_PART; +else + do_dyn; +fi diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/networking/00-INDEX linux-2.4.23-pre8/Documentation/networking/00-INDEX --- linux-2.4.22/Documentation/networking/00-INDEX 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/networking/00-INDEX 2003-10-22 22:49:16.000000000 +0000 @@ -97,8 +97,8 @@ sis900.txt - SiS 900/7016 Fast Ethernet device driver info. sk98lin.txt - - SysKonnect SK-98xx and SK-98xx Gigabit Ethernet Adapter family - driver info. + - Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit + Ethernet Adapter family driver info skfp.txt - SysKonnect FDDI (SK-5xxx, Compaq Netelligent) driver info. smc9.txt diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/networking/atm.txt linux-2.4.23-pre8/Documentation/networking/atm.txt --- linux-2.4.22/Documentation/networking/atm.txt 2000-02-09 02:23:13.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/networking/atm.txt 2003-10-22 22:49:54.000000000 +0000 @@ -1,8 +1,8 @@ In order to use anything but the most primitive functions of ATM, several user-mode programs are required to assist the kernel. These programs and related material can be found via the ATM on Linux Web -page at http://icawww1.epfl.ch/linux-atm/ +page at http://linux-atm.sourceforge.net/ If you encounter problems with ATM, please report them on the ATM on Linux mailing list. Subscription information, archives, etc., -can be found on http://icawww1.epfl.ch/linux-atm/ +can be found on http://linux-atm.sourceforge.net/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/networking/bonding.txt linux-2.4.23-pre8/Documentation/networking/bonding.txt --- linux-2.4.22/Documentation/networking/bonding.txt 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/networking/bonding.txt 2003-10-22 22:48:16.000000000 +0000 @@ -527,9 +527,9 @@ 1) Bonding information files ---------------------------- -The bonding driver information files reside in the /proc/net/bond* directories. +The bonding driver information files reside in the /proc/net/bonding directory. -Sample contents of /proc/net/bond0/info 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) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/networking/generic-hdlc.txt linux-2.4.23-pre8/Documentation/networking/generic-hdlc.txt --- linux-2.4.22/Documentation/networking/generic-hdlc.txt 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/networking/generic-hdlc.txt 2003-10-22 22:49:45.000000000 +0000 @@ -1,11 +1,13 @@ -Generic HDLC layer for Linux kernel 2.4/2.5 +Generic HDLC layer Krzysztof Halasa -May, 2001 +January, 2003 Generic HDLC layer currently supports: -- Frame Relay (ANSI, CCITT and no LMI), with ARP support (no InARP), -- raw HDLC (IPv4 only), +- Frame Relay (ANSI, CCITT and no LMI), with ARP support (no InARP). + Normal (routed) and Ethernet-bridged (Ethernet device emulation) + interfaces can share a single PVC. +- raw HDLC - either IP (IPv4) interface or Ethernet device emulation. - Cisco HDLC, - PPP (uses syncppp.c), - X.25 (uses X.25 routines). @@ -15,6 +17,10 @@ - RISCom/N2 by SDL Communications Inc. - and others, some not in the official kernel. +Ethernet device emulation (using HDLC or Frame-Relay PVC) is compatible +with IEEE 802.1Q (VLANs) and 802.1D (Ethernet bridging). + + Make sure the hdlc.o and the hardware driver are loaded. It should create a number of "hdlc" (hdlc0 etc) network devices, one for each WAN port. You'll need the "sethdlc" utility, get it from: @@ -32,8 +38,10 @@ sethdlc hdlc0 cisco interval 10 timeout 25 or sethdlc hdlc0 rs232 clock ext - sethdlc fr lmi ansi - sethdlc create 99 + sethdlc hdlc0 fr lmi ansi + sethdlc hdlc0 create 99 + ifconfig hdlc0 up + ifconfig pvc0 localIP pointopoint remoteIP In Frame Relay mode, ifconfig master hdlc device up (without assigning any IP address to it) before using pvc devices. @@ -58,6 +66,9 @@ no-parity / crc16 / crc16-pr0 (CRC16 with preset zeros) / crc32-itu crc16-itu (CRC16 with ITU-T polynomial) / crc16-itu-pr0 - sets parity +* hdlc-eth - Ethernet device emulation using HDLC. Parity and encoding + as above. + * cisco - sets Cisco HDLC mode (IP, IPv6 and IPX supported) interval - time in seconds between keepalive packets timeout - time in seconds after last received keepalive packet before @@ -77,7 +88,12 @@ n392 - error threshold - both user and network n393 - monitored events count - both user and network -* create | delete n - FR only - adds / deletes PVC interface with DLCI #n. +Frame-Relay only: +* create n | delete n - adds / deletes PVC interface with DLCI #n. + Newly created interface will be named pvc0, pvc1 etc. + +* create ether n | delete ether n - adds a device for Ethernet-bridged + frames. The device will be named pvceth0, pvceth1 etc. @@ -104,11 +120,11 @@ If you have a problem with N2 or C101 card, you can issue the "private" -command to see port's packet descriptor rings: +command to see port's packet descriptor rings (in kernel logs): sethdlc hdlc0 private -The hardware driver have to be build with CONFIG_HDLC_DEBUG_RINGS. +The hardware driver has to be build with CONFIG_HDLC_DEBUG_RINGS. Attaching this info to bug reports would be helpful. Anyway, let me know if you have problems using this. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/networking/ifenslave.c linux-2.4.23-pre8/Documentation/networking/ifenslave.c --- linux-2.4.22/Documentation/networking/ifenslave.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/networking/ifenslave.c 2003-10-22 22:47:56.000000000 +0000 @@ -140,6 +140,7 @@ #include #include #include +#include #include #include #include diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/networking/sk98lin.txt linux-2.4.23-pre8/Documentation/networking/sk98lin.txt --- linux-2.4.22/Documentation/networking/sk98lin.txt 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/networking/sk98lin.txt 2003-10-22 22:49:09.000000000 +0000 @@ -1,11 +1,11 @@ -(C)Copyright 1999-2002 SysKonnect GmbH. +(C)Copyright 1999-2003 Marvell(R). All rights reserved =========================================================================== -sk98lin.txt created 19-Dec-2002 +sk98lin.txt created 23-Sep-2003 -Readme File for sk98lin v6.02 -SysKonnect SK-98xx Gigabit Ethernet Adapter family driver for LINUX +Readme File for sk98lin v6.18 +Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter family driver for LINUX This file contains 1 Overview @@ -19,7 +19,6 @@ 5 Large Frame Support 6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad) 7 Troubleshooting - 8 History =========================================================================== @@ -27,8 +26,9 @@ 1 Overview =========== -The sk98lin driver supports the SysKonnect SK-98xx and SK-95xx family -on Linux. It has been tested with Linux on Intel/x86 machines. +The sk98lin driver supports the Marvell Yukon and SysKonnect +SK-98xx/SK-95xx compliant Gigabit Ethernet Adapter on Linux. It has +been tested with Linux on Intel/x86 machines. *** @@ -75,8 +75,8 @@ To integrate the driver permanently into the kernel, proceed as follows: 1. Select the menu "Network device support" and then "Ethernet(1000Mbit)" -2. Mark "SysKonnect SK-98xx and SK-95xx Gigabit Ethernet Adapter - family support" with (*) +2. Mark "Marvell Yukon Chipset / SysKonnect SK-98xx family support" + with (*) 3. Build a new kernel when the configuration of the above options is finished. 4. Install the new kernel. @@ -87,8 +87,8 @@ 1. Enable 'loadable module support' in the kernel. 2. For automatic driver start, enable the 'Kernel module loader'. 3. Select the menu "Network device support" and then "Ethernet(1000Mbit)" -4. Mark "SysKonnect SK-98xx and SK-95xx Gigabit Ethernet Adapter - family support" with (M) +4. Mark "Marvell Yukon Chipset / SysKonnect SK-98xx family support" + with (M) 5. Execute the command "make modules". 6. Execute the command "make modules_install". The appropiate modules will be installed. @@ -100,21 +100,23 @@ To load the module manually, proceed as follows: 1. Enter "modprobe sk98lin". -2. If the SysKonnect SK-98xx adapter is installed in your computer and you - have a /proc file system, execute the command: +2. If a Marvell Yukon or SysKonnect SK-98xx adapter is installed in + your computer and you have a /proc file system, execute the command: "ls /proc/net/sk98lin/" This should produce an output containing a line with the following format: eth0 eth1 ... which indicates that your adapter has been found and initialized. - NOTE 1: If you have more than one SysKonnect SK-98xx adapter installed, - the adapters will be listed as 'eth0', 'eth1', 'eth2', etc. - For each adapter, repeat steps 3 and 4 below. - - NOTE 2: If you have other Ethernet adapters installed, your SysKonnect - SK-98xx adapter will be mapped to the next available number, - e.g. 'eth1'. The mapping is executed automatically. + NOTE 1: If you have more than one Marvell Yukon or SysKonnect SK-98xx + adapter installed, the adapters will be listed as 'eth0', + 'eth1', 'eth2', etc. + For each adapter, repeat steps 3 and 4 below. + + NOTE 2: If you have other Ethernet adapters installed, your Marvell + Yukon or SysKonnect SK-98xx adapter will be mapped to the + next available number, e.g. 'eth1'. The mapping is executed + automatically. The module installation message (displayed either in a system log file or on the console) prints a line for each adapter found containing the corresponding 'ethX'. @@ -141,7 +143,7 @@ Use 'ping ' to verify the connection to other computers on your network. 5. To check the adapter configuration view /proc/net/sk98lin/[devicename]. - For example by executing: + For example by executing: "cat /proc/net/sk98lin/eth0" Unload the module @@ -184,7 +186,7 @@ unload and reload the driver. The syntax of the driver parameters is: - modprobe sk98lin parameter=value1[,value2[,value3...]] + modprobe sk98lin parameter=value1[,value2[,value3...]] where value1 refers to the first adapter, value2 to the second etc. @@ -198,7 +200,7 @@ to FULL, and on the second adapter to HALF. Then, you must enter: - modprobe sk98lin AutoNeg=On,Off DupCap=Full,Half + modprobe sk98lin AutoNeg_A=On,Off DupCap_A=Full,Half NOTE: The number of adapters that can be configured this way is limited in the driver (file skge.c, constant SK_MAX_CARD_PARAM). @@ -256,9 +258,9 @@ port reports during auto-negotiation. It can be set for each port individually. Possible modes: - -- Sym = Symetric: both link partners are allowed to send + -- Sym = Symmetric: both link partners are allowed to send PAUSE frames - -- SymOrRem = SymetricOrRemote: both or only remote partner + -- SymOrRem = SymmetricOrRemote: both or only remote partner are allowed to send PAUSE frames -- LocSend = LocalSend: only local link partner is allowed to send PAUSE frames @@ -283,6 +285,101 @@ 4.2 Adapter Parameters ----------------------- +Connection Type (SK-98xx V2.0 copper adapters only) +--------------- +Parameter: ConType +Values: Auto, 100FD, 100HD, 10FD, 10HD +Default: Auto + +The parameter 'ConType' is a combination of all five per-port parameters +within one single parameter. This simplifies the configuration of both ports +of an adapter card! The different values of this variable reflect the most +meaningful combinations of port parameters. + +The following table shows the values of 'ConType' and the corresponding +combinations of the per-port parameters: + + ConType | DupCap AutoNeg FlowCtrl Role Speed + ----------+------------------------------------------------------ + Auto | Both On SymOrRem Auto Auto + 100FD | Full Off None Auto (ignored) 100 + 100HD | Half Off None Auto (ignored) 100 + 10FD | Full Off None Auto (ignored) 10 + 10HD | Half Off None Auto (ignored) 10 + +Stating any other port parameter together with this 'ConType' variable +will result in a merged configuration of those settings. This due to +the fact, that the per-port parameters (e.g. Speed_? ) have a higher +priority than the combined variable 'ConType'. + +NOTE: This parameter is always used on both ports of the adapter card. + +Interrupt Moderation +-------------------- +Parameter: Moderation +Values: None, Static, Dynamic +Default: None + +Interrupt moderation is employed to limit the maxmimum number of interrupts +the driver has to serve. That is, one or more interrupts (which indicate any +transmit or receive packet to be processed) are queued until the driver +processes them. When queued interrupts are to be served, is determined by the +'IntsPerSec' parameter, which is explained later below. + +Possible modes: + + -- None - No interrupt moderation is applied on the adapter card. + Therefore, each transmit or receive interrupt is served immediately + as soon as it appears on the interrupt line of the adapter card. + + -- Static - Interrupt moderation is applied on the adapter card. + All transmit and receive interrupts are queued until a complete + moderation interval ends. If such a moderation interval ends, all + queued interrupts are processed in one big bunch without any delay. + The term 'static' reflects the fact, that interrupt moderation is + always enabled, regardless how much network load is currently + passing via a particular interface. In addition, the duration of + the moderation interval has a fixed length that never changes while + the driver is operational. + + -- Dynamic - Interrupt moderation might be applied on the adapter card, + depending on the load of the system. If the driver detects that the + system load is too high, the driver tries to shield the system against + too much network load by enabling interrupt moderation. If - at a later + time - the CPU utilizaton decreases again (or if the network load is + negligible) the interrupt moderation will automatically be disabled. + +Interrupt moderation should be used when the driver has to handle one or more +interfaces with a high network load, which - as a consequence - leads also to a +high CPU utilization. When moderation is applied in such high network load +situations, CPU load might be reduced by 20-30%. + +NOTE: The drawback of using interrupt moderation is an increase of the round- +trip-time (RTT), due to the queueing and serving of interrupts at dedicated +moderation times. + +Interrupts per second +--------------------- +Parameter: IntsPerSec +Values: 30...40000 (interrupts per second) +Default: 2000 + +This parameter is only used, if either static or dynamic interrupt moderation +is used on a network adapter card. Using this paramter if no moderation is +applied, will lead to no action performed. + +This parameter determines the length of any interrupt moderation interval. +Assuming that static interrupt moderation is to be used, an 'IntsPerSec' +parameter value of 2000 will lead to an interrupt moderation interval of +500 microseconds. + +NOTE: The duration of the moderation interval is to be chosen with care. +At first glance, selecting a very long duration (e.g. only 100 interrupts per +second) seems to be meaningful, but the increase of packet-processing delay +is tremendous. On the other hand, selecting a very short moderation time might +compensate the use of any moderation being applied. + + Preferred Port -------------- Parameter: PrefPort @@ -365,10 +462,10 @@ 6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad) ================================================================== -The SysKonnect Linux drivers are able to support VLAN and Link Aggregation -according to IEEE standards 802.1, 802.1q, and 802.3ad. These features are -only available after installation of open source modules available on the -Internet: +The Marvell Yukon/SysKonnect Linux drivers are able to support VLAN and +Link Aggregation according to IEEE standards 802.1, 802.1q, and 802.3ad. +These features are only available after installation of open source +modules available on the Internet: For VLAN go to: http://scry.wanfear.com/~greear/vlan.html For Link Aggregation go to: http://www.st.rim.or.jp/~yumo @@ -448,7 +545,7 @@ Nr: 0xcc Msg: SkGeInitPort() cannot init running ports" Reason: You are using a driver compiled for single processor machines - on a multiprocessor machine with SMP (Symetric MultiProcessor) + on a multiprocessor machine with SMP (Symmetric MultiProcessor) kernel. Solution: Configure your kernel appropriately and recompile the kernel or the modules. @@ -459,208 +556,13 @@ support for help (linux@syskonnect.de). When contacting our technical support, please ensure that the following information is available: -- System Manufacturer and Model -- Boards in your system +- System Manufacturer and HW Informations (CPU, Memory... ) +- PCI-Boards in your system - Distribution - Kernel version - Driver version *** -8 History -========== -VERSION 6.00 (In-Kernel version) -New Features: -- Support for SK-98xx V2.0 adapters -- Support for gmac -- Support for kernel 2.4.x and kernel 2.2.x -- Zerocopy support for kernel 2.4.x with sendfile() -- Support for scatter-gather functionality with sendfile() -- Speed support for SK-98xx V2.0 adapters -- New ProcFs entries -- New module parameters -Problems fixed: -- ProcFS initialization -- csum packet error -- Ierror/crc counter error (#10767) -- rx_too_long counter error (#10751) -Known limitations: -- None - -VERSION 4.11 -New Features: -- none -Problems fixed: -- Error statistic counter fix (#10620) -- RLMT-Fixes (#10659, #10639, #10650) -- LM80 sensor initialization fix (#10623) -- SK-CSUM memory fixes (#10610). -Known limitations: -- None - -VERSION 4.10 -New Features: -- New ProcFs entries -Problems fixed: -- Corrected some printk's -Known limitations: -- None - -VERSION 4.09 -New Features: -- IFF_RUNNING support (link status) -- New ProcFs entries -Problems fixed: -- too long counters -- too short counters -- Kernel error compilation -Known limitations: -- None - -VERSION 4.06 (In-Kernel version) -Problems fixed: -- MTU init problems - -VERSION 4.04 -Problems fixed: -- removed VLAN error messages - -VERSION 4.02 (In-Kernel version) -New Features: -- Add Kernel 2.4 changes -Known limitations: -- None - -VERSION 4.01 (In-Kernel version) -Problems fixed: -- Full statistics support for DualNet mode -Known limitations: -- None - -VERSION 4.00 (In-Kernel version) -Problems fixed: -- Memory leak found -New Features: -- Proc filesystem integration -- DualNet functionality integrated -- Rlmt networks added -Known limitations: -- statistics partially incorrect in DualNet mode - -VERSION 3.04 (In-Kernel version) -Problems fixed: -- Driver start failed on UltraSPARC -- Rx checksum calculation for big endian machines did not work -- Jumbo frames were counted as input-errors in netstat - -VERSION 3.03 (Standalone version) -Problems fixed: -- Compilation did not find script "printver.sh" if "." not in PATH -Known limitations: -- None - -VERSION 3.02 (In-Kernel version) -Problems fixed: -- None -New Features: -- Integration in Linux kernel source (2.2.14 and 2.3.29) -Known limitations: -- None - -VERSION 3.01 -Problems fixed: -- None -New Features: -- Full source release -Known limitations: -- None - -VERSION 3.00 -Problems fixed: -- None -New Features: -- Support for 1000Base-T adapters (SK-9821 and SK-9822) -Known limitations: -- None - -VERSION 1.07 -Problems fixed: -- RlmtMode parameter value strings were wrong (#10437) -- Driver sent too many RLMT frames (#10439) -- Driver did not recognize network segmentation (#10440) -- RLMT switched too often on segmented network (#10441) -Known limitations: -- None - -VERSION 1.06 -Problems fixed: -- System panic'ed after some time when running with - RlmtMode=CheckOtherLink or RlmtMode=CheckSeg (#10421) - Panic message: "Kernel panic: skput: over ... dev: eth0" -- Driver did not switch back to default port when connected - back-to-back (#10422). -Changes: -- RlmtMode parameter names have changed -New features: -- There is now a version for ALPHA processors -Known limitations: -- None - -VERSION 1.05 -Problems fixed: -- Driver failed to load on kernels with version information - for module symbols enabled -Known limitations: -- None - -VERSION 1.04 -Problems fixed: -- Large frame support does work now (no autonegotiation - support for large frames, just manually selectable) -New Features: -- Receive checksumming in hardware -- Performance optimizations - Some numbers (on two PII-400 machines, back-to-back): - netpipe: 300 MBit/sec, with large frames: 470 MBit/sec - ttcp: 38 MByte/sec, with large frames: 60 MByte/sec - ttcp (UDP send): 66 MByte/sec, with large frames: 106 MByte/sec -Known limitations: -- None - -VERSION 1.03 -Problems fixed: -- Unloading with "rmmod" caused segmentation fault (#10415) -- The link LED flickered from time to time, if no link was - established (#10402) -- Installation problems with RedHat 6.0 (#10409) -New Features: -- Connection state ouput at "network connection up" -Known limitations: -- None - -VERSION 1.02 -Problems fixed: -- Failed with multiple adapters -- Failed with Single Port adapters -- Startup string was only displayed if adapter found -- No link could be established on certain switches when the switches were - rebooted. (#10377) -Known limitations: -- Segmentation fault at "rmmod" with kernel 2.2.3 on some machines - -VERSION 1.01 -Problems fixed: -- Sensor status was not set back to 'ok' after 'warning/error'. (#10386) -Changes: -- improved parallelism in driver - -VERSION 1.00 -Known limitations: -- not tested with all kernel versions (I don't have that much time :-) -- only x86 version available (if you need others, ask for it) -- source code not completely available ***End of Readme File*** - - - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/rmdev_dyn.cciss linux-2.4.23-pre8/Documentation/rmdev_dyn.cciss --- linux-2.4.22/Documentation/rmdev_dyn.cciss 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/rmdev_dyn.cciss 2003-10-22 22:48:53.000000000 +0000 @@ -0,0 +1,87 @@ +#!/bin/sh +# +# Author: Francis Wiran +# +# Script to remove device nodes for SMART Array controllers. This will +# be the device nodes with major numbers which are dynamically allocated +# by the kernel. This script will not attempt to remove the device +# nodes with major number 104 thru 111 (c0 thru c7), which are +# the major numbers that's allocated for cciss controllers by kernel.org. +# +# Usage: +# rmdev_dyn.cciss [ctlr num] +# +# With no arguments, the script will check to see if there are any nodes +# under /dev/cciss, whose major number no longer shows in /proc/partitions, +# or to be exact, no longer shows to be owned by cciss driver. +# If there is, then it will be removed. +# +# Note that it is a good idea to run rmdev_dyn.cciss script if you remove +# those controllers (the ones which major numbers were dynamically allocated) +# This will unclutter /dev, as well as preventing possible problems due to +# referenced devices and major numbers no longer available or taken by +# other non-cciss drivers. +# +# Passing arguments: +# If you know that one of your controllers, say cciss8, has been removed +# and the nodes are no longer valid, you could do +# +# rmdev_dyn.cciss 8 +# +# This is the same as doing `rm -f /dev/cciss/c8*` + +# Inputs +NR_CTLR=${1} + +echo_usage() +{ + echo "Usage: rmdev_dyn.cciss [ctlr num]" + echo "The script will not attempt to remove nodes for controllers" + echo "0 thru 7, therefore if you want to pass an argument," + echo "make sure that ctlr num is equal or greater than 8" +} + +rm_nod1() +{ + if [ $1 -lt 8 ]; then + echo_usage; + exit + else + rm -f /dev/cciss/c${1}* + echo "removed /dev/cciss/c${1}*" + fi +} + +rm_nod2() +{ + for X in `ls -l /dev/cciss/c* |\ + awk '{print $5-i}' |\ + uniq`; do + if [ \( $X -ge 104 \) -a \( $X -le 111 \) ]; then + : + elif [ `cat /proc/devices |\ + grep cciss |\ + grep $X |\ + wc -l` -eq 0 ]; then + + Y=`ls -l /dev/cciss/ |\ + awk '{print $5-i ":" $10}'|\ + tr d ':' |\ + grep $X |\ + awk -F: '{print $2}' |\ + uniq` + + Z="/dev/cciss/${Y}*" + + rm -f $Z + echo "removed $Z" + fi + done +} + +# Start here +if [ $# -gt 0 ]; then + rm_nod1 $NR_CTLR; +else + rm_nod2; +fi diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/sonypi.txt linux-2.4.23-pre8/Documentation/sonypi.txt --- linux-2.4.22/Documentation/sonypi.txt 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/sonypi.txt 2003-10-22 22:47:30.000000000 +0000 @@ -8,7 +8,9 @@ Copyright (C) 2000 Andrew Tridgell This driver enables access to the Sony Programmable I/O Control Device which -can be found in many (all ?) Sony Vaio laptops. +can be found in many Sony Vaio laptops. Some newer Sony laptops (seems to be +limited to new FX series laptops, at least the FX501 and the FX702) lack a +sonypi device and are not supported at all by this driver. It will give access (through a user space utility) to some events those laptops generate, like: @@ -96,6 +98,7 @@ SONYPI_THUMBPHRASE_MASK 0x0200 SONYPI_MEYE_MASK 0x0400 SONYPI_MEMORYSTICK_MASK 0x0800 + SONYPI_BATTERY_MASK 0x1000 useinput: if set (which is the default) jogdial events are forwarded to the input subsystem as mouse wheel diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/usb/usb-serial.txt linux-2.4.23-pre8/Documentation/usb/usb-serial.txt --- linux-2.4.22/Documentation/usb/usb-serial.txt 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/usb/usb-serial.txt 2003-10-22 22:47:39.000000000 +0000 @@ -88,6 +88,9 @@ necessary. Some devices need this before they can talk to the USB port properly. + Devices that are not compiled into the kernel can be specified with module + parameters. e.g. modprobe visor vendor=0x54c product=0x66 + There is a webpage and mailing lists for this portion of the driver at: http://usbvisor.sourceforge.net/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/video4linux/bttv/CARDLIST linux-2.4.23-pre8/Documentation/video4linux/bttv/CARDLIST --- linux-2.4.22/Documentation/video4linux/bttv/CARDLIST 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/video4linux/bttv/CARDLIST 2003-10-22 22:47:44.000000000 +0000 @@ -7,7 +7,7 @@ card=5 - Diamond DTV2000 card=6 - AVerMedia TVPhone card=7 - MATRIX-Vision MV-Delta - card=8 - Lifeview FlyVideo II (Bt848) LR26 + card=8 - Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26 card=9 - IMS/IXmicro TurboTV card=10 - Hauppauge (bt878) card=11 - MIRO PCTV pro @@ -104,6 +104,11 @@ card=102 - IVC-200 card=103 - Grand X-Guard / Trust 814PCI card=104 - Nebula Electronics DigiTV + card=105 - ProVideo PV143 + card=106 - PHYTEC VD-009-X1 MiniDIN (bt878) + card=107 - PHYTEC VD-009-X1 Combi (bt878) + card=108 - PHYTEC VD-009 MiniDIN (bt878) + card=109 - PHYTEC VD-009 Combi (bt878) tuner.o type=0 - Temic PAL (4002 FH5) @@ -147,3 +152,4 @@ type=38 - Philips PAL/SECAM multi (FM1216ME MK3) type=39 - LG NTSC (newer TAPC series) type=40 - HITACHI V7-J180AT + type=41 - Philips PAL_MK (FI1216 MK) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/video4linux/meye.txt linux-2.4.23-pre8/Documentation/video4linux/meye.txt --- linux-2.4.22/Documentation/video4linux/meye.txt 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/video4linux/meye.txt 2003-10-22 22:48:01.000000000 +0000 @@ -16,6 +16,23 @@ MJPEG hardware grabbing is supported via a private API (see below). +Hardware supported: +------------------- + +This driver supports the 'second' version of the MotionEye camera :) + +The first version was connected directly on the video bus of the Neomagic +video card and is unsupported. + +The second one, made by Kawasaki Steel is fully supported by this +driver (PCI vendor/device is 0x136b/0xff01) + +The third one, present in recent (more or less last year) Picturebooks +(C1M* models), is not supported. The manufacturer has given the specs +to the developers under a NDA (which allows the develoment of a GPL +driver however), but things are not moving very fast (see +http://r-engine.sourceforge.net/) (PCI vendor/device is 0x10cf/0x2011). + Driver options: --------------- diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/wolfson-touchscreen.txt linux-2.4.23-pre8/Documentation/wolfson-touchscreen.txt --- linux-2.4.22/Documentation/wolfson-touchscreen.txt 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/wolfson-touchscreen.txt 2003-10-22 22:49:02.000000000 +0000 @@ -0,0 +1,178 @@ + +Wolfson Microelectronics WM9705 and WM9712 Touchscreen Controllers +=================================================================== + +The WM9705 and WM9712 are high performance AC97 audio codecs with built +in touchscreen controllers that are mainly found in portable devices. +i.e. Dell Axim and Toshiba e740. + +This driver uses the AC97 link controller for all communication with the +codec and can be either built into the kernel or built as a module. + +Build Instructions +================== + +The driver will be built into the kernel if "sound card support" = y and +"wolfson AC97 touchscreen support" = y in the kernel sound configuration. + +To build as a module, "wolfson AC97 touchscreen support" = m +in the kernel sound configuration. + + +Driver Features +=============== + + * supports WM9705, WM9712 + * polling mode + * coordinate polling + * adjustable rpu/dpp settings + * adjustable pressure current + * adjustable sample settle delay + * 4 and 5 wire touchscreens (5 wire is WM9712 only) + * pen down detection + * power management + * AUX ADC sampling + + +Driver Usage +============ + +In order to use this driver, a char device called wm97xx with a major +number of 10 and minor number 16 will have to be created under +/dev/touchscreen. + +e.g. +mknod /dev/touchscreen/wm97xx c 10 16 + + +Driver Parameters +================= +The driver can accept several parameters for fine tuning the touchscreen. +However, the syntax is different between module options and passing the +options in the kernel command line. + +e.g. + +rpu=1 (module) +rpu:1 (kernel command line) + + +1. Codec sample mode. (mode) + + The WM9712 can sample touchscreen data in 3 different operating + modes. i.e. polling, coordinate and continous. + + Polling:- The driver polls the codec and issues 3 seperate commands + over the AC97 link to read X,Y and pressure. + + Coordinate: - The driver polls the codec and only issues 1 command over + the AC97 link to read X,Y and pressure. This mode has + strict timing requirements and may drop samples if + interrupted. However, it is less demanding on the AC97 + link. Note: this mode requires a larger delay than polling + mode. + + Continuous:- The codec automatically samples X,Y and pressure and then + sends the data over the AC97 link in slots. This is then + same method used by the codec when recording audio. + + Set mode = 0 for polling, 1 for coordinate and 2 for continuous. + + Default mode = 0 + + + +2. WM9712 Internal pull up for pen detect. (rpu) + + Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) + i.e. pull up resistance = 64k Ohms / rpu. + + Adjust this value if you are having problems with pen detect not + detecting any down events. + + Set rpu = value + + Default rpu = 1 + + + +3. WM9705 Pen detect comparator threshold. (pdd) + + 0 to Vmid in 15 steps, 0 = use zero power comparator with Vmid threshold + i.e. 1 = Vmid/15 threshold + 15 = Vmid/1 threshold + + Adjust this value if you are having problems with pen detect not + detecting any down events. + + Set pdd = value + + Default pdd = 0 + + + +4. Set current used for pressure measurement. (pil) + + Set pil = 2 to use 400uA + pil = 1 to use 200uA and + pil = 0 to disable pressure measurement. + + This is used to increase the range of values returned by the adc + when measureing touchpanel pressure. + + Default pil = 0 + + + +5. WM9712 Set 5 wire touchscreen mode. (five_wire) + + Set five_wire = 1 to enable 5 wire mode on the WM9712. + + Default five_wire = 0 + + NOTE: Five wire mode does not allow for readback of pressure. + + + +6. ADC sample delay. (delay) + + For accurate touchpanel measurements, some settling time may be + required between the switch matrix applying a voltage across the + touchpanel plate and the ADC sampling the signal. + + This delay can be set by setting delay = n, where n is the array + position of the delay in the array delay_table below. + Long delays > 1ms are supported for completeness, but are not + recommended. + + Default delay = 4 + + wm_delay uS AC97 link frames + ==================================== + 0 21 1 + 1 42 2 + 2 84 4 + 3 167 8 + 4 333 16 + 5 667 32 + 6 1000 48 + 7 1333 64 + 8 2000 96 + 9 2667 128 + 10 3333 160 + 11 4000 192 + 12 4667 224 + 13 5333 256 + 14 6000 288 + 15 0 0 (No delay, switch matrix always on) + + + +Contact +======= + +Further information about the WM9705 and WM9712 can be found on the +Wolfson Website. http://www.wolfsonmicro.com + +Please report bugs to liam.girdwood@wolfsonmicro.com or + linux@wolfsonmicro.com diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/x86_64/boot-options.txt linux-2.4.23-pre8/Documentation/x86_64/boot-options.txt --- linux-2.4.22/Documentation/x86_64/boot-options.txt 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/x86_64/boot-options.txt 2003-10-22 22:48:59.000000000 +0000 @@ -65,13 +65,14 @@ 0 don't use an NMI watchdog 1 use the IO-APIC timer for the NMI watchdog 2 use the local APIC for the NMI watchdog using a performance counter. Note - This will use one performance counter. + This will use one performance counter and the local APIC's performance + counter vector. Idle loop idle=poll Don't do power saving in the idle loop using HLT, but poll for rescheduling - event. This will make the CPUs eat a lot more power, but may be useful + events. This will make the CPUs burn a lot more power, but may be useful to get slightly better performance in multiprocessor benchmarks. It also makes some profiling using performance counters more accurate. @@ -145,7 +146,7 @@ off don't use the IOMMU leak turn on simple iommu leak tracing (only when CONFIG_IOMMU_LEAK is on) memaper[=order] allocate an own aperture over RAM with size 32MB^order. - noforce don't force IOMMU usage. Should be fastest. - force Force IOMMU and turn on unmap debugging. + noforce don't force IOMMU usage. Default. + force Force IOMMU for all devices. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Documentation/zorro.txt linux-2.4.23-pre8/Documentation/zorro.txt --- linux-2.4.22/Documentation/zorro.txt 2000-10-16 19:51:16.000000000 +0000 +++ linux-2.4.23-pre8/Documentation/zorro.txt 2003-10-22 22:49:19.000000000 +0000 @@ -2,7 +2,7 @@ ---------------------------------------- Written by Geert Uytterhoeven -Last revised: February 27, 2000 +Last revised: September 5, 2003 1. Introduction @@ -77,7 +77,7 @@ The treatment of these regions depends on the type of Zorro space: - Zorro II address space is always mapped and does not have to be mapped - explicitly using ioremap(). + explicitly using z_ioremap(). Conversion from bus/physical Zorro II addresses to kernel virtual addresses and vice versa is done using: @@ -85,22 +85,20 @@ virt_addr = ZTWO_VADDR(bus_addr); bus_addr = ZTWO_PADDR(virt_addr); - - Zorro III address space must be mapped explicitly using ioremap() first + - Zorro III address space must be mapped explicitly using z_ioremap() first before it can be accessed: - virt_addr = ioremap(bus_addr, size); + virt_addr = z_ioremap(bus_addr, size); ... - iounmap(virt_addr); + z_iounmap(virt_addr); 5. References ------------- linux/include/linux/zorro.h -linux/include/linux/ioport.h -linux/include/asm-m68k/io.h -linux/include/asm-m68k/amigahw.h -linux/include/asm-ppc/io.h +linux/include/asm-{m68k,ppc}/zorro.h +linux/include/linux/zorro_ids.h linux/drivers/zorro /proc/bus/zorro diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/MAINTAINERS linux-2.4.23-pre8/MAINTAINERS --- linux-2.4.22/MAINTAINERS 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/MAINTAINERS 2003-10-22 22:49:05.000000000 +0000 @@ -202,7 +202,7 @@ ALCATEL SPEEDTOUCH USB DRIVER P: Duncan Sands -M: duncan.sands@wanadoo.fr +M: duncan.sands@free.fr L: linux-usb-users@lists.sourceforge.net L: linux-usb-devel@lists.sourceforge.net W: http://www.linux-usb.org/SpeedTouch/ @@ -266,6 +266,16 @@ L: linux-net@vger.kernel.org S: Maintained +ASUS ACPI EXTRAS DRIVER +P: Karol Kozimor +M: sziwan@users.sourceforge.net +P: Julien Lerouge +M: julien.lerouge@free.fr +L: acpi4asus-user@lists.sourceforge.net +W: http://sourceforge.net/projects/acpi4asus +W: http://julien.lerouge.free.fr +S: Maintained + ATM P: Chas Williams M: chas@cmf.nrl.navy.mil @@ -504,6 +514,14 @@ M: jmorris@intercode.com.au P: David S. Miller M: davem@redhat.com +MARVELL YUKON / SYSKONNECT DRIVER +P: Mirko Lindner +M: mlindner@syskonnect.de +P: Ralph Roesler +M: rroesler@syskonnect.de +W: http://www.syskonnect.com +S: Supported +M: davem@redhat.com W http://samba.org/~jamesm/crypto/ L: linux-kernel@vger.kernel.org S: Maintained @@ -670,7 +688,7 @@ ETHERNET BRIDGE P: Stephen Hemminger M: shemminger@osdl.org -L: bridge@math.leidenuniv.nl +L: bridge@osdl.org W: http://bridge.sourceforge.net/ S: Maintained @@ -944,6 +962,11 @@ L: linux-mips@linux-mips.org S: Maintained +IOC4 IDE DRIVER +P: Jeremy Higdon +M: jeremy@sgi.com +S: Maintained + IP MASQUERADING: P: Juanjo Ciarlante M: jjciarla@raiz.uncu.edu.ar @@ -1745,12 +1768,6 @@ L: linux-video@atrey.karlin.mff.cuni.cz S: Maintained -SYSKONNECT DRIVER -P: Mirko Lindner -M: mlindner@syskonnect.de -W: http://www.syskonnect.com -S: Supported - SYSV FILESYSTEM P: Christoph Hellwig M: hch@infradead.org diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/Makefile linux-2.4.23-pre8/Makefile --- linux-2.4.22/Makefile 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/Makefile 2003-10-22 22:47:44.000000000 +0000 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 4 -SUBLEVEL = 22 -EXTRAVERSION = +SUBLEVEL = 23 +EXTRAVERSION = -pre8 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) @@ -28,7 +28,7 @@ AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc -CPP = $(CC) -E +PP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm STRIP = $(CROSS_COMPILE)strip @@ -181,6 +181,7 @@ DRIVERS-$(CONFIG_HAMRADIO) += drivers/net/hamradio/hamradio.o DRIVERS-$(CONFIG_TC) += drivers/tc/tc.a DRIVERS-$(CONFIG_USB) += drivers/usb/usbdrv.o +DRIVERS-$(CONFIG_USB_GADGET) += drivers/usb/gadget/built-in.o DRIVERS-y +=drivers/media/media.o DRIVERS-$(CONFIG_INPUT) += drivers/input/inputdrv.o DRIVERS-$(CONFIG_HIL) += drivers/hil/hil.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/Makefile linux-2.4.23-pre8/arch/alpha/Makefile --- linux-2.4.22/arch/alpha/Makefile 2002-08-03 00:39:42.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/Makefile 2003-10-22 22:49:06.000000000 +0000 @@ -131,3 +131,6 @@ bootpfile: @$(MAKEBOOT) bootpfile + +bootpzfile: + @$(MAKEBOOT) bootpzfile diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/boot/Makefile linux-2.4.23-pre8/arch/alpha/boot/Makefile --- linux-2.4.22/arch/alpha/boot/Makefile 2001-10-05 01:47:08.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/boot/Makefile 2003-10-22 22:47:56.000000000 +0000 @@ -7,6 +7,21 @@ # # Copyright (C) 1994 by Linus Torvalds # +# Creating a compressed kernel image (arch/alpha/boot/vmlinux.gz) +# is done via: +# +# make boot +# +# Creating a BOOTP image (arch/alpha/boot/bootpfile or bootpzfile) +# is done via: +# +# make bootpfile # using an uncompressed kernel +# make bootpzfile # using a compressed kernel +# +# Adding an INITRD image to a BOOTP file (arch/alpha/boot/bootpzfile) +# can be done, e.g, via: +# +# INITRD=`pwd`/initrd.img make bootpzfile LINKFLAGS = -static -T bootloader.lds #-N -relax @@ -17,6 +32,7 @@ OBJECTS = head.o main.o BPOBJECTS = head.o bootp.o +BPZOBJECTS = head.o bootpz.o misc.o TARGETS = vmlinux.gz tools/objstrip # also needed by aboot & milo VMLINUX = $(TOPDIR)/vmlinux OBJSTRIP = tools/objstrip @@ -41,6 +57,12 @@ cat $(INITRD) >> bootpfile endif +bootpzfile: tools/bootpzh vmlinux.nh.gz + cat tools/bootpzh vmlinux.nh.gz > bootpzfile +ifdef INITRD + cat $(INITRD) >> bootpzfile +endif + srmboot: bootdevice bootimage dd if=bootimage of=$(BOOTDEV) bs=512 seek=1 skip=1 tools/mkbb $(BOOTDEV) tools/lxboot @@ -48,16 +70,31 @@ bootdevice: @test "$(BOOTDEV)" != "" || (echo You must specify BOOTDEV ; exit -1) -vmlinux.gz: vmlinux - gzip -fv9 vmlinux +vmlinux.gz: $(TOPDIR)/vmlinux + gzip -fv9c $(TOPDIR)/vmlinux > vmlinux.gz + +vmlinux.nh.gz: vmlinux.nh + gzip -fv9c vmlinux.nh > vmlinux.nh.gz main.o: ksize.h bootp.o: ksize.h +bootpz.o: kzsize.h + ksize.h: vmlinux.nh dummy echo "#define KERNEL_SIZE `ls -l vmlinux.nh | awk '{print $$5}'`" > $@T ifdef INITRD + [ ! \( -f $(INITRD) \) ] || exit 1 + echo "#define INITRD_IMAGE_SIZE `ls -l $(INITRD) | awk '{print $$5}'`" >> $@T +endif + cmp -s $@T $@ || mv -f $@T $@ + rm -f $@T + +kzsize.h: vmlinux.nh.gz dummy + echo "#define KERNEL_SIZE `ls -l vmlinux.nh | awk '{print $$5}'`" > $@T + echo "#define KERNEL_Z_SIZE `ls -l vmlinux.nh.gz | awk '{print $$5}'`" >> $@T +ifdef INITRD [ -f $(INITRD) ] || exit 1 echo "#define INITRD_IMAGE_SIZE `ls -l $(INITRD) | awk '{print $$5}'`" >> $@T endif @@ -67,7 +104,7 @@ vmlinux.nh: $(VMLINUX) $(OBJSTRIP) $(OBJSTRIP) -v $(VMLINUX) vmlinux.nh -vmlinux: $(TOPDIR)/vmlinux +vmlinux: $(VMLINUX) $(STRIP) -o vmlinux $(VMLINUX) tools/lxboot: $(OBJSTRIP) bootloader @@ -79,6 +116,9 @@ tools/bootph: bootpheader $(OBJSTRIP) $(OBJSTRIP) -vb bootpheader tools/bootph +tools/bootpzh: bootpzheader $(OBJSTRIP) + $(OBJSTRIP) -vb bootpzheader tools/bootpzh + $(OBJSTRIP): $(OBJSTRIP).c $(HOSTCC) $(HOSTCFLAGS) -I$(HPATH) $(OBJSTRIP).c -o $(OBJSTRIP) @@ -91,6 +131,11 @@ bootpheader: $(BPOBJECTS) $(LD) $(LINKFLAGS) $(BPOBJECTS) $(LIBS) -o bootpheader +bootpzheader: $(BPZOBJECTS) + $(LD) $(LINKFLAGS) $(BPZOBJECTS) $(LIBS) -o bootpzheader + +misc.o: misc.c $(TOPDIR)/lib/inflate.c + clean: rm -f $(TARGETS) bootloader bootimage bootpfile bootpheader rm -f tools/mkbb tools/bootlx tools/lxboot tools/bootph diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/boot/bootpz.c linux-2.4.23-pre8/arch/alpha/boot/bootpz.c --- linux-2.4.22/arch/alpha/boot/bootpz.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/boot/bootpz.c 2003-10-22 22:48:39.000000000 +0000 @@ -0,0 +1,447 @@ +/* + * arch/alpha/boot/bootpz.c + * + * Copyright (C) 1997 Jay Estabrook + * + * This file is used for creating a compressed BOOTP file for the + * Linux/AXP kernel + * + * based significantly on the arch/alpha/boot/main.c of Linus Torvalds + * and the decompression code from MILO. + */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include "kzsize.h" + +/* FIXME FIXME FIXME */ +#define MALLOC_AREA_SIZE 0x200000 /* 2MB for now */ +/* FIXME FIXME FIXME */ + + +#undef DEBUG_CHECK_RANGE +#define DEBUG_ADDRESSES + +#define DEBUG_SP(x) \ + {register long sp asm("30"); srm_printk("%s (sp=%lx)\n", x, sp);} + +extern unsigned long switch_to_osf_pal(unsigned long nr, + struct pcb_struct * pcb_va, struct pcb_struct * pcb_pa, + unsigned long *vptb); + +extern int decompress_kernel(void* destination, void *source, + size_t ksize, size_t kzsize); + +struct hwrpb_struct *hwrpb = INIT_HWRPB; +static struct pcb_struct pcb_va[1]; + +/* + * Find a physical address of a virtual object.. + * + * This is easy using the virtual page table address. + */ +#define VPTB ((unsigned long *) 0x200000000) + +static inline unsigned long +find_pa(unsigned long address) +{ + unsigned long result; + + result = VPTB[address >> 13]; + result >>= 32; + result <<= 13; + result |= address & 0x1fff; + return result; +} + +int +check_range(unsigned long vstart, unsigned long vend, + unsigned long kstart, unsigned long kend) +{ + unsigned long vaddr, kaddr; + +#ifdef DEBUG_CHECK_RANGE + srm_printk("check_range: V[0x%lx:0x%lx] K[0x%lx:0x%lx]\n", + vstart, vend, kstart, kend); +#endif + /* do some range checking for detecting an overlap... */ + for (vaddr = vstart; vaddr <= vend; vaddr += PAGE_SIZE) + { + kaddr = (find_pa(vaddr) | PAGE_OFFSET); + if (kaddr >= kstart && kaddr <= kend) + { +#ifdef DEBUG_CHECK_RANGE + srm_printk("OVERLAP: vaddr 0x%lx kaddr 0x%lx" + " [0x%lx:0x%lx]\n", + vaddr, kaddr, kstart, kend); +#endif + return 1; + } + } + return 0; +} + +/* + * This function moves into OSF/1 pal-code, and has a temporary + * PCB for that. The kernel proper should replace this PCB with + * the real one as soon as possible. + * + * The page table muckery in here depends on the fact that the boot + * code has the L1 page table identity-map itself in the second PTE + * in the L1 page table. Thus the L1-page is virtually addressable + * itself (through three levels) at virtual address 0x200802000. + */ + +#define L1 ((unsigned long *) 0x200802000) + +void +pal_init(void) +{ + unsigned long i, rev; + struct percpu_struct * percpu; + struct pcb_struct * pcb_pa; + + /* Create the dummy PCB. */ + pcb_va->ksp = 0; + pcb_va->usp = 0; + pcb_va->ptbr = L1[1] >> 32; + pcb_va->asn = 0; + pcb_va->pcc = 0; + pcb_va->unique = 0; + pcb_va->flags = 1; + pcb_va->res1 = 0; + pcb_va->res2 = 0; + pcb_pa = (struct pcb_struct *)find_pa((unsigned long)pcb_va); + + /* + * a0 = 2 (OSF) + * a1 = return address, but we give the asm the vaddr of the PCB + * a2 = physical addr of PCB + * a3 = new virtual page table pointer + * a4 = KSP (but the asm sets it) + */ + srm_printk("Switching to OSF PAL-code... "); + + i = switch_to_osf_pal(2, pcb_va, pcb_pa, VPTB); + if (i) { + srm_printk("failed, code %ld\n", i); + __halt(); + } + + percpu = (struct percpu_struct *) + (INIT_HWRPB->processor_offset + (unsigned long) INIT_HWRPB); + rev = percpu->pal_revision = percpu->palcode_avail[2]; + + srm_printk("OK (rev %lx)\n", rev); + + tbia(); /* do it directly in case we are SMP */ +} + +/* + * Start the kernel. + */ +static inline void +runkernel(void) +{ + __asm__ __volatile__( + "bis %1,%1,$30\n\t" + "bis %0,%0,$27\n\t" + "jmp ($27)" + : /* no outputs: it doesn't even return */ + : "r" (START_ADDR), + "r" (PAGE_SIZE + INIT_STACK)); +} + +/* Must record the SP (it is virtual) on entry, so we can make sure + not to overwrite it during movement or decompression. */ +unsigned long SP_on_entry; + +/* Calculate the kernel image address based on the end of the BOOTP + bootstrapper (ie this program). +*/ +extern char _end; +#define KERNEL_ORIGIN \ + ((((unsigned long)&_end) + 511) & ~511) + +/* Round address to next higher page boundary. */ +#define NEXT_PAGE(a) (((a) | (PAGE_SIZE - 1)) + 1) + +#ifdef INITRD_IMAGE_SIZE +# define REAL_INITRD_SIZE INITRD_IMAGE_SIZE +#else +# define REAL_INITRD_SIZE 0 +#endif + +/* Defines from include/asm-alpha/system.h + + BOOT_ADDR Virtual address at which the consoles loads + the BOOTP image. + + KERNEL_START KSEG address at which the kernel is built to run, + which includes some initial data pages before the + code. + + START_ADDR KSEG address of the entry point of kernel code. + + ZERO_PGE KSEG address of page full of zeroes, but + upon entry to kerne cvan be expected + to hold the parameter list and possible + INTRD information. + + These are used in the local defines below. +*/ + + +/* Virtual addresses for the BOOTP image. Note that this includes the + bootstrapper code as well as the compressed kernel image, and + possibly the INITRD image. + + Oh, and do NOT forget the STACK, which appears to be placed virtually + beyond the end of the loaded image. +*/ +#define V_BOOT_IMAGE_START BOOT_ADDR +#define V_BOOT_IMAGE_END SP_on_entry + +/* Virtual addresses for just the bootstrapper part of the BOOTP image. */ +#define V_BOOTSTRAPPER_START BOOT_ADDR +#define V_BOOTSTRAPPER_END KERNEL_ORIGIN + +/* Virtual addresses for just the data part of the BOOTP + image. This may also include the INITRD image, but always + includes the STACK. +*/ +#define V_DATA_START KERNEL_ORIGIN +#define V_INITRD_START (KERNEL_ORIGIN + KERNEL_Z_SIZE) +#define V_INTRD_END (V_INITRD_START + REAL_INITRD_SIZE) +#define V_DATA_END V_BOOT_IMAGE_END + +/* KSEG addresses for the uncompressed kernel. + + Note that the end address includes workspace for the decompression. + Note also that the DATA_START address is ZERO_PGE, to which we write + just before jumping to the kernel image at START_ADDR. + */ +#define K_KERNEL_DATA_START ZERO_PGE +#define K_KERNEL_IMAGE_START START_ADDR +#define K_KERNEL_IMAGE_END (START_ADDR + KERNEL_SIZE) + +/* Define to where we may have to decompress the kernel image, before + we move it to the final position, in case of overlap. This will be + above the final position of the kernel. + + Regardless of overlap, we move the INITRD image to the end of this + copy area, because there needs to be a buffer area after the kernel + for "bootmem" anyway. +*/ +#define K_COPY_IMAGE_START NEXT_PAGE(K_KERNEL_IMAGE_END) +#define K_INITRD_START NEXT_PAGE(K_COPY_IMAGE_START + KERNEL_SIZE) +#define K_COPY_IMAGE_END \ + (K_INITRD_START + REAL_INITRD_SIZE + MALLOC_AREA_SIZE) +#define K_COPY_IMAGE_SIZE \ + NEXT_PAGE(K_COPY_IMAGE_END - K_COPY_IMAGE_START) + +void +start_kernel(void) +{ + int must_move = 0; + + /* Initialize these for the decompression-in-place situation, + which is the smallest amount of work and most likely to + occur when using the normal START_ADDR of the kernel + (currently set to 16MB, to clear all console code. + */ + unsigned long uncompressed_image_start = K_KERNEL_IMAGE_START; + unsigned long uncompressed_image_end = K_KERNEL_IMAGE_END; + + unsigned long initrd_image_start = K_INITRD_START; + + /* + * Note that this crufty stuff with static and envval + * and envbuf is because: + * + * 1. Frequently, the stack is short, and we don't want to overrun; + * 2. Frequently the stack is where we are going to copy the kernel to; + * 3. A certain SRM console required the GET_ENV output to stack. + * ??? A comment in the aboot sources indicates that the GET_ENV + * destination must be quadword aligned. Might this explain the + * behaviour, rather than requiring output to the stack, which + * seems rather far-fetched. + */ + static long nbytes; + static char envval[256] __attribute__((aligned(8))); + register unsigned long asm_sp asm("30"); + + SP_on_entry = asm_sp; + + srm_printk("Linux/Alpha BOOTPZ Loader for Linux " UTS_RELEASE "\n"); + + /* Validity check the HWRPB. */ + if (INIT_HWRPB->pagesize != 8192) { + srm_printk("Expected 8kB pages, got %ldkB\n", + INIT_HWRPB->pagesize >> 10); + return; + } + if (INIT_HWRPB->vptb != (unsigned long) VPTB) { + srm_printk("Expected vptb at %p, got %p\n", + VPTB, (void *)INIT_HWRPB->vptb); + return; + } + + /* PALcode (re)initialization. */ + pal_init(); + + /* Get the parameter list from the console environment variable. */ + nbytes = callback_getenv(ENV_BOOTED_OSFLAGS, envval, sizeof(envval)); + if (nbytes < 0 || nbytes >= sizeof(envval)) { + nbytes = 0; + } + envval[nbytes] = '\0'; + +#ifdef DEBUG_ADDRESSES + srm_printk("START_ADDR 0x%lx\n", START_ADDR); + srm_printk("KERNEL_ORIGIN 0x%lx\n", KERNEL_ORIGIN); + srm_printk("KERNEL_SIZE 0x%x\n", KERNEL_SIZE); + srm_printk("KERNEL_Z_SIZE 0x%x\n", KERNEL_Z_SIZE); +#endif + + /* Since all the SRM consoles load the BOOTP image at virtual + * 0x20000000, we have to ensure that the physical memory + * pages occupied by that image do NOT overlap the physical + * address range where the kernel wants to be run. This + * causes real problems when attempting to cdecompress the + * former into the latter... :-( + * + * So, we may have to decompress/move the kernel/INITRD image + * virtual-to-physical someplace else first before moving + * kernel /INITRD to their final resting places... ;-} + * + * Sigh... + */ + + /* First, check to see if the range of addresses occupied by + the bootstrapper part of the BOOTP image include any of the + physical pages into which the kernel will be placed for + execution. + + We only need check on the final kernel image range, since we + will put the INITRD someplace that we can be sure is not + in conflict. + */ + if (check_range(V_BOOTSTRAPPER_START, V_BOOTSTRAPPER_END, + K_KERNEL_DATA_START, K_KERNEL_IMAGE_END)) + { + srm_printk("FATAL ERROR: overlap of bootstrapper code\n"); + __halt(); + } + + /* Next, check to see if the range of addresses occupied by + the compressed kernel/INITRD/stack portion of the BOOTP + image include any of the physical pages into which the + decompressed kernel or the INITRD will be placed for + execution. + */ + if (check_range(V_DATA_START, V_DATA_END, + K_KERNEL_IMAGE_START, K_COPY_IMAGE_END)) + { +#ifdef DEBUG_ADDRESSES + srm_printk("OVERLAP: cannot decompress in place\n"); +#endif + uncompressed_image_start = K_COPY_IMAGE_START; + uncompressed_image_end = K_COPY_IMAGE_END; + must_move = 1; + + /* Finally, check to see if the range of addresses + occupied by the compressed kernel/INITRD part of + the BOOTP image include any of the physical pages + into which that part is to be copied for + decompression. + */ + while (check_range(V_DATA_START, V_DATA_END, + uncompressed_image_start, + uncompressed_image_end)) + { +#if 0 + uncompressed_image_start += K_COPY_IMAGE_SIZE; + uncompressed_image_end += K_COPY_IMAGE_SIZE; + initrd_image_start += K_COPY_IMAGE_SIZE; +#else + /* Keep as close as possible to end of BOOTP image. */ + uncompressed_image_start += PAGE_SIZE; + uncompressed_image_end += PAGE_SIZE; + initrd_image_start += PAGE_SIZE; +#endif + } + } + + srm_printk("Starting to load the kernel with args '%s'\n", envval); + +#ifdef DEBUG_ADDRESSES + srm_printk("Decompressing the kernel...\n" + "...from 0x%lx to 0x%lx size 0x%x\n", + V_DATA_START, + uncompressed_image_start, + KERNEL_SIZE); +#endif + decompress_kernel((void *)uncompressed_image_start, + (void *)V_DATA_START, + KERNEL_SIZE, KERNEL_Z_SIZE); + + /* + * Now, move things to their final positions, if/as required. + */ + +#ifdef INITRD_IMAGE_SIZE + + /* First, we always move the INITRD image, if present. */ +#ifdef DEBUG_ADDRESSES + srm_printk("Moving the INITRD image...\n" + " from 0x%lx to 0x%lx size 0x%x\n", + V_INITRD_START, + initrd_image_start, + INITRD_IMAGE_SIZE); +#endif + memcpy((void *)initrd_image_start, + (void *)V_INITRD_START, + INITRD_IMAGE_SIZE); + +#endif /* INITRD_IMAGE_SIZE */ + + /* Next, we may have to move the uncompressed kernel to the + final destination. + */ + if (must_move) { +#ifdef DEBUG_ADDRESSES + srm_printk("Moving the uncompressed kernel...\n" + "...from 0x%lx to 0x%lx size 0x%x\n", + uncompressed_image_start, + K_KERNEL_IMAGE_START, + (unsigned)KERNEL_SIZE); +#endif + memcpy((void *)K_KERNEL_IMAGE_START, + (void *)uncompressed_image_start, + KERNEL_SIZE); + } + + /* Clear the zero page, then move the argument list in. */ + memset((char*)ZERO_PGE, 0, PAGE_SIZE); + strcpy((char*)ZERO_PGE, envval); + +#ifdef INITRD_IMAGE_SIZE + /* Finally, set the INITRD paramenters for the kernel. */ + ((long *)(ZERO_PGE+256))[0] = initrd_image_start; + ((long *)(ZERO_PGE+256))[1] = INITRD_IMAGE_SIZE; + +#endif /* INITRD_IMAGE_SIZE */ + + runkernel(); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/boot/misc.c linux-2.4.23-pre8/arch/alpha/boot/misc.c --- linux-2.4.22/arch/alpha/boot/misc.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/boot/misc.c 2003-10-22 22:47:59.000000000 +0000 @@ -0,0 +1,207 @@ +/* + * misc.c + * + * This is a collection of several routines from gzip-1.0.3 + * adapted for Linux. + * + * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994 + * + * Modified for ARM Linux by Russell King + * + * Nicolas Pitre 1999/04/14 : + * For this code to run directly from Flash, all constant variables must + * be marked with 'const' and all other variables initialized at run-time + * only. This way all non constant variables will end up in the bss segment, + * which should point to addresses in RAM and cleared to 0 on start. + * This allows for a much quicker boot time. + * + * Modified for Alpha, from the ARM version, by Jay Estabrook 2003. + */ + +#include + +#include + +#define memzero(s,n) memset ((s),0,(n)) +#define puts srm_printk +extern long srm_printk(const char *, ...) + __attribute__ ((format (printf, 1, 2)));; + +/* + * gzip delarations + */ +#define OF(args) args +#define STATIC static + +typedef unsigned char uch; +typedef unsigned short ush; +typedef unsigned long ulg; + +#define WSIZE 0x8000 /* Window size must be at least 32k, */ + /* and a power of two */ + +static uch *inbuf; /* input buffer */ +static uch *window; /* Sliding window buffer */ + +static unsigned insize; /* valid bytes in inbuf */ +static unsigned inptr; /* index of next byte to be processed in inbuf */ +static unsigned outcnt; /* bytes in output buffer */ + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ +#define RESERVED 0xC0 /* bit 6,7: reserved */ + +#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) + +/* Diagnostic functions */ +#ifdef DEBUG +# define Assert(cond,msg) {if(!(cond)) error(msg);} +# define Trace(x) fprintf x +# define Tracev(x) {if (verbose) fprintf x ;} +# define Tracevv(x) {if (verbose>1) fprintf x ;} +# define Tracec(c,x) {if (verbose && (c)) fprintf x ;} +# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +static int fill_inbuf(void); +static void flush_window(void); +static void error(char *m); +static void gzip_mark(void **); +static void gzip_release(void **); + +static char *input_data; +static int input_data_size; + +static uch *output_data; +static ulg output_ptr; +static ulg bytes_out; + +static void *malloc(int size); +static void free(void *where); +static void error(char *m); +static void gzip_mark(void **); +static void gzip_release(void **); + +extern int end; +static ulg free_mem_ptr; +static ulg free_mem_ptr_end; + +#define HEAP_SIZE 0x2000 + +#include "../../../lib/inflate.c" + +static void *malloc(int size) +{ + void *p; + + if (size <0) error("Malloc error\n"); + if (free_mem_ptr <= 0) error("Memory error\n"); + + free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */ + + p = (void *)free_mem_ptr; + free_mem_ptr += size; + + if (free_mem_ptr >= free_mem_ptr_end) + error("Out of memory"); + return p; +} + +static void free(void *where) +{ /* gzip_mark & gzip_release do the free */ +} + +static void gzip_mark(void **ptr) +{ + *ptr = (void *) free_mem_ptr; +} + +static void gzip_release(void **ptr) +{ + free_mem_ptr = (long) *ptr; +} + +/* =========================================================================== + * Fill the input buffer. This is called only when the buffer is empty + * and at least one byte is really needed. + */ +int fill_inbuf(void) +{ + if (insize != 0) + error("ran out of input data\n"); + + inbuf = input_data; + insize = input_data_size; + + inptr = 1; + return inbuf[0]; +} + +/* =========================================================================== + * Write the output window window[0..outcnt-1] and update crc and bytes_out. + * (Used for the decompressed data only.) + */ +void flush_window(void) +{ + ulg c = crc; + unsigned n; + uch *in, *out, ch; + + in = window; + out = &output_data[output_ptr]; + for (n = 0; n < outcnt; n++) { + ch = *out++ = *in++; + c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8); + } + crc = c; + bytes_out += (ulg)outcnt; + output_ptr += (ulg)outcnt; + outcnt = 0; +/* puts("."); */ +} + +static void error(char *x) +{ + puts("\n\n"); + puts(x); + puts("\n\n -- System halted"); + + while(1); /* Halt */ +} + +unsigned int +decompress_kernel(void *output_start, + void *input_start, + size_t ksize, + size_t kzsize) +{ + output_data = (uch *)output_start; + input_data = (uch *)input_start; + input_data_size = kzsize; /* use compressed size */ + + /* FIXME FIXME FIXME */ + free_mem_ptr = (ulg)output_start + ksize; + free_mem_ptr_end = (ulg)output_start + ksize + 0x200000; + /* FIXME FIXME FIXME */ + + /* put in temp area to reduce initial footprint */ + window = malloc(WSIZE); + + makecrc(); +/* puts("Uncompressing Linux..."); */ + gunzip(); +/* puts(" done, booting the kernel.\n"); */ + return output_ptr; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/boot/tools/objstrip.c linux-2.4.23-pre8/arch/alpha/boot/tools/objstrip.c --- linux-2.4.22/arch/alpha/boot/tools/objstrip.c 2001-05-21 20:41:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/boot/tools/objstrip.c 2003-10-22 22:49:56.000000000 +0000 @@ -27,7 +27,6 @@ #include #include #ifdef __ELF__ -# include # include #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/config.in linux-2.4.23-pre8/arch/alpha/config.in --- linux-2.4.22/arch/alpha/config.in 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/config.in 2003-10-22 22:48:12.000000000 +0000 @@ -269,6 +269,7 @@ if [ "$CONFIG_SMP" = "y" ]; then define_bool CONFIG_HAVE_DEC_LOCK y + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 fi if [ "$CONFIG_ALPHA_GENERIC" = "y" -o "$CONFIG_ALPHA_SRM" = "y" ]; then @@ -439,7 +440,16 @@ mainmenu_option next_comment comment 'Kernel hacking' -bool 'Legacy kernel start address' CONFIG_ALPHA_LEGACY_START_ADDRESS +if [ "$CONFIG_ALPHA_TITAN" = "y" -o "$CONFIG_ALPHA_WILDFIRE" = "y" -o \ + "$CONFIG_ALPHA_MARVEL" = "y" ]; then + define_bool CONFIG_ALPHA_LEGACY_START_ADDRESS n +else + if [ "$CONFIG_ALPHA_GENERIC" = "y" ]; then + bool 'Legacy kernel start address' CONFIG_ALPHA_LEGACY_START_ADDRESS + else + define_bool CONFIG_ALPHA_LEGACY_START_ADDRESS y + fi +fi bool 'Kernel debugging' CONFIG_DEBUG_KERNEL if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then @@ -453,6 +463,8 @@ define_tristate CONFIG_MATHEMU y fi +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/kernel/Makefile linux-2.4.23-pre8/arch/alpha/kernel/Makefile --- linux-2.4.22/arch/alpha/kernel/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/kernel/Makefile 2003-10-22 22:48:39.000000000 +0000 @@ -37,17 +37,21 @@ ifdef CONFIG_ALPHA_GENERIC obj-y += core_apecs.o core_cia.o core_irongate.o core_lca.o core_mcpcia.o \ - core_polaris.o core_t2.o core_tsunami.o core_titan.o \ - core_wildfire.o core_marvel.o \ + core_polaris.o core_t2.o core_tsunami.o \ sys_alcor.o sys_cabriolet.o sys_dp264.o sys_eb64p.o sys_eiger.o \ - sys_jensen.o sys_miata.o sys_mikasa.o sys_nautilus.o sys_titan.o \ + sys_jensen.o sys_miata.o sys_mikasa.o sys_nautilus.o \ sys_noritake.o sys_rawhide.o sys_ruffian.o sys_rx164.o \ sys_sable.o sys_sio.o sys_sx164.o sys_takara.o sys_rx164.o \ - sys_wildfire.o sys_marvel.o \ - err_titan.o err_marvel.o \ irq_pyxis.o srmcons.o gct.o \ es1888.o smc37c669.o smc37c93x.o ns87312.o +ifndef CONFIG_ALPHA_LEGACY_START_ADDRESS +obj-y += core_titan.o core_wildfire.o core_marvel.o \ + sys_titan.o sys_wildfire.o sys_marvel.o \ + err_titan.o err_marvel.o + +endif + else # Misc support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/kernel/irq.c linux-2.4.23-pre8/arch/alpha/kernel/irq.c --- linux-2.4.22/arch/alpha/kernel/irq.c 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/kernel/irq.c 2003-10-22 22:49:16.000000000 +0000 @@ -214,7 +214,7 @@ if (!shared) { desc->depth = 0; - desc->status &= ~IRQ_DISABLED; + desc->status &= ~(IRQ_DISABLED | IRQ_INPROGRESS); desc->handler->startup(irq); } spin_unlock_irqrestore(&desc->lock,flags); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/kernel/setup.c linux-2.4.23-pre8/arch/alpha/kernel/setup.c --- linux-2.4.22/arch/alpha/kernel/setup.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/kernel/setup.c 2003-10-22 22:47:56.000000000 +0000 @@ -583,6 +583,35 @@ var_name, alpha_mv.vector_name, (alpha_using_srm ? "SRM" : "MILO")); + printk("Major Options: " +#ifdef CONFIG_SMP + "SMP " +#endif +#ifdef CONFIG_ALPHA_EV56 + "EV56 " +#endif +#ifdef CONFIG_ALPHA_EV67 + "EV67 " +#endif +#ifdef CONFIG_ALPHA_LEGACY_START_ADDRESS + "LEGACY_START " +#endif + +#ifdef CONFIG_DISCONTIGMEM + "DISCONTIGMEM " +#ifdef CONFIG_NUMA + "NUMA " +#endif +#endif + +#ifdef CONFIG_DEBUG_SPINLOCK + "DEBUG_SPINLOCK " +#endif +#ifdef CONFIG_MAGIC_SYSRQ + "MAGIC_SYSRQ " +#endif + "\n"); + printk("Command line: %s\n", command_line); /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/kernel/sys_nautilus.c linux-2.4.23-pre8/arch/alpha/kernel/sys_nautilus.c --- linux-2.4.22/arch/alpha/kernel/sys_nautilus.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/kernel/sys_nautilus.c 2003-10-22 22:48:31.000000000 +0000 @@ -226,11 +226,13 @@ if (request_resource(&iomem_resource, bus->resource[1]) < 0) printk(KERN_ERR "Failed to request MEM on hose 0\n"); - if (pci_mem < memtop && pci_mem > alpha_mv.min_mem_address) { + if (pci_mem < memtop) + memtop = pci_mem; + if (memtop > alpha_mv.min_mem_address) { free_reserved_mem(__va(alpha_mv.min_mem_address), - __va(pci_mem)); + __va(memtop)); printk("nautilus_init_pci: %ldk freed\n", - (pci_mem - alpha_mv.min_mem_address) >> 10); + (memtop - alpha_mv.min_mem_address) >> 10); } if ((IRONGATE0->dev_vendor >> 16) > 0x7006) /* Albacore? */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/alpha/mm/init.c linux-2.4.23-pre8/arch/alpha/mm/init.c --- linux-2.4.22/arch/alpha/mm/init.c 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/alpha/mm/init.c 2003-10-22 22:48:29.000000000 +0000 @@ -234,7 +234,8 @@ /* Allocate one PGD and one PMD. In the case of SRM, we'll need these to actually remap the console. There is an assumption here that only one of each is needed, and this allows for 8MB. - Currently (late 1999), big consoles are still under 4MB. + On systems with larger consoles, additional pages will be + allocated as needed during the mapping process. In the case of not SRM, but not CONFIG_ALPHA_LARGE_VMALLOC, we need to allocate the PGD we use for vmalloc before we start @@ -261,6 +262,15 @@ unsigned long paddr = crb->map[i].pa; crb->map[i].va = vaddr; for (j = 0; j < crb->map[i].count; ++j) { + /* Newer console's (especially on larger + systems) may require more pages of + PTEs. Grab additional pages as needed. */ + if (pmd != pmd_offset(pgd, vaddr)) { + memset(kernel_end, 0, PAGE_SIZE); + pmd = pmd_offset(pgd, vaddr); + pmd_set(pmd, (pte_t *)kernel_end); + kernel_end += PAGE_SIZE; + } set_pte(pte_offset(pmd, vaddr), mk_pte_phys(paddr, PAGE_KERNEL)); paddr += PAGE_SIZE; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/arm/config.in linux-2.4.23-pre8/arch/arm/config.in --- linux-2.4.22/arch/arm/config.in 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/arm/config.in 2003-10-22 22:47:59.000000000 +0000 @@ -730,6 +730,9 @@ dep_bool ' Kernel low-level debugging functions' CONFIG_DEBUG_LL $CONFIG_DEBUG_KERNEL dep_bool ' Kernel low-level debugging messages via footbridge serial port' CONFIG_DEBUG_DC21285_PORT $CONFIG_DEBUG_LL $CONFIG_FOOTBRIDGE dep_bool ' Kernel low-level debugging messages via UART2' CONFIG_DEBUG_CLPS711X_UART2 $CONFIG_DEBUG_LL $CONFIG_ARCH_CLPS711X + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/arm/mm/mm-armo.c linux-2.4.23-pre8/arch/arm/mm/mm-armo.c --- linux-2.4.22/arch/arm/mm/mm-armo.c 2001-04-12 19:20:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/arm/mm/mm-armo.c 2003-10-22 22:48:39.000000000 +0000 @@ -104,6 +104,7 @@ no_pte: spin_unlock(&mm->page_table_lock); pmd_free(new_pmd); + check_pgt_cache(); free_pgd_slow(new_pgd); return NULL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/arm/mm/mm-armv.c linux-2.4.23-pre8/arch/arm/mm/mm-armv.c --- linux-2.4.22/arch/arm/mm/mm-armv.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/arm/mm/mm-armv.c 2003-10-22 22:49:08.000000000 +0000 @@ -123,6 +123,7 @@ no_pte: spin_unlock(&mm->page_table_lock); pmd_free(new_pmd); + check_pgt_cache(); free_pages((unsigned long)new_pgd, 2); return NULL; @@ -157,6 +158,7 @@ pmd_clear(pmd); pte_free(pte); pmd_free(pmd); + check_pgt_cache(); free: free_pages((unsigned long) pgd, 2); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/cris/config.in linux-2.4.23-pre8/arch/cris/config.in --- linux-2.4.22/arch/cris/config.in 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/cris/config.in 2003-10-22 22:49:01.000000000 +0000 @@ -272,6 +272,8 @@ int ' Profile shift count' CONFIG_PROFILE_SHIFT 2 fi +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + source crypto/Config.in source lib/Config.in endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/boot/setup.S linux-2.4.23-pre8/arch/i386/boot/setup.S --- linux-2.4.22/arch/i386/boot/setup.S 2002-08-03 00:39:42.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/boot/setup.S 2003-10-22 22:47:30.000000000 +0000 @@ -45,6 +45,10 @@ * New A20 code ported from SYSLINUX by H. Peter Anvin. AMD Elan bugfixes * by Robert Schwebel, December 2001 * + * BIOS Enhanced Disk Drive support + * by Matt Domsch October 2002 + * conformant to T13 Committee www.t13.org + * projects 1572D, 1484D, 1386D, 1226DT */ #include @@ -53,6 +57,7 @@ #include #include #include +#include #include /* Signature words to ensure LILO loaded us right */ @@ -543,6 +548,70 @@ done_apm_bios: #endif +#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) +# Do the BIOS Enhanced Disk Drive calls +# This consists of two calls: +# int 13h ah=41h "Check Extensions Present" +# int 13h ah=48h "Get Device Parameters" +# +# A buffer of size EDDMAXNR*(EDDEXTSIZE+EDDPARMSIZE) is reserved for our use +# in the empty_zero_page at EDDBUF. The first four bytes of which are +# used to store the device number, interface support map and version +# results from fn41. The following 74 bytes are used to store +# the results from fn48. Starting from device 80h, fn41, then fn48 +# are called and their results stored in EDDBUF+n*(EDDEXTSIZE+EDDPARMIZE). +# Then the pointer is incremented to store the data for the next call. +# This repeats until either a device doesn't exist, or until EDDMAXNR +# devices have been stored. +# The one tricky part is that ds:si always points four bytes into +# the structure, and the fn41 results are stored at offsets +# from there. This removes the need to increment the pointer for +# every store, and leaves it ready for the fn48 call. +# A second one-byte buffer, EDDNR, in the empty_zero_page stores +# the number of BIOS devices which exist, up to EDDMAXNR. +# In setup.c, copy_edd() stores both empty_zero_page buffers away +# for later use, as they would get overwritten otherwise. +# This code is sensitive to the size of the structs in edd.h +edd_start: + # %ds points to the bootsector + # result buffer for fn48 + movw $EDDBUF+EDDEXTSIZE, %si # in ds:si, fn41 results + # kept just before that + movb $0, (EDDNR) # zero value at EDDNR + movb $0x80, %dl # BIOS device 0x80 + +edd_check_ext: + movb $CHECKEXTENSIONSPRESENT, %ah # Function 41 + movw $EDDMAGIC1, %bx # magic + int $0x13 # make the call + jc edd_done # no more BIOS devices + + cmpw $EDDMAGIC2, %bx # is magic right? + jne edd_next # nope, next... + + movb %dl, %ds:-4(%si) # store device number + movb %ah, %ds:-3(%si) # store version + movw %cx, %ds:-2(%si) # store extensions + incb (EDDNR) # note that we stored something + +edd_get_device_params: + movw $EDDPARMSIZE, %ds:(%si) # put size + movb $GETDEVICEPARAMETERS, %ah # Function 48 + int $0x13 # make the call + # Don't check for fail return + # it doesn't matter. + movw %si, %ax # increment si + addw $EDDPARMSIZE+EDDEXTSIZE, %ax + movw %ax, %si + +edd_next: + incb %dl # increment to next device + cmpb $EDDMAXNR, (EDDNR) # Out of space? + jb edd_check_ext # keep looping + +edd_done: +#endif + # Now we want to move to protected mode ... cmpw $0, %cs:realmode_swtch jz rmodeswtch_normal diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/config.in linux-2.4.23-pre8/arch/i386/config.in --- linux-2.4.22/arch/i386/config.in 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/config.in 2003-10-22 22:48:24.000000000 +0000 @@ -201,6 +201,10 @@ tristate '/dev/cpu/*/msr - Model-specific register support' CONFIG_X86_MSR tristate '/dev/cpu/*/cpuid - CPU information support' CONFIG_X86_CPUID +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + tristate 'BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL)' CONFIG_EDD +fi + choice 'High Memory Support' \ "off CONFIG_NOHIGHMEM \ 4GB CONFIG_HIGHMEM4G \ @@ -231,6 +235,7 @@ define_bool CONFIG_X86_IO_APIC y fi else + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 bool 'Multi-node NUMA system support' CONFIG_X86_NUMA if [ "$CONFIG_X86_NUMA" = "y" ]; then #Platform Choices @@ -476,6 +481,8 @@ bool ' Compile the kernel with frame pointers' CONFIG_FRAME_POINTER fi +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/defconfig linux-2.4.23-pre8/arch/i386/defconfig --- linux-2.4.22/arch/i386/defconfig 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/defconfig 2003-10-22 22:47:46.000000000 +0000 @@ -56,6 +56,7 @@ # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set +# CONFIG_EDD is not set CONFIG_NOHIGHMEM=y # CONFIG_HIGHMEM4G is not set # CONFIG_HIGHMEM64G is not set @@ -64,6 +65,7 @@ CONFIG_SMP=y # CONFIG_MULTIQUAD is not set CONFIG_HAVE_DEC_LOCK=y +CONFIG_NR_CPUS=32 # # General setup diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/Makefile linux-2.4.23-pre8/arch/i386/kernel/Makefile --- linux-2.4.22/arch/i386/kernel/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/Makefile 2003-10-22 22:47:56.000000000 +0000 @@ -38,10 +38,10 @@ obj-$(CONFIG_APM) += apm.o obj-$(CONFIG_ACPI_BOOT) += acpi.o obj-$(CONFIG_ACPI_SLEEP) += acpi_wakeup.o -obj-$(CONFIG_ACPI_HT_ONLY) += acpitable.o obj-$(CONFIG_SMP) += smp.o smpboot.o trampoline.o obj-$(CONFIG_X86_LOCAL_APIC) += mpparse.o apic.o nmi.o obj-$(CONFIG_X86_IO_APIC) += io_apic.o obj-$(CONFIG_X86_VISWS_APIC) += visws_apic.o +obj-$(CONFIG_EDD) += edd.o include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/acpi.c linux-2.4.23-pre8/arch/i386/kernel/acpi.c --- linux-2.4.22/arch/i386/kernel/acpi.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/acpi.c 2003-10-22 22:49:19.000000000 +0000 @@ -355,7 +355,6 @@ result = acpi_table_parse(ACPI_APIC, acpi_parse_madt); if (!result) { - printk(KERN_WARNING PREFIX "MADT not present\n"); return 0; } else if (result < 0) { @@ -471,6 +470,34 @@ #endif /*CONFIG_ACPI_BOOT*/ +#ifdef CONFIG_ACPI_BUS +/* + * Set specified PIC IRQ to level triggered mode. + * + * Port 0x4d0-4d1 are ECLR1 and ECLR2, the Edge/Level Control Registers + * for the 8259 PIC. bit[n] = 1 means irq[n] is Level, otherwise Edge. + * ECLR1 is IRQ's 0-7 (IRQ 0, 1, 2 must be 0) + * ECLR2 is IRQ's 8-15 (IRQ 8, 13 must be 0) + * + * As the BIOS should have done this for us, + * print a warning if the IRQ wasn't already set to level. + */ + +void acpi_pic_set_level_irq(unsigned int irq) +{ + unsigned char mask = 1 << (irq & 7); + unsigned int port = 0x4d0 + (irq >> 3); + unsigned char val = inb(port); + + if (!(val & mask)) { + printk(KERN_WARNING PREFIX "IRQ %d was Edge Triggered, " + "setting to Level Triggerd\n", irq); + outb(val | mask, port); + } +} +#endif /* CONFIG_ACPI_BUS */ + + /* -------------------------------------------------------------------------- Low-Level Sleep Support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/acpitable.c linux-2.4.23-pre8/arch/i386/kernel/acpitable.c --- linux-2.4.22/arch/i386/kernel/acpitable.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/acpitable.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,553 +0,0 @@ -/* - * acpitable.c - IA32-specific ACPI boot-time initialization (Revision: 1) - * - * Copyright (C) 1999 Andrew Henroid - * Copyright (C) 2001 Richard Schaal - * Copyright (C) 2001 Paul Diefenbaugh - * Copyright (C) 2001 Jun Nakajima - * Copyright (C) 2001 Arjan van de Ven - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * 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 - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * $Id: acpitable.c,v 1.7 2001/11/04 12:21:18 fenrus Exp $ - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "acpitable.h" - -static acpi_table_handler acpi_boot_ops[ACPI_TABLE_COUNT]; - -int acpi_lapic; - -static unsigned char __init -acpi_checksum(void *buffer, int length) -{ - int i; - unsigned char *bytebuffer; - unsigned char sum = 0; - - if (!buffer || length <= 0) - return 0; - - bytebuffer = (unsigned char *) buffer; - - for (i = 0; i < length; i++) - sum += *(bytebuffer++); - - return sum; -} - -static void __init -acpi_print_table_header(acpi_table_header * header) -{ - if (!header) - return; - - printk(KERN_INFO "ACPI table found: %.4s v%d [%.6s %.8s %d.%d]\n", - header->signature, header->revision, header->oem_id, - header->oem_table_id, header->oem_revision >> 16, - header->oem_revision & 0xffff); - - return; -} - -/******************************************************************************* - * - * FUNCTION: acpi_tb_scan_memory_for_rsdp - * - * PARAMETERS: address - Starting pointer for search - * length - Maximum length to search - * - * RETURN: Pointer to the RSDP if found and valid, otherwise NULL. - * - * DESCRIPTION: Search a block of memory for the RSDP signature - * - ******************************************************************************/ - -static void *__init -acpi_tb_scan_memory_for_rsdp(void *address, int length) -{ - int offset; - - if (length <= 0) - return NULL; - - /* Search from given start addr for the requested length */ - - offset = 0; - - while (offset < length) { - /* The signature must match and the checksum must be correct */ - if (strncmp(address, RSDP_SIG, sizeof(RSDP_SIG) - 1) == 0 && - acpi_checksum(address, RSDP_CHECKSUM_LENGTH) == 0) { - /* If so, we have found the RSDP */ - printk(KERN_INFO "ACPI: RSDP located at physical address %p\n", - address); - return address; - } - offset += RSDP_SCAN_STEP; - address += RSDP_SCAN_STEP; - } - - /* Searched entire block, no RSDP was found */ - dprintk(KERN_INFO "ACPI: Searched entire block 0x%x:0x%x, no RSDP was found.\n", - (int)address, (int)address + length); - return NULL; -} - -/******************************************************************************* - * - * FUNCTION: acpi_find_root_pointer - * - * PARAMETERS: none - * - * RETURN: physical address of the RSDP - * - * DESCRIPTION: Search lower 1_mbyte of memory for the root system descriptor - * pointer structure. If it is found, set *RSDP to point to it. - * - * NOTE: The RSDP must be either in the first 1_k of the Extended - * BIOS Data Area or between E0000 and FFFFF (ACPI 1.0 section - * 5.2.2; assertion #421). - * - ******************************************************************************/ - -static struct acpi_table_rsdp * __init -acpi_find_root_pointer(void) -{ - struct acpi_table_rsdp * rsdp; - - /* - * Physical address is given - */ - /* - * Region 1) Search EBDA (low memory) paragraphs - */ - rsdp = acpi_tb_scan_memory_for_rsdp(__va(LO_RSDP_WINDOW_BASE), - LO_RSDP_WINDOW_SIZE); - - if (rsdp) - return rsdp; - - /* - * Region 2) Search upper memory: 16-byte boundaries in E0000h-F0000h - */ - rsdp = acpi_tb_scan_memory_for_rsdp(__va(HI_RSDP_WINDOW_BASE), - HI_RSDP_WINDOW_SIZE); - - - - if (rsdp) - return rsdp; - - printk(KERN_ERR "ACPI: System description tables not found\n"); - return NULL; -} - - -/* - * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END, - * to map the target physical address. The problem is that set_fixmap() - * provides a single page, and it is possible that the page is not - * sufficient. - * By using this area, we can map up to MAX_IO_APICS pages temporarily, - * i.e. until the next __va_range() call. - * - * Important Safety Note: The fixed I/O APIC page numbers are *subtracted* - * from the fixed base. That's why we start at FIX_IO_APIC_BASE_END and - * count idx down while incrementing the phys address. - */ -static __init char * -__va_range(unsigned long phys, unsigned long size) -{ - unsigned long base, offset, mapped_size; - int idx; - - offset = phys & (PAGE_SIZE - 1); - mapped_size = PAGE_SIZE - offset; - set_fixmap(FIX_IO_APIC_BASE_END, phys); - base = fix_to_virt(FIX_IO_APIC_BASE_END); - dprintk("__va_range(0x%lx, 0x%lx): idx=%d mapped at %lx\n", phys, size, - FIX_IO_APIC_BASE_END, base); - - /* - * Most cases can be covered by the below. - */ - idx = FIX_IO_APIC_BASE_END; - while (mapped_size < size) { - if (--idx < FIX_IO_APIC_BASE_0) - return 0; /* cannot handle this */ - phys += PAGE_SIZE; - set_fixmap(idx, phys); - mapped_size += PAGE_SIZE; - } - - return ((unsigned char *) base + offset); -} - -static int __init acpi_tables_init(void) -{ - int result = -ENODEV; - acpi_table_header *header = NULL; - struct acpi_table_rsdp *rsdp = NULL; - struct acpi_table_rsdt *rsdt = NULL; - struct acpi_table_rsdt saved_rsdt; - int tables = 0; - int type = 0; - int i = 0; - - - rsdp = (struct acpi_table_rsdp *) acpi_find_root_pointer(); - - if (!rsdp) - return -ENODEV; - - printk(KERN_INFO "%.8s v%d [%.6s]\n", rsdp->signature, rsdp->revision, - rsdp->oem_id); - - if (strncmp(rsdp->signature, RSDP_SIG,strlen(RSDP_SIG))) { - printk(KERN_WARNING "RSDP table signature incorrect\n"); - return -EINVAL; - } - - rsdt = (struct acpi_table_rsdt *) - __va_range(rsdp->rsdt_address, sizeof(struct acpi_table_rsdt)); - - if (!rsdt) { - printk(KERN_WARNING "ACPI: Invalid root system description tables (RSDT)\n"); - return -ENODEV; - } - - header = & rsdt->header; - acpi_print_table_header(header); - - if (strncmp(header->signature, RSDT_SIG, strlen(RSDT_SIG))) { - printk(KERN_WARNING "ACPI: RSDT signature incorrect\n"); - return -ENODEV; - } - - /* - * The number of tables is computed by taking the - * size of all entries (header size minus total - * size of RSDT) divided by the size of each entry - * (4-byte table pointers). - */ - tables = (header->length - sizeof(acpi_table_header)) / 4; - - memcpy(&saved_rsdt, rsdt, sizeof(saved_rsdt)); - - if (saved_rsdt.header.length > sizeof(saved_rsdt)) { - printk(KERN_WARNING "ACPI: Too big length in RSDT: %d\n", saved_rsdt.header.length); - return -ENODEV; - } - - for (i = 0; i < tables; i++) { - /* Map in header, then map in full table length. */ - header = (acpi_table_header *) - __va_range(saved_rsdt.entry[i], - sizeof(acpi_table_header)); - if (!header) - break; - header = (acpi_table_header *) - __va_range(saved_rsdt.entry[i], header->length); - if (!header) - break; - - acpi_print_table_header(header); - - if (acpi_checksum(header,header->length)) { - printk(KERN_WARNING "ACPI %s has invalid checksum\n", - acpi_table_signatures[i]); - continue; - } - - for (type = 0; type < ACPI_TABLE_COUNT; type++) - if (!strncmp((char *) &header->signature, - acpi_table_signatures[type],strlen(acpi_table_signatures[type]))) - break; - - if (type >= ACPI_TABLE_COUNT) { - printk(KERN_WARNING "ACPI: Unsupported table %.4s\n", - header->signature); - continue; - } - - - if (!acpi_boot_ops[type]) - continue; - - result = acpi_boot_ops[type] (header, - (unsigned long) saved_rsdt. - entry[i]); - } - - return result; -} - -static int total_cpus __initdata = 0; -int have_acpi_tables; - -extern void __init MP_processor_info(struct mpc_config_processor *); - -static void __init -acpi_parse_lapic(struct acpi_table_lapic *local_apic) -{ - struct mpc_config_processor proc_entry; - int ix = 0; - - if (!local_apic) - return; - - printk(KERN_INFO "LAPIC (acpi_id[0x%04x] id[0x%x] enabled[%d])\n", - local_apic->acpi_id, local_apic->id, local_apic->flags.enabled); - - printk(KERN_INFO "CPU %d (0x%02x00)", total_cpus, local_apic->id); - - if (local_apic->flags.enabled) { - printk(" enabled\n"); - ix = local_apic->id; - if (ix >= MAX_APICS) { - printk(KERN_WARNING - "Processor #%d INVALID - (Max ID: %d).\n", ix, - MAX_APICS); - return; - } - /* - * Fill in the info we want to save. Not concerned about - * the processor ID. Processor features aren't present in - * the table. - */ - proc_entry.mpc_type = MP_PROCESSOR; - proc_entry.mpc_apicid = local_apic->id; - proc_entry.mpc_cpuflag = CPU_ENABLED; - if (proc_entry.mpc_apicid == boot_cpu_physical_apicid) { - printk(" (BSP)"); - proc_entry.mpc_cpuflag |= CPU_BOOTPROCESSOR; - } - proc_entry.mpc_cpufeature = - (boot_cpu_data.x86 << 8) | - (boot_cpu_data.x86_model << 4) | - boot_cpu_data.x86_mask; - proc_entry.mpc_featureflag = boot_cpu_data.x86_capability[0]; - proc_entry.mpc_reserved[0] = 0; - proc_entry.mpc_reserved[1] = 0; - proc_entry.mpc_apicver = 0x10; /* integrated APIC */ - MP_processor_info(&proc_entry); - } else { - printk(" disabled\n"); - } - - total_cpus++; - return; -} - -static void __init -acpi_parse_ioapic(struct acpi_table_ioapic *ioapic) -{ - - if (!ioapic) - return; - - printk(KERN_INFO - "IOAPIC (id[0x%x] address[0x%x] global_irq_base[0x%x])\n", - ioapic->id, ioapic->address, ioapic->global_irq_base); - - if (nr_ioapics >= MAX_IO_APICS) { - printk(KERN_WARNING - "Max # of I/O APICs (%d) exceeded (found %d).\n", - MAX_IO_APICS, nr_ioapics); -/* panic("Recompile kernel with bigger MAX_IO_APICS!\n"); */ - } -} - - -/* Interrupt source overrides inform the machine about exceptions - to the normal "PIC" mode interrupt routing */ - -static void __init -acpi_parse_int_src_ovr(struct acpi_table_int_src_ovr *intsrc) -{ - if (!intsrc) - return; - - printk(KERN_INFO - "INT_SRC_OVR (bus[%d] irq[0x%x] global_irq[0x%x] polarity[0x%x] trigger[0x%x])\n", - intsrc->bus, intsrc->bus_irq, intsrc->global_irq, - intsrc->flags.polarity, intsrc->flags.trigger); -} - -/* - * At this point, we look at the interrupt assignment entries in the MPS - * table. - */ - -static void __init acpi_parse_nmi_src(struct acpi_table_nmi_src *nmisrc) -{ - if (!nmisrc) - return; - - printk(KERN_INFO - "NMI_SRC (polarity[0x%x] trigger[0x%x] global_irq[0x%x])\n", - nmisrc->flags.polarity, nmisrc->flags.trigger, - nmisrc->global_irq); - -} -static void __init -acpi_parse_lapic_nmi(struct acpi_table_lapic_nmi *localnmi) -{ - if (!localnmi) - return; - - printk(KERN_INFO - "LAPIC_NMI (acpi_id[0x%04x] polarity[0x%x] trigger[0x%x] lint[0x%x])\n", - localnmi->acpi_id, localnmi->flags.polarity, - localnmi->flags.trigger, localnmi->lint); -} -static void __init -acpi_parse_lapic_addr_ovr(struct acpi_table_lapic_addr_ovr *lapic_addr_ovr) -{ - if (!lapic_addr_ovr) - return; - - printk(KERN_INFO "LAPIC_ADDR_OVR (address[0x%lx])\n", - (unsigned long) lapic_addr_ovr->address); - -} - -static void __init -acpi_parse_plat_int_src(struct acpi_table_plat_int_src *plintsrc) -{ - if (!plintsrc) - return; - - printk(KERN_INFO - "PLAT_INT_SRC (polarity[0x%x] trigger[0x%x] type[0x%x] id[0x%04x] eid[0x%x] iosapic_vector[0x%x] global_irq[0x%x]\n", - plintsrc->flags.polarity, plintsrc->flags.trigger, - plintsrc->type, plintsrc->id, plintsrc->eid, - plintsrc->iosapic_vector, plintsrc->global_irq); -} -static int __init -acpi_parse_madt(acpi_table_header * header, unsigned long phys) -{ - - struct acpi_table_madt *madt; - acpi_madt_entry_header *entry_header; - int table_size; - - madt = (struct acpi_table_madt *) __va_range(phys, header->length); - - if (!madt) - return -EINVAL; - - table_size = (int) (header->length - sizeof(*madt)); - entry_header = - (acpi_madt_entry_header *) ((void *) madt + sizeof(*madt)); - - while (entry_header && (table_size > 0)) { - switch (entry_header->type) { - case ACPI_MADT_LAPIC: - acpi_parse_lapic((struct acpi_table_lapic *) - entry_header); - break; - case ACPI_MADT_IOAPIC: - acpi_parse_ioapic((struct acpi_table_ioapic *) - entry_header); - break; - case ACPI_MADT_INT_SRC_OVR: - acpi_parse_int_src_ovr((struct acpi_table_int_src_ovr *) - entry_header); - break; - case ACPI_MADT_NMI_SRC: - acpi_parse_nmi_src((struct acpi_table_nmi_src *) - entry_header); - break; - case ACPI_MADT_LAPIC_NMI: - acpi_parse_lapic_nmi((struct acpi_table_lapic_nmi *) - entry_header); - break; - case ACPI_MADT_LAPIC_ADDR_OVR: - acpi_parse_lapic_addr_ovr((struct - acpi_table_lapic_addr_ovr *) - entry_header); - break; - case ACPI_MADT_PLAT_INT_SRC: - acpi_parse_plat_int_src((struct acpi_table_plat_int_src - *) entry_header); - break; - default: - printk(KERN_WARNING - "Unsupported MADT entry type 0x%x\n", - entry_header->type); - break; - } - table_size -= entry_header->length; - entry_header = - (acpi_madt_entry_header *) ((void *) entry_header + - entry_header->length); - } - - if (!total_cpus) { - printk("ACPI: No Processors found in the APCI table.\n"); - return -EINVAL; - } - - printk(KERN_INFO "%d CPUs total\n", total_cpus); - - if (madt->lapic_address) - mp_lapic_addr = madt->lapic_address; - else - mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; - - printk(KERN_INFO "Local APIC address %x\n", madt->lapic_address); - - return 0; -} - - -/* - * Configure the processor info using MADT in the ACPI tables. If we fail to - * configure that, then we use the MPS tables. - */ -void __init -acpi_boot_init(void) -{ - - memset(&acpi_boot_ops, 0, sizeof(acpi_boot_ops)); - acpi_boot_ops[ACPI_APIC] = acpi_parse_madt; - - /* - * Only do this when requested, either because of CPU/Bios type or from the command line - */ - - if (!acpi_tables_init()) - acpi_lapic = 1; -} - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/acpitable.h linux-2.4.23-pre8/arch/i386/kernel/acpitable.h --- linux-2.4.22/arch/i386/kernel/acpitable.h 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/acpitable.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,262 +0,0 @@ -/* - * acpitable.c - IA32-specific ACPI boot-time initialization (Revision: 1) - * - * Copyright (C) 1999 Andrew Henroid - * Copyright (C) 2001 Richard Schaal - * Copyright (C) 2001 Paul Diefenbaugh - * Copyright (C) 2001 Jun Nakajima - * Copyright (C) 2001 Arjan van de Ven - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * 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 - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * $Id: acpitable.h,v 1.3 2001/11/03 22:41:34 fenrus Exp $ - */ - -/* - * The following codes are cut&pasted from drivers/acpi. Part of the code - * there can be not updated or delivered yet. - * To avoid conflicts when CONFIG_ACPI is defined, the following codes are - * modified so that they are self-contained in this file. - * -- jun - */ - -#ifndef _HEADER_ACPITABLE_H_ -#define _HEADER_ACPITABLE_H_ - -//#define dprintk(s, args...) printk(s, ## args) -#define dprintk(s, args...) - -typedef unsigned int ACPI_TBLPTR; - -typedef struct { /* ACPI common table header */ - char signature[4]; /* identifies type of table */ - u32 length; /* length of table, - in bytes, * including header */ - u8 revision; /* specification minor version # */ - u8 checksum; /* to make sum of entire table == 0 */ - char oem_id[6]; /* OEM identification */ - char oem_table_id[8]; /* OEM table identification */ - u32 oem_revision; /* OEM revision number */ - char asl_compiler_id[4]; /* ASL compiler vendor ID */ - u32 asl_compiler_revision; /* ASL compiler revision number */ -} acpi_table_header __attribute__ ((packed));; - -enum { - ACPI_APIC = 0, - ACPI_BOOT, - ACPI_DBGP, - ACPI_DSDT, - ACPI_ECDT, - ACPI_ETDT, - ACPI_FACP, - ACPI_FACS, - ACPI_OEMX, - ACPI_PSDT, - ACPI_SBST, - ACPI_SLIT, - ACPI_SPCR, - ACPI_SRAT, - ACPI_SSDT, - ACPI_SPMI, - ACPI_XSDT, - ACPI_TABLE_COUNT -}; - -static char *acpi_table_signatures[ACPI_TABLE_COUNT] = { - "APIC", - "BOOT", - "DBGP", - "DSDT", - "ECDT", - "ETDT", - "FACP", - "FACS", - "OEM", - "PSDT", - "SBST", - "SLIT", - "SPCR", - "SRAT", - "SSDT", - "SPMI", - "XSDT" -}; - -struct acpi_table_madt { - acpi_table_header header; - u32 lapic_address; - struct { - u32 pcat_compat:1; - u32 reserved:31; - } flags __attribute__ ((packed)); -} __attribute__ ((packed));; - -enum { - ACPI_MADT_LAPIC = 0, - ACPI_MADT_IOAPIC, - ACPI_MADT_INT_SRC_OVR, - ACPI_MADT_NMI_SRC, - ACPI_MADT_LAPIC_NMI, - ACPI_MADT_LAPIC_ADDR_OVR, - ACPI_MADT_IOSAPIC, - ACPI_MADT_LSAPIC, - ACPI_MADT_PLAT_INT_SRC, - ACPI_MADT_ENTRY_COUNT -}; - -#define RSDP_SIG "RSD PTR " -#define RSDT_SIG "RSDT" - -#define ACPI_DEBUG_PRINT(pl) - -#define ACPI_MEMORY_MODE 0x01 -#define ACPI_LOGICAL_ADDRESSING 0x00 -#define ACPI_PHYSICAL_ADDRESSING 0x01 - -#define LO_RSDP_WINDOW_BASE 0 /* Physical Address */ -#define HI_RSDP_WINDOW_BASE 0xE0000 /* Physical Address */ -#define LO_RSDP_WINDOW_SIZE 0x400 -#define HI_RSDP_WINDOW_SIZE 0x20000 -#define RSDP_SCAN_STEP 16 -#define RSDP_CHECKSUM_LENGTH 20 - -typedef int (*acpi_table_handler) (acpi_table_header * header, unsigned long); - -struct acpi_table_rsdp { - char signature[8]; - u8 checksum; - char oem_id[6]; - u8 revision; - u32 rsdt_address; -} __attribute__ ((packed)); - -struct acpi_table_rsdt { - acpi_table_header header; - u32 entry[ACPI_TABLE_COUNT]; -} __attribute__ ((packed)); - -typedef struct { - u8 type; - u8 length; -} acpi_madt_entry_header __attribute__ ((packed)); - -typedef struct { - u16 polarity:2; - u16 trigger:2; - u16 reserved:12; -} acpi_madt_int_flags __attribute__ ((packed)); - -struct acpi_table_lapic { - acpi_madt_entry_header header; - u8 acpi_id; - u8 id; - struct { - u32 enabled:1; - u32 reserved:31; - } flags __attribute__ ((packed)); -} __attribute__ ((packed)); - -struct acpi_table_ioapic { - acpi_madt_entry_header header; - u8 id; - u8 reserved; - u32 address; - u32 global_irq_base; -} __attribute__ ((packed)); - -struct acpi_table_int_src_ovr { - acpi_madt_entry_header header; - u8 bus; - u8 bus_irq; - u32 global_irq; - acpi_madt_int_flags flags; -} __attribute__ ((packed)); - -struct acpi_table_nmi_src { - acpi_madt_entry_header header; - acpi_madt_int_flags flags; - u32 global_irq; -} __attribute__ ((packed)); - -struct acpi_table_lapic_nmi { - acpi_madt_entry_header header; - u8 acpi_id; - acpi_madt_int_flags flags; - u8 lint; -} __attribute__ ((packed)); - -struct acpi_table_lapic_addr_ovr { - acpi_madt_entry_header header; - u8 reserved[2]; - u64 address; -} __attribute__ ((packed)); - -struct acpi_table_iosapic { - acpi_madt_entry_header header; - u8 id; - u8 reserved; - u32 global_irq_base; - u64 address; -} __attribute__ ((packed)); - -struct acpi_table_lsapic { - acpi_madt_entry_header header; - u8 acpi_id; - u8 id; - u8 eid; - u8 reserved[3]; - struct { - u32 enabled:1; - u32 reserved:31; - } flags; -} __attribute__ ((packed)); - -struct acpi_table_plat_int_src { - acpi_madt_entry_header header; - acpi_madt_int_flags flags; - u8 type; - u8 id; - u8 eid; - u8 iosapic_vector; - u32 global_irq; - u32 reserved; -} __attribute__ ((packed)); - -/* - * ACPI Table Descriptor. One per ACPI table - */ -typedef struct acpi_table_desc { - struct acpi_table_desc *prev; - struct acpi_table_desc *next; - struct acpi_table_desc *installed_desc; - acpi_table_header *pointer; - void *base_pointer; - u8 *aml_pointer; - u64 physical_address; - u32 aml_length; - u32 length; - u32 count; - u16 table_id; - u8 type; - u8 allocation; - u8 loaded_into_namespace; - -} acpi_table_desc __attribute__ ((packed));; - -#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/apic.c linux-2.4.23-pre8/arch/i386/kernel/apic.c --- linux-2.4.22/arch/i386/kernel/apic.c 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/apic.c 2003-10-22 22:49:54.000000000 +0000 @@ -38,6 +38,8 @@ int prof_old_multiplier[NR_CPUS] = { 1, }; int prof_counter[NR_CPUS] = { 1, }; +static int enabled_via_apicbase; + int get_maxlvt(void) { unsigned int v, ver, maxlvt; @@ -142,6 +144,13 @@ value = apic_read(APIC_SPIV); value &= ~APIC_SPIV_APIC_ENABLED; apic_write_around(APIC_SPIV, value); + + if (enabled_via_apicbase) { + unsigned int l, h; + rdmsr(MSR_IA32_APICBASE, l, h); + l &= ~MSR_IA32_APICBASE_ENABLE; + wrmsr(MSR_IA32_APICBASE, l, h); + } } /* @@ -464,7 +473,6 @@ static void apic_pm_suspend(void *data) { - unsigned int l, h; unsigned long flags; if (apic_pm_state.perfctr_pmdev) @@ -484,9 +492,6 @@ __save_flags(flags); __cli(); disable_local_APIC(); - rdmsr(MSR_IA32_APICBASE, l, h); - l &= ~MSR_IA32_APICBASE_ENABLE; - wrmsr(MSR_IA32_APICBASE, l, h); __restore_flags(flags); } @@ -497,10 +502,18 @@ __save_flags(flags); __cli(); + + /* + * Make sure the APICBASE points to the right address + * + * FIXME! This will be wrong if we ever support suspend on + * SMP! We'll need to do this as part of the CPU restore! + */ rdmsr(MSR_IA32_APICBASE, l, h); l &= ~MSR_IA32_APICBASE_BASE; - l |= MSR_IA32_APICBASE_ENABLE | APIC_DEFAULT_PHYS_BASE; + l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr; wrmsr(MSR_IA32_APICBASE, l, h); + apic_write(APIC_LVTERR, ERROR_APIC_VECTOR | APIC_LVT_MASKED); apic_write(APIC_ID, apic_pm_state.apic_id); apic_write(APIC_DFR, apic_pm_state.apic_dfr); @@ -593,7 +606,26 @@ * Detect and enable local APICs on non-SMP boards. * Original code written by Keir Fraser. */ -int dont_enable_local_apic __initdata = 0; + +/* + * Knob to control our willingness to enable the local APIC. + */ +int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */ + +static int __init lapic_disable(char *str) +{ + enable_local_apic = -1; + clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability); + return 0; +} +__setup("nolapic", lapic_disable); + +static int __init lapic_enable(char *str) +{ + enable_local_apic = 1; + return 0; +} +__setup("lapic", lapic_enable); static int __init detect_init_APIC (void) { @@ -601,7 +633,7 @@ extern void get_cpu_vendor(struct cpuinfo_x86*); /* Disabled by DMI scan or kernel option? */ - if (dont_enable_local_apic) + if (enable_local_apic < 0) return -1; /* Workaround for us being called before identify_cpu(). */ @@ -616,7 +648,7 @@ goto no_apic; case X86_VENDOR_INTEL: if (boot_cpu_data.x86 == 6 || - (boot_cpu_data.x86 == 15 && cpu_has_apic) || + (boot_cpu_data.x86 == 15 && (cpu_has_apic || enable_local_apic > 0)) || (boot_cpu_data.x86 == 5 && cpu_has_apic)) break; goto no_apic; @@ -636,6 +668,7 @@ l &= ~MSR_IA32_APICBASE_BASE; l |= MSR_IA32_APICBASE_ENABLE | APIC_DEFAULT_PHYS_BASE; wrmsr(MSR_IA32_APICBASE, l, h); + enabled_via_apicbase = 1; } } /* @@ -649,6 +682,12 @@ } set_bit(X86_FEATURE_APIC, &boot_cpu_data.x86_capability); mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; + + /* The BIOS may have set up the APIC at some other address */ + rdmsr(MSR_IA32_APICBASE, l, h); + if (l & MSR_IA32_APICBASE_ENABLE) + mp_lapic_addr = l & MSR_IA32_APICBASE_BASE; + if (nmi_watchdog != NMI_NONE) nmi_watchdog = NMI_LOCAL_APIC; @@ -928,14 +967,8 @@ static unsigned int calibration_result; -int dont_use_local_apic_timer __initdata = 0; - void __init setup_APIC_clocks (void) { - /* Disabled by DMI scan or kernel option? */ - if (dont_use_local_apic_timer) - return; - printk("Using local APIC timer interrupts.\n"); using_apic_timer = 1; @@ -1152,6 +1185,9 @@ */ int __init APIC_init_uniprocessor (void) { + if (enable_local_apic < 0) + clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability); + if (!smp_found_config && !cpu_has_apic) return -1; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/dmi_scan.c linux-2.4.23-pre8/arch/i386/kernel/dmi_scan.c --- linux-2.4.22/arch/i386/kernel/dmi_scan.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/dmi_scan.c 2003-10-22 22:48:31.000000000 +0000 @@ -335,9 +335,9 @@ static int __init local_apic_kills_bios(struct dmi_blacklist *d) { #ifdef CONFIG_X86_LOCAL_APIC - extern int dont_enable_local_apic; - if (!dont_enable_local_apic) { - dont_enable_local_apic = 1; + extern int enable_local_apic; + if (enable_local_apic == 0) { + enable_local_apic = -1; printk(KERN_WARNING "%s with broken BIOS detected. " "Refusing to enable the local APIC.\n", d->ident); @@ -347,43 +347,6 @@ } /* - * The Microstar 6163-2 (a.k.a Pro) mainboard will hang shortly after - * resumes, and also at what appears to be asynchronous APM events, - * if the local APIC is enabled. - */ -static int __init apm_kills_local_apic(struct dmi_blacklist *d) -{ -#ifdef CONFIG_X86_LOCAL_APIC - extern int dont_enable_local_apic; - if (apm_info.bios.version && !dont_enable_local_apic) { - dont_enable_local_apic = 1; - printk(KERN_WARNING "%s with broken BIOS detected. " - "Refusing to enable the local APIC.\n", - d->ident); - } -#endif - return 0; -} - -/* - * The Intel AL440LX mainboard will hang randomly if the local APIC - * timer is running and the APM BIOS hasn't been disabled. - */ -static int __init apm_kills_local_apic_timer(struct dmi_blacklist *d) -{ -#ifdef CONFIG_X86_LOCAL_APIC - extern int dont_use_local_apic_timer; - if (apm_info.bios.version && !dont_use_local_apic_timer) { - dont_use_local_apic_timer = 1; - printk(KERN_WARNING "%s with broken BIOS detected. " - "The local APIC timer will not be used.\n", - d->ident); - } -#endif - return 0; -} - -/* * Check for clue free BIOS implementations who use * the following QA technique * @@ -437,37 +400,6 @@ } /* - * The Intel 440GX hall of shame. - * - * On many (all we have checked) of these boxes the $PIRQ table is wrong. - * The MP1.4 table is right however and so SMP kernels tend to work. - */ - -#ifdef CONFIG_PCI -extern int broken_440gx_bios; -extern unsigned int pci_probe; -#endif -static __init int broken_pirq(struct dmi_blacklist *d) -{ - printk(KERN_INFO " *** Possibly defective BIOS detected (irqtable)\n"); - printk(KERN_INFO " *** Many BIOSes matching this signature have incorrect IRQ routing tables.\n"); - printk(KERN_INFO " *** If you see IRQ problems, in paticular SCSI resets and hangs at boot\n"); - printk(KERN_INFO " *** contact your hardware vendor and ask about updates.\n"); - printk(KERN_INFO " *** Building an SMP kernel may evade the bug some of the time.\n"); -#ifdef CONFIG_X86_IO_APIC - { - extern int skip_ioapic_setup; - skip_ioapic_setup = 0; - } -#endif -#ifdef CONFIG_PCI - broken_440gx_bios = 1; - pci_probe |= PCI_BIOS_IRQ_SCAN; -#endif - return 0; -} - -/* * ASUS K7V-RM has broken ACPI table defining sleep modes */ @@ -549,7 +481,7 @@ #ifdef CONFIG_ACPI_BOOT -extern int acpi_disabled, use_acpi_pci, acpi_force, acpi_ht; +extern int acpi_disabled, acpi_force, acpi_ht; static __init __attribute__((unused)) int acpi_disable(struct dmi_blacklist *d) { @@ -579,14 +511,18 @@ } return 0; } +#endif /* CONFIG_ACPI_BOOT */ +#ifdef CONFIG_ACPI_PCI static __init int disable_acpi_pci(struct dmi_blacklist *d) { - printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident); - use_acpi_pci = 0; + extern __init void pci_disable_acpi(void) ; + + printk(KERN_NOTICE "%s detected: force use of pci=noacpi\n", d->ident); + pci_disable_acpi(); return 0; } -#endif +#endif /* CONFIG_ACPI_PCI */ /* * Process the DMI blacklists @@ -861,87 +797,17 @@ NO_MATCH, NO_MATCH } }, - { apm_kills_local_apic, "Microstar 6163", { - MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), - MATCH(DMI_BOARD_NAME, "MS-6163"), - NO_MATCH, NO_MATCH } }, - - { apm_kills_local_apic_timer, "Intel AL440LX", { - MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), - MATCH(DMI_BOARD_NAME, "AL440LX"), - NO_MATCH, NO_MATCH } }, - - /* Problem Intel 440GX bioses */ - - { broken_pirq, "SABR1 Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"SABR1"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0066.P07"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "IBM xseries 370", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "IBM"), - MATCH(DMI_BIOS_VERSION,"MMKT33AUS"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0094.P10"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0115.P12"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0120.P12"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0125.P13"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"C440GX0.86B"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0.86B.0133.P14"), - NO_MATCH, NO_MATCH - } }, - { broken_pirq, "l44GX Bios", { /* Bad $PIR */ - MATCH(DMI_BIOS_VENDOR, "Intel Corporation"), - MATCH(DMI_BIOS_VERSION,"L440GX0"), - NO_MATCH, NO_MATCH - } }, - - /* Intel in disgiuse - In this case they can't hide and they don't run - too well either... */ - { broken_pirq, "Dell PowerEdge 8450", { /* Bad $PIR */ - MATCH(DMI_PRODUCT_NAME, "Dell PowerEdge 8450"), + { init_ints_after_s1, "Toshiba Satellite 4030cdt", { /* Reinitialization of 8259 is needed after S1 resume */ + MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"), NO_MATCH, NO_MATCH, NO_MATCH } }, - + { broken_acpi_Sx, "ASUS K7V-RM", { /* Bad ACPI Sx table */ MATCH(DMI_BIOS_VERSION,"ASUS K7V-RM ACPI BIOS Revision 1003A"), MATCH(DMI_BOARD_NAME, ""), NO_MATCH, NO_MATCH } }, - { init_ints_after_s1, "Toshiba Satellite 4030cdt", { /* Reinitialization of 8259 is needed after S1 resume */ - MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"), - NO_MATCH, NO_MATCH, NO_MATCH - } }, - { print_if_true, KERN_WARNING "IBM T23 - BIOS 1.03b+ and controller firmware 1.02+ may be needed for Linux APM.", { MATCH(DMI_SYS_VENDOR, "IBM"), MATCH(DMI_BIOS_VERSION, "1AET38WW (1.01b)"), @@ -1033,11 +899,6 @@ MATCH(DMI_BOARD_NAME, "CUR-DLS"), NO_MATCH, NO_MATCH }}, - { force_acpi_ht, "ASUS A7V", { - MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"), - MATCH(DMI_BOARD_NAME, ""), - MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1011"), NO_MATCH }}, - { force_acpi_ht, "ABIT i440BX-W83977", { MATCH(DMI_BOARD_VENDOR, "ABIT "), MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), @@ -1063,6 +924,8 @@ MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), NO_MATCH, NO_MATCH }}, +#endif /* CONFIG_ACPI_BOOT */ +#ifdef CONFIG_ACPI_PCI /* * Boxes that need ACPI PCI IRQ routing disabled */ @@ -1070,8 +933,10 @@ { disable_acpi_pci, "ASUS A7V", { MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"), MATCH(DMI_BOARD_NAME, ""), - MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), NO_MATCH }}, -#endif // CONFIG_ACPI_BOOT + /* newer BIOS, Revision 1011, does work */ + MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), + NO_MATCH }}, +#endif /* CONFIG_ACPI_PCI */ { NULL, } }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/edd.c linux-2.4.23-pre8/arch/i386/kernel/edd.c --- linux-2.4.22/arch/i386/kernel/edd.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/edd.c 2003-10-22 22:47:59.000000000 +0000 @@ -0,0 +1,672 @@ +/* + * linux/arch/i386/kernel/edd.c + * Copyright (C) 2002 Dell Computer Corporation + * by Matt Domsch + * + * BIOS Enhanced Disk Drive Services (EDD) + * conformant to T13 Committee www.t13.org + * projects 1572D, 1484D, 1386D, 1226DT + * + * This code takes information provided by BIOS EDD calls + * fn41 - Check Extensions Present and + * fn48 - Get Device Parametes with EDD extensions + * made in setup.S, copied to safe structures in setup.c, + * and presents it in /proc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License v2.0 as published by + * the Free Software Foundation + * + * 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. + * + */ + +/* + * TODO: + * - move edd.[ch] to better locations if/when one is decided + * - keep current with 2.5 EDD code changes + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Matt Domsch "); +MODULE_DESCRIPTION("proc interface to BIOS EDD information"); +MODULE_LICENSE("GPL"); + +#define EDD_VERSION "0.09 2003-Jan-21" +#define EDD_DEVICE_NAME_SIZE 16 +#define REPORT_URL "http://domsch.com/linux/edd30/results.html" + +#define left (count - (p - page) - 1) + +static struct proc_dir_entry *bios_dir; + +struct attr_entry { + struct proc_dir_entry *entry; + struct list_head node; +}; + +struct edd_device { + char name[EDD_DEVICE_NAME_SIZE]; + struct edd_info *info; + struct proc_dir_entry *dir; + struct list_head attr_list; +}; + +static struct edd_device *edd_devices[EDDMAXNR]; + +struct edd_attribute { + char *name; + int (*show)(char *page, char **start, off_t off, + int count, int *eof, void *data); + int (*test) (struct edd_device * edev); +}; + +#define EDD_DEVICE_ATTR(_name,_show,_test) \ +struct edd_attribute edd_attr_##_name = { \ + .name = __stringify(_name), \ + .show = _show, \ + .test = _test, \ +}; + +static inline struct edd_info * +edd_dev_get_info(struct edd_device *edev) +{ + return edev->info; +} + +static inline void +edd_dev_set_info(struct edd_device *edev, struct edd_info *info) +{ + edev->info = info; +} + +static int +proc_calc_metrics(char *page, char **start, off_t off, + int count, int *eof, int len) +{ + if (len <= off+count) *eof = 1; + *start = page + off; + len -= off; + if (len>count) len = count; + if (len<0) len = 0; + return len; +} + +static int +edd_dump_raw_data(char *b, int count, void *data, int length) +{ + char *orig_b = b; + char hexbuf[80], ascbuf[20], *h, *a, c; + unsigned char *p = data; + unsigned long column = 0; + int length_printed = 0, d; + const char maxcolumn = 16; + while (length_printed < length && count > 0) { + h = hexbuf; + a = ascbuf; + for (column = 0; + column < maxcolumn && length_printed < length; column++) { + h += sprintf(h, "%02x ", (unsigned char) *p); + if (!isprint(*p)) + c = '.'; + else + c = *p; + a += sprintf(a, "%c", c); + p++; + length_printed++; + } + /* pad out the line */ + for (; column < maxcolumn; column++) { + h += sprintf(h, " "); + a += sprintf(a, " "); + } + d = snprintf(b, count, "%s\t%s\n", hexbuf, ascbuf); + b += d; + count -= d; + } + return (b - orig_b); +} + +static int +edd_show_host_bus(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + int i; + + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + for (i = 0; i < 4; i++) { + if (isprint(info->params.host_bus_type[i])) { + p += snprintf(p, left, "%c", info->params.host_bus_type[i]); + } else { + p += snprintf(p, left, " "); + } + } + + if (!strncmp(info->params.host_bus_type, "ISA", 3)) { + p += snprintf(p, left, "\tbase_address: %x\n", + info->params.interface_path.isa.base_address); + } else if (!strncmp(info->params.host_bus_type, "PCIX", 4) || + !strncmp(info->params.host_bus_type, "PCI", 3)) { + p += snprintf(p, left, + "\t%02x:%02x.%d channel: %u\n", + info->params.interface_path.pci.bus, + info->params.interface_path.pci.slot, + info->params.interface_path.pci.function, + info->params.interface_path.pci.channel); + } else if (!strncmp(info->params.host_bus_type, "IBND", 4) || + !strncmp(info->params.host_bus_type, "XPRS", 4) || + !strncmp(info->params.host_bus_type, "HTPT", 4)) { + p += snprintf(p, left, + "\tTBD: %llx\n", + info->params.interface_path.ibnd.reserved); + + } else { + p += snprintf(p, left, "\tunknown: %llx\n", + info->params.interface_path.unknown.reserved); + } + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_show_interface(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + int i; + + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + for (i = 0; i < 8; i++) { + if (isprint(info->params.interface_type[i])) { + p += snprintf(p, left, "%c", info->params.interface_type[i]); + } else { + p += snprintf(p, left, " "); + } + } + if (!strncmp(info->params.interface_type, "ATAPI", 5)) { + p += snprintf(p, left, "\tdevice: %u lun: %u\n", + info->params.device_path.atapi.device, + info->params.device_path.atapi.lun); + } else if (!strncmp(info->params.interface_type, "ATA", 3)) { + p += snprintf(p, left, "\tdevice: %u\n", + info->params.device_path.ata.device); + } else if (!strncmp(info->params.interface_type, "SCSI", 4)) { + p += snprintf(p, left, "\tid: %u lun: %llu\n", + info->params.device_path.scsi.id, + info->params.device_path.scsi.lun); + } else if (!strncmp(info->params.interface_type, "USB", 3)) { + p += snprintf(p, left, "\tserial_number: %llx\n", + info->params.device_path.usb.serial_number); + } else if (!strncmp(info->params.interface_type, "1394", 4)) { + p += snprintf(p, left, "\teui: %llx\n", + info->params.device_path.i1394.eui); + } else if (!strncmp(info->params.interface_type, "FIBRE", 5)) { + p += snprintf(p, left, "\twwid: %llx lun: %llx\n", + info->params.device_path.fibre.wwid, + info->params.device_path.fibre.lun); + } else if (!strncmp(info->params.interface_type, "I2O", 3)) { + p += snprintf(p, left, "\tidentity_tag: %llx\n", + info->params.device_path.i2o.identity_tag); + } else if (!strncmp(info->params.interface_type, "RAID", 4)) { + p += snprintf(p, left, "\tidentity_tag: %x\n", + info->params.device_path.raid.array_number); + } else if (!strncmp(info->params.interface_type, "SATA", 4)) { + p += snprintf(p, left, "\tdevice: %u\n", + info->params.device_path.sata.device); + } else { + p += snprintf(p, left, "\tunknown: %llx %llx\n", + info->params.device_path.unknown.reserved1, + info->params.device_path.unknown.reserved2); + } + + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +/** + * edd_show_raw_data() - unparses EDD information, returned to user-space + * + * Returns: number of bytes written, or 0 on failure + */ +static int +edd_show_raw_data(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + int i, warn_padding = 0, nonzero_path = 0, + len = sizeof (*info) - 4; + uint8_t checksum = 0, c = 0; + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + if (!(info->params.key == 0xBEDD || info->params.key == 0xDDBE)) + len = info->params.length; + + p += snprintf(p, left, "int13 fn48 returned data:\n\n"); + p += edd_dump_raw_data(p, left, ((char *) info) + 4, len); + + /* Spec violation. Adaptec AIC7899 returns 0xDDBE + here, when it should be 0xBEDD. + */ + p += snprintf(p, left, "\n"); + if (info->params.key == 0xDDBE) { + p += snprintf(p, left, + "Warning: Spec violation. Key should be 0xBEDD, is 0xDDBE\n"); + } + + if (!(info->params.key == 0xBEDD || info->params.key == 0xDDBE)) { + goto out; + } + + for (i = 30; i <= 73; i++) { + c = *(((uint8_t *) info) + i + 4); + if (c) + nonzero_path++; + checksum += c; + } + + if (checksum) { + p += snprintf(p, left, + "Warning: Spec violation. Device Path checksum invalid.\n"); + } + + if (!nonzero_path) { + p += snprintf(p, left, "Error: Spec violation. Empty device path.\n"); + goto out; + } + + for (i = 0; i < 4; i++) { + if (!isprint(info->params.host_bus_type[i])) { + warn_padding++; + } + } + for (i = 0; i < 8; i++) { + if (!isprint(info->params.interface_type[i])) { + warn_padding++; + } + } + + if (warn_padding) { + p += snprintf(p, left, + "Warning: Spec violation. Padding should be 0x20.\n"); + } + +out: + p += snprintf(p, left, "\nPlease check %s\n", REPORT_URL); + p += snprintf(p, left, "to see if this device has been reported. If not,\n"); + p += snprintf(p, left, "please send the information requested there.\n"); + + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_show_version(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + p += snprintf(p, left, "0x%02x\n", info->version); + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_show_extensions(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + if (info->interface_support & EDD_EXT_FIXED_DISK_ACCESS) { + p += snprintf(p, left, "Fixed disk access\n"); + } + if (info->interface_support & EDD_EXT_DEVICE_LOCKING_AND_EJECTING) { + p += snprintf(p, left, "Device locking and ejecting\n"); + } + if (info->interface_support & EDD_EXT_ENHANCED_DISK_DRIVE_SUPPORT) { + p += snprintf(p, left, "Enhanced Disk Drive support\n"); + } + if (info->interface_support & EDD_EXT_64BIT_EXTENSIONS) { + p += snprintf(p, left, "64-bit extensions\n"); + } + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_show_info_flags(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + if (info->params.info_flags & EDD_INFO_DMA_BOUNDRY_ERROR_TRANSPARENT) + p += snprintf(p, left, "DMA boundry error transparent\n"); + if (info->params.info_flags & EDD_INFO_GEOMETRY_VALID) + p += snprintf(p, left, "geometry valid\n"); + if (info->params.info_flags & EDD_INFO_REMOVABLE) + p += snprintf(p, left, "removable\n"); + if (info->params.info_flags & EDD_INFO_WRITE_VERIFY) + p += snprintf(p, left, "write verify\n"); + if (info->params.info_flags & EDD_INFO_MEDIA_CHANGE_NOTIFICATION) + p += snprintf(p, left, "media change notification\n"); + if (info->params.info_flags & EDD_INFO_LOCKABLE) + p += snprintf(p, left, "lockable\n"); + if (info->params.info_flags & EDD_INFO_NO_MEDIA_PRESENT) + p += snprintf(p, left, "no media present\n"); + if (info->params.info_flags & EDD_INFO_USE_INT13_FN50) + p += snprintf(p, left, "use int13 fn50\n"); + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_show_default_cylinders(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + p += snprintf(p, left, "0x%x\n", info->params.num_default_cylinders); + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_show_default_heads(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + p += snprintf(p, left, "0x%x\n", info->params.num_default_heads); + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_show_default_sectors_per_track(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + p += snprintf(p, left, "0x%x\n", info->params.sectors_per_track); + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_show_sectors(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct edd_info *info = data; + char *p = page; + if (!info || !page || off) { + return proc_calc_metrics(page, start, off, count, eof, 0); + } + + p += snprintf(p, left, "0x%llx\n", info->params.number_of_sectors); + return proc_calc_metrics(page, start, off, count, eof, (p - page)); +} + +static int +edd_has_default_cylinders(struct edd_device *edev) +{ + struct edd_info *info = edd_dev_get_info(edev); + if (!edev || !info) + return 0; + return info->params.num_default_cylinders > 0; +} + +static int +edd_has_default_heads(struct edd_device *edev) +{ + struct edd_info *info = edd_dev_get_info(edev); + if (!edev || !info) + return 0; + return info->params.num_default_heads > 0; +} + +static int +edd_has_default_sectors_per_track(struct edd_device *edev) +{ + struct edd_info *info = edd_dev_get_info(edev); + if (!edev || !info) + return 0; + return info->params.sectors_per_track > 0; +} + +static int +edd_has_edd30(struct edd_device *edev) +{ + struct edd_info *info = edd_dev_get_info(edev); + int i, nonzero_path = 0; + char c; + + if (!edev || !info) + return 0; + + if (!(info->params.key == 0xBEDD || info->params.key == 0xDDBE)) { + return 0; + } + + for (i = 30; i <= 73; i++) { + c = *(((uint8_t *) info) + i + 4); + if (c) { + nonzero_path++; + break; + } + } + if (!nonzero_path) { + return 0; + } + + return 1; +} + +static EDD_DEVICE_ATTR(raw_data, edd_show_raw_data, NULL); +static EDD_DEVICE_ATTR(version, edd_show_version, NULL); +static EDD_DEVICE_ATTR(extensions, edd_show_extensions, NULL); +static EDD_DEVICE_ATTR(info_flags, edd_show_info_flags, NULL); +static EDD_DEVICE_ATTR(sectors, edd_show_sectors, NULL); +static EDD_DEVICE_ATTR(default_cylinders, edd_show_default_cylinders, + edd_has_default_cylinders); +static EDD_DEVICE_ATTR(default_heads, edd_show_default_heads, + edd_has_default_heads); +static EDD_DEVICE_ATTR(default_sectors_per_track, + edd_show_default_sectors_per_track, + edd_has_default_sectors_per_track); +static EDD_DEVICE_ATTR(interface, edd_show_interface,edd_has_edd30); +static EDD_DEVICE_ATTR(host_bus, edd_show_host_bus, edd_has_edd30); + +static struct edd_attribute *def_attrs[] = { + &edd_attr_raw_data, + &edd_attr_version, + &edd_attr_extensions, + &edd_attr_info_flags, + &edd_attr_sectors, + &edd_attr_default_cylinders, + &edd_attr_default_heads, + &edd_attr_default_sectors_per_track, + &edd_attr_interface, + &edd_attr_host_bus, + NULL, +}; + +static inline void +edd_device_unregister(struct edd_device *edev) +{ + struct list_head *pos, *next; + struct attr_entry *ae; + + list_for_each_safe(pos, next, &edev->attr_list) { + ae = list_entry(pos, struct attr_entry, node); + remove_proc_entry(ae->entry->name, edev->dir); + list_del(&ae->node); + kfree(ae); + } + + remove_proc_entry(edev->dir->name, bios_dir); +} + +static int +edd_populate_dir(struct edd_device *edev) +{ + struct edd_attribute *attr; + struct attr_entry *ae; + int i; + int error = 0; + + for (i = 0; (attr=def_attrs[i]); i++) { + if (!attr->test || (attr->test && attr->test(edev))) { + ae = kmalloc(sizeof (*ae), GFP_KERNEL); + if (ae == NULL) { + error = 1; + break; + } + INIT_LIST_HEAD(&ae->node); + ae->entry = + create_proc_read_entry(attr->name, 0444, + edev->dir, attr->show, + edd_dev_get_info(edev)); + if (ae->entry == NULL) { + error = 1; + break; + } + list_add(&ae->node, &edev->attr_list); + } + } + + if (error) + return error; + + return 0; +} + +static int +edd_make_dir(struct edd_device *edev) +{ + int error=1; + + edev->dir = proc_mkdir(edev->name, bios_dir); + if (edev->dir != NULL) { + edev->dir->mode = (S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO); + error = edd_populate_dir(edev); + } + return error; +} + +static int +edd_device_register(struct edd_device *edev, int i) +{ + int error; + + if (!edev) + return 1; + memset(edev, 0, sizeof (*edev)); + INIT_LIST_HEAD(&edev->attr_list); + edd_dev_set_info(edev, &edd[i]); + snprintf(edev->name, EDD_DEVICE_NAME_SIZE, "int13_dev%02x", + edd[i].device); + error = edd_make_dir(edev); + return error; +} + +/** + * edd_init() - creates /proc/bios tree of EDD data + * + * This assumes that eddnr and edd were + * assigned in setup.c already. + */ +static int __init +edd_init(void) +{ + unsigned int i; + int rc = 0; + struct edd_device *edev; + + printk(KERN_INFO "BIOS EDD facility v%s, %d devices found\n", + EDD_VERSION, eddnr); + + if (!eddnr) { + printk(KERN_INFO "EDD information not available.\n"); + return 1; + } + + bios_dir = proc_mkdir("bios", NULL); + if (bios_dir == NULL) + return 1; + + for (i = 0; i < eddnr && i < EDDMAXNR && !rc; i++) { + edev = kmalloc(sizeof (*edev), GFP_KERNEL); + if (!edev) { + rc = 1; + break; + } + + rc = edd_device_register(edev, i); + if (rc) { + break; + } + edd_devices[i] = edev; + } + + if (rc) { + for (i = 0; i < eddnr && i < EDDMAXNR; i++) { + if ((edev = edd_devices[i])) { + edd_device_unregister(edev); + kfree(edev); + } + } + + remove_proc_entry(bios_dir->name, NULL); + } + + return rc; +} + +static void __exit +edd_exit(void) +{ + int i; + struct edd_device *edev; + + for (i = 0; i < eddnr && i < EDDMAXNR; i++) { + if ((edev = edd_devices[i])) { + edd_device_unregister(edev); + kfree(edev); + } + } + + remove_proc_entry(bios_dir->name, NULL); +} + +module_init(edd_init); +module_exit(edd_exit); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/head.S linux-2.4.23-pre8/arch/i386/kernel/head.S --- linux-2.4.22/arch/i386/kernel/head.S 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/head.S 2003-10-22 22:47:41.000000000 +0000 @@ -34,7 +34,7 @@ #define X86_HARD_MATH CPU_PARAMS+6 #define X86_CPUID CPU_PARAMS+8 #define X86_CAPABILITY CPU_PARAMS+12 -#define X86_VENDOR_ID CPU_PARAMS+28 +#define X86_VENDOR_ID CPU_PARAMS+36 /* tied to NCAPINTS in cpufeature.h */ /* * swapper_pg_dir is the main page directory, address 0x00101000 @@ -113,7 +113,7 @@ popfl jmp checkCPUtype 1: -#endif CONFIG_SMP +#endif /* CONFIG_SMP */ /* * Clear BSS first so that there are no surprises... diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/i386_ksyms.c linux-2.4.23-pre8/arch/i386/kernel/i386_ksyms.c --- linux-2.4.22/arch/i386/kernel/i386_ksyms.c 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/i386_ksyms.c 2003-10-22 22:48:54.000000000 +0000 @@ -28,6 +28,7 @@ #include #include #include +#include extern void dump_thread(struct pt_regs *, struct user *); extern spinlock_t rtc_lock; @@ -180,3 +181,8 @@ #ifdef CONFIG_MULTIQUAD EXPORT_SYMBOL(xquad_portio); #endif + +#ifdef CONFIG_EDD_MODULE +EXPORT_SYMBOL(edd); +EXPORT_SYMBOL(eddnr); +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/io_apic.c linux-2.4.23-pre8/arch/i386/kernel/io_apic.c --- linux-2.4.22/arch/i386/kernel/io_apic.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/io_apic.c 2003-10-22 22:48:26.000000000 +0000 @@ -169,6 +169,14 @@ { struct IO_APIC_route_entry entry; unsigned long flags; + + /* Check delivery_mode to be sure we're not clearing an SMI pin */ + spin_lock_irqsave(&ioapic_lock, flags); + *(((int*)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin); + *(((int*)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin); + spin_unlock_irqrestore(&ioapic_lock, flags); + if (entry.delivery_mode == dest_SMI) + return; /* * Disable it in the IO-APIC irq-routing table: @@ -1365,6 +1373,13 @@ static void set_ioapic_affinity (unsigned int irq, unsigned long mask) { unsigned long flags; + + /* pick a single cpu for clustered xapics */ + if(clustered_apic_mode == CLUSTERED_APIC_XAPIC){ + int cpu = ffs(mask)-1; + mask = cpu_to_physical_apicid(cpu); + } + /* * Only the first 8 bits are valid. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/irq.c linux-2.4.23-pre8/arch/i386/kernel/irq.c --- linux-2.4.22/arch/i386/kernel/irq.c 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/irq.c 2003-10-22 22:47:39.000000000 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -131,55 +132,55 @@ * Generic, controller-independent functions: */ -int get_irq_list(char *buf) +int show_interrupts(struct seq_file *p, void *v) { int i, j; struct irqaction * action; - char *p = buf; - p += sprintf(p, " "); + seq_printf(p, " "); for (j=0; jtypename); - p += sprintf(p, " %s", action->name); + seq_printf(p, " %14s", irq_desc[i].handler->typename); + seq_printf(p, " %s", action->name); for (action=action->next; action; action = action->next) - p += sprintf(p, ", %s", action->name); - *p++ = '\n'; + seq_printf(p, ", %s", action->name); + seq_putc(p,'\n'); } - p += sprintf(p, "NMI: "); + seq_printf(p, "NMI: "); for (j = 0; j < smp_num_cpus; j++) - p += sprintf(p, "%10u ", + seq_printf(p, "%10u ", nmi_count(cpu_logical_map(j))); - p += sprintf(p, "\n"); + seq_printf(p, "\n"); #if CONFIG_X86_LOCAL_APIC - p += sprintf(p, "LOC: "); + seq_printf(p, "LOC: "); for (j = 0; j < smp_num_cpus; j++) - p += sprintf(p, "%10u ", + seq_printf(p, "%10u ", apic_timer_irqs[cpu_logical_map(j)]); - p += sprintf(p, "\n"); + seq_printf(p, "\n"); #endif - p += sprintf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); + seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); #ifdef CONFIG_X86_IO_APIC #ifdef APIC_MISMATCH_DEBUG - p += sprintf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); + seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); #endif #endif - return p - buf; + + return 0; } @@ -1035,7 +1036,7 @@ if (!shared) { desc->depth = 0; - desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING); + desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS); desc->handler->startup(irq); } spin_unlock_irqrestore(&desc->lock,flags); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/mpparse.c linux-2.4.23-pre8/arch/i386/kernel/mpparse.c --- linux-2.4.22/arch/i386/kernel/mpparse.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/mpparse.c 2003-10-22 22:48:24.000000000 +0000 @@ -229,6 +229,11 @@ boot_cpu_logical_apicid = logical_apicid; } + if (num_processors >= NR_CPUS){ + printk(KERN_WARNING "NR_CPUS limit of %i reached. Cannot " + "boot CPU(apicid 0x%x).\n", NR_CPUS, m->mpc_apicid); + return; + } num_processors++; if (m->mpc_apicid > MAX_APICS) { @@ -683,6 +688,24 @@ struct mpc_config_lintsrc lintsrc; int linttypes[2] = { mp_ExtINT, mp_NMI }; int i; + struct { + int mp_bus_id_to_type[MAX_MP_BUSSES]; + int mp_bus_id_to_node[MAX_MP_BUSSES]; + int mp_bus_id_to_local[MAX_MP_BUSSES]; + int mp_bus_id_to_pci_bus[MAX_MP_BUSSES]; + struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; + } *bus_data; + + bus_data = alloc_bootmem(sizeof(*bus_data)); + if (!bus_data) + panic("SMP mptable: out of memory!\n"); + mp_bus_id_to_type = bus_data->mp_bus_id_to_type; + mp_bus_id_to_node = bus_data->mp_bus_id_to_node; + mp_bus_id_to_local = bus_data->mp_bus_id_to_local; + mp_bus_id_to_pci_bus = bus_data->mp_bus_id_to_pci_bus; + mp_irqs = bus_data->mp_irqs; + for (i = 0; i < MAX_MP_BUSSES; ++i) + mp_bus_id_to_pci_bus[i] = -1; /* * local APIC has default address @@ -977,7 +1000,14 @@ processor.mpc_type = MP_PROCESSOR; processor.mpc_apicid = id; - processor.mpc_apicver = 0x10; /* TBD: lapic version */ + + /* + * mp_register_lapic_address() which is called before the + * current function does the fixmap of FIX_APIC_BASE. + * Read in the correct APIC version from there + */ + processor.mpc_apicver = apic_read(APIC_LVR); + processor.mpc_cpuflag = (enabled ? CPU_ENABLED : 0); processor.mpc_cpuflag |= (boot_cpu ? CPU_BOOTPROCESSOR : 0); processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) | @@ -1014,7 +1044,7 @@ return i; } - printk(KERN_ERR "ERROR: Unable to locate IOAPIC for IRQ %d/n", irq); + printk(KERN_ERR "ERROR: Unable to locate IOAPIC for IRQ %d\n", irq); return -1; } @@ -1199,8 +1229,6 @@ } } -/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */ - extern FADT_DESCRIPTOR acpi_fadt; void __init mp_config_ioapic_for_sci(int irq) @@ -1209,6 +1237,7 @@ int ioapic_pin; struct acpi_table_madt* madt; struct acpi_table_int_src_ovr *entry = NULL; + acpi_interrupt_flags flags; void *madt_end; acpi_status status; @@ -1227,30 +1256,36 @@ while ((void *) entry < madt_end) { if (entry->header.type == ACPI_MADT_INT_SRC_OVR && - acpi_fadt.sci_int == entry->bus_irq) { - /* - * See the note at the end of ACPI 2.0b section - * 5.2.10.8 for what this is about. - */ - if (entry->bus_irq != entry->global_irq) { - acpi_fadt.sci_int = entry->global_irq; - irq = entry->global_irq; - break; - } - else - return; - } - + acpi_fadt.sci_int == entry->bus_irq) + goto found; + entry = (struct acpi_table_int_src_ovr *) ((unsigned long) entry + entry->header.length); } } + /* + * Although the ACPI spec says that the SCI should be level/low + * don't reprogram it unless there is an explicit MADT OVR entry + * instructing us to do so -- otherwise we break Tyan boards which + * have the SCI wired edge/high but no MADT OVR. + */ + return; +found: + /* + * See the note at the end of ACPI 2.0b section + * 5.2.10.8 for what this is about. + */ + flags = entry->flags; + acpi_fadt.sci_int = entry->global_irq; + irq = entry->global_irq; + ioapic = mp_find_ioapic(irq); ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start; - io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 1, 1); // Active low, level triggered + io_apic_set_pci_routing(ioapic, ioapic_pin, irq, + (flags.trigger >> 1) , (flags.polarity >> 1)); } @@ -1288,8 +1323,10 @@ } /* Don't set up the ACPI SCI because it's already set up */ - if (acpi_fadt.sci_int == irq) + if (acpi_fadt.sci_int == irq) { + entry->irq = irq; /*we still need to set entry's irq*/ continue; + } ioapic = mp_find_ioapic(irq); if (ioapic < 0) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/pci-i386.c linux-2.4.23-pre8/arch/i386/kernel/pci-i386.c --- linux-2.4.22/arch/i386/kernel/pci-i386.c 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/pci-i386.c 2003-10-22 22:48:14.000000000 +0000 @@ -295,6 +295,17 @@ } } +void __init pcibios_set_cacheline_size(void) +{ + struct cpuinfo_x86 *c = &boot_cpu_data; + + pci_cache_line_size = 32 >> 2; + if (c->x86 >= 6 && c->x86_vendor == X86_VENDOR_AMD) + pci_cache_line_size = 64 >> 2; /* K7 & K8 */ + else if (c->x86 > 6 && c->x86_vendor == X86_VENDOR_INTEL) + pci_cache_line_size = 128 >> 2; /* P4 */ +} + void __init pcibios_resource_survey(void) { DBG("PCI: Allocating resources\n"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/pci-i386.h linux-2.4.23-pre8/arch/i386/kernel/pci-i386.h --- linux-2.4.22/arch/i386/kernel/pci-i386.h 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/pci-i386.h 2003-10-22 22:49:02.000000000 +0000 @@ -27,8 +27,10 @@ /* pci-i386.c */ extern unsigned int pcibios_max_latency; +extern u8 pci_cache_line_size; void pcibios_resource_survey(void); +void pcibios_set_cacheline_size(void); int pcibios_enable_resources(struct pci_dev *, int); /* pci-pc.c */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/pci-irq.c linux-2.4.23-pre8/arch/i386/kernel/pci-irq.c --- linux-2.4.22/arch/i386/kernel/pci-irq.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/pci-irq.c 2003-10-22 22:49:52.000000000 +0000 @@ -23,7 +23,6 @@ #define PIRQ_VERSION 0x0100 int broken_hp_bios_irq9; -int broken_440gx_bios; static struct irq_routing_table *pirq_table; @@ -46,6 +45,11 @@ int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, int new); }; +struct irq_router_handler { + u16 vendor; + int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device); +}; + /* * Search 0xf0000 -- 0xfffff for the PCI IRQ Routing Table. */ @@ -257,111 +261,221 @@ } /* - * PIRQ routing for SiS 85C503 router used in several SiS chipsets - * According to the SiS 5595 datasheet (preliminary V1.0, 12/24/1997) - * the related registers work as follows: - * - * general: one byte per re-routable IRQ, + * PIRQ routing for SiS 85C503 router used in several SiS chipsets. + * We have to deal with the following issues here: + * - vendors have different ideas about the meaning of link values + * - some onboard devices (integrated in the chipset) have special + * links and are thus routed differently (i.e. not via PCI INTA-INTD) + * - different revision of the router have a different layout for + * the routing registers, particularly for the onchip devices + * + * For all routing registers the common thing is we have one byte + * per routeable link which is defined as: * bit 7 IRQ mapping enabled (0) or disabled (1) - * bits [6:4] reserved + * bits [6:4] reserved (sometimes used for onchip devices) * bits [3:0] IRQ to map to * allowed: 3-7, 9-12, 14-15 * reserved: 0, 1, 2, 8, 13 * - * individual registers in device config space: + * The config-space registers located at 0x41/0x42/0x43/0x44 are + * always used to route the normal PCI INT A/B/C/D respectively. + * Apparently there are systems implementing PCI routing table using + * link values 0x01-0x04 and others using 0x41-0x44 for PCI INTA..D. + * We try our best to handle both link mappings. + * + * Currently (2003-05-21) it appears most SiS chipsets follow the + * definition of routing registers from the SiS-5595 southbridge. + * According to the SiS 5595 datasheets the revision id's of the + * router (ISA-bridge) should be 0x01 or 0xb0. * - * 0x41/0x42/0x43/0x44: PCI INT A/B/C/D - bits as in general case + * Furthermore we've also seen lspci dumps with revision 0x00 and 0xb1. + * Looks like these are used in a number of SiS 5xx/6xx/7xx chipsets. + * They seem to work with the current routing code. However there is + * some concern because of the two USB-OHCI HCs (original SiS 5595 + * had only one). YMMV. * - * 0x61: IDEIRQ: bits as in general case - but: - * bits [6:5] must be written 01 - * bit 4 channel-select primary (0), secondary (1) + * Onchip routing for router rev-id 0x01/0xb0 and probably 0x00/0xb1: * - * 0x62: USBIRQ: bits as in general case - but: - * bit 4 OHCI function disabled (0), enabled (1) + * 0x61: IDEIRQ: + * bits [6:5] must be written 01 + * bit 4 channel-select primary (0), secondary (1) + * + * 0x62: USBIRQ: + * bit 6 OHCI function disabled (0), enabled (1) * - * 0x6a: ACPI/SCI IRQ - bits as in general case + * 0x6a: ACPI/SCI IRQ: bits 4-6 reserved + * + * 0x7e: Data Acq. Module IRQ - bits 4-6 reserved + * + * We support USBIRQ (in addition to INTA-INTD) and keep the + * IDE, ACPI and DAQ routing untouched as set by the BIOS. + * + * Currently the only reported exception is the new SiS 65x chipset + * which includes the SiS 69x southbridge. Here we have the 85C503 + * router revision 0x04 and there are changes in the register layout + * mostly related to the different USB HCs with USB 2.0 support. * - * 0x7e: Data Acq. Module IRQ - bits as in general case + * Onchip routing for router rev-id 0x04 (try-and-error observation) * - * Apparently there are systems implementing PCI routing table using both - * link values 0x01-0x04 and 0x41-0x44 for PCI INTA..D, but register offsets - * like 0x62 as link values for USBIRQ e.g. So there is no simple - * "register = offset + pirq" relation. - * Currently we support PCI INTA..D and USBIRQ and try our best to handle - * both link mappings. - * IDE/ACPI/DAQ mapping is currently unsupported (left untouched as set by BIOS). + * 0x60/0x61/0x62/0x63: 1xEHCI and 3xOHCI (companion) USB-HCs + * bit 6-4 are probably unused, not like 5595 */ -static int pirq_sis_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +#define PIRQ_SIS_IRQ_MASK 0x0f +#define PIRQ_SIS_IRQ_DISABLE 0x80 +#define PIRQ_SIS_USB_ENABLE 0x40 +#define PIRQ_SIS_DETECT_REGISTER 0x40 + +/* return value: + * -1 on error + * 0 for PCI INTA-INTD + * 0 or enable bit mask to check or set for onchip functions + */ +static inline int pirq_sis5595_onchip(int pirq, int *reg) { - u8 x; - int reg = pirq; + int ret = -1; + *reg = pirq; switch(pirq) { - case 0x01: - case 0x02: - case 0x03: - case 0x04: - reg += 0x40; - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x62: - pci_read_config_byte(router, reg, &x); - if (reg != 0x62) - break; - if (!(x & 0x40)) - return 0; - break; - case 0x61: - case 0x6a: - case 0x7e: - printk(KERN_INFO "SiS pirq: advanced IDE/ACPI/DAQ mapping not yet implemented\n"); - return 0; - default: - printk(KERN_INFO "SiS router pirq escape (%d)\n", pirq); - return 0; + case 0x01: + case 0x02: + case 0x03: + case 0x04: + *reg += 0x40; + case 0x41: + case 0x42: + case 0x43: + case 0x44: + ret = 0; + break; + + case 0x62: + ret = PIRQ_SIS_USB_ENABLE; /* documented for 5595 */ + break; + + case 0x61: + case 0x6a: + case 0x7e: + printk(KERN_INFO "SiS pirq: IDE/ACPI/DAQ mapping not implemented: (%u)\n", + (unsigned) pirq); + /* fall thru */ + default: + printk(KERN_INFO "SiS router unknown request: (%u)\n", + (unsigned) pirq); + break; + } + return ret; +} + +/* return value: + * -1 on error + * 0 for PCI INTA-INTD + * 0 or enable bit mask to check or set for onchip functions + */ +static inline int pirq_sis96x_onchip(int pirq, int *reg) +{ + int ret = -1; + + *reg = pirq; + switch(pirq) { + case 0x01: + case 0x02: + case 0x03: + case 0x04: + *reg += 0x40; + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x60: + case 0x61: + case 0x62: + case 0x63: + ret = 0; + break; + + default: + printk(KERN_INFO "SiS router unknown request: (%u)\n", + (unsigned) pirq); + break; } - return (x & 0x80) ? 0 : (x & 0x0f); + return ret; +} + + +static int pirq_sis5595_get(struct pci_dev *router, struct pci_dev *dev, int pirq) +{ + u8 x; + int reg, check; + + check = pirq_sis5595_onchip(pirq, ®); + if (check < 0) + return 0; + + pci_read_config_byte(router, reg, &x); + if (check != 0 && !(x & check)) + return 0; + + return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK); } -static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +static int pirq_sis96x_get(struct pci_dev *router, struct pci_dev *dev, int pirq) { u8 x; - int reg = pirq; + int reg, check; + + check = pirq_sis96x_onchip(pirq, ®); + if (check < 0) + return 0; + + pci_read_config_byte(router, reg, &x); + if (check != 0 && !(x & check)) + return 0; + + return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK); +} + +static int pirq_sis5595_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + u8 x; + int reg, set; + + set = pirq_sis5595_onchip(pirq, ®); + if (set < 0) + return 0; + + x = (irq & PIRQ_SIS_IRQ_MASK); + if (x == 0) + x = PIRQ_SIS_IRQ_DISABLE; + else + x |= set; - switch(pirq) { - case 0x01: - case 0x02: - case 0x03: - case 0x04: - reg += 0x40; - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x62: - x = (irq&0x0f) ? (irq&0x0f) : 0x80; - if (reg != 0x62) - break; - /* always mark OHCI enabled, as nothing else knows about this */ - x |= 0x40; - break; - case 0x61: - case 0x6a: - case 0x7e: - printk(KERN_INFO "advanced SiS pirq mapping not yet implemented\n"); - return 0; - default: - printk(KERN_INFO "SiS router pirq escape (%d)\n", pirq); - return 0; - } pci_write_config_byte(router, reg, x); return 1; } +static int pirq_sis96x_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) +{ + u8 x; + int reg, set; + + set = pirq_sis96x_onchip(pirq, ®); + if (set < 0) + return 0; + + x = (irq & PIRQ_SIS_IRQ_MASK); + if (x == 0) + x = PIRQ_SIS_IRQ_DISABLE; + else + x |= set; + + pci_write_config_byte(router, reg, x); + + return 1; +} + + /* * VLSI: nibble offset 0x74 - educated guess due to routing table and * config space of VLSI 82C534 PCI-bridge/router (1004:0102) @@ -454,96 +568,263 @@ return pcibios_set_irq_routing(bridge, pin, irq); } -static struct irq_router pirq_bios_router = - { "BIOS", 0, 0, NULL, pirq_bios_set }; - #endif -static struct irq_router pirq_routers[] = { - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371MX, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_10, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, pirq_piix_get, pirq_piix_set }, - { "PIIX", PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_0, pirq_piix_get, pirq_piix_set }, - - { "ALI", PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, pirq_ali_get, pirq_ali_set }, - - { "ITE", PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_IT8330G_0, pirq_ite_get, pirq_ite_set }, - - { "VIA", PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, pirq_via_get, pirq_via_set }, - { "VIA", PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596, pirq_via_get, pirq_via_set }, - { "VIA", PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, pirq_via_get, pirq_via_set }, - - { "OPTI", PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C700, pirq_opti_get, pirq_opti_set }, - - { "NatSemi", PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520, pirq_cyrix_get, pirq_cyrix_set }, - { "SIS", PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503, pirq_sis_get, pirq_sis_set }, - { "VLSI 82C534", PCI_VENDOR_ID_VLSI, PCI_DEVICE_ID_VLSI_82C534, pirq_vlsi_get, pirq_vlsi_set }, - { "ServerWorks", PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4, - pirq_serverworks_get, pirq_serverworks_set }, - { "ServerWorks", PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5, - pirq_serverworks_get, pirq_serverworks_set }, - { "AMD756 VIPER", PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_740B, - pirq_amd756_get, pirq_amd756_set }, - { "AMD766", PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7413, - pirq_amd756_get, pirq_amd756_set }, - { "AMD768", PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7443, - pirq_amd756_get, pirq_amd756_set }, - { "default", 0, 0, NULL, NULL } -}; +static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + /* We must not touch 440GX even if we have tables. 440GX has + different IRQ routing weirdness */ + if(pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82450GX, NULL)) + return 0; + switch(device) + { + case PCI_DEVICE_ID_INTEL_82371FB_0: + case PCI_DEVICE_ID_INTEL_82371SB_0: + case PCI_DEVICE_ID_INTEL_82371AB_0: + case PCI_DEVICE_ID_INTEL_82371MX: + case PCI_DEVICE_ID_INTEL_82443MX_0: + case PCI_DEVICE_ID_INTEL_82801AA_0: + case PCI_DEVICE_ID_INTEL_82801AB_0: + case PCI_DEVICE_ID_INTEL_82801BA_0: + case PCI_DEVICE_ID_INTEL_82801BA_10: + case PCI_DEVICE_ID_INTEL_82801CA_0: + case PCI_DEVICE_ID_INTEL_82801CA_12: + case PCI_DEVICE_ID_INTEL_82801DB_0: + case PCI_DEVICE_ID_INTEL_82801E_0: + case PCI_DEVICE_ID_INTEL_82801EB_0: + case PCI_DEVICE_ID_INTEL_ESB_0: + r->name = "PIIX/ICH"; + r->get = pirq_piix_get; + r->set = pirq_piix_set; + return 1; + } + return 0; +} -static struct irq_router *pirq_router; +static __init int via_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + /* FIXME: We should move some of the quirk fixup stuff here */ + switch(device) + { + case PCI_DEVICE_ID_VIA_82C586_0: + case PCI_DEVICE_ID_VIA_82C596: + case PCI_DEVICE_ID_VIA_82C686: + case PCI_DEVICE_ID_VIA_8231: + /* FIXME: add new ones for 8233/5 */ + r->name = "VIA"; + r->get = pirq_via_get; + r->set = pirq_via_set; + return 1; + } + return 0; +} + +static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_VLSI_82C534: + r->name = "VLSI 82C534"; + r->get = pirq_vlsi_get; + r->set = pirq_vlsi_set; + return 1; + } + return 0; +} + + +static __init int serverworks_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_SERVERWORKS_OSB4: + case PCI_DEVICE_ID_SERVERWORKS_CSB5: + r->name = "ServerWorks"; + r->get = pirq_serverworks_get; + r->set = pirq_serverworks_set; + return 1; + } + return 0; +} + +static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + u8 reg; + u16 devid; + + if (device != PCI_DEVICE_ID_SI_503) + return 0; + + /* + * In case of SiS south bridge, we need to detect the two + * kinds of routing tables we have seen so far (5595 and 96x). + * Since the maintain the same device ID, we need to do poke + * the PCI configuration space to find the router type we are + * dealing with. + */ + + /* + * Factoid: writing bit6 of register 0x40 of the router config space + * will make the SB to show up 0x096x inside the device id. Note, + * we need to restore register 0x40 after the device id poke. + */ + + pci_read_config_byte(router, PIRQ_SIS_DETECT_REGISTER, ®); + pci_write_config_byte(router, PIRQ_SIS_DETECT_REGISTER, reg | (1 << 6)); + pci_read_config_word(router, PCI_DEVICE_ID, &devid); + pci_write_config_byte(router, PIRQ_SIS_DETECT_REGISTER, reg); + + if ((devid & 0xfff0) == 0x0960) { + r->name = "SIS96x"; + r->get = pirq_sis96x_get; + r->set = pirq_sis96x_set; + DBG("PCI: Detecting SiS router at %02x:%02x : SiS096x detected\n", + rt->rtr_bus, rt->rtr_devfn); + } else { + r->name = "SIS5595"; + r->get = pirq_sis5595_get; + r->set = pirq_sis5595_set; + DBG("PCI: Detecting SiS router at %02x:%02x : SiS5595 detected\n", + rt->rtr_bus, rt->rtr_devfn); + } + return 1; +} + +static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_CYRIX_5520: + r->name = "NatSemi"; + r->get = pirq_cyrix_get; + r->set = pirq_cyrix_set; + return 1; + } + return 0; +} + +static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_OPTI_82C700: + r->name = "OPTI"; + r->get = pirq_opti_get; + r->set = pirq_opti_set; + return 1; + } + return 0; +} + +static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_ITE_IT8330G_0: + r->name = "ITE"; + r->get = pirq_ite_get; + r->set = pirq_ite_set; + return 1; + } + return 0; +} + +static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_AL_M1533: + r->name = "ALI"; + r->get = pirq_ali_get; + r->set = pirq_ali_set; + return 1; + /* Should add 156x some day */ + } + return 0; +} + +static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device) +{ + switch(device) + { + case PCI_DEVICE_ID_AMD_VIPER_740B: + r->name = "AMD756"; + break; + case PCI_DEVICE_ID_AMD_VIPER_7413: + r->name = "AMD766"; + break; + case PCI_DEVICE_ID_AMD_VIPER_7443: + r->name = "AMD768"; + break; + default: + return 0; + } + r->get = pirq_amd756_get; + r->set = pirq_amd756_set; + return 1; +} + +static __initdata struct irq_router_handler pirq_routers[] = { + { PCI_VENDOR_ID_INTEL, intel_router_probe }, + { PCI_VENDOR_ID_AL, ali_router_probe }, + { PCI_VENDOR_ID_ITE, ite_router_probe }, + { PCI_VENDOR_ID_VIA, via_router_probe }, + { PCI_VENDOR_ID_OPTI, opti_router_probe }, + { PCI_VENDOR_ID_SI, sis_router_probe }, + { PCI_VENDOR_ID_CYRIX, cyrix_router_probe }, + { PCI_VENDOR_ID_VLSI, vlsi_router_probe }, + { PCI_VENDOR_ID_SERVERWORKS, serverworks_router_probe }, + { PCI_VENDOR_ID_AMD, amd_router_probe }, + /* Someone with docs needs to add the ATI Radeon IGP */ + { 0, NULL } +}; +static struct irq_router pirq_router; static struct pci_dev *pirq_router_dev; -static void __init pirq_find_router(void) +/* + * FIXME: should we have an option to say "generic for + * chipset" ? + */ + +static void __init pirq_find_router(struct irq_router *r) { struct irq_routing_table *rt = pirq_table; - struct irq_router *r; + struct irq_router_handler *h; #ifdef CONFIG_PCI_BIOS if (!rt->signature) { printk(KERN_INFO "PCI: Using BIOS for IRQ routing\n"); - pirq_router = &pirq_bios_router; + r->set = pirq_bios_set; + r->name = "BIOS"; return; } #endif + /* Default unless a driver reloads it */ + r->name = "default"; + r->get = NULL; + r->set = NULL; + DBG("PCI: Attempting to find IRQ router for %04x:%04x\n", rt->rtr_vendor, rt->rtr_device); - /* fall back to default router if nothing else found */ - pirq_router = &pirq_routers[ARRAY_SIZE(pirq_routers) - 1]; - pirq_router_dev = pci_find_slot(rt->rtr_bus, rt->rtr_devfn); if (!pirq_router_dev) { DBG("PCI: Interrupt router not found at %02x:%02x\n", rt->rtr_bus, rt->rtr_devfn); return; } - for(r=pirq_routers; r->vendor; r++) { - /* Exact match against router table entry? Use it! */ - if (r->vendor == rt->rtr_vendor && r->device == rt->rtr_device) { - pirq_router = r; + for( h = pirq_routers; h->vendor; h++) { + /* First look for a router match */ + if (rt->rtr_vendor == h->vendor && h->probe(r, pirq_router_dev, rt->rtr_device)) + break; + /* Fall back to a device match */ + if (pirq_router_dev->vendor == h->vendor && h->probe(r, pirq_router_dev, pirq_router_dev->device)) break; - } - /* Match against router device entry? Use it as a fallback */ - if (r->vendor == pirq_router_dev->vendor && r->device == pirq_router_dev->device) { - pirq_router = r; - } } printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n", - pirq_router->name, + pirq_router.name, pirq_router_dev->vendor, pirq_router_dev->device, pirq_router_dev->slot_name); @@ -572,7 +853,7 @@ int i, pirq, newirq; int irq = 0; u32 mask; - struct irq_router *r = pirq_router; + struct irq_router *r = &pirq_router; struct pci_dev *dev2; char *msg = NULL; @@ -685,17 +966,14 @@ void __init pcibios_irq_init(void) { DBG("PCI: IRQ init\n"); - if (broken_440gx_bios) - pirq_table = NULL; - else - pirq_table = pirq_find_routing_table(); + pirq_table = pirq_find_routing_table(); #ifdef CONFIG_PCI_BIOS if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN)) pirq_table = pcibios_get_irq_routing_table(); #endif if (pirq_table) { pirq_peer_trick(); - pirq_find_router(); + pirq_find_router(&pirq_router); if (pirq_table->exclusive_irqs) { int i; for (i=0; i<16; i++) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/pci-pc.c linux-2.4.23-pre8/arch/i386/kernel/pci-pc.c --- linux-2.4.22/arch/i386/kernel/pci-pc.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/pci-pc.c 2003-10-22 22:48:38.000000000 +0000 @@ -1016,7 +1016,8 @@ "xor %%ah, %%ah\n" "1:" : "=a" (ret), - "=b" (map) + "=b" (map), + "+m" (opt) : "0" (PCIBIOS_GET_ROUTING_OPTIONS), "1" (0), "D" ((long) &opt), @@ -1414,7 +1415,13 @@ return; } -int use_acpi_pci __initdata = 1; +static int use_acpi_pci __initdata = 1; + +__init void pci_disable_acpi(void) +{ + use_acpi_pci = 0; + return; +} void __init pcibios_init(void) { @@ -1427,6 +1434,8 @@ return; } + pcibios_set_cacheline_size(); + printk(KERN_INFO "PCI: Probing PCI hardware\n"); #ifdef CONFIG_ACPI_PCI if (use_acpi_pci && !acpi_pci_irq_init()) { @@ -1502,7 +1511,7 @@ pcibios_last_bus = simple_strtol(str+8, NULL, 0); return NULL; } else if (!strncmp(str, "noacpi", 6)) { - use_acpi_pci = 0; + pci_disable_acpi(); return NULL; } return str; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/pci-visws.c linux-2.4.23-pre8/arch/i386/kernel/pci-visws.c --- linux-2.4.22/arch/i386/kernel/pci-visws.c 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/pci-visws.c 2003-10-22 22:47:59.000000000 +0000 @@ -119,6 +119,7 @@ { unsigned int sec_bus = li_pcib_read16(LI_PCI_BUSNUM) & 0xff; + pcibios_set_cacheline_size(); printk("PCI: Probing PCI hardware on host buses 00 and %02x\n", sec_bus); pci_scan_bus(0, &visws_pci_ops, NULL); pci_scan_bus(sec_bus, &visws_pci_ops, NULL); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/process.c linux-2.4.23-pre8/arch/i386/kernel/process.c --- linux-2.4.22/arch/i386/kernel/process.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/process.c 2003-10-22 22:47:27.000000000 +0000 @@ -47,6 +47,7 @@ #ifdef CONFIG_MATH_EMULATION #include #endif +#include #include @@ -399,6 +400,14 @@ * other OSs see a clean IRQ state. */ smp_send_stop(); +#elif CONFIG_X86_LOCAL_APIC + if (cpu_has_apic) { + __cli(); + disable_local_APIC(); + __sti(); + } +#endif +#ifdef CONFIG_X86_IO_APIC disable_IO_APIC(); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/setup.c linux-2.4.23-pre8/arch/i386/kernel/setup.c --- linux-2.4.22/arch/i386/kernel/setup.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/setup.c 2003-10-22 22:48:54.000000000 +0000 @@ -120,6 +120,7 @@ #include #include #include +#include /* * Machine setup.. */ @@ -176,9 +177,9 @@ static u32 disabled_x86_caps[NCAPINTS] __initdata = { 0 }; #ifdef CONFIG_ACPI_INTERPRETER - int acpi_disabled __initdata = 0; + int acpi_disabled = 0; #else - int acpi_disabled __initdata = 1; + int acpi_disabled = 1; #endif EXPORT_SYMBOL(acpi_disabled); @@ -211,6 +212,8 @@ #define KERNEL_START (*(unsigned long *) (PARAM+0x214)) #define INITRD_START (*(unsigned long *) (PARAM+0x218)) #define INITRD_SIZE (*(unsigned long *) (PARAM+0x21c)) +#define EDD_NR (*(unsigned char *) (PARAM+EDDNR)) +#define EDD_BUF ((struct edd_info *) (PARAM+EDDBUF)) #define COMMAND_LINE ((char *) (PARAM+2048)) #define COMMAND_LINE_SIZE 256 @@ -715,6 +718,23 @@ return 0; } +#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) +unsigned char eddnr; +struct edd_info edd[EDDMAXNR]; +/** + * copy_edd() - Copy the BIOS EDD information + * from empty_zero_page into a safe place. + * + */ +static inline void copy_edd(void) +{ + eddnr = EDD_NR; + memcpy(edd, EDD_BUF, sizeof(edd)); +} +#else +static inline void copy_edd(void) {} +#endif + /* * Do NOT EVER look at the BIOS memory size location. * It does not work on many machines. @@ -1151,6 +1171,7 @@ rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); #endif setup_memory_region(); + copy_edd(); if (!MOUNT_ROOT_RDONLY) root_mountflags &= ~MS_RDONLY; @@ -1976,6 +1997,37 @@ #endif +static void __init init_c3(struct cpuinfo_x86 *c) +{ + u32 lo, hi; + + /* Test for Centaur Extended Feature Flags presence */ + if (cpuid_eax(0xC0000000) >= 0xC0000001) { + /* store Centaur Extended Feature Flags as + * word 5 of the CPU capability bit array + */ + c->x86_capability[5] = cpuid_edx(0xC0000001); + } + + switch (c->x86_model) { + case 6 ... 8: /* Cyrix III family */ + rdmsr (MSR_VIA_FCR, lo, hi); + lo |= (1<<1 | 1<<7); /* Report CX8 & enable PGE */ + wrmsr (MSR_VIA_FCR, lo, hi); + + set_bit(X86_FEATURE_CX8, c->x86_capability); + set_bit(X86_FEATURE_3DNOW, c->x86_capability); + + /* fall through */ + + case 9: /* Nehemiah */ + default: + get_model_name(c); + display_cacheinfo(c); + break; + } +} + static void __init init_centaur(struct cpuinfo_x86 *c) { enum { @@ -2114,23 +2166,7 @@ break; case 6: - switch (c->x86_model) { - case 6 ... 8: /* Cyrix III family */ - rdmsr (MSR_VIA_FCR, lo, hi); - lo |= (1<<1 | 1<<7); /* Report CX8 & enable PGE */ - wrmsr (MSR_VIA_FCR, lo, hi); - - set_bit(X86_FEATURE_CX8, &c->x86_capability); - set_bit(X86_FEATURE_3DNOW, &c->x86_capability); - - /* fall through */ - - case 9: /* Nehemiah */ - default: - get_model_name(c); - display_cacheinfo(c); - break; - } + init_c3(c); break; } } @@ -2254,6 +2290,8 @@ { 0x23, LVL_3, 1024 }, { 0x25, LVL_3, 2048 }, { 0x29, LVL_3, 4096 }, + { 0x2c, LVL_1_DATA, 32 }, + { 0x30, LVL_1_INST, 32 }, { 0x39, LVL_2, 128 }, { 0x3b, LVL_2, 128 }, { 0x3C, LVL_2, 256 }, @@ -2276,6 +2314,8 @@ { 0x83, LVL_2, 512 }, { 0x84, LVL_2, 1024 }, { 0x85, LVL_2, 2048 }, + { 0x86, LVL_2, 512 }, + { 0x87, LVL_2, 1024 }, { 0x00, 0, 0} }; @@ -2765,10 +2805,16 @@ /* Intel-defined flags: level 0x00000001 */ if ( c->cpuid_level >= 0x00000001 ) { - cpuid(0x00000001, &tfms, &junk, &junk, - &c->x86_capability[0]); + u32 capability, excap; + cpuid(0x00000001, &tfms, &junk, &excap, &capability); + c->x86_capability[0] = capability; + c->x86_capability[4] = excap; c->x86 = (tfms >> 8) & 15; c->x86_model = (tfms >> 4) & 15; + if (c->x86 == 0xf) { + c->x86 += (tfms >> 20) & 0xff; + c->x86_model += ((tfms >> 16) & 0xF) << 4; + } c->x86_mask = tfms & 15; } else { /* Have CPUID level 0 only - unheard of */ @@ -2972,12 +3018,12 @@ "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce", "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov", "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx", - "fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", NULL, + "fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", "pbe", /* AMD-defined */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, "mmxext", NULL, + NULL, NULL, NULL, "mp", NULL, NULL, "mmxext", NULL, NULL, NULL, NULL, NULL, NULL, "lm", "3dnowext", "3dnow", /* Transmeta-defined */ @@ -2987,7 +3033,20 @@ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* Other (Linux-defined) */ - "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", NULL, NULL, NULL, NULL, + "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + /* Intel-defined (#2) */ + "pni", NULL, NULL, "monitor", "ds_cpl", NULL, NULL, "tm2", + "est", NULL, "cid", NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + /* VIA/Cyrix/Centaur-defined */ + NULL, NULL, "xstore", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/kernel/smpboot.c linux-2.4.23-pre8/arch/i386/kernel/smpboot.c --- linux-2.4.22/arch/i386/kernel/smpboot.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/kernel/smpboot.c 2003-10-22 22:48:54.000000000 +0000 @@ -51,7 +51,7 @@ static int smp_b_stepping; /* Setup configured maximum number of CPUs to activate */ -static int max_cpus = -1; +static int max_cpus = NR_CPUS; /* Total count of live CPUs */ int smp_num_cpus = 1; @@ -1116,7 +1116,7 @@ if (!(phys_cpu_present_map & (1ul << bit))) continue; - if ((max_cpus >= 0) && (max_cpus <= cpucount+1)) + if (max_cpus <= cpucount+1) continue; do_boot_cpu(apicid); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/i386/mm/ioremap.c linux-2.4.23-pre8/arch/i386/mm/ioremap.c --- linux-2.4.22/arch/i386/mm/ioremap.c 2002-08-03 00:39:42.000000000 +0000 +++ linux-2.4.23-pre8/arch/i386/mm/ioremap.c 2003-10-22 22:48:15.000000000 +0000 @@ -140,7 +140,7 @@ */ offset = phys_addr & ~PAGE_MASK; phys_addr &= PAGE_MASK; - size = PAGE_ALIGN(last_addr) - phys_addr; + size = PAGE_ALIGN(last_addr+1) - phys_addr; /* * Ok, go for it.. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/Makefile linux-2.4.23-pre8/arch/ia64/Makefile --- linux-2.4.22/arch/ia64/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/Makefile 2003-10-22 22:47:36.000000000 +0000 @@ -17,13 +17,31 @@ AFLAGS_KERNEL := -mconstant-gp EXTRA = -CFLAGS := $(CFLAGS) -pipe $(EXTRA) -ffixed-r13 -mfixed-range=f10-f15,f32-f127 \ +CFLAGS := $(CFLAGS) -pipe $(EXTRA) -ffixed-r13 -mfixed-range=f12-f15,f32-f127 \ -falign-functions=32 # -ffunction-sections CFLAGS_KERNEL := -mconstant-gp GCC_VERSION=$(shell $(CC) -v 2>&1 | fgrep 'gcc version' | cut -f3 -d' ' | cut -f1 -d'.') +CHECK_GAS_FOR_HINT=arch/ia64/scripts/check_gas_for_hint.o +MAKE_GAS_HINT_TEST=arch/ia64/scripts/make_gas_hint_test + +ifneq (, $(shell ls $(CHECK_GAS_FOR_HINT))) +$(shell rm $(CHECK_GAS_FOR_HINT)) +endif + +CHECK_GAS_CMD:=($(CC) $(MAKE_GAS_HINT_TEST).c -o $(MAKE_GAS_HINT_TEST) && $(MAKE_GAS_HINT_TEST) | $(CC) -c -o $(CHECK_GAS_FOR_HINT) -x assembler -; rm -f $(MAKE_GAS_HINT_TEST))>&/dev/null +$(shell $(CHECK_GAS_CMD)) +ifneq (, $(shell ls $(CHECK_GAS_FOR_HINT))) +#Newer version of binutil is detected and "hint" instruction is in the kernel +$(warning Warning: Found binutils that supports hint instruction) +FLAGS := $(AFLAGS) -DGAS_HAS_HINT_INSN +CFLAGS := $(CFLAGS) -DGAS_HAS_HINT_INSN +else +$(warning Warning: Please use binutil version 2.14.90.0.4.1 or higher to get the support of hint instruction in kernel.) +endif + ifneq ($(GCC_VERSION),2) CFLAGS += -frename-registers --param max-inline-insns=5000 endif @@ -44,9 +62,11 @@ ifdef CONFIG_IA64_HP_SIM SUBDIRS := arch/$(ARCH)/hp \ + arch/$(ARCH)/drivers \ $(SUBDIRS) CORE_FILES := arch/$(ARCH)/hp/hp.o \ $(CORE_FILES) + DRIVERS += arch/$(ARCH)/drivers/drivers.o endif ifdef CONFIG_IA64_HP_ZX1 @@ -136,7 +156,7 @@ arch/ia64/scripts/unwcheck.sh vmlinux archmrproper: - rm -f arch/$(ARCH)/vmlinux.lds + rm -f arch/$(ARCH)/vmlinux.lds vmlinux-tmp vmlinux.gz @$(MAKE) -C arch/$(ARCH)/tools mrproper archdep: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/config.in linux-2.4.23-pre8/arch/ia64/config.in --- linux-2.4.22/arch/ia64/config.in 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/config.in 2003-10-22 22:48:57.000000000 +0000 @@ -35,7 +35,6 @@ DIG-compliant CONFIG_IA64_DIG \ HP-simulator CONFIG_IA64_HP_SIM \ HP-zx1 CONFIG_IA64_HP_ZX1 \ - SGI-SN1 CONFIG_IA64_SGI_SN1 \ SGI-SN2 CONFIG_IA64_SGI_SN2" generic if [ "$CONFIG_ITANIUM" = "y" ]; then @@ -54,11 +53,7 @@ if [ "$CONFIG_ITANIUM" = "y" ]; then define_bool CONFIG_IA64_BRL_EMU y bool ' Enable Itanium B-step specific code' CONFIG_ITANIUM_BSTEP_SPECIFIC - if [ "$CONFIG_IA64_SGI_SN1" = "y" ]; then - define_int CONFIG_IA64_L1_CACHE_SHIFT 7 # align cache-sensitive data to 128 bytes - else - define_int CONFIG_IA64_L1_CACHE_SHIFT 6 # align cache-sensitive data to 64 bytes - fi + define_int CONFIG_IA64_L1_CACHE_SHIFT 6 # align cache-sensitive data to 64 bytes fi if [ "$CONFIG_MCKINLEY" = "y" ]; then @@ -66,17 +61,20 @@ fi if [ "$CONFIG_IA64_GENERIC" = "y" -o "$CONFIG_IA64_DIG" = "y" -o "$CONFIG_IA64_HP_ZX1" = "y" ]; then + bool ' Enable NUMA support' CONFIG_NUMA + if [ "$CONFIG_NUMA" = "y" ]; then + define_bool CONFIG_DISCONTIGMEM y + fi bool ' Enable IA-64 Machine Check Abort' CONFIG_IA64_MCA define_bool CONFIG_PM y fi -if [ "$CONFIG_IA64_SGI_SN1" = "y" -o "$CONFIG_IA64_SGI_SN2" = "y" ]; then +if [ "$CONFIG_IA64_SGI_SN2" = "y" ]; then define_bool CONFIG_IA64_SGI_SN y bool ' Enable extra debugging code' CONFIG_IA64_SGI_SN_DEBUG bool ' Enable SGI Medusa Simulator Support' CONFIG_IA64_SGI_SN_SIM - bool ' Enable autotest (llsc). Option to run cache test instead of booting' \ - CONFIG_IA64_SGI_AUTOTEST bool ' Enable protocol mode for the L1 console' CONFIG_SERIAL_SGI_L1_PROTOCOL + define_bool CONFIG_HWGFS_FS y define_bool CONFIG_DISCONTIGMEM y define_bool CONFIG_IA64_MCA y define_bool CONFIG_NUMA y @@ -86,7 +84,12 @@ define_bool CONFIG_KCORE_ELF y # On IA-64, we always want an ELF /proc/kcore. +bool 'Use PAL_HALT_LIGHT in idle loop' CONFIG_IA64_PAL_IDLE bool 'SMP support' CONFIG_SMP +if [ "$CONFIG_SMP" = "y" ]; then + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 +fi + tristate 'Support running of Linux/x86 binaries' CONFIG_IA32_SUPPORT bool 'Performance monitor support' CONFIG_PERFMON tristate '/proc/pal support' CONFIG_IA64_PALINFO @@ -290,4 +293,6 @@ bool ' Turn on irq debug checks (slow!)' CONFIG_IA64_DEBUG_IRQ fi +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/configs/dig linux-2.4.23-pre8/arch/ia64/configs/dig --- linux-2.4.22/arch/ia64/configs/dig 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/configs/dig 2003-10-22 22:49:06.000000000 +0000 @@ -38,6 +38,7 @@ CONFIG_IA64_BRL_EMU=y # CONFIG_ITANIUM_BSTEP_SPECIFIC is not set CONFIG_IA64_L1_CACHE_SHIFT=6 +# CONFIG_NUMA is not set CONFIG_IA64_MCA=y CONFIG_PM=y CONFIG_KCORE_ELF=y @@ -49,6 +50,7 @@ # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set # CONFIG_HUGETLB_PAGE_SIZE_256KB is not set +# CONFIG_IA64_PAL_IDLE is not set CONFIG_SMP=y CONFIG_IA32_SUPPORT=y CONFIG_PERFMON=y @@ -270,7 +272,6 @@ # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_PDC202XX_BURST is not set # CONFIG_BLK_DEV_PDC202XX_NEW is not set -# CONFIG_PDC202XX_FORCE is not set # CONFIG_BLK_DEV_RZ1000 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_SVWKS is not set @@ -329,6 +330,9 @@ CONFIG_AIC7XXX_RESET_DELAY_MS=15000 # CONFIG_AIC7XXX_PROBE_EISA_VL is not set # CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set @@ -406,6 +410,7 @@ # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_APRICOT is not set +# CONFIG_B44 is not set # CONFIG_CS89x0 is not set CONFIG_TULIP=y # CONFIG_TULIP_MWI is not set @@ -445,6 +450,7 @@ # CONFIG_ACENIC is not set # CONFIG_DL2K is not set CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set # CONFIG_MYRI_SBUS is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set @@ -656,6 +662,7 @@ # File systems # # CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set CONFIG_AUTOFS_FS=y # CONFIG_AUTOFS4_FS is not set # CONFIG_REISERFS_FS is not set @@ -665,6 +672,7 @@ # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BEFS_DEBUG is not set # CONFIG_BFS_FS is not set @@ -715,6 +723,7 @@ # CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y +# CONFIG_NFS_DIRECTIO is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y @@ -916,6 +925,7 @@ # CONFIG_USB_RTL8150 is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_CATC is not set +# CONFIG_USB_AX8817X is not set # CONFIG_USB_CDCETHER is not set # CONFIG_USB_USBNET is not set @@ -939,8 +949,14 @@ # CONFIG_USB_LCD is not set # +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# # Library routines # +# CONFIG_CRC32 is not set # CONFIG_ZLIB_INFLATE is not set # CONFIG_ZLIB_DEFLATE is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/configs/generic linux-2.4.23-pre8/arch/ia64/configs/generic --- linux-2.4.22/arch/ia64/configs/generic 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/configs/generic 2003-10-22 22:47:39.000000000 +0000 @@ -38,6 +38,7 @@ CONFIG_IA64_BRL_EMU=y # CONFIG_ITANIUM_BSTEP_SPECIFIC is not set CONFIG_IA64_L1_CACHE_SHIFT=6 +# CONFIG_NUMA is not set CONFIG_IA64_MCA=y CONFIG_PM=y CONFIG_KCORE_ELF=y @@ -49,6 +50,7 @@ # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set # CONFIG_HUGETLB_PAGE_SIZE_256KB is not set +# CONFIG_IA64_PAL_IDLE is not set CONFIG_SMP=y CONFIG_IA32_SUPPORT=y CONFIG_PERFMON=y @@ -270,7 +272,6 @@ # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_PDC202XX_BURST is not set # CONFIG_BLK_DEV_PDC202XX_NEW is not set -# CONFIG_PDC202XX_FORCE is not set # CONFIG_BLK_DEV_RZ1000 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_SVWKS is not set @@ -329,6 +330,9 @@ CONFIG_AIC7XXX_RESET_DELAY_MS=15000 # CONFIG_AIC7XXX_PROBE_EISA_VL is not set # CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set @@ -411,6 +415,7 @@ # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_APRICOT is not set +# CONFIG_B44 is not set # CONFIG_CS89x0 is not set CONFIG_TULIP=y # CONFIG_TULIP_MWI is not set @@ -450,6 +455,7 @@ # CONFIG_ACENIC is not set # CONFIG_DL2K is not set CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set # CONFIG_MYRI_SBUS is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set @@ -661,6 +667,7 @@ # File systems # # CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set CONFIG_AUTOFS_FS=y # CONFIG_AUTOFS4_FS is not set # CONFIG_REISERFS_FS is not set @@ -670,6 +677,7 @@ # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BEFS_DEBUG is not set # CONFIG_BFS_FS is not set @@ -720,6 +728,7 @@ # CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y +# CONFIG_NFS_DIRECTIO is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y @@ -921,6 +930,7 @@ # CONFIG_USB_RTL8150 is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_CATC is not set +# CONFIG_USB_AX8817X is not set # CONFIG_USB_CDCETHER is not set # CONFIG_USB_USBNET is not set @@ -944,8 +954,14 @@ # CONFIG_USB_LCD is not set # +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# # Library routines # +# CONFIG_CRC32 is not set # CONFIG_ZLIB_INFLATE is not set # CONFIG_ZLIB_DEFLATE is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/configs/numa linux-2.4.23-pre8/arch/ia64/configs/numa --- linux-2.4.22/arch/ia64/configs/numa 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/configs/numa 2003-10-22 22:49:03.000000000 +0000 @@ -0,0 +1,998 @@ +# +# Automatically generated make config: don't edit +# + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODVERSIONS=y +# CONFIG_KMOD is not set + +# +# General setup +# +CONFIG_IA64=y +# CONFIG_ISA is not set +# CONFIG_EISA is not set +# CONFIG_MCA is not set +# CONFIG_SBUS is not set +# CONFIG_RWSEM_GENERIC_SPINLOCK is not set +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_ITANIUM=y +# CONFIG_MCKINLEY is not set +CONFIG_IA64_GENERIC=y +# CONFIG_IA64_DIG is not set +# CONFIG_IA64_HP_SIM is not set +# CONFIG_IA64_HP_ZX1 is not set +# CONFIG_IA64_SGI_SN1 is not set +# CONFIG_IA64_SGI_SN2 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 +CONFIG_IA64_BRL_EMU=y +# CONFIG_ITANIUM_BSTEP_SPECIFIC is not set +CONFIG_IA64_L1_CACHE_SHIFT=6 +CONFIG_NUMA=y +CONFIG_DISCONTIGMEM=y +CONFIG_IA64_MCA=y +CONFIG_PM=y +CONFIG_KCORE_ELF=y +CONFIG_FORCE_MAX_ZONEORDER=19 +CONFIG_HUGETLB_PAGE=y +# CONFIG_HUGETLB_PAGE_SIZE_256MB is not set +# CONFIG_HUGETLB_PAGE_SIZE_64MB is not set +CONFIG_HUGETLB_PAGE_SIZE_16MB=y +# CONFIG_HUGETLB_PAGE_SIZE_4MB is not set +# CONFIG_HUGETLB_PAGE_SIZE_1MB is not set +# CONFIG_HUGETLB_PAGE_SIZE_256KB is not set +CONFIG_IA64_PAL_IDLE=y +CONFIG_SMP=y +CONFIG_IA32_SUPPORT=y +CONFIG_PERFMON=y +CONFIG_IA64_PALINFO=y +CONFIG_EFI_VARS=y +CONFIG_NET=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +CONFIG_ACPI=y +CONFIG_ACPI_EFI=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_KERNEL_CONFIG=y + +# +# ACPI Support +# +CONFIG_ACPI_PCI=y +CONFIG_ACPI=y +CONFIG_ACPI_EFI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_BUS=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_SYSTEM=y +# CONFIG_ACPI_BUTTON is not set +# CONFIG_ACPI_FAN is not set +# CONFIG_ACPI_PROCESSOR is not set +# CONFIG_ACPI_THERMAL is not set +CONFIG_ACPI_NUMA=y +# CONFIG_ACPI_DEBUG is not set +CONFIG_PCI=y +CONFIG_PCI_NAMES=y +# CONFIG_HOTPLUG is not set +# CONFIG_PCMCIA is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +# CONFIG_NETLINK_DEV is not set +# CONFIG_NETFILTER is not set +CONFIG_FILTER=y +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set + +# +# +# +# CONFIG_IPX is not set +# CONFIG_ATALK is not set + +# +# Appletalk devices +# +# CONFIG_DEV_APPLETALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC 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 + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP 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_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE 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_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_BLK_DEV_INITRD is not set +# CONFIG_BLK_STATS is not set + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_PCI is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD 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_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Fusion MPT device support +# +CONFIG_FUSION=y +CONFIG_FUSION_BOOT=y +CONFIG_FUSION_MAX_SGE=40 +# CONFIG_FUSION_ISENSE is not set +# CONFIG_FUSION_CTL is not set +# CONFIG_FUSION_LAN is not set + +# +# ATA/IDE/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=y +# CONFIG_IDEDISK_STROKE is not set +# CONFIG_BLK_DEV_IDECS is not set +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +CONFIG_BLK_DEV_IDEFLOPPY=y +CONFIG_BLK_DEV_IDESCSI=y +# 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_BLK_DEV_IDEPCI=y +# CONFIG_BLK_DEV_GENERIC is not set +CONFIG_IDEPCI_SHARE_IRQ=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_OFFBOARD is not set +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +# CONFIG_IDEDMA_PCI_AUTO is not set +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_PCI_WIP is not set +# CONFIG_BLK_DEV_ADMA100 is not set +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_WDC_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_AMD74XX_OVERRIDE is not set +CONFIG_BLK_DEV_CMD64X=y +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_HPT34X is not set +# CONFIG_HPT34X_AUTODMA is not set +# CONFIG_BLK_DEV_HPT366 is not set +CONFIG_BLK_DEV_PIIX=y +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_PDC202XX_BURST is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_RZ1000 is not set +# CONFIG_BLK_DEV_SC1200 is not set +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SIS5513 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_IDE_CHIPSETS is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_IDEDMA_IVB is not set +# CONFIG_DMA_NONPCI is not set +CONFIG_BLK_DEV_IDE_MODES=y +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set +# CONFIG_BLK_DEV_ATARAID_SII is not set + +# +# SCSI support +# +CONFIG_SCSI=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +CONFIG_SD_EXTRA_DEVS=40 +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_SR_EXTRA_DEVS=2 +CONFIG_CHR_DEV_SG=y + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_DEBUG_QUEUES=y +# CONFIG_SCSI_MULTI_LUN is not set +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI low-level drivers +# +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_7000FASST is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set +# CONFIG_SCSI_AHA1740 is not set +# CONFIG_SCSI_AACRAID is not set +CONFIG_SCSI_AIC7XXX=y +CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_PROBE_EISA_VL is not set +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_IN2000 is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_MEGARAID is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_CPQFCTS is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DTC3280 is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_EATA_DMA 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_GENERIC_NCR5380 is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_NCR53C406A is not set +# CONFIG_SCSI_NCR53C7xx is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_NCR53C8XX is not set +CONFIG_SCSI_SYM53C8XX=y +CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 +CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32 +CONFIG_SCSI_NCR53C8XX_SYNC=20 +# CONFIG_SCSI_NCR53C8XX_PROFILE is not set +# CONFIG_SCSI_NCR53C8XX_IOMAPPED is not set +# CONFIG_SCSI_NCR53C8XX_PQS_PDS is not set +# CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +# CONFIG_SCSI_PSI240I is not set +# CONFIG_SCSI_QLOGIC_FAS is not set +# CONFIG_SCSI_QLOGIC_ISP is not set +# CONFIG_SCSI_QLOGIC_FC is not set +CONFIG_SCSI_QLOGIC_1280=y +# CONFIG_SCSI_QLOGIC_QLA2100 is not set +# CONFIG_SCSI_SIM710 is not set +# CONFIG_SCSI_SYM53C416 is not set +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +CONFIG_DUMMY=y +# 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_SUNLANCE is not set +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set +CONFIG_NET_PCI=y +# CONFIG_PCNET32 is not set +# CONFIG_AMD8111_ETH is not set +# CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_APRICOT is not set +# CONFIG_B44 is not set +# CONFIG_CS89x0 is not set +CONFIG_TULIP=y +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_DE4X5 is not set +# CONFIG_DGRS is not set +# CONFIG_DM9102 is not set +CONFIG_EEPRO100=y +# CONFIG_EEPRO100_PIO is not set +# CONFIG_E100 is not set +# CONFIG_LNE390 is not set +# CONFIG_FEALNX is not set +# CONFIG_NATSEMI is not set +# CONFIG_NE2K_PCI is not set +# CONFIG_NE3210 is not set +# CONFIG_ES3210 is not set +# CONFIG_8139CP is not set +# CONFIG_8139TOO is not set +# 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_SUNDANCE_MMIO is not set +# CONFIG_TLAN is not set +# CONFIG_TC35815 is not set +# CONFIG_VIA_RHINE is not set +# CONFIG_VIA_RHINE_MMIO is not set +# CONFIG_WINBOND_840 is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SK98LIN is not set +CONFIG_TIGON3=y +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# 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 + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# CD-ROM drivers (not for SCSI or IDE/ATAPI drives) +# +# CONFIG_CD_NO_IDESCSI is not set + +# +# Input core support +# +CONFIG_INPUT=y +CONFIG_INPUT_KEYBDEV=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_SERIAL_CONSOLE=y +CONFIG_SERIAL_HCDP=y +CONFIG_SERIAL_ACPI=y +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +CONFIG_MOUSE=y +CONFIG_PSMOUSE=y +# CONFIG_82C710_MOUSE is not set +# CONFIG_PC110_PAD is not set +# CONFIG_MK712_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set +# CONFIG_INPUT_NS558 is not set +# CONFIG_INPUT_LIGHTNING is not set +# CONFIG_INPUT_PCIGAME is not set +# CONFIG_INPUT_CS461X is not set +# CONFIG_INPUT_EMU10K1 is not set +CONFIG_INPUT_SERIO=y +CONFIG_INPUT_SERPORT=y + +# +# Joysticks +# +# CONFIG_INPUT_ANALOG is not set +# CONFIG_INPUT_A3D is not set +# CONFIG_INPUT_ADI is not set +# CONFIG_INPUT_COBRA is not set +# CONFIG_INPUT_GF2K is not set +# CONFIG_INPUT_GRIP is not set +# CONFIG_INPUT_INTERACT is not set +# CONFIG_INPUT_TMDC is not set +# CONFIG_INPUT_SIDEWINDER is not set +# CONFIG_INPUT_IFORCE_USB is not set +# CONFIG_INPUT_IFORCE_232 is not set +# CONFIG_INPUT_WARRIOR is not set +# CONFIG_INPUT_MAGELLAN is not set +# CONFIG_INPUT_SPACEORB is not set +# CONFIG_INPUT_SPACEBALL is not set +# CONFIG_INPUT_STINGER is not set +# CONFIG_INPUT_DB9 is not set +# CONFIG_INPUT_GAMECON is not set +# CONFIG_INPUT_TURBOGRAFX is not set +# CONFIG_QIC02_TAPE is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_IPMI_PANIC_EVENT is not set +# CONFIG_IPMI_DEVICE_INTERFACE is not set +# CONFIG_IPMI_KCS is not set +# CONFIG_IPMI_WATCHDOG is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_SCx200_GPIO is not set +# CONFIG_INTEL_RNG is not set +# CONFIG_AMD_PM768 is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +CONFIG_EFI_RTC=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=y +# CONFIG_AGP_INTEL is not set +# CONFIG_AGP_I810 is not set +# CONFIG_AGP_VIA is not set +# CONFIG_AGP_AMD is not set +# CONFIG_AGP_AMD_8151 is not set +# CONFIG_AGP_SIS is not set +# CONFIG_AGP_ALI is not set +# CONFIG_AGP_SWORKS is not set +CONFIG_AGP_I460=y +CONFIG_AGP_HP_ZX1=y +CONFIG_DRM=y +# CONFIG_DRM_OLD is not set + +# +# DRM 4.1 drivers +# +CONFIG_DRM_NEW=y +# CONFIG_DRM_TDFX is not set +CONFIG_DRM_R128=y +CONFIG_DRM_RADEON=y +# CONFIG_DRM_I810 is not set +# CONFIG_DRM_I810_XFREE_41 is not set +# CONFIG_DRM_I830 is not set +# CONFIG_DRM_MGA is not set +# CONFIG_DRM_SIS is not set + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=y + +# +# Video For Linux +# +CONFIG_VIDEO_PROC_FS=y +# CONFIG_I2C_PARPORT is not set + +# +# Video Adapters +# +# CONFIG_VIDEO_BT848 is not set +# CONFIG_VIDEO_PMS is not set +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_TUNER_3036 is not set +# CONFIG_VIDEO_STRADIS is not set +# CONFIG_VIDEO_ZORAN is not set +# CONFIG_VIDEO_ZORAN_BUZ is not set +# CONFIG_VIDEO_ZORAN_DC10 is not set +# CONFIG_VIDEO_ZORAN_LML33 is not set +# CONFIG_VIDEO_ZR36120 is not set +# CONFIG_VIDEO_MEYE is not set + +# +# Radio Adapters +# +# CONFIG_RADIO_GEMTEK_PCI is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_MAESTRO is not set +# CONFIG_RADIO_MIROPCM20 is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set +CONFIG_AUTOFS_FS=y +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO 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_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +CONFIG_EXT3_FS=y +CONFIG_JBD=y +CONFIG_JBD_DEBUG=y +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +# CONFIG_UMSDOS_FS is not set +CONFIG_VFAT_FS=y +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +# CONFIG_JFFS2_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +CONFIG_HUGETLBFS=y +CONFIG_ISO9660_FS=y +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_JFS_FS is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +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=y +# 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_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_DIRECTIO is not set +# CONFIG_ROOT_NFS is not set +CONFIG_NFSD=y +CONFIG_NFSD_V3=y +# CONFIG_NFSD_TCP is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_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 is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_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=y +# CONFIG_SMB_NLS is not set +CONFIG_NLS=y + +# +# Native Language Support +# +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 + +# +# Console drivers +# +CONFIG_VGA_CONSOLE=y + +# +# Frame-buffer support +# +# CONFIG_FB is not set + +# +# Sound +# +CONFIG_SOUND=y +# CONFIG_SOUND_ALI5455 is not set +# CONFIG_SOUND_BT878 is not set +# CONFIG_SOUND_CMPCI is not set +# CONFIG_SOUND_EMU10K1 is not set +# CONFIG_MIDI_EMU10K1 is not set +# CONFIG_SOUND_FUSION is not set +CONFIG_SOUND_CS4281=y +# CONFIG_SOUND_ES1370 is not set +# CONFIG_SOUND_ES1371 is not set +# CONFIG_SOUND_ESSSOLO1 is not set +# CONFIG_SOUND_MAESTRO is not set +# CONFIG_SOUND_MAESTRO3 is not set +# CONFIG_SOUND_FORTE is not set +# CONFIG_SOUND_ICH is not set +# CONFIG_SOUND_RME96XX is not set +# CONFIG_SOUND_SONICVIBES is not set +# CONFIG_SOUND_TRIDENT is not set +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +# CONFIG_SOUND_VIA82CXXX is not set +# CONFIG_MIDI_VIA82CXXX is not set +# CONFIG_SOUND_OSS is not set +# CONFIG_SOUND_TVMIXER 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 + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_UHCI=y +# CONFIG_USB_UHCI_ALT is not set +CONFIG_USB_OHCI=y + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_MIDI is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=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 + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# +# CONFIG_USB_IBMCAM is not set +# CONFIG_USB_KONICAWC is not set +# CONFIG_USB_OV511 is not set +# CONFIG_USB_PWC is not set +# CONFIG_USB_SE401 is not set +# CONFIG_USB_STV680 is not set +# CONFIG_USB_VICAM is not set +# CONFIG_USB_DSBR is not set +# CONFIG_USB_DABUSB is not set + +# +# USB Network adaptors +# +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_AX8817X is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_TIGL is not set +# CONFIG_USB_BRLVGER is not set +# CONFIG_USB_LCD is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC32 is not set +# CONFIG_ZLIB_INFLATE is not set +# CONFIG_ZLIB_DEFLATE is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Simulated drivers +# +# CONFIG_HP_SIMETH is not set +# CONFIG_HP_SIMSERIAL is not set +# CONFIG_HP_SIMSCSI is not set + +# +# Kernel hacking +# +CONFIG_IA64_GRANULE_16MB=y +# CONFIG_IA64_GRANULE_64MB is not set +CONFIG_DEBUG_KERNEL=y +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=0 +# CONFIG_IA64_EARLY_PRINTK_VGA is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_IA64_DEBUG_CMPXCHG is not set +# CONFIG_IA64_DEBUG_IRQ is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/configs/ski linux-2.4.23-pre8/arch/ia64/configs/ski --- linux-2.4.22/arch/ia64/configs/ski 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/configs/ski 2003-10-22 22:48:13.000000000 +0000 @@ -47,6 +47,7 @@ # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set # CONFIG_HUGETLB_PAGE_SIZE_256KB is not set +CONFIG_IA64_PAL_IDLE=y CONFIG_SMP=y CONFIG_IA32_SUPPORT=y CONFIG_PERFMON=y @@ -152,12 +153,9 @@ # CONFIG_SCSI_AHA1542 is not set # CONFIG_SCSI_AHA1740 is not set # CONFIG_SCSI_AACRAID is not set -CONFIG_SCSI_AIC7XXX=y -CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 -CONFIG_AIC7XXX_RESET_DELAY_MS=15000 -# CONFIG_AIC7XXX_PROBE_EISA_VL is not set -# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +# CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_IN2000 is not set @@ -311,6 +309,7 @@ # File systems # # CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set CONFIG_AUTOFS_FS=y # CONFIG_AUTOFS4_FS is not set # CONFIG_REISERFS_FS is not set @@ -320,6 +319,7 @@ # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BEFS_DEBUG is not set # CONFIG_BFS_FS is not set @@ -370,6 +370,7 @@ # CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y +# CONFIG_NFS_DIRECTIO is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/configs/zx1 linux-2.4.23-pre8/arch/ia64/configs/zx1 --- linux-2.4.22/arch/ia64/configs/zx1 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/configs/zx1 2003-10-22 22:49:22.000000000 +0000 @@ -37,6 +37,7 @@ CONFIG_IA64_PAGE_SIZE_16KB=y # CONFIG_IA64_PAGE_SIZE_64KB is not set CONFIG_IA64_L1_CACHE_SHIFT=7 +# CONFIG_NUMA is not set CONFIG_IA64_MCA=y CONFIG_PM=y CONFIG_KCORE_ELF=y @@ -50,6 +51,7 @@ # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set # CONFIG_HUGETLB_PAGE_SIZE_256KB is not set +CONFIG_IA64_PAL_IDLE=y CONFIG_SMP=y CONFIG_IA32_SUPPORT=y CONFIG_PERFMON=y @@ -271,7 +273,6 @@ # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_PDC202XX_BURST is not set # CONFIG_BLK_DEV_PDC202XX_NEW is not set -# CONFIG_PDC202XX_FORCE is not set # CONFIG_BLK_DEV_RZ1000 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_SVWKS is not set @@ -330,6 +331,9 @@ CONFIG_AIC7XXX_RESET_DELAY_MS=15000 # CONFIG_AIC7XXX_PROBE_EISA_VL is not set # CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set @@ -407,6 +411,7 @@ # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_APRICOT is not set +# CONFIG_B44 is not set # CONFIG_CS89x0 is not set CONFIG_TULIP=y # CONFIG_TULIP_MWI is not set @@ -446,6 +451,7 @@ # CONFIG_ACENIC is not set # CONFIG_DL2K is not set CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set # CONFIG_MYRI_SBUS is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set @@ -657,6 +663,7 @@ # File systems # # CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set CONFIG_AUTOFS_FS=y # CONFIG_AUTOFS4_FS is not set # CONFIG_REISERFS_FS is not set @@ -666,6 +673,7 @@ # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BEFS_DEBUG is not set # CONFIG_BFS_FS is not set @@ -716,6 +724,7 @@ # CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y +# CONFIG_NFS_DIRECTIO is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y @@ -917,6 +926,7 @@ # CONFIG_USB_RTL8150 is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_CATC is not set +# CONFIG_USB_AX8817X is not set # CONFIG_USB_CDCETHER is not set # CONFIG_USB_USBNET is not set @@ -940,8 +950,14 @@ # CONFIG_USB_LCD is not set # +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# # Library routines # +# CONFIG_CRC32 is not set # CONFIG_ZLIB_INFLATE is not set # CONFIG_ZLIB_DEFLATE is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/defconfig linux-2.4.23-pre8/arch/ia64/defconfig --- linux-2.4.22/arch/ia64/defconfig 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/defconfig 2003-10-22 22:47:41.000000000 +0000 @@ -38,6 +38,7 @@ CONFIG_IA64_BRL_EMU=y # CONFIG_ITANIUM_BSTEP_SPECIFIC is not set CONFIG_IA64_L1_CACHE_SHIFT=6 +# CONFIG_NUMA is not set CONFIG_IA64_MCA=y CONFIG_PM=y CONFIG_KCORE_ELF=y @@ -49,7 +50,9 @@ # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set # CONFIG_HUGETLB_PAGE_SIZE_256KB is not set +# CONFIG_IA64_PAL_IDLE is not set CONFIG_SMP=y +CONFIG_NR_CPUS=32 CONFIG_IA32_SUPPORT=y CONFIG_PERFMON=y CONFIG_IA64_PALINFO=y @@ -270,7 +273,6 @@ # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_PDC202XX_BURST is not set # CONFIG_BLK_DEV_PDC202XX_NEW is not set -# CONFIG_PDC202XX_FORCE is not set # CONFIG_BLK_DEV_RZ1000 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_SVWKS is not set @@ -329,6 +331,9 @@ CONFIG_AIC7XXX_RESET_DELAY_MS=15000 # CONFIG_AIC7XXX_PROBE_EISA_VL is not set # CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set @@ -411,6 +416,7 @@ # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_APRICOT is not set +# CONFIG_B44 is not set # CONFIG_CS89x0 is not set CONFIG_TULIP=y # CONFIG_TULIP_MWI is not set @@ -450,6 +456,7 @@ # CONFIG_ACENIC is not set # CONFIG_DL2K is not set CONFIG_E1000=y +# CONFIG_E1000_NAPI is not set # CONFIG_MYRI_SBUS is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set @@ -661,6 +668,7 @@ # File systems # # CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set CONFIG_AUTOFS_FS=y # CONFIG_AUTOFS4_FS is not set # CONFIG_REISERFS_FS is not set @@ -670,6 +678,7 @@ # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BEFS_DEBUG is not set # CONFIG_BFS_FS is not set @@ -720,6 +729,7 @@ # CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y +# CONFIG_NFS_DIRECTIO is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y @@ -921,6 +931,7 @@ # CONFIG_USB_RTL8150 is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_CATC is not set +# CONFIG_USB_AX8817X is not set # CONFIG_USB_CDCETHER is not set # CONFIG_USB_USBNET is not set @@ -944,8 +955,14 @@ # CONFIG_USB_LCD is not set # +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# # Library routines # +# CONFIG_CRC32 is not set # CONFIG_ZLIB_INFLATE is not set # CONFIG_ZLIB_DEFLATE is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/drivers/Makefile linux-2.4.23-pre8/arch/ia64/drivers/Makefile --- linux-2.4.22/arch/ia64/drivers/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/drivers/Makefile 2003-10-22 22:49:10.000000000 +0000 @@ -0,0 +1,13 @@ +# +# ia64/drivers/Makefile +# +# Copyright (C) 2003 Hewlett-Packard Co. +# Bjorn Helgaas + +O_TARGET := drivers.o + +obj-$(CONFIG_HP_SIMETH) += simeth.o +obj-$(CONFIG_HP_SIMSERIAL) += simserial.o +obj-$(CONFIG_HP_SIMSCSI) += simscsi.o + +include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/drivers/simeth.c linux-2.4.23-pre8/arch/ia64/drivers/simeth.c --- linux-2.4.22/arch/ia64/drivers/simeth.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/drivers/simeth.c 2003-10-22 22:47:27.000000000 +0000 @@ -0,0 +1,537 @@ +/* + * Simulated Ethernet Driver + * + * Copyright (C) 1999-2001, 2003 Hewlett-Packard Co + * Stephane Eranian + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SIMETH_RECV_MAX 10 + +/* + * Maximum possible received frame for Ethernet. + * We preallocate an sk_buff of that size to avoid costly + * memcpy for temporary buffer into sk_buff. We do basically + * what's done in other drivers, like eepro with a ring. + * The difference is, of course, that we don't have real DMA !!! + */ +#define SIMETH_FRAME_SIZE ETH_FRAME_LEN + + +#define SSC_NETDEV_PROBE 100 +#define SSC_NETDEV_SEND 101 +#define SSC_NETDEV_RECV 102 +#define SSC_NETDEV_ATTACH 103 +#define SSC_NETDEV_DETACH 104 + +#define NETWORK_INTR 8 + +struct simeth_local { + struct net_device_stats stats; + int simfd; /* descriptor in the simulator */ +}; + +static int simeth_probe1(void); +static int simeth_open(struct net_device *dev); +static int simeth_close(struct net_device *dev); +static int simeth_tx(struct sk_buff *skb, struct net_device *dev); +static int simeth_rx(struct net_device *dev); +static struct net_device_stats *simeth_get_stats(struct net_device *dev); +static void simeth_interrupt(int irq, void *dev_id, struct pt_regs * regs); +static void set_multicast_list(struct net_device *dev); +static int simeth_device_event(struct notifier_block *this,unsigned long event, void *ptr); + +static char *simeth_version="0.3"; + +/* + * This variable is used to establish a mapping between the Linux/ia64 kernel + * and the host linux kernel. + * + * As of today, we support only one card, even though most of the code + * is ready for many more. The mapping is then: + * linux/ia64 -> linux/x86 + * eth0 -> eth1 + * + * In the future, we some string operations, we could easily support up + * to 10 cards (0-9). + * + * The default mapping can be changed on the kernel command line by + * specifying simeth=ethX (or whatever string you want). + */ +static char *simeth_device="eth0"; /* default host interface to use */ + + + +static volatile unsigned int card_count; /* how many cards "found" so far */ +static int simeth_debug; /* set to 1 to get debug information */ + +/* + * Used to catch IFF_UP & IFF_DOWN events + */ +static struct notifier_block simeth_dev_notifier = { + simeth_device_event, + 0 +}; + + +/* + * Function used when using a kernel command line option. + * + * Format: simeth=interface_name (like eth0) + */ +static int __init +simeth_setup(char *str) +{ + simeth_device = str; + return 1; +} + +__setup("simeth=", simeth_setup); + +/* + * Function used to probe for simeth devices when not installed + * as a loadable module + */ + +int __init +simeth_probe (void) +{ + int r; + + printk(KERN_INFO "simeth: v%s\n", simeth_version); + + r = simeth_probe1(); + + if (r == 0) register_netdevice_notifier(&simeth_dev_notifier); + + return r; +} + +extern long ia64_ssc (long, long, long, long, int); +extern void ia64_ssc_connect_irq (long intr, long irq); + +static inline int +netdev_probe(char *name, unsigned char *ether) +{ + return ia64_ssc(__pa(name), __pa(ether), 0,0, SSC_NETDEV_PROBE); +} + + +static inline int +netdev_connect(int irq) +{ + /* XXX Fix me + * this does not support multiple cards + * also no return value + */ + ia64_ssc_connect_irq(NETWORK_INTR, irq); + return 0; +} + +static inline int +netdev_attach(int fd, int irq, unsigned int ipaddr) +{ + /* this puts the host interface in the right mode (start interrupting) */ + return ia64_ssc(fd, ipaddr, 0,0, SSC_NETDEV_ATTACH); +} + + +static inline int +netdev_detach(int fd) +{ + /* + * inactivate the host interface (don't interrupt anymore) */ + return ia64_ssc(fd, 0,0,0, SSC_NETDEV_DETACH); +} + +static inline int +netdev_send(int fd, unsigned char *buf, unsigned int len) +{ + return ia64_ssc(fd, __pa(buf), len, 0, SSC_NETDEV_SEND); +} + +static inline int +netdev_read(int fd, unsigned char *buf, unsigned int len) +{ + return ia64_ssc(fd, __pa(buf), len, 0, SSC_NETDEV_RECV); +} + +/* + * Function shared with module code, so cannot be in init section + * + * So far this function "detects" only one card (test_&_set) but could + * be extended easily. + * + * Return: + * - -ENODEV is no device found + * - -ENOMEM is no more memory + * - 0 otherwise + */ +static int +simeth_probe1(void) +{ + unsigned char mac_addr[ETH_ALEN]; + struct simeth_local *local; + struct net_device *dev; + int fd, i; + + /* + * XXX Fix me + * let's support just one card for now + */ + if (test_and_set_bit(0, &card_count)) + return -ENODEV; + + /* + * check with the simulator for the device + */ + fd = netdev_probe(simeth_device, mac_addr); + if (fd == -1) + return -ENODEV; + + dev = init_etherdev(NULL, sizeof(struct simeth_local)); + if (!dev) + return -ENOMEM; + + memcpy(dev->dev_addr, mac_addr, sizeof(mac_addr)); + + dev->irq = ia64_alloc_vector(); + + /* + * attach the interrupt in the simulator, this does enable interrupts + * until a netdev_attach() is called + */ + netdev_connect(dev->irq); + + memset(dev->priv, 0, sizeof(struct simeth_local)); + + local = dev->priv; + local->simfd = fd; /* keep track of underlying file descriptor */ + + dev->open = simeth_open; + dev->stop = simeth_close; + dev->hard_start_xmit = simeth_tx; + dev->get_stats = simeth_get_stats; + dev->set_multicast_list = set_multicast_list; /* no yet used */ + + /* Fill in the fields of the device structure with ethernet-generic values. */ + ether_setup(dev); + + printk(KERN_INFO "%s: hosteth=%s simfd=%d, HwAddr", + dev->name, simeth_device, local->simfd); + for(i = 0; i < ETH_ALEN; i++) { + printk(" %2.2x", dev->dev_addr[i]); + } + printk(", IRQ %d\n", dev->irq); + + return 0; +} + +/* + * actually binds the device to an interrupt vector + */ +static int +simeth_open(struct net_device *dev) +{ + if (request_irq(dev->irq, simeth_interrupt, 0, "simeth", dev)) { + printk(KERN_WARNING "simeth: unable to get IRQ %d.\n", dev->irq); + return -EAGAIN; + } + + netif_start_queue(dev); + + return 0; +} + +/* copied from lapbether.c */ +static __inline__ int dev_is_ethdev(struct net_device *dev) +{ + return ( dev->type == ARPHRD_ETHER && strncmp(dev->name, "dummy", 5)); +} + + +/* + * Handler for IFF_UP or IFF_DOWN + * + * The reason for that is that we don't want to be interrupted when the + * interface is down. There is no way to unconnect in the simualtor. Instead + * we use this function to shutdown packet processing in the frame filter + * in the simulator. Thus no interrupts are generated + * + * + * That's also the place where we pass the IP address of this device to the + * simulator so that that we can start filtering packets for it + * + * There may be a better way of doing this, but I don't know which yet. + */ +static int +simeth_device_event(struct notifier_block *this,unsigned long event, void *ptr) +{ + struct net_device *dev = (struct net_device *)ptr; + struct simeth_local *local; + struct in_device *in_dev; + struct in_ifaddr **ifap = NULL; + struct in_ifaddr *ifa = NULL; + int r; + + + if ( ! dev ) { + printk(KERN_WARNING "simeth_device_event dev=0\n"); + return NOTIFY_DONE; + } + + if ( event != NETDEV_UP && event != NETDEV_DOWN ) return NOTIFY_DONE; + + /* + * Check whether or not it's for an ethernet device + * + * XXX Fixme: This works only as long as we support one + * type of ethernet device. + */ + if ( !dev_is_ethdev(dev) ) return NOTIFY_DONE; + + if ((in_dev=dev->ip_ptr) != NULL) { + for (ifap=&in_dev->ifa_list; (ifa=*ifap) != NULL; ifap=&ifa->ifa_next) + if (strcmp(dev->name, ifa->ifa_label) == 0) break; + } + if ( ifa == NULL ) { + printk(KERN_ERR "simeth_open: can't find device %s's ifa\n", dev->name); + return NOTIFY_DONE; + } + + printk(KERN_INFO "simeth_device_event: %s ipaddr=0x%x\n", + dev->name, htonl(ifa->ifa_local)); + + /* + * XXX Fix me + * if the device was up, and we're simply reconfiguring it, not sure + * we get DOWN then UP. + */ + + local = dev->priv; + /* now do it for real */ + r = event == NETDEV_UP ? + netdev_attach(local->simfd, dev->irq, htonl(ifa->ifa_local)): + netdev_detach(local->simfd); + + printk(KERN_INFO "simeth: netdev_attach/detach: event=%s ->%d\n", + event == NETDEV_UP ? "attach":"detach", r); + + return NOTIFY_DONE; +} + +static int +simeth_close(struct net_device *dev) +{ + netif_stop_queue(dev); + + free_irq(dev->irq, dev); + + return 0; +} + +/* + * Only used for debug + */ +static void +frame_print(unsigned char *from, unsigned char *frame, int len) +{ + int i; + + printk("%s: (%d) %02x", from, len, frame[0] & 0xff); + for(i=1; i < 6; i++ ) { + printk(":%02x", frame[i] &0xff); + } + printk(" %2x", frame[6] &0xff); + for(i=7; i < 12; i++ ) { + printk(":%02x", frame[i] &0xff); + } + printk(" [%02x%02x]\n", frame[12], frame[13]); + + for(i=14; i < len; i++ ) { + printk("%02x ", frame[i] &0xff); + if ( (i%10)==0) printk("\n"); + } + printk("\n"); +} + + +/* + * Function used to transmit of frame, very last one on the path before + * going to the simulator. + */ +static int +simeth_tx(struct sk_buff *skb, struct net_device *dev) +{ + struct simeth_local *local = (struct simeth_local *)dev->priv; + +#if 0 + /* ensure we have at least ETH_ZLEN bytes (min frame size) */ + unsigned int length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; + /* Where do the extra padding bytes comes from inthe skbuff ? */ +#else + /* the real driver in the host system is going to take care of that + * or maybe it's the NIC itself. + */ + unsigned int length = skb->len; +#endif + + local->stats.tx_bytes += skb->len; + local->stats.tx_packets++; + + + if (simeth_debug > 5) frame_print("simeth_tx", skb->data, length); + + netdev_send(local->simfd, skb->data, length); + + /* + * we are synchronous on write, so we don't simulate a + * trasnmit complete interrupt, thus we don't need to arm a tx + */ + + dev_kfree_skb(skb); + return 0; +} + +static inline struct sk_buff * +make_new_skb(struct net_device *dev) +{ + struct sk_buff *nskb; + + /* + * The +2 is used to make sure that the IP header is nicely + * aligned (on 4byte boundary I assume 14+2=16) + */ + nskb = dev_alloc_skb(SIMETH_FRAME_SIZE + 2); + if ( nskb == NULL ) { + printk(KERN_NOTICE "%s: memory squeeze. dropping packet.\n", dev->name); + return NULL; + } + nskb->dev = dev; + + skb_reserve(nskb, 2); /* Align IP on 16 byte boundaries */ + + skb_put(nskb,SIMETH_FRAME_SIZE); + + return nskb; +} + +/* + * called from interrupt handler to process a received frame + */ +static int +simeth_rx(struct net_device *dev) +{ + struct simeth_local *local; + struct sk_buff *skb; + int len; + int rcv_count = SIMETH_RECV_MAX; + + local = (struct simeth_local *)dev->priv; + /* + * the loop concept has been borrowed from other drivers + * looks to me like it's a throttling thing to avoid pushing to many + * packets at one time into the stack. Making sure we can process them + * upstream and make forward progress overall + */ + do { + if ( (skb=make_new_skb(dev)) == NULL ) { + printk(KERN_NOTICE "%s: memory squeeze. dropping packet.\n", dev->name); + local->stats.rx_dropped++; + return 0; + } + /* + * Read only one frame at a time + */ + len = netdev_read(local->simfd, skb->data, SIMETH_FRAME_SIZE); + if ( len == 0 ) { + if ( simeth_debug > 0 ) printk(KERN_WARNING "%s: count=%d netdev_read=0\n", + dev->name, SIMETH_RECV_MAX-rcv_count); + break; + } +#if 0 + /* + * XXX Fix me + * Should really do a csum+copy here + */ + memcpy(skb->data, frame, len); +#endif + skb->protocol = eth_type_trans(skb, dev); + + if ( simeth_debug > 6 ) frame_print("simeth_rx", skb->data, len); + + /* + * push the packet up & trigger software interrupt + */ + netif_rx(skb); + + local->stats.rx_packets++; + local->stats.rx_bytes += len; + + } while ( --rcv_count ); + + return len; /* 0 = nothing left to read, otherwise, we can try again */ +} + +/* + * Interrupt handler (Yes, we can do it too !!!) + */ +static void +simeth_interrupt(int irq, void *dev_id, struct pt_regs * regs) +{ + struct net_device *dev = dev_id; + + if ( dev == NULL ) { + printk(KERN_WARNING "simeth: irq %d for unknown device\n", irq); + return; + } + + /* + * very simple loop because we get interrupts only when receiving + */ + while (simeth_rx(dev)); +} + +static struct net_device_stats * +simeth_get_stats(struct net_device *dev) +{ + struct simeth_local *local = (struct simeth_local *) dev->priv; + + return &local->stats; +} + +/* fake multicast ability */ +static void +set_multicast_list(struct net_device *dev) +{ + printk(KERN_WARNING "%s: set_multicast_list called\n", dev->name); +} + +#ifdef CONFIG_NET_FASTROUTE +static int +simeth_accept_fastpath(struct net_device *dev, struct dst_entry *dst) +{ + printk(KERN_WARNING "%s: simeth_accept_fastpath called\n", dev->name); + return -1; +} +#endif + +__initcall(simeth_probe); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/drivers/simscsi.c linux-2.4.23-pre8/arch/ia64/drivers/simscsi.c --- linux-2.4.22/arch/ia64/drivers/simscsi.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/drivers/simscsi.c 2003-10-22 22:48:57.000000000 +0000 @@ -0,0 +1,396 @@ +/* + * Simulated SCSI driver. + * + * Copyright (C) 1999, 2001-2003 Hewlett-Packard Co + * David Mosberger-Tang + * Stephane Eranian + * + * 02/01/15 David Mosberger Updated for v2.5.1 + * 99/12/18 David Mosberger Added support for READ10/WRITE10 needed by linux v2.3.33 + */ +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "../drivers/scsi/scsi.h" +#include "../drivers/scsi/sd.h" +#include "../drivers/scsi/hosts.h" +#include "simscsi.h" + +#define DEBUG_SIMSCSI 1 + +/* Simulator system calls: */ + +#define SSC_OPEN 50 +#define SSC_CLOSE 51 +#define SSC_READ 52 +#define SSC_WRITE 53 +#define SSC_GET_COMPLETION 54 +#define SSC_WAIT_COMPLETION 55 + +#define SSC_WRITE_ACCESS 2 +#define SSC_READ_ACCESS 1 + +#if DEBUG_SIMSCSI + int simscsi_debug; +# define DBG simscsi_debug +#else +# define DBG 0 +#endif + +static void simscsi_interrupt (unsigned long val); +DECLARE_TASKLET(simscsi_tasklet, simscsi_interrupt, 0); + +struct disk_req { + unsigned long addr; + unsigned len; +}; + +struct disk_stat { + int fd; + unsigned count; +}; + +extern long ia64_ssc (long arg0, long arg1, long arg2, long arg3, int nr); + +static int desc[16] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; + +static struct queue_entry { + Scsi_Cmnd *sc; +} queue[SIMSCSI_REQ_QUEUE_LEN]; + +static int rd, wr; +static atomic_t num_reqs = ATOMIC_INIT(0); + +/* base name for default disks */ +static char *simscsi_root = DEFAULT_SIMSCSI_ROOT; + +#define MAX_ROOT_LEN 128 + +/* + * used to setup a new base for disk images + * to use /foo/bar/disk[a-z] as disk images + * you have to specify simscsi=/foo/bar/disk on the command line + */ +static int __init +simscsi_setup (char *s) +{ + /* XXX Fix me we may need to strcpy() ? */ + if (strlen(s) > MAX_ROOT_LEN) { + printk(KERN_ERR "simscsi_setup: prefix too long---using default %s\n", + simscsi_root); + } + simscsi_root = s; + return 1; +} + +__setup("simscsi=", simscsi_setup); + +static void +simscsi_interrupt (unsigned long val) +{ + unsigned long flags; + Scsi_Cmnd *sc; + + spin_lock_irqsave(&io_request_lock, flags); + { + while ((sc = queue[rd].sc) != 0) { + atomic_dec(&num_reqs); + queue[rd].sc = 0; + if (DBG) + printk("simscsi_interrupt: done with %ld\n", sc->serial_number); + (*sc->scsi_done)(sc); + rd = (rd + 1) % SIMSCSI_REQ_QUEUE_LEN; + } + } + spin_unlock_irqrestore(&io_request_lock, flags); +} + +int +simscsi_detect (Scsi_Host_Template *templ) +{ + templ->proc_name = "simscsi"; + return 1; /* fake one SCSI host adapter */ +} + +int +simscsi_release (struct Scsi_Host *host) +{ + return 0; /* this is easy... */ +} + +const char * +simscsi_info (struct Scsi_Host *host) +{ + return "simulated SCSI host adapter"; +} + +int +simscsi_biosparam (Disk *disk, kdev_t n, int ip[]) +{ + unsigned capacity = disk->capacity; + + ip[0] = 64; /* heads */ + ip[1] = 32; /* sectors */ + ip[2] = capacity >> 11; /* cylinders */ + return 0; +} + +static void +simscsi_readwrite (Scsi_Cmnd *sc, int mode, unsigned long offset, unsigned long len) +{ + struct disk_stat stat; + struct disk_req req; + + req.addr = __pa(sc->request_buffer); + req.len = len; /* # of bytes to transfer */ + + if (sc->request_bufflen < req.len) + return; + + stat.fd = desc[sc->target]; + if (DBG) + printk("simscsi_%s @ %lx (off %lx)\n", + mode == SSC_READ ? "read":"write", req.addr, offset); + ia64_ssc(stat.fd, 1, __pa(&req), offset, mode); + ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION); + + if (stat.count == req.len) { + sc->result = GOOD; + } else { + sc->result = DID_ERROR << 16; + } +} + +static void +simscsi_sg_readwrite (Scsi_Cmnd *sc, int mode, unsigned long offset) +{ + int list_len = sc->use_sg; + struct scatterlist *sl = (struct scatterlist *)sc->buffer; + struct disk_stat stat; + struct disk_req req; + + stat.fd = desc[sc->target]; + + while (list_len) { + req.addr = __pa(sl->address); + req.len = sl->length; + if (DBG) + printk("simscsi_sg_%s @ %lx (off %lx) use_sg=%d len=%d\n", + mode == SSC_READ ? "read":"write", req.addr, offset, + list_len, sl->length); + ia64_ssc(stat.fd, 1, __pa(&req), offset, mode); + ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION); + + /* should not happen in our case */ + if (stat.count != req.len) { + sc->result = DID_ERROR << 16; + return; + } + offset += sl->length; + sl++; + list_len--; + } + sc->result = GOOD; +} + +/* + * function handling both READ_6/WRITE_6 (non-scatter/gather mode) + * commands. + * Added 02/26/99 S.Eranian + */ +static void +simscsi_readwrite6 (Scsi_Cmnd *sc, int mode) +{ + unsigned long offset; + + offset = (((sc->cmnd[1] & 0x1f) << 16) | (sc->cmnd[2] << 8) | sc->cmnd[3])*512; + if (sc->use_sg > 0) + simscsi_sg_readwrite(sc, mode, offset); + else + simscsi_readwrite(sc, mode, offset, sc->cmnd[4]*512); +} + +static size_t +simscsi_get_disk_size (int fd) +{ + struct disk_stat stat; + size_t bit, sectors = 0; + struct disk_req req; + char buf[512]; + + /* + * This is a bit kludgey: the simulator doesn't provide a direct way of determining + * the disk size, so we do a binary search, assuming a maximum disk size of 4GB. + */ + for (bit = (4UL << 30)/512; bit != 0; bit >>= 1) { + req.addr = __pa(&buf); + req.len = sizeof(buf); + ia64_ssc(fd, 1, __pa(&req), ((sectors | bit) - 1)*512, SSC_READ); + stat.fd = fd; + ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION); + if (stat.count == sizeof(buf)) + sectors |= bit; + } + return sectors - 1; /* return last valid sector number */ +} + +static void +simscsi_readwrite10 (Scsi_Cmnd *sc, int mode) +{ + unsigned long offset; + + offset = ( (sc->cmnd[2] << 24) | (sc->cmnd[3] << 16) + | (sc->cmnd[4] << 8) | (sc->cmnd[5] << 0))*512; + if (sc->use_sg > 0) + simscsi_sg_readwrite(sc, mode, offset); + else + simscsi_readwrite(sc, mode, offset, ((sc->cmnd[7] << 8) | sc->cmnd[8])*512); +} + +int +simscsi_queuecommand (Scsi_Cmnd *sc, void (*done)(Scsi_Cmnd *)) +{ + char fname[MAX_ROOT_LEN+16]; + size_t disk_size; + char *buf; +#if DEBUG_SIMSCSI + register long sp asm ("sp"); + + if (DBG) + printk("simscsi_queuecommand: target=%d,cmnd=%u,sc=%lu,sp=%lx,done=%p\n", + sc->target, sc->cmnd[0], sc->serial_number, sp, done); +#endif + + sc->result = DID_BAD_TARGET << 16; + sc->scsi_done = done; + if (sc->target <= 15 && sc->lun == 0) { + switch (sc->cmnd[0]) { + case INQUIRY: + if (sc->request_bufflen < 35) { + break; + } + sprintf (fname, "%s%c", simscsi_root, 'a' + sc->target); + desc[sc->target] = ia64_ssc(__pa(fname), SSC_READ_ACCESS|SSC_WRITE_ACCESS, + 0, 0, SSC_OPEN); + if (desc[sc->target] < 0) { + /* disk doesn't exist... */ + break; + } + buf = sc->request_buffer; + buf[0] = 0; /* magnetic disk */ + buf[1] = 0; /* not a removable medium */ + buf[2] = 2; /* SCSI-2 compliant device */ + buf[3] = 2; /* SCSI-2 response data format */ + buf[4] = 31; /* additional length (bytes) */ + buf[5] = 0; /* reserved */ + buf[6] = 0; /* reserved */ + buf[7] = 0; /* various flags */ + memcpy(buf + 8, "HP SIMULATED DISK 0.00", 28); + sc->result = GOOD; + break; + + case TEST_UNIT_READY: + sc->result = GOOD; + break; + + case READ_6: + if (desc[sc->target] < 0 ) + break; + simscsi_readwrite6(sc, SSC_READ); + break; + + case READ_10: + if (desc[sc->target] < 0 ) + break; + simscsi_readwrite10(sc, SSC_READ); + break; + + case WRITE_6: + if (desc[sc->target] < 0) + break; + simscsi_readwrite6(sc, SSC_WRITE); + break; + + case WRITE_10: + if (desc[sc->target] < 0) + break; + simscsi_readwrite10(sc, SSC_WRITE); + break; + + + case READ_CAPACITY: + if (desc[sc->target] < 0 || sc->request_bufflen < 8) { + break; + } + buf = sc->request_buffer; + + disk_size = simscsi_get_disk_size(desc[sc->target]); + buf[0] = (disk_size >> 24) & 0xff; + buf[1] = (disk_size >> 16) & 0xff; + buf[2] = (disk_size >> 8) & 0xff; + buf[3] = (disk_size >> 0) & 0xff; + /* set block size of 512 bytes: */ + buf[4] = 0; + buf[5] = 0; + buf[6] = 2; + buf[7] = 0; + sc->result = GOOD; + break; + + case MODE_SENSE: + /* sd.c uses this to determine whether disk does write-caching. */ + memset(sc->request_buffer, 0, 128); + sc->result = GOOD; + break; + + case START_STOP: + printk(KERN_ERR "START_STOP\n"); + break; + + default: + panic("simscsi: unknown SCSI command %u\n", sc->cmnd[0]); + } + } + if (sc->result == DID_BAD_TARGET) { + sc->result |= DRIVER_SENSE << 24; + sc->sense_buffer[0] = 0x70; + sc->sense_buffer[2] = 0x00; + } + if (atomic_read(&num_reqs) >= SIMSCSI_REQ_QUEUE_LEN) { + panic("Attempt to queue command while command is pending!!"); + } + atomic_inc(&num_reqs); + queue[wr].sc = sc; + wr = (wr + 1) % SIMSCSI_REQ_QUEUE_LEN; + + tasklet_schedule(&simscsi_tasklet); + return 0; +} + +int +simscsi_reset (Scsi_Cmnd *cmd, unsigned int reset_flags) +{ + printk(KERN_ERR "simscsi_reset: unimplemented\n"); + return SCSI_RESET_SUCCESS; +} + +int +simscsi_abort (Scsi_Cmnd *cmd) +{ + printk(KERN_ERR "simscsi_abort: unimplemented\n"); + return SCSI_ABORT_SUCCESS; +} + +static Scsi_Host_Template driver_template = SIMSCSI; + +#include "../drivers/scsi/scsi_module.c" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/drivers/simscsi.h linux-2.4.23-pre8/arch/ia64/drivers/simscsi.h --- linux-2.4.22/arch/ia64/drivers/simscsi.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/drivers/simscsi.h 2003-10-22 22:49:00.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * Simulated SCSI driver. + * + * Copyright (C) 1999, 2002 Hewlett-Packard Co + * David Mosberger-Tang + */ +#ifndef SIMSCSI_H +#define SIMSCSI_H + +#define SIMSCSI_REQ_QUEUE_LEN 64 + +#define DEFAULT_SIMSCSI_ROOT "/var/ski-disks/sd" + +extern int simscsi_detect (Scsi_Host_Template *); +extern int simscsi_release (struct Scsi_Host *); +extern const char *simscsi_info (struct Scsi_Host *); +extern int simscsi_queuecommand (Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +extern int simscsi_abort (Scsi_Cmnd *); +extern int simscsi_reset (Scsi_Cmnd *, unsigned int); +extern int simscsi_biosparam (Disk *, kdev_t, int[]); + +#define SIMSCSI { \ + .detect = simscsi_detect, \ + .release = simscsi_release, \ + .info = simscsi_info, \ + .queuecommand = simscsi_queuecommand, \ + .abort = simscsi_abort, \ + .reset = simscsi_reset, \ + .bios_param = simscsi_biosparam, \ + .can_queue = SIMSCSI_REQ_QUEUE_LEN, \ + .this_id = -1, \ + .sg_tablesize = SG_ALL, \ + .cmd_per_lun = SIMSCSI_REQ_QUEUE_LEN, \ + .present = 0, \ + .unchecked_isa_dma = 0, \ + .use_clustering = DISABLE_CLUSTERING \ +} + +#endif /* SIMSCSI_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/drivers/simserial.c linux-2.4.23-pre8/arch/ia64/drivers/simserial.c --- linux-2.4.22/arch/ia64/drivers/simserial.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/drivers/simserial.c 2003-10-22 22:48:13.000000000 +0000 @@ -0,0 +1,1094 @@ +/* + * Simulated Serial Driver (fake serial) + * + * This driver is mostly used for bringup purposes and will go away. + * It has a strong dependency on the system console. All outputs + * are rerouted to the same facility as the one used by printk which, in our + * case means sys_sim.c console (goes via the simulator). The code hereafter + * is completely leveraged from the serial.c driver. + * + * Copyright (C) 1999-2000, 2002-2003 Hewlett-Packard Co + * Stephane Eranian + * David Mosberger-Tang + * + * 02/04/00 D. Mosberger Merged in serial.c bug fixes in rs_close(). + * 02/25/00 D. Mosberger Synced up with 2.3.99pre-5 version of serial.c. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#undef SIMSERIAL_DEBUG /* define this to get some debug information */ + +#define KEYBOARD_INTR 3 /* must match with simulator! */ + +#define NR_PORTS 1 /* only one port for now */ +#define SERIAL_INLINE 1 + +#ifdef SERIAL_INLINE +#define _INLINE_ inline +#endif + +#ifndef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? SA_SHIRQ : SA_INTERRUPT) + +#define SSC_GETCHAR 21 + +extern long ia64_ssc (long, long, long, long, int); +extern void ia64_ssc_connect_irq (long intr, long irq); + +static char *serial_name = "SimSerial driver"; +static char *serial_version = "0.6"; + +/* + * This has been extracted from asm/serial.h. We need one eventually but + * I don't know exactly what we're going to put in it so just fake one + * for now. + */ +#define BASE_BAUD ( 1843200 / 16 ) + +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) + +/* + * Most of the values here are meaningless to this particular driver. + * However some values must be preserved for the code (leveraged from serial.c + * to work correctly). + * port must not be 0 + * type must not be UNKNOWN + * So I picked arbitrary (guess from where?) values instead + */ +static struct serial_state rs_table[NR_PORTS]={ + /* UART CLK PORT IRQ FLAGS */ + { 0, BASE_BAUD, 0x3F8, 0, STD_COM_FLAGS,0,PORT_16550 } /* ttyS0 */ +}; + +/* + * Just for the fun of it ! + */ +static struct serial_uart_config uart_config[] = { + { "unknown", 1, 0 }, + { "8250", 1, 0 }, + { "16450", 1, 0 }, + { "16550", 1, 0 }, + { "16550A", 16, UART_CLEAR_FIFO | UART_USE_FIFO }, + { "cirrus", 1, 0 }, + { "ST16650", 1, UART_CLEAR_FIFO | UART_STARTECH }, + { "ST16650V2", 32, UART_CLEAR_FIFO | UART_USE_FIFO | + UART_STARTECH }, + { "TI16750", 64, UART_CLEAR_FIFO | UART_USE_FIFO}, + { 0, 0} +}; + +static struct tty_driver serial_driver, callout_driver; +static int serial_refcount; + +static struct async_struct *IRQ_ports[NR_IRQS]; +static struct tty_struct *serial_table[NR_PORTS]; +static struct termios *serial_termios[NR_PORTS]; +static struct termios *serial_termios_locked[NR_PORTS]; + +static struct console *console; + +static unsigned char *tmp_buf; +static DECLARE_MUTEX(tmp_buf_sem); + +extern struct console *console_drivers; /* from kernel/printk.c */ + +/* + * ------------------------------------------------------------ + * rs_stop() and rs_start() + * + * This routines are called before setting or resetting tty->stopped. + * They enable or disable transmitter interrupts, as necessary. + * ------------------------------------------------------------ + */ +static void rs_stop(struct tty_struct *tty) +{ +#ifdef SIMSERIAL_DEBUG + printk("rs_stop: tty->stopped=%d tty->hw_stopped=%d tty->flow_stopped=%d\n", + tty->stopped, tty->hw_stopped, tty->flow_stopped); +#endif + +} + +static void rs_start(struct tty_struct *tty) +{ +#if SIMSERIAL_DEBUG + printk("rs_start: tty->stopped=%d tty->hw_stopped=%d tty->flow_stopped=%d\n", + tty->stopped, tty->hw_stopped, tty->flow_stopped); +#endif +} + +static void receive_chars(struct tty_struct *tty, struct pt_regs *regs) +{ + unsigned char ch; + static unsigned char seen_esc = 0; + + while ( (ch = ia64_ssc(0, 0, 0, 0, SSC_GETCHAR)) ) { + if ( ch == 27 && seen_esc == 0 ) { + seen_esc = 1; + continue; + } else { + if ( seen_esc==1 && ch == 'O' ) { + seen_esc = 2; + continue; + } else if ( seen_esc == 2 ) { + if ( ch == 'P' ) show_state(); /* F1 key */ + if ( ch == 'Q' ) show_buffers(); /* F2 key */ + seen_esc = 0; + continue; + } + } + seen_esc = 0; + if (tty->flip.count >= TTY_FLIPBUF_SIZE) break; + + *tty->flip.char_buf_ptr = ch; + + *tty->flip.flag_buf_ptr = 0; + + tty->flip.flag_buf_ptr++; + tty->flip.char_buf_ptr++; + tty->flip.count++; + } + tty_flip_buffer_push(tty); +} + +/* + * This is the serial driver's interrupt routine for a single port + */ +static void rs_interrupt_single(int irq, void *dev_id, struct pt_regs * regs) +{ + struct async_struct * info; + + /* + * I don't know exactly why they don't use the dev_id opaque data + * pointer instead of this extra lookup table + */ + info = IRQ_ports[irq]; + if (!info || !info->tty) { + printk(KERN_INFO "simrs_interrupt_single: info|tty=0 info=%p problem\n", info); + return; + } + /* + * pretty simple in our case, because we only get interrupts + * on inbound traffic + */ + receive_chars(info->tty, regs); +} + +/* + * ------------------------------------------------------------------- + * Here ends the serial interrupt routines. + * ------------------------------------------------------------------- + */ + +#if 0 +/* + * not really used in our situation so keep them commented out for now + */ +static DECLARE_TASK_QUEUE(tq_serial); /* used to be at the top of the file */ +static void do_serial_bh(void) +{ + run_task_queue(&tq_serial); + printk(KERN_ERR "do_serial_bh: called\n"); +} +#endif + +static void do_softint(void *private_) +{ + printk(KERN_ERR "simserial: do_softint called\n"); +} + +static void rs_put_char(struct tty_struct *tty, unsigned char ch) +{ + struct async_struct *info = (struct async_struct *)tty->driver_data; + unsigned long flags; + + if (!tty || !info->xmit.buf) return; + + save_flags(flags); cli(); + if (CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) == 0) { + restore_flags(flags); + return; + } + info->xmit.buf[info->xmit.head] = ch; + info->xmit.head = (info->xmit.head + 1) & (SERIAL_XMIT_SIZE-1); + restore_flags(flags); +} + +static _INLINE_ void transmit_chars(struct async_struct *info, int *intr_done) +{ + int count; + unsigned long flags; + + save_flags(flags); cli(); + + if (info->x_char) { + char c = info->x_char; + + console->write(console, &c, 1); + + info->state->icount.tx++; + info->x_char = 0; + + goto out; + } + + if (info->xmit.head == info->xmit.tail || info->tty->stopped || info->tty->hw_stopped) { +#ifdef SIMSERIAL_DEBUG + printk("transmit_chars: head=%d, tail=%d, stopped=%d\n", + info->xmit.head, info->xmit.tail, info->tty->stopped); +#endif + goto out; + } + /* + * We removed the loop and try to do it in to chunks. We need + * 2 operations maximum because it's a ring buffer. + * + * First from current to tail if possible. + * Then from the beginning of the buffer until necessary + */ + + count = MIN(CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE), + SERIAL_XMIT_SIZE - info->xmit.tail); + console->write(console, info->xmit.buf+info->xmit.tail, count); + + info->xmit.tail = (info->xmit.tail+count) & (SERIAL_XMIT_SIZE-1); + + /* + * We have more at the beginning of the buffer + */ + count = CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); + if (count) { + console->write(console, info->xmit.buf, count); + info->xmit.tail += count; + } +out: + restore_flags(flags); +} + +static void rs_flush_chars(struct tty_struct *tty) +{ + struct async_struct *info = (struct async_struct *)tty->driver_data; + + if (info->xmit.head == info->xmit.tail || tty->stopped || tty->hw_stopped || + !info->xmit.buf) + return; + + transmit_chars(info, NULL); +} + + +static int rs_write(struct tty_struct * tty, int from_user, + const unsigned char *buf, int count) +{ + int c, ret = 0; + struct async_struct *info = (struct async_struct *)tty->driver_data; + unsigned long flags; + + if (!tty || !info->xmit.buf || !tmp_buf) return 0; + + save_flags(flags); + if (from_user) { + down(&tmp_buf_sem); + while (1) { + int c1; + c = CIRC_SPACE_TO_END(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); + if (count < c) + c = count; + if (c <= 0) + break; + + c -= copy_from_user(tmp_buf, buf, c); + if (!c) { + if (!ret) + ret = -EFAULT; + break; + } + cli(); + c1 = CIRC_SPACE_TO_END(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); + if (c1 < c) + c = c1; + memcpy(info->xmit.buf + info->xmit.head, tmp_buf, c); + info->xmit.head = ((info->xmit.head + c) & + (SERIAL_XMIT_SIZE-1)); + restore_flags(flags); + buf += c; + count -= c; + ret += c; + } + up(&tmp_buf_sem); + } else { + cli(); + while (1) { + c = CIRC_SPACE_TO_END(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); + if (count < c) + c = count; + if (c <= 0) { + break; + } + memcpy(info->xmit.buf + info->xmit.head, buf, c); + info->xmit.head = ((info->xmit.head + c) & + (SERIAL_XMIT_SIZE-1)); + buf += c; + count -= c; + ret += c; + } + restore_flags(flags); + } + /* + * Hey, we transmit directly from here in our case + */ + if (CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) + && !tty->stopped && !tty->hw_stopped) { + transmit_chars(info, NULL); + } + return ret; +} + +static int rs_write_room(struct tty_struct *tty) +{ + struct async_struct *info = (struct async_struct *)tty->driver_data; + + return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); +} + +static int rs_chars_in_buffer(struct tty_struct *tty) +{ + struct async_struct *info = (struct async_struct *)tty->driver_data; + + return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE); +} + +static void rs_flush_buffer(struct tty_struct *tty) +{ + struct async_struct *info = (struct async_struct *)tty->driver_data; + unsigned long flags; + + save_flags(flags); cli(); + info->xmit.head = info->xmit.tail = 0; + restore_flags(flags); + + wake_up_interruptible(&tty->write_wait); + + if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && + tty->ldisc.write_wakeup) + (tty->ldisc.write_wakeup)(tty); +} + +/* + * This function is used to send a high-priority XON/XOFF character to + * the device + */ +static void rs_send_xchar(struct tty_struct *tty, char ch) +{ + struct async_struct *info = (struct async_struct *)tty->driver_data; + + info->x_char = ch; + if (ch) { + /* + * I guess we could call console->write() directly but + * let's do that for now. + */ + transmit_chars(info, NULL); + } +} + +/* + * ------------------------------------------------------------ + * rs_throttle() + * + * This routine is called by the upper-layer tty layer to signal that + * incoming characters should be throttled. + * ------------------------------------------------------------ + */ +static void rs_throttle(struct tty_struct * tty) +{ + if (I_IXOFF(tty)) rs_send_xchar(tty, STOP_CHAR(tty)); + + printk(KERN_INFO "simrs_throttle called\n"); +} + +static void rs_unthrottle(struct tty_struct * tty) +{ + struct async_struct *info = (struct async_struct *)tty->driver_data; + + if (I_IXOFF(tty)) { + if (info->x_char) + info->x_char = 0; + else + rs_send_xchar(tty, START_CHAR(tty)); + } + printk(KERN_INFO "simrs_unthrottle called\n"); +} + +/* + * rs_break() --- routine which turns the break handling on or off + */ +static void rs_break(struct tty_struct *tty, int break_state) +{ +} + +static int rs_ioctl(struct tty_struct *tty, struct file * file, + unsigned int cmd, unsigned long arg) +{ + if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) && + (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) && + (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) { + if (tty->flags & (1 << TTY_IO_ERROR)) + return -EIO; + } + + switch (cmd) { + case TIOCMGET: + printk(KERN_INFO "rs_ioctl: TIOCMGET called\n"); + return -EINVAL; + case TIOCMBIS: + case TIOCMBIC: + case TIOCMSET: + printk(KERN_INFO "rs_ioctl: TIOCMBIS/BIC/SET called\n"); + return -EINVAL; + case TIOCGSERIAL: + printk(KERN_INFO "simrs_ioctl TIOCGSERIAL called\n"); + return 0; + case TIOCSSERIAL: + printk(KERN_INFO "simrs_ioctl TIOCSSERIAL called\n"); + return 0; + case TIOCSERCONFIG: + printk(KERN_INFO "rs_ioctl: TIOCSERCONFIG called\n"); + return -EINVAL; + + case TIOCSERGETLSR: /* Get line status register */ + printk(KERN_INFO "rs_ioctl: TIOCSERGETLSR called\n"); + return -EINVAL; + + case TIOCSERGSTRUCT: + printk(KERN_INFO "rs_ioctl: TIOCSERGSTRUCT called\n"); +#if 0 + if (copy_to_user((struct async_struct *) arg, + info, sizeof(struct async_struct))) + return -EFAULT; +#endif + return 0; + + /* + * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change + * - mask passed in arg for lines of interest + * (use |'ed TIOCM_RNG/DSR/CD/CTS for masking) + * Caller should use TIOCGICOUNT to see which one it was + */ + case TIOCMIWAIT: + printk(KERN_INFO "rs_ioctl: TIOCMIWAIT: called\n"); + return 0; + /* + * Get counter of input serial line interrupts (DCD,RI,DSR,CTS) + * Return: write counters to the user passed counter struct + * NB: both 1->0 and 0->1 transitions are counted except for + * RI where only 0->1 is counted. + */ + case TIOCGICOUNT: + printk(KERN_INFO "rs_ioctl: TIOCGICOUNT called\n"); + return 0; + + case TIOCSERGWILD: + case TIOCSERSWILD: + /* "setserial -W" is called in Debian boot */ + printk (KERN_INFO "TIOCSER?WILD ioctl obsolete, ignored.\n"); + return 0; + + default: + return -ENOIOCTLCMD; + } + return 0; +} + +#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) + +static void rs_set_termios(struct tty_struct *tty, struct termios *old_termios) +{ + unsigned int cflag = tty->termios->c_cflag; + + if ( (cflag == old_termios->c_cflag) + && ( RELEVANT_IFLAG(tty->termios->c_iflag) + == RELEVANT_IFLAG(old_termios->c_iflag))) + return; + + + /* Handle turning off CRTSCTS */ + if ((old_termios->c_cflag & CRTSCTS) && + !(tty->termios->c_cflag & CRTSCTS)) { + tty->hw_stopped = 0; + rs_start(tty); + } +} +/* + * This routine will shutdown a serial port; interrupts are disabled, and + * DTR is dropped if the hangup on close termio flag is on. + */ +static void shutdown(struct async_struct * info) +{ + unsigned long flags; + struct serial_state *state; + int retval; + + if (!(info->flags & ASYNC_INITIALIZED)) return; + + state = info->state; + +#ifdef SIMSERIAL_DEBUG + printk("Shutting down serial port %d (irq %d)....", info->line, + state->irq); +#endif + + save_flags(flags); cli(); /* Disable interrupts */ + + /* + * First unlink the serial port from the IRQ chain... + */ + if (info->next_port) + info->next_port->prev_port = info->prev_port; + if (info->prev_port) + info->prev_port->next_port = info->next_port; + else + IRQ_ports[state->irq] = info->next_port; + + /* + * Free the IRQ, if necessary + */ + if (state->irq && (!IRQ_ports[state->irq] || + !IRQ_ports[state->irq]->next_port)) { + if (IRQ_ports[state->irq]) { + free_irq(state->irq, NULL); + retval = request_irq(state->irq, rs_interrupt_single, + IRQ_T(info), "serial", NULL); + + if (retval) + printk(KERN_ERR "serial shutdown: request_irq: error %d" + " Couldn't reacquire IRQ.\n", retval); + } else + free_irq(state->irq, NULL); + } + + if (info->xmit.buf) { + free_page((unsigned long) info->xmit.buf); + info->xmit.buf = 0; + } + + if (info->tty) set_bit(TTY_IO_ERROR, &info->tty->flags); + + info->flags &= ~ASYNC_INITIALIZED; + restore_flags(flags); +} + +/* + * ------------------------------------------------------------ + * rs_close() + * + * This routine is called when the serial port gets closed. First, we + * wait for the last remaining data to be sent. Then, we unlink its + * async structure from the interrupt chain if necessary, and we free + * that IRQ if nothing is left in the chain. + * ------------------------------------------------------------ + */ +static void rs_close(struct tty_struct *tty, struct file * filp) +{ + struct async_struct * info = (struct async_struct *)tty->driver_data; + struct serial_state *state; + unsigned long flags; + + if (!info ) return; + + state = info->state; + + save_flags(flags); cli(); + + if (tty_hung_up_p(filp)) { +#ifdef SIMSERIAL_DEBUG + printk("rs_close: hung_up\n"); +#endif + MOD_DEC_USE_COUNT; + restore_flags(flags); + return; + } +#ifdef SIMSERIAL_DEBUG + printk("rs_close ttys%d, count = %d\n", info->line, state->count); +#endif + if ((tty->count == 1) && (state->count != 1)) { + /* + * Uh, oh. tty->count is 1, which means that the tty + * structure will be freed. state->count should always + * be one in these conditions. If it's greater than + * one, we've got real problems, since it means the + * serial port won't be shutdown. + */ + printk(KERN_ERR "rs_close: bad serial port count; tty->count is 1, " + "state->count is %d\n", state->count); + state->count = 1; + } + if (--state->count < 0) { + printk(KERN_ERR "rs_close: bad serial port count for ttys%d: %d\n", + info->line, state->count); + state->count = 0; + } + if (state->count) { + MOD_DEC_USE_COUNT; + restore_flags(flags); + return; + } + info->flags |= ASYNC_CLOSING; + restore_flags(flags); + + /* + * Now we wait for the transmit buffer to clear; and we notify + * the line discipline to only process XON/XOFF characters. + */ + shutdown(info); + if (tty->driver.flush_buffer) tty->driver.flush_buffer(tty); + if (tty->ldisc.flush_buffer) tty->ldisc.flush_buffer(tty); + info->event = 0; + info->tty = 0; + if (info->blocked_open) { + if (info->close_delay) { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(info->close_delay); + } + wake_up_interruptible(&info->open_wait); + } + info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE|ASYNC_CLOSING); + wake_up_interruptible(&info->close_wait); + MOD_DEC_USE_COUNT; +} + +/* + * rs_wait_until_sent() --- wait until the transmitter is empty + */ +static void rs_wait_until_sent(struct tty_struct *tty, int timeout) +{ +} + + +/* + * rs_hangup() --- called by tty_hangup() when a hangup is signaled. + */ +static void rs_hangup(struct tty_struct *tty) +{ + struct async_struct * info = (struct async_struct *)tty->driver_data; + struct serial_state *state = info->state; + +#ifdef SIMSERIAL_DEBUG + printk("rs_hangup: called\n"); +#endif + + state = info->state; + + rs_flush_buffer(tty); + if (info->flags & ASYNC_CLOSING) + return; + shutdown(info); + + info->event = 0; + state->count = 0; + info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CALLOUT_ACTIVE); + info->tty = 0; + wake_up_interruptible(&info->open_wait); +} + + +static int get_async_struct(int line, struct async_struct **ret_info) +{ + struct async_struct *info; + struct serial_state *sstate; + + sstate = rs_table + line; + sstate->count++; + if (sstate->info) { + *ret_info = sstate->info; + return 0; + } + info = kmalloc(sizeof(struct async_struct), GFP_KERNEL); + if (!info) { + sstate->count--; + return -ENOMEM; + } + memset(info, 0, sizeof(struct async_struct)); + init_waitqueue_head(&info->open_wait); + init_waitqueue_head(&info->close_wait); + init_waitqueue_head(&info->delta_msr_wait); + info->magic = SERIAL_MAGIC; + info->port = sstate->port; + info->flags = sstate->flags; + info->xmit_fifo_size = sstate->xmit_fifo_size; + info->line = line; + info->tqueue.routine = do_softint; + info->tqueue.data = info; + info->state = sstate; + if (sstate->info) { + kfree(info); + *ret_info = sstate->info; + return 0; + } + *ret_info = sstate->info = info; + return 0; +} + +static int +startup(struct async_struct *info) +{ + unsigned long flags; + int retval=0; + void (*handler)(int, void *, struct pt_regs *); + struct serial_state *state= info->state; + unsigned long page; + + page = get_free_page(GFP_KERNEL); + if (!page) + return -ENOMEM; + + save_flags(flags); cli(); + + if (info->flags & ASYNC_INITIALIZED) { + free_page(page); + goto errout; + } + + if (!state->port || !state->type) { + if (info->tty) set_bit(TTY_IO_ERROR, &info->tty->flags); + free_page(page); + goto errout; + } + if (info->xmit.buf) + free_page(page); + else + info->xmit.buf = (unsigned char *) page; + +#ifdef SIMSERIAL_DEBUG + printk("startup: ttys%d (irq %d)...", info->line, state->irq); +#endif + + /* + * Allocate the IRQ if necessary + */ + if (state->irq && (!IRQ_ports[state->irq] || + !IRQ_ports[state->irq]->next_port)) { + if (IRQ_ports[state->irq]) { + retval = -EBUSY; + goto errout; + } else + handler = rs_interrupt_single; + + retval = request_irq(state->irq, handler, IRQ_T(info), "simserial", NULL); + if (retval) { + if (capable(CAP_SYS_ADMIN)) { + if (info->tty) + set_bit(TTY_IO_ERROR, + &info->tty->flags); + retval = 0; + } + goto errout; + } + } + + /* + * Insert serial port into IRQ chain. + */ + info->prev_port = 0; + info->next_port = IRQ_ports[state->irq]; + if (info->next_port) + info->next_port->prev_port = info; + IRQ_ports[state->irq] = info; + + if (info->tty) clear_bit(TTY_IO_ERROR, &info->tty->flags); + + info->xmit.head = info->xmit.tail = 0; + +#if 0 + /* + * Set up serial timers... + */ + timer_table[RS_TIMER].expires = jiffies + 2*HZ/100; + timer_active |= 1 << RS_TIMER; +#endif + + /* + * Set up the tty->alt_speed kludge + */ + if (info->tty) { + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) + info->tty->alt_speed = 57600; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) + info->tty->alt_speed = 115200; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) + info->tty->alt_speed = 230400; + if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) + info->tty->alt_speed = 460800; + } + + info->flags |= ASYNC_INITIALIZED; + restore_flags(flags); + return 0; + +errout: + restore_flags(flags); + return retval; +} + + +/* + * This routine is called whenever a serial port is opened. It + * enables interrupts for a serial port, linking in its async structure into + * the IRQ chain. It also performs the serial-specific + * initialization for the tty structure. + */ +static int rs_open(struct tty_struct *tty, struct file * filp) +{ + struct async_struct *info; + int retval, line; + unsigned long page; + + MOD_INC_USE_COUNT; + line = MINOR(tty->device) - tty->driver.minor_start; + if ((line < 0) || (line >= NR_PORTS)) { + MOD_DEC_USE_COUNT; + return -ENODEV; + } + retval = get_async_struct(line, &info); + if (retval) { + MOD_DEC_USE_COUNT; + return retval; + } + tty->driver_data = info; + info->tty = tty; + +#ifdef SIMSERIAL_DEBUG + printk("rs_open %s%d, count = %d\n", tty->driver.name, info->line, + info->state->count); +#endif + info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; + + if (!tmp_buf) { + page = get_free_page(GFP_KERNEL); + if (!page) { + /* MOD_DEC_USE_COUNT; "info->tty" will cause this? */ + return -ENOMEM; + } + if (tmp_buf) + free_page(page); + else + tmp_buf = (unsigned char *) page; + } + + /* + * If the port is the middle of closing, bail out now + */ + if (tty_hung_up_p(filp) || + (info->flags & ASYNC_CLOSING)) { + if (info->flags & ASYNC_CLOSING) + interruptible_sleep_on(&info->close_wait); + /* MOD_DEC_USE_COUNT; "info->tty" will cause this? */ +#ifdef SERIAL_DO_RESTART + return ((info->flags & ASYNC_HUP_NOTIFY) ? + -EAGAIN : -ERESTARTSYS); +#else + return -EAGAIN; +#endif + } + + /* + * Start up serial port + */ + retval = startup(info); + if (retval) { + /* MOD_DEC_USE_COUNT; "info->tty" will cause this? */ + return retval; + } + + if ((info->state->count == 1) && + (info->flags & ASYNC_SPLIT_TERMIOS)) { + if (tty->driver.subtype == SERIAL_TYPE_NORMAL) + *tty->termios = info->state->normal_termios; + else + *tty->termios = info->state->callout_termios; + } + + /* + * figure out which console to use (should be one already) + */ + console = console_drivers; + while (console) { + if ((console->flags & CON_ENABLED) && console->write) break; + console = console->next; + } + + info->session = current->session; + info->pgrp = current->pgrp; + +#ifdef SIMSERIAL_DEBUG + printk("rs_open ttys%d successful\n", info->line); +#endif + return 0; +} + +/* + * /proc fs routines.... + */ + +static inline int line_info(char *buf, struct serial_state *state) +{ + return sprintf(buf, "%d: uart:%s port:%lX irq:%d\n", + state->line, uart_config[state->type].name, + state->port, state->irq); +} + +static int rs_read_proc(char *page, char **start, off_t off, int count, + int *eof, void *data) +{ + int i, len = 0, l; + off_t begin = 0; + + len += sprintf(page, "simserinfo:1.0 driver:%s\n", serial_version); + for (i = 0; i < NR_PORTS && len < 4000; i++) { + l = line_info(page + len, &rs_table[i]); + len += l; + if (len+begin > off+count) + goto done; + if (len+begin < off) { + begin += len; + len = 0; + } + } + *eof = 1; +done: + if (off >= len+begin) + return 0; + *start = page + (begin-off); + return ((count < begin+len-off) ? count : begin+len-off); +} + +/* + * --------------------------------------------------------------------- + * rs_init() and friends + * + * rs_init() is called at boot-time to initialize the serial driver. + * --------------------------------------------------------------------- + */ + +/* + * This routine prints out the appropriate serial driver version + * number, and identifies which options were configured into this + * driver. + */ +static inline void show_serial_version(void) +{ + printk(KERN_INFO "%s version %s with", serial_name, serial_version); + printk(KERN_INFO " no serial options enabled\n"); +} + +/* + * The serial driver boot-time initialization code! + */ +static int __init +simrs_init (void) +{ + int i; + struct serial_state *state; + + show_serial_version(); + + /* Initialize the tty_driver structure */ + + memset(&serial_driver, 0, sizeof(struct tty_driver)); + serial_driver.magic = TTY_DRIVER_MAGIC; + serial_driver.driver_name = "simserial"; + serial_driver.name = "ttyS"; + serial_driver.major = TTY_MAJOR; + serial_driver.minor_start = 64; + serial_driver.num = 1; + serial_driver.type = TTY_DRIVER_TYPE_SERIAL; + serial_driver.subtype = SERIAL_TYPE_NORMAL; + serial_driver.init_termios = tty_std_termios; + serial_driver.init_termios.c_cflag = + B9600 | CS8 | CREAD | HUPCL | CLOCAL; + serial_driver.flags = TTY_DRIVER_REAL_RAW; + serial_driver.refcount = &serial_refcount; + serial_driver.table = serial_table; + serial_driver.termios = serial_termios; + serial_driver.termios_locked = serial_termios_locked; + + serial_driver.open = rs_open; + serial_driver.close = rs_close; + serial_driver.write = rs_write; + serial_driver.put_char = rs_put_char; + serial_driver.flush_chars = rs_flush_chars; + serial_driver.write_room = rs_write_room; + serial_driver.chars_in_buffer = rs_chars_in_buffer; + serial_driver.flush_buffer = rs_flush_buffer; + serial_driver.ioctl = rs_ioctl; + serial_driver.throttle = rs_throttle; + serial_driver.unthrottle = rs_unthrottle; + serial_driver.send_xchar = rs_send_xchar; + serial_driver.set_termios = rs_set_termios; + serial_driver.stop = rs_stop; + serial_driver.start = rs_start; + serial_driver.hangup = rs_hangup; + serial_driver.break_ctl = rs_break; + serial_driver.wait_until_sent = rs_wait_until_sent; + serial_driver.read_proc = rs_read_proc; + + /* + * Let's have a little bit of fun ! + */ + for (i = 0, state = rs_table; i < NR_PORTS; i++,state++) { + + if (state->type == PORT_UNKNOWN) continue; + + if (!state->irq) { + state->irq = ia64_alloc_vector(); + ia64_ssc_connect_irq(KEYBOARD_INTR, state->irq); + } + + printk(KERN_INFO "ttyS%02d at 0x%04lx (irq = %d) is a %s\n", + state->line, + state->port, state->irq, + uart_config[state->type].name); + } + /* + * The callout device is just like normal device except for + * major number and the subtype code. + */ + callout_driver = serial_driver; + callout_driver.name = "cua"; + callout_driver.major = TTYAUX_MAJOR; + callout_driver.subtype = SERIAL_TYPE_CALLOUT; + callout_driver.read_proc = 0; + callout_driver.proc_entry = 0; + + if (tty_register_driver(&serial_driver)) + panic("Couldn't register simserial driver\n"); + + if (tty_register_driver(&callout_driver)) + panic("Couldn't register callout driver\n"); + + return 0; +} + +#ifndef MODULE +__initcall(simrs_init); +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/hp/common/sba_iommu.c linux-2.4.23-pre8/arch/ia64/hp/common/sba_iommu.c --- linux-2.4.22/arch/ia64/hp/common/sba_iommu.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/hp/common/sba_iommu.c 2003-10-22 22:49:05.000000000 +0000 @@ -1895,22 +1895,26 @@ struct ioc *ioc; acpi_status status; u64 hpa, length; - acpi_device_info dev_info; + struct acpi_buffer buffer; + struct acpi_device_info *dev_info; status = acpi_hp_csr_space(device->handle, &hpa, &length); if (ACPI_FAILURE(status)) return 1; - status = acpi_get_object_info(device->handle, &dev_info); + buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; + status = acpi_get_object_info(device->handle, &buffer); if (ACPI_FAILURE(status)) return 1; + dev_info = buffer.pointer; /* * For HWP0001, only SBA appears in ACPI namespace. It encloses the PCI * root bridges, and its CSR space includes the IOC function. */ - if (strncmp("HWP0001", dev_info.hardware_id, 7) == 0) + if (strncmp("HWP0001", dev_info->hardware_id.value, 7) == 0) hpa += ZX1_IOC_OFFSET; + ACPI_MEM_FREE(dev_info); ioc = ioc_init(hpa, device->handle); if (!ioc) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/hp/zx1/hpzx1_misc.c linux-2.4.23-pre8/arch/ia64/hp/zx1/hpzx1_misc.c --- linux-2.4.22/arch/ia64/hp/zx1/hpzx1_misc.c 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/hp/zx1/hpzx1_misc.c 2003-10-22 22:49:10.000000000 +0000 @@ -210,7 +210,7 @@ { u64 csr_base = 0, csr_length = 0; acpi_status status; - NATIVE_UINT busnum; + acpi_native_uint busnum; char *name = context; char fullname[32]; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/ia32/ia32_signal.c linux-2.4.23-pre8/arch/ia64/ia32/ia32_signal.c --- linux-2.4.22/arch/ia64/ia32/ia32_signal.c 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/ia32/ia32_signal.c 2003-10-22 22:47:31.000000000 +0000 @@ -171,8 +171,10 @@ * datasel ar.fdr(32:47) * * _st[(0+TOS)%8] f8 - * _st[(1+TOS)%8] f9 (f8, f9 from ptregs) - * : : : (f10..f15 from live reg) + * _st[(1+TOS)%8] f9 + * _st[(2+TOS)%8] f10 + * _st[(3+TOS)%8] f11 (f8..f11 from ptregs) + * : : : (f12..f15 from live reg) * : : : * _st[(7+TOS)%8] f15 TOS=sw.top(bits11:13) * @@ -254,8 +256,8 @@ __put_user( 0, &save->magic); //#define X86_FXSR_MAGIC 0x0000 /* - * save f8 and f9 from pt_regs - * save f10..f15 from live register set + * save f8..f11 from pt_regs + * save f12..f15 from live register set */ /* * Find the location where f8 has to go in fp reg stack. This depends on @@ -270,11 +272,11 @@ copy_to_user(&save->_st[(0+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); ia64f2ia32f(fpregp, &ptp->f9); copy_to_user(&save->_st[(1+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); - - __stfe(fpregp, 10); + ia64f2ia32f(fpregp, &ptp->f10); copy_to_user(&save->_st[(2+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); - __stfe(fpregp, 11); + ia64f2ia32f(fpregp, &ptp->f11); copy_to_user(&save->_st[(3+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); + __stfe(fpregp, 12); copy_to_user(&save->_st[(4+fr8_st_map)&0x7], fpregp, sizeof(struct _fpreg_ia32)); __stfe(fpregp, 13); @@ -386,8 +388,8 @@ asm volatile ( "mov ar.fdr=%0;" :: "r"(fdr)); /* - * restore f8, f9 onto pt_regs - * restore f10..f15 onto live registers + * restore f8..f11 onto pt_regs + * restore f12..f15 onto live registers */ /* * Find the location where f8 has to go in fp reg stack. This depends on @@ -403,11 +405,11 @@ ia32f2ia64f(&ptp->f8, fpregp); copy_from_user(fpregp, &save->_st[(1+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); ia32f2ia64f(&ptp->f9, fpregp); - copy_from_user(fpregp, &save->_st[(2+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); - __ldfe(10, fpregp); + ia32f2ia64f(&ptp->f10, fpregp); copy_from_user(fpregp, &save->_st[(3+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); - __ldfe(11, fpregp); + ia32f2ia64f(&ptp->f11, fpregp); + copy_from_user(fpregp, &save->_st[(4+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); __ldfe(12, fpregp); copy_from_user(fpregp, &save->_st[(5+fr8_st_map)&0x7], sizeof(struct _fpreg_ia32)); @@ -739,11 +741,11 @@ #define COPY(ia64x, ia32x) err |= __get_user(regs->ia64x, &sc->ia32x) -#define copyseg_gs(tmp) (regs->r16 |= (unsigned long) tmp << 48) -#define copyseg_fs(tmp) (regs->r16 |= (unsigned long) tmp << 32) +#define copyseg_gs(tmp) (regs->r16 |= (unsigned long) (tmp) << 48) +#define copyseg_fs(tmp) (regs->r16 |= (unsigned long) (tmp) << 32) #define copyseg_cs(tmp) (regs->r17 |= tmp) -#define copyseg_ss(tmp) (regs->r17 |= (unsigned long) tmp << 16) -#define copyseg_es(tmp) (regs->r16 |= (unsigned long) tmp << 16) +#define copyseg_ss(tmp) (regs->r17 |= (unsigned long) (tmp) << 16) +#define copyseg_es(tmp) (regs->r16 |= (unsigned long) (tmp) << 16) #define copyseg_ds(tmp) (regs->r16 |= tmp) #define COPY_SEG(seg) \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/ia32/ia32_support.c linux-2.4.23-pre8/arch/ia64/ia32/ia32_support.c --- linux-2.4.22/arch/ia64/ia32/ia32_support.c 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/ia32/ia32_support.c 2003-10-22 22:47:39.000000000 +0000 @@ -60,30 +60,26 @@ regs->r27 = load_desc(regs->r16 >> 0); /* DSD */ regs->r28 = load_desc(regs->r16 >> 32); /* FSD */ regs->r29 = load_desc(regs->r16 >> 48); /* GSD */ - task->thread.csd = load_desc(regs->r17 >> 0); /* CSD */ - task->thread.ssd = load_desc(regs->r17 >> 16); /* SSD */ + regs->ar_csd = load_desc(regs->r17 >> 0); /* CSD */ + regs->ar_ssd = load_desc(regs->r17 >> 16); /* SSD */ } void ia32_save_state (struct task_struct *t) { - unsigned long eflag, fsr, fcr, fir, fdr, csd, ssd; + unsigned long eflag, fsr, fcr, fir, fdr; asm ("mov %0=ar.eflag;" "mov %1=ar.fsr;" "mov %2=ar.fcr;" "mov %3=ar.fir;" "mov %4=ar.fdr;" - "mov %5=ar.csd;" - "mov %6=ar.ssd;" - : "=r"(eflag), "=r"(fsr), "=r"(fcr), "=r"(fir), "=r"(fdr), "=r"(csd), "=r"(ssd)); + : "=r"(eflag), "=r"(fsr), "=r"(fcr), "=r"(fir), "=r"(fdr)); t->thread.eflag = eflag; t->thread.fsr = fsr; t->thread.fcr = fcr; t->thread.fir = fir; t->thread.fdr = fdr; - t->thread.csd = csd; - t->thread.ssd = ssd; ia64_set_kr(IA64_KR_IO_BASE, t->thread.old_iob); ia64_set_kr(IA64_KR_TSSD, t->thread.old_k1); } @@ -91,7 +87,7 @@ void ia32_load_state (struct task_struct *t) { - unsigned long eflag, fsr, fcr, fir, fdr, csd, ssd, tssd; + unsigned long eflag, fsr, fcr, fir, fdr, tssd; struct pt_regs *regs = ia64_task_regs(t); int nr = smp_processor_id(); /* LDT and TSS depend on CPU number: */ @@ -100,8 +96,6 @@ fcr = t->thread.fcr; fir = t->thread.fir; fdr = t->thread.fdr; - csd = t->thread.csd; - ssd = t->thread.ssd; tssd = load_desc(_TSS(nr)); /* TSSD */ asm volatile ("mov ar.eflag=%0;" @@ -109,9 +103,7 @@ "mov ar.fcr=%2;" "mov ar.fir=%3;" "mov ar.fdr=%4;" - "mov ar.csd=%5;" - "mov ar.ssd=%6;" - :: "r"(eflag), "r"(fsr), "r"(fcr), "r"(fir), "r"(fdr), "r"(csd), "r"(ssd)); + :: "r"(eflag), "r"(fsr), "r"(fcr), "r"(fir), "r"(fdr)); current->thread.old_iob = ia64_get_kr(IA64_KR_IO_BASE); current->thread.old_k1 = ia64_get_kr(IA64_KR_TSSD); ia64_set_kr(IA64_KR_IO_BASE, IA32_IOBASE); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/ia32/sys_ia32.c linux-2.4.23-pre8/arch/ia64/ia32/sys_ia32.c --- linux-2.4.22/arch/ia64/ia32/sys_ia32.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/ia32/sys_ia32.c 2003-10-22 22:49:05.000000000 +0000 @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -165,9 +166,9 @@ current->thread.map_base = old_map_base; current->thread.task_size = old_task_size; set_fs(USER_DS); /* establish new task-size as the address-limit */ - out: - kfree(av); } + out: + kfree(av); return r; } @@ -2147,7 +2148,6 @@ #define SEMOP 1 #define SEMGET 2 #define SEMCTL 3 -#define SEMTIMEDOP 4 #define MSGSND 11 #define MSGRCV 12 #define MSGGET 13 @@ -2579,17 +2579,6 @@ return err; } -static long -semtimedop32(int semid, struct sembuf *tsems, int nsems, - const struct timespec32 *timeout32) -{ - struct timespec t; - if (get_user (t.tv_sec, &timeout32->tv_sec) || - get_user (t.tv_nsec, &timeout32->tv_nsec)) - return -EFAULT; - return sys_semtimedop(semid, tsems, nsems, &t); -} - asmlinkage long sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth) { @@ -2601,11 +2590,7 @@ switch (call) { case SEMOP: /* struct sembuf is the same on 32 and 64bit :)) */ - return sys_semtimedop(first, (struct sembuf *)AA(ptr), second, - NULL); - case SEMTIMEDOP: - return semtimedop32(first, (struct sembuf *)AA(ptr), second, - (const struct timespec32 *)AA(fifth)); + return sys_semop(first, (struct sembuf *)AA(ptr), second); case SEMGET: return sys_semget(first, second, third); case SEMCTL: @@ -2903,12 +2888,16 @@ ia64f2ia32f(f, &ptp->f9); break; case 2: + ia64f2ia32f(f, &ptp->f10); + break; case 3: + ia64f2ia32f(f, &ptp->f11); + break; case 4: case 5: case 6: case 7: - ia64f2ia32f(f, &swp->f10 + (regno - 2)); + ia64f2ia32f(f, &swp->f12 + (regno - 4)); break; } copy_to_user(reg, f, sizeof(*reg)); @@ -2929,12 +2918,16 @@ copy_from_user(&ptp->f9, reg, sizeof(*reg)); break; case 2: + copy_from_user(&ptp->f10, reg, sizeof(*reg)); + break; case 3: + copy_from_user(&ptp->f11, reg, sizeof(*reg)); + break; case 4: case 5: case 6: case 7: - copy_from_user(&swp->f10 + (regno - 2), reg, sizeof(*reg)); + copy_from_user(&swp->f12 + (regno - 4), reg, sizeof(*reg)); break; } return; @@ -3635,9 +3628,11 @@ return -EFAULT; old_fs = get_fs(); set_fs(KERNEL_DS); - ret = sys_fcntl(fd, cmd, (unsigned long) &f); + ret = sys_fcntl(fd, (cmd == F_GETLK64) ? F_GETLK : + ((cmd == F_SETLK64) ? F_SETLK : F_SETLKW), + (unsigned long) &f); set_fs(old_fs); - if (cmd == F_GETLK && ia32_put_flock(&f, arg)) + if (cmd == F_GETLK64 && ia32_put_flock(&f, arg)) return -EFAULT; break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/Makefile linux-2.4.23-pre8/arch/ia64/kernel/Makefile --- linux-2.4.22/arch/ia64/kernel/Makefile 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/Makefile 2003-10-22 22:48:54.000000000 +0000 @@ -17,6 +17,7 @@ machvec.o pal.o process.o perfmon.o ptrace.o sal.o salinfo.o semaphore.o setup.o \ signal.o sys_ia64.o traps.o time.o unaligned.o unwind.o obj-$(CONFIG_IA64_GENERIC) += iosapic.o +obj-$(CONFIG_IA64_SGI_SN2) += iosapic.o obj-$(CONFIG_IA64_HP_ZX1) += iosapic.o obj-$(CONFIG_IA64_DIG) += iosapic.o obj-$(CONFIG_IA64_PALINFO) += palinfo.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/acpi.c linux-2.4.23-pre8/arch/ia64/kernel/acpi.c --- linux-2.4.22/arch/ia64/kernel/acpi.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/acpi.c 2003-10-22 22:48:55.000000000 +0000 @@ -8,6 +8,9 @@ * Copyright (C) 2000 Intel Corp. * Copyright (C) 2000,2001 J.I. Lee * Copyright (C) 2001 Paul Diefenbaugh + * Copyright (C) 2001 Jenna Hall + * Copyright (C) 2001 Takayoshi Kochi + * Copyright (C) 2002 Erich Focht * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * @@ -38,11 +41,14 @@ #include #include #include +#include +#include #include #include #include #include #include +#include #define PREFIX "ACPI: " @@ -59,6 +65,8 @@ unsigned char acpi_kbd_controller_present = 1; +int acpi_disabled __initdata; /* XXX this shouldn't be needed---we can't boot without ACPI! */ + const char * acpi_get_sysname (void) { @@ -90,6 +98,9 @@ if (!strcmp(hdr->oem_id, "HP")) { return "hpzx1"; } + else if (!strcmp(hdr->oem_id, "SGI")) { + return "sn2"; + } return "dig"; #else @@ -97,8 +108,6 @@ return "hpsim"; # elif defined (CONFIG_IA64_HP_ZX1) return "hpzx1"; -# elif defined (CONFIG_IA64_SGI_SN1) - return "sn1"; # elif defined (CONFIG_IA64_SGI_SN2) return "sn2"; # elif defined (CONFIG_IA64_DIG) @@ -123,17 +132,17 @@ }; acpi_status -acpi_vendor_resource_match(acpi_resource *resource, void *context) +acpi_vendor_resource_match (struct acpi_resource *resource, void *context) { struct acpi_vendor_info *info = (struct acpi_vendor_info *) context; - acpi_resource_vendor *vendor; + struct acpi_resource_vendor *vendor; struct acpi_vendor_descriptor *descriptor; u32 length; if (resource->id != ACPI_RSTYPE_VENDOR) return AE_OK; - vendor = (acpi_resource_vendor *) &resource->data; + vendor = (struct acpi_resource_vendor *) &resource->data; descriptor = (struct acpi_vendor_descriptor *) vendor->reserved; if (vendor->length <= sizeof(*info->descriptor) || descriptor->guid_id != info->descriptor->guid_id || @@ -151,7 +160,7 @@ } acpi_status -acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor *id, +acpi_find_vendor_resource (acpi_handle obj, struct acpi_vendor_descriptor *id, u8 **data, u32 *length) { struct acpi_vendor_info info; @@ -174,12 +183,11 @@ }; acpi_status -acpi_hp_csr_space(acpi_handle obj, u64 *csr_base, u64 *csr_length) +acpi_hp_csr_space (acpi_handle obj, u64 *csr_base, u64 *csr_length) { acpi_status status; u8 *data; u32 length; - int i; status = acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data, &length); @@ -200,7 +208,9 @@ #define ACPI_MAX_PLATFORM_INTERRUPTS 256 /* Array to record platform interrupt vectors for generic interrupt routing. */ -int platform_intr_list[ACPI_MAX_PLATFORM_INTERRUPTS] = { [0 ... ACPI_MAX_PLATFORM_INTERRUPTS - 1] = -1 }; +int platform_intr_list[ACPI_MAX_PLATFORM_INTERRUPTS] = { + [0 ... ACPI_MAX_PLATFORM_INTERRUPTS - 1] = -1 +}; enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_IOSAPIC; @@ -214,7 +224,7 @@ int vector = -1; if (int_type < ACPI_MAX_PLATFORM_INTERRUPTS) { - /* correctable platform error interrupt */ + /* corrected platform error interrupt */ vector = platform_intr_list[int_type]; } else printk(KERN_ERR "acpi_request_vector(): invalid interrupt type\n"); @@ -252,7 +262,6 @@ iounmap((void *) ipi_base_addr); ipi_base_addr = (unsigned long) ioremap(lapic->address, 0); } - return 0; } @@ -261,7 +270,6 @@ acpi_parse_lsapic (acpi_table_entry_header *header) { struct acpi_table_lsapic *lsapic; - int phys_id; lsapic = (struct acpi_table_lsapic *) header; if (!lsapic) @@ -269,30 +277,21 @@ acpi_table_print_madt_entry(header); - phys_id = (lsapic->id << 8) | lsapic->eid; - - if (total_cpus == NR_CPUS) { - printk(KERN_ERR PREFIX "Ignoring CPU (0x%04x) (NR_CPUS == %d)\n", - phys_id, NR_CPUS); - return 0; - } - - printk(KERN_INFO "CPU %d (0x%04x)", total_cpus, phys_id); + printk(KERN_INFO "CPU %d (0x%04x)", total_cpus, (lsapic->id << 8) | lsapic->eid); - if (lsapic->flags.enabled) { - available_cpus++; + if (!lsapic->flags.enabled) + printk(" disabled"); + else if (available_cpus >= NR_CPUS) + printk(" ignored (increase NR_CPUS)"); + else { printk(" enabled"); #ifdef CONFIG_SMP - smp_boot_data.cpu_phys_id[total_cpus] = phys_id; - if (hard_smp_processor_id() == smp_boot_data.cpu_phys_id[total_cpus]) + smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | lsapic->eid; + if (hard_smp_processor_id() + == (unsigned int) smp_boot_data.cpu_phys_id[available_cpus]) printk(" (BSP)"); #endif - } - else { - printk(" disabled"); -#ifdef CONFIG_SMP - smp_boot_data.cpu_phys_id[total_cpus] = -1; -#endif + ++available_cpus; } printk("\n"); @@ -314,7 +313,6 @@ acpi_table_print_madt_entry(header); /* TBD: Support lapic_nmi entries */ - return 0; } @@ -405,7 +403,6 @@ acpi_table_print_madt_entry(header); /* TBD: Support nimsrc entries */ - return 0; } @@ -437,22 +434,209 @@ } +#ifdef CONFIG_ACPI_NUMA + +#define PXM_FLAG_LEN ((MAX_PXM_DOMAINS + 1)/32) + +static int __initdata srat_num_cpus; /* number of cpus */ +static u32 __initdata pxm_flag[PXM_FLAG_LEN]; +#define pxm_bit_set(bit) (set_bit(bit,(void *)pxm_flag)) +#define pxm_bit_test(bit) (test_bit(bit,(void *)pxm_flag)) +/* maps to convert between proximity domain and logical node ID */ +int __initdata pxm_to_nid_map[MAX_PXM_DOMAINS]; +int __initdata nid_to_pxm_map[NR_NODES]; +struct acpi_table_slit __initdata *slit_table; + +/* + * ACPI 2.0 SLIT (System Locality Information Table) + * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf + */ +void __init +acpi_numa_slit_init (struct acpi_table_slit *slit) +{ + u32 len; + + len = sizeof(struct acpi_table_header) + 8 + + slit->localities * slit->localities; + if (slit->header.length != len) { + printk("KERN_INFO ACPI 2.0 SLIT: size mismatch: %d expected, %d actual\n", + len, slit->header.length); + memset(numa_slit, 10, sizeof(numa_slit)); + return; + } + slit_table = slit; +} + +void __init +acpi_numa_processor_affinity_init (struct acpi_table_processor_affinity *pa) +{ + /* record this node in proximity bitmap */ + pxm_bit_set(pa->proximity_domain); + + node_cpuid[srat_num_cpus].phys_id = (pa->apic_id << 8) | (pa->lsapic_eid); + /* nid should be overridden as logical node id later */ + node_cpuid[srat_num_cpus].nid = pa->proximity_domain; + srat_num_cpus++; +} + +void __init +acpi_numa_memory_affinity_init (struct acpi_table_memory_affinity *ma) +{ + unsigned long paddr, size, hole_size, min_hole_size; + u8 pxm; + struct node_memblk_s *p, *q, *pend; + + pxm = ma->proximity_domain; + + /* fill node memory chunk structure */ + paddr = ma->base_addr_hi; + paddr = (paddr << 32) | ma->base_addr_lo; + 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; + + /* + * When the chunk is not the first one in the node, check distance + * from the other chunks. When the hole is too huge ignore the chunk. + * This restriction should be removed when multiple chunks per node + * is supported. + */ + pend = &node_memblk[num_memblks]; + min_hole_size = 0; + for (p = &node_memblk[0]; p < pend; p++) { + if (p->nid != pxm) + continue; + if (p->start_paddr < paddr) + hole_size = paddr - (p->start_paddr + p->size); + else + hole_size = p->start_paddr - (paddr + size); + + if (!min_hole_size || hole_size < min_hole_size) + min_hole_size = hole_size; + } + +#if 0 /* test */ + if (min_hole_size) { + if (min_hole_size > size) { + printk(KERN_ERR "Too huge memory hole. Ignoring %ld MBytes at %lx\n", + size/(1024*1024), paddr); + return; + } + } +#endif + + /* record this node in proximity bitmap */ + pxm_bit_set(pxm); + + /* Insertion sort based on base address */ + pend = &node_memblk[num_memblks]; + for (p = &node_memblk[0]; p < pend; p++) { + if (paddr < p->start_paddr) + break; + } + if (p < pend) { + for (q = pend; q >= p; q--) + *(q + 1) = *q; + } + p->start_paddr = paddr; + p->size = size; + p->nid = pxm; + num_memblks++; +} + +void __init +acpi_numa_arch_fixup(void) +{ + int i, j, node_from, node_to; + + if (srat_num_cpus == 0) { + node_cpuid[0].phys_id = hard_smp_processor_id(); + return; + } + + /* calculate total number of nodes in system from PXM bitmap */ + numnodes = 0; /* init total nodes in system */ + + memset(pxm_to_nid_map, -1, sizeof(pxm_to_nid_map)); + memset(nid_to_pxm_map, -1, sizeof(nid_to_pxm_map)); + for (i = 0; i < MAX_PXM_DOMAINS; i++) { + if (pxm_bit_test(i)) { + pxm_to_nid_map[i] = numnodes; + nid_to_pxm_map[numnodes++] = i; + } + } + + /* set logical node id in memory chunk structure */ + for (i = 0; i < num_memblks; i++) + node_memblk[i].nid = pxm_to_nid_map[node_memblk[i].nid]; + + /* assign memory bank numbers for each chunk on each node */ + for (i = 0; i < numnodes; i++) { + int bank; + + bank = 0; + for (j = 0; j < num_memblks; j++) + if (node_memblk[j].nid == i) + node_memblk[j].bank = bank++; + } + + /* set logical node id in cpu structure */ + for (i = 0; i < srat_num_cpus; i++) + 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); + + if (!slit_table) return; + memset(numa_slit, -1, sizeof(numa_slit)); + for (i=0; ilocalities; i++) { + if (!pxm_bit_test(i)) + continue; + node_from = pxm_to_nid_map[i]; + for (j=0; jlocalities; j++) { + if (!pxm_bit_test(j)) + continue; + node_to = pxm_to_nid_map[j]; + node_distance(node_from, node_to) = + slit_table->entry[i*slit_table->localities + j]; + } + } + +#ifdef SLIT_DEBUG + printk(KERN_DEBUG "ACPI 2.0 SLIT locality table:\n"); + for (i = 0; i < numnodes; i++) { + for (j = 0; j < numnodes; j++) + printk(KERN_DEBUG "%03d ", node_distance(i,j)); + printk("\n"); + } +#endif +} +#endif /* CONFIG_ACPI_NUMA */ + static int __init acpi_parse_fadt (unsigned long phys_addr, unsigned long size) { struct acpi_table_header *fadt_header; - fadt_descriptor_rev2 *fadt; + struct fadt_descriptor_rev2 *fadt; u32 sci_irq; if (!phys_addr || !size) return -EINVAL; fadt_header = (struct acpi_table_header *) __va(phys_addr); - if (fadt_header->revision != 3) return -ENODEV; /* Only deal with ACPI 2.0 FADT */ - fadt = (fadt_descriptor_rev2 *) fadt_header; + fadt = (struct fadt_descriptor_rev2 *) fadt_header; if (!(fadt->iapc_boot_arch & BAF_8042_KEYBOARD_CONTROLLER)) acpi_kbd_controller_present = 0; @@ -479,20 +663,13 @@ rsdp_phys = __pa(efi.acpi20); else if (efi.acpi) printk(KERN_WARNING PREFIX "v1.0/r0.71 tables no longer supported\n"); - return rsdp_phys; } int __init -acpi_boot_init (char *cmdline) +acpi_boot_init (void) { - int result; - - /* Initialize the ACPI boot-time table parser */ - result = acpi_table_init(cmdline); - if (result) - return result; /* * MADT @@ -509,65 +686,76 @@ /* 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) 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) < 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) 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) - printk(KERN_ERR PREFIX "Error parsing MADT - no IOAPIC entries\n"); + if (acpi_table_parse_madt(ACPI_MADT_IOSAPIC, acpi_parse_iosapic) < 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) < 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) 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) printk(KERN_ERR PREFIX "Error parsing NMI SRC entry\n"); -skip_madt: + skip_madt: /* - * The FADT table contains an SCI_INT line, by which the system + * FADT says whether a legacy keyboard controller is present. + * The FADT also contains an SCI_INT line, by which the system * gets interrupts such as power and sleep buttons. If it's not * on a Legacy interrupt, it needs to be setup. */ - if (acpi_table_parse(ACPI_FACP, acpi_parse_fadt) < 1) + if (acpi_table_parse(ACPI_FADT, acpi_parse_fadt) < 1) printk(KERN_ERR PREFIX "Can't find FADT\n"); #ifdef CONFIG_SMP if (available_cpus == 0) { printk(KERN_INFO "ACPI: Found 0 CPUS; assuming 1\n"); + printk(KERN_INFO "CPU 0 (0x%04x)", hard_smp_processor_id()); + smp_boot_data.cpu_phys_id[available_cpus] = hard_smp_processor_id(); available_cpus = 1; /* We've got at least one of these, no? */ } - smp_boot_data.cpu_count = total_cpus; + smp_boot_data.cpu_count = available_cpus; + + smp_build_cpu_map(); +# ifdef CONFIG_NUMA + /* If the platform did not have an SRAT table, initialize the + * node_cpuid table from the smp_boot_data array. All cpus + * will be on node 0. + */ + if (srat_num_cpus == 0) { + int cpu, i=1; + for (cpu=0; cpuattribute & EFI_MEMORY_WB) - trim_bottom(md, granule_addr); + trim_bottom(check_md, granule_addr); if (check_md->phys_addr < granule_addr) continue; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/efi_stub.S linux-2.4.23-pre8/arch/ia64/kernel/efi_stub.S --- linux-2.4.22/arch/ia64/kernel/efi_stub.S 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/efi_stub.S 2003-10-22 22:47:28.000000000 +0000 @@ -62,7 +62,7 @@ mov b6=r2 ;; andcm r16=loc3,r16 // get psr with IT, DT, and RT bits cleared - br.call.sptk.many rp=ia64_switch_mode + br.call.sptk.many rp=ia64_switch_mode_phys .ret0: mov out4=in5 mov out0=in1 mov out1=in2 @@ -73,7 +73,7 @@ br.call.sptk.many rp=b6 // call the EFI function .ret1: mov ar.rsc=0 // put RSE in enforced lazy, LE mode mov r16=loc3 - br.call.sptk.many rp=ia64_switch_mode // return to virtual mode + br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode .ret2: mov ar.rsc=loc4 // restore RSE configuration mov ar.pfs=loc1 mov rp=loc0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/efivars.c linux-2.4.23-pre8/arch/ia64/kernel/efivars.c --- linux-2.4.22/arch/ia64/kernel/efivars.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/efivars.c 2003-10-22 22:48:53.000000000 +0000 @@ -119,7 +119,7 @@ */ static spinlock_t efivars_lock = SPIN_LOCK_UNLOCKED; static LIST_HEAD(efivar_list); -static struct proc_dir_entry *efi_vars_dir = NULL; +static struct proc_dir_entry *efi_vars_dir; #define efivar_entry(n) list_entry(n, efivar_entry_t, list) @@ -138,8 +138,7 @@ static inline unsigned long utf8_strsize(efi_char16_t *data, unsigned long maxlength) { - return utf8_strlen(data, maxlength/sizeof(efi_char16_t)) * - sizeof(efi_char16_t); + return utf8_strlen(data, maxlength/sizeof(efi_char16_t)) * sizeof(efi_char16_t); } @@ -169,8 +168,7 @@ efi_char16_t *variable_name, efi_guid_t *vendor_guid) { - int i, short_name_size = variable_name_size / - sizeof(efi_char16_t) + 38; + int i, short_name_size = variable_name_size / sizeof(efi_char16_t) + 38; char *short_name; efivar_entry_t *new_efivar; @@ -191,7 +189,7 @@ /* Convert Unicode to normal chars (assume top bits are 0), ala UTF-8 */ - for (i=0; i + * Fenghua Yu * Copyright (C) 1998-2002 Hewlett-Packard Co * David Mosberger-Tang * Copyright (C) 1999 VA Linux Systems @@ -48,7 +51,10 @@ ENTRY(ia64_execve) .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(3) alloc loc1=ar.pfs,3,2,4,0 - mov loc0=rp + /* Leave from kernel and restore all pt_regs to correspending registers. This is special + * because ia32 application needs scratch registers after return from execve. + */ + movl loc0=ia64_ret_from_execve_syscall .body mov out0=in0 // filename ;; // stop bit between alloc and call @@ -72,19 +78,18 @@ * this executes in less than 20 cycles even on Itanium, so it's not worth * optimizing for...). */ - mov r4=0; mov f2=f0; mov b1=r0 - mov r5=0; mov f3=f0; mov b2=r0 - mov r6=0; mov f4=f0; mov b3=r0 - mov r7=0; mov f5=f0; mov b4=r0 - mov ar.unat=0; mov f10=f0; mov b5=r0 - ldf.fill f11=[sp]; ldf.fill f12=[sp]; mov f13=f0 - ldf.fill f14=[sp]; ldf.fill f15=[sp]; mov f16=f0 - ldf.fill f17=[sp]; ldf.fill f18=[sp]; mov f19=f0 - ldf.fill f20=[sp]; ldf.fill f21=[sp]; mov f22=f0 - ldf.fill f23=[sp]; ldf.fill f24=[sp]; mov f25=f0 - ldf.fill f26=[sp]; ldf.fill f27=[sp]; mov f28=f0 - ldf.fill f29=[sp]; ldf.fill f30=[sp]; mov f31=f0 - mov ar.lc=0 + mov ar.unat=0; mov ar.lc=0; + mov r4=0; mov f2=f0; mov b1=r0 + mov r5=0; mov f3=f0; mov b2=r0 + mov r6=0; mov f4=f0; mov b3=r0 + mov r7=0; mov f5=f0; mov b4=r0 + ldf.fill f12=[sp]; mov f13=f0; mov b5=r0 + ldf.fill f14=[sp]; ldf.fill f15=[sp]; mov f16=f0 + ldf.fill f17=[sp]; ldf.fill f18=[sp]; mov f19=f0 + ldf.fill f20=[sp]; ldf.fill f21=[sp]; mov f22=f0 + ldf.fill f23=[sp]; ldf.fill f24=[sp]; mov f25=f0 + ldf.fill f26=[sp]; ldf.fill f27=[sp]; mov f28=f0 + ldf.fill f29=[sp]; ldf.fill f30=[sp]; mov f31=f0 br.ret.sptk.many rp END(ia64_execve) @@ -251,8 +256,6 @@ st8 [r14]=r21,16 // save b0 st8 [r15]=r22,16 // save b1 mov r25=b4 - stf.spill [r2]=f10,32 - stf.spill [r3]=f11,32 mov r26=b5 ;; st8 [r14]=r23,16 // save b2 @@ -351,9 +354,6 @@ ldf.fill f4=[r14],32 ldf.fill f5=[r15],32 ;; - ldf.fill f10=[r14],32 - ldf.fill f11=[r15],32 - ;; ldf.fill f12=[r14],32 ldf.fill f13=[r15],32 ;; @@ -475,7 +475,7 @@ .mem.offset 8,0; st8.spill [r3]=r10 // clear error indication in slot for r10 ia64_strace_leave_kernel: br.call.sptk.many rp=invoke_syscall_trace // give parent a chance to catch return value -.rety: br.cond.sptk ia64_leave_kernel +.rety: br.cond.sptk ia64_leave_syscall strace_error: ld8 r3=[r2] // load pt_regs.r8 @@ -528,12 +528,186 @@ (p7) br.cond.spnt handle_syscall_error // handle potential syscall failure END(ia64_ret_from_syscall) // fall through +/* + * ia64_leave_syscall(): Same as ia64_leave_kernel, except that it doesn't + * need to switch to bank 0 and doesn't restore the scratch registers. + * To avoid leaking kernel bits, the scratch registers are set to + * the following known-to-be-safe values: + * + * r1: restored (global pointer) + * r2: cleared + * r3: cleared + * r8-r11: restored (syscall return value(s)) + * r12: restored (user-level stack pointer) + * r13: restored (user-level thread pointer) + * r14: cleared + * r15: restored (syscall #) + * r16-r19: cleared + * r20: user-level ar.fpsr + * r21: user-level b0 + * r22: cleared + * r23: user-level ar.bspstore + * r24: user-level ar.rnat + * r25: user-level ar.unat + * r26: user-level ar.pfs + * r27: user-level ar.rsc + * r28: user-level ip + * r29: user-level psr + * r30: user-level cfm + * r31: user-level pr + * f6-f11: cleared + * pr: restored (user-level pr) + * b0: restored (user-level rp) + * b6: cleared + * b7: cleared + * ar.unat: restored (user-level ar.unat) + * ar.pfs: restored (user-level ar.pfs) + * ar.rsc: restored (user-level ar.rsc) + * ar.rnat: restored (user-level ar.rnat) + * ar.bspstore: restored (user-level ar.bspstore) + * ar.fpsr: restored (user-level ar.fpsr) + * ar.ccv: cleared + * ar.csd: cleared + * ar.ssd: cleared + */ +GLOBAL_ENTRY(ia64_leave_syscall) + PT_REGS_UNWIND_INFO(0) + lfetch.fault [sp] + movl r14=.restart1 + ;; + mov.ret.sptk rp=r14,.restart1 + cmp.eq pLvSys,p0=r0,r0 // pLvSys=1: leave from syscall +.restart1: + // need_resched and signals atomic test +(pUser) rsm psr.i + adds r17=IA64_TASK_NEED_RESCHED_OFFSET,r13 + adds r18=IA64_TASK_SIGPENDING_OFFSET,r13 +#ifdef CONFIG_PERFMON + adds r19=IA64_TASK_PFM_OVFL_BLOCK_RESET_OFFSET,r13 +#endif + ;; +#ifdef CONFIG_PERFMON +(pUser) ld8 r19=[r19] // load current->thread.pfm_ovfl_block_reset +#endif +(pUser) ld8 r17=[r17] // load current->need_resched +(pUser) ld4 r18=[r18] // load current->sigpending + ;; +#ifdef CONFIG_PERFMON +(pUser) cmp.ne.unc p9,p0=r19,r0 // current->thread.pfm_ovfl_block_reset != 0? +#endif +(pUser) cmp.ne.unc p7,p0=r17,r0 // current->need_resched != 0? +(pUser) cmp.ne.unc p8,p0=r18,r0 // current->sigpending != 0? + ;; +#ifdef CONFIG_PERFMON +(p9) br.call.spnt.many b7=pfm_ovfl_block_reset +#endif +#if __GNUC__ < 3 +(p7) br.call.spnt.many b7=invoke_schedule +#else +(p7) br.call.spnt.many b7=schedule +#endif +(p8) br.call.spnt.many rp=handle_signal_delivery // check & deliver pending signals (once) + + mov ar.csd=r0 + mov ar.ssd=r0 + adds r16=PT(LOADRS)+16,r12 + adds r17=PT(AR_BSPSTORE)+16, r12 + mov f6=f0 // clear f6 + ;; + ld8 r19=[r16],PT(R8)-PT(LOADRS) // load ar.rsc value for "loadrs" + ld8 r23=[r17],PT(R9)-PT(AR_BSPSTORE) // load ar.bspstore (may be garbage) + mov r22=r0 // clear r22 + ;; + // start restoring the state saved on the kernel stack (struct pt_regs): + ld8.fill r8=[r16],16 + ld8.fill r9=[r17],16 + mov f7=f0 // clear f7 + ;; + ld8.fill r10=[r16],16 + ld8.fill r11=[r17],16 + mov f8=f0 // clear f8 + ;; + ld8 r29=[r16],16 // load cr.ipsr + ld8 r28=[r17],16 // load cr.iip + mov b7=r0 // clear b7 + ;; + ld8 r30=[r16],16 // load cr.ifs + ld8 r25=[r17],16 // load ar.unat + cmp.eq p9,p0=r0,r0 // set p9 to indicate that we should restore cr.ifs + ;; + rsm psr.i | psr.ic // initiate turning off of interrupt and interruption collection + invala // invalidate ALAT + mov f9=f0 // clear f9 + ;; + ld8 r26=[r16],16 // load ar.pfs + ld8 r27=[r17],PT(PR)-PT(AR_RSC)// load ar.rsc + mov f10=f0 // clear f10 + ;; + ld8 r24=[r16],PT(B0)-PT(AR_RNAT)// load ar.rnat (may be garbage) + ld8 r31=[r17],PT(R1)-PT(PR) // load predicates + mov f11=f0 // clear f11 + ;; + ld8 r21=[r16],PT(R12)-PT(B0)// load b0 + ld8.fill r1=[r17],16 // load r1 + mov r3=r0 // clear r3 + ;; + ld8.fill r12=[r16],16 + ld8.fill r13=[r17],16 + mov r2=r0 // clear r2 + ;; + ld8 r20=[r16] // ar.fpsr + ld8.fill r15=[r17] // load r15 + adds r18=16,r16 + ;; + mov r16=ar.bsp // get existing backing store pointer + movl r17=PERCPU_ADDR+IA64_CPU_PHYS_STACKED_SIZE_P8_OFFSET + srlz.i // ensure interruption collection is off + mov ar.ccv=r0 // clear ar.ccv + mov b6=r0 // clear b6 + ;; + ld4 r17=[r17] // r17 = cpu_data->phys_stacked_size_p8 + mov r14=r0 // clear r14 +(pKern) br.cond.dpnt skip_rbs_switch + /* + * Restore user backing store. + * + * NOTE: alloc, loadrs, and cover can't be predicated. + */ + cover // add current frame into dirty partition + shr.u r18=r19,16 // get byte size of existing "dirty" partition + ;; + mov r19=ar.bsp // get new backing store pointer + sub r16=r16,r18 // krbs = old bsp - size of dirty partition + cmp.ne p9,p0=r0,r0 // clear p9 to skip restore of cr.ifs + ;; + sub r19=r19,r16 // calculate total byte size of dirty partition + add r18=64,r18 // don't force in0-in7 into memory... + ;; + shl r19=r19,16 // shift size of dirty partition into loadrs position + br.few dont_preserve_current_frame + ;; +END(ia64_leave_syscall) + +GLOBAL_ENTRY(ia64_ret_from_execve_syscall) + PT_REGS_UNWIND_INFO(0) + cmp.ge p6,p7=r8,r0 // syscall executed successfully? + adds r2=PT(R8)+16,sp // r2 = &pt_regs.r8 + adds r3=PT(R10)+16,sp // r3 = &pt_regs.r10 + ;; + .mem.offset 0,0 +(p6) st8.spill [r2]=r8 // store return value in slot for r8 and set unat bit + .mem.offset 8,0 +(p6) st8.spill [r3]=r0 // clear error indication in slot for r10 and set unat bit +(p7) br.cond.spnt handle_syscall_error // handle potential syscall failure +END(ia64_ret_from_execve_syscall) + // fall through GLOBAL_ENTRY(ia64_leave_kernel) PT_REGS_UNWIND_INFO(0) lfetch.fault [sp] movl r14=.restart ;; mov.ret.sptk rp=r14,.restart + cmp.eq p0,pLvSys=r0,r0 // pLvSys=0: leave from kernel .restart: // need_resched and signals atomic test (pUser) rsm psr.i @@ -564,18 +738,35 @@ (p7) br.call.spnt.many b7=schedule #endif (p8) br.call.spnt.many rp=handle_signal_delivery // check & deliver pending signals (once) + + adds r20=PT(CR_IPSR)+16,r12 + adds r21=PT(PR)+16,r12 ;; -.ret9: adds r2=PT(R8)+16,r12 - adds r3=PT(R9)+16,r12 + lfetch.fault.excl [r20] + lfetch.fault.excl [r21] + adds r2=PT(B6)+16,r12 + adds r3=PT(R16)+16,r12 + mov r29=PT(R24)-PT(B6) + mov r30=PT(B7)-PT(R24) ;; // start restoring the state saved on the kernel stack (struct pt_regs): - ld8.fill r8=[r2],16 - ld8.fill r9=[r3],16 + ld8 r28=[r2],r29 // b6 + ld8.fill r16=[r3],128 + mov r31=PT(AR_CSD)-PT(AR_CCV) + ;; + ld8.fill r24=[r2],r30 + ld8 r15=[r3],r31 + ;; + ld8 r29=[r2],16 // b7 + ld8 r30=[r3],16 // ar.csd ;; - ld8.fill r10=[r2],16 - ld8.fill r11=[r3],16 + ld8 r31=[r2],16 // ar.ssd + ld8.fill r8=[r3],16 ;; - ld8.fill r16=[r2],16 + ld8.fill r9=[r2],16 + ld8.fill r10=[r3],PT(R17)-PT(R10) + ;; + ld8.fill r11=[r2],PT(R18)-PT(R11) ld8.fill r17=[r3],16 ;; ld8.fill r18=[r2],16 @@ -583,82 +774,78 @@ ;; ld8.fill r20=[r2],16 ld8.fill r21=[r3],16 - ;; - ld8.fill r22=[r2],16 - ld8.fill r23=[r3],16 - ;; - ld8.fill r24=[r2],16 - ld8.fill r25=[r3],16 - ;; - ld8.fill r26=[r2],16 - ld8.fill r27=[r3],16 - ;; - ld8.fill r28=[r2],16 - ld8.fill r29=[r3],16 - ;; - ld8.fill r30=[r2],16 - ld8.fill r31=[r3],16 + mov ar.csd=r30 + mov ar.ssd=r31 ;; rsm psr.i | psr.ic // initiate turning off of interrupt and interruption collection invala // invalidate ALAT ;; - ld8 r1=[r2],16 // ar.ccv - ld8 r13=[r3],16 // ar.fpsr + ld8.fill r22=[r2],24 + ld8.fill r23=[r3],24 + mov b6=r28 + ;; + ld8.fill r25=[r2],16 + ld8.fill r26=[r3],16 + mov b7=r29 ;; - ld8 r14=[r2],16 // b0 - ld8 r15=[r3],16+8 // b7 + ld8.fill r27=[r2],16 + ld8.fill r28=[r3],16 ;; - ldf.fill f6=[r2],32 - ldf.fill f7=[r3],32 + ld8.fill r29=[r2],16 + ld8.fill r30=[r3],24 ;; - ldf.fill f8=[r2],32 - ldf.fill f9=[r3],32 + ld8.fill r31=[r2],32 + ldf.fill f6=[r3],32 ;; - mov ar.ccv=r1 - mov ar.fpsr=r13 - mov b0=r14 + ldf.fill f7=[r2],32 + ldf.fill f8=[r3],32 ;; srlz.i // ensure interruption collection is off - mov b7=r15 + mov ar.ccv=r15 ;; + ldf.fill f9=[r2],32 + ldf.fill f10=[r3],32 bsw.0 // switch back to bank 0 ;; - adds r16=16,r12 - adds r17=24,r12 + ldf.fill f11=[r2] + adds r16=PT(CR_IPSR)+16,r12 + adds r17=PT(CR_IIP)+16,r12 ;; - ld8 rCRIPSR=[r16],16 // load cr.ipsr - ld8 rCRIIP=[r17],16 // load cr.iip + ld8 r29=[r16],16 // load cr.ipsr + ld8 r28=[r17],16 // load cr.iip ;; - ld8 rCRIFS=[r16],16 // load cr.ifs - ld8 rARUNAT=[r17],16 // load ar.unat + ld8 r30=[r16],16 // load cr.ifs + ld8 r25=[r17],16 // load ar.unat cmp.eq p9,p0=r0,r0 // set p9 to indicate that we should restore cr.ifs ;; - ld8 rARPFS=[r16],16 // load ar.pfs - ld8 rARRSC=[r17],16 // load ar.rsc + ld8 r26=[r16],16 // load ar.pfs + ld8 r27=[r17],16 // load ar.rsc ;; - ld8 rARRNAT=[r16],16 // load ar.rnat (may be garbage) - ld8 rARBSPSTORE=[r17],16 // load ar.bspstore (may be garbage) + ld8 r24=[r16],16 // load ar.rnat (may be garbage) + ld8 r23=[r17],16 // load ar.bspstore (may be garbage) ;; - ld8 rARPR=[r16],16 // load predicates - ld8 rB6=[r17],16 // load b6 + ld8 r31=[r16],16 // load predicates + ld8 r21=[r17],16 // load b0 ;; ld8 r19=[r16],16 // load ar.rsc value for "loadrs" ld8.fill r1=[r17],16 // load r1 ;; - ld8.fill r2=[r16],16 - ld8.fill r3=[r17],16 - ;; ld8.fill r12=[r16],16 ld8.fill r13=[r17],16 ;; + ld8 r20=[r16],16 + ld8.fill r15=[r17],16 + ;; ld8.fill r14=[r16] - ld8.fill r15=[r17] - shr.u r18=r19,16 // get byte size of existing "dirty" partition + ld8.fill r2=[r17],16 + adds r18=16,r16 ;; mov r16=ar.bsp // get existing backing store pointer movl r17=PERCPU_ADDR+IA64_CPU_PHYS_STACKED_SIZE_P8_OFFSET ;; + ld8.fill r3=[r18] ld4 r17=[r17] // r17 = cpu_data->phys_stacked_size_p8 + shr.u r18=r19,16 // get byte size of existing "dirty" partition (pKern) br.cond.dpnt skip_rbs_switch /* * Restore user backing store. @@ -718,7 +905,7 @@ }{ .mib mov loc3=0 mov loc4=0 -(pRecurse) br.call.sptk.many b6=rse_clear_invalid +(pRecurse) br.call.sptk.many b0=rse_clear_invalid }{ .mfi // cycle 2 mov loc5=0 @@ -727,7 +914,7 @@ }{ .mib mov loc6=0 mov loc7=0 -(pReturn) br.ret.sptk.many b6 +(pReturn) br.ret.sptk.many b0 } #else /* !CONFIG_ITANIUM */ alloc loc0=ar.pfs,2,Nregs-2,2,0 @@ -742,14 +929,14 @@ mov loc5=0 mov loc6=0 mov loc7=0 -(pRecurse) br.call.sptk.many b6=rse_clear_invalid +(pRecurse) br.call.sptk.many b0=rse_clear_invalid ;; mov loc8=0 mov loc9=0 cmp.ne pReturn,p0=r0,in1 // if recursion count != 0, we need to do a br.ret mov loc10=0 mov loc11=0 -(pReturn) br.ret.sptk.many b6 +(pReturn) br.ret.sptk.many b0 #endif /* !CONFIG_ITANIUM */ # undef pRecurse # undef pReturn @@ -759,17 +946,22 @@ loadrs ;; skip_rbs_switch: - mov b6=rB6 - mov ar.pfs=rARPFS -(pUser) mov ar.bspstore=rARBSPSTORE -(p9) mov cr.ifs=rCRIFS - mov cr.ipsr=rCRIPSR - mov cr.iip=rCRIIP - ;; -(pUser) mov ar.rnat=rARRNAT // must happen with RSE in lazy mode - mov ar.rsc=rARRSC - mov ar.unat=rARUNAT - mov pr=rARPR,-1 +(pLvSys)mov r19=r0 // clear r19 for leave_syscall, no-op otherwise + mov b0=r21 + mov ar.pfs=r26 +(pUser) mov ar.bspstore=r23 +(p9) mov cr.ifs=r30 +(pLvSys)mov r16=r0 // clear r16 for leave_syscall, no-op otherwise + mov cr.ipsr=r29 + mov ar.fpsr=r20 +(pLvSys)mov r17=r0 // clear r17 for leave_syscall, no-op otherwise + mov cr.iip=r28 + ;; +(pUser) mov ar.rnat=r24 // must happen with RSE in lazy mode +(pLvSys)mov r18=r0 // clear r18 for leave_syscall, no-op otherwise + mov ar.rsc=r27 + mov ar.unat=r25 + mov pr=r31,-1 rfi END(ia64_leave_kernel) @@ -795,7 +987,7 @@ ;; .mem.offset 0,0; st8.spill [r2]=r9 // store errno in pt_regs.r8 and set unat bit .mem.offset 8,0; st8.spill [r3]=r10 // store error indication in pt_regs.r10 and set unat bit - br.cond.sptk ia64_leave_kernel + br.cond.sptk ia64_leave_syscall END(handle_syscall_error) /* @@ -906,6 +1098,22 @@ .body cmp.eq pNonSys,pSys=r0,r0 // sigreturn isn't a normal syscall... ;; + /* After signal handler, live registers f6-f11 are restored to the previous + * executing context values for synchronized signals(from exceptions); or they + * are cleared to 0 for asynchronized signals(from syscalls). These live registers + * will be put into pt_regs to return back to user space. + */ + adds r16=PT(F6)+32,sp + adds r17=PT(F7)+32,sp + ;; + stf.spill [r16]=f6,32 + stf.spill [r17]=f7,32 + ;; + stf.spill [r16]=f8,32 + stf.spill [r17]=f9,32 + ;; + stf.spill [r16]=f10 + stf.spill [r17]=f11 adds out0=16,sp // out0 = &sigscratch br.call.sptk.many rp=ia64_rt_sigreturn .ret19: .restore sp 0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/entry.h linux-2.4.23-pre8/arch/ia64/kernel/entry.h --- linux-2.4.22/arch/ia64/kernel/entry.h 2001-11-09 22:26:17.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/entry.h 2003-10-22 22:48:34.000000000 +0000 @@ -4,6 +4,7 @@ * Preserved registers that are shared between code in ivt.S and entry.S. Be * careful not to step on these! */ +#define pLvSys p1 /* set 1 if leave from syscall; otherwise, set 0*/ #define pKern p2 /* will leave_kernel return to kernel-mode? */ #define pUser p3 /* will leave_kernel return to user-mode? */ #define pSys p4 /* are we processing a (synchronous) system call? */ @@ -13,7 +14,7 @@ #define SW(f) (IA64_SWITCH_STACK_##f##_OFFSET) #define PT_REGS_SAVES(off) \ - .unwabi @svr4, 'i'; \ + .unwabi 3, 'i'; \ .fframe IA64_PT_REGS_SIZE+16+(off); \ .spillsp rp, PT(CR_IIP)+16+(off); \ .spillsp ar.pfs, PT(CR_IFS)+16+(off); \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/head.S linux-2.4.23-pre8/arch/ia64/kernel/head.S --- linux-2.4.22/arch/ia64/kernel/head.S 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/head.S 2003-10-22 22:49:10.000000000 +0000 @@ -5,7 +5,7 @@ * to set up the kernel's global pointer and jump to the kernel * entry point. * - * Copyright (C) 1998-2001 Hewlett-Packard Co + * Copyright (C) 1998-2001, 2003 Hewlett-Packard Co * David Mosberger-Tang * Stephane Eranian * Copyright (C) 1999 VA Linux Systems @@ -15,6 +15,7 @@ * Copyright (C) 1999 Don Dugger * Copyright (C) 2002 Fenghua Yu * -Optimize __ia64_save_fpu() and __ia64_load_fpu() for Itanium 2. + * Copyright (C) 2003 Silicon Graphics, Inc. */ #include @@ -65,17 +66,29 @@ * that maps the kernel's text and data: */ rsm psr.i | psr.ic - mov r16=((ia64_rid(IA64_REGION_ID_KERNEL, PAGE_OFFSET) << 8) | (IA64_GRANULE_SHIFT << 2)) ;; srlz.i + ;; + mov r20=((ia64_rid(IA64_REGION_ID_KERNEL, (7<<61)) << 8) | (IA64_GRANULE_SHIFT << 2)) + movl r21=(7<<61) + ;; + mov rr[r21]=r20 + ;; + /* + * Now pin mappings into the TLB for kernel text and data + */ mov r18=KERNEL_TR_PAGE_SHIFT<<2 movl r17=KERNEL_START ;; - mov rr[r17]=r16 mov cr.itir=r18 mov cr.ifa=r17 mov r16=IA64_TR_KERNEL - movl r18=((1 << KERNEL_TR_PAGE_SHIFT) | PAGE_KERNEL) + mov r3=ip + movl r18=PAGE_KERNEL + ;; + dep r2=0,r3,0,KERNEL_TR_PAGE_SHIFT + ;; + or r18=r2,r18 ;; srlz.i ;; @@ -134,28 +147,63 @@ movl r3=cpucount ;; ld4 r3=[r3] // r3 <- smp_processor_id() - movl r2=init_tasks - ;; - shladd r2=r3,3,r2 - ;; - ld8 r2=[r2] #else mov r3=0 - movl r2=init_task_union - ;; #endif + ;; cmp4.ne isAP,isBP=r3,r0 - ;; // RAW on r2 - extr r3=r2,0,61 // r3 == phys addr of task struct - mov r16=KERNEL_TR_PAGE_NUM + + /* + * Make task struct pointer in init_tasks an identity mapped pointer. + * The value that is compiled into the array may not be identity mapped. + */ + movl r18=init_tasks + ;; + shladd r18=r3,3,r18 + ;; + ld8 r8=[r18] + ;; + tpa r3=r8 // r3 == phys addr of task struct + ;; + dep r2=-1,r3,61,3 // IMVA of task + ;; + st8 [r18]=r2 // and save it back in init_tasks[thiscpu] + + // load mapping for stack (virtaddr in r2, physaddr in r3) + // load dtr[2] only if the va for current (r2) isn't covered by the dtr[0] + shr.u r18=r2,KERNEL_TR_PAGE_SHIFT /* va of current in units of kernel-pages */ + movl r17=KERNEL_START>>KERNEL_TR_PAGE_SHIFT /* va of kernel-start in units of kernel-pages */ + ;; + cmp.eq p0,p6=r17,r18 + rsm psr.ic + movl r17=PAGE_KERNEL + ;; + srlz.d + dep r18=0,r3,0,12 + ;; + or r18=r17,r18 + ;; + mov r17=rr[r2] + shr.u r16=r3,IA64_GRANULE_SHIFT + ;; + dep r17=0,r17,8,24 + ;; + mov cr.itir=r17 + mov cr.ifa=r2 + + mov r19=IA64_TR_CURRENT_STACK + ;; +(p6) itr.d dtr[r19]=r18 + ;; + ssm psr.ic + srlz.d ;; // load the "current" pointer (r13) and ar.k6 with the current task - mov r13=r2 mov IA64_KR(CURRENT)=r3 // Physical address - - // initialize k4 to a safe value (64-128MB is mapped by TR_KERNEL) mov IA64_KR(CURRENT_STACK)=r16 + mov r13=r2 + /* * Reserve space at the top of the stack for "struct pt_regs". Kernel threads * don't store interesting values in that structure, but the space still needs @@ -670,14 +718,14 @@ END(__ia64_init_fpu) /* - * Switch execution mode from virtual to physical or vice versa. + * Switch execution mode from virtual to physical * * Inputs: * r16 = new psr to establish * * Note: RSE must already be in enforced lazy mode */ -GLOBAL_ENTRY(ia64_switch_mode) +GLOBAL_ENTRY(ia64_switch_mode_phys) { alloc r2=ar.pfs,0,0,0,0 rsm psr.i | psr.ic // disable interrupts and interrupt collection @@ -687,35 +735,86 @@ { flushrs // must be first insn in group srlz.i - shr.u r19=r15,61 // r19 <- top 3 bits of current IP } ;; mov cr.ipsr=r16 // set new PSR - add r3=1f-ia64_switch_mode,r15 - xor r15=0x7,r19 // flip the region bits + add r3=1f-ia64_switch_mode_phys,r15 mov r17=ar.bsp mov r14=rp // get return address into a general register + ;; - // switch RSE backing store: + // going to physical mode, use tpa to translate virt->phys + tpa r17=r17 + tpa r3=r3 + tpa sp=sp + tpa r14=r14 ;; - dep r17=r15,r17,61,3 // make ar.bsp physical or virtual + mov r18=ar.rnat // save ar.rnat - ;; mov ar.bspstore=r17 // this steps on ar.rnat - dep r3=r15,r3,61,3 // make rfi return address physical or virtual + mov cr.iip=r3 + mov cr.ifs=r0 + ;; + mov ar.rnat=r18 // restore ar.rnat + rfi // must be last insn in group + ;; +1: mov rp=r14 + br.ret.sptk.many rp +END(ia64_switch_mode_phys) + +/* + * Switch execution mode from physical to virtual + * + * Inputs: + * r16 = new psr to establish + * + * Note: RSE must already be in enforced lazy mode + */ +GLOBAL_ENTRY(ia64_switch_mode_virt) + { + alloc r2=ar.pfs,0,0,0,0 + rsm psr.i | psr.ic // disable interrupts and interrupt collection + mov r15=ip + } + ;; + { + flushrs // must be first insn in group + srlz.i + } ;; + mov cr.ipsr=r16 // set new PSR + add r3=1f-ia64_switch_mode_virt,r15 + + mov r17=ar.bsp + mov r14=rp // get return address into a general register + ;; + + // going to virtual + // - for code addresses, set upper bits of addr to KERNEL_START + // - for stack addresses, set upper 3 bits to 0xe.... Dont change any of the + // lower bits since we want it to stay identity mapped + movl r18=KERNEL_START + dep r3=0,r3,KERNEL_TR_PAGE_SHIFT,64-KERNEL_TR_PAGE_SHIFT + dep r14=0,r14,KERNEL_TR_PAGE_SHIFT,64-KERNEL_TR_PAGE_SHIFT + dep r17=-1,r17,61,3 + dep sp=-1,sp,61,3 + ;; + or r3=r3,r18 + or r14=r14,r18 + ;; + + mov r18=ar.rnat // save ar.rnat + mov ar.bspstore=r17 // this steps on ar.rnat mov cr.iip=r3 mov cr.ifs=r0 - dep sp=r15,sp,61,3 // make stack pointer physical or virtual ;; mov ar.rnat=r18 // restore ar.rnat - dep r14=r15,r14,61,3 // make function return address physical or virtual rfi // must be last insn in group ;; 1: mov rp=r14 br.ret.sptk.many rp -END(ia64_switch_mode) +END(ia64_switch_mode_virt) #ifdef CONFIG_IA64_BRL_EMU @@ -782,6 +881,9 @@ ;; // delay a little... .wait: sub tmp=tmp,timeout +#ifdef GAS_HAS_HINT_INSN + hint @pause +#endif or delay=0xf,delay // make sure delay is non-zero (otherwise we get stuck with 0) ;; cmp.lt p15,p0=tmp,r0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/iosapic.c linux-2.4.23-pre8/arch/ia64/kernel/iosapic.c --- linux-2.4.22/arch/ia64/kernel/iosapic.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/iosapic.c 2003-10-22 22:48:54.000000000 +0000 @@ -530,7 +530,7 @@ delivery = IOSAPIC_INIT; break; case ACPI_INTERRUPT_CPEI: - vector = IA64_PCE_VECTOR; + vector = IA64_CPE_VECTOR; delivery = IOSAPIC_LOWEST_PRIORITY; break; default: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/ivt.S linux-2.4.23-pre8/arch/ia64/kernel/ivt.S --- linux-2.4.22/arch/ia64/kernel/ivt.S 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/ivt.S 2003-10-22 22:47:51.000000000 +0000 @@ -1,6 +1,10 @@ /* * arch/ia64/kernel/ivt.S * + * Copyright (C) 2002-2003 Intel Co + * Suresh Siddha + * Kenneth Chen + * Fenghua Yu * Copyright (C) 1998-2001 Hewlett-Packard Co * Stephane Eranian * David Mosberger @@ -621,6 +625,23 @@ ///////////////////////////////////////////////////////////////////////////////////////// // 0x2c00 Entry 11 (size 64 bundles) Break instruction (33) ENTRY(break_fault) + +/* System call entry/exit only saves/restores part of pt_regs, i.e. no scratch registers + * are saved/restored except r15 which contains syscall number and needs to be saved in the + * entry. This optimization is based on the assumption that applications only call glibc + * system call interface which doesn't use scratch registers after break into kernel. + * Registers saved/restored during system call entry/exit are listed as follows: + * + * Registers to be saved & restored: + * CR registers: cr_ipsr, cr_iip, cr_ifs + * AR registers: ar_unat, ar_pfs, ar_rsc, ar_rnat, ar_bspstore, ar_fpsr + * others: pr, b0, loadrs, r1, r12, r13, r15 + * Registers to be restored only: + * r8~r11: output value from the system call. + * + * During system call exit, scratch registers (including r15) are modified/cleared to + * prevent leaking bits from kernel to user level. + */ DBG_FAULT(11) mov r16=cr.iim mov r17=__IA64_BREAK_SYSCALL @@ -629,22 +650,25 @@ cmp.eq p0,p7=r16,r17 // is this a system call? (p7 <- false, if so) (p7) br.cond.spnt non_syscall - SAVE_MIN // uses r31; defines r2: - - ssm psr.ic | PSR_DEFAULT_BITS + mov r21=ar.fpsr; + mov r29=cr.ipsr; + mov r20=r1; + mov r25=ar.unat; + mov r27=ar.rsc; + mov r26=ar.pfs; + mov r28=cr.iip; + mov r1=IA64_KR(CURRENT); /* r1 = current (physical) */ + ;; + invala; + extr.u r16=r29,32,2; /* extract psr.cpl */ + ;; + cmp.eq pKern,pUser=r0,r16; /* are we in kernel mode already? (psr.cpl==0) */ + /* switch from user to kernel RBS: */ + ;; + mov r30=r0 + MINSTATE_START_SAVE_MIN_VIRT + br.call.sptk.many b7=ia64_syscall_setup ;; - srlz.i // guarantee that interruption collection is on - cmp.eq pSys,pNonSys=r0,r0 // set pSys=1, pNonSys=0 - ;; -(p15) ssm psr.i // restore psr.i - adds r8=(IA64_PT_REGS_R8_OFFSET-IA64_PT_REGS_R16_OFFSET),r2 - ;; - stf8 [r8]=f1 // ensure pt_regs.r8 != 0 (see handle_syscall_error) - adds r3=8,r2 // set up second base pointer for SAVE_REST - ;; - SAVE_REST - br.call.sptk.many rp=demine_args // clear NaT bits in (potential) syscall args - mov r3=255 adds r15=-1024,r15 // r15 contains the syscall number---subtract 1024 adds r2=IA64_TASK_PTRACE_OFFSET,r13 // r2 = ¤t->ptrace @@ -664,8 +688,8 @@ // arrange things so we skip over break instruction when returning: - adds r16=16,sp // get pointer to cr_ipsr - adds r17=24,sp // get pointer to cr_iip + adds r16=PT(CR_IPSR)+16,sp // get pointer to cr_ipsr + adds r17=PT(CR_IIP)+16,sp // get pointer to cr_iip ;; ld8 r18=[r16] // fetch cr_ipsr tbit.z p8,p0=r2,PT_TRACESYS_BIT // (current->ptrace & PF_TRACESYS) == 0? @@ -685,38 +709,11 @@ st8 [r16]=r18 // store new value for cr.isr (p8) br.call.sptk.many b6=b6 // ignore this return addr + br.cond.sptk ia64_trace_syscall // NOT REACHED END(break_fault) -ENTRY(demine_args) - alloc r2=ar.pfs,8,0,0,0 - tnat.nz p8,p0=in0 - tnat.nz p9,p0=in1 - ;; -(p8) mov in0=-1 - tnat.nz p10,p0=in2 - tnat.nz p11,p0=in3 - -(p9) mov in1=-1 - tnat.nz p12,p0=in4 - tnat.nz p13,p0=in5 - ;; -(p10) mov in2=-1 - tnat.nz p14,p0=in6 - tnat.nz p15,p0=in7 - -(p11) mov in3=-1 - tnat.nz p8,p0=r15 // demining r15 is not a must, but it is safer - -(p12) mov in4=-1 -(p13) mov in5=-1 - ;; -(p14) mov in6=-1 -(p15) mov in7=-1 -(p8) mov r15=-1 - br.ret.sptk.many rp -END(demine_args) .align 1024 ///////////////////////////////////////////////////////////////////////////////////////// @@ -725,7 +722,6 @@ DBG_FAULT(12) mov r31=pr // prepare to save predicates ;; - SAVE_MIN_WITH_COVER // uses r31; defines r2 and r3 ssm psr.ic | PSR_DEFAULT_BITS ;; @@ -757,6 +753,125 @@ DBG_FAULT(14) FAULT(14) + /* + * There is no particular reason for this code to be here, other than that + * there happens to be space here that would go unused otherwise. If this + * fault ever gets "unreserved", simply moved the following code to a more + * suitable spot... + * + * ia64_syscall_setup() is a separate subroutine so that it can + * allocate stacked registers so it can safely demine any + * potential NaT values from the input registers. + * + * On entry: + * - executing on bank 0 or bank 1 register set (doesn't matter) + * - r1: stack pointer + * - r2: current task pointer + * - r3: preserved + * - r12: original contents (sp to be saved) + * - r13: original contents (tp to be saved) + * - r15: original contents (syscall # to be saved) + * - r18: saved bsp (after switching to kernel stack) + * - r20: saved r1 (gp) + * - r21: saved ar.fpsr + * - r22: kernel's register backing store base (krbs_base) + * - r23: saved ar.bspstore + * - r24: saved ar.rnat + * - r25: saved ar.unat + * - r26: saved ar.pfs + * - r27: saved ar.rsc + * - r28: saved cr.iip + * - r29: saved cr.ipsr + * - r31: saved pr + * - b0: original contents (to be saved) + * On exit: + * - executing on bank 1 registers + * - psr.ic enabled, interrupts restored + * - r1: kernel's gp + * - r3: preserved (same as on entry) + * - r12: points to kernel stack + * - r13: points to current task + * - p15: TRUE if interrupts need to be re-enabled + * - ar.fpsr: set to kernel settings + */ +ENTRY(ia64_syscall_setup) + alloc r19=ar.pfs,8,0,0,0 + tnat.nz p8,p0=in0 + add r16=PT(CR_IPSR),r1 /* initialize first base pointer */ + ;; + st8 [r16]=r29,16; /* save cr.ipsr */ + adds r17=PT(CR_IIP),r1; /* initialize second base pointer */ + ;; +(p8) mov in0=-1 + tnat.nz p9,p0=in1 + st8 [r17]=r28,16; /* save cr.iip */ + mov r28=b0; +(pKern) mov r18=r0; /* make sure r18 isn't NaT */ + ;; +(p9) mov in1=-1 + tnat.nz p10,p0=in2 + st8 [r16]=r30,16; /* save cr.ifs */ + st8 [r17]=r25,16; /* save ar.unat */ +(pUser) sub r18=r18,r22; /* r18=RSE.ndirty*8 */ + ;; + st8 [r16]=r26,16; /* save ar.pfs */ + st8 [r17]=r27,16; /* save ar.rsc */ + tbit.nz p15,p0=r29,IA64_PSR_I_BIT + ;; /* avoid RAW on r16 & r17 */ +(p10) mov in2=-1 + nop.f 0 + tnat.nz p11,p0=in3 +(pKern) adds r16=16,r16; /* skip over ar_rnat field */ +(pKern) adds r17=16,r17; /* skip over ar_bspstore field */ + shl r18=r18,16; /* compute ar.rsc to be used for "loadrs" */ + ;; +(p11) mov in3=-1 + tnat.nz p12,p0=in4 +(pUser) st8 [r16]=r24,16; /* save ar.rnat */ +(pUser) st8 [r17]=r23,16; /* save ar.bspstore */ + ;; +(p12) mov in4=-1 + tnat.nz p13,p0=in5 + st8 [r16]=r31,16; /* save predicates */ + st8 [r17]=r28,16; /* save b0 */ + dep r14=-1,r0,61,3; + ;; + st8 [r16]=r18,16; /* save ar.rsc value for "loadrs" */ + st8.spill [r17]=r20,16; /* save original r1 */ + adds r2=IA64_PT_REGS_R16_OFFSET,r1; + ;; +(p13) mov in5=-1 + tnat.nz p14,p0=in6 +.mem.offset 0,0; st8.spill [r16]=r12,16; +.mem.offset 8,0; st8.spill [r17]=r13,16; + cmp.eq pNonSys,pSys=r0,r0 /* initialize pSys=0, pNonSys=1 */ + ;; +(p14) mov in6=-1 + tnat.nz p8,p0=in7 +.mem.offset 0,0; st8 [r16]=r21,16; /* ar.fpsr */ +.mem.offset 8,0; st8.spill [r17]=r15,16; + adds r12=-16,r1; /* switch to kernel memory stack (with 16 bytes of scratch) */ + ;; + mov r13=IA64_KR(CURRENT); /* establish `current' */ + movl r1=__gp; /* establish kernel global pointer */ + ;; + MINSTATE_END_SAVE_MIN_VIRT + + tnat.nz p9,p0=r15 +(p8) mov in7=-1 + ssm psr.ic | PSR_DEFAULT_BITS + movl r17=FPSR_DEFAULT + adds r8=(IA64_PT_REGS_R8_OFFSET-IA64_PT_REGS_R16_OFFSET),r2 + ;; + srlz.i // guarantee that interruption collection is on + cmp.eq pSys,pNonSys=r0,r0 // set pSys=1, pNonSys=0 +(p9) mov r15=-1 +(p15) ssm psr.i // restore psr.i + mov.m ar.fpsr=r17 + stf8 [r8]=f1 // ensure pt_regs.r8 != 0 (see handle_syscall_error) + br.ret.sptk.many b7 +END(ia64_syscall_setup) + .align 1024 ///////////////////////////////////////////////////////////////////////////////////////// // 0x3c00 Entry 15 (size 64 bundles) Reserved @@ -808,90 +923,6 @@ DBG_FAULT(16) FAULT(16) -#ifdef CONFIG_IA32_SUPPORT - - /* - * There is no particular reason for this code to be here, other than that - * there happens to be space here that would go unused otherwise. If this - * fault ever gets "unreserved", simply moved the following code to a more - * suitable spot... - */ - - // IA32 interrupt entry point - -ENTRY(dispatch_to_ia32_handler) - SAVE_MIN - ;; - mov r14=cr.isr - ssm psr.ic | PSR_DEFAULT_BITS - ;; - srlz.i // guarantee that interruption collection is on - ;; -(p15) ssm psr.i - adds r3=8,r2 // Base pointer for SAVE_REST - ;; - SAVE_REST - ;; - mov r15=0x80 - shr r14=r14,16 // Get interrupt number - ;; - cmp.ne p6,p0=r14,r15 -(p6) br.call.dpnt.many b6=non_ia32_syscall - - adds r14=IA64_PT_REGS_R8_OFFSET + 16,sp // 16 byte hole per SW conventions - adds r15=IA64_PT_REGS_R1_OFFSET + 16,sp - ;; - cmp.eq pSys,pNonSys=r0,r0 // set pSys=1, pNonSys=0 - st8 [r15]=r8 // save original EAX in r1 (IA32 procs don't use the GP) - ;; - alloc r15=ar.pfs,0,0,6,0 // must first in an insn group - ;; - ld4 r8=[r14],8 // r8 == eax (syscall number) - mov r15=230 // number of entries in ia32 system call table - ;; - cmp.ltu.unc p6,p7=r8,r15 - ld4 out1=[r14],8 // r9 == ecx - ;; - ld4 out2=[r14],8 // r10 == edx - ;; - ld4 out0=[r14] // r11 == ebx - adds r14=(IA64_PT_REGS_R8_OFFSET-(8*3)) + 16,sp - ;; - ld4 out5=[r14],8 // r13 == ebp - ;; - ld4 out3=[r14],8 // r14 == esi - adds r2=IA64_TASK_PTRACE_OFFSET,r13 // r2 = ¤t->ptrace - ;; - ld4 out4=[r14] // r15 == edi - movl r16=ia32_syscall_table - ;; -(p6) shladd r16=r8,3,r16 // force ni_syscall if not valid syscall number - ld8 r2=[r2] // r2 = current->ptrace - ;; - ld8 r16=[r16] - tbit.z p8,p0=r2,PT_TRACESYS_BIT // (current->ptrace & PT_TRACESYS) == 0? - ;; - mov b6=r16 - movl r15=ia32_ret_from_syscall - ;; - mov rp=r15 -(p8) br.call.sptk.many b6=b6 - br.cond.sptk ia32_trace_syscall - -non_ia32_syscall: - alloc r15=ar.pfs,0,0,2,0 - mov out0=r14 // interrupt # - add out1=16,sp // pointer to pt_regs - ;; // avoid WAW on CFM - br.call.sptk.many rp=ia32_bad_interrupt -.ret1: movl r15=ia64_leave_kernel - ;; - mov rp=r15 - br.ret.sptk.many rp -END(dispatch_to_ia32_handler) - -#endif /* CONFIG_IA32_SUPPORT */ - .align 1024 ///////////////////////////////////////////////////////////////////////////////////////// // 0x4400 Entry 17 (size 64 bundles) Reserved @@ -1415,3 +1446,89 @@ // 0x7f00 Entry 67 (size 16 bundles) Reserved DBG_FAULT(67) FAULT(67) + +#ifdef CONFIG_IA32_SUPPORT + + /* + * There is no particular reason for this code to be here, other than that + * there happens to be space here that would go unused otherwise. If this + * fault ever gets "unreserved", simply moved the following code to a more + * suitable spot... + */ + + // IA32 interrupt entry point + +ENTRY(dispatch_to_ia32_handler) + SAVE_MIN + ;; + mov r14=cr.isr + ssm psr.ic | PSR_DEFAULT_BITS + ;; + srlz.i // guarantee that interruption collection is on + ;; +(p15) ssm psr.i + adds r3=8,r2 // Base pointer for SAVE_REST + ;; + SAVE_REST + ;; + mov r15=0x80 + shr r14=r14,16 // Get interrupt number + ;; + cmp.ne p6,p0=r14,r15 +(p6) br.call.dpnt.many b6=non_ia32_syscall + + adds r14=IA64_PT_REGS_R8_OFFSET + 16,sp // 16 byte hole per SW conventions + adds r15=IA64_PT_REGS_R1_OFFSET + 16,sp + ;; + cmp.eq pSys,pNonSys=r0,r0 // set pSys=1, pNonSys=0 + ld8 r8=[r14] // get r8 + ;; + st8 [r15]=r8 // save original EAX in r1 (IA32 procs don't use the GP) + ;; + alloc r15=ar.pfs,0,0,6,0 // must first in an insn group + ;; + ld4 r8=[r14],8 // r8 == eax (syscall number) + mov r15=230 // number of entries in ia32 system call table + ;; + cmp.ltu.unc p6,p7=r8,r15 + ld4 out1=[r14],8 // r9 == ecx + ;; + ld4 out2=[r14],8 // r10 == edx + ;; + ld4 out0=[r14] // r11 == ebx + adds r14=(IA64_PT_REGS_R13_OFFSET) + 16,sp + ;; + ld4 out5=[r14],PT(R14)-PT(R13) // r13 == ebp + ;; + ld4 out3=[r14],PT(R15)-PT(R14) // r14 == esi + adds r2=IA64_TASK_PTRACE_OFFSET,r13 // r2 = ¤t->ptrace + ;; + ld4 out4=[r14] // r15 == edi + movl r16=ia32_syscall_table + ;; +(p6) shladd r16=r8,3,r16 // force ni_syscall if not valid syscall number + ld8 r2=[r2] // r2 = current->ptrace + ;; + ld8 r16=[r16] + tbit.z p8,p0=r2,PT_TRACESYS_BIT // (current->ptrace & PT_TRACESYS) == 0? + ;; + mov b6=r16 + movl r15=ia32_ret_from_syscall + ;; + mov rp=r15 +(p8) br.call.sptk.many b6=b6 + br.cond.sptk ia32_trace_syscall + +non_ia32_syscall: + alloc r15=ar.pfs,0,0,2,0 + mov out0=r14 // interrupt # + add out1=16,sp // pointer to pt_regs + ;; // avoid WAW on CFM + br.call.sptk.many rp=ia32_bad_interrupt +.ret1: movl r15=ia64_leave_kernel + ;; + mov rp=r15 + br.ret.sptk.many rp +END(dispatch_to_ia32_handler) + +#endif /* CONFIG_IA32_SUPPORT */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/mca.c linux-2.4.23-pre8/arch/ia64/kernel/mca.c --- linux-2.4.22/arch/ia64/kernel/mca.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/mca.c 2003-10-22 22:48:54.000000000 +0000 @@ -59,13 +59,13 @@ #include #include -#include #include #include #undef MCA_PRT_XTRA_DATA -#define print_symbol(fmt, addr) printk(fmt, ""); +#define print_symbol(fmt, addr) printk(fmt, "(no symbol)"); +extern void show_stack(struct task_struct *); typedef struct ia64_fptr { unsigned long fp; @@ -99,6 +99,12 @@ .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, @@ -117,6 +123,12 @@ .name = "cpe_hndlr" }; +static struct irqaction mca_cpep_irqaction = { + .handler = ia64_mca_cpe_int_caller, + .flags = SA_INTERRUPT, + .name = "cpe_poll" +}; + #define MAX_CPE_POLL_INTERVAL (15*60*HZ) /* 15 minutes */ #define MIN_CPE_POLL_INTERVAL (2*60*HZ) /* 2 minutes */ #define CMC_POLL_INTERVAL (1*60*HZ) /* 1 minute */ @@ -125,11 +137,20 @@ static struct timer_list cpe_poll_timer; static struct timer_list cmc_poll_timer; /* + * This variable tells whether we are currently in polling mode. * Start with this in the wrong state so we won't play w/ timers * before the system is ready. */ static int cmc_polling_enabled = 1; +/* + * Clearing this variable prevents CPE polling from getting activated + * in mca_late_init. Use it if your system doesn't provide a CPEI, + * but encounters problems retrieving CPE logs. This should only be + * necessary for debugging. + */ +static int cpe_poll_enabled = 1; + extern void salinfo_log_wakeup(int); /* @@ -179,6 +200,9 @@ IA64_MCA_DEBUG("ia64_mca_cpe_int_handler: received interrupt. CPU:%d vector = %#x\n", 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); } @@ -322,7 +346,7 @@ } void -init_handler_platform (sal_log_processor_info_t *proc_ptr, +init_handler_platform (pal_min_state_area_t *ms, struct pt_regs *pt, struct switch_stack *sw) { struct unw_frame_info info; @@ -337,12 +361,33 @@ */ printk("Delaying for 5 seconds...\n"); udelay(5*1000000); - show_min_state(&SAL_LPI_PSI_INFO(proc_ptr)->min_state_area); + show_min_state(ms); - fetch_min_state(&SAL_LPI_PSI_INFO(proc_ptr)->min_state_area, pt, sw); + printk("Backtrace of current task (pid %d, %s)\n", current->pid, current->comm); + fetch_min_state(ms, pt, sw); unw_init_from_interruption(&info, current, pt, sw); ia64_do_show_stack(&info, NULL); +#ifdef CONFIG_SMP + /* read_trylock() would be handy... */ + if (!tasklist_lock.write_lock) + read_lock(&tasklist_lock); +#endif + { + struct task_struct *t; + for_each_task(t) { + if (t == current) + continue; + + printk("\nBacktrace of pid %d (%s)\n", t->pid, t->comm); + show_stack(t); + } + } +#ifdef CONFIG_SMP + if (!tasklist_lock.write_lock) + read_unlock(&tasklist_lock); +#endif + printk("\nINIT dump complete. Please reboot now.\n"); while (1); /* hang city if no debugger */ } @@ -653,17 +698,17 @@ IA64_MCA_DEBUG("ia64_mca_init: registered mca rendezvous spinloop and wakeup mech.\n"); - ia64_mc_info.imi_mca_handler = __pa(mca_hldlr_ptr->fp); + ia64_mc_info.imi_mca_handler = ia64_tpa(mca_hldlr_ptr->fp); /* * XXX - disable SAL checksum by setting size to 0; should be - * __pa(ia64_os_mca_dispatch_end) - __pa(ia64_os_mca_dispatch); + * 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, - mca_hldlr_ptr->gp, + ia64_tpa(mca_hldlr_ptr->gp), ia64_mc_info.imi_mca_handler_size, 0, 0, 0))) { @@ -673,15 +718,15 @@ } 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, mca_hldlr_ptr->gp); + 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 = __pa(mon_init_ptr->fp); + 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 = __pa(slave_init_ptr->fp); + 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", @@ -690,10 +735,10 @@ /* Register the os init handler with SAL */ if ((rc = ia64_sal_set_vectors(SAL_VECTOR_OS_INIT, ia64_mc_info.imi_monarch_init_handler, - __pa(ia64_get_gp()), + ia64_tpa(ia64_get_gp()), ia64_mc_info.imi_monarch_init_handler_size, ia64_mc_info.imi_slave_init_handler, - __pa(ia64_get_gp()), + ia64_tpa(ia64_get_gp()), ia64_mc_info.imi_slave_init_handler_size))) { printk(KERN_ERR "ia64_mca_init: Failed to register m/s init handlers with SAL. " @@ -704,10 +749,11 @@ IA64_MCA_DEBUG("ia64_mca_init: registered os init handler with SAL\n"); /* - * Configure the CMCI vector and handler. Interrupts for CMC are + * 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 */ @@ -822,9 +868,12 @@ int cpu; /* Clear the Rendez checkin flag for all cpus */ - for(cpu = 0; cpu < smp_num_cpus; cpu++) + for(cpu = 0; cpu < NR_CPUS; cpu++) { + if (!cpu_online(cpu)) + continue; if (ia64_mc_info.imi_rendez_checkin[cpu] == IA64_MCA_RENDEZ_CHECKIN_DONE) ia64_mca_wakeup(cpu); + } } @@ -841,11 +890,11 @@ void ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *ptregs) { - int flags; + unsigned long flags; int cpu = smp_processor_id(); /* Mask all interrupts */ - save_and_cli(flags); + local_irq_save(flags); ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE; /* Register with the SAL monarch that the slave has @@ -860,7 +909,7 @@ ia64_mca_wakeup_ipi_wait(); /* Enable all interrupts */ - restore_flags(flags); + local_irq_restore(flags); } @@ -882,7 +931,6 @@ void ia64_mca_wakeup_int_handler(int wakeup_irq, void *arg, struct pt_regs *ptregs) { - } /* @@ -987,6 +1035,9 @@ IA64_MCA_DEBUG("ia64_mca_cmc_int_handler: received interrupt vector = %#x on CPU %d\n", 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); @@ -994,7 +1045,7 @@ if (!cmc_polling_enabled) { int i, count = 1; /* we know 1 happened now */ unsigned long now = jiffies; - + for (i = 0; i < CMC_HISTORY_LENGTH; i++) { if (now - cmc_history[i] <= HZ) count++; @@ -1002,34 +1053,24 @@ IA64_MCA_DEBUG(KERN_INFO "CMC threshold %d/%d\n", count, CMC_HISTORY_LENGTH); if (count >= CMC_HISTORY_LENGTH) { - /* - * CMC threshold exceeded, clear the history - * so we have a fresh start when we return - */ - for (index = 0 ; index < CMC_HISTORY_LENGTH; index++) - cmc_history[index] = 0; - index = 0; - /* Switch to polling mode */ cmc_polling_enabled = 1; + spin_unlock(&cmc_history_lock); /* - * Unlock & enable interrupts before - * smp_call_function or risk deadlock + * We rely on the local_irq_enable() above so + * that this can't deadlock. */ - spin_unlock(&cmc_history_lock); ia64_mca_cmc_vector_disable(NULL); - local_irq_enable(); - smp_call_function(ia64_mca_cmc_vector_disable, NULL, 1, 1); + smp_call_function(ia64_mca_cmc_vector_disable, NULL, 1, 0); /* * Corrected errors will still be corrected, but * make sure there's a log somewhere that indicates * something is generating more than we can handle. */ - printk(KERN_WARNING "ia64_mca_cmc_int_handler: WARNING: Switching to polling CMC handler, error records may be lost\n"); - + printk(KERN_WARNING "%s: WARNING: Switching to polling CMC handler, error records may be lost\n", __FUNCTION__); mod_timer(&cmc_poll_timer, jiffies + CMC_POLL_INTERVAL); @@ -1082,16 +1123,62 @@ /* * ia64_mca_cmc_int_caller * - * Call CMC interrupt handler, only purpose is to have a - * smp_call_function callable entry. + * Triggered by sw interrupt from CMC polling routine. Calls + * real interrupt handler and either triggers a sw interrupt + * on the next cpu or does cleanup at the end. * - * Inputs : dummy(unused) - * Outputs : None - * */ -static void -ia64_mca_cmc_int_caller(void *dummy) + * Inputs + * interrupt number + * client data arg ptr + * saved registers ptr + * Outputs + * None + */ +void +ia64_mca_cmc_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs) { - ia64_mca_cmc_int_handler(0, NULL, NULL); + static int start_count = -1; + unsigned int cpuid; + + cpuid = smp_processor_id(); + + /* If first cpu, update count */ + if (start_count == -1) + start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CMC); + + ia64_mca_cmc_int_handler(cpe_irq, arg, ptregs); + + for (++cpuid ; cpuid < NR_CPUS && !cpu_online(cpuid) ; cpuid++); + + 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 (start_count == IA64_LOG_COUNT(SAL_INFO_TYPE_CMC)) { + + printk(KERN_WARNING "%s: Returning to interrupt driven CMC handler\n", __FUNCTION__); + + /* + * The cmc interrupt handler enabled irqs, so + * this can't deadlock. + */ + smp_call_function(ia64_mca_cmc_vector_enable, NULL, 1, 0); + + /* + * Turn off interrupts before re-enabling the + * cmc vector locally. Make sure we get out. + */ + local_irq_disable(); + ia64_mca_cmc_vector_enable(NULL); + cmc_polling_enabled = 0; + + } else { + + mod_timer(&cmc_poll_timer, jiffies + CMC_POLL_INTERVAL); + } + + start_count = -1; + } } /* @@ -1106,49 +1193,63 @@ static void ia64_mca_cmc_poll (unsigned long dummy) { - int start_count; - - start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CMC); - - /* Call the interrupt handler */ - smp_call_function(ia64_mca_cmc_int_caller, NULL, 1, 1); - local_irq_disable(); - ia64_mca_cmc_int_caller(NULL); - local_irq_enable(); - - /* - * If no log recored, switch out of polling mode. - */ - if (start_count == IA64_LOG_COUNT(SAL_INFO_TYPE_CMC)) { - printk(KERN_WARNING "ia64_mca_cmc_poll: Returning to interrupt driven CMC handler\n"); - cmc_polling_enabled = 0; - smp_call_function(ia64_mca_cmc_vector_enable, NULL, 1, 1); - ia64_mca_cmc_vector_enable(NULL); - } else { - mod_timer(&cmc_poll_timer, jiffies + CMC_POLL_INTERVAL); - } + /* Trigger a CMC interrupt cascade */ + platform_send_ipi(__ffs(cpu_online_map), IA64_CMCP_VECTOR, IA64_IPI_DM_INT, 0); } /* * ia64_mca_cpe_int_caller * - * Call CPE interrupt handler, only purpose is to have a - * smp_call_function callable entry. + * Triggered by sw interrupt from CPE polling routine. Calls + * real interrupt handler and either triggers a sw interrupt + * on the next cpu or does cleanup at the end. * - * Inputs : dummy(unused) - * Outputs : None - * */ -static void -ia64_mca_cpe_int_caller(void *dummy) + * Inputs + * interrupt number + * client data arg ptr + * saved registers ptr + * Outputs + * None + */ +void +ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs) { - ia64_mca_cpe_int_handler(0, NULL, NULL); + static int start_count = -1; + static int poll_time = MAX_CPE_POLL_INTERVAL; + unsigned int cpuid; + + cpuid = smp_processor_id(); + + /* If first cpu, update count */ + if (start_count == -1) + start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CPE); + + ia64_mca_cpe_int_handler(cpe_irq, arg, ptregs); + + for (++cpuid ; cpuid < NR_CPUS && !cpu_online(cpuid) ; cpuid++); + + if (cpuid < NR_CPUS) { + platform_send_ipi(cpuid, IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0); + } else { + /* + * If a log was recorded, increase our polling frequency, + * otherwise, backoff. + */ + if (start_count != IA64_LOG_COUNT(SAL_INFO_TYPE_CPE)) { + poll_time = max(MIN_CPE_POLL_INTERVAL, poll_time / 2); + } else { + poll_time = min(MAX_CPE_POLL_INTERVAL, poll_time * 2); + } + start_count = -1; + mod_timer(&cpe_poll_timer, jiffies + poll_time); + } } /* * ia64_mca_cpe_poll * - * Poll for Corrected Platform Errors (CPEs), dynamically adjust - * polling interval based on occurance of an event. + * Poll for Corrected Platform Errors (CPEs), trigger interrupt + * on first cpu, from there it will trickle through all the cpus. * * Inputs : dummy(unused) * Outputs : None @@ -1157,27 +1258,8 @@ static void ia64_mca_cpe_poll (unsigned long dummy) { - int start_count; - static int poll_time = MAX_CPE_POLL_INTERVAL; - - start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CPE); - - /* Call the interrupt handler */ - smp_call_function(ia64_mca_cpe_int_caller, NULL, 1, 1); - local_irq_disable(); - ia64_mca_cpe_int_caller(NULL); - local_irq_enable(); - - /* - * If a log was recorded, increase our polling frequency, - * otherwise, backoff. - */ - if (start_count != IA64_LOG_COUNT(SAL_INFO_TYPE_CPE)) { - poll_time = max(MIN_CPE_POLL_INTERVAL, poll_time/2); - } else { - poll_time = min(MAX_CPE_POLL_INTERVAL, poll_time * 2); - } - mod_timer(&cpe_poll_timer, jiffies + poll_time); + /* Trigger a CPE interrupt cascade */ + platform_send_ipi(__ffs(cpu_online_map), IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0); } /* @@ -1203,8 +1285,10 @@ cpe_poll_timer.function = ia64_mca_cpe_poll; /* If platform doesn't support CPEI, get the timer going. */ - if (acpi_request_vector(ACPI_INTERRUPT_CPEI) < 0) + 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 0; } @@ -1226,29 +1310,19 @@ void ia64_init_handler (struct pt_regs *pt, struct switch_stack *sw) { - sal_log_processor_info_t *proc_ptr; - ia64_err_rec_t *plog_ptr; + pal_min_state_area_t *ms; - printk(KERN_INFO "Entered OS INIT handler\n"); - - /* Get the INIT processor log */ - if (!ia64_log_get(SAL_INFO_TYPE_INIT, (prfunc_t)printk)) - return; // no record retrieved - -#ifdef IA64_DUMP_ALL_PROC_INFO - ia64_log_print(SAL_INFO_TYPE_INIT, (prfunc_t)printk); -#endif + printk(KERN_INFO "Entered OS INIT handler. PSP=%lx\n", + ia64_sal_to_os_handoff_state.proc_state_param); /* - * get pointer to min state save area - * + * Address of minstate area provided by PAL is physical, + * uncacheable (bit 63 set). Convert to Linux virtual + * address in region 6. */ - plog_ptr=(ia64_err_rec_t *)IA64_LOG_CURR_BUFFER(SAL_INFO_TYPE_INIT); - proc_ptr = &plog_ptr->proc_err; + ms = (pal_min_state_area_t *)(ia64_sal_to_os_handoff_state.pal_min_state | (6ul<<61)); - ia64_process_min_state_save(&SAL_LPI_PSI_INFO(proc_ptr)->min_state_area); - - init_handler_platform(proc_ptr, pt, sw); /* call platform specific routines */ + init_handler_platform(ms, pt, sw); /* call platform specific routines */ } /* @@ -1271,7 +1345,8 @@ static void ia64_log_hexdump(unsigned char *p, unsigned long n_ch, prfunc_t prfunc) { - int i, j; + unsigned long i; + int j; if (!p) return; @@ -1912,9 +1987,9 @@ ia64_log_prt_guid(&psei->guid, prfunc); } if (psei->valid.oem_data) { - platform_plat_specific_err_print((int)psei->header.len, - (int)sizeof(sal_log_plat_specific_err_info_t) - 1, - &(psei->oem_data[0]), prfunc); + platform_plat_specific_err_print((int) psei->header.len, + (char *) psei->oem_data - (char *) psei, + &psei->oem_data[0], prfunc); } prfunc("\n"); } @@ -2119,7 +2194,7 @@ { sal_log_section_hdr_t *slsh; int n_sects; - int ercd_pos; + u32 ercd_pos; if (!lh) return; @@ -2181,7 +2256,7 @@ { sal_log_section_hdr_t *slsh; int n_sects; - int ercd_pos; + u32 ercd_pos; int platform_err = 0; if (!lh) @@ -2319,3 +2394,12 @@ } return platform_err; } + +static int __init +ia64_mca_disable_cpe_polling(char *str) +{ + cpe_poll_enabled = 0; + return 1; +} + +__setup("disable_cpe_poll", ia64_mca_disable_cpe_polling); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/mca_asm.S linux-2.4.23-pre8/arch/ia64/kernel/mca_asm.S --- linux-2.4.22/arch/ia64/kernel/mca_asm.S 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/mca_asm.S 2003-10-22 22:48:24.000000000 +0000 @@ -57,7 +57,9 @@ st8 [_tmp]=r9,0x08;; \ st8 [_tmp]=r10,0x08;; \ st8 [_tmp]=r11,0x08;; \ - st8 [_tmp]=r12,0x08 + st8 [_tmp]=r12,0x08;; \ + st8 [_tmp]=r17,0x08;; \ + st8 [_tmp]=r18,0x08 /* * OS_MCA_TO_SAL_HANDOFF_STATE (SAL 3.0 spec) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/minstate.h linux-2.4.23-pre8/arch/ia64/kernel/minstate.h --- linux-2.4.22/arch/ia64/kernel/minstate.h 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/minstate.h 2003-10-22 22:49:21.000000000 +0000 @@ -3,43 +3,25 @@ #include "entry.h" /* - * A couple of convenience macros that make writing and reading - * SAVE_MIN and SAVE_REST easier. - */ -#define rARPR r31 -#define rCRIFS r30 -#define rCRIPSR r29 -#define rCRIIP r28 -#define rARRSC r27 -#define rARPFS r26 -#define rARUNAT r25 -#define rARRNAT r24 -#define rARBSPSTORE r23 -#define rKRBS r22 -#define rB6 r21 -#define rR1 r20 - -/* - * Here start the source dependent macros. - */ - -/* - * For ivt.s we want to access the stack virtually so we dont have to disable translation + * For ivt.s we want to access the stack virtually so we don't have to disable translation * on interrupts. + * + * On entry: + * r1: pointer to current task (ar.k6) */ #define MINSTATE_START_SAVE_MIN_VIRT \ dep r1=-1,r1,61,3; /* r1 = current (virtual) */ \ (pUser) mov ar.rsc=0; /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */ \ ;; \ -(pUser) addl rKRBS=IA64_RBS_OFFSET,r1; /* compute base of RBS */ \ -(pUser) mov rARRNAT=ar.rnat; \ +(pUser) addl r22=IA64_RBS_OFFSET,r1; /* compute base of RBS */ \ +(pUser) mov r24=ar.rnat; \ (pKern) mov r1=sp; /* get sp */ \ ;; \ (pUser) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1; /* compute base of memory stack */ \ -(pUser) mov rARBSPSTORE=ar.bspstore; /* save ar.bspstore */ \ +(pUser) mov r23=ar.bspstore; /* save ar.bspstore */ \ ;; \ (pKern) addl r1=-IA64_PT_REGS_SIZE,r1; /* if in kernel mode, use sp (r12) */ \ -(pUser) mov ar.bspstore=rKRBS; /* switch to kernel RBS */ \ +(pUser) mov ar.bspstore=r22; /* switch to kernel RBS */ \ ;; \ (pUser) mov r18=ar.bsp; \ (pUser) mov ar.rsc=0x3; /* set eager mode, pl 0, little-endian, loadrs=0 */ \ @@ -51,21 +33,21 @@ /* * For mca_asm.S we want to access the stack physically since the state is saved before we - * go virtual and dont want to destroy the iip or ipsr. + * go virtual and don't want to destroy the iip or ipsr. */ #define MINSTATE_START_SAVE_MIN_PHYS \ (pKern) movl sp=ia64_init_stack+IA64_STK_OFFSET-IA64_PT_REGS_SIZE; \ (pUser) mov ar.rsc=0; /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */ \ -(pUser) addl rKRBS=IA64_RBS_OFFSET,r1; /* compute base of register backing store */ \ +(pUser) addl r22=IA64_RBS_OFFSET,r1; /* compute base of register backing store */ \ ;; \ -(pUser) mov rARRNAT=ar.rnat; \ +(pUser) mov r24=ar.rnat; \ (pKern) dep r1=0,sp,61,3; /* compute physical addr of sp */ \ (pUser) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1; /* compute base of memory stack */ \ -(pUser) mov rARBSPSTORE=ar.bspstore; /* save ar.bspstore */ \ -(pUser) dep rKRBS=-1,rKRBS,61,3; /* compute kernel virtual addr of RBS */\ +(pUser) mov r23=ar.bspstore; /* save ar.bspstore */ \ +(pUser) dep r22=-1,r22,61,3; /* compute kernel virtual addr of RBS */\ ;; \ (pKern) addl r1=-IA64_PT_REGS_SIZE,r1; /* if in kernel mode, use sp (r12) */ \ -(pUser) mov ar.bspstore=rKRBS; /* switch to kernel RBS */ \ +(pUser) mov ar.bspstore=r22; /* switch to kernel RBS */ \ ;; \ (pUser) mov r18=ar.bsp; \ (pUser) mov ar.rsc=0x3; /* set eager mode, pl 0, little-endian, loadrs=0 */ \ @@ -96,143 +78,168 @@ * * Upon exit, the state is as follows: * psr.ic: off - * r2 = points to &pt_regs.r16 + * r2 = points to &pt_regs.r16 + * r8 = contents of ar.ccv + * r9 = contents of ar.csd + * r10 = contents of ar.ssd + * r11 = FPSR_DEFAULT * r12 = kernel sp (kernel virtual address) * r13 = points to current task_struct (kernel virtual address) * p15 = TRUE if psr.i is set in cr.ipsr - * predicate registers (other than p2, p3, and p15), b6, r3, r8, r9, r10, r11, r14, r15: + * predicate registers (other than p2, p3, and p15), b6, r3, r14, r15: * preserved * * Note that psr.ic is NOT turned on by this macro. This is so that * we can pass interruption state as arguments to a handler. */ -#define DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA) \ - mov rARRSC=ar.rsc; \ - mov rARPFS=ar.pfs; \ - mov rR1=r1; \ - mov rARUNAT=ar.unat; \ - mov rCRIPSR=cr.ipsr; \ - mov rB6=b6; /* rB6 = branch reg 6 */ \ - mov rCRIIP=cr.iip; \ - mov r1=IA64_KR(CURRENT); /* r1 = current (physical) */ \ - COVER; \ - ;; \ - invala; \ - extr.u r16=rCRIPSR,32,2; /* extract psr.cpl */ \ - ;; \ - cmp.eq pKern,pUser=r0,r16; /* are we in kernel mode already? (psr.cpl==0) */ \ - /* switch from user to kernel RBS: */ \ - ;; \ - SAVE_IFS; \ - MINSTATE_START_SAVE_MIN \ - ;; \ - mov r16=r1; /* initialize first base pointer */ \ - adds r17=8,r1; /* initialize second base pointer */ \ - ;; \ - st8 [r16]=rCRIPSR,16; /* save cr.ipsr */ \ - st8 [r17]=rCRIIP,16; /* save cr.iip */ \ -(pKern) mov r18=r0; /* make sure r18 isn't NaT */ \ - ;; \ - st8 [r16]=rCRIFS,16; /* save cr.ifs */ \ - st8 [r17]=rARUNAT,16; /* save ar.unat */ \ -(pUser) sub r18=r18,rKRBS; /* r18=RSE.ndirty*8 */ \ - ;; \ - st8 [r16]=rARPFS,16; /* save ar.pfs */ \ - st8 [r17]=rARRSC,16; /* save ar.rsc */ \ - tbit.nz p15,p0=rCRIPSR,IA64_PSR_I_BIT \ - ;; /* avoid RAW on r16 & r17 */ \ -(pKern) adds r16=16,r16; /* skip over ar_rnat field */ \ -(pKern) adds r17=16,r17; /* skip over ar_bspstore field */ \ -(pUser) st8 [r16]=rARRNAT,16; /* save ar.rnat */ \ -(pUser) st8 [r17]=rARBSPSTORE,16; /* save ar.bspstore */ \ - ;; \ - st8 [r16]=rARPR,16; /* save predicates */ \ - st8 [r17]=rB6,16; /* save b6 */ \ - shl r18=r18,16; /* compute ar.rsc to be used for "loadrs" */ \ - ;; \ - st8 [r16]=r18,16; /* save ar.rsc value for "loadrs" */ \ - st8.spill [r17]=rR1,16; /* save original r1 */ \ - ;; \ -.mem.offset 0,0; st8.spill [r16]=r2,16; \ -.mem.offset 8,0; st8.spill [r17]=r3,16; \ - adds r2=IA64_PT_REGS_R16_OFFSET,r1; \ - ;; \ -.mem.offset 0,0; st8.spill [r16]=r12,16; \ -.mem.offset 8,0; st8.spill [r17]=r13,16; \ - cmp.eq pNonSys,pSys=r0,r0 /* initialize pSys=0, pNonSys=1 */ \ - ;; \ -.mem.offset 0,0; st8.spill [r16]=r14,16; \ -.mem.offset 8,0; st8.spill [r17]=r15,16; \ - dep r14=-1,r0,61,3; \ - ;; \ -.mem.offset 0,0; st8.spill [r16]=r8,16; \ -.mem.offset 8,0; st8.spill [r17]=r9,16; \ - adds r12=-16,r1; /* switch to kernel memory stack (with 16 bytes of scratch) */ \ - ;; \ -.mem.offset 0,0; st8.spill [r16]=r10,16; \ -.mem.offset 8,0; st8.spill [r17]=r11,16; \ - mov r13=IA64_KR(CURRENT); /* establish `current' */ \ - ;; \ - EXTRA; \ - movl r1=__gp; /* establish kernel global pointer */ \ - ;; \ +#define DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA) \ + mov r29=cr.ipsr; \ + mov r17=IA64_KR(CURRENT); /* r1 = current (physical) */ \ + mov r20=r1; \ + mov r27=ar.rsc; \ + mov r25=ar.unat; \ + mov r26=ar.pfs; \ + mov r21=ar.fpsr; \ + mov r28=cr.iip; \ + COVER; \ + ;; \ + invala; \ + extr.u r16=r29,32,2; /* extract psr.cpl */ \ + ;; \ + cmp.eq pKern,pUser=r0,r16; /* are we in kernel mode already? (psr.cpl==0) */ \ + mov r1=r17; \ + /* switch from user to kernel RBS: */ \ + ;; \ + SAVE_IFS; \ + MINSTATE_START_SAVE_MIN \ + adds r17=2*L1_CACHE_BYTES,r1; /* really: biggest cache-line size */ \ + adds r16=PT(CR_IPSR),r1; \ + ;; \ + lfetch.fault.excl.nt1 [r17],L1_CACHE_BYTES; \ + st8 [r16]=r29; /* save cr.ipsr */ \ + ;; \ + lfetch.fault.excl.nt1 [r17]; \ + ;; \ + adds r16=PT(R8),r1; /* initialize first base pointer */ \ + adds r17=PT(R9),r1; /* initialize second base pointer */ \ + ;; \ +.mem.offset 0,0; st8.spill [r16]=r8,16; \ +.mem.offset 8,0; st8.spill [r17]=r9,16; \ + ;; \ +.mem.offset 0,0; st8.spill [r16]=r10,24; \ +.mem.offset 8,0; st8.spill [r17]=r11,32; \ + ;; \ + st8 [r16]=r28,8; /* save cr.iip */ \ + mov r28=b0; /* rCRIIP=branch reg b0 */ \ +(pKern) mov r18=r0; /* make sure r18 isn't NaT */ \ + mov r8=ar.ccv; \ + mov r9=ar.csd; \ + mov r10=ar.ssd; \ + movl r11=FPSR_DEFAULT; /* L-unit */ \ + ;; \ + st8 [r16]=r30,16; /* save cr.ifs */ \ + st8 [r17]=r25,16; /* save ar.unat */ \ +(pUser) sub r18=r18,r22; /* r18=RSE.ndirty*8 */ \ + ;; \ + st8 [r16]=r26,16; /* save ar.pfs */ \ + st8 [r17]=r27,16; /* save ar.rsc */ \ + tbit.nz p15,p0=r29,IA64_PSR_I_BIT \ + ;; /* avoid RAW on r16 & r17 */ \ +(pKern) adds r16=16,r16; /* skip over ar_rnat field */ \ +(pKern) adds r17=16,r17; /* skip over ar_bspstore field */ \ +(pUser) st8 [r16]=r24,16; /* save ar.rnat */ \ +(pUser) st8 [r17]=r23,16; /* save ar.bspstore */ \ + ;; \ + st8 [r16]=r31,16; /* save predicates */ \ + st8 [r17]=r28,16; /* save b0 */ \ + shl r18=r18,16; /* compute ar.rsc to be used for "loadrs" */ \ + ;; \ + st8 [r16]=r18,16; /* save ar.rsc value for "loadrs" */ \ + st8.spill [r17]=r20,16; /* save original r1 */ \ + ;; \ +.mem.offset 0,0; st8.spill [r16]=r12,16; \ +.mem.offset 8,0; st8.spill [r17]=r13,16; \ + cmp.eq pNonSys,pSys=r0,r0 /* initialize pSys=0, pNonSys=1 */ \ + ;; \ +.mem.offset 0,0; st8 [r16]=r21,PT(R14)-PT(AR_FPSR); /* ar.fpsr */ \ +.mem.offset 8,0; st8.spill [r17]=r15,PT(R3)-PT(R15); \ + adds r12=-16,r1; /* switch to kernel memory stack (with 16 bytes of scratch) */ \ + ;; \ + mov r13=IA64_KR(CURRENT); /* establish `current' */ \ +.mem.offset 0,0; st8.spill [r16]=r14,8; \ + dep r14=-1,r0,61,3; \ + ;; \ +.mem.offset 0,0; st8.spill [r16]=r2,16; \ +.mem.offset 8,0; st8.spill [r17]=r3,16; \ + adds r2=IA64_PT_REGS_R16_OFFSET,r1; \ + ;; \ + EXTRA; \ + movl r1=__gp; /* establish kernel global pointer */ \ + ;; \ MINSTATE_END_SAVE_MIN /* - * SAVE_REST saves the remainder of pt_regs (with psr.ic on). This - * macro guarantees to preserve all predicate registers, r8, r9, r10, - * r11, r14, and r15. + * SAVE_REST saves the remainder of pt_regs (with psr.ic on). * * Assumed state upon entry: * psr.ic: on * r2: points to &pt_regs.r16 * r3: points to &pt_regs.r17 + * r8: contents of ar.ccv + * r9: contents of ar.csd + * r10: contents of ar.ssd + * r11: FPSR_DEFAULT + * + * Registers r14 and r15 are guaranteed not to be touched by SAVE_REST. */ #define SAVE_REST \ -.mem.offset 0,0; st8.spill [r2]=r16,16; \ -.mem.offset 8,0; st8.spill [r3]=r17,16; \ - ;; \ -.mem.offset 0,0; st8.spill [r2]=r18,16; \ -.mem.offset 8,0; st8.spill [r3]=r19,16; \ +.mem.offset 0,0; st8.spill [r2]=r16,16; \ +.mem.offset 8,0; st8.spill [r3]=r17,16; \ ;; \ - mov r16=ar.ccv; /* M-unit */ \ - movl r18=FPSR_DEFAULT /* L-unit */ \ +.mem.offset 0,0; st8.spill [r2]=r18,16; \ +.mem.offset 8,0; st8.spill [r3]=r19,16; \ ;; \ - mov r17=ar.fpsr; /* M-unit */ \ - mov ar.fpsr=r18; /* M-unit */ \ +.mem.offset 0,0; st8.spill [r2]=r20,16; \ +.mem.offset 8,0; st8.spill [r3]=r21,16; \ + mov r18=b6; \ ;; \ -.mem.offset 0,0; st8.spill [r2]=r20,16; \ -.mem.offset 8,0; st8.spill [r3]=r21,16; \ - mov r18=b0; \ - ;; \ -.mem.offset 0,0; st8.spill [r2]=r22,16; \ -.mem.offset 8,0; st8.spill [r3]=r23,16; \ +.mem.offset 0,0; st8.spill [r2]=r22,16; \ +.mem.offset 8,0; st8.spill [r3]=r23,16; \ mov r19=b7; \ ;; \ -.mem.offset 0,0; st8.spill [r2]=r24,16; \ -.mem.offset 8,0; st8.spill [r3]=r25,16; \ - ;; \ -.mem.offset 0,0; st8.spill [r2]=r26,16; \ -.mem.offset 8,0; st8.spill [r3]=r27,16; \ +.mem.offset 0,0; st8.spill [r2]=r24,16; \ +.mem.offset 8,0; st8.spill [r3]=r25,16; \ ;; \ -.mem.offset 0,0; st8.spill [r2]=r28,16; \ -.mem.offset 8,0; st8.spill [r3]=r29,16; \ +.mem.offset 0,0; st8.spill [r2]=r26,16; \ +.mem.offset 8,0; st8.spill [r3]=r27,16; \ ;; \ -.mem.offset 0,0; st8.spill [r2]=r30,16; \ -.mem.offset 8,0; st8.spill [r3]=r31,16; \ +.mem.offset 0,0; st8.spill [r2]=r28,16; \ +.mem.offset 8,0; st8.spill [r3]=r29,16; \ ;; \ - st8 [r2]=r16,16; /* ar.ccv */ \ - st8 [r3]=r17,16; /* ar.fpsr */ \ +.mem.offset 0,0; st8.spill [r2]=r30,16; \ +.mem.offset 8,0; st8.spill [r3]=r31,32; \ ;; \ - st8 [r2]=r18,16; /* b0 */ \ - st8 [r3]=r19,16+8; /* b7 */ \ + mov ar.fpsr=r11; /* M-unit */ \ + st8 [r2]=r8,8; /* ar.ccv */ \ + adds r24=PT(B6)-PT(F7),r3; \ ;; \ stf.spill [r2]=f6,32; \ stf.spill [r3]=f7,32; \ ;; \ stf.spill [r2]=f8,32; \ - stf.spill [r3]=f9,32 + stf.spill [r3]=f9,32; \ + ;; \ + stf.spill [r2]=f10; \ + stf.spill [r3]=f11; \ + adds r25=PT(B7)-PT(F11),r3; \ + ;; \ + st8 [r24]=r18,16; /* b6 */ \ + st8 [r25]=r19,16; /* b7 */ \ + ;; \ + st8 [r24]=r9; /* ar.csd */ \ + st8 [r25]=r10; /* ar.ssd */ \ + ;; -#define SAVE_MIN_WITH_COVER DO_SAVE_MIN(cover, mov rCRIFS=cr.ifs,) -#define SAVE_MIN_WITH_COVER_R19 DO_SAVE_MIN(cover, mov rCRIFS=cr.ifs, mov r15=r19) -#define SAVE_MIN DO_SAVE_MIN( , mov rCRIFS=r0, ) +#define SAVE_MIN_WITH_COVER DO_SAVE_MIN(cover, mov r30=cr.ifs,) +#define SAVE_MIN_WITH_COVER_R19 DO_SAVE_MIN(cover, mov r30=cr.ifs, mov r15=r19) +#define SAVE_MIN DO_SAVE_MIN( , mov r30=r0, ) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/pal.S linux-2.4.23-pre8/arch/ia64/kernel/pal.S --- linux-2.4.22/arch/ia64/kernel/pal.S 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/pal.S 2003-10-22 22:49:48.000000000 +0000 @@ -164,7 +164,7 @@ ;; mov loc4=ar.rsc // save RSE configuration dep.z loc2=loc2,0,61 // convert pal entry point to physical - dep.z r8=r8,0,61 // convert rp to physical + tpa r8=r8 // convert rp to physical ;; mov b7 = loc2 // install target to branch reg mov ar.rsc=0 // put RSE in enforced lazy, LE mode @@ -174,13 +174,13 @@ or loc3=loc3,r17 // add in psr the bits to set ;; andcm r16=loc3,r16 // removes bits to clear from psr - br.call.sptk.many rp=ia64_switch_mode + br.call.sptk.many rp=ia64_switch_mode_phys .ret1: mov rp = r8 // install return address (physical) br.cond.sptk.many b7 1: mov ar.rsc=0 // put RSE in enforced lazy, LE mode mov r16=loc3 // r16= original psr - br.call.sptk.many rp=ia64_switch_mode // return to virtual mode + br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode .ret2: mov psr.l = loc3 // restore init PSR @@ -228,13 +228,13 @@ mov b7 = loc2 // install target to branch reg ;; andcm r16=loc3,r16 // removes bits to clear from psr - br.call.sptk.many rp=ia64_switch_mode + br.call.sptk.many rp=ia64_switch_mode_phys .ret6: br.call.sptk.many rp=b7 // now make the call .ret7: mov ar.rsc=0 // put RSE in enforced lazy, LE mode mov r16=loc3 // r16= original psr - br.call.sptk.many rp=ia64_switch_mode // return to virtual mode + br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode .ret8: mov psr.l = loc3 // restore init PSR mov ar.pfs = loc1 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/palinfo.c linux-2.4.23-pre8/arch/ia64/kernel/palinfo.c --- linux-2.4.22/arch/ia64/kernel/palinfo.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/palinfo.c 2003-10-22 22:47:30.000000000 +0000 @@ -91,7 +91,7 @@ "eager loads and stores" }; -#define RSE_HINTS_COUNT (sizeof(rse_hints)/sizeof(const char *)) +#define RSE_HINTS_COUNT ARRAY_SIZE(rse_hints) static const char *mem_attrib[]={ "WB", /* 000 */ @@ -192,15 +192,15 @@ for (i=0; i < 8 ; i++ ) { if (halt_info[i].pal_power_mgmt_info_s.im == 1) { - p += sprintf(p, "Power level %d:\n" \ - "\tentry_latency : %d cycles\n" \ - "\texit_latency : %d cycles\n" \ - "\tpower consumption : %d mW\n" \ - "\tCache+TLB coherency : %s\n", i, - halt_info[i].pal_power_mgmt_info_s.entry_latency, - halt_info[i].pal_power_mgmt_info_s.exit_latency, - halt_info[i].pal_power_mgmt_info_s.power_consumption, - halt_info[i].pal_power_mgmt_info_s.co ? "Yes" : "No"); + p += sprintf(p, "Power level %d:\n" + "\tentry_latency : %d cycles\n" + "\texit_latency : %d cycles\n" + "\tpower consumption : %d mW\n" + "\tCache+TLB coherency : %s\n", i, + halt_info[i].pal_power_mgmt_info_s.entry_latency, + halt_info[i].pal_power_mgmt_info_s.exit_latency, + halt_info[i].pal_power_mgmt_info_s.power_consumption, + halt_info[i].pal_power_mgmt_info_s.co ? "Yes" : "No"); } else { p += sprintf(p,"Power level %d: not implemented\n",i); } @@ -212,9 +212,9 @@ cache_info(char *page) { char *p = page; - u64 levels, unique_caches; + u64 i, levels, unique_caches; pal_cache_config_info_t cci; - int i,j, k; + int j, k; s64 status; if ((status = ia64_pal_cache_summary(&levels, &unique_caches)) != 0) { @@ -232,48 +232,50 @@ if ((status=ia64_pal_cache_config_info(i,j, &cci)) != 0) { continue; } - p += sprintf(p, "%s Cache level %d:\n" \ - "\tSize : %ld bytes\n" \ - "\tAttributes : ", - cache_types[j+cci.pcci_unified], i+1, - cci.pcci_cache_size); + p += sprintf(p, + "%s Cache level %lu:\n" + "\tSize : %lu bytes\n" + "\tAttributes : ", + cache_types[j+cci.pcci_unified], i+1, + cci.pcci_cache_size); if (cci.pcci_unified) p += sprintf(p, "Unified "); p += sprintf(p, "%s\n", cache_mattrib[cci.pcci_cache_attr]); - p += sprintf(p, "\tAssociativity : %d\n" \ - "\tLine size : %d bytes\n" \ - "\tStride : %d bytes\n", - cci.pcci_assoc, - 1<>=1; } p += sprintf(p, "\n\tLoad hints : "); for(k=0; k < 8; k++ ) { - if ( cci.pcci_ld_hints & 0x1) p += sprintf(p, "[%s]", cache_ld_hints[k]); + if (cci.pcci_ld_hints & 0x1) + p += sprintf(p, "[%s]", cache_ld_hints[k]); cci.pcci_ld_hints >>=1; } - p += sprintf(p, "\n\tAlias boundary : %d byte(s)\n" \ - "\tTag LSB : %d\n" \ - "\tTag MSB : %d\n", - 1<0 ; j--) { @@ -379,15 +380,14 @@ continue; } - p += sprintf(p, "\n%s Translation Cache Level %d:\n" \ - "\tHash sets : %d\n" \ - "\tAssociativity : %d\n" \ - "\tNumber of entries : %d\n" \ - "\tFlags : ", - cache_types[j+tc_info.tc_unified], i+1, - tc_info.tc_num_sets, - tc_info.tc_associativity, - tc_info.tc_num_entries); + p += sprintf(p, + "\n%s Translation Cache Level %d:\n" + "\tHash sets : %d\n" + "\tAssociativity : %d\n" + "\tNumber of entries : %d\n" + "\tFlags : ", + cache_types[j+tc_info.tc_unified], i+1, tc_info.tc_num_sets, + tc_info.tc_associativity, tc_info.tc_num_entries); if (tc_info.tc_pf) p += sprintf(p, "PreferredPageSizeOptimized "); if (tc_info.tc_unified) p += sprintf(p, "Unified "); @@ -436,17 +436,18 @@ if (ia64_pal_rse_info(&phys_stacked, &hints) != 0) return 0; - p += sprintf(p, "RSE stacked physical registers : %ld\n" \ - "RSE load/store hints : %ld (%s)\n", - phys_stacked, - hints.ph_data, - hints.ph_data < RSE_HINTS_COUNT ? rse_hints[hints.ph_data]: "(\?\?)"); - - if (ia64_pal_debug_info(&iregs, &dregs)) return 0; - - p += sprintf(p, "Instruction debug register pairs : %ld\n" \ - "Data debug register pairs : %ld\n", - iregs, dregs); + p += sprintf(p, + "RSE stacked physical registers : %ld\n" + "RSE load/store hints : %ld (%s)\n", + phys_stacked, hints.ph_data, + hints.ph_data < RSE_HINTS_COUNT ? rse_hints[hints.ph_data]: "(\?\?)"); + + if (ia64_pal_debug_info(&iregs, &dregs)) + return 0; + + p += sprintf(p, + "Instruction debug register pairs : %ld\n" + "Data debug register pairs : %ld\n", iregs, dregs); return p - page; } @@ -563,26 +564,21 @@ */ if (ia64_pal_version(&min_ver, &cur_ver) != 0) return 0; - p += sprintf(p, "PAL_vendor : 0x%02x (min=0x%02x)\n" \ - "PAL_A : %x.%x.%x (min=%x.%x.%x)\n" \ - "PAL_B : %x.%x.%x (min=%x.%x.%x)\n", - cur_ver.pal_version_s.pv_pal_vendor, - min_ver.pal_version_s.pv_pal_vendor, - - cur_ver.pal_version_s.pv_pal_a_model>>4, - cur_ver.pal_version_s.pv_pal_a_model&0xf, - cur_ver.pal_version_s.pv_pal_a_rev, - min_ver.pal_version_s.pv_pal_a_model>>4, - min_ver.pal_version_s.pv_pal_a_model&0xf, - min_ver.pal_version_s.pv_pal_a_rev, - - cur_ver.pal_version_s.pv_pal_b_model>>4, - cur_ver.pal_version_s.pv_pal_b_model&0xf, - cur_ver.pal_version_s.pv_pal_b_rev, - min_ver.pal_version_s.pv_pal_b_model>>4, - min_ver.pal_version_s.pv_pal_b_model&0xf, - min_ver.pal_version_s.pv_pal_b_rev); - + p += sprintf(p, + "PAL_vendor : 0x%02x (min=0x%02x)\n" + "PAL_A : %x.%x.%x (min=%x.%x.%x)\n" + "PAL_B : %x.%x.%x (min=%x.%x.%x)\n", + cur_ver.pal_version_s.pv_pal_vendor, min_ver.pal_version_s.pv_pal_vendor, + + cur_ver.pal_version_s.pv_pal_a_model>>4, + cur_ver.pal_version_s.pv_pal_a_model&0xf, cur_ver.pal_version_s.pv_pal_a_rev, + min_ver.pal_version_s.pv_pal_a_model>>4, + min_ver.pal_version_s.pv_pal_a_model&0xf, min_ver.pal_version_s.pv_pal_a_rev, + + cur_ver.pal_version_s.pv_pal_b_model>>4, + cur_ver.pal_version_s.pv_pal_b_model&0xf, cur_ver.pal_version_s.pv_pal_b_rev, + min_ver.pal_version_s.pv_pal_b_model>>4, + min_ver.pal_version_s.pv_pal_b_model&0xf, min_ver.pal_version_s.pv_pal_b_rev); return p - page; } @@ -595,26 +591,20 @@ if (ia64_pal_perf_mon_info(pm_buffer, &pm_info) != 0) return 0; - p += sprintf(p, "PMC/PMD pairs : %d\n" \ - "Counter width : %d bits\n" \ - "Cycle event number : %d\n" \ - "Retired event number : %d\n" \ - "Implemented PMC : ", - pm_info.pal_perf_mon_info_s.generic, - pm_info.pal_perf_mon_info_s.width, - pm_info.pal_perf_mon_info_s.cycles, - pm_info.pal_perf_mon_info_s.retired); + p += sprintf(p, + "PMC/PMD pairs : %d\n" + "Counter width : %d bits\n" + "Cycle event number : %d\n" + "Retired event number : %d\n" + "Implemented PMC : ", + pm_info.pal_perf_mon_info_s.generic, pm_info.pal_perf_mon_info_s.width, + pm_info.pal_perf_mon_info_s.cycles, pm_info.pal_perf_mon_info_s.retired); p = bitregister_process(p, pm_buffer, 256); - p += sprintf(p, "\nImplemented PMD : "); - p = bitregister_process(p, pm_buffer+4, 256); - p += sprintf(p, "\nCycles count capable : "); - p = bitregister_process(p, pm_buffer+8, 256); - p += sprintf(p, "\nRetired bundles count capable : "); #ifdef CONFIG_ITANIUM @@ -646,12 +636,11 @@ if (ia64_pal_freq_ratios(&proc, &bus, &itc) != 0) return 0; - p += sprintf(p, "Processor/Clock ratio : %ld/%ld\n" \ - "Bus/Clock ratio : %ld/%ld\n" \ - "ITC/Clock ratio : %ld/%ld\n", - proc.num, proc.den, - bus.num, bus.den, - itc.num, itc.den); + p += sprintf(p, + "Processor/Clock ratio : %ld/%ld\n" + "Bus/Clock ratio : %ld/%ld\n" + "ITC/Clock ratio : %ld/%ld\n", + proc.num, proc.den, bus.num, bus.den, itc.num, itc.den); return p - page; } @@ -665,7 +654,7 @@ u64 tr_buffer[4]; pal_vm_info_1_u_t vm_info_1; pal_vm_info_2_u_t vm_info_2; - int i, j; + u64 i, j; u64 max[3], pgm; struct ifa_reg { u64 valid:1; @@ -711,7 +700,7 @@ status = ia64_pal_tr_read(j, i, tr_buffer, &tr_valid); if (status != 0) { - printk(KERN_ERR "palinfo: pal call failed on tr[%d:%d]=%ld\n", + printk(KERN_ERR "palinfo: pal call failed on tr[%lu:%lu]=%ld\n", i, j, status); continue; } @@ -725,34 +714,29 @@ rid_reg = (struct rid_reg *)&tr_buffer[3]; pgm = -1 << (itir_reg->ps - 12); - p += sprintf(p, "%cTR%d: av=%d pv=%d dv=%d mv=%d\n" \ - "\tppn : 0x%lx\n" \ - "\tvpn : 0x%lx\n" \ - "\tps : ", - - "ID"[i], - j, - tr_valid.pal_tr_valid_s.access_rights_valid, - tr_valid.pal_tr_valid_s.priv_level_valid, - tr_valid.pal_tr_valid_s.dirty_bit_valid, - tr_valid.pal_tr_valid_s.mem_attr_valid, - (gr_reg->ppn & pgm)<< 12, - (ifa_reg->vpn & pgm)<< 12); + p += sprintf(p, + "%cTR%lu: av=%d pv=%d dv=%d mv=%d\n" + "\tppn : 0x%lx\n" + "\tvpn : 0x%lx\n" + "\tps : ", + "ID"[i], j, + tr_valid.pal_tr_valid_s.access_rights_valid, + tr_valid.pal_tr_valid_s.priv_level_valid, + tr_valid.pal_tr_valid_s.dirty_bit_valid, + tr_valid.pal_tr_valid_s.mem_attr_valid, + (gr_reg->ppn & pgm)<< 12, (ifa_reg->vpn & pgm)<< 12); p = bitvector_process(p, 1<< itir_reg->ps); - p += sprintf(p, "\n\tpl : %d\n" \ - "\tar : %d\n" \ - "\trid : %x\n" \ - "\tp : %d\n" \ - "\tma : %d\n" \ - "\td : %d\n", - gr_reg->pl, - gr_reg->ar, - rid_reg->rid, - gr_reg->p, - gr_reg->ma, - gr_reg->d); + p += sprintf(p, + "\n\tpl : %d\n" + "\tar : %d\n" + "\trid : %x\n" + "\tp : %d\n" + "\tma : %d\n" + "\td : %d\n", + gr_reg->pl, gr_reg->ar, rid_reg->rid, gr_reg->p, gr_reg->ma, + gr_reg->d); } } return p - page; @@ -776,7 +760,7 @@ { "tr_info", tr_info, } }; -#define NR_PALINFO_ENTRIES (sizeof(palinfo_entries)/sizeof(palinfo_entry_t)) +#define NR_PALINFO_ENTRIES (int) ARRAY_SIZE(palinfo_entries) /* * this array is used to keep track of the proc entries we create. This is diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/pci.c linux-2.4.23-pre8/arch/ia64/kernel/pci.c --- linux-2.4.22/arch/ia64/kernel/pci.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/pci.c 2003-10-22 22:48:42.000000000 +0000 @@ -235,7 +235,7 @@ } static u64 -add_io_space (acpi_resource_address64 *addr) +add_io_space (struct acpi_resource_address64 *addr) { u64 offset; int sparse = 0; @@ -266,10 +266,10 @@ } static acpi_status -count_window (acpi_resource *resource, void *data) +count_window (struct acpi_resource *resource, void *data) { unsigned int *windows = (unsigned int *) data; - acpi_resource_address64 addr; + struct acpi_resource_address64 addr; acpi_status status; status = acpi_resource_to_address64(resource, &addr); @@ -287,11 +287,11 @@ }; static acpi_status -add_window (acpi_resource *res, void *data) +add_window (struct acpi_resource *res, void *data) { struct pci_root_info *info = (struct pci_root_info *) data; struct pci_window *window; - acpi_resource_address64 addr; + struct acpi_resource_address64 addr; acpi_status status; unsigned long flags, offset = 0; struct resource *root; @@ -390,9 +390,6 @@ void __init pcibios_init (void) { - int i = 0; - struct pci_controller *controller; - #ifdef CONFIG_IA64_MCA ia64_mca_check_errors(); /* For post-failure MCA error logging */ #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/perfmon.c linux-2.4.23-pre8/arch/ia64/kernel/perfmon.c --- linux-2.4.22/arch/ia64/kernel/perfmon.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/perfmon.c 2003-10-22 22:49:39.000000000 +0000 @@ -447,7 +447,9 @@ * forward declarations */ static void pfm_reset_pmu(struct task_struct *); +#ifndef CONFIG_SMP static unsigned long pfm_lazy_save_regs (struct task_struct *ta); +#endif #if defined(CONFIG_ITANIUM) #include "perfmon_itanium.h" @@ -472,13 +474,13 @@ static inline void pfm_clear_psr_up(void) { - __asm__ __volatile__ ("rum psr.up;; srlz.i;;"::: "memory"); + __asm__ __volatile__ ("rsm psr.up;; srlz.i;;"::: "memory"); } static inline void pfm_set_psr_up(void) { - __asm__ __volatile__ ("sum psr.up;; srlz.i;;"::: "memory"); + __asm__ __volatile__ ("ssm psr.up;; srlz.i;;"::: "memory"); } static inline unsigned long diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/process.c linux-2.4.23-pre8/arch/ia64/kernel/process.c --- linux-2.4.22/arch/ia64/kernel/process.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/process.c 2003-10-22 22:48:54.000000000 +0000 @@ -1,7 +1,7 @@ /* * Architecture-specific setup. * - * Copyright (C) 1998-2002 Hewlett-Packard Co + * Copyright (C) 1998-2003 Hewlett-Packard Co * David Mosberger-Tang */ #define __KERNEL_SYSCALLS__ /* see */ @@ -33,15 +33,15 @@ #include #endif -#define print_symbol(fmt, addr) printk(fmt, ""); +#define print_symbol(fmt, addr) printk(fmt, "(no symbol)"); void ia64_do_show_stack (struct unw_frame_info *info, void *arg) { unsigned long ip, sp, bsp; - char buf[80]; /* don't make it so big that it overflows the stack! */ + char buf[128]; /* don't make it so big that it overflows the stack! */ - printk("\nCall Trace: "); + printk("\nCall Trace:\n"); do { unw_get_ip(info, &ip); if (ip == 0) @@ -49,19 +49,15 @@ unw_get_sp(info, &sp); unw_get_bsp(info, &bsp); - snprintf(buf, sizeof(buf), " [<%016lx>] %%s\n\t\t\t\tsp=%016lx bsp=%016lx\n", + snprintf(buf, sizeof(buf), + " [<%016lx>] %%s\n" + " sp=%016lx bsp=%016lx\n", ip, sp, bsp); print_symbol(buf, ip); } while (unw_unwind(info) >= 0); } void -show_trace_task (struct task_struct *task) -{ - show_stack(task); -} - -void show_stack (struct task_struct *task) { if (!task) @@ -75,19 +71,27 @@ } void +show_trace_task (struct task_struct *task) +{ + show_stack(task); +} + +void show_regs (struct pt_regs *regs) { unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri; - printk("\nPid: %d, comm: %20s\n", current->pid, current->comm); + printk("\nPid: %d, CPU %d, comm: %20s\n", current->pid, smp_processor_id(), current->comm); printk("psr : %016lx ifs : %016lx ip : [<%016lx>] %s\n", regs->cr_ipsr, regs->cr_ifs, ip, print_tainted()); + print_symbol("ip is at %s\n", ip); printk("unat: %016lx pfs : %016lx rsc : %016lx\n", regs->ar_unat, regs->ar_pfs, regs->ar_rsc); printk("rnat: %016lx bsps: %016lx pr : %016lx\n", regs->ar_rnat, regs->ar_bspstore, regs->pr); printk("ldrs: %016lx ccv : %016lx fpsr: %016lx\n", regs->loadrs, regs->ar_ccv, regs->ar_fpsr); + printk("csd : %016lx ssd : %016lx\n", regs->ar_csd, regs->ar_ssd); printk("b0 : %016lx b6 : %016lx b7 : %016lx\n", regs->b0, regs->b6, regs->b7); printk("f6 : %05lx%016lx f7 : %05lx%016lx\n", regs->f6.u.bits[1], regs->f6.u.bits[0], @@ -95,6 +99,9 @@ printk("f8 : %05lx%016lx f9 : %05lx%016lx\n", regs->f8.u.bits[1], regs->f8.u.bits[0], regs->f9.u.bits[1], regs->f9.u.bits[0]); + printk("f10 : %05lx%016lx f11 : %05lx%016lx\n", + regs->f10.u.bits[1], regs->f10.u.bits[0], + regs->f11.u.bits[1], regs->f11.u.bits[0]); printk("r1 : %016lx r2 : %016lx r3 : %016lx\n", regs->r1, regs->r2, regs->r3); printk("r8 : %016lx r9 : %016lx r10 : %016lx\n", regs->r8, regs->r9, regs->r10); @@ -124,16 +131,32 @@ show_stack(NULL); } +/* + * We use this if we don't have any better idle routine.. + */ +void +default_idle (void) +{ +#ifdef CONFIG_IA64_PAL_IDLE + if (!current->need_resched) + safe_halt(); +#endif +} + void __attribute__((noreturn)) cpu_idle (void *unused) { - /* endless idle loop with no priority at all */ init_idle(); current->nice = 20; current->counter = -100; + /* endless idle loop with no priority at all */ while (1) { + void (*idle)(void) = pm_idle; + if (!idle) + idle = default_idle; + #ifdef CONFIG_SMP if (!current->need_resched) min_xtp(); @@ -143,7 +166,7 @@ #ifdef CONFIG_IA64_SGI_SN snidle(); #endif - continue; + (*idle)(); } #ifdef CONFIG_IA64_SGI_SN @@ -155,8 +178,6 @@ #endif schedule(); check_pgt_cache(); - if (pm_idle) - (*pm_idle)(); } } @@ -426,6 +447,8 @@ dst[52] = pt->ar_pfs; /* UNW_AR_PFS is == to pt->cr_ifs for interrupt frames */ unw_get_ar(info, UNW_AR_LC, &dst[53]); unw_get_ar(info, UNW_AR_EC, &dst[54]); + unw_get_ar(info, UNW_AR_CSD, &dst[55]); + unw_get_ar(info, UNW_AR_SSD, &dst[56]); } void diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/ptrace.c linux-2.4.23-pre8/arch/ia64/kernel/ptrace.c --- linux-2.4.22/arch/ia64/kernel/ptrace.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/ptrace.c 2003-10-22 22:49:48.000000000 +0000 @@ -28,6 +28,8 @@ #include #endif +#define offsetof(type,field) ((unsigned long) &((type *) 0)->field) + /* * Bits in the PSR that we allow ptrace() to change: * be, up, ac, mfl, mfh (the user mask; five bits total) @@ -690,9 +692,12 @@ else ia64_flush_fph(child); ptr = (unsigned long *) ((unsigned long) &child->thread.fph + addr); - } else if (addr >= PT_F10 && addr < PT_F15 + 16) { + } else if ((addr >= PT_F10) && (addr < PT_F11 + 16)) { + /* scratch registers untouched by kernel (saved in pt_regs) */ + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, f10) + addr - PT_F10); + } else if (addr >= PT_F12 && addr < PT_F15 + 16) { /* scratch registers untouched by kernel (saved in switch_stack) */ - ptr = (unsigned long *) ((long) sw + addr - PT_NAT_BITS); + ptr = (unsigned long *) ((long) sw + (addr - PT_NAT_BITS - 32)); } else if (addr < PT_AR_LC + 8) { /* preserved state: */ unsigned long nat_bits, scratch_unat, dummy = 0; @@ -828,22 +833,69 @@ else return ia64_peek(child, sw, urbs_end, rnat_addr, data); - case PT_R1: case PT_R2: case PT_R3: + case PT_R1: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, r1)); + break; + + case PT_R2: case PT_R3: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, r2) + addr - PT_R2); + break; case PT_R8: case PT_R9: case PT_R10: case PT_R11: - case PT_R12: case PT_R13: case PT_R14: case PT_R15: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, r8)+ addr - PT_R8); + break; + case PT_R12: case PT_R13: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, r12)+ addr - PT_R12); + break; + case PT_R14: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, r14)); + break; + case PT_R15: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, r15)); + break; case PT_R16: case PT_R17: case PT_R18: case PT_R19: case PT_R20: case PT_R21: case PT_R22: case PT_R23: case PT_R24: case PT_R25: case PT_R26: case PT_R27: case PT_R28: case PT_R29: case PT_R30: case PT_R31: - case PT_B0: case PT_B6: case PT_B7: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, r16) + addr - PT_R16); + break; + case PT_B0: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, b0)); + break; + case PT_B6: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, b6)); + break; + case PT_B7: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, b7)); + break; case PT_F6: case PT_F6+8: case PT_F7: case PT_F7+8: case PT_F8: case PT_F8+8: case PT_F9: case PT_F9+8: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, f6) + addr - PT_F6); + break; case PT_AR_BSPSTORE: - case PT_AR_RSC: case PT_AR_UNAT: case PT_AR_PFS: - case PT_AR_CCV: case PT_AR_FPSR: case PT_CR_IIP: case PT_PR: - /* scratch register */ - ptr = (unsigned long *) ((long) pt + addr - PT_CR_IPSR); + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, ar_bspstore)); + break; + case PT_AR_RSC: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, ar_rsc)); + break; + case PT_AR_UNAT: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, ar_unat)); + break; + case PT_AR_PFS: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, ar_pfs)); break; + case PT_AR_CCV: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, ar_ccv)); + break; + case PT_AR_FPSR: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, ar_fpsr)); + break; + case PT_CR_IIP: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, cr_iip)); + break; + case PT_PR: + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, pr)); + break; + /* scratch register */ default: /* disallow accessing anything else... */ @@ -851,6 +903,8 @@ addr); return -1; } + } else if (addr <= PT_AR_SSD) { + ptr = (unsigned long *) ((long) pt + offsetof(struct pt_regs, ar_csd) + addr - PT_AR_CSD); } else { /* access debug registers */ @@ -957,7 +1011,8 @@ /* gr1-gr3 */ - retval |= __copy_to_user(&ppr->gr[1], &pt->r1, sizeof(long) * 3); + retval |= __copy_to_user(&ppr->gr[1], &pt->r1, sizeof(long)); + retval |= __copy_to_user(&ppr->gr[2], &pt->r2, sizeof(long) *2); /* gr4-gr7 */ @@ -971,7 +1026,9 @@ /* gr12-gr15 */ - retval |= __copy_to_user(&ppr->gr[12], &pt->r12, sizeof(long) * 4); + retval |= __copy_to_user(&ppr->gr[12], &pt->r12, sizeof(long) * 2); + retval |= __copy_to_user(&ppr->gr[14], &pt->r14, sizeof(long)); + retval |= __copy_to_user(&ppr->gr[15], &pt->r15, sizeof(long)); /* gr16-gr31 */ @@ -999,13 +1056,13 @@ retval |= access_fr(&info, i, 1, (unsigned long *) &ppr->fr[i] + 1, 0); } - /* fr6-fr9 */ + /* fr6-fr11 */ - retval |= __copy_to_user(&ppr->fr[6], &pt->f6, sizeof(struct ia64_fpreg) * 4); + retval |= __copy_to_user(&ppr->fr[6], &pt->f6, sizeof(struct ia64_fpreg) * 6); - /* fp scratch regs(10-15) */ + /* fp scratch regs(12-15) */ - retval |= __copy_to_user(&ppr->fr[10], &sw->f10, sizeof(struct ia64_fpreg) * 6); + retval |= __copy_to_user(&ppr->fr[12], &sw->f12, sizeof(struct ia64_fpreg) * 4); /* fr16-fr31 */ @@ -1082,7 +1139,8 @@ /* gr1-gr3 */ - retval |= __copy_from_user(&pt->r1, &ppr->gr[1], sizeof(long) * 3); + retval |= __copy_from_user(&pt->r1, &ppr->gr[1], sizeof(long)); + retval |= __copy_from_user(&pt->r2, &ppr->gr[2], sizeof(long) * 2); /* gr4-gr7 */ @@ -1100,7 +1158,9 @@ /* gr12-gr15 */ - retval |= __copy_from_user(&pt->r12, &ppr->gr[12], sizeof(long) * 4); + retval |= __copy_from_user(&pt->r12, &ppr->gr[12], sizeof(long) * 2); + retval |= __copy_from_user(&pt->r14, &ppr->gr[14], sizeof(long)); + retval |= __copy_from_user(&pt->r15, &ppr->gr[15], sizeof(long)); /* gr16-gr31 */ @@ -1128,13 +1188,13 @@ retval |= access_fr(&info, i, 1, (unsigned long *) &ppr->fr[i] + 1, 1); } - /* fr6-fr9 */ + /* fr6-fr11 */ - retval |= __copy_from_user(&pt->f6, &ppr->fr[6], sizeof(ppr->fr[6]) * 4); + retval |= __copy_from_user(&pt->f6, &ppr->fr[6], sizeof(ppr->fr[6]) * 6); - /* fp scratch regs(10-15) */ + /* fp scratch regs(12-15) */ - retval |= __copy_from_user(&sw->f10, &ppr->fr[10], sizeof(ppr->fr[10]) * 6); + retval |= __copy_from_user(&sw->f12, &ppr->fr[12], sizeof(ppr->fr[12]) * 4); /* fr16-fr31 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/salinfo.c linux-2.4.23-pre8/arch/ia64/kernel/salinfo.c --- linux-2.4.22/arch/ia64/kernel/salinfo.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/salinfo.c 2003-10-22 22:48:42.000000000 +0000 @@ -42,7 +42,7 @@ { "itc_drift", IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT, }, }; -#define NR_SALINFO_ENTRIES (sizeof(salinfo_entries)/sizeof(salinfo_entry_t)) +#define NR_SALINFO_ENTRIES ARRAY_SIZE(salinfo_entries) static char *salinfo_log_name[] = { "mca", @@ -98,9 +98,6 @@ static int salinfo_event_open(struct inode *inode, struct file *file) { - struct proc_dir_entry *entry = (struct proc_dir_entry *) inode->u.generic_ip; - struct salinfo_event *event = entry->data; - if (!suser()) return -EPERM; return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/setup.c linux-2.4.23-pre8/arch/ia64/kernel/setup.c --- linux-2.4.22/arch/ia64/kernel/setup.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/setup.c 2003-10-22 22:47:49.000000000 +0000 @@ -32,6 +32,10 @@ #include #include +#ifdef CONFIG_BLK_DEV_RAM +# include +#endif + #include #include #include @@ -39,6 +43,8 @@ #include #include #include +#include +#include #include #ifdef CONFIG_BLK_DEV_RAM @@ -55,7 +61,7 @@ extern char _end; #ifdef CONFIG_NUMA - struct cpuinfo_ia64 *boot_cpu_data; + struct cpuinfo_ia64 *_cpu_data[NR_CPUS]; #else struct cpuinfo_ia64 _cpu_data[NR_CPUS] __attribute__ ((section ("__special_page_section"))); #endif @@ -97,6 +103,7 @@ static struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1]; static int num_rsvd_regions; +#ifndef CONFIG_DISCONTIGMEM static unsigned long bootmap_start; /* physical address where the bootmem map is located */ static int @@ -109,18 +116,74 @@ *max_pfn = pfn; return 0; } +#endif /* !CONFIG_DISCONTIGMEM */ #define IGNORE_PFN0 1 /* XXX fix me: ignore pfn 0 until TLB miss handler is updated... */ +#ifdef CONFIG_DISCONTIGMEM /* - * Free available memory based on the primitive map created from - * the boot parameters. This routine does not assume the incoming - * segments are sorted. + * efi_memmap_walk() knows nothing about layout of memory across nodes. Find + * out to which node a block of memory belongs. Ignore memory that we cannot + * identify, and split blocks that run across multiple nodes. + * + * Take this opportunity to round the start address up and the end address + * down to page boundaries. */ +void +call_pernode_memory (unsigned long start, unsigned long end, void *arg) +{ + unsigned long rs, re; + void (*func)(unsigned long, unsigned long, int); + int i; + + start = PAGE_ALIGN(start); + end &= PAGE_MASK; + if (start >= end) + return; + + func = arg; + + if (!num_memblks) { + /* this machine doesn't have SRAT, */ + /* so call func with nid=0, bank=0 */ + if (start < end) + (*func)(start, end, 0); + return; + } + + for (i = 0; i < num_memblks; i++) { + rs = MAX(__pa(start), node_memblk[i].start_paddr); + re = MIN(__pa(end), node_memblk[i].start_paddr+node_memblk[i].size); + + if (rs < re) + (*func)((unsigned long)__va(rs), (unsigned long)__va(re), node_memblk[i].nid); + if ((unsigned long)__va(re) == end) + break; + } +} + +#else /* CONFIG_DISCONTIGMEM */ + static int free_available_memory (unsigned long start, unsigned long end, void *arg) { + free_bootmem(__pa(start), end - start); + return 0; +} +#endif /* CONFIG_DISCONTIGMEM */ + +/* + * Filter incoming memory segments based on the primitive map created from + * the boot parameters. Segments contained in the map are removed from the + * memory ranges. A caller-specified function is called with the memory + * ranges that remain after filtering. + * This routine does not assume the incoming segments are sorted. + */ +int +filter_rsvd_memory (unsigned long start, unsigned long end, void *arg) +{ unsigned long range_start, range_end, prev_start; + void (*func)(unsigned long, unsigned long, int); int i; #if IGNORE_PFN0 @@ -134,13 +197,18 @@ * lowest possible address(walker uses virtual) */ prev_start = PAGE_OFFSET; + func = arg; for (i = 0; i < num_rsvd_regions; ++i) { range_start = MAX(start, prev_start); range_end = MIN(end, rsvd_region[i].start); if (range_start < range_end) - free_bootmem(__pa(range_start), range_end - range_start); +#ifdef CONFIG_DISCONTIGMEM + call_pernode_memory(range_start, range_end, func); +#else + (*func)(range_start, range_end, 0); +#endif /* nothing more available in this segment */ if (range_end == end) return 0; @@ -152,6 +220,7 @@ } +#ifndef CONFIG_DISCONTIGMEM /* * Find a place to put the bootmap and return its starting address in bootmap_start. * This address must be page-aligned. @@ -190,6 +259,7 @@ } return 0; } +#endif /* CONFIG_DISCONTIGMEM */ static void sort_regions (struct rsvd_region *rsvd_region, int max) @@ -233,8 +303,8 @@ + strlen(__va(ia64_boot_param->command_line)) + 1); n++; - rsvd_region[n].start = KERNEL_START; - rsvd_region[n].end = KERNEL_END; + rsvd_region[n].start = ia64_imva(KERNEL_START); + rsvd_region[n].end = ia64_imva(KERNEL_END); n++; #ifdef CONFIG_BLK_DEV_INITRD @@ -254,6 +324,14 @@ sort_regions(rsvd_region, num_rsvd_regions); +#ifdef CONFIG_DISCONTIGMEM + { + extern void discontig_mem_init(void); + bootmap_size = max_pfn = 0; /* stop gcc warnings */ + discontig_mem_init(); + } +#else /* !CONFIG_DISCONTIGMEM */ + /* first find highest page frame number */ max_pfn = 0; efi_memmap_walk(find_max_pfn, &max_pfn); @@ -270,8 +348,9 @@ bootmap_size = init_bootmem(bootmap_start >> PAGE_SHIFT, max_pfn); /* Free all available memory, then mark bootmem-map as being in use. */ - efi_memmap_walk(free_available_memory, 0); + efi_memmap_walk(filter_rsvd_memory, free_available_memory); reserve_bootmem(bootmap_start, bootmap_size); +#endif /* !CONFIG_DISCONTIGMEM */ #ifdef CONFIG_BLK_DEV_INITRD if (ia64_boot_param->initrd_start) { @@ -297,9 +376,22 @@ saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; /* for safety */ efi_init(); + find_memory(); + +#ifdef CONFIG_ACPI_BOOT + /* Initialize the ACPI boot-time table parser */ + acpi_table_init(); + +# ifdef CONFIG_ACPI_NUMA + acpi_numa_init(); +# endif +#else +# ifdef CONFIG_SMP + smp_build_cpu_map(); /* happens, e.g., with the Ski simulator */ +# endif +#endif /* CONFIG_APCI_BOOT */ iomem_resource.end = ~0UL; /* FIXME probably belongs elsewhere */ - find_memory(); #if 0 /* XXX fix me */ @@ -353,7 +445,7 @@ cpu_init(); /* initialize the bootstrap CPU */ #ifdef CONFIG_ACPI_BOOT - acpi_boot_init(*cmdline_p); + acpi_boot_init(); #endif #ifdef CONFIG_SERIAL_HCDP if (efi.hcdp) { @@ -446,6 +538,8 @@ c->itc_freq / 1000000, c->itc_freq % 1000000, lpj*HZ/500000, (lpj*HZ/5000) % 100); return 0; +#undef lpj +#undef cpu } static void * @@ -546,7 +640,7 @@ unsigned int max_ctx; struct cpuinfo_ia64 *my_cpu_data; #ifdef CONFIG_NUMA - int cpu, order; + int cpu; /* * If NUMA is configured, the cpu_data array is not preallocated. The boot cpu @@ -555,28 +649,14 @@ * is required because some boot code references all cpu_data structures * before the cpus are actually started. */ - if (!boot_cpu_data) { - my_cpu_data = alloc_bootmem_pages_node(NODE_DATA(numa_node_id()), - sizeof(struct cpuinfo_ia64)); - boot_cpu_data = my_cpu_data; - my_cpu_data->cpu_data[0] = my_cpu_data; - for (cpu = 1; cpu < NR_CPUS; ++cpu) - my_cpu_data->cpu_data[cpu] - = alloc_bootmem_pages_node(NODE_DATA(numa_node_id()), - sizeof(struct cpuinfo_ia64)); - for (cpu = 1; cpu < NR_CPUS; ++cpu) - memcpy(my_cpu_data->cpu_data[cpu]->cpu_data, - my_cpu_data->cpu_data, sizeof(my_cpu_data->cpu_data)); - } else { - order = get_order(sizeof(struct cpuinfo_ia64)); - my_cpu_data = page_address(alloc_pages_node(numa_node_id(), GFP_KERNEL, order)); - memcpy(my_cpu_data, boot_cpu_data->cpu_data[smp_processor_id()], - sizeof(struct cpuinfo_ia64)); - __free_pages(virt_to_page(boot_cpu_data->cpu_data[smp_processor_id()]), - order); - for (cpu = 0; cpu < NR_CPUS; ++cpu) - boot_cpu_data->cpu_data[cpu]->cpu_data[smp_processor_id()] = my_cpu_data; - } + for (cpu=0; cpu < NR_CPUS; cpu++) + if (node_cpuid[cpu].phys_id == hard_smp_processor_id()) + break; + my_cpu_data = _cpu_data[cpu]; + my_cpu_data->node_data->active_cpu_count++; + + for (cpu=0; cpucpu_data[smp_processor_id()] = my_cpu_data; #else my_cpu_data = cpu_data(smp_processor_id()); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/signal.c linux-2.4.23-pre8/arch/ia64/kernel/signal.c --- linux-2.4.22/arch/ia64/kernel/signal.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/signal.c 2003-10-22 22:49:03.000000000 +0000 @@ -115,18 +115,28 @@ err |= __get_user(cfm, &sc->sc_cfm); err |= __get_user(um, &sc->sc_um); /* user mask */ err |= __get_user(scr->pt.ar_rsc, &sc->sc_ar_rsc); - err |= __get_user(scr->pt.ar_ccv, &sc->sc_ar_ccv); err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat); err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr); err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs); err |= __get_user(scr->pt.pr, &sc->sc_pr); /* predicates */ err |= __get_user(scr->pt.b0, &sc->sc_br[0]); /* b0 (rp) */ - err |= __get_user(scr->pt.b6, &sc->sc_br[6]); /* b6 */ - err |= __get_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */ - err |= __copy_from_user(&scr->pt.r1, &sc->sc_gr[1], 3*8); /* r1-r3 */ + err |= __copy_from_user(&scr->pt.r1, &sc->sc_gr[1], 8); /* r1 */ err |= __copy_from_user(&scr->pt.r8, &sc->sc_gr[8], 4*8); /* r8-r11 */ - err |= __copy_from_user(&scr->pt.r12, &sc->sc_gr[12], 4*8); /* r12-r15 */ - err |= __copy_from_user(&scr->pt.r16, &sc->sc_gr[16], 16*8); /* r16-r31 */ + err |= __copy_from_user(&scr->pt.r12, &sc->sc_gr[12], 2*8); /* r12-r13 */ + err |= __copy_from_user(&scr->pt.r15, &sc->sc_gr[15], 8); /* r15 */ + + if ((flags & IA64_SC_FLAG_IN_SYSCALL)==0) + { + // Only get user sig context when not in syscall. + err |= __get_user(scr->pt.ar_ccv, &sc->sc_ar_ccv); + err |= __get_user(scr->pt.ar_csd, &sc->sc_ar25); /* ar.csd */ + err |= __get_user(scr->pt.ar_ssd, &sc->sc_ar26); /* ar.ssd */ + err |= __get_user(scr->pt.b6, &sc->sc_br[6]); /* b6 */ + err |= __get_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */ + err |= __copy_from_user(&scr->pt.r2, &sc->sc_gr[2], 2*8); /* r2-r3 */ + err |= __copy_from_user(&scr->pt.r14, &sc->sc_gr[14], 8); /* r14 */ + err |= __copy_from_user(&scr->pt.r16, &sc->sc_gr[16], 16*8); /* r16-r31 */ + } scr->pt.cr_ifs = cfm | (1UL << 63); @@ -354,21 +364,42 @@ err |= __put_user(cfm, &sc->sc_cfm); err |= __put_user(scr->pt.cr_ipsr & IA64_PSR_UM, &sc->sc_um); err |= __put_user(scr->pt.ar_rsc, &sc->sc_ar_rsc); - err |= __put_user(scr->pt.ar_ccv, &sc->sc_ar_ccv); err |= __put_user(scr->pt.ar_unat, &sc->sc_ar_unat); /* ar.unat */ err |= __put_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr); /* ar.fpsr */ err |= __put_user(scr->pt.ar_pfs, &sc->sc_ar_pfs); err |= __put_user(scr->pt.pr, &sc->sc_pr); /* predicates */ err |= __put_user(scr->pt.b0, &sc->sc_br[0]); /* b0 (rp) */ - err |= __put_user(scr->pt.b6, &sc->sc_br[6]); /* b6 */ - err |= __put_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */ - - err |= __copy_to_user(&sc->sc_gr[1], &scr->pt.r1, 3*8); /* r1-r3 */ + err |= __copy_to_user(&sc->sc_gr[1], &scr->pt.r1, 8); /* r1 */ err |= __copy_to_user(&sc->sc_gr[8], &scr->pt.r8, 4*8); /* r8-r11 */ - err |= __copy_to_user(&sc->sc_gr[12], &scr->pt.r12, 4*8); /* r12-r15 */ - err |= __copy_to_user(&sc->sc_gr[16], &scr->pt.r16, 16*8); /* r16-r31 */ - + err |= __copy_to_user(&sc->sc_gr[12], &scr->pt.r12, 2*8); /* r12-r13 */ + err |= __copy_to_user(&sc->sc_gr[15], &scr->pt.r15, 8); /* r15 */ err |= __put_user(scr->pt.cr_iip + ia64_psr(&scr->pt)->ri, &sc->sc_ip); + + if (flags & IA64_SC_FLAG_IN_SYSCALL) + { + // Clear scratch registers in sig context for asynchronized signal. + err |= __clear_user(&sc->sc_ar_ccv, 8); + err |= __clear_user(&sc->sc_ar25,8); /* ar.csd */ + err |= __clear_user(&sc->sc_ar26,8); /* ar.ssd */ + err |= __clear_user(&sc->sc_br[6],8); /* b6 */ + err |= __clear_user(&sc->sc_br[7],8); /* b7 */ + + err |= __clear_user(&sc->sc_gr[2], 2*8); /* r2-r3 */ + err |= __clear_user(&sc->sc_gr[14],8); /* r14 */ + err |= __clear_user(&sc->sc_gr[16],16*8); /* r16-r31 */ + } else + { + // Copy scratch registers in sig context from pt_regs for synchronized signal. + err |= __put_user(scr->pt.ar_ccv, &sc->sc_ar_ccv); + err |= __put_user(scr->pt.ar_csd, &sc->sc_ar25); /* ar.csd */ + err |= __put_user(scr->pt.ar_ssd, &sc->sc_ar26); /* ar.ssd */ + err |= __put_user(scr->pt.b6, &sc->sc_br[6]); /* b6 */ + err |= __put_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */ + + err |= __copy_to_user(&sc->sc_gr[2], &scr->pt.r2, 2*8); /* r2-r3 */ + err |= __copy_to_user(&sc->sc_gr[14], &scr->pt.r14, 8); /* r14 */ + err |= __copy_to_user(&sc->sc_gr[16], &scr->pt.r16, 16*8); /* r16-r31 */ + } return err; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/smpboot.c linux-2.4.23-pre8/arch/ia64/kernel/smpboot.c --- linux-2.4.22/arch/ia64/kernel/smpboot.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/smpboot.c 2003-10-22 22:48:13.000000000 +0000 @@ -320,6 +320,7 @@ { int cpuid, phys_id; extern void ia64_init_itm(void); + extern void ia64_cpu_local_tick(void); #ifdef CONFIG_PERFMON extern void pfm_init_percpu(void); @@ -576,7 +577,7 @@ /* Tell SAL where to drop the AP's. */ ap_startup = (struct fptr *) start_ap; sal_ret = ia64_sal_set_vectors(SAL_VECTOR_OS_BOOT_RENDEZ, - __pa(ap_startup->fp), __pa(ap_startup->gp), 0, 0, 0, 0); + ia64_tpa(ap_startup->fp), ia64_tpa(ap_startup->gp), 0, 0, 0, 0); if (sal_ret < 0) { printk(KERN_ERR "SMP: Can't set SAL AP Boot Rendezvous: %s\n Forcing UP mode\n", ia64_sal_strerror(sal_ret)); @@ -584,3 +585,27 @@ smp_num_cpus = 1; } } + +/* + * Initialize the logical CPU number to SAPICID mapping + */ +void __init +smp_build_cpu_map (void) +{ + int sapicid, cpu, i; + int boot_cpu_id = hard_smp_processor_id(); + + for (cpu = 0; cpu < NR_CPUS; cpu++) + ia64_cpu_to_sapicid[cpu] = -1; + + ia64_cpu_to_sapicid[0] = boot_cpu_id; + + for (cpu = 1, i = 0; i < smp_boot_data.cpu_count; i++) { + sapicid = smp_boot_data.cpu_phys_id[i]; + if (sapicid == boot_cpu_id) + continue; + ia64_cpu_to_sapicid[cpu] = sapicid; + cpu++; + } +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/traps.c linux-2.4.23-pre8/arch/ia64/kernel/traps.c --- linux-2.4.22/arch/ia64/kernel/traps.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/traps.c 2003-10-22 22:49:45.000000000 +0000 @@ -273,7 +273,6 @@ fp_emulate (int fp_fault, void *bundle, long *ipsr, long *fpsr, long *isr, long *pr, long *ifs, struct pt_regs *regs) { - struct ia64_fpreg f6_11[6]; fp_state_t fp_state; fpswa_ret_t ret; @@ -288,11 +287,8 @@ * pointer to point to these registers. */ fp_state.bitmask_low64 = 0xfc0; /* bit6..bit11 */ - f6_11[0] = regs->f6; f6_11[1] = regs->f7; - f6_11[2] = regs->f8; f6_11[3] = regs->f9; - __asm__ ("stf.spill %0=f10%P0" : "=m"(f6_11[4])); - __asm__ ("stf.spill %0=f11%P0" : "=m"(f6_11[5])); - fp_state.fp_state_low_volatile = (fp_state_low_volatile_t *) f6_11; + + fp_state.fp_state_low_volatile = (fp_state_low_volatile_t *) ®s->f6; /* * unsigned long (*EFI_FPSWA) ( * unsigned long trap_type, @@ -308,10 +304,7 @@ (unsigned long *) ipsr, (unsigned long *) fpsr, (unsigned long *) isr, (unsigned long *) pr, (unsigned long *) ifs, &fp_state); - regs->f6 = f6_11[0]; regs->f7 = f6_11[1]; - regs->f8 = f6_11[2]; regs->f9 = f6_11[3]; - __asm__ ("ldf.fill f10=%0%P0" :: "m"(f6_11[4])); - __asm__ ("ldf.fill f11=%0%P0" :: "m"(f6_11[5])); + return ret.status; } @@ -335,8 +328,9 @@ if (jiffies - last_time > 5*HZ) fpu_swa_count = 0; - if ((++fpu_swa_count < 5) && !(current->thread.flags & IA64_THREAD_FPEMU_NOPRINT)) { + if ((fpu_swa_count < 4) && !(current->thread.flags & IA64_THREAD_FPEMU_NOPRINT)) { last_time = jiffies; + ++fpu_swa_count; printk(KERN_WARNING "%s(%d): floating-point assist fault at ip %016lx, isr %016lx\n", current->comm, current->pid, regs->cr_iip + ia64_psr(regs)->ri, isr); } @@ -361,6 +355,10 @@ siginfo.si_addr = (void *) (regs->cr_iip + ia64_psr(regs)->ri); if (isr & 0x11) { siginfo.si_code = FPE_FLTINV; + } else if (isr & 0x22) { + /* denormal operand gets the same si_code as underflow + * see arch/i386/kernel/traps.c:math_error() */ + siginfo.si_code = FPE_FLTUND; } else if (isr & 0x44) { siginfo.si_code = FPE_FLTDIV; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/unaligned.c linux-2.4.23-pre8/arch/ia64/kernel/unaligned.c --- linux-2.4.22/arch/ia64/kernel/unaligned.c 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/unaligned.c 2003-10-22 22:49:35.000000000 +0000 @@ -217,8 +217,9 @@ RSW(f2), RSW(f3), RSW(f4), RSW(f5), RPT(f6), RPT(f7), RPT(f8), RPT(f9), + RPT(f10), RPT(f11), - RSW(f10), RSW(f11), RSW(f12), RSW(f13), RSW(f14), + RSW(f12), RSW(f13), RSW(f14), RSW(f15), RSW(f16), RSW(f17), RSW(f18), RSW(f19), RSW(f20), RSW(f21), RSW(f22), RSW(f23), RSW(f24), RSW(f25), RSW(f26), RSW(f27), RSW(f28), RSW(f29), diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/kernel/unwind.c linux-2.4.23-pre8/arch/ia64/kernel/unwind.c --- linux-2.4.22/arch/ia64/kernel/unwind.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/kernel/unwind.c 2003-10-22 22:48:57.000000000 +0000 @@ -1,4 +1,7 @@ /* + * Copyright (C) 2003 Fenghua Yu + * - Change pt_regs_off() to make it less dependant on pt_regs structure. + * * Copyright (C) 1999-2003 Hewlett-Packard Co * David Mosberger-Tang */ @@ -209,7 +212,11 @@ #endif }; - +#define OFF_CASE(reg, reg_num) \ + case reg: \ + off=struct_offset(struct pt_regs, reg_num); \ + break; + /* Unwind accessors. */ /* @@ -220,16 +227,40 @@ { unsigned long off =0; - if (reg >= 1 && reg <= 3) - off = struct_offset(struct pt_regs, r1) + 8*(reg - 1); - else if (reg <= 11) - off = struct_offset(struct pt_regs, r8) + 8*(reg - 8); - else if (reg <= 15) - off = struct_offset(struct pt_regs, r12) + 8*(reg - 12); - else if (reg <= 31) - off = struct_offset(struct pt_regs, r16) + 8*(reg - 16); - else - UNW_DPRINT(0, "unwind.%s: bad scratch reg r%lu\n", __FUNCTION__, reg); + switch (reg) + { + OFF_CASE(1,r1) + OFF_CASE(2,r2) + OFF_CASE(3,r3) + OFF_CASE(8,r8) + OFF_CASE(9,r9) + OFF_CASE(10,r10) + OFF_CASE(11,r11) + OFF_CASE(12,r12) + OFF_CASE(13,r13) + OFF_CASE(14,r14) + OFF_CASE(15,r15) + OFF_CASE(16,r16) + OFF_CASE(17,r17) + OFF_CASE(18,r18) + OFF_CASE(19,r19) + OFF_CASE(20,r20) + OFF_CASE(21,r21) + OFF_CASE(22,r22) + OFF_CASE(23,r23) + OFF_CASE(24,r24) + OFF_CASE(25,r25) + OFF_CASE(26,r26) + OFF_CASE(27,r27) + OFF_CASE(28,r28) + OFF_CASE(29,r29) + OFF_CASE(30,r30) + OFF_CASE(31,r31) + default: + UNW_DPRINT(0, "unwind.%s: bad scratch reg r%lu\n", __FUNCTION__, reg); + break; + } + return off; } @@ -416,12 +447,12 @@ if (!addr) addr = &info->sw->f2 + (regnum - 2); } else if (regnum <= 15) { - if (regnum <= 9) { + if (regnum <= 11) { pt = get_scratch_regs(info); addr = &pt->f6 + (regnum - 6); } else - addr = &info->sw->f10 + (regnum - 10); + addr = &info->sw->f12 + (regnum - 12); } else if (regnum <= 31) { addr = info->fr_loc[regnum - 16]; if (!addr) @@ -512,6 +543,16 @@ addr = &pt->ar_ccv; break; + case UNW_AR_CSD: + pt = get_scratch_regs(info); + addr = &pt->ar_csd; + break; + + case UNW_AR_SSD: + pt = get_scratch_regs(info); + addr = &pt->ar_ssd; + break; + default: UNW_DPRINT(0, "unwind.%s: trying to access non-existent ar%u\n", __FUNCTION__, regnum); @@ -685,7 +726,7 @@ * First, resolve implicit register save locations (see Section "11.4.2.3 Rules * for Using Unwind Descriptors", rule 3): */ - for (i = 0; i < (int) sizeof(unw.save_order)/sizeof(unw.save_order[0]); ++i) { + for (i = 0; i < (int) ARRAY_SIZE(unw.save_order); ++i) { reg = sr->curr.reg + unw.save_order[i]; if (reg->where == UNW_WHERE_GR_SAVE) { reg->where = UNW_WHERE_GR; @@ -701,7 +742,7 @@ */ if (sr->imask) { unsigned char kind, mask = 0, *cp = sr->imask; - unsigned long t; + int t; static const unsigned char limit[3] = { UNW_REG_F31, UNW_REG_R7, UNW_REG_B5 }; @@ -1379,7 +1420,7 @@ val = unw.preg_index[UNW_REG_F16 + (rval - 16)]; else { opc = UNW_INSN_MOVE_SCRATCH; - if (rval <= 9) + if (rval <= 11) val = struct_offset(struct pt_regs, f6) + 16*(rval - 6); else UNW_DPRINT(0, "unwind.%s: kernel may not touch f%lu\n", @@ -1731,8 +1772,7 @@ lazy_init: off = unw.sw_off[val]; s[val] = (unsigned long) state->sw + off; - if (off >= struct_offset(struct switch_stack, r4) - && off <= struct_offset(struct switch_stack, r7)) + if (off >= struct_offset(struct switch_stack, r4) && off <= struct_offset(struct switch_stack, r7)) /* * We're initializing a general register: init NaT info, too. Note that * the offset is a multiple of 8 which gives us the 3 bits needed for @@ -1934,7 +1974,7 @@ " pr 0x%lx\n" " sw 0x%lx\n" " sp 0x%lx\n", - __FUNCTION__, (unsigned long) task, rbslimit, rbstop, stktop, stklimit, + __FUNCTION__, (unsigned long) t, rbslimit, rbstop, stktop, stklimit, info->pr, (unsigned long) info->sw, info->sp); STAT(unw.stat.api.init_time += ia64_get_itc() - start; local_irq_restore(flags)); } @@ -1955,7 +1995,7 @@ " bsp 0x%lx\n" " sof 0x%lx\n" " ip 0x%lx\n", - info->bsp, sof, info->ip); + __FUNCTION__, info->bsp, sof, info->ip); find_save_locs(info); } @@ -1973,7 +2013,7 @@ " bsp 0x%lx\n" " sol 0x%lx\n" " ip 0x%lx\n", - info->bsp, sol, info->ip); + __FUNCTION__, info->bsp, sol, info->ip); find_save_locs(info); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/lib/idiv64.S linux-2.4.23-pre8/arch/ia64/lib/idiv64.S --- linux-2.4.22/arch/ia64/lib/idiv64.S 2001-11-09 22:26:17.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/lib/idiv64.S 2003-10-22 22:47:39.000000000 +0000 @@ -37,57 +37,44 @@ #define NAME PASTE(PASTE(__,SGN),PASTE(OP,di3)) GLOBAL_ENTRY(NAME) - .prologue .regstk 2,0,0,0 // Transfer inputs to FP registers. setf.sig f8 = in0 setf.sig f9 = in1 ;; - .fframe 16 - .save.f 0x20 - stf.spill [sp] = f17,-16 - // Convert the inputs to FP, to avoid FP software-assist faults. INT_TO_FP(f8, f8) - ;; - - .save.f 0x10 - stf.spill [sp] = f16 - .body INT_TO_FP(f9, f9) ;; - frcpa.s1 f17, p6 = f8, f9 // y0 = frcpa(b) + frcpa.s1 f11, p6 = f8, f9 // y0 = frcpa(b) ;; -(p6) fmpy.s1 f7 = f8, f17 // q0 = a*y0 -(p6) fnma.s1 f6 = f9, f17, f1 // e0 = -b*y0 + 1 +(p6) fmpy.s1 f7 = f8, f11 // q0 = a*y0 +(p6) fnma.s1 f6 = f9, f11, f1 // e0 = -b*y0 + 1 ;; -(p6) fma.s1 f16 = f7, f6, f7 // q1 = q0*e0 + q0 +(p6) fma.s1 f10 = f7, f6, f7 // q1 = q0*e0 + q0 (p6) fmpy.s1 f7 = f6, f6 // e1 = e0*e0 ;; #ifdef MODULO sub in1 = r0, in1 // in1 = -b #endif -(p6) fma.s1 f16 = f16, f7, f16 // q2 = q1*e1 + q1 -(p6) fma.s1 f6 = f17, f6, f17 // y1 = y0*e0 + y0 +(p6) fma.s1 f10 = f10, f7, f10 // q2 = q1*e1 + q1 +(p6) fma.s1 f6 = f11, f6, f11 // y1 = y0*e0 + y0 ;; (p6) fma.s1 f6 = f6, f7, f6 // y2 = y1*e1 + y1 -(p6) fnma.s1 f7 = f9, f16, f8 // r = -b*q2 + a +(p6) fnma.s1 f7 = f9, f10, f8 // r = -b*q2 + a ;; #ifdef MODULO setf.sig f8 = in0 // f8 = a setf.sig f9 = in1 // f9 = -b #endif -(p6) fma.s1 f17 = f7, f6, f16 // q3 = r*y2 + q2 +(p6) fma.s1 f11 = f7, f6, f10 // q3 = r*y2 + q2 ;; - .restore sp - ldf.fill f16 = [sp], 16 - FP_TO_INT(f17, f17) // q = trunc(q3) + FP_TO_INT(f11, f11) // q = trunc(q3) ;; #ifdef MODULO - xma.l f17 = f17, f9, f8 // r = q*(-b) + a + xma.l f11 = f11, f9, f8 // r = q*(-b) + a ;; #endif - getf.sig r8 = f17 // transfer result to result register - ldf.fill f17 = [sp] + getf.sig r8 = f11 // transfer result to result register br.ret.sptk.many rp END(NAME) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/mm/Makefile linux-2.4.23-pre8/arch/ia64/mm/Makefile --- linux-2.4.22/arch/ia64/mm/Makefile 2003-06-13 14:51:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/mm/Makefile 2003-10-22 22:48:22.000000000 +0000 @@ -12,5 +12,7 @@ export-objs := init.o obj-y := init.o fault.o tlb.o extable.o +obj-$(CONFIG_NUMA) += numa.o +obj-$(CONFIG_DISCONTIGMEM) += discontig.o include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/mm/discontig.c linux-2.4.23-pre8/arch/ia64/mm/discontig.c --- linux-2.4.22/arch/ia64/mm/discontig.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/mm/discontig.c 2003-10-22 22:49:55.000000000 +0000 @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2000, 2003 Silicon Graphics, Inc. All rights reserved. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Tony Luck + * Copyright (c) 2002 NEC Corp. + * Copyright (c) 2002 Kimio Suganuma + */ + +/* + * Platform initialization for Discontig Memory + */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* + * Round an address upward to the next multiple of GRANULE size. + */ +#define GRANULEROUNDDOWN(n) ((n) & ~(IA64_GRANULE_SIZE-1)) +#define GRANULEROUNDUP(n) (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1)) + +/* + * Used to locate BOOT_DATA prior to initializing the node data area. + */ +#define BOOT_NODE_DATA(node) pg_data_ptr[node] + +/* + * To prevent cache aliasing effects, align per-node structures so that they + * start at addresses that are strided by node number. + */ +#define NODEDATA_ALIGN(addr, node) ((((addr) + 1024*1024-1) & ~(1024*1024-1)) + (node)*PAGE_SIZE) + + +static struct ia64_node_data *boot_node_data[NR_NODES] __initdata; +static pg_data_t *pg_data_ptr[NR_NODES] __initdata; +static bootmem_data_t bdata[NR_NODES] __initdata; +static unsigned long boot_pernode[NR_NODES] __initdata; +static unsigned long boot_pernodesize[NR_NODES] __initdata; + +extern int filter_rsvd_memory (unsigned long start, unsigned long end, void *arg); +extern struct cpuinfo_ia64 *_cpu_data[NR_CPUS]; + + + +/* + * We allocate one of the bootmem_data_t structs for each piece of memory + * that we wish to treat as a contiguous block. Each such block must start + * on a GRANULE boundary. Multiple banks per node is not supported. + * (Note: on SN2, all memory on a node is trated as a single bank. + * Holes within the bank are supported. This works because memory + * from different banks is not interleaved. The bootmap bitmap + * for the node is somewhat large but not too large). + */ +static int __init +build_maps(unsigned long start, unsigned long end, int node) +{ + bootmem_data_t *bdp; + unsigned long cstart, epfn; + + bdp = &bdata[node]; + epfn = GRANULEROUNDUP(__pa(end)) >> PAGE_SHIFT; + cstart = GRANULEROUNDDOWN(__pa(start)); + + if (!bdp->node_low_pfn) { + bdp->node_boot_start = cstart; + bdp->node_low_pfn = epfn; + } else { + bdp->node_boot_start = min(cstart, bdp->node_boot_start); + bdp->node_low_pfn = max(epfn, bdp->node_low_pfn); + } + + min_low_pfn = min(min_low_pfn, bdp->node_boot_start>>PAGE_SHIFT); + max_low_pfn = max(max_low_pfn, bdp->node_low_pfn); + + return 0; +} + + +/* + * Count the number of cpus on the node + */ +static __inline__ int +count_cpus(int node) +{ + int cpu, n=0; + + for (cpu=0; cpu < NR_CPUS; cpu++) + if (node == node_cpuid[cpu].nid) + n++; + return n; +} + + +/* + * Find space on each node for the bootmem map & other per-node data structures. + * + * Called by efi_memmap_walk to find boot memory on each node. Note that + * only blocks that are free are passed to this routine (currently filtered by + * free_available_memory). + */ +static int __init +find_pernode_space(unsigned long start, unsigned long end, int node) +{ + unsigned long mapsize, pages, epfn, map=0, cpu, cpus; + unsigned long pernodesize=0, pernode; + unsigned long cpu_data, mmu_gathers; + unsigned long pstart, length; + bootmem_data_t *bdp; + + pstart = __pa(start); + length = end - start; + epfn = (pstart + length) >> PAGE_SHIFT; + bdp = &bdata[node]; + + if (pstart < bdp->node_boot_start || epfn > bdp->node_low_pfn) + return 0; + + if (!boot_pernode[node]) { + cpus = count_cpus(node); + pernodesize += PAGE_ALIGN(sizeof(struct cpuinfo_ia64)) * cpus; + pernodesize += L1_CACHE_ALIGN(sizeof(mmu_gather_t)) * cpus; + pernodesize += L1_CACHE_ALIGN(sizeof(pg_data_t)); + pernodesize += L1_CACHE_ALIGN(sizeof(struct ia64_node_data)); + pernodesize = PAGE_ALIGN(pernodesize); + pernode = NODEDATA_ALIGN(pstart, node); + + if (pstart + length > (pernode + pernodesize)) { + boot_pernode[node] = pernode; + boot_pernodesize[node] = pernodesize; + memset(__va(pernode), 0, pernodesize); + + cpu_data = pernode; + pernode += PAGE_ALIGN(sizeof(struct cpuinfo_ia64)) * cpus; + + mmu_gathers = pernode; + pernode += L1_CACHE_ALIGN(sizeof(mmu_gather_t)) * cpus; + + pg_data_ptr[node] = __va(pernode); + pernode += L1_CACHE_ALIGN(sizeof(pg_data_t)); + + boot_node_data[node] = __va(pernode); + pernode += L1_CACHE_ALIGN(sizeof(struct ia64_node_data)); + + pg_data_ptr[node]->bdata = &bdata[node]; + pernode += L1_CACHE_ALIGN(sizeof(pg_data_t)); + + for (cpu=0; cpu < NR_CPUS; cpu++) { + if (node == node_cpuid[cpu].nid) { + _cpu_data[cpu] = __va(cpu_data); + _cpu_data[cpu]->node_data = boot_node_data[node]; + _cpu_data[cpu]->nodeid = node; + _cpu_data[cpu]->mmu_gathers = __va(mmu_gathers); + cpu_data += PAGE_ALIGN(sizeof(struct cpuinfo_ia64)); + mmu_gathers += L1_CACHE_ALIGN(sizeof(mmu_gather_t)); + } + } + + } + } + + pernode = boot_pernode[node]; + pernodesize = boot_pernodesize[node]; + if (pernode && !bdp->node_bootmem_map) { + pages = bdp->node_low_pfn - (bdp->node_boot_start>>PAGE_SHIFT); + mapsize = bootmem_bootmap_pages(pages) << PAGE_SHIFT; + + if (pernode - pstart > mapsize) + map = pstart; + else if (pstart + length - pernode - pernodesize > mapsize) + map = pernode + pernodesize; + + if (map) { + init_bootmem_node( + BOOT_NODE_DATA(node), + map>>PAGE_SHIFT, + bdp->node_boot_start>>PAGE_SHIFT, + bdp->node_low_pfn); + } + + } + + return 0; +} + + +/* + * Free available memory to the bootmem allocator. + * + * Note that only blocks that are free are passed to this routine (currently + * filtered by free_available_memory). + * + */ +static int __init +discontig_free_bootmem_node(unsigned long start, unsigned long end, int node) +{ + free_bootmem_node(BOOT_NODE_DATA(node), __pa(start), end - start); + + return 0; +} + + +/* + * Reserve the space used by the bootmem maps. + */ +static void __init +discontig_reserve_bootmem(void) +{ + int node; + unsigned long base, size, pages; + bootmem_data_t *bdp; + + for (node = 0; node < numnodes; node++) { + bdp = BOOT_NODE_DATA(node)->bdata; + + pages = bdp->node_low_pfn - (bdp->node_boot_start>>PAGE_SHIFT); + size = bootmem_bootmap_pages(pages) << PAGE_SHIFT; + base = __pa(bdp->node_bootmem_map); + reserve_bootmem_node(BOOT_NODE_DATA(node), base, size); + + size = boot_pernodesize[node]; + base = __pa(boot_pernode[node]); + reserve_bootmem_node(BOOT_NODE_DATA(node), base, size); + } +} + +/* + * Initialize per-node data + * + * Finish setting up the node data for this node, then copy it to the other nodes. + * + */ +static void __init +initialize_pernode_data(void) +{ + int cpu, node; + + memcpy(boot_node_data[0]->pg_data_ptrs, pg_data_ptr, sizeof(pg_data_ptr)); + memcpy(boot_node_data[0]->node_data_ptrs, boot_node_data, sizeof(boot_node_data)); + + for (node=1; node < numnodes; node++) { + memcpy(boot_node_data[node], boot_node_data[0], sizeof(struct ia64_node_data)); + boot_node_data[node]->node = node; + } + + for (cpu=0; cpu < NR_CPUS; cpu++) { + node = node_cpuid[cpu].nid; + _cpu_data[cpu]->node_data = boot_node_data[node]; + _cpu_data[cpu]->nodeid = node; + } +} + + +/* + * Called early in boot to setup the boot memory allocator, and to + * allocate the node-local pg_data & node-directory data structures.. + */ +void __init +discontig_mem_init(void) +{ + if (numnodes == 0) { + printk("node info missing!\n"); + numnodes = 1; + } + + min_low_pfn = -1; + max_low_pfn = 0; + + efi_memmap_walk(filter_rsvd_memory, build_maps); + efi_memmap_walk(filter_rsvd_memory, find_pernode_space); + efi_memmap_walk(filter_rsvd_memory, discontig_free_bootmem_node); + + discontig_reserve_bootmem(); + initialize_pernode_data(); +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/mm/init.c linux-2.4.23-pre8/arch/ia64/mm/init.c --- linux-2.4.22/arch/ia64/mm/init.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/mm/init.c 2003-10-22 22:48:39.000000000 +0000 @@ -16,12 +16,14 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -34,11 +36,14 @@ extern char _stext, _etext, _edata, __init_begin, __init_end; extern void ia64_tlb_init (void); +extern int filter_rsvd_memory (unsigned long, unsigned long, void *); +/* Note - may be changed by platform_setup */ unsigned long MAX_DMA_ADDRESS = PAGE_OFFSET + 0x100000000UL; #define LARGE_GAP 0x40000000 /* Use virtual mem map if a hole is > than this */ -static unsigned long totalram_pages; +static unsigned long totalram_pages, reserved_pages; +struct page *zero_page_memmap_ptr; /* map entry for zero page */ unsigned long vmalloc_end = VMALLOC_END_INIT; @@ -63,6 +68,16 @@ return freed; } +inline void +ia64_set_rbs_bot (void) +{ + unsigned long stack_size = current->rlim[RLIMIT_STACK].rlim_max & -16; + + if (stack_size > MAX_USER_STACK_SIZE) + stack_size = MAX_USER_STACK_SIZE; + current->thread.rbs_bot = STACK_TOP - stack_size; +} + /* * This performs some platform-dependent address space initialization. * On IA-64, we want to setup the VM area for the register backing @@ -74,6 +89,8 @@ { struct vm_area_struct *vma; + ia64_set_rbs_bot(); + /* * If we're out of memory and kmem_cache_alloc() returns NULL, we simply ignore * the problem. When the process attempts to write to the register backing store @@ -82,7 +99,7 @@ vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL); if (vma) { vma->vm_mm = current->mm; - vma->vm_start = IA64_RBS_BOT; + vma->vm_start = current->thread.rbs_bot & PAGE_MASK; vma->vm_end = vma->vm_start + PAGE_SIZE; vma->vm_page_prot = PAGE_COPY; vma->vm_flags = VM_READ|VM_WRITE|VM_MAYREAD|VM_MAYWRITE|VM_GROWSUP; @@ -110,10 +127,11 @@ void free_initmem (void) { - unsigned long addr; + unsigned long addr, eaddr; - addr = (unsigned long) &__init_begin; - for (; addr < (unsigned long) &__init_end; addr += PAGE_SIZE) { + addr = (unsigned long) ia64_imva(&__init_begin); + eaddr = (unsigned long) ia64_imva(&__init_end); + for (; addr < eaddr; addr += PAGE_SIZE) { clear_bit(PG_reserved, &virt_to_page((void *)addr)->flags); set_page_count(virt_to_page((void *)addr), 1); free_page(addr); @@ -189,58 +207,39 @@ void show_mem(void) { - int i, total = 0, reserved = 0; - int shared = 0, cached = 0; + int i, reserved; + int shared, cached; + pg_data_t *pgdat; + char *tchar = (numnodes > 1) ? "\t" : ""; printk("Mem-info:\n"); show_free_areas(); -#ifdef CONFIG_DISCONTIGMEM - { - pg_data_t *pgdat = pgdat_list; - - printk("Free swap: %6dkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); - do { - printk("Node ID: %d\n", pgdat->node_id); - for(i = 0; i < pgdat->node_size; i++) { - if (PageReserved(pgdat->node_mem_map+i)) - reserved++; - else if (PageSwapCache(pgdat->node_mem_map+i)) - cached++; - else if (page_count(pgdat->node_mem_map + i)) - shared += page_count(pgdat->node_mem_map + i) - 1; - } - printk("\t%d pages of RAM\n", pgdat->node_size); - printk("\t%d reserved pages\n", reserved); - printk("\t%d pages shared\n", shared); - printk("\t%d pages swap cached\n", cached); - pgdat = pgdat->node_next; - } while (pgdat); - printk("Total of %ld pages in page table cache\n", pgtable_cache_size); - show_buffers(); - printk("%d free buffer pages\n", nr_free_buffer_pages()); - } -#else /* !CONFIG_DISCONTIGMEM */ printk("Free swap: %6dkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); - i = max_mapnr; - while (i-- > 0) { - if (!VALID_PAGE(mem_map + i)) - continue; - total++; - if (PageReserved(mem_map+i)) - reserved++; - else if (PageSwapCache(mem_map+i)) - cached++; - else if (page_count(mem_map + i)) - shared += page_count(mem_map + i) - 1; + for_each_pgdat(pgdat) { + reserved=0; + cached=0; + shared=0; + if (numnodes > 1) + printk("Node ID: %d\n", pgdat->node_id); + for(i = 0; i < pgdat->node_size; i++) { + if (!VALID_PAGE(pgdat->node_mem_map+i)) + continue; + if (PageReserved(pgdat->node_mem_map+i)) + reserved++; + else if (PageSwapCache(pgdat->node_mem_map+i)) + cached++; + else if (page_count(pgdat->node_mem_map + i)) + shared += page_count(pgdat->node_mem_map + i) - 1; + } + printk("%s%ld pages of RAM\n", tchar, pgdat->node_size); + printk("%s%d reserved pages\n", tchar, reserved); + printk("%s%d pages shared\n", tchar, shared); + printk("%s%d pages swap cached\n", tchar, cached); } - printk("%d pages of RAM\n", total); - printk("%d reserved pages\n", reserved); - printk("%d pages shared\n", shared); - printk("%d pages swap cached\n", cached); - printk("%ld pages in page table cache\n", pgtable_cache_size); + printk("Total of %ld pages in page table cache\n", pgtable_cache_size); show_buffers(); -#endif /* !CONFIG_DISCONTIGMEM */ + printk("%d free buffer pages\n", nr_free_buffer_pages()); } /* @@ -360,8 +359,10 @@ static int create_mem_map_page_table (u64 start, u64 end, void *arg) { - unsigned long address, start_page, end_page; + unsigned long address, start_page, end_page, next_blk_page; + unsigned long blk_start; struct page *map_start, *map_end; + int node=0; pgd_t *pgd; pmd_t *pmd; pte_t *pte; @@ -374,18 +375,35 @@ start_page = (unsigned long) map_start & PAGE_MASK; end_page = PAGE_ALIGN((unsigned long) map_end); + /* force the first iteration to get node id */ + blk_start = start; + next_blk_page = 0; + for (address = start_page; address < end_page; address += PAGE_SIZE) { + + /* if we went across a node boundary, get new nid */ + if (address >= next_blk_page) { + struct page *map_next_blk; + + node = paddr_to_nid(__pa(blk_start)); + + /* get end addr of this memblk as next blk_start */ + blk_start = (unsigned long) __va(min(end, memblk_endpaddr(__pa(blk_start)))); + map_next_blk = vmem_map + MAP_NR_DENSE(blk_start); + next_blk_page = PAGE_ALIGN((unsigned long) map_next_blk); + } + pgd = pgd_offset_k(address); if (pgd_none(*pgd)) - pgd_populate(&init_mm, pgd, alloc_bootmem_pages(PAGE_SIZE)); + pgd_populate(&init_mm, pgd, alloc_bootmem_pages_node(NODE_DATA(node), PAGE_SIZE)); pmd = pmd_offset(pgd, address); if (pmd_none(*pmd)) - pmd_populate(&init_mm, pmd, alloc_bootmem_pages(PAGE_SIZE)); + pmd_populate(&init_mm, pmd, alloc_bootmem_pages_node(NODE_DATA(node), PAGE_SIZE)); pte = pte_offset(pmd, address); if (pte_none(*pte)) - set_pte(pte, mk_pte_phys(__pa(alloc_bootmem_pages(PAGE_SIZE)), + set_pte(pte, mk_pte_phys(__pa(alloc_bootmem_pages_node(NODE_DATA(node), PAGE_SIZE)), PAGE_KERNEL)); } return 0; @@ -399,6 +417,14 @@ int highmem; }; +struct memmap_count_callback_data { + int node; + unsigned long num_physpages; + unsigned long num_dma_physpages; + unsigned long min_pfn; + unsigned long max_pfn; +} cdata; + static int virtual_memmap_init (u64 start, u64 end, void *arg) { @@ -454,17 +480,7 @@ efi_memmap_walk(virtual_memmap_init, &args); } - return page_to_phys(end); -} - -static int -count_dma_pages (u64 start, u64 end, void *arg) -{ - unsigned long *count = arg; - - if (end <= MAX_DMA_ADDRESS) - *count += (end - start) >> PAGE_SHIFT; - return 0; + return page_to_phys(end-1) + PAGE_SIZE;; } int @@ -475,16 +491,27 @@ return __get_user(byte, (char *) page) == 0; } +#define GRANULEROUNDDOWN(n) ((n) & ~(IA64_GRANULE_SIZE-1)) +#define GRANULEROUNDUP(n) (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1)) +#define ORDERROUNDDOWN(n) ((n) & ~((PAGE_SIZE<> PAGE_SHIFT; + start = __pa(start); + end = __pa(end); + if (node == cdata.node) { + cdata.num_physpages += (end - start) >> PAGE_SHIFT; + if (start <= __pa(MAX_DMA_ADDRESS)) + cdata.num_dma_physpages += (min(end, __pa(MAX_DMA_ADDRESS)) - start) >> PAGE_SHIFT; + start = GRANULEROUNDDOWN(__pa(start)); + start = ORDERROUNDDOWN(start); + end = GRANULEROUNDUP(__pa(end)); + cdata.max_pfn = max(cdata.max_pfn, end >> PAGE_SHIFT); + cdata.min_pfn = min(cdata.min_pfn, start >> PAGE_SHIFT); + } return 0; } -#ifndef CONFIG_DISCONTIGMEM static int find_largest_hole(u64 start, u64 end, void *arg) { @@ -498,7 +525,6 @@ last_end = end; return 0; } -#endif /* * Set up the page tables. @@ -509,73 +535,76 @@ unsigned long max_dma; unsigned long zones_size[MAX_NR_ZONES]; unsigned long zholes_size[MAX_NR_ZONES]; -#ifndef CONFIG_DISCONTIGMEM unsigned long max_gap; -#endif + int node; /* initialize mem_map[] */ - memset(zones_size, 0, sizeof(zones_size)); - memset(zholes_size, 0, sizeof(zholes_size)); - - num_physpages = 0; - efi_memmap_walk(count_pages, &num_physpages); - - num_dma_physpages = 0; - efi_memmap_walk(count_dma_pages, &num_dma_physpages); - max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; - - if (max_low_pfn < max_dma) { - zones_size[ZONE_DMA] = max_low_pfn; - zholes_size[ZONE_DMA] = max_low_pfn - num_dma_physpages; - } else { - zones_size[ZONE_DMA] = max_dma; - zholes_size[ZONE_DMA] = max_dma - num_dma_physpages; - if (num_physpages > num_dma_physpages) { - zones_size[ZONE_NORMAL] = max_low_pfn - max_dma; - zholes_size[ZONE_NORMAL] = (max_low_pfn - max_dma) - - (num_physpages - num_dma_physpages); - } - } - -#ifdef CONFIG_DISCONTIGMEM - free_area_init_node(0, NULL, NULL, zones_size, 0, zholes_size); -#else max_gap = 0; efi_memmap_walk(find_largest_hole, (u64 *)&max_gap); - if (max_gap < LARGE_GAP) { - vmem_map = (struct page *)0; - free_area_init_node(0, NULL, NULL, zones_size, 0, zholes_size); + for (node=0; node < numnodes; node++) { + memset(zones_size, 0, sizeof(zones_size)); + memset(zholes_size, 0, sizeof(zholes_size)); + memset(&cdata, 0, sizeof(cdata)); + + cdata.node = node; + cdata.min_pfn = ~0; + + efi_memmap_walk(filter_rsvd_memory, count_pages); + num_dma_physpages += cdata.num_dma_physpages; + num_physpages += cdata.num_physpages; + + if (cdata.min_pfn >= max_dma) { + zones_size[ZONE_NORMAL] = cdata.max_pfn - cdata.min_pfn; + zholes_size[ZONE_NORMAL] = cdata.max_pfn - cdata.min_pfn - cdata.num_physpages; + } else if (cdata.max_pfn < max_dma) { + zones_size[ZONE_DMA] = cdata.max_pfn - cdata.min_pfn; + zholes_size[ZONE_DMA] = cdata.max_pfn - cdata.min_pfn - cdata.num_dma_physpages; + } else { + zones_size[ZONE_DMA] = max_dma - cdata.min_pfn; + zholes_size[ZONE_DMA] = zones_size[ZONE_DMA] - cdata.num_dma_physpages; + zones_size[ZONE_NORMAL] = cdata.max_pfn - max_dma; + zholes_size[ZONE_NORMAL] = zones_size[ZONE_NORMAL] - (cdata.num_physpages - cdata.num_dma_physpages); + } + + if (numnodes == 1 && max_gap < LARGE_GAP) { + vmem_map = (struct page *)0; + zones_size[ZONE_DMA] += cdata.min_pfn; + zholes_size[ZONE_DMA] += cdata.min_pfn; + free_area_init_core(0, NODE_DATA(node), &mem_map, zones_size, 0, zholes_size, NULL); + } else { + + /* allocate virtual mem_map */ + + if (node == 0) { + unsigned long map_size; + map_size = PAGE_ALIGN(max_low_pfn*sizeof(struct page)); + vmalloc_end -= map_size; + mem_map = vmem_map = (struct page *) vmalloc_end; + efi_memmap_walk(create_mem_map_page_table, 0); + printk(KERN_INFO "Virtual mem_map starts at 0x%p\n", mem_map); + } + + free_area_init_node(node, NODE_DATA(node), vmem_map+cdata.min_pfn, zones_size, + cdata.min_pfn< + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * The following structures are usually initialized by ACPI or + * similar mechanisms and describe the NUMA characteristics of the machine. + */ +int num_memblks = 0; +struct node_memblk_s node_memblk[NR_MEMBLKS]; +struct node_cpuid_s node_cpuid[NR_CPUS]; +/* + * This is a matrix with "distances" between nodes, they should be + * proportional to the memory access latency ratios. + */ +u8 numa_slit[NR_NODES * NR_NODES]; + +/* Identify which cnode a physical address resides on */ +int +paddr_to_nid(unsigned long paddr) +{ + int i; + + for (i = 0; i < num_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 end addr of a memblk */ +unsigned long +memblk_endpaddr(unsigned long paddr) +{ + int i; + + for (i = 0; i < num_memblks; i++) + if (paddr >= node_memblk[i].start_paddr && + paddr < node_memblk[i].start_paddr + node_memblk[i].size) + return node_memblk[i].start_paddr + node_memblk[i].size; + + return 0; +} + + +/* on which node is each logical CPU (one cacheline even for 64 CPUs) */ +volatile char cpu_to_node_map[NR_CPUS] __cacheline_aligned; + +/* which logical CPUs are on which nodes */ +volatile unsigned long node_to_cpu_mask[NR_NODES] __cacheline_aligned; + +/* + * Build cpu to node mapping and initialize the per node cpu masks. + */ +void __init +build_cpu_to_node_map (void) +{ + int cpu, i, node; + + for(cpu = 0; cpu < NR_CPUS; ++cpu) { + /* + * All Itanium NUMA platforms I know use ACPI, so maybe we + * can drop this ifdef completely. [EF] + */ +#ifdef CONFIG_SMP +# ifdef CONFIG_ACPI_NUMA + node = -1; + for (i = 0; i < NR_CPUS; ++i) { + extern volatile int ia64_cpu_to_sapicid[]; + if (ia64_cpu_to_sapicid[cpu] == node_cpuid[i].phys_id) { + node = node_cpuid[i].nid; + break; + } + } +# else +# error Fixme: Dunno how to build CPU-to-node map. +# endif + cpu_to_node_map[cpu] = node; + if (node >= 0) + __set_bit(cpu, &node_to_cpu_mask[node]); +#else + __set_bit(0, &node_to_cpu_mask[0]); +#endif + } +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/mm/tlb.c linux-2.4.23-pre8/arch/ia64/mm/tlb.c --- linux-2.4.22/arch/ia64/mm/tlb.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/mm/tlb.c 2003-10-22 22:49:12.000000000 +0000 @@ -1,7 +1,7 @@ /* * TLB support routines. * - * Copyright (C) 1998-2001 Hewlett-Packard Co + * Copyright (C) 1998-2001, 2003 Hewlett-Packard Co * David Mosberger-Tang * * 08/02/00 A. Mallick @@ -16,28 +16,21 @@ #include #include +#include #include #include #include -#include -#define SUPPORTED_PGBITS ( \ - 1 << _PAGE_SIZE_256M | \ - 1 << _PAGE_SIZE_64M | \ - 1 << _PAGE_SIZE_16M | \ - 1 << _PAGE_SIZE_4M | \ - 1 << _PAGE_SIZE_1M | \ - 1 << _PAGE_SIZE_256K | \ - 1 << _PAGE_SIZE_64K | \ - 1 << _PAGE_SIZE_16K | \ - 1 << _PAGE_SIZE_8K | \ - 1 << _PAGE_SIZE_4K ) +static struct { + unsigned long mask; /* mask of supported purge page-sizes */ + unsigned long max_bits; /* log2() of largest supported purge page-size */ +} purge; struct ia64_ctx ia64_ctx = { - .lock = SPIN_LOCK_UNLOCKED, - .next = 1, - .limit =(1 << 15) - 1, /* start out with the safe (architected) limit */ - .max_ctx = ~0U + .lock = SPIN_LOCK_UNLOCKED, + .next = 1, + .limit = (1 << 15) - 1, /* start out with the safe (architected) limit */ + .max_ctx = ~0U }; /* @@ -149,22 +142,10 @@ } nbits = ia64_fls(size + 0xfff); - if (((1UL << nbits) & SUPPORTED_PGBITS) == 0) { - if (nbits > _PAGE_SIZE_256M) - nbits = _PAGE_SIZE_256M; - else - /* - * Some page sizes are not implemented in the - * IA-64 arch, so if we get asked to clear an - * unsupported page size, round up to the - * nearest page size. Note that we depend on - * the fact that if page size N is not - * implemented, 2*N _is_ implemented. - */ - ++nbits; - if (((1UL << nbits) & SUPPORTED_PGBITS) == 0) - panic("flush_tlb_range: BUG: nbits=%lu\n", nbits); - } + while (unlikely (((1UL << nbits) & purge.mask) == 0) && (nbits < purge.max_bits)) + ++nbits; + if (nbits > purge.max_bits) + nbits = purge.max_bits; start &= ~((1UL << nbits) - 1); # ifdef CONFIG_SMP @@ -185,6 +166,15 @@ ia64_tlb_init (void) { ia64_ptce_info_t ptce_info; + unsigned long tr_pgbits; + long status; + + if ((status = ia64_pal_vm_page_size(&tr_pgbits, &purge.mask)) != 0) { + printk(KERN_ERR "PAL_VM_PAGE_SIZE failed with status=%ld;" + "defaulting to architected purge page-sizes.\n", status); + purge.mask = 0x115557000; + } + purge.max_bits = ia64_fls(purge.mask); ia64_get_ptce(&ptce_info); local_cpu_data->ptce_base = ptce_info.base; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/scripts/make_gas_hint_test.c linux-2.4.23-pre8/arch/ia64/scripts/make_gas_hint_test.c --- linux-2.4.22/arch/ia64/scripts/make_gas_hint_test.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/scripts/make_gas_hint_test.c 2003-10-22 22:47:37.000000000 +0000 @@ -0,0 +1,15 @@ +// The code generates a test case which is used +// to detect whether Binutil supports hint +// instruction correctly or not. +#include +#include + +int main() +{ + char str[32766]; + memset(str,'\n',32765); + str[32765]=0; + printf("%s(p7) hint @pause\n",str); + + return 0; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/fakeprom/fpmem.c linux-2.4.23-pre8/arch/ia64/sn/fakeprom/fpmem.c --- linux-2.4.22/arch/ia64/sn/fakeprom/fpmem.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/fakeprom/fpmem.c 2003-10-22 22:48:31.000000000 +0000 @@ -17,8 +17,58 @@ * klconfig to efi_memmap */ + +/* + * Sometimes it is useful to build a fake prom with a memmap that matches another + * platform. There are restrictions on how successful you will be, but here + * are the instructions for what I have used in the past & had good luck: + * + * - compile a kernel for the target platform (like zx1) with the following + * set: + * #define EFI_DEBUG 1 # in arch/ia64/kernel/efi.c + * #define SRAT_DEBUG # in drivers/acpi/numa.c + * + * - this causes the kernel to dump the memmap & SRAT during boot. + * + * - copy the console output to a file. + * + * - run the following script with the file as input: + * + * #!/bin/sh + * + * awk ' + * /^mem/ { + * printf "\t{%s, %sUL, %sUL, %sUL},\n", $4, $7, $11, $12 + * } + * /SRAT Memory/ { + * if (srat != 1) print "SRAT" + * srat = 1 + * for (i=1; i<=0;i++) + * printf "%4d |%s|\n", i, $i + * printf "\t{%s, %sUL, %sUL, %sUL},\n", $4, $6, $8, $13 + * } + * BEGIN { + * FS="[ \[\)\(\t:=,-]" + * } ' + * + * - this converts the memmap & SRAT info into C code array initilization statements. + * + * - copy & paste the initialization statements into the arrays below. Look for + * comments "PASTE xxx HERE". In general, on the MEMMAP is present on most other + * systems. If you have an SRAT, you may need to hack the number of nodes in fw-emu. + * Good luck... + * + * - set "#define FAKE_MEMMAP 1 + * + * - When running medusa, make sure you set the node1_memory_config to cover the + * amount of memory that you are going to use. Also note that you can run the + * kernel in "alias" space (starts at phy adr 0). This is kinda tricky, though + */ + + #include #include +#include #include "fpmem.h" /* @@ -77,9 +127,9 @@ /* For SN, get the index th nasid */ int -GetNasid(int index) +GetNasid(int cnode) { - return sn_memmap[index].nasid ; + return sn_memmap[cnode].nasid ; } node_memmap_t @@ -94,6 +144,21 @@ return sn_memmap[cnode].cpuconfig & (1UL<attribute = attr; } + +//#define FAKE_MEMMAP 1 +#ifdef FAKE_MEMMAP + +#define OFF 0x3000000000UL +struct { + unsigned long type; + unsigned long attr; + unsigned long start; + unsigned long end; +} mdx[] = { + /* PASTE SRAT HERE */ +}; + +struct srat { + unsigned long start; + unsigned long len; + unsigned long type; + unsigned long pxm; +} srat[] = { + + /* PASTE SRAT HERE */ + +}; + + + +void * +build_memory_srat(struct acpi_table_memory_affinity *ptr) +{ + int i; + int n = sizeof(srat)/sizeof(struct srat); + + for (i=0; iheader.type = ACPI_SRAT_MEMORY_AFFINITY; + ptr->header.length = sizeof(struct acpi_table_memory_affinity); + ptr->proximity_domain = srat[i].pxm; + ptr->base_addr_lo = srat[i].start & 0xffffffff; + ptr->length_lo = srat[i].len & 0xffffffff; + ptr->base_addr_hi = srat[i].start >> 32; + ptr->length_hi = srat[i].len >> 32; + ptr->memory_type = ACPI_ADDRESS_RANGE_MEMORY; + ptr->flags.enabled = 1; + ptr++; + } + return ptr; +} + +int +build_efi_memmap(void *md, int mdsize) +{ + int i; + + for (i=0; iheader.type = ACPI_SRAT_MEMORY_AFFINITY; + ptr->header.length = sizeof(struct acpi_table_memory_affinity); + ptr->proximity_domain = PROXIMITY_DOMAIN(nasid); + ptr->base_addr_lo = 0; + ptr->length_lo = 0; +#if defined(SGI_SN2) + ptr->base_addr_hi = (nasid<<6) | (3<<4); + ptr->length_hi = (MD_BANKSIZE*MD_BANKS_PER_NODE)>>32; +#endif + ptr->memory_type = ACPI_ADDRESS_RANGE_MEMORY; + ptr->flags.enabled = 1; + ptr++; + } + return ptr; +} + + int build_efi_memmap(void *md, int mdsize) { @@ -148,7 +316,6 @@ int cnode,bank ; int nasid ; node_memmap_t membank_info ; - int bsize; int count = 0 ; long paddr, hole, numbytes; @@ -157,18 +324,9 @@ nasid = GetNasid(cnode) ; membank_info = GetMemBankInfo(cnode) ; for (bank=0;bank>1) & 255) #define SN2_BANK_SIZE_SHIFT (MBSHIFT+6) /* 64 MB */ -#define BankPresent(bsize) (bsize<6) -#define BankSizeBytes(bsize) (BankPresent(bsize) ? 1UL<<((bsize)+SN2_BANK_SIZE_SHIFT) : 0) #define MD_BANKS_PER_NODE 4 #define MD_BANKSIZE (1UL << 34) + +#define MAX_SN_NODES 256 +#define MAX_LSAPICS 512 +#define MAX_CPUS_NODE 4 +#define MAX_CPUS (MAX_CPUS_NODE*MAX_SN_NODES) +#define CPUS_PER_FSB 2 +#define CPUS_PER_FSB_MASK (CPUS_PER_FSB-1) +#define MAX_NASID 2048 + #endif +#define FPROM_BUG() do {while (1);} while (0) + typedef struct sn_memmap_s { short nasid ; @@ -66,7 +72,9 @@ sn_memmap_t memmap[1]; /* start of array */ } sn_config_t; +struct acpi_table_memory_affinity; +extern long base_nasid; extern void build_init(unsigned long); extern int build_efi_memmap(void *, int); @@ -74,3 +82,5 @@ extern int GetNumCpus(void); extern int IsCpuPresent(int, int); extern int GetNasid(int); +extern void* build_memory_srat(struct acpi_table_memory_affinity *); +extern void GetLogicalCpu(int, int *, int *); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/fakeprom/fpromasm.S linux-2.4.23-pre8/arch/ia64/sn/fakeprom/fpromasm.S --- linux-2.4.22/arch/ia64/sn/fakeprom/fpromasm.S 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/fakeprom/fpromasm.S 2003-10-22 22:48:15.000000000 +0000 @@ -253,9 +253,10 @@ // Note: should verify that the interrupt we got was really the ap_wakeup // interrupt but this should not be an issue on medusa slave: - nop.i 0x8beef // Medusa - put cpu to sleep til interrupt occurs mov r8=cr.irr0;; // Check for interrupt pending. cmp.eq p6,p0=r8,r0 + ;; +(p6) nop.i 0x8beef // Medusa - put cpu to sleep til interrupt occurs (p6) br.cond.sptk slave;; mov r8=cr.ivr;; // Got one. Must read ivr to accept it @@ -361,6 +362,13 @@ st8 [r3]=r2 ;; +1: cmp.eq p6,p7=34,r28 /* PAL_VM_PAGE_SIZE */ +(p7) br.cond.sptk.few 1f + movl r8=0 /* status = 0 */ + movl r9=0x015557000 /* insertable page sizes */ + movl r10=0x115557000 /* purgeable page sizes */ + movl r11=0 + 1: cmp.eq p6,p7=19,r28 /* PAL_RSE_INFO */ (p7) br.cond.sptk.few 1f movl r8=0 /* status = 0 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/fakeprom/fw-emu.c linux-2.4.23-pre8/arch/ia64/sn/fakeprom/fw-emu.c --- linux-2.4.22/arch/ia64/sn/fakeprom/fw-emu.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/fakeprom/fw-emu.c 2003-10-22 22:49:15.000000000 +0000 @@ -47,6 +47,8 @@ #include #endif #include +#include +#include #include "fpmem.h" #define RSDP_NAME "RSDP" @@ -66,11 +68,12 @@ #define BOOT_SIG "BOOT" /* Boot table */ #define ACPI_SRAT_REVISION 1 #define ACPI_SLIT_REVISION 1 +#define ACPI_FADT_REVISION 3 +#define ACPI_DSDT_REVISION 1 #define OEMID "SGI" #ifdef SGI_SN2 #define PRODUCT "SN2" -#define PROXIMITY_DOMAIN(nasid) (((nasid)>>1) & 255) #endif #define MB (1024*1024UL) @@ -81,15 +84,6 @@ #define ABS(i) ((i) > 0 ? (i) : -(i)) #define ALIGN8(p) (((long)(p) +7) & ~7) -#define FPROM_BUG() do {while (1);} while (0) -#define MAX_SN_NODES 128 -#define MAX_LSAPICS 512 -#define MAX_CPUS 512 -#define MAX_CPUS_NODE 4 -#define CPUS_PER_NODE 4 -#define CPUS_PER_FSB 2 -#define CPUS_PER_FSB_MASK (CPUS_PER_FSB-1) - #define NUM_EFI_DESCS 2 #define RSDP_CHECKSUM_LENGTH 20 @@ -126,11 +120,10 @@ */ long base_nasid; long num_cpus; -long bsp_entry_pc=0; +long bsp_entry_pc; long num_nodes; -long app_entry_pc; -int bsp_lid; func_ptr_t ap_entry; +char nasid_present[MAX_NASID]; extern void pal_emulator(void); @@ -141,8 +134,11 @@ + sizeof(struct ia64_sal_systab) + sizeof(struct ia64_sal_desc_entry_point) + sizeof(struct ia64_sal_desc_ap_wakeup) + + sizeof(struct ia64_sal_desc_platform_feature) + sizeof(struct acpi20_table_rsdp) + sizeof(struct acpi_table_xsdt) + + sizeof(struct acpi_table_header) /* dummy DSDT */ + + sizeof(struct fadt_descriptor_rev2) + sizeof(struct acpi_table_slit) + MAX_SN_NODES*MAX_SN_NODES+8 + sizeof(struct acpi_table_madt) @@ -242,7 +238,11 @@ if (index == SAL_FREQ_BASE) { switch (in1) { case SAL_FREQ_BASE_PLATFORM: - r9 = 500000000; + /* slow down the clock on large systems to reduce the interrupt rate */ + if (num_cpus < 32) + r9 = 500000000UL; + else + r9 = 5000000000UL; break; case SAL_FREQ_BASE_INTERVAL_TIMER: @@ -446,7 +446,7 @@ } int -nasid_present(int nasid) +is_nasid_present(int nasid) { int cnode; for (cnode=0; cnodehdr.signature = EFI_SYSTEM_TABLE_SIGNATURE; @@ -598,7 +598,9 @@ acpi_xsdt->entry[0] = __fwtab_pa(base_nasid, acpi_madt); acpi_xsdt->entry[1] = __fwtab_pa(base_nasid, acpi_slit); acpi_xsdt->entry[2] = __fwtab_pa(base_nasid, acpi_srat); - acpi_checksum(&acpi_xsdt->header, sizeof(struct acpi_table_xsdt) + 16); + acpi_xsdt->entry[3] = __fwtab_pa(base_nasid, acpi_fadt); + acpi_xsdt->entry[4] = __fwtab_pa(base_nasid, acpi_dsdt); + acpi_checksum(&acpi_xsdt->header, sizeof(struct acpi_table_xsdt) + 32); /* Set up the APIC table */ acpi_table_initx(&acpi_madt->header, APIC_SIG, 4, 1, 1); @@ -614,7 +616,7 @@ lsapic20->flags.enabled = 1; #if defined(SGI_SN2) lsapic20->eid = nasid&0xffff; - lsapic20->id = (cpu<<4) | (nasid>>16); + lsapic20->id = (cpu<<4) | (nasid>>8); #endif lsapic20 = (struct acpi_table_lsapic*) ((long)lsapic20+sizeof(struct acpi_table_lsapic)); } @@ -624,23 +626,10 @@ /* Set up the SRAT table */ acpi_table_initx(&acpi_srat->header, SRAT_SIG, 4, ACPI_SRAT_REVISION, 1); ptr = acpi_srat+1; - for (cnode=0; cnodeheader.type = ACPI_SRAT_MEMORY_AFFINITY; - srat_memory_affinity->header.length = sizeof(struct acpi_table_memory_affinity); - srat_memory_affinity->proximity_domain = PROXIMITY_DOMAIN(nasid); - srat_memory_affinity->base_addr_lo = 0; - srat_memory_affinity->length_lo = 0; -#if defined(SGI_SN2) - srat_memory_affinity->base_addr_hi = (nasid<<6) | (3<<4); - srat_memory_affinity->length_hi = (MD_BANKSIZE*MD_BANKS_PER_NODE)>>32; -#endif - srat_memory_affinity->memory_type = ACPI_ADDRESS_RANGE_MEMORY; - srat_memory_affinity->flags.enabled = 1; - } + ptr = build_memory_srat(ptr); + + /* Build processor SRAT */ for (cnode=0; cnodeflags.enabled = 1; #if defined(SGI_SN2) srat_cpu_affinity->lsapic_eid = nasid&0xffff; - srat_cpu_affinity->apic_id = (cpu<<4) | (nasid>>16); + srat_cpu_affinity->apic_id = (cpu<<4) | (nasid>>8); #endif } } acpi_checksum(&acpi_srat->header, (char*)ptr - (char*)acpi_srat); + acpi_table_initx(acpi_dsdt, DSDT_SIG, 4, ACPI_DSDT_REVISION, 1); + acpi_checksum(acpi_dsdt, sizeof(*acpi_dsdt)); + + /* Set up the FADT table */ + acpi_table_initx((struct acpi_table_header *)&acpi_fadt->header, FADT_SIG, 4, ACPI_FADT_REVISION, 1); + /* + * We don't have legacy PC keyboard support etc. + */ + acpi_fadt->iapc_boot_arch = 0; + acpi_fadt->Xdsdt = (u64)__fwtab_pa(base_nasid, acpi_dsdt); + acpi_checksum((struct acpi_table_header *)&acpi_fadt->header, + sizeof(*acpi_fadt)); /* Set up the SLIT table */ acpi_table_initx(&acpi_slit->header, SLIT_SIG, 4, ACPI_SLIT_REVISION, 1); @@ -668,8 +669,10 @@ memset(cp, 255, acpi_slit->localities*acpi_slit->localities); for (i=0; i<=max_nasid; i++) + nasid_present[i] = is_nasid_present(i); + for (i=0; i<=max_nasid; i++) for (j=0; j<=max_nasid; j++) - if (nasid_present(i) && nasid_present(j)) + if (nasid_present[i] && nasid_present[j]) *(cp+PROXIMITY_DOMAIN(i)*acpi_slit->localities+PROXIMITY_DOMAIN(j)) = 10 + MIN(254, 5*ABS(i-j)); cp = acpi_slit->entry + acpi_slit->localities*acpi_slit->localities; @@ -681,7 +684,7 @@ sal_systab->size = sizeof(*sal_systab); sal_systab->sal_rev_minor = 1; sal_systab->sal_rev_major = 0; - sal_systab->entry_count = 3; + sal_systab->entry_count = 4; sal_systab->sal_b_rev_major = 0x1; /* set the SN SAL rev to */ sal_systab->sal_b_rev_minor = 0x0; /* 1.00 */ @@ -730,6 +733,10 @@ sal_apwake->mechanism = IA64_SAL_AP_EXTERNAL_INT; sal_apwake->vector = 18; + /* Setup the SAL feature descriptor */ + sal_feature->type = SAL_DESC_PLATFORM_FEATURE; + sal_feature->feature_mask = IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT; + for (checksum=0, cp=(char*)sal_systab; cp < (char *)efi_memmap; ++cp) checksum += *cp; sal_systab->checksum = -checksum; @@ -754,22 +761,4 @@ bp->console_info.orig_x = 0; bp->console_info.orig_y = 24; bp->fpswa = 0; - - /* - * Now pick the BSP & store it LID value in - * a global variable. Note if BSP is greater than last cpu, - * pick the last cpu. - */ - for (cnode=0; cnode 0) - continue; - return; - } - } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/fakeprom/main.c linux-2.4.23-pre8/arch/ia64/sn/fakeprom/main.c --- linux-2.4.22/arch/ia64/sn/fakeprom/main.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/fakeprom/main.c 2003-10-22 22:48:59.000000000 +0000 @@ -12,90 +12,60 @@ #include #include #include +#include +#include "fpmem.h" extern void klgraph_init(void); -void bedrock_init(int); -void synergy_init(int, int); -void sys_fw_init (const char *args, int arglen, int bsp); - -volatile int bootmaster=0; /* Used to pick bootmaster */ -volatile int nasidmaster[128]={0}; /* Used to pick node/synergy masters */ -int init_done=0; -extern int bsp_lid; - -#define get_bit(b,p) (((*p)>>(b))&1) +void sys_fw_init (const char *args, int arglen); int fmain(int lid, int bsp) { - int syn, nasid, cpu; + int nasid, cpu, mynasid, mycpu, bootmaster; + + /* + * * Pass the parameter base address to the build_efi_xxx routines. + */ +#if defined(SGI_SN2) + build_init(0x3000000000UL | ((long)base_nasid<<38)); +#endif /* * First lets figure out who we are. This is done from the * LID passed to us. */ - nasid = (lid>>16)&0xfff; - cpu = (lid>>28)&3; - syn = 0; - + mynasid = (lid>>16)&0xfff; + mycpu = (lid>>28)&3; + /* - * Now pick a nasid master to initialize Bedrock registers. + * Determine if THIS cpu is the bootmaster. The parameter + * is the logical cpu of the bootmaster. Cpus are numbered + * low-to-high nasid/lid. */ - if (test_and_set_bit(8, &nasidmaster[nasid]) == 0) { - bedrock_init(nasid); - test_and_set_bit(9, &nasidmaster[nasid]); - } else - while (get_bit(9, &nasidmaster[nasid]) == 0); + GetLogicalCpu(bsp, &nasid, &cpu); + bootmaster = (mynasid == nasid) && (mycpu == cpu); - /* - * Now pick a BSP & finish init. + * Initialize SAL & EFI tables. + * Note: non-bootmaster cpus will return to the slave loop + * in fpromasm.S. They spin there until they receive an + * external interrupt from the master cpu. */ - if (test_and_set_bit(0, &bootmaster) == 0) { - sys_fw_init(0, 0, bsp); - test_and_set_bit(1, &bootmaster); - } else - while (get_bit(1, &bootmaster) == 0); - - return (lid == bsp_lid); -} - - -void -bedrock_init(int nasid) -{ - nasid = nasid; /* to quiet gcc */ + if (bootmaster) { #if 0 - /* - * Undef if you need fprom to generate a 1 node klgraph - * information .. only works for 1 node for nasid 0. - */ - klgraph_init(); + /* + * Undef if you need fprom to generate a 1 node klgraph + * information .. only works for 1 node for nasid 0. + */ + klgraph_init(); #endif -} - - -void -synergy_init(int nasid, int syn) -{ - long *base; - long off; + sys_fw_init(0, 0); + } - /* - * Enable all FSB flashed interrupts. - * I'd really like defines for this...... - */ - base = (long*)0x80000e0000000000LL; /* base of synergy regs */ - for (off = 0x2a0; off < 0x2e0; off+=8) /* offset for VEC_MASK_{0-3}_A/B */ - *(base+off/8) = -1LL; - - /* - * Set the NASID in the FSB_CONFIG register. - */ - base = (long*)0x80000e0000000450LL; - *base = (long)((nasid<<16)|(syn<<9)); + return (bootmaster); } + /* Why isnt there a bcopy/memcpy in lib64.a */ void* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/fakeprom/make_textsym linux-2.4.23-pre8/arch/ia64/sn/fakeprom/make_textsym --- linux-2.4.22/arch/ia64/sn/fakeprom/make_textsym 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/fakeprom/make_textsym 2003-10-22 22:48:57.000000000 +0000 @@ -0,0 +1,168 @@ +#!/bin/sh +# +# Build a textsym file for use in the Arium ITP probe. +# +# +# 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. +# +# Copyright (c) 2001-2003 Silicon Graphics, Inc. All rights reserved. +# + +help() { +cat < []] + If no input file is specified, it defaults to vmlinux. + If no output file name is specified, it defaults to "textsym". +END +exit 1 +} + +err () { + echo "ERROR - $*" >&2 + exit 1 +} + + +OPTS="H" +while getopts "$OPTS" c ; do + case $c in + H) help;; + \?) help;; + esac + +done +shift `expr $OPTIND - 1` + +if [ -f /usr/bin/ia64-linux-objdump ] ; then + OBJDUMP=${OBJDUMP:-/usr/bin/ia64-linux-objdump} +else + OBJDUMP=${OBJDUMP:-objdump} +fi + +LINUX=${1:-vmlinux} +TEXTSYM=${2:-${LINUX}.sym} +TMPSYM=${2:-${LINUX}.sym.tmp} +trap "/bin/rm -f $TMPSYM" 0 + +[ -f $VMLINUX ] || help + +$OBJDUMP -t $LINUX | egrep -v '__ks' | sort > $TMPSYM + +# pipe everything thru sort +echo "TEXTSYM V1.0" >$TEXTSYM +(cat < 0) { + n = n*16 + (index("0123456789abcdef", substr(s,1,1)) - 1) + s = substr(s,2) + } + printf "GLOBAL | %s | DATA | %s | %d\n", $1, $NF, n + } + } + if($NF == "_end") + exit + +} +' $TMPSYM ) | egrep -v " __device| __vendor" | awk ' +/GLOBAL/ { + print $0 + /* 38 bits of sn2 physical addrs, need addr space bits */ + if (substr($0,19,1) == "4") + print substr($0,1,9) "3004" substr($0,20,16) "Phy_" substr($0,36) + else + print substr($0,1,9) "3005" substr($0,20,16) "Phy_" substr($0,36) + +} ' | sort -k3 >>$TEXTSYM + +N=`wc -l $TEXTSYM|awk '{print $1}'` +echo "Generated TEXTSYM file" >&2 +echo " $LINUX --> $TEXTSYM" >&2 +echo " Found $N symbols" >&2 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/Makefile linux-2.4.23-pre8/arch/ia64/sn/io/Makefile --- linux-2.4.22/arch/ia64/sn/io/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/Makefile 2003-10-22 22:48:14.000000000 +0000 @@ -13,8 +13,9 @@ O_TARGET := sgiio.o -obj-y := sgi_if.o xswitch.o sgi_io_sim.o \ - cdl.o io.o +export-objs := snia_if.o + +obj-y := sgi_if.o xswitch.o cdl.o io.o snia_if.o obj-y += sn2/snio.o machvec/snio.o \ drivers/snio.o platform_init/snio.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/drivers/Makefile linux-2.4.23-pre8/arch/ia64/sn/io/drivers/Makefile --- linux-2.4.22/arch/ia64/sn/io/drivers/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/drivers/Makefile 2003-10-22 22:48:53.000000000 +0000 @@ -11,7 +11,7 @@ O_TARGET := snio.o -obj-y += hubdev.o ioconfig_bus.o ifconfig_net.o +obj-y += ioconfig_bus.o ifconfig_net.o obj-$(CONFIG_PCIBA) += pciba.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/drivers/ifconfig_net.c linux-2.4.23-pre8/arch/ia64/sn/io/drivers/ifconfig_net.c --- linux-2.4.22/arch/ia64/sn/io/drivers/ifconfig_net.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/drivers/ifconfig_net.c 2003-10-22 22:47:29.000000000 +0000 @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -37,8 +38,11 @@ /* * Some Global definitions. */ -static devfs_handle_t ifconfig_net_handle; +static vertex_hdl_t ifconfig_net_handle; static unsigned long ifconfig_net_debug; +static struct ifname_MAC *new_devices; +static struct ifname_num *ifname_num; + /* * ifconfig_net_open - Opens the special device node "/devhw/.ifconfig_net". @@ -189,8 +193,7 @@ char temp[64]; #endif struct ifname_MAC *ifname_MAC; - struct ifname_MAC *new_devices, *temp_new_devices; - struct ifname_num *ifname_num; + struct ifname_MAC *temp_new_devices; unsigned long size; @@ -204,14 +207,24 @@ */ ifname_num = (struct ifname_num *) kmalloc(sizeof(struct ifname_num), GFP_KERNEL); - copy_from_user( ifname_num, (char *) arg, sizeof(struct ifname_num)); + if (copy_from_user( ifname_num, (char *) arg, sizeof(struct ifname_num))) + return -EFAULT; size = ifname_num->size; kfree(ifname_num); ifname_num = (struct ifname_num *) kmalloc(size, GFP_KERNEL); + if (ifname_num <= 0) + return -ENOMEM; ifname_MAC = (struct ifname_MAC *) ((char *)ifname_num + (sizeof(struct ifname_num)) ); - copy_from_user( ifname_num, (char *) arg, size); + if (copy_from_user( ifname_num, (char *) arg, size)){ + kfree(ifname_num); + return -EFAULT; + } new_devices = kmalloc(size - sizeof(struct ifname_num), GFP_KERNEL); + if (new_devices <= 0){ + kfree(ifname_num); + return -ENOMEM; + } temp_new_devices = new_devices; memset(new_devices, 0, size - sizeof(struct ifname_num)); @@ -257,10 +270,10 @@ /* * Copy back to the User Buffer area any new devices encountered. */ - copy_to_user((char *)arg + (sizeof(struct ifname_num)), new_devices, - size - sizeof(struct ifname_num)); + kfree(new_devices); + return copy_to_user((char *)arg + (sizeof(struct ifname_num)), new_devices, + size - sizeof(struct ifname_num))?-EFAULT:0; - return(0); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/drivers/ioconfig_bus.c linux-2.4.23-pre8/arch/ia64/sn/io/drivers/ioconfig_bus.c --- linux-2.4.22/arch/ia64/sn/io/drivers/ioconfig_bus.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/drivers/ioconfig_bus.c 2003-10-22 22:48:30.000000000 +0000 @@ -17,6 +17,8 @@ #include #include +#include + #include #include #include @@ -36,6 +38,7 @@ */ static vertex_hdl_t ioconfig_bus_handle; static unsigned long ioconfig_bus_debug; +static struct ioconfig_parm parm; #ifdef IOCONFIG_BUS_DEBUG #define DBG(x...) printk(x) @@ -162,8 +165,13 @@ struct ascii_moduleid *moduleid; line = kmalloc(256, GFP_KERNEL); + if (line <= 0) + BUG(); /* Do not want to continue system boot .. */ memset(line, 0,256); name = kmalloc(125, GFP_KERNEL); + if (name <= 0){ + BUG(); /* Do not want to continue system boot .. */ + } memset(name, 0, 125); moduleid = table; current = file_contents; @@ -252,6 +260,9 @@ ret_stuff.v0, (void *)ioconfig_file, (int)ioconfig_file_size); ioconfig_bus_table = kmalloc( 512, GFP_KERNEL ); + if (ioconfig_bus_table <= 0) + BUG(); /* Seriously, we should not be out of memory at init */ + memset(ioconfig_bus_table, 0, 512); /* @@ -264,7 +275,6 @@ DBG("ioconfig_bus_init: Kernel Options given.\n"); (void) build_moduleid_table((char *)ioconfig_kernopts, ioconfig_bus_table); (void) dump_ioconfig_table(); - return; } if (ioconfig_activated) { @@ -305,16 +315,20 @@ unsigned int cmd, unsigned long arg) { - struct ioconfig_parm parm; - + int length; /* * Copy in the parameters. */ - copy_from_user(&parm, (char *)arg, sizeof(struct ioconfig_parm)); + length = copy_from_user(&parm, (char *)arg, sizeof(struct ioconfig_parm)); + if (length <= 0) + return -EFAULT; parm.number = free_entry - new_entry; parm.ioconfig_activated = ioconfig_activated; - copy_to_user((char *)arg, &parm, sizeof(struct ioconfig_parm)); - copy_to_user((char *)parm.buffer, &ioconfig_bus_table[new_entry], sizeof(struct ascii_moduleid) * (free_entry - new_entry)); + if (copy_to_user((char *)arg, &parm, sizeof(struct ioconfig_parm))) + return -EFAULT; + + if (copy_to_user((char *)parm.buffer, &ioconfig_bus_table[new_entry], sizeof(struct ascii_moduleid) * (free_entry - new_entry))) + return -EFAULT; return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/drivers/pciba.c linux-2.4.23-pre8/arch/ia64/sn/io/drivers/pciba.c --- linux-2.4.22/arch/ia64/sn/io/drivers/pciba.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/drivers/pciba.c 2003-10-22 22:47:37.000000000 +0000 @@ -341,8 +341,8 @@ TRACE(); node = kmalloc(sizeof(struct node_data), GFP_KERNEL); - if (node == NULL) - return NULL; + if (node <= 0) + return node; list_add(&node->global_node_list, &global_node_list); return node; } @@ -455,7 +455,7 @@ if present */ if (pci_resource_len(dev, PCI_ROM_RESOURCE) != 0) { nd = new_node(); - if (nd == NULL) + if (nd <= 0) return failure; node_devfs_handle = hwgraph_register(device_dir_handle, "rom", 0, DEVFS_FL_NONE, 0, 0, @@ -478,7 +478,7 @@ and free DMA buffers, as well as memory map those buffers. */ nd = new_node(); - if (nd == NULL) + if (nd <= 0) return failure; node_devfs_handle = hwgraph_register(device_dir_handle, "dma", 0, DEVFS_FL_NONE, @@ -763,7 +763,7 @@ dma_alloc = (struct dma_allocation *) kmalloc(sizeof(struct dma_allocation), GFP_KERNEL); - if (dma_alloc == NULL) + if (dma_alloc <= 0) return -ENOMEM; dma_alloc->size = (size_t)argv; @@ -899,7 +899,7 @@ /* the __pa macro is intended for region 7 on IA64, so it doesn't work for region 6 */ /* pci_pa = __pa(pci_va); */ - /* should be replaced by __tpa or equivalent (preferably a + /* should be replaced by ia64_tpa or equivalent (preferably a generic equivalent) */ pci_pa = pci_va & ~0xe000000000000000ul; DPRINTF("PCI base at physical address %lx\n", pci_pa); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/hwgdfs/hcl.c linux-2.4.23-pre8/arch/ia64/sn/io/hwgdfs/hcl.c --- linux-2.4.22/arch/ia64/sn/io/hwgdfs/hcl.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/hwgdfs/hcl.c 2003-10-22 22:48:15.000000000 +0000 @@ -233,6 +233,15 @@ __setup("hcl=", hcl_setup); +int +hwgraph_generate_path( + vertex_hdl_t de, + char *path, + int buflen) +{ + return (devfs_generate_path(de, path, buflen)); +} + /* * Set device specific "fast information". * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/hwgdfs/hcl_util.c linux-2.4.23-pre8/arch/ia64/sn/io/hwgdfs/hcl_util.c --- linux-2.4.22/arch/ia64/sn/io/hwgdfs/hcl_util.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/hwgdfs/hcl_util.c 2003-10-22 22:49:04.000000000 +0000 @@ -1,4 +1,4 @@ -/* $Id: hcl_util.c,v 1.3 2003/04/24 13:59:39 pfg Exp $ +/* $Id: hcl_util.c,v 1.4 2003/07/31 12:24:27 edwardsg Exp $ * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/hwgfs/hcl.c linux-2.4.23-pre8/arch/ia64/sn/io/hwgfs/hcl.c --- linux-2.4.22/arch/ia64/sn/io/hwgfs/hcl.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/hwgfs/hcl.c 2003-10-22 22:49:21.000000000 +0000 @@ -28,16 +28,12 @@ #include #include -#define HCL_NAME "SGI-HWGRAPH COMPATIBILITY DRIVER" -#define HCL_TEMP_NAME "HCL_TEMP_NAME_USED_FOR_HWGRAPH_VERTEX_CREATE" -#define HCL_TEMP_NAME_LEN 44 -#define HCL_VERSION "1.0" - #define vertex_hdl_t hwgfs_handle_t + vertex_hdl_t hwgraph_root; vertex_hdl_t linux_busnum; - extern void pci_bus_cvlink_init(void); +unsigned long hwgraph_debug_mask = 0; /* * Debug flag definition. @@ -157,7 +153,7 @@ */ rv = hwgraph_path_add(NULL, EDGE_LBL_HW, &hwgraph_root); if (rv) - printk ("WARNING: init_hcl: Failed to create hwgraph_root. Error = %d.\n", rv); + panic("init_hcl: Failed to create hwgraph_root.\n"); /* * Create the hcl driver to support inventory entry manipulations. @@ -235,6 +231,15 @@ __setup("hcl=", hcl_setup); +int +hwgraph_generate_path( + vertex_hdl_t de, + char *path, + int buflen) +{ + return (hwgfs_generate_path(de, path, buflen)); +} + /* * Set device specific "fast information". * @@ -492,39 +497,6 @@ return(0); } -#if 0 -/* - * hwgraph_edge_add - This routines has changed from the original conext. - * All it does now is to create a symbolic link from "from" to "to". - */ -/* ARGSUSED */ -int -hwgraph_edge_add(vertex_hdl_t from, vertex_hdl_t to, char *name) -{ - - char *path, *link; - vertex_hdl_t handle = NULL; - int rv, i; - - handle = hwgfs_find_handle(from, name, 0, 0, 0, 1); - if (handle) { - return(0); - } - - path = kmalloc(1024, GFP_KERNEL); - memset(path, 0x0, 1024); - link = kmalloc(1024, GFP_KERNEL); - memset(path, 0x0, 1024); - i = hwgfs_generate_path (to, link, 1024); - rv = hwgfs_mk_symlink (from, (const char *)name, - DEVFS_FL_DEFAULT, link, - &handle, NULL); - return(0); - - -} -#endif - int hwgraph_edge_add(vertex_hdl_t from, vertex_hdl_t to, char *name) { @@ -916,6 +888,43 @@ return(GRAPH_ILLEGAL_REQUEST); } +void +hwgraph_debug(char *file, char * function, int line, vertex_hdl_t vhdl1, vertex_hdl_t vhdl2, char *format, ...) +{ + + int pos; + char *hwpath; + va_list ap; + + if ( !hwgraph_debug_mask ) + return; + + hwpath = kmalloc(MAXDEVNAME, GFP_KERNEL); + if (!hwpath) + BUG(); + + printk("HWGRAPH_DEBUG %s %s %d : ", file, function, line); + + if (vhdl1){ + memset(hwpath, 0, MAXDEVNAME); + pos = hwgfs_generate_path(vhdl1, hwpath, MAXDEVNAME); + printk("vhdl1 = %s : ", &hwpath[pos]); + } + + if (vhdl2){ + memset(hwpath, 0, MAXDEVNAME); + pos = hwgfs_generate_path(vhdl2, hwpath, MAXDEVNAME); + printk("vhdl2 = %s :", &hwpath[pos]); + } + + memset(hwpath, 0, MAXDEVNAME); + va_start(ap, format); + vsnprintf(hwpath, 500, format, ap); + va_end(ap); + hwpath[MAXDEVNAME -1] = (char)0; /* Just in case. */ + printk(" %s", hwpath); + kfree(hwpath); +} EXPORT_SYMBOL(hwgraph_mk_dir); EXPORT_SYMBOL(hwgraph_path_add); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/hwgfs/hcl_util.c linux-2.4.23-pre8/arch/ia64/sn/io/hwgfs/hcl_util.c --- linux-2.4.22/arch/ia64/sn/io/hwgfs/hcl_util.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/hwgfs/hcl_util.c 2003-10-22 22:49:45.000000000 +0000 @@ -22,7 +22,10 @@ #include static vertex_hdl_t hwgraph_all_cnodes = GRAPH_VERTEX_NONE; +static vertex_hdl_t hwgraph_all_cpuids = GRAPH_VERTEX_NONE; extern vertex_hdl_t hwgraph_root; +extern int maxcpus; + /* @@ -96,9 +99,6 @@ } } -static vertex_hdl_t hwgraph_all_cpuids = GRAPH_VERTEX_NONE; -extern int maxcpus; - void mark_cpuvertex_as_cpu(vertex_hdl_t vhdl, cpuid_t cpuid) { @@ -161,6 +161,7 @@ (void)hwgraph_edge_add( hwgraph_all_cnodes, vhdl, cnodeid_buffer); + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, hwgraph_all_cnodes, NULL, "Creating path vhdl1\n")); } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/hwgfs/interface.c linux-2.4.23-pre8/arch/ia64/sn/io/hwgfs/interface.c --- linux-2.4.22/arch/ia64/sn/io/hwgfs/interface.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/hwgfs/interface.c 2003-10-22 22:49:14.000000000 +0000 @@ -38,7 +38,7 @@ memcpy(buf, *path, len); buf[len] = '\0'; - error = link_path_walk(buf, nd); + error = path_walk(buf, nd); if (unlikely(error)) return error; @@ -84,7 +84,7 @@ if (unlikely(error)) return error; - error = link_path_walk(name, &nd); + error = path_walk(name, &nd); if (unlikely(error)) return error; @@ -275,7 +275,7 @@ nd.dentry = dget(base ? base : hwgfs_vfsmount->mnt_sb->s_root); nd.flags = LOOKUP_POSITIVE | (traverse_symlinks ? LOOKUP_FOLLOW : 0); - error = link_path_walk(name, &nd); + error = path_walk(name, &nd); if (likely(!error)) { dentry = nd.dentry; path_release(&nd); /* stale data from here! */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/io.c linux-2.4.23-pre8/arch/ia64/sn/io/io.c --- linux-2.4.22/arch/ia64/sn/io/io.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/io.c 2003-10-22 22:48:41.000000000 +0000 @@ -86,7 +86,7 @@ } hub_set_piomode(nasid, HUB_PIO_CONVEYOR); - mutex_spinlock_init(&hubinfo->h_bwlock); + spin_lock_init(&hubinfo->h_bwlock); /* * If this lock can be acquired from interrupts or bh's, add SV_INTS or SV_BHS, * respectively, to the flags here. @@ -123,7 +123,6 @@ int bigwin, free_bw_index; nasid_t nasid; volatile hubreg_t junk; - unsigned long s; caddr_t kvaddr; #ifdef PIOMAP_UNC_ACC_SPACE uint64_t addr; @@ -171,7 +170,7 @@ */ tryagain: free_bw_index = -1; - s = mutex_spinlock(&hubinfo->h_bwlock); + spin_lock(&hubinfo->h_bwlock); for (bigwin=0; bigwin < HUB_NUM_BIG_WINDOW; bigwin++) { bw_piomap = hubinfo_bwin_piomap_get(hubinfo, bigwin); @@ -191,7 +190,7 @@ if ( xtalk_addr == bw_piomap->hpio_xtalk_info.xp_xtalk_addr && widget == bw_piomap->hpio_xtalk_info.xp_target) { bw_piomap->hpio_holdcnt++; - mutex_spinunlock(&hubinfo->h_bwlock, s); + spin_unlock(&hubinfo->h_bwlock); return(bw_piomap); } } @@ -265,7 +264,7 @@ bw_piomap->hpio_flags |= HUB_PIOMAP_IS_VALID; done: - mutex_spinunlock(&hubinfo->h_bwlock, s); + spin_unlock(&hubinfo->h_bwlock); return(bw_piomap); } @@ -285,7 +284,6 @@ vertex_hdl_t hubv; hubinfo_t hubinfo; nasid_t nasid; - unsigned long s; /* * Small windows are permanently mapped to corresponding widgets, @@ -301,7 +299,7 @@ hubinfo_get(hubv, &hubinfo); nasid = hubinfo->h_nasid; - s = mutex_spinlock(&hubinfo->h_bwlock); + spin_lock(&hubinfo->h_bwlock); /* * If this is the last hold on this mapping, free it. @@ -319,7 +317,7 @@ (void)sv_signal(&hubinfo->h_bwwait); } - mutex_spinunlock(&hubinfo->h_bwlock, s); + spin_unlock(&hubinfo->h_bwlock); } /* @@ -440,7 +438,7 @@ hub_dmamap_free(hub_dmamap_t hub_dmamap) { hub_dmamap->hdma_flags &= ~HUB_DMAMAP_IS_VALID; - kern_free(hub_dmamap); + kfree(hub_dmamap); } /* @@ -461,12 +459,9 @@ if (dmamap->hdma_flags & HUB_DMAMAP_USED) { /* If the map is FIXED, re-use is OK. */ if (!(dmamap->hdma_flags & HUB_DMAMAP_IS_FIXED)) { + char name[MAXDEVNAME]; vhdl = dmamap->hdma_xtalk_info.xd_dev; -#if defined(SUPPORT_PRINTING_V_FORMAT) - printk(KERN_WARNING "%v: hub_dmamap_addr re-uses dmamap.\n",vhdl); -#else - printk(KERN_WARNING "%p: hub_dmamap_addr re-uses dmamap.\n", (void *)vhdl); -#endif + printk(KERN_WARNING "%s: hub_dmamap_addr re-uses dmamap.\n", vertex_to_name(vhdl, name, MAXDEVNAME)); } } else { dmamap->hdma_flags |= HUB_DMAMAP_USED; @@ -494,12 +489,9 @@ 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; -#if defined(SUPPORT_PRINTING_V_FORMAT) - printk(KERN_WARNING "%v: hub_dmamap_list re-uses dmamap\n",vhdl); -#else - printk(KERN_WARNING "%p: hub_dmamap_list re-uses dmamap\n", (void *)vhdl); -#endif + 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; @@ -523,12 +515,9 @@ } else { /* If the map is FIXED, re-done is OK. */ if (!(hub_dmamap->hdma_flags & HUB_DMAMAP_IS_FIXED)) { + char name[MAXDEVNAME]; vhdl = hub_dmamap->hdma_xtalk_info.xd_dev; -#if defined(SUPPORT_PRINTING_V_FORMAT) - printk(KERN_WARNING "%v: hub_dmamap_done already done with dmamap\n",vhdl); -#else - printk(KERN_WARNING "%p: hub_dmamap_done already done with dmamap\n", (void *)vhdl); -#endif + printk(KERN_WARNING "%s: hub_dmamap_done already done with dmamap\n", vertex_to_name(vhdl, name, MAXDEVNAME)); } } } @@ -589,6 +578,18 @@ } +int +hub_dma_enabled(vertex_hdl_t xconn_vhdl) +{ + return(0); +} + +int +hub_error_devenable(vertex_hdl_t xconn_vhdl, int devnum, int error_code) +{ + return(0); +} + /* CONFIGURATION MANAGEMENT */ @@ -807,3 +808,80 @@ (xtalk_provider_shutdown_f *) hub_provider_shutdown, }; +/* + * per_ice_init + * + * This code is executed once for each Ice chip. + */ +void +per_ice_init(cnodeid_t cnode) +{ + + /* Initialize error interrupts for this ice. */ + printk("per_ice_init: We need to init ice here ....!\n"); + /* ice_error_init(cnode); */ + +} +/* + * per_hub_init + * + * This code is executed once for each Hub chip. + */ +void +per_hub_init(cnodeid_t cnode) +{ + nasid_t nasid; + nodepda_t *npdap; + ii_icmr_u_t ii_icmr; + ii_ibcr_u_t ii_ibcr; + ii_ilcsr_u_t ii_ilcsr; + + nasid = COMPACT_TO_NASID_NODEID(cnode); + + ASSERT(nasid != INVALID_NASID); + ASSERT(NASID_TO_COMPACT_NODEID(nasid) == cnode); + + npdap = NODEPDA(cnode); + + /* Disable the request and reply errors. */ + REMOTE_HUB_S(nasid, IIO_IWEIM, 0xC000); + + /* + * Set the total number of CRBs that can be used. + */ + ii_icmr.ii_icmr_regval= 0x0; + ii_icmr.ii_icmr_fld_s.i_c_cnt = 0xf; + if (enable_shub_wars_1_1() ) { + // Set bit one of ICMR to prevent II from sending interrupt for II bug. + ii_icmr.ii_icmr_regval |= 0x1; + } + REMOTE_HUB_S(nasid, IIO_ICMR, ii_icmr.ii_icmr_regval); + + /* + * Set the number of CRBs that both of the BTEs combined + * can use minus 1. + */ + ii_ibcr.ii_ibcr_regval= 0x0; + ii_ilcsr.ii_ilcsr_regval = REMOTE_HUB_L(nasid, IIO_LLP_CSR); + if (ii_ilcsr.ii_ilcsr_fld_s.i_llp_stat & LNK_STAT_WORKING) { + ii_ibcr.ii_ibcr_fld_s.i_count = 0x8; + } else { + /* + * if the LLP is down, there is no attached I/O, so + * give BTE all the CRBs. + */ + ii_ibcr.ii_ibcr_fld_s.i_count = 0x14; + } + REMOTE_HUB_S(nasid, IIO_IBCR, ii_ibcr.ii_ibcr_regval); + + /* + * Set CRB timeout to be 10ms. + */ + REMOTE_HUB_S(nasid, IIO_ICTP, 0xffffff ); + REMOTE_HUB_S(nasid, IIO_ICTO, 0xff); + + /* Initialize error interrupts for this hub. */ + hub_error_init(cnode); +} + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/machvec/iomv.c linux-2.4.23-pre8/arch/ia64/sn/io/machvec/iomv.c --- linux-2.4.22/arch/ia64/sn/io/machvec/iomv.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/machvec/iomv.c 2003-10-22 22:48:54.000000000 +0000 @@ -32,7 +32,6 @@ return( (void *) (port | __IA64_UNCACHED_OFFSET)); } else { /* but the simulator uses them... */ - unsigned long io_base; unsigned long addr; /* @@ -40,13 +39,9 @@ * for accessing registers in bedrock local block * (so we don't do port&0xfff) */ - if ((port >= 0x1f0 && port <= 0x1f7) || - port == 0x3f6 || port == 0x3f7) { - io_base = (0xc000000fcc000000 | ((unsigned long)get_nasid() << 38)); - addr = io_base | ((port >> 2) << 12) | (port & 0xfff); - } else { - addr = __ia64_get_io_port_base() | ((port >> 2) << 2); - } + addr = 0xc0000087cc000000 | ((port >> 2) << 12); + if ((port >= 0x1f0 && port <= 0x1f7) || port == 0x3f6 || port == 0x3f7) + addr |= port; return(void *) addr; } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/machvec/pci.c linux-2.4.23-pre8/arch/ia64/sn/io/machvec/pci.c --- linux-2.4.22/arch/ia64/sn/io/machvec/pci.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/machvec/pci.c 2003-10-22 22:48:17.000000000 +0000 @@ -130,13 +130,6 @@ if ( dev == (struct pci_dev *)0 ) { return PCIBIOS_DEVICE_NOT_FOUND; } - /* - * if it's an IOC3 then we bail out, we special - * case them with pci_fixup_ioc3 - */ - if (dev->vendor == PCI_VENDOR_ID_SGI && - dev->device == PCI_DEVICE_ID_SGI_IOC3 ) - return PCIBIOS_SUCCESSFUL; device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn); if (!device_vertex) { @@ -163,13 +156,6 @@ if ( dev == (struct pci_dev *)0 ) { return PCIBIOS_DEVICE_NOT_FOUND; } - /* - * if it's an IOC3 then we bail out, we special - * case them with pci_fixup_ioc3 - */ - if (dev->vendor == PCI_VENDOR_ID_SGI && - dev->device == PCI_DEVICE_ID_SGI_IOC3) - return PCIBIOS_SUCCESSFUL; device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn); if (!device_vertex) { @@ -196,13 +182,6 @@ if ( dev == (struct pci_dev *)0 ) { return PCIBIOS_DEVICE_NOT_FOUND; } - /* - * if it's an IOC3 then we bail out, we special - * case them with pci_fixup_ioc3 - */ - if (dev->vendor == PCI_VENDOR_ID_SGI && - dev->device == PCI_DEVICE_ID_SGI_IOC3) - return PCIBIOS_SUCCESSFUL; device_vertex = devfn_to_vertex(dev->bus->number, dev->devfn); if (!device_vertex) { @@ -241,49 +220,8 @@ /* sn_io_infrastructure_init(); */ pci_root_ops = &snia64_pci_ops; } - -void -pci_fixup_ioc3(struct pci_dev *d) -{ - int i; - unsigned int size; - - /* IOC3 only decodes 0x20 bytes of the config space, reading - * beyond that is relatively benign but writing beyond that - * (especially the base address registers) will shut down the - * pci bus...so avoid doing so. - * NOTE: this means we can't program the intr_pin into the device, - * currently we hack this with special code in - * sgi_pci_intr_support() - */ - DBG("pci_fixup_ioc3: Fixing base addresses for ioc3 device %s\n", d->slot_name); - - /* I happen to know from the spec that the ioc3 needs only 0xfffff - * The standard pci trick of writing ~0 to the baddr and seeing - * what comes back doesn't work with the ioc3 - */ - size = 0xfffff; - d->resource[0].end = (unsigned long) d->resource[0].start + (unsigned long) size; - - /* - * Zero out the resource structure .. because we did not go through - * the normal PCI Infrastructure Init, garbbage are left in these - * fileds. - */ - for (i = 1; i <= PCI_ROM_RESOURCE; i++) { - d->resource[i].start = 0UL; - d->resource[i].end = 0UL; - d->resource[i].flags = 0UL; - } - - d->subsystem_vendor = 0; - d->subsystem_device = 0; - -} - #else void sn_pci_find_bios(void) {} -void pci_fixup_ioc3(struct pci_dev *d) {} struct list_head pci_root_buses; struct list_head pci_root_buses; struct list_head pci_devices; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/machvec/pci_bus_cvlink.c linux-2.4.23-pre8/arch/ia64/sn/io/machvec/pci_bus_cvlink.c --- linux-2.4.22/arch/ia64/sn/io/machvec/pci_bus_cvlink.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/machvec/pci_bus_cvlink.c 2003-10-22 22:49:16.000000000 +0000 @@ -47,14 +47,13 @@ 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(vertex_hdl_t xtalk, int brick_type, char * 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); - /* * For the given device, initialize whether it is a PIC device. */ @@ -148,8 +147,7 @@ */ if (func == 0) { sprintf(name, "%d", slot); - if (hwgraph_traverse(pci_bus, name, &device_vertex) == - GRAPH_SUCCESS) { + if (hwgraph_traverse(pci_bus, name, &device_vertex) == GRAPH_SUCCESS) { if (device_vertex) { return(device_vertex); } @@ -170,54 +168,6 @@ return(device_vertex); } -/* - * For the given device, initialize the addresses for both the Device(x) Flush - * Write Buffer register and the Xbow Flush Register for the port the PCI bus - * is connected. - */ -static void -set_flush_addresses(struct pci_dev *device_dev, - struct sn_device_sysdata *device_sysdata) -{ - pciio_info_t pciio_info = pciio_info_get(device_sysdata->vhdl); - pciio_slot_t pciio_slot = pciio_info_slot_get(pciio_info); - pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info); - bridge_t *bridge = pcibr_soft->bs_base; - nasid_t nasid; - - /* - * Get the nasid from the bridge. - */ - nasid = NASID_GET(device_sysdata->dma_buf_sync); - if (IS_PIC_DEVICE(device_dev)) { - device_sysdata->dma_buf_sync = (volatile unsigned int *) - &bridge->b_wr_req_buf[pciio_slot].reg; - device_sysdata->xbow_buf_sync = (volatile unsigned int *) - XBOW_PRIO_LINKREGS_PTR(NODE_SWIN_BASE(nasid, 0), - pcibr_soft->bs_xid); - } else { - /* - * Accessing Xbridge and Xbow register when SHUB swapoper is on!. - */ - device_sysdata->dma_buf_sync = (volatile unsigned int *) - ((uint64_t)&(bridge->b_wr_req_buf[pciio_slot].reg)^4); - device_sysdata->xbow_buf_sync = (volatile unsigned int *) - ((uint64_t)(XBOW_PRIO_LINKREGS_PTR( - NODE_SWIN_BASE(nasid, 0), pcibr_soft->bs_xid)) ^ 4); - } - -#ifdef DEBUG - printk("set_flush_addresses: dma_buf_sync %p xbow_buf_sync %p\n", - device_sysdata->dma_buf_sync, device_sysdata->xbow_buf_sync); - -printk("set_flush_addresses: dma_buf_sync\n"); - while((volatile unsigned int )*device_sysdata->dma_buf_sync); -printk("set_flush_addresses: xbow_buf_sync\n"); - while((volatile unsigned int )*device_sysdata->xbow_buf_sync); -#endif - -} - struct sn_flush_nasid_entry flush_nasid_list[MAX_NASIDS]; // Initialize the data structures for flushing write buffers after a PIO read. @@ -247,6 +197,9 @@ 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) + BUG(); /* Cannot afford to run out of memory. */ + memset(flush_nasid_list[nasid].widget_p, 0, (HUB_WIDGET_ID_MAX+1) * sizeof(struct sn_flush_device_list *)); } if (bwin > 0) { @@ -326,6 +279,9 @@ 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) + BUG(); /* Cannot afford to run out of memory. */ + memset(flush_nasid_list[nasid].widget_p[wid_num], 0, DEV_PER_WIDGET * sizeof (struct sn_flush_device_list)); p = &flush_nasid_list[nasid].widget_p[wid_num][0]; @@ -430,13 +386,6 @@ } } - if (vendor == PCI_VENDOR_ID_SGI) { - if (device == PCI_DEVICE_ID_SGI_IOC3) { - SET_PCIA64(dev); - return; - } - } - } /* @@ -455,7 +404,7 @@ struct sn_widget_sysdata *widget_sysdata; struct sn_device_sysdata *device_sysdata; pciio_intr_t intr_handle; - int cpuid, bit; + int cpuid; vertex_hdl_t device_vertex; pciio_intr_line_t lines; extern void sn_pci_find_bios(void); @@ -488,6 +437,9 @@ pci_bus = pci_bus_b(ln); widget_sysdata = kmalloc(sizeof(struct sn_widget_sysdata), GFP_KERNEL); + if (widget_sysdata <= 0) + BUG(); /* Cannot afford to run out of memory */ + widget_sysdata->vhdl = pci_bus_to_vertex(pci_bus->number); pci_bus->sysdata = (void *)widget_sysdata; } @@ -516,24 +468,15 @@ unsigned long size; extern int bit_pos_to_irq(int); - if (device_dev->vendor == PCI_VENDOR_ID_SGI && - device_dev->device == PCI_DEVICE_ID_SGI_IOC3) { - extern void pci_fixup_ioc3(struct pci_dev *d); - pci_fixup_ioc3(device_dev); - } - /* Set the device vertex */ device_sysdata = kmalloc(sizeof(struct sn_device_sysdata), GFP_KERNEL); + if (device_sysdata <= 0) + BUG(); /* Cannot afford to run out of memory */ + device_sysdata->vhdl = devfn_to_vertex(device_dev->bus->number, device_dev->devfn); device_sysdata->isa64 = 0; - /* - * Set the xbridge Device(X) Write Buffer Flush and Xbow Flush - * register addresses. - */ - (void) set_flush_addresses(device_dev, device_sysdata); - device_dev->sysdata = (void *) device_sysdata; set_sn_pci64(device_dev); set_isPIC(device_sysdata); @@ -552,7 +495,7 @@ size = device_dev->resource[idx].end - device_dev->resource[idx].start; if (size) { - device_dev->resource[idx].start = (unsigned long)pciio_pio_addr(vhdl, 0, PCIIO_SPACE_WIN(idx), 0, size, 0, (IS_PIC_DEVICE(device_dev)) ? 0 : PCIIO_BYTE_STREAM); + device_dev->resource[idx].start = (unsigned long)pciio_pio_addr(vhdl, 0, PCIIO_SPACE_WIN(idx), 0, size, 0, 0); device_dev->resource[idx].start |= __IA64_UNCACHED_OFFSET; } else @@ -583,7 +526,7 @@ if (size) { device_dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) pciio_pio_addr(vhdl, 0, PCIIO_SPACE_ROM, 0, - size, 0, (IS_PIC_DEVICE(device_dev)) ? 0 : PCIIO_BYTE_STREAM); + size, 0, 0); device_dev->resource[PCI_ROM_RESOURCE].start |= __IA64_UNCACHED_OFFSET; device_dev->resource[PCI_ROM_RESOURCE].end = device_dev->resource[PCI_ROM_RESOURCE].start + size; @@ -598,11 +541,6 @@ pci_write_config_word(device_dev, PCI_COMMAND, cmd); pci_read_config_byte(device_dev, PCI_INTERRUPT_PIN, (unsigned char *)&lines); - if (device_dev->vendor == PCI_VENDOR_ID_SGI && - device_dev->device == PCI_DEVICE_ID_SGI_IOC3 ) { - lines = 1; - } - device_sysdata = (struct sn_device_sysdata *)device_dev->sysdata; device_vertex = device_sysdata->vhdl; @@ -703,13 +641,11 @@ * */ static int -pci_bus_map_create(vertex_hdl_t xtalk, char * io_moduleid) +pci_bus_map_create(vertex_hdl_t xtalk, int brick_type, char * io_moduleid) { - 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; @@ -720,73 +656,6 @@ int bus_number; /* - * Loop throught this vertex and get the Xwidgets .. - */ - - - /* 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 sn_dma_maps_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 sn_dma_maps_s) * MAX_ATE_MAPS); - - } - - /* * PCIX devices * We number busses differently for PCI-X devices. * We start from Lowest Widget on up .. @@ -829,11 +698,11 @@ * * Should not be any race here ... */ - bus_number = basebus_num + bus + io_brick_map_widget(MODULE_PXBRICK, widgetnum); + bus_number = basebus_num + bus + io_brick_map_widget(brick_type, widgetnum); #ifdef DEBUG - printk("bus_number %d basebus_num %d bus %d io %d\n", + printk("bus_number %d basebus_num %d bus %d io %d pci_bus 0x%x brick_type %d \n", bus_number, basebus_num, bus, - io_brick_map_widget(MODULE_PXBRICK, widgetnum)); + io_brick_map_widget(brick_type, widgetnum), pci_bus, brick_type); #endif busnum_to_pcibr_vhdl[bus_number] = pci_bus; @@ -842,14 +711,71 @@ */ busnum_to_atedmamaps[bus_number] = (void *) kmalloc( sizeof(struct sn_dma_maps_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); + if (busnum_to_atedmamaps[bus_number] <= 0) + BUG(); /* Cannot afford to run out of memory. */ memset(busnum_to_atedmamaps[bus_number], 0x0, sizeof(struct sn_dma_maps_s) * MAX_ATE_MAPS); } } + /* AGP/CGbrick */ + + 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/slab/0/CGbrick/xtalk/15 is the xwidget + * /hw/module/001c16/slab/0/CGbrick/xtalk/15/agp/0 is the bus + * /hw/module/001c16/slab/0/CGbrick/xtalk/15/agp/0/1a is device + */ + rv = hwgraph_traverse(xtalk, pathname, &xwidget); + if ( (rv != GRAPH_SUCCESS) ) { + if (!xwidget) { + continue; + } + } + + if ( bus == 0 ) + sprintf(pathname, "%d/"EDGE_LBL_AGP_0, widgetnum); + else + sprintf(pathname, "%d/"EDGE_LBL_AGP_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(brick_type, widgetnum); +#ifdef DEBUG + printk("bus_number %d basebus_num %d bus %d io %d pci_bus 0x%x\n", + bus_number, basebus_num, bus, + io_brick_map_widget(brick_type, widgetnum), pci_bus); +#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 sn_dma_maps_s) * MAX_ATE_MAPS, GFP_KERNEL); + if (busnum_to_atedmamaps[bus_number] <= 0) + BUG(); /* Cannot afford to run out of memory */ + + memset(busnum_to_atedmamaps[bus_number], 0x0, + sizeof(struct sn_dma_maps_s) * MAX_ATE_MAPS); + } + } return(0); } @@ -868,11 +794,20 @@ vertex_hdl_t devfs_hdl = NULL; vertex_hdl_t xtalk = NULL; int rv = 0; - char name[256]; - char tmp_name[256]; + char *name; + char *tmp_name; int i, ii, j; char *brick_name; extern void ioconfig_bus_new_entries(void); + extern int iobrick_type_get_nasid(nasid_t); + + name = kmalloc(256, GFP_KERNEL); + if (!name) + BUG(); + + tmp_name = kmalloc(256, GFP_KERNEL); + if (!name) + BUG(); /* * Figure out which IO Brick is connected to the Compute Bricks. @@ -881,32 +816,39 @@ 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++ ) { + for ( n = 0; n <= MAX_SLABS; n++ ) { + if (modules[i]->nodes[n] == -1) + continue; /* node is not alive in module */ + 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); + modules[i]->io[n].iobrick_type = (uint64_t)iobrick_type_get_nasid(nasid); } } } devfs_hdl = hwgraph_path_to_vertex("hw/module"); for (i = 0; i < nummodules ; i++) { - for ( j = 0; j < 3; j++ ) { + for ( j = 0; j < 4; j++ ) { if ( j == 0 ) - brick_name = EDGE_LBL_PBRICK; + brick_name = EDGE_LBL_IXBRICK; else if ( j == 1 ) brick_name = EDGE_LBL_PXBRICK; - else - brick_name = EDGE_LBL_IXBRICK; + else if ( j == 2 ) + brick_name = EDGE_LBL_OPUSBRICK; + else /* 3 */ + brick_name = EDGE_LBL_CGBRICK; + + for ( ii = 0; ii <= MAX_SLABS ; ii++ ) { + if (modules[i]->nodes[ii] == -1) + continue; /* Missing slab */ - 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); @@ -915,11 +857,14 @@ xtalk = NULL; rv = hwgraph_edge_get(devfs_hdl, name, &xtalk); if ( rv == 0 ) - pci_bus_map_create(xtalk, (char *)&(modules[i]->io[ii].moduleid)); + pci_bus_map_create(xtalk, (int)modules[i]->io[ii].iobrick_type, (char *)&(modules[i]->io[ii].moduleid)); } } } + kfree(name); + kfree(tmp_name); + /* * Create the Linux PCI bus number vertex link. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/machvec/pci_dma.c linux-2.4.23-pre8/arch/ia64/sn/io/machvec/pci_dma.c --- linux-2.4.22/arch/ia64/sn/io/machvec/pci_dma.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/machvec/pci_dma.c 2003-10-22 22:48:20.000000000 +0000 @@ -182,7 +182,6 @@ * attributes or to a different memory region. */ *dma_handle = pciio_dmatrans_addr(vhdl, NULL, phys_addr, size, - ((IS_PIC_DEVICE(hwdev)) ? 0 : PCIIO_BYTE_STREAM) | PCIIO_DMA_CMD); /* @@ -201,7 +200,6 @@ */ if (!(*dma_handle)) { dma_map = pciio_dmamap_alloc(vhdl, NULL, size, - ((IS_PIC_DEVICE(hwdev)) ? 0 : PCIIO_BYTE_STREAM) | PCIIO_DMA_CMD); if (!dma_map) { printk(KERN_ERR "sn_pci_alloc_consistent: Unable to " @@ -295,10 +293,7 @@ */ if (IS_PCIA64(hwdev)) { sg->dma_address = pciio_dmatrans_addr(vhdl, NULL, phys_addr, - sg->length, - ((IS_PIC_DEVICE(hwdev)) ? 0 : PCIIO_BYTE_STREAM) | - PCIIO_DMA_DATA | - PCIIO_DMA_A64); + sg->length, PCIIO_DMA_DATA | PCIIO_DMA_A64); sg->dma_length = sg->length; continue; } @@ -308,9 +303,7 @@ */ if (IS_PCI32G(hwdev)) { sg->dma_address = pciio_dmatrans_addr(vhdl, NULL, phys_addr, - sg->length, - ((IS_PIC_DEVICE(hwdev)) ? 0 : PCIIO_BYTE_STREAM) | - PCIIO_DMA_DATA); + sg->length, PCIIO_DMA_DATA); sg->dma_length = sg->length; /* * See if we got a direct map entry @@ -325,9 +318,7 @@ * It is a 32 bit card and we cannot do direct mapping, * so we use an ATE. */ - dma_map = pciio_dmamap_alloc(vhdl, NULL, sg->length, - ((IS_PIC_DEVICE(hwdev)) ? 0 : PCIIO_BYTE_STREAM) | - PCIIO_DMA_DATA); + dma_map = pciio_dmamap_alloc(vhdl, NULL, sg->length, PCIIO_DMA_DATA); if (!dma_map) { printk(KERN_ERR "sn_pci_map_sg: Unable to allocate " "anymore 32 bit page map entries.\n"); @@ -440,9 +431,7 @@ if (IS_PCIA64(hwdev)) { /* This device supports 64 bit DMA addresses. */ dma_addr = pciio_dmatrans_addr(vhdl, NULL, phys_addr, size, - ((IS_PIC_DEVICE(hwdev)) ? 0 : PCIIO_BYTE_STREAM) | - PCIIO_DMA_DATA | - PCIIO_DMA_A64); + PCIIO_DMA_DATA | PCIIO_DMA_A64); return dma_addr; } @@ -454,7 +443,6 @@ */ if (IS_PCI32G(hwdev)) { dma_addr = pciio_dmatrans_addr(vhdl, NULL, phys_addr, size, - ((IS_PIC_DEVICE(hwdev)) ? 0 : PCIIO_BYTE_STREAM) | PCIIO_DMA_DATA); if (dma_addr) return dma_addr; @@ -465,9 +453,7 @@ * let's use the PMU instead. */ dma_map = NULL; - dma_map = pciio_dmamap_alloc(vhdl, NULL, size, - ((IS_PIC_DEVICE(hwdev)) ? 0 : PCIIO_BYTE_STREAM) | - PCIIO_DMA_DATA); + dma_map = pciio_dmamap_alloc(vhdl, NULL, size, PCIIO_DMA_DATA); if (!dma_map) { printk(KERN_ERR "pci_map_single: Unable to allocate anymore " diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/platform_init/Makefile linux-2.4.23-pre8/arch/ia64/sn/io/platform_init/Makefile --- linux-2.4.22/arch/ia64/sn/io/platform_init/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/platform_init/Makefile 2003-10-22 22:49:48.000000000 +0000 @@ -11,6 +11,6 @@ O_TARGET := snio.o -obj-y += sgi_io_init.o irix_io_init.o +obj-y += irix_io_init.o include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/platform_init/irix_io_init.c linux-2.4.23-pre8/arch/ia64/sn/io/platform_init/irix_io_init.c --- linux-2.4.22/arch/ia64/sn/io/platform_init/irix_io_init.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/platform_init/irix_io_init.c 2003-10-22 22:49:55.000000000 +0000 @@ -23,17 +23,55 @@ extern void klhwg_add_all_modules(vertex_hdl_t); extern void klhwg_add_all_nodes(vertex_hdl_t); +extern int init_hcl(void); extern vertex_hdl_t hwgraph_root; extern void io_module_init(void); extern int pci_bus_to_hcl_cvlink(void); -extern void mlreset(void); -/* #define DEBUG_IO_INIT 1 */ -#ifdef DEBUG_IO_INIT -#define DBG(x...) printk(x) -#else -#define DBG(x...) -#endif /* DEBUG_IO_INIT */ +char arg_maxnodes[4]; +char master_baseio_wid; +nasid_t master_baseio_nasid; +nasid_t master_nasid = INVALID_NASID; /* This is the partition master nasid */ +nasid_t console_nasid = (nasid_t)-1; + +/* + * Return non-zero if the given variable was specified + */ +int +is_specified(char *s) +{ + return (strlen(s) != 0); +} + +int +check_nasid_equiv(nasid_t nasida, nasid_t nasidb) +{ + if ((nasida == nasidb) || (nasida == NODEPDA(NASID_TO_COMPACT_NODEID(nasidb))->xbow_peer)) + return 1; + else + return 0; +} + +int +is_master_baseio_nasid_widget(nasid_t test_nasid, xwidgetnum_t test_wid) +{ + + /* + * If the widget numbers are different, we're not the master. + */ + if (test_wid != (xwidgetnum_t)master_baseio_wid) { + return 0; + } + + /* + * If the NASIDs are the same or equivalent, we're the master. + */ + if (check_nasid_equiv(test_nasid, master_baseio_nasid)) { + return 1; + } else { + return 0; + } +} /* * This routine is responsible for the setup of all the IRIX hwgraph style @@ -46,14 +84,11 @@ */ void -irix_io_init(void) +sgi_master_io_infr_init(void) { cnodeid_t cnode; - /* - * This is the Master CPU. Emulate mlsetup and main.c in Irix. - */ - mlreset(); + init_hcl(); /* Sets up the hwgraph compatibility layer */ /* * Initialize platform-dependent vertices in the hwgraph: @@ -78,6 +113,12 @@ /* We can do headless hub cnodes here .. */ + /* Initialize ICE for TIO Nodes. */ + for (cnode = numnodes; cnode < numionodes; cnode++) { + extern void per_ice_init(cnodeid_t); + per_ice_init(cnode); + } + /* * * Our IO Infrastructure drivers are in place .. @@ -86,4 +127,12 @@ */ init_all_devices(); pci_bus_to_hcl_cvlink(); + +#ifdef CONFIG_KDB + { + extern void kdba_io_init(void); + kdba_io_init(); + } +#endif + } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sgi_if.c linux-2.4.23-pre8/arch/ia64/sn/io/sgi_if.c --- linux-2.4.22/arch/ia64/sn/io/sgi_if.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sgi_if.c 2003-10-22 22:48:55.000000000 +0000 @@ -21,11 +21,11 @@ #include void * -snia_kmem_zalloc(size_t size, int flag) +snia_kmem_zalloc(size_t size) { void *ptr = kmalloc(size, GFP_KERNEL); if ( ptr ) - BZERO(ptr, size); + memset(ptr, 0, size); return(ptr); } @@ -39,21 +39,12 @@ * the alloc/free_node routines do a simple kmalloc for now .. */ void * -snia_kmem_alloc_node(register size_t size, register int flags, cnodeid_t node) +snia_kmem_alloc_node(register size_t size, cnodeid_t node) { /* someday will Allocate on node 'node' */ return(kmalloc(size, GFP_KERNEL)); } -void * -snia_kmem_zalloc_node(register size_t size, register int flags, cnodeid_t node) -{ - void *ptr = kmalloc(size, GFP_KERNEL); - if ( ptr ) - BZERO(ptr, size); - return(ptr); -} - /* * print_register() allows formatted printing of bit fields. individual diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/Makefile linux-2.4.23-pre8/arch/ia64/sn/io/sn2/Makefile --- linux-2.4.22/arch/ia64/sn/io/sn2/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/Makefile 2003-10-22 22:49:18.000000000 +0000 @@ -11,15 +11,14 @@ O_TARGET := snio.o -export-objs := pciio.o - obj-y += ml_SN_intr.o shub_intr.o shuberror.o shub.o \ bte_error.o pcibr/pcibr.o pic.o geo_op.o \ l1_command.o klconflib.o klgraph.o \ ml_SN_init.o ml_iograph.o module.o pciio.o \ - xbow.o xtalk.o shubio.o + xbow.o xtalk.o shubio.o ioc4/ioc4_if.o + obj-$(CONFIG_KDB) += kdba_io.o -subdir-y += pcibr +subdir-y += pcibr ioc4 include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/ioc4/Makefile linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ioc4/Makefile --- linux-2.4.22/arch/ia64/sn/io/sn2/ioc4/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ioc4/Makefile 2003-10-22 22:49:08.000000000 +0000 @@ -0,0 +1,22 @@ +# +# 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. +# +# Copyright (C) 2003 Silicon Graphics, Inc. All Rights Reserved. +# +# Makefile for the sn2 io ioc4 routines. + +EXTRA_CFLAGS := -DLITTLE_ENDIAN + +ifdef CONFIG_IA64_SGI_SN2 +EXTRA_CFLAGS += -DSHUB_SWAP_WAR +endif + +O_TARGET := ioc4_if.o +export-objs := ioc4.o sio_ioc4.o + + +obj-$(CONFIG_IA64_SGI_SN2) += sio_ioc4.o ioc4.o + +include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/ioc4/ioc4.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ioc4/ioc4.c --- linux-2.4.22/arch/ia64/sn/io/sn2/ioc4/ioc4.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ioc4/ioc4.c 2003-10-22 22:49:44.000000000 +0000 @@ -0,0 +1,641 @@ +/* + * 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. + * + * Copyright (C) 2003 Silicon Graphics, Inc. All Rights Reserved. + */ + + +/* This is the top level IOC4 device driver. It does very little, farming + * out actual tasks to the various slave IOC4 drivers (serial, keyboard/mouse, + * and real-time interrupt). + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* #define DEBUG_INTERRUPTS */ +#define SUPPORT_ATOMICS + +#ifdef SUPPORT_ATOMICS + +/* + * support routines for local atomic operations. + */ + +static spinlock_t local_lock; + +static inline unsigned int +atomicSetInt(atomic_t *a, unsigned int b) +{ + unsigned long s; + unsigned int ret, new; + + spin_lock_irqsave(&local_lock, s); + new = ret = atomic_read(a); + new |= b; + atomic_set(a, new); + spin_unlock_irqrestore(&local_lock, s); + + return ret; +} + +static unsigned int +atomicClearInt(atomic_t *a, unsigned int b) +{ + unsigned long s; + unsigned int ret, new; + + spin_lock_irqsave(&local_lock, s); + new = ret = atomic_read(a); + new &= ~b; + atomic_set(a, new); + spin_unlock_irqrestore(&local_lock, s); + + return ret; +} + +#else + +#define atomicAddInt(a,b) *(a) += ((unsigned int)(b)) + +static inline unsigned int +atomicSetInt(unsigned int *a, unsigned int b) +{ + unsigned int ret = *a; + + *a |= b; + return ret; +} + +#define atomicSetUint64(a,b) *(a) |= ((unsigned long long )(b)) + +static inline unsigned int +atomicClearInt(unsigned int *a, unsigned int b) +{ + unsigned int ret = *a; + + *a &= ~b; + return ret; +} + +#define atomicClearUint64(a,b) *(a) &= ~((unsigned long long)(b)) +#endif /* SUPPORT_ATOMICS */ + + +/* pci device struct */ +static const struct pci_device_id __devinitdata ioc4_s_id_table[] = +{ + { IOC4_VENDOR_ID_NUM, IOC4_DEVICE_ID_NUM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0 } +}; + +int __devinit ioc4_attach(struct pci_dev *, const struct pci_device_id *); + +struct pci_driver ioc4_s_driver = +{ + name : "IOC4 Serial", + id_table: ioc4_s_id_table, + probe: ioc4_attach, +}; + +int __init +ioc4_serial_detect(void) +{ + int rc; + + rc = pci_register_driver(&ioc4_s_driver); + return 0; +} +module_init(ioc4_serial_detect); + + +/* + * Some external functions we still need. + */ +extern int ioc4_serial_attach(vertex_hdl_t conn, void *mem); +extern cpuid_t cpuvertex_to_cpuid(vertex_hdl_t vhdl); + + +/* + * per-IOC4 data structure + */ +typedef struct ioc4_soft_s { + vertex_hdl_t is_ioc4_vhdl; + vertex_hdl_t is_conn_vhdl; + + struct pci_dev *is_pci_dev; + ioc4_mem_t *is_ioc4_mem; + + /* Each interrupt type has an entry in the array */ + struct ioc4_intr_type { + + /* + * Each in-use entry in this array contains at least + * one nonzero bit in sd_bits; no two entries in this + * array have overlapping sd_bits values. + */ +#define MAX_IOC4_INTR_ENTS (8 * sizeof(ioc4reg_t)) + struct ioc4_intr_info { + ioc4reg_t sd_bits; + ioc4_intr_func_f *sd_intr; + intr_arg_t sd_info; + vertex_hdl_t sd_vhdl; + struct ioc4_soft_s *sd_soft; + } is_intr_info[MAX_IOC4_INTR_ENTS]; + + /* Number of entries active in the above array */ + atomic_t is_num_intrs; + atomic_t is_intr_bits_busy; /* Bits assigned */ + atomic_t is_intr_ents_free; /* Free active entries mask*/ + } is_intr_type[ioc4_num_intr_types]; + + /* is_ir_lock must be held while + * modifying sio_ie values, so + * we can be sure that sio_ie is + * not changing when we read it + * along with sio_ir. + */ + spinlock_t is_ir_lock; /* SIO_IE[SC] mod lock */ +} ioc4_soft_t; + +#define ioc4_soft_set(v,i) hwgraph_fastinfo_set((v), (arbitrary_info_t)(i)) +#define ioc4_soft_get(v) ((ioc4_soft_t *)hwgraph_fastinfo_get(v)) + + +/* ===================================================================== + * Function Table of Contents + */ + + +/* The IOC4 hardware provides no atomic way to determine if interrupts + * are pending since two reads are required to do so. The handler must + * read the SIO_IR and the SIO_IES, and take the logical and of the + * two. When this value is zero, all interrupts have been serviced and + * the handler may return. + * + * This has the unfortunate "hole" that, if some other CPU or + * some other thread or some higher level interrupt manages to + * modify SIO_IE between our reads of SIO_IR and SIO_IE, we may + * think we have observed SIO_IR&SIO_IE==0 when in fact this + * condition never really occurred. + * + * To solve this, we use a simple spinlock that must be held + * whenever modifying SIO_IE; holding this lock while observing + * both SIO_IR and SIO_IE guarantees that we do not falsely + * conclude that no enabled interrupts are pending. + */ + +void +ioc4_write_ireg(void *ioc4_soft, ioc4reg_t val, int which, ioc4_intr_type_t type) +{ + ioc4_mem_t *mem = ((ioc4_soft_t *) ioc4_soft)->is_ioc4_mem; + spinlock_t *lp = &((ioc4_soft_t *) ioc4_soft)->is_ir_lock; + unsigned long s; + + + spin_lock_irqsave(lp, s); + + switch (type) { + case ioc4_sio_intr_type: + switch (which) { + case IOC4_W_IES: + mem->sio_ies_ro = val; + break; + + case IOC4_W_IEC: + mem->sio_iec_ro = val; + break; + } + break; + + case ioc4_other_intr_type: + switch (which) { + case IOC4_W_IES: + mem->other_ies_ro = val; + break; + + case IOC4_W_IEC: + mem->other_iec_ro = val; + break; + } + break; + + case ioc4_num_intr_types: + break; + } + spin_unlock_irqrestore(lp, s); +} + + +static inline ioc4reg_t +ioc4_pending_intrs(ioc4_soft_t * ioc4_soft, ioc4_intr_type_t type) +{ + ioc4_mem_t *mem = ioc4_soft->is_ioc4_mem; + spinlock_t *lp = &ioc4_soft->is_ir_lock; + unsigned long s; + ioc4reg_t intrs = (ioc4reg_t)0; + + ASSERT((type == ioc4_sio_intr_type) || (type == ioc4_other_intr_type)); + + spin_lock_irqsave(lp, s); + + switch (type) { + case ioc4_sio_intr_type: + intrs = mem->sio_ir & mem->sio_ies_ro; + break; + + case ioc4_other_intr_type: + intrs = mem->other_ir & mem->other_ies_ro; + + /* Don't process any ATA interrupte, leave them for the ATA driver */ + intrs &= ~(IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR); + break; + + case ioc4_num_intr_types: + break; + } + + spin_unlock_irqrestore(lp, s); + return intrs; +} + + +int __devinit +ioc4_attach(struct pci_dev *pci_handle, const struct pci_device_id *pci_id) +{ + ioc4_mem_t *mem; +/*REFERENCED*/ + graph_error_t rc; + vertex_hdl_t ioc4_vhdl; + ioc4_soft_t *soft; + vertex_hdl_t conn_vhdl = PCIDEV_VERTEX(pci_handle); + int tmp; + extern void ioc4_ss_connect_interrupt(int, void *, void *); + extern void ioc4_intr(int, void *, struct pt_regs *); + + if ( pci_enable_device(pci_handle) ) { + printk("ioc4_attach: Failed to enable device with pci_dev 0x%p... returning\n", (void *)pci_handle); + return(-1); + } + + pci_set_master(pci_handle); + snia_pciio_endian_set(pci_handle, PCIDMA_ENDIAN_LITTLE, PCIDMA_ENDIAN_BIG); + + /* + * Get PIO mappings through our "primary" + * connection point to the IOC4's CFG and + * MEM spaces. + */ + + /* + * Map in the ioc4 memory - we'll do config accesses thru the pci_????() interfaces. + */ + + mem = (ioc4_mem_t *)pci_resource_start(pci_handle, 0); + if ( !mem ) { + printk(KERN_ALERT "%p/" EDGE_LBL_IOC4 + ": unable to get PIO mapping for my MEM space\n", (void *)pci_handle); + return -1; + } + + if ( !request_region((unsigned long)mem, sizeof(*mem), "sioc4_mem")) { + printk(KERN_ALERT + "%p/" EDGE_LBL_IOC4 + ": unable to get request region for my MEM space\n", + (void *)pci_handle); + return -1; + } + + /* + * Create the "ioc4" vertex which hangs off of + * the connect points. + * This code is slightly paranoid. + */ + rc = hwgraph_path_add(conn_vhdl, EDGE_LBL_IOC4, &ioc4_vhdl); + ASSERT(rc == GRAPH_SUCCESS); + + /* + * Allocate the soft structure, fill it in a bit, + * and attach it to the ioc4 vertex. + */ + NEW(soft); + + spin_lock_init(&soft->is_ir_lock); + soft->is_ioc4_vhdl = ioc4_vhdl; + soft->is_conn_vhdl = conn_vhdl; + soft->is_ioc4_mem = mem; + soft->is_pci_dev = pci_handle; + + ioc4_soft_set(ioc4_vhdl, soft); + + /* Init the IOC4 */ + + /* SN boot PROMs allocate the PCI + * space and set up the pci_addr fields. + * Other systems need to set the base address. + * This is handled automatically if the PCI infrastructure + * is used. + * + * No need to set the latency timer since the PCI + * infrastructure sets it to 1 us. + */ + + pci_read_config_dword(pci_handle, IOC4_PCI_SCR, &tmp); + + pci_write_config_dword(pci_handle, IOC4_PCI_SCR, + tmp | PCI_CMD_BUS_MASTER | PCI_CMD_MEM_SPACE | + PCI_CMD_PAR_ERR_RESP | PCI_CMD_SERR_ENABLE); + + PCI_OUTW(&mem->sio_cr, (0xf << IOC4_SIO_CR_CMD_PULSE_SHIFT)); + + /* Enable serial port mode select generic PIO pins as outputs */ + PCI_OUTW(&mem->gpcr_s, IOC4_GPCR_UART0_MODESEL | IOC4_GPCR_UART1_MODESEL); + + /* Clear and disable all interrupts */ + IOC4_WRITE_IEC(soft, ~0, ioc4_sio_intr_type); + PCI_OUTW(&mem->sio_ir, ~0); + + IOC4_WRITE_IEC(soft, ~0, ioc4_other_intr_type); + PCI_OUTW(&mem->other_ir, ~0); + + /* + * Alloc the IOC4 intr before attaching the subdevs, so the + * cpu handling the IOC4 intr is known (for setmustrun on + * the ioc4 ithreads). + */ + + /* attach interrupt handler */ + + ioc4_ss_connect_interrupt(pci_handle->irq, (void *)ioc4_intr, (void *)soft); + + /* ============================================================= + * Attach Sub-devices + * + * NB: As subdevs start calling pciio_driver_register(), + * we can stop explicitly calling subdev drivers. + * + * The drivers attached here have not been converted + * to stand on their own. However, they *do* know + * to call ioc4_subdev_enabled() to decide whether + * to actually attach themselves. + * + * It would be nice if we could convert these + * few remaining drivers over so they would + * register as proper PCI device drivers ... + */ + + ioc4_serial_attach(conn_vhdl, (void *)soft->is_ioc4_mem); /* DMA serial ports */ + + /* Normally we'd return 0 - but we need to get the ide driver init'd too. + * Returning an error will keep the IOC4 on the pci list */ + return -1; +} + + +/* + * ioc4_intr_connect: + * Arrange for interrupts for a sub-device + * to be delivered to the right bit of + * code with the right parameter. + * + * XXX- returning an error instead of panicing + * might be a good idea (think bugs in loadable + * ioc4 sub-devices). + */ + + + +void +ioc4_intr_connect(vertex_hdl_t conn_vhdl, + ioc4_intr_type_t type, + ioc4reg_t intrbits, + ioc4_intr_func_f *intr, + intr_arg_t info, + vertex_hdl_t owner_vhdl, + vertex_hdl_t intr_dev_vhdl) +{ + graph_error_t rc; + vertex_hdl_t ioc4_vhdl; + ioc4_soft_t *soft; + ioc4reg_t old, bits; + int i; + + ASSERT((type == ioc4_sio_intr_type) || (type == ioc4_other_intr_type)); + + rc = hwgraph_traverse(conn_vhdl, EDGE_LBL_IOC4, &ioc4_vhdl); + if (rc != GRAPH_SUCCESS) { + printk(KERN_ALERT "ioc4_intr_connect(%p): ioc4_attach not yet called", (void *)owner_vhdl); + return; + } + + soft = ioc4_soft_get(ioc4_vhdl); + ASSERT(soft != NULL); + + /* + * Try to allocate a slot in the array + * that has been marked free; if there + * are none, extend the high water mark. + */ + while (1) { + bits = atomic_read(&soft->is_intr_type[type].is_intr_ents_free); + if (bits == 0) { + i = atomic_inc(&soft->is_intr_type[type].is_num_intrs) - 1; + ASSERT(i < MAX_IOC4_INTR_ENTS || (printk("i %d\n", i), 0)); + break; + } + bits &= ~(bits - 1); /* keep only the ls bit */ + old = atomicClearInt(&soft->is_intr_type[type].is_intr_ents_free, bits); + if (bits & old) { + ioc4reg_t shf; + + i = 31; + if ((shf = (bits >> 16))) + bits = shf; + else + i -= 16; + if ((shf = (bits >> 8))) + bits = shf; + else + i -= 8; + if ((shf = (bits >> 4))) + bits = shf; + else + i -= 4; + if ((shf = (bits >> 2))) + bits = shf; + else + i -= 2; + if ((shf = (bits >> 1))) + bits = shf; + else + i -= 1; + ASSERT(i < MAX_IOC4_INTR_ENTS || (printk("i %d\n", i), 0)); + break; + } + } + + soft->is_intr_type[type].is_intr_info[i].sd_bits = intrbits; + soft->is_intr_type[type].is_intr_info[i].sd_intr = intr; + soft->is_intr_type[type].is_intr_info[i].sd_info = info; + soft->is_intr_type[type].is_intr_info[i].sd_vhdl = owner_vhdl; + soft->is_intr_type[type].is_intr_info[i].sd_soft = soft; + + /* Make sure there are no bitmask overlaps */ + { + ioc4reg_t old; + + old = atomicSetInt(&soft->is_intr_type[type].is_intr_bits_busy, intrbits); + if (old & intrbits) { + printk("%p: trying to share ioc4 intr bits 0x%X\n", + (void *)owner_vhdl, old & intrbits); + +#if DEBUG && IOC4_DEBUG + { + int x; + + for (x = 0; x < i; x++) + if (intrbits & soft->is_intr_type[type].is_intr_info[x].sd_bits) { + printk("%p: ioc4 intr bits 0x%X already call " + "0x%X(0x%X, ...)\n", + (void *)soft->is_intr_type[type].is_intr_info[x].sd_vhdl, + soft->is_intr_type[type].is_intr_info[i].sd_bits, + soft->is_intr_type[type].is_intr_info[i].sd_intr, + soft->is_intr_type[type].is_intr_info[i].sd_info); + } + } +#endif + panic("ioc4_intr_connect: no IOC4 interrupt source sharing allowed"); + } + } +} + +/* + * ioc4_intr_disconnect: + * Turn off interrupt request service for a + * specific service function and argument. + * Scans the array for connections to the specified + * function with the specified info and owner; turns off + * the bits specified in intrbits. If this results in + * an empty entry, logs it in the free entry map. + */ +void +ioc4_intr_disconnect(vertex_hdl_t conn_vhdl, + ioc4_intr_type_t type, + ioc4reg_t intrbits, + ioc4_intr_func_f *intr, + intr_arg_t info, + vertex_hdl_t owner_vhdl) +{ + graph_error_t rc; + vertex_hdl_t ioc4_vhdl; + ioc4_soft_t *soft; + ioc4reg_t bits; + int i, num_intrs; + + ASSERT((type == ioc4_sio_intr_type) || (type == ioc4_other_intr_type)); + + rc = hwgraph_traverse(conn_vhdl, EDGE_LBL_IOC4, &ioc4_vhdl); + if (rc != GRAPH_SUCCESS) { + printk(KERN_ALERT "%p: ioc4_intr_disconnect: ioc4_attach not yet called", (void *)owner_vhdl); + return; + } + + soft = ioc4_soft_get(ioc4_vhdl); + ASSERT(soft != NULL); + + num_intrs = (int)atomic_read(&soft->is_intr_type[type].is_num_intrs); + for (i = 0; i < num_intrs; ++i) { + if ((soft->is_intr_type[type].is_intr_info[i].sd_intr == intr) && + (soft->is_intr_type[type].is_intr_info[i].sd_info == info) && + (soft->is_intr_type[type].is_intr_info[i].sd_vhdl == owner_vhdl) && + (bits = soft->is_intr_type[type].is_intr_info[i].sd_bits & intrbits)) { + soft->is_intr_type[type].is_intr_info[i].sd_bits &= ~bits; + atomicClearInt(&soft->is_intr_type[type].is_intr_bits_busy, bits); + if (!(soft->is_intr_type[type].is_intr_info[i].sd_bits)) { + soft->is_intr_type[type].is_intr_info[i].sd_intr = NULL; + soft->is_intr_type[type].is_intr_info[i].sd_info = NULL; + soft->is_intr_type[type].is_intr_info[i].sd_vhdl = GRAPH_VERTEX_NONE; + atomicSetInt(&soft->is_intr_type[type].is_intr_ents_free, 1 << i); + } + } + } +} + +/* Top level IOC4 interrupt handler. Farms out the interrupt to + * the various IOC4 device drivers. + */ + +void +ioc4_intr(int irq, void *arg, struct pt_regs *regs) +{ + ioc4_soft_t *soft; + ioc4reg_t this_ir; + ioc4reg_t this_mir; + int x, num_intrs = 0; + ioc4_intr_type_t t; + + soft = (ioc4_soft_t *)arg; + + if (!soft) + return; /* Polled but no console ioc4 registered */ + + for (t = ioc4_first_intr_type; t < ioc4_num_intr_types; t++) { + num_intrs = (int)atomic_read(&soft->is_intr_type[t].is_num_intrs); + + this_mir = this_ir = ioc4_pending_intrs(soft, t); +#ifdef DEBUG_INTERRUPTS + printk("%s : %d : this_mir 0x%x num_intrs %d\n", __FUNCTION__, __LINE__, this_mir, num_intrs); +#endif + + /* Farm out the interrupt to the various drivers depending on + * which interrupt bits are set. + */ + for (x = 0; x < num_intrs; x++) { + struct ioc4_intr_info *ii = &soft->is_intr_type[t].is_intr_info[x]; + if ((this_mir = this_ir & ii->sd_bits)) { + /* Disable owned interrupts, and call the interrupt handler */ + IOC4_WRITE_IEC(soft, ii->sd_bits, t); + ii->sd_intr(ii->sd_info, this_mir); + this_ir &= ~this_mir; + } + } + + if (this_ir) + printk(KERN_ALERT "unknown IOC4 %s interrupt 0x%x, sio_ir = 0x%x, sio_ies = 0x%x, other_ir = 0x%x, other_ies = 0x%x\n", + (t == ioc4_sio_intr_type) ? "sio" : "other", + this_ir, + soft->is_ioc4_mem->sio_ir, + soft->is_ioc4_mem->sio_ies_ro, + soft->is_ioc4_mem->other_ir, + soft->is_ioc4_mem->other_ies_ro); + } +#ifdef DEBUG_INTERRUPTS + { + ioc4_mem_t *mem = soft->is_ioc4_mem; + spinlock_t *lp = &soft->is_ir_lock; + unsigned long s; + + spin_lock_irqsave(lp, s); + printk("%s : %d : sio_ir 0x%x sio_ies_ro 0x%x other_ir 0x%x other_ies_ro 0x%x mask 0x%x\n", + __FUNCTION__, __LINE__, + mem->sio_ir, + mem->sio_ies_ro, + mem->other_ir, + mem->other_ies_ro, + IOC4_OTHER_IR_ATA_INT | IOC4_OTHER_IR_ATA_MEMERR); + + spin_unlock_irqrestore(lp, s); + } +#endif +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/ioc4/sio_ioc4.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ioc4/sio_ioc4.c --- linux-2.4.22/arch/ia64/sn/io/sn2/ioc4/sio_ioc4.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ioc4/sio_ioc4.c 2003-10-22 22:48:39.000000000 +0000 @@ -0,0 +1,2266 @@ +/* + * 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. + * + * Copyright (C) 2003 Silicon Graphics, Inc. All Rights Reserved. + */ + +/* + * This is a lower level module for the modular serial I/O driver. This + * module implements all hardware dependent functions for doing serial + * I/O on the IOC4 serial ports. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* #define IOC4_SIO_DEBUG */ +/* define USE_64BIT_DMA */ + +#define PENDING(port) (PCI_INW(&(port)->ip_ioc4->sio_ir) & port->ip_ienb) + +/* Default to 4k buffers */ +#ifdef IOC4_1K_BUFFERS +#define RING_BUF_SIZE 1024 +#define IOC4_BUF_SIZE_BIT 0 +#define PROD_CONS_MASK IOC4_PROD_CONS_PTR_1K +#else +#define RING_BUF_SIZE 4096 +#define IOC4_BUF_SIZE_BIT IOC4_SBBR_L_SIZE +#define PROD_CONS_MASK IOC4_PROD_CONS_PTR_4K +#endif + +#define TOTAL_RING_BUF_SIZE (RING_BUF_SIZE * 4) + +#if PAGE_SIZE < TOTAL_RING_BUF_SIZE +#include +#endif + + +#ifdef DPRINTF +#define dprintf(x) printk x +#else +#define dprintf(x) +#endif + +#define NEWA(ptr,n) (ptr = snia_kmem_zalloc((n)*sizeof (*(ptr)))) + +#define contig_memalloc(a,b,c) kmem_zalloc(PAGE_SIZE * (a)) +#define sio_port_islocked(a) 0 // FIXME: ????? + +#define KM_PHYSCONTIG 0x0008 +#define VM_DIRECT KM_PHYSCONTIG +#define VM_PHYSCONTIG KM_PHYSCONTIG + +#ifdef DEBUG +#define PROGRESS() printk("%s : %d\n", __FUNCTION__, __LINE__) +#define NOT_PROGRESS() printk("%s : %d - Error\n", __FUNCTION__, __LINE__) +#else +#define PROGRESS() ; +#define NOT_PROGRESS() ; +#endif + +static __inline__ void * +kvpalloc(size_t size, int flags, int colour) +{ + if (flags & (VM_DIRECT|VM_PHYSCONTIG)) { + int order = 0; + while ((PAGE_SIZE << order) < (size << PAGE_SHIFT)) + order++; + return (void *) __get_free_pages(GFP_KERNEL, order); + } else + return vmalloc(size << PAGE_SHIFT); +} + +/* Local port info for the IOC4 serial ports. This contains as its + * first member the global sio port private data. + */ +typedef struct ioc4port { + sioport_t ip_sioport; /* Must be first struct entry! */ + + vertex_hdl_t ip_conn_vhdl; /* vhdl to use for pciio requests */ + vertex_hdl_t ip_port_vhdl; /* vhdl for the serial port */ + + /* Base piomap addr of the ioc4 board this port is on + * and associated serial map; serial map includes uart registers. + */ + ioc4_mem_t *ip_ioc4; + ioc4_sregs_t *ip_serial; + ioc4_uart_t *ip_uart; + + /* Ring buffer page for this port */ + caddr_t ip_ring_buf_k0; /* Ring buffer location in K0 space */ + + /* Rings for this port */ + struct ring *ip_inring; + struct ring *ip_outring; + + /* Hook to port specific values for this port */ + struct hooks *ip_hooks; + + int ip_flags; + + /* Cache of DCD/CTS bits last received */ + char ip_modem_bits; + + /* Various rx/tx parameters */ + int ip_baud; + int ip_tx_lowat; + int ip_rx_timeout; + + /* Copy of notification bits */ + int ip_notify; + + /* Shadow copies of various registers so we don't need to PIO + * read them constantly + */ + ioc4reg_t ip_ienb; /* Enabled interrupts */ + + ioc4reg_t ip_sscr; + + ioc4reg_t ip_tx_prod; + ioc4reg_t ip_rx_cons; + + /* Back pointer to ioc4 soft area */ + void *ip_ioc4_soft; +} ioc4port_t; + +#if DEBUG +#define MAXSAVEPORT 256 +static int next_saveport = 0; +static ioc4port_t *saveport[MAXSAVEPORT]; +#endif + +/* TX low water mark. We need to notify the driver whenever TX is getting + * close to empty so it can refill the TX buffer and keep things going. + * Let's assume that if we interrupt 1 ms before the TX goes idle, we'll + * have no trouble getting in more chars in time (I certainly hope so). + */ +#define TX_LOWAT_LATENCY 1000 +#define TX_LOWAT_HZ (1000000 / TX_LOWAT_LATENCY) +#define TX_LOWAT_CHARS(baud) (baud / 10 / TX_LOWAT_HZ) + +/* Flags per port */ +#define INPUT_HIGH 0x01 +#define DCD_ON 0x02 +#define LOWAT_WRITTEN 0x04 +#define READ_ABORTED 0x08 +#define TX_DISABLED 0x10 + +/* Get local port type from global sio port type */ +#define LPORT(port) ((ioc4port_t *) (port)) + +/* Get global port from local port type */ +#define GPORT(port) ((sioport_t *) (port)) + +/* Since each port has different register offsets and bitmasks + * for everything, we'll store those that we need in tables so we + * don't have to be constantly checking the port we are dealing with. + */ +struct hooks { + ioc4reg_t intr_delta_dcd; + ioc4reg_t intr_delta_cts; + ioc4reg_t intr_tx_mt; + ioc4reg_t intr_rx_timer; + ioc4reg_t intr_rx_high; + ioc4reg_t intr_tx_explicit; + ioc4reg_t intr_dma_error; + ioc4reg_t intr_clear; + ioc4reg_t intr_all; + char rs422_select_pin; +}; + +static struct hooks hooks_array[4] = +{ + /* Values for port 0 */ + { + IOC4_SIO_IR_S0_DELTA_DCD, + IOC4_SIO_IR_S0_DELTA_CTS, + IOC4_SIO_IR_S0_TX_MT, + IOC4_SIO_IR_S0_RX_TIMER, + IOC4_SIO_IR_S0_RX_HIGH, + IOC4_SIO_IR_S0_TX_EXPLICIT, + IOC4_OTHER_IR_S0_MEMERR, + (IOC4_SIO_IR_S0_TX_MT | IOC4_SIO_IR_S0_RX_FULL | + IOC4_SIO_IR_S0_RX_HIGH | IOC4_SIO_IR_S0_RX_TIMER | + IOC4_SIO_IR_S0_DELTA_DCD | IOC4_SIO_IR_S0_DELTA_CTS | + IOC4_SIO_IR_S0_INT | IOC4_SIO_IR_S0_TX_EXPLICIT), + IOC4_SIO_IR_S0, + IOC4_GPPR_UART0_MODESEL_PIN, + }, + + /* Values for port 1 */ + { + IOC4_SIO_IR_S1_DELTA_DCD, + IOC4_SIO_IR_S1_DELTA_CTS, + IOC4_SIO_IR_S1_TX_MT, + IOC4_SIO_IR_S1_RX_TIMER, + IOC4_SIO_IR_S1_RX_HIGH, + IOC4_SIO_IR_S1_TX_EXPLICIT, + IOC4_OTHER_IR_S1_MEMERR, + (IOC4_SIO_IR_S1_TX_MT | IOC4_SIO_IR_S1_RX_FULL | + IOC4_SIO_IR_S1_RX_HIGH | IOC4_SIO_IR_S1_RX_TIMER | + IOC4_SIO_IR_S1_DELTA_DCD | IOC4_SIO_IR_S1_DELTA_CTS | + IOC4_SIO_IR_S1_INT | IOC4_SIO_IR_S1_TX_EXPLICIT), + IOC4_SIO_IR_S1, + IOC4_GPPR_UART1_MODESEL_PIN, + }, + + /* Values for port 2 */ + { + IOC4_SIO_IR_S2_DELTA_DCD, + IOC4_SIO_IR_S2_DELTA_CTS, + IOC4_SIO_IR_S2_TX_MT, + IOC4_SIO_IR_S2_RX_TIMER, + IOC4_SIO_IR_S2_RX_HIGH, + IOC4_SIO_IR_S2_TX_EXPLICIT, + IOC4_OTHER_IR_S2_MEMERR, + (IOC4_SIO_IR_S2_TX_MT | IOC4_SIO_IR_S2_RX_FULL | + IOC4_SIO_IR_S2_RX_HIGH | IOC4_SIO_IR_S2_RX_TIMER | + IOC4_SIO_IR_S2_DELTA_DCD | IOC4_SIO_IR_S2_DELTA_CTS | + IOC4_SIO_IR_S2_INT | IOC4_SIO_IR_S2_TX_EXPLICIT), + IOC4_SIO_IR_S2, + IOC4_GPPR_UART2_MODESEL_PIN, + }, + + /* Values for port 3 */ + { + IOC4_SIO_IR_S3_DELTA_DCD, + IOC4_SIO_IR_S3_DELTA_CTS, + IOC4_SIO_IR_S3_TX_MT, + IOC4_SIO_IR_S3_RX_TIMER, + IOC4_SIO_IR_S3_RX_HIGH, + IOC4_SIO_IR_S3_TX_EXPLICIT, + IOC4_OTHER_IR_S3_MEMERR, + (IOC4_SIO_IR_S3_TX_MT | IOC4_SIO_IR_S3_RX_FULL | + IOC4_SIO_IR_S3_RX_HIGH | IOC4_SIO_IR_S3_RX_TIMER | + IOC4_SIO_IR_S3_DELTA_DCD | IOC4_SIO_IR_S3_DELTA_CTS | + IOC4_SIO_IR_S3_INT | IOC4_SIO_IR_S3_TX_EXPLICIT), + IOC4_SIO_IR_S3, + IOC4_GPPR_UART3_MODESEL_PIN, + } +}; + +/* Macros to get into the port hooks. Require a variable called + * hooks set to port->hooks + */ +#define H_INTR_TX_MT hooks->intr_tx_mt +#define H_INTR_RX_TIMER hooks->intr_rx_timer +#define H_INTR_RX_HIGH hooks->intr_rx_high +#define H_INTR_TX_EXPLICIT hooks->intr_tx_explicit +#define H_INTR_DMA_ERROR hooks->intr_dma_error +#define H_INTR_CLEAR hooks->intr_clear +#define H_INTR_DELTA_DCD hooks->intr_delta_dcd +#define H_INTR_DELTA_CTS hooks->intr_delta_cts +#define H_INTR_ALL hooks->intr_all +#define H_RS422 hooks->rs422_select_pin + +/* A ring buffer entry */ +struct ring_entry { + union { + struct { + uint32_t alldata; + uint32_t allsc; + } all; + struct { + char data[4]; /* data bytes */ + char sc[4]; /* status/control */ + } s; + } u; +}; + +/* Test the valid bits in any of the 4 sc chars using "allsc" member */ +#define RING_ANY_VALID \ + ((uint32_t) (IOC4_RXSB_MODEM_VALID | IOC4_RXSB_DATA_VALID) * 0x01010101) + +#define ring_sc u.s.sc +#define ring_data u.s.data +#define ring_allsc u.all.allsc + +/* Number of entries per ring buffer. */ +#define ENTRIES_PER_RING (RING_BUF_SIZE / (int) sizeof(struct ring_entry)) + +/* An individual ring */ +struct ring { + struct ring_entry entries[ENTRIES_PER_RING]; +}; + +/* The whole enchilada */ +struct ring_buffer { + struct ring TX_0_OR_2; + struct ring RX_0_OR_2; + struct ring TX_1_OR_3; + struct ring RX_1_OR_3; +}; + +/* Get a ring from a port struct */ +#define RING(port, which) \ + &(((struct ring_buffer *) ((port)->ip_ring_buf_k0))->which) + +/* Local functions: */ +static int ioc4_open (sioport_t *port); +static int ioc4_config (sioport_t *port, int baud, int byte_size, + int stop_bits, int parenb, int parodd); +static int ioc4_enable_hfc (sioport_t *port, int enable); +static int ioc4_set_extclk (sioport_t *port, int clock_factor); + +/* Data transmission */ +static int do_ioc4_write (sioport_t *port, char *buf, int len); +static int ioc4_write (sioport_t *port, char *buf, int len); +static int ioc4_sync_write (sioport_t *port, char *buf, int len); +static void ioc4_wrflush (sioport_t *port); +static int ioc4_break (sioport_t *port, int brk); +static int ioc4_enable_tx (sioport_t *port, int enb); + +/* Data reception */ +static int ioc4_read (sioport_t *port, char *buf, int len); + +/* Event notification */ +static int ioc4_notification (sioport_t *port, int mask, int on); +static int ioc4_rx_timeout (sioport_t *port, int timeout); + +/* Modem control */ +static int ioc4_set_DTR (sioport_t *port, int dtr); +static int ioc4_set_RTS (sioport_t *port, int rts); +static int ioc4_query_DCD (sioport_t *port); +static int ioc4_query_CTS (sioport_t *port); + +/* Output mode */ +static int ioc4_set_proto (sioport_t *port, enum sio_proto proto); + +/* User mapped driver support */ +static int ioc4_get_mapid (sioport_t *port, void *arg); +static int ioc4_set_sscr (sioport_t *port, int arg, int flag); + +static struct serial_calldown ioc4_calldown = { + ioc4_open, + ioc4_config, + ioc4_enable_hfc, + ioc4_set_extclk, + ioc4_write, + ioc4_sync_write, + ioc4_wrflush, /* du flush */ + ioc4_break, + ioc4_enable_tx, + ioc4_read, + ioc4_notification, + ioc4_rx_timeout, + ioc4_set_DTR, + ioc4_set_RTS, + ioc4_query_DCD, + ioc4_query_CTS, + ioc4_set_proto, + ioc4_get_mapid, + 0, + 0, + ioc4_set_sscr +}; + +/* Baud rate stuff */ +#define SET_BAUD(p, b) set_baud_ti(p, b) +static int set_baud_ti(ioc4port_t *, int); + +#ifdef DEBUG +/* Performance characterization logging */ +#define DEBUGINC(x,i) stats.x += i + +static struct { + + /* Ports present */ + uint ports; + + /* Ports killed */ + uint killed; + + /* Interrupt counts */ + uint total_intr; + uint port_0_intr; + uint port_1_intr; + uint ddcd_intr; + uint dcts_intr; + uint rx_timer_intr; + uint rx_high_intr; + uint explicit_intr; + uint mt_intr; + uint mt_lowat_intr; + + /* Write characteristics */ + uint write_bytes; + uint write_cnt; + uint wrote_bytes; + uint tx_buf_used; + uint tx_buf_cnt; + uint tx_pio_cnt;691 + + /* Read characteristics */ + uint read_bytes; + uint read_cnt; + uint drain; + uint drainwait; + uint resetdma; + uint read_ddcd; + uint rx_overrun; + uint parity; + uint framing; + uint brk; + uint red_bytes; + uint rx_buf_used; + uint rx_buf_cnt; + + /* Errors */ + uint dma_lost; + uint read_aborted; + uint read_aborted_detected; +} stats; + +#else +#define DEBUGINC(x,i) +#endif + +/* Infinite loop detection. + */ +#define MAXITER 1000000 +#define SPIN(cond, success) \ +{ \ + int spiniter = 0; \ + success = 1; \ + while(cond) { \ + spiniter++; \ + if (spiniter > MAXITER) { \ + success = 0; \ + break; \ + } \ + } \ +} + + +static iopaddr_t +ring_dmatrans(vertex_hdl_t conn_vhdl, caddr_t vaddr) +{ + extern iopaddr_t pciio_dma_addr (vertex_hdl_t, device_desc_t, paddr_t, + size_t, pciio_dmamap_t *, unsigned); + iopaddr_t paddr = (iopaddr_t)vaddr; + + if (conn_vhdl != GRAPH_VERTEX_NONE) +#ifdef USE_64BIT_DMA + /* Use 64-bit DMA address when the IOC4 supports it */ + return pciio_dmatrans_addr (conn_vhdl, 0, paddr, TOTAL_RING_BUF_SIZE, PCIIO_DMA_A64 | PCIIO_BYTE_STREAM); + +#else + /* Use 32-bit DMA address for current IOC4 */ + return pciio_dma_addr (conn_vhdl, 0, paddr, TOTAL_RING_BUF_SIZE, NULL, PCIIO_BYTE_STREAM); +#endif + + return paddr; +} + + +/* If interrupt routine called enable_intrs, then would need to write + * mask_enable_intrs() routine. + */ +static inline void +mask_disable_intrs(ioc4port_t *port, ioc4reg_t mask) +{ + port->ip_ienb &= ~mask; +} + + +static void +enable_intrs(ioc4port_t *port, ioc4reg_t mask) +{ + struct hooks *hooks = port->ip_hooks; + + if ((port->ip_ienb & mask) != mask) { + IOC4_WRITE_IES(port->ip_ioc4_soft, mask, ioc4_sio_intr_type); + port->ip_ienb |= mask; + } + + if (port->ip_ienb) + IOC4_WRITE_IES(port->ip_ioc4_soft, H_INTR_DMA_ERROR, ioc4_other_intr_type); +} + + +static void +disable_intrs(ioc4port_t *port, ioc4reg_t mask) +{ + struct hooks *hooks = port->ip_hooks; + + if (port->ip_ienb & mask) { + IOC4_WRITE_IEC(port->ip_ioc4_soft, mask, ioc4_sio_intr_type); + port->ip_ienb &= ~mask; + } + + if (!port->ip_ienb) + IOC4_WRITE_IEC(port->ip_ioc4_soft, H_INTR_DMA_ERROR, ioc4_other_intr_type); +} + + +/* Service any pending interrupts on the given port */ +static void +ioc4_serial_intr(intr_arg_t arg, ioc4reg_t sio_ir) +{ + ioc4port_t *port = (ioc4port_t *) arg; + sioport_t *gp = GPORT(port); + struct hooks *hooks = port->ip_hooks; + unsigned rx_high_rd_aborted = 0; + unsigned int flags; + + PROGRESS(); +#ifdef NOT_YET + ASSERT(sio_port_islocked(gp) == 0); +#endif + + /* Possible race condition here: The TX_MT interrupt bit may be + * cleared without the intervention of the interrupt handler, + * e.g. by a write. If the top level interrupt handler reads a + * TX_MT, then some other processor does a write, starting up + * output, then we come in here, see the TX_MT and stop DMA, the + * output started by the other processor will hang. Thus we can + * only rely on TX_MT being legitimate if it is read while the + * port lock is held. Therefore this bit must be ignored in the + * passed in interrupt mask which was read by the top level + * interrupt handler since the port lock was not held at the time + * it was read. We can only rely on this bit being accurate if it + * is read while the port lock is held. So we'll clear it for now, + * and reload it later once we have the port lock. + */ + sio_ir &= ~(H_INTR_TX_MT); + + SIO_LOCK_PORT(gp, flags); + + dprintf(("interrupt: sio_ir 0x%x\n", sio_ir)); + + do { + ioc4reg_t shadow; + + /* Handle a DCD change */ + if (sio_ir & H_INTR_DELTA_DCD) { + DEBUGINC(ddcd_intr, 1); + + PROGRESS(); + /* ACK the interrupt */ + PCI_OUTW(&port->ip_ioc4->sio_ir, H_INTR_DELTA_DCD); + + /* If DCD has raised, notify upper layer. Otherwise + * wait for a record to be posted to notify of a dropped DCD. + */ + shadow = PCI_INW(&port->ip_serial->shadow); + + if (port->ip_notify & N_DDCD) { + PROGRESS(); + if (shadow & IOC4_SHADOW_DCD) /* Notify upper layer of DCD */ + UP_DDCD(gp, 1); + else + port->ip_flags |= DCD_ON; /* Flag delta DCD/no DCD */ + } + } + + /* Handle a CTS change */ + if (sio_ir & H_INTR_DELTA_CTS) { + DEBUGINC(dcts_intr, 1); + PROGRESS(); + + /* ACK the interrupt */ + PCI_OUTW(&port->ip_ioc4->sio_ir, H_INTR_DELTA_CTS); + + shadow = PCI_INW(&port->ip_serial->shadow); + + /* Notify upper layer */ + if (port->ip_notify & N_DCTS) { + if (shadow & IOC4_SHADOW_CTS) + UP_DCTS(gp, 1); + else + UP_DCTS(gp, 0); + } + } + + /* RX timeout interrupt. Must be some data available. Put this + * before the check for RX_HIGH since servicing this condition + * may cause that condition to clear. + */ + if (sio_ir & H_INTR_RX_TIMER) { + PROGRESS(); + DEBUGINC(rx_timer_intr, 1); + + /* ACK the interrupt */ + PCI_OUTW(&port->ip_ioc4->sio_ir, H_INTR_RX_TIMER); + + if (port->ip_notify & N_DATA_READY) + UP_DATA_READY(gp); + } + + /* RX high interrupt. Must be after RX_TIMER. + */ + else if (sio_ir & H_INTR_RX_HIGH) { + DEBUGINC(rx_high_intr, 1); + + PROGRESS(); + /* Data available, notify upper layer */ + if (port->ip_notify & N_DATA_READY) + UP_DATA_READY(gp); + + /* We can't ACK this interrupt. If up_data_ready didn't + * cause the condition to clear, we'll have to disable + * the interrupt until the data is drained by the upper layer. + * If the read was aborted, don't disable the interrupt as + * this may cause us to hang indefinitely. An aborted read + * generally means that this interrupt hasn't been delivered + * to the cpu yet anyway, even though we see it as asserted + * when we read the sio_ir. + */ + if ((sio_ir = PENDING(port)) & H_INTR_RX_HIGH) { + PROGRESS(); + if ((port->ip_flags & READ_ABORTED) == 0) { + mask_disable_intrs(port, H_INTR_RX_HIGH); + port->ip_flags |= INPUT_HIGH; + } + else { + DEBUGINC(read_aborted_detected, 1); + /* We will be stuck in this loop forever, + * higher level will never get time to finish + */ + rx_high_rd_aborted++; + } + } + } + + /* We got a low water interrupt: notify upper layer to + * send more data. Must come before TX_MT since servicing + * this condition may cause that condition to clear. + */ + if (sio_ir & H_INTR_TX_EXPLICIT) { + DEBUGINC(explicit_intr, 1); + PROGRESS(); + + port->ip_flags &= ~LOWAT_WRITTEN; + + /* ACK the interrupt */ + PCI_OUTW(&port->ip_ioc4->sio_ir, H_INTR_TX_EXPLICIT); + + if (port->ip_notify & N_OUTPUT_LOWAT) + UP_OUTPUT_LOWAT(gp); + } + + /* Handle TX_MT. Must come after TX_EXPLICIT. + */ + else if (sio_ir & H_INTR_TX_MT) { + DEBUGINC(mt_intr, 1); + PROGRESS(); + + /* If the upper layer is expecting a lowat notification + * and we get to this point it probably means that for + * some reason the TX_EXPLICIT didn't work as expected + * (that can legitimately happen if the output buffer is + * filled up in just the right way). So sent the notification + * now. + */ + if (port->ip_notify & N_OUTPUT_LOWAT) { + DEBUGINC(mt_lowat_intr, 1); + PROGRESS(); + + if (port->ip_notify & N_OUTPUT_LOWAT) + UP_OUTPUT_LOWAT(gp); + + /* We need to reload the sio_ir since the upcall may + * have caused another write to occur, clearing + * the TX_MT condition. + */ + sio_ir = PENDING(port); + } + + /* If the TX_MT condition still persists even after the upcall, + * we've got some work to do. + */ + if (sio_ir & H_INTR_TX_MT) { + + PROGRESS(); + + /* If we are not currently expecting DMA input, and the + * transmitter has just gone idle, there is no longer any + * reason for DMA, so disable it. + */ + if (!(port->ip_notify & (N_DATA_READY | N_DDCD))) { + ASSERT(port->ip_sscr & IOC4_SSCR_DMA_EN); + port->ip_sscr &= ~IOC4_SSCR_DMA_EN; + PCI_OUTW(&port->ip_serial->sscr, port->ip_sscr); + } + + /* Prevent infinite TX_MT interrupt */ + mask_disable_intrs(port, H_INTR_TX_MT); + } + } + + sio_ir = PENDING(port); + + /* if the read was aborted and only H_INTR_RX_HIGH, + * clear H_INTR_RX_HIGH, so we do not loop forever. + */ + + if ( rx_high_rd_aborted && (sio_ir == H_INTR_RX_HIGH) ) { + sio_ir &= ~H_INTR_RX_HIGH; + } + } while (sio_ir & H_INTR_ALL); + + SIO_UNLOCK_PORT(gp, flags); + + /* Re-enable interrupts before returning from interrupt handler. + * Getting interrupted here is okay. It'll just v() our semaphore, and + * we'll come through the loop again. + */ + + IOC4_WRITE_IES(port->ip_ioc4_soft, port->ip_ienb, ioc4_sio_intr_type); +} + + +/*ARGSUSED*/ + +/* Service any pending DMA error interrupts on the given port */ +static void +ioc4_dma_error_intr(intr_arg_t arg, ioc4reg_t other_ir) +{ + ioc4port_t *port = (ioc4port_t *) arg; + sioport_t *gp = GPORT(port); + struct hooks *hooks = port->ip_hooks; + unsigned int flags; + + SIO_LOCK_PORT(gp, flags); + + dprintf(("interrupt: other_ir 0x%x\n", other_ir)); + + /* ACK the interrupt */ + PCI_OUTW(&port->ip_ioc4->other_ir, H_INTR_DMA_ERROR); + + printk( "DMA error on serial port %p\n", (void *)port->ip_port_vhdl); + + if (port->ip_ioc4->pci_err_addr_l & IOC4_PCI_ERR_ADDR_VLD) { + printk( "PCI error address is 0x%lx, master is serial port %c %s\n", + ((uint64_t) port->ip_ioc4->pci_err_addr_h << 32) | + (port->ip_ioc4->pci_err_addr_l & IOC4_PCI_ERR_ADDR_ADDR_MSK), + '1' + (char) ((port->ip_ioc4->pci_err_addr_l & + IOC4_PCI_ERR_ADDR_MST_NUM_MSK) >> 1), + (port->ip_ioc4->pci_err_addr_l & IOC4_PCI_ERR_ADDR_MST_TYP_MSK) + ? "RX" : "TX"); + + if (port->ip_ioc4->pci_err_addr_l & IOC4_PCI_ERR_ADDR_MUL_ERR) + printk( "Multiple errors occurred\n"); + } + + SIO_UNLOCK_PORT(gp, flags); + + /* Re-enable DMA error interrupts */ + IOC4_WRITE_IES(port->ip_ioc4_soft, H_INTR_DMA_ERROR, ioc4_other_intr_type); +} + + +/* Baud rate setting code */ +static int +set_baud_ti(ioc4port_t *port, int baud) +{ + int actual_baud; + int diff; + int lcr; + unsigned short divisor; + + divisor = SER_DIVISOR(baud, IOC4_SER_XIN_CLK); + if (!divisor) + return(1); + actual_baud = DIVISOR_TO_BAUD(divisor, IOC4_SER_XIN_CLK); + + diff = actual_baud - baud; + if (diff < 0) + diff = -diff; + + /* If we're within 1%, we've found a match */ + if (diff * 100 > actual_baud) + return(1); + + lcr = PCI_INB(&port->ip_uart->i4u_lcr); + + PCI_OUTB(&port->ip_uart->i4u_lcr, lcr | LCR_DLAB); + + PCI_OUTB(&port->ip_uart->i4u_dll, (char) divisor); + + PCI_OUTB(&port->ip_uart->i4u_dlm, (char) (divisor >> 8)); + + PCI_OUTB(&port->ip_uart->i4u_lcr, lcr); + + return(0); +} + + +/* Initialize the sio and ioc4 hardware for a given port */ +static int +hardware_init(ioc4port_t *port) +{ + ioc4reg_t sio_cr; + struct hooks *hooks = port->ip_hooks; + + DEBUGINC(ports, 1); + + /* Idle the IOC4 serial interface */ + PCI_OUTW(&port->ip_serial->sscr, IOC4_SSCR_RESET); + + /* Wait until any pending bus activity for this port has ceased */ + do sio_cr = PCI_INW(&port->ip_ioc4->sio_cr); + while(!(sio_cr & IOC4_SIO_CR_SIO_DIAG_IDLE)); + + /* Finish reset sequence */ + PCI_OUTW(&port->ip_serial->sscr, 0); + + /* Once RESET is done, reload cached tx_prod and rx_cons values + * and set rings to empty by making prod == cons + */ + port->ip_tx_prod = PCI_INW(&port->ip_serial->stcir) & PROD_CONS_MASK; + PCI_OUTW(&port->ip_serial->stpir, port->ip_tx_prod); + + port->ip_rx_cons = PCI_INW(&port->ip_serial->srpir) & PROD_CONS_MASK; + PCI_OUTW(&port->ip_serial->srcir, port->ip_rx_cons); + + /* Disable interrupts for this 16550 */ + PCI_OUTB(&port->ip_uart->i4u_lcr, 0); /* clear DLAB */ + PCI_OUTB(&port->ip_uart->i4u_ier, 0); + + /* Set the default baud */ + SET_BAUD(port, port->ip_baud); + + /* Set line control to 8 bits no parity */ + PCI_OUTB(&port->ip_uart->i4u_lcr, LCR_BITS8 | LCR_1_STOP_BITS); + + /* Enable the FIFOs */ + PCI_OUTB(&port->ip_uart->i4u_fcr, FCR_FIFOEN); + /* then reset 16550 FIFOs */ + PCI_OUTB(&port->ip_uart->i4u_fcr, + FCR_FIFOEN | FCR_RxFIFO | FCR_TxFIFO); + + /* Clear modem control register */ + PCI_OUTB(&port->ip_uart->i4u_mcr, 0); + + /* Clear deltas in modem status register */ + PCI_INB(&port->ip_uart->i4u_msr); + + /* Only do this once per port pair */ + if (port->ip_hooks == &hooks_array[0] || port->ip_hooks == &hooks_array[2]) { + iopaddr_t ring_pci_addr; + volatile ioc4reg_t *sbbr_l; + volatile ioc4reg_t *sbbr_h; + + if(port->ip_hooks == &hooks_array[0]) { + sbbr_l = &port->ip_ioc4->sbbr01_l; + sbbr_h = &port->ip_ioc4->sbbr01_h; + } + else { + sbbr_l = &port->ip_ioc4->sbbr23_l; + sbbr_h = &port->ip_ioc4->sbbr23_h; + } + + /* Set the DMA address */ + ring_pci_addr = ring_dmatrans(port->ip_conn_vhdl, + port->ip_ring_buf_k0); + + PCI_OUTW(sbbr_h, + (ioc4reg_t) ((__psunsigned_t) ring_pci_addr >> 32)); + + PCI_OUTW(sbbr_l, + ((ioc4reg_t) (int64_t) ring_pci_addr | IOC4_BUF_SIZE_BIT)); + +#ifdef IOC4_SIO_DEBUG + { + unsigned int tmp1, tmp2; + + tmp1 = PCI_INW(sbbr_l); + tmp2 = PCI_INW(sbbr_h); + printk("========== %s : sbbr_l [%p]/0x%x sbbr_h [%p]/0x%x\n", + __FUNCTION__, (void *)sbbr_l, tmp1, (void *)sbbr_h, tmp2); + } +#endif + } + + /* Set the receive timeout value to 10 msec */ + PCI_OUTW(&port->ip_serial->srtr, IOC4_SRTR_HZ / 100); + + /* Set RX threshold, enable DMA */ + /* Set high water mark at 3/4 of full ring */ + port->ip_sscr = (ENTRIES_PER_RING * 3 / 4); + + PCI_OUTW(&port->ip_serial->sscr, port->ip_sscr); + + /* Disable and clear all serial related interrupt bits */ + IOC4_WRITE_IEC(port->ip_ioc4_soft, H_INTR_CLEAR, ioc4_sio_intr_type); + port->ip_ienb &= ~H_INTR_CLEAR; + PCI_OUTW(&port->ip_ioc4->sio_ir, H_INTR_CLEAR); + + return(0); +} + + +/* + * Device initialization. + * Called at *_attach() time for each + * IOC4 with serial ports in the system. + * If vhdl is GRAPH_VERTEX_NONE, do not do + * any graph related work; otherwise, it + * is the IOC4 vertex that should be used + * for requesting pciio services. + */ +int +ioc4_serial_attach(vertex_hdl_t conn_vhdl, void *ioc4) +{ + /*REFERENCED*/ + graph_error_t rc; + ioc4_mem_t *ioc4_mem; + vertex_hdl_t port_vhdl, ioc4_vhdl; + vertex_hdl_t intr_dev_vhdl; + ioc4port_t *port; + ioc4port_t *ports[4]; + static char *names[] = { "tty/1", "tty/2", "tty/3", "tty/4" }; + int x, first_port = -1, last_port = -1; + void *ioc4_soft; + unsigned int ioc4_revid_min = 62; + unsigned int ioc4_revid; + + + /* IOC4 firmware must be at least rev 62 */ + ioc4_revid = pciio_config_get(conn_vhdl, PCI_CFG_REV_ID, 1); + + if (ioc4_revid < ioc4_revid_min) { + printk( "IOC4 serial ports not supported on firmware rev %d, please upgrade to rev %d or higher\n", ioc4_revid, ioc4_revid_min); + return -1; + } + + first_port = 0; + last_port = 3; + + /* Get back pointer to the ioc4 soft area */ + rc = hwgraph_traverse(conn_vhdl, EDGE_LBL_IOC4, &ioc4_vhdl); + ASSERT(rc == GRAPH_SUCCESS); + ioc4_soft = (void *)hwgraph_fastinfo_get(ioc4_vhdl); + + /* grab the PIO address */ + ioc4_mem = (ioc4_mem_t *)ioc4; + ASSERT(ioc4_mem != NULL); + + /* + * Create port structures for each port + */ + NEWA(port, 4); +#ifdef IOC4_SIO_DEBUG + printk("%s : [addr 0x%p]\n", __FUNCTION__, (void *)port); +#endif + ports[0] = port++; + ports[1] = port++; + ports[2] = port++; + ports[3] = port++; + +#if DEBUG + { + int slot = atomicAddInt(&next_saveport, 4) - 4; + saveport[slot] = ports[0]; + saveport[slot + 1] = ports[1]; + saveport[slot + 2] = ports[2]; + saveport[slot + 3] = ports[3]; + ASSERT(slot < MAXSAVEPORT); + } +#endif + +#ifdef DEBUG + if ((caddr_t) port != (caddr_t) &(port->ip_sioport)) + panic("sioport is not first member of ioc4port struct\n"); +#endif + + /* Allocate buffers and jumpstart the hardware. + */ + for (x = first_port; x < (last_port + 1); x++) { + + port = ports[x]; +#ifdef IOC4_SIO_DEBUG + printk("%s : initialize port %d [addr 0x%p/0x%p]\n", __FUNCTION__, x, (void *)port, + (void *)GPORT(port)); +#endif + port->ip_ioc4_soft = ioc4_soft; + rc = hwgraph_path_add(conn_vhdl, names[x], &port_vhdl); + ASSERT(rc == GRAPH_SUCCESS); + port->ip_conn_vhdl = conn_vhdl; + port->ip_port_vhdl = port_vhdl; + port->ip_ienb = 0; + hwgraph_fastinfo_set(port_vhdl, (arbitrary_info_t) port); + + /* Perform upper layer initialization. Create all device node + * types including rs422 ports. + */ + ioc4_serial_initport(GPORT(port), x); + port->ip_baud = 9600; + + /* Attach the calldown hooks so upper layer can call our + * routines. + */ + port->ip_sioport.sio_calldown = &ioc4_calldown; + + /* Map in the IOC4 register area */ + port->ip_ioc4 = ioc4_mem; + } + + { + /* Port 0 */ + port = ports[0]; + port->ip_hooks = &hooks_array[0]; + + /* Get direct hooks to the serial regs and uart regs + * for this port + */ + port->ip_serial = &(port->ip_ioc4->port_0); + port->ip_uart = &(port->ip_ioc4->uart_0); +#ifdef IOC4_SIO_DEBUG + printk("==== %s : serial port 0 address 0x%p uart address 0x%p\n", + __FUNCTION__, (void *)port->ip_serial, (void *)port->ip_uart); +#endif + + /* If we don't already have a ring buffer, + * set one up. + */ + if (port->ip_ring_buf_k0 == 0) { + +#if PAGE_SIZE >= TOTAL_RING_BUF_SIZE + if ((port->ip_ring_buf_k0 = kvpalloc(1, VM_DIRECT, 0)) == 0) + panic("ioc4_uart driver cannot allocate page\n"); +#else + /* We need to allocate a chunk of memory on a + * TOTAL_RING_BUF_SIZE boundary. + */ + { + pgno_t pfn; + caddr_t vaddr; + if ((pfn = contig_memalloc(TOTAL_RING_BUF_SIZE / PAGE_SIZE, + TOTAL_RING_BUF_SIZE / PAGE_SIZE, + VM_DIRECT)) == 0) + panic("ioc4_uart driver cannot allocate page\n"); + ASSERT(small_pfn(pfn)); + vaddr = small_pfntova_K0(pfn); + (void) COLOR_VALIDATION(pfdat + pfn, + colorof(vaddr), + 0, VM_DIRECT); + port->ip_ring_buf_k0 = vaddr; + } +#endif + } + ASSERT((((int64_t)port->ip_ring_buf_k0) & + (TOTAL_RING_BUF_SIZE - 1)) == 0); + memset(port->ip_ring_buf_k0, 0, TOTAL_RING_BUF_SIZE); + port->ip_inring = RING(port, RX_0_OR_2); + port->ip_outring = RING(port, TX_0_OR_2); + + /* Initialize the hardware for IOC4 */ + hardware_init(port); + + if (hwgraph_edge_get(ports[0]->ip_port_vhdl, "d", &intr_dev_vhdl) != + GRAPH_SUCCESS) { + intr_dev_vhdl = ports[0]->ip_port_vhdl; + } + + /* Attach interrupt handlers */ + ioc4_intr_connect(conn_vhdl, + ioc4_sio_intr_type, + IOC4_SIO_IR_S0, + ioc4_serial_intr, + ports[0], + ports[0]->ip_port_vhdl, + intr_dev_vhdl); + + ioc4_intr_connect(conn_vhdl, + ioc4_other_intr_type, + IOC4_OTHER_IR_S0_MEMERR, + ioc4_dma_error_intr, + ports[0], + ports[0]->ip_port_vhdl, + intr_dev_vhdl); + } + + { + + /* Port 1 */ + port = ports[1]; + port->ip_hooks = &hooks_array[1]; + + port->ip_serial = &(port->ip_ioc4->port_1); + port->ip_uart = &(port->ip_ioc4->uart_1); +#ifdef IOC4_SIO_DEBUG + printk("==== %s : serial port 1 address 0x%p uart address 0x%p\n", + __FUNCTION__, (void *)port->ip_serial, (void *)port->ip_uart); +#endif + + port->ip_ring_buf_k0 = ports[0]->ip_ring_buf_k0; + port->ip_inring = RING(port, RX_1_OR_3); + port->ip_outring = RING(port, TX_1_OR_3); + + /* Initialize the hardware for IOC4 */ + hardware_init(port); + + if (hwgraph_edge_get(ports[1]->ip_port_vhdl, "d", &intr_dev_vhdl) != + GRAPH_SUCCESS) { + intr_dev_vhdl = ports[1]->ip_port_vhdl; + } + + /* Attach interrupt handler */ + ioc4_intr_connect(conn_vhdl, + ioc4_sio_intr_type, + IOC4_SIO_IR_S1, + ioc4_serial_intr, + ports[1], + ports[1]->ip_port_vhdl, + intr_dev_vhdl); + + ioc4_intr_connect(conn_vhdl, + ioc4_other_intr_type, + IOC4_OTHER_IR_S1_MEMERR, + ioc4_dma_error_intr, + ports[1], + ports[1]->ip_port_vhdl, + intr_dev_vhdl); + } + + { + + /* Port 2 */ + port = ports[2]; + port->ip_hooks = &hooks_array[2]; + + /* Get direct hooks to the serial regs and uart regs + * for this port + */ + port->ip_serial = &(port->ip_ioc4->port_2); + port->ip_uart = &(port->ip_ioc4->uart_2); +#ifdef IOC4_SIO_DEBUG + printk("==== %s : serial port 2 address 0x%p uart address 0x%p\n", + __FUNCTION__, (void *)port->ip_serial, (void *)port->ip_uart); +#endif + + /* If we don't already have a ring buffer, + * set one up. + */ + if (port->ip_ring_buf_k0 == 0) { + +#if PAGE_SIZE >= TOTAL_RING_BUF_SIZE + if ((port->ip_ring_buf_k0 = kvpalloc(1, VM_DIRECT, 0)) == 0) + panic("ioc4_uart driver cannot allocate page\n"); +#else + + /* We need to allocate a chunk of memory on a + * TOTAL_RING_BUF_SIZE boundary. + */ + { + pgno_t pfn; + caddr_t vaddr; + if ((pfn = contig_memalloc(TOTAL_RING_BUF_SIZE / PAGE_SIZE, + TOTAL_RING_BUF_SIZE / PAGE_SIZE, + VM_DIRECT)) == 0) + panic("ioc4_uart driver cannot allocate page\n"); + ASSERT(small_pfn(pfn)); + vaddr = small_pfntova_K0(pfn); + (void) COLOR_VALIDATION(pfdat + pfn, + colorof(vaddr), + 0, VM_DIRECT); + port->ip_ring_buf_k0 = vaddr; + } +#endif + + } + ASSERT((((int64_t)port->ip_ring_buf_k0) & + (TOTAL_RING_BUF_SIZE - 1)) == 0); + memset(port->ip_ring_buf_k0, 0, TOTAL_RING_BUF_SIZE); + port->ip_inring = RING(port, RX_0_OR_2); + port->ip_outring = RING(port, TX_0_OR_2); + + /* Initialize the hardware for IOC4 */ + hardware_init(port); + + if (hwgraph_edge_get(ports[0]->ip_port_vhdl, "d", &intr_dev_vhdl) != + GRAPH_SUCCESS) { + intr_dev_vhdl = ports[2]->ip_port_vhdl; + } + + /* Attach interrupt handler */ + ioc4_intr_connect(conn_vhdl, + ioc4_sio_intr_type, + IOC4_SIO_IR_S2, + ioc4_serial_intr, + ports[2], + ports[2]->ip_port_vhdl, + intr_dev_vhdl); + + ioc4_intr_connect(conn_vhdl, + ioc4_other_intr_type, + IOC4_OTHER_IR_S2_MEMERR, + ioc4_dma_error_intr, + ports[2], + ports[2]->ip_port_vhdl, + intr_dev_vhdl); + } + + { + + /* Port 3 */ + port = ports[3]; + port->ip_hooks = &hooks_array[3]; + + port->ip_serial = &(port->ip_ioc4->port_3); + port->ip_uart = &(port->ip_ioc4->uart_3); +#ifdef IOC4_SIO_DEBUG + printk("==== %s : serial port 3 address 0x%p uart address 0x%p\n", + __FUNCTION__, (void *)port->ip_serial, (void *)port->ip_uart); +#endif + + port->ip_ring_buf_k0 = ports[2]->ip_ring_buf_k0; + port->ip_inring = RING(port, RX_1_OR_3); + port->ip_outring = RING(port, TX_1_OR_3); + + /* Initialize the hardware for IOC4 */ + hardware_init(port); + + if (hwgraph_edge_get(ports[3]->ip_port_vhdl, "d", &intr_dev_vhdl) != + GRAPH_SUCCESS) { + intr_dev_vhdl = ports[3]->ip_port_vhdl; + } + + /* Attach interrupt handler */ + ioc4_intr_connect(conn_vhdl, + ioc4_sio_intr_type, + IOC4_SIO_IR_S3, + ioc4_serial_intr, + ports[3], + ports[3]->ip_port_vhdl, + intr_dev_vhdl); + + ioc4_intr_connect(conn_vhdl, + ioc4_other_intr_type, + IOC4_OTHER_IR_S3_MEMERR, + ioc4_dma_error_intr, + ports[3], + ports[3]->ip_port_vhdl, + intr_dev_vhdl); + } + +#ifdef DEBUG + idbg_addfunc( "ioc4dump", idbg_ioc4dump ); +#endif + + return 0; +} + + +/* Shut down an IOC4 */ +/* ARGSUSED1 */ +void +ioc4_serial_kill(ioc4port_t *port) +{ + DEBUGINC(killed, 1); + + /* Notify upper layer that this port is no longer usable */ + UP_DETACH(GPORT(port)); + + /* Clear everything in the sscr */ + PCI_OUTW(&port->ip_serial->sscr, 0); + port->ip_sscr = 0; + +#ifdef DEBUG + /* Make sure nobody gets past the lock and accesses the hardware */ + port->ip_ioc4 = 0; + port->ip_serial = 0; +#endif + +} + + +/* + * Open a port + */ +static int +ioc4_open(sioport_t *port) +{ + ioc4port_t *p = LPORT(port); + int spin_success; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_OPEN)); +#endif + + p->ip_flags = 0; + p->ip_modem_bits = 0; + + /* Pause the DMA interface if necessary */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) { + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr | IOC4_SSCR_DMA_PAUSE); + SPIN((PCI_INW(&p->ip_serial->sscr) & IOC4_SSCR_PAUSE_STATE) == 0, + spin_success); + if (!spin_success) { + NOT_PROGRESS(); + return(-1); + } + } + + /* Reset the input fifo. If the uart received chars while the port + * was closed and DMA is not enabled, the uart may have a bunch of + * chars hanging around in its RX fifo which will not be discarded + * by rclr in the upper layer. We must get rid of them here. + */ + PCI_OUTB(&p->ip_uart->i4u_fcr, FCR_FIFOEN | FCR_RxFIFO); + + /* Set defaults */ + SET_BAUD(p, 9600); + + PCI_OUTB(&p->ip_uart->i4u_lcr, LCR_BITS8 | LCR_1_STOP_BITS); + + /* Re-enable DMA, set default threshold to intr whenever there is + * data available. + */ + p->ip_sscr &= ~IOC4_SSCR_RX_THRESHOLD; + p->ip_sscr |= 1; /* default threshold */ + + /* Plug in the new sscr. This implicitly clears the DMA_PAUSE + * flag if it was set above + */ + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + + PCI_OUTW(&p->ip_serial->srtr, 0); + + p->ip_tx_lowat = 1; + + dprintf(("ioc4 open successful\n")); + + return(0); +} + + +/* + * Config hardware + */ +static int +ioc4_config(sioport_t *port, + int baud, + int byte_size, + int stop_bits, + int parenb, + int parodd) +{ + ioc4port_t *p = LPORT(port); + char lcr, sizebits; + int spin_success; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_CONFIG)); +#endif + + if (SET_BAUD(p, baud)) + return(1); + + switch(byte_size) { + case 5: + sizebits = LCR_BITS5; + break; + case 6: + sizebits = LCR_BITS6; + break; + case 7: + sizebits = LCR_BITS7; + break; + case 8: + sizebits = LCR_BITS8; + break; + default: + dprintf(("invalid byte size port 0x%x size %d\n", port, byte_size)); + return(1); + } + + /* Pause the DMA interface if necessary */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) { + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr | IOC4_SSCR_DMA_PAUSE); + SPIN((PCI_INW(&p->ip_serial->sscr) & IOC4_SSCR_PAUSE_STATE) == 0, + spin_success); + if (!spin_success) + return(-1); + } + + /* Clear relevant fields in lcr */ + lcr = PCI_INB(&p->ip_uart->i4u_lcr); + lcr &= ~(LCR_MASK_BITS_CHAR | LCR_EPS | + LCR_PEN | LCR_MASK_STOP_BITS); + + /* Set byte size in lcr */ + lcr |= sizebits; + + /* Set parity */ + if (parenb) { + lcr |= LCR_PEN; + if (!parodd) + lcr |= LCR_EPS; + } + + /* Set stop bits */ + if (stop_bits) + lcr |= LCR_2_STOP_BITS; + + PCI_OUTB(&p->ip_uart->i4u_lcr, lcr); + + dprintf(("ioc4_config: lcr bits 0x%x\n", lcr)); + + /* Re-enable the DMA interface if necessary */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) { + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + } + + p->ip_baud = baud; + + /* When we get within this number of ring entries of filling the + * entire ring on TX, place an EXPLICIT intr to generate a lowat + * notification when output has drained. + */ + p->ip_tx_lowat = (TX_LOWAT_CHARS(baud) + 3) / 4; + if (p->ip_tx_lowat == 0) + p->ip_tx_lowat = 1; + + ioc4_rx_timeout(port, p->ip_rx_timeout); + + return(0); +} + + +/* + * Enable hardware flow control + */ +static int +ioc4_enable_hfc(sioport_t *port, int enable) +{ + ioc4port_t *p = LPORT(port); + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_ENABLE_HFC)); +#endif + + dprintf(("enable hfc port 0x%p, enb %d\n", (void *)port, enable)); + + if (enable) + p->ip_sscr |= IOC4_SSCR_HFC_EN; + else + p->ip_sscr &= ~IOC4_SSCR_HFC_EN; + + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + + return(0); +} + + +/* + * Set external clock + */ +/*ARGSUSED*/ +static int +ioc4_set_extclk(sioport_t *port, int clock_factor) +{ +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_SET_EXTCLK)); + /* XXX still todo */ +#endif + + /* only support 0 (no external clock) */ + return(clock_factor); +} + + +/* + * Write bytes to the hardware. Returns the number of bytes + * actually written. + */ +static int +do_ioc4_write(sioport_t *port, char *buf, int len) +{ + int prod_ptr, cons_ptr, total; + struct ring *outring; + struct ring_entry *entry; + ioc4port_t *p = LPORT(port); + struct hooks *hooks = p->ip_hooks; + + DEBUGINC(write_bytes, len); + DEBUGINC(write_cnt, 1); + + dprintf(("write port 0x%p, len %d\n", (void *)port, len)); + + ASSERT(len >= 0); + + prod_ptr = p->ip_tx_prod; + cons_ptr = PCI_INW(&p->ip_serial->stcir) & PROD_CONS_MASK; + outring = p->ip_outring; + + /* Maintain a 1-entry red-zone. The ring buffer is full when + * (cons - prod) % ring_size is 1. Rather than do this subtraction + * in the body of the loop, I'll do it now. + */ + cons_ptr = (cons_ptr - (int) sizeof(struct ring_entry)) & PROD_CONS_MASK; + + total = 0; + /* Stuff the bytes into the output */ + while ((prod_ptr != cons_ptr) && (len > 0)) { + int x; + + /* Go 4 bytes (one ring entry) at a time */ + entry = (struct ring_entry*) ((caddr_t)outring + prod_ptr); + + /* Invalidate all entries */ + entry->ring_allsc = 0; + + /* Copy in some bytes */ + for(x = 0; (x < 4) && (len > 0); x++) { + entry->ring_data[x] = *buf++; + entry->ring_sc[x] = IOC4_TXCB_VALID; + len--; + total++; + } + + DEBUGINC(tx_buf_used, x); + DEBUGINC(tx_buf_cnt, 1); + + /* If we are within some small threshold of filling up the entire + * ring buffer, we must place an EXPLICIT intr here to generate + * a lowat interrupt in case we subsequently really do fill up + * the ring and the caller goes to sleep. No need to place + * more than one though. + */ + if (!(p->ip_flags & LOWAT_WRITTEN) && + ((cons_ptr - prod_ptr) & PROD_CONS_MASK) <= + p->ip_tx_lowat * (int)sizeof(struct ring_entry)) { + p->ip_flags |= LOWAT_WRITTEN; + entry->ring_sc[0] |= IOC4_TXCB_INT_WHEN_DONE; + dprintf(("write placing TX_EXPLICIT\n")); + } + + /* Go on to next entry */ + prod_ptr = (prod_ptr + (int) sizeof(struct ring_entry)) & PROD_CONS_MASK; + } + + /* If we sent something, start DMA if necessary */ + if (total > 0 && !(p->ip_sscr & IOC4_SSCR_DMA_EN)) { + p->ip_sscr |= IOC4_SSCR_DMA_EN; + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + } + + /* Store the new producer pointer. If TX is disabled, we stuff the + * data into the ring buffer, but we don't actually start TX. + */ + if (!(p->ip_flags & TX_DISABLED)) { + PCI_OUTW(&p->ip_serial->stpir, prod_ptr); + + /* If we are now transmitting, enable TX_MT interrupt so we + * can disable DMA if necessary when the TX finishes. + */ + if (total > 0) + enable_intrs(p, H_INTR_TX_MT); + } + p->ip_tx_prod = prod_ptr; + + dprintf(("write port 0x%p, wrote %d\n", (void *)port, total)); + DEBUGINC(wrote_bytes, total); + return(total); +} + + +/* Asynchronous write */ +static int +ioc4_write(sioport_t *port, char *buf, int len) +{ +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_WRITE)); +#endif + return(do_ioc4_write(port, buf, len)); +} + + +/* Synchronous write */ +static int +ioc4_sync_write(sioport_t *port, char *buf, int len) +{ + int bytes; + + ASSERT(sio_port_islocked(port)); + bytes = do_ioc4_write(port, buf, len); + + /* Don't allow the system to hang if XOFF is in force */ + if (len > 0 && bytes == 0 && (LPORT(port)->ip_flags & TX_DISABLED)) + ioc4_enable_tx(port, 1); + + return(bytes); +} + + +/* Write flush */ +static void +ioc4_wrflush(sioport_t *port) +{ + ioc4port_t *p = LPORT(port); + + ASSERT(sio_port_islocked(port)); + + /* We can't flush if TX is disabled due to XOFF. */ + if (!(PCI_INW(&p->ip_ioc4->sio_ir) & IOC4_SIO_IR_S0_TX_MT) && + (p->ip_flags & TX_DISABLED)) + ioc4_enable_tx(port, 1); + + /* Spin waiting for TX_MT to assert only if DMA is enabled. If we + * are panicking and one of the other processors is already in + * symmon, DMA will be disabled and TX_MT will never be asserted. + * There may also be legitimate cases in the kernel where DMA is + * disabled and we won't flush correctly here. + */ + + while ((PCI_INW(&p->ip_serial->sscr) & (IOC4_SSCR_DMA_EN | + IOC4_SSCR_PAUSE_STATE)) == IOC4_SSCR_DMA_EN && + !(PCI_INW(&p->ip_ioc4->sio_ir) & IOC4_SIO_IR_S0_TX_MT)) { + udelay(5); + } +} + + +/* + * Set or clear break condition on output + */ +static int +ioc4_break(sioport_t *port, int brk) +{ + ioc4port_t *p = LPORT(port); + char lcr; + int spin_success; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_BREAK)); +#endif + + /* Pause the DMA interface if necessary */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) { + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr | IOC4_SSCR_DMA_PAUSE); + SPIN((PCI_INW(&p->ip_serial->sscr) & IOC4_SSCR_PAUSE_STATE) == 0, + spin_success); + if (!spin_success) + return(-1); + } + + lcr = PCI_INB(&p->ip_uart->i4u_lcr); + if (brk) { + /* Set break */ + PCI_OUTB(&p->ip_uart->i4u_lcr, lcr | LCR_SNDBRK); + } + else { + /* Clear break */ + PCI_OUTB(&p->ip_uart->i4u_lcr, lcr & ~LCR_SNDBRK); + } + + /* Re-enable the DMA interface if necessary */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) { + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + } + + dprintf(("break port 0x%p, brk %d\n", (void *)port, brk)); + + return(0); +} + + +static int +ioc4_enable_tx(sioport_t *port, int enb) +{ + ioc4port_t *p = LPORT(port); + struct hooks *hooks = p->ip_hooks; + int spin_success; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_ENABLE_TX)); +#endif + + /* If we're already in the desired state, we're done */ + if ((enb && !(p->ip_flags & TX_DISABLED)) || + (!enb && (p->ip_flags & TX_DISABLED))) + return(0); + + /* Pause DMA */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) { + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr | IOC4_SSCR_DMA_PAUSE); + SPIN((PCI_INW(&p->ip_serial->sscr) & IOC4_SSCR_PAUSE_STATE) == 0, + spin_success); + if (!spin_success) + return(-1); + } + + if (enb) { + p->ip_flags &= ~TX_DISABLED; + PCI_OUTW(&p->ip_serial->stpir, p->ip_tx_prod); + enable_intrs(p, H_INTR_TX_MT); + } + else { + ioc4reg_t txcons = PCI_INW(&p->ip_serial->stcir) & PROD_CONS_MASK; + p->ip_flags |= TX_DISABLED; + disable_intrs(p, H_INTR_TX_MT); + + /* Only move the transmit producer pointer back if the + * transmitter is not already empty, otherwise we'll be + * generating a bogus entry. + */ + if (txcons != p->ip_tx_prod) + PCI_OUTW(&p->ip_serial->stpir, + (txcons + (int) sizeof(struct ring_entry)) & PROD_CONS_MASK); + } + + /* Re-enable the DMA interface if necessary */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + + return(0); +} + + +/* + * Read in bytes from the hardware. Return the number of bytes + * actually read. + */ +static int +ioc4_read(sioport_t *port, char *buf, int len) +{ + int prod_ptr, cons_ptr, total, x, spin_success; + struct ring *inring; + ioc4port_t *p = LPORT(port); + struct hooks *hooks = p->ip_hooks; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_READ)); +#endif + + dprintf(("read port 0x%p, len %d\n", (void *)port, len)); + + DEBUGINC(read_bytes, len); + DEBUGINC(read_cnt, 1); + + ASSERT(len >= 0); + + /* There is a nasty timing issue in the IOC4. When the RX_TIMER + * expires or the RX_HIGH condition arises, we take an interrupt. + * At some point while servicing the interrupt, we read bytes from + * the ring buffer and re-arm the RX_TIMER. However the RX_TIMER is + * not started until the first byte is received *after* it is armed, + * and any bytes pending in the RX construction buffers are not drained + * to memory until either there are 4 bytes available or the RX_TIMER + * expires. This leads to a potential situation where data is left + * in the construction buffers forever because 1 to 3 bytes were received + * after the interrupt was generated but before the RX_TIMER was re-armed. + * At that point as long as no subsequent bytes are received the + * timer will never be started and the bytes will remain in the + * construction buffer forever. The solution is to execute a DRAIN + * command after rearming the timer. This way any bytes received before + * the DRAIN will be drained to memory, and any bytes received after + * the DRAIN will start the TIMER and be drained when it expires. + * Luckily, this only needs to be done when the DMA buffer is empty + * since there is no requirement that this function return all + * available data as long as it returns some. + */ + /* Re-arm the timer */ + PCI_OUTW(&p->ip_serial->srcir, p->ip_rx_cons | IOC4_SRCIR_ARM); + + prod_ptr = PCI_INW(&p->ip_serial->srpir) & PROD_CONS_MASK; + cons_ptr = p->ip_rx_cons; + + if (prod_ptr == cons_ptr) { + int reset_dma = 0; + + /* Input buffer appears empty, do a flush. */ + + /* DMA must be enabled for this to work. */ + if (!(p->ip_sscr & IOC4_SSCR_DMA_EN)) { + p->ip_sscr |= IOC4_SSCR_DMA_EN; + reset_dma = 1; + } + + /* Potential race condition: we must reload the srpir after + * issuing the drain command, otherwise we could think the RX + * buffer is empty, then take a very long interrupt, and when + * we come back it's full and we wait forever for the drain to + * complete. + */ + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr | IOC4_SSCR_RX_DRAIN); + prod_ptr = PCI_INW(&p->ip_serial->srpir) & PROD_CONS_MASK; + + DEBUGINC(drain, 1); + + /* We must not wait for the DRAIN to complete unless there are + * at least 8 bytes (2 ring entries) available to receive the data + * otherwise the DRAIN will never complete and we'll deadlock here. + * In fact, to make things easier, I'll just ignore the flush if + * there is any data at all now available. + */ + if (prod_ptr == cons_ptr) { + DEBUGINC(drainwait, 1); + SPIN(PCI_INW(&p->ip_serial->sscr) & IOC4_SSCR_RX_DRAIN, spin_success); + if (!spin_success) + return(-1); + + /* SIGH. We have to reload the prod_ptr *again* since + * the drain may have caused it to change + */ + prod_ptr = PCI_INW(&p->ip_serial->srpir) & PROD_CONS_MASK; + } + + if (reset_dma) { + DEBUGINC(resetdma, 1); + p->ip_sscr &= ~IOC4_SSCR_DMA_EN; + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + } + } + inring = p->ip_inring; + + p->ip_flags &= ~READ_ABORTED; + + total = 0; + /* Grab bytes from the hardware */ + while(prod_ptr != cons_ptr && len > 0) { + struct ring_entry *entry; + + entry = (struct ring_entry *) ((caddr_t)inring + cons_ptr); + + /* According to the producer pointer, this ring entry + * must contain some data. But if the PIO happened faster + * than the DMA, the data may not be available yet, so let's + * wait until it arrives. + */ + if ((((volatile struct ring_entry *) entry)->ring_allsc & + RING_ANY_VALID) == 0) { + + /* Indicate the read is aborted so we don't disable + * the interrupt thinking that the consumer is + * congested. + */ + p->ip_flags |= READ_ABORTED; + + DEBUGINC(read_aborted, 1); + len = 0; + break; + + } + + /* Load the bytes/status out of the ring entry */ + for(x = 0; x < 4 && len > 0; x++) { + char *sc = &(entry->ring_sc[x]); + + /* Check for change in modem state or overrun */ + if (*sc & IOC4_RXSB_MODEM_VALID) { + if (p->ip_notify & N_DDCD) { + + /* Notify upper layer if DCD dropped */ + if ((p->ip_flags & DCD_ON) && !(*sc & IOC4_RXSB_DCD)) { + + /* If we have already copied some data, return + * it. We'll pick up the carrier drop on the next + * pass. That way we don't throw away the data + * that has already been copied back to the caller's + * buffer. + */ + if (total > 0) { + len = 0; + break; + } + + p->ip_flags &= ~DCD_ON; + + /* Turn off this notification so the carrier + * drop protocol won't see it again when it + * does a read. + */ + *sc &= ~IOC4_RXSB_MODEM_VALID; + + /* To keep things consistent, we need to update + * the consumer pointer so the next reader won't + * come in and try to read the same ring entries + * again. This must be done here before the call + * to UP_DDCD since UP_DDCD may do a recursive + * read! + */ + if ((entry->ring_allsc & RING_ANY_VALID) == 0) + cons_ptr = + (cons_ptr + (int) sizeof(struct ring_entry)) & + PROD_CONS_MASK; + + PCI_OUTW(&p->ip_serial->srcir, cons_ptr); + p->ip_rx_cons = cons_ptr; + + /* Notify upper layer of carrier drop */ + if (p->ip_notify & N_DDCD) + UP_DDCD(port, 0); + + DEBUGINC(read_ddcd, 1); + + /* If we had any data to return, we would have + * returned it above. + */ + return(0); + } + } + + /* Notify upper layer that an input overrun occurred */ + if ((*sc & IOC4_RXSB_OVERRUN) && (p->ip_notify & N_OVERRUN_ERROR)) { + DEBUGINC(rx_overrun, 1); + UP_NCS(port, NCS_OVERRUN); + } + + /* Don't look at this byte again */ + *sc &= ~IOC4_RXSB_MODEM_VALID; + } + + /* Check for valid data or RX errors */ + if (*sc & IOC4_RXSB_DATA_VALID) { + if ((*sc & (IOC4_RXSB_PAR_ERR | IOC4_RXSB_FRAME_ERR | + IOC4_RXSB_BREAK)) && + (p->ip_notify & (N_PARITY_ERROR | N_FRAMING_ERROR | N_BREAK))) { + + /* There is an error condition on the next byte. If + * we have already transferred some bytes, we'll stop + * here. Otherwise if this is the first byte to be read, + * we'll just transfer it alone after notifying the + * upper layer of its status. + */ + if (total > 0) { + len = 0; + break; + } + else { + if ((*sc & IOC4_RXSB_PAR_ERR) && + (p->ip_notify & N_PARITY_ERROR)) { + DEBUGINC(parity, 1); + UP_NCS(port, NCS_PARITY); + } + + if ((*sc & IOC4_RXSB_FRAME_ERR) && + (p->ip_notify & N_FRAMING_ERROR)) { + DEBUGINC(framing, 1); + UP_NCS(port, NCS_FRAMING); + } + + if ((*sc & IOC4_RXSB_BREAK) && + (p->ip_notify & N_BREAK)) { + DEBUGINC(brk, 1); + UP_NCS(port, NCS_BREAK); + } + len = 1; + } + } + + *sc &= ~IOC4_RXSB_DATA_VALID; + *buf++ = entry->ring_data[x]; + len--; + total++; + } + } + + DEBUGINC(rx_buf_used, x); + DEBUGINC(rx_buf_cnt, 1); + + /* If we used up this entry entirely, go on to the next one, + * otherwise we must have run out of buffer space, so + * leave the consumer pointer here for the next read in case + * there are still unread bytes in this entry. + */ + if ((entry->ring_allsc & RING_ANY_VALID) == 0) + cons_ptr = (cons_ptr + (int) sizeof(struct ring_entry)) & + PROD_CONS_MASK; + } + + /* Update consumer pointer and re-arm RX timer interrupt */ + PCI_OUTW(&p->ip_serial->srcir, cons_ptr); + p->ip_rx_cons = cons_ptr; + + /* If we have now dipped below the RX high water mark and we have + * RX_HIGH interrupt turned off, we can now turn it back on again. + */ + if ((p->ip_flags & INPUT_HIGH) && + (((prod_ptr - cons_ptr) & PROD_CONS_MASK) < + ((p->ip_sscr & IOC4_SSCR_RX_THRESHOLD) << IOC4_PROD_CONS_PTR_OFF))) { + p->ip_flags &= ~INPUT_HIGH; + enable_intrs(p, H_INTR_RX_HIGH); + } + + DEBUGINC(red_bytes, total); + + return(total); +} + + +/* + * Modify event notification + */ +static int +ioc4_notification(sioport_t *port, int mask, int on) +{ + ioc4port_t *p = LPORT(port); + struct hooks *hooks = p->ip_hooks; + ioc4reg_t intrbits, sscrbits; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_NOTIFICATION)); +#endif + ASSERT(mask); + + intrbits = sscrbits = 0; + + if (mask & N_DATA_READY) + intrbits |= (H_INTR_RX_TIMER | H_INTR_RX_HIGH); + if (mask & N_OUTPUT_LOWAT) + intrbits |= H_INTR_TX_EXPLICIT; + if (mask & N_DDCD) { + intrbits |= H_INTR_DELTA_DCD; + sscrbits |= IOC4_SSCR_RX_RING_DCD; + } + if (mask & N_DCTS) + intrbits |= H_INTR_DELTA_CTS; + + if (on) { + enable_intrs(p, intrbits); + p->ip_notify |= mask; + p->ip_sscr |= sscrbits; + } + else { + disable_intrs(p, intrbits); + p->ip_notify &= ~mask; + p->ip_sscr &= ~sscrbits; + } + + /* We require DMA if either DATA_READY or DDCD notification is + * currently requested. If neither of these is requested and + * there is currently no TX in progress, DMA may be disabled. + */ + if (p->ip_notify & (N_DATA_READY | N_DDCD)) + p->ip_sscr |= IOC4_SSCR_DMA_EN; + else if (!(p->ip_ienb & H_INTR_TX_MT)) + p->ip_sscr &= ~IOC4_SSCR_DMA_EN; + + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + return(0); +} + + +/* + * Set RX timeout and threshold values. The upper layer passes in a + * timeout value. In all cases it would like to be notified at least this + * often when there are RX chars coming in. We set the RX timeout and + * RX threshold (based on baud) to ensure that the upper layer is called + * at roughly this interval during normal RX. + * The input timeout value is in ticks. + */ +static int +ioc4_rx_timeout(sioport_t *port, int timeout) +{ + int threshold; + ioc4port_t *p = LPORT(port); + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_RX_TIMEOUT)); +#endif + + p->ip_rx_timeout = timeout; + + /* Timeout is in ticks. Let's figure out how many chars we + * can receive at the current baud rate in that interval + * and set the RX threshold to that amount. There are 4 chars + * per ring entry, so we'll divide the number of chars that will + * arrive in timeout by 4. + */ + threshold = timeout * p->ip_baud / 10 / HZ / 4; + if (threshold == 0) + threshold = 1; /* otherwise we'll intr all the time! */ + + if ((unsigned) threshold > (unsigned) IOC4_SSCR_RX_THRESHOLD) + return(1); + + p->ip_sscr &= ~IOC4_SSCR_RX_THRESHOLD; + p->ip_sscr |= threshold; + + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + + /* Now set the RX timeout to the given value */ + timeout = timeout * IOC4_SRTR_HZ / HZ; + if (timeout > IOC4_SRTR_CNT) + timeout = IOC4_SRTR_CNT; + + PCI_OUTW(&p->ip_serial->srtr, timeout); + + return(0); +} + + +static int +set_DTRRTS(sioport_t *port, int val, int mask1, int mask2) +{ + ioc4port_t *p = LPORT(port); + ioc4reg_t shadow; + int spin_success; + char mcr; + + /* XXX need lock for pretty much this entire routine. Makes + * me nervous to hold it for so long. If we crash or hit + * a breakpoint in here, we're hosed. + */ + + /* Pause the DMA interface if necessary */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) { + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr | IOC4_SSCR_DMA_PAUSE); + SPIN((PCI_INW(&p->ip_serial->sscr) & IOC4_SSCR_PAUSE_STATE) == 0, + spin_success); + if (!spin_success) + return(-1); + } + + shadow = PCI_INW(&p->ip_serial->shadow); + mcr = (shadow & 0xff000000) >> 24; + + /* Set new value */ + if (val) { + mcr |= mask1; + shadow |= mask2; + } + else { + mcr &= ~mask1; + shadow &= ~mask2; + } + + PCI_OUTB(&p->ip_uart->i4u_mcr, mcr); + + PCI_OUTW(&p->ip_serial->shadow, shadow); + + /* Re-enable the DMA interface if necessary */ + if (p->ip_sscr & IOC4_SSCR_DMA_EN) + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + + return(0); +} + + +static int +ioc4_set_DTR(sioport_t *port, int dtr) +{ +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_SET_DTR)); +#endif + + dprintf(("set dtr port 0x%p, dtr %d\n", (void *)port, dtr)); + return(set_DTRRTS(port, dtr, MCR_DTR, IOC4_SHADOW_DTR)); +} + + +static int +ioc4_set_RTS(sioport_t *port, int rts) +{ +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_SET_RTS)); +#endif + + dprintf(("set rts port 0x%p, rts %d\n", (void *)port, rts)); + return(set_DTRRTS(port, rts, MCR_RTS, IOC4_SHADOW_RTS)); +} + + +static int +ioc4_query_DCD(sioport_t *port) +{ + ioc4port_t *p = LPORT(port); + ioc4reg_t shadow; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_QUERY_DCD)); +#endif + + dprintf(("get dcd port 0x%p\n", (void *)port)); + + shadow = PCI_INW(&p->ip_serial->shadow); + + return(shadow & IOC4_SHADOW_DCD); +} + + +static int +ioc4_query_CTS(sioport_t *port) +{ + ioc4port_t *p = LPORT(port); + ioc4reg_t shadow; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_QUERY_CTS)); +#endif + + dprintf(("get cts port 0x%p\n", (void *)port)); + + shadow = PCI_INW(&p->ip_serial->shadow); + + return(shadow & IOC4_SHADOW_CTS); +} + + +static int +ioc4_set_proto(sioport_t *port, enum sio_proto proto) +{ + ioc4port_t *p = LPORT(port); + struct hooks *hooks = p->ip_hooks; + +#ifdef NOT_YET + ASSERT(L_LOCKED(port, L_SET_PROTOCOL)); +#endif + + switch(proto) { + case PROTO_RS232: + /* Clear the appropriate GIO pin */ + PCI_OUTW((&p->ip_ioc4->gppr_0 + H_RS422), 0); + break; + + case PROTO_RS422: + /* Set the appropriate GIO pin */ + PCI_OUTW((&p->ip_ioc4->gppr_0 + H_RS422), 1); + break; + + default: + return(1); + } + + return(0); +} + + +// #define IS_PORT_0(p) ((p)->ip_hooks == &hooks_array[0]) + +static int +ioc4_get_mapid(sioport_t *port, void *arg) +{ + return(0); +} + + +static int +ioc4_set_sscr(sioport_t *port, int arg, int flag) +{ + ioc4port_t *p = LPORT(port); + + if ( flag ) { /* reset arg bits in p->ip_sscr */ + p->ip_sscr &= ~arg; + } else { /* set bits in p->ip_sscr */ + p->ip_sscr |= arg; + } + PCI_OUTW(&p->ip_serial->sscr, p->ip_sscr); + return(p->ip_sscr); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/klconflib.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/klconflib.c --- linux-2.4.22/arch/ia64/sn/io/sn2/klconflib.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/klconflib.c 2003-10-22 22:49:21.000000000 +0000 @@ -39,7 +39,7 @@ static int hasmetarouter; -char brick_types[MAX_BRICK_TYPES + 1] = "crikxdpn%#=012345"; +char brick_types[MAX_BRICK_TYPES + 1] = "crikxdpn%#=vo2345"; lboard_t * find_lboard(lboard_t *start, unsigned char brd_type) @@ -278,6 +278,8 @@ board_name = EDGE_LBL_XBRICK; else if (brd->brd_type == KLTYPE_PEBRICK) board_name = EDGE_LBL_PEBRICK; + else if (brd->brd_type == KLTYPE_OPUSBRICK) + board_name = EDGE_LBL_OPUSBRICK; else if (brd->brd_type == KLTYPE_CGBRICK) board_name = EDGE_LBL_CGBRICK; else @@ -293,23 +295,6 @@ sprintf(path, EDGE_LBL_MODULE "/%s/" EDGE_LBL_SLAB "/%d/%s", buffer, geo_slab(brd->brd_geoid), board_name); } -/* - * Get the module number for a NASID. - */ -moduleid_t -get_module_id(nasid_t nasid) -{ - lboard_t *brd; - - brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); - - if (!brd) - return INVALID_MODULE; - else - return geo_module(brd->brd_geoid); -} - - #define MHZ 1000000 @@ -419,7 +404,13 @@ strcpy(serial_number,""); switch(KLCLASS(board->brd_type)) { case KLCLASS_CPU: { /* Node board */ - klhub_t *hub; + klhub_t *hub; + + if (board->brd_type == KLTYPE_TIO) { + printk("*****board_serial_number_get: Need to support TIO.*****\n"); + strcpy(serial_number,""); + return(0); + } /* Get the hub component information */ hub = (klhub_t *)find_first_component(board, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/klgraph.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/klgraph.c --- linux-2.4.22/arch/ia64/sn/io/sn2/klgraph.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/klgraph.c 2003-10-22 22:47:34.000000000 +0000 @@ -42,6 +42,7 @@ extern char arg_maxnodes[]; extern u64 klgraph_addr[]; void mark_cpuvertex_as_cpu(vertex_hdl_t vhdl, cpuid_t cpuid); +extern int is_specified(char *); /* @@ -54,7 +55,7 @@ { invent_generic_t *invent; - invent = kern_malloc(size); + invent = kmalloc(size, GFP_KERNEL); if (!invent) return NULL; invent->ig_module = NODE_MODULEID(cnode); @@ -205,6 +206,30 @@ /* ARGSUSED */ void +klhwg_add_ice(vertex_hdl_t node_vertex, klhub_t *hub, cnodeid_t cnode) +{ + vertex_hdl_t myicev; + vertex_hdl_t ice_mon; + int rc; + extern struct file_operations shub_mon_fops; + + (void) hwgraph_path_add(node_vertex, EDGE_LBL_ICE, &myicev); + + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, myicev, NULL, "Created path for ice vertex for TIO node.\n")); + + rc = device_master_set(myicev, node_vertex); + if (rc) + panic("klhwg_add_ice: Unable to create ice vertex.\n"); + + ice_mon = hwgraph_register(myicev, EDGE_LBL_PERFMON, + 0, DEVFS_FL_AUTO_DEVNUM, + 0, 0, + S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, 0, 0, + &shub_mon_fops, (void *)(long)cnode); +} + +/* ARGSUSED */ +void klhwg_add_hub(vertex_hdl_t node_vertex, klhub_t *hub, cnodeid_t cnode) { vertex_hdl_t myhubv; @@ -214,7 +239,13 @@ GRPRINTF(("klhwg_add_hub: adding %s\n", EDGE_LBL_HUB)); (void) 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")); + rc = device_master_set(myhubv, node_vertex); + if (rc) + panic("klhwg_add_hub: Unable to create hub vertex.\n"); + hub_mon = hwgraph_register(myhubv, EDGE_LBL_PERFMON, 0, DEVFS_FL_AUTO_DEVNUM, 0, 0, @@ -237,6 +268,8 @@ sprintf(name, "%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")); + mark_cpuvertex_as_cpu(my_cpu, cpu_id); device_master_set(my_cpu, node_vertex); @@ -264,6 +297,9 @@ GRPRINTF(("klhwg_add_cpu: adding %s to vertex 0x%p\n", name, node_vertex)); (void) hwgraph_path_add(node_vertex, name, &my_cpu); + + 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); @@ -271,6 +307,7 @@ if (hwgraph_edge_get(node_vertex, EDGE_LBL_CPU, &cpu_dir) == GRAPH_SUCCESS) { sprintf(name, "%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)); } klhwg_cpu_invent_info(my_cpu, cnode, cpu); @@ -278,6 +315,41 @@ void +klhwg_add_coretalk(cnodeid_t cnode, nasid_t tio_nasid) +{ + lboard_t *brd; + vertex_hdl_t coretalk_v, icev; + /*REFERENCED*/ + graph_error_t err; + + if ((brd = find_lboard((lboard_t *)KL_CONFIG_INFO(tio_nasid), KLTYPE_IOBRICK_XBOW)) == NULL) + return; + + if (KL_CONFIG_DUPLICATE_BOARD(brd)) + return; + + icev = cnodeid_to_vertex(cnode); + + err = hwgraph_path_add(icev, EDGE_LBL_CORETALK, &coretalk_v); + if (err != GRAPH_SUCCESS) { + if (err == GRAPH_DUP) + printk(KERN_WARNING "klhwg_add_coretalk: Check for " + "working routers and router links!"); + + panic("klhwg_add_coretalkk: Failed to add " + "edge: vertex 0x%p to vertex 0x%p," + "error %d\n", + (void *)icev, (void *)coretalk_v, err); + } + + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, coretalk_v, NULL, "Created coretalk path for TIO node.\n")); + + NODEPDA(cnode)->xbow_vhdl = coretalk_v; + +} + + +void klhwg_add_xbow(cnodeid_t cnode, nasid_t nasid) { lboard_t *brd; @@ -295,9 +367,6 @@ if (KL_CONFIG_DUPLICATE_BOARD(brd)) return; - GRPRINTF(("klhwg_add_xbow: adding cnode %d nasid %d xbow edges\n", - cnode, nasid)); - if ((xbow_p = (klxbow_t *)find_component(brd, NULL, KLSTRUCT_XBOW)) == NULL) return; @@ -326,11 +395,14 @@ printk(KERN_WARNING "klhwg_add_xbow: Check for " "working routers and router links!"); - PRINT_PANIC("klhwg_add_xbow: Failed to add " + panic("klhwg_add_xbow: Failed to add " "edge: vertex 0x%p to vertex 0x%p," "error %d\n", (void *)hubv, (void *)xbow_v, err); } + + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, xbow_v, NULL, "Created path for xtalk.\n")); + xswitch_vertex_init(xbow_v); NODEPDA(hub_cnode)->xbow_vhdl = xbow_v; @@ -345,14 +417,71 @@ hub_nasid; } - GRPRINTF(("klhwg_add_xbow: adding port nasid %d %s to vertex 0x%p\n", - hub_nasid, EDGE_LBL_XTALK, hubv)); } } /* ARGSUSED */ void +klhwg_add_tionode(vertex_hdl_t hwgraph_root, cnodeid_t cnode) +{ + nasid_t tio_nasid; + lboard_t *brd; + klhub_t *hub; + vertex_hdl_t node_vertex = NULL; + char path_buffer[100]; + int rv; + char *s; + int board_disabled = 0; + + tio_nasid = COMPACT_TO_NASID_NODEID(cnode); + brd = find_lboard((lboard_t *)KL_CONFIG_INFO(tio_nasid), KLTYPE_TIO); + ASSERT(brd); + + /* Generate a hardware graph path for this board. */ + board_to_path(brd, path_buffer); + rv = hwgraph_path_add(hwgraph_root, path_buffer, &node_vertex); + if (rv != GRAPH_SUCCESS) + panic("TIO Node vertex creation failed. " + "Path == %s", path_buffer); + + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, node_vertex, NULL, "Created path for TIO node.\n")); + hub = (klhub_t *)find_first_component(brd, KLSTRUCT_HUB); + ASSERT(hub); + if(hub->hub_info.flags & KLINFO_ENABLE) + board_disabled = 0; + else + board_disabled = 1; + + if(!board_disabled) { + mark_nodevertex_as_node(node_vertex, + cnode + board_disabled * numionodes); + + s = dev_to_name(node_vertex, path_buffer, sizeof(path_buffer)); + NODEPDA(cnode)->hwg_node_name = + kmalloc(strlen(s) + 1, + GFP_KERNEL); + ASSERT_ALWAYS(NODEPDA(cnode)->hwg_node_name != NULL); + strcpy(NODEPDA(cnode)->hwg_node_name, s); + + hubinfo_set(node_vertex, NODEPDA(cnode)->pdinfo); + + /* Set up node board's slot */ + NODEPDA(cnode)->slotdesc = brd->brd_slot; + + /* Set up the module we're in */ + NODEPDA(cnode)->geoid = brd->brd_geoid; + NODEPDA(cnode)->module = module_lookup(geo_module(brd->brd_geoid)); + } + + if(!board_disabled) + klhwg_add_ice(node_vertex, hub, cnode); + +} + + +/* ARGSUSED */ +void klhwg_add_node(vertex_hdl_t hwgraph_root, cnodeid_t cnode) { nasid_t nasid; @@ -367,8 +496,6 @@ nasid = COMPACT_TO_NASID_NODEID(cnode); brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); - GRPRINTF(("klhwg_add_node: Adding cnode %d, nasid %d, brd 0x%p\n", - cnode, nasid, brd)); ASSERT(brd); do { @@ -376,16 +503,11 @@ /* Generate a hardware graph path for this board. */ board_to_path(brd, path_buffer); - - GRPRINTF(("klhwg_add_node: adding %s to vertex 0x%p\n", - path_buffer, hwgraph_root)); rv = hwgraph_path_add(hwgraph_root, path_buffer, &node_vertex); - if (rv != GRAPH_SUCCESS) - PRINT_PANIC("Node vertex creation failed. " - "Path == %s", - path_buffer); + panic("Node vertex creation failed. Path == %s", path_buffer); + 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) @@ -427,6 +549,8 @@ rv = hwgraph_path_add(node_vertex, EDGE_LBL_CPU, &cpu_dir); if (rv != GRAPH_SUCCESS) panic("klhwg_add_node: Cannot create CPU directory\n"); + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, cpu_dir, NULL, "Created cpu directiry on SHUB node.\n")); + } /* Add each CPU */ @@ -467,48 +591,34 @@ for (cnode = 0; cnode < numnodes; cnode++) { nasid = COMPACT_TO_NASID_NODEID(cnode); - - GRPRINTF(("klhwg_add_all_routers: adding router on cnode %d\n", - cnode)); - brd = find_lboard_class((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_ROUTER); - if (!brd) /* No routers stored in this node's memory */ continue; do { ASSERT(brd); - GRPRINTF(("Router board struct is %p\n", brd)); /* Don't add duplicate boards. */ if (brd->brd_flags & DUPLICATE_BOARD) continue; - GRPRINTF(("Router 0x%p module number is %d\n", brd, brd->brd_geoid)); /* Generate a hardware graph path for this board. */ board_to_path(brd, path_buffer); - GRPRINTF(("Router path is %s\n", path_buffer)); - /* Add the router */ - GRPRINTF(("klhwg_add_all_routers: adding %s to vertex 0x%p\n", - path_buffer, hwgraph_root)); rv = hwgraph_path_add(hwgraph_root, path_buffer, &node_vertex); - if (rv != GRAPH_SUCCESS) - PRINT_PANIC("Router vertex creation " + panic("Router vertex creation " "failed. Path == %s", path_buffer); - GRPRINTF(("klhwg_add_all_routers: get next board from 0x%p\n", - brd)); + 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), KLTYPE_ROUTER)) ); - - GRPRINTF(("klhwg_add_all_routers: Done.\n")); } } @@ -527,13 +637,8 @@ int port; lboard_t *dest_brd; - GRPRINTF(("klhwg_connect_one_router: Connecting router on cnode %d\n", - cnode)); - /* Don't add duplicate boards. */ if (brd->brd_flags & DUPLICATE_BOARD) { - GRPRINTF(("klhwg_connect_one_router: Duplicate router 0x%p on cnode %d\n", - brd, cnode)); return; } @@ -550,7 +655,7 @@ /* We don't know what to do with multiple router components */ if (brd->brd_numcompts != 1) { - PRINT_PANIC("klhwg_connect_one_router: %d cmpts on router\n", + panic("klhwg_connect_one_router: %d cmpts on router\n", brd->brd_numcompts); return; } @@ -584,15 +689,12 @@ if (rc != GRAPH_SUCCESS) { if (is_specified(arg_maxnodes) && KL_CONFIG_DUPLICATE_BOARD(dest_brd)) continue; - PRINT_PANIC("Can't find router: %s", dest_path); + panic("Can't find router: %s", dest_path); } - GRPRINTF(("klhwg_connect_one_router: Link from %s/%d to %s\n", - path_buffer, port, dest_path)); sprintf(dest_path, "%d", port); rc = hwgraph_edge_add(router_hndl, dest_hndl, dest_path); - if (rc == GRAPH_DUP) { GRPRINTF(("Skipping port %d. nasid %d %s/%s\n", port, router->rou_port[port].port_nasid, @@ -601,8 +703,10 @@ } if (rc != GRAPH_SUCCESS && !is_specified(arg_maxnodes)) - PRINT_PANIC("Can't create edge: %s/%s to vertex 0x%p error 0x%x\n", + panic("Can't create edge: %s/%s to vertex 0x%p error 0x%x\n", path_buffer, dest_path, (void *)dest_hndl, rc); + + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, router_hndl, dest_hndl, "Created edge %s from vhdl1 to vhdl2.\n", dest_path)); } } @@ -656,14 +760,16 @@ graph_error_t rc; int port; - for (cnode = 0; cnode < numnodes; cnode++) { + for (cnode = 0; cnode < numionodes; cnode++) { nasid = COMPACT_TO_NASID_NODEID(cnode); - GRPRINTF(("klhwg_connect_hubs: Connecting hubs on cnode %d\n", - cnode)); - - brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); - ASSERT(brd); + if (!(nasid & 1)) { + brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_SNIA); + ASSERT(brd); + } else { + brd = find_lboard((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_TIO); + ASSERT(brd); + } hub = (klhub_t *)find_first_component(brd, KLSTRUCT_HUB); ASSERT(hub); @@ -680,10 +786,7 @@ /* Generate a hardware graph path for this board. */ board_to_path(brd, path_buffer); - - GRPRINTF(("klhwg_connect_hubs: Hub path is %s.\n", path_buffer)); rc = hwgraph_traverse(hwgraph_root, path_buffer, &hub_hndl); - if (rc != GRAPH_SUCCESS) printk(KERN_WARNING "Can't find hub: %s", path_buffer); @@ -699,7 +802,7 @@ if (rc != GRAPH_SUCCESS) { if (is_specified(arg_maxnodes) && KL_CONFIG_DUPLICATE_BOARD(dest_brd)) continue; - PRINT_PANIC("Can't find board: %s", dest_path); + panic("Can't find board: %s", dest_path); } else { char buf[1024]; @@ -708,13 +811,18 @@ path_buffer, dest_path)); rc = hwgraph_path_add(hub_hndl, EDGE_LBL_INTERCONNECT, &hub_hndl); + + 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)); + if (rc != GRAPH_SUCCESS) - PRINT_PANIC("Can't create edge: %s/%s to vertex 0x%p, error 0x%x\n", + panic("Can't create edge: %s/%s to vertex 0x%p, error 0x%x\n", path_buffer, dest_path, (void *)dest_hndl, rc); } @@ -806,7 +914,8 @@ rc = hwgraph_path_add(hwgraph_root, name, &module_vhdl); ASSERT(rc == GRAPH_SUCCESS); - rc = rc; + rc = rc; /* Shut the compiler up */ + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, module_vhdl, NULL, "Created module path.\n")); hwgraph_fastinfo_set(module_vhdl, (arbitrary_info_t) modules[cm]); @@ -816,12 +925,13 @@ buffer); rc = hwgraph_path_add(hwgraph_root, name, &vhdl); - ASSERT_ALWAYS(rc == GRAPH_SUCCESS); - rc = rc; + ASSERT_ALWAYS(rc == GRAPH_SUCCESS); + rc = rc; /* Shut the compiler up */ + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, vhdl, NULL, "Created L1 path.\n")); hwgraph_info_add_LBL(vhdl, INFO_LBL_ELSC, - (arbitrary_info_t) (__psint_t) 1); + (arbitrary_info_t) (int64_t) 1); } } @@ -835,10 +945,18 @@ klhwg_add_node(hwgraph_root, cnode); } + for (cnode = numnodes; cnode < numionodes; cnode++) { + klhwg_add_tionode(hwgraph_root, cnode); + } + for (cnode = 0; cnode < numnodes; cnode++) { klhwg_add_xbow(cnode, cnodeid_to_nasid(cnode)); } + for (cnode = numnodes; cnode < numionodes; cnode++) { + klhwg_add_coretalk(cnode, cnodeid_to_nasid(cnode)); + } + /* * As for router hardware inventory information, we set this * up in router.c. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/l1_command.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/l1_command.c --- linux-2.4.22/arch/ia64/sn/io/sn2/l1_command.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/l1_command.c 2003-10-22 22:48:00.000000000 +0000 @@ -60,8 +60,6 @@ *rack = (result & MODULE_RACK_MASK) >> MODULE_RACK_SHFT; *bay = (result & MODULE_BPOS_MASK) >> MODULE_BPOS_SHFT; *brick_type = (result & MODULE_BTYPE_MASK) >> MODULE_BTYPE_SHFT; - *brick_type = toupper(*brick_type); - return 0; } @@ -113,12 +111,16 @@ brick_type = MODULE_IXBRICK; break; case L1_BRICKTYPE_PX: brick_type = MODULE_PXBRICK; break; + case L1_BRICKTYPE_OPUS: + brick_type = MODULE_OPUSBRICK; break; case L1_BRICKTYPE_I: brick_type = MODULE_IBRICK; break; case L1_BRICKTYPE_P: brick_type = MODULE_PBRICK; break; case L1_BRICKTYPE_X: brick_type = MODULE_XBRICK; break; + case L1_BRICKTYPE_CHI_CG: + brick_type = MODULE_CGBRICK; break; } ret = RBT_TO_MODULE(rack, bay, brick_type); @@ -179,25 +181,31 @@ return("Unknown"); case L1_BRICKTYPE_X: - return("Xbrick"); + return(EDGE_LBL_XBRICK); case L1_BRICKTYPE_I: - return("Ibrick"); + return(EDGE_LBL_IBRICK); case L1_BRICKTYPE_P: - return("Pbrick"); + return(EDGE_LBL_PBRICK); case L1_BRICKTYPE_PX: - return("PXbrick"); + return(EDGE_LBL_PXBRICK); + + case L1_BRICKTYPE_OPUS: + return(EDGE_LBL_OPUSBRICK); case L1_BRICKTYPE_IX: - return("IXbrick"); + return(EDGE_LBL_IXBRICK); case L1_BRICKTYPE_C: return("Cbrick"); case L1_BRICKTYPE_R: return("Rbrick"); + + case L1_BRICKTYPE_CHI_CG: + return(EDGE_LBL_CGBRICK); } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/ml_SN_init.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ml_SN_init.c --- linux-2.4.22/arch/ia64/sn/io/sn2/ml_SN_init.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ml_SN_init.c 2003-10-22 22:49:19.000000000 +0000 @@ -25,49 +25,6 @@ extern xwidgetnum_t hub_widget_id(nasid_t); -extern void iograph_early_init(void); - -nasid_t master_nasid = INVALID_NASID; /* This is the partition master nasid */ -nasid_t master_baseio_nasid = INVALID_NASID; /* This is the master base I/O nasid */ - - -/* - * mlreset(void) - * very early machine reset - at this point NO interrupts have been - * enabled; nor is memory, tlb, p0, etc setup. - * - * slave is zero when mlreset is called for the master processor and - * is nonzero thereafter. - */ - - -void -mlreset(int slave) -{ - /* - * We are the master cpu and node. - */ - master_nasid = get_nasid(); - set_master_bridge_base(); - - /* We're the master processor */ - master_procid = smp_processor_id(); - master_nasid = cpuid_to_nasid(master_procid); - - /* - * master_nasid we get back better be same as one from - * get_nasid() - */ - ASSERT_ALWAYS(master_nasid == get_nasid()); - - /* early initialization of iograph */ - iograph_early_init(); - - /* Initialize Hub Pseudodriver Management */ - hubdev_init(); -} - - /* XXX - Move the meat of this to intr.c ? */ /* * Set up the platform-dependent fields in the nodepda. @@ -86,11 +43,9 @@ npda->pdinfo = (void *)hubinfo; hubinfo->h_nodepda = npda; hubinfo->h_cnodeid = node; - hubinfo->h_nasid = COMPACT_TO_NASID_NODEID(node); spin_lock_init(&hubinfo->h_crblock); - hubinfo->h_widgetid = hub_widget_id(hubinfo->h_nasid); npda->xbow_peer = INVALID_NASID; /* @@ -107,7 +62,22 @@ npda->npda_rip_last = &npda->npda_rip_first; npda->geoid.any.type = GEO_TYPE_INVALID; - mutex_init_locked(&npda->xbow_sema); /* init it locked? */ + init_MUTEX_LOCKED(&npda->xbow_sema); /* init it locked? */ +} + +void +init_platform_hubinfo(nodepda_t **nodepdaindr) { + cnodeid_t cnode; + hubinfo_t hubinfo; + nodepda_t *npda; + + for (cnode = 0; cnode < numionodes; cnode++) { + npda = nodepdaindr[cnode]; + hubinfo = (hubinfo_t)npda->pdinfo; + hubinfo->h_nasid = COMPACT_TO_NASID_NODEID(cnode); + /* For TIO the following returns -1 */ + hubinfo->h_widgetid = hub_widget_id(hubinfo->h_nasid); + } } void diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/ml_SN_intr.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ml_SN_intr.c --- linux-2.4.22/arch/ia64/sn/io/sn2/ml_SN_intr.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ml_SN_intr.c 2003-10-22 22:47:51.000000000 +0000 @@ -102,7 +102,7 @@ local5_config.sh_local_int5_config_regval = 0; local5_config.sh_local_int5_config_s.idx = SGI_UART_VECTOR; - local5_config.sh_local_int5_config_s.pid = cpu0; + local5_config.sh_local_int5_config_s.pid = cpu; HUB_S( (unsigned long *)GLOBAL_MMR_ADDR(nasid, SH_LOCAL_INT5_CONFIG), local5_config.sh_local_int5_config_regval); @@ -366,6 +366,7 @@ vertex_hdl_t pconn_vhdl; pcibr_soft_t pcibr_soft; int bit; + static cnodeid_t last_node = 0; /* SN2 + pcibr addressing limitation */ /* Due to this limitation, all interrupts from a given bridge must go to the name node.*/ @@ -413,18 +414,20 @@ if (candidate != CPU_NONE) { printk("Cannot target interrupt to target node (%ld).\n",candidate); - return CPU_NONE; } else { - /* printk("Cannot target interrupt to closest node (%d) 0x%p\n", - master_node_get(dev), (void *)owner_dev); */ + return CPU_NONE; + } else { + printk("Cannot target interrupt to closest node (0x%x) 0x%p\n", + master_node_get(dev), (void *)owner_dev); } // We couldn't put it on the closest node. Try to find another one. // Do a stupid round-robin assignment of the node. { - static cnodeid_t last_node = -1; + int i; + if (last_node >= numnodes) last_node = 0; - for (candidate_node = last_node + 1; candidate_node != last_node; candidate_node++) { + for (i = 0, candidate_node = last_node; i < numnodes; candidate_node++,i++) { if (candidate_node == numnodes) candidate_node = 0; cpuid = intr_bit_reserve_test(CPU_NONE, 0, @@ -435,6 +438,7 @@ name, resp_bit); if (cpuid != CPU_NONE) { + last_node = candidate_node + 1; return cpuid; } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/ml_iograph.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ml_iograph.c --- linux-2.4.22/arch/ia64/sn/io/sn2/ml_iograph.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/ml_iograph.c 2003-10-22 22:49:14.000000000 +0000 @@ -49,20 +49,20 @@ * xswitch vertex is created. */ typedef struct xswitch_vol_s { - mutex_t xswitch_volunteer_mutex; + struct semaphore xswitch_volunteer_mutex; int xswitch_volunteer_count; vertex_hdl_t xswitch_volunteer[NUM_XSWITCH_VOLUNTEER]; } *xswitch_vol_t; + void xswitch_vertex_init(vertex_hdl_t xswitch) { xswitch_vol_t xvolinfo; int rc; - extern void * snia_kmem_zalloc(size_t size, int flag); - xvolinfo = snia_kmem_zalloc(sizeof(struct xswitch_vol_s), GFP_KERNEL); - mutex_init(&xvolinfo->xswitch_volunteer_mutex); + xvolinfo = snia_kmem_zalloc(sizeof(struct xswitch_vol_s)); + init_MUTEX(&xvolinfo->xswitch_volunteer_mutex); rc = hwgraph_info_add_LBL(xswitch, INFO_LBL_XSWITCH_VOL, (arbitrary_info_t)xvolinfo); @@ -108,7 +108,7 @@ return; } - mutex_lock(&xvolinfo->xswitch_volunteer_mutex); + down(&xvolinfo->xswitch_volunteer_mutex); ASSERT(xvolinfo->xswitch_volunteer_count < NUM_XSWITCH_VOLUNTEER); xvolinfo->xswitch_volunteer[xvolinfo->xswitch_volunteer_count] = master; xvolinfo->xswitch_volunteer_count++; @@ -126,7 +126,7 @@ xvolinfo->xswitch_volunteer[1] = hubv; } } - mutex_unlock(&xvolinfo->xswitch_volunteer_mutex); + up(&xvolinfo->xswitch_volunteer_mutex); } extern int xbow_port_io_enabled(nasid_t nasid, int widgetnum); @@ -193,16 +193,16 @@ * hub that owned it in the prom. */ if (is_master_baseio_nasid_widget(nasid, widgetnum)) { - extern nasid_t get_master_baseio_nasid(void); + extern nasid_t snia_get_master_baseio_nasid(void); for (i=0; ixswitch_volunteer[i]; hubinfo_get(hubv, &hubinfo); nasid = hubinfo->h_nasid; - if (nasid == get_master_baseio_nasid()) + if (nasid == snia_get_master_baseio_nasid()) goto do_assignment; } - PRINT_PANIC("Nasid == %d, console nasid == %d", - nasid, get_master_baseio_nasid()); + panic("Nasid == %d, console nasid == %d", + nasid, snia_get_master_baseio_nasid()); } /* @@ -237,44 +237,12 @@ } /* - * Early iograph initialization. Called by master CPU in mlreset(). - * Useful for including iograph.o in kernel.o. - */ -void -iograph_early_init(void) -{ -/* - * Need new way to get this information .. - */ - cnodeid_t cnode; - nasid_t nasid; - lboard_t *board; - - /* - * Init. the board-to-hwgraph link early, so FRU analyzer - * doesn't trip on leftover values if we panic early on. - */ - for(cnode = 0; cnode < numnodes; cnode++) { - nasid = COMPACT_TO_NASID_NODEID(cnode); - board = (lboard_t *)KL_CONFIG_INFO(nasid); - DBG("iograph_early_init: Found board 0x%p\n", board); - - /* Check out all the board info stored on a node */ - while(board) { - board->brd_graph_link = GRAPH_VERTEX_NONE; - board = KLCF_NEXT(board); - DBG("iograph_early_init: Found board 0x%p\n", board); - } - } -} - -/* * Let boot processor know that we're done initializing our node's IO * and then exit. */ /* ARGSUSED */ static void -io_init_done(cnodeid_t cnodeid,cpu_cookie_t c) +io_init_done(cnodeid_t cnodeid,cpuid_t c) { /* Let boot processor know that we're done. */ } @@ -414,8 +382,8 @@ * If the current hub is not supposed to be the master * for this widgetnum, then skip this widget. */ - if (xswitch_info_master_assignment_get(xswitch_info, - widgetnum) != hubv) { + + if (xswitch_info_master_assignment_get(xswitch_info, widgetnum) != hubv) { return; } @@ -461,6 +429,8 @@ (board->brd_type == KLTYPE_PBRICK) ? EDGE_LBL_PBRICK : (board->brd_type == KLTYPE_PXBRICK) ? EDGE_LBL_PXBRICK : (board->brd_type == KLTYPE_IXBRICK) ? EDGE_LBL_IXBRICK : + (board->brd_type == KLTYPE_CGBRICK) ? EDGE_LBL_CGBRICK : + (board->brd_type == KLTYPE_OPUSBRICK) ? EDGE_LBL_OPUSBRICK : (board->brd_type == KLTYPE_XBRICK) ? EDGE_LBL_XBRICK : "?brick", EDGE_LBL_XTALK, widgetnum); @@ -503,7 +473,6 @@ hubv, hub_widgetid); ia64_sn_sysctl_iobrick_module_get(nasid, &io_module); - if (io_module >= 0) { char buffer[16]; vertex_hdl_t to, from; @@ -514,8 +483,8 @@ memset(buffer, 0, 16); format_module_id(buffer, geo_module(board->brd_geoid), MODULE_FORMAT_BRIEF); - if ( islower(MODULE_GET_BTCHAR(io_module)) ) { - bt = toupper(MODULE_GET_BTCHAR(io_module)); + if ( isupper(MODULE_GET_BTCHAR(io_module)) ) { + bt = tolower(MODULE_GET_BTCHAR(io_module)); } else { bt = MODULE_GET_BTCHAR(io_module); @@ -534,13 +503,16 @@ EDGE_LBL_NODE "/" EDGE_LBL_XTALK "/" "0", buffer, geo_slab(board->brd_geoid)); + DBG("io_xswitch_widget_init: FROM path '%s'\n", pathname); + from = hwgraph_path_to_vertex(pathname); ASSERT_ALWAYS(from); + sprintf(pathname, EDGE_LBL_HW "/" EDGE_LBL_MODULE "/%s/" EDGE_LBL_SLAB "/%d/" "%s", buffer, geo_slab(board->brd_geoid), brick_name); - + DBG("io_xswitch_widget_init: TO path '%s'\n", pathname); to = hwgraph_path_to_vertex(pathname); ASSERT_ALWAYS(to); rc = hwgraph_edge_add(from, to, @@ -568,11 +540,8 @@ DBG("io_init_xswitch_widgets: xswitchv 0x%p for cnode %d\n", xswitchv, cnode); - for (widgetnum = HUB_WIDGET_ID_MIN; widgetnum <= HUB_WIDGET_ID_MAX; - widgetnum++) { - io_xswitch_widget_init(xswitchv, - cnodeid_to_vertex(cnode), - widgetnum); + for (widgetnum = HUB_WIDGET_ID_MIN; widgetnum <= HUB_WIDGET_ID_MAX; widgetnum++) { + io_xswitch_widget_init(xswitchv, cnodeid_to_vertex(cnode), widgetnum); } } @@ -654,8 +623,7 @@ nodepda_t *npdap; struct semaphore *peer_sema = 0; uint32_t widget_partnum; - cpu_cookie_t c = 0; - extern int hubdev_docallouts(vertex_hdl_t); + cpuid_t c = 0; npdap = NODEPDA(cnodeid); @@ -671,8 +639,6 @@ ASSERT(hubv != GRAPH_VERTEX_NONE); - hubdev_docallouts(hubv); - /* * Read mfg info on this hub */ @@ -817,12 +783,15 @@ * 5) Initialize all xwidgets on the xswitch */ + DBG("call volunteer_for_widgets\n"); + volunteer_for_widgets(switchv, hubv); /* If there's someone else on this crossbow, recognize him */ if (npdap->xbow_peer != INVALID_NASID) { nodepda_t *peer_npdap = NODEPDA(NASID_TO_COMPACT_NODEID(npdap->xbow_peer)); peer_sema = &peer_npdap->xbow_sema; + DBG("call volunteer_for_widgets again\n"); volunteer_for_widgets(switchv, peer_npdap->node_vertex); } @@ -830,13 +799,13 @@ /* Signal that we're done */ if (peer_sema) { - mutex_unlock(peer_sema); + up(peer_sema); } } else { /* Wait 'til master is done assigning widgets. */ - mutex_lock(&npdap->xbow_sema); + down(&npdap->xbow_sema); } #ifdef PROBE_TEST @@ -961,7 +930,7 @@ else DBG("none found!\n"); - DELAY(15000000); + udelay(15000000); //prom_reboot(); panic("FIXME: devnamefromarcs: should call prom_reboot here.\n"); /* NOTREACHED */ @@ -1013,10 +982,10 @@ 2, /* 0x8 */ 1, /* 0x9 */ 0, 0, /* 0xa - 0xb */ - 4, /* 0xc */ + 5, /* 0xc */ 6, /* 0xd */ - 3, /* 0xe */ - 5 /* 0xf */ + 4, /* 0xe */ + 3 /* 0xf */ } }, @@ -1034,6 +1003,20 @@ } }, +/* OPUSbrick widget number to PCI bus number map */ + { MODULE_OPUSBRICK, /* OPUSbrick type */ + /* PCI Bus # Widget # */ + { 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0 - 0x7 */ + 0, /* 0x8 */ + 0, /* 0x9 */ + 0, 0, /* 0xa - 0xb */ + 0, /* 0xc */ + 0, /* 0xd */ + 0, /* 0xe */ + 1 /* 0xf */ + } + }, + /* IXbrick widget number to PCI bus number map */ { MODULE_IXBRICK, /* IXbrick type */ /* PCI Bus # Widget # */ @@ -1060,6 +1043,19 @@ 0, /* 0xe */ 0 /* 0xf */ } + }, +/* CG brick widget number to PCI bus number map */ + { MODULE_CGBRICK, /* CG brick */ + /* PCI Bus # Widget # */ + { 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0 - 0x7 */ + 0, /* 0x8 */ + 0, /* 0x9 */ + 0, 1, /* 0xa - 0xb */ + 0, /* 0xc */ + 0, /* 0xd */ + 0, /* 0xe */ + 0 /* 0xf */ + } } }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/module.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/module.c --- linux-2.4.22/arch/ia64/sn/io/sn2/module.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/module.c 2003-10-22 22:47:29.000000000 +0000 @@ -128,21 +128,26 @@ int i; char buffer[16]; moduleid_t moduleid; + slabid_t slab_number; memset(buffer, 0, 16); moduleid = geo_module(geoid); format_module_id(buffer, moduleid, MODULE_FORMAT_BRIEF); - DPRINTF("module_add_node: moduleid=%s node=%d\n", buffer, cnodeid); + DPRINTF("module_add_node: moduleid=%s node=%d ", buffer, cnodeid); if ((m = module_lookup(moduleid)) == 0) { m = kmalloc(sizeof (module_t), GFP_KERNEL); - memset(m, 0 , sizeof(module_t)); ASSERT_ALWAYS(m); + memset(m, 0 , sizeof(module_t)); + + for (slab_number = 0; slab_number <= MAX_SLABS; slab_number++) { + m->nodes[slab_number] = -1; + } m->id = moduleid; spin_lock_init(&m->lock); - mutex_init_locked(&m->thdcnt); + init_MUTEX_LOCKED(&m->thdcnt); /* Insert in sorted order by module number */ @@ -153,16 +158,23 @@ nummodules++; } - m->nodes[m->nodecnt] = cnodeid; - m->geoid[m->nodecnt] = geoid; - m->nodecnt++; + /* + * Save this information in the correct slab number of the node in the + * module. + */ + slab_number = geo_slab(geoid); + DPRINTF("slab number added 0x%x\n", slab_number); - DPRINTF("module_add_node: module %s now has %d nodes\n", buffer, m->nodecnt); + if (m->nodes[slab_number] != -1) + panic("module_add_node .. slab previously found\n"); + + m->nodes[slab_number] = cnodeid; + m->geoid[slab_number] = geoid; return m; } -int module_probe_snum(module_t *m, nasid_t nasid) +int module_probe_snum(module_t *m, nasid_t host_nasid, nasid_t nasid) { lboard_t *board; klmod_serial_num_t *comp; @@ -172,7 +184,7 @@ /* * record brick serial number */ - board = find_lboard((lboard_t *) KL_CONFIG_INFO(nasid), KLTYPE_SNIA); + board = find_lboard((lboard_t *) KL_CONFIG_INFO(host_nasid), KLTYPE_SNIA); if (! board || KL_CONFIG_DUPLICATE_BOARD(board)) { @@ -244,21 +256,47 @@ nserial = 0; + /* + * First pass just scan for compute node boards KLTYPE_SNIA. + * We do not support memoryless compute nodes. + */ for (node = 0; node < numnodes; node++) { nasid = COMPACT_TO_NASID_NODEID(node); - board = find_lboard((lboard_t *) KL_CONFIG_INFO(nasid), KLTYPE_SNIA); ASSERT(board); - m = module_add_node(board->brd_geoid, 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)); - if (! m->snum_valid && module_probe_snum(m, nasid)) + m = module_add_node(board->brd_geoid, node); + if (! m->snum_valid && module_probe_snum(m, nasid, nasid)) nserial++; } - DPRINTF("********found total of %d serial numbers in the system\n", - nserial); + /* + * Second scan, look for TIO's board hosted by compute nodes. + */ + for (node = numnodes; node < numionodes; node++) { + nasid_t tio_nasid; + cnodeid_t tio_node; + char serial_number[16]; - if (nserial == 0) - DPRINTF(KERN_WARNING "io_module_init: No serial number found.\n"); + tio_nasid = COMPACT_TO_NASID_NODEID(node); + board = find_lboard((lboard_t *) KL_CONFIG_INFO(tio_nasid), KLTYPE_TIO); + ASSERT(board); + tio_node = NASID_TO_COMPACT_NODEID(tio_nasid); + + HWGRAPH_DEBUG((__FILE__, __FUNCTION__, __LINE__, NULL, NULL, "Found TIO lboard 0x%lx tio nasid %d tio cnode %d\n", (unsigned long)board, (int)tio_nasid, (int)tio_node)); + + m = module_add_node(board->brd_geoid, tio_node); + + /* + * Get and initialize the serial number of TIO. + */ + 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 -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_ate.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_ate.c --- linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_ate.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_ate.c 2003-10-22 22:49:19.000000000 +0000 @@ -86,7 +86,6 @@ int num_entries, entry; int i, j; bridgereg_t old_enable, new_enable; - int s; /* Probe SSRAM to determine its size. */ old_enable = bridge->b_int_enable; @@ -113,12 +112,10 @@ * The read following the write is required for the Bridge war */ - s = splhi(); 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 */ - splx(s); num_entries = ATE_NUM_ENTRIES(largest_working_size); @@ -382,25 +379,9 @@ int ate_count, bridge_ate_t ate) { - if (IS_PIC_SOFT(pcibr_soft) ) { - while (ate_count-- > 0) { - *ate_ptr++ = ate; - ate += IOPGSIZE; - } - } - else { - if (io_get_sh_swapper(NASID_GET(ate_ptr))) { - while (ate_count-- > 0) { - *ate_ptr++ = __swab64(ate); - ate += IOPGSIZE; - } - } - else { - while (ate_count-- > 0) { - *ate_ptr++ = ate; - ate += IOPGSIZE; - } - } + while (ate_count-- > 0) { + *ate_ptr++ = ate; + ate += IOPGSIZE; } } @@ -442,19 +423,7 @@ for (slot = pcibr_soft->bs_min_slot; slot < PCIBR_NUM_SLOTS(pcibr_soft); ++slot) { if ((cmd_reg = cmd_regs[slot]) & PCI_CMD_BUS_MASTER) { - if ( IS_PIC_SOFT(pcibr_soft) ) { - pcibr_slot_config_set(bridge, slot, PCI_CFG_COMMAND/4, cmd_reg); - } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - bridge->b_type0_cfg_dev[slot].l[PCI_CFG_COMMAND / 4] = __swab32(cmd_reg); - } - else { -// BUG(); /* Does this really work if called when io_get_sh_swapper = 0? */ -// bridge->b_type0_cfg_dev[slot].l[PCI_CFG_COMMAND / 4] = cmd_reg; - pcibr_slot_config_set(bridge, slot, PCI_CFG_COMMAND/4, cmd_reg); - } - } + pcibr_slot_config_set(bridge, slot, PCI_CFG_COMMAND/4, cmd_reg); } } pcibr_dmamap->bd_flags |= PCIBR_DMAMAP_BUSY; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c --- linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_dvr.c 2003-10-22 22:48:36.000000000 +0000 @@ -11,8 +11,10 @@ #include #include #include -#include +#if 0 #include +#include +#endif #include #include #include @@ -220,8 +222,6 @@ 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); @@ -506,17 +506,6 @@ slotp->bss_device = new; bridge->b_wid_tflush; /* wait until Bridge PIO complete */ } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - BRIDGE_REG_SET32((&bridge->b_device[slot].reg)) = __swab32(new); - slotp->bss_device = new; - BRIDGE_REG_GET32((&bridge->b_wid_tflush)); /* wait until Bridge PIO complete */ - } else { - bridge->b_device[slot].reg = new; - slotp->bss_device = new; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ - } - } pcibr_unlock(pcibr_soft, s); #ifdef PIC_LATER @@ -551,31 +540,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; - - if ( IS_PIC_SOFT(pcibr_soft) ) { - wrf = bridge->b_wr_req_buf[slot].reg; - } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - wrf = BRIDGE_REG_GET32((&bridge->b_wr_req_buf[slot].reg)); - } else { - wrf = bridge->b_wr_req_buf[slot].reg; - } - } - pcibr_unlock(pcibr_soft, s); -} /* ===================================================================== * Bridge (pcibr) "Device Driver" entry points @@ -618,7 +582,6 @@ .mmap = pcibr_mmap, }; - /* This is special case code used by grio. There are plans to make * this a bit more general in the future, but till then this should * be sufficient. @@ -923,28 +886,33 @@ PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, f_c, "pcibr_bus_cnvlink\n")); - if (GRAPH_SUCCESS != hwgraph_vertex_name_get(f_c, dst, MAXDEVNAME)) + 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) + if (xp == NULL) { return 0; + } widgetnum = simple_strtoul(xp+7, NULL, 0); - if (widgetnum < XBOW_PORT_8 || widgetnum > XBOW_PORT_F) + 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) + if (cp == NULL) { return 0; + } *cp = (char)NULL; /* get the vertex for the widget */ - if (GRAPH_SUCCESS != hwgraph_traverse(NULL, dp, &svtx)) + if (GRAPH_SUCCESS != hwgraph_traverse(NULL, dp, &svtx)) { return 0; + } *xp = (char)NULL; /* remove "/xtalk/..." from path */ @@ -1023,13 +991,10 @@ vertex_hdl_t noslot_conn; char devnm[MAXDEVNAME], *s; pcibr_hints_t pcibr_hints; - uint64_t int_enable; - bridgereg_t int_enable_32; + uint64_t int_enable; picreg_t int_enable_64; unsigned rrb_fixed = 0; - int spl_level; - #if PCI_FBBE int fast_back_to_back_enable; #endif @@ -1069,7 +1034,7 @@ NEW(pcibr_soft); if (ret_softp) *ret_softp = pcibr_soft; - BZERO(pcibr_soft, sizeof *pcibr_soft); + 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; @@ -1190,6 +1155,7 @@ 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; @@ -1236,6 +1202,13 @@ pcibr_soft->bs_last_slot = 6; } break; + + case MODULE_CGBRICK: + pcibr_soft->bs_first_slot = 0; + pcibr_soft->bs_last_slot = 0; + pcibr_soft->bs_last_reset = 0; + break; + default: break; } @@ -1316,8 +1289,6 @@ if (busnum == 0) { xwidget_error_register(xconn_vhdl, pcibr_error_handler_wrapper, pcibr_soft); } - } else { - xwidget_error_register(xconn_vhdl, pcibr_error_handler, pcibr_soft); } /* @@ -1371,8 +1342,6 @@ */ if (IS_PIC_SOFT(pcibr_soft)) bridge->b_int_device = (uint32_t) 0x006db6db; - else - bridge->b_int_device = (uint32_t) 0xffffffff; { bridgereg_t dirmap; @@ -1411,7 +1380,7 @@ * for the lowest hunk of memory. */ xbase = xtalk_dmatrans_addr(xconn_vhdl, 0, - paddr, _PAGESZ, 0); + paddr, PAGE_SIZE, 0); if (xbase != XIO_NOWHERE) { if (XIO_PACKED(xbase)) { @@ -1441,24 +1410,18 @@ * ensure that we write and read without any interruption. * The read following the write is required for the Bridge war */ - spl_level = splhi(); #if IOPGSIZE == 4096 if (IS_PIC_SOFT(pcibr_soft)) { bridge->p_wid_control_64 &= ~BRIDGE_CTRL_PAGE_SIZE; - } else { - bridge->b_wid_control &= ~BRIDGE_CTRL_PAGE_SIZE; - } + } #elif IOPGSIZE == 16384 if (IS_PIC_SOFT(pcibr_soft)) { bridge->p_wid_control_64 |= BRIDGE_CTRL_PAGE_SIZE; - } else { - bridge->b_wid_control |= BRIDGE_CTRL_PAGE_SIZE; } #else <<>>; #endif bridge->b_wid_control; /* inval addr bug war */ - splx(spl_level); /* Initialize internal mapping entries */ for (entry = 0; entry < pcibr_soft->bs_int_ate_size; entry++) { @@ -1606,13 +1569,7 @@ #ifdef PFG_TEST int_enable = (uint64_t)0x7ffffeff7ffffeff; #endif - } else { - int_enable_32 = bridge->b_int_enable | (BRIDGE_ISR_ERRORS & 0xffffffff); - int_enable = ((uint64_t)int_enable_32 & 0xffffffff); -#ifdef PFG_TEST - int_enable = (uint64_t)0x7ffffeff; -#endif - } + } #if BRIDGE_ERROR_INTR_WAR @@ -1672,8 +1629,6 @@ if (IS_PIC_SOFT(pcibr_soft)) { bridge->p_int_enable_64 = (picreg_t)int_enable; - } else { - bridge->b_int_enable = (bridgereg_t)int_enable; } bridge->b_int_mode = 0; /* do not send "clear interrupt" packets */ @@ -1734,7 +1689,7 @@ /* 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), KM_NOSLEEP); + res = (struct resource *) kmalloc( sizeof(struct resource), GFP_KERNEL); if (!res) panic("PCIBR:Unable to allocate resource structure\n"); @@ -1746,13 +1701,13 @@ panic("PCIBR:Unable to request_resource()\n"); /* Setup the Small Window Root Resource */ - pcibr_soft->bs_swin_root_resource.start = _PAGESZ; + 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), KM_NOSLEEP); + res = (struct resource *) kmalloc( sizeof(struct resource), GFP_KERNEL); if (!res) panic("PCIBR:Unable to allocate resource structure\n"); @@ -1862,6 +1817,7 @@ break; case MODULE_PXBRICK: case MODULE_IXBRICK: + case MODULE_OPUSBRICK: /* * If the IO9 is in the PXBrick (bus1, slot1) allocate * RRBs to all the devices @@ -1874,18 +1830,16 @@ 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); + do_pcibr_rrb_autoalloc(pcibr_soft, 0, VCHAN0, 4); + do_pcibr_rrb_autoalloc(pcibr_soft, 1, VCHAN0, 4); } break; - } /* switch */ - } -#ifdef LATER - if (strstr(nicinfo, XTALK_PCI_PART_NUM)) { - do_pcibr_rrb_autoalloc(pcibr_soft, 1, VCHAN0, 8); + case MODULE_CGBRICK: + do_pcibr_rrb_autoalloc(pcibr_soft, 0, VCHAN0, 8); + break; + } /* switch */ } -#endif } /* OK Special RRB allocations are done. */ for (slot = pcibr_soft->bs_min_slot; @@ -1927,8 +1881,6 @@ /* Disable the interrupts from the bridge */ if (IS_PIC_SOFT(pcibr_soft)) { bridge->p_int_enable_64 = 0; - } else { - bridge->b_int_enable = 0; } pcibr_unlock(pcibr_soft, s); @@ -1942,7 +1894,6 @@ pciio_device_info_unregister(pcibr_vhdl, &(pcibr_soft->bs_noslot_info->f_c)); - spin_lock_destroy(&pcibr_soft->bs_lock); kfree(pcibr_soft->bs_name); /* Disconnect the error interrupt and free the xtalk resources @@ -1994,17 +1945,6 @@ 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; -} - /* ===================================================================== * PIO MANAGEMENT */ @@ -2220,17 +2160,6 @@ pcibr_soft->bs_slot[win].bss_device = devreg; bridge->b_wid_tflush; /* wait until Bridge PIO complete */ } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - BRIDGE_REG_SET32((&bridge->b_device[win].reg)) = __swab32(devreg); - pcibr_soft->bs_slot[win].bss_device = devreg; - BRIDGE_REG_GET32((&bridge->b_wid_tflush)); /* wait until Bridge PIO complete */ - } else { - bridge->b_device[win].reg = devreg; - pcibr_soft->bs_slot[win].bss_device = devreg; - bridge->b_wid_tflush; /* wait until Bridge PIO complete */ - } - } #ifdef PCI_LATER PCIBR_DEBUG((PCIBR_DEBUG_DEVREG, pconn_vhdl, @@ -2418,22 +2347,6 @@ if (octl != nctl) /* make the change if any */ bridge->b_wid_control = nctl; } - else { - picreg_t octl, nctl; - if (io_get_sh_swapper(NASID_GET(bridge))) { - octl = BRIDGE_REG_GET32((&bridge->b_wid_control)); - nctl = bst ? octl | swb : octl & ~swb; - - if (octl != nctl) /* make the change if any */ - BRIDGE_REG_SET32((&bridge->b_wid_control)) = __swab32(nctl); - } else { - octl = bridge->b_wid_control; - nctl = bst ? octl | swb : octl & ~swb; - - if (octl != nctl) /* make the change if any */ - bridge->b_wid_control = nctl; - } - } *bfp = bfn; /* record the assignment */ if (pcibr_debug_mask & PCIBR_DEBUG_PIOMAP) { @@ -2656,7 +2569,7 @@ /* * Check for proper alignment */ - ASSERT(alignment >= NBPP); + ASSERT(alignment >= PAGE_SIZE); ASSERT((alignment & (alignment - 1)) == 0); align_mask = alignment - 1; @@ -3092,7 +3005,7 @@ !IS_XBRIDGE_OR_PIC_SOFT(pcibr_soft)) { bridge_t *bridge = pcibr_soft->bs_base; volatile unsigned *cmd_regp; - unsigned cmd_reg; + unsigned cmd_reg = 0; unsigned long s; pcibr_dmamap->bd_flags |= PCIBR_DMAMAP_SSRAM; @@ -3103,13 +3016,6 @@ if ( IS_PIC_SOFT(pcibr_soft) ) { cmd_reg = pcibr_slot_config_get(bridge, slot, PCI_CFG_COMMAND/4); } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - BRIDGE_REG_SET32((&cmd_reg)) = __swab32(*cmd_regp); - } else { - cmd_reg = pcibr_slot_config_get(bridge, slot, PCI_CFG_COMMAND/4); - } - } pcibr_soft->bs_slot[slot].bss_cmd_pointer = cmd_regp; pcibr_soft->bs_slot[slot].bss_cmd_shadow = cmd_reg; pcibr_unlock(pcibr_soft, s); @@ -3362,13 +3268,6 @@ if ( IS_PIC_SOFT(pcibr_soft) ) { bridge->b_wid_tflush; /* wait until Bridge PIO complete */ } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - BRIDGE_REG_GET32((&bridge->b_wid_tflush)); - } else { - bridge->b_wid_tflush; - } - } PCIBR_DEBUG((PCIBR_DEBUG_DMAMAP, pcibr_dmamap->bd_dev, "pcibr_dmamap_addr (PMU) : wanted paddr " "[0x%x..0x%x] returning PCI 0x%x\n", @@ -3827,17 +3726,6 @@ pcibr_soft->bs_slot[pciio_slot].bss_device = devreg; bridge->b_wid_tflush; /* wait until Bridge PIO complete */ } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - BRIDGE_REG_SET32((&bridge->b_device[pciio_slot].reg)) = __swab32(devreg); - pcibr_soft->bs_slot[pciio_slot].bss_device = devreg; - BRIDGE_REG_GET32((&bridge->b_wid_tflush));/* wait until Bridge PIO complete */ - } else { - 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); @@ -3851,105 +3739,6 @@ 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; - - if ( IS_PIC_SOFT(pcibr_soft) ) { - 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 */ - } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - BRIDGE_REG_SET32((&bridge->b_device[pciio_slot].reg)) = __swab32(devreg); - pcibr_soft->bs_slot[pciio_slot].bss_device = devreg; - BRIDGE_REG_GET32((&bridge->b_wid_tflush));/* wait until Bridge PIO complete */ - } else { - 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); - - 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); - - return device_prio; -} - /* * Interfaces to allow special (e.g. SGI) drivers to set/clear * Bridge-specific device flags. Many flags are modified through @@ -4018,17 +3807,6 @@ pcibr_soft->bs_slot[pciio_slot].bss_device = devreg; bridge->b_wid_tflush; /* wait until Bridge PIO complete */ } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - BRIDGE_REG_SET32((&bridge->b_device[pciio_slot].reg)) = __swab32(devreg); - pcibr_soft->bs_slot[pciio_slot].bss_device = devreg; - BRIDGE_REG_GET32((&bridge->b_wid_tflush));/* wait until Bridge PIO complete */ - } else { - 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); #ifdef PIC_LATER @@ -4116,16 +3894,14 @@ (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_devenable_f *) 0, (pciio_error_extract_f *) 0, (pciio_driver_reg_callback_f *) 0, (pciio_driver_unreg_callback_f *) 0, - (pciio_device_unregister_f *) pcibr_device_unregister, + (pciio_device_unregister_f *) 0, (pciio_dma_enabled_f *) pcibr_dma_enabled, }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c --- linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_error.c 2003-10-22 22:48:26.000000000 +0000 @@ -101,6 +101,7 @@ #define F(s,n) { 1l<<(s),-(s), n } +#if defined(FORCE_ERRORS) static struct reg_values space_v[] = { {PCIIO_SPACE_NONE, "none"}, @@ -147,6 +148,7 @@ {BRIDGE_DEV_OFF_MASK, BRIDGE_DEV_OFF_ADDR_SHFT, "DEV_OFF", "%x"}, {0} }; +#endif /* FORCE_ERRORS */ static void print_bridge_errcmd(uint32_t cmdword, char *errtype) @@ -663,7 +665,7 @@ entry = pcibr_list; while (1) { if (entry == NULL) { - PRINT_PANIC("pcibr_error_intr_handler:\tmy parameter (0x%p) is not a pcibr_soft!", arg); + panic("pcibr_error_intr_handler:\tmy parameter (0x%p) is not a pcibr_soft!", arg); } if ((intr_arg_t) entry->bl_soft == arg) break; @@ -936,11 +938,11 @@ (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); - PRINT_PANIC("PCI Bridge Error interrupt killed the system"); + panic("PCI Bridge Error interrupt killed the system"); } if (err_status & BRIDGE_ISR_ERROR_FATAL) { - PRINT_PANIC("PCI Bridge Error interrupt killed the system"); + panic("PCI Bridge Error interrupt killed the system"); /*NOTREACHED */ } @@ -1080,7 +1082,9 @@ int retval = IOERROR_HANDLED; vertex_hdl_t pcibr_vhdl = pcibr_soft->bs_vhdl; +#if defined(FORCE_ERRORS) bridge_t *bridge = pcibr_soft->bs_base; +#endif iopaddr_t bad_xaddr; @@ -1414,9 +1418,6 @@ } #if defined(FORCE_ERRORS) if (0) { -#elif !DEBUG - if (kdebug) { -#endif /* * Dump raw data from Bridge/PCI layer. */ @@ -1444,9 +1445,8 @@ BEM_ADD_REG(device); } } -#if !DEBUG || defined(FORCE_ERRORS) } -#endif +#endif /* FORCE_ERRORS */ /* * Since error could not be handled at lower level, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_intr.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_intr.c --- linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_intr.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_intr.c 2003-10-22 22:47:28.000000000 +0000 @@ -34,7 +34,7 @@ inline int compare_and_swap_ptr(void **location, void *old_ptr, void *new_ptr) { - FIXME("compare_and_swap_ptr : NOT ATOMIC"); + /* FIXME - compare_and_swap_ptr NOT ATOMIC */ if (*location == old_ptr) { *location = new_ptr; return(1); @@ -103,7 +103,7 @@ pcibr_intr_wrap_t wrap; if (cbuf->ib_in == cbuf->ib_out) - PRINT_PANIC( "pcibr intr circular buffer empty, cbuf=0x%p, ib_in=ib_out=%d\n", + panic( "pcibr intr circular buffer empty, cbuf=0x%p, ib_in=ib_out=%d\n", (void *)cbuf, cbuf->ib_out); wrap = cbuf->ib_cbuf[cbuf->ib_out++]; @@ -118,22 +118,21 @@ pcibr_wrap_put(pcibr_intr_wrap_t wrap, pcibr_intr_cbuf_t cbuf) { int in; - int s; /* * Multiple CPUs could be executing this code simultaneously * if a handler has registered multiple interrupt lines and * the interrupts are directed to different CPUs. */ - s = mutex_spinlock(&cbuf->ib_lock); + spin_lock(&cbuf->ib_lock); in = (cbuf->ib_in + 1) % IBUFSIZE; if (in == cbuf->ib_out) - PRINT_PANIC( "pcibr intr circular buffer full, cbuf=0x%p, ib_in=%d\n", + panic( "pcibr intr circular buffer full, cbuf=0x%p, ib_in=%d\n", (void *)cbuf, cbuf->ib_in); cbuf->ib_cbuf[cbuf->ib_in] = wrap; cbuf->ib_in = in; - mutex_spinunlock(&cbuf->ib_lock, s); + spin_unlock(&cbuf->ib_lock); return; } @@ -341,7 +340,7 @@ pcibr_intr->bi_mustruncpu = CPU_NONE; pcibr_intr->bi_ibuf.ib_in = 0; pcibr_intr->bi_ibuf.ib_out = 0; - mutex_spinlock_init(&pcibr_intr->bi_ibuf.ib_lock); + 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)); @@ -857,7 +856,7 @@ 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); - PRINT_PANIC("PCI Bridge interrupt targetting error\n"); + panic("PCI Bridge interrupt targetting error\n"); } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c --- linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_rrb.c 2003-10-22 22:49:10.000000000 +0000 @@ -407,14 +407,6 @@ while (*wrb_flush) ; } - else { - if (io_get_sh_swapper(NASID_GET(bridge))) { - while (BRIDGE_REG_GET32((wrb_flush))); - } else { - while (*wrb_flush) - ; - } - } return(0); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c --- linux-2.4.22/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pcibr/pcibr_slot.c 2003-10-22 22:48:11.000000000 +0000 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -88,6 +89,8 @@ int max_readcount_to_bufsize[MAX_READCNT_TABLE] = {512, 1024, 2048, 4096 }; +#define COPYOUT(a, b, c) copy_to_user(b,a,c) + /*========================================================================== * BRIDGE PCI SLOT RELATED IOCTLs */ @@ -320,9 +323,8 @@ reg_p b_respp; pcibr_slot_info_resp_t slotp; pcibr_slot_func_info_resp_t funcp; - extern void snia_kmem_free(void *, int); - slotp = snia_kmem_zalloc(sizeof(*slotp), 0); + slotp = snia_kmem_zalloc(sizeof(*slotp)); if (slotp == NULL) { return(ENOMEM); } @@ -1188,8 +1190,8 @@ align = (win) ? size : align_slot; - if (align < _PAGESZ) - align = _PAGESZ; /* ie. 0x00004000 */ + if (align < PAGE_SIZE) + align = PAGE_SIZE; /* ie. 0x00004000 */ switch (space) { case PCIIO_SPACE_IO: @@ -1740,7 +1742,6 @@ { int rv; picreg_t p_old_enable = (picreg_t)0, p_new_enable; - extern int 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); @@ -1753,7 +1754,7 @@ bridge->p_int_rst_stat_64 = (BRIDGE_IRR_PCI_GRP_CLR | PIC_PCIX_GRP_CLR); (void) bridge->b_wid_tflush; /* flushbus */ } - rv = badaddr_val((void *) cfg, 4, valp); + 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 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/pciio.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pciio.c --- linux-2.4.22/arch/ia64/sn/io/sn2/pciio.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pciio.c 2003-10-22 22:48:31.000000000 +0000 @@ -36,85 +36,6 @@ char pciio_info_fingerprint[] = "pciio_info"; -int -badaddr_val(volatile void *addr, int len, volatile void *ptr) -{ - int ret = 0; - volatile void *new_addr; - - switch (len) { - case 4: - new_addr = (void *) addr; - ret = ia64_sn_probe_io_slot((long)new_addr, len, (void *)ptr); - break; - default: - printk(KERN_WARNING "badaddr_val given len %x but supports len of 4 only\n", len); - } - - if (ret < 0) - panic("badaddr_val: unexpected status (%d) in probing", ret); - return(ret); - -} - - -nasid_t -get_console_nasid(void) -{ - extern nasid_t console_nasid; - extern nasid_t master_baseio_nasid; - - if (console_nasid < 0) { - console_nasid = ia64_sn_get_console_nasid(); - if (console_nasid < 0) { -// ZZZ What do we do if we don't get a console nasid on the hardware???? - if (IS_RUNNING_ON_SIMULATOR() ) - console_nasid = master_baseio_nasid; - } - } - return console_nasid; -} - -nasid_t -get_master_baseio_nasid(void) -{ - extern nasid_t master_baseio_nasid; - extern char master_baseio_wid; - - if (master_baseio_nasid < 0) { - master_baseio_nasid = ia64_sn_get_master_baseio_nasid(); - - if ( master_baseio_nasid >= 0 ) { - master_baseio_wid = WIDGETID_GET(KL_CONFIG_CH_CONS_INFO(master_baseio_nasid)->memory_base); - } - } - return master_baseio_nasid; -} - -int -hub_dma_enabled(vertex_hdl_t xconn_vhdl) -{ - return(0); -} - -int -hub_error_devenable(vertex_hdl_t xconn_vhdl, int devnum, int error_code) -{ - return(0); -} - -void -ioerror_dump(char *name, int error_code, int error_mode, ioerror_t *ioerror) -{ -} - -/****** - ****** end hack defines ...... - ******/ - - - - /* ===================================================================== * PCI Generic Bus Provider * Implement PCI provider operations. The pciio* layer provides a @@ -136,97 +57,9 @@ */ #if !defined(DEV_FUNC) -static pciio_provider_t *pciio_to_provider_fns(vertex_hdl_t dev); +extern pciio_provider_t *pciio_to_provider_fns(vertex_hdl_t dev); #endif -pciio_piomap_t pciio_piomap_alloc(vertex_hdl_t, device_desc_t, pciio_space_t, iopaddr_t, size_t, size_t, unsigned); -void pciio_piomap_free(pciio_piomap_t); -caddr_t pciio_piomap_addr(pciio_piomap_t, iopaddr_t, size_t); - -void pciio_piomap_done(pciio_piomap_t); -caddr_t pciio_piotrans_addr(vertex_hdl_t, device_desc_t, pciio_space_t, iopaddr_t, size_t, unsigned); -caddr_t pciio_pio_addr(vertex_hdl_t, device_desc_t, pciio_space_t, iopaddr_t, size_t, pciio_piomap_t *, unsigned); - -iopaddr_t pciio_piospace_alloc(vertex_hdl_t, device_desc_t, pciio_space_t, size_t, size_t); -void pciio_piospace_free(vertex_hdl_t, pciio_space_t, iopaddr_t, size_t); - -pciio_dmamap_t pciio_dmamap_alloc(vertex_hdl_t, device_desc_t, size_t, unsigned); -void pciio_dmamap_free(pciio_dmamap_t); -iopaddr_t pciio_dmamap_addr(pciio_dmamap_t, paddr_t, size_t); -void pciio_dmamap_done(pciio_dmamap_t); -iopaddr_t pciio_dmatrans_addr(vertex_hdl_t, device_desc_t, paddr_t, size_t, unsigned); -void pciio_dmamap_drain(pciio_dmamap_t); -void pciio_dmaaddr_drain(vertex_hdl_t, paddr_t, size_t); -void pciio_dmalist_drain(vertex_hdl_t, alenlist_t); -iopaddr_t pciio_dma_addr(vertex_hdl_t, device_desc_t, paddr_t, size_t, pciio_dmamap_t *, unsigned); - -pciio_intr_t pciio_intr_alloc(vertex_hdl_t, device_desc_t, pciio_intr_line_t, vertex_hdl_t); -void pciio_intr_free(pciio_intr_t); -int pciio_intr_connect(pciio_intr_t, intr_func_t, intr_arg_t); -void pciio_intr_disconnect(pciio_intr_t); -vertex_hdl_t pciio_intr_cpu_get(pciio_intr_t); - -void pciio_slot_func_to_name(char *, pciio_slot_t, pciio_function_t); - -void pciio_provider_startup(vertex_hdl_t); -void pciio_provider_shutdown(vertex_hdl_t); - -pciio_endian_t pciio_endian_set(vertex_hdl_t, pciio_endian_t, pciio_endian_t); -pciio_priority_t pciio_priority_set(vertex_hdl_t, pciio_priority_t); -vertex_hdl_t pciio_intr_dev_get(pciio_intr_t); - -vertex_hdl_t pciio_pio_dev_get(pciio_piomap_t); -pciio_slot_t pciio_pio_slot_get(pciio_piomap_t); -pciio_space_t pciio_pio_space_get(pciio_piomap_t); -iopaddr_t pciio_pio_pciaddr_get(pciio_piomap_t); -ulong pciio_pio_mapsz_get(pciio_piomap_t); -caddr_t pciio_pio_kvaddr_get(pciio_piomap_t); - -vertex_hdl_t pciio_dma_dev_get(pciio_dmamap_t); -pciio_slot_t pciio_dma_slot_get(pciio_dmamap_t); - -pciio_info_t pciio_info_chk(vertex_hdl_t); -pciio_info_t pciio_info_get(vertex_hdl_t); -void pciio_info_set(vertex_hdl_t, pciio_info_t); -vertex_hdl_t pciio_info_dev_get(pciio_info_t); -pciio_slot_t pciio_info_slot_get(pciio_info_t); -pciio_function_t pciio_info_function_get(pciio_info_t); -pciio_vendor_id_t pciio_info_vendor_id_get(pciio_info_t); -pciio_device_id_t pciio_info_device_id_get(pciio_info_t); -vertex_hdl_t pciio_info_master_get(pciio_info_t); -arbitrary_info_t pciio_info_mfast_get(pciio_info_t); -pciio_provider_t *pciio_info_pops_get(pciio_info_t); -error_handler_f *pciio_info_efunc_get(pciio_info_t); -error_handler_arg_t *pciio_info_einfo_get(pciio_info_t); -pciio_space_t pciio_info_bar_space_get(pciio_info_t, int); -iopaddr_t pciio_info_bar_base_get(pciio_info_t, int); -size_t pciio_info_bar_size_get(pciio_info_t, int); -iopaddr_t pciio_info_rom_base_get(pciio_info_t); -size_t pciio_info_rom_size_get(pciio_info_t); - -int pciio_attach(vertex_hdl_t); - -void pciio_provider_register(vertex_hdl_t, pciio_provider_t *pciio_fns); -void pciio_provider_unregister(vertex_hdl_t); -pciio_provider_t *pciio_provider_fns_get(vertex_hdl_t); - -int pciio_driver_register(pciio_vendor_id_t, pciio_device_id_t, char *driver_prefix, unsigned); - -vertex_hdl_t pciio_device_register(vertex_hdl_t, vertex_hdl_t, pciio_slot_t, pciio_function_t, pciio_vendor_id_t, pciio_device_id_t); - -void pciio_device_unregister(vertex_hdl_t); -pciio_info_t pciio_device_info_new(pciio_info_t, vertex_hdl_t, pciio_slot_t, pciio_function_t, pciio_vendor_id_t, pciio_device_id_t); -void pciio_device_info_free(pciio_info_t); -vertex_hdl_t pciio_device_info_register(vertex_hdl_t, pciio_info_t); -void pciio_device_info_unregister(vertex_hdl_t, pciio_info_t); -int pciio_device_attach(vertex_hdl_t, int); -int pciio_device_detach(vertex_hdl_t, int); -void pciio_error_register(vertex_hdl_t, error_handler_f *, error_handler_arg_t); - -int pciio_reset(vertex_hdl_t); -int pciio_write_gather_flush(vertex_hdl_t); -int pciio_slot_inuse(vertex_hdl_t); - /* ===================================================================== * Provider Function Location * @@ -239,7 +72,7 @@ #if !defined(DEV_FUNC) -static pciio_provider_t * +pciio_provider_t * pciio_to_provider_fns(vertex_hdl_t dev) { pciio_info_t card_info; @@ -260,13 +93,10 @@ } } - if (provider_fns == NULL) -#if defined(SUPPORT_PRINTING_V_FORMAT) - PRINT_PANIC("%v: provider_fns == NULL", dev); -#else - PRINT_PANIC("0x%p: provider_fns == NULL", (void *)dev); -#endif - + if (provider_fns == NULL) { + char devname[MAXDEVNAME]; + panic("%s: provider_fns == NULL", vertex_to_name(dev, devname, MAXDEVNAME)); + } return provider_fns; } @@ -395,8 +225,8 @@ size_t byte_count, /* Size of mapping */ size_t align) { /* Alignment needed */ - if (align < NBPP) - align = NBPP; + if (align < PAGE_SIZE) + align = PAGE_SIZE; return DEV_FUNC(dev, piospace_alloc) (dev, dev_desc, space, byte_count, align); } @@ -752,50 +582,6 @@ } /* - * Specify endianness constraints. The driver tells us what the device - * does and how it would like to see things in memory. We reply with - * how things will actually appear in memory. - */ -pciio_endian_t -pciio_endian_set(vertex_hdl_t dev, - pciio_endian_t device_end, - pciio_endian_t desired_end) -{ - ASSERT((device_end == PCIDMA_ENDIAN_BIG) || (device_end == PCIDMA_ENDIAN_LITTLE)); - ASSERT((desired_end == PCIDMA_ENDIAN_BIG) || (desired_end == PCIDMA_ENDIAN_LITTLE)); - -#if DEBUG -#if defined(SUPPORT_PRINTING_V_FORMAT) - printk(KERN_ALERT "%v: pciio_endian_set is going away.\n" - "\tplease use PCIIO_BYTE_STREAM or PCIIO_WORD_VALUES in your\n" - "\tpciio_dmamap_alloc and pciio_dmatrans calls instead.\n", - dev); -#else - printk(KERN_ALERT "0x%x: pciio_endian_set is going away.\n" - "\tplease use PCIIO_BYTE_STREAM or PCIIO_WORD_VALUES in your\n" - "\tpciio_dmamap_alloc and pciio_dmatrans calls instead.\n", - dev); -#endif -#endif - - return DEV_FUNC(dev, endian_set) - (dev, device_end, desired_end); -} - -/* - * Specify PCI arbitration priority. - */ -pciio_priority_t -pciio_priority_set(vertex_hdl_t dev, - pciio_priority_t device_prio) -{ - ASSERT((device_prio == PCI_PRIO_HIGH) || (device_prio == PCI_PRIO_LOW)); - - return DEV_FUNC(dev, priority_set) - (dev, device_prio); -} - -/* * Read value of configuration register */ uint64_t @@ -864,71 +650,6 @@ return DEV_FUNC(dev, reset) (dev); } -/* - * flush write gather buffers - */ -int -pciio_write_gather_flush(vertex_hdl_t dev) -{ - return DEV_FUNC(dev, write_gather_flush) (dev); -} - -vertex_hdl_t -pciio_intr_dev_get(pciio_intr_t pciio_intr) -{ - return (pciio_intr->pi_dev); -} - -/****** Generic crosstalk pio interfaces ******/ -vertex_hdl_t -pciio_pio_dev_get(pciio_piomap_t pciio_piomap) -{ - return (pciio_piomap->pp_dev); -} - -pciio_slot_t -pciio_pio_slot_get(pciio_piomap_t pciio_piomap) -{ - return (pciio_piomap->pp_slot); -} - -pciio_space_t -pciio_pio_space_get(pciio_piomap_t pciio_piomap) -{ - return (pciio_piomap->pp_space); -} - -iopaddr_t -pciio_pio_pciaddr_get(pciio_piomap_t pciio_piomap) -{ - return (pciio_piomap->pp_pciaddr); -} - -ulong -pciio_pio_mapsz_get(pciio_piomap_t pciio_piomap) -{ - return (pciio_piomap->pp_mapsz); -} - -caddr_t -pciio_pio_kvaddr_get(pciio_piomap_t pciio_piomap) -{ - return (pciio_piomap->pp_kvaddr); -} - -/****** Generic crosstalk dma interfaces ******/ -vertex_hdl_t -pciio_dma_dev_get(pciio_dmamap_t pciio_dmamap) -{ - return (pciio_dmamap->pd_dev); -} - -pciio_slot_t -pciio_dma_slot_get(pciio_dmamap_t pciio_dmamap) -{ - return (pciio_dmamap->pd_slot); -} - /****** Generic pci slot information interfaces ******/ pciio_info_t @@ -987,30 +708,13 @@ return (pciio_info->c_vertex); } + pciio_slot_t pciio_info_slot_get(pciio_info_t pciio_info) { return (pciio_info->c_slot); } -pciio_function_t -pciio_info_function_get(pciio_info_t pciio_info) -{ - return (pciio_info->c_func); -} - -pciio_vendor_id_t -pciio_info_vendor_id_get(pciio_info_t pciio_info) -{ - return (pciio_info->c_vendor); -} - -pciio_device_id_t -pciio_info_device_id_get(pciio_info_t pciio_info) -{ - return (pciio_info->c_device); -} - vertex_hdl_t pciio_info_master_get(pciio_info_t pciio_info) { @@ -1029,48 +733,6 @@ return (pciio_info->c_pops); } -error_handler_f * -pciio_info_efunc_get(pciio_info_t pciio_info) -{ - return (pciio_info->c_efunc); -} - -error_handler_arg_t * -pciio_info_einfo_get(pciio_info_t pciio_info) -{ - return (pciio_info->c_einfo); -} - -pciio_space_t -pciio_info_bar_space_get(pciio_info_t info, int win) -{ - return info->c_window[win].w_space; -} - -iopaddr_t -pciio_info_bar_base_get(pciio_info_t info, int win) -{ - return info->c_window[win].w_base; -} - -size_t -pciio_info_bar_size_get(pciio_info_t info, int win) -{ - return info->c_window[win].w_size; -} - -iopaddr_t -pciio_info_rom_base_get(pciio_info_t info) -{ - return info->c_rbase; -} - -size_t -pciio_info_rom_size_get(pciio_info_t info) -{ - return info->c_rsize; -} - /* ===================================================================== * GENERIC PCI INITIALIZATION FUNCTIONS @@ -1085,11 +747,8 @@ pciio_attach(vertex_hdl_t pciio) { #if DEBUG && ATTACH_DEBUG -#if defined(SUPPORT_PRINTING_V_FORMAT) - printk("%v: pciio_attach\n", pciio); -#else - printk("0x%x: pciio_attach\n", pciio); -#endif + char devname[MAXDEVNAME]; + printk("%s: pciio_attach\n", vertex_to_name(pciio, devname, MAXDEVNAME)); #endif return 0; } @@ -1127,37 +786,6 @@ return (pciio_provider_t *) ainfo; } -/*ARGSUSED4 */ -int -pciio_driver_register( - pciio_vendor_id_t vendor_id, - pciio_device_id_t device_id, - char *driver_prefix, - unsigned flags) -{ - return(0); -} - -vertex_hdl_t -pciio_device_register( - vertex_hdl_t connectpt, /* vertex for /hw/.../pciio/%d */ - vertex_hdl_t master, /* card's master ASIC (PCI provider) */ - pciio_slot_t slot, /* card's slot */ - pciio_function_t func, /* card's func */ - pciio_vendor_id_t vendor_id, - pciio_device_id_t device_id) -{ - return pciio_device_info_register - (connectpt, pciio_device_info_new (NULL, master, slot, func, - vendor_id, device_id)); -} - -void -pciio_device_unregister(vertex_hdl_t pconn) -{ - DEV_FUNC(pconn,device_unregister)(pconn); -} - pciio_info_t pciio_device_info_new( pciio_info_t pciio_info, @@ -1190,7 +818,7 @@ /* NOTE : pciio_info is a structure within the pcibr_info * and not a pointer to memory allocated on the heap !! */ - BZERO((char *)pciio_info,sizeof(pciio_info)); + memset((char *)pciio_info, 0, sizeof(pciio_info)); } vertex_hdl_t @@ -1330,12 +958,22 @@ struct resource *new_res; int status = 0; - new_res = (struct resource *) kmalloc( sizeof(struct resource), KM_NOSLEEP); + new_res = (struct resource *) kmalloc( sizeof(struct resource), GFP_KERNEL); - status = allocate_resource( root_resource, new_res, + if (start > 0) { + status = allocate_resource( root_resource, new_res, + size, start /* Min start addr. */, + (start + size) - 1, 1, + NULL, NULL); + } else { + if (size > align) + align = size; + status = allocate_resource( root_resource, new_res, size, align /* Min start addr. */, root_resource->end, align, NULL, NULL); + } + if (status) { kfree(new_res); return((iopaddr_t) NULL); @@ -1434,105 +1072,3 @@ { return(0); } - - -/* - * These are complementary Linux interfaces that takes in a pci_dev * as the - * first arguement instead of vertex_hdl_t. - */ -iopaddr_t snia_pciio_dmatrans_addr(struct pci_dev *, device_desc_t, paddr_t, size_t, unsigned); -pciio_dmamap_t snia_pciio_dmamap_alloc(struct pci_dev *, device_desc_t, size_t, unsigned); -void snia_pciio_dmamap_free(pciio_dmamap_t); -iopaddr_t snia_pciio_dmamap_addr(pciio_dmamap_t, paddr_t, size_t); -void snia_pciio_dmamap_done(pciio_dmamap_t); -pciio_endian_t snia_pciio_endian_set(struct pci_dev *pci_dev, pciio_endian_t device_end, - pciio_endian_t desired_end); - -#include -EXPORT_SYMBOL(snia_pciio_dmatrans_addr); -EXPORT_SYMBOL(snia_pciio_dmamap_alloc); -EXPORT_SYMBOL(snia_pciio_dmamap_free); -EXPORT_SYMBOL(snia_pciio_dmamap_addr); -EXPORT_SYMBOL(snia_pciio_dmamap_done); -EXPORT_SYMBOL(snia_pciio_endian_set); - -int -snia_pcibr_rrb_alloc(struct pci_dev *pci_dev, - int *count_vchan0, - int *count_vchan1) -{ - vertex_hdl_t dev = PCIDEV_VERTEX(pci_dev); - - return pcibr_rrb_alloc(dev, count_vchan0, count_vchan1); -} -EXPORT_SYMBOL(snia_pcibr_rrb_alloc); - -pciio_endian_t -snia_pciio_endian_set(struct pci_dev *pci_dev, - pciio_endian_t device_end, - pciio_endian_t desired_end) -{ - vertex_hdl_t dev = PCIDEV_VERTEX(pci_dev); - - return DEV_FUNC(dev, endian_set) - (dev, device_end, desired_end); -} - -iopaddr_t -snia_pciio_dmatrans_addr(struct pci_dev *pci_dev, /* translate for this device */ - device_desc_t dev_desc, /* device descriptor */ - paddr_t paddr, /* system physical address */ - size_t byte_count, /* length */ - unsigned flags) -{ /* defined in dma.h */ - - vertex_hdl_t dev = PCIDEV_VERTEX(pci_dev); - - /* - * If the device is not a PIC, we always want the PCIIO_BYTE_STREAM to be - * set. Otherwise, it must not be set. This applies to SN1 and SN2. - */ - return DEV_FUNC(dev, dmatrans_addr) - (dev, dev_desc, paddr, byte_count, (IS_PIC_DEVICE(pci_dev)) ? (flags & ~PCIIO_BYTE_STREAM) : flags | PCIIO_BYTE_STREAM); -} - -pciio_dmamap_t -snia_pciio_dmamap_alloc(struct pci_dev *pci_dev, /* set up mappings for this device */ - device_desc_t dev_desc, /* device descriptor */ - size_t byte_count_max, /* max size of a mapping */ - unsigned flags) -{ /* defined in dma.h */ - - vertex_hdl_t dev = PCIDEV_VERTEX(pci_dev); - - /* - * If the device is not a PIC, we always want the PCIIO_BYTE_STREAM to be - * set. Otherwise, it must not be set. This applies to SN1 and SN2. - */ - return (pciio_dmamap_t) DEV_FUNC(dev, dmamap_alloc) - (dev, dev_desc, byte_count_max, (IS_PIC_DEVICE(pci_dev)) ? (flags & ~PCIIO_BYTE_STREAM) : flags | PCIIO_BYTE_STREAM); -} - -void -snia_pciio_dmamap_free(pciio_dmamap_t pciio_dmamap) -{ - DMAMAP_FUNC(pciio_dmamap, dmamap_free) - (CAST_DMAMAP(pciio_dmamap)); -} - -iopaddr_t -snia_pciio_dmamap_addr(pciio_dmamap_t pciio_dmamap, /* use these mapping resources */ - paddr_t paddr, /* map for this address */ - size_t byte_count) -{ /* map this many bytes */ - return DMAMAP_FUNC(pciio_dmamap, dmamap_addr) - (CAST_DMAMAP(pciio_dmamap), paddr, byte_count); -} - -void -snia_pciio_dmamap_done(pciio_dmamap_t pciio_dmamap) -{ - DMAMAP_FUNC(pciio_dmamap, dmamap_done) - (CAST_DMAMAP(pciio_dmamap)); -} - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/pic.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pic.c --- linux-2.4.22/arch/ia64/sn/io/sn2/pic.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/pic.c 2003-10-22 22:48:56.000000000 +0000 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -130,7 +131,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; @@ -139,7 +140,7 @@ /* pcibr widget hw/module/001c11/slab/0/Pbrick/xtalk/12 */ /* sprintf(pathname, "%v", conn_v); */ xbow_peer = NASID_TO_COMPACT_NODEID(NODEPDA(cnode)->xbow_peer); - pos = hwgfs_generate_path(conn_v, tmpbuf, 256); + pos = hwgraph_generate_path(conn_v, tmpbuf, 256); strcpy(pathname, &tmpbuf[pos]); p = pathname + strlen("hw/module/001c01/slab/0/"); @@ -183,6 +184,11 @@ if (!pic_bus1_widget_info_dup(conn_v, peer_conn_v, xbow_peer)) 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; } } @@ -199,6 +205,9 @@ 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; + int brick_type; + int iobrick_type_get_nasid(nasid_t nasid); + PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, conn_v, "pic_attach()\n")); @@ -228,10 +237,19 @@ * the Bridge registers themselves. */ /* FIXME: what should the hwgraph path look like ? */ - rc = hwgraph_path_add(conn_v0, EDGE_LBL_PCIX_0, &pcibr_vhdl0); - ASSERT(rc == GRAPH_SUCCESS); - rc = hwgraph_path_add(conn_v1, EDGE_LBL_PCIX_1, &pcibr_vhdl1); - ASSERT(rc == GRAPH_SUCCESS); + brick_type = iobrick_type_get_nasid(NASID_GET(bridge0)); + if ( brick_type == MODULE_CGBRICK ) { + rc = hwgraph_path_add(conn_v0, EDGE_LBL_AGP_0, &pcibr_vhdl0); + ASSERT(rc == GRAPH_SUCCESS); + rc = hwgraph_path_add(conn_v1, EDGE_LBL_AGP_1, &pcibr_vhdl1); + ASSERT(rc == GRAPH_SUCCESS); + } + else { + rc = hwgraph_path_add(conn_v0, EDGE_LBL_PCIX_0, &pcibr_vhdl0); + ASSERT(rc == GRAPH_SUCCESS); + rc = hwgraph_path_add(conn_v1, EDGE_LBL_PCIX_1, &pcibr_vhdl1); + ASSERT(rc == GRAPH_SUCCESS); + } PCIBR_DEBUG_ALWAYS((PCIBR_DEBUG_ATTACH, conn_v, "pic_attach: pcibr_vhdl0=%v, pcibr_vhdl1=%v\n", @@ -292,9 +310,7 @@ (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_devenable_f *) 0, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/shub.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/shub.c --- linux-2.4.22/arch/ia64/sn/io/sn2/shub.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/shub.c 2003-10-22 22:47:29.000000000 +0000 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -35,44 +36,18 @@ #include #include -/* - * Shub WAR for Xbridge Little Endian problem: - * Xbridge has to run in BIG ENDIAN even with Shub. - */ - - -/* - * io_sh_swapper: Turn on Shub byte swapping. - * All data destined to and from Shub to XIO are byte-swapped. - */ -void -io_sh_swapper(nasid_t nasid, int onoff) -{ - ii_iwc_u_t ii_iwc; - - ii_iwc.ii_iwc_regval = REMOTE_HUB_L(nasid, IIO_IWC); - - ii_iwc.ii_iwc_fld_s.i_dma_byte_swap = onoff; - REMOTE_HUB_S(nasid, IIO_IWC, ii_iwc.ii_iwc_regval); - ii_iwc.ii_iwc_regval = REMOTE_HUB_L(nasid, IIO_IWC); - -} +#define SHUB_NUM_ECF_REGISTERS 8 /* - * io_get_sh_swapper: Return current Swap mode. - * 1 = Swap on, 0 = Swap off. + * A backport of the 2.5 scheduler is used by many vendors of 2.4-based + * distributions. + * We can only guess its presence by the lack of the SCHED_YIELD flag. + * If the heuristic doesn't work, change this define by hand. */ -int -io_get_sh_swapper(nasid_t nasid) -{ - ii_iwc_u_t ii_iwc; - - ii_iwc.ii_iwc_regval = REMOTE_HUB_L(nasid, IIO_IWC); - return(ii_iwc.ii_iwc_fld_s.i_dma_byte_swap); - -} +#ifndef SCHED_YIELD +#define __HAVE_NEW_SCHEDULER 1 +#endif -#define SHUB_NUM_ECF_REGISTERS 8 static uint32_t shub_perf_counts[SHUB_NUM_ECF_REGISTERS]; @@ -206,7 +181,7 @@ #else cnode = (cnodeid_t)file->private_data; #endif - if (!cnode) + if (cnode < 0 || cnode >= numnodes) return -ENODEV; switch (cmd) { @@ -316,7 +291,12 @@ struct task_struct *tsk = current; daemonize(); + +#ifdef __HAVE_NEW_SCHEDULER set_user_nice(tsk, 19); +#else + tsk->nice = 19; +#endif sigfillset(&tsk->blocked); strcpy(tsk->comm, "linkstatd"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/shub_intr.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/shub_intr.c --- linux-2.4.22/arch/ia64/sn/io/sn2/shub_intr.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/shub_intr.c 2003-10-22 22:47:29.000000000 +0000 @@ -27,6 +27,9 @@ #include #include #include +#include +#include +#include /* ARGSUSED */ void @@ -37,11 +40,15 @@ xwidgetnum_t hub_widget_id(nasid_t nasid) { - hubii_wcr_t ii_wcr; /* the control status register */ - - ii_wcr.wcr_reg_value = REMOTE_HUB_L(nasid,IIO_WCR); - - return ii_wcr.wcr_fields_s.wcr_widget_id; + + if (!(nasid & 1)) { + hubii_wcr_t ii_wcr; /* the control status register */ + ii_wcr.wcr_reg_value = REMOTE_HUB_L(nasid,IIO_WCR); + return ii_wcr.wcr_fields_s.wcr_widget_id; + } else { + /* ICE does not have widget id. */ + return(-1); + } } static hub_intr_t @@ -79,7 +86,7 @@ xtalk_addr = SH_II_INT0 | ((unsigned long)nasid << 36) | (1UL << 47); } - intr_hdl = snia_kmem_alloc_node(sizeof(struct hub_intr_s), KM_NOSLEEP, cnode); + intr_hdl = snia_kmem_alloc_node(sizeof(struct hub_intr_s), cnode); ASSERT_ALWAYS(intr_hdl); xtalk_info = &intr_hdl->i_xtalk_info; @@ -188,3 +195,57 @@ ASSERT(rv == 0); intr_hdl->i_flags &= ~HUB_INTR_IS_CONNECTED; } + +/* + * Redirect an interrupt to another cpu. + */ + +void +sn_shub_redirect_intr(pcibr_intr_t intr, unsigned long cpu) { + unsigned long bit; + int cpuphys, slice; + nasid_t nasid; + unsigned long xtalk_addr; + bridge_t *bridge = intr->bi_soft->bs_base; + picreg_t int_enable; + picreg_t host_addr; + int irq; + + cpuphys = cpu_physical_id(cpu); + slice = cpu_physical_id_to_slice(cpuphys); + nasid = cpu_physical_id_to_nasid(cpuphys); + + if (slice) { + xtalk_addr = SH_II_INT1 | ((unsigned long)nasid << 36) | (1UL << 47); + } else { + xtalk_addr = SH_II_INT0 | ((unsigned long)nasid << 36) | (1UL << 47); + } + + for (bit = 0; bit < 8; bit++) { + if (intr->bi_ibits & (1 << bit) ) { + /* Disable interrupts. */ + int_enable = bridge->p_int_enable_64; + int_enable &= ~bit; + bridge->p_int_enable_64 = int_enable; + /* Reset Host address (Interrupt destination) */ + host_addr = bridge->p_int_addr_64[bit]; + host_addr &= ~((1UL << 48) - 1); + host_addr |= xtalk_addr; + bridge->p_int_addr_64[bit] = host_addr; + /* Enable interrupt */ + int_enable |= bit; + bridge->p_int_enable_64 = int_enable; + /* Force an interrupt, just in case. */ + bridge->b_force_pin[bit].intr = 1; + } + } + irq = intr->bi_irq; + if (pdacpu(cpu).sn_first_irq == 0 || pdacpu(cpu).sn_first_irq > irq) { + pdacpu(cpu).sn_first_irq = irq; + } + if (pdacpu(cpu).sn_last_irq < irq) { + pdacpu(cpu).sn_last_irq = irq; + } + intr->bi_cpu = (int)cpu; +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/shuberror.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/shuberror.c --- linux-2.4.22/arch/ia64/sn/io/sn2/shuberror.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/shuberror.c 2003-10-22 22:48:57.000000000 +0000 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -52,7 +53,6 @@ hub_error_clear(nasid_t nasid) { int i; - hubreg_t idsr; /* * Make sure spurious write response errors are cleared @@ -299,7 +299,7 @@ * Wait till hub indicates it's done. */ while (REMOTE_HUB_L(hinfo->h_nasid, IIO_ICDR) & IIO_ICDR_PND) - us_delay(1); + udelay(1); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/shubio.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/shubio.c --- linux-2.4.22/arch/ia64/sn/io/sn2/shubio.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/shubio.c 2003-10-22 22:48:43.000000000 +0000 @@ -310,8 +310,7 @@ if (!is_widget_pio_enabled(ioerror)) { if (error_state_get(hub_v) == ERROR_STATE_ACTION) - ioerror_dump("No outbound widget" - " access - ", + snia_ioerror_dump("No outbound widget access - ", error_code, mode, ioerror); return(IOERROR_HANDLED); } @@ -352,8 +351,7 @@ if (!is_widget_pio_enabled(ioerror)) { if (error_state_get(hub_v) == ERROR_STATE_ACTION) - ioerror_dump("No outbound widget" - " access - ", + snia_ioerror_dump("No outbound widget access - ", error_code, mode, ioerror); return(IOERROR_HANDLED); } @@ -478,7 +476,7 @@ error_state_set(vertex_hdl_t v,error_state_t new_state) { error_state_t old_state; - boolean_t replace = B_TRUE; + int replace = 1; /* Check if we have a valid hwgraph vertex */ if ( v == (vertex_hdl_t)0 ) @@ -497,7 +495,7 @@ * for this vertex. */ if (v_error_state_get(v,old_state) != GRAPH_SUCCESS) - replace = B_FALSE; + replace = 0; if (v_error_state_set(v,new_state,replace) != GRAPH_SUCCESS) { return(ERROR_RETURN_CODE_CANNOT_SET_STATE); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/xbow.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/xbow.c --- linux-2.4.22/arch/ia64/sn/io/sn2/xbow.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/xbow.c 2003-10-22 22:47:57.000000000 +0000 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,8 @@ /* #define XBOW_DEBUG 1 */ /* #define DEBUG_ERROR 1 */ +#define kdebug 0 + /* * Files needed to get the device driver entry points @@ -311,12 +314,12 @@ #endif /* XBRIDGE_REGS_SIM */ rev = XWIDGET_PART_REV_NUM(id); - mutex_spinlock_init(&soft->xbow_perf_lock); + spin_lock_init(&soft->xbow_perf_lock); soft->xbow_perfcnt[0].xp_perf_reg = &xbow->xb_perf_ctr_a; soft->xbow_perfcnt[1].xp_perf_reg = &xbow->xb_perf_ctr_b; /* Initialization for GBR bw allocation */ - mutex_spinlock_init(&soft->xbow_bw_alloc_lock); + spin_lock_init(&soft->xbow_bw_alloc_lock); #define XBOW_8_BIT_PORT_BW_MAX (400 * 1000 * 1000) /* 400 MB/s */ #define XBOW_16_BIT_PORT_BW_MAX (800 * 1000 * 1000) /* 800 MB/s */ @@ -419,43 +422,6 @@ return 0; /* attach successful */ } -/* This contains special-case code for grio. There are plans to make - * this general sometime in the future, but till then this should - * be good enough. - */ -xwidgetnum_t -xbow_widget_num_get(vertex_hdl_t dev) -{ - vertex_hdl_t tdev; - char devname[MAXDEVNAME]; - xwidget_info_t xwidget_info; - int i; - - vertex_to_name(dev, devname, MAXDEVNAME); - - /* If this is a pci controller vertex, traverse up using - * the ".." links to get to the widget. - */ - if (strstr(devname, EDGE_LBL_PCI) && - strstr(devname, EDGE_LBL_CONTROLLER)) { - tdev = dev; - for (i=0; i< 2; i++) { - if (hwgraph_edge_get(tdev, - HWGRAPH_EDGELBL_DOTDOT, &tdev) != - GRAPH_SUCCESS) - return XWIDGET_NONE; - } - - if ((xwidget_info = xwidget_info_chk(tdev)) != NULL) { - return (xwidget_info_id_get(xwidget_info)); - } else { - return XWIDGET_NONE; - } - } - - return XWIDGET_NONE; -} - /* * xbow_widget_present: See if a device is present * on the specified port of this crossbow. @@ -477,6 +443,10 @@ IS_PIC_XBOW(xbow->xb_wid_id) && port==0xf) { return 1; } + else if ( IS_PIC_XBOW(xbow->xb_wid_id) && port==0xb ) { + /* for opus the present bit doesn't work on port 0xb */ + return 1; + } return xbow->xb_link(port).link_aux_status & XB_AUX_STAT_PRESENT; } } @@ -805,7 +775,7 @@ XEM_ADD_VAR(wid_err_upper); XEM_ADD_VAR(wid_err_lower); XEM_ADD_VAR(wid_err_addr); - PRINT_PANIC("XIO Bus Error"); + panic("XIO Bus Error"); } } @@ -958,8 +928,9 @@ if (XBOW_WAR_ENABLED(PV854827, xbow->xb_wid_id) && IS_PIC_XBOW(xbow->xb_wid_id) && (port==0xf)) ; - else - if (!(link_aux_status & XB_AUX_STAT_PRESENT)) { + else if (IS_PIC_XBOW(xbow->xb_wid_id) && (port==0xb)) + ; /* WAR for opus this is missing on 0xb */ + else if (!(link_aux_status & XB_AUX_STAT_PRESENT)) { /* nobody connected. */ if (mode == MODE_DEVPROBE) return IOERROR_HANDLED; @@ -1094,14 +1065,13 @@ xbow_perf_t *xbow_perf = xbow_soft->xbow_perfcnt; xbow_perf_link_t *xbow_plink = xbow_soft->xbow_perflink; xbow_perfcount_t perf_reg; - unsigned long s; int link, i; for (i = 0; i < XBOW_PERF_COUNTERS; i++, xbow_perf++) { if (xbow_perf->xp_mode == XBOW_MONITOR_NONE) continue; - s = mutex_spinlock(&xbow_soft->xbow_perf_lock); + spin_lock(&xbow_soft->xbow_perf_lock); perf_reg.xb_counter_val = *(xbowreg_t *) xbow_perf->xp_perf_reg; @@ -1111,7 +1081,7 @@ ((perf_reg.xb_perf.count - xbow_perf->xp_current) & XBOW_COUNTER_MASK); xbow_perf->xp_current = perf_reg.xb_perf.count; - mutex_spinunlock(&xbow_soft->xbow_perf_lock, s); + spin_unlock(&xbow_soft->xbow_perf_lock); } } @@ -1132,7 +1102,6 @@ xbow_linkctrl_t xbow_link_ctrl; xbow_t *xbow = xbow_soft->base; xbow_perfcount_t perf_reg; - unsigned long s; int i; link -= BASE_XBOW_PORT; @@ -1145,10 +1114,10 @@ if ((counter < 0) || (counter >= XBOW_PERF_COUNTERS)) return -1; - s = mutex_spinlock(&xbow_soft->xbow_perf_lock); + spin_lock(&xbow_soft->xbow_perf_lock); if ((xbow_perf + counter)->xp_mode && mode) { - mutex_spinunlock(&xbow_soft->xbow_perf_lock, s); + spin_unlock(&xbow_soft->xbow_perf_lock); return -1; } for (i = 0; i < XBOW_PERF_COUNTERS; i++) { @@ -1156,7 +1125,7 @@ continue; if (((xbow_perf + i)->xp_link == link) && ((xbow_perf + i)->xp_mode)) { - mutex_spinunlock(&xbow_soft->xbow_perf_lock, s); + spin_unlock(&xbow_soft->xbow_perf_lock); return -1; } } @@ -1174,7 +1143,7 @@ *(xbowreg_t *) xbow_perf->xp_perf_reg = perf_reg.xb_counter_val; xbow_perf->xp_current = perf_reg.xb_perf.count; - mutex_spinunlock(&xbow_soft->xbow_perf_lock, s); + spin_unlock(&xbow_soft->xbow_perf_lock); return 0; } @@ -1262,15 +1231,10 @@ xbow_t *xbow; xbowreg_t ctrl; xbwX_stat_t stat; - unsigned itick; + unsigned long itick; unsigned dtick; - static int ticks_per_ms = 0; + static long ticks_to_wait = HZ / 1000; - if (!ticks_per_ms) { - itick = get_timestamp(); - us_delay(1000); - ticks_per_ms = get_timestamp() - itick; - } widget_info = xwidget_info_get(xconn_vhdl); port = xwidget_info_id_get(widget_info); @@ -1296,16 +1260,16 @@ */ ctrl = xbow->xb_link(port).link_control; xbow->xb_link(port).link_reset = 0; - itick = get_timestamp(); + itick = jiffies; while (1) { stat.linkstatus = xbow->xb_link(port).link_status; if (stat.link_alive) break; - dtick = get_timestamp() - itick; - if (dtick > ticks_per_ms) { + dtick = jiffies - itick; + if (dtick > ticks_to_wait) { return -1; /* never came out of reset */ } - DELAY(2); /* don't beat on link_status */ + udelay(2); /* don't beat on link_status */ } xbow->xb_link(port).link_control = ctrl; return 0; @@ -1379,7 +1343,6 @@ xbow_soft_t soft = xbow_soft_get(vhdl); volatile xbowreg_t *xreg; xbowreg_t mask; - unsigned long s; int error = 0; bandwidth_t old_bw_BYTES, req_bw_BYTES; xbowreg_t old_xreg; @@ -1393,7 +1356,7 @@ ASSERT(XBOW_WIDGET_IS_VALID(src_wid)); ASSERT(XBOW_WIDGET_IS_VALID(dest_wid)); - s = mutex_spinlock(&soft->xbow_bw_alloc_lock); + spin_lock(&soft->xbow_bw_alloc_lock); /* Get pointer to the correct register */ xreg = XBOW_PRIO_ARBREG_PTR(soft->base, dest_wid, src_wid); @@ -1444,7 +1407,7 @@ error = 1; } - mutex_spinunlock(&soft->xbow_bw_alloc_lock, s); + spin_unlock(&soft->xbow_bw_alloc_lock); return (error); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/sn2/xtalk.c linux-2.4.23-pre8/arch/ia64/sn/io/sn2/xtalk.c --- linux-2.4.22/arch/ia64/sn/io/sn2/xtalk.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/sn2/xtalk.c 2003-10-22 22:48:56.000000000 +0000 @@ -310,7 +310,7 @@ unsigned flags) { #if DEBUG - PRINT_PANIC("null_xtalk_early_piotrans_addr"); + panic("null_xtalk_early_piotrans_addr"); #endif return NULL; } @@ -553,7 +553,7 @@ #else printk(KERN_WARNING "Xbow at 0x%p encountered Fatal error", (void *)xconn); #endif - ioerror_dump("xtalk", error_code, mode, ioerror); + snia_ioerror_dump("xtalk", error_code, mode, ioerror); return IOERROR_UNHANDLED; } @@ -921,7 +921,7 @@ /* Clean out the xwidget information */ (void)kfree(widget_info->w_name); - BZERO((void *)widget_info, sizeof(widget_info)); + memset((void *)widget_info, 0, sizeof(widget_info)); DEL(widget_info); return(0); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/io/snia_if.c linux-2.4.23-pre8/arch/ia64/sn/io/snia_if.c --- linux-2.4.22/arch/ia64/sn/io/snia_if.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/io/snia_if.c 2003-10-22 22:47:37.000000000 +0000 @@ -0,0 +1,246 @@ +/* $Id$ + * + * 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. + * + * Copyright (C) 2003 Silicon Graphics, Inc. All rights reserved. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include /* Must be before iograph.h to get MAX_PORT_NUM */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !defined(DEV_FUNC) +extern pciio_provider_t *pciio_to_provider_fns(vertex_hdl_t dev); +#define DEV_FUNC(dev,func) pciio_to_provider_fns(dev)->func +#define CAST_PIOMAP(x) ((pciio_piomap_t)(x)) +#define CAST_DMAMAP(x) ((pciio_dmamap_t)(x)) +#define CAST_INTR(x) ((pciio_intr_t)(x)) +#endif + +/* + * Many functions are not passed their vertex + * information directly; rather, they must + * dive through a resource map. These macros + * are available to coordinate this detail. + */ +#define PIOMAP_FUNC(map,func) DEV_FUNC((map)->pp_dev,func) +#define DMAMAP_FUNC(map,func) DEV_FUNC((map)->pd_dev,func) +#define INTR_FUNC(intr_hdl,func) DEV_FUNC((intr_hdl)->pi_dev,func) + +int +snia_badaddr_val(volatile void *addr, int len, volatile void *ptr) +{ + int ret = 0; + volatile void *new_addr; + + switch (len) { + case 4: + new_addr = (void *) addr; + ret = ia64_sn_probe_io_slot((long)new_addr, len, (void *)ptr); + break; + default: + printk(KERN_WARNING "badaddr_val given len %x but supports len of 4 only\n", len); + } + + if (ret < 0) + panic("badaddr_val: unexpected status (%d) in probing", ret); + return(ret); + +} + + +nasid_t +snia_get_console_nasid(void) +{ + extern nasid_t console_nasid; + extern nasid_t master_baseio_nasid; + + if (console_nasid < 0) { + console_nasid = ia64_sn_get_console_nasid(); + if (console_nasid < 0) { +// ZZZ What do we do if we don't get a console nasid on the hardware???? + if (IS_RUNNING_ON_SIMULATOR() ) + console_nasid = master_baseio_nasid; + } + } + return console_nasid; +} + +nasid_t +snia_get_master_baseio_nasid(void) +{ + extern nasid_t master_baseio_nasid; + extern char master_baseio_wid; + + if (master_baseio_nasid < 0) { + master_baseio_nasid = ia64_sn_get_master_baseio_nasid(); + + if ( master_baseio_nasid >= 0 ) { + master_baseio_wid = WIDGETID_GET(KL_CONFIG_CH_CONS_INFO(master_baseio_nasid)->memory_base); + } + } + return master_baseio_nasid; +} + + +void +snia_ioerror_dump(char *name, int error_code, int error_mode, ioerror_t *ioerror) +{ +#ifdef LATER + /* This needs to be tested */ + + static char *error_mode_string[] = + { "probe", "kernel", "user", "reenable" }; + + printk("%s%s%s%s%s error in %s mode\n", + name, + (error_code & IOECODE_PIO) ? " PIO" : "", + (error_code & IOECODE_DMA) ? " DMA" : "", + (error_code & IOECODE_READ) ? " Read" : "", + (error_code & IOECODE_WRITE) ? " Write" : "", + error_mode_string[error_mode]); + +#define PRFIELD(f) \ + if (IOERROR_FIELDVALID(ioerror,f)) { \ + int tmp; \ + IOERROR_GETVALUE(tmp, ioerror, f); \ + printk("\t%20s: 0x%x\n", #f, tmp); \ + } + + PRFIELD(errortype); /* error type: extra info about error */ + PRFIELD(widgetnum); /* Widget number that's in error */ + PRFIELD(widgetdev); /* Device within widget in error */ + PRFIELD(srccpu); /* CPU on srcnode generating error */ + PRFIELD(srcnode); /* Node which caused the error */ + PRFIELD(errnode); /* Node where error was noticed */ + PRFIELD(sysioaddr); /* Sys specific IO address */ + PRFIELD(xtalkaddr); /* Xtalk (48bit) addr of Error */ + PRFIELD(busspace); /* Bus specific address space */ + PRFIELD(busaddr); /* Bus specific address */ + PRFIELD(vaddr); /* Virtual address of error */ + PRFIELD(memaddr); /* Physical memory address */ + PRFIELD(epc); /* pc when error reported */ + PRFIELD(ef); /* eframe when error reported */ + +#undef PRFIELD + + { + /* Print a more descriptive CPU string */ + cpuid_t srccpu; + IOERROR_GETVALUE(srccpu, ioerror, srccpu); + // smp_processor_id() + printk("(NOTE: CPU %d)\n", srccpu); + printk("\n"); + } +#endif /* LATER */ +} + + +int +snia_pcibr_rrb_alloc(struct pci_dev *pci_dev, + int *count_vchan0, + int *count_vchan1) +{ + vertex_hdl_t dev = PCIDEV_VERTEX(pci_dev); + + return pcibr_rrb_alloc(dev, count_vchan0, count_vchan1); +} + +pciio_endian_t +snia_pciio_endian_set(struct pci_dev *pci_dev, + pciio_endian_t device_end, + pciio_endian_t desired_end) +{ + vertex_hdl_t dev = PCIDEV_VERTEX(pci_dev); + + return DEV_FUNC(dev, endian_set) + (dev, device_end, desired_end); +} + +iopaddr_t +snia_pciio_dmatrans_addr(struct pci_dev *pci_dev, /* translate for this device */ + device_desc_t dev_desc, /* device descriptor */ + paddr_t paddr, /* system physical address */ + size_t byte_count, /* length */ + unsigned flags) +{ /* defined in dma.h */ + + vertex_hdl_t dev = PCIDEV_VERTEX(pci_dev); + + /* + * If the device is not a PIC, we always want the PCIIO_BYTE_STREAM to be + * set. Otherwise, it must not be set. This applies to SN1 and SN2. + */ + return DEV_FUNC(dev, dmatrans_addr) + (dev, dev_desc, paddr, byte_count, flags & ~PCIIO_BYTE_STREAM); +} + +pciio_dmamap_t +snia_pciio_dmamap_alloc(struct pci_dev *pci_dev, /* set up mappings for this device */ + device_desc_t dev_desc, /* device descriptor */ + size_t byte_count_max, /* max size of a mapping */ + unsigned flags) +{ /* defined in dma.h */ + + vertex_hdl_t dev = PCIDEV_VERTEX(pci_dev); + + /* + * If the device is not a PIC, we always want the PCIIO_BYTE_STREAM to be + * set. Otherwise, it must not be set. This applies to SN1 and SN2. + */ + return (pciio_dmamap_t) DEV_FUNC(dev, dmamap_alloc) + (dev, dev_desc, byte_count_max, flags & ~PCIIO_BYTE_STREAM); +} + +void +snia_pciio_dmamap_free(pciio_dmamap_t pciio_dmamap) +{ + DMAMAP_FUNC(pciio_dmamap, dmamap_free) + (CAST_DMAMAP(pciio_dmamap)); +} + +iopaddr_t +snia_pciio_dmamap_addr(pciio_dmamap_t pciio_dmamap, /* use these mapping resources */ + paddr_t paddr, /* map for this address */ + size_t byte_count) +{ /* map this many bytes */ + return DMAMAP_FUNC(pciio_dmamap, dmamap_addr) + (CAST_DMAMAP(pciio_dmamap), paddr, byte_count); +} + +void +snia_pciio_dmamap_done(pciio_dmamap_t pciio_dmamap) +{ + DMAMAP_FUNC(pciio_dmamap, dmamap_done) + (CAST_DMAMAP(pciio_dmamap)); +} + +#include +EXPORT_SYMBOL(snia_pciio_dmatrans_addr); +EXPORT_SYMBOL(snia_pciio_dmamap_alloc); +EXPORT_SYMBOL(snia_pciio_dmamap_free); +EXPORT_SYMBOL(snia_pciio_dmamap_addr); +EXPORT_SYMBOL(snia_pciio_dmamap_done); +EXPORT_SYMBOL(snia_pciio_endian_set); +EXPORT_SYMBOL(snia_pcibr_rrb_alloc); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/Makefile linux-2.4.23-pre8/arch/ia64/sn/kernel/Makefile --- linux-2.4.22/arch/ia64/sn/kernel/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/Makefile 2003-10-22 22:48:11.000000000 +0000 @@ -44,9 +44,8 @@ subdir-y = sn2 -obj-y = probe.o setup.o sv.o bte.o -obj-y += irq.o mca.o idle.o -obj-y += sn2/sn2.o +obj-y = bte.o idle.o irq.o mca.o probe.o setup.o \ + sn_ivt.o sn2/sn2.o sv.o obj-$(CONFIG_IA64_GENERIC) += machvec.o obj-$(CONFIG_MODULES) += sn_ksyms.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/bte.c linux-2.4.23-pre8/arch/ia64/sn/kernel/bte.c --- linux-2.4.22/arch/ia64/sn/kernel/bte.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/bte.c 2003-10-22 22:47:29.000000000 +0000 @@ -156,8 +156,8 @@ /* Set the notification register */ BTE_PRINTKV(("IBNA - HUB_S(0x%p, 0x%lx)\n", BTEREG_NOTIF_ADDR, - (TO_PHYS(__tpa(bte->most_rcnt_na))))); - HUB_S(BTEREG_NOTIF_ADDR, (TO_PHYS(__tpa(bte->most_rcnt_na)))); + (TO_PHYS(ia64_tpa(bte->most_rcnt_na))))); + HUB_S(BTEREG_NOTIF_ADDR, (TO_PHYS(ia64_tpa(bte->most_rcnt_na)))); /* Initiate the transfer */ @@ -294,7 +294,7 @@ headBteLen += footBteLen; } else if (footBcopyLen > 0) { rv = bte_copy(footBteSource, - __tpa(bteBlock), + ia64_tpa(bteBlock), footBteLen, mode, NULL); if (rv != BTE_SUCCESS) { return rv; @@ -344,7 +344,7 @@ if (headBcopyLen > 0) { rv = bte_copy(headBteSource, - __tpa(bteBlock), headBteLen, mode, NULL); + ia64_tpa(bteBlock), headBteLen, mode, NULL); if (rv != BTE_SUCCESS) { return rv; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/irq.c linux-2.4.23-pre8/arch/ia64/sn/kernel/irq.c --- linux-2.4.22/arch/ia64/sn/kernel/irq.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/irq.c 2003-10-22 22:47:39.000000000 +0000 @@ -68,6 +68,13 @@ extern void pcibr_force_interrupt(pcibr_intr_t intr); extern int sn_force_interrupt_flag; +struct pcibr_intr_list_t { + struct pcibr_intr_list_t *next; + pcibr_intr_t intr; +}; + +static struct pcibr_intr_list_t **pcibr_intr_list; + static unsigned int @@ -134,14 +141,37 @@ platform_send_ipi(smp_processor_id(), SGI_UART_VECTOR, IA64_IPI_DM_INT, 0); } } - __clear_bit(ivec, (volatile void *)pda.sn_in_service_ivecs); + clear_bit(ivec, (volatile void *)pda.sn_in_service_ivecs); if (sn_force_interrupt_flag) force_interrupt(irq); } static void -sn_set_affinity_irq(unsigned int irq, unsigned long mask) +sn_set_affinity_irq(unsigned int irq, unsigned long cpu) { + int redir = 0; + struct pcibr_intr_list_t *p = pcibr_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->intr; + + if (intr == NULL) + return; + + if (IS_PIC_SOFT(intr->bi_soft) ) { + sn_shub_redirect_intr(intr, cpu); + // Defer TIO for now. + // } else if (IS_TIO_SOFT(intr->bi_soft) { + // sn_tio_redirect_intr(intr, cpu); + } else { + return; + } + (void) set_irq_affinity_info(irq, cpu_physical_id(cpu), redir); } @@ -181,7 +211,7 @@ int i; irq_desc_t *base_desc = _irq_desc; - for (i=IA64_FIRST_DEVICE_VECTOR; ibi_cpu; if (pcibr_intr_list == NULL) { pcibr_intr_list = kmalloc(sizeof(struct pcibr_intr_list_t *) * NR_IRQS, GFP_KERNEL); @@ -227,7 +250,7 @@ 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 (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 pcibr_intr_list_t\n"); if ((list = pcibr_intr_list[irq])) { while (list->next) list = list->next; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/led.c linux-2.4.23-pre8/arch/ia64/sn/kernel/led.c --- linux-2.4.22/arch/ia64/sn/kernel/led.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/led.c 2003-10-22 22:48:41.000000000 +0000 @@ -0,0 +1,56 @@ +/* + * + * + * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/NoticeExplan + */ + +#include +#include +#include + +struct timer_list sn_led_timer; + +static void +sn_led_timeout (unsigned long arg) +{ + set_led_bits(pda.hb_state ^= LED_CPU_HEARTBEAT, LED_CPU_HEARTBEAT); + sn_led_timer.expires = jiffies + HZ/2; + add_timer(&sn_led_timer); +} + +void __init +sn_led_timer_init (void) +{ + init_timer(&sn_led_timer); + sn_led_timer.expires = jiffies + HZ/2; + sn_led_timer.function = &sn_led_timeout; + add_timer(&sn_led_timer); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/setup.c linux-2.4.23-pre8/arch/ia64/sn/kernel/setup.c --- linux-2.4.22/arch/ia64/sn/kernel/setup.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/setup.c 2003-10-22 22:49:21.000000000 +0000 @@ -56,8 +56,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -71,7 +73,7 @@ #include #include -#define pxm_to_nasid(pxm) ((pxm)<<1) +#define pxm_to_nasid(pxm) (((pxm)<<1) | (get_nasid() & ~0x1ff)) #define MAX_PHYS_MEMORY (1UL << 49) /* 1 TB */ @@ -79,8 +81,12 @@ extern void bte_init_cpu (void); extern void sn_timer_init(void); extern unsigned long last_time_offset; +extern void init_platform_hubinfo(nodepda_t **nodepdaindr); extern void (*ia64_mark_idle)(int); +extern void (*ia64_platform_timer_extras)(void); +extern void sn_timer_interrupt_extras(void); extern void snidle(int); +extern unsigned char acpi_kbd_controller_present; unsigned long sn_rtc_cycles_per_second; @@ -90,6 +96,7 @@ short physical_node_map[MAX_PHYSNODE_ID]; +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], @@ -223,7 +230,77 @@ shub_1_1_found = 1; } +/* + * SN2 requires very slightly different alternate data-TLB miss handle than what + * the mainline linux kernel provides. At some point this approach could be used + * to allow the use of the low-memory thrown away on other platforms when VGA is + * present. + * + * On SN2 we want to load small TCs for granule-0 (and aliases of) faulting + * addresses. The details of this are more sublte than at which they first + * appear. + */ +static void __init +sn2_replace_ivt(void) +{ + extern unsigned char alt_dtlb_miss[], ia64_ivt_page_fault[]; + extern unsigned char sn2_alt_dtlb_miss[], sn2_alt_dtlb_miss_end[]; + extern unsigned char sn2_alt_dtlb_miss_patch1[]; + + unsigned char *s, *d; + u64 *p; + u64 len = (u64)sn2_alt_dtlb_miss_end - (u64)sn2_alt_dtlb_miss; + u64 broffs = (ia64_ivt_page_fault - alt_dtlb_miss) - (sn2_alt_dtlb_miss_patch1 - sn2_alt_dtlb_miss); + u64 psr; + int i; + + /* printk(KERN_DEBUG "Replacing alternate data-TLB miss handler.\n"); */ + + /* Check the code isn't too large */ + if (len > 1024) { + printk(KERN_ERR "SGI: Specific alt_dtlb_misse too large! Not replacing\n"); + return; + } + + /* check the offset is sane (should always be) */ + if ((broffs>>4) + (1<<20) >= (1<<21)) { + printk(KERN_ERR "SGI: IVT patch ivt offset %ld invalid! Not replacing!\n", broffs); + return; + } + + /* 2nd half of bundle to patch (has slot 2) */ + p = (u64*)sn2_alt_dtlb_miss_patch1 + 1; + /* patch the offset into slot 2 (imm20b + s) */ + *p = (*p & ~(0x8fffff000000000)) | ((broffs & 0x1000000) << 35) | ((broffs & 0x0fffff0) << 32); + + /* don't want any interrupts when doing this */ + psr = ia64_clear_ic(); + + /* copy over the existing code, flush i-cache as required */ + d = alt_dtlb_miss; + s = sn2_alt_dtlb_miss; + for (i=0; ipernode_pdaindr, nodepdaindr, sizeof(nodepdaindr)); @@ -362,8 +482,16 @@ */ for (cnode = 0; cnode < numnodes; cnode++) { init_platform_nodepda(nodepdaindr[cnode], cnode); + spin_lock_init(&nodepdaindr[cnode]->bist_lock); bte_init_node (nodepdaindr[cnode], cnode); } + + /* + * Handle TIO differently .. we do not do BTE init .. + */ + for (cnode = numnodes; cnode < numionodes; cnode++) { + init_platform_nodepda(nodepdaindr[cnode], cnode); + } } /** @@ -383,6 +511,7 @@ int nasid; int slice; int cnode, i; + static int wars_have_been_checked = 0; /* * The boot cpu makes this call again after platform initialization is @@ -407,11 +536,22 @@ pda.hb_count = HZ/2; pda.hb_state = 0; pda.idle_flag = 0; - 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; iactive_cpu_count == 1) nodepda->node_first_cpu = cpuid; @@ -444,3 +584,27 @@ bte_init_cpu(); } + +/* + * Scan klconfig for TIO's. Add the TIO nasids to the + * physical_node_map and the pda and increment numionodes. + */ + +void +scan_for_ionodes() { + int nasid = 0; + lboard_t *brd; + + /* Scan all compute 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((lboard_t *)KL_CONFIG_INFO(nasid), KLTYPE_TIO); + while (brd) { + pda.cnodeid_to_nasid_table[numionodes] = brd->brd_nasid; + physical_node_map[brd->brd_nasid] = numionodes++; + brd = KLCF_NEXT(brd); + brd = find_lboard(brd, KLTYPE_TIO); + } + } +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/sn2/Makefile linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/Makefile --- linux-2.4.22/arch/ia64/sn/kernel/sn2/Makefile 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/Makefile 2003-10-22 22:49:43.000000000 +0000 @@ -44,6 +44,6 @@ export-objs := io.o obj-y = cache.o io.o ptc_deadlock.o sn2_smp.o sn_proc_fs.o \ - prominfo_proc.o timer.o + prominfo_proc.o timer.o timer_interrupt.o include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/sn2/cache.c linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/cache.c --- linux-2.4.22/arch/ia64/sn/kernel/sn2/cache.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/cache.c 2003-10-22 22:48:20.000000000 +0000 @@ -23,6 +23,18 @@ void sn_flush_all_caches(long flush_addr, long bytes) { + /* + * The following double call to flush_icache_range has + * the following effect which is required: + * + * The first flush_icache_range ensures the fc() address + * is visible on the FSB. The NUMA controller however has + * not necessarily forwarded the fc() request to all other + * NUMA controllers. The second call will stall + * at the associated fc() instruction until the first + * has been forwarded to all other NUMA controllers. + */ + flush_icache_range(flush_addr, flush_addr+bytes); flush_icache_range(flush_addr, flush_addr+bytes); mb(); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/sn2/sn_proc_fs.c linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/sn_proc_fs.c --- linux-2.4.22/arch/ia64/sn/kernel/sn2/sn_proc_fs.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/sn_proc_fs.c 2003-10-22 22:47:50.000000000 +0000 @@ -36,6 +36,7 @@ #ifdef CONFIG_PROC_FS #include #include +#include static int partition_id_read_proc(char *page, char **start, off_t off, @@ -184,12 +185,66 @@ } } +#define SHUB_MAX_VERSION 3 +static struct proc_dir_entry **proc_entries; +static char* shub_revision[SHUB_MAX_VERSION+1] = { + "unknown", + "1.0", + "1.1", + "1.2" +}; + +static int +read_shub_info_entry(char* page, char **start, off_t off, int count, int *eof, + void* data) { + unsigned long id; + int rev; + int nasid = (long) data; /* Data contains NASID of this node */ + int len = 0; + + id = REMOTE_HUB_L(nasid, SH_SHUB_ID); + rev = (id & SH_SHUB_ID_REVISION_MASK) >> SH_SHUB_ID_REVISION_SHFT; + len += sprintf(&page[len], "type : SHub\n"); + len += sprintf(&page[len], "revision : %s\n", + (rev <= SHUB_MAX_VERSION) ? shub_revision[rev] : "unknown"); + len += sprintf(&page[len], "nasid : %d\n", nasid); + + return len; +} + +static void +register_sn_nodes(void) { + struct proc_dir_entry **entp; + cnodeid_t cnodeid; + nasid_t nasid; + char name[11]; + + if (!sgi_proc_dir) { + sgi_proc_dir = proc_mkdir("sgi_sn", 0); + } + + proc_entries = kmalloc(numnodes * sizeof(struct proc_dir_entry *), + GFP_KERNEL); + + for (cnodeid = 0, entp = proc_entries; + cnodeid < numnodes; + cnodeid++, entp++) { + sprintf(name, "node%d", cnodeid); + *entp = proc_mkdir(name, sgi_proc_dir); + nasid = cnodeid_to_nasid(cnodeid); + create_proc_read_entry( + "hubinfo", 0, *entp, read_shub_info_entry, + (void*) (long) nasid); + } +} + void register_sn_procfs(void) { register_sn_partition_id(); register_sn_serial_numbers(); register_sn_force_interrupt(); register_sn_linkstats(); + register_sn_nodes(); } #endif /* CONFIG_PROC_FS */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/sn2/timer.c linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/timer.c --- linux-2.4.22/arch/ia64/sn/kernel/sn2/timer.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/timer.c 2003-10-22 22:47:44.000000000 +0000 @@ -34,7 +34,7 @@ */ extern unsigned long wall_jiffies; /* from kernel/timer.c */ -static volatile long rtc_offset; +static volatile long rtc_offset __cacheline_aligned; static long rtc_cycles_per_usec; static long rtc_per_timer_tick; @@ -86,7 +86,6 @@ last_wall_rtc = GET_RTC_COUNTER(); } - void __init sn_timer_init(void) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/sn2/timer_interrupt.c linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/timer_interrupt.c --- linux-2.4.22/arch/ia64/sn/kernel/sn2/timer_interrupt.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2/timer_interrupt.c 2003-10-22 22:48:55.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * + * + * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/NoticeExplan + */ + +#include +#include + +extern void sn_lb_int_war_check(void); +#define SN_LB_INT_WAR_INTERVAL 100 + +void +sn_timer_interrupt_extras(void) +{ + /* LED blinking */ + if (!pda.hb_count--) { + pda.hb_count = HZ/2; + set_led_bits(pda.hb_state ^= LED_CPU_HEARTBEAT, LED_CPU_HEARTBEAT); + } + + if (enable_shub_wars_1_1()) { + /* Bugfix code for SHUB 1.1 */ + if (pda.pio_shub_war_cam_addr) + *pda.pio_shub_war_cam_addr = 0x8000000000000010UL; + } + if (pda.sn_lb_int_war_ticks == 0) + sn_lb_int_war_check(); + pda.sn_lb_int_war_ticks++; + if (pda.sn_lb_int_war_ticks >= SN_LB_INT_WAR_INTERVAL) + pda.sn_lb_int_war_ticks = 0; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/sn2_smp.c linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2_smp.c --- linux-2.4.22/arch/ia64/sn/kernel/sn2_smp.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/sn2_smp.c 2003-10-22 22:49:56.000000000 +0000 @@ -0,0 +1,242 @@ +/* + * SN2 Platform specific SMP Support + * + * Copyright (C) 2000-2003 Silicon Graphics, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/NoticeExplan + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void sn2_ptc_deadlock_recovery(unsigned long data0, unsigned long data1); + + +static spinlock_t sn2_global_ptc_lock __cacheline_aligned = SPIN_LOCK_UNLOCKED; + +static unsigned long sn2_ptc_deadlock_count; + + +static inline unsigned long +wait_piowc(void) +{ + volatile unsigned long *piows; + unsigned long ws; + + piows = pda.pio_write_status_addr; + do { + __asm__ __volatile__ ("mf.a" ::: "memory"); + } while (((ws = *piows) & SH_PIO_WRITE_STATUS_0_PENDING_WRITE_COUNT_MASK) != + SH_PIO_WRITE_STATUS_0_PENDING_WRITE_COUNT_MASK); + return ws; +} + + + +/** + * sn2_global_tlb_purge - globally purge translation cache of virtual address range + * @start: start of virtual address range + * @end: end of virtual address range + * @nbits: specifies number of bytes to purge per instruction (num = 1<<(nbits & 0xfc)) + * + * Purges the translation caches of all processors of the given virtual address + * range. + */ + +void +sn2_global_tlb_purge (unsigned long start, unsigned long end, unsigned long nbits) +{ + int cnode, mycnode, nasid, flushed=0; + volatile unsigned long *ptc0, *ptc1; + unsigned long flags=0, data0, data1; + + data0 = (1UL<>8)< + * David Mosberger + * + * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved. + * + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +/* If someone has a *really* good reason to disable the VHPT for SN2 I'll fix this. --cw */ +#ifdef CONFIG_DISABLE_VHPT +#error SN2 requires VHPT be enabled +#endif + + .section ".text.init", "ax" + +/* + * SN2 specific region 6/7 dtlb miss handler. + * + * On SN2 some granule-0 addresses (and therefore any aliases) are + * actually used uncachable. We load small TC entries to ensure there + * is no-overlap between such regions (which could cause a Cache-Check + * MCA). + */ +#define SN2_GMASK (((1 << (36-IA64_GRANULE_SHIFT)) - 1) << IA64_GRANULE_SHIFT) + .global sn2_alt_dtlb_miss +ENTRY(sn2_alt_dtlb_miss) + mov r16=cr.ifa // get address that caused the TLB miss + movl r17=PAGE_KERNEL // kernel protection bits (RWX) + mov r20=cr.isr // need to check for SP and NA status + movl r19=(((1< region 6) + and r24=r27,r16 // mask away all but region bits + ;; + cmp.ne.andcm p10,p0=r0,r24 // p10 <- region-6 AND granule-0 + +/* arch/ia64/sn/kernel/setup.c patches this code, you should check there if you need to mess about with this */ + .global sn2_alt_dtlb_miss_patch1 +sn2_alt_dtlb_miss_patch1: + { .mib +(p9) cmp.eq.or.andcm p6,p7=IA64_ISR_CODE_LFETCH,r22 // check isr.code field + cmp.ne p8,p0=r0,r23 // p8 <- cpl == 0? +(p8) br.cond.spnt.many ia64_ivt_page_fault // NB: gets patched + } + + ;; +(p10) mov cr.itir=r25 // use smaller pagesize for tc + dep r21=-1,r21,IA64_PSR_ED_BIT,1 // r21 is psr with ED enabled + or r19=r19,r17 // insert PTE control bits into r19 + ;; +(p6) mov cr.ipsr=r21 // p6 (speculation): set ed (else we can get stuck) +(p11) dep r19=-1,r19,4,1 // set bit 4 (uncached) if the access was to region 6 + ;; +(p7) itc.d r19 // insert the TLB entry + mov pr=r31,-1 // restore pr's + rfi +END(alt_dtlb_miss) + .align 8 + .global sn2_alt_dtlb_miss_end +sn2_alt_dtlb_miss_end: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/sn/kernel/sn_ksyms.c linux-2.4.23-pre8/arch/ia64/sn/kernel/sn_ksyms.c --- linux-2.4.22/arch/ia64/sn/kernel/sn_ksyms.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/sn/kernel/sn_ksyms.c 2003-10-22 22:49:45.000000000 +0000 @@ -64,7 +64,6 @@ #include EXPORT_SYMBOL(sal_lock); EXPORT_SYMBOL(sn_partid); -EXPORT_SYMBOL(sn_local_partid); EXPORT_SYMBOL(sn_system_serial_number_string); EXPORT_SYMBOL(sn_partition_serial_number); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ia64/tools/print_offsets.c linux-2.4.23-pre8/arch/ia64/tools/print_offsets.c --- linux-2.4.22/arch/ia64/tools/print_offsets.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/ia64/tools/print_offsets.c 2003-10-22 22:49:35.000000000 +0000 @@ -1,6 +1,7 @@ /* * Utility to generate asm-ia64/offsets.h. * + * Copyright (C) 2002-2003 Fenghua Yu * Copyright (C) 1999-2001 Hewlett-Packard Co * David Mosberger-Tang * @@ -63,6 +64,14 @@ #endif { "IA64_TASK_PID_OFFSET", offsetof (struct task_struct, pid) }, { "IA64_TASK_MM_OFFSET", offsetof (struct task_struct, mm) }, + { "IA64_PT_REGS_B6_OFFSET", offsetof (struct pt_regs, b6) }, + { "IA64_PT_REGS_B7_OFFSET", offsetof (struct pt_regs, b7) }, + { "IA64_PT_REGS_AR_CSD_OFFSET", offsetof (struct pt_regs, ar_csd) }, + { "IA64_PT_REGS_AR_SSD_OFFSET", offsetof (struct pt_regs, ar_ssd) }, + { "IA64_PT_REGS_R8_OFFSET", offsetof (struct pt_regs, r8) }, + { "IA64_PT_REGS_R9_OFFSET", offsetof (struct pt_regs, r9) }, + { "IA64_PT_REGS_R10_OFFSET", offsetof (struct pt_regs, r10) }, + { "IA64_PT_REGS_R11_OFFSET", offsetof (struct pt_regs, r11) }, { "IA64_PT_REGS_CR_IPSR_OFFSET", offsetof (struct pt_regs, cr_ipsr) }, { "IA64_PT_REGS_CR_IIP_OFFSET", offsetof (struct pt_regs, cr_iip) }, { "IA64_PT_REGS_CR_IFS_OFFSET", offsetof (struct pt_regs, cr_ifs) }, @@ -72,19 +81,16 @@ { "IA64_PT_REGS_AR_RNAT_OFFSET", offsetof (struct pt_regs, ar_rnat) }, { "IA64_PT_REGS_AR_BSPSTORE_OFFSET",offsetof (struct pt_regs, ar_bspstore) }, { "IA64_PT_REGS_PR_OFFSET", offsetof (struct pt_regs, pr) }, - { "IA64_PT_REGS_B6_OFFSET", offsetof (struct pt_regs, b6) }, + { "IA64_PT_REGS_B0_OFFSET", offsetof (struct pt_regs, b0) }, { "IA64_PT_REGS_LOADRS_OFFSET", offsetof (struct pt_regs, loadrs) }, { "IA64_PT_REGS_R1_OFFSET", offsetof (struct pt_regs, r1) }, - { "IA64_PT_REGS_R2_OFFSET", offsetof (struct pt_regs, r2) }, - { "IA64_PT_REGS_R3_OFFSET", offsetof (struct pt_regs, r3) }, { "IA64_PT_REGS_R12_OFFSET", offsetof (struct pt_regs, r12) }, { "IA64_PT_REGS_R13_OFFSET", offsetof (struct pt_regs, r13) }, - { "IA64_PT_REGS_R14_OFFSET", offsetof (struct pt_regs, r14) }, + { "IA64_PT_REGS_AR_FPSR_OFFSET", offsetof (struct pt_regs, ar_fpsr) }, { "IA64_PT_REGS_R15_OFFSET", offsetof (struct pt_regs, r15) }, - { "IA64_PT_REGS_R8_OFFSET", offsetof (struct pt_regs, r8) }, - { "IA64_PT_REGS_R9_OFFSET", offsetof (struct pt_regs, r9) }, - { "IA64_PT_REGS_R10_OFFSET", offsetof (struct pt_regs, r10) }, - { "IA64_PT_REGS_R11_OFFSET", offsetof (struct pt_regs, r11) }, + { "IA64_PT_REGS_R14_OFFSET", offsetof (struct pt_regs, r14) }, + { "IA64_PT_REGS_R2_OFFSET", offsetof (struct pt_regs, r2) }, + { "IA64_PT_REGS_R3_OFFSET", offsetof (struct pt_regs, r3) }, { "IA64_PT_REGS_R16_OFFSET", offsetof (struct pt_regs, r16) }, { "IA64_PT_REGS_R17_OFFSET", offsetof (struct pt_regs, r17) }, { "IA64_PT_REGS_R18_OFFSET", offsetof (struct pt_regs, r18) }, @@ -102,21 +108,18 @@ { "IA64_PT_REGS_R30_OFFSET", offsetof (struct pt_regs, r30) }, { "IA64_PT_REGS_R31_OFFSET", offsetof (struct pt_regs, r31) }, { "IA64_PT_REGS_AR_CCV_OFFSET", offsetof (struct pt_regs, ar_ccv) }, - { "IA64_PT_REGS_AR_FPSR_OFFSET", offsetof (struct pt_regs, ar_fpsr) }, - { "IA64_PT_REGS_B0_OFFSET", offsetof (struct pt_regs, b0) }, - { "IA64_PT_REGS_B7_OFFSET", offsetof (struct pt_regs, b7) }, { "IA64_PT_REGS_F6_OFFSET", offsetof (struct pt_regs, f6) }, { "IA64_PT_REGS_F7_OFFSET", offsetof (struct pt_regs, f7) }, { "IA64_PT_REGS_F8_OFFSET", offsetof (struct pt_regs, f8) }, { "IA64_PT_REGS_F9_OFFSET", offsetof (struct pt_regs, f9) }, + { "IA64_PT_REGS_F10_OFFSET", offsetof (struct pt_regs, f10) }, + { "IA64_PT_REGS_F11_OFFSET", offsetof (struct pt_regs, f11) }, { "IA64_SWITCH_STACK_CALLER_UNAT_OFFSET", offsetof (struct switch_stack, caller_unat) }, { "IA64_SWITCH_STACK_AR_FPSR_OFFSET", offsetof (struct switch_stack, ar_fpsr) }, { "IA64_SWITCH_STACK_F2_OFFSET", offsetof (struct switch_stack, f2) }, { "IA64_SWITCH_STACK_F3_OFFSET", offsetof (struct switch_stack, f3) }, { "IA64_SWITCH_STACK_F4_OFFSET", offsetof (struct switch_stack, f4) }, { "IA64_SWITCH_STACK_F5_OFFSET", offsetof (struct switch_stack, f5) }, - { "IA64_SWITCH_STACK_F10_OFFSET", offsetof (struct switch_stack, f10) }, - { "IA64_SWITCH_STACK_F11_OFFSET", offsetof (struct switch_stack, f11) }, { "IA64_SWITCH_STACK_F12_OFFSET", offsetof (struct switch_stack, f12) }, { "IA64_SWITCH_STACK_F13_OFFSET", offsetof (struct switch_stack, f13) }, { "IA64_SWITCH_STACK_F14_OFFSET", offsetof (struct switch_stack, f14) }, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/apollo/dn_ints.c linux-2.4.23-pre8/arch/m68k/apollo/dn_ints.c --- linux-2.4.22/arch/m68k/apollo/dn_ints.c 2002-11-28 23:53:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/apollo/dn_ints.c 2003-10-22 22:49:09.000000000 +0000 @@ -43,7 +43,7 @@ int dn_request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id) { if((irq<0) || (irq>15)) { - printk("Trying to request illegal IRQ\n"); + printk("Trying to request invalid IRQ\n"); return -ENXIO; } @@ -69,7 +69,7 @@ void dn_free_irq(unsigned int irq, void *dev_id) { if((irq<0) || (irq>15)) { - printk("Trying to free illegal IRQ\n"); + printk("Trying to free invalid IRQ\n"); return ; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/atari/time.c linux-2.4.23-pre8/arch/m68k/atari/time.c --- linux-2.4.22/arch/m68k/atari/time.c 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/atari/time.c 2003-10-22 22:49:17.000000000 +0000 @@ -16,7 +16,7 @@ #include #include -#include +#include void __init atari_sched_init(void (*timer_routine)(int, void *, struct pt_regs *)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/config.in linux-2.4.23-pre8/arch/m68k/config.in --- linux-2.4.22/arch/m68k/config.in 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/config.in 2003-10-22 22:49:14.000000000 +0000 @@ -320,9 +320,9 @@ tristate ' EQL (serial line load balancing) support' CONFIG_EQUALIZER if [ "$CONFIG_ZORRO" = "y" ]; then tristate ' Ariadne support' CONFIG_ARIADNE - tristate ' Ariadne II support' CONFIG_ARIADNE2 tristate ' A2065 support' CONFIG_A2065 tristate ' Hydra support' CONFIG_HYDRA + tristate ' Zorro NS8390-based Ethernet support' CONFIG_ZORRO8390 fi if [ "$CONFIG_AMIGA_PCMCIA" = "y" ]; then tristate ' PCMCIA NE2000 support' CONFIG_APNE @@ -513,14 +513,10 @@ bool ' Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT bool ' Software Watchdog' CONFIG_SOFT_WATCHDOG fi -if [ "$CONFIG_ATARI" = "y" ]; then - bool 'Enhanced Real Time Clock Support' CONFIG_RTC +if [ "$CONFIG_SUN3" = "y" ]; then + define_bool CONFIG_GEN_RTC y else - if [ "$CONFIG_SUN3" = "y" ]; then - define_bool CONFIG_GEN_RTC y - else - tristate 'Generic /dev/rtc emulation' CONFIG_GEN_RTC - fi + tristate 'Generic /dev/rtc emulation' CONFIG_GEN_RTC fi if [ "$CONFIG_GEN_RTC" != "n" ]; then bool ' Extended RTC operation' CONFIG_GEN_RTC_X @@ -560,6 +556,8 @@ bool ' Verbose BUG() reporting' CONFIG_DEBUG_BUGVERBOSE fi +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/defconfig linux-2.4.23-pre8/arch/m68k/defconfig --- linux-2.4.22/arch/m68k/defconfig 2000-06-19 19:56:08.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/defconfig 2003-10-22 22:47:36.000000000 +0000 @@ -177,7 +177,7 @@ # CONFIG_PPP is not set # CONFIG_EQUALIZER is not set # CONFIG_ARIADNE is not set -# CONFIG_ARIADNE2 is not set +# CONFIG_ZORRO8390 is not set # CONFIG_A2065 is not set # CONFIG_HYDRA is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/kernel/ptrace.c linux-2.4.23-pre8/arch/m68k/kernel/ptrace.c --- linux-2.4.22/arch/m68k/kernel/ptrace.c 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/kernel/ptrace.c 2003-10-22 22:48:20.000000000 +0000 @@ -133,14 +133,9 @@ ret = ptrace_attach(child); goto out_tsk; } - ret = -ESRCH; - if (!(child->ptrace & PT_PTRACED)) - goto out_tsk; - if (child->state != TASK_STOPPED) { - if (request != PTRACE_KILL) - goto out_tsk; - } - if (child->p_pptr != current) + + ret = ptrace_check_attach(child, request == PTRACE_KILL); + if (ret < 0) goto out_tsk; switch (request) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/math-emu/fp_emu.h linux-2.4.23-pre8/arch/m68k/math-emu/fp_emu.h --- linux-2.4.22/arch/m68k/math-emu/fp_emu.h 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/math-emu/fp_emu.h 2003-10-22 22:47:30.000000000 +0000 @@ -115,6 +115,15 @@ __res; \ }) +#define fp_conv_long2ext(dest, src) ({ \ + register struct fp_ext *__dest asm ("a0") = dest; \ + register int __src asm ("d0") = src; \ + \ + asm volatile ("jsr fp_conv_ext2long" \ + : : "d" (__src), "a" (__dest) \ + : "a1", "d1", "d2", "memory"); \ +}) + #else /* __ASSEMBLY__ */ /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/math-emu/fp_log.c linux-2.4.23-pre8/arch/m68k/math-emu/fp_log.c --- linux-2.4.22/arch/m68k/math-emu/fp_log.c 1999-08-15 18:47:29.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/math-emu/fp_log.c 2003-10-22 22:47:28.000000000 +0000 @@ -17,10 +17,22 @@ #include "fp_emu.h" +static const struct fp_ext fp_one = +{ + 0, 0, 0x3fff, { 0 } +}; + +extern struct fp_ext *fp_fadd(struct fp_ext *dest, const struct fp_ext *src); +extern struct fp_ext *fp_fdiv(struct fp_ext *dest, const struct fp_ext *src); +extern struct fp_ext *fp_fmul(struct fp_ext *dest, const struct fp_ext *src); + struct fp_ext * fp_fsqrt(struct fp_ext *dest, struct fp_ext *src) { - uprint("fsqrt\n"); + struct fp_ext tmp, src2; + int i, exp; + + dprint(PINSTR, "fsqrt\n"); fp_monadic_check(dest, src); @@ -34,6 +46,56 @@ if (IS_INF(dest)) return dest; + /* + * sqrt(m) * 2^(p) , if e = 2*p + * sqrt(m*2^e) = + * sqrt(2*m) * 2^(p) , if e = 2*p + 1 + * + * So we use the last bit of the exponent to decide wether to + * use the m or 2*m. + * + * Since only the fractional part of the mantissa is stored and + * the integer part is assumed to be one, we place a 1 or 2 into + * the fixed point representation. + */ + exp = dest->exp; + dest->exp = 0x3FFF; + if (!(exp & 1)) /* lowest bit of exponent is set */ + dest->exp++; + fp_copy_ext(&src2, dest); + + /* + * The taylor row arround a for sqrt(x) is: + * sqrt(x) = sqrt(a) + 1/(2*sqrt(a))*(x-a) + R + * With a=1 this gives: + * sqrt(x) = 1 + 1/2*(x-1) + * = 1/2*(1+x) + */ + fp_fadd(dest, &fp_one); + dest->exp--; /* * 1/2 */ + + /* + * We now apply the newton rule to the function + * f(x) := x^2 - r + * which has a null point on x = sqrt(r). + * + * It gives: + * x' := x - f(x)/f'(x) + * = x - (x^2 -r)/(2*x) + * = x - (x - r/x)/2 + * = (2*x - x + r/x)/2 + * = (x + r/x)/2 + */ + for (i = 0; i < 9; i++) { + fp_copy_ext(&tmp, &src2); + + fp_fdiv(&tmp, dest); + fp_fadd(dest, &tmp); + dest->exp--; + } + + dest->exp += (exp - 0x3FFF) / 2; + return dest; } @@ -123,20 +185,39 @@ struct fp_ext * fp_fgetexp(struct fp_ext *dest, struct fp_ext *src) { - uprint("fgetexp\n"); + dprint(PINSTR, "fgetexp\n"); fp_monadic_check(dest, src); + if (IS_INF(dest)) { + fp_set_nan(dest); + return dest; + } + if (IS_ZERO(dest)) + return dest; + + fp_conv_long2ext(dest, (int)dest->exp - 0x3FFF); + + fp_normalize_ext(dest); + return dest; } struct fp_ext * fp_fgetman(struct fp_ext *dest, struct fp_ext *src) { - uprint("fgetman\n"); + dprint(PINSTR, "fgetman\n"); fp_monadic_check(dest, src); + if (IS_ZERO(dest)) + return dest; + + if (IS_INF(dest)) + return dest; + + dest->exp = 0x3FFF; + return dest; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/mm/kmap.c linux-2.4.23-pre8/arch/m68k/mm/kmap.c --- linux-2.4.22/arch/m68k/mm/kmap.c 2001-02-09 19:29:44.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/mm/kmap.c 2003-10-22 22:48:41.000000000 +0000 @@ -71,7 +71,7 @@ addr = tmp->size + (unsigned long)tmp->addr; } area->addr = (void *)addr; - area->size = size + IO_SIZE; + area->size = size + IO_SIZE; /* leave a gap between */ area->next = *p; *p = area; return area; @@ -87,7 +87,10 @@ for (p = &iolist ; (tmp = *p) ; p = &tmp->next) { if (tmp->addr == addr) { *p = tmp->next; - __iounmap(tmp->addr, tmp->size); + if ( tmp->size > IO_SIZE ) + __iounmap(tmp->addr, tmp->size - IO_SIZE); + else + printk("free_io_area: Invalid I/O area size %lu\n", tmp->size); kfree(tmp); return; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/mm/memory.c linux-2.4.23-pre8/arch/m68k/mm/memory.c --- linux-2.4.22/arch/m68k/mm/memory.c 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/mm/memory.c 2003-10-22 22:49:09.000000000 +0000 @@ -19,76 +19,10 @@ #include #include #include -#include #include -#ifdef CONFIG_AMIGA -#include -#endif struct pgtable_cache_struct quicklists; -void __bad_pte(pmd_t *pmd) -{ - printk("Bad pmd in pte_alloc: %08lx\n", pmd_val(*pmd)); - pmd_set(pmd, BAD_PAGETABLE); -} - -void __bad_pmd(pgd_t *pgd) -{ - printk("Bad pgd in pmd_alloc: %08lx\n", pgd_val(*pgd)); - pgd_set(pgd, (pmd_t *)BAD_PAGETABLE); -} - -#if 0 -pte_t *get_pte_slow(pmd_t *pmd, unsigned long offset) -{ - pte_t *pte; - - pte = (pte_t *) __get_free_page(GFP_KERNEL); - if (pmd_none(*pmd)) { - if (pte) { - clear_page(pte); - __flush_page_to_ram((unsigned long)pte); - flush_tlb_kernel_page((unsigned long)pte); - nocache_page((unsigned long)pte); - pmd_set(pmd, pte); - return pte + offset; - } - pmd_set(pmd, BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long)pte); - if (pmd_bad(*pmd)) { - __bad_pte(pmd); - return NULL; - } - return (pte_t *)__pmd_page(*pmd) + offset; -} -#endif - -#if 0 -pmd_t *get_pmd_slow(pgd_t *pgd, unsigned long offset) -{ - pmd_t *pmd; - - pmd = get_pointer_table(); - if (pgd_none(*pgd)) { - if (pmd) { - pgd_set(pgd, pmd); - return pmd + offset; - } - pgd_set(pgd, (pmd_t *)BAD_PAGETABLE); - return NULL; - } - free_pointer_table(pmd); - if (pgd_bad(*pgd)) { - __bad_pmd(pgd); - return NULL; - } - return (pmd_t *)__pgd_page(*pgd) + offset; -} -#endif - /* ++andreas: {get,free}_pointer_table rewritten to use unused fields from struct page instead of separately kmalloced struct. Stolen from arch/sparc/mm/srmmu.c ... */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/m68k/q40/q40ints.c linux-2.4.23-pre8/arch/m68k/q40/q40ints.c --- linux-2.4.22/arch/m68k/q40/q40ints.c 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/m68k/q40/q40ints.c 2003-10-22 22:48:25.000000000 +0000 @@ -124,7 +124,6 @@ case 11: printk("warning IRQ 10 and 11 not distinguishable\n"); irq=10; - default: } if (irqpc, fp->d0, fp->orig_d0, fp->d1, fp->d2); + printk("\tIIRQ_REG = %x, EIRQ_REG = %x\n",master_inb(IIRQ_REG),master_inb(EIRQ_REG)); } /* @@ -313,7 +313,6 @@ unsigned mir, mer; int irq,i; - repeat: mir=master_inb(IIRQ_REG); if (mir&Q40_IRQ_FRAME_MASK) { irq_tab[Q40_IRQ_FRAME].count++; @@ -373,7 +372,6 @@ /*printk("reenabling irq %d\n",irq); */ #endif } -// used to do 'goto repeat;' her, this delayed bh processing too long return; } } @@ -382,6 +380,7 @@ } iirq: mir=master_inb(IIRQ_REG); + /* should test whether keyboard irq is really enabled, doing it in defhand */ if (mir&Q40_IRQ_KEYB_MASK) { irq_tab[Q40_IRQ_KEYBOARD].count++; irq_tab[Q40_IRQ_KEYBOARD].handler(Q40_IRQ_KEYBOARD,irq_tab[Q40_IRQ_KEYBOARD].dev_id,fp); @@ -408,7 +407,9 @@ static void q40_defhand (int irq, void *dev_id, struct pt_regs *fp) { - printk ("Unknown q40 interrupt 0x%02x\n", irq); + if (irq!=Q40_IRQ_KEYBOARD) + printk ("Unknown q40 interrupt %d\n", irq); + else master_outb(-1,KEYBOARD_UNLOCK_REG); } static void sys_default_handler(int lev, void *dev_id, struct pt_regs *regs) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/mips/config-shared.in linux-2.4.23-pre8/arch/mips/config-shared.in --- linux-2.4.22/arch/mips/config-shared.in 2003-08-25 11:44:39.000000000 +0000 +++ linux-2.4.23-pre8/arch/mips/config-shared.in 2003-10-22 22:48:59.000000000 +0000 @@ -1039,7 +1039,12 @@ bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ if [ "$CONFIG_SMP" != "y" ]; then bool 'Run uncached' CONFIG_MIPS_UNCACHED +else + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 fi + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/mips/kernel/irq.c linux-2.4.23-pre8/arch/mips/kernel/irq.c --- linux-2.4.22/arch/mips/kernel/irq.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/mips/kernel/irq.c 2003-10-22 22:47:49.000000000 +0000 @@ -870,7 +870,7 @@ if (!shared) { desc->depth = 0; - desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING); + desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS); desc->handler->startup(irq); } spin_unlock_irqrestore(&desc->lock,flags); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/mips64/defconfig linux-2.4.23-pre8/arch/mips64/defconfig --- linux-2.4.22/arch/mips64/defconfig 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/mips64/defconfig 2003-10-22 22:48:01.000000000 +0000 @@ -102,6 +102,7 @@ # CONFIG_CPU_RM7000 is not set # CONFIG_CPU_SB1 is not set CONFIG_SMP=y +CONFIG_NR_CPUS=32 # CONFIG_64BIT_PHYS_ADDR is not set # CONFIG_CPU_ADVANCED is not set CONFIG_CPU_HAS_LLSC=y diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/mips64/kernel/irq.c linux-2.4.23-pre8/arch/mips64/kernel/irq.c --- linux-2.4.22/arch/mips64/kernel/irq.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/mips64/kernel/irq.c 2003-10-22 22:47:28.000000000 +0000 @@ -870,7 +870,7 @@ if (!shared) { desc->depth = 0; - desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING); + desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING | IRQ_INPROGRESS); desc->handler->startup(irq); } spin_unlock_irqrestore(&desc->lock,flags); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/parisc/config.in linux-2.4.23-pre8/arch/parisc/config.in --- linux-2.4.22/arch/parisc/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/parisc/config.in 2003-10-22 22:49:52.000000000 +0000 @@ -45,6 +45,10 @@ comment 'General options' bool 'Symmetric multi-processing support' CONFIG_SMP +if [ "$CONFIG_SMP" = "y" ]; then + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 +fi + bool 'Chassis LCD and LED support' CONFIG_CHASSIS_LCD_LED bool 'Kernel Debugger support' CONFIG_KWDB @@ -194,6 +198,9 @@ #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/8260_io/uart.c linux-2.4.23-pre8/arch/ppc/8260_io/uart.c --- linux-2.4.22/arch/ppc/8260_io/uart.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/8260_io/uart.c 2003-10-22 22:47:39.000000000 +0000 @@ -47,6 +47,10 @@ #include #include +#ifdef CONFIG_MAGIC_SYSRQ +#include +#endif + #ifdef CONFIG_SERIAL_CONSOLE #include @@ -68,6 +72,14 @@ static int serial_refcount; static int 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); + +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) +static unsigned long break_pressed; /* break, really ... */ +#endif + /* * Serial driver configuration section. Here are the various options: */ @@ -181,6 +193,16 @@ cbd_t *tx_cur; } ser_info_t; +static struct console sercons = { + name: "ttyS", + write: serial_console_write, + device: serial_console_device, + setup: serial_console_setup, + flags: CON_PRINTBUFFER, + index: CONFIG_SERIAL_CONSOLE_PORT, +}; + + static void change_speed(ser_info_t *info); static void rs_8xx_wait_until_sent(struct tty_struct *tty, int timeout); @@ -302,7 +324,7 @@ mark_bh(SERIAL_BH); } -static _INLINE_ void receive_chars(ser_info_t *info) +static _INLINE_ void receive_chars(ser_info_t *info, struct pt_regs *regs) { struct tty_struct *tty = info->tty; unsigned char ch, *cp; @@ -417,6 +439,19 @@ } } } + +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) + if (break_pressed && info->line == sercons.index) { + if (ch != 0 && time_before(jiffies, + break_pressed + HZ*5)) { + handle_sysrq(ch, regs, NULL, NULL); + break_pressed = 0; + goto ignore_char; + } else + break_pressed = 0; + } +#endif + if (tty->flip.count >= TTY_FLIPBUF_SIZE) break; @@ -425,6 +460,10 @@ tty->flip.count++; } +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) + ignore_char: +#endif + /* This BD is ready to be used again. Clear status. * Get next BD. */ @@ -442,7 +481,36 @@ queue_task(&tty->flip.tqueue, &tq_timer); } -static _INLINE_ void transmit_chars(ser_info_t *info) +static _INLINE_ void receive_break(ser_info_t *info, struct pt_regs *regs) +{ + struct tty_struct *tty = info->tty; + + info->state->icount.brk++; + +#if defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) + if (info->line == sercons.index) { + if (!break_pressed) { + break_pressed = jiffies; + return; + } else + break_pressed = 0; + } +#endif + + /* Check to see if there is room in the tty buffer for + * the break. If not, we exit now, losing the break. FIXME + */ + if ((tty->flip.count + 1) >= TTY_FLIPBUF_SIZE) + return; + *(tty->flip.flag_buf_ptr++) = TTY_BREAK; + *(tty->flip.char_buf_ptr++) = 0; + tty->flip.count++; + + queue_task(&tty->flip.tqueue, &tq_timer); +} + + +static _INLINE_ void transmit_chars(ser_info_t *info, struct pt_regs *regs) { if (info->flags & TX_WAKEUP) { @@ -543,19 +611,23 @@ if ((idx = info->state->smc_scc_num) < SCC_NUM_BASE) { smcp = &immr->im_smc[idx]; events = smcp->smc_smce; + if (events & SMCM_BRKE) + receive_break(info, regs); if (events & SMCM_RX) - receive_chars(info); + receive_chars(info, regs); if (events & SMCM_TX) - transmit_chars(info); + transmit_chars(info, regs); smcp->smc_smce = events; } else { sccp = &immr->im_scc[idx - SCC_IDX_BASE]; events = sccp->scc_scce; + if (events & SMCM_BRKE) + receive_break(info, regs); if (events & SCCM_RX) - receive_chars(info); + receive_chars(info, regs); if (events & SCCM_TX) - transmit_chars(info); + transmit_chars(info, regs); sccp->scc_scce = events; } @@ -2218,16 +2290,6 @@ return MKDEV(TTYAUX_MAJOR, 64 + c->index); } - -static struct console sercons = { - name: "ttyS", - write: serial_console_write, - device: serial_console_device, - setup: serial_console_setup, - flags: CON_PRINTBUFFER, - index: CONFIG_SERIAL_CONSOLE_PORT, -}; - /* * Register console. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/8xx_io/Config.in linux-2.4.23-pre8/arch/ppc/8xx_io/Config.in --- linux-2.4.22/arch/ppc/8xx_io/Config.in 2001-10-15 20:35:26.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/8xx_io/Config.in 2003-10-22 22:48:19.000000000 +0000 @@ -2,8 +2,14 @@ # MPC8xx Communication options # mainmenu_option next_comment -comment 'MPC8xx CPM Options' +comment 'MPC8xx Options' +comment 'Generic MPC8xx Options' +bool 'Copy-Back Data Cache (else Writethrough)' CONFIG_8xx_COPYBACK +bool 'CPU6 Silicon Errata (860 Pre Rev. C)' CONFIG_8xx_CPU6 +bool 'I2C/SPI Microcode Patch' CONFIG_UCODE_PATCH + +comment 'MPC8xx CPM Options' if [ "$CONFIG_NET_ETHERNET" = "y" ]; then bool 'CPM SCC Ethernet' CONFIG_SCC_ENET if [ "$CONFIG_SCC_ENET" = "y" ]; then @@ -12,25 +18,28 @@ SCC2 CONFIG_SCC2_ENET \ SCC3 CONFIG_SCC3_ENET" SCC1 fi - bool '860T FEC Ethernet' CONFIG_FEC_ENET + bool '8xxT FEC Ethernet' CONFIG_FEC_ENET if [ "$CONFIG_FEC_ENET" = "y" ]; then bool 'Use MDIO for PHY configuration' CONFIG_USE_MDIO fi bool 'Use Big CPM Ethernet Buffers' CONFIG_ENET_BIG_BUFFERS fi +if [ "$CONFIG_SCC3_ENET" != "y" ]; then + bool 'Use SMC1 for UART' CONFIG_8xx_SMC1 +fi bool 'Use SMC2 for UART' CONFIG_SMC2_UART if [ "$CONFIG_SMC2_UART" = "y" ]; then bool 'Use Alternate SMC2 I/O (823/850)' CONFIG_ALTSMC2 bool 'Use SMC2 for Console' CONFIG_CONS_SMC2 fi -bool 'Enable SCC2 and SCC3 for UART' CONFIG_USE_SCC_IO - -# This doesn't really belong here, but it is convenient to ask -# 8xx specific questions. - -comment 'Generic MPC8xx Options' -bool 'Copy-Back Data Cache (else Writethrough)' CONFIG_8xx_COPYBACK -bool 'CPU6 Silicon Errata (860 Pre Rev. C)' CONFIG_8xx_CPU6 -bool 'I2C/SPI Microcode Patch' CONFIG_UCODE_PATCH - +if [ "$CONFIG_SCC1_ENET" != "y" ]; then + bool 'Use SCC1 for UART' CONFIG_8xx_SCC1 +fi +if [ "$CONFIG_SCC2_ENET" != "y" ]; then + bool 'Use SCC2 for UART' CONFIG_8xx_SCC2 +fi +if [ "$CONFIG_SCC3_ENET" != "y" ]; then + bool 'Use SCC3 for UART' CONFIG_8xx_SCC3 +fi +bool 'Use SCC4 for UART' CONFIG_8xx_SCC4 endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/8xx_io/commproc.c linux-2.4.23-pre8/arch/ppc/8xx_io/commproc.c --- linux-2.4.22/arch/ppc/8xx_io/commproc.c 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/8xx_io/commproc.c 2003-10-22 22:49:01.000000000 +0000 @@ -54,6 +54,7 @@ static struct cpm_action cpm_vecs[CPMVEC_NR]; static void cpm_interrupt(int irq, void * dev, struct pt_regs * regs); static void cpm_error_interrupt(int irq, void *, struct pt_regs * regs); +static void alloc_host_memory(void); /* Define a table of names to identify CPM interrupt handlers in * /proc/interrupts. @@ -104,7 +105,7 @@ }; void -m8xx_cpm_reset(uint host_page_addr) +m8xx_cpm_reset() { volatile immap_t *imp; volatile cpm8xx_t *commproc; @@ -130,7 +131,7 @@ * this is what we realy want for some applications, but the * manual recommends it. * Bit 25, FAM can also be set to use FEC aggressive mode (860T). - */ + */ imp->im_siu_conf.sc_sdcr = 1; /* Reclaim the DP memory for our use. @@ -138,25 +139,23 @@ dp_alloc_base = CPM_DATAONLY_BASE; dp_alloc_top = dp_alloc_base + CPM_DATAONLY_SIZE; - /* Set the host page for allocation. + /* Tell everyone where the comm processor resides. */ - host_buffer = host_page_addr; /* Host virtual page address */ - host_end = host_page_addr + PAGE_SIZE; + cpmp = (cpm8xx_t *)commproc; +} - /* We need to get this page early, so I have to do it the - * hard way. - */ - if (get_pteptr(&init_mm, host_page_addr, &pte)) { - pte_val(*pte) |= _PAGE_NO_CACHE; - flush_tlb_page(init_mm.mmap, host_buffer); - } - else { - panic("Huh? No CPM host page?"); - } +/* We used to do this earlier, but have to postpone as long as possible + * to ensure the kernel VM is now running. + */ +static void +alloc_host_memory() +{ + uint physaddr; - /* Tell everyone where the comm processor resides. + /* Set the host page for allocation. */ - cpmp = (cpm8xx_t *)commproc; + host_buffer = (uint)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &physaddr); + host_end = host_buffer + PAGE_SIZE; } /* This is called during init_IRQ. We used to do it above, but this @@ -321,6 +320,9 @@ { uint retloc; + if (host_buffer == 0) + alloc_host_memory(); + if ((host_buffer + size) >= host_end) return(0); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/8xx_io/enet.c linux-2.4.23-pre8/arch/ppc/8xx_io/enet.c --- linux-2.4.22/arch/ppc/8xx_io/enet.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/8xx_io/enet.c 2003-10-22 22:48:19.000000000 +0000 @@ -137,6 +137,11 @@ cbd_t *cur_rx, *cur_tx; /* The next free ring entry */ cbd_t *dirty_tx; /* The ring entries to be free()ed. */ scc_t *sccp; + + /* Virtual addresses for the receive buffers because we can't + * do a __va() on them anymore. + */ + unsigned char *rx_vaddr[RX_RING_SIZE]; struct net_device_stats stats; uint tx_free; spinlock_t lock; @@ -498,7 +503,7 @@ skb->dev = dev; skb_put(skb,pkt_len-4); /* Make room */ eth_copy_and_sum(skb, - (unsigned char *)__va(bdp->cbd_bufaddr), + cep->rx_vaddr[bdp - cep->rx_bd_base], pkt_len-4, 0); skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); @@ -632,10 +637,9 @@ { struct net_device *dev; struct scc_enet_private *cep; - int i, j; - unsigned char *eap; - unsigned long mem_addr; - pte_t *pte; + int i, j, k; + unsigned char *eap, *ba; + dma_addr_t mem_addr; bd_t *bd; volatile cbd_t *bdp; volatile cpm8xx_t *cp; @@ -826,24 +830,21 @@ bdp->cbd_sc |= BD_SC_WRAP; bdp = cep->rx_bd_base; + k = 0; for (i=0; icbd_sc = BD_ENET_RX_EMPTY | BD_ENET_RX_INTR; - bdp->cbd_bufaddr = __pa(mem_addr); + bdp->cbd_bufaddr = mem_addr; + cep->rx_vaddr[k++] = ba; mem_addr += CPM_ENET_RX_FRSIZE; + ba += CPM_ENET_RX_FRSIZE; bdp++; } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/8xx_io/fec.c linux-2.4.23-pre8/arch/ppc/8xx_io/fec.c --- linux-2.4.22/arch/ppc/8xx_io/fec.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/8xx_io/fec.c 2003-10-22 22:49:40.000000000 +0000 @@ -161,7 +161,12 @@ cbd_t *tx_bd_base; cbd_t *cur_rx, *cur_tx; /* The next free ring entry */ cbd_t *dirty_tx; /* The ring entries to be free()ed. */ - scc_t *sccp; + + /* Virtual addresses for the receive buffers because we can't + * do a __va() on them anymore. + */ + unsigned char *rx_vaddr[RX_RING_SIZE]; + struct net_device_stats stats; uint tx_free; spinlock_t lock; @@ -587,7 +592,7 @@ fep->stats.rx_packets++; pkt_len = bdp->cbd_datlen; fep->stats.rx_bytes += pkt_len; - data = (__u8*)__va(bdp->cbd_bufaddr); + data = fep->rx_vaddr[bdp - fep->rx_bd_base]; /* This does 16 byte alignment, exactly what we need. * The packet length includes FCS, but we don't want to @@ -602,9 +607,7 @@ } else { skb->dev = dev; skb_put(skb,pkt_len-4); /* Make room */ - eth_copy_and_sum(skb, - (unsigned char *)__va(bdp->cbd_bufaddr), - pkt_len-4, 0); + eth_copy_and_sum(skb, data, pkt_len-4, 0); skb->protocol=eth_type_trans(skb,dev); netif_rx(skb); } @@ -1700,10 +1703,9 @@ { struct net_device *dev; struct fec_enet_private *fep; - int i, j; - unsigned char *eap, *iap; - unsigned long mem_addr; - pte_t *pte; + int i, j, k; + unsigned char *eap, *iap, *ba; + dma_addr_t mem_addr; volatile cbd_t *bdp; cbd_t *cbd_base; volatile immap_t *immap; @@ -1774,14 +1776,7 @@ printk("FEC initialization failed.\n"); return 1; } - mem_addr = __get_free_page(GFP_KERNEL); - cbd_base = (cbd_t *)mem_addr; - - /* Make it uncached. - */ - pte = va_to_pte(mem_addr); - pte_val(*pte) |= _PAGE_NO_CACHE; - flush_tlb_page(init_mm.mmap, mem_addr); + cbd_base = (cbd_t *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr); /* Set receive and transmit descriptor base. */ @@ -1793,24 +1788,21 @@ /* Initialize the receive buffer descriptors. */ bdp = fep->rx_bd_base; + k = 0; for (i=0; icbd_sc = BD_ENET_RX_EMPTY; - bdp->cbd_bufaddr = __pa(mem_addr); + bdp->cbd_bufaddr = mem_addr; + fep->rx_vaddr[k++] = ba; mem_addr += FEC_ENET_RX_FRSIZE; + ba += FEC_ENET_RX_FRSIZE; bdp++; } } @@ -1974,8 +1966,8 @@ /* Set receive and transmit descriptor base. */ - fecp->fec_r_des_start = __pa((uint)(fep->rx_bd_base)); - fecp->fec_x_des_start = __pa((uint)(fep->tx_bd_base)); + fecp->fec_r_des_start = iopa((uint)(fep->rx_bd_base)); + fecp->fec_x_des_start = iopa((uint)(fep->tx_bd_base)); fep->dirty_tx = fep->cur_tx = fep->tx_bd_base; fep->tx_free = TX_RING_SIZE; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/8xx_io/uart.c linux-2.4.23-pre8/arch/ppc/8xx_io/uart.c --- linux-2.4.22/arch/ppc/8xx_io/uart.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/8xx_io/uart.c 2003-10-22 22:49:14.000000000 +0000 @@ -81,7 +81,11 @@ #define TX_WAKEUP ASYNC_SHARE_IRQ static char *serial_name = "CPM UART driver"; -static char *serial_version = "0.03"; +static char *serial_version = "0.04"; + +/* TX buffer length used by my_console_write. + Assume minumun length until it gets set by this driver */ +static int console_tx_buf_len = 1; static DECLARE_TASK_QUEUE(tq_serial); @@ -126,10 +130,27 @@ * type of SMC or SCC. * The SMCs do not support any modem control signals. */ -#define smc_scc_num hub6 -#define NUM_IS_SCC ((int)0x00010000) -#define PORT_NUM(P) ((P) & 0x0000ffff) -#define PORT_IS_SCC(P) ((P) & NUM_IS_SCC) +#define smc_scc_num hub6 +#define NUM_IS_SCC ((int)0x000100000) +#define NUM_BRG ((int)0x0000FF00) +#define NUM_BRG_SHIFT 8 +#define NUM ((int)0x000000FF) +#define NUM_SHIFT 0 +#define PORT_NUM(P) ((P) & NUM) +#define PORT_NUM_SET(N) (((N)-1) << NUM_SHIFT) +#define PORT_IS_SCC(P) ((P) & NUM_IS_SCC) +#define PORT_BRG(P) (((P) & NUM_BRG) >> NUM_BRG_SHIFT) +#define PORT_BRG_SET(P,B) (P) = (((P) & ~NUM_BRG) | ((B) << NUM_BRG_SHIFT)) + +/* Short names for the ports +*/ +#define QUICC_CPM_SMC1 (PORT_NUM_SET(1)) +#define QUICC_CPM_SMC2 (PORT_NUM_SET(2)) +#define QUICC_CPM_SCC1 (PORT_NUM_SET(1)|NUM_IS_SCC) +#define QUICC_CPM_SCC2 (PORT_NUM_SET(2)|NUM_IS_SCC) +#define QUICC_CPM_SCC3 (PORT_NUM_SET(3)|NUM_IS_SCC) +#define QUICC_CPM_SCC4 (PORT_NUM_SET(4)|NUM_IS_SCC) +#define QUICC_MAX_BRG 3 /* BRG1..BRG4 */ /* The serial port to use for KGDB. */ #ifdef CONFIG_KGDB_TTYS1 @@ -151,22 +172,24 @@ */ static struct serial_state rs_table[] = { /* UART CLK PORT IRQ FLAGS NUM */ -#ifndef CONFIG_SCC3_ENET /* SMC1 not usable with Ethernet on SCC3 */ - { 0, 0, PROFF_SMC1, CPMVEC_SMC1, 0, 0 }, /* SMC1 ttyS0 */ +#ifdef CONFIG_8xx_SMC1 + { 0, 0, PROFF_SMC1, CPMVEC_SMC1, 0, QUICC_CPM_SMC1 }, /* SMC1 ttySx */ +#endif +#ifdef CONFIG_8xx_SMC2 + { 0, 0, PROFF_SMC2, CPMVEC_SMC2, 0, QUICC_CPM_SMC2 }, /* SMC2 ttySx */ +#endif +#ifdef CONFIG_8xx_SCC1 + { 0, 0, PROFF_SCC1, CPMVEC_SCC1, 0, QUICC_CPM_SCC1 }, /* SCC1 ttySx */ +#endif +#ifdef CONFIG_8xx_SCC2 + { 0, 0, PROFF_SCC2, CPMVEC_SCC2, 0, QUICC_CPM_SCC2 }, /* SCC2 ttySx */ +#endif +#ifdef CONFIG_8xx_SCC3 + { 0, 0, PROFF_SCC3, CPMVEC_SCC3, 0, QUICC_CPM_SCC3 }, /* SCC3 ttySx */ +#endif +#ifdef CONFIG_8xx_SCC4 + { 0, 0, PROFF_SCC4, CPMVEC_SCC4, 0, QUICC_CPM_SCC4 }, /* SCC4 ttySx */ #endif -#if !defined(CONFIG_USB_MPC8xx) && !defined(CONFIG_USB_CLIENT_MPC8xx) -# ifdef CONFIG_SMC2_UART - { 0, 0, PROFF_SMC2, CPMVEC_SMC2, 0, 1 }, /* SMC2 ttyS1 */ -# endif -# ifdef CONFIG_USE_SCC_IO - { 0, 0, PROFF_SCC2, CPMVEC_SCC2, 0, (NUM_IS_SCC | 1) }, /* SCC2 ttyS2 */ - { 0, 0, PROFF_SCC3, CPMVEC_SCC3, 0, (NUM_IS_SCC | 2) }, /* SCC3 ttyS3 */ -# endif - #else /* CONFIG_USB_xxx */ -# ifdef CONFIG_USE_SCC_IO - { 0, 0, PROFF_SCC3, CPMVEC_SCC3, 0, (NUM_IS_SCC | 2) }, /* SCC3 ttyS3 */ -# endif -#endif /* CONFIG_USB_xxx */ }; #define NR_PORTS (sizeof(rs_table)/sizeof(struct serial_state)) @@ -177,6 +200,7 @@ /* The number of buffer descriptors and their sizes. */ +#define EARLY_BUF_SIZE 4 #define RX_NUM_FIFO 4 #define RX_BUF_SIZE 32 #define TX_NUM_FIFO 4 @@ -218,6 +242,12 @@ cbd_t *rx_cur; cbd_t *tx_bd_base; cbd_t *tx_cur; + + /* Virtual addresses for the FIFOs because we can't __va() a + * physical address anymore. + */ + unsigned char *rx_va_base; + unsigned char *tx_va_base; } ser_info_t; static struct console sercons = { @@ -394,13 +424,13 @@ /* Get the number of characters and the buffer pointer. */ i = bdp->cbd_datlen; - cp = (unsigned char *)__va(bdp->cbd_bufaddr); + cp = info->rx_va_base + ((bdp - info->rx_bd_base) * RX_BUF_SIZE); status = bdp->cbd_sc; #ifdef CONFIG_KGDB - if (info->state->smc_scc_num == KGDB_SER_IDX) { - if (*cp == 0x03 || *cp == '$') - breakpoint(); + if (info->state->smc_scc_num == KGDB_SER_IDX && + (*cp == 0x03 || *cp == '$')) { + breakpoint(); return; } #endif @@ -420,7 +450,7 @@ icount->rx++; #ifdef SERIAL_DEBUG_INTR - printk("DR%02x:%02x...", ch, status); + printk("DR%02x:%02x...", ch, status); #endif *tty->flip.flag_buf_ptr = 0; if (status & (BD_SC_BR | BD_SC_FR | @@ -1033,7 +1063,7 @@ smcp->smc_smcmr = new_mode; } - m8xx_cpm_setbrg((state - rs_table), baud_rate); + m8xx_cpm_setbrg(PORT_BRG(state->smc_scc_num), baud_rate); restore_flags(flags); } @@ -1042,6 +1072,8 @@ { ser_info_t *info = (ser_info_t *)tty->driver_data; volatile cbd_t *bdp; + unsigned char *cp; + unsigned long flags; if (serial_paranoia_check(info, tty->device, "rs_put_char")) return; @@ -1049,21 +1081,22 @@ if (!tty) return; + local_irq_save(flags); bdp = info->tx_cur; - while (bdp->cbd_sc & BD_SC_READY); - - *((char *)__va(bdp->cbd_bufaddr)) = ch; - bdp->cbd_datlen = 1; - bdp->cbd_sc |= BD_SC_READY; - /* Get next BD. */ if (bdp->cbd_sc & BD_SC_WRAP) - bdp = info->tx_bd_base; + info->tx_cur = info->tx_bd_base; else - bdp++; + info->tx_cur = (cbd_t *)bdp + 1; + local_irq_restore(flags); - info->tx_cur = (cbd_t *)bdp; + while (bdp->cbd_sc & BD_SC_READY); + + cp = info->tx_va_base + ((bdp - info->tx_bd_base) * TX_BUF_SIZE); + *cp = ch; + bdp->cbd_datlen = 1; + bdp->cbd_sc |= BD_SC_READY; } @@ -1073,6 +1106,8 @@ int c, ret = 0; ser_info_t *info = (ser_info_t *)tty->driver_data; volatile cbd_t *bdp; + unsigned char *cp; + unsigned long flags; #ifdef CONFIG_KGDB_CONSOLE /* Try to let stub handle output. Returns true if it did. */ @@ -1086,43 +1121,50 @@ if (!tty) return 0; - bdp = info->tx_cur; - while (1) { c = MIN(count, TX_BUF_SIZE); if (c <= 0) break; + local_irq_save(flags); + bdp = info->tx_cur; if (bdp->cbd_sc & BD_SC_READY) { info->flags |= TX_WAKEUP; + local_irq_restore(flags); break; } + /* Get next BD. + */ + if (bdp->cbd_sc & BD_SC_WRAP) + info->tx_cur = info->tx_bd_base; + else + info->tx_cur = (cbd_t *)bdp + 1; + local_irq_restore(flags); - if (from_user) { - if (copy_from_user(__va(bdp->cbd_bufaddr), buf, c)) { - if (!ret) - ret = -EFAULT; - break; - } - } else { - memcpy(__va(bdp->cbd_bufaddr), buf, c); - } + cp = info->tx_va_base + ((bdp - info->tx_bd_base) * + TX_BUF_SIZE); + if (from_user) + c -= copy_from_user((void *)cp, buf, c); + else + memcpy((void *)cp, buf, c); - bdp->cbd_datlen = c; - bdp->cbd_sc |= BD_SC_READY; + if (c) { + bdp->cbd_datlen = c; + bdp->cbd_sc |= BD_SC_READY; + } else { + /* Need to TX at least 1 char to keep CPM sane */ + bdp->cbd_datlen = 1; + *cp = 0; + bdp->cbd_sc |= BD_SC_READY; + if (!ret) + ret = -EFAULT; + break; + } buf += c; count -= c; ret += c; - - /* Get next BD. - */ - if (bdp->cbd_sc & BD_SC_WRAP) - bdp = info->tx_bd_base; - else - bdp++; - info->tx_cur = (cbd_t *)bdp; } return ret; } @@ -1181,27 +1223,29 @@ static void rs_8xx_send_xchar(struct tty_struct *tty, char ch) { volatile cbd_t *bdp; + unsigned char *cp; + unsigned long flags; ser_info_t *info = (ser_info_t *)tty->driver_data; if (serial_paranoia_check(info, tty->device, "rs_send_char")) return; + local_irq_save(flags); bdp = info->tx_cur; - while (bdp->cbd_sc & BD_SC_READY); - - *((char *)__va(bdp->cbd_bufaddr)) = ch; - bdp->cbd_datlen = 1; - bdp->cbd_sc |= BD_SC_READY; - /* Get next BD. */ if (bdp->cbd_sc & BD_SC_WRAP) - bdp = info->tx_bd_base; + info->tx_cur = info->tx_bd_base; else - bdp++; + info->tx_cur = (cbd_t *)bdp + 1; + local_irq_restore(flags); + while (bdp->cbd_sc & BD_SC_READY); - info->tx_cur = (cbd_t *)bdp; + cp = info->tx_va_base + ((bdp - info->tx_bd_base) * TX_BUF_SIZE); + *cp = ch; + bdp->cbd_datlen = 1; + bdp->cbd_sc |= BD_SC_READY; } /* @@ -1772,7 +1816,7 @@ static void rs_8xx_wait_until_sent(struct tty_struct *tty, int timeout) { ser_info_t *info = (ser_info_t *)tty->driver_data; - unsigned long orig_jiffies, char_time; + unsigned long orig_jiffies, char_time, tst_res; /*int lsr;*/ volatile cbd_t *bdp; @@ -1807,6 +1851,7 @@ * are empty. */ do { + unsigned long flags; #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT printk("lsr = %d (jiff=%lu)...", lsr, jiffies); #endif @@ -1824,12 +1869,15 @@ * is the buffer is available. There are still characters * in the CPM FIFO. */ + local_irq_save(flags); bdp = info->tx_cur; if (bdp == info->tx_bd_base) bdp += (TX_NUM_FIFO-1); else bdp--; - } while (bdp->cbd_sc & BD_SC_READY); + tst_res = !!(bdp->cbd_sc & BD_SC_READY); + local_irq_restore(flags); + } while (tst_res); current->state = TASK_RUNNING; #ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT printk("lsr = %d (jiff=%lu)...done\n", lsr, jiffies); @@ -2217,6 +2265,11 @@ #ifdef CONFIG_SERIAL_CONSOLE +/* I need this just so I can store the virtual addresses and have + * common functions for the early console printing. + */ +static ser_info_t consinfo; + /* * Print a string to the serial port trying not to disturb any possible * real use of the port... @@ -2226,10 +2279,11 @@ { struct serial_state *ser; ser_info_t *info; - unsigned i; + unsigned i, c, cr_missing, max_tx_size; volatile cbd_t *bdp, *bdbase; volatile smc_uart_t *up; volatile u_char *cp; + unsigned long flags; ser = rs_table + idx; @@ -2238,82 +2292,72 @@ * we simply use the single buffer allocated. */ if ((info = (ser_info_t *)ser->info) != NULL) { - bdp = info->tx_cur; bdbase = info->tx_bd_base; - } - else { - /* Pointer to UART in parameter ram. - */ + } else { + /* Pointer to UART in parameter ram. */ up = (smc_uart_t *)&cpmp->cp_dparam[ser->port]; - /* Get the address of the host memory buffer. - */ - bdp = bdbase = (cbd_t *)&cpmp->cp_dpmem[up->smc_tbase]; - } + /* Get the address of the host memory buffer.*/ + info = &consinfo; + info->tx_bd_base = (cbd_t *)bdbase = (cbd_t *)&cpmp->cp_dpmem[up->smc_tbase]; + info->tx_cur = (cbd_t *)bdbase; + } + max_tx_size = console_tx_buf_len; + cr_missing = 0; + while (1){ + c = MIN(max_tx_size, count); + if (c <= 0) + break; - /* - * We need to gracefully shut down the transmitter, disable - * interrupts, then send our bytes out. - */ + local_irq_save(flags); + bdp = info->tx_cur; + bdbase = info->tx_bd_base; + if (bdp->cbd_sc & BD_SC_WRAP) + info->tx_cur = (cbd_t *)bdbase; + else + info->tx_cur = (cbd_t *)(bdp+1); + local_irq_restore(flags); - /* - * Now, do each character. This is not as bad as it looks - * since this is a holding FIFO and not a transmitting FIFO. - * We could add the complexity of filling the entire transmit - * buffer, but we would just wait longer between accesses...... - */ - for (i = 0; i < count; i++, s++) { /* Wait for transmitter fifo to empty. * Ready indicates output is ready, and xmt is doing * that, not that it is ready for us to send. */ while (bdp->cbd_sc & BD_SC_READY); - /* Send the character out. + /* Send the characters out. * If the buffer address is in the CPM DPRAM, don't * convert it. */ if ((uint)(bdp->cbd_bufaddr) > (uint)IMAP_ADDR) cp = (u_char *)(bdp->cbd_bufaddr); else - cp = __va(bdp->cbd_bufaddr); - *cp = *s; + cp = info->tx_va_base + ((bdp - info->tx_bd_base) * TX_BUF_SIZE); - bdp->cbd_datlen = 1; + i=1; /* Keeps track of consumed TX buffer space */ + if (cr_missing) { + /* Previus loop didn't have room for the CR, insert it first in this */ + *cp++ = '\r'; + i++; + } + cr_missing = 0; + for (; i <= c; i++) { + if ((*cp++ = *s++) != '\n') + continue; /* Copy bytes until a NewLine is found */ + /* NewLine found, see if there is space in the TX buffer to add a CR */ + if (i < max_tx_size) { + *cp++ = '\r'; /* yes, there is space to add a CR */ + i++; + } else + cr_missing = 1; /* No space in the TX buffer, + rember it so it can be inserted in the next loop */ + } + count -= (c-cr_missing); + bdp->cbd_datlen = i-1; bdp->cbd_sc |= BD_SC_READY; - if (bdp->cbd_sc & BD_SC_WRAP) - bdp = bdbase; - else - bdp++; - - /* if a LF, also do CR... */ - if (*s == 10) { - while (bdp->cbd_sc & BD_SC_READY); - cp = __va(bdp->cbd_bufaddr); - *cp = 13; - bdp->cbd_datlen = 1; - bdp->cbd_sc |= BD_SC_READY; - - if (bdp->cbd_sc & BD_SC_WRAP) { - bdp = bdbase; - } - else { - bdp++; - } - } } - - /* - * Finally, Wait for transmitter & holding register to empty - * and restore the IER - */ - while (bdp->cbd_sc & BD_SC_READY); - - if (info) - info->tx_cur = (cbd_t *)bdp; + /* while (bdp->cbd_sc & BD_SC_READY); is this really needed? */ } - static void serial_console_write(struct console *c, const char *s, unsigned count) { @@ -2358,10 +2402,13 @@ * If the port has been initialized for general use, we must * use information from the port structure. */ - if ((info = (ser_info_t *)ser->info)) + if ((info = (ser_info_t *)ser->info)) { bdp = info->rx_cur; - else + } + else { bdp = (cbd_t *)&cpmp->cp_dpmem[up->smc_rbase]; + info = &consinfo; + } /* * We need to gracefully shut down the receiver, disable @@ -2383,7 +2430,7 @@ if ((uint)(bdp->cbd_bufaddr) > (uint)IMAP_ADDR) cp = (u_char *)(bdp->cbd_bufaddr); else - cp = __va(bdp->cbd_bufaddr); + cp = info->rx_va_base + ((bdp - info->rx_bd_base) * RX_BUF_SIZE); if (obuf) { i = c = bdp->cbd_datlen; @@ -2522,6 +2569,43 @@ /* * The serial driver boot-time initialization code! */ + +int __init rs_8xx_alloc_brg(int port) +{ + static int brg = 0; + volatile cpm8xx_t *cp = cpmp; + int res = brg; + + /* "Wire" the BRG to the specified port + */ + switch (port) { + case QUICC_CPM_SMC1: + cp->cp_simode = (cp->cp_simode & ~(0x07<<12)) | (brg<<12); + break; + case QUICC_CPM_SMC2: + cp->cp_simode = (cp->cp_simode & ~(0x07<<28)) | (brg<<28); + break; + case QUICC_CPM_SCC1: + cp->cp_sicr = (cp->cp_sicr & ~(0xFF<<0)) | (((brg<<3)|(brg<<0))<<0); + break; + case QUICC_CPM_SCC2: + cp->cp_sicr = (cp->cp_sicr & ~(0xFF<<8)) | (((brg<<3)|(brg<<0))<<8); + break; + case QUICC_CPM_SCC3: + cp->cp_sicr = (cp->cp_sicr & ~(0xFF<<16)) | (((brg<<3)|(brg<<0))<<16); + break; + case QUICC_CPM_SCC4: + cp->cp_sicr = (cp->cp_sicr & ~(0xFF<<24)) | (((brg<<3)|(brg<<0))<<24); + break; + } + /* Consume this BRG - Note: the last BRG will be reused if this + */ + /* function is called too many times! + */ + if (brg < QUICC_MAX_BRG) brg++; + return res; +} + int __init rs_8xx_init(void) { struct serial_state * state; @@ -2668,9 +2752,12 @@ state->icount.rx = state->icount.tx = 0; state->icount.frame = state->icount.parity = 0; state->icount.overrun = state->icount.brk = 0; - printk(KERN_INFO "ttyS%02d at 0x%04x is a %s\n", + PORT_BRG_SET(state->smc_scc_num, rs_8xx_alloc_brg(state->smc_scc_num)); + printk(KERN_INFO "ttyS%d at 0x%04x is on %s%d using BRG%d\n", i, (unsigned int)(state->port), - PORT_IS_SCC(state->smc_scc_num) ? "SCC" : "SMC"); + PORT_IS_SCC(state->smc_scc_num) ? "SCC" : "SMC", + PORT_NUM(state->smc_scc_num)+1, + PORT_BRG(state->smc_scc_num)+1); #ifdef CONFIG_SERIAL_CONSOLE /* If we just printed the message on the console port, and * we are about to initialize it for general use, we have @@ -2704,6 +2791,7 @@ /* Allocate space for FIFOs in the host memory. */ mem_addr = m8xx_cpm_hostalloc(RX_NUM_FIFO * RX_BUF_SIZE); + info->rx_va_base = (unsigned char *)mem_addr; /* Set the physical address of the host memory * buffers in the buffer descriptors, and the @@ -2713,12 +2801,12 @@ info->rx_cur = info->rx_bd_base = (cbd_t *)bdp; for (j=0; j<(RX_NUM_FIFO-1); j++) { - bdp->cbd_bufaddr = __pa(mem_addr); + bdp->cbd_bufaddr = iopa(mem_addr); bdp->cbd_sc = BD_SC_EMPTY | BD_SC_INTRPT; mem_addr += RX_BUF_SIZE; bdp++; } - bdp->cbd_bufaddr = __pa(mem_addr); + bdp->cbd_bufaddr = iopa(mem_addr); bdp->cbd_sc = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT; idx = PORT_NUM(info->state->smc_scc_num); @@ -2738,6 +2826,7 @@ /* Allocate space for FIFOs in the host memory. */ mem_addr = m8xx_cpm_hostalloc(TX_NUM_FIFO * TX_BUF_SIZE); + info->tx_va_base = (unsigned char *)mem_addr; /* Set the physical address of the host memory * buffers in the buffer descriptors, and the @@ -2747,12 +2836,12 @@ info->tx_cur = info->tx_bd_base = (cbd_t *)bdp; for (j=0; j<(TX_NUM_FIFO-1); j++) { - bdp->cbd_bufaddr = __pa(mem_addr); + bdp->cbd_bufaddr = iopa(mem_addr); bdp->cbd_sc = BD_SC_INTRPT; mem_addr += TX_BUF_SIZE; bdp++; } - bdp->cbd_bufaddr = __pa(mem_addr); + bdp->cbd_bufaddr = iopa(mem_addr); bdp->cbd_sc = (BD_SC_WRAP | BD_SC_INTRPT); if (PORT_IS_SCC(info->state->smc_scc_num)) { @@ -2846,12 +2935,14 @@ } #endif /* CONFIG_ALTSMC2 */ +#if 0 /* Connect the baud rate generator to the * SMC based upon index in rs_table. Also * make sure it is connected to NMSI. */ cp->cp_simode &= ~(0xffff << (idx * 16)); cp->cp_simode |= (i << ((idx * 16) + 12)); +#endif up->smc_tbase = dp_addr; @@ -2903,11 +2994,11 @@ /* Set up the baud rate generator. */ - m8xx_cpm_setbrg(i, baud_table[baud_idx]); + m8xx_cpm_setbrg(PORT_BRG(state->smc_scc_num), baud_table[baud_idx]); } } - + console_tx_buf_len = TX_BUF_SIZE; return 0; } @@ -2959,20 +3050,28 @@ * from dual port ram, and a character buffer area from host mem. */ + /* Allocate space for two FIFOs. We can't allocate from host + * memory yet because vm allocator isn't initialized + * during this early console init. + */ + dp_addr = m8xx_cpm_dpalloc(2*EARLY_BUF_SIZE); + mem_addr = (uint)(&cpmp->cp_dpmem[dp_addr]); + /* Allocate space for two buffer descriptors in the DP ram. */ dp_addr = m8xx_cpm_dpalloc(sizeof(cbd_t) * 2); - /* Allocate space for two 2 byte FIFOs in the host memory. - */ - mem_addr = m8xx_cpm_hostalloc(8); - /* Set the physical address of the host memory buffers in * the buffer descriptors. */ bdp = (cbd_t *)&cp->cp_dpmem[dp_addr]; - bdp->cbd_bufaddr = __pa(mem_addr); - (bdp+1)->cbd_bufaddr = __pa(mem_addr+4); + bdp->cbd_bufaddr = iopa(mem_addr); + (bdp+1)->cbd_bufaddr = iopa(mem_addr+4); + + consinfo.rx_va_base = (unsigned char *) mem_addr; + consinfo.rx_bd_base = (cbd_t *) bdp; + consinfo.tx_va_base = (unsigned char *) (mem_addr + EARLY_BUF_SIZE); + consinfo.tx_bd_base = (cbd_t *) (bdp+1); /* For the receive, set empty and wrap. * For transmit, set wrap. @@ -3073,7 +3172,7 @@ /* Set up the baud rate generator. */ m8xx_cpm_setbrg((ser - rs_table), bd->bi_baudrate); - + console_tx_buf_len = EARLY_BUF_SIZE; return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/Makefile linux-2.4.23-pre8/arch/ppc/Makefile --- linux-2.4.22/arch/ppc/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/Makefile 2003-10-22 22:47:38.000000000 +0000 @@ -14,7 +14,7 @@ # # Be sure to change PAGE_OFFSET in include/asm-ppc/page.h to match -KERNELLOAD =0xc0000000 +KERNELLOAD =$(CONFIG_KERNEL_START) LINKFLAGS = -T arch/ppc/vmlinux.lds -Ttext $(KERNELLOAD) -Bstatic CPPFLAGS := $(CPPFLAGS) -I$(TOPDIR)/arch/$(ARCH) @@ -42,18 +42,13 @@ CFLAGS += $(shell echo $(CONFIG_COMPILE_OPTIONS) | sed -e 's/"//g') endif -ifdef CONFIG_40x - HEAD := arch/ppc/kernel/head_4xx.o -else - ifdef CONFIG_8xx - HEAD := arch/ppc/kernel/head_8xx.o - else - HEAD := arch/ppc/kernel/head.o - ifdef CONFIG_6xx - HEAD += arch/ppc/kernel/idle_6xx.o - endif - endif -endif +HEAD-y := arch/ppc/kernel/head.o +HEAD-$(CONFIG_40x) := arch/ppc/kernel/head_4xx.o +HEAD-$(CONFIG_44x) := arch/ppc/kernel/head_44x.o +HEAD-$(CONFIG_8xx) := arch/ppc/kernel/head_8xx.o +HEAD-$(CONFIG_6xx) += arch/ppc/kernel/idle_6xx.o + +HEAD := $(HEAD-y) ARCH_SUBDIRS = arch/ppc/kernel arch/ppc/platforms arch/ppc/mm arch/ppc/lib SUBDIRS := $(SUBDIRS) $(ARCH_SUBDIRS) @@ -90,7 +85,7 @@ checks: @$(MAKE) -C arch/$(ARCH)/kernel checks -BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd +BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd uImage # All the instructions talk about "make bzImage". bzImage: zImage diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/Makefile linux-2.4.23-pre8/arch/ppc/boot/Makefile --- linux-2.4.22/arch/ppc/boot/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/Makefile 2003-10-22 22:49:04.000000000 +0000 @@ -17,7 +17,7 @@ AFLAGS += -D__BOOTER__ OBJCOPY_ARGS = -O elf32-powerpc -MKIMAGE := ./utils/mkimage.wrapper +MKIMAGE := $(TOPDIR)/scripts/mkuboot.sh lib/zlib.a: lib/zlib.c $(MAKE) -C lib @@ -61,12 +61,14 @@ gzip $(GZIP_FLAGS) images/vmapus endif -# Make an image for PPCBoot -pImage: images/vmlinux.gz - $(MKIMAGE) -A ppc -O linux -T kernel -C gzip -a 00000000 -e 00000000 \ +# Make an image for PPCBoot / U-Boot. +uImage: $(MKIMAGE) images/vmlinux.gz + $(CONFIG_SHELL) $(MKIMAGE) -A ppc -O linux -T kernel \ + -C gzip -a 00000000 -e 00000000 \ -n 'Linux-$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)' \ - -d $< images/vmlinux.PPCBoot - ln -sf vmlinux.PPCBoot images/pImage + -d images/vmlinux.gz images/vmlinux.UBoot + ln -sf vmlinux.UBoot images/uImage + rm -f ./mkuboot # These are subdirs with files not normally rm'ed. -- Tom clean: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/common/crt0.S linux-2.4.23-pre8/arch/ppc/boot/common/crt0.S --- linux-2.4.22/arch/ppc/boot/common/crt0.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/common/crt0.S 2003-10-22 22:49:10.000000000 +0000 @@ -70,7 +70,7 @@ ## Set up the stack lis r9,_start@h # r9 = &_start (text section entry) - addi r9,r9,_start@l + ori r9,r9,_start@l subi r1,r9,64 # Start the stack 64 bytes below _start clrrwi r1,r1,4 # Make sure it is aligned on 16 bytes. li r0,0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/common/util.S linux-2.4.23-pre8/arch/ppc/boot/common/util.S --- linux-2.4.22/arch/ppc/boot/common/util.S 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/common/util.S 2003-10-22 22:47:44.000000000 +0000 @@ -160,9 +160,22 @@ blr +/* udelay (on non-601 processors) needs to know the period of the + * timebase in nanoseconds. This used to be hardcoded to be 60ns + * (period of 66MHz/4). Now a variable is used that is initialized to + * 60 for backward compatibility, but it can be overridden as necessary + * with code something like this: + * extern unsigned long timebase_period_ns; + * timebase_period_ns = 1000000000 / bd->bi_tbfreq; + */ + .data + .globl timebase_period_ns +timebase_period_ns: + .long 60 + + .text /* * Delay for a number of microseconds - * -- Use the BUS timer (assumes 66MHz) */ .globl udelay udelay: @@ -180,8 +193,13 @@ .udelay_not_601: mulli r4,r3,1000 /* nanoseconds */ - addi r4,r4,59 - li r5,60 + /* Change r4 to be the number of ticks using: + * (nanoseconds + (timebase_period_ns - 1 )) / timebase_period_ns + * timebase_period_ns defaults to 60 (16.6MHz) */ + lis r5,timebase_period_ns@ha + lwz r5,timebase_period_ns@l(r5) + add r4,r4,r5 + addi r4,r4,-1 divw r4,r4,r5 /* BUS ticks */ 1: mftbu r5 mftb r6 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/images/Makefile linux-2.4.23-pre8/arch/ppc/boot/images/Makefile --- linux-2.4.22/arch/ppc/boot/images/Makefile 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/images/Makefile 2003-10-22 22:47:40.000000000 +0000 @@ -9,4 +9,4 @@ gzip -vf9 vmlinux clean: - rm -f sImage vmapus vmlinux* miboot* zImage* zvmlinux* + rm -f sImage vmapus vmlinux* miboot* zImage* zvmlinux* uImage diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/simple/Makefile linux-2.4.23-pre8/arch/ppc/boot/simple/Makefile --- linux-2.4.22/arch/ppc/boot/simple/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/simple/Makefile 2003-10-22 22:47:30.000000000 +0000 @@ -28,6 +28,35 @@ TFTPIMAGE := /tftpboot/zImage.embedded MISC := misc-embedded.o endif +ifeq ($(CONFIG_IBM_OPENBIOS),y) +ZIMAGE := zImage-TREE +ZIMAGEINITRD := zImage.initrd-TREE +END := treeboot +ZNETBOOT := zImage.treeboot +ZNETBOOTRD := zImage.initrd.treeboot +TFTPIMAGE := /tftpboot/zImage.embedded +MISC := misc-embedded.o +endif +ifeq ($(CONFIG_EBONY),y) +ZIMAGE := zImage-TREE +ZIMAGEINITRD := zImage.initrd-TREE +END := ebony +ENTRYPOINT := 0x00800000 +ZNETBOOT := zImage.treeboot +ZNETBOOTRD := zImage.initrd.treeboot +TFTPIMAGE := /tftpboot/zImage.$(END) +EXTRA := misc-44x.o +endif +ifeq ($(CONFIG_OCOTEA),y) +ZIMAGE := zImage-TREE +ZIMAGEINITRD := zImage.initrd-TREE +END := ocotea +ENTRYPOINT := 0x00800000 +ZNETBOOT := zImage.treeboot +ZNETBOOTRD := zImage.initrd.treeboot +TFTPIMAGE := /tftpboot/zImage.$(END) +EXTRA := misc-44x.o +endif ifeq ($(CONFIG_GEMINI),y) ZIMAGE := zImage-SMON ZIMAGEINITRD := zImage.initrd-SMON @@ -68,7 +97,7 @@ ifdef CONFIG_8xx LD_ARGS := -T ../ld.script -Ttext 0x00180000 -Bstatic endif -ifeq ($(CONFIG_8260)$(CONFIG_4xx),y) +ifeq ($(CONFIG_8260)$(CONFIG_40x),y) LD_ARGS := -T ../ld.script -Ttext 0x00400000 -Bstatic endif OBJCOPY_ARGS := -O elf32-powerpc @@ -147,10 +176,10 @@ mv zvmlinux.initrd ../images/zImage.initrd.embedded zImage-PAL4: zvmlinux - cp zvmlinux ../images/zImage.pal4 + mv zvmlinux ../images/zImage.pal4 zImage.initrd-PAL4: zvmlinux.initrd - cp zvmlinux.initrd ../images/zImage.initrd.pal4 + mv zvmlinux.initrd ../images/zImage.initrd.pal4 zImage-PPLUS: zvmlinux $(MKPREP) $(MKBUGBOOT) $(MKPREP) -pbp zvmlinux ../images/zImage.pplus diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/simple/embed_config.c linux-2.4.23-pre8/arch/ppc/boot/simple/embed_config.c --- linux-2.4.22/arch/ppc/boot/simple/embed_config.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/simple/embed_config.c 2003-10-22 22:49:19.000000000 +0000 @@ -22,6 +22,7 @@ #if defined(CONFIG_405GP) || defined(CONFIG_NP405H) || defined(CONFIG_NP405L) #include #endif +extern unsigned long timebase_period_ns; /* For those boards that don't provide one. */ @@ -640,7 +641,7 @@ } #endif /* WILLOW */ -#ifdef CONFIG_TREEBOOT +#ifdef CONFIG_IBM_OPENBIOS /* This could possibly work for all treeboot roms. */ #define BOARD_INFO_VECTOR 0xFFFE0B50 @@ -654,15 +655,12 @@ bd_t *(*get_board_info)(void) = (bd_t *(*)(void))(*(unsigned long *)BOARD_INFO_VECTOR); #if !defined(CONFIG_STB03xxx) - volatile emac_t *emacp; - emacp = (emac_t *)EMAC0_BASE; /* assume 1st emac - armin */ - /* shut down the Ethernet controller that the boot rom * sometimes leaves running. */ - mtdcr(DCRN_MALCR, MALCR_MMSR); /* 1st reset MAL */ - while (mfdcr(DCRN_MALCR) & MALCR_MMSR) {}; /* wait for the reset */ - emacp->em0mr0 = 0x20000000; /* then reset EMAC */ + mtdcr(DCRN_MALCR(DCRN_MAL_BASE), MALCR_MMSR); /* 1st reset MAL */ + while (mfdcr(DCRN_MALCR(DCRN_MAL_BASE)) & MALCR_MMSR) {}; /* wait for the reset */ + out_be32((u32 *)EMAC0_BASE, 0x20000000); /* then reset EMAC */ eieio(); #endif @@ -752,6 +750,6 @@ bd->bi_busfreq = 100000000; bd->bi_pci_busfreq= 33000000 ; #endif + timebase_period_ns = 1000000000 / bd->bi_tbfreq; } #endif - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/simple/head.S linux-2.4.23-pre8/arch/ppc/boot/simple/head.S --- linux-2.4.22/arch/ppc/boot/simple/head.S 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/simple/head.S 2003-10-22 22:49:22.000000000 +0000 @@ -35,8 +35,8 @@ .globl start start: bl start_ -#ifdef CONFIG_TREEBOOT - /* The IBM "Tree" bootrom knows that the address of the bootrom +#ifdef CONFIG_IBM_OPENBIOS + /* The IBM OpenBIOS bootroms know that the address of the bootrom * read only structure is 4 bytes after _start. */ .long 0x62726f6d # structure ID - "brom" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/simple/misc-44x.c linux-2.4.23-pre8/arch/ppc/boot/simple/misc-44x.c --- linux-2.4.22/arch/ppc/boot/simple/misc-44x.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/simple/misc-44x.c 2003-10-22 22:48:11.000000000 +0000 @@ -0,0 +1,34 @@ +/* + * arch/ppc/simple/misc-44x.c + * + * Misc. bootloader code for IBM PPC 44x reference boards (Ebony, Ocotea) + * + * Matt Porter + * Eugene Surovegin + * + * 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 + +extern struct bi_record *decompress_kernel(unsigned long load_addr, + int num_words, unsigned long cksum); +extern unsigned long timebase_period_ns; + +struct bi_record * +load_kernel(unsigned long load_addr, int num_words, unsigned long cksum) +{ + timebase_period_ns = 3; + mtdcr(DCRN_MALCR(DCRN_MAL_BASE), MALCR_MMSR); /* reset MAL */ + while (mfdcr(DCRN_MALCR(DCRN_MAL_BASE)) & MALCR_MMSR) {}; /* wait for reset */ + *(volatile unsigned long *)PPC44x_EMAC0_MR0 = 0x20000000; /* reset EMAC */ + eieio(); + + return decompress_kernel(load_addr, num_words, cksum); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/simple/misc-embedded.c linux-2.4.23-pre8/arch/ppc/boot/simple/misc-embedded.c --- linux-2.4.22/arch/ppc/boot/simple/misc-embedded.c 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/simple/misc-embedded.c 2003-10-22 22:48:38.000000000 +0000 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -78,6 +79,14 @@ extern void gunzip(void *, int, unsigned char *, int *); extern void embed_config(bd_t **bp); +/* Weak function for boards which don't need to build the + * board info struct because they are using PPCBoot/U-Boot. + */ +void __attribute__ ((weak)) +embed_config(bd_t **bdp) +{ +} + unsigned long load_kernel(unsigned long load_addr, int num_words, unsigned long cksum, bd_t *bp) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/boot/utils/mkimage.wrapper linux-2.4.23-pre8/arch/ppc/boot/utils/mkimage.wrapper --- linux-2.4.22/arch/ppc/boot/utils/mkimage.wrapper 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/boot/utils/mkimage.wrapper 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -#!/bin/bash - -# -# Build PPCBoot image when `mkimage' tool is available. -# - -MKIMAGE=$(type -path mkimage) - -if [ -z "${MKIMAGE}" ]; then - # Doesn't exist - echo '"mkimage" command not found - PPCBoot images will not be built' >&2 - exit 0; -fi - -# Call "mkimage" to create PPCBoot image -${MKIMAGE} "$@" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/config.in linux-2.4.23-pre8/arch/ppc/config.in --- linux-2.4.22/arch/ppc/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/config.in 2003-10-22 22:49:00.000000000 +0000 @@ -12,6 +12,7 @@ mainmenu_option next_comment comment 'Code maturity level options' bool 'Prompt for development and/or incomplete code/drivers' CONFIG_EXPERIMENTAL +bool 'Prompt for advanced kernel configuration options' CONFIG_ADVANCED_OPTIONS endmenu mainmenu_option next_comment @@ -30,11 +31,12 @@ choice 'Processor Type' \ "6xx/7xx/74xx/8260 CONFIG_6xx \ 40x CONFIG_40x \ + 44x CONFIG_44x \ POWER3 CONFIG_POWER3 \ POWER4 CONFIG_POWER4 \ 8xx CONFIG_8xx" 6xx -if [ "$CONFIG_40x" = "y" ]; then +if [ "$CONFIG_40x" = "y" -o "$CONFIG_44x" = "y" ]; then define_bool CONFIG_4xx y fi @@ -64,6 +66,12 @@ Walnut CONFIG_WALNUT" Walnut fi +if [ "$CONFIG_44x" = "y" ]; then + choice 'Machine Type' \ + "Ebony CONFIG_EBONY \ + Ocotea CONFIG_OCOTEA" Ebony +fi + if [ "$CONFIG_8xx" = "y" ]; then define_bool CONFIG_SERIAL_CONSOLE y define_bool CONFIG_NOT_COHERENT_CACHE y @@ -73,6 +81,7 @@ RPX-Classic CONFIG_RPXCLASSIC \ BSE-IP CONFIG_BSEIP \ FADS CONFIG_FADS \ + D-Box2 CONFIG_DBOX2 \ TQM823L CONFIG_TQM823L \ TQM850L CONFIG_TQM850L \ TQM855L CONFIG_TQM855L \ @@ -123,6 +132,7 @@ bool 'Symmetric multi-processing support' CONFIG_SMP if [ "$CONFIG_SMP" = "y" ]; then bool ' Distribute interrupts on all CPUs by default' CONFIG_IRQ_ALL_CPUS + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 fi if [ "$CONFIG_6xx" = "y" -a "$CONFIG_8260" = "n" ];then @@ -134,35 +144,103 @@ fi define_bool CONFIG_PPC_ISATIMER y fi +if [ "$CONFIG_POWER4" = "y" ]; then + bool 'VMX (same as AltiVec) support' CONFIG_ALTIVEC +fi if [ "$CONFIG_4xx" = "y" -o "$CONFIG_8xx" = "y" ]; then bool 'Math emulation' CONFIG_MATH_EMULATION fi -if [ "$CONFIG_40x" = "y" ]; then -# It's often necessary to know the specific 4xx processor type. -# Fortunately, it is impled (so far) from the board type, so we -# don't need to ask more redundant questions. +if [ "$CONFIG_4xx" = "y" ]; then + + bool 'PPC4xx DMA controller support' CONFIG_PPC4xx_DMA + if [ "$CONFIG_PPC4xx_DMA" = "y" ]; then + define_bool CONFIG_PPC4xx_EDMA y + fi + +# +# Set generic PPC4xx options +# + define_bool CONFIG_NOT_COHERENT_CACHE y + + if [ "$CONFIG_40x" = "y" ]; then + choice 'TTYS0 device and default console' \ + "UART0 CONFIG_UART0_TTYS0 \ + UART1 CONFIG_UART0_TTYS1" UART0 + fi + +# +# Set processor implementation based on board +# if [ "$CONFIG_OAK" = "y" -o "$CONFIG_TIVO" = "y" ]; then define_bool CONFIG_403GCX y - define_bool CONFIG_IBM_OPENBIOS y fi + if [ "$CONFIG_WALNUT" = "y" ]; then define_bool CONFIG_405GP y - define_bool CONFIG_BIOS_FIXUP y - define_bool CONFIG_IBM_OPENBIOS y - define_bool CONFIG_IBM405_ERR77 y + fi + + if [ "$CONFIG_EBONY" = "y" ]; then + define_bool CONFIG_440GP y + fi + + if [ "$CONFIG_OCOTEA" = "y" ]; then + define_bool CONFIG_440GX y + fi + +# +# Set options based on processor implementation +# + if [ "$CONFIG_405GP" = "y" ]; then define_bool CONFIG_IBM_OCP y + define_bool CONFIG_405 y fi + + if [ "$CONFIG_440GP" = "y" ]; then + define_bool CONFIG_IBM_OCP y + define_bool CONFIG_GEN550 y + define_bool CONFIG_440 y + fi + + if [ "$CONFIG_440GX" = "y" ]; then + define_bool CONFIG_IBM_OCP y + define_bool CONFIG_GEN550 y + define_bool CONFIG_IBM_EMAC4 y + define_bool CONFIG_440A y + fi + +# +# Set options based on processor core +# if [ "$CONFIG_40x" = "y" ]; then - choice 'TTYS0 device and default console' \ - "UART0 CONFIG_UART0_TTYS0 \ - UART1 CONFIG_UART0_TTYS1" UART0 + define_bool CONFIG_IBM405_ERR51 y + fi + + if [ "$CONFIG_405" = "y" ]; then + define_bool CONFIG_IBM405_ERR77 y + fi + + if [ "$CONFIG_44x" = "y" ]; then + define_bool CONFIG_PTE_64BIT y + define_bool CONFIG_PIN_TLB y + define_bool CONFIG_BOOKE y + fi + +# +# Set other board specific options +# + if [ "$CONFIG_OAK" = "y" -o "$CONFIG_TIVO" = "y" -o \ + "$CONFIG_WALNUT" = "y" ]; then + define_bool CONFIG_IBM_OPENBIOS y + fi + + if [ "$CONFIG_WALNUT" = "y" ]; then + define_bool CONFIG_BIOS_FIXUP y fi - define_bool CONFIG_IBM405_ERR51 y - define_bool CONFIG_NOT_COHERENT_CACHE y fi + if [ "$CONFIG_8xx" = "y" -o "$CONFIG_8260" = "y" ]; then define_bool CONFIG_EMBEDDEDBOOT y fi @@ -172,8 +250,49 @@ comment 'General setup' bool 'High memory support (experimental)' CONFIG_HIGHMEM +if [ "$CONFIG_ADVANCED_OPTIONS" = "y" ]; then + if [ "$CONFIG_HIGHMEM" = "y" ]; then + bool " Set high memory pool address" CONFIG_HIGHMEM_START_BOOL + if [ "$CONFIG_HIGHMEM_START_BOOL" = "y" ]; then + hex " Virtual start address of high memory pool" CONFIG_HIGHMEM_START 0xfe000000 + fi + fi + bool " Set maximum low memory" CONFIG_LOWMEM_SIZE_BOOL + if [ "$CONFIG_LOWMEM_SIZE_BOOL" = "y" ]; then + hex " Maximum low memory size (in bytes)" CONFIG_LOWMEM_SIZE 0x20000000 + fi + + bool "Set custom kernel base address" CONFIG_KERNEL_START_BOOL + if [ "$CONFIG_KERNEL_START_BOOL" = "y" ]; then + hex " Virtual address of kernel base" CONFIG_KERNEL_START 0xc0000000 + fi + bool "Set custom user task size" CONFIG_TASK_SIZE_BOOL + if [ "$CONFIG_TASK_SIZE_BOOL" = "y" ]; then + hex " Size of user task space" CONFIG_TASK_SIZE 0x80000000 + fi +fi + +if [ "$CONFIG_HIGHMEM_START_BOOL" != "y" ]; then + define_hex CONFIG_HIGHMEM_START 0xfe000000 +fi + +if [ "$CONFIG_LOWMEM_SIZE_BOOL" != "y" ]; then + define_hex CONFIG_LOWMEM_SIZE 0x30000000 +fi -define_bool CONFIG_ISA n +if [ "$CONFIG_KERNEL_START_BOOL" != "y" ]; then + define_hex CONFIG_KERNEL_START 0xc0000000 +fi + +if [ "$CONFIG_TASK_SIZE_BOOL" != "y" ]; then + define_hex CONFIG_TASK_SIZE 0x80000000 +fi + +if [ "$CONFIG_ALL_PPC" = "y" ]; then + bool 'Support for ISA-bus hardware' CONFIG_ISA +else + define_bool CONFIG_ISA n +fi define_bool CONFIG_EISA n define_bool CONFIG_SBUS n @@ -487,4 +606,7 @@ if [ "$CONFIG_GEN550" = "y" ]; then bool 'Support for early boot texts over serial port' CONFIG_SERIAL_TEXT_DEBUG fi + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/IVMS8_defconfig linux-2.4.23-pre8/arch/ppc/configs/IVMS8_defconfig --- linux-2.4.22/arch/ppc/configs/IVMS8_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/IVMS8_defconfig 2003-10-22 22:47:44.000000000 +0000 @@ -506,14 +506,8 @@ # CONFIG_SOUND is not set # -# MPC8xx CPM Options +# MPC8xx Options # -# CONFIG_SCC_ENET is not set -CONFIG_FEC_ENET=y -CONFIG_USE_MDIO=y -CONFIG_ENET_BIG_BUFFERS=y -# CONFIG_SMC2_UART is not set -# CONFIG_USE_SCC_IO is not set # # Generic MPC8xx Options @@ -523,6 +517,27 @@ # CONFIG_UCODE_PATCH is not set # +# MPC8xx CPM Options +# +# CONFIG_SCC_ENET is not set +CONFIG_FEC_ENET=y +CONFIG_USE_MDIO=y +# CONFIG_FEC_GENERIC_PHY is not set +# CONFIG_FEC_AM79C874 is not set +# CONFIG_FEC_LXT970 is not set +# CONFIG_FEC_QS6612 is not set +# CONFIG_FEC_LXT970 is not set +CONFIG_FEC_DP83843=y +# CONFIG_FEC_DP83846A is not set +CONFIG_ENET_BIG_BUFFERS=y +CONFIG_8xx_SMC1=y +# CONFIG_SMC2_UART is not set +# CONFIG_8xx_SCC1 is not set +# CONFIG_8xx_SCC2 is not set +# CONFIG_8xx_SCC3 is not set +# CONFIG_8xx_SCC4 is not set + +# # USB support # # CONFIG_USB is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/SM850_defconfig linux-2.4.23-pre8/arch/ppc/configs/SM850_defconfig --- linux-2.4.22/arch/ppc/configs/SM850_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/SM850_defconfig 2003-10-22 22:48:35.000000000 +0000 @@ -470,6 +470,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +CONFIG_8xx_CPU6=y +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y @@ -481,14 +492,9 @@ CONFIG_SMC2_UART=y CONFIG_ALTSMC2=y CONFIG_CONS_SMC2=y -# CONFIG_USE_SCC_IO is not set - -# -# Generic MPC8xx Options -# -CONFIG_8xx_COPYBACK=y -CONFIG_8xx_CPU6=y -# CONFIG_UCODE_PATCH is not set +# CONFIG_8xx_SCC1 is not set +# CONFIG_8xx_SCC2 is not set +# CONFIG_8xx_SCC4 is not set # # USB support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/SPD823TS_defconfig linux-2.4.23-pre8/arch/ppc/configs/SPD823TS_defconfig --- linux-2.4.22/arch/ppc/configs/SPD823TS_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/SPD823TS_defconfig 2003-10-22 22:49:47.000000000 +0000 @@ -469,6 +469,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +# CONFIG_8xx_CPU6 is not set +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y @@ -477,17 +488,13 @@ # CONFIG_SCC3_ENET is not set # CONFIG_FEC_ENET is not set CONFIG_ENET_BIG_BUFFERS=y +CONFIG_8xx_SMC1=y CONFIG_SMC2_UART=y CONFIG_ALTSMC2=y # CONFIG_CONS_SMC2 is not set -# CONFIG_USE_SCC_IO is not set - -# -# Generic MPC8xx Options -# -CONFIG_8xx_COPYBACK=y -# CONFIG_8xx_CPU6 is not set -# CONFIG_UCODE_PATCH is not set +# CONFIG_8xx_SCC1 is not set +# CONFIG_8xx_SCC3 is not set +# CONFIG_8xx_SCC4 is not set # # USB support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/TQM823L_defconfig linux-2.4.23-pre8/arch/ppc/configs/TQM823L_defconfig --- linux-2.4.22/arch/ppc/configs/TQM823L_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/TQM823L_defconfig 2003-10-22 22:48:00.000000000 +0000 @@ -470,6 +470,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +# CONFIG_8xx_CPU6 is not set +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y @@ -478,17 +489,13 @@ # CONFIG_SCC3_ENET is not set # CONFIG_FEC_ENET is not set CONFIG_ENET_BIG_BUFFERS=y +CONFIG_8xx_SMC1=y CONFIG_SMC2_UART=y CONFIG_ALTSMC2=y # CONFIG_CONS_SMC2 is not set -# CONFIG_USE_SCC_IO is not set - -# -# Generic MPC8xx Options -# -CONFIG_8xx_COPYBACK=y -# CONFIG_8xx_CPU6 is not set -# CONFIG_UCODE_PATCH is not set +# CONFIG_8xx_SCC1 is not set +# CONFIG_8xx_SCC3 is not set +# CONFIG_8xx_SCC4 is not set # # USB support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/TQM850L_defconfig linux-2.4.23-pre8/arch/ppc/configs/TQM850L_defconfig --- linux-2.4.22/arch/ppc/configs/TQM850L_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/TQM850L_defconfig 2003-10-22 22:49:02.000000000 +0000 @@ -470,6 +470,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +# CONFIG_8xx_CPU6 is not set +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/TQM860L_defconfig linux-2.4.23-pre8/arch/ppc/configs/TQM860L_defconfig --- linux-2.4.22/arch/ppc/configs/TQM860L_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/TQM860L_defconfig 2003-10-22 22:48:22.000000000 +0000 @@ -511,6 +511,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +# CONFIG_8xx_CPU6 is not set +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y @@ -519,17 +530,13 @@ # CONFIG_SCC3_ENET is not set # CONFIG_FEC_ENET is not set CONFIG_ENET_BIG_BUFFERS=y +CONFIG_8xx_SMC1=y CONFIG_SMC2_UART=y # CONFIG_ALTSMC2 is not set # CONFIG_CONS_SMC2 is not set -# CONFIG_USE_SCC_IO is not set - -# -# Generic MPC8xx Options -# -CONFIG_8xx_COPYBACK=y -# CONFIG_8xx_CPU6 is not set -# CONFIG_UCODE_PATCH is not set +# CONFIG_8xx_SCC2 is not set +# CONFIG_8xx_SCC3 is not set +# CONFIG_8xx_SCC4 is not set # # USB support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/apus_defconfig linux-2.4.23-pre8/arch/ppc/configs/apus_defconfig --- linux-2.4.22/arch/ppc/configs/apus_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/apus_defconfig 2003-10-22 22:49:18.000000000 +0000 @@ -415,7 +415,7 @@ # CONFIG_BMAC is not set # CONFIG_GMAC is not set CONFIG_ARIADNE=y -CONFIG_NE2K_ZORRO=y +CONFIG_ZORRO8390=y CONFIG_A2065=y CONFIG_HYDRA=y # CONFIG_SUNLANCE is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/bseip_defconfig linux-2.4.23-pre8/arch/ppc/configs/bseip_defconfig --- linux-2.4.22/arch/ppc/configs/bseip_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/bseip_defconfig 2003-10-22 22:48:10.000000000 +0000 @@ -469,6 +469,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +# CONFIG_8xx_CPU6 is not set +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y @@ -477,17 +488,13 @@ # CONFIG_SCC3_ENET is not set # CONFIG_FEC_ENET is not set # CONFIG_ENET_BIG_BUFFERS is not set +CONFIG_8xx_SMC1=y CONFIG_SMC2_UART=y # CONFIG_ALTSMC2 is not set # CONFIG_CONS_SMC2 is not set -# CONFIG_USE_SCC_IO is not set - -# -# Generic MPC8xx Options -# -CONFIG_8xx_COPYBACK=y -# CONFIG_8xx_CPU6 is not set -# CONFIG_UCODE_PATCH is not set +# CONFIG_8xx_SCC1 is not set +# CONFIG_8xx_SCC3 is not set +# CONFIG_8xx_SCC4 is not set # # USB support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/ebony_defconfig linux-2.4.23-pre8/arch/ppc/configs/ebony_defconfig --- linux-2.4.22/arch/ppc/configs/ebony_defconfig 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/ebony_defconfig 2003-10-22 22:47:39.000000000 +0000 @@ -0,0 +1,491 @@ +# +# Automatically generated by make menuconfig: don't edit +# +# CONFIG_UID16 is not set +# CONFIG_RWSEM_GENERIC_SPINLOCK is not set +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_HAVE_DEC_LOCK=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +CONFIG_KMOD=y + +# +# Platform support +# +CONFIG_PPC=y +CONFIG_PPC32=y +# CONFIG_6xx is not set +# CONFIG_40x is not set +CONFIG_44x=y +# CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set +# CONFIG_8xx is not set +CONFIG_4xx=y +CONFIG_EBONY=y +# CONFIG_OCOTEA is not set +# CONFIG_SMP is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_PPC4xx_DMA is not set +CONFIG_NOT_COHERENT_CACHE=y +CONFIG_440GP=y +CONFIG_IBM_OCP=y +CONFIG_GEN550=y +CONFIG_440=y +CONFIG_PTE_64BIT=y +CONFIG_PIN_TLB=y +CONFIG_BOOKE=y + +# +# General setup +# +CONFIG_HIGHMEM=y +# CONFIG_ISA is not set +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_PCI=y +# CONFIG_PC_KEYBOARD is not set +CONFIG_NET=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_KCORE_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_KERNEL_ELF=y +# CONFIG_BINFMT_MISC is not set +CONFIG_PCI_NAMES=y +# CONFIG_HOTPLUG is not set +# CONFIG_PCMCIA is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set +CONFIG_GEN_RTC=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="ip=on" + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP 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_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_BLK_STATS=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD 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_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK_DEV is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_FILTER=y +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# 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_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set + +# +# IP: Netfilter Configuration +# +# CONFIG_IP_NF_CONNTRACK is not set +# CONFIG_IP_NF_QUEUE is not set +# CONFIG_IP_NF_IPTABLES is not set +# CONFIG_IP_NF_ARPTABLES is not set +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set + +# +# Appletalk devices +# +# CONFIG_DEV_APPLETALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC 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 + +# +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# 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 is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set + +# +# On-chip net devices +# +CONFIG_IBM_OCP_ENET=y +# CONFIG_IBM_OCP_ENET_ERROR_MSG is not set +CONFIG_IBM_OCP_ENET_RX_BUFF=64 +CONFIG_IBM_OCP_ENET_TX_BUFF=8 +CONFIG_IBM_OCP_ENET_GAP=8 +CONFIG_IBM_OCP_ENET_SKB_RES=0 +CONFIG_OCP_NET=y +CONFIG_IBM_OCP_MAL_CNT=1 +CONFIG_IBM_OCP_ZMII=y +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# 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 + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# +# Console drivers +# +# CONFIG_VGA_CONSOLE is not set + +# +# Frame-buffer support +# +# CONFIG_FB is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Macintosh device drivers +# + +# +# Character devices +# +# CONFIG_VT is not set +CONFIG_SERIAL=y +CONFIG_SERIAL_CONSOLE=y +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set +# CONFIG_QIC02_TAPE is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_IPMI_PANIC_EVENT is not set +# CONFIG_IPMI_DEVICE_INTERFACE is not set +# CONFIG_IPMI_KCS is not set +# CONFIG_IPMI_WATCHDOG is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_SCx200_GPIO is not set +# CONFIG_AMD_PM768 is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_IBM_GPIO is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO 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_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG 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_JFFS2_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_JFS_FS is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +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=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_EXT2_FS is not set +# CONFIG_SYSV_FS 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 + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_DIRECTIO is not set +CONFIG_ROOT_NFS=y +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +# CONFIG_NFSD_TCP is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +# CONFIG_NLS is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +CONFIG_CRC32=y +# CONFIG_ZLIB_INFLATE is not set +# CONFIG_ZLIB_DEFLATE is not set + +# +# Kernel hacking +# +# CONFIG_DEBUG_KERNEL is not set +# CONFIG_SERIAL_TEXT_DEBUG is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/mbx_defconfig linux-2.4.23-pre8/arch/ppc/configs/mbx_defconfig --- linux-2.4.22/arch/ppc/configs/mbx_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/mbx_defconfig 2003-10-22 22:47:28.000000000 +0000 @@ -465,6 +465,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +CONFIG_8xx_CPU6=y +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y @@ -473,17 +484,13 @@ # CONFIG_SCC3_ENET is not set # CONFIG_FEC_ENET is not set CONFIG_ENET_BIG_BUFFERS=y +CONFIG_8xx_SMC1=y CONFIG_SMC2_UART=y # CONFIG_ALTSMC2 is not set # CONFIG_CONS_SMC2 is not set -CONFIG_USE_SCC_IO=y - -# -# Generic MPC8xx Options -# -CONFIG_8xx_COPYBACK=y -CONFIG_8xx_CPU6=y -# CONFIG_UCODE_PATCH is not set +# CONFIG_8xx_SCC2 is not set +# CONFIG_8xx_SCC3 is not set +# CONFIG_8xx_SCC4 is not set # # USB support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/ocotea_defconfig linux-2.4.23-pre8/arch/ppc/configs/ocotea_defconfig --- linux-2.4.22/arch/ppc/configs/ocotea_defconfig 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/ocotea_defconfig 2003-10-22 22:49:15.000000000 +0000 @@ -0,0 +1,490 @@ +# +# Automatically generated by make menuconfig: don't edit +# +# CONFIG_UID16 is not set +# CONFIG_RWSEM_GENERIC_SPINLOCK is not set +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_HAVE_DEC_LOCK=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +CONFIG_KMOD=y + +# +# Platform support +# +CONFIG_PPC=y +CONFIG_PPC32=y +# CONFIG_6xx is not set +# CONFIG_40x is not set +CONFIG_44x=y +# CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set +# CONFIG_8xx is not set +CONFIG_4xx=y +# CONFIG_EBONY is not set +CONFIG_OCOTEA=y +# CONFIG_SMP is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_PPC4xx_DMA is not set +CONFIG_NOT_COHERENT_CACHE=y +CONFIG_440GX=y +CONFIG_IBM_OCP=y +CONFIG_GEN550=y +CONFIG_IBM_EMAC4=y +CONFIG_440A=y +CONFIG_PTE_64BIT=y +CONFIG_PIN_TLB=y +CONFIG_BOOKE=y + +# +# General setup +# +CONFIG_HIGHMEM=y +# CONFIG_ISA is not set +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_PCI=y +# CONFIG_PC_KEYBOARD is not set +CONFIG_NET=y +CONFIG_SYSCTL=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_KCORE_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_KERNEL_ELF=y +# CONFIG_BINFMT_MISC is not set +CONFIG_PCI_NAMES=y +# CONFIG_HOTPLUG is not set +# CONFIG_PCMCIA is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set +CONFIG_GEN_RTC=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="ip=on console=ttyS0,115200" + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP 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_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_BLK_STATS=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD 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_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK_DEV is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_FILTER=y +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# 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_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set + +# +# IP: Netfilter Configuration +# +# CONFIG_IP_NF_CONNTRACK is not set +# CONFIG_IP_NF_QUEUE is not set +# CONFIG_IP_NF_IPTABLES is not set +# CONFIG_IP_NF_ARPTABLES is not set +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set + +# +# Appletalk devices +# +# CONFIG_DEV_APPLETALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC 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 + +# +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# IEEE 1394 (FireWire) support (EXPERIMENTAL) +# +# CONFIG_IEEE1394 is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# 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 is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_R8169 is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set + +# +# On-chip net devices +# +CONFIG_IBM_OCP_ENET=y +# CONFIG_IBM_OCP_ENET_ERROR_MSG is not set +CONFIG_IBM_OCP_ENET_RX_BUFF=64 +CONFIG_IBM_OCP_ENET_TX_BUFF=8 +CONFIG_IBM_OCP_ENET_GAP=8 +CONFIG_IBM_OCP_ENET_SKB_RES=0 +CONFIG_OCP_NET=y +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# 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 + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# +# Console drivers +# +# CONFIG_VGA_CONSOLE is not set + +# +# Frame-buffer support +# +# CONFIG_FB is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Macintosh device drivers +# + +# +# Character devices +# +# CONFIG_VT is not set +CONFIG_SERIAL=y +CONFIG_SERIAL_CONSOLE=y +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set +# CONFIG_QIC02_TAPE is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_IPMI_PANIC_EVENT is not set +# CONFIG_IPMI_DEVICE_INTERFACE is not set +# CONFIG_IPMI_KCS is not set +# CONFIG_IPMI_WATCHDOG is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_SCx200_GPIO is not set +# CONFIG_AMD_PM768 is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_IBM_GPIO is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO 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_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG 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_JFFS2_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_JFS_FS is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +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=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_EXT2_FS is not set +# CONFIG_SYSV_FS 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 + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_DIRECTIO is not set +CONFIG_ROOT_NFS=y +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +# CONFIG_NFSD_TCP is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +# CONFIG_NLS is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +CONFIG_CRC32=y +# CONFIG_ZLIB_INFLATE is not set +# CONFIG_ZLIB_DEFLATE is not set + +# +# Kernel hacking +# +# CONFIG_DEBUG_KERNEL is not set +# CONFIG_SERIAL_TEXT_DEBUG is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/rpxcllf_defconfig linux-2.4.23-pre8/arch/ppc/configs/rpxcllf_defconfig --- linux-2.4.22/arch/ppc/configs/rpxcllf_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/rpxcllf_defconfig 2003-10-22 22:49:19.000000000 +0000 @@ -504,6 +504,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +# CONFIG_8xx_CPU6 is not set +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y @@ -513,17 +524,13 @@ CONFIG_FEC_ENET=y # CONFIG_USE_MDIO is not set CONFIG_ENET_BIG_BUFFERS=y +CONFIG_8xx_SMC1=y CONFIG_SMC2_UART=y # CONFIG_ALTSMC2 is not set # CONFIG_CONS_SMC2 is not set -CONFIG_USE_SCC_IO=y - -# -# Generic MPC8xx Options -# -CONFIG_8xx_COPYBACK=y -# CONFIG_8xx_CPU6 is not set -# CONFIG_UCODE_PATCH is not set +# CONFIG_8xx_SCC2 is not set +# CONFIG_8xx_SCC3 is not set +# CONFIG_8xx_SCC4 is not set # # USB support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/configs/rpxlite_defconfig linux-2.4.23-pre8/arch/ppc/configs/rpxlite_defconfig --- linux-2.4.22/arch/ppc/configs/rpxlite_defconfig 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/configs/rpxlite_defconfig 2003-10-22 22:48:00.000000000 +0000 @@ -504,6 +504,17 @@ # CONFIG_SOUND is not set # +# MPC8xx Options +# + +# +# Generic MPC8xx Options +# +CONFIG_8xx_COPYBACK=y +# CONFIG_8xx_CPU6 is not set +# CONFIG_UCODE_PATCH is not set + +# # MPC8xx CPM Options # CONFIG_SCC_ENET=y @@ -512,15 +523,11 @@ # CONFIG_SCC3_ENET is not set # CONFIG_FEC_ENET is not set # CONFIG_ENET_BIG_BUFFERS is not set +CONFIG_8xx_SMC1=y # CONFIG_SMC2_UART is not set -# CONFIG_USE_SCC_IO is not set - -# -# Generic MPC8xx Options -# -CONFIG_8xx_COPYBACK=y -# CONFIG_8xx_CPU6 is not set -# CONFIG_UCODE_PATCH is not set +# CONFIG_8xx_SCC1 is not set +# CONFIG_8xx_SCC3 is not set +# CONFIG_8xx_SCC4 is not set # # USB support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/Makefile linux-2.4.23-pre8/arch/ppc/kernel/Makefile --- linux-2.4.22/arch/ppc/kernel/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/Makefile 2003-10-22 22:49:34.000000000 +0000 @@ -24,13 +24,15 @@ HEAD-y := head.o HEAD-$(CONFIG_6xx) += idle_6xx.o HEAD-$(CONFIG_40x) := head_4xx.o +HEAD-$(CONFIG_44x) := head_44x.o HEAD-$(CONFIG_8xx) := head_8xx.o all: $(HEAD-y) kernel.o O_TARGET := kernel.o -export-objs := ppc_ksyms.o time.o ocp.o ppc4xx_setup.o +export-objs := ppc_ksyms.o time.o ocp.o ppc4xx_setup.o \ + ppc4xx_dma.o ppc4xx_sgdma.o obj-y := entry.o traps.o irq.o idle.o time.o misc.o \ process.o signal.o ptrace.o align.o \ @@ -51,12 +53,16 @@ obj-$(CONFIG_KGDB) += gen550_kgdb.o gen550_dbg.o obj-$(CONFIG_SERIAL_TEXT_DEBUG) += gen550_dbg.o endif -obj-$(CONFIG_4xx) += todc_time.o -obj-$(CONFIG_40x) += ppc4xx_setup.o ocp.o -obj-$(CONFIG_40x) += ppc4xx_pic.o +obj-$(CONFIG_40x) += ppc4xx_setup.o +obj-$(CONFIG_4xx) += ocp.o ppc4xx_pic.o todc_time.o ifeq ($(CONFIG_PCI),y) -obj-$(CONFIG_40x) += ppc405_pci.o indirect_pci.o pci_auto.o +obj-$(CONFIG_40x) += ppc405_pci.o +obj-$(CONFIG_4xx) += indirect_pci.o pci_auto.o endif +obj-$(CONFIG_44x) += ibm44x_common.o +obj-$(CONFIG_440GP) += ibm440gp_common.o +obj-$(CONFIG_PPC4xx_DMA) += ppc4xx_dma.o +obj-$(CONFIG_PPC4xx_EDMA) += ppc4xx_sgdma.o obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o ifeq ($(CONFIG_8xx),y) obj-$(CONFIG_PCI) += qspan_pci.o @@ -84,6 +90,7 @@ l2cr.o: l2cr.S ppc_defs.h head.o: head.S ppc_defs.h head_4xx.o: head_4xx.S ppc_defs.h +head_44x.o: head_44x.S ppc_defs.h head_8xx.o: head_8xx.S ppc_defs.h idle_6xx.o: idle_6xx.S ppc_defs.h diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/cputable.c linux-2.4.23-pre8/arch/ppc/kernel/cputable.c --- linux-2.4.22/arch/ppc/kernel/cputable.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/cputable.c 2003-10-22 22:48:59.000000000 +0000 @@ -29,12 +29,12 @@ extern void __setup_cpu_745x(unsigned long offset, int cpu_nr, struct cpu_spec* spec); extern void __setup_cpu_power3(unsigned long offset, int cpu_nr, struct cpu_spec* spec); extern void __setup_cpu_power4(unsigned long offset, int cpu_nr, struct cpu_spec* spec); +extern void __setup_cpu_ppc970(unsigned long offset, int cpu_nr, struct cpu_spec* spec); extern void __setup_cpu_8xx(unsigned long offset, int cpu_nr, struct cpu_spec* spec); extern void __setup_cpu_generic(unsigned long offset, int cpu_nr, struct cpu_spec* spec); -#define CLASSIC_PPC (!defined(CONFIG_8xx) && \ - !defined(CONFIG_4xx) && !defined(CONFIG_POWER3) && \ - !defined(CONFIG_POWER4)) +#define CLASSIC_PPC (!defined(CONFIG_8xx) && !defined(CONFIG_4xx) && \ + !defined(CONFIG_POWER3) && !defined(CONFIG_POWER4)) /* This table only contains "desktop" CPUs, it need to be filled with embedded * ones as well... @@ -322,6 +322,14 @@ 128, 128, __setup_cpu_power4 }, + { /* PPC970 */ + 0xffff0000, 0x00390000, "PPC970", + CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | + CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP, + COMMON_PPC | PPC_FEATURE_64 | PPC_FEATURE_HAS_ALTIVEC, + 128, 128, + __setup_cpu_ppc970 + }, #endif /* CONFIG_POWER4 */ #ifdef CONFIG_8xx { /* 8xx */ @@ -370,6 +378,29 @@ 0, /*__setup_cpu_405 */ }, #endif /* CONFIG_4xx */ +#ifdef CONFIG_44x + { /* 440GP Rev. B */ + 0xf0000fff, 0x40000440, "440GP Rev. B", + CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB, + PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, + 32, 32, + 0, /*__setup_cpu_440 */ + }, + { /* 440GP Rev. C */ + 0xf0000fff, 0x40000481, "440GP Rev. C", + CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB, + PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, + 32, 32, + 0, /*__setup_cpu_440 */ + }, + { /* 440GX Rev. A */ + 0xf0000fff, 0x50000850, "440GX Rev. A", + CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB, + PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, + 32, 32, + 0, /*__setup_cpu_440 */ + }, +#endif /* CONFIG_44x */ #if !CLASSIC_PPC { /* default match */ 0x00000000, 0x00000000, "(generic PPC)", diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/entry.S linux-2.4.23-pre8/arch/ppc/kernel/entry.S --- linux-2.4.22/arch/ppc/kernel/entry.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/entry.S 2003-10-22 22:48:26.000000000 +0000 @@ -258,6 +258,15 @@ addi r1,r1,INT_FRAME_SIZE blr + .globl syscall_direct_return +syscall_direct_return: + addi r1,r3,-STACK_FRAME_OVERHEAD + lwz r10,TASK_PTRACE(r2) + andi. r10,r10,PT_TRACESYS + beq+ ret_from_except + bl syscall_trace + b ret_from_except + .globl ret_from_fork ret_from_fork: bl schedule_tail diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/head.S linux-2.4.23-pre8/arch/ppc/kernel/head.S --- linux-2.4.22/arch/ppc/kernel/head.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/head.S 2003-10-22 22:47:29.000000000 +0000 @@ -137,6 +137,18 @@ mr r28,r6 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 + /* * early_init() does the early machine identification and does * the necessary low-level setup and clears the BSS @@ -157,11 +169,10 @@ */ bl mmu_off __after_mmu_off: - bl clear_bats - bl flush_tlbs #ifndef CONFIG_POWER4 - /* POWER4 doesn't have BATs */ + bl clear_bats + bl flush_tlbs bl initial_bats #if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) bl setup_disp_bat @@ -170,15 +181,23 @@ /* * Load up the SDR1 and segment register values now * since we don't have the BATs. + * Also make sure we are running in 32-bit mode. */ bl reloc_offset - addis r4,r3,_SDR1@ha /* get the value from _SDR1 */ - lwz r4,_SDR1@l(r4) /* assume hash table below 4GB */ - mtspr SDR1,r4 + addis r14,r3,_SDR1@ha /* get the value from _SDR1 */ + lwz r14,_SDR1@l(r14) /* assume hash table below 4GB */ + mtspr SDR1,r14 slbia - lis r5,0x2000 /* set pseudo-segment reg 12 */ - ori r5,r5,0x0ccc + lis r4,0x2000 /* set pseudo-segment reg 12 */ + ori r5,r4,0x0ccc mtsr 12,r5 + ori r4,r4,0x0888 /* set pseudo-segment reg 8 */ + mtsr 8,r4 /* (for access to serial port) */ + mfmsr r0 + clrldi r0,r0,1 + sync + mtmsr r0 + isync #endif /* CONFIG_POWER4 */ /* @@ -707,12 +726,22 @@ mtcrf 0x80,r3 rfi +#ifndef CONFIG_ALTIVEC +#define AltivecAssistException UnknownException +#endif + STD_EXCEPTION(0x1300, Trap_13, InstructionBreakpoint) STD_EXCEPTION(0x1400, SMI, SMIException) STD_EXCEPTION(0x1500, Trap_15, UnknownException) +#ifdef CONFIG_POWER4 STD_EXCEPTION(0x1600, Trap_16, UnknownException) + STD_EXCEPTION(0x1700, Trap_17, AltivecAssistException) + STD_EXCEPTION(0x1800, Trap_18, TAUException) +#else /* !CONFIG_POWER4 */ + STD_EXCEPTION(0x1600, Trap_16, AltivecAssistException) STD_EXCEPTION(0x1700, Trap_17, TAUException) STD_EXCEPTION(0x1800, Trap_18, UnknownException) +#endif STD_EXCEPTION(0x1900, Trap_19, UnknownException) STD_EXCEPTION(0x1a00, Trap_1a, UnknownException) STD_EXCEPTION(0x1b00, Trap_1b, UnknownException) @@ -828,6 +857,7 @@ bt- 9,power_save_6xx_restore /* Check NAP */ END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) b transfer_to_handler_cont + #endif /* CONFIG_6xx */ /* @@ -983,7 +1013,9 @@ /* enable use of AltiVec after return */ oris r23,r23,MSR_VEC@h mfspr r5,SPRG3 /* current task's THREAD (phys) */ + li r4,1 li r20,THREAD_VSCR + stw r4,THREAD_USED_VR(r5) LVX(vr0,r20,r5) MTVSCR(vr0) REST_32VR(0,r20,r5) @@ -1233,7 +1265,6 @@ andc r4,r4,r3 mtspr HID0,r4 sync - bl prom_init b __secondary_start #endif /* CONFIG_GEMINI */ .globl __secondary_start_psurge @@ -1305,6 +1336,7 @@ /* enable MMU and jump to start_secondary */ li r4,MSR_KERNEL + FIX_SRR1(r4,r5) lis r3,start_secondary@h ori r3,r3,start_secondary@l mtspr SRR0,r3 @@ -1319,6 +1351,10 @@ */ _GLOBAL(__setup_cpu_power3) blr +_GLOBAL(__setup_cpu_power4) + blr +_GLOBAL(__setup_cpu_ppc970) + blr _GLOBAL(__setup_cpu_generic) blr @@ -1326,7 +1362,14 @@ _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 blr +#endif #endif /* CONFIG_6xx */ /* @@ -1334,6 +1377,11 @@ * IR=0 and DR=0. */ load_up_mmu: + sync /* Force all PTE updates to finish */ + isync + tlbia /* Clear all TLB entries */ + sync /* wait for tlbia/tlbie to finish */ + TLBSYNC /* ... on all CPUs */ /* Load the SDR1 register (hash table base & size) */ lis r6,_SDR1@ha tophys(r6,r6) @@ -1428,14 +1476,7 @@ SYNC RFI /* Load up the kernel context */ -2: - sync /* Force all PTE updates to finish */ - isync - tlbia /* Clear all TLB entries */ - sync /* wait for tlbia/tlbie to finish */ - TLBSYNC /* ... on all CPUs */ - - bl load_up_mmu +2: bl load_up_mmu #ifdef CONFIG_BDI_SWITCH /* Add helper information for the Abatron bdiGDB debugger. @@ -1648,6 +1689,40 @@ blr #endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */ + +#else /* CONFIG_POWER4 */ +ppc970_setup_hid: + li r0,0 + sync + mtspr 0x3f4,r0 + isync + sync + mtspr 0x3f6,r0 + isync + mfspr r0,SPRN_HID0 + li r11,5 /* clear DOZE and SLEEP */ + rldimi r0,r11,52,8 /* and 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 + 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/head_44x.S linux-2.4.23-pre8/arch/ppc/kernel/head_44x.S --- linux-2.4.22/arch/ppc/kernel/head_44x.S 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/head_44x.S 2003-10-22 22:47:29.000000000 +0000 @@ -0,0 +1,1070 @@ +/* + * arch/ppc/kernel/head_44x.S + * + * Kernel execution entry point code. + * + * Matt Porter + * + * Copyright 2002-2003 MontaVista Software, Inc. + * + * 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 "ppc_defs.h" + +/* + * Preprocessor Defines + */ + +#define STND_EXC 0 +#define CRIT_EXC 1 + +/* + * Macros + */ + +#define SET_IVOR(vector_number, vector_label) \ + li r26,vector_label@l; \ + mtspr SPRN_IVOR##vector_number,r26; \ + sync + +/* As with the other PowerPC ports, it is expected that when code + * execution begins here, the following registers contain valid, yet + * optional, information: + * + * r3 - Board info structure pointer (DRAM, frequency, MAC address, etc.) + * r4 - Starting address of the init RAM disk + * r5 - Ending address of the init RAM disk + * r6 - Start of kernel command line string (e.g. "mem=128") + * r7 - End of kernel command line string + * + */ + .text +_GLOBAL(_stext) +_GLOBAL(_start) + /* + * Reserve a word at a fixed location to store the address + * of abatron_pteptrs + */ + nop + +/* + * Save parameters we are passed + */ + mr r31,r3 + mr r30,r4 + mr r29,r5 + mr r28,r6 + mr r27,r7 + li r24,0 /* CPU number */ + +/* + * Set up the initial MMU state + * + * We are still executing code at the virtual address + * mappings set by the firmware for the base of RAM. + * + * We first invalidate all TLB entries but the one + * we are running from. We then load the KERNELBASE + * mappings so we can begin to use kernel addresses + * natively and so the interrupt vector locations are + * permanently pinned (necessary since Book E + * implementations always have translation enabled). + * + * TODO: Use the known TLB entry we are running from to + * determine which physical region we are located + * in. This can be used to determine where in RAM + * (on a shared CPU system) or PCI memory space + * (on a DRAMless system) we are located. + * For now, we assume a perfect world which means + * we are located at the base of DRAM (physical 0). + */ + +/* + * Search TLB for entry that we are currently using. + * 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? */ + beq wmmucr /* If not, leave STS=0 */ + oris r3,r3,PPC44x_MMUCR_STS@h /* Set STS=1 */ +wmmucr: mtspr SPRN_MMUCR,r3 /* Put MMUCR */ + sync + + bl invstr /* Find our address */ +invstr: mflr r5 /* Make it accessible */ + tlbsx r23,0,r5 /* Find entry we are in */ + li r4,0 /* Start at TLB entry 0 */ + li r3,0 /* Set PAGEID inval value */ +1: cmpw r23,r4 /* Is this our entry? */ + beq skpinv /* If so, skip the inval */ + tlbwe r3,r4,PPC44x_TLB_PAGEID /* If not, inval the entry */ +skpinv: addi r4,r4,1 /* Increment */ + cmpwi r4,64 /* Are we done? */ + bne 1b /* If not, repeat */ + isync /* If so, context change */ + +/* + * Configure and load pinned entries into TLB slots 62 and 63. + */ + + lis r3,KERNELBASE@h /* Load the kernel virtual address */ + ori r3,r3,KERNELBASE@l + + /* Kernel is at the base of RAM */ + li r4, 0 /* Load the kernel physical address */ + + /* Load the kernel PID = 0 */ + li r0,0 + 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 + 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)) + + /* xlat fields */ + clrrwi r4,r4,10 /* Mask off the real page number */ + /* ERPN is 0 for first 4GB page */ + + /* attrib fields */ + /* Added guarded bit to protect against speculative loads/stores */ + li r5,0 + ori r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G) + + li r0,62 /* TLB slot 62 */ + + 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 */ + + /* Force context change */ + mfmsr r0 + mtspr SRR1, r0 + lis r0,3f@h + ori r0,r0,3f@l + mtspr SRR0,r0 + sync + rfi + + /* If necessary, invalidate original entry we used */ +3: cmpwi r23,62 + beq 4f + li r6,0 + 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 */ + +#ifdef CONFIG_SERIAL_TEXT_DEBUG + /* + * Add temporary UART mapping for early debug. This + * mapping must be identical to that used by the early + * bootloader code since the same asm/serial.h parameters + * are used for polled operation. + */ + /* pageid fields */ + lis r3,0xe000 + ori r3,r3,(PPC44x_TLB_VALID | PPC44x_TLB_PAGESZ(PPC44x_PAGESZ_256M)) + + /* xlat fields */ + lis r4,0x4000 /* RPN is 0x40000000 */ + ori r4,r4,0x0001 /* ERPN is 1 for second 4GB page */ + + /* attrib fields */ + li r5,0 + ori r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_I | PPC44x_TLB_G) + + li r0,60 /* TLB slot 60 */ + + 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 */ + + ori r3,r3,PPC44x_TLB_TS /* Translation state 1 */ + + li r0,61 /* TLB slot 61 */ + + 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 + + /* Establish the interrupt vector offsets */ + SET_IVOR(0, CriticalInput); + SET_IVOR(1, MachineCheck); + SET_IVOR(2, DataStorage); + SET_IVOR(3, InstructionStorage); + SET_IVOR(4, ExternalInput); + SET_IVOR(5, Alignment); + SET_IVOR(6, Program); + SET_IVOR(7, FloatingPointUnavailable); + SET_IVOR(8, SystemCall); + SET_IVOR(9, AuxillaryProcessorUnavailable); + SET_IVOR(10, Decrementer); + SET_IVOR(11, FixedIntervalTimer); + SET_IVOR(12, WatchdogTimer); + SET_IVOR(13, DataTLBError); + SET_IVOR(14, InstructionTLBError); + SET_IVOR(15, Debug); + + /* Establish the interrupt vector base */ + lis r4,interrupt_base@h /* IVPR only uses the high 16-bits */ + mtspr SPRN_IVPR,r4 + + /* + * This is where the main kernel code starts. + */ + + /* ptr to current */ + lis r2,init_task_union@h + ori r2,r2,init_task_union@l + + /* ptr to current thread */ + addi r4,r2,THREAD /* init task's THREAD */ + mtspr SPRG3,r4 + li r3,0 + mtspr SPRG2,r3 /* 0 => r1 has kernel sp */ + + /* stack */ + addi r1,r2,TASK_UNION_SIZE + li r0,0 + stwu r0,-STACK_FRAME_OVERHEAD(r1) + + bl early_init + +/* + * Decide what sort of machine this is and initialize the MMU. + */ + mr r3,r31 + mr r4,r30 + mr r5,r29 + mr r6,r28 + mr r7,r27 + bl machine_init + bl MMU_init + + /* Setup PTE pointers for the Abatron bdiGDB */ + lis r6, swapper_pg_dir@h + ori r6, r6, swapper_pg_dir@l + lis r5, abatron_pteptrs@h + ori r5, r5, abatron_pteptrs@l + lis r4, KERNELBASE@h + ori r4, r4, KERNELBASE@l + stw r5, 0(r4) /* Save abatron_pteptrs at a fixed location */ + stw r6, 0(r5) + + /* Let's move on */ + lis r4,start_kernel@h + ori r4,r4,start_kernel@l + lis r3,MSR_KERNEL@h + ori r3,r3,MSR_KERNEL@l + mtspr SRR0,r4 + mtspr SRR1,r3 + rfi /* change context and jump to start_kernel */ + +/* + * Interrupt vector entry code + * + * The Book E MMUs are always on so we don't need to handle + * interrupts in real mode as with previous PPC processors. In + * this case we handle interrupts in the kernel virtual address + * space. + * + * Interrupt vectors are dynamically placed relative to the + * interrupt prefix as determined by the address of interrupt_base. + * The interrupt vectors offsets are programmed using the labels + * for each interrupt vector entry. + * + * Interrupt vectors must be aligned on a 16 byte boundary. + * We align on a 32 byte cache line boundary for good measure. + */ + +#define COMMON_PROLOG \ +0: mtspr SPRN_SPRG0,r20; /* We need r20, move it to SPRG0 */\ + mtspr SPRN_SPRG1,r21; /* We need r21, move it to SPRG1 */\ + mfcr r20; /* We need the CR, move it to r20 */\ + mfspr r21,SPRN_SPRG2; /* Exception stack to use */\ + cmpwi cr0,r21,0; /* From user mode or RTAS? */\ + bne 1f; /* Not RTAS, branch */\ + mr r21, r1; /* Move vka in r1 to r21 */\ + subi r21,r21,INT_FRAME_SIZE; /* Allocate an exception frame */\ +1: stw r20,_CCR(r21); /* Save CR on the stack */\ + stw r22,GPR22(r21); /* Save r22 on the stack */\ + stw r23,GPR23(r21); /* r23 Save on the stack */\ + mfspr r20,SPRN_SPRG0; /* Get r20 back out of SPRG0 */\ + stw r20,GPR20(r21); /* Save r20 on the stack */\ + mfspr r22,SPRN_SPRG1; /* Get r21 back out of SPRG0 */\ + stw r22,GPR21(r21); /* Save r21 on the stack */\ + mflr r20; \ + stw r20,_LINK(r21); /* Save LR on the stack */\ + mfctr r22; \ + stw r22,_CTR(r21); /* Save CTR on the stack */\ + mfspr r20,XER; \ + stw r20,_XER(r21); /* Save XER on the stack */ + +#define COMMON_EPILOG \ + stw r0,GPR0(r21); /* Save r0 on the stack */\ + stw r1,GPR1(r21); /* Save r1 on the stack */\ + stw r2,GPR2(r21); /* Save r2 on the stack */\ + stw r1,0(r21); \ + mr r1,r21; /* Set-up new kernel stack pointer */\ + SAVE_4GPRS(3, r21); /* Save r3 through r6 on the stack */\ + SAVE_GPR(7, r21); /* Save r7 on the stack */ + +#define STND_EXCEPTION_PROLOG \ + COMMON_PROLOG; \ + mfspr r22,SPRN_SRR0; /* Faulting instruction address */\ + lis r20,MSR_WE@h; \ + mfspr r23,SPRN_SRR1; /* MSR at the time of fault */\ + andc r23,r23,r20; /* disable processor wait state */\ + COMMON_EPILOG; + +#define CRIT_EXCEPTION_PROLOG \ + COMMON_PROLOG; \ + mfspr r22,SPRN_CSRR0; /* Faulting instruction address */\ + lis r20,MSR_WE@h; \ + mfspr r23,SPRN_CSRR1; /* MSR at the time of fault */\ + andc r23,r23,r20; /* disable processor wait state */\ + COMMON_EPILOG; + +#define START_EXCEPTION(label) \ + .align 5; \ +label: + +#define FINISH_EXCEPTION(n, func) \ + bl transfer_to_handler; \ + .long func; \ + .long ret_from_except; \ + .long n + +#define STND_EXCEPTION(n, label, func) \ + START_EXCEPTION(label) \ + STND_EXCEPTION_PROLOG; \ + addi r3,r1,STACK_FRAME_OVERHEAD; \ + li r7,STND_EXC; \ + li r20,MSR_KERNEL; \ + FINISH_EXCEPTION(n, func) + +#define CRIT_EXCEPTION(n, label, func) \ + START_EXCEPTION(label) \ + CRIT_EXCEPTION_PROLOG; \ + addi r3,r1,STACK_FRAME_OVERHEAD; \ + li r7,CRIT_EXC; \ + li r20,MSR_KERNEL; \ + FINISH_EXCEPTION(n, func) + +interrupt_base: + + /* Critical Input Interrupt */ + CRIT_EXCEPTION(0x100, CriticalInput,UnknownException); + + /* Machine Check Interrupt */ + /* TODO: provide bus error register status */ + CRIT_EXCEPTION(0x200, MachineCheck,MachineCheckException); + + /* Data Storage Interrupt */ + START_EXCEPTION(DataStorage) + mtspr SPRG0, r20 /* Save some working registers */ + mtspr SPRG1, r21 + mtspr SPRG4W, r22 + mtspr SPRG5W, r23 + mtspr SPRG6W, r24 + mfcr r21 + mtspr SPRG7W, r21 + + /* + * Check if it was a store fault, if not then bail + * because a user tried to access a kernel or + * read-protected page. Otherwise, get the + * offending address and handle it. + */ + mfspr r20, SPRN_ESR + andis. r20, r20, ESR_ST@h + beq 2f + + mfspr r20, SPRN_DEAR /* Get faulting address */ + + /* If we are faulting a kernel address, we have to use the + * kernel page tables. + */ + andis. r21, r20, 0x8000 + beq 3f + lis r21, swapper_pg_dir@h + ori r21, r21, swapper_pg_dir@l + + mfspr r22,SPRN_MMUCR /* Set TID to 0 */ + li r23,PPC44x_MMUCR_TID@l + andc r22,r22,r23 + mtspr SPRN_MMUCR,r22 + + b 4f + + /* Get the PGD for the current thread */ +3: + mfspr r21,SPRG3 + lwz r21,PGDIR(r21) + + /* Load MMUCR with our PID and STS= */ + mfspr r22,SPRN_MMUCR /* Get MMUCR */ + lis r23,PPC44x_MMUCR_STS@h + ori r23,r23,PPC44x_MMUCR_TID@l /* Create mask */ + andc r22,r22,r23 /* Clear out TID/STS bits */ + mfspr r23,SPRN_PID /* Get PID */ + or r22,r22,r23 /* Set TID bits */ + mfspr r24,SPRN_SRR1 /* Get SRR1 */ + andi. r24,r24,MSR_IS@l /* TS=1? */ + beq 4f /* If not, leave STS=0 */ + oris r22,r22,PPC44x_MMUCR_STS@h /* Set STS=1 */ + mtspr SPRN_MMUCR,r22 +4: + rlwinm r22, r20, 13, 19, 29 /* Compute pgdir/pmd offset */ + lwzx r21, r22, r21 /* Get pgd/pmd entry */ + rlwinm. r22, r21, 0, 0, 20 /* Extract pt base address */ + beq 2f /* Bail if no table */ + + rlwimi r22, r20, 23, 20, 28 /* Compute pte address */ + lwz r21, 4(r22) /* Get pte entry */ + + andi. r23, r21, _PAGE_RW /* Is it writeable? */ + beq 2f /* Bail if not */ + + /* Update 'changed'. + */ + ori r21, r21, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE + stw r21, 4(r22) /* Update Linux page table */ + + /* FIXME: Staticly setting some permissions */ + li r23, 0x003f /* Set UX,UW,UR,SX,SW,SR */ + andi. r21,r21,0xffff /* Clear MS 16 bits */ + /* FIXME: Force attributes */ + ori r21,r21, 0x0100 /* Set G */ + /* FIXME: Already set in PTE */ + rlwimi r21,r23,0,26,31 /* Insert static perms */ + + lis r23,0xffff + ori r23,r23,0x0fff /* Set U0-U3 mask */ + and r21,r21,r23 /* Clear U0-U3 */ + + /* find the TLB index that caused the fault. It has to be here. */ + tlbsx r24, 0, r20 + + tlbwe r21, r24, PPC44x_TLB_ATTRIB /* Write ATTRIB */ + + /* Done...restore registers and get out of here. + */ + mfspr r21, SPRG7R + mtcr r21 + mfspr r24, SPRG6R + mfspr r23, SPRG5R + mfspr r22, SPRG4R + + mfspr r21, SPRG1 + mfspr r20, SPRG0 + rfi /* Force context change */ + +2: + /* + * The bailout. Restore registers to pre-exception conditions + * and call the heavyweights to help us out. + */ + mfspr r21, SPRG7R + mtcr r21 + mfspr r24, SPRG6R + mfspr r23, SPRG5R + mfspr r22, SPRG4R + + mfspr r21, SPRG1 + mfspr r20, SPRG0 + b data_access + + /* Instruction Storage Interrupt */ + START_EXCEPTION(InstructionStorage) + STND_EXCEPTION_PROLOG + mfspr r5,SPRN_ESR /* Grab the ESR, save it */ + stw r5,_ESR(r21) + mr r4,r22 /* Pass SRR0 as arg2 */ + li r5,0 /* Pass zero as arg3 */ + addi r3,r1,STACK_FRAME_OVERHEAD + li r7,STND_EXC + li r20,MSR_KERNEL + rlwimi r20,r23,0,16,16 /* Copy EE bit from the saved MSR */ + FINISH_EXCEPTION(0x400, do_page_fault)/* do_page_fault(regs, SRR0, SRR1) */ + + /* External Input Interrupt */ + START_EXCEPTION(ExternalInput) + STND_EXCEPTION_PROLOG + addi r3,r1,STACK_FRAME_OVERHEAD + li r7,STND_EXC + li r20,MSR_KERNEL + li r4,0 + bl transfer_to_handler +_GLOBAL(do_IRQ_intercept) + .long do_IRQ + .long ret_from_intercept + .long 0x500 + + /* Alignment Interrupt */ + START_EXCEPTION(Alignment) + STND_EXCEPTION_PROLOG + mfspr r4,SPRN_DEAR /* Grab the DEAR and save it */ + stw r4,_DEAR(r21) + addi r3,r1,STACK_FRAME_OVERHEAD + li r7,STND_EXC + li r20,MSR_KERNEL + rlwimi r20,r23,0,16,16 /* Copy EE bit from the saved MSR */ + FINISH_EXCEPTION(0x600, AlignmentException) + + /* Program Interrupt */ + START_EXCEPTION(Program) + STND_EXCEPTION_PROLOG + mfspr r4,SPRN_ESR /* Grab the ESR, save it */ + stw r4,_ESR(r21) + addi r3,r1,STACK_FRAME_OVERHEAD + li r7,STND_EXC + li r20,MSR_KERNEL + rlwimi r20,r23,0,16,16 /* Copy EE bit from the saved MSR */ + FINISH_EXCEPTION(0x700, ProgramCheckException) + + /* Floating Point Unavailable Interrupt */ + STND_EXCEPTION(0x2010, FloatingPointUnavailable,UnknownException); + + /* System Call Interrupt */ + START_EXCEPTION(SystemCall) + STND_EXCEPTION_PROLOG + stw r3,ORIG_GPR3(r21) + li r7,STND_EXC + li r20,MSR_KERNEL + rlwimi r20,r23,0,16,16 /* Copy EE bit from the saved MSR */ + FINISH_EXCEPTION(0xc00, DoSyscall) + + /* Auxillary Processor Unavailable */ + STND_EXCEPTION(0x2020, AuxillaryProcessorUnavailable,UnknownException); + + /* Decrementer Interrupt */ + START_EXCEPTION(Decrementer) + STND_EXCEPTION_PROLOG + lis r0,TSR_DIS@h /* Setup the DEC interrupt mask */ + mtspr SPRN_TSR,r0 /* Clear the DEC interrupt */ + addi r3,r1,STACK_FRAME_OVERHEAD + li r7,STND_EXC + li r20,MSR_KERNEL + bl transfer_to_handler +_GLOBAL(timer_interrupt_intercept) + .long timer_interrupt + .long ret_from_intercept + .long 0x1000 + + /* Fixed Internal Timer Interrupt */ + /* TODO: Add FIT support */ + STND_EXCEPTION(0x1010, FixedIntervalTimer,UnknownException); + + /* Watchdog Timer Interrupt */ + /* TODO: Add watchdog support */ + CRIT_EXCEPTION(0x1020, WatchdogTimer,UnknownException); + + /* Data TLB Error Interrupt */ + START_EXCEPTION(DataTLBError) + mtspr SPRG0, r20 /* Save some working registers */ + mtspr SPRG1, r21 + mtspr SPRG4W, r22 + mtspr SPRG5W, r23 + mtspr SPRG6W, r24 + mfcr r21 + mtspr SPRG7W, r21 + mfspr r20, SPRN_DEAR /* Get faulting address */ + + /* If we are faulting a kernel address, we have to use the + * kernel page tables. + */ + andis. r21, r20, 0x8000 + beq 3f + lis r21, swapper_pg_dir@h + ori r21, r21, swapper_pg_dir@l + + mfspr r22,SPRN_MMUCR /* Set TID to 0 */ + li r23,PPC44x_MMUCR_TID@l + andc r22,r22,r23 + mtspr SPRN_MMUCR,r22 + + b 4f + + /* Get the PGD for the current thread */ +3: + mfspr r21,SPRG3 + lwz r21,PGDIR(r21) + + /* Load PID into MMUCR TID */ + li r23,PPC44x_MMUCR_TID@l /* Create mask */ + andc r22,r22,r23 /* Clear out TID/STS bits */ + mfspr r23,SPRN_PID /* Get PID */ + or r22,r22,r23 + mtspr SPRN_MMUCR,r22 +4: + rlwinm r22, r20, 13, 19, 29 /* Compute pgdir/pmd offset */ + lwzx r21, r22, r21 /* Get pgd/pmd entry */ + rlwinm. r22, r21, 0, 0, 20 /* Extract pt base address */ + beq 2f /* Bail if no table */ + + rlwimi r22, r20, 23, 20, 28 /* Compute pte address */ + lwz r21, 4(r22) /* Get pte entry */ + andi. r23, r21, _PAGE_PRESENT /* Is the page present? */ + beq 2f /* Bail if not present */ + + ori r21, r21, _PAGE_ACCESSED + stw r21, 4(r22) + + /* Jump to common tlb load */ + b finish_tlb_load + +2: + /* The bailout. Restore registers to pre-exception conditions + * and call the heavyweights to help us out. + */ + mfspr r21, SPRG7R + mtcr r21 + mfspr r24, SPRG6R + mfspr r23, SPRG5R + mfspr r22, SPRG4R + mfspr r21, SPRG1 + mfspr r20, SPRG0 + b data_access + + /* Instruction TLB Error Interrupt */ + /* + * Nearly the same as above, except we get our + * information from different registers and bailout + * to a different point. + */ + START_EXCEPTION(InstructionTLBError) + mtspr SPRG0, r20 /* Save some working registers */ + mtspr SPRG1, r21 + mtspr SPRG4W, r22 + mtspr SPRG5W, r23 + mtspr SPRG6W, r24 + mfcr r21 + mtspr SPRG7W, r21 + mfspr r20, SRR0 /* Get faulting address */ + + /* If we are faulting a kernel address, we have to use the + * kernel page tables. + */ + andis. r21, r20, 0x8000 + beq 3f + lis r21, swapper_pg_dir@h + ori r21, r21, swapper_pg_dir@l + + mfspr r22,SPRN_MMUCR /* Set TID to 0 */ + li r23,PPC44x_MMUCR_TID@l + andc r22,r22,r23 + mtspr SPRN_MMUCR,r22 + + b 4f + + /* Get the PGD for the current thread */ +3: + mfspr r21,SPRG3 + lwz r21,PGDIR(r21) + + /* Load PID into MMUCR TID */ + li r23,PPC44x_MMUCR_TID@l /* Create mask */ + andc r22,r23,r23 /* Clear out TID/STS bits */ + mfspr r23,SPRN_PID /* Get PID */ + or r22,r22,r23 + mtspr SPRN_MMUCR,r22 + +4: + rlwinm r22, r20, 13, 19, 29 /* Compute pgdir/pmd offset */ + lwzx r21, r22, r21 /* Get pgd/pmd entry */ + rlwinm. r22, r21, 0, 0, 20 /* Extract pt base address */ + beq 2f /* Bail if no table */ + + rlwimi r22, r20, 23, 20, 28 /* Compute pte address */ + lwz r21, 4(r22) /* Get pte entry */ + andi. r23, r21, _PAGE_PRESENT /* Is the page present? */ + beq 2f /* Bail if not present */ + + ori r21, r21, _PAGE_ACCESSED + stw r21, 4(r22) + + /* Jump to common TLB load point */ + b finish_tlb_load + +2: + /* The bailout. Restore registers to pre-exception conditions + * and call the heavyweights to help us out. + */ + mfspr r21, SPRG7R + mtcr r21 + mfspr r24, SPRG6R + mfspr r23, SPRG5R + mfspr r22, SPRG4R + mfspr r21, SPRG1 + mfspr r20, SPRG0 + b InstructionStorage + +/* Check for a single step debug exception while in an exception + * handler before state has been saved. This is to catch the case + * where an instruction that we are trying to single step causes + * an exception (eg ITLB/DTLB miss) and thus the first instruction of + * the exception handler generates a single step debug exception. + * + * If we get a debug trap on the first instruction of an exception handler, + * we reset the MSR_DE in the _exception handlers_ MSR (the debug trap is + * a critical exception, so we are using SPRN_CSRR1 to manipulate the MSR). + * The exception handler was handling a non-critical interrupt, so it will + * save (and later restore) the MSR via SPRN_SRR1, which will still have + * the MSR_DE bit set. + */ + /* Debug Interrupt */ + START_EXCEPTION(Debug) + /* This first instruction was already executed by the exception + * handler and must be the first instruction of every exception + * handler. + */ + mtspr SPRN_SPRG0,r20 /* Save some working registers... */ + mtspr SPRN_SPRG1,r21 + mtspr SPRN_SPRG4W,r22 + mfcr r20 /* ..and the cr because we change it */ + + mfspr r21,SPRN_CSRR1 /* MSR at the time of fault */ + andi. r21,r21,MSR_PR + bne+ 2f /* trapped from problem state */ + + mfspr r21,SPRN_CSRR0 /* Faulting instruction address */ + lis r22, KERNELBASE@h + ori r22, r22, KERNELBASE@l + cmplw r21,r22 + blt+ 2f /* addr below exception vectors */ + + lis r22, Debug@h + ori r22, r22, Debug@l + cmplw r21,r22 + bgt+ 2f /* addr above TLB exception vectors */ + + lis r21,DBSR_IC@h /* Remove the trap status */ + mtspr SPRN_DBSR,r21 + + mfspr r21,SPRN_CSRR1 + rlwinm r21,r21,0,23,21 /* clear MSR_DE */ + mtspr SPRN_CSRR1, r21 /* restore MSR at rcfi without DE */ + + mtcrf 0xff,r20 /* restore registers */ + mfspr r22,SPRN_SPRG4R + mfspr r21,SPRN_SPRG1 + mfspr r20,SPRN_SPRG0 + + sync + rfci /* return to the exception handler */ + b . /* prevent prefetch past rfci */ + +2: + mtcrf 0xff,r20 /* restore registers */ + mfspr r22,SPRN_SPRG4R + mfspr r21,SPRN_SPRG1 + mfspr r20,SPRN_SPRG0 + + CRIT_EXCEPTION_PROLOG + addi r3,r1,STACK_FRAME_OVERHEAD + li r7,CRIT_EXC; + li r20,MSR_KERNEL + FINISH_EXCEPTION(0x2000, DebugException) + +/* + * Local functions + */ + + /* + * Data TLB exceptions will bail out to this point + * if they can't resolve the lightweight TLB fault. + */ +data_access: + STND_EXCEPTION_PROLOG + mfspr r5,SPRN_ESR /* Grab the ESR, save it, pass arg3 */ + stw r5,_ESR(r21) + mfspr r4,SPRN_DEAR /* Grab the DEAR, save it, pass arg2 */ + stw r4,_DEAR(r21) + addi r3,r1,STACK_FRAME_OVERHEAD + li r7,STND_EXC + li r20,MSR_KERNEL + rlwimi r20,r23,0,16,16 /* Copy EE bit from the saved MSR */ + FINISH_EXCEPTION(0x800, do_page_fault) /* do_page_fault(regs, ESR, DEAR) */ + +/* + * Both the instruction and data TLB miss get to this + * point to load the TLB. + * r20 - EA of fault + * r21 - available to use + * r22 - Pointer to the 64-bit PTE + * r23 - available to use + * r24 - available to use + * MMUCR - loaded with proper value when we get here + * Upon exit, we reload everything and RFI. + */ +finish_tlb_load: + /* + * We set execute, because we don't have the granularity to + * properly set this at the page level (Linux problem). + * If shared is set, we cause a zero PID->TID load. + * Many of these bits are software only. Bits we don't set + * here we (properly should) assume have the appropriate value. + */ + + /* Load the next available TLB index */ + lis r23, tlb_44x_index@h + ori r23, r23, tlb_44x_index@l + lwz r24, 0(r23) + /* Load the TLB high watermark */ + lis r23, tlb_44x_hwater@h + ori r23, r23, tlb_44x_hwater@l + lwz r21, 0(r23) + + + /* Increment, rollover, and store TLB index */ + addi r24, r24, 1 + cmpw 0, r24, r21 /* reserve entries 62-63 for kernel */ + ble 7f + li r24, 0 +7: + /* Load the next available TLB index */ + lis r23, tlb_44x_index@h + ori r23, r23, tlb_44x_index@l + stw r24, 0(r23) + +6: + lwz r23, 0(r22) /* Get MS word of PTE */ + lwz r21, 4(r22) /* Get LS word of PTE */ + rlwimi r23, r21, 0, 0 , 19 /* Insert RPN */ + tlbwe r23, r24, 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 r22, 0x0210 /* Set size and valid */ + mfspr r23, SPRN_SRR1 /* Get SRR1 */ + andi. r23, r23, MSR_IS@l + beq 7f + ori r22, r22, PPC44x_TLB_TS@l /* Set TS=1 */ +7: rlwimi r20, r22, 0, 20, 31 /* Insert statics */ + tlbwe r20, r24, PPC44x_TLB_PAGEID /* Write PAGEID */ + + /* FIXME: Staticly setting some permissions */ + li r23, 0x002d /* Set UX,UR,SX,SR */ + andi. r21, r21, 0xffff /* Clear MS 16 bits */ + andi. r22, r21, 0x0002 /* _PAGE_HWWRITE? */ + beq 8f + ori r23, r23, 0x0002 /* Set SW */ + /* FIXME: Force attributes */ +8: ori r21, r21, 0x0100 /* Set G */ + /* FIXME: Already set in PTE */ + rlwimi r21, r23, 0, 26, 31 /* Insert static perms */ + + lis r23,0xffff + ori r23,r23,0x0fff /* Set U0-U3 mask */ + and r21,r21,r23 /* Clear U0-U3 */ + tlbwe r21, r24, PPC44x_TLB_ATTRIB /* Write ATTRIB */ + + /* Done...restore registers and get out of here. + */ + mfspr r21, SPRG7R + mtcr r21 + mfspr r24, SPRG6R + mfspr r23, SPRG5R + mfspr r22, SPRG4R + mfspr r21, SPRG1 + mfspr r20, SPRG0 + rfi /* Force context change */ + +/* + * Global functions + */ + +/* + * extern void giveup_altivec(struct task_struct *prev) + * + * The 44x core does not have an AltiVec unit. + */ +_GLOBAL(giveup_altivec) + blr + +/* + * extern void giveup_fpu(struct task_struct *prev) + * + * The 44x core does not have an FPU. + */ +_GLOBAL(giveup_fpu) + blr + +/* + * extern void abort(void) + * + * At present, this routine just applies a system reset. + */ +_GLOBAL(abort) + mfspr r13,SPRN_DBCR0 + oris r13,r13,DBCR_RST(DBCR_RST_SYSTEM)@h + mtspr SPRN_DBCR0,r13 + +_GLOBAL(set_context) + +#ifdef CONFIG_BDI_SWITCH + /* Context switch the PTE pointer for the Abatron BDI2000. + * The PGDIR is the second parameter. + */ + lis r5, abatron_pteptrs@h + ori r5, r5, abatron_pteptrs@l + stw r4, 0x4(r5) +#endif + mtspr SPRN_PID,r3 + isync /* Force context change */ + blr + +/* + * This code finishes saving the registers to the exception frame + * and jumps to the appropriate handler for the exception, turning + * on address translation. + */ +_GLOBAL(transfer_to_handler) + stw r22,_NIP(r21) /* Save the faulting IP on the stack */ + stw r23,_MSR(r21) /* Save the exception MSR on stack */ + SAVE_4GPRS(8, r21) /* Save r8 through r11 on the stack */ + SAVE_8GPRS(12, r21) /* Save r12 through r19 on the stack */ + SAVE_8GPRS(24, r21) /* Save r24 through r31 on the stack */ + andi. r23,r23,MSR_PR /* Is this from user space? */ + mfspr r23,SPRN_SPRG3 /* If from user, fix up THREAD.regs */ + beq 2f /* No, it is from the kernel; branch. */ + mfspr r24,SPRN_DBCR0 + stw r24,THREAD_DBCR0(r23) /* Save Debug Control in thread_struct */ + addi r24,r1,STACK_FRAME_OVERHEAD + stw r24,PT_REGS(r23) +2: addi r2,r23,-THREAD /* Set r2 to current thread */ + mflr r23 + lwz r24,8(r23) /* Emulate classic PPC vectors */ + stw r24,TRAP(r21) + li r22,RESULT + /* No need to put an erratum #77 workaround here + because interrupts are currently disabled */ + stwcx. r22,r22,r21 /* Clear the reservation */ + li r22,0 + stw r22,RESULT(r21) + mtspr SPRN_SPRG2,r22 /* r1 is now the kernel stack pointer */ + addi r24,r2,TASK_STRUCT_SIZE /* Check for kernel stack overflow */ + cmplw cr0,r1,r2 + cmplw cr1,r1,r24 + crand cr1,cr1,cr4 + bgt- stack_ovf /* If r2 < r1 < r2 + TASK_STRUCT_SIZE */ + lwz r24,0(r23) /* Virtual address of the handler */ + lwz r23,4(r23) /* Handler return pointer */ + cmpwi cr0,r7,STND_EXC /* What type of exception is this? */ + bne 3f /* It is a critical exception... */ + + /* Standard exception jump path + */ + + /* We have to recover r7 from the register save stack. + * It was used to indicate standard/critical exception. In + * the case of a standard exception that is the system call + * trap, it may have originally contained one of the syscall + * parameters and we have to get it back now. + */ + lwz r7,GPR7(r21) + mtspr SPRN_SRR0,r24 /* Set up the instruction pointer */ + mtspr SPRN_SRR1,r20 /* Set up the machine state register */ + mtlr r23 /* Set up the return pointer */ + SYNC + /* We shouldn't need a 405 erratum #77 workaround here, because we're not + * actually returning to the interrupted instruction yet. */ + rfi + + /* Critical exception jump path + */ + +3: mtspr SPRN_CSRR0,r24 /* Set up the instruction pointer */ + mtspr SPRN_CSRR1,r20 /* Set up the machine state register */ + mtlr r23 /* Set up the return pointer */ + SYNC + rfci + +/* On kernel stack overlow, load up an initial stack pointer and call + * StackOverflow(regs), which should NOT return. + */ + +stack_ovf: + addi r3,r1,STACK_FRAME_OVERHEAD + lis r1,init_task_union@ha + addi r1,r1,init_task_union@l + addi r1,r1,TASK_UNION_SIZE - STACK_FRAME_OVERHEAD + lis r24,StackOverflow@ha + addi r24,r24,StackOverflow@l + li r20,MSR_KERNEL + mtspr SPRN_SRR0,r24 + mtspr SPRN_SRR1,r20 + SYNC + rfi + +/* + * We put a few things here that have to be page-aligned. This stuff + * goes at the beginning of the data segment, which is page-aligned. + */ + .data +_GLOBAL(sdata) +_GLOBAL(empty_zero_page) + .space 4096 + +/* + * To support >32-bit physical addresses, we use an 8KB pgdir. + */ +_GLOBAL(swapper_pg_dir) + .space 8192 + +/* + * This space gets a copy of optional info passed to us by the bootstrap + * which is used to pass parameters into the kernel like root=/dev/sda1, etc. + */ +_GLOBAL(cmd_line) + .space 512 + +/* + * Room for two PTE pointers, usually the kernel and current user pointers + * to their respective root page table. + */ +abatron_pteptrs: + .space 8 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/head_4xx.S linux-2.4.23-pre8/arch/ppc/kernel/head_4xx.S --- linux-2.4.22/arch/ppc/kernel/head_4xx.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/head_4xx.S 2003-10-22 22:48:42.000000000 +0000 @@ -304,6 +304,7 @@ */ li r22, 0x0ce2 andc r21, r21, r22 /* Make sure 20, 21 are zero */ + ori r21, r21, _PAGE_HWEXEC /* make it executable */ /* find the TLB index that caused the fault. It has to be here. */ @@ -782,6 +783,7 @@ stw r23, tlb_4xx_index@l(0) 6: + ori r21, r21, _PAGE_HWEXEC /* make it executable */ tlbwe r21, r23, TLB_DATA /* Load TLB LO */ /* Create EPN. This is the faulting address plus a static diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/head_8xx.S linux-2.4.23-pre8/arch/ppc/kernel/head_8xx.S --- linux-2.4.22/arch/ppc/kernel/head_8xx.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/head_8xx.S 2003-10-22 22:48:53.000000000 +0000 @@ -21,9 +21,9 @@ * */ +#include #include #include -#include #include #include #include @@ -817,16 +817,31 @@ * kernel initialization. This maps the first 8 MBytes of memory 1:1 * virtual to physical. Also, set the cache mode since that is defined * by TLB entries and perform any additional mapping (like of the IMMR). + * If configured to pin some TLBs, we pin the first 8 Mbytes of kernel, + * 24 Mbytes of data, and the 8M IMMR space. Anything not covered by + * these mappings is mapped by page tables. */ initial_mmu: tlbia /* Invalidate all TLB entries */ +#ifdef CONFIG_PIN_TLB + lis r8, MI_RSV4I@h + ori r8, r8, 0x1c00 +#else li r8, 0 - mtspr MI_CTR, r8 /* Set instruction control to zero */ - lis r8, MD_RESETVAL@h +#endif + mtspr MI_CTR, r8 /* Set instruction MMU control */ + +#ifdef CONFIG_PIN_TLB + lis r10, (MD_RSV4I | MD_RESETVAL)@h + ori r10, r10, 0x1c00 + mr r8, r10 +#else + lis r10, MD_RESETVAL@h +#endif #ifndef CONFIG_8xx_COPYBACK - oris r8, r8, MD_WTDEF@h + oris r10, r10, MD_WTDEF@h #endif - mtspr MD_CTR, r8 /* Set data TLB control */ + mtspr MD_CTR, r10 /* Set data TLB control */ /* Now map the lower 8 Meg into the TLBs. For this quick hack, * we can load the instruction and data TLB registers with the @@ -850,6 +865,10 @@ /* Map another 8 MByte at the IMMR to get the processor * internal registers (among other things). */ +#ifdef CONFIG_PIN_TLB + addi r10, r10, 0x0100 + mtspr MD_CTR, r10 +#endif mfspr r9, 638 /* Get current IMMR */ andis. r9, r9, 0xff80 /* Get 8Mbyte boundary */ @@ -863,6 +882,30 @@ ori r8, r8, MI_BOOTINIT|0x2 /* Inhibit cache -- Cort */ mtspr MD_RPN, r8 +#ifdef CONFIG_PIN_TLB + /* Map two more 8M kernel data pages. + */ + addi r10, r10, 0x0100 + mtspr MD_CTR, r10 + + lis r8, KERNELBASE@h /* Create vaddr for TLB */ + addis r8, r8, 0x0080 /* Add 8M */ + ori r8, r8, MI_EVALID /* Mark it valid */ + mtspr MD_EPN, r8 + li r9, MI_PS8MEG /* Set 8M byte page */ + ori r9, r9, MI_SVALID /* Make it valid */ + mtspr MD_TWC, r9 + li r11, MI_BOOTINIT /* Create RPN for address 0 */ + addis r11, r11, 0x0080 /* Add 8M */ + mtspr MD_RPN, r8 + + addis r8, r8, 0x0080 /* Add 8M */ + mtspr MD_EPN, r8 + mtspr MD_TWC, r9 + addis r11, r11, 0x0080 /* Add 8M */ + mtspr MD_RPN, r8 +#endif + /* Since the cache is enabled according to the information we * just loaded into the TLB, invalidate and enable the caches here. * We should probably check/set other modes....later. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/ibm440gp_common.c linux-2.4.23-pre8/arch/ppc/kernel/ibm440gp_common.c --- linux-2.4.22/arch/ppc/kernel/ibm440gp_common.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/ibm440gp_common.c 2003-10-22 22:48:40.000000000 +0000 @@ -0,0 +1,78 @@ +/* + * arch/ppc/syslib/ibm440gp_common.c + * + * PPC440GP system library + * + * Matt Porter + * Copyright 2002-2003 MontaVista Software Inc. + * + * Eugene Surovegin or + * Copyright (c) 2003 Zultys Technologies + * + * 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 + +/* + * Calculate 440GP clocks + */ +void __init ibm440gp_get_clocks(struct ibm440gp_clocks* p, unsigned int sys_clk, + unsigned int ser_clk) +{ + u32 cpc0_sys0 = mfdcr(DCRN_CPC0_SYS0); + u32 cpc0_cr0 = mfdcr(DCRN_CPC0_CR0); + u32 opdv, epdv; + + if (cpc0_sys0 & 0x2){ + /* Bypass system PLL */ + p->cpu = p->plb = sys_clk; + } + else { + u32 fbdv, fwdva, fwdvb, m, vco; + + fbdv = (cpc0_sys0 >> 18) & 0x0f; + if (!fbdv) + fbdv = 16; + + fwdva = 8 - ((cpc0_sys0 >> 15) & 0x7); + fwdvb = 8 - ((cpc0_sys0 >> 12) & 0x7); + + /* Feedback path */ + if (cpc0_sys0 & 0x00000080){ + /* PerClk */ + m = fwdvb * opdv * epdv; + } + else { + /* CPU clock */ + m = fbdv * fwdva; + } + vco = sys_clk * m; + p->cpu = vco / fwdva; + p->plb = vco / fwdvb; + } + + opdv = ((cpc0_sys0 >> 10) & 0x3) + 1; + epdv = ((cpc0_sys0 >> 8) & 0x3) + 1; + + p->opb = p->plb / opdv; + p->ebc = p->opb / epdv; + + if (cpc0_cr0 & 0x00400000){ + /* External UART clock */ + p->uart = ser_clk; + } + else { + /* Internal UART clock */ + u32 uart_div = ((cpc0_cr0 >> 16) & 0x1f) + 1; + p->uart = p->plb / uart_div; + } +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/ibm440gp_common.h linux-2.4.23-pre8/arch/ppc/kernel/ibm440gp_common.h --- linux-2.4.22/arch/ppc/kernel/ibm440gp_common.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/ibm440gp_common.h 2003-10-22 22:48:12.000000000 +0000 @@ -0,0 +1,45 @@ +/* + * arch/ppc/kernel/ibm440gp_common.h + * + * PPC440GP system library + * + * Eugene Surovegin or + * Copyright (c) 2003 Zultys Technologies + * + * 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. + * + */ +#ifdef __KERNEL__ +#ifndef __PPC_SYSLIB_IBM440GP_COMMON_H +#define __PPC_SYSLIB_IBM440GP_COMMON_H + +#ifndef __ASSEMBLY__ + +#include +#include + +/* + * All clocks are in Hz + */ +struct ibm440gp_clocks { + unsigned int cpu; /* CPUCoreClk */ + unsigned int plb; /* PLBClk */ + unsigned int opb; /* OPBClk */ + unsigned int ebc; /* PerClk */ + unsigned int uart; +}; + +/* + * Please, refer to the Figure 13.1 in 440GP user manual + * + * if internal UART clock is used, ser_clk is ignored + */ +void ibm440gp_get_clocks(struct ibm440gp_clocks*, unsigned int sys_clk, + unsigned int ser_clk) __init; + +#endif /* __ASSEMBLY__ */ +#endif /* __PPC_SYSLIB_IBM440GP_COMMON_H */ +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/ibm44x_common.c linux-2.4.23-pre8/arch/ppc/kernel/ibm44x_common.c --- linux-2.4.22/arch/ppc/kernel/ibm44x_common.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/ibm44x_common.c 2003-10-22 22:48:36.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * arch/ppc/kernel/ibm44x_common.c + * + * PPC44x system library + * + * Matt Porter + * Copyright 2002-2003 MontaVista Software Inc. + * + * 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 + +phys_addr_t fixup_bigphys_addr(phys_addr_t addr, phys_addr_t size) +{ + phys_addr_t page_4gb = 0; + + /* + * Trap the least significant 32-bit portions of an + * address in the 440's 36-bit address space. Fix + * them up with the appropriate ERPN + */ + if ((addr >= PPC44x_IO_LO) && (addr < PPC44x_IO_HI)) + page_4gb = PPC44x_IO_PAGE; + else if ((addr >= PPC44x_PCICFG_LO) && (addr < PPC44x_PCICFG_HI)) + page_4gb = PPC44x_PCICFG_PAGE; + else if ((addr >= PPC44x_PCIMEM_LO) && (addr < PPC44x_PCIMEM_HI)) + page_4gb = PPC44x_PCIMEM_PAGE; + + return (page_4gb | addr); +}; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/idle_gen.c linux-2.4.23-pre8/arch/ppc/kernel/idle_gen.c --- linux-2.4.22/arch/ppc/kernel/idle_gen.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/idle_gen.c 2003-10-22 22:47:31.000000000 +0000 @@ -15,10 +15,15 @@ void power_save(void) { - /* Make sure the CPU has the DOZE feature set. */ + /* + * Make sure the CPU has the DOZE or NAP feature set. + * We assume that chip-specific initialization code + * has set any other registers necessary (e.g. HID0). + */ if (!(cur_cpu_spec[smp_processor_id()]->cpu_features - & CPU_FTR_CAN_DOZE)) + & (CPU_FTR_CAN_DOZE | CPU_FTR_CAN_NAP))) return; + /* * Disable interrupts to prevent a lost wakeup * when going to sleep. This is necessary even with diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/indirect_pci.c linux-2.4.23-pre8/arch/ppc/kernel/indirect_pci.c --- linux-2.4.22/arch/ppc/kernel/indirect_pci.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/indirect_pci.c 2003-10-22 22:47:43.000000000 +0000 @@ -24,6 +24,12 @@ #define cfg_read(val, addr, type, op) *val = op((type)(addr)) #define cfg_write(val, addr, type, op) op((type *)(addr), (val)) +#ifdef CONFIG_PPC_INDIRECT_PCI_BE +#define PCI_CFG_OUT out_be32 +#else +#define PCI_CFG_OUT out_le32 +#endif + #define INDIRECT_PCI_OP(rw, size, type, op, mask) \ static int \ indirect_##rw##_config_##size(struct pci_dev *dev, int offset, type val) \ @@ -39,9 +45,9 @@ if (dev->bus->number != hose->first_busno) \ cfg_type = 1; \ \ - out_be32(hose->cfg_addr, \ - (((offset & 0xfc) | cfg_type) << 24) | (dev->devfn << 16) \ - | ((dev->bus->number - hose->bus_offset) << 8) | 0x80); \ + PCI_CFG_OUT(hose->cfg_addr, \ + (0x80000000 | ((dev->bus->number - hose->bus_offset) << 16) \ + | (dev->devfn << 8) | ((offset & 0xfc) | cfg_type))); \ cfg_##rw(val, hose->cfg_data + (offset & mask), type, op); \ return PCIBIOS_SUCCESSFUL; \ } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/irq.c linux-2.4.23-pre8/arch/ppc/kernel/irq.c --- linux-2.4.22/arch/ppc/kernel/irq.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/irq.c 2003-10-22 22:49:19.000000000 +0000 @@ -429,7 +429,7 @@ int status; struct irqaction *action; int cpu = smp_processor_id(); - irq_desc_t *desc = irq_desc + irq; + irq_desc_t *desc = &irq_desc[irq]; kstat.irqs[cpu][irq]++; spin_lock(&desc->lock); @@ -501,12 +501,25 @@ * The ->end() handler has to deal with interrupts which got * disabled while the handler was running. */ - if (irq_desc[irq].handler) { - if (irq_desc[irq].handler->end) - irq_desc[irq].handler->end(irq); - else if (irq_desc[irq].handler->enable) - irq_desc[irq].handler->enable(irq); + if (desc->handler) { + if (desc->handler->end) + desc->handler->end(irq); + else if (desc->handler->enable) + desc->handler->enable(irq); } + +#ifdef CONFIG_DBOX2 + /* + * Interrupts marked as oneshot are level + * triggered. We disable them here for onboard + * hardware which can not be configured to + * generate edge triggered interrupts due to + * lack of documentation. + */ + if ((action) && (action->flags & SA_ONESHOT)) + disable_irq_nosync(irq); +#endif + spin_unlock(&desc->lock); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/misc.S linux-2.4.23-pre8/arch/ppc/kernel/misc.S --- linux-2.4.22/arch/ppc/kernel/misc.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/misc.S 2003-10-22 22:49:36.000000000 +0000 @@ -361,7 +361,20 @@ cmpwi 0, r3, 61 /* reserve last two entries */ ble 1b isync -#else +#elif defined(CONFIG_44x) + lis 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) + cmpw 0,r3,r5 + ble 1b + isync +#else /* !(CONFIG_40x || CONFIG_44x) */ #if defined(CONFIG_SMP) mfmsr r10 SYNC @@ -406,7 +419,31 @@ tlbwe r3, r3, TLB_TAG isync 10: -#else +#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 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 */ + + tlbsx. r3, 0, r3 + bne 10f + sync + /* There are only 64 TLB entries, so r3 < 64, + * which means bit 22, is clear. Since 22 is + * the V bit in the TLB_PAGEID, loading this + * value will invalidate the TLB entry. + */ + tlbwe r3, r3, PPC44x_TLB_PAGEID + isync +10: +#else /* !(CONFIG_40x || CONFIG_44x) */ #if defined(CONFIG_SMP) mfmsr r10 SYNC @@ -570,7 +607,7 @@ #ifdef CONFIG_NOT_COHERENT_CACHE /* * 40x cores have 8K or 16K dcache and 32 byte line size. - * 440 has a 32K dcache and 32 byte line size. + * 44x has a 32K dcache and 32 byte line size. * 8xx has 1, 2, 4, 8K variants. * For now, cover the worst case of the 440. * Must be called with external interrupts disabled. @@ -1243,6 +1280,24 @@ .long sys_ni_syscall /* reserved for sys_io_getevents */ .long sys_ni_syscall /* 230 reserved for sys_io_submit */ .long sys_ni_syscall /* reserved for sys_io_cancel */ + .long sys_ni_syscall /* reserved for sys_set_tid_address */ + .long sys_ni_syscall /* reserved for sys_fadvise64 */ + .long sys_ni_syscall /* reserved for sys_exit_group */ + .long sys_ni_syscall /* 235 reserved for sys_lookup_dcookie */ + .long sys_ni_syscall /* reserved for sys_epoll_create */ + .long sys_ni_syscall /* reserved for sys_epoll_ctl */ + .long sys_ni_syscall /* reserved for sys_epoll_wait */ + .long sys_ni_syscall /* reserved for sys_remap_file_pages */ + .long sys_ni_syscall /* 240 reserved for sys_timer_create */ + .long sys_ni_syscall /* reserved for sys_timer_settime */ + .long sys_ni_syscall /* reserved for sys_timer_gettime */ + .long sys_ni_syscall /* reserved for sys_timer_getoverrun */ + .long sys_ni_syscall /* reserved for sys_timer_delete */ + .long sys_ni_syscall /* 245 reserved for sys_clock_settime */ + .long sys_ni_syscall /* reserved for sys_clock_gettime */ + .long sys_ni_syscall /* reserved for sys_clock_getres */ + .long sys_ni_syscall /* reserved for sys_clock_nanosleep */ + .long sys_swapcontext .rept NR_syscalls-(.-sys_call_table)/4 .long sys_ni_syscall diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/mk_defs.c linux-2.4.23-pre8/arch/ppc/kernel/mk_defs.c --- linux-2.4.22/arch/ppc/kernel/mk_defs.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/mk_defs.c 2003-10-22 22:49:02.000000000 +0000 @@ -56,6 +56,7 @@ DEFINE(THREAD_VR0, offsetof(struct thread_struct, vr[0])); DEFINE(THREAD_VRSAVE, offsetof(struct thread_struct, vrsave)); DEFINE(THREAD_VSCR, offsetof(struct thread_struct, vscr)); + DEFINE(THREAD_USED_VR, offsetof(struct thread_struct, used_vr)); #endif /* CONFIG_ALTIVEC */ #ifdef CONFIG_4xx DEFINE(THREAD_DBCR0, offsetof(struct thread_struct, dbcr0)); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/pci-dma.c linux-2.4.23-pre8/arch/ppc/kernel/pci-dma.c --- linux-2.4.22/arch/ppc/kernel/pci-dma.c 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/pci-dma.c 2003-10-22 22:47:56.000000000 +0000 @@ -20,13 +20,20 @@ void *ret; int gfp = GFP_ATOMIC; - if (hwdev == NULL || hwdev->dma_mask != 0xffffffff) + if (hwdev == NULL || hwdev->dma_mask < 0xffffffff) gfp |= GFP_DMA; + +#ifdef CONFIG_NOT_COHERENT_CACHE + ret = consistent_alloc(gfp, size, dma_handle); +#else ret = (void *)__get_free_pages(gfp, get_order(size)); +#endif if (ret != NULL) { memset(ret, 0, size); +#ifndef CONFIG_NOT_COHERENT_CACHE *dma_handle = virt_to_bus(ret); +#endif } return ret; } @@ -34,5 +41,9 @@ void pci_free_consistent(struct pci_dev *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle) { +#ifdef CONFIG_NOT_COHERENT_CACHE + consistent_free(vaddr); +#else free_pages((unsigned long)vaddr, get_order(size)); +#endif } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/ppc-stub.c linux-2.4.23-pre8/arch/ppc/kernel/ppc-stub.c --- linux-2.4.22/arch/ppc/kernel/ppc-stub.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/ppc-stub.c 2003-10-22 22:49:34.000000000 +0000 @@ -135,7 +135,7 @@ /* typedef void (*trapfunc_t)(void); */ static void kgdb_fault_handler(struct pt_regs *regs); -static void handle_exception (struct pt_regs *regs); +static int handle_exception (struct pt_regs *regs); #if 0 /* Install an exception handler for kgdb */ @@ -387,14 +387,12 @@ int kgdb_bpt(struct pt_regs *regs) { - handle_exception(regs); - return 1; + return handle_exception(regs); } int kgdb_sstep(struct pt_regs *regs) { - handle_exception(regs); - return 1; + return handle_exception(regs); } void kgdb(struct pt_regs *regs) @@ -404,16 +402,14 @@ int kgdb_iabr_match(struct pt_regs *regs) { - printk("kgdb doesn't support iabr, what?!?\n"); - handle_exception(regs); - return 1; + printk(KERN_ERR "kgdb doesn't support iabr, what?!?\n"); + return handle_exception(regs); } int kgdb_dabr_match(struct pt_regs *regs) { - printk("kgdb doesn't support dabr, what?!?\n"); - handle_exception(regs); - return 1; + printk(KERN_ERR "kgdb doesn't support dabr, what?!?\n"); + return handle_exception(regs); } /* Convert the SPARC hardware trap type code to a unix signal number. */ @@ -459,7 +455,7 @@ /* * This function does all command processing for interfacing to gdb. */ -static void +static int handle_exception (struct pt_regs *regs) { int sigval; @@ -468,14 +464,19 @@ char *ptr; unsigned int msr; + /* We don't handle user-mode breakpoints. */ + if (user_mode(regs)) + return 0; + if (debugger_fault_handler) { debugger_fault_handler(regs); panic("kgdb longjump failed!\n"); } if (kgdb_active) { - printk("interrupt while in kgdb, returning\n"); - return; + printk(KERN_ERR "interrupt while in kgdb, returning\n"); + return 0; } + kgdb_active = 1; kgdb_started = 1; @@ -677,14 +678,14 @@ kgdb_interruptible(1); unlock_kernel(); kgdb_active = 0; - return; + return 1; case 's': kgdb_flush_cache_all(); regs->msr |= MSR_SE; unlock_kernel(); kgdb_active = 0; - return; + return 1; case 'r': /* Reset (if user process..exit ???)*/ panic("kgdb reset."); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/ppc4xx_dma.c linux-2.4.23-pre8/arch/ppc/kernel/ppc4xx_dma.c --- linux-2.4.22/arch/ppc/kernel/ppc4xx_dma.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/ppc4xx_dma.c 2003-10-22 22:48:19.000000000 +0000 @@ -0,0 +1,852 @@ +/* + * arch/ppc/kernel/ppc4xx_dma.c + * + * IBM PPC4xx DMA engine core library + * + * Copyright 2000-2003 MontaVista Software Inc. + * + * Cleaned by Matt Porter + * + * Original code by Armin Kuster + * and Pete Popov + * + * 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. + * + * 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 + +ppc_dma_ch_t dma_channels[MAX_PPC4xx_DMA_CHANNELS]; + +int +ppc4xx_get_dma_status(void) +{ + return (mfdcr(DCRN_DMASR)); +} + +void +ppc4xx_set_src_addr(int dmanr, phys_addr_t src_addr) +{ + switch (dmanr) { + case 0: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_DMASAH0, (u32)(src_addr >> 32)); +#endif + mtdcr(DCRN_DMASA0, (u32)src_addr); + break; + case 1: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_DMASAH1, (u32)(src_addr >> 32)); +#endif + mtdcr(DCRN_DMASA1, (u32)src_addr); + break; + case 2: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_DMASAH2, (u32)(src_addr >> 32)); +#endif + mtdcr(DCRN_DMASA2, (u32)src_addr); + break; + case 3: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_DMASAH3, (u32)(src_addr >> 32)); +#endif + mtdcr(DCRN_DMASA3, (u32)src_addr); + break; + default: + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) + printk("set_src_addr: bad channel: %d\n", dmanr); + } +} + +void +ppc4xx_set_dst_addr(int dmanr, phys_addr_t dst_addr) +{ + switch (dmanr) { + case 0: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_DMADAH0, (u32)(dst_addr >> 32)); +#endif + mtdcr(DCRN_DMADA0, (u32)dst_addr); + break; + case 1: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_DMADAH1, (u32)(dst_addr >> 32)); +#endif + mtdcr(DCRN_DMADA1, (u32)dst_addr); + break; + case 2: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_DMADAH2, (u32)(dst_addr >> 32)); +#endif + mtdcr(DCRN_DMADA2, (u32)dst_addr); + break; + case 3: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_DMADAH3, (u32)(dst_addr >> 32)); +#endif + mtdcr(DCRN_DMADA3, (u32)dst_addr); + break; + default: + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) + printk("set_dst_addr: bad channel: %d\n", dmanr); + } +} + + +void +ppc4xx_enable_dma(unsigned int dmanr) +{ + unsigned int control; + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + unsigned int status_bits[] = { DMA_CS0 | DMA_TS0 | DMA_CH0_ERR, + DMA_CS1 | DMA_TS1 | DMA_CH1_ERR, + DMA_CS2 | DMA_TS2 | DMA_CH2_ERR, + DMA_CS3 | DMA_TS3 | DMA_CH3_ERR}; + + if (p_dma_ch->in_use) { + printk("enable_dma: channel %d in use\n", dmanr); + return; + } + + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) { + printk("enable_dma: bad channel: %d\n", dmanr); + return; + } + + if (p_dma_ch->mode == DMA_MODE_READ) { + /* peripheral to memory */ + ppc4xx_set_src_addr(dmanr, 0); + ppc4xx_set_dst_addr(dmanr, p_dma_ch->addr); + } else if (p_dma_ch->mode == DMA_MODE_WRITE) { + /* memory to peripheral */ + ppc4xx_set_src_addr(dmanr, p_dma_ch->addr); + ppc4xx_set_dst_addr(dmanr, 0); + } + + /* for other xfer modes, the addresses are already set */ + switch (dmanr) { + case 0: + control = mfdcr(DCRN_DMACR0); + break; + case 1: + control = mfdcr(DCRN_DMACR1); + break; + case 2: + control = mfdcr(DCRN_DMACR2); + break; + case 3: + control = mfdcr(DCRN_DMACR3); + break; + default: + printk("enable_dma: bad channel: %d\n", dmanr); + } + + control &= ~(DMA_TM_MASK | DMA_TD); /* clear all mode bits */ + if (p_dma_ch->mode == DMA_MODE_MM) { + /* software initiated memory to memory */ + control |= DMA_ETD_OUTPUT | DMA_TCE_ENABLE; + } + + switch (dmanr) { + case 0: + mtdcr(DCRN_DMACR0, control); + break; + case 1: + mtdcr(DCRN_DMACR1, control); + break; + case 2: + mtdcr(DCRN_DMACR2, control); + break; + case 3: + mtdcr(DCRN_DMACR3, control); + break; + default: + printk("enable_dma: bad channel: %d\n", dmanr); + } + + /* + * Clear the CS, TS, RI bits for the channel from DMASR. This + * has been observed to happen correctly only after the mode and + * ETD/DCE bits in DMACRx are set above. Must do this before + * enabling the channel. + */ + + mtdcr(DCRN_DMASR, status_bits[dmanr]); + + /* + * For device-paced transfers, Terminal Count Enable apparently + * must be on, and this must be turned on after the mode, etc. + * bits are cleared above (at least on Redwood-6). + */ + + if ((p_dma_ch->mode == DMA_MODE_MM_DEVATDST) || + (p_dma_ch->mode == DMA_MODE_MM_DEVATSRC)) + control |= DMA_TCE_ENABLE; + + /* + * Now enable the channel. + */ + + control |= (p_dma_ch->mode | DMA_CE_ENABLE); + + switch (dmanr) { + case 0: + mtdcr(DCRN_DMACR0, control); + break; + case 1: + mtdcr(DCRN_DMACR1, control); + break; + case 2: + mtdcr(DCRN_DMACR2, control); + break; + case 3: + mtdcr(DCRN_DMACR3, control); + break; + default: + printk("enable_dma: bad channel: %d\n", dmanr); + } + + p_dma_ch->in_use = 1; +} + +void +ppc4xx_disable_dma(unsigned int dmanr) +{ + unsigned int control; + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + + if (!p_dma_ch->in_use) { + printk("disable_dma: channel %d not in use\n", dmanr); + return; + } + + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) { + printk("disable_dma: bad channel: %d\n", dmanr); + return; + } + + switch (dmanr) { + case 0: + control = mfdcr(DCRN_DMACR0); + control &= ~DMA_CE_ENABLE; + mtdcr(DCRN_DMACR0, control); + break; + case 1: + control = mfdcr(DCRN_DMACR1); + control &= ~DMA_CE_ENABLE; + mtdcr(DCRN_DMACR1, control); + break; + case 2: + control = mfdcr(DCRN_DMACR2); + control &= ~DMA_CE_ENABLE; + mtdcr(DCRN_DMACR2, control); + break; + case 3: + control = mfdcr(DCRN_DMACR3); + control &= ~DMA_CE_ENABLE; + mtdcr(DCRN_DMACR3, control); + break; + default: + printk("disable_dma: bad channel: %d\n", dmanr); + } + + p_dma_ch->in_use = 0; +} + +/* + * Sets the dma mode for single DMA transfers only. + * For scatter/gather transfers, the mode is passed to the + * alloc_dma_handle() function as one of the parameters. + * + * The mode is simply saved and used later. This allows + * the driver to call set_dma_mode() and set_dma_addr() in + * any order. + * + * Valid mode values are: + * + * DMA_MODE_READ peripheral to memory + * DMA_MODE_WRITE memory to peripheral + * DMA_MODE_MM memory to memory + * DMA_MODE_MM_DEVATSRC device-paced memory to memory, device at src + * DMA_MODE_MM_DEVATDST device-paced memory to memory, device at dst + */ +int +ppc4xx_set_dma_mode(unsigned int dmanr, unsigned int mode) +{ + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) { + printk("set_dma_mode: bad channel 0x%x\n", dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + + p_dma_ch->mode = mode; + + return DMA_STATUS_GOOD; +} + +/* + * Sets the DMA Count register. Note that 'count' is in bytes. + * However, the DMA Count register counts the number of "transfers", + * where each transfer is equal to the bus width. Thus, count + * MUST be a multiple of the bus width. + */ +void +ppc4xx_set_dma_count(unsigned int dmanr, unsigned int count) +{ + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + +#ifdef DEBUG_4xxDMA + { + int error = 0; + switch (p_dma_ch->pwidth) { + case PW_8: + break; + case PW_16: + if (count & 0x1) + error = 1; + break; + case PW_32: + if (count & 0x3) + error = 1; + break; + case PW_64: + if (count & 0x7) + error = 1; + break; + default: + printk("set_dma_count: invalid bus width: 0x%x\n", + p_dma_ch->pwidth); + return; + } + if (error) + printk + ("Warning: set_dma_count count 0x%x bus width %d\n", + count, p_dma_ch->pwidth); + } +#endif + + count = count >> p_dma_ch->shift; + switch (dmanr) { + case 0: + mtdcr(DCRN_DMACT0, count); + break; + case 1: + mtdcr(DCRN_DMACT1, count); + break; + case 2: + mtdcr(DCRN_DMACT2, count); + break; + case 3: + mtdcr(DCRN_DMACT3, count); + break; + default: + printk("ppc4xx_set_dma_count: bad channel: %d\n", dmanr); + } +} + +/* + * Returns the number of bytes left to be transfered. + * After a DMA transfer, this should return zero. + * Reading this while a DMA transfer is still in progress will return + * unpredictable results. + */ +int +ppc4xx_get_dma_residue(unsigned int dmanr) +{ + unsigned int count; + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + + switch (dmanr) { + case 0: + count = mfdcr(DCRN_DMACT0); + break; + case 1: + count = mfdcr(DCRN_DMACT1); + break; + case 2: + count = mfdcr(DCRN_DMACT2); + break; + case 3: + count = mfdcr(DCRN_DMACT3); + break; + default: + printk("ppc4xx_get_dma_residue: bad channel: %d\n", dmanr); + return 0; + } + + return (count << p_dma_ch->shift); +} + +/* + * Sets the DMA address for a memory to peripheral or peripheral + * to memory transfer. The address is just saved in the channel + * structure for now and used later in enable_dma(). + */ +void +ppc4xx_set_dma_addr(unsigned int dmanr, phys_addr_t addr) +{ + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) { + printk("ppc4xx_set_dma_addr: bad channel: %d\n", dmanr); + return; + } + +#ifdef DEBUG_4xxDMA + { + int error = 0; + switch (p_dma_ch->pwidth) { + case PW_8: + break; + case PW_16: + if ((unsigned) addr & 0x1) + error = 1; + break; + case PW_32: + if ((unsigned) addr & 0x3) + error = 1; + break; + case PW_64: + if ((unsigned) addr & 0x7) + error = 1; + break; + default: + printk("ppc4xx_set_dma_addr: invalid bus width: 0x%x\n", + p_dma_ch->pwidth); + return; + } + if (error) + printk("Warning: ppc4xx_set_dma_addr addr 0x%x bus width %d\n", + addr, p_dma_ch->pwidth); + } +#endif + + /* save dma address and program it later after we know the xfer mode */ + p_dma_ch->addr = addr; +} + +/* + * Sets both DMA addresses for a memory to memory transfer. + * For memory to peripheral or peripheral to memory transfers + * the function set_dma_addr() should be used instead. + */ +void +ppc4xx_set_dma_addr2(unsigned int dmanr, phys_addr_t src_dma_addr, + phys_addr_t dst_dma_addr) +{ +#ifdef DEBUG_4xxDMA + { + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + int error = 0; + switch (p_dma_ch->pwidth) { + case PW_8: + break; + case PW_16: + if (((unsigned) src_dma_addr & 0x1) || + ((unsigned) dst_dma_addr & 0x1) + ) + error = 1; + break; + case PW_32: + if (((unsigned) src_dma_addr & 0x3) || + ((unsigned) dst_dma_addr & 0x3) + ) + error = 1; + break; + case PW_64: + if (((unsigned) src_dma_addr & 0x7) || + ((unsigned) dst_dma_addr & 0x7) + ) + error = 1; + break; + default: + printk("ppc4xx_set_dma_addr2: invalid bus width: 0x%x\n", + p_dma_ch->pwidth); + return; + } + if (error) + printk + ("Warning: ppc4xx_set_dma_addr2 src 0x%x dst 0x%x bus width %d\n", + src_dma_addr, dst_dma_addr, p_dma_ch->pwidth); + } +#endif + + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) { + printk("ppc4xx_set_dma_addr2: bad channel: %d\n", dmanr); + } + else { + ppc4xx_set_src_addr(dmanr, src_dma_addr); + ppc4xx_set_dst_addr(dmanr, dst_dma_addr); + } +} + +/* + * Enables the channel interrupt. + * + * If performing a scatter/gatter transfer, this function + * MUST be called before calling alloc_dma_handle() and building + * the sgl list. Otherwise, interrupts will not be enabled, if + * they were previously disabled. + */ +int +ppc4xx_enable_dma_interrupt(unsigned int dmanr) +{ + unsigned int control; + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + + p_dma_ch->int_enable = 1; + switch (dmanr) { + case 0: + control = mfdcr(DCRN_DMACR0); + control |= DMA_CIE_ENABLE; /* Channel Interrupt Enable */ + mtdcr(DCRN_DMACR0, control); + break; + case 1: + control = mfdcr(DCRN_DMACR1); + control |= DMA_CIE_ENABLE; + mtdcr(DCRN_DMACR1, control); + break; + case 2: + control = mfdcr(DCRN_DMACR2); + control |= DMA_CIE_ENABLE; + mtdcr(DCRN_DMACR2, control); + break; + case 3: + control = mfdcr(DCRN_DMACR3); + control |= DMA_CIE_ENABLE; + mtdcr(DCRN_DMACR3, control); + break; + default: + printk("ppc4xx_enable_dma_interrupt: bad channel: %d\n", dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + return DMA_STATUS_GOOD; +} + +/* + * Disables the channel interrupt. + * + * If performing a scatter/gatter transfer, this function + * MUST be called before calling alloc_dma_handle() and building + * the sgl list. Otherwise, interrupts will not be disabled, if + * they were previously enabled. + */ +int +ppc4xx_disable_dma_interrupt(unsigned int dmanr) +{ + unsigned int control; + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + + p_dma_ch->int_enable = 0; + switch (dmanr) { + case 0: + control = mfdcr(DCRN_DMACR0); + control &= ~DMA_CIE_ENABLE; /* Channel Interrupt Enable */ + mtdcr(DCRN_DMACR0, control); + break; + case 1: + control = mfdcr(DCRN_DMACR1); + control &= ~DMA_CIE_ENABLE; + mtdcr(DCRN_DMACR1, control); + break; + case 2: + control = mfdcr(DCRN_DMACR2); + control &= ~DMA_CIE_ENABLE; + mtdcr(DCRN_DMACR2, control); + break; + case 3: + control = mfdcr(DCRN_DMACR3); + control &= ~DMA_CIE_ENABLE; + mtdcr(DCRN_DMACR3, control); + break; + default: + printk("ppc4xx_disable_dma_interrupt: bad channel: %d\n", dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + return DMA_STATUS_GOOD; +} + +/* + * Configures a DMA channel, including the peripheral bus width, if a + * peripheral is attached to the channel, the polarity of the DMAReq and + * DMAAck signals, etc. This information should really be setup by the boot + * code, since most likely the configuration won't change dynamically. + * If the kernel has to call this function, it's recommended that it's + * called from platform specific init code. The driver should not need to + * call this function. + */ +int +ppc4xx_init_dma_channel(unsigned int dmanr, ppc_dma_ch_t * p_init) +{ + unsigned int polarity; + uint32_t control = 0; + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + + DMA_MODE_READ = (unsigned long) DMA_TD; /* Peripheral to Memory */ + DMA_MODE_WRITE = 0; /* Memory to Peripheral */ + + if (!p_init) { + printk("ppc4xx_init_dma_channel: NULL p_init\n"); + return DMA_STATUS_NULL_POINTER; + } + + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) { + printk("ppc4xx_init_dma_channel: bad channel %d\n", dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + +#if DCRN_POL > 0 + polarity = mfdcr(DCRN_POL); +#else + polarity = 0; +#endif + + /* Setup the control register based on the values passed to + * us in p_init. Then, over-write the control register with this + * new value. + */ + control |= SET_DMA_CONTROL; + + switch (dmanr) { + case 0: + /* clear all polarity signals and then "or" in new signal levels */ + polarity &= ~GET_DMA_POLARITY(0); + polarity |= p_dma_ch->polarity; +#if DCRN_POL > 0 + mtdcr(DCRN_POL, polarity); +#endif + mtdcr(DCRN_DMACR0, control); + break; + case 1: + polarity &= ~GET_DMA_POLARITY(1); + polarity |= p_dma_ch->polarity; +#if DCRN_POL > 0 + mtdcr(DCRN_POL, polarity); +#endif + mtdcr(DCRN_DMACR1, control); + break; + case 2: + polarity &= ~GET_DMA_POLARITY(2); + polarity |= p_dma_ch->polarity; +#if DCRN_POL > 0 + mtdcr(DCRN_POL, polarity); +#endif + mtdcr(DCRN_DMACR2, control); + break; + case 3: + polarity &= ~GET_DMA_POLARITY(3); + polarity |= p_dma_ch->polarity; +#if DCRN_POL > 0 + mtdcr(DCRN_POL, polarity); +#endif + mtdcr(DCRN_DMACR3, control); + break; + default: + return DMA_STATUS_BAD_CHANNEL; + } + + /* save these values in our dma channel structure */ + memcpy(p_dma_ch, p_init, sizeof (ppc_dma_ch_t)); + + /* + * The peripheral width values written in the control register are: + * PW_8 0 + * PW_16 1 + * PW_32 2 + * PW_64 3 + * + * Since the DMA count register takes the number of "transfers", + * we need to divide the count sent to us in certain + * functions by the appropriate number. It so happens that our + * right shift value is equal to the peripheral width value. + */ + p_dma_ch->shift = p_init->pwidth; + + /* + * Save the control word for easy access. + */ + p_dma_ch->control = control; + + mtdcr(DCRN_DMASR, 0xffffffff); /* clear status register */ + return DMA_STATUS_GOOD; +} + +/* + * This function returns the channel configuration. + */ +int +ppc4xx_get_channel_config(unsigned int dmanr, ppc_dma_ch_t * p_dma_ch) +{ + unsigned int polarity; + unsigned int control; + +#if DCRN_POL > 0 + polarity = mfdcr(DCRN_POL); +#else + polarity = 0; +#endif + + switch (dmanr) { + case 0: + p_dma_ch->polarity = polarity & GET_DMA_POLARITY(0); + control = mfdcr(DCRN_DMACR0); + break; + case 1: + p_dma_ch->polarity = polarity & GET_DMA_POLARITY(1); + control = mfdcr(DCRN_DMACR1); + break; + case 2: + p_dma_ch->polarity = polarity & GET_DMA_POLARITY(2); + control = mfdcr(DCRN_DMACR2); + break; + case 3: + p_dma_ch->polarity = polarity & GET_DMA_POLARITY(3); + control = mfdcr(DCRN_DMACR3); + break; + default: + return DMA_STATUS_BAD_CHANNEL; + } + + p_dma_ch->cp = GET_DMA_PRIORITY(control); + p_dma_ch->pwidth = GET_DMA_PW(control); + p_dma_ch->psc = GET_DMA_PSC(control); + p_dma_ch->pwc = GET_DMA_PWC(control); + p_dma_ch->phc = GET_DMA_PHC(control); + p_dma_ch->ce = GET_DMA_CE_ENABLE(control); + p_dma_ch->int_enable = GET_DMA_CIE_ENABLE(control); + p_dma_ch->shift = GET_DMA_PW(control); + +#ifdef CONFIG_PPC4xx_EDMA + p_dma_ch->pf = GET_DMA_PREFETCH(control); +#else + p_dma_ch->ch_enable = GET_DMA_CH(control); + p_dma_ch->ece_enable = GET_DMA_ECE(control); + p_dma_ch->tcd_disable = GET_DMA_TCD(control); +#endif + return DMA_STATUS_GOOD; +} + +/* + * Sets the priority for the DMA channel dmanr. + * Since this is setup by the hardware init function, this function + * can be used to dynamically change the priority of a channel. + * + * Acceptable priorities: + * + * PRIORITY_LOW + * PRIORITY_MID_LOW + * PRIORITY_MID_HIGH + * PRIORITY_HIGH + * + */ +int +ppc4xx_set_channel_priority(unsigned int dmanr, unsigned int priority) +{ + unsigned int control; + + if ((priority != PRIORITY_LOW) && + (priority != PRIORITY_MID_LOW) && + (priority != PRIORITY_MID_HIGH) && (priority != PRIORITY_HIGH)) { + printk("ppc4xx_set_channel_priority: bad priority: 0x%x\n", priority); + } + + switch (dmanr) { + case 0: + control = mfdcr(DCRN_DMACR0); + control |= SET_DMA_PRIORITY(priority); + mtdcr(DCRN_DMACR0, control); + break; + case 1: + control = mfdcr(DCRN_DMACR1); + control |= SET_DMA_PRIORITY(priority); + mtdcr(DCRN_DMACR1, control); + break; + case 2: + control = mfdcr(DCRN_DMACR2); + control |= SET_DMA_PRIORITY(priority); + mtdcr(DCRN_DMACR2, control); + break; + case 3: + control = mfdcr(DCRN_DMACR3); + control |= SET_DMA_PRIORITY(priority); + mtdcr(DCRN_DMACR3, control); + break; + default: + printk("ppc4xx_set_channel_priority: bad channel: %d\n", dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + return DMA_STATUS_GOOD; +} + +/* + * Returns the width of the peripheral attached to this channel. This assumes + * that someone who knows the hardware configuration, boot code or some other + * init code, already set the width. + * + * The return value is one of: + * PW_8 + * PW_16 + * PW_32 + * PW_64 + * + * The function returns 0 on error. + */ +unsigned int +ppc4xx_get_peripheral_width(unsigned int dmanr) +{ + unsigned int control; + + switch (dmanr) { + case 0: + control = mfdcr(DCRN_DMACR0); + break; + case 1: + control = mfdcr(DCRN_DMACR1); + break; + case 2: + control = mfdcr(DCRN_DMACR2); + break; + case 3: + control = mfdcr(DCRN_DMACR3); + break; + default: + printk("ppc4xx_get_peripheral_width: bad channel: %d\n", dmanr); + return 0; + } + return (GET_DMA_PW(control)); +} + + +EXPORT_SYMBOL(ppc4xx_init_dma_channel); +EXPORT_SYMBOL(ppc4xx_get_channel_config); +EXPORT_SYMBOL(ppc4xx_set_channel_priority); +EXPORT_SYMBOL(ppc4xx_get_peripheral_width); +EXPORT_SYMBOL(dma_channels); +EXPORT_SYMBOL(ppc4xx_set_src_addr); +EXPORT_SYMBOL(ppc4xx_set_dst_addr); +EXPORT_SYMBOL(ppc4xx_set_dma_addr); +EXPORT_SYMBOL(ppc4xx_set_dma_addr2); +EXPORT_SYMBOL(ppc4xx_enable_dma); +EXPORT_SYMBOL(ppc4xx_disable_dma); +EXPORT_SYMBOL(ppc4xx_set_dma_mode); +EXPORT_SYMBOL(ppc4xx_set_dma_count); +EXPORT_SYMBOL(ppc4xx_get_dma_residue); +EXPORT_SYMBOL(ppc4xx_enable_dma_interrupt); +EXPORT_SYMBOL(ppc4xx_disable_dma_interrupt); +EXPORT_SYMBOL(ppc4xx_get_dma_status); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/ppc4xx_sgdma.c linux-2.4.23-pre8/arch/ppc/kernel/ppc4xx_sgdma.c --- linux-2.4.22/arch/ppc/kernel/ppc4xx_sgdma.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/ppc4xx_sgdma.c 2003-10-22 22:49:38.000000000 +0000 @@ -0,0 +1,536 @@ +/* + * arch/ppc/kernel/ppc4xx_sgdma.c + * + * IBM PPC4xx DMA engine scatter/gather library + * + * Copyright 2002-2003 MontaVista Software Inc. + * + * Cleaned by Matt Porter + * + * Original code by Armin Kuster + * and Pete Popov + * + * 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. + * + * 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 + +static __inline__ void +ppc4xx_set_sg_addr(int dmanr, phys_addr_t sg_addr) +{ + switch (dmanr) { + case 0: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_ASGH0, (u32)(sg_addr >> 32)); +#endif + mtdcr(DCRN_ASG0, (u32)sg_addr); + break; + case 1: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_ASGH1, (u32)(sg_addr >> 32)); +#endif + mtdcr(DCRN_ASG1, (u32)sg_addr); + break; + case 2: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_ASGH2, (u32)(sg_addr >> 32)); +#endif + mtdcr(DCRN_ASG2, sg_addr); + break; + case 3: +#ifdef PPC4xx_DMA_64BIT + mtdcr(DCRN_ASGH3, (u32)(sg_addr >> 32)); +#endif + mtdcr(DCRN_ASG3, (u32)sg_addr); + break; + } +} + + +/* + * Add a new sgl descriptor to the end of a scatter/gather list + * which was created by alloc_dma_handle(). + * + * For a memory to memory transfer, both dma addresses must be + * valid. For a peripheral to memory transfer, one of the addresses + * must be set to NULL, depending on the direction of the transfer: + * memory to peripheral: set dst_addr to NULL, + * peripheral to memory: set src_addr to NULL. + */ +static __inline__ int +ppc4xx_add_dma_sgl(sgl_handle_t handle, phys_addr_t src_addr, phys_addr_t dst_addr, + unsigned int count) +{ + sgl_list_info_t *psgl = (sgl_list_info_t *) handle; + ppc_dma_ch_t *p_dma_ch; + + if (!handle) { + printk("ppc4xx_add_dma_sgl: null handle\n"); + return DMA_STATUS_BAD_HANDLE; + } + + if (psgl->dmanr >= MAX_PPC4xx_DMA_CHANNELS) { + printk("ppc4xx_add_dma_sgl: bad channel: %d\n", psgl->dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + + p_dma_ch = &dma_channels[psgl->dmanr]; + +#ifdef DEBUG_4xxDMA + { + int error = 0; + unsigned int aligned = + (unsigned) src_addr | (unsigned) dst_addr | count; + switch (p_dma_ch->pwidth) { + case PW_8: + break; + case PW_16: + if (aligned & 0x1) + error = 1; + break; + case PW_32: + if (aligned & 0x3) + error = 1; + break; + case PW_64: + if (aligned & 0x7) + error = 1; + break; + default: + printk("ppc4xx_add_dma_sgl: invalid bus width: 0x%x\n", + p_dma_ch->pwidth); + return DMA_STATUS_GENERAL_ERROR; + } + if (error) + printk + ("Alignment warning: ppc4xx_add_dma_sgl src 0x%x dst 0x%x count 0x%x bus width var %d\n", + src_addr, dst_addr, count, p_dma_ch->pwidth); + + } +#endif + + if ((unsigned) (psgl->ptail + 1) >= ((unsigned) psgl + SGL_LIST_SIZE)) { + printk("sgl handle out of memory \n"); + return DMA_STATUS_OUT_OF_MEMORY; + } + + if (!psgl->ptail) { + psgl->phead = (ppc_sgl_t *) + ((unsigned) psgl + sizeof (sgl_list_info_t)); + psgl->ptail = psgl->phead; + } else { + psgl->ptail->next = iopa((unsigned long)(psgl->ptail + 1)); + psgl->ptail++; + } + + psgl->ptail->control = psgl->control; + psgl->ptail->src_addr = src_addr; + psgl->ptail->dst_addr = dst_addr; + psgl->ptail->control_count = (count >> p_dma_ch->shift) | + psgl->sgl_control; + psgl->ptail->next = (uint32_t) NULL; + + return DMA_STATUS_GOOD; +} + +/* + * Enable (start) the DMA described by the sgl handle. + */ +static __inline__ void +ppc4xx_enable_dma_sgl(sgl_handle_t handle) +{ + sgl_list_info_t *psgl = (sgl_list_info_t *) handle; + ppc_dma_ch_t *p_dma_ch; + uint32_t sg_command; + + if (!handle) { + printk("ppc4xx_enable_dma_sgl: null handle\n"); + return; + } else if (psgl->dmanr > (MAX_PPC4xx_DMA_CHANNELS - 1)) { + printk("ppc4xx_enable_dma_sgl: bad channel in handle %d\n", + psgl->dmanr); + return; + } else if (!psgl->phead) { + printk("ppc4xx_enable_dma_sgl: sg list empty\n"); + return; + } + + p_dma_ch = &dma_channels[psgl->dmanr]; + psgl->ptail->control_count &= ~SG_LINK; /* make this the last dscrptr */ + sg_command = mfdcr(DCRN_ASGC); + + ppc4xx_set_sg_addr(psgl->dmanr, iopa((unsigned long)psgl->phead)); + + switch (psgl->dmanr) { + case 0: + sg_command |= SSG0_ENABLE; + break; + case 1: + sg_command |= SSG1_ENABLE; + break; + case 2: + sg_command |= SSG2_ENABLE; + break; + case 3: + sg_command |= SSG3_ENABLE; + break; + default: + printk("ppc4xx_enable_dma_sgl: bad channel: %d\n", psgl->dmanr); + } + + mtdcr(DCRN_ASGC, sg_command); /* start transfer */ +} + +/* + * Halt an active scatter/gather DMA operation. + */ +static __inline__ void +ppc4xx_disable_dma_sgl(sgl_handle_t handle) +{ + sgl_list_info_t *psgl = (sgl_list_info_t *) handle; + uint32_t sg_command; + + if (!handle) { + printk("ppc4xx_enable_dma_sgl: null handle\n"); + return; + } else if (psgl->dmanr > (MAX_PPC4xx_DMA_CHANNELS - 1)) { + printk("ppc4xx_enable_dma_sgl: bad channel in handle %d\n", + psgl->dmanr); + return; + } + + sg_command = mfdcr(DCRN_ASGC); + switch (psgl->dmanr) { + case 0: + sg_command &= ~SSG0_ENABLE; + break; + case 1: + sg_command &= ~SSG1_ENABLE; + break; + case 2: + sg_command &= ~SSG2_ENABLE; + break; + case 3: + sg_command &= ~SSG3_ENABLE; + break; + default: + printk("ppc4xx_enable_dma_sgl: bad channel: %d\n", psgl->dmanr); + } + + mtdcr(DCRN_ASGC, sg_command); /* stop transfer */ +} + +/* + * Returns number of bytes left to be transferred from the entire sgl list. + * *src_addr and *dst_addr get set to the source/destination address of + * the sgl descriptor where the DMA stopped. + * + * An sgl transfer must NOT be active when this function is called. + */ +static __inline__ int +ppc4xx_get_dma_sgl_residue(sgl_handle_t handle, phys_addr_t * src_addr, + phys_addr_t * dst_addr) +{ + sgl_list_info_t *psgl = (sgl_list_info_t *) handle; + ppc_dma_ch_t *p_dma_ch; + ppc_sgl_t *pnext, *sgl_addr; + uint32_t count_left; + + if (!handle) { + printk("ppc4xx_get_dma_sgl_residue: null handle\n"); + return DMA_STATUS_BAD_HANDLE; + } else if (psgl->dmanr > (MAX_PPC4xx_DMA_CHANNELS - 1)) { + printk("ppc4xx_get_dma_sgl_residue: bad channel in handle %d\n", + psgl->dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + + switch (psgl->dmanr) { + case 0: + sgl_addr = (ppc_sgl_t *) bus_to_virt(mfdcr(DCRN_ASG0)); + count_left = mfdcr(DCRN_DMACT0); + break; + case 1: + sgl_addr = (ppc_sgl_t *) bus_to_virt(mfdcr(DCRN_ASG1)); + count_left = mfdcr(DCRN_DMACT1); + break; + case 2: + sgl_addr = (ppc_sgl_t *) bus_to_virt(mfdcr(DCRN_ASG2)); + count_left = mfdcr(DCRN_DMACT2); + break; + case 3: + sgl_addr = (ppc_sgl_t *) bus_to_virt(mfdcr(DCRN_ASG3)); + count_left = mfdcr(DCRN_DMACT3); + break; + default: + printk("ppc4xx_get_dma_sgl_residue: bad channel %d\n", psgl->dmanr); + goto error; + } + + if (!sgl_addr) { + printk("ppc4xx_get_dma_sgl_residue: sgl addr register is null\n"); + goto error; + } + + pnext = psgl->phead; + while (pnext && + ((unsigned) pnext < ((unsigned) psgl + SGL_LIST_SIZE) && + (pnext != sgl_addr)) + ) { + pnext++; + } + + if (pnext == sgl_addr) { /* found the sgl descriptor */ + + *src_addr = pnext->src_addr; + *dst_addr = pnext->dst_addr; + + /* + * Now search the remaining descriptors and add their count. + * We already have the remaining count from this descriptor in + * count_left. + */ + pnext++; + + while ((pnext != psgl->ptail) && + ((unsigned) pnext < ((unsigned) psgl + SGL_LIST_SIZE)) + ) { + count_left += pnext->control_count & SG_COUNT_MASK; + } + + if (pnext != psgl->ptail) { /* should never happen */ + printk + ("ppc4xx_get_dma_sgl_residue error (1) psgl->ptail 0x%x handle 0x%x\n", + (unsigned int) psgl->ptail, (unsigned int) handle); + goto error; + } + + /* success */ + p_dma_ch = &dma_channels[psgl->dmanr]; + return (count_left << p_dma_ch->shift); /* count in bytes */ + + } else { + /* this shouldn't happen */ + printk + ("get_dma_sgl_residue, unable to match current address 0x%x, handle 0x%x\n", + (unsigned int) sgl_addr, (unsigned int) handle); + + } + + error: + *src_addr = (phys_addr_t) NULL; + *dst_addr = (phys_addr_t) NULL; + return 0; +} + +/* + * Returns the address(es) of the buffer(s) contained in the head element of + * the scatter/gather list. The element is removed from the scatter/gather + * list and the next element becomes the head. + * + * This function should only be called when the DMA is not active. + */ +static __inline__ int +ppc4xx_delete_dma_sgl_element(sgl_handle_t handle, phys_addr_t * src_dma_addr, + phys_addr_t * dst_dma_addr) +{ + sgl_list_info_t *psgl = (sgl_list_info_t *) handle; + + if (!handle) { + printk("ppc4xx_delete_sgl_element: null handle\n"); + return DMA_STATUS_BAD_HANDLE; + } else if (psgl->dmanr > (MAX_PPC4xx_DMA_CHANNELS - 1)) { + printk("ppc4xx_delete_sgl_element: bad channel in handle %d\n", + psgl->dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + + if (!psgl->phead) { + printk("ppc4xx_delete_sgl_element: sgl list empty\n"); + *src_dma_addr = (phys_addr_t) NULL; + *dst_dma_addr = (phys_addr_t) NULL; + return DMA_STATUS_SGL_LIST_EMPTY; + } + + *src_dma_addr = (phys_addr_t) psgl->phead->src_addr; + *dst_dma_addr = (phys_addr_t) psgl->phead->dst_addr; + + if (psgl->phead == psgl->ptail) { + /* last descriptor on the list */ + psgl->phead = NULL; + psgl->ptail = NULL; + } else { + psgl->phead++; + } + + return DMA_STATUS_GOOD; +} + + +/* + * Create a scatter/gather list handle. This is simply a structure which + * describes a scatter/gather list. + * + * A handle is returned in "handle" which the driver should save in order to + * be able to access this list later. A chunk of memory will be allocated + * to be used by the API for internal management purposes, including managing + * the sg list and allocating memory for the sgl descriptors. One page should + * be more than enough for that purpose. Perhaps it's a bit wasteful to use + * a whole page for a single sg list, but most likely there will be only one + * sg list per channel. + * + * Interrupt notes: + * Each sgl descriptor has a copy of the DMA control word which the DMA engine + * loads in the control register. The control word has a "global" interrupt + * enable bit for that channel. Interrupts are further qualified by a few bits + * in the sgl descriptor count register. In order to setup an sgl, we have to + * know ahead of time whether or not interrupts will be enabled at the completion + * of the transfers. Thus, enable_dma_interrupt()/disable_dma_interrupt() MUST + * be called before calling alloc_dma_handle(). If the interrupt mode will never + * change after powerup, then enable_dma_interrupt()/disable_dma_interrupt() + * do not have to be called -- interrupts will be enabled or disabled based + * on how the channel was configured after powerup by the hw_init_dma_channel() + * function. Each sgl descriptor will be setup to interrupt if an error occurs; + * however, only the last descriptor will be setup to interrupt. Thus, an + * interrupt will occur (if interrupts are enabled) only after the complete + * sgl transfer is done. + */ +int +ppc4xx_alloc_dma_handle(sgl_handle_t * phandle, unsigned int mode, unsigned int dmanr) +{ + sgl_list_info_t *psgl; + dma_addr_t dma_addr; + ppc_dma_ch_t *p_dma_ch = &dma_channels[dmanr]; + uint32_t sg_command; + void *ret; + + if (dmanr >= MAX_PPC4xx_DMA_CHANNELS) { + printk("ppc4xx_alloc_dma_handle: invalid channel 0x%x\n", dmanr); + return DMA_STATUS_BAD_CHANNEL; + } + + if (!phandle) { + printk("ppc4xx_alloc_dma_handle: null handle pointer\n"); + return DMA_STATUS_NULL_POINTER; + } + + /* Get a page of memory, which is zeroed out by consistent_alloc() */ + ret = consistent_alloc(GFP_KERNEL, DMA_PPC4xx_SIZE, &dma_addr); + if (ret != NULL) { + memset(ret, 0, DMA_PPC4xx_SIZE); + psgl = (sgl_list_info_t *) ret; + } + + if (psgl == NULL) { + *phandle = (sgl_handle_t) NULL; + return DMA_STATUS_OUT_OF_MEMORY; + } + + psgl->dma_addr = dma_addr; + psgl->dmanr = dmanr; + + /* + * Modify and save the control word. These words will be + * written to each sgl descriptor. The DMA engine then + * loads this control word into the control register + * every time it reads a new descriptor. + */ + psgl->control = p_dma_ch->control; + /* Clear all mode bits */ + psgl->control &= ~(DMA_TM_MASK | DMA_TD); + /* Save control word and mode */ + psgl->control |= (mode | DMA_CE_ENABLE); + + /* In MM mode, we must set ETD/TCE */ + if (mode == DMA_MODE_MM) + psgl->control |= DMA_ETD_OUTPUT | DMA_TCE_ENABLE; + + if (p_dma_ch->int_enable) { + /* Enable channel interrupt */ + psgl->control |= DMA_CIE_ENABLE; + } else { + psgl->control &= ~DMA_CIE_ENABLE; + } + + sg_command = mfdcr(DCRN_ASGC); + switch (dmanr) { + case 0: + sg_command |= SSG0_MASK_ENABLE; + break; + case 1: + sg_command |= SSG1_MASK_ENABLE; + break; + case 2: + sg_command |= SSG2_MASK_ENABLE; + break; + case 3: + sg_command |= SSG3_MASK_ENABLE; + break; + default: + printk("ppc4xx_alloc_dma_handle: bad channel: %d\n", dmanr); + ppc4xx_free_dma_handle((sgl_handle_t) psgl); + *phandle = (sgl_handle_t) NULL; + return DMA_STATUS_BAD_CHANNEL; + } + + /* Enable SGL control access */ + mtdcr(DCRN_ASGC, sg_command); + psgl->sgl_control = SG_ERI_ENABLE | SG_LINK; + + if (p_dma_ch->int_enable) { + if (p_dma_ch->tce_enable) + psgl->sgl_control |= SG_TCI_ENABLE; + else + psgl->sgl_control |= SG_ETI_ENABLE; + } + + *phandle = (sgl_handle_t) psgl; + return DMA_STATUS_GOOD; +} + +/* + * Destroy a scatter/gather list handle that was created by alloc_dma_handle(). + * The list must be empty (contain no elements). + */ +void +ppc4xx_free_dma_handle(sgl_handle_t handle) +{ + sgl_list_info_t *psgl = (sgl_list_info_t *) handle; + + if (!handle) { + printk("ppc4xx_free_dma_handle: got NULL\n"); + return; + } else if (psgl->phead) { + printk("ppc4xx_free_dma_handle: list not empty\n"); + return; + } else if (!psgl->dma_addr) { /* should never happen */ + printk("ppc4xx_free_dma_handle: no dma address\n"); + return; + } + + consistent_free((void *) psgl); +} + +EXPORT_SYMBOL(ppc4xx_alloc_dma_handle); +EXPORT_SYMBOL(ppc4xx_free_dma_handle); +EXPORT_SYMBOL(ppc4xx_add_dma_sgl); +EXPORT_SYMBOL(ppc4xx_delete_dma_sgl_element); +EXPORT_SYMBOL(ppc4xx_enable_dma_sgl); +EXPORT_SYMBOL(ppc4xx_disable_dma_sgl); +EXPORT_SYMBOL(ppc4xx_get_dma_sgl_residue); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/ppc_htab.c linux-2.4.23-pre8/arch/ppc/kernel/ppc_htab.c --- linux-2.4.22/arch/ppc/kernel/ppc_htab.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/ppc_htab.c 2003-10-22 22:47:38.000000000 +0000 @@ -113,7 +113,7 @@ { unsigned long mmcr0 = 0, pmc1 = 0, pmc2 = 0; int n = 0; -#ifdef CONFIG_PPC_STD_MMU +#if defined(CONFIG_PPC_STD_MMU) && !defined(CONFIG_PPC64BRIDGE) int valid; unsigned int kptes = 0, uptes = 0, zombie_ptes = 0; PTE *ptr; @@ -150,6 +150,7 @@ goto return_string; } +#ifndef CONFIG_PPC64BRIDGE for ( ptr = Hash ; ptr < Hash_end ; ptr++) { unsigned int ctx, mctx, vsid; @@ -177,6 +178,7 @@ if (!valid) zombie_ptes++; } +#endif n += sprintf( buffer + n, "PTE Hash Table Information\n" @@ -184,18 +186,22 @@ "Buckets\t\t: %lu\n" "Address\t\t: %08lx\n" "Entries\t\t: %lu\n" +#ifndef CONFIG_PPC64BRIDGE "User ptes\t: %u\n" "Kernel ptes\t: %u\n" "Zombies\t\t: %u\n" - "Percent full\t: %lu%%\n", - (unsigned long)(Hash_size>>10), + "Percent full\t: %lu%%\n" +#endif + , (unsigned long)(Hash_size>>10), (Hash_size/(sizeof(PTE)*8)), (unsigned long)Hash, - Hash_size/sizeof(PTE), - uptes, + Hash_size/sizeof(PTE) +#ifndef CONFIG_PPC64BRIDGE + , uptes, kptes, zombie_ptes, ((kptes+uptes)*100) / (Hash_size/sizeof(PTE)) +#endif ); n += sprintf( buffer + n, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/ppc_ksyms.c linux-2.4.23-pre8/arch/ppc/kernel/ppc_ksyms.c --- linux-2.4.22/arch/ppc/kernel/ppc_ksyms.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/ppc_ksyms.c 2003-10-22 22:49:35.000000000 +0000 @@ -159,11 +159,14 @@ EXPORT_SYMBOL(_outsw_ns); EXPORT_SYMBOL(_insl_ns); EXPORT_SYMBOL(_outsl_ns); +EXPORT_SYMBOL(iopa); +EXPORT_SYMBOL(mm_ptov); EXPORT_SYMBOL(ioremap); +#ifdef CONFIG_PTE_64BIT +EXPORT_SYMBOL(ioremap64); +#endif EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(iounmap); -EXPORT_SYMBOL(iopa); -EXPORT_SYMBOL(mm_ptov); #if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) \ || defined(CONFIG_USB_STORAGE) || defined(CONFIG_USB_STORAGE_MODULE) @@ -176,8 +179,23 @@ EXPORT_SYMBOL_NOVERS(pci_dram_offset); EXPORT_SYMBOL(pci_alloc_consistent); EXPORT_SYMBOL(pci_free_consistent); +EXPORT_SYMBOL(pci_bus_io_base); +EXPORT_SYMBOL(pci_bus_io_base_phys); +EXPORT_SYMBOL(pci_bus_mem_base_phys); +EXPORT_SYMBOL(pci_bus_to_hose); +EXPORT_SYMBOL(pci_resource_to_bus); +EXPORT_SYMBOL(pci_phys_to_bus); +EXPORT_SYMBOL(pci_bus_to_phys); #endif /* CONFIG_PCI */ +#ifdef CONFIG_NOT_COHERENT_CACHE +EXPORT_SYMBOL(consistent_alloc); +EXPORT_SYMBOL(consistent_free); +EXPORT_SYMBOL(consistent_sync); +EXPORT_SYMBOL(consistent_sync_page); +EXPORT_SYMBOL(flush_dcache_all); +#endif + EXPORT_SYMBOL(start_thread); EXPORT_SYMBOL(kernel_thread); @@ -253,15 +271,8 @@ EXPORT_SYMBOL(get_property); EXPORT_SYMBOL(request_OF_resource); EXPORT_SYMBOL(release_OF_resource); -EXPORT_SYMBOL(pci_bus_io_base); -EXPORT_SYMBOL(pci_bus_io_base_phys); -EXPORT_SYMBOL(pci_bus_mem_base_phys); EXPORT_SYMBOL(pci_device_to_OF_node); EXPORT_SYMBOL(pci_device_from_OF_node); -EXPORT_SYMBOL(pci_bus_to_hose); -EXPORT_SYMBOL(pci_resource_to_bus); -EXPORT_SYMBOL(pci_phys_to_bus); -EXPORT_SYMBOL(pci_bus_to_phys); EXPORT_SYMBOL(pmac_newworld); EXPORT_SYMBOL(nvram_read_byte); EXPORT_SYMBOL(nvram_write_byte); @@ -291,7 +302,7 @@ EXPORT_SYMBOL(abs); -#ifdef CONFIG_VGA_CONSOLE +#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_FB) EXPORT_SYMBOL(screen_info); #endif @@ -338,11 +349,14 @@ EXPORT_SYMBOL(debugger_fault_handler); #endif -#ifdef CONFIG_8xx +#if defined(CONFIG_8xx) || defined(CONFIG_4xx) EXPORT_SYMBOL(__res); +#endif +#ifdef CONFIG_8xx EXPORT_SYMBOL(cpm_install_handler); EXPORT_SYMBOL(cpm_free_handler); EXPORT_SYMBOL(m8xx_cpm_hostalloc); +EXPORT_SYMBOL(m8xx_cpm_dpalloc); #endif /* CONFIG_8xx */ /* Those should really be inline */ @@ -370,4 +384,3 @@ extern unsigned long agp_special_page; EXPORT_SYMBOL_NOVERS(agp_special_page); #endif /* defined(CONFIG_ALL_PPC) */ - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/process.c linux-2.4.23-pre8/arch/ppc/kernel/process.c --- linux-2.4.22/arch/ppc/kernel/process.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/process.c 2003-10-22 22:48:54.000000000 +0000 @@ -417,6 +417,7 @@ memset(current->thread.vr, 0, sizeof(current->thread.vr)); memset(¤t->thread.vscr, 0, sizeof(current->thread.vscr)); current->thread.vrsave = 0; + current->thread.used_vr = 0; #endif /* CONFIG_ALTIVEC */ } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/prom_init.c linux-2.4.23-pre8/arch/ppc/kernel/prom_init.c --- linux-2.4.22/arch/ppc/kernel/prom_init.c 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/prom_init.c 2003-10-22 22:49:35.000000000 +0000 @@ -638,6 +638,72 @@ } } +#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) { @@ -705,8 +771,7 @@ /* First get a handle for the stdout device */ prom = pp; - prom_chosen = call_prom("finddevice", 1, 1, - "/chosen"); + prom_chosen = call_prom("finddevice", 1, 1, "/chosen"); if (prom_chosen == (void *)-1) prom_exit(); if ((int) call_prom("getprop", 4, 1, prom_chosen, @@ -739,6 +804,14 @@ prom_instantiate_rtas(); +#ifdef CONFIG_POWER4 + /* + * Find out how much memory we have and allocate a + * suitably-sized hash table. + */ + prom_alloc_htab(); +#endif + mem = check_display(mem); prom_print("copying OF device tree..."); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/setup.c linux-2.4.23-pre8/arch/ppc/kernel/setup.c --- linux-2.4.22/arch/ppc/kernel/setup.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/setup.c 2003-10-22 22:49:41.000000000 +0000 @@ -152,12 +152,12 @@ return 0; pvr = cpu_data[i].pvr; lpj = cpu_data[i].loops_per_jiffy; - seq_printf(m, "processor\t: %lu\n", i); #else pvr = mfspr(PVR); lpj = loops_per_jiffy; #endif + seq_printf(m, "processor\t: %lu\n", i); seq_printf(m, "cpu\t\t: "); if (cur_cpu_spec[i]->pvr_mask) @@ -566,12 +566,10 @@ #if defined(CONFIG_KGDB) kgdb_map_scc(); set_debug_traps(); - if (strstr(cmd_line, "nokgdb")) - printk("kgdb default breakpoint deactivated on command line\n"); - else { + if (strstr(cmd_line, "gdb")) { if (ppc_md.progress) ppc_md.progress("setup_arch: kgdb breakpoint", 0x4000); - printk("kgdb default breakpoint activated\n"); + printk("kgdb breakpoint activated\n"); breakpoint(); } #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/signal.c linux-2.4.23-pre8/arch/ppc/kernel/signal.c --- linux-2.4.22/arch/ppc/kernel/signal.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/signal.c 2003-10-22 22:48:42.000000000 +0000 @@ -40,17 +40,7 @@ #define GP_REGS_SIZE MIN(sizeof(elf_gregset_t), sizeof(struct pt_regs)) -/* - * These are the flags in the MSR that the user is allowed to change - * by modifying the saved value of the MSR on the stack. SE and BE - * should not be in this list since gdb may want to change these. I.e, - * you should be able to step out of a signal handler to see what - * instruction executes next after the signal handler completes. - * Alternately, if you stepped into a signal handler, you should be - * able to continue 'til the next breakpoint from within the signal - * handler, even if the handler returns. - */ -#define MSR_USERCHANGE (MSR_FE0 | MSR_FE1) +extern void syscall_direct_return(struct pt_regs *regs); int do_signal(sigset_t *oldset, struct pt_regs *regs); @@ -157,9 +147,9 @@ int -sys_sigaltstack(const stack_t *uss, stack_t *uoss) +sys_sigaltstack(const stack_t *uss, stack_t *uoss, int r5, int r6, + int r7, int r8, struct pt_regs *regs) { - struct pt_regs *regs = (struct pt_regs *) &uss; return do_sigaltstack(uss, uoss, regs->gpr[1]); } @@ -199,378 +189,403 @@ * When we have signals to deliver, we set up on the * user stack, going down from the original stack pointer: * a sigregs struct - * one or more sigcontext structs with + * a sigcontext struct * a gap of __SIGNAL_FRAMESIZE bytes * * Each of these things must be a multiple of 16 bytes in size. * */ struct sigregs { - elf_gregset_t gp_regs; - double fp_regs[ELF_NFPREG]; - unsigned long tramp[2]; + struct mcontext mctx; /* all the register values */ /* Programs using the rs6000/xcoff abi can save up to 19 gp regs and 18 fp regs below sp before decrementing it. */ int abigap[56]; }; -struct rt_sigframe -{ - unsigned long _unused[2]; - struct siginfo *pinfo; - void *puc; - struct siginfo info; - struct ucontext uc; -}; - +/* We use the mc_pad field for the signal return trampoline. */ +#define tramp mc_pad /* * When we have rt signals to deliver, we set up on the * user stack, going down from the original stack pointer: - * a sigregs struct - * one rt_sigframe struct (siginfo + ucontext) - * a gap of __SIGNAL_FRAMESIZE bytes + * one rt_sigframe struct (siginfo + ucontext + ABI gap) + * a gap of __SIGNAL_FRAMESIZE+16 bytes + * (the +16 is to get the siginfo and ucontext in the same + * positions as in older kernels). * * Each of these things must be a multiple of 16 bytes in size. * */ -int sys_rt_sigreturn(struct pt_regs *regs) +struct rt_sigframe { - struct rt_sigframe *rt_sf; - struct sigcontext_struct sigctx; - struct sigregs *sr; - int ret; - elf_gregset_t saved_regs; /* an array of ELF_NGREG unsigned longs */ - sigset_t set; - stack_t st; - unsigned long prevsp; + struct siginfo info; + struct ucontext uc; + /* Programs using the rs6000/xcoff abi can save up to 19 gp regs + and 18 fp regs below sp before decrementing it. */ + int abigap[56]; +}; - rt_sf = (struct rt_sigframe *)(regs->gpr[1] + __SIGNAL_FRAMESIZE); - if (copy_from_user(&sigctx, &rt_sf->uc.uc_mcontext, sizeof(sigctx)) - || copy_from_user(&set, &rt_sf->uc.uc_sigmask, sizeof(set)) - || copy_from_user(&st, &rt_sf->uc.uc_stack, sizeof(st))) - goto badframe; - sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sigmask_lock); - current->blocked = set; - recalc_sigpending(current); - spin_unlock_irq(¤t->sigmask_lock); +/* + * Save the current user registers on the user stack. + * We only save the altivec registers if the process has used + * altivec instructions at some point. + */ +static int +save_user_regs(struct pt_regs *regs, struct mcontext *frame, int sigret) +{ + /* save general and floating-point registers */ if (regs->msr & MSR_FP) giveup_fpu(current); + if (__copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE) + || __copy_to_user(&frame->mc_fregs, current->thread.fpr, + ELF_NFPREG * sizeof(double))) + return 1; + + current->thread.fpscr = 0; /* turn off all fp exceptions */ - rt_sf++; /* Look at next rt_sigframe */ - if (rt_sf == (struct rt_sigframe *)(sigctx.regs)) { - /* Last stacked signal - restore registers - - * sigctx is initialized to point to the - * preamble frame (where registers are stored) - * see handle_signal() - */ - sr = (struct sigregs *) sigctx.regs; - if (copy_from_user(saved_regs, &sr->gp_regs, - sizeof(sr->gp_regs))) - goto badframe; - saved_regs[PT_MSR] = (regs->msr & ~MSR_USERCHANGE) - | (saved_regs[PT_MSR] & MSR_USERCHANGE); - memcpy(regs, saved_regs, GP_REGS_SIZE); - if (copy_from_user(current->thread.fpr, &sr->fp_regs, - sizeof(sr->fp_regs))) - goto badframe; - /* This function sets back the stack flags into - the current task structure. */ - sys_sigaltstack(&st, NULL); - - ret = regs->result; - } else { - /* More signals to go */ - /* Set up registers for next signal handler */ - regs->gpr[1] = (unsigned long)rt_sf - __SIGNAL_FRAMESIZE; - if (copy_from_user(&sigctx, &rt_sf->uc.uc_mcontext, sizeof(sigctx))) - goto badframe; - sr = (struct sigregs *) sigctx.regs; - regs->gpr[3] = ret = sigctx.signal; - /* Get the siginfo */ - get_user(regs->gpr[4], (unsigned long *)&rt_sf->pinfo); - /* Get the ucontext */ - get_user(regs->gpr[5], (unsigned long *)&rt_sf->puc); - regs->gpr[6] = (unsigned long) rt_sf; - - regs->link = (unsigned long) &sr->tramp; - regs->nip = sigctx.handler; - if (get_user(prevsp, &sr->gp_regs[PT_R1]) - || put_user(prevsp, (unsigned long *) regs->gpr[1])) - goto badframe; - current->thread.fpscr = 0; +#ifdef CONFIG_ALTIVEC + /* save altivec registers */ + if (current->thread.used_vr) { + if (regs->msr & MSR_VEC) + giveup_altivec(current); + if (__copy_to_user(&frame->mc_vregs, current->thread.vr, + ELF_NVRREG * sizeof(vector128))) + return 1; + /* set MSR_VEC in the saved MSR value to indicate that + frame->mc_vregs contains valid data */ + if (__put_user(regs->msr | MSR_VEC, &frame->mc_gregs[PT_MSR])) + return 1; + } + /* else assert((regs->msr & MSR_VEC) == 0) */ + + /* We always copy to/from vrsave, it's 0 if we don't have or don't + * use altivec. Since VSCR only contains 32 bits saved in the least + * significant bits of a vector, we "cheat" and stuff VRSAVE in the + * most significant bits of that same vector. --BenH + */ + if (__put_user(current->thread.vrsave, (u32 *)&frame->mc_vregs[32])) + return 1; +#endif /* CONFIG_ALTIVEC */ + + if (sigret) { + /* Set up the sigreturn trampoline: li r0,sigret; sc */ + if (__put_user(0x38000000UL + sigret, &frame->tramp[0]) + || __put_user(0x44000002UL, &frame->tramp[1])) + return 1; + flush_icache_range((unsigned long) &frame->tramp[0], + (unsigned long) &frame->tramp[2]); } - return ret; -badframe: - do_exit(SIGSEGV); + return 0; +} + +/* + * Restore the current user register values from the user stack, + * (except for MSR). + */ +static int +restore_user_regs(struct pt_regs *regs, struct mcontext *sr) +{ +#ifdef CONFIG_ALTIVEC + unsigned long msr; +#endif + + /* copy up to but not including MSR */ + if (__copy_from_user(regs, &sr->mc_gregs, PT_MSR * sizeof(elf_greg_t))) + return 1; + /* copy from orig_r3 (the word after the MSR) up to the end */ + if (__copy_from_user(®s->orig_gpr3, &sr->mc_gregs[PT_ORIG_R3], + GP_REGS_SIZE - PT_ORIG_R3 * sizeof(elf_greg_t))) + return 1; + + /* force the process to reload the FP registers from + current->thread when it next does FP instructions */ + regs->msr &= ~MSR_FP; + if (__copy_from_user(current->thread.fpr, &sr->mc_fregs, + sizeof(sr->mc_fregs))) + return 1; + +#ifdef CONFIG_ALTIVEC + /* force the process to reload the altivec registers from + current->thread when it next does altivec instructions */ + regs->msr &= ~MSR_VEC; + if (!__get_user(msr, &sr->mc_gregs[PT_MSR]) && (msr & MSR_VEC) != 0) { + /* restore altivec registers from the stack */ + if (__copy_from_user(current->thread.vr, &sr->mc_vregs, + sizeof(sr->mc_vregs))) + return 1; + } else if (current->thread.used_vr) + memset(¤t->thread.vr, 0, ELF_NVRREG * sizeof(vector128)); + + /* Always get VRSAVE back */ + if (__get_user(current->thread.vrsave, (u32 *)&sr->mc_vregs[32])) + return 1; +#endif /* CONFIG_ALTIVEC */ + + return 0; +} + +/* + * Restore the user process's signal mask + */ +static void +restore_sigmask(sigset_t *set) +{ + sigdelsetmask(set, ~_BLOCKABLE); + spin_lock_irq(¤t->sigmask_lock); + current->blocked = *set; + recalc_sigpending(current); + spin_unlock_irq(¤t->sigmask_lock); } +/* + * Set up a signal frame for a "real-time" signal handler + * (one which gets siginfo). + */ static void -setup_rt_frame(struct pt_regs *regs, struct sigregs *frame, - signed long newsp) +handle_rt_signal(unsigned long sig, struct k_sigaction *ka, + siginfo_t *info, sigset_t *oldset, struct pt_regs * regs, + unsigned long newsp) { - struct rt_sigframe *rt_sf = (struct rt_sigframe *) newsp; + struct rt_sigframe *rt_sf; + struct mcontext *frame; + unsigned long origsp = newsp; + + /* Set up Signal Frame */ + /* Put a Real Time Context onto stack */ + newsp -= sizeof(*rt_sf); + rt_sf = (struct rt_sigframe *) newsp; - /* Set up preamble frame */ - if (verify_area(VERIFY_WRITE, frame, sizeof(*frame))) + /* create a stack frame for the caller of the handler */ + newsp -= __SIGNAL_FRAMESIZE + 16; + + if (verify_area(VERIFY_WRITE, (void *) newsp, origsp - newsp)) goto badframe; - if (regs->msr & MSR_FP) - giveup_fpu(current); - if (__copy_to_user(&frame->gp_regs, regs, GP_REGS_SIZE) - || __copy_to_user(&frame->fp_regs, current->thread.fpr, - ELF_NFPREG * sizeof(double)) - /* Set up to return from user space. - It calls the sc exception at offset 0x9999 - for sys_rt_sigreturn(). - */ - || __put_user(0x38006666UL, &frame->tramp[0]) /* li r0,0x6666 */ - || __put_user(0x44000002UL, &frame->tramp[1])) /* sc */ + + /* Put the siginfo & fill in most of the ucontext */ + if (__copy_to_user(&rt_sf->info, info, sizeof(*info)) + || __put_user(0, &rt_sf->uc.uc_flags) + || __put_user(0, &rt_sf->uc.uc_link) + || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp) + || __put_user(sas_ss_flags(regs->gpr[1]), + &rt_sf->uc.uc_stack.ss_flags) + || __put_user(current->sas_ss_size, &rt_sf->uc.uc_stack.ss_size) + || __put_user(&rt_sf->uc.uc_mcontext, &rt_sf->uc.uc_regs) + || __copy_to_user(&rt_sf->uc.uc_sigmask, oldset, sizeof(*oldset))) goto badframe; - flush_icache_range((unsigned long) &frame->tramp[0], - (unsigned long) &frame->tramp[2]); - current->thread.fpscr = 0; /* turn off all fp exceptions */ - /* Retrieve rt_sigframe from stack and - set up registers for signal handler - */ - newsp -= __SIGNAL_FRAMESIZE; - if (put_user(regs->gpr[1], (unsigned long *)newsp) - || get_user(regs->nip, &rt_sf->uc.uc_mcontext.handler) - || get_user(regs->gpr[3], &rt_sf->uc.uc_mcontext.signal) - || get_user(regs->gpr[4], (unsigned long *)&rt_sf->pinfo) - || get_user(regs->gpr[5], (unsigned long *)&rt_sf->puc)) + /* Save user registers on the stack */ + frame = &rt_sf->uc.uc_mcontext; + if (save_user_regs(regs, frame, 0x6666)) goto badframe; + if (put_user(regs->gpr[1], (unsigned long *)newsp)) + goto badframe; regs->gpr[1] = newsp; + regs->gpr[3] = sig; + regs->gpr[4] = (unsigned long) &rt_sf->info; + regs->gpr[5] = (unsigned long) &rt_sf->uc; regs->gpr[6] = (unsigned long) rt_sf; + regs->nip = (unsigned long) ka->sa.sa_handler; regs->link = (unsigned long) frame->tramp; return; badframe: #if DEBUG_SIG - printk("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n", + printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n", regs, frame, newsp); #endif - do_exit(SIGSEGV); + if (sig == SIGSEGV) + ka->sa.sa_handler = SIG_DFL; + force_sig(SIGSEGV, current); } -/* - * Do a signal return; undo the signal stack. - */ -int sys_sigreturn(struct pt_regs *regs) +static int do_setcontext(struct ucontext *ucp, struct pt_regs *regs) { - struct sigcontext_struct *sc, sigctx; - struct sigregs *sr; - int ret; - elf_gregset_t saved_regs; /* an array of ELF_NGREG unsigned longs */ sigset_t set; - unsigned long prevsp; + struct mcontext *mcp; - sc = (struct sigcontext_struct *)(regs->gpr[1] + __SIGNAL_FRAMESIZE); - if (copy_from_user(&sigctx, sc, sizeof(sigctx))) - goto badframe; + if (__copy_from_user(&set, &ucp->uc_sigmask, sizeof(set)) + || __get_user(mcp, &ucp->uc_regs)) + return -EFAULT; + restore_sigmask(&set); + if (restore_user_regs(regs, mcp)) + return -EFAULT; - set.sig[0] = sigctx.oldmask; -#if _NSIG_WORDS > 1 - set.sig[1] = sigctx._unused[3]; -#endif - sigdelsetmask(&set, ~_BLOCKABLE); - spin_lock_irq(¤t->sigmask_lock); - current->blocked = set; - recalc_sigpending(current); - spin_unlock_irq(¤t->sigmask_lock); - if (regs->msr & MSR_FP ) - giveup_fpu(current); + return 0; +} + +int sys_swapcontext(struct ucontext *old_ctx, struct ucontext *new_ctx, + int r5, int r6, int r7, int r8, struct pt_regs *regs) +{ + unsigned char tmp; - sc++; /* Look at next sigcontext */ - if (sc == (struct sigcontext_struct *)(sigctx.regs)) { - /* Last stacked signal - restore registers */ - sr = (struct sigregs *) sigctx.regs; - if (copy_from_user(saved_regs, &sr->gp_regs, - sizeof(sr->gp_regs))) - goto badframe; - saved_regs[PT_MSR] = (regs->msr & ~MSR_USERCHANGE) - | (saved_regs[PT_MSR] & MSR_USERCHANGE); - memcpy(regs, saved_regs, GP_REGS_SIZE); - - if (copy_from_user(current->thread.fpr, &sr->fp_regs, - sizeof(sr->fp_regs))) - goto badframe; - - ret = regs->result; - - } else { - /* More signals to go */ - regs->gpr[1] = (unsigned long)sc - __SIGNAL_FRAMESIZE; - if (copy_from_user(&sigctx, sc, sizeof(sigctx))) - goto badframe; - sr = (struct sigregs *) sigctx.regs; - regs->gpr[3] = ret = sigctx.signal; - regs->gpr[4] = (unsigned long) sc; - regs->link = (unsigned long) &sr->tramp; - regs->nip = sigctx.handler; - - if (get_user(prevsp, &sr->gp_regs[PT_R1]) - || put_user(prevsp, (unsigned long *) regs->gpr[1])) - goto badframe; - current->thread.fpscr = 0; + if (old_ctx != NULL) { + if (verify_area(VERIFY_WRITE, old_ctx, sizeof(*old_ctx)) + || save_user_regs(regs, &old_ctx->uc_mcontext, 0) + || __copy_to_user(&old_ctx->uc_sigmask, + ¤t->blocked, sizeof(sigset_t)) + || __put_user(&old_ctx->uc_mcontext, &old_ctx->uc_regs)) + return -EFAULT; } - return ret; + if (new_ctx == NULL) + return 0; + if (verify_area(VERIFY_READ, new_ctx, sizeof(*new_ctx)) + || __get_user(tmp, (u8 *) new_ctx) + || __get_user(tmp, (u8 *) (new_ctx + 1) - 1)) + return -EFAULT; -badframe: - do_exit(SIGSEGV); + /* + * If we get a fault copying the context into the kernel's + * image of the user's registers, we can't just return -EFAULT + * because the user's registers will be corrupted. For instance + * the NIP value may have been updated but not some of the + * other registers. Given that we have done the verify_area + * and successfully read the first and last bytes of the region + * above, this should only happen in an out-of-memory situation + * or if another thread unmaps the region containing the context. + * We kill the task with a SIGSEGV in this situation. + */ + if (do_setcontext(new_ctx, regs)) + do_exit(SIGSEGV); + syscall_direct_return(regs); + /* doesn't actually return back to here */ + return 0; +} + +int sys_rt_sigreturn(struct pt_regs *regs) +{ + struct rt_sigframe *rt_sf; + stack_t st; + + rt_sf = (struct rt_sigframe *)(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16); + if (verify_area(VERIFY_READ, rt_sf, sizeof(struct rt_sigframe))) + goto bad; + if (do_setcontext(&rt_sf->uc, regs)) + goto bad; + + /* + * It's not clear whether or why it is desirable to save the + * sigaltstack setting on signal delivery and restore it on + * signal return. But other architectures do this and we have + * always done it up until now so it is probably better not to + * change it. -- paulus + */ + if (__copy_from_user(&st, &rt_sf->uc.uc_stack, sizeof(st))) + goto bad; + do_sigaltstack(&st, NULL, regs->gpr[1]); + + return regs->result; + + bad: + force_sig(SIGSEGV, current); + return 0; } /* - * Set up a signal frame. + * OK, we're invoking a handler */ static void -setup_frame(struct pt_regs *regs, struct sigregs *frame, - unsigned long newsp) +handle_signal(unsigned long sig, struct k_sigaction *ka, + siginfo_t *info, sigset_t *oldset, struct pt_regs * regs, + unsigned long newsp) { - struct sigcontext_struct *sc = (struct sigcontext_struct *) newsp; + struct sigcontext *sc; + struct sigregs *frame; + unsigned long origsp = newsp; + + /* Set up Signal Frame */ + newsp -= sizeof(struct sigregs); + frame = (struct sigregs *) newsp; + + /* Put a sigcontext on the stack */ + newsp -= sizeof(*sc); + sc = (struct sigcontext *) newsp; + + /* create a stack frame for the caller of the handler */ + newsp -= __SIGNAL_FRAMESIZE; - if (verify_area(VERIFY_WRITE, frame, sizeof(*frame))) + if (verify_area(VERIFY_WRITE, (void *) newsp, origsp - newsp)) goto badframe; - if (regs->msr & MSR_FP) - giveup_fpu(current); - if (__copy_to_user(&frame->gp_regs, regs, GP_REGS_SIZE) - || __copy_to_user(&frame->fp_regs, current->thread.fpr, - ELF_NFPREG * sizeof(double)) - || __put_user(0x38007777UL, &frame->tramp[0]) /* li r0,0x7777 */ - || __put_user(0x44000002UL, &frame->tramp[1])) /* sc */ + +#if _NSIG != 64 +#error "Please adjust handle_signal()" +#endif + if (__put_user((unsigned long) ka->sa.sa_handler, &sc->handler) + || __put_user(oldset->sig[0], &sc->oldmask) + || __put_user(oldset->sig[1], &sc->_unused[3]) + || __put_user((struct pt_regs *)frame, &sc->regs) + || __put_user(sig, &sc->signal)) goto badframe; - flush_icache_range((unsigned long) &frame->tramp[0], - (unsigned long) &frame->tramp[2]); - current->thread.fpscr = 0; /* turn off all fp exceptions */ - newsp -= __SIGNAL_FRAMESIZE; - if (put_user(regs->gpr[1], (unsigned long *)newsp) - || get_user(regs->nip, &sc->handler) - || get_user(regs->gpr[3], &sc->signal)) + if (save_user_regs(regs, &frame->mctx, 0x7777)) + goto badframe; + + if (put_user(regs->gpr[1], (unsigned long *)newsp)) goto badframe; regs->gpr[1] = newsp; + regs->gpr[3] = sig; regs->gpr[4] = (unsigned long) sc; - regs->link = (unsigned long) frame->tramp; + regs->nip = (unsigned long) ka->sa.sa_handler; + regs->link = (unsigned long) frame->mctx.tramp; return; badframe: #if DEBUG_SIG - printk("badframe in setup_frame, regs=%p frame=%p newsp=%lx\n", - regs, frame, newsp); + printk("badframe in handle_signal, regs=%p frame=%lx newsp=%lx\n", + regs, frame, *newspp); #endif - do_exit(SIGSEGV); + if (sig == SIGSEGV) + ka->sa.sa_handler = SIG_DFL; + force_sig(SIGSEGV, current); } /* - * OK, we're invoking a handler + * Do a signal return; undo the signal stack. */ -static void -handle_signal(unsigned long sig, struct k_sigaction *ka, - siginfo_t *info, sigset_t *oldset, struct pt_regs * regs, - unsigned long *newspp, unsigned long frame) +int sys_sigreturn(struct pt_regs *regs) { - struct sigcontext_struct *sc; - struct rt_sigframe *rt_sf; + struct sigcontext *sc, sigctx; + struct mcontext *sr; + int ret; + sigset_t set; - if (regs->trap == 0x0C00 /* System Call! */ - && ((int)regs->result == -ERESTARTNOHAND || - ((int)regs->result == -ERESTARTSYS && - !(ka->sa.sa_flags & SA_RESTART)))) - regs->result = -EINTR; + sc = (struct sigcontext *)(regs->gpr[1] + __SIGNAL_FRAMESIZE); + if (copy_from_user(&sigctx, sc, sizeof(sigctx))) + goto badframe; - /* Set up Signal Frame */ - if (ka->sa.sa_flags & SA_SIGINFO) { - /* Put a Real Time Context onto stack */ - *newspp -= sizeof(*rt_sf); - rt_sf = (struct rt_sigframe *) *newspp; - if (verify_area(VERIFY_WRITE, rt_sf, sizeof(*rt_sf))) - goto badframe; - - if (__put_user((unsigned long) ka->sa.sa_handler, &rt_sf->uc.uc_mcontext.handler) - || __put_user(&rt_sf->info, &rt_sf->pinfo) - || __put_user(&rt_sf->uc, &rt_sf->puc) - /* Put the siginfo */ - || __copy_to_user(&rt_sf->info, info, sizeof(*info)) - /* Create the ucontext */ - || __put_user(0, &rt_sf->uc.uc_flags) - || __put_user(0, &rt_sf->uc.uc_link) - || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp) - || __put_user(sas_ss_flags(regs->gpr[1]), - &rt_sf->uc.uc_stack.ss_flags) - || __put_user(current->sas_ss_size, &rt_sf->uc.uc_stack.ss_size) - || __copy_to_user(&rt_sf->uc.uc_sigmask, oldset, sizeof(*oldset)) - /* mcontext.regs points to preamble register frame */ - || __put_user((struct pt_regs *)frame, &rt_sf->uc.uc_mcontext.regs) - || __put_user(sig, &rt_sf->uc.uc_mcontext.signal)) - goto badframe; - } else { - /* Put another sigcontext on the stack */ - *newspp -= sizeof(*sc); - sc = (struct sigcontext_struct *) *newspp; - if (verify_area(VERIFY_WRITE, sc, sizeof(*sc))) - goto badframe; - - if (__put_user((unsigned long) ka->sa.sa_handler, &sc->handler) - || __put_user(oldset->sig[0], &sc->oldmask) -#if _NSIG_WORDS > 1 - || __put_user(oldset->sig[1], &sc->_unused[3]) -#endif - || __put_user((struct pt_regs *)frame, &sc->regs) - || __put_user(sig, &sc->signal)) - goto badframe; - } + set.sig[0] = sigctx.oldmask; + set.sig[1] = sigctx._unused[3]; + restore_sigmask(&set); - if (ka->sa.sa_flags & SA_ONESHOT) - ka->sa.sa_handler = SIG_DFL; + sr = (struct mcontext *) sigctx.regs; + if (verify_area(VERIFY_READ, sr, sizeof(*sr)) + || restore_user_regs(regs, sr)) + goto badframe; - if (!(ka->sa.sa_flags & SA_NODEFER)) { - spin_lock_irq(¤t->sigmask_lock); - sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); - sigaddset(¤t->blocked,sig); - recalc_sigpending(current); - spin_unlock_irq(¤t->sigmask_lock); - } - return; + ret = regs->result; + + return ret; badframe: -#if DEBUG_SIG - printk("badframe in handle_signal, regs=%p frame=%lx newsp=%lx\n", - regs, frame, *newspp); - printk("sc=%p sig=%d ka=%p info=%p oldset=%p\n", sc, sig, ka, info, oldset); -#endif - do_exit(SIGSEGV); -} + force_sig(SIGSEGV, current); + return 0; +} -/* - * Note that 'init' is a special process: it doesn't get signals it doesn't - * want to handle. Thus you cannot kill init even with a SIGKILL even by - * mistake. - */ -int do_signal(sigset_t *oldset, struct pt_regs *regs) +static int get_signal_to_deliver(struct siginfo *infop, struct pt_regs *regs) { - siginfo_t info; struct k_sigaction *ka; - unsigned long frame, newsp; - - if (!oldset) - oldset = ¤t->blocked; - - newsp = frame = 0; + int signr; for (;;) { - unsigned long signr; - spin_lock_irq(¤t->sigmask_lock); - signr = dequeue_signal(¤t->blocked, &info); + signr = dequeue_signal(¤t->blocked, infop); spin_unlock_irq(¤t->sigmask_lock); if (!signr) - break; + return 0; if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) { /* Let the debugger run. */ @@ -589,17 +604,17 @@ continue; /* Update the siginfo structure. Is this good? */ - if (signr != info.si_signo) { - info.si_signo = signr; - info.si_errno = 0; - info.si_code = SI_USER; - info.si_pid = current->p_pptr->pid; - info.si_uid = current->p_pptr->uid; + if (signr != infop->si_signo) { + infop->si_signo = signr; + infop->si_errno = 0; + infop->si_code = SI_USER; + infop->si_pid = current->p_pptr->pid; + infop->si_uid = current->p_pptr->uid; } /* If the (new) signal is now blocked, requeue it. */ if (sigismember(¤t->blocked, signr)) { - send_sig_info(signr, &info, current); + send_sig_info(signr, infop, current); continue; } } @@ -646,39 +661,85 @@ /* FALLTHRU */ default: - sig_exit(signr, exit_code, &info); + sig_exit(signr, exit_code, infop); /* NOTREACHED */ } } + return signr; + } +} - if ( (ka->sa.sa_flags & SA_ONSTACK) - && (! on_sig_stack(regs->gpr[1]))) - newsp = (current->sas_ss_sp + current->sas_ss_size); - else - newsp = regs->gpr[1]; - newsp = frame = newsp - sizeof(struct sigregs); - - /* Whee! Actually deliver the signal. */ - handle_signal(signr, ka, &info, oldset, regs, &newsp, frame); - break; - } - - if (regs->trap == 0x0C00 /* System Call! */ && - ((int)regs->result == -ERESTARTNOHAND || - (int)regs->result == -ERESTARTSYS || - (int)regs->result == -ERESTARTNOINTR)) { - regs->gpr[3] = regs->orig_gpr3; - regs->nip -= 4; /* Back up & retry system call */ - regs->result = 0; +/* + * Note that 'init' is a special process: it doesn't get signals it doesn't + * want to handle. Thus you cannot kill init even with a SIGKILL even by + * mistake. + */ +int do_signal(sigset_t *oldset, struct pt_regs *regs) +{ + siginfo_t info; + struct k_sigaction *ka; + unsigned long frame, newsp; + int signr; + + if (!oldset) + oldset = ¤t->blocked; + + newsp = frame = 0; + + signr = get_signal_to_deliver(&info, regs); + + ka = (signr == 0)? NULL: ¤t->sig->action[signr-1]; + + if (regs->trap == 0xc00) { /* system call */ + switch ((int) regs->result) { + case -ERESTARTSYS: + if (signr == 0 || (ka->sa.sa_flags & SA_RESTART)) + goto retry; + /* fall through */ + case -ERESTARTNOHAND: + if (signr > 0) { + /* make the system call return an EINTR */ + regs->result = -EINTR; + break; + } + /* fall through */ + case -ERESTARTNOINTR: + retry: + /* Back up & retry system call */ + regs->gpr[3] = regs->orig_gpr3; + regs->nip -= 4; + regs->result = 0; + break; + } } - if (newsp == frame) + if (signr == 0) return 0; /* no signals delivered */ + if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size + && !on_sig_stack(regs->gpr[1])) + newsp = current->sas_ss_sp + current->sas_ss_size; + else + newsp = regs->gpr[1]; + newsp &= ~0xfUL; + + /* Whee! Actually deliver the signal. */ if (ka->sa.sa_flags & SA_SIGINFO) - setup_rt_frame(regs, (struct sigregs *) frame, newsp); + handle_rt_signal(signr, ka, &info, oldset, regs, newsp); else - setup_frame(regs, (struct sigregs *) frame, newsp); + handle_signal(signr, ka, &info, oldset, regs, newsp); + + if (ka->sa.sa_flags & SA_ONESHOT) + ka->sa.sa_handler = SIG_DFL; + + if (!(ka->sa.sa_flags & SA_NODEFER)) { + spin_lock_irq(¤t->sigmask_lock); + sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); + sigaddset(¤t->blocked, signr); + recalc_sigpending(current); + spin_unlock_irq(¤t->sigmask_lock); + } + return 1; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/syscalls.c linux-2.4.23-pre8/arch/ppc/kernel/syscalls.c --- linux-2.4.22/arch/ppc/kernel/syscalls.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/syscalls.c 2003-10-22 22:49:43.000000000 +0000 @@ -57,7 +57,7 @@ * This is really horribly ugly. */ int -sys_ipc (uint call, int first, int second, int third, void *ptr, long fifth) +sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth) { int version, ret; @@ -67,24 +67,28 @@ ret = -EINVAL; switch (call) { case SEMOP: - ret = sys_semop (first, (struct sembuf *)ptr, second); + ret = sys_semtimedop(first, (struct sembuf *)ptr, second, NULL); + break; + case SEMTIMEDOP: + ret = sys_semtimedop(first, (struct sembuf *)ptr, second, + (const struct timespec *)fifth); break; case SEMGET: - ret = sys_semget (first, second, third); + ret = sys_semget(first, second, third); break; case SEMCTL: { union semun fourth; if (!ptr) break; - if ((ret = verify_area (VERIFY_READ, ptr, sizeof(long))) + if ((ret = verify_area(VERIFY_READ, ptr, sizeof(long))) || (ret = get_user(fourth.__pad, (void **)ptr))) break; - ret = sys_semctl (first, second, third, fourth); + ret = sys_semctl(first, second, third, fourth); break; } case MSGSND: - ret = sys_msgsnd (first, (struct msgbuf *) ptr, second, third); + ret = sys_msgsnd(first, (struct msgbuf *) ptr, second, third); break; case MSGRCV: switch (version) { @@ -93,26 +97,26 @@ if (!ptr) break; - if ((ret = verify_area (VERIFY_READ, ptr, sizeof(tmp))) + if ((ret = verify_area(VERIFY_READ, ptr, sizeof(tmp))) || (ret = copy_from_user(&tmp, (struct ipc_kludge *) ptr, sizeof (tmp)))) break; - ret = sys_msgrcv (first, tmp.msgp, second, tmp.msgtyp, - third); + ret = sys_msgrcv(first, tmp.msgp, second, tmp.msgtyp, + third); break; } default: - ret = sys_msgrcv (first, (struct msgbuf *) ptr, - second, fifth, third); + ret = sys_msgrcv(first, (struct msgbuf *) ptr, + second, fifth, third); break; } break; case MSGGET: - ret = sys_msgget ((key_t) first, second); + ret = sys_msgget((key_t) first, second); break; case MSGCTL: - ret = sys_msgctl (first, second, (struct msqid_ds *) ptr); + ret = sys_msgctl(first, second, (struct msqid_ds *) ptr); break; case SHMAT: switch (version) { @@ -122,29 +126,31 @@ if ((ret = verify_area(VERIFY_WRITE, (ulong*) third, sizeof(ulong)))) break; - ret = sys_shmat (first, (char *) ptr, second, &raddr); + ret = sys_shmat(first, (char *) ptr, second, &raddr); if (ret) break; - ret = put_user (raddr, (ulong *) third); + ret = put_user(raddr, (ulong *) third); break; } case 1: /* iBCS2 emulator entry point */ if (!segment_eq(get_fs(), get_ds())) break; - ret = sys_shmat (first, (char *) ptr, second, - (ulong *) third); + ret = sys_shmat(first, (char *) ptr, second, + (ulong *) third); break; } break; case SHMDT: - ret = sys_shmdt ((char *)ptr); + ret = sys_shmdt((char *)ptr); break; case SHMGET: - ret = sys_shmget (first, second, third); + ret = sys_shmget(first, second, third); break; case SHMCTL: - ret = sys_shmctl (first, second, (struct shmid_ds *) ptr); + ret = sys_shmctl(first, second, (struct shmid_ds *) ptr); break; + default: + ret = -ENOSYS; } return ret; @@ -167,6 +173,16 @@ return error; } +#ifndef CONFIG_40x +#define allow_mmap_address(addr) 1 +#else +/* Blech. On 40x allowing mmap() (MAP_FIXED) at the first few pages + * of (any process's) virtual memory is a security hole due to chip + * erratum #67 (and possibly also due to the (documented) bizarre + * prefetch behaviour around 'sc' see S3.8.2.1 of the user manual). */ +#define allow_mmap_address(addr) ((((addr) & PAGE_MASK) >= 0x2100) || suser()) +#endif + static inline unsigned long do_mmap2(unsigned long addr, size_t len, unsigned long prot, unsigned long flags, @@ -181,6 +197,10 @@ goto out; } + ret = -EINVAL; + if ((! allow_mmap_address(addr)) && (flags & MAP_FIXED)) + goto out; + down_write(¤t->mm->mmap_sem); ret = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); up_write(¤t->mm->mmap_sem); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/kernel/traps.c linux-2.4.23-pre8/arch/ppc/kernel/traps.c --- linux-2.4.22/arch/ppc/kernel/traps.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/kernel/traps.c 2003-10-22 22:48:00.000000000 +0000 @@ -1,5 +1,5 @@ /* - * linux/arch/ppc/kernel/traps.c + * arch/ppc/kernel/traps.c * * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) * @@ -173,6 +173,10 @@ #define REASON_PRIVILEGED ESR_PPR #define REASON_TRAP ESR_PTR +/* single-step stuff */ +#define single_stepping(regs) (current->thread.dbcr0 & DBCR0_IC) +#define clear_single_step(regs) (current->thread.dbcr0 &= ~DBCR0_IC) + #else /* On non-4xx, the reason for the machine check or program exception is in the MSR. */ @@ -181,6 +185,9 @@ #define REASON_ILLEGAL 0x80000 #define REASON_PRIVILEGED 0x40000 #define REASON_TRAP 0x20000 + +#define single_stepping(regs) ((regs)->msr & MSR_SE) +#define clear_single_step(regs) ((regs)->msr &= ~MSR_SE) #endif void @@ -320,6 +327,22 @@ return retval; } +/* + * After we have successfully emulated an instruction, we have to + * check if the instruction was being single-stepped, and if so, + * pretend we got a single-step exception. This was pointed out + * by Kumar Gala. -- paulus + */ +static void emulate_single_step(struct pt_regs *regs) +{ + if (single_stepping(regs)) { + clear_single_step(regs); + if (debugger_sstep(regs)) + return; + _exception(SIGTRAP, regs, TRAP_TRACE, 0); + } +} + void ProgramCheckException(struct pt_regs *regs) { @@ -334,8 +357,10 @@ * hardware people - not sure if it can happen on any illegal * instruction or only on FP instructions, whether there is a * pattern to occurences etc. -dgibson 31/Mar/2003 */ - if (!(reason & REASON_TRAP) && do_mathemu(regs) == 0) + if (!(reason & REASON_TRAP) && do_mathemu(regs) == 0) { + emulate_single_step(regs); return; + } #endif /* CONFIG_MATH_EMULATION */ if (reason & REASON_FP) { @@ -371,8 +396,10 @@ if (reason & REASON_PRIVILEGED) { /* Try to emulate it if we should. */ - if (emulate_instruction(regs) == 0) + if (emulate_instruction(regs) == 0) { + emulate_single_step(regs); return; + } _exception(SIGILL, regs, ILL_PRVOPC, regs->nip); return; } @@ -397,6 +424,7 @@ fixed = fix_alignment(regs); if (fixed == 1) { regs->nip += 4; /* skip over emulated instruction */ + emulate_single_step(regs); return; } if (fixed == -EFAULT) { @@ -453,11 +481,12 @@ _exception(SIGSEGV, regs, 0, 0); else _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); - } + } else + emulate_single_step(regs); } #endif /* CONFIG_8xx */ -#if defined(CONFIG_4xx) +#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) void DebugException(struct pt_regs *regs) { @@ -484,17 +513,28 @@ _exception(SIGTRAP, regs, 0, 0); } } -#endif /* CONFIG_4xx */ +#endif /* CONFIG_4xx || CONFIG_BOOKE */ #if !defined(CONFIG_TAU_INT) void TAUException(struct pt_regs *regs) { - printk("TAU trap at PC: %lx, SR: %lx, vector=%lx %s\n", + printk("Thermal trap at PC: %lx, SR: %lx, vector=%lx %s\n", regs->nip, regs->msr, regs->trap, print_tainted()); } #endif /* CONFIG_INT_TAU */ +#ifdef CONFIG_ALTIVEC +void +AltivecAssistException(struct pt_regs *regs) +{ + if (regs->msr & MSR_VEC) + giveup_altivec(current); + /* XXX quick hack for now: set the non-Java bit in the VSCR */ + current->thread.vscr.u[3] |= 0x10000; +} +#endif /* CONFIG_ALTIVEC */ + void __init trap_init(void) { } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/44x_mmu.c linux-2.4.23-pre8/arch/ppc/mm/44x_mmu.c --- linux-2.4.22/arch/ppc/mm/44x_mmu.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/44x_mmu.c 2003-10-22 22:48:26.000000000 +0000 @@ -0,0 +1,142 @@ +/* + * Modifications by Matt Porter (mporter@mvista.com) to support + * PPC44x Book E processors. + * + * This file contains the routines for initializing the MMU + * on the 4xx series of chips. + * -- paulus + * + * Derived from arch/ppc/mm/init.c: + * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) + * + * Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au) + * and Cort Dougan (PReP) (cort@cs.nmt.edu) + * Copyright (C) 1996 Paul Mackerras + * Amiga/APUS changes by Jesper Skov (jskov@cygnus.co.uk). + * + * Derived from "arch/i386/mm/init.c" + * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds + * + * 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 +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mmu_decl.h" +#include "mem_pieces.h" + +extern char etext[], _stext[]; +extern struct mem_pieces phys_avail; + +/* Used by the 44x TLB replacement exception handler. + * Just needed it declared someplace. + */ +unsigned int tlb_44x_index = 0; +unsigned int tlb_44x_hwater = 61; + +/* + * "Pins" a 256MB TLB entry in AS0 for kernel lowmem + */ +static void __init +ppc44x_pin_tlb(int slot, unsigned int virt, unsigned int phys) +{ + unsigned long attrib; + + __asm__ __volatile__("\ + clrrwi %2,%2,10\n\ + ori %2,%2,%4\n\ + clrrwi %1,%1,10\n\ + li %0,0\n\ + ori %0,%0,%5\n\ + tlbwe %2,%3,%6\n\ + tlbwe %1,%3,%7\n\ + 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_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G), + "i" (PPC44x_TLB_PAGEID), + "i" (PPC44x_TLB_XLAT), + "i" (PPC44x_TLB_ATTRIB)); +} + +/* + * Configure PPC44x TLB for AS0 exception processing. + */ +static void __init +ppc44x_tlb_config(void) +{ + unsigned int pinned_tlbs = 1; + int i; + + /* + * If lowmem is not on a pin tlb entry size boundary, + * then reserve the last page of system memory. This + * eliminates the possibility of a speculative dcache + * fetch past the end of system memory that would + * result in a machine check exception. + */ + if (total_lowmem & (PPC44x_PIN_SIZE - 1)) + mem_pieces_remove(&phys_avail, total_lowmem - PAGE_SIZE, PAGE_SIZE, 1); + + /* Determine number of entries necessary to cover lowmem */ + pinned_tlbs = (unsigned int) + (_ALIGN(total_lowmem, PPC44x_PIN_SIZE) >> PPC44x_PIN_SHIFT); + + /* Write upper watermark to save location */ + tlb_44x_hwater = PPC44x_LOW_SLOT - pinned_tlbs; + + /* If necessary, set additional pinned TLBs */ + if (pinned_tlbs > 1) + for (i = (PPC44x_LOW_SLOT-(pinned_tlbs-1)); i < PPC44x_LOW_SLOT; i++) { + unsigned int phys_addr = (PPC44x_LOW_SLOT-i) * PPC44x_PIN_SIZE; + ppc44x_pin_tlb(i, phys_addr+PAGE_OFFSET, phys_addr); + } + + /* Make sure vmalloc doesn't use virtual space covered by + the last pinned TLB entry. */ + vmalloc_start = KERNELBASE + _ALIGN(total_lowmem, PPC44x_PIN_SIZE); +} + +/* + * MMU_init_hw does the chip-specific initialization of the MMU hardware. + */ +void __init MMU_init_hw(void) +{ + flush_instruction_cache(); + + ppc44x_tlb_config(); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/Makefile linux-2.4.23-pre8/arch/ppc/mm/Makefile --- linux-2.4.22/arch/ppc/mm/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/Makefile 2003-10-22 22:49:17.000000000 +0000 @@ -19,6 +19,7 @@ obj-$(CONFIG_PPC_STD_MMU) += hashtable.o ppc_mmu.o tlb.o obj-$(CONFIG_40x) += 4xx_mmu.o +obj-$(CONFIG_44x) += 44x_mmu.o obj-$(CONFIG_NOT_COHERENT_CACHE) += cachemap.o include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/cachemap.c linux-2.4.23-pre8/arch/ppc/mm/cachemap.c --- linux-2.4.22/arch/ppc/mm/cachemap.c 2003-06-13 14:51:31.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/cachemap.c 2003-10-22 22:49:51.000000000 +0000 @@ -11,6 +11,7 @@ * is the virtual address and 'dma_handle' is the physical address. * Mostly stolen from the ARM port, with some changes for PowerPC. * -- Dan + * Modified for 36-bit support. -Matt * * 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 @@ -48,14 +49,24 @@ #include #include -extern int get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep); +#include "mmu_decl.h" +extern int map_page(unsigned long va, phys_addr_t pa, int flags); + +/* This function will allocate the requested contiguous pages and + * map them into the kernel's vmalloc() space. This is done so we + * get unique mapping for these pages, outside of the kernel's 1:1 + * virtual:physical mapping. This is necessary so we can cover large + * portions of the kernel with single large page TLB entries, and + * still get unique uncached pages for consistent DMA. + */ void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle) { - int order, rsize; - unsigned long page; - void *ret; - pte_t *pte; + int order, err, i; + unsigned long page, va, flags; + phys_addr_t pa; + struct vm_struct *area; + void *ret; if (in_interrupt()) BUG(); @@ -77,23 +88,41 @@ */ invalidate_dcache_range(page, page + size); - ret = (void *)page; - *dma_handle = virt_to_bus(ret); + /* Allocate some common virtual space to map the new pages. + */ + area = get_vm_area(size, VM_ALLOC); + if (area == 0) { + free_pages(page, order); + return NULL; + } + va = VMALLOC_VMADDR(area->addr); + ret = (void *)va; - /* Chase down all of the PTEs and mark them uncached. + /* This gives us the real physical address of the first page. */ - rsize = (int)size; - while (rsize > 0) { - if (get_pteptr(&init_mm, page, &pte)) { - pte_val(*pte) |= _PAGE_NO_CACHE | _PAGE_GUARDED; - flush_tlb_page(find_vma(&init_mm,page),page); - } - else { - BUG(); - return NULL; - } - page += PAGE_SIZE; - rsize -= PAGE_SIZE; + *dma_handle = pa = virt_to_bus((void *)page); + + flags = _PAGE_KERNEL | _PAGE_NO_CACHE; + + /* + * Set refcount=1 on all pages in an order>0 + * allocation so that vfree() will actually + * free all pages that were allocated. + */ + if (order > 0) + { + struct page *rpage = virt_to_page(page); + for (i = 1; i < (1 << order); i++) + set_page_count(rpage+i, 1); + } + + err = 0; + for (i = 0; i < size && err == 0; i += PAGE_SIZE) + err = map_page(va+i, pa+i, flags); + + if (err) { + vfree((void *)va); + return NULL; } return ret; @@ -101,42 +130,12 @@ /* * free page(s) as defined by the above mapping. - * The caller has to tell us the size so we can free the proper number - * of pages. We can't vmalloc() a new space for these pages and simply - * call vfree() like some other architectures because we could end up - * with aliased cache lines (or at least a cache line with the wrong - * attributes). This can happen when the PowerPC speculative loads - * across page boundaries. */ -void consistent_free(void *vaddr, size_t size) +void consistent_free(void *vaddr) { - int order, rsize; - unsigned long addr; - pte_t *pte; - if (in_interrupt()) BUG(); - - size = PAGE_ALIGN(size); - order = get_order(size); - - /* Chase down all of the PTEs and mark them cached again. - */ - addr = (unsigned long)vaddr; - rsize = (int)size; - while (rsize > 0) { - if (get_pteptr(&init_mm, addr, &pte)) { - pte_val(*pte) &= ~(_PAGE_NO_CACHE | _PAGE_GUARDED); - flush_tlb_page(find_vma(&init_mm,addr),addr); - } - else { - BUG(); - return; - } - addr += PAGE_SIZE; - rsize -= PAGE_SIZE; - } - free_pages((unsigned long)vaddr, order); + vfree(vaddr); } /* @@ -161,3 +160,17 @@ break; } } + +/* + * consistent_sync_page make a page are consistent. identical + * to consistent_sync, but takes a struct page instead of a virtual address + */ + +void consistent_sync_page(struct page *page, unsigned long offset, +size_t size, int direction) +{ + void *start; + + start = page_address(page) + offset; + consistent_sync(start, size, direction); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/fault.c linux-2.4.23-pre8/arch/ppc/mm/fault.c --- linux-2.4.22/arch/ppc/mm/fault.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/fault.c 2003-10-22 22:48:20.000000000 +0000 @@ -100,7 +100,7 @@ struct mm_struct *mm = current->mm; siginfo_t info; int code = SEGV_MAPERR; -#if defined(CONFIG_4xx) +#if defined(CONFIG_4xx) || defined (CONFIG_BOOKE) int is_write = error_code & ESR_DST; #else int is_write = 0; @@ -115,14 +115,14 @@ error_code &= 0x48200000; else is_write = error_code & 0x02000000; -#endif /* CONFIG_4xx */ +#endif /* CONFIG_4xx || CONFIG_BOOKE */ #if defined(CONFIG_XMON) || defined(CONFIG_KGDB) if (debugger_fault_handler && regs->trap == 0x300) { debugger_fault_handler(regs); return; } -#if !defined(CONFIG_4xx) +#ifndef CONFIG_4xx if (error_code & 0x00400000) { /* DABR match */ if (debugger_dabr_match(regs)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/init.c linux-2.4.23-pre8/arch/ppc/mm/init.c --- linux-2.4.22/arch/ppc/mm/init.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/init.c 2003-10-22 22:48:11.000000000 +0000 @@ -46,6 +46,31 @@ #include "mem_pieces.h" #include "mmu_decl.h" +/* + * Just any arbitrary offset to the start of the vmalloc VM area: the + * current 64MB value just means that there will be a 64MB "hole" after the + * physical memory until the kernel virtual memory starts. That means that + * any out-of-bounds memory accesses will hopefully be caught. + * The vmalloc() routines leaves a hole of 4kB between each vmalloced + * area for the same reason. ;) + * + * We no longer map larger than phys RAM with the BATs so we don't have + * to worry about the VMALLOC_OFFSET causing problems. We do have to worry + * about clashes between our early calls to ioremap() that start growing down + * from ioremap_base being run into the VM area allocations (growing upwards + * from VMALLOC_START). For this reason we have ioremap_bot to check when + * we actually run into our mappings setup in the early boot with the VM + * system. This really does become a problem for machines with good amounts + * of RAM. -- Cort + */ +#ifdef CONFIG_PIN_TLB +#define VMALLOC_OFFSET (0x2000000) /* 32M */ +#else +#define VMALLOC_OFFSET (0x1000000) /* 16M */ +#endif + +unsigned long vmalloc_start; + mmu_gather_t mmu_gathers[NR_CPUS]; unsigned long total_memory; @@ -313,6 +338,7 @@ total_lowmem = total_memory; adjust_total_lowmem(); set_phys_avail(total_lowmem); + vmalloc_start = KERNELBASE + total_lowmem; /* Initialize the MMU hardware */ if (ppc_md.progress) @@ -459,6 +485,9 @@ totalram_pages += free_all_bootmem(); + /* adjust vmalloc_start */ + vmalloc_start = (vmalloc_start + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1); + #ifdef CONFIG_BLK_DEV_INITRD /* if we are booted from BootX with an initial ramdisk, make sure the ramdisk pages aren't reserved. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/mmu_context.c linux-2.4.23-pre8/arch/ppc/mm/mmu_context.c --- linux-2.4.22/arch/ppc/mm/mmu_context.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/mmu_context.c 2003-10-22 22:49:01.000000000 +0000 @@ -3,9 +3,6 @@ * PowerPC implementations where the MMU substantially follows the * architecture specification. This includes the 6xx, 7xx, 7xxx, * 8260, and POWER3 implementations but excludes the 8xx and 4xx. - * Although the iSeries hardware does comply with the architecture - * specification, the need to work through the hypervisor makes - * things sufficiently different that it is handled elsewhere. * -- paulus * * Derived from arch/ppc/mm/init.c: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/mmu_decl.h linux-2.4.23-pre8/arch/ppc/mm/mmu_decl.h --- linux-2.4.22/arch/ppc/mm/mmu_decl.h 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/mmu_decl.h 2003-10-22 22:48:59.000000000 +0000 @@ -21,11 +21,12 @@ */ #include +#include extern void mapin_ram(void); extern void bat_mapin_ram(unsigned long bat2, unsigned long bat3); extern void adjust_total_lowmem(void); -extern int map_page(unsigned long va, unsigned long pa, int flags); +extern int map_page(unsigned long va, phys_addr_t pa, int flags); extern void setbat(int index, unsigned long virt, unsigned long phys, unsigned int size, int flags); extern void reserve_phys_mem(unsigned long start, unsigned long size); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/pgtable.c linux-2.4.23-pre8/arch/ppc/mm/pgtable.c --- linux-2.4.22/arch/ppc/mm/pgtable.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/pgtable.c 2003-10-22 22:47:58.000000000 +0000 @@ -37,10 +37,11 @@ unsigned long ioremap_bot; int io_bat_index; -/* Maximum 768Mb of lowmem. On SMP, this value will be - * trimmed down to whatever can be covered by BATs though. +/* The maximum lowmem defaults to 768Mb, but this can be configured to + * another value. On SMP, this value will be trimmed down to whatever + * can be covered by BATs. */ -#define MAX_LOW_MEM 0x30000000 +#define MAX_LOW_MEM CONFIG_LOWMEM_SIZE #ifndef CONFIG_SMP struct pgtable_cache_struct quicklists; @@ -67,16 +68,35 @@ #define p_mapped_by_bats(x) (0UL) #endif /* HAVE_BATS */ +#ifdef CONFIG_PTE_64BIT void * -ioremap(unsigned long addr, unsigned long size) +ioremap(phys_addr_t addr, unsigned long size) +{ + phys_addr_t addr64 = fixup_bigphys_addr(addr, size);; + + return ioremap64(addr64, size); +} + +void * +ioremap64(unsigned long long addr, unsigned long size) +{ + return __ioremap(addr, size, _PAGE_NO_CACHE); +} + +#else /* !CONFIG_PTE_64BIT */ + +void * +ioremap(phys_addr_t addr, unsigned long size) { return __ioremap(addr, size, _PAGE_NO_CACHE); } +#endif /* CONFIG_PTE_64BIT */ void * -__ioremap(unsigned long addr, unsigned long size, unsigned long flags) +__ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) { - unsigned long p, v, i; + unsigned long v, i; + phys_addr_t p; int err; /* @@ -101,7 +121,7 @@ */ if ( mem_init_done && (p < virt_to_phys(high_memory)) ) { - printk("__ioremap(): phys addr %0lx is RAM lr %p\n", p, + printk("__ioremap(): phys addr "PTE_FMT" is RAM lr %p\n", p, __builtin_return_address(0)); return NULL; } @@ -152,7 +172,7 @@ } out: - return (void *) (v + (addr & ~PAGE_MASK)); + return (void *) (v + ((unsigned long)addr & ~PAGE_MASK)); } void iounmap(void *addr) @@ -168,7 +188,7 @@ } int -map_page(unsigned long va, unsigned long pa, int flags) +map_page(unsigned long va, phys_addr_t pa, int flags) { pmd_t *pd; pte_t *pg; @@ -308,7 +328,7 @@ * virt, phys, size must all be page-aligned. * This should only be called before ioremap is called. */ -void __init io_block_mapping(unsigned long virt, unsigned long phys, +void __init io_block_mapping(unsigned long virt, phys_addr_t phys, unsigned int size, int flags) { int i; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/mm/ppc_mmu.c linux-2.4.23-pre8/arch/ppc/mm/ppc_mmu.c --- linux-2.4.22/arch/ppc/mm/ppc_mmu.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/mm/ppc_mmu.c 2003-10-22 22:47:49.000000000 +0000 @@ -3,9 +3,6 @@ * PowerPC implementations where the MMU substantially follows the * architecture specification. This includes the 6xx, 7xx, 7xxx, * 8260, and POWER3 implementations but excludes the 8xx and 4xx. - * Although the iSeries hardware does comply with the architecture - * specification, the need to work through the hypervisor makes - * things sufficiently different that it is handled elsewhere. * -- paulus * * Derived from arch/ppc/mm/init.c: @@ -181,6 +178,17 @@ #define MIN_N_HPTEG 1024 /* min 64kB hash table */ #endif +#ifdef CONFIG_POWER4 + /* The hash table has already been allocated and initialized + in prom.c */ + n_hpteg = Hash_size >> LG_HPTEG_SIZE; + lg_n_hpteg = __ilog2(n_hpteg); + + /* Remove the hash table from the available memory */ + if (Hash) + reserve_phys_mem(__pa(Hash), Hash_size); + +#else /* CONFIG_POWER4 */ /* * Allow 1 HPTE (1/8 HPTEG) for each page of memory. * This is less than the recommended amount, but then @@ -204,6 +212,7 @@ cacheable_memzero(Hash, Hash_size); _SDR1 = __pa(Hash) | SDR1_LOW_BITS; Hash_end = (PTE *) ((unsigned long)Hash + Hash_size); +#endif /* CONFIG_POWER4 */ printk("Total memory = %ldMB; using %ldkB for hash table (at %p)\n", total_memory >> 20, Hash_size >> 10, Hash); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/Makefile linux-2.4.23-pre8/arch/ppc/platforms/Makefile --- linux-2.4.22/arch/ppc/platforms/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/Makefile 2003-10-22 22:49:58.000000000 +0000 @@ -26,9 +26,15 @@ O_TARGET := platform.o -export-objs := prep_setup.o +export-objs := prep_setup.o ibm440gp.o ibm440gx.o -obj-$(CONFIG_WALNUT) += walnut.o ibm405gp.o +obj-$(CONFIG_405GP) += ibm405gp.o +obj-$(CONFIG_440GP) += ibm440gp.o +obj-$(CONFIG_440GX) += ibm440gx.o + +obj-$(CONFIG_EBONY) += ebony.o +obj-$(CONFIG_OCOTEA) += ocotea.o +obj-$(CONFIG_WALNUT) += walnut.o obj-$(CONFIG_APUS) += apus_setup.o ifeq ($(CONFIG_APUS),y) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/dbox2.h linux-2.4.23-pre8/arch/ppc/platforms/dbox2.h --- linux-2.4.22/arch/ppc/platforms/dbox2.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/dbox2.h 2003-10-22 22:47:37.000000000 +0000 @@ -0,0 +1,24 @@ +/* + * D-BOX2 board specific definitions + * + * Copyright (c) 2001-2002 Florian Schirmer (jolt@tuxbox.org) + */ + +#ifndef __MACH_DBOX2_H +#define __MACH_DBOX2_H + +#include + +#include + +#define DBOX2_IMMR_BASE 0xFF000000 /* phys. addr of IMMR */ +#define DBOX2_IMAP_SIZE (64 * 1024) /* size of mapped area */ + +#define IMAP_ADDR DBOX2_IMMR_BASE /* physical base address of IMMR area */ +#define IMAP_SIZE DBOX2_IMAP_SIZE /* mapped size of IMMR area */ + +/* We don't use the 8259. +*/ +#define NR_8259_INTS 0 + +#endif /* __MACH_DBOX2_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/ebony.c linux-2.4.23-pre8/arch/ppc/platforms/ebony.c --- linux-2.4.22/arch/ppc/platforms/ebony.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/ebony.c 2003-10-22 22:47:56.000000000 +0000 @@ -0,0 +1,534 @@ +/* + * arch/ppc/platforms/ebony.c + * + * Ebony board specific routines + * + * Matt Porter + * + * Copyright 2002-2003 MontaVista Software Inc. + * + * 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 +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +extern void abort(void); +extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode); +extern int pckbd_getkeycode(unsigned int scancode); +extern int pckbd_translate(unsigned char scancode, unsigned char *keycode, + char raw_mode); +extern void gen550_progress(char *, unsigned short); +extern void gen550_init(int, struct serial_struct *); + +/* + * Ebony IRQ triggering/polarity settings + */ +static u_char ebony_IRQ_initsenses[] __initdata = { + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 0: UART 0 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 1: UART 1 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 2: IIC 0 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 3: IIC 1 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 4: PCI Inb Mess */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 5: PCI Cmd Wrt */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 6: PCI PM */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 7: PCI MSI 0 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 8: PCI MSI 1 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 9: PCI MSI 2 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 10: MAL TX EOB */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 11: MAL RX EOB */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 12: DMA Chan 0 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 13: DMA Chan 1 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 14: DMA Chan 2 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 15: DMA Chan 3 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 16: Reserved */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 17: Reserved */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 18: GPT Timer 0 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 19: GPT Timer 1 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 20: GPT Timer 2 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 21: GPT Timer 3 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 22: GPT Timer 4 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 23: Ext Int 0 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 24: Ext Int 1 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 25: Ext Int 2 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 26: Ext Int 3 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 27: Ext Int 4 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_NEGATIVE), /* 28: Ext Int 5 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 29: Ext Int 6 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 30: UIC1 NC Int */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 31: UIC1 Crit Int */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 32: MAL SERR */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 33: MAL TXDE */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 34: MAL RXDE */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 35: ECC Unc Err */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 36: ECC Corr Err */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 37: Ext Bus Ctrl */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 38: Ext Bus Mstr */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 39: OPB->PLB */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 40: PCI MSI 3 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 41: PCI MSI 4 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 42: PCI MSI 5 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 43: PCI MSI 6 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 44: PCI MSI 7 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 45: PCI MSI 8 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 46: PCI MSI 9 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 47: PCI MSI 10 */ + (IRQ_SENSE_EDGE | IRQ_POLARITY_POSITIVE), /* 48: PCI MSI 11 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 49: PLB Perf Mon */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 50: Ext Int 7 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 51: Ext Int 8 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 52: Ext Int 9 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 53: Ext Int 10 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 54: Ext Int 11 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE), /* 55: Ext Int 12 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 56: Ser ROM Err */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 57: Reserved */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 58: Reserved */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 59: PCI Async Err */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 60: EMAC 0 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 61: EMAC 0 WOL */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 62: EMAC 1 */ + (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE), /* 63: EMAC 1 WOL */ +}; + +/* Global Variables */ +unsigned char __res[sizeof (bd_t)]; + +static void __init +ebony_calibrate_decr(void) +{ + unsigned int freq; + + /* + * Determine system clock speed + * + * If we are on Rev. B silicon, then use + * default external system clock. If we are + * on Rev. C silicon then errata forces us to + * use the internal clock. + */ + switch (PVR_REV(mfspr(PVR))) { + case PVR_REV(PVR_440GP_RB): + freq = EBONY_440GP_RB_SYSCLK; + break; + case PVR_REV(PVR_440GP_RC1): + default: + freq = EBONY_440GP_RC_SYSCLK; + break; + } + + tb_ticks_per_jiffy = freq / HZ; + tb_to_us = mulhwu_scale_factor(freq, 1000000); + + /* Set the time base to zero */ + mtspr(SPRN_TBWL, 0); + mtspr(SPRN_TBWU, 0); + + /* Clear any pending timer interrupts */ + mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS); + + /* Enable decrementer interrupt */ + mtspr(SPRN_TCR, TCR_DIE); +} + +static int +ebony_show_cpuinfo(struct seq_file *m) +{ + seq_printf(m, "vendor\t\t: IBM\n"); + seq_printf(m, "machine\t\t: Ebony\n"); + + return 0; +} + +static inline int +ebony_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) +{ + static char pci_irq_table[][4] = + /* + * PCI IDSEL/INTPIN->INTLINE + * A B C D + */ + { + { 23, 23, 23, 23 }, /* IDSEL 1 - PCI Slot 0 */ + { 24, 24, 24, 24 }, /* IDSEL 2 - PCI Slot 1 */ + { 25, 25, 25, 25 }, /* IDSEL 3 - PCI Slot 2 */ + { 26, 26, 26, 26 }, /* IDSEL 4 - PCI Slot 3 */ + }; + + const long min_idsel = 1, max_idsel = 4, irqs_per_slot = 4; + return PCI_IRQ_TABLE_LOOKUP; +} + +#define PCIX_READW(offset) \ + (readw((u32)pcix_reg_base+offset)) + +#define PCIX_WRITEW(value, offset) \ + (writew(value, (u32)pcix_reg_base+offset)) + +#define PCIX_WRITEL(value, offset) \ + (writel(value, (u32)pcix_reg_base+offset)) + +/* + * FIXME: This is only here to "make it work". This will move + * to a ibm_pcix.c which will contain a generic IBM PCIX bridge + * configuration library. -Matt + */ +static void __init +ebony_setup_pcix(void) +{ + void *pcix_reg_base; + + pcix_reg_base = ioremap64(PCIX0_REG_BASE, PCIX0_REG_SIZE); + + /* Enable PCIX0 I/O, Mem, and Busmaster cycles */ + PCIX_WRITEW(PCIX_READW(PCIX0_COMMAND) | PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER, PCIX0_COMMAND); + + /* Disable all windows */ + PCIX_WRITEL(0, PCIX0_POM0SA); + PCIX_WRITEL(0, PCIX0_POM1SA); + PCIX_WRITEL(0, PCIX0_POM2SA); + PCIX_WRITEL(0, PCIX0_PIM0SA); + PCIX_WRITEL(0, PCIX0_PIM1SA); + PCIX_WRITEL(0, PCIX0_PIM2SA); + + /* Setup 2GB PLB->PCI outbound mem window (3_8000_0000->0_8000_0000) */ + PCIX_WRITEL(0x00000003, PCIX0_POM0LAH); + PCIX_WRITEL(0x80000000, PCIX0_POM0LAL); + PCIX_WRITEL(0x00000000, PCIX0_POM0PCIAH); + PCIX_WRITEL(0x80000000, PCIX0_POM0PCIAL); + PCIX_WRITEL(0x80000001, PCIX0_POM0SA); + + /* Setup 2GB PCI->PLB inbound memory window at 0, enable MSIs */ + PCIX_WRITEL(0x00000000, PCIX0_PIM0LAH); + PCIX_WRITEL(0x00000000, PCIX0_PIM0LAL); + PCIX_WRITEL(0xe0000007, PCIX0_PIM0SA); + + eieio(); +} + +static void __init +ebony_setup_hose(void) +{ + struct pci_controller *hose; + + /* Configure windows on the PCI-X host bridge */ + ebony_setup_pcix(); + + hose = pcibios_alloc_controller(); + + if (!hose) + return; + + hose->first_busno = 0; + hose->last_busno = 0xff; + + hose->pci_mem_offset = EBONY_PCI_MEM_OFFSET; + + pci_init_resource(&hose->io_resource, + EBONY_PCI_LOWER_IO, + EBONY_PCI_UPPER_IO, + IORESOURCE_IO, + "PCI host bridge"); + + pci_init_resource(&hose->mem_resources[0], + EBONY_PCI_LOWER_MEM, + EBONY_PCI_UPPER_MEM, + IORESOURCE_MEM, + "PCI host bridge"); + + hose->io_space.start = EBONY_PCI_LOWER_IO; + hose->io_space.end = EBONY_PCI_UPPER_IO; + hose->mem_space.start = EBONY_PCI_LOWER_MEM; + hose->mem_space.end = EBONY_PCI_UPPER_MEM; + isa_io_base = + (unsigned long)ioremap64(EBONY_PCI_IO_BASE, EBONY_PCI_IO_SIZE); + hose->io_base_virt = (void *)isa_io_base; + + setup_indirect_pci(hose, + EBONY_PCI_CFGA_PLB32, + EBONY_PCI_CFGD_PLB32); + hose->set_cfg_type = 1; + + hose->last_busno = pciauto_bus_scan(hose, hose->first_busno); + + ppc_md.pci_swizzle = common_swizzle; + ppc_md.pci_map_irq = ebony_map_irq; +} + +TODC_ALLOC(); + +static void __init +ebony_early_serial_map(void) +{ + struct serial_struct serial_req; + + /* Setup ioremapped serial port access */ + memset(&serial_req, 0, sizeof(serial_req)); + serial_req.line = 0; + serial_req.baud_base = BASE_BAUD; + serial_req.port = 0; + serial_req.irq = 0; + serial_req.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; + serial_req.io_type = SERIAL_IO_MEM; + serial_req.iomem_base = ioremap64(PPC440GP_UART0_ADDR, 8); + serial_req.iomem_reg_shift = 0; + +#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB) + /* Configure debug serial access */ + gen550_init(0, &serial_req); +#endif + + if (early_serial_setup(&serial_req) != 0) { + printk("Early serial init of port 0 failed\n"); + } + + /* Assume early_serial_setup() doesn't modify serial_req */ + serial_req.line = 1; + serial_req.port = 1; + serial_req.irq = 1; + serial_req.iomem_base = ioremap64(PPC440GP_UART1_ADDR, 8); + +#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB) + /* Configure debug serial access */ + gen550_init(1, &serial_req); +#endif + + if (early_serial_setup(&serial_req) != 0) { + printk("Early serial init of port 1 failed\n"); + } +} + +static void __init +ebony_setup_arch(void) +{ + unsigned char * vpd_base; + struct ibm440gp_clocks clocks; + bd_t *bip = (bd_t *) __res; + +#if !defined(CONFIG_BDI_SWITCH) + /* + * The Abatron BDI JTAG debugger does not tolerate others + * mucking with the debug registers. + */ + mtspr(SPRN_DBCR0, (DBCR0_TDE | DBCR0_IDM)); +#endif + + /* Retrieve MAC addresses */ + vpd_base = ioremap64(EBONY_VPD_BASE, EBONY_VPD_SIZE); + memcpy(bip->bi_enetaddr[0],EBONY_NA0_ADDR(vpd_base),6); + memcpy(bip->bi_enetaddr[1],EBONY_NA1_ADDR(vpd_base),6); + + /* + * Determine various clocks. + * To be completely correct we should get SysClk + * from FPGA, because it can be changed by on-board switches + * --ebs + */ + ibm440gp_get_clocks(&clocks, 33333333, 6 * 1843200); + bip->bi_opb_busfreq = clocks.opb; + + /* Use IIC in standard (100 kHz) mode */ + bip->bi_iic_fast[0] = bip->bi_iic_fast[1] = 0; + + /* Setup TODC access */ + TODC_INIT(TODC_TYPE_DS1743, + 0, + 0, + ioremap64(EBONY_RTC_ADDR, EBONY_RTC_SIZE), + 8); + + /* init to some ~sane value until calibrate_delay() runs */ + loops_per_jiffy = 50000000/HZ; + + /* Setup PCI host bridge */ + ebony_setup_hose(); + +#ifdef CONFIG_BLK_DEV_INITRD + if (initrd_start) + ROOT_DEV = to_kdev_t(0x0100); /* /dev/ram */ + else +#endif +#ifdef CONFIG_ROOT_NFS + ROOT_DEV = to_kdev_t(0x00ff); /* /dev/nfs */ +#else + ROOT_DEV = to_kdev_t(0x0301); /* /dev/hda1 */ +#endif + +#ifdef CONFIG_VT + conswitchp = &dummy_con; +#endif + + ebony_early_serial_map(); + + ibm4xxPIC_InitSenses = ebony_IRQ_initsenses; + ibm4xxPIC_NumInitSenses = sizeof(ebony_IRQ_initsenses); + + /* Identify the system */ + printk("IBM Ebony port (MontaVista Software, Inc. (source@mvista.com))\n"); +} + +static void +ebony_restart(char *cmd) +{ + local_irq_disable(); + abort(); +} + +static void +ebony_power_off(void) +{ + local_irq_disable(); + for(;;); +} + +static void +ebony_halt(void) +{ + local_irq_disable(); + for(;;); +} + +/* + * Read the 440GP memory controller to get size of system memory. + */ +static unsigned long __init +ebony_find_end_of_memory(void) +{ + u32 i, bank_config; + u32 mem_size = 0; + + for (i=0; i<4; i++) + { + switch (i) + { + case 0: + mtdcr(DCRN_SDRAM0_CFGADDR, SDRAM0_B0CR); + break; + case 1: + mtdcr(DCRN_SDRAM0_CFGADDR, SDRAM0_B1CR); + break; + case 2: + mtdcr(DCRN_SDRAM0_CFGADDR, SDRAM0_B2CR); + break; + case 3: + mtdcr(DCRN_SDRAM0_CFGADDR, SDRAM0_B3CR); + break; + } + + bank_config = mfdcr(DCRN_SDRAM0_CFGDATA); + + if (!(bank_config & SDRAM_CONFIG_BANK_ENABLE)) + continue; + switch (SDRAM_CONFIG_BANK_SIZE(bank_config)) + { + case SDRAM_CONFIG_SIZE_8M: + mem_size += PPC44x_MEM_SIZE_8M; + break; + case SDRAM_CONFIG_SIZE_16M: + mem_size += PPC44x_MEM_SIZE_16M; + break; + case SDRAM_CONFIG_SIZE_32M: + mem_size += PPC44x_MEM_SIZE_32M; + break; + case SDRAM_CONFIG_SIZE_64M: + mem_size += PPC44x_MEM_SIZE_64M; + break; + case SDRAM_CONFIG_SIZE_128M: + mem_size += PPC44x_MEM_SIZE_128M; + break; + case SDRAM_CONFIG_SIZE_256M: + mem_size += PPC44x_MEM_SIZE_256M; + break; + case SDRAM_CONFIG_SIZE_512M: + mem_size += PPC44x_MEM_SIZE_512M; + break; + } + } + return mem_size; +} + +static void __init +ebony_init_irq(void) +{ + int i; + + ppc4xx_pic_init(); + + for (i = 0; i < NR_IRQS; i++) + irq_desc[i].handler = ppc4xx_pic; +} + +void __init +platform_init(unsigned long r3, unsigned long r4, + unsigned long r5, unsigned long r6, unsigned long r7) +{ + parse_bootinfo(find_bootinfo()); + + ppc_md.setup_arch = ebony_setup_arch; + ppc_md.show_cpuinfo = ebony_show_cpuinfo; + ppc_md.init_IRQ = ebony_init_irq; + ppc_md.get_irq = NULL; /* Set in ppc4xx_pic_init() */ + + ppc_md.find_end_of_memory = ebony_find_end_of_memory; + + ppc_md.restart = ebony_restart; + ppc_md.power_off = ebony_power_off; + ppc_md.halt = ebony_halt; + + ppc_md.calibrate_decr = ebony_calibrate_decr; + 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; +#if defined(CONFIG_VT) + ppc_md.kbd_setkeycode = pckbd_setkeycode; + ppc_md.kbd_getkeycode = pckbd_getkeycode; + ppc_md.kbd_translate = pckbd_translate; + ppc_md.kbd_unexpected_up = pckbd_unexpected_up; + ppc_md.kbd_leds = pckbd_leds; + ppc_md.kbd_init_hw = 0; +#endif + +#ifdef CONFIG_SERIAL_TEXT_DEBUG + ppc_md.progress = gen550_progress; +#endif /* CONFIG_SERIAL_TEXT_DEBUG */ +#ifdef CONFIG_KGDB + ppc_md.early_serial_map = ebony_early_serial_map; +#endif +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/ebony.h linux-2.4.23-pre8/arch/ppc/platforms/ebony.h --- linux-2.4.22/arch/ppc/platforms/ebony.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/ebony.h 2003-10-22 22:48:10.000000000 +0000 @@ -0,0 +1,94 @@ +/* + * arch/ppc/platforms/ebony.h + * + * Ebony board definitions + * + * Matt Porter + * + * Copyright 2002 MontaVista Software Inc. + * + * 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. + */ + +#ifdef __KERNEL__ +#ifndef __ASM_EBONY_H__ +#define __ASM_EBONY_H__ + +#include +#include + +/* F/W TLB mapping used in bootloader glue to reset EMAC */ +#define PPC44x_EMAC0_MR0 0xE0000800 + +/* Macros to get at Ebony VPD info */ +#define EBONY_VPD_BASE 0x00000001fffffe00ULL +#define EBONY_VPD_SIZE 0x24 +#define EBONY_NA0_OFFSET 0x0c +#define EBONY_NA1_OFFSET 0x18 +#define EBONY_NA0_ADDR(base) (base + EBONY_NA0_OFFSET) +#define EBONY_NA1_ADDR(base) (base + EBONY_NA1_OFFSET) + +/* Default clock rates for Rev. B and Rev. C silicon */ +#define EBONY_440GP_RB_SYSCLK 33000000 +#define EBONY_440GP_RC_SYSCLK 400000000 + +/* RTC/NVRAM location */ +#define EBONY_RTC_ADDR 0x0000000148000000ULL +#define EBONY_RTC_SIZE 0x2000 + +/* Flash */ +#define EBONY_FPGA_ADDR 0x0000000148300000 +#define EBONY_BOOT_SMALL_FLASH(x) (x & 0x20) +#define EBONY_ONBRD_FLASH_EN(x) (x & 0x02) +#define EBONY_FLASH_SEL(x) (x & 0x01) +#define EBONY_SMALL_FLASH_LOW1 0x00000001ff800000 +#define EBONY_SMALL_FLASH_LOW2 0x00000001ff880000 +#define EBONY_SMALL_FLASH_HIGH1 0x00000001fff00000 +#define EBONY_SMALL_FLASH_HIGH2 0x00000001fff80000 +#define EBONY_SMALL_FLASH_SIZE 0x80000 +#define EBONY_LARGE_FLASH_LOW 0x00000001ff800000 +#define EBONY_LARGE_FLASH_HIGH 0x00000001ffc00000 +#define EBONY_LARGE_FLASH_SIZE 0x400000 + +#define EBONY_SMALL_FLASH_BASE 0x00000001fff80000 +#define EBONY_LARGE_FLASH_BASE 0x00000001ff800000 + +/* + * Serial port defines + */ + +/* OpenBIOS defined UART mappings, used before early_serial_setup */ +#define UART0_IO_BASE (u8 *) 0xE0000200 +#define UART1_IO_BASE (u8 *) 0xE0000300 + +#define BASE_BAUD 33000000/3/16 + +#define STD_UART_OP(num) \ + { 0, BASE_BAUD, 0, UART##num##_INT, \ + (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST), \ + iomem_base: UART##num##_IO_BASE, \ + io_type: SERIAL_IO_MEM}, + +#define SERIAL_PORT_DFNS \ + STD_UART_OP(0) \ + STD_UART_OP(1) + +/* PCI support */ +#define EBONY_PCI_LOWER_IO 0x00000000 +#define EBONY_PCI_UPPER_IO 0x0000ffff +#define EBONY_PCI_LOWER_MEM 0x80002000 +#define EBONY_PCI_UPPER_MEM 0xffffefff + +#define EBONY_PCI_CFGREGS_BASE 0x000000020ec00000 +#define EBONY_PCI_CFGA_PLB32 0x0ec00000 +#define EBONY_PCI_CFGD_PLB32 0x0ec00004 + +#define EBONY_PCI_IO_BASE 0x0000000208000000ULL +#define EBONY_PCI_IO_SIZE 0x00010000 +#define EBONY_PCI_MEM_OFFSET 0x00000000 + +#endif /* __ASM_EBONY_H__ */ +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/ibm440gp.c linux-2.4.23-pre8/arch/ppc/platforms/ibm440gp.c --- linux-2.4.22/arch/ppc/platforms/ibm440gp.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/ibm440gp.c 2003-10-22 22:49:12.000000000 +0000 @@ -0,0 +1,129 @@ +/* + * arch/ppc/platforms/ibm440gp.c + * + * PPC440GP I/O descriptions + * + * Matt Porter + * Copyright 2002-2003 MontaVista Software Inc. + * + * Eugene Surovegin or + * Copyright (c) 2003 Zultys Technologies + * + * 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 + +#if defined(EMAC_NUMS) && EMAC_NUMS > 0 +u32 emac_phy_map[EMAC_NUMS]; +EXPORT_SYMBOL(emac_phy_map); +#endif + +static struct ocp_func_emac_data ibm440gp_emac0_def = { + .zmii_idx = 0, /* ZMII device index */ + .zmii_mux = 0, /* ZMII input of this EMAC */ + .mal_idx = 0, /* MAL device index */ + .mal_rx_chan = 0, /* MAL rx channel number */ + .mal_tx1_chan = 0, /* MAL tx channel 1 number */ + .mal_tx2_chan = 1, /* MAL tx channel 2 number */ + .wol_irq = BL_MAC_WOL, /* WOL interrupt number */ + .mdio_idx = -1, /* No shared MDIO */ +}; + +static struct ocp_func_emac_data ibm440gp_emac1_def = { + .zmii_idx = 0, /* ZMII device index */ + .zmii_mux = 1, /* ZMII input of this EMAC */ + .mal_idx = 0, /* MAL device index */ + .mal_rx_chan = 1, /* MAL rx channel number */ + .mal_tx1_chan = 2, /* MAL tx channel 1 number */ + .mal_tx2_chan = 3, /* MAL tx channel 2 number */ + .wol_irq = BL_MAC_WOL1, /* WOL interrupt number */ + .mdio_idx = -1, /* No shared MDIO */ +}; + +static struct ocp_func_mal_data ibm440gp_mal0_def = { + .num_tx_chans = 2*EMAC_NUMS, /* Number of TX channels */ + .num_rx_chans = EMAC_NUMS, /* Number of RX channels */ +}; + +struct ocp_def core_ocp[] __initdata = { + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_OPB, + .index = 0, + .paddr = PPC440GP_OPB_BASE_START, + .irq = OCP_IRQ_NA, + .pm = OCP_CPM_NA, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_16550, + .index = 0, + .paddr = PPC440GP_UART0_ADDR, + .irq = UART0_INT, + .pm = IBM_CPM_UART0, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_16550, + .index = 1, + .paddr = PPC440GP_UART1_ADDR, + .irq = UART1_INT, + .pm = IBM_CPM_UART1, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_IIC, + .index = 0, + .paddr = PPC440GP_IIC0_ADDR, + .irq = IIC0_IRQ, + .pm = IBM_CPM_IIC0, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_IIC, + .index = 1, + .paddr = PPC440GP_IIC1_ADDR, + .irq = IIC1_IRQ, + .pm = IBM_CPM_IIC1, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_GPIO, + .index = 0, + .paddr = PPC440GP_GPIO0_ADDR, + .irq = OCP_IRQ_NA, + .pm = IBM_CPM_GPIO0, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_MAL, + .paddr = OCP_PADDR_NA, + .irq = OCP_IRQ_NA, + .pm = OCP_CPM_NA, + .additions = &ibm440gp_mal0_def, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_EMAC, + .index = 0, + .paddr = PPC440GP_EMAC0_ADDR, + .irq = BL_MAC_ETH0, + .pm = OCP_CPM_NA, + .additions = &ibm440gp_emac0_def, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_EMAC, + .index = 1, + .paddr = PPC440GP_EMAC1_ADDR, + .irq = BL_MAC_ETH1, + .pm = OCP_CPM_NA, + .additions = &ibm440gp_emac1_def, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_ZMII, + .paddr = PPC440GP_ZMII_ADDR, + .irq = OCP_IRQ_NA, + .pm = OCP_CPM_NA, + }, + { .vendor = OCP_VENDOR_INVALID + } +}; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/ibm440gp.h linux-2.4.23-pre8/arch/ppc/platforms/ibm440gp.h --- linux-2.4.22/arch/ppc/platforms/ibm440gp.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/ibm440gp.h 2003-10-22 22:49:54.000000000 +0000 @@ -0,0 +1,103 @@ +/* + * arch/ppc/platforms/ibm440gp.h + * + * PPC440GP definitions + * + * Roland Dreier + * + * Copyright 2002 Roland Dreier + * + * 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 code that was originally in the files ibm44x.h + * and ebony.h, which were written by Matt Porter of MontaVista Software Inc. + */ + +#ifdef __KERNEL__ +#ifndef __PPC_PLATFORMS_IBM440GP_H +#define __PPC_PLATFORMS_IBM440GP_H + +#include + +#include + +#define EMAC_NUMS 2 +#define UART_NUMS 2 +#define ZMII_NUMS 1 +#define IIC_NUMS 2 +#define IIC0_IRQ 2 +#define IIC1_IRQ 3 +#define GPIO_NUMS 1 + +/* UART location */ +#define PPC440GP_UART0_ADDR 0x0000000140000200ULL +#define PPC440GP_UART1_ADDR 0x0000000140000300ULL +#define UART0_INT 0 +#define UART1_INT 1 + +/* EMAC location */ +#define PPC440GP_EMAC0_ADDR 0x0000000140000800ULL +#define PPC440GP_EMAC1_ADDR 0x0000000140000900ULL +#define PPC440GP_EMAC_SIZE 0x70 + +/* EMAC IRQ's */ +#define BL_MAC_WOL 61 /* WOL */ +#define BL_MAC_WOL1 63 /* WOL */ +#define BL_MAL_SERR 32 /* MAL SERR */ +#define BL_MAL_TXDE 33 /* MAL TXDE */ +#define BL_MAL_RXDE 34 /* MAL RXDE */ +#define BL_MAL_TXEOB 10 /* MAL TX EOB */ +#define BL_MAL_RXEOB 11 /* MAL RX EOB */ +#define BL_MAC_ETH0 60 /* MAC */ +#define BL_MAC_ETH1 62 /* MAC */ + +/* ZMII location */ +#define PPC440GP_ZMII_ADDR 0x0000000140000780ULL +#define PPC440GP_ZMII_SIZE 0x0c + +/* I2C location */ +#define PPC440GP_IIC0_ADDR 0x40000400 +#define PPC440GP_IIC1_ADDR 0x40000500 + +/* GPIO location */ +#define PPC440GP_GPIO0_ADDR 0x0000000140000700ULL + +/* Clock and Power Management */ +#define IBM_CPM_IIC0 0x80000000 /* IIC interface */ +#define IBM_CPM_IIC1 0x40000000 /* IIC interface */ +#define IBM_CPM_PCI 0x20000000 /* PCI bridge */ +#define IBM_CPM_CPU 0x02000000 /* processor core */ +#define IBM_CPM_DMA 0x01000000 /* DMA controller */ +#define IBM_CPM_BGO 0x00800000 /* PLB to OPB bus arbiter */ +#define IBM_CPM_BGI 0x00400000 /* OPB to PLB bridge */ +#define IBM_CPM_EBC 0x00200000 /* External Bux Controller */ +#define IBM_CPM_EBM 0x00100000 /* Ext Bus Master Interface */ +#define IBM_CPM_DMC 0x00080000 /* SDRAM peripheral controller */ +#define IBM_CPM_PLB 0x00040000 /* PLB bus arbiter */ +#define IBM_CPM_SRAM 0x00020000 /* SRAM memory controller */ +#define IBM_CPM_PPM 0x00002000 /* PLB Performance Monitor */ +#define IBM_CPM_UIC1 0x00001000 /* Universal Interrupt Controller */ +#define IBM_CPM_GPIO0 0x00000800 /* General Purpose IO (??) */ +#define IBM_CPM_GPT 0x00000400 /* General Purpose Timers */ +#define IBM_CPM_UART0 0x00000200 /* serial port 0 */ +#define IBM_CPM_UART1 0x00000100 /* serial port 1 */ +#define IBM_CPM_UIC0 0x00000080 /* Universal Interrupt Controller */ +#define IBM_CPM_TMRCLK 0x00000040 /* CPU timers */ + +#define DFLT_IBM4xx_PM ~(IBM_CPM_UIC | IBM_CPM_UIC1 | IBM_CPM_CPU \ + | IBM_CPM_EBC | IBM_CPM_SRAM | IBM_CPM_BGO \ + | IBM_CPM_EBM | IBM_CPM_PLB | IBM_CPM_OPB \ + | IBM_CPM_TMRCLK | IBM_CPM_DMA | IBM_CPM_PCI) + +#define PPC440GP_OPB_BASE_START 0x0000000140000000ULL + +/* + * Serial port defines + */ +#define RS_TABLE_SIZE 2 + +#endif /* __PPC_PLATFORMS_IBM440GP_H */ +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/ibm440gx.c linux-2.4.23-pre8/arch/ppc/platforms/ibm440gx.c --- linux-2.4.22/arch/ppc/platforms/ibm440gx.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/ibm440gx.c 2003-10-22 22:49:03.000000000 +0000 @@ -0,0 +1,129 @@ +/* + * arch/ppc/platforms/4xx/ibm440gx.c + * + * PPC440GX I/O descriptions + * + * Matt Porter + * Copyright 2002-2003 MontaVista Software Inc. + * + * Eugene Surovegin or + * Copyright (c) 2003 Zultys Technologies + * + * 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 + +#if defined(EMAC_NUMS) && EMAC_NUMS > 0 +u32 emac_phy_map[EMAC_NUMS]; +EXPORT_SYMBOL(emac_phy_map); +#endif + +static struct ocp_func_emac_data ibm440gx_emac0_def = { + .zmii_idx = 0, /* ZMII device index */ + .zmii_mux = 0, /* ZMII input of this EMAC */ + .mal_idx = 0, /* MAL device index */ + .mal_rx_chan = 0, /* MAL rx channel number */ + .mal_tx1_chan = 0, /* MAL tx channel 1 number */ + .mal_tx2_chan = -1, /* MAL tx channel 2 number */ + .wol_irq = BL_MAC_WOL, /* WOL interrupt number */ + .mdio_idx = -1, /* No shared MDIO */ +}; + +static struct ocp_func_emac_data ibm440gx_emac1_def = { + .zmii_idx = 0, /* ZMII device index */ + .zmii_mux = 1, /* ZMII input of this EMAC */ + .mal_idx = 0, /* MAL device index */ + .mal_rx_chan = 1, /* MAL rx channel number */ + .mal_tx1_chan = 1, /* MAL tx channel 1 number */ + .mal_tx2_chan = -1, /* MAL tx channel 2 number */ + .wol_irq = BL_MAC_WOL1, /* WOL interrupt number */ + .mdio_idx = -1, /* No shared MDIO */ +}; + +static struct ocp_func_mal_data ibm440gx_mal0_def = { + .num_tx_chans = 2*EMAC_NUMS, /* Number of TX channels */ + .num_rx_chans = EMAC_NUMS, /* Number of RX channels */ +}; + +struct ocp_def core_ocp[] __initdata = { + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_OPB, + .index = 0, + .paddr = PPC440GX_OPB_BASE_START, + .irq = OCP_IRQ_NA, + .pm = OCP_CPM_NA, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_16550, + .index = 0, + .paddr = PPC440GX_UART0_ADDR, + .irq = UART0_INT, + .pm = IBM_CPM_UART0, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_16550, + .index = 1, + .paddr = PPC440GX_UART1_ADDR, + .irq = UART1_INT, + .pm = IBM_CPM_UART1, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_IIC, + .index = 0, + .paddr = PPC440GX_IIC0_ADDR, + .irq = IIC0_IRQ, + .pm = IBM_CPM_IIC0, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_IIC, + .index = 1, + .paddr = PPC440GX_IIC1_ADDR, + .irq = IIC1_IRQ, + .pm = IBM_CPM_IIC1, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_GPIO, + .index = 0, + .paddr = PPC440GX_GPIO0_ADDR, + .irq = OCP_IRQ_NA, + .pm = IBM_CPM_GPIO0, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_MAL, + .paddr = OCP_PADDR_NA, + .irq = OCP_IRQ_NA, + .pm = OCP_CPM_NA, + .additions = &ibm440gx_mal0_def, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_EMAC, + .index = 0, + .paddr = PPC440GX_EMAC0_ADDR, + .irq = BL_MAC_ETH0, + .pm = OCP_CPM_NA, + .additions = &ibm440gx_emac0_def, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_EMAC, + .index = 1, + .paddr = PPC440GX_EMAC1_ADDR, + .irq = BL_MAC_ETH1, + .pm = OCP_CPM_NA, + .additions = &ibm440gx_emac1_def, + }, + { .vendor = OCP_VENDOR_IBM, + .function = OCP_FUNC_ZMII, + .paddr = PPC440GX_ZMII_ADDR, + .irq = OCP_IRQ_NA, + .pm = OCP_CPM_NA, + }, + { .vendor = OCP_VENDOR_INVALID + } +}; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/ibm440gx.h linux-2.4.23-pre8/arch/ppc/platforms/ibm440gx.h --- linux-2.4.22/arch/ppc/platforms/ibm440gx.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/ibm440gx.h 2003-10-22 22:48:30.000000000 +0000 @@ -0,0 +1,123 @@ +/* + * arch/ppc/platforms/ibm440gx.h + * + * PPC440GX definitions + * + * Matt Porter + * + * Copyright 2002 Roland Dreier + * Copyright 2003 MontaVista Software, Inc. + * + * 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. + * + */ + +#ifdef __KERNEL__ +#ifndef __PPC_PLATFORMS_IBM440GX_H +#define __PPC_PLATFORMS_IBM440GX_H + +#include + +#include + +/* UART */ +#define PPC440GX_UART0_ADDR 0x0000000140000200 +#define PPC440GX_UART1_ADDR 0x0000000140000300 +#define UART0_INT 0 +#define UART1_INT 1 + +/* EMAC */ +#define PPC440GX_EMAC0_ADDR 0x0000000140000800 +#define PPC440GX_EMAC1_ADDR 0x0000000140000900 +#define PPC440GX_EMAC2_ADDR 0x0000000140000C00 +#define PPC440GX_EMAC3_ADDR 0x0000000140000E00 +#define PPC440GX_EMAC_SIZE 0xFC +#define EMAC_NUMS 2 +#define BL_MAC_WOL 61 /* WOL */ +#define BL_MAC_WOL1 63 /* WOL */ +#define BL_MAC_WOL2 65 /* WOL */ +#define BL_MAC_WOL3 67 /* WOL */ +#define BL_MAL_SERR 32 /* MAL SERR */ +#define BL_MAL_TXDE 33 /* MAL TXDE */ +#define BL_MAL_RXDE 34 /* MAL RXDE */ +#define BL_MAL_TXEOB 10 /* MAL TX EOB */ +#define BL_MAL_RXEOB 11 /* MAL RX EOB */ +#define BL_MAC_ETH0 60 /* MAC */ +#define BL_MAC_ETH1 62 /* MAC */ +#define BL_MAC_ETH2 64 /* MAC */ +#define BL_MAC_ETH3 66 /* MAC */ +#define BL_TAH0 68 /* TAH 0 */ +#define BL_TAH1 69 /* TAH 1 */ + +/* TAH */ +#define PPC440GX_TAH0_ADDR 0x0000000140000B00 +#define PPC440GX_TAH1_ADDR 0x0000000140000D00 +#define PPC440GX_TAH_SIZE 0xFC + +/* ZMII */ +#define PPC440GX_ZMII_ADDR 0x0000000140000780 +#define PPC440GX_ZMII_SIZE 0x0c + +/* RGMII */ +#define PPC440GX_RGMII_ADDR 0x0000000140000790 +#define PPC440GX_RGMII_SIZE 0x0c + +/* IIC */ +#define PPC440GX_IIC0_ADDR 0x40000400 +#define PPC440GX_IIC1_ADDR 0x40000500 +#define IIC0_IRQ 2 +#define IIC1_IRQ 3 + +/* GPIO */ +#define PPC440GX_GPIO0_ADDR 0x0000000140000700 + +/* Clock and Power Management */ +#define IBM_CPM_IIC0 0x80000000 /* IIC interface */ +#define IBM_CPM_IIC1 0x40000000 /* IIC interface */ +#define IBM_CPM_PCI 0x20000000 /* PCI bridge */ +#define IBM_CPM_RGMII 0x10000000 /* RGMII */ +#define IBM_CPM_TAHOE0 0x08000000 /* TAHOE 0 */ +#define IBM_CPM_TAHOE1 0x04000000 /* TAHOE 1 */ +#define IBM_CPM_CPU 0x02000000 /* processor core */ +#define IBM_CPM_DMA 0x01000000 /* DMA controller */ +#define IBM_CPM_BGO 0x00800000 /* PLB to OPB bus arbiter */ +#define IBM_CPM_BGI 0x00400000 /* OPB to PLB bridge */ +#define IBM_CPM_EBC 0x00200000 /* External Bux Controller */ +#define IBM_CPM_EBM 0x00100000 /* Ext Bus Master Interface */ +#define IBM_CPM_DMC 0x00080000 /* SDRAM peripheral controller */ +#define IBM_CPM_PLB 0x00040000 /* PLB bus arbiter */ +#define IBM_CPM_SRAM 0x00020000 /* SRAM memory controller */ +#define IBM_CPM_PPM 0x00002000 /* PLB Performance Monitor */ +#define IBM_CPM_UIC1 0x00001000 /* Universal Interrupt Controller */ +#define IBM_CPM_GPIO0 0x00000800 /* General Purpose IO (??) */ +#define IBM_CPM_GPT 0x00000400 /* General Purpose Timers */ +#define IBM_CPM_UART0 0x00000200 /* serial port 0 */ +#define IBM_CPM_UART1 0x00000100 /* serial port 1 */ +#define IBM_CPM_UIC0 0x00000080 /* Universal Interrupt Controller */ +#define IBM_CPM_TMRCLK 0x00000040 /* CPU timers */ +#define IBM_CPM_EMAC0 0x00000020 /* EMAC 0 */ +#define IBM_CPM_EMAC1 0x00000010 /* EMAC 1 */ +#define IBM_CPM_EMAC2 0x00000008 /* EMAC 2 */ +#define IBM_CPM_EMAC3 0x00000004 /* EMAC 3 */ + +#define DFLT_IBM4xx_PM ~(IBM_CPM_UIC | IBM_CPM_UIC1 | IBM_CPM_CPU \ + | IBM_CPM_EBC | IBM_CPM_SRAM | IBM_CPM_BGO \ + | IBM_CPM_EBM | IBM_CPM_PLB | IBM_CPM_OPB \ + | IBM_CPM_TMRCLK | IBM_CPM_DMA | IBM_CPM_PCI \ + | IBM_CPM_TAHOE0 | IBM_CPM_TAHOE1 \ + | IBM_CPM_EMAC0 | IBM_CPM_EMAC1 \ + | IBM_CPM_EMAC2 | IBM_CPM_EMAC3 ) + +/* OPB */ +#define PPC440GX_OPB_BASE_START 0x0000000140000000 + +/* + * Serial port defines + */ +#define RS_TABLE_SIZE 2 + +#endif /* __PPC_PLATFORMS_IBM440GX_H */ +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/ocotea.c linux-2.4.23-pre8/arch/ppc/platforms/ocotea.c --- linux-2.4.22/arch/ppc/platforms/ocotea.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/ocotea.c 2003-10-22 22:48:12.000000000 +0000 @@ -0,0 +1,441 @@ +/* + * arch/ppc/platforms/ocotea.c + * + * Ocotea board specific routines + * + * Matt Porter + * + * Copyright 2003 MontaVista Software Inc. + * + * 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 +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern void abort(void); +extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode); +extern int pckbd_getkeycode(unsigned int scancode); +extern int pckbd_translate(unsigned char scancode, unsigned char *keycode, + char raw_mode); +extern void gen550_progress(char *, unsigned short); +extern void gen550_init(int, struct serial_struct *); + +/* Global Variables */ +unsigned char __res[sizeof (bd_t)]; + +static void __init +ocotea_calibrate_decr(void) +{ + unsigned int freq; + + freq = OCOTEA_SYSCLK; + + tb_ticks_per_jiffy = freq / HZ; + tb_to_us = mulhwu_scale_factor(freq, 1000000); + + /* Set the time base to zero */ + mtspr(SPRN_TBWL, 0); + mtspr(SPRN_TBWU, 0); + + /* Clear any pending timer interrupts */ + mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS); + + /* Enable decrementer interrupt */ + mtspr(SPRN_TCR, TCR_DIE); +} + +static int +ocotea_show_cpuinfo(struct seq_file *m) +{ + seq_printf(m, "vendor\t\t: IBM\n"); + seq_printf(m, "machine\t\t: PPC440GX EVB (Ocotea)\n"); + + return 0; +} +static inline int +ocotea_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) +{ + static char pci_irq_table[][4] = + /* + * PCI IDSEL/INTPIN->INTLINE + * A B C D + */ + { + { 23, 23, 23, 23 }, /* IDSEL 1 - PCI Slot 0 */ + { 24, 24, 24, 24 }, /* IDSEL 2 - PCI Slot 1 */ + { 25, 25, 25, 25 }, /* IDSEL 3 - PCI Slot 2 */ + { 26, 26, 26, 26 }, /* IDSEL 4 - PCI Slot 3 */ + }; + + const long min_idsel = 1, max_idsel = 4, irqs_per_slot = 4; + return PCI_IRQ_TABLE_LOOKUP; +} + +#define PCIX_READW(offset) \ + (readw((u32)pcix_reg_base+offset)) + +#define PCIX_WRITEW(value, offset) \ + (writew(value, (u32)pcix_reg_base+offset)) + +#define PCIX_WRITEL(value, offset) \ + (writel(value, (u32)pcix_reg_base+offset)) + +/* + * FIXME: This is only here to "make it work". This will move + * to a ibm_pcix.c which will contain a generic IBM PCIX bridge + * configuration library. -Matt + */ +static void __init +ocotea_setup_pcix(void) +{ + void *pcix_reg_base; + + pcix_reg_base = ioremap64(PCIX0_REG_BASE, PCIX0_REG_SIZE); + + /* Enable PCIX0 I/O, Mem, and Busmaster cycles */ + PCIX_WRITEW(PCIX_READW(PCIX0_COMMAND) | PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER, PCIX0_COMMAND); + + /* Disable all windows */ + PCIX_WRITEL(0, PCIX0_POM0SA); + PCIX_WRITEL(0, PCIX0_POM1SA); + PCIX_WRITEL(0, PCIX0_POM2SA); + PCIX_WRITEL(0, PCIX0_PIM0SA); + PCIX_WRITEL(0, PCIX0_PIM0SAH); + PCIX_WRITEL(0, PCIX0_PIM1SA); + PCIX_WRITEL(0, PCIX0_PIM2SA); + PCIX_WRITEL(0, PCIX0_PIM2SAH); + + /* Setup 2GB PLB->PCI outbound mem window (3_8000_0000->0_8000_0000) */ + PCIX_WRITEL(0x00000003, PCIX0_POM0LAH); + PCIX_WRITEL(0x80000000, PCIX0_POM0LAL); + PCIX_WRITEL(0x00000000, PCIX0_POM0PCIAH); + PCIX_WRITEL(0x80000000, PCIX0_POM0PCIAL); + PCIX_WRITEL(0x80000001, PCIX0_POM0SA); + + /* Setup 2GB PCI->PLB inbound memory window at 0, enable MSIs */ + PCIX_WRITEL(0x00000000, PCIX0_PIM0LAH); + PCIX_WRITEL(0x00000000, PCIX0_PIM0LAL); + PCIX_WRITEL(0xe0000007, PCIX0_PIM0SA); + + eieio(); +} + +static void __init +ocotea_setup_hose(void) +{ + struct pci_controller *hose; + + /* Configure windows on the PCI-X host bridge */ + ocotea_setup_pcix(); + + hose = pcibios_alloc_controller(); + + if (!hose) + return; + + hose->first_busno = 0; + hose->last_busno = 0xff; + + hose->pci_mem_offset = OCOTEA_PCI_MEM_OFFSET; + + pci_init_resource(&hose->io_resource, + OCOTEA_PCI_LOWER_IO, + OCOTEA_PCI_UPPER_IO, + IORESOURCE_IO, + "PCI host bridge"); + + pci_init_resource(&hose->mem_resources[0], + OCOTEA_PCI_LOWER_MEM, + OCOTEA_PCI_UPPER_MEM, + IORESOURCE_MEM, + "PCI host bridge"); + + hose->io_space.start = OCOTEA_PCI_LOWER_IO; + hose->io_space.end = OCOTEA_PCI_UPPER_IO; + hose->mem_space.start = OCOTEA_PCI_LOWER_MEM; + hose->mem_space.end = OCOTEA_PCI_UPPER_MEM; + isa_io_base = + (unsigned long)ioremap64(OCOTEA_PCI_IO_BASE, OCOTEA_PCI_IO_SIZE); + hose->io_base_virt = (void *)isa_io_base; + + setup_indirect_pci(hose, + OCOTEA_PCI_CFGA_PLB32, + OCOTEA_PCI_CFGD_PLB32); + hose->set_cfg_type = 1; + + hose->last_busno = pciauto_bus_scan(hose, hose->first_busno); + + ppc_md.pci_swizzle = common_swizzle; + ppc_md.pci_map_irq = ocotea_map_irq; +} + + +TODC_ALLOC(); + +static void __init +ocotea_early_serial_map(void) +{ + struct serial_struct serial_req; + + /* Setup ioremapped serial port access */ + memset(&serial_req, 0, sizeof(serial_req)); + serial_req.line = 0; + serial_req.baud_base = BASE_BAUD; + serial_req.port = 0; + serial_req.irq = 0; + serial_req.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; + serial_req.io_type = SERIAL_IO_MEM; + serial_req.iomem_base = ioremap64(PPC440GX_UART0_ADDR, 8); + serial_req.iomem_reg_shift = 0; + +#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB) + /* Configure debug serial access */ + gen550_init(0, &serial_req); +#endif + + if (early_serial_setup(&serial_req) != 0) { + printk("Early serial init of port 0 failed\n"); + } + + /* Assume early_serial_setup() doesn't modify serial_req */ + serial_req.line = 1; + serial_req.port = 1; + serial_req.irq = 1; + serial_req.iomem_base = ioremap64(PPC440GX_UART1_ADDR, 8); + +#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB) + /* Configure debug serial access */ + gen550_init(1, &serial_req); +#endif + + if (early_serial_setup(&serial_req) != 0) { + printk("Early serial init of port 1 failed\n"); + } +} + +static void __init +ocotea_setup_arch(void) +{ + unsigned char *addr; + unsigned long long mac64; + bd_t *bip = (bd_t *) __res; + + /* Retrieve MAC addresses from flash */ + addr = ioremap64(OCOTEA_MAC_BASE, OCOTEA_MAC_SIZE); + mac64 = simple_strtoull(addr, 0, 16); + memcpy(bip->bi_enetaddr[0], (char *)&mac64+2, 6); + mac64 = simple_strtoull(addr+OCOTEA_MAC1_OFFSET, 0, 16); + memcpy(bip->bi_enetaddr[1], (char *)&mac64+2, 6); + iounmap(addr); + + /* Set EMAC PHY map to not probe address 0x00 */ + emac_phy_map[0] = 0x00000001; + emac_phy_map[1] = 0x00000001; + +#if !defined(CONFIG_BDI_SWITCH) + /* + * The Abatron BDI JTAG debugger does not tolerate others + * mucking with the debug registers. + */ + mtspr(SPRN_DBCR0, (DBCR0_TDE | DBCR0_IDM)); +#endif + + /* Setup TODC access */ + TODC_INIT(TODC_TYPE_DS1743, + 0, + 0, + ioremap64(OCOTEA_RTC_ADDR, OCOTEA_RTC_SIZE), + 8); + + /* init to some ~sane value until calibrate_delay() runs */ + loops_per_jiffy = 50000000/HZ; + + /* Setup PCI host bridge */ + ocotea_setup_hose(); + +#ifdef CONFIG_BLK_DEV_INITRD + if (initrd_start) + ROOT_DEV = to_kdev_t(0x0100); /* /dev/ram */ + else +#endif +#ifdef CONFIG_ROOT_NFS + ROOT_DEV = to_kdev_t(0x00ff); /* /dev/nfs */ +#else + ROOT_DEV = to_kdev_t(0x0301); /* /dev/hda1 */ +#endif + +#ifdef CONFIG_VT + conswitchp = &dummy_con; +#endif + + ocotea_early_serial_map(); + + /* Identify the system */ + printk("IBM Ocotea port (MontaVista Software, Inc. )\n"); +} + +static void +ocotea_restart(char *cmd) +{ + local_irq_disable(); + abort(); +} + +static void +ocotea_power_off(void) +{ + local_irq_disable(); + for(;;); +} + +static void +ocotea_halt(void) +{ + local_irq_disable(); + for(;;); +} + +/* + * Read the 440GX memory controller to get size of system memory. + */ +static unsigned long __init +ocotea_find_end_of_memory(void) +{ + u32 i, bank_config; + u32 mem_size = 0; + + for (i=0; i<4; i++) + { + switch (i) + { + case 0: + mtdcr(DCRN_SDRAM0_CFGADDR, SDRAM0_B0CR); + break; + case 1: + mtdcr(DCRN_SDRAM0_CFGADDR, SDRAM0_B1CR); + break; + case 2: + mtdcr(DCRN_SDRAM0_CFGADDR, SDRAM0_B2CR); + break; + case 3: + mtdcr(DCRN_SDRAM0_CFGADDR, SDRAM0_B3CR); + break; + } + + bank_config = mfdcr(DCRN_SDRAM0_CFGDATA); + + if (!(bank_config & SDRAM_CONFIG_BANK_ENABLE)) + continue; + switch (SDRAM_CONFIG_BANK_SIZE(bank_config)) + { + case SDRAM_CONFIG_SIZE_8M: + mem_size += PPC44x_MEM_SIZE_8M; + break; + case SDRAM_CONFIG_SIZE_16M: + mem_size += PPC44x_MEM_SIZE_16M; + break; + case SDRAM_CONFIG_SIZE_32M: + mem_size += PPC44x_MEM_SIZE_32M; + break; + case SDRAM_CONFIG_SIZE_64M: + mem_size += PPC44x_MEM_SIZE_64M; + break; + case SDRAM_CONFIG_SIZE_128M: + mem_size += PPC44x_MEM_SIZE_128M; + break; + case SDRAM_CONFIG_SIZE_256M: + mem_size += PPC44x_MEM_SIZE_256M; + break; + case SDRAM_CONFIG_SIZE_512M: + mem_size += PPC44x_MEM_SIZE_512M; + break; + } + } + return mem_size; +} + +static void __init +ocotea_init_irq(void) +{ + int i; + + /* Enable PPC440GP interrupt compatibility mode */ + SDR_WRITE(DCRN_SDR_MFR,SDR_READ(DCRN_SDR_MFR) | DCRN_SDR_MFR_PCM); + + ppc4xx_pic_init(); + + for (i = 0; i < NR_IRQS; i++) + irq_desc[i].handler = ppc4xx_pic; +} + +void __init platform_init(unsigned long r3, unsigned long r4, + unsigned long r5, unsigned long r6, unsigned long r7) +{ + parse_bootinfo(find_bootinfo()); + + ppc_md.setup_arch = ocotea_setup_arch; + ppc_md.show_cpuinfo = ocotea_show_cpuinfo; + ppc_md.init_IRQ = ocotea_init_irq; + ppc_md.get_irq = NULL; /* Set in ppc4xx_pic_init() */ + + ppc_md.find_end_of_memory = ocotea_find_end_of_memory; + + ppc_md.restart = ocotea_restart; + ppc_md.power_off = ocotea_power_off; + ppc_md.halt = ocotea_halt; + + ppc_md.calibrate_decr = ocotea_calibrate_decr; + 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; +#if defined(CONFIG_VT) + ppc_md.kbd_setkeycode = pckbd_setkeycode; + ppc_md.kbd_getkeycode = pckbd_getkeycode; + ppc_md.kbd_translate = pckbd_translate; + ppc_md.kbd_unexpected_up = pckbd_unexpected_up; + ppc_md.kbd_leds = pckbd_leds; + ppc_md.kbd_init_hw = 0; +#endif + +#ifdef CONFIG_SERIAL_TEXT_DEBUG + ppc_md.progress = gen550_progress; +#endif /* CONFIG_SERIAL_TEXT_DEBUG */ +#ifdef CONFIG_KGDB + ppc_md.early_serial_map = ocotea_early_serial_map; +#endif +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc/platforms/ocotea.h linux-2.4.23-pre8/arch/ppc/platforms/ocotea.h --- linux-2.4.22/arch/ppc/platforms/ocotea.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc/platforms/ocotea.h 2003-10-22 22:47:52.000000000 +0000 @@ -0,0 +1,84 @@ +/* + * arch/ppc/platforms/ocotea.h + * + * Ocotea board definitions + * + * Matt Porter + * + * Copyright 2003 MontaVista Software Inc. + * + * 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. + * + */ + +#ifdef __KERNEL__ +#ifndef __ASM_OCOTEA_H__ +#define __ASM_OCOTEA_H__ + +#include +#include + +/* F/W TLB mapping used in bootloader glue to reset EMAC */ +#define PPC44x_EMAC0_MR0 0xE0000800 + +/* Location of MAC addresses in firmware */ +#define OCOTEA_MAC_BASE (OCOTEA_SMALL_FLASH_HIGH+0xc0500) +#define OCOTEA_MAC_SIZE 0x200 +#define OCOTEA_MAC1_OFFSET 0x100 + +/* Default clock rate */ +#define OCOTEA_SYSCLK 25000000 + +/* RTC/NVRAM location */ +#define OCOTEA_RTC_ADDR 0x0000000148000000ULL +#define OCOTEA_RTC_SIZE 0x2000 + +/* Flash */ +#define OCOTEA_FPGA_ADDR 0x0000000148300000ULL +#define OCOTEA_BOOT_LARGE_FLASH(x) (x & 0x40) +#define OCOTEA_SMALL_FLASH_LOW 0x00000001ff900000ULL +#define OCOTEA_SMALL_FLASH_HIGH 0x00000001fff00000ULL +#define OCOTEA_SMALL_FLASH_SIZE 0x100000 +#define OCOTEA_LARGE_FLASH_LOW 0x00000001ff800000ULL +#define OCOTEA_LARGE_FLASH_HIGH 0x00000001ffc00000ULL +#define OCOTEA_LARGE_FLASH_SIZE 0x400000 + +/* + * Serial port defines + */ +#define RS_TABLE_SIZE 2 + +/* OpenBIOS defined UART mappings, used before early_serial_setup */ +#define UART0_IO_BASE (u8 *) 0xE0000200 +#define UART1_IO_BASE (u8 *) 0xE0000300 + +#define BASE_BAUD 11059200/16 +#define STD_UART_OP(num) \ + { 0, BASE_BAUD, 0, UART##num##_INT, \ + (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST), \ + iomem_base: UART##num##_IO_BASE, \ + io_type: SERIAL_IO_MEM}, + +#define SERIAL_PORT_DFNS \ + STD_UART_OP(0) \ + STD_UART_OP(1) + +/* PCI support */ +#define OCOTEA_PCI_LOWER_IO 0x00000000 +#define OCOTEA_PCI_UPPER_IO 0x0000ffff +#define OCOTEA_PCI_LOWER_MEM 0x80000000 +#define OCOTEA_PCI_UPPER_MEM 0xffffefff + +#define OCOTEA_PCI_CFGREGS_BASE 0x000000020ec00000ULL +#define OCOTEA_PCI_CFGA_PLB32 0x0ec00000 +#define OCOTEA_PCI_CFGD_PLB32 0x0ec00004 + +#define OCOTEA_PCI_IO_BASE 0x0000000208000000ULL +#define OCOTEA_PCI_IO_SIZE 0x00010000 +#define OCOTEA_PCI_MEM_OFFSET 0x00000000 + +#endif /* __ASM_OCOTEA_H__ */ +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc64/config.in linux-2.4.23-pre8/arch/ppc64/config.in --- linux-2.4.22/arch/ppc64/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc64/config.in 2003-10-22 22:48:13.000000000 +0000 @@ -29,6 +29,7 @@ bool 'Symmetric multi-processing support' CONFIG_SMP if [ "$CONFIG_SMP" = "y" ]; then bool ' Distribute interrupts on all CPUs by default' CONFIG_IRQ_ALL_CPUS + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 if [ "$CONFIG_PPC_PSERIES" = "y" ]; then bool ' Hardware multithreading' CONFIG_HMT fi @@ -262,4 +263,7 @@ dep_bool ' LKCD RLE compression' CONFIG_DUMP_COMPRESS_RLE $CONFIG_DUMP dep_bool ' LKCD GZIP compression' CONFIG_DUMP_COMPRESS_GZIP $CONFIG_DUMP fi + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/ppc64/defconfig linux-2.4.23-pre8/arch/ppc64/defconfig --- linux-2.4.22/arch/ppc64/defconfig 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/ppc64/defconfig 2003-10-22 22:48:53.000000000 +0000 @@ -22,6 +22,7 @@ CONFIG_PPC_PSERIES=y # CONFIG_PPC_ISERIES is not set CONFIG_SMP=y +CONFIG_NR_CPUS=32 CONFIG_IRQ_ALL_CPUS=y # CONFIG_HMT is not set # CONFIG_MSCHUNKS is not set diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/s390/config.in linux-2.4.23-pre8/arch/s390/config.in --- linux-2.4.22/arch/s390/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/s390/config.in 2003-10-22 22:49:17.000000000 +0000 @@ -32,6 +32,9 @@ comment 'Processor type and features' bool 'Symmetric multi-processing support' CONFIG_SMP bool 'IEEE FPU emulation' CONFIG_MATHEMU +if [ "$CONFIG_SMP" = "y" ]; then + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 +fi endmenu mainmenu_option next_comment @@ -77,6 +80,9 @@ # bool 'Remote GDB kernel debugging' CONFIG_REMOTE_DEBUG #fi bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/s390/defconfig linux-2.4.23-pre8/arch/s390/defconfig --- linux-2.4.22/arch/s390/defconfig 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/s390/defconfig 2003-10-22 22:49:21.000000000 +0000 @@ -27,6 +27,7 @@ # CONFIG_SMP=y CONFIG_MATHEMU=y +CONFIG_NR_CPUS=32 # # General setup diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/s390x/config.in linux-2.4.23-pre8/arch/s390x/config.in --- linux-2.4.22/arch/s390x/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/s390x/config.in 2003-10-22 22:47:42.000000000 +0000 @@ -22,6 +22,9 @@ mainmenu_option next_comment comment 'Processor type and features' bool 'Symmetric multi-processing support' CONFIG_SMP +if [ "$CONFIG_SMP" = "y" ]; then + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 +fi bool 'Kernel support for 31 bit emulation' CONFIG_S390_SUPPORT if [ "$CONFIG_S390_SUPPORT" = "y" ]; then tristate 'Kernel support for 31 bit ELF binaries' CONFIG_BINFMT_ELF32 @@ -81,6 +84,9 @@ # bool 'Remote GDB kernel debugging' CONFIG_REMOTE_DEBUG #fi bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/s390x/defconfig linux-2.4.23-pre8/arch/s390x/defconfig --- linux-2.4.22/arch/s390x/defconfig 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/s390x/defconfig 2003-10-22 22:47:28.000000000 +0000 @@ -21,6 +21,7 @@ CONFIG_SMP=y CONFIG_S390_SUPPORT=y CONFIG_BINFMT_ELF32=y +CONFIG_NR_CPUS=32 # # Loadable module support diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/Makefile linux-2.4.23-pre8/arch/sh/Makefile --- linux-2.4.22/arch/sh/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/Makefile 2003-10-22 22:49:09.000000000 +0000 @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.1.1.1.2.2 2002/05/10 17:58:54 jzs Exp $ +# $Id: Makefile,v 1.1.1.1.2.4 2003/08/22 04:04:16 sugioka Exp $ # # 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 @@ -87,7 +87,7 @@ FORCE: ; zImage: vmlinux - @$(MAKEBOOT) zImage + @$(MAKEBOOT) $@ compressed: zImage diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/boot/compressed/Makefile linux-2.4.23-pre8/arch/sh/boot/compressed/Makefile --- linux-2.4.22/arch/sh/boot/compressed/Makefile 2000-10-02 18:57:33.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/boot/compressed/Makefile 2003-10-22 22:48:59.000000000 +0000 @@ -18,9 +18,9 @@ # # ZIMAGE_OFFSET is the load offset of the compression loader # -ZIMAGE_OFFSET = $(shell printf "0x%8x" $$[0x80000000+0x$(CONFIG_MEMORY_START)+0x200000+0x10000]) +ZIMAGE_OFFSET = $(shell printf "0x%8x" $$[0x80000000+0x$(CONFIG_MEMORY_START)+0x$(CONFIG_BOOT_LINK_OFFSET)]) -ZLINKFLAGS = -Ttext $(ZIMAGE_OFFSET) $(ZLDFLAGS) +ZLINKFLAGS = -Ttext $(ZIMAGE_OFFSET) $(ZLDFLAGS) all: vmlinux diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/boot/compressed/head.S linux-2.4.23-pre8/arch/sh/boot/compressed/head.S --- linux-2.4.22/arch/sh/boot/compressed/head.S 2001-01-29 02:56:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/boot/compressed/head.S 2003-10-22 22:48:15.000000000 +0000 @@ -2,6 +2,7 @@ * linux/arch/sh/boot/compressed/head.S * * Copyright (C) 1999 Stuart Menefy + * Copyright (C) 2003 SUGIOKA Toshinobu */ .text @@ -14,7 +15,54 @@ mov.l init_sr, r1 ldc r1, sr - /* First clear BSS */ + /* Move myself to proper location if necessary */ + mova 1f, r0 + mov.l 1f, r2 + cmp/eq r2, r0 + bt clear_bss + sub r0, r2 + mov.l bss_start_addr, r0 + mov #0xe0, r1 + and r1, r0 ! align cache line + mov.l text_start_addr, r3 + mov r0, r1 + sub r2, r1 +3: + mov.l @r1, r4 + mov.l @(4,r1), r5 + mov.l @(8,r1), r6 + mov.l @(12,r1), r7 + mov.l @(16,r1), r8 + mov.l @(20,r1), r9 + mov.l @(24,r1), r10 + mov.l @(28,r1), r11 + mov.l r4, @r0 + mov.l r5, @(4,r0) + mov.l r6, @(8,r0) + mov.l r7, @(12,r0) + mov.l r8, @(16,r0) + mov.l r9, @(20,r0) + mov.l r10, @(24,r0) + mov.l r11, @(28,r0) +#ifdef CONFIG_CPU_SH4 + ocbwb @r0 +#endif + cmp/hi r3, r0 + add #-32, r0 + bt/s 3b + add #-32, r1 + mov.l 2f, r0 + jmp @r0 + nop + + .align 2 +1: .long 1b +2: .long clear_bss +text_start_addr: + .long startup + + /* Clear BSS */ +clear_bss: mov.l end_addr, r1 mov.l bss_start_addr, r2 mov #0, r0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/config.in linux-2.4.23-pre8/arch/sh/config.in --- linux-2.4.22/arch/sh/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/config.in 2003-10-22 22:48:57.000000000 +0000 @@ -28,6 +28,7 @@ comment 'Processor type and features' choice 'SuperH system type' \ "Generic CONFIG_SH_GENERIC \ + SH4-202-MicroDev CONFIG_SH_SH4202_MICRODEV \ SolutionEngine CONFIG_SH_SOLUTION_ENGINE \ SolutionEngine7751 CONFIG_SH_7751_SOLUTION_ENGINE \ SHMobileSolutionEngine CONFIG_SH_MOBILE_SOLUTION_ENGINE \ @@ -68,7 +69,9 @@ SH7708 CONFIG_CPU_SUBTYPE_SH7708 \ SH7709 CONFIG_CPU_SUBTYPE_SH7709 \ SH7750 CONFIG_CPU_SUBTYPE_SH7750 \ + SH7751R CONFIG_CPU_SUBTYPE_SH7751R \ SH7751 CONFIG_CPU_SUBTYPE_SH7751 \ + SH4-202 CONFIG_CPU_SUBTYPE_SH4_202 \ ST40RA/ST40STB1 CONFIG_CPU_SUBTYPE_ST40STB1 \ ST40GX1 CONFIG_CPU_SUBTYPE_ST40GX1" SH7708 if [ "$CONFIG_CPU_SUBTYPE_SH7300" = "y" ]; then @@ -95,6 +98,19 @@ define_bool CONFIG_CPU_SH3 n define_bool CONFIG_CPU_SH4 y fi +if [ "$CONFIG_CPU_SUBTYPE_SH7751R" = "y" ]; then + define_bool CONFIG_CPU_SH3 n + define_bool CONFIG_CPU_SH4 y + define_bool CONFIG_CPU_SUBTYPE_SH7751 y +fi +if [ "$CONFIG_CPU_SUBTYPE_SH4_202" = "y" ]; then + define_bool CONFIG_CPU_SH3 n + define_bool CONFIG_CPU_SH4 y +fi +if [ "$CONFIG_CPU_SUBTYPE_SH7751R" = "y" -o \ + "$CONFIG_CPU_SUBTYPE_SH4_202" = "y" ]; then + bool 'Use 2-way set associative caches' CONFIG_SH_CACHE_ASSOC +fi if [ "$CONFIG_CPU_SUBTYPE_ST40STB1" = "y" ]; then define_bool CONFIG_CPU_SH3 n define_bool CONFIG_CPU_SH4 y @@ -157,6 +173,9 @@ hex 'Physical memory start address' CONFIG_MEMORY_START 08000000 hex 'Physical memory size' CONFIG_MEMORY_SIZE 00400000 fi + +hex 'Link address offset for booting' CONFIG_BOOT_LINK_OFFSET 00210000 + dep_bool 'Enable OC RAM zone (experimental)' CONFIG_SCRATCH_SPACE $CONFIG_EXPERIMENTAL if [ "$CONFIG_CPU_SUBTYPE_ST40" = "y" ]; then @@ -332,9 +351,9 @@ # source drivers/input/Config.in -if [ "$CONFIG_SH_DREAMCAST" = "y" ]; then - source drivers/maple/Config.in -fi +#if [ "$CONFIG_SH_DREAMCAST" = "y" ]; then +# source drivers/maple/Config.in +#fi mainmenu_option next_comment comment 'Character devices' @@ -465,6 +484,9 @@ 8 CONFIG_KGDB_DEFBITS_8" 8 endmenu fi + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/Makefile linux-2.4.23-pre8/arch/sh/kernel/Makefile --- linux-2.4.22/arch/sh/kernel/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/Makefile 2003-10-22 22:49:04.000000000 +0000 @@ -93,6 +93,9 @@ obj-$(CONFIG_SH_KEYWEST) += mach_keywest.o setup_keywest.o io_keywest.o machine-specific-objs += mach_keywest.o setup_keywest.o io_keywest.o +obj-$(CONFIG_SH_SH4202_MICRODEV)+= mach_microdev.o setup_microdev.o io_microdev.o irq_microdev.o +machine-specific-objs += mach_microdev.o setup_microdev.o io_microdev.o irq_microdev.o + # Doesn't compile well, so don't include in machine-specific-objs obj-$(CONFIG_HD64465) += setup_hd64465.o io_hd64465.o hd64465_gpio.o obj-$(CONFIG_SH_DMIDA) += mach_dmida.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/entry.S linux-2.4.23-pre8/arch/sh/kernel/entry.S --- linux-2.4.22/arch/sh/kernel/entry.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/entry.S 2003-10-22 22:48:32.000000000 +0000 @@ -589,6 +589,7 @@ mov #0, k1 mov.b k1, @k0 #endif + mov.l @r15+, k2 ! restore EXPEVT mov k4, r15 rte nop @@ -678,6 +679,7 @@ 9: mov.l 3f, k1 ! ! Save the user registers on the stack. + mov.l k2, @-r15 ! EXPEVT add #-4, r15 ! placeholder ! sts.l macl, @-r15 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/fpu.c linux-2.4.23-pre8/arch/sh/kernel/fpu.c --- linux-2.4.22/arch/sh/kernel/fpu.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/fpu.c 2003-10-22 22:49:01.000000000 +0000 @@ -18,6 +18,14 @@ #include #include +/* The PR (precision) bit in the FP Status Register must be clear when + * an frchg instruction is executed, otherwise the instruction is undefined. + * Executing frchg with PR set causes a trap on some SH4 implementations. + */ + +#define FPSCR_RCHG 0x00000000 + + /* * Save FPU registers onto task structure. * Assume called with FPU enabled (SR.FD=0). @@ -61,9 +69,11 @@ "fmov.s fr3, @-%0\n\t" "fmov.s fr2, @-%0\n\t" "fmov.s fr1, @-%0\n\t" - "fmov.s fr0, @-%0" + "fmov.s fr0, @-%0\n\t" + "lds %2, fpscr\n\t" : /* no output */ : "r" ((char *)(&tsk->thread.fpu.hard.status)), + "r" (FPSCR_RCHG), "r" (FPSCR_INIT) : "memory"); @@ -112,7 +122,7 @@ "lds.l @%0+, fpscr\n\t" "lds.l @%0+, fpul\n\t" : /* no output */ - : "r" (&tsk->thread.fpu), "r" (FPSCR_INIT) + : "r" (&tsk->thread.fpu), "r" (FPSCR_RCHG) : "memory"); } @@ -160,9 +170,10 @@ "fsts fpul, fr13\n\t" "fsts fpul, fr14\n\t" "fsts fpul, fr15\n\t" - "frchg" + "frchg\n\t" + "lds %2, fpscr\n\t" : /* no output */ - : "r" (0), "r" (FPSCR_INIT)); + : "r" (0), "r" (FPSCR_RCHG), "r" (FPSCR_INIT)); } /** diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/io_microdev.c linux-2.4.23-pre8/arch/sh/kernel/io_microdev.c --- linux-2.4.22/arch/sh/kernel/io_microdev.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/io_microdev.c 2003-10-22 22:49:57.000000000 +0000 @@ -0,0 +1,219 @@ +/* + * linux/arch/sh/kernel/io_microdev.c + * + * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com) + * + * SuperH SH4-202 MicroDev board support. + * + * May be copied or modified under the terms of the GNU General Public + * License. See linux/COPYING for more information. + */ + +#include +#include +#include + + + /* + * we need to have a 'safe' address to re-direct all I/O requests + * that we do not explicitly wish to handle. This safe address + * must have the following properies: + * + * * writes are ignored (no exception) + * * reads are benign (no side-effects) + * * accesses of width 1, 2 and 4-bytes are all valid. + * + * The Processor Version Register (PVR) has these properties. + */ +#define PVR 0xff000030 /* Processor Version Register */ + + +#define IO_LAN91C111 0x300ul /* I/O port for SMSC LAN91C111 Ethernet chip */ + +#define PORT2ADDR(x) (microdev_isa_port2addr(x)) + + +static inline void delay(void) +{ + ctrl_inw(0xa0000000); +} + +unsigned char microdev_inb(unsigned long port) +{ + return *(volatile unsigned char*)PORT2ADDR(port); +} + +unsigned short microdev_inw(unsigned long port) +{ + return *(volatile unsigned short*)PORT2ADDR(port); +} + +unsigned int microdev_inl(unsigned long port) +{ + return *(volatile unsigned int*)PORT2ADDR(port); +} + +void microdev_outb(unsigned char b, unsigned long port) +{ + /* + * There is a board feature with the current SH4-202 MicroDev + * in that the 2 byte enables (nBE0 and nBE1) are tied together (and to the + * Chip Select Line (Ethernet_CS)). Due to this conectivity, it is not possible + * to safely perform 8-bit writes to the Ethernet registers, as 16-bits + * will be consumed from the Data lines (corrupting the other byte). + * Hence, this function is written to impliment 16-bit read/modify/write + * for all byte-wide acceses. + * + * Note: there is no problem with byte READS (even or odd). + * + * Sean McGoogan - 16th June 2003. + */ + if ( (port>=IO_LAN91C111) && (port=IO_LAN91C111) && (offset - * Based largely on io_se.c - * - * I/O routine for SH-Mobile SolutionEngine. + * Copyright (C) 2003 YOSHII Takashi */ #include -#include -#include #include -#include +#include + +#define badio(fn, a) panic("bad i/o operation %s for %08lx.", #fn, a) + +struct iop { + unsigned long start, end; + unsigned long base; + struct iop *(*check)(struct iop *p, unsigned long port); + unsigned char (*inb)(struct iop *p, unsigned long port); + unsigned short (*inw)(struct iop *p, unsigned long port); + void (*outb)(struct iop *p, unsigned char value, unsigned long port); + void (*outw)(struct iop *p, unsigned short value, unsigned long port); +}; + +struct iop *simple_check(struct iop *p, unsigned long port){ + if((p->start <= port) && (port <= p->end)) + return p; + else + badio(check, port); +} + +unsigned short simple_inw(struct iop *p, unsigned long port){ + return *(unsigned short*)(p->base+port); +} + +void simple_outw(struct iop *p, unsigned short value, unsigned long port){ + *(unsigned short*)(p->base+port)=value; +} + +unsigned char bad_inb(struct iop *p, unsigned long port) +{ + badio(inb, port); +} + +void bad_outb(struct iop *p, unsigned char value, unsigned long port){ + badio(inw, port); +} + +/* MSTLANEX01 LAN at 0xb400:0000 */ +static struct iop laniop = { + .start = 0x200, // device is at 0x300, but start here for probing. + .end = 0x30f, + .base = 0xb4000000, + .check = simple_check, + .inb = bad_inb, + .inw = simple_inw, + .outb = bad_outb, + .outw = simple_outw, +}; + +static __inline__ struct iop *port2iop(unsigned long port){ + if(laniop.check(&laniop, port)) + return &laniop; + else + badio(check, port); /* XXX: dummy fallback routine? */ +} static inline void delay(void) { @@ -19,151 +69,117 @@ ctrl_inw(0xac000000); } -#define maybebadio(name,port) \ - printk("bad PC-like io %s for port 0x%lx at 0x%08lx\n", \ - #name, (port), (volatile unsigned long) __builtin_return_address(0)) - unsigned char shmse_inb(unsigned long port) { - if (PXSEG(port)){ - return *(volatile unsigned char *) port; - }else{ - maybebadio(inb, port); - return 0; - } + struct iop *p=port2iop(port); + return (p->inb)(p, port); } unsigned char shmse_inb_p(unsigned long port) { - unsigned char v; - - if (PXSEG(port)){ - v = *(volatile unsigned char *)port; - }else{ - maybebadio(inb_p, port); - return 0; - } + unsigned char v=shmse_inb(port); delay(); return v; } unsigned short shmse_inw(unsigned long port) { - if (PXSEG(port)){ - return *(volatile unsigned short *) port; - }else{ - maybebadio(inw, port); - return 0; - } + struct iop *p=port2iop(port); + return (p->inw)(p, port); } unsigned int shmse_inl(unsigned long port) { - if (PXSEG(port)){ - return *(volatile unsigned short *) port; - }else{ - maybebadio(inl, port); - return 0; - } + badio(inl, port); } void shmse_outb(unsigned char value, unsigned long port) { - if (PXSEG(port)){ - *(volatile unsigned char *)port = value; - }else{ - maybebadio(outb, port); - } + struct iop *p=port2iop(port); + (p->outb)(p, value, port); } void shmse_outb_p(unsigned char value, unsigned long port) { - if (PXSEG(port)){ - *(volatile unsigned char *)port = value; - }else{ - maybebadio(outb_p, port); - } + shmse_outb(value, port); delay(); } void shmse_outw(unsigned short value, unsigned long port) { - if (PXSEG(port)){ - *(volatile unsigned short *)port = value; - }else{ - maybebadio(outw, port); - } + struct iop *p=port2iop(port); + (p->outw)(p, value, port); } void shmse_outl(unsigned int value, unsigned long port) { - if (PXSEG(port)){ - *(volatile unsigned long *)port = value; - }else{ - maybebadio(outl, port); - } + badio(outl, port); } void shmse_insb(unsigned long port, void *addr, unsigned long count) { - unsigned char *p = addr; - while (count--) *p++ = shmse_inb(port); + unsigned char *a = addr; + struct iop *p=port2iop(port); + while (count--) *a++ = (p->inb)(p, port); } void shmse_insw(unsigned long port, void *addr, unsigned long count) { - unsigned short *p = addr; - while (count--) *p++ = shmse_inw(port); + unsigned short *a = addr; + struct iop *p=port2iop(port); + while (count--) *a++ = (p->inw)(p, port); } void shmse_insl(unsigned long port, void *addr, unsigned long count) { - maybebadio(insl, port); + badio(insl, port); } void shmse_outsb(unsigned long port, const void *addr, unsigned long count) { - unsigned char *p = (unsigned char *)addr; - while (count--) shmse_outb(*p++, port); + unsigned char *a = (unsigned char*)addr; + struct iop *p=port2iop(port); + while (count--) (p->outb)(p, *a++, port); } void shmse_outsw(unsigned long port, const void *addr, unsigned long count) { - unsigned short *p = (unsigned short *)addr; - while (count--) shmse_outw(*p++, port); + unsigned short *a = (unsigned short*)addr; + struct iop *p=port2iop(port); + while (count--) (p->outw)(p, *a++, port); } void shmse_outsl(unsigned long port, const void *addr, unsigned long count) { - maybebadio(outsw, port); + badio(outsw, port); } unsigned char shmse_readb(unsigned long addr) { - return *(volatile unsigned char*)addr; + badio(readb, addr); } unsigned short shmse_readw(unsigned long addr) { - return *(volatile unsigned short*)addr; + badio(readw, addr); } unsigned int shmse_readl(unsigned long addr) { - return *(volatile unsigned long*)addr; + badio(readl, addr); } void shmse_writeb(unsigned char b, unsigned long addr) { - *(volatile unsigned char*)addr = b; + badio(writeb, addr); } void shmse_writew(unsigned short b, unsigned long addr) { - *(volatile unsigned short*)addr = b; + badio(writew, addr); } void shmse_writel(unsigned int b, unsigned long addr) { - *(volatile unsigned long*)addr = b; + badio(writel, addr); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/irq_intc2.c linux-2.4.23-pre8/arch/sh/kernel/irq_intc2.c --- linux-2.4.22/arch/sh/kernel/irq_intc2.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/irq_intc2.c 2003-10-22 22:49:11.000000000 +0000 @@ -12,6 +12,8 @@ * Hitachi 7751 and the STM ST40 STB1. */ +#include +#include #include #include #include @@ -22,8 +24,11 @@ struct intc2_data { - unsigned int addr; /* Address of Interrupt Priority Register */ - int mask; /*Mask to apply */ + unsigned char msk_offset; + unsigned char msk_shift; +#ifdef CONFIG_CPU_SUBTYPE_ST40 + int (*clear_irq) (int); +#endif }; @@ -56,33 +61,34 @@ static void disable_intc2_irq(unsigned int irq) { - unsigned addr; - int offset=irq-INTC2_FIRST_IRQ; - unsigned val,flags; + int irq_offset = irq - INTC2_FIRST_IRQ; + int msk_shift, msk_offset; // Sanity check - if(offset<0 || offset>=NR_INTC2_IRQS) return; - - addr=intc2_data[offset].addr+INTC2_INTMSK_OFFSET; + if((irq_offset<0) || (irq_offset>=NR_INTC2_IRQS)) + return; - save_and_cli(flags); - val=ctrl_inl(addr); - val|=intc2_data[offset].mask; - ctrl_outl(val,addr); + msk_shift = intc2_data[irq_offset].msk_shift; + msk_offset = intc2_data[irq_offset].msk_offset; - restore_flags(flags); + ctrl_outl(1<=NR_INTC2_IRQS) return; + /* Sanity check */ + if((irq_offset<0) || (irq_offset>=NR_INTC2_IRQS)) + return; - ctrl_outl(intc2_data[offset].mask, - intc2_data[offset].addr+INTC2_INTMSKCLR_OFFSET); + msk_shift = intc2_data[irq_offset].msk_shift; + msk_offset = intc2_data[irq_offset].msk_offset; + ctrl_outl(1<=NR_INTC2_IRQS) { + if((irq_offset<0) || (irq_offset>=NR_INTC2_IRQS)) return; - } + disable_irq_nosync(irq); - /* Fill the data we need */ - intc2_data[offset].addr=addr; - intc2_data[offset].mask=1<irq, p->ipr_offset, p->ipr_shift, + p-> msk_offset, p->msk_shift, 13); + } +} + +/* Adds a termination callback to the interrupt */ +void intc2_add_clear_irq(int irq, int (*fn)(int)) +{ + if (irq < INTC2_FIRST_IRQ) + return; + + intc2_data[irq - INTC2_FIRST_IRQ].clear_irq = fn; +} +#endif /* CONFIG_CPU_SUBTYPE_ST40 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/irq_ipr.c linux-2.4.23-pre8/arch/sh/kernel/irq_ipr.c --- linux-2.4.22/arch/sh/kernel/irq_ipr.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/irq_ipr.c 2003-10-22 22:48:30.000000000 +0000 @@ -1,4 +1,4 @@ -/* $Id: irq_ipr.c,v 1.1.1.1.2.1 2003/07/16 18:41:20 yoshii Exp $ +/* $Id: irq_ipr.c,v 1.1.1.1.2.2 2003/10/14 16:46:10 trent Exp $ * * linux/arch/sh/kernel/irq_ipr.c * @@ -274,6 +274,10 @@ #endif #endif /* CONFIG_CPU_SUBTYPE_SH7300 || CONFIG_CPU_SUBTYPE_SH7707 || CONFIG_CPU_SUBTYPE_SH7709 */ +#ifdef CONFIG_CPU_SUBTYPE_ST40 + init_IRQ_intc2(); +#endif + /* Perform the machine specific initialisation */ if (sh_mv.mv_init_irq != NULL) { sh_mv.mv_init_irq(); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/irq_microdev.c linux-2.4.23-pre8/arch/sh/kernel/irq_microdev.c --- linux-2.4.22/arch/sh/kernel/irq_microdev.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/irq_microdev.c 2003-10-22 22:49:53.000000000 +0000 @@ -0,0 +1,158 @@ +/* + * linux/arch/sh/kernel/irq_microdev.c + * + * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com) + * + * SuperH SH4-202 MicroDev board support. + * + * May be copied or modified under the terms of the GNU General Public + * License. See linux/COPYING for more information. + */ + +#include +#include +#include + +#include +#include +#include + +#define NUM_EXTERNAL_IRQS 16 /* IRL0 .. IRL15 */ + + +static const struct +{ + unsigned char fpgaIrq; + unsigned char mapped; + const char *name; +} fpgaIrqTable[NUM_EXTERNAL_IRQS] = +{ + { 0, 0, "unused" }, /* IRQ #0 IRL=15 0x200 */ + { 0, 0, "unused" }, /* IRQ #1 IRL=14 0x220 */ + { 0, 0, "unused" }, /* IRQ #2 IRL=13 0x240 */ + { 18, 1, "Ethernet" }, /* IRQ #3 IRL=12 0x260 */ + { 0, 0, "unused" }, /* IRQ #4 IRL=11 0x280 */ + { 0, 0, "unused" }, /* IRQ #5 IRL=10 0x2a0 */ + { 0, 0, "unused" }, /* IRQ #6 IRL=9 0x2c0 */ + { 0, 0, "unused" }, /* IRQ #7 IRL=8 0x2e0 */ + { 8, 1, "PCI INTA" }, /* IRQ #8 IRL=7 0x300 */ + { 9, 1, "PCI INTB" }, /* IRQ #9 IRL=6 0x320 */ + { 10, 1, "PCI INTC" }, /* IRQ #10 IRL=5 0x340 */ + { 11, 1, "PCI INTD" }, /* IRQ #11 IRL=4 0x360 */ + { 0, 0, "unused" }, /* IRQ #12 IRL=3 0x380 */ + { 0, 0, "unused" }, /* IRQ #13 IRL=2 0x3a0 */ + { 0, 0, "unused" }, /* IRQ #14 IRL=1 0x3c0 */ + { 0, 0, "unused" }, /* IRQ #15 IRL=0 0x3e0 */ +}; + +static void enable_microdev_irq(unsigned int irq); +static void disable_microdev_irq(unsigned int irq); + + /* shutdown is same as "disable" */ +#define shutdown_microdev_irq disable_microdev_irq + +static void mask_and_ack_microdev(unsigned int); +static void end_microdev_irq(unsigned int irq); + +static unsigned int startup_microdev_irq(unsigned int irq) +{ + enable_microdev_irq(irq); + return 0; /* never anything pending */ +} + +static struct hw_interrupt_type microdev_irq_type = { + "MicroDev-IRQ", + startup_microdev_irq, + shutdown_microdev_irq, + enable_microdev_irq, + disable_microdev_irq, + mask_and_ack_microdev, + end_microdev_irq +}; + +static void disable_microdev_irq(unsigned int irq) +{ + unsigned int flags; + unsigned int fpgaIrq; + + if (irq >= NUM_EXTERNAL_IRQS) return; + if (!fpgaIrqTable[irq].mapped) return; + + fpgaIrq = fpgaIrqTable[irq].fpgaIrq; + + /* disable interrupts */ + save_and_cli(flags); + + /* disable interupts on the FPGA INTC register */ + ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTDSB_REG); + + /* restore interrupts */ + restore_flags(flags); +} + +static void enable_microdev_irq(unsigned int irq) +{ + unsigned long priorityReg, priorities, pri; + unsigned int flags; + unsigned int fpgaIrq; + + + if (irq >= NUM_EXTERNAL_IRQS) return; + if (!fpgaIrqTable[irq].mapped) return; + + pri = 15 - irq; + + fpgaIrq = fpgaIrqTable[irq].fpgaIrq; + priorityReg = MICRODEV_FPGA_INTPRI_REG(fpgaIrq); + + /* disable interrupts */ + save_and_cli(flags); + + /* set priority for the interrupt */ + priorities = ctrl_inl(priorityReg); + priorities &= ~MICRODEV_FPGA_INTPRI_MASK(fpgaIrq); + priorities |= MICRODEV_FPGA_INTPRI_LEVEL(fpgaIrq, pri); + ctrl_outl(priorities, priorityReg); + + /* enable interupts on the FPGA INTC register */ + ctrl_outl(MICRODEV_FPGA_INTC_MASK(fpgaIrq), MICRODEV_FPGA_INTENB_REG); + + /* restore interrupts */ + restore_flags(flags); +} + + /* This functions sets the desired irq handler to be a MicroDev type */ +static void __init make_microdev_irq(unsigned int irq) +{ + disable_irq_nosync(irq); + irq_desc[irq].handler = µdev_irq_type; + disable_microdev_irq(irq); +} + +static void mask_and_ack_microdev(unsigned int irq) +{ + disable_microdev_irq(irq); +} + +static void end_microdev_irq(unsigned int irq) +{ + if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) + { + enable_microdev_irq(irq); + } +} + +extern void __init init_microdev_irq(void) +{ + int i; + + /* disable interupts on the FPGA INTC register */ + ctrl_outl(~0ul, MICRODEV_FPGA_INTDSB_REG); + + for (i = 0; i < NUM_EXTERNAL_IRQS; i++) + { + make_microdev_irq(i); + } +} + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/mach_microdev.c linux-2.4.23-pre8/arch/sh/kernel/mach_microdev.c --- linux-2.4.22/arch/sh/kernel/mach_microdev.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/mach_microdev.c 2003-10-22 22:47:50.000000000 +0000 @@ -0,0 +1,77 @@ +/* + * linux/arch/sh/kernel/mach_microdev.c + * + * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com) + * + * Machine vector for the SuperH SH4-202 MicroDev board. + * + * May be copied or modified under the terms of the GNU General Public + * License. See linux/COPYING for more information. + * + */ + +#include +#include + +#include +#include +#include + +#include +#include + +void setup_microdev(void); + +/* + * The Machine Vector + */ + +struct sh_machine_vector mv_sh4202_microdev __initmv = { + mv_name: "SH4-202 MicroDev", + + mv_nr_irqs: 72, /* QQQ need to check this - use the MACRO */ + + mv_inb: microdev_inb, + mv_inw: microdev_inw, + mv_inl: microdev_inl, + mv_outb: microdev_outb, + mv_outw: microdev_outw, + mv_outl: microdev_outl, + + mv_inb_p: microdev_inb_p, + mv_inw_p: microdev_inw_p, + mv_inl_p: microdev_inl_p, + mv_outb_p: microdev_outb_p, + mv_outw_p: microdev_outw_p, + mv_outl_p: microdev_outl_p, + + mv_insb: microdev_insb, + mv_insw: microdev_insw, + mv_insl: microdev_insl, + mv_outsb: microdev_outsb, + mv_outsw: microdev_outsw, + mv_outsl: microdev_outsl, + + mv_readb: generic_readb, + mv_readw: generic_readw, + mv_readl: generic_readl, + mv_writeb: generic_writeb, + mv_writew: generic_writew, + mv_writel: generic_writel, + + mv_ioremap: generic_ioremap, + mv_iounmap: generic_iounmap, + + mv_isa_port2addr: microdev_isa_port2addr, + + mv_init_arch: setup_microdev, + + mv_init_irq: init_microdev_irq, + + mv_rtc_gettimeofday: sh_rtc_gettimeofday, + mv_rtc_settimeofday: sh_rtc_settimeofday, + + mv_hw_sh4202_microdev: 1, +}; +ALIAS_MV(sh4202_microdev) + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/setup_microdev.c linux-2.4.23-pre8/arch/sh/kernel/setup_microdev.c --- linux-2.4.22/arch/sh/kernel/setup_microdev.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/setup_microdev.c 2003-10-22 22:47:29.000000000 +0000 @@ -0,0 +1,37 @@ +/* + * linux/arch/sh/kernel/setup_microdev.c + * + * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com) + * + * SuperH SH4-202 MicroDev board support. + * + * May be copied or modified under the terms of the GNU General Public + * License. See linux/COPYING for more information. + */ + +#include +#include +#include + + /* General-Purpose base address on CPU-board FPGA */ +#define MICRODEV_FPGA_GP_BASE 0xa6100000ul + + /* Address of Cache Control Register */ +#define CCR 0xff00001cul + +/* + * Initialize the board + */ +void __init setup_microdev(void) +{ + int * const fpgaRevisionRegister = (int*)(MICRODEV_FPGA_GP_BASE + 0x8ul); + const int fpgaRevision = *fpgaRevisionRegister; + int * const CacheControlRegister = (int*)CCR; + + printk("SuperH SH4-202 MicroDev board (FPGA rev: 0x%0x, CCR: 0x%0x)\n", + fpgaRevision, *CacheControlRegister); + + return; +} + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/setup_shmse.c linux-2.4.23-pre8/arch/sh/kernel/setup_shmse.c --- linux-2.4.22/arch/sh/kernel/setup_shmse.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/setup_shmse.c 2003-10-22 22:48:20.000000000 +0000 @@ -15,6 +15,12 @@ void __init init_shmse_IRQ(void) { + ctrl_outw(0x0028, 0xb0a00000); // mode set [active low]. + ctrl_outw(0x000a, INTC_ICR1); // IRQ mode; IRQ0,1 enable. + /* PC_IRQ[0-3] -> IRQ0 (32) */ + make_ipr_irq( IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, 0x0f-IRQ0_IRQ); + /* A_IRQ[0-3] -> IRQ1 (33) */ + make_ipr_irq( IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, 0x0f-IRQ1_IRQ); } void __init setup_shmse(void) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/sh_ksyms.c linux-2.4.23-pre8/arch/sh/kernel/sh_ksyms.c --- linux-2.4.22/arch/sh/kernel/sh_ksyms.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/sh_ksyms.c 2003-10-22 22:47:59.000000000 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include #include extern void dump_thread(struct pt_regs *, struct user *); @@ -38,6 +39,7 @@ /* Networking helper routines. */ EXPORT_SYMBOL(csum_partial_copy); +EXPORT_SYMBOL(csum_partial_copy_generic); EXPORT_SYMBOL(strtok); EXPORT_SYMBOL(strpbrk); @@ -45,6 +47,7 @@ EXPORT_SYMBOL(strlen); EXPORT_SYMBOL(strnlen); EXPORT_SYMBOL(strchr); +EXPORT_SYMBOL(strrchr); EXPORT_SYMBOL(strcat); EXPORT_SYMBOL(strncat); @@ -81,6 +84,8 @@ EXPORT_SYMBOL(__down_interruptible); EXPORT_SYMBOL(__down_trylock); +/* Delay loops */ +EXPORT_SYMBOL(__ndelay); EXPORT_SYMBOL(__udelay); EXPORT_SYMBOL(__const_udelay); @@ -105,3 +110,4 @@ EXPORT_SYMBOL(flush_dcache_page); #endif EXPORT_SYMBOL(flush_tlb_page); +EXPORT_SYMBOL(__xdiv64_32); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/kernel/signal.c linux-2.4.23-pre8/arch/sh/kernel/signal.c --- linux-2.4.22/arch/sh/kernel/signal.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/kernel/signal.c 2003-10-22 22:49:58.000000000 +0000 @@ -1,4 +1,4 @@ -/* $Id: signal.c,v 1.1.1.1.2.11 2002/10/23 00:57:46 mrbrown Exp $ +/* $Id: signal.c,v 1.1.1.1.2.12 2003/10/01 10:54:28 kkojima Exp $ * * linux/arch/sh/kernel/signal.c * @@ -168,21 +168,22 @@ * Do a signal return; undo the signal stack. */ -#define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */ -#define TRAP16 0xc310 /* Syscall w/no args (NR in R3) */ +#define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */ +#define TRAP16 0xc310 /* Syscall w/no args (NR in R3) */ +#define OR_R0_R0 0x200b /* or r0,r0 (insert to avoid hardware bug) */ struct sigframe { struct sigcontext sc; unsigned long extramask[_NSIG_WORDS-1]; - u16 retcode[3]; + u16 retcode[8]; }; struct rt_sigframe { struct siginfo info; struct ucontext uc; - u16 retcode[3]; + u16 retcode[8]; }; #if defined(__SH4__) @@ -397,9 +398,14 @@ regs->pr = (unsigned long) ka->sa.sa_restorer; } else { /* Generate return code (system call to sigreturn) */ - err |= __put_user(MOVW(2), &frame->retcode[0]); + err |= __put_user(MOVW(7), &frame->retcode[0]); err |= __put_user(TRAP16, &frame->retcode[1]); - err |= __put_user((__NR_sigreturn), &frame->retcode[2]); + err |= __put_user(OR_R0_R0, &frame->retcode[2]); + err |= __put_user(OR_R0_R0, &frame->retcode[3]); + err |= __put_user(OR_R0_R0, &frame->retcode[4]); + err |= __put_user(OR_R0_R0, &frame->retcode[5]); + err |= __put_user(OR_R0_R0, &frame->retcode[6]); + err |= __put_user((__NR_sigreturn), &frame->retcode[7]); regs->pr = (unsigned long) frame->retcode; } @@ -409,6 +415,8 @@ /* Set up registers for signal handler */ regs->regs[15] = (unsigned long) frame; regs->regs[4] = signal; /* Arg for signal handler */ + regs->regs[5] = 0; + regs->regs[6] = (unsigned long) &frame->sc; regs->pc = (unsigned long) ka->sa.sa_handler; set_fs(USER_DS); @@ -419,6 +427,8 @@ #endif flush_cache_sigtramp(regs->pr); + if ((-regs->pr & (L1_CACHE_BYTES-1)) < sizeof(frame->retcode)) + flush_cache_sigtramp(regs->pr + L1_CACHE_BYTES); return; give_sigsegv: @@ -465,9 +475,14 @@ regs->pr = (unsigned long) ka->sa.sa_restorer; } else { /* Generate return code (system call to rt_sigreturn) */ - err |= __put_user(MOVW(2), &frame->retcode[0]); + err |= __put_user(MOVW(7), &frame->retcode[0]); err |= __put_user(TRAP16, &frame->retcode[1]); - err |= __put_user((__NR_rt_sigreturn), &frame->retcode[2]); + err |= __put_user(OR_R0_R0, &frame->retcode[2]); + err |= __put_user(OR_R0_R0, &frame->retcode[3]); + err |= __put_user(OR_R0_R0, &frame->retcode[4]); + err |= __put_user(OR_R0_R0, &frame->retcode[5]); + err |= __put_user(OR_R0_R0, &frame->retcode[6]); + err |= __put_user((__NR_rt_sigreturn), &frame->retcode[7]); regs->pr = (unsigned long) frame->retcode; } @@ -489,6 +504,8 @@ #endif flush_cache_sigtramp(regs->pr); + if ((-regs->pr & (L1_CACHE_BYTES-1)) < sizeof(frame->retcode)) + flush_cache_sigtramp(regs->pr + L1_CACHE_BYTES); return; give_sigsegv: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/lib/Makefile linux-2.4.23-pre8/arch/sh/lib/Makefile --- linux-2.4.22/arch/sh/lib/Makefile 2001-09-08 19:29:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/lib/Makefile 2003-10-22 22:48:55.000000000 +0000 @@ -4,7 +4,7 @@ L_TARGET = lib.a obj-y = delay.o memcpy.o memset.o memmove.o memchr.o old-checksum.o \ - checksum.o strcasecmp.o strlen.o + checksum.o strcasecmp.o strlen.o udivdi3.o div64.o USE_STANDARD_AS_RULE := true diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/lib/div64.S linux-2.4.23-pre8/arch/sh/lib/div64.S --- linux-2.4.22/arch/sh/lib/div64.S 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/lib/div64.S 2003-10-22 22:47:59.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * unsigned long long __xdiv64_32(unsigned long long n, unsigned long d); + */ + +#include + +.text +ENTRY(__xdiv64_32) +#ifdef __LITTLE_ENDIAN__ + mov r4, r0 + mov r5, r1 +#else + mov r4, r1 + mov r5, r0 +#endif + cmp/hs r6, r1 + bf.s 1f + mov #0, r2 + + mov r1, r2 + mov #0, r3 + div0u + .rept 32 + rotcl r2 + div1 r6, r3 + .endr + rotcl r2 + mul.l r6, r2 + sts macl, r3 + sub r3, r1 +1: + div0u + .rept 32 + rotcl r0 + div1 r6, r1 + .endr +#ifdef __LITTLE_ENDIAN__ + mov r2, r1 + rts + rotcl r0 +#else + rotcl r0 + mov r0, r1 + rts + mov r2, r0 +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/lib/udivdi3.c linux-2.4.23-pre8/arch/sh/lib/udivdi3.c --- linux-2.4.22/arch/sh/lib/udivdi3.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/lib/udivdi3.c 2003-10-22 22:47:56.000000000 +0000 @@ -0,0 +1,16 @@ +/* + * Simple __udivdi3 function which doesn't use FPU. + */ + +#include + +extern u64 __xdiv64_32(u64 n, u32 d); +extern void panic(const char * fmt, ...); + +u64 __udivdi3(u64 n, u64 d) +{ + if (d & ~0xffffffff) + panic("Need true 64-bit/64-bit division"); + return __xdiv64_32(n, (u32)d); +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/mm/__clear_user_page-sh4.S linux-2.4.23-pre8/arch/sh/mm/__clear_user_page-sh4.S --- linux-2.4.22/arch/sh/mm/__clear_user_page-sh4.S 2001-09-08 19:29:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/mm/__clear_user_page-sh4.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* $Id$ - * - * __clear_user_page implementation of SuperH - * - * Copyright (C) 2001 Niibe Yutaka & Kaz Kojima - * - */ - -/* - * __clear_user_page - * @to: P1 address (with same color) - * @orig_to: P1 address - * - * void __clear_user_page(void *to, void *orig_to) - */ - -/* - * r0 --- scratch - * r4 --- to - * r5 --- orig_to - * r6 --- to + 4096 - */ -#include -ENTRY(__clear_user_page) - mov r4,r6 - mov.w .L4096,r0 - add r0,r6 - mov #0,r0 - ! -1: ocbi @r5 - add #32,r5 - movca.l r0,@r4 - mov r4,r1 - add #32,r4 - mov.l r0,@-r4 - mov.l r0,@-r4 - mov.l r0,@-r4 - mov.l r0,@-r4 - mov.l r0,@-r4 - mov.l r0,@-r4 - mov.l r0,@-r4 - add #28,r4 - cmp/eq r6,r4 - bf/s 1b - ocbwb @r1 - ! - rts - nop -.L4096: .word 4096 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/mm/__copy_user_page-sh4.S linux-2.4.23-pre8/arch/sh/mm/__copy_user_page-sh4.S --- linux-2.4.22/arch/sh/mm/__copy_user_page-sh4.S 2001-09-08 19:29:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/mm/__copy_user_page-sh4.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -/* $Id: __copy_user_page-sh4.S,v 1.1 2001/07/23 09:02:17 gniibe Exp $ - * - * __copy_user_page implementation of SuperH - * - * Copyright (C) 2001 Niibe Yutaka & Kaz Kojima - * - */ - -/* - * __copy_user_page - * @to: P1 address (with same color) - * @from: P1 address - * @orig_to: P1 address - * - * void __copy_user_page(void *to, void *from, void *orig_to) - */ - -/* - * r0, r1, r2, r3, r4, r5, r6, r7 --- scratch - * r8 --- from + 4096 - * r9 --- orig_to - * r10 --- to - * r11 --- from - */ -#include -ENTRY(__copy_user_page) - mov.l r8,@-r15 - mov.l r9,@-r15 - mov.l r10,@-r15 - mov.l r11,@-r15 - mov r4,r10 - mov r5,r11 - mov r6,r9 - mov r5,r8 - mov.w .L4096,r0 - add r0,r8 - ! -1: ocbi @r9 - add #32,r9 - mov.l @r11+,r0 - mov.l @r11+,r1 - mov.l @r11+,r2 - mov.l @r11+,r3 - mov.l @r11+,r4 - mov.l @r11+,r5 - mov.l @r11+,r6 - mov.l @r11+,r7 - movca.l r0,@r10 - mov r10,r0 - add #32,r10 - mov.l r7,@-r10 - mov.l r6,@-r10 - mov.l r5,@-r10 - mov.l r4,@-r10 - mov.l r3,@-r10 - mov.l r2,@-r10 - mov.l r1,@-r10 - ocbwb @r0 - cmp/eq r11,r8 - bf/s 1b - add #28,r10 - ! - mov.l @r15+,r11 - mov.l @r15+,r10 - mov.l @r15+,r9 - mov.l @r15+,r8 - rts - nop -.L4096: .word 4096 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/mm/cache-sh4.c linux-2.4.23-pre8/arch/sh/mm/cache-sh4.c --- linux-2.4.22/arch/sh/mm/cache-sh4.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/mm/cache-sh4.c 2003-10-22 22:48:00.000000000 +0000 @@ -32,8 +32,17 @@ #define CCR_CACHE_ICI 0x0800 /* IC Invalidate */ #define CCR_CACHE_IIX 0x8000 /* IC Index Enable */ -/* Default CCR setup: 8k+16k-byte cache,P1-wb,enable */ -#define CCR_CACHE_VAL (CCR_CACHE_ICE|CCR_CACHE_CB|CCR_CACHE_OCE) + + +#if defined(CONFIG_SH_CACHE_ASSOC) +#define CCR_CACHE_EMODE 0x80000000 +/* CCR setup for associative mode: 16k+32k 2-way, P1 copy-back, enable */ +#define CCR_CACHE_VAL (CCR_CACHE_EMODE|CCR_CACHE_ENABLE|CCR_CACHE_CB) +#else +/* Default CCR setup: 8k+16k-byte cache, P1-copy-back, enable */ +#define CCR_CACHE_VAL (CCR_CACHE_ENABLE|CCR_CACHE_CB) +#endif + #define CCR_CACHE_INIT (CCR_CACHE_VAL|CCR_CACHE_OCI|CCR_CACHE_ICI) #define CCR_CACHE_ENABLE (CCR_CACHE_OCE|CCR_CACHE_ICE) @@ -43,7 +52,7 @@ #define CACHE_UPDATED 2 #define CACHE_ASSOC 8 -#define CACHE_OC_WAY_SHIFT 13 +#define CACHE_OC_WAY_SHIFT 14 #define CACHE_IC_WAY_SHIFT 13 #define CACHE_OC_ENTRY_SHIFT 5 #define CACHE_IC_ENTRY_SHIFT 5 @@ -53,6 +62,8 @@ #define CACHE_IC_NUM_ENTRIES 256 #define CACHE_OC_NUM_ENTRIES 512 +#define CACHE_NUM_WAYS 2 + static void __init detect_cpu_and_cache_system(void) { @@ -60,6 +71,8 @@ cpu_data->type = CPU_ST40; #elif defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751) cpu_data->type = CPU_SH7750; +#elif defined(CONFIG_CPU_SUBTYPE_SH4_202) + cpu_data->type = CPU_SH4202; #else #error Unknown SH4 CPU type #endif @@ -80,6 +93,26 @@ */ unsigned long addr, data; +#if defined(CONFIG_SH_CACHE_ASSOC) + unsigned long way; + + for (way = 0; way <= CACHE_NUM_WAYS; ++way) { + unsigned long waybit = way << CACHE_OC_WAY_SHIFT; + + for (addr = CACHE_OC_ADDRESS_ARRAY + waybit; + addr < (CACHE_OC_ADDRESS_ARRAY + waybit + + (CACHE_OC_NUM_ENTRIES << + CACHE_OC_ENTRY_SHIFT)); + addr += (1 << CACHE_OC_ENTRY_SHIFT)) { + + data = ctrl_inl(addr); + + if ((data & (CACHE_UPDATED|CACHE_VALID)) + == (CACHE_UPDATED|CACHE_VALID)) + ctrl_outl(data & ~CACHE_UPDATED, addr); + } + } +#else for (addr = CACHE_OC_ADDRESS_ARRAY; addr < (CACHE_OC_ADDRESS_ARRAY+ (CACHE_OC_NUM_ENTRIES << CACHE_OC_ENTRY_SHIFT)); @@ -89,6 +122,7 @@ == (CACHE_UPDATED|CACHE_VALID)) ctrl_outl(data & ~CACHE_UPDATED, addr); } +#endif } ctrl_outl(CCR_CACHE_INIT, CCR); @@ -215,6 +249,12 @@ save_and_cli(flags); jump_to_P2(); ctrl_outl(0, index); /* Clear out Valid-bit */ + +#if defined(CONFIG_SH_CACHE_ASSOC) + /* Must invalidate both ways for associative cache */ + ctrl_outl(0, index | (1 << CACHE_IC_WAY_SHIFT)); +#endif + back_to_P1(); restore_flags(flags); } @@ -225,7 +265,7 @@ unsigned long flags; extern void __flush_cache_4096(unsigned long addr, unsigned long phys, unsigned long exec_offset); -#if defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_ST40) +#if defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_ST40) || defined(CONFIG_CPU_SUBTYPE_SH4_202) if (start >= CACHE_OC_ADDRESS_ARRAY) { /* * SH7751 and ST40 have no restriction to handle cache. @@ -481,3 +521,118 @@ up(&p3map_sem[(address & CACHE_ALIAS)>>12]); } } + + +/****************************************************************************/ + +#if defined(CONFIG_SH_CACHE_ASSOC) +/* + * It is no possible to use the approach implement in clear_page.S when we + * are in 2-way set associative mode as it would only clear half the cache, in + * general. For the moment we simply implement it as a iteration through the + * cache flushing both ways, this in itself is not optimial as the delay latency + * for interupts is probably longer than necessary! + * + * benedict.gaster.superh.com + */ +void __flush_dcache_all(void) +{ + unsigned long flags; + unsigned long addr; + unsigned long way; + + save_and_cli(flags); +#if !defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH4_202) + jump_to_P2(); +#endif + /* Clear the U and V bits for each line and each way. On SH-4, this + * causes write-back if both U and V are set before the address write. + */ + for (way = 0; way <= 1; ++way) { + unsigned long waybit = way << CACHE_OC_WAY_SHIFT; + + /* Loop all the D-cache */ + for (addr = CACHE_OC_ADDRESS_ARRAY + waybit; + addr < (CACHE_OC_ADDRESS_ARRAY + waybit + + (CACHE_OC_NUM_ENTRIES << CACHE_OC_ENTRY_SHIFT)); + addr += (1 << CACHE_OC_ENTRY_SHIFT)) { + ctrl_outl(0, addr); + } + } + +#if !defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH4_202) + back_to_P1(); +#endif + restore_flags(flags); +} + +void flush_cache_4096_all(unsigned long start) +{ + unsigned long phys = PHYSADDR(start); + + /* Loop all the D-cache */ + flush_cache_4096(CACHE_OC_ADDRESS_ARRAY, phys); +} +#endif + + + + + + +/****************************************************************************/ + +#if defined(CONFIG_SH_CACHE_ASSOC) +/* + * It is no possible to use the approach implement in clear_page.S when we + * are in 2-way set associative mode as it would only clear half the cache, in + * general. For the moment we simply implement it as a iteration through the + * cache flushing both ways, this in itself is not optimial as the delay latency + * for interupts is probably longer than necessary! + * + * benedict.gaster.superh.com + */ +void __flush_dcache_all(void) +{ + unsigned long flags; + unsigned long addr; + unsigned long way; + + save_and_cli(flags); +#if !defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH4_202) + jump_to_P2(); +#endif + /* Clear the U and V bits for each line and each way. On SH-4, this + * causes write-back if both U and V are set before the address write. + */ + for (way = 0; way <= 1; ++way) { + unsigned long waybit = way << CACHE_OC_WAY_SHIFT; + + /* Loop all the D-cache */ + for (addr = CACHE_OC_ADDRESS_ARRAY + waybit; + addr < (CACHE_OC_ADDRESS_ARRAY + waybit + + (CACHE_OC_NUM_ENTRIES << CACHE_OC_ENTRY_SHIFT)); + addr += (1 << CACHE_OC_ENTRY_SHIFT)) { + ctrl_outl(0, addr); + } + } + +#if !defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH4_202) + back_to_P1(); +#endif + restore_flags(flags); +} + +void flush_cache_4096_all(unsigned long start) +{ + unsigned long phys = PHYSADDR(start); + + /* Loop all the D-cache */ + flush_cache_4096(CACHE_OC_ADDRESS_ARRAY, phys); +} +#endif + + + + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh/mm/clear_page.S linux-2.4.23-pre8/arch/sh/mm/clear_page.S --- linux-2.4.22/arch/sh/mm/clear_page.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh/mm/clear_page.S 2003-10-22 22:48:12.000000000 +0000 @@ -194,6 +194,40 @@ nop .L4096: .word 4096 +/* + * __flush_cache_4096 + * + * Flush the page at the specified physical address by writing to to + * the memory mapped address array. + * The offset into the memory mapped cache array selects the `color' of the + * virtual addresses which will be checked. + * Lower two bits of phys control the operation (invalidate/write-back). + * + * void __flush_cache_4096(unsigned long addr, unsigned long phys, + * unsigned long exec_offset); + * + * @addr: address of the memory mapped cache address array + * @phys: P1 address to be flushed + * @exec_offset: set to 0x20000000 if the flush needs to be executed from P2 + * (ie from uncached memory), otherwise 0. + */ + +/* + * Updated for the 2-way associative cache option on the SH-4-202 and SH7751R. + * + * The current implmentation simply adds an additional loop to flush the + * other way, but this could be improved by merging both loops to handle the + * flushing of boths ways with one iteration. + * + * benedict.gaster@superh.com + */ + +/* + * r4 --- addr + * r5 --- phys + * r6 --- exec_offset + */ + ENTRY(__flush_cache_4096) mov.l 1f,r3 add r6,r3 @@ -206,6 +240,9 @@ .align 2 1: .long 2f 2: +#if defined (CONFIG_SH_CACHE_ASSOC) + mov r5, r3 +#endif .rept 32 mov.l r5,@r0 mov.l r5,@(32,r0) @@ -214,6 +251,21 @@ add r2,r5 add r2,r0 .endr + +#if defined (CONFIG_SH_CACHE_ASSOC) + mov r4, r0 + mov #0x40, r1 ! set bit 14 in r0 to imply 2 way. + shll8 r1 + or r1, r0 + .rept 32 + mov.l r3,@r0 + mov.l r3,@(32,r0) + mov.l r3,@(r0,r6) + mov.l r3,@(r0,r7) + add r2,r3 + add r2,r0 + .endr +#endif nop nop nop @@ -222,7 +274,8 @@ nop nop rts - nop + nop + ENTRY(__flush_dcache_all) mov.l 2f,r0 @@ -233,6 +286,46 @@ or r1,r2 mov #32,r3 shll2 r3 + +! TODO : make this be dynamically selected based on CPU probing rather than assembled-in + +#if defined (CONFIG_SH_CACHE_ASSOC) + mov #0x40, r5 + shll8 r5 + add r4, r5 ! r5 = r4 + 16k +1: + ldc r2,sr ! set BL bit + movca.l r0,@r4 + movca.l r0,@r5 + ocbi @r4 + add #32,r4 + ocbi @r5 + add #32,r5 + movca.l r0,@r4 + movca.l r0,@r5 + ocbi @r4 + add #32,r4 + ocbi @r5 + add #32,r5 + movca.l r0,@r4 + movca.l r0,@r5 + ocbi @r4 + add #32,r4 + ocbi @r5 + add #32,r5 + movca.l r0,@r4 + movca.l r0,@r5 + ocbi @r4 + add #32, r4 + ocbi @r5 + ldc r1,sr ! restore SR + dt r3 + bf/s 1b + add #32,r5 + + rts + nop +#else 1: ldc r2,sr ! set BL bit movca.l r0,@r4 @@ -253,8 +346,11 @@ rts nop +#endif /* CONFIG_SH_CACHE_ASSOC */ + .align 2 2: .long 0xffffc000 + 3: .long SYMBOL_NAME(empty_zero_page) 4: .long 0x10000000 ! BL bit @@ -268,28 +364,73 @@ mov.l 4f,r2 or r1,r2 mov #32,r3 +! TODO : make this be dynamically selected based on CPU probing rather than assembled-in + +#if defined (CONFIG_SH_CACHE_ASSOC) + mov #0x40, r5 + shll8 r5 + add r4, r5 ! r5 = r4 + 16k 1: ldc r2,sr ! set BL bit movca.l r0,@r4 + movca.l r0,@r5 ocbi @r4 add #32,r4 + ocbi @r5 + add #32,r5 movca.l r0,@r4 + movca.l r0,@r5 ocbi @r4 add #32,r4 + ocbi @r5 + add #32,r5 movca.l r0,@r4 + movca.l r0,@r5 ocbi @r4 add #32,r4 + ocbi @r5 + add #32,r5 movca.l r0,@r4 + movca.l r0,@r5 ocbi @r4 + add #32,r4 + ocbi @r5 + ldc r1,sr ! restore SR dt r3 bf/s 1b - add #32,r4 + add #32,r5 rts - nop + nop +#else +1: + ldc r2,sr ! set BL bit + movca.l r0,@r4 + ocbi @r4 + add #32,r4 + + movca.l r0,@r4 + ocbi @r4 + add #32,r4 + movca.l r0,@r4 + ocbi @r4 + add #32,r4 + movca.l r0,@r4 + ocbi @r4 + + ldc r1,sr ! restore SR + dt r3 + bf/s 1b + add #32,r4 + + rts + nop +#endif + .align 2 2: .long 0xffffc000 3: .long SYMBOL_NAME(empty_zero_page) 4: .long 0x10000000 ! BL bit + #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh64/config.in linux-2.4.23-pre8/arch/sh64/config.in --- linux-2.4.22/arch/sh64/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh64/config.in 2003-10-22 22:49:54.000000000 +0000 @@ -54,6 +54,8 @@ "2 CONFIG_SH64_PGTABLE_2_LEVEL \ 3 CONFIG_SH64_PGTABLE_3_LEVEL" 2 +bool 'Fixup misaligned loads/stores occurring in user mode' CONFIG_SH64_USER_MISALIGNED_FIXUP + # Use 32-bit addressing for now. # EMI based. # P2 (UNCACHED) required to use identity mapping @@ -300,6 +302,9 @@ bool 'GDB Stub kernel debug' CONFIG_DEBUG_KERNEL_WITH_GDB_STUB bool "Debug: audit page tables on return from syscall/exception/interrupt" CONFIG_SH64_PAGE_TABLE_AUDIT dep_bool "Debug: report TLB fill/purge activity through /proc/tlb" CONFIG_SH64_PROC_TLB $CONFIG_PROC_FS +dep_bool "Debug: report ASIDS through /proc/asids" CONFIG_SH64_PROC_ASIDS $CONFIG_PROC_FS + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh64/defconfig linux-2.4.23-pre8/arch/sh64/defconfig --- linux-2.4.22/arch/sh64/defconfig 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh64/defconfig 2003-10-22 22:49:42.000000000 +0000 @@ -39,6 +39,7 @@ # CONFIG_SH64_FPU_DENORM_FLUSH is not set CONFIG_SH64_PGTABLE_2_LEVEL=y # CONFIG_SH64_PGTABLE_3_LEVEL is not set +# CONFIG_SH64_USER_MISALIGNED_FIXUP is not set # # Memory options @@ -477,6 +478,7 @@ # CONFIG_DEBUG_KERNEL_WITH_GDB_STUB is not set # CONFIG_SH64_PAGE_TABLE_AUDIT is not set # CONFIG_SH64_PROC_TLB is not set +# CONFIG_SH64_PROC_ASIDS is not set # # Library routines diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh64/kernel/fpu.c linux-2.4.23-pre8/arch/sh64/kernel/fpu.c --- linux-2.4.22/arch/sh64/kernel/fpu.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh64/kernel/fpu.c 2003-10-22 22:48:53.000000000 +0000 @@ -23,47 +23,56 @@ * has the property that no matter whether considered as single or as * double precision, it still represents a signalling NAN. */ -#define sNAN64 0xFFFFFFFFFFFFFFFF +#define sNAN64 0xFFFFFFFFFFFFFFFFULL +#define sNAN32 0xFFFFFFFFUL +static union sh_fpu_union init_fpuregs = { + .hard = { + .fp_regs = { [0 ... 63] = sNAN32 }, + .fpscr = FPSCR_INIT + } +}; +#if 0 static struct sh_fpu_hard_struct init_fpuregs = { - { [0 ... 31] = sNAN64 }, + { [0 ... 63] = sNAN32 }, FPSCR_INIT }; +#endif inline void fpsave(struct sh_fpu_hard_struct *fpregs) { - asm volatile("fst.d %0, (0*8)," __d(0) "\n\t" - "fst.d %0, (1*8)," __d(2) "\n\t" - "fst.d %0, (2*8)," __d(4) "\n\t" - "fst.d %0, (3*8)," __d(6) "\n\t" - "fst.d %0, (4*8)," __d(8) "\n\t" - "fst.d %0, (5*8)," __d(10) "\n\t" - "fst.d %0, (6*8)," __d(12) "\n\t" - "fst.d %0, (7*8)," __d(14) "\n\t" - "fst.d %0, (8*8)," __d(16) "\n\t" - "fst.d %0, (9*8)," __d(18) "\n\t" - "fst.d %0, (10*8)," __d(20) "\n\t" - "fst.d %0, (11*8)," __d(22) "\n\t" - "fst.d %0, (12*8)," __d(24) "\n\t" - "fst.d %0, (13*8)," __d(26) "\n\t" - "fst.d %0, (14*8)," __d(28) "\n\t" - "fst.d %0, (15*8)," __d(30) "\n\t" - "fst.d %0, (16*8)," __d(32) "\n\t" - "fst.d %0, (17*8)," __d(34) "\n\t" - "fst.d %0, (18*8)," __d(36) "\n\t" - "fst.d %0, (19*8)," __d(38) "\n\t" - "fst.d %0, (20*8)," __d(40) "\n\t" - "fst.d %0, (21*8)," __d(42) "\n\t" - "fst.d %0, (22*8)," __d(44) "\n\t" - "fst.d %0, (23*8)," __d(46) "\n\t" - "fst.d %0, (24*8)," __d(48) "\n\t" - "fst.d %0, (25*8)," __d(50) "\n\t" - "fst.d %0, (26*8)," __d(52) "\n\t" - "fst.d %0, (27*8)," __d(54) "\n\t" - "fst.d %0, (28*8)," __d(56) "\n\t" - "fst.d %0, (29*8)," __d(58) "\n\t" - "fst.d %0, (30*8)," __d(60) "\n\t" - "fst.d %0, (31*8)," __d(62) "\n\t" + asm volatile("fst.p %0, (0*8)," __p(0) "\n\t" + "fst.p %0, (1*8)," __p(2) "\n\t" + "fst.p %0, (2*8)," __p(4) "\n\t" + "fst.p %0, (3*8)," __p(6) "\n\t" + "fst.p %0, (4*8)," __p(8) "\n\t" + "fst.p %0, (5*8)," __p(10) "\n\t" + "fst.p %0, (6*8)," __p(12) "\n\t" + "fst.p %0, (7*8)," __p(14) "\n\t" + "fst.p %0, (8*8)," __p(16) "\n\t" + "fst.p %0, (9*8)," __p(18) "\n\t" + "fst.p %0, (10*8)," __p(20) "\n\t" + "fst.p %0, (11*8)," __p(22) "\n\t" + "fst.p %0, (12*8)," __p(24) "\n\t" + "fst.p %0, (13*8)," __p(26) "\n\t" + "fst.p %0, (14*8)," __p(28) "\n\t" + "fst.p %0, (15*8)," __p(30) "\n\t" + "fst.p %0, (16*8)," __p(32) "\n\t" + "fst.p %0, (17*8)," __p(34) "\n\t" + "fst.p %0, (18*8)," __p(36) "\n\t" + "fst.p %0, (19*8)," __p(38) "\n\t" + "fst.p %0, (20*8)," __p(40) "\n\t" + "fst.p %0, (21*8)," __p(42) "\n\t" + "fst.p %0, (22*8)," __p(44) "\n\t" + "fst.p %0, (23*8)," __p(46) "\n\t" + "fst.p %0, (24*8)," __p(48) "\n\t" + "fst.p %0, (25*8)," __p(50) "\n\t" + "fst.p %0, (26*8)," __p(52) "\n\t" + "fst.p %0, (27*8)," __p(54) "\n\t" + "fst.p %0, (28*8)," __p(56) "\n\t" + "fst.p %0, (29*8)," __p(58) "\n\t" + "fst.p %0, (30*8)," __p(60) "\n\t" + "fst.p %0, (31*8)," __p(62) "\n\t" "_fgetscr " __f(63) "\n\t" "fst.s %0, (32*8)," __f(63) "\n\t" @@ -76,49 +85,49 @@ static inline void fpload(struct sh_fpu_hard_struct *fpregs) { - asm volatile("fld.d %0, (0*8)," __d(0) "\n\t" - "fld.d %0, (1*8)," __d(2) "\n\t" - "fld.d %0, (2*8)," __d(4) "\n\t" - "fld.d %0, (3*8)," __d(6) "\n\t" - "fld.d %0, (4*8)," __d(8) "\n\t" - "fld.d %0, (5*8)," __d(10) "\n\t" - "fld.d %0, (6*8)," __d(12) "\n\t" - "fld.d %0, (7*8)," __d(14) "\n\t" - "fld.d %0, (8*8)," __d(16) "\n\t" - "fld.d %0, (9*8)," __d(18) "\n\t" - "fld.d %0, (10*8)," __d(20) "\n\t" - "fld.d %0, (11*8)," __d(22) "\n\t" - "fld.d %0, (12*8)," __d(24) "\n\t" - "fld.d %0, (13*8)," __d(26) "\n\t" - "fld.d %0, (14*8)," __d(28) "\n\t" - "fld.d %0, (15*8)," __d(30) "\n\t" - "fld.d %0, (16*8)," __d(32) "\n\t" - "fld.d %0, (17*8)," __d(34) "\n\t" - "fld.d %0, (18*8)," __d(36) "\n\t" - "fld.d %0, (19*8)," __d(38) "\n\t" - "fld.d %0, (20*8)," __d(40) "\n\t" - "fld.d %0, (21*8)," __d(42) "\n\t" - "fld.d %0, (22*8)," __d(44) "\n\t" - "fld.d %0, (23*8)," __d(46) "\n\t" - "fld.d %0, (24*8)," __d(48) "\n\t" - "fld.d %0, (25*8)," __d(50) "\n\t" - "fld.d %0, (26*8)," __d(52) "\n\t" - "fld.d %0, (27*8)," __d(54) "\n\t" - "fld.d %0, (28*8)," __d(56) "\n\t" - "fld.d %0, (29*8)," __d(58) "\n\t" - "fld.d %0, (30*8)," __d(60) "\n\t" + asm volatile("fld.p %0, (0*8)," __p(0) "\n\t" + "fld.p %0, (1*8)," __p(2) "\n\t" + "fld.p %0, (2*8)," __p(4) "\n\t" + "fld.p %0, (3*8)," __p(6) "\n\t" + "fld.p %0, (4*8)," __p(8) "\n\t" + "fld.p %0, (5*8)," __p(10) "\n\t" + "fld.p %0, (6*8)," __p(12) "\n\t" + "fld.p %0, (7*8)," __p(14) "\n\t" + "fld.p %0, (8*8)," __p(16) "\n\t" + "fld.p %0, (9*8)," __p(18) "\n\t" + "fld.p %0, (10*8)," __p(20) "\n\t" + "fld.p %0, (11*8)," __p(22) "\n\t" + "fld.p %0, (12*8)," __p(24) "\n\t" + "fld.p %0, (13*8)," __p(26) "\n\t" + "fld.p %0, (14*8)," __p(28) "\n\t" + "fld.p %0, (15*8)," __p(30) "\n\t" + "fld.p %0, (16*8)," __p(32) "\n\t" + "fld.p %0, (17*8)," __p(34) "\n\t" + "fld.p %0, (18*8)," __p(36) "\n\t" + "fld.p %0, (19*8)," __p(38) "\n\t" + "fld.p %0, (20*8)," __p(40) "\n\t" + "fld.p %0, (21*8)," __p(42) "\n\t" + "fld.p %0, (22*8)," __p(44) "\n\t" + "fld.p %0, (23*8)," __p(46) "\n\t" + "fld.p %0, (24*8)," __p(48) "\n\t" + "fld.p %0, (25*8)," __p(50) "\n\t" + "fld.p %0, (26*8)," __p(52) "\n\t" + "fld.p %0, (27*8)," __p(54) "\n\t" + "fld.p %0, (28*8)," __p(56) "\n\t" + "fld.p %0, (29*8)," __p(58) "\n\t" + "fld.p %0, (30*8)," __p(60) "\n\t" "fld.s %0, (32*8)," __f(63) "\n\t" "_fputscr " __f(63) "\n\t" - "fld.d %0, (31*8)," __d(62) "\n\t" + "fld.p %0, (31*8)," __p(62) "\n\t" : /* no output */ : "r" (fpregs) ); } void fpinit(struct sh_fpu_hard_struct *fpregs) { - *fpregs = init_fpuregs; + *fpregs = init_fpuregs.hard; } asmlinkage void @@ -163,7 +172,7 @@ fpload(¤t->thread.fpu.hard); } else { /* First time FPU user. */ - fpload(&init_fpuregs); + fpload(&init_fpuregs.hard); current->used_math = 1; } release_fpu(); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh64/kernel/process.c linux-2.4.23-pre8/arch/sh64/kernel/process.c --- linux-2.4.22/arch/sh64/kernel/process.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh64/kernel/process.c 2003-10-22 22:47:49.000000000 +0000 @@ -937,3 +937,48 @@ return pc; } +/* Provide a /proc/asids file that lists out the + ASIDs currently associated with the processes. (If the DM.PC register is + examined through the debug link, this shows ASID + PC. To make use of this, + the PID->ASID relationship needs to be known. This is primarily for + debugging.) + */ + +#if defined(CONFIG_SH64_PROC_ASIDS) +#include +#include + +static int +asids_proc_info(char *buf, char **start, off_t fpos, int length, int *eof, void *data) +{ + int len=0; + struct task_struct *p; + read_lock(&tasklist_lock); + for_each_task(p) { + int pid = p->pid; + struct mm_struct *mm; + if (!pid) continue; + mm = p->mm; + if (mm) { + unsigned long asid, context; + context = mm->context; + asid = (context & 0xff); + len += sprintf(buf+len, "%5d : %02x\n", pid, asid); + } else { + len += sprintf(buf+len, "%5d : (none)\n", pid); + } + } + read_unlock(&tasklist_lock); + *eof = 1; + return len; +} + +static int __init register_proc_asids(void) +{ + create_proc_read_entry("asids", 0, NULL, asids_proc_info, NULL); + return 0; +} + +__initcall(register_proc_asids); +#endif + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sh64/kernel/traps.c linux-2.4.23-pre8/arch/sh64/kernel/traps.c --- linux-2.4.22/arch/sh64/kernel/traps.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sh64/kernel/traps.c 2003-10-22 22:48:54.000000000 +0000 @@ -7,6 +7,7 @@ * * Copyright (C) 2000, 2001 Paolo Alberelli * Copyright (C) 2003 Paul Mundt + * Copyright (C) 2003 Richard Curnow * */ @@ -27,11 +28,15 @@ #include #include +#include +#include + #include #include #include #include #include +#include #undef DEBUG_EXCEPTION #ifdef DEBUG_EXCEPTION @@ -42,14 +47,13 @@ #define show_excp_regs(a, b, c, d) #endif +static void do_unhandled_exception(int trapnr, int signr, char *str, char *fn_name, + unsigned long error_code, struct pt_regs *regs, struct task_struct *tsk); + #define DO_ERROR(trapnr, signr, str, name, tsk) \ asmlinkage void do_##name(unsigned long error_code, struct pt_regs *regs) \ { \ - show_excp_regs(__FUNCTION__, trapnr, signr, regs); \ - tsk->thread.error_code = error_code; \ - tsk->thread.trap_no = trapnr; \ - if (user_mode(regs)) force_sig(signr, tsk); \ - die_if_no_fixup(str,regs,error_code); \ + do_unhandled_exception(trapnr, signr, str, __FUNCTION__, error_code, regs, current); \ } spinlock_t die_lock; @@ -84,11 +88,34 @@ } } -DO_ERROR( 7, SIGSEGV, "address error (load)", address_error_load, current) -DO_ERROR( 8, SIGSEGV, "address error (store)", address_error_store, current) DO_ERROR(13, SIGILL, "illegal slot instruction", illegal_slot_inst, current) DO_ERROR(87, SIGSEGV, "address error (exec)", address_error_exec, current) + +/* Implement misaligned load/store handling for kernel (and optionally for user + mode too). Limitation : only SHmedia mode code is handled - there is no + handling at all for misaligned accesses occurring in SHcompact code yet. */ + +static int misaligned_fixup(struct pt_regs *regs); + +asmlinkage void do_address_error_load(unsigned long error_code, struct pt_regs *regs) +{ + if (misaligned_fixup(regs) < 0) { + do_unhandled_exception(7, SIGSEGV, "address error(load)", __FUNCTION__, + error_code, regs, current); + } + return; +} + +asmlinkage void do_address_error_store(unsigned long error_code, struct pt_regs *regs) +{ + if (misaligned_fixup(regs) < 0) { + do_unhandled_exception(8, SIGSEGV, "address error(store)", __FUNCTION__, + error_code, regs, current); + } + return; +} + #if defined(CONFIG_SH64_ID2815_WORKAROUND) #define OPCODE_INVALID 0 @@ -121,7 +148,7 @@ which should take ITLBMISS or EXECPROT exceptions at the target falsely take RESINST at the target instead. */ - unsigned long opcode; + unsigned long opcode = 0x6ff4fff0; /* guaranteed reserved opcode */ unsigned long pc, aligned_pc; int get_user_error; int trapnr = 12; @@ -203,11 +230,7 @@ } } - show_excp_regs("do_reserved_inst", trapnr, signr, regs); - current->thread.error_code = error_code; - current->thread.trap_no = trapnr; - if (user_mode(regs)) force_sig(signr, current); - die_if_no_fixup(exception_name, regs, error_code); + do_unhandled_exception(trapnr, signr, exception_name, "do_reserved_inst", error_code, regs, current); } #else /* CONFIG_SH64_ID2815_WORKAROUND */ @@ -302,3 +325,640 @@ show_task(NULL); } +static void do_unhandled_exception(int trapnr, int signr, char *str, char *fn_name, + unsigned long error_code, struct pt_regs *regs, struct task_struct *tsk) +{ + show_excp_regs(fn_name, trapnr, signr, regs); + tsk->thread.error_code = error_code; + tsk->thread.trap_no = trapnr; + if (user_mode(regs)) force_sig(signr, tsk); + die_if_no_fixup(str, regs, error_code); +} + +static int read_opcode(unsigned long long pc, unsigned long *result_opcode) +{ + int get_user_error; + unsigned long aligned_pc; + unsigned long opcode; + + if ((pc & 3) == 1) { + /* SHmedia */ + aligned_pc = pc & ~3; + if (!access_ok(VERIFY_READ, aligned_pc, sizeof(unsigned long))) { + get_user_error = -EFAULT; + } else { + get_user_error = __get_user(opcode, (unsigned long *)aligned_pc); + *result_opcode = opcode; + } + return get_user_error; + } else if ((pc & 1) == 0) { + /* SHcompact */ + /* TODO : provide handling for this. */ + return -EFAULT; + } else { + /* misaligned */ + return -EFAULT; + } +} + +static int address_is_sign_extended(__u64 a) +{ + __u64 b; +#if (NEFF == 32) + b = (__u64)(__s64)(__s32)(a & 0xffffffffUL); + return (b == a) ? 1 : 0; +#else +#error "Sign extend check only works for NEFF==32" +#endif +} + +static int generate_and_check_address(struct pt_regs *regs, + __u32 opcode, + int displacement_not_indexed, + int width_shift, + __u64 *address) +{ + /* return -1 for fault, 0 for OK */ + + __u64 base_address, addr; + int basereg; + int do_as_user = user_mode(regs); + + basereg = (opcode >> 20) & 0x3f; + base_address = regs->regs[basereg]; + if (displacement_not_indexed) { + __s64 displacement; + displacement = (opcode >> 10) & 0x3ff; + displacement = ((displacement << 54) >> 54); /* sign extend */ + addr = (__u64)((__s64)base_address + (displacement << width_shift)); + } else { + __u64 offset; + int offsetreg; + offsetreg = (opcode >> 10) & 0x3f; + offset = regs->regs[offsetreg]; + addr = base_address + offset; + } + + /* Check sign extended */ + if (!address_is_sign_extended(addr)) { + return -1; + } + +#if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) + /* Check accessible. For misaligned access in the kernel, assume the + address is always accessible (and if not, just fault when the + load/store gets done.) */ + if (do_as_user) { + if (addr >= TASK_SIZE) { + return -1; + } + /* Do access_ok check later - it depends on whether it's a load or a store. */ + } +#endif + + *address = addr; + return 0; +} + +/* Default value as for sh */ +#if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) +static int user_mode_unaligned_fixup_count = 10; +static int user_mode_unaligned_fixup_enable = 1; +#endif + +static int kernel_mode_unaligned_fixup_count = 32; + +static void misaligned_kernel_word_load(__u64 address, int do_sign_extend, __u64 *result) +{ + unsigned short x; + unsigned char *p, *q; + p = (unsigned char *) (int) address; + q = (unsigned char *) &x; + q[0] = p[0]; + q[1] = p[1]; + + if (do_sign_extend) { + *result = (__u64)(__s64) *(short *) &x; + } else { + *result = (__u64) x; + } +} + +static void misaligned_kernel_word_store(__u64 address, __u64 value) +{ + unsigned short x; + unsigned char *p, *q; + p = (unsigned char *) (int) address; + q = (unsigned char *) &x; + + x = (__u16) value; + p[0] = q[0]; + p[1] = q[1]; +} + +static int misaligned_load(struct pt_regs *regs, + __u32 opcode, + int displacement_not_indexed, + int width_shift, + int do_sign_extend) +{ + /* Return -1 for a fault, 0 for OK */ + int error; + int destreg; + __u64 address; + + error = generate_and_check_address(regs, opcode, + displacement_not_indexed, width_shift, &address); + if (error < 0) { + return error; + } + + destreg = (opcode >> 4) & 0x3f; +#if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) + if (user_mode(regs)) { + __u64 buffer; + + if (!access_ok(VERIFY_READ, (unsigned long) address, 1UL< 0) { + return -1; /* fault */ + } + switch (width_shift) { + case 1: + if (do_sign_extend) { + regs->regs[destreg] = (__u64)(__s64) *(__s16 *) &buffer; + } else { + regs->regs[destreg] = (__u64) *(__u16 *) &buffer; + } + break; + case 2: + regs->regs[destreg] = (__u64)(__s64) *(__s32 *) &buffer; + break; + case 3: + regs->regs[destreg] = buffer; + break; + default: + printk("Unexpected width_shift %d in misaligned_load, PC=%08lx\n", + width_shift, (unsigned long) regs->pc); + break; + } + } else +#endif + { + /* kernel mode - we can take short cuts since if we fault, it's a genuine bug */ + __u64 lo, hi; + + switch (width_shift) { + case 1: + misaligned_kernel_word_load(address, do_sign_extend, ®s->regs[destreg]); + break; + case 2: + asm ("ldlo.l %1, 0, %0" : "=r" (lo) : "r" (address)); + asm ("ldhi.l %1, 3, %0" : "=r" (hi) : "r" (address)); + regs->regs[destreg] = lo | hi; + break; + case 3: + asm ("ldlo.q %1, 0, %0" : "=r" (lo) : "r" (address)); + asm ("ldhi.q %1, 7, %0" : "=r" (hi) : "r" (address)); + regs->regs[destreg] = lo | hi; + break; + + default: + printk("Unexpected width_shift %d in misaligned_load, PC=%08lx\n", + width_shift, (unsigned long) regs->pc); + break; + } + } + + return 0; + +} + +static int misaligned_store(struct pt_regs *regs, + __u32 opcode, + int displacement_not_indexed, + int width_shift) +{ + /* Return -1 for a fault, 0 for OK */ + int error; + int srcreg; + __u64 address; + + error = generate_and_check_address(regs, opcode, + displacement_not_indexed, width_shift, &address); + if (error < 0) { + return error; + } + + srcreg = (opcode >> 4) & 0x3f; +#if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) + if (user_mode(regs)) { + __u64 buffer; + + if (!access_ok(VERIFY_WRITE, (unsigned long) address, 1UL<regs[srcreg]; + break; + case 2: + *(__u32 *) &buffer = (__u32) regs->regs[srcreg]; + break; + case 3: + buffer = regs->regs[srcreg]; + break; + default: + printk("Unexpected width_shift %d in misaligned_store, PC=%08lx\n", + width_shift, (unsigned long) regs->pc); + break; + } + + if (__copy_user((void *)(int)address, &buffer, (1 << width_shift)) > 0) { + return -1; /* fault */ + } + } else +#endif + { + /* kernel mode - we can take short cuts since if we fault, it's a genuine bug */ + __u64 val = regs->regs[srcreg]; + + switch (width_shift) { + case 1: + misaligned_kernel_word_store(address, val); + break; + case 2: + asm ("stlo.l %1, 0, %0" : : "r" (val), "r" (address)); + asm ("sthi.l %1, 3, %0" : : "r" (val), "r" (address)); + break; + case 3: + asm ("stlo.q %1, 0, %0" : : "r" (val), "r" (address)); + asm ("sthi.q %1, 7, %0" : : "r" (val), "r" (address)); + break; + + default: + printk("Unexpected width_shift %d in misaligned_store, PC=%08lx\n", + width_shift, (unsigned long) regs->pc); + break; + } + } + + return 0; + +} + +#if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) +/* Never need to fix up misaligned FPU accesses within the kernel since that's a real + error. */ +static int misaligned_fpu_load(struct pt_regs *regs, + __u32 opcode, + int displacement_not_indexed, + int width_shift, + int do_paired_load) +{ + /* Return -1 for a fault, 0 for OK */ + int error; + int destreg; + __u64 address; + + error = generate_and_check_address(regs, opcode, + displacement_not_indexed, width_shift, &address); + if (error < 0) { + return error; + } + + destreg = (opcode >> 4) & 0x3f; + if (user_mode(regs)) { + __u64 buffer; + __u32 buflo, bufhi; + + if (!access_ok(VERIFY_READ, (unsigned long) address, 1UL< 0) { + return -1; /* fault */ + } + /* 'current' may be the current owner of the FPU state, so + context switch the registers into memory so they can be + indexed by register number. */ + if (last_task_used_math == current) { + grab_fpu(); + fpsave(¤t->thread.fpu.hard); + release_fpu(); + last_task_used_math = NULL; + regs->sr |= SR_FD; + } + + buflo = *(__u32*) &buffer; + bufhi = *(1 + (__u32*) &buffer); + + switch (width_shift) { + case 2: + current->thread.fpu.hard.fp_regs[destreg] = buflo; + break; + case 3: + if (do_paired_load) { + current->thread.fpu.hard.fp_regs[destreg] = buflo; + current->thread.fpu.hard.fp_regs[destreg+1] = bufhi; + } else { +#if defined(CONFIG_LITTLE_ENDIAN) + current->thread.fpu.hard.fp_regs[destreg] = bufhi; + current->thread.fpu.hard.fp_regs[destreg+1] = buflo; +#else + current->thread.fpu.hard.fp_regs[destreg] = buflo; + current->thread.fpu.hard.fp_regs[destreg+1] = bufhi; +#endif + } + break; + default: + printk("Unexpected width_shift %d in misaligned_fpu_load, PC=%08lx\n", + width_shift, (unsigned long) regs->pc); + break; + } + return 0; + } else { + die ("Misaligned FPU load inside kernel", regs, 0); + return -1; + } + + +} + +static int misaligned_fpu_store(struct pt_regs *regs, + __u32 opcode, + int displacement_not_indexed, + int width_shift, + int do_paired_load) +{ + /* Return -1 for a fault, 0 for OK */ + int error; + int srcreg; + __u64 address; + + error = generate_and_check_address(regs, opcode, + displacement_not_indexed, width_shift, &address); + if (error < 0) { + return error; + } + + srcreg = (opcode >> 4) & 0x3f; + if (user_mode(regs)) { + __u64 buffer; + /* Initialise these to NaNs. */ + __u32 buflo=0xffffffffUL, bufhi=0xffffffffUL; + + if (!access_ok(VERIFY_WRITE, (unsigned long) address, 1UL<thread.fpu.hard); + release_fpu(); + last_task_used_math = NULL; + regs->sr |= SR_FD; + } + + switch (width_shift) { + case 2: + buflo = current->thread.fpu.hard.fp_regs[srcreg]; + break; + case 3: + if (do_paired_load) { + buflo = current->thread.fpu.hard.fp_regs[srcreg]; + bufhi = current->thread.fpu.hard.fp_regs[srcreg+1]; + } else { +#if defined(CONFIG_LITTLE_ENDIAN) + bufhi = current->thread.fpu.hard.fp_regs[srcreg]; + buflo = current->thread.fpu.hard.fp_regs[srcreg+1]; +#else + buflo = current->thread.fpu.hard.fp_regs[srcreg]; + bufhi = current->thread.fpu.hard.fp_regs[srcreg+1]; +#endif + } + break; + default: + printk("Unexpected width_shift %d in misaligned_fpu_store, PC=%08lx\n", + width_shift, (unsigned long) regs->pc); + break; + } + + *(__u32*) &buffer = buflo; + *(1 + (__u32*) &buffer) = bufhi; + if (__copy_user((void *)(int)address, &buffer, (1 << width_shift)) > 0) { + return -1; /* fault */ + } + return 0; + } else { + die ("Misaligned FPU load inside kernel", regs, 0); + return -1; + } +} +#endif + +static int misaligned_fixup(struct pt_regs *regs) +{ + unsigned long opcode; + int error; + int major, minor; + +#if !defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) + /* Never fixup user mode misaligned accesses without this option enabled. */ + return -1; +#else + if (!user_mode_unaligned_fixup_enable) return -1; +#endif + + error = read_opcode(regs->pc, &opcode); + if (error < 0) { + return error; + } + major = (opcode >> 26) & 0x3f; + minor = (opcode >> 16) & 0xf; + +#if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) + if (user_mode(regs) && (user_mode_unaligned_fixup_count > 0)) { + --user_mode_unaligned_fixup_count; + /* Only do 'count' worth of these reports, to remove a potential DoS against syslog */ + printk("Fixing up unaligned userspace access in \"%s\" pid=%d pc=0x%08x ins=0x%08lx\n", + current->comm, current->pid, (__u32)regs->pc, opcode); + } else +#endif + if (!user_mode(regs) && (kernel_mode_unaligned_fixup_count > 0)) { + --kernel_mode_unaligned_fixup_count; + if (in_interrupt()) { + printk("Fixing up unaligned kernelspace access in interrupt pc=0x%08x ins=0x%08lx\n", + (__u32)regs->pc, opcode); + } else { + printk("Fixing up unaligned kernelspace access in \"%s\" pid=%d pc=0x%08x ins=0x%08lx\n", + current->comm, current->pid, (__u32)regs->pc, opcode); + } + } + + + switch (major) { + case (0x84>>2): /* LD.W */ + error = misaligned_load(regs, opcode, 1, 1, 1); + break; + case (0xb0>>2): /* LD.UW */ + error = misaligned_load(regs, opcode, 1, 1, 0); + break; + case (0x88>>2): /* LD.L */ + error = misaligned_load(regs, opcode, 1, 2, 1); + break; + case (0x8c>>2): /* LD.Q */ + error = misaligned_load(regs, opcode, 1, 3, 0); + break; + + case (0xa4>>2): /* ST.W */ + error = misaligned_store(regs, opcode, 1, 1); + break; + case (0xa8>>2): /* ST.L */ + error = misaligned_store(regs, opcode, 1, 2); + break; + case (0xac>>2): /* ST.Q */ + error = misaligned_store(regs, opcode, 1, 3); + break; + + case (0x40>>2): /* indexed loads */ + switch (minor) { + case 0x1: /* LDX.W */ + error = misaligned_load(regs, opcode, 0, 1, 1); + break; + case 0x5: /* LDX.UW */ + error = misaligned_load(regs, opcode, 0, 1, 0); + break; + case 0x2: /* LDX.L */ + error = misaligned_load(regs, opcode, 0, 2, 1); + break; + case 0x3: /* LDX.Q */ + error = misaligned_load(regs, opcode, 0, 3, 0); + break; + default: + error = -1; + break; + } + break; + + case (0x60>>2): /* indexed stores */ + switch (minor) { + case 0x1: /* STX.W */ + error = misaligned_store(regs, opcode, 0, 1); + break; + case 0x2: /* STX.L */ + error = misaligned_store(regs, opcode, 0, 2); + break; + case 0x3: /* STX.Q */ + error = misaligned_store(regs, opcode, 0, 3); + break; + default: + error = -1; + break; + } + break; + +#if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) + case (0x94>>2): /* FLD.S */ + error = misaligned_fpu_load(regs, opcode, 1, 2, 0); + break; + case (0x98>>2): /* FLD.P */ + error = misaligned_fpu_load(regs, opcode, 1, 3, 1); + break; + case (0x9c>>2): /* FLD.D */ + error = misaligned_fpu_load(regs, opcode, 1, 3, 0); + break; + case (0x1c>>2): /* floating indexed loads */ + switch (minor) { + case 0x8: /* FLDX.S */ + error = misaligned_fpu_load(regs, opcode, 0, 2, 0); + break; + case 0xd: /* FLDX.P */ + error = misaligned_fpu_load(regs, opcode, 0, 3, 1); + break; + case 0x9: /* FLDX.D */ + error = misaligned_fpu_load(regs, opcode, 0, 3, 0); + break; + default: + error = -1; + break; + } + break; + case (0xb4>>2): /* FLD.S */ + error = misaligned_fpu_store(regs, opcode, 1, 2, 0); + break; + case (0xb8>>2): /* FLD.P */ + error = misaligned_fpu_store(regs, opcode, 1, 3, 1); + break; + case (0xbc>>2): /* FLD.D */ + error = misaligned_fpu_store(regs, opcode, 1, 3, 0); + break; + case (0x3c>>2): /* floating indexed stores */ + switch (minor) { + case 0x8: /* FSTX.S */ + error = misaligned_fpu_store(regs, opcode, 0, 2, 0); + break; + case 0xd: /* FSTX.P */ + error = misaligned_fpu_store(regs, opcode, 0, 3, 1); + break; + case 0x9: /* FSTX.D */ + error = misaligned_fpu_store(regs, opcode, 0, 3, 0); + break; + default: + error = -1; + break; + } + break; +#endif + + default: + /* Fault */ + error = -1; + break; + } + + if (error < 0) { + return error; + } else { + regs->pc += 4; /* Skip the instruction that's just been emulated */ + return 0; + } + +} + +static ctl_table unaligned_table[] = { + {1, "kernel_reports", &kernel_mode_unaligned_fixup_count, + sizeof(int), 0644, NULL, &proc_dointvec}, +#if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP) + {2, "user_reports", &user_mode_unaligned_fixup_count, + sizeof(int), 0644, NULL, &proc_dointvec}, + {3, "user_enable", &user_mode_unaligned_fixup_enable, + sizeof(int), 0644, NULL, &proc_dointvec}, +#endif + {0} +}; + +static ctl_table unaligned_root[] = { + {1, "unaligned_fixup", NULL, 0, 0555, unaligned_table}, + {0} +}; + +static ctl_table sh64_root[] = { + {1, "sh64", NULL, 0, 0555, unaligned_root}, + {0} +}; +static struct ctl_table_header *sysctl_header; +static int __init init_sysctl(void) +{ + sysctl_header = register_sysctl_table(sh64_root, 0); + return 0; +} + +__initcall(init_sysctl); + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/boot/btfixupprep.c linux-2.4.23-pre8/arch/sparc/boot/btfixupprep.c --- linux-2.4.22/arch/sparc/boot/btfixupprep.c 2001-08-28 14:09:44.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/boot/btfixupprep.c 2003-10-22 22:49:21.000000000 +0000 @@ -167,6 +167,8 @@ } } else if (buffer[nbase+4] != '_') continue; + if (!strcmp (sect, ".text.exit")) + continue; if (strcmp (sect, ".text") && strcmp (sect, ".text.init") && strcmp (sect, ".fixup") && (strcmp (sect, "__ksymtab") || buffer[nbase+3] != 'f')) { if (buffer[nbase+3] == 'f') fprintf(stderr, "Wrong use of '%s' in '%s' section. It can be only used in .text, .text.init, .fixup and __ksymtab\n", buffer + shift, sect); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/config.in linux-2.4.23-pre8/arch/sparc/config.in --- linux-2.4.22/arch/sparc/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/config.in 2003-10-22 22:47:39.000000000 +0000 @@ -29,6 +29,10 @@ bool 'Symmetric multi-processing support (does not work on sun4/sun4c)' CONFIG_SMP +if [ "$CONFIG_SMP" = "y" ]; then + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 +fi + # Identify this as a Sparc32 build define_bool CONFIG_SPARC32 y @@ -273,6 +277,8 @@ bool ' Spinlock debugging' CONFIG_DEBUG_SPINLOCK fi +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/kernel/Makefile linux-2.4.23-pre8/arch/sparc/kernel/Makefile --- linux-2.4.22/arch/sparc/kernel/Makefile 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/kernel/Makefile 2003-10-22 22:48:24.000000000 +0000 @@ -51,15 +51,11 @@ @echo "" >> asm_offsets.h @echo "#include " >> asm_offsets.h @echo "" >> asm_offsets.h - @echo "#ifndef CONFIG_SMP" >> asm_offsets.h - @echo "" >> asm_offsets.h @echo "#include " > tmp.c - @echo "#undef CONFIG_SMP" >> tmp.c @echo "#include " >> tmp.c $(CPP) $(CPPFLAGS) tmp.c -o tmp.i @echo "/* Automatically generated. Do not edit. */" > check_asm_data.c @echo "#include " >> check_asm_data.c - @echo "#undef CONFIG_SMP" >> check_asm_data.c @echo "#include " >> check_asm_data.c @echo "unsigned int check_asm_data[] = {" >> check_asm_data.c $(SH) ./check_asm.sh -data task tmp.i check_asm_data.c @@ -83,42 +79,6 @@ ./check_asm >> asm_offsets.h @rm -f check_asm check_asm.c @echo "" >> asm_offsets.h - @echo "#else /* CONFIG_SMP */" >> asm_offsets.h - @echo "" >> asm_offsets.h - @echo "#include " > tmp.c - @echo "#undef CONFIG_SMP" >> tmp.c - @echo "#define CONFIG_SMP 1" >> tmp.c - @echo "#include " >> tmp.c - $(CPP) $(CPPFLAGS) tmp.c -o tmp.i - @echo "/* Automatically generated. Do not edit. */" > check_asm_data.c - @echo "#include " >> check_asm_data.c - @echo "#undef CONFIG_SMP" >> check_asm_data.c - @echo "#define CONFIG_SMP 1" >> check_asm_data.c - @echo "#include " >> check_asm_data.c - @echo "unsigned int check_asm_data[] = {" >> check_asm_data.c - $(SH) ./check_asm.sh -data task tmp.i check_asm_data.c - $(SH) ./check_asm.sh -data mm tmp.i check_asm_data.c - $(SH) ./check_asm.sh -data thread tmp.i check_asm_data.c - @echo '};' >> check_asm_data.c - $(CC) $(CFLAGS) -S -o check_asm_data.s check_asm_data.c - @echo "/* Automatically generated. Do not edit. */" > check_asm.c - @echo 'extern int printf(const char *fmt, ...);' >>check_asm.c - @echo "unsigned int check_asm_data[] = {" >> check_asm.c - $(SH) ./check_asm.sh -ints check_asm_data.s check_asm.c - @echo "};" >> check_asm.c - @echo 'int main(void) {' >> check_asm.c - @echo 'int i = 0;' >> check_asm.c - $(SH) ./check_asm.sh -printf task tmp.i check_asm.c - $(SH) ./check_asm.sh -printf mm tmp.i check_asm.c - $(SH) ./check_asm.sh -printf thread tmp.i check_asm.c - @echo 'return 0; }' >> check_asm.c - @rm -f tmp.[ci] check_asm_data.[cs] - $(HOSTCC) -o check_asm check_asm.c - ./check_asm >> asm_offsets.h - @rm -f check_asm check_asm.c - @echo "" >> asm_offsets.h - @echo "#endif /* CONFIG_SMP */" >> asm_offsets.h - @echo "" >> asm_offsets.h @echo "#endif /* __ASM_OFFSETS_H__ */" >> asm_offsets.h @if test -r $(HPATH)/asm/asm_offsets.h; then \ if cmp -s asm_offsets.h $(HPATH)/asm/asm_offsets.h; then \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/kernel/devices.c linux-2.4.23-pre8/arch/sparc/kernel/devices.c --- linux-2.4.22/arch/sparc/kernel/devices.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/kernel/devices.c 2003-10-22 22:49:32.000000000 +0000 @@ -15,7 +15,7 @@ #include #include -struct prom_cpuinfo linux_cpus[32]; +struct prom_cpuinfo linux_cpus[NR_CPUS]; int linux_num_cpus = 0; extern void cpu_probe(void); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/kernel/sun4d_smp.c linux-2.4.23-pre8/arch/sparc/kernel/sun4d_smp.c --- linux-2.4.22/arch/sparc/kernel/sun4d_smp.c 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/kernel/sun4d_smp.c 2003-10-22 22:47:45.000000000 +0000 @@ -351,11 +351,11 @@ unsigned long a3 asm("i3") = arg3; unsigned long a4 asm("i4") = arg4; unsigned long a5 asm("i5") = arg5; - - __asm__ __volatile__(" - std %0, [%6] - std %2, [%6 + 8] - std %4, [%6 + 16]" : : + + __asm__ __volatile__( + "std %0, [%6]\n\t" + "std %2, [%6 + 8]\n\t" + "std %4, [%6 + 16]\n\t" : : "r"(f), "r"(a1), "r"(a2), "r"(a3), "r"(a4), "r"(a5), "r" (&ccall_info.func)); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/kernel/sys_sunos.c linux-2.4.23-pre8/arch/sparc/kernel/sys_sunos.c --- linux-2.4.22/arch/sparc/kernel/sys_sunos.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/kernel/sys_sunos.c 2003-10-22 22:48:38.000000000 +0000 @@ -193,7 +193,7 @@ * fool it, but this should catch most mistakes. */ freepages = atomic_read(&buffermem_pages) >> PAGE_SHIFT; - freepages += atomic_read(&page_cache_size); + freepages += page_cache_size; freepages >>= 1; freepages += nr_free_pages(); freepages += nr_swap_pages; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/lib/checksum.S linux-2.4.23-pre8/arch/sparc/lib/checksum.S --- linux-2.4.22/arch/sparc/lib/checksum.S 1999-01-07 16:46:58.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/lib/checksum.S 2003-10-22 22:49:03.000000000 +0000 @@ -145,36 +145,39 @@ .globl C_LABEL(__csum_partial_copy_start), C_LABEL(__csum_partial_copy_end) C_LABEL(__csum_partial_copy_start): -#define EX(x,y,a,b,z) \ +/* Work around cpp -rob */ +#define ALLOC #alloc +#define EXECINSTR #execinstr +#define EX(x,y,a,b) \ 98: x,y; \ - .section .fixup,z##alloc,z##execinstr; \ + .section .fixup,ALLOC,EXECINSTR; \ .align 4; \ 99: ba 30f; \ a, b, %o3; \ - .section __ex_table,z##alloc; \ + .section __ex_table,ALLOC; \ .align 4; \ .word 98b, 99b; \ .text; \ .align 4 -#define EX2(x,y,z) \ +#define EX2(x,y) \ 98: x,y; \ - .section __ex_table,z##alloc; \ + .section __ex_table,ALLOC; \ .align 4; \ .word 98b, 30f; \ .text; \ .align 4 -#define EX3(x,y,z) \ +#define EX3(x,y) \ 98: x,y; \ - .section __ex_table,z##alloc; \ + .section __ex_table,ALLOC; \ .align 4; \ .word 98b, 96f; \ .text; \ .align 4 -#define EXT(start,end,handler,z) \ - .section __ex_table,z##alloc; \ +#define EXT(start,end,handler) \ + .section __ex_table,ALLOC; \ .align 4; \ .word start, 0, end, handler; \ .text; \ @@ -247,21 +250,21 @@ cc_end_cruft: be 1f andcc %o3, 4, %g0 - EX(ldd [%o0 + 0x00], %g2, and %o3, 0xf,#) + EX(ldd [%o0 + 0x00], %g2, and %o3, 0xf) add %o1, 8, %o1 addcc %g2, %g7, %g7 add %o0, 8, %o0 addxcc %g3, %g7, %g7 - EX2(st %g2, [%o1 - 0x08],#) + EX2(st %g2, [%o1 - 0x08]) addx %g0, %g7, %g7 andcc %o3, 4, %g0 - EX2(st %g3, [%o1 - 0x04],#) + EX2(st %g3, [%o1 - 0x04]) 1: be 1f andcc %o3, 3, %o3 - EX(ld [%o0 + 0x00], %g2, add %o3, 4,#) + EX(ld [%o0 + 0x00], %g2, add %o3, 4) add %o1, 4, %o1 addcc %g2, %g7, %g7 - EX2(st %g2, [%o1 - 0x04],#) + EX2(st %g2, [%o1 - 0x04]) addx %g0, %g7, %g7 andcc %o3, 3, %g0 add %o0, 4, %o0 @@ -271,14 +274,14 @@ subcc %o3, 2, %o3 b 4f or %g0, %g0, %o4 -2: EX(lduh [%o0 + 0x00], %o4, add %o3, 2,#) +2: EX(lduh [%o0 + 0x00], %o4, add %o3, 2) add %o0, 2, %o0 - EX2(sth %o4, [%o1 + 0x00],#) + EX2(sth %o4, [%o1 + 0x00]) be 6f add %o1, 2, %o1 sll %o4, 16, %o4 -4: EX(ldub [%o0 + 0x00], %o5, add %g0, 1,#) - EX2(stb %o5, [%o1 + 0x00],#) +4: EX(ldub [%o0 + 0x00], %o5, add %g0, 1) + EX2(stb %o5, [%o1 + 0x00]) sll %o5, 8, %o5 or %o5, %o4, %o4 6: addcc %o4, %g7, %g7 @@ -295,9 +298,9 @@ andcc %o0, 0x2, %g0 be 1f andcc %o0, 0x4, %g0 - EX(lduh [%o0 + 0x00], %g4, add %g1, 0,#) + EX(lduh [%o0 + 0x00], %g4, add %g1, 0) sub %g1, 2, %g1 - EX2(sth %g4, [%o1 + 0x00],#) + EX2(sth %g4, [%o1 + 0x00]) add %o0, 2, %o0 sll %g4, 16, %g4 addcc %g4, %g7, %g7 @@ -311,9 +314,9 @@ or %g3, %g7, %g7 1: be 3f andcc %g1, 0xffffff80, %g0 - EX(ld [%o0 + 0x00], %g4, add %g1, 0,#) + EX(ld [%o0 + 0x00], %g4, add %g1, 0) sub %g1, 4, %g1 - EX2(st %g4, [%o1 + 0x00],#) + EX2(st %g4, [%o1 + 0x00]) add %o0, 4, %o0 addcc %g4, %g7, %g7 add %o1, 4, %o1 @@ -342,7 +345,7 @@ CSUMCOPY_BIGCHUNK(%o0,%o1,%g7,0x20,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) CSUMCOPY_BIGCHUNK(%o0,%o1,%g7,0x40,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) CSUMCOPY_BIGCHUNK(%o0,%o1,%g7,0x60,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) -10: EXT(5b, 10b, 20f,#) ! note for exception handling +10: EXT(5b, 10b, 20f) ! note for exception handling sub %g1, 128, %g1 ! detract from length addx %g0, %g7, %g7 ! add in last carry bit andcc %g1, 0xffffff80, %g0 ! more to csum? @@ -367,7 +370,7 @@ CSUMCOPY_LASTCHUNK(%o0,%o1,%g7,0x28,%g2,%g3,%g4,%g5) CSUMCOPY_LASTCHUNK(%o0,%o1,%g7,0x18,%g2,%g3,%g4,%g5) CSUMCOPY_LASTCHUNK(%o0,%o1,%g7,0x08,%g2,%g3,%g4,%g5) -12: EXT(cctbl, 12b, 22f,#) ! note for exception table handling +12: EXT(cctbl, 12b, 22f) ! note for exception table handling addx %g0, %g7, %g7 andcc %o3, 0xf, %g0 ! check for low bits set ccte: bne cc_end_cruft ! something left, handle it out of band @@ -378,7 +381,7 @@ CSUMCOPY_BIGCHUNK_ALIGNED(%o0,%o1,%g7,0x20,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) CSUMCOPY_BIGCHUNK_ALIGNED(%o0,%o1,%g7,0x40,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) CSUMCOPY_BIGCHUNK_ALIGNED(%o0,%o1,%g7,0x60,%o4,%o5,%g2,%g3,%g4,%g5,%o2,%o3) -11: EXT(ccdbl, 11b, 21f,#) ! note for exception table handling +11: EXT(ccdbl, 11b, 21f) ! note for exception table handling sub %g1, 128, %g1 ! detract from length addx %g0, %g7, %g7 ! add in last carry bit andcc %g1, 0xffffff80, %g0 ! more to csum? @@ -395,9 +398,9 @@ be,a 1f srl %g1, 1, %g4 sub %g1, 1, %g1 - EX(ldub [%o0], %g5, add %g1, 1,#) + EX(ldub [%o0], %g5, add %g1, 1) add %o0, 1, %o0 - EX2(stb %g5, [%o1],#) + EX2(stb %g5, [%o1]) srl %g1, 1, %g4 add %o1, 1, %o1 1: cmp %g4, 0 @@ -406,34 +409,34 @@ andcc %o0, 2, %g0 be,a 1f srl %g4, 1, %g4 - EX(lduh [%o0], %o4, add %g1, 0,#) + EX(lduh [%o0], %o4, add %g1, 0) sub %g1, 2, %g1 srl %o4, 8, %g2 sub %g4, 1, %g4 - EX2(stb %g2, [%o1],#) + EX2(stb %g2, [%o1]) add %o4, %g5, %g5 - EX2(stb %o4, [%o1 + 1],#) + EX2(stb %o4, [%o1 + 1]) add %o0, 2, %o0 srl %g4, 1, %g4 add %o1, 2, %o1 1: cmp %g4, 0 be,a 2f andcc %g1, 2, %g0 - EX3(ld [%o0], %o4,#) + EX3(ld [%o0], %o4) 5: srl %o4, 24, %g2 srl %o4, 16, %g3 - EX2(stb %g2, [%o1],#) + EX2(stb %g2, [%o1]) srl %o4, 8, %g2 - EX2(stb %g3, [%o1 + 1],#) + EX2(stb %g3, [%o1 + 1]) add %o0, 4, %o0 - EX2(stb %g2, [%o1 + 2],#) + EX2(stb %g2, [%o1 + 2]) addcc %o4, %g5, %g5 - EX2(stb %o4, [%o1 + 3],#) + EX2(stb %o4, [%o1 + 3]) addx %g5, %g0, %g5 ! I am now to lazy to optimize this (question it add %o1, 4, %o1 ! is worthy). Maybe some day - with the sll/srl subcc %g4, 1, %g4 ! tricks bne,a 5b - EX3(ld [%o0], %o4,#) + EX3(ld [%o0], %o4) sll %g5, 16, %g2 srl %g5, 16, %g5 srl %g2, 16, %g2 @@ -441,19 +444,19 @@ add %g2, %g5, %g5 2: be,a 3f andcc %g1, 1, %g0 - EX(lduh [%o0], %o4, and %g1, 3,#) + EX(lduh [%o0], %o4, and %g1, 3) andcc %g1, 1, %g0 srl %o4, 8, %g2 add %o0, 2, %o0 - EX2(stb %g2, [%o1],#) + EX2(stb %g2, [%o1]) add %g5, %o4, %g5 - EX2(stb %o4, [%o1 + 1],#) + EX2(stb %o4, [%o1 + 1]) add %o1, 2, %o1 3: be,a 1f sll %g5, 16, %o4 - EX(ldub [%o0], %g2, add %g0, 1,#) + EX(ldub [%o0], %g2, add %g0, 1) sll %g2, 8, %o4 - EX2(stb %g2, [%o1],#) + EX2(stb %g2, [%o1]) add %g5, %o4, %g5 sll %g5, 16, %o4 1: addcc %o4, %g5, %g5 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/lib/copy_user.S linux-2.4.23-pre8/arch/sparc/lib/copy_user.S --- linux-2.4.22/arch/sparc/lib/copy_user.S 2000-04-14 16:37:09.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/lib/copy_user.S 2003-10-22 22:48:59.000000000 +0000 @@ -16,41 +16,44 @@ #include #include -#define EX(x,y,a,b,z) \ +/* Work around cpp -rob */ +#define ALLOC #alloc +#define EXECINSTR #execinstr +#define EX(x,y,a,b) \ 98: x,y; \ - .section .fixup,z##alloc,z##execinstr; \ + .section .fixup,ALLOC,EXECINSTR; \ .align 4; \ 99: ba fixupretl; \ a, b, %g3; \ - .section __ex_table,z##alloc; \ + .section __ex_table,ALLOC; \ .align 4; \ .word 98b, 99b; \ .text; \ .align 4 -#define EX2(x,y,c,d,e,a,b,z) \ +#define EX2(x,y,c,d,e,a,b) \ 98: x,y; \ - .section .fixup,z##alloc,z##execinstr; \ + .section .fixup,ALLOC,EXECINSTR; \ .align 4; \ 99: c, d, e; \ ba fixupretl; \ a, b, %g3; \ - .section __ex_table,z##alloc; \ + .section __ex_table,ALLOC; \ .align 4; \ .word 98b, 99b; \ .text; \ .align 4 -#define EXO2(x,y,z) \ -98: x,##y; \ - .section __ex_table,z##alloc; \ +#define EXO2(x,y) \ +98: x, y; \ + .section __ex_table,ALLOC; \ .align 4; \ .word 98b, 97f; \ .text; \ .align 4 -#define EXT(start,end,handler,z) \ - .section __ex_table,z##alloc; \ +#define EXT(start,end,handler) \ + .section __ex_table,ALLOC; \ .align 4; \ .word start, 0, end, handler; \ .text; \ @@ -121,23 +124,23 @@ be 4f andcc %o1, 2, %g0 - EXO2(ldub [%o1], %g2,#) + EXO2(ldub [%o1], %g2) add %o1, 1, %o1 - EXO2(stb %g2, [%o0],#) + EXO2(stb %g2, [%o0]) sub %o2, 1, %o2 bne 3f add %o0, 1, %o0 - EXO2(lduh [%o1], %g2,#) + EXO2(lduh [%o1], %g2) add %o1, 2, %o1 - EXO2(sth %g2, [%o0],#) + EXO2(sth %g2, [%o0]) sub %o2, 2, %o2 b 3f add %o0, 2, %o0 4: - EXO2(lduh [%o1], %g2,#) + EXO2(lduh [%o1], %g2) add %o1, 2, %o1 - EXO2(sth %g2, [%o0],#) + EXO2(sth %g2, [%o0]) sub %o2, 2, %o2 b 3f add %o0, 2, %o0 @@ -160,9 +163,9 @@ be 2f mov %o2, %g1 - EXO2(ld [%o1], %o4,#) + EXO2(ld [%o1], %o4) sub %g1, 4, %g1 - EXO2(st %o4, [%o0],#) + EXO2(st %o4, [%o0]) add %o1, 4, %o1 add %o0, 4, %o0 2: @@ -177,7 +180,7 @@ MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 80: - EXT(5b, 80b, 50f,#) + EXT(5b, 80b, 50f) subcc %g7, 128, %g7 add %o1, 128, %o1 bne 5b @@ -204,37 +207,37 @@ MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5) MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5) copy_user_table_end: - EXT(copy_user_table, copy_user_table_end, 51f,#) + EXT(copy_user_table, copy_user_table_end, 51f) be copy_user_last7 andcc %g1, 4, %g0 - EX(ldd [%o1], %g2, and %g1, 0xf,#) + EX(ldd [%o1], %g2, and %g1, 0xf) add %o0, 8, %o0 add %o1, 8, %o1 - EX(st %g2, [%o0 - 0x08], and %g1, 0xf,#) - EX2(st %g3, [%o0 - 0x04], and %g1, 0xf, %g1, sub %g1, 4,#) + EX(st %g2, [%o0 - 0x08], and %g1, 0xf) + EX2(st %g3, [%o0 - 0x04], and %g1, 0xf, %g1, sub %g1, 4) copy_user_last7: be 1f andcc %g1, 2, %g0 - EX(ld [%o1], %g2, and %g1, 7,#) + EX(ld [%o1], %g2, and %g1, 7) add %o1, 4, %o1 - EX(st %g2, [%o0], and %g1, 7,#) + EX(st %g2, [%o0], and %g1, 7) add %o0, 4, %o0 1: be 1f andcc %g1, 1, %g0 - EX(lduh [%o1], %g2, and %g1, 3,#) + EX(lduh [%o1], %g2, and %g1, 3) add %o1, 2, %o1 - EX(sth %g2, [%o0], and %g1, 3,#) + EX(sth %g2, [%o0], and %g1, 3) add %o0, 2, %o0 1: be 1f nop - EX(ldub [%o1], %g2, add %g0, 1,#) - EX(stb %g2, [%o0], add %g0, 1,#) + EX(ldub [%o1], %g2, add %g0, 1) + EX(stb %g2, [%o0], add %g0, 1) 1: retl clr %o0 @@ -245,7 +248,7 @@ MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 81: - EXT(ldd_std, 81b, 52f,#) + EXT(ldd_std, 81b, 52f) subcc %g7, 128, %g7 add %o1, 128, %o1 bne ldd_std @@ -274,9 +277,9 @@ be 10f nop - EXO2(ldub [%o1], %g2,#) + EXO2(ldub [%o1], %g2) add %o1, 1, %o1 - EXO2(stb %g2, [%o0],#) + EXO2(stb %g2, [%o0]) sub %o2, 1, %o2 andcc %o2, 0xfffffff0, %o3 be short_end @@ -285,7 +288,7 @@ MOVE_HALFCHUNK(o1, o0, 0x00, g2, g3, g4, g5) MOVE_HALFCHUNK(o1, o0, 0x08, g2, g3, g4, g5) 82: - EXT(10b, 82b, 53f,#) + EXT(10b, 82b, 53f) subcc %o3, 0x10, %o3 add %o1, 0x10, %o1 bne 10b @@ -303,7 +306,7 @@ MOVE_SHORTCHUNK(o1, o0, -0x0e, g2, g3) MOVE_SHORTCHUNK(o1, o0, -0x10, g2, g3) 83: - EXT(byte_chunk, 83b, 54f,#) + EXT(byte_chunk, 83b, 54f) subcc %o3, 0x10, %o3 add %o1, 0x10, %o1 bne byte_chunk @@ -328,11 +331,11 @@ MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3) MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3) short_table_end: - EXT(84b, short_table_end, 55f,#) + EXT(84b, short_table_end, 55f) be 1f nop - EX(ldub [%o1], %g2, add %g0, 1,#) - EX(stb %g2, [%o0], add %g0, 1,#) + EX(ldub [%o1], %g2, add %g0, 1) + EX(stb %g2, [%o0], add %g0, 1) 1: retl clr %o0 @@ -344,11 +347,11 @@ be 1f andcc %o2, 4, %g0 - EXO2(ld [%o1 + 0x00], %g2,#) - EXO2(ld [%o1 + 0x04], %g3,#) + EXO2(ld [%o1 + 0x00], %g2) + EXO2(ld [%o1 + 0x04], %g3) add %o1, 8, %o1 - EXO2(st %g2, [%o0 + 0x00],#) - EX(st %g3, [%o0 + 0x04], sub %o2, 4,#) + EXO2(st %g2, [%o0 + 0x00]) + EX(st %g3, [%o0 + 0x04], sub %o2, 4) add %o0, 8, %o0 1: b copy_user_last7 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/lib/memset.S linux-2.4.23-pre8/arch/sparc/lib/memset.S --- linux-2.4.22/arch/sparc/lib/memset.S 2001-04-12 19:10:25.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/lib/memset.S 2003-10-22 22:47:59.000000000 +0000 @@ -10,20 +10,23 @@ #include #include -#define EX(x,y,a,b,z) \ +/* Work around cpp -rob */ +#define ALLOC #alloc +#define EXECINSTR #execinstr +#define EX(x,y,a,b) \ 98: x,y; \ - .section .fixup,z##alloc,z##execinstr; \ + .section .fixup,ALLOC,EXECINSTR; \ .align 4; \ 99: ba 30f; \ a, b, %o0; \ - .section __ex_table,z##alloc; \ + .section __ex_table,ALLOC; \ .align 4; \ .word 98b, 99b; \ .text; \ .align 4 -#define EXT(start,end,handler,z) \ - .section __ex_table,z##alloc; \ +#define EXT(start,end,handler) \ + .section __ex_table,ALLOC; \ .align 4; \ .word start, 0, end, handler; \ .text; \ @@ -74,13 +77,13 @@ 3: cmp %o2, 3 be 2f - EX(stb %g3, [%o0], sub %o1, 0,#) + EX(stb %g3, [%o0], sub %o1, 0) cmp %o2, 2 be 2f - EX(stb %g3, [%o0 + 0x01], sub %o1, 1,#) + EX(stb %g3, [%o0 + 0x01], sub %o1, 1) - EX(stb %g3, [%o0 + 0x02], sub %o1, 2,#) + EX(stb %g3, [%o0 + 0x02], sub %o1, 2) 2: sub %o2, 4, %o2 add %o1, %o2, %o1 @@ -101,7 +104,7 @@ be 2f mov %g3, %g2 - EX(st %g3, [%o0], sub %o1, 0,#) + EX(st %g3, [%o0], sub %o1, 0) sub %o1, 4, %o1 add %o0, 4, %o0 2: @@ -113,7 +116,7 @@ subcc %o3, 128, %o3 ZERO_BIG_BLOCK(%o0, 0x40, %g2) 11: - EXT(10b, 11b, 20f,#) + EXT(10b, 11b, 20f) bne 10b add %o0, 128, %o0 @@ -138,17 +141,17 @@ be 1f andcc %o1, 2, %g0 - EX(st %g3, [%o0], and %o1, 7,#) + EX(st %g3, [%o0], and %o1, 7) add %o0, 4, %o0 1: be 1f andcc %o1, 1, %g0 - EX(sth %g3, [%o0], and %o1, 3,#) + EX(sth %g3, [%o0], and %o1, 3) add %o0, 2, %o0 1: bne,a 8f - EX(stb %g3, [%o0], and %o1, 1,#) + EX(stb %g3, [%o0], and %o1, 1) 8: retl clr %o0 @@ -161,7 +164,7 @@ add %o0, 1, %o0 subcc %o1, 1, %o1 bne,a 8b - EX(stb %g3, [%o0 - 1], add %o1, 1,#) + EX(stb %g3, [%o0 - 1], add %o1, 1) 0: retl clr %o0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/math-emu/sfp-util.h linux-2.4.23-pre8/arch/sparc/math-emu/sfp-util.h --- linux-2.4.22/arch/sparc/math-emu/sfp-util.h 1999-05-29 18:09:04.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/math-emu/sfp-util.h 2003-10-22 22:49:53.000000000 +0000 @@ -4,8 +4,8 @@ #include #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("addcc %r4,%5,%1 - addx %r2,%3,%0" \ + __asm__ ("addcc %r4,%5,%1\n\t" \ + "addx %r2,%3,%0\n" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "%rJ" ((USItype)(ah)), \ @@ -14,8 +14,8 @@ "rI" ((USItype)(bl)) \ : "cc") #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("subcc %r4,%5,%1 - subx %r2,%3,%0" \ + __asm__ ("subcc %r4,%5,%1\n\t" \ + "subx %r2,%3,%0\n" \ : "=r" ((USItype)(sh)), \ "=&r" ((USItype)(sl)) \ : "rJ" ((USItype)(ah)), \ @@ -25,46 +25,46 @@ : "cc") #define umul_ppmm(w1, w0, u, v) \ - __asm__ ("! Inlined umul_ppmm - wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr - sra %3,31,%%g2 ! Don't move this insn - and %2,%%g2,%%g2 ! Don't move this insn - andcc %%g0,0,%%g1 ! Don't move this insn - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,%3,%%g1 - mulscc %%g1,0,%%g1 - add %%g1,%%g2,%0 - rd %%y,%1" \ + __asm__ ("! Inlined umul_ppmm\n\t" \ + "wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n\t" \ + "sra %3,31,%%g2 ! Don't move this insn\n\t" \ + "and %2,%%g2,%%g2 ! Don't move this insn\n\t" \ + "andcc %%g0,0,%%g1 ! Don't move this insn\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,%3,%%g1\n\t" \ + "mulscc %%g1,0,%%g1\n\t" \ + "add %%g1,%%g2,%0\n\t" \ + "rd %%y,%1\n" \ : "=r" ((USItype)(w1)), \ "=r" ((USItype)(w0)) \ : "%rI" ((USItype)(u)), \ @@ -74,30 +74,30 @@ /* It's quite necessary to add this much assembler for the sparc. The default udiv_qrnnd (in C) is more than 10 times slower! */ #define udiv_qrnnd(q, r, n1, n0, d) \ - __asm__ ("! Inlined udiv_qrnnd - mov 32,%%g1 - subcc %1,%2,%%g0 -1: bcs 5f - addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb - sub %1,%2,%1 ! this kills msb of n - addx %1,%1,%1 ! so this can't give carry - subcc %%g1,1,%%g1 -2: bne 1b - subcc %1,%2,%%g0 - bcs 3f - addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb - b 3f - sub %1,%2,%1 ! this kills msb of n -4: sub %1,%2,%1 -5: addxcc %1,%1,%1 - bcc 2b - subcc %%g1,1,%%g1 -! Got carry from n. Subtract next step to cancel this carry. - bne 4b - addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb - sub %1,%2,%1 -3: xnor %0,0,%0 - ! End of inline udiv_qrnnd" \ + __asm__ ("! Inlined udiv_qrnnd\n\t" \ + "mov 32,%%g1\n\t" \ + "subcc %1,%2,%%g0\n\t" \ + "1: bcs 5f\n\t" \ + "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \ + "sub %1,%2,%1 ! this kills msb of n\n\t" \ + "addx %1,%1,%1 ! so this can't give carry\n\t" \ + "subcc %%g1,1,%%g1\n\t" \ + "2: bne 1b\n\t" \ + "subcc %1,%2,%%g0\n\t" \ + "bcs 3f\n\t" \ + "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \ + "b 3f\n\t" \ + "sub %1,%2,%1 ! this kills msb of n\n\t" \ + "4: sub %1,%2,%1\n\t" \ + "5: addxcc %1,%1,%1\n\t" \ + "bcc 2b\n\t" \ + "subcc %%g1,1,%%g1\n\t" \ + "! Got carry from n. Subtract next step to cancel this carry.\n\t" \ + "bne 4b\n\t" \ + "addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n\t" \ + "sub %1,%2,%1\n\t" \ + "3: xnor %0,0,%0\n\t" \ + "! End of inline udiv_qrnnd\n" \ : "=&r" ((USItype)(q)), \ "=&r" ((USItype)(r)) \ : "r" ((USItype)(d)), \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc/mm/srmmu.c linux-2.4.23-pre8/arch/sparc/mm/srmmu.c --- linux-2.4.22/arch/sparc/mm/srmmu.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc/mm/srmmu.c 2003-10-22 22:49:03.000000000 +0000 @@ -126,6 +126,9 @@ #define SRMMU_NOCACHE_BITMAP_SHIFT (PAGE_SHIFT - 4) +/* The context table is a nocache user with the biggest alignment needs. */ +#define SRMMU_NOCACHE_ALIGN_MAX (sizeof(ctxd_t)*SRMMU_MAX_CONTEXTS) + void *srmmu_nocache_pool; void *srmmu_nocache_bitmap; int srmmu_nocache_low; @@ -260,6 +263,7 @@ /* we align on physical address */ if (align) { + BUG_ON(align > SRMMU_NOCACHE_ALIGN_MAX); va_tmp = (SRMMU_NOCACHE_VADDR + (offset << SRMMU_NOCACHE_BITMAP_SHIFT)); phys_tmp = (__nocache_pa(va_tmp) + align - 1) & ~(align - 1); va_tmp = (unsigned long)__nocache_va(phys_tmp); @@ -367,7 +371,8 @@ unsigned long paddr, vaddr; unsigned long pteval; - srmmu_nocache_pool = __alloc_bootmem(srmmu_nocache_size, PAGE_SIZE, 0UL); + srmmu_nocache_pool = __alloc_bootmem(srmmu_nocache_size, + SRMMU_NOCACHE_ALIGN_MAX, 0UL); memset(srmmu_nocache_pool, 0, srmmu_nocache_size); srmmu_nocache_bitmap = __alloc_bootmem(srmmu_nocache_bitmap_size, SMP_CACHE_BYTES, 0UL); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/config.in linux-2.4.23-pre8/arch/sparc64/config.in --- linux-2.4.22/arch/sparc64/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/config.in 2003-10-22 22:48:22.000000000 +0000 @@ -28,6 +28,10 @@ bool 'Symmetric multi-processing support' CONFIG_SMP +if [ "$CONFIG_SMP" = "y" ]; then + int 'Maximum number of CPUs (2-32)' CONFIG_NR_CPUS 32 +fi + # Identify this as a Sparc64 build define_bool CONFIG_SPARC64 y @@ -307,6 +311,8 @@ define_bool CONFIG_MCOUNT y fi +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source crypto/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/defconfig linux-2.4.23-pre8/arch/sparc64/defconfig --- linux-2.4.22/arch/sparc64/defconfig 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/defconfig 2003-10-22 22:48:26.000000000 +0000 @@ -21,6 +21,7 @@ CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_SMP=y +CONFIG_NR_CPUS=32 CONFIG_SPARC64=y CONFIG_HOTPLUG=y CONFIG_HAVE_DEC_LOCK=y @@ -254,6 +255,32 @@ CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_COMPAT_IPFWADM=m CONFIG_IP_NF_NAT_NEEDED=y + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m CONFIG_IPV6=m # @@ -279,6 +306,15 @@ CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_TARGET_MARK=m # CONFIG_KHTTPD is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IPV6_SCTP__=m +CONFIG_IP_SCTP=m +# CONFIG_SCTP_ADLER32 is not set +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_ATM is not set CONFIG_VLAN_8021Q=m @@ -565,6 +601,7 @@ # CONFIG_AMD8111_ETH is not set CONFIG_ADAPTEC_STARFIRE=m # CONFIG_APRICOT is not set +CONFIG_B44=m # CONFIG_CS89x0 is not set CONFIG_TULIP=m # CONFIG_TULIP_MWI is not set @@ -592,7 +629,6 @@ CONFIG_SUNDANCE=m CONFIG_SUNDANCE_MMIO=y # CONFIG_TLAN is not set -# CONFIG_TC35815 is not set CONFIG_VIA_RHINE=m # CONFIG_VIA_RHINE_MMIO is not set CONFIG_WINBOND_840=m @@ -844,6 +880,8 @@ # CONFIG_MIDI_VIA82CXXX is not set # CONFIG_SOUND_OSS is not set # CONFIG_SOUND_TVMIXER is not set +CONFIG_SOUND_AD1980=m +CONFIG_SOUND_WM97XX=m # # USB support @@ -983,7 +1021,17 @@ CONFIG_USB_TIGL=m # CONFIG_USB_BRLVGER is not set CONFIG_USB_LCD=m -# CONFIG_USB_SPEEDTOUCH is not set + +# +# Support for USB gadgets +# +CONFIG_USB_GADGET=y + +# +# USB Peripheral Controller Drivers +# +# CONFIG_USB_NET2280 is not set +# CONFIG_USB_GADGET_CONTROLLER is not set # # Bluetooth support @@ -996,7 +1044,6 @@ CONFIG_BLUEZ_BNEP=m CONFIG_BLUEZ_BNEP_MC_FILTER=y CONFIG_BLUEZ_BNEP_PROTO_FILTER=y -CONFIG_BLUEZ_CMTP=m # # Bluetooth device drivers @@ -1008,6 +1055,7 @@ CONFIG_BLUEZ_HCIUART_H4=y CONFIG_BLUEZ_HCIUART_BCSP=y CONFIG_BLUEZ_HCIUART_BCSP_TXCRC=y +CONFIG_BLUEZ_HCIBFUSB=m # CONFIG_BLUEZ_HCIDTL1 is not set # CONFIG_BLUEZ_HCIBT3C is not set # CONFIG_BLUEZ_HCIBLUECARD is not set @@ -1029,6 +1077,7 @@ # CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_DCFLUSH is not set # CONFIG_STACK_DEBUG is not set +CONFIG_LOG_BUF_SHIFT=0 # # Cryptographic options @@ -1046,6 +1095,7 @@ CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_DEFLATE=y # CONFIG_CRYPTO_TEST is not set @@ -1055,3 +1105,4 @@ CONFIG_CRC32=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y +CONFIG_FW_LOADER=m diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/Makefile linux-2.4.23-pre8/arch/sparc64/kernel/Makefile --- linux-2.4.22/arch/sparc64/kernel/Makefile 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/Makefile 2003-10-22 22:47:59.000000000 +0000 @@ -58,50 +58,11 @@ @echo >> asm_offsets.h @echo "#include " >> asm_offsets.h @echo >> asm_offsets.h - @echo "#ifndef CONFIG_SMP" >> asm_offsets.h - @echo >> asm_offsets.h - @echo "#include " > tmp.c - @echo "#undef CONFIG_SMP" >> tmp.c - @echo "#include " >> tmp.c - $(CPP) $(CPPFLAGS) -P tmp.c -o tmp.i - @echo "/* Automatically generated. Do not edit. */" > check_asm_data.c - @echo "#include " >> check_asm_data.c - @echo "#undef CONFIG_SMP" >> check_asm_data.c - @echo "#include " >> check_asm_data.c - @echo 'unsigned int check_asm_data[] = {' >> check_asm_data.c - $(SH) ./check_asm.sh -data task tmp.i check_asm_data.c - $(SH) ./check_asm.sh -data mm tmp.i check_asm_data.c - $(SH) ./check_asm.sh -data thread tmp.i check_asm_data.c - @echo '};' >> check_asm_data.c - $(CC) $(CPPFLAGS) $(CMODEL_CFLAG) -ffixed-g4 -S -o check_asm_data.s check_asm_data.c - @echo "/* Automatically generated. Do not edit. */" > check_asm.c - @echo 'extern int printf(const char *fmt, ...);' >>check_asm.c - @echo 'unsigned int check_asm_data[] = {' >> check_asm.c - $(SH) ./check_asm.sh -ints check_asm_data.s check_asm.c - @echo '};' >> check_asm.c - @echo 'int main(void) {' >> check_asm.c - @echo 'int i = 0;' >> check_asm.c - $(SH) ./check_asm.sh -printf task tmp.i check_asm.c - $(SH) ./check_asm.sh -printf mm tmp.i check_asm.c - $(SH) ./check_asm.sh -printf thread tmp.i check_asm.c - @echo 'return 0; }' >> check_asm.c - @rm -f tmp.[ci] check_asm_data.[cs] - $(HOSTCC) -o check_asm check_asm.c - ./check_asm >> asm_offsets.h - @rm -f check_asm check_asm.c - @echo >> asm_offsets.h - @echo "#else /* CONFIG_SMP */" >> asm_offsets.h - @echo "#ifndef CONFIG_DEBUG_SPINLOCK" >>asm_offsets.h - @echo >> asm_offsets.h @echo "#include " > tmp.c - @echo "#undef CONFIG_SMP" >> tmp.c - @echo "#define CONFIG_SMP 1" >> tmp.c @echo "#include " >> tmp.c $(CPP) $(CPPFLAGS) -P tmp.c -o tmp.i @echo "/* Automatically generated. Do not edit. */" > check_asm_data.c @echo "#include " >> check_asm_data.c - @echo "#undef CONFIG_SMP" >> check_asm_data.c - @echo "#define CONFIG_SMP 1" >> check_asm_data.c @echo "#include " >> check_asm_data.c @echo 'unsigned int check_asm_data[] = {' >> check_asm_data.c $(SH) ./check_asm.sh -data task tmp.i check_asm_data.c @@ -125,40 +86,6 @@ ./check_asm >> asm_offsets.h @rm -f check_asm check_asm.c @echo >> asm_offsets.h - @echo "#else /* CONFIG_DEBUG_SPINLOCK */" >> asm_offsets.h - @echo >> asm_offsets.h - @echo "#include " > tmp.c - $(CPP) $(CPPFLAGS) -P -DCONFIG_DEBUG_SPINLOCK tmp.c -o tmp.i - @echo "/* Automatically generated. Do not edit. */" > check_asm_data.c - @echo "#include " >> check_asm_data.c - @echo "#undef CONFIG_SMP" >> check_asm_data.c - @echo "#define CONFIG_SMP 1" >> check_asm_data.c - @echo "#include " >> check_asm_data.c - @echo 'unsigned int check_asm_data[] = {' >> check_asm_data.c - $(SH) ./check_asm.sh -data task tmp.i check_asm_data.c - $(SH) ./check_asm.sh -data mm tmp.i check_asm_data.c - $(SH) ./check_asm.sh -data thread tmp.i check_asm_data.c - @echo '};' >> check_asm_data.c - $(CC) $(CPPFLAGS) -DCONFIG_DEBUG_SPINLOCK $(CMODEL_CFLAG) -ffixed-g4 -S -o check_asm_data.s check_asm_data.c - @echo "/* Automatically generated. Do not edit. */" > check_asm.c - @echo 'extern int printf(const char *fmt, ...);' >>check_asm.c - @echo 'unsigned int check_asm_data[] = {' >> check_asm.c - $(SH) ./check_asm.sh -ints check_asm_data.s check_asm.c - @echo '};' >> check_asm.c - @echo 'int main(void) {' >> check_asm.c - @echo 'int i = 0;' >> check_asm.c - $(SH) ./check_asm.sh -printf task tmp.i check_asm.c - $(SH) ./check_asm.sh -printf mm tmp.i check_asm.c - $(SH) ./check_asm.sh -printf thread tmp.i check_asm.c - @echo 'return 0; }' >> check_asm.c - @rm -f tmp.[ci] check_asm_data.[cs] - $(HOSTCC) -o check_asm check_asm.c - ./check_asm >> asm_offsets.h - @rm -f check_asm check_asm.c - @echo "#endif /* CONFIG_DEBUG_SPINLOCK */" >> asm_offsets.h - @echo >> asm_offsets.h - @echo "#endif /* CONFIG_SMP */" >> asm_offsets.h - @echo >> asm_offsets.h @echo "#endif /* __ASM_OFFSETS_H__ */" >> asm_offsets.h @if test -r $(HPATH)/asm/asm_offsets.h; then \ if cmp -s asm_offsets.h $(HPATH)/asm/asm_offsets.h; then \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/cpu.c linux-2.4.23-pre8/arch/sparc64/kernel/cpu.c --- linux-2.4.22/arch/sparc64/kernel/cpu.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/cpu.c 2003-10-22 22:49:30.000000000 +0000 @@ -37,6 +37,7 @@ { 0x17, 0x13, 0, "UltraSparc IIe integrated FPU"}, { 0x3e, 0x14, 0, "UltraSparc III integrated FPU"}, { 0x3e, 0x15, 0, "UltraSparc III+ integrated FPU"}, + { 0x3e, 0x16, 0, "UltraSparc IIIi integrated FPU"}, }; #define NSPARCFPU (sizeof(linux_sparc_fpu)/sizeof(struct cpu_fp_info)) @@ -45,31 +46,25 @@ { 0x17, 0x10, "TI UltraSparc I (SpitFire)"}, { 0x22, 0x10, "TI UltraSparc I (SpitFire)"}, { 0x17, 0x11, "TI UltraSparc II (BlackBird)"}, - { 0x17, 0x12, "TI UltraSparc IIi"}, - { 0x17, 0x13, "TI UltraSparc IIe"}, + { 0x17, 0x12, "TI UltraSparc IIi (Sabre)"}, + { 0x17, 0x13, "TI UltraSparc IIe (Hummingbird)"}, { 0x3e, 0x14, "TI UltraSparc III (Cheetah)"}, { 0x3e, 0x15, "TI UltraSparc III+ (Cheetah+)"}, + { 0x3e, 0x16, "TI UltraSparc IIIi (Jalapeno)"}, }; #define NSPARCCHIPS (sizeof(linux_sparc_chips)/sizeof(struct cpu_iu_info)) -#ifdef CONFIG_SMP -char *sparc_cpu_type[64] = { "cpu-oops", "cpu-oops1", "cpu-oops2", "cpu-oops3" }; -char *sparc_fpu_type[64] = { "fpu-oops", "fpu-oops1", "fpu-oops2", "fpu-oops3" }; -#else -char *sparc_cpu_type[64] = { "cpu-oops", }; -char *sparc_fpu_type[64] = { "fpu-oops", }; -#endif +char *sparc_cpu_type = "cpu-oops"; +char *sparc_fpu_type = "fpu-oops"; unsigned int fsr_storage; void __init cpu_probe(void) { unsigned long ver, fpu_vers, manuf, impl, fprs; - int i, cpuid; + int i; - cpuid = hard_smp_processor_id(); - fprs = fprs_read(); fprs_write(FPRS_FEF); __asm__ __volatile__ ("rdpr %%ver, %0; stx %%fsr, [%1]" @@ -86,7 +81,7 @@ for (i = 0; i < NSPARCCHIPS; i++) { if (linux_sparc_chips[i].manuf == manuf) { if (linux_sparc_chips[i].impl == impl) { - sparc_cpu_type[cpuid] + sparc_cpu_type = linux_sparc_chips[i].cpu_name; break; } @@ -105,14 +100,14 @@ printk("DEBUG: manuf[%lx] impl[%lx]\n", manuf, impl); } - sparc_cpu_type[cpuid] = "Unknown CPU"; + sparc_cpu_type = "Unknown CPU"; } for (i = 0; i < NSPARCFPU; i++) { if (linux_sparc_fpu[i].manuf == manuf && linux_sparc_fpu[i].impl == impl) { if (linux_sparc_fpu[i].fpu_vers == fpu_vers) { - sparc_fpu_type[cpuid] + sparc_fpu_type = linux_sparc_fpu[i].fp_name; break; } @@ -122,6 +117,6 @@ if (i == NSPARCFPU) { printk("DEBUG: manuf[%lx] impl[%lx] fsr.vers[%lx]\n", manuf, impl, fpu_vers); - sparc_fpu_type[cpuid] = "Unknown FPU"; + sparc_fpu_type = "Unknown FPU"; } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/entry.S linux-2.4.23-pre8/arch/sparc64/kernel/entry.S --- linux-2.4.22/arch/sparc64/kernel/entry.S 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/entry.S 2003-10-22 22:47:27.000000000 +0000 @@ -911,10 +911,15 @@ sllx %g1, 63, %g2; \ or %g4, %g2, %g4; \ /* Get log entry pointer for this cpu at this trap level. */ \ + BRANCH_IF_JALAPENO(g2,g3,50f) \ ldxa [%g0] ASI_SAFARI_CONFIG, %g2; \ srlx %g2, 17, %g2; \ - and %g2, 0x3ff, %g2; \ - sllx %g2, 9, %g2; \ + ba,pt %xcc, 60f; \ + and %g2, 0x3ff, %g2; \ +50: ldxa [%g0] ASI_JBUS_CONFIG, %g2; \ + srlx %g2, 17, %g2; \ + and %g2, 0x1f, %g2; \ +60: sllx %g2, 9, %g2; \ sethi %hi(cheetah_error_log), %g3; \ ldx [%g3 + %lo(cheetah_error_log)], %g3; \ brz,pn %g3, 80f; \ @@ -1749,8 +1754,8 @@ cmp %o0, -ENOIOCTLCMD sllx %g2, 32, %g2 bgeu,pn %xcc, 1f - andcc %l0, 0x02, %l6 +80: andn %g3, %g2, %g3 /* System call success, clear Carry condition code. */ stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE] bne,pn %icc, linux_syscall_trace2 @@ -1760,9 +1765,21 @@ stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC] 1: + /* Really a failure? Check if force_successful_syscall_return() + * was invoked. + */ + ldx [%curptr + AOFF_task_thread + AOFF_thread_flags], %l0 + andcc %l0, SPARC_FLAG_SYS_SUCCESS, %g0 + be,pt %icc, 1f + andcc %l6, 0x02, %g0 + andn %l0, SPARC_FLAG_SYS_SUCCESS, %l0 + ba,pt %xcc, 80b + stx %l0, [%curptr + AOFF_task_thread + AOFF_thread_flags] + /* System call failure, set Carry condition code. * Also, get abs(errno) to return to the process. */ +1: sub %g0, %o0, %o0 or %g3, %g2, %g3 stx %o0, [%sp + PTREGS_OFF + PT_V9_I0] diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/head.S linux-2.4.23-pre8/arch/sparc64/kernel/head.S --- linux-2.4.22/arch/sparc64/kernel/head.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/head.S 2003-10-22 22:48:31.000000000 +0000 @@ -647,11 +647,18 @@ nop not_starfire: + BRANCH_IF_JALAPENO(g1,g5,is_jalapeno) BRANCH_IF_ANY_CHEETAH(g1,g5,is_cheetah) ba,pt %xcc, not_cheetah nop +is_jalapeno: + ldxa [%g0] ASI_JBUS_CONFIG, %g1 + srlx %g1, 17, %g1 + ba,pt %xcc, set_worklist + and %g1, 0x1f, %g1 ! 5bit JBUS ID + is_cheetah: ldxa [%g0] ASI_SAFARI_CONFIG, %g1 srlx %g1, 17, %g1 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/ioctl32.c linux-2.4.23-pre8/arch/sparc64/kernel/ioctl32.c --- linux-2.4.22/arch/sparc64/kernel/ioctl32.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/ioctl32.c 2003-10-22 22:49:34.000000000 +0000 @@ -1920,8 +1920,8 @@ __cgc_do_ptr((void **) &cgc->sense, &cgc32->sense)) return -EFAULT; - if (get_user(dir, &cgc->data_direction) || - put_user(dir, &cgc32->data_direction)) + if (get_user(dir, &cgc32->data_direction) || + put_user(dir, &cgc->data_direction)) return -EFAULT; if (copy_in_user(&cgc->quiet, &cgc32->quiet, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/irq.c linux-2.4.23-pre8/arch/sparc64/kernel/irq.c --- linux-2.4.22/arch/sparc64/kernel/irq.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/irq.c 2003-10-22 22:48:32.000000000 +0000 @@ -148,12 +148,24 @@ return; if (tlb_type == cheetah || tlb_type == cheetah_plus) { - /* We set it to our Safari AID. */ - __asm__ __volatile__("ldxa [%%g0] %1, %0" - : "=r" (tid) - : "i" (ASI_SAFARI_CONFIG)); - tid = ((tid & (0x3ffUL<<17)) << 9); - tid &= IMAP_AID_SAFARI; + unsigned long ver; + + __asm__ ("rdpr %%ver, %0" : "=r" (ver)); + if ((ver >> 32) == 0x003e0016) { + /* We set it to our JBUS ID. */ + __asm__ __volatile__("ldxa [%%g0] %1, %0" + : "=r" (tid) + : "i" (ASI_JBUS_CONFIG)); + tid = ((tid & (0x1fUL<<17)) << 9); + tid &= IMAP_TID_JBUS; + } else { + /* We set it to our Safari AID. */ + __asm__ __volatile__("ldxa [%%g0] %1, %0" + : "=r" (tid) + : "i" (ASI_SAFARI_CONFIG)); + tid = ((tid & (0x3ffUL<<17)) << 9); + tid &= IMAP_AID_SAFARI; + } } else if (this_is_starfire == 0) { /* We set it to our UPA MID. */ __asm__ __volatile__("ldxa [%%g0] %1, %0" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/isa.c linux-2.4.23-pre8/arch/sparc64/kernel/isa.c --- linux-2.4.22/arch/sparc64/kernel/isa.c 2001-11-13 17:16:05.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/isa.c 2003-10-22 22:48:24.000000000 +0000 @@ -20,22 +20,23 @@ printk(" [%s", isa_dev->prom_name); } -static void __init isa_dev_get_resource(struct isa_device *isa_dev) +static void __init isa_dev_get_resource(struct isa_device *isa_dev, + struct linux_prom_registers *pregs, + int pregs_size) { - struct linux_prom_registers regs[PROMREG_MAX]; unsigned long base, len; int prop_len; prop_len = prom_getproperty(isa_dev->prom_node, "reg", - (char *) regs, sizeof(regs)); + (char *) pregs, pregs_size); if (prop_len <= 0) return; /* Only the first one is interesting. */ - len = regs[0].reg_size; - base = (((unsigned long)regs[0].which_io << 32) | - (unsigned long)regs[0].phys_addr); + len = pregs[0].reg_size; + base = (((unsigned long)pregs[0].which_io << 32) | + (unsigned long)pregs[0].phys_addr); base += isa_dev->bus->parent->io_space.start; isa_dev->resource.start = base; @@ -53,6 +54,9 @@ * * The P1275 standard for ISA devices seems to also have been * totally ignored. + * + * On later systems, an interrupt-map and interrupt-map-mask scheme + * akin to EBUS is used. */ static struct { int obp_irq; @@ -67,33 +71,72 @@ { 0, 0x00 } /* end of table */ }; -static void __init isa_dev_get_irq(struct isa_device *isa_dev) +static int __init isa_dev_get_irq_using_imap(struct isa_device *isa_dev, + struct isa_bridge *isa_br, + int *interrupt, + struct linux_prom_registers *pregs) +{ + unsigned int hi, lo, irq; + int i; + + hi = pregs->which_io & isa_br->isa_intmask.phys_hi; + lo = pregs->phys_addr & isa_br->isa_intmask.phys_lo; + irq = *interrupt & isa_br->isa_intmask.interrupt; + for (i = 0; i < isa_br->num_isa_intmap; i++) { + if ((isa_br->isa_intmap[i].phys_hi == hi) && + (isa_br->isa_intmap[i].phys_lo == lo) && + (isa_br->isa_intmap[i].interrupt == irq)) { + *interrupt = isa_br->isa_intmap[i].cinterrupt; + return 0; + } + } + return -1; +} + +static void __init isa_dev_get_irq(struct isa_device *isa_dev, + struct linux_prom_registers *pregs) { int irq_prop; irq_prop = prom_getintdefault(isa_dev->prom_node, "interrupts", -1); if (irq_prop <= 0) { - isa_dev->irq = PCI_IRQ_NONE; + goto no_irq; } else { + struct pci_controller_info *pcic; + struct pci_pbm_info *pbm; int i; + if (isa_dev->bus->num_isa_intmap) { + if (!isa_dev_get_irq_using_imap(isa_dev, + isa_dev->bus, + &irq_prop, + pregs)) + goto route_irq; + } + for (i = 0; grover_irq_table[i].obp_irq != 0; i++) { if (grover_irq_table[i].obp_irq == irq_prop) { - struct pci_controller_info *pcic; - struct pci_pbm_info *pbm; int ino = grover_irq_table[i].pci_ino; - if (ino == 0) { - isa_dev->irq = PCI_IRQ_NONE; - } else { - pbm = isa_dev->bus->parent; - pcic = pbm->parent; - isa_dev->irq = pcic->irq_build(pbm, NULL, ino); - } + if (ino == 0) + goto no_irq; + + irq_prop = ino; + goto route_irq; } } + goto no_irq; + +route_irq: + pbm = isa_dev->bus->parent; + pcic = pbm->parent; + isa_dev->irq = pcic->irq_build(pbm, NULL, irq_prop); + return; } + +no_irq: + isa_dev->irq = PCI_IRQ_NONE; } static void __init isa_fill_children(struct isa_device *parent_isa_dev) @@ -105,6 +148,7 @@ printk(" ->"); while (node != 0) { + struct linux_prom_registers regs[PROMREG_MAX]; struct isa_device *isa_dev; int prop_len; @@ -138,8 +182,8 @@ if (prop_len <= 0) isa_dev->compatible[0] = '\0'; - isa_dev_get_resource(isa_dev); - isa_dev_get_irq(isa_dev); + isa_dev_get_resource(isa_dev, regs, sizeof(regs)); + isa_dev_get_irq(isa_dev, regs); report_dev(isa_dev, 1); @@ -152,6 +196,7 @@ int node = prom_getchild(isa_br->prom_node); while (node != 0) { + struct linux_prom_registers regs[PROMREG_MAX]; struct isa_device *isa_dev; int prop_len; @@ -194,8 +239,8 @@ if (prop_len <= 0) isa_dev->compatible[0] = '\0'; - isa_dev_get_resource(isa_dev); - isa_dev_get_irq(isa_dev); + isa_dev_get_resource(isa_dev, regs, sizeof(regs)); + isa_dev_get_irq(isa_dev, regs); report_dev(isa_dev, 0); @@ -260,6 +305,21 @@ isa_br->num_isa_ranges = (prop_len / sizeof(struct linux_prom_isa_ranges)); + prop_len = prom_getproperty(isa_br->prom_node, + "interrupt-map", + (char *) isa_br->isa_intmap, + sizeof(isa_br->isa_intmap)); + if (prop_len <= 0) + isa_br->num_isa_intmap = 0; + else + isa_br->num_isa_intmap = + (prop_len / sizeof(struct linux_prom_isa_intmap)); + + prop_len = prom_getproperty(isa_br->prom_node, + "interrupt-map-mask", + (char *) &(isa_br->isa_intmask), + sizeof(isa_br->isa_intmask)); + printk("isa%d:", isa_br->index); isa_fill_devices(isa_br); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/pci.c linux-2.4.23-pre8/arch/sparc64/kernel/pci.c --- linux-2.4.22/arch/sparc64/kernel/pci.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/pci.c 2003-10-22 22:47:28.000000000 +0000 @@ -81,6 +81,8 @@ extern void sabre_init(int, char *); extern void psycho_init(int, char *); extern void schizo_init(int, char *); +extern void schizo_plus_init(int, char *); +extern void tomatillo_init(int, char *); static struct { char *model_name; @@ -92,7 +94,11 @@ { "SUNW,psycho", psycho_init }, { "pci108e,8000", psycho_init }, { "SUNW,schizo", schizo_init }, - { "pci108e,8001", schizo_init } + { "pci108e,8001", schizo_init }, + { "SUNW,schizo+", schizo_plus_init }, + { "pci108e,8002", schizo_plus_init }, + { "SUNW,tomatillo", tomatillo_init }, + { "pci108e,a801", tomatillo_init }, }; #define PCI_NUM_CONTROLLER_TYPES (sizeof(pci_controller_table) / \ sizeof(pci_controller_table[0])) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/pci_common.c linux-2.4.23-pre8/arch/sparc64/kernel/pci_common.c --- linux-2.4.22/arch/sparc64/kernel/pci_common.c 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/pci_common.c 2003-10-22 22:48:14.000000000 +0000 @@ -54,6 +54,7 @@ (pdev->vendor == PCI_VENDOR_ID_SUN) && (pdev->device == PCI_DEVICE_ID_SUN_PBM || pdev->device == PCI_DEVICE_ID_SUN_SCHIZO || + pdev->device == PCI_DEVICE_ID_SUN_TOMATILLO || pdev->device == PCI_DEVICE_ID_SUN_SABRE || pdev->device == PCI_DEVICE_ID_SUN_HUMMINGBIRD)) { *nregs = 0; @@ -699,7 +700,7 @@ struct pcidev_cookie *pcp = pdev->sysdata; struct pci_pbm_info *pbm = pcp->pbm; struct pci_controller_info *p = pbm->parent; - unsigned int portid = p->portid; + unsigned int portid = pbm->portid; unsigned int prom_irq; int prom_node = pcp->prom_node; int err; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/pci_iommu.c linux-2.4.23-pre8/arch/sparc64/kernel/pci_iommu.c --- linux-2.4.22/arch/sparc64/kernel/pci_iommu.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/pci_iommu.c 2003-10-22 22:47:49.000000000 +0000 @@ -829,5 +829,8 @@ } } + if (device_mask >= (1UL << 32UL)) + return 0; + return (device_mask & dma_addr_mask) == dma_addr_mask; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/pci_psycho.c linux-2.4.23-pre8/arch/sparc64/kernel/pci_psycho.c --- linux-2.4.22/arch/sparc64/kernel/pci_psycho.c 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/pci_psycho.c 2003-10-22 22:49:03.000000000 +0000 @@ -388,7 +388,6 @@ struct pci_dev *pdev, unsigned int ino) { - struct pci_controller_info *p = pbm->parent; struct ino_bucket *bucket; unsigned long imap, iclr; unsigned long imap_off, iclr_off; @@ -413,11 +412,11 @@ if (PIL_RESERVED(pil)) BUG(); - imap = p->controller_regs + imap_off; + imap = pbm->controller_regs + imap_off; imap += 4; iclr_off = psycho_iclr_offset(ino); - iclr = p->controller_regs + iclr_off; + iclr = pbm->controller_regs + iclr_off; iclr += 4; if ((ino & 0x20) == 0) @@ -484,7 +483,7 @@ int is_pbm_a) { struct pci_strbuf *strbuf = &pbm->stc; - unsigned long regbase = p->controller_regs; + unsigned long regbase = p->pbm_A.controller_regs; unsigned long err_base, tag_base, line_base; u64 control; int i; @@ -679,7 +678,7 @@ psycho_write(iommu->iommu_control, control | PSYCHO_IOMMU_CTRL_DENAB); for (i = 0; i < 16; i++) { - unsigned long base = p->controller_regs; + unsigned long base = p->pbm_A.controller_regs; iommu_tag[i] = psycho_read(base + PSYCHO_IOMMU_TAG + (i * 8UL)); @@ -756,8 +755,8 @@ static void psycho_ue_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; - unsigned long afsr_reg = p->controller_regs + PSYCHO_UE_AFSR; - unsigned long afar_reg = p->controller_regs + PSYCHO_UE_AFAR; + unsigned long afsr_reg = p->pbm_A.controller_regs + PSYCHO_UE_AFSR; + unsigned long afar_reg = p->pbm_A.controller_regs + PSYCHO_UE_AFAR; unsigned long afsr, afar, error_bits; int reported; @@ -831,8 +830,8 @@ static void psycho_ce_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; - unsigned long afsr_reg = p->controller_regs + PSYCHO_CE_AFSR; - unsigned long afar_reg = p->controller_regs + PSYCHO_CE_AFAR; + unsigned long afsr_reg = p->pbm_A.controller_regs + PSYCHO_CE_AFSR; + unsigned long afar_reg = p->pbm_A.controller_regs + PSYCHO_CE_AFAR; unsigned long afsr, afar, error_bits; int reported; @@ -911,6 +910,42 @@ #define PSYCHO_PCI_AFAR_A 0x2018UL #define PSYCHO_PCI_AFAR_B 0x4018UL +static void psycho_pcierr_intr_other(struct pci_pbm_info *pbm, int is_pbm_a) +{ + unsigned long csr_reg, csr, csr_error_bits; + u16 stat; + + if (is_pbm_a) { + csr_reg = pbm->controller_regs + PSYCHO_PCIA_CTRL; + } else { + csr_reg = pbm->controller_regs + PSYCHO_PCIB_CTRL; + } + csr = psycho_read(csr_reg); + csr_error_bits = + csr & (PSYCHO_PCICTRL_SBH_ERR | PSYCHO_PCICTRL_SERR); + if (csr_error_bits) { + /* Clear the errors. */ + psycho_write(csr_reg, csr); + + /* Log 'em. */ + if (csr_error_bits & PSYCHO_PCICTRL_SBH_ERR) + printk("%s: PCI streaming byte hole error asserted.\n", + pbm->name); + if (csr_error_bits & PSYCHO_PCICTRL_SERR) + printk("%s: PCI SERR signal asserted.\n", pbm->name); + } + pci_read_config_word(pbm->pci_bus->self, PCI_STATUS, &stat); + if (stat & (PCI_STATUS_PARITY | + PCI_STATUS_SIG_TARGET_ABORT | + PCI_STATUS_REC_TARGET_ABORT | + PCI_STATUS_REC_MASTER_ABORT | + PCI_STATUS_SIG_SYSTEM_ERROR)) { + printk("%s: PCI bus error, PCI_STATUS[%04x]\n", + pbm->name, stat); + pci_write_config_word(pbm->pci_bus->self, PCI_STATUS, 0xffff); + } +} + static void psycho_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_pbm_info *pbm = dev_id; @@ -921,11 +956,11 @@ is_pbm_a = (pbm == &pbm->parent->pbm_A); if (is_pbm_a) { - afsr_reg = p->controller_regs + PSYCHO_PCI_AFSR_A; - afar_reg = p->controller_regs + PSYCHO_PCI_AFAR_A; + afsr_reg = p->pbm_A.controller_regs + PSYCHO_PCI_AFSR_A; + afar_reg = p->pbm_A.controller_regs + PSYCHO_PCI_AFAR_A; } else { - afsr_reg = p->controller_regs + PSYCHO_PCI_AFSR_B; - afar_reg = p->controller_regs + PSYCHO_PCI_AFAR_B; + afsr_reg = p->pbm_A.controller_regs + PSYCHO_PCI_AFSR_B; + afar_reg = p->pbm_A.controller_regs + PSYCHO_PCI_AFAR_B; } /* Latch error status. */ @@ -939,7 +974,7 @@ PSYCHO_PCIAFSR_SMA | PSYCHO_PCIAFSR_STA | PSYCHO_PCIAFSR_SRTRY | PSYCHO_PCIAFSR_SPERR); if (!error_bits) - return; + return psycho_pcierr_intr_other(pbm, is_pbm_a); psycho_write(afsr_reg, error_bits); /* Log the error. */ @@ -1022,8 +1057,8 @@ static void __init psycho_register_error_handlers(struct pci_controller_info *p) { struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ - unsigned long base = p->controller_regs; - unsigned int irq, portid = p->portid; + unsigned long base = p->pbm_A.controller_regs; + unsigned int irq, portid = pbm->portid; u64 tmp; /* Build IRQs and register handlers. */ @@ -1043,6 +1078,7 @@ prom_halt(); } + pbm = &p->pbm_A; irq = psycho_irq_build(pbm, NULL, (portid << 6) | PSYCHO_PCIERR_A_INO); if (request_irq(irq, psycho_pcierr_intr, SA_SHIRQ, "PSYCHO PCIERR", &p->pbm_A) < 0) { @@ -1051,6 +1087,7 @@ prom_halt(); } + pbm = &p->pbm_B; irq = psycho_irq_build(pbm, NULL, (portid << 6) | PSYCHO_PCIERR_B_INO); if (request_irq(irq, psycho_pcierr_intr, SA_SHIRQ, "PSYCHO PCIERR", &p->pbm_B) < 0) { @@ -1310,26 +1347,26 @@ iommu->iommu_cur_ctx = 0; /* Register addresses. */ - iommu->iommu_control = p->controller_regs + PSYCHO_IOMMU_CONTROL; - iommu->iommu_tsbbase = p->controller_regs + PSYCHO_IOMMU_TSBBASE; - iommu->iommu_flush = p->controller_regs + PSYCHO_IOMMU_FLUSH; + iommu->iommu_control = p->pbm_A.controller_regs + PSYCHO_IOMMU_CONTROL; + iommu->iommu_tsbbase = p->pbm_A.controller_regs + PSYCHO_IOMMU_TSBBASE; + iommu->iommu_flush = p->pbm_A.controller_regs + PSYCHO_IOMMU_FLUSH; /* PSYCHO's IOMMU lacks ctx flushing. */ iommu->iommu_ctxflush = 0; /* We use the main control register of PSYCHO as the write * completion register. */ - iommu->write_complete_reg = p->controller_regs + PSYCHO_CONTROL; + iommu->write_complete_reg = p->pbm_A.controller_regs + PSYCHO_CONTROL; /* * Invalidate TLB Entries. */ - control = psycho_read(p->controller_regs + PSYCHO_IOMMU_CONTROL); + control = psycho_read(p->pbm_A.controller_regs + PSYCHO_IOMMU_CONTROL); control |= PSYCHO_IOMMU_CTRL_DENAB; - psycho_write(p->controller_regs + PSYCHO_IOMMU_CONTROL, control); + psycho_write(p->pbm_A.controller_regs + PSYCHO_IOMMU_CONTROL, control); for(i = 0; i < 16; i++) { - psycho_write(p->controller_regs + PSYCHO_IOMMU_TAG + (i * 8UL), 0); - psycho_write(p->controller_regs + PSYCHO_IOMMU_DATA + (i * 8UL), 0); + psycho_write(p->pbm_A.controller_regs + PSYCHO_IOMMU_TAG + (i * 8UL), 0); + psycho_write(p->pbm_A.controller_regs + PSYCHO_IOMMU_DATA + (i * 8UL), 0); } /* Leave diag mode enabled for full-flushing done @@ -1360,16 +1397,16 @@ iommu->alloc_info[i].next = 0; } - psycho_write(p->controller_regs + PSYCHO_IOMMU_TSBBASE, __pa(tsbbase)); + psycho_write(p->pbm_A.controller_regs + PSYCHO_IOMMU_TSBBASE, __pa(tsbbase)); - control = psycho_read(p->controller_regs + PSYCHO_IOMMU_CONTROL); + control = psycho_read(p->pbm_A.controller_regs + PSYCHO_IOMMU_CONTROL); control &= ~(PSYCHO_IOMMU_CTRL_TSBSZ | PSYCHO_IOMMU_CTRL_TBWSZ); control |= (PSYCHO_IOMMU_TSBSZ_128K | PSYCHO_IOMMU_CTRL_ENAB); - psycho_write(p->controller_regs + PSYCHO_IOMMU_CONTROL, control); + psycho_write(p->pbm_A.controller_regs + PSYCHO_IOMMU_CONTROL, control); /* If necessary, hook us up for starfire IRQ translations. */ if(this_is_starfire) - p->starfire_cookie = starfire_hookup(p->portid); + p->starfire_cookie = starfire_hookup(p->pbm_A.portid); else p->starfire_cookie = NULL; } @@ -1391,28 +1428,28 @@ u64 tmp; /* PROM sets the IRQ retry value too low, increase it. */ - psycho_write(p->controller_regs + PSYCHO_IRQ_RETRY, 0xff); + psycho_write(p->pbm_A.controller_regs + PSYCHO_IRQ_RETRY, 0xff); /* Enable arbiter for all PCI slots. */ - tmp = psycho_read(p->controller_regs + PSYCHO_PCIA_CTRL); + tmp = psycho_read(p->pbm_A.controller_regs + PSYCHO_PCIA_CTRL); tmp |= PSYCHO_PCICTRL_AEN; - psycho_write(p->controller_regs + PSYCHO_PCIA_CTRL, tmp); + psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIA_CTRL, tmp); - tmp = psycho_read(p->controller_regs + PSYCHO_PCIB_CTRL); + tmp = psycho_read(p->pbm_A.controller_regs + PSYCHO_PCIB_CTRL); tmp |= PSYCHO_PCICTRL_AEN; - psycho_write(p->controller_regs + PSYCHO_PCIB_CTRL, tmp); + psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIB_CTRL, tmp); /* Disable DMA write / PIO read synchronization on * both PCI bus segments. * [ U2P Erratum 1243770, STP2223BGA data sheet ] */ - tmp = psycho_read(p->controller_regs + PSYCHO_PCIA_DIAG); + tmp = psycho_read(p->pbm_A.controller_regs + PSYCHO_PCIA_DIAG); tmp |= PSYCHO_PCIDIAG_DDWSYNC; - psycho_write(p->controller_regs + PSYCHO_PCIA_DIAG, tmp); + psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIA_DIAG, tmp); - tmp = psycho_read(p->controller_regs + PSYCHO_PCIB_DIAG); + tmp = psycho_read(p->pbm_A.controller_regs + PSYCHO_PCIB_DIAG); tmp |= PSYCHO_PCIDIAG_DDWSYNC; - psycho_write(p->controller_regs + PSYCHO_PCIB_DIAG, tmp); + psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIB_DIAG, tmp); } static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, @@ -1435,7 +1472,7 @@ struct pci_pbm_info *pbm, int is_pbm_a) { - unsigned long base = p->controller_regs; + unsigned long base = pbm->controller_regs; u64 control; if (is_pbm_a) { @@ -1500,14 +1537,21 @@ if (is_pbm_a) { pbm = &p->pbm_A; pbm->pci_first_slot = 1; - pbm->io_space.start = p->controller_regs + PSYCHO_IOSPACE_A; - pbm->mem_space.start = p->controller_regs + PSYCHO_MEMSPACE_A; + pbm->io_space.start = pbm->controller_regs + PSYCHO_IOSPACE_A; + pbm->mem_space.start = pbm->controller_regs + PSYCHO_MEMSPACE_A; } else { pbm = &p->pbm_B; pbm->pci_first_slot = 2; - pbm->io_space.start = p->controller_regs + PSYCHO_IOSPACE_B; - pbm->mem_space.start = p->controller_regs + PSYCHO_MEMSPACE_B; + pbm->io_space.start = pbm->controller_regs + PSYCHO_IOSPACE_B; + pbm->mem_space.start = pbm->controller_regs + PSYCHO_MEMSPACE_B; } + + pbm->chip_type = PBM_CHIP_TYPE_PSYCHO; + pbm->chip_version = + prom_getintdefault(prom_node, "version#", 0); + pbm->chip_revision = + prom_getintdefault(prom_node, "module-revision#", 0); + pbm->io_space.end = pbm->io_space.start + PSYCHO_IOSPACE_SIZE; pbm->io_space.flags = IORESOURCE_IO; pbm->mem_space.end = pbm->mem_space.start + PSYCHO_MEMSPACE_SIZE; @@ -1575,7 +1619,7 @@ spin_lock_irqsave(&pci_controller_lock, flags); for(p = pci_controller_root; p; p = p->next) { - if (p->portid == upa_portid) { + if (p->pbm_A.portid == upa_portid) { spin_unlock_irqrestore(&pci_controller_lock, flags); is_pbm_a = (p->pbm_A.prom_node == 0); psycho_pbm_init(p, node, is_pbm_a); @@ -1603,7 +1647,8 @@ pci_controller_root = p; spin_unlock_irqrestore(&pci_controller_lock, flags); - p->portid = upa_portid; + p->pbm_A.portid = upa_portid; + p->pbm_B.portid = upa_portid; p->index = pci_num_controllers++; p->pbms_same_domain = 0; p->scan_bus = psycho_scan_bus; @@ -1620,9 +1665,10 @@ prom_halt(); } - p->controller_regs = pr_regs[2].phys_addr; + p->pbm_A.controller_regs = pr_regs[2].phys_addr; + p->pbm_B.controller_regs = pr_regs[2].phys_addr; printk("PCI: Found PSYCHO, control regs at %016lx\n", - p->controller_regs); + p->pbm_A.controller_regs); p->pbm_A.config_space = p->pbm_B.config_space = (pr_regs[2].phys_addr + PSYCHO_CONFIGSPACE); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/pci_sabre.c linux-2.4.23-pre8/arch/sparc64/kernel/pci_sabre.c --- linux-2.4.22/arch/sparc64/kernel/pci_sabre.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/pci_sabre.c 2003-10-22 22:48:41.000000000 +0000 @@ -219,6 +219,7 @@ ((unsigned long)(REG))) static int hummingbird_p; +static struct pci_bus *sabre_root_bus; static void *sabre_pci_config_mkaddr(struct pci_pbm_info *pbm, unsigned char bus, @@ -630,7 +631,6 @@ struct pci_dev *pdev, unsigned int ino) { - struct pci_controller_info *p = pbm->parent; struct ino_bucket *bucket; unsigned long imap, iclr; unsigned long imap_off, iclr_off; @@ -655,11 +655,11 @@ if (PIL_RESERVED(pil)) BUG(); - imap = p->controller_regs + imap_off; + imap = pbm->controller_regs + imap_off; imap += 4; iclr_off = sabre_iclr_offset(ino); - iclr = p->controller_regs + iclr_off; + iclr = pbm->controller_regs + iclr_off; iclr += 4; if ((ino & 0x20) == 0) @@ -737,7 +737,7 @@ sabre_write(iommu->iommu_control, (control | SABRE_IOMMUCTRL_DENAB)); for (i = 0; i < 16; i++) { - unsigned long base = p->controller_regs; + unsigned long base = p->pbm_A.controller_regs; iommu_tag[i] = sabre_read(base + SABRE_IOMMU_TAG + (i * 8UL)); @@ -786,8 +786,8 @@ static void sabre_ue_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; - unsigned long afsr_reg = p->controller_regs + SABRE_UE_AFSR; - unsigned long afar_reg = p->controller_regs + SABRE_UECE_AFAR; + unsigned long afsr_reg = p->pbm_A.controller_regs + SABRE_UE_AFSR; + unsigned long afar_reg = p->pbm_A.controller_regs + SABRE_UECE_AFAR; unsigned long afsr, afar, error_bits; int reported; @@ -844,8 +844,8 @@ static void sabre_ce_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; - unsigned long afsr_reg = p->controller_regs + SABRE_CE_AFSR; - unsigned long afar_reg = p->controller_regs + SABRE_UECE_AFAR; + unsigned long afsr_reg = p->pbm_A.controller_regs + SABRE_CE_AFSR; + unsigned long afar_reg = p->pbm_A.controller_regs + SABRE_UECE_AFAR; unsigned long afsr, afar, error_bits; int reported; @@ -895,6 +895,38 @@ printk("]\n"); } +static void sabre_pcierr_intr_other(struct pci_controller_info *p) +{ + unsigned long csr_reg, csr, csr_error_bits; + u16 stat; + + csr_reg = p->pbm_A.controller_regs + SABRE_PCICTRL; + csr = sabre_read(csr_reg); + csr_error_bits = + csr & SABRE_PCICTRL_SERR; + if (csr_error_bits) { + /* Clear the errors. */ + sabre_write(csr_reg, csr); + + /* Log 'em. */ + if (csr_error_bits & SABRE_PCICTRL_SERR) + printk("SABRE%d: PCI SERR signal asserted.\n", + p->index); + } + pci_read_config_word(sabre_root_bus->self, + PCI_STATUS, &stat); + if (stat & (PCI_STATUS_PARITY | + PCI_STATUS_SIG_TARGET_ABORT | + PCI_STATUS_REC_TARGET_ABORT | + PCI_STATUS_REC_MASTER_ABORT | + PCI_STATUS_SIG_SYSTEM_ERROR)) { + printk("SABRE%d: PCI bus error, PCI_STATUS[%04x]\n", + p->index, stat); + pci_write_config_word(sabre_root_bus->self, + PCI_STATUS, 0xffff); + } +} + static void sabre_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; @@ -902,8 +934,8 @@ unsigned long afsr, afar, error_bits; int reported; - afsr_reg = p->controller_regs + SABRE_PIOAFSR; - afar_reg = p->controller_regs + SABRE_PIOAFAR; + afsr_reg = p->pbm_A.controller_regs + SABRE_PIOAFSR; + afar_reg = p->pbm_A.controller_regs + SABRE_PIOAFAR; /* Latch error status. */ afar = sabre_read(afar_reg); @@ -916,7 +948,7 @@ SABRE_PIOAFSR_SMA | SABRE_PIOAFSR_STA | SABRE_PIOAFSR_SRTRY | SABRE_PIOAFSR_SPERR); if (!error_bits) - return; + return sabre_pcierr_intr_other(p); sabre_write(afsr_reg, error_bits); /* Log the error. */ @@ -995,8 +1027,8 @@ static void __init sabre_register_error_handlers(struct pci_controller_info *p) { struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ - unsigned long base = p->controller_regs; - unsigned long irq, portid = p->portid; + unsigned long base = pbm->controller_regs; + unsigned long irq, portid = pbm->portid; u64 tmp; /* We clear the error bits in the appropriate AFSR before @@ -1044,13 +1076,12 @@ struct resource *root) { struct pci_pbm_info *pbm = pci_bus2pbm[pdev->bus->number]; - struct pci_controller_info *p = pbm->parent; unsigned long base; if (res->flags & IORESOURCE_IO) - base = p->controller_regs + SABRE_IOSPACE; + base = pbm->controller_regs + SABRE_IOSPACE; else - base = p->controller_regs + SABRE_MEMSPACE; + base = pbm->controller_regs + SABRE_MEMSPACE; res->start += base; res->end += base; @@ -1060,7 +1091,6 @@ { struct pcidev_cookie *pcp = pdev->sysdata; struct pci_pbm_info *pbm = pcp->pbm; - struct pci_controller_info *p = pbm->parent; struct resource *res; unsigned long base; u32 reg; @@ -1078,9 +1108,9 @@ is_64bit = 0; if (res->flags & IORESOURCE_IO) - base = p->controller_regs + SABRE_IOSPACE; + base = pbm->controller_regs + SABRE_IOSPACE; else { - base = p->controller_regs + SABRE_MEMSPACE; + base = pbm->controller_regs + SABRE_MEMSPACE; if ((res->flags & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == PCI_BASE_ADDRESS_MEM_TYPE_64) is_64bit = 1; @@ -1197,6 +1227,8 @@ pci_fixup_host_bridge_self(sabre_bus); sabre_bus->self->sysdata = cookie; + sabre_root_bus = sabre_bus; + apb_init(p, sabre_bus); sabres_scanned = 0; @@ -1256,21 +1288,21 @@ iommu->iommu_cur_ctx = 0; /* Register addresses. */ - iommu->iommu_control = p->controller_regs + SABRE_IOMMU_CONTROL; - iommu->iommu_tsbbase = p->controller_regs + SABRE_IOMMU_TSBBASE; - iommu->iommu_flush = p->controller_regs + SABRE_IOMMU_FLUSH; - iommu->write_complete_reg = p->controller_regs + SABRE_WRSYNC; + iommu->iommu_control = p->pbm_A.controller_regs + SABRE_IOMMU_CONTROL; + iommu->iommu_tsbbase = p->pbm_A.controller_regs + SABRE_IOMMU_TSBBASE; + iommu->iommu_flush = p->pbm_A.controller_regs + SABRE_IOMMU_FLUSH; + iommu->write_complete_reg = p->pbm_A.controller_regs + SABRE_WRSYNC; /* Sabre's IOMMU lacks ctx flushing. */ iommu->iommu_ctxflush = 0; /* Invalidate TLB Entries. */ - control = sabre_read(p->controller_regs + SABRE_IOMMU_CONTROL); + control = sabre_read(p->pbm_A.controller_regs + SABRE_IOMMU_CONTROL); control |= SABRE_IOMMUCTRL_DENAB; - sabre_write(p->controller_regs + SABRE_IOMMU_CONTROL, control); + sabre_write(p->pbm_A.controller_regs + SABRE_IOMMU_CONTROL, control); for(i = 0; i < 16; i++) { - sabre_write(p->controller_regs + SABRE_IOMMU_TAG + (i * 8UL), 0); - sabre_write(p->controller_regs + SABRE_IOMMU_DATA + (i * 8UL), 0); + sabre_write(p->pbm_A.controller_regs + SABRE_IOMMU_TAG + (i * 8UL), 0); + sabre_write(p->pbm_A.controller_regs + SABRE_IOMMU_DATA + (i * 8UL), 0); } /* Leave diag mode enabled for full-flushing done @@ -1287,9 +1319,9 @@ iommu->dma_addr_mask = dma_mask; memset((char *)tsbbase, 0, PAGE_SIZE << order); - sabre_write(p->controller_regs + SABRE_IOMMU_TSBBASE, __pa(tsbbase)); + sabre_write(p->pbm_A.controller_regs + SABRE_IOMMU_TSBBASE, __pa(tsbbase)); - control = sabre_read(p->controller_regs + SABRE_IOMMU_CONTROL); + control = sabre_read(p->pbm_A.controller_regs + SABRE_IOMMU_CONTROL); control &= ~(SABRE_IOMMUCTRL_TSBSZ | SABRE_IOMMUCTRL_TBWSZ); control |= SABRE_IOMMUCTRL_ENAB; switch(tsbsize) { @@ -1306,7 +1338,7 @@ prom_halt(); break; } - sabre_write(p->controller_regs + SABRE_IOMMU_CONTROL, control); + sabre_write(p->pbm_A.controller_regs + SABRE_IOMMU_CONTROL, control); /* We start with no consistent mappings. */ iommu->lowest_consistent_map = @@ -1322,8 +1354,8 @@ struct pci_pbm_info *pbm) { char *name = pbm->name; - unsigned long ibase = p->controller_regs + SABRE_IOSPACE; - unsigned long mbase = p->controller_regs + SABRE_MEMSPACE; + unsigned long ibase = p->pbm_A.controller_regs + SABRE_IOSPACE; + unsigned long mbase = p->pbm_A.controller_regs + SABRE_MEMSPACE; unsigned int devfn; unsigned long first, last, i; u8 *addr, map; @@ -1416,6 +1448,7 @@ pbm = &p->pbm_B; else pbm = &p->pbm_A; + pbm->chip_type = PBM_CHIP_TYPE_SABRE; pbm->parent = p; pbm->prom_node = node; pbm->pci_first_slot = 1; @@ -1511,11 +1544,11 @@ pbm->io_space.name = pbm->mem_space.name = pbm->name; /* Hack up top-level resources. */ - pbm->io_space.start = p->controller_regs + SABRE_IOSPACE; + pbm->io_space.start = p->pbm_A.controller_regs + SABRE_IOSPACE; pbm->io_space.end = pbm->io_space.start + (1UL << 24) - 1UL; pbm->io_space.flags = IORESOURCE_IO; - pbm->mem_space.start = p->controller_regs + SABRE_MEMSPACE; + pbm->mem_space.start = p->pbm_A.controller_regs + SABRE_MEMSPACE; pbm->mem_space.end = pbm->mem_space.start + (unsigned long)dma_begin - 1UL; pbm->mem_space.flags = IORESOURCE_MEM; @@ -1591,7 +1624,8 @@ pci_controller_root = p; spin_unlock_irqrestore(&pci_controller_lock, flags); - p->portid = upa_portid; + p->pbm_A.portid = upa_portid; + p->pbm_B.portid = upa_portid; p->index = pci_num_controllers++; p->pbms_same_domain = 1; p->scan_bus = sabre_scan_bus; @@ -1614,30 +1648,31 @@ /* * First REG in property is base of entire SABRE register space. */ - p->controller_regs = pr_regs[0].phys_addr; - pci_dma_wsync = p->controller_regs + SABRE_WRSYNC; + p->pbm_A.controller_regs = pr_regs[0].phys_addr; + p->pbm_B.controller_regs = pr_regs[0].phys_addr; + pci_dma_wsync = p->pbm_A.controller_regs + SABRE_WRSYNC; printk("PCI: Found SABRE, main regs at %016lx, wsync at %016lx\n", - p->controller_regs, pci_dma_wsync); + p->pbm_A.controller_regs, pci_dma_wsync); /* Clear interrupts */ /* PCI first */ for (clear_irq = SABRE_ICLR_A_SLOT0; clear_irq < SABRE_ICLR_B_SLOT0 + 0x80; clear_irq += 8) - sabre_write(p->controller_regs + clear_irq, 0x0UL); + sabre_write(p->pbm_A.controller_regs + clear_irq, 0x0UL); /* Then OBIO */ for (clear_irq = SABRE_ICLR_SCSI; clear_irq < SABRE_ICLR_SCSI + 0x80; clear_irq += 8) - sabre_write(p->controller_regs + clear_irq, 0x0UL); + sabre_write(p->pbm_A.controller_regs + clear_irq, 0x0UL); /* Error interrupts are enabled later after the bus scan. */ - sabre_write(p->controller_regs + SABRE_PCICTRL, + sabre_write(p->pbm_A.controller_regs + SABRE_PCICTRL, (SABRE_PCICTRL_MRLEN | SABRE_PCICTRL_SERR | SABRE_PCICTRL_ARBPARK | SABRE_PCICTRL_AEN)); /* Now map in PCI config space for entire SABRE. */ p->pbm_A.config_space = p->pbm_B.config_space = - (p->controller_regs + SABRE_CONFIGSPACE); + (p->pbm_A.controller_regs + SABRE_CONFIGSPACE); printk("SABRE: Shared PCI config space at %016lx\n", p->pbm_A.config_space); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/pci_schizo.c linux-2.4.23-pre8/arch/sparc64/kernel/pci_schizo.c --- linux-2.4.22/arch/sparc64/kernel/pci_schizo.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/pci_schizo.c 2003-10-22 22:47:46.000000000 +0000 @@ -1,7 +1,7 @@ /* $Id: pci_schizo.c,v 1.23.2.2 2002/03/11 07:55:24 davem Exp $ - * pci_schizo.c: SCHIZO specific PCI controller support. + * pci_schizo.c: SCHIZO/TOMATILLO specific PCI controller support. * - * Copyright (C) 2001 David S. Miller (davem@redhat.com) + * Copyright (C) 2001, 2002, 2003 David S. Miller (davem@redhat.com) */ #include @@ -45,13 +45,7 @@ * block requires more space in Schizo's address space than * they predicted, thus requiring an address space reorg when * the newer Schizo is taped out. - * - * These offsets look weird because I keep in p->controller_regs - * the second PROM register property minus 0x10000 which is the - * base of the Safari and UPA64S registers of SCHIZO. */ -#define SCHIZO_PBM_A_REGS_OFF (0x600000UL - 0x400000UL) -#define SCHIZO_PBM_B_REGS_OFF (0x700000UL - 0x400000UL) /* Streaming buffer control register. */ #define SCHIZO_STRBUF_CTRL_LPTR 0x00000000000000f0UL /* LRU Lock Pointer */ @@ -101,25 +95,21 @@ { if (!pbm) return NULL; + bus -= pbm->pci_first_busno; return (void *) (SCHIZO_CONFIG_BASE(pbm) | SCHIZO_CONFIG_ENCODE(bus, devfn, where)); } -/* 4 slots on pbm A, and 6 slots on pbm B. In both cases - * slot 0 is the SCHIZO host bridge itself. - */ +/* Just make sure the bus number is in range. */ static int schizo_out_of_range(struct pci_pbm_info *pbm, unsigned char bus, unsigned char devfn) { - return ((pbm->parent == 0) || - ((pbm == &pbm->parent->pbm_B) && - (bus == pbm->pci_first_busno) && - PCI_SLOT(devfn) > 6) || - ((pbm == &pbm->parent->pbm_A) && - (bus == pbm->pci_first_busno) && - PCI_SLOT(devfn) > 4)); + if (bus < pbm->pci_first_busno || + bus > pbm->pci_last_busno) + return 1; + return 0; } /* SCHIZO PCI configuration space accessors. */ @@ -188,6 +178,15 @@ } pci_config_read32(addr, value); + if (where == PCI_PRIMARY_BUS && + dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && + *value != 0xffffffff) { + u8 *busp = ((u8 *) value) + 1; + int i; + + for (i = 0; i < 3; i++) + busp[i] += pbm->pci_first_busno; + } return PCIBIOS_SUCCESSFUL; } @@ -251,6 +250,20 @@ where); return PCIBIOS_SUCCESSFUL; } + + if (where == PCI_PRIMARY_BUS && + dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { + u8 *busp = ((u8 *) &value) + 1; + int i; + + for (i = 0; i < 3; i++) { + if (busp[i] >= pbm->pci_first_busno) + busp[i] += pbm->pci_first_busno; + else + busp[i] = 0; + } + } + pci_config_write32(addr, value); return PCIBIOS_SUCCESSFUL; } @@ -379,16 +392,10 @@ struct pci_dev *pdev, unsigned int ino) { - struct pci_controller_info *p = pbm->parent; struct ino_bucket *bucket; - unsigned long imap, iclr, pbm_off; + unsigned long imap, iclr; unsigned long imap_off, iclr_off; - int pil; - - if (pbm == &p->pbm_A) - pbm_off = SCHIZO_PBM_A_REGS_OFF; - else - pbm_off = SCHIZO_PBM_B_REGS_OFF; + int pil, ign_fixup; ino &= PCI_IRQ_INO; imap_off = schizo_imap_offset(ino); @@ -399,11 +406,11 @@ if (PIL_RESERVED(pil)) BUG(); - imap = p->controller_regs + pbm_off + imap_off; + imap = pbm->pbm_regs + imap_off; imap += 4; iclr_off = schizo_iclr_offset(ino); - iclr = p->controller_regs + pbm_off + iclr_off; + iclr = pbm->pbm_regs + iclr_off; iclr += 4; /* On Schizo, no inofixup occurs. This is because each @@ -411,8 +418,17 @@ * there is only one IMAP register for each PCI slot even * though four different INOs can be generated by each * PCI slot. + * + * But, for JBUS variants (essentially, Tomatillo), we have + * to fixup the lowest bit of the interrupt group number. */ - bucket = __bucket(build_irq(pil, 0, iclr, imap)); + ign_fixup = 0; + if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO) { + if (pbm->portid & 1) + ign_fixup = (1 << 6); + } + + bucket = __bucket(build_irq(pil, ign_fixup, iclr, imap)); bucket->flags |= IBF_PCI; return __irq(bucket); @@ -428,6 +444,13 @@ static unsigned long stc_tag_buf[16]; static unsigned long stc_line_buf[16]; +/* These offsets look weird because I keep in pbm->controller_regs + * the second PROM register property minus 0x10000 which is the + * base of the Safari and UPA64S registers of SCHIZO. + */ +#define SCHIZO_PBM_A_REGS_OFF (0x600000UL - 0x400000UL) +#define SCHIZO_PBM_B_REGS_OFF (0x700000UL - 0x400000UL) + static void schizo_clear_other_err_intr(int irq) { struct ino_bucket *bucket = __bucket(irq); @@ -459,19 +482,12 @@ static void __schizo_check_stc_error_pbm(struct pci_pbm_info *pbm, enum schizo_error_type type) { - struct pci_controller_info *p = pbm->parent; struct pci_strbuf *strbuf = &pbm->stc; - unsigned long regbase = p->controller_regs; + unsigned long regbase = pbm->pbm_regs; unsigned long err_base, tag_base, line_base; u64 control; - char pbm_name = (pbm == &p->pbm_A ? 'A' : 'B'); int i; - if (pbm == &p->pbm_A) - regbase += SCHIZO_PBM_A_REGS_OFF; - else - regbase += SCHIZO_PBM_B_REGS_OFF; - err_base = regbase + SCHIZO_STC_ERR; tag_base = regbase + SCHIZO_STC_TAG; line_base = regbase + SCHIZO_STC_LINE; @@ -517,8 +533,8 @@ unsigned long errval = stc_error_buf[j]; if (errval != 0) { saw_error++; - printk("SCHIZO%d: PBM-%c STC_ERR(%d)[wr(%d)rd(%d)]\n", - p->index, pbm_name, + printk("%s: STC_ERR(%d)[wr(%d)rd(%d)]\n", + pbm->name, j, (errval & SCHIZO_STCERR_WRITE) ? 1 : 0, (errval & SCHIZO_STCERR_READ) ? 1 : 0); @@ -527,8 +543,8 @@ if (saw_error != 0) { unsigned long tagval = stc_tag_buf[i]; unsigned long lineval = stc_line_buf[i]; - printk("SCHIZO%d: PBM-%c STC_TAG(%d)[PA(%016lx)VA(%08lx)V(%d)R(%d)]\n", - p->index, pbm_name, + printk("%s: STC_TAG(%d)[PA(%016lx)VA(%08lx)V(%d)R(%d)]\n", + pbm->name, i, ((tagval & SCHIZO_STCTAG_PPN) >> 19UL), (tagval & SCHIZO_STCTAG_VPN), @@ -536,9 +552,9 @@ ((tagval & SCHIZO_STCTAG_READ) ? 1 : 0)); /* XXX Should spit out per-bank error information... -DaveM */ - printk("SCHIZO%d: PBM-%c STC_LINE(%d)[LIDX(%lx)SP(%lx)LADDR(%lx)EP(%lx)" + printk("%s: STC_LINE(%d)[LIDX(%lx)SP(%lx)LADDR(%lx)EP(%lx)" "V(%d)FOFN(%d)]\n", - p->index, pbm_name, + pbm->name, i, ((lineval & SCHIZO_STCLINE_LINDX) >> 23UL), ((lineval & SCHIZO_STCLINE_SPTR) >> 13UL), @@ -574,13 +590,11 @@ static void schizo_check_iommu_error_pbm(struct pci_pbm_info *pbm, enum schizo_error_type type) { - struct pci_controller_info *p = pbm->parent; struct pci_iommu *iommu = pbm->iommu; unsigned long iommu_tag[16]; unsigned long iommu_data[16]; unsigned long flags; u64 control; - char pbm_name = (pbm == &p->pbm_A ? 'A' : 'B'); int i; spin_lock_irqsave(&iommu->lock, flags); @@ -608,8 +622,8 @@ type_string = "ECC Error"; break; }; - printk("SCHIZO%d: PBM-%c IOMMU Error, type[%s]\n", - p->index, pbm_name, type_string); + printk("%s: IOMMU Error, type[%s]\n", + pbm->name, type_string); /* Put the IOMMU into diagnostic mode and probe * it's TLB for entries with error status. @@ -624,11 +638,7 @@ schizo_write(iommu->iommu_control, control | SCHIZO_IOMMU_CTRL_DENAB); - base = p->controller_regs; - if (pbm == &p->pbm_A) - base += SCHIZO_PBM_A_REGS_OFF; - else - base += SCHIZO_PBM_B_REGS_OFF; + base = pbm->pbm_regs; for (i = 0; i < 16; i++) { iommu_tag[i] = @@ -667,22 +677,23 @@ type_string = "ECC Error"; break; }; - printk("SCHIZO%d: PBM-%c IOMMU TAG(%d)[error(%s) ctx(%x) wr(%d) str(%d) " + printk("%s: IOMMU TAG(%d)[error(%s) ctx(%x) wr(%d) str(%d) " "sz(%dK) vpg(%08lx)]\n", - p->index, pbm_name, i, type_string, + pbm->name, i, type_string, (int)((tag & SCHIZO_IOMMU_TAG_CTXT) >> 25UL), ((tag & SCHIZO_IOMMU_TAG_WRITE) ? 1 : 0), ((tag & SCHIZO_IOMMU_TAG_STREAM) ? 1 : 0), ((tag & SCHIZO_IOMMU_TAG_SIZE) ? 64 : 8), (tag & SCHIZO_IOMMU_TAG_VPAGE) << IOMMU_PAGE_SHIFT); - printk("SCHIZO%d: PBM-%c IOMMU DATA(%d)[valid(%d) cache(%d) ppg(%016lx)]\n", - p->index, pbm_name, i, + printk("%s: IOMMU DATA(%d)[valid(%d) cache(%d) ppg(%016lx)]\n", + pbm->name, i, ((data & SCHIZO_IOMMU_DATA_VALID) ? 1 : 0), ((data & SCHIZO_IOMMU_DATA_CACHE) ? 1 : 0), (data & SCHIZO_IOMMU_DATA_PPAGE) << IOMMU_PAGE_SHIFT); } } - __schizo_check_stc_error_pbm(pbm, type); + if (pbm->stc.strbuf_enabled) + __schizo_check_stc_error_pbm(pbm, type); spin_unlock_irqrestore(&iommu->lock, flags); } @@ -697,26 +708,26 @@ #define SCHIZO_UE_AFSR 0x10030UL #define SCHIZO_UE_AFAR 0x10038UL -#define SCHIZO_UEAFSR_PPIO 0x8000000000000000UL -#define SCHIZO_UEAFSR_PDRD 0x4000000000000000UL -#define SCHIZO_UEAFSR_PDWR 0x2000000000000000UL -#define SCHIZO_UEAFSR_SPIO 0x1000000000000000UL -#define SCHIZO_UEAFSR_SDMA 0x0800000000000000UL -#define SCHIZO_UEAFSR_ERRPNDG 0x0300000000000000UL -#define SCHIZO_UEAFSR_BMSK 0x000003ff00000000UL -#define SCHIZO_UEAFSR_QOFF 0x00000000c0000000UL -#define SCHIZO_UEAFSR_AID 0x000000001f000000UL -#define SCHIZO_UEAFSR_PARTIAL 0x0000000000800000UL -#define SCHIZO_UEAFSR_OWNEDIN 0x0000000000400000UL -#define SCHIZO_UEAFSR_MTAGSYND 0x00000000000f0000UL -#define SCHIZO_UEAFSR_MTAG 0x000000000000e000UL -#define SCHIZO_UEAFSR_ECCSYND 0x00000000000001ffUL +#define SCHIZO_UEAFSR_PPIO 0x8000000000000000UL /* Safari */ +#define SCHIZO_UEAFSR_PDRD 0x4000000000000000UL /* Safari/Tomatillo */ +#define SCHIZO_UEAFSR_PDWR 0x2000000000000000UL /* Safari */ +#define SCHIZO_UEAFSR_SPIO 0x1000000000000000UL /* Safari */ +#define SCHIZO_UEAFSR_SDMA 0x0800000000000000UL /* Safari/Tomatillo */ +#define SCHIZO_UEAFSR_ERRPNDG 0x0300000000000000UL /* Safari */ +#define SCHIZO_UEAFSR_BMSK 0x000003ff00000000UL /* Safari */ +#define SCHIZO_UEAFSR_QOFF 0x00000000c0000000UL /* Safari/Tomatillo */ +#define SCHIZO_UEAFSR_AID 0x000000001f000000UL /* Safari/Tomatillo */ +#define SCHIZO_UEAFSR_PARTIAL 0x0000000000800000UL /* Safari */ +#define SCHIZO_UEAFSR_OWNEDIN 0x0000000000400000UL /* Safari */ +#define SCHIZO_UEAFSR_MTAGSYND 0x00000000000f0000UL /* Safari */ +#define SCHIZO_UEAFSR_MTAG 0x000000000000e000UL /* Safari */ +#define SCHIZO_UEAFSR_ECCSYND 0x00000000000001ffUL /* Safari */ static void schizo_ue_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; - unsigned long afsr_reg = p->controller_regs + SCHIZO_UE_AFSR; - unsigned long afar_reg = p->controller_regs + SCHIZO_UE_AFAR; + unsigned long afsr_reg = p->pbm_B.controller_regs + SCHIZO_UE_AFSR; + unsigned long afar_reg = p->pbm_B.controller_regs + SCHIZO_UE_AFAR; unsigned long afsr, afar, error_bits; int reported, limit; @@ -741,7 +752,7 @@ schizo_write(afsr_reg, error_bits); /* Log the error. */ - printk("SCHIZO%d: Uncorrectable Error, primary error type[%s]\n", + printk("PCI%d: Uncorrectable Error, primary error type[%s]\n", p->index, (((error_bits & SCHIZO_UEAFSR_PPIO) ? "PIO" : @@ -749,20 +760,20 @@ "DMA Read" : ((error_bits & SCHIZO_UEAFSR_PDWR) ? "DMA Write" : "???"))))); - printk("SCHIZO%d: bytemask[%04lx] qword_offset[%lx] SAFARI_AID[%02lx]\n", + printk("PCI%d: bytemask[%04lx] qword_offset[%lx] SAFARI_AID[%02lx]\n", p->index, (afsr & SCHIZO_UEAFSR_BMSK) >> 32UL, (afsr & SCHIZO_UEAFSR_QOFF) >> 30UL, (afsr & SCHIZO_UEAFSR_AID) >> 24UL); - printk("SCHIZO%d: partial[%d] owned_in[%d] mtag[%lx] mtag_synd[%lx] ecc_sync[%lx]\n", + printk("PCI%d: partial[%d] owned_in[%d] mtag[%lx] mtag_synd[%lx] ecc_sync[%lx]\n", p->index, (afsr & SCHIZO_UEAFSR_PARTIAL) ? 1 : 0, (afsr & SCHIZO_UEAFSR_OWNEDIN) ? 1 : 0, (afsr & SCHIZO_UEAFSR_MTAG) >> 13UL, (afsr & SCHIZO_UEAFSR_MTAGSYND) >> 16UL, (afsr & SCHIZO_UEAFSR_ECCSYND) >> 0UL); - printk("SCHIZO%d: UE AFAR [%016lx]\n", p->index, afar); - printk("SCHIZO%d: UE Secondary errors [", p->index); + printk("PCI%d: UE AFAR [%016lx]\n", p->index, afar); + printk("PCI%d: UE Secondary errors [", p->index); reported = 0; if (afsr & SCHIZO_UEAFSR_SPIO) { reported++; @@ -803,8 +814,8 @@ static void schizo_ce_intr(int irq, void *dev_id, struct pt_regs *regs) { struct pci_controller_info *p = dev_id; - unsigned long afsr_reg = p->controller_regs + SCHIZO_CE_AFSR; - unsigned long afar_reg = p->controller_regs + SCHIZO_CE_AFAR; + unsigned long afsr_reg = p->pbm_B.controller_regs + SCHIZO_CE_AFSR; + unsigned long afar_reg = p->pbm_B.controller_regs + SCHIZO_CE_AFAR; unsigned long afsr, afar, error_bits; int reported, limit; @@ -829,7 +840,7 @@ schizo_write(afsr_reg, error_bits); /* Log the error. */ - printk("SCHIZO%d: Correctable Error, primary error type[%s]\n", + printk("PCI%d: Correctable Error, primary error type[%s]\n", p->index, (((error_bits & SCHIZO_CEAFSR_PPIO) ? "PIO" : @@ -841,20 +852,20 @@ /* XXX Use syndrome and afar to print out module string just like * XXX UDB CE trap handler does... -DaveM */ - printk("SCHIZO%d: bytemask[%04lx] qword_offset[%lx] SAFARI_AID[%02lx]\n", + printk("PCI%d: bytemask[%04lx] qword_offset[%lx] SAFARI_AID[%02lx]\n", p->index, (afsr & SCHIZO_UEAFSR_BMSK) >> 32UL, (afsr & SCHIZO_UEAFSR_QOFF) >> 30UL, (afsr & SCHIZO_UEAFSR_AID) >> 24UL); - printk("SCHIZO%d: partial[%d] owned_in[%d] mtag[%lx] mtag_synd[%lx] ecc_sync[%lx]\n", + printk("PCI%d: partial[%d] owned_in[%d] mtag[%lx] mtag_synd[%lx] ecc_sync[%lx]\n", p->index, (afsr & SCHIZO_UEAFSR_PARTIAL) ? 1 : 0, (afsr & SCHIZO_UEAFSR_OWNEDIN) ? 1 : 0, (afsr & SCHIZO_UEAFSR_MTAG) >> 13UL, (afsr & SCHIZO_UEAFSR_MTAGSYND) >> 16UL, (afsr & SCHIZO_UEAFSR_ECCSYND) >> 0UL); - printk("SCHIZO%d: CE AFAR [%016lx]\n", p->index, afar); - printk("SCHIZO%d: CE Secondary errors [", p->index); + printk("PCI%d: CE AFAR [%016lx]\n", p->index, afar); + printk("PCI%d: CE Secondary errors [", p->index); reported = 0; if (afsr & SCHIZO_CEAFSR_SPIO) { reported++; @@ -874,23 +885,101 @@ #define SCHIZO_PCI_AFSR 0x2010UL #define SCHIZO_PCI_AFAR 0x2018UL -#define SCHIZO_PCIAFSR_PMA 0x8000000000000000UL -#define SCHIZO_PCIAFSR_PTA 0x4000000000000000UL -#define SCHIZO_PCIAFSR_PRTRY 0x2000000000000000UL -#define SCHIZO_PCIAFSR_PPERR 0x1000000000000000UL -#define SCHIZO_PCIAFSR_PTTO 0x0800000000000000UL -#define SCHIZO_PCIAFSR_PUNUS 0x0400000000000000UL -#define SCHIZO_PCIAFSR_SMA 0x0200000000000000UL -#define SCHIZO_PCIAFSR_STA 0x0100000000000000UL -#define SCHIZO_PCIAFSR_SRTRY 0x0080000000000000UL -#define SCHIZO_PCIAFSR_SPERR 0x0040000000000000UL -#define SCHIZO_PCIAFSR_STTO 0x0020000000000000UL -#define SCHIZO_PCIAFSR_SUNUS 0x0010000000000000UL -#define SCHIZO_PCIAFSR_BMSK 0x000003ff00000000UL -#define SCHIZO_PCIAFSR_BLK 0x0000000080000000UL -#define SCHIZO_PCIAFSR_CFG 0x0000000040000000UL -#define SCHIZO_PCIAFSR_MEM 0x0000000020000000UL -#define SCHIZO_PCIAFSR_IO 0x0000000010000000UL +#define SCHIZO_PCIAFSR_PMA 0x8000000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_PTA 0x4000000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_PRTRY 0x2000000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_PPERR 0x1000000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_PTTO 0x0800000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_PUNUS 0x0400000000000000UL /* Schizo */ +#define SCHIZO_PCIAFSR_SMA 0x0200000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_STA 0x0100000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_SRTRY 0x0080000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_SPERR 0x0040000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_STTO 0x0020000000000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_SUNUS 0x0010000000000000UL /* Schizo */ +#define SCHIZO_PCIAFSR_BMSK 0x000003ff00000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_BLK 0x0000000080000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_CFG 0x0000000040000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_MEM 0x0000000020000000UL /* Schizo/Tomatillo */ +#define SCHIZO_PCIAFSR_IO 0x0000000010000000UL /* Schizo/Tomatillo */ + +#define SCHIZO_PCI_CTRL (0x2000UL) +#define SCHIZO_PCICTRL_BUS_UNUS (1UL << 63UL) /* Safari */ +#define SCHIZO_PCICTRL_ARB_PRIO (0x1ff << 52UL) /* Tomatillo */ +#define SCHIZO_PCICTRL_ESLCK (1UL << 51UL) /* Safari */ +#define SCHIZO_PCICTRL_ERRSLOT (7UL << 48UL) /* Safari */ +#define SCHIZO_PCICTRL_TTO_ERR (1UL << 38UL) /* Safari/Tomatillo */ +#define SCHIZO_PCICTRL_RTRY_ERR (1UL << 37UL) /* Safari/Tomatillo */ +#define SCHIZO_PCICTRL_DTO_ERR (1UL << 36UL) /* Safari/Tomatillo */ +#define SCHIZO_PCICTRL_SBH_ERR (1UL << 35UL) /* Safari */ +#define SCHIZO_PCICTRL_SERR (1UL << 34UL) /* Safari/Tomatillo */ +#define SCHIZO_PCICTRL_PCISPD (1UL << 33UL) /* Safari */ +#define SCHIZO_PCICTRL_MRM_PREF (1UL << 28UL) /* Tomatillo */ +#define SCHIZO_PCICTRL_RDO_PREF (1UL << 27UL) /* Tomatillo */ +#define SCHIZO_PCICTRL_RDL_PREF (1UL << 26UL) /* Tomatillo */ +#define SCHIZO_PCICTRL_PTO (3UL << 24UL) /* Safari/Tomatillo */ +#define SCHIZO_PCICTRL_PTO_SHIFT 24UL +#define SCHIZO_PCICTRL_TRWSW (7UL << 21UL) /* Tomatillo */ +#define SCHIZO_PCICTRL_F_TGT_A (1UL << 20UL) /* Tomatillo */ +#define SCHIZO_PCICTRL_S_DTO_INT (1UL << 19UL) /* Safari */ +#define SCHIZO_PCICTRL_F_TGT_RT (1UL << 19UL) /* Tomatillo */ +#define SCHIZO_PCICTRL_SBH_INT (1UL << 18UL) /* Safari */ +#define SCHIZO_PCICTRL_T_DTO_INT (1UL << 18UL) /* Tomatillo */ +#define SCHIZO_PCICTRL_EEN (1UL << 17UL) /* Safari/Tomatillo */ +#define SCHIZO_PCICTRL_PARK (1UL << 16UL) /* Safari/Tomatillo */ +#define SCHIZO_PCICTRL_PCIRST (1UL << 8UL) /* Safari */ +#define SCHIZO_PCICTRL_ARB_S (0x3fUL << 0UL) /* Safari */ +#define SCHIZO_PCICTRL_ARB_T (0xffUL << 0UL) /* Tomatillo */ + +static void schizo_pcierr_intr_other(struct pci_pbm_info *pbm) +{ + unsigned long csr_reg, csr, csr_error_bits; + u16 stat; + + csr_reg = pbm->pbm_regs + SCHIZO_PCI_CTRL; + csr = schizo_read(csr_reg); + csr_error_bits = + csr & (SCHIZO_PCICTRL_BUS_UNUS | + SCHIZO_PCICTRL_TTO_ERR | + SCHIZO_PCICTRL_RTRY_ERR | + SCHIZO_PCICTRL_DTO_ERR | + SCHIZO_PCICTRL_SBH_ERR | + SCHIZO_PCICTRL_SERR); + if (csr_error_bits) { + /* Clear the errors. */ + schizo_write(csr_reg, csr); + + /* Log 'em. */ + if (csr_error_bits & SCHIZO_PCICTRL_BUS_UNUS) + printk("%s: Bus unusable error asserted.\n", + pbm->name); + if (csr_error_bits & SCHIZO_PCICTRL_TTO_ERR) + printk("%s: PCI TRDY# timeout error asserted.\n", + pbm->name); + if (csr_error_bits & SCHIZO_PCICTRL_RTRY_ERR) + printk("%s: PCI excessive retry error asserted.\n", + pbm->name); + if (csr_error_bits & SCHIZO_PCICTRL_DTO_ERR) + printk("%s: PCI discard timeout error asserted.\n", + pbm->name); + if (csr_error_bits & SCHIZO_PCICTRL_SBH_ERR) + printk("%s: PCI streaming byte hole error asserted.\n", + pbm->name); + if (csr_error_bits & SCHIZO_PCICTRL_SERR) + printk("%s: PCI SERR signal asserted.\n", + pbm->name); + } + pci_read_config_word(pbm->pci_bus->self, PCI_STATUS, &stat); + if (stat & (PCI_STATUS_PARITY | + PCI_STATUS_SIG_TARGET_ABORT | + PCI_STATUS_REC_TARGET_ABORT | + PCI_STATUS_REC_MASTER_ABORT | + PCI_STATUS_SIG_SYSTEM_ERROR)) { + printk("%s: PCI bus error, PCI_STATUS[%04x]\n", + pbm->name, stat); + pci_write_config_word(pbm->pci_bus->self, PCI_STATUS, 0xffff); + } +} static void schizo_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs) { @@ -899,16 +988,8 @@ unsigned long afsr_reg, afar_reg, base; unsigned long afsr, afar, error_bits; int reported; - char pbm_name; - base = p->controller_regs; - if (pbm == &pbm->parent->pbm_A) { - base += SCHIZO_PBM_A_REGS_OFF; - pbm_name = 'A'; - } else { - base += SCHIZO_PBM_B_REGS_OFF; - pbm_name = 'B'; - } + base = pbm->pbm_regs; afsr_reg = base + SCHIZO_PCI_AFSR; afar_reg = base + SCHIZO_PCI_AFAR; @@ -926,12 +1007,12 @@ SCHIZO_PCIAFSR_SRTRY | SCHIZO_PCIAFSR_SPERR | SCHIZO_PCIAFSR_STTO | SCHIZO_PCIAFSR_SUNUS); if (!error_bits) - return; + return schizo_pcierr_intr_other(pbm); schizo_write(afsr_reg, error_bits); /* Log the error. */ - printk("SCHIZO%d: PBM-%c PCI Error, primary error type[%s]\n", - p->index, pbm_name, + printk("%s: PCI Error, primary error type[%s]\n", + pbm->name, (((error_bits & SCHIZO_PCIAFSR_PMA) ? "Master Abort" : ((error_bits & SCHIZO_PCIAFSR_PTA) ? @@ -944,8 +1025,8 @@ "Timeout" : ((error_bits & SCHIZO_PCIAFSR_PUNUS) ? "Bus Unusable" : "???")))))))); - printk("SCHIZO%d: PBM-%c bytemask[%04lx] was_block(%d) space(%s)\n", - p->index, pbm_name, + printk("%s: bytemask[%04lx] was_block(%d) space(%s)\n", + pbm->name, (afsr & SCHIZO_PCIAFSR_BMSK) >> 32UL, (afsr & SCHIZO_PCIAFSR_BLK) ? 1 : 0, ((afsr & SCHIZO_PCIAFSR_CFG) ? @@ -954,10 +1035,10 @@ "Memory" : ((afsr & SCHIZO_PCIAFSR_IO) ? "I/O" : "???")))); - printk("SCHIZO%d: PBM-%c PCI AFAR [%016lx]\n", - p->index, pbm_name, afar); - printk("SCHIZO%d: PBM-%c PCI Secondary errors [", - p->index, pbm_name); + printk("%s: PCI AFAR [%016lx]\n", + pbm->name, afar); + printk("%s: PCI Secondary errors [", + pbm->name); reported = 0; if (afsr & SCHIZO_PCIAFSR_SMA) { reported++; @@ -1020,24 +1101,37 @@ #define SAFARI_ERRLOG_ERROUT 0x8000000000000000UL -#define SAFARI_ERROR_BADCMD 0x4000000000000000UL -#define SAFARI_ERROR_SSMDIS 0x2000000000000000UL -#define SAFARI_ERROR_BADMA 0x1000000000000000UL -#define SAFARI_ERROR_BADMB 0x0800000000000000UL -#define SAFARI_ERROR_BADMC 0x0400000000000000UL -#define SAFARI_ERROR_CPU1PS 0x0000000000002000UL -#define SAFARI_ERROR_CPU1PB 0x0000000000001000UL -#define SAFARI_ERROR_CPU0PS 0x0000000000000800UL -#define SAFARI_ERROR_CPU0PB 0x0000000000000400UL -#define SAFARI_ERROR_CIQTO 0x0000000000000200UL -#define SAFARI_ERROR_LPQTO 0x0000000000000100UL -#define SAFARI_ERROR_SFPQTO 0x0000000000000080UL -#define SAFARI_ERROR_UFPQTO 0x0000000000000040UL -#define SAFARI_ERROR_APERR 0x0000000000000020UL -#define SAFARI_ERROR_UNMAP 0x0000000000000010UL -#define SAFARI_ERROR_BUSERR 0x0000000000000004UL -#define SAFARI_ERROR_TIMEOUT 0x0000000000000002UL -#define SAFARI_ERROR_ILL 0x0000000000000001UL +#define BUS_ERROR_BADCMD 0x4000000000000000UL /* Schizo/Tomatillo */ +#define BUS_ERROR_SSMDIS 0x2000000000000000UL /* Safari */ +#define BUS_ERROR_BADMA 0x1000000000000000UL /* Safari */ +#define BUS_ERROR_BADMB 0x0800000000000000UL /* Safari */ +#define BUS_ERROR_BADMC 0x0400000000000000UL /* Safari */ +#define BUS_ERROR_SNOOP_GR 0x0000000000200000UL /* Tomatillo */ +#define BUS_ERROR_SNOOP_PCI 0x0000000000100000UL /* Tomatillo */ +#define BUS_ERROR_SNOOP_RD 0x0000000000080000UL /* Tomatillo */ +#define BUS_ERROR_SNOOP_RDS 0x0000000000020000UL /* Tomatillo */ +#define BUS_ERROR_SNOOP_RDSA 0x0000000000010000UL /* Tomatillo */ +#define BUS_ERROR_SNOOP_OWN 0x0000000000008000UL /* Tomatillo */ +#define BUS_ERROR_SNOOP_RDO 0x0000000000004000UL /* Tomatillo */ +#define BUS_ERROR_CPU1PS 0x0000000000002000UL /* Safari */ +#define BUS_ERROR_WDATA_PERR 0x0000000000002000UL /* Tomatillo */ +#define BUS_ERROR_CPU1PB 0x0000000000001000UL /* Safari */ +#define BUS_ERROR_CTRL_PERR 0x0000000000001000UL /* Tomatillo */ +#define BUS_ERROR_CPU0PS 0x0000000000000800UL /* Safari */ +#define BUS_ERROR_SNOOP_ERR 0x0000000000000800UL /* Tomatillo */ +#define BUS_ERROR_CPU0PB 0x0000000000000400UL /* Safari */ +#define BUS_ERROR_JBUS_ILL_B 0x0000000000000400UL /* Tomatillo */ +#define BUS_ERROR_CIQTO 0x0000000000000200UL /* Safari */ +#define BUS_ERROR_LPQTO 0x0000000000000100UL /* Safari */ +#define BUS_ERROR_JBUS_ILL_C 0x0000000000000100UL /* Tomatillo */ +#define BUS_ERROR_SFPQTO 0x0000000000000080UL /* Safari */ +#define BUS_ERROR_UFPQTO 0x0000000000000040UL /* Safari */ +#define BUS_ERROR_RD_PERR 0x0000000000000040UL /* Tomatillo */ +#define BUS_ERROR_APERR 0x0000000000000020UL /* Safari/Tomatillo */ +#define BUS_ERROR_UNMAP 0x0000000000000010UL /* Safari/Tomatillo */ +#define BUS_ERROR_BUSERR 0x0000000000000004UL /* Safari/Tomatillo */ +#define BUS_ERROR_TIMEOUT 0x0000000000000002UL /* Safari/Tomatillo */ +#define BUS_ERROR_ILL 0x0000000000000001UL /* Safari */ /* We only expect UNMAP errors here. The rest of the Safari errors * are marked fatal and thus cause a system reset. @@ -1047,19 +1141,19 @@ struct pci_controller_info *p = dev_id; u64 errlog; - errlog = schizo_read(p->controller_regs + SCHIZO_SAFARI_ERRLOG); - schizo_write(p->controller_regs + SCHIZO_SAFARI_ERRLOG, + errlog = schizo_read(p->pbm_B.controller_regs + SCHIZO_SAFARI_ERRLOG); + schizo_write(p->pbm_B.controller_regs + SCHIZO_SAFARI_ERRLOG, errlog & ~(SAFARI_ERRLOG_ERROUT)); - if (!(errlog & SAFARI_ERROR_UNMAP)) { - printk("SCHIZO%d: Unexpected Safari error interrupt, errlog[%016lx]\n", + if (!(errlog & BUS_ERROR_UNMAP)) { + printk("PCI%d: Unexpected Safari/JBUS error interrupt, errlog[%016lx]\n", p->index, errlog); schizo_clear_other_err_intr(irq); return; } - printk("SCHIZO%d: Safari interrupt, UNMAPPED error, interrogating IOMMUs.\n", + printk("PCI%d: Safari/JBUS interrupt, UNMAPPED error, interrogating IOMMUs.\n", p->index); schizo_check_iommu_error(p, SAFARI_ERR); @@ -1083,131 +1177,279 @@ #define SCHIZO_PCIERR_B_INO 0x33 /* PBM B PCI bus error */ #define SCHIZO_SERR_INO 0x34 /* Safari interface error */ -#define SCHIZO_PCIA_CTRL (SCHIZO_PBM_A_REGS_OFF + 0x2000UL) -#define SCHIZO_PCIB_CTRL (SCHIZO_PBM_B_REGS_OFF + 0x2000UL) -#define SCHIZO_PCICTRL_BUS_UNUS (1UL << 63UL) -#define SCHIZO_PCICTRL_ESLCK (1UL << 51UL) -#define SCHIZO_PCICTRL_ERRSLOT (7UL << 48UL) -#define SCHIZO_PCICTRL_TTO_ERR (1UL << 38UL) -#define SCHIZO_PCICTRL_RTRY_ERR (1UL << 37UL) -#define SCHIZO_PCICTRL_DTO_ERR (1UL << 36UL) -#define SCHIZO_PCICTRL_SBH_ERR (1UL << 35UL) -#define SCHIZO_PCICTRL_SERR (1UL << 34UL) -#define SCHIZO_PCICTRL_PCISPD (1UL << 33UL) -#define SCHIZO_PCICTRL_PTO (3UL << 24UL) -#define SCHIZO_PCICTRL_DTO_INT (1UL << 19UL) -#define SCHIZO_PCICTRL_SBH_INT (1UL << 18UL) -#define SCHIZO_PCICTRL_EEN (1UL << 17UL) -#define SCHIZO_PCICTRL_PARK (1UL << 16UL) -#define SCHIZO_PCICTRL_PCIRST (1UL << 8UL) -#define SCHIZO_PCICTRL_ARB (0x3fUL << 0UL) +struct pci_pbm_info *pbm_for_ino(struct pci_controller_info *p, u32 ino) +{ + ino &= IMAP_INO; + if (p->pbm_A.ino_bitmap & (1UL << ino)) + return &p->pbm_A; + if (p->pbm_B.ino_bitmap & (1UL << ino)) + return &p->pbm_B; + prom_printf("TOMATILLO%d: No entry in ino bitmap for %d\n", + p->index, ino); + prom_halt(); + /* NOTREACHED */ + return NULL; +} + +/* How the Tomatillo IRQs are routed around is pure guesswork here. + * + * All the Tomatillo devices I see in prtconf dumps seem to have only + * a single PCI bus unit attached to it. It would seem they are seperate + * devices because their PortID (ie. JBUS ID) values are all different + * and thus the registers are mapped to totally different locations. + * + * However, two Tomatillo's look "similar" in that the only difference + * in their PortID is the lowest bit. + * + * So if we were to ignore this lower bit, it certainly looks like two + * PCI bus units of the same Tomatillo. I still have not really + * figured this out... + */ +static void __init tomatillo_register_error_handlers(struct pci_controller_info *p) +{ + struct pci_pbm_info *pbm; + unsigned int irq; + struct ino_bucket *bucket; + u64 tmp, err_mask, err_no_mask; + + /* Build IRQs and register handlers. */ + pbm = pbm_for_ino(p, SCHIZO_UE_INO); + irq = schizo_irq_build(pbm, NULL, (pbm->portid << 6) | SCHIZO_UE_INO); + if (request_irq(irq, schizo_ue_intr, + SA_SHIRQ, "TOMATILLO UE", p) < 0) { + prom_printf("%s: Cannot register UE interrupt.\n", + pbm->name); + prom_halt(); + } + bucket = __bucket(irq); + tmp = readl(bucket->imap); + upa_writel(tmp, (pbm->pbm_regs + + schizo_imap_offset(SCHIZO_UE_INO) + 4)); + + pbm = pbm_for_ino(p, SCHIZO_CE_INO); + irq = schizo_irq_build(pbm, NULL, (pbm->portid << 6) | SCHIZO_CE_INO); + if (request_irq(irq, schizo_ce_intr, + SA_SHIRQ, "TOMATILLO CE", p) < 0) { + prom_printf("%s: Cannot register CE interrupt.\n", + pbm->name); + prom_halt(); + } + bucket = __bucket(irq); + tmp = upa_readl(bucket->imap); + upa_writel(tmp, (pbm->pbm_regs + + schizo_imap_offset(SCHIZO_CE_INO) + 4)); + + pbm = pbm_for_ino(p, SCHIZO_PCIERR_A_INO); + irq = schizo_irq_build(pbm, NULL, ((pbm->portid << 6) | + SCHIZO_PCIERR_A_INO)); + if (request_irq(irq, schizo_pcierr_intr, + SA_SHIRQ, "TOMATILLO PCIERR", pbm) < 0) { + prom_printf("%s: Cannot register PBM A PciERR interrupt.\n", + pbm->name); + prom_halt(); + } + bucket = __bucket(irq); + tmp = upa_readl(bucket->imap); + upa_writel(tmp, (pbm->pbm_regs + + schizo_imap_offset(SCHIZO_PCIERR_A_INO) + 4)); + + pbm = pbm_for_ino(p, SCHIZO_PCIERR_B_INO); + irq = schizo_irq_build(pbm, NULL, ((pbm->portid << 6) | + SCHIZO_PCIERR_B_INO)); + if (request_irq(irq, schizo_pcierr_intr, + SA_SHIRQ, "TOMATILLO PCIERR", pbm) < 0) { + prom_printf("%s: Cannot register PBM B PciERR interrupt.\n", + pbm->name); + prom_halt(); + } + bucket = __bucket(irq); + tmp = upa_readl(bucket->imap); + upa_writel(tmp, (pbm->pbm_regs + + schizo_imap_offset(SCHIZO_PCIERR_B_INO) + 4)); + + pbm = pbm_for_ino(p, SCHIZO_SERR_INO); + irq = schizo_irq_build(pbm, NULL, (pbm->portid << 6) | SCHIZO_SERR_INO); + if (request_irq(irq, schizo_safarierr_intr, + SA_SHIRQ, "TOMATILLO SERR", p) < 0) { + prom_printf("%s: Cannot register SafariERR interrupt.\n", + pbm->name); + prom_halt(); + } + bucket = __bucket(irq); + tmp = upa_readl(bucket->imap); + upa_writel(tmp, (pbm->pbm_regs + + schizo_imap_offset(SCHIZO_SERR_INO) + 4)); + + /* Enable UE and CE interrupts for controller. */ + schizo_write(p->pbm_A.controller_regs + SCHIZO_ECC_CTRL, + (SCHIZO_ECCCTRL_EE | + SCHIZO_ECCCTRL_UE | + SCHIZO_ECCCTRL_CE)); + + schizo_write(p->pbm_B.controller_regs + SCHIZO_ECC_CTRL, + (SCHIZO_ECCCTRL_EE | + SCHIZO_ECCCTRL_UE | + SCHIZO_ECCCTRL_CE)); + + /* Enable PCI Error interrupts and clear error + * bits. + */ + err_mask = (SCHIZO_PCICTRL_BUS_UNUS | + SCHIZO_PCICTRL_TTO_ERR | + SCHIZO_PCICTRL_RTRY_ERR | + SCHIZO_PCICTRL_SERR | + SCHIZO_PCICTRL_EEN); + + err_no_mask = SCHIZO_PCICTRL_DTO_ERR; + + tmp = schizo_read(p->pbm_A.pbm_regs + SCHIZO_PCI_CTRL); + tmp |= err_mask; + tmp &= ~err_no_mask; + schizo_write(p->pbm_A.pbm_regs + SCHIZO_PCI_CTRL, tmp); + + tmp = schizo_read(p->pbm_B.pbm_regs + SCHIZO_PCI_CTRL); + tmp |= err_mask; + tmp &= ~err_no_mask; + schizo_write(p->pbm_B.pbm_regs + SCHIZO_PCI_CTRL, tmp); + + err_mask = (SCHIZO_PCIAFSR_PMA | SCHIZO_PCIAFSR_PTA | + SCHIZO_PCIAFSR_PRTRY | SCHIZO_PCIAFSR_PPERR | + SCHIZO_PCIAFSR_PTTO | + SCHIZO_PCIAFSR_SMA | SCHIZO_PCIAFSR_STA | + SCHIZO_PCIAFSR_SRTRY | SCHIZO_PCIAFSR_SPERR | + SCHIZO_PCIAFSR_STTO); + + schizo_write(p->pbm_A.pbm_regs + SCHIZO_PCI_AFSR, err_mask); + schizo_write(p->pbm_B.pbm_regs + SCHIZO_PCI_AFSR, err_mask); + + err_mask = (BUS_ERROR_BADCMD | BUS_ERROR_SNOOP_GR | + BUS_ERROR_SNOOP_PCI | BUS_ERROR_SNOOP_RD | + BUS_ERROR_SNOOP_RDS | BUS_ERROR_SNOOP_RDSA | + BUS_ERROR_SNOOP_OWN | BUS_ERROR_SNOOP_RDO | + BUS_ERROR_WDATA_PERR | BUS_ERROR_CTRL_PERR | + BUS_ERROR_SNOOP_ERR | BUS_ERROR_JBUS_ILL_B | + BUS_ERROR_JBUS_ILL_C | BUS_ERROR_RD_PERR | + BUS_ERROR_APERR | BUS_ERROR_UNMAP | + BUS_ERROR_BUSERR | BUS_ERROR_TIMEOUT); + + schizo_write(p->pbm_A.controller_regs + SCHIZO_SAFARI_ERRCTRL, + (SCHIZO_SAFERRCTRL_EN | err_mask)); + schizo_write(p->pbm_B.controller_regs + SCHIZO_SAFARI_ERRCTRL, + (SCHIZO_SAFERRCTRL_EN | err_mask)); + + schizo_write(p->pbm_A.controller_regs + SCHIZO_SAFARI_IRQCTRL, + (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); + schizo_write(p->pbm_B.controller_regs + SCHIZO_SAFARI_IRQCTRL, + (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); +} static void __init schizo_register_error_handlers(struct pci_controller_info *p) { - struct pci_pbm_info *pbm_a = &p->pbm_A; - struct pci_pbm_info *pbm_b = &p->pbm_B; - unsigned long base = p->controller_regs; - unsigned int irq, portid = p->portid; + struct pci_pbm_info *pbm; + unsigned int irq; struct ino_bucket *bucket; - u64 tmp; + u64 tmp, err_mask, err_no_mask; /* Build IRQs and register handlers. */ - irq = schizo_irq_build(pbm_b, NULL, (portid << 6) | SCHIZO_UE_INO); + pbm = pbm_for_ino(p, SCHIZO_UE_INO); + irq = schizo_irq_build(pbm, NULL, (pbm->portid << 6) | SCHIZO_UE_INO); if (request_irq(irq, schizo_ue_intr, SA_SHIRQ, "SCHIZO UE", p) < 0) { - prom_printf("SCHIZO%d: Cannot register UE interrupt.\n", - p->index); + prom_printf("%s: Cannot register UE interrupt.\n", + pbm->name); prom_halt(); } bucket = __bucket(irq); tmp = readl(bucket->imap); - upa_writel(tmp, (base + SCHIZO_PBM_B_REGS_OFF + schizo_imap_offset(SCHIZO_UE_INO) + 4)); + upa_writel(tmp, (pbm->pbm_regs + schizo_imap_offset(SCHIZO_UE_INO) + 4)); - irq = schizo_irq_build(pbm_b, NULL, (portid << 6) | SCHIZO_CE_INO); + pbm = pbm_for_ino(p, SCHIZO_CE_INO); + irq = schizo_irq_build(pbm, NULL, (pbm->portid << 6) | SCHIZO_CE_INO); if (request_irq(irq, schizo_ce_intr, SA_SHIRQ, "SCHIZO CE", p) < 0) { - prom_printf("SCHIZO%d: Cannot register CE interrupt.\n", - p->index); + prom_printf("%s: Cannot register CE interrupt.\n", + pbm->name); prom_halt(); } bucket = __bucket(irq); tmp = upa_readl(bucket->imap); - upa_writel(tmp, (base + SCHIZO_PBM_B_REGS_OFF + schizo_imap_offset(SCHIZO_CE_INO) + 4)); + upa_writel(tmp, (pbm->pbm_regs + schizo_imap_offset(SCHIZO_CE_INO) + 4)); - irq = schizo_irq_build(pbm_a, NULL, (portid << 6) | SCHIZO_PCIERR_A_INO); + pbm = pbm_for_ino(p, SCHIZO_PCIERR_A_INO); + irq = schizo_irq_build(pbm, NULL, (pbm->portid << 6) | SCHIZO_PCIERR_A_INO); if (request_irq(irq, schizo_pcierr_intr, - SA_SHIRQ, "SCHIZO PCIERR", pbm_a) < 0) { - prom_printf("SCHIZO%d(PBMA): Cannot register PciERR interrupt.\n", - p->index); + SA_SHIRQ, "SCHIZO PCIERR", pbm) < 0) { + prom_printf("%s: Cannot register PBM A PciERR interrupt.\n", + pbm->name); prom_halt(); } bucket = __bucket(irq); tmp = upa_readl(bucket->imap); - upa_writel(tmp, (base + SCHIZO_PBM_A_REGS_OFF + schizo_imap_offset(SCHIZO_PCIERR_A_INO) + 4)); + upa_writel(tmp, (pbm->pbm_regs + schizo_imap_offset(SCHIZO_PCIERR_A_INO) + 4)); - irq = schizo_irq_build(pbm_b, NULL, (portid << 6) | SCHIZO_PCIERR_B_INO); + pbm = pbm_for_ino(p, SCHIZO_PCIERR_B_INO); + irq = schizo_irq_build(pbm, NULL, (pbm->portid << 6) | SCHIZO_PCIERR_B_INO); if (request_irq(irq, schizo_pcierr_intr, - SA_SHIRQ, "SCHIZO PCIERR", pbm_b) < 0) { - prom_printf("SCHIZO%d(PBMB): Cannot register PciERR interrupt.\n", - p->index); + SA_SHIRQ, "SCHIZO PCIERR", &p->pbm_B) < 0) { + prom_printf("%s: Cannot register PBM B PciERR interrupt.\n", + pbm->name); prom_halt(); } bucket = __bucket(irq); tmp = upa_readl(bucket->imap); - upa_writel(tmp, (base + SCHIZO_PBM_B_REGS_OFF + schizo_imap_offset(SCHIZO_PCIERR_B_INO) + 4)); + upa_writel(tmp, (pbm->pbm_regs + schizo_imap_offset(SCHIZO_PCIERR_B_INO) + 4)); - irq = schizo_irq_build(pbm_b, NULL, (portid << 6) | SCHIZO_SERR_INO); + pbm = pbm_for_ino(p, SCHIZO_SERR_INO); + irq = schizo_irq_build(pbm, NULL, (pbm->portid << 6) | SCHIZO_SERR_INO); if (request_irq(irq, schizo_safarierr_intr, SA_SHIRQ, "SCHIZO SERR", p) < 0) { - prom_printf("SCHIZO%d(PBMB): Cannot register SafariERR interrupt.\n", - p->index); + prom_printf("%s: Cannot register SafariERR interrupt.\n", + pbm->name); prom_halt(); } bucket = __bucket(irq); tmp = upa_readl(bucket->imap); - upa_writel(tmp, (base + SCHIZO_PBM_B_REGS_OFF + schizo_imap_offset(SCHIZO_SERR_INO) + 4)); + upa_writel(tmp, (pbm->pbm_regs + schizo_imap_offset(SCHIZO_SERR_INO) + 4)); /* Enable UE and CE interrupts for controller. */ - schizo_write(base + SCHIZO_ECC_CTRL, + schizo_write(p->pbm_A.controller_regs + SCHIZO_ECC_CTRL, (SCHIZO_ECCCTRL_EE | SCHIZO_ECCCTRL_UE | SCHIZO_ECCCTRL_CE)); + err_mask = (SCHIZO_PCICTRL_BUS_UNUS | + SCHIZO_PCICTRL_ESLCK | + SCHIZO_PCICTRL_TTO_ERR | + SCHIZO_PCICTRL_RTRY_ERR | + SCHIZO_PCICTRL_SBH_ERR | + SCHIZO_PCICTRL_SERR | + SCHIZO_PCICTRL_SBH_INT | + SCHIZO_PCICTRL_EEN); + + err_no_mask = SCHIZO_PCICTRL_DTO_ERR; + /* Enable PCI Error interrupts and clear error * bits for each PBM. */ - tmp = schizo_read(base + SCHIZO_PCIA_CTRL); - tmp |= (SCHIZO_PCICTRL_BUS_UNUS | - SCHIZO_PCICTRL_ESLCK | - SCHIZO_PCICTRL_TTO_ERR | - SCHIZO_PCICTRL_RTRY_ERR | - SCHIZO_PCICTRL_DTO_ERR | - SCHIZO_PCICTRL_SBH_ERR | - SCHIZO_PCICTRL_SERR | - SCHIZO_PCICTRL_SBH_INT | - SCHIZO_PCICTRL_EEN); - schizo_write(base + SCHIZO_PCIA_CTRL, tmp); - - tmp = schizo_read(base + SCHIZO_PCIB_CTRL); - tmp |= (SCHIZO_PCICTRL_BUS_UNUS | - SCHIZO_PCICTRL_ESLCK | - SCHIZO_PCICTRL_TTO_ERR | - SCHIZO_PCICTRL_RTRY_ERR | - SCHIZO_PCICTRL_DTO_ERR | - SCHIZO_PCICTRL_SBH_ERR | - SCHIZO_PCICTRL_SERR | - SCHIZO_PCICTRL_SBH_INT | - SCHIZO_PCICTRL_EEN); - schizo_write(base + SCHIZO_PCIB_CTRL, tmp); + tmp = schizo_read(p->pbm_A.pbm_regs + SCHIZO_PCI_CTRL); + tmp |= err_mask; + tmp &= ~err_no_mask; + schizo_write(p->pbm_A.pbm_regs + SCHIZO_PCI_CTRL, tmp); - schizo_write(base + SCHIZO_PBM_A_REGS_OFF + SCHIZO_PCI_AFSR, + schizo_write(p->pbm_A.pbm_regs + SCHIZO_PCI_AFSR, (SCHIZO_PCIAFSR_PMA | SCHIZO_PCIAFSR_PTA | SCHIZO_PCIAFSR_PRTRY | SCHIZO_PCIAFSR_PPERR | SCHIZO_PCIAFSR_PTTO | SCHIZO_PCIAFSR_PUNUS | SCHIZO_PCIAFSR_SMA | SCHIZO_PCIAFSR_STA | SCHIZO_PCIAFSR_SRTRY | SCHIZO_PCIAFSR_SPERR | SCHIZO_PCIAFSR_STTO | SCHIZO_PCIAFSR_SUNUS)); - schizo_write(base + SCHIZO_PBM_B_REGS_OFF + SCHIZO_PCI_AFSR, + + tmp = schizo_read(p->pbm_B.pbm_regs + SCHIZO_PCI_CTRL); + tmp |= err_mask; + tmp &= ~err_no_mask; + schizo_write(p->pbm_B.pbm_regs + SCHIZO_PCI_CTRL, tmp); + + schizo_write(p->pbm_B.pbm_regs + SCHIZO_PCI_AFSR, (SCHIZO_PCIAFSR_PMA | SCHIZO_PCIAFSR_PTA | SCHIZO_PCIAFSR_PRTRY | SCHIZO_PCIAFSR_PPERR | SCHIZO_PCIAFSR_PTTO | SCHIZO_PCIAFSR_PUNUS | @@ -1215,9 +1457,19 @@ SCHIZO_PCIAFSR_SRTRY | SCHIZO_PCIAFSR_SPERR | SCHIZO_PCIAFSR_STTO | SCHIZO_PCIAFSR_SUNUS)); - /* Make all Safari error conditions fatal except unmapped errors - * which we make generate interrupts. + /* Make all Safari error conditions fatal except unmapped + * errors which we make generate interrupts. */ + err_mask = (BUS_ERROR_BADCMD | BUS_ERROR_SSMDIS | + BUS_ERROR_BADMA | BUS_ERROR_BADMB | + BUS_ERROR_BADMC | + BUS_ERROR_CPU1PS | BUS_ERROR_CPU1PB | + BUS_ERROR_CPU0PS | BUS_ERROR_CPU0PB | + BUS_ERROR_CIQTO | + BUS_ERROR_LPQTO | BUS_ERROR_SFPQTO | + BUS_ERROR_UFPQTO | BUS_ERROR_APERR | + BUS_ERROR_BUSERR | BUS_ERROR_TIMEOUT | + BUS_ERROR_ILL); #if 1 /* XXX Something wrong with some Excalibur systems * XXX Sun is shipping. The behavior on a 2-cpu @@ -1226,53 +1478,26 @@ * XXX their error status bits are cleared. Just * XXX ignore them for now. -DaveM */ - schizo_write(base + SCHIZO_SAFARI_ERRCTRL, - (SCHIZO_SAFERRCTRL_EN | - (SAFARI_ERROR_BADCMD | SAFARI_ERROR_SSMDIS | - SAFARI_ERROR_BADMA | SAFARI_ERROR_BADMB | - SAFARI_ERROR_BADMC | - SAFARI_ERROR_CIQTO | - SAFARI_ERROR_LPQTO | SAFARI_ERROR_SFPQTO | - SAFARI_ERROR_UFPQTO | SAFARI_ERROR_APERR | - SAFARI_ERROR_BUSERR | SAFARI_ERROR_TIMEOUT | - SAFARI_ERROR_ILL))); -#else - schizo_write(base + SCHIZO_SAFARI_ERRCTRL, - (SCHIZO_SAFERRCTRL_EN | - (SAFARI_ERROR_BADCMD | SAFARI_ERROR_SSMDIS | - SAFARI_ERROR_BADMA | SAFARI_ERROR_BADMB | - SAFARI_ERROR_BADMC | - SAFARI_ERROR_CPU1PS | SAFARI_ERROR_CPU1PB | - SAFARI_ERROR_CPU0PS | SAFARI_ERROR_CPU0PB | - SAFARI_ERROR_CIQTO | - SAFARI_ERROR_LPQTO | SAFARI_ERROR_SFPQTO | - SAFARI_ERROR_UFPQTO | SAFARI_ERROR_APERR | - SAFARI_ERROR_BUSERR | SAFARI_ERROR_TIMEOUT | - SAFARI_ERROR_ILL))); + err_mask &= ~(BUS_ERROR_CPU1PS | BUS_ERROR_CPU1PB | + BUS_ERROR_CPU0PS | BUS_ERROR_CPU0PB); #endif - schizo_write(base + SCHIZO_SAFARI_IRQCTRL, - (SCHIZO_SAFIRQCTRL_EN | (SAFARI_ERROR_UNMAP))); + schizo_write(p->pbm_A.controller_regs + SCHIZO_SAFARI_ERRCTRL, + (SCHIZO_SAFERRCTRL_EN | err_mask)); + + schizo_write(p->pbm_A.controller_regs + SCHIZO_SAFARI_IRQCTRL, + (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); } /* We have to do the config space accesses by hand, thus... */ -#define PBM_BRIDGE_BUS 0x40 -#define PBM_BRIDGE_SUBORDINATE 0x41 static void __init pbm_renumber(struct pci_pbm_info *pbm, u8 orig_busno) { - u8 *addr, busno; + u8 busno; int nbus; busno = pci_highest_busnum; nbus = pbm->pci_last_busno - pbm->pci_first_busno; - addr = schizo_pci_config_mkaddr(pbm, orig_busno, - 0, PBM_BRIDGE_BUS); - pci_config_write8(addr, busno); - addr = schizo_pci_config_mkaddr(pbm, busno, - 0, PBM_BRIDGE_SUBORDINATE); - pci_config_write8(addr, busno + nbus); - pbm->pci_first_busno = busno; pbm->pci_last_busno = busno + nbus; pci_highest_busnum = busno + nbus + 1; @@ -1282,75 +1507,8 @@ } while (nbus--); } -/* We have to do the config space accesses by hand here since - * the pci_bus2pbm array is not ready yet. - */ -static void __init pbm_pci_bridge_renumber(struct pci_pbm_info *pbm, - u8 busno) -{ - u32 devfn, l, class; - u8 hdr_type; - int is_multi = 0; - - for(devfn = 0; devfn < 0xff; ++devfn) { - u32 *dwaddr; - u8 *baddr; - - if (PCI_FUNC(devfn) != 0 && is_multi == 0) - continue; - - /* Anything there? */ - dwaddr = schizo_pci_config_mkaddr(pbm, busno, devfn, PCI_VENDOR_ID); - l = 0xffffffff; - pci_config_read32(dwaddr, &l); - if (l == 0xffffffff || l == 0x00000000 || - l == 0x0000ffff || l == 0xffff0000) { - is_multi = 0; - continue; - } - - baddr = schizo_pci_config_mkaddr(pbm, busno, devfn, PCI_HEADER_TYPE); - pci_config_read8(baddr, &hdr_type); - if (PCI_FUNC(devfn) == 0) - is_multi = hdr_type & 0x80; - - dwaddr = schizo_pci_config_mkaddr(pbm, busno, devfn, PCI_CLASS_REVISION); - class = 0xffffffff; - pci_config_read32(dwaddr, &class); - if ((class >> 16) == PCI_CLASS_BRIDGE_PCI) { - u32 buses = 0xffffffff; - - dwaddr = schizo_pci_config_mkaddr(pbm, busno, devfn, - PCI_PRIMARY_BUS); - pci_config_read32(dwaddr, &buses); - pbm_pci_bridge_renumber(pbm, (buses >> 8) & 0xff); - buses &= 0xff000000; - pci_config_write32(dwaddr, buses); - } - } -} - static void __init pbm_bridge_reconfigure(struct pci_controller_info *p) { - struct pci_pbm_info *pbm; - u8 *addr; - - /* Clear out primary/secondary/subordinate bus numbers on - * all PCI-to-PCI bridges under each PBM. The generic bus - * probing will fix them up. - */ - pbm_pci_bridge_renumber(&p->pbm_B, p->pbm_B.pci_first_busno); - pbm_pci_bridge_renumber(&p->pbm_A, p->pbm_A.pci_first_busno); - - /* Move PBM A out of the way. */ - pbm = &p->pbm_A; - addr = schizo_pci_config_mkaddr(pbm, pbm->pci_first_busno, - 0, PBM_BRIDGE_BUS); - pci_config_write8(addr, 0xff); - addr = schizo_pci_config_mkaddr(pbm, 0xff, - 0, PBM_BRIDGE_SUBORDINATE); - pci_config_write8(addr, 0xff); - /* Now we can safely renumber both PBMs. */ pbm_renumber(&p->pbm_B, p->pbm_B.pci_first_busno); pbm_renumber(&p->pbm_A, 0xff); @@ -1379,7 +1537,7 @@ struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); if (!cookie) { - prom_printf("SCHIZO: Critical allocation failure.\n"); + prom_printf("%s: Critical allocation failure.\n", pbm->name); prom_halt(); } @@ -1401,20 +1559,42 @@ pci_setup_busmastering(pbm, pbm->pci_bus); } -static void __init schizo_scan_bus(struct pci_controller_info *p) +static void __init __schizo_scan_bus(struct pci_controller_info *p, + int chip_type) { + if (!p->pbm_B.prom_node || !p->pbm_A.prom_node) { + printk("PCI: Only one PCI bus module of controller found.\n"); + printk("PCI: Ignoring entire controller.\n"); + return; + } + pbm_bridge_reconfigure(p); pbm_config_busmastering(&p->pbm_B); - p->pbm_B.is_66mhz_capable = 0; + p->pbm_B.is_66mhz_capable = + prom_getbool(p->pbm_B.prom_node, "66mhz-capable"); pbm_config_busmastering(&p->pbm_A); - p->pbm_A.is_66mhz_capable = 1; + p->pbm_A.is_66mhz_capable = + prom_getbool(p->pbm_A.prom_node, "66mhz-capable"); pbm_scan_bus(p, &p->pbm_B); pbm_scan_bus(p, &p->pbm_A); /* After the PCI bus scan is complete, we can register * the error interrupt handlers. */ - schizo_register_error_handlers(p); + if (chip_type == PBM_CHIP_TYPE_TOMATILLO) + tomatillo_register_error_handlers(p); + else + schizo_register_error_handlers(p); +} + +static void __init schizo_scan_bus(struct pci_controller_info *p) +{ + __schizo_scan_bus(p, PBM_CHIP_TYPE_SCHIZO); +} + +static void __init tomatillo_scan_bus(struct pci_controller_info *p) +{ + __schizo_scan_bus(p, PBM_CHIP_TYPE_TOMATILLO); } static void __init schizo_base_address_update(struct pci_dev *pdev, int resource) @@ -1470,68 +1650,72 @@ res->end += root->start; } -/* Interrogate Safari match/mask registers to figure out where - * PCI MEM, I/O, and Config space are for this PCI bus module. +/* Use ranges property to determine where PCI MEM, I/O, and Config + * space are for this PCI bus module. */ +static void schizo_determine_mem_io_space(struct pci_pbm_info *pbm) +{ + int i, saw_cfg, saw_mem, saw_io; -#define SCHIZO_PCI_A_MEM_MATCH 0x00040UL -#define SCHIZO_PCI_A_MEM_MASK 0x00048UL -#define SCHIZO_PCI_A_IO_MATCH 0x00050UL -#define SCHIZO_PCI_A_IO_MASK 0x00058UL -#define SCHIZO_PCI_B_MEM_MATCH 0x00060UL -#define SCHIZO_PCI_B_MEM_MASK 0x00068UL -#define SCHIZO_PCI_B_IO_MATCH 0x00070UL -#define SCHIZO_PCI_B_IO_MASK 0x00078UL - -static void schizo_determine_mem_io_space(struct pci_pbm_info *pbm, - int is_pbm_a, unsigned long reg_base) -{ - u64 mem_match, mem_mask; - u64 io_match; - u64 a; - - if (is_pbm_a) { - mem_match = reg_base + SCHIZO_PCI_A_MEM_MATCH; - io_match = reg_base + SCHIZO_PCI_A_IO_MATCH; - } else { - mem_match = reg_base + SCHIZO_PCI_B_MEM_MATCH; - io_match = reg_base + SCHIZO_PCI_B_IO_MATCH; - } - mem_mask = mem_match + 0x8UL; + saw_cfg = saw_mem = saw_io = 0; + for (i = 0; i < pbm->num_pbm_ranges; i++) { + struct linux_prom_pci_ranges *pr = &pbm->pbm_ranges[i]; + unsigned long a; + int type; - a = schizo_read(mem_match) & ~0x8000000000000000UL; + type = (pr->child_phys_hi >> 24) & 0x3; + a = (((unsigned long)pr->parent_phys_hi << 32UL) | + ((unsigned long)pr->parent_phys_lo << 0UL)); - /* It should be 2GB in size but the decode is set for the full - * 4GB so we have to add the 2G by hand. - */ - pbm->mem_space.start = a; - pbm->mem_space.end = a + 0x80000000; - pbm->mem_space.flags = IORESOURCE_MEM; + switch (type) { + case 0: + /* PCI config space, 16MB */ + pbm->config_space = a; + saw_cfg = 1; + break; - /* This 32MB area is divided into two pieces. The first - * 16MB is Config space, the next 16MB is I/O space. - */ + case 1: + /* 16-bit IO space, 16MB */ + pbm->io_space.start = a; + pbm->io_space.end = a + ((16UL*1024UL*1024UL) - 1UL); + pbm->io_space.flags = IORESOURCE_IO; + saw_io = 1; + break; - a = schizo_read(io_match) & ~0x8000000000000000UL; - pbm->config_space = a; - printk("SCHIZO PBM%c: Local PCI config space at %016lx\n", - (is_pbm_a ? 'A' : 'B'), pbm->config_space); + case 2: + /* 32-bit MEM space, 2GB */ + pbm->mem_space.start = a; + pbm->mem_space.end = a + (0x80000000UL - 1UL); + pbm->mem_space.flags = IORESOURCE_MEM; + saw_mem = 1; + break; + + default: + break; + }; + } - a += (16UL * 1024UL * 1024UL); - pbm->io_space.start = a; - pbm->io_space.end = a + ((16UL * 1024UL * 1024UL) - 1UL); - pbm->io_space.flags = IORESOURCE_IO; + if (!saw_cfg || !saw_io || !saw_mem) { + prom_printf("%s: Fatal error, missing %s PBM range.\n", + pbm->name, + ((!saw_cfg ? + "CFG" : + (!saw_io ? + "IO" : "MEM")))); + prom_halt(); + } + + printk("%s: PCI CFG[%lx] IO[%lx] MEM[%lx]\n", + pbm->name, + pbm->config_space, + pbm->io_space.start, + pbm->mem_space.start); } static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, struct pci_pbm_info *pbm) { - char *name = pbm->name; - - sprintf(name, "SCHIZO%d PBM%c", - p->index, - (pbm == &p->pbm_A ? 'A' : 'B')); - pbm->io_space.name = pbm->mem_space.name = name; + pbm->io_space.name = pbm->mem_space.name = pbm->name; request_resource(&ioport_resource, &pbm->io_space); request_resource(&iomem_resource, &pbm->mem_space); @@ -1539,40 +1723,29 @@ &pbm->mem_space); } -#define SCHIZO_STRBUF_CONTROL_A (SCHIZO_PBM_A_REGS_OFF + 0x02800UL) -#define SCHIZO_STRBUF_FLUSH_A (SCHIZO_PBM_A_REGS_OFF + 0x02808UL) -#define SCHIZO_STRBUF_FSYNC_A (SCHIZO_PBM_A_REGS_OFF + 0x02810UL) -#define SCHIZO_STRBUF_CTXFLUSH_A (SCHIZO_PBM_A_REGS_OFF + 0x02818UL) -#define SCHIZO_STRBUF_CTXMATCH_A (SCHIZO_PBM_A_REGS_OFF + 0x10000UL) - -#define SCHIZO_STRBUF_CONTROL_B (SCHIZO_PBM_B_REGS_OFF + 0x02800UL) -#define SCHIZO_STRBUF_FLUSH_B (SCHIZO_PBM_B_REGS_OFF + 0x02808UL) -#define SCHIZO_STRBUF_FSYNC_B (SCHIZO_PBM_B_REGS_OFF + 0x02810UL) -#define SCHIZO_STRBUF_CTXFLUSH_B (SCHIZO_PBM_B_REGS_OFF + 0x02818UL) -#define SCHIZO_STRBUF_CTXMATCH_B (SCHIZO_PBM_B_REGS_OFF + 0x10000UL) - -static void schizo_pbm_strbuf_init(struct pci_controller_info *p, - struct pci_pbm_info *pbm, - int is_pbm_a) +#define SCHIZO_STRBUF_CONTROL (0x02800UL) +#define SCHIZO_STRBUF_FLUSH (0x02808UL) +#define SCHIZO_STRBUF_FSYNC (0x02810UL) +#define SCHIZO_STRBUF_CTXFLUSH (0x02818UL) +#define SCHIZO_STRBUF_CTXMATCH (0x10000UL) + +static void schizo_pbm_strbuf_init(struct pci_pbm_info *pbm) { - unsigned long base = p->controller_regs; + unsigned long base = pbm->pbm_regs; u64 control; - /* SCHIZO has context flushing. */ - if (is_pbm_a) { - pbm->stc.strbuf_control = base + SCHIZO_STRBUF_CONTROL_A; - pbm->stc.strbuf_pflush = base + SCHIZO_STRBUF_FLUSH_A; - pbm->stc.strbuf_fsync = base + SCHIZO_STRBUF_FSYNC_A; - pbm->stc.strbuf_ctxflush = base + SCHIZO_STRBUF_CTXFLUSH_A; - pbm->stc.strbuf_ctxmatch_base = base + SCHIZO_STRBUF_CTXMATCH_A; - } else { - pbm->stc.strbuf_control = base + SCHIZO_STRBUF_CONTROL_B; - pbm->stc.strbuf_pflush = base + SCHIZO_STRBUF_FLUSH_B; - pbm->stc.strbuf_fsync = base + SCHIZO_STRBUF_FSYNC_B; - pbm->stc.strbuf_ctxflush = base + SCHIZO_STRBUF_CTXFLUSH_B; - pbm->stc.strbuf_ctxmatch_base = base + SCHIZO_STRBUF_CTXMATCH_B; + if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO) { + /* TOMATILLO lacks streaming cache. */ + return; } + /* SCHIZO has context flushing. */ + pbm->stc.strbuf_control = base + SCHIZO_STRBUF_CONTROL; + pbm->stc.strbuf_pflush = base + SCHIZO_STRBUF_FLUSH; + pbm->stc.strbuf_fsync = base + SCHIZO_STRBUF_FSYNC; + pbm->stc.strbuf_ctxflush = base + SCHIZO_STRBUF_CTXFLUSH; + pbm->stc.strbuf_ctxmatch_base = base + SCHIZO_STRBUF_CTXMATCH; + pbm->stc.strbuf_flushflag = (volatile unsigned long *) ((((unsigned long)&pbm->stc.__flushflag_buf[0]) + 63UL) @@ -1594,48 +1767,63 @@ pbm->stc.strbuf_enabled = 1; } -#define SCHIZO_IOMMU_CONTROL_A (SCHIZO_PBM_A_REGS_OFF + 0x00200UL) -#define SCHIZO_IOMMU_TSBBASE_A (SCHIZO_PBM_A_REGS_OFF + 0x00208UL) -#define SCHIZO_IOMMU_FLUSH_A (SCHIZO_PBM_A_REGS_OFF + 0x00210UL) -#define SCHIZO_IOMMU_CTXFLUSH_A (SCHIZO_PBM_A_REGS_OFF + 0x00218UL) -#define SCHIZO_IOMMU_TAG_A (SCHIZO_PBM_A_REGS_OFF + 0x0a580UL) -#define SCHIZO_IOMMU_DATA_A (SCHIZO_PBM_A_REGS_OFF + 0x0a600UL) -#define SCHIZO_IOMMU_CONTROL_B (SCHIZO_PBM_B_REGS_OFF + 0x00200UL) -#define SCHIZO_IOMMU_TSBBASE_B (SCHIZO_PBM_B_REGS_OFF + 0x00208UL) -#define SCHIZO_IOMMU_FLUSH_B (SCHIZO_PBM_B_REGS_OFF + 0x00210UL) -#define SCHIZO_IOMMU_CTXFLUSH_B (SCHIZO_PBM_B_REGS_OFF + 0x00218UL) -#define SCHIZO_IOMMU_TAG_B (SCHIZO_PBM_B_REGS_OFF + 0x0a580UL) -#define SCHIZO_IOMMU_DATA_B (SCHIZO_PBM_B_REGS_OFF + 0x0a600UL) - -static void schizo_pbm_iommu_init(struct pci_controller_info *p, - struct pci_pbm_info *pbm, - int is_pbm_a) +#define SCHIZO_IOMMU_CONTROL (0x00200UL) +#define SCHIZO_IOMMU_TSBBASE (0x00208UL) +#define SCHIZO_IOMMU_FLUSH (0x00210UL) +#define SCHIZO_IOMMU_CTXFLUSH (0x00218UL) + +static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) { struct pci_iommu *iommu = pbm->iommu; - unsigned long tsbbase, i, tagbase, database; + unsigned long tsbbase, i, tagbase, database, order; + u32 vdma[2], dma_mask; u64 control; + int err, tsbsize; + + err = prom_getproperty(pbm->prom_node, "virtual-dma", + (char *)&vdma[0], sizeof(vdma)); + if (err == 0 || err == -1) { + /* No property, use default values. */ + vdma[0] = 0xc0000000; + vdma[1] = 0x40000000; + } + + dma_mask = vdma[0]; + switch (vdma[1]) { + case 0x20000000: + dma_mask |= 0x1fffffff; + tsbsize = 64; + break; + + case 0x40000000: + dma_mask |= 0x3fffffff; + tsbsize = 128; + break; + + case 0x80000000: + dma_mask |= 0x7fffffff; + tsbsize = 128; + break; + + default: + prom_printf("SCHIZO: strange virtual-dma size.\n"); + prom_halt(); + }; /* Setup initial software IOMMU state. */ spin_lock_init(&iommu->lock); iommu->iommu_cur_ctx = 0; /* Register addresses, SCHIZO has iommu ctx flushing. */ - if (is_pbm_a) { - iommu->iommu_control = p->controller_regs + SCHIZO_IOMMU_CONTROL_A; - iommu->iommu_tsbbase = p->controller_regs + SCHIZO_IOMMU_TSBBASE_A; - iommu->iommu_flush = p->controller_regs + SCHIZO_IOMMU_FLUSH_A; - iommu->iommu_ctxflush = p->controller_regs + SCHIZO_IOMMU_CTXFLUSH_A; - } else { - iommu->iommu_control = p->controller_regs + SCHIZO_IOMMU_CONTROL_B; - iommu->iommu_tsbbase = p->controller_regs + SCHIZO_IOMMU_TSBBASE_B; - iommu->iommu_flush = p->controller_regs + SCHIZO_IOMMU_FLUSH_B; - iommu->iommu_ctxflush = p->controller_regs + SCHIZO_IOMMU_CTXFLUSH_B; - } + iommu->iommu_control = pbm->pbm_regs + SCHIZO_IOMMU_CONTROL; + iommu->iommu_tsbbase = pbm->pbm_regs + SCHIZO_IOMMU_TSBBASE; + iommu->iommu_flush = pbm->pbm_regs + SCHIZO_IOMMU_FLUSH; + iommu->iommu_ctxflush = pbm->pbm_regs + SCHIZO_IOMMU_CTXFLUSH; /* We use the main control/status register of SCHIZO as the write * completion register. */ - iommu->write_complete_reg = p->controller_regs + 0x10000UL; + iommu->write_complete_reg = pbm->controller_regs + 0x10000UL; /* * Invalidate TLB Entries. @@ -1644,13 +1832,11 @@ control |= SCHIZO_IOMMU_CTRL_DENAB; schizo_write(iommu->iommu_control, control); - if (is_pbm_a) - tagbase = SCHIZO_IOMMU_TAG_A, database = SCHIZO_IOMMU_DATA_A; - else - tagbase = SCHIZO_IOMMU_TAG_B, database = SCHIZO_IOMMU_DATA_B; + tagbase = SCHIZO_IOMMU_TAG, database = SCHIZO_IOMMU_DATA; + for(i = 0; i < 16; i++) { - schizo_write(p->controller_regs + tagbase + (i * 8UL), 0); - schizo_write(p->controller_regs + database + (i * 8UL), 0); + schizo_write(pbm->pbm_regs + tagbase + (i * 8UL), 0); + schizo_write(pbm->pbm_regs + database + (i * 8UL), 0); } /* Leave diag mode enabled for full-flushing done @@ -1661,16 +1847,32 @@ * table (128K ioptes * 8 bytes per iopte). This is * page order 7 on UltraSparc. */ - tsbbase = __get_free_pages(GFP_KERNEL, get_order(IO_TSB_SIZE)); + order = get_order(tsbsize * 8 * 1024); + tsbbase = __get_free_pages(GFP_KERNEL, order); if (!tsbbase) { - prom_printf("SCHIZO_IOMMU: Error, gfp(tsb) failed.\n"); + prom_printf("%s: Error, gfp(tsb) failed.\n", pbm->name); prom_halt(); } + iommu->page_table = (iopte_t *)tsbbase; - iommu->page_table_sz_bits = 17; - iommu->page_table_map_base = 0xc0000000; - iommu->dma_addr_mask = 0xffffffff; - memset((char *)tsbbase, 0, IO_TSB_SIZE); + iommu->page_table_map_base = vdma[0]; + iommu->dma_addr_mask = dma_mask; + memset((char *)tsbbase, 0, PAGE_SIZE << order); + + switch (tsbsize) { + case 64: + iommu->page_table_sz_bits = 16; + break; + + case 128: + iommu->page_table_sz_bits = 17; + break; + + default: + prom_printf("iommu_init: Illegal TSB size %d\n", tsbsize); + prom_halt(); + break; + }; /* We start with no consistent mappings. */ iommu->lowest_consistent_map = @@ -1685,28 +1887,194 @@ control = schizo_read(iommu->iommu_control); control &= ~(SCHIZO_IOMMU_CTRL_TSBSZ | SCHIZO_IOMMU_CTRL_TBWSZ); - control |= (SCHIZO_IOMMU_TSBSZ_128K | SCHIZO_IOMMU_CTRL_ENAB); + switch (tsbsize) { + case 64: + control |= SCHIZO_IOMMU_TSBSZ_64K; + break; + case 128: + control |= SCHIZO_IOMMU_TSBSZ_128K; + break; + }; + + control |= SCHIZO_IOMMU_CTRL_ENAB; schizo_write(iommu->iommu_control, control); } -static void schizo_pbm_init(struct pci_controller_info *p, - int prom_node, int is_pbm_a) +#define SCHIZO_PCI_IRQ_RETRY (0x1a00UL) +#define SCHIZO_IRQ_RETRY_INF 0xffUL + +#define SCHIZO_PCI_DIAG (0x2020UL) +#define SCHIZO_PCIDIAG_D_BADECC (1UL << 10UL) /* Disable BAD ECC errors (Schizo) */ +#define SCHIZO_PCIDIAG_D_BYPASS (1UL << 9UL) /* Disable MMU bypass mode (Schizo/Tomatillo) */ +#define SCHIZO_PCIDIAG_D_TTO (1UL << 8UL) /* Disable TTO errors (Schizo/Tomatillo) */ +#define SCHIZO_PCIDIAG_D_RTRYARB (1UL << 7UL) /* Disable retry arbitration (Schizo) */ +#define SCHIZO_PCIDIAG_D_RETRY (1UL << 6UL) /* Disable retry limit (Schizo/Tomatillo) */ +#define SCHIZO_PCIDIAG_D_INTSYNC (1UL << 5UL) /* Disable interrupt/DMA synch (Schizo/Tomatillo) */ +#define SCHIZO_PCIDIAG_I_DMA_PARITY (1UL << 3UL) /* Invert DMA parity (Schizo/Tomatillo) */ +#define SCHIZO_PCIDIAG_I_PIOD_PARITY (1UL << 2UL) /* Invert PIO data parity (Schizo/Tomatillo) */ +#define SCHIZO_PCIDIAG_I_PIOA_PARITY (1UL << 1UL) /* Invert PIO address parity (Schizo/Tomatillo) */ + +#define TOMATILLO_PCI_IOC_CSR (0x2248UL) +#define TOMATILLO_IOC_PART_WPENAB 0x0000000000080000UL +#define TOMATILLO_IOC_RDMULT_PENAB 0x0000000000040000UL +#define TOMATILLO_IOC_RDONE_PENAB 0x0000000000020000UL +#define TOMATILLO_IOC_RDLINE_PENAB 0x0000000000010000UL +#define TOMATILLO_IOC_RDMULT_PLEN 0x000000000000c000UL +#define TOMATILLO_IOC_RDMULT_PLEN_SHIFT 14UL +#define TOMATILLO_IOC_RDONE_PLEN 0x0000000000003000UL +#define TOMATILLO_IOC_RDONE_PLEN_SHIFT 12UL +#define TOMATILLO_IOC_RDLINE_PLEN 0x0000000000000c00UL +#define TOMATILLO_IOC_RDLINE_PLEN_SHIFT 10UL +#define TOMATILLO_IOC_PREF_OFF 0x00000000000003f8UL +#define TOMATILLO_IOC_PREF_OFF_SHIFT 3UL +#define TOMATILLO_IOC_RDMULT_CPENAB 0x0000000000000004UL +#define TOMATILLO_IOC_RDONE_CPENAB 0x0000000000000002UL +#define TOMATILLO_IOC_RDLINE_CPENAB 0x0000000000000001UL + +#define TOMATILLO_PCI_IOC_TDIAG (0x2250UL) +#define TOMATILLO_PCI_IOC_DDIAG (0x2290UL) + +static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm) { + u64 tmp; + + /* Set IRQ retry to infinity. */ + schizo_write(pbm->pbm_regs + SCHIZO_PCI_IRQ_RETRY, + SCHIZO_IRQ_RETRY_INF); + + /* Enable arbiter for all PCI slots. Also, disable PCI interval + * timer so that DTO (Discard TimeOuts) are not reported because + * some Schizo revisions report them erroneously. + */ + tmp = schizo_read(pbm->pbm_regs + SCHIZO_PCI_CTRL); + if (pbm->chip_type == PBM_CHIP_TYPE_SCHIZO_PLUS && + pbm->chip_version == 0x5 && + pbm->chip_revision == 0x1) + tmp |= 0x0f; + else + tmp |= 0xff; + + tmp &= ~SCHIZO_PCICTRL_PTO; + if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO && + pbm->chip_version == 0x2) + tmp |= 0x3UL << SCHIZO_PCICTRL_PTO_SHIFT; + else + tmp |= 0x1UL << SCHIZO_PCICTRL_PTO_SHIFT; + + if (!prom_getbool(pbm->prom_node, "no-bus-parking")) + tmp |= SCHIZO_PCICTRL_PARK; + + if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO) + tmp |= SCHIZO_PCICTRL_MRM_PREF; + + schizo_write(pbm->pbm_regs + SCHIZO_PCI_CTRL, tmp); + + tmp = schizo_read(pbm->pbm_regs + SCHIZO_PCI_DIAG); + tmp &= ~(SCHIZO_PCIDIAG_D_RTRYARB | + SCHIZO_PCIDIAG_D_RETRY | + SCHIZO_PCIDIAG_D_INTSYNC); + schizo_write(pbm->pbm_regs + SCHIZO_PCI_DIAG, tmp); + + if (pbm->chip_type == PBM_CHIP_TYPE_TOMATILLO) { + /* Clear prefetch lengths to workaround a bug in + * Jalapeno... + */ + tmp = (TOMATILLO_IOC_PART_WPENAB | + (1 << TOMATILLO_IOC_PREF_OFF_SHIFT) | + TOMATILLO_IOC_RDMULT_CPENAB | + TOMATILLO_IOC_RDONE_CPENAB | + TOMATILLO_IOC_RDLINE_CPENAB); + + schizo_write(pbm->pbm_regs + TOMATILLO_PCI_IOC_CSR, + tmp); + } +} + +static void __init schizo_pbm_init(struct pci_controller_info *p, + int prom_node, u32 portid, + int chip_type) +{ + struct linux_prom64_registers pr_regs[4]; unsigned int busrange[2]; struct pci_pbm_info *pbm; + const char *chipset_name; + u32 ino_bitmap[2]; + int is_pbm_a; int err; + switch (chip_type) { + case PBM_CHIP_TYPE_TOMATILLO: + chipset_name = "TOMATILLO"; + break; + + case PBM_CHIP_TYPE_SCHIZO_PLUS: + chipset_name = "SCHIZO+"; + break; + + case PBM_CHIP_TYPE_SCHIZO: + default: + chipset_name = "SCHIZO"; + break; + }; + + /* For SCHIZO, three OBP regs: + * 1) PBM controller regs + * 2) Schizo front-end controller regs (same for both PBMs) + * 3) PBM PCI config space + * + * For TOMATILLO, four OBP regs: + * 1) PBM controller regs + * 2) Tomatillo front-end controller regs + * 3) PBM PCI config space + * 4) Ichip regs + */ + err = prom_getproperty(prom_node, "reg", + (char *)&pr_regs[0], + sizeof(pr_regs)); + if (err == 0 || err == -1) { + prom_printf("%s: Fatal error, no reg property.\n", + chipset_name); + prom_halt(); + } + + is_pbm_a = ((pr_regs[0].phys_addr & 0x00700000) == 0x00600000); + if (is_pbm_a) pbm = &p->pbm_A; else pbm = &p->pbm_B; - schizo_determine_mem_io_space(pbm, is_pbm_a, p->controller_regs); - pbm_register_toplevel_resources(p, pbm); - + pbm->portid = portid; pbm->parent = p; pbm->prom_node = prom_node; pbm->pci_first_slot = 1; + + pbm->chip_type = chip_type; + pbm->chip_version = + prom_getintdefault(prom_node, "version#", 0); + pbm->chip_revision = + prom_getintdefault(prom_node, "module-revision#", 0); + + pbm->pbm_regs = pr_regs[0].phys_addr; + pbm->controller_regs = pr_regs[1].phys_addr - 0x10000UL; + + sprintf(pbm->name, + (chip_type == PBM_CHIP_TYPE_TOMATILLO ? + "TOMATILLO%d PBM%c" : + "SCHIZO%d PBM%c"), + p->index, + (pbm == &p->pbm_A ? 'A' : 'B')); + + printk("%s: ver[%x:%x], portid %x, " + "cregs[%lx] pregs[%lx]\n", + pbm->name, + pbm->chip_version, pbm->chip_revision, + pbm->portid, + pbm->controller_regs, + pbm->pbm_regs); + + schizo_pbm_hw_init(pbm); + prom_getstring(prom_node, "name", pbm->prom_name, sizeof(pbm->prom_name)); @@ -1714,11 +2082,17 @@ err = prom_getproperty(prom_node, "ranges", (char *) pbm->pbm_ranges, sizeof(pbm->pbm_ranges)); - if (err != -1) - pbm->num_pbm_ranges = - (err / sizeof(struct linux_prom_pci_ranges)); - else - pbm->num_pbm_ranges = 0; + if (err == 0 || err == -1) { + prom_printf("%s: Fatal error, no ranges property.\n", + pbm->name); + prom_halt(); + } + + pbm->num_pbm_ranges = + (err / sizeof(struct linux_prom_pci_ranges)); + + schizo_determine_mem_io_space(pbm); + pbm_register_toplevel_resources(p, pbm); err = prom_getproperty(prom_node, "interrupt-map", (char *)pbm->pbm_intmap, @@ -1729,8 +2103,8 @@ (char *)&pbm->pbm_intmask, sizeof(pbm->pbm_intmask)); if (err == -1) { - prom_printf("SCHIZO-PBM: Fatal error, no " - "interrupt-map-mask.\n"); + prom_printf("%s: Fatal error, no " + "interrupt-map-mask.\n", pbm->name); prom_halt(); } } else { @@ -1738,95 +2112,65 @@ memset(&pbm->pbm_intmask, 0, sizeof(pbm->pbm_intmask)); } + err = prom_getproperty(prom_node, "ino-bitmap", + (char *) &ino_bitmap[0], + sizeof(ino_bitmap)); + if (err == 0 || err == -1) { + prom_printf("%s: Fatal error, no ino-bitmap.\n", pbm->name); + prom_halt(); + } + pbm->ino_bitmap = (((u64)ino_bitmap[1] << 32UL) | + ((u64)ino_bitmap[0] << 0UL)); + err = prom_getproperty(prom_node, "bus-range", (char *)&busrange[0], sizeof(busrange)); if (err == 0 || err == -1) { - prom_printf("SCHIZO-PBM: Fatal error, no bus-range.\n"); + prom_printf("%s: Fatal error, no bus-range.\n", pbm->name); prom_halt(); } pbm->pci_first_busno = busrange[0]; pbm->pci_last_busno = busrange[1]; - schizo_pbm_iommu_init(p, pbm, is_pbm_a); - schizo_pbm_strbuf_init(p, pbm, is_pbm_a); + schizo_pbm_iommu_init(pbm); + schizo_pbm_strbuf_init(pbm); } -#define SCHIZO_PCIA_IRQ_RETRY (SCHIZO_PBM_A_REGS_OFF + 0x1a00UL) -#define SCHIZO_PCIB_IRQ_RETRY (SCHIZO_PBM_B_REGS_OFF + 0x1a00UL) -#define SCHIZO_IRQ_RETRY_INF 0xffUL - -#define SCHIZO_PCIA_DIAG (SCHIZO_PBM_A_REGS_OFF + 0x2020UL) -#define SCHIZO_PCIB_DIAG (SCHIZO_PBM_B_REGS_OFF + 0x2020UL) -#define SCHIZO_PCIDIAG_D_BADECC (1UL << 10UL) /* Disable BAD ECC errors */ -#define SCHIZO_PCIDIAG_D_BYPASS (1UL << 9UL) /* Disable MMU bypass mode */ -#define SCHIZO_PCIDIAG_D_TTO (1UL << 8UL) /* Disable TTO errors */ -#define SCHIZO_PCIDIAG_D_RTRYARB (1UL << 7UL) /* Disable retry arbitration */ -#define SCHIZO_PCIDIAG_D_RETRY (1UL << 6UL) /* Disable retry limit */ -#define SCHIZO_PCIDIAG_D_INTSYNC (1UL << 5UL) /* Disable interrupt/DMA synch */ -#define SCHIZO_PCIDIAG_I_DMA_PARITY (1UL << 3UL) /* Invert DMA parity */ -#define SCHIZO_PCIDIAG_I_PIOD_PARITY (1UL << 2UL) /* Invert PIO data parity */ -#define SCHIZO_PCIDIAG_I_PIOA_PARITY (1UL << 1U)L /* Invert PIO address parity */ - -static void schizo_controller_hwinit(struct pci_controller_info *p) +static inline int portid_compare(u32 x, u32 y, int chip_type) { - unsigned long pbm_a_base, pbm_b_base; - u64 tmp; - - pbm_a_base = p->controller_regs + SCHIZO_PBM_A_REGS_OFF; - pbm_b_base = p->controller_regs + SCHIZO_PBM_B_REGS_OFF; - - /* Set IRQ retry to infinity. */ - schizo_write(p->controller_regs + SCHIZO_PCIA_IRQ_RETRY, - SCHIZO_IRQ_RETRY_INF); - schizo_write(p->controller_regs + SCHIZO_PCIB_IRQ_RETRY, - SCHIZO_IRQ_RETRY_INF); - - /* Enable arbiter for all PCI slots. Also, disable PCI interval - * timer so that DTO (Discard TimeOuts) are not reported because - * some Schizo revisions report them erroneously. - */ - - tmp = schizo_read(p->controller_regs + SCHIZO_PCIA_CTRL); - tmp |= SCHIZO_PCICTRL_ARB; - tmp &= ~SCHIZO_PCICTRL_PTO; - schizo_write(p->controller_regs + SCHIZO_PCIA_CTRL, tmp); - - tmp = schizo_read(p->controller_regs + SCHIZO_PCIB_CTRL); - tmp |= SCHIZO_PCICTRL_ARB; - tmp &= ~SCHIZO_PCICTRL_PTO; - schizo_write(p->controller_regs + SCHIZO_PCIB_CTRL, tmp); - - /* Disable TTO error reporting (won't happen anyway since we - * disabled the PCI interval timer above) and retry arbitration - * (can cause hangs in some Schizo revisions). - */ - tmp = schizo_read(p->controller_regs + SCHIZO_PCIA_DIAG); - tmp |= (SCHIZO_PCIDIAG_D_TTO | SCHIZO_PCIDIAG_D_RTRYARB); - schizo_write(p->controller_regs + SCHIZO_PCIA_DIAG, tmp); - - tmp = schizo_read(p->controller_regs + SCHIZO_PCIB_DIAG); - tmp |= (SCHIZO_PCIDIAG_D_TTO | SCHIZO_PCIDIAG_D_RTRYARB); - schizo_write(p->controller_regs + SCHIZO_PCIB_DIAG, tmp); + if (chip_type == PBM_CHIP_TYPE_TOMATILLO) { + if (x == (y ^ 1)) + return 1; + return 0; + } + return (x == y); } -void __init schizo_init(int node, char *model_name) +static void __init __schizo_init(int node, char *model_name, int chip_type) { - struct linux_prom64_registers pr_regs[3]; struct pci_controller_info *p; struct pci_iommu *iommu; unsigned long flags; + int is_pbm_a; u32 portid; - int is_pbm_a, err; portid = prom_getintdefault(node, "portid", 0xff); spin_lock_irqsave(&pci_controller_lock, flags); for(p = pci_controller_root; p; p = p->next) { - if (p->portid == portid) { + struct pci_pbm_info *pbm; + + if (p->pbm_A.prom_node && p->pbm_B.prom_node) + continue; + + pbm = (p->pbm_A.prom_node ? + &p->pbm_A : + &p->pbm_B); + + if (portid_compare(pbm->portid, portid, chip_type)) { spin_unlock_irqrestore(&pci_controller_lock, flags); is_pbm_a = (p->pbm_A.prom_node == 0); - schizo_pbm_init(p, node, is_pbm_a); + schizo_pbm_init(p, node, portid, chip_type); return; } } @@ -1860,38 +2204,33 @@ pci_controller_root = p; spin_unlock_irqrestore(&pci_controller_lock, flags); - p->portid = portid; p->index = pci_num_controllers++; p->pbms_same_domain = 0; - p->scan_bus = schizo_scan_bus; + p->scan_bus = (chip_type == PBM_CHIP_TYPE_TOMATILLO ? + tomatillo_scan_bus : + schizo_scan_bus); p->irq_build = schizo_irq_build; p->base_address_update = schizo_base_address_update; p->resource_adjust = schizo_resource_adjust; p->pci_ops = &schizo_ops; - /* Three OBP regs: - * 1) PBM controller regs - * 2) Schizo front-end controller regs (same for both PBMs) - * 3) PBM PCI config space - */ - err = prom_getproperty(node, "reg", - (char *)&pr_regs[0], - sizeof(pr_regs)); - if (err == 0 || err == -1) { - prom_printf("SCHIZO: Fatal error, no reg property.\n"); - prom_halt(); - } - - p->controller_regs = pr_regs[1].phys_addr - 0x10000UL; - printk("PCI: Found SCHIZO, control regs at %016lx\n", - p->controller_regs); - /* Like PSYCHO we have a 2GB aligned area for memory space. */ pci_memspace_mask = 0x7fffffffUL; - /* Init core controller. */ - schizo_controller_hwinit(p); + schizo_pbm_init(p, node, portid, chip_type); +} - is_pbm_a = ((pr_regs[0].phys_addr & 0x00700000) == 0x00600000); - schizo_pbm_init(p, node, is_pbm_a); +void __init schizo_init(int node, char *model_name) +{ + __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO); +} + +void __init schizo_plus_init(int node, char *model_name) +{ + __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO_PLUS); +} + +void __init tomatillo_init(int node, char *model_name) +{ + __schizo_init(node, model_name, PBM_CHIP_TYPE_TOMATILLO); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/setup.c linux-2.4.23-pre8/arch/sparc64/kernel/setup.c --- linux-2.4.22/arch/sparc64/kernel/setup.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/setup.c 2003-10-22 22:48:26.000000000 +0000 @@ -604,8 +604,8 @@ /* BUFFER is PAGE_SIZE bytes long. */ -extern char *sparc_cpu_type[]; -extern char *sparc_fpu_type[]; +extern char *sparc_cpu_type; +extern char *sparc_fpu_type; extern void smp_info(struct seq_file *); extern void smp_bogo(struct seq_file *); @@ -617,8 +617,6 @@ static int show_cpuinfo(struct seq_file *m, void *__unused) { - int cpuid = smp_processor_id(); - seq_printf(m, "cpu\t\t: %s\n" "fpu\t\t: %s\n" @@ -632,8 +630,8 @@ "Cpu0ClkTck\t: %016lx\n" #endif , - sparc_cpu_type[cpuid], - sparc_fpu_type[cpuid], + sparc_cpu_type, + sparc_fpu_type, prom_rev, prom_prev >> 16, (prom_prev >> 8) & 0xff, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/smp.c linux-2.4.23-pre8/arch/sparc64/kernel/smp.c --- linux-2.4.22/arch/sparc64/kernel/smp.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/smp.c 2003-10-22 22:47:28.000000000 +0000 @@ -133,7 +133,6 @@ static volatile unsigned long callin_flag = 0; extern void inherit_locked_prom_mappings(int save_p); -extern void cpu_probe(void); void __init smp_callin(void) { @@ -153,8 +152,6 @@ __flush_cache_all(); __flush_tlb_all(); - cpu_probe(); - smp_setup_percpu_timer(); __sti(); @@ -537,12 +534,19 @@ #endif static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, unsigned long mask) { - u64 pstate; - int nack_busy_id; + u64 pstate, ver; + int nack_busy_id, is_jalapeno; if (!mask) return; + /* Unfortunately, someone at Sun had the brilliant idea to make the + * busy/nack fields hard-coded by ITID number for this Ultra-III + * derivative processor. + */ + __asm__ ("rdpr %%ver, %0" : "=r" (ver)); + is_jalapeno = ((ver >> 32) == 0x003e0016); + __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate)); retry: @@ -567,11 +571,13 @@ if (mask & (1UL << i)) { u64 target = (i << 14) | 0x70; - target |= (nack_busy_id++ << 24); + if (!is_jalapeno) + target |= (nack_busy_id << 24); __asm__ __volatile__("stxa %%g0, [%0] %1\n\t" "membar #Sync\n\t" : /* no outputs */ : "r" (target), "i" (ASI_INTR_W)); + nack_busy_id++; ncpus--; } } @@ -618,7 +624,14 @@ */ for (i = 0; i < NR_CPUS; i++) { if (mask & (1UL << i)) { - if ((dispatch_stat & (0x2 << this_busy_nack)) == 0) + u64 check_mask; + + if (is_jalapeno) + check_mask = (0x2UL << (2*i)); + else + check_mask = (0x2UL << + this_busy_nack); + if ((dispatch_stat & check_mask) == 0) mask &= ~(1UL << i); this_busy_nack += 2; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/sys_sparc32.c linux-2.4.23-pre8/arch/sparc64/kernel/sys_sparc32.c --- linux-2.4.22/arch/sparc64/kernel/sys_sparc32.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/sys_sparc32.c 2003-10-22 22:49:07.000000000 +0000 @@ -415,7 +415,7 @@ * * This is really horribly ugly. */ -#define IPCOP_MASK(__x) (1UL << (__x)) +#define IPCOP_MASK(__x) (1UL << ((__x)&~IPC_64)) static int do_sys32_semctl(int first, int second, int third, void *uptr) { union semun fourth; @@ -427,7 +427,7 @@ err = -EFAULT; if (get_user (pad, (u32 *)uptr)) goto out; - if(third == SETVAL) + if ((third & ~IPC_64) == SETVAL) fourth.val = (int)pad; else fourth.__pad = (void *)A(pad); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/sys_sunos32.c linux-2.4.23-pre8/arch/sparc64/kernel/sys_sunos32.c --- linux-2.4.22/arch/sparc64/kernel/sys_sunos32.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/sys_sunos32.c 2003-10-22 22:49:05.000000000 +0000 @@ -157,7 +157,7 @@ * fool it, but this should catch most mistakes. */ freepages = atomic_read(&buffermem_pages) >> PAGE_SHIFT; - freepages += atomic_read(&page_cache_size); + freepages += page_cache_size; freepages >>= 1; freepages += nr_free_pages(); freepages += nr_swap_pages; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/time.c linux-2.4.23-pre8/arch/sparc64/kernel/time.c --- linux-2.4.22/arch/sparc64/kernel/time.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/time.c 2003-10-22 22:48:56.000000000 +0000 @@ -775,6 +775,7 @@ strcmp(model, "mk48t08") && strcmp(model, "mk48t59") && strcmp(model, "m5819") && + strcmp(model, "m5819p") && strcmp(model, "ds1287")) { if (cbus != NULL) { prom_printf("clock_probe: Central bus lacks timer chip.\n"); @@ -833,7 +834,8 @@ } if (!strcmp(model, "ds1287") || - !strcmp(model, "m5819")) { + !strcmp(model, "m5819") || + !strcmp(model, "m5819p")) { ds1287_regs = edev->resource[0].start; } else { mstk48t59_regs = edev->resource[0].start; @@ -853,7 +855,8 @@ prom_halt(); } if (!strcmp(model, "ds1287") || - !strcmp(model, "m5819")) { + !strcmp(model, "m5819") || + !strcmp(model, "m5819p")) { ds1287_regs = isadev->resource.start; } else { mstk48t59_regs = isadev->resource.start; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/traps.c linux-2.4.23-pre8/arch/sparc64/kernel/traps.c --- linux-2.4.22/arch/sparc64/kernel/traps.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/traps.c 2003-10-22 22:49:48.000000000 +0000 @@ -401,6 +401,179 @@ }; #define CHAFSR_INVALID ((u64)-1L) +/* This table is ordered in priority of errors and matches the + * AFAR overwrite policy as well. + */ + +struct afsr_error_table { + unsigned long mask; + const char *name; +}; + +static const char CHAFSR_PERR_msg[] = + "System interface protocol error"; +static const char CHAFSR_IERR_msg[] = + "Internal processor error"; +static const char CHAFSR_ISAP_msg[] = + "System request parity error on incoming addresss"; +static const char CHAFSR_UCU_msg[] = + "Uncorrectable E-cache ECC error for ifetch/data"; +static const char CHAFSR_UCC_msg[] = + "SW Correctable E-cache ECC error for ifetch/data"; +static const char CHAFSR_UE_msg[] = + "Uncorrectable system bus data ECC error for read"; +static const char CHAFSR_EDU_msg[] = + "Uncorrectable E-cache ECC error for stmerge/blkld"; +static const char CHAFSR_EMU_msg[] = + "Uncorrectable system bus MTAG error"; +static const char CHAFSR_WDU_msg[] = + "Uncorrectable E-cache ECC error for writeback"; +static const char CHAFSR_CPU_msg[] = + "Uncorrectable ECC error for copyout"; +static const char CHAFSR_CE_msg[] = + "HW corrected system bus data ECC error for read"; +static const char CHAFSR_EDC_msg[] = + "HW corrected E-cache ECC error for stmerge/blkld"; +static const char CHAFSR_EMC_msg[] = + "HW corrected system bus MTAG ECC error"; +static const char CHAFSR_WDC_msg[] = + "HW corrected E-cache ECC error for writeback"; +static const char CHAFSR_CPC_msg[] = + "HW corrected ECC error for copyout"; +static const char CHAFSR_TO_msg[] = + "Unmapped error from system bus"; +static const char CHAFSR_BERR_msg[] = + "Bus error response from system bus"; +static const char CHAFSR_IVC_msg[] = + "HW corrected system bus data ECC error for ivec read"; +static const char CHAFSR_IVU_msg[] = + "Uncorrectable system bus data ECC error for ivec read"; +static struct afsr_error_table __cheetah_error_table[] = { + { CHAFSR_PERR, CHAFSR_PERR_msg }, + { CHAFSR_IERR, CHAFSR_IERR_msg }, + { CHAFSR_ISAP, CHAFSR_ISAP_msg }, + { CHAFSR_UCU, CHAFSR_UCU_msg }, + { CHAFSR_UCC, CHAFSR_UCC_msg }, + { CHAFSR_UE, CHAFSR_UE_msg }, + { CHAFSR_EDU, CHAFSR_EDU_msg }, + { CHAFSR_EMU, CHAFSR_EMU_msg }, + { CHAFSR_WDU, CHAFSR_WDU_msg }, + { CHAFSR_CPU, CHAFSR_CPU_msg }, + { CHAFSR_CE, CHAFSR_CE_msg }, + { CHAFSR_EDC, CHAFSR_EDC_msg }, + { CHAFSR_EMC, CHAFSR_EMC_msg }, + { CHAFSR_WDC, CHAFSR_WDC_msg }, + { CHAFSR_CPC, CHAFSR_CPC_msg }, + { CHAFSR_TO, CHAFSR_TO_msg }, + { CHAFSR_BERR, CHAFSR_BERR_msg }, + /* These two do not update the AFAR. */ + { CHAFSR_IVC, CHAFSR_IVC_msg }, + { CHAFSR_IVU, CHAFSR_IVU_msg }, + { 0, NULL }, +}; +static const char CHPAFSR_DTO_msg[] = + "System bus unmapped error for prefetch/storequeue-read"; +static const char CHPAFSR_DBERR_msg[] = + "System bus error for prefetch/storequeue-read"; +static const char CHPAFSR_THCE_msg[] = + "Hardware corrected E-cache Tag ECC error"; +static const char CHPAFSR_TSCE_msg[] = + "SW handled correctable E-cache Tag ECC error"; +static const char CHPAFSR_TUE_msg[] = + "Uncorrectable E-cache Tag ECC error"; +static const char CHPAFSR_DUE_msg[] = + "System bus uncorrectable data ECC error due to prefetch/store-fill"; +static struct afsr_error_table __cheetah_plus_error_table[] = { + { CHAFSR_PERR, CHAFSR_PERR_msg }, + { CHAFSR_IERR, CHAFSR_IERR_msg }, + { CHAFSR_ISAP, CHAFSR_ISAP_msg }, + { CHAFSR_UCU, CHAFSR_UCU_msg }, + { CHAFSR_UCC, CHAFSR_UCC_msg }, + { CHAFSR_UE, CHAFSR_UE_msg }, + { CHAFSR_EDU, CHAFSR_EDU_msg }, + { CHAFSR_EMU, CHAFSR_EMU_msg }, + { CHAFSR_WDU, CHAFSR_WDU_msg }, + { CHAFSR_CPU, CHAFSR_CPU_msg }, + { CHAFSR_CE, CHAFSR_CE_msg }, + { CHAFSR_EDC, CHAFSR_EDC_msg }, + { CHAFSR_EMC, CHAFSR_EMC_msg }, + { CHAFSR_WDC, CHAFSR_WDC_msg }, + { CHAFSR_CPC, CHAFSR_CPC_msg }, + { CHAFSR_TO, CHAFSR_TO_msg }, + { CHAFSR_BERR, CHAFSR_BERR_msg }, + { CHPAFSR_DTO, CHPAFSR_DTO_msg }, + { CHPAFSR_DBERR, CHPAFSR_DBERR_msg }, + { CHPAFSR_THCE, CHPAFSR_THCE_msg }, + { CHPAFSR_TSCE, CHPAFSR_TSCE_msg }, + { CHPAFSR_TUE, CHPAFSR_TUE_msg }, + { CHPAFSR_DUE, CHPAFSR_DUE_msg }, + /* These two do not update the AFAR. */ + { CHAFSR_IVC, CHAFSR_IVC_msg }, + { CHAFSR_IVU, CHAFSR_IVU_msg }, + { 0, NULL }, +}; +static const char JPAFSR_JETO_msg[] = + "System interface protocol error, hw timeout caused"; +static const char JPAFSR_SCE_msg[] = + "Parity error on system snoop results"; +static const char JPAFSR_JEIC_msg[] = + "System interface protocol error, illegal command detected"; +static const char JPAFSR_JEIT_msg[] = + "System interface protocol error, illegal ADTYPE detected"; +static const char JPAFSR_OM_msg[] = + "Out of range memory error has occurred"; +static const char JPAFSR_ETP_msg[] = + "Parity error on L2 cache tag SRAM"; +static const char JPAFSR_UMS_msg[] = + "Error due to unsupported store"; +static const char JPAFSR_RUE_msg[] = + "Uncorrectable ECC error from remote cache/memory"; +static const char JPAFSR_RCE_msg[] = + "Correctable ECC error from remote cache/memory"; +static const char JPAFSR_BP_msg[] = + "JBUS parity error on returned read data"; +static const char JPAFSR_WBP_msg[] = + "JBUS parity error on data for writeback or block store"; +static const char JPAFSR_FRC_msg[] = + "Foreign read to DRAM incurring correctable ECC error"; +static const char JPAFSR_FRU_msg[] = + "Foreign read to DRAM incurring uncorrectable ECC error"; +static struct afsr_error_table __jalapeno_error_table[] = { + { JPAFSR_JETO, JPAFSR_JETO_msg }, + { JPAFSR_SCE, JPAFSR_SCE_msg }, + { JPAFSR_JEIC, JPAFSR_JEIC_msg }, + { JPAFSR_JEIT, JPAFSR_JEIT_msg }, + { CHAFSR_PERR, CHAFSR_PERR_msg }, + { CHAFSR_IERR, CHAFSR_IERR_msg }, + { CHAFSR_ISAP, CHAFSR_ISAP_msg }, + { CHAFSR_UCU, CHAFSR_UCU_msg }, + { CHAFSR_UCC, CHAFSR_UCC_msg }, + { CHAFSR_UE, CHAFSR_UE_msg }, + { CHAFSR_EDU, CHAFSR_EDU_msg }, + { JPAFSR_OM, JPAFSR_OM_msg }, + { CHAFSR_WDU, CHAFSR_WDU_msg }, + { CHAFSR_CPU, CHAFSR_CPU_msg }, + { CHAFSR_CE, CHAFSR_CE_msg }, + { CHAFSR_EDC, CHAFSR_EDC_msg }, + { JPAFSR_ETP, JPAFSR_ETP_msg }, + { CHAFSR_WDC, CHAFSR_WDC_msg }, + { CHAFSR_CPC, CHAFSR_CPC_msg }, + { CHAFSR_TO, CHAFSR_TO_msg }, + { CHAFSR_BERR, CHAFSR_BERR_msg }, + { JPAFSR_UMS, JPAFSR_UMS_msg }, + { JPAFSR_RUE, JPAFSR_RUE_msg }, + { JPAFSR_RCE, JPAFSR_RCE_msg }, + { JPAFSR_BP, JPAFSR_BP_msg }, + { JPAFSR_WBP, JPAFSR_WBP_msg }, + { JPAFSR_FRC, JPAFSR_FRC_msg }, + { JPAFSR_FRU, JPAFSR_FRU_msg }, + /* These two do not update the AFAR. */ + { CHAFSR_IVU, CHAFSR_IVU_msg }, + { 0, NULL }, +}; +static struct afsr_error_table *cheetah_error_table; +static unsigned long cheetah_afsr_errors; + /* This is allocated at boot time based upon the largest hardware * cpu ID in the system. We allocate two entries per cpu, one for * TL==0 logging and one for TL >= 1 logging. @@ -436,7 +609,7 @@ void cheetah_ecache_flush_init(void) { - unsigned long largest_size, smallest_linesize, order; + unsigned long largest_size, smallest_linesize, order, ver; char type[16]; int node, highest_cpu, i; @@ -522,6 +695,18 @@ for (i = 0; i < 2 * highest_cpu; i++) cheetah_error_log[i].afsr = CHAFSR_INVALID; + __asm__ ("rdpr %%ver, %0" : "=r" (ver)); + if ((ver >> 32) == 0x003e0016) { + cheetah_error_table = &__jalapeno_error_table[0]; + cheetah_afsr_errors = JPAFSR_ERRORS; + } else if ((ver >> 32) == 0x003e0015) { + cheetah_error_table = &__cheetah_plus_error_table[0]; + cheetah_afsr_errors = CHPAFSR_ERRORS; + } else { + cheetah_error_table = &__cheetah_error_table[0]; + cheetah_afsr_errors = CHAFSR_ERRORS; + } + /* Now patch trap tables. */ memcpy(tl0_fecc, cheetah_fecc_trap_vector, (8 * 4)); memcpy(tl1_fecc, cheetah_fecc_trap_vector_tl1, (8 * 4)); @@ -720,36 +905,6 @@ NONE, NONE }; -/* This table is ordered in priority of errors and matches the - * AFAR overwrite policy as well. - */ -static struct { - unsigned long mask; - char *name; -} cheetah_error_table[] = { - { CHAFSR_PERR, "System interface protocol error" }, - { CHAFSR_IERR, "Internal processor error" }, - { CHAFSR_ISAP, "System request parity error on incoming addresss" }, - { CHAFSR_UCU, "Uncorrectable E-cache ECC error for ifetch/data" }, - { CHAFSR_UCC, "SW Correctable E-cache ECC error for ifetch/data" }, - { CHAFSR_UE, "Uncorrectable system bus data ECC error for read" }, - { CHAFSR_EDU, "Uncorrectable E-cache ECC error for stmerge/blkld" }, - { CHAFSR_EMU, "Uncorrectable system bus MTAG error" }, - { CHAFSR_WDU, "Uncorrectable E-cache ECC error for writeback" }, - { CHAFSR_CPU, "Uncorrectable ECC error for copyout" }, - { CHAFSR_CE, "HW corrected system bus data ECC error for read" }, - { CHAFSR_EDC, "HW corrected E-cache ECC error for stmerge/blkld" }, - { CHAFSR_EMC, "HW corrected system bus MTAG ECC error" }, - { CHAFSR_WDC, "HW corrected E-cache ECC error for writeback" }, - { CHAFSR_CPC, "HW corrected ECC error for copyout" }, - { CHAFSR_TO, "Unmapped error from system bus" }, - { CHAFSR_BERR, "Bus error response from system bus" }, - /* These two do not update the AFAR. */ - { CHAFSR_IVC, "HW corrected system bus data ECC error for ivec read" }, - { CHAFSR_IVU, "Uncorrectable system bus data ECC error for ivec read" }, - { 0, NULL } -}; - /* Return the highest priority error conditon mentioned. */ static __inline__ unsigned long cheetah_get_hipri(unsigned long afsr) { @@ -763,7 +918,7 @@ return tmp; } -static char *cheetah_get_string(unsigned long bit) +static const char *cheetah_get_string(unsigned long bit) { int i; @@ -876,7 +1031,7 @@ info->ecache_data[2], info->ecache_data[3]); - afsr = (afsr & ~hipri) & CHAFSR_ERRORS; + afsr = (afsr & ~hipri) & cheetah_afsr_errors; while (afsr != 0UL) { unsigned long bit = cheetah_get_hipri(afsr); @@ -899,7 +1054,7 @@ __asm__ __volatile__("ldxa [%%g0] %1, %0\n\t" : "=r" (afsr) : "i" (ASI_AFSR)); - if ((afsr & CHAFSR_ERRORS) != 0) { + if ((afsr & cheetah_afsr_errors) != 0) { if (logp != NULL) { __asm__ __volatile__("ldxa [%%g0] %1, %0\n\t" : "=r" (afar) @@ -1125,12 +1280,12 @@ flush_all = flush_line = 0; if ((afsr & CHAFSR_EDC) != 0UL) { - if ((afsr & CHAFSR_ERRORS) == CHAFSR_EDC) + if ((afsr & cheetah_afsr_errors) == CHAFSR_EDC) flush_line = 1; else flush_all = 1; } else if ((afsr & CHAFSR_CPC) != 0UL) { - if ((afsr & CHAFSR_ERRORS) == CHAFSR_CPC) + if ((afsr & cheetah_afsr_errors) == CHAFSR_CPC) flush_line = 1; else flush_all = 1; @@ -1253,12 +1408,12 @@ flush_all = flush_line = 0; if ((afsr & CHAFSR_EDU) != 0UL) { - if ((afsr & CHAFSR_ERRORS) == CHAFSR_EDU) + if ((afsr & cheetah_afsr_errors) == CHAFSR_EDU) flush_line = 1; else flush_all = 1; } else if ((afsr & CHAFSR_BERR) != 0UL) { - if ((afsr & CHAFSR_ERRORS) == CHAFSR_BERR) + if ((afsr & cheetah_afsr_errors) == CHAFSR_BERR) flush_line = 1; else flush_all = 1; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/sparc64/kernel/unaligned.c linux-2.4.23-pre8/arch/sparc64/kernel/unaligned.c --- linux-2.4.22/arch/sparc64/kernel/unaligned.c 2001-04-12 19:10:25.000000000 +0000 +++ linux-2.4.23-pre8/arch/sparc64/kernel/unaligned.c 2003-10-22 22:48:26.000000000 +0000 @@ -479,7 +479,9 @@ extern void do_fpother(struct pt_regs *regs); extern void do_privact(struct pt_regs *regs); -extern void data_access_exception(struct pt_regs *regs); +extern void data_access_exception(struct pt_regs *regs, + unsigned long sfsr, + unsigned long sfar); int handle_ldf_stq(u32 insn, struct pt_regs *regs) { @@ -522,14 +524,14 @@ break; } default: - data_access_exception(regs); + data_access_exception(regs, 0, addr); return 1; } if (put_user (first >> 32, (u32 *)addr) || __put_user ((u32)first, (u32 *)(addr + 4)) || __put_user (second >> 32, (u32 *)(addr + 8)) || __put_user ((u32)second, (u32 *)(addr + 12))) { - data_access_exception(regs); + data_access_exception(regs, 0, addr); return 1; } } else { @@ -542,7 +544,7 @@ do_privact(regs); return 1; } else if (asi > ASI_SNFL) { - data_access_exception(regs); + data_access_exception(regs, 0, addr); return 1; } switch (insn & 0x180000) { @@ -559,7 +561,7 @@ err |= __get_user (data[i], (u32 *)(addr + 4*i)); } if (err && !(asi & 0x2 /* NF */)) { - data_access_exception(regs); + data_access_exception(regs, 0, addr); return 1; } if (asi & 0x8) /* Little */ { @@ -662,7 +664,7 @@ *(u64 *)(f->regs + freg) = value; current->thread.fpsaved[0] |= flag; } else { -daex: data_access_exception(regs); +daex: data_access_exception(regs, sfsr, sfar); return; } advance(regs); @@ -706,7 +708,7 @@ __put_user ((u32)value, (u32 *)(sfar + 4))) goto daex; } else { -daex: data_access_exception(regs); +daex: data_access_exception(regs, sfsr, sfar); return; } advance(regs); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/Makefile linux-2.4.23-pre8/arch/x86_64/Makefile --- linux-2.4.22/arch/x86_64/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/Makefile 2003-10-22 22:49:21.000000000 +0000 @@ -19,7 +19,7 @@ # 20010105 Andi Kleen, add IA32 compiler. # ....and later removed it again.... # -# $Id: Makefile,v 1.33 2003/05/12 14:36:34 ak Exp $ +# $Id: Makefile,v 1.34 2003/09/25 02:50:05 ak Exp $ # # early bootup linking needs 32bit. You can either use real 32bit tools @@ -38,6 +38,8 @@ LDFLAGS=-e stext LINKFLAGS =-T $(TOPDIR)/arch/x86_64/vmlinux.lds $(LDFLAGS) +check_gcc = $(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1 ; then echo "$(1)"; else echo "$(2)"; fi) + CFLAGS += -mno-red-zone CFLAGS += -mcmodel=kernel CFLAGS += -pipe @@ -51,9 +53,7 @@ ifneq ($(CONFIG_X86_REMOTE_DEBUG),y) CFLAGS += -fno-asynchronous-unwind-tables endif - -# prevent gcc from keeping the stack 16 byte aligned (FIXME) -#CFLAGS += -mpreferred-stack-boundary=2 +CFLAGS += $(call check_gcc,-fno-unit-at-a-time,) HEAD := arch/x86_64/kernel/head.o arch/x86_64/kernel/head64.o arch/x86_64/kernel/init_task.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/boot/setup.S linux-2.4.23-pre8/arch/x86_64/boot/setup.S --- linux-2.4.22/arch/x86_64/boot/setup.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/boot/setup.S 2003-10-22 22:49:11.000000000 +0000 @@ -524,7 +524,7 @@ cmpw $0, %cs:realmode_swtch jz rmodeswtch_normal - lcall %cs:realmode_swtch + lcall *%cs:realmode_swtch jmp rmodeswtch_end diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/config.in linux-2.4.23-pre8/arch/x86_64/config.in --- linux-2.4.22/arch/x86_64/config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/config.in 2003-10-22 22:49:12.000000000 +0000 @@ -10,7 +10,7 @@ define_bool CONFIG_ISA n define_bool CONFIG_SBUS n -define_bool CONFIG_UID16 y +define_bool CONFIG_UID16 n define_bool CONFIG_RWSEM_GENERIC_SPINLOCK y define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n define_bool CONFIG_X86_CMPXCHG y @@ -66,6 +66,7 @@ define_bool CONFIG_X86_UP_IOAPIC y else define_bool CONFIG_HAVE_DEC_LOCK y + int 'Maximum number of CPUs (2-8)' CONFIG_NR_CPUS 4 fi bool 'Machine check support' CONFIG_MCE @@ -244,6 +245,9 @@ bool ' IOMMU leak tracing' CONFIG_IOMMU_LEAK bool ' Probalistic stack overflow check' CONFIG_DEBUG_STACKOVERFLOW fi + +int 'Kernel messages buffer length shift (0 = default)' CONFIG_LOG_BUF_SHIFT 0 + endmenu source lib/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/defconfig linux-2.4.23-pre8/arch/x86_64/defconfig --- linux-2.4.22/arch/x86_64/defconfig 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/defconfig 2003-10-22 22:48:54.000000000 +0000 @@ -40,12 +40,15 @@ CONFIG_X86_IO_APIC=y CONFIG_X86_LOCAL_APIC=y CONFIG_MTRR=y -# CONFIG_SMP is not set +CONFIG_SMP=y CONFIG_HPET_TIMER=y CONFIG_GART_IOMMU=y -CONFIG_X86_UP_IOAPIC=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_NR_CPUS=4 CONFIG_MCE=y -# CONFIG_K8_NUMA is not set +CONFIG_K8_NUMA=y +CONFIG_DISCONTIGMEM=y +CONFIG_NUMA=y # # General setup @@ -88,6 +91,7 @@ # CONFIG_ACPI_ASUS is not set # CONFIG_ACPI_TOSHIBA is not set CONFIG_ACPI_DEBUG=y +# CONFIG_ACPI_RELAXED_AML is not set # # Memory Technology Devices (MTD) @@ -108,6 +112,7 @@ # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_CISS_SCSI_TAPE is not set +# CONFIG_CISS_MONITOR_THREAD is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y @@ -306,6 +311,9 @@ CONFIG_AIC7XXX_RESET_DELAY_MS=15000 # CONFIG_AIC7XXX_PROBE_EISA_VL is not set # CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_IN2000 is not set @@ -350,8 +358,9 @@ # # Fusion MPT device support # -# CONFIG_FUSION is not set -# CONFIG_FUSION_BOOT is not set +CONFIG_FUSION=y +CONFIG_FUSION_BOOT=y +CONFIG_FUSION_MAX_SGE=40 # CONFIG_FUSION_ISENSE is not set # CONFIG_FUSION_CTL is not set # CONFIG_FUSION_LAN is not set @@ -516,6 +525,7 @@ # CONFIG_SCx200_GPIO is not set # CONFIG_AMD_RNG is not set # CONFIG_INTEL_RNG is not set +CONFIG_HW_RANDOM=y # CONFIG_AMD_PM768 is not set # CONFIG_NVRAM is not set # CONFIG_RTC is not set @@ -528,7 +538,7 @@ # # CONFIG_FTAPE is not set CONFIG_AGP=y -CONFIG_AGP_AMD_8151=y +CONFIG_AGP_AMD_K8=y CONFIG_AGP_INTEL=y CONFIG_AGP_I810=y CONFIG_AGP_VIA=y @@ -536,6 +546,12 @@ CONFIG_AGP_SIS=y CONFIG_AGP_ALI=y CONFIG_AGP_SWORKS=y +CONFIG_AGP_NVIDIA=y +# CONFIG_AGP_ATI is not set + +# +# Direct Rendering Manager (XFree86 DRI support) +# # CONFIG_DRM is not set # CONFIG_MWAVE is not set @@ -548,6 +564,7 @@ # File systems # # CONFIG_QUOTA is not set +# CONFIG_QFMT_V2 is not set CONFIG_AUTOFS_FS=y # CONFIG_AUTOFS4_FS is not set CONFIG_REISERFS_FS=y @@ -557,6 +574,7 @@ # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BEFS_DEBUG is not set # CONFIG_BFS_FS is not set @@ -598,6 +616,7 @@ # CONFIG_UDF_RW is not set # CONFIG_UFS_FS is not set # CONFIG_UFS_FS_WRITE is not set +# CONFIG_SIMICSFS is not set # # Network File Systems @@ -606,6 +625,7 @@ # CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y +# CONFIG_NFS_DIRECTIO is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y @@ -703,17 +723,23 @@ # CONFIG_BLUEZ is not set # +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# # Kernel hacking # CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_SLAB is not set +CONFIG_DEBUG_SLAB=y CONFIG_MAGIC_SYSRQ=y -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_CHECKING is not set +CONFIG_DEBUG_SPINLOCK=y +CONFIG_CHECKING=y # CONFIG_INIT_DEBUG is not set -# CONFIG_IOMMU_DEBUG is not set +CONFIG_IOMMU_DEBUG=y CONFIG_IOMMU_LEAK=y # CONFIG_DEBUG_STACKOVERFLOW is not set +CONFIG_LOG_BUF_SHIFT=17 # # Library routines diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/ia32/ia32_binfmt.c linux-2.4.23-pre8/arch/x86_64/ia32/ia32_binfmt.c --- linux-2.4.22/arch/x86_64/ia32/ia32_binfmt.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/ia32/ia32_binfmt.c 2003-10-22 22:47:38.000000000 +0000 @@ -28,7 +28,6 @@ #define ELF_NAME "elf/i386" -#define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? 0xc0000000 : 0xFFFFe000) #define IA32_STACK_TOP IA32_PAGE_OFFSET #define ELF_ET_DYN_BASE (IA32_PAGE_OFFSET/3 + 0x1000000) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/ia32/ia32_ioctl.c linux-2.4.23-pre8/arch/x86_64/ia32/ia32_ioctl.c --- linux-2.4.22/arch/x86_64/ia32/ia32_ioctl.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/ia32/ia32_ioctl.c 2003-10-22 22:49:21.000000000 +0000 @@ -1,4 +1,4 @@ -/* $Id: ia32_ioctl.c,v 1.34 2003/05/08 06:34:01 ak Exp $ +/* $Id: ia32_ioctl.c,v 1.37 2003/08/20 11:00:23 ak Exp $ * ioctl32.c: Conversion between 32bit and 64bit native ioctls. * * Copyright (C) 1997-2000 Jakub Jelinek (jakub@redhat.com) @@ -2472,6 +2472,9 @@ mm_segment_t old_fs; void *karg = &u; + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + switch (cmd) { case VG_STATUS: v = kmalloc(sizeof(vg_t), GFP_KERNEL); @@ -3535,6 +3538,7 @@ COMPATIBLE_IOCTL(TIOCGPTN) COMPATIBLE_IOCTL(TIOCSPTLCK) COMPATIBLE_IOCTL(TIOCSERGETLSR) +COMPATIBLE_IOCTL(FIOQSIZE) /* Big F */ COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO) COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO) @@ -4416,6 +4420,9 @@ struct ioctl_trans *t; unsigned long hash = ioctl32_hash(cmd); + if (handler == NULL) + handler = (void *)sys_ioctl; + lock_kernel(); for (t = (struct ioctl_trans *)ioctl32_hash_table[hash]; t; @@ -4555,7 +4562,7 @@ "cmd(%08x){%s} arg(%08x) on %s\n", current->comm, current->pid, (int)fd, (unsigned int)cmd, buf, (unsigned int)arg, - IS_ERR(fn) ? "???" : fn); + fn); if (path) free_page((unsigned long)path); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/ia32/ia32_signal.c linux-2.4.23-pre8/arch/x86_64/ia32/ia32_signal.c --- linux-2.4.22/arch/x86_64/ia32/ia32_signal.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/ia32/ia32_signal.c 2003-10-22 22:48:39.000000000 +0000 @@ -7,7 +7,7 @@ * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes * 2000-12-* x86-64 compatibility mode signal handling by Andi Kleen * - * $Id: ia32_signal.c,v 1.31 2003/03/12 08:22:12 ak Exp $ + * $Id: ia32_signal.c,v 1.32 2003/09/06 18:10:44 ak Exp $ */ #include @@ -78,6 +78,10 @@ default: err |= __put_user(from->si_uid, &to->si_uid); break; + case __SI_POLL >> 16: + err |= __put_user(from->si_band, &to->si_band); + err |= __put_user(from->si_fd, &to->si_fd); + break; /* case __SI_RT: This is not generated by the kernel as of now. */ } return err; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/ia32/ia32entry.S linux-2.4.23-pre8/arch/x86_64/ia32/ia32entry.S --- linux-2.4.22/arch/x86_64/ia32/ia32entry.S 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/ia32/ia32entry.S 2003-10-22 22:48:12.000000000 +0000 @@ -3,7 +3,7 @@ * * Copyright 2000,2001 Andi Kleen, SuSE Labs. * - * $Id: ia32entry.S,v 1.40 2003/04/03 09:46:54 ak Exp $ + * $Id: ia32entry.S,v 1.41 2003/09/22 04:25:53 ak Exp $ */ #include @@ -256,10 +256,10 @@ .quad sys32_adjtimex .quad sys32_mprotect /* 125 */ .quad sys32_sigprocmask - .quad sys32_module_warning /* create_module */ - .quad sys32_module_warning /* init_module */ - .quad sys32_module_warning /* delete module */ - .quad sys32_module_warning /* 130 get_kernel_syms */ + .quad sys32_create_module + .quad sys32_init_module + .quad sys32_delete_module + .quad sys32_get_kernel_syms /* 130 */ .quad ni_syscall /* quotactl */ .quad sys_getpgid .quad sys_fchdir @@ -296,7 +296,7 @@ .quad sys_setresuid16 .quad sys_getresuid16 /* 165 */ .quad sys32_vm86_warning /* vm86 */ - .quad quiet_ni_syscall /* query_module */ + .quad sys32_query_module .quad sys_poll .quad sys32_nfsservctl .quad sys_setresgid16 /* 170 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/ia32/ipc32.c linux-2.4.23-pre8/arch/x86_64/ia32/ipc32.c --- linux-2.4.22/arch/x86_64/ia32/ipc32.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/ia32/ipc32.c 2003-10-22 22:48:56.000000000 +0000 @@ -16,6 +16,8 @@ #include +extern int sem_ctls[]; + /* * sys32_ipc() is the de-multiplexer for the SysV IPC calls in 32bit emulation.. * @@ -163,6 +165,7 @@ #define SEMOP 1 #define SEMGET 2 #define SEMCTL 3 +#define SEMTIMEDOP 4 #define MSGSND 11 #define MSGRCV 12 #define MSGGET 13 @@ -638,7 +641,27 @@ switch (call) { case SEMOP: /* struct sembuf is the same on 32 and 64bit :)) */ - return sys_semop(first, (struct sembuf *)AA(ptr), second); + return sys_semtimedop(first, (struct sembuf *)AA(ptr), second, NULL); + case SEMTIMEDOP: { + int err; + mm_segment_t oldfs = get_fs(); + struct timespec32 *ts32 = (struct timespec32 *)AA(fifth); + struct timespec ts; + if ((unsigned)second > sem_ctls[2]) + return -EINVAL; + if (ts32) { + if (get_user(ts.tv_sec, &ts32->tv_sec) || + __get_user(ts.tv_nsec, &ts32->tv_nsec) || + verify_area(VERIFY_READ, (void *)AA(ptr), + second*sizeof(struct sembuf))) + return -EFAULT; + } + set_fs(KERNEL_DS); + err = sys_semtimedop(first, (struct sembuf *)AA(ptr), second, + ts32 ? &ts : NULL); + set_fs(oldfs); + return err; + } case SEMGET: return sys_semget(first, second, third); case SEMCTL: @@ -663,9 +686,7 @@ case SHMCTL: return shmctl32(first, second, (void *)AA(ptr)); - default: - return -EINVAL; } - return -EINVAL; + return -ENOSYS; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/ia32/socket32.c linux-2.4.23-pre8/arch/x86_64/ia32/socket32.c --- linux-2.4.22/arch/x86_64/ia32/socket32.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/ia32/socket32.c 2003-10-22 22:47:56.000000000 +0000 @@ -503,7 +503,6 @@ __u32 filter; } *fprog32 = (struct sock_fprog32 *)optval; struct sock_fprog kfprog; - unsigned int fsize; mm_segment_t old_fs; __u32 uptr; int ret; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/ia32/sys_ia32.c linux-2.4.23-pre8/arch/x86_64/ia32/sys_ia32.c --- linux-2.4.22/arch/x86_64/ia32/sys_ia32.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/ia32/sys_ia32.c 2003-10-22 22:49:30.000000000 +0000 @@ -16,7 +16,7 @@ * * This file assumes that there is a hole at the end of user address space. * - * $Id: sys_ia32.c,v 1.58 2003/05/09 17:21:17 ak Exp $ + * $Id: sys_ia32.c,v 1.62 2003/09/22 04:25:53 ak Exp $ */ #include @@ -56,6 +56,7 @@ #include #include #include +#include #include #include #include @@ -84,6 +85,10 @@ #define low2highgid(gid) ((gid) == (u16)-1) ? (gid_t)-1 : (gid_t)(gid) extern int overflowuid,overflowgid; +typedef u16 old_uid_t; +typedef u16 old_gid_t; + +#include "../../../kernel/uid16.c" static int putstat(struct stat32 *ubuf, struct stat *kbuf) @@ -93,8 +98,8 @@ __put_user (kbuf->st_ino, &ubuf->st_ino) || __put_user (kbuf->st_mode, &ubuf->st_mode) || __put_user (kbuf->st_nlink, &ubuf->st_nlink) || - __put_user (kbuf->st_uid, &ubuf->st_uid) || - __put_user (kbuf->st_gid, &ubuf->st_gid) || + __put_user (high2lowuid(kbuf->st_uid), &ubuf->st_uid) || + __put_user (high2lowgid(kbuf->st_gid), &ubuf->st_gid) || __put_user (kbuf->st_rdev, &ubuf->st_rdev) || __put_user (kbuf->st_size, &ubuf->st_size) || __put_user (kbuf->st_atime, &ubuf->st_atime) || @@ -475,7 +480,13 @@ __put_user (kbuf->f_ffree, &ubuf->f_ffree) || __put_user (kbuf->f_namelen, &ubuf->f_namelen) || __put_user (kbuf->f_fsid.val[0], &ubuf->f_fsid.val[0]) || - __put_user (kbuf->f_fsid.val[1], &ubuf->f_fsid.val[1])) + __put_user (kbuf->f_fsid.val[1], &ubuf->f_fsid.val[1]) || + __put_user (0, &ubuf->f_spare[0]) || + __put_user (0, &ubuf->f_spare[1]) || + __put_user (0, &ubuf->f_spare[2]) || + __put_user (0, &ubuf->f_spare[3]) || + __put_user (0, &ubuf->f_spare[4]) || + __put_user (0, &ubuf->f_spare[5])) return -EFAULT; return 0; } @@ -925,11 +936,6 @@ (struct timeval32 *)A(a.tvp)); } -struct timespec32 { - int tv_sec; - int tv_nsec; -}; - extern asmlinkage long sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp); asmlinkage long @@ -1517,10 +1523,30 @@ struct sysinfo s; int ret; mm_segment_t old_fs = get_fs (); + int bitcount = 0; set_fs (KERNEL_DS); ret = sys_sysinfo(&s); set_fs (old_fs); + + /* Check to see if any memory value is too large for 32-bit and scale + * down if needed + */ + if ((s.totalram >> 32) || (s.totalswap >> 32)) { + while (s.mem_unit < PAGE_SIZE) { + s.mem_unit <<= 1; + bitcount++; + } + s.totalram >>= bitcount; + s.freeram >>= bitcount; + s.sharedram >>= bitcount; + s.bufferram >>= bitcount; + s.totalswap >>= bitcount; + s.freeswap >>= bitcount; + s.totalhigh >>= bitcount; + s.freehigh >>= bitcount; + } + if (verify_area(VERIFY_WRITE, info, sizeof(struct sysinfo32)) || __put_user (s.uptime, &info->uptime) || __put_user (s.loads[0], &info->loads[0]) || @@ -2534,17 +2560,422 @@ } #endif -long sys32_module_warning(void) +#ifdef CONFIG_MODULES + +extern asmlinkage unsigned long sys_create_module(const char *name_user, size_t size); + +asmlinkage unsigned long sys32_create_module(const char *name_user, __kernel_size_t32 size) { - static long warn_time = -(60*HZ); - if (time_before(warn_time + 60*HZ,jiffies) && strcmp(current->comm,"klogd")) { - printk(KERN_INFO "%s: 32bit modutils not supported on 64bit kernel\n", - current->comm); - warn_time = jiffies; + return sys_create_module(name_user, (size_t)size); +} + +extern asmlinkage int sys_init_module(const char *name_user, struct module *mod_user); + +/* Hey, when you're trying to init module, take time and prepare us a nice 64bit + * module structure, even if from 32bit modutils... Why to pollute kernel... :)) + */ +asmlinkage int sys32_init_module(const char *name_user, struct module *mod_user) +{ + return sys_init_module(name_user, mod_user); +} + +extern asmlinkage int sys_delete_module(const char *name_user); + +asmlinkage int sys32_delete_module(const char *name_user) +{ + return sys_delete_module(name_user); +} + +struct module_info32 { + u32 addr; + u32 size; + u32 flags; + s32 usecount; +}; + +/* Query various bits about modules. */ + +static inline long +get_mod_name(const char *user_name, char **buf) +{ + unsigned long page; + long retval; + + if ((unsigned long)user_name >= TASK_SIZE + && !segment_eq(get_fs (), KERNEL_DS)) + return -EFAULT; + + page = __get_free_page(GFP_KERNEL); + if (!page) + return -ENOMEM; + + retval = strncpy_from_user((char *)page, user_name, PAGE_SIZE); + if (retval > 0) { + if (retval < PAGE_SIZE) { + *buf = (char *)page; + return retval; } - return -ENOSYS ; + retval = -ENAMETOOLONG; + } else if (!retval) + retval = -EINVAL; + + free_page(page); + return retval; +} + +static inline void +put_mod_name(char *buf) +{ + free_page((unsigned long)buf); } +static __inline__ struct module *find_module(const char *name) +{ + struct module *mod; + + for (mod = module_list; mod ; mod = mod->next) { + if (mod->flags & MOD_DELETED) + continue; + if (!strcmp(mod->name, name)) + break; + } + + return mod; +} + +static int +qm_modules(char *buf, size_t bufsize, __kernel_size_t32 *ret) +{ + struct module *mod; + size_t nmod, space, len; + + nmod = space = 0; + + for (mod = module_list; mod->next != NULL; mod = mod->next, ++nmod) { + len = strlen(mod->name)+1; + if (len > bufsize) + goto calc_space_needed; + if (copy_to_user(buf, mod->name, len)) + return -EFAULT; + buf += len; + bufsize -= len; + space += len; + } + + if (put_user(nmod, ret)) + return -EFAULT; + else + return 0; + +calc_space_needed: + space += len; + while ((mod = mod->next)->next != NULL) + space += strlen(mod->name)+1; + + if (put_user(space, ret)) + return -EFAULT; + else + return -ENOSPC; +} + +static int +qm_deps(struct module *mod, char *buf, size_t bufsize, __kernel_size_t32 *ret) +{ + size_t i, space, len; + + if (mod->next == NULL) + return -EINVAL; + if (!MOD_CAN_QUERY(mod)) + return put_user(0, ret); + + space = 0; + for (i = 0; i < mod->ndeps; ++i) { + const char *dep_name = mod->deps[i].dep->name; + + len = strlen(dep_name)+1; + if (len > bufsize) + goto calc_space_needed; + if (copy_to_user(buf, dep_name, len)) + return -EFAULT; + buf += len; + bufsize -= len; + space += len; + } + + return put_user(i, ret); + +calc_space_needed: + space += len; + while (++i < mod->ndeps) + space += strlen(mod->deps[i].dep->name)+1; + + if (put_user(space, ret)) + return -EFAULT; + else + return -ENOSPC; +} + +static int +qm_refs(struct module *mod, char *buf, size_t bufsize, __kernel_size_t32 *ret) +{ + size_t nrefs, space, len; + struct module_ref *ref; + + if (mod->next == NULL) + return -EINVAL; + if (!MOD_CAN_QUERY(mod)) + if (put_user(0, ret)) + return -EFAULT; + else + return 0; + + space = 0; + for (nrefs = 0, ref = mod->refs; ref ; ++nrefs, ref = ref->next_ref) { + const char *ref_name = ref->ref->name; + + len = strlen(ref_name)+1; + if (len > bufsize) + goto calc_space_needed; + if (copy_to_user(buf, ref_name, len)) + return -EFAULT; + buf += len; + bufsize -= len; + space += len; + } + + if (put_user(nrefs, ret)) + return -EFAULT; + else + return 0; + +calc_space_needed: + space += len; + while ((ref = ref->next_ref) != NULL) + space += strlen(ref->ref->name)+1; + + if (put_user(space, ret)) + return -EFAULT; + else + return -ENOSPC; +} + +static inline int +qm_symbols(struct module *mod, char *buf, size_t bufsize, __kernel_size_t32 *ret) +{ + size_t i, space, len; + struct module_symbol *s; + char *strings; + unsigned *vals; + + if (!MOD_CAN_QUERY(mod)) + if (put_user(0, ret)) + return -EFAULT; + else + return 0; + + space = mod->nsyms * 2*sizeof(u32); + + i = len = 0; + s = mod->syms; + + if (space > bufsize) + goto calc_space_needed; + + if (!access_ok(VERIFY_WRITE, buf, space)) + return -EFAULT; + + bufsize -= space; + vals = (unsigned *)buf; + strings = buf+space; + + for (; i < mod->nsyms ; ++i, ++s, vals += 2) { + len = strlen(s->name)+1; + if (len > bufsize) + goto calc_space_needed; + + if (copy_to_user(strings, s->name, len) + || __put_user(s->value, vals+0) + || __put_user(space, vals+1)) + return -EFAULT; + + strings += len; + bufsize -= len; + space += len; + } + + if (put_user(i, ret)) + return -EFAULT; + else + return 0; + +calc_space_needed: + for (; i < mod->nsyms; ++i, ++s) + space += strlen(s->name)+1; + + if (put_user(space, ret)) + return -EFAULT; + else + return -ENOSPC; +} + +static inline int +qm_info(struct module *mod, char *buf, size_t bufsize, __kernel_size_t32 *ret) +{ + int error = 0; + + if (mod->next == NULL) + return -EINVAL; + + if (sizeof(struct module_info32) <= bufsize) { + struct module_info32 info; + info.addr = (unsigned long)mod; + info.size = mod->size; + info.flags = mod->flags; + info.usecount = + ((mod_member_present(mod, can_unload) + && mod->can_unload) + ? -1 : atomic_read(&mod->uc.usecount)); + + if (copy_to_user(buf, &info, sizeof(struct module_info32))) + return -EFAULT; + } else + error = -ENOSPC; + + if (put_user(sizeof(struct module_info32), ret)) + return -EFAULT; + + return error; +} + +asmlinkage int sys32_query_module(char *name_user, int which, char *buf, __kernel_size_t32 bufsize, u32 ret) +{ + struct module *mod; + int err; + + lock_kernel(); + if (name_user == 0) { + /* This finds "kernel_module" which is not exported. */ + for(mod = module_list; mod->next != NULL; mod = mod->next) + ; + } else { + long namelen; + char *name; + + if ((namelen = get_mod_name(name_user, &name)) < 0) { + err = namelen; + goto out; + } + err = -ENOENT; + if (namelen == 0) { + /* This finds "kernel_module" which is not exported. */ + for(mod = module_list; mod->next != NULL; mod = mod->next) + ; + } else if ((mod = find_module(name)) == NULL) { + put_mod_name(name); + goto out; + } + put_mod_name(name); + } + + switch (which) + { + case 0: + err = 0; + break; + case QM_MODULES: + err = qm_modules(buf, bufsize, (__kernel_size_t32 *)AA(ret)); + break; + case QM_DEPS: + err = qm_deps(mod, buf, bufsize, (__kernel_size_t32 *)AA(ret)); + break; + case QM_REFS: + err = qm_refs(mod, buf, bufsize, (__kernel_size_t32 *)AA(ret)); + break; + case QM_SYMBOLS: + err = qm_symbols(mod, buf, bufsize, (__kernel_size_t32 *)AA(ret)); + break; + case QM_INFO: + err = qm_info(mod, buf, bufsize, (__kernel_size_t32 *)AA(ret)); + break; + default: + err = -EINVAL; + break; + } +out: + unlock_kernel(); + return err; +} + +struct kernel_sym32 { + u32 value; + char name[60]; +}; + +extern asmlinkage int sys_get_kernel_syms(struct kernel_sym *table); + +asmlinkage int sys32_get_kernel_syms(struct kernel_sym32 *table) +{ + int len, i; + struct kernel_sym *tbl; + mm_segment_t old_fs; + + len = sys_get_kernel_syms(NULL); + if (!table) return len; + tbl = kmalloc (len * sizeof (struct kernel_sym), GFP_KERNEL); + if (!tbl) return -ENOMEM; + old_fs = get_fs(); + set_fs (KERNEL_DS); + sys_get_kernel_syms(tbl); + set_fs (old_fs); + for (i = 0; i < len; i++, table++) { + if (put_user (tbl[i].value, &table->value) || + copy_to_user (table->name, tbl[i].name, 60)) + break; + } + kfree (tbl); + return i; +} + +#else /* CONFIG_MODULES */ + +asmlinkage unsigned long +sys32_create_module(const char *name_user, size_t size) +{ + return -ENOSYS; +} + +asmlinkage int +sys32_init_module(const char *name_user, struct module *mod_user) +{ + return -ENOSYS; +} + +asmlinkage int +sys32_delete_module(const char *name_user) +{ + return -ENOSYS; +} + +asmlinkage int +sys32_query_module(const char *name_user, int which, char *buf, size_t bufsize, + size_t *ret) +{ + /* Let the program know about the new interface. Not that + it'll do them much good. */ + if (which == 0) + return 0; + + return -ENOSYS; +} + +asmlinkage int +sys32_get_kernel_syms(struct kernel_sym *table) +{ + return -ENOSYS; +} + +#endif /* CONFIG_MODULES */ + long sys32_vm86_warning(void) { static long warn_time = -(60*HZ); @@ -2565,7 +2996,7 @@ static int __init ia32_init (void) { - printk("IA32 emulation $Id: sys_ia32.c,v 1.58 2003/05/09 17:21:17 ak Exp $\n"); + printk("IA32 emulation $Id: sys_ia32.c,v 1.62 2003/09/22 04:25:53 ak Exp $\n"); ia32_exec_domain.signal_map = default_exec_domain.signal_map; ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap; register_exec_domain(&ia32_exec_domain); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/acpi.c linux-2.4.23-pre8/arch/x86_64/kernel/acpi.c --- linux-2.4.22/arch/x86_64/kernel/acpi.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/acpi.c 2003-10-22 22:49:45.000000000 +0000 @@ -44,6 +44,7 @@ #include #include +extern int acpi_disabled; #define PREFIX "ACPI: " @@ -352,6 +353,28 @@ #ifdef CONFIG_X86_LOCAL_APIC /* + * ACPI interpreter is required to complete interrupt setup, + * so if it is off, don't enumerate the io-apics with ACPI. + * If MPS is present, it will handle them, + * otherwise the system will stay in PIC mode + */ + if (acpi_disabled) { + return 1; + } + + if (!use_acpi_pci) + return 0; + + /* If "nolocalapic" is specified don't look further */ + extern int apic_disabled; + if (apic_disabled) { + printk(KERN_INFO PREFIX "Skipping Local/IO-APIC probe due to \"nolocalapic\"\n"); + return 0; + } + printk(KERN_INFO PREFIX "Parsing Local APIC info in MADT\n"); + + + /* * MADT * ---- * Parse the Multiple APIC Description Table (MADT), if exists. @@ -412,6 +435,15 @@ #ifdef CONFIG_X86_IO_APIC /* + * if "noapic" boot option, don't look for IO-APICs + */ + if (ioapic_setup_disabled()) { + printk(KERN_INFO PREFIX "Skipping IOAPIC probe " + "due to 'noapic' option.\n"); + return 1; + } + + /* * I/O APIC * -------- */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/acpi_wakeup.S linux-2.4.23-pre8/arch/x86_64/kernel/acpi_wakeup.S --- linux-2.4.22/arch/x86_64/kernel/acpi_wakeup.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/acpi_wakeup.S 2003-10-22 22:48:31.000000000 +0000 @@ -209,7 +209,7 @@ movw $0x0e00 + '!', %ds:(0xb801a) movq saved_eip, %rax - jmp %rax + jmp *%rax .code32 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/bluesmoke.c linux-2.4.23-pre8/arch/x86_64/kernel/bluesmoke.c --- linux-2.4.22/arch/x86_64/kernel/bluesmoke.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/bluesmoke.c 2003-10-22 22:49:19.000000000 +0000 @@ -186,7 +186,7 @@ [0] = "err cpu1", }; -static void check_k8_nb(void) +static void check_k8_nb(int header) { struct pci_dev *nb; nb = find_k8_nb(); @@ -198,6 +198,9 @@ pci_read_config_dword(nb, 0x4c, &statushigh); if (!(statushigh & (1<<31))) return; + if (header) + printk(KERN_ERR "CPU %d: Silent Northbridge MCE\n", smp_processor_id()); + printk(KERN_ERR "Northbridge status %08x%08x\n", statushigh,statuslow); @@ -257,9 +260,11 @@ rdmsrl(MSR_IA32_MCG_STATUS, status); if ((status & (1<<2)) == 0) { if (!regs) - check_k8_nb(); + check_k8_nb(1); return; } + printk(KERN_EMERG "CPU %d: Machine Check Exception: %016Lx\n", smp_processor_id(), status); + if (status & 1) printk(KERN_EMERG "MCG_STATUS: unrecoverable\n"); @@ -277,7 +282,7 @@ if (nbstatus & (1UL<57)) printk(KERN_EMERG "Unrecoverable condition\n"); - check_k8_nb(); + check_k8_nb(0); if (nbstatus & (1UL<<58)) { u64 adr; @@ -338,7 +343,6 @@ { u64 cap; int i; - struct pci_dev *nb; if (!test_bit(X86_FEATURE_MCE, &c->x86_capability) || !test_bit(X86_FEATURE_MCA, &c->x86_capability)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/e820.c linux-2.4.23-pre8/arch/x86_64/kernel/e820.c --- linux-2.4.22/arch/x86_64/kernel/e820.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/e820.c 2003-10-22 22:48:28.000000000 +0000 @@ -1,7 +1,7 @@ /* * Handle the memory map. * The functions here do the job until bootmem takes over. - * $Id: e820.c,v 1.6 2002/10/15 09:35:16 ak Exp $ + * $Id: e820.c,v 1.10 2003/09/25 03:22:05 ak Exp $ */ #include #include @@ -12,6 +12,8 @@ #include #include #include +#include +#include #include extern unsigned long table_start, table_end; @@ -488,7 +490,6 @@ mem_size = ALT_MEM_K; who = "BIOS-e801"; } - e820.nr_map = 0; add_memory_region(0, LOWMEMSIZE(), E820_RAM); add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM); @@ -500,7 +501,6 @@ extern char command_line[], saved_command_line[]; extern int fallback_aper_order; extern int iommu_setup(char *opt); -extern int acpi_disabled; void __init parse_mem_cmdline (char ** cmdline_p) { @@ -541,6 +541,22 @@ #endif else if (!memcmp(from, "acpi=off", 8)) acpi_disabled = 1; + else if (!memcmp(from,"maxcpus=0",9)) { + disable_ioapic_setup(); + apic_disabled = 1; + } + + else if (!memcmp(from, "noapic", 6)) + disable_ioapic_setup(); + else if (!memcmp(from, "nolocalapic", 11) || !memcmp(from,"nolapic",7)) + apic_disabled = 1; + else if (!memcmp(from, "pci=noacpi", 10)) + use_acpi_pci = 0; + else if (!memcmp(from,"apic",4)) { + extern int ioapic_force; + ioapic_force = 1; + skip_ioapic_setup = 0; + } next: c = *(from++); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/head.S linux-2.4.23-pre8/arch/x86_64/kernel/head.S --- linux-2.4.22/arch/x86_64/kernel/head.S 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/head.S 2003-10-22 22:49:05.000000000 +0000 @@ -6,7 +6,7 @@ * Copyright (C) 2000 Karsten Keil * Copyright (C) 2001,2002 Andi Kleen * - * $Id: head.S,v 1.56 2003/05/12 14:38:43 ak Exp $ + * $Id: head.S,v 1.57 2003/07/11 15:58:46 ak Exp $ */ @@ -312,7 +312,8 @@ ENTRY(level3_physmem_pgt) .quad 0x0000000000105007 /* -> level2_kernel_pgt (so that __va works even before pagetable_init) */ -.org 0xb000 + .org 0xb000 +#ifdef CONFIG_ACPI_SLEEP ENTRY(wakeup_level4_pgt) .quad 0x0000000000102007 /* -> level3_ident_pgt */ .fill 255,8,0 @@ -320,6 +321,7 @@ .fill 254,8,0 /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */ .quad 0x0000000000103007 /* -> level3_kernel_pgt */ +#endif .data diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/io_apic.c linux-2.4.23-pre8/arch/x86_64/kernel/io_apic.c --- linux-2.4.22/arch/x86_64/kernel/io_apic.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/io_apic.c 2003-10-22 22:48:26.000000000 +0000 @@ -165,6 +165,14 @@ struct IO_APIC_route_entry entry; unsigned long flags; + /* Check delivery_mode to be sure we're not clearing an SMI pin */ + spin_lock_irqsave(&ioapic_lock, flags); + *(((int*)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin); + *(((int*)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin); + spin_unlock_irqrestore(&ioapic_lock, flags); + if (entry.delivery_mode == dest_SMI) + return; + /* * Disable it in the IO-APIC irq-routing table: */ @@ -194,9 +202,11 @@ int pirq_entries [MAX_PIRQS]; int pirqs_enabled; int skip_ioapic_setup; +int ioapic_force; static int __init noioapic_setup(char *str) { + ioapic_force = 1; skip_ioapic_setup = 1; return 1; } @@ -205,12 +215,66 @@ static int __init ioapic_setup(char *str) { + ioapic_force = 1; skip_ioapic_setup = 0; return 1; } __setup("apic", ioapic_setup); +#ifndef CONFIG_SMP +#include +#include +#include + +/* Temporary Hack. Nvidia and VIA boards currently only work with IO-APIC + off. Check for an Nvidia or VIA PCI bridge and turn it off. + Use pci direct infrastructure because this runs before the PCI subsystem. + + Can be overwritten with "apic" */ +void __init check_ioapic(void) +{ + int num,slot,func; + if (ioapic_force) + return; + + /* Poor man's PCI discovery */ + for (num = 0; num < 32; num++) { + for (slot = 0; slot < 32; slot++) { + for (func = 0; func < 8; func++) { + u32 class; + u32 vendor; + class = read_pci_config(num,slot,func, + PCI_CLASS_REVISION); + if (class == 0xffffffff) + break; + + if ((class >> 16) != PCI_CLASS_BRIDGE_PCI) + continue; + + vendor = read_pci_config(num, slot, func, + PCI_VENDOR_ID); + vendor &= 0xffff; + switch (vendor) { + case PCI_VENDOR_ID_NVIDIA: + case PCI_VENDOR_ID_VIA: + printk(KERN_INFO + "PCI bridge %02x:%02x from %x found. Setting \"noapic\". Overwrite with \"apic\"\n", + num,slot,vendor); + skip_ioapic_setup = 1; + return; + } + + /* No multi-function device? */ + u8 type = read_pci_config_byte(num,slot,func, + PCI_HEADER_TYPE); + if (!(type & 0x80)) + break; + } + } + } +} +#endif static int __init ioapic_pirq_setup(char *str) { @@ -1762,7 +1826,7 @@ } -int io_apic_set_pci_routing (int ioapic, int pin, int irq) +int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level ,int active_high_low) { struct IO_APIC_route_entry entry; unsigned long flags; @@ -1785,18 +1849,21 @@ entry.dest_mode = INT_DELIVERY_MODE; entry.dest.logical.logical_dest = TARGET_CPUS; entry.mask = 1; /* Disabled (masked) */ - entry.trigger = 1; /* Level sensitive */ - entry.polarity = 1; /* Low active */ + entry.trigger = edge_level; + entry.polarity = active_high_low; add_pin_to_irq(irq, ioapic, pin); entry.vector = assign_irq_vector(irq); printk(KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> " - "IRQ %d)\n", ioapic, - mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq); + "IRQ %d) Mode:%i Active:%i\n", ioapic, + mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq, edge_level, active_high_low); - irq_desc[irq].handler = &ioapic_level_irq_type; + if (edge_level) + irq_desc[irq].handler = &ioapic_level_irq_type; + else + irq_desc[irq].handler = &ioapic_edge_irq_type; set_intr_gate(entry.vector, interrupt[irq]); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/ioport.c linux-2.4.23-pre8/arch/x86_64/kernel/ioport.c --- linux-2.4.22/arch/x86_64/kernel/ioport.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/ioport.c 2003-10-22 22:48:41.000000000 +0000 @@ -19,35 +19,13 @@ /* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */ static void set_bitmap(unsigned long *bitmap, short base, short extent, int new_value) { - unsigned long mask; - unsigned long *bitmap_base = bitmap + base / sizeof(long); - unsigned low_index = base & (BITS_PER_LONG - 1); - int length = low_index + extent; - - if (low_index != 0) { - mask = (~0UL << low_index); - if (length < 64) - mask &= ~(~0UL << length); + int i; if (new_value) - *bitmap_base++ |= mask; + for (i = base; i < base + extent; i++) + __set_bit(i, bitmap); else - *bitmap_base++ &= ~mask; - length -= 64; - } - - mask = (new_value ? ~0UL : 0UL); - while (length >= 64) { - *bitmap_base++ = mask; - length -= 64; - } - - if (length > 0) { - mask = ~(~0UL << length); - if (new_value) - *bitmap_base++ |= mask; - else - *bitmap_base++ &= ~mask; - } + for (i = base; i < base + extent; i++) + clear_bit(i, bitmap); } /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/irq.c linux-2.4.23-pre8/arch/x86_64/kernel/irq.c --- linux-2.4.22/arch/x86_64/kernel/irq.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/irq.c 2003-10-22 22:47:59.000000000 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -154,57 +155,56 @@ * Generic, controller-independent functions: */ -int get_irq_list(char *buf) +int show_interrupts(struct seq_file *p, void *v) { int i, j; struct irqaction * action; - char *p = buf; - p += sprintf(p, " "); + seq_printf(p, " "); for (j=0; jtypename); - p += sprintf(p, " %s", action->name); + seq_printf(p, " %14s", irq_desc[i].handler->typename); + seq_printf(p, " %s", action->name); for (action=action->next; action; action = action->next) - p += sprintf(p, ", %s", action->name); - *p++ = '\n'; + seq_printf(p, ", %s", action->name); + seq_putc(p,'\n'); } - p += sprintf(p, "NMI: "); + seq_printf(p, "NMI: "); for (j = 0; j < smp_num_cpus; j++) - p += sprintf(p, "%10u ", + seq_printf(p, "%10u ", nmi_count(cpu_logical_map(j))); - p += sprintf(p, "\n"); + seq_printf(p, "\n"); #if CONFIG_X86_LOCAL_APIC - p += sprintf(p, "LOC: "); + seq_printf(p, "LOC: "); for (j = 0; j < smp_num_cpus; j++) - p += sprintf(p, "%10u ", + seq_printf(p, "%10u ", apic_timer_irqs[cpu_logical_map(j)]); - p += sprintf(p, "\n"); + seq_printf(p, "\n"); #endif - p += sprintf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); + seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); #ifdef CONFIG_X86_IO_APIC #ifdef APIC_MISMATCH_DEBUG - p += sprintf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); + seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); #endif #endif - return p - buf; -} + return 0; +} /* * Global interrupt locks for SMP. Allow interrupts to come in on any diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/mpparse.c linux-2.4.23-pre8/arch/x86_64/kernel/mpparse.c --- linux-2.4.22/arch/x86_64/kernel/mpparse.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/mpparse.c 2003-10-22 22:48:24.000000000 +0000 @@ -139,9 +139,12 @@ str[6] = 0; Dprintk("Bus #%d is %s\n", m->mpc_busid, str); - if (m->mpc_busid >= MAX_MP_BUSSES) { +#if MAX_MP_BUSSES < 256 + if ((long)m->mpc_busid >= MAX_MP_BUSSES) { printk(KERN_ERR "MAX_MP_BUSSES ERROR mpc_busid %d, max %d\n", m->mpc_busid, MAX_MP_BUSSES); - } else if (strncmp(str, "ISA", 3) == 0) { + } else +#endif + if (strncmp(str, "ISA", 3) == 0) { mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA; } else if (strncmp(str, "EISA", 4) == 0) { mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA; @@ -713,7 +716,7 @@ return i; } - printk(KERN_ERR "ERROR: Unable to locate IOAPIC for IRQ %d/n", irq); + printk(KERN_ERR "ERROR: Unable to locate IOAPIC for IRQ %d\n", irq); return -1; } @@ -756,7 +759,7 @@ mp_ioapic_routing[idx].irq_end = irq_base + io_apic_get_redir_entries(idx); - printk("IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, " + printk("IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " "IRQ %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr, mp_ioapic_routing[idx].irq_start, @@ -883,8 +886,6 @@ #ifndef CONFIG_ACPI_HT_ONLY -/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */ - extern FADT_DESCRIPTOR acpi_fadt; void __init mp_config_ioapic_for_sci(int irq) @@ -893,6 +894,7 @@ int ioapic_pin; struct acpi_table_madt* madt; struct acpi_table_int_src_ovr *entry = NULL; + acpi_interrupt_flags flags; void *madt_end; acpi_status status; @@ -911,23 +913,42 @@ while ((void *) entry < madt_end) { if (entry->header.type == ACPI_MADT_INT_SRC_OVR && - acpi_fadt.sci_int == entry->global_irq) - return; + acpi_fadt.sci_int == entry->bus_irq) + goto found; entry = (struct acpi_table_int_src_ovr *) ((unsigned long) entry + entry->header.length); } } + /* + * Although the ACPI spec says that the SCI should be level/low + * don't reprogram it unless there is an explicit MADT OVR entry + * instructing us to do so -- otherwise we break Tyan boards which + * have the SCI wired edge/high but no MADT OVR. + */ + return; + +found: + /* + * See the note at the end of ACPI 2.0b section + * 5.2.10.8 for what this is about. + */ + flags = entry->flags; + acpi_fadt.sci_int = entry->global_irq; + irq = entry->global_irq; ioapic = mp_find_ioapic(irq); ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start; - io_apic_set_pci_routing(ioapic, ioapic_pin, irq); + io_apic_set_pci_routing(ioapic, ioapic_pin, irq, + (flags.trigger >> 1) , (flags.polarity >> 1)); } #endif /*CONFIG_ACPI_HT_ONLY*/ +int acpi_tolerant; + #ifdef CONFIG_ACPI_PCI void __init mp_parse_prt (void) @@ -939,6 +960,8 @@ int ioapic_pin = 0; int irq = 0; int idx, bit = 0; + int edge_level = 0; + int active_high_low = 0; /* * Parsing through the PCI Interrupt Routing Table (PRT) and program @@ -949,13 +972,23 @@ /* Need to get irq for dynamic entry */ if (entry->link.handle) { - irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index); + irq = acpi_pci_link_get_irq(entry->link.handle, entry->link.index, &edge_level, &active_high_low); if (!irq) continue; - } else + } else { + edge_level = 1; + active_high_low = 1; irq = entry->link.index; + } irq = entry->link.index; + + /* 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*/ + continue; + } + ioapic = mp_find_ioapic(irq); if (ioapic < 0) continue; @@ -983,7 +1016,7 @@ mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<irq = irq; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/nmi.c linux-2.4.23-pre8/arch/x86_64/kernel/nmi.c --- linux-2.4.22/arch/x86_64/kernel/nmi.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/nmi.c 2003-10-22 22:48:19.000000000 +0000 @@ -30,6 +30,7 @@ unsigned int nmi_watchdog = NMI_LOCAL_APIC; static unsigned int nmi_hz = HZ; unsigned int nmi_perfctr_msr; /* the MSR to reset in NMI handler */ +int panic_on_timeout; int nmi_watchdog_disabled; @@ -121,6 +122,13 @@ { int nmi; + if (!strncmp(str,"panic",5)) { + panic_on_timeout = 1; + str = strchr(str, ','); + if (!str) + return 1; + ++str; + } get_option(&str, &nmi); if (nmi >= NMI_INVALID) @@ -380,6 +388,8 @@ bust_spinlocks(1); printk("NMI Watchdog detected LOCKUP on CPU%d, eip %16lx, registers:\n", cpu, regs->rip); show_registers(regs); + if (panic_on_timeout) + panic("NMI lockup"); printk("console shuts up ...\n"); console_silent(); spin_unlock(&nmi_print_lock); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/pci-gart.c linux-2.4.23-pre8/arch/x86_64/kernel/pci-gart.c --- linux-2.4.22/arch/x86_64/kernel/pci-gart.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/pci-gart.c 2003-10-22 22:47:38.000000000 +0000 @@ -8,7 +8,7 @@ * See Documentation/DMA-mapping.txt for the interface specification. * * Copyright 2002 Andi Kleen, SuSE Labs. - * $Id: pci-gart.c,v 1.27 2003/08/05 18:25:31 ak Exp $ + * $Id: pci-gart.c,v 1.28 2003/09/19 07:01:58 ak Exp $ */ #include @@ -588,9 +588,12 @@ if (!memcmp(p, "memaper", 7)) { fallback_aper_force = 1; p += 7; - if (*p == '=' && get_option(&p, &arg)) + if (*p == '=') { + ++p; + if (get_option(&p, &arg)) fallback_aper_order = arg; } + } #ifdef CONFIG_IOMMU_LEAK if (!memcmp(p,"leak", 4)) { leak_trace = 1; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/pci-pc.c linux-2.4.23-pre8/arch/x86_64/kernel/pci-pc.c --- linux-2.4.22/arch/x86_64/kernel/pci-pc.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/pci-pc.c 2003-10-22 22:49:10.000000000 +0000 @@ -23,9 +23,11 @@ #include #include #include +#include #include "pci-x86_64.h" +int use_acpi_pci = 1; unsigned int pci_probe = PCI_PROBE_CONF1 | PCI_PROBE_CONF2; int pcibios_last_bus = -1; @@ -588,7 +590,7 @@ printk(KERN_INFO "PCI: Probing PCI hardware\n"); #ifdef CONFIG_ACPI_PCI - if (!acpi_pci_irq_init()) + if (!acpi_disabled && use_acpi_pci && !acpi_pci_irq_init()) pci_using_acpi_prt = 1; #endif if (!pci_using_acpi_prt) { @@ -661,7 +663,7 @@ return err; #ifdef CONFIG_ACPI_PCI - if (pci_using_acpi_prt) { + if (use_acpi_pci && pci_using_acpi_prt) { acpi_pci_irq_enable(dev); return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/pci-x86_64.c linux-2.4.23-pre8/arch/x86_64/kernel/pci-x86_64.c --- linux-2.4.22/arch/x86_64/kernel/pci-x86_64.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/pci-x86_64.c 2003-10-22 22:49:09.000000000 +0000 @@ -294,6 +294,17 @@ } } +void __init pcibios_set_cacheline_size(void) +{ + struct cpuinfo_x86 *c = &boot_cpu_data; + + pci_cache_line_size = 32 >> 2; + if (c->x86 >= 6 && c->x86_vendor == X86_VENDOR_AMD) + pci_cache_line_size = 64 >> 2; /* K7 & K8 */ + else if (c->x86 > 6 && c->x86_vendor == X86_VENDOR_INTEL) + pci_cache_line_size = 128 >> 2; /* P4 */ +} + void __init pcibios_resource_survey(void) { DBG("PCI: Allocating resources\n"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/pci-x86_64.h linux-2.4.23-pre8/arch/x86_64/kernel/pci-x86_64.h --- linux-2.4.22/arch/x86_64/kernel/pci-x86_64.h 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/pci-x86_64.h 2003-10-22 22:47:36.000000000 +0000 @@ -27,8 +27,10 @@ /* pci-i386.c */ extern unsigned int pcibios_max_latency; +extern u8 pci_cache_line_size; void pcibios_resource_survey(void); +void pcibios_set_cacheline_size(void); int pcibios_enable_resources(struct pci_dev *, int mask); /* pci-pc.c */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/process.c linux-2.4.23-pre8/arch/x86_64/kernel/process.c --- linux-2.4.22/arch/x86_64/kernel/process.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/process.c 2003-10-22 22:48:34.000000000 +0000 @@ -9,7 +9,7 @@ * X86-64 port * Andi Kleen. * - * $Id: process.c,v 1.70 2003/06/09 05:18:21 ak Exp $ + * $Id: process.c,v 1.74 2003/08/13 13:43:16 ak Exp $ */ /* @@ -168,7 +168,7 @@ static int reboot_mode = 0; /* reboot=b[ios] | t[riple] | k[bd] [, [w]arm | [c]old] - bios Use the CPU reboto vector for warm reset + bios Use the CPU reboot vector for warm reset warm Don't set the cold reboot flag cold Set the cold reboto flag triple Force a triple fault (init) @@ -227,7 +227,7 @@ [target] "b" (WARMBOOT_TRAMP)); } -static inline void kb_wait(void) +static void kb_wait(void) { int i; @@ -252,6 +252,7 @@ /* AP calling this. Just halt */ if (cpuid != boot_cpu_id) { + printk("CPU %d SMP halt\n", cpuid); for (;;) asm("hlt"); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/setup.c linux-2.4.23-pre8/arch/x86_64/kernel/setup.c --- linux-2.4.22/arch/x86_64/kernel/setup.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/setup.c 2003-10-22 22:48:00.000000000 +0000 @@ -48,7 +48,7 @@ #include #include -int acpi_disabled __initdata = 0; +int acpi_disabled = 0; /* * Machine setup.. @@ -295,6 +295,11 @@ #endif paging_init(); +#if !defined(CONFIG_SMP) && defined(CONFIG_X86_IO_APIC) + extern void check_ioapic(void); + check_ioapic(); +#endif + #ifdef CONFIG_ACPI_BOOT /* * Parse the ACPI tables for possible boot-time SMP configuration. @@ -377,7 +382,10 @@ c->x86_cache_size=(ecx>>24)+(edx>>24); if (n >= 0x80000006) { printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line/%d way)\n", - ecx_2>>16, ecx_2&0xFF, (ecx_2>>12)&0xf); + ecx_2>>16, ecx_2&0xFF, + /* use bits[15:13] as power of 2 for # of ways */ + 1 << ((ecx>>13) & 0x7) + /* Direct and Full associative L2 are very unlikely */); c->x86_cache_size = ecx_2 >> 16; c->x86_tlbsize = ((ebx>>16)&0xff) + ((ebx_2>>16)&0xfff) + (ebx&0xff) + ((ebx_2)&0xfff); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/setup64.c linux-2.4.23-pre8/arch/x86_64/kernel/setup64.c --- linux-2.4.22/arch/x86_64/kernel/setup64.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/setup64.c 2003-10-22 22:49:41.000000000 +0000 @@ -3,7 +3,7 @@ * Copyright (C) 1995 Linus Torvalds * Copyright 2001, 2002 SuSE Labs / Andi Kleen. * See setup.c for older changelog. - * $Id: setup64.c,v 1.23 2003/05/16 14:22:27 ak Exp $ + * $Id: setup64.c,v 1.25 2003/07/11 15:58:47 ak Exp $ */ #include #include diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/signal.c linux-2.4.23-pre8/arch/x86_64/kernel/signal.c --- linux-2.4.22/arch/x86_64/kernel/signal.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/signal.c 2003-10-22 22:49:10.000000000 +0000 @@ -8,7 +8,7 @@ * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes * 2000-2001 x86-64 support by Andi Kleen * - * $Id: signal.c,v 1.42 2003/02/24 21:06:02 ak Exp $ + * $Id: signal.c,v 1.43 2003/09/06 18:10:44 ak Exp $ */ #include @@ -71,6 +71,10 @@ default: err |= __put_user(from->si_uid, &to->si_uid); break; + case __SI_POLL >> 16: + err |= __put_user(from->si_band, &to->si_band); + err |= __put_user(from->si_fd, &to->si_fd); + break; /* case __SI_RT: This is not generated by the kernel as of now. */ } return err; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/smpboot.c linux-2.4.23-pre8/arch/x86_64/kernel/smpboot.c --- linux-2.4.22/arch/x86_64/kernel/smpboot.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/smpboot.c 2003-10-22 22:49:19.000000000 +0000 @@ -50,6 +50,7 @@ #include #include #include +#include /* Setup configured maximum number of CPUs to activate */ static int max_cpus = -1; @@ -863,7 +864,7 @@ * If we couldnt find an SMP configuration at boot time, * get out of here now! */ - if (!smp_found_config) { + if (!smp_found_config && !acpi_lapic) { printk(KERN_NOTICE "SMP motherboard not detected.\n"); io_apic_irqs = 0; cpu_online_map = phys_cpu_present_map = 1; @@ -907,10 +908,8 @@ if (!max_cpus) { smp_found_config = 0; printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n"); - io_apic_irqs = 0; cpu_online_map = phys_cpu_present_map = 1; smp_num_cpus = 1; - apic_disabled = 1; goto smp_done; } @@ -1012,6 +1011,9 @@ if (cpu_has_tsc && cpucount) synchronize_tsc_bp(); + if (nmi_watchdog != 0) + check_nmi_watchdog(); + smp_done: zap_low_mappings(); time_init_smp(); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/suspend.c linux-2.4.23-pre8/arch/x86_64/kernel/suspend.c --- linux-2.4.22/arch/x86_64/kernel/suspend.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/suspend.c 2003-10-22 22:48:20.000000000 +0000 @@ -5,6 +5,9 @@ * * Copyright (c) 2002 Pavel Machek * Copyright (c) 2001 Patrick Mochel + * + * AK currently useless for 24 because the core ACPI code doesn't support S3. + * and most of the infrastructure is missing. */ #include diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/sys_x86_64.c linux-2.4.23-pre8/arch/x86_64/kernel/sys_x86_64.c --- linux-2.4.22/arch/x86_64/kernel/sys_x86_64.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/sys_x86_64.c 2003-10-22 22:47:38.000000000 +0000 @@ -128,3 +128,17 @@ unsigned long raddr; return sys_shmat(shmid,shmaddr,shmflg,&raddr) ?: raddr; } + +asmlinkage long sys_time64(long * tloc) +{ + struct timeval now; + int i; + + do_gettimeofday(&now); + i = now.tv_sec; + if (tloc) { + if (put_user(i,tloc)) + i = -EFAULT; + } + return i; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/traps.c linux-2.4.23-pre8/arch/x86_64/kernel/traps.c --- linux-2.4.22/arch/x86_64/kernel/traps.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/traps.c 2003-10-22 22:47:54.000000000 +0000 @@ -7,7 +7,7 @@ * Pentium III FXSR, SSE support * Gareth Hughes , May 2000 * - * $Id: traps.c,v 1.66 2003/06/09 05:18:21 ak Exp $ + * $Id: traps.c,v 1.69 2003/09/21 04:54:09 ak Exp $ */ /* @@ -81,7 +81,7 @@ struct notifier_block *die_chain; -int kstack_depth_to_print = 40; +int kstack_depth_to_print = 12; #ifdef CONFIG_KALLSYMS #include @@ -342,18 +342,25 @@ spinlock_t die_lock = SPIN_LOCK_UNLOCKED; int die_owner = -1; -void die(const char * str, struct pt_regs * regs, long err) +void __die(const char * str, struct pt_regs * regs, long err) +{ + printk(KERN_EMERG "%s: %04lx\n", str, err & 0xffff); + notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV); + show_registers(regs); + /* Execute summary in case the oops scrolled away */ + printk(KERN_EMERG "RIP "); + printk_address(regs->rip); + printk(" RSP <%016lx>\n", regs->rsp); +} + +void prepare_die(unsigned long *flags) { - unsigned long flags; int cpu; console_verbose(); bust_spinlocks(1); - handle_BUG(regs); - printk(KERN_EMERG "%s: %04lx\n", str, err & 0xffff); - notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV); cpu = safe_smp_processor_id(); /* racy, but better than risking deadlock. */ - __save_flags(flags); + __save_flags(*flags); __cli(); if (!spin_trylock(&die_lock)) { if (cpu == die_owner) @@ -362,9 +369,23 @@ spin_lock(&die_lock); } die_owner = cpu; - show_registers(regs); - bust_spinlocks(0); +} + +void exit_die(unsigned long flags) +{ + die_owner = -1; spin_unlock_irqrestore(&die_lock, flags); + __sti(); /* back scroll should work */ + bust_spinlocks(0); +} + +void die(const char * str, struct pt_regs * regs, long err) +{ + unsigned long flags; + prepare_die(&flags); + handle_BUG(regs); + __die(str, regs, err); + exit_die(flags); do_exit(SIGSEGV); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/kernel/x8664_ksyms.c linux-2.4.23-pre8/arch/x86_64/kernel/x8664_ksyms.c --- linux-2.4.22/arch/x86_64/kernel/x8664_ksyms.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/kernel/x8664_ksyms.c 2003-10-22 22:49:06.000000000 +0000 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -222,4 +223,6 @@ #endif extern void int_ret_from_sys_call(void); -EXPORT_SYMBOL(int_ret_from_sys_call); +EXPORT_SYMBOL_NOVERS(int_ret_from_sys_call); + +EXPORT_SYMBOL(touch_nmi_watchdog); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/lib/copy_page.S linux-2.4.23-pre8/arch/x86_64/lib/copy_page.S --- linux-2.4.22/arch/x86_64/lib/copy_page.S 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/lib/copy_page.S 2003-10-22 22:47:28.000000000 +0000 @@ -10,14 +10,8 @@ copy_page: prefetch (%rsi) prefetch 1*64(%rsi) - prefetch 2*64(%rsi) - prefetch 3*64(%rsi) - prefetch 4*64(%rsi) prefetchw (%rdi) prefetchw 1*64(%rdi) - prefetchw 2*64(%rdi) - prefetchw 3*64(%rdi) - prefetchw 4*64(%rdi) subq $3*8,%rsp movq %rbx,(%rsp) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/lib/copy_user.S linux-2.4.23-pre8/arch/x86_64/lib/copy_user.S --- linux-2.4.22/arch/x86_64/lib/copy_user.S 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/lib/copy_user.S 2003-10-22 22:48:36.000000000 +0000 @@ -4,7 +4,7 @@ * Functions to copy from and to user space. */ -#define FIX_ALIGNMENT 1 +/* #define FIX_ALIGNMENT 1 */ #include #include @@ -59,9 +59,8 @@ .globl copy_user_generic .p2align 4 copy_user_generic: - /* Put the first cacheline into cache. This should handle - the small movements in ioctls etc., but not penalize the bigger - filesystem data copies too much. */ + prefetch (%rsi) + prefetchw (%rdi) pushq %rbx xorl %eax,%eax /*zero for the exception handler */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/lib/csum-copy.S linux-2.4.23-pre8/arch/x86_64/lib/csum-copy.S --- linux-2.4.22/arch/x86_64/lib/csum-copy.S 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/lib/csum-copy.S 2003-10-22 22:49:15.000000000 +0000 @@ -56,29 +56,18 @@ .globl csum_partial_copy_generic .p2align 4 csum_partial_copy_generic: - cmpl $3*64,%edx + cmpl $2*64,%edx jle .Lignore ignore - prefetch (%rdi) - ignore prefetch 1*64(%rdi) ignore prefetch 2*64(%rdi) ignore - prefetch 3*64(%rdi) - ignore - prefetch 4*64(%rdi) - ignore prefetchw (%rsi) ignore prefetchw 1*64(%rsi) ignore - prefetchw 2*64(%rsi) - ignore - prefetchw 3*64(%rsi) - ignore - prefetchw 4*64(%rsi) .Lignore: subq $7*8,%rsp @@ -126,9 +115,6 @@ source movq 56(%rdi),%r13 - ignore 2f - prefetch 5*64(%rdi) -2: adcq %rbx,%rax adcq %r8,%rax adcq %r11,%rax @@ -158,10 +144,6 @@ dest movq %r13,56(%rsi) - ignore 3f - prefetchw 5*64(%rsi) -3: - leaq 64(%rdi),%rdi leaq 64(%rsi),%rsi diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/lib/usercopy.c linux-2.4.23-pre8/arch/x86_64/lib/usercopy.c --- linux-2.4.22/arch/x86_64/lib/usercopy.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/lib/usercopy.c 2003-10-22 22:49:02.000000000 +0000 @@ -68,7 +68,7 @@ asm volatile( " testq %[size8],%[size8]\n" " jz 4f\n" - "0: movnti %[zero],(%[dst])\n" + "0: movq %[zero],(%[dst])\n" " addq %[eight],%[dst]\n" " decl %%ecx ; jnz 0b\n" "4: movq %[size1],%%rcx\n" @@ -77,7 +77,7 @@ "1: movb %b[zero],(%[dst])\n" " incq %[dst]\n" " decl %%ecx ; jnz 1b\n" - "2: sfence\n" + "2:\n" ".section .fixup,\"ax\"\n" "3: lea 0(%[size1],%[size8],8),%[size8]\n" " jmp 2b\n" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/mm/fault.c linux-2.4.23-pre8/arch/x86_64/mm/fault.c --- linux-2.4.22/arch/x86_64/mm/fault.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/mm/fault.c 2003-10-22 22:49:50.000000000 +0000 @@ -94,6 +94,85 @@ printk("BAD\n"); } +/* Sometimes the CPU reports invalid exceptions on prefetch. + Check that here and ignore. + Opcode checker based on code by Richard Brunner */ +static int is_prefetch(struct pt_regs *regs, unsigned long addr) +{ + unsigned char *instr = (unsigned char *)(regs->rip); + int scan_more = 1; + int prefetch = 0; + unsigned char *max_instr = instr + 15; + + /* Avoid recursive faults for this common case */ + if (regs->rip == addr) + return 0; + + if (regs->cs & (1<<2)) + return 0; + + while (scan_more && instr < max_instr) { + unsigned char opcode; + unsigned char instr_hi; + unsigned char instr_lo; + + if (__get_user(opcode, instr)) + break; + + instr_hi = opcode & 0xf0; + instr_lo = opcode & 0x0f; + instr++; + + switch (instr_hi) { + case 0x20: + case 0x30: + /* Values 0x26,0x2E,0x36,0x3E are valid x86 + prefixes. In long mode, the CPU will signal + invalid opcode if some of these prefixes are + present so we will never get here anyway */ + scan_more = ((instr_lo & 7) == 0x6); + break; + + case 0x40: + /* In AMD64 long mode, 0x40 to 0x4F are valid REX prefixes + Need to figure out under what instruction mode the + instruction was issued ... */ + /* Could check the LDT for lm, but for now it's good + enough to assume that long mode only uses well known + segments or kernel. */ + scan_more = ((regs->cs & 3) == 0) || (regs->cs == __USER_CS); + break; + + case 0x60: + /* 0x64 thru 0x67 are valid prefixes in all modes. */ + scan_more = (instr_lo & 0xC) == 0x4; + break; + case 0xF0: + /* 0xF0, 0xF2, and 0xF3 are valid prefixes in all modes. */ + scan_more = !instr_lo || (instr_lo>>1) == 1; + break; + case 0x00: + /* Prefetch instruction is 0x0F0D or 0x0F18 */ + scan_more = 0; + if (__get_user(opcode, instr)) + break; + prefetch = (instr_lo == 0xF) && + (opcode == 0x0D || opcode == 0x18); + break; + default: + scan_more = 0; + break; + } + } + +#if 0 + if (prefetch) + printk("%s: prefetch caused page fault at %lx/%lx\n", current->comm, + regs->rip, addr); +#endif + return prefetch; +} + int page_fault_trace; int exception_trace = 1; @@ -156,7 +235,7 @@ * context, we must not take the fault.. */ if (in_interrupt() || !mm) - goto no_context; + goto bad_area_nosemaphore; again: down_read(&mm->mmap_sem); @@ -226,9 +305,11 @@ up_read(&mm->mmap_sem); bad_area_nosemaphore: - /* User mode accesses just cause a SIGSEGV */ if (error_code & 4) { + if (is_prefetch(regs, address)) + return; + if (exception_trace && !(tsk->ptrace & PT_PTRACED) && (tsk->sig->action[SIGSEGV-1].sa.sa_handler == SIG_IGN || (tsk->sig->action[SIGSEGV-1].sa.sa_handler == SIG_DFL))) @@ -260,40 +341,27 @@ return; } + if (is_prefetch(regs, address)) + return; + /* * Oops. The kernel tried to access some bad page. We'll have to * terminate things with extreme prejudice. */ - console_verbose(); - bust_spinlocks(1); - - int cpu = safe_smp_processor_id(); unsigned long flags; - extern int die_owner; - extern spinlock_t die_lock; - - __save_flags(flags); - __cli(); - if (!spin_trylock(&die_lock)) { - if (cpu == die_owner) - /* nested oops. should stop eventually */; - else - spin_lock(&die_lock); - } - die_owner = cpu; - + prepare_die(&flags); if (address < PAGE_SIZE) printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); else printk(KERN_ALERT "Unable to handle kernel paging request"); - printk(" at virtual address %016lx\n",address); - printk(" printing rip:\n"); - printk("%016lx\n", regs->rip); + printk(KERN_ALERT " at %016lx RIP: ", address); + printk_address(regs->rip); dump_pagetable(address); - die("Oops", regs, error_code); - bust_spinlocks(0); - spin_unlock_irqrestore(&die_lock, flags); + __die("Oops", regs, error_code); + /* Executive summary in case the oops scrolled away */ + printk(KERN_EMERG "CR2: %016lx\n", address); + exit_die(flags); do_exit(SIGKILL); /* @@ -315,10 +383,13 @@ do_sigbus: up_read(&mm->mmap_sem); - /* - * Send a sigbus, regardless of whether we were in kernel - * or user mode. - */ + /* Kernel mode? Handle exceptions or die */ + if (!(error_code & 4)) + goto no_context; + + if (is_prefetch(regs, address)) + return; + tsk->thread.cr2 = address; tsk->thread.error_code = error_code; tsk->thread.trap_no = 14; @@ -327,10 +398,6 @@ info.si_code = BUS_ADRERR; info.si_addr = (void *)address; force_sig_info(SIGBUS, &info, tsk); - - /* Kernel mode? Handle exceptions or die */ - if (!(error_code & 4)) - goto no_context; return; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/mm/ioremap.c linux-2.4.23-pre8/arch/x86_64/mm/ioremap.c --- linux-2.4.22/arch/x86_64/mm/ioremap.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/mm/ioremap.c 2003-10-22 22:48:24.000000000 +0000 @@ -125,12 +125,12 @@ */ if (phys_addr < virt_to_phys(high_memory)) { char *t_addr, *t_end; - struct page *page; t_addr = __va(phys_addr); t_end = t_addr + (size - 1); #ifndef CONFIG_DISCONTIGMEM + struct page *page; for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++) if(!PageReserved(page)) return NULL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/arch/x86_64/mm/k8topology.c linux-2.4.23-pre8/arch/x86_64/mm/k8topology.c --- linux-2.4.22/arch/x86_64/mm/k8topology.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/arch/x86_64/mm/k8topology.c 2003-10-22 22:49:16.000000000 +0000 @@ -6,7 +6,7 @@ * Instead the northbridge registers are read directly. * * Copyright 2002 Andi Kleen, SuSE Labs. - * $Id: k8topology.c,v 1.7 2003/04/02 21:36:22 ak Exp $ + * $Id: k8topology.c,v 1.11 2003/09/12 01:55:37 ak Exp $ */ #include #include @@ -20,6 +20,8 @@ #include #include +#define Dprintk(x...) + int memnode_shift; u8 memnodemap[NODEMAPSIZE]; @@ -110,6 +112,9 @@ limit = read_pci_config(0, nb, 1, 0x44 + i*8); nodeid = limit & 3; + if ((base & 3) == 0) { + continue; + } if (!limit) { printk(KERN_INFO "Skipping node entry %d (base %lx)\n", i, base); continue; @@ -145,7 +150,7 @@ if (limit == base) continue; if (limit < base) { - printk(KERN_INFO"Node %d bogus settings %lx-%lx. Ignored.\n", + Dprintk(KERN_INFO"Node %d bogus settings %lx-%lx. Ignored.\n", nodeid, base, limit); continue; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/crypto/Config.in linux-2.4.23-pre8/crypto/Config.in --- linux-2.4.22/crypto/Config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/crypto/Config.in 2003-10-22 22:49:34.000000000 +0000 @@ -70,6 +70,7 @@ tristate ' Twofish cipher algorithm' CONFIG_CRYPTO_TWOFISH tristate ' Serpent cipher algorithm' CONFIG_CRYPTO_SERPENT tristate ' AES cipher algorithms' CONFIG_CRYPTO_AES + tristate ' CAST5 (CAST-128) cipher algorithm' CONFIG_CRYPTO_CAST5 if [ "$CONFIG_INET_IPCOMP" = "y" -o \ "$CONFIG_INET_IPCOMP" = "m" -o \ "$CONFIG_INET6_IPCOMP" = "y" -o \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/crypto/Makefile linux-2.4.23-pre8/crypto/Makefile --- linux-2.4.22/crypto/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/crypto/Makefile 2003-10-22 22:48:15.000000000 +0000 @@ -24,6 +24,7 @@ obj-$(CONFIG_CRYPTO_TWOFISH) += twofish.o obj-$(CONFIG_CRYPTO_SERPENT) += serpent.o obj-$(CONFIG_CRYPTO_AES) += aes.o +obj-$(CONFIG_CRYPTO_CAST5) += cast5.o obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/crypto/cast5.c linux-2.4.23-pre8/crypto/cast5.c --- linux-2.4.22/crypto/cast5.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/crypto/cast5.c 2003-10-22 22:47:55.000000000 +0000 @@ -0,0 +1,852 @@ +/* Kernel cryptographic api. +* cast5.c - Cast5 cipher algorithm (rfc2144). +* +* Derived from GnuPG implementation of cast5. +* +* Major Changes. +* Complete conformance to rfc2144. +* Supports key size from 40 to 128 bits. +* +* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +* Copyright (C) 2003 Kartikey Mahendra Bhatt . +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of GNU General Public License as published by the Free +* Software Foundation; either version 2 of the License, or (at your option) +* any later version. +* +* 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 +#include + +#define CAST5_BLOCK_SIZE 8 +#define CAST5_MIN_KEY_SIZE 5 +#define CAST5_MAX_KEY_SIZE 16 + +struct cast5_ctx { + u32 Km[16]; + u8 Kr[16]; + int rr; /* rr?number of rounds = 16:number of rounds = 12; (rfc 2144) */ +}; + + +static const u32 s1[256] = { + 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, + 0x9c004dd3, 0x6003e540, 0xcf9fc949, + 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, + 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, + 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, + 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, + 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, + 0xaa54166b, 0x22568e3a, 0xa2d341d0, + 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, + 0x4a97c1d8, 0x527644b7, 0xb5f437a7, + 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, + 0x90ecf52e, 0x22b0c054, 0xbc8e5935, + 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, + 0xe93b159f, 0xb48ee411, 0x4bff345d, + 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, + 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, + 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, + 0xc59c5319, 0xb949e354, 0xb04669fe, + 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, + 0x6a390493, 0xe63d37e0, 0x2a54f6b3, + 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, + 0xf61b1891, 0xbb72275e, 0xaa508167, + 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, + 0xa2d1936b, 0x2ad286af, 0xaa56d291, + 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, + 0x73e2bb14, 0xa0bebc3c, 0x54623779, + 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, + 0x89fe78e6, 0x3fab0950, 0x325ff6c2, + 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, + 0x380782d5, 0xc7fa5cf6, 0x8ac31511, + 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, + 0x051ef495, 0xaa573b04, 0x4a805d8d, + 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, + 0x50afd341, 0xa7c13275, 0x915a0bf5, + 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, + 0xab85c5f3, 0x1b55db94, 0xaad4e324, + 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, + 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, + 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, + 0x22513f1e, 0xaa51a79b, 0x2ad344cc, + 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, + 0x032268d4, 0xc9600acc, 0xce387e6d, + 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, + 0x4736f464, 0x5ad328d8, 0xb347cc96, + 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, + 0xbfc5fe4a, 0xa70aec10, 0xac39570a, + 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, + 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, + 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, + 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, + 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, + 0x51c85f4d, 0x56907596, 0xa5bb15e6, + 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, + 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, + 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, + 0x700b45e1, 0xd5ea50f1, 0x85a92872, + 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, + 0x0cd0ede7, 0x26470db8, 0xf881814c, + 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, + 0xab838653, 0x6e2f1e23, 0x83719c9e, + 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, + 0xe1e696ff, 0xb141ab08, 0x7cca89b9, + 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, + 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf +}; +static const u32 s2[256] = { + 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, + 0xeec5207a, 0x55889c94, 0x72fc0651, + 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, + 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, + 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, + 0xef944459, 0xba83ccb3, 0xe0c3cdfb, + 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, + 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, + 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, + 0x77e83f4e, 0x79929269, 0x24fa9f7b, + 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, + 0x0d554b63, 0x5d681121, 0xc866c359, + 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, + 0x39f7627f, 0x361e3084, 0xe4eb573b, + 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, + 0x99847ab4, 0xa0e3df79, 0xba6cf38c, + 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, + 0x8f458c74, 0xd9e0a227, 0x4ec73a34, + 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, + 0x1d804366, 0x721d9bfd, 0xa58684bb, + 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, + 0x27e19ba5, 0xd5a6c252, 0xe49754bd, + 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, + 0xe0b56714, 0x21f043b7, 0xe5d05860, + 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, + 0x68561be6, 0x83ca6b94, 0x2d6ed23b, + 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, + 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, + 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, + 0xb96726d1, 0x8049a7e8, 0x22b7da7b, + 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, + 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, + 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, + 0xe3214517, 0xb4542835, 0x9f63293c, + 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, + 0x30a22c95, 0x31a70850, 0x60930f13, + 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, + 0xa02b1741, 0x7cbad9a2, 0x2180036f, + 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, + 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, + 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, + 0x846a3bae, 0x8ff77888, 0xee5d60f6, + 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, + 0x157fd7fa, 0xef8579cc, 0xd152de58, + 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, + 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, + 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, + 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, + 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, + 0x301e16e6, 0x273be979, 0xb0ffeaa6, + 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, + 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, + 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, + 0x1a513742, 0xef6828bc, 0x520365d6, + 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, + 0x5eea29cb, 0x145892f5, 0x91584f7f, + 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, + 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, + 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, + 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, + 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, + 0xa345415e, 0x5c038323, 0x3e5d3bb9, + 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, + 0x73bfbe70, 0x83877605, 0x4523ecf1 +}; +static const u32 s3[256] = { + 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, + 0x369fe44b, 0x8c1fc644, 0xaececa90, + 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, + 0xf0ad0548, 0xe13c8d83, 0x927010d5, + 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, + 0xfade82e0, 0xa067268b, 0x8272792e, + 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, + 0x825b1bfd, 0x9255c5ed, 0x1257a240, + 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, + 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, + 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, + 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, + 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, + 0x4a012d6e, 0xc5884a28, 0xccc36f71, + 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, + 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, + 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, + 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, + 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, + 0x1eac5790, 0x796fb449, 0x8252dc15, + 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, + 0xe83ec305, 0x4f91751a, 0x925669c2, + 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, + 0x927985b2, 0x8276dbcb, 0x02778176, + 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, + 0x340ce5c8, 0x96bbb682, 0x93b4b148, + 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, + 0x8437aa88, 0x7d29dc96, 0x2756d3dc, + 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, + 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, + 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, + 0xbda8229c, 0x127dadaa, 0x438a074e, + 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, + 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, + 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, + 0x76a2e214, 0xb9a40368, 0x925d958f, + 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, + 0x193cbcfa, 0x27627545, 0x825cf47a, + 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, + 0x8272a972, 0x9270c4a8, 0x127de50b, + 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, + 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, + 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, + 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, + 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, + 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, + 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, + 0x7c34671c, 0x02717ef6, 0x4feb5536, + 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, + 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, + 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, + 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, + 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, + 0x856302e0, 0x72dbd92b, 0xee971b69, + 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, + 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, + 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, + 0x0ff0443d, 0x606e6dc6, 0x60543a49, + 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, + 0x68458425, 0x99833be5, 0x600d457d, + 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, + 0x9c305a00, 0x52bce688, 0x1b03588a, + 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, + 0xa133c501, 0xe9d3531c, 0xee353783 +}; +static const u32 s4[256] = { + 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, + 0x64ad8c57, 0x85510443, 0xfa020ed1, + 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, + 0x6497b7b1, 0xf3641f63, 0x241e4adf, + 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, + 0xc0a5374f, 0x1d2d00d9, 0x24147b15, + 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, + 0x0c13fefe, 0x081b08ca, 0x05170121, + 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, + 0x06df4261, 0xbb9e9b8a, 0x7293ea25, + 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, + 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, + 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, + 0x11b638e1, 0x72500e03, 0xf80eb2bb, + 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, + 0x6920318f, 0x081dbb99, 0xffc304a5, + 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, + 0x9f926f91, 0x9f46222f, 0x3991467d, + 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, + 0x3fb6180c, 0x18f8931e, 0x281658e6, + 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, + 0x79098b02, 0xe4eabb81, 0x28123b23, + 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, + 0x0014377b, 0x041e8ac8, 0x09114003, + 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, + 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, + 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, + 0x56c8c391, 0x6b65811c, 0x5e146119, + 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, + 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, + 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, + 0xeca1d7c7, 0x041afa32, 0x1d16625a, + 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, + 0xc70b8b46, 0xd9e66a48, 0x56e55a79, + 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, + 0xedda04eb, 0x17a9be04, 0x2c18f4df, + 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, + 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, + 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, + 0x0418f2c8, 0x001a96a6, 0x0d1526ab, + 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, + 0x311170a7, 0x3e9b640c, 0xcc3e10d7, + 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, + 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, + 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, + 0xb4be31cd, 0xd8782806, 0x12a3a4e2, + 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, + 0x9711aac5, 0x001d7b95, 0x82e5e7d2, + 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, + 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, + 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, + 0x0ce454a9, 0xd60acd86, 0x015f1919, + 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, + 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, + 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, + 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, + 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, + 0x296b299e, 0x492fc295, 0x9266beab, + 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, + 0xf65324e6, 0x6afce36c, 0x0316cc04, + 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, + 0x932bcdf6, 0xb657c34d, 0x4edfd282, + 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, + 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2 +}; +static const u32 s5[256] = { + 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, + 0x1dd358f5, 0x44dd9d44, 0x1731167f, + 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, + 0x386381cb, 0xacf6243a, 0x69befd7a, + 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, + 0x15b0a848, 0xe68b18cb, 0x4caadeff, + 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, + 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, + 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, + 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, + 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, + 0x8709e6b0, 0xd7e07156, 0x4e29fea7, + 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, + 0x578535f2, 0x2261be02, 0xd642a0c9, + 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, + 0xc8adedb3, 0x28a87fc9, 0x3d959981, + 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, + 0x4fb96976, 0x90c79505, 0xb0a8a774, + 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, + 0x0ec50966, 0xdfdd55bc, 0x29de0655, + 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, + 0x524755f4, 0x03b63cc9, 0x0cc844b2, + 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, + 0x64ee2d7e, 0xcddbb1da, 0x01c94910, + 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, + 0x50f5b616, 0xf24766e3, 0x8eca36c1, + 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, + 0x3063fcdf, 0xb6f589de, 0xec2941da, + 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, + 0xc1bacb7f, 0xe5ff550f, 0xb6083049, + 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, + 0x9e0885f9, 0x68cb3e47, 0x086c010f, + 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, + 0xcbb3d550, 0x1793084d, 0xb0d70eba, + 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, + 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, + 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, + 0x05687715, 0x646c6bd7, 0x44904db3, + 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, + 0x2cb6356a, 0x85808573, 0x4991f840, + 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, + 0xc1092910, 0x8bc95fc6, 0x7d869cf4, + 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, + 0x7d161bba, 0x9cad9010, 0xaf462ba2, + 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, + 0x176d486f, 0x097c13ea, 0x631da5c7, + 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, + 0x6e5dd2f3, 0x20936079, 0x459b80a5, + 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, + 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, + 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, + 0x75922283, 0x784d6b17, 0x58ebb16e, + 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, + 0xaaf47556, 0x5f46b02a, 0x2b092801, + 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, + 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, + 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, + 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, + 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, + 0x17e3fe2a, 0x24b79767, 0xf5a96b20, + 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, + 0xeeb9491d, 0x34010718, 0xbb30cab8, + 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, + 0xb1534546, 0x6d47de08, 0xefe9e7d4 +}; +static const u32 s6[256] = { + 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, + 0x016843b4, 0xeced5cbc, 0x325553ac, + 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, + 0xde5ebe39, 0xf38ff732, 0x8989b138, + 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, + 0x4e23e33c, 0x79cbd7cc, 0x48a14367, + 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, + 0x09a8486f, 0xa888614a, 0x2900af98, + 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, + 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, + 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, + 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, + 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, + 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, + 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, + 0xb88153e2, 0x08a19866, 0x1ae2eac8, + 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, + 0x9aea3906, 0xefe8c36e, 0xf890cdd9, + 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, + 0x221db3a6, 0x9a69a02f, 0x68818a54, + 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, + 0xcf222ebf, 0x25ac6f48, 0xa9a99387, + 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, + 0xe8a11be9, 0x4980740d, 0xc8087dfc, + 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, + 0x9528cd89, 0xfd339fed, 0xb87834bf, + 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, + 0x57f55ec5, 0xe2220abe, 0xd2916ebf, + 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, + 0xa8dc8af0, 0x7345c106, 0xf41e232f, + 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, + 0x692573e4, 0xe9a9d848, 0xf3160289, + 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, + 0x4576698d, 0xb6fad407, 0x592af950, + 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, + 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, + 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, + 0x48b9d585, 0xdc049441, 0xc8098f9b, + 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, + 0x890072d6, 0x28207682, 0xa9a9f7be, + 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, + 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, + 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, + 0xb6c85283, 0x3cc2acfb, 0x3fc06976, + 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, + 0x513021a5, 0x6c5b68b7, 0x822f8aa0, + 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, + 0x0c5ec241, 0x8809286c, 0xf592d891, + 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, + 0xb173ecc0, 0xbc60b42a, 0x953498da, + 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, + 0x257f0c3d, 0x9348af49, 0x361400bc, + 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, + 0xda41e7f9, 0xc25ad33a, 0x54f4a084, + 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, + 0xb6f6deaf, 0x3a479c3a, 0x5302da25, + 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, + 0x44136c76, 0x0404a8c8, 0xb8e5a121, + 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, + 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, + 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, + 0xf544edeb, 0xb0e93524, 0xbebb8fbd, + 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, + 0xa65b1db8, 0x851c97bd, 0xd675cf2f +}; +static const u32 s7[256] = { + 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, + 0xab9bc912, 0xde6008a1, 0x2028da1f, + 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, + 0xb232e75c, 0x4b3695f2, 0xb28707de, + 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, + 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, + 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, + 0xbaeeadf4, 0x1286becf, 0xb6eacb19, + 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, + 0x28136086, 0x0bd8dfa8, 0x356d1cf2, + 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, + 0xeb12ff82, 0xe3486911, 0xd34d7516, + 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, + 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, + 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, + 0x4437f107, 0xb6e79962, 0x42d2d816, + 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, + 0xf9583745, 0xcf19df58, 0xbec3f756, + 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, + 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, + 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, + 0xaff60ff4, 0xea2c4e6d, 0x16e39264, + 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, + 0xb2856e6e, 0x1aec3ca9, 0xbe838688, + 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, + 0x61fe033c, 0x16746233, 0x3c034c28, + 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, + 0x1626a49f, 0xeed82b29, 0x1d382fe3, + 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, + 0xd45230c7, 0x2bd1408b, 0x60c03eb7, + 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, + 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, + 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, + 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, + 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, + 0x79d34217, 0x021a718d, 0x9ac6336a, + 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, + 0x4eeb8476, 0x488dcf25, 0x36c9d566, + 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, + 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, + 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, + 0x2b9f4fd5, 0x625aba82, 0x6a017962, + 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, + 0xe32dbf9a, 0x058745b9, 0x3453dc1e, + 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, + 0x19de7eae, 0x053e561a, 0x15ad6f8c, + 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, + 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, + 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, + 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, + 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, + 0x3d321c5d, 0xc3f5e194, 0x4b269301, + 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, + 0x296693f4, 0x3d1fce6f, 0xc61e45be, + 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, + 0xb5229301, 0xcfd2a87f, 0x60aeb767, + 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, + 0x589dd390, 0x5479f8e6, 0x1cb8d647, + 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, + 0x462e1b78, 0x6580f87e, 0xf3817914, + 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, + 0x3d40f021, 0xc3c0bdae, 0x4958c24c, + 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, + 0x94e01be8, 0x90716f4b, 0x954b8aa3 +}; +static const u32 sb8[256] = { + 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, + 0xe6c1121b, 0x0e241600, 0x052ce8b5, + 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, + 0x76e38111, 0xb12def3a, 0x37ddddfc, + 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, + 0xb4d137cf, 0xb44e79f0, 0x049eedfd, + 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, + 0x3f8f95e7, 0x72df191b, 0x7580330d, + 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, + 0x02e7d1ca, 0x53571dae, 0x7a3182a2, + 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, + 0xce949ad4, 0xb84769ad, 0x965bd862, + 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, + 0xc28ec4b8, 0x57e8726e, 0x647a78fc, + 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, + 0xae63aff2, 0x7e8bd632, 0x70108c0c, + 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, + 0x06918548, 0x58cb7e07, 0x3b74ef2e, + 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, + 0x19b47a38, 0x424f7618, 0x35856039, + 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, + 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, + 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, + 0x3dd00db3, 0x708f8f34, 0x77d51b42, + 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, + 0x3e378160, 0x7895cda5, 0x859c15a5, + 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, + 0x31842e7b, 0x24259fd7, 0xf8bef472, + 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, + 0xe2506d3d, 0x4f9b12ea, 0xf215f225, + 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, + 0xea7a6e98, 0x7cd16efc, 0x1436876c, + 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, + 0x92ecbae6, 0xdd67016d, 0x151682eb, + 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, + 0xe139673b, 0xefa63fb8, 0x71873054, + 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, + 0x844a1be5, 0xbae7dfdc, 0x42cbda70, + 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, + 0x79d130a4, 0x3486ebfb, 0x33d3cddc, + 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, + 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, + 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, + 0x37df932b, 0xc4248289, 0xacf3ebc3, + 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, + 0x5e410fab, 0xb48a2465, 0x2eda7fa4, + 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, + 0xdb485694, 0x38d7e5b2, 0x57720101, + 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, + 0x7523d24a, 0xe0779695, 0xf9c17a8f, + 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, + 0xad1163ed, 0xea7b5965, 0x1a00726e, + 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, + 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, + 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, + 0x8951570f, 0xdf09822b, 0xbd691a6c, + 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, + 0x0d771c2b, 0x67cdb156, 0x350d8384, + 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, + 0x8360d87b, 0x1fa98b0c, 0x1149382c, + 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, + 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, + 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, + 0xeaee6801, 0x8db2a283, 0xea8bf59e +}; + + +#define rol(n,x) ( ((x) << (n)) | ((x) >> (32-(n))) ) + +#define F1(D,m,r) ( (I = ((m) + (D))), (I=rol((r),I)), \ + (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]) ) +#define F2(D,m,r) ( (I = ((m) ^ (D))), (I=rol((r),I)), \ + (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]) ) +#define F3(D,m,r) ( (I = ((m) - (D))), (I=rol((r),I)), \ + (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]) ) + + +static void cast5_encrypt(void *ctx, u8 * outbuf, const u8 * inbuf) +{ + struct cast5_ctx *c = (struct cast5_ctx *) ctx; + u32 l, r, t; + u32 I; /* used by the Fx macros */ + u32 *Km; + u8 *Kr; + + Km = c->Km; + Kr = c->Kr; + + /* (L0,R0) <-- (m1...m64). (Split the plaintext into left and + * right 32-bit halves L0 = m1...m32 and R0 = m33...m64.) + */ + l = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3]; + r = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7]; + + /* (16 rounds) for i from 1 to 16, compute Li and Ri as follows: + * Li = Ri-1; + * Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2 + * Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1. + * Rounds 2, 5, 8, 11, and 14 use f function Type 2. + * Rounds 3, 6, 9, 12, and 15 use f function Type 3. + */ + + if (!(c->rr)) { + t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]); + t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]); + t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]); + t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]); + t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]); + t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]); + t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]); + t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]); + t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]); + t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]); + t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]); + t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]); + t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]); + t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]); + t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]); + t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]); + } else { + t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]); + t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]); + t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]); + t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]); + t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]); + t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]); + t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]); + t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]); + t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]); + t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]); + t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]); + t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]); + } + + /* c1...c64 <-- (R16,L16). (Exchange final blocks L16, R16 and + * concatenate to form the ciphertext.) */ + outbuf[0] = (r >> 24) & 0xff; + outbuf[1] = (r >> 16) & 0xff; + outbuf[2] = (r >> 8) & 0xff; + outbuf[3] = r & 0xff; + outbuf[4] = (l >> 24) & 0xff; + outbuf[5] = (l >> 16) & 0xff; + outbuf[6] = (l >> 8) & 0xff; + outbuf[7] = l & 0xff; +} + +static void cast5_decrypt(void *ctx, u8 * outbuf, const u8 * inbuf) +{ + struct cast5_ctx *c = (struct cast5_ctx *) ctx; + u32 l, r, t; + u32 I; + u32 *Km; + u8 *Kr; + + Km = c->Km; + Kr = c->Kr; + + l = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3]; + r = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7]; + + if (!(c->rr)) { + t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]); + t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]); + t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]); + t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]); + t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]); + t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]); + t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]); + t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]); + t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]); + t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]); + t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]); + t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]); + t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]); + t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]); + t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]); + t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]); + } else { + t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]); + t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]); + t = l; l = r; r = t ^ F1(r, Km[9], Kr[9]); + t = l; l = r; r = t ^ F3(r, Km[8], Kr[8]); + t = l; l = r; r = t ^ F2(r, Km[7], Kr[7]); + t = l; l = r; r = t ^ F1(r, Km[6], Kr[6]); + t = l; l = r; r = t ^ F3(r, Km[5], Kr[5]); + t = l; l = r; r = t ^ F2(r, Km[4], Kr[4]); + t = l; l = r; r = t ^ F1(r, Km[3], Kr[3]); + t = l; l = r; r = t ^ F3(r, Km[2], Kr[2]); + t = l; l = r; r = t ^ F2(r, Km[1], Kr[1]); + t = l; l = r; r = t ^ F1(r, Km[0], Kr[0]); + } + + outbuf[0] = (r >> 24) & 0xff; + outbuf[1] = (r >> 16) & 0xff; + outbuf[2] = (r >> 8) & 0xff; + outbuf[3] = r & 0xff; + outbuf[4] = (l >> 24) & 0xff; + outbuf[5] = (l >> 16) & 0xff; + outbuf[6] = (l >> 8) & 0xff; + outbuf[7] = l & 0xff; +} + +static void key_schedule(u32 * x, u32 * z, u32 * k) +{ + +#define xi(i) ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff) +#define zi(i) ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff) + + z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^ + s7[xi(8)]; + z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^ + sb8[xi(10)]; + z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^ + s5[xi(9)]; + z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^ + s6[xi(11)]; + k[0] = s5[zi(8)] ^ s6[zi(9)] ^ s7[zi(7)] ^ sb8[zi(6)] ^ s5[zi(2)]; + k[1] = s5[zi(10)] ^ s6[zi(11)] ^ s7[zi(5)] ^ sb8[zi(4)] ^ + s6[zi(6)]; + k[2] = s5[zi(12)] ^ s6[zi(13)] ^ s7[zi(3)] ^ sb8[zi(2)] ^ + s7[zi(9)]; + k[3] = s5[zi(14)] ^ s6[zi(15)] ^ s7[zi(1)] ^ sb8[zi(0)] ^ + sb8[zi(12)]; + + x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^ + s7[zi(0)]; + x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^ + sb8[zi(2)]; + x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^ + s5[zi(1)]; + x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^ + s6[zi(3)]; + k[4] = s5[xi(3)] ^ s6[xi(2)] ^ s7[xi(12)] ^ sb8[xi(13)] ^ + s5[xi(8)]; + k[5] = s5[xi(1)] ^ s6[xi(0)] ^ s7[xi(14)] ^ sb8[xi(15)] ^ + s6[xi(13)]; + k[6] = s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(8)] ^ sb8[xi(9)] ^ s7[xi(3)]; + k[7] = s5[xi(5)] ^ s6[xi(4)] ^ s7[xi(10)] ^ sb8[xi(11)] ^ + sb8[xi(7)]; + + z[0] = x[0] ^ s5[xi(13)] ^ s6[xi(15)] ^ s7[xi(12)] ^ sb8[xi(14)] ^ + s7[xi(8)]; + z[1] = x[2] ^ s5[zi(0)] ^ s6[zi(2)] ^ s7[zi(1)] ^ sb8[zi(3)] ^ + sb8[xi(10)]; + z[2] = x[3] ^ s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(5)] ^ sb8[zi(4)] ^ + s5[xi(9)]; + z[3] = x[1] ^ s5[zi(10)] ^ s6[zi(9)] ^ s7[zi(11)] ^ sb8[zi(8)] ^ + s6[xi(11)]; + k[8] = s5[zi(3)] ^ s6[zi(2)] ^ s7[zi(12)] ^ sb8[zi(13)] ^ + s5[zi(9)]; + k[9] = s5[zi(1)] ^ s6[zi(0)] ^ s7[zi(14)] ^ sb8[zi(15)] ^ + s6[zi(12)]; + k[10] = s5[zi(7)] ^ s6[zi(6)] ^ s7[zi(8)] ^ sb8[zi(9)] ^ s7[zi(2)]; + k[11] = s5[zi(5)] ^ s6[zi(4)] ^ s7[zi(10)] ^ sb8[zi(11)] ^ + sb8[zi(6)]; + + x[0] = z[2] ^ s5[zi(5)] ^ s6[zi(7)] ^ s7[zi(4)] ^ sb8[zi(6)] ^ + s7[zi(0)]; + x[1] = z[0] ^ s5[xi(0)] ^ s6[xi(2)] ^ s7[xi(1)] ^ sb8[xi(3)] ^ + sb8[zi(2)]; + x[2] = z[1] ^ s5[xi(7)] ^ s6[xi(6)] ^ s7[xi(5)] ^ sb8[xi(4)] ^ + s5[zi(1)]; + x[3] = z[3] ^ s5[xi(10)] ^ s6[xi(9)] ^ s7[xi(11)] ^ sb8[xi(8)] ^ + s6[zi(3)]; + k[12] = s5[xi(8)] ^ s6[xi(9)] ^ s7[xi(7)] ^ sb8[xi(6)] ^ s5[xi(3)]; + k[13] = s5[xi(10)] ^ s6[xi(11)] ^ s7[xi(5)] ^ sb8[xi(4)] ^ + s6[xi(7)]; + k[14] = s5[xi(12)] ^ s6[xi(13)] ^ s7[xi(3)] ^ sb8[xi(2)] ^ + s7[xi(8)]; + k[15] = s5[xi(14)] ^ s6[xi(15)] ^ s7[xi(1)] ^ sb8[xi(0)] ^ + sb8[xi(13)]; + +#undef xi +#undef zi +} + + +static int +cast5_setkey(void *ctx, const u8 * key, unsigned key_len, u32 * flags) +{ + int i; + u32 x[4]; + u32 z[4]; + u32 k[16]; + u8 p_key[16]; + struct cast5_ctx *c = (struct cast5_ctx *) ctx; + + if (key_len < 5 || key_len > 16) { + *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; + return -EINVAL; + } + + c->rr = key_len <= 10 ? 1 : 0; + + memset(p_key, 0, 16); + memcpy(p_key, key, key_len); + + + x[0] = p_key[0] << 24 | p_key[1] << 16 | p_key[2] << 8 | p_key[3]; + x[1] = p_key[4] << 24 | p_key[5] << 16 | p_key[6] << 8 | p_key[7]; + x[2] = + p_key[8] << 24 | p_key[9] << 16 | p_key[10] << 8 | p_key[11]; + x[3] = + p_key[12] << 24 | p_key[13] << 16 | p_key[14] << 8 | p_key[15]; + + key_schedule(x, z, k); + for (i = 0; i < 16; i++) + c->Km[i] = k[i]; + key_schedule(x, z, k); + for (i = 0; i < 16; i++) + c->Kr[i] = k[i] & 0x1f; + return 0; +} + +static struct crypto_alg alg = { + .cra_name = "cast5", + .cra_flags = CRYPTO_ALG_TYPE_CIPHER, + .cra_blocksize = CAST5_BLOCK_SIZE, + .cra_ctxsize = sizeof(struct cast5_ctx), + .cra_module = THIS_MODULE, + .cra_list = LIST_HEAD_INIT(alg.cra_list), + .cra_u = { + .cipher = { + .cia_min_keysize = CAST5_MIN_KEY_SIZE, + .cia_max_keysize = CAST5_MAX_KEY_SIZE, + .cia_ivsize = CAST5_BLOCK_SIZE, + .cia_setkey = cast5_setkey, + .cia_encrypt = cast5_encrypt, + .cia_decrypt = cast5_decrypt + } + } +}; + +static int __init init(void) +{ + return crypto_register_alg(&alg); +} + +static void __exit fini(void) +{ + crypto_unregister_alg(&alg); +} + +module_init(init); +module_exit(fini); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Cast5 Cipher Algorithm"); + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/crypto/proc.c linux-2.4.23-pre8/crypto/proc.c --- linux-2.4.22/crypto/proc.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/crypto/proc.c 2003-10-22 22:49:04.000000000 +0000 @@ -60,6 +60,7 @@ switch (alg->cra_flags & CRYPTO_ALG_TYPE_MASK) { case CRYPTO_ALG_TYPE_CIPHER: + seq_printf(m, "type : cipher\n"); seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); seq_printf(m, "min keysize : %u\n", alg->cra_cipher.cia_min_keysize); @@ -70,10 +71,17 @@ break; case CRYPTO_ALG_TYPE_DIGEST: + seq_printf(m, "type : digest\n"); seq_printf(m, "blocksize : %u\n", alg->cra_blocksize); seq_printf(m, "digestsize : %u\n", alg->cra_digest.dia_digestsize); break; + case CRYPTO_ALG_TYPE_COMPRESS: + seq_printf(m, "type : compression\n"); + break; + default: + seq_printf(m, "type : unknown\n"); + break; } seq_putc(m, '\n'); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/crypto/tcrypt.c linux-2.4.23-pre8/crypto/tcrypt.c --- linux-2.4.22/crypto/tcrypt.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/crypto/tcrypt.c 2003-10-22 22:49:08.000000000 +0000 @@ -2192,6 +2192,102 @@ crypto_free_tfm(tfm); } +void +test_cast5(void) +{ + unsigned int ret, i, tsize; + u8 *p, *q, *key; + struct crypto_tfm *tfm; + struct cast5_tv *c5_tv; + struct scatterlist sg[1]; + + printk("\ntesting cast5 encryption\n"); + + tfm = crypto_alloc_tfm("cast5", 0); + if (tfm == NULL) { + printk("failed to load transform for cast5 (default ecb)\n"); + return; + } + + tsize = sizeof (cast5_enc_tv_template); + if (tsize > TVMEMSIZE) { + printk("template (%u) too big for tvmem (%u)\n", tsize, + TVMEMSIZE); + return; + } + + memcpy(tvmem, cast5_enc_tv_template, tsize); + c5_tv = (void *) tvmem; + for (i = 0; i < CAST5_ENC_TEST_VECTORS; i++) { + printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8); + key = c5_tv[i].key; + + ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen); + if (ret) { + printk("setkey() failed flags=%x\n", tfm->crt_flags); + + if (!c5_tv[i].fail) + goto out; + } + + p = c5_tv[i].plaintext; + sg[0].page = virt_to_page(p); + sg[0].offset = ((long) p & ~PAGE_MASK); + sg[0].length = sizeof(c5_tv[i].plaintext); + ret = crypto_cipher_encrypt(tfm, sg, sg, sg[0].length); + if (ret) { + printk("encrypt() failed flags=%x\n", tfm->crt_flags); + goto out; + } + + q = kmap(sg[0].page) + sg[0].offset; + hexdump(q, sizeof(c5_tv[i].ciphertext)); + + printk("%s\n", memcmp(q, c5_tv[i].ciphertext, + sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass"); + } + + tsize = sizeof (cast5_dec_tv_template); + if (tsize > TVMEMSIZE) { + printk("template (%u) too big for tvmem (%u)\n", tsize, + TVMEMSIZE); + return; + } + + memcpy(tvmem, cast5_dec_tv_template, tsize); + c5_tv = (void *) tvmem; + for (i = 0; i < CAST5_DEC_TEST_VECTORS; i++) { + printk("test %u (%d bit key):\n", i + 1, c5_tv[i].keylen * 8); + key = c5_tv[i].key; + + ret = crypto_cipher_setkey(tfm, key, c5_tv[i].keylen); + if (ret) { + printk("setkey() failed flags=%x\n", tfm->crt_flags); + + if (!c5_tv[i].fail) + goto out; + } + + p = c5_tv[i].plaintext; + sg[0].page = virt_to_page(p); + sg[0].offset = ((long) p & ~PAGE_MASK); + sg[0].length = sizeof(c5_tv[i].plaintext); + ret = crypto_cipher_decrypt(tfm, sg, sg, sg[0].length); + if (ret) { + printk("decrypt() failed flags=%x\n", tfm->crt_flags); + goto out; + } + + q = kmap(sg[0].page) + sg[0].offset; + hexdump(q, sizeof(c5_tv[i].ciphertext)); + + printk("%s\n", memcmp(q, c5_tv[i].ciphertext, + sizeof(c5_tv[i].ciphertext)) ? "fail" : "pass"); + } +out: + crypto_free_tfm (tfm); +} + static void test_deflate(void) { @@ -2304,6 +2400,7 @@ test_sha384(); test_sha512(); test_deflate(); + test_cast5(); #ifdef CONFIG_CRYPTO_HMAC test_hmac_md5(); test_hmac_sha1(); @@ -2363,6 +2460,10 @@ test_deflate(); break; + case 14: + test_cast5(); + break; + #ifdef CONFIG_CRYPTO_HMAC case 100: test_hmac_md5(); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/crypto/tcrypt.h linux-2.4.23-pre8/crypto/tcrypt.h --- linux-2.4.22/crypto/tcrypt.h 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/crypto/tcrypt.h 2003-10-22 22:49:45.000000000 +0000 @@ -1682,6 +1682,74 @@ }, }; +/* Cast5 test vectors from RFC 2144 */ +#define CAST5_ENC_TEST_VECTORS 3 +#define CAST5_DEC_TEST_VECTORS 3 + +struct cast5_tv { + unsigned keylen; + unsigned fail; + u8 key[16]; + u8 plaintext[8]; + u8 ciphertext[8]; +}; + +struct cast5_tv cast5_enc_tv_template[] = +{ + { + 16, + 0, + { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, + { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 }, + + }, + { + 10, + 0, + { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45 }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, + { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b }, + }, + { + 5, + 0, + { 0x01, 0x23, 0x45, 0x67, 0x12 }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, + { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e }, + } +}; + +struct cast5_tv cast5_dec_tv_template[] = +{ + { + 16, + 0, + { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A }, + { 0x23, 0x8b, 0x4f, 0xe5, 0x84, 0x7e, 0x44, 0xb2 }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, + + }, + { + 10, + 0, + { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, + 0x23, 0x45 }, + { 0xeb, 0x6a, 0x71, 0x1a, 0x2c, 0x02, 0x27, 0x1b }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, + }, + { + 5, + 0, + { 0x01, 0x23, 0x45, 0x67, 0x12 }, + { 0x7a, 0xc8, 0x16, 0xd1, 0x6e, 0x9b, 0x30, 0x2e }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }, + } +}; + /* * Compression stuff. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/Makefile linux-2.4.23-pre8/drivers/Makefile --- linux-2.4.22/drivers/Makefile 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/drivers/Makefile 2003-10-22 22:49:18.000000000 +0000 @@ -8,7 +8,7 @@ mod-subdirs := dio hil mtd sbus video macintosh usb input telephony ide \ message/i2o message/fusion scsi md ieee1394 pnp isdn atm \ - fc4 net/hamradio i2c acpi bluetooth + fc4 net/hamradio i2c acpi bluetooth usb/gadget subdir-y := parport char block net sound misc media cdrom hotplug subdir-m := $(subdir-y) @@ -28,6 +28,7 @@ subdir-$(CONFIG_MAC) += macintosh subdir-$(CONFIG_PPC32) += macintosh subdir-$(CONFIG_USB) += usb +subdir-$(CONFIG_USB_GADGET) += usb/gadget subdir-$(CONFIG_INPUT) += input subdir-$(CONFIG_PHONE) += telephony subdir-$(CONFIG_IDE) += ide diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/Config.in linux-2.4.23-pre8/drivers/acpi/Config.in --- linux-2.4.22/drivers/acpi/Config.in 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/Config.in 2003-10-22 22:49:30.000000000 +0000 @@ -8,36 +8,33 @@ comment 'ACPI Support' bool 'ACPI Support' CONFIG_ACPI if [ "$CONFIG_ACPI" = "y" ]; then - if [ "$CONFIG_SMP" = "y" ]; then - bool 'CPU Enumeration Only' CONFIG_ACPI_HT_ONLY - else - define_bool CONFIG_ACPI_HT_ONLY n - fi - if [ "$CONFIG_ACPI_HT_ONLY" = "n" ]; then + define_bool CONFIG_ACPI_BOOT y + define_bool CONFIG_ACPI_BUS y + define_bool CONFIG_ACPI_INTERPRETER y + define_bool CONFIG_ACPI_EC y + define_bool CONFIG_ACPI_POWER y + if [ "$CONFIG_PCI" = "y" ]; then + define_bool CONFIG_ACPI_PCI y + fi + define_bool CONFIG_ACPI_SLEEP y + define_bool CONFIG_ACPI_SYSTEM y + tristate ' AC Adapter' CONFIG_ACPI_AC + tristate ' Battery' CONFIG_ACPI_BATTERY + tristate ' Button' CONFIG_ACPI_BUTTON + tristate ' Fan' CONFIG_ACPI_FAN + tristate ' Processor' CONFIG_ACPI_PROCESSOR + dep_tristate ' Thermal Zone' CONFIG_ACPI_THERMAL $CONFIG_ACPI_PROCESSOR + if [ "$CONFIG_NUMA" = "y" -a "$CONFIG_X86_64" != "y" ]; then + dep_bool ' NUMA support' CONFIG_ACPI_NUMA $CONFIG_NUMA + fi + tristate ' ASUS Laptop Extras' CONFIG_ACPI_ASUS + tristate ' Toshiba Laptop Extras' CONFIG_ACPI_TOSHIBA + bool ' Debug Statements' CONFIG_ACPI_DEBUG + bool ' Relaxed AML Checking' CONFIG_ACPI_RELAXED_AML + else + if [ "$CONFIG_SMP" = "y" ]; then define_bool CONFIG_ACPI_BOOT y - define_bool CONFIG_ACPI_BUS y - define_bool CONFIG_ACPI_INTERPRETER y - define_bool CONFIG_ACPI_EC y - define_bool CONFIG_ACPI_POWER y - if [ "$CONFIG_PCI" = "y" ]; then - define_bool CONFIG_ACPI_PCI y - fi - define_bool CONFIG_ACPI_SLEEP y - define_bool CONFIG_ACPI_SYSTEM y - tristate ' AC Adapter' CONFIG_ACPI_AC - tristate ' Battery' CONFIG_ACPI_BATTERY - tristate ' Button' CONFIG_ACPI_BUTTON - tristate ' Fan' CONFIG_ACPI_FAN - tristate ' Processor' CONFIG_ACPI_PROCESSOR - dep_tristate ' Thermal Zone' CONFIG_ACPI_THERMAL $CONFIG_ACPI_PROCESSOR - if [ "$CONFIG_NUMA" = "y" -a "$CONFIG_X86_64" != "y" ]; then - dep_bool ' NUMA support' CONFIG_ACPI_NUMA $CONFIG_NUMA - fi - tristate ' ASUS Laptop Extras' CONFIG_ACPI_ASUS - tristate ' Toshiba Laptop Extras' CONFIG_ACPI_TOSHIBA - bool ' Debug Statements' CONFIG_ACPI_DEBUG - bool ' Relaxed AML Checking' CONFIG_ACPI_RELAXED_AML fi fi diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/asus_acpi.c linux-2.4.23-pre8/drivers/acpi/asus_acpi.c --- linux-2.4.22/drivers/acpi/asus_acpi.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/asus_acpi.c 2003-10-22 22:49:06.000000000 +0000 @@ -26,13 +26,13 @@ * Johann Wiesner - Small compile fixes * John Belmonte - ACPI code for Toshiba laptop was a good starting point. * - * TODO + * TODO: * add Fn key status - * Add mode selection on module loading (parameter) -> still necessary ? + * Add mode selection on module loading (parameter) -> still necessary? * Complete display switching -- may require dirty hacks? - * */ +#include #include #include #include @@ -41,7 +41,7 @@ #include #include -#define ASUS_ACPI_VERSION "0.24a" +#define ASUS_ACPI_VERSION "0.26" #define PROC_ASUS "asus" //the directory #define PROC_MLED "mled" @@ -73,7 +73,6 @@ MODULE_LICENSE("GPL"); EXPORT_NO_SYMBOLS; - static uid_t asus_uid = 0; static gid_t asus_gid = 0; MODULE_PARM(asus_uid, "i"); @@ -111,20 +110,24 @@ struct model_data *methods; //methods available on the laptop u8 brightness; //brighness level enum { - L2X = 0, //L200D -> TODO check Q11 (Fn+F8) - // Calling this method simply hang the + 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. - L3X, //L3C 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 ? - D1X, //D1 - L1X, //L1400B - A1X, //A1340D, A1300F - J1X, //S200 (J1) - //TODO A1370D does not seems to have a ATK device + S2X, //S200 (J1 reported), Victor MP-XP7210 + //TODO A1370D does not seem to have an ATK device // L8400 model doesn't have ATK - END_MODEL, + END_MODEL } model; //Models currently supported u16 event_count[128]; //count for each event TODO make this better }; @@ -134,7 +137,8 @@ #define S1X_PREFIX "\\_SB.PCI0.PX40." #define L1X_PREFIX S1X_PREFIX #define A1X_PREFIX "\\_SB.PCI0.ISA.EC0." -#define J1X_PREFIX A1X_PREFIX +#define S2X_PREFIX A1X_PREFIX +#define M3N_PREFIX "\\_SB.PCI0.SBRG.EC0." static struct model_data model_conf[END_MODEL] = { /* @@ -148,33 +152,43 @@ * 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"}, - {"L3D", "MLED", "\\MALD", "WLED", NULL, "\\Q10", "\\BKLG", - "\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\BLVL", "SDSP", "\\INFB"}, - + {"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}, - {"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}, - - {"A1X", "MLED", "\\MAIL", NULL, NULL, A1X_PREFIX "_Q10", "\\BKLI", - A1X_PREFIX "_Q0E", A1X_PREFIX "_Q0F", NULL, NULL, NULL, NULL, NULL}, - - {"J1X", "MLED", "\\MAIL", NULL, NULL, J1X_PREFIX "_Q10", "\\BKLI", - J1X_PREFIX "_Q0B", J1X_PREFIX "_Q0A", NULL, NULL, NULL, NULL, NULL} + {"S2X", "MLED", "\\MAIL", NULL, NULL, S2X_PREFIX "_Q10", "\\BKLI", + S2X_PREFIX "_Q0B", S2X_PREFIX "_Q0A", NULL, NULL, NULL, NULL, NULL} }; /* procdir we use */ @@ -235,7 +249,7 @@ output.length = sizeof(out_obj); output.pointer = &out_obj; - status = acpi_evaluate_object(handle, (char*) method, NULL, &output); + status = acpi_evaluate_object(handle, (char *) method, NULL, &output); *val = out_obj.integer.value; return (status == AE_OK) && (out_obj.type == ACPI_TYPE_INTEGER); } @@ -250,6 +264,7 @@ void *data) { int len = 0; + int sfun; struct asus_hotk *hotk = (struct asus_hotk *) data; char buf[16]; //enough for all info /* @@ -258,28 +273,27 @@ */ len += sprintf(page, ACPI_HOTK_NAME " " ASUS_ACPI_VERSION "\n"); - len += - sprintf(page + len, "Model reference : %s\n", - hotk->methods->name); + 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); if (asus_info) { - snprintf(buf, 5, "%s", asus_info->signature); - len += sprintf(page + len, "ACPI signature : %s\n", buf); snprintf(buf, 16, "%d", asus_info->length); - len += sprintf(page + len, "Table length : %s\n", buf); - snprintf(buf, 16, "%d", asus_info->revision); - len += sprintf(page + len, "ACPI minor version : %s\n", buf); + len += sprintf(page + len, "DSDT length : %s\n", buf); snprintf(buf, 16, "%d", asus_info->checksum); - len += sprintf(page + len, "Checksum : %s\n", buf); + len += sprintf(page + len, "DSDT checksum : %s\n", buf); + snprintf(buf, 16, "%d", asus_info->revision); + len += sprintf(page + len, "DSDT revision : %s\n", buf); snprintf(buf, 7, "%s", asus_info->oem_id); - len += sprintf(page + len, "OEM identification : %s\n", buf); + len += sprintf(page + len, "OEM id : %s\n", buf); snprintf(buf, 9, "%s", asus_info->oem_table_id); len += sprintf(page + len, "OEM table id : %s\n", buf); snprintf(buf, 16, "%x", asus_info->oem_revision); - len += sprintf(page + len, "OEM rev number : 0x%s\n", buf); + len += sprintf(page + len, "OEM revision : 0x%s\n", buf); snprintf(buf, 5, "%s", asus_info->asl_compiler_id); - len += sprintf(page + len, "ASL comp vendor ID : %s\n", buf); + len += sprintf(page + len, "ASL comp vendor id : %s\n", buf); snprintf(buf, 16, "%x", asus_info->asl_compiler_revision); - len += sprintf(page + len, "ASL comp rev number: 0x%s\n", buf); + len += sprintf(page + len, "ASL comp revision : 0x%s\n", buf); } return len; @@ -305,7 +319,7 @@ &led_status)) len = sprintf(page, "%d\n", led_status); else - printk(KERN_NOTICE "Asus ACPI: Error reading MLED " + printk(KERN_WARNING "Asus ACPI: Error reading MLED " "status\n"); } else { len = sprintf(page, "%d\n", (hotk->status & MLED_ON) ? 1 : 0); @@ -335,7 +349,7 @@ /* 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_NOTICE "Asus ACPI: MLED write failed\n"); + printk(KERN_WARNING "Asus ACPI: MLED write failed\n"); @@ -356,11 +370,11 @@ int led_status; if (hotk->methods->wled_status) { - if (read_acpi_int(NULL, hotk->methods->mled_status, + if (read_acpi_int(NULL, hotk->methods->wled_status, &led_status)) len = sprintf(page, "%d\n", led_status); else - printk(KERN_NOTICE "Asus ACPI: Error reading WLED " + printk(KERN_WARNING "Asus ACPI: Error reading WLED " "status\n"); } else { len = sprintf(page, "%d\n", (hotk->status & WLED_ON) ? 1 : 0); @@ -387,7 +401,7 @@ /* 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_NOTICE "Asus ACPI: WLED write failed\n"); + printk(KERN_WARNING "Asus ACPI: WLED write failed\n"); return count; @@ -400,7 +414,7 @@ /* We don't have to check anything, if we are here */ if (!read_acpi_int(NULL, hotk->methods->lcd_status, &lcd)) - printk(KERN_NOTICE "Asus ACPI: Error reading LCD status\n"); + printk(KERN_WARNING "Asus ACPI: Error reading LCD status\n"); if (hotk->model == L2X) lcd = ~lcd; @@ -439,7 +453,7 @@ acpi_evaluate_object(NULL, hotk->methods->mt_lcd_switch, NULL, NULL); if (ACPI_FAILURE(status)) - printk(KERN_NOTICE "Asus ACPI: Error switching LCD\n"); + printk(KERN_WARNING "Asus ACPI: Error switching LCD\n"); } return count; @@ -453,15 +467,15 @@ { acpi_status status = 0; - /* ATKD laptop */ + /* SPLV laptop */ if(hotk->methods->brightness_set) { if (!write_acpi_int(hotk->handle, hotk->methods->brightness_set, value, NULL)) - printk(KERN_NOTICE "Asus ACPI: Error changing brightness\n"); + printk(KERN_WARNING "Asus ACPI: Error changing brightness\n"); return; } - /* HOTK laptop if we are here, act as appropriate */ + /* No SPLV method if we are here, act as appropriate */ value -= hotk->brightness; while (value != 0) { status = acpi_evaluate_object(NULL, (value > 0) ? @@ -470,7 +484,7 @@ NULL, NULL); (value > 0) ? value-- : value++; if (ACPI_FAILURE(status)) - printk(KERN_NOTICE "Asus ACPI: Error changing brightness\n"); + printk(KERN_WARNING "Asus ACPI: Error changing brightness\n"); } return; } @@ -479,15 +493,15 @@ { int value; - if(hotk->methods->brightness_get) { /* ATKD laptop */ + if(hotk->methods->brightness_get) { /* SPLV/GPLV laptop */ if (!read_acpi_int(hotk->handle, hotk->methods->brightness_get, &value)) - printk(KERN_NOTICE "Asus ACPI: Error reading brightness\n"); + printk(KERN_WARNING "Asus ACPI: Error reading brightness\n"); } else if (hotk->methods->brightness_status) { /* For D1 for example */ if (!read_acpi_int(NULL, hotk->methods->brightness_status, &value)) - printk(KERN_NOTICE "Asus ACPI: Error reading brightness\n"); - } else /* HOTK laptop */ + printk(KERN_WARNING "Asus ACPI: Error reading brightness\n"); + } else /* No GPLV method */ value = hotk->brightness; return value; } @@ -513,7 +527,7 @@ /* 0 <= value <= 15 */ set_brightness(value, hotk); } else { - printk(KERN_NOTICE "Asus ACPI: Error reading user input\n"); + printk(KERN_WARNING "Asus ACPI: Error reading user input\n"); } return count; @@ -524,7 +538,7 @@ /* no sanity check needed for now */ if (!write_acpi_int(hotk->handle, hotk->methods->display_set, value, NULL)) - printk(KERN_NOTICE "Asus ACPI: Error setting display\n"); + printk(KERN_WARNING "Asus ACPI: Error setting display\n"); return; } @@ -541,12 +555,12 @@ struct asus_hotk *hotk = (struct asus_hotk *) data; if (!read_acpi_int(hotk->handle, hotk->methods->display_get, &value)) - printk(KERN_NOTICE "Asus ACPI: Error reading display status\n"); + printk(KERN_WARNING "Asus ACPI: Error reading display status\n"); return sprintf(page, "%d\n", value); } /* - * Preliminary support for display switching. As of now: 0x01 should activate + * 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 * (bitwise) of these will suffice. I never actually tested 3 displays hooked up * simultaneously, so be warned. @@ -563,13 +577,13 @@ if (sscanf(buffer, "%d", &value) == 1) set_display(value, hotk); else { - printk(KERN_NOTICE "Asus ACPI: Error reading user input\n"); + printk(KERN_WARNING "Asus ACPI: Error reading user input\n"); } return count; } -static int asus_hotk_add_fs(struct acpi_device *device) +static int __init asus_hotk_add_fs(struct acpi_device *device) { struct proc_dir_entry *proc; struct asus_hotk *hotk = acpi_driver_data(device); @@ -583,7 +597,7 @@ if ((asus_uid == 0) && (asus_gid == 0)){ mode = S_IFREG | S_IRUGO | S_IWUGO; - }else{ + } else { mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP; } @@ -599,7 +613,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_INFOS + printk(KERN_WARNING " Unable to create " PROC_INFOS " fs entry\n"); } @@ -613,7 +627,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_WLED + printk(KERN_WARNING " Unable to create " PROC_WLED " fs entry\n"); } } @@ -628,7 +642,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_MLED + printk(KERN_WARNING " Unable to create " PROC_MLED " fs entry\n"); } } @@ -647,7 +661,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_LCD + printk(KERN_WARNING " Unable to create " PROC_LCD " fs entry\n"); } } @@ -663,7 +677,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_BRN + printk(KERN_WARNING " Unable to create " PROC_BRN " fs entry\n"); } } @@ -678,19 +692,19 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_DISP + printk(KERN_WARNING " Unable to create " PROC_DISP " fs entry\n"); } } - return (AE_OK); + return 0; } static void asus_hotk_notify(acpi_handle handle, u32 event, void *data) { /* TODO Find a better way to handle events count. Here, in data, we receive - * the hotk, so we can make anything !! + * the hotk, so we can do anything! */ struct asus_hotk *hotk = (struct asus_hotk *) data; @@ -713,19 +727,40 @@ * This function is used to initialize the hotk with right values. In this * method, we can make all the detection we want, and modify the hotk struct */ -static int asus_hotk_get_info(struct asus_hotk *hotk) +static int __init asus_hotk_get_info(struct asus_hotk *hotk) { struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *model = NULL; + int bsts_result; + acpi_status status; - /* - * We have to write 0 on init this far for all ASUS models + /* + * Get DSDT headers early enough to allow for differentiating between + * models, but late enough to allow acpi_bus_register_driver() to fail + * before doing anything ACPI-specific. Should we encounter a machine, + * which needs special handling (i.e. its hotkey device has a different + * HID), this bit will be moved. A global variable asus_info contains + * the DSDT header. */ + status = acpi_get_table(ACPI_TABLE_DSDT, 1, &dsdt); + if (ACPI_FAILURE(status)) + printk(KERN_WARNING " Couldn't get the DSDT table header\n"); + else + asus_info = (struct acpi_table_header *) dsdt.pointer; + + /* We have to write 0 on init this far for all ASUS models */ if (!write_acpi_int(hotk->handle, "INIT", 0, &buffer)) { - printk(KERN_NOTICE " Hotkey initialization failed\n"); + printk(KERN_ERR " Hotkey initialization failed\n"); return -ENODEV; } + /* For testing purposes */ + if (!read_acpi_int(hotk->handle, "BSTS", &bsts_result)) + printk(KERN_WARNING " Error calling BSTS\n"); + 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 @@ -750,26 +785,34 @@ hotk->model = L3X; 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 */ else if (strncmp(model->string.pointer, "L2", 2) == 0) hotk->model = L2X; - else if (strncmp(model->string.pointer, "L8", 2) == 0) + else if (strncmp(model->string.pointer, "L8", 2) == 0) { /* S1300A reports L84F, but L1400B too */ - if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) - hotk->model = L1X; - else + if (asus_info) { + if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) + hotk->model = L1X; + } else hotk->model = S1X; + } else if (strncmp(model->string.pointer, "D1", 2) == 0) hotk->model = D1X; else if (strncmp(model->string.pointer, "A1", 2) == 0) hotk->model = A1X; + else if (strncmp(model->string.pointer, "A2", 2) == 0) + hotk->model = A2X; else if (strncmp(model->string.pointer, "J1", 2) == 0) - hotk->model = J1X; - + hotk->model = S2X; + else if (strncmp(model->string.pointer, "L5", 2) == 0) + 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, contact the " - "developers\n"); + printk("unsupported, trying default values, supply the " + "developers with your DSDT\n"); hotk->model = L2X; } else { printk("supported\n"); @@ -784,7 +827,7 @@ -static int asus_hotk_check(struct asus_hotk *hotk) +static int __init asus_hotk_check(struct asus_hotk *hotk) { int result = 0; @@ -798,7 +841,7 @@ if (hotk->device->status.present) { result = asus_hotk_get_info(hotk); } else { - printk(KERN_NOTICE " Hotkey device not present, aborting\n"); + printk(KERN_ERR " Hotkey device not present, aborting\n"); return(-EINVAL); } @@ -807,7 +850,7 @@ -static int asus_hotk_add(struct acpi_device *device) +static int __init asus_hotk_add(struct acpi_device *device) { struct asus_hotk *hotk = NULL; acpi_status status = AE_OK; @@ -816,6 +859,9 @@ if (!device) return(-EINVAL); + printk(KERN_NOTICE "Asus Laptop ACPI Extras version %s\n", + ASUS_ACPI_VERSION); + hotk = (struct asus_hotk *) kmalloc(sizeof(struct asus_hotk), GFP_KERNEL); if (!hotk) @@ -843,25 +889,23 @@ */ status = acpi_install_notify_handler(hotk->handle, ACPI_SYSTEM_NOTIFY, asus_hotk_notify, hotk); - if (ACPI_FAILURE(status)) { - printk(KERN_NOTICE - " Error installing notify handler\n"); - } else { - printk(KERN_DEBUG - " Notify Handler installed successfully\n"); - } + if (ACPI_FAILURE(status)) + printk(KERN_ERR " Error installing notify handler\n"); - /* For HOTK laptops: init the hotk->brightness value */ + /* For laptops without GPLV: init the hotk->brightness value */ if ((!hotk->methods->brightness_get) && (!hotk->methods->brightness_status) && (hotk->methods->brightness_up && hotk->methods->brightness_down)) { status = acpi_evaluate_object(NULL, hotk->methods->brightness_down, NULL, NULL); if (ACPI_FAILURE(status)) - printk(KERN_NOTICE " Error changing brightness\n"); - status = acpi_evaluate_object(NULL, hotk->methods->brightness_up, - NULL, NULL); - if (ACPI_FAILURE(status)) - printk(KERN_NOTICE " Error changing brightness\n"); + printk(KERN_WARNING " Error changing brightness\n"); + else { + status = acpi_evaluate_object(NULL, hotk->methods->brightness_up, + NULL, NULL); + if (ACPI_FAILURE(status)) + printk(KERN_WARNING " Strange, error changing" + " brightness\n"); + } } end: @@ -888,7 +932,7 @@ status = acpi_remove_notify_handler(hotk->handle, ACPI_SYSTEM_NOTIFY, asus_hotk_notify); if (ACPI_FAILURE(status)) - printk(KERN_NOTICE "Error removing notify handler\n"); + printk(KERN_ERR "Asus ACPI: Error removing notify handler\n"); kfree(hotk); @@ -900,35 +944,17 @@ static int __init asus_acpi_init(void) { - int result = 0; - acpi_status status = 0; - struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL }; - - printk(KERN_NOTICE "Asus Laptop ACPI Extras version %s\n", - ASUS_ACPI_VERSION); - /* - * Here is the code to know the model we are running on. We need to - * know this before calling the acpi_bus_register_driver function, in - * case the HID for the laptop we are running on is different from - * ACPI_HOTK_HID, which I have never seen yet :) - * - * This information is then available in the global var asus_info - */ - status = acpi_get_table(ACPI_TABLE_DSDT, 1, &dsdt); - if (ACPI_FAILURE(status)) { - printk(KERN_NOTICE " Couldn't get the DSDT table header\n"); - } else { - asus_info = (struct acpi_table_header *) dsdt.pointer; - } + int result; asus_proc_dir = proc_mkdir(PROC_ASUS, acpi_root_dir); - if (!asus_proc_dir) + if (!asus_proc_dir) { + printk(KERN_ERR "Asus ACPI: Unable to create /proc entry"); return(-ENODEV); + } asus_proc_dir->owner = THIS_MODULE; result = acpi_bus_register_driver(&asus_hotk_driver); if (result < 0) { - printk(KERN_NOTICE " Error registering " ACPI_HOTK_NAME " \n"); remove_proc_entry(PROC_ASUS, acpi_root_dir); return(-ENODEV); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/battery.c linux-2.4.23-pre8/drivers/acpi/battery.c --- linux-2.4.22/drivers/acpi/battery.c 2003-08-25 11:44:40.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/battery.c 2003-10-22 22:49:17.000000000 +0000 @@ -348,7 +348,7 @@ ACPI_FUNCTION_TRACE("acpi_battery_read_info"); - if (!battery) + if (!battery || (off != 0)) goto end; if (battery->flags.present) @@ -447,7 +447,7 @@ ACPI_FUNCTION_TRACE("acpi_battery_read_state"); - if (!battery) + if (!battery || (off != 0)) goto end; if (battery->flags.present) @@ -531,7 +531,7 @@ ACPI_FUNCTION_TRACE("acpi_battery_read_alarm"); - if (!battery) + if (!battery || (off != 0)) goto end; if (!battery->flags.present) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/bus.c linux-2.4.23-pre8/drivers/acpi/bus.c --- linux-2.4.22/drivers/acpi/bus.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/bus.c 2003-10-22 22:49:01.000000000 +0000 @@ -49,7 +49,7 @@ #define PREFIX "ACPI: " -extern void eisa_set_level_irq(unsigned int irq); +extern void acpi_pic_set_level_irq(unsigned int irq); extern int acpi_disabled; @@ -1881,7 +1881,7 @@ if (acpi_ioapic) mp_config_ioapic_for_sci(acpi_fadt.sci_int); else - eisa_set_level_irq(acpi_fadt.sci_int); + acpi_pic_set_level_irq(acpi_fadt.sci_int); #endif status = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION); @@ -1898,9 +1898,7 @@ * of that. */ result = acpi_ec_ecdt_probe(); - if (result) { - goto error1; - } + /* Ignore result. Not having an ECDT is not fatal. */ #endif status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/button.c linux-2.4.23-pre8/drivers/acpi/button.c --- linux-2.4.22/drivers/acpi/button.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/button.c 2003-10-22 22:49:17.000000000 +0000 @@ -85,7 +85,7 @@ ACPI_FUNCTION_TRACE("acpi_button_read_info"); - if (!button || !button->device) + if (!button || !button->device || (off != 0)) goto end; p += sprintf(p, "type: %s\n", @@ -119,7 +119,7 @@ ACPI_FUNCTION_TRACE("acpi_button_lid_read_state"); - if (!button || !button->device) + if (!button || !button->device || (off != 0)) goto end; status=acpi_evaluate_integer(button->handle,"_LID",NULL,&state); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/dispatcher/dsfield.c linux-2.4.23-pre8/drivers/acpi/dispatcher/dsfield.c --- linux-2.4.22/drivers/acpi/dispatcher/dsfield.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/dispatcher/dsfield.c 2003-10-22 22:47:44.000000000 +0000 @@ -105,27 +105,33 @@ return_ACPI_STATUS (AE_AML_NO_OPERAND); } - /* - * During the load phase, we want to enter the name of the field into - * the namespace. During the execute phase (when we evaluate the size - * operand), we want to lookup the name - */ - if (walk_state->parse_flags & ACPI_PARSE_EXECUTE) { - flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE; + if (walk_state->deferred_node) { + node = walk_state->deferred_node; + status = AE_OK; } else { - flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND; - } + /* + * During the load phase, we want to enter the name of the field into + * the namespace. During the execute phase (when we evaluate the size + * operand), we want to lookup the name + */ + if (walk_state->parse_flags & ACPI_PARSE_EXECUTE) { + flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE; + } + else { + flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND; + } - /* - * Enter the name_string into the namespace - */ - status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string, - ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, - flags, walk_state, &(node)); - if (ACPI_FAILURE (status)) { - ACPI_REPORT_NSERROR (arg->common.value.string, status); - return_ACPI_STATUS (status); + /* + * Enter the name_string into the namespace + */ + status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string, + ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, + flags, walk_state, &(node)); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_NSERROR (arg->common.value.string, status); + return_ACPI_STATUS (status); + } } /* We could put the returned object (Node) on the object stack for later, but diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/dispatcher/dsinit.c linux-2.4.23-pre8/drivers/acpi/dispatcher/dsinit.c --- linux-2.4.22/drivers/acpi/dispatcher/dsinit.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/dispatcher/dsinit.c 2003-10-22 22:49:00.000000000 +0000 @@ -135,7 +135,7 @@ } /* - * Always parse methods to detect errors, we may delete + * Always parse methods to detect errors, we will delete * the parse tree below */ status = acpi_ds_parse_method (obj_handle); @@ -150,7 +150,7 @@ } /* - * Delete the parse tree. We simple re-parse the method + * Delete the parse tree. We simply re-parse the method * for every execution since there isn't much overhead */ acpi_ns_delete_namespace_subtree (obj_handle); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/dispatcher/dsopcode.c linux-2.4.23-pre8/drivers/acpi/dispatcher/dsopcode.c --- linux-2.4.22/drivers/acpi/dispatcher/dsopcode.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/dispatcher/dsopcode.c 2003-10-22 22:48:19.000000000 +0000 @@ -65,7 +65,7 @@ * * RETURN: Status. * - * DESCRIPTION: Late execution of region or field arguments + * DESCRIPTION: Late (deferred) execution of region or field arguments * ****************************************************************************/ @@ -111,7 +111,10 @@ return_ACPI_STATUS (status); } + /* Mark this parse as a deferred opcode */ + walk_state->parse_flags = ACPI_PARSE_DEFERRED_OP; + walk_state->deferred_node = node; /* Pass1: Parse the entire declaration */ @@ -128,7 +131,7 @@ arg->common.node = node; acpi_ps_delete_parse_tree (op); - /* Evaluate the address and length arguments for the Buffer Field */ + /* Evaluate the deferred arguments */ op = acpi_ps_alloc_op (AML_INT_EVAL_SUBTREE_OP); if (!op) { @@ -144,6 +147,8 @@ return_ACPI_STATUS (AE_NO_MEMORY); } + /* Execute the opcode and arguments */ + status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start, aml_length, NULL, NULL, 3); if (ACPI_FAILURE (status)) { @@ -151,6 +156,9 @@ return_ACPI_STATUS (status); } + /* Mark this execution as a deferred opcode */ + + walk_state->deferred_node = node; status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (op); return_ACPI_STATUS (status); @@ -192,7 +200,7 @@ node = obj_desc->buffer_field.node; ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_BUFFER_FIELD, node, NULL)); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field JIT Init\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n", node->name.ascii)); /* Execute the AML code for the term_arg arguments */ @@ -207,7 +215,7 @@ * * FUNCTION: acpi_ds_get_buffer_arguments * - * PARAMETERS: obj_desc - A valid Bufferobject + * PARAMETERS: obj_desc - A valid Buffer object * * RETURN: Status. * @@ -240,7 +248,7 @@ return_ACPI_STATUS (AE_AML_INTERNAL); } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer JIT Init\n")); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n")); /* Execute the AML code for the term_arg arguments */ @@ -254,7 +262,7 @@ * * FUNCTION: acpi_ds_get_package_arguments * - * PARAMETERS: obj_desc - A valid Packageobject + * PARAMETERS: obj_desc - A valid Package object * * RETURN: Status. * @@ -287,7 +295,7 @@ return_ACPI_STATUS (AE_AML_INTERNAL); } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package JIT Init\n")); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n")); /* Execute the AML code for the term_arg arguments */ @@ -335,11 +343,12 @@ node = obj_desc->region.node; - ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL)); + ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL)); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Init at AML %p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Arg Init at AML %p\n", node->name.ascii, extra_desc->extra.aml_start)); + /* Execute the argument AML */ status = acpi_ds_execute_arguments (node, acpi_ns_get_parent_node (node), extra_desc->extra.aml_length, extra_desc->extra.aml_start); @@ -505,14 +514,16 @@ goto cleanup; } - /* Entire field must fit within the current length of the buffer */ if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Field size %d exceeds Buffer size %d (bits)\n", - bit_offset + bit_count, 8 * (u32) buffer_desc->buffer.length)); + "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n", + ((struct acpi_namespace_node *) result_desc)->name.ascii, + bit_offset + bit_count, + buffer_desc->buffer.node->name.ascii, + 8 * (u32) buffer_desc->buffer.length)); status = AE_AML_BUFFER_LIMIT; goto cleanup; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/dispatcher/dsutils.c linux-2.4.23-pre8/drivers/acpi/dispatcher/dsutils.c --- linux-2.4.22/drivers/acpi/dispatcher/dsutils.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/dispatcher/dsutils.c 2003-10-22 22:48:54.000000000 +0000 @@ -53,6 +53,7 @@ #define _COMPONENT ACPI_DISPATCHER ACPI_MODULE_NAME ("dsutils") + #ifndef ACPI_NO_METHOD_EXECUTION /******************************************************************************* @@ -196,7 +197,6 @@ acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op)); return_VALUE (FALSE); - } @@ -239,7 +239,6 @@ return_VOID; } - if (!acpi_ds_is_result_used (op, walk_state)) { /* * Must pop the result stack (obj_desc should be equal to result_obj) @@ -389,61 +388,77 @@ * in name_string */ + /* - * Differentiate between a namespace "create" operation - * versus a "lookup" operation (IMODE_LOAD_PASS2 vs. - * IMODE_EXECUTE) in order to support the creation of - * namespace objects during the execution of control methods. + * Special handling for buffer_field declarations. This is a deferred + * opcode that unfortunately defines the field name as the last + * parameter instead of the first. We get here when we are performing + * the deferred execution, so the actual name of the field is already + * in the namespace. We don't want to attempt to look it up again + * because we may be executing in a different scope than where the + * actual opcode exists. */ - parent_op = arg->common.parent; - op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode); - if ((op_info->flags & AML_NSNODE) && - (parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) && - (parent_op->common.aml_opcode != AML_REGION_OP) && - (parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) { - /* Enter name into namespace if not found */ - - interpreter_mode = ACPI_IMODE_LOAD_PASS2; + if ((walk_state->deferred_node) && + (walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD) && + (arg_index != 0)) { + obj_desc = ACPI_CAST_PTR (union acpi_operand_object, walk_state->deferred_node); + status = AE_OK; } + else /* All other opcodes */ { + /* + * Differentiate between a namespace "create" operation + * versus a "lookup" operation (IMODE_LOAD_PASS2 vs. + * IMODE_EXECUTE) in order to support the creation of + * namespace objects during the execution of control methods. + */ + parent_op = arg->common.parent; + op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode); + if ((op_info->flags & AML_NSNODE) && + (parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) && + (parent_op->common.aml_opcode != AML_REGION_OP) && + (parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) { + /* Enter name into namespace if not found */ - else { - /* Return a failure if name not found */ - - interpreter_mode = ACPI_IMODE_EXECUTE; - } + interpreter_mode = ACPI_IMODE_LOAD_PASS2; + } + else { + /* Return a failure if name not found */ - status = acpi_ns_lookup (walk_state->scope_info, name_string, - ACPI_TYPE_ANY, interpreter_mode, - ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, - walk_state, - ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc)); - /* - * The only case where we pass through (ignore) a NOT_FOUND - * error is for the cond_ref_of opcode. - */ - if (status == AE_NOT_FOUND) { - if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) { - /* - * For the Conditional Reference op, it's OK if - * the name is not found; We just need a way to - * indicate this to the interpreter, set the - * object to the root - */ - obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node); - status = AE_OK; + interpreter_mode = ACPI_IMODE_EXECUTE; } - else { - /* - * We just plain didn't find it -- which is a - * very serious error at this point - */ - status = AE_AML_NAME_NOT_FOUND; + status = acpi_ns_lookup (walk_state->scope_info, name_string, + ACPI_TYPE_ANY, interpreter_mode, + ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, + walk_state, + ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc)); + /* + * The only case where we pass through (ignore) a NOT_FOUND + * error is for the cond_ref_of opcode. + */ + if (status == AE_NOT_FOUND) { + if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) { + /* + * For the Conditional Reference op, it's OK if + * the name is not found; We just need a way to + * indicate this to the interpreter, set the + * object to the root + */ + obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node); + status = AE_OK; + } + else { + /* + * We just plain didn't find it -- which is a + * very serious error at this point + */ + status = AE_AML_NAME_NOT_FOUND; + } } - } - if (ACPI_FAILURE (status)) { - ACPI_REPORT_NSERROR (name_string, status); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_NSERROR (name_string, status); + } } /* Free the namestring created above */ @@ -464,8 +479,6 @@ } ACPI_DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state)); } - - else { /* Check for null name case */ @@ -480,7 +493,6 @@ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Null namepath: Arg=%p\n", arg)); } - else { opcode = arg->common.aml_opcode; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/dispatcher/dswload.c linux-2.4.23-pre8/drivers/acpi/dispatcher/dswload.c --- linux-2.4.22/drivers/acpi/dispatcher/dswload.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/dispatcher/dswload.c 2003-10-22 22:47:40.000000000 +0000 @@ -248,6 +248,14 @@ * buffer_field, or Package), the name of the object is already * in the namespace. */ + if (walk_state->deferred_node) { + /* This name is already in the namespace, get the node */ + + node = walk_state->deferred_node; + status = AE_OK; + break; + } + flags = ACPI_NS_NO_UPSEARCH; if ((walk_state->opcode != AML_SCOPE_OP) && (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) { @@ -589,7 +597,17 @@ * Enter the named type into the internal namespace. We enter the name * as we go downward in the parse tree. Any necessary subobjects that involve * arguments to the opcode must be created as we go back up the parse tree later. + * + * Note: Name may already exist if we are executing a deferred opcode. */ + if (walk_state->deferred_node) { + /* This name is already in the namespace, get the node */ + + node = walk_state->deferred_node; + status = AE_OK; + break; + } + status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, walk_state, &(node)); break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/dispatcher/dswscope.c linux-2.4.23-pre8/drivers/acpi/dispatcher/dswscope.c --- linux-2.4.22/drivers/acpi/dispatcher/dswscope.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/dispatcher/dswscope.c 2003-10-22 22:49:50.000000000 +0000 @@ -121,10 +121,9 @@ /* Make sure object type is valid */ if (!acpi_ut_valid_object_type (type)) { - ACPI_REPORT_WARNING (("ds_scope_stack_push: type code out of range\n")); + ACPI_REPORT_WARNING (("ds_scope_stack_push: Invalid object type: 0x%X\n", type)); } - /* Allocate a new scope object */ scope_info = acpi_ut_create_generic_state (); @@ -146,13 +145,13 @@ old_scope_info = walk_state->scope_info; if (old_scope_info) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, - "[%4.4s] (%10s)", + "[%4.4s] (%s)", old_scope_info->scope.node->name.ascii, acpi_ut_get_type_name (old_scope_info->common.value))); } else { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, - "[\\___] (%10s)", "ROOT")); + "[\\___] (%s)", "ROOT")); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, @@ -163,7 +162,6 @@ /* Push new scope object onto stack */ acpi_ut_push_generic_state (&walk_state->scope_info, scope_info); - return_ACPI_STATUS (AE_OK); } @@ -207,7 +205,7 @@ walk_state->scope_depth--; ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "[%.2d] Popped scope [%4.4s] (%10s), New scope -> ", + "[%.2d] Popped scope [%4.4s] (%s), New scope -> ", (u32) walk_state->scope_depth, scope_info->scope.node->name.ascii, acpi_ut_get_type_name (scope_info->common.value))); @@ -225,7 +223,6 @@ } acpi_ut_delete_generic_state (scope_info); - return_ACPI_STATUS (AE_OK); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/dispatcher/dswstate.c linux-2.4.23-pre8/drivers/acpi/dispatcher/dswstate.c --- linux-2.4.22/drivers/acpi/dispatcher/dswstate.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/dispatcher/dswstate.c 2003-10-22 22:49:30.000000000 +0000 @@ -56,11 +56,12 @@ * FUNCTION: acpi_ds_result_insert * * PARAMETERS: Object - Object to push + * Index - Where to insert the object * walk_state - Current Walk state * * RETURN: Status * - * DESCRIPTION: Push an object onto this walk's result stack + * DESCRIPTION: Insert an object onto this walk's result stack * ******************************************************************************/ @@ -114,6 +115,7 @@ * FUNCTION: acpi_ds_result_remove * * PARAMETERS: Object - Where to return the popped object + * Index - Where to extract the object * walk_state - Current Walk state * * RETURN: Status @@ -233,6 +235,7 @@ return (AE_AML_NO_RETURN_VALUE); } + /******************************************************************************* * * FUNCTION: acpi_ds_result_pop_from_bottom @@ -295,7 +298,6 @@ *object, (*object) ? acpi_ut_get_object_type_name (*object) : "NULL", state, walk_state)); - return (AE_OK); } @@ -358,8 +360,7 @@ * * FUNCTION: acpi_ds_result_stack_push * - * PARAMETERS: Object - Object to push - * walk_state - Current Walk state + * PARAMETERS: walk_state - Current Walk state * * RETURN: Status * @@ -420,7 +421,6 @@ return (AE_AML_NO_OPERAND); } - state = acpi_ut_pop_generic_state (&walk_state->results); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, @@ -572,6 +572,7 @@ } #endif + /******************************************************************************* * * FUNCTION: acpi_ds_obj_stack_pop @@ -641,6 +642,7 @@ u32 i; union acpi_operand_object *obj_desc; + ACPI_FUNCTION_NAME ("ds_obj_stack_pop_and_delete"); @@ -883,8 +885,15 @@ * FUNCTION: acpi_ds_init_aml_walk * * PARAMETERS: walk_state - New state to be initialized + * Op - Current parse op + * method_node - Control method NS node, if any + * aml_start - Start of AML + * aml_length - Length of AML + * Params - Method args, if any + * return_obj_desc - Where to store a return object, if any + * pass_number - 1, 2, or 3 * - * RETURN: None + * RETURN: Status * * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk * @@ -927,9 +936,9 @@ if (method_node) { walk_state->parser_state.start_node = method_node; - walk_state->walk_type = ACPI_WALK_METHOD; - walk_state->method_node = method_node; - walk_state->method_desc = acpi_ns_get_attached_object (method_node); + walk_state->walk_type = ACPI_WALK_METHOD; + walk_state->method_node = method_node; + walk_state->method_desc = acpi_ns_get_attached_object (method_node); /* Push start scope on scope stack and make it current */ @@ -956,6 +965,7 @@ while (extra_op && !extra_op->common.node) { extra_op = extra_op->common.parent; } + if (!extra_op) { parser_state->start_node = NULL; } @@ -1014,7 +1024,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", walk_state)); } - /* Always must free any linked control states */ + /* Always must free any linked control states */ while (walk_state->control_state) { state = walk_state->control_state; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/ec.c linux-2.4.23-pre8/drivers/acpi/ec.c --- linux-2.4.22/drivers/acpi/ec.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/ec.c 2003-10-22 22:48:14.000000000 +0000 @@ -33,7 +33,7 @@ #include #include #include - +#include #define _COMPONENT ACPI_EC_COMPONENT ACPI_MODULE_NAME ("acpi_ec") @@ -90,6 +90,13 @@ /* External interfaces use first EC only, so remember */ static struct acpi_device *first_ec; +/* + * We use kernel thread to handle ec's gpe query, so the query may defer. + * The query need a context, which can be freed when we replace ec_ecdt + * with EC device. So defered query may have a wrong context. + * We use an indication to avoid it + */ +static int ec_device_init = 0; /* -------------------------------------------------------------------------- Transaction Management -------------------------------------------------------------------------- */ @@ -389,8 +396,11 @@ acpi_disable_gpe(NULL, ec->gpe_bit, ACPI_ISR); - status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, - acpi_ec_gpe_query, ec); + if (!ec_device_init) + acpi_ec_gpe_query(ec); /* directly query when device didn't init */ + else + status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, + acpi_ec_gpe_query, ec); } /* -------------------------------------------------------------------------- @@ -408,7 +418,10 @@ * The EC object is in the handler context and is needed * when calling the acpi_ec_space_handler. */ - *return_context = handler_context; + if(function == ACPI_REGION_DEACTIVATE) + *return_context = NULL; + else + *return_context = handler_context; return AE_OK; } @@ -582,6 +595,8 @@ we now have the *real* EC info, so kill the makeshift one.*/ acpi_evaluate_integer(ec->handle, "_UID", NULL, &uid); if (ec_ecdt && ec_ecdt->uid == uid) { + acpi_disable_gpe(NULL, ec_ecdt->gpe_bit, ACPI_NOT_ISR); + ec_device_init = 1; acpi_remove_address_space_handler(ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_EC, &acpi_ec_space_handler); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/events/evgpe.c linux-2.4.23-pre8/drivers/acpi/events/evgpe.c --- linux-2.4.22/drivers/acpi/events/evgpe.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/events/evgpe.c 2003-10-22 22:49:11.000000000 +0000 @@ -218,7 +218,7 @@ int_status |= acpi_ev_gpe_dispatch ( &gpe_block->event_info[gpe_number], - gpe_number + gpe_block->register_info[gpe_number].base_gpe_number); + j + gpe_register_info->base_gpe_number); } } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/events/evregion.c linux-2.4.23-pre8/drivers/acpi/events/evregion.c --- linux-2.4.22/drivers/acpi/events/evregion.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/events/evregion.c 2003-10-22 22:47:44.000000000 +0000 @@ -382,7 +382,7 @@ union acpi_operand_object *obj_desc; union acpi_operand_object **last_obj_ptr; acpi_adr_space_setup region_setup; - void *region_context; + void **region_context; union acpi_operand_object *region_obj2; acpi_status status; @@ -394,7 +394,7 @@ if (!region_obj2) { return_VOID; } - region_context = region_obj2->extra.region_context; + region_context = ®ion_obj2->extra.region_context; /* Get the address handler from the region object */ @@ -450,7 +450,7 @@ region_setup = handler_obj->address_space.setup; status = region_setup (region_obj, ACPI_REGION_DEACTIVATE, - handler_obj->address_space.context, ®ion_context); + handler_obj->address_space.context, region_context); /* Init routine may fail, Just ignore errors */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exconfig.c linux-2.4.23-pre8/drivers/acpi/executer/exconfig.c --- linux-2.4.22/drivers/acpi/executer/exconfig.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exconfig.c 2003-10-22 22:49:04.000000000 +0000 @@ -92,6 +92,9 @@ /* Install the new table into the local data structures */ + ACPI_MEMSET (&table_info, 0, sizeof (struct acpi_table_desc)); + + table_info.type = 5; table_info.pointer = table; table_info.length = (acpi_size) table->length; table_info.allocation = ACPI_MEM_ALLOCATED; @@ -178,7 +181,7 @@ return_ACPI_STATUS (status); } - /* Not found, return an Integer=0 and AE_OK */ + /* Table not found, return an Integer=0 and AE_OK */ ddb_handle = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); if (!ddb_handle) { @@ -248,9 +251,11 @@ walk_state); if (ACPI_FAILURE (status)) { (void) acpi_ex_unload_table (ddb_handle); + return_ACPI_STATUS (status); } } + *return_desc = ddb_handle; return_ACPI_STATUS (status); } @@ -417,7 +422,7 @@ acpi_ex_unload_table ( union acpi_operand_object *ddb_handle) { - acpi_status status = AE_NOT_IMPLEMENTED; + acpi_status status = AE_OK; union acpi_operand_object *table_desc = ddb_handle; struct acpi_table_desc *table_info; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/excreate.c linux-2.4.23-pre8/drivers/acpi/executer/excreate.c --- linux-2.4.22/drivers/acpi/executer/excreate.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/excreate.c 2003-10-22 22:49:40.000000000 +0000 @@ -286,7 +286,7 @@ ACPI_FUNCTION_TRACE ("ex_create_region"); - /* Get the Node from the object stack */ + /* Get the Namespace Node */ node = walk_state->op->common.node; @@ -311,7 +311,6 @@ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (%X)\n", acpi_ut_get_region_name (region_space), region_space)); - /* Create the region descriptor */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_REGION); @@ -375,6 +374,7 @@ ACPI_FUNCTION_TRACE ("ex_create_table_region"); + /* Get the Node from the object stack */ node = walk_state->op->common.node; @@ -392,7 +392,6 @@ status = acpi_tb_find_table (operand[1]->string.pointer, operand[2]->string.pointer, operand[3]->string.pointer, &table); - if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } @@ -489,7 +488,6 @@ status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0], obj_desc, ACPI_TYPE_PROCESSOR); - /* Remove local reference to the object */ acpi_ut_remove_reference (obj_desc); @@ -540,7 +538,6 @@ status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0], obj_desc, ACPI_TYPE_POWER); - /* Remove local reference to the object */ acpi_ut_remove_reference (obj_desc); @@ -609,7 +606,6 @@ obj_desc->method.concurrency = (u8) (((method_flags & METHOD_FLAGS_SYNCH_LEVEL) >> 4) + 1); } - else { obj_desc->method.concurrency = INFINITE_CONCURRENCY; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exfield.c linux-2.4.23-pre8/drivers/acpi/executer/exfield.c --- linux-2.4.22/drivers/acpi/executer/exfield.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exfield.c 2003-10-22 22:47:38.000000000 +0000 @@ -160,10 +160,10 @@ } ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "Obj=%p Type=%X Buf=%p Len=%X\n", + "field_read [TO]: Obj %p, Type %X, Buf %p, byte_len %X\n", obj_desc, ACPI_GET_OBJECT_TYPE (obj_desc), buffer, (u32) length)); ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "field_write: bit_len=%X bit_off=%X byte_off=%X\n", + "field_read [FROM]: bit_len %X, bit_off %X, byte_off %X\n", obj_desc->common_field.bit_length, obj_desc->common_field.start_field_bit_offset, obj_desc->common_field.base_byte_offset)); @@ -335,10 +335,13 @@ } ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "Obj=%p Type=%X Buf=%p Len=%X\n", - obj_desc, ACPI_GET_OBJECT_TYPE (obj_desc), buffer, length)); + "field_write [FROM]: Obj %p (%s:%X), Buf %p, byte_len %X\n", + source_desc, acpi_ut_get_type_name (ACPI_GET_OBJECT_TYPE (source_desc)), + ACPI_GET_OBJECT_TYPE (source_desc), buffer, length)); ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "field_read: bit_len=%X bit_off=%X byte_off=%X\n", + "field_write [TO]: Obj %p (%s:%X), bit_len %X, bit_off %X, byte_off %X\n", + obj_desc, acpi_ut_get_type_name (ACPI_GET_OBJECT_TYPE (obj_desc)), + ACPI_GET_OBJECT_TYPE (obj_desc), obj_desc->common_field.bit_length, obj_desc->common_field.start_field_bit_offset, obj_desc->common_field.base_byte_offset)); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exfldio.c linux-2.4.23-pre8/drivers/acpi/executer/exfldio.c --- linux-2.4.22/drivers/acpi/executer/exfldio.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exfldio.c 2003-10-22 22:48:24.000000000 +0000 @@ -64,7 +64,8 @@ * RETURN: Status * * DESCRIPTION: Common processing for acpi_ex_extract_from_field and - * acpi_ex_insert_into_field. Initialize the + * acpi_ex_insert_into_field. Initialize the Region if necessary and + * validate the request. * ******************************************************************************/ @@ -96,7 +97,7 @@ * If the Region Address and Length have not been previously evaluated, * evaluate them now and save the results. */ - if (!(rgn_desc->region.flags & AOPOBJ_DATA_VALID)) { + if (!(rgn_desc->common.flags & AOPOBJ_DATA_VALID)) { status = acpi_ds_get_region_arguments (rgn_desc); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); @@ -109,6 +110,18 @@ return_ACPI_STATUS (AE_OK); } +#ifdef ACPI_UNDER_DEVELOPMENT + /* + * If the Field access is any_acc, we can now compute the optimal + * access (because we know know the length of the parent region) + */ + if (!(obj_desc->common.flags & AOPOBJ_DATA_VALID)) { + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } +#endif + /* * Validate the request. The entire request from the byte offset for a * length of one field datum (access width) must fit within the region. @@ -242,7 +255,7 @@ } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_BFIELD, - " Region[%s-%X] Access %X Base:Off %X:%X at %8.8X%8.8X\n", + " Region [%s:%X], Width %X, byte_base %X, Offset %X at %8.8X%8.8X\n", acpi_ut_get_region_name (rgn_desc->region.space_id), rgn_desc->region.space_id, obj_desc->common_field.access_byte_width, @@ -365,10 +378,10 @@ /* * The four types of fields are: * - * buffer_fields - Read/write from/to a Buffer - * region_fields - Read/write from/to a Operation Region. - * bank_fields - Write to a Bank Register, then read/write from/to an op_region - * index_fields - Write to an Index Register, then read/write from/to a Data Register + * buffer_field - Read/write from/to a Buffer + * region_field - Read/write from/to a Operation Region. + * bank_field - Write to a Bank Register, then read/write from/to an op_region + * index_field - Write to an Index Register, then read/write from/to a Data Register */ switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { case ACPI_TYPE_BUFFER_FIELD: @@ -458,24 +471,34 @@ /* Write the index value to the index_register (itself a region_field) */ + field_datum_byte_offset += obj_desc->index_field.value; + + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Write to Index Register: Value %8.8X\n", + field_datum_byte_offset)); + status = acpi_ex_insert_into_field (obj_desc->index_field.index_obj, - &obj_desc->index_field.value, - sizeof (obj_desc->index_field.value)); + &field_datum_byte_offset, + sizeof (field_datum_byte_offset)); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "I/O to Data Register: value_ptr %p\n", + value)); + if (read_write == ACPI_READ) { /* Read the datum from the data_register */ status = acpi_ex_extract_from_field (obj_desc->index_field.data_obj, - value, obj_desc->common_field.access_byte_width); + value, sizeof (acpi_integer)); } else { - /* Write the datum to the Data register */ + /* Write the datum to the data_register */ status = acpi_ex_insert_into_field (obj_desc->index_field.data_obj, - value, obj_desc->common_field.access_byte_width); + value, sizeof (acpi_integer)); } break; @@ -490,12 +513,14 @@ if (ACPI_SUCCESS (status)) { if (read_write == ACPI_READ) { - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Read=%8.8X%8.8X\n", - ACPI_HIDWORD (*value), ACPI_LODWORD (*value))); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Read %8.8X%8.8X, Width %d\n", + ACPI_HIDWORD (*value), ACPI_LODWORD (*value), + obj_desc->common_field.access_byte_width)); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Written=%8.8X%8.8X\n", - ACPI_HIDWORD (*value), ACPI_LODWORD (*value))); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value Written %8.8X%8.8X, Width %d\n", + ACPI_HIDWORD (*value), ACPI_LODWORD (*value), + obj_desc->common_field.access_byte_width)); } } @@ -554,6 +579,10 @@ */ status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset, ¤t_value, ACPI_READ); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + merged_value |= (current_value & ~mask); } break; @@ -573,6 +602,7 @@ break; default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "write_with_update_rule: Unknown update_rule setting: %X\n", (obj_desc->common_field.field_flags & AML_FIELD_UPDATE_RULE_MASK))); @@ -580,18 +610,19 @@ } } - /* Write the merged value */ - - status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset, - &merged_value, ACPI_WRITE); - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "Mask %8.8X%8.8X datum_offset %X Value %8.8X%8.8X, merged_value %8.8X%8.8X\n", + "Mask %8.8X%8.8X, datum_offset %X, Width %X, Value %8.8X%8.8X, merged_value %8.8X%8.8X\n", ACPI_HIDWORD (mask), ACPI_LODWORD (mask), field_datum_byte_offset, + obj_desc->common_field.access_byte_width, ACPI_HIDWORD (field_value), ACPI_LODWORD (field_value), ACPI_HIDWORD (merged_value),ACPI_LODWORD (merged_value))); + /* Write the merged value */ + + status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset, + &merged_value, ACPI_WRITE); + return_ACPI_STATUS (status); } @@ -625,7 +656,7 @@ u32 index; - ACPI_FUNCTION_ENTRY (); + ACPI_FUNCTION_TRACE_U32 ("ex_get_buffer_datum", byte_granularity); /* Get proper index into buffer (handles big/little endian) */ @@ -659,6 +690,8 @@ /* Should not get here */ break; } + + return_VOID; } @@ -690,7 +723,8 @@ { u32 index; - ACPI_FUNCTION_ENTRY (); + + ACPI_FUNCTION_TRACE_U32 ("ex_set_buffer_datum", byte_granularity); /* Get proper index into buffer (handles big/little endian) */ @@ -724,6 +758,8 @@ /* Should not get here */ break; } + + return_VOID; } @@ -777,7 +813,7 @@ obj_desc->common_field.access_byte_width); ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "byte_len=%X, datum_len=%X, byte_gran=%X\n", + "byte_len %X, datum_len %X, byte_gran %X\n", byte_field_length, datum_count,obj_desc->common_field.access_byte_width)); /* @@ -942,20 +978,27 @@ * larger than the field, this typically happens when an integer is * written to a field that is actually smaller than an integer. */ - byte_field_length = ACPI_ROUND_BITS_UP_TO_BYTES (obj_desc->common_field.bit_length); + byte_field_length = ACPI_ROUND_BITS_UP_TO_BYTES ( + obj_desc->common_field.bit_length); if (buffer_length < byte_field_length) { - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Buffer length %X too small for field %X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Buffer length %X too small for field %X\n", buffer_length, byte_field_length)); return_ACPI_STATUS (AE_BUFFER_OVERFLOW); } + byte_field_length = ACPI_ROUND_BITS_UP_TO_BYTES ( + obj_desc->common_field.start_field_bit_offset + + obj_desc->common_field.bit_length); + /* Convert byte count to datum count, round up if necessary */ - datum_count = ACPI_ROUND_UP_TO (byte_field_length, obj_desc->common_field.access_byte_width); + datum_count = ACPI_ROUND_UP_TO (byte_field_length, + obj_desc->common_field.access_byte_width); ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "byte_len=%X, datum_len=%X, byte_gran=%X\n", + "Bytes %X, Datums %X, byte_gran %X\n", byte_field_length, datum_count, obj_desc->common_field.access_byte_width)); /* @@ -1006,6 +1049,10 @@ return_ACPI_STATUS (status); } + /* We just wrote the first datum */ + + datum_offset++; + /* If the entire field fits within one datum, we are done. */ if ((datum_count == 1) && @@ -1025,7 +1072,6 @@ * applied in Part3 below. */ while (datum_offset < datum_count) { - datum_offset++; field_datum_byte_offset += obj_desc->common_field.access_byte_width; /* @@ -1057,33 +1103,34 @@ * a datum boundary. Update Rule must be applied to the bits outside * the field. */ - if (datum_offset == datum_count) { + datum_offset++; + if ((datum_offset == datum_count) && + (obj_desc->common_field.end_field_valid_bits)) { /* * If there are dangling non-aligned bits, perform one more merged write * Else - field is aligned at the end, no need for any more writes */ - if (obj_desc->common_field.end_field_valid_bits) { - /* - * Part3: - * This is the last datum and the field does not end on a datum boundary. - * Build the partial datum and write with the update rule. - * - * Mask off the unused bits above (after) the end-of-field - */ - mask = ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_field_valid_bits); - merged_datum &= mask; - /* Write the last datum with the update rule */ + /* + * Part3: + * This is the last datum and the field does not end on a datum boundary. + * Build the partial datum and write with the update rule. + * + * Mask off the unused bits above (after) the end-of-field + */ + mask = ACPI_MASK_BITS_ABOVE (obj_desc->common_field.end_field_valid_bits); + merged_datum &= mask; + + /* Write the last datum with the update rule */ - status = acpi_ex_write_with_update_rule (obj_desc, mask, merged_datum, - field_datum_byte_offset); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + status = acpi_ex_write_with_update_rule (obj_desc, mask, merged_datum, + field_datum_byte_offset); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); } } else { - /* Normal case -- write the completed datum */ + /* Normal (aligned) case -- write the completed datum */ status = acpi_ex_field_datum_io (obj_desc, field_datum_byte_offset, &merged_datum, ACPI_WRITE); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exoparg1.c linux-2.4.23-pre8/drivers/acpi/executer/exoparg1.c --- linux-2.4.22/drivers/acpi/executer/exoparg1.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exoparg1.c 2003-10-22 22:49:35.000000000 +0000 @@ -524,7 +524,7 @@ acpi_integer value; - ACPI_FUNCTION_TRACE_STR ("ex_opcode_1A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + ACPI_FUNCTION_TRACE_STR ("ex_opcode_1A_0T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); /* Examine the AML opcode */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exprep.c linux-2.4.23-pre8/drivers/acpi/executer/exprep.c --- linux-2.4.22/drivers/acpi/executer/exprep.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exprep.c 2003-10-22 22:47:59.000000000 +0000 @@ -53,6 +53,133 @@ ACPI_MODULE_NAME ("exprep") +#ifdef ACPI_UNDER_DEVELOPMENT +/******************************************************************************* + * + * FUNCTION: acpi_ex_generate_access + * + * PARAMETERS: field_bit_offset - Start of field within parent region/buffer + * field_bit_length - Length of field in bits + * region_length - Length of parent in bytes + * + * RETURN: Field granularity (8, 16, 32 or 64) and + * byte_alignment (1, 2, 3, or 4) + * + * DESCRIPTION: Generate an optimal access width for fields defined with the + * any_acc keyword. + * + * NOTE: Need to have the region_length in order to check for boundary + * conditions (end-of-region). However, the region_length is a deferred + * operation. Therefore, to complete this implementation, the generation + * of this access width must be deferred until the region length has + * been evaluated. + * + ******************************************************************************/ + +static u32 +acpi_ex_generate_access ( + u32 field_bit_offset, + u32 field_bit_length, + u32 region_length) +{ + u32 field_byte_length; + u32 field_byte_offset; + u32 field_byte_end_offset; + u32 access_byte_width; + u32 field_start_offset; + u32 field_end_offset; + u32 minimum_access_width = 0xFFFFFFFF; + u32 minimum_accesses = 0xFFFFFFFF; + u32 accesses; + + + ACPI_FUNCTION_TRACE ("ex_generate_access"); + + + /* Round Field start offset and length to "minimal" byte boundaries */ + + field_byte_offset = ACPI_DIV_8 (ACPI_ROUND_DOWN (field_bit_offset, 8)); + field_byte_end_offset = ACPI_DIV_8 (ACPI_ROUND_UP (field_bit_length + field_bit_offset, 8)); + field_byte_length = field_byte_end_offset - field_byte_offset; + + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Bit length %d, Bit offset %d\n", + field_bit_length, field_bit_offset)); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Byte Length %d, Byte Offset %d, End Offset %d\n", + field_byte_length, field_byte_offset, field_byte_end_offset)); + + /* + * Iterative search for the maximum access width that is both aligned + * and does not go beyond the end of the region + * + * Start at byte_acc and work upwards to qword_acc max. (1,2,4,8 bytes) + */ + for (access_byte_width = 1; access_byte_width <= 8; access_byte_width <<= 1) { + /* + * 1) Round end offset up to next access boundary and make sure that this + * does not go beyond the end of the parent region. + * 2) When the Access width is greater than the field_byte_length, we are done. + * (This does not optimize for the perfectly aligned case yet). + */ + if (ACPI_ROUND_UP (field_byte_end_offset, access_byte_width) <= region_length) { + field_start_offset = ACPI_ROUND_DOWN (field_byte_offset, access_byte_width) / + access_byte_width; + field_end_offset = ACPI_ROUND_UP ((field_byte_length + field_byte_offset), + access_byte_width) / access_byte_width; + accesses = field_end_offset - field_start_offset; + + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "access_width %d end is within region\n", access_byte_width)); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Field Start %d, Field End %d -- requires %d accesses\n", + field_start_offset, field_end_offset, accesses)); + + /* Single access is optimal */ + + if (accesses <= 1) { + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Entire field can be accessed with one operation of size %d\n", + access_byte_width)); + return_VALUE (access_byte_width); + } + + /* + * Fits in the region, but requires more than one read/write. + * try the next wider access on next iteration + */ + if (accesses < minimum_accesses) { + minimum_accesses = accesses; + minimum_access_width = access_byte_width; + } + } + else { + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "access_width %d end is NOT within region\n", access_byte_width)); + if (access_byte_width == 1) { + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Field goes beyond end-of-region!\n")); + return_VALUE (0); /* Field does not fit in the region at all */ + } + + /* This width goes beyond the end-of-region, back off to previous access */ + + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Backing off to previous optimal access width of %d\n", + minimum_access_width)); + return_VALUE (minimum_access_width); + } + } + + /* Could not read/write field with one operation, just use max access width */ + + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, + "Cannot access field in one operation, using width 8\n")); + return_VALUE (8); +} +#endif /* ACPI_UNDER_DEVELOPMENT */ + + /******************************************************************************* * * FUNCTION: acpi_ex_decode_field_access @@ -74,12 +201,11 @@ u32 *return_byte_alignment) { u32 access; - u8 byte_alignment; - u8 bit_length; -/* u32 Length; */ + u32 byte_alignment; + u32 bit_length; - ACPI_FUNCTION_NAME ("ex_decode_field_access"); + ACPI_FUNCTION_TRACE ("ex_decode_field_access"); access = (field_flags & AML_FIELD_ACCESS_TYPE_MASK); @@ -87,41 +213,15 @@ switch (access) { case AML_FIELD_ACCESS_ANY: +#ifdef ACPI_UNDER_DEVELOPMENT + byte_alignment = acpi_ex_generate_access (obj_desc->common_field.start_field_bit_offset, + obj_desc->common_field.bit_length, + 0xFFFFFFFF /* Temp until we pass region_length as param */); + bit_length = byte_alignment * 8; +#endif + byte_alignment = 1; bit_length = 8; - -#if 0 - /* - * TBD: optimize - * - * Any attempt to optimize the access size to the size of the field - * must take into consideration the length of the region and take - * care that an access to the field will not attempt to access - * beyond the end of the region. - */ - - /* Use the length to set the access type */ - - length = obj_desc->common_field.bit_length; - - if (length <= 8) { - bit_length = 8; - } - else if (length <= 16) { - bit_length = 16; - } - else if (length <= 32) { - bit_length = 32; - } - else if (length <= 64) { - bit_length = 64; - } - else { - /* Larger than Qword - just use byte-size chunks */ - - bit_length = 8; - } -#endif break; case AML_FIELD_ACCESS_BYTE: @@ -151,7 +251,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown field access type %X\n", access)); - return (0); + return_VALUE (0); } if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_BUFFER_FIELD) { @@ -164,7 +264,7 @@ } *return_byte_alignment = byte_alignment; - return (bit_length); + return_VALUE (bit_length); } @@ -336,7 +436,7 @@ type = acpi_ns_get_type (info->region_node); if (type != ACPI_TYPE_REGION) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Needed Region, found type %X %s\n", + "Needed Region, found type %X (%s)\n", type, acpi_ut_get_type_name (type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); @@ -372,7 +472,7 @@ acpi_ut_add_reference (obj_desc->field.region_obj); ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "region_field: Bitoff=%X Off=%X Gran=%X Region %p\n", + "region_field: bit_off %X, Off %X, Gran %X, Region %p\n", obj_desc->field.start_field_bit_offset, obj_desc->field.base_byte_offset, obj_desc->field.access_byte_width, obj_desc->field.region_obj)); break; @@ -390,7 +490,7 @@ acpi_ut_add_reference (obj_desc->bank_field.bank_obj); ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "Bank Field: bit_off=%X Off=%X Gran=%X Region %p bank_reg %p\n", + "Bank Field: bit_off %X, Off %X, Gran %X, Region %p, bank_reg %p\n", obj_desc->bank_field.start_field_bit_offset, obj_desc->bank_field.base_byte_offset, obj_desc->field.access_byte_width, @@ -417,9 +517,10 @@ acpi_ut_add_reference (obj_desc->index_field.index_obj); ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "index_field: bitoff=%X off=%X gran=%X Index %p Data %p\n", + "index_field: bit_off %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n", obj_desc->index_field.start_field_bit_offset, obj_desc->index_field.base_byte_offset, + obj_desc->index_field.value, obj_desc->field.access_byte_width, obj_desc->index_field.index_obj, obj_desc->index_field.data_obj)); @@ -437,7 +538,7 @@ status = acpi_ns_attach_object (info->field_node, obj_desc, acpi_ns_get_type (info->field_node)); - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "set named_obj %p (%4.4s) val = %p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Set named_obj %p [%4.4s], obj_desc %p\n", info->field_node, info->field_node->name.ascii, obj_desc)); /* Remove local reference to the object */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exresnte.c linux-2.4.23-pre8/drivers/acpi/executer/exresnte.c --- linux-2.4.22/drivers/acpi/executer/exresnte.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exresnte.c 2003-10-22 22:48:12.000000000 +0000 @@ -47,6 +47,8 @@ #include #include #include +#include +#include #define _COMPONENT ACPI_EXECUTER @@ -243,12 +245,26 @@ case ACPI_TYPE_LOCAL_REFERENCE: - /* No named references are allowed here */ + switch (source_desc->reference.opcode) { + case AML_LOAD_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported Reference opcode %X\n", - source_desc->reference.opcode)); + /* This is a ddb_handle */ + /* Return an additional reference to the object */ - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + obj_desc = source_desc; + acpi_ut_add_reference (obj_desc); + break; + + default: + /* No named references are allowed here */ + + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported Reference opcode %X (%s)\n", + source_desc->reference.opcode, + acpi_ps_get_opcode_name (source_desc->reference.opcode))); + + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + } + break; /* Default case is for unknown types */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exresolv.c linux-2.4.23-pre8/drivers/acpi/executer/exresolv.c --- linux-2.4.22/drivers/acpi/executer/exresolv.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exresolv.c 2003-10-22 22:48:34.000000000 +0000 @@ -48,6 +48,7 @@ #include #include #include +#include #define _COMPONENT ACPI_EXECUTER @@ -248,6 +249,7 @@ case AML_REF_OF_OP: case AML_DEBUG_OP: + case AML_LOAD_OP: /* Just leave the object as-is */ @@ -256,8 +258,8 @@ default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Reference opcode %X in %p\n", - opcode, stack_desc)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Reference opcode %X (%s) in %p\n", + opcode, acpi_ps_get_opcode_name (opcode), stack_desc)); status = AE_AML_INTERNAL; break; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exresop.c linux-2.4.23-pre8/drivers/acpi/executer/exresop.c --- linux-2.4.22/drivers/acpi/executer/exresop.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exresop.c 2003-10-22 22:49:31.000000000 +0000 @@ -224,6 +224,7 @@ case AML_REF_OF_OP: case AML_ARG_OP: case AML_LOCAL_OP: + case AML_LOAD_OP: /* ddb_handle from LOAD_OP or LOAD_TABLE_OP */ ACPI_DEBUG_ONLY_MEMBERS (ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Reference Opcode: %s\n", op_info->name))); @@ -231,8 +232,9 @@ default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Unknown Reference Opcode %X\n", - obj_desc->reference.opcode)); + "Unknown Reference Opcode %X [%s]\n", + obj_desc->reference.opcode, + (acpi_ps_get_opcode_info (obj_desc->reference.opcode))->name)); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } @@ -378,6 +380,13 @@ type_needed = ACPI_TYPE_ANY; break; + case ARGI_DDBHANDLE: + + /* Need an operand of type ACPI_TYPE_DDB_HANDLE */ + + type_needed = ACPI_TYPE_LOCAL_REFERENCE; + break; + /* * The more complex cases allow multiple resolved object types diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exstoren.c linux-2.4.23-pre8/drivers/acpi/executer/exstoren.c --- linux-2.4.22/drivers/acpi/executer/exstoren.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exstoren.c 2003-10-22 22:47:45.000000000 +0000 @@ -46,6 +46,7 @@ #include #include +#include #define _COMPONENT ACPI_EXECUTER @@ -114,9 +115,10 @@ /* * Must have a Integer, Buffer, or String */ - if ((ACPI_GET_OBJECT_TYPE (source_desc) != ACPI_TYPE_INTEGER) && - (ACPI_GET_OBJECT_TYPE (source_desc) != ACPI_TYPE_BUFFER) && - (ACPI_GET_OBJECT_TYPE (source_desc) != ACPI_TYPE_STRING)) { + if ((ACPI_GET_OBJECT_TYPE (source_desc) != ACPI_TYPE_INTEGER) && + (ACPI_GET_OBJECT_TYPE (source_desc) != ACPI_TYPE_BUFFER) && + (ACPI_GET_OBJECT_TYPE (source_desc) != ACPI_TYPE_STRING) && + !((ACPI_GET_OBJECT_TYPE (source_desc) == ACPI_TYPE_LOCAL_REFERENCE) && (source_desc->reference.opcode == AML_LOAD_OP))) { /* * Conversion successful but still not a valid type */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/executer/exsystem.c linux-2.4.23-pre8/drivers/acpi/executer/exsystem.c --- linux-2.4.22/drivers/acpi/executer/exsystem.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/executer/exsystem.c 2003-10-22 22:49:10.000000000 +0000 @@ -129,18 +129,13 @@ ACPI_FUNCTION_ENTRY (); - if (how_long > 1000) /* 1 millisecond */ { - /* Since this thread will sleep, we must release the interpreter */ - - acpi_ex_exit_interpreter (); - - acpi_os_sleep (0, (how_long / 1000) + 1); - - /* And now we must get the interpreter again */ - - status = acpi_ex_enter_interpreter (); + if (how_long > 100) /* 100 microseconds */ { + /* + * Longer than 100 usec, use sleep instead + * (according to ACPI specification) + */ + status = acpi_ex_system_do_suspend ((how_long / 1000) + 1); } - else { acpi_os_stall (how_long); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/hardware/hwacpi.c linux-2.4.23-pre8/drivers/acpi/hardware/hwacpi.c --- linux-2.4.22/drivers/acpi/hardware/hwacpi.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/hardware/hwacpi.c 2003-10-22 22:47:29.000000000 +0000 @@ -212,6 +212,15 @@ if (!acpi_gbl_FADT->smi_cmd) return_VALUE (ACPI_SYS_MODE_ACPI); + + /* + * ACPI 2.0 clarified that if SMI_CMD in FADT is zero, + * system does not support mode transition. + */ + if (!acpi_gbl_FADT->smi_cmd) { + return_VALUE (ACPI_SYS_MODE_ACPI); + } + status = acpi_get_register (ACPI_BITREG_SCI_ENABLE, &value, ACPI_MTX_LOCK); if (ACPI_FAILURE (status)) { return_VALUE (ACPI_SYS_MODE_LEGACY); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/namespace/nsdump.c linux-2.4.23-pre8/drivers/acpi/namespace/nsdump.c --- linux-2.4.22/drivers/acpi/namespace/nsdump.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/namespace/nsdump.c 2003-10-22 22:49:35.000000000 +0000 @@ -234,7 +234,7 @@ case ACPI_TYPE_DEVICE: - acpi_os_printf ("Notify object: %p", obj_desc); + acpi_os_printf ("Notify Object: %p\n", obj_desc); break; @@ -371,7 +371,7 @@ case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD: - acpi_os_printf (" Off %.2X Len %.2X Acc %.2hd\n", + acpi_os_printf ("Off %.2X Len %.2X Acc %.2hd\n", (obj_desc->common_field.base_byte_offset * 8) + obj_desc->common_field.start_field_bit_offset, obj_desc->common_field.bit_length, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/namespace/nssearch.c linux-2.4.23-pre8/drivers/acpi/namespace/nssearch.c --- linux-2.4.22/drivers/acpi/namespace/nssearch.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/namespace/nssearch.c 2003-10-22 22:49:45.000000000 +0000 @@ -96,7 +96,7 @@ scope_name = acpi_ns_get_external_pathname (node); if (scope_name) { - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (%s)\n", + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s (%p) For [%4.4s] (%s)\n", scope_name, node, (char *) &target_name, acpi_ut_get_type_name (type))); ACPI_MEM_FREE (scope_name); @@ -117,9 +117,9 @@ * Found matching entry. */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Name %4.4s Type [%s] found in scope [%4.4s] %p\n", + "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n", (char *) &target_name, acpi_ut_get_type_name (next_node->type), - next_node->name.ascii, next_node)); + next_node, node->name.ascii, node)); *return_node = next_node; return_ACPI_STATUS (AE_OK); @@ -143,7 +143,7 @@ /* Searched entire namespace level, not found */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Name %4.4s Type [%s] not found in search in scope [%4.4s] %p first child %p\n", + "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n", (char *) &target_name, acpi_ut_get_type_name (type), node->name.ascii, node, node->child)); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/namespace/nsutils.c linux-2.4.23-pre8/drivers/acpi/namespace/nsutils.c --- linux-2.4.22/drivers/acpi/namespace/nsutils.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/namespace/nsutils.c 2003-10-22 22:48:56.000000000 +0000 @@ -175,6 +175,11 @@ acpi_status status; + if (!node) { + acpi_os_printf ("[NULL NAME]"); + return; + } + /* Convert handle to a full pathname and print it (with supplied message) */ buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; @@ -470,11 +475,11 @@ *result = 0; if (info->fully_qualified) { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (abs) \"\\%s\"\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (abs) \"\\%s\"\n", internal_name, internal_name)); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (rel) \"%s\"\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (rel) \"%s\"\n", internal_name, internal_name)); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/parser/psparse.c linux-2.4.23-pre8/drivers/acpi/parser/psparse.c --- linux-2.4.22/drivers/acpi/parser/psparse.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/parser/psparse.c 2003-10-22 22:47:55.000000000 +0000 @@ -437,7 +437,6 @@ return_ACPI_STATUS (AE_BAD_PARAMETER); } - parser_state = &walk_state->parser_state; walk_state->arg_types = 0; @@ -705,10 +704,9 @@ walk_state->arg_types = 0; break; - default: - /* Op is not a constant or string, append each argument */ + /* Op is not a constant or string, append each argument to the Op */ while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && !walk_state->arg_count) { @@ -727,23 +725,23 @@ INCREMENT_ARG_LIST (walk_state->arg_types); } + /* Special processing for certain opcodes */ + switch (op->common.aml_opcode) { case AML_METHOD_OP: - /* For a method, save the length and address of the body */ - /* - * Skip parsing of control method or opregion body, + * Skip parsing of control method * because we don't have enough info in the first pass - * to parse them correctly. + * to parse it correctly. + * + * Save the length and address of the body */ op->named.data = parser_state->aml; op->named.length = (u32) (parser_state->pkg_end - parser_state->aml); - /* - * Skip body of method. For op_regions, we must continue - * parsing because the opregion is not a standalone - * package (We don't know where the end is). - */ + + /* Skip body of method */ + parser_state->aml = parser_state->pkg_end; walk_state->arg_count = 0; break; @@ -756,15 +754,15 @@ (op->common.parent->common.aml_opcode == AML_NAME_OP) && (walk_state->descending_callback != acpi_ds_exec_begin_op)) { /* - * Skip parsing of + * Skip parsing of Buffers and Packages * because we don't have enough info in the first pass * to parse them correctly. */ op->named.data = aml_op_start; op->named.length = (u32) (parser_state->pkg_end - aml_op_start); - /* - * Skip body - */ + + /* Skip body */ + parser_state->aml = parser_state->pkg_end; walk_state->arg_count = 0; } @@ -778,6 +776,7 @@ break; default: + /* No action for all other opcodes */ break; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/pci_irq.c linux-2.4.23-pre8/drivers/acpi/pci_irq.c --- linux-2.4.22/drivers/acpi/pci_irq.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/pci_irq.c 2003-10-22 22:49:48.000000000 +0000 @@ -73,6 +73,9 @@ ACPI_FUNCTION_TRACE("acpi_pci_irq_find_prt_entry"); + if (!acpi_prt.count) + return_PTR(NULL); + /* * Parse through all PRT entries looking for a match on the specified * PCI device's segment, bus, device, and pin (don't care about func). diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/pci_link.c linux-2.4.23-pre8/drivers/acpi/pci_link.c --- linux-2.4.22/drivers/acpi/pci_link.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/pci_link.c 2003-10-22 22:48:57.000000000 +0000 @@ -216,7 +216,6 @@ return AE_CTRL_TERMINATE; } - static int acpi_pci_link_get_current ( struct acpi_pci_link *link) @@ -275,6 +274,28 @@ return_VALUE(result); } +static int +acpi_pci_link_try_get_current ( + struct acpi_pci_link *link, + int irq) +{ + int result; + + ACPI_FUNCTION_TRACE("acpi_pci_link_try_get_current"); + + result = acpi_pci_link_get_current(link); + if (result && link->irq.active) { + return_VALUE(result); + } + + if (!link->irq.active) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No active IRQ resource found\n")); + printk(KERN_WARNING "_CRS returns NULL! Using IRQ %d for device (%s [%s]).\n", irq, acpi_device_name(link->device), acpi_device_bid(link->device)); + link->irq.active = irq; + } + + return 0; +} static int acpi_pci_link_set ( @@ -290,7 +311,8 @@ struct acpi_buffer buffer = {sizeof(resource)+1, &resource}; int i = 0; int valid = 0; - + int resource_type = 0; + ACPI_FUNCTION_TRACE("acpi_pci_link_set"); if (!link || !irq) @@ -313,12 +335,23 @@ } } + /* If IRQ<=15, first try with a "normal" IRQ descriptor. If that fails, try with + * an extended one */ + if (irq <= 15) { + resource_type = ACPI_RSTYPE_IRQ; + } else { + resource_type = ACPI_RSTYPE_EXT_IRQ; + } + +retry_programming: + memset(&resource, 0, sizeof(resource)); /* NOTE: PCI interrupts are always level / active_low / shared. But not all interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for parameters */ - if (irq <= 15) { + switch(resource_type) { + case ACPI_RSTYPE_IRQ: resource.res.id = ACPI_RSTYPE_IRQ; resource.res.length = sizeof(struct acpi_resource); resource.res.data.irq.edge_level = link->irq.edge_level; @@ -326,8 +359,9 @@ resource.res.data.irq.shared_exclusive = ACPI_SHARED; resource.res.data.irq.number_of_interrupts = 1; resource.res.data.irq.interrupts[0] = irq; - } - else { + break; + + case ACPI_RSTYPE_EXT_IRQ: resource.res.id = ACPI_RSTYPE_EXT_IRQ; resource.res.length = sizeof(struct acpi_resource); resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER; @@ -337,11 +371,22 @@ resource.res.data.extended_irq.number_of_interrupts = 1; resource.res.data.extended_irq.interrupts[0] = irq; /* ignore resource_source, it's optional */ + break; } resource.end.id = ACPI_RSTYPE_END_TAG; /* Attempt to set the resource */ status = acpi_set_current_resources(link->handle, &buffer); + + + /* if we failed and IRQ <= 15, try again with an extended descriptor */ + if (ACPI_FAILURE(status) && (resource_type == ACPI_RSTYPE_IRQ)) { + resource_type = ACPI_RSTYPE_EXT_IRQ; + printk(PREFIX "Retrying with extended IRQ descriptor\n"); + goto retry_programming; + } + + /* check for total failure */ if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n")); return_VALUE(-ENODEV); @@ -359,7 +404,7 @@ } /* Make sure the active IRQ is the one we requested. */ - result = acpi_pci_link_get_current(link); + result = acpi_pci_link_try_get_current(link, irq); if (result) { return_VALUE(result); } @@ -454,16 +499,16 @@ irq = link->irq.active; } else { irq = link->irq.possible[0]; - } - /* - * Select the best IRQ. This is done in reverse to promote + /* + * Select the best IRQ. This is done in reverse to promote * the use of IRQs 9, 10, 11, and >15. */ for (i=(link->irq.possible_count-1); i>0; i--) { if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]]) irq = link->irq.possible[i]; } + } /* Attempt to enable the link device at this IRQ. */ if (acpi_pci_link_set(link, irq)) { @@ -514,10 +559,9 @@ return_VALUE(0); } - if (acpi_pci_link_allocate(link)) { - return -ENODEV; - } - + if (acpi_pci_link_allocate(link)) + return_VALUE(0); + if (!link->irq.active) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Link disabled\n")); return_VALUE(0); @@ -573,10 +617,6 @@ else printk(" %d", link->irq.possible[i]); } - if (!link->irq.active) - printk(", disabled"); - else if (!found) - printk(", enabled at IRQ %d", link->irq.active); printk(")\n"); /* TBD: Acquire/release lock */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/power.c linux-2.4.23-pre8/drivers/acpi/power.c --- linux-2.4.22/drivers/acpi/power.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/power.c 2003-10-22 22:47:39.000000000 +0000 @@ -323,6 +323,9 @@ if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3)) return_VALUE(-EINVAL); + if ((device->power.state < ACPI_STATE_D0) || (device->power.state > ACPI_STATE_D3)) + return_VALUE(-ENODEV); + cl = &device->power.states[device->power.state].resources; tl = &device->power.states[state].resources; @@ -345,8 +348,6 @@ goto end; } - device->power.state = state; - /* * Then we dereference all power resources used in the current list. */ @@ -356,6 +357,8 @@ goto end; } + /* We shouldn't change the state till all above operations succeed */ + device->power.state = state; end: if (result) ACPI_DEBUG_PRINT((ACPI_DB_WARN, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/resources/rsaddr.c linux-2.4.23-pre8/drivers/acpi/resources/rsaddr.c --- linux-2.4.22/drivers/acpi/resources/rsaddr.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/resources/rsaddr.c 2003-10-22 22:47:28.000000000 +0000 @@ -94,6 +94,12 @@ buffer += 1; ACPI_MOVE_16_TO_16 (&temp16, buffer); + /* Validate minimum descriptor length */ + + if (temp16 < 13) { + return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); + } + *bytes_consumed = temp16 + 3; output_struct->id = ACPI_RSTYPE_ADDRESS16; @@ -199,8 +205,11 @@ * pointer to where the null terminated string goes: * Each Interrupt takes 32-bits + the 5 bytes of the * stream that are default. + * + * Note: Some resource descriptors will have an additional null, so + * we add 1 to the length. */ - if (*bytes_consumed > 16) { + if (*bytes_consumed > (16 + 1)) { /* Dereference the Index */ temp8 = *buffer; @@ -401,7 +410,7 @@ /* * Buffer needs to be set to the length of the sting + one for the - * terminating null + * terminating null */ buffer += (acpi_size)(ACPI_STRLEN (linked_list->data.address16.resource_source.string_ptr) + 1); } @@ -470,8 +479,14 @@ */ buffer += 1; ACPI_MOVE_16_TO_16 (&temp16, buffer); - *bytes_consumed = temp16 + 3; + /* Validate minimum descriptor length */ + + if (temp16 < 23) { + return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); + } + + *bytes_consumed = temp16 + 3; output_struct->id = ACPI_RSTYPE_ADDRESS32; /* @@ -578,8 +593,11 @@ * This will leave us pointing to the Resource Source Index * If it is present, then save it off and calculate the * pointer to where the null terminated string goes: + * + * Note: Some resource descriptors will have an additional null, so + * we add 1 to the length. */ - if (*bytes_consumed > 26) { + if (*bytes_consumed > (26 + 1)) { /* Dereference the Index */ temp8 = *buffer; @@ -616,8 +634,8 @@ /* * In order for the struct_size to fall on a 32-bit boundary, - * calculate the length of the string and expand the - * struct_size to the next 32-bit boundary. + * calculate the length of the string and expand the + * struct_size to the next 32-bit boundary. */ temp8 = (u8) (index + 1); struct_size += ACPI_ROUND_UP_to_32_bITS (temp8); @@ -848,6 +866,12 @@ buffer += 1; ACPI_MOVE_16_TO_16 (&temp16, buffer); + /* Validate minimum descriptor length */ + + if (temp16 < 43) { + return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); + } + *bytes_consumed = temp16 + 3; output_struct->id = ACPI_RSTYPE_ADDRESS64; @@ -958,8 +982,11 @@ * pointer to where the null terminated string goes: * Each Interrupt takes 32-bits + the 5 bytes of the * stream that are default. + * + * Note: Some resource descriptors will have an additional null, so + * we add 1 to the length. */ - if (*bytes_consumed > 46) { + if (*bytes_consumed > (46 + 1)) { /* Dereference the Index */ temp8 = *buffer; @@ -992,7 +1019,6 @@ * Add the terminating null */ *temp_ptr = 0x00; - output_struct->data.address64.resource_source.string_length = index + 1; /* @@ -1064,7 +1090,6 @@ /* * Set a pointer to the Length field - to be filled in later */ - length_field = ACPI_CAST_PTR (u16, buffer); buffer += 2; @@ -1161,7 +1186,7 @@ /* * Buffer needs to be set to the length of the sting + one for the - * terminating null + * terminating null */ buffer += (acpi_size)(ACPI_STRLEN (linked_list->data.address64.resource_source.string_ptr) + 1); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/resources/rsirq.c linux-2.4.23-pre8/drivers/acpi/resources/rsirq.c --- linux-2.4.22/drivers/acpi/resources/rsirq.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/resources/rsirq.c 2003-10-22 22:48:54.000000000 +0000 @@ -319,6 +319,12 @@ buffer += 1; ACPI_MOVE_16_TO_16 (&temp16, buffer); + /* Validate minimum descriptor length */ + + if (temp16 < 6) { + return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); + } + *bytes_consumed = temp16 + 3; output_struct->id = ACPI_RSTYPE_EXT_IRQ; @@ -357,6 +363,12 @@ buffer += 1; temp8 = *buffer; + /* Must have at least one IRQ */ + + if (temp8 < 1) { + return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH); + } + output_struct->data.extended_irq.number_of_interrupts = temp8; /* @@ -388,9 +400,12 @@ * pointer to where the null terminated string goes: * Each Interrupt takes 32-bits + the 5 bytes of the * stream that are default. + * + * Note: Some resource descriptors will have an additional null, so + * we add 1 to the length. */ if (*bytes_consumed > - ((acpi_size) output_struct->data.extended_irq.number_of_interrupts * 4) + 5) { + ((acpi_size) output_struct->data.extended_irq.number_of_interrupts * 4) + (5 + 1)) { /* Dereference the Index */ temp8 = *buffer; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/system.c linux-2.4.23-pre8/drivers/acpi/system.c --- linux-2.4.22/drivers/acpi/system.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/system.c 2003-10-22 22:48:36.000000000 +0000 @@ -1192,11 +1192,21 @@ #if defined(CONFIG_MAGIC_SYSRQ) && defined(CONFIG_PM) +static int po_cb_active; + +static void acpi_po_tramp(void *x) +{ + acpi_power_off(); +} + /* Simple wrapper calling power down function. */ static void acpi_sysrq_power_off(int key, struct pt_regs *pt_regs, struct kbd_struct *kbd, struct tty_struct *tty) -{ - acpi_power_off(); +{ + static struct tq_struct tq = { .routine = acpi_po_tramp }; + if (po_cb_active++) + return; + schedule_task(&tq); } struct sysrq_key_op sysrq_acpi_poweroff_op = { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/tables/tbconvrt.c linux-2.4.23-pre8/drivers/acpi/tables/tbconvrt.c --- linux-2.4.22/drivers/acpi/tables/tbconvrt.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/tables/tbconvrt.c 2003-10-22 22:48:36.000000000 +0000 @@ -131,7 +131,7 @@ /* Copy the header and set the length */ ACPI_MEMCPY (new_table, table_info->pointer, sizeof (struct acpi_table_header)); - new_table->header.length = (u32) table_size; + new_table->length = (u32) table_size; /* Copy the table pointers */ @@ -430,17 +430,17 @@ * FADT length and version validation. The table must be at least as * long as the version 1.0 FADT */ - if (acpi_gbl_FADT->header.length < sizeof (struct fadt_descriptor_rev1)) { - ACPI_REPORT_ERROR (("Invalid FADT table length: 0x%X\n", acpi_gbl_FADT->header.length)); + if (acpi_gbl_FADT->length < sizeof (struct fadt_descriptor_rev1)) { + ACPI_REPORT_ERROR (("Invalid FADT table length: 0x%X\n", acpi_gbl_FADT->length)); return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH); } - if (acpi_gbl_FADT->header.revision >= FADT2_REVISION_ID) { - if (acpi_gbl_FADT->header.length < sizeof (struct fadt_descriptor_rev2)) { + if (acpi_gbl_FADT->revision >= FADT2_REVISION_ID) { + if (acpi_gbl_FADT->length < sizeof (struct fadt_descriptor_rev2)) { /* Length is too short to be a V2.0 table */ ACPI_REPORT_WARNING (("Inconsistent FADT length (0x%X) and revision (0x%X), using FADT V1.0 portion of table\n", - acpi_gbl_FADT->header.length, acpi_gbl_FADT->header.revision)); + acpi_gbl_FADT->length, acpi_gbl_FADT->revision)); acpi_tb_convert_fadt1 (local_fadt, (void *) acpi_gbl_FADT); } @@ -460,7 +460,7 @@ * Global FADT pointer will point to the new common V2.0 FADT */ acpi_gbl_FADT = local_fadt; - acpi_gbl_FADT->header.length = sizeof (FADT_DESCRIPTOR); + acpi_gbl_FADT->length = sizeof (FADT_DESCRIPTOR); /* Free the original table */ @@ -477,8 +477,8 @@ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Hex dump of common internal FADT, size %d (%X)\n", - acpi_gbl_FADT->header.length, acpi_gbl_FADT->header.length)); - ACPI_DUMP_BUFFER ((u8 *) (acpi_gbl_FADT), acpi_gbl_FADT->header.length); + acpi_gbl_FADT->length, acpi_gbl_FADT->length)); + ACPI_DUMP_BUFFER ((u8 *) (acpi_gbl_FADT), acpi_gbl_FADT->length); return_ACPI_STATUS (AE_OK); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/tables/tbinstal.c linux-2.4.23-pre8/drivers/acpi/tables/tbinstal.c --- linux-2.4.22/drivers/acpi/tables/tbinstal.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/tables/tbinstal.c 2003-10-22 22:48:12.000000000 +0000 @@ -350,7 +350,7 @@ void acpi_tb_delete_all_tables (void) { - acpi_table_type type; + acpi_table_type type; /* @@ -378,7 +378,7 @@ void acpi_tb_delete_tables_by_type ( - acpi_table_type type) + acpi_table_type type) { struct acpi_table_desc *table_desc; u32 count; @@ -425,15 +425,16 @@ break; } - /* Free the table */ - /* Get the head of the list */ - + /* + * Free the table + * 1) Get the head of the list + */ table_desc = acpi_gbl_table_lists[type].next; count = acpi_gbl_table_lists[type].count; /* - * Walk the entire list, deleting both the allocated tables - * and the table descriptors + * 2) Walk the entire list, deleting both the allocated tables + * and the table descriptors */ for (i = 0; i < count; i++) { table_desc = acpi_tb_uninstall_table (table_desc); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/tables.c linux-2.4.23-pre8/drivers/acpi/tables.c --- linux-2.4.22/drivers/acpi/tables.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/tables.c 2003-10-22 22:47:55.000000000 +0000 @@ -69,7 +69,8 @@ static unsigned long sdt_pa; /* Physical Address */ static unsigned long sdt_count; /* Table count */ -static struct acpi_table_sdt *sdt_entry; + +static struct acpi_table_sdt sdt_entry[ACPI_MAX_TABLES]; void acpi_table_print ( @@ -418,12 +419,6 @@ sdt_count = ACPI_MAX_TABLES; } - sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt)); - if (!sdt_entry) { - printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n"); - return -ENOMEM; - } - for (i = 0; i < sdt_count; i++) sdt_entry[i].pa = (unsigned long) mapped_xsdt->entry[i]; } @@ -470,12 +465,6 @@ sdt_count = ACPI_MAX_TABLES; } - sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt)); - if (!sdt_entry) { - printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n"); - return -ENOMEM; - } - for (i = 0; i < sdt_count; i++) sdt_entry[i].pa = (unsigned long) mapped_rsdt->entry[i]; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/utilities/utalloc.c linux-2.4.23-pre8/drivers/acpi/utilities/utalloc.c --- linux-2.4.22/drivers/acpi/utilities/utalloc.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/utilities/utalloc.c 2003-10-22 22:47:46.000000000 +0000 @@ -795,7 +795,7 @@ ACPI_MEMSET (&allocation->user_space, 0xEA, allocation->size); - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Freeing size %X\n", allocation->size)); + ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Freeing size 0%X\n", allocation->size)); status = acpi_ut_release_mutex (ACPI_MTX_MEMORY); return_ACPI_STATUS (status); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/utilities/utdelete.c linux-2.4.23-pre8/drivers/acpi/utilities/utdelete.c --- linux-2.4.22/drivers/acpi/utilities/utdelete.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/utilities/utdelete.c 2003-10-22 22:48:55.000000000 +0000 @@ -416,7 +416,7 @@ u32 i; union acpi_generic_state *state_list = NULL; union acpi_generic_state *state; - + union acpi_operand_object *tmp; ACPI_FUNCTION_TRACE_PTR ("ut_update_object_reference", object); @@ -448,8 +448,16 @@ switch (ACPI_GET_OBJECT_TYPE (object)) { case ACPI_TYPE_DEVICE: - acpi_ut_update_ref_count (object->device.system_notify, action); - acpi_ut_update_ref_count (object->device.device_notify, action); + tmp = object->device.system_notify; + if (tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->device.system_notify = NULL; + acpi_ut_update_ref_count (tmp, action); + + tmp = object->device.device_notify; + if (tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->device.device_notify = NULL; + acpi_ut_update_ref_count (tmp, action); + break; @@ -470,6 +478,10 @@ if (ACPI_FAILURE (status)) { goto error_exit; } + + tmp = object->package.elements[i]; + if (tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->package.elements[i] = NULL; } break; @@ -481,6 +493,10 @@ if (ACPI_FAILURE (status)) { goto error_exit; } + + tmp = object->buffer_field.buffer_obj; + if ( tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->buffer_field.buffer_obj = NULL; break; @@ -491,6 +507,10 @@ if (ACPI_FAILURE (status)) { goto error_exit; } + + tmp = object->field.region_obj; + if ( tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->field.region_obj = NULL; break; @@ -502,11 +522,19 @@ goto error_exit; } + tmp = object->bank_field.bank_obj; + if ( tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->bank_field.bank_obj = NULL; + status = acpi_ut_create_update_state_and_push ( object->bank_field.region_obj, action, &state_list); if (ACPI_FAILURE (status)) { goto error_exit; } + + tmp = object->bank_field.region_obj; + if ( tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->bank_field.region_obj = NULL; break; @@ -518,11 +546,19 @@ goto error_exit; } + tmp = object->index_field.index_obj; + if ( tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->index_field.index_obj = NULL; + status = acpi_ut_create_update_state_and_push ( object->index_field.data_obj, action, &state_list); if (ACPI_FAILURE (status)) { goto error_exit; } + + tmp = object->index_field.data_obj; + if ( tmp && (tmp->common.reference_count <= 1) && action == REF_DECREMENT) + object->index_field.data_obj = NULL; break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/acpi/utilities/utglobal.c linux-2.4.23-pre8/drivers/acpi/utilities/utglobal.c --- linux-2.4.22/drivers/acpi/utilities/utglobal.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/acpi/utilities/utglobal.c 2003-10-22 22:47:45.000000000 +0000 @@ -307,8 +307,8 @@ /*********** Name, Signature, Global typed pointer Signature size, Type How many allowed?, Contains valid AML? */ /* RSDP 0 */ {RSDP_NAME, RSDP_SIG, NULL, sizeof (RSDP_SIG)-1, ACPI_TABLE_ROOT | ACPI_TABLE_SINGLE}, - /* DSDT 1 */ {DSDT_SIG, DSDT_SIG, (void *) &acpi_gbl_DSDT, sizeof (DSDT_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE | ACPI_TABLE_EXECUTABLE}, - /* FADT 2 */ {FADT_SIG, FADT_SIG, (void *) &acpi_gbl_FADT, sizeof (FADT_SIG)-1, ACPI_TABLE_PRIMARY | ACPI_TABLE_SINGLE}, + /* DSDT 1 */ {DSDT_SIG, DSDT_SIG, (void *) &acpi_gbl_DSDT, sizeof (DSDT_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE | ACPI_TABLE_EXECUTABLE}, + /* FADT 2 */ {FADT_SIG, FADT_SIG, (void *) &acpi_gbl_FADT, sizeof (FADT_SIG)-1, ACPI_TABLE_PRIMARY | ACPI_TABLE_SINGLE}, /* FACS 3 */ {FACS_SIG, FACS_SIG, (void *) &acpi_gbl_FACS, sizeof (FACS_SIG)-1, ACPI_TABLE_SECONDARY| ACPI_TABLE_SINGLE}, /* PSDT 4 */ {PSDT_SIG, PSDT_SIG, NULL, sizeof (PSDT_SIG)-1, ACPI_TABLE_PRIMARY | ACPI_TABLE_MULTIPLE | ACPI_TABLE_EXECUTABLE}, /* SSDT 5 */ {SSDT_SIG, SSDT_SIG, NULL, sizeof (SSDT_SIG)-1, ACPI_TABLE_PRIMARY | ACPI_TABLE_MULTIPLE | ACPI_TABLE_EXECUTABLE}, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/atm/Makefile linux-2.4.23-pre8/drivers/atm/Makefile --- linux-2.4.22/drivers/atm/Makefile 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/atm/Makefile 2003-10-22 22:47:36.000000000 +0000 @@ -59,8 +59,6 @@ obj-$(CONFIG_ATM_HE) += suni.o endif -EXTRA_CFLAGS=-g - list-multi := fore_200e.o fore_200e-objs := fore200e.o $(FORE200E_FW_OBJS) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/atm/atmtcp.c linux-2.4.23-pre8/drivers/atm/atmtcp.c --- linux-2.4.22/drivers/atm/atmtcp.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/atm/atmtcp.c 2003-10-22 22:49:09.000000000 +0000 @@ -153,9 +153,9 @@ static int atmtcp_v_ioctl(struct atm_dev *dev,unsigned int cmd,void *arg) { - unsigned long flags; struct atm_cirange ci; struct atm_vcc *vcc; + struct sock *s; if (cmd != ATM_SETCIRANGE) return -ENOIOCTLCMD; if (copy_from_user(&ci,(void *) arg,sizeof(ci))) return -EFAULT; @@ -163,14 +163,18 @@ if (ci.vci_bits == ATM_CI_MAX) ci.vci_bits = MAX_VCI_BITS; if (ci.vpi_bits > MAX_VPI_BITS || ci.vpi_bits < 0 || ci.vci_bits > MAX_VCI_BITS || ci.vci_bits < 0) return -EINVAL; - spin_lock_irqsave(&dev->lock, flags); - for (vcc = dev->vccs; vcc; vcc = vcc->next) + read_lock(&vcc_sklist_lock); + for (s = vcc_sklist; s; s = s->next) { + vcc = s->protinfo.af_atm; + if (vcc->dev != dev) + continue; if ((vcc->vpi >> ci.vpi_bits) || (vcc->vci >> ci.vci_bits)) { - spin_unlock_irqrestore(&dev->lock, flags); + read_unlock(&vcc_sklist_lock); return -EBUSY; } - spin_unlock_irqrestore(&dev->lock, flags); + } + read_unlock(&vcc_sklist_lock); dev->ci_range = ci; return 0; } @@ -233,9 +237,9 @@ static void atmtcp_c_close(struct atm_vcc *vcc) { - unsigned long flags; struct atm_dev *atmtcp_dev; struct atmtcp_dev_data *dev_data; + struct sock *s; struct atm_vcc *walk; atmtcp_dev = (struct atm_dev *) vcc->dev_data; @@ -246,19 +250,23 @@ kfree(dev_data); shutdown_atm_dev(atmtcp_dev); vcc->dev_data = NULL; - spin_lock_irqsave(&atmtcp_dev->lock, flags); - for (walk = atmtcp_dev->vccs; walk; walk = walk->next) + read_lock(&vcc_sklist_lock); + for (s = vcc_sklist; s; s = s->next) { + walk = s->protinfo.af_atm; + if (walk->dev != atmtcp_dev) + continue; wake_up(&walk->sleep); - spin_unlock_irqrestore(&atmtcp_dev->lock, flags); + } + read_unlock(&vcc_sklist_lock); } static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb) { - unsigned long flags; struct atm_dev *dev; struct atmtcp_hdr *hdr; - struct atm_vcc *out_vcc; + struct sock *s; + struct atm_vcc *out_vcc = NULL; struct sk_buff *new_skb; int result = 0; @@ -270,13 +278,17 @@ (struct atmtcp_control *) skb->data); goto done; } - spin_lock_irqsave(&dev->lock, flags); - for (out_vcc = dev->vccs; out_vcc; out_vcc = out_vcc->next) + read_lock(&vcc_sklist_lock); + for (s = vcc_sklist; s; s = s->next) { + out_vcc = s->protinfo.af_atm; + if (out_vcc->dev != dev) + continue; if (out_vcc->vpi == ntohs(hdr->vpi) && out_vcc->vci == ntohs(hdr->vci) && out_vcc->qos.rxtp.traffic_class != ATM_NONE) break; - spin_unlock_irqrestore(&dev->lock, flags); + } + read_unlock(&vcc_sklist_lock); if (!out_vcc) { atomic_inc(&vcc->stats->tx_err); goto done; @@ -366,7 +378,7 @@ if (itf != -1) dev = atm_dev_lookup(itf); if (dev) { if (dev->ops != &atmtcp_v_dev_ops) { - atm_dev_release(dev); + atm_dev_put(dev); return -EMEDIUMTYPE; } if (PRIV(dev)->vcc) return -EBUSY; @@ -378,7 +390,8 @@ if (error) return error; } PRIV(dev)->vcc = vcc; - bind_vcc(vcc,&atmtcp_control_dev); + vcc->dev = &atmtcp_control_dev; + vcc_insert_socket(vcc->sk); set_bit(ATM_VF_META,&vcc->flags); set_bit(ATM_VF_READY,&vcc->flags); vcc->dev_data = dev; @@ -402,7 +415,7 @@ dev = atm_dev_lookup(itf); if (!dev) return -ENODEV; if (dev->ops != &atmtcp_v_dev_ops) { - atm_dev_release(dev); + atm_dev_put(dev); return -EMEDIUMTYPE; } dev_data = PRIV(dev); @@ -410,7 +423,7 @@ dev_data->persist = 0; if (PRIV(dev)->vcc) return 0; kfree(dev_data); - atm_dev_release(dev); + atm_dev_put(dev); shutdown_atm_dev(dev); return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/atm/eni.c linux-2.4.23-pre8/drivers/atm/eni.c --- linux-2.4.22/drivers/atm/eni.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/atm/eni.c 2003-10-22 22:48:11.000000000 +0000 @@ -1887,10 +1887,10 @@ static int get_ci(struct atm_vcc *vcc,short *vpi,int *vci) { - unsigned long flags; + struct sock *s; struct atm_vcc *walk; - spin_lock_irqsave(&vcc->dev->lock, flags); + read_lock(&vcc_sklist_lock); if (*vpi == ATM_VPI_ANY) *vpi = 0; if (*vci == ATM_VCI_ANY) { for (*vci = ATM_NOT_RSV_VCI; *vci < NR_VCI; (*vci)++) { @@ -1898,40 +1898,47 @@ ENI_DEV(vcc->dev)->rx_map[*vci]) continue; if (vcc->qos.txtp.traffic_class != ATM_NONE) { - for (walk = vcc->dev->vccs; walk; - walk = walk->next) + for (s = vcc_sklist; s; s = s->next) { + walk = s->protinfo.af_atm; + if (walk->dev != vcc->dev) + continue; if (test_bit(ATM_VF_ADDR,&walk->flags) && walk->vci == *vci && walk->qos.txtp.traffic_class != ATM_NONE) break; - if (walk) continue; + } + if (s) continue; } break; } - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return *vci == NR_VCI ? -EADDRINUSE : 0; } if (*vci == ATM_VCI_UNSPEC) { - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return 0; } if (vcc->qos.rxtp.traffic_class != ATM_NONE && ENI_DEV(vcc->dev)->rx_map[*vci]) { - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return -EADDRINUSE; } if (vcc->qos.txtp.traffic_class == ATM_NONE) { - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return 0; } - for (walk = vcc->dev->vccs; walk; walk = walk->next) + for (s = vcc_sklist; s; s = s->next) { + walk = s->protinfo.af_atm; + if (walk->dev != vcc->dev) + continue; if (test_bit(ATM_VF_ADDR,&walk->flags) && walk->vci == *vci && walk->qos.txtp.traffic_class != ATM_NONE) { - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return -EADDRINUSE; } - spin_unlock_irqrestore(&vcc->dev->lock, flags); + } + read_unlock(&vcc_sklist_lock); return 0; } @@ -2139,7 +2146,7 @@ static int eni_proc_read(struct atm_dev *dev,loff_t *pos,char *page) { - unsigned long flags; + struct sock *s; static const char *signal[] = { "LOST","unknown","okay" }; struct eni_dev *eni_dev = ENI_DEV(dev); struct atm_vcc *vcc; @@ -2212,11 +2219,15 @@ return sprintf(page,"%10sbacklog %u packets\n","", skb_queue_len(&tx->backlog)); } - spin_lock_irqsave(&dev->lock, flags); - for (vcc = dev->vccs; vcc; vcc = vcc->next) { - struct eni_vcc *eni_vcc = ENI_VCC(vcc); + read_lock(&vcc_sklist_lock); + for (s = vcc_sklist; s; s = s->next) { + struct eni_vcc *eni_vcc; int length; + vcc = s->protinfo.af_atm; + if (vcc->dev != dev) + continue; + eni_vcc = ENI_VCC(vcc); if (--left) continue; length = sprintf(page,"vcc %4d: ",vcc->vci); if (eni_vcc->rx) { @@ -2231,10 +2242,10 @@ length += sprintf(page+length,"tx[%d], txing %d bytes", eni_vcc->tx->index,eni_vcc->txing); page[length] = '\n'; - spin_unlock_irqrestore(&dev->lock, flags); + read_unlock(&vcc_sklist_lock); return length+1; } - spin_unlock_irqrestore(&dev->lock, flags); + read_unlock(&vcc_sklist_lock); for (i = 0; i < eni_dev->free_len; i++) { struct eni_free *fe = eni_dev->free_list+i; unsigned long offset; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/atm/fore200e.c linux-2.4.23-pre8/drivers/atm/fore200e.c --- linux-2.4.22/drivers/atm/fore200e.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/atm/fore200e.c 2003-10-22 22:48:54.000000000 +0000 @@ -1077,18 +1077,22 @@ static struct atm_vcc* fore200e_find_vcc(struct fore200e* fore200e, struct rpd* rpd) { - unsigned long flags; + struct sock *s; struct atm_vcc* vcc; - spin_lock_irqsave(&fore200e->atm_dev->lock, flags); - for (vcc = fore200e->atm_dev->vccs; vcc; vcc = vcc->next) { - - if (vcc->vpi == rpd->atm_header.vpi && vcc->vci == rpd->atm_header.vci) - break; + read_lock(&vcc_sklist_lock); + for(s = vcc_sklist; s; s = s->next) { + vcc = s->protinfo.af_atm; + if (vcc->dev != fore200e->atm_dev) + continue; + if (vcc->vpi == rpd->atm_header.vpi && vcc->vci == rpd->atm_header.vci) { + read_unlock(&vcc_sklist_lock); + return vcc; + } } - spin_unlock_irqrestore(&fore200e->atm_dev->lock, flags); - - return vcc; + read_unlock(&vcc_sklist_lock); + + return NULL; } @@ -1357,20 +1361,23 @@ static int fore200e_walk_vccs(struct atm_vcc *vcc, short *vpi, int *vci) { - unsigned long flags; struct atm_vcc* walk; + struct sock *s; /* find a free VPI */ - spin_lock_irqsave(&vcc->dev->lock, flags); + read_lock(&vcc_sklist_lock); if (*vpi == ATM_VPI_ANY) { - for (*vpi = 0, walk = vcc->dev->vccs; walk; walk = walk->next) { + for (*vpi = 0, s = vcc_sklist; s; s = s->next) { + walk = s->protinfo.af_atm; + if (walk->dev != vcc->dev) + continue; if ((walk->vci == *vci) && (walk->vpi == *vpi)) { (*vpi)++; - walk = vcc->dev->vccs; + s = vcc_sklist; } } } @@ -1378,16 +1385,19 @@ /* find a free VCI */ if (*vci == ATM_VCI_ANY) { - for (*vci = ATM_NOT_RSV_VCI, walk = vcc->dev->vccs; walk; walk = walk->next) { + for (*vci = ATM_NOT_RSV_VCI, s = vcc_sklist; s; s = s->next) { + walk = s->protinfo.af_atm; + if (walk->dev != vcc->dev) + continue; if ((walk->vpi = *vpi) && (walk->vci == *vci)) { *vci = walk->vci + 1; - walk = vcc->dev->vccs; + s = vcc_sklist; } } } - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return 0; } @@ -2649,7 +2659,7 @@ static int fore200e_proc_read(struct atm_dev *dev,loff_t* pos,char* page) { - unsigned long flags; + struct sock *s; struct fore200e* fore200e = FORE200E_DEV(dev); int len, left = *pos; @@ -2896,8 +2906,12 @@ len = sprintf(page,"\n" " VCCs:\n address\tVPI.VCI:AAL\t(min/max tx PDU size) (min/max rx PDU size)\n"); - spin_lock_irqsave(&fore200e->atm_dev->lock, flags); - for (vcc = fore200e->atm_dev->vccs; vcc; vcc = vcc->next) { + read_lock(&vcc_sklist_lock); + for (s = vcc_sklist; s; s = s->next) { + vcc = s->protinfo.af_atm; + + if (vcc->dev != fore200e->atm_dev) + continue; fore200e_vcc = FORE200E_VCC(vcc); @@ -2911,7 +2925,7 @@ fore200e_vcc->rx_max_pdu ); } - spin_unlock_irqrestore(&fore200e->atm_dev->lock, flags); + read_unlock(&vcc_sklist_lock); return len; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/atm/he.c linux-2.4.23-pre8/drivers/atm/he.c --- linux-2.4.22/drivers/atm/he.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/atm/he.c 2003-10-22 22:47:59.000000000 +0000 @@ -89,7 +89,7 @@ /* compatibility */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69) +#ifndef IRQ_HANDLED typedef void irqreturn_t; #define IRQ_NONE #define IRQ_HANDLED @@ -109,10 +109,6 @@ #define pci_get_drvdata(pci_dev) (pci_dev)->driver_data #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,44) -#define pci_pool_create(a, b, c, d, e) pci_pool_create(a, b, c, d, e, SLAB_KERNEL) -#endif - #include "he.h" #include "suni.h" @@ -327,25 +323,25 @@ he_writel_rcm(dev, val, 0x00000 | (cid << 3) | 7) static __inline__ struct atm_vcc* -he_find_vcc(struct he_dev *he_dev, unsigned cid) +__find_vcc(struct he_dev *he_dev, unsigned cid) { - unsigned long flags; struct atm_vcc *vcc; + struct sock *s; short vpi; int vci; vpi = cid >> he_dev->vcibits; vci = cid & ((1 << he_dev->vcibits) - 1); - spin_lock_irqsave(&he_dev->atm_dev->lock, flags); - for (vcc = he_dev->atm_dev->vccs; vcc; vcc = vcc->next) - if (vcc->vci == vci && vcc->vpi == vpi - && vcc->qos.rxtp.traffic_class != ATM_NONE) { - spin_unlock_irqrestore(&he_dev->atm_dev->lock, flags); - return vcc; - } + for (s = vcc_sklist; s; s = s->next) { + vcc = s->protinfo.af_atm; + if (vcc->vci == vci && vcc->vpi == vpi && + vcc->dev == he_dev->atm_dev && + vcc->qos.rxtp.traffic_class != ATM_NONE) { + return vcc; + } + } - spin_unlock_irqrestore(&he_dev->atm_dev->lock, flags); return NULL; } @@ -785,7 +781,7 @@ /* small buffer pool */ #ifdef USE_RBPS_POOL he_dev->rbps_pool = pci_pool_create("rbps", he_dev->pci_dev, - CONFIG_RBPS_BUFSIZE, 8, 0); + CONFIG_RBPS_BUFSIZE, 8, 0, SLAB_KERNEL); if (he_dev->rbps_pool == NULL) { hprintk("unable to create rbps pages\n"); return -ENOMEM; @@ -849,7 +845,7 @@ /* large buffer pool */ #ifdef USE_RBPL_POOL he_dev->rbpl_pool = pci_pool_create("rbpl", he_dev->pci_dev, - CONFIG_RBPL_BUFSIZE, 8, 0); + CONFIG_RBPL_BUFSIZE, 8, 0, SLAB_KERNEL); if (he_dev->rbpl_pool == NULL) { hprintk("unable to create rbpl pool\n"); return -ENOMEM; @@ -1475,7 +1471,7 @@ #ifdef USE_TPD_POOL he_dev->tpd_pool = pci_pool_create("tpd", he_dev->pci_dev, - sizeof(struct he_tpd), TPD_ALIGNMENT, 0); + sizeof(struct he_tpd), TPD_ALIGNMENT, 0, SLAB_KERNEL); if (he_dev->tpd_pool == NULL) { hprintk("unable to create tpd pci_pool\n"); return -ENOMEM; @@ -1781,6 +1777,7 @@ int pdus_assembled = 0; int updated = 0; + read_lock(&vcc_sklist_lock); while (he_dev->rbrq_head != rbrq_tail) { ++updated; @@ -1807,7 +1804,7 @@ cid = RBRQ_CID(he_dev->rbrq_head); if (cid != lastcid) - vcc = he_find_vcc(he_dev, cid); + vcc = __find_vcc(he_dev, cid); lastcid = cid; if (vcc == NULL) { @@ -1946,6 +1943,7 @@ RBRQ_MASK(++he_dev->rbrq_head)); } + read_unlock(&vcc_sklist_lock); if (updated) { if (updated > he_dev->rbrq_peak) @@ -2870,8 +2868,10 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; - copy_from_user(®, (struct he_ioctl_reg *) arg, - sizeof(struct he_ioctl_reg)); + if (copy_from_user(®, (struct he_ioctl_reg *) arg, + sizeof(struct he_ioctl_reg))) + return -EFAULT; + spin_lock_irqsave(&he_dev->global_lock, flags); switch (reg.type) { case HE_REGTYPE_PCI: @@ -2895,8 +2895,9 @@ } spin_unlock_irqrestore(&he_dev->global_lock, flags); if (err == 0) - copy_to_user((struct he_ioctl_reg *) arg, ®, - sizeof(struct he_ioctl_reg)); + if (copy_to_user((struct he_ioctl_reg *) arg, ®, + sizeof(struct he_ioctl_reg))) + return -EFAULT; break; default: #ifdef CONFIG_ATM_HE_USE_SUNI diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/atm/idt77252.c linux-2.4.23-pre8/drivers/atm/idt77252.c --- linux-2.4.22/drivers/atm/idt77252.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/atm/idt77252.c 2003-10-22 22:48:54.000000000 +0000 @@ -2404,37 +2404,43 @@ static int idt77252_find_vcc(struct atm_vcc *vcc, short *vpi, int *vci) { - unsigned long flags; + struct sock *s; struct atm_vcc *walk; - spin_lock_irqsave(&vcc->dev->lock, flags); + read_lock(&vcc_sklist_lock); if (*vpi == ATM_VPI_ANY) { *vpi = 0; - walk = vcc->dev->vccs; - while (walk) { + s = vcc_sklist; + while (s) { + walk = s->protinfo.af_atm; + if (walk->dev != vcc->dev) + continue; if ((walk->vci == *vci) && (walk->vpi == *vpi)) { (*vpi)++; - walk = vcc->dev->vccs; + s = vcc_sklist; continue; } - walk = walk->next; + s = s->next; } } if (*vci == ATM_VCI_ANY) { *vci = ATM_NOT_RSV_VCI; - walk = vcc->dev->vccs; - while (walk) { + s = vcc_sklist; + while (s) { + walk = s->protinfo.af_atm; + if (walk->dev != vcc->dev) + continue; if ((walk->vci == *vci) && (walk->vpi == *vpi)) { (*vci)++; - walk = vcc->dev->vccs; + s = vcc_sklist; continue; } - walk = walk->next; + s = s->next; } } - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/block/Config.in linux-2.4.23-pre8/drivers/block/Config.in --- linux-2.4.22/drivers/block/Config.in 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/block/Config.in 2003-10-22 22:48:15.000000000 +0000 @@ -36,6 +36,7 @@ dep_tristate 'Compaq SMART2 support' CONFIG_BLK_CPQ_DA $CONFIG_PCI dep_tristate 'Compaq Smart Array 5xxx support' CONFIG_BLK_CPQ_CISS_DA $CONFIG_PCI dep_mbool ' SCSI tape drive support for Smart Array 5xxx' CONFIG_CISS_SCSI_TAPE $CONFIG_BLK_CPQ_CISS_DA $CONFIG_SCSI +dep_mbool ' Enable monitor thread' CONFIG_CISS_MONITOR_THREAD $CONFIG_BLK_CPQ_CISS_DA dep_tristate 'Mylex DAC960/DAC1100 PCI RAID Controller support' CONFIG_BLK_DEV_DAC960 $CONFIG_PCI dep_tristate 'Micro Memory MM5415 Battery Backed RAM support (EXPERIMENTAL)' CONFIG_BLK_DEV_UMEM $CONFIG_PCI $CONFIG_EXPERIMENTAL diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/block/cciss.c linux-2.4.23-pre8/drivers/block/cciss.c --- linux-2.4.22/drivers/block/cciss.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/block/cciss.c 2003-10-22 22:49:46.000000000 +0000 @@ -38,19 +38,20 @@ #include #include #include +#include #include #include #include #define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin)) -#define DRIVER_NAME "HP CISS Driver (v 2.4.47)" -#define DRIVER_VERSION CCISS_DRIVER_VERSION(2,4,47) +#define DRIVER_NAME "HP CISS Driver (v 2.4.50)" +#define DRIVER_VERSION CCISS_DRIVER_VERSION(2,4,50) /* Embedded module documentation macros - see modules.h */ MODULE_AUTHOR("Hewlett-Packard Company"); -MODULE_DESCRIPTION("Driver for HP SA5xxx SA6xxx Controllers version 2.4.47"); -MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400"); +MODULE_DESCRIPTION("Driver for HP SA5xxx SA6xxx Controllers version 2.4.50"); +MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400 6i"); MODULE_LICENSE("GPL"); #include "cciss_cmd.h" @@ -75,6 +76,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 +97,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 */ @@ -105,12 +109,30 @@ #define READ_AHEAD 128 #define NR_CMDS 128 /* #commands that can be outstanding */ -#define MAX_CTLR 8 +#define MAX_CTLR 32 + +/* No sense in giving up our preallocated major numbers */ +#if MAX_CTLR < 8 +#error"cciss.c: MAX_CTLR must be 8 or greater" +#endif + +/* Originally cciss driver only supports 8 major number */ +#define MAX_CTLR_ORIG COMPAQ_CISS_MAJOR7 - COMPAQ_CISS_MAJOR + 1 #define CCISS_DMA_MASK 0xFFFFFFFFFFFFFFFF /* 64 bit DMA */ -static ctlr_info_t *hba[MAX_CTLR]; +#ifdef CONFIG_CISS_MONITOR_THREAD +static int cciss_monitor(void *ctlr); +static int start_monitor_thread(ctlr_info_t *h, unsigned char *cmd, + unsigned long count, int (*cciss_monitor)(void *), int *rc); +static u32 heartbeat_timer = 0; +#else +#define cciss_monitor(x) +#define kill_monitor_thead(x) +#endif +static ctlr_info_t *hba[MAX_CTLR]; +static int map_major_to_ctlr[MAX_BLKDEV] = {0}; /* gets ctlr num from maj num */ static struct proc_dir_entry *proc_cciss; static void do_cciss_request(request_queue_t *q); @@ -188,7 +210,11 @@ "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", + "Max SG entries since init: %d\n" + MONITOR_PERIOD_PATTERN + MONITOR_DEADLINE_PATTERN + MONITOR_STATUS_PATTERN + "\n", h->devname, h->product_name, (unsigned long)h->board_id, @@ -196,7 +222,10 @@ (unsigned int)h->intr, h->num_luns, h->Qdepth, h->commands_outstanding, - h->maxQsinceinit, h->max_outstanding, h->maxSG); + h->maxQsinceinit, h->max_outstanding, h->maxSG, + MONITOR_PERIOD_VALUE(h), + MONITOR_DEADLINE_VALUE(h), + CTLR_STATUS(h)); pos += size; len += size; cciss_proc_tape_report(ctlr, buffer, &pos, &len); @@ -231,10 +260,8 @@ { unsigned char cmd[80]; int len; -#ifdef CONFIG_CISS_SCSI_TAPE ctlr_info_t *h = (ctlr_info_t *) data; int rc; -#endif if (count > sizeof(cmd)-1) return -EINVAL; @@ -244,6 +271,7 @@ len = strlen(cmd); if (cmd[len-1] == '\n') cmd[--len] = '\0'; + # ifdef CONFIG_CISS_SCSI_TAPE if (strcmp("engage scsi", cmd)==0) { rc = cciss_engage_scsi(h->ctlr); @@ -254,6 +282,10 @@ /* might be nice to have "disengage" too, but it's not safely possible. (only 1 module use count, lock issues.) */ # endif + + if (START_MONITOR_THREAD(h, cmd, count, cciss_monitor, &rc) == 0) + return rc; + return -EINVAL; } @@ -400,14 +432,14 @@ */ static int cciss_open(struct inode *inode, struct file *filep) { - int ctlr = MAJOR(inode->i_rdev) - MAJOR_NR; + int ctlr = map_major_to_ctlr[MAJOR(inode->i_rdev)]; int dsk = MINOR(inode->i_rdev) >> NWD_SHIFT; #ifdef CCISS_DEBUG printk(KERN_DEBUG "cciss_open %x (%x:%x)\n", inode->i_rdev, ctlr, dsk); #endif /* CCISS_DEBUG */ - if (ctlr > MAX_CTLR || hba[ctlr] == NULL) + if (ctlr > MAX_CTLR || hba[ctlr] == NULL || !CTLR_IS_ALIVE(hba[ctlr])) return -ENXIO; /* * Root is allowed to open raw volume zero even if its not configured @@ -441,7 +473,7 @@ */ static int cciss_release(struct inode *inode, struct file *filep) { - int ctlr = MAJOR(inode->i_rdev) - MAJOR_NR; + int ctlr = map_major_to_ctlr[MAJOR(inode->i_rdev)]; int dsk = MINOR(inode->i_rdev) >> NWD_SHIFT; #ifdef CCISS_DEBUG @@ -461,7 +493,7 @@ static int cciss_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg) { - int ctlr = MAJOR(inode->i_rdev) - MAJOR_NR; + int ctlr = map_major_to_ctlr[MAJOR(inode->i_rdev)]; int dsk = MINOR(inode->i_rdev) >> NWD_SHIFT; #ifdef CCISS_DEBUG @@ -1007,7 +1039,7 @@ int i; target = MINOR(dev) >> NWD_SHIFT; - ctlr = MAJOR(dev) - MAJOR_NR; + ctlr = map_major_to_ctlr[MAJOR(dev)]; gdev = &(hba[ctlr]->gendisk); spin_lock_irqsave(&io_request_lock, flags); @@ -1026,12 +1058,12 @@ for(i=max_p-1; i>=0; i--) { int minor = start+i; - invalidate_device(MKDEV(MAJOR_NR + ctlr, minor), 1); + invalidate_device(MKDEV(hba[ctlr]->major, minor), 1); gdev->part[minor].start_sect = 0; gdev->part[minor].nr_sects = 0; /* reset the blocksize so we can read the partition table */ - blksize_size[MAJOR_NR+ctlr][minor] = 1024; + blksize_size[hba[ctlr]->major][minor] = 1024; } /* setup partitions per disk */ grok_partitions(gdev, target, MAX_PART, @@ -1072,7 +1104,7 @@ for (i=max_p-1; i>=0; i--) { int minor = start+i; /* printk("invalidating( %d %d)\n", ctlr, minor); */ - invalidate_device(MKDEV(MAJOR_NR+ctlr, minor), 1); + invalidate_device(MKDEV(hba[ctlr]->major, minor), 1); /* so open will now fail */ h->sizes[minor] = 0; /* so it will no longer appear in /proc/partitions */ @@ -1107,7 +1139,8 @@ size_t size, unsigned int use_unit_num, unsigned int log_unit, - __u8 page_code ) + __u8 page_code, + __u8 cmdtype) { ctlr_info_t *h = hba[ctlr]; CommandList_struct *c; @@ -1131,6 +1164,9 @@ } c->Header.Tag.lower = c->busaddr; /* tag is phys addr of cmd */ /* Fill in Request block */ + c->Request.CDB[0] = cmd; + c->Request.Type.Type = cmdtype; + if (cmdtype == TYPE_CMD) { switch (cmd) { case CISS_INQUIRY: /* If the logical unit number is 0 then, this is going @@ -1150,11 +1186,9 @@ c->Request.CDB[2] = page_code; } c->Request.CDBLen = 6; - c->Request.Type.Type = TYPE_CMD; c->Request.Type.Attribute = ATTR_SIMPLE; c->Request.Type.Direction = XFER_READ; /* Read */ c->Request.Timeout = 0; /* Don't time out */ - c->Request.CDB[0] = CISS_INQUIRY; c->Request.CDB[4] = size & 0xFF; break; case CISS_REPORT_LOG: @@ -1163,11 +1197,9 @@ So we have nothing to write. */ c->Request.CDBLen = 12; - c->Request.Type.Type = TYPE_CMD; c->Request.Type.Attribute = ATTR_SIMPLE; c->Request.Type.Direction = XFER_READ; /* Read */ c->Request.Timeout = 0; /* Don't time out */ - c->Request.CDB[0] = CISS_REPORT_LOG; c->Request.CDB[6] = (size >> 24) & 0xFF; /* MSB */ c->Request.CDB[7] = (size >> 16) & 0xFF; c->Request.CDB[8] = (size >> 8) & 0xFF; @@ -1178,18 +1210,38 @@ hba[ctlr]->drv[log_unit].LunID; c->Header.LUN.LogDev.Mode = 1; c->Request.CDBLen = 10; - c->Request.Type.Type = TYPE_CMD; /* It is a command. */ c->Request.Type.Attribute = ATTR_SIMPLE; c->Request.Type.Direction = XFER_READ; /* Read */ c->Request.Timeout = 0; /* Don't time out */ - c->Request.CDB[0] = CCISS_READ_CAPACITY; break; default: printk(KERN_WARNING "cciss: Unknown Command 0x%x sent attempted\n", cmd); cmd_free(h, c, 1); return IO_ERROR; - }; + } + } else if (cmdtype == TYPE_MSG) { + switch (cmd) { + case 3: /* No-Op message */ + c->Request.CDBLen = 1; + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = XFER_WRITE; + c->Request.Timeout = 0; + c->Request.CDB[0] = cmd; + break; + default: + printk(KERN_WARNING + "cciss%d: unknown message type %d\n", + ctlr, cmd); + cmd_free(h, c, 1); + return IO_ERROR; + } + } else { + printk(KERN_WARNING + "cciss%d: unknown command type %d\n", ctlr, cmdtype); + cmd_free(h, c, 1); + return IO_ERROR; + } /* Fill in the scatter gather information */ if (size > 0) { @@ -1352,7 +1404,7 @@ } return_code = sendcmd_withirq(CISS_REPORT_LOG, ctlr, ld_buff, - sizeof(ReportLunData_struct), 0, 0, 0 ); + sizeof(ReportLunData_struct), 0, 0, 0, TYPE_CMD); if (return_code == IO_OK) { listlength = be32_to_cpu(*((__u32 *) &ld_buff->LUNListLength[0])); @@ -1451,7 +1503,7 @@ memset(size_buff, 0, sizeof(ReadCapdata_struct)); return_code = sendcmd_withirq(CCISS_READ_CAPACITY, ctlr, size_buff, sizeof(ReadCapdata_struct), 1, - logvol, 0 ); + logvol, 0, TYPE_CMD); if (return_code == IO_OK) { total_size = (0xff & (unsigned int) size_buff->total_size[0]) << 24; @@ -1482,7 +1534,7 @@ /* Execute the command to read the disk geometry */ memset(inq_buff, 0, sizeof(InquiryData_struct)); return_code = sendcmd_withirq(CISS_INQUIRY, ctlr, inq_buff, - sizeof(InquiryData_struct), 1, logvol ,0xC1 ); + sizeof(InquiryData_struct), 1, logvol ,0xC1, TYPE_CMD); if (return_code == IO_OK) { if (inq_buff->data_byte[8] == 0xFF) { printk(KERN_WARNING @@ -1540,12 +1592,12 @@ for(i=max_p-1; i>=0; i--) { int minor = start+i; - invalidate_device(MKDEV(MAJOR_NR + ctlr, minor), 1); + invalidate_device(MKDEV(hba[ctlr]->major, minor), 1); gdev->part[minor].start_sect = 0; gdev->part[minor].nr_sects = 0; /* reset the blocksize so we can read the partition table */ - blksize_size[MAJOR_NR+ctlr][minor] = block_size; + blksize_size[hba[ctlr]->major][minor] = block_size; hba[ctlr]->hardsizes[minor] = block_size; } @@ -1590,7 +1642,8 @@ } memset(size_buff, 0, sizeof(ReadCapdata_struct)); return_code = sendcmd_withirq(CCISS_READ_CAPACITY, ctlr, size_buff, - sizeof( ReadCapdata_struct), 1, logvol, 0 ); + sizeof( ReadCapdata_struct), 1, logvol, 0, + TYPE_CMD); if (return_code == IO_OK) { total_size = (0xff & (unsigned int)(size_buff->total_size[0])) << 24; @@ -1619,7 +1672,7 @@ /* Execute the command to read the disk geometry */ memset(inq_buff, 0, sizeof(InquiryData_struct)); return_code = sendcmd_withirq(CISS_INQUIRY, ctlr, inq_buff, - sizeof(InquiryData_struct), 1, logvol ,0xC1 ); + sizeof(InquiryData_struct), 1, logvol ,0xC1, TYPE_CMD); if (return_code == IO_OK) { if (inq_buff->data_byte[8] == 0xFF) { printk(KERN_WARNING "cciss: reading geometry failed, " @@ -1658,12 +1711,12 @@ for (i=max_p-1; i>=0; i--) { int minor = start+i; - invalidate_device(MKDEV(MAJOR_NR + ctlr, minor), 1); + invalidate_device(MKDEV(hba[ctlr]->major, minor), 1); gdev->part[minor].start_sect = 0; gdev->part[minor].nr_sects = 0; /* reset the blocksize so we can read the partition table */ - blksize_size[MAJOR_NR+ctlr][minor] = 1024; + blksize_size[hba[ctlr]->major][minor] = block_size; hba[ctlr]->hardsizes[minor] = block_size; } @@ -2227,7 +2280,7 @@ if (creq->nr_segments > MAXSGENTRIES) BUG(); - if (h->ctlr != MAJOR(creq->rq_dev)-MAJOR_NR ) { + if( h->ctlr != map_major_to_ctlr[MAJOR(creq->rq_dev)] ) { printk(KERN_WARNING "doreq cmd for %d, %x at %p\n", h->ctlr, creq->rq_dev, creq); blkdev_dequeue_request(creq); @@ -2236,6 +2289,15 @@ goto startio; } + /* make sure controller is alive. */ + if (!CTLR_IS_ALIVE(h)) { + printk(KERN_WARNING "cciss%d: I/O quit ", h->ctlr); + blkdev_dequeue_request(creq); + complete_buffers(creq->bh, 0); + end_that_request_last(creq); + return; + } + if (( c = cmd_alloc(h, 1)) == NULL) goto startio; @@ -2385,7 +2447,7 @@ /* * See if we can queue up some more IO */ - do_cciss_request(BLK_DEFAULT_QUEUE(MAJOR_NR + h->ctlr)); + do_cciss_request(BLK_DEFAULT_QUEUE(h->major)); spin_unlock_irqrestore(&io_request_lock, flags); } /* @@ -2823,8 +2885,10 @@ return i; } } - printk(KERN_WARNING "cciss: This driver supports a maximum" - " of 8 controllers.\n"); + printk(KERN_WARNING + "cciss: This driver supports a maximum of %d controllers.\n" + "You can change this value in cciss.c and recompile.\n", + MAX_CTLR); return -1; } @@ -2833,7 +2897,174 @@ kfree(hba[i]); hba[i]=NULL; } +#ifdef CONFIG_CISS_MONITOR_THREAD +static void fail_all_cmds(unsigned long ctlr) +{ + /* If we get here, the board is apparently dead. */ + ctlr_info_t *h = hba[ctlr]; + CommandList_struct *c; + unsigned long flags; + + printk(KERN_WARNING "cciss%d: controller not responding.\n", h->ctlr); + h->alive = 0; /* the controller apparently died... */ + + spin_lock_irqsave(&io_request_lock, flags); + + pci_disable_device(h->pdev); /* Make sure it is really dead. */ + + /* move everything off the request queue onto the completed queue */ + while( (c = h->reqQ) != NULL ) { + removeQ(&(h->reqQ), c); + h->Qdepth--; + addQ (&(h->cmpQ), c); + } + + /* Now, fail everything on the completed queue with a HW error */ + while( (c = h->cmpQ) != NULL ) { + removeQ(&h->cmpQ, c); + c->err_info->CommandStatus = CMD_HARDWARE_ERR; + if (c->cmd_type == CMD_RWREQ) { + complete_command(h, c, 0); + } else if (c->cmd_type == CMD_IOCTL_PEND) + complete(c->waiting); +# ifdef CONFIG_CISS_SCSI_TAPE + else if (c->cmd_type == CMD_SCSI) + complete_scsi_command(c, 0, 0); +# endif + } + spin_unlock_irqrestore(&io_request_lock, flags); + return; +} +static int cciss_monitor(void *ctlr) +{ + /* If the board fails, we ought to detect that. So we periodically + send down a No-Op message and expect it to complete quickly. If it + doesn't, then we assume the board is dead, and fail all commands. + This is useful mostly in a multipath configuration, so that failover + will happen. */ + + int rc; + ctlr_info_t *h = (ctlr_info_t *) ctlr; + unsigned long flags; + u32 current_timer; + + daemonize(); + exit_files(current); + reparent_to_init(); + + printk("cciss%d: Monitor thread starting.\n", h->ctlr); + + /* only listen to signals if the HA was loaded as a module. */ +#define SHUTDOWN_SIGS (sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGTERM)) + siginitsetinv(¤t->blocked, SHUTDOWN_SIGS); + sprintf(current->comm, "ccissmon%d", h->ctlr); + h->monitor_thread = current; + + init_timer(&h->watchdog); + h->watchdog.function = fail_all_cmds; + h->watchdog.data = (unsigned long) h->ctlr; + while (1) { + /* check heartbeat timer */ + current_timer = readl(&h->cfgtable->HeartBeat); + current_timer &= 0x0fffffff; + if (heartbeat_timer == current_timer) { + fail_all_cmds(h->ctlr); + break; + } + else + heartbeat_timer = current_timer; + + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(h->monitor_period * HZ); + h->watchdog.expires = jiffies + HZ * h->monitor_deadline; + add_timer(&h->watchdog); + /* send down a trivial command (no op message) to ctlr */ + rc = sendcmd_withirq(3, h->ctlr, NULL, 0, 0, 0, 0, TYPE_MSG); + del_timer(&h->watchdog); + if (!CTLR_IS_ALIVE(h)) + break; + if (signal_pending(current)) { + printk(KERN_WARNING "%s received signal.\n", + current->comm); + break; + } + if (h->monitor_period == 0) /* zero period means exit thread */ + break; + } + printk(KERN_INFO "%s exiting.\n", current->comm); + spin_lock_irqsave(&io_request_lock, flags); + h->monitor_started = 0; + h->monitor_thread = NULL; + spin_unlock_irqrestore(&io_request_lock, flags); + return 0; +} +static int start_monitor_thread(ctlr_info_t *h, unsigned char *cmd, + unsigned long count, int (*cciss_monitor)(void *), int *rc) +{ + unsigned long flags; + unsigned int new_period, old_period, new_deadline, old_deadline; + + if (strncmp("monitor", cmd, 7) == 0) { + new_period = simple_strtol(cmd + 8, NULL, 10); + spin_lock_irqsave(&io_request_lock, flags); + new_deadline = h->monitor_deadline; + spin_unlock_irqrestore(&io_request_lock, flags); + } else if (strncmp("deadline", cmd, 8) == 0) { + new_deadline = simple_strtol(cmd + 9, NULL, 10); + spin_lock_irqsave(&io_request_lock, flags); + new_period = h->monitor_period; + spin_unlock_irqrestore(&io_request_lock, flags); + } else + return -1; + if (new_period != 0 && new_period < CCISS_MIN_PERIOD) + new_period = CCISS_MIN_PERIOD; + if (new_period > CCISS_MAX_PERIOD) + new_period = CCISS_MAX_PERIOD; + if (new_deadline >= new_period) { + new_deadline = new_period - 5; + printk(KERN_INFO "setting deadline to %d\n", new_deadline); + } + spin_lock_irqsave(&io_request_lock, flags); + if (h->monitor_started != 0) { + old_period = h->monitor_period; + old_deadline = h->monitor_deadline; + h->monitor_period = new_period; + h->monitor_deadline = new_deadline; + spin_unlock_irqrestore(&io_request_lock, flags); + if (new_period == 0) { + printk(KERN_INFO "cciss%d: stopping monitor thread\n", + h->ctlr); + *rc = count; + return 0; + } + if (new_period != old_period) + printk(KERN_INFO "cciss%d: adjusting monitor thread " + "period from %d to %d seconds\n", + h->ctlr, old_period, new_period); + if (new_deadline != old_deadline) + printk(KERN_INFO "cciss%d: adjusting monitor thread " + "deadline from %d to %d seconds\n", + h->ctlr, old_deadline, new_deadline); + *rc = count; + return 0; + } + h->monitor_started = 1; + h->monitor_period = new_period; + h->monitor_deadline = new_deadline; + spin_unlock_irqrestore(&io_request_lock, flags); + kernel_thread(cciss_monitor, h, 0); + *rc = count; + return 0; +} +static void kill_monitor_thread(ctlr_info_t *h) +{ + if (h->monitor_thread) + send_sig(SIGKILL, h->monitor_thread, 1); +} +#else +#define kill_monitor_thread(h) +#endif /* * This is it. Find all the controllers and register them. I really hate * stealing all these major device numbers. @@ -2845,6 +3076,7 @@ request_queue_t *q; int i; int j; + int rc; printk(KERN_DEBUG "cciss: Device 0x%x has been found at" " bus %d dev %d func %d\n", @@ -2860,15 +3092,33 @@ } sprintf(hba[i]->devname, "cciss%d", i); hba[i]->ctlr = i; + + /* register with the major number, or get a dynamic major number */ + /* by passing 0 as argument */ + + if (i < MAX_CTLR_ORIG) + hba[i]->major = MAJOR_NR + i; + hba[i]->pdev = pdev; + ASSERT_CTLR_ALIVE(hba[i]); - if (register_blkdev(MAJOR_NR+i, hba[i]->devname, &cciss_fops)) { + rc = (register_blkdev(hba[i]->major, hba[i]->devname, &cciss_fops)); + if (rc < 0) { printk(KERN_ERR "cciss: Unable to get major number " - "%d for %s\n", MAJOR_NR+i, hba[i]->devname); + "%d for %s\n", hba[i]->major, hba[i]->devname); release_io_mem(hba[i]); free_hba(i); return -1; + } else { + if (i < MAX_CTLR_ORIG) { + hba[i]->major = MAJOR_NR + i; + map_major_to_ctlr[MAJOR_NR + i] = i; + } else { + hba[i]->major = rc; + map_major_to_ctlr[rc] = i; + } } + /* make sure the board interrupts are off */ hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_OFF); if (request_irq(hba[i]->intr, do_cciss_intr, @@ -2877,7 +3127,8 @@ printk(KERN_ERR "cciss: Unable to get irq %d for %s\n", hba[i]->intr, hba[i]->devname); - unregister_blkdev( MAJOR_NR+i, hba[i]->devname); + unregister_blkdev( hba[i]->major, hba[i]->devname); + map_major_to_ctlr[hba[i]->major] = 0; release_io_mem(hba[i]); free_hba(i); return -1; @@ -2906,7 +3157,8 @@ hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle); free_irq(hba[i]->intr, hba[i]); - unregister_blkdev(MAJOR_NR+i, hba[i]->devname); + unregister_blkdev(hba[i]->major, hba[i]->devname); + map_major_to_ctlr[hba[i]->major] = 0; release_io_mem(hba[i]); free_hba(i); printk( KERN_ERR "cciss: out of memory"); @@ -2933,16 +3185,16 @@ cciss_procinit(i); - q = BLK_DEFAULT_QUEUE(MAJOR_NR + i); + q = BLK_DEFAULT_QUEUE(hba[i]->major); q->queuedata = hba[i]; blk_init_queue(q, do_cciss_request); blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask); blk_queue_headactive(q, 0); /* fill in the other Kernel structs */ - blksize_size[MAJOR_NR+i] = hba[i]->blocksizes; - hardsect_size[MAJOR_NR+i] = hba[i]->hardsizes; - read_ahead[MAJOR_NR+i] = READ_AHEAD; + blksize_size[hba[i]->major] = hba[i]->blocksizes; + hardsect_size[hba[i]->major] = hba[i]->hardsizes; + read_ahead[hba[i]->major] = READ_AHEAD; /* Set the pointers to queue functions */ q->back_merge_fn = cpq_back_merge_fn; @@ -2951,7 +3203,7 @@ /* Fill in the gendisk data */ - hba[i]->gendisk.major = MAJOR_NR + i; + hba[i]->gendisk.major = hba[i]->major; hba[i]->gendisk.major_name = "cciss"; hba[i]->gendisk.minor_shift = NWD_SHIFT; hba[i]->gendisk.max_p = MAX_PART; @@ -2966,7 +3218,7 @@ cciss_geninit(i); for(j=0; jgendisk), - MKDEV(MAJOR_NR+i, j <<4), + MKDEV(hba[i]->major, j <<4), MAX_PART, &cciss_fops, hba[i]->drv[j].nr_blocks); @@ -2993,20 +3245,24 @@ "already be removed \n"); return; } - /* Turn board interrupts off and send the flush cache command */ - /* sendcmd will turn off interrupt, and send the flush... - * To write all data in the battery backed cache to disks */ + kill_monitor_thread(hba[i]); + /* no sense in trying to flush a dead board's cache. */ + if (CTLR_IS_ALIVE(hba[i])) { + /* Turn board interrupts off and flush the cache */ + /* write all data in the battery backed cache to disks */ memset(flush_buf, 0, 4); - return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, 4,0,0,0, NULL); - if (return_code != IO_OK) { + return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, + 4, 0, 0, 0, NULL); + if (return_code != IO_OK) printk(KERN_WARNING - "Error Flushing cache on controller %d\n", i); + "cciss%d: Error flushing cache\n", i); } free_irq(hba[i]->intr, hba[i]); pci_set_drvdata(pdev, NULL); iounmap((void*)hba[i]->vaddr); cciss_unregister_scsi(i); /* unhook from SCSI subsystem */ - unregister_blkdev(MAJOR_NR+i, hba[i]->devname); + unregister_blkdev(hba[i]->major, hba[i]->devname); + map_major_to_ctlr[hba[i]->major] = 0; remove_proc_entry(hba[i]->devname, proc_cciss); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/block/cciss.h linux-2.4.23-pre8/drivers/block/cciss.h --- linux-2.4.22/drivers/block/cciss.h 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/block/cciss.h 2003-10-22 22:47:29.000000000 +0000 @@ -40,6 +40,7 @@ struct ctlr_info { int ctlr; + int major; char devname[8]; char *product_name; char firm_ver[4]; // Firmware version @@ -91,6 +92,40 @@ #ifdef CONFIG_CISS_SCSI_TAPE void *scsi_ctlr; /* ptr to structure containing scsi related stuff */ #endif +#ifdef CONFIG_CISS_MONITOR_THREAD + struct timer_list watchdog; + struct task_struct *monitor_thread; + unsigned int monitor_period; + unsigned int monitor_deadline; + unsigned char alive; + unsigned char monitor_started; +#define CCISS_MIN_PERIOD 10 +#define CCISS_MAX_PERIOD 3600 +#define CTLR_IS_ALIVE(h) (h->alive) +#define ASSERT_CTLR_ALIVE(h) { h->alive = 1; \ + h->monitor_period = 0; \ + h->monitor_started = 0; } +#define MONITOR_STATUS_PATTERN "Status: %s\n" +#define CTLR_STATUS(h) CTLR_IS_ALIVE(h) ? "operational" : "failed" +#define MONITOR_PERIOD_PATTERN "Monitor thread period: %d\n" +#define MONITOR_PERIOD_VALUE(h) (h->monitor_period) +#define MONITOR_DEADLINE_PATTERN "Monitor thread deadline: %d\n" +#define MONITOR_DEADLINE_VALUE(h) (h->monitor_deadline) +#define START_MONITOR_THREAD(h, cmd, count, cciss_monitor, rc) \ + start_monitor_thread(h, cmd, count, cciss_monitor, rc) +#else + +#define MONITOR_PERIOD_PATTERN "%s" +#define MONITOR_PERIOD_VALUE(h) "" +#define MONITOR_DEADLINE_PATTERN "%s" +#define MONITOR_DEADLINE_VALUE(h) "" +#define MONITOR_STATUS_PATTERN "%s\n" +#define CTLR_STATUS(h) "" +#define CTLR_IS_ALIVE(h) (1) +#define ASSERT_CTLR_ALIVE(h) +#define START_MONITOR_THREAD(a,b,c,d,rc) (*rc == 0) + +#endif }; /* Defining the diffent access_menthods */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/block/cciss_scsi.c linux-2.4.23-pre8/drivers/block/cciss_scsi.c --- linux-2.4.22/drivers/block/cciss_scsi.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/block/cciss_scsi.c 2003-10-22 22:47:30.000000000 +0000 @@ -71,16 +71,7 @@ #endif #endif -static struct cciss_scsi_hba_t ccissscsi[MAX_CTLR] = { - { name: "cciss0", ndevices: 0 }, - { name: "cciss1", ndevices: 0 }, - { name: "cciss2", ndevices: 0 }, - { name: "cciss3", ndevices: 0 }, - { name: "cciss4", ndevices: 0 }, - { name: "cciss5", ndevices: 0 }, - { name: "cciss6", ndevices: 0 }, - { name: "cciss7", ndevices: 0 }, -}; +static struct cciss_scsi_hba_t ccissscsi[MAX_CTLR]; /* We need one Scsi_Host_Template *per controller* instead of the usual one Scsi_Host_Template per controller *type*. This @@ -92,11 +83,7 @@ (that's called from cciss.c:cciss_init_one()) */ static -Scsi_Host_Template driver_template[MAX_CTLR] = -{ - CCISS_SCSI, CCISS_SCSI, CCISS_SCSI, CCISS_SCSI, - CCISS_SCSI, CCISS_SCSI, CCISS_SCSI, CCISS_SCSI, -}; +Scsi_Host_Template driver_template[MAX_CTLR]; #pragma pack(1) struct cciss_scsi_cmd_stack_elem_t { @@ -803,13 +790,7 @@ sh->this_id = SELF_SCSI_ID; - /* This is a bit kludgey, using the adapter name to figure out */ - /* which scsi host template we've got, won't scale beyond 9 ctlrs. */ - i = tpnt->name[5] - '0'; - -# if MAX_CTLR > 9 -# error "cciss_scsi.c: MAX_CTLR > 9, code maintenance needed." -# endif + i = simple_strtol((char *)&tpnt->name[5], NULL, 10); if (i<0 || i>=MAX_CTLR || hba[i] == NULL) { /* we didn't find ourself... we shouldn't get here. */ @@ -1528,9 +1509,10 @@ unsigned long flags; CPQ_TAPE_LOCK(ctlr, flags); - driver_template[ctlr].name = ccissscsi[ctlr].name; - driver_template[ctlr].proc_name = ccissscsi[ctlr].name; - driver_template[ctlr].module = THIS_MODULE;; + + sprintf( ccissscsi[ctlr].name, "cciss%d", ctlr ); + + init_driver_template(ctlr); /* Since this is really a block driver, the SCSI core may not be initialized yet, in which case, calling scsi_register_module diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/block/cciss_scsi.h linux-2.4.23-pre8/drivers/block/cciss_scsi.h --- linux-2.4.22/drivers/block/cciss_scsi.h 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/block/cciss_scsi.h 2003-10-22 22:47:39.000000000 +0000 @@ -89,7 +89,7 @@ }; struct cciss_scsi_hba_t { - char *name; + char name[32]; int ndevices; #define CCISS_MAX_SCSI_DEVS_PER_HBA 16 struct cciss_scsi_dev_t dev[CCISS_MAX_SCSI_DEVS_PER_HBA]; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/block/ll_rw_blk.c linux-2.4.23-pre8/drivers/block/ll_rw_blk.c --- linux-2.4.22/drivers/block/ll_rw_blk.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/block/ll_rw_blk.c 2003-10-22 22:47:43.000000000 +0000 @@ -121,6 +121,10 @@ unsigned long blk_max_low_pfn, blk_max_pfn; int blk_nohighio = 0; +int block_dump = 0; + +static struct timer_list writeback_timer; + static inline int get_max_sectors(kdev_t dev) { if (!max_sectors[MAJOR(dev)]) @@ -1293,6 +1297,9 @@ if (waitqueue_active(&bh->b_wait)) wake_up(&bh->b_wait); + if (block_dump) + printk(KERN_DEBUG "%s: %s block %lu/%u on %s\n", current->comm, rw == WRITE ? "WRITE" : "READ", bh->b_rsector, count, kdevname(bh->b_rdev)); + put_bh(bh); switch (rw) { case WRITE: @@ -1413,6 +1420,11 @@ extern int stram_device_init (void); #endif +static void blk_writeback_timer(unsigned long data) +{ + wakeup_bdflush(); + wakeup_kupdate(); +} /** * end_that_request_first - end I/O on one buffer. @@ -1469,10 +1481,18 @@ return 0; } +extern int laptop_mode; + void end_that_request_last(struct request *req) { struct completion *waiting = req->waiting; + /* + * schedule the writeout of pending dirty data when the disk is idle + */ + if (laptop_mode && req->cmd == READ) + mod_timer(&writeback_timer, jiffies + 5 * HZ); + req_finished_io(req); blkdev_release_request(req); if (waiting) @@ -1500,6 +1520,9 @@ blk_max_low_pfn = max_low_pfn - 1; blk_max_pfn = max_pfn - 1; + init_timer(&writeback_timer); + writeback_timer.function = blk_writeback_timer; + #ifdef CONFIG_AMIGA_Z2RAM z2_init(); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/block/umem.c linux-2.4.23-pre8/drivers/block/umem.c --- linux-2.4.22/drivers/block/umem.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/block/umem.c 2003-10-22 22:49:11.000000000 +0000 @@ -1307,7 +1307,7 @@ release_mem_region(card->mem_base, card->mem_len); failed_req_mem: #endif - iounmap((void *) card->csr_base); + iounmap((void *) card->csr_remap); failed_remap_csr: release_mem_region(card->csr_base, card->csr_len); failed_req_csr: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/bluetooth/Makefile.lib linux-2.4.23-pre8/drivers/bluetooth/Makefile.lib --- linux-2.4.22/drivers/bluetooth/Makefile.lib 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/bluetooth/Makefile.lib 2003-10-22 22:48:56.000000000 +0000 @@ -0,0 +1 @@ +obj-$(CONFIG_BLUEZ_HCIBFUSB) += firmware_class.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/bluetooth/bfusb.c linux-2.4.23-pre8/drivers/bluetooth/bfusb.c --- linux-2.4.22/drivers/bluetooth/bfusb.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/bluetooth/bfusb.c 2003-10-22 22:47:41.000000000 +0000 @@ -32,21 +32,18 @@ #include #include +#include #include #include #include -#include "bfusb.h" - #ifndef CONFIG_BLUEZ_HCIBFUSB_DEBUG #undef BT_DBG #define BT_DBG(D...) #endif -#define VERSION "1.0" - -static struct usb_driver bfusb_driver; +#define VERSION "1.1" static struct usb_device_id bfusb_table[] = { /* AVM BlueFRITZ! USB */ @@ -576,12 +573,12 @@ } -static int bfusb_load_firmware(struct bfusb *bfusb) +static int bfusb_load_firmware(struct bfusb *bfusb, unsigned char *firmware, int count) { - unsigned char *buf, *ptr; - int err, pipe, len, count, size, sent = 0; + unsigned char *buf; + int err, pipe, len, size, sent = 0; - BT_DBG("bfusb %p udev %p", bfusb, bfusb->udev); + BT_DBG("bfusb %p udev %p firmware %p count %d", bfusb, bfusb->udev, firmware, count); BT_INFO("BlueFRITZ! USB loading firmware"); @@ -596,15 +593,12 @@ return -ENOMEM; } - count = BFUSB_FIRMWARE_SIZE; - ptr = &bfusb_firmware[0]; - pipe = usb_sndbulkpipe(bfusb->udev, bfusb->bulk_out_ep); while (count) { size = min_t(uint, count, BFUSB_MAX_BLOCK_SIZE + 3); - memcpy(buf, ptr + sent, size); + memcpy(buf, firmware + sent, size); err = usb_bulk_msg(bfusb->udev, pipe, buf, size, &len, BFUSB_BLOCK_TIMEOUT); @@ -647,6 +641,8 @@ static void *bfusb_probe(struct usb_device *udev, unsigned int ifnum, const struct usb_device_id *id) { + const struct firmware *firmware; + char device[16]; struct usb_interface *iface; struct usb_interface_descriptor *iface_desc; struct usb_endpoint_descriptor *bulk_out_ep; @@ -692,11 +688,20 @@ skb_queue_head_init(&bfusb->pending_q); skb_queue_head_init(&bfusb->completed_q); - if (bfusb_load_firmware(bfusb) < 0) { - BT_ERR("Firmware loading failed"); + snprintf(device, sizeof(device), "bfusb%3.3d%3.3d", udev->bus->busnum, udev->devnum); + + if (request_firmware(&firmware, "bfubase.frm", device) < 0) { + BT_ERR("Firmware request failed"); goto error; } + if (bfusb_load_firmware(bfusb, firmware->data, firmware->size) < 0) { + BT_ERR("Firmware loading failed"); + goto release; + } + + release_firmware(firmware); + /* Initialize and register HCI device */ hdev = &bfusb->hdev; @@ -717,6 +722,9 @@ return bfusb; +release: + release_firmware(firmware); + error: kfree(bfusb); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/bluetooth/bfusb.h linux-2.4.23-pre8/drivers/bluetooth/bfusb.h --- linux-2.4.22/drivers/bluetooth/bfusb.h 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/bluetooth/bfusb.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,52261 +0,0 @@ -/* - * - * AVM BlueFRITZ! USB firmware - * - * Version 03.17.46 - * - * Copyright (C) 2002-2003 AVM GmbH. All rights reserved. - * - * - * You may only use and redistribute this Software in binary form provided - * that the following conditions are met: - * - * Redistribution of this Software in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the distribution. - * The name of AVM may not be used to endorse or promote products derived - * from this Software without specific prior written permission by AVM. - * - * Disclaimer/Limitation of Liablity - * This Software has been produced with due care and checked for correctness - * in accordance with available technology. The information in this Software - * is subject to change without notice for the purpose of technical - * improvement. You bear all risk with regard to hazards and impairments of - * quality which may arise in connection with the use of this Software. - * - * THERE IS NO WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY - * APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - * HOLDERS AND/OR OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT - * WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE - * OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU - * ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - * - * IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING - * WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR - * REDISTRIBUTE THE SOFTWARE AS PERMITTED ABOVE, BE LIABLE TO YOU FOR - * DAMAGES, INCLUDING ANY DIRECT, INDIRECT, GENERAL, SPECIAL, EXEMPLARY, - * INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY - * TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, BUSINESS INTERRUPTION, - * PROFITS, DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY - * YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO OPERATE WITH ANY - * OTHER SOFTWARE), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGES. YOU ACKNOWLEDGE AND AGREE THAT PURCHASE OR USE OF THIS 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 AVM HARDWARE OR SOFTWARE EITHER SOLELY OR IN COMBINATION WITH THIS - * SOFTWARE. - * - */ - -#define BFUSB_FIRMWARE_SIZE 417605 - -static unsigned char bfusb_firmware[] = { - 0xed, 0x09, 0x00, 0x00, 0x00, 0x71, 0x56, 0xaf, - 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x8c, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x01, 0x00, 0xff, 0x21, 0x46, - 0x22, 0x0f, 0xff, 0xff, 0xff, 0xaa, 0x99, 0x55, - 0x66, 0x30, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, - 0x07, 0x30, 0x01, 0x60, 0x01, 0x00, 0x00, 0x00, - 0x11, 0x30, 0x01, 0x20, 0x01, 0x00, 0x80, 0x3f, - 0x2d, 0x30, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x01, - 0xc6, 0x30, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x30, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x30, 0x00, 0x40, 0x00, 0x50, 0x00, 0x99, - 0xc6, 0x00, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x04, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x04, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x90, 0x00, - 0x00, 0x00, 0x00, 0xff, 0x10, 0x00, 0x68, 0x00, - 0x1e, 0x00, 0x07, 0x80, 0x01, 0xe0, 0x00, 0x78, - 0x00, 0x1e, 0x00, 0x07, 0x80, 0x01, 0xe0, 0x00, - 0x78, 0x00, 0x1e, 0x00, 0x07, 0xe0, 0x01, 0xe8, - 0x00, 0x78, 0x00, 0x1e, 0x80, 0x07, 0xa0, 0x01, - 0xa8, 0x00, 0x7a, 0x00, 0x1a, 0x80, 0x06, 0x80, - 0x01, 0xa0, 0x00, 0x6a, 0x00, 0x18, 0x80, 0x07, - 0xa0, 0x01, 0x88, 0x00, 0x60, 0x00, 0x18, 0x00, - 0x06, 0x00, 0x01, 0x80, 0x3f, 0xc4, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x05, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x21, 0x37, 0xc0, 0x0b, 0xf0, 0x03, 0x3d, - 0x00, 0xcf, 0x00, 0xb3, 0xd1, 0x0f, 0xc1, 0x03, - 0xf4, 0x00, 0x4d, 0x00, 0x3b, 0xc8, 0x0f, 0xf2, - 0x03, 0x7c, 0x00, 0xff, 0x00, 0x37, 0x00, 0x8f, - 0xc0, 0x43, 0x14, 0x00, 0xef, 0x01, 0x3f, 0xcc, - 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xc7, 0x20, 0x33, - 0xc4, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x10, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x0c, - 0xbf, 0xed, 0x09, 0x00, 0x03, 0x00, 0x10, 0x23, - 0xc4, 0x0b, 0xf5, 0x06, 0x0c, 0x00, 0x8f, 0x40, - 0x32, 0xc0, 0x0b, 0x90, 0x03, 0xa4, 0x00, 0x88, - 0x00, 0x22, 0xd0, 0x0e, 0xa4, 0x02, 0xe9, 0x40, - 0xba, 0x50, 0x3a, 0xc0, 0x0b, 0x82, 0x02, 0x24, - 0x00, 0xa7, 0x50, 0x2e, 0xc0, 0x0b, 0x97, 0x82, - 0xe1, 0xe0, 0x8b, 0x40, 0x36, 0xc8, 0x0b, 0xb0, - 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x88, 0x05, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x09, 0x30, 0x02, 0x8c, 0x80, 0x83, 0x40, - 0x20, 0xc8, 0x0b, 0x00, 0x02, 0xe4, 0x00, 0x83, - 0x00, 0x28, 0xc4, 0x0b, 0x11, 0x02, 0x84, 0x14, - 0xb1, 0x00, 0x24, 0xc0, 0x0b, 0x80, 0x8e, 0x04, - 0x00, 0x83, 0x01, 0x24, 0xcc, 0x8b, 0x10, 0x12, - 0xc4, 0x00, 0x83, 0x10, 0x20, 0xc0, 0x0b, 0x30, - 0x02, 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x15, 0xac, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2a, - 0xc0, 0x0b, 0xb0, 0x02, 0xac, 0x00, 0x8b, 0x00, - 0x26, 0xc0, 0x0b, 0x90, 0x02, 0xa4, 0x24, 0x8b, - 0x18, 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x2a, 0xe0, 0x0b, 0x90, 0x02, 0x24, - 0x00, 0xab, 0x02, 0x2e, 0xc0, 0x0b, 0x98, 0x02, - 0xe2, 0x00, 0x8b, 0x00, 0x26, 0xc0, 0x0b, 0xb0, - 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x15, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xf3, 0x01, 0x3e, - 0xc1, 0x0d, 0xb0, 0x02, 0xac, 0x00, 0xcb, 0x00, - 0x32, 0xc0, 0x0f, 0x90, 0x03, 0xc9, 0x00, 0xc9, - 0x40, 0x3a, 0x80, 0x5f, 0xb0, 0x43, 0xec, 0x00, - 0xfb, 0x00, 0x36, 0x70, 0x0f, 0x88, 0x03, 0x21, - 0x80, 0x4b, 0x00, 0x3e, 0xed, 0x09, 0x00, 0x04, - 0x00, 0xc0, 0x0f, 0x8e, 0x03, 0xe6, 0x02, 0xcb, - 0x00, 0x32, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xbc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x04, 0xff, 0x00, 0x37, 0xc0, 0x0f, 0xf0, - 0x03, 0x7c, 0x00, 0xff, 0x02, 0x3b, 0xc0, 0x4f, - 0xd0, 0x23, 0xbe, 0x40, 0xfc, 0x04, 0x3f, 0xa4, - 0x0e, 0xa0, 0x03, 0xf8, 0x00, 0xfe, 0x00, 0x3b, - 0xc0, 0x8f, 0xc2, 0x03, 0xf0, 0x00, 0xff, 0x00, - 0x3e, 0xc0, 0x0f, 0xc0, 0x23, 0xf4, 0x00, 0xf7, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf8, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x20, 0x3e, 0xc0, 0x0f, 0x30, - 0x03, 0x2c, 0x00, 0xeb, 0x80, 0x3e, 0xc0, 0x8f, - 0xb0, 0x03, 0xa9, 0x20, 0xfb, 0xc0, 0x32, 0xc0, - 0x0f, 0x90, 0x03, 0x64, 0x02, 0xc9, 0x00, 0x3e, - 0x82, 0x0f, 0xb0, 0x43, 0xe8, 0x00, 0xeb, 0x00, - 0x32, 0xc0, 0x2c, 0x94, 0x03, 0xe4, 0x80, 0xfb, - 0x08, 0x32, 0xc2, 0x0c, 0xb0, 0x03, 0xd0, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0xbf, 0x60, 0x2f, 0xc0, 0x8b, 0xf8, - 0x02, 0x2c, 0x00, 0x87, 0x00, 0x0f, 0xc0, 0x0b, - 0x90, 0x02, 0xae, 0x00, 0xbb, 0x80, 0x22, 0xc0, - 0x0e, 0xb0, 0x82, 0x2e, 0x00, 0x8b, 0x00, 0x06, - 0xc0, 0x4b, 0x30, 0x02, 0xc8, 0x00, 0x0f, 0x00, - 0x23, 0xc0, 0x48, 0x98, 0x02, 0xe7, 0x80, 0xbf, - 0x80, 0x36, 0xf2, 0x0a, 0xb0, 0x02, 0xf2, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4c, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x80, 0x2c, 0xc0, 0x0b, 0xed, - 0x09, 0x00, 0x05, 0x00, 0x38, 0x00, 0x2c, 0x04, - 0x83, 0x00, 0x0c, 0xc0, 0x03, 0x00, 0x02, 0xce, - 0x00, 0xb8, 0x00, 0x20, 0x41, 0x0a, 0x38, 0x02, - 0x4c, 0x00, 0xa3, 0x00, 0x2c, 0xc0, 0x1b, 0x00, - 0x42, 0xc4, 0x00, 0xa3, 0x00, 0xa0, 0xc0, 0x08, - 0x00, 0x82, 0xe3, 0x04, 0xb3, 0x80, 0x20, 0xc0, - 0x08, 0x30, 0x02, 0xf8, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x01, 0x1e, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, - 0x81, 0x2d, 0xe0, 0x0b, 0x78, 0x82, 0x1e, 0x00, - 0x87, 0x80, 0x2d, 0xe0, 0x0b, 0x58, 0x02, 0xde, - 0x00, 0x34, 0xc0, 0x21, 0xe0, 0x0a, 0x68, 0x00, - 0x0a, 0x20, 0xa6, 0x80, 0x25, 0xa0, 0x0b, 0x48, - 0x00, 0xf6, 0x00, 0xa7, 0xe1, 0x21, 0xe0, 0x08, - 0x79, 0x02, 0xda, 0x00, 0xb7, 0x88, 0x25, 0xe0, - 0x0a, 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x08, 0x0c, 0x00, 0xf3, 0x00, - 0x3c, 0xc0, 0x0f, 0x30, 0x03, 0xcc, 0x00, 0xf3, - 0x00, 0x3c, 0xc0, 0x0f, 0x30, 0x03, 0x0c, 0x00, - 0xa3, 0x00, 0x3c, 0xc0, 0x0f, 0x80, 0x03, 0xcc, - 0xe0, 0xfa, 0x00, 0x30, 0x40, 0x0e, 0x10, 0x03, - 0x44, 0x00, 0xe1, 0x00, 0x3c, 0xd0, 0x0f, 0x22, - 0x02, 0xc4, 0x20, 0xe3, 0x00, 0x30, 0xc4, 0x0c, - 0x20, 0x83, 0xcc, 0x40, 0xf3, 0x20, 0x32, 0xc0, - 0x0c, 0x30, 0x43, 0xd2, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xd4, 0x0b, 0x74, 0x03, 0xfc, 0x40, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xd1, 0x03, 0xbc, - 0x48, 0xfc, 0x10, 0x3f, 0xc0, 0x0e, 0xf0, 0x03, - 0xfc, 0x00, 0xdf, 0x02, 0x37, 0xc4, 0x0f, 0xf0, - 0x03, 0xf4, 0x00, 0xdf, 0x22, 0xbf, 0xc0, 0x0f, - 0xf0, 0x43, 0xed, 0x09, 0x00, 0x06, 0x00, 0xf8, - 0x00, 0xff, 0x08, 0x3f, 0xc0, 0x0d, 0xf0, 0x03, - 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x05, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0xc8, 0x32, 0xc1, - 0x8f, 0xb3, 0x01, 0xec, 0x00, 0xdb, 0x60, 0x3e, - 0xe0, 0x0c, 0x90, 0x03, 0xe8, 0x00, 0xf9, 0x80, - 0x32, 0x00, 0x0f, 0xb0, 0x03, 0x2c, 0x01, 0xfb, - 0x80, 0x72, 0xc0, 0x0c, 0x80, 0x03, 0xc6, 0x00, - 0x6b, 0x24, 0x22, 0xc5, 0x0f, 0xa8, 0x03, 0x28, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0xdc, 0x00, 0xb3, 0x60, 0xa1, 0xd8, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xe7, 0x14, 0x2f, - 0xc8, 0x08, 0x50, 0x02, 0xdc, 0x00, 0xbd, 0x00, - 0x21, 0x80, 0x0b, 0x60, 0x02, 0x18, 0x00, 0xb6, - 0x00, 0x23, 0xc0, 0x0d, 0x40, 0x03, 0xd4, 0x04, - 0xf3, 0x68, 0x35, 0xc0, 0x0b, 0xf0, 0x43, 0x5c, - 0x00, 0xb7, 0x20, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x9e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, - 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x21, 0xe0, - 0x0b, 0x7a, 0x02, 0xde, 0x00, 0x97, 0x90, 0x2d, - 0xe4, 0x28, 0x78, 0x02, 0xdf, 0x00, 0xb7, 0xc0, - 0x61, 0x60, 0x0b, 0x18, 0x02, 0x16, 0x00, 0xb1, - 0x84, 0x21, 0xc0, 0x09, 0x78, 0x02, 0xfe, 0x00, - 0x97, 0xa0, 0x25, 0xe8, 0x0b, 0x68, 0x02, 0x1e, - 0x00, 0xb7, 0xa0, 0x2d, 0xe0, 0x0b, 0x78, 0x02, - 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x14, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x20, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xed, 0x09, 0x00, - 0x07, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x08, 0x10, - 0x02, 0xce, 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x0b, - 0x30, 0x0a, 0x0c, 0x00, 0xb3, 0x01, 0xa0, 0x92, - 0x09, 0xb9, 0x82, 0x8e, 0x00, 0xb3, 0x00, 0x24, - 0xc0, 0x8b, 0x39, 0x02, 0x4c, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x8b, 0x30, 0x02, 0xd2, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, 0xa8, 0x00, - 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xe8, - 0x00, 0xfa, 0x02, 0x32, 0x80, 0x0b, 0xa0, 0x23, - 0xe8, 0x00, 0xda, 0x00, 0x3e, 0x80, 0x0c, 0xec, - 0x13, 0xdb, 0x00, 0xfe, 0xc3, 0xb3, 0x80, 0x0f, - 0xe0, 0x03, 0x38, 0x00, 0xfe, 0x00, 0x73, 0x80, - 0x0d, 0xec, 0x02, 0xfb, 0x28, 0xda, 0x00, 0xb6, - 0x80, 0x0f, 0xe0, 0x03, 0x39, 0x10, 0xfa, 0x00, - 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xfa, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x02, - 0xe0, 0x00, 0xe8, 0x00, 0x3e, 0x00, 0x0f, 0x89, - 0x03, 0xe2, 0x00, 0xf8, 0xc0, 0x3e, 0x10, 0x07, - 0x00, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x10, - 0x0f, 0x80, 0x01, 0xe2, 0x00, 0xf8, 0x40, 0x3e, - 0x00, 0x0f, 0x82, 0x03, 0xe1, 0x65, 0xf8, 0x00, - 0x3e, 0x10, 0x0f, 0x80, 0x03, 0xd2, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x80, 0x3c, 0x40, 0x8c, 0x10, 0x0b, - 0x24, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x02, 0x64, 0x00, 0xc9, 0x00, 0x3c, 0x42, 0x2c, - 0x90, 0x03, 0x44, 0x00, 0xd9, 0x40, 0x3c, 0x44, - 0x0d, 0x90, 0x03, 0x24, 0x00, 0xf1, 0x02, 0x32, - 0x40, 0x0f, 0x98, 0x03, 0xe4, 0x00, 0xf1, 0x00, - 0xed, 0x09, 0x00, 0x08, 0x00, 0x32, 0x40, 0x0f, - 0x90, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x04, 0x64, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x01, - 0x2e, 0x40, 0x08, 0x90, 0x02, 0x24, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0x10, 0x02, 0x25, 0x00, - 0x89, 0x40, 0x2e, 0x50, 0x08, 0x94, 0x02, 0x24, - 0x00, 0x89, 0xc0, 0x26, 0x50, 0x08, 0x90, 0x02, - 0x24, 0x00, 0xb9, 0x00, 0x2a, 0x40, 0x0b, 0x94, - 0x42, 0xe7, 0x20, 0xb9, 0x00, 0x2a, 0x48, 0x0b, - 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x05, 0x24, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x10, - 0x2e, 0x40, 0x08, 0x91, 0x02, 0x24, 0x00, 0xb9, - 0x80, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe6, 0x00, - 0x89, 0x88, 0x2e, 0x40, 0x09, 0x90, 0x82, 0x64, - 0x02, 0x99, 0x08, 0x2a, 0x42, 0x09, 0x90, 0x0a, - 0x24, 0x00, 0xb9, 0x08, 0x22, 0x40, 0x0b, 0x92, - 0x82, 0xec, 0x84, 0xb9, 0x02, 0x22, 0x40, 0x0b, - 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x04, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x29, - 0x2c, 0x40, 0x08, 0x12, 0x82, 0x04, 0x00, 0xb1, - 0x28, 0x2c, 0x59, 0x0b, 0x90, 0x02, 0xa7, 0x00, - 0x81, 0x40, 0x2c, 0xc0, 0x09, 0x10, 0x02, 0x04, - 0x00, 0x81, 0x00, 0x24, 0x51, 0x18, 0x14, 0x06, - 0x04, 0x00, 0xb1, 0x42, 0x68, 0x50, 0x4b, 0x14, - 0x02, 0xc5, 0x00, 0xb1, 0x01, 0x28, 0x50, 0x0b, - 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb8, 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x20, - 0x3e, 0x00, 0x2c, 0x82, 0x03, 0x20, 0x00, 0xf8, - 0x23, 0x3e, 0x00, 0xed, 0x09, 0x00, 0x09, 0x00, - 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xc8, 0x00, 0x3e, - 0x01, 0x4d, 0x80, 0x03, 0x60, 0x00, 0xd8, 0x00, - 0x3e, 0x00, 0x0d, 0x80, 0x03, 0x20, 0x00, 0xf8, - 0x00, 0x32, 0x00, 0x8f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, 0xee, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x1d, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x50, 0x1f, - 0x90, 0x03, 0xe4, 0xa0, 0xf9, 0x00, 0x3e, 0x45, - 0x4f, 0xd2, 0x93, 0x74, 0x02, 0xfd, 0x00, 0x3f, - 0x50, 0x0e, 0xd4, 0x03, 0xf5, 0x00, 0xfd, 0x41, - 0x37, 0x50, 0xcf, 0xd0, 0x03, 0xf4, 0x00, 0xf9, - 0x40, 0x3e, 0x50, 0x0f, 0xd4, 0x43, 0x7d, 0x00, - 0xf9, 0x40, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe6, - 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0d, 0x90, - 0x03, 0xe4, 0x00, 0xfd, 0x20, 0x32, 0x48, 0x0f, - 0xd2, 0x03, 0xe4, 0x00, 0xfd, 0x00, 0x3e, 0x50, - 0x0f, 0x90, 0x03, 0xf5, 0x00, 0xfd, 0x00, 0x3a, - 0x41, 0x0e, 0x90, 0x03, 0xe4, 0x80, 0xf9, 0x20, - 0x3b, 0x58, 0x0f, 0x94, 0x03, 0xf4, 0x00, 0xed, - 0x21, 0x32, 0x51, 0x0c, 0xd6, 0x03, 0xf4, 0xa0, - 0xfd, 0x00, 0x3f, 0x50, 0x0f, 0x90, 0x03, 0xc6, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, - 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, 0x80, - 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x22, 0x10, 0x0b, - 0x81, 0x02, 0xe0, 0x20, 0xb8, 0x00, 0x2e, 0x04, - 0x0b, 0x82, 0x82, 0xe0, 0x84, 0xb8, 0x2a, 0x22, - 0x00, 0x0d, 0x80, 0x02, 0xe1, 0x00, 0x9c, 0x41, - 0x32, 0x10, 0x0b, 0x82, 0x02, 0xe0, 0x00, 0xa8, - 0x40, 0xb6, 0x08, 0x0a, 0x86, 0x02, 0xe1, 0x80, - 0xb8, 0x40, 0x2e, 0x08, 0x0b, 0x80, 0xed, 0x09, - 0x00, 0x0a, 0x00, 0x02, 0xce, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, 0x00, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, - 0xb1, 0x10, 0x20, 0x44, 0x0b, 0x10, 0x02, 0xc4, - 0x80, 0xb1, 0x10, 0x2c, 0x48, 0x43, 0x12, 0x02, - 0xc4, 0x00, 0xb1, 0x00, 0xa5, 0x70, 0x09, 0x5c, - 0x02, 0xd7, 0x00, 0xb5, 0xc0, 0x28, 0x78, 0x0a, - 0x10, 0x06, 0xe4, 0x00, 0x81, 0x48, 0x24, 0x50, - 0x08, 0x11, 0x02, 0xc4, 0x20, 0xb1, 0x40, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x22, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x01, 0x2e, 0x40, 0x0b, 0x90, 0x02, - 0xe4, 0x10, 0xb9, 0x20, 0x26, 0x40, 0x09, 0xd0, - 0x06, 0xf4, 0x00, 0x9d, 0x00, 0xa6, 0x40, 0x0b, - 0x92, 0x12, 0xe4, 0x00, 0xa9, 0x00, 0x24, 0x40, - 0x0a, 0x90, 0x02, 0xe4, 0x80, 0xbb, 0x01, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0d, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x12, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe5, 0x20, 0xf9, 0x08, 0x36, 0x50, 0x4d, 0x9c, - 0x43, 0xe5, 0x50, 0xf9, 0x50, 0x2a, 0x60, 0x0f, - 0x9a, 0x03, 0xe4, 0x00, 0xe9, 0x01, 0x36, 0x41, - 0x0c, 0x92, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe8, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf1, 0x01, 0xbe, 0x40, 0x0f, 0x90, 0x01, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x8f, 0x92, 0x03, - 0xe4, 0xed, 0x09, 0x00, 0x0b, 0x00, 0x00, 0xf9, - 0x00, 0x30, 0x40, 0x0f, 0x99, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3a, 0x48, 0x8f, 0x90, 0x03, 0xe7, - 0x00, 0xf1, 0x00, 0x3a, 0x40, 0x0f, 0x94, 0x03, - 0xe4, 0x00, 0xf9, 0x08, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x10, 0xa0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0e, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0c, 0x80, 0x02, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x2e, 0x80, 0x03, 0x21, 0x00, 0xc8, - 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, 0xa0, 0x80, - 0xf0, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x40, 0xf8, 0x20, 0x32, 0x00, 0x0c, 0x84, 0x03, - 0xe3, 0x42, 0xc8, 0x04, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x05, 0x28, 0x00, 0xba, 0x00, 0x2e, 0x80, - 0x0b, 0xa0, 0x02, 0xe8, 0x00, 0xbe, 0x00, 0x2e, - 0x80, 0x08, 0xa2, 0x02, 0xe8, 0x00, 0xba, 0x80, - 0x2e, 0x80, 0x08, 0xa0, 0x02, 0x38, 0x40, 0xae, - 0xd0, 0x02, 0xa0, 0x0b, 0xa0, 0x02, 0xe9, 0x10, - 0xba, 0x00, 0x33, 0x84, 0x4b, 0xa0, 0x02, 0xca, - 0x10, 0xbe, 0xc0, 0xa2, 0x80, 0x0d, 0xec, 0x02, - 0xf8, 0x10, 0x8e, 0x00, 0x2f, 0xb0, 0x0b, 0xa0, - 0x02, 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x05, 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0a, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x60, 0x2c, - 0xc0, 0x09, 0x18, 0x02, 0x4c, 0x08, 0x21, 0x80, - 0x2c, 0xc0, 0x0a, 0x30, 0x02, 0x0f, 0x40, 0x8b, - 0x90, 0xa0, 0xc0, 0x1b, 0x30, 0x02, 0x8d, 0x04, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x00, 0xc4, - 0x00, 0xb3, 0x80, 0x20, 0xc0, 0x08, 0x3c, 0x82, - 0xce, 0x10, 0x83, 0x80, 0x2c, 0xc2, 0x0b, 0x30, - 0x02, 0xca, 0x00, 0x50, 0xed, 0x09, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1c, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xdc, 0x00, 0xb5, 0x00, 0x2d, 0xe0, 0x09, 0x70, - 0x02, 0xdc, 0xc0, 0xb7, 0x08, 0x2c, 0xec, 0x48, - 0xfa, 0x02, 0x16, 0x00, 0xa5, 0x00, 0x21, 0xd0, - 0x0b, 0x50, 0x02, 0xd4, 0x00, 0xb7, 0x00, 0x21, - 0x80, 0x0b, 0x73, 0x02, 0xdc, 0x00, 0xb3, 0x0a, - 0x20, 0xc8, 0x09, 0x74, 0x02, 0xce, 0x04, 0x86, - 0x40, 0x2d, 0x82, 0x8b, 0x70, 0x02, 0xe8, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x1e, - 0x00, 0xf7, 0x80, 0x3d, 0xe0, 0x0e, 0x78, 0x03, - 0xde, 0x00, 0xf7, 0x80, 0x3c, 0xe0, 0x2d, 0x78, - 0x43, 0xde, 0x00, 0xf7, 0x80, 0x3d, 0xe0, 0x0e, - 0x7e, 0x02, 0x3e, 0x00, 0xcf, 0x82, 0x31, 0xa0, - 0x0f, 0x68, 0x03, 0x9e, 0x00, 0xb4, 0x80, 0x3d, - 0xe0, 0x0f, 0x78, 0x03, 0xd6, 0x00, 0xf7, 0x80, - 0x31, 0xe0, 0x0c, 0x78, 0x03, 0xde, 0x00, 0xc7, - 0x84, 0x3d, 0xe0, 0x07, 0x78, 0x03, 0xea, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, 0xac, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0e, 0xb0, - 0x03, 0xed, 0x00, 0xfb, 0x00, 0x3e, 0xc8, 0x0f, - 0x30, 0x0b, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0x80, - 0x0f, 0x80, 0x03, 0xe4, 0x00, 0xf8, 0x00, 0x36, - 0xc0, 0x0f, 0xb0, 0x02, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xdc, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfa, - 0x04, 0x3e, 0x80, 0x0f, 0xb0, 0x03, 0xc2, 0x06, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, - 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, - 0xfe, 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, - 0x01, 0x7f, 0x00, 0xff, 0x80, 0x33, 0xf0, 0x0c, - 0xf8, 0x43, 0xfe, 0x02, 0xdf, 0x80, 0x3f, 0xed, - 0x09, 0x00, 0x0d, 0x00, 0x60, 0x0c, 0xf9, 0x03, - 0xba, 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, - 0x03, 0x14, 0x80, 0xcd, 0x80, 0x3b, 0xf0, 0x2c, - 0xf8, 0x03, 0xfa, 0x00, 0xff, 0x84, 0x3f, 0xe0, - 0x0f, 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x11, 0x9c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb4, - 0x11, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, - 0xb7, 0x00, 0x21, 0xc0, 0x28, 0x70, 0x03, 0xfc, - 0x42, 0xd6, 0x00, 0x39, 0x40, 0x0d, 0x50, 0x4b, - 0x10, 0x00, 0xc7, 0x10, 0x39, 0xc1, 0x0f, 0xf0, - 0x02, 0x14, 0x00, 0xd5, 0x02, 0x23, 0xc0, 0x08, - 0x70, 0x03, 0xd8, 0x00, 0xb4, 0x00, 0x3d, 0x40, - 0x0f, 0x70, 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x0b, 0x51, 0x02, 0xdc, 0x00, - 0xb1, 0x00, 0x21, 0xc0, 0x09, 0x70, 0x82, 0xdc, - 0x00, 0x96, 0x00, 0x2c, 0x00, 0x09, 0x20, 0x42, - 0x08, 0x00, 0xa4, 0x00, 0x2d, 0xd0, 0x0b, 0x70, - 0x02, 0x34, 0x00, 0x95, 0x00, 0x25, 0xc0, 0x08, - 0x60, 0x02, 0xd8, 0x00, 0xb7, 0x10, 0x2d, 0x80, - 0x0b, 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x14, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb2, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x20, 0xc0, 0x09, 0x38, 0x22, 0x8d, - 0x00, 0x0b, 0xc0, 0x28, 0x00, 0x29, 0x04, 0x02, - 0x01, 0x10, 0x90, 0x40, 0x28, 0xe0, 0x0a, 0x36, - 0x02, 0x04, 0x00, 0x81, 0x00, 0xa4, 0xc0, 0x88, - 0x1e, 0x02, 0xc1, 0x00, 0xb0, 0x00, 0x28, 0x00, - 0x0a, 0x30, 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x0e, 0x00, 0xa8, - 0x15, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xf2, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x02, 0xfc, 0x00, 0xfb, 0x00, 0xb3, - 0xc0, 0x0d, 0xfc, 0x02, 0xe0, 0x12, 0x59, 0xd0, - 0x3e, 0xe0, 0x0d, 0xbc, 0x03, 0x2e, 0x00, 0xeb, - 0x80, 0x3e, 0xc2, 0x0b, 0xf4, 0x03, 0x0c, 0x00, - 0x92, 0x04, 0xbf, 0xc0, 0x08, 0x84, 0x03, 0xe5, - 0x00, 0xf1, 0x00, 0x2e, 0x40, 0x0b, 0xb0, 0x03, - 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xf8, 0x00, 0x3e, 0xc0, - 0x0f, 0x90, 0x02, 0xec, 0x00, 0xf9, 0x00, 0x3e, - 0xc0, 0x0e, 0xb0, 0x03, 0xe1, 0x90, 0xf9, 0x50, - 0x78, 0xe0, 0x0e, 0x9a, 0x03, 0xa6, 0x00, 0xeb, - 0x80, 0x3e, 0x80, 0x0f, 0xb0, 0x0b, 0xec, 0x00, - 0xfb, 0x40, 0x3a, 0xc0, 0x8f, 0x81, 0x13, 0xa5, - 0xc1, 0xf8, 0x40, 0x3e, 0x00, 0x0f, 0xb0, 0x03, - 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x10, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xfc, 0x00, 0x3b, 0xc0, - 0x0f, 0xf8, 0x03, 0xbc, 0x00, 0xe7, 0x10, 0x33, - 0xc0, 0x0b, 0xf0, 0x83, 0x30, 0x00, 0xfd, 0x00, - 0x37, 0x81, 0x4c, 0xe0, 0x43, 0x7c, 0x20, 0xf4, - 0x08, 0x37, 0x40, 0x0d, 0xf0, 0x02, 0x3c, 0x80, - 0xdf, 0x00, 0x33, 0xc0, 0x0c, 0x40, 0x03, 0x30, - 0x00, 0xfd, 0x83, 0xb3, 0x44, 0x8c, 0xf0, 0x03, - 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, - 0x04, 0x6c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xec, 0x00, 0xb8, 0x08, 0x22, 0xc0, - 0x0b, 0xb8, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x22, - 0xc0, 0x0b, 0x30, 0x22, 0x27, 0x00, 0xb9, 0xc0, - 0x22, 0x80, 0x0a, 0x80, 0x03, 0xed, 0x09, 0x00, - 0x0f, 0x00, 0xe4, 0x00, 0xb8, 0x00, 0x20, 0x60, - 0x0f, 0x30, 0x0a, 0xac, 0x00, 0xfb, 0x08, 0x3e, - 0xc0, 0x08, 0x8c, 0x82, 0x27, 0x90, 0xb8, 0xc0, - 0x22, 0x01, 0x08, 0xb0, 0x02, 0xe0, 0x40, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, - 0x00, 0xbb, 0x80, 0x2a, 0xc0, 0x0b, 0xb2, 0x02, - 0xec, 0x00, 0xab, 0x00, 0x22, 0xc0, 0x0b, 0xb0, - 0x0a, 0x63, 0x18, 0x99, 0x88, 0x22, 0x41, 0x18, - 0xb0, 0x06, 0xe8, 0x01, 0xbb, 0x04, 0x26, 0xe1, - 0x0b, 0xb0, 0x12, 0xa4, 0x10, 0x89, 0x00, 0x20, - 0xc0, 0x48, 0x98, 0x12, 0x26, 0x00, 0xb8, 0x20, - 0x20, 0xc0, 0x08, 0xb0, 0x42, 0xe0, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x0c, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, - 0x00, 0xb0, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0xa0, 0xc0, 0x0b, 0xb0, - 0x02, 0x00, 0x00, 0xb1, 0x00, 0x20, 0x40, 0x0a, - 0x10, 0x02, 0x80, 0x00, 0xb3, 0x00, 0x20, 0xc0, - 0x09, 0xb0, 0x02, 0x04, 0x00, 0x91, 0x00, 0x2c, - 0xc0, 0x48, 0x10, 0x02, 0x04, 0x00, 0xb0, 0x00, - 0x20, 0x40, 0x28, 0x30, 0x00, 0xc2, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xf9, 0x00, 0x3a, 0xc0, 0x0f, 0xb0, 0x03, - 0xfc, 0x00, 0xeb, 0x00, 0x21, 0xc0, 0x0f, 0xb0, - 0x03, 0x64, 0x04, 0xb9, 0x00, 0x36, 0x01, 0x08, - 0xa0, 0x02, 0x68, 0x00, 0xf8, 0x00, 0x36, 0x40, - 0xaf, 0xb0, 0x03, 0xa4, 0x08, 0xc1, 0x00, 0x33, - 0xc0, 0x0c, 0x80, 0x0b, 0x20, 0x00, 0xf8, 0x00, - 0x32, 0x80, 0x0c, 0xb0, 0x03, 0xc0, 0x03, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, - 0xed, 0x09, 0x00, 0x10, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xfc, 0x00, - 0x3f, 0xc0, 0x0f, 0xd0, 0x03, 0xfc, 0x00, 0xfd, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x07, 0xf4, 0x00, - 0xfd, 0x00, 0xbf, 0x00, 0x0f, 0xc0, 0x03, 0xf0, - 0x00, 0xfc, 0x00, 0x3f, 0x40, 0x0f, 0xf0, 0x03, - 0xf4, 0x00, 0xfd, 0x00, 0x3f, 0xc1, 0x0f, 0xd0, - 0x03, 0xf4, 0x08, 0xfc, 0x00, 0x3f, 0x00, 0x0f, - 0xf0, 0x03, 0x68, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x05, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xc0, 0x03, 0x3c, 0xc8, 0xff, 0x00, - 0x3f, 0xc0, 0xcc, 0xd0, 0x02, 0xf5, 0x00, 0xff, - 0x21, 0x33, 0xc0, 0x0e, 0xf2, 0x03, 0xf4, 0x00, - 0xfd, 0x10, 0x33, 0x04, 0x0c, 0xf0, 0x0b, 0x34, - 0x00, 0xff, 0x01, 0x3f, 0xc0, 0x8f, 0xf1, 0x03, - 0xf4, 0x00, 0xff, 0x44, 0x33, 0xc1, 0x0c, 0xc0, - 0x03, 0x3c, 0x40, 0xff, 0x00, 0x3f, 0xc4, 0x4f, - 0xf0, 0x22, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x10, 0xec, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0x3d, 0x88, 0xbf, 0x40, - 0x22, 0xd0, 0x08, 0xb0, 0x02, 0xee, 0x00, 0xbf, - 0x9c, 0x23, 0xc4, 0x08, 0xf4, 0x02, 0xe4, 0x00, - 0xba, 0x01, 0x22, 0x88, 0x08, 0xb4, 0x02, 0x2c, - 0x00, 0xbb, 0x00, 0x3e, 0x40, 0x08, 0xf0, 0x02, - 0xe4, 0x00, 0xbb, 0x00, 0x2a, 0xc0, 0x0d, 0x82, - 0x12, 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xc8, 0x0b, - 0xb0, 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x88, 0x05, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0xa0, 0x02, 0x0d, 0x80, 0xb3, 0x10, - 0x24, 0xc4, 0x08, 0x30, 0x02, 0x4c, 0x80, 0xb3, - 0x20, 0x20, 0xc0, 0x08, 0x34, 0x02, 0xc4, 0x00, - 0xb1, 0x20, 0x20, 0x00, 0x28, 0x21, 0x02, 0x44, - 0x00, 0xb3, 0x00, 0xed, 0x09, 0x00, 0x11, 0x00, - 0x2e, 0xc0, 0x8a, 0x32, 0x42, 0xc4, 0xa0, 0xb3, - 0x20, 0x20, 0xc0, 0x28, 0x80, 0x82, 0x0c, 0x80, - 0xb3, 0x00, 0x2c, 0xc8, 0x0b, 0x30, 0x02, 0xe2, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, - 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0x2c, 0x00, 0xbb, 0x00, 0x26, 0xc1, 0x28, - 0x92, 0x02, 0xec, 0x80, 0xbb, 0x00, 0x22, 0xc0, - 0x28, 0xb0, 0x02, 0xe6, 0x10, 0xb9, 0x80, 0x26, - 0xa2, 0x09, 0xb0, 0x82, 0x6c, 0x00, 0xbb, 0x00, - 0x2e, 0xc0, 0x88, 0xb0, 0x02, 0xe4, 0x40, 0xbb, - 0x00, 0x0a, 0xc0, 0x09, 0xb0, 0x0a, 0x2c, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xf0, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xbc, - 0x83, 0x2c, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0c, - 0xb0, 0x03, 0x6e, 0x00, 0xfb, 0x00, 0x32, 0xc0, - 0x04, 0xb0, 0x02, 0xe2, 0x10, 0xb9, 0x80, 0x32, - 0x70, 0x0c, 0xbc, 0x03, 0x64, 0x40, 0xfb, 0x02, - 0x3e, 0x60, 0x0e, 0xb0, 0x43, 0xe6, 0x00, 0xbb, - 0x00, 0x30, 0xc0, 0x0c, 0x08, 0x07, 0x2c, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, - 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xda, - 0x03, 0xfc, 0x08, 0xf7, 0x00, 0x3b, 0xc0, 0x0f, - 0xf8, 0x03, 0xfc, 0x00, 0xfb, 0x02, 0x3f, 0xc0, - 0x0d, 0xf0, 0x03, 0xf4, 0x00, 0xfa, 0x00, 0x38, - 0xc0, 0x0e, 0xf1, 0x03, 0xbe, 0x00, 0xff, 0x00, - 0x3b, 0x30, 0x0e, 0xf0, 0x03, 0xf4, 0x00, 0xff, - 0x02, 0x3f, 0xc0, 0x0f, 0xd2, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf8, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, - 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0xed, 0x09, - 0x00, 0x12, 0x00, 0x0f, 0xb8, 0x03, 0x2c, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb8, 0x03, 0xe4, - 0x00, 0xc3, 0x08, 0x32, 0xc0, 0x0e, 0xb1, 0x07, - 0xa5, 0x00, 0xcb, 0x00, 0x72, 0xd0, 0x2d, 0xa0, - 0x03, 0x64, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0e, - 0xb0, 0x03, 0x2c, 0x00, 0xfb, 0x00, 0x2e, 0xc0, - 0x0f, 0x80, 0x03, 0x2c, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x4b, 0x34, 0x02, 0x3c, 0x00, - 0xbf, 0xf0, 0x2d, 0xc8, 0x0b, 0xb5, 0x02, 0xec, - 0x00, 0x8f, 0x00, 0x21, 0xe8, 0x03, 0xfd, 0x02, - 0xe4, 0x94, 0x8b, 0x00, 0x22, 0xc0, 0x08, 0x38, - 0x02, 0xef, 0x00, 0x3f, 0x02, 0x2c, 0xa0, 0x08, - 0xf0, 0x03, 0x6c, 0x00, 0x3f, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x0a, 0x2c, 0x00, 0xbb, 0x00, 0x2e, - 0xc2, 0x0b, 0xb0, 0x02, 0xf2, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x05, 0x4c, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x82, 0x0c, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x34, 0x00, 0xcc, - 0x00, 0xa3, 0x00, 0x20, 0xc0, 0x0b, 0x34, 0x02, - 0x84, 0x00, 0x8b, 0x00, 0x60, 0x00, 0x08, 0x08, - 0x02, 0xcf, 0x20, 0xb3, 0x00, 0x28, 0x68, 0x08, - 0x30, 0x02, 0x04, 0x00, 0xbb, 0x02, 0x2c, 0xcc, - 0x0b, 0x00, 0x02, 0x0c, 0x00, 0xb3, 0x00, 0x2c, - 0xd2, 0x0b, 0x30, 0x02, 0xf8, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x1e, 0x00, 0xb7, - 0x80, 0x2d, 0xe1, 0x0b, 0xf8, 0x02, 0x1e, 0x08, - 0xb7, 0x82, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xd6, - 0x00, 0xa7, 0x80, 0x21, 0xe0, 0x0b, 0x78, 0x00, - 0xdc, 0x00, 0x86, 0x84, 0x21, 0xa0, 0x18, 0x78, - 0x02, 0xde, 0x20, 0xb7, 0x80, 0x2f, 0x64, 0x08, - 0x78, 0xed, 0x09, 0x00, 0x13, 0x00, 0x02, 0x56, - 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x68, 0x02, - 0x1e, 0x00, 0xb7, 0x80, 0x2d, 0xe4, 0x0b, 0x78, - 0x02, 0xc8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x68, 0x08, 0x0c, 0x00, 0xf3, 0x00, 0x3c, 0xc0, - 0x0f, 0x10, 0x03, 0x0c, 0x00, 0xf3, 0x00, 0x1c, - 0xc5, 0x0f, 0x30, 0x03, 0xec, 0x82, 0xe3, 0x00, - 0x30, 0xc0, 0x0e, 0x30, 0x03, 0xad, 0x40, 0xc3, - 0x00, 0x80, 0x00, 0x0c, 0x10, 0x83, 0xcc, 0x00, - 0xf3, 0x00, 0x3c, 0xc2, 0x8e, 0xb0, 0x03, 0x04, - 0x00, 0xf3, 0x10, 0x3c, 0xc4, 0x0f, 0x81, 0x03, - 0x0c, 0x00, 0xf3, 0x20, 0x3c, 0xc0, 0x0f, 0x30, - 0x03, 0xd2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0x70, 0x03, 0xfd, 0x60, 0xff, 0x00, 0x3f, - 0xc4, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xdf, 0x10, - 0x3f, 0xd0, 0x0f, 0xf0, 0x03, 0xfc, 0x80, 0xff, - 0x00, 0x3f, 0x84, 0x2e, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3d, 0xc0, 0x0f, 0xf4, 0x03, 0xf4, - 0x40, 0xff, 0x10, 0x37, 0xc5, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc1, 0x0f, 0xf0, - 0x03, 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x01, 0xec, 0x00, 0xeb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xed, 0x80, 0xcb, 0x01, 0x3e, - 0xc0, 0x0f, 0x98, 0x07, 0xac, 0x00, 0xcb, 0xd8, - 0x32, 0xd0, 0x07, 0xb1, 0x03, 0x6c, 0x00, 0xfb, - 0x00, 0x32, 0x80, 0x8e, 0x80, 0x03, 0xac, 0x00, - 0xeb, 0x10, 0x3c, 0x40, 0x0c, 0xb5, 0x03, 0x2e, - 0x02, 0xeb, 0x00, 0x3e, 0xc0, 0x0f, 0x80, 0x03, - 0xec, 0x00, 0x7b, 0x00, 0x3e, 0xe0, 0x0d, 0xb0, - 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x68, 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xcc, 0xed, 0x09, 0x00, 0x14, - 0x00, 0x00, 0x87, 0x29, 0x2d, 0xc0, 0x0b, 0x70, - 0x42, 0x1c, 0x02, 0x8f, 0x20, 0xa1, 0xd8, 0x5b, - 0x71, 0x03, 0x9c, 0x00, 0xb6, 0x00, 0x21, 0x80, - 0x08, 0x70, 0x4a, 0x1c, 0x00, 0xc7, 0x00, 0x2d, - 0x00, 0x0f, 0x70, 0x03, 0xbc, 0x00, 0x87, 0x40, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xf7, - 0x00, 0x2f, 0xc0, 0x08, 0x70, 0x02, 0xd2, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, - 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, - 0xde, 0x80, 0x87, 0xb0, 0x2d, 0xe4, 0x0b, 0x78, - 0x02, 0x9e, 0x04, 0x87, 0xa4, 0x21, 0xe8, 0x0b, - 0x78, 0x02, 0x5f, 0x00, 0xa3, 0x80, 0x24, 0xe0, - 0x0b, 0x18, 0x02, 0xde, 0x00, 0xb7, 0xa0, 0x2f, - 0xe0, 0x09, 0x7a, 0x02, 0xde, 0x00, 0xa7, 0x80, - 0x2d, 0xe0, 0x0b, 0x48, 0x02, 0xde, 0x00, 0xb7, - 0x80, 0x2d, 0xe0, 0x09, 0x78, 0x02, 0xf0, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x1e, 0x02, - 0xcc, 0x00, 0x83, 0x02, 0x2c, 0xc0, 0x0b, 0x18, - 0x02, 0x86, 0x40, 0x83, 0x00, 0x20, 0xc1, 0x0b, - 0x30, 0x22, 0xcd, 0x80, 0xb3, 0x90, 0x20, 0xf8, - 0x0b, 0x30, 0x02, 0x0c, 0x00, 0x8b, 0x00, 0x6c, - 0xa0, 0x0b, 0x30, 0x00, 0x8c, 0x00, 0xa3, 0x00, - 0x2c, 0xc0, 0x0b, 0xb6, 0x02, 0xcc, 0x10, 0xb3, - 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xd2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, 0xa8, - 0x00, 0xea, 0x00, 0x3e, 0x80, 0x0f, 0xec, 0x03, - 0xe8, 0x02, 0xc2, 0x00, 0x3e, 0x80, 0x0f, 0xaa, - 0x03, 0xa8, 0x00, 0xca, 0x00, 0x32, 0x80, 0x0f, - 0xa0, 0x03, 0x79, 0x00, 0xee, 0x00, 0x37, 0xb2, - 0x6f, 0xe0, 0x03, 0xa8, 0x00, 0xfa, 0x00, 0x3f, - 0x98, 0x0d, 0xa0, 0x23, 0x28, 0x28, 0xea, 0xed, - 0x09, 0x00, 0x15, 0x00, 0x00, 0x3e, 0x80, 0x0f, - 0xe0, 0x03, 0xe8, 0x11, 0xfa, 0x00, 0x3e, 0x80, - 0x1d, 0xa0, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x00, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x81, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x2e, 0x00, 0x0f, 0x80, 0x02, 0x60, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x84, 0x03, 0xa0, - 0x00, 0xf8, 0x00, 0xbe, 0x00, 0x0c, 0x00, 0x03, - 0xe0, 0x00, 0xe8, 0x04, 0x3e, 0x20, 0x0d, 0x80, - 0x03, 0xa0, 0x00, 0xd8, 0x00, 0x3e, 0x10, 0x0f, - 0x80, 0x03, 0xe0, 0x05, 0xe8, 0x01, 0x36, 0x10, - 0x0f, 0x80, 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xa4, 0x00, 0xc9, - 0x00, 0x3a, 0x60, 0x0f, 0x90, 0x03, 0xe6, 0x00, - 0xd9, 0x02, 0x3e, 0x40, 0x0f, 0x98, 0x07, 0xe4, - 0x00, 0xf1, 0x00, 0x34, 0x40, 0x05, 0x90, 0x03, - 0x44, 0x00, 0xc9, 0x00, 0x22, 0x40, 0x29, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x05, 0x3a, 0x50, 0x0b, - 0x90, 0x02, 0x24, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x04, 0x64, 0x00, 0xe9, 0x00, - 0x2e, 0x40, 0x4b, 0x14, 0x02, 0x24, 0x00, 0x89, - 0x00, 0x22, 0x64, 0x4b, 0x94, 0x02, 0xc6, 0x40, - 0x89, 0x00, 0x2e, 0x40, 0x4b, 0x93, 0x02, 0xe6, - 0x00, 0xb9, 0x00, 0x26, 0x40, 0x00, 0x90, 0x03, - 0x65, 0x00, 0x89, 0x00, 0x38, 0x50, 0x18, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x02, 0x2e, 0x60, 0x0b, - 0x90, 0x0a, 0xa4, 0x00, 0xb9, 0x02, 0x0e, 0x58, - 0x0b, 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x05, 0x24, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x98, 0x02, 0x84, 0x00, 0x89, - 0x00, 0x2a, 0xed, 0x09, 0x00, 0x16, 0x00, 0x40, - 0x0b, 0x98, 0x02, 0xe4, 0x00, 0x19, 0x00, 0x2e, - 0x44, 0x0b, 0x90, 0x02, 0xe4, 0xa0, 0xb9, 0x00, - 0xa2, 0x40, 0x0b, 0x91, 0x02, 0x64, 0x02, 0x89, - 0x00, 0x2a, 0x48, 0x0b, 0x90, 0x00, 0xe4, 0x00, - 0xa9, 0x00, 0x6e, 0x40, 0x0b, 0x90, 0x02, 0xa4, - 0x01, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, - 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x04, 0x00, 0xa1, 0x00, 0x2c, 0x40, 0x0b, - 0x18, 0x02, 0x05, 0x02, 0x81, 0x00, 0x20, 0x40, - 0x0b, 0x18, 0x02, 0xe4, 0x00, 0x81, 0x00, 0x2c, - 0x4a, 0x0b, 0x12, 0x86, 0xc5, 0x00, 0xb1, 0x01, - 0x04, 0x50, 0x0a, 0x10, 0x02, 0x46, 0xa0, 0x81, - 0x2a, 0x68, 0xc0, 0x18, 0x14, 0x02, 0xc5, 0x00, - 0xb1, 0x40, 0x2c, 0x40, 0x01, 0x14, 0x22, 0x85, - 0x00, 0xb1, 0x00, 0x2c, 0x50, 0x0b, 0x10, 0x02, - 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, - 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xa0, 0x00, 0xc8, 0x00, 0x3a, 0x01, - 0x0f, 0x80, 0x03, 0xc1, 0x40, 0xd8, 0x50, 0x2e, - 0x08, 0x0f, 0x82, 0x12, 0xe0, 0x00, 0xf8, 0x00, - 0x32, 0x00, 0x0f, 0x80, 0x03, 0x60, 0x80, 0xc8, - 0x20, 0x3a, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xe8, 0x00, 0x3a, 0x81, 0x0f, 0x80, 0x03, 0xa0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x1d, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0xd0, 0x03, 0xe5, 0x00, 0xf9, 0x41, 0x3e, 0x50, - 0x0f, 0x50, 0x03, 0xf4, 0x08, 0xf9, 0x40, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xf5, 0x00, 0xfd, 0x68, - 0x3b, 0xd0, 0x0d, 0xd4, 0x01, 0x94, 0xa0, 0xf9, - 0x28, 0x3b, 0x40, 0x0f, 0x94, 0x13, 0xf4, 0x04, - 0xf9, 0x40, 0x3e, 0x40, 0x07, 0xed, 0x09, 0x00, - 0x17, 0x00, 0xd0, 0x03, 0x64, 0x08, 0xd9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe6, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0xd0, 0x13, 0xe4, - 0x90, 0xcd, 0x28, 0x37, 0x48, 0x0f, 0xd0, 0x03, - 0xf4, 0x00, 0xfd, 0x00, 0x3b, 0x48, 0x0f, 0x50, - 0x03, 0x74, 0xc0, 0xf9, 0x10, 0x36, 0x40, 0x0f, - 0xd0, 0x03, 0xf4, 0xc0, 0xf9, 0x00, 0x2b, 0x40, - 0x0f, 0x90, 0x03, 0xc4, 0x00, 0xc9, 0x10, 0x3d, - 0x40, 0x0c, 0x90, 0x03, 0xe4, 0x40, 0xc9, 0x00, - 0x7f, 0x40, 0x0f, 0x90, 0x03, 0xc6, 0x01, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, 0x00, - 0xb8, 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x02, 0xe0, - 0xa0, 0x88, 0x05, 0x22, 0x04, 0x0b, 0x80, 0x03, - 0xa0, 0xa0, 0xb0, 0x30, 0x2e, 0x05, 0x0b, 0x84, - 0x02, 0x20, 0xc0, 0xb8, 0x40, 0x22, 0x02, 0x0e, - 0x81, 0x02, 0xe0, 0xc0, 0xb8, 0x48, 0x66, 0x00, - 0x09, 0x84, 0x80, 0xe0, 0x20, 0x88, 0x14, 0x2e, - 0x00, 0x0d, 0x82, 0x02, 0xe0, 0x80, 0xd8, 0x01, - 0x3a, 0x02, 0x0b, 0x80, 0x02, 0xce, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, - 0xc0, 0x81, 0x00, 0x2c, 0x40, 0x0b, 0x30, 0x02, - 0xc4, 0x80, 0xb1, 0x28, 0x28, 0x40, 0x1b, 0x11, - 0x28, 0x04, 0x80, 0xb1, 0x10, 0x20, 0x45, 0x09, - 0x10, 0x02, 0xc4, 0x80, 0xb1, 0x30, 0x22, 0x40, - 0x0a, 0x13, 0x12, 0xc4, 0x03, 0xa1, 0x01, 0x2c, - 0x40, 0x00, 0x12, 0x82, 0xc4, 0x90, 0x81, 0x00, - 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, 0x00, - 0xb9, 0x00, 0x6e, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0x8b, 0x00, 0x2a, 0x40, 0x0b, 0x90, 0x02, - 0xed, 0x09, 0x00, 0x18, 0x00, 0xa6, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0x27, 0x00, - 0xb1, 0x40, 0x20, 0x40, 0x0a, 0x90, 0x82, 0xe4, - 0x00, 0xb9, 0x00, 0x26, 0x60, 0x0b, 0x90, 0x52, - 0x64, 0x80, 0xa9, 0x00, 0x2e, 0x40, 0x09, 0x90, - 0x82, 0xe4, 0x00, 0x99, 0x06, 0x2a, 0x40, 0x0b, - 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, 0x00, 0x3e, - 0x41, 0x0f, 0x91, 0x03, 0xe4, 0x02, 0xc1, 0x00, - 0x3e, 0x40, 0x0f, 0x98, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3a, 0x40, 0x0f, 0x90, 0x12, 0x25, 0x00, - 0xf9, 0x50, 0x32, 0x50, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x32, 0x60, 0x8e, 0x90, 0x03, - 0xe4, 0x00, 0xe9, 0x00, 0x1e, 0x40, 0x48, 0x9c, - 0x03, 0xe4, 0x00, 0xc9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x03, 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xc4, 0x00, 0xf9, 0x04, - 0x36, 0x40, 0x0f, 0x94, 0x03, 0xe4, 0x20, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x10, 0x03, 0xa4, 0x00, - 0xf9, 0x82, 0xba, 0x48, 0x05, 0x90, 0x13, 0xe4, - 0x10, 0xf9, 0x00, 0x36, 0x40, 0x0c, 0x90, 0x03, - 0xe6, 0x00, 0xd9, 0x00, 0x3e, 0x40, 0x0f, 0x99, - 0x03, 0xe4, 0x04, 0xf9, 0x00, 0x12, 0x40, 0x0f, - 0x90, 0x03, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x10, 0xa0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x88, 0x03, 0xe0, 0x02, 0xc8, 0x00, - 0x3a, 0x00, 0x0f, 0x88, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x32, 0x00, 0x0c, 0x88, 0x03, 0x60, 0x28, - 0xe8, 0x40, 0x32, 0x11, 0x07, 0x84, 0x03, 0xe2, - 0x00, 0xc8, 0x00, 0x3a, 0x20, 0x0f, 0x80, 0x03, - 0xe0, 0x10, 0xc8, 0x00, 0x3e, 0x02, 0x0c, 0x80, - 0x43, 0xe0, 0x00, 0xed, 0x09, 0x00, 0x19, 0x00, - 0xf8, 0x00, 0x3e, 0x04, 0x0f, 0x80, 0x03, 0xca, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x28, 0x00, 0xba, 0x00, 0x2e, 0x80, 0x43, 0xe6, - 0x02, 0xe8, 0x00, 0x8e, 0x40, 0x0e, 0x80, 0x0b, - 0xe4, 0x03, 0xb8, 0x80, 0xbe, 0xf0, 0x22, 0x80, - 0x08, 0xec, 0x02, 0x3a, 0x00, 0x8a, 0x01, 0xa2, - 0x80, 0x0b, 0xa0, 0x02, 0xfb, 0x80, 0x8a, 0x00, - 0x29, 0x92, 0x0b, 0xa0, 0x03, 0xa8, 0x08, 0x0a, - 0x02, 0x2d, 0x80, 0x48, 0xa0, 0x02, 0xe8, 0x00, - 0xba, 0x00, 0x2f, 0x80, 0x0b, 0xa0, 0x02, 0xca, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x18, - 0x02, 0xcc, 0x00, 0x83, 0xf0, 0x28, 0x44, 0x0b, - 0x10, 0x02, 0x82, 0x00, 0xb0, 0x00, 0xa4, 0x60, - 0x09, 0x18, 0x0a, 0x0c, 0x00, 0xb3, 0x02, 0x20, - 0xc0, 0x4b, 0x11, 0x02, 0x8c, 0x00, 0x83, 0x00, - 0x20, 0xc0, 0x09, 0x30, 0x02, 0xac, 0x00, 0xb3, - 0x00, 0x2c, 0xe0, 0x08, 0x30, 0x32, 0xec, 0x08, - 0xb3, 0x00, 0x2c, 0xe0, 0x0b, 0x30, 0x02, 0xca, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, - 0x1c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0xdc, 0xc0, 0x84, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0x90, 0x00, 0xb5, 0x80, 0x20, 0xf0, - 0x89, 0x70, 0x82, 0x0e, 0x28, 0x9f, 0x30, 0xa9, - 0xc8, 0x09, 0x50, 0x02, 0xde, 0x00, 0x83, 0xa0, - 0x29, 0xc0, 0x0b, 0x70, 0x02, 0xbc, 0x80, 0x97, - 0x00, 0x2d, 0xd0, 0xe8, 0x72, 0x02, 0xdc, 0x80, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xe8, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, - 0x1e, 0x00, 0xf7, 0x80, 0x2d, 0xe0, 0x0f, 0x78, - 0x03, 0xfe, 0xc0, 0xc7, 0x80, 0x39, 0xe0, 0x0f, - 0x78, 0x03, 0x92, 0x00, 0xf4, 0x80, 0xed, 0x09, - 0x00, 0x1a, 0x00, 0x35, 0xe0, 0x2d, 0x78, 0x03, - 0x5e, 0x00, 0xf7, 0xa8, 0x21, 0xf4, 0x0f, 0x58, - 0x03, 0xfe, 0x00, 0xc7, 0xe2, 0x39, 0xe0, 0x0f, - 0x7e, 0x03, 0x9e, 0x08, 0xf7, 0x80, 0x3d, 0xe0, - 0x08, 0x7e, 0x03, 0xdf, 0x00, 0xf7, 0x80, 0x2d, - 0xe0, 0x4f, 0x78, 0x23, 0xea, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x4d, 0xac, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x80, - 0xf8, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xb0, - 0x00, 0xfd, 0x00, 0x3e, 0xc0, 0x0e, 0xb0, 0x01, - 0xec, 0x00, 0xe3, 0x60, 0xb6, 0xc0, 0x8f, 0x90, - 0x03, 0xec, 0x12, 0xdb, 0x04, 0x3e, 0xc0, 0x8f, - 0xb0, 0x03, 0xac, 0x42, 0xeb, 0x00, 0x36, 0x00, - 0x47, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0x80, 0x0d, 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xff, - 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0xfe, 0x00, - 0xff, 0x80, 0x3f, 0xe4, 0x0f, 0xf1, 0x03, 0xfa, - 0x00, 0xce, 0x80, 0x33, 0xe1, 0x8f, 0xf8, 0x42, - 0x3e, 0x00, 0x6f, 0x80, 0x1b, 0xe0, 0x6c, 0xd9, - 0x03, 0xbc, 0x80, 0xff, 0x80, 0x2f, 0xe4, 0x0e, - 0xf9, 0x03, 0x3e, 0x00, 0xff, 0x88, 0x33, 0xa0, - 0x0f, 0xf9, 0x03, 0x3e, 0x00, 0xff, 0x80, 0x3f, - 0xe0, 0x0d, 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x11, 0x9c, 0x00, 0xb7, - 0x00, 0x2d, 0xc4, 0x0b, 0x50, 0x82, 0xdc, 0x40, - 0xb4, 0x10, 0x2d, 0x40, 0x0b, 0x70, 0x02, 0xf8, - 0x00, 0x8e, 0x10, 0x25, 0xc0, 0x0b, 0x70, 0x02, - 0x5d, 0x88, 0xb7, 0x00, 0x21, 0xc4, 0x08, 0x50, - 0x02, 0x11, 0x40, 0xb7, 0x00, 0x2d, 0xc0, 0x28, - 0x70, 0x03, 0x5c, 0x00, 0xb7, 0x00, 0x21, 0x88, - 0x0b, 0xf0, 0x02, 0x9c, 0x00, 0xf7, 0x00, 0x2d, - 0x40, 0xed, 0x09, 0x00, 0x1b, 0x00, 0x0b, 0x70, - 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x60, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x1b, 0x51, 0x06, 0x90, 0x02, 0x86, 0x00, - 0x2d, 0x40, 0x0b, 0x10, 0x02, 0x5c, 0x08, 0xa7, - 0x10, 0x29, 0xc2, 0x0a, 0x10, 0x82, 0x9c, 0x40, - 0xb7, 0x00, 0x2f, 0xd1, 0x0a, 0x70, 0x26, 0x9c, - 0x00, 0x97, 0x00, 0x25, 0x80, 0x1b, 0x70, 0x02, - 0x1c, 0x00, 0xb7, 0x10, 0x2d, 0xc0, 0x09, 0x70, - 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x14, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x34, 0x02, 0xcc, 0x00, 0xb0, 0x00, 0x2c, - 0xc0, 0x0b, 0x38, 0x02, 0xc0, 0x00, 0x82, 0x00, - 0x2c, 0xc0, 0x83, 0x30, 0x02, 0x4d, 0x20, 0xb3, - 0x40, 0x22, 0xe0, 0x08, 0x18, 0x02, 0x80, 0x41, - 0xb3, 0x00, 0x2c, 0x44, 0x28, 0x30, 0x06, 0xcc, - 0x00, 0xbb, 0x02, 0x24, 0x80, 0x0b, 0x3c, 0x0a, - 0x2c, 0x00, 0xb3, 0x00, 0x6c, 0x01, 0x0b, 0x30, - 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x15, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb4, 0x03, 0xfc, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb8, 0x83, 0xa4, 0x00, 0xc8, 0x00, - 0x3a, 0xc0, 0x8f, 0xb0, 0x0b, 0x2e, 0x00, 0xef, - 0x00, 0x7b, 0xc0, 0x0e, 0xb4, 0x23, 0xac, 0x00, - 0xff, 0x00, 0x3c, 0xd0, 0x8e, 0xf0, 0x02, 0xbc, - 0x00, 0xdf, 0x00, 0x36, 0xc0, 0x0b, 0x78, 0x83, - 0x3c, 0x00, 0xfb, 0x00, 0x3e, 0x00, 0x0d, 0xb0, - 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc1, - 0x0f, 0xb4, 0x03, 0xec, 0x00, 0xf3, 0x40, 0x3e, - 0xc0, 0x07, 0x90, 0x03, 0xf7, 0x00, 0xfd, 0x00, - 0x10, 0x40, 0x0f, 0x90, 0xed, 0x09, 0x00, 0x1c, - 0x00, 0x03, 0xaf, 0x10, 0xbb, 0xa2, 0x7e, 0xc0, - 0x0f, 0xb0, 0x8b, 0x6d, 0x00, 0x7b, 0x00, 0x3e, - 0xc0, 0x0f, 0x30, 0x02, 0x6c, 0x00, 0xdb, 0x00, - 0x3a, 0xd1, 0x0f, 0xb0, 0x83, 0xec, 0x00, 0xeb, - 0x00, 0x2e, 0x00, 0x0d, 0xb0, 0x03, 0xe0, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xd0, 0x83, - 0x3c, 0x00, 0xff, 0xc0, 0xb1, 0x68, 0x0c, 0xf1, - 0x23, 0xb4, 0x02, 0xcc, 0xc0, 0x33, 0xe0, 0x2c, - 0xf9, 0x03, 0x5a, 0x04, 0xe3, 0x00, 0x32, 0xc0, - 0x0c, 0x70, 0x03, 0x38, 0x00, 0xff, 0x00, 0x37, - 0xd0, 0x0d, 0xb0, 0x03, 0x3c, 0x00, 0xdb, 0x00, - 0x23, 0x88, 0x0f, 0xf0, 0x03, 0xbc, 0x00, 0xcf, - 0x01, 0x3f, 0x44, 0x0e, 0xf0, 0x03, 0xc0, 0x44, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0x36, 0x02, - 0x2c, 0x00, 0xbb, 0x00, 0x2a, 0xc0, 0x4d, 0xb8, - 0x02, 0xe5, 0x00, 0xd9, 0x82, 0x22, 0xc0, 0x08, - 0xbc, 0x82, 0xea, 0x02, 0xab, 0x00, 0x22, 0xc0, - 0x4d, 0x90, 0x23, 0xe8, 0x00, 0xbb, 0x00, 0x26, - 0xf0, 0x88, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x2a, 0xb8, 0x8b, 0xb0, 0x0a, 0x2c, 0x02, 0xab, - 0x00, 0x2e, 0x00, 0x0a, 0xb0, 0x02, 0xe0, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb1, 0x06, - 0x2c, 0x00, 0xb8, 0x00, 0x22, 0xc0, 0x09, 0xb0, - 0x02, 0xc8, 0x20, 0xa0, 0x00, 0x62, 0xc8, 0x08, - 0xb0, 0x02, 0xe8, 0x82, 0xab, 0x02, 0x22, 0xc0, - 0x48, 0xb2, 0x02, 0x2c, 0x00, 0xbb, 0x00, 0x2e, - 0xd0, 0x0b, 0xb0, 0x12, 0x6c, 0x00, 0xbb, 0x04, - 0x6a, 0x80, 0x0b, 0xb0, 0x02, 0x2c, 0x00, 0x8b, - 0x00, 0x2c, 0x80, 0x08, 0xb0, 0x02, 0xe0, 0xed, - 0x09, 0x00, 0x1d, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x0a, 0x0c, 0x00, 0xb0, - 0x00, 0x68, 0xc0, 0x09, 0x38, 0x02, 0xc8, 0x10, - 0xa0, 0x04, 0x20, 0xc0, 0x08, 0x30, 0x02, 0xc8, - 0x00, 0xa3, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x4a, - 0xc0, 0x00, 0xb3, 0x04, 0x2e, 0xc0, 0x09, 0x30, - 0x00, 0xcc, 0x00, 0xb3, 0x00, 0x28, 0x80, 0x1b, - 0xb0, 0x02, 0x0c, 0x00, 0xa3, 0x00, 0x2c, 0x20, - 0x28, 0x30, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xbb, 0x00, - 0x3e, 0xc0, 0x0b, 0xb0, 0x03, 0x3c, 0x00, 0xf8, - 0x00, 0x32, 0xc0, 0x0c, 0xb0, 0x03, 0xe0, 0x00, - 0xa8, 0x00, 0x22, 0xc0, 0x4c, 0xb0, 0x03, 0x68, - 0x00, 0xef, 0x00, 0x33, 0xc0, 0x0c, 0xb0, 0x23, - 0x28, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x21, 0x6c, 0x00, 0x7b, 0x00, 0x3a, 0x80, 0x0f, - 0xb0, 0x23, 0x2c, 0x00, 0xcb, 0x00, 0x3e, 0xc0, - 0x0e, 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xc0, 0x03, 0xfc, 0x00, 0xfc, - 0x00, 0x37, 0x40, 0x8f, 0xc0, 0x07, 0xf0, 0x00, - 0xdc, 0x00, 0x3f, 0x40, 0x0f, 0xc0, 0x22, 0xf0, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0d, 0xf0, 0x03, - 0xb0, 0x00, 0xff, 0x00, 0x35, 0x80, 0x0e, 0xf0, - 0x03, 0xbc, 0x00, 0xff, 0x00, 0x3f, 0x80, 0x1f, - 0xf0, 0x23, 0xfc, 0x08, 0xdf, 0x00, 0x3f, 0x00, - 0x0b, 0xf0, 0x03, 0xe8, 0x06, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x15, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x30, 0x37, 0xc2, 0x0f, 0xf2, 0x33, 0xfc, 0x80, - 0xee, 0x21, 0x3f, 0xc1, 0x0d, 0xf1, 0xa3, 0x5c, - 0x00, 0xcf, 0xed, 0x09, 0x00, 0x1e, 0x00, 0x00, - 0x2f, 0xca, 0x0f, 0xf0, 0x03, 0x3c, 0x20, 0xef, - 0x00, 0x37, 0x10, 0x0c, 0xf0, 0x03, 0xb0, 0x00, - 0xfc, 0x00, 0x31, 0x01, 0x0f, 0xd0, 0x03, 0xbc, - 0x00, 0xef, 0x20, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x10, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xec, 0x00, 0x37, 0x70, 0x22, 0x90, - 0x0b, 0xa1, 0x12, 0xe8, 0x40, 0x8a, 0x10, 0x2f, - 0xd0, 0x08, 0xb4, 0x12, 0x3c, 0x52, 0x8b, 0x10, - 0x26, 0xd0, 0x0b, 0xf4, 0x02, 0x3c, 0x00, 0xdf, - 0x00, 0x20, 0x00, 0x8a, 0xb4, 0x42, 0xa0, 0x10, - 0xbb, 0x00, 0xa2, 0x00, 0x0b, 0x90, 0x02, 0xed, - 0xa0, 0x8f, 0x40, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, - 0x05, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x01, 0x04, 0x40, - 0x8b, 0x10, 0x20, 0xc4, 0x00, 0xa1, 0x00, 0x2c, - 0xd0, 0x0b, 0x32, 0x06, 0xcc, 0x00, 0x83, 0x00, - 0x2c, 0xc0, 0x0b, 0x34, 0x02, 0x0c, 0x00, 0x83, - 0x02, 0x2c, 0x08, 0x09, 0x34, 0x20, 0x80, 0x00, - 0xb1, 0x00, 0x20, 0x00, 0x1b, 0x10, 0x02, 0xcc, - 0x40, 0x83, 0x40, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x15, 0xac, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xec, 0x04, 0xbb, 0x00, 0x26, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x02, 0xab, 0x00, 0x2e, - 0xc0, 0x18, 0xb0, 0x02, 0x2c, 0x00, 0x8b, 0x00, - 0x26, 0xc0, 0x0b, 0xb0, 0x0a, 0x2c, 0x00, 0x93, - 0x04, 0x22, 0xc0, 0x09, 0xb0, 0x02, 0x20, 0x20, - 0xbb, 0x80, 0x2a, 0xa0, 0x0b, 0x90, 0x02, 0xec, - 0x10, 0x8b, 0x04, 0x6e, 0xc1, 0x0b, 0xb0, 0x02, - 0xf0, 0x04, 0x60, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x40, 0x05, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x36, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xea, 0x20, 0x3e, 0xc0, 0x0f, 0xb0, - 0x13, 0xec, 0x00, 0xcb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0x2c, 0x00, 0xcb, 0x05, 0x36, 0x10, - 0x0d, 0xb0, 0x03, 0xa7, 0x04, 0xf8, 0x01, 0x32, - 0x08, 0x47, 0x98, 0x03, 0xac, 0x00, 0x6b, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xbc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0x77, 0x00, 0x3b, 0x80, 0x0f, 0xe0, 0x03, - 0xd8, 0x00, 0xde, 0x00, 0x3d, 0xc0, 0x0f, 0x70, - 0x11, 0xdc, 0x00, 0xff, 0x00, 0x37, 0xc0, 0x4f, - 0xb0, 0x03, 0xec, 0x00, 0xdf, 0x00, 0x3f, 0x28, - 0x0a, 0x30, 0x03, 0xfd, 0x00, 0xf7, 0x00, 0x27, - 0x80, 0x0f, 0xfa, 0x07, 0xfc, 0x00, 0xff, 0x00, - 0x37, 0xc0, 0x0f, 0xf0, 0x63, 0xf8, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xac, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xac, 0x00, 0xcb, 0x08, 0x3e, 0xc0, 0x0f, - 0x30, 0x03, 0x0c, 0x00, 0xcb, 0x00, 0x3e, 0xc0, - 0x0c, 0xb0, 0x0b, 0x2e, 0x00, 0xf9, 0x00, 0x32, - 0x10, 0x0c, 0xb0, 0x03, 0xec, 0x04, 0xfb, 0x00, - 0xf6, 0xc0, 0x0f, 0xb0, 0x03, 0x50, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, - 0x00, 0xbf, 0x04, 0x22, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0x2f, 0xc0, 0x0b, 0xf0, - 0x02, 0xfe, 0x20, 0x8f, 0x20, 0x2f, 0xc0, 0x0b, - 0xed, 0x09, 0x00, 0x20, 0x00, 0xf5, 0x82, 0x3e, - 0x28, 0xaf, 0x00, 0x22, 0xc1, 0x08, 0xfd, 0x02, - 0x2e, 0x50, 0xbb, 0x00, 0x0a, 0x96, 0x0a, 0xb8, - 0x12, 0xfc, 0x18, 0xbf, 0x88, 0x22, 0xc0, 0x0b, - 0xb0, 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x05, 0x4c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x20, 0xc0, 0x0b, 0x30, 0x02, 0x4c, 0x00, 0xb3, - 0x04, 0x0c, 0xc0, 0x0b, 0x30, 0x02, 0x8c, 0x00, - 0x83, 0x00, 0x2c, 0xc0, 0x0b, 0x38, 0x22, 0x0e, - 0x00, 0x23, 0x01, 0x26, 0x00, 0x09, 0x30, 0x42, - 0x04, 0x00, 0xb0, 0x00, 0x28, 0x00, 0x0b, 0x11, - 0x02, 0x6d, 0x20, 0xb3, 0x80, 0x00, 0xc0, 0x0b, - 0x30, 0x02, 0x78, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x01, 0x1e, 0x00, 0xb7, 0x80, 0x2d, - 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, - 0x21, 0xa8, 0x0b, 0x69, 0x02, 0xda, 0x00, 0xb7, - 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xdf, 0x00, - 0x87, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x12, 0x1e, - 0x00, 0xa3, 0x90, 0x21, 0xe0, 0x09, 0x78, 0xa2, - 0x1e, 0x00, 0xbf, 0x98, 0x29, 0x20, 0x0b, 0x78, - 0x02, 0xde, 0x00, 0xb3, 0x80, 0x25, 0xe0, 0x0b, - 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x08, 0x0c, 0x00, 0xf3, 0x00, 0x3c, - 0xc0, 0x0f, 0x30, 0x03, 0xcc, 0x00, 0xf3, 0x00, - 0x30, 0x40, 0x0f, 0x10, 0x03, 0x44, 0x00, 0xf1, - 0x00, 0x3c, 0xc0, 0x0f, 0x30, 0x13, 0x8c, 0xc2, - 0xc3, 0x00, 0x3c, 0xc0, 0x8f, 0x30, 0x03, 0x0c, - 0x00, 0xc3, 0x10, 0x3c, 0x10, 0x8d, 0x31, 0x03, - 0x0c, 0x00, 0xf1, 0x00, 0x38, 0x84, 0x0f, 0x30, - 0x01, 0xcc, 0xa4, 0xf3, 0x00, 0xb0, 0xc0, 0x0f, - 0x30, 0x03, 0x52, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x1d, 0xed, 0x09, 0x00, 0x21, 0x00, - 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x10, 0x3f, 0xc8, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xd0, - 0x0f, 0xf0, 0x83, 0xfd, 0x44, 0xff, 0x10, 0x37, - 0xc2, 0x0f, 0xf4, 0x0b, 0xfc, 0x00, 0xbf, 0x10, - 0x3f, 0xc4, 0x0e, 0xf0, 0x03, 0xfc, 0x00, 0xf7, - 0x06, 0x3f, 0x84, 0x1e, 0xf1, 0x03, 0xfc, 0x04, - 0xff, 0x00, 0x3b, 0xc0, 0x0f, 0xf0, 0x03, 0xd0, - 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x08, 0x76, 0xc0, 0x0c, - 0xb8, 0x03, 0x2c, 0x00, 0xfb, 0x00, 0x32, 0xfc, - 0x0c, 0xb0, 0x03, 0xec, 0x80, 0xf3, 0x80, 0xa2, - 0xe0, 0x0c, 0xb2, 0x23, 0x2c, 0x00, 0xfb, 0x90, - 0x3a, 0xe0, 0x0c, 0xb0, 0x03, 0xe4, 0x00, 0xf8, - 0x00, 0x32, 0x80, 0x0b, 0x90, 0x07, 0xec, 0x04, - 0xfb, 0x20, 0x32, 0xc0, 0x0f, 0xb0, 0x03, 0xea, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, - 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x20, 0x2d, 0x80, 0x08, - 0x60, 0x02, 0x18, 0x00, 0xb7, 0x04, 0x23, 0xc0, - 0x08, 0x72, 0x02, 0xdd, 0x80, 0xb7, 0x40, 0x21, - 0xc0, 0x08, 0x30, 0x03, 0x5c, 0xc8, 0x37, 0x10, - 0x23, 0xc0, 0x08, 0x74, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x29, 0x80, 0x0b, 0x70, 0x02, 0xdd, 0x08, - 0xb7, 0x08, 0x29, 0xc0, 0x0b, 0x70, 0x02, 0xd2, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, - 0x9e, 0x00, 0xb7, 0x80, 0x29, 0xe0, 0x0b, 0x78, - 0x02, 0xde, 0x10, 0x37, 0x90, 0x2c, 0x60, 0x88, - 0x18, 0x02, 0x96, 0x00, 0xb1, 0x80, 0x25, 0xe8, - 0x28, 0x7a, 0x02, 0xde, 0x80, 0xb7, 0xa2, 0x20, - 0xe0, 0x08, 0x7b, 0x02, 0x1e, 0xc0, 0xed, 0x09, - 0x00, 0x22, 0x00, 0xb7, 0xa0, 0x29, 0xf0, 0x08, - 0x7a, 0x10, 0x5e, 0x00, 0xb7, 0x80, 0x21, 0xa1, - 0x0b, 0x78, 0x42, 0x5e, 0x08, 0xb3, 0x90, 0x61, - 0xe0, 0x0b, 0x78, 0x02, 0xf0, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x28, 0x30, 0x0a, 0x8c, - 0x00, 0xb3, 0x00, 0xa4, 0xc0, 0x88, 0x30, 0x22, - 0xcc, 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x08, 0x30, - 0x02, 0x4c, 0x00, 0xb3, 0x01, 0x28, 0xd0, 0x08, - 0x30, 0x02, 0xcc, 0x80, 0xb3, 0x00, 0x28, 0xc0, - 0x0b, 0x38, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x28, - 0xc0, 0x0b, 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xe8, 0x15, 0xa8, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x0b, 0xa0, 0x03, 0xe8, 0x00, - 0xfa, 0x00, 0x37, 0x80, 0x0c, 0xe0, 0x03, 0x38, - 0x00, 0xfe, 0x00, 0x36, 0x80, 0x0c, 0xa0, 0x03, - 0xe8, 0x00, 0xfa, 0x00, 0x32, 0x80, 0x0c, 0xa0, - 0x03, 0x28, 0x00, 0xfa, 0x04, 0x3b, 0xa0, 0x2c, - 0xa0, 0x03, 0x78, 0x80, 0xf6, 0x89, 0x33, 0x90, - 0x0f, 0xa0, 0x03, 0xe8, 0x10, 0xfa, 0x00, 0x32, - 0x80, 0x0f, 0xa0, 0x03, 0xfa, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0xe0, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xb8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x01, 0x40, - 0x00, 0xf8, 0x00, 0x3a, 0x00, 0x0f, 0x80, 0x13, - 0xe1, 0x01, 0xf8, 0x00, 0x36, 0x00, 0x2f, 0x80, - 0x43, 0xe0, 0x00, 0xf8, 0x02, 0x32, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x20, - 0x09, 0x81, 0x07, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0d, 0x80, 0x03, 0xd2, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, - 0x00, 0xed, 0x09, 0x00, 0x23, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x01, 0x3c, - 0x40, 0x0d, 0x90, 0x03, 0xe4, 0x00, 0xd1, 0x00, - 0x36, 0x40, 0x0f, 0x90, 0x03, 0x25, 0x00, 0xf9, - 0x00, 0x3e, 0x68, 0x0f, 0x1a, 0x03, 0x24, 0x00, - 0xf9, 0x01, 0x3a, 0x42, 0x0f, 0x1c, 0x03, 0x24, - 0x00, 0xc9, 0x80, 0xb2, 0x60, 0x4f, 0x98, 0x03, - 0xe4, 0x08, 0xf1, 0x00, 0x32, 0x40, 0x05, 0x90, - 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x04, 0x64, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x0e, - 0x50, 0x08, 0x94, 0x00, 0xe4, 0x00, 0xa9, 0x40, - 0x22, 0x40, 0x0b, 0x90, 0x02, 0xa5, 0x00, 0xb9, - 0x00, 0x26, 0x48, 0x0b, 0x98, 0x0a, 0x24, 0x01, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x0a, 0x04, - 0x40, 0xa9, 0x80, 0x22, 0x73, 0x0f, 0x98, 0x02, - 0xe7, 0xc8, 0xb9, 0x10, 0x22, 0x40, 0x0b, 0x90, - 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, - 0x42, 0x09, 0x90, 0x82, 0x64, 0x00, 0xa9, 0x08, - 0x26, 0x40, 0x0b, 0x10, 0x52, 0x25, 0x01, 0xb9, - 0x20, 0x2e, 0x40, 0x0a, 0x90, 0x02, 0x24, 0x40, - 0xb9, 0x00, 0x2e, 0x41, 0x0b, 0x90, 0x02, 0x24, - 0x00, 0xa9, 0x20, 0x02, 0x48, 0x0b, 0x96, 0x02, - 0xe4, 0x04, 0xb9, 0x00, 0x26, 0x40, 0x09, 0x90, - 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x04, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x40, 0x2c, - 0x41, 0x08, 0x10, 0x02, 0xc4, 0x00, 0xa1, 0x02, - 0x20, 0x4a, 0x0b, 0x10, 0x02, 0x84, 0xa0, 0xb1, - 0x00, 0x24, 0x40, 0x0b, 0x10, 0x02, 0x04, 0xa0, - 0xb1, 0x40, 0x2c, 0x50, 0xed, 0x09, 0x00, 0x24, - 0x00, 0x0b, 0x10, 0x02, 0x04, 0x08, 0xa9, 0x00, - 0x20, 0x40, 0x4b, 0x10, 0x20, 0xc5, 0x00, 0xb1, - 0x00, 0x84, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0c, 0x60, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0d, 0x80, - 0x03, 0xe0, 0x00, 0xe8, 0x00, 0x36, 0x1c, 0x0f, - 0x80, 0x01, 0x20, 0x80, 0xf8, 0x00, 0x1e, 0x00, - 0x0f, 0x80, 0x03, 0x20, 0x80, 0xb0, 0x00, 0x7e, - 0x00, 0x0f, 0x80, 0x03, 0x28, 0x00, 0xe8, 0x00, - 0x32, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x02, 0x36, 0x00, 0x0d, 0x80, 0x03, 0xee, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x1d, 0xa4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x40, 0x3f, 0x50, 0x0f, 0xd4, - 0x03, 0xf5, 0x00, 0xfd, 0x40, 0x3e, 0x40, 0x0b, - 0x96, 0x93, 0xe4, 0x00, 0xf9, 0x40, 0x3e, 0x50, - 0x0f, 0x94, 0x03, 0xe4, 0x08, 0xf9, 0x40, 0x3f, - 0x40, 0x05, 0x94, 0x03, 0xf4, 0x00, 0xf5, 0x42, - 0x3f, 0x40, 0x0e, 0xd0, 0x03, 0xe5, 0x00, 0xd9, - 0x40, 0x3a, 0x40, 0x0f, 0x90, 0x03, 0xe6, 0x06, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x28, 0x3e, 0x48, 0x0f, 0x90, - 0x13, 0xe4, 0x04, 0xf9, 0x00, 0x26, 0x4c, 0x0e, - 0x92, 0x83, 0xf4, 0x02, 0xc5, 0x02, 0x3d, 0x40, - 0x0c, 0xd0, 0x03, 0x34, 0x80, 0xf9, 0x28, 0x34, - 0x44, 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xcd, 0x00, - 0x33, 0xc1, 0x0b, 0xd0, 0x03, 0x74, 0xc0, 0xfd, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xc6, 0x05, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, - 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, 0x80, 0xed, - 0x09, 0x00, 0x25, 0x00, 0x02, 0xe0, 0x00, 0xb8, - 0x20, 0x2e, 0x04, 0x0b, 0x84, 0x02, 0xe0, 0x00, - 0xbc, 0x10, 0x22, 0x0c, 0x08, 0x80, 0x82, 0xe0, - 0x10, 0x88, 0x40, 0x2e, 0x00, 0x8c, 0x81, 0x02, - 0xa0, 0x40, 0xb8, 0x20, 0x22, 0x08, 0x0b, 0x84, - 0x02, 0xe0, 0x10, 0xd8, 0x11, 0x36, 0x00, 0x0b, - 0x80, 0x42, 0xe0, 0xd0, 0xb8, 0x40, 0x2e, 0x00, - 0x0b, 0x80, 0x02, 0xce, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x05, 0xc4, 0x00, 0xb1, 0x00, - 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, - 0x28, 0x2d, 0x60, 0x09, 0x59, 0x02, 0xd6, 0x40, - 0xb5, 0x00, 0x24, 0x48, 0x0a, 0x12, 0x02, 0xc4, - 0x40, 0x81, 0x10, 0x2c, 0x44, 0x09, 0x10, 0x12, - 0x04, 0x00, 0xb1, 0x28, 0x2c, 0x48, 0x09, 0x11, - 0x42, 0xc4, 0x00, 0x91, 0x00, 0x28, 0x40, 0x09, - 0x10, 0x02, 0xc4, 0x80, 0xb1, 0x10, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x02, 0x2e, 0x40, 0x8b, 0xd0, 0x02, 0xf4, 0x00, - 0xbd, 0x00, 0x02, 0x40, 0x08, 0x90, 0x02, 0xe4, - 0x00, 0xab, 0x02, 0x2e, 0x40, 0x28, 0x90, 0x02, - 0xa4, 0x00, 0xb9, 0x02, 0x2a, 0x48, 0x0b, 0x90, - 0x42, 0xec, 0x40, 0x9b, 0x04, 0x2e, 0x46, 0x0b, - 0x90, 0x02, 0xe4, 0x04, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xc6, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0b, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x54, 0x0d, 0x94, 0x03, 0xe5, 0x00, - 0xf9, 0x22, 0x36, 0x40, 0x0e, 0x90, 0x03, 0xe4, - 0x08, 0xc9, 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x0b, - 0x24, 0x00, 0xf9, 0x00, 0x3e, 0x78, 0x09, 0x90, - 0x03, 0xe4, 0xed, 0x09, 0x00, 0x26, 0x00, 0x00, - 0xd9, 0xda, 0x3a, 0x40, 0x1d, 0x91, 0x03, 0xe4, - 0x09, 0xf9, 0x00, 0x1e, 0x40, 0x07, 0x90, 0x03, - 0xe8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x01, 0xa4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x92, 0x03, 0xe4, 0x80, 0xf9, 0x20, 0x36, - 0x40, 0x4f, 0x90, 0x03, 0xe4, 0x02, 0x99, 0x00, - 0x3c, 0x42, 0x0e, 0x90, 0x03, 0x64, 0x00, 0xf9, - 0x00, 0x32, 0x40, 0x5f, 0x90, 0x42, 0xe6, 0x20, - 0xf9, 0x00, 0x36, 0x40, 0x0f, 0x98, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x10, 0xa0, 0x00, 0xe8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x32, 0x01, - 0x0f, 0x80, 0x43, 0x60, 0x00, 0xc8, 0x00, 0x3c, - 0x00, 0x0f, 0x80, 0x03, 0xa2, 0x00, 0xd8, 0x00, - 0x32, 0x00, 0x0c, 0x80, 0x03, 0x20, 0x00, 0xd0, - 0x00, 0x3a, 0x00, 0x4f, 0x81, 0x03, 0xe0, 0x00, - 0xf8, 0x08, 0x3a, 0x34, 0x0f, 0x80, 0x13, 0x20, - 0x42, 0xc8, 0x02, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xca, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x05, 0x28, 0x00, 0xba, 0x00, 0x2e, 0x80, 0x0b, - 0xa0, 0x02, 0xe8, 0x00, 0xba, 0x00, 0x22, 0x80, - 0x0b, 0xa0, 0x03, 0x29, 0x40, 0x82, 0x00, 0x26, - 0x80, 0x0b, 0xa0, 0x03, 0x99, 0x02, 0x0e, 0x40, - 0x2b, 0x90, 0x08, 0x60, 0x02, 0xaa, 0x00, 0xaa, - 0x00, 0x2a, 0x81, 0x0a, 0xec, 0x03, 0x99, 0x80, - 0xb6, 0x48, 0x23, 0x90, 0x0b, 0xe8, 0x02, 0xb8, - 0x00, 0x8a, 0xa0, 0x2e, 0x80, 0x0b, 0xa0, 0x02, - 0x4a, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x05, 0x4c, 0x00, 0xa3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0xed, 0x09, 0x00, - 0x27, 0x00, 0x00, 0xa0, 0xc0, 0x0a, 0x38, 0x02, - 0x0f, 0x00, 0x83, 0x00, 0x24, 0xc0, 0x0b, 0x30, - 0x02, 0x88, 0x00, 0x83, 0x48, 0x28, 0xe0, 0x08, - 0x39, 0x02, 0x8c, 0x00, 0x93, 0x00, 0x28, 0xc0, - 0x00, 0x30, 0x82, 0x0d, 0x00, 0xb3, 0xc0, 0x68, - 0xc0, 0x0b, 0x30, 0x02, 0x0f, 0x24, 0x03, 0x80, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xca, 0x04, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1c, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0x80, 0x21, 0xc0, 0x0b, 0x7c, 0x02, - 0x1f, 0x00, 0x87, 0x00, 0x6d, 0xc0, 0x0b, 0x70, - 0x02, 0x90, 0x00, 0x87, 0x88, 0x29, 0xc2, 0x08, - 0x70, 0x02, 0x8f, 0x00, 0x13, 0x20, 0x2b, 0xe0, - 0x0a, 0x70, 0x12, 0x9c, 0x00, 0x93, 0x01, 0x29, - 0xc0, 0x1b, 0x7c, 0x02, 0x8e, 0x00, 0x87, 0x00, - 0x2d, 0xc0, 0x4b, 0x70, 0x02, 0xe8, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x00, - 0xe7, 0x80, 0x2d, 0xe0, 0x0f, 0x78, 0x03, 0xde, - 0x00, 0xff, 0x80, 0x21, 0xa0, 0x0f, 0x28, 0x0b, - 0x0e, 0x02, 0xc6, 0x80, 0x3d, 0xe0, 0x0f, 0x7f, - 0x03, 0x82, 0x00, 0xd7, 0x82, 0x29, 0xe0, 0x2c, - 0x38, 0x03, 0x9e, 0x00, 0xd7, 0xb4, 0x39, 0xf2, - 0x0f, 0x78, 0x03, 0x9e, 0x00, 0xf7, 0x80, 0x39, - 0xe0, 0x0b, 0x78, 0x03, 0x1e, 0x10, 0xc7, 0x80, - 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0xea, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, 0xac, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x30, 0x3e, 0x80, 0x03, 0xa0, 0x03, - 0xac, 0x00, 0xfa, 0x00, 0x36, 0xc4, 0x0f, 0xb0, - 0x03, 0xe0, 0x04, 0x5b, 0x02, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xeb, 0x10, 0x36, 0xd0, - 0x0f, 0xb0, 0x03, 0xac, 0x00, 0xfb, 0x04, 0x36, - 0xed, 0x09, 0x00, 0x28, 0x00, 0x80, 0x5f, 0x10, - 0x03, 0xe8, 0x00, 0xf9, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0x42, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0xfe, 0x00, 0xff, 0x80, 0x3f, - 0xe0, 0x0f, 0xf8, 0x03, 0xfe, 0x00, 0xff, 0xc0, - 0x73, 0xe4, 0x0e, 0xd2, 0x43, 0xb2, 0x00, 0xf7, - 0x80, 0x13, 0xe0, 0x0c, 0xf8, 0x03, 0xba, 0x00, - 0x7e, 0xa0, 0x3f, 0xe0, 0x0c, 0xf8, 0x03, 0x3c, - 0x80, 0xdf, 0x80, 0x39, 0xe0, 0x2c, 0x78, 0x03, - 0x7e, 0x40, 0xe7, 0x80, 0x3b, 0xa0, 0x8f, 0xf8, - 0x03, 0xbe, 0x00, 0xc7, 0x80, 0x33, 0xe0, 0x0f, - 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0xa1, 0xc0, 0x0d, 0x52, 0x02, 0x10, 0x00, 0xb7, - 0x00, 0x35, 0xc0, 0x08, 0x70, 0x03, 0x50, 0x40, - 0xb4, 0x00, 0x2d, 0xc8, 0x0a, 0x52, 0x0a, 0x14, - 0x40, 0xdf, 0x12, 0x21, 0xc0, 0x0d, 0x60, 0x03, - 0x58, 0x00, 0xd7, 0x00, 0x3d, 0x80, 0x4b, 0x72, - 0x03, 0x9c, 0x40, 0xa7, 0x00, 0x29, 0xc0, 0x0f, - 0x70, 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb3, 0x00, - 0x20, 0x80, 0x4a, 0x01, 0x22, 0x90, 0x00, 0xbe, - 0x00, 0x20, 0xc0, 0x08, 0x70, 0x02, 0x90, 0x00, - 0xb6, 0x22, 0x2d, 0x00, 0x00, 0x70, 0x40, 0x0c, - 0x02, 0x87, 0x00, 0x2b, 0xc0, 0x0a, 0x50, 0x02, - 0x34, 0x08, 0x9d, 0x10, 0x21, 0x00, 0x0b, 0x70, - 0x22, 0x5c, 0x00, 0x87, 0x00, 0x29, 0xc0, 0x0b, - 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x14, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x20, 0x92, 0x08, 0xed, 0x09, 0x00, 0x29, 0x00, - 0x02, 0x02, 0x00, 0x80, 0xb2, 0x00, 0x24, 0xc0, - 0x28, 0xb0, 0x02, 0x00, 0x00, 0xb0, 0x00, 0x2c, - 0x00, 0x08, 0x10, 0x02, 0x04, 0x00, 0x83, 0x00, - 0x20, 0xe2, 0x0a, 0x00, 0x02, 0x42, 0x08, 0x91, - 0xa0, 0x24, 0x39, 0x0b, 0x18, 0x02, 0x84, 0x00, - 0xa1, 0x00, 0x28, 0xc0, 0x0a, 0x30, 0x02, 0x88, - 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, - 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xff, 0x00, 0x32, 0x60, 0x0a, - 0xb8, 0x03, 0xae, 0x00, 0xf9, 0x80, 0x33, 0xc0, - 0x0c, 0xf0, 0x02, 0xa4, 0x00, 0xfb, 0x00, 0x3c, - 0x00, 0x0c, 0xb0, 0x03, 0x0c, 0x00, 0x8f, 0x00, - 0x3b, 0xc2, 0x0a, 0xb0, 0x03, 0x2e, 0x00, 0x9b, - 0x48, 0x20, 0xa8, 0x9f, 0xb8, 0x25, 0xe0, 0x00, - 0xcb, 0x00, 0x3a, 0xc0, 0x0b, 0xb0, 0x02, 0xea, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3c, 0x60, 0x0f, - 0xb8, 0x03, 0xee, 0x00, 0xf9, 0x80, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xe0, 0x00, 0xfa, 0x40, 0x3e, - 0x00, 0x2f, 0xa0, 0x07, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0d, 0x90, 0x03, 0xe4, 0x40, 0xf9, - 0x00, 0x2e, 0x80, 0x4f, 0xb5, 0x03, 0xe0, 0x00, - 0xf3, 0x00, 0x1e, 0xc0, 0x0f, 0xb0, 0x03, 0x60, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x04, 0x0c, - 0x60, 0x03, 0x3c, 0x00, 0xfc, 0x80, 0x3f, 0xc0, - 0x0f, 0xb0, 0x03, 0x36, 0x00, 0xf5, 0xc0, 0x36, - 0x05, 0x4e, 0x94, 0x23, 0x36, 0x08, 0xd7, 0x00, - 0x37, 0xc0, 0x0c, 0xf0, 0x03, 0x78, 0x40, 0xef, - 0x80, 0x3f, 0xa0, 0x0c, 0xec, 0x03, 0xed, 0x09, - 0x00, 0x2a, 0x00, 0x24, 0x00, 0xdf, 0x00, 0x33, - 0xc0, 0x05, 0xf0, 0x03, 0xc0, 0x44, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x2e, 0x00, 0x08, 0xa0, 0x02, 0xac, - 0x00, 0xb8, 0x80, 0x26, 0xc0, 0x09, 0xb0, 0x02, - 0xa2, 0x60, 0xb8, 0x81, 0x22, 0x32, 0x2a, 0x04, - 0xd2, 0x24, 0x00, 0xab, 0x00, 0x2a, 0xc0, 0x0a, - 0x10, 0x02, 0x23, 0x00, 0xb9, 0x40, 0x2e, 0xa6, - 0x08, 0x04, 0x82, 0x23, 0x04, 0x99, 0x90, 0x22, - 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x40, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x2e, 0x40, 0x08, 0x90, 0x02, 0x60, - 0x00, 0xb9, 0x20, 0x2a, 0xc0, 0x0b, 0xb0, 0x02, - 0x20, 0x00, 0xba, 0x00, 0x26, 0x00, 0x48, 0xb0, - 0x02, 0x2c, 0x80, 0x9b, 0x00, 0x24, 0xc0, 0x08, - 0xb1, 0x02, 0x2c, 0x00, 0xba, 0x10, 0x2e, 0x80, - 0x08, 0x90, 0x02, 0x22, 0x24, 0xb9, 0x00, 0x22, - 0xc0, 0x09, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0x40, 0x28, 0x10, 0x02, 0xc0, - 0x00, 0xb1, 0x00, 0x24, 0xc0, 0x09, 0x30, 0x02, - 0x80, 0x00, 0xb0, 0x00, 0x20, 0x00, 0x0a, 0x00, - 0x0a, 0x84, 0x00, 0x83, 0x00, 0x20, 0xc0, 0x08, - 0x00, 0x0a, 0x40, 0x00, 0xb0, 0x04, 0x2e, 0x00, - 0x18, 0x90, 0x02, 0x80, 0x00, 0x91, 0x00, 0xa0, - 0xc0, 0x0b, 0x30, 0x00, 0xc2, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xff, 0x00, 0x3e, 0x00, 0x0c, 0x80, 0x03, 0x60, - 0x00, 0xed, 0x09, 0x00, 0x2b, 0x00, 0xf8, 0x00, - 0x3a, 0xc0, 0x0f, 0xf0, 0x03, 0x24, 0x00, 0xf8, - 0x00, 0x36, 0x00, 0x0c, 0x90, 0x03, 0x24, 0x08, - 0xdf, 0x00, 0x37, 0xc0, 0x0c, 0x90, 0x03, 0x60, - 0x00, 0xf8, 0x00, 0x3e, 0x01, 0x0c, 0x80, 0x0b, - 0x24, 0x00, 0xd9, 0x00, 0x32, 0xc0, 0x0d, 0xb0, - 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x0d, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0x00, 0x0f, 0xc0, 0x03, 0xb0, 0x00, 0xfc, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x02, 0xf0, 0x00, 0xfc, - 0x02, 0x3f, 0x00, 0x0d, 0xc0, 0x03, 0x74, 0x00, - 0xef, 0x00, 0x3f, 0xc0, 0x0f, 0xc0, 0x13, 0x90, - 0x00, 0x7c, 0x02, 0x0f, 0x00, 0x07, 0x40, 0x03, - 0x74, 0x00, 0xdd, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x05, 0xfc, 0x00, 0xdf, 0x00, 0x3f, 0x40, - 0x0c, 0xd0, 0x03, 0x7c, 0x00, 0xcd, 0x00, 0x3f, - 0x22, 0x0e, 0xf4, 0x03, 0x3d, 0x80, 0xcf, 0x00, - 0x37, 0x00, 0x0c, 0xf0, 0x03, 0xf5, 0x10, 0xed, - 0x00, 0x3b, 0xda, 0x0c, 0xf0, 0x03, 0xfc, 0x80, - 0xcc, 0x00, 0xb3, 0x40, 0x0d, 0x70, 0x03, 0xfc, - 0x00, 0xfc, 0x40, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xef, 0x00, 0x3f, 0xd0, 0x0f, 0xf0, - 0x03, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0x56, - 0x28, 0xb2, 0x82, 0x2e, 0xa0, 0x8b, 0x00, 0x2e, - 0x00, 0x48, 0xb8, 0x02, 0x29, 0x80, 0x8b, 0x40, - 0x2e, 0xc0, 0x0d, 0xf4, 0x02, 0xec, 0x00, 0x8b, - 0x00, 0x21, 0xf0, 0x08, 0xf4, 0x02, 0xfd, 0x00, - 0xa9, 0x00, 0x22, 0x00, 0x0a, 0x90, 0x02, 0xed, - 0x40, 0xba, 0x20, 0x2e, 0xc0, 0x0b, 0xb0, 0x12, - 0xec, 0x00, 0xbb, 0x00, 0xed, 0x09, 0x00, 0x2c, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0x89, 0x28, 0x90, 0x02, - 0x4c, 0x80, 0x83, 0x00, 0x2c, 0x20, 0x08, 0x30, - 0x02, 0x8f, 0x00, 0x82, 0x40, 0x2e, 0xc0, 0x08, - 0x34, 0x02, 0xec, 0x80, 0x83, 0x00, 0x28, 0xc8, - 0x08, 0x34, 0x02, 0x4c, 0x40, 0xa0, 0x00, 0xa0, - 0x00, 0x4a, 0x30, 0x02, 0xcc, 0x10, 0xb2, 0x20, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0x0c, 0x00, 0xb3, - 0x00, 0x2c, 0xc8, 0x0b, 0x30, 0x02, 0xe2, 0x01, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xac, - 0x00, 0xbb, 0x00, 0x2e, 0x82, 0x08, 0xb2, 0x02, - 0x2c, 0x02, 0x89, 0x00, 0x2e, 0x00, 0x08, 0x30, - 0x02, 0xac, 0x08, 0x8b, 0x88, 0x2e, 0xc8, 0x09, - 0xb0, 0x02, 0xee, 0x06, 0x8b, 0x00, 0x22, 0xc0, - 0x08, 0xb0, 0x02, 0xec, 0x04, 0xa8, 0x80, 0xa2, - 0x30, 0x0a, 0xb0, 0x02, 0xec, 0x00, 0xba, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xf0, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xec, - 0x00, 0xdb, 0x00, 0x3e, 0x94, 0x0c, 0x92, 0x0b, - 0x4c, 0x00, 0xcb, 0x80, 0x3e, 0x80, 0x0e, 0xb0, - 0x07, 0xa6, 0x00, 0xcb, 0xc4, 0x3e, 0xd0, 0x4c, - 0xb0, 0x03, 0xcc, 0x00, 0xeb, 0x90, 0x3a, 0xc0, - 0x0c, 0xb0, 0x01, 0x6c, 0x00, 0x69, 0xa0, 0x22, - 0x10, 0x0d, 0xb9, 0x83, 0xec, 0x04, 0xfb, 0x02, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xeb, - 0x00, 0x3e, 0xc0, 0x07, 0xb0, 0x03, 0xd0, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xbc, - 0x00, 0xff, 0x00, 0x3e, 0xa0, 0x0f, 0xf8, 0x83, - 0xfc, 0x20, 0xff, 0x90, 0x3d, 0x80, 0x0f, 0xf0, - 0x03, 0x5e, 0x40, 0xff, 0x00, 0x3f, 0x40, 0xed, - 0x09, 0x00, 0x2d, 0x00, 0x0b, 0xf0, 0x23, 0xfc, - 0x00, 0xfd, 0x81, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xf9, 0x00, 0x35, 0x40, 0xcf, 0xe0, - 0x03, 0xfc, 0x00, 0xbf, 0x00, 0x3f, 0xc1, 0x8f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x10, 0xac, 0x00, 0xfb, 0x00, - 0x7e, 0xc4, 0x0c, 0x90, 0x0b, 0x2c, 0x00, 0xfb, - 0x00, 0x3f, 0x00, 0x0c, 0xb0, 0x03, 0x2c, 0x00, - 0xeb, 0x44, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xe4, - 0x02, 0xeb, 0x00, 0xb2, 0xe0, 0x0c, 0xb0, 0x0b, - 0xae, 0x00, 0xf9, 0x01, 0x36, 0x18, 0x2e, 0xb4, - 0x83, 0x6c, 0x00, 0xfa, 0x00, 0x32, 0xc0, 0x0f, - 0xb0, 0x03, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc6, - 0x0c, 0xb0, 0x03, 0xd0, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x00, 0xbb, 0x00, - 0x2e, 0xd0, 0x08, 0x34, 0x02, 0x2d, 0x01, 0xbb, - 0x50, 0x2e, 0x21, 0x08, 0xb8, 0x03, 0x6c, 0x10, - 0x8b, 0x20, 0x24, 0xc3, 0x0e, 0xfa, 0x02, 0xec, - 0x00, 0x8b, 0x50, 0x3f, 0xc0, 0x08, 0xf8, 0x02, - 0x1c, 0x00, 0xb9, 0x80, 0x22, 0x70, 0x08, 0xbc, - 0x02, 0x3c, 0x00, 0xba, 0x20, 0x37, 0xc0, 0x0b, - 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xd0, - 0x28, 0xb0, 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x05, 0x4c, 0x00, 0xb3, 0x00, - 0x2e, 0x72, 0x28, 0x30, 0x02, 0x8d, 0x00, 0xb3, - 0xc0, 0x2c, 0x44, 0x08, 0x31, 0x00, 0x0c, 0x20, - 0x91, 0x00, 0x2c, 0xe0, 0x0b, 0x30, 0x16, 0xcc, - 0x00, 0x8b, 0x40, 0x22, 0xc1, 0x08, 0x30, 0x42, - 0x0c, 0x00, 0x3a, 0x00, 0xa0, 0x70, 0x89, 0x3c, - 0x02, 0x4c, 0x00, 0xb0, 0x48, 0x28, 0xc8, 0x0b, - 0x30, 0x02, 0x8c, 0x00, 0xa3, 0x00, 0x28, 0xe0, - 0x0a, 0x30, 0xed, 0x09, 0x00, 0x2e, 0x00, 0x02, - 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x01, 0x1e, 0x00, 0xb7, 0x80, 0x2d, 0x60, 0x28, - 0x78, 0x02, 0x9e, 0x01, 0xb7, 0x80, 0x2c, 0x60, - 0x08, 0x7c, 0x42, 0x0e, 0xe0, 0x87, 0x84, 0x25, - 0xe0, 0x1a, 0x78, 0x42, 0xd6, 0x00, 0x87, 0x88, - 0xad, 0xe0, 0x08, 0x38, 0x82, 0x1e, 0x00, 0xb5, - 0xc0, 0x20, 0x20, 0x28, 0x78, 0x82, 0x1e, 0x00, - 0x96, 0x84, 0x2d, 0xe6, 0x0b, 0x78, 0x02, 0xde, - 0x00, 0x37, 0x80, 0x2d, 0xe0, 0x1a, 0x78, 0x06, - 0xc8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x08, 0x0c, 0x00, 0xf3, 0x00, 0x2c, 0x40, 0x0c, - 0xb0, 0x03, 0x8c, 0x00, 0xb3, 0x08, 0x3c, 0x40, - 0x0c, 0xb0, 0x02, 0x0c, 0xc0, 0xe1, 0x00, 0x3c, - 0x40, 0x0f, 0x30, 0x03, 0xec, 0x00, 0xc1, 0x00, - 0x30, 0xc0, 0x0c, 0x30, 0x02, 0x0c, 0x00, 0xf0, - 0x08, 0x30, 0x82, 0x0f, 0x30, 0x03, 0x4c, 0x00, - 0xfa, 0x10, 0x38, 0xc0, 0x0f, 0x30, 0x03, 0x8c, - 0x00, 0xf3, 0x00, 0x3e, 0xc4, 0x0e, 0x30, 0x03, - 0xd2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x1d, 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x6f, - 0xe1, 0x03, 0x7c, 0x00, 0xff, 0x10, 0x3f, 0x40, - 0x0f, 0xf0, 0x03, 0xfc, 0xc0, 0xff, 0x10, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xd7, 0x00, - 0x27, 0xd0, 0x0f, 0xf0, 0x83, 0xfd, 0x20, 0xfd, - 0x00, 0xbb, 0x00, 0x0f, 0xf1, 0x03, 0xfc, 0x20, - 0xfe, 0x04, 0x37, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0d, 0xf0, 0x03, - 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x05, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0x40, 0x1c, - 0x38, 0x23, 0x2c, 0x00, 0xf9, 0x00, 0x3f, 0x80, - 0x0f, 0xb0, 0x03, 0x6c, 0x00, 0xc9, 0x00, 0x3c, - 0xc0, 0x0c, 0xb0, 0x03, 0xec, 0xed, 0x09, 0x00, - 0x2f, 0x00, 0x00, 0xfb, 0x00, 0x3e, 0xc8, 0x0c, - 0xb4, 0x03, 0xac, 0x80, 0xfb, 0x00, 0x72, 0xc0, - 0x4c, 0x30, 0x03, 0xbc, 0x00, 0xfb, 0x00, 0x3e, - 0xc4, 0x2c, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xea, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0x2d, 0x70, 0x02, 0x1c, - 0x00, 0xb7, 0x00, 0x2d, 0x80, 0x8b, 0x70, 0x02, - 0xfc, 0x14, 0x87, 0x01, 0x2d, 0xc1, 0x0a, 0x75, - 0x12, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x08, - 0x73, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x20, 0xc0, - 0x0a, 0x70, 0x02, 0x1c, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x04, - 0x3d, 0xc0, 0x0b, 0x70, 0x02, 0xd2, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, 0x00, - 0xa7, 0x80, 0x2d, 0x60, 0x18, 0xf8, 0x02, 0x1e, - 0x00, 0xb7, 0x80, 0x2d, 0x20, 0x0b, 0x78, 0x02, - 0x5e, 0x00, 0x85, 0x80, 0x2f, 0xe0, 0x0a, 0x7a, - 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe4, 0x08, - 0x78, 0x02, 0xde, 0x80, 0x93, 0x80, 0x29, 0xe1, - 0x28, 0x78, 0x02, 0x9e, 0x80, 0xb6, 0xc0, 0x2d, - 0xe8, 0x09, 0x78, 0x02, 0x5e, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xf0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0xd0, 0x09, 0x30, 0x02, 0x2c, - 0x00, 0xb1, 0x00, 0x2c, 0x10, 0x0b, 0x30, 0x02, - 0xcd, 0x04, 0x83, 0x00, 0x2c, 0x60, 0x28, 0x30, - 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x2e, 0xc0, 0x08, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x80, 0x20, 0xe2, - 0x0a, 0x3c, 0x82, 0x0c, 0x08, 0xb2, 0xc0, 0x2e, - 0xc0, 0x09, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc1, 0x0b, 0x30, 0x02, 0xd2, 0x04, 0x30, - 0xed, 0x09, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xe8, 0x15, 0xa8, 0x00, 0xea, 0x00, 0x2f, - 0x98, 0x0c, 0xe4, 0x0b, 0x28, 0x00, 0xfa, 0xa0, - 0x3f, 0x94, 0x0f, 0xa0, 0x03, 0x79, 0x40, 0xce, - 0x40, 0x3d, 0xb0, 0x0c, 0xa0, 0x03, 0xe8, 0x00, - 0xfa, 0xa0, 0x3e, 0x80, 0x0c, 0xa0, 0x03, 0xe8, - 0x00, 0xfe, 0xa0, 0x33, 0x80, 0x0c, 0xee, 0x0b, - 0xa8, 0x00, 0xfe, 0x00, 0x3e, 0x80, 0x0d, 0xa0, - 0x03, 0xe8, 0x00, 0xfa, 0x00, 0x2e, 0x80, 0x0f, - 0xa0, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x02, 0x0f, 0x88, 0x03, 0xe0, 0x10, 0xf8, 0x01, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x46, 0xf8, - 0x20, 0x3e, 0x24, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x2f, 0x80, 0x03, 0xe0, - 0x00, 0xd8, 0xc0, 0xbe, 0x04, 0x0f, 0x04, 0x03, - 0xe0, 0x00, 0xf8, 0x08, 0x3e, 0x00, 0x0e, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3a, 0x10, 0x0f, - 0x80, 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x00, 0x3c, - 0x40, 0x0c, 0x92, 0x03, 0xe4, 0x00, 0xc9, 0xa0, - 0x3c, 0x60, 0x0c, 0x90, 0x03, 0xc5, 0x08, 0xc9, - 0xa0, 0x3e, 0x60, 0x0e, 0x10, 0x03, 0x24, 0x00, - 0xf9, 0xa0, 0x3e, 0x40, 0x0c, 0x9a, 0x03, 0xc4, - 0x00, 0xc1, 0x40, 0x32, 0x48, 0x0c, 0x9c, 0x02, - 0x64, 0x00, 0xb9, 0x00, 0x3e, 0x50, 0x28, 0x90, - 0x03, 0xe4, 0x00, 0xd9, 0x00, 0x3e, 0x60, 0x0f, - 0x90, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x04, 0x64, 0x00, 0xb9, 0x00, 0x2e, - 0x68, 0x28, 0x92, 0x02, 0xe5, 0x00, 0xd9, 0x40, - 0x2e, 0x44, 0x28, 0x90, 0x12, 0xe5, 0x80, 0x89, - 0x80, 0x2e, 0x60, 0x28, 0x90, 0x02, 0x24, 0x00, - 0xb9, 0x40, 0x26, 0xed, 0x09, 0x00, 0x31, 0x00, - 0x40, 0x08, 0x98, 0x02, 0xe4, 0x00, 0x89, 0xc0, - 0x22, 0x40, 0x08, 0x98, 0x02, 0xa4, 0x00, 0xb9, - 0x80, 0x2e, 0x40, 0x08, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x2e, 0x7c, 0x09, 0x90, 0x02, 0xe0, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, - 0x24, 0x00, 0xb9, 0x00, 0x6e, 0x48, 0x08, 0x90, - 0x02, 0xe5, 0x00, 0xa9, 0x00, 0x2e, 0x40, 0x08, - 0x90, 0x02, 0xe4, 0x00, 0x89, 0x01, 0x2e, 0xc4, - 0x08, 0x92, 0x02, 0x24, 0x00, 0xb9, 0x00, 0x26, - 0x40, 0x08, 0x90, 0x02, 0x66, 0x02, 0x89, 0x08, - 0x00, 0x40, 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x88, 0x2e, 0x40, 0x0a, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xc6, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x04, 0x00, 0xb1, 0x00, 0x2c, 0x50, 0x28, 0x14, - 0x02, 0xc4, 0x00, 0x91, 0x80, 0x2c, 0x48, 0x08, - 0x10, 0x02, 0x45, 0x00, 0x81, 0x00, 0x2e, 0x40, - 0x08, 0x10, 0x02, 0x05, 0x00, 0xb1, 0x80, 0x24, - 0x6a, 0x08, 0x12, 0x82, 0xc4, 0xa0, 0x81, 0x40, - 0x20, 0x70, 0x08, 0x10, 0x02, 0x84, 0xa0, 0xb1, - 0x44, 0x2c, 0x50, 0x08, 0x10, 0x00, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x50, 0x09, 0x10, 0x02, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, - 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0c, 0x80, - 0x03, 0xe1, 0x40, 0xe8, 0x00, 0x3e, 0x00, 0x0c, - 0x85, 0x03, 0xe0, 0x00, 0xc8, 0x00, 0x3e, 0x00, - 0x0c, 0x80, 0x0b, 0x20, 0x00, 0xf8, 0x50, 0x34, - 0x1c, 0x0c, 0x82, 0x03, 0x60, 0x80, 0xc8, 0x00, - 0xb2, 0x00, 0x4c, 0xa0, 0x03, 0xe0, 0x80, 0xf8, - 0x00, 0x3c, 0x80, 0x0e, 0x80, 0x03, 0xe0, 0x00, - 0xd8, 0x01, 0x7e, 0x01, 0x8f, 0x80, 0x03, 0xee, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x32, 0x00, 0x98, 0x1d, 0xe4, 0x00, 0xf9, - 0x00, 0x3d, 0x50, 0x0f, 0xd0, 0x03, 0xe4, 0x04, - 0xfd, 0x00, 0x3f, 0x44, 0x0f, 0x90, 0x03, 0xf5, - 0x06, 0xfd, 0x40, 0x3f, 0x40, 0x0d, 0x94, 0x03, - 0xf4, 0x00, 0xfd, 0x00, 0x3e, 0x40, 0x2f, 0x90, - 0x03, 0xe4, 0x00, 0xfd, 0x40, 0x3f, 0x50, 0x6f, - 0xd4, 0x03, 0xe4, 0x00, 0xfd, 0x00, 0x3e, 0x50, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x76, - 0x40, 0x0f, 0x90, 0x03, 0xe6, 0x06, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, 0x00, 0xf9, - 0x00, 0x3f, 0x42, 0x2c, 0xd0, 0x03, 0x34, 0x40, - 0xcd, 0x00, 0x3b, 0xc0, 0x0f, 0xd1, 0x03, 0xf5, - 0x80, 0xdd, 0x00, 0x13, 0x40, 0x0f, 0xd2, 0x03, - 0xed, 0x04, 0xfd, 0x10, 0x3f, 0x48, 0x0f, 0xd2, - 0x83, 0x34, 0x90, 0xbd, 0x20, 0x0b, 0x48, 0x0c, - 0xd2, 0x03, 0xa4, 0x90, 0xfd, 0x40, 0x37, 0x58, - 0x0c, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3f, - 0x40, 0x0f, 0x90, 0x03, 0xc6, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, 0x00, 0xb8, - 0x00, 0x2e, 0x18, 0x28, 0x82, 0x82, 0x20, 0x82, - 0x88, 0x00, 0x22, 0x00, 0x0b, 0x80, 0x02, 0xe0, - 0x00, 0x88, 0x51, 0x22, 0x00, 0x0e, 0x84, 0x03, - 0xe0, 0x80, 0xb8, 0x00, 0x26, 0x0a, 0x8b, 0x80, - 0x02, 0x20, 0x40, 0xb8, 0x68, 0x28, 0x9a, 0x0a, - 0x84, 0x02, 0x20, 0x00, 0xba, 0x20, 0x2c, 0x10, - 0x08, 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, - 0x0a, 0x0b, 0x80, 0x02, 0xce, 0x06, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x04, 0xc4, 0x00, 0xb1, - 0x00, 0x2c, 0x42, 0x38, 0x10, 0x22, 0x04, 0x80, - 0x81, 0x00, 0x28, 0x44, 0x0b, 0x10, 0x02, 0xc5, - 0x00, 0x83, 0x00, 0x68, 0x60, 0x0b, 0x11, 0x02, - 0xc4, 0x80, 0xb1, 0x00, 0x2c, 0x4c, 0x0b, 0x10, - 0x0a, 0xed, 0x09, 0x00, 0x33, 0x00, 0x04, 0x0c, - 0x91, 0x12, 0x24, 0x44, 0x28, 0x11, 0x02, 0x84, - 0x40, 0xb1, 0x00, 0x2c, 0x4c, 0x09, 0x10, 0x02, - 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, - 0x02, 0xc2, 0x01, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0xa4, 0x00, 0xb9, 0x01, 0x2e, 0x50, - 0x28, 0x10, 0x02, 0x24, 0x00, 0x89, 0x20, 0x22, - 0x44, 0x0b, 0x90, 0x02, 0x65, 0x14, 0x99, 0x08, - 0xaa, 0x40, 0x0a, 0x90, 0x02, 0xe4, 0x80, 0xb9, - 0x80, 0x26, 0x40, 0x0b, 0x90, 0x02, 0x24, 0x00, - 0xb9, 0x18, 0x22, 0x60, 0x2a, 0x94, 0x02, 0xa4, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x89, 0x90, 0x02, - 0xe4, 0x00, 0x39, 0x04, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xc6, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x05, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x60, - 0x0c, 0x92, 0x0b, 0x24, 0x00, 0xc1, 0x00, 0x2a, - 0x60, 0x0f, 0x90, 0x03, 0xe5, 0x06, 0xc9, 0x00, - 0x3a, 0x50, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x07, 0x24, 0x00, - 0xd9, 0x01, 0x3a, 0x70, 0x0c, 0x90, 0x03, 0xa4, - 0x00, 0xf9, 0x40, 0x36, 0x40, 0x2d, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x00, 0x3e, 0x50, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x04, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x40, 0xe9, 0x01, - 0x36, 0x70, 0x0f, 0x90, 0x23, 0xa6, 0x00, 0xf9, - 0x00, 0x36, 0x40, 0x0f, 0x10, 0x07, 0xe4, 0x00, - 0xf9, 0x80, 0xac, 0x40, 0x8f, 0x92, 0x03, 0x64, - 0x00, 0xf9, 0xc0, 0x2c, 0x42, 0x0e, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x00, 0xa0, 0x00, 0xed, 0x09, 0x00, 0x34, - 0x00, 0xf8, 0x00, 0x3c, 0x02, 0x0c, 0x8c, 0x03, - 0x20, 0x00, 0xf8, 0x80, 0x3e, 0x00, 0x0f, 0x81, - 0x03, 0xc0, 0x34, 0xf8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0x60, 0x00, 0xf8, 0x09, 0x3e, 0x00, - 0x2c, 0x80, 0x03, 0xe0, 0x10, 0x78, 0x08, 0x3e, - 0x11, 0x0c, 0x88, 0x03, 0x60, 0x00, 0xc8, 0x30, - 0x3e, 0x00, 0x2c, 0x80, 0x23, 0xe0, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xca, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x15, 0x28, - 0x00, 0xba, 0x00, 0x2f, 0xb0, 0x08, 0xe8, 0x02, - 0x3b, 0x60, 0xbe, 0x40, 0x2e, 0x88, 0x0b, 0xec, - 0x02, 0xfa, 0x20, 0xb2, 0x00, 0x2a, 0x80, 0x0b, - 0xa0, 0x82, 0x28, 0x00, 0xbe, 0x60, 0x2f, 0x80, - 0x08, 0xa0, 0x02, 0xea, 0x00, 0xbe, 0x61, 0x2f, - 0x94, 0x0a, 0x64, 0x00, 0x28, 0x00, 0x8e, 0xc0, - 0x2f, 0x91, 0x08, 0xa0, 0x02, 0xe8, 0x00, 0xba, - 0x00, 0x2f, 0x80, 0x0b, 0xa0, 0x02, 0xca, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x4c, - 0x00, 0xb3, 0x00, 0x2c, 0xe0, 0x09, 0x38, 0x02, - 0x24, 0x00, 0xb1, 0x10, 0x28, 0x40, 0x0b, 0x00, - 0x82, 0xcc, 0x00, 0xb1, 0x00, 0x2c, 0x60, 0x0b, - 0x10, 0x02, 0x0c, 0x01, 0xb3, 0x40, 0x2c, 0x00, - 0x08, 0x18, 0x02, 0xc6, 0x00, 0xbb, 0x00, 0x28, - 0xc0, 0x09, 0x10, 0x02, 0xcc, 0x00, 0x83, 0x80, - 0x2c, 0xc4, 0x1a, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xca, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1c, - 0x00, 0xb7, 0x00, 0x2d, 0xc2, 0x29, 0x70, 0x82, - 0x14, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x09, 0x40, - 0x02, 0xdc, 0x10, 0xbf, 0x00, 0x2d, 0xc2, 0x0b, - 0x78, 0x02, 0x1c, 0x80, 0xb7, 0x00, 0x2c, 0x20, - 0x08, 0x70, 0x82, 0xdd, 0x00, 0xb5, 0x02, 0xed, - 0x09, 0x00, 0x35, 0x00, 0x2d, 0x40, 0x09, 0x30, - 0x02, 0x8c, 0x00, 0x87, 0x00, 0x2d, 0xc0, 0x00, - 0x70, 0x02, 0xdc, 0x00, 0x37, 0x00, 0x2d, 0x00, - 0x0b, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x00, 0xf7, 0x80, - 0x3f, 0xa0, 0x0d, 0xf8, 0x0b, 0x16, 0x00, 0xf7, - 0x80, 0x3d, 0xe0, 0x0f, 0x48, 0x03, 0xde, 0x00, - 0xf7, 0x80, 0x3d, 0xe0, 0x0f, 0x78, 0x09, 0x5e, - 0x00, 0xf7, 0x80, 0x3d, 0x20, 0x0c, 0x78, 0x03, - 0xde, 0x00, 0xf7, 0x80, 0x3d, 0x20, 0x2d, 0x68, - 0x03, 0xdc, 0x00, 0xc7, 0x81, 0x3d, 0x80, 0x0e, - 0x78, 0x03, 0xde, 0x00, 0x77, 0x80, 0x3d, 0xe0, - 0x0f, 0x78, 0x03, 0xea, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x0d, 0xac, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0e, 0xb0, 0x13, 0xf4, 0x00, 0xbb, - 0x00, 0x3e, 0xc0, 0x0f, 0xc0, 0x13, 0xec, 0x00, - 0xf3, 0x04, 0x3a, 0xc0, 0x0f, 0x10, 0x03, 0xed, - 0xe0, 0xfb, 0x00, 0x3f, 0x00, 0x0f, 0x90, 0x01, - 0xec, 0x00, 0xf9, 0x00, 0x3e, 0x00, 0x0e, 0xa0, - 0x03, 0x6c, 0x08, 0xf9, 0x01, 0x3e, 0xc0, 0x2f, - 0xb0, 0x03, 0xec, 0x00, 0xdb, 0x00, 0x3e, 0x40, - 0x0b, 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xff, 0x80, - 0x3f, 0xe0, 0x0d, 0xf8, 0x03, 0x3a, 0x40, 0xff, - 0x90, 0x3d, 0xe0, 0x0c, 0xf8, 0x03, 0x3e, 0x48, - 0xcf, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0x7e, - 0x04, 0xf7, 0x81, 0x3b, 0x20, 0x0c, 0xf8, 0x03, - 0xfe, 0x00, 0xff, 0x80, 0x33, 0xe0, 0x8c, 0xd8, - 0x03, 0xfe, 0x00, 0xf5, 0x90, 0x33, 0xe0, 0x0f, - 0xf8, 0x03, 0xfe, 0x00, 0xff, 0x85, 0x3f, 0xe0, - 0x0f, 0xf8, 0x03, 0xc0, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x11, 0x9c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0xed, 0x09, 0x00, 0x36, 0x00, 0x08, - 0xf0, 0x42, 0x1c, 0x00, 0xb5, 0x44, 0x2d, 0x40, - 0x08, 0xc0, 0x02, 0x3d, 0x48, 0x87, 0x10, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0x1c, 0x00, 0xb7, 0x4c, - 0x21, 0x00, 0x08, 0x71, 0x13, 0xd4, 0x00, 0xb4, - 0x10, 0xa1, 0x40, 0x0a, 0x64, 0x02, 0xdc, 0x00, - 0xb6, 0x00, 0x21, 0x48, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0x00, 0x0b, 0x70, 0x02, - 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0x80, 0x09, - 0x50, 0x82, 0x1c, 0x04, 0xb7, 0x00, 0x2d, 0xc0, - 0x08, 0x70, 0x02, 0x1c, 0x00, 0x85, 0x08, 0x2d, - 0x42, 0x0b, 0x30, 0x02, 0x1c, 0x00, 0xb7, 0x10, - 0x28, 0x00, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x21, 0x00, 0x2a, 0x60, 0x02, 0xdc, 0x00, - 0xbd, 0x00, 0x61, 0x40, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x14, 0xcc, 0x00, 0xb3, 0x00, 0x2e, 0xc0, 0x08, - 0x0c, 0x02, 0x08, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x08, 0x00, 0x02, 0x0a, 0x10, 0x83, 0xe0, 0x2c, - 0xd0, 0x0b, 0x30, 0x22, 0x0e, 0x00, 0xb3, 0x00, - 0x20, 0x00, 0x08, 0x30, 0x02, 0x8c, 0x00, 0xbb, - 0x89, 0x20, 0x00, 0x0a, 0x2c, 0x02, 0xcc, 0x08, - 0xb1, 0x00, 0x62, 0x40, 0x0b, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0x40, 0x0b, 0x30, 0x02, - 0xc8, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x15, 0xac, 0x00, 0xfb, 0x00, 0x2e, 0xa0, 0x2d, - 0xb8, 0x0a, 0x24, 0x00, 0xfb, 0xa0, 0x3e, 0xc0, - 0x2c, 0x80, 0x43, 0x2c, 0x22, 0xcb, 0xc4, 0x2e, - 0xf0, 0x0f, 0xb0, 0x0b, 0x3e, 0x80, 0xfb, 0x80, - 0x3a, 0xc0, 0x2c, 0x30, 0x02, 0xec, 0x00, 0xf9, - 0xe0, 0x32, 0xc0, 0x0c, 0xb8, 0xed, 0x09, 0x00, - 0x37, 0x00, 0xa2, 0xec, 0x00, 0xfa, 0x80, 0xa2, - 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x13, 0xea, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0x30, 0x0f, 0xb0, 0x03, 0xe4, - 0x00, 0xfb, 0x40, 0x3c, 0xc0, 0x0f, 0xc0, 0x03, - 0xec, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0xb0, - 0x03, 0xac, 0x00, 0xfb, 0x00, 0x3f, 0x40, 0x0f, - 0xb0, 0x03, 0xcc, 0x00, 0xf8, 0x00, 0x3e, 0x62, - 0x2d, 0xb4, 0x83, 0xec, 0x00, 0xf8, 0x50, 0x3e, - 0xd0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0x90, 0x07, 0xb0, 0x03, 0xe0, 0x10, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, 0x00, - 0xff, 0x00, 0x3e, 0x80, 0x0c, 0xc0, 0x83, 0x34, - 0x00, 0xfd, 0x00, 0x3f, 0x40, 0x0c, 0xc0, 0x03, - 0x3e, 0x20, 0xd7, 0x00, 0x33, 0xc2, 0x0f, 0xf0, - 0x03, 0xfc, 0x04, 0xcf, 0x01, 0x3f, 0x80, 0x0f, - 0xf9, 0x03, 0x34, 0x40, 0x49, 0x00, 0x33, 0x00, - 0x2c, 0xe8, 0x03, 0xfc, 0x04, 0xfe, 0x00, 0x3f, - 0xc0, 0x0c, 0xf0, 0x03, 0x7c, 0x00, 0xff, 0x00, - 0x3f, 0x24, 0x0c, 0xf0, 0x03, 0xc0, 0x40, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, - 0xbb, 0x00, 0x2e, 0x20, 0x28, 0x80, 0x12, 0x24, - 0x00, 0xbb, 0xd2, 0x2e, 0xc0, 0x28, 0x80, 0x12, - 0x2e, 0x04, 0x8b, 0x02, 0x2a, 0xe0, 0x0b, 0xb0, - 0x42, 0xec, 0x00, 0x8b, 0xc0, 0x2e, 0x00, 0x0b, - 0xb8, 0x02, 0xac, 0x00, 0x89, 0xe1, 0x2a, 0x00, - 0x08, 0xa4, 0x02, 0xec, 0x00, 0x38, 0x80, 0x2e, - 0xe4, 0x08, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x2e, 0x30, 0x28, 0xb0, 0x12, 0xe0, 0x44, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, - 0xbb, 0x00, 0x2e, 0xf0, 0x08, 0x38, 0x82, 0x20, - 0xed, 0x09, 0x00, 0x38, 0x00, 0x80, 0xbb, 0x00, - 0x2e, 0xc8, 0x08, 0x30, 0x02, 0x0c, 0x80, 0x9b, - 0x80, 0x22, 0xc4, 0x0b, 0x91, 0x06, 0xcc, 0x00, - 0x8b, 0x80, 0x2e, 0xd8, 0x0b, 0x90, 0x02, 0x2c, - 0x00, 0xa9, 0x80, 0x20, 0xc0, 0x40, 0xa2, 0x02, - 0xec, 0x00, 0xb9, 0x88, 0x2e, 0x42, 0x88, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2c, 0xd0, 0x08, - 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb3, 0x00, 0x2c, - 0x40, 0x08, 0x30, 0x0a, 0x04, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x88, 0x00, 0x02, 0x04, 0x00, 0x83, - 0x00, 0x28, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x02, - 0xa3, 0x00, 0x2c, 0x40, 0x0b, 0x30, 0x02, 0x8c, - 0x02, 0xa0, 0x00, 0x20, 0x20, 0x08, 0x20, 0x02, - 0xcc, 0x00, 0xb0, 0x00, 0x24, 0x40, 0x48, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x04, 0x2c, 0x81, 0x08, - 0x30, 0x42, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xfb, 0x00, 0x3e, - 0x00, 0x0c, 0xa0, 0x03, 0x24, 0x04, 0xfb, 0x00, - 0x3e, 0xc1, 0x0c, 0xb0, 0x03, 0x2c, 0x02, 0xdb, - 0x00, 0x72, 0xc0, 0x8f, 0xb0, 0x03, 0xfc, 0x00, - 0xcb, 0x00, 0x3e, 0x80, 0x4f, 0xb0, 0x0b, 0x2c, - 0x00, 0xe9, 0x00, 0x30, 0x00, 0x2c, 0xa0, 0x03, - 0xec, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x2c, 0xb0, - 0x03, 0x6c, 0x00, 0xfb, 0x00, 0x3e, 0x00, 0x0c, - 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x1d, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0xfc, 0x00, - 0x3f, 0x40, 0x0f, 0xc0, 0x13, 0xfc, 0x00, 0xfd, - 0x00, 0x3f, 0x40, 0x0f, 0xd0, 0x03, 0xfc, 0x00, - 0xdc, 0x00, 0x3f, 0x00, 0x0f, 0xd0, 0x03, 0x74, - 0x00, 0xdd, 0x00, 0xbf, 0x00, 0x0f, 0xe0, 0x07, - 0xfc, 0x00, 0xfd, 0xed, 0x09, 0x00, 0x39, 0x00, - 0x00, 0x3f, 0x40, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0x01, 0x0f, 0xf0, 0x03, 0xe8, - 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x05, - 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x40, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0x7c, 0x00, 0xdf, 0x00, 0x3f, 0x00, - 0x0e, 0xf0, 0x03, 0xb0, 0x00, 0xfc, 0x41, 0x3f, - 0x0e, 0x0d, 0xf0, 0x03, 0xdc, 0x10, 0xf7, 0x00, - 0x3f, 0x00, 0x0c, 0xf2, 0x03, 0xb0, 0x0c, 0xfc, - 0x10, 0x2f, 0x00, 0x0e, 0xf1, 0x43, 0x70, 0x02, - 0xcc, 0x10, 0x33, 0x00, 0x0f, 0xf0, 0x03, 0xf0, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, - 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x20, 0x2f, 0xd0, 0x0b, - 0xf6, 0x82, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0x80, - 0x08, 0xb0, 0x02, 0x21, 0x00, 0xb8, 0x40, 0x2e, - 0x18, 0x08, 0xb0, 0x02, 0xec, 0x00, 0xbf, 0x40, - 0x2e, 0xc0, 0x0c, 0xf5, 0x02, 0x2c, 0x00, 0x98, - 0x20, 0x2e, 0x00, 0x0c, 0xb3, 0x03, 0x6d, 0x00, - 0x8b, 0x60, 0xa2, 0xd0, 0x0b, 0xb0, 0x02, 0xe0, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x04, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc4, 0x8b, - 0x34, 0x02, 0xcc, 0x00, 0x93, 0x00, 0x2c, 0x00, - 0x0a, 0x10, 0x02, 0x81, 0x00, 0xb0, 0x60, 0x24, - 0x00, 0x09, 0x30, 0x02, 0xcc, 0x11, 0xb3, 0x10, - 0x2c, 0x40, 0x1b, 0x30, 0x02, 0x04, 0x00, 0xb0, - 0x00, 0x2c, 0x00, 0x0a, 0x32, 0x02, 0x01, 0x00, - 0x80, 0x10, 0x28, 0x04, 0x0b, 0x30, 0x02, 0xe2, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, - 0xac, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xed, 0x09, - 0x00, 0x3a, 0x00, 0xc1, 0x0b, 0xb0, 0x02, 0xec, - 0x00, 0xbb, 0x00, 0x2e, 0xa0, 0x08, 0x90, 0x02, - 0x66, 0x00, 0xb8, 0x80, 0x2c, 0x20, 0x09, 0xa4, - 0x42, 0x68, 0x20, 0xbb, 0x00, 0x2e, 0xe0, 0x08, - 0xb0, 0x02, 0x2c, 0x20, 0xba, 0x40, 0x2e, 0x08, - 0x18, 0xb0, 0x42, 0x6c, 0x00, 0x8b, 0x00, 0x22, - 0xc0, 0x0b, 0xb0, 0x02, 0xf8, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x15, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc1, 0x0f, 0xb0, 0x03, 0x6c, - 0x00, 0xdb, 0x00, 0x3e, 0xe0, 0x0e, 0x10, 0x03, - 0xa3, 0x80, 0xf8, 0xa0, 0x3e, 0x20, 0x0d, 0xb0, - 0x03, 0xee, 0x00, 0xfb, 0x00, 0x3e, 0xe0, 0x1d, - 0xb0, 0x0b, 0xad, 0x00, 0xf8, 0xd0, 0x1e, 0x30, - 0x0e, 0xb0, 0x63, 0x00, 0x00, 0xc8, 0x00, 0x3a, - 0x00, 0x0f, 0xb0, 0x03, 0xc0, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x01, 0xbc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x7f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x00, 0x3c, 0xc2, 0x07, 0xf4, 0x03, - 0xb0, 0x00, 0xbd, 0x02, 0x3f, 0x00, 0x06, 0xf4, - 0x03, 0xfb, 0x00, 0xff, 0x08, 0x3d, 0xc2, 0x2d, - 0xb0, 0x83, 0xec, 0x08, 0xdd, 0x00, 0x36, 0x20, - 0x0e, 0x70, 0x03, 0x7c, 0x00, 0xff, 0x00, 0xbf, - 0xc0, 0x0f, 0xf0, 0x43, 0xf8, 0x40, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xac, - 0x00, 0xfb, 0x00, 0x3e, 0xd0, 0x0c, 0x90, 0x07, - 0xe5, 0x00, 0xe9, 0x20, 0x3e, 0x00, 0x0e, 0xb8, - 0x03, 0xed, 0x00, 0xfb, 0x12, 0x32, 0x80, 0x0f, - 0x30, 0x0b, 0x2d, 0x40, 0xeb, 0x40, 0x32, 0x00, - 0x0c, 0xed, 0x09, 0x00, 0x3b, 0x00, 0xb0, 0x03, - 0x20, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0xb0, - 0x03, 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xc8, 0x05, 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2f, - 0xc0, 0x0b, 0xf0, 0x02, 0x2c, 0x00, 0xfb, 0x00, - 0x2e, 0xc0, 0x08, 0x92, 0x02, 0xe4, 0x00, 0xb9, - 0x00, 0x2e, 0x00, 0x4f, 0xb8, 0x06, 0xeb, 0x00, - 0x8f, 0x81, 0x36, 0xf1, 0x0b, 0xfa, 0x02, 0x2d, - 0x04, 0xab, 0x01, 0x34, 0x00, 0x28, 0xf0, 0x02, - 0x2c, 0xc0, 0xbb, 0x00, 0x36, 0xc0, 0x09, 0xb0, - 0x02, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x05, 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x12, 0x8c, 0x00, 0xb3, 0x00, - 0x2c, 0x80, 0x08, 0x30, 0x02, 0xc0, 0x04, 0xa0, - 0x44, 0x2c, 0x00, 0x08, 0x12, 0x12, 0xce, 0x00, - 0xb3, 0x01, 0x24, 0xf0, 0x0b, 0x3c, 0x06, 0x04, - 0x80, 0x82, 0x00, 0x2c, 0x20, 0x0b, 0x30, 0x02, - 0x00, 0x10, 0xb8, 0x00, 0x2c, 0x00, 0x0b, 0x30, - 0x02, 0x78, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x01, 0x1e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x6d, - 0xe0, 0x0b, 0x78, 0x02, 0x1e, 0x00, 0xa7, 0x80, - 0x2d, 0xa0, 0x0a, 0x78, 0x02, 0xd6, 0x50, 0xb5, - 0x80, 0x2d, 0x21, 0x83, 0x58, 0x02, 0xff, 0x6a, - 0x97, 0x80, 0x25, 0xa2, 0x09, 0x78, 0x02, 0x1e, - 0x00, 0xa7, 0x80, 0x2d, 0x62, 0x0b, 0x79, 0x02, - 0x1e, 0x04, 0xb7, 0x80, 0x05, 0xe0, 0x09, 0x78, - 0x02, 0xc8, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x08, 0x0c, 0x00, 0xf3, 0x00, 0x3c, 0xc0, - 0x0b, 0x30, 0x03, 0xcc, 0x00, 0xf3, 0x10, 0x3c, - 0xc4, 0x0f, 0xb0, 0x03, 0xed, 0x09, 0x00, 0x3c, - 0x00, 0x8c, 0x00, 0xb3, 0x00, 0x3c, 0x80, 0x2c, - 0x10, 0x22, 0xc8, 0x00, 0xe3, 0x00, 0x3e, 0x00, - 0x1c, 0x32, 0x02, 0xc8, 0x40, 0xf3, 0x00, 0x14, - 0xd8, 0x0f, 0x32, 0x02, 0x04, 0x18, 0xeb, 0x00, - 0x3c, 0x14, 0x0f, 0xb0, 0x0b, 0x00, 0x00, 0xf0, - 0x00, 0x3c, 0x00, 0x0f, 0x30, 0x03, 0xd2, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, 0xbc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xd2, 0x0f, 0xf0, - 0x03, 0xfc, 0x40, 0xff, 0x00, 0x3f, 0x80, 0x0d, - 0xd0, 0x03, 0xfc, 0x18, 0xbf, 0x10, 0x3f, 0x84, - 0x0d, 0xf0, 0x03, 0xf8, 0x40, 0xef, 0x12, 0x2f, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x40, 0xff, 0x00, - 0x37, 0x40, 0x04, 0xf0, 0x23, 0xfc, 0x00, 0xff, - 0x00, 0x3b, 0xe0, 0x0f, 0xf1, 0x03, 0xd0, 0x02, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0d, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb4, - 0x03, 0x6c, 0x00, 0xdb, 0x00, 0x3e, 0xc0, 0x0c, - 0xb0, 0x07, 0xcc, 0x00, 0xda, 0x80, 0x32, 0x40, - 0x0f, 0x90, 0x03, 0x62, 0x00, 0xcb, 0x20, 0x12, - 0xc0, 0x8d, 0xb4, 0x03, 0xec, 0x00, 0xca, 0x00, - 0x32, 0x40, 0x0b, 0xb0, 0x03, 0x22, 0x00, 0xc8, - 0x00, 0x7e, 0x00, 0x0f, 0xb0, 0x03, 0xe2, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x34, - 0xa3, 0x1c, 0x00, 0xb7, 0x00, 0x2f, 0x80, 0x08, - 0x70, 0x02, 0xdc, 0x00, 0xa7, 0x06, 0x21, 0xc0, - 0x0b, 0xd0, 0x0a, 0x50, 0x00, 0xa3, 0x50, 0xa1, - 0xc0, 0x0b, 0x74, 0x82, 0x5c, 0x00, 0xe7, 0x00, - 0x29, 0x40, 0x0e, 0xf6, 0x03, 0x5c, 0x00, 0xed, - 0x09, 0x00, 0x3d, 0x00, 0xd7, 0x00, 0x25, 0xc0, - 0x0b, 0x70, 0x02, 0xd2, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x00, 0x9e, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, - 0x80, 0x2d, 0xe8, 0x0b, 0x78, 0x02, 0x1e, 0x00, - 0xb7, 0x80, 0x2d, 0xe0, 0x09, 0x58, 0x02, 0xde, - 0x28, 0x83, 0x80, 0x65, 0x61, 0x0b, 0x58, 0x82, - 0x1a, 0x00, 0x87, 0x80, 0x21, 0xe0, 0x49, 0x78, - 0x06, 0xdf, 0x00, 0x97, 0x80, 0x61, 0x60, 0x0b, - 0x78, 0x22, 0x42, 0x09, 0x84, 0x80, 0x2d, 0x20, - 0x8b, 0x78, 0x42, 0xf8, 0x40, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x14, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xbb, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x0a, 0x0c, 0x00, - 0xb3, 0x00, 0x2c, 0xf0, 0x49, 0x18, 0x02, 0xce, - 0x00, 0xa3, 0xa0, 0x24, 0xfc, 0x0b, 0x98, 0x02, - 0x08, 0x00, 0xa3, 0x00, 0x20, 0xb8, 0x0b, 0x30, - 0x02, 0x4e, 0x00, 0xa3, 0x40, 0x28, 0xc0, 0x4a, - 0x30, 0x02, 0x4c, 0x10, 0x93, 0x00, 0x24, 0xc0, - 0x0b, 0x30, 0x02, 0xd2, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xe8, 0x15, 0xa8, 0x00, 0xfa, 0x00, - 0x3e, 0x80, 0x0d, 0xa0, 0x03, 0xe8, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0x28, 0x00, - 0xda, 0x00, 0x3f, 0x81, 0x0d, 0xaa, 0x03, 0xfb, - 0x00, 0xce, 0xc0, 0xa7, 0x80, 0x0f, 0xe4, 0x03, - 0x7b, 0x00, 0xca, 0x00, 0x21, 0xa9, 0x0d, 0xa0, - 0x02, 0xf9, 0x00, 0x9e, 0x60, 0x31, 0x90, 0x0f, - 0xa0, 0x03, 0x68, 0x00, 0xca, 0x00, 0x3e, 0x80, - 0x0f, 0xa0, 0x03, 0xfa, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x00, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xa0, 0x00, - 0xf8, 0x00, 0xed, 0x09, 0x00, 0x3e, 0x00, 0x3e, - 0x06, 0x6e, 0x80, 0x03, 0x60, 0x20, 0xe8, 0x50, - 0x7a, 0x01, 0x0f, 0x88, 0x23, 0xe3, 0x40, 0xf8, - 0x01, 0x3e, 0x00, 0x43, 0x84, 0x03, 0xc2, 0x10, - 0xf8, 0x08, 0x3e, 0x20, 0x07, 0x80, 0x23, 0xf0, - 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0b, 0x80, 0x03, - 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x10, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x2a, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3c, - 0x60, 0x0c, 0x98, 0x03, 0xe4, 0x00, 0xc9, 0x80, - 0x3e, 0x40, 0x4f, 0x90, 0x03, 0x24, 0x84, 0xf1, - 0x82, 0x32, 0x44, 0x8c, 0x91, 0x43, 0xe4, 0x08, - 0xd9, 0x00, 0x12, 0x40, 0x0e, 0x90, 0x03, 0x26, - 0x00, 0xf9, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x23, - 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x04, 0x64, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x02, 0x40, - 0x09, 0x90, 0x02, 0x24, 0x00, 0x99, 0x00, 0x2e, - 0x42, 0x00, 0x98, 0x02, 0xc4, 0x01, 0xf9, 0x40, - 0x2e, 0x41, 0x0b, 0x94, 0x21, 0xe7, 0x00, 0xe9, - 0x02, 0x22, 0x60, 0x4d, 0x98, 0x02, 0xe5, 0x00, - 0xa9, 0x00, 0x36, 0x60, 0x48, 0x90, 0x12, 0xa5, - 0x81, 0xb9, 0x00, 0x36, 0x40, 0x0b, 0x90, 0x02, - 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x05, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x10, 0x02, 0xa4, 0x00, 0xb9, 0x00, 0x0e, - 0xc4, 0x28, 0x91, 0x02, 0x65, 0x90, 0x89, 0x22, - 0x2e, 0xc0, 0x09, 0x90, 0x82, 0x24, 0x04, 0xb9, - 0x50, 0x26, 0x40, 0x08, 0x94, 0x02, 0xe4, 0x88, - 0xb1, 0x04, 0x2a, 0x44, 0x0a, 0x10, 0x06, 0x24, - 0x40, 0xa5, 0x00, 0x27, 0x40, 0xed, 0x09, 0x00, - 0x3f, 0x00, 0x0b, 0x90, 0x02, 0xc6, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x00, - 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, - 0x00, 0xb1, 0x00, 0x24, 0x4a, 0x0b, 0x12, 0x82, - 0x04, 0x04, 0x91, 0x01, 0x6c, 0x50, 0x08, 0x10, - 0x02, 0xc4, 0xa1, 0xb1, 0x2c, 0x6c, 0x50, 0x8b, - 0x14, 0x0a, 0x84, 0x00, 0xa1, 0x00, 0xa0, 0x60, - 0x09, 0x14, 0x02, 0xc7, 0x01, 0x81, 0x45, 0x2e, - 0x4a, 0x08, 0x14, 0x06, 0x14, 0x00, 0xb5, 0x40, - 0x25, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x60, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x08, 0x0b, 0x82, 0x03, - 0xa0, 0x00, 0xf8, 0x00, 0x2e, 0x00, 0x08, 0x80, - 0x03, 0xe0, 0x80, 0x8a, 0x20, 0x3e, 0x00, 0x0f, - 0x80, 0x02, 0x28, 0x08, 0xf8, 0x00, 0x36, 0x00, - 0x0c, 0x80, 0x06, 0xc0, 0x04, 0xd0, 0x00, 0xba, - 0x08, 0x0e, 0x80, 0x0b, 0x20, 0x10, 0xe8, 0x00, - 0x37, 0x00, 0x0f, 0x80, 0x03, 0xee, 0x02, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x98, 0x0d, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x2c, 0x32, 0x40, 0x0d, 0x92, 0xa7, - 0xe4, 0x00, 0xd9, 0x00, 0x3f, 0x51, 0x0f, 0xd0, - 0x43, 0xf4, 0x00, 0xed, 0x28, 0x2f, 0x50, 0x0f, - 0xd0, 0x03, 0x54, 0x00, 0x69, 0x41, 0x73, 0x50, - 0x47, 0x94, 0x23, 0xf5, 0x00, 0xfd, 0x00, 0x33, - 0x41, 0x07, 0x94, 0x03, 0xe5, 0x00, 0xf9, 0x40, - 0x3e, 0x50, 0x0d, 0x90, 0x03, 0xe6, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xd9, 0x01, 0x36, 0x40, 0x8d, 0x91, 0x43, - 0x24, 0x00, 0xf9, 0x00, 0x37, 0x48, 0x0c, 0x50, - 0xed, 0x09, 0x00, 0x40, 0x00, 0x03, 0xb4, 0x0d, - 0xfd, 0x10, 0x1e, 0x48, 0x0f, 0xd1, 0x03, 0xf4, - 0x00, 0xfd, 0x28, 0x37, 0x48, 0x0d, 0xd0, 0x5b, - 0x74, 0x00, 0xb9, 0x10, 0x23, 0xc8, 0x0f, 0x92, - 0x83, 0xf4, 0x80, 0xf9, 0x00, 0x32, 0x40, 0x0f, - 0x90, 0x03, 0xc6, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x10, 0xe0, 0x00, 0xb8, 0x00, 0x2e, - 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xb0, 0x0c, - 0x2e, 0x00, 0x0b, 0x81, 0x0a, 0x20, 0x00, 0xb8, - 0x00, 0x2e, 0x0a, 0x88, 0x80, 0x02, 0x20, 0x00, - 0xb8, 0x11, 0x2e, 0x02, 0x09, 0x80, 0x00, 0xe8, - 0x00, 0x98, 0x00, 0x2e, 0x04, 0x0f, 0x84, 0x82, - 0x20, 0x20, 0x98, 0x00, 0x22, 0x04, 0x0b, 0x82, - 0x42, 0xe0, 0x48, 0xb0, 0x48, 0x22, 0x00, 0x0b, - 0x80, 0x02, 0xce, 0x44, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x05, 0xc4, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0x91, 0x20, - 0x28, 0x44, 0x09, 0x10, 0x02, 0x04, 0x00, 0xb1, - 0x00, 0x2c, 0x4c, 0x08, 0x10, 0x42, 0x84, 0x40, - 0x81, 0x00, 0x2c, 0x44, 0x09, 0x10, 0x42, 0xc4, - 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x8b, 0x13, 0x02, - 0x06, 0x40, 0x99, 0x00, 0x24, 0x40, 0x0b, 0x12, - 0x82, 0xc4, 0x00, 0xb1, 0x30, 0x28, 0x44, 0x0b, - 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x00, 0x24, 0x00, 0x99, - 0x02, 0x2e, 0x50, 0x28, 0x98, 0x02, 0x24, 0x61, - 0xb9, 0x18, 0x2e, 0x40, 0x09, 0x92, 0x82, 0xe4, - 0x00, 0x99, 0x00, 0x2e, 0x40, 0x0a, 0x90, 0x02, - 0x24, 0x00, 0x99, 0x00, 0xa6, 0x40, 0x8b, 0x90, - 0x02, 0xe4, 0x10, 0xb9, 0x00, 0x2a, 0x40, 0x0b, - 0x90, 0x02, 0xc6, 0xed, 0x09, 0x00, 0x41, 0x00, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, - 0xe4, 0x00, 0xf9, 0x00, 0x2e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xd9, 0x00, 0x36, 0x40, 0x0d, - 0x90, 0x03, 0x24, 0x00, 0x79, 0x00, 0x36, 0x50, - 0x08, 0x18, 0x03, 0xa6, 0x00, 0x79, 0x00, 0x3e, - 0x64, 0x8d, 0x98, 0x41, 0xe6, 0x04, 0xf9, 0x02, - 0x36, 0x42, 0x09, 0x90, 0x03, 0x24, 0x00, 0xf9, - 0x9a, 0x16, 0x60, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0xba, 0x40, 0x0f, 0x90, 0x03, 0xe8, - 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, - 0xa4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x10, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x34, 0x42, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x83, 0xe6, 0x80, 0xd9, 0x00, - 0x3e, 0x42, 0x0f, 0x90, 0x03, 0xa4, 0x08, 0xc9, - 0x00, 0x22, 0x44, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x36, 0x40, 0x0f, 0x90, 0x03, 0xca, - 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, - 0xa0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0d, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3a, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x10, - 0x4c, 0x80, 0x03, 0x60, 0x00, 0xf8, 0x42, 0x3e, - 0x01, 0x0d, 0x84, 0x03, 0xe3, 0x00, 0xd8, 0x90, - 0x3e, 0x10, 0x0c, 0x81, 0x8b, 0x60, 0x00, 0xc8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x01, 0xe0, 0x00, - 0xc8, 0x04, 0x32, 0x00, 0x0f, 0x80, 0x03, 0xca, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x28, 0x00, 0xba, 0x00, 0x2e, 0x80, 0x0b, 0xa0, - 0x02, 0xe8, 0x00, 0xba, 0x00, 0x32, 0x80, 0x03, - 0xa0, 0x02, 0xe8, 0x00, 0xba, 0x00, 0x2f, 0x90, - 0x08, 0xee, 0x02, 0x39, 0x80, 0x3e, 0xed, 0x09, - 0x00, 0x42, 0x00, 0x10, 0x2e, 0x80, 0x0b, 0xe6, - 0x02, 0xfb, 0x00, 0xbe, 0x41, 0x2f, 0xa0, 0x48, - 0xe8, 0x03, 0x1b, 0x00, 0xa2, 0x00, 0x2e, 0x80, - 0x0b, 0xa0, 0x02, 0xf8, 0x00, 0x8a, 0x00, 0xa2, - 0x80, 0x0b, 0xa0, 0x02, 0xc8, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x05, 0x4c, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x0c, - 0x33, 0x02, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0x8c, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x28, 0x1e, 0x02, - 0x0e, 0x20, 0xb3, 0x50, 0x2c, 0xc0, 0x0b, 0x2c, - 0x02, 0xc6, 0x40, 0xb1, 0x84, 0x28, 0xa4, 0x2a, - 0xa8, 0x02, 0x04, 0x80, 0x83, 0x00, 0x2c, 0xc4, - 0x0b, 0x30, 0x02, 0xcc, 0x04, 0x9b, 0x02, 0x84, - 0xc0, 0x0b, 0x30, 0x02, 0xca, 0x04, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1c, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, - 0xb7, 0x80, 0x25, 0xc0, 0x0b, 0x72, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0xd0, 0x08, 0xf0, 0x22, - 0x1c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x09, 0x70, - 0x02, 0xd4, 0x00, 0xb4, 0x00, 0x0c, 0xa0, 0x08, - 0x70, 0x22, 0x05, 0x00, 0xa7, 0x20, 0x25, 0xc0, - 0x0b, 0x72, 0x00, 0xd6, 0x00, 0x97, 0x20, 0x25, - 0xc0, 0x8b, 0x70, 0x02, 0xc8, 0x40, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x00, 0xf7, - 0x80, 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0xde, 0x00, - 0xf7, 0xc8, 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0x9e, - 0x00, 0xf7, 0x80, 0x3f, 0xa0, 0x0c, 0x78, 0x03, - 0x5e, 0x00, 0xf7, 0x80, 0x2d, 0xfc, 0x0d, 0x78, - 0x03, 0xd2, 0x00, 0xd5, 0x80, 0x3d, 0xa0, 0x0c, - 0x38, 0x03, 0x16, 0x01, 0xc7, 0xa0, 0x3d, 0xe0, - 0x0f, 0x7b, 0x03, 0xde, 0x02, 0xd7, 0xa0, 0x25, - 0xe0, 0x07, 0x78, 0x03, 0xca, 0x02, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x43, 0x00, 0x00, 0x00, - 0x08, 0x1d, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x1a, - 0xc0, 0x07, 0xb3, 0x07, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x01, 0x6c, 0x04, 0xfb, - 0x02, 0x1e, 0xc8, 0x0f, 0xb0, 0x23, 0xe8, 0x10, - 0xf8, 0x02, 0x1e, 0xc0, 0x0b, 0xb0, 0x03, 0xa4, - 0x00, 0xfb, 0x68, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0x40, 0x00, 0xeb, 0x48, 0x3a, 0xc0, 0x0f, 0xb0, - 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x05, 0xfe, 0x00, 0xff, 0x80, 0x3f, 0xe0, - 0x0f, 0xf8, 0x03, 0x7e, 0x00, 0xff, 0x80, 0x3f, - 0xe0, 0x0d, 0xf6, 0x03, 0x7e, 0x00, 0xff, 0x80, - 0x3f, 0xe0, 0x0e, 0xd0, 0x37, 0xfa, 0x40, 0x4f, - 0x90, 0x33, 0xe4, 0x0d, 0xf8, 0x19, 0xb6, 0x50, - 0xfd, 0x90, 0x33, 0xa0, 0x03, 0xf8, 0x03, 0x36, - 0x00, 0xdf, 0x88, 0x33, 0xe4, 0x0f, 0xf8, 0x83, - 0xfe, 0x00, 0xcf, 0x88, 0x37, 0xe0, 0x0c, 0xf8, - 0x03, 0xd0, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x3d, - 0xc0, 0x08, 0x71, 0x06, 0xdc, 0x00, 0xb7, 0x00, - 0x2f, 0xc0, 0x08, 0x51, 0x02, 0xd9, 0x18, 0x8f, - 0x10, 0x21, 0xc6, 0x0b, 0x60, 0x02, 0x14, 0x00, - 0xb4, 0x01, 0x29, 0x08, 0x49, 0x66, 0x03, 0xd4, - 0x00, 0xbf, 0x18, 0x21, 0xc0, 0x0b, 0x70, 0x03, - 0xd4, 0x08, 0xd7, 0x00, 0x35, 0xc0, 0x0d, 0x70, - 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x71, 0x02, 0xdc, 0x00, 0x97, 0x00, - 0x2d, 0xc0, 0x0a, 0x51, 0x02, 0xd4, 0x0a, 0xa4, - 0x00, 0x21, 0xc4, 0x1b, 0xed, 0x09, 0x00, 0x44, - 0x00, 0xf0, 0x02, 0x90, 0x04, 0xb3, 0x00, 0x69, - 0x80, 0x19, 0x70, 0x02, 0x54, 0x00, 0xb7, 0x00, - 0x29, 0x42, 0x1b, 0x70, 0x02, 0xcc, 0x00, 0x83, - 0x08, 0x20, 0xc0, 0x0b, 0x70, 0x02, 0x60, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x28, 0xc0, 0x0a, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2e, 0xd8, 0x08, - 0x11, 0x02, 0xc5, 0x00, 0x80, 0x00, 0x20, 0xc0, - 0x0b, 0x30, 0x02, 0x08, 0x00, 0xb2, 0x00, 0x20, - 0x44, 0x0b, 0xb0, 0x22, 0x85, 0xc0, 0xb3, 0x40, - 0x20, 0x70, 0x0b, 0x30, 0x02, 0x82, 0x40, 0x93, - 0x40, 0x24, 0xd2, 0x0b, 0x30, 0x02, 0xd8, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, 0xac, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0x6c, 0x00, 0xff, 0x00, 0x2e, 0xc0, 0x0f, 0xf0, - 0x02, 0x6c, 0x00, 0xdb, 0x00, 0x3e, 0xb8, 0x0e, - 0x80, 0x03, 0xe4, 0x00, 0xc9, 0x10, 0xb3, 0xe0, - 0x0d, 0x30, 0x03, 0xa4, 0x04, 0xb9, 0x00, 0xba, - 0x90, 0x0f, 0xb0, 0x22, 0x24, 0x04, 0x7f, 0xc4, - 0xba, 0xf0, 0x0b, 0xf0, 0x02, 0xe8, 0x00, 0xcf, - 0x80, 0x62, 0xd2, 0x0f, 0xb0, 0x03, 0xea, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3c, 0xc0, 0x0d, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0x80, 0x0f, - 0x80, 0x23, 0xe5, 0x28, 0xd8, 0x00, 0x3e, 0xc0, - 0x0f, 0xb6, 0x03, 0xe4, 0x80, 0xfa, 0x40, 0x3e, - 0x92, 0x0d, 0xb4, 0x03, 0xe4, 0x10, 0x7b, 0x20, - 0x3e, 0x48, 0x8f, 0xb0, 0x03, 0x61, 0x28, 0xfb, - 0x08, 0x3e, 0xc0, 0x0d, 0xb0, 0x03, 0xe0, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xed, - 0x09, 0x00, 0x45, 0x00, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3e, 0xc0, 0xc6, 0xf0, 0x43, 0xfc, 0x00, - 0xff, 0x00, 0x2f, 0x80, 0x0c, 0xe0, 0x03, 0xe8, - 0x00, 0xfd, 0x00, 0x3d, 0xc0, 0x0e, 0xe0, 0x11, - 0xf2, 0x84, 0xd5, 0xa0, 0x3b, 0x00, 0x0c, 0xa0, - 0x0b, 0x36, 0x04, 0xff, 0x00, 0x23, 0xc0, 0x0f, - 0xf0, 0x03, 0xb0, 0x00, 0x77, 0x00, 0x31, 0xc1, - 0x0e, 0xf0, 0x03, 0xc0, 0x44, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, 0x9b, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x0e, 0xc1, 0x08, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x2e, 0xb2, 0x08, 0xa4, 0x22, 0xeb, - 0x40, 0xb8, 0xe0, 0x2e, 0xc0, 0x8a, 0xbc, 0x02, - 0x28, 0x00, 0xba, 0x00, 0x20, 0x78, 0x0a, 0xbc, - 0x02, 0x2e, 0x00, 0x93, 0x00, 0x22, 0x44, 0x0f, - 0xb0, 0x00, 0xe1, 0x80, 0xbb, 0x00, 0x2a, 0xc0, - 0x0a, 0xb0, 0x02, 0xf0, 0x40, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, 0xbb, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0a, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x26, 0xa0, 0x08, 0x9c, 0x02, 0xe0, - 0x00, 0x99, 0x80, 0x2e, 0xc0, 0x08, 0xbc, 0x0a, - 0xec, 0x08, 0xb9, 0x08, 0x22, 0xc4, 0x0a, 0xb8, - 0x02, 0xec, 0x80, 0xbb, 0x02, 0x2a, 0xc0, 0x1b, - 0xb0, 0x12, 0xa8, 0x80, 0xbb, 0x00, 0x2a, 0xc0, - 0x18, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0x80, 0x0a, 0x10, 0x02, 0xc0, - 0x00, 0xb0, 0x00, 0x0c, 0xc0, 0x08, 0x90, 0x02, - 0x0a, 0x00, 0xed, 0x09, 0x00, 0x46, 0x00, 0x32, - 0x00, 0x20, 0x40, 0xb8, 0x10, 0x06, 0x0e, 0x00, - 0x1b, 0x00, 0x08, 0x40, 0x1a, 0x30, 0x02, 0x40, - 0x00, 0xb3, 0x00, 0x28, 0xc0, 0x02, 0x30, 0x02, - 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0d, 0x6c, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xff, 0x00, 0x3e, 0xc0, - 0x0e, 0xf0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x36, - 0x00, 0x2c, 0x90, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x3f, 0xc0, 0x2e, 0xb0, 0x43, 0xe8, 0x08, 0x9a, - 0x00, 0xb2, 0x40, 0x0e, 0xb0, 0x23, 0x60, 0x00, - 0xff, 0x00, 0x3a, 0x40, 0x0b, 0xf0, 0x03, 0xa0, - 0x00, 0xff, 0x00, 0x32, 0xc0, 0x0e, 0xb0, 0x03, - 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x1d, 0xfc, 0x00, 0xdf, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0x00, 0x0d, 0xd0, 0x03, 0xf0, 0x00, 0xfc, 0x00, - 0x3f, 0xc0, 0x07, 0x40, 0x03, 0x7c, 0x00, 0xbf, - 0x00, 0x37, 0x40, 0x0f, 0xe0, 0x03, 0xbc, 0x00, - 0xbf, 0x00, 0x37, 0x40, 0x0f, 0xf0, 0x03, 0xf0, - 0x00, 0xff, 0x00, 0x2f, 0xc0, 0x0f, 0xf0, 0x03, - 0xe8, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x05, 0xf8, 0x00, 0xec, 0x11, 0x33, 0x04, 0x4c, - 0xc1, 0x03, 0xf1, 0x00, 0xfc, 0x10, 0x3f, 0x00, - 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0xcc, 0x00, 0x33, - 0x00, 0x0c, 0xc1, 0x23, 0xf0, 0x00, 0xfc, 0x00, - 0x33, 0x00, 0x0f, 0xc0, 0x03, 0x3c, 0x00, 0x4f, - 0x03, 0x3f, 0xc0, 0x8f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x33, 0xc0, 0x0f, 0xf0, 0x23, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0x01, 0x8d, 0xc3, 0x13, - 0x30, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x10, 0xe8, 0x00, 0xb0, 0xa0, 0xed, 0x09, 0x00, - 0x47, 0x00, 0x22, 0x28, 0x08, 0x8a, 0x22, 0xe2, - 0x00, 0xb8, 0x80, 0x2e, 0x80, 0x1b, 0x90, 0x12, - 0xec, 0x00, 0x89, 0x01, 0x2a, 0x00, 0x08, 0x88, - 0x02, 0xe2, 0x20, 0xb8, 0x00, 0x22, 0x80, 0x0b, - 0x80, 0x02, 0x3e, 0x80, 0x8f, 0x00, 0x2e, 0xc1, - 0x0b, 0xb0, 0x22, 0xec, 0x00, 0xbb, 0x00, 0xa2, - 0xc1, 0x8b, 0xb0, 0x02, 0xec, 0x10, 0xbb, 0x00, - 0x2e, 0x96, 0x08, 0x83, 0x02, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, 0x00, - 0xa0, 0x20, 0x20, 0x08, 0x08, 0x22, 0x02, 0xc0, - 0x80, 0xb0, 0x20, 0x2c, 0x40, 0x0b, 0x20, 0x02, - 0xe0, 0x02, 0x82, 0x04, 0x2a, 0x20, 0x08, 0x02, - 0x02, 0xc0, 0x80, 0xb8, 0x80, 0x20, 0x40, 0x4b, - 0xa0, 0x06, 0x0c, 0x20, 0x93, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x20, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x14, 0xb3, 0x01, - 0x2c, 0x08, 0x09, 0x00, 0x02, 0x22, 0x01, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xac, 0x00, - 0xb0, 0x00, 0x20, 0x00, 0x08, 0xa0, 0x02, 0xe0, - 0x00, 0xb8, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x06, - 0xec, 0x00, 0xab, 0x04, 0x2a, 0x00, 0x08, 0x80, - 0x02, 0xe0, 0x10, 0xb8, 0x00, 0x22, 0xc0, 0x0b, - 0xa0, 0x0a, 0x2c, 0x10, 0x9b, 0x04, 0x2e, 0x50, - 0x8b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x22, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x2e, 0x44, 0x08, 0x90, 0x02, 0x30, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xe8, 0x00, - 0xea, 0x20, 0xb2, 0x90, 0x2c, 0x82, 0x03, 0xe8, - 0x90, 0xfa, 0x40, 0x3e, 0x00, 0x0b, 0x80, 0x03, - 0xe0, 0x08, 0xc0, 0x00, 0x30, 0x80, 0x8c, 0xa2, - 0x03, 0xe8, 0x80, 0xf2, 0x00, 0x32, 0x00, 0x0f, - 0x00, 0x03, 0x2c, 0x02, 0xdb, 0x00, 0x3e, 0x90, - 0xed, 0x09, 0x00, 0x48, 0x00, 0x0f, 0xb0, 0x23, - 0xec, 0x10, 0xfb, 0x00, 0x32, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xbb, 0x03, 0x3e, 0x61, 0x0d, - 0x98, 0x0b, 0x10, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x01, 0xb8, 0x00, 0xfe, 0x02, 0x3f, - 0x80, 0x0f, 0xc0, 0x03, 0xf8, 0x00, 0xfe, 0x00, - 0x3f, 0x80, 0x0f, 0xd0, 0x03, 0xfc, 0x00, 0xdd, - 0x00, 0x37, 0x81, 0x0b, 0xe0, 0x03, 0xf8, 0x00, - 0xfe, 0x01, 0x3f, 0x80, 0x0f, 0xc0, 0x03, 0xfc, - 0x10, 0xef, 0x01, 0x3f, 0xc2, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xf7, 0x00, 0x3f, 0xc1, 0x0f, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3d, 0xa2, 0x0f, - 0xcc, 0x43, 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x10, 0xac, 0x00, 0xfa, 0x80, 0x36, - 0xb0, 0x2c, 0xa8, 0x03, 0xea, 0x00, 0xfa, 0xc0, - 0xba, 0x40, 0x0e, 0xa1, 0x03, 0x20, 0x00, 0xfa, - 0x00, 0x32, 0x82, 0x0c, 0xa8, 0x03, 0xea, 0x00, - 0xfa, 0x00, 0x32, 0x40, 0x0f, 0xa1, 0x03, 0x2c, - 0x00, 0xfb, 0x11, 0x3e, 0x80, 0x4e, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x32, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0x40, 0x2c, - 0x31, 0x03, 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xc8, 0x05, 0x2c, 0x00, 0xba, 0x80, 0x22, - 0xa0, 0x08, 0xa8, 0x02, 0xea, 0x14, 0xba, 0x80, - 0x22, 0xc0, 0x09, 0xb0, 0x0a, 0x0c, 0x08, 0xbb, - 0x00, 0x22, 0x91, 0x48, 0xa8, 0x02, 0xea, 0x00, - 0x9a, 0x01, 0x22, 0xc0, 0x0b, 0xa8, 0x42, 0x3d, - 0x40, 0xbf, 0x00, 0x2e, 0xd0, 0x08, 0xb0, 0x02, - 0xec, 0x00, 0xbf, 0x00, 0xa3, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0x42, 0x88, - 0xb5, 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x05, 0x48, 0x00, 0xb1, 0x00, 0x24, - 0x40, 0x08, 0x10, 0xed, 0x09, 0x00, 0x49, 0x00, - 0x02, 0xc4, 0x11, 0xb1, 0x00, 0x24, 0x00, 0x09, - 0x08, 0x02, 0x40, 0x00, 0xb0, 0x00, 0x60, 0x40, - 0x08, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x20, - 0x00, 0x0b, 0x10, 0x02, 0x6d, 0x00, 0xb3, 0x80, - 0x2c, 0x80, 0x0a, 0x30, 0x22, 0xcc, 0x00, 0xb3, - 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0x20, 0x08, 0x2c, 0x02, 0xf8, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, - 0x1a, 0x00, 0xb5, 0x80, 0x21, 0x60, 0x08, 0x58, - 0x02, 0xd6, 0x00, 0xb5, 0x80, 0x25, 0xa0, 0x09, - 0xd8, 0x02, 0x5e, 0x00, 0xb5, 0xc0, 0x23, 0x60, - 0x08, 0x58, 0x02, 0xd6, 0x00, 0x9d, 0x80, 0x21, - 0xa0, 0x0b, 0xdc, 0x00, 0x5e, 0x20, 0xb7, 0x80, - 0x2d, 0xe4, 0x28, 0x78, 0x02, 0xde, 0x00, 0xb7, - 0x90, 0x21, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, - 0xb7, 0x80, 0x2d, 0xa4, 0x08, 0x68, 0x02, 0xc8, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, - 0x0c, 0x00, 0xf1, 0x00, 0x36, 0x54, 0x0c, 0x30, - 0x03, 0xc4, 0x00, 0xf9, 0x40, 0x3c, 0x44, 0x0f, - 0x21, 0x03, 0x40, 0x00, 0xf2, 0x00, 0x30, 0x40, - 0x0c, 0x10, 0x03, 0xc4, 0x00, 0xf1, 0x04, 0x30, - 0x40, 0x0f, 0x34, 0x03, 0x4c, 0x80, 0xf3, 0x00, - 0x3e, 0x86, 0x0e, 0x30, 0x03, 0xcc, 0x00, 0xfb, - 0x00, 0x30, 0xc0, 0x0f, 0x30, 0x03, 0xcc, 0x00, - 0xf3, 0x00, 0x3e, 0x80, 0x0c, 0x00, 0x03, 0xd2, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, - 0xbc, 0x00, 0xfd, 0x00, 0x3f, 0x41, 0x0f, 0xf0, - 0x03, 0xf4, 0x00, 0xfd, 0x00, 0x3b, 0xc1, 0x1d, - 0x70, 0x03, 0xbc, 0x00, 0xf7, 0x00, 0x3d, 0x40, - 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xf5, 0x00, 0x3f, - 0xc0, 0x0f, 0x70, 0x0b, 0xbd, 0x00, 0xff, 0x08, - 0x3f, 0x44, 0x2f, 0xf0, 0x03, 0xfc, 0xed, 0x09, - 0x00, 0x4a, 0x00, 0x00, 0xff, 0x00, 0x3f, 0xc2, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x10, 0x3f, - 0xc1, 0x0f, 0xd0, 0x03, 0xd0, 0x06, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x05, 0xe8, 0x00, 0xfb, - 0x80, 0x3a, 0xc0, 0x0f, 0x90, 0x03, 0xec, 0x00, - 0xeb, 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xc8, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x0a, - 0x2c, 0x00, 0xfb, 0x00, 0x2e, 0x00, 0x0f, 0x90, - 0x03, 0xec, 0xc0, 0xcb, 0x40, 0x32, 0xa0, 0x0c, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0xb2, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0x60, 0x0c, 0xb0, 0x03, 0xea, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x11, 0x98, 0x00, 0xbf, - 0x00, 0x21, 0xc0, 0x0b, 0x50, 0x02, 0xdc, 0x00, - 0x8f, 0x00, 0x21, 0x80, 0x0b, 0x50, 0x02, 0xdc, - 0x00, 0x85, 0x00, 0x2d, 0xc0, 0x0b, 0xf0, 0x02, - 0x1c, 0x00, 0xb7, 0x00, 0x2d, 0x80, 0x0b, 0x50, - 0x02, 0xdc, 0x80, 0x83, 0x28, 0x35, 0xc0, 0x2a, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x40, 0x21, 0xc8, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2c, - 0x80, 0x08, 0x60, 0x02, 0xd2, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, 0x00, 0xb7, - 0x80, 0x29, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, - 0xa7, 0x80, 0x2d, 0x60, 0x0b, 0x68, 0x02, 0xf2, - 0x00, 0x86, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, - 0x1e, 0x10, 0xb7, 0x80, 0x2d, 0x61, 0x0b, 0x78, - 0x02, 0xde, 0x00, 0x87, 0x80, 0x23, 0xa0, 0x08, - 0x78, 0x02, 0xde, 0x00, 0xa3, 0x80, 0x21, 0xe0, - 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, - 0xe0, 0x08, 0x78, 0x62, 0xf0, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, 0x00, 0xb3, - 0x10, 0x22, 0xc4, 0x0b, 0x30, 0x02, 0xce, 0x00, - 0x83, 0xed, 0x09, 0x00, 0x4b, 0x00, 0x80, 0xa4, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x02, 0x83, 0x00, - 0x2c, 0xc0, 0x0b, 0x38, 0x02, 0x0e, 0x04, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0x83, 0x00, 0x24, 0xc4, 0x0a, 0x30, 0x02, 0xcc, - 0x00, 0xbb, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x08, 0xb1, - 0x82, 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xe8, 0x15, 0xa8, 0x00, 0xfa, 0x82, 0x3a, 0xa0, - 0x0f, 0xa0, 0x03, 0xea, 0x80, 0xea, 0xa0, 0x3e, - 0x80, 0x0b, 0xa0, 0x02, 0xe8, 0x04, 0xca, 0x02, - 0x3e, 0x80, 0x0f, 0xaa, 0x03, 0x2a, 0x80, 0x7a, - 0x00, 0x3c, 0x80, 0x0f, 0xa0, 0x03, 0xe8, 0x02, - 0xca, 0x00, 0x33, 0x90, 0x2c, 0xa0, 0x03, 0xe8, - 0x00, 0xea, 0x00, 0x32, 0x80, 0x0f, 0xa0, 0x03, - 0xe8, 0x00, 0xfa, 0x00, 0x3f, 0x90, 0x0c, 0xe8, - 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3a, - 0x10, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x4f, 0x80, 0x03, 0x60, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x30, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x01, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x08, 0x2f, 0x84, - 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x50, - 0x0d, 0x94, 0x03, 0x24, 0x00, 0x89, 0x00, 0x32, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0x89, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0x24, 0x00, 0xc9, - 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x03, 0xc4, 0x00, - 0xc1, 0x00, 0x32, 0x70, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x30, 0xed, 0x09, 0x00, 0x4c, - 0x00, 0x40, 0x0e, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x04, 0x3e, 0x68, 0x0f, 0x98, 0x03, 0x02, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x64, - 0x00, 0xb9, 0x40, 0x2e, 0x70, 0x08, 0x9c, 0x02, - 0x25, 0x00, 0x89, 0x40, 0x22, 0x40, 0x0b, 0x90, - 0x42, 0x44, 0x02, 0x89, 0x00, 0x2e, 0x40, 0x0b, - 0x94, 0x02, 0x25, 0x00, 0x89, 0x00, 0x2e, 0x40, - 0x0a, 0x98, 0x02, 0xe4, 0x00, 0xa9, 0x60, 0x2a, - 0x68, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, - 0x2a, 0x40, 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x02, 0x2e, 0x60, 0x0b, 0x9f, 0x02, 0x20, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, - 0x00, 0xbd, 0x00, 0x2f, 0x40, 0x09, 0x50, 0x02, - 0x14, 0x00, 0xa5, 0x00, 0x23, 0x40, 0x0b, 0xd0, - 0x02, 0xf4, 0x00, 0xad, 0x80, 0x2f, 0x40, 0x0b, - 0x50, 0x02, 0x14, 0x00, 0xad, 0x00, 0x2f, 0x40, - 0x08, 0xd2, 0x02, 0x64, 0x40, 0x89, 0x00, 0x22, - 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, - 0x22, 0x40, 0x0a, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0x06, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, - 0x00, 0xb5, 0x80, 0x2d, 0x60, 0x08, 0x58, 0x0a, - 0x16, 0x00, 0xa5, 0x80, 0x61, 0x40, 0x0b, 0x50, - 0x42, 0x54, 0x00, 0xa5, 0x00, 0x2d, 0x40, 0x0b, - 0x58, 0x02, 0x16, 0x00, 0x85, 0x00, 0x2d, 0x40, - 0x0a, 0x50, 0x02, 0xc4, 0x00, 0xa1, 0x00, 0x28, - 0x50, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x40, - 0x28, 0x4a, 0x08, 0x14, 0x02, 0xc4, 0x00, 0xb1, - 0x00, 0x2c, 0x50, 0x0b, 0x14, 0x0a, 0x02, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x60, - 0x00, 0xf8, 0x50, 0x3e, 0x14, 0x0d, 0x85, 0x03, - 0x01, 0x42, 0xe8, 0x50, 0xb2, 0x80, 0x0f, 0xed, - 0x09, 0x00, 0x4d, 0x00, 0x80, 0x03, 0xe0, 0x00, - 0xe8, 0x00, 0x3e, 0x00, 0x0f, 0x85, 0x0b, 0x21, - 0x42, 0xe8, 0x00, 0x3e, 0x00, 0x0c, 0xc0, 0x03, - 0x41, 0x40, 0xc8, 0x00, 0x32, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x32, 0x08, 0x0e, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0x2e, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x98, 0x1d, 0xec, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xd9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xc4, 0x00, - 0x19, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe5, 0x00, 0xf9, 0x42, 0x3d, 0x40, 0x0f, 0x90, - 0x43, 0xe4, 0x00, 0xd9, 0x40, 0x3e, 0x4a, 0x0f, - 0x90, 0x03, 0xe4, 0x08, 0xf9, 0x00, 0x3f, 0x50, - 0x0f, 0xd4, 0x03, 0xe6, 0x06, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x05, 0xe4, 0x00, 0xed, 0x10, - 0x33, 0x40, 0x0f, 0xd0, 0x03, 0x34, 0x40, 0xcd, - 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x03, 0x24, 0x18, - 0xd1, 0x00, 0x32, 0xc0, 0x0d, 0xd0, 0x13, 0x34, - 0x00, 0xcb, 0x00, 0x3c, 0x40, 0x0f, 0x90, 0x03, - 0xf4, 0x80, 0xcd, 0x28, 0x33, 0x44, 0x0f, 0x90, - 0x03, 0xe4, 0x01, 0xf9, 0x10, 0x3e, 0x4a, 0x0c, - 0x90, 0x03, 0xe4, 0x00, 0xe9, 0x00, 0x3f, 0x40, - 0x0f, 0xd1, 0x03, 0x06, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x10, 0xe0, 0x00, 0x88, 0x20, - 0x22, 0x02, 0x08, 0x80, 0x82, 0x20, 0x00, 0xa8, - 0x28, 0x2e, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, - 0xb8, 0x00, 0xa3, 0x00, 0x09, 0x82, 0x82, 0x20, - 0x80, 0x88, 0x01, 0x2e, 0x00, 0x0b, 0xc0, 0x12, - 0xe0, 0x80, 0xd8, 0x01, 0x36, 0x08, 0x0b, 0x80, - 0x02, 0xe0, 0x00, 0xb8, 0x10, 0x2e, 0x08, 0x08, - 0x82, 0x02, 0xed, 0x09, 0x00, 0x4e, 0x00, 0xe0, - 0x00, 0xb8, 0x00, 0x2e, 0x02, 0x0b, 0x01, 0x02, - 0x0e, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x05, 0xe4, 0x00, 0xa1, 0x20, 0x20, 0x48, 0x0a, - 0x10, 0x12, 0x04, 0x0c, 0x01, 0x20, 0x2c, 0x60, - 0x08, 0x50, 0x42, 0xd4, 0x08, 0xbd, 0x00, 0x21, - 0x40, 0x09, 0x12, 0x02, 0x04, 0xa0, 0x81, 0x00, - 0x2c, 0x60, 0x09, 0x50, 0x02, 0xc4, 0xe0, 0x83, - 0x00, 0x20, 0xc8, 0x8b, 0x10, 0x02, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x4a, 0x09, 0x12, 0x82, 0xc4, - 0x00, 0xb1, 0x00, 0x2c, 0x44, 0x0b, 0x10, 0x02, - 0x02, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x15, 0xa4, 0x00, 0x89, 0x04, 0x20, 0x40, 0x08, - 0x92, 0x00, 0x24, 0x00, 0x89, 0x00, 0x0e, 0x40, - 0x28, 0xd8, 0x0a, 0xf4, 0x00, 0xbd, 0x00, 0x23, - 0x40, 0x09, 0x90, 0x02, 0x24, 0x00, 0x89, 0x00, - 0x0e, 0x40, 0x0b, 0xd0, 0x02, 0xe4, 0x04, 0x99, - 0x00, 0xe2, 0x60, 0x0b, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x09, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x94, 0x02, - 0x06, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x15, 0xe4, 0x00, 0xe9, 0x00, 0xb2, 0x40, 0x0f, - 0x90, 0x0b, 0x24, 0x02, 0x89, 0x00, 0x3c, 0x40, - 0x0c, 0x10, 0x03, 0xe4, 0x00, 0xd9, 0x80, 0x32, - 0x40, 0x0d, 0x90, 0x0b, 0x24, 0x02, 0xc9, 0x00, - 0x3e, 0x40, 0x0f, 0x98, 0x03, 0xe4, 0x00, 0xc1, - 0x01, 0x22, 0x40, 0x0b, 0x90, 0x03, 0xe4, 0x00, - 0xb9, 0x00, 0x3e, 0x40, 0x2d, 0x90, 0x03, 0xe4, - 0x00, 0xe9, 0x00, 0x3e, 0x42, 0x0f, 0x90, 0x0b, - 0x28, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x01, 0xa4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0x24, 0x00, 0xed, 0x09, 0x00, - 0x4f, 0x00, 0xf9, 0xa0, 0x3e, 0x41, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x01, 0x3e, 0x40, 0x0f, - 0x94, 0x03, 0xe4, 0x00, 0xb9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, - 0x40, 0x0e, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x46, 0x0f, 0x11, 0x03, 0xca, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0xa0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0e, 0x80, 0x03, 0x20, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0x22, 0x00, 0xf8, 0x00, 0x32, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0c, - 0xc2, 0x03, 0xc0, 0x00, 0xf8, 0x80, 0xb6, 0x20, - 0x0e, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x04, 0x32, - 0x00, 0x0c, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0x0a, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0x08, 0x00, - 0xbe, 0x02, 0x2f, 0x80, 0x0e, 0xe0, 0x0a, 0x38, - 0x00, 0xbe, 0x00, 0x2e, 0x80, 0x0b, 0xa0, 0x0a, - 0x28, 0x00, 0xb2, 0x00, 0xa2, 0xa2, 0x03, 0xe2, - 0x02, 0xf8, 0x80, 0xba, 0x00, 0x2e, 0x80, 0x0a, - 0xa0, 0x02, 0xf8, 0x00, 0xbe, 0x00, 0x23, 0x80, - 0x0f, 0xa0, 0x03, 0xa8, 0x00, 0xba, 0x00, 0xa2, - 0x80, 0x08, 0xa0, 0x02, 0xe8, 0x10, 0xba, 0x00, - 0x2f, 0x90, 0x0b, 0xe0, 0x02, 0x8a, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x4c, 0x00, - 0xb8, 0x00, 0x2c, 0x00, 0x0b, 0x80, 0x02, 0xa0, - 0x00, 0xb0, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x00, - 0x0c, 0x00, 0xa3, 0x00, 0x20, 0xc0, 0x0b, 0x82, - 0x02, 0xe0, 0x80, 0xb3, 0x00, 0x2c, 0x00, 0x08, - 0x29, 0x02, 0xc1, 0x20, 0xb2, 0x00, 0x28, 0xc0, - 0x8b, 0x30, 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x22, - 0xc0, 0x08, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0xed, 0x09, 0x00, 0x50, 0x00, 0x2c, 0xd0, 0x0b, - 0x38, 0x02, 0x0a, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x01, 0x1c, 0x00, 0xb4, 0x00, 0x2d, - 0x00, 0x0b, 0x40, 0x12, 0x90, 0x00, 0xb4, 0x00, - 0x2d, 0xc0, 0x0b, 0x50, 0x02, 0x1c, 0x00, 0xbe, - 0x00, 0x21, 0x80, 0x0b, 0x40, 0x12, 0xd0, 0x00, - 0xb7, 0x00, 0x2d, 0x20, 0x0a, 0x60, 0x02, 0x58, - 0x04, 0x34, 0x00, 0x29, 0x40, 0x0b, 0x70, 0x02, - 0x9c, 0x00, 0xb3, 0xa0, 0x20, 0xc4, 0x08, 0x72, - 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x74, 0x02, 0xa8, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x08, 0x1e, 0x00, 0xf4, 0x80, 0x3d, - 0xa0, 0x0f, 0xe8, 0x03, 0x92, 0x00, 0xf4, 0x80, - 0x3d, 0xa0, 0x9f, 0x78, 0x13, 0x1e, 0x10, 0xf5, - 0x80, 0x31, 0xe0, 0x0f, 0x48, 0x03, 0xd2, 0x00, - 0xb7, 0x80, 0x2d, 0x20, 0x0c, 0x68, 0x03, 0xd2, - 0x00, 0x77, 0x80, 0x39, 0xe0, 0x0e, 0x78, 0x03, - 0x9e, 0x00, 0xf7, 0xe0, 0x31, 0xe8, 0x2c, 0x7a, - 0x03, 0xde, 0x00, 0xf7, 0x80, 0x2d, 0xe0, 0x0f, - 0x68, 0x0b, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x1d, 0xac, 0x00, 0xfc, 0x00, 0x2f, - 0x00, 0x0e, 0xc0, 0x03, 0x70, 0x00, 0xfc, 0x00, - 0x3e, 0x80, 0x0f, 0x10, 0x02, 0xec, 0x00, 0xf8, - 0x00, 0x3e, 0x80, 0x0f, 0xc0, 0x03, 0xf0, 0x00, - 0xfb, 0x00, 0x3e, 0x00, 0x0f, 0xa0, 0x43, 0xf0, - 0x00, 0xf1, 0x00, 0x32, 0xc0, 0x0e, 0xb0, 0x03, - 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb6, - 0x83, 0xec, 0x00, 0xfb, 0x04, 0x3e, 0x40, 0x0f, - 0x80, 0x03, 0x42, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0xfe, 0x00, 0xfc, 0x80, 0x3f, - 0x20, 0x0f, 0xc8, 0x03, 0xf2, 0x00, 0xec, 0x80, - 0x33, 0xe0, 0x0c, 0xf0, 0x03, 0x1a, 0x00, 0xcf, - 0x80, 0x3d, 0x60, 0xed, 0x09, 0x00, 0x51, 0x00, - 0x0c, 0xf8, 0x03, 0xfe, 0x00, 0xcf, 0x80, 0x3d, - 0x20, 0x0c, 0x78, 0x03, 0xb6, 0x00, 0xcf, 0x80, - 0x33, 0xa0, 0x0c, 0xf8, 0x03, 0xfe, 0x00, 0xff, - 0x80, 0x1f, 0xe0, 0x0d, 0xf8, 0x83, 0x3e, 0x00, - 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xd8, 0x23, 0xc0, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, - 0x9c, 0x00, 0xb4, 0x40, 0x2d, 0x04, 0x0b, 0x40, - 0x02, 0xf0, 0x00, 0x84, 0x00, 0x21, 0xc0, 0x88, - 0x50, 0x02, 0x18, 0x40, 0x96, 0x00, 0x2d, 0x00, - 0x48, 0x50, 0x02, 0xf4, 0x00, 0xd7, 0x11, 0x2d, - 0x00, 0x0d, 0x74, 0x03, 0xf8, 0x00, 0x87, 0x11, - 0x21, 0x40, 0x08, 0x70, 0x03, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x08, 0xf0, 0x03, 0x5c, 0x00, - 0xb7, 0x01, 0x2d, 0x80, 0x0b, 0x70, 0x02, 0xea, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9c, 0x00, 0xb4, 0x00, 0x2d, 0x80, 0x0b, 0x60, - 0x02, 0xd0, 0x00, 0xa4, 0x00, 0x2b, 0x80, 0x08, - 0xf4, 0x02, 0x18, 0x00, 0x95, 0x00, 0x25, 0x40, - 0x28, 0x60, 0x02, 0xd8, 0x00, 0xa7, 0x00, 0x2f, - 0x00, 0x08, 0x79, 0x02, 0x14, 0x00, 0x97, 0x00, - 0x21, 0x80, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x25, 0xc0, 0x09, 0x70, 0x02, 0x1c, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x40, 0x02, 0xc0, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, - 0xcc, 0x00, 0xb0, 0x00, 0x2c, 0x00, 0x0b, 0x00, - 0x02, 0xc0, 0x00, 0x80, 0x00, 0x28, 0x80, 0x08, - 0x10, 0x02, 0x09, 0x20, 0x90, 0x24, 0x2c, 0x00, - 0x08, 0x00, 0x02, 0xc0, 0x05, 0xa3, 0x00, 0x2c, - 0x00, 0x08, 0x30, 0x02, 0xc0, 0x00, 0x93, 0x04, - 0x20, 0xd2, 0x08, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x01, 0x2c, 0xc0, 0x18, 0x30, 0x02, 0x4c, 0x00, - 0xb3, 0x00, 0x2c, 0x2c, 0x0b, 0x04, 0xed, 0x09, - 0x00, 0x52, 0x00, 0x82, 0xc8, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x15, 0xac, 0x00, 0xfb, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xec, 0x00, - 0xeb, 0x00, 0x38, 0xc0, 0x04, 0xa0, 0x03, 0x26, - 0x80, 0x8b, 0x40, 0x36, 0xc0, 0x0c, 0x80, 0x02, - 0xe0, 0x00, 0xab, 0x00, 0x3e, 0x00, 0x08, 0xb0, - 0x02, 0xa0, 0x00, 0xd9, 0x00, 0x30, 0xc0, 0x0c, - 0xb0, 0x03, 0xec, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0d, 0xf0, 0x03, 0x2c, 0x00, 0xfb, 0x00, 0x3e, - 0x30, 0x0f, 0xb4, 0x03, 0xea, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0x00, 0xfd, - 0x40, 0x3f, 0x50, 0x4f, 0xd4, 0x03, 0xf5, 0x00, - 0xfd, 0x40, 0x96, 0xe0, 0x0f, 0x84, 0x03, 0xe4, - 0x08, 0xea, 0x00, 0x3e, 0x80, 0x0f, 0xc0, 0x03, - 0xf0, 0x00, 0xdb, 0x00, 0x3e, 0x20, 0x0f, 0xb0, - 0x02, 0x78, 0x00, 0xeb, 0x00, 0x3e, 0x60, 0x0f, - 0xb0, 0x03, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0x40, 0x0f, 0xa4, 0x03, 0xe0, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, 0x00, 0xfe, - 0x80, 0x3f, 0x80, 0x0f, 0xe0, 0x03, 0x3a, 0x00, - 0xfe, 0x80, 0x3f, 0x80, 0x0c, 0xe0, 0x03, 0xf4, - 0x00, 0xfd, 0x00, 0x3f, 0xc0, 0x2c, 0xc0, 0x03, - 0x30, 0x00, 0xcf, 0x00, 0x37, 0x00, 0x0c, 0xd2, - 0x03, 0x30, 0x10, 0xcd, 0x00, 0x33, 0x80, 0x0c, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3e, 0xc0, - 0x0f, 0xf0, 0x03, 0x3c, 0x00, 0xff, 0x01, 0x3f, - 0x80, 0x0c, 0xf0, 0x03, 0xc0, 0x44, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, 0xb8, - 0x00, 0x2e, 0x00, 0xcb, 0x80, 0x0a, 0x20, 0x00, - 0xb8, 0x00, 0x2e, 0x80, 0x08, 0x80, 0x02, 0x64, - 0x10, 0xb8, 0x00, 0x2c, 0x80, 0x08, 0x80, 0x0b, - 0x20, 0xed, 0x09, 0x00, 0x53, 0x00, 0x00, 0xc3, - 0x01, 0x20, 0x00, 0x08, 0x18, 0x02, 0xa0, 0x00, - 0x83, 0x04, 0x22, 0x80, 0x08, 0xb0, 0x02, 0xec, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xac, 0x00, 0xbb, 0x00, 0x2e, 0x7c, 0x08, 0x84, - 0x02, 0xe0, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x05, 0x2c, 0x00, 0xbb, 0x10, 0x2e, 0x50, - 0x0b, 0x14, 0x02, 0x2d, 0x80, 0xbb, 0x60, 0x2e, - 0xc0, 0x08, 0xa0, 0x82, 0xe2, 0x01, 0xbb, 0x02, - 0x6e, 0x40, 0x08, 0x30, 0x02, 0x0c, 0x00, 0xab, - 0x00, 0x26, 0x00, 0x0a, 0x90, 0x02, 0x04, 0x00, - 0x8b, 0x80, 0x22, 0xa0, 0x0a, 0xb0, 0x02, 0xec, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0x30, 0x02, - 0x2c, 0x00, 0xbb, 0x00, 0x2c, 0x00, 0x08, 0x94, - 0x02, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x0c, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0x04, 0x10, 0xb1, 0x00, 0x2e, - 0xc0, 0x08, 0x00, 0x02, 0x40, 0x00, 0xb2, 0x00, - 0x6c, 0x00, 0x08, 0x10, 0x02, 0x44, 0x00, 0xa3, - 0x00, 0x22, 0x00, 0x08, 0x10, 0x02, 0x88, 0x00, - 0x83, 0x80, 0x22, 0x20, 0x0a, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x4b, 0x30, 0x02, - 0x8c, 0x00, 0xb3, 0x00, 0x2c, 0x00, 0x08, 0x20, - 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0d, 0x6c, 0x00, 0xfa, 0x00, 0x3e, 0x80, - 0x0f, 0xa0, 0x03, 0x28, 0x00, 0xf2, 0x00, 0x2e, - 0x80, 0x88, 0xa0, 0x03, 0xe0, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0c, 0xa0, 0x03, 0x28, 0x00, 0xeb, - 0x00, 0x36, 0x00, 0x8c, 0x90, 0x03, 0x24, 0x00, - 0xcb, 0x00, 0x32, 0x40, 0x0e, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xf0, 0x03, - 0x2c, 0x00, 0xfb, 0x00, 0x3e, 0x80, 0x2c, 0x90, - 0x03, 0xc0, 0x03, 0x50, 0xed, 0x09, 0x00, 0x54, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, - 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, - 0xf0, 0x00, 0xfc, 0x00, 0x3d, 0x80, 0x0f, 0x40, - 0x03, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, - 0xc0, 0x03, 0xb0, 0x00, 0xcf, 0x00, 0x3f, 0x00, - 0x0f, 0xd0, 0x03, 0xf0, 0x00, 0xf7, 0x00, 0x3d, - 0x40, 0x0d, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x08, 0xff, - 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, 0xe8, 0x02, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x05, 0xfc, - 0x00, 0xff, 0x20, 0x3b, 0xc0, 0x0f, 0xd1, 0x03, - 0xf8, 0x00, 0xff, 0x00, 0x33, 0xc0, 0x0d, 0xf1, - 0x03, 0xfc, 0x00, 0xdf, 0x0a, 0x3f, 0x00, 0x8e, - 0xc0, 0x01, 0xf0, 0xc0, 0xfc, 0x30, 0x33, 0x04, - 0x8f, 0xc0, 0x03, 0xdc, 0xa0, 0xfc, 0x30, 0x23, - 0xd0, 0x0c, 0xf0, 0x03, 0x70, 0x08, 0xcc, 0x40, - 0x3f, 0xcc, 0x0f, 0xd0, 0x23, 0xf0, 0x02, 0xcc, - 0x10, 0x3d, 0xca, 0x0c, 0xf0, 0x03, 0xf0, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0xec, - 0x08, 0xbb, 0x50, 0x22, 0xc0, 0x0b, 0xb2, 0x02, - 0xe8, 0x00, 0xbf, 0x40, 0xa3, 0xd4, 0x00, 0xb0, - 0x02, 0xfd, 0x00, 0xdb, 0x00, 0x2e, 0x00, 0x08, - 0xa0, 0x00, 0xe0, 0x80, 0xb0, 0x02, 0x22, 0x00, - 0x0b, 0x84, 0x02, 0xed, 0x04, 0xb8, 0x70, 0x2a, - 0x80, 0x0a, 0xb0, 0x12, 0xac, 0x00, 0xa8, 0x20, - 0x2e, 0xd4, 0x0b, 0x84, 0x82, 0xe1, 0x20, 0x88, - 0x22, 0x2e, 0xd0, 0x08, 0xb0, 0x02, 0xe0, 0x06, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, - 0x00, 0xb3, 0x00, 0x28, 0xc0, 0x0b, 0x10, 0x02, - 0xc8, 0x00, 0xb3, 0x40, 0x20, 0xc0, 0x41, 0x32, - 0x02, 0xcd, 0x00, 0xa2, 0x00, 0x2c, 0x80, 0x0a, - 0x10, 0x46, 0x80, 0xc0, 0xb0, 0x61, 0xa0, 0xed, - 0x09, 0x00, 0x55, 0x00, 0x18, 0x8b, 0x01, 0x02, - 0xcc, 0x00, 0x90, 0x00, 0x22, 0xc8, 0x08, 0xb0, - 0x02, 0x6c, 0x00, 0xa0, 0x40, 0x2c, 0xc8, 0x0b, - 0x13, 0x02, 0xe1, 0x80, 0x90, 0x00, 0x6c, 0xc0, - 0x08, 0x30, 0x02, 0xe2, 0x01, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x15, 0xac, 0x00, 0xbb, 0x00, - 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xe9, 0x00, 0xbb, - 0x00, 0x22, 0xc0, 0x08, 0xb0, 0x82, 0xec, 0x00, - 0xbb, 0x80, 0x2e, 0xa0, 0x08, 0xb8, 0x02, 0xe2, - 0x00, 0x99, 0x80, 0x22, 0x22, 0x1b, 0x88, 0x02, - 0xec, 0x00, 0xb8, 0x80, 0x2a, 0x84, 0x0a, 0x90, - 0x22, 0xac, 0x24, 0xa8, 0x80, 0x2e, 0xc0, 0x0b, - 0x98, 0x02, 0xe8, 0xa0, 0x9a, 0x15, 0x2e, 0xc0, - 0x08, 0xb0, 0x02, 0xf0, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x15, 0xec, 0x00, 0xfb, 0x00, - 0x3a, 0xc0, 0x0f, 0xb8, 0x03, 0xef, 0x00, 0xfb, - 0x01, 0x32, 0xc0, 0x8d, 0xb0, 0x03, 0xec, 0x00, - 0xeb, 0x80, 0x3e, 0xb0, 0x0e, 0xa8, 0x03, 0xa3, - 0x80, 0xf8, 0x83, 0x32, 0x20, 0x0f, 0x8c, 0x23, - 0xec, 0x00, 0xf8, 0xc8, 0x32, 0xc0, 0x0c, 0x38, - 0x11, 0x4e, 0x00, 0xe8, 0xc0, 0x3e, 0xc0, 0x8f, - 0x98, 0x03, 0xeb, 0x00, 0xda, 0xc8, 0x3e, 0xc0, - 0x2c, 0xb0, 0x03, 0xd0, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x01, 0xbc, 0x00, 0xf7, 0x00, - 0x3f, 0xc0, 0x0f, 0xdc, 0x03, 0xf2, 0x40, 0xf7, - 0x00, 0x3d, 0xc0, 0x8f, 0xe9, 0x03, 0xfc, 0x00, - 0xdf, 0x00, 0x3c, 0x80, 0x0f, 0xe0, 0x23, 0xf0, - 0x00, 0xf5, 0x00, 0x3f, 0x40, 0x0b, 0xd0, 0x03, - 0xfc, 0x20, 0x7d, 0x00, 0x3f, 0x61, 0x0f, 0xdc, - 0x13, 0x77, 0x04, 0x9c, 0x00, 0x3e, 0xc1, 0x0f, - 0xc0, 0x03, 0xf8, 0x00, 0xef, 0x80, 0x3d, 0xc0, - 0x0d, 0xf0, 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x56, 0x00, 0x40, - 0x10, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xe8, 0x00, 0xdb, 0x10, 0x3e, 0xc0, - 0x0f, 0x94, 0x03, 0xac, 0x00, 0xcb, 0xa0, 0x3a, - 0x90, 0x2e, 0xb0, 0x03, 0x20, 0x10, 0xf8, 0x44, - 0x3a, 0x50, 0x0e, 0x90, 0x03, 0xec, 0x00, 0xc9, - 0x40, 0x36, 0xc0, 0x0c, 0xb2, 0x43, 0x29, 0x00, - 0xc8, 0x04, 0x3e, 0xc0, 0x0c, 0x90, 0x83, 0x29, - 0x0c, 0xfb, 0x00, 0x3e, 0xc1, 0x0c, 0xb0, 0x03, - 0xd0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0xc8, - 0x05, 0x2c, 0x00, 0xbf, 0x00, 0x2e, 0xc0, 0x0b, - 0x90, 0x02, 0xeb, 0x00, 0x8f, 0xc0, 0x2f, 0xc0, - 0x0b, 0xb0, 0x02, 0x1e, 0x82, 0x8b, 0xc4, 0x02, - 0x80, 0x08, 0xa4, 0x02, 0x20, 0x00, 0xb9, 0x00, - 0x2a, 0x40, 0x1b, 0x92, 0x02, 0xfc, 0x00, 0x89, - 0xc0, 0x2c, 0xc0, 0x0a, 0x9c, 0x03, 0x6e, 0x00, - 0x89, 0x02, 0x2f, 0xc0, 0x0d, 0x94, 0x02, 0x88, - 0x00, 0xbb, 0x00, 0x2f, 0xd0, 0x08, 0xb0, 0x02, - 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x05, 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcb, 0x24, 0xb3, 0xa0, 0x24, 0xc0, - 0x09, 0x30, 0x02, 0x8e, 0x00, 0x81, 0x00, 0x20, - 0xe8, 0x08, 0x22, 0x02, 0x40, 0x00, 0xb0, 0x00, - 0x20, 0x00, 0x0a, 0x0e, 0x02, 0x8d, 0x00, 0x88, - 0xf0, 0x6c, 0xc1, 0x08, 0x3d, 0x02, 0x8d, 0x80, - 0x20, 0x01, 0x2c, 0xc0, 0x08, 0x08, 0x02, 0x08, - 0x00, 0xb0, 0x00, 0x2c, 0xc8, 0x08, 0x30, 0x02, - 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x01, 0x1e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, - 0x78, 0x02, 0xfa, 0x20, 0x87, 0x80, 0x2d, 0xe0, - 0x0b, 0x71, 0x02, 0x0e, 0x00, 0x97, 0x80, 0x25, - 0xe4, 0x08, 0x68, 0x02, 0x12, 0x08, 0xb4, 0x80, - 0x29, 0xe4, 0x0b, 0x58, 0x02, 0xed, 0x09, 0x00, - 0x57, 0x00, 0xde, 0x20, 0x07, 0x80, 0x2d, 0xe0, - 0x0a, 0x78, 0x06, 0xfa, 0x20, 0x84, 0x80, 0x2d, - 0xec, 0x09, 0x68, 0x02, 0x9a, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x08, 0x78, 0x02, 0xc8, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x0c, 0x00, - 0xf3, 0x00, 0x3c, 0xc0, 0x0f, 0x30, 0x03, 0xc8, - 0x00, 0xf3, 0x10, 0x3c, 0xc0, 0x0f, 0xb1, 0x03, - 0x8c, 0x40, 0xc8, 0x00, 0xb0, 0xd7, 0x1e, 0xb0, - 0x03, 0x4c, 0x00, 0xf3, 0x40, 0x20, 0xc0, 0x0e, - 0x34, 0x03, 0xcc, 0x58, 0x83, 0x00, 0x36, 0xd0, - 0x0c, 0x11, 0x43, 0x84, 0x80, 0xe0, 0x40, 0x3c, - 0xc8, 0x1c, 0xa0, 0x8b, 0x04, 0x80, 0xf1, 0x04, - 0x3c, 0xc0, 0x2c, 0x30, 0x03, 0xd2, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x00, - 0xff, 0x02, 0x3f, 0xc0, 0x8f, 0xf0, 0x03, 0xd8, - 0x40, 0xff, 0x44, 0x3f, 0xd4, 0x0f, 0xf0, 0x03, - 0xfc, 0x40, 0xef, 0x10, 0x3b, 0xc4, 0x0f, 0xf1, - 0x23, 0xbc, 0x04, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x10, 0x7f, 0x00, 0x27, 0xc0, - 0x0f, 0x50, 0x03, 0x5c, 0x08, 0xfd, 0x12, 0x3f, - 0xc9, 0x0f, 0xe1, 0x01, 0x7c, 0x00, 0xff, 0x10, - 0x3f, 0xc6, 0x0f, 0xf0, 0x03, 0xd0, 0x06, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc4, 0x0f, 0xb0, 0x03, - 0xec, 0x80, 0xf1, 0x00, 0xb2, 0xe0, 0x0c, 0xa0, - 0x07, 0x6c, 0x00, 0xfb, 0x02, 0x3a, 0x00, 0x2c, - 0x28, 0x03, 0x2c, 0x40, 0xfa, 0x00, 0x16, 0xe0, - 0x0c, 0x90, 0x03, 0xce, 0x00, 0xc8, 0x00, 0x22, - 0xc0, 0x0d, 0xb0, 0x03, 0xec, 0x00, 0xc2, 0x00, - 0x12, 0xc0, 0x0f, 0xb0, 0x03, 0xea, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, 0x00, - 0xed, 0x09, 0x00, 0x58, 0x00, 0xb7, 0x40, 0x2d, - 0xc0, 0x0b, 0x70, 0x20, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc8, 0x0b, 0x70, 0x22, 0xdd, 0xa0, 0xb7, - 0x00, 0x29, 0x80, 0x48, 0x60, 0x02, 0xdc, 0x00, - 0xb7, 0x05, 0x6d, 0xc0, 0x08, 0x70, 0x03, 0x5c, - 0x00, 0xb7, 0x00, 0x3d, 0xc1, 0x0d, 0x50, 0x02, - 0xdc, 0x00, 0xa6, 0x04, 0x2b, 0xc0, 0x0a, 0x70, - 0x42, 0xfc, 0x00, 0x87, 0x00, 0x29, 0xc8, 0x0b, - 0x70, 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x00, 0x9e, 0x00, 0xb7, 0xa0, 0x2d, - 0xe0, 0x4b, 0x78, 0x30, 0xda, 0x04, 0xb7, 0x90, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x80, 0xbd, - 0x80, 0x20, 0xe0, 0x08, 0x78, 0x02, 0xde, 0x00, - 0xb7, 0x81, 0x2d, 0xe0, 0x00, 0x78, 0x82, 0x1e, - 0x80, 0x37, 0x80, 0x2d, 0xe0, 0x09, 0x5c, 0x02, - 0xde, 0x20, 0x80, 0x80, 0x61, 0xe4, 0x08, 0x7c, - 0x06, 0xde, 0x22, 0x8f, 0x80, 0x21, 0xe8, 0x0b, - 0x78, 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x14, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0xb8, 0x02, 0x48, 0x80, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x3e, 0x02, 0xcc, 0x00, 0xb3, - 0x08, 0x28, 0xf0, 0x08, 0xbc, 0x02, 0xee, 0x80, - 0xb3, 0x10, 0x2c, 0xd0, 0x08, 0x38, 0x02, 0x4c, - 0x01, 0xb3, 0x90, 0x28, 0xc4, 0x49, 0x10, 0x02, - 0xc2, 0x20, 0xab, 0x42, 0x28, 0xc0, 0x0a, 0x3c, - 0x02, 0xcd, 0x08, 0x8b, 0xc2, 0x28, 0xc0, 0x0b, - 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xe8, 0x15, 0xa8, 0x00, 0xfa, 0x00, 0x3e, - 0x80, 0x0f, 0xaa, 0x03, 0xf8, 0x80, 0xfa, 0x00, - 0x3e, 0x80, 0x0f, 0xee, 0x03, 0xe8, 0x00, 0xfe, - 0x40, 0x33, 0x94, 0x0c, 0xe5, 0x03, 0x78, 0x10, - 0xfe, 0x10, 0x3f, 0x80, 0x0c, 0xe1, 0x23, 0x28, - 0x08, 0xfe, 0x10, 0xed, 0x09, 0x00, 0x59, 0x00, - 0x27, 0x90, 0x0d, 0xa8, 0x03, 0xf9, 0x00, 0xce, - 0x00, 0x32, 0x80, 0x0c, 0xe0, 0x03, 0xfb, 0x00, - 0xce, 0x80, 0x32, 0x80, 0x0f, 0xa0, 0x03, 0xfa, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xe1, 0x00, 0xf0, 0x40, 0x3e, 0x00, 0x0f, - 0x80, 0x13, 0xe0, 0x00, 0xb8, 0x40, 0x3e, 0x14, - 0x2f, 0x85, 0x01, 0xe0, 0x40, 0xf8, 0x00, 0x3e, - 0x08, 0x0f, 0x80, 0x03, 0xe0, 0x10, 0xf8, 0x00, - 0x36, 0x20, 0x0f, 0x84, 0x03, 0xe0, 0x00, 0xf8, - 0x20, 0x3e, 0x00, 0x0f, 0x80, 0x83, 0xe0, 0x20, - 0xf8, 0x32, 0x3e, 0x00, 0x4f, 0x80, 0x03, 0xd2, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0x06, 0x00, 0xc9, 0x20, 0x32, 0x40, 0x8f, - 0x90, 0x03, 0xa5, 0x04, 0xd9, 0x80, 0x32, 0x50, - 0x4f, 0x98, 0x23, 0x24, 0x00, 0xc9, 0x00, 0x3c, - 0x40, 0x06, 0x90, 0x07, 0xe6, 0x00, 0xf9, 0x10, - 0x3e, 0x40, 0x0f, 0x9c, 0x03, 0xa6, 0x44, 0x79, - 0x01, 0x30, 0x40, 0x8c, 0x90, 0x03, 0xc4, 0x02, - 0xc9, 0x00, 0x30, 0x60, 0x0c, 0x90, 0x03, 0xc2, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, - 0x64, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0x27, 0x00, 0xd9, 0x40, 0xa2, 0x40, 0x89, - 0x90, 0x22, 0x24, 0x00, 0xb9, 0xf0, 0x22, 0x40, - 0x0b, 0x90, 0x02, 0x24, 0x00, 0x89, 0x00, 0x2e, - 0x40, 0x0a, 0x90, 0x02, 0xe6, 0xc0, 0xb9, 0x80, - 0x0e, 0x40, 0x0b, 0x14, 0x02, 0x26, 0x20, 0xb9, - 0x00, 0x32, 0x40, 0x0a, 0x9a, 0x02, 0xe4, 0x00, - 0x89, 0x00, 0x22, 0x40, 0x08, 0x90, 0x02, 0xe0, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, - 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0xed, 0x09, - 0x00, 0x5a, 0x00, 0x0b, 0x90, 0x02, 0x24, 0x40, - 0x89, 0x40, 0x22, 0x40, 0x0b, 0x10, 0x02, 0xe4, - 0x00, 0xb1, 0x00, 0x22, 0x40, 0x0b, 0xb1, 0x02, - 0x24, 0x00, 0x89, 0x00, 0x2e, 0x40, 0x00, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x8b, - 0x90, 0x92, 0xe4, 0x04, 0xb9, 0x00, 0x22, 0x40, - 0x08, 0xb2, 0x42, 0xe4, 0x08, 0x89, 0x00, 0x22, - 0x54, 0x08, 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x00, 0xb1, - 0x28, 0x6c, 0x40, 0x0b, 0x10, 0x02, 0x84, 0xa0, - 0x91, 0x28, 0x20, 0x4a, 0x09, 0x12, 0x82, 0x44, - 0xa0, 0xb1, 0x28, 0xa0, 0xd0, 0x0b, 0x34, 0x0a, - 0x85, 0x02, 0x81, 0x2a, 0x2c, 0x4a, 0x0a, 0x12, - 0x92, 0xc4, 0xa0, 0xb1, 0x28, 0x24, 0x51, 0x0b, - 0x90, 0x02, 0x44, 0x00, 0xb1, 0x40, 0xa0, 0x50, - 0x8a, 0x14, 0x02, 0xc5, 0x00, 0x81, 0x40, 0xa0, - 0x40, 0x28, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x60, 0x00, 0xf8, - 0x20, 0x3e, 0x00, 0x0f, 0x80, 0x0b, 0x28, 0x80, - 0xc8, 0x20, 0x32, 0x08, 0x0f, 0x82, 0x43, 0xe0, - 0x84, 0xd8, 0x20, 0x32, 0x00, 0x0f, 0x80, 0x43, - 0x20, 0x00, 0xc8, 0x20, 0x3c, 0x08, 0x0c, 0x82, - 0x02, 0xe0, 0x80, 0xfa, 0x21, 0x3c, 0x00, 0x8f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x32, 0x00, - 0x0c, 0x80, 0x01, 0xe0, 0x00, 0xc8, 0x00, 0x32, - 0x00, 0x0c, 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x1d, 0xe4, 0x10, 0xb9, - 0x00, 0x3e, 0x40, 0x0f, 0xd2, 0xa3, 0x74, 0xa0, - 0xf9, 0x28, 0x3e, 0x40, 0x05, 0xd2, 0x83, 0xa4, - 0x00, 0xff, 0x28, 0x3f, 0x51, 0x0f, 0xd4, 0x03, - 0x75, 0x00, 0xff, 0x2c, 0x3f, 0x4b, 0x25, 0xd0, - 0x03, 0xe4, 0x00, 0xfd, 0x28, 0x3f, 0x40, 0x0b, - 0xd0, 0xed, 0x09, 0x00, 0x5b, 0x00, 0x13, 0xb4, - 0x00, 0xfd, 0x44, 0x3a, 0x50, 0x9b, 0xd4, 0x13, - 0xf5, 0x04, 0xfd, 0x03, 0x3e, 0x50, 0x0f, 0x90, - 0x03, 0xe6, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0xe4, 0x00, 0xf9, 0x20, 0x36, 0x40, - 0x0d, 0x90, 0x03, 0xf4, 0x40, 0xcd, 0x20, 0x3e, - 0x4a, 0x0d, 0x93, 0x03, 0xf4, 0x00, 0xfd, 0x00, - 0x3f, 0x48, 0x0e, 0xd2, 0x93, 0xa4, 0xe0, 0xb9, - 0x30, 0x3e, 0x40, 0x0d, 0xd0, 0x03, 0x34, 0x00, - 0xdd, 0x20, 0x2e, 0x45, 0x0f, 0x50, 0x03, 0x74, - 0x00, 0xfb, 0x30, 0x3e, 0x48, 0x0f, 0xd2, 0xd3, - 0xe4, 0xc0, 0xf9, 0x00, 0x3f, 0x40, 0x0f, 0x90, - 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x10, 0xe0, 0x00, 0xb8, 0x10, 0x2e, 0x00, - 0x0b, 0x80, 0x82, 0xe0, 0x40, 0x88, 0x28, 0x2e, - 0x00, 0x88, 0x83, 0x12, 0xe1, 0x00, 0xb8, 0x08, - 0x2e, 0x0a, 0x08, 0x82, 0x02, 0x20, 0x80, 0x98, - 0x30, 0x2e, 0x12, 0x0b, 0x80, 0x02, 0xa0, 0x50, - 0xf8, 0x28, 0x6e, 0x08, 0x8b, 0x80, 0x02, 0x20, - 0x00, 0xe8, 0x00, 0x2c, 0x0a, 0x0b, 0xa2, 0x02, - 0xe0, 0xc4, 0xb8, 0x08, 0x2e, 0x00, 0x0b, 0x80, - 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x05, 0xc4, 0x00, 0xb1, 0x00, 0x24, 0x40, - 0x08, 0x10, 0x02, 0xc4, 0x08, 0x83, 0x30, 0x2c, - 0x40, 0x09, 0x1a, 0x02, 0xc4, 0x40, 0xb1, 0x10, - 0x2c, 0x4c, 0x0a, 0x12, 0x82, 0x84, 0x80, 0xb1, - 0x20, 0x2c, 0x4c, 0x0b, 0x11, 0x02, 0x44, 0x00, - 0xb1, 0x30, 0x2c, 0x49, 0x4b, 0x10, 0x42, 0x44, - 0x00, 0x91, 0x90, 0x2c, 0x4c, 0x0b, 0x12, 0x82, - 0xc4, 0x80, 0xb1, 0x20, 0x2c, 0x45, 0x0b, 0x10, - 0x02, 0xc2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x15, 0xa4, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0x65, 0xed, 0x09, 0x00, 0x5c, - 0x00, 0x80, 0x89, 0x00, 0x2e, 0x40, 0x08, 0x92, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x26, 0xd0, 0x08, - 0x90, 0x02, 0x25, 0x00, 0x99, 0x00, 0x2e, 0x46, - 0x0b, 0x95, 0x02, 0xa4, 0x04, 0xa9, 0x20, 0x2e, - 0x40, 0x0b, 0x92, 0x02, 0x24, 0x40, 0xa9, 0x00, - 0x2e, 0x40, 0x4b, 0x90, 0x00, 0xe4, 0x24, 0xb9, - 0xc0, 0x2e, 0x40, 0x8b, 0x90, 0x42, 0xc6, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe4, - 0x00, 0xf9, 0x00, 0x36, 0x40, 0x0d, 0x90, 0x03, - 0xe4, 0x02, 0xc9, 0x00, 0x3e, 0x40, 0x0d, 0x98, - 0x13, 0xe4, 0x00, 0xf9, 0x40, 0x3e, 0x50, 0x0e, - 0x92, 0x03, 0xa4, 0x40, 0xf9, 0x80, 0x3e, 0x70, - 0x07, 0x10, 0x03, 0x24, 0x00, 0xb9, 0x22, 0x6e, - 0x44, 0x0f, 0x10, 0x03, 0x65, 0x80, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x94, 0x03, 0xe6, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe8, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0xa4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xc6, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x07, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x1e, 0x70, 0x2b, - 0x90, 0x83, 0xe6, 0x00, 0xd9, 0xa0, 0x3e, 0x60, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x01, 0x7e, - 0x60, 0x0f, 0x90, 0x02, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x99, 0x93, 0xe5, 0x00, 0xf9, - 0x00, 0x7e, 0x40, 0x0f, 0x90, 0x03, 0xca, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0xa0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0e, 0x80, 0x03, - 0xe3, 0x00, 0xf8, 0x00, 0x3c, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x10, 0xf8, 0x90, 0x36, 0x00, 0x0c, - 0x84, 0x03, 0x60, 0x10, 0xf8, 0x00, 0x3e, 0x10, - 0x2d, 0x84, 0x03, 0xe2, 0x40, 0xf8, 0x01, 0x3a, - 0x00, 0x4e, 0x80, 0x03, 0xa0, 0x00, 0xf8, 0xed, - 0x09, 0x00, 0x5d, 0x00, 0x00, 0x3a, 0x00, 0x0c, - 0x84, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x04, - 0x0f, 0x80, 0x01, 0xca, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x01, 0x28, 0x00, 0xba, 0x00, - 0x2e, 0x80, 0x0e, 0xa0, 0x06, 0xfa, 0x00, 0xbe, - 0x00, 0x26, 0x80, 0x0b, 0xa0, 0x02, 0xea, 0x00, - 0xbe, 0x00, 0x37, 0x84, 0x18, 0xe8, 0x02, 0x28, - 0x00, 0xba, 0x00, 0x3a, 0x80, 0x08, 0xe4, 0x02, - 0xf9, 0x00, 0xde, 0x00, 0x2e, 0x80, 0x4b, 0xe9, - 0x12, 0x38, 0x60, 0xba, 0x00, 0x2e, 0x80, 0x08, - 0xe0, 0x02, 0xe8, 0x00, 0xba, 0x00, 0x3b, 0x80, - 0x0b, 0xa0, 0x02, 0xca, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x05, 0x4c, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x12, 0xce, 0x00, 0xb3, - 0x60, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc6, 0x00, - 0x83, 0x00, 0x22, 0xd0, 0x48, 0xbc, 0x4a, 0x4c, - 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x0a, 0x38, 0xb2, - 0xc2, 0x08, 0xb3, 0x0c, 0x28, 0xc0, 0x0b, 0x2d, - 0x06, 0x88, 0x00, 0xb3, 0x00, 0x28, 0xc0, 0x08, - 0x38, 0x02, 0xcc, 0x11, 0xb3, 0x00, 0x28, 0xc0, - 0x0b, 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x01, 0x1c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x20, 0xb7, - 0x00, 0x25, 0xc0, 0x0b, 0x72, 0x00, 0xdc, 0x20, - 0xb3, 0x84, 0x24, 0x80, 0x48, 0x34, 0x02, 0x1c, - 0xd0, 0xb7, 0x20, 0x29, 0xe8, 0x0b, 0x70, 0x82, - 0xda, 0x00, 0x17, 0x00, 0x0d, 0xc0, 0x0b, 0x60, - 0x36, 0x18, 0x01, 0xb7, 0x20, 0x2d, 0xe0, 0x08, - 0x70, 0x82, 0xdc, 0x00, 0xb7, 0x00, 0x29, 0xc0, - 0x0b, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x00, 0xf7, 0x80, - 0x3d, 0xe0, 0x0f, 0x7a, 0x02, 0xde, 0x00, 0xf7, - 0x80, 0x3d, 0xed, 0x09, 0x00, 0x5e, 0x00, 0xe0, - 0x0f, 0x78, 0x02, 0xde, 0x00, 0xf7, 0x80, 0x35, - 0xe0, 0x08, 0x78, 0x0b, 0x5e, 0x40, 0xf7, 0xe0, - 0x3b, 0xea, 0x0f, 0x78, 0x03, 0xda, 0x00, 0xf7, - 0x80, 0x19, 0xec, 0x0e, 0x68, 0x02, 0x9a, 0x09, - 0xf7, 0x81, 0x39, 0xf8, 0x2c, 0x68, 0x03, 0xde, - 0x00, 0xf7, 0xa4, 0x39, 0xe0, 0x0f, 0x78, 0x03, - 0xea, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x1d, 0xac, 0x00, 0xbb, 0x00, 0x3e, 0xc0, 0x0e, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb2, 0x03, 0x64, 0x00, 0xfb, 0x00, 0x1e, - 0xc0, 0x2f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x46, - 0x3a, 0xcc, 0x8c, 0xb0, 0x03, 0xc8, 0x00, 0xf9, - 0x00, 0x3e, 0xd8, 0x4f, 0xb0, 0x03, 0xe8, 0x00, - 0xfb, 0x10, 0x3e, 0xd8, 0x0f, 0xa0, 0x03, 0xec, - 0x00, 0xfb, 0x14, 0x3a, 0x80, 0x0f, 0xb0, 0x03, - 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0xfe, 0x00, 0xff, 0x80, 0x3b, 0xe0, 0x0f, - 0xf8, 0x83, 0x3e, 0x00, 0xcf, 0x80, 0x33, 0xe0, - 0x0f, 0xfc, 0x83, 0x3e, 0x00, 0xcf, 0x80, 0x33, - 0xe0, 0x8f, 0xe8, 0x43, 0xfe, 0x40, 0xcf, 0xc0, - 0x3f, 0xe0, 0x0f, 0xe9, 0x03, 0x3a, 0x00, 0xff, - 0x81, 0x37, 0xe2, 0x0d, 0xe8, 0x03, 0xfa, 0x40, - 0xcf, 0x80, 0x33, 0xf1, 0x0c, 0xf8, 0x03, 0x3e, - 0x20, 0xcf, 0x90, 0x33, 0xe0, 0x2c, 0xf8, 0x03, - 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x21, 0xc0, 0x0b, - 0x70, 0x82, 0x19, 0x00, 0x8d, 0x00, 0x21, 0xc4, - 0x0b, 0x70, 0x02, 0x1c, 0x00, 0x8e, 0x00, 0x21, - 0xc0, 0x0b, 0x62, 0x02, 0xdc, 0x48, 0xf7, 0x10, - 0x2d, 0xc8, 0x0f, 0x50, 0x21, 0xdc, 0x10, 0xe7, - 0x00, 0x21, 0xc0, 0x4b, 0x66, 0x02, 0xd8, 0x21, - 0xaf, 0x00, 0x37, 0xc0, 0x08, 0xed, 0x09, 0x00, - 0x5f, 0x00, 0x74, 0x43, 0x7c, 0x44, 0x8f, 0x18, - 0x21, 0xc0, 0x08, 0x70, 0x02, 0xea, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, - 0xb7, 0x00, 0x29, 0xc0, 0x0b, 0xf0, 0x02, 0x1c, - 0x20, 0x87, 0x00, 0x21, 0xc0, 0x0b, 0x31, 0x02, - 0x1c, 0x00, 0x87, 0x18, 0x21, 0xc4, 0x0b, 0x60, - 0x12, 0xdc, 0x41, 0xb7, 0x00, 0x2d, 0xc1, 0x1b, - 0x64, 0x08, 0x98, 0x00, 0xb6, 0x00, 0x23, 0xc0, - 0x08, 0x40, 0x92, 0xd8, 0x00, 0x87, 0x00, 0x21, - 0xc0, 0x09, 0x60, 0x02, 0x1c, 0x00, 0x97, 0x42, - 0x61, 0x40, 0x08, 0x70, 0x02, 0xc0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, 0xcc, 0x00, - 0xb3, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x0a, 0x2f, - 0x00, 0x83, 0x00, 0x20, 0xc0, 0x0b, 0x34, 0x02, - 0x0c, 0x00, 0x83, 0x60, 0x20, 0xc8, 0x0b, 0x2a, - 0x02, 0xcc, 0x00, 0x8b, 0x41, 0x2c, 0xf0, 0x0a, - 0x10, 0x06, 0x4c, 0x09, 0xa0, 0x20, 0x20, 0xe8, - 0x2b, 0x18, 0x02, 0xcb, 0x00, 0xa3, 0xc0, 0x24, - 0xc0, 0x09, 0x0c, 0x02, 0x0e, 0x08, 0x93, 0x00, - 0x20, 0x00, 0x08, 0x30, 0x02, 0xc8, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, 0xac, 0x00, - 0xfb, 0x00, 0x3a, 0xc0, 0x0f, 0xf0, 0x03, 0x2e, - 0x00, 0xcb, 0x00, 0x32, 0xc0, 0x0f, 0xf4, 0x03, - 0x2c, 0x02, 0xcb, 0x80, 0x32, 0x80, 0x0f, 0xaa, - 0x13, 0xfc, 0x00, 0xbf, 0x00, 0x3f, 0xe0, 0x0b, - 0x90, 0x02, 0xa8, 0x00, 0xf9, 0x80, 0xb3, 0xf8, - 0x0d, 0xa8, 0x02, 0xeb, 0x00, 0xcf, 0x40, 0x33, - 0xc0, 0x2d, 0x91, 0x82, 0x3e, 0x80, 0xdf, 0x80, - 0x30, 0x00, 0x0c, 0xb0, 0x03, 0xea, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x10, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xba, 0x03, - 0xed, 0x09, 0x00, 0x60, 0x00, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0x90, 0x0f, 0xb4, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc6, 0x1f, 0xa0, 0x03, 0xa9, - 0x00, 0xe8, 0x50, 0x3a, 0xc0, 0x0e, 0x80, 0x07, - 0xe1, 0x84, 0xfb, 0x30, 0x36, 0xc0, 0x0e, 0x84, - 0x03, 0xec, 0x00, 0xeb, 0x04, 0x3e, 0x00, 0x0f, - 0xb0, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x10, 0xfc, 0x00, 0xfb, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x20, 0xce, 0x10, - 0x33, 0xc0, 0x0f, 0x70, 0x03, 0x2f, 0x00, 0xfd, - 0x00, 0x33, 0x80, 0x0f, 0xf0, 0x43, 0xdc, 0x00, - 0xcf, 0x08, 0x37, 0xc0, 0x0f, 0x98, 0x03, 0x98, - 0x84, 0xc9, 0x00, 0x3f, 0xc0, 0x0f, 0xe9, 0x33, - 0xbe, 0x00, 0xff, 0x01, 0x3f, 0xc0, 0x0c, 0x90, - 0x03, 0xfc, 0x10, 0xff, 0x00, 0x32, 0x28, 0x0c, - 0xf0, 0x03, 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x81, 0x04, 0x6c, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xed, 0x00, 0x8b, 0x00, - 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0x2c, 0x00, 0xbb, - 0x40, 0x22, 0x30, 0x0b, 0xbc, 0x82, 0xec, 0x00, - 0x8b, 0x00, 0x2a, 0xc1, 0x0e, 0xac, 0x03, 0x2a, - 0x80, 0x88, 0xc8, 0x3a, 0xc0, 0x0b, 0x90, 0x02, - 0xe6, 0x00, 0xfb, 0x00, 0x2e, 0xc0, 0x08, 0x88, - 0x02, 0xec, 0x00, 0xb3, 0x02, 0x2a, 0x22, 0x28, - 0xb0, 0x02, 0xe0, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x05, 0x2c, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xe6, 0x00, 0xa3, 0x00, - 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xa4, 0x00, 0xb3, - 0xc0, 0x22, 0xa0, 0x0b, 0xa8, 0x02, 0xec, 0x01, - 0x8b, 0x01, 0x22, 0xc0, 0x1b, 0x85, 0x02, 0xe8, - 0x00, 0x89, 0x80, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xe9, 0x80, 0xbb, 0x01, 0x28, 0xc0, 0x18, 0x98, - 0x02, 0xec, 0x01, 0xed, 0x09, 0x00, 0x61, 0x00, - 0xbb, 0x00, 0x26, 0x00, 0xc8, 0xb0, 0x02, 0xe0, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xa3, 0x80, 0x20, 0xc0, 0x0b, - 0x30, 0x02, 0x0c, 0x00, 0xb3, 0x00, 0x20, 0x80, - 0x0b, 0x20, 0x42, 0xcc, 0x00, 0x83, 0x00, 0x2c, - 0xc0, 0x0a, 0x00, 0x42, 0x88, 0x02, 0x80, 0x00, - 0x68, 0xc0, 0x0b, 0x10, 0x02, 0xcc, 0x04, 0xb3, - 0x00, 0x0c, 0xc0, 0x28, 0x10, 0x02, 0x4c, 0x00, - 0xbb, 0x00, 0x2c, 0x00, 0x08, 0x30, 0x02, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, - 0x6c, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xcc, 0x00, 0xeb, 0x00, 0x32, 0xc0, 0x0f, - 0xf0, 0x03, 0x2c, 0x00, 0xbb, 0x00, 0x22, 0x80, - 0x0f, 0x80, 0x02, 0xdc, 0x00, 0xcf, 0x00, 0x33, - 0xc0, 0x0b, 0x80, 0x03, 0xec, 0x00, 0xc8, 0x00, - 0x3f, 0xc0, 0x0f, 0x90, 0x03, 0xe0, 0x10, 0xfb, - 0x00, 0x3f, 0xc0, 0x0c, 0x90, 0x03, 0xec, 0x08, - 0xfb, 0x00, 0x36, 0x00, 0x0c, 0xb0, 0x03, 0xc0, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0x70, - 0x23, 0xfc, 0x00, 0xdf, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xf4, 0x00, 0xff, 0x06, 0x1f, 0x00, - 0x4f, 0xc0, 0x03, 0xfc, 0x06, 0x7f, 0x00, 0x3b, - 0xc0, 0x0e, 0xc0, 0x03, 0x3c, 0x00, 0xfc, 0x00, - 0x29, 0xc0, 0x07, 0xd0, 0x03, 0xd4, 0x08, 0xef, - 0x00, 0x3f, 0xc0, 0x0f, 0xd0, 0x23, 0xfc, 0x00, - 0xff, 0x00, 0x3b, 0x00, 0x0f, 0xf0, 0x03, 0xe8, - 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x05, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x00, 0x2c, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xbc, 0x80, 0xff, 0x01, 0xed, 0x09, - 0x00, 0x62, 0x00, 0x33, 0xd0, 0x0b, 0xf0, 0x03, - 0xdc, 0x00, 0xff, 0x00, 0x3d, 0x00, 0x0c, 0xd1, - 0x03, 0xfc, 0x00, 0xcf, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x02, 0xfc, 0x00, 0xdf, 0x00, 0x3f, 0xc0, - 0x06, 0xf0, 0x03, 0xfc, 0x00, 0xdc, 0x34, 0x3b, - 0x06, 0x0c, 0xf0, 0x03, 0xf0, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x10, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0x02, 0x08, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x03, 0xb0, 0x0a, 0xac, - 0x00, 0xbb, 0x28, 0xa2, 0x60, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0xbf, 0xa1, 0x22, 0x01, 0x0b, 0xd6, - 0x22, 0xec, 0x00, 0x9b, 0x00, 0x2f, 0xc0, 0x09, - 0xf0, 0x02, 0xec, 0x00, 0xb9, 0x00, 0x2e, 0xc0, - 0x0b, 0xf0, 0x02, 0xec, 0x00, 0xb8, 0x60, 0x22, - 0x90, 0x08, 0xb0, 0x02, 0xe0, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, 0x00, 0xb3, - 0x00, 0x2e, 0x28, 0x08, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0x8d, - 0x00, 0xb3, 0x20, 0x20, 0x8c, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x08, 0x2a, 0x00, 0x08, 0x16, - 0x02, 0xc8, 0x00, 0x93, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb1, 0x30, 0x24, - 0x40, 0x08, 0x30, 0x42, 0xe2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x15, 0xac, 0x00, 0xbb, - 0x00, 0x2e, 0x20, 0x08, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x05, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xac, - 0x00, 0xbb, 0x00, 0x22, 0xd8, 0x0b, 0xb0, 0x02, - 0xec, 0x01, 0x9b, 0x00, 0x22, 0x08, 0x0a, 0x90, - 0x02, 0xe0, 0x00, 0x9b, 0x04, 0x2e, 0xc0, 0x09, - 0xb0, 0x02, 0xec, 0x00, 0xb9, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xb9, 0x00, 0x22, - 0x80, 0xed, 0x09, 0x00, 0x63, 0x00, 0x08, 0xb0, - 0x00, 0xf0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x15, 0xec, 0x00, 0xfb, 0x00, 0x3c, 0x00, - 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xa4, 0x00, 0xfb, 0x00, - 0x32, 0xc0, 0x07, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3a, 0xb8, 0x0c, 0x90, 0x03, 0xe5, 0x00, - 0xcb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x02, 0xec, - 0x00, 0xdb, 0x00, 0x3e, 0xc0, 0x0e, 0xb0, 0x03, - 0xec, 0x00, 0xf8, 0x08, 0xb2, 0x20, 0x2c, 0xb0, - 0x01, 0xd0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x01, 0xbc, 0x00, 0xff, 0x00, 0x3f, 0x00, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xee, 0x80, 0xff, 0x08, - 0x3e, 0xc0, 0x4f, 0xf0, 0x03, 0xfc, 0x00, 0xf7, - 0x01, 0x3b, 0xa0, 0x8f, 0xd0, 0x03, 0xfc, 0x02, - 0xaf, 0x10, 0x3f, 0xc0, 0x0f, 0xb0, 0x03, 0xfc, - 0x00, 0xfb, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xfc, 0x10, 0x37, 0xe4, 0x0f, 0xf0, - 0x01, 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x10, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0x00, - 0x1e, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x4f, 0xb0, 0x03, 0xac, 0x40, 0xcb, 0x00, - 0x3e, 0xc0, 0x0c, 0xb0, 0x03, 0xac, 0x00, 0xcb, - 0x00, 0x3a, 0xd0, 0x0c, 0x90, 0x03, 0xac, 0x00, - 0xdb, 0x70, 0x3e, 0xc0, 0x0c, 0xb0, 0x03, 0x6c, - 0x00, 0xeb, 0x00, 0x32, 0xc0, 0x0f, 0xb0, 0x03, - 0x6c, 0x00, 0xfb, 0x70, 0x30, 0x60, 0x0c, 0xb0, - 0x03, 0xd0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xc8, 0x05, 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0x38, - 0x08, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0x38, 0x03, 0xec, 0x00, 0xdb, 0x00, - 0x2e, 0xc1, 0x28, 0xb0, 0xed, 0x09, 0x00, 0x64, - 0x00, 0x02, 0xec, 0x00, 0xdf, 0x00, 0x20, 0xc0, - 0x0d, 0xd0, 0x02, 0x2c, 0x00, 0x89, 0x00, 0x2f, - 0xc0, 0x0a, 0xf0, 0x02, 0x2c, 0x00, 0xbb, 0x00, - 0xa2, 0xc0, 0x0b, 0xf0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x22, 0xc4, 0x28, 0xb0, 0x02, 0x72, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4c, - 0x00, 0xb3, 0x00, 0x2c, 0x08, 0x0a, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0x8e, 0x00, 0xab, 0x50, 0x2c, 0xc1, 0x08, - 0x30, 0x02, 0x8c, 0x00, 0x93, 0x00, 0x28, 0x40, - 0x08, 0x10, 0x02, 0xac, 0x01, 0xb3, 0x80, 0x2c, - 0xc0, 0x88, 0x30, 0x02, 0x4c, 0x00, 0x83, 0x00, - 0x20, 0xc0, 0x0b, 0x30, 0x06, 0x4c, 0x00, 0xba, - 0x40, 0x20, 0x00, 0x08, 0x30, 0x02, 0x78, 0x04, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x1e, - 0x00, 0xb7, 0x80, 0x2d, 0x24, 0x08, 0x78, 0x02, - 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x78, - 0x82, 0xde, 0x00, 0x87, 0x80, 0x2d, 0xe4, 0x0a, - 0x78, 0x42, 0xde, 0x00, 0x93, 0x80, 0x27, 0xe0, - 0x19, 0x18, 0x02, 0x1e, 0x04, 0xa7, 0x80, 0x6c, - 0xe0, 0x0a, 0x78, 0x02, 0x1e, 0x00, 0xb5, 0x80, - 0x21, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb2, - 0x81, 0x21, 0x20, 0x80, 0x78, 0x02, 0x48, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x0c, - 0x00, 0xf3, 0x00, 0x2e, 0x00, 0x0a, 0x30, 0x03, - 0xcc, 0x00, 0xf3, 0x00, 0x3c, 0xc4, 0x0b, 0x30, - 0x13, 0x8c, 0x02, 0xa3, 0x04, 0x3c, 0xc0, 0x0c, - 0x30, 0x03, 0x8c, 0x00, 0xd3, 0x00, 0x38, 0x48, - 0x1c, 0x10, 0x03, 0xa9, 0x80, 0xf3, 0x40, 0x3c, - 0xc0, 0x0c, 0x30, 0x03, 0x4c, 0x00, 0xe3, 0x10, - 0x30, 0xc0, 0x0f, 0x30, 0x03, 0x4c, 0x00, 0xf0, - 0x00, 0xb2, 0x4c, 0x04, 0x30, 0x03, 0xd2, 0xed, - 0x09, 0x00, 0x65, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x00, - 0x3f, 0x80, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0x7f, - 0x00, 0x3f, 0xc0, 0x0f, 0x70, 0x03, 0xfc, 0x00, - 0xff, 0x10, 0x3f, 0xc0, 0x0d, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x01, 0x3b, 0xc0, 0x0f, 0xd0, 0x03, - 0xf4, 0x00, 0xdf, 0x00, 0x3f, 0xd0, 0x0f, 0xf0, - 0x03, 0xfc, 0x00, 0xfd, 0x00, 0x3f, 0xc0, 0x07, - 0xf0, 0x03, 0xfc, 0x00, 0xfc, 0x00, 0x3f, 0x04, - 0x0f, 0xf0, 0x02, 0xd0, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x15, 0xec, 0x00, 0xfb, 0x00, - 0x3a, 0x00, 0x2c, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0x30, 0x0b, 0xac, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0c, 0xb0, 0x03, 0xec, - 0x04, 0xfb, 0x00, 0x36, 0x00, 0x0f, 0x12, 0x8b, - 0x44, 0x00, 0xaa, 0x80, 0x32, 0xdc, 0x8f, 0xbb, - 0x03, 0x6c, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb2, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0x80, - 0x0f, 0xb0, 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x11, 0x9c, 0x00, 0xb7, 0x00, - 0x2f, 0x80, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0x1c, 0x00, - 0xb7, 0x00, 0x2c, 0xc0, 0x08, 0x70, 0x02, 0xdc, - 0x00, 0xb3, 0x50, 0x31, 0x80, 0xcb, 0x54, 0x02, - 0x1c, 0x00, 0x8f, 0x04, 0x35, 0xc8, 0x0b, 0x72, - 0x83, 0x1c, 0x00, 0xe7, 0x00, 0x2d, 0xc0, 0x0b, - 0x72, 0x82, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x00, 0x9e, 0x00, 0xb7, 0x80, - 0x2d, 0x60, 0x08, 0x78, 0x02, 0xde, 0x00, 0xb7, - 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0x9e, 0x00, - 0xb7, 0x80, 0x2d, 0xe0, 0x09, 0x78, 0x02, 0xde, - 0x00, 0xb7, 0xed, 0x09, 0x00, 0x66, 0x00, 0xa0, - 0x25, 0x60, 0x09, 0xda, 0x02, 0x3e, 0x00, 0xa7, - 0x80, 0x21, 0xe0, 0x0b, 0x3a, 0x46, 0x5e, 0x00, - 0xb7, 0xc0, 0x29, 0xe0, 0x0b, 0x79, 0x02, 0xde, - 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x1b, 0x78, 0x02, - 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x04, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0x90, 0x08, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x8b, 0x30, 0x02, 0x0e, 0x00, 0xb3, 0x00, 0x2e, - 0xf0, 0x29, 0x30, 0x02, 0xcc, 0x10, 0xb3, 0x00, - 0x20, 0xec, 0x0b, 0x10, 0x02, 0x4e, 0x00, 0x83, - 0x20, 0x24, 0xc0, 0x0b, 0x30, 0x02, 0x0c, 0x00, - 0xa3, 0x80, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x90, 0x2c, 0xc4, 0x0b, 0x30, 0x02, - 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, - 0x05, 0xa8, 0x00, 0xfa, 0x00, 0x3f, 0x90, 0x08, - 0xa0, 0x03, 0xe8, 0x00, 0xba, 0x00, 0x3e, 0x80, - 0x0f, 0x20, 0x02, 0xaa, 0x20, 0xfa, 0x00, 0x3f, - 0xb6, 0x0d, 0xa0, 0x03, 0xe8, 0x00, 0xfa, 0x00, - 0x37, 0x80, 0x0d, 0xe0, 0x03, 0x39, 0x00, 0xee, - 0x60, 0x32, 0x80, 0x0f, 0xa0, 0x03, 0x68, 0x00, - 0xfa, 0x02, 0x3a, 0x80, 0x0b, 0xa0, 0x03, 0xe8, - 0x00, 0xfe, 0x40, 0x3f, 0xa0, 0x0f, 0xa0, 0x03, - 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x00, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x08, 0x0f, - 0x80, 0x01, 0xe0, 0x00, 0xf8, 0x00, 0x1e, 0x00, - 0x0f, 0x80, 0x23, 0xe1, 0x00, 0xf8, 0x00, 0x3e, - 0x10, 0x0e, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x7a, 0x00, 0x0f, 0x80, 0x03, 0xa2, 0x40, 0xf8, - 0x44, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xa0, 0x00, - 0xe8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x08, 0x3e, 0x20, 0x0f, 0x80, 0x03, - 0xd2, 0x00, 0x30, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0e, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0x66, 0x00, 0xf9, 0x00, 0x3e, 0x68, 0x04, 0x90, - 0x03, 0xe4, 0x00, 0xf1, 0x00, 0x3a, 0x40, 0x8f, - 0x10, 0x03, 0x24, 0x08, 0xe9, 0x00, 0x2e, 0x40, - 0x0f, 0x90, 0x02, 0xe4, 0x00, 0xf9, 0x00, 0x36, - 0x40, 0x0f, 0x10, 0x03, 0x24, 0x00, 0xf9, 0x80, - 0x3e, 0x64, 0x0f, 0x90, 0x03, 0xc2, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x64, 0x00, - 0xb9, 0x00, 0x2c, 0x70, 0x08, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x0b, - 0x65, 0x20, 0xb9, 0x00, 0x2e, 0x48, 0x0a, 0x90, - 0x02, 0xe5, 0x00, 0xb9, 0x00, 0x26, 0x40, 0x0b, - 0x90, 0x02, 0x24, 0x00, 0x89, 0x80, 0x2e, 0x40, - 0x1b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xa4, 0x00, 0xb9, 0x60, - 0x2e, 0x48, 0x0b, 0x90, 0x02, 0xe0, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0x24, 0x00, - 0xb9, 0x00, 0x2e, 0x54, 0x0a, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x98, 0x02, - 0x64, 0x80, 0xb9, 0x60, 0x2e, 0x40, 0x1a, 0x90, - 0x02, 0xe4, 0x00, 0xa9, 0x00, 0x2e, 0x40, 0x03, - 0x90, 0x02, 0x44, 0x00, 0xa9, 0x20, 0x2e, 0x40, - 0x1a, 0x90, 0x02, 0xe4, 0x00, 0x39, 0x00, 0x2e, - 0x40, 0x09, 0x90, 0x02, 0x64, 0x00, 0xb9, 0x10, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xc6, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x00, - 0xb1, 0x00, 0x2e, 0x50, 0x08, 0x10, 0x02, 0xc4, - 0x10, 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, - 0x44, 0x00, 0xb1, 0x40, 0x2c, 0x40, 0x0a, 0x10, - 0x02, 0xcc, 0x00, 0xb1, 0x00, 0x24, 0x51, 0x0b, - 0xed, 0x09, 0x00, 0x68, 0x00, 0x14, 0x0a, 0x05, - 0x00, 0x81, 0x40, 0x2c, 0x50, 0x0b, 0x10, 0x02, - 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x14, - 0x02, 0xc4, 0x00, 0xb1, 0x40, 0x2c, 0x50, 0x0b, - 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb8, 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x2e, - 0x00, 0x0e, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0x60, 0x00, 0xf8, - 0x00, 0x3e, 0x14, 0x4e, 0x80, 0x43, 0xe0, 0x00, - 0xe8, 0x50, 0x3a, 0x00, 0x0f, 0x80, 0x03, 0x60, - 0x00, 0xea, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x36, 0x00, 0x0f, 0x80, - 0x03, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x98, 0x1d, 0xe4, 0x00, 0xf9, 0x00, 0x3f, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xf5, 0x14, 0xf9, - 0x00, 0x3f, 0xd0, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x40, 0x3b, 0x40, 0x0f, 0xd4, 0x13, 0xf4, - 0x00, 0xfd, 0x40, 0x3e, 0x50, 0x0f, 0x94, 0x03, - 0xe4, 0x00, 0xdd, 0x40, 0x3e, 0x40, 0x0f, 0x94, - 0x03, 0xa4, 0x00, 0xdd, 0x45, 0x3f, 0x50, 0x0f, - 0x90, 0x03, 0xe6, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x05, 0xe4, 0x00, 0xf9, 0x00, 0x3f, - 0xc0, 0x0c, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0xd0, 0x03, 0x34, 0x01, 0xed, - 0x10, 0x3b, 0x4c, 0x0c, 0x90, 0x03, 0xf4, 0x00, - 0xfd, 0x40, 0x32, 0x40, 0x1e, 0x91, 0x03, 0x64, - 0x00, 0xfd, 0x2c, 0x32, 0x4c, 0x0d, 0x90, 0x03, - 0x64, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x92, - 0x83, 0x24, 0x00, 0xfd, 0x04, 0x3f, 0x40, 0x0f, - 0x90, 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x10, 0xed, 0x09, 0x00, 0x69, 0x00, - 0xe0, 0x00, 0xb8, 0x00, 0x1a, 0x02, 0x28, 0x80, - 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, - 0x80, 0x06, 0xa0, 0x04, 0x80, 0x00, 0x2e, 0x08, - 0x0d, 0x80, 0x02, 0xe0, 0x00, 0x18, 0x60, 0xa0, - 0x02, 0x0b, 0x81, 0x22, 0xa8, 0xa0, 0xb8, 0x20, - 0x2a, 0x0c, 0x0d, 0x84, 0x02, 0x20, 0x00, 0xb8, - 0x10, 0x2e, 0x00, 0x0b, 0x82, 0x02, 0x20, 0x00, - 0xb8, 0x48, 0x2c, 0x82, 0x0b, 0x80, 0x02, 0xce, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, - 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x08, 0x10, - 0x02, 0xc4, 0x04, 0xb1, 0x00, 0x6c, 0x40, 0x0b, - 0x10, 0x02, 0x04, 0x40, 0xa3, 0x00, 0x28, 0x4c, - 0x08, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x30, 0x24, - 0x40, 0x18, 0x10, 0x02, 0x84, 0x88, 0xb9, 0x28, - 0x2c, 0x48, 0x0a, 0x11, 0x02, 0x44, 0x00, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x12, 0x82, 0x44, 0x00, - 0xb1, 0x30, 0x2c, 0x44, 0x9b, 0x10, 0x02, 0xc2, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, - 0xa4, 0x00, 0xb9, 0x04, 0x2e, 0x40, 0x08, 0x90, - 0x02, 0xe4, 0x04, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xa4, 0x80, 0x89, 0x00, 0x24, 0x48, - 0x09, 0x90, 0x02, 0xe4, 0x00, 0x93, 0x00, 0x26, - 0x43, 0x0b, 0x10, 0x22, 0xa4, 0x48, 0xb9, 0x08, - 0x2c, 0x40, 0x19, 0x90, 0x02, 0x24, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x1b, 0x90, 0x02, 0x64, 0x00, - 0xb9, 0x0a, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xc6, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x42, 0x0c, 0x90, - 0x02, 0xe4, 0x00, 0xf9, 0x00, 0x2e, 0x40, 0x0f, - 0x90, 0x03, 0x04, 0x00, 0xa9, 0x00, 0x3a, 0x70, - 0x08, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x36, - 0x40, 0x0e, 0x90, 0x03, 0xa6, 0x00, 0xed, 0x09, - 0x00, 0x6a, 0x00, 0xf1, 0x00, 0x2e, 0x40, 0x04, - 0x90, 0x03, 0x64, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x03, 0x64, 0x00, 0xf9, 0x00, 0x2e, - 0x50, 0x0f, 0x90, 0x03, 0xe8, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, - 0x00, 0x3a, 0x50, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x0b, 0xa4, - 0x00, 0xf9, 0x00, 0x3e, 0x60, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x01, 0x3a, 0x40, 0x07, 0x90, - 0x47, 0xa6, 0x00, 0xb9, 0x20, 0x7a, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xa4, 0x00, 0xf9, 0x20, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xca, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x10, 0xa0, 0x00, 0xf8, - 0x00, 0x3e, 0x08, 0x0c, 0x80, 0x03, 0x60, 0x00, - 0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x80, 0x03, 0x60, - 0x80, 0xd8, 0x04, 0x32, 0x30, 0x0c, 0x80, 0x03, - 0xa0, 0x00, 0xf8, 0x80, 0x3e, 0x10, 0x0d, 0x80, - 0x43, 0xe1, 0x00, 0xf8, 0x10, 0x3e, 0x00, 0x0c, - 0x00, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x08, 0x3e, - 0x18, 0x0e, 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x05, 0x28, 0x00, 0xba, - 0x00, 0x2f, 0x80, 0x08, 0xa0, 0x12, 0xe8, 0x00, - 0xba, 0x00, 0x2e, 0x80, 0x0b, 0x20, 0x03, 0x3a, - 0x00, 0x8e, 0x50, 0x23, 0x80, 0x28, 0xa0, 0x02, - 0xf9, 0x28, 0xbe, 0xa0, 0x2e, 0x80, 0x0a, 0xa0, - 0x02, 0xe8, 0x00, 0xbe, 0xc1, 0x2e, 0x80, 0x0a, - 0xa0, 0x03, 0xa8, 0x00, 0xba, 0x00, 0x26, 0x80, - 0x0b, 0xa0, 0x42, 0xe8, 0x10, 0xbe, 0xc0, 0x2f, - 0xa2, 0x08, 0xa0, 0x02, 0xca, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x05, 0x4c, 0x00, 0xb3, - 0x00, 0xed, 0x09, 0x00, 0x6b, 0x00, 0x2e, 0xc0, - 0x08, 0x30, 0x22, 0xcc, 0x00, 0xb3, 0x00, 0x28, - 0xc0, 0x0b, 0x30, 0x02, 0x0d, 0x00, 0x93, 0x00, - 0x24, 0x00, 0x08, 0x30, 0x06, 0x8b, 0x20, 0xb0, - 0x80, 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x88, 0x2c, 0xc0, 0x89, 0x30, 0x02, 0x8c, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0xb0, 0x02, - 0xcc, 0x00, 0xb3, 0xc0, 0x2c, 0xe0, 0x4b, 0x30, - 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x01, 0x1c, 0x00, 0xb7, 0x00, 0x2f, 0xc2, - 0x28, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x09, 0x70, 0x02, 0x0d, 0x00, 0x87, 0x80, - 0x21, 0x00, 0x08, 0x70, 0x02, 0xd8, 0x00, 0xb4, - 0x00, 0x2d, 0xe9, 0x0a, 0x73, 0x02, 0xdc, 0x00, - 0xb7, 0x00, 0x2d, 0xc8, 0x0b, 0x70, 0x02, 0x9c, - 0x00, 0x97, 0x00, 0x05, 0xc0, 0x0b, 0x79, 0x02, - 0xdc, 0x00, 0xb7, 0x08, 0x2d, 0x61, 0x09, 0x70, - 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x08, 0x1e, 0x00, 0xf7, 0x80, 0x2d, 0xe1, - 0x0c, 0x78, 0x03, 0xde, 0x00, 0xf7, 0x80, 0x39, - 0xe0, 0x0f, 0x70, 0x03, 0x1e, 0x00, 0xd7, 0x80, - 0x34, 0xe0, 0x0c, 0x78, 0x03, 0x9a, 0x00, 0xf4, - 0x80, 0x2d, 0xec, 0x0c, 0x7a, 0x03, 0xde, 0x20, - 0xf7, 0x80, 0x3f, 0xec, 0x0d, 0x78, 0x03, 0x9e, - 0x00, 0xf7, 0x80, 0x3d, 0xe0, 0x0f, 0x72, 0x03, - 0xde, 0x00, 0xf7, 0x81, 0x2d, 0xa0, 0x4f, 0x78, - 0x03, 0xea, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x1d, 0xac, 0x00, 0xfb, 0x00, 0x3c, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0x7b, 0x00, 0x3e, - 0xc0, 0x0f, 0x10, 0x03, 0xac, 0x00, 0xfb, 0x00, - 0x8b, 0xc0, 0x0f, 0xb0, 0x03, 0xe8, 0x00, 0xfc, - 0x00, 0x3e, 0xc0, 0x06, 0xb6, 0x03, 0xed, 0x08, - 0xfb, 0x00, 0x36, 0xc0, 0xed, 0x09, 0x00, 0x6c, - 0x00, 0x0e, 0xb0, 0x03, 0xac, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb6, 0x03, 0x6c, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0e, 0xb0, 0x03, 0xc2, 0x06, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, - 0x00, 0xff, 0x80, 0x3d, 0xe0, 0x0c, 0xf8, 0x03, - 0xfe, 0x00, 0xff, 0x20, 0x3f, 0xe0, 0x0f, 0x72, - 0x03, 0x7e, 0x00, 0xdf, 0x80, 0x33, 0x20, 0x8c, - 0xf8, 0x03, 0x72, 0x00, 0xce, 0x80, 0xb3, 0xe2, - 0x0f, 0xfc, 0x03, 0x3e, 0x20, 0xaf, 0x90, 0x3b, - 0xe2, 0x0f, 0xf8, 0x03, 0xbe, 0x00, 0xff, 0x80, - 0x3f, 0xe0, 0x47, 0xfc, 0x03, 0x3e, 0x00, 0xfc, - 0x80, 0x73, 0xe4, 0x87, 0xf8, 0x03, 0xc0, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, 0x9c, - 0x00, 0xb7, 0x00, 0x2d, 0xc4, 0x08, 0x70, 0x02, - 0xdc, 0x04, 0xb7, 0x10, 0x39, 0xc0, 0x0b, 0x71, - 0x07, 0x9c, 0x40, 0xbf, 0x00, 0x23, 0x00, 0x0a, - 0x70, 0x02, 0xd1, 0x00, 0xae, 0x00, 0x21, 0xc4, - 0x0b, 0x70, 0x02, 0x1c, 0x40, 0xe7, 0x04, 0x29, - 0xc0, 0x0b, 0x70, 0x03, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0f, 0x70, 0x03, 0x5c, 0x00, 0xb5, - 0x00, 0x35, 0x8d, 0x09, 0x70, 0x02, 0xea, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, - 0x00, 0xb7, 0x00, 0x2f, 0x40, 0x08, 0x70, 0x02, - 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0x18, 0x00, 0x97, 0x00, 0x21, 0x80, 0x09, - 0x70, 0x02, 0x50, 0x00, 0xa6, 0x00, 0x21, 0xc2, - 0x0b, 0xf0, 0x02, 0x1c, 0x00, 0xa3, 0x40, 0x25, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x30, 0x02, 0x9c, 0x00, 0xb6, - 0x00, 0x21, 0x40, 0x8b, 0x70, 0x02, 0xc0, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0x48, 0xa8, 0x30, 0xed, - 0x09, 0x00, 0x6d, 0x00, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x28, 0xc0, 0x0b, 0x10, 0x12, 0x88, 0x00, - 0xb3, 0x00, 0x20, 0xb6, 0x0b, 0x30, 0x02, 0xc0, - 0x00, 0xa2, 0x00, 0x22, 0xe0, 0x0b, 0xb0, 0x02, - 0x0e, 0x00, 0xa2, 0x80, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x80, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0x30, 0x00, 0x24, 0x10, - 0x09, 0x30, 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x15, 0xac, 0x00, 0xfb, 0x00, - 0x1c, 0xb0, 0x04, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0x30, 0x03, 0x0e, 0x20, - 0xdb, 0x03, 0x32, 0x00, 0x8d, 0xb0, 0x13, 0x4c, - 0x00, 0xe9, 0x00, 0x73, 0xe0, 0x0b, 0xf0, 0x43, - 0x1d, 0xc0, 0xeb, 0x40, 0x3f, 0xc0, 0x8f, 0xb0, - 0x07, 0xac, 0x00, 0xfb, 0x00, 0x2e, 0xc0, 0x0f, - 0xf0, 0x03, 0xac, 0x00, 0x7b, 0x00, 0xe2, 0xe6, - 0x0f, 0xb0, 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0x70, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xac, 0x00, - 0xfb, 0x02, 0x3f, 0x00, 0x0c, 0xb0, 0x03, 0xed, - 0x00, 0x3d, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x13, - 0xec, 0x00, 0xfb, 0x10, 0x3a, 0xc0, 0x0f, 0xb0, - 0x07, 0xac, 0x00, 0xfb, 0x10, 0x3e, 0xc0, 0x4e, - 0xb0, 0x02, 0x6c, 0x00, 0xfb, 0x00, 0x3a, 0x40, - 0x0f, 0xb0, 0x17, 0xe0, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x10, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0c, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0x7f, 0x00, - 0xcf, 0x00, 0x33, 0x40, 0x0c, 0xf0, 0x03, 0xba, - 0x00, 0xcd, 0x00, 0x37, 0xc0, 0x0c, 0xf0, 0x03, - 0x3c, 0x00, 0xdd, 0x00, 0x31, 0xc0, 0x0c, 0xf0, - 0x03, 0x7c, 0xed, 0x09, 0x00, 0x6e, 0x00, 0x18, - 0xff, 0x00, 0x3b, 0xc0, 0x0f, 0xf0, 0x03, 0xbc, - 0x10, 0xf7, 0x00, 0x39, 0x80, 0x0c, 0xf0, 0x03, - 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, - 0x04, 0x6c, 0x00, 0xbb, 0x00, 0x2e, 0x60, 0x28, - 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0x90, 0x02, 0x6c, 0x00, 0xdb, 0x00, 0x02, - 0x40, 0x08, 0xb0, 0x02, 0x69, 0x00, 0xa9, 0x00, - 0x2a, 0xc0, 0x0a, 0xb0, 0x00, 0x2c, 0x00, 0x83, - 0x80, 0x2a, 0xc0, 0x0a, 0xb0, 0x02, 0xec, 0x00, - 0x9b, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xac, - 0x00, 0xb8, 0x00, 0x22, 0x00, 0x00, 0xb0, 0x02, - 0xe0, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x05, 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xe2, 0x08, - 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0x6c, 0x00, 0x83, 0x10, 0x20, - 0x20, 0x08, 0xb0, 0x02, 0xe8, 0x40, 0x80, 0x80, - 0x2a, 0xc0, 0x1b, 0xb0, 0x42, 0x2c, 0x01, 0x9b, - 0x80, 0xe6, 0xc0, 0x08, 0xb0, 0x02, 0xac, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x1b, 0x30, 0x02, 0x2c, - 0x00, 0xb8, 0x00, 0x2a, 0xc0, 0x0a, 0xb0, 0x02, - 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x0c, 0x00, 0xb3, 0x00, 0x2e, 0x00, 0x08, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0x4c, 0x00, 0x90, 0x80, 0x20, - 0x00, 0x18, 0x30, 0x02, 0xc8, 0x00, 0xa0, 0x00, - 0x28, 0xc0, 0x9a, 0x30, 0x02, 0x2c, 0x01, 0x83, - 0x00, 0x2c, 0xc0, 0x0a, 0x30, 0x02, 0xcc, 0x00, - 0x93, 0x00, 0x2c, 0xc0, 0x1b, 0x30, 0x02, 0x8c, - 0x00, 0xb1, 0x00, 0x20, 0x80, 0x08, 0x30, 0x12, - 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0d, 0x6c, 0x00, 0xfb, 0x00, 0x3e, 0x40, 0x08, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0xed, 0x09, 0x00, - 0x6f, 0x00, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0x68, 0x00, 0xcb, 0x00, 0x32, 0x00, 0x0c, 0xb0, - 0x03, 0xa8, 0x00, 0xc8, 0x00, 0x37, 0xc0, 0x07, - 0xf0, 0x0b, 0x3c, 0x00, 0xdb, 0x00, 0x37, 0xc0, - 0x0c, 0xb0, 0x03, 0x6c, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xf0, 0x03, 0x2c, 0x00, 0xf2, 0x00, - 0x3a, 0x40, 0x2c, 0xb0, 0x03, 0xc0, 0x03, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0x40, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0x7f, 0x00, 0x3f, 0xc0, 0x0f, 0xd0, 0x06, - 0xb0, 0x00, 0xff, 0x00, 0x1f, 0x00, 0x0f, 0xf0, - 0x03, 0x58, 0x04, 0xfc, 0x00, 0x37, 0xc0, 0x0f, - 0x70, 0x03, 0xfc, 0x00, 0xfe, 0x00, 0x3b, 0xc0, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xfc, 0x00, - 0x3f, 0x00, 0x0f, 0xf0, 0x23, 0xe8, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x05, 0xf8, 0x40, - 0xfc, 0x00, 0x3f, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x00, 0xc4, 0x00, 0x33, 0x00, 0x0f, 0xc0, 0x03, - 0x30, 0x00, 0xfc, 0x10, 0x33, 0x00, 0x6c, 0xc4, - 0x03, 0x30, 0x00, 0xfc, 0x01, 0x3f, 0x00, 0x0f, - 0xc0, 0x03, 0x70, 0x80, 0x7f, 0x00, 0x33, 0x00, - 0x0f, 0xf0, 0x53, 0xfc, 0x80, 0xcc, 0x01, 0x23, - 0xc4, 0x0e, 0xf2, 0x83, 0x70, 0x08, 0xcf, 0x20, - 0x37, 0x40, 0x0c, 0xd0, 0x03, 0xf0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0xec, 0x80, - 0xb8, 0x00, 0x2e, 0x00, 0x08, 0x80, 0x02, 0x20, - 0x00, 0x88, 0x00, 0x22, 0x00, 0x0b, 0x80, 0x02, - 0x28, 0x00, 0xb8, 0x02, 0x22, 0x00, 0x08, 0x82, - 0x02, 0x20, 0x20, 0xb8, 0x02, 0x2c, 0x00, 0x4e, - 0xa2, 0x82, 0xe1, 0x00, 0xbb, 0x04, 0x3e, 0x12, - 0x0b, 0xb4, 0x02, 0xdd, 0xa2, 0x88, 0x00, 0x2a, - 0xed, 0x09, 0x00, 0x70, 0x00, 0xc8, 0x0b, 0xb4, - 0x80, 0x24, 0x00, 0xdf, 0x01, 0x22, 0x44, 0x0a, - 0x91, 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x88, 0x05, 0xc8, 0x00, 0xb0, 0x00, 0x2c, - 0x00, 0x08, 0x00, 0x02, 0x20, 0x00, 0xa8, 0x80, - 0x28, 0x40, 0x0b, 0x80, 0x12, 0x04, 0x10, 0xb8, - 0x80, 0x20, 0x00, 0x09, 0x90, 0x02, 0x40, 0x80, - 0xb0, 0x03, 0x24, 0x80, 0x0b, 0x10, 0x02, 0xc0, - 0x40, 0xb3, 0x00, 0xa8, 0x0d, 0x0a, 0x31, 0x02, - 0xcd, 0x00, 0x90, 0x00, 0x20, 0xc8, 0x0a, 0x32, - 0x02, 0xe2, 0x00, 0xa3, 0x12, 0x28, 0x40, 0x08, - 0x00, 0x02, 0xe2, 0x11, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x15, 0xac, 0x00, 0xb8, 0x00, 0x2c, - 0x00, 0x08, 0x00, 0x02, 0x22, 0x00, 0xa8, 0x00, - 0x2a, 0x40, 0x0b, 0x88, 0x22, 0x2c, 0x08, 0x98, - 0x00, 0x20, 0x00, 0x09, 0x90, 0x02, 0xa0, 0x00, - 0xb8, 0x00, 0x2e, 0x80, 0x02, 0xb0, 0x02, 0xe3, - 0x01, 0xbb, 0x00, 0x2e, 0x60, 0x0b, 0xb0, 0x02, - 0xec, 0x01, 0x9b, 0x00, 0x22, 0xc0, 0x0b, 0xb0, - 0x02, 0xee, 0x00, 0xbb, 0x00, 0x2a, 0x60, 0x0a, - 0x98, 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x14, 0xa8, 0x00, 0xfa, 0x20, 0x3e, - 0x08, 0x0c, 0x84, 0x03, 0x04, 0x00, 0xea, 0x00, - 0x3a, 0x80, 0x0f, 0x10, 0x03, 0x20, 0x00, 0xf2, - 0x00, 0x32, 0x40, 0x49, 0x80, 0x0b, 0x66, 0x50, - 0xfa, 0x42, 0x36, 0x08, 0x0f, 0x80, 0x03, 0x63, - 0x00, 0xfa, 0x02, 0x3a, 0x20, 0x47, 0xb0, 0x03, - 0xec, 0x00, 0xd0, 0xa0, 0x32, 0xc0, 0x0e, 0xb0, - 0x03, 0xc0, 0x00, 0x6b, 0x00, 0x3a, 0x38, 0x0c, - 0x8a, 0x03, 0xd0, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xe1, 0x00, 0xbc, 0x00, 0xfe, 0x08, 0x3f, - 0x06, 0x0f, 0xc1, 0x03, 0xf4, 0x00, 0xde, 0x00, - 0x37, 0x80, 0x1f, 0xed, 0x09, 0x00, 0x71, 0x00, - 0xd0, 0x03, 0xf8, 0x00, 0xfe, 0x02, 0x1f, 0x44, - 0x0e, 0xc9, 0x03, 0x74, 0x01, 0xfe, 0x02, 0x37, - 0x00, 0x08, 0xe0, 0x83, 0xf0, 0x00, 0xff, 0x20, - 0x3f, 0x00, 0x0f, 0xb0, 0x01, 0xfc, 0x00, 0x6c, - 0xc8, 0x3f, 0xc0, 0x0d, 0x70, 0x03, 0x34, 0x00, - 0xd7, 0x00, 0x35, 0xc0, 0x0f, 0xc0, 0x03, 0xf8, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, - 0xa8, 0x00, 0xfa, 0x80, 0x3e, 0x20, 0x0f, 0x8c, - 0x0b, 0x26, 0x00, 0xca, 0x80, 0x32, 0xe0, 0x1f, - 0x9a, 0x03, 0x24, 0x03, 0xea, 0x04, 0x2a, 0x60, - 0x0f, 0x90, 0x03, 0xe4, 0x40, 0xfa, 0xc0, 0xb2, - 0xa0, 0x0c, 0x90, 0x01, 0x21, 0x00, 0xda, 0x22, - 0x3e, 0x01, 0x8f, 0xb0, 0x03, 0x0c, 0x10, 0xcb, - 0x56, 0x3e, 0xc0, 0x0c, 0xba, 0x03, 0xe8, 0x00, - 0xfb, 0x80, 0x32, 0x10, 0x0f, 0xa6, 0x03, 0xd0, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xca, 0x04, - 0x2c, 0x00, 0x8a, 0xc0, 0x2e, 0x30, 0x0b, 0x8c, - 0x12, 0x24, 0x00, 0x82, 0x00, 0x22, 0xe0, 0x0b, - 0x94, 0x02, 0x2c, 0x20, 0x8a, 0x01, 0x22, 0x74, - 0x0b, 0x15, 0x22, 0xe6, 0x00, 0xba, 0xd4, 0x22, - 0xb4, 0x0d, 0xb0, 0x02, 0x20, 0x40, 0xb3, 0x40, - 0x2e, 0x64, 0x0b, 0xf4, 0x48, 0xbc, 0x00, 0x8b, - 0x00, 0x2f, 0xc1, 0x0a, 0xf4, 0x02, 0xee, 0x88, - 0x9f, 0x50, 0x2a, 0xc0, 0x0b, 0xa4, 0x02, 0xf2, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x05, - 0x48, 0x00, 0xb1, 0x43, 0x2c, 0xd0, 0x0b, 0x30, - 0x86, 0x08, 0x00, 0x81, 0x04, 0x00, 0x08, 0x0a, - 0x24, 0x02, 0x00, 0x00, 0x81, 0x00, 0x60, 0x90, - 0x09, 0x20, 0x02, 0x0a, 0x00, 0x21, 0x00, 0x20, - 0x50, 0x0a, 0x00, 0x06, 0x01, 0x40, 0x91, 0xc0, - 0x2c, 0x10, 0x09, 0x36, 0x02, 0x0c, 0x00, 0xb0, - 0x80, 0x24, 0xc0, 0x08, 0x30, 0x40, 0xed, 0x09, - 0x00, 0x72, 0x00, 0xc4, 0x10, 0x33, 0x40, 0x28, - 0x00, 0x8b, 0x14, 0x02, 0xf8, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x62, 0x01, 0x1e, 0x02, 0x85, - 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x06, 0x3a, 0x00, - 0x8d, 0x80, 0x21, 0x20, 0x0b, 0xe8, 0x02, 0x1a, - 0x00, 0xad, 0x92, 0x61, 0xa0, 0x0b, 0x68, 0x22, - 0xdb, 0x00, 0xb5, 0x90, 0x21, 0x60, 0x0b, 0x68, - 0x02, 0x12, 0x10, 0xb7, 0x88, 0x2d, 0x20, 0x09, - 0x79, 0x22, 0x9e, 0x00, 0x97, 0x90, 0x2d, 0xe0, - 0x0a, 0x79, 0x02, 0xde, 0x00, 0x93, 0x90, 0x29, - 0x20, 0x0b, 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x48, 0x28, 0x10, 0xf1, - 0x02, 0x7c, 0xc0, 0x0f, 0xb4, 0x03, 0x08, 0x00, - 0xc1, 0x00, 0x30, 0x40, 0x0f, 0x21, 0x03, 0x04, - 0x40, 0xa1, 0x00, 0x38, 0x88, 0x0f, 0x32, 0x03, - 0x08, 0x40, 0xf9, 0x44, 0x30, 0xc8, 0x0e, 0x90, - 0x23, 0x00, 0x00, 0xd3, 0x02, 0x3c, 0x0a, 0x0f, - 0x30, 0x03, 0x0c, 0x00, 0xf0, 0x10, 0x3e, 0xc0, - 0x0c, 0x31, 0x03, 0xc4, 0x00, 0xf3, 0x00, 0x30, - 0xc0, 0xcf, 0x00, 0x03, 0xd2, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xfd, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xd8, 0x00, - 0xfd, 0x00, 0x1f, 0x40, 0x0f, 0x60, 0x03, 0xdc, - 0x00, 0xd5, 0x00, 0x3f, 0x80, 0x4b, 0xf0, 0x03, - 0xf8, 0x40, 0xfd, 0x00, 0x3f, 0xc0, 0x05, 0xf1, - 0x03, 0xfc, 0x40, 0xff, 0x00, 0x3f, 0x40, 0x0f, - 0xf0, 0x81, 0x7c, 0x02, 0xef, 0x10, 0x3f, 0xc0, - 0x0e, 0xf1, 0x03, 0xfc, 0x40, 0xff, 0x00, 0x37, - 0xc0, 0x0f, 0xf0, 0x03, 0xd0, 0x06, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x05, 0xe8, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0x80, 0x0f, 0xb0, 0x03, 0x60, - 0x00, 0xed, 0x09, 0x00, 0x73, 0x00, 0xbb, 0x00, - 0x3a, 0xc0, 0x0f, 0xa8, 0x02, 0x2c, 0x00, 0xfb, - 0x00, 0x3a, 0x40, 0x0c, 0x80, 0x03, 0xe2, 0x00, - 0xca, 0x00, 0x36, 0x00, 0x0c, 0xb8, 0x03, 0xac, - 0x84, 0xf3, 0x80, 0xb2, 0xe0, 0x0d, 0xb8, 0x03, - 0x2c, 0x00, 0xfb, 0x00, 0x32, 0x00, 0x1f, 0x90, - 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x12, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0x80, 0x0b, 0x70, 0x00, 0xd8, 0x00, 0x3f, 0x00, - 0x29, 0xc0, 0x0b, 0x60, 0x42, 0x1c, 0x00, 0xb7, - 0x00, 0x2b, 0x40, 0x4a, 0x60, 0x12, 0x54, 0x00, - 0xa7, 0x00, 0x21, 0x00, 0x08, 0x70, 0x02, 0x1c, - 0x40, 0x97, 0x00, 0x23, 0xd0, 0x0b, 0xf6, 0x02, - 0x1c, 0x00, 0xb7, 0x10, 0x35, 0x80, 0x0e, 0x50, - 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xc1, 0x00, 0x9a, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0b, 0x78, 0x00, 0xde, 0x00, 0xb7, 0x80, 0x2d, - 0xe0, 0x0b, 0x78, 0x02, 0xd6, 0x00, 0xa7, 0x81, - 0x29, 0xe0, 0x8b, 0xf8, 0x06, 0x9e, 0x08, 0xb7, - 0x84, 0x21, 0xe0, 0x08, 0x58, 0x02, 0x42, 0x00, - 0x86, 0x80, 0x24, 0x20, 0x08, 0x38, 0x02, 0x5e, - 0x40, 0xa7, 0x80, 0x29, 0xe1, 0x1a, 0x7a, 0x02, - 0x1e, 0x00, 0xb3, 0xb0, 0x21, 0x60, 0x0b, 0x78, - 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x14, 0xcc, 0x00, 0xb3, 0x80, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xe0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x22, 0xd8, 0x0b, 0x30, 0x02, 0x8d, 0x20, 0xb3, - 0x80, 0x28, 0xc0, 0x0a, 0x30, 0x46, 0xcc, 0x80, - 0xa3, 0x80, 0x26, 0xe4, 0x08, 0x30, 0x0a, 0x4c, - 0x00, 0xb3, 0x80, 0x28, 0xc0, 0x0a, 0x30, 0x0a, - 0x0e, 0x10, 0xb3, 0x00, 0xed, 0x09, 0x00, 0x74, - 0x00, 0x24, 0xe6, 0x02, 0x3d, 0x02, 0xd2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, 0xa8, - 0x00, 0xfa, 0xa0, 0x3e, 0x80, 0x0b, 0xa0, 0x03, - 0xe8, 0x10, 0xf2, 0x00, 0x3e, 0xa8, 0x4f, 0xa0, - 0x03, 0x68, 0x00, 0xea, 0x00, 0x3a, 0x90, 0x0f, - 0xa0, 0x0b, 0xa9, 0x00, 0xfa, 0xa2, 0x3a, 0x80, - 0x0c, 0xa0, 0x07, 0xf9, 0x00, 0xce, 0xe4, 0x37, - 0xa0, 0x2c, 0xa0, 0x03, 0xe8, 0x00, 0xee, 0x24, - 0x3a, 0x80, 0x8f, 0xa0, 0x07, 0x38, 0x00, 0xfa, - 0x00, 0x03, 0x90, 0x0f, 0xe0, 0x13, 0xfa, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xe0, - 0x00, 0xf8, 0x02, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xe2, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x88, - 0x03, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x8f, - 0x80, 0x01, 0x61, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x84, 0x03, 0x60, 0x04, 0xf8, 0x82, 0x3a, - 0x10, 0x0f, 0x80, 0x03, 0xa0, 0x00, 0xd8, 0x20, - 0x36, 0x00, 0x0b, 0x80, 0x07, 0xe0, 0x40, 0xf8, - 0x40, 0x3e, 0x00, 0x0f, 0x82, 0x03, 0xd2, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, - 0x00, 0xf9, 0x10, 0x32, 0x68, 0x0f, 0x98, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x32, 0x64, 0x0c, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x36, 0x40, 0x4c, - 0x94, 0x03, 0xe5, 0x10, 0xc9, 0x40, 0x32, 0x71, - 0x4c, 0x90, 0x03, 0xe7, 0x00, 0xd9, 0x00, 0x3e, - 0x70, 0x0c, 0x98, 0x03, 0xe4, 0x00, 0xf9, 0x42, - 0x3e, 0x40, 0x05, 0x9a, 0x03, 0xe4, 0x00, 0xf9, - 0x40, 0x32, 0x40, 0x0f, 0x92, 0x03, 0xc2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0xe4, - 0x00, 0xb9, 0xc2, 0x22, 0x70, 0x09, 0x94, 0x02, - 0xe4, 0x00, 0xb9, 0x00, 0x22, 0x50, 0x88, 0x94, - 0x02, 0xe6, 0x00, 0xb9, 0x00, 0x02, 0x50, 0xed, - 0x09, 0x00, 0x75, 0x00, 0x08, 0x98, 0x62, 0xc4, - 0x00, 0x89, 0x44, 0x22, 0x70, 0x08, 0x94, 0x02, - 0xe4, 0x05, 0xb1, 0x80, 0x2a, 0x48, 0x08, 0x9c, - 0x02, 0xe4, 0x00, 0xe9, 0x00, 0x2e, 0x40, 0x0f, - 0x94, 0x02, 0xe4, 0x04, 0xb1, 0x20, 0x36, 0x40, - 0x0b, 0x90, 0x82, 0xe0, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x04, 0x24, 0x00, 0xb5, 0x00, - 0x23, 0x41, 0x0b, 0xd1, 0x02, 0xf6, 0x00, 0x9d, - 0x80, 0xa1, 0x40, 0x08, 0xd8, 0x80, 0x74, 0x80, - 0xb5, 0x00, 0x27, 0x44, 0x08, 0xd0, 0x02, 0xf5, - 0x00, 0xa5, 0x00, 0x21, 0x40, 0x08, 0xd2, 0x02, - 0xe4, 0x24, 0xb9, 0x10, 0x6e, 0x40, 0x02, 0x92, - 0x82, 0xe4, 0x10, 0x39, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xa4, 0x00, 0xb9, 0x00, 0x22, 0x40, - 0x0b, 0x90, 0x22, 0xc6, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x04, 0x00, 0xb5, 0x80, - 0x21, 0x60, 0x09, 0x58, 0x42, 0xd4, 0x00, 0xb5, - 0x00, 0x21, 0x60, 0x08, 0x50, 0x22, 0x54, 0x00, - 0xb5, 0x40, 0x21, 0x61, 0x08, 0x54, 0x02, 0xf5, - 0x00, 0xa5, 0x80, 0x21, 0x60, 0x2a, 0x54, 0x00, - 0xc4, 0x00, 0xb9, 0x00, 0x28, 0x51, 0x2a, 0x10, - 0x00, 0xc5, 0xa0, 0xb1, 0x01, 0x0c, 0x5a, 0x1b, - 0x14, 0x02, 0xc4, 0x04, 0xb1, 0x00, 0x24, 0x40, - 0x9b, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb8, 0x08, 0x20, 0x00, 0xf8, 0x00, - 0xb2, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xd8, - 0x00, 0x32, 0x00, 0x2c, 0x80, 0x43, 0xe0, 0x00, - 0xf8, 0x00, 0x36, 0x00, 0x2c, 0x80, 0x03, 0xe0, - 0x02, 0xe0, 0x00, 0xb2, 0x00, 0x08, 0xe0, 0x03, - 0xe0, 0x00, 0xba, 0x00, 0x3e, 0x01, 0x0e, 0x80, - 0x02, 0xe0, 0x80, 0xfa, 0x00, 0x3e, 0x08, 0xcd, - 0xa0, 0x03, 0xe0, 0x00, 0xf8, 0x02, 0x32, 0x00, - 0x0f, 0x80, 0xed, 0x09, 0x00, 0x76, 0x00, 0x03, - 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x1d, 0xe4, 0xb0, 0xf9, 0x28, 0x3e, 0x4a, 0x0f, - 0x92, 0x83, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x4a, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x02, 0x3e, - 0x4a, 0x0f, 0x10, 0x03, 0xe4, 0x00, 0x59, 0x2a, - 0x2e, 0x4b, 0x0d, 0x90, 0x13, 0x75, 0x00, 0xf5, - 0x02, 0x3f, 0x50, 0x0d, 0x94, 0x03, 0xe4, 0x00, - 0xef, 0x00, 0x3e, 0x40, 0x4c, 0x94, 0x23, 0xf4, - 0x00, 0xf9, 0x40, 0x3f, 0x50, 0x0f, 0xf4, 0x03, - 0xe6, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x51, 0xe4, 0x04, 0xfd, 0x14, 0x33, 0x40, 0x0c, - 0xd0, 0x03, 0xf4, 0x00, 0xff, 0x00, 0x3f, 0x40, - 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xfb, 0x00, 0x3f, - 0x44, 0x1c, 0xd0, 0x03, 0xf4, 0x00, 0x6d, 0x12, - 0x2f, 0x40, 0x0c, 0xd0, 0x11, 0xb4, 0x81, 0xed, - 0x06, 0x3f, 0x4a, 0x09, 0xd0, 0x83, 0xa4, 0x00, - 0xcd, 0x00, 0x3e, 0x50, 0x0f, 0xd6, 0x43, 0xf4, - 0x00, 0xfd, 0x00, 0x32, 0x40, 0x0f, 0xd2, 0x03, - 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x39, - 0x10, 0xe0, 0x20, 0xb8, 0x00, 0x22, 0x0a, 0x08, - 0x82, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x3e, 0x82, - 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x20, 0x2e, - 0x08, 0x0a, 0x80, 0x80, 0xe0, 0x20, 0x88, 0x00, - 0x2e, 0x0b, 0x08, 0x82, 0x0a, 0x28, 0x40, 0xb8, - 0x01, 0x2e, 0x08, 0x0b, 0x84, 0x02, 0xa1, 0x02, - 0x88, 0x00, 0x2e, 0x04, 0x0b, 0x84, 0x02, 0xe0, - 0x08, 0xb8, 0x40, 0x22, 0x94, 0x0b, 0x85, 0x02, - 0x4e, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x05, 0xc4, 0x00, 0xa1, 0x00, 0x20, 0x48, 0x08, - 0x12, 0x82, 0xcc, 0x08, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc6, 0x00, 0xb1, 0x08, 0x24, - 0x48, 0x08, 0x12, 0x02, 0xc4, 0xed, 0x09, 0x00, - 0x77, 0x00, 0x00, 0xa1, 0x00, 0x2c, 0x49, 0x88, - 0xb2, 0x82, 0x04, 0x00, 0x91, 0x00, 0x2c, 0x4a, - 0x09, 0x10, 0x12, 0x04, 0xf0, 0x03, 0x00, 0x2c, - 0x40, 0x4b, 0x11, 0x22, 0xc4, 0x00, 0xb1, 0x44, - 0x20, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xa4, 0x00, - 0xb9, 0x05, 0x22, 0x40, 0x08, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x2e, 0x41, 0x4b, 0x90, 0x42, - 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0xc0, 0xca, 0x94, - 0x22, 0xcc, 0x00, 0x29, 0x00, 0x2e, 0x48, 0x48, - 0x94, 0x00, 0xa4, 0x80, 0xb9, 0x10, 0x6e, 0x48, - 0x8b, 0x90, 0x02, 0xa4, 0x00, 0x89, 0x10, 0x2e, - 0x40, 0x8b, 0xb0, 0x02, 0xe4, 0x40, 0xbb, 0x00, - 0x22, 0x40, 0x0b, 0x98, 0x12, 0x46, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x04, 0xa4, 0x00, - 0xf9, 0x00, 0xb2, 0x40, 0x2c, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x51, 0x0f, 0x90, 0x43, - 0xe4, 0x00, 0xf9, 0x00, 0x36, 0x40, 0x08, 0x90, - 0x02, 0xe4, 0x00, 0xe9, 0x00, 0x3e, 0x40, 0x2c, - 0x14, 0x03, 0xa7, 0x00, 0xd9, 0x80, 0x3e, 0x69, - 0x05, 0x10, 0x03, 0x24, 0x00, 0xc9, 0x80, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0xb2, 0x40, 0x0f, 0x90, 0x03, 0xe8, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0xa4, 0x00, - 0xf9, 0x00, 0x3e, 0x42, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3a, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x42, 0x4f, 0x90, - 0x03, 0xe4, 0x00, 0xd9, 0x00, 0x3e, 0x41, 0x0f, - 0x90, 0xc2, 0x66, 0x00, 0xf9, 0x88, 0x26, 0x60, - 0x0f, 0x90, 0x03, 0xc4, 0x00, 0xb9, 0x00, 0x3e, - 0x41, 0x0f, 0x90, 0x83, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x64, 0x0d, 0x90, 0x03, 0x4a, 0x00, 0x60, - 0xed, 0x09, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2a, 0x00, 0xa0, 0x00, 0xd8, 0x04, 0x3e, - 0x00, 0x0f, 0x81, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x3a, 0x10, 0x2c, 0x88, 0x33, 0xe0, 0x04, 0xf8, - 0x01, 0x3e, 0x00, 0x0f, 0x81, 0x03, 0xe0, 0x82, - 0xc8, 0x14, 0x3e, 0x00, 0x0e, 0x80, 0x23, 0xe3, - 0x00, 0xf8, 0x00, 0x3a, 0x04, 0x0d, 0x89, 0x13, - 0xe0, 0x00, 0xd8, 0x20, 0x36, 0x01, 0x02, 0x80, - 0x63, 0xe0, 0x00, 0xa8, 0x04, 0xb2, 0x00, 0x0f, - 0x81, 0x0b, 0x0a, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x14, 0x28, 0x00, 0x8e, 0xe0, 0x2f, - 0x90, 0x0b, 0xed, 0x22, 0xe8, 0x00, 0xba, 0x00, - 0x3f, 0xb6, 0x08, 0xe4, 0x02, 0x6a, 0x80, 0xba, - 0x00, 0x2f, 0x90, 0x0b, 0xe8, 0x22, 0xf9, 0x00, - 0x8e, 0x54, 0x3f, 0x82, 0x0b, 0xe0, 0x00, 0xf8, - 0x20, 0xbe, 0x88, 0x23, 0x80, 0x4b, 0xe4, 0x02, - 0xe8, 0x00, 0x8e, 0x40, 0x3a, 0x80, 0x0b, 0xec, - 0x02, 0xe8, 0x08, 0xa6, 0x50, 0x22, 0x80, 0x0b, - 0xe0, 0x02, 0x0a, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x85, 0x4c, 0x00, 0x9b, 0x20, 0x2e, - 0xe0, 0x0b, 0x34, 0x02, 0xc4, 0x00, 0xb1, 0x00, - 0x2c, 0xf0, 0x08, 0x10, 0x02, 0xc6, 0x00, 0xb3, - 0x01, 0x0e, 0xc0, 0x5b, 0x3e, 0x22, 0x8f, 0x40, - 0x83, 0xc0, 0x2e, 0xd8, 0x0a, 0x30, 0x02, 0xce, - 0x00, 0xb3, 0xc0, 0x2c, 0xc0, 0x19, 0x30, 0x02, - 0xcc, 0x00, 0x83, 0x01, 0x2c, 0xc0, 0x0a, 0x34, - 0x02, 0xcc, 0x00, 0x83, 0x10, 0x20, 0xc0, 0x0b, - 0x30, 0x82, 0x0a, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x21, 0x01, 0x3e, 0x80, 0x87, 0x00, 0x2d, - 0xc2, 0x0b, 0x70, 0x06, 0xdc, 0x00, 0xb7, 0x40, - 0x2d, 0xe0, 0x08, 0x70, 0x82, 0x5c, 0x00, 0xb7, - 0x20, 0x2d, 0xd0, 0x4b, 0x70, 0x02, 0xfc, 0x04, - 0xa7, 0x00, 0x2d, 0xed, 0x09, 0x00, 0x79, 0x00, - 0xc0, 0x0b, 0x60, 0x02, 0xdc, 0x00, 0xbf, 0x86, - 0x25, 0x00, 0x0b, 0x70, 0x02, 0xdc, 0x06, 0x97, - 0x00, 0x29, 0xc4, 0x03, 0x40, 0xc2, 0xde, 0x00, - 0xa3, 0x00, 0x61, 0xc0, 0x0b, 0x38, 0x02, 0x28, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0x48, - 0x1e, 0x80, 0xd7, 0x80, 0x3d, 0xe0, 0x0f, 0x78, - 0x03, 0xde, 0x00, 0xf7, 0x80, 0x3b, 0xe1, 0x1c, - 0x78, 0x02, 0xde, 0x00, 0xf7, 0xc0, 0x3d, 0xe0, - 0x0f, 0x78, 0x03, 0xde, 0x00, 0xc7, 0x80, 0x3d, - 0xe0, 0x0e, 0x58, 0x02, 0xde, 0x00, 0xf7, 0x80, - 0x3d, 0x20, 0x8d, 0x78, 0x03, 0xff, 0x82, 0xd7, - 0x82, 0x3d, 0xe0, 0x4e, 0x78, 0x23, 0xde, 0x00, - 0x47, 0x80, 0x31, 0xe0, 0x0f, 0x78, 0x13, 0x2a, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0d, - 0x8c, 0x40, 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xb0, - 0x03, 0xec, 0x10, 0xfb, 0x00, 0x3a, 0xc0, 0x0f, - 0xb0, 0x03, 0x6c, 0x00, 0xfb, 0x48, 0x3e, 0x00, - 0x0f, 0xb0, 0x03, 0xc4, 0x00, 0xd9, 0x04, 0x3a, - 0x80, 0x0f, 0x80, 0x03, 0xec, 0x00, 0x73, 0x00, - 0x3a, 0x00, 0x0f, 0xb0, 0x03, 0xed, 0xa0, 0xe9, - 0x00, 0x3e, 0xc0, 0x0f, 0x80, 0x03, 0xcc, 0x00, - 0x7b, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xc2, - 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, - 0xfe, 0x00, 0xff, 0x80, 0x33, 0xe0, 0x0c, 0xf8, - 0x03, 0x1e, 0x00, 0xef, 0x80, 0x3f, 0xe0, 0x0c, - 0xf8, 0x03, 0xfe, 0x00, 0xcf, 0x80, 0x37, 0xe0, - 0x0f, 0xe8, 0x02, 0x3e, 0x00, 0xff, 0x90, 0x33, - 0xe0, 0x0f, 0x48, 0x02, 0x3e, 0x50, 0xf5, 0x10, - 0x3b, 0x60, 0x0f, 0xf9, 0x13, 0xfe, 0x08, 0xff, - 0x80, 0x33, 0xe0, 0x4d, 0xf8, 0x23, 0xde, 0x04, - 0x8f, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0x40, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x7a, 0x00, 0xa8, 0x19, 0x9c, 0x00, 0xbf, - 0x00, 0x23, 0xc0, 0x08, 0xf4, 0x02, 0x1c, 0x00, - 0x85, 0x00, 0x2f, 0x44, 0x08, 0x51, 0x00, 0xd4, - 0x00, 0x87, 0x00, 0x21, 0xc0, 0x4b, 0xe0, 0x02, - 0x1c, 0x80, 0xbf, 0x00, 0x29, 0x50, 0x0e, 0x44, - 0x03, 0x58, 0x04, 0x37, 0x60, 0x21, 0x04, 0x0b, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x01, 0x69, 0xc0, - 0x0b, 0x61, 0x02, 0x5c, 0x40, 0x85, 0x20, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0x6a, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x00, 0x9c, 0x00, 0xb7, - 0x00, 0x21, 0xc0, 0x08, 0x60, 0x02, 0x14, 0x00, - 0xa7, 0x00, 0x2d, 0x80, 0x08, 0x70, 0x02, 0xfc, - 0x00, 0x87, 0x00, 0x21, 0xc0, 0x0b, 0x40, 0x02, - 0x18, 0x04, 0xb6, 0x04, 0x21, 0xc0, 0x09, 0xc0, - 0x02, 0x15, 0x04, 0xb7, 0x40, 0x29, 0x00, 0x0b, - 0x60, 0x06, 0xdc, 0x00, 0xbe, 0x00, 0x25, 0xc0, - 0x0b, 0x50, 0x02, 0x7c, 0x00, 0x87, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0x40, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x62, 0x04, 0xcd, 0x80, 0xb3, - 0x00, 0x20, 0xc0, 0x08, 0x30, 0x42, 0x0c, 0x00, - 0x83, 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xcc, - 0x00, 0x83, 0x00, 0x40, 0xc0, 0x0b, 0x00, 0x02, - 0x20, 0x00, 0xb3, 0x00, 0x28, 0xc0, 0x0a, 0x00, - 0x0a, 0x00, 0x40, 0xb3, 0x80, 0x20, 0x20, 0x0b, - 0x20, 0x22, 0xcc, 0x08, 0xb0, 0xc4, 0x6c, 0xc0, - 0x09, 0x00, 0x42, 0x4e, 0x40, 0x80, 0x00, 0x2c, - 0xe2, 0x0b, 0x26, 0x22, 0x48, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xaa, 0x05, 0xbd, 0x10, 0xfb, - 0x00, 0x32, 0xc0, 0x0c, 0xb0, 0x03, 0x2c, 0x00, - 0xeb, 0x00, 0x3e, 0xc0, 0x0c, 0xb0, 0x03, 0xcc, - 0x00, 0xcf, 0x00, 0xb2, 0xc0, 0x0f, 0x90, 0x03, - 0x2c, 0x04, 0xfb, 0x02, 0x32, 0xc0, 0x0d, 0x90, - 0x02, 0xed, 0x09, 0x00, 0x7b, 0x00, 0x0d, 0x00, - 0xfb, 0xc0, 0x1a, 0x58, 0x0f, 0x30, 0x03, 0xfc, - 0x04, 0xf3, 0x8a, 0x37, 0xc0, 0x0f, 0xb0, 0x03, - 0x6d, 0x00, 0xcb, 0x00, 0x3e, 0xf8, 0x0f, 0x3c, - 0x03, 0x6a, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x90, 0x10, 0xec, 0x00, 0xf9, 0x40, 0x3e, 0x50, - 0x0f, 0x94, 0x13, 0xe4, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb4, 0x03, 0xee, 0x04, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0x80, 0x0b, 0xe9, 0x00, 0xfb, - 0x40, 0x3e, 0xc0, 0x0f, 0x88, 0x03, 0xec, 0x00, - 0xfb, 0x10, 0x3e, 0x08, 0x07, 0xa4, 0x03, 0xec, - 0x00, 0xfa, 0x48, 0x3a, 0xc0, 0x0b, 0x90, 0x23, - 0x64, 0x80, 0xf3, 0x00, 0x3e, 0xc0, 0x0f, 0xb8, - 0x13, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x81, 0x90, 0xfc, 0x00, 0xff, 0x10, 0x33, 0xe0, - 0x0c, 0xf1, 0x03, 0x3c, 0x00, 0xfd, 0x80, 0x3f, - 0xc8, 0x0c, 0xdc, 0x02, 0xb4, 0x00, 0xcf, 0x00, - 0x3f, 0xd0, 0x0c, 0xd0, 0x07, 0xfe, 0x00, 0xcf, - 0x80, 0x3f, 0xf0, 0x0f, 0xc0, 0x03, 0xff, 0x01, - 0xcf, 0x00, 0x2f, 0x00, 0x0c, 0xf2, 0x03, 0x3c, - 0x00, 0xdf, 0xa0, 0x31, 0xc0, 0x0c, 0x70, 0x03, - 0x3e, 0x00, 0xfe, 0x10, 0x33, 0xc0, 0x8f, 0xf4, - 0x23, 0x00, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xc1, 0x04, 0x6c, 0x00, 0xbb, 0xc8, 0x22, 0xd6, - 0x08, 0xb8, 0x02, 0x2c, 0x00, 0xbb, 0x90, 0x2e, - 0xf8, 0x08, 0x38, 0x02, 0x2e, 0x00, 0x8b, 0x00, - 0x2e, 0xc0, 0x0d, 0x88, 0x02, 0xe0, 0x40, 0x8b, - 0xd0, 0x2e, 0xd0, 0x0b, 0x8c, 0x02, 0xed, 0x04, - 0x8b, 0x00, 0x1e, 0x21, 0x0b, 0xac, 0x02, 0xac, - 0x04, 0x98, 0x48, 0x3e, 0xc0, 0x0d, 0x9c, 0x03, - 0xe6, 0x48, 0xb8, 0x40, 0x2a, 0xc0, 0x09, 0xb8, - 0x02, 0x20, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x04, 0x2c, 0x00, 0xed, 0x09, 0x00, 0x7c, - 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x08, 0x30, 0x02, - 0x2e, 0x00, 0xbb, 0x00, 0x2c, 0xc0, 0x08, 0xb0, - 0x82, 0x2c, 0x80, 0x8b, 0x00, 0x28, 0xc0, 0x08, - 0x88, 0x00, 0xe4, 0x00, 0x8b, 0x08, 0x2e, 0xc0, - 0x0b, 0x88, 0x02, 0xec, 0x20, 0x89, 0x00, 0x2e, - 0x60, 0x0b, 0xb4, 0x0a, 0x2c, 0x05, 0x99, 0x02, - 0x2a, 0xc0, 0x08, 0x88, 0x02, 0x2c, 0x00, 0xab, - 0x00, 0x22, 0xc0, 0x0b, 0xb0, 0x06, 0xa0, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x0c, - 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x08, 0x30, 0x12, - 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x08, 0x30, - 0x06, 0x2c, 0x00, 0x83, 0x00, 0x2c, 0xc0, 0x09, - 0x08, 0x02, 0xc0, 0x01, 0x83, 0x00, 0x2c, 0xc0, - 0x0b, 0x00, 0x62, 0x40, 0x02, 0x83, 0x02, 0x2c, - 0x00, 0x1b, 0x20, 0x02, 0x8c, 0x00, 0x98, 0x00, - 0x24, 0xc0, 0x09, 0x00, 0x02, 0xc4, 0x00, 0xb1, - 0x00, 0xa8, 0xc0, 0x09, 0x30, 0x02, 0x02, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x6c, - 0x00, 0xfb, 0x00, 0x32, 0xc0, 0x0c, 0xb0, 0x03, - 0x2c, 0x00, 0xbb, 0x00, 0x3e, 0xc0, 0x0c, 0xb0, - 0x03, 0x2c, 0x00, 0xc7, 0x00, 0x3a, 0xc0, 0x0c, - 0x80, 0x02, 0xe0, 0x10, 0xcb, 0x00, 0x3e, 0xc0, - 0x0f, 0x80, 0x02, 0xe0, 0x00, 0x8b, 0x02, 0x2e, - 0x00, 0x0e, 0x80, 0x03, 0x3c, 0x00, 0xd8, 0x00, - 0x3a, 0xc0, 0x0c, 0x90, 0x03, 0x2c, 0x00, 0xfa, - 0x01, 0x32, 0xc1, 0x0f, 0x90, 0x0b, 0x80, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xbc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xf4, 0x00, 0xfd, 0x00, 0x3f, 0xc0, 0x0f, 0xc0, - 0x03, 0x54, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xc0, 0x03, 0xf0, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0xfe, 0x00, 0xed, - 0x09, 0x00, 0x7d, 0x00, 0x3b, 0x00, 0x07, 0xc0, - 0x0b, 0xfc, 0x00, 0xd4, 0x00, 0x3f, 0xc0, 0x0f, - 0xd0, 0x03, 0xb4, 0x00, 0xbc, 0x01, 0x1f, 0xc0, - 0x8f, 0xc0, 0x03, 0xe8, 0x02, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x05, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0x80, 0x81, 0xc1, 0x0b, 0x30, 0xc0, 0xef, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xef, 0x00, 0x33, 0xc0, 0x0c, 0xf0, 0x03, 0xfc, - 0x00, 0xfc, 0x00, 0x37, 0x80, 0x0f, 0xf0, 0x03, - 0x7c, 0x00, 0xdf, 0x00, 0x33, 0xc0, 0x0c, 0xf4, - 0x13, 0xbc, 0x40, 0xff, 0x00, 0x33, 0xd0, 0x0e, - 0xf0, 0x03, 0x70, 0x44, 0xec, 0x35, 0x33, 0x0c, - 0x0c, 0xc2, 0x03, 0xf0, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x10, 0xec, 0x00, 0xbb, 0x00, - 0x2e, 0x80, 0x0b, 0x82, 0x02, 0x01, 0xc0, 0x8b, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0xa0, 0xc0, 0x08, 0xb0, 0x06, 0xec, - 0x10, 0xb8, 0x00, 0x22, 0x80, 0x08, 0xb0, 0x02, - 0x3c, 0x04, 0x87, 0x00, 0x23, 0xc0, 0x08, 0xf2, - 0x02, 0x3c, 0x80, 0xbb, 0x00, 0x22, 0xc0, 0x0b, - 0xb0, 0x02, 0xc1, 0x80, 0xb9, 0x30, 0xa2, 0x18, - 0x48, 0x96, 0x82, 0xe0, 0x06, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x88, 0x05, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0x40, 0x0b, 0x88, 0x06, 0x0a, 0x04, 0x83, - 0x04, 0x28, 0xc0, 0x0b, 0x30, 0x02, 0xc4, 0x00, - 0xb3, 0x00, 0x20, 0xc0, 0x08, 0x30, 0x02, 0xcc, - 0x00, 0xb8, 0x00, 0x24, 0x80, 0x0a, 0x30, 0x02, - 0xcc, 0x00, 0x93, 0x00, 0x24, 0xc1, 0x08, 0x32, - 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x20, 0xc8, 0x0b, - 0x30, 0x02, 0x81, 0x80, 0x90, 0x20, 0x20, 0x0c, - 0x08, 0x21, 0x02, 0xe2, 0x01, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x15, 0xac, 0x00, 0xbb, 0x00, - 0x2e, 0xc8, 0xed, 0x09, 0x00, 0x7e, 0x00, 0x8b, - 0x80, 0x02, 0x22, 0x10, 0x8b, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x10, 0xec, 0x48, 0xbb, 0x00, 0x22, - 0xc0, 0x08, 0xb0, 0x02, 0xec, 0x00, 0xba, 0x00, - 0x22, 0xe0, 0x08, 0xb2, 0x02, 0x8c, 0x00, 0x83, - 0x00, 0xa6, 0xc0, 0x1a, 0xb0, 0x02, 0x2c, 0x00, - 0xbb, 0x00, 0x22, 0xc0, 0x03, 0xb0, 0x02, 0xe8, - 0x01, 0xb3, 0x00, 0x20, 0x00, 0x08, 0x95, 0x02, - 0xf0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x15, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0x88, 0x03, 0x22, 0x02, 0xcb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xe9, 0x00, 0xe3, 0x00, 0x32, - 0xc0, 0x08, 0xb0, 0x02, 0xec, 0x00, 0xf0, 0xd8, - 0x34, 0x88, 0x0e, 0x30, 0x03, 0xec, 0x00, 0xdb, - 0x04, 0x16, 0xc0, 0x0c, 0xb0, 0x12, 0xac, 0x00, - 0xfb, 0x00, 0xb2, 0xc0, 0x0e, 0xb0, 0x43, 0x64, - 0x20, 0xea, 0x04, 0x32, 0x30, 0x24, 0x88, 0x03, - 0xd0, 0x44, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x01, 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc2, 0x8f, - 0xc9, 0x03, 0xd4, 0x20, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xfa, 0x00, 0xff, 0x08, 0x3f, - 0xc0, 0x4f, 0xf0, 0x03, 0xfc, 0x00, 0xfc, 0x01, - 0x3f, 0xc0, 0x0e, 0xf8, 0x23, 0x7c, 0x00, 0xff, - 0x00, 0x0b, 0xc0, 0x2d, 0x70, 0x0b, 0xfc, 0x20, - 0xfb, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x02, 0x77, - 0x00, 0xfc, 0x01, 0x3f, 0xa4, 0x4f, 0xc8, 0x01, - 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x10, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0d, - 0x81, 0x83, 0x28, 0x00, 0xcb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xed, 0x00, 0xeb, 0x00, 0x3e, - 0xc0, 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xf8, 0x40, - 0x3a, 0xb2, 0x0c, 0xba, 0x03, 0x2c, 0x00, 0xdb, - 0x00, 0x3a, 0xc0, 0x0d, 0xb2, 0xed, 0x09, 0x00, - 0x7f, 0x00, 0x03, 0xec, 0x02, 0xcb, 0x00, 0x32, - 0xc0, 0x0d, 0xb0, 0x03, 0xe4, 0x22, 0xca, 0x00, - 0x3e, 0x50, 0x0c, 0xa4, 0x0b, 0x10, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x00, - 0xbb, 0x00, 0x2e, 0xe0, 0x88, 0x0c, 0x02, 0x25, - 0x00, 0x8b, 0x00, 0x2e, 0xc0, 0x0b, 0xf0, 0x02, - 0xec, 0x00, 0x8b, 0x40, 0x2e, 0xc0, 0x08, 0xb0, - 0x02, 0xec, 0x08, 0xba, 0x00, 0x22, 0xc0, 0x08, - 0xb0, 0x00, 0xbc, 0x00, 0x8f, 0x00, 0x23, 0xc0, - 0x00, 0xf4, 0x82, 0xfe, 0x00, 0x8f, 0x00, 0x22, - 0xc0, 0x0b, 0xb0, 0x02, 0xef, 0x00, 0x8a, 0x00, - 0x2e, 0xd6, 0x08, 0x85, 0x02, 0x32, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4c, 0x00, - 0xb3, 0x00, 0x2c, 0xb4, 0x09, 0x0c, 0x02, 0x43, - 0x40, 0x83, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xa3, 0x00, 0x2e, 0xc0, 0x08, 0x30, - 0x42, 0xcc, 0x00, 0xb1, 0x00, 0x28, 0x80, 0x08, - 0x34, 0x00, 0x0c, 0x00, 0x93, 0x00, 0x2a, 0xc0, - 0x09, 0x34, 0x02, 0xcf, 0x08, 0x8b, 0x00, 0x28, - 0xc0, 0x89, 0x30, 0x12, 0x48, 0x00, 0x80, 0x00, - 0x2c, 0xc0, 0x08, 0x00, 0x06, 0x30, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x1e, 0x00, - 0xb7, 0x80, 0x2d, 0xa4, 0x08, 0x48, 0x0a, 0x52, - 0x00, 0x87, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, - 0xfe, 0x00, 0x07, 0x80, 0x2d, 0xe0, 0x28, 0x78, - 0x02, 0xde, 0x00, 0xbc, 0x90, 0x23, 0xac, 0x08, - 0xd9, 0x02, 0x1e, 0x00, 0x87, 0x80, 0x25, 0xe0, - 0x09, 0x78, 0x02, 0xde, 0x20, 0x87, 0x80, 0x29, - 0xf4, 0x8b, 0x78, 0x02, 0xd6, 0x20, 0x05, 0x80, - 0x2c, 0xe0, 0x2a, 0x38, 0x06, 0x88, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x0c, 0x00, - 0xf3, 0x00, 0x3c, 0xc0, 0x0d, 0x80, 0x03, 0x48, - 0xed, 0x09, 0x00, 0x80, 0x00, 0x42, 0xc3, 0x00, - 0x3c, 0xc0, 0x0f, 0x30, 0x03, 0xcd, 0x40, 0xe3, - 0x00, 0x3c, 0xc0, 0x0c, 0x30, 0x03, 0xcc, 0x00, - 0xf1, 0x00, 0x38, 0xcc, 0x0c, 0x31, 0x13, 0x2c, - 0x00, 0xd3, 0x00, 0x7a, 0xc8, 0x0d, 0x30, 0x03, - 0xec, 0x00, 0xc3, 0x00, 0x38, 0xc0, 0x0d, 0x30, - 0x03, 0xc8, 0x00, 0xc0, 0x40, 0x3c, 0xc9, 0x8c, - 0x20, 0x03, 0x12, 0x02, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x00, 0x3d, - 0xc0, 0x0f, 0xc1, 0x03, 0xb8, 0x10, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x83, 0xd4, 0x10, 0xff, - 0x00, 0x3f, 0xc0, 0xaf, 0xf0, 0x03, 0xfc, 0x00, - 0xf4, 0x04, 0x3d, 0xcd, 0xaf, 0x71, 0x53, 0xfc, - 0x40, 0xff, 0x00, 0x33, 0xc0, 0x0e, 0xf0, 0x03, - 0xfc, 0x00, 0x7f, 0x00, 0x37, 0xc0, 0x0f, 0xf0, - 0x17, 0xfc, 0x0c, 0xef, 0x10, 0x3f, 0xc0, 0x0d, - 0xf0, 0x03, 0x50, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x05, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0c, 0x88, 0x03, 0x20, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0c, 0xb0, 0x43, 0xec, 0x00, - 0xfa, 0x80, 0x30, 0xe0, 0x0a, 0xa8, 0x03, 0xac, - 0xa0, 0xfb, 0xa8, 0x3e, 0xe6, 0x0e, 0xb3, 0x03, - 0x2c, 0xc0, 0xcb, 0x00, 0x3e, 0xe0, 0x84, 0xb0, - 0x01, 0xe8, 0x00, 0xfb, 0x00, 0x2e, 0x00, 0x0f, - 0x90, 0x03, 0xc2, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0d, 0xc0, 0x02, 0x10, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x72, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x2f, 0xc0, 0x28, 0x70, 0x12, 0xdc, 0x00, - 0xb6, 0x00, 0x29, 0xc0, 0x28, 0x50, 0x02, 0x1d, - 0x00, 0xb7, 0x40, 0x2d, 0xc8, 0x08, 0x32, 0xea, - 0x0c, 0x20, 0xa7, 0xed, 0x09, 0x00, 0x81, 0x00, - 0x40, 0x2f, 0xc0, 0x88, 0x70, 0x02, 0xd4, 0x00, - 0x85, 0x00, 0x2d, 0x80, 0x0b, 0x70, 0x02, 0xd2, - 0x26, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, - 0x9e, 0x00, 0xb7, 0x80, 0x2b, 0xe0, 0x08, 0x48, - 0x02, 0x1e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, - 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x28, 0x78, 0x42, 0xde, 0x00, 0xbc, 0x80, 0x29, - 0xe0, 0x2a, 0xf8, 0x02, 0x1e, 0x08, 0xb7, 0x00, - 0x25, 0xe8, 0x0a, 0x78, 0x02, 0x1c, 0x80, 0x87, - 0xa0, 0x2d, 0xe0, 0x08, 0x78, 0x02, 0xca, 0x10, - 0x97, 0x8e, 0x6d, 0x60, 0x0b, 0x78, 0x02, 0xc8, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, - 0xcc, 0x00, 0xb3, 0x00, 0x6c, 0xe4, 0x29, 0x30, - 0x12, 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcd, 0x80, 0xb3, 0x00, 0x2e, 0xc0, - 0x08, 0x30, 0x02, 0xcc, 0x00, 0xb0, 0x10, 0x28, - 0x40, 0x88, 0x34, 0x06, 0x0c, 0x04, 0xb3, 0x00, - 0x2c, 0xc0, 0x08, 0xb0, 0x02, 0x0c, 0x00, 0xa3, - 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xcd, 0x00, - 0xa3, 0xa0, 0x6c, 0xf4, 0x0b, 0x34, 0x02, 0xda, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x11, - 0xa8, 0x00, 0xfa, 0x00, 0x3d, 0x90, 0x08, 0xe4, - 0x8b, 0x38, 0x00, 0xfa, 0x00, 0x3e, 0x80, 0x0f, - 0xa0, 0x03, 0xfb, 0x80, 0xfa, 0x00, 0x3e, 0x80, - 0x0c, 0xa0, 0x03, 0xe8, 0x00, 0xfe, 0xd0, 0x3b, - 0x90, 0x0e, 0xe4, 0x4b, 0x28, 0x00, 0xba, 0x00, - 0x36, 0x80, 0x0a, 0xa0, 0x03, 0x28, 0x00, 0xca, - 0x00, 0x3e, 0x80, 0x0c, 0xa0, 0x03, 0xf8, 0x41, - 0xfe, 0x01, 0x3f, 0x80, 0x47, 0xe0, 0x03, 0xfa, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x20, 0x0f, 0x8c, - 0x03, 0xe1, 0x80, 0xf8, 0x00, 0x3e, 0xed, 0x09, - 0x00, 0x82, 0x00, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x40, 0x3e, 0x00, 0x4f, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x21, 0x2f, 0x82, - 0x00, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x4f, - 0x84, 0x03, 0xe1, 0x00, 0xd8, 0x00, 0x3e, 0x00, - 0x2f, 0x80, 0x03, 0xc0, 0x01, 0xd0, 0x00, 0x3e, - 0x02, 0x0f, 0x80, 0x03, 0xd2, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0e, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0x64, - 0x00, 0xf9, 0xa0, 0x3e, 0x40, 0x0e, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0d, 0x98, - 0x03, 0xe4, 0x02, 0xc1, 0x00, 0x22, 0x40, 0x0e, - 0x9c, 0x03, 0x27, 0x00, 0xb9, 0x00, 0x3e, 0x70, - 0x0f, 0x90, 0x03, 0x64, 0x00, 0xc9, 0x01, 0x32, - 0x44, 0x8f, 0x10, 0x81, 0x02, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x04, 0x64, 0x00, 0xb9, - 0x00, 0x2e, 0x60, 0x0c, 0x94, 0x82, 0xe5, 0x2c, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x12, 0xe4, - 0x00, 0xb9, 0x40, 0x2e, 0x40, 0x08, 0x90, 0x02, - 0xe4, 0x08, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xe4, 0x08, 0x89, 0x00, 0x22, 0x41, 0x0b, - 0x90, 0x02, 0x25, 0x00, 0xb9, 0x00, 0x2e, 0x60, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0x89, 0x30, 0x22, - 0x48, 0x0b, 0x90, 0x8a, 0x20, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, 0x00, 0xb9, - 0x00, 0x2e, 0x48, 0x0a, 0x90, 0x02, 0xe6, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x08, 0x90, 0x42, - 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x61, 0x0b, 0xb2, - 0x02, 0xc4, 0x00, 0x89, 0x00, 0x2a, 0x40, 0x0b, - 0x94, 0x0a, 0x25, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0xed, 0x09, 0x00, 0x83, 0x00, 0x90, 0x02, - 0xe4, 0x00, 0x89, 0x00, 0x26, 0xc0, 0x01, 0x92, - 0x02, 0x0e, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x04, 0x00, 0xb1, 0x00, 0x2e, 0xc0, - 0x09, 0x14, 0x02, 0xc5, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x0b, 0x14, 0x02, 0xc4, 0x00, 0xb3, 0x00, - 0x2c, 0x50, 0x08, 0x10, 0x02, 0xc4, 0x00, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc5, 0x04, - 0x81, 0x40, 0x28, 0x50, 0x8b, 0x14, 0x02, 0x05, - 0x00, 0xb1, 0x28, 0x2c, 0xd0, 0x0b, 0x10, 0x02, - 0xc5, 0x12, 0x81, 0x42, 0xa4, 0x50, 0x0b, 0x14, - 0x02, 0x8a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb8, 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0e, 0x80, 0x43, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x88, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0c, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x02, 0x3e, 0x00, 0x0f, 0xa0, 0x13, 0xe0, 0x08, - 0xc8, 0x04, 0x38, 0x00, 0x0e, 0x80, 0x03, 0x20, - 0x00, 0xf8, 0x22, 0x3e, 0x00, 0x0f, 0x80, 0x23, - 0x60, 0x00, 0xc8, 0x00, 0x36, 0x00, 0x0f, 0x80, - 0x03, 0x2e, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x98, 0x1d, 0xe4, 0x00, 0xf9, 0x00, 0x3d, 0x40, - 0x0e, 0xd0, 0x43, 0xf5, 0x10, 0xf9, 0x00, 0x3e, - 0x40, 0x0f, 0x9c, 0x03, 0xf4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x2b, 0x90, 0x03, 0xe4, 0x00, 0xf5, - 0x01, 0x3f, 0xc0, 0x0f, 0x50, 0x13, 0xe5, 0x01, - 0xf9, 0x42, 0x36, 0x50, 0x0f, 0x94, 0x03, 0xe5, - 0x00, 0xf9, 0x28, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0x75, 0x00, 0xfd, 0x40, 0x3b, 0xd0, 0x0f, 0xd4, - 0x03, 0x66, 0x24, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x01, 0xe4, 0x00, 0xf9, 0x00, 0x3d, 0x40, - 0x0c, 0xd1, 0x03, 0x34, 0x80, 0xc9, 0x00, 0x3e, - 0x40, 0x07, 0x93, 0x03, 0xed, 0x09, 0x00, 0x84, - 0x00, 0x24, 0x00, 0xfd, 0x00, 0x3f, 0x40, 0x2c, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x31, 0xc0, - 0x0e, 0xd0, 0x03, 0xe4, 0x80, 0xf9, 0x28, 0x36, - 0x4c, 0x0e, 0xd0, 0x03, 0x74, 0x00, 0xc9, 0x28, - 0x3f, 0x40, 0x0f, 0x90, 0x03, 0xf4, 0xc0, 0xfd, - 0x01, 0x2f, 0x40, 0x8f, 0xd1, 0x03, 0xc6, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, - 0x00, 0xb8, 0x00, 0x2e, 0x01, 0x0d, 0x00, 0x02, - 0x20, 0xa0, 0x88, 0x00, 0x2e, 0x00, 0x0b, 0x83, - 0x22, 0x20, 0x00, 0xb8, 0x00, 0x2e, 0x0a, 0x08, - 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2a, 0x00, - 0x08, 0xa0, 0x02, 0xe0, 0xa5, 0xb8, 0x20, 0x2c, - 0x0d, 0x0e, 0x84, 0x82, 0xa0, 0x20, 0x88, 0x20, - 0x2e, 0x0a, 0x0b, 0x80, 0x02, 0xe0, 0xc0, 0xb8, - 0x48, 0x2e, 0x02, 0x0b, 0x01, 0x02, 0xce, 0x06, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, - 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x08, 0x90, 0x02, - 0x04, 0xc0, 0x81, 0x00, 0x2c, 0x40, 0x0b, 0x12, - 0x02, 0x04, 0x00, 0xb1, 0x00, 0x2c, 0x48, 0x08, - 0x10, 0x02, 0xc4, 0x00, 0xb9, 0x00, 0x20, 0x40, - 0x8a, 0x10, 0x02, 0xc4, 0xc0, 0xb1, 0x28, 0x28, - 0x48, 0x0a, 0x13, 0x02, 0x44, 0x50, 0x81, 0x28, - 0x2c, 0x48, 0x0b, 0x10, 0x40, 0x44, 0x80, 0xb1, - 0x30, 0x2c, 0x44, 0x0b, 0x10, 0x02, 0xd2, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, - 0x00, 0xb9, 0x04, 0x2e, 0x40, 0x09, 0xb0, 0x02, - 0x26, 0x0c, 0x89, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0x25, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x08, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x01, 0x2a, 0x49, - 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x0e, - 0x40, 0x4a, 0x90, 0x02, 0xa4, 0x00, 0x89, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x84, 0xed, - 0x09, 0x00, 0x85, 0x00, 0xb9, 0x20, 0x2e, 0x40, - 0x03, 0x90, 0x02, 0xc6, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, 0x00, - 0x3c, 0x56, 0x0c, 0x94, 0x8b, 0x26, 0x82, 0xc9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x0b, 0x26, 0x04, - 0xb9, 0x04, 0x3e, 0x40, 0x0c, 0x90, 0x03, 0xe4, - 0x00, 0xf1, 0x10, 0x20, 0x50, 0x0a, 0x98, 0x03, - 0xe4, 0x00, 0xb9, 0x00, 0x36, 0x40, 0x0e, 0x90, - 0x03, 0x64, 0x02, 0xc9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x07, 0x98, 0x03, 0xe8, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x00, - 0x3e, 0x60, 0x0f, 0x99, 0x03, 0xc4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x40, - 0xf9, 0x00, 0x1e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x41, 0x0f, 0x94, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x1e, 0x40, 0x07, 0x90, - 0x07, 0x64, 0x00, 0xf9, 0x00, 0x1e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x91, 0x03, 0xd2, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x10, 0xa0, 0x00, 0xf8, 0x00, - 0x3e, 0x08, 0x0c, 0x84, 0x03, 0x21, 0x20, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x23, 0xe1, 0x00, - 0xf8, 0x80, 0x32, 0x01, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x20, 0x4c, 0x88, 0x0b, - 0x20, 0x10, 0xf8, 0x00, 0x3a, 0x00, 0x0e, 0x00, - 0x23, 0xe0, 0x20, 0xc8, 0x00, 0x32, 0x08, 0x0f, - 0x80, 0x03, 0xe0, 0x20, 0xc8, 0x22, 0x3e, 0x11, - 0x0f, 0x82, 0x0b, 0x02, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x05, 0x28, 0x00, 0xba, 0x00, - 0x2f, 0x80, 0x28, 0x68, 0x82, 0x3a, 0x00, 0xba, - 0x00, 0x3a, 0x80, 0x0b, 0xa0, 0x03, 0xa8, 0x00, - 0xee, 0x40, 0xed, 0x09, 0x00, 0x86, 0x00, 0x2a, - 0x80, 0x0b, 0xa0, 0x02, 0xe8, 0x00, 0xba, 0x01, - 0x27, 0x91, 0x08, 0xe4, 0x02, 0x28, 0x00, 0x9a, - 0x00, 0x22, 0x81, 0x08, 0xe1, 0x03, 0xb9, 0x00, - 0xaa, 0x05, 0x23, 0x80, 0x0b, 0xa0, 0x02, 0xfb, - 0x10, 0x8e, 0xc0, 0x2f, 0x90, 0x0b, 0xec, 0x02, - 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x05, 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xd4, 0x18, - 0x38, 0x02, 0x0f, 0x40, 0xb3, 0x04, 0x2c, 0xc0, - 0x0b, 0xb0, 0x02, 0x8c, 0x04, 0xb3, 0x00, 0x02, - 0xe4, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xe0, 0x08, 0x38, 0x02, 0x0c, 0x00, 0xb3, - 0x00, 0x28, 0xc0, 0x0a, 0x30, 0x02, 0xad, 0x00, - 0xa3, 0x00, 0xa0, 0xe0, 0x0b, 0x30, 0x02, 0xcf, - 0x00, 0x83, 0x81, 0x2c, 0xc8, 0x0b, 0x30, 0x02, - 0x0a, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x01, 0x1c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x08, - 0x50, 0x02, 0x18, 0x00, 0xb7, 0x00, 0x29, 0xc0, - 0x0b, 0x72, 0x02, 0x9c, 0x00, 0xa7, 0x80, 0x29, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc2, 0x08, 0xf8, 0x82, 0x1c, 0x80, 0x97, - 0x80, 0x21, 0xe0, 0x08, 0x70, 0x02, 0x8c, 0x08, - 0xa3, 0xa0, 0x21, 0x90, 0x0b, 0x70, 0x00, 0xd6, - 0x2a, 0x87, 0x41, 0x2d, 0xc0, 0x0b, 0x68, 0x82, - 0x20, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x08, 0x1e, 0x00, 0xf7, 0x80, 0x2d, 0xe0, 0x08, - 0x78, 0x03, 0x1e, 0x00, 0xf7, 0x80, 0x3d, 0xe0, - 0x0f, 0x7c, 0x03, 0x9e, 0x08, 0xf7, 0x82, 0x31, - 0xe0, 0x0f, 0x78, 0x03, 0xde, 0x00, 0xf7, 0x80, - 0x2d, 0xe0, 0x0c, 0x78, 0x03, 0x1f, 0x40, 0xff, - 0xf0, 0x39, 0xe8, 0x0e, 0x78, 0x03, 0x9e, 0x00, - 0xe7, 0xa4, 0x31, 0xe1, 0x0f, 0x78, 0x03, 0xfe, - 0x00, 0xc5, 0x80, 0x2d, 0xa0, 0xed, 0x09, 0x00, - 0x87, 0x00, 0x0f, 0x78, 0x03, 0x22, 0x02, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, 0xac, 0x00, - 0xfb, 0x00, 0x3e, 0x40, 0x0f, 0x80, 0x0b, 0xe4, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xac, 0x00, 0xf3, 0x00, 0x3e, 0xd0, 0x07, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x36, 0xc0, 0x2f, - 0x20, 0x03, 0xec, 0x80, 0xdb, 0x20, 0x3a, 0xd0, - 0x0f, 0x80, 0x03, 0xa0, 0x00, 0xfb, 0x10, 0x3e, - 0x80, 0x0f, 0xb0, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0xa0, 0x13, 0xc2, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xfe, 0x00, - 0xff, 0x80, 0x3d, 0xe0, 0x0c, 0xf8, 0x03, 0x3e, - 0x10, 0xcf, 0x80, 0x3f, 0xe0, 0x0f, 0xf2, 0x03, - 0xfe, 0x00, 0xef, 0x80, 0x33, 0x70, 0x2c, 0xf8, - 0x03, 0xfe, 0x00, 0xff, 0x80, 0x3f, 0x60, 0x0f, - 0xe8, 0x43, 0xfe, 0x00, 0xcf, 0x80, 0x3f, 0xf2, - 0x0c, 0xe8, 0x03, 0xfa, 0x00, 0xff, 0x94, 0x3f, - 0xe0, 0x0f, 0xf8, 0x03, 0xfa, 0x00, 0xfe, 0x90, - 0x33, 0xe0, 0x0c, 0xd8, 0x03, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x19, 0x9c, 0x00, - 0xb7, 0x00, 0x2d, 0xc8, 0x08, 0x71, 0x8a, 0x18, - 0x40, 0x87, 0x00, 0x2d, 0xc0, 0x0e, 0x70, 0x42, - 0xdc, 0x10, 0xb7, 0x00, 0x21, 0x40, 0x28, 0x70, - 0x03, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0x82, 0x0b, - 0x40, 0x02, 0xdc, 0x40, 0xd7, 0x00, 0x2d, 0xc4, - 0x0d, 0x70, 0x02, 0xdc, 0x80, 0xf7, 0x30, 0x39, - 0xc4, 0x0b, 0x70, 0x02, 0xd4, 0x00, 0xb6, 0x00, - 0x23, 0x81, 0x0f, 0xd0, 0x03, 0xe2, 0x06, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, - 0xb7, 0x00, 0x2f, 0xc0, 0x18, 0x70, 0x02, 0x18, - 0x02, 0x87, 0x00, 0x2d, 0xc0, 0x0b, 0x71, 0x02, - 0xdc, 0x00, 0xa6, 0x10, 0x21, 0x60, 0x09, 0x70, - 0xed, 0x09, 0x00, 0x88, 0x00, 0x02, 0xdc, 0x00, - 0xb7, 0x00, 0x2d, 0xc4, 0x0b, 0x60, 0x02, 0xcc, - 0x00, 0x87, 0x10, 0x2c, 0xc0, 0x08, 0x60, 0x02, - 0xd8, 0x04, 0xb7, 0x00, 0x6d, 0x40, 0x0b, 0x70, - 0x02, 0xd8, 0x00, 0xb5, 0x0e, 0x21, 0x82, 0x09, - 0x60, 0x02, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x04, 0xcc, 0x00, 0xb3, 0x00, 0x6c, - 0x40, 0x08, 0x24, 0x06, 0x0a, 0x00, 0x83, 0x00, - 0x2c, 0xc0, 0x0a, 0x30, 0x22, 0xce, 0x00, 0xb3, - 0x00, 0x22, 0x40, 0x09, 0x30, 0x02, 0x8c, 0x00, - 0xb3, 0x54, 0x2c, 0x88, 0x0b, 0x26, 0x02, 0xcc, - 0x00, 0x93, 0x04, 0x2c, 0xc0, 0x09, 0x80, 0x42, - 0xc0, 0x00, 0xa3, 0x00, 0x6a, 0x40, 0x0b, 0x30, - 0x02, 0xc5, 0x80, 0xb9, 0x0c, 0xa0, 0x00, 0x0b, - 0x2d, 0x02, 0x88, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x05, 0xac, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0c, 0xa0, 0x03, 0x2d, 0x80, 0xcb, 0x00, - 0x2e, 0xc0, 0x0f, 0xf0, 0x02, 0xec, 0x20, 0x69, - 0x02, 0xb2, 0x40, 0x2d, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x10, 0x3e, 0xe0, 0x0b, 0xb4, 0x83, 0xfc, - 0x18, 0xcf, 0x04, 0x3f, 0xc0, 0x08, 0x90, 0x03, - 0xe4, 0x00, 0xbf, 0x00, 0x3e, 0x40, 0x0f, 0xb0, - 0x42, 0xec, 0x20, 0xfb, 0x40, 0x32, 0x40, 0x0d, - 0xb0, 0x02, 0x2a, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x00, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xe0, 0x0f, 0x84, 0x83, 0xe8, 0x80, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xf9, - 0x40, 0x36, 0x40, 0x2e, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x04, 0xf3, 0x02, 0x3e, 0xc1, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xfb, 0x00, 0x3e, 0x50, 0x4f, 0xb0, - 0x00, 0xe8, 0x00, 0xfb, 0x40, 0x3e, 0x40, 0x4c, - 0xa0, 0x23, 0xe0, 0xed, 0x09, 0x00, 0x89, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0c, 0xf9, - 0x03, 0x3c, 0x00, 0xcf, 0x00, 0x3f, 0xc0, 0xcf, - 0x70, 0x03, 0x7c, 0x00, 0xdf, 0x00, 0x33, 0x44, - 0x0c, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x33, - 0xf0, 0x0e, 0xfc, 0x13, 0xdc, 0x00, 0xcf, 0x00, - 0x31, 0xc0, 0x0c, 0xd0, 0x03, 0x34, 0x00, 0xf7, - 0x00, 0xb3, 0x00, 0x0c, 0xf0, 0x03, 0xbe, 0x04, - 0xda, 0xc2, 0x31, 0x80, 0x0e, 0xd1, 0x83, 0xc8, - 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, - 0x6c, 0x00, 0xbb, 0x00, 0x2c, 0xc0, 0x08, 0x8c, - 0x02, 0x26, 0x00, 0x8b, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x22, 0x0c, 0x00, 0x83, 0xf4, 0x36, 0x40, - 0x08, 0xb0, 0x03, 0xec, 0x00, 0xb3, 0x00, 0x36, - 0xe2, 0x0b, 0x80, 0x02, 0xec, 0x00, 0xab, 0x00, - 0x2a, 0xc1, 0x0a, 0x8c, 0x02, 0x23, 0x00, 0xbb, - 0x00, 0x22, 0x20, 0x08, 0xb0, 0x22, 0x69, 0x60, - 0x3a, 0x60, 0x22, 0x40, 0x08, 0x88, 0x02, 0xe8, - 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, - 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0x60, 0x08, 0x00, - 0x02, 0x0c, 0x80, 0x8b, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0x2c, 0x00, 0x99, 0x00, 0x22, 0xc0, - 0x18, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x22, - 0x80, 0x0b, 0xa0, 0x02, 0xec, 0x00, 0x8b, 0x00, - 0x22, 0xc0, 0x89, 0x9c, 0x02, 0x66, 0x20, 0xab, - 0x00, 0x22, 0x70, 0x08, 0xb0, 0x02, 0xe0, 0x00, - 0xb8, 0x00, 0x2a, 0x48, 0x88, 0x90, 0x12, 0xe0, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xe0, 0x08, 0x00, - 0x0a, 0x00, 0x00, 0x83, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0x2c, 0x08, 0x81, 0x00, 0x24, 0xc0, - 0x28, 0x30, 0x02, 0xcc, 0x00, 0xbb, 0xed, 0x09, - 0x00, 0x8a, 0x00, 0x00, 0x24, 0x80, 0x0b, 0x00, - 0x02, 0xcc, 0x08, 0xa3, 0x00, 0x28, 0xc0, 0x0a, - 0x10, 0x0a, 0x44, 0x00, 0xb3, 0x00, 0x20, 0x40, - 0x08, 0x30, 0x02, 0x40, 0x00, 0xb0, 0x00, 0x20, - 0x00, 0x18, 0x10, 0x02, 0xc2, 0x15, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xfb, - 0x00, 0x3e, 0x40, 0x0c, 0x10, 0x02, 0x08, 0x02, - 0xcb, 0x04, 0x2e, 0xc0, 0x0f, 0xb0, 0x02, 0x2c, - 0x04, 0xdb, 0x00, 0x31, 0xc0, 0x0c, 0xb0, 0x43, - 0xec, 0x00, 0xfb, 0x00, 0x32, 0x80, 0x0f, 0xa0, - 0x03, 0xfc, 0x00, 0xcf, 0x00, 0x33, 0xc0, 0x0d, - 0x90, 0x03, 0x64, 0x00, 0xfb, 0x01, 0x32, 0x00, - 0x2c, 0xb0, 0x03, 0xa0, 0x00, 0xd8, 0x00, 0xb2, - 0x80, 0x0e, 0x80, 0x03, 0xc0, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0x80, 0x0f, 0xc0, 0x03, 0xf0, 0x00, - 0xff, 0x00, 0x7f, 0xc0, 0x0b, 0xf0, 0x17, 0xbc, - 0x08, 0xf7, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xbc, 0x00, 0xff, 0x00, 0x3f, 0x80, 0x8f, 0xc0, - 0x03, 0xfc, 0x00, 0xff, 0x02, 0x3f, 0xc0, 0x0f, - 0xc0, 0x03, 0xb0, 0x00, 0xff, 0x00, 0x3f, 0x00, - 0x0f, 0xf0, 0x00, 0x70, 0x00, 0x7c, 0x00, 0x3f, - 0x00, 0x0f, 0xc0, 0x03, 0xe8, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x85, 0xfc, 0x00, 0xd5, - 0x12, 0x31, 0x44, 0x8f, 0xf0, 0x03, 0xfd, 0x00, - 0xcf, 0x00, 0x37, 0xc8, 0x0d, 0xf2, 0x03, 0xfc, - 0x80, 0xcf, 0x00, 0x33, 0x00, 0x0f, 0xf0, 0x03, - 0xd0, 0x00, 0xec, 0x01, 0x3f, 0xc8, 0x0c, 0xc0, - 0x03, 0x7c, 0xc0, 0xfc, 0x22, 0x33, 0x84, 0x0e, - 0xf3, 0x03, 0x30, 0x40, 0x3f, 0x20, 0x7b, 0xc2, - 0x0f, 0xf0, 0x83, 0xf0, 0x00, 0xcc, 0x00, 0x2f, - 0xca, 0x0b, 0xd2, 0x43, 0x30, 0x01, 0x70, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x8b, 0x00, 0x00, 0x00, - 0xc2, 0x18, 0xec, 0x00, 0xbb, 0x20, 0x22, 0xc8, - 0x0b, 0xf5, 0x03, 0x8c, 0x00, 0x8b, 0x02, 0x2f, - 0xd4, 0x0b, 0xf5, 0x22, 0xdc, 0x40, 0x8b, 0x04, - 0x22, 0x00, 0x0b, 0xb2, 0x82, 0xe0, 0x80, 0xb8, - 0x50, 0x2f, 0xce, 0x2a, 0x00, 0x02, 0x2d, 0xc0, - 0xc8, 0x68, 0x3e, 0x80, 0x0b, 0xf7, 0x42, 0x20, - 0x84, 0xbf, 0x40, 0x22, 0xd0, 0x0b, 0xb4, 0x02, - 0xe0, 0x02, 0x88, 0x20, 0x2e, 0xd2, 0x09, 0x91, - 0x02, 0x20, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xc8, 0x00, 0x8c, 0x08, 0x93, 0x20, 0x20, 0xc8, - 0x0b, 0x30, 0x22, 0xcc, 0x80, 0x83, 0x00, 0x2c, - 0xc0, 0x0a, 0x30, 0x02, 0xcc, 0x00, 0x83, 0x00, - 0x24, 0x00, 0x0b, 0x30, 0x10, 0xc0, 0xa0, 0xa0, - 0x00, 0x2c, 0xc8, 0x0b, 0x80, 0x02, 0x0c, 0x90, - 0x90, 0x10, 0x2c, 0x88, 0x0a, 0x30, 0x0e, 0x40, - 0x00, 0xb3, 0x10, 0x20, 0xc0, 0x0b, 0x30, 0x06, - 0xe2, 0x00, 0xa0, 0x08, 0x2c, 0xc8, 0x0b, 0x00, - 0x02, 0xa2, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x05, 0xec, 0x00, 0xb3, 0x80, 0x22, 0xe0, - 0x0b, 0xb0, 0x00, 0xec, 0x00, 0x8b, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0x8b, 0x20, - 0x26, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x80, 0xb9, - 0x80, 0x2e, 0xc0, 0x8b, 0xa0, 0x02, 0x2c, 0x00, - 0x89, 0x88, 0x2e, 0x90, 0x0b, 0x30, 0x22, 0x61, - 0x08, 0xbb, 0x00, 0x26, 0xc0, 0x1b, 0xb0, 0x46, - 0xe8, 0x40, 0x88, 0x08, 0x2e, 0xc0, 0x0b, 0x88, - 0x00, 0xb0, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x15, 0xec, 0x00, 0xdb, 0x00, 0x32, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x01, 0xcb, 0x00, 0x36, - 0xc0, 0x0d, 0xb0, 0x03, 0xec, 0x04, 0xcb, 0x08, - 0x96, 0x26, 0x0f, 0xb8, 0x83, 0xed, 0x20, 0xe8, - 0xa0, 0x3e, 0xc0, 0x0d, 0xed, 0x09, 0x00, 0x8c, - 0x00, 0x84, 0x03, 0x6c, 0x00, 0xd8, 0x80, 0x2e, - 0xa0, 0x0e, 0xb0, 0x03, 0x66, 0x04, 0xfb, 0x00, - 0x32, 0xc0, 0x0b, 0xb0, 0x03, 0xc2, 0x00, 0xe8, - 0x80, 0x3e, 0xc0, 0x1f, 0x9c, 0x01, 0x90, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xbc, - 0x00, 0xff, 0x00, 0xbf, 0x40, 0x0f, 0xf0, 0x83, - 0xbc, 0x00, 0xff, 0x00, 0x37, 0xc0, 0x0f, 0xf0, - 0x23, 0xfc, 0x00, 0xf7, 0x80, 0x3b, 0x20, 0x0f, - 0xfa, 0x03, 0xfe, 0x10, 0xfd, 0x00, 0x3d, 0xc0, - 0x0c, 0xfc, 0x43, 0x9c, 0x00, 0xfc, 0x01, 0x3b, - 0xf0, 0x0f, 0xf0, 0x23, 0xb6, 0x40, 0xf7, 0x01, - 0x33, 0xc0, 0x0f, 0xf0, 0x03, 0xf4, 0x00, 0xfe, - 0x94, 0x3e, 0xc8, 0x4d, 0x50, 0x03, 0x78, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, - 0x00, 0xf9, 0x00, 0x32, 0xc0, 0x0c, 0xb8, 0x03, - 0xec, 0x00, 0xcb, 0x00, 0x3e, 0xe0, 0x0f, 0xb0, - 0x83, 0x2c, 0x00, 0xeb, 0x00, 0x32, 0xc0, 0x0f, - 0xb0, 0x03, 0x60, 0x80, 0xc8, 0x40, 0x3e, 0xc4, - 0x0e, 0x94, 0x03, 0x2c, 0x00, 0xf9, 0x40, 0x3a, - 0xd0, 0x0f, 0xb0, 0x03, 0xe5, 0x04, 0xeb, 0x00, - 0x32, 0xc1, 0x0f, 0xb1, 0x03, 0x6c, 0x20, 0xfa, - 0x41, 0x7e, 0xc0, 0x2c, 0xb0, 0x03, 0xd0, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x05, 0x2c, - 0x00, 0xbb, 0x00, 0x22, 0xc0, 0x08, 0xf4, 0x02, - 0xec, 0x00, 0x8b, 0x00, 0x2f, 0xc0, 0x0b, 0xf6, - 0x02, 0x3e, 0x00, 0x8b, 0x80, 0x22, 0xd0, 0x0b, - 0xb0, 0x02, 0x20, 0x14, 0xa9, 0x00, 0x2f, 0xe0, - 0x1b, 0x3d, 0x82, 0x3e, 0x20, 0xb9, 0x09, 0x2e, - 0xc0, 0x48, 0xf0, 0x02, 0xec, 0x00, 0xbf, 0x5b, - 0x23, 0xe0, 0x1b, 0xfd, 0x02, 0xec, 0x80, 0xba, - 0x00, 0x22, 0xd4, 0x08, 0xb0, 0x02, 0xf2, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x04, 0xed, - 0x09, 0x00, 0x8d, 0x00, 0x4c, 0x00, 0xb3, 0x00, - 0x20, 0xc0, 0x48, 0x34, 0x02, 0xec, 0x00, 0x83, - 0x00, 0x2c, 0xc0, 0xcb, 0x30, 0x00, 0x2e, 0x04, - 0x83, 0x82, 0xac, 0x0c, 0x0b, 0x30, 0x02, 0x00, - 0x01, 0x80, 0x04, 0x2c, 0xc8, 0x0a, 0x00, 0x02, - 0x0f, 0x80, 0xb8, 0x20, 0x6c, 0x80, 0x0a, 0x30, - 0x42, 0xc8, 0x08, 0xa3, 0x80, 0xa0, 0xe0, 0x0b, - 0x3c, 0x02, 0x83, 0x00, 0xb0, 0x06, 0x28, 0xc0, - 0x18, 0x00, 0x20, 0xf8, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xb0, 0x10, 0x5e, 0x00, 0xbd, 0x80, - 0xa3, 0xe0, 0x08, 0x78, 0x02, 0xde, 0x00, 0x87, - 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x0a, 0x1f, 0x28, - 0xa0, 0x80, 0x2d, 0xe0, 0x0b, 0x68, 0x22, 0x72, - 0x00, 0xa4, 0x80, 0x2d, 0xe4, 0x0b, 0x58, 0x02, - 0x1e, 0x00, 0xb7, 0x81, 0x2d, 0xe0, 0x08, 0x78, - 0x02, 0xda, 0x41, 0xb3, 0xb0, 0x21, 0xe2, 0x03, - 0x79, 0x00, 0xde, 0x00, 0xbe, 0x82, 0x21, 0x60, - 0x58, 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x08, 0x4c, 0x40, 0xf3, 0x00, - 0x30, 0x40, 0x0c, 0x31, 0x03, 0xcc, 0x00, 0xc3, - 0x00, 0x3c, 0xc0, 0x0f, 0xb0, 0x03, 0x0c, 0x00, - 0xe3, 0x09, 0x38, 0x00, 0x8f, 0xb0, 0x01, 0x0c, - 0x00, 0xc1, 0x04, 0x3c, 0xc1, 0x1e, 0x36, 0x23, - 0x0c, 0x40, 0xf2, 0x00, 0x3e, 0xc4, 0x0e, 0x31, - 0x03, 0xc8, 0x40, 0xe3, 0x30, 0x30, 0xc0, 0x0b, - 0x30, 0x03, 0x44, 0x10, 0xf2, 0x00, 0x78, 0x40, - 0x2c, 0x04, 0x43, 0xd2, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x15, 0xbc, 0x00, 0xff, 0x00, - 0x3f, 0xc4, 0x2b, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xd0, 0x0f, 0xf0, 0x0b, 0xfc, 0x08, - 0xdf, 0x02, 0x33, 0xc4, 0x0f, 0xf0, 0x03, 0xbc, - 0x08, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x20, 0xed, 0x09, 0x00, 0x8e, 0x00, 0xff, - 0x10, 0x37, 0xc0, 0x0e, 0xf4, 0x03, 0xfc, 0x40, - 0xff, 0x31, 0x3f, 0xc0, 0x8f, 0xf0, 0x46, 0xfc, - 0x00, 0xf6, 0x10, 0x3f, 0x44, 0x0f, 0xf1, 0x03, - 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0xac, 0x00, 0xfb, 0x80, 0xb2, 0xc0, 0x2c, - 0xb6, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc8, - 0x0f, 0xb2, 0x83, 0xed, 0x10, 0x8b, 0x04, 0x3e, - 0xe0, 0x0d, 0x90, 0x03, 0x0e, 0x10, 0xc9, 0x02, - 0x3a, 0xfc, 0x0c, 0xa0, 0x03, 0xec, 0x00, 0xdb, - 0x80, 0x1a, 0x00, 0x0f, 0xb1, 0x03, 0xec, 0x00, - 0xcb, 0x08, 0x32, 0xc4, 0x0f, 0xb0, 0x03, 0xa8, - 0x01, 0xf8, 0x00, 0x32, 0x40, 0x07, 0x80, 0x03, - 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc8, - 0x98, 0x9c, 0x00, 0xbf, 0x00, 0x21, 0xc0, 0x08, - 0x76, 0xb2, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xd0, - 0x0b, 0x70, 0x13, 0x9d, 0xa0, 0xa7, 0x00, 0x2d, - 0xc0, 0x08, 0x30, 0x20, 0x1c, 0x00, 0xa7, 0x04, - 0x2f, 0xca, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x02, 0x19, 0xc1, 0x0f, 0x70, 0x02, 0xf4, 0x00, - 0x83, 0x41, 0x21, 0xc0, 0x8b, 0x74, 0x02, 0x9c, - 0x00, 0xf6, 0x00, 0x21, 0xc0, 0x0b, 0x50, 0x02, - 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x1e, 0x00, 0xb7, 0x80, 0x21, 0xe0, 0x0a, - 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe8, - 0x0b, 0x79, 0x02, 0x9e, 0x00, 0xa7, 0xc0, 0x2d, - 0xe0, 0x0b, 0x78, 0x4e, 0x3e, 0x00, 0x85, 0x80, - 0x29, 0xe0, 0x0a, 0x7c, 0x02, 0xde, 0x00, 0xb3, - 0x80, 0x61, 0xe2, 0x0b, 0x78, 0x32, 0xdb, 0x01, - 0x87, 0xa0, 0x21, 0xe8, 0x19, 0x7a, 0x06, 0x1e, - 0x10, 0xb6, 0xc2, 0x21, 0xe0, 0x0b, 0x68, 0x02, - 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x68, - 0x04, 0x8c, 0x00, 0xb1, 0x00, 0xed, 0x09, 0x00, - 0x8f, 0x00, 0x22, 0x40, 0x0a, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xac, 0x08, 0xa3, 0x00, 0x2c, 0xc6, 0x0b, 0x34, - 0x02, 0x0c, 0x48, 0xa3, 0x30, 0x2c, 0xc0, 0x4a, - 0x38, 0x02, 0xcc, 0x00, 0xb3, 0x24, 0x2c, 0xe0, - 0x4a, 0x30, 0x02, 0xcf, 0x89, 0x83, 0x01, 0x24, - 0xc0, 0x0b, 0x30, 0x02, 0x8c, 0x28, 0xb3, 0x00, - 0x22, 0xe4, 0x8b, 0x38, 0x02, 0xd2, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x15, 0xe8, 0x00, - 0xfa, 0x00, 0x32, 0x80, 0x0e, 0xa0, 0x03, 0xe8, - 0x04, 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, - 0xe8, 0x04, 0xce, 0xc0, 0x3f, 0xa0, 0x0f, 0xee, - 0x02, 0x39, 0x00, 0xce, 0x00, 0x3a, 0x80, 0x4e, - 0xe1, 0x03, 0xe8, 0x00, 0x9e, 0x00, 0x3b, 0x90, - 0x03, 0xa0, 0x02, 0xfb, 0x02, 0xca, 0x05, 0xb2, - 0x80, 0x0f, 0xa0, 0x01, 0x98, 0x01, 0xbe, 0x40, - 0xb2, 0x80, 0x0f, 0xee, 0x03, 0xfa, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0xa0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0d, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x01, 0x1e, 0x00, 0x0f, 0x80, 0x03, - 0xa0, 0x00, 0xf8, 0x24, 0x2e, 0x00, 0x0c, 0x80, - 0x83, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x10, 0x29, - 0x84, 0x03, 0xe0, 0x10, 0xf8, 0x10, 0x3a, 0x20, - 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x02, 0x3a, - 0x00, 0x0f, 0x80, 0x13, 0xe0, 0x40, 0xe8, 0x80, - 0x7e, 0x00, 0x0f, 0x82, 0x07, 0xd2, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xa4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x82, 0x90, 0x03, 0x64, - 0x00, 0xe9, 0x00, 0x3e, 0x40, 0x0f, 0x10, 0x03, - 0x64, 0x00, 0xe9, 0x80, 0x3e, 0x44, 0x0f, 0x10, - 0x0a, 0xa4, 0x20, 0xf9, 0x00, 0x3e, 0x40, 0x0d, - 0x9c, 0x03, 0xe4, 0x80, 0xf9, 0x84, 0x3e, 0x40, - 0xed, 0x09, 0x00, 0x90, 0x00, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xc1, 0x40, 0xb6, 0x64, 0x0f, 0x90, - 0x03, 0x24, 0x80, 0xc9, 0x00, 0x32, 0x40, 0x48, - 0x90, 0x63, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x04, 0x64, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x08, 0x10, 0x02, 0x24, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x09, 0x94, 0x02, 0x24, 0x00, 0xd9, - 0x80, 0x2e, 0x60, 0x8b, 0x90, 0x02, 0x64, 0x40, - 0xb9, 0x04, 0x2e, 0x40, 0x09, 0x9c, 0x42, 0xe6, - 0x00, 0x39, 0x89, 0x2c, 0x40, 0x08, 0x90, 0x02, - 0xe4, 0x00, 0xa9, 0x00, 0x22, 0x60, 0x0b, 0x19, - 0x22, 0x24, 0x00, 0x89, 0x00, 0x3a, 0x50, 0x68, - 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x05, 0x24, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x08, 0x98, 0x02, 0x64, 0x00, 0xb9, 0x00, - 0x2e, 0x60, 0x1b, 0x98, 0x8a, 0x26, 0x00, 0x89, - 0x10, 0x2e, 0x40, 0x4a, 0x90, 0x02, 0x64, 0x08, - 0xb9, 0x00, 0x6e, 0x40, 0x09, 0x90, 0x02, 0xe4, - 0x00, 0xa9, 0x11, 0x2e, 0x40, 0x0b, 0x90, 0x02, - 0x44, 0x00, 0xa9, 0x00, 0x22, 0x42, 0x09, 0x90, - 0x02, 0x65, 0x04, 0x81, 0x00, 0x26, 0x50, 0x08, - 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x14, 0x04, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x28, 0x12, 0xa2, 0x04, 0x00, 0xb1, 0x00, - 0x6c, 0x4a, 0x0b, 0x12, 0x82, 0x04, 0xa4, 0x91, - 0x28, 0x2c, 0x40, 0x1b, 0x16, 0x82, 0x46, 0x00, - 0xb1, 0x00, 0x2c, 0xc0, 0x81, 0x30, 0x02, 0xc5, - 0x00, 0xb1, 0x28, 0x2e, 0x40, 0x28, 0x14, 0x06, - 0xc5, 0x00, 0xa3, 0x00, 0x60, 0x40, 0x4b, 0x10, - 0x02, 0x64, 0x00, 0x81, 0x40, 0x28, 0x50, 0x0a, - 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x3c, - 0x00, 0x08, 0xa2, 0xed, 0x09, 0x00, 0x91, 0x00, - 0x03, 0x60, 0x00, 0xe8, 0x00, 0x3e, 0x08, 0x0f, - 0x82, 0x03, 0x08, 0x80, 0xc8, 0x20, 0x3e, 0x00, - 0x0f, 0x82, 0x07, 0x20, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0d, 0x80, 0x43, 0xe0, 0x00, 0xe8, 0x20, - 0x3e, 0x00, 0x2f, 0x80, 0x02, 0xe0, 0x02, 0xe8, - 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, 0x60, 0x02, - 0xc0, 0x00, 0x36, 0x00, 0x0c, 0x80, 0x03, 0xee, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x95, - 0xe4, 0x00, 0xfd, 0x28, 0x3f, 0x4a, 0x0d, 0x90, - 0x03, 0xe4, 0xa0, 0xf9, 0x00, 0x16, 0x40, 0x0d, - 0x92, 0x83, 0xe4, 0xa0, 0xfd, 0x00, 0x3d, 0x40, - 0x0f, 0xd0, 0x03, 0x34, 0xa0, 0xfd, 0x40, 0x3e, - 0x5a, 0x4f, 0xd2, 0x83, 0xe5, 0x00, 0xfd, 0x28, - 0x3f, 0x4a, 0x0f, 0x94, 0x03, 0xf5, 0x08, 0xd9, - 0x40, 0x3e, 0x50, 0x0f, 0x14, 0x0b, 0xb4, 0x00, - 0xfd, 0x00, 0x3b, 0x50, 0x0d, 0xd4, 0x13, 0xe6, - 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x11, - 0xe4, 0x00, 0xfb, 0x10, 0x3e, 0xc0, 0x0f, 0xd2, - 0x83, 0xe4, 0x44, 0xf9, 0x01, 0x3f, 0x40, 0x0c, - 0xd1, 0x0b, 0xb4, 0x90, 0xcd, 0x28, 0x33, 0x41, - 0x0e, 0x90, 0x23, 0x34, 0x10, 0xf9, 0x00, 0x3f, - 0x40, 0x0d, 0xd0, 0x0b, 0x74, 0xc0, 0xfd, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xbd, - 0x04, 0x35, 0x48, 0x1e, 0xd2, 0x83, 0x34, 0x01, - 0xd9, 0x00, 0x73, 0x40, 0x0e, 0x90, 0x23, 0xc6, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, - 0xe0, 0x00, 0xb8, 0x00, 0x0e, 0x0a, 0x0b, 0x80, - 0x02, 0xe0, 0x80, 0xb8, 0x00, 0x2e, 0x01, 0x08, - 0x81, 0x06, 0xa0, 0xa0, 0x8a, 0x00, 0x22, 0x00, - 0x88, 0x86, 0x02, 0x20, 0x20, 0xba, 0x10, 0x2e, - 0x0a, 0x1b, 0x02, 0x02, 0xa0, 0x80, 0xba, 0x49, - 0x2e, 0x00, 0x09, 0x84, 0x8a, 0x20, 0xed, 0x09, - 0x00, 0x92, 0x00, 0x24, 0xb8, 0x10, 0x22, 0x01, - 0x0d, 0x80, 0x0a, 0xa0, 0x04, 0xb8, 0x0a, 0x62, - 0x02, 0x28, 0x81, 0x02, 0xce, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x84, 0x00, 0xb1, - 0x00, 0x2c, 0x48, 0x0b, 0x10, 0x02, 0xc4, 0x80, - 0xb1, 0x04, 0x24, 0x44, 0x08, 0x30, 0x42, 0x84, - 0xc0, 0x81, 0x02, 0x0a, 0x41, 0x0a, 0x13, 0x82, - 0xc4, 0x00, 0xa1, 0x00, 0x24, 0x4c, 0x0b, 0x12, - 0x82, 0x04, 0xc0, 0xb1, 0x30, 0x2c, 0x4a, 0x0b, - 0x13, 0x02, 0x04, 0x4c, 0x91, 0x00, 0x28, 0x44, - 0x8a, 0x10, 0x00, 0x84, 0x00, 0xb1, 0x20, 0xa0, - 0x44, 0x00, 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x04, 0xa4, 0x00, 0xb9, - 0x00, 0x2e, 0x48, 0x0b, 0x90, 0x02, 0x64, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x68, 0x90, 0x06, 0xa4, - 0x00, 0x89, 0x00, 0xa2, 0x44, 0x00, 0x94, 0x02, - 0xec, 0x20, 0xb9, 0x00, 0x6e, 0x40, 0x8b, 0xb0, - 0x02, 0xe4, 0x00, 0xb9, 0x20, 0x6e, 0x58, 0x09, - 0x90, 0x02, 0x24, 0x00, 0xb9, 0x04, 0xaa, 0x40, - 0x09, 0x90, 0x00, 0xa4, 0x20, 0xb9, 0x40, 0x20, - 0x60, 0x0a, 0x98, 0x02, 0xc6, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x05, 0xe4, 0x00, 0xf9, - 0x80, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x02, 0xa4, - 0x04, 0x49, 0x84, 0x38, 0x48, 0x0e, 0x91, 0x0b, - 0xe4, 0x10, 0xf9, 0x00, 0x3e, 0x40, 0x09, 0x9c, - 0x83, 0x64, 0x00, 0xf9, 0x02, 0x3e, 0x60, 0x07, - 0x90, 0x03, 0xa4, 0x20, 0xf9, 0x00, 0x3a, 0x40, - 0x0a, 0x90, 0x03, 0xa4, 0x40, 0xb9, 0x80, 0x22, - 0x40, 0x0e, 0x92, 0x01, 0xe8, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x01, 0xa4, 0x00, 0xf9, - 0x20, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0xed, 0x09, 0x00, 0x93, 0x00, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x43, 0xc4, 0x22, 0xf1, 0x20, - 0x3e, 0x40, 0xcf, 0x10, 0x03, 0x24, 0x40, 0xf9, - 0x40, 0x3e, 0x40, 0x0f, 0x91, 0x03, 0xa4, 0x00, - 0xf9, 0x88, 0x3e, 0x40, 0x0f, 0x90, 0x23, 0xa4, - 0x48, 0xf9, 0x00, 0x36, 0x40, 0x0f, 0x10, 0x02, - 0xe6, 0x00, 0xf9, 0x20, 0x3e, 0x43, 0x0d, 0x90, - 0x03, 0xca, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0xa0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x88, 0x03, 0x20, 0x00, 0xf8, 0x00, 0x3a, - 0x00, 0x0e, 0x82, 0x13, 0x60, 0x00, 0xc8, 0x40, - 0x3e, 0x20, 0x0f, 0x80, 0x03, 0x60, 0x00, 0xd8, - 0x00, 0x3e, 0x04, 0x0f, 0x84, 0xc3, 0x20, 0x00, - 0xf8, 0x40, 0x26, 0x10, 0x8e, 0x80, 0x43, 0xe1, - 0x00, 0xf8, 0x00, 0xb6, 0x20, 0x0c, 0x80, 0x43, - 0xa0, 0x40, 0xf8, 0x04, 0x32, 0x00, 0x08, 0x80, - 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x15, 0xa8, 0x00, 0x9a, 0x00, 0x2e, 0x80, - 0x0b, 0xe4, 0x02, 0x28, 0x04, 0xba, 0x00, 0x18, - 0x80, 0x08, 0xe4, 0x02, 0x39, 0x00, 0x8a, 0x80, - 0x6f, 0xb2, 0x0b, 0xa0, 0x02, 0x38, 0x82, 0x8a, - 0x00, 0x2f, 0x94, 0x0b, 0xe0, 0x03, 0x78, 0x80, - 0xbe, 0x00, 0x4e, 0x80, 0x08, 0xa0, 0x03, 0xa8, - 0x00, 0xb6, 0xa0, 0x21, 0x90, 0x88, 0xe0, 0x43, - 0x7a, 0x00, 0xba, 0x02, 0x23, 0xb0, 0x0a, 0xa0, - 0x02, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x04, 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x18, 0x02, 0x0c, 0x00, 0x93, 0x00, 0x28, - 0x60, 0x08, 0xb0, 0x02, 0x0e, 0x02, 0xa1, 0x12, - 0x2c, 0xc0, 0x0b, 0x30, 0x10, 0x0c, 0x28, 0xa3, - 0x00, 0x2c, 0xc0, 0x09, 0xbd, 0x02, 0x0e, 0x00, - 0xb3, 0x90, 0x2c, 0xc0, 0x09, 0xb0, 0x02, 0x8c, - 0x00, 0xb3, 0x88, 0x20, 0xed, 0x09, 0x00, 0x94, - 0x00, 0xe0, 0x1a, 0x39, 0x02, 0x0c, 0x00, 0xbb, - 0x00, 0x20, 0x40, 0x22, 0x30, 0x02, 0xca, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x5c, - 0x00, 0x97, 0x00, 0x2d, 0xc0, 0x0b, 0x7c, 0x02, - 0x9c, 0x00, 0xb7, 0x00, 0x28, 0xd0, 0x08, 0x70, - 0x02, 0x1d, 0x00, 0xa7, 0x00, 0x2d, 0x00, 0x0b, - 0x73, 0x02, 0x1e, 0x00, 0x87, 0x00, 0x0d, 0xc0, - 0x0b, 0x70, 0x22, 0x58, 0x00, 0x37, 0x01, 0x2f, - 0xe0, 0x0b, 0x71, 0x02, 0x9c, 0x04, 0xb3, 0x01, - 0x21, 0xc2, 0x1a, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x01, 0x02, 0x0a, 0x70, 0x02, 0xe8, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x5e, - 0x00, 0xf7, 0xf0, 0x3d, 0xe4, 0x0f, 0x38, 0x0b, - 0x1e, 0x20, 0xd7, 0x80, 0x39, 0xe0, 0x2c, 0x38, - 0x03, 0x0e, 0x00, 0xe7, 0x82, 0x2d, 0x60, 0x4f, - 0x3b, 0x0b, 0x7e, 0x00, 0xc7, 0x80, 0x0d, 0xe0, - 0x0f, 0x78, 0x13, 0x16, 0x10, 0xf7, 0x81, 0x2d, - 0xe2, 0x2e, 0x7a, 0x03, 0x9e, 0xa8, 0xf7, 0x80, - 0x31, 0xa0, 0x0e, 0x78, 0x03, 0x1e, 0x00, 0xff, - 0xe8, 0xa3, 0x20, 0x0c, 0x78, 0x03, 0xea, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x1d, 0xac, - 0x00, 0xdb, 0x00, 0x3e, 0xc4, 0x0f, 0xb0, 0x03, - 0x6d, 0x80, 0x7b, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x0b, 0xac, 0x00, 0xd9, 0x00, 0x3e, 0x00, 0x0f, - 0xb2, 0x03, 0xec, 0x00, 0xeb, 0x01, 0x3e, 0xc0, - 0x0f, 0xb0, 0x00, 0xe0, 0x00, 0xfb, 0x00, 0x3c, - 0xd0, 0x4c, 0xb4, 0x83, 0xad, 0x00, 0xd8, 0x00, - 0x3a, 0x80, 0x6d, 0x30, 0x27, 0x68, 0x00, 0xfb, - 0x20, 0x3e, 0x40, 0x0f, 0xb0, 0x03, 0xc2, 0x06, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xbe, - 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, - 0xfe, 0x20, 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xed, - 0x09, 0x00, 0x95, 0x00, 0xf0, 0x03, 0x7e, 0x04, - 0xd7, 0x80, 0x33, 0x20, 0x0d, 0xf8, 0x03, 0x3e, - 0x00, 0xff, 0x80, 0x7f, 0xe4, 0x4f, 0xf9, 0x23, - 0xfe, 0x00, 0xff, 0x02, 0x3f, 0xe2, 0x0d, 0xf9, - 0x03, 0x3e, 0x20, 0xcf, 0x80, 0xf3, 0xe1, 0x8d, - 0xf8, 0x03, 0xfe, 0x50, 0xff, 0x80, 0x3f, 0xe0, - 0x0e, 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xa9, 0x08, 0x9c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0e, 0x74, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0x40, 0x0b, 0x76, 0x12, 0xdc, 0x00, - 0xb7, 0x00, 0x21, 0x00, 0x0b, 0x70, 0x82, 0x1c, - 0x00, 0xb7, 0x18, 0x2d, 0x10, 0x0a, 0x73, 0x03, - 0x90, 0x00, 0xb7, 0x00, 0x2f, 0xc0, 0x09, 0x70, - 0x03, 0x5c, 0x40, 0xa7, 0x00, 0x21, 0xd8, 0x08, - 0x76, 0x02, 0x5c, 0x40, 0xb7, 0x00, 0x2f, 0xc0, - 0x0a, 0x70, 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x50, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x09, 0x71, 0x06, 0x5c, 0x40, - 0xb7, 0x00, 0x21, 0x00, 0x09, 0x70, 0x02, 0x10, - 0x00, 0xb7, 0x00, 0x2c, 0xc0, 0x0a, 0x70, 0x42, - 0xd4, 0x40, 0xb6, 0x00, 0x29, 0xc0, 0x08, 0x70, - 0x06, 0x0c, 0x00, 0x83, 0x00, 0x21, 0x00, 0x89, - 0x50, 0x12, 0xd4, 0x00, 0xb7, 0x40, 0x2d, 0xc0, - 0x08, 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x04, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0a, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x0c, 0xc0, 0x0b, 0x30, 0x12, 0xcc, 0x00, - 0xb3, 0x0a, 0x20, 0x08, 0x0b, 0x30, 0x02, 0x80, - 0x00, 0xb3, 0x48, 0x2c, 0x00, 0x0a, 0x32, 0x02, - 0xa0, 0x10, 0xb0, 0x10, 0x2c, 0xc2, 0x09, 0x30, - 0x06, 0x0d, 0x20, 0xa0, 0x00, 0x20, 0x80, 0x08, - 0x10, 0x00, 0xed, 0x09, 0x00, 0x96, 0x00, 0x40, - 0x00, 0x3b, 0x10, 0x2c, 0xc0, 0x08, 0x30, 0x82, - 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x15, 0xec, 0x00, 0xff, 0xa0, 0x3f, 0xe8, 0xcf, - 0xb0, 0x03, 0xfc, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0d, 0xb0, 0x03, 0x6c, 0x00, 0x5b, 0x48, 0xb0, - 0x10, 0x8d, 0xf0, 0x07, 0x24, 0x00, 0xfb, 0xc0, - 0x3e, 0x40, 0x07, 0xbe, 0x03, 0xe0, 0x01, 0xf9, - 0xd0, 0x3b, 0xd0, 0x0c, 0xf0, 0x02, 0x3e, 0x00, - 0xcb, 0x01, 0x72, 0xc0, 0x8d, 0xb0, 0x03, 0xce, - 0x00, 0xbf, 0x00, 0x3e, 0xc0, 0x0e, 0xb4, 0x03, - 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x01, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0x90, 0x00, 0xec, 0x04, 0xfb, 0x02, 0x3c, 0xc0, - 0x0f, 0xb4, 0x03, 0xe8, 0x00, 0xf3, 0x00, 0x3e, - 0x14, 0x0f, 0xb0, 0x8b, 0x60, 0x10, 0xfb, 0x00, - 0x3e, 0x40, 0x2d, 0xb4, 0x03, 0xa1, 0x10, 0xf8, - 0x00, 0x3e, 0xc4, 0x0e, 0x30, 0x33, 0xec, 0x40, - 0xfb, 0x40, 0x3e, 0xd0, 0x0f, 0x84, 0x03, 0xe6, - 0x20, 0xfb, 0x00, 0x3e, 0xa0, 0x0f, 0xb8, 0x13, - 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, - 0x10, 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0x70, 0x07, 0x3c, 0x00, 0xff, 0x00, 0x3b, 0x40, - 0x0c, 0xf0, 0x03, 0xf4, 0x04, 0xff, 0x80, 0x33, - 0x24, 0x0d, 0xf0, 0x02, 0xf4, 0x08, 0xf7, 0x00, - 0x73, 0x00, 0x0f, 0xc0, 0x03, 0x70, 0x00, 0xcd, - 0x00, 0x3f, 0xc0, 0x0c, 0xb0, 0x03, 0x1c, 0x00, - 0xef, 0x00, 0x30, 0x80, 0x0c, 0xf8, 0x03, 0xfe, - 0x80, 0xcf, 0x00, 0x33, 0x90, 0x0e, 0xf0, 0x03, - 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa1, - 0x04, 0x6c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb9, 0x02, 0x2c, 0x00, 0xbb, 0x00, 0x3e, 0xe4, - 0x08, 0xbc, 0x23, 0xad, 0x00, 0xed, 0x09, 0x00, - 0x97, 0x00, 0xbb, 0x80, 0x32, 0x28, 0x08, 0xb0, - 0x02, 0xe2, 0x00, 0xbb, 0x02, 0x22, 0x30, 0x4b, - 0x34, 0x62, 0x23, 0x00, 0x08, 0xe0, 0x26, 0xc0, - 0x08, 0xb0, 0x02, 0xec, 0x08, 0xa0, 0x90, 0x2a, - 0x84, 0x08, 0x81, 0x20, 0xe0, 0x00, 0x8b, 0x00, - 0x22, 0xc0, 0x0a, 0xb0, 0x02, 0xe0, 0x40, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0x2c, - 0x01, 0xbb, 0x00, 0x2e, 0xc0, 0x48, 0xb8, 0x42, - 0xec, 0x60, 0xb9, 0x20, 0x2a, 0x00, 0x0b, 0xb0, - 0x02, 0xe6, 0x00, 0xbb, 0x01, 0x2e, 0x60, 0x0b, - 0xb1, 0x02, 0x62, 0x20, 0x89, 0x82, 0x2c, 0xc0, - 0x08, 0xb0, 0x22, 0x2c, 0x08, 0x08, 0x40, 0x22, - 0x80, 0x08, 0xb0, 0x00, 0xec, 0x00, 0x8b, 0x00, - 0x20, 0xc0, 0x08, 0xb0, 0x02, 0xe0, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x0c, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x1b, 0x30, 0x02, 0x0c, - 0x01, 0xb3, 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x12, - 0x8c, 0x00, 0xb3, 0x00, 0x22, 0x00, 0x0a, 0x30, - 0x02, 0xc0, 0x00, 0xb3, 0x00, 0x20, 0x00, 0x0b, - 0xb0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0xc0, - 0x08, 0x30, 0x12, 0x0c, 0x10, 0xa0, 0x00, 0x20, - 0x80, 0x08, 0x00, 0x42, 0x44, 0x00, 0x83, 0x01, - 0xa0, 0xc0, 0x0a, 0x30, 0x02, 0xc2, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x6c, 0x00, - 0xff, 0x00, 0x2f, 0xc0, 0x0f, 0xb0, 0x0a, 0x3c, - 0x00, 0xfb, 0x00, 0x3a, 0xc0, 0x2c, 0xb0, 0x03, - 0xec, 0x04, 0xfb, 0x00, 0xba, 0x00, 0x0f, 0x70, - 0x03, 0xe0, 0x10, 0xfb, 0x00, 0x1a, 0x00, 0x8f, - 0xb0, 0x03, 0x60, 0x02, 0xc8, 0x00, 0x3f, 0xc0, - 0x0c, 0xf0, 0x03, 0x3c, 0x00, 0xe8, 0x00, 0x32, - 0x80, 0x0c, 0x90, 0x03, 0xe4, 0x01, 0xcf, 0x00, - 0xed, 0x09, 0x00, 0x98, 0x00, 0x32, 0xc0, 0x0e, - 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa1, 0x11, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xc0, 0x23, 0xfc, 0x00, 0xff, 0x00, - 0x3b, 0x40, 0x0f, 0xc0, 0x03, 0xbc, 0x00, 0xfd, - 0x00, 0x3b, 0x00, 0x0d, 0xf0, 0x13, 0xf0, 0x00, - 0xff, 0x00, 0x3f, 0x00, 0x0f, 0xf0, 0x43, 0xf0, - 0x04, 0xfc, 0x01, 0x37, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xbc, 0x00, 0x3f, 0x80, 0x0f, 0xc0, - 0x03, 0xf0, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x43, 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x05, 0xfc, 0x00, 0xfd, 0x24, 0x33, - 0x41, 0x0f, 0xc2, 0x03, 0x34, 0x41, 0xfd, 0x00, - 0x3f, 0xc0, 0x0d, 0xc0, 0x02, 0x3c, 0x00, 0xf7, - 0x00, 0x3f, 0xc0, 0x0d, 0xf0, 0x03, 0xf4, 0x00, - 0xfc, 0x00, 0x37, 0x84, 0x0c, 0x60, 0x03, 0xb0, - 0xd0, 0x3c, 0x00, 0x3f, 0xc4, 0x07, 0xf0, 0x02, - 0xfc, 0x00, 0xff, 0x00, 0x33, 0x00, 0x0f, 0xc0, - 0xa3, 0xf0, 0x20, 0xcc, 0x60, 0x33, 0x10, 0x2d, - 0xc2, 0x23, 0x30, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x10, 0xec, 0x00, 0xba, 0x10, 0x22, - 0xc0, 0x0b, 0x85, 0x02, 0x2c, 0x80, 0xbb, 0x00, - 0x2e, 0xc0, 0x0b, 0x80, 0x03, 0x6c, 0x00, 0xbb, - 0x20, 0x2c, 0x40, 0x08, 0xb0, 0x02, 0xe4, 0x00, - 0xba, 0x00, 0x22, 0x44, 0x08, 0xa0, 0x02, 0xe5, - 0x08, 0xb8, 0x50, 0x2f, 0xc8, 0x89, 0xb0, 0x12, - 0xec, 0x00, 0xb9, 0x00, 0x22, 0x54, 0x4b, 0xb4, - 0x02, 0xe5, 0x00, 0x89, 0x60, 0x22, 0x18, 0x08, - 0x90, 0x02, 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x88, 0x05, 0xcc, 0x00, 0xb1, 0x00, 0x20, - 0x40, 0x0b, 0x00, 0x02, 0x0c, 0x08, 0xb3, 0x00, - 0x2c, 0xc0, 0x48, 0x80, 0x42, 0x0c, 0x00, 0x93, - 0x08, 0x2c, 0x40, 0xed, 0x09, 0x00, 0x99, 0x00, - 0x09, 0x30, 0x02, 0xc0, 0x00, 0xba, 0x07, 0x20, - 0xc0, 0x89, 0x20, 0x02, 0x84, 0xc0, 0x90, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xbb, - 0x01, 0x24, 0x00, 0x0b, 0x02, 0x82, 0xc8, 0xa8, - 0x80, 0x40, 0x22, 0x8c, 0x08, 0x09, 0x02, 0x22, - 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, - 0xac, 0x01, 0xbb, 0x20, 0xa2, 0x70, 0x0b, 0x98, - 0x02, 0x24, 0x10, 0xbb, 0x40, 0x2e, 0xc0, 0x1b, - 0x90, 0x02, 0x6c, 0x00, 0xbb, 0x10, 0x0e, 0x40, - 0x09, 0xb2, 0x00, 0xe1, 0x00, 0xba, 0x88, 0x20, - 0x50, 0x09, 0xa2, 0x02, 0xe6, 0x20, 0xb8, 0x88, - 0x2e, 0xc0, 0x09, 0xb0, 0x02, 0xec, 0x00, 0xb9, - 0x00, 0x26, 0x62, 0x0b, 0xb0, 0x12, 0xe0, 0x00, - 0x88, 0x10, 0x22, 0x0a, 0x08, 0x90, 0x02, 0x30, - 0x05, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, - 0xec, 0x00, 0xf9, 0x84, 0x32, 0x30, 0x0f, 0x08, - 0x13, 0x2a, 0x30, 0xb8, 0x00, 0x2e, 0xc0, 0x0c, - 0xa0, 0x03, 0x2c, 0x00, 0xda, 0xa0, 0x3e, 0x40, - 0x0d, 0xb4, 0x82, 0xe4, 0x00, 0xf8, 0x80, 0x32, - 0x34, 0x0d, 0xae, 0x03, 0xa2, 0x10, 0xd9, 0xc0, - 0x3e, 0xc0, 0x0f, 0xb0, 0x41, 0xec, 0x00, 0xfa, - 0x00, 0x36, 0x30, 0x0f, 0x86, 0x03, 0xe0, 0x02, - 0xc8, 0x88, 0x32, 0x10, 0x2c, 0x88, 0x0b, 0x10, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, - 0xbc, 0x00, 0xfc, 0x00, 0x3f, 0x80, 0x0f, 0xc0, - 0x03, 0xf7, 0x00, 0xff, 0x20, 0x3f, 0xc0, 0x0f, - 0xf9, 0x03, 0xfc, 0x00, 0x7e, 0x00, 0x3f, 0xc0, - 0x0e, 0xf8, 0x03, 0x7c, 0x01, 0xfe, 0x01, 0xbb, - 0xe0, 0x2e, 0xe8, 0x43, 0xf4, 0x00, 0xf9, 0x00, - 0x3f, 0xc2, 0x8f, 0xf0, 0x13, 0xfc, 0x00, 0x7d, - 0xc0, 0x3b, 0x41, 0x0f, 0xa9, 0x03, 0xfc, 0x00, - 0xf9, 0x80, 0xbf, 0x20, 0x0f, 0xec, 0xed, 0x09, - 0x00, 0x9a, 0x00, 0x03, 0xf8, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, 0x00, 0xf9, - 0x00, 0x32, 0x00, 0x0f, 0x90, 0x03, 0xe0, 0x20, - 0xfa, 0xc6, 0x36, 0xc0, 0x0e, 0xa0, 0x07, 0xec, - 0x00, 0xba, 0xc0, 0x3a, 0xc0, 0x0c, 0xb0, 0x03, - 0x21, 0x00, 0xfa, 0x08, 0x32, 0x40, 0x2c, 0xb6, - 0x03, 0xa5, 0x00, 0xc9, 0x44, 0x32, 0xc0, 0x4f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x32, 0x10, - 0x0f, 0x84, 0x0b, 0x0c, 0x04, 0xe2, 0x00, 0x32, - 0x90, 0x0d, 0x00, 0x03, 0xd0, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x00, 0xb1, - 0x00, 0x22, 0x34, 0x0b, 0x94, 0x02, 0xed, 0x01, - 0xbb, 0x80, 0x2e, 0xc0, 0x0b, 0x30, 0x02, 0xec, - 0x00, 0xba, 0x90, 0x36, 0xe2, 0x8d, 0xbd, 0x03, - 0x68, 0x00, 0xb2, 0x20, 0x36, 0xf8, 0x88, 0xb8, - 0x92, 0x25, 0x46, 0xa9, 0x00, 0x23, 0xd3, 0x0b, - 0xb0, 0x02, 0xec, 0x04, 0xb1, 0x00, 0x22, 0x40, - 0x4b, 0xa8, 0x02, 0x2e, 0x20, 0xba, 0x00, 0x20, - 0x08, 0x08, 0xa0, 0x02, 0xf2, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4c, 0x00, 0xb1, - 0x10, 0x20, 0x14, 0x0b, 0x30, 0x82, 0xca, 0x44, - 0xb1, 0x08, 0x2c, 0xc0, 0x0a, 0x00, 0x02, 0xcc, - 0x00, 0xb1, 0x00, 0x6a, 0xd2, 0x08, 0x20, 0x02, - 0x84, 0x00, 0xb2, 0x80, 0x20, 0x48, 0x88, 0x0c, - 0x02, 0x82, 0x40, 0xa1, 0x21, 0x20, 0xd0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0x93, 0x00, 0x20, 0x40, - 0x0b, 0x00, 0x02, 0x02, 0x00, 0xa2, 0x00, 0x20, - 0x40, 0x08, 0x20, 0x02, 0xf8, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x01, 0x1e, 0x00, 0xb2, - 0x80, 0x21, 0xa0, 0x0b, 0x78, 0x42, 0xde, 0x00, - 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x48, 0x02, 0xde, - 0x00, 0xbd, 0x80, 0x2d, 0x40, 0x09, 0x79, 0x0a, - 0xd6, 0xed, 0x09, 0x00, 0x9b, 0x00, 0x00, 0xb6, - 0x80, 0xa4, 0x60, 0x08, 0x78, 0x02, 0x16, 0x02, - 0xa6, 0x10, 0x21, 0xe0, 0x8b, 0x78, 0x02, 0xde, - 0x00, 0xb7, 0x80, 0x21, 0x61, 0x83, 0x58, 0x82, - 0x16, 0x00, 0xb7, 0xc0, 0xa1, 0xe0, 0x08, 0x58, - 0x02, 0xc8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x08, 0x0c, 0x00, 0xf1, 0x00, 0x30, 0x00, - 0x0f, 0x34, 0x82, 0xc8, 0xc0, 0xb3, 0x00, 0x2c, - 0xc0, 0x0e, 0x20, 0x22, 0xcc, 0x48, 0xf3, 0x00, - 0x38, 0x44, 0x0c, 0x90, 0x83, 0x80, 0x00, 0xf2, - 0x10, 0x30, 0x44, 0xac, 0x01, 0x03, 0xa8, 0x44, - 0xc1, 0x10, 0xb0, 0xc0, 0x0f, 0x30, 0x03, 0xcc, - 0x40, 0xfb, 0x00, 0xb0, 0x88, 0x07, 0x21, 0x02, - 0x08, 0xc0, 0xe3, 0x00, 0x32, 0xc8, 0x0c, 0x20, - 0x23, 0xd2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x10, 0x3f, 0x00, - 0x0f, 0xf0, 0x03, 0xfc, 0x40, 0xff, 0x10, 0x7f, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x37, 0x40, 0x2f, 0xf0, 0x03, 0x70, 0x00, 0xf6, - 0x10, 0x3f, 0x44, 0x0f, 0xf0, 0x51, 0xf8, 0x40, - 0xdf, 0x34, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x10, 0xff, 0x00, 0x3f, 0x80, 0x0f, 0xf0, 0x03, - 0xf0, 0x40, 0xff, 0x10, 0x3f, 0xc0, 0x0e, 0xd0, - 0x13, 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x05, 0xec, 0x00, 0xfb, 0x80, 0x32, 0x40, - 0x0f, 0x90, 0x03, 0xec, 0x04, 0xf1, 0x84, 0x32, - 0xc0, 0x0f, 0xa0, 0x03, 0xec, 0x00, 0xbb, 0x00, - 0x3e, 0x40, 0x0f, 0xa0, 0x1b, 0x86, 0x00, 0xca, - 0x81, 0x3e, 0xc0, 0x8f, 0x80, 0x03, 0xe8, 0x00, - 0xfb, 0x00, 0x2a, 0xc8, 0x0c, 0xb8, 0x01, 0x2c, - 0x00, 0xfa, 0x00, 0x3e, 0xc0, 0x0f, 0x90, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x20, 0x0c, 0xb0, - 0x03, 0xea, 0x00, 0x70, 0xed, 0x09, 0x00, 0x9c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, - 0x00, 0xb2, 0x00, 0x21, 0xc0, 0x0b, 0x50, 0x22, - 0xdc, 0x00, 0xb5, 0x00, 0x21, 0xc0, 0x0e, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x88, - 0x70, 0x02, 0x1c, 0x00, 0x86, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xbe, 0x00, 0x23, - 0xca, 0x28, 0xf0, 0x13, 0x5c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x50, 0x02, 0xdc, 0x00, 0xb5, - 0x00, 0x2d, 0x80, 0x08, 0x70, 0x02, 0xd2, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, - 0x00, 0xb7, 0x88, 0x21, 0xe0, 0x0b, 0x58, 0x02, - 0xde, 0x20, 0xbf, 0x80, 0x25, 0xe0, 0x0b, 0x68, - 0x02, 0xde, 0x00, 0xb7, 0x86, 0x2d, 0xc0, 0x8b, - 0x18, 0x02, 0xb2, 0x00, 0xa6, 0x00, 0x2d, 0xe2, - 0x0b, 0x58, 0x02, 0x9e, 0x00, 0xb7, 0x80, 0x2d, - 0xe4, 0x88, 0x78, 0x02, 0x1e, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, - 0x80, 0x2c, 0xa0, 0x08, 0x78, 0x02, 0xf0, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, - 0x00, 0xb3, 0x80, 0x24, 0xd8, 0x4b, 0x35, 0x02, - 0xcd, 0x00, 0xb3, 0x80, 0x20, 0xc0, 0x1b, 0x31, - 0x06, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xe0, 0x08, - 0x30, 0x02, 0x0e, 0x00, 0xa3, 0x60, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcd, 0x50, 0xb3, 0x00, 0x26, - 0xc0, 0x08, 0x30, 0x02, 0x4c, 0x00, 0xb3, 0x40, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xec, 0x50, 0xbb, - 0x80, 0x2c, 0x80, 0x68, 0x35, 0x02, 0xd2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, 0xa8, - 0x00, 0xfe, 0x80, 0xb3, 0xa0, 0x0f, 0xe8, 0x03, - 0xf9, 0x00, 0xfe, 0x40, 0xb6, 0x80, 0x0f, 0xec, - 0x03, 0xe8, 0x00, 0xfe, 0xe0, 0x3e, 0xa8, 0x0f, - 0xe0, 0x03, 0xbb, 0x00, 0xee, 0x40, 0x3f, 0xed, - 0x09, 0x00, 0x9d, 0x00, 0xa0, 0x0f, 0xe4, 0x03, - 0xba, 0x00, 0xfe, 0x40, 0x3e, 0x80, 0x0c, 0xa0, - 0x03, 0x28, 0x00, 0xfe, 0x00, 0x3f, 0xa8, 0x0f, - 0xe0, 0x03, 0xfa, 0x00, 0xfe, 0x00, 0x3f, 0x94, - 0x0c, 0xec, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x00, 0xe0, 0x00, 0xf8, 0x00, - 0x3a, 0x04, 0x0f, 0x80, 0x83, 0xe0, 0x20, 0xf8, - 0xd0, 0x3e, 0x00, 0x0e, 0x88, 0x03, 0xe0, 0x00, - 0xf8, 0x80, 0x3e, 0x00, 0x4f, 0x80, 0x03, 0xe2, - 0x42, 0x98, 0x04, 0x3e, 0x00, 0x0f, 0x8c, 0x00, - 0xe1, 0x20, 0xf8, 0x58, 0x3a, 0x10, 0x0f, 0x80, - 0x03, 0xe0, 0x04, 0xf8, 0x08, 0x3e, 0x20, 0x07, - 0x04, 0x17, 0xe2, 0x00, 0xf8, 0x10, 0x3e, 0x10, - 0x0f, 0x80, 0x83, 0xd2, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x00, - 0x3c, 0x40, 0x0e, 0x10, 0x0b, 0x24, 0x04, 0xf9, - 0xc0, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3c, 0x40, 0x0d, 0x1a, 0x03, 0xa4, - 0x00, 0xf1, 0x01, 0x22, 0x44, 0x0f, 0x90, 0x03, - 0xc4, 0x00, 0xc9, 0xa0, 0x36, 0x40, 0x0c, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x83, 0x24, 0x04, 0xc9, 0x81, 0x32, 0x64, - 0x0f, 0x90, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x04, 0x64, 0x00, 0xb9, 0x02, - 0x2e, 0x60, 0x08, 0x9e, 0x02, 0x25, 0x00, 0xb9, - 0x48, 0x2e, 0x40, 0x0b, 0x98, 0x02, 0xe4, 0x00, - 0xb9, 0xd0, 0x2e, 0x40, 0xac, 0x98, 0x02, 0xa4, - 0x00, 0xb9, 0x04, 0x2a, 0x40, 0x1b, 0x9c, 0x02, - 0xe4, 0x02, 0x89, 0x20, 0x22, 0x40, 0x28, 0x90, - 0x02, 0xe4, 0x00, 0xe9, 0x00, 0x2e, 0x40, 0x0b, - 0x93, 0x02, 0x24, 0x00, 0x89, 0x40, 0xa2, 0x40, - 0x0b, 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x9e, 0x00, 0x18, - 0x04, 0x24, 0x00, 0xb9, 0x80, 0x2e, 0x44, 0x0a, - 0x91, 0x02, 0x26, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x98, 0x06, 0xe4, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x08, 0x90, 0x02, 0xa4, 0x00, 0xb9, 0x20, - 0x2a, 0x40, 0x0b, 0x98, 0x02, 0xe4, 0x08, 0x81, - 0x00, 0x26, 0x40, 0x08, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0x24, - 0x00, 0x89, 0x10, 0x22, 0x50, 0x0b, 0x90, 0x02, - 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x04, 0x00, 0xb1, 0x00, 0x2c, 0x60, 0x08, - 0x10, 0x02, 0x07, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x18, 0x02, 0xc4, 0x00, 0xb1, 0xc0, 0x2c, - 0x50, 0x49, 0x34, 0x02, 0x84, 0x00, 0xb1, 0x00, - 0x28, 0x50, 0x8b, 0x10, 0x02, 0xc5, 0x00, 0x01, - 0x40, 0x04, 0x50, 0x08, 0x14, 0x02, 0xc5, 0x00, - 0xa1, 0x04, 0x2c, 0x40, 0x0b, 0x14, 0x08, 0x0d, - 0x02, 0x81, 0x40, 0x20, 0x50, 0x0b, 0x10, 0x02, - 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, - 0x09, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0e, - 0x80, 0x03, 0x20, 0x00, 0xb8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3c, - 0x00, 0x2c, 0x80, 0x03, 0xa0, 0x00, 0xfa, 0x00, - 0x3a, 0x00, 0x0b, 0xa0, 0x03, 0xe8, 0x00, 0xc8, - 0x00, 0x36, 0x80, 0x0c, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0x20, - 0x00, 0xca, 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, - 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x1d, 0xe4, 0x00, 0xfd, 0x40, 0x3f, 0x50, 0x0f, - 0xd4, 0x53, 0xf4, 0x14, 0xfd, 0x00, 0x3e, 0x40, - 0x0f, 0xd0, 0x03, 0xe4, 0x00, 0xfd, 0x00, 0x3f, - 0x50, 0x2e, 0xd4, 0x03, 0xf4, 0x00, 0xfd, 0x40, - 0x37, 0x50, 0x0f, 0xf0, 0x03, 0xed, 0x09, 0x00, - 0x9f, 0x00, 0xfd, 0x04, 0xfd, 0x40, 0x3a, 0x50, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xed, 0x6a, 0x3f, - 0x50, 0x0f, 0xd4, 0x03, 0xf5, 0x00, 0xfd, 0x40, - 0x3f, 0x50, 0x0f, 0xd4, 0x03, 0xe6, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, 0x00, - 0xfd, 0x28, 0x3f, 0x41, 0x0f, 0xd2, 0x03, 0xf4, - 0x00, 0xcd, 0x00, 0x32, 0x40, 0x07, 0xd0, 0x12, - 0x64, 0x00, 0xfd, 0x00, 0x2f, 0x50, 0x0f, 0xd0, - 0x03, 0x64, 0x00, 0xfd, 0x08, 0x3f, 0x42, 0x0c, - 0xd0, 0x03, 0xf5, 0x20, 0xfd, 0x60, 0x33, 0x4a, - 0x0f, 0x90, 0x42, 0xe4, 0x40, 0xf9, 0x08, 0x3e, - 0x42, 0x0f, 0x56, 0x03, 0xf4, 0xa0, 0xfd, 0x08, - 0x3f, 0x42, 0x0c, 0x90, 0x83, 0xc6, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, 0x00, - 0xba, 0x40, 0x2e, 0x00, 0x0b, 0xa5, 0x12, 0xe0, - 0x84, 0x88, 0x00, 0x22, 0x00, 0x0b, 0x80, 0x02, - 0xe0, 0x00, 0xb8, 0x21, 0x2e, 0x14, 0x0b, 0x86, - 0x82, 0x28, 0x00, 0xb8, 0x40, 0x2e, 0x18, 0x28, - 0x80, 0x02, 0xe1, 0x88, 0xb8, 0x61, 0x36, 0x18, - 0x4b, 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x68, 0x2e, - 0x10, 0x0b, 0x86, 0x02, 0xc1, 0x80, 0xba, 0x40, - 0x2e, 0x10, 0x08, 0x84, 0x02, 0xce, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x50, 0x0b, 0x10, 0x12, 0xe4, - 0x30, 0x81, 0x00, 0xa8, 0x40, 0x09, 0x10, 0x02, - 0xc4, 0x00, 0xb1, 0x08, 0x2c, 0xc8, 0x0b, 0x14, - 0x02, 0x44, 0x00, 0xb1, 0x00, 0x2c, 0x42, 0x08, - 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x40, 0x20, 0x42, - 0x0b, 0x12, 0x82, 0x44, 0x88, 0xb1, 0x20, 0x2c, - 0x40, 0x0b, 0x14, 0x02, 0xc4, 0x20, 0xb1, 0x28, - 0x2c, 0x4a, 0x08, 0x10, 0x22, 0xc2, 0x01, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, 0x00, - 0xed, 0x09, 0x00, 0xa0, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x12, 0xe4, 0x01, 0x8b, 0x00, - 0x22, 0x40, 0x0b, 0x91, 0x82, 0xe4, 0x00, 0xb9, - 0x00, 0x2e, 0x60, 0x0b, 0x94, 0x0a, 0x64, 0x00, - 0xb9, 0x40, 0x2e, 0x42, 0x08, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x26, 0x40, 0x1b, 0x90, 0x02, - 0xe4, 0x08, 0xb9, 0x02, 0x2e, 0x40, 0x0b, 0x92, - 0x02, 0xe4, 0x64, 0xb9, 0x00, 0x2c, 0x41, 0x08, - 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, 0x40, 0x3e, - 0x60, 0x0f, 0x90, 0x02, 0xe6, 0x02, 0xc1, 0x90, - 0x3a, 0x40, 0x0d, 0x98, 0x02, 0x64, 0x08, 0xf9, - 0x00, 0x0e, 0x40, 0x0f, 0x90, 0x03, 0x64, 0x00, - 0xb9, 0xc0, 0x3e, 0x50, 0x0c, 0x94, 0x03, 0xe5, - 0x40, 0xf9, 0x48, 0x32, 0x40, 0x4f, 0x90, 0x03, - 0x64, 0x00, 0xf9, 0x60, 0x3e, 0x7c, 0x07, 0x90, - 0x03, 0xe5, 0x00, 0xf9, 0x80, 0x3e, 0x60, 0x2c, - 0x90, 0x03, 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x00, 0x3e, - 0x70, 0x0f, 0x9c, 0x03, 0xe4, 0x80, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x20, 0x3e, 0x40, 0x0f, 0x91, 0x03, 0xa4, 0x00, - 0xf9, 0x40, 0x3c, 0x40, 0x2f, 0x90, 0x03, 0xe6, - 0x00, 0xf1, 0x00, 0x3e, 0x41, 0x8f, 0x90, 0x43, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x21, 0x3e, 0x70, 0x4f, - 0x90, 0x03, 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x10, 0xa0, 0x00, 0xf8, 0x50, 0xb2, - 0x20, 0x0f, 0x8c, 0x03, 0xe0, 0x28, 0xc8, 0x80, - 0x3e, 0x00, 0x0f, 0x84, 0x53, 0x20, 0x08, 0xd8, - 0x00, 0x3e, 0x20, 0x0c, 0x00, 0x03, 0xe1, 0x00, - 0xf8, 0x83, 0x3e, 0x08, 0x0c, 0x88, 0x03, 0x20, - 0x08, 0xf8, 0x60, 0xed, 0x09, 0x00, 0xa1, 0x00, - 0x3e, 0x08, 0x0f, 0x80, 0x23, 0xe0, 0x00, 0xf8, - 0x40, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0x21, 0x20, - 0xc8, 0x43, 0x3e, 0x00, 0x4e, 0x80, 0x03, 0xca, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x28, 0x00, 0xba, 0x80, 0x23, 0x90, 0x0b, 0xe4, - 0x82, 0xd8, 0x00, 0x8e, 0x40, 0x2e, 0x80, 0x0b, - 0xe6, 0x02, 0xa8, 0x00, 0xbe, 0x00, 0x2f, 0x80, - 0x08, 0xe0, 0x02, 0xe8, 0x00, 0xbe, 0x48, 0x2f, - 0x91, 0x28, 0xe6, 0x02, 0x38, 0x60, 0xbe, 0x00, - 0x2f, 0xb9, 0x0b, 0xa0, 0x22, 0xe8, 0x00, 0xba, - 0x00, 0x2e, 0x80, 0x0b, 0xe5, 0x52, 0x38, 0x00, - 0xce, 0xc0, 0x2f, 0x90, 0x08, 0xa0, 0x02, 0xca, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x4c, 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x0b, 0x38, - 0x02, 0xcc, 0x04, 0x93, 0x04, 0x2c, 0xc0, 0x0b, - 0x36, 0x02, 0x0c, 0x00, 0x93, 0x80, 0x2c, 0xc0, - 0x0a, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0x40, 0x28, 0x18, 0x02, 0x0c, 0x00, 0xb3, 0xc0, - 0x2c, 0xe0, 0x8b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x24, 0x02, 0x0f, 0x00, - 0x93, 0xc8, 0x2c, 0xc8, 0xca, 0x30, 0x22, 0xca, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, - 0x1c, 0x00, 0xb1, 0x80, 0x21, 0x00, 0x0b, 0x60, - 0x02, 0xdc, 0x00, 0x95, 0x40, 0x2d, 0xc0, 0x0b, - 0xf8, 0x02, 0x9c, 0x00, 0xb7, 0x40, 0x2c, 0xe0, - 0x0a, 0x50, 0x00, 0xdc, 0x00, 0xb7, 0x00, 0x2c, - 0x90, 0x08, 0xd8, 0x02, 0x18, 0x00, 0xb7, 0x40, - 0x2d, 0x80, 0x0b, 0x72, 0x02, 0xdc, 0x80, 0xb7, - 0x34, 0x2d, 0xc0, 0x0b, 0x48, 0x02, 0x1f, 0x00, - 0x86, 0x09, 0x2f, 0x40, 0x08, 0x70, 0x02, 0xe8, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, - 0x1e, 0x00, 0xf5, 0x80, 0x31, 0x20, 0xed, 0x09, - 0x00, 0xa2, 0x00, 0x0f, 0x78, 0x03, 0xf2, 0x02, - 0xd7, 0x84, 0x3d, 0xe1, 0x0f, 0x78, 0x03, 0x1e, - 0x00, 0xd7, 0x80, 0x3d, 0xe0, 0x0e, 0x78, 0x03, - 0xde, 0x00, 0x77, 0x80, 0x3d, 0xe0, 0x2c, 0x78, - 0x0b, 0x1e, 0x04, 0xf7, 0x80, 0x3d, 0xe0, 0x5b, - 0x7a, 0x23, 0xde, 0xa0, 0xf7, 0x80, 0x3d, 0xe0, - 0x0f, 0x68, 0x03, 0x1e, 0x02, 0xd7, 0x80, 0x3d, - 0xe0, 0x0e, 0x78, 0x03, 0xea, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x1d, 0xac, 0x00, 0xf9, - 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x13, 0xe0, 0x10, - 0xe9, 0x00, 0x3e, 0xc0, 0x0f, 0x30, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc1, 0x2d, 0xa0, 0x03, - 0xec, 0x00, 0xfb, 0x04, 0x3e, 0x80, 0x0f, 0x10, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb4, 0x03, 0xec, 0x00, 0xfb, 0x01, 0x3e, 0xc0, - 0x0f, 0xa0, 0x0b, 0xec, 0x00, 0xfa, 0x00, 0x3c, - 0xc0, 0x0f, 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xfd, - 0x80, 0x3f, 0xa0, 0x0f, 0xe8, 0x03, 0x3a, 0x80, - 0xc7, 0x90, 0xb3, 0xe4, 0x0b, 0x68, 0x03, 0x3e, - 0x00, 0xff, 0x80, 0x3b, 0xe0, 0x0c, 0xf8, 0x03, - 0x3e, 0x00, 0xff, 0x86, 0x3f, 0x20, 0x0c, 0xe8, - 0x03, 0x3e, 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0c, - 0xfc, 0x83, 0xfe, 0x20, 0xcf, 0x80, 0x3f, 0xe4, - 0x0c, 0xf8, 0x03, 0xb2, 0x06, 0xad, 0x90, 0x31, - 0xe0, 0x0c, 0xf8, 0x03, 0x00, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x11, 0x9c, 0x00, 0xb5, - 0x00, 0x2d, 0x10, 0x0b, 0x44, 0x92, 0x38, 0xa0, - 0x84, 0x18, 0xa9, 0xc4, 0x0b, 0x62, 0x03, 0x5c, - 0x00, 0xbf, 0x10, 0x29, 0x40, 0x88, 0xd0, 0x03, - 0x5c, 0x00, 0xb7, 0x00, 0x2d, 0xc4, 0x28, 0x40, - 0x02, 0x94, 0x00, 0xb7, 0x14, 0x2d, 0x00, 0x0d, - 0x70, 0xed, 0x09, 0x00, 0xa3, 0x00, 0x02, 0xfc, - 0x00, 0xd7, 0x10, 0x2d, 0xc0, 0x0d, 0x50, 0x02, - 0x18, 0xa0, 0x85, 0x04, 0x35, 0x50, 0x2d, 0x70, - 0x02, 0x2a, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9c, 0x00, 0xb5, 0x00, 0x2d, 0x00, - 0x0b, 0x41, 0x02, 0x10, 0xc0, 0x86, 0x04, 0xa1, - 0xc0, 0x8b, 0x40, 0x62, 0x1c, 0x00, 0xb7, 0x00, - 0x29, 0xc0, 0x09, 0x70, 0x02, 0x1c, 0x00, 0xb7, - 0x40, 0x2d, 0x00, 0x2b, 0xe0, 0x02, 0x1c, 0x00, - 0xb7, 0x00, 0x2c, 0x84, 0x08, 0x70, 0x02, 0xdc, - 0x00, 0x87, 0x00, 0x2d, 0xc0, 0x19, 0x60, 0x02, - 0x94, 0x10, 0x86, 0x02, 0x23, 0x80, 0x08, 0x70, - 0x82, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x14, 0xcc, 0x00, 0xb1, 0x00, 0x2c, 0x80, - 0x0b, 0x20, 0x20, 0x22, 0x00, 0x81, 0x42, 0xa8, - 0xc0, 0x0b, 0x00, 0x02, 0x4c, 0x01, 0xb3, 0x00, - 0x20, 0x40, 0x09, 0x2d, 0x02, 0x4f, 0x40, 0xb3, - 0x10, 0x2e, 0xf4, 0x2b, 0x14, 0x06, 0x84, 0x20, - 0xb2, 0x04, 0x2c, 0x00, 0x09, 0x30, 0x02, 0xcc, - 0x00, 0x93, 0x00, 0x2c, 0xd0, 0x09, 0xac, 0x02, - 0x0e, 0x00, 0x82, 0x40, 0x24, 0xa0, 0x08, 0x38, - 0x42, 0x08, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x15, 0xac, 0x00, 0xf9, 0x60, 0x3e, 0xa0, - 0x8f, 0xb4, 0x03, 0x27, 0x00, 0x4b, 0x80, 0xb2, - 0xc0, 0x0f, 0x90, 0x02, 0x2c, 0x00, 0xfb, 0x00, - 0x2a, 0xc0, 0x8d, 0xb0, 0x03, 0x2d, 0x00, 0xfb, - 0x40, 0x3e, 0x50, 0x2f, 0xb0, 0x03, 0x25, 0x00, - 0xfb, 0xd8, 0x7e, 0x40, 0x0c, 0xf0, 0x03, 0xfc, - 0x00, 0xcf, 0x40, 0x2e, 0xc4, 0x0d, 0xa4, 0x43, - 0xae, 0x04, 0xcb, 0x04, 0xb2, 0x82, 0x08, 0xb9, - 0x0b, 0x2a, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0xec, 0x00, 0xf9, 0x00, 0x3e, 0x30, - 0x0f, 0xb0, 0x2b, 0xe8, 0xed, 0x09, 0x00, 0xa4, - 0x00, 0x00, 0xf9, 0x08, 0x3e, 0xc0, 0x0f, 0x92, - 0x03, 0xec, 0x00, 0xfb, 0x40, 0x3e, 0xe0, 0x6e, - 0xb4, 0x03, 0xec, 0x04, 0xfa, 0x40, 0x3e, 0x88, - 0x0c, 0xb7, 0x03, 0xe0, 0x08, 0xfb, 0x00, 0x3e, - 0x40, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0xa0, - 0x3e, 0xc0, 0x8f, 0x81, 0x8b, 0xe5, 0x28, 0xfa, - 0x08, 0x3a, 0x10, 0x0f, 0xb0, 0x43, 0xe0, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, - 0x00, 0xf5, 0x18, 0x33, 0x00, 0x8f, 0xa8, 0xa3, - 0xf0, 0x24, 0xcf, 0x00, 0x7f, 0xc0, 0x0f, 0xc2, - 0x03, 0x7c, 0x00, 0xff, 0x00, 0x30, 0xc0, 0x0c, - 0xf0, 0x83, 0x7c, 0x20, 0xcf, 0x80, 0x3f, 0x70, - 0x2c, 0xf0, 0x03, 0xd0, 0x00, 0xcf, 0x00, 0x3d, - 0x40, 0x0c, 0xf0, 0x03, 0x7c, 0x00, 0xc7, 0x00, - 0x32, 0xc0, 0x0f, 0xc4, 0x03, 0x28, 0x00, 0xfd, - 0x40, 0x3f, 0x00, 0x05, 0xb0, 0x01, 0xc0, 0x44, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, - 0x00, 0xb9, 0x00, 0x22, 0x90, 0x0b, 0xad, 0x42, - 0xe3, 0x20, 0x89, 0x80, 0x2e, 0xc0, 0x0b, 0x0a, - 0x02, 0x2c, 0x00, 0xb8, 0x18, 0x2a, 0xc0, 0x28, - 0xbd, 0x03, 0x4c, 0x00, 0x09, 0xa0, 0x2e, 0xa0, - 0x08, 0xb0, 0x82, 0xe2, 0x02, 0x8b, 0x86, 0x2e, - 0x69, 0x0a, 0xb0, 0x02, 0xac, 0x00, 0xab, 0x00, - 0x2a, 0xc0, 0x0b, 0x88, 0x02, 0x22, 0x04, 0xb8, - 0x80, 0x2e, 0x14, 0x0b, 0xb0, 0x02, 0xe0, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, - 0x00, 0xb9, 0x00, 0x22, 0x80, 0x0b, 0x80, 0x02, - 0xe6, 0x04, 0x9a, 0x10, 0x2e, 0xc0, 0x0b, 0x80, - 0x02, 0x6c, 0x00, 0xb3, 0x00, 0x22, 0xe0, 0x08, - 0x34, 0x02, 0x6c, 0x02, 0xab, 0x10, 0x2a, 0x00, - 0x0a, 0xa8, 0x02, 0xe6, 0x00, 0x9b, 0x21, 0x2e, - 0x60, 0x08, 0x30, 0x02, 0x0c, 0x00, 0x8b, 0xed, - 0x09, 0x00, 0xa5, 0x00, 0x00, 0x22, 0xc0, 0x0b, - 0xb0, 0x1a, 0x61, 0x80, 0xb9, 0x00, 0x2e, 0xc0, - 0x09, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb1, 0x04, - 0xa0, 0x00, 0x0b, 0x20, 0x02, 0xc8, 0x00, 0x93, - 0x00, 0x2c, 0xc0, 0x0b, 0x00, 0x02, 0x0c, 0x00, - 0xb3, 0x00, 0x28, 0xa0, 0x08, 0x30, 0x02, 0x6c, - 0x00, 0x83, 0x00, 0x2c, 0xc0, 0xb8, 0x20, 0x02, - 0x46, 0x00, 0x93, 0x00, 0x2c, 0x40, 0x0a, 0x30, - 0x02, 0x8c, 0x00, 0xa3, 0x00, 0x28, 0xc0, 0x8b, - 0x10, 0x02, 0x40, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x30, 0x02, 0xc2, 0x11, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xf9, 0x00, - 0x32, 0x00, 0x0f, 0xa0, 0x03, 0xe0, 0x00, 0xdb, - 0x00, 0x2e, 0xc0, 0x0f, 0x80, 0x47, 0x6c, 0x08, - 0xf9, 0x00, 0x32, 0xc0, 0x0c, 0xb0, 0x03, 0x6c, - 0x00, 0xeb, 0x00, 0x3c, 0x00, 0x0c, 0xa0, 0x03, - 0xe0, 0x00, 0xd9, 0x00, 0x3e, 0x01, 0x0c, 0xf0, - 0x03, 0x7c, 0x00, 0xcb, 0x00, 0x32, 0xc0, 0x0f, - 0x80, 0x03, 0x60, 0x04, 0xf0, 0x00, 0x3e, 0x00, - 0x0d, 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, 0xfd, 0x00, - 0x3f, 0x80, 0x03, 0xc0, 0x33, 0xf0, 0x0c, 0xec, - 0x00, 0x3f, 0xc0, 0x0b, 0xc0, 0x07, 0xfc, 0x00, - 0xfc, 0x00, 0x3f, 0x80, 0x2f, 0xf0, 0x0b, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0x60, 0x03, - 0xf0, 0x00, 0xec, 0x00, 0x3f, 0x00, 0x8f, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0x40, 0x03, 0xb0, 0x00, 0xfc, 0x00, 0x3f, 0x00, - 0x0f, 0xf0, 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x05, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc8, 0x4f, 0xf2, 0x43, 0xfc, 0x00, 0x7f, - 0x20, 0x3f, 0xed, 0x09, 0x00, 0xa6, 0x00, 0xc8, - 0x0f, 0xc1, 0x03, 0x34, 0x40, 0xdd, 0x10, 0x3f, - 0x40, 0x0e, 0xc3, 0x07, 0xfc, 0x01, 0xff, 0x42, - 0x2f, 0x08, 0x1f, 0xc0, 0x03, 0x7c, 0x00, 0xdc, - 0x20, 0x7f, 0x0a, 0x08, 0xc0, 0x03, 0xf0, 0x80, - 0xff, 0x34, 0x33, 0x00, 0x4c, 0xd3, 0x82, 0x30, - 0x80, 0xfc, 0x06, 0x33, 0xc0, 0x0c, 0x41, 0x43, - 0x30, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x10, 0xec, 0x00, 0xbb, 0x00, 0x2f, 0xc4, 0x0b, - 0xf1, 0x02, 0xec, 0x00, 0xbf, 0x51, 0x2f, 0xd4, - 0x0b, 0xb2, 0x42, 0x2c, 0x80, 0xcb, 0x20, 0x3e, - 0x49, 0x0c, 0x82, 0x03, 0xfd, 0x04, 0xbf, 0x60, - 0x2e, 0x00, 0x4f, 0x80, 0x82, 0xbd, 0x40, 0xb8, - 0x69, 0x66, 0x08, 0x08, 0x80, 0x02, 0xe0, 0xa0, - 0x3f, 0x40, 0x2a, 0x00, 0x0d, 0x84, 0x02, 0x20, - 0xa0, 0xb8, 0x20, 0x22, 0xd4, 0x0a, 0xa2, 0x02, - 0x20, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, - 0x05, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x12, 0xcc, 0x10, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0xb0, 0x02, 0x2c, 0x01, 0x83, 0x00, 0x2c, - 0x4a, 0x0b, 0x04, 0x02, 0xcc, 0x40, 0xa3, 0x30, - 0x2c, 0x04, 0x0b, 0x90, 0x12, 0x0c, 0x20, 0x90, - 0x10, 0x2c, 0x0a, 0x08, 0x00, 0x02, 0xc0, 0xc0, - 0xb3, 0x10, 0x20, 0x81, 0x08, 0x10, 0x02, 0x80, - 0xd0, 0xb0, 0x08, 0x20, 0xc0, 0x08, 0x12, 0x12, - 0x22, 0x11, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x15, 0xac, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0x6c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0x2c, 0x00, 0x89, 0x00, 0x22, - 0xc4, 0x1a, 0x8c, 0x22, 0xac, 0x00, 0xbb, 0x02, - 0x2e, 0x62, 0x08, 0x80, 0x22, 0xec, 0x04, 0xb9, - 0x80, 0x26, 0x60, 0x08, 0x88, 0x80, 0xe3, 0x00, - 0xbb, 0x02, 0x2e, 0xc0, 0x09, 0xed, 0x09, 0x00, - 0xa7, 0x00, 0x88, 0x22, 0x22, 0x00, 0xba, 0x08, - 0x22, 0x22, 0x0a, 0xb0, 0x22, 0x30, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0x0c, 0x02, 0xcb, 0x80, 0x6e, 0x40, 0x0f, 0x88, - 0x02, 0xec, 0x00, 0xfb, 0x00, 0x1e, 0x20, 0x0b, - 0x28, 0x03, 0x6c, 0x04, 0xd8, 0xc1, 0x2e, 0x30, - 0x2c, 0x94, 0x03, 0xe2, 0x00, 0xfb, 0x00, 0x30, - 0x10, 0x0c, 0x9a, 0x0b, 0xa3, 0x00, 0xf8, 0x50, - 0x22, 0xd0, 0x0c, 0xb1, 0x83, 0x10, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xbc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf1, 0x03, - 0xf5, 0x00, 0xef, 0x40, 0x3f, 0x60, 0x0d, 0xd0, - 0x03, 0xfc, 0x00, 0xff, 0x02, 0x3f, 0x00, 0x8f, - 0xc4, 0x03, 0xbc, 0x10, 0xfc, 0x0a, 0x35, 0x02, - 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xdb, 0x04, 0x3b, - 0x08, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0xff, 0x00, - 0xbf, 0x40, 0x0f, 0xf8, 0x03, 0xf8, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, 0x00, - 0xfb, 0x00, 0x3e, 0xc1, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x10, 0x3e, 0xc0, 0x2c, 0x90, 0x43, - 0xec, 0x00, 0xdb, 0x00, 0x32, 0xc8, 0x0f, 0x94, - 0x03, 0xec, 0x98, 0xfb, 0x02, 0x3e, 0x51, 0x4f, - 0xb0, 0xa3, 0xec, 0x20, 0xf9, 0x01, 0x3e, 0x70, - 0x0f, 0x94, 0x03, 0xe4, 0x00, 0xfb, 0x00, 0xb2, - 0xc0, 0x0f, 0x94, 0x83, 0xe1, 0x80, 0xf9, 0x40, - 0x30, 0xf0, 0x0c, 0xbc, 0x03, 0x10, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x00, - 0xbb, 0x00, 0x2f, 0xf4, 0x0b, 0xf0, 0x42, 0xec, - 0x00, 0xbf, 0x00, 0x2f, 0xe0, 0x08, 0x30, 0x42, - 0xed, 0x09, 0x00, 0xa8, 0x00, 0xec, 0x00, 0x8b, - 0x00, 0x32, 0xc0, 0x0b, 0x90, 0x03, 0xbc, 0x28, - 0xbf, 0xd8, 0x2e, 0x41, 0x43, 0x88, 0x02, 0xfc, - 0x20, 0xb9, 0x48, 0x2e, 0x50, 0x0b, 0xb1, 0x83, - 0xe4, 0x00, 0xbf, 0xc8, 0x32, 0xf4, 0x0b, 0xb0, - 0x23, 0xa6, 0x00, 0xbb, 0x05, 0x22, 0x80, 0x08, - 0xb9, 0x02, 0x32, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x05, 0x4c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x02, - 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xcc, 0x00, 0xa3, - 0x00, 0x2e, 0x40, 0x8b, 0x00, 0x00, 0x8d, 0x00, - 0xb3, 0x40, 0x2c, 0x00, 0x03, 0x04, 0x02, 0xcf, - 0x00, 0xb0, 0x00, 0x2c, 0x00, 0x0b, 0x20, 0x02, - 0xc0, 0x80, 0x9b, 0x08, 0x20, 0x90, 0x0b, 0x8c, - 0x02, 0xc1, 0x00, 0xba, 0x00, 0x20, 0xc0, 0x08, - 0xb0, 0x02, 0x38, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x01, 0x1e, 0x00, 0xb7, 0x84, 0x2d, - 0xe3, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, - 0x2c, 0xe2, 0x08, 0x58, 0x02, 0xde, 0x00, 0x87, - 0x80, 0x25, 0xe0, 0x0b, 0x79, 0x02, 0x9e, 0x01, - 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x82, 0xde, - 0x01, 0xb7, 0x80, 0x2d, 0xe0, 0x1b, 0x68, 0x02, - 0xde, 0x00, 0xb7, 0x90, 0x25, 0xe2, 0x0b, 0x48, - 0x82, 0x92, 0x20, 0xbf, 0x80, 0x21, 0x20, 0x08, - 0xf8, 0x02, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x08, 0x0c, 0x00, 0xf3, 0x00, 0x3c, - 0xc0, 0x0f, 0x30, 0x02, 0xcc, 0x00, 0xf3, 0x00, - 0x2c, 0xc0, 0x0c, 0x30, 0x03, 0xe4, 0x02, 0xeb, - 0x00, 0xb4, 0x44, 0x0f, 0x10, 0x03, 0x8c, 0x00, - 0xf3, 0x10, 0x2c, 0x80, 0x0f, 0x15, 0x02, 0xcc, - 0x00, 0xf0, 0x40, 0x2c, 0x18, 0x0f, 0x22, 0x03, - 0xcc, 0x00, 0xd3, 0x02, 0x70, 0x84, 0x0f, 0x31, - 0x03, 0xc1, 0x00, 0xed, 0x09, 0x00, 0xa9, 0x00, - 0xf3, 0x02, 0x70, 0xc0, 0x0c, 0x31, 0x03, 0x12, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, - 0xbc, 0x00, 0x7f, 0x00, 0x3f, 0xd2, 0x0f, 0xf1, - 0x03, 0xfc, 0x00, 0xff, 0x08, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xef, 0x00, 0x3b, 0xc0, - 0x0f, 0xf0, 0x03, 0xbc, 0x40, 0xff, 0x00, 0x3f, - 0xc0, 0x07, 0xf1, 0x03, 0xfc, 0x45, 0xff, 0x12, - 0x3f, 0xc0, 0x07, 0xd0, 0x13, 0xbc, 0x40, 0xff, - 0x01, 0x3b, 0xc0, 0x0f, 0xc0, 0x13, 0xb4, 0x00, - 0xf7, 0x10, 0x3d, 0xc4, 0x0f, 0xf0, 0x03, 0xd0, - 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc8, 0x4c, 0xb0, - 0xc0, 0xec, 0x00, 0xfb, 0x20, 0x36, 0xdc, 0x0b, - 0xb0, 0x03, 0xec, 0x00, 0xf9, 0x00, 0x3e, 0xc0, - 0x0f, 0x80, 0x22, 0xed, 0x41, 0xfb, 0x18, 0x3e, - 0x60, 0x0c, 0xa0, 0x03, 0xed, 0x80, 0xdb, 0x81, - 0x36, 0xc1, 0x1d, 0xb8, 0x03, 0xe2, 0x00, 0xcb, - 0x30, 0x32, 0xc0, 0x0f, 0x80, 0x03, 0xe2, 0x00, - 0xca, 0x00, 0x32, 0xc0, 0x0c, 0xb0, 0x03, 0xea, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, - 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc8, 0x08, 0x70, - 0x02, 0xdc, 0x10, 0xb7, 0x30, 0x2d, 0xc2, 0x0b, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x04, 0x2d, 0xc0, - 0x46, 0x70, 0x02, 0x1c, 0xa0, 0xb7, 0x24, 0x6d, - 0xc0, 0x05, 0x70, 0x02, 0xdd, 0xa5, 0x87, 0x00, - 0x29, 0xc0, 0x03, 0x60, 0x02, 0xdc, 0x00, 0xa3, - 0x30, 0x25, 0xc0, 0x0b, 0x70, 0x02, 0xd0, 0x00, - 0xaf, 0x00, 0x20, 0x00, 0x08, 0x70, 0x02, 0xd2, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, - 0x9e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x08, 0x79, - 0x02, 0x5e, 0x04, 0xb7, 0xa2, 0x2d, 0xe0, 0x09, - 0x78, 0x72, 0xde, 0x08, 0xb7, 0x80, 0xed, 0x09, - 0x00, 0xaa, 0x00, 0x2d, 0xf1, 0x03, 0x18, 0x02, - 0x1e, 0x18, 0x97, 0x82, 0x2d, 0xc0, 0x0a, 0x78, - 0x82, 0xce, 0x80, 0xb3, 0x82, 0x21, 0xe0, 0x19, - 0x70, 0x02, 0xce, 0x00, 0x87, 0xa2, 0xa5, 0xe0, - 0x1b, 0x78, 0x02, 0xca, 0x00, 0x87, 0x80, 0x21, - 0xe0, 0x08, 0x78, 0x02, 0xf0, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x28, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x98, 0x02, 0xc6, - 0x40, 0xb1, 0x90, 0x2c, 0xe0, 0x0a, 0xb0, 0x02, - 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xd0, 0xcb, 0x30, - 0x02, 0xec, 0x00, 0x83, 0x00, 0x28, 0xc8, 0x0b, - 0x39, 0x02, 0xcd, 0x00, 0xa3, 0x00, 0x24, 0xd0, - 0x0b, 0x31, 0x02, 0xcc, 0x80, 0xa3, 0xc0, 0x20, - 0xc0, 0x08, 0x39, 0x02, 0xd2, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xe8, 0x15, 0xa8, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x0c, 0xa0, 0x03, 0x68, 0x00, - 0xf2, 0x00, 0x36, 0x80, 0x4d, 0xee, 0x03, 0xe8, - 0x00, 0xba, 0x00, 0x3e, 0xa1, 0x4f, 0xe5, 0x03, - 0xa8, 0x00, 0xfa, 0x00, 0x3d, 0x80, 0x1e, 0xe8, - 0x03, 0xe8, 0x00, 0xde, 0x50, 0x37, 0x91, 0x09, - 0xe8, 0x02, 0xf9, 0x00, 0x8a, 0x00, 0x21, 0x90, - 0x0f, 0xed, 0x02, 0xf8, 0x00, 0xce, 0x00, 0xb3, - 0x80, 0x2c, 0xed, 0x03, 0xfa, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0xe0, 0x00, 0xf8, - 0x00, 0x3c, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x88, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x10, 0x0e, 0x80, 0x09, - 0xa0, 0x00, 0xf8, 0x04, 0x3e, 0x18, 0x1d, 0x80, - 0x22, 0xe1, 0x02, 0x78, 0x10, 0x2e, 0x00, 0x1f, - 0x8c, 0x41, 0xe1, 0x00, 0xf0, 0x00, 0x3a, 0x08, - 0x0f, 0x80, 0x01, 0xe0, 0x00, 0xf8, 0x18, 0x3e, - 0x00, 0xed, 0x09, 0x00, 0xab, 0x00, 0x0f, 0x80, - 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0c, 0x90, 0x43, 0xe4, 0x00, 0xf9, 0x90, 0x32, - 0x68, 0x0b, 0x90, 0x03, 0x24, 0x00, 0xc9, 0x00, - 0x0e, 0x40, 0x0f, 0x90, 0x03, 0xa4, 0x50, 0xf1, - 0x00, 0x32, 0x70, 0x04, 0x90, 0x01, 0xe4, 0x04, - 0xc9, 0x00, 0x3e, 0x41, 0x1e, 0x10, 0x13, 0x24, - 0x30, 0xf9, 0x00, 0x12, 0x40, 0x0c, 0x98, 0x03, - 0xe6, 0x00, 0xf9, 0x00, 0x30, 0x40, 0x0c, 0x9a, - 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x04, 0x64, 0x00, 0xb9, 0x00, 0x2e, 0x70, - 0x28, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x02, - 0x40, 0x0b, 0x90, 0x02, 0x24, 0x00, 0x89, 0x00, - 0x2e, 0x60, 0x0b, 0x90, 0x02, 0x27, 0x00, 0xb9, - 0x00, 0xa2, 0x40, 0x0a, 0x90, 0x02, 0xe5, 0x20, - 0x89, 0x00, 0x2e, 0x50, 0x0e, 0x9c, 0x82, 0x27, - 0x80, 0xb9, 0x0a, 0x02, 0x50, 0x08, 0x95, 0x02, - 0xe4, 0x00, 0xb9, 0x00, 0x22, 0x40, 0x08, 0x90, - 0x82, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x44, - 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0xa2, - 0x40, 0x0b, 0xb0, 0x02, 0x04, 0x00, 0x99, 0x00, - 0x2e, 0x60, 0x4b, 0x90, 0x42, 0x65, 0x10, 0xb9, - 0x04, 0x22, 0x41, 0x0a, 0x90, 0x82, 0xe4, 0x00, - 0x89, 0x00, 0x0e, 0x50, 0x0b, 0x92, 0x02, 0xa4, - 0x84, 0xb9, 0x80, 0x2a, 0xe0, 0x08, 0x90, 0x12, - 0xe4, 0x40, 0xb1, 0x00, 0x22, 0x60, 0x08, 0x90, - 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x04, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x08, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x28, 0x20, - 0x4a, 0x0b, 0x10, 0x42, 0x04, 0x06, 0xa1, 0x00, - 0x2c, 0xd0, 0x0b, 0x14, 0xed, 0x09, 0x00, 0xac, - 0x00, 0x02, 0x44, 0xa4, 0x31, 0xaa, 0x20, 0xca, - 0x0a, 0x10, 0x46, 0xc4, 0xa2, 0x81, 0x28, 0x2c, - 0x4a, 0x0b, 0x14, 0x02, 0x84, 0xa0, 0xb1, 0x40, - 0xaa, 0x61, 0x00, 0x14, 0x02, 0xc5, 0x00, 0xb1, - 0x40, 0xa0, 0x40, 0x28, 0x14, 0x02, 0xc2, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x60, - 0x00, 0xf8, 0x00, 0x3e, 0x80, 0x0c, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x20, 0x32, 0x08, 0x0f, 0x80, - 0x0b, 0x20, 0x00, 0xd8, 0x00, 0x1e, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x88, 0x38, 0x20, 0x32, 0x08, - 0x0c, 0x80, 0x03, 0xe0, 0x80, 0xca, 0x22, 0x3e, - 0x08, 0x0e, 0x80, 0x03, 0xa0, 0x85, 0xf8, 0x00, - 0x3a, 0x00, 0xcc, 0xa0, 0x03, 0xe0, 0x08, 0xf8, - 0x00, 0x32, 0x00, 0x0c, 0x80, 0x03, 0xee, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x1d, 0xe4, - 0x00, 0xf9, 0x00, 0x3c, 0x50, 0x4f, 0x94, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x41, 0x0f, 0xd2, - 0xc3, 0xf4, 0xa0, 0x9d, 0x28, 0x3f, 0x40, 0x0f, - 0xf4, 0x2b, 0xa4, 0x00, 0xf9, 0x28, 0x2d, 0xc0, - 0x05, 0xd2, 0x83, 0xe4, 0xa4, 0xfd, 0x28, 0x3f, - 0x4a, 0x1e, 0xf4, 0x07, 0x74, 0xb1, 0xf9, 0x40, - 0x37, 0x40, 0x2f, 0xd4, 0x03, 0xf5, 0x00, 0xfd, - 0x00, 0x3f, 0x50, 0x0f, 0xd0, 0x03, 0xe6, 0x06, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, - 0x00, 0xf9, 0x00, 0x3f, 0x48, 0x0f, 0x92, 0x03, - 0x24, 0x00, 0xfd, 0x20, 0x3f, 0x4a, 0x0c, 0x91, - 0x13, 0xe4, 0x00, 0xf9, 0x00, 0x33, 0x44, 0x0f, - 0x92, 0x43, 0xd4, 0xa0, 0xcd, 0x34, 0x33, 0x40, - 0x1f, 0xd0, 0x07, 0x74, 0xc1, 0xfd, 0x00, 0x3f, - 0xc0, 0x8f, 0xd6, 0x22, 0x34, 0x80, 0xdd, 0x28, - 0xb3, 0x40, 0x0f, 0xd4, 0x03, 0xfc, 0x00, 0xf9, - 0x40, 0x33, 0xc8, 0x0f, 0xd1, 0x03, 0xc6, 0xed, - 0x09, 0x00, 0xad, 0x00, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x10, 0xe0, 0x00, 0xb8, 0x00, - 0x2e, 0x14, 0x0b, 0x84, 0x02, 0x20, 0x00, 0xb8, - 0x00, 0x26, 0x00, 0x08, 0x82, 0x42, 0x60, 0x20, - 0x98, 0x08, 0x22, 0x01, 0x0b, 0x80, 0x02, 0xe0, - 0x00, 0xc8, 0x30, 0x22, 0x10, 0x0b, 0x82, 0x02, - 0xa0, 0xc0, 0xb8, 0x48, 0x2e, 0x02, 0x8b, 0x86, - 0x02, 0xa0, 0xa4, 0xb8, 0x60, 0x22, 0x00, 0x0b, - 0x82, 0x02, 0x61, 0xa8, 0xb8, 0x02, 0x2a, 0x14, - 0x0b, 0x82, 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x05, 0xc4, 0x00, 0xb1, 0x00, - 0x2c, 0xc0, 0x0b, 0x14, 0x0a, 0x04, 0x00, 0xb1, - 0x14, 0x2c, 0x40, 0x0a, 0x12, 0x02, 0xc4, 0x81, - 0xb9, 0x00, 0x28, 0x40, 0x0b, 0x13, 0x82, 0xc4, - 0x00, 0x81, 0x20, 0x28, 0x44, 0x0b, 0x9a, 0x82, - 0x04, 0x80, 0xa1, 0x30, 0x2c, 0x44, 0x0a, 0x14, - 0x02, 0x84, 0xc0, 0xb1, 0x2a, 0x20, 0x40, 0x0b, - 0x14, 0x02, 0xcc, 0xc0, 0xb9, 0x20, 0x20, 0x60, - 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0x24, 0x00, 0xb9, - 0x00, 0x26, 0x40, 0x28, 0x90, 0x02, 0x64, 0x80, - 0x99, 0x00, 0x2a, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0x99, 0x00, 0xa2, 0x40, 0x0b, 0x90, 0x02, - 0xa4, 0x00, 0xb9, 0x00, 0x6e, 0x42, 0x0b, 0x90, - 0x42, 0xa4, 0x01, 0xb9, 0x00, 0x22, 0x48, 0x0b, - 0x92, 0xc0, 0xed, 0x00, 0xb9, 0x40, 0x2a, 0x48, - 0x0b, 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x41, 0x0f, 0x90, 0x03, 0x24, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0e, 0x9c, 0x83, 0xe4, 0x04, - 0xf1, 0x90, 0xba, 0x41, 0x0f, 0x94, 0x03, 0xe4, - 0x02, 0xc9, 0xed, 0x09, 0x00, 0xae, 0x00, 0x00, - 0x3a, 0x54, 0x0b, 0x90, 0x03, 0x64, 0x00, 0xf9, - 0x62, 0x2e, 0x41, 0x0e, 0x9c, 0x13, 0xa6, 0x80, - 0xd9, 0x03, 0x22, 0x78, 0x8f, 0x94, 0x23, 0xe6, - 0x00, 0xf1, 0x80, 0x32, 0x50, 0x9f, 0x90, 0x83, - 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x01, 0xa4, 0x00, 0xf9, 0x00, 0x3e, 0x42, 0x03, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x36, 0x41, - 0x0f, 0x92, 0x03, 0xe4, 0x00, 0xf9, 0x80, 0x36, - 0x50, 0x0f, 0x90, 0x02, 0xe4, 0x08, 0xe9, 0x00, - 0x3e, 0x60, 0x0f, 0x90, 0x23, 0xe4, 0x00, 0xf9, - 0x03, 0x3e, 0x40, 0x0f, 0x99, 0x43, 0xe4, 0x84, - 0xf9, 0x04, 0x3e, 0x60, 0x0f, 0x98, 0x03, 0x64, - 0x80, 0xf9, 0x20, 0x2e, 0x40, 0x0f, 0x90, 0x03, - 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x10, 0xa0, 0x08, 0xf8, 0x00, 0x36, 0x00, 0x2e, - 0x00, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x32, 0x00, - 0x0f, 0x80, 0x03, 0x60, 0x00, 0xf8, 0x00, 0x3e, - 0x03, 0x4f, 0x80, 0x03, 0xa0, 0x40, 0xc0, 0x20, - 0x32, 0x00, 0x0f, 0x81, 0x43, 0x20, 0x00, 0xe8, - 0x44, 0x3e, 0x18, 0x0c, 0x04, 0x83, 0xe0, 0xc1, - 0xe0, 0x00, 0x32, 0x31, 0x0f, 0x84, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0c, 0x84, 0x03, - 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x45, 0x28, 0x00, 0xba, 0x00, 0x2f, 0x90, 0x08, - 0xa0, 0x02, 0xe8, 0x08, 0xba, 0x00, 0x20, 0x82, - 0x0b, 0xa0, 0x10, 0xe8, 0x00, 0xba, 0x00, 0x27, - 0x90, 0x0b, 0xa0, 0x02, 0xdb, 0x02, 0x8e, 0x48, - 0x23, 0x90, 0x0b, 0x69, 0x0a, 0x3a, 0x00, 0x9e, - 0x80, 0x2f, 0xb0, 0x08, 0xe0, 0x62, 0xf9, 0x18, - 0xfe, 0x00, 0xa3, 0x98, 0x09, 0xe0, 0x02, 0xf8, - 0x00, 0xea, 0x00, 0x2e, 0xa0, 0x28, 0xe0, 0x02, - 0xca, 0x00, 0x40, 0x00, 0x00, 0xed, 0x09, 0x00, - 0xaf, 0x00, 0x00, 0x00, 0x28, 0x05, 0x4c, 0x00, - 0xb3, 0x00, 0x2c, 0x40, 0x08, 0x30, 0x02, 0xcc, - 0x00, 0xb1, 0x80, 0x20, 0x40, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xa3, 0x00, 0x2c, 0xd1, 0x03, 0x30, - 0x42, 0x8f, 0x80, 0x83, 0x40, 0x20, 0xe6, 0x0b, - 0x38, 0x02, 0x4e, 0xd0, 0x23, 0xd8, 0x28, 0xd0, - 0x08, 0x31, 0x02, 0xcc, 0x00, 0xa3, 0x98, 0x20, - 0xc0, 0x4b, 0x34, 0x90, 0xcc, 0x10, 0xb3, 0x00, - 0x2c, 0xe0, 0x08, 0x38, 0x82, 0xca, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1c, 0x00, - 0xb7, 0x00, 0x2c, 0xa0, 0x09, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0xc0, 0x21, 0xc0, 0x0b, 0x72, 0x42, - 0xdc, 0x80, 0xb7, 0x02, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0xdc, 0x00, 0x87, 0x00, 0xa1, 0xc0, 0x8b, - 0x70, 0x12, 0x1c, 0x00, 0x97, 0x00, 0x6d, 0xf0, - 0x08, 0x70, 0x06, 0xdc, 0x00, 0xb0, 0x00, 0x21, - 0xc0, 0x09, 0x70, 0x82, 0xd8, 0x08, 0xa7, 0x24, - 0x2c, 0xe2, 0x08, 0x74, 0x02, 0xe8, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x00, - 0xf7, 0x80, 0x3d, 0xa1, 0x0e, 0x78, 0x03, 0xde, - 0x00, 0xf3, 0x80, 0xb1, 0xe0, 0x0f, 0x7a, 0x03, - 0xdf, 0xc0, 0xf7, 0xc0, 0x3d, 0x61, 0x0f, 0x78, - 0x03, 0x9e, 0x00, 0xcf, 0x80, 0x31, 0xe0, 0x0b, - 0xf8, 0x03, 0x1e, 0x04, 0xe7, 0x81, 0x3f, 0xe0, - 0x28, 0x58, 0x03, 0xde, 0x00, 0xe4, 0x80, 0x31, - 0xa0, 0x0f, 0x68, 0x43, 0xde, 0x00, 0xf7, 0x90, - 0x3d, 0xe0, 0x0c, 0x78, 0x03, 0xea, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, 0xac, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0a, 0xb0, 0x01, 0xec, - 0x00, 0xfb, 0x04, 0x1e, 0xc0, 0x0f, 0xb2, 0x83, - 0xec, 0x00, 0xdb, 0x28, 0x36, 0x40, 0x0f, 0xb4, - 0x83, 0xe8, 0x00, 0xfa, 0x00, 0x3e, 0xc0, 0x0f, - 0xed, 0x09, 0x00, 0xb0, 0x00, 0xa0, 0x03, 0xec, - 0x00, 0xda, 0x00, 0x3e, 0xc0, 0x0f, 0xa0, 0x03, - 0xec, 0x00, 0x68, 0x00, 0x3a, 0x01, 0x0d, 0x90, - 0x03, 0xe0, 0x00, 0xfb, 0x70, 0x3e, 0xc0, 0xcf, - 0x90, 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0xfe, 0x00, 0xff, 0x80, 0x3d, - 0xa0, 0x0e, 0xf8, 0x03, 0xfe, 0x00, 0xff, 0x80, - 0x3f, 0xe0, 0x0f, 0xf8, 0x83, 0xfe, 0x00, 0xff, - 0x80, 0x3f, 0xe0, 0x0f, 0xf9, 0x83, 0xfe, 0x00, - 0xcf, 0x82, 0x1f, 0x60, 0x0d, 0xf8, 0x01, 0xfe, - 0x00, 0xdf, 0x00, 0x37, 0xe0, 0x1f, 0xf9, 0x03, - 0x3e, 0x00, 0xdc, 0x80, 0x33, 0xa0, 0x0f, 0xd9, - 0x03, 0xb6, 0x00, 0xcf, 0x80, 0x13, 0xe0, 0x0c, - 0xd9, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x2d, - 0x04, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0x40, 0x09, 0x71, 0x02, 0xdc, 0x20, 0xb7, - 0x00, 0x2d, 0xc5, 0x0b, 0x71, 0x86, 0xd4, 0x01, - 0xc5, 0x00, 0x6d, 0x44, 0x04, 0x52, 0x02, 0xd0, - 0x02, 0x8d, 0x00, 0x29, 0x00, 0x0c, 0xf1, 0x02, - 0xb8, 0x00, 0xa4, 0x04, 0x21, 0x80, 0x0b, 0x55, - 0x92, 0x30, 0x40, 0xa7, 0x08, 0x21, 0xc4, 0x0d, - 0x45, 0x82, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x2d, - 0x80, 0x0a, 0x70, 0x02, 0xdc, 0x00, 0xb5, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0x00, 0x0b, 0x70, 0x06, 0xcc, 0x00, - 0x97, 0x00, 0x2d, 0x82, 0x28, 0x70, 0x06, 0xcc, - 0x00, 0x87, 0x00, 0x21, 0xc0, 0x0b, 0x61, 0x02, - 0x54, 0x40, 0x84, 0x00, 0x21, 0x80, 0x0b, 0x60, - 0x42, 0x94, 0x00, 0x87, 0x10, 0x21, 0xc0, 0x08, - 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x14, 0xed, 0x09, 0x00, 0xb1, 0x00, - 0xcc, 0x00, 0xb3, 0x02, 0x2c, 0x80, 0x08, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x09, - 0x3c, 0x02, 0xce, 0x00, 0xb3, 0x80, 0x2c, 0x00, - 0x0b, 0x32, 0x02, 0xc0, 0x00, 0x80, 0x00, 0x2c, - 0xa0, 0x00, 0x0e, 0x42, 0xc0, 0x10, 0x80, 0xe0, - 0x28, 0x20, 0x08, 0x24, 0x00, 0xc3, 0x04, 0xa0, - 0x00, 0x00, 0x00, 0x0b, 0x18, 0xe2, 0x00, 0x20, - 0xab, 0x88, 0x20, 0x44, 0x88, 0x10, 0x02, 0xc8, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, - 0xac, 0x00, 0xfb, 0x00, 0x3e, 0x80, 0x0e, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xfc, 0x83, 0xfc, 0x00, 0xff, 0x88, 0x3e, 0x68, - 0x0f, 0xf4, 0x02, 0xec, 0x08, 0x99, 0x00, 0x2e, - 0xb0, 0x08, 0x92, 0x02, 0xe4, 0x00, 0x89, 0x88, - 0x22, 0x66, 0x1b, 0xa4, 0x83, 0x67, 0x00, 0x08, - 0x00, 0x12, 0xc0, 0x0f, 0xb0, 0x02, 0xa0, 0x00, - 0xcf, 0x02, 0x22, 0xf0, 0x28, 0xa8, 0x03, 0xea, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0xec, 0x00, 0xbb, 0x00, 0x3e, 0x80, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xf9, 0x02, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0x10, - 0x0f, 0xb0, 0x03, 0xed, 0x10, 0xf9, 0x40, 0x3e, - 0x88, 0x8f, 0x94, 0x03, 0x64, 0x00, 0xe9, 0x04, - 0x3a, 0x50, 0x0e, 0x96, 0x07, 0xa5, 0x40, 0xe8, - 0x42, 0x3e, 0x99, 0x0f, 0xa0, 0x03, 0xe1, 0x00, - 0xfb, 0x00, 0x3e, 0xc2, 0x0f, 0xb0, 0x03, 0xe0, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, - 0xfc, 0x00, 0xff, 0x02, 0x3f, 0x00, 0x0f, 0x70, - 0x03, 0x3c, 0x00, 0xf7, 0x00, 0x71, 0x40, 0x0c, - 0xf0, 0x83, 0x3c, 0x00, 0xff, 0x00, 0x33, 0x40, - 0x0f, 0xf0, 0x03, 0x14, 0x80, 0xed, 0x00, 0x3a, - 0x40, 0x0f, 0xd0, 0x03, 0xf0, 0x00, 0xed, 0x09, - 0x00, 0xb2, 0x00, 0xfd, 0x00, 0x3b, 0x00, 0x0f, - 0xcc, 0x03, 0x30, 0x34, 0xf8, 0x04, 0x3f, 0xa0, - 0x0f, 0x80, 0x03, 0xf0, 0x00, 0xff, 0x00, 0x32, - 0xc0, 0x0b, 0xc0, 0x03, 0xc0, 0x44, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, 0xbb, - 0x00, 0x2e, 0x82, 0x0b, 0xb0, 0x02, 0x2c, 0x00, - 0xbb, 0x90, 0x22, 0xe4, 0x18, 0xb0, 0x22, 0x2c, - 0x00, 0xbb, 0x01, 0x22, 0x30, 0x0b, 0xb0, 0x03, - 0x20, 0x18, 0xc8, 0x80, 0x2e, 0x50, 0x0b, 0x8e, - 0x03, 0xa3, 0x80, 0x98, 0xa0, 0x3a, 0x30, 0x0e, - 0x8c, 0x02, 0xa2, 0x20, 0xb8, 0xe0, 0x2e, 0x36, - 0x0b, 0x88, 0x22, 0xe3, 0x00, 0xbb, 0x06, 0x22, - 0xc0, 0x4b, 0x98, 0x02, 0xe0, 0x40, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, 0xbb, - 0x00, 0x2e, 0xe0, 0x0b, 0xb0, 0x02, 0x2c, 0x08, - 0xbb, 0x00, 0x2e, 0xc0, 0x08, 0x30, 0x02, 0x2c, - 0x00, 0xb3, 0x00, 0x22, 0x70, 0x0b, 0x30, 0x02, - 0x28, 0x20, 0x88, 0x8c, 0x2e, 0x18, 0x0a, 0x88, - 0x42, 0xe6, 0x00, 0xa8, 0x80, 0x2e, 0x62, 0x8b, - 0x10, 0x86, 0x26, 0x11, 0xb8, 0x80, 0x2e, 0x80, - 0x8b, 0x98, 0x12, 0xe2, 0x00, 0xbb, 0x00, 0x22, - 0xc0, 0x0b, 0x88, 0x02, 0xe0, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb3, - 0x00, 0x2c, 0x80, 0x4b, 0x30, 0x02, 0x0c, 0x04, - 0xb3, 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x42, 0x0c, - 0x00, 0xb3, 0x00, 0x20, 0x00, 0x0b, 0x30, 0x42, - 0x40, 0x01, 0x80, 0x00, 0x2c, 0x00, 0x0b, 0x00, - 0x02, 0xc0, 0x00, 0x90, 0x00, 0x68, 0x00, 0x08, - 0x10, 0x06, 0x80, 0x01, 0xb0, 0x00, 0x24, 0x81, - 0x0b, 0x10, 0x02, 0xc0, 0x08, 0xb3, 0x00, 0x20, - 0xc0, 0x0b, 0x00, 0x02, 0x42, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xfb, - 0x00, 0xed, 0x09, 0x00, 0xb3, 0x00, 0x3e, 0x80, - 0x0f, 0xb0, 0x03, 0x2c, 0x00, 0xfb, 0x00, 0xae, - 0xc0, 0x28, 0xf0, 0x0b, 0x3c, 0x00, 0xff, 0x00, - 0xa2, 0x00, 0x0f, 0xf0, 0x0a, 0x20, 0x00, 0x88, - 0x04, 0x3e, 0x00, 0x0e, 0x80, 0x03, 0xe0, 0x00, - 0xe8, 0x07, 0x7e, 0x00, 0x0f, 0x80, 0x23, 0x20, - 0x11, 0xf8, 0x06, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xe0, 0x10, 0xf7, 0x02, 0x72, 0xc0, 0x4f, 0x80, - 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x1d, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x40, - 0x0f, 0xf0, 0x01, 0x7c, 0x00, 0xfd, 0x00, 0x33, - 0x40, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0x00, 0x0f, 0xf0, 0x03, 0xb0, 0x00, 0xec, - 0x04, 0x3f, 0x00, 0x07, 0xc0, 0x06, 0xb0, 0x00, - 0xdc, 0x00, 0x3f, 0x00, 0x1e, 0xc0, 0x03, 0xf0, - 0x00, 0xfc, 0x00, 0x2f, 0x00, 0x4f, 0xd0, 0x07, - 0xf0, 0x00, 0xff, 0x00, 0x7f, 0x40, 0x0f, 0xd0, - 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x05, 0xfc, 0x00, 0xff, 0x00, 0x33, 0x4c, - 0x0c, 0xe1, 0x03, 0x30, 0x90, 0xf5, 0x00, 0x37, - 0x80, 0x0f, 0xd0, 0x02, 0xdc, 0x01, 0xfc, 0x05, - 0x3f, 0x4c, 0x0f, 0xf0, 0x21, 0xfc, 0x00, 0xff, - 0x22, 0x37, 0x08, 0x0b, 0xc0, 0x03, 0xb0, 0x80, - 0xac, 0x24, 0x3f, 0x00, 0x0d, 0xc0, 0x03, 0x31, - 0x80, 0xcf, 0x01, 0x3f, 0x0e, 0x0f, 0xc2, 0x01, - 0xf0, 0x80, 0xec, 0x08, 0x33, 0x0e, 0x0e, 0xf0, - 0x02, 0x70, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xec, 0x00, 0xbb, 0x08, 0x22, 0x10, - 0x08, 0xa2, 0x02, 0x29, 0x44, 0xb8, 0x00, 0xa2, - 0x80, 0x0b, 0x90, 0x00, 0xec, 0x00, 0x98, 0x00, - 0x2e, 0x98, 0x0b, 0xb0, 0x03, 0xac, 0x00, 0xeb, - 0x14, 0x2a, 0x44, 0x08, 0x80, 0x02, 0x64, 0xe0, - 0x98, 0x40, 0x2e, 0x56, 0xed, 0x09, 0x00, 0xb4, - 0x00, 0x0b, 0x97, 0x22, 0x21, 0x08, 0xdb, 0x00, - 0x2e, 0x10, 0x0b, 0x94, 0x02, 0x41, 0x90, 0x88, - 0x40, 0x22, 0x50, 0x08, 0xb2, 0x02, 0xe0, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, - 0x00, 0xb3, 0x10, 0x20, 0x50, 0x8a, 0xa0, 0x02, - 0x00, 0x10, 0x99, 0x00, 0x20, 0x80, 0x0b, 0x10, - 0x02, 0xc8, 0x00, 0xb2, 0x00, 0x2c, 0xcc, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x28, 0x60, - 0x0a, 0x20, 0x02, 0x80, 0x00, 0xb0, 0x38, 0x2c, - 0x08, 0x0b, 0x10, 0x86, 0x40, 0xc0, 0xa3, 0x00, - 0x2c, 0x40, 0x0b, 0x01, 0x02, 0xcc, 0x60, 0x80, - 0x28, 0x60, 0xa0, 0x08, 0x30, 0x82, 0x62, 0x01, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xac, - 0x00, 0xb3, 0x00, 0xa2, 0x00, 0x0a, 0xa0, 0x02, - 0x22, 0x08, 0xb9, 0x00, 0x22, 0x86, 0x0b, 0x90, - 0x00, 0xe4, 0x00, 0x9b, 0x00, 0x26, 0xc0, 0x0b, - 0xb0, 0x02, 0x2c, 0x00, 0xab, 0x00, 0x28, 0x60, - 0x08, 0xa0, 0x02, 0x66, 0x34, 0xb8, 0x88, 0x26, - 0x60, 0x0b, 0x98, 0x02, 0x22, 0x00, 0xbb, 0x00, - 0x0e, 0x20, 0x0b, 0x80, 0x02, 0xe4, 0x00, 0x88, - 0x00, 0x22, 0x80, 0x08, 0xb0, 0x00, 0xf0, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x11, 0xec, - 0x00, 0xf8, 0x40, 0x32, 0x48, 0x2e, 0xb2, 0x0b, - 0x23, 0x80, 0xd3, 0x90, 0x36, 0x90, 0x0f, 0x92, - 0x23, 0xed, 0x00, 0xba, 0x08, 0x3e, 0xe2, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3a, 0x20, - 0x4e, 0x80, 0x83, 0xa7, 0x00, 0xe9, 0x80, 0x3e, - 0x28, 0x0d, 0x8a, 0x0b, 0x26, 0x00, 0xeb, 0x04, - 0x3e, 0x28, 0x0f, 0xae, 0x03, 0xe2, 0x00, 0xc9, - 0x24, 0x32, 0x20, 0x2e, 0xb0, 0x03, 0x50, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xbc, - 0x00, 0xfa, 0x00, 0xbf, 0x10, 0x0d, 0xd1, 0xed, - 0x09, 0x00, 0xb5, 0x00, 0x03, 0xf8, 0x00, 0xfd, - 0x00, 0x3f, 0x80, 0x0f, 0xdc, 0x03, 0xfd, 0x00, - 0xff, 0x40, 0x3f, 0xe4, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xef, 0x00, 0x3b, 0x00, 0x0e, 0xe0, 0x02, - 0xd4, 0x04, 0xcc, 0x00, 0x3f, 0x41, 0x8f, 0xd0, - 0x03, 0x94, 0x00, 0xdf, 0x00, 0x3e, 0x00, 0x0f, - 0xd2, 0x03, 0x56, 0x40, 0xfd, 0x10, 0xbf, 0x67, - 0x0f, 0xf0, 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x10, 0xac, 0x00, 0xf8, 0x50, - 0xb0, 0x60, 0x0c, 0xb4, 0x03, 0x21, 0x80, 0xfb, - 0x00, 0xb2, 0x80, 0x0a, 0x90, 0x07, 0xed, 0x30, - 0xca, 0x44, 0x32, 0xd8, 0x0f, 0xb0, 0x03, 0xec, - 0x10, 0xfb, 0x10, 0x36, 0x40, 0x0e, 0xa4, 0x03, - 0xe4, 0x00, 0xf9, 0x4a, 0x32, 0x19, 0x0f, 0x96, - 0x03, 0xe4, 0x20, 0xfb, 0x10, 0x32, 0x42, 0x0c, - 0xa4, 0x03, 0x28, 0x10, 0xe2, 0x00, 0x38, 0x80, - 0x0f, 0xb0, 0x82, 0x50, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x00, 0xba, 0x80, - 0x22, 0x00, 0x08, 0x30, 0x23, 0x60, 0x84, 0xb9, - 0x84, 0x22, 0xc0, 0x08, 0x90, 0x02, 0xec, 0x20, - 0x8b, 0x00, 0x36, 0xd2, 0x01, 0xb0, 0x02, 0xec, - 0x00, 0xb7, 0x80, 0x36, 0x00, 0x08, 0xa9, 0x03, - 0xe4, 0x00, 0xb9, 0x41, 0xaa, 0x41, 0x0b, 0x98, - 0x02, 0x65, 0x10, 0x3f, 0x80, 0x2a, 0x50, 0x0a, - 0x80, 0x02, 0x24, 0x00, 0x8a, 0x20, 0x22, 0x80, - 0x0b, 0xb0, 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x05, 0x4c, 0x00, 0xb3, 0x85, - 0x20, 0x40, 0x00, 0x32, 0x02, 0x80, 0x00, 0xb1, - 0x10, 0x20, 0x40, 0x0a, 0x10, 0x00, 0xcf, 0x00, - 0x82, 0x00, 0x20, 0xf0, 0x0b, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x24, 0x00, 0x0a, 0x11, 0x02, - 0xc2, 0x40, 0xb1, 0x00, 0x28, 0x50, 0x0b, 0x8d, - 0x02, 0xc4, 0xed, 0x09, 0x00, 0xb6, 0x00, 0x00, - 0xb3, 0x04, 0x28, 0x74, 0x0b, 0x08, 0x02, 0x80, - 0x20, 0xa2, 0x80, 0x2c, 0x04, 0x0b, 0x30, 0x40, - 0x78, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x01, 0x1e, 0x00, 0xb7, 0x80, 0x20, 0x60, 0x08, - 0xd8, 0x22, 0x5a, 0x80, 0xb4, 0xe0, 0x23, 0xe0, - 0x18, 0x58, 0x02, 0xde, 0x00, 0x8e, 0x80, 0x25, - 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x84, - 0x25, 0xe0, 0x08, 0x58, 0x02, 0xdf, 0x00, 0xb5, - 0x90, 0x29, 0xe0, 0x0b, 0x78, 0x02, 0x5e, 0x00, - 0xb7, 0x80, 0x29, 0xe0, 0x4b, 0x38, 0x02, 0x1a, - 0x00, 0x86, 0x80, 0x25, 0x60, 0xc3, 0x78, 0x02, - 0xc8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x08, 0x0c, 0x00, 0xf3, 0x40, 0x30, 0x44, 0x2c, - 0x30, 0x22, 0x84, 0x40, 0xf1, 0x00, 0x30, 0x44, - 0x0e, 0x30, 0x02, 0xcd, 0x00, 0xc3, 0x00, 0x20, - 0xc0, 0x0f, 0x30, 0x03, 0xcc, 0x00, 0xf3, 0x00, - 0x36, 0x41, 0x0e, 0x31, 0x03, 0xc0, 0x00, 0xfb, - 0x00, 0x30, 0x40, 0x0f, 0x00, 0x03, 0xc8, 0x40, - 0xf3, 0x00, 0x38, 0x40, 0x8f, 0x10, 0x83, 0x8c, - 0x80, 0xeb, 0x00, 0x3c, 0x48, 0x8f, 0x33, 0x03, - 0x52, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x1d, 0xbc, 0x00, 0xff, 0x00, 0x3f, 0x40, 0x0f, - 0x71, 0x13, 0xf8, 0xc4, 0xfd, 0x20, 0x1d, 0xc1, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0x77, 0x00, 0x3f, - 0xc4, 0x0d, 0xf0, 0x03, 0xfc, 0x00, 0xf7, 0x12, - 0x3f, 0xc4, 0x4f, 0xf1, 0x03, 0xbc, 0x00, 0xff, - 0x00, 0x17, 0xc0, 0x0f, 0xe0, 0x03, 0xfc, 0x10, - 0xf7, 0x08, 0x3f, 0x84, 0x0e, 0xf0, 0x0b, 0x7c, - 0x00, 0xff, 0x00, 0x23, 0x40, 0x07, 0xf1, 0x03, - 0xd0, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x05, 0xec, 0x00, 0xf9, 0x00, 0xb2, 0x40, 0x0f, - 0xb0, 0x03, 0xe0, 0x00, 0xc9, 0xed, 0x09, 0x00, - 0xb7, 0x00, 0x04, 0x32, 0x40, 0x0f, 0x80, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x2e, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xbf, 0x10, 0x7a, 0x80, 0x07, - 0x80, 0x02, 0xe8, 0x00, 0xfb, 0x80, 0xb2, 0x80, - 0x0f, 0xa0, 0x03, 0xe4, 0x00, 0xfb, 0x00, 0x32, - 0xc0, 0x0f, 0x28, 0x03, 0x62, 0x00, 0xc9, 0x80, - 0x22, 0x80, 0x0f, 0xb0, 0x01, 0xea, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, 0x01, - 0xbf, 0x00, 0x21, 0x40, 0x0b, 0x70, 0x12, 0xdc, - 0x00, 0x85, 0x00, 0x21, 0xc1, 0x0b, 0x50, 0x02, - 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x80, 0x61, 0xc0, 0x0b, - 0x70, 0x42, 0xd8, 0x00, 0xb6, 0x00, 0x21, 0x80, - 0x4b, 0x70, 0x42, 0xdc, 0x00, 0xb7, 0x20, 0x21, - 0xc0, 0x0b, 0x70, 0x08, 0x0c, 0x00, 0x8d, 0x00, - 0xa1, 0xc0, 0x0b, 0x70, 0x02, 0xd2, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, 0x00, - 0xa5, 0x8d, 0x61, 0x61, 0x0b, 0x78, 0x02, 0xc6, - 0x00, 0x85, 0x82, 0x21, 0xe0, 0x0b, 0x48, 0x06, - 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xf1, 0x0b, 0x78, - 0x02, 0xde, 0x00, 0xb3, 0x80, 0x29, 0xe0, 0x0b, - 0x78, 0x12, 0x5e, 0x1c, 0xb3, 0xc0, 0x21, 0xf0, - 0x0b, 0x78, 0x02, 0xda, 0x00, 0xb3, 0xa0, 0xa9, - 0xe0, 0x0b, 0x78, 0x02, 0x1a, 0x00, 0x87, 0x80, - 0x21, 0xe1, 0x0b, 0x78, 0x02, 0xf0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, 0x00, - 0xb3, 0x00, 0x22, 0xe5, 0x9b, 0x34, 0x02, 0xcc, - 0x82, 0x81, 0x00, 0x20, 0xd0, 0x0b, 0x18, 0x02, - 0xcd, 0x00, 0xb3, 0x00, 0x2c, 0xd0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x68, 0xf0, 0x0b, - 0x30, 0x02, 0xcc, 0x80, 0xb3, 0x20, 0x22, 0xf0, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xb3, 0x00, 0x6a, - 0xed, 0x09, 0x00, 0xb8, 0x00, 0xf8, 0x1b, 0x39, - 0x02, 0x0c, 0x04, 0x83, 0x62, 0x20, 0xc4, 0x0b, - 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xe8, 0x15, 0xa8, 0x00, 0xfe, 0x00, 0x23, - 0x80, 0x0f, 0xec, 0x83, 0xf8, 0x02, 0xc6, 0xe0, - 0xb3, 0xb8, 0x0f, 0x6e, 0x22, 0xd8, 0x60, 0xfe, - 0xe0, 0x3f, 0x80, 0x0f, 0xa0, 0x03, 0xe8, 0x00, - 0xfa, 0x00, 0xbb, 0x82, 0x0f, 0xe4, 0x93, 0x78, - 0x20, 0xfe, 0x80, 0x33, 0x80, 0x0f, 0xe4, 0x03, - 0xf9, 0x14, 0xfa, 0x00, 0x3b, 0x92, 0x0f, 0xe0, - 0x03, 0x39, 0x02, 0x4e, 0x04, 0x33, 0xa0, 0x0f, - 0xa0, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0xe0, 0x00, 0xf0, 0x40, 0x3e, - 0x00, 0x0b, 0x80, 0x53, 0xe1, 0x00, 0xf8, 0xc0, - 0x3e, 0x00, 0x0f, 0x88, 0x03, 0xe0, 0x00, 0xf8, - 0x80, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x26, 0x01, 0x0f, 0x88, 0x03, 0xe1, - 0x00, 0x78, 0x00, 0x3e, 0x18, 0x0f, 0x81, 0x83, - 0xe0, 0x20, 0xf8, 0x00, 0x06, 0x00, 0x0f, 0x84, - 0x03, 0xe0, 0x80, 0xf8, 0x10, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, 0xc8, 0x32, - 0x40, 0x0c, 0x98, 0x83, 0xc4, 0x00, 0xd9, 0x00, - 0x32, 0x42, 0x0f, 0x90, 0x03, 0x24, 0x00, 0xe9, - 0x00, 0x3e, 0x62, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf1, 0x20, 0xb0, 0x42, 0x4c, 0x99, 0x03, 0xc4, - 0x00, 0xc9, 0xc0, 0x3e, 0x68, 0x00, 0x90, 0x03, - 0x26, 0x40, 0xc9, 0x00, 0x3a, 0x69, 0x8c, 0x91, - 0x03, 0xe4, 0x00, 0xf9, 0xc0, 0x3e, 0x60, 0xcf, - 0x9c, 0x63, 0xc2, 0x04, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x04, 0x64, 0x00, 0xb9, 0x00, 0x26, - 0x50, 0x48, 0x94, 0x12, 0xe5, 0x00, 0x89, 0x60, - 0x22, 0x40, 0x0b, 0xed, 0x09, 0x00, 0xb9, 0x00, - 0x90, 0x4a, 0x64, 0x20, 0x89, 0x00, 0x2e, 0x68, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x22, - 0x40, 0x0a, 0x9c, 0x02, 0xe5, 0x20, 0x89, 0xa0, - 0x2e, 0x48, 0x08, 0x90, 0x02, 0xa7, 0x00, 0x81, - 0x80, 0x22, 0x42, 0x0a, 0x9e, 0x02, 0xe4, 0x00, - 0xb9, 0x48, 0x2e, 0x64, 0x0b, 0x98, 0x02, 0xe0, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, - 0x24, 0x00, 0xb9, 0x00, 0xa6, 0x60, 0x08, 0x92, - 0x02, 0xe4, 0x40, 0x89, 0x80, 0x02, 0x40, 0x0b, - 0x90, 0x06, 0x64, 0x00, 0xa9, 0x00, 0x2e, 0x44, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x26, - 0x40, 0x08, 0x90, 0x02, 0xe4, 0x00, 0x99, 0x01, - 0x2e, 0x40, 0x0a, 0x90, 0x22, 0x6c, 0x00, 0x89, - 0x11, 0x2a, 0x40, 0x08, 0x90, 0x02, 0xe6, 0x10, - 0xb9, 0x00, 0x2e, 0x42, 0x0b, 0x90, 0x02, 0xc6, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x04, 0x00, 0xb3, 0x40, 0x24, 0x50, 0x28, 0x1c, - 0x02, 0xc4, 0x02, 0x91, 0x02, 0xa0, 0x41, 0x0b, - 0x90, 0x22, 0x64, 0x10, 0x81, 0x02, 0x2c, 0x50, - 0x1b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x24, - 0x50, 0x0a, 0x18, 0x02, 0xc5, 0x00, 0x91, 0x40, - 0x2c, 0x50, 0x0a, 0x1c, 0x02, 0xc5, 0x00, 0x81, - 0x28, 0x20, 0x50, 0x0a, 0x10, 0x02, 0xc5, 0x00, - 0xb1, 0x40, 0x2c, 0x50, 0x0b, 0x14, 0x02, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, - 0x60, 0x00, 0xf8, 0x00, 0x32, 0x80, 0x0c, 0x80, - 0x23, 0xe8, 0x04, 0xc8, 0x00, 0x32, 0x00, 0x0f, - 0x80, 0x47, 0x60, 0x00, 0xe8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x36, - 0x00, 0x0c, 0x80, 0x03, 0xe0, 0x00, 0xd8, 0x00, - 0x3e, 0x00, 0x0e, 0x80, 0x03, 0x68, 0x00, 0xc8, - 0x20, 0x3a, 0x00, 0x2c, 0x80, 0x07, 0xed, 0x09, - 0x00, 0xba, 0x00, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x1d, 0xe4, 0x00, 0xfd, - 0x40, 0x3b, 0x50, 0x4f, 0xd0, 0x13, 0xfd, 0x10, - 0xe5, 0x00, 0x3f, 0x40, 0x0f, 0xd0, 0x03, 0xb4, - 0x00, 0xfd, 0x01, 0x3f, 0xd0, 0x0f, 0x90, 0x03, - 0xe4, 0x08, 0xf9, 0x40, 0x3b, 0xd0, 0x4f, 0xd0, - 0x03, 0xf5, 0x02, 0xed, 0x40, 0x3f, 0x50, 0x2d, - 0xd4, 0x03, 0xb5, 0x02, 0xf9, 0x00, 0x3f, 0x50, - 0x0d, 0xf4, 0x43, 0xf5, 0x00, 0xfd, 0x45, 0x3f, - 0x50, 0x0f, 0x90, 0x03, 0xe6, 0x06, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x15, 0xe4, 0x00, 0xfd, - 0x00, 0x33, 0x40, 0x0c, 0xd1, 0x03, 0x34, 0x90, - 0xcd, 0x01, 0x22, 0x40, 0x0f, 0x90, 0x03, 0xf4, - 0x00, 0xf9, 0x04, 0x3d, 0x48, 0x0e, 0x90, 0x03, - 0xe4, 0x00, 0xfd, 0x00, 0x7e, 0x40, 0x0e, 0x50, - 0x03, 0xf4, 0x80, 0xfd, 0x2a, 0x3f, 0x4c, 0x0c, - 0xd0, 0x03, 0x34, 0x00, 0xed, 0x28, 0x3f, 0x48, - 0x0c, 0xd2, 0x83, 0xf4, 0xc0, 0xfd, 0x04, 0x33, - 0x40, 0x0e, 0xd1, 0x03, 0xc6, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, 0x00, 0xb8, - 0x48, 0x22, 0x03, 0x08, 0x80, 0x0a, 0x20, 0x08, - 0xaa, 0x00, 0x22, 0x01, 0x0b, 0x80, 0x02, 0xe0, - 0x00, 0xba, 0x01, 0x2e, 0x0a, 0x08, 0x80, 0x03, - 0xa0, 0x00, 0xb8, 0x40, 0x2e, 0x02, 0x08, 0x80, - 0x02, 0xe0, 0xa0, 0xb8, 0x20, 0x2e, 0x0c, 0x88, - 0x84, 0x82, 0x20, 0x20, 0x88, 0x01, 0x2e, 0x0a, - 0x0d, 0x80, 0x02, 0xe0, 0xc0, 0xba, 0x48, 0x32, - 0x02, 0x0d, 0x80, 0x02, 0xce, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, 0x00, 0xb1, - 0x30, 0x20, 0x44, 0x08, 0x30, 0x02, 0x84, 0x40, - 0x81, 0x00, 0xe4, 0x40, 0x0b, 0x10, 0x02, 0xc4, - 0x00, 0xed, 0x09, 0x00, 0xbb, 0x00, 0xb1, 0x00, - 0x2c, 0x4c, 0x1a, 0x10, 0x02, 0xc4, 0x00, 0xb1, - 0x10, 0x2c, 0x44, 0x0b, 0x10, 0x02, 0xc4, 0xc0, - 0x91, 0x28, 0x2c, 0x48, 0x0b, 0x13, 0x02, 0x44, - 0x42, 0x83, 0x00, 0x6c, 0x4c, 0x08, 0x10, 0x42, - 0xc4, 0x80, 0xb1, 0x30, 0x20, 0x44, 0x48, 0x10, - 0x42, 0xc2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x11, 0xa4, 0x00, 0xb9, 0x02, 0xa2, 0x48, - 0x08, 0x90, 0x06, 0x24, 0x10, 0xa9, 0x01, 0x26, - 0x40, 0x03, 0x90, 0x16, 0xe4, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x08, 0x90, 0x02, 0xa4, 0x00, 0xb9, - 0x00, 0x2c, 0x40, 0x09, 0x94, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x2e, 0xd0, 0x0b, 0xb0, 0x0a, 0x64, - 0x01, 0x89, 0x00, 0x2e, 0x50, 0x19, 0x90, 0x00, - 0xe4, 0x10, 0xb1, 0x00, 0x62, 0x50, 0x09, 0x90, - 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x05, 0xe4, 0x00, 0xf9, 0x00, 0x32, 0x40, - 0x2c, 0x98, 0x03, 0xa7, 0x48, 0xc1, 0x40, 0xb6, - 0x58, 0x0f, 0x99, 0x03, 0xe4, 0xd0, 0xb9, 0x00, - 0x3e, 0x70, 0x0e, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x2e, 0x40, 0x0f, 0x98, 0x02, 0xe4, 0x90, - 0xf9, 0x70, 0x1e, 0x40, 0x0f, 0x92, 0x43, 0x67, - 0x80, 0xe9, 0x01, 0x3e, 0x50, 0x0c, 0x90, 0x43, - 0xe5, 0x20, 0xf9, 0x80, 0xb2, 0x75, 0x5c, 0x90, - 0x43, 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x9a, 0x23, 0x46, 0x00, 0xf9, 0x02, 0x3a, - 0x50, 0x0f, 0x98, 0x23, 0xe4, 0x00, 0xf9, 0x24, - 0x3e, 0x70, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0e, 0x92, 0x83, 0xe4, 0x00, - 0xf9, 0x80, 0x34, 0x40, 0x2c, 0x10, 0x03, 0xa4, - 0x80, 0xf9, 0x00, 0x3e, 0x42, 0x0f, 0x90, 0x23, - 0xe4, 0x98, 0xf9, 0x21, 0xed, 0x09, 0x00, 0xbc, - 0x00, 0x32, 0x61, 0x1d, 0x90, 0x03, 0xca, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0xa0, - 0x00, 0xf8, 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, - 0x20, 0x00, 0xc8, 0x0a, 0x32, 0x10, 0x4f, 0x80, - 0x01, 0xe0, 0xc2, 0xd8, 0x40, 0x3c, 0x10, 0x2e, - 0x80, 0x03, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x4f, 0x81, 0x03, 0x21, 0x00, 0xc8, 0x40, 0x3a, - 0x06, 0x0f, 0x81, 0x03, 0xe0, 0x80, 0xe8, 0x80, - 0x3e, 0x00, 0x0f, 0x84, 0x03, 0x20, 0x80, 0xf8, - 0x51, 0x3e, 0x00, 0x2c, 0x81, 0x83, 0xca, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x28, - 0x00, 0xbe, 0x00, 0xa3, 0xa0, 0x0b, 0xe4, 0x02, - 0x38, 0x60, 0xde, 0x20, 0x22, 0x80, 0x0b, 0xa0, - 0x13, 0xba, 0x00, 0x8a, 0x00, 0x2f, 0x88, 0x08, - 0xa0, 0x42, 0xe8, 0x00, 0xbe, 0xc0, 0x2e, 0x81, - 0x0b, 0xe0, 0x02, 0x39, 0x20, 0x8e, 0x08, 0x23, - 0x81, 0x03, 0xe8, 0x43, 0xb8, 0x04, 0xbe, 0x40, - 0x2f, 0x80, 0x0b, 0xe8, 0x82, 0x3b, 0x00, 0xbe, - 0x04, 0x2f, 0x80, 0x00, 0xec, 0x02, 0xca, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x0c, - 0x00, 0xbb, 0x00, 0x62, 0xc0, 0x0b, 0xb2, 0x02, - 0x4f, 0x00, 0x82, 0x40, 0x24, 0xc0, 0x0b, 0x30, - 0x02, 0x8d, 0x00, 0x83, 0x00, 0x2c, 0xc0, 0x2b, - 0x30, 0x42, 0xcc, 0x00, 0xb3, 0x48, 0x2c, 0xc0, - 0x0b, 0x38, 0x02, 0x0f, 0x28, 0x83, 0x08, 0x28, - 0xd0, 0x0b, 0x3a, 0x02, 0xac, 0x00, 0xa2, 0x00, - 0x2e, 0xd0, 0x08, 0x30, 0x02, 0x8e, 0x00, 0xb3, - 0xcb, 0x2e, 0xc0, 0x08, 0x30, 0x02, 0xcb, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1c, - 0x00, 0xb5, 0x00, 0x21, 0xc2, 0x4b, 0xf0, 0x02, - 0x4c, 0x00, 0x9e, 0x00, 0x25, 0xc0, 0x0b, 0x70, - 0x02, 0x92, 0x00, 0x87, 0x00, 0x2d, 0xc0, 0xed, - 0x09, 0x00, 0xbd, 0x00, 0x09, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0x40, 0x2d, 0xc8, 0x0b, 0x68, 0x4a, - 0x1a, 0x00, 0x87, 0x80, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0x9d, 0x00, 0xb6, 0x00, 0x2d, 0xc0, 0x0b, - 0x18, 0x02, 0x9d, 0x00, 0xb5, 0x00, 0x2c, 0x80, - 0x08, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x00, 0xf3, 0x80, - 0x21, 0x60, 0x4f, 0x68, 0x0b, 0x5e, 0x04, 0xc6, - 0x80, 0xb5, 0xe0, 0x0f, 0x78, 0x03, 0x9a, 0x00, - 0xc7, 0x80, 0x3d, 0xa0, 0x0f, 0x78, 0x03, 0xde, - 0x00, 0xf5, 0x80, 0x2d, 0xe0, 0x0f, 0x58, 0x03, - 0x3e, 0x02, 0xcf, 0x80, 0x39, 0xe0, 0x0f, 0x68, - 0x03, 0x9e, 0x00, 0xe6, 0x80, 0x3d, 0xe0, 0x0c, - 0x68, 0x03, 0x96, 0x00, 0xf7, 0x80, 0x2d, 0xe0, - 0x0c, 0x78, 0x23, 0xea, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x1d, 0xac, 0x00, 0xfb, 0x00, - 0x2e, 0x40, 0x0f, 0x20, 0x43, 0xac, 0x00, 0xf3, - 0x00, 0x3a, 0xc0, 0x0f, 0xb0, 0x03, 0x80, 0x00, - 0xeb, 0x00, 0x3e, 0xc0, 0x0e, 0xb0, 0x03, 0xec, - 0x00, 0xf9, 0x04, 0x3e, 0xda, 0x0d, 0x80, 0x03, - 0xec, 0x00, 0xfa, 0x00, 0x32, 0xc0, 0x0f, 0xb0, - 0x23, 0xa8, 0x00, 0xfa, 0x00, 0x3e, 0x40, 0x8f, - 0x80, 0x0b, 0x64, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xff, 0x20, - 0x33, 0xe4, 0x0f, 0xd8, 0x03, 0xfe, 0x00, 0xc7, - 0x80, 0x33, 0xe0, 0x0f, 0xf1, 0x03, 0x72, 0x00, - 0x5f, 0x80, 0x3f, 0xc8, 0x0c, 0xf8, 0x03, 0xfe, - 0x01, 0xff, 0x90, 0x37, 0xe2, 0x0e, 0x78, 0x02, - 0x3e, 0x44, 0xff, 0x81, 0x37, 0xe0, 0x0c, 0xf8, - 0x02, 0xbe, 0x40, 0xdc, 0x80, 0x3f, 0xa0, 0x0f, - 0xf8, 0x03, 0x7e, 0x00, 0xdf, 0x80, 0x33, 0xe0, - 0x89, 0xe9, 0xed, 0x09, 0x00, 0xbe, 0x00, 0x01, - 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x11, 0x9c, 0x00, 0xb5, 0x10, 0x01, 0x40, 0x0b, - 0x40, 0x22, 0xdc, 0x00, 0x87, 0x00, 0x21, 0xc4, - 0x0b, 0x70, 0x22, 0x9c, 0x00, 0x97, 0x10, 0x2f, - 0xc0, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x08, 0x61, 0x82, 0x14, 0xc0, 0xb7, - 0x20, 0x2f, 0x84, 0x08, 0x50, 0x03, 0x5c, 0x00, - 0xa4, 0x10, 0x2d, 0x80, 0x0f, 0x52, 0x02, 0xd8, - 0x00, 0xb7, 0x44, 0x21, 0x98, 0x0a, 0xf1, 0x02, - 0x2a, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x21, 0xc2, 0x8b, - 0x60, 0x82, 0xd0, 0x00, 0x8e, 0x08, 0x21, 0xc0, - 0x0b, 0xf1, 0x06, 0xd4, 0x00, 0xb7, 0x00, 0x2d, - 0x82, 0x09, 0x70, 0x02, 0xdc, 0x00, 0xb5, 0x02, - 0x25, 0xc0, 0x0b, 0x50, 0x02, 0x1c, 0x04, 0xb5, - 0x04, 0x2d, 0x40, 0x08, 0x70, 0x02, 0x94, 0x00, - 0xa4, 0x00, 0x2d, 0xc2, 0x0b, 0x40, 0xc2, 0xdc, - 0x00, 0xb4, 0x00, 0x29, 0xc0, 0x4b, 0x41, 0x02, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x14, 0xcc, 0x00, 0xb3, 0x02, 0x20, 0x70, 0x0b, - 0xa0, 0x12, 0xc1, 0x00, 0x83, 0xc8, 0x20, 0xe4, - 0x0b, 0x34, 0x9a, 0x8d, 0x00, 0xb3, 0x60, 0x2c, - 0xe0, 0x09, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x02, - 0x2c, 0xe0, 0x09, 0x04, 0x02, 0x26, 0x65, 0x30, - 0x00, 0x2c, 0x10, 0x08, 0x1a, 0x16, 0xc1, 0x00, - 0xa0, 0x00, 0x2c, 0x50, 0x4b, 0x0c, 0x82, 0xe8, - 0x00, 0xb0, 0x00, 0x68, 0x40, 0x0a, 0x10, 0x42, - 0x08, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x15, 0xac, 0x00, 0xfa, 0x00, 0x22, 0x70, 0x0f, - 0xa8, 0x03, 0xce, 0x00, 0xca, 0xc0, 0xb2, 0xe4, - 0x0f, 0x34, 0x03, 0xe6, 0x20, 0xdb, 0x40, 0x3e, - 0xf4, 0x0d, 0xb0, 0x03, 0xec, 0xed, 0x09, 0x00, - 0xbf, 0x00, 0x00, 0xfb, 0x01, 0x37, 0xe5, 0x0b, - 0x30, 0x03, 0x26, 0x00, 0xb8, 0x50, 0x36, 0x22, - 0x0c, 0x9c, 0x03, 0xa3, 0x22, 0xc3, 0x00, 0x3e, - 0x74, 0x0f, 0xa8, 0x03, 0xe9, 0x80, 0xfa, 0x04, - 0x3a, 0x50, 0x0d, 0x90, 0x07, 0x2a, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0x00, - 0xf8, 0x80, 0xbe, 0x52, 0x0f, 0xa0, 0x03, 0xef, - 0x02, 0xf8, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x0b, - 0xe5, 0x00, 0xdb, 0x00, 0x3e, 0xc0, 0x0e, 0xb0, - 0x03, 0xec, 0x01, 0xfb, 0x00, 0x0e, 0xc4, 0x0e, - 0xa0, 0x8b, 0xe0, 0x04, 0xf8, 0x00, 0x3e, 0x58, - 0x2f, 0x91, 0x43, 0x20, 0x00, 0xc9, 0x00, 0x3e, - 0x00, 0x0e, 0x80, 0x03, 0xed, 0x28, 0xf8, 0x40, - 0x16, 0x80, 0x05, 0x84, 0x03, 0xe0, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, 0x00, - 0xf7, 0x00, 0x37, 0x00, 0x0c, 0xc0, 0x03, 0x2e, - 0xa4, 0xcd, 0x80, 0x3f, 0xc0, 0x0d, 0xf0, 0x03, - 0x34, 0x22, 0xcf, 0x00, 0x3d, 0x80, 0x01, 0xf0, - 0x03, 0xfc, 0x00, 0xfd, 0x02, 0x36, 0xc1, 0x0e, - 0xc4, 0x03, 0x34, 0x00, 0xd5, 0x00, 0x29, 0x40, - 0x0c, 0x80, 0x03, 0xe4, 0x20, 0xdf, 0x00, 0xb5, - 0x40, 0x0c, 0xe0, 0x03, 0x30, 0x00, 0xca, 0x00, - 0x3f, 0x02, 0x0d, 0xf0, 0x11, 0x00, 0x44, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, - 0xbb, 0x40, 0x20, 0x20, 0x48, 0x8c, 0x8a, 0x2e, - 0x00, 0x8a, 0x48, 0x3c, 0xc0, 0x08, 0xb0, 0x12, - 0x44, 0x00, 0x8b, 0x00, 0x2e, 0x60, 0x08, 0xb0, - 0x03, 0xec, 0x00, 0xb1, 0x50, 0x22, 0xc0, 0x0b, - 0x80, 0x82, 0x26, 0x80, 0xa8, 0xc0, 0xb6, 0x70, - 0x28, 0x9c, 0x02, 0xe3, 0x20, 0xbb, 0x88, 0x22, - 0x30, 0x08, 0x0c, 0x03, 0xe7, 0x80, 0x88, 0x00, - 0x3a, 0x11, 0x01, 0xa9, 0x02, 0x20, 0x40, 0x10, - 0xed, 0x09, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x05, 0x2c, 0x00, 0xba, 0x40, 0x22, - 0x62, 0x08, 0x98, 0x02, 0x2c, 0x20, 0x89, 0x10, - 0x2e, 0xc0, 0x09, 0xb0, 0x02, 0x69, 0x40, 0x8b, - 0x00, 0x2e, 0xe0, 0x1b, 0xb0, 0x22, 0xec, 0x00, - 0xba, 0x08, 0x26, 0xc0, 0x0b, 0xb0, 0x22, 0x22, - 0x00, 0xa9, 0xc0, 0x62, 0x20, 0x08, 0x88, 0x02, - 0xe6, 0x00, 0xb8, 0x20, 0x22, 0x62, 0x1b, 0xa6, - 0x02, 0xa0, 0x45, 0x8b, 0x00, 0x2e, 0x60, 0x09, - 0x04, 0x02, 0xa0, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb0, 0x00, 0x22, - 0x40, 0x08, 0x00, 0x02, 0x00, 0x00, 0x83, 0x00, - 0x2a, 0xc0, 0x08, 0xb0, 0x02, 0x68, 0x00, 0x83, - 0x00, 0x2c, 0xc0, 0x09, 0x30, 0x02, 0x8c, 0x00, - 0xb2, 0x00, 0x24, 0xc0, 0x0b, 0x80, 0x12, 0x00, - 0x00, 0xa1, 0x05, 0x28, 0x00, 0x48, 0x00, 0x10, - 0xc4, 0x00, 0xb0, 0x00, 0x20, 0x00, 0x49, 0x00, - 0x02, 0xc0, 0x00, 0x83, 0x00, 0x28, 0x80, 0x01, - 0x00, 0x02, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xf3, 0x00, 0x32, - 0x01, 0x0c, 0x80, 0x03, 0x2c, 0x00, 0xcb, 0x00, - 0x2e, 0xc0, 0x0d, 0xb0, 0x03, 0x68, 0x04, 0xcb, - 0x04, 0x3e, 0x80, 0x0f, 0xb0, 0x02, 0xec, 0x00, - 0xf8, 0x00, 0x37, 0xc0, 0x0f, 0x90, 0x2b, 0x20, - 0x08, 0xf9, 0x00, 0x2a, 0x40, 0x0c, 0x80, 0x10, - 0xe4, 0x00, 0xd8, 0x00, 0x32, 0x40, 0x8f, 0xa0, - 0x01, 0x20, 0x00, 0xc8, 0x00, 0x3c, 0x00, 0x0d, - 0x80, 0x0b, 0x80, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x19, 0xfc, 0x00, 0xff, 0x00, 0x3b, - 0x01, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0x3c, 0x00, - 0x2f, 0xc0, 0x0f, 0x70, 0x03, 0xb8, 0x00, 0xff, - 0x00, 0x3f, 0xc1, 0x0e, 0xf0, 0x03, 0xfc, 0x00, - 0xfc, 0x00, 0x3b, 0xed, 0x09, 0x00, 0xc1, 0x00, - 0xc0, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0xfc, 0x00, - 0x27, 0x00, 0x0f, 0xc0, 0x13, 0xf0, 0x00, 0xfc, - 0x00, 0x3f, 0x00, 0x8e, 0xc0, 0x01, 0x70, 0x00, - 0xfc, 0x00, 0x3f, 0x00, 0x09, 0xc0, 0x13, 0x68, - 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, - 0xfc, 0x44, 0xfc, 0x01, 0x3b, 0xc6, 0x8c, 0xe0, - 0x03, 0xfc, 0x22, 0xcf, 0x23, 0x33, 0xc8, 0x0f, - 0xf0, 0x03, 0x7c, 0x20, 0xff, 0x10, 0x3b, 0xd0, - 0x0f, 0xf6, 0x03, 0x30, 0x00, 0xfc, 0x08, 0x3f, - 0x00, 0x0f, 0xf1, 0x03, 0xb0, 0x80, 0xff, 0x00, - 0x3f, 0xc0, 0x09, 0xf3, 0x03, 0x30, 0x40, 0xdc, - 0x10, 0x37, 0x00, 0x8d, 0xc3, 0x03, 0x30, 0x20, - 0x4c, 0x00, 0x1f, 0xc2, 0x0f, 0xf0, 0x03, 0xf0, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x90, - 0x8c, 0x80, 0xb3, 0x08, 0x23, 0xc8, 0x08, 0x90, - 0x82, 0xfd, 0x00, 0x8f, 0x50, 0x23, 0xc4, 0x8b, - 0x32, 0x02, 0xfc, 0x00, 0xbb, 0x20, 0xa3, 0xd4, - 0x0b, 0xf6, 0x02, 0x20, 0x20, 0xb8, 0x00, 0x2e, - 0x4a, 0x0e, 0xf0, 0x02, 0x20, 0xa0, 0xbf, 0x00, - 0x0f, 0xc0, 0x0b, 0xf2, 0x02, 0xa0, 0x80, 0xc8, - 0x01, 0x2e, 0x14, 0x08, 0x81, 0x02, 0xa0, 0x00, - 0x88, 0x00, 0x2e, 0xd8, 0x0b, 0xb0, 0x02, 0xe0, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xca, 0x04, - 0x8c, 0x80, 0xbb, 0x20, 0x28, 0xc0, 0x08, 0x12, - 0x02, 0xcc, 0x00, 0x83, 0x00, 0x20, 0xc0, 0x0b, - 0x30, 0x82, 0xcc, 0x00, 0xb3, 0x00, 0x20, 0xc8, - 0x0b, 0x31, 0x02, 0x00, 0x40, 0xb0, 0x08, 0x0c, - 0x40, 0x8b, 0x33, 0x02, 0x00, 0x40, 0xb3, 0x00, - 0x2c, 0xc1, 0x49, 0x36, 0x02, 0x80, 0x00, 0xa0, - 0xa5, 0x2c, 0x00, 0x0b, 0x02, 0x02, 0x00, 0x01, - 0x82, 0x82, 0x64, 0xc2, 0x0b, 0x30, 0x02, 0xe2, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0xc2, 0x00, 0xc0, 0x14, 0xac, 0x00, 0xb9, - 0x50, 0x62, 0xc0, 0x88, 0xb0, 0x02, 0xec, 0x00, - 0x8b, 0x02, 0x22, 0xc0, 0x0b, 0xb0, 0x22, 0xec, - 0x00, 0xbb, 0x00, 0x22, 0xc0, 0x0b, 0xb0, 0x02, - 0x26, 0x20, 0xb9, 0x80, 0x2e, 0xc1, 0x0a, 0xb0, - 0x42, 0x22, 0x00, 0xbb, 0x00, 0x2e, 0xc1, 0x0b, - 0xb0, 0x02, 0xa8, 0x20, 0xab, 0x00, 0x2e, 0x20, - 0x2a, 0x8c, 0x02, 0xa3, 0x00, 0x2a, 0x80, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xf0, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x41, 0x44, 0xac, 0x08, 0xf3, - 0x80, 0x3a, 0xc0, 0x0c, 0x95, 0x03, 0xec, 0x00, - 0x4b, 0x00, 0x32, 0xc0, 0x0f, 0xb0, 0x43, 0xec, - 0x00, 0xfb, 0x00, 0x32, 0xc0, 0x0f, 0xb0, 0x03, - 0x22, 0x00, 0xf8, 0xc0, 0x3e, 0x74, 0x0f, 0xb0, - 0x03, 0x23, 0x80, 0xbb, 0x00, 0x3e, 0xc0, 0x0d, - 0xb0, 0x13, 0xa1, 0x03, 0xe8, 0x80, 0x34, 0x30, - 0x4f, 0x88, 0x03, 0x03, 0x00, 0xc8, 0x00, 0x36, - 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x11, 0xbc, 0x00, 0xfe, - 0x80, 0x3d, 0xc0, 0x0f, 0xd8, 0x13, 0xdc, 0x00, - 0xf7, 0x00, 0xbf, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x01, 0x37, 0xc0, 0x0f, 0xf0, 0x0b, - 0xf4, 0x00, 0x9d, 0x00, 0x3f, 0xc0, 0x1f, 0xb0, - 0x03, 0x64, 0x00, 0xff, 0x00, 0x3f, 0xc1, 0x0f, - 0xf0, 0x43, 0xf2, 0x40, 0xdf, 0x24, 0x3e, 0x01, - 0x09, 0x40, 0x03, 0xf0, 0x20, 0xde, 0x08, 0x1f, - 0xc0, 0x0f, 0xf0, 0x03, 0xf8, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x44, 0x10, 0xac, 0x00, 0xcb, - 0x40, 0xb2, 0xc1, 0x0c, 0x84, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3a, 0xc0, 0x0f, 0xb0, 0x03, 0x2c, - 0x20, 0xcb, 0x00, 0x3e, 0xc0, 0x0d, 0xb0, 0x03, - 0x62, 0x00, 0xf8, 0x60, 0x3e, 0x50, 0x0f, 0xb0, - 0x83, 0xed, 0x09, 0x00, 0xc3, 0x00, 0x24, 0x02, - 0xcb, 0x00, 0x3e, 0xc4, 0x0f, 0xb2, 0x03, 0xe9, - 0x00, 0xf8, 0x80, 0x3e, 0x00, 0x84, 0x84, 0x03, - 0x60, 0x40, 0xda, 0x12, 0x7e, 0xc0, 0x4c, 0xb0, - 0x43, 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xd8, 0x05, 0x2c, 0x00, 0x8b, 0x00, 0x23, 0xc0, - 0x08, 0x90, 0x02, 0xfc, 0x00, 0xbf, 0x88, 0x2b, - 0xc0, 0x0b, 0xb0, 0x02, 0x3c, 0x00, 0x8b, 0x02, - 0x3b, 0xd0, 0x08, 0xf0, 0x02, 0xe5, 0x08, 0xb9, - 0x48, 0x2e, 0xc4, 0x0e, 0xf0, 0x02, 0x24, 0x00, - 0x8f, 0x0f, 0x33, 0xf4, 0x0b, 0xfc, 0x83, 0xa8, - 0x00, 0xfb, 0x80, 0x2e, 0x60, 0x0d, 0x80, 0x02, - 0xe0, 0x00, 0x9b, 0x00, 0x2f, 0xc0, 0x08, 0xb0, - 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x04, 0x4c, 0x08, 0x83, 0x00, 0x24, 0xc0, - 0x08, 0x10, 0x02, 0xce, 0xc0, 0x93, 0x48, 0x28, - 0xc0, 0x0b, 0x30, 0x40, 0x0c, 0x40, 0x8b, 0x00, - 0x2c, 0xc2, 0x0b, 0xb0, 0x02, 0xc1, 0x80, 0x90, - 0xc4, 0x6c, 0x40, 0x0b, 0xb0, 0x0a, 0x00, 0x00, - 0x83, 0x20, 0x28, 0xe0, 0x09, 0xbc, 0x02, 0x20, - 0x08, 0xb0, 0x00, 0x24, 0x20, 0x08, 0x00, 0x02, - 0x82, 0x00, 0xb0, 0xc0, 0x20, 0xc0, 0x08, 0x30, - 0x02, 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xb0, 0x50, 0x5e, 0x02, 0x87, 0x80, 0x24, 0xe4, - 0x08, 0x49, 0x02, 0xde, 0x00, 0xb3, 0x90, 0x29, - 0xe0, 0x0b, 0x78, 0x02, 0x0e, 0x00, 0x87, 0x82, - 0x29, 0xe0, 0x0a, 0x78, 0x02, 0xd2, 0x10, 0xb4, - 0x80, 0x0d, 0x60, 0x1a, 0x78, 0x02, 0x16, 0x00, - 0x83, 0x80, 0x21, 0xe4, 0x0b, 0x78, 0x06, 0x9a, - 0x00, 0xb4, 0x80, 0x2d, 0x24, 0x09, 0x48, 0x42, - 0xd6, 0x00, 0xb6, 0x80, 0x2d, 0xe0, 0x08, 0x78, - 0x02, 0xc8, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x68, 0x08, 0x4c, 0x00, 0xed, 0x09, 0x00, 0xc4, - 0x00, 0xc2, 0x00, 0x34, 0xc0, 0x0c, 0x14, 0x02, - 0xcc, 0x40, 0xf3, 0x10, 0x38, 0xc0, 0x0f, 0x31, - 0x03, 0x0c, 0x02, 0x83, 0x00, 0x3e, 0xc2, 0x0f, - 0x30, 0x02, 0x4c, 0x80, 0xf3, 0x00, 0x2c, 0xc4, - 0x0b, 0x31, 0x03, 0x0c, 0x00, 0x83, 0x00, 0x3c, - 0xc0, 0x8f, 0x30, 0x03, 0x80, 0x80, 0xf3, 0x00, - 0x3c, 0x12, 0x5c, 0x01, 0x13, 0x00, 0x00, 0x52, - 0x10, 0x3a, 0xc0, 0x2c, 0x30, 0x43, 0xd2, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0xbc, - 0x40, 0xff, 0x00, 0x3b, 0xd0, 0x0f, 0xd0, 0x03, - 0xfc, 0x20, 0xff, 0x10, 0x37, 0xc0, 0x0f, 0xf0, - 0x0b, 0xfc, 0x40, 0xff, 0x00, 0x2b, 0xc0, 0x4d, - 0xf1, 0x13, 0xfc, 0x00, 0xff, 0x10, 0x3f, 0xc0, - 0x8f, 0xf5, 0x83, 0xfc, 0x00, 0xff, 0x18, 0x3f, - 0xc2, 0x0f, 0xf0, 0x83, 0xb8, 0x00, 0xef, 0x00, - 0x17, 0x80, 0x5f, 0xc0, 0x43, 0xfc, 0x40, 0xde, - 0x00, 0x3f, 0xc0, 0x0f, 0xf1, 0x01, 0xd0, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0xac, - 0x00, 0xf9, 0x00, 0x3e, 0xd0, 0x08, 0xb8, 0x03, - 0x2d, 0x00, 0xfb, 0x70, 0x3e, 0xcc, 0x0f, 0xb0, - 0x03, 0xed, 0x80, 0xfb, 0x00, 0x3e, 0xc2, 0x07, - 0xbb, 0x23, 0xec, 0x04, 0xfb, 0x86, 0x32, 0xc0, - 0x0f, 0xb2, 0x41, 0x60, 0x00, 0xfb, 0xca, 0x3a, - 0xf0, 0x0e, 0xbc, 0x03, 0x0a, 0x00, 0xeb, 0x00, - 0x7c, 0x00, 0x4d, 0x80, 0x23, 0xa2, 0x04, 0xc8, - 0x00, 0x3e, 0xc4, 0x0f, 0xb0, 0x03, 0xea, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x98, 0x9c, - 0x00, 0xb7, 0x00, 0x2d, 0xd8, 0x08, 0x50, 0x02, - 0x1c, 0x48, 0xb3, 0x10, 0x21, 0xcc, 0x0b, 0x70, - 0x02, 0xdc, 0xc0, 0xb7, 0x04, 0x2d, 0xd8, 0x49, - 0x70, 0x92, 0x1c, 0x10, 0xbf, 0x00, 0x21, 0xc0, - 0x0e, 0x72, 0x02, 0xd4, 0x00, 0xb7, 0x00, 0xed, - 0x09, 0x00, 0xc5, 0x00, 0x28, 0xca, 0x08, 0x31, - 0x02, 0x9c, 0x00, 0x87, 0x00, 0x2d, 0x41, 0x08, - 0x40, 0x02, 0xd4, 0x00, 0xa7, 0x00, 0x2d, 0xc8, - 0x0b, 0x70, 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x1e, 0x00, 0xb7, 0xc0, - 0x29, 0xe0, 0x08, 0xd8, 0x22, 0x1e, 0x80, 0xb7, - 0x80, 0x25, 0xe0, 0x0b, 0x78, 0x02, 0x1e, 0x40, - 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x06, 0x9e, - 0x00, 0xb7, 0x80, 0x21, 0xe0, 0x0b, 0x78, 0x02, - 0x5e, 0x00, 0xb3, 0xa2, 0x29, 0xe8, 0x0a, 0x7a, - 0x02, 0x3e, 0x00, 0xa7, 0x80, 0x2d, 0x21, 0x09, - 0x48, 0x12, 0xca, 0x00, 0xa6, 0x80, 0x6d, 0xe0, - 0x0b, 0x78, 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x04, 0xcc, 0x00, 0xb0, 0x80, - 0x2e, 0xc0, 0x28, 0x24, 0x02, 0x0c, 0x00, 0xbb, - 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x09, 0x30, 0x02, 0x0c, - 0x84, 0xb3, 0xc8, 0x22, 0xe0, 0x0a, 0x30, 0x02, - 0xec, 0x20, 0xb3, 0x02, 0x28, 0xc0, 0x08, 0x30, - 0x02, 0x8c, 0x00, 0xa3, 0x80, 0x2c, 0xd0, 0x08, - 0x39, 0x02, 0xcc, 0x05, 0xa3, 0x01, 0x2c, 0xc0, - 0x1b, 0x30, 0x02, 0xd2, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x15, 0xe8, 0x00, 0xfe, 0x40, - 0x3e, 0x80, 0x0c, 0xe4, 0x03, 0x28, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x13, 0x28, 0x08, - 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xf8, - 0x00, 0xfe, 0x84, 0x33, 0xb6, 0x0f, 0xa0, 0x02, - 0x79, 0x00, 0xfa, 0x00, 0x3a, 0x80, 0x06, 0xa0, - 0x03, 0x3b, 0x00, 0x6e, 0x0b, 0x3d, 0x80, 0x0d, - 0xec, 0x03, 0xfa, 0x20, 0xc6, 0xc8, 0x3e, 0x80, - 0x0f, 0xa0, 0x03, 0xfa, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x01, 0xa0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0xed, 0x09, 0x00, 0xc6, 0x00, 0x0f, - 0x82, 0x0b, 0xe1, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x01, 0xe0, 0x00, 0xf8, 0x02, 0x3e, - 0x00, 0x09, 0x80, 0x13, 0xe0, 0x00, 0xb8, 0x10, - 0xbe, 0x00, 0x0f, 0x84, 0x13, 0xe0, 0x00, 0xf8, - 0x40, 0x36, 0x00, 0x0f, 0x80, 0x03, 0xe2, 0x40, - 0xd8, 0x00, 0x3e, 0x08, 0x4f, 0x80, 0x82, 0xe0, - 0x00, 0xf8, 0xc0, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x10, 0xa4, 0x08, 0xf9, 0x08, 0x3e, 0x40, 0x0c, - 0x90, 0x03, 0xe5, 0x00, 0xf9, 0x02, 0x32, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x40, 0x79, 0x00, 0x32, - 0x40, 0x0f, 0x90, 0x43, 0xa4, 0x04, 0xf9, 0x00, - 0x3e, 0x40, 0x04, 0x90, 0x03, 0xe4, 0x00, 0xc9, - 0x22, 0x3e, 0x64, 0x0f, 0x90, 0x03, 0xe4, 0x08, - 0xf9, 0x08, 0x3e, 0x40, 0x0e, 0x90, 0x01, 0xa4, - 0x80, 0xf9, 0x00, 0x30, 0x40, 0x0e, 0x90, 0x03, - 0xc2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x04, 0x64, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x28, - 0x90, 0x02, 0xe5, 0x80, 0xb9, 0x80, 0xaa, 0x40, - 0x0b, 0x90, 0x02, 0xe4, 0x04, 0xb9, 0x00, 0xa2, - 0x50, 0x0b, 0x90, 0x02, 0xe5, 0x00, 0x99, 0x00, - 0x2e, 0x40, 0x08, 0x9c, 0x02, 0xe4, 0x02, 0x89, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x80, 0x2e, 0x40, 0x08, 0x90, 0x02, 0xe4, - 0x08, 0xb9, 0x00, 0x22, 0x40, 0x08, 0x90, 0x02, - 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, - 0x05, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0a, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x20, 0x2a, 0x40, - 0x4b, 0x90, 0x42, 0x64, 0x00, 0xb1, 0x00, 0x26, - 0x40, 0x8b, 0x90, 0x02, 0x24, 0x40, 0xbb, 0x19, - 0x2e, 0xc0, 0x1a, 0x91, 0x02, 0xe4, 0x00, 0x89, - 0x40, 0x2e, 0x50, 0x0b, 0x90, 0xed, 0x09, 0x00, - 0xc7, 0x00, 0x82, 0xe4, 0x00, 0x39, 0x28, 0x26, - 0x40, 0x0a, 0x90, 0x02, 0xa4, 0x20, 0xb9, 0x80, - 0x26, 0x40, 0x0a, 0x90, 0x02, 0xc6, 0x04, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x14, 0x05, 0x00, - 0xb1, 0x40, 0x2c, 0x50, 0x0a, 0x14, 0x02, 0xc4, - 0x00, 0xb1, 0x68, 0x28, 0x40, 0x0b, 0x14, 0x02, - 0xc4, 0x00, 0xb1, 0x40, 0x24, 0xd0, 0x0b, 0x14, - 0x02, 0xc4, 0xa0, 0xb1, 0x28, 0x0c, 0xd0, 0x28, - 0x12, 0x82, 0xc5, 0x10, 0x81, 0x40, 0x2c, 0x51, - 0x0b, 0x12, 0x82, 0xc5, 0x00, 0xb1, 0x40, 0x0c, - 0x40, 0x08, 0x14, 0x02, 0xc4, 0x00, 0xbb, 0x00, - 0x24, 0x50, 0x08, 0x10, 0x02, 0x42, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0d, 0x60, 0x00, - 0xf8, 0x00, 0x3c, 0x00, 0x0e, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x20, 0x12, 0x00, 0x4f, 0x80, 0x07, - 0xe8, 0x00, 0xf8, 0x00, 0x36, 0x00, 0x0f, 0x00, - 0x03, 0xa8, 0x80, 0xf8, 0x20, 0x3e, 0x00, 0x4e, - 0xa2, 0x23, 0xe0, 0x00, 0xc8, 0x00, 0x3e, 0x00, - 0x0f, 0x82, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0e, 0x80, 0x03, 0xa0, 0x00, 0xf8, 0x00, - 0xb6, 0x00, 0x2e, 0x80, 0x03, 0xee, 0x03, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x98, 0x95, 0xe4, 0x00, - 0xfd, 0x00, 0x3e, 0x50, 0x0d, 0x50, 0x03, 0xe5, - 0x04, 0xf9, 0x00, 0x3e, 0x50, 0x0f, 0x90, 0x21, - 0xe5, 0x00, 0xf9, 0x00, 0x3a, 0x50, 0x0f, 0x94, - 0x13, 0xf4, 0xa0, 0xdd, 0x28, 0x3f, 0x40, 0x4d, - 0x92, 0x83, 0xf5, 0x00, 0x79, 0x40, 0x3e, 0x50, - 0x0f, 0x92, 0xc3, 0xf4, 0x10, 0xfd, 0x00, 0x2f, - 0x50, 0x0f, 0xf4, 0x13, 0xf5, 0x10, 0xff, 0x00, - 0x3a, 0x50, 0x8f, 0x90, 0x03, 0xe6, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, 0x40, - 0xf9, 0x00, 0x32, 0x40, 0x0f, 0xb1, 0x03, 0xf4, - 0xed, 0x09, 0x00, 0xc8, 0x00, 0x80, 0xfd, 0x20, - 0x3e, 0x48, 0x0c, 0x90, 0x02, 0x34, 0x00, 0xc9, - 0x10, 0x3f, 0x4c, 0x0c, 0x92, 0x83, 0x3c, 0x00, - 0xfd, 0x12, 0x3d, 0x41, 0x0f, 0xd2, 0x83, 0xe4, - 0x80, 0xfd, 0x28, 0x3f, 0x4c, 0x0c, 0xd1, 0x03, - 0xe4, 0x00, 0xfd, 0x00, 0x3f, 0x48, 0x0d, 0x90, - 0x07, 0xb4, 0x00, 0xdd, 0x00, 0x32, 0x40, 0x0f, - 0x90, 0x03, 0xc6, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x18, 0xe0, 0x80, 0xb8, 0x08, 0x22, - 0x03, 0x0b, 0x20, 0x02, 0xe0, 0x00, 0xb8, 0x20, - 0x2e, 0x04, 0x08, 0x80, 0x82, 0x20, 0x00, 0x88, - 0x02, 0x2e, 0x08, 0x08, 0x82, 0x02, 0x28, 0x20, - 0x3a, 0x10, 0x26, 0x0b, 0x0f, 0x82, 0x02, 0xc8, - 0xe0, 0xb8, 0x20, 0x2e, 0x0c, 0x0a, 0x81, 0x02, - 0xe8, 0x21, 0xb8, 0x20, 0x2e, 0x04, 0x08, 0x86, - 0x22, 0xe0, 0x40, 0xb8, 0x00, 0x22, 0x02, 0x0b, - 0x80, 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x84, 0x80, 0xb1, 0x20, 0x20, - 0x44, 0x0b, 0x10, 0x02, 0xc4, 0x40, 0xb1, 0x38, - 0x2c, 0x40, 0x28, 0x12, 0x02, 0x04, 0x40, 0x81, - 0x00, 0x2c, 0x4c, 0x28, 0x12, 0xca, 0x04, 0x51, - 0xb1, 0x00, 0x2c, 0x48, 0x0b, 0x12, 0x82, 0xc4, - 0x80, 0xb1, 0x28, 0x28, 0x48, 0x09, 0x10, 0x02, - 0xc4, 0x00, 0xb1, 0x28, 0x2c, 0x41, 0x19, 0x13, - 0x92, 0xc4, 0x00, 0xb1, 0x00, 0x20, 0x44, 0x0b, - 0x10, 0x02, 0xc2, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x98, 0x04, 0xa4, 0x00, 0xb9, 0x00, 0x22, - 0x40, 0x0b, 0x91, 0x02, 0xe4, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x08, 0x90, 0x0a, 0x24, 0x00, 0x89, - 0x00, 0x2e, 0x40, 0x08, 0x90, 0x02, 0x24, 0x04, - 0xb9, 0x00, 0x2e, 0x41, 0x8b, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x22, - 0xe4, 0x00, 0xb9, 0xed, 0x09, 0x00, 0xc9, 0x00, - 0x40, 0x2e, 0x40, 0x88, 0x90, 0x02, 0xee, 0x00, - 0xb9, 0x00, 0x22, 0x40, 0x0b, 0x90, 0x00, 0xc6, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, - 0xe4, 0x00, 0xf9, 0x70, 0x32, 0x40, 0x07, 0x94, - 0x13, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0c, - 0x90, 0x03, 0x24, 0x00, 0xc9, 0x00, 0x3e, 0x40, - 0x4c, 0x90, 0x03, 0x26, 0x00, 0xf9, 0xc0, 0x3e, - 0x78, 0x0b, 0x90, 0x03, 0xe7, 0x00, 0xf9, 0x01, - 0x3a, 0x41, 0x4d, 0x90, 0x03, 0xe7, 0x10, 0xb9, - 0xc0, 0x2c, 0x4c, 0x0d, 0x9d, 0x03, 0xe6, 0x04, - 0xf9, 0x40, 0xb2, 0x40, 0x0f, 0x90, 0x03, 0xe8, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, - 0xa4, 0x00, 0xf9, 0x80, 0xbe, 0x40, 0x0f, 0x98, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x2c, 0x41, 0x0f, - 0x90, 0x03, 0xc4, 0x12, 0xf9, 0x00, 0x3c, 0x40, - 0x0f, 0x10, 0x03, 0xe4, 0xa0, 0xf9, 0x28, 0x36, - 0x48, 0x0e, 0x90, 0x03, 0xe4, 0x40, 0xf9, 0x00, - 0x3e, 0x40, 0x04, 0x90, 0x03, 0xe6, 0x40, 0xf9, - 0x92, 0x3e, 0x42, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x90, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xca, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, - 0x20, 0x00, 0xc8, 0x40, 0x3e, 0x00, 0x0e, 0x84, - 0x0b, 0x22, 0x00, 0xf8, 0x00, 0x32, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x80, 0xd8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xe1, 0x04, 0xd8, 0x45, 0x3e, - 0x11, 0x0d, 0x80, 0x47, 0xe1, 0x02, 0xc8, 0x00, - 0x34, 0x00, 0x0e, 0x80, 0x0b, 0x61, 0x00, 0xb8, - 0x00, 0x32, 0x00, 0x0f, 0x84, 0x01, 0xe0, 0x20, - 0xf8, 0x40, 0x3e, 0x00, 0x0f, 0x80, 0x41, 0xca, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x28, 0x00, 0x8a, 0x00, 0x2e, 0x80, 0x0b, 0xa0, - 0x02, 0x3b, 0x80, 0xbe, 0x90, 0x2a, 0xed, 0x09, - 0x00, 0xca, 0x00, 0x80, 0x0b, 0xa0, 0x03, 0xb8, - 0x00, 0x8a, 0x00, 0x0f, 0x80, 0x0b, 0xa0, 0x02, - 0xf9, 0x00, 0x3e, 0x40, 0x2f, 0x90, 0x08, 0xe9, - 0x02, 0xe8, 0x00, 0x8e, 0xcc, 0x2b, 0xa9, 0x08, - 0xe8, 0x03, 0x28, 0x00, 0xbe, 0x00, 0x37, 0x80, - 0x8b, 0xa0, 0x02, 0xfb, 0x00, 0xb6, 0xa0, 0x2e, - 0x80, 0x0b, 0xa0, 0x02, 0xca, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x04, 0x0c, 0x00, 0x9b, - 0x00, 0x2c, 0xc0, 0x0a, 0x30, 0x02, 0x0e, 0x00, - 0xb3, 0xd0, 0x20, 0xc0, 0x0b, 0xb0, 0x02, 0x87, - 0x40, 0x93, 0x00, 0x24, 0xe8, 0x0b, 0x30, 0x02, - 0x8c, 0x00, 0xb3, 0x00, 0x2c, 0xdc, 0x09, 0x30, - 0x02, 0x4c, 0x00, 0x83, 0x48, 0x20, 0xc2, 0x0a, - 0x30, 0x82, 0x8c, 0x00, 0xb3, 0x80, 0x28, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x40, 0x33, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x10, 0x5e, 0xc2, 0x97, - 0x20, 0x2d, 0xcc, 0x0b, 0x78, 0x02, 0x10, 0x08, - 0xb3, 0x00, 0x2d, 0xc0, 0x0b, 0x72, 0x02, 0x98, - 0x00, 0x87, 0x01, 0x2d, 0xc2, 0x8b, 0x72, 0x12, - 0xdc, 0x00, 0xb7, 0x00, 0x2f, 0xe0, 0x08, 0x74, - 0x12, 0xde, 0x40, 0x87, 0x80, 0x28, 0xe0, 0x08, - 0x38, 0x82, 0x1c, 0x80, 0xb5, 0xc2, 0x2d, 0xc0, - 0x1b, 0x72, 0x02, 0xdc, 0x00, 0x37, 0x02, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x88, 0x88, 0x3e, 0xc0, 0xd7, - 0x81, 0x2d, 0xe8, 0x0e, 0x78, 0x03, 0x12, 0x00, - 0xf7, 0x00, 0x31, 0xe0, 0x0f, 0x7d, 0x03, 0x9a, - 0x00, 0xd7, 0x90, 0x3d, 0xe0, 0x8f, 0x7a, 0x13, - 0xde, 0x10, 0xf7, 0x80, 0x2d, 0xe0, 0x0d, 0x78, - 0x02, 0x5e, 0x80, 0xce, 0x80, 0x35, 0xc0, 0x0e, - 0x78, 0x03, 0x1e, 0xc9, 0xfc, 0x80, 0x79, 0xe0, - 0x0b, 0xed, 0x09, 0x00, 0xcb, 0x00, 0x78, 0x03, - 0xde, 0x00, 0xf7, 0x80, 0x2d, 0xf8, 0x0f, 0x78, - 0x03, 0xe2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x15, 0xac, 0x80, 0xeb, 0x78, 0x3e, 0xda, - 0x0f, 0xb7, 0x83, 0xe8, 0x00, 0xfb, 0x00, 0x3a, - 0xc0, 0x0f, 0xb0, 0x03, 0x84, 0x00, 0xfb, 0x20, - 0x3e, 0xc0, 0x0b, 0xb6, 0x03, 0x60, 0x04, 0xf9, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x02, 0xec, 0x90, - 0xf9, 0x04, 0x3e, 0x00, 0x0f, 0xb0, 0x03, 0xad, - 0x80, 0xf8, 0x00, 0x36, 0xc0, 0x0f, 0xb0, 0x03, - 0xe4, 0x00, 0xf8, 0x00, 0x36, 0xc0, 0x0f, 0xb0, - 0x03, 0xc2, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x04, 0xbe, 0x00, 0xff, 0x80, 0x3f, 0xe0, - 0x0f, 0x72, 0x03, 0x32, 0x00, 0xef, 0x00, 0x3f, - 0xe1, 0x8c, 0xf2, 0x03, 0xfa, 0x00, 0xff, 0x88, - 0x3f, 0xe0, 0x0f, 0xfc, 0x83, 0xfe, 0x00, 0xef, - 0x10, 0x35, 0x60, 0x0c, 0xf8, 0x03, 0x3f, 0x00, - 0xff, 0x80, 0x37, 0xa0, 0x0c, 0xf8, 0x02, 0xfe, - 0x60, 0xfd, 0x80, 0x3f, 0xe4, 0x0e, 0xf8, 0x83, - 0x3e, 0x00, 0xff, 0x80, 0x1f, 0xe5, 0x0f, 0xf8, - 0x01, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xaa, 0x18, 0x9c, 0x00, 0xb7, 0x18, 0x2d, 0xc0, - 0x0b, 0x71, 0x02, 0x10, 0x00, 0x87, 0x50, 0x21, - 0xc0, 0x0d, 0x70, 0x03, 0xd8, 0x40, 0xb7, 0x00, - 0x2d, 0x00, 0x0b, 0x70, 0x03, 0xdd, 0x00, 0x86, - 0x10, 0x2d, 0x48, 0x0d, 0x64, 0x02, 0x9c, 0x00, - 0xb5, 0x00, 0x2f, 0x44, 0x0d, 0x51, 0x02, 0xdc, - 0x60, 0xb5, 0x29, 0x2d, 0xc0, 0x88, 0xf0, 0x0a, - 0x18, 0x40, 0xb7, 0x10, 0x2d, 0xc0, 0x0d, 0x70, - 0x02, 0x6a, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0xf0, 0x02, 0x10, 0x00, 0xb1, 0x10, 0x28, - 0xc0, 0x08, 0x71, 0x02, 0xed, 0x09, 0x00, 0xcc, - 0x00, 0xd8, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0xdc, 0x40, 0x87, 0x01, 0x27, 0x00, - 0x08, 0x10, 0x02, 0x9c, 0x00, 0xb7, 0x00, 0x2d, - 0x80, 0x08, 0x60, 0x02, 0x5c, 0x04, 0x94, 0x02, - 0x2d, 0xc0, 0x8a, 0x70, 0x0a, 0x1c, 0x20, 0xb7, - 0x40, 0x2d, 0xc1, 0x0b, 0x70, 0x02, 0xc0, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0xcc, - 0x01, 0xb3, 0x40, 0x2c, 0xc0, 0x8b, 0xb4, 0x02, - 0x00, 0x10, 0x93, 0x00, 0x20, 0xc0, 0x08, 0x30, - 0x22, 0xc8, 0x00, 0xb3, 0x00, 0x2c, 0x00, 0x0b, - 0x30, 0x02, 0xa1, 0x80, 0x80, 0x20, 0x2c, 0x00, - 0x09, 0x00, 0x0a, 0x8d, 0x00, 0x31, 0x02, 0x2c, - 0x00, 0x01, 0x00, 0x02, 0xce, 0x20, 0xb0, 0xc0, - 0x2c, 0xc2, 0x08, 0x3c, 0x02, 0x03, 0x00, 0xb0, - 0x80, 0x2e, 0xc0, 0x08, 0x30, 0x02, 0x40, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, 0xfc, - 0x00, 0xf7, 0x80, 0x3f, 0xc0, 0x0f, 0xf5, 0x23, - 0x20, 0x00, 0xfb, 0x00, 0x3a, 0xc0, 0x08, 0xf0, - 0x03, 0xe8, 0x00, 0xff, 0x00, 0x0e, 0x40, 0x07, - 0xf0, 0x02, 0xe5, 0x00, 0xc9, 0x00, 0x36, 0x64, - 0x0c, 0x90, 0x43, 0x3d, 0x40, 0xb9, 0x00, 0x1e, - 0x40, 0x48, 0x90, 0x42, 0xfe, 0x00, 0x98, 0xc0, - 0x2e, 0xc0, 0x0e, 0xf0, 0x82, 0x2e, 0x00, 0xfb, - 0xc0, 0x3f, 0xc0, 0x0b, 0xb0, 0x02, 0xe2, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xac, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb1, 0x0b, - 0xc0, 0x00, 0xe3, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xa9, 0x00, 0xfb, 0x00, 0x3c, 0x50, 0x0f, - 0x30, 0x03, 0xe4, 0x00, 0x99, 0x00, 0x3e, 0x14, - 0x0e, 0x94, 0x02, 0x6c, 0x00, 0xf8, 0x40, 0x3e, - 0x40, 0x0f, 0x80, 0x03, 0xec, 0x04, 0xf8, 0x09, - 0x2e, 0x71, 0x0f, 0xb0, 0x03, 0xed, 0x00, 0xed, - 0x09, 0x00, 0xcd, 0x00, 0xfb, 0x12, 0x3e, 0xc0, - 0x0d, 0xb0, 0x03, 0x60, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x21, 0x10, 0xbc, 0x00, 0xff, 0x08, - 0x37, 0xc0, 0x0f, 0xf0, 0x03, 0x30, 0x40, 0xcf, - 0x00, 0x33, 0xc0, 0x0f, 0xf0, 0x03, 0xfb, 0x00, - 0xdf, 0x00, 0x3f, 0x00, 0x0c, 0xf0, 0x03, 0x24, - 0x00, 0xc4, 0x00, 0x33, 0x41, 0x0f, 0xc0, 0x03, - 0xfc, 0x10, 0xfe, 0x00, 0x33, 0xa0, 0x0e, 0xd0, - 0x03, 0xfc, 0x00, 0xec, 0x00, 0x33, 0xe0, 0x8d, - 0xf0, 0x81, 0xfa, 0x28, 0xff, 0xc0, 0x1f, 0xc0, - 0x0c, 0xf0, 0x03, 0x40, 0x44, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xa1, 0x04, 0x6c, 0x00, 0xbb, 0x00, - 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0x21, 0x80, 0x8b, - 0x82, 0x2e, 0xc1, 0x0b, 0xb0, 0x02, 0xca, 0x00, - 0x8b, 0x00, 0x2e, 0x31, 0x08, 0xb0, 0x02, 0x22, - 0x00, 0x88, 0xc0, 0x22, 0x32, 0x0b, 0x88, 0x02, - 0xec, 0x00, 0x98, 0x58, 0x2a, 0x18, 0x0a, 0x8e, - 0x22, 0xec, 0x00, 0x80, 0xc8, 0xa2, 0x50, 0x0b, - 0xb0, 0x02, 0xe1, 0x40, 0xb8, 0x80, 0x2e, 0xc0, - 0x08, 0xb0, 0x02, 0xe8, 0x40, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, 0xbb, 0x00, - 0x26, 0xc0, 0x0b, 0xb0, 0x02, 0x68, 0x00, 0x89, - 0x80, 0x26, 0xc0, 0x0b, 0xb0, 0x02, 0xe5, 0x00, - 0xbb, 0x00, 0x2e, 0x62, 0x08, 0xb0, 0x02, 0x22, - 0x10, 0x89, 0x88, 0x26, 0x60, 0x4b, 0x98, 0x22, - 0xec, 0x00, 0xb2, 0x00, 0x24, 0xc4, 0x00, 0x98, - 0x12, 0xcc, 0x00, 0x88, 0x80, 0x22, 0x98, 0x09, - 0xb0, 0x12, 0xe4, 0x00, 0x99, 0x00, 0x2e, 0xc0, - 0x88, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x14, 0x0c, 0x00, 0xbb, 0x00, - 0x24, 0xc0, 0x8b, 0x30, 0x02, 0x40, 0x02, 0x82, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc8, 0x00, - 0x83, 0x00, 0xed, 0x09, 0x00, 0xce, 0x00, 0x2c, - 0x00, 0x00, 0x30, 0x02, 0x00, 0x04, 0x80, 0x00, - 0x24, 0x00, 0x0b, 0x00, 0x02, 0xcc, 0x00, 0x90, - 0x02, 0x2c, 0x40, 0x0a, 0x00, 0x02, 0xcc, 0x02, - 0x88, 0x00, 0x20, 0x00, 0x0b, 0x30, 0x02, 0xc0, - 0x00, 0xb1, 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x02, - 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x0d, 0x7c, 0x00, 0xff, 0x00, 0x37, 0xc0, 0x0f, - 0xf0, 0x0b, 0x60, 0x08, 0xc9, 0x00, 0x32, 0xc0, - 0x1f, 0xf0, 0x03, 0xe8, 0x00, 0xff, 0x00, 0x3e, - 0x00, 0x0c, 0xf0, 0x01, 0x20, 0x00, 0xc8, 0x00, - 0x36, 0x00, 0x0f, 0x80, 0x03, 0xfc, 0x08, 0xfa, - 0x00, 0x36, 0x80, 0x9e, 0x80, 0x03, 0xfc, 0x04, - 0xc8, 0x00, 0x32, 0x80, 0x0d, 0xb0, 0x01, 0xe0, - 0x00, 0xf9, 0x00, 0x3e, 0xc0, 0x2c, 0xb0, 0x03, - 0x40, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa2, - 0x15, 0xfc, 0x00, 0xff, 0x00, 0x3b, 0xc0, 0x0f, - 0xf0, 0x03, 0x98, 0x00, 0xfe, 0x00, 0x3b, 0xc0, - 0x8f, 0xf0, 0x03, 0xf4, 0x00, 0xff, 0x00, 0x3f, - 0x00, 0x0f, 0xf0, 0x03, 0xf0, 0x04, 0xfc, 0x00, - 0xbb, 0x00, 0x0f, 0xc0, 0x03, 0xfc, 0x01, 0xfc, - 0x00, 0x3b, 0x00, 0x0f, 0xc0, 0x03, 0xfc, 0x01, - 0xdc, 0x00, 0x3d, 0x00, 0x0f, 0xf0, 0x26, 0xf0, - 0x00, 0x7c, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x07, - 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x05, 0xfc, 0x00, 0xfe, 0x00, 0x33, 0x44, 0x0d, - 0xf0, 0x03, 0x3c, 0x00, 0xc5, 0x00, 0x37, 0x02, - 0x0f, 0xc0, 0x03, 0xf4, 0x00, 0xce, 0x00, 0x37, - 0xc0, 0x0c, 0xf0, 0x03, 0xf8, 0x00, 0xc4, 0x08, - 0x3b, 0x0a, 0x0f, 0xc0, 0x23, 0xd8, 0x00, 0xfc, - 0x00, 0x3b, 0x05, 0x4c, 0xc1, 0x03, 0xb8, 0x08, - 0xce, 0x08, 0xb3, 0x40, 0x0f, 0xf0, 0x03, 0xf0, - 0x80, 0xfc, 0x30, 0x33, 0x00, 0xed, 0x09, 0x00, - 0xcf, 0x00, 0x0c, 0xc2, 0xa7, 0xb0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0xec, 0x00, - 0xba, 0x52, 0x22, 0x08, 0x08, 0xa0, 0x02, 0x2c, - 0x08, 0x89, 0x00, 0x2a, 0x10, 0x0b, 0xb0, 0x26, - 0xec, 0x10, 0x88, 0x00, 0x22, 0x80, 0x08, 0xb0, - 0x00, 0x6c, 0x00, 0x88, 0x40, 0x22, 0x12, 0x0b, - 0x80, 0x02, 0xe8, 0xa0, 0xb9, 0x04, 0x36, 0x5d, - 0x08, 0x87, 0x02, 0xa8, 0x00, 0x8a, 0x44, 0x22, - 0x00, 0x0b, 0x92, 0x82, 0xe1, 0xa0, 0xb2, 0x40, - 0x20, 0x8c, 0x08, 0xa6, 0x16, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, 0x00, - 0xb0, 0x04, 0x20, 0x80, 0x09, 0x30, 0x02, 0x0c, - 0x00, 0x81, 0x01, 0x88, 0x80, 0x0b, 0x00, 0x02, - 0xc4, 0x00, 0xba, 0x00, 0x26, 0x80, 0x19, 0x30, - 0x40, 0xc0, 0x10, 0x80, 0x00, 0x28, 0x09, 0x4b, - 0x00, 0x22, 0xc8, 0x00, 0xb0, 0x81, 0x20, 0x00, - 0x28, 0x12, 0x06, 0x28, 0x02, 0x92, 0x00, 0x20, - 0x40, 0x0a, 0x30, 0x02, 0xc8, 0x40, 0xb0, 0x30, - 0x20, 0x02, 0x8a, 0x00, 0xc2, 0x22, 0x01, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xac, 0x00, - 0xb8, 0x80, 0x22, 0xd0, 0x08, 0xa2, 0x02, 0x2c, - 0x00, 0x89, 0x00, 0x2a, 0xa0, 0x0b, 0xb5, 0x02, - 0xec, 0x02, 0x3a, 0x40, 0x22, 0x00, 0x19, 0xb0, - 0x02, 0xe0, 0x80, 0x8a, 0xc0, 0x2a, 0x44, 0x8b, - 0x80, 0x02, 0xe8, 0x20, 0xb9, 0x00, 0x2e, 0x61, - 0x08, 0x98, 0x02, 0xa8, 0x00, 0x9a, 0x20, 0x22, - 0x30, 0x0b, 0x90, 0x06, 0xe8, 0x01, 0xbb, 0x00, - 0x22, 0x82, 0x08, 0x20, 0x92, 0x30, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xec, 0x00, - 0xfa, 0xc0, 0x30, 0xe0, 0x0d, 0x1e, 0x03, 0x0c, - 0x02, 0xc1, 0x40, 0xba, 0x30, 0x0b, 0xa4, 0x02, - 0xc4, 0x10, 0xf3, 0x42, 0x36, 0xd0, 0x0d, 0xb0, - 0xed, 0x09, 0x00, 0xd0, 0x00, 0x13, 0xcf, 0x20, - 0xc8, 0x80, 0x3a, 0x12, 0x0f, 0x85, 0x93, 0xe9, - 0x08, 0xf2, 0x80, 0x32, 0x23, 0x0c, 0x98, 0x03, - 0xa8, 0x00, 0xda, 0x80, 0x22, 0xe0, 0x0e, 0x90, - 0x03, 0xe7, 0x90, 0xf9, 0x00, 0x32, 0x70, 0x0e, - 0x9c, 0x02, 0x00, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x01, 0xbc, 0x00, 0xf2, 0x00, 0xbf, - 0xa8, 0x0f, 0xf8, 0x0b, 0xfc, 0x00, 0xfd, 0x10, - 0x3f, 0x00, 0x0f, 0xe8, 0x23, 0xee, 0x40, 0x4f, - 0xa0, 0x3f, 0xc0, 0x0e, 0xf0, 0x03, 0x7e, 0x00, - 0xf4, 0x00, 0x37, 0x41, 0x0f, 0xd8, 0x13, 0xf8, - 0x00, 0xfe, 0x18, 0x34, 0x42, 0x0f, 0xc0, 0xd3, - 0xf2, 0x40, 0xed, 0x80, 0x3f, 0x80, 0x0f, 0xf0, - 0x03, 0xfc, 0x50, 0xfd, 0x90, 0xbf, 0xe5, 0x4f, - 0xb9, 0x03, 0x78, 0x40, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x10, 0xac, 0x00, 0xfa, 0x40, 0x32, - 0x00, 0x0c, 0x97, 0x03, 0x2c, 0x04, 0xe9, 0x80, - 0xb6, 0xb0, 0x0f, 0xb4, 0x03, 0xe4, 0x20, 0xcb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x43, 0x64, 0x00, - 0xc8, 0x40, 0xb2, 0x08, 0x0f, 0x82, 0x03, 0x21, - 0x00, 0xc8, 0x00, 0x3e, 0x00, 0x4c, 0x90, 0x63, - 0xec, 0x00, 0xca, 0x00, 0x3e, 0x40, 0x0d, 0x90, - 0x03, 0xe5, 0x00, 0xf8, 0x00, 0x30, 0x52, 0x0e, - 0x96, 0x03, 0x10, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xc8, 0x01, 0x2c, 0x00, 0xba, 0x00, 0x22, - 0x60, 0x0e, 0xb8, 0x0a, 0x2c, 0x12, 0xa9, 0x80, - 0x22, 0x80, 0x0b, 0xb7, 0x06, 0xee, 0x00, 0xdb, - 0xd0, 0x2c, 0x54, 0x0b, 0xb0, 0x02, 0xe7, 0x00, - 0x8e, 0x19, 0x36, 0x62, 0x0b, 0x90, 0x02, 0x20, - 0x64, 0x8b, 0xc4, 0x2e, 0x70, 0x08, 0x8c, 0x02, - 0xce, 0x00, 0xa2, 0x00, 0x2e, 0x80, 0x0b, 0xbe, - 0x02, 0xef, 0x89, 0xb9, 0x01, 0x36, 0xc0, 0x08, - 0xb4, 0x02, 0x32, 0xed, 0x09, 0x00, 0xd1, 0x00, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, - 0x4c, 0x00, 0xb2, 0x04, 0x20, 0xe0, 0x08, 0x2c, - 0x02, 0x0e, 0xc0, 0xa3, 0x00, 0x60, 0x00, 0x0b, - 0x08, 0x12, 0xc6, 0x00, 0xb2, 0x50, 0x2c, 0x90, - 0x0b, 0x30, 0x12, 0xce, 0x80, 0xa0, 0xc0, 0x04, - 0x30, 0x09, 0x24, 0x02, 0x48, 0x00, 0xb0, 0xc2, - 0x2c, 0x40, 0x08, 0x80, 0x02, 0xca, 0x80, 0x82, - 0x24, 0x2c, 0x00, 0x09, 0x3e, 0x02, 0xc3, 0x20, - 0xa8, 0x00, 0x20, 0x04, 0x02, 0x01, 0x00, 0x38, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, - 0x1c, 0x40, 0xb7, 0x80, 0x21, 0x60, 0x0a, 0xf9, - 0x02, 0x1e, 0x00, 0xa7, 0x80, 0x21, 0xa4, 0x0b, - 0x78, 0x12, 0xd6, 0x30, 0xb6, 0x82, 0x2d, 0xa0, - 0x0b, 0x78, 0x02, 0xfe, 0x20, 0x8e, 0x00, 0x25, - 0x24, 0x4b, 0x68, 0x02, 0x7e, 0x00, 0xb5, 0x80, - 0x2d, 0xe2, 0x08, 0x68, 0x82, 0xda, 0x12, 0xa6, - 0x80, 0x2d, 0x20, 0x0b, 0x58, 0x02, 0xd2, 0x14, - 0xb6, 0x80, 0x25, 0x20, 0x48, 0x58, 0x02, 0x18, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, - 0x0c, 0x00, 0xf2, 0x00, 0x32, 0xc3, 0x08, 0x20, - 0x03, 0x0c, 0x40, 0xe1, 0x50, 0x30, 0x80, 0x0f, - 0x20, 0x02, 0xcc, 0x44, 0xf2, 0x01, 0x3c, 0x80, - 0x0f, 0x30, 0x03, 0xc4, 0x00, 0xc1, 0x10, 0x34, - 0xc0, 0x0d, 0x21, 0x43, 0x4c, 0x00, 0xf0, 0x18, - 0x3c, 0x80, 0x8c, 0x10, 0x02, 0xc8, 0x60, 0xc2, - 0x00, 0x3c, 0x00, 0x0d, 0x30, 0x03, 0xcc, 0x01, - 0xe0, 0x00, 0x30, 0xc4, 0x4e, 0x20, 0x03, 0x12, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, - 0xbc, 0x80, 0xfd, 0x00, 0x3f, 0x40, 0x0a, 0x70, - 0x13, 0xdc, 0x00, 0xfd, 0x00, 0x3b, 0x80, 0x0f, - 0xf0, 0x03, 0xfc, 0x40, 0xde, 0x00, 0x3f, 0x00, - 0x0f, 0xf0, 0x03, 0xd4, 0x00, 0xff, 0xed, 0x09, - 0x00, 0xd2, 0x00, 0x20, 0x3f, 0xc0, 0x47, 0x60, - 0x0b, 0xbc, 0x40, 0x8d, 0x00, 0x3f, 0x80, 0xaf, - 0xf0, 0x03, 0xd8, 0x00, 0xfe, 0x10, 0x3f, 0x00, - 0x0f, 0xd0, 0x11, 0xfc, 0x00, 0xff, 0x10, 0x3f, - 0xc4, 0x0f, 0xf1, 0x03, 0xd0, 0x06, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x05, 0xec, 0x00, 0xfa, - 0x80, 0x32, 0xc0, 0x0c, 0x30, 0x0b, 0x2c, 0x00, - 0xfb, 0x00, 0x3c, 0xa0, 0x0f, 0xa0, 0x03, 0xe4, - 0x00, 0xf2, 0x00, 0x32, 0xc0, 0x4e, 0xb0, 0x01, - 0xe6, 0x00, 0xc9, 0x00, 0x2e, 0xc0, 0x0c, 0x90, - 0x03, 0xec, 0x04, 0xfa, 0x00, 0x3e, 0x40, 0x0f, - 0xb0, 0x03, 0xe8, 0x00, 0xfa, 0x02, 0x3e, 0x80, - 0x0e, 0x90, 0x03, 0x68, 0x00, 0xfb, 0x02, 0x32, - 0x00, 0x0f, 0x80, 0x03, 0x6a, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, 0x09, 0xb7, - 0x00, 0x35, 0x40, 0x08, 0x70, 0x02, 0x1c, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0x08, 0x70, 0x02, 0xd4, - 0x00, 0x37, 0x00, 0x29, 0xc0, 0x08, 0x70, 0x42, - 0xd4, 0x00, 0x87, 0xa0, 0x2c, 0xc0, 0x08, 0x70, - 0x02, 0xdc, 0x18, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0xd8, 0x00, 0xb7, 0x00, 0x2d, 0x80, - 0x0b, 0x70, 0x12, 0xd8, 0x00, 0xb7, 0x00, 0x35, - 0x00, 0x0b, 0x10, 0x02, 0x12, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, 0x00, 0xb2, - 0x80, 0x23, 0xe0, 0x0a, 0xf8, 0x82, 0x1e, 0x08, - 0xb4, 0x80, 0x2d, 0xe0, 0x0b, 0x68, 0x02, 0xde, - 0x00, 0xbf, 0x80, 0x21, 0xe0, 0x0a, 0x78, 0x42, - 0xde, 0x02, 0x85, 0x90, 0x2d, 0xe1, 0x0a, 0x78, - 0x22, 0xd6, 0x10, 0xb6, 0x80, 0x2d, 0xe0, 0x0b, - 0x78, 0x12, 0xde, 0x00, 0xb6, 0x80, 0x2d, 0xa0, - 0x0a, 0x58, 0x02, 0x1f, 0x04, 0xb6, 0x80, 0x25, - 0xe0, 0x0b, 0x68, 0x02, 0xf0, 0x40, 0x20, 0x00, - 0x00, 0xed, 0x09, 0x00, 0xd3, 0x00, 0x00, 0x00, - 0x48, 0x14, 0xcc, 0x00, 0xb3, 0x80, 0x64, 0x44, - 0x2a, 0x38, 0x0a, 0x0c, 0x00, 0xb1, 0x01, 0x2c, - 0xf0, 0x09, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x01, - 0x28, 0x40, 0x4a, 0x30, 0x02, 0xce, 0x00, 0x83, - 0x00, 0x2c, 0xc0, 0x28, 0x34, 0x82, 0xc4, 0x00, - 0xb3, 0xf0, 0x2e, 0xc0, 0x9b, 0x33, 0x02, 0xce, - 0x00, 0xb2, 0x80, 0x2c, 0x84, 0x8b, 0x31, 0x02, - 0xed, 0x00, 0xb3, 0x04, 0x24, 0xc0, 0x0b, 0x30, - 0x82, 0x92, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xe8, 0x15, 0xa8, 0x00, 0xfe, 0x00, 0x31, 0xa0, - 0x0e, 0xe4, 0x43, 0x28, 0x00, 0xfe, 0x40, 0x3f, - 0x98, 0x0f, 0xec, 0x01, 0xe8, 0x00, 0xfe, 0xe0, - 0x31, 0x90, 0x06, 0xa0, 0x03, 0xfb, 0x20, 0xce, - 0x50, 0x3f, 0x94, 0x0e, 0x60, 0x23, 0xfb, 0x84, - 0xbe, 0xc0, 0x3f, 0x81, 0x0f, 0xe8, 0x03, 0xf9, - 0x30, 0xfe, 0x40, 0x3f, 0xa0, 0x06, 0xa0, 0x03, - 0x3b, 0x40, 0xfe, 0x00, 0xf3, 0x80, 0x07, 0xe4, - 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0xe0, 0x00, 0xf8, 0x10, 0x3e, 0x00, - 0x05, 0x8c, 0x03, 0xe0, 0x00, 0xf8, 0xc0, 0x3e, - 0x18, 0x4e, 0x8d, 0x01, 0xe0, 0x00, 0xf8, 0x80, - 0x3e, 0x30, 0x05, 0x80, 0x03, 0xe2, 0x00, 0xf8, - 0x40, 0x3c, 0x00, 0x0f, 0x80, 0x03, 0xe2, 0x00, - 0xf8, 0x00, 0x3e, 0x20, 0x0f, 0x80, 0x03, 0xe2, - 0x00, 0xf8, 0xd0, 0x3e, 0x00, 0x0f, 0x80, 0x23, - 0xe1, 0x10, 0xf0, 0x18, 0x7a, 0x02, 0x07, 0x00, - 0x01, 0x52, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x60, - 0x0c, 0x90, 0x03, 0x26, 0x80, 0xf9, 0xc0, 0x32, - 0x40, 0x0f, 0x90, 0x03, 0x25, 0x00, 0xf9, 0x40, - 0x22, 0x64, 0x0e, 0x90, 0x03, 0xe6, 0x00, 0xf9, - 0x00, 0x1e, 0x40, 0x0c, 0xed, 0x09, 0x00, 0xd4, - 0x00, 0x92, 0x03, 0x24, 0x10, 0xf9, 0x80, 0x32, - 0x40, 0x0c, 0x98, 0x03, 0xe6, 0x40, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xa5, 0x00, 0xc9, - 0x84, 0x72, 0x68, 0x47, 0x90, 0x03, 0x02, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x64, - 0x00, 0xb9, 0x00, 0x2e, 0x64, 0x28, 0x10, 0x0a, - 0x25, 0x08, 0x31, 0x01, 0x22, 0x58, 0x0b, 0x10, - 0x02, 0xa4, 0x04, 0xb1, 0x80, 0x36, 0x62, 0x08, - 0x90, 0x02, 0xe7, 0x00, 0xb9, 0x40, 0x2e, 0x74, - 0x0a, 0x90, 0x02, 0x25, 0x00, 0xb1, 0x80, 0x2a, - 0x41, 0x08, 0x98, 0x02, 0xe5, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x99, 0x22, 0xa7, 0x02, 0x09, - 0xb0, 0x7a, 0x40, 0x8b, 0x94, 0x02, 0x20, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, - 0x00, 0xbb, 0x00, 0x2e, 0x40, 0x09, 0x90, 0x02, - 0x24, 0x04, 0xb9, 0x00, 0x22, 0xe0, 0x0b, 0x98, - 0x02, 0x24, 0x00, 0xb9, 0x00, 0x2a, 0xc0, 0x0a, - 0x90, 0x02, 0xe4, 0x80, 0xb9, 0x00, 0x0e, 0x42, - 0x09, 0x90, 0x8a, 0x24, 0x00, 0xb9, 0x10, 0x22, - 0x42, 0x28, 0xb2, 0x02, 0xe4, 0x00, 0xb9, 0x20, - 0x2e, 0x40, 0x1b, 0x10, 0x02, 0xa4, 0x04, 0x99, - 0x04, 0x22, 0x40, 0x0b, 0x94, 0x02, 0x06, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, - 0x00, 0xb1, 0x00, 0x2e, 0x50, 0x09, 0xb0, 0x0a, - 0x04, 0x04, 0xb1, 0x00, 0xa0, 0x40, 0x0b, 0xb0, - 0x02, 0x84, 0x00, 0xb1, 0x05, 0x2c, 0x40, 0x08, - 0x10, 0x02, 0xcc, 0x00, 0xb1, 0x00, 0x2c, 0x51, - 0x0b, 0x10, 0x02, 0x0d, 0x00, 0xb9, 0x02, 0x28, - 0x50, 0x08, 0x14, 0x02, 0xc4, 0x00, 0xb3, 0x28, - 0x2c, 0x4a, 0x09, 0x14, 0x0a, 0x8d, 0x00, 0x91, - 0x44, 0x28, 0x50, 0x0b, 0x14, 0x0a, 0x02, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, 0xed, - 0x09, 0x00, 0xd5, 0x00, 0x60, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0d, 0x80, 0x0a, 0x28, 0x00, 0xfa, - 0x00, 0xb2, 0x00, 0x0f, 0x80, 0x03, 0x20, 0x00, - 0xfa, 0x02, 0x3a, 0x00, 0x0e, 0x80, 0x03, 0xe0, - 0x00, 0xfa, 0x00, 0x3e, 0x00, 0x0d, 0x80, 0x03, - 0x20, 0x00, 0xfa, 0x04, 0x32, 0x00, 0x0c, 0xa0, - 0x02, 0xe8, 0x00, 0xf8, 0x20, 0x3e, 0x1c, 0x0f, - 0x80, 0x07, 0xa0, 0x00, 0xd0, 0x00, 0x32, 0x00, - 0x0f, 0x80, 0x03, 0x2e, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x98, 0x1d, 0xe4, 0x00, 0xfd, 0x40, - 0x3d, 0x40, 0x0e, 0xd0, 0x03, 0xe4, 0x00, 0xfd, - 0x00, 0x3f, 0x50, 0x0b, 0xd0, 0x13, 0xf5, 0x00, - 0xfd, 0x00, 0x35, 0x40, 0x0f, 0x90, 0x03, 0xd4, - 0x00, 0xfd, 0x40, 0x3f, 0x50, 0x0e, 0xd0, 0x13, - 0xf4, 0x01, 0xfd, 0x00, 0x3f, 0x50, 0x0f, 0xd4, - 0x03, 0xf4, 0xa8, 0xfd, 0x00, 0x3f, 0x41, 0x0f, - 0xd0, 0x43, 0x75, 0x00, 0xef, 0x42, 0x3f, 0x50, - 0x0f, 0xd4, 0x03, 0xe6, 0x06, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x11, 0xe4, 0x00, 0xf9, 0x00, - 0x3f, 0x50, 0x0f, 0xd0, 0x03, 0xb4, 0x00, 0xf5, - 0x00, 0xb7, 0x40, 0x07, 0x50, 0x03, 0x34, 0xa0, - 0xfd, 0x00, 0x3f, 0x40, 0x0d, 0x90, 0x03, 0xf4, - 0x00, 0xf5, 0x08, 0x3f, 0xc2, 0x0c, 0x70, 0x03, - 0x34, 0x01, 0xbd, 0x00, 0x3b, 0x52, 0x0c, 0xd0, - 0x83, 0x14, 0x00, 0xfd, 0x04, 0x32, 0x44, 0x0d, - 0x50, 0x02, 0x74, 0x00, 0xfd, 0x08, 0x2f, 0x4a, - 0x0f, 0xd0, 0x03, 0x26, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x18, 0xe0, 0x00, 0xb8, 0x40, - 0x2e, 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xb8, - 0x00, 0x3e, 0x90, 0x5b, 0x80, 0x02, 0x21, 0x00, - 0xb8, 0x04, 0x2e, 0x00, 0x0b, 0x80, 0x02, 0xe0, - 0x00, 0xb8, 0x00, 0x2e, 0x9a, 0x08, 0x80, 0x0a, - 0x20, 0x05, 0xed, 0x09, 0x00, 0xd6, 0x00, 0xb8, - 0x00, 0x22, 0x08, 0x08, 0x84, 0x02, 0x20, 0x20, - 0xba, 0x00, 0xa2, 0x04, 0x0b, 0x82, 0x00, 0x00, - 0x80, 0xb8, 0x00, 0x2e, 0x18, 0x0b, 0x82, 0x0a, - 0x0e, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x05, 0xc4, 0x00, 0xb1, 0x40, 0x2c, 0x48, 0x0b, - 0x10, 0x02, 0xc4, 0x00, 0xb9, 0x04, 0x24, 0x50, - 0x0b, 0x90, 0x1a, 0x04, 0x01, 0xb1, 0x00, 0x2c, - 0x40, 0x4b, 0x10, 0x42, 0xc4, 0x00, 0xb1, 0x00, - 0x6c, 0x40, 0x28, 0x90, 0x02, 0x04, 0xa0, 0xb9, - 0x00, 0x68, 0x40, 0x28, 0x12, 0x8a, 0x44, 0x80, - 0x91, 0x10, 0x20, 0x40, 0x0b, 0x10, 0x82, 0x47, - 0x20, 0xb1, 0x09, 0x2c, 0x42, 0x0b, 0x14, 0x82, - 0x02, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x05, 0xa4, 0x00, 0xb9, 0x00, 0x2e, 0x4a, 0x0b, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x40, 0x2e, 0x40, - 0x0b, 0x94, 0x02, 0x26, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x8b, 0x90, 0x02, 0xe4, 0x40, 0xb9, 0x88, - 0x2e, 0x40, 0x48, 0x90, 0x02, 0x24, 0x00, 0xb9, - 0x41, 0x2a, 0x40, 0x1a, 0x90, 0x02, 0x24, 0x00, - 0xbb, 0x00, 0x22, 0x40, 0x0b, 0xb0, 0x00, 0x24, - 0x40, 0xb9, 0x00, 0x0e, 0x46, 0x0b, 0x92, 0x02, - 0x06, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x05, 0xe4, 0x00, 0xf9, 0x80, 0x3e, 0x60, 0x4f, - 0x90, 0x13, 0xe4, 0x04, 0xf1, 0x40, 0xb6, 0x40, - 0x0b, 0x1c, 0x03, 0x26, 0x00, 0xf9, 0x08, 0x3e, - 0x72, 0x8f, 0x90, 0x03, 0xe7, 0x20, 0xb9, 0xc0, - 0x3e, 0x64, 0x0c, 0x99, 0x03, 0x27, 0x20, 0xb9, - 0x80, 0x3a, 0x46, 0x0c, 0x92, 0x03, 0x66, 0x94, - 0xd9, 0x40, 0x32, 0x60, 0x0b, 0x90, 0x03, 0x64, - 0x00, 0xf9, 0x40, 0x3e, 0x60, 0x0f, 0x90, 0x03, - 0x28, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x01, 0xa4, 0x00, 0xf9, 0x20, 0xed, 0x09, 0x00, - 0xd7, 0x00, 0x3e, 0x60, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x90, 0xbe, 0x50, 0x0f, 0x9a, 0x13, - 0xe4, 0x10, 0xf9, 0x20, 0x3e, 0x70, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x98, 0x23, 0xe7, 0x00, 0xf9, 0xa0, 0x36, 0x60, - 0x0d, 0x90, 0x43, 0xe6, 0x40, 0xf1, 0x90, 0x3e, - 0x64, 0x0f, 0x90, 0x0b, 0xe6, 0x00, 0xf9, 0x00, - 0x7e, 0x60, 0x0f, 0x10, 0x03, 0xca, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0xa0, 0x00, - 0xf8, 0x00, 0x32, 0x08, 0x2c, 0x88, 0x03, 0x22, - 0x40, 0xf8, 0x80, 0x32, 0x30, 0x0f, 0x89, 0x37, - 0x22, 0x08, 0xf8, 0x80, 0x3e, 0x01, 0x02, 0x80, - 0x43, 0xe3, 0x00, 0xf8, 0x20, 0x32, 0x10, 0x8e, - 0x82, 0x01, 0x21, 0x08, 0xd8, 0x54, 0x22, 0x15, - 0x0f, 0x80, 0x23, 0xa0, 0x00, 0xd8, 0x80, 0x32, - 0x00, 0x0e, 0x80, 0x03, 0xe0, 0x20, 0xc8, 0x00, - 0x32, 0x18, 0x2c, 0x80, 0x03, 0xca, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x28, 0x00, - 0xba, 0x00, 0x23, 0xb2, 0x08, 0xe4, 0x8a, 0x39, - 0x04, 0xbe, 0xc8, 0x37, 0x90, 0x0b, 0xe4, 0x06, - 0x39, 0x00, 0xbe, 0x40, 0x2f, 0xa4, 0x08, 0xa0, - 0x02, 0xf9, 0x00, 0xbe, 0xc0, 0x37, 0x84, 0x0b, - 0x60, 0x42, 0x3b, 0x00, 0xa6, 0x40, 0x03, 0x80, - 0x03, 0xe4, 0x02, 0xfa, 0x00, 0x8e, 0x60, 0x22, - 0x80, 0x0b, 0xe0, 0x02, 0x38, 0x00, 0x8e, 0x81, - 0x23, 0xb2, 0x08, 0xe8, 0x02, 0xca, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x4c, 0x00, - 0xb3, 0x00, 0xa0, 0xd1, 0x18, 0x30, 0x02, 0x0c, - 0x00, 0xb3, 0x80, 0x20, 0xc0, 0x0b, 0x10, 0x02, - 0x0c, 0x04, 0xb3, 0x90, 0x2c, 0xa4, 0x8a, 0x30, - 0x02, 0xcc, 0x40, 0xb0, 0x80, 0x2e, 0xc0, 0x8a, - 0x34, 0x02, 0x0f, 0x28, 0x83, 0x60, 0x26, 0xc8, - 0xed, 0x09, 0x00, 0xd8, 0x00, 0x0b, 0xb2, 0x22, - 0x8f, 0xc0, 0xa3, 0x00, 0x28, 0xc0, 0x0b, 0xba, - 0x02, 0x4f, 0x00, 0x83, 0xb0, 0x68, 0xf0, 0x08, - 0x38, 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x01, 0x1c, 0x00, 0xbf, 0x80, 0xa1, - 0x60, 0x08, 0xf8, 0x02, 0x1c, 0x00, 0xb7, 0x00, - 0x25, 0xc0, 0x09, 0xf0, 0x0a, 0x1c, 0x04, 0xb6, - 0x00, 0x2d, 0xa0, 0x08, 0x70, 0x02, 0xd4, 0x00, - 0xb4, 0xc0, 0x2d, 0xc0, 0x0b, 0xf4, 0x0a, 0x1e, - 0x20, 0x27, 0x02, 0x25, 0xc0, 0x0b, 0x70, 0x02, - 0xde, 0x08, 0xaf, 0x01, 0x29, 0xc0, 0x0b, 0xf0, - 0x92, 0x1f, 0x04, 0x07, 0x81, 0x21, 0xe0, 0x08, - 0x70, 0x82, 0xe8, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x08, 0x1e, 0x00, 0xf7, 0x80, 0x33, - 0x60, 0x0c, 0x78, 0x03, 0x12, 0x00, 0xf7, 0x80, - 0x31, 0x60, 0x0f, 0x58, 0x02, 0x16, 0x10, 0xf4, - 0x80, 0x3d, 0xe0, 0x0e, 0x78, 0x13, 0xde, 0x00, - 0xf4, 0x80, 0x3d, 0xa0, 0x0e, 0x68, 0x63, 0x3e, - 0x08, 0xc7, 0x80, 0x35, 0xe0, 0x0f, 0x68, 0x03, - 0x9e, 0x00, 0xf7, 0x80, 0x39, 0xe0, 0x0f, 0x78, - 0x03, 0x5e, 0x02, 0xcf, 0x80, 0x38, 0x60, 0x0c, - 0x68, 0x23, 0xea, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x1d, 0xac, 0x00, 0xf3, 0x00, 0xbe, - 0x40, 0x07, 0x30, 0x03, 0xec, 0x00, 0xf9, 0x00, - 0x3e, 0xc0, 0x0f, 0x90, 0x03, 0xec, 0x10, 0xfb, - 0x00, 0x3c, 0xc1, 0x8f, 0xb0, 0x03, 0xec, 0x00, - 0xf8, 0x00, 0x36, 0x00, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xe3, 0x04, 0xba, 0xc0, 0x0d, 0x90, 0x03, - 0xec, 0x00, 0xd3, 0x01, 0xb6, 0xc4, 0x4f, 0x90, - 0x43, 0x60, 0x00, 0xfb, 0x02, 0xbe, 0xc0, 0x0f, - 0xa0, 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0xfe, 0x00, 0xff, 0x80, 0x33, - 0xe0, 0x0c, 0x48, 0xed, 0x09, 0x00, 0xd9, 0x00, - 0x03, 0x3e, 0x40, 0xce, 0x80, 0x33, 0xa4, 0x0e, - 0x48, 0x13, 0xba, 0x40, 0x3e, 0x90, 0x3f, 0x20, - 0x87, 0xf9, 0x03, 0xfe, 0x40, 0xfc, 0x80, 0x3f, - 0xe0, 0x4d, 0xd8, 0x43, 0xfe, 0x00, 0xcf, 0x80, - 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0x7c, 0x00, 0xdc, - 0x80, 0x1f, 0xe4, 0x0d, 0xc9, 0x03, 0xf2, 0x02, - 0xcc, 0x80, 0x33, 0xec, 0x0c, 0xd9, 0x03, 0x10, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, - 0x9c, 0x00, 0xb7, 0x08, 0x35, 0x40, 0x88, 0x64, - 0x03, 0x5c, 0x00, 0x84, 0x10, 0x21, 0x84, 0x08, - 0x42, 0x02, 0x98, 0x44, 0xb7, 0x14, 0x3d, 0x00, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb4, 0x00, 0x2f, - 0x90, 0x08, 0x50, 0x03, 0xf5, 0x00, 0x86, 0x00, - 0x0d, 0x40, 0x0b, 0x70, 0x03, 0x7c, 0xc0, 0xa5, - 0x00, 0x3f, 0xc0, 0x08, 0x73, 0x02, 0xd8, 0x00, - 0x84, 0x44, 0x2b, 0x04, 0x08, 0x74, 0x02, 0x2a, - 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9c, 0x00, 0xb7, 0x00, 0xa3, 0xc0, 0x08, 0xc0, - 0x02, 0x18, 0x08, 0x97, 0x00, 0x21, 0x50, 0x4b, - 0x40, 0x26, 0x90, 0x41, 0xb6, 0x06, 0x2d, 0xc0, - 0x0b, 0x70, 0x12, 0xdc, 0x00, 0x95, 0x00, 0x2d, - 0xc0, 0x08, 0x75, 0x02, 0xd8, 0x40, 0x87, 0x00, - 0x2d, 0x80, 0x0b, 0x60, 0x02, 0x1c, 0x50, 0x87, - 0x50, 0x2d, 0xc0, 0x08, 0x40, 0x06, 0xd4, 0x00, - 0x84, 0x08, 0x2d, 0x48, 0x48, 0x40, 0x42, 0x44, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, - 0xcc, 0x00, 0xb3, 0x60, 0x24, 0x66, 0x08, 0x28, - 0x82, 0x4c, 0x00, 0x93, 0x00, 0x20, 0xe0, 0x09, - 0x10, 0x82, 0x88, 0x00, 0xb3, 0x00, 0x28, 0x80, - 0x0b, 0x30, 0x12, 0xcc, 0x00, 0xb0, 0x80, 0x2c, - 0x00, 0x08, 0x30, 0x12, 0x81, 0x00, 0x81, 0x61, - 0x2c, 0x20, 0x0b, 0x10, 0x02, 0x4c, 0xed, 0x09, - 0x00, 0xda, 0x00, 0x00, 0xa3, 0x80, 0x2c, 0xf1, - 0x08, 0x18, 0x02, 0x42, 0x00, 0xa0, 0x48, 0x2c, - 0x20, 0x0a, 0xac, 0x02, 0x59, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x15, 0xac, 0x00, 0xfb, - 0x40, 0x30, 0xa0, 0x0c, 0xb4, 0x03, 0x2c, 0x02, - 0xd9, 0x00, 0x32, 0xd2, 0x0f, 0x2c, 0x03, 0xa4, - 0x00, 0xb3, 0xc0, 0x2e, 0x82, 0x0f, 0xb0, 0x01, - 0xed, 0x00, 0xf8, 0x0c, 0x7e, 0x50, 0x00, 0xb4, - 0xc6, 0xc0, 0x04, 0x88, 0xc2, 0x0e, 0x20, 0x0f, - 0x9d, 0xa3, 0x2e, 0x20, 0xcb, 0x24, 0x6f, 0xd2, - 0x1c, 0xb8, 0x83, 0xee, 0x00, 0xcb, 0x00, 0x3e, - 0xa0, 0x4c, 0xb0, 0x0b, 0x68, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0x00, 0x0f, 0x85, 0x03, 0xed, 0x08, - 0xe9, 0x02, 0x3e, 0xc0, 0x0e, 0xa8, 0x13, 0xe2, - 0x08, 0xfa, 0x34, 0x3e, 0xd0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xf8, 0x04, 0x7e, 0x40, 0x4e, 0xb0, - 0x07, 0xe4, 0x80, 0xf8, 0x50, 0x3e, 0x4c, 0x0f, - 0x94, 0x03, 0xe0, 0x00, 0xeb, 0x40, 0x7a, 0xc2, - 0x2e, 0xa4, 0x03, 0xcc, 0x40, 0x5b, 0x00, 0x3a, - 0xd4, 0x4d, 0x87, 0x03, 0xa1, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, 0x00, 0xfb, - 0x00, 0x3f, 0xa0, 0x0c, 0xf0, 0x03, 0x74, 0x00, - 0xcc, 0x98, 0x32, 0x40, 0x0f, 0xc0, 0x03, 0x7e, - 0x80, 0xfd, 0x04, 0x37, 0x82, 0x0f, 0xf0, 0x03, - 0xfc, 0x60, 0xfc, 0x01, 0x3f, 0x42, 0x0c, 0xe0, - 0x13, 0x70, 0x08, 0xdc, 0xa0, 0x3f, 0x40, 0x0f, - 0x10, 0x03, 0x3e, 0x40, 0xff, 0x00, 0x31, 0xc0, - 0xfc, 0xf0, 0x03, 0xec, 0x00, 0xc0, 0x00, 0x31, - 0x00, 0x2e, 0xf0, 0x0a, 0x20, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, 0xbb, - 0x00, 0x2e, 0x38, 0x28, 0x14, 0x22, 0x0c, 0x00, - 0x82, 0xed, 0x09, 0x00, 0xdb, 0x00, 0x40, 0x22, - 0xc0, 0x0b, 0x98, 0x23, 0x21, 0x38, 0xba, 0x00, - 0x2a, 0x80, 0x4b, 0xb0, 0x03, 0xec, 0x20, 0xb8, - 0x10, 0x2c, 0x60, 0x28, 0x30, 0x12, 0x27, 0x00, - 0x88, 0xe0, 0x36, 0x70, 0x0b, 0x98, 0x82, 0x2f, - 0x24, 0xb3, 0x40, 0x2a, 0xc0, 0x08, 0x80, 0x03, - 0xe0, 0x00, 0x88, 0xc0, 0xa2, 0xd0, 0x08, 0x84, - 0x02, 0x20, 0x50, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x05, 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xc8, - 0x08, 0x92, 0x02, 0x6c, 0x21, 0x88, 0x08, 0x22, - 0x80, 0x4b, 0x86, 0x1a, 0x24, 0x04, 0xbb, 0x40, - 0x2a, 0xc6, 0x9b, 0xb0, 0x02, 0xec, 0x08, 0xba, - 0x00, 0x2e, 0x60, 0x48, 0x90, 0x02, 0xa6, 0x00, - 0x98, 0x00, 0x2e, 0x30, 0x1b, 0x88, 0x22, 0x2c, - 0x00, 0xb9, 0x00, 0x22, 0xc0, 0x18, 0x80, 0x42, - 0x60, 0x00, 0x9b, 0x10, 0x2a, 0x91, 0x88, 0x91, - 0x66, 0xa0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x0c, 0x00, 0xb3, 0x00, 0x2e, 0x40, - 0x08, 0x00, 0x02, 0x0c, 0x03, 0x82, 0x00, 0xa0, - 0x80, 0x0b, 0x80, 0x02, 0x00, 0x01, 0xb2, 0x01, - 0xa8, 0xc0, 0x0b, 0x30, 0x02, 0x8c, 0x00, 0xb0, - 0x00, 0x0e, 0x00, 0x08, 0x10, 0x0a, 0xa4, 0x00, - 0x80, 0x00, 0x20, 0x40, 0x9b, 0x00, 0x02, 0x4c, - 0x08, 0xb1, 0x01, 0x28, 0xc0, 0x38, 0x20, 0x02, - 0xc8, 0x08, 0x83, 0x04, 0x20, 0x00, 0x08, 0x00, - 0x02, 0x82, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0d, 0x6c, 0x00, 0xfb, 0x00, 0x2e, 0xc0, - 0x0c, 0x80, 0x03, 0x68, 0x04, 0xc8, 0x00, 0xa2, - 0x41, 0x0f, 0x80, 0x03, 0x2c, 0x00, 0xfb, 0x00, - 0xbe, 0x80, 0x0f, 0xb0, 0x02, 0xe8, 0x00, 0xfb, - 0x00, 0x3e, 0x40, 0x0c, 0xb0, 0x03, 0xe0, 0x01, - 0xd8, 0x04, 0x6e, 0x00, 0x0f, 0x80, 0x03, 0x2c, - 0x04, 0xfb, 0x05, 0x32, 0xed, 0x09, 0x00, 0xdc, - 0x00, 0xc0, 0x28, 0x80, 0x03, 0xe4, 0x00, 0xc8, - 0x00, 0x32, 0x00, 0x2c, 0x10, 0x0b, 0xa0, 0x01, - 0x10, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, - 0x00, 0xff, 0x00, 0x3d, 0x40, 0x0f, 0xc0, 0x03, - 0xdc, 0x00, 0xb4, 0x00, 0x3f, 0xc0, 0x0f, 0xd0, - 0x03, 0xb0, 0x08, 0xfe, 0x00, 0x3f, 0x80, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xfc, 0x00, 0x3f, 0x00, - 0x8f, 0xf0, 0x03, 0x70, 0x1c, 0xfc, 0x00, 0x37, - 0x00, 0x0f, 0xc0, 0x43, 0xbc, 0x00, 0xff, 0x02, - 0x3f, 0xc0, 0xab, 0xc0, 0x03, 0xb0, 0x00, 0xfc, - 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, 0x68, 0x05, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x09, 0xfc, - 0x80, 0xcf, 0x28, 0x3f, 0xc4, 0x0c, 0xf2, 0x03, - 0x30, 0x40, 0xdf, 0x00, 0x3d, 0x00, 0x0c, 0xf0, - 0x03, 0xf0, 0x48, 0xdf, 0x04, 0x37, 0x00, 0x8f, - 0xe0, 0x07, 0xb0, 0x00, 0xff, 0x18, 0x3f, 0xc1, - 0x0f, 0xc0, 0x03, 0xfc, 0x00, 0xfc, 0x40, 0x3f, - 0xc0, 0x1f, 0xf2, 0x13, 0x7c, 0xe4, 0xee, 0x00, - 0xb1, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0xa0, 0xcc, - 0x00, 0x3f, 0x00, 0x0f, 0xf0, 0x03, 0xf0, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xfd, - 0x02, 0x8f, 0x40, 0x2d, 0xdc, 0x08, 0xf5, 0x02, - 0x2c, 0x80, 0xbf, 0x50, 0x3a, 0xca, 0x08, 0xf1, - 0x02, 0xec, 0x84, 0xbf, 0x00, 0xa2, 0x10, 0x0b, - 0x82, 0xa2, 0xe0, 0x00, 0xbf, 0x40, 0x2e, 0xc0, - 0x0b, 0x80, 0x02, 0xec, 0x00, 0xb8, 0x20, 0x2a, - 0xc0, 0x0b, 0xf5, 0x02, 0x2d, 0x00, 0xb8, 0x40, - 0x23, 0xd0, 0x0b, 0xf4, 0x02, 0xe1, 0x00, 0xe9, - 0x00, 0x2e, 0x08, 0x0b, 0xb0, 0x03, 0xa0, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x45, 0xcd, - 0x08, 0xa3, 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x02, - 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xc8, 0x0a, 0xed, - 0x09, 0x00, 0xdd, 0x00, 0x30, 0x02, 0xcc, 0x80, - 0x93, 0x41, 0x28, 0x1a, 0x1b, 0x00, 0x10, 0xc0, - 0x00, 0xb3, 0x20, 0x2c, 0xc0, 0x0a, 0x00, 0x02, - 0xcc, 0x04, 0xb0, 0x42, 0x20, 0xc0, 0x0b, 0x30, - 0x02, 0x4c, 0x84, 0xa8, 0x14, 0x2c, 0xc4, 0x0b, - 0x34, 0x02, 0x40, 0x00, 0x80, 0x00, 0x2c, 0x02, - 0x0b, 0x30, 0x02, 0xe3, 0x01, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x15, 0xac, 0x00, 0x8b, 0x00, - 0x2e, 0xc0, 0x28, 0xb0, 0x38, 0xac, 0x00, 0xbb, - 0x04, 0x2c, 0x20, 0x08, 0xb0, 0x02, 0xe4, 0x20, - 0xbb, 0x04, 0x2a, 0x62, 0x0b, 0xb2, 0x82, 0xe2, - 0x00, 0xbb, 0x02, 0x2e, 0xd1, 0x0b, 0xb0, 0x02, - 0xe8, 0x21, 0xb8, 0x80, 0x6a, 0x82, 0x09, 0xb0, - 0x46, 0x6c, 0x00, 0xb9, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x06, 0xe2, 0x28, 0xb9, 0x10, 0x2e, 0x00, - 0x0b, 0xb0, 0x42, 0xb0, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x15, 0xec, 0x00, 0xcb, 0x01, - 0x3e, 0xc0, 0x0c, 0x30, 0x03, 0x2d, 0x60, 0xdb, - 0x00, 0x3e, 0xd0, 0x2c, 0xb0, 0x03, 0xed, 0x00, - 0xdb, 0x00, 0x3e, 0x30, 0x0f, 0x84, 0x03, 0xa5, - 0x20, 0xfb, 0x00, 0x3e, 0xe0, 0x0f, 0x81, 0x83, - 0xec, 0x00, 0xf8, 0xc0, 0x32, 0xe0, 0x0b, 0x30, - 0x03, 0x6c, 0x00, 0xea, 0x40, 0x3e, 0xc0, 0x0b, - 0xb0, 0x02, 0xe2, 0x08, 0xc8, 0x60, 0x3e, 0x00, - 0x07, 0xb0, 0x03, 0xd0, 0x05, 0x20, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x01, 0x9c, 0x00, 0xff, 0x00, - 0x3f, 0xc1, 0x03, 0xf0, 0xa3, 0x7c, 0x04, 0xff, - 0x00, 0x1b, 0xc0, 0x07, 0xf0, 0x03, 0xf9, 0x08, - 0x77, 0x00, 0x36, 0x40, 0x0f, 0xd8, 0x03, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xd0, 0x0f, 0xf0, 0x03, - 0xfc, 0x20, 0xfd, 0x00, 0x3b, 0xe4, 0x0f, 0xf0, - 0x03, 0xbc, 0x00, 0xfb, 0x00, 0x13, 0xc0, 0x07, - 0xf0, 0x03, 0xed, 0x09, 0x00, 0xde, 0x00, 0xd0, - 0x00, 0xef, 0x80, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xb8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x10, 0xac, 0x00, 0xfb, 0x00, 0xb2, 0xc0, 0x0c, - 0xb0, 0x43, 0x24, 0x00, 0xfb, 0x10, 0xb2, 0xc0, - 0x0c, 0xb0, 0x03, 0x6d, 0x00, 0xfb, 0x08, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xdb, 0x20, - 0x3e, 0x40, 0x05, 0x80, 0x83, 0xe4, 0x00, 0xf9, - 0x64, 0x3a, 0xc1, 0x07, 0xb1, 0x43, 0xec, 0x00, - 0xba, 0x20, 0x3a, 0xc8, 0x0c, 0xb2, 0x03, 0x21, - 0x00, 0xfa, 0xc8, 0xb2, 0xc0, 0x0f, 0xb0, 0x03, - 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xc8, - 0x05, 0x3c, 0x00, 0xbf, 0x82, 0x23, 0xc0, 0x08, - 0xfc, 0x80, 0x2c, 0x18, 0xbf, 0x00, 0x32, 0xc0, - 0x02, 0xf0, 0x02, 0xec, 0x08, 0xbf, 0x80, 0x1a, - 0x40, 0x08, 0x90, 0x02, 0xea, 0x14, 0xbf, 0x40, - 0x2e, 0x40, 0x0b, 0xb0, 0x02, 0xe8, 0x04, 0xb9, - 0x40, 0x3a, 0x80, 0x03, 0xfc, 0x02, 0xfc, 0x40, - 0xb3, 0x00, 0x0b, 0xe0, 0x08, 0xf4, 0x00, 0xe1, - 0x40, 0xbb, 0xc0, 0x22, 0xc0, 0x0b, 0xb0, 0x02, - 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x05, 0x4c, 0x00, 0x93, 0x00, 0x22, 0xc0, 0x18, - 0x3c, 0x00, 0xcc, 0x08, 0xb3, 0x80, 0x20, 0xc0, - 0x0b, 0x30, 0x02, 0x4c, 0x00, 0xb3, 0xc0, 0x0c, - 0x00, 0x09, 0x00, 0x00, 0xc8, 0x00, 0x33, 0x00, - 0x0c, 0xc1, 0x0b, 0x0d, 0x02, 0xcc, 0x00, 0xb8, - 0x00, 0x2c, 0xc4, 0x09, 0x3c, 0x82, 0xce, 0x49, - 0x92, 0x00, 0x28, 0xe4, 0x88, 0x39, 0x42, 0x00, - 0x00, 0xb1, 0x00, 0x24, 0x00, 0x0b, 0x30, 0x02, - 0x78, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x01, 0x1e, 0x00, 0xb3, 0x88, 0x21, 0xe0, 0x08, - 0x78, 0x0a, 0xd6, 0x00, 0xb7, 0x80, 0x23, 0xe0, - 0x03, 0x78, 0x02, 0xde, 0x00, 0xed, 0x09, 0x00, - 0xdf, 0x00, 0xb7, 0x88, 0x2d, 0xa0, 0x09, 0x48, - 0x02, 0xd2, 0x20, 0xb7, 0x90, 0x6d, 0xf0, 0x03, - 0x49, 0x02, 0xde, 0x00, 0xb5, 0x80, 0x29, 0x60, - 0x0b, 0x78, 0x12, 0xde, 0x00, 0x94, 0x80, 0x29, - 0xe4, 0x08, 0x38, 0x22, 0x92, 0x20, 0xb7, 0x80, - 0x25, 0x20, 0x4b, 0x78, 0x02, 0xc8, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x0c, 0x40, - 0xf3, 0x00, 0x30, 0xc0, 0x0c, 0x31, 0x02, 0xcc, - 0x00, 0xf3, 0x00, 0x30, 0xc0, 0x87, 0x31, 0x03, - 0x48, 0x00, 0xf3, 0x00, 0x1c, 0x44, 0x0f, 0x10, - 0x02, 0xcc, 0x00, 0xf3, 0x18, 0x3c, 0xcf, 0x0d, - 0x30, 0x03, 0xcc, 0x00, 0xf3, 0x70, 0x38, 0xc8, - 0x8f, 0x30, 0x03, 0xcc, 0xc0, 0xf1, 0x48, 0x38, - 0xc0, 0x0c, 0x30, 0x37, 0x00, 0x50, 0xb3, 0x24, - 0x34, 0x00, 0x0f, 0x30, 0x03, 0xd2, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xbc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x6f, 0x71, 0x00, 0x3c, - 0x44, 0xf7, 0x00, 0x7f, 0xc4, 0x0e, 0xf0, 0x43, - 0xfc, 0x40, 0xff, 0x00, 0x3b, 0xc4, 0x0e, 0xd0, - 0x03, 0x74, 0x40, 0xff, 0x50, 0x3f, 0xc4, 0x1d, - 0xf0, 0x07, 0xfc, 0x00, 0xff, 0x10, 0x3f, 0x40, - 0x5f, 0xf1, 0x03, 0xfc, 0x48, 0xfd, 0x00, 0x3f, - 0xc3, 0x1f, 0xf0, 0x07, 0xf8, 0x00, 0xf7, 0x00, - 0x3b, 0x04, 0x0f, 0xf1, 0x03, 0xd0, 0x06, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, 0xed, 0x40, - 0xfb, 0x00, 0x3e, 0xca, 0x0f, 0xb4, 0x03, 0xec, - 0x00, 0xfb, 0x48, 0x3e, 0x00, 0x0f, 0xb2, 0x43, - 0x64, 0x00, 0xcb, 0x08, 0x3e, 0xc0, 0x0d, 0xb0, - 0x07, 0xec, 0x00, 0xfb, 0x60, 0x32, 0x81, 0x0f, - 0xb0, 0x43, 0x2c, 0x00, 0xda, 0x00, 0x3e, 0xc0, - 0x0c, 0xb0, 0x87, 0x2c, 0x00, 0xdb, 0x00, 0x3e, - 0xf0, 0x4c, 0xbf, 0x43, 0x20, 0x00, 0xf9, 0x00, - 0xed, 0x09, 0x00, 0xe0, 0x00, 0x02, 0x00, 0x0c, - 0xb0, 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x11, 0x9c, 0xa0, 0xb7, 0x70, 0x2d, - 0xd8, 0x0b, 0x72, 0x82, 0xdc, 0x04, 0xb7, 0x02, - 0x0d, 0xc0, 0x0b, 0x76, 0x82, 0xdc, 0x00, 0x87, - 0x24, 0x2d, 0xc0, 0x0b, 0x50, 0x26, 0xdc, 0x00, - 0xb3, 0x01, 0x21, 0x80, 0x0b, 0x70, 0x03, 0x5c, - 0x00, 0xd7, 0x00, 0x6f, 0xc0, 0x0d, 0x70, 0x03, - 0x5d, 0x80, 0x97, 0x00, 0x2c, 0xca, 0x08, 0x70, - 0x8a, 0x14, 0x00, 0xb7, 0x00, 0x23, 0xc0, 0x08, - 0x70, 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x00, 0x9e, 0x80, 0xb7, 0x80, 0x2d, - 0xe8, 0x0b, 0x79, 0x46, 0xdf, 0x00, 0xb7, 0xb0, - 0x65, 0xe2, 0x0b, 0x78, 0x02, 0x5e, 0x00, 0xa7, - 0xb0, 0x2d, 0xe0, 0x09, 0x58, 0x12, 0x1e, 0x08, - 0xb7, 0xb0, 0x29, 0xe0, 0x01, 0x7c, 0x02, 0x16, - 0x20, 0xa7, 0x86, 0x29, 0xe2, 0x08, 0x39, 0x2a, - 0x9e, 0x88, 0xb7, 0x80, 0x29, 0xe0, 0x0b, 0x32, - 0x02, 0x56, 0x00, 0xb7, 0x80, 0x25, 0xe2, 0x08, - 0x78, 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x14, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x46, 0xe4, 0x00, 0xb3, 0x00, - 0x6e, 0x20, 0x0b, 0x30, 0x02, 0xc0, 0x40, 0xa3, - 0x00, 0x2e, 0xe0, 0x0b, 0xb0, 0x82, 0xcc, 0x00, - 0xb3, 0x00, 0x6a, 0xe8, 0x4b, 0x3c, 0x00, 0x4c, - 0x01, 0x93, 0x00, 0x4c, 0xc0, 0x09, 0x30, 0x02, - 0xcc, 0x10, 0xb3, 0x60, 0x2c, 0xc0, 0x2b, 0x30, - 0x00, 0x4d, 0x01, 0xb3, 0x81, 0x22, 0xc2, 0x08, - 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xe8, 0x15, 0xa8, 0x00, 0xfa, 0x00, 0x3e, - 0x80, 0x0f, 0xa0, 0x03, 0xf9, 0x00, 0xfa, 0x02, - 0x37, 0xb0, 0x0f, 0xa0, 0x02, 0x78, 0x02, 0xca, - 0x00, 0x3f, 0xa0, 0xed, 0x09, 0x00, 0xe1, 0x00, - 0x0d, 0xe4, 0x23, 0xf8, 0x00, 0xfa, 0x00, 0xbb, - 0x81, 0x0f, 0x68, 0x03, 0x3a, 0x00, 0xee, 0x40, - 0x3b, 0xa0, 0x0c, 0xa0, 0x03, 0xa8, 0x00, 0xbe, - 0x20, 0x3a, 0x80, 0x0b, 0xa0, 0x02, 0x79, 0x00, - 0xbe, 0x80, 0xb3, 0x80, 0x3c, 0xa0, 0x03, 0xfa, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, - 0xc0, 0x00, 0xf8, 0x00, 0x3c, 0x00, 0x4f, 0x80, - 0x03, 0xe2, 0x00, 0xf8, 0x00, 0x76, 0x02, 0x0f, - 0x80, 0x03, 0xe0, 0x20, 0xd0, 0x40, 0x3e, 0x24, - 0x0f, 0x80, 0x13, 0x63, 0x40, 0xf8, 0x00, 0x26, - 0x04, 0x0f, 0x80, 0x83, 0xe0, 0x10, 0xf8, 0x18, - 0x36, 0x10, 0x0d, 0x04, 0x07, 0x21, 0x10, 0xd8, - 0x40, 0x3e, 0x00, 0x0c, 0x84, 0x03, 0xa0, 0x20, - 0xf8, 0x10, 0x3e, 0x01, 0x9f, 0x80, 0x03, 0xd2, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, - 0xe4, 0x00, 0xc9, 0xc0, 0x3e, 0x40, 0x0e, 0x90, - 0x13, 0xe4, 0x08, 0xc9, 0xc0, 0x36, 0x40, 0x0d, - 0x10, 0x03, 0x64, 0x00, 0x29, 0x00, 0x3a, 0x40, - 0x8e, 0x90, 0x03, 0x66, 0x44, 0xf1, 0x00, 0x36, - 0x41, 0x0f, 0x90, 0x03, 0x85, 0x00, 0xc9, 0x82, - 0x3c, 0x40, 0xcc, 0x90, 0x03, 0x64, 0x00, 0xf9, - 0x90, 0x2e, 0x60, 0x0f, 0x99, 0x00, 0x64, 0x00, - 0xf9, 0x10, 0x36, 0x40, 0x0c, 0x90, 0x03, 0xc2, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, - 0x64, 0x02, 0x89, 0x00, 0x2e, 0x41, 0x08, 0x92, - 0x02, 0xe4, 0x02, 0x89, 0x00, 0x2e, 0x40, 0x08, - 0x90, 0x02, 0x04, 0x04, 0xa9, 0x10, 0x22, 0x40, - 0x28, 0x90, 0x02, 0x27, 0x00, 0xb9, 0x40, 0x22, - 0x60, 0x08, 0x90, 0x02, 0x26, 0x10, 0xa9, 0x90, - 0x2e, 0x52, 0x0a, 0x9c, 0x02, 0x24, 0x20, 0x39, - 0xa0, 0x2e, 0x54, 0x0b, 0x96, 0x02, 0x25, 0x28, - 0xb1, 0x48, 0x22, 0x40, 0x08, 0x90, 0xed, 0x09, - 0x00, 0xe2, 0x00, 0x02, 0xe0, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, 0x00, 0x89, - 0x00, 0x2e, 0x40, 0x08, 0x91, 0x02, 0xe4, 0x00, - 0x89, 0x00, 0x2e, 0xc0, 0x08, 0x90, 0x0a, 0x24, - 0x00, 0x89, 0x40, 0x62, 0x40, 0x08, 0x90, 0x02, - 0x25, 0x00, 0xb9, 0x08, 0xaa, 0x49, 0x09, 0x90, - 0x02, 0xa4, 0x00, 0x89, 0x08, 0x2e, 0x40, 0x09, - 0x91, 0x8a, 0xa4, 0x80, 0xa9, 0x00, 0x0e, 0x42, - 0x0b, 0x10, 0x42, 0xa4, 0x40, 0xb9, 0x00, 0x22, - 0x40, 0x08, 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x81, - 0x00, 0x2c, 0x50, 0x48, 0x10, 0x02, 0xc5, 0x00, - 0x81, 0x00, 0x2c, 0x50, 0x29, 0x10, 0x02, 0x25, - 0x00, 0xa1, 0x00, 0xa0, 0x50, 0x08, 0x14, 0x08, - 0x04, 0x00, 0x91, 0x40, 0x0c, 0xd0, 0x08, 0x90, - 0x02, 0x05, 0x00, 0xa1, 0x28, 0x2c, 0x50, 0x0b, - 0x10, 0x02, 0x05, 0x00, 0x91, 0x02, 0x2c, 0x40, - 0x83, 0x14, 0x02, 0x84, 0x00, 0xb9, 0x00, 0x20, - 0x50, 0x20, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xb8, 0x0c, 0x60, 0x00, 0xc8, - 0x00, 0x3e, 0x00, 0x0c, 0x80, 0x03, 0xe0, 0x00, - 0xc8, 0x00, 0x3e, 0x00, 0x0c, 0x80, 0x03, 0x00, - 0x00, 0xc8, 0x01, 0x3a, 0x00, 0x0e, 0x80, 0x03, - 0x20, 0x00, 0xf8, 0x00, 0x1e, 0x00, 0x0f, 0x80, - 0x23, 0x80, 0x00, 0x48, 0x20, 0x3e, 0x00, 0x0d, - 0x80, 0x03, 0xe0, 0x00, 0x78, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x13, 0xa0, 0x01, 0xf8, 0x00, 0xb2, - 0x00, 0x04, 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x1d, 0xe5, 0x00, 0xf9, - 0x40, 0x3e, 0x50, 0x6f, 0x94, 0x03, 0xf4, 0x00, - 0xf9, 0x41, 0x3f, 0x40, 0x0e, 0x94, 0x03, 0xfc, - 0x00, 0x79, 0x41, 0x3f, 0xd0, 0x0d, 0xf0, 0x03, - 0x34, 0xed, 0x09, 0x00, 0xe3, 0x00, 0x00, 0xf9, - 0x40, 0x13, 0x50, 0x0b, 0x50, 0x03, 0xf5, 0x08, - 0xfd, 0x2d, 0x0f, 0xd0, 0x0e, 0x94, 0x13, 0xe5, - 0x00, 0xff, 0x40, 0x3e, 0x50, 0x0f, 0x94, 0x03, - 0x35, 0x04, 0xf5, 0x00, 0x3b, 0x40, 0x8f, 0x90, - 0x03, 0xe6, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0xe4, 0x90, 0xbd, 0x00, 0x3e, 0x40, - 0x4c, 0xd0, 0x03, 0xe4, 0x00, 0xfd, 0x28, 0x3e, - 0x44, 0x0f, 0x90, 0x03, 0x24, 0x00, 0xcd, 0x00, - 0x32, 0x48, 0x0f, 0xb0, 0x03, 0x14, 0x00, 0xdd, - 0x10, 0x3b, 0x40, 0x0c, 0x50, 0x03, 0xb4, 0x80, - 0xfd, 0x01, 0x3b, 0x4c, 0x8d, 0xd0, 0x03, 0xf4, - 0x00, 0x95, 0x02, 0x3f, 0x49, 0x0f, 0xd2, 0x83, - 0x34, 0x00, 0xfd, 0x00, 0x1e, 0x40, 0x0f, 0x90, - 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x10, 0xe0, 0x40, 0x38, 0x40, 0x2e, 0x02, - 0x08, 0x81, 0x02, 0x40, 0xa0, 0xb8, 0x00, 0x0e, - 0x08, 0x09, 0x84, 0x07, 0x20, 0x30, 0x88, 0x10, - 0x36, 0x0e, 0x4b, 0x82, 0x0a, 0xa0, 0x00, 0xa8, - 0x40, 0x2e, 0x82, 0x0d, 0x80, 0x03, 0x68, 0xb0, - 0xba, 0x48, 0x2e, 0x0c, 0x1b, 0x84, 0x02, 0x60, - 0xa8, 0x88, 0x10, 0x2e, 0x00, 0x0b, 0x82, 0x13, - 0xa8, 0x00, 0xb8, 0x00, 0x2e, 0x82, 0x09, 0x80, - 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x05, 0xc4, 0x00, 0xb1, 0x10, 0x2c, 0x44, - 0x0a, 0x10, 0x02, 0xc4, 0x80, 0xb1, 0x02, 0x08, - 0x48, 0x0b, 0x11, 0x02, 0x04, 0x02, 0x81, 0x00, - 0x24, 0x48, 0x0b, 0x92, 0xa2, 0x64, 0x00, 0x81, - 0x10, 0x28, 0x44, 0x09, 0x10, 0x02, 0x44, 0xc0, - 0xb1, 0x32, 0x28, 0x48, 0x0b, 0x11, 0x06, 0xc4, - 0xc0, 0x91, 0x00, 0x28, 0x45, 0x0b, 0x12, 0x82, - 0xc4, 0x41, 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, - 0x02, 0xc2, 0x01, 0x60, 0xed, 0x09, 0x00, 0xe4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, - 0x00, 0xb9, 0x00, 0x0e, 0x40, 0x2a, 0x90, 0x02, - 0x64, 0x00, 0xb9, 0x01, 0x26, 0x54, 0x0b, 0x90, - 0x0a, 0xa4, 0x40, 0x89, 0x00, 0x26, 0x40, 0x03, - 0x92, 0x22, 0xe4, 0x00, 0xa9, 0x00, 0x26, 0x41, - 0x8b, 0x90, 0x02, 0x64, 0x05, 0xb9, 0x10, 0x2e, - 0x41, 0x0b, 0x90, 0x02, 0x6c, 0x00, 0x89, 0x00, - 0x4e, 0x40, 0x0b, 0x90, 0x12, 0xa6, 0x00, 0xb9, - 0x00, 0x2e, 0x44, 0x09, 0x90, 0x02, 0xc6, 0x05, - 0x20, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0e, 0x90, 0x03, - 0xe4, 0x20, 0xf9, 0x04, 0x3e, 0x40, 0x8f, 0x90, - 0x43, 0x25, 0x00, 0xc1, 0x00, 0x36, 0x40, 0x0f, - 0x14, 0x03, 0x65, 0x84, 0xd9, 0x00, 0x3a, 0x54, - 0x0c, 0x9d, 0x83, 0x66, 0x00, 0xf9, 0x44, 0x3a, - 0x50, 0x49, 0x90, 0x23, 0xe4, 0x10, 0xd9, 0x04, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0x66, 0x04, 0xf9, - 0x84, 0x3e, 0x50, 0x0f, 0x90, 0x23, 0xe8, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0x24, - 0x00, 0xf9, 0x04, 0x3c, 0x40, 0x0d, 0x90, 0x83, - 0x66, 0x80, 0xf9, 0x00, 0x1e, 0x60, 0x0d, 0x90, - 0x03, 0x64, 0x00, 0xf9, 0x00, 0x1e, 0x40, 0x1f, - 0x90, 0x03, 0x24, 0x00, 0xf9, 0x00, 0x2c, 0x40, - 0x0d, 0x90, 0x83, 0x65, 0x00, 0xf9, 0x80, 0x36, - 0x40, 0x0b, 0x90, 0x03, 0xc4, 0x08, 0xb9, 0x91, - 0x3e, 0x41, 0x0f, 0x90, 0x83, 0xe4, 0x00, 0xb9, - 0x40, 0x3e, 0x40, 0x0d, 0x90, 0x13, 0xca, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0xa0, - 0x00, 0xf8, 0x00, 0x32, 0x00, 0x0f, 0x81, 0x03, - 0xe1, 0x00, 0xc8, 0x00, 0x32, 0x00, 0x8f, 0x00, - 0x03, 0xe1, 0x00, 0xf8, 0x20, 0x3e, 0x00, 0x0f, - 0x80, 0x01, 0xe1, 0x20, 0xd8, 0x34, 0x3e, 0xed, - 0x09, 0x00, 0xe5, 0x00, 0x1c, 0x07, 0x81, 0x43, - 0xa1, 0x00, 0xc8, 0x20, 0x36, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x00, 0xc8, 0x60, 0x3e, 0x00, 0x4f, - 0x80, 0x0b, 0x21, 0x28, 0xf8, 0x18, 0x3e, 0x10, - 0x8e, 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x05, 0x28, 0x00, 0xba, 0x00, - 0x22, 0x80, 0x01, 0xe8, 0x02, 0xe8, 0x00, 0x8a, - 0x00, 0x22, 0x80, 0x09, 0xa0, 0x03, 0xa8, 0x00, - 0xbe, 0x00, 0x2e, 0x80, 0x0b, 0xa0, 0x42, 0x5a, - 0x00, 0xbe, 0x40, 0x2f, 0xa0, 0x09, 0x60, 0x02, - 0x38, 0x85, 0xae, 0x80, 0x27, 0xb8, 0x4b, 0xec, - 0x03, 0xbb, 0x80, 0xae, 0xc0, 0x0b, 0xa0, 0x06, - 0xe8, 0x02, 0x38, 0x00, 0xbe, 0x40, 0x2e, 0x81, - 0x08, 0xa0, 0x02, 0xca, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x04, 0x0c, 0x00, 0xb1, 0x81, - 0x28, 0xc0, 0x03, 0x0c, 0x02, 0xcc, 0x00, 0x81, - 0x80, 0x0c, 0xc0, 0x0b, 0x30, 0x02, 0xac, 0x00, - 0xb0, 0x80, 0x24, 0xc0, 0x0b, 0x30, 0x02, 0x0d, - 0x00, 0x83, 0x80, 0x2c, 0xf0, 0x0b, 0x38, 0x00, - 0xcf, 0x80, 0x93, 0x40, 0x20, 0xe8, 0x09, 0x3e, - 0x02, 0x8e, 0x80, 0x83, 0x00, 0x28, 0xe8, 0x0b, - 0xbd, 0x02, 0x4f, 0x40, 0xb3, 0x40, 0x2c, 0xc0, - 0x0a, 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x01, 0x1c, 0x00, 0xb3, 0xc0, - 0x29, 0xc0, 0x09, 0x70, 0x02, 0xde, 0x00, 0x97, - 0xc0, 0x29, 0xc0, 0x0b, 0x70, 0x06, 0x9c, 0x40, - 0xb7, 0x08, 0x2d, 0xc9, 0x0b, 0x70, 0x02, 0xfc, - 0x20, 0xa7, 0x04, 0x0d, 0xc0, 0x09, 0xf0, 0x12, - 0x5e, 0x00, 0xb7, 0x08, 0x2d, 0xc0, 0x0b, 0x54, - 0x02, 0x80, 0x00, 0xa7, 0xc4, 0x21, 0xc2, 0x8a, - 0x00, 0x02, 0x5c, 0x00, 0x37, 0x00, 0x2d, 0xe0, - 0x08, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0xe6, 0x00, 0xa8, - 0x08, 0x1e, 0x00, 0xf7, 0x80, 0xa9, 0xea, 0x0f, - 0x78, 0x03, 0xdf, 0x42, 0xc3, 0x80, 0xbd, 0xe0, - 0x0f, 0x78, 0x03, 0x9e, 0x00, 0xf7, 0x80, 0x3d, - 0xe4, 0x0f, 0x78, 0x03, 0xde, 0x00, 0xd7, 0x80, - 0x2d, 0xe0, 0x0f, 0x78, 0x03, 0xfe, 0x04, 0x97, - 0x80, 0x35, 0xa0, 0x0f, 0x58, 0x03, 0x92, 0x00, - 0xc7, 0x80, 0x39, 0xe0, 0x0f, 0x78, 0x02, 0x5e, - 0x04, 0xf7, 0x82, 0x2f, 0xf0, 0x0e, 0x78, 0x03, - 0xe2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x1d, 0xac, 0x00, 0xbb, 0x01, 0x36, 0xcc, 0x0d, - 0xb0, 0x03, 0xed, 0x80, 0xeb, 0x00, 0x36, 0xd4, - 0x0d, 0xb0, 0x03, 0xac, 0x00, 0xf9, 0x00, 0x3e, - 0xd8, 0x0b, 0xb1, 0x03, 0x6c, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x8d, 0xb0, 0x13, 0xac, 0x04, 0xeb, - 0x04, 0x36, 0x80, 0x4f, 0x80, 0x27, 0xa0, 0x10, - 0xfa, 0x00, 0x3a, 0xc0, 0x0f, 0xa0, 0x52, 0xa8, - 0x00, 0xf8, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xc2, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0xfe, 0x00, 0xf7, 0x80, 0x3b, 0xe4, 0x0f, - 0xf8, 0x03, 0x3e, 0x00, 0xff, 0x80, 0x3d, 0xf4, - 0x0c, 0xf3, 0x03, 0xff, 0x00, 0xff, 0x82, 0x1b, - 0xe2, 0x0f, 0xfc, 0x03, 0x3c, 0x80, 0xcf, 0x80, - 0xb3, 0xe0, 0x0f, 0xe8, 0x07, 0xfe, 0x00, 0xff, - 0x94, 0x33, 0xe4, 0x1c, 0x59, 0x02, 0x32, 0x80, - 0xd7, 0x80, 0x33, 0xe1, 0x0c, 0xf8, 0x13, 0x3e, - 0x40, 0xff, 0x81, 0x3d, 0xe0, 0x04, 0xf9, 0x03, - 0xc0, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x01, 0x9c, 0x00, 0xb7, 0x04, 0x21, 0xc0, 0x0b, - 0x60, 0x02, 0x1c, 0x10, 0xb7, 0x00, 0x2d, 0xc0, - 0x18, 0x71, 0x07, 0x9c, 0x00, 0xb7, 0x00, 0x2d, - 0xc4, 0x0d, 0x70, 0x03, 0x5c, 0x00, 0xdd, 0x10, - 0x21, 0xc1, 0x0b, 0x52, 0x23, 0xed, 0x09, 0x00, - 0xe7, 0x00, 0x9c, 0x80, 0xb7, 0x00, 0x25, 0xd0, - 0x0a, 0x70, 0x03, 0x50, 0x00, 0xb7, 0x00, 0xa9, - 0x80, 0x48, 0x50, 0x02, 0x95, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x08, 0x70, 0x03, 0xaa, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, - 0xb5, 0x00, 0x29, 0xc0, 0x1b, 0x10, 0x02, 0x9c, - 0x00, 0xb5, 0x10, 0x2f, 0xc0, 0x48, 0x70, 0x06, - 0x9c, 0x20, 0xb6, 0x10, 0x29, 0xc0, 0x0b, 0x70, - 0x02, 0x58, 0x00, 0xa6, 0x00, 0x21, 0xc0, 0x0b, - 0x60, 0x06, 0xdc, 0x00, 0xb4, 0x01, 0x24, 0xc0, - 0x1a, 0x50, 0x02, 0x90, 0x80, 0x95, 0x10, 0x21, - 0x40, 0x0a, 0x01, 0x02, 0x9c, 0x21, 0xb7, 0x08, - 0x2f, 0xc0, 0x0a, 0x70, 0x42, 0xc0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, 0xcc, 0x00, - 0xb3, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0x0d, - 0x00, 0xb3, 0x00, 0x2c, 0xc2, 0x11, 0x30, 0x22, - 0x8e, 0x00, 0xb3, 0x00, 0x2c, 0xc8, 0x09, 0x30, - 0x02, 0x88, 0x00, 0x90, 0x01, 0x28, 0xc0, 0x0b, - 0x1c, 0x10, 0x8e, 0x00, 0xb0, 0x40, 0x24, 0xf2, - 0x4a, 0x00, 0x26, 0xe0, 0x00, 0xb0, 0x70, 0x28, - 0x00, 0x0a, 0x00, 0x22, 0x03, 0x00, 0xb0, 0x00, - 0x0c, 0xf0, 0x02, 0x30, 0x02, 0x80, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, 0xac, 0x08, - 0xfb, 0x00, 0x3b, 0xc0, 0x0f, 0xb0, 0x03, 0x1d, - 0x20, 0xfb, 0x00, 0x2f, 0xf0, 0x0c, 0xb0, 0x03, - 0x9e, 0x00, 0xf3, 0x01, 0x3b, 0xd2, 0x0f, 0x7e, - 0x03, 0x0e, 0x20, 0xe9, 0x04, 0x32, 0xc0, 0x07, - 0x96, 0x03, 0xe2, 0x00, 0xf9, 0x50, 0xb2, 0x40, - 0x04, 0x90, 0x02, 0xa0, 0x00, 0xdb, 0x40, 0x30, - 0xc1, 0x2e, 0xb0, 0x1a, 0xae, 0x00, 0xbb, 0x11, - 0x2f, 0xd0, 0x0a, 0xb0, 0x03, 0xe2, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0x00, - 0xed, 0x09, 0x00, 0xe8, 0x00, 0x79, 0x00, 0x3e, - 0xc0, 0x0f, 0x94, 0x03, 0xec, 0x30, 0xf9, 0x00, - 0x7e, 0xc4, 0x0e, 0xb0, 0x03, 0xac, 0x20, 0xba, - 0x40, 0x2e, 0xc0, 0x06, 0xb0, 0x42, 0x6d, 0x00, - 0xe8, 0x00, 0x34, 0xd0, 0x0f, 0xa0, 0xa3, 0x84, - 0x60, 0xf8, 0x00, 0x3a, 0xd4, 0x0f, 0x90, 0x01, - 0x61, 0x00, 0xb9, 0x02, 0x36, 0x40, 0x05, 0xb4, - 0x22, 0xed, 0x80, 0xfb, 0x00, 0x3e, 0xc6, 0x2d, - 0xb0, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x10, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x03, 0x6c, 0x07, 0xbc, 0x00, 0xb7, 0x20, - 0x77, 0xc0, 0x03, 0xf0, 0x03, 0xfc, 0x00, 0xcf, - 0x44, 0x33, 0xc1, 0x0c, 0xf0, 0x83, 0xbc, 0x00, - 0xcd, 0x00, 0x3f, 0xc0, 0x0a, 0xd8, 0x03, 0xf8, - 0x44, 0x89, 0x00, 0x3f, 0x40, 0x0c, 0xfa, 0x13, - 0xf0, 0x00, 0xcf, 0x94, 0x2e, 0xb0, 0x0c, 0x68, - 0x02, 0x36, 0x10, 0xcf, 0x14, 0x3f, 0xc0, 0x0a, - 0xf0, 0x03, 0xc0, 0x40, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x81, 0x04, 0x6c, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x00, 0x2c, 0x00, 0x8b, 0x81, - 0xa2, 0xc0, 0x1b, 0xb0, 0x02, 0xec, 0x00, 0xab, - 0xc8, 0x3e, 0xc0, 0x8a, 0xb0, 0x22, 0x2f, 0xc9, - 0xd8, 0xc8, 0x2e, 0xf0, 0x0a, 0xa8, 0x82, 0x6c, - 0x80, 0xa8, 0xc0, 0x2e, 0xc0, 0x0f, 0x82, 0x02, - 0xe3, 0x00, 0xf8, 0x00, 0x2e, 0x00, 0x08, 0xaf, - 0x01, 0x83, 0x04, 0x88, 0x80, 0x2c, 0xc0, 0x68, - 0xb0, 0x02, 0xe8, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x05, 0x2c, 0x00, 0xbb, 0x20, 0x2e, - 0xc0, 0x0b, 0xb4, 0x00, 0x2c, 0x00, 0x9b, 0x01, - 0x2a, 0xc0, 0x4b, 0xb0, 0x42, 0x6c, 0x00, 0x89, - 0x00, 0x20, 0xc0, 0x0a, 0xb0, 0x02, 0xac, 0x02, - 0xb9, 0x80, 0x2e, 0xe2, 0x08, 0x81, 0x02, 0xec, - 0x00, 0x29, 0xc0, 0xed, 0x09, 0x00, 0xe9, 0x00, - 0x2c, 0xc4, 0x08, 0x80, 0x02, 0xe2, 0x01, 0x8a, - 0x04, 0x2e, 0xc3, 0x00, 0x90, 0x02, 0x28, 0x80, - 0x88, 0x05, 0x2e, 0xc0, 0x48, 0xb0, 0x02, 0xe0, - 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x0c, 0x00, 0x93, 0x00, 0x2c, 0xc0, 0x1b, 0x30, - 0x42, 0x2c, 0x00, 0x83, 0x00, 0x20, 0xc0, 0x0b, - 0x30, 0x02, 0xec, 0x10, 0xa3, 0x00, 0x6c, 0xc0, - 0x4a, 0xb0, 0x02, 0x0c, 0x00, 0x80, 0x00, 0x2c, - 0xc0, 0x0a, 0x00, 0x02, 0x4c, 0x08, 0xa0, 0x00, - 0x6c, 0xc0, 0x0b, 0x00, 0x02, 0xc0, 0x00, 0x90, - 0x80, 0x2c, 0x00, 0x08, 0x10, 0x02, 0x00, 0x02, - 0x80, 0x82, 0x2e, 0xc0, 0x42, 0x30, 0x02, 0xca, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x2c, 0x00, 0xfb, 0x00, 0x3f, 0xc0, 0x0f, 0xb0, - 0x42, 0xbc, 0x00, 0xdb, 0x01, 0x7f, 0xc0, 0x0b, - 0xb0, 0x03, 0x7c, 0x00, 0xcb, 0x00, 0x33, 0xc0, - 0x0c, 0x70, 0x07, 0xac, 0x00, 0x98, 0x00, 0x3e, - 0xc0, 0x0a, 0x80, 0x03, 0xec, 0x00, 0xe8, 0x02, - 0x2e, 0xc0, 0x0c, 0x80, 0x03, 0xe0, 0x00, 0xc8, - 0x00, 0x3e, 0x00, 0x4c, 0x80, 0x0b, 0x20, 0x01, - 0xc8, 0x02, 0x3e, 0xc0, 0x86, 0xb0, 0x03, 0xc0, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, - 0xfc, 0x00, 0xfd, 0x00, 0x3f, 0xc1, 0x0f, 0xc0, - 0x03, 0xfc, 0x00, 0xdd, 0x00, 0x3b, 0xc0, 0x1f, - 0xf0, 0x06, 0xfc, 0x00, 0xfc, 0x04, 0x0b, 0xc0, - 0x0d, 0xf0, 0x03, 0xd4, 0x00, 0xfc, 0x00, 0x3f, - 0x01, 0x0f, 0xc0, 0x03, 0x7c, 0x00, 0xfc, 0x04, - 0x3f, 0xc0, 0x86, 0xe0, 0x23, 0xf0, 0x00, 0xfc, - 0x00, 0x3f, 0x00, 0x4f, 0xc0, 0x07, 0xb0, 0x00, - 0xec, 0x00, 0x7f, 0xc0, 0x1d, 0xf0, 0x03, 0xe8, - 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, - 0xfc, 0x00, 0xff, 0x00, 0x33, 0x80, 0xed, 0x09, - 0x00, 0xea, 0x00, 0x0f, 0xf0, 0x03, 0xf4, 0x00, - 0xef, 0x00, 0x3d, 0x00, 0x0d, 0xe0, 0x43, 0x70, - 0x04, 0x3c, 0x24, 0x3d, 0x80, 0x0e, 0x70, 0x0b, - 0x30, 0x10, 0xe4, 0x00, 0x3b, 0x00, 0x0f, 0xe0, - 0x03, 0xf0, 0x00, 0xed, 0x00, 0x3f, 0x00, 0x0c, - 0xc3, 0x03, 0xfc, 0x00, 0xc4, 0x06, 0x33, 0x08, - 0x0c, 0xc0, 0x03, 0x10, 0x60, 0xdc, 0x30, 0x37, - 0x1a, 0x0d, 0xc3, 0x83, 0xf0, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x10, 0xec, 0x00, 0x3b, - 0x00, 0x22, 0x40, 0x0b, 0xb0, 0x22, 0xe4, 0x10, - 0x8b, 0x04, 0x2e, 0x10, 0x0f, 0x90, 0x02, 0xe8, - 0x10, 0x9a, 0x40, 0x2e, 0x80, 0x0a, 0xa0, 0x02, - 0x28, 0x10, 0x89, 0x00, 0x22, 0x41, 0x8b, 0xa0, - 0x12, 0xe0, 0x00, 0x89, 0x00, 0x2e, 0x5f, 0x08, - 0x86, 0x02, 0xec, 0x42, 0x88, 0x00, 0x22, 0x56, - 0x08, 0x80, 0x02, 0x24, 0x80, 0xda, 0x52, 0x22, - 0x10, 0x08, 0x06, 0x22, 0xe0, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, 0x00, 0xb3, - 0x00, 0x20, 0x80, 0x0b, 0x30, 0x02, 0xcc, 0x02, - 0xa3, 0x00, 0x6c, 0x10, 0x18, 0x20, 0x22, 0x84, - 0x00, 0x90, 0x10, 0x2e, 0x40, 0x1a, 0xb0, 0x02, - 0x20, 0x00, 0xab, 0x00, 0xa8, 0x80, 0x0b, 0x20, - 0x02, 0xc0, 0x00, 0xa1, 0x00, 0x24, 0x40, 0x08, - 0x01, 0x12, 0xcc, 0x00, 0x0b, 0x00, 0x20, 0x00, - 0x69, 0x00, 0x42, 0x00, 0x00, 0x91, 0x02, 0x24, - 0x08, 0x28, 0x02, 0x02, 0xe2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x15, 0xac, 0x00, 0xbb, - 0x00, 0x22, 0x40, 0x0b, 0xb0, 0x02, 0xee, 0x14, - 0x8b, 0x00, 0x2e, 0x00, 0x2b, 0xa0, 0xc2, 0xec, - 0x00, 0x9a, 0x8a, 0x2e, 0x40, 0x12, 0xa1, 0x00, - 0x28, 0x48, 0x8b, 0x08, 0x22, 0xd1, 0x0b, 0xa8, - 0x00, 0xe4, 0x00, 0x29, 0x00, 0x2e, 0x60, 0x08, - 0x88, 0xed, 0x09, 0x00, 0xeb, 0x00, 0x02, 0xec, - 0x00, 0x2a, 0x06, 0xa2, 0x44, 0x09, 0x8c, 0x02, - 0x28, 0x12, 0x9a, 0x00, 0x22, 0x44, 0x0a, 0xb2, - 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x15, 0xec, 0x00, 0xf3, 0x00, 0x32, 0x86, - 0x0f, 0xb0, 0x03, 0xcf, 0x80, 0xeb, 0x01, 0x7e, - 0x82, 0x0d, 0xa4, 0x03, 0xae, 0x00, 0xda, 0x80, - 0x3e, 0x72, 0x0e, 0x3e, 0x01, 0x2a, 0x80, 0xeb, - 0x00, 0x3a, 0xf0, 0x0f, 0xa2, 0x01, 0xc2, 0x60, - 0x69, 0x80, 0x36, 0x38, 0x2c, 0x9c, 0x80, 0xe4, - 0x00, 0xc0, 0x40, 0x72, 0xa0, 0x0d, 0x88, 0x09, - 0x20, 0x80, 0xd8, 0x00, 0x36, 0x20, 0x0d, 0x82, - 0x13, 0xd0, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x01, 0xbc, 0x00, 0xff, 0x00, 0xbe, 0x60, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x40, 0x1f, - 0xa8, 0x0b, 0xf0, 0x43, 0xfc, 0x80, 0xde, 0x00, - 0x3f, 0x48, 0x0f, 0xf0, 0x2b, 0xfe, 0x00, 0xff, - 0x20, 0x3f, 0xd0, 0x0f, 0xe0, 0x13, 0xf2, 0x0c, - 0xdd, 0x90, 0x3e, 0x40, 0x0f, 0xd0, 0x03, 0xdc, - 0x00, 0xdc, 0x98, 0x3d, 0x80, 0x0e, 0x40, 0x43, - 0xd6, 0x40, 0xe9, 0x20, 0x3f, 0x80, 0x8d, 0xf8, - 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x10, 0xac, 0x00, 0xdb, 0x00, 0x3e, 0x9c, - 0x0e, 0xb0, 0x03, 0xec, 0x20, 0xca, 0x00, 0x32, - 0x90, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xea, 0x01, - 0x32, 0x60, 0x0c, 0xb6, 0x03, 0x6c, 0x04, 0xfb, - 0x04, 0x3a, 0xd0, 0x0c, 0x85, 0x03, 0xa7, 0x00, - 0xf9, 0x40, 0x3e, 0x40, 0x0c, 0x96, 0x03, 0x24, - 0xc0, 0xfa, 0x40, 0x32, 0x49, 0x0d, 0x87, 0x03, - 0x20, 0x10, 0x49, 0x16, 0x32, 0xc9, 0x0d, 0x81, - 0x03, 0x90, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xc8, 0x05, 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0x41, - 0x08, 0xb0, 0x02, 0xec, 0xed, 0x09, 0x00, 0xec, - 0x00, 0x08, 0x8b, 0x81, 0x30, 0xc0, 0x09, 0xbe, - 0x02, 0x6c, 0x00, 0xaa, 0x20, 0x34, 0xd0, 0x8d, - 0xbc, 0x83, 0x0c, 0x08, 0xb3, 0xd0, 0x22, 0xe0, - 0x08, 0xa0, 0x02, 0xe5, 0x10, 0x9b, 0xc1, 0x2e, - 0x54, 0x0a, 0x90, 0x02, 0xad, 0x10, 0x3a, 0x00, - 0x22, 0x70, 0x08, 0x80, 0x02, 0x28, 0x00, 0xd9, - 0x50, 0x22, 0xd0, 0x08, 0xb9, 0x02, 0x32, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4c, - 0x00, 0xb3, 0x00, 0x2c, 0x60, 0x0a, 0x30, 0x02, - 0xc7, 0x40, 0x93, 0x20, 0xa4, 0x41, 0x18, 0x2a, - 0x22, 0x48, 0x81, 0xa1, 0x00, 0x20, 0xd2, 0x0b, - 0x2c, 0x02, 0x4c, 0x00, 0xb3, 0x44, 0x28, 0xe0, - 0x18, 0x28, 0x02, 0x81, 0x80, 0xb1, 0xf0, 0x2e, - 0x00, 0x08, 0x10, 0x42, 0xcf, 0x00, 0xb0, 0xc0, - 0x20, 0x10, 0x49, 0x0c, 0x0a, 0x88, 0x00, 0x88, - 0x00, 0x22, 0x24, 0x88, 0x08, 0x02, 0xb8, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x1e, - 0x00, 0xb7, 0x88, 0x2d, 0xe0, 0x08, 0x78, 0x02, - 0xd2, 0x00, 0x9f, 0x8c, 0x21, 0xe0, 0x28, 0x41, - 0x02, 0x7a, 0x00, 0xa7, 0x80, 0x25, 0xe0, 0x0b, - 0x78, 0x02, 0x9e, 0x60, 0xb7, 0x0c, 0x2b, 0xe8, - 0x08, 0x6c, 0x42, 0xd2, 0x04, 0x95, 0x80, 0x2d, - 0x20, 0x02, 0x78, 0x40, 0x9e, 0x00, 0xb4, 0x88, - 0xe1, 0x60, 0x08, 0x49, 0x02, 0x96, 0x04, 0x96, - 0x91, 0x20, 0xe0, 0x28, 0x48, 0x02, 0x08, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x0c, - 0x00, 0xf3, 0x00, 0x3c, 0x41, 0x0e, 0x31, 0x02, - 0xc4, 0x80, 0x93, 0x20, 0x24, 0x40, 0x1f, 0x31, - 0x03, 0x4c, 0x00, 0xe2, 0x10, 0x30, 0xc0, 0x07, - 0x20, 0x03, 0x44, 0x40, 0xf3, 0x11, 0x38, 0xc2, - 0x24, 0x20, 0x03, 0x8c, 0x00, 0xf1, 0x60, 0x3c, - 0xc2, 0x08, 0x80, 0x81, 0xcc, 0x00, 0xf3, 0xed, - 0x09, 0x00, 0xed, 0x00, 0x10, 0x32, 0x82, 0x0d, - 0x00, 0x03, 0x8c, 0x00, 0xc1, 0x00, 0x30, 0x90, - 0x0c, 0x30, 0x03, 0x92, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x00, 0xd4, 0x00, 0xe7, - 0x02, 0x07, 0xc0, 0x8f, 0xf0, 0x03, 0xdc, 0x00, - 0xd6, 0x00, 0x3f, 0xc0, 0x0d, 0xd0, 0x03, 0x7c, - 0x40, 0xff, 0x10, 0x35, 0xc9, 0x0f, 0xe0, 0x03, - 0xf4, 0x00, 0xfd, 0x00, 0x3f, 0x80, 0x4f, 0xf0, - 0x03, 0xfc, 0x00, 0xfe, 0x00, 0x3f, 0xc0, 0x8f, - 0x60, 0x03, 0x7c, 0x00, 0xfe, 0x04, 0x3f, 0xc0, - 0xce, 0xf0, 0x03, 0xd0, 0x02, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x05, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0x40, 0x09, 0xb0, 0x43, 0xec, 0x00, 0xeb, - 0x04, 0x2e, 0xc0, 0x4a, 0xa8, 0x13, 0xac, 0x00, - 0xfb, 0x00, 0x1e, 0xc0, 0x0f, 0xb0, 0x03, 0xce, - 0x00, 0xeb, 0x00, 0x12, 0xe0, 0x6c, 0xb0, 0x03, - 0xe8, 0x04, 0xfa, 0x02, 0x3e, 0x80, 0x0f, 0xb0, - 0x13, 0x26, 0x00, 0xe8, 0x00, 0x3e, 0x80, 0x0f, - 0xa0, 0x03, 0x2a, 0x08, 0x1a, 0x00, 0x36, 0x40, - 0x0f, 0xb0, 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x01, 0x9c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x04, 0x87, - 0x00, 0x2c, 0xc0, 0x2d, 0x60, 0x03, 0x1c, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0x87, 0x00, 0x21, 0xc0, 0x08, 0x70, 0x02, - 0xd8, 0x00, 0xb6, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0x1c, 0x00, 0x84, 0x00, 0x2d, 0x80, 0x0b, - 0x70, 0x12, 0xb4, 0x00, 0x87, 0x01, 0x21, 0xc0, - 0x0b, 0x70, 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x00, 0x9e, 0x00, 0xb7, 0x82, - 0x6d, 0x60, 0x09, 0x78, 0x42, 0xce, 0x00, 0xa7, - 0x88, 0x2d, 0xed, 0x09, 0x00, 0xee, 0x00, 0xe2, - 0x0a, 0xf8, 0x02, 0xde, 0x00, 0xb6, 0x81, 0x2d, - 0xe2, 0x1b, 0x7c, 0x02, 0xfe, 0x00, 0xa3, 0x80, - 0x27, 0xe2, 0x09, 0x78, 0x22, 0xde, 0x00, 0xb6, - 0xc0, 0x2d, 0xe0, 0x0b, 0x28, 0x22, 0x06, 0x20, - 0xa5, 0x80, 0x2d, 0xf0, 0x0b, 0x28, 0x42, 0x1c, - 0x00, 0x93, 0x81, 0x25, 0xe0, 0x0b, 0x78, 0x02, - 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x14, 0xcc, 0x00, 0xb3, 0x00, 0x6c, 0xc0, 0x0b, - 0x30, 0x42, 0xcd, 0x48, 0x80, 0x4a, 0x0e, 0xe8, - 0x29, 0x3c, 0x02, 0x0c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x40, 0x83, 0x80, - 0x24, 0xe0, 0x09, 0x30, 0x02, 0xcc, 0x00, 0xb2, - 0x80, 0x2c, 0xc4, 0x0b, 0x38, 0x0a, 0x0e, 0x10, - 0x82, 0x80, 0x2c, 0xc2, 0x0b, 0x30, 0x02, 0x8c, - 0x00, 0x83, 0x04, 0x20, 0xd8, 0x0b, 0xb0, 0x02, - 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, - 0x15, 0xa8, 0x00, 0xfa, 0x00, 0x3f, 0x80, 0x09, - 0xa0, 0x03, 0xfb, 0x00, 0xee, 0x45, 0x3f, 0xb0, - 0x0a, 0xe4, 0x03, 0xf9, 0x20, 0xfe, 0xc4, 0x3f, - 0xb0, 0x0f, 0x64, 0x02, 0xf9, 0x00, 0xe6, 0xc0, - 0x37, 0x90, 0x0d, 0xee, 0x03, 0xfb, 0x80, 0xfe, - 0x40, 0x3f, 0x90, 0x0f, 0xe1, 0x83, 0x2a, 0x10, - 0xee, 0x70, 0x7f, 0xb0, 0x8b, 0xe0, 0x83, 0x38, - 0x00, 0xde, 0x00, 0x37, 0xb8, 0x0f, 0xed, 0xa3, - 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x00, 0xe0, 0x00, 0xf8, 0x04, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x24, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x81, 0x4b, 0xa2, 0x00, 0xf8, 0x1c, 0x3e, - 0x20, 0x0f, 0x8c, 0x12, 0xe2, 0x00, 0xf8, 0x18, - 0x3a, 0x30, 0x2e, 0x88, 0x03, 0xe2, 0x00, 0xf8, - 0x84, 0x3e, 0x12, 0x0f, 0x80, 0x03, 0xe1, 0x00, - 0xf8, 0x00, 0x3e, 0x10, 0x0f, 0xed, 0x09, 0x00, - 0xef, 0x00, 0x88, 0x03, 0xe0, 0x08, 0xf0, 0x70, - 0x3e, 0x10, 0x0f, 0x80, 0x03, 0xd2, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, - 0xf9, 0x20, 0x3e, 0x40, 0x0c, 0x90, 0x03, 0xe6, - 0x87, 0xc9, 0x02, 0xb2, 0x40, 0x0d, 0x90, 0x82, - 0xe4, 0x00, 0xc9, 0x80, 0x3e, 0x68, 0x0d, 0x90, - 0x03, 0x64, 0x04, 0xf9, 0xa1, 0x32, 0x68, 0x0f, - 0x98, 0x00, 0xe4, 0x00, 0xf9, 0x80, 0x32, 0x40, - 0x0f, 0x18, 0x03, 0x24, 0x00, 0xf9, 0x80, 0x3e, - 0x44, 0x0f, 0x18, 0x02, 0x24, 0x00, 0xe9, 0x20, - 0x3c, 0x40, 0x0c, 0x91, 0x0b, 0x02, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x64, 0x00, - 0xb9, 0x40, 0x2c, 0x54, 0x08, 0x90, 0x02, 0xc5, - 0x00, 0x81, 0x80, 0x32, 0x40, 0x0d, 0x94, 0x02, - 0xc5, 0x02, 0xf9, 0x90, 0x2e, 0x40, 0x1e, 0x92, - 0x02, 0x24, 0x04, 0xb9, 0x80, 0x22, 0x50, 0x0b, - 0x93, 0x02, 0xe5, 0x00, 0xb1, 0x80, 0x2a, 0x50, - 0x0b, 0x9c, 0x02, 0xa6, 0x00, 0xb9, 0x01, 0x2e, - 0x70, 0x4b, 0x9c, 0x82, 0x04, 0x40, 0x89, 0x00, - 0x22, 0x74, 0x08, 0x9e, 0x02, 0x20, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x18, 0x90, 0x06, 0xe4, - 0x00, 0x8b, 0x18, 0x6a, 0x50, 0x08, 0x91, 0x06, - 0xe4, 0x4a, 0x89, 0x02, 0x2e, 0x40, 0x08, 0x92, - 0x02, 0x64, 0x88, 0xb9, 0x00, 0xa6, 0x40, 0x0b, - 0x90, 0x02, 0xa6, 0x04, 0xb9, 0x11, 0x22, 0x42, - 0x8b, 0x92, 0xa2, 0x64, 0x40, 0xbb, 0x10, 0x2e, - 0x40, 0x0b, 0x92, 0x02, 0xa5, 0x00, 0xa9, 0x0d, - 0x2a, 0x51, 0x08, 0x90, 0x02, 0x06, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x28, 0x10, 0x02, 0xc4, - 0x18, 0x81, 0x02, 0x28, 0x50, 0x09, 0x18, 0x02, - 0xed, 0x09, 0x00, 0xf0, 0x00, 0xec, 0x02, 0xb1, - 0x00, 0x2c, 0x41, 0x0a, 0x90, 0x02, 0x04, 0x00, - 0x31, 0x00, 0x24, 0xd0, 0x1b, 0x10, 0x02, 0xc6, - 0x00, 0xb1, 0x00, 0x28, 0x50, 0x43, 0x14, 0x02, - 0xc4, 0xa0, 0xb1, 0x00, 0x2c, 0x50, 0x0b, 0x12, - 0x82, 0x85, 0x00, 0x81, 0x40, 0x20, 0x51, 0x08, - 0x14, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb8, 0x05, 0x60, 0x00, 0xb8, 0x00, 0x3e, - 0x00, 0x08, 0x80, 0x03, 0xe8, 0x00, 0x88, 0x00, - 0x3a, 0x00, 0x0c, 0x80, 0x03, 0xe0, 0x04, 0x48, - 0x04, 0x3e, 0x00, 0x0c, 0x80, 0x03, 0x60, 0x00, - 0xf8, 0x00, 0x36, 0x00, 0x0f, 0x80, 0x23, 0xa0, - 0x00, 0xf8, 0x00, 0x32, 0x00, 0x07, 0x80, 0x03, - 0x68, 0x80, 0xf8, 0x00, 0x3e, 0x80, 0x4f, 0x82, - 0x0b, 0xa0, 0x00, 0xe8, 0x00, 0x3a, 0x00, 0x2c, - 0x80, 0x03, 0x2e, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x98, 0x19, 0xe4, 0x00, 0xf9, 0x00, 0x3f, - 0x50, 0x0f, 0x90, 0x13, 0xfd, 0x10, 0xfd, 0x00, - 0x33, 0x50, 0x0f, 0x50, 0x03, 0xf4, 0x00, 0xfd, - 0x40, 0x3f, 0x40, 0x0e, 0xd0, 0x03, 0xf4, 0x00, - 0xdd, 0x40, 0x39, 0x40, 0x0f, 0xd0, 0x03, 0xf4, - 0x08, 0xfd, 0x00, 0x3f, 0x50, 0x0f, 0xd4, 0x03, - 0xb4, 0x00, 0x3d, 0x04, 0x3f, 0x50, 0x0f, 0xd0, - 0x03, 0x75, 0x10, 0xfd, 0x44, 0x3b, 0x50, 0x0f, - 0xd4, 0x03, 0xe6, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x05, 0xe4, 0x00, 0xfd, 0x00, 0x3f, - 0x40, 0x0f, 0x90, 0x03, 0xd4, 0x84, 0xc5, 0x02, - 0x3b, 0x4c, 0x0f, 0x50, 0x02, 0xf4, 0x00, 0xfd, - 0x00, 0x37, 0x40, 0x0f, 0xd0, 0x43, 0xf4, 0x00, - 0xed, 0x00, 0x3f, 0x40, 0x0f, 0x50, 0x03, 0xf4, - 0x00, 0xfd, 0x00, 0xbf, 0x4c, 0x0c, 0xd0, 0x03, - 0xd4, 0x00, 0xcd, 0x00, 0x3d, 0x48, 0x0d, 0xd2, - 0x03, 0xf4, 0xc0, 0xed, 0x09, 0x00, 0xf1, 0x00, - 0xdd, 0x00, 0x33, 0x41, 0x4c, 0xd1, 0x03, 0x06, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, - 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, 0x80, - 0x02, 0xe0, 0x00, 0xd8, 0x00, 0x22, 0x0c, 0x08, - 0x80, 0x02, 0xe0, 0x14, 0xb8, 0x10, 0xa2, 0x00, - 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x40, 0x2e, - 0x02, 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x00, - 0x32, 0x0c, 0x0d, 0x84, 0x82, 0xe0, 0x40, 0xd8, - 0x01, 0x2e, 0x0a, 0x08, 0x81, 0x22, 0xe0, 0xc0, - 0x80, 0x48, 0x22, 0x02, 0x28, 0x81, 0x02, 0x0e, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, - 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x44, 0x8b, 0x10, - 0x42, 0xc4, 0x40, 0x89, 0x00, 0x28, 0x48, 0x0b, - 0x10, 0x12, 0xc4, 0x08, 0xb9, 0x00, 0x60, 0xc0, - 0x0b, 0x10, 0x16, 0xc6, 0x04, 0xb1, 0x10, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb9, 0x00, - 0x2c, 0x48, 0x49, 0x13, 0x42, 0xc4, 0x00, 0x91, - 0x02, 0x2c, 0x4c, 0x49, 0x10, 0x02, 0xc4, 0x80, - 0x91, 0x30, 0x20, 0x64, 0x0a, 0x18, 0x02, 0x02, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, - 0xa4, 0x00, 0xbb, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x06, 0xe4, 0x04, 0x99, 0x11, 0x22, 0x42, 0x28, - 0x91, 0x06, 0xed, 0x00, 0xb9, 0x40, 0x22, 0xc0, - 0x8b, 0xb2, 0x06, 0xe4, 0x01, 0xb9, 0x00, 0x2e, - 0xc4, 0x0b, 0x90, 0x02, 0xe5, 0x40, 0xb9, 0x00, - 0xa2, 0x40, 0x49, 0x90, 0x02, 0xe4, 0x02, 0x1b, - 0xc0, 0x2e, 0x40, 0x49, 0xb1, 0x02, 0xe4, 0x00, - 0x89, 0x40, 0x20, 0xc8, 0x0a, 0xb2, 0x02, 0x06, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xc6, 0x04, 0xc9, 0xa0, 0x3a, 0x41, 0x0f, - 0x90, 0x83, 0xe5, 0x00, 0x79, 0x00, 0xed, 0x09, - 0x00, 0xf2, 0x00, 0x12, 0x6c, 0x0f, 0x90, 0x03, - 0xe6, 0x40, 0xe9, 0xc8, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe6, 0x00, 0xf1, 0x00, 0x3e, 0x72, 0x0d, - 0x96, 0x03, 0xe4, 0x00, 0xd9, 0xc0, 0x3e, 0x68, - 0x0d, 0x90, 0x03, 0xe4, 0x20, 0xd9, 0x00, 0xb2, - 0x60, 0x0e, 0x98, 0x0b, 0x28, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x43, 0xe5, 0x00, - 0xf9, 0x80, 0x3c, 0x41, 0x2f, 0x98, 0x03, 0xe4, - 0x00, 0xf9, 0xa0, 0x3e, 0x40, 0x0f, 0x98, 0x03, - 0xe6, 0x00, 0xf9, 0x40, 0x3e, 0x40, 0x0f, 0x99, - 0x03, 0xe6, 0x00, 0xf9, 0x10, 0x3a, 0x70, 0x0f, - 0x90, 0x83, 0xc4, 0x22, 0xf9, 0x00, 0x3e, 0x70, - 0x0e, 0x90, 0x03, 0xe6, 0x80, 0xf9, 0x09, 0x3e, - 0x60, 0x4d, 0x18, 0x03, 0xca, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x10, 0xa0, 0x00, 0xf8, - 0x80, 0x3e, 0x20, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xc8, 0xd0, 0x36, 0x30, 0x07, 0x88, 0x03, 0x23, - 0x40, 0xc8, 0x10, 0x36, 0x30, 0x0f, 0x80, 0x03, - 0xa0, 0x40, 0xf8, 0xc0, 0x3e, 0x00, 0x0f, 0x88, - 0x02, 0x20, 0x50, 0xf8, 0x90, 0x3e, 0x02, 0x0f, - 0x80, 0x03, 0x60, 0x00, 0xc8, 0x58, 0x30, 0x10, - 0x0e, 0x80, 0x0b, 0x01, 0x00, 0xc0, 0x00, 0x36, - 0x00, 0x0f, 0x80, 0x03, 0x0a, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x05, 0x28, 0x00, 0xbe, - 0xa0, 0x2f, 0xb0, 0x0b, 0xa0, 0x02, 0xfb, 0x50, - 0x86, 0xc0, 0x23, 0x91, 0x0a, 0xe4, 0x02, 0xb9, - 0x00, 0x82, 0x00, 0x27, 0x90, 0x0b, 0xe8, 0x02, - 0x2a, 0x00, 0xbe, 0xc0, 0x3b, 0xb9, 0x0b, 0xe4, - 0x82, 0xbb, 0x00, 0xbe, 0xc0, 0x2f, 0xb0, 0x0b, - 0xe4, 0x02, 0xfa, 0x80, 0xde, 0x81, 0x23, 0x80, - 0x08, 0xe4, 0x02, 0x38, 0x30, 0xce, 0x4c, 0x33, - 0xa8, 0xed, 0x09, 0x00, 0xf3, 0x00, 0x03, 0xe4, - 0x02, 0x0a, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x05, 0x4c, 0x00, 0xb3, 0x80, 0x28, 0xe0, - 0x0b, 0x30, 0x02, 0xc5, 0x02, 0x83, 0x80, 0x24, - 0xe0, 0x4b, 0x31, 0x0a, 0x4e, 0x00, 0xa3, 0x00, - 0x64, 0xc0, 0x0b, 0x32, 0x02, 0xcc, 0x00, 0xb3, - 0x10, 0x28, 0xc8, 0x0b, 0x38, 0x02, 0x0f, 0x28, - 0xb3, 0x00, 0x2e, 0xd0, 0x0b, 0x30, 0x02, 0xcc, - 0x00, 0xa3, 0xc0, 0x20, 0x80, 0x2a, 0x32, 0x32, - 0x08, 0x08, 0x83, 0x40, 0x20, 0xe2, 0x0b, 0x3e, - 0x12, 0x0a, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x01, 0x1c, 0x00, 0xb7, 0x00, 0x2d, 0x42, - 0x0b, 0x70, 0x02, 0xd5, 0x10, 0x8f, 0x00, 0xa1, - 0xd0, 0x0a, 0x68, 0x02, 0x7a, 0x03, 0xa5, 0x00, - 0x25, 0xc0, 0x0b, 0xf8, 0x82, 0x5c, 0x18, 0x36, - 0x00, 0x29, 0xc0, 0x0b, 0x78, 0x0a, 0x98, 0x00, - 0xb6, 0x00, 0x2d, 0xd0, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0xbf, 0x84, 0x21, 0x50, 0x68, 0x3c, 0x02, - 0x18, 0x00, 0x87, 0x00, 0xa1, 0xc0, 0x0b, 0x74, - 0x02, 0x28, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x08, 0x1e, 0x00, 0xf5, 0x80, 0x39, 0x21, - 0x0f, 0x78, 0x03, 0xde, 0x00, 0xc7, 0x80, 0x34, - 0xa0, 0x2f, 0x68, 0x02, 0x5a, 0x08, 0xe5, 0x80, - 0x35, 0xe1, 0x0f, 0x78, 0x03, 0xde, 0x00, 0x77, - 0x80, 0x39, 0xe0, 0x0b, 0x48, 0x23, 0x1e, 0x10, - 0xf7, 0x80, 0x3d, 0xe0, 0x0b, 0x68, 0x02, 0x5e, - 0x00, 0xe7, 0x80, 0xb1, 0x80, 0x0e, 0x78, 0x03, - 0x02, 0x02, 0xc7, 0x80, 0x31, 0xe0, 0x0f, 0x38, - 0x0b, 0x2a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x1d, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0x41, - 0x0f, 0xb0, 0x13, 0xe4, 0x00, 0xfb, 0x00, 0x3e, - 0x80, 0x4f, 0xa0, 0x03, 0x88, 0x00, 0xd9, 0x04, - 0x3e, 0xc0, 0x8f, 0x30, 0xed, 0x09, 0x00, 0xf4, - 0x00, 0x03, 0xac, 0x00, 0xfa, 0x00, 0x3a, 0xc0, - 0x0f, 0x80, 0x03, 0x68, 0x00, 0xfa, 0x00, 0x3e, - 0xc0, 0x0f, 0x90, 0x03, 0x64, 0x00, 0xd3, 0x00, - 0x3e, 0x80, 0x0f, 0xb0, 0x43, 0xe0, 0x00, 0xe8, - 0x00, 0x3a, 0xc0, 0x0f, 0xa0, 0x03, 0xc2, 0x06, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, - 0x00, 0xf7, 0x80, 0x33, 0x21, 0x0f, 0xf8, 0x03, - 0xd6, 0x80, 0xc7, 0x82, 0x3b, 0xec, 0x2e, 0x68, - 0x03, 0x3a, 0x00, 0xdd, 0x80, 0x3b, 0xe0, 0x0f, - 0x78, 0x03, 0x1e, 0x00, 0xd6, 0x86, 0x3b, 0xe0, - 0x0d, 0x78, 0x03, 0x92, 0x00, 0xc6, 0x80, 0x33, - 0xa0, 0x0f, 0xf8, 0x03, 0xde, 0x14, 0xef, 0x82, - 0x33, 0xa0, 0x4e, 0xd8, 0x03, 0xfa, 0x00, 0xff, - 0x80, 0xb3, 0xe0, 0x0d, 0xf8, 0x03, 0xc0, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, 0x9c, - 0x00, 0xb7, 0x00, 0x21, 0x04, 0x0b, 0x70, 0x02, - 0xdc, 0x80, 0x87, 0x00, 0x01, 0xc4, 0x08, 0x42, - 0x02, 0x18, 0x40, 0x45, 0x00, 0x21, 0x40, 0x0b, - 0x72, 0x43, 0x5c, 0x00, 0xc6, 0x00, 0x23, 0x44, - 0x0f, 0x70, 0x03, 0x58, 0x60, 0x86, 0x00, 0x21, - 0x50, 0x0b, 0x70, 0x02, 0xdc, 0x40, 0x86, 0x11, - 0x21, 0x40, 0x08, 0x71, 0x02, 0xd8, 0x00, 0xbf, - 0x00, 0x21, 0x41, 0x08, 0x71, 0x82, 0xea, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, - 0x00, 0xb5, 0x00, 0x21, 0x10, 0x0b, 0x70, 0x02, - 0xf4, 0xc8, 0x86, 0x00, 0x28, 0xcb, 0x2a, 0x60, - 0x02, 0x18, 0x00, 0x95, 0x00, 0x2d, 0xc4, 0x0b, - 0x70, 0x42, 0x1c, 0x40, 0x9c, 0x00, 0xa9, 0x00, - 0x0a, 0xc0, 0x02, 0x9c, 0x00, 0x8e, 0x00, 0x21, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xaf, 0x00, - 0x21, 0x00, 0x0a, 0x74, 0x82, 0xd8, 0x00, 0xb7, - 0x00, 0x20, 0x82, 0x0b, 0x50, 0x02, 0xc0, 0xed, - 0x09, 0x00, 0xf5, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x14, 0xcc, 0x00, 0xb1, 0x04, - 0xa0, 0x00, 0x0b, 0x30, 0x02, 0xc1, 0x84, 0x83, - 0x40, 0x20, 0xc2, 0x08, 0x04, 0x86, 0x08, 0x00, - 0x01, 0x08, 0x64, 0xe0, 0x0b, 0x20, 0x02, 0xcd, - 0x20, 0x82, 0x40, 0x20, 0x00, 0x0b, 0x08, 0x22, - 0x4b, 0x20, 0x80, 0x80, 0x20, 0x50, 0x0b, 0x9d, - 0x02, 0xcc, 0x00, 0x82, 0x90, 0xa0, 0x12, 0x08, - 0x38, 0x02, 0xc9, 0x20, 0x30, 0x89, 0x20, 0x10, - 0x0a, 0x04, 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x15, 0xac, 0x00, 0xfb, 0x00, - 0x12, 0xc0, 0x0f, 0xb0, 0x03, 0xe4, 0x00, 0xc9, - 0x10, 0xba, 0x70, 0x2a, 0x0c, 0xaa, 0x08, 0x20, - 0x59, 0xa0, 0x3e, 0xc2, 0x0f, 0xbc, 0x83, 0x2d, - 0x00, 0xdb, 0x40, 0x38, 0x14, 0x0e, 0x38, 0x81, - 0x87, 0x00, 0xcb, 0x02, 0x32, 0x50, 0x0f, 0x94, - 0x03, 0xcc, 0x00, 0xe9, 0x50, 0x12, 0x90, 0x0e, - 0x3c, 0x03, 0xef, 0x00, 0xbb, 0x88, 0x32, 0xf0, - 0x0f, 0xb8, 0x03, 0xea, 0x01, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0xec, 0x00, 0xfb, 0x40, - 0x3c, 0xe0, 0x0f, 0xb0, 0x03, 0xe4, 0x02, 0xfb, - 0x10, 0x3e, 0x40, 0x0f, 0x84, 0x03, 0xe8, 0x00, - 0xf9, 0x00, 0x3a, 0xd0, 0x0f, 0xb0, 0x23, 0x6e, - 0x15, 0xfa, 0x00, 0xbe, 0x10, 0x0d, 0x90, 0x03, - 0xa0, 0x02, 0xfa, 0x10, 0x7e, 0x08, 0xcf, 0x94, - 0x83, 0xeb, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x2f, - 0xb4, 0x03, 0xec, 0x40, 0xfb, 0x40, 0x3e, 0x88, - 0x0d, 0x90, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x10, 0xfc, 0x00, 0xfd, 0x00, - 0x3f, 0x24, 0x0c, 0xf0, 0x03, 0xdc, 0x00, 0xcf, - 0x20, 0x35, 0x00, 0x2d, 0xe0, 0x03, 0x38, 0x40, - 0x69, 0x00, 0x1f, 0xc0, 0x0f, 0xf8, 0x83, 0x7f, - 0x04, 0xff, 0xed, 0x09, 0x00, 0xf6, 0x00, 0x08, - 0x33, 0x00, 0x0c, 0xca, 0x03, 0x34, 0x40, 0x0f, - 0x80, 0x3d, 0x40, 0x08, 0xc0, 0x03, 0x3c, 0x00, - 0xcf, 0x80, 0x3f, 0x80, 0x0f, 0xe8, 0x01, 0x32, - 0x40, 0xff, 0x00, 0x1b, 0x40, 0x0f, 0xf0, 0xa3, - 0xc1, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x81, - 0x04, 0x6c, 0x00, 0xb9, 0x00, 0x2e, 0x60, 0x28, - 0xb0, 0x02, 0xe5, 0x04, 0x83, 0x82, 0x22, 0x26, - 0x0a, 0xa4, 0x82, 0x6b, 0x00, 0xa9, 0x00, 0x2e, - 0xf0, 0x0b, 0x24, 0x02, 0x2c, 0x00, 0xb2, 0x00, - 0x22, 0x30, 0x08, 0x8c, 0x82, 0x22, 0x00, 0x8a, - 0x84, 0x2e, 0x30, 0x08, 0x9c, 0x82, 0x25, 0x00, - 0x89, 0x80, 0x2e, 0x80, 0x4b, 0xbc, 0x02, 0x03, - 0x08, 0xaa, 0x88, 0x62, 0x00, 0x0b, 0x84, 0x02, - 0xe0, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x05, 0x2c, 0x00, 0xba, 0x80, 0x2e, 0x00, 0x08, - 0xb0, 0x02, 0xe5, 0x00, 0x8b, 0x01, 0x26, 0x80, - 0x69, 0x82, 0x02, 0x68, 0x00, 0x89, 0x20, 0x2a, - 0x44, 0x0b, 0xb1, 0x02, 0x6c, 0x01, 0xba, 0x16, - 0x26, 0x21, 0x08, 0xa0, 0x42, 0x24, 0x02, 0xaa, - 0x10, 0x2e, 0x20, 0x0a, 0x88, 0x02, 0x6d, 0x00, - 0x89, 0x20, 0x2a, 0x80, 0x0b, 0xb2, 0x0a, 0xa4, - 0x20, 0xa0, 0x10, 0x2e, 0xe0, 0x0b, 0xa8, 0x02, - 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x0c, 0x00, 0xb2, 0x00, 0x2c, 0x00, 0x08, - 0x30, 0x02, 0xcc, 0x00, 0x83, 0x00, 0x20, 0x80, - 0x0a, 0x80, 0x02, 0x48, 0x04, 0xa1, 0x00, 0x2c, - 0x00, 0x0b, 0x30, 0x12, 0x04, 0x00, 0x32, 0x00, - 0x26, 0x00, 0x18, 0x30, 0x02, 0x22, 0x00, 0xa2, - 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x00, 0x4c, 0x04, - 0x81, 0x01, 0x2c, 0x40, 0x0b, 0x30, 0x02, 0x84, - 0x01, 0xa1, 0x00, 0x2c, 0x00, 0x8b, 0x00, 0x02, - 0xc2, 0x01, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0xf7, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, - 0xf9, 0x00, 0x3e, 0x00, 0x0c, 0xb0, 0x03, 0xe4, - 0x00, 0xca, 0x00, 0x36, 0x80, 0x2d, 0xa0, 0x13, - 0x20, 0x02, 0xc9, 0x00, 0x3a, 0xc0, 0x0f, 0xb0, - 0x03, 0x6c, 0x00, 0x7a, 0x00, 0x36, 0x01, 0x4c, - 0x80, 0x03, 0x24, 0x10, 0xca, 0x02, 0x3e, 0x40, - 0x0e, 0x80, 0x0b, 0x6c, 0x00, 0xcb, 0x00, 0x3a, - 0x00, 0x0f, 0xb0, 0x03, 0xa0, 0x00, 0xe8, 0x00, - 0x2e, 0x00, 0x0f, 0x80, 0x03, 0xc0, 0x03, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, - 0xfd, 0x02, 0x3f, 0x00, 0x0f, 0xf0, 0x03, 0xf4, - 0x06, 0xff, 0x01, 0x3f, 0x80, 0x0f, 0xc0, 0x07, - 0x90, 0x00, 0xdd, 0x00, 0x3f, 0x80, 0x4f, 0xc0, - 0x03, 0xfc, 0x10, 0xfe, 0x00, 0xbb, 0x00, 0x0f, - 0xc0, 0x03, 0xf0, 0x00, 0xde, 0x00, 0x3f, 0x00, - 0x0d, 0xc0, 0x03, 0xbc, 0x02, 0xf7, 0x00, 0x3d, - 0x01, 0x0f, 0xf0, 0x03, 0x70, 0x04, 0xec, 0x00, - 0x33, 0x00, 0x0f, 0xc0, 0x03, 0xe8, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x05, 0xf0, 0x00, - 0xfd, 0x00, 0x3f, 0xc8, 0x4f, 0xc1, 0x43, 0x3c, - 0xa2, 0xcc, 0x00, 0x3f, 0x00, 0x0c, 0xf3, 0x43, - 0xf0, 0x00, 0xcd, 0x00, 0x3f, 0x04, 0x0f, 0xc0, - 0x03, 0x30, 0xc2, 0xcf, 0x28, 0x3b, 0x04, 0x0f, - 0xc2, 0xc3, 0xfc, 0x00, 0xef, 0x00, 0x3f, 0x0e, - 0x0c, 0xc0, 0x0b, 0x3c, 0x00, 0xff, 0x20, 0x3b, - 0xc8, 0x0f, 0xc4, 0x03, 0xfc, 0x80, 0xff, 0x00, - 0x33, 0x00, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0xec, 0x20, - 0xbb, 0x20, 0x2f, 0xc4, 0x0b, 0x32, 0x02, 0x3d, - 0x00, 0x83, 0x00, 0x2e, 0xc2, 0x88, 0xf7, 0x02, - 0xec, 0x30, 0x8a, 0x28, 0x2c, 0xc8, 0x0b, 0x80, - 0x02, 0xa0, 0x80, 0x8f, 0x40, 0xb2, 0x00, 0x0e, - 0xed, 0x09, 0x00, 0xf8, 0x00, 0x86, 0x02, 0xe8, - 0x08, 0xdb, 0x00, 0x2e, 0x18, 0x0b, 0x80, 0x03, - 0x2c, 0x00, 0xef, 0x52, 0x2f, 0xdc, 0x0b, 0xa2, - 0x22, 0xfd, 0xe8, 0xbf, 0x10, 0x22, 0x40, 0x0b, - 0xb0, 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x88, 0x45, 0xcc, 0x88, 0xb3, 0x08, 0x2c, - 0xc0, 0x8b, 0x3a, 0x02, 0x0c, 0x00, 0x83, 0x28, - 0x2c, 0xe8, 0x0a, 0x30, 0x02, 0xcc, 0x80, 0x82, - 0x20, 0x2c, 0xc0, 0x0a, 0x80, 0x02, 0x80, 0x40, - 0x83, 0x08, 0x20, 0x00, 0x03, 0x00, 0x82, 0xcc, - 0x00, 0xb3, 0x02, 0x2c, 0x00, 0x09, 0x80, 0x02, - 0x0c, 0x00, 0xa3, 0x04, 0x2c, 0xca, 0x18, 0x22, - 0x42, 0xcc, 0x80, 0xb3, 0x00, 0x20, 0x00, 0x0b, - 0x30, 0x02, 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x15, 0xac, 0x90, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0x91, 0x02, 0x2c, 0x00, 0x89, 0x14, - 0x2c, 0xc4, 0x0a, 0xb0, 0x02, 0xed, 0x06, 0x8b, - 0x01, 0x2e, 0x45, 0x1b, 0x81, 0x82, 0xa6, 0x00, - 0x8b, 0x00, 0x26, 0x02, 0x19, 0x80, 0x42, 0xec, - 0x00, 0x9b, 0x00, 0x2c, 0xc2, 0x0b, 0xb0, 0x22, - 0xe4, 0x02, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0xe2, 0xec, 0x00, 0xbb, 0x00, 0x02, 0x40, 0x0b, - 0xb0, 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x15, 0xef, 0x00, 0xfb, 0x90, 0x3e, - 0xc0, 0x0f, 0xb8, 0x03, 0x2c, 0x00, 0xcb, 0xa0, - 0x3e, 0xe0, 0x2e, 0xb0, 0x43, 0xec, 0x00, 0x8a, - 0x4c, 0x3e, 0xf8, 0x0f, 0x80, 0x43, 0xa2, 0x80, - 0xcb, 0x00, 0x32, 0x60, 0x0f, 0x88, 0x83, 0xef, - 0x20, 0xfb, 0x00, 0x3e, 0x00, 0x0c, 0x0c, 0x01, - 0x2c, 0x00, 0xeb, 0x00, 0x3a, 0xc0, 0x0f, 0x84, - 0x01, 0xec, 0x00, 0xfb, 0x00, 0x92, 0x00, 0x0f, - 0xb0, 0x43, 0xd0, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x01, 0xed, 0x09, 0x00, 0xf9, 0x00, - 0xb2, 0x00, 0xfd, 0x80, 0x3f, 0xc0, 0x0f, 0xf8, - 0x0b, 0xdc, 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0d, - 0xf0, 0x03, 0xf5, 0x00, 0xfc, 0x10, 0x3f, 0xe1, - 0x0f, 0xc8, 0x23, 0xf4, 0x00, 0xff, 0x02, 0x3b, - 0x44, 0x8e, 0xf2, 0x03, 0xfe, 0x40, 0xfe, 0x00, - 0x6f, 0xd0, 0x0e, 0xf4, 0x23, 0x38, 0x20, 0xeb, - 0x00, 0x3f, 0xc0, 0x0f, 0xf2, 0x23, 0xfc, 0x00, - 0xf7, 0x00, 0x3f, 0x44, 0x0f, 0xf0, 0x03, 0xf9, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, - 0xad, 0x00, 0xcb, 0x00, 0x3e, 0xc2, 0x0f, 0xa0, - 0x0b, 0x2c, 0x00, 0xfb, 0x40, 0xb2, 0x40, 0x2e, - 0xb0, 0x03, 0x2c, 0x00, 0xea, 0x04, 0x3a, 0x80, - 0x0f, 0x8e, 0x03, 0xa0, 0x00, 0xf3, 0x18, 0x32, - 0x8c, 0x0c, 0xb0, 0x03, 0xed, 0x80, 0xf9, 0x00, - 0x3e, 0x00, 0x0f, 0x81, 0x03, 0xec, 0x04, 0xfb, - 0x00, 0x36, 0xc0, 0x0f, 0xa4, 0x03, 0xac, 0x24, - 0xcb, 0x00, 0x32, 0x00, 0x0f, 0xb0, 0x03, 0xd0, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, - 0x2c, 0x00, 0x8b, 0x04, 0x2f, 0xe8, 0x0b, 0xb0, - 0x02, 0x3c, 0x40, 0xbb, 0x00, 0x22, 0xc0, 0x00, - 0xf0, 0x02, 0x2c, 0x00, 0xba, 0x00, 0x2e, 0xc0, - 0x08, 0x04, 0x00, 0xe4, 0x00, 0xbf, 0x81, 0x22, - 0xb1, 0x0a, 0xb1, 0x02, 0xce, 0x00, 0xbb, 0x01, - 0x2e, 0xc1, 0x1b, 0xb0, 0x02, 0xcd, 0x00, 0xbf, - 0xd8, 0x23, 0xd4, 0x03, 0xbc, 0xc3, 0x7f, 0x00, - 0xdf, 0x00, 0x22, 0x80, 0x0b, 0xb0, 0x02, 0xf2, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, - 0x4c, 0x00, 0x83, 0x00, 0x2c, 0xc0, 0x0b, 0xb0, - 0x02, 0x0e, 0x40, 0xb3, 0x00, 0x28, 0xc0, 0x09, - 0x30, 0x02, 0x2c, 0x00, 0xa2, 0x00, 0x28, 0xc0, - 0x08, 0x00, 0x02, 0x20, 0x00, 0xb3, 0x00, 0x20, - 0xa0, 0x0b, 0x0c, 0x00, 0x8e, 0x04, 0xed, 0x09, - 0x00, 0xfa, 0x00, 0x93, 0x00, 0x2c, 0x00, 0x0b, - 0x08, 0x02, 0x4c, 0x00, 0x93, 0xc0, 0x20, 0xd0, - 0x0b, 0x20, 0x02, 0x0d, 0x40, 0x83, 0xb0, 0x2c, - 0x80, 0x0b, 0x30, 0x02, 0xf8, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x01, 0x1e, 0x00, 0x87, - 0x80, 0x2d, 0xe4, 0x0b, 0x68, 0x02, 0x1e, 0x00, - 0x97, 0x80, 0x21, 0x60, 0x48, 0x38, 0x02, 0x1e, - 0x00, 0xb6, 0x80, 0x2d, 0xa1, 0x08, 0x48, 0x02, - 0xd2, 0x01, 0xb7, 0x80, 0x23, 0xa0, 0x1b, 0x78, - 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, 0x20, 0x0b, - 0x48, 0x12, 0xde, 0x00, 0xb7, 0x80, 0x21, 0xe0, - 0x0b, 0x6d, 0x02, 0xde, 0x00, 0x93, 0x80, 0x0d, - 0xe0, 0x03, 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x08, 0x20, 0x42, 0xc1, - 0x00, 0x3c, 0xc4, 0x0f, 0x30, 0x03, 0x0c, 0x80, - 0xf3, 0x00, 0x3a, 0xc0, 0x0e, 0x30, 0x0b, 0x04, - 0x00, 0xe0, 0x10, 0x38, 0xc8, 0x2e, 0x01, 0x43, - 0x04, 0x00, 0xfb, 0x20, 0x30, 0x40, 0x0f, 0x30, - 0x93, 0xcc, 0x20, 0xf3, 0x10, 0x2c, 0xc0, 0x0b, - 0x31, 0x03, 0xcc, 0x00, 0xf3, 0x10, 0x74, 0xc0, - 0x0f, 0xb1, 0x03, 0xac, 0x80, 0xc3, 0x10, 0x3c, - 0x90, 0x0f, 0x30, 0x03, 0xd2, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xff, - 0x00, 0x3f, 0xd6, 0x0f, 0xf1, 0x07, 0xfc, 0x00, - 0xff, 0x10, 0x3f, 0xc4, 0x0f, 0xf1, 0x03, 0xfc, - 0x00, 0xfe, 0x10, 0x3f, 0xc0, 0x46, 0xc0, 0x03, - 0xf4, 0x40, 0xff, 0x40, 0xbd, 0x40, 0x4e, 0xf0, - 0x01, 0xfc, 0x40, 0xff, 0x02, 0x1f, 0xc0, 0x0f, - 0xf0, 0x03, 0xf4, 0x04, 0xff, 0x08, 0x3b, 0xc4, - 0x4f, 0xf1, 0x03, 0x7d, 0x00, 0xff, 0x00, 0x33, - 0xc0, 0x0f, 0xf0, 0x03, 0xd0, 0x02, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x05, 0xec, 0x00, 0xfb, - 0x00, 0xed, 0x09, 0x00, 0xfb, 0x00, 0x3e, 0xe8, - 0x0e, 0x90, 0x03, 0xed, 0x20, 0xf9, 0x00, 0x3e, - 0xc0, 0x0d, 0xb6, 0x03, 0x6c, 0x00, 0xfb, 0x00, - 0x3e, 0x40, 0x2c, 0x80, 0x03, 0xa6, 0x02, 0xcb, - 0x20, 0x7e, 0xe0, 0x0c, 0x80, 0x03, 0xc4, 0x08, - 0xcb, 0x04, 0x3e, 0xc0, 0x0e, 0xb0, 0x13, 0xec, - 0x10, 0xcb, 0x20, 0x3e, 0xd0, 0x0c, 0xb8, 0x03, - 0xaf, 0x42, 0xcb, 0x00, 0x3e, 0x80, 0x0f, 0xb0, - 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x0d, 0xc8, - 0x08, 0x70, 0x02, 0xdd, 0x80, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x75, 0x03, 0x9c, 0x00, 0xb6, 0x00, - 0x2f, 0xc0, 0x0a, 0x50, 0x02, 0xdc, 0x00, 0x87, - 0x40, 0x2f, 0xc1, 0x28, 0x70, 0x21, 0xdc, 0x00, - 0xa6, 0x03, 0x2d, 0xc0, 0x08, 0x70, 0x02, 0xd8, - 0x00, 0xa7, 0x10, 0x27, 0xd2, 0x0a, 0x70, 0x02, - 0x8c, 0x80, 0x87, 0x30, 0x2d, 0x40, 0x0b, 0x70, - 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x00, 0x9e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0a, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x88, 0x6d, - 0xe0, 0x09, 0x78, 0x02, 0xde, 0x00, 0xb6, 0xc0, - 0x2d, 0xe0, 0x08, 0x48, 0x02, 0x9e, 0x04, 0x87, - 0x81, 0x29, 0xe0, 0x09, 0x78, 0x06, 0xfe, 0x00, - 0xa5, 0x80, 0x2c, 0xe0, 0x0a, 0x78, 0x82, 0xde, - 0x24, 0x87, 0xa0, 0x2d, 0xe8, 0x09, 0xf8, 0x02, - 0x5e, 0x80, 0x87, 0x90, 0x2d, 0xe0, 0x0b, 0x78, - 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x10, 0xc2, 0x40, 0xb1, 0x80, 0x2c, 0xc0, - 0x08, 0x00, 0x02, 0xcc, 0x00, 0xb1, 0x00, 0x2c, - 0x44, 0x8b, 0xb0, 0x02, 0x84, 0x20, 0xb1, 0xc0, - 0x2c, 0x10, 0x18, 0x30, 0x02, 0xcd, 0x20, 0x83, - 0x00, 0x2c, 0xf6, 0x89, 0x3b, 0x02, 0x8e, 0x00, - 0xa3, 0x90, 0x24, 0xc8, 0xed, 0x09, 0x00, 0xfc, - 0x00, 0x08, 0x38, 0x82, 0xcd, 0x24, 0xa3, 0x00, - 0x24, 0xc0, 0x0a, 0x30, 0x02, 0xcc, 0x00, 0x83, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xd2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, 0xb8, - 0x00, 0xfa, 0xa0, 0x7e, 0x80, 0x0e, 0xe8, 0x03, - 0xe8, 0x05, 0xfe, 0xc0, 0x3f, 0xb0, 0x0d, 0xa0, - 0x03, 0x7a, 0x00, 0xfe, 0xc0, 0x3f, 0x80, 0x0c, - 0xe6, 0x03, 0xb8, 0x80, 0xca, 0x02, 0x3f, 0xb0, - 0x0d, 0xec, 0x02, 0xda, 0x20, 0xee, 0x80, 0x0f, - 0x88, 0x0a, 0xec, 0x03, 0xfb, 0x00, 0xca, 0x00, - 0x3e, 0x80, 0x0c, 0xe4, 0x03, 0x68, 0x00, 0xca, - 0x00, 0x3f, 0xb0, 0x0f, 0xa0, 0x03, 0xfa, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x10, 0x0f, 0x89, 0x03, - 0xe1, 0x11, 0xf8, 0x80, 0x0e, 0x20, 0x0f, 0x80, - 0x13, 0x60, 0x40, 0xf8, 0x21, 0x3e, 0x02, 0x0f, - 0x88, 0x03, 0xe0, 0x00, 0xf8, 0x41, 0x3e, 0x10, - 0x0e, 0x80, 0x02, 0xe0, 0x20, 0xf8, 0x40, 0x3c, - 0x00, 0x8f, 0x84, 0x03, 0xe1, 0x00, 0xf8, 0x00, - 0x3c, 0x10, 0x1f, 0x8c, 0x12, 0xa1, 0x00, 0xf8, - 0x44, 0x3c, 0x0c, 0x4f, 0x80, 0x03, 0xd2, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, - 0x20, 0xc9, 0x00, 0x32, 0x71, 0x0f, 0x90, 0x13, - 0xe5, 0x09, 0xf9, 0x00, 0x2e, 0x40, 0x4f, 0x90, - 0x03, 0x24, 0x00, 0xf9, 0x01, 0x32, 0x40, 0x0a, - 0x9a, 0x03, 0x64, 0x0c, 0xf1, 0x00, 0x32, 0x40, - 0x0d, 0x91, 0x03, 0xa4, 0x00, 0xf1, 0x18, 0x32, - 0x40, 0x0e, 0x90, 0x03, 0xc7, 0x00, 0xc9, 0x00, - 0x1e, 0x40, 0x6c, 0x92, 0x43, 0x66, 0x40, 0xf9, - 0xc0, 0x7a, 0x40, 0x0c, 0x90, 0x03, 0xc2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x64, - 0x00, 0x89, 0x00, 0x36, 0x70, 0x0b, 0x90, 0xed, - 0x09, 0x00, 0xfd, 0x00, 0x02, 0xe7, 0x20, 0xf9, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0x24, 0x00, - 0xb9, 0x02, 0x00, 0x40, 0x0e, 0x90, 0x22, 0xe4, - 0x00, 0xb9, 0x10, 0x26, 0x42, 0x0e, 0x14, 0x32, - 0x25, 0x02, 0xd9, 0x80, 0x3e, 0x41, 0x08, 0x90, - 0x82, 0xe5, 0x01, 0x79, 0x40, 0x2e, 0x40, 0x0a, - 0x92, 0x12, 0xe5, 0x90, 0xb9, 0x40, 0x2e, 0x40, - 0x0f, 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x01, 0x0c, 0x00, 0x91, 0x00, - 0x26, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x0a, 0x24, 0x00, - 0xb1, 0x00, 0x2a, 0x40, 0x08, 0x90, 0x06, 0xe4, - 0x00, 0xb9, 0x42, 0x66, 0x40, 0x0b, 0x90, 0x00, - 0xa4, 0x20, 0xb9, 0x00, 0x2a, 0x40, 0x0a, 0xb1, - 0x02, 0x64, 0x10, 0x89, 0x60, 0x2e, 0x70, 0x08, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2a, 0x40, - 0x89, 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x05, 0x02, 0x91, 0x40, - 0x2c, 0x40, 0x0b, 0x14, 0x02, 0xc4, 0x10, 0xb1, - 0x40, 0x2c, 0x50, 0x0b, 0x14, 0x02, 0x05, 0x00, - 0xb1, 0x40, 0xaa, 0x50, 0x0a, 0x30, 0x02, 0xc5, - 0x00, 0xb1, 0x28, 0x24, 0x40, 0x1a, 0x34, 0x02, - 0x04, 0x00, 0x93, 0x42, 0x6c, 0x50, 0x08, 0x14, - 0x02, 0xcc, 0x00, 0xa1, 0x00, 0x2c, 0x50, 0x08, - 0x14, 0x02, 0xc5, 0x00, 0xb1, 0x40, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb8, 0x0d, 0x60, 0x00, 0xd8, 0x00, - 0xb6, 0x80, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xb8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0x20, 0x08, - 0xb8, 0x02, 0x3a, 0x01, 0x08, 0x80, 0x02, 0xc0, - 0x08, 0x78, 0x20, 0x32, 0x00, 0x0b, 0x80, 0x03, - 0xa0, 0x02, 0xf8, 0x00, 0x3a, 0x00, 0x0e, 0x80, - 0x03, 0x60, 0xed, 0x09, 0x00, 0xfe, 0x00, 0x00, - 0x88, 0x00, 0x3e, 0x00, 0x0c, 0x80, 0x03, 0x60, - 0x00, 0xfa, 0x00, 0x3a, 0x00, 0x0d, 0x80, 0x03, - 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x1d, 0xf4, 0x00, 0xed, 0x00, 0x30, 0x50, 0x4f, - 0xf0, 0x13, 0xe5, 0x04, 0xed, 0x00, 0x3f, 0x40, - 0x0f, 0x94, 0x42, 0xf4, 0x04, 0xfd, 0x00, 0x37, - 0x40, 0x0e, 0xd0, 0x03, 0xf5, 0x00, 0xf9, 0x28, - 0xbb, 0x4a, 0x0f, 0xd4, 0x03, 0xfc, 0x00, 0xfd, - 0x40, 0x7b, 0x50, 0x0f, 0xd0, 0x03, 0xdd, 0x10, - 0xf9, 0x40, 0x3e, 0x50, 0x0f, 0x50, 0x43, 0xe5, - 0x00, 0xf9, 0x40, 0x3f, 0x50, 0x0e, 0x90, 0x03, - 0xe6, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x05, 0xe4, 0x40, 0xf9, 0x00, 0x3f, 0x40, 0x4f, - 0x91, 0x03, 0xf4, 0x80, 0xf9, 0x00, 0x3e, 0x44, - 0x0f, 0x90, 0x03, 0x24, 0x10, 0xe9, 0x10, 0x32, - 0xc0, 0x0f, 0xd0, 0x03, 0xe4, 0xe0, 0xfd, 0x30, - 0x3f, 0x40, 0x8f, 0xd1, 0x03, 0x14, 0x00, 0xcd, - 0x28, 0x36, 0x4c, 0x0f, 0xd0, 0x03, 0xf4, 0x00, - 0xe5, 0x00, 0x37, 0x49, 0x07, 0x51, 0x63, 0xf4, - 0x80, 0xed, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, - 0x10, 0xe0, 0x80, 0xb8, 0x08, 0x2e, 0x00, 0x18, - 0x80, 0x02, 0xe0, 0x04, 0xb8, 0x24, 0x2e, 0x08, - 0x0b, 0x84, 0xc2, 0x08, 0x20, 0x88, 0x00, 0x36, - 0x0a, 0x0b, 0x80, 0x42, 0xe8, 0x80, 0xb8, 0x30, - 0x2e, 0x02, 0x0b, 0xa1, 0x02, 0xa0, 0x10, 0xa0, - 0x20, 0x2e, 0x0c, 0x0b, 0xa0, 0x82, 0xe0, 0x00, - 0x88, 0x10, 0x22, 0x08, 0x0e, 0x82, 0x02, 0xe0, - 0x60, 0xb8, 0x48, 0x2e, 0x00, 0x0b, 0x80, 0x02, - 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x05, 0xc4, 0x80, 0xb1, 0x20, 0x2c, 0x44, 0x0a, - 0x10, 0x02, 0xc4, 0x40, 0xb1, 0xed, 0x09, 0x00, - 0xff, 0x00, 0x2a, 0x2c, 0x48, 0x0b, 0x13, 0x02, - 0xe4, 0x00, 0xa9, 0x04, 0x20, 0x48, 0x0b, 0x10, - 0x02, 0x84, 0x80, 0xb1, 0x20, 0x2c, 0x48, 0x0b, - 0x10, 0x0a, 0x24, 0x04, 0x81, 0x2c, 0x28, 0x68, - 0x0b, 0x12, 0x02, 0xc4, 0x40, 0xa1, 0x00, 0x28, - 0x4e, 0x0b, 0x12, 0x02, 0xc4, 0x80, 0xb1, 0x30, - 0x2c, 0x44, 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, 0x80, - 0xb9, 0x00, 0x2e, 0x40, 0x0a, 0x90, 0x02, 0xe4, - 0x10, 0xb9, 0x42, 0x2e, 0x44, 0x0b, 0x90, 0x02, - 0x64, 0x50, 0x89, 0x20, 0x26, 0x51, 0x03, 0xb0, - 0x02, 0xe4, 0x00, 0xb9, 0x01, 0x2e, 0x42, 0x0b, - 0x90, 0x02, 0xa4, 0x00, 0xa9, 0x41, 0x2e, 0x44, - 0x0b, 0x92, 0x02, 0xe4, 0x04, 0xa9, 0x00, 0x6a, - 0x40, 0x0a, 0xb0, 0x80, 0xe4, 0x00, 0xb9, 0x01, - 0x2e, 0x58, 0x0b, 0x90, 0x02, 0xc6, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe5, 0x80, - 0xf9, 0x90, 0x3e, 0x40, 0x8f, 0x9c, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x1e, 0x68, 0x0f, 0x90, 0x03, - 0x64, 0x04, 0xe1, 0x09, 0x32, 0x60, 0x0f, 0x90, - 0x03, 0xa5, 0x00, 0xf9, 0x00, 0x3e, 0x70, 0x4f, - 0x9c, 0x43, 0x04, 0x00, 0x89, 0xc0, 0x32, 0x40, - 0x0f, 0x90, 0x07, 0xe7, 0x00, 0xa9, 0x00, 0xba, - 0x40, 0x4f, 0x9c, 0x03, 0xe4, 0x00, 0xe9, 0x04, - 0x3e, 0x60, 0x0f, 0x90, 0x03, 0xe8, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0xa4, 0x00, - 0xf9, 0x04, 0x3e, 0x43, 0x8d, 0x92, 0x03, 0xe4, - 0x00, 0x59, 0xa4, 0x3e, 0x60, 0x0b, 0x10, 0x43, - 0xa4, 0x00, 0xe9, 0x00, 0x3e, 0x48, 0x0f, 0x92, - 0x03, 0xe5, 0x00, 0xf9, 0x00, 0x3e, 0x64, 0x8b, - 0x9a, 0x83, 0xe7, 0x00, 0xf9, 0x90, 0x2e, 0x40, - 0x0f, 0x90, 0x01, 0xe6, 0x40, 0x59, 0x00, 0x16, - 0xed, 0x09, 0x00, 0x00, 0x01, 0x40, 0x0e, 0x94, - 0x83, 0xe4, 0x00, 0xf9, 0x08, 0x3e, 0x60, 0x0f, - 0x90, 0x03, 0xca, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x10, 0xa0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0e, 0x84, 0x03, 0xe2, 0x00, 0xc8, 0x00, - 0x32, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x40, 0x32, 0x10, 0x0f, 0x89, 0x43, 0xe1, 0x04, - 0xe8, 0x0c, 0x3e, 0x10, 0x4f, 0x84, 0x03, 0xe3, - 0x00, 0xf8, 0x00, 0x32, 0x00, 0x0d, 0x82, 0x03, - 0xe3, 0x00, 0xc0, 0x00, 0xb6, 0x02, 0x0f, 0x80, - 0x03, 0xa0, 0x20, 0xf8, 0x01, 0x3e, 0x11, 0x0f, - 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x05, 0x28, 0x00, 0xba, 0x00, 0x2d, - 0x80, 0x03, 0xa0, 0x02, 0xf9, 0x00, 0x8a, 0x00, - 0x22, 0x80, 0x0b, 0xa0, 0x03, 0x88, 0x08, 0x8a, - 0x00, 0x2a, 0x80, 0x03, 0xe4, 0x02, 0xe8, 0x00, - 0xbe, 0x40, 0x2f, 0x80, 0x0b, 0xe2, 0x02, 0xfb, - 0x20, 0x8e, 0x10, 0x2a, 0x80, 0x08, 0xe0, 0x83, - 0x19, 0x00, 0xde, 0x24, 0x03, 0xa2, 0x8b, 0xe4, - 0x00, 0x39, 0x80, 0xbe, 0xc0, 0x2e, 0x80, 0x0b, - 0xa0, 0x02, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x04, 0x0c, 0x00, 0xb3, 0x00, 0x2c, - 0x24, 0x0b, 0x30, 0x02, 0xc6, 0x00, 0x83, 0x00, - 0x28, 0xc0, 0x09, 0x30, 0x22, 0x0c, 0x00, 0x83, - 0x00, 0x28, 0xc0, 0x09, 0x38, 0x12, 0xcc, 0x08, - 0xa3, 0x40, 0x24, 0xe9, 0x03, 0xb0, 0x02, 0xce, - 0x00, 0xa3, 0x50, 0x20, 0xc0, 0x08, 0x3c, 0x02, - 0x8c, 0x00, 0xa3, 0xe0, 0x20, 0xf0, 0x0b, 0x30, - 0x02, 0x8c, 0x00, 0xb3, 0x40, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x01, 0x1c, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x8b, 0x70, 0x22, 0xdf, 0x00, 0x87, 0xa0, - 0x29, 0xcc, 0x0b, 0xed, 0x09, 0x00, 0x01, 0x01, - 0x7a, 0x22, 0x1c, 0x02, 0x8f, 0x00, 0x29, 0xc8, - 0x0b, 0x40, 0x02, 0xdc, 0xc0, 0xb7, 0x02, 0x2d, - 0xc3, 0x0b, 0x70, 0x06, 0xdc, 0x00, 0x87, 0x80, - 0x29, 0xe0, 0x29, 0xf8, 0x42, 0x1c, 0x20, 0xb7, - 0x00, 0x21, 0x80, 0x4b, 0xc8, 0x02, 0x94, 0x00, - 0xb7, 0x08, 0x2d, 0xc0, 0x8b, 0x70, 0x02, 0xe8, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, - 0x1e, 0x40, 0xf7, 0xb2, 0x6d, 0xe0, 0xcf, 0x7a, - 0x03, 0xce, 0x02, 0xcf, 0xe0, 0xb9, 0xe8, 0x0f, - 0x72, 0x03, 0x9e, 0x00, 0xf7, 0xe0, 0x39, 0xe5, - 0x1f, 0x48, 0x23, 0xde, 0x20, 0xe7, 0x80, 0x05, - 0xe0, 0x03, 0x68, 0x03, 0xde, 0x04, 0xe5, 0x80, - 0x73, 0xe8, 0x0c, 0x68, 0x23, 0x9e, 0x02, 0xe7, - 0x80, 0x31, 0x60, 0x0f, 0x48, 0x03, 0x96, 0x00, - 0xf4, 0x80, 0x2d, 0xe0, 0x0f, 0x78, 0x03, 0xea, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, - 0xad, 0xc0, 0xfb, 0x20, 0x2e, 0x40, 0x0f, 0xb6, - 0x83, 0xec, 0x09, 0xfb, 0x20, 0x36, 0xc8, 0x0f, - 0xb5, 0x43, 0xac, 0x08, 0xf3, 0x00, 0xb6, 0xc8, - 0x0d, 0xa0, 0x03, 0xed, 0x00, 0xd8, 0x00, 0x3e, - 0xc0, 0x0f, 0x80, 0x03, 0xec, 0x04, 0xe9, 0x01, - 0x3e, 0xd4, 0x4e, 0x20, 0x23, 0x88, 0x10, 0xc8, - 0x00, 0x3a, 0x00, 0x0f, 0x80, 0x23, 0x64, 0x00, - 0xf9, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xc2, - 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - 0xfe, 0x00, 0xef, 0x98, 0x33, 0xe0, 0x2c, 0xf8, - 0x81, 0xbe, 0x10, 0xef, 0xc4, 0x3f, 0xf4, 0x4f, - 0xf4, 0x43, 0xff, 0x20, 0xcf, 0xc0, 0x3f, 0xe6, - 0x4f, 0xc8, 0x03, 0xbe, 0x40, 0xdf, 0x90, 0x3f, - 0xe5, 0x0f, 0xf8, 0x03, 0x9e, 0x00, 0xce, 0x80, - 0x33, 0xf4, 0x08, 0xd9, 0x03, 0x3c, 0x40, 0xe7, - 0x90, 0x3b, 0x20, 0x0f, 0xe8, 0x03, 0xed, 0x09, - 0x00, 0x02, 0x01, 0x36, 0x40, 0xff, 0x80, 0x33, - 0xe4, 0x0f, 0xf8, 0x01, 0xc0, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x11, 0x9c, 0x00, 0x8f, - 0x08, 0xa1, 0xc0, 0x08, 0x70, 0x82, 0x1c, 0x40, - 0x87, 0x20, 0x2d, 0xc1, 0x0b, 0x70, 0x03, 0xdc, - 0x00, 0x97, 0x21, 0x3d, 0xc5, 0x0b, 0x41, 0x03, - 0xdc, 0x00, 0xf7, 0x00, 0x2d, 0x44, 0x0e, 0x60, - 0x02, 0x14, 0x00, 0xfe, 0x20, 0x35, 0xcc, 0x08, - 0xf3, 0x03, 0x5c, 0xc0, 0xb7, 0x34, 0x35, 0x00, - 0x0b, 0x40, 0x02, 0x14, 0x00, 0xbd, 0x40, 0x29, - 0xc0, 0x0b, 0x70, 0x02, 0xea, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0xb7, - 0x04, 0x20, 0x80, 0x08, 0xf0, 0x02, 0xd4, 0x00, - 0xb7, 0x01, 0x2d, 0xc0, 0x01, 0x70, 0x02, 0xfc, - 0x00, 0x97, 0x01, 0x2d, 0xc0, 0x03, 0x44, 0x02, - 0x9c, 0x15, 0xb7, 0x01, 0x2d, 0x80, 0x0b, 0x20, - 0x02, 0xb8, 0x00, 0x97, 0x09, 0x24, 0xc1, 0x19, - 0x70, 0x02, 0x1c, 0x48, 0xa7, 0x00, 0x65, 0x00, - 0x0b, 0xc1, 0x02, 0x50, 0x01, 0xb7, 0x00, 0x21, - 0xc2, 0x1b, 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x14, 0x4f, 0x00, 0x93, - 0x80, 0x20, 0xc0, 0x08, 0x38, 0x82, 0x4c, 0x00, - 0x93, 0x20, 0x2c, 0xe2, 0x89, 0x30, 0x02, 0xcc, - 0x00, 0x9b, 0xd0, 0x2c, 0xe8, 0x4b, 0x01, 0x02, - 0xcc, 0xc0, 0xb0, 0x00, 0x2c, 0x00, 0x1a, 0x00, - 0x22, 0x80, 0x00, 0xb3, 0x60, 0x24, 0xc2, 0x58, - 0x3c, 0x02, 0x49, 0x00, 0xb0, 0x00, 0x20, 0x00, - 0x0b, 0x0c, 0x00, 0x40, 0x00, 0xb1, 0x02, 0x28, - 0xd2, 0x0b, 0x30, 0x02, 0xc8, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x15, 0x9e, 0x40, 0xff, - 0x80, 0x32, 0xc0, 0x0c, 0x74, 0x23, 0xec, 0x00, - 0xf7, 0xc0, 0x3d, 0xc2, 0x0f, 0xf0, 0x03, 0xfd, - 0x00, 0xed, 0x09, 0x00, 0x03, 0x01, 0xcf, 0x00, - 0x3d, 0xd2, 0x0f, 0x8c, 0x03, 0xbd, 0x00, 0x99, - 0x00, 0x3e, 0x40, 0x0b, 0xb0, 0x02, 0xaf, 0x64, - 0x9b, 0x40, 0x37, 0xf0, 0x0d, 0xb2, 0x03, 0x2d, - 0x20, 0xeb, 0x00, 0x26, 0x40, 0x0f, 0x84, 0x02, - 0x64, 0x19, 0xfb, 0x00, 0x32, 0xf0, 0x0f, 0xb0, - 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0xec, 0x48, 0xeb, 0x00, 0x3e, 0x90, - 0x0f, 0xb0, 0x03, 0x25, 0x00, 0xeb, 0x10, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xae, 0x20, 0xeb, 0x00, - 0x3a, 0xc0, 0x0f, 0x84, 0x03, 0xac, 0x00, 0xc9, - 0x41, 0x3e, 0x10, 0x0f, 0xb1, 0x03, 0x69, 0x00, - 0xf3, 0x40, 0x3e, 0xc4, 0x0f, 0xb4, 0x03, 0xcc, - 0x20, 0xfb, 0x40, 0xbe, 0x00, 0x0f, 0x85, 0x0b, - 0xa0, 0x01, 0xf8, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x10, 0xfc, 0x00, 0xdf, 0x00, 0x35, 0xe4, - 0x28, 0xf0, 0x03, 0x7c, 0x00, 0xff, 0x00, 0x37, - 0xc0, 0x4d, 0xf0, 0x03, 0x3c, 0x00, 0xef, 0x08, - 0x33, 0xc0, 0x0c, 0xc4, 0x03, 0xdc, 0x00, 0xcd, - 0x00, 0x3f, 0x40, 0x0c, 0x60, 0x8b, 0x3e, 0x80, - 0xcf, 0xa1, 0x31, 0xc0, 0x0d, 0xf0, 0x83, 0x3e, - 0x00, 0xcf, 0x80, 0x3d, 0x00, 0x0c, 0xc0, 0x83, - 0xd4, 0x0c, 0x4e, 0x81, 0x31, 0xc0, 0x4c, 0xf0, - 0x03, 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x6c, 0x00, 0x83, 0x04, 0x22, 0xf2, - 0x08, 0xb0, 0x03, 0x6e, 0x20, 0xbb, 0x00, 0x22, - 0xc0, 0x0a, 0xb0, 0x02, 0x2c, 0x00, 0xbb, 0x00, - 0x22, 0xc0, 0x0a, 0x8c, 0x00, 0xec, 0x00, 0x88, - 0xa0, 0x2c, 0x28, 0x0a, 0x88, 0x02, 0x09, 0x20, - 0xab, 0xe0, 0x36, 0xc0, 0x09, 0xb0, 0x83, 0x6b, - 0x84, 0xd8, 0xb0, 0x2e, 0x20, 0x88, 0x8c, 0x03, - 0xe3, 0x00, 0x88, 0x80, 0xed, 0x09, 0x00, 0x04, - 0x01, 0x36, 0xc0, 0x0d, 0xb0, 0x02, 0xe0, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, - 0x00, 0xbb, 0x02, 0x26, 0x40, 0x0a, 0xb0, 0x02, - 0xec, 0x80, 0xbb, 0x00, 0x26, 0xc0, 0x0a, 0x30, - 0x02, 0xec, 0x00, 0xab, 0x00, 0x2a, 0xc0, 0x08, - 0xa0, 0x02, 0xec, 0x02, 0x88, 0x80, 0x2e, 0x60, - 0x08, 0x91, 0x00, 0xac, 0x00, 0x8b, 0x00, 0x22, - 0xc0, 0x08, 0x10, 0x02, 0x68, 0x80, 0x88, 0x00, - 0x2e, 0x30, 0x08, 0x88, 0x02, 0xe7, 0x00, 0xa2, - 0x10, 0x22, 0xc0, 0x08, 0xb0, 0x02, 0xe0, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x2c, - 0x01, 0x8b, 0x00, 0x20, 0xc0, 0x0a, 0xb0, 0x02, - 0xcc, 0x00, 0xbb, 0x00, 0x22, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0xaa, 0xc0, 0x0a, - 0x00, 0x02, 0xcc, 0x00, 0x80, 0x04, 0x2e, 0x00, - 0x0a, 0x00, 0x02, 0x28, 0x10, 0xa3, 0x00, 0x24, - 0xc0, 0x0b, 0x30, 0x02, 0xc8, 0x08, 0x90, 0x00, - 0x6c, 0x00, 0x28, 0x00, 0x02, 0xc0, 0x00, 0xa0, - 0x01, 0x24, 0xc0, 0x09, 0x30, 0x02, 0xc2, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x7c, - 0x00, 0xff, 0x00, 0x36, 0xc0, 0x0e, 0xf0, 0x03, - 0xec, 0x00, 0xff, 0x00, 0x37, 0xc0, 0x0f, 0xf0, - 0x03, 0xfc, 0x00, 0xef, 0x00, 0x3b, 0xc0, 0x0c, - 0x80, 0x02, 0xfc, 0x11, 0xc8, 0x00, 0x2e, 0x00, - 0x88, 0x80, 0x03, 0xa8, 0x00, 0xcb, 0x00, 0x23, - 0xc0, 0x0c, 0xb0, 0x22, 0x60, 0x00, 0x88, 0x02, - 0x3e, 0x01, 0x0c, 0x80, 0x07, 0xe0, 0x10, 0xea, - 0x00, 0x32, 0xc0, 0x0c, 0xb0, 0x03, 0xc0, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xdc, - 0x00, 0x7f, 0x00, 0x3f, 0x00, 0x0d, 0x70, 0x03, - 0x10, 0x00, 0xff, 0x01, 0x3f, 0xc1, 0x0e, 0xf0, - 0x03, 0x1c, 0x00, 0xff, 0x01, 0x37, 0xc0, 0xed, - 0x09, 0x00, 0x05, 0x01, 0x0f, 0xe0, 0x03, 0xfc, - 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, - 0xf8, 0x04, 0xff, 0x00, 0x3f, 0xc0, 0x0c, 0xf0, - 0x03, 0x70, 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, - 0x40, 0x03, 0xb0, 0x00, 0xdc, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x05, 0xfc, 0x00, 0xfc, 0x22, - 0x3d, 0x40, 0x8c, 0xc0, 0x03, 0x98, 0x00, 0xd7, - 0x00, 0x33, 0x00, 0x0c, 0xc0, 0x5b, 0x75, 0x00, - 0xec, 0x00, 0x33, 0x80, 0x28, 0xe0, 0x03, 0xb8, - 0x00, 0xf7, 0x00, 0x31, 0x00, 0x2c, 0xd0, 0x03, - 0x38, 0x00, 0xcc, 0x00, 0x31, 0x01, 0x0f, 0xe0, - 0x03, 0x3c, 0x00, 0xcc, 0x00, 0x3d, 0x40, 0x0f, - 0xf0, 0x03, 0x30, 0xc4, 0x8c, 0x20, 0xb3, 0x0c, - 0x2c, 0xc3, 0x53, 0x30, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x10, 0xec, 0x00, 0xb8, 0x10, - 0x2e, 0xc0, 0x08, 0xa0, 0x42, 0x28, 0x00, 0xbb, - 0x00, 0x22, 0x00, 0x08, 0x80, 0x42, 0x25, 0x00, - 0xa8, 0x00, 0x22, 0x40, 0x08, 0xb0, 0x12, 0x2c, - 0x00, 0xbb, 0x00, 0x22, 0x80, 0x08, 0x90, 0x0a, - 0x24, 0x00, 0x8a, 0x00, 0x22, 0x80, 0x0b, 0x80, - 0x13, 0x6c, 0x00, 0x88, 0x00, 0x2e, 0x4a, 0x8b, - 0xb0, 0x0a, 0xa1, 0x40, 0x82, 0x30, 0x22, 0x58, - 0x08, 0x85, 0x02, 0x20, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xc8, 0x05, 0xcc, 0x00, 0xb1, 0x00, - 0x2e, 0x00, 0x28, 0x10, 0x22, 0x80, 0x04, 0xb3, - 0x00, 0x62, 0x00, 0x2a, 0x00, 0x02, 0x4c, 0xc4, - 0xa0, 0x01, 0x26, 0x40, 0x08, 0xb0, 0x02, 0xcc, - 0x00, 0xba, 0x00, 0xae, 0xc0, 0x8b, 0x10, 0x02, - 0x48, 0x02, 0x82, 0x00, 0xa4, 0x80, 0x0b, 0x20, - 0x02, 0x0c, 0x00, 0x80, 0x00, 0x2c, 0x40, 0x0a, - 0x30, 0x0a, 0xc0, 0x00, 0xa0, 0x08, 0x28, 0x04, - 0x08, 0x02, 0xed, 0x09, 0x00, 0x06, 0x01, 0x22, - 0xa2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x15, 0xac, 0x10, 0xb9, 0x00, 0x2e, 0x82, 0x08, - 0xb0, 0xa2, 0xa8, 0x00, 0xbb, 0x01, 0xa2, 0x00, - 0x0a, 0x82, 0x02, 0x6c, 0x00, 0xa8, 0x51, 0xa6, - 0xd0, 0x08, 0xb0, 0x00, 0x6c, 0x00, 0xbb, 0x50, - 0x26, 0x81, 0x0b, 0x90, 0x02, 0x60, 0x40, 0x8a, - 0x00, 0x26, 0xc0, 0x0b, 0xa0, 0x02, 0x6c, 0x00, - 0x8a, 0x08, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe8, - 0x08, 0xa8, 0x02, 0x22, 0x40, 0x0a, 0x16, 0x02, - 0xb0, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xd1, - 0x15, 0xec, 0x00, 0xf8, 0x60, 0x3c, 0xc0, 0x8c, - 0x14, 0x03, 0xa9, 0x00, 0xf3, 0x80, 0x32, 0x34, - 0x0e, 0x80, 0x0b, 0x6c, 0x02, 0xe0, 0x00, 0x36, - 0xf0, 0x0c, 0xb4, 0x83, 0xec, 0x04, 0xf1, 0x40, - 0xb6, 0xb6, 0x0b, 0x9c, 0xa3, 0x6a, 0x00, 0xc2, - 0x00, 0x36, 0x12, 0x0f, 0x28, 0x03, 0x0c, 0x00, - 0xca, 0x40, 0x7e, 0x66, 0x0f, 0xb4, 0x03, 0xec, - 0x00, 0xe9, 0x40, 0x3a, 0xb2, 0x0c, 0x8c, 0x0b, - 0x90, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x01, 0xbc, 0x00, 0xfe, 0x00, 0x3f, 0xc0, 0x0b, - 0xd0, 0x03, 0x7c, 0x00, 0xff, 0xc1, 0x3f, 0x60, - 0x8d, 0xf8, 0x0b, 0xbe, 0x42, 0xfe, 0x80, 0x3b, - 0x70, 0x0f, 0xfa, 0x43, 0xbe, 0x40, 0xfd, 0x80, - 0xbb, 0x80, 0x0c, 0xec, 0x03, 0xb4, 0x08, 0xff, - 0x90, 0x3b, 0xe4, 0x0f, 0xec, 0x03, 0xfc, 0x02, - 0xfe, 0xa0, 0x3f, 0x41, 0x0f, 0xc0, 0x02, 0x94, - 0x00, 0xd7, 0x20, 0x35, 0x66, 0x0d, 0xb0, 0x13, - 0x78, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x10, 0xac, 0x00, 0xf8, 0x40, 0x32, 0xd2, 0x0c, - 0xb4, 0x83, 0x29, 0x80, 0xcb, 0x30, 0x3a, 0x10, - 0x0d, 0xb0, 0x83, 0xea, 0x00, 0xfa, 0x00, 0x3e, - 0x50, 0x2c, 0xb6, 0x03, 0xae, 0xed, 0x09, 0x00, - 0x07, 0x01, 0x00, 0xc9, 0x60, 0x32, 0xd1, 0x0c, - 0xa4, 0x43, 0xa9, 0x00, 0xca, 0x10, 0x3e, 0x94, - 0x0c, 0xb0, 0x03, 0xec, 0x80, 0xfa, 0x00, 0x3e, - 0x40, 0x0c, 0xb6, 0x03, 0xa8, 0x00, 0xe9, 0x42, - 0x32, 0x80, 0x1d, 0xa6, 0x02, 0x10, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xd8, 0x05, 0x2c, 0x00, - 0xba, 0x00, 0x22, 0xc0, 0x08, 0xb0, 0x02, 0x28, - 0x00, 0xab, 0xc0, 0x20, 0x72, 0x0b, 0x34, 0x02, - 0x69, 0x00, 0xbb, 0x14, 0x2c, 0xf8, 0x08, 0x34, - 0x02, 0x2e, 0x00, 0x89, 0x48, 0x20, 0xd0, 0x0a, - 0x25, 0x02, 0xc4, 0x00, 0xab, 0x00, 0x2e, 0xc0, - 0x28, 0xb8, 0x42, 0xee, 0x00, 0xba, 0x52, 0x2e, - 0x40, 0x00, 0xbc, 0x02, 0x28, 0x00, 0xa9, 0x8a, - 0x22, 0x72, 0x08, 0xb6, 0x00, 0xb2, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4c, 0x04, - 0xb0, 0x02, 0x20, 0x50, 0x08, 0x1c, 0x08, 0x0b, - 0x00, 0x83, 0x00, 0x24, 0x32, 0x09, 0x00, 0x02, - 0xec, 0x10, 0xb0, 0x00, 0x2c, 0x88, 0x08, 0x34, - 0x02, 0x88, 0x00, 0x83, 0xc0, 0x20, 0x92, 0x8a, - 0x10, 0x02, 0x89, 0x80, 0xa2, 0x82, 0x2c, 0xa0, - 0x08, 0x28, 0x02, 0xcd, 0x40, 0xb3, 0x80, 0x2c, - 0x40, 0xc8, 0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, - 0x20, 0x00, 0x08, 0x04, 0x02, 0x38, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x1e, 0x00, - 0xb4, 0x80, 0x21, 0xe0, 0x08, 0xf9, 0x02, 0x3a, - 0x04, 0xaf, 0x81, 0x25, 0x20, 0x0b, 0x48, 0x02, - 0x5f, 0x00, 0xb4, 0x80, 0x2f, 0x20, 0x08, 0xf8, - 0x02, 0x3e, 0x00, 0x87, 0x80, 0xa1, 0xa0, 0x0a, - 0x58, 0x82, 0xf6, 0x00, 0xa6, 0x80, 0x2d, 0xe0, - 0x08, 0x68, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2f, - 0xa0, 0x08, 0x68, 0x02, 0x32, 0x00, 0x87, 0x90, - 0x20, 0xa4, 0x08, 0x69, 0x12, 0x08, 0x00, 0x40, - 0xed, 0x09, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x4a, 0x08, 0x0c, 0x00, 0xf1, 0x00, 0x30, - 0x41, 0x0c, 0x11, 0x83, 0x01, 0x20, 0xc3, 0x12, - 0x34, 0x10, 0x0d, 0x00, 0x03, 0xcc, 0x10, 0xf0, - 0x00, 0x3c, 0x40, 0x0c, 0x30, 0x03, 0x8c, 0x00, - 0xc3, 0x00, 0x30, 0xc6, 0x0e, 0x12, 0x03, 0x89, - 0x20, 0xe2, 0x00, 0x1c, 0x84, 0x0c, 0x20, 0x83, - 0xcc, 0x00, 0xf2, 0x08, 0x3c, 0x40, 0x4c, 0xb0, - 0x8b, 0x80, 0x40, 0xe2, 0x40, 0xb0, 0x44, 0x0c, - 0x30, 0x0b, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xf5, 0x00, 0x3f, - 0xc0, 0x0f, 0x71, 0x43, 0xf8, 0x00, 0xff, 0x10, - 0x0b, 0x80, 0x0f, 0xc1, 0x03, 0xfc, 0x04, 0xfc, - 0x00, 0x3d, 0xc0, 0x0f, 0x70, 0x03, 0xdc, 0x40, - 0xff, 0x00, 0xbf, 0xc4, 0x0f, 0xd0, 0x13, 0xd4, - 0x00, 0xfe, 0x00, 0x3f, 0xc0, 0x0f, 0xe0, 0x23, - 0xfc, 0x00, 0x3f, 0x00, 0x3f, 0x84, 0x27, 0xf0, - 0x11, 0x58, 0x00, 0xff, 0x00, 0x3f, 0xc4, 0x2f, - 0xf0, 0x03, 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x05, 0xec, 0x00, 0xe9, 0x00, 0x3c, - 0xc1, 0x0c, 0x18, 0x03, 0x88, 0x00, 0xc9, 0x00, - 0x3e, 0x40, 0x0f, 0xa8, 0x03, 0x6c, 0x00, 0xfa, - 0x00, 0x3c, 0xc0, 0x0c, 0xb0, 0x03, 0x24, 0x00, - 0xf3, 0x00, 0x36, 0x81, 0x0f, 0xb0, 0x13, 0x28, - 0x00, 0x7a, 0x01, 0x3e, 0x80, 0x0f, 0xa0, 0x07, - 0xec, 0x00, 0xfb, 0x00, 0x32, 0x40, 0x0e, 0xa0, - 0x03, 0xec, 0x00, 0x98, 0x00, 0x32, 0x80, 0x84, - 0x90, 0x03, 0x2a, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc8, 0x91, 0x9c, 0x00, 0xb7, 0x00, 0x6d, - 0xc0, 0x0d, 0x50, 0x02, 0x18, 0x00, 0xd5, 0x00, - 0x2d, 0xc0, 0xcb, 0x70, 0x13, 0x5c, 0x00, 0xb6, - 0x01, 0x2d, 0x40, 0x02, 0x70, 0x0a, 0x1c, 0x00, - 0xb7, 0x00, 0xa1, 0xed, 0x09, 0x00, 0x09, 0x01, - 0x80, 0x0b, 0x70, 0x02, 0x14, 0x00, 0x97, 0x00, - 0x2d, 0xc0, 0x0b, 0x60, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0xa9, 0x80, 0x0e, 0x40, 0x02, 0xd4, 0x00, - 0xb7, 0x00, 0x20, 0x80, 0x08, 0xf0, 0x02, 0x12, - 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0x9e, 0x01, 0xa5, 0xc0, 0x6d, 0xe0, 0x08, 0x7c, - 0x02, 0xba, 0x00, 0x97, 0x80, 0x2d, 0x60, 0x0b, - 0x78, 0x26, 0x1a, 0x00, 0xb7, 0x80, 0x27, 0xe2, - 0x08, 0xf8, 0x02, 0x1e, 0x00, 0xb7, 0x8c, 0x25, - 0xe2, 0x0b, 0x78, 0x82, 0x1a, 0x00, 0xb6, 0x88, - 0x2d, 0xa0, 0x0b, 0x78, 0x02, 0x9e, 0x00, 0xbf, - 0xc1, 0x29, 0x60, 0x02, 0x78, 0x82, 0xda, 0x00, - 0xb2, 0x82, 0xa5, 0xf0, 0x08, 0x78, 0x02, 0x30, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, - 0xcc, 0x00, 0xb3, 0x01, 0x2c, 0xd2, 0x09, 0x3c, - 0x42, 0x08, 0x14, 0x93, 0x00, 0x2c, 0xe4, 0x0b, - 0x30, 0x02, 0x48, 0x20, 0xb3, 0x84, 0x2c, 0xe0, - 0x0a, 0x10, 0x1a, 0x0c, 0x00, 0xb3, 0x00, 0x20, - 0xc0, 0x0b, 0x30, 0x02, 0x0c, 0x00, 0x93, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xbb, - 0x42, 0x28, 0x20, 0x0a, 0x32, 0x02, 0xe8, 0x00, - 0xb3, 0x60, 0x22, 0xe0, 0x08, 0x35, 0x0a, 0x12, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, - 0xa8, 0x00, 0xee, 0x80, 0x0d, 0xb3, 0x88, 0xec, - 0x03, 0xbb, 0x88, 0xda, 0x00, 0x3f, 0xb0, 0x0f, - 0xe4, 0x0b, 0x38, 0x00, 0xbe, 0xe0, 0x3f, 0x90, - 0x0c, 0xe4, 0x43, 0x3b, 0x80, 0xf6, 0xc0, 0x37, - 0x90, 0x0f, 0xe0, 0x0b, 0x39, 0x20, 0xfe, 0x40, - 0x3f, 0x90, 0x0f, 0xe4, 0x83, 0xe8, 0x00, 0x3e, - 0x00, 0x3b, 0x88, 0x0e, 0xec, 0x03, 0xf8, 0x80, - 0xfe, 0x40, 0x33, 0xa0, 0x2c, 0xe8, 0x03, 0x3a, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x0a, 0x01, 0x48, 0x00, 0xe0, 0x00, 0xf8, - 0x84, 0x3e, 0x00, 0x0f, 0x86, 0x03, 0xe3, 0x00, - 0xf8, 0x13, 0x3e, 0x20, 0x0f, 0x8c, 0x43, 0xa1, - 0x44, 0x78, 0xc0, 0x3e, 0x21, 0x0f, 0x87, 0x03, - 0xe2, 0x00, 0xf8, 0x80, 0x3e, 0x20, 0x0f, 0x84, - 0x03, 0xe3, 0x00, 0xd8, 0x80, 0x3e, 0x31, 0x0f, - 0x88, 0x03, 0xe1, 0x08, 0xf8, 0x0c, 0x26, 0x10, - 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf0, 0x40, 0x3e, - 0x00, 0x0f, 0x00, 0x93, 0xd2, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, - 0x20, 0x3e, 0x64, 0x2d, 0x98, 0x03, 0xe6, 0x00, - 0xe9, 0x22, 0x3e, 0x68, 0x0f, 0x91, 0x03, 0xe4, - 0x00, 0xf9, 0x20, 0x32, 0x60, 0x0c, 0x98, 0x03, - 0x26, 0x00, 0xc9, 0x20, 0x32, 0x70, 0x8f, 0x90, - 0x83, 0x26, 0x40, 0xf9, 0x40, 0x3a, 0x70, 0x0f, - 0x91, 0x03, 0xa4, 0x00, 0xf9, 0x40, 0x32, 0x68, - 0x0e, 0x90, 0x03, 0xe6, 0x22, 0xc9, 0x10, 0x3a, - 0x40, 0x0c, 0x98, 0x02, 0x82, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0x64, 0x00, 0xb9, - 0x00, 0x2e, 0x70, 0x08, 0x9a, 0x03, 0x86, 0x80, - 0x89, 0xc0, 0x2e, 0x50, 0x8b, 0x98, 0x42, 0xe7, - 0x44, 0xb1, 0x00, 0x28, 0x44, 0x28, 0x10, 0x03, - 0x46, 0x02, 0x89, 0x08, 0x22, 0x70, 0x0b, 0x10, - 0x82, 0xa6, 0x80, 0xb9, 0x80, 0x2e, 0x48, 0x0b, - 0x98, 0x02, 0xe7, 0x00, 0xb9, 0x80, 0x22, 0x60, - 0x08, 0x94, 0x02, 0xe6, 0x00, 0x89, 0x00, 0x22, - 0x40, 0x08, 0x99, 0x02, 0x20, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, 0x00, 0xb9, - 0x00, 0x2a, 0x50, 0x08, 0x91, 0x02, 0xe4, 0x80, - 0xa9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x04, 0xb9, 0x40, 0x22, 0x40, 0x08, 0x91, 0x22, - 0x24, 0x82, 0xa9, 0x00, 0x22, 0x40, 0x4b, 0x90, - 0x42, 0xed, 0x09, 0x00, 0x0b, 0x01, 0x64, 0x00, - 0x99, 0x00, 0x2a, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x80, 0xb9, 0x00, 0x20, 0x40, 0x88, 0xb1, 0x02, - 0xe4, 0x40, 0x89, 0x0c, 0x2a, 0x40, 0x09, 0x90, - 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x04, 0x00, 0xb1, 0x00, 0x2e, 0x40, - 0x08, 0x10, 0x02, 0x84, 0x01, 0x81, 0x00, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xcd, 0x04, 0xb1, 0x01, - 0xa8, 0x40, 0x08, 0x90, 0x02, 0x64, 0x00, 0x89, - 0x00, 0x20, 0x60, 0x0b, 0x10, 0x02, 0xc4, 0x04, - 0xb1, 0x00, 0x2c, 0x41, 0x4b, 0x10, 0x02, 0xc4, - 0x00, 0xb1, 0x00, 0xa0, 0x50, 0x08, 0x18, 0x02, - 0xcd, 0x00, 0x81, 0x41, 0x28, 0x50, 0xe9, 0x14, - 0x02, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb8, 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x3a, 0x00, - 0x0c, 0x80, 0x03, 0xe0, 0x00, 0xea, 0x00, 0x2e, - 0x80, 0x0f, 0xa0, 0x43, 0xe0, 0x00, 0xf8, 0x00, - 0x32, 0x01, 0x0c, 0xa0, 0x03, 0x20, 0x00, 0xe8, - 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, 0x60, 0x00, - 0xf8, 0x00, 0x3a, 0x00, 0x0f, 0x80, 0x03, 0xa8, - 0x00, 0xf8, 0x00, 0x32, 0x80, 0x2e, 0x80, 0x03, - 0xe0, 0x00, 0xc8, 0x01, 0x3a, 0x01, 0x0d, 0xa0, - 0x03, 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xd8, 0x9d, 0xe4, 0x00, 0xfd, 0x40, 0x3f, 0x40, - 0x4e, 0xd0, 0x03, 0xf4, 0x00, 0xfd, 0x00, 0x3f, - 0x40, 0x8f, 0x70, 0x06, 0xf5, 0x00, 0xfd, 0x00, - 0x3f, 0x40, 0x0f, 0x70, 0x53, 0xf4, 0x00, 0xfd, - 0x01, 0xbf, 0x40, 0x8d, 0x50, 0x03, 0xb4, 0x00, - 0xfd, 0x00, 0x3f, 0x40, 0x07, 0xd0, 0x03, 0xe4, - 0x00, 0xf5, 0x2a, 0x3f, 0x40, 0x0f, 0xd2, 0x83, - 0xf5, 0x12, 0xfd, 0x40, 0x37, 0x50, 0x2e, 0xd4, - 0x03, 0xa6, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0xe4, 0x00, 0xed, 0x09, 0x00, 0x0c, - 0x01, 0xf5, 0x20, 0x33, 0x40, 0x0e, 0xd0, 0x03, - 0x34, 0x10, 0xfd, 0x00, 0x33, 0x40, 0x0f, 0x70, - 0x00, 0x34, 0x00, 0xed, 0x00, 0x33, 0x40, 0x4e, - 0x50, 0x03, 0x34, 0x00, 0xf5, 0x00, 0x03, 0x40, - 0x0f, 0xd0, 0x03, 0x74, 0x09, 0xfd, 0x00, 0x3f, - 0x40, 0x0f, 0xd0, 0x03, 0xf4, 0x0c, 0xfd, 0x00, - 0x33, 0x45, 0x0f, 0xd0, 0x43, 0xf4, 0xa0, 0x7d, - 0x30, 0x33, 0x40, 0x0c, 0xd0, 0x23, 0xc6, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0x10, 0xe0, - 0x00, 0xb8, 0x10, 0x22, 0x00, 0x08, 0xa0, 0x03, - 0x60, 0x00, 0xb8, 0x00, 0x32, 0x01, 0x4b, 0x80, - 0x02, 0x21, 0x22, 0xd8, 0x00, 0x2a, 0x00, 0x0e, - 0x80, 0x02, 0x28, 0x10, 0xb8, 0x00, 0x22, 0x00, - 0x8b, 0x80, 0x02, 0x20, 0x00, 0xb8, 0x00, 0x3a, - 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xe8, 0x20, - 0xb4, 0x00, 0x0e, 0x80, 0x86, 0xc0, 0x80, 0xb0, - 0x30, 0x36, 0x12, 0x08, 0x80, 0x82, 0xce, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0x05, 0xc4, - 0x00, 0xb9, 0x00, 0x20, 0x40, 0x0a, 0x90, 0x02, - 0x04, 0x00, 0xb1, 0x00, 0x20, 0x40, 0x8b, 0x10, - 0x02, 0x04, 0xc1, 0xa1, 0x00, 0x22, 0x60, 0x08, - 0x10, 0x02, 0x84, 0x04, 0xb9, 0x00, 0x24, 0x40, - 0x0b, 0x10, 0x02, 0x44, 0x00, 0xb1, 0x01, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x28, - 0x24, 0x40, 0x0a, 0x1a, 0x00, 0x44, 0xa0, 0xb1, - 0x20, 0x20, 0x4c, 0x28, 0x11, 0x02, 0xc2, 0x01, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, - 0x00, 0xb9, 0x08, 0x22, 0x40, 0x08, 0x90, 0x02, - 0x65, 0x10, 0xb9, 0x80, 0xa6, 0x40, 0x0b, 0xb0, - 0x22, 0x24, 0x00, 0x99, 0x00, 0x2a, 0x44, 0x0a, - 0x90, 0x08, 0xa4, 0x80, 0xb9, 0x00, 0x26, 0x40, - 0x0b, 0x90, 0x02, 0x64, 0x00, 0xb9, 0x04, 0xed, - 0x09, 0x00, 0x0d, 0x01, 0x2e, 0xc0, 0x0b, 0xb6, - 0x02, 0xe4, 0x00, 0xab, 0x00, 0xa6, 0x48, 0x0a, - 0x98, 0x02, 0xec, 0x40, 0xb9, 0x15, 0x24, 0x50, - 0x20, 0x92, 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf1, 0x40, - 0x32, 0x48, 0x0e, 0x19, 0x03, 0x26, 0x00, 0xf1, - 0x80, 0x32, 0x60, 0x0f, 0x19, 0x0a, 0x24, 0xc0, - 0xe1, 0x98, 0x32, 0x70, 0x0c, 0x1d, 0x03, 0xa7, - 0x00, 0xf9, 0x08, 0xa6, 0x62, 0x0f, 0x9e, 0x43, - 0x64, 0x80, 0xb9, 0x90, 0x3e, 0x62, 0x8f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0xa0, 0xf6, 0x60, 0x0e, - 0x90, 0x02, 0x66, 0x20, 0xf9, 0x80, 0xf2, 0x40, - 0xc4, 0x92, 0x02, 0xe8, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x68, 0x00, 0xa4, 0x00, 0xf9, 0x00, - 0xbe, 0x40, 0x0f, 0x90, 0x02, 0xe5, 0x04, 0xf9, - 0x00, 0x3a, 0x48, 0x8f, 0x90, 0x13, 0x64, 0x00, - 0xf9, 0x80, 0x3e, 0x40, 0x0e, 0x98, 0x03, 0x66, - 0x10, 0xf9, 0x00, 0x3a, 0x48, 0x0f, 0x91, 0x03, - 0xa4, 0x44, 0xf9, 0x80, 0x7a, 0x44, 0x03, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x40, 0x3e, 0x40, 0x8e, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3a, 0x42, - 0x8f, 0x90, 0x83, 0xca, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x10, 0xa0, 0x00, 0xf8, 0x00, - 0x32, 0x10, 0x0f, 0x80, 0x03, 0xe1, 0x00, 0xd8, - 0x80, 0x36, 0x20, 0x0f, 0x88, 0x03, 0xe1, 0x24, - 0xe8, 0x80, 0x3a, 0x08, 0x0c, 0x80, 0x03, 0x60, - 0x00, 0xf8, 0xc0, 0x36, 0x30, 0x0f, 0x89, 0x13, - 0xa0, 0x50, 0xf8, 0x86, 0x32, 0x20, 0x0c, 0x8c, - 0x03, 0xa2, 0x00, 0xf8, 0x18, 0x32, 0x08, 0x0c, - 0x80, 0x02, 0xe1, 0x20, 0xc0, 0x02, 0x3a, 0x00, - 0x0f, 0x80, 0x03, 0xca, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x04, 0x28, 0x00, 0xba, 0x82, - 0x21, 0xb6, 0xed, 0x09, 0x00, 0x0e, 0x01, 0x0b, - 0xe9, 0x02, 0xfa, 0x00, 0x8e, 0xc0, 0x23, 0x90, - 0x0b, 0xe4, 0x42, 0x3b, 0x00, 0xce, 0xc0, 0xa1, - 0xb0, 0x00, 0xe4, 0x02, 0x2a, 0x10, 0xb6, 0xc2, - 0x23, 0xb8, 0x0b, 0x6c, 0x02, 0xf9, 0x40, 0xbe, - 0x40, 0x23, 0x92, 0x08, 0xe4, 0x02, 0xf9, 0x00, - 0xbe, 0x80, 0x23, 0x98, 0x08, 0xec, 0x03, 0xb9, - 0x12, 0x8e, 0x54, 0x2b, 0x90, 0x0b, 0xe0, 0x02, - 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x05, 0x4c, 0x00, 0xb3, 0x80, 0x20, 0xf0, 0x0b, - 0x0c, 0x02, 0xcc, 0x00, 0x91, 0x00, 0x2c, 0xe0, - 0x8b, 0x30, 0x06, 0x6f, 0x00, 0xb3, 0x00, 0xa8, - 0xd0, 0x08, 0x00, 0x80, 0xce, 0x40, 0xb0, 0x80, - 0x20, 0xc0, 0x0b, 0x10, 0x02, 0x88, 0x00, 0xb3, - 0x10, 0x20, 0xe0, 0x88, 0x30, 0x22, 0xc4, 0x00, - 0xab, 0xc0, 0x20, 0xc0, 0x28, 0x34, 0x82, 0xcd, - 0x02, 0x83, 0x40, 0x28, 0xc0, 0x0b, 0x30, 0x02, - 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x01, 0x1c, 0x00, 0xbf, 0x40, 0x21, 0xc0, 0x0b, - 0x54, 0x02, 0xdb, 0x00, 0x85, 0x40, 0x21, 0xc2, - 0x09, 0x70, 0x02, 0x3c, 0x21, 0x87, 0x09, 0x23, - 0x50, 0x08, 0x50, 0x02, 0x94, 0x00, 0xb4, 0x08, - 0x21, 0x80, 0x03, 0x70, 0x02, 0xdc, 0x10, 0xbf, - 0x80, 0xa3, 0xe1, 0x28, 0x74, 0x02, 0xd4, 0x20, - 0xbf, 0x00, 0x21, 0xe0, 0x98, 0x74, 0x02, 0x9e, - 0x20, 0x87, 0x00, 0x29, 0x90, 0x0b, 0x74, 0x02, - 0xe8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x88, 0x1e, 0x00, 0xf7, 0x80, 0x31, 0xe0, 0x0b, - 0x58, 0x03, 0xde, 0x00, 0xd5, 0x80, 0x3d, 0xe0, - 0x0f, 0x78, 0x03, 0x5e, 0x10, 0xf7, 0x80, 0x39, - 0xe0, 0x2c, 0x78, 0x03, 0xde, 0x00, 0xf4, 0x80, - 0x31, 0xe0, 0x0f, 0x58, 0x03, 0x92, 0x00, 0xf7, - 0x82, 0x21, 0xa0, 0x0c, 0x78, 0xed, 0x09, 0x00, - 0x0f, 0x01, 0x27, 0x92, 0x00, 0xe5, 0x80, 0x31, - 0x60, 0x0c, 0x58, 0x03, 0xd6, 0x00, 0xc5, 0x82, - 0x39, 0xe0, 0x0b, 0x78, 0x03, 0xea, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0a, 0x1d, 0xac, 0x00, - 0xfb, 0x00, 0xbe, 0xc0, 0x0f, 0x90, 0x03, 0xcc, - 0x00, 0x31, 0x00, 0x3e, 0xc0, 0x07, 0xb0, 0x03, - 0xc8, 0x00, 0xe3, 0x00, 0x3c, 0x40, 0x0f, 0xb0, - 0x03, 0x64, 0x04, 0xf8, 0x01, 0xba, 0x80, 0x0f, - 0xb0, 0x23, 0xe4, 0x08, 0xf3, 0x00, 0x3c, 0x80, - 0x0f, 0xb0, 0x03, 0xe4, 0x00, 0xd3, 0x00, 0x3e, - 0x40, 0x0f, 0xa0, 0x03, 0xa4, 0x04, 0xf9, 0x00, - 0x36, 0x80, 0x0f, 0x90, 0x03, 0xc2, 0x06, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xfe, 0x00, - 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xe8, 0x03, 0xfe, - 0x00, 0xcf, 0x80, 0x3f, 0xa0, 0x07, 0xf8, 0x07, - 0xb8, 0x40, 0xef, 0x80, 0x3f, 0xe0, 0x0c, 0x58, - 0x03, 0x36, 0x00, 0xfd, 0x80, 0x33, 0xe4, 0x4f, - 0xf9, 0x43, 0x3a, 0x48, 0x7e, 0x91, 0x37, 0xe8, - 0x0f, 0xe9, 0x23, 0x7a, 0x00, 0xdf, 0x00, 0x3f, - 0xe0, 0x0d, 0xd8, 0x02, 0xfa, 0x00, 0xef, 0x80, - 0x33, 0xe4, 0x0f, 0xf8, 0x03, 0xc0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, 0x9c, 0x00, - 0xb7, 0x18, 0x2d, 0xc0, 0x0b, 0x44, 0x02, 0xd8, - 0x00, 0x87, 0x00, 0x2d, 0x01, 0x0b, 0x70, 0x06, - 0x10, 0x80, 0x87, 0x00, 0x2d, 0x83, 0x08, 0x51, - 0x02, 0x14, 0x00, 0xb5, 0x20, 0x21, 0x80, 0x4e, - 0x64, 0x02, 0x15, 0x41, 0x86, 0x30, 0x2d, 0xc0, - 0x0b, 0x60, 0x86, 0xd4, 0x00, 0xb7, 0x12, 0x7b, - 0xc0, 0x28, 0x50, 0x02, 0xd8, 0x80, 0x8f, 0x20, - 0xb5, 0x00, 0x0b, 0x64, 0x02, 0xea, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, - 0xb5, 0x00, 0x2d, 0x02, 0x0b, 0x50, 0x02, 0xdd, - 0xed, 0x09, 0x00, 0x10, 0x01, 0x02, 0x86, 0x00, - 0x2d, 0x04, 0x0b, 0x71, 0x02, 0x18, 0x40, 0xa7, - 0x00, 0x2d, 0xc4, 0x08, 0x70, 0x02, 0x14, 0x00, - 0xb5, 0x02, 0xa1, 0xc0, 0x19, 0xf0, 0x12, 0x34, - 0x41, 0x86, 0x08, 0x25, 0x88, 0x4b, 0x60, 0x22, - 0xd0, 0x00, 0x95, 0x10, 0x2d, 0x82, 0x09, 0x50, - 0x02, 0xd4, 0x08, 0xa4, 0x40, 0x21, 0xc1, 0x1b, - 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x14, 0xcc, 0x00, 0xb1, 0x80, 0x6c, - 0x60, 0x0b, 0x10, 0x02, 0xcc, 0x40, 0x83, 0x00, - 0x2c, 0x11, 0x0b, 0x38, 0x82, 0x28, 0x00, 0x83, - 0x21, 0x2c, 0x10, 0x08, 0x38, 0x42, 0x04, 0x90, - 0xb3, 0x40, 0x20, 0x20, 0x0a, 0x34, 0x02, 0x04, - 0x21, 0x80, 0x88, 0x2c, 0xa4, 0x0b, 0x28, 0x02, - 0xc4, 0x00, 0xb3, 0xf0, 0x28, 0xb0, 0x00, 0x01, - 0x02, 0xc4, 0x00, 0x88, 0x00, 0x20, 0x20, 0x0b, - 0x0c, 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x15, 0xac, 0x00, 0xfb, 0x80, 0x2e, - 0x60, 0x0f, 0x82, 0x03, 0xe4, 0x00, 0xc9, 0x00, - 0x3e, 0x60, 0x0f, 0x36, 0x08, 0x28, 0x00, 0xe3, - 0x80, 0x3c, 0xe4, 0x0c, 0x24, 0x0b, 0x0c, 0x24, - 0xf0, 0x42, 0x32, 0xfd, 0x8f, 0x30, 0x83, 0x2b, - 0x00, 0xda, 0xc0, 0x36, 0xd0, 0x0f, 0x28, 0x03, - 0x6c, 0x04, 0xdb, 0x81, 0x3c, 0xb0, 0x0d, 0x1c, - 0x03, 0xce, 0x08, 0xea, 0xa0, 0x22, 0x56, 0x0f, - 0xbc, 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x00, 0xec, 0x00, 0xf3, 0x00, 0x3e, - 0x50, 0x0f, 0x90, 0x03, 0xe0, 0x00, 0xfb, 0x00, - 0x3e, 0x79, 0x0f, 0xb4, 0x13, 0x69, 0x04, 0xfb, - 0x80, 0x3e, 0x40, 0x8f, 0xb3, 0x03, 0xe4, 0x00, - 0xf8, 0x44, 0x3e, 0x90, 0x0e, 0xb4, 0x83, 0xef, - 0x08, 0xfa, 0x00, 0x3e, 0xc1, 0x0f, 0xa0, 0x03, - 0xe4, 0x00, 0xfb, 0xed, 0x09, 0x00, 0x11, 0x01, - 0x40, 0x3a, 0x90, 0x0f, 0x90, 0x83, 0xec, 0x40, - 0xf8, 0x00, 0x3e, 0x50, 0x0b, 0x31, 0x03, 0xe0, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, - 0xfc, 0x00, 0xff, 0x00, 0x33, 0x48, 0x0c, 0xc0, - 0x03, 0xf6, 0x44, 0xfd, 0x94, 0x3f, 0x40, 0x0f, - 0xd0, 0x03, 0x28, 0x00, 0xcf, 0x90, 0x33, 0xc0, - 0x0a, 0xfc, 0x0b, 0x34, 0x00, 0xcc, 0xaa, 0x33, - 0xc4, 0x0f, 0xfa, 0x03, 0x32, 0x14, 0xce, 0xc0, - 0x3f, 0xa2, 0x0f, 0xe9, 0x20, 0x3a, 0x00, 0xfd, - 0x00, 0x3f, 0x6b, 0x0c, 0xd0, 0x03, 0x2a, 0x00, - 0xce, 0x00, 0x31, 0x64, 0x0c, 0xe1, 0xc3, 0x80, - 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, - 0x6c, 0x00, 0xbb, 0x00, 0x28, 0x70, 0x0a, 0x94, - 0x02, 0xec, 0x10, 0xb9, 0x01, 0x2e, 0x34, 0x0b, - 0x90, 0x02, 0x2a, 0x10, 0xab, 0x46, 0x22, 0x40, - 0x08, 0xb0, 0x22, 0x26, 0x40, 0x88, 0x60, 0x22, - 0x81, 0x0b, 0xbc, 0x02, 0x87, 0x00, 0x8a, 0xc0, - 0x2e, 0xb1, 0x8b, 0xa4, 0x12, 0xa5, 0xc0, 0xbb, - 0x80, 0x2e, 0x41, 0x08, 0x8c, 0x02, 0x2b, 0x40, - 0xa8, 0xc4, 0x22, 0x72, 0x8a, 0x80, 0x02, 0x20, - 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, - 0x2c, 0x00, 0xbb, 0x00, 0x22, 0xd0, 0x08, 0xb0, - 0x02, 0xe4, 0x00, 0xbb, 0x00, 0x2e, 0x10, 0x0b, - 0xb2, 0x02, 0x23, 0x00, 0x99, 0x08, 0x26, 0xc0, - 0x0a, 0xb0, 0x22, 0xe4, 0x00, 0x89, 0x04, 0x02, - 0x90, 0x0b, 0xb0, 0x12, 0x2c, 0x90, 0x8a, 0x08, - 0x2e, 0x88, 0x4b, 0xa0, 0x40, 0xac, 0x00, 0xb9, - 0x80, 0x2e, 0x02, 0x88, 0x8c, 0x00, 0x60, 0x00, - 0x8b, 0x18, 0x22, 0x80, 0x00, 0x90, 0x02, 0xa0, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x0c, 0x00, 0xb3, 0x00, 0x2a, 0xc0, 0x0a, 0x10, - 0x02, 0xc8, 0x00, 0xb3, 0x04, 0x2c, 0xed, 0x09, - 0x00, 0x12, 0x01, 0x00, 0x4b, 0xb0, 0x0a, 0x00, - 0x08, 0xb9, 0x00, 0x26, 0x80, 0x0a, 0xb0, 0x22, - 0xc4, 0x18, 0x88, 0x00, 0x00, 0x80, 0x4b, 0xb0, - 0x12, 0x8c, 0x00, 0x82, 0x00, 0x2c, 0x80, 0x0b, - 0xa0, 0x02, 0x84, 0x00, 0xb0, 0x00, 0x2e, 0x00, - 0x2a, 0x80, 0x00, 0xe0, 0x00, 0xa1, 0x00, 0x20, - 0x00, 0x88, 0x00, 0x02, 0x03, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xf9, - 0x00, 0x32, 0x00, 0x0c, 0x90, 0x03, 0xe4, 0x00, - 0xfa, 0x00, 0x3e, 0x00, 0x0f, 0x90, 0x03, 0x20, - 0x00, 0xdb, 0x00, 0xb6, 0xc1, 0x0e, 0xb0, 0x03, - 0xe4, 0x00, 0xc9, 0x00, 0xb2, 0xc0, 0x0f, 0xb0, - 0x03, 0x24, 0x00, 0xca, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x23, 0x28, 0x08, 0xf9, 0x00, 0x3e, 0x00, - 0x0c, 0x80, 0x03, 0x60, 0x00, 0xca, 0x00, 0xb2, - 0x80, 0x0c, 0x80, 0x43, 0x80, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, 0xfd, - 0x00, 0x3f, 0x00, 0x0f, 0xd0, 0x03, 0xdc, 0x00, - 0x7f, 0x00, 0x3f, 0x00, 0x4f, 0x40, 0x53, 0xf0, - 0x00, 0xee, 0x00, 0x39, 0x00, 0x8d, 0xf0, 0x03, - 0x34, 0x06, 0xf5, 0x00, 0x3f, 0x80, 0x0f, 0x70, - 0x63, 0xd4, 0x02, 0xfe, 0x00, 0x3f, 0x80, 0x8f, - 0xe0, 0x03, 0xf4, 0x00, 0xfc, 0x02, 0x3f, 0x00, - 0x0d, 0xc0, 0x03, 0x30, 0x00, 0xfc, 0x00, 0x3f, - 0x00, 0x2f, 0xc0, 0x03, 0xe8, 0x06, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc2, 0x05, 0xfc, 0xe0, 0xec, - 0x10, 0x37, 0xd8, 0x0f, 0xc0, 0x03, 0xf0, 0x08, - 0xfe, 0x11, 0x33, 0xc8, 0x0f, 0xf2, 0x03, 0x70, - 0x00, 0xfc, 0x00, 0x3f, 0x0a, 0x0c, 0xc2, 0x03, - 0xb0, 0x80, 0xec, 0x00, 0x33, 0x42, 0x0c, 0x40, - 0x03, 0x30, 0x00, 0xcc, 0x00, 0x39, 0x0a, 0x0f, - 0xc0, 0x03, 0xb0, 0x20, 0xcc, 0x00, 0x3b, 0x00, - 0x4c, 0xed, 0x09, 0x00, 0x13, 0x01, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x2c, 0x3b, 0x0a, 0x0c, 0xf0, - 0x03, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc2, 0x08, 0xbd, 0x00, 0x8b, 0x20, 0x23, 0xd0, - 0x4b, 0xb2, 0x82, 0xec, 0x00, 0xb8, 0x20, 0x23, - 0xc4, 0x0b, 0xf5, 0x02, 0xcc, 0x80, 0xb8, 0x40, - 0x2e, 0x00, 0x2d, 0x80, 0x02, 0x20, 0x02, 0xc8, - 0x00, 0xa2, 0x00, 0x8a, 0x90, 0x02, 0x21, 0x00, - 0x88, 0x40, 0x22, 0x50, 0x08, 0x80, 0x0a, 0x20, - 0x12, 0xa8, 0x01, 0x2a, 0x14, 0x28, 0xb0, 0x12, - 0xec, 0x00, 0x9f, 0x48, 0x2e, 0x48, 0x0a, 0xb0, - 0x02, 0x60, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xca, 0x44, 0xcc, 0x10, 0xb3, 0x21, 0x20, 0xcc, - 0x8b, 0x30, 0x02, 0xcc, 0xa0, 0xb3, 0x22, 0x28, - 0xc0, 0x89, 0x30, 0x02, 0xce, 0x20, 0xb0, 0x40, - 0x2c, 0x00, 0x08, 0x04, 0x0a, 0x00, 0x40, 0x80, - 0x10, 0x20, 0x40, 0x08, 0x90, 0x02, 0x81, 0x0e, - 0xa0, 0x43, 0xa8, 0x40, 0x88, 0x01, 0x02, 0x00, - 0x00, 0x80, 0x40, 0xa0, 0x00, 0x0a, 0x30, 0x02, - 0x8c, 0x00, 0xb3, 0x20, 0x2c, 0x0a, 0x08, 0x30, - 0x02, 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x05, 0xac, 0x00, 0x93, 0x20, 0x22, 0xc0, - 0x0b, 0xb0, 0x82, 0xe8, 0x00, 0xb8, 0x02, 0x22, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xb9, 0x00, - 0x2e, 0xc8, 0x09, 0x80, 0x42, 0xa8, 0x00, 0xb9, - 0x40, 0x22, 0xe0, 0x28, 0x90, 0x1a, 0x28, 0x00, - 0x8a, 0x10, 0x22, 0xc0, 0x0a, 0xb0, 0x12, 0x20, - 0x01, 0x0a, 0x40, 0x2a, 0x04, 0x4a, 0xb1, 0x42, - 0xec, 0x00, 0x9b, 0x04, 0x2e, 0x60, 0x0a, 0xb0, - 0x02, 0x70, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x15, 0xec, 0x00, 0xfb, 0x48, 0xb2, 0xc0, - 0x0f, 0xb4, 0x03, 0xee, 0x00, 0xfb, 0x48, 0x32, - 0xc0, 0x0f, 0xb0, 0x03, 0xed, 0x09, 0x00, 0x14, - 0x01, 0x6c, 0x00, 0xf8, 0x90, 0x3e, 0x29, 0x0c, - 0x88, 0x83, 0xa1, 0x80, 0xe8, 0xc0, 0x32, 0x30, - 0x08, 0x98, 0x09, 0xa0, 0x80, 0xc8, 0x00, 0x2a, - 0x64, 0x0f, 0x8c, 0x03, 0x23, 0x00, 0xc8, 0xc0, - 0x3a, 0x00, 0x0e, 0xba, 0x03, 0xec, 0x20, 0xbb, - 0x00, 0x3a, 0x38, 0x0c, 0xb0, 0x03, 0xd0, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x9c, - 0x10, 0xed, 0x80, 0x3f, 0xc0, 0x0f, 0xc2, 0x03, - 0xfc, 0x89, 0xf3, 0x10, 0xbf, 0xc0, 0x8f, 0xf0, - 0x83, 0xfd, 0x00, 0xff, 0x80, 0x3d, 0xc0, 0x0e, - 0x71, 0x03, 0x56, 0x80, 0xc7, 0x21, 0x3c, 0x80, - 0x0f, 0xda, 0x23, 0xd6, 0x40, 0xf5, 0x80, 0x3f, - 0xc0, 0x0d, 0x7a, 0x03, 0x5d, 0x00, 0xf7, 0x94, - 0x75, 0xe0, 0x0d, 0xd8, 0x03, 0xfc, 0x60, 0xdb, - 0x00, 0x3e, 0x40, 0x0f, 0xf0, 0x03, 0xf8, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x44, 0x10, 0xac, - 0x00, 0xca, 0x00, 0x3e, 0xc0, 0x4f, 0xb4, 0x43, - 0xe4, 0x00, 0xd9, 0x40, 0x32, 0xc0, 0x0f, 0xb0, - 0x03, 0xe4, 0x00, 0x8a, 0x00, 0x36, 0x00, 0x0d, - 0xb6, 0x23, 0xec, 0x00, 0xca, 0x00, 0x3a, 0x40, - 0x0c, 0xb8, 0x03, 0x6c, 0xc2, 0xcb, 0x20, 0x3e, - 0x60, 0x0e, 0x80, 0x21, 0x6c, 0x04, 0xf9, 0x62, - 0x36, 0xd0, 0x0b, 0xb4, 0x83, 0xec, 0x00, 0xfb, - 0x04, 0x32, 0x20, 0x0c, 0xb0, 0x03, 0xd0, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x05, 0x3c, - 0x04, 0x8b, 0x00, 0x2f, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0x8b, 0x00, 0x23, 0xc0, 0x0b, 0xfc, - 0x42, 0xec, 0x00, 0x8b, 0x00, 0x6e, 0xc0, 0x09, - 0xb4, 0x02, 0xec, 0x30, 0x8b, 0x20, 0x22, 0xc0, - 0x08, 0x10, 0x03, 0x6d, 0x00, 0x8b, 0x40, 0x2c, - 0xc0, 0x08, 0xb0, 0x42, 0x2c, 0x02, 0x8b, 0x40, - 0x26, 0xc0, 0x0b, 0x94, 0x02, 0xee, 0x10, 0xed, - 0x09, 0x00, 0x15, 0x01, 0x4f, 0x24, 0xa2, 0x70, - 0x28, 0xb0, 0x02, 0xf2, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x04, 0x4c, 0x08, 0x83, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc8, 0x00, 0x82, - 0x00, 0x20, 0xe8, 0x4b, 0x3d, 0x22, 0x4c, 0x00, - 0xa0, 0x48, 0x24, 0x00, 0x09, 0x00, 0x40, 0xc0, - 0x02, 0x80, 0x00, 0x28, 0x40, 0x28, 0x00, 0x02, - 0x82, 0x04, 0x80, 0x00, 0x2c, 0x00, 0x28, 0x00, - 0x02, 0x40, 0x00, 0x80, 0x00, 0x24, 0x00, 0x09, - 0x34, 0x02, 0xce, 0x10, 0xb3, 0xe0, 0x22, 0x40, - 0x08, 0x30, 0x42, 0xf9, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xb0, 0x40, 0x5e, 0x02, 0x86, 0x81, - 0x6d, 0xe4, 0x0b, 0x78, 0x02, 0xd6, 0x00, 0x87, - 0x90, 0x21, 0xe2, 0x4b, 0x78, 0x06, 0xd6, 0x00, - 0x86, 0x80, 0x2d, 0x20, 0x09, 0x78, 0x02, 0xce, - 0x00, 0x02, 0x80, 0x21, 0x60, 0x08, 0xd8, 0x2a, - 0x4e, 0x00, 0x87, 0x80, 0x2d, 0x64, 0x02, 0x08, - 0x02, 0x8e, 0x40, 0x95, 0x80, 0x6d, 0xe0, 0x4b, - 0x79, 0x06, 0xda, 0x28, 0x87, 0x80, 0x21, 0x70, - 0x08, 0x78, 0x00, 0xc8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x18, 0x6c, 0x00, 0xc1, 0x00, - 0x3c, 0xc4, 0x0f, 0x00, 0x03, 0xec, 0x02, 0xd3, - 0x00, 0xb0, 0xc4, 0x0f, 0x30, 0x03, 0xcc, 0x40, - 0xe3, 0x50, 0x24, 0xc8, 0x0d, 0x32, 0x01, 0xc4, - 0x00, 0xc3, 0x00, 0x38, 0xd0, 0x0c, 0x30, 0x03, - 0xc4, 0x50, 0xc1, 0x10, 0x3c, 0xc4, 0x0a, 0x31, - 0x03, 0x4c, 0x00, 0xf3, 0x00, 0x34, 0xd4, 0x0f, - 0x31, 0x03, 0xcc, 0x00, 0x73, 0x10, 0x20, 0x44, - 0x0c, 0x30, 0x01, 0xd2, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x40, 0xff, 0x00, - 0x3f, 0xc5, 0x0f, 0xf1, 0x03, 0xf8, 0x00, 0xff, - 0x00, 0x3f, 0xc2, 0x0f, 0xf0, 0xa3, 0xfc, 0x00, - 0xdf, 0x04, 0xed, 0x09, 0x00, 0x16, 0x01, 0x3f, - 0xc0, 0x0f, 0xf0, 0x07, 0xfc, 0x00, 0xff, 0x10, - 0x3f, 0xc0, 0x0c, 0xd0, 0x03, 0xfc, 0x40, 0xff, - 0x01, 0x3f, 0xc4, 0x0d, 0xf1, 0x43, 0x7c, 0x00, - 0xcf, 0x10, 0x17, 0xc4, 0x0f, 0xf1, 0x43, 0xfc, - 0x40, 0xdf, 0x10, 0x3f, 0x44, 0x0f, 0xf0, 0x03, - 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0xac, 0x80, 0xfb, 0x00, 0x3e, 0xca, 0x0c, - 0xb8, 0x0b, 0x2c, 0x00, 0xfb, 0x02, 0x22, 0xc8, - 0x0f, 0xb0, 0x03, 0x6c, 0x00, 0xf9, 0x00, 0x3e, - 0xc0, 0x0f, 0x88, 0x03, 0x68, 0x04, 0xf9, 0x00, - 0x3c, 0xc0, 0x06, 0x90, 0x03, 0xe8, 0x04, 0xfa, - 0x00, 0x3e, 0xe0, 0x0c, 0xb0, 0x03, 0xe2, 0x00, - 0xea, 0x80, 0x3a, 0x00, 0x0f, 0xa0, 0x03, 0x06, - 0x00, 0xfb, 0x0e, 0x3e, 0xc0, 0x0f, 0xb0, 0x13, - 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc8, - 0x98, 0x9d, 0x20, 0xb7, 0x03, 0x2d, 0xc8, 0x0c, - 0xf0, 0x02, 0x1c, 0x00, 0xb7, 0x02, 0x21, 0xcc, - 0x0f, 0x73, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x30, 0x02, 0x1c, 0x00, 0x17, 0x00, - 0x2d, 0xc0, 0x08, 0x50, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x25, 0xc0, 0x0f, 0x70, 0x02, 0xcc, 0x08, - 0x87, 0x00, 0x29, 0xc0, 0x0b, 0xf0, 0x43, 0xd0, - 0x00, 0x87, 0x40, 0x25, 0xc0, 0x8b, 0x70, 0x02, - 0x52, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x9e, 0x00, 0xb7, 0x80, 0x2d, 0xe4, 0x09, - 0x78, 0x82, 0x5e, 0x00, 0xb7, 0x80, 0x21, 0xe8, - 0x0b, 0x7a, 0x06, 0x5e, 0x10, 0xb7, 0x81, 0x2d, - 0xe0, 0x4b, 0x78, 0x10, 0xde, 0x28, 0xb7, 0x81, - 0x2f, 0xe0, 0x1a, 0x7c, 0x02, 0xde, 0x00, 0xb7, - 0xc2, 0x2c, 0xe0, 0x18, 0x78, 0x02, 0xde, 0x00, - 0xa3, 0x88, 0x2d, 0xe0, 0x0b, 0x68, 0x02, 0x5e, - 0x00, 0x97, 0x84, 0x2d, 0xe0, 0xed, 0x09, 0x00, - 0x17, 0x01, 0x0b, 0x78, 0x02, 0xf0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x68, 0x04, 0xcc, 0x00, - 0xb0, 0x80, 0x2c, 0xc0, 0x08, 0x0e, 0x02, 0x47, - 0x60, 0xb3, 0x90, 0x20, 0xc0, 0x5b, 0x30, 0x02, - 0xe6, 0x00, 0xb3, 0x40, 0x2c, 0xd0, 0x0b, 0x32, - 0x02, 0x8e, 0x80, 0x93, 0x40, 0x6c, 0xf0, 0x08, - 0x10, 0x02, 0x4f, 0x00, 0xb3, 0x80, 0x24, 0xd0, - 0x0b, 0x38, 0x82, 0xce, 0x00, 0xa3, 0x00, 0x24, - 0xd8, 0x4b, 0x30, 0x22, 0xce, 0x40, 0x83, 0x00, - 0x26, 0xe0, 0x0b, 0x30, 0x02, 0x52, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x15, 0xe8, 0x00, - 0xfe, 0xc8, 0x3e, 0x80, 0x0d, 0xec, 0x03, 0x78, - 0x00, 0xfe, 0x02, 0x32, 0x80, 0x0f, 0xa0, 0x03, - 0x7b, 0x80, 0xfe, 0x20, 0x3f, 0x88, 0x0f, 0xe2, - 0x03, 0xf8, 0x00, 0xfe, 0x20, 0x3d, 0x80, 0x4e, - 0x60, 0x43, 0xfa, 0x80, 0xfe, 0x40, 0x1f, 0xa0, - 0x0c, 0xee, 0x03, 0xf8, 0x00, 0xee, 0x00, 0x3f, - 0x80, 0x07, 0xe1, 0x83, 0x78, 0x00, 0xda, 0x00, - 0x2f, 0xa8, 0x0b, 0xa0, 0x03, 0xfa, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0x80, 0x00, - 0xf8, 0x08, 0x2c, 0x00, 0x2f, 0x80, 0x03, 0xa0, - 0x04, 0xf0, 0x06, 0xb6, 0x10, 0x06, 0x00, 0x03, - 0xe2, 0x00, 0x78, 0x00, 0x3e, 0x00, 0xcb, 0x80, - 0x03, 0x60, 0x01, 0xd8, 0x00, 0x3e, 0x06, 0x0f, - 0x82, 0x03, 0xe0, 0x80, 0xf8, 0x00, 0x0e, 0x07, - 0x1e, 0x80, 0x23, 0xe0, 0x61, 0xd8, 0x00, 0x3a, - 0x04, 0x0f, 0x80, 0x03, 0x61, 0x01, 0xf0, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0x52, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xa4, 0x08, - 0xd9, 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x63, 0xe4, - 0x00, 0xf9, 0x08, 0x30, 0x60, 0x0d, 0x90, 0x03, - 0xa4, 0x00, 0xc9, 0x48, 0x3e, 0x43, 0x49, 0x90, - 0xed, 0x09, 0x00, 0x18, 0x01, 0x03, 0xe4, 0x00, - 0xf1, 0x0a, 0x36, 0x48, 0x0d, 0x90, 0x03, 0x04, - 0x00, 0xd9, 0x08, 0x0e, 0x41, 0x0f, 0x90, 0x43, - 0xe5, 0x00, 0xf9, 0x09, 0x3e, 0x41, 0x8f, 0x98, - 0x23, 0x24, 0x04, 0x79, 0x04, 0x32, 0x40, 0x8c, - 0x90, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x04, 0x64, 0x00, 0x89, 0x05, 0x2e, - 0x40, 0x28, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, - 0x36, 0x58, 0x08, 0x92, 0x00, 0x24, 0x08, 0x89, - 0x80, 0x2e, 0x62, 0x09, 0x90, 0x12, 0xe4, 0x20, - 0xb9, 0x08, 0x22, 0x60, 0x08, 0x90, 0x13, 0xe4, - 0x00, 0x89, 0x00, 0x26, 0x40, 0x4b, 0x90, 0x82, - 0xe4, 0x21, 0xb9, 0x00, 0x2e, 0x42, 0x0b, 0x91, - 0x42, 0xa5, 0x20, 0xb9, 0x00, 0x22, 0x40, 0x08, - 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x05, 0x24, 0x00, 0x99, 0x00, 0x2e, - 0x40, 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, - 0x22, 0x44, 0x08, 0x98, 0x02, 0x64, 0x00, 0x99, - 0x00, 0x26, 0x48, 0x09, 0x90, 0x42, 0xe4, 0x00, - 0x89, 0x00, 0x26, 0x40, 0x29, 0x90, 0x46, 0xa4, - 0x11, 0x9b, 0x00, 0x2e, 0x40, 0x08, 0xb0, 0x06, - 0xec, 0x00, 0x89, 0x00, 0x2e, 0x40, 0x0b, 0x10, - 0x02, 0xa6, 0x00, 0xb9, 0x20, 0x22, 0x40, 0x08, - 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x14, 0x05, 0xa0, 0x81, 0x40, 0x2c, - 0x50, 0x18, 0x14, 0x02, 0xc5, 0x14, 0xb1, 0x44, - 0x24, 0x40, 0x08, 0x10, 0x02, 0x45, 0x00, 0x91, - 0x00, 0x2c, 0x40, 0x09, 0x10, 0x02, 0xc4, 0x01, - 0xb1, 0x00, 0x22, 0x40, 0x08, 0x98, 0x02, 0xc4, - 0x18, 0x81, 0x00, 0x64, 0x60, 0x0b, 0x10, 0x02, - 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x14, - 0x02, 0x84, 0x00, 0xb3, 0x40, 0x20, 0xd0, 0x40, - 0x10, 0x02, 0xc2, 0xed, 0x09, 0x00, 0x19, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0d, - 0x60, 0x80, 0xd8, 0x00, 0x3c, 0x00, 0x0c, 0x80, - 0x03, 0xe0, 0x00, 0xf0, 0x00, 0x32, 0x00, 0x0d, - 0x80, 0x0b, 0xe0, 0x02, 0xd8, 0x00, 0x26, 0x00, - 0x0d, 0x80, 0x63, 0xe0, 0x00, 0xd8, 0x00, 0x16, - 0x00, 0x0d, 0x80, 0x03, 0x20, 0x00, 0xd8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xd8, - 0x01, 0x3e, 0x00, 0xcf, 0x80, 0x03, 0x20, 0x00, - 0xf8, 0x00, 0x32, 0x00, 0x2c, 0x80, 0x03, 0xee, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x91, - 0xe4, 0x00, 0xfd, 0x00, 0x3e, 0x50, 0x05, 0xd0, - 0x03, 0xf4, 0x00, 0xfd, 0x40, 0x3e, 0x50, 0x2f, - 0x94, 0x43, 0xb4, 0x00, 0xed, 0x40, 0x3f, 0x50, - 0x0f, 0xd4, 0x03, 0xf5, 0x00, 0xbd, 0x40, 0x3f, - 0x50, 0x2b, 0xd0, 0x33, 0x75, 0x00, 0xfd, 0x40, - 0x37, 0x50, 0x0b, 0xd4, 0x03, 0xf5, 0x08, 0xfd, - 0x42, 0x27, 0x50, 0x8b, 0xd4, 0x63, 0xf5, 0x08, - 0xb9, 0x41, 0xbf, 0x50, 0x0f, 0x90, 0x03, 0xe6, - 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, - 0xe5, 0xa0, 0xd9, 0x40, 0x32, 0x40, 0x0c, 0x94, - 0x03, 0x24, 0x40, 0xc9, 0x31, 0x39, 0x48, 0x6c, - 0xd0, 0x03, 0x24, 0x00, 0xf9, 0x00, 0xb2, 0x40, - 0x0c, 0x92, 0x81, 0xe4, 0x08, 0xd9, 0x08, 0x32, - 0x41, 0x0f, 0x10, 0x03, 0xa4, 0x80, 0xf9, 0x20, - 0x32, 0x42, 0x0c, 0x90, 0xa3, 0xa4, 0x20, 0xf9, - 0x00, 0x3e, 0x40, 0x0c, 0xd0, 0x03, 0xd4, 0x00, - 0xfd, 0x40, 0x3f, 0x40, 0x0c, 0x90, 0x03, 0xc6, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, - 0xe0, 0x00, 0x88, 0x00, 0x22, 0x0a, 0x0d, 0x80, - 0x42, 0x20, 0x02, 0x08, 0x72, 0x3e, 0x10, 0x08, - 0x84, 0x0a, 0x28, 0x80, 0xb8, 0x04, 0x22, 0x14, - 0xa2, 0x84, 0x02, 0xe0, 0x00, 0x48, 0xed, 0x09, - 0x00, 0x1a, 0x01, 0x40, 0x22, 0x94, 0x09, 0x80, - 0x42, 0x20, 0x00, 0x98, 0x00, 0x22, 0x00, 0x28, - 0x80, 0x02, 0x20, 0x00, 0xb8, 0x01, 0x2f, 0x00, - 0x0e, 0x82, 0x02, 0xe1, 0x00, 0xb0, 0x42, 0x2e, - 0x18, 0x08, 0x80, 0x02, 0xce, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x84, 0x80, 0x91, - 0x20, 0x20, 0x50, 0x0b, 0x12, 0x12, 0x26, 0x80, - 0x81, 0x00, 0x20, 0x44, 0x09, 0x14, 0x02, 0x04, - 0x30, 0xb5, 0xc0, 0x21, 0x60, 0x09, 0x58, 0x02, - 0xd7, 0x00, 0x95, 0x80, 0x21, 0x41, 0x0b, 0x50, - 0x02, 0x17, 0x00, 0xb5, 0xc4, 0x69, 0x41, 0x0a, - 0x58, 0x02, 0x96, 0x00, 0xb5, 0xc0, 0x2d, 0x70, - 0x0a, 0x14, 0x82, 0xc5, 0x00, 0xb3, 0x60, 0x2c, - 0x52, 0x08, 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x04, 0xa4, 0x00, 0x89, - 0x08, 0x22, 0x40, 0x29, 0x12, 0x82, 0x26, 0x00, - 0x89, 0x00, 0x2e, 0x40, 0x48, 0x90, 0x02, 0x24, - 0x04, 0xb9, 0x00, 0xab, 0x40, 0x09, 0xd1, 0x02, - 0xf4, 0x40, 0x9d, 0x00, 0x23, 0x48, 0x0b, 0xd0, - 0x02, 0x34, 0x00, 0x9d, 0x02, 0xa3, 0x50, 0x08, - 0xd2, 0x02, 0x34, 0x00, 0x3d, 0x20, 0x2f, 0x48, - 0x0a, 0xb0, 0x02, 0xe4, 0x80, 0xb9, 0x02, 0x0c, - 0x40, 0x08, 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x45, 0xe4, 0x00, 0xd9, - 0x90, 0x32, 0x40, 0x06, 0x98, 0x0b, 0x04, 0x08, - 0xc9, 0xe0, 0x22, 0x40, 0x0d, 0x10, 0x03, 0x27, - 0x00, 0xf9, 0x40, 0x32, 0x54, 0x0d, 0x9c, 0x43, - 0xe7, 0x00, 0xd9, 0x40, 0xb2, 0x40, 0x0f, 0x94, - 0xc3, 0xa5, 0x00, 0xf9, 0xc0, 0x3a, 0x50, 0x0e, - 0x94, 0x03, 0xa7, 0x00, 0xf9, 0xc0, 0x3e, 0x70, - 0x0e, 0x90, 0x03, 0xe7, 0x80, 0xf9, 0x00, 0x3e, - 0x40, 0x2c, 0x90, 0x03, 0xe8, 0x04, 0x70, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x1b, 0x01, 0x00, 0x00, - 0x48, 0x01, 0xa4, 0x00, 0xf9, 0x00, 0xbe, 0x40, - 0x0e, 0x90, 0x03, 0xe4, 0x08, 0xf1, 0x10, 0x3e, - 0x40, 0x0f, 0x90, 0x83, 0xe6, 0x80, 0xf9, 0xa0, - 0x36, 0x60, 0x4e, 0x90, 0x43, 0xc6, 0x00, 0xe9, - 0x40, 0x3e, 0x40, 0x8d, 0x92, 0x0b, 0xe5, 0x00, - 0xf9, 0x42, 0x3c, 0x48, 0x0f, 0x10, 0x03, 0xe5, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x13, - 0x64, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x80, 0x00, 0xf8, 0x40, 0x3e, 0x00, - 0x0f, 0x84, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0xb2, - 0x02, 0x0c, 0x80, 0x13, 0x21, 0x00, 0xf0, 0x00, - 0x38, 0x00, 0x0f, 0x80, 0x03, 0x20, 0x00, 0xd0, - 0x02, 0x3e, 0x00, 0x0c, 0x84, 0x03, 0xa0, 0x00, - 0xf0, 0x00, 0xb2, 0x00, 0x8e, 0x80, 0x0b, 0x20, - 0x00, 0xf8, 0x00, 0xb2, 0x00, 0x0c, 0x82, 0x63, - 0x21, 0x80, 0xe8, 0x08, 0x32, 0x20, 0x2c, 0x80, - 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x11, 0xa8, 0x00, 0xba, 0x00, 0x2e, 0x81, - 0x0c, 0xa0, 0x02, 0xe8, 0x00, 0xba, 0x00, 0x21, - 0x88, 0x8a, 0xe0, 0x22, 0x28, 0x00, 0xba, 0x04, - 0x2a, 0x80, 0x0b, 0xa0, 0x02, 0x28, 0x00, 0xba, - 0x02, 0x2e, 0x94, 0x08, 0x20, 0x02, 0x28, 0x01, - 0xba, 0x80, 0x22, 0x80, 0x08, 0xa8, 0x02, 0x28, - 0x00, 0xba, 0x80, 0x22, 0x80, 0x8d, 0xe0, 0x02, - 0xb8, 0x20, 0xae, 0x00, 0x23, 0x80, 0x08, 0xa0, - 0x02, 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x04, 0x4c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x28, - 0x10, 0x08, 0x0c, 0x02, 0x0c, 0x00, 0xb3, 0x00, - 0x28, 0xc0, 0x0b, 0x38, 0x02, 0x0c, 0x00, 0x93, - 0x00, 0x2c, 0xd0, 0x29, 0xed, 0x09, 0x00, 0x1c, - 0x01, 0x30, 0x4a, 0x0c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0a, 0x30, 0x12, 0x0c, 0x04, 0x93, 0x00, - 0x24, 0xe0, 0x0a, 0x34, 0x02, 0x0c, 0x00, 0xa3, - 0x40, 0x28, 0xe0, 0x0a, 0x30, 0x02, 0xca, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x5c, - 0x40, 0xb7, 0x00, 0x2d, 0xc8, 0x08, 0x70, 0x02, - 0xdc, 0x10, 0xb7, 0x02, 0x29, 0xc0, 0x0a, 0x34, - 0x12, 0x1c, 0x80, 0x32, 0x00, 0x29, 0xc0, 0x8b, - 0x6c, 0x02, 0x14, 0x00, 0xb5, 0x00, 0x2d, 0xe1, - 0x09, 0x50, 0x02, 0x10, 0x00, 0xb6, 0x08, 0x2f, - 0x40, 0x08, 0x70, 0x82, 0x1c, 0x00, 0xb6, 0x8a, - 0x05, 0xf0, 0x0b, 0x78, 0x82, 0x9e, 0x00, 0x85, - 0x80, 0xab, 0xc2, 0x08, 0x70, 0x02, 0xe8, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x5e, - 0x88, 0xf7, 0xf1, 0x3d, 0xe4, 0x0f, 0x7a, 0x13, - 0xde, 0x80, 0xff, 0xa8, 0x39, 0xe0, 0x0c, 0x78, - 0x0b, 0x1e, 0x40, 0xf5, 0x80, 0x39, 0x20, 0x0f, - 0x38, 0x09, 0x1a, 0x00, 0xd6, 0x80, 0x3d, 0x60, - 0x0d, 0x68, 0x03, 0x1e, 0x00, 0xb3, 0x80, 0x3d, - 0xa1, 0x0e, 0x28, 0x03, 0x12, 0x04, 0xd3, 0x80, - 0x14, 0xa0, 0x2e, 0x38, 0x43, 0x1e, 0x00, 0xe5, - 0x80, 0x19, 0xa0, 0x2c, 0x78, 0x03, 0xea, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x45, 0xad, - 0x20, 0xfb, 0x20, 0x3e, 0xdd, 0x0a, 0xb6, 0x83, - 0xed, 0xe0, 0xfb, 0x34, 0x36, 0xc0, 0x0f, 0x90, - 0x01, 0xed, 0x80, 0xf8, 0x00, 0x36, 0x00, 0x0f, - 0xa0, 0x03, 0x60, 0x00, 0xf8, 0x00, 0x34, 0x40, - 0x0e, 0x80, 0x01, 0xe0, 0x00, 0xfa, 0x00, 0x30, - 0x00, 0x0f, 0xa0, 0x03, 0xe0, 0x00, 0xba, 0x00, - 0x3a, 0x80, 0x8c, 0xb0, 0x03, 0xe4, 0x00, 0xf8, - 0x01, 0x34, 0xc0, 0x0f, 0xb0, 0x03, 0xc2, 0x06, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xed, - 0x09, 0x00, 0x1d, 0x01, 0xbe, 0x00, 0xef, 0x80, - 0x3b, 0xc0, 0x2c, 0x78, 0x83, 0x9e, 0x00, 0xef, - 0x80, 0x33, 0xe0, 0x2c, 0xf8, 0x03, 0xfe, 0x24, - 0x7f, 0x82, 0x3f, 0xe0, 0x0f, 0xd8, 0x13, 0xfe, - 0x00, 0xff, 0x80, 0x3f, 0xa0, 0x0f, 0xf8, 0x43, - 0xbe, 0x00, 0xfd, 0x80, 0x3f, 0xe0, 0x0e, 0xd8, - 0x03, 0xfe, 0x00, 0xdd, 0x80, 0x37, 0x60, 0x0c, - 0xda, 0x03, 0xfe, 0x00, 0xec, 0x21, 0xb3, 0xe0, - 0x0f, 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x18, 0x9c, 0x00, 0xb7, 0x10, - 0x21, 0xc0, 0x0d, 0x70, 0x02, 0x1c, 0x40, 0x87, - 0x00, 0xa1, 0x88, 0x08, 0x60, 0x02, 0xdc, 0x00, - 0xb6, 0x00, 0x2d, 0xc0, 0x0e, 0x40, 0x02, 0xd4, - 0x00, 0xb5, 0x00, 0x2d, 0x84, 0x0b, 0x51, 0x03, - 0x50, 0x00, 0xb4, 0x00, 0x2d, 0x46, 0x0a, 0x50, - 0x42, 0xdc, 0x00, 0xb4, 0x10, 0x29, 0x48, 0x4c, - 0x50, 0x02, 0xdc, 0x00, 0xad, 0x10, 0x21, 0x08, - 0x0b, 0x70, 0x02, 0x6a, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xaf, 0x00, - 0x29, 0xc0, 0x09, 0xf0, 0x02, 0xbc, 0x20, 0xb3, - 0x00, 0xa0, 0x40, 0x19, 0x70, 0x02, 0x5c, 0x00, - 0x95, 0x00, 0x2d, 0x00, 0x09, 0x50, 0x02, 0xd8, - 0x00, 0xb6, 0x00, 0x29, 0x00, 0x0b, 0xe0, 0x82, - 0xdc, 0x00, 0xb5, 0x00, 0x2d, 0x80, 0x0a, 0x40, - 0x02, 0xd0, 0x00, 0xb1, 0x00, 0x25, 0x00, 0x68, - 0x72, 0x86, 0xc8, 0x00, 0x86, 0x00, 0x21, 0x80, - 0x1b, 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x04, 0x8c, 0x00, 0xb3, 0x81, - 0x20, 0xc0, 0x89, 0x30, 0x82, 0x0f, 0x80, 0x93, - 0x00, 0x24, 0xc0, 0x09, 0x30, 0x02, 0xcd, 0x08, - 0xb0, 0x00, 0x2c, 0x00, 0x0a, 0x04, 0x82, 0xc1, - 0x00, 0xb0, 0x20, 0x2c, 0x00, 0x0b, 0x06, 0x02, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x1e, 0x01, 0xb0, - 0x42, 0x2c, 0x08, 0x08, 0x04, 0x02, 0xc0, 0x01, - 0xb0, 0x00, 0x24, 0x02, 0x08, 0x34, 0x80, 0xc1, - 0x20, 0xa0, 0x02, 0x22, 0x02, 0x0b, 0x30, 0x02, - 0x48, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x15, 0xbc, 0x00, 0xe7, 0x61, 0x3b, 0xc0, 0x1d, - 0xfe, 0x03, 0xbf, 0x00, 0xff, 0x18, 0x32, 0xc0, - 0x0d, 0x30, 0x03, 0xdc, 0x00, 0xdb, 0x90, 0x3e, - 0xe4, 0x0f, 0xbc, 0x03, 0xee, 0x00, 0xfb, 0x80, - 0x3c, 0xe0, 0x0b, 0x30, 0x02, 0xee, 0x40, 0xfb, - 0x90, 0x3e, 0xe0, 0x0e, 0xb8, 0x13, 0xee, 0x08, - 0xdb, 0x80, 0x36, 0xf0, 0x4c, 0xa4, 0x43, 0xed, - 0x00, 0xcb, 0x00, 0x32, 0x40, 0x0f, 0xb0, 0x03, - 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0xec, 0x00, 0xfb, 0x20, 0x3e, 0xc0, 0x0e, - 0xb0, 0x13, 0xec, 0x00, 0xe3, 0x00, 0x3a, 0x40, - 0x0e, 0xb4, 0x03, 0xee, 0x80, 0xfa, 0x80, 0x3e, - 0xe1, 0x0f, 0xa8, 0x03, 0xc6, 0x80, 0xf9, 0x80, - 0x3e, 0xe8, 0x0f, 0x90, 0x0b, 0xc2, 0x00, 0xfa, - 0x80, 0x3e, 0x40, 0x0f, 0xba, 0x03, 0xee, 0x20, - 0xfa, 0x88, 0x38, 0xe0, 0x0e, 0xb0, 0x03, 0xe9, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, - 0x10, 0xfc, 0x00, 0xcf, 0x00, 0x36, 0xc0, 0x02, - 0xf0, 0x03, 0x3c, 0x00, 0xcf, 0x00, 0x33, 0xa0, - 0x0f, 0xe1, 0x03, 0x7c, 0x01, 0xc5, 0x00, 0x71, - 0x00, 0x0d, 0x70, 0x02, 0xb8, 0x00, 0xee, 0x00, - 0x27, 0x40, 0x0c, 0xe0, 0x03, 0x3c, 0x00, 0xcf, - 0x00, 0x3c, 0x80, 0x06, 0xe0, 0x03, 0xd0, 0x00, - 0xdf, 0x00, 0x36, 0x80, 0x2c, 0x6c, 0x03, 0x1e, - 0x90, 0xcd, 0x00, 0x3f, 0x00, 0x0c, 0xf0, 0x03, - 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa1, - 0x04, 0x6c, 0x00, 0x8b, 0x02, 0xed, 0x09, 0x00, - 0x1f, 0x01, 0x22, 0xc0, 0x0b, 0x30, 0x02, 0xac, - 0x00, 0x8b, 0x00, 0x3e, 0xe8, 0x0b, 0xb8, 0x02, - 0x2c, 0x10, 0xa8, 0x00, 0xb6, 0x00, 0x08, 0xa0, - 0x02, 0x20, 0x00, 0x88, 0x01, 0x2e, 0x40, 0x0d, - 0x80, 0x13, 0x60, 0x02, 0x8a, 0x00, 0x2e, 0x00, - 0x0f, 0xa0, 0x02, 0xe0, 0x00, 0x8a, 0x00, 0x2e, - 0x80, 0x08, 0xbc, 0x02, 0xa0, 0x20, 0xda, 0x00, - 0x2e, 0xc0, 0x08, 0xb0, 0x02, 0xe0, 0x40, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x0c, 0x02, - 0x8b, 0x00, 0x26, 0xc0, 0x0a, 0xb0, 0x02, 0x0c, - 0x00, 0xab, 0x00, 0x22, 0xc8, 0x0b, 0x94, 0x0a, - 0xac, 0x00, 0x8b, 0x00, 0x22, 0xc0, 0x4b, 0x90, - 0x26, 0xac, 0x00, 0xab, 0x01, 0x6e, 0x80, 0x09, - 0xb0, 0x02, 0xac, 0x00, 0x89, 0x00, 0x26, 0xc0, - 0x08, 0x90, 0x02, 0xec, 0x00, 0x99, 0x00, 0x0e, - 0x40, 0x08, 0xb0, 0x02, 0xa4, 0x00, 0x88, 0x80, - 0x2e, 0x48, 0x09, 0xb0, 0x02, 0xe0, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x0a, 0x14, 0x0c, 0x00, - 0x8b, 0x00, 0x24, 0xc0, 0x1b, 0xb0, 0x12, 0x8c, - 0x00, 0xa3, 0x00, 0x0c, 0xc0, 0x1b, 0x30, 0x02, - 0xac, 0x00, 0xa2, 0x00, 0x20, 0xc0, 0x0a, 0x00, - 0x26, 0x84, 0x01, 0x81, 0x00, 0x2e, 0x80, 0x29, - 0x90, 0x02, 0x40, 0x00, 0x80, 0x00, 0x2c, 0x40, - 0x0a, 0x10, 0x02, 0xcc, 0x00, 0x80, 0x00, 0x24, - 0x40, 0x08, 0x30, 0x26, 0x80, 0x00, 0x13, 0x00, - 0x2c, 0x00, 0x29, 0x30, 0x02, 0xc2, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x8d, 0x7c, 0x00, - 0xcf, 0x00, 0x37, 0xc0, 0x8e, 0xf0, 0x02, 0x3c, - 0x02, 0xef, 0x01, 0x32, 0xc0, 0x8f, 0xb0, 0x03, - 0xfc, 0x00, 0x89, 0x00, 0x22, 0x00, 0x0f, 0x90, - 0x03, 0xa8, 0x00, 0xaa, 0x00, 0x36, 0x00, 0x1c, - 0xa0, 0x03, 0xac, 0x00, 0xc9, 0x00, 0x3e, 0x80, - 0xed, 0x09, 0x00, 0x20, 0x01, 0x0a, 0x80, 0x03, - 0xe0, 0x00, 0xd9, 0x00, 0x3e, 0x00, 0x0c, 0xb0, - 0x03, 0xa0, 0x00, 0xca, 0x00, 0x3e, 0x00, 0x0d, - 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x01, 0xfc, 0x10, 0xf7, 0x00, 0x3b, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xdf, 0x00, - 0x3f, 0x00, 0x0d, 0xc0, 0x03, 0x7c, 0x00, 0xfc, - 0x00, 0x3f, 0x00, 0x0d, 0xc0, 0x03, 0x70, 0x00, - 0xfc, 0x00, 0x37, 0x00, 0x0f, 0x40, 0x03, 0x70, - 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, - 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0xf0, - 0x23, 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0x00, 0x0e, - 0xf0, 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x05, 0xfc, 0x40, 0xfe, 0x00, 0x3d, - 0xc0, 0x0c, 0xc0, 0x03, 0x50, 0x00, 0xdc, 0x00, - 0x1b, 0x00, 0x0c, 0xc0, 0x03, 0x50, 0x02, 0xd6, - 0x00, 0x21, 0xc0, 0x0f, 0xf0, 0x03, 0xb8, 0x00, - 0xce, 0x00, 0x37, 0x00, 0x0f, 0xc0, 0x23, 0xf0, - 0x00, 0xfd, 0x00, 0x37, 0x80, 0x0f, 0xf0, 0x03, - 0x38, 0x00, 0xff, 0x00, 0x3f, 0x08, 0x09, 0xc3, - 0x83, 0xf0, 0xd1, 0xfc, 0x24, 0x33, 0x08, 0x0d, - 0xc1, 0x03, 0x30, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x10, 0xec, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x08, 0xa0, 0x02, 0x24, 0x00, 0xb8, 0x04, - 0x22, 0x00, 0x88, 0x81, 0x12, 0xa0, 0x04, 0xaa, - 0x00, 0x22, 0x40, 0x0e, 0xb0, 0x03, 0x24, 0x00, - 0x8a, 0x02, 0x22, 0x01, 0x49, 0x80, 0x02, 0xe0, - 0x00, 0xbb, 0x00, 0x2e, 0x80, 0x0b, 0xb0, 0x03, - 0x68, 0x04, 0xbb, 0x00, 0x2c, 0x58, 0x08, 0x06, - 0x42, 0xe0, 0xc0, 0xba, 0x30, 0x20, 0x50, 0x48, - 0x83, 0x22, 0xa0, 0x06, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x88, 0x05, 0xcc, 0x00, 0xb1, 0x00, 0x2c, - 0xc0, 0x48, 0x80, 0xed, 0x09, 0x00, 0x21, 0x01, - 0x12, 0x40, 0x10, 0x90, 0x02, 0x2c, 0x04, 0x18, - 0x20, 0x02, 0x40, 0x0a, 0x82, 0x00, 0xa0, 0x40, - 0x8b, 0xa0, 0x02, 0xac, 0x00, 0xa8, 0x00, 0x20, - 0x00, 0x0b, 0x08, 0x02, 0x82, 0x00, 0xb3, 0x00, - 0x2c, 0x80, 0x0b, 0x30, 0x02, 0x08, 0x00, 0xb3, - 0x00, 0x2c, 0x86, 0x0a, 0x00, 0x02, 0xc0, 0x80, - 0xa1, 0x08, 0x20, 0x07, 0x0b, 0x00, 0x76, 0x22, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, - 0xac, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x18, 0xb4, - 0x0a, 0x25, 0x80, 0xba, 0x40, 0x26, 0x20, 0x48, - 0xac, 0x1a, 0xaa, 0x10, 0xaa, 0x00, 0x22, 0x48, - 0x0a, 0xa6, 0x02, 0xa4, 0x40, 0xa9, 0x20, 0xa2, - 0x20, 0x89, 0x98, 0x02, 0xe0, 0x00, 0xbb, 0x80, - 0x2e, 0x80, 0x0b, 0xb0, 0x02, 0x60, 0x80, 0x3b, - 0x00, 0x2e, 0x42, 0x8a, 0x98, 0x82, 0xe9, 0x80, - 0xb3, 0x00, 0x22, 0x41, 0x0a, 0x91, 0x06, 0xb8, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, - 0xec, 0x00, 0xfa, 0x08, 0x3e, 0x40, 0x2c, 0x30, - 0x03, 0x66, 0x00, 0xd8, 0xc4, 0x3c, 0xb2, 0x2c, - 0x88, 0x43, 0x44, 0x04, 0xda, 0xe0, 0x32, 0xc0, - 0x0f, 0x90, 0x42, 0xac, 0x00, 0xea, 0xa2, 0x76, - 0x20, 0x0f, 0x88, 0x03, 0xe0, 0x00, 0xb8, 0xc0, - 0x36, 0xa4, 0x0f, 0x30, 0x03, 0x2a, 0x00, 0xfb, - 0x00, 0x3e, 0x20, 0x0f, 0x80, 0x03, 0xe3, 0x00, - 0xf8, 0x00, 0x32, 0x86, 0x0f, 0x80, 0x2b, 0x10, - 0x44, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, - 0xbc, 0x00, 0xfe, 0x00, 0x3f, 0x40, 0x0f, 0xf0, - 0x13, 0xfe, 0x00, 0xfc, 0x10, 0x3b, 0x80, 0x0f, - 0x00, 0x03, 0xf8, 0x10, 0x9e, 0x91, 0x3f, 0x40, - 0x0e, 0xd0, 0x03, 0x3c, 0x00, 0xdf, 0x81, 0x3f, - 0x00, 0x0f, 0xd0, 0x03, 0xf0, 0x00, 0xff, 0x00, - 0x3f, 0x20, 0x0f, 0xf0, 0x03, 0xf8, 0xed, 0x09, - 0x00, 0x22, 0x01, 0x00, 0xff, 0x00, 0x3f, 0x24, - 0x0d, 0xf0, 0x82, 0xe6, 0x00, 0xfd, 0x00, 0x3d, - 0xc2, 0x49, 0x70, 0x83, 0xf8, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x10, 0xae, 0x20, 0xf9, - 0x42, 0x3e, 0xd1, 0x2c, 0xb4, 0x03, 0x25, 0x40, - 0xc8, 0x40, 0x3e, 0x80, 0x8f, 0xa0, 0x0b, 0x64, - 0x08, 0xc9, 0x50, 0x36, 0x40, 0x0e, 0x90, 0x03, - 0xec, 0x00, 0xda, 0x20, 0x3e, 0x30, 0x0d, 0x80, - 0x43, 0x20, 0x00, 0xcb, 0x80, 0xb2, 0xc0, 0x0f, - 0xb1, 0x03, 0xe8, 0x00, 0xdb, 0x00, 0x3a, 0x9c, - 0x0f, 0xa0, 0x03, 0x2d, 0x20, 0xea, 0x01, 0x76, - 0x80, 0x0c, 0xa8, 0x03, 0x10, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2d, 0x00, 0xbb, - 0x41, 0x2c, 0xf0, 0x28, 0xb6, 0x02, 0x26, 0x00, - 0x00, 0x80, 0x2e, 0x80, 0x0b, 0xa4, 0x82, 0x2a, - 0x80, 0xd3, 0x01, 0x22, 0xc8, 0x08, 0x10, 0x02, - 0xcf, 0x84, 0x83, 0xc8, 0x2e, 0x34, 0x06, 0x95, - 0x02, 0xa8, 0x00, 0x8b, 0x00, 0x22, 0xe0, 0x0b, - 0xb4, 0x02, 0xe8, 0x00, 0xbb, 0x00, 0x2e, 0x20, - 0x08, 0xb8, 0x02, 0x2f, 0x00, 0xdb, 0x50, 0x76, - 0xd0, 0x08, 0xb4, 0x42, 0x32, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4c, 0x00, 0xb3, - 0xc8, 0x2c, 0x86, 0x29, 0x08, 0x02, 0x03, 0x20, - 0x00, 0x80, 0x2c, 0x01, 0x0b, 0x0e, 0x02, 0xc1, - 0x38, 0x82, 0xc8, 0x24, 0xe2, 0x1a, 0x30, 0x20, - 0xca, 0x01, 0x12, 0xc0, 0x2c, 0x10, 0x09, 0x00, - 0x02, 0x00, 0x20, 0x83, 0x08, 0x20, 0xa0, 0x0b, - 0x3a, 0x02, 0xc8, 0x00, 0x93, 0x00, 0x6a, 0x30, - 0x18, 0x00, 0x02, 0x80, 0x40, 0x80, 0x00, 0x20, - 0x04, 0x08, 0x04, 0x0a, 0x78, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x01, 0x1e, 0x00, 0xb6, - 0x8a, 0x2f, 0xe0, 0x69, 0xfc, 0x02, 0x16, 0x00, - 0x84, 0xed, 0x09, 0x00, 0x23, 0x01, 0x80, 0x2d, - 0xa0, 0x0b, 0x49, 0x02, 0x9a, 0x40, 0x96, 0x80, - 0x25, 0xe5, 0x00, 0x78, 0x02, 0xdf, 0x01, 0x86, - 0x90, 0x2d, 0x25, 0x8a, 0x48, 0x06, 0xb2, 0x20, - 0x8f, 0x80, 0x21, 0xa0, 0x4b, 0x78, 0x02, 0xda, - 0x00, 0xb7, 0x80, 0x2d, 0xe4, 0x28, 0x6a, 0x8a, - 0x1e, 0x04, 0x96, 0x80, 0x25, 0x20, 0x28, 0x28, - 0x02, 0x48, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x08, 0x0c, 0x00, 0xf1, 0x00, 0x3c, 0xc4, - 0x09, 0x01, 0x03, 0x08, 0x00, 0xc2, 0x18, 0x7c, - 0x80, 0x0f, 0x21, 0x03, 0xc0, 0x00, 0x82, 0x20, - 0x34, 0x90, 0x0e, 0x30, 0x03, 0xcc, 0x00, 0xd3, - 0x04, 0x7c, 0x10, 0x0d, 0x91, 0x13, 0x00, 0x02, - 0xc3, 0x05, 0x30, 0x82, 0x0b, 0x30, 0x02, 0xc8, - 0x40, 0xd3, 0x00, 0x38, 0x84, 0x1e, 0x30, 0x43, - 0x04, 0x02, 0xc9, 0x04, 0x30, 0x81, 0xcc, 0x31, - 0x03, 0x5a, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x01, 0x3f, 0xc0, - 0x0e, 0x70, 0x03, 0xf8, 0x40, 0x3e, 0x00, 0x2f, - 0xc0, 0x0f, 0xf1, 0x43, 0x38, 0x00, 0xde, 0x00, - 0x3b, 0x80, 0x8f, 0xf0, 0x00, 0xd4, 0x00, 0xff, - 0x04, 0x3f, 0x41, 0x0e, 0xf0, 0x53, 0xd0, 0x00, - 0xf7, 0x00, 0x3f, 0x80, 0x0f, 0xf0, 0x03, 0xf8, - 0x00, 0xff, 0x01, 0x3f, 0xc4, 0x1e, 0xf2, 0x03, - 0xfc, 0x08, 0xef, 0x10, 0x3f, 0x84, 0x0f, 0xf0, - 0x03, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x05, 0xec, 0x00, 0xfa, 0x00, 0x3e, 0x40, - 0x06, 0xb0, 0x03, 0xe4, 0x00, 0xc8, 0x00, 0x3e, - 0x80, 0x0c, 0x80, 0x0a, 0x24, 0x00, 0xda, 0x00, - 0x3c, 0xe0, 0x2a, 0xb0, 0x23, 0xec, 0x00, 0xeb, - 0x00, 0x30, 0xa0, 0x2c, 0x90, 0x13, 0xe0, 0x00, - 0x7b, 0x80, 0x3a, 0xa0, 0x0c, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xed, 0x09, 0x00, 0x24, - 0x01, 0x40, 0x08, 0x98, 0x03, 0x28, 0x00, 0xf8, - 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x03, 0xca, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, - 0x00, 0xb6, 0x01, 0x2d, 0x40, 0x0f, 0x70, 0x02, - 0xd4, 0x00, 0x85, 0x02, 0x2d, 0x80, 0x08, 0x60, - 0x02, 0x98, 0x00, 0x86, 0x00, 0x2d, 0xc0, 0x08, - 0x50, 0x02, 0xdc, 0x00, 0x87, 0x01, 0x21, 0xc0, - 0x0a, 0x50, 0x02, 0xd0, 0x00, 0xe7, 0x00, 0x21, - 0x80, 0x4d, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0x2c, 0xc0, 0x08, 0x30, 0x10, 0x1c, 0x10, 0xb5, - 0x00, 0x2c, 0x40, 0x00, 0x70, 0x02, 0xd3, 0x26, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, - 0x00, 0xb5, 0x80, 0x2d, 0xe0, 0x8b, 0x7c, 0x12, - 0xd6, 0x30, 0x85, 0x8c, 0x2d, 0xe2, 0x08, 0x38, - 0x02, 0x36, 0x10, 0x86, 0x80, 0x2f, 0x60, 0x08, - 0x58, 0x22, 0xd7, 0x00, 0xa7, 0x88, 0x23, 0xa0, - 0x08, 0x58, 0x02, 0xd2, 0x01, 0xb7, 0x80, 0x2d, - 0xe0, 0x08, 0x78, 0x02, 0xdf, 0x00, 0xb7, 0x85, - 0x2d, 0xe0, 0x98, 0x78, 0x12, 0x9e, 0x08, 0xb6, - 0x80, 0x6d, 0xe0, 0x08, 0x78, 0x06, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xe0, 0x0b, 0x38, 0x02, - 0xc4, 0x08, 0x81, 0x02, 0x2c, 0xd0, 0x58, 0x3c, - 0x02, 0x8c, 0x02, 0x83, 0x10, 0x2c, 0xe0, 0x0a, - 0x11, 0x02, 0xce, 0x00, 0x83, 0x00, 0x20, 0xe0, - 0x0a, 0x30, 0x02, 0xcc, 0x01, 0xa3, 0x00, 0x24, - 0xe0, 0x09, 0x30, 0x02, 0xcc, 0x00, 0x33, 0x01, - 0x2c, 0xc8, 0x18, 0x38, 0x02, 0x8d, 0x04, 0xb3, - 0x24, 0x6c, 0xc4, 0x48, 0xb6, 0x02, 0xd3, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x11, 0xa8, - 0x00, 0xfe, 0x40, 0x3d, 0x90, 0x4e, 0xec, 0x43, - 0xfb, 0x02, 0xce, 0x42, 0x3d, 0x80, 0x0c, 0xed, - 0x09, 0x00, 0x25, 0x01, 0x63, 0x1b, 0x1b, 0x20, - 0xce, 0xc1, 0x3f, 0x90, 0x0c, 0xe5, 0x03, 0xf9, - 0x00, 0xee, 0xc0, 0x33, 0xb8, 0x0c, 0xe4, 0x03, - 0xf9, 0x00, 0xfe, 0x04, 0x3f, 0xb8, 0x0c, 0xa0, - 0x33, 0xfb, 0x00, 0xfa, 0x00, 0x3f, 0x80, 0x28, - 0xe0, 0xc3, 0x38, 0x28, 0xfe, 0x20, 0x3f, 0xa0, - 0x0c, 0xe6, 0x53, 0xfa, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x00, 0xe1, 0x10, 0xf8, 0xc0, - 0x3e, 0x24, 0x0e, 0x8c, 0x03, 0xe3, 0x00, 0xf8, - 0x84, 0x3e, 0x02, 0x6f, 0x80, 0x43, 0xe3, 0x00, - 0xe8, 0xc0, 0x3e, 0x24, 0x05, 0x80, 0x03, 0xe2, - 0x00, 0xf8, 0x80, 0xbe, 0x02, 0x0d, 0x84, 0x83, - 0xe3, 0x10, 0xf8, 0x00, 0x3a, 0x30, 0x0f, 0x80, - 0x03, 0xe2, 0x00, 0xf8, 0x00, 0x3c, 0x00, 0x0f, - 0x80, 0x89, 0x41, 0x21, 0xf0, 0x00, 0x3e, 0x20, - 0x2f, 0x84, 0x03, 0xd2, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, 0xa0, - 0x3a, 0x48, 0x0d, 0x92, 0x0b, 0x27, 0x00, 0xc9, - 0x00, 0x7e, 0x40, 0x0c, 0x9c, 0x03, 0x26, 0x00, - 0xc9, 0x90, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0x26, - 0x00, 0xc9, 0x00, 0x26, 0x60, 0x0e, 0x9c, 0x01, - 0xe7, 0x00, 0xc9, 0x08, 0x3e, 0x44, 0x0e, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x64, 0x0e, - 0x99, 0x43, 0x66, 0x80, 0xe9, 0x02, 0x30, 0x44, - 0x0c, 0x90, 0x0b, 0x82, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x04, 0x64, 0x00, 0xb1, 0x40, - 0x22, 0x42, 0x4c, 0x14, 0x02, 0x06, 0x00, 0xd9, - 0x80, 0x2e, 0x70, 0x08, 0x9c, 0x08, 0x24, 0x82, - 0x89, 0x20, 0x2e, 0x70, 0x4b, 0x18, 0x03, 0x47, - 0x40, 0x81, 0x80, 0x22, 0x64, 0x0b, 0x9c, 0x22, - 0xc5, 0x00, 0x89, 0x02, 0x2e, 0x48, 0x0b, 0x94, - 0x02, 0xe4, 0x00, 0xb9, 0x01, 0x2e, 0x72, 0x08, - 0x98, 0x02, 0xed, 0x09, 0x00, 0x26, 0x01, 0xe7, - 0x00, 0x89, 0xd0, 0x22, 0x40, 0x02, 0x95, 0x02, - 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x01, 0x26, 0x00, 0xb9, 0x00, 0xae, 0xc0, 0x08, - 0x94, 0x02, 0x25, 0x10, 0x89, 0x80, 0x2e, 0x58, - 0x08, 0x94, 0x02, 0x2c, 0x80, 0x89, 0x00, 0x2e, - 0x44, 0x4b, 0x91, 0x42, 0x24, 0x22, 0x89, 0x84, - 0x2e, 0x40, 0x0a, 0x90, 0x02, 0xe4, 0x00, 0x8b, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x82, 0xec, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0a, 0x90, 0x80, 0xe5, - 0x00, 0xa9, 0x00, 0x26, 0x42, 0xcb, 0xb0, 0x02, - 0x06, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x05, 0x00, 0xb9, 0x00, 0xe6, 0x50, 0x08, - 0x10, 0x02, 0x04, 0x00, 0x91, 0x00, 0x2c, 0x41, - 0x28, 0x10, 0x02, 0x24, 0x00, 0x81, 0x00, 0x2c, - 0x40, 0x0b, 0x90, 0x02, 0x44, 0x00, 0x89, 0x80, - 0x24, 0xd0, 0x0b, 0x14, 0x02, 0xec, 0x0c, 0x01, - 0xc2, 0x2c, 0x40, 0x8b, 0x10, 0x02, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x50, 0x08, 0x14, 0x02, 0xc5, - 0x00, 0x83, 0x41, 0xa4, 0x50, 0x8b, 0x34, 0x02, - 0x0a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, - 0x0d, 0x68, 0x00, 0xfa, 0x00, 0x3e, 0x00, 0x2c, - 0x80, 0x13, 0x20, 0x02, 0xc8, 0x00, 0x2e, 0x00, - 0x0c, 0x80, 0x43, 0x20, 0x04, 0xc8, 0x02, 0x3e, - 0x80, 0x0f, 0x80, 0x03, 0x20, 0x08, 0xc8, 0x00, - 0x3e, 0x00, 0x0e, 0xa0, 0x03, 0xe0, 0x02, 0xc0, - 0x00, 0x3e, 0x00, 0x0e, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x1e, 0x80, 0x03, 0x60, - 0x00, 0xe8, 0x00, 0x36, 0x00, 0x0d, 0x80, 0x03, - 0xae, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x1d, 0xe4, 0x00, 0xfd, 0x00, 0x3b, 0x40, 0x0f, - 0xf0, 0x13, 0xd4, 0x00, 0x7d, 0x04, 0x3d, 0x50, - 0x4f, 0xd4, 0x03, 0xdc, 0x08, 0xed, 0x09, 0x00, - 0x27, 0x01, 0xfd, 0x00, 0x3f, 0x40, 0x0f, 0xd0, - 0x03, 0x54, 0x00, 0xf5, 0x00, 0xbb, 0x50, 0x0f, - 0xd4, 0x03, 0xf4, 0x00, 0xfd, 0x40, 0x3d, 0xc0, - 0x0f, 0x90, 0x03, 0xf4, 0x00, 0xf9, 0x00, 0x3f, - 0x50, 0x8f, 0xd4, 0x03, 0xf5, 0x00, 0xfd, 0x42, - 0x3b, 0x50, 0x0e, 0xd4, 0x43, 0xe6, 0x24, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xf4, 0x40, - 0xf5, 0x00, 0x3f, 0x40, 0x4f, 0xd0, 0x02, 0xf4, - 0x00, 0xed, 0x00, 0x1f, 0x48, 0x0f, 0xd0, 0x03, - 0x54, 0x00, 0xcd, 0x00, 0x31, 0x40, 0xc3, 0xd0, - 0x23, 0xd4, 0x00, 0xfd, 0x00, 0x2f, 0x40, 0x0d, - 0xd1, 0x03, 0xfc, 0x00, 0xcd, 0x2a, 0x07, 0x40, - 0x0f, 0xd0, 0x03, 0xe4, 0x10, 0xf9, 0x00, 0x3f, - 0x48, 0x05, 0xd2, 0x83, 0xf4, 0xd0, 0xfd, 0x01, - 0x33, 0x40, 0x4c, 0xd1, 0x03, 0xc6, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, 0x80, - 0xb8, 0x02, 0x2e, 0x02, 0x0b, 0x80, 0x02, 0xe0, - 0x00, 0xba, 0x00, 0x2e, 0x04, 0x0b, 0x84, 0x0a, - 0x20, 0x04, 0xda, 0x00, 0x22, 0x00, 0x09, 0x80, - 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x3a, 0x02, 0x0c, - 0x81, 0x02, 0xe0, 0x04, 0xd8, 0x20, 0x2e, 0x00, - 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, - 0x0a, 0x08, 0x82, 0x02, 0xc0, 0xc0, 0xb8, 0x48, - 0x22, 0x02, 0x08, 0x81, 0x02, 0xce, 0x06, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, 0x80, - 0xb1, 0x00, 0x28, 0x40, 0x4b, 0x10, 0x06, 0xc4, - 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x8b, 0x11, 0x0a, - 0x44, 0x10, 0x89, 0x00, 0xa0, 0x60, 0x0b, 0x10, - 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x44, 0x48, - 0x10, 0x02, 0xc4, 0x09, 0x81, 0x29, 0x2c, 0x40, - 0x8b, 0x10, 0x02, 0x84, 0x00, 0xb1, 0x00, 0x2c, - 0x4c, 0x09, 0x12, 0xc6, 0xc6, 0x88, 0xb1, 0x30, - 0xed, 0x09, 0x00, 0x28, 0x01, 0x20, 0x45, 0x28, - 0x10, 0x02, 0xd2, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x11, 0xa4, 0x04, 0xb9, 0x10, 0x2e, - 0x42, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x10, - 0x2e, 0x55, 0x0b, 0xb0, 0x02, 0x64, 0x00, 0x99, - 0x00, 0x22, 0x40, 0x09, 0x90, 0x82, 0xe4, 0xa1, - 0xb9, 0x00, 0x2a, 0x50, 0x09, 0x90, 0x02, 0xe4, - 0x01, 0x99, 0x40, 0x2e, 0x48, 0x0b, 0x90, 0x02, - 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x44, 0x08, 0x90, - 0x02, 0xe4, 0x44, 0xbb, 0x20, 0x20, 0x44, 0x08, - 0x92, 0x02, 0xc6, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, 0x60, 0x3a, - 0x71, 0x0f, 0x94, 0x03, 0xe7, 0xc0, 0xe9, 0x04, - 0x3e, 0x70, 0x0b, 0x96, 0x13, 0x64, 0x02, 0xc1, - 0x80, 0x32, 0x70, 0x0f, 0x94, 0x03, 0xe4, 0x00, - 0xf9, 0x20, 0x3e, 0x40, 0x8c, 0x92, 0x02, 0xc4, - 0x22, 0xc9, 0x14, 0x36, 0x60, 0x0f, 0x90, 0x03, - 0xe6, 0x00, 0xf9, 0x00, 0x3e, 0x60, 0x0d, 0x94, - 0x83, 0xe6, 0x00, 0xf9, 0x48, 0x32, 0x60, 0x0c, - 0x94, 0x83, 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x82, 0x3e, - 0x48, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x60, 0x4f, 0x1c, 0x03, 0xa6, 0x40, 0xf9, - 0x20, 0x3e, 0x44, 0x0d, 0x9c, 0x03, 0xe6, 0x10, - 0xf9, 0x20, 0x3a, 0x42, 0xce, 0x99, 0x03, 0xe7, - 0x04, 0xf9, 0x04, 0x3e, 0x60, 0x0f, 0x90, 0x23, - 0xe6, 0x40, 0xf9, 0x00, 0x3c, 0x40, 0x4f, 0x99, - 0x47, 0xe6, 0x04, 0xf9, 0x00, 0xbe, 0x60, 0x8f, - 0x90, 0x03, 0xda, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x10, 0xa0, 0x00, 0xf8, 0x90, 0x02, - 0x10, 0x0f, 0x88, 0x03, 0xe3, 0x02, 0xc8, 0x40, - 0x3e, 0x10, 0x0f, 0x86, 0x03, 0x20, 0x20, 0xc8, - 0x40, 0x3e, 0x00, 0xed, 0x09, 0x00, 0x29, 0x01, - 0x2c, 0x80, 0x63, 0xe2, 0x0a, 0xc8, 0xc0, 0x3e, - 0x00, 0x0f, 0x82, 0x03, 0xe3, 0x00, 0xc8, 0x00, - 0x36, 0x20, 0x8f, 0x88, 0x03, 0xe0, 0x00, 0xc8, - 0x00, 0x3e, 0x00, 0x0f, 0x84, 0x43, 0x20, 0x02, - 0xc0, 0x14, 0x32, 0x00, 0x2c, 0x80, 0x03, 0xc2, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x3a, 0x60, 0xbe, 0x42, 0x23, 0x80, 0x0b, 0xe4, - 0x02, 0xf9, 0x00, 0xda, 0x01, 0x2f, 0x80, 0x4b, - 0xec, 0x03, 0x1a, 0x00, 0xde, 0xa0, 0x2f, 0xac, - 0x08, 0xa0, 0x02, 0xf9, 0x02, 0x8e, 0x42, 0x2f, - 0x81, 0x0b, 0xe0, 0x22, 0xf9, 0x04, 0xfe, 0xd8, - 0x23, 0xb0, 0x0b, 0xe4, 0x03, 0xa8, 0x00, 0xaa, - 0x00, 0x2f, 0x81, 0x08, 0xe0, 0x02, 0xbb, 0x10, - 0x8e, 0x80, 0x2b, 0x90, 0x08, 0xed, 0x02, 0xca, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, - 0x0c, 0x00, 0xb3, 0x80, 0x20, 0xc0, 0x0b, 0x30, - 0x02, 0xc2, 0x02, 0x83, 0x00, 0x6c, 0xc0, 0x0b, - 0x30, 0x02, 0x0a, 0x00, 0x83, 0x82, 0x2c, 0xf0, - 0x08, 0x10, 0x02, 0xcc, 0x40, 0x93, 0x10, 0x6e, - 0xc4, 0x0b, 0x34, 0x02, 0xc4, 0x12, 0x93, 0x01, - 0x24, 0xe4, 0x0b, 0x30, 0x02, 0x8c, 0x10, 0x83, - 0x00, 0x2c, 0xc0, 0x4a, 0x30, 0x02, 0x4e, 0x20, - 0x83, 0x00, 0x20, 0xd8, 0x08, 0x3c, 0x02, 0xca, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, - 0x1c, 0x10, 0xb7, 0x80, 0x61, 0xc0, 0x0b, 0x64, - 0x42, 0xfe, 0x20, 0x97, 0x08, 0x2d, 0xc0, 0x0b, - 0x74, 0x0a, 0x18, 0x22, 0x97, 0x00, 0x2f, 0xe0, - 0x88, 0x50, 0x12, 0xfa, 0x00, 0x96, 0x00, 0x2d, - 0x20, 0x0b, 0x60, 0x02, 0xdc, 0x0e, 0xb3, 0x80, - 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xbe, 0x00, 0xa7, - 0x00, 0x2d, 0xc0, 0x08, 0x6c, 0x02, 0xde, 0x30, - 0x82, 0x00, 0x29, 0xc0, 0x48, 0x74, 0xed, 0x09, - 0x00, 0x2a, 0x01, 0x02, 0xe0, 0x04, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x08, 0x16, 0x00, 0xf7, - 0x80, 0xa1, 0xe0, 0x0b, 0x68, 0x03, 0xd6, 0x12, - 0xc5, 0x80, 0x3d, 0x60, 0x0f, 0x78, 0x03, 0x1a, - 0x02, 0xc6, 0x80, 0x3d, 0xe0, 0x28, 0x58, 0x43, - 0xda, 0x00, 0xd7, 0x80, 0x2d, 0xc0, 0x0f, 0x58, - 0x03, 0xde, 0x02, 0xd7, 0x80, 0x35, 0xa0, 0x8f, - 0x68, 0x03, 0x9e, 0x00, 0xc7, 0x80, 0x3f, 0x61, - 0x0e, 0xd8, 0x03, 0x5e, 0x00, 0xc7, 0x80, 0x20, - 0xe0, 0x0c, 0x78, 0x03, 0xe2, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x1d, 0xa4, 0x00, 0xf9, - 0x01, 0x3e, 0xc0, 0x0f, 0x80, 0x03, 0xc4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0d, 0x30, 0x01, 0xa8, - 0x10, 0xeb, 0x04, 0x3e, 0xc0, 0x8f, 0x90, 0x03, - 0xe8, 0x02, 0xe8, 0x02, 0x3e, 0x00, 0x0f, 0x80, - 0x23, 0xcc, 0x08, 0xfb, 0x00, 0x3e, 0x80, 0x0f, - 0xa0, 0x23, 0x8c, 0x00, 0xfb, 0x00, 0x3e, 0x00, - 0x0e, 0x90, 0x03, 0xa4, 0x00, 0xfa, 0x00, 0x3e, - 0x00, 0x0f, 0xb0, 0x03, 0xc2, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xef, - 0x81, 0x3d, 0xe4, 0x0c, 0xc8, 0x01, 0xf2, 0x00, - 0x4f, 0x82, 0x1d, 0xe4, 0x0c, 0xf2, 0x03, 0x1a, - 0x80, 0xcf, 0x80, 0x39, 0xe0, 0x2d, 0x59, 0x20, - 0x3a, 0x00, 0xbe, 0x92, 0x3f, 0x64, 0x0c, 0xf8, - 0x03, 0xf6, 0x50, 0xef, 0x80, 0x0d, 0xa4, 0x0e, - 0xf8, 0x03, 0xbe, 0x00, 0xff, 0x80, 0x3f, 0xe0, - 0x0a, 0xf8, 0x03, 0x3e, 0x00, 0x4d, 0x82, 0x33, - 0xa0, 0x0c, 0xf8, 0x09, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x11, 0xb5, 0x00, 0x87, - 0x00, 0x2d, 0xc0, 0x08, 0x41, 0x02, 0xd4, 0x22, - 0x85, 0x00, 0x39, 0xd2, 0x48, 0x52, 0x0b, 0x58, - 0x80, 0xa7, 0x04, 0x21, 0x80, 0x08, 0x51, 0x8a, - 0x18, 0xed, 0x09, 0x00, 0x2b, 0x01, 0xa0, 0xb6, - 0x10, 0x2d, 0x00, 0x0d, 0x60, 0x22, 0xdc, 0xc4, - 0xb7, 0x20, 0x25, 0x80, 0x4d, 0x70, 0x22, 0xdc, - 0x80, 0xf7, 0x02, 0x2d, 0xc0, 0x4b, 0xc2, 0x03, - 0x78, 0x40, 0x84, 0x18, 0x2b, 0x80, 0x28, 0x40, - 0x03, 0x6a, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9c, 0x40, 0xa7, 0x00, 0x2d, 0xc0, - 0x08, 0x40, 0x02, 0xd0, 0x40, 0x85, 0x00, 0x2d, - 0x40, 0x48, 0x71, 0xa2, 0x18, 0xe1, 0x86, 0x10, - 0x2f, 0xc2, 0x08, 0x51, 0x00, 0x18, 0x00, 0xb6, - 0x00, 0x2d, 0x00, 0x09, 0x40, 0x02, 0xdc, 0x04, - 0xa7, 0x00, 0x6f, 0x82, 0x8b, 0x60, 0x02, 0x9c, - 0x00, 0xb7, 0x00, 0x2d, 0x46, 0x0b, 0x70, 0x42, - 0x9c, 0x02, 0x95, 0x00, 0xa9, 0xc0, 0x0b, 0x70, - 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x14, 0xc0, 0x00, 0x81, 0xc0, 0x2c, 0xc2, - 0x08, 0x07, 0x22, 0xc4, 0x10, 0x81, 0x00, 0x28, - 0x50, 0x08, 0x18, 0x82, 0x4b, 0x04, 0x21, 0x26, - 0x24, 0xe0, 0x48, 0x18, 0x02, 0x0a, 0x28, 0xb0, - 0x00, 0x2c, 0x01, 0x19, 0x0c, 0x22, 0xc8, 0x00, - 0xba, 0x42, 0x64, 0xa0, 0x09, 0x20, 0x02, 0xce, - 0x00, 0xb3, 0x00, 0x6c, 0x10, 0x0b, 0x1c, 0x12, - 0xc1, 0x00, 0x90, 0xe0, 0x2a, 0x10, 0x0b, 0x00, - 0x22, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x15, 0xa8, 0x00, 0xe3, 0x90, 0x3e, 0xc0, - 0x28, 0xac, 0x03, 0xec, 0x40, 0xc3, 0xc0, 0x3e, - 0x10, 0x28, 0xbc, 0x03, 0x2d, 0x40, 0x43, 0x40, - 0x3c, 0xc0, 0x0c, 0x98, 0x03, 0x29, 0x00, 0xfb, - 0x40, 0x2e, 0x80, 0x09, 0x84, 0x83, 0xc7, 0x00, - 0xeb, 0x60, 0x3e, 0xe0, 0x0f, 0xb0, 0x03, 0xac, - 0x20, 0xfb, 0x00, 0x3e, 0x80, 0x0e, 0xbd, 0x11, - 0xac, 0x84, 0xdb, 0x00, 0x3a, 0x44, 0x0f, 0xbc, - 0x03, 0x2a, 0x04, 0x60, 0xed, 0x09, 0x00, 0x2c, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xe9, - 0x00, 0xfa, 0x10, 0x3e, 0xc0, 0x0f, 0xa0, 0x13, - 0xec, 0x00, 0xf9, 0x10, 0x3e, 0x12, 0x0f, 0xb0, - 0x13, 0xe8, 0x00, 0xfb, 0x10, 0x3a, 0x50, 0x0e, - 0x90, 0x0b, 0xe8, 0x00, 0xfa, 0x20, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xef, 0x20, 0xfb, 0x00, 0x36, - 0xc0, 0x0e, 0x90, 0x03, 0xec, 0x00, 0xeb, 0x00, - 0x3e, 0x40, 0x1f, 0xa1, 0x39, 0x2d, 0x30, 0xeb, - 0x40, 0x36, 0x40, 0x04, 0xb1, 0x93, 0xa0, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xf0, - 0x00, 0xfe, 0x01, 0x33, 0xe0, 0x0c, 0xc0, 0x03, - 0x3e, 0x00, 0xcd, 0x0c, 0x31, 0xc0, 0x0d, 0xb4, - 0x37, 0x3b, 0x00, 0xce, 0xa2, 0x3b, 0xe0, 0x8c, - 0xfc, 0x07, 0xf8, 0x80, 0x9e, 0x20, 0x39, 0x22, - 0x0d, 0x40, 0x83, 0x7c, 0x00, 0xcf, 0x28, 0x37, - 0x80, 0x0f, 0xe2, 0x03, 0xfc, 0x10, 0xff, 0x00, - 0x3f, 0xb2, 0x0f, 0x40, 0x43, 0x3a, 0x00, 0xf4, - 0xc0, 0x3b, 0xe4, 0x0c, 0xca, 0x03, 0xc8, 0x44, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x63, - 0x08, 0xb8, 0x48, 0x22, 0x20, 0x0a, 0x08, 0x22, - 0x0f, 0x00, 0xd9, 0x00, 0xa2, 0xe0, 0x08, 0x30, - 0x22, 0x0b, 0x20, 0xeb, 0x80, 0x22, 0xf6, 0x0a, - 0xb8, 0x02, 0xc8, 0x00, 0x88, 0x80, 0x3e, 0x10, - 0x08, 0x8e, 0x02, 0x2c, 0x00, 0x8b, 0x00, 0x32, - 0x80, 0x0b, 0x84, 0x82, 0xec, 0x00, 0xbb, 0x00, - 0x26, 0x10, 0x0b, 0x80, 0x42, 0x23, 0x20, 0xb8, - 0x00, 0x22, 0x20, 0x00, 0x80, 0x82, 0xe8, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x22, - 0x00, 0xb8, 0x80, 0x60, 0xc8, 0x08, 0x81, 0x42, - 0xa8, 0x60, 0x8b, 0x80, 0x22, 0x08, 0x09, 0xb0, - 0x52, 0x68, 0x00, 0x9b, 0x00, 0x2a, 0xc0, 0x08, - 0x90, 0x02, 0xe8, 0x00, 0xa8, 0x04, 0x2e, 0xed, - 0x09, 0x00, 0x2d, 0x01, 0x18, 0x09, 0x88, 0x02, - 0x65, 0x01, 0x9b, 0x00, 0x26, 0x88, 0x0b, 0xa0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2a, 0x82, 0x09, - 0xb4, 0x02, 0xe4, 0x80, 0xbb, 0x00, 0x22, 0x00, - 0x28, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0xb8, 0x00, - 0x20, 0xe0, 0x0a, 0x08, 0x0a, 0x84, 0x00, 0x99, - 0x00, 0x20, 0x00, 0x00, 0x10, 0x02, 0x48, 0x02, - 0xa9, 0x00, 0x20, 0xc0, 0x0a, 0x10, 0x22, 0xca, - 0x00, 0xa0, 0x80, 0x2c, 0x00, 0x18, 0x00, 0x02, - 0x2c, 0x00, 0x81, 0x00, 0x20, 0x00, 0x0b, 0x10, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x24, 0x40, 0x0b, - 0x00, 0x02, 0x00, 0x00, 0xb3, 0x00, 0xa0, 0x00, - 0x18, 0x00, 0x02, 0xc2, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x60, 0x00, 0xf8, 0x00, - 0x32, 0xc0, 0x08, 0x80, 0x03, 0xa0, 0x02, 0xc9, - 0x00, 0x32, 0xc0, 0x0d, 0xb0, 0x02, 0x68, 0x00, - 0xda, 0x01, 0x3a, 0xc1, 0x0c, 0xb0, 0x02, 0xe8, - 0x10, 0xf8, 0x00, 0x38, 0x00, 0x0d, 0x80, 0x03, - 0x6c, 0x02, 0xcb, 0x00, 0x36, 0x80, 0x0f, 0xa0, - 0x23, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0x80, 0x0d, - 0xa0, 0x0b, 0x20, 0x00, 0xf0, 0x00, 0x3a, 0xc0, - 0x0c, 0x00, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x1d, 0xf0, 0x00, 0xfc, 0x00, - 0x3f, 0x00, 0x1f, 0xc0, 0x03, 0x54, 0x00, 0xfd, - 0x00, 0x1f, 0xc0, 0x4f, 0xe0, 0x03, 0xb0, 0x04, - 0xf5, 0x01, 0x3f, 0xc0, 0x0f, 0xf0, 0x13, 0xf0, - 0x02, 0xdc, 0x00, 0x3b, 0x00, 0x0f, 0xc0, 0x03, - 0xfc, 0x00, 0xfc, 0x00, 0x3b, 0x80, 0x0f, 0xc0, - 0x23, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x00, 0x0f, - 0xc0, 0x13, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0x00, - 0x0f, 0xc0, 0x03, 0xe8, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x2e, 0x01, 0xc0, - 0x01, 0xfc, 0x00, 0xcf, 0x08, 0x31, 0x01, 0x0f, - 0xc1, 0x03, 0xf0, 0x80, 0xec, 0x20, 0x3b, 0x08, - 0x04, 0xc2, 0x03, 0xf0, 0x84, 0xfc, 0x25, 0x3f, - 0x08, 0x0f, 0xc2, 0x1b, 0x30, 0x80, 0xfc, 0x20, - 0x3f, 0x08, 0x4f, 0xc2, 0xb3, 0xf0, 0x08, 0xec, - 0x28, 0x3b, 0x0a, 0x0f, 0xd0, 0x03, 0x34, 0x00, - 0xfc, 0x00, 0x31, 0x80, 0x0f, 0xc0, 0x22, 0x30, - 0x00, 0xfc, 0x00, 0x37, 0xc8, 0x0c, 0xf0, 0x03, - 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0xe8, 0x00, 0x8f, 0x68, 0x22, 0x00, 0x0b, - 0xb2, 0x42, 0xe1, 0x00, 0x88, 0x50, 0x2e, 0x04, - 0x8e, 0x85, 0x22, 0xe1, 0x44, 0xb8, 0x40, 0x36, - 0x10, 0x08, 0x81, 0x22, 0xa0, 0x40, 0x28, 0x50, - 0x22, 0x14, 0x0b, 0x84, 0x02, 0x20, 0x40, 0x88, - 0x40, 0x2e, 0x10, 0x8a, 0x95, 0x02, 0x28, 0x00, - 0xb8, 0x78, 0x2a, 0x80, 0x8b, 0x82, 0x03, 0x60, - 0x20, 0xb0, 0x20, 0x23, 0xd4, 0x08, 0xb0, 0x02, - 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, - 0x05, 0xc4, 0x02, 0x83, 0x00, 0x20, 0x40, 0x0b, - 0x32, 0x02, 0xc1, 0x02, 0xa0, 0x00, 0x28, 0x00, - 0x0b, 0x00, 0x02, 0xc0, 0x00, 0xb0, 0x40, 0x2c, - 0x10, 0x0b, 0x00, 0x1a, 0xc0, 0x10, 0xa0, 0x00, - 0x28, 0x00, 0x8a, 0x00, 0x00, 0x80, 0x00, 0xb0, - 0x00, 0x2c, 0x00, 0x0a, 0x10, 0x02, 0x4c, 0x08, - 0xb1, 0x00, 0x28, 0x80, 0x0b, 0x00, 0x82, 0xc0, - 0x80, 0xb0, 0x18, 0x20, 0xc0, 0x08, 0x30, 0x06, - 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x15, 0xad, 0x00, 0xa3, 0x02, 0xa2, 0x04, 0x0b, - 0x80, 0x00, 0xe8, 0x24, 0xaa, 0x00, 0x66, 0x54, - 0x8a, 0x94, 0x06, 0xe0, 0x20, 0xbb, 0x08, 0x2e, - 0xca, 0x0a, 0x80, 0x22, 0xec, 0x90, 0x8a, 0x08, - 0x26, 0x84, 0x1b, 0x80, 0x02, 0xed, 0x09, 0x00, - 0x2f, 0x01, 0x61, 0x80, 0x99, 0x20, 0x26, 0xc8, - 0x0a, 0xa8, 0x0a, 0x2c, 0x00, 0xbb, 0x00, 0xaa, - 0x90, 0x0b, 0xb0, 0x06, 0xec, 0x61, 0xbb, 0x00, - 0x22, 0xc0, 0x08, 0xb0, 0x02, 0xf0, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xe1, 0x06, - 0xcb, 0x01, 0x32, 0x72, 0x0f, 0xb8, 0x02, 0xe0, - 0x02, 0xe8, 0x42, 0x3a, 0x20, 0x0f, 0x80, 0x13, - 0xe0, 0x00, 0xf8, 0xd0, 0x3e, 0x20, 0x4f, 0x8c, - 0x23, 0xe0, 0x04, 0xe8, 0x90, 0x7e, 0x18, 0x0f, - 0x8c, 0xc3, 0xe3, 0x04, 0xb8, 0xa0, 0x2a, 0x28, - 0x0e, 0x98, 0x03, 0x2c, 0x00, 0xf9, 0x08, 0x32, - 0x90, 0x0f, 0x89, 0x03, 0x23, 0x08, 0xf8, 0xa6, - 0x32, 0xc0, 0x0c, 0xb0, 0x03, 0xd0, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x95, 0x00, - 0xdf, 0x02, 0x3f, 0x40, 0x0f, 0xf4, 0x43, 0xd6, - 0x42, 0xdf, 0x22, 0x3f, 0xa1, 0x0e, 0xe9, 0x03, - 0xff, 0x00, 0xf8, 0x80, 0x31, 0x40, 0x4d, 0x79, - 0x23, 0xac, 0x10, 0xe5, 0x02, 0x6b, 0x60, 0x0f, - 0x72, 0x03, 0x9e, 0x00, 0xea, 0x80, 0x29, 0x20, - 0x0e, 0x30, 0x23, 0xbe, 0x80, 0xf3, 0x40, 0x37, - 0xc8, 0x0f, 0xf0, 0x03, 0x7a, 0x00, 0xfc, 0x40, - 0x3d, 0xc0, 0x0f, 0xf0, 0x03, 0xf8, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, 0x90, - 0xcb, 0x00, 0x7e, 0x49, 0x0c, 0xb0, 0x03, 0xac, - 0x81, 0xf9, 0x41, 0x3c, 0xc1, 0x0e, 0xb0, 0x03, - 0xad, 0x00, 0xeb, 0x40, 0x3a, 0x90, 0x0d, 0xb6, - 0x13, 0x80, 0x10, 0xeb, 0x40, 0x3e, 0xc0, 0x1f, - 0xb0, 0x03, 0xed, 0x40, 0xd3, 0x00, 0x26, 0xc0, - 0x0f, 0x90, 0x03, 0x6c, 0x80, 0xc9, 0x01, 0x32, - 0x50, 0x2d, 0x80, 0x03, 0xe4, 0x02, 0xc0, 0x00, - 0x76, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x45, 0x25, 0x00, - 0xed, 0x09, 0x00, 0x30, 0x01, 0x8f, 0x00, 0x6e, - 0x50, 0x02, 0xb0, 0x02, 0xed, 0x00, 0xbb, 0x00, - 0x36, 0xc0, 0x08, 0xb0, 0x83, 0xac, 0x00, 0x8b, - 0x00, 0x2a, 0xc0, 0x4e, 0xb4, 0x03, 0xec, 0x04, - 0x8b, 0x00, 0x2a, 0xc0, 0x09, 0xb0, 0x02, 0xec, - 0x00, 0x8b, 0x00, 0x22, 0xc0, 0x8b, 0xb0, 0x02, - 0x2e, 0x14, 0xdb, 0x00, 0x22, 0xf4, 0x88, 0xb0, - 0x02, 0x2c, 0x04, 0x8b, 0x00, 0x63, 0xc0, 0x8b, - 0xb0, 0x03, 0xb2, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x05, 0x48, 0x00, 0x83, 0x00, 0x2c, - 0x40, 0x08, 0x30, 0x02, 0x40, 0x10, 0xb0, 0x00, - 0x28, 0x00, 0x2a, 0x0c, 0x82, 0x80, 0x00, 0x80, - 0x00, 0x24, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, - 0x20, 0x00, 0x2c, 0x00, 0x0b, 0x00, 0x02, 0xc2, - 0x00, 0xb0, 0x00, 0x24, 0x00, 0x09, 0x10, 0x02, - 0xce, 0x40, 0xa1, 0x00, 0x20, 0xb0, 0x08, 0x80, - 0x00, 0x80, 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x0b, - 0x30, 0x42, 0xf9, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x01, 0x0a, 0x00, 0x87, 0x80, 0x2d, - 0x20, 0x1a, 0x78, 0x02, 0xde, 0x01, 0xb1, 0x80, - 0x20, 0xe0, 0x00, 0x78, 0x02, 0x8e, 0x00, 0x87, - 0x80, 0x2c, 0xa0, 0x02, 0x38, 0x22, 0xd2, 0x00, - 0x83, 0x80, 0x29, 0xe1, 0x09, 0x78, 0x02, 0xce, - 0x00, 0xa7, 0x90, 0x29, 0xe0, 0x0b, 0x58, 0x20, - 0xba, 0x40, 0xb5, 0x84, 0xa9, 0xe2, 0x19, 0xc8, - 0x40, 0x16, 0x00, 0x97, 0x80, 0x61, 0xe0, 0x0b, - 0x78, 0x00, 0x88, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x0c, 0x02, 0xc3, 0x10, 0x2c, - 0x01, 0x0c, 0x34, 0x07, 0x44, 0x00, 0xb3, 0x40, - 0x28, 0x84, 0x0e, 0x20, 0x03, 0x8c, 0x18, 0xc0, - 0x00, 0x34, 0x40, 0x0c, 0x37, 0xa7, 0x8c, 0x00, - 0xe1, 0x00, 0x3c, 0x44, 0x4b, 0x30, 0x03, 0xcc, - 0x00, 0xf2, 0x00, 0xed, 0x09, 0x00, 0x31, 0x01, - 0x34, 0x00, 0x45, 0x30, 0x13, 0xcc, 0x40, 0xe3, - 0x22, 0x00, 0xc8, 0x05, 0x30, 0x01, 0xa8, 0x88, - 0xf0, 0x00, 0x30, 0xc0, 0x0f, 0x30, 0x03, 0xd2, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, - 0xbc, 0x00, 0xff, 0x58, 0x3f, 0x00, 0x87, 0xf0, - 0x02, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x4b, - 0xf0, 0x03, 0xfc, 0x04, 0xdf, 0x10, 0x1b, 0xc0, - 0x0f, 0xf1, 0x0b, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc4, 0x09, 0xf1, 0x02, 0xfc, 0x00, 0xdf, 0x01, - 0x37, 0xc0, 0x0f, 0xe0, 0x03, 0x5c, 0x48, 0xdf, - 0x00, 0x37, 0xc0, 0x0e, 0x70, 0x03, 0xbc, 0x00, - 0xef, 0x00, 0x3f, 0xc2, 0x0f, 0xf0, 0x03, 0xd0, - 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, - 0xec, 0x00, 0xfb, 0x60, 0x3e, 0x40, 0x0f, 0x80, - 0x03, 0xa8, 0x00, 0xfa, 0x04, 0x32, 0x40, 0x0e, - 0x90, 0x03, 0xe0, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0x80, 0x03, 0xec, 0x01, 0xfa, 0x00, 0x36, - 0x80, 0x0f, 0x80, 0x03, 0x20, 0x08, 0xd9, 0x06, - 0x36, 0xc0, 0x0f, 0xb0, 0x43, 0xee, 0x01, 0xcb, - 0x82, 0x36, 0x80, 0x0f, 0xb8, 0x4f, 0x2c, 0x00, - 0xcb, 0x00, 0x3e, 0xd0, 0x0f, 0xb0, 0x03, 0xea, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, - 0x9c, 0x10, 0x37, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x42, 0xdc, 0x00, 0xb7, 0x00, 0x85, 0xc0, 0x0b, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x21, 0xc1, - 0x0b, 0x70, 0x02, 0x5c, 0x04, 0x97, 0x00, 0x21, - 0xc0, 0x0e, 0x70, 0x02, 0x1c, 0x00, 0x87, 0x00, - 0x29, 0xc0, 0x0b, 0x70, 0x02, 0x5c, 0x01, 0x87, - 0x00, 0x21, 0xc0, 0x8b, 0x70, 0x02, 0x1c, 0x12, - 0x87, 0x00, 0x2d, 0xcc, 0x4b, 0x70, 0x02, 0xd2, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, - 0x9e, 0x00, 0xb7, 0xa0, 0x2d, 0xe0, 0xed, 0x09, - 0x00, 0x32, 0x01, 0x0b, 0x78, 0x02, 0x9e, 0x20, - 0xb3, 0x00, 0xa9, 0xe0, 0x0b, 0x78, 0x46, 0xde, - 0x20, 0x93, 0xc0, 0x2d, 0xe2, 0x0b, 0x7c, 0x02, - 0xde, 0x20, 0xb3, 0x84, 0x2d, 0xe0, 0x09, 0x38, - 0x02, 0x0e, 0x00, 0x83, 0x80, 0x21, 0xe2, 0x0b, - 0x78, 0x02, 0xfe, 0x00, 0xb7, 0x80, 0xa9, 0xe2, - 0x0b, 0x78, 0x02, 0x1e, 0x28, 0x84, 0x80, 0x2d, - 0xe1, 0x1b, 0x78, 0x02, 0xf0, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x14, 0xed, 0x40, 0xb3, - 0x02, 0x2c, 0x64, 0x8b, 0x86, 0x02, 0xcd, 0x00, - 0xb3, 0x48, 0x2c, 0xc1, 0x09, 0x34, 0x06, 0xce, - 0x80, 0xb3, 0x20, 0x28, 0xc0, 0x0b, 0x38, 0x02, - 0x4e, 0x20, 0xb3, 0xc2, 0xa8, 0xf0, 0x82, 0x30, - 0x0a, 0x0e, 0x02, 0x83, 0x41, 0xa8, 0xc8, 0x0b, - 0x30, 0x26, 0x4e, 0x00, 0xb3, 0xc0, 0x20, 0xe0, - 0x0b, 0x30, 0x06, 0x0c, 0x00, 0x83, 0x00, 0x2c, - 0xc1, 0x0b, 0x30, 0x02, 0xd3, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xe8, 0x15, 0xba, 0x04, 0xfa, - 0x01, 0x3f, 0xb0, 0x0f, 0xe6, 0x03, 0xb8, 0x00, - 0xfe, 0xe0, 0x3b, 0x90, 0x0e, 0xec, 0x02, 0xfb, - 0x00, 0xde, 0x80, 0x3f, 0x80, 0x0f, 0xe8, 0x43, - 0xfb, 0x04, 0xfe, 0xe0, 0x3f, 0xa8, 0x0d, 0xe0, - 0x03, 0x3b, 0x80, 0xde, 0x40, 0x27, 0xa0, 0x0b, - 0x64, 0x03, 0xfb, 0x0e, 0x7e, 0xa0, 0x3b, 0x90, - 0x0f, 0xec, 0x03, 0x3b, 0x00, 0x8e, 0x00, 0x3e, - 0x80, 0x0f, 0xa0, 0x03, 0xfa, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0xe0, 0x28, 0xb0, - 0x00, 0x3e, 0x30, 0x07, 0x80, 0x43, 0xe0, 0x00, - 0xf0, 0x00, 0x32, 0x16, 0x0f, 0x01, 0x03, 0xe0, - 0x00, 0xd8, 0x40, 0x36, 0x00, 0x0f, 0x80, 0x81, - 0xe1, 0x00, 0xd8, 0x08, 0x54, 0x00, 0x0f, 0x88, - 0x03, 0xe0, 0x20, 0xf0, 0x30, 0x3a, 0x10, 0x8f, - 0x85, 0xed, 0x09, 0x00, 0x33, 0x01, 0x83, 0x62, - 0x41, 0xc8, 0x22, 0x3a, 0x30, 0x4d, 0x81, 0x83, - 0xe0, 0x20, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x10, 0xe6, 0x80, 0xc9, 0x04, 0x72, 0x64, - 0x0f, 0x90, 0x03, 0x26, 0x60, 0xf9, 0x00, 0x30, - 0x40, 0x2c, 0x90, 0x83, 0xc4, 0x00, 0xe1, 0x04, - 0x30, 0x42, 0x0e, 0x90, 0x02, 0xc4, 0x00, 0x81, - 0x00, 0x3e, 0x72, 0x6d, 0x10, 0x63, 0x04, 0x00, - 0xe9, 0x00, 0x30, 0x40, 0x2e, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x01, 0x3e, 0x40, 0x0e, 0x90, 0x03, - 0xe4, 0x10, 0xc9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x04, 0x65, 0x00, 0x89, 0x00, 0x62, 0x51, - 0x0b, 0x90, 0x02, 0x24, 0x00, 0xb9, 0x40, 0x2a, - 0x58, 0x0d, 0x90, 0x2b, 0x24, 0x00, 0xf9, 0x60, - 0x22, 0x40, 0x0a, 0x90, 0x02, 0xe5, 0x80, 0xa9, - 0x41, 0x2a, 0x72, 0x0a, 0x94, 0x02, 0xa5, 0x00, - 0xa9, 0x42, 0x3e, 0x50, 0x08, 0x96, 0x2a, 0x25, - 0x00, 0xb9, 0x00, 0x2c, 0x72, 0x08, 0x90, 0x12, - 0xc4, 0x00, 0x89, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0x25, 0x00, 0x89, 0x06, 0x26, 0x50, - 0x0b, 0x90, 0x02, 0x24, 0x05, 0xb9, 0x00, 0x62, - 0x40, 0x08, 0x90, 0x52, 0xa4, 0x08, 0xb9, 0x00, - 0x22, 0x40, 0x1a, 0x90, 0x02, 0xec, 0x00, 0xa9, - 0x28, 0x2a, 0x40, 0x09, 0x90, 0x82, 0x24, 0x20, - 0x89, 0x08, 0x2e, 0x40, 0x09, 0x90, 0x0a, 0x64, - 0x01, 0xb9, 0x00, 0x2e, 0x60, 0x3a, 0xb0, 0x22, - 0xe4, 0x10, 0x89, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x05, 0x0a, 0x81, 0x40, 0x24, 0x40, - 0x0b, 0x14, 0x06, 0x04, 0xed, 0x09, 0x00, 0x34, - 0x01, 0x01, 0xb1, 0x00, 0xe0, 0x40, 0x09, 0x10, - 0x02, 0x04, 0x00, 0xb1, 0x00, 0x20, 0x40, 0x3a, - 0x10, 0x02, 0xc4, 0x00, 0xa1, 0x00, 0x28, 0x40, - 0x1a, 0x10, 0x02, 0x84, 0x00, 0xa1, 0x00, 0x2c, - 0xc0, 0x08, 0x90, 0x0a, 0x0c, 0x00, 0xb1, 0x40, - 0x6e, 0x40, 0x18, 0x14, 0x02, 0xe5, 0x00, 0x81, - 0x40, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x60, - 0x00, 0x88, 0x00, 0x26, 0x00, 0x0b, 0x80, 0x0b, - 0x20, 0x00, 0xfa, 0x00, 0x32, 0x00, 0x2c, 0x80, - 0x13, 0xa0, 0x08, 0xf8, 0x00, 0xb2, 0x00, 0x0e, - 0x80, 0x02, 0xe0, 0x02, 0xe8, 0x01, 0x3a, 0x00, - 0x8d, 0x80, 0x03, 0x20, 0x04, 0xe8, 0x00, 0x7e, - 0x00, 0x4d, 0x80, 0x03, 0x60, 0x04, 0x70, 0x00, - 0x3e, 0x00, 0x0e, 0x00, 0x01, 0xc0, 0x02, 0xc8, - 0x06, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xee, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x1d, 0xfd, - 0x00, 0xf9, 0x40, 0xbb, 0x40, 0x0f, 0xd0, 0x03, - 0xf5, 0x00, 0xfd, 0x40, 0x1f, 0x50, 0x2f, 0xd4, - 0x03, 0xb5, 0x08, 0x7d, 0x40, 0x3f, 0x50, 0x4f, - 0xd4, 0x03, 0xf5, 0x00, 0xfd, 0x42, 0x3b, 0x50, - 0x07, 0xd4, 0x03, 0xf5, 0x00, 0x7d, 0x40, 0x3f, - 0x50, 0x1f, 0xf4, 0x03, 0x54, 0x00, 0xfd, 0x40, - 0x3f, 0x40, 0x2f, 0xd0, 0x03, 0xf4, 0x00, 0xfd, - 0x40, 0x3e, 0x50, 0x0f, 0x90, 0x03, 0xe6, 0x06, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x01, 0xf4, - 0xc0, 0xf9, 0x04, 0x3f, 0x40, 0x0f, 0x91, 0x03, - 0xe4, 0x82, 0xd9, 0x28, 0x22, 0x48, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xe9, 0x00, 0x36, 0x48, 0x0c, - 0x92, 0x83, 0xe4, 0x80, 0xd9, 0x00, 0x3e, 0x40, - 0x0e, 0xb0, 0x03, 0xe4, 0x80, 0xe9, 0x28, 0x32, - 0x48, 0x0f, 0x90, 0x03, 0x34, 0x00, 0x49, 0xed, - 0x09, 0x00, 0x35, 0x01, 0x10, 0x37, 0x40, 0x0f, - 0x90, 0x03, 0x64, 0x40, 0xd9, 0x00, 0x32, 0x40, - 0x0f, 0x90, 0x03, 0xc6, 0x01, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x10, 0xe0, 0xc0, 0x30, 0x48, - 0x2e, 0x00, 0x0b, 0x20, 0x02, 0xe0, 0x04, 0x88, - 0x00, 0x2a, 0x04, 0x09, 0x84, 0x12, 0xe0, 0x00, - 0xa8, 0x10, 0x2e, 0x01, 0x0d, 0x80, 0x12, 0x60, - 0x40, 0x88, 0x40, 0x2e, 0x00, 0x09, 0x81, 0x42, - 0xe0, 0x10, 0xb8, 0x00, 0x36, 0x05, 0x0a, 0xc4, - 0x02, 0x20, 0x0a, 0xa8, 0x10, 0x22, 0x00, 0x0b, - 0x02, 0x03, 0x60, 0x80, 0x88, 0x48, 0x22, 0x00, - 0x0b, 0x80, 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x05, 0xc4, 0x80, 0xb1, 0x30, - 0x2c, 0x40, 0x09, 0x10, 0x02, 0xd6, 0x40, 0x95, - 0x80, 0x09, 0x60, 0x0b, 0x59, 0x02, 0xd6, 0x40, - 0xa5, 0x82, 0x25, 0x64, 0x08, 0x58, 0x02, 0x56, - 0x00, 0x85, 0x90, 0x2d, 0x64, 0x0b, 0x58, 0x02, - 0x96, 0x40, 0xb5, 0x80, 0x29, 0x60, 0x0a, 0x51, - 0x02, 0x04, 0x10, 0xa1, 0x00, 0x20, 0x40, 0x0b, - 0x12, 0x82, 0x64, 0x80, 0xb1, 0x31, 0x20, 0x44, - 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, 0x02, - 0x2e, 0x48, 0x0b, 0x90, 0x12, 0xe4, 0x00, 0x8d, - 0x00, 0x2b, 0x40, 0x0b, 0xd2, 0x06, 0xf4, 0x02, - 0xad, 0x00, 0x2f, 0x48, 0x09, 0xd0, 0x22, 0x74, - 0x40, 0x9d, 0x00, 0x2f, 0x40, 0x09, 0xd0, 0x02, - 0xf4, 0x00, 0xbd, 0x00, 0x2f, 0x41, 0x08, 0xd0, - 0x02, 0x25, 0x00, 0xa9, 0x29, 0x26, 0x58, 0x0b, - 0x92, 0x06, 0x64, 0x48, 0x89, 0x00, 0x22, 0x40, - 0x0b, 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x11, 0xe6, 0x00, 0xf9, 0x00, - 0x3e, 0x48, 0x0d, 0x94, 0x03, 0xe5, 0x40, 0xd9, - 0x52, 0x3a, 0xed, 0x09, 0x00, 0x36, 0x01, 0x50, - 0x0f, 0x9c, 0x03, 0xe7, 0x10, 0xe9, 0xd0, 0x36, - 0x50, 0x0c, 0x9c, 0x43, 0xe7, 0x00, 0xd9, 0x40, - 0x3e, 0x70, 0x0e, 0x94, 0x03, 0xe5, 0x04, 0xe9, - 0xc3, 0x3a, 0x50, 0x0e, 0x94, 0x0b, 0x24, 0x40, - 0xc9, 0x41, 0x32, 0x40, 0x0b, 0x92, 0x03, 0x65, - 0x30, 0xf9, 0x58, 0xb2, 0x40, 0x8f, 0x90, 0x03, - 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x01, 0xa6, 0x80, 0xf9, 0x02, 0x3e, 0x40, 0x0f, - 0x99, 0x03, 0xe6, 0x10, 0xf9, 0x83, 0xbe, 0x48, - 0x0d, 0x90, 0x03, 0xe5, 0x00, 0xf9, 0x80, 0x3e, - 0x62, 0x0f, 0x9a, 0x11, 0xe6, 0x12, 0xe9, 0x20, - 0x3c, 0x48, 0x0c, 0x9c, 0x03, 0xe7, 0x00, 0xf9, - 0xa1, 0x36, 0x44, 0x0e, 0x91, 0x03, 0xa6, 0x00, - 0xd9, 0x00, 0xba, 0x40, 0x8f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x01, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xca, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x10, 0xa2, 0x00, 0xc8, 0x00, 0x32, 0x25, 0x0e, - 0x84, 0x0b, 0x00, 0x02, 0xc0, 0x00, 0xba, 0x00, - 0x0f, 0x80, 0x03, 0xc0, 0x20, 0xe8, 0x00, 0x30, - 0x04, 0x0d, 0x80, 0x03, 0xc0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x1c, 0x81, 0x03, 0x60, 0x00, 0xc0, - 0x00, 0x30, 0x00, 0x0d, 0x80, 0x03, 0xe3, 0x40, - 0xc8, 0x42, 0x36, 0x30, 0x4e, 0x80, 0x01, 0xe0, - 0x00, 0xf8, 0x40, 0x2e, 0x00, 0x0c, 0x80, 0x03, - 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x05, 0x38, 0x00, 0x0a, 0x00, 0x23, 0xb0, 0x08, - 0xa0, 0x03, 0x68, 0x08, 0x8a, 0x80, 0x3e, 0x80, - 0x0b, 0xa0, 0x03, 0x29, 0x00, 0xaa, 0x00, 0x22, - 0xa0, 0x08, 0xa0, 0x02, 0x68, 0x00, 0xda, 0x00, - 0x2e, 0x80, 0x08, 0xa8, 0x02, 0xe8, 0x00, 0xaa, - 0x80, 0x3e, 0xa0, 0x08, 0x20, 0x23, 0x9b, 0x08, - 0xda, 0x00, 0x2f, 0x80, 0x18, 0xed, 0x09, 0x00, - 0x37, 0x01, 0xa0, 0x02, 0x08, 0x04, 0xba, 0x02, - 0x2e, 0x80, 0x08, 0xa0, 0x02, 0xca, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x0e, 0x01, - 0x83, 0x01, 0x20, 0xc0, 0x08, 0x30, 0x02, 0x0c, - 0x02, 0x83, 0x00, 0x24, 0xe4, 0x0b, 0x30, 0x02, - 0x8d, 0x00, 0x83, 0x80, 0x24, 0xd0, 0x09, 0x30, - 0x40, 0xcc, 0x00, 0x83, 0x00, 0x6c, 0xc0, 0x19, - 0x30, 0x22, 0xcc, 0x00, 0x83, 0x80, 0x28, 0xc0, - 0x0b, 0x30, 0x02, 0x0e, 0x04, 0x8b, 0x01, 0x24, - 0xa0, 0x0a, 0xb0, 0x02, 0x8c, 0x00, 0xbb, 0x00, - 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xca, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1a, 0x22, - 0x87, 0xa2, 0x21, 0xe0, 0x18, 0x78, 0x02, 0x58, - 0x00, 0x87, 0x08, 0x25, 0xc0, 0x0b, 0x08, 0x02, - 0x0c, 0x00, 0xa7, 0xc0, 0x65, 0xc0, 0x08, 0x40, - 0x02, 0x5c, 0x00, 0x97, 0x00, 0x2d, 0xc0, 0x29, - 0x70, 0x00, 0xd6, 0x00, 0xa3, 0x08, 0x2c, 0xd1, - 0x08, 0x70, 0x42, 0xbc, 0x00, 0x97, 0x20, 0x2f, - 0xf0, 0x18, 0x70, 0x02, 0x1c, 0x80, 0xb7, 0x00, - 0x2d, 0xe0, 0x08, 0x70, 0x02, 0xe8, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x0e, 0x00, - 0xc7, 0xa0, 0xa1, 0xe0, 0x0c, 0x7a, 0x03, 0x06, - 0x02, 0xc2, 0x80, 0x35, 0xa0, 0x4b, 0x78, 0x23, - 0x9e, 0x00, 0x62, 0x80, 0xb4, 0xe0, 0x8d, 0x78, - 0x02, 0xca, 0x00, 0xc4, 0x80, 0x2c, 0x20, 0x81, - 0x68, 0x03, 0x4a, 0x00, 0xc6, 0x82, 0x19, 0xa0, - 0x0f, 0x68, 0x03, 0x9e, 0x00, 0x47, 0xe0, 0x35, - 0xe0, 0x0a, 0x7e, 0x93, 0x9e, 0x20, 0xf7, 0x80, - 0x2c, 0xe0, 0x2c, 0x78, 0x03, 0xea, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x0d, 0xa8, 0x00, - 0xfb, 0x70, 0x3c, 0xc0, 0x07, 0xb4, 0x03, 0xa0, - 0x00, 0xfa, 0x00, 0x0e, 0x81, 0x8f, 0x80, 0x63, - 0xed, 0x09, 0x00, 0x38, 0x01, 0xac, 0x00, 0xba, - 0x00, 0x3a, 0xc0, 0x0f, 0x80, 0x03, 0x68, 0x00, - 0xd8, 0x00, 0x3e, 0x00, 0x0e, 0xa0, 0x02, 0xe0, - 0x00, 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, - 0x8c, 0x00, 0xfb, 0x20, 0x3c, 0xc0, 0x0f, 0xb6, - 0x03, 0xac, 0x80, 0xfb, 0x50, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x15, 0xfe, 0x04, 0x4f, 0xc0, 0x31, - 0x80, 0x0c, 0xfc, 0x83, 0xbe, 0x00, 0xfd, 0x90, - 0x3b, 0x60, 0x2f, 0xf1, 0x0b, 0x7a, 0x00, 0xcd, - 0x80, 0x3b, 0x20, 0x0f, 0xf9, 0x03, 0xfe, 0x00, - 0xef, 0x80, 0x3f, 0xe0, 0x0d, 0xd8, 0x23, 0x3e, - 0x00, 0xcd, 0x80, 0x33, 0x60, 0x8c, 0xf8, 0x03, - 0x3e, 0x00, 0x67, 0xd0, 0x35, 0xe0, 0x0d, 0xf8, - 0x02, 0x3e, 0x60, 0xef, 0xc0, 0x3f, 0xe0, 0x0f, - 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x01, 0xbc, 0x00, 0xa7, 0x00, 0x21, - 0xc4, 0x0d, 0x70, 0x82, 0x18, 0x40, 0xb5, 0x30, - 0x21, 0x40, 0x08, 0x42, 0x0a, 0x18, 0x80, 0x85, - 0x00, 0x35, 0x04, 0x08, 0x41, 0x02, 0xdc, 0x40, - 0xf7, 0x00, 0x2d, 0xc0, 0x0b, 0x50, 0x02, 0x14, - 0x00, 0x85, 0x00, 0x31, 0x40, 0x0a, 0x70, 0x02, - 0x18, 0x80, 0x87, 0x10, 0x21, 0xc0, 0x28, 0x70, - 0x42, 0x9c, 0x00, 0xb7, 0x18, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x95, 0x00, 0xa7, 0x00, 0x23, - 0xc4, 0x08, 0xf0, 0x02, 0x94, 0x00, 0xb0, 0x04, - 0x28, 0x00, 0x2b, 0x31, 0x0e, 0x58, 0x10, 0x80, - 0x00, 0x2c, 0x00, 0x28, 0x70, 0x42, 0xc8, 0x00, - 0x94, 0x00, 0x29, 0x00, 0x08, 0x00, 0x0a, 0x58, - 0x00, 0xa0, 0x00, 0x24, 0x04, 0x0b, 0x61, 0x02, - 0x1c, 0x14, 0xbf, 0x10, 0x2d, 0x42, 0x0a, 0xf0, - 0x0a, 0xdc, 0x30, 0xed, 0x09, 0x00, 0x39, 0x01, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xc0, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, - 0x60, 0x00, 0xab, 0x00, 0x20, 0xc0, 0x0b, 0x3e, - 0x02, 0x80, 0x00, 0xb0, 0x42, 0x20, 0x00, 0x08, - 0x02, 0x02, 0x08, 0x00, 0x80, 0x01, 0x24, 0x10, - 0x08, 0x04, 0x02, 0xc8, 0x00, 0x90, 0x40, 0x2c, - 0x00, 0x09, 0x00, 0x02, 0x40, 0x00, 0xa0, 0x00, - 0x20, 0x10, 0x2a, 0x2b, 0x02, 0x0c, 0x10, 0x93, - 0x00, 0x24, 0x72, 0x4a, 0x3c, 0x82, 0x0e, 0x10, - 0xb3, 0x40, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc8, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, - 0xad, 0x00, 0xcf, 0x00, 0x32, 0xd4, 0x88, 0x74, - 0x03, 0xae, 0x00, 0xfb, 0xc0, 0x3a, 0xf4, 0x0f, - 0xbc, 0x03, 0x66, 0x08, 0xcb, 0xc0, 0x7e, 0xf0, - 0x0c, 0xbc, 0x03, 0xe7, 0x40, 0xfb, 0x90, 0x5e, - 0xe0, 0x0d, 0xb8, 0x22, 0x6e, 0x02, 0xeb, 0x90, - 0xb6, 0xf0, 0x1e, 0x9c, 0x0a, 0x24, 0x00, 0xff, - 0x00, 0x1e, 0xd0, 0x0e, 0xf6, 0x01, 0x3d, 0x41, - 0xef, 0xd2, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xea, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0xea, 0x02, 0x9b, 0x00, 0x3e, 0xe0, 0x05, 0xb0, - 0x03, 0x6a, 0x80, 0xf3, 0xa0, 0x3e, 0xe0, 0x8e, - 0x88, 0x2b, 0xc6, 0x22, 0xf3, 0x80, 0x3c, 0xe8, - 0x0e, 0x0a, 0x03, 0xc6, 0x04, 0xf3, 0x80, 0x3e, - 0xe2, 0x0f, 0x3a, 0x03, 0x86, 0x80, 0xdb, 0x80, - 0x3e, 0xe2, 0x0f, 0x90, 0x03, 0xee, 0x20, 0xcb, - 0x80, 0x3a, 0x40, 0x0c, 0xb0, 0x03, 0xec, 0x01, - 0xfb, 0x00, 0x1e, 0xc0, 0x0f, 0xb0, 0x03, 0xe0, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0xf4, 0x02, 0xcb, 0x04, 0x33, 0x40, 0x0b, 0xf0, - 0x03, 0x74, 0x00, 0xfe, 0x00, 0xb3, 0x80, 0x0f, - 0x70, 0x0b, 0x64, 0x40, 0xee, 0x08, 0xed, 0x09, - 0x00, 0x3a, 0x01, 0x3b, 0xc0, 0x0c, 0xf0, 0x03, - 0xb0, 0x40, 0x9c, 0x00, 0x39, 0x00, 0x0c, 0xe0, - 0x12, 0x28, 0x00, 0xce, 0x00, 0x3b, 0x80, 0x4e, - 0x48, 0x03, 0x74, 0x00, 0xe7, 0x00, 0x33, 0xd0, - 0x8d, 0xf0, 0x03, 0x7c, 0x00, 0xf7, 0x00, 0x33, - 0xc0, 0x0d, 0xf0, 0x03, 0xc0, 0x44, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x81, 0x04, 0x62, 0x00, 0x8b, - 0x00, 0xa2, 0x44, 0x0b, 0xb0, 0x02, 0x20, 0x00, - 0xba, 0x00, 0x22, 0x80, 0x0b, 0x80, 0x0a, 0x64, - 0x00, 0x8a, 0x00, 0x22, 0xc0, 0x0a, 0x80, 0x02, - 0x20, 0x00, 0x88, 0x00, 0x2a, 0x00, 0x0a, 0xa0, - 0x02, 0xa0, 0x02, 0x8a, 0x00, 0x2e, 0x81, 0x0b, - 0x88, 0x02, 0x4e, 0x00, 0x2b, 0x00, 0x22, 0x60, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x04, 0x22, - 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x40, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x15, 0x2e, 0x00, 0xab, - 0x00, 0x22, 0xd0, 0x0b, 0xb0, 0x02, 0x6c, 0x00, - 0xb9, 0x02, 0x2a, 0x40, 0x0a, 0xb0, 0x1a, 0x20, - 0x00, 0xa9, 0x00, 0x2e, 0x00, 0x0a, 0xb0, 0x02, - 0xa4, 0x00, 0xab, 0x00, 0x2a, 0xc0, 0x28, 0x90, - 0x22, 0xac, 0x00, 0xa9, 0x04, 0x2e, 0x40, 0x0b, - 0x92, 0x02, 0xed, 0x40, 0xab, 0x00, 0x22, 0xc0, - 0x1b, 0xb0, 0x22, 0x6c, 0x00, 0xbb, 0x00, 0x22, - 0xc0, 0x09, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x0c, 0x04, 0x83, - 0x00, 0x20, 0xc1, 0x0b, 0xb0, 0x12, 0x08, 0x00, - 0xb1, 0x01, 0x20, 0x40, 0x0b, 0x00, 0x02, 0x40, - 0x02, 0x81, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x04, 0x03, 0x83, 0x00, 0x28, 0xc0, 0x0a, 0x10, - 0x06, 0x84, 0x00, 0x81, 0x00, 0x64, 0x40, 0x0b, - 0x10, 0x02, 0x4c, 0x00, 0x03, 0x00, 0x20, 0x60, - 0x0b, 0x30, 0x02, 0xcc, 0x04, 0xb3, 0x00, 0x20, - 0xc0, 0xed, 0x09, 0x00, 0x3b, 0x01, 0x0b, 0x30, - 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x05, 0x6c, 0x00, 0xcf, 0x01, 0x32, 0xc0, - 0x8f, 0xf0, 0x03, 0x64, 0x08, 0xf8, 0x00, 0x3a, - 0x00, 0x0e, 0xb0, 0x03, 0x20, 0x08, 0xe8, 0x00, - 0x3a, 0x00, 0x0c, 0xb0, 0x03, 0xa0, 0x00, 0xf8, - 0x00, 0x3a, 0x00, 0x0c, 0x80, 0x03, 0x28, 0x00, - 0x48, 0x00, 0x3a, 0x00, 0x0f, 0x80, 0x03, 0x6c, - 0x00, 0xef, 0x00, 0x32, 0x40, 0x0d, 0xf0, 0x03, - 0x7c, 0x00, 0xff, 0x00, 0xb2, 0xc0, 0x0d, 0xb0, - 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x15, 0xf8, 0x00, 0x9f, 0x00, 0x3f, 0xc0, - 0x4f, 0x70, 0x03, 0xf0, 0x00, 0xfc, 0x00, 0x3f, - 0x00, 0x0f, 0xc0, 0x03, 0xb0, 0x00, 0xdc, 0x01, - 0x37, 0x00, 0x0f, 0xc0, 0x43, 0x70, 0x00, 0xdc, - 0x04, 0xbf, 0x00, 0x8e, 0xc0, 0x01, 0xf0, 0x00, - 0xfc, 0x02, 0x2f, 0x00, 0x07, 0x40, 0x23, 0x9c, - 0x00, 0xff, 0x00, 0x3f, 0x40, 0x0f, 0x70, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x05, 0xf4, 0x00, 0x0c, 0x00, 0x33, 0x80, - 0x8b, 0xc0, 0x13, 0xf0, 0x00, 0xcc, 0x00, 0x3d, - 0x40, 0x08, 0xc0, 0x03, 0x30, 0x00, 0xcf, 0x00, - 0x1b, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0xfd, - 0x00, 0x3f, 0x40, 0x4f, 0xf0, 0x23, 0xfc, 0x00, - 0xd5, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xfc, 0x00, 0x33, 0x00, 0x0c, 0xd2, 0x8b, - 0x70, 0xc0, 0xcc, 0x14, 0x73, 0x00, 0xac, 0xc1, - 0x03, 0xb0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xe4, 0x00, 0x8a, 0x04, 0xa2, 0xc0, - 0x0b, 0x96, 0x22, 0xe0, 0x00, 0xc8, 0x00, 0x3a, - 0x40, 0x08, 0xa0, 0x22, 0x24, 0x28, 0x8b, 0x01, - 0x22, 0xc0, 0x0b, 0xb0, 0xed, 0x09, 0x00, 0x3c, - 0x01, 0x03, 0xa0, 0x00, 0xbb, 0x01, 0x2e, 0x40, - 0x0b, 0xa0, 0x02, 0xec, 0x00, 0xb9, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x04, 0xb3, 0x6c, - 0x22, 0x12, 0x08, 0x96, 0x02, 0xa0, 0xc0, 0x88, - 0x61, 0x62, 0x54, 0x08, 0x86, 0x02, 0x20, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xc4, - 0x00, 0xa3, 0x00, 0x20, 0x80, 0x0b, 0x14, 0x82, - 0xe0, 0x00, 0x80, 0x00, 0x2c, 0x40, 0x0a, 0x20, - 0x02, 0xa4, 0x92, 0xab, 0x00, 0x20, 0x01, 0x0b, - 0x30, 0x02, 0xc8, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc8, 0x00, 0xb1, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb0, 0x90, - 0x20, 0x0d, 0x28, 0x90, 0x8a, 0x40, 0x08, 0x80, - 0x60, 0x20, 0x2b, 0x08, 0x0c, 0x0a, 0x22, 0x11, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x11, 0xa4, - 0xa8, 0xab, 0x00, 0x22, 0x82, 0x0b, 0xb0, 0x82, - 0xe4, 0x08, 0x9a, 0x08, 0x2a, 0x40, 0x4a, 0xa0, - 0xa2, 0xac, 0x10, 0xab, 0x00, 0xa2, 0x04, 0x0b, - 0xb1, 0x22, 0xac, 0x20, 0x3b, 0x00, 0x2e, 0x50, - 0x0b, 0x80, 0x02, 0xec, 0x80, 0xb9, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x00, 0xec, 0x00, 0xb9, 0x00, - 0x22, 0x80, 0x48, 0xb8, 0x4a, 0xa4, 0x44, 0x8b, - 0x53, 0x20, 0x44, 0x18, 0x10, 0x02, 0x30, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xe0, - 0x00, 0xe0, 0x40, 0x32, 0x90, 0x0f, 0x90, 0x03, - 0xe4, 0x03, 0xc8, 0x40, 0x3e, 0x80, 0x0e, 0x20, - 0x03, 0xa4, 0x20, 0xeb, 0x00, 0x72, 0xe8, 0x0f, - 0xba, 0x03, 0xe5, 0x40, 0xb9, 0x00, 0x3e, 0xd0, - 0x0f, 0xb0, 0x03, 0xee, 0x00, 0xd8, 0xc8, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xb8, 0x01, - 0x32, 0x34, 0x4c, 0x9a, 0x0b, 0x62, 0x20, 0xc8, - 0x80, 0x22, 0x80, 0x0c, 0x89, 0x03, 0x10, 0xed, - 0x09, 0x00, 0x3d, 0x01, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x01, 0xb4, 0x00, 0xde, 0x96, - 0x3f, 0xe4, 0x8f, 0xb1, 0x03, 0xf2, 0x40, 0xee, - 0xa2, 0x33, 0xf0, 0x0d, 0xe1, 0x03, 0x74, 0x10, - 0xdf, 0x18, 0x1f, 0x60, 0x0f, 0xf8, 0x03, 0xf6, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xe0, 0x03, - 0xfe, 0x00, 0xfd, 0x10, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xfc, 0x00, 0xfe, 0x20, 0xbe, 0x40, 0x0f, - 0xf0, 0x5b, 0xfa, 0x20, 0xfe, 0x80, 0x3f, 0x00, - 0x0f, 0xa8, 0x43, 0x78, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x10, 0xa1, 0x20, 0xfb, 0x40, - 0x3e, 0x82, 0x0c, 0x94, 0x23, 0x64, 0x80, 0xc9, - 0x04, 0x3e, 0xc2, 0x0c, 0xa4, 0x13, 0xe5, 0x02, - 0xcb, 0x40, 0x32, 0x48, 0xcf, 0xb4, 0xa3, 0x27, - 0x00, 0xf9, 0x08, 0x36, 0xe0, 0x0f, 0x98, 0x03, - 0xed, 0x20, 0xf8, 0x00, 0x36, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xf8, 0x00, 0x32, 0xdc, 0x2c, - 0x98, 0x43, 0xed, 0x04, 0xf1, 0x01, 0x3e, 0x83, - 0x0f, 0xb0, 0x03, 0x10, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0xc8, 0x05, 0x05, 0x00, 0x3b, 0x40, - 0xa2, 0xc0, 0x28, 0xb8, 0x22, 0x0c, 0x00, 0xdb, - 0x00, 0x2c, 0xc0, 0x40, 0xad, 0x42, 0xcd, 0x80, - 0x73, 0x44, 0x22, 0x60, 0x0f, 0xb0, 0x82, 0x26, - 0x00, 0xbb, 0x40, 0x82, 0xe0, 0x4b, 0x8d, 0x42, - 0xec, 0x04, 0xb9, 0x58, 0x2a, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xb8, 0xc8, 0x22, 0xd0, 0x08, - 0x3c, 0x02, 0xee, 0x80, 0xbb, 0x08, 0x3a, 0x10, - 0x0b, 0xb0, 0x80, 0x32, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x05, 0x48, 0x00, 0xb3, 0x60, - 0x2c, 0x10, 0x08, 0x10, 0x22, 0x42, 0x40, 0x80, - 0x00, 0x2c, 0x50, 0x01, 0x2c, 0x06, 0xc7, 0x80, - 0xa3, 0xc4, 0x20, 0xc0, 0x0b, 0x0c, 0x02, 0x09, - 0x80, 0xb0, 0xed, 0x09, 0x00, 0x3e, 0x01, 0x80, - 0x24, 0x00, 0x0b, 0x34, 0x02, 0x4d, 0x01, 0x91, - 0xc0, 0x24, 0xc0, 0x8b, 0x30, 0x02, 0xcc, 0x01, - 0xb8, 0x48, 0x22, 0x20, 0x18, 0x10, 0x02, 0xe0, - 0x00, 0xb0, 0xa4, 0x2c, 0x34, 0x0b, 0x0c, 0x82, - 0x38, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x01, 0x12, 0x00, 0x37, 0x90, 0x61, 0xe2, 0x88, - 0x7c, 0x82, 0x32, 0x09, 0x84, 0xd0, 0x6d, 0x60, - 0x39, 0x69, 0x82, 0xd6, 0x02, 0xbf, 0x88, 0x21, - 0xe0, 0x0b, 0xd8, 0x02, 0x1e, 0x00, 0xb6, 0x88, - 0x21, 0x24, 0x0b, 0x68, 0x12, 0xde, 0x01, 0xbf, - 0x00, 0xa9, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, - 0xb7, 0x80, 0x21, 0xe0, 0x18, 0x4c, 0x22, 0xde, - 0x00, 0xb5, 0x90, 0x2d, 0xe0, 0x0b, 0x78, 0x02, - 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x08, 0x04, 0x40, 0xf3, 0x00, 0xbc, 0x04, 0x08, - 0x10, 0x03, 0x40, 0x40, 0x80, 0x00, 0x3c, 0x40, - 0x5d, 0x20, 0x43, 0xe4, 0x80, 0xc1, 0x20, 0x30, - 0xc2, 0x0f, 0x11, 0x03, 0x08, 0x10, 0xf0, 0x10, - 0x34, 0x00, 0x0f, 0x11, 0x03, 0xcc, 0x00, 0xf1, - 0x10, 0x34, 0xc0, 0x0f, 0x30, 0x02, 0xcc, 0x00, - 0xf2, 0x10, 0x30, 0x54, 0x0c, 0x30, 0x03, 0xc8, - 0xc0, 0xf2, 0x14, 0x3c, 0x00, 0x9f, 0x20, 0x0b, - 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x1d, 0xb4, 0x00, 0xf7, 0x02, 0xbd, 0xc4, 0x0f, - 0xf0, 0x03, 0xd4, 0x18, 0xfc, 0x04, 0x3f, 0xc0, - 0x0e, 0xf0, 0x03, 0xfc, 0x00, 0xf7, 0x00, 0x3f, - 0x40, 0xce, 0x50, 0x03, 0xf4, 0x40, 0xf6, 0x00, - 0x3f, 0x00, 0x0f, 0xc8, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0xbf, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0x7f, 0x10, 0x3f, 0xc1, 0x0f, 0xe1, 0x03, 0xfc, - 0x40, 0xff, 0x11, 0x3b, 0xc4, 0x0f, 0xf0, 0x13, - 0xd0, 0x06, 0x60, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x3f, 0x01, 0x00, 0x00, 0xa8, 0x05, 0xe8, 0x00, - 0xf3, 0x82, 0x32, 0x80, 0x8d, 0x90, 0x03, 0xe4, - 0x00, 0xf1, 0x80, 0x1a, 0x80, 0x2c, 0xa0, 0x03, - 0x24, 0x00, 0xca, 0x00, 0x2e, 0xc0, 0x0f, 0xb0, - 0x12, 0x64, 0x00, 0x78, 0x00, 0x3e, 0xa0, 0x0c, - 0xb0, 0x03, 0xc6, 0x00, 0xc3, 0x00, 0x3a, 0xc0, - 0x8f, 0xb0, 0x03, 0xec, 0x00, 0xf9, 0x00, 0x3e, - 0x80, 0x0f, 0xb0, 0x03, 0x24, 0x00, 0xfb, 0x00, - 0x32, 0xc0, 0x0c, 0x90, 0x03, 0xea, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x98, 0x00, - 0xb7, 0x00, 0xa1, 0xc0, 0x0b, 0x70, 0x02, 0xd0, - 0x00, 0xb6, 0x02, 0x21, 0xc0, 0x08, 0x60, 0x0a, - 0x34, 0x00, 0xa6, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0xdc, 0x00, 0xb6, 0x00, 0x2d, 0x80, 0x08, - 0x60, 0x02, 0xd4, 0x00, 0xa7, 0x00, 0x21, 0xc0, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0xf0, 0x02, 0x1c, 0x00, 0xb7, 0x00, - 0x21, 0xc1, 0x08, 0x70, 0x02, 0xd2, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x9a, 0x00, - 0xbf, 0x80, 0x21, 0xa0, 0x9b, 0x58, 0x02, 0xdf, - 0x00, 0xbd, 0x89, 0x29, 0xe0, 0x18, 0x78, 0x82, - 0x16, 0x00, 0x96, 0x80, 0x2d, 0xe0, 0x8b, 0x78, - 0x06, 0xde, 0x10, 0xb4, 0x80, 0x2f, 0xb0, 0x08, - 0x58, 0x02, 0xf7, 0x00, 0x87, 0x80, 0x29, 0xe0, - 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, - 0xe0, 0x0b, 0x78, 0x0a, 0x1e, 0x20, 0xb3, 0x84, - 0x69, 0xe1, 0x48, 0x78, 0x22, 0xf0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xce, 0x0c, - 0xb3, 0x00, 0x20, 0xe0, 0x0b, 0x3e, 0x02, 0xcc, - 0x00, 0xb3, 0x80, 0x20, 0xc2, 0x08, 0x30, 0x02, - 0x0c, 0x00, 0xb2, 0x00, 0x2c, 0xe0, 0x0b, 0x30, - 0x06, 0xce, 0x40, 0xb6, 0x00, 0x2c, 0x80, 0x28, - 0xed, 0x09, 0x00, 0x40, 0x01, 0x40, 0x02, 0xc6, - 0x00, 0xa3, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x40, 0x2c, 0xd0, 0x0b, 0x28, - 0x02, 0x0f, 0x80, 0xb3, 0x00, 0x28, 0xe0, 0x08, - 0x34, 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xe8, 0x15, 0xbb, 0x20, 0xfe, 0x00, 0x33, - 0x90, 0x0d, 0xec, 0x03, 0xfb, 0x00, 0xfe, 0x40, - 0x39, 0xa0, 0x0c, 0x6c, 0x03, 0x19, 0x00, 0xd6, - 0x18, 0x2f, 0x98, 0x0f, 0xe6, 0x23, 0x79, 0x00, - 0xfa, 0x00, 0x3e, 0xa0, 0x0c, 0xa0, 0x03, 0xf9, - 0x00, 0xce, 0x48, 0x3a, 0x80, 0x0f, 0xa0, 0x03, - 0xe8, 0x00, 0xfe, 0x40, 0x3f, 0x84, 0x0f, 0xe6, - 0x03, 0x39, 0x00, 0xbe, 0xa0, 0x3b, 0x94, 0x0c, - 0xe0, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0xe2, 0x00, 0xf8, 0x00, 0x3e, - 0x34, 0x0f, 0x81, 0x03, 0xe3, 0x00, 0xf8, 0x82, - 0x3e, 0x04, 0x0f, 0x8c, 0x33, 0xe3, 0x04, 0xe8, - 0x40, 0x3e, 0x20, 0x07, 0x8c, 0x07, 0xe2, 0x00, - 0xf8, 0x40, 0x3f, 0x00, 0x0f, 0x84, 0x03, 0xe2, - 0x08, 0xf8, 0x80, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x20, 0x3e, 0x10, 0x0f, 0x82, - 0x03, 0xe0, 0x00, 0xb8, 0x00, 0xa6, 0x04, 0x2f, - 0x84, 0x83, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x10, 0xe6, 0x00, 0xf9, 0x00, 0x3e, - 0x61, 0x0c, 0x98, 0x03, 0xe5, 0x00, 0xf9, 0x80, - 0x3a, 0x40, 0x0c, 0x90, 0x03, 0x24, 0x10, 0x49, - 0x92, 0x32, 0x40, 0x0c, 0x9a, 0x03, 0x26, 0x80, - 0xf9, 0x00, 0x32, 0x50, 0x07, 0x90, 0x03, 0xe6, - 0x80, 0xf9, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0x31, 0x82, 0x3a, 0x60, 0x0f, 0x11, - 0x23, 0x04, 0x04, 0xc9, 0x88, 0x38, 0x40, 0x2c, - 0x98, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x04, 0xed, 0x09, 0x00, 0x41, 0x01, - 0x64, 0xc0, 0xb9, 0x00, 0x2c, 0x51, 0x8a, 0x9d, - 0x02, 0xe6, 0x00, 0xb9, 0xd8, 0x26, 0x76, 0x8a, - 0x91, 0x02, 0x25, 0x00, 0x89, 0x40, 0x28, 0x44, - 0x08, 0x14, 0x8a, 0x24, 0x00, 0xb1, 0x00, 0xa2, - 0x40, 0x4b, 0x91, 0x02, 0xe7, 0x00, 0xb1, 0x50, - 0x22, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x10, 0xb9, - 0x80, 0x22, 0x76, 0x0b, 0x9c, 0x02, 0x26, 0x10, - 0xa9, 0x10, 0x22, 0x54, 0x08, 0x9e, 0x02, 0xe0, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, - 0x24, 0x00, 0xbb, 0x00, 0x2e, 0x54, 0x48, 0x94, - 0x42, 0xe4, 0x00, 0xb9, 0x00, 0x2a, 0x40, 0x48, - 0x90, 0x82, 0x27, 0x00, 0xab, 0x40, 0x22, 0x40, - 0x28, 0x90, 0x02, 0x24, 0x00, 0xbb, 0x28, 0x23, - 0x40, 0x0b, 0xd0, 0x82, 0xec, 0x00, 0xb9, 0x00, - 0x26, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x20, 0x2a, 0x40, 0x0b, 0x90, 0x02, 0x24, 0x80, - 0x81, 0x00, 0x2a, 0x42, 0x08, 0x91, 0x02, 0xc6, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x04, 0x00, 0xb1, 0x80, 0x2c, 0x40, 0x0a, 0x14, - 0x02, 0xcc, 0x00, 0xb1, 0x00, 0x26, 0x40, 0x0a, - 0x90, 0x0a, 0x25, 0x00, 0xa1, 0x00, 0xaa, 0x60, - 0x48, 0x10, 0x02, 0x06, 0x10, 0xb5, 0x00, 0x21, - 0x50, 0x0b, 0x54, 0x02, 0xc7, 0x00, 0xb1, 0x80, - 0x84, 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, - 0xc0, 0x20, 0x50, 0x0b, 0x14, 0x0a, 0x07, 0x00, - 0x83, 0x40, 0x20, 0x50, 0x08, 0x14, 0x02, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, - 0x60, 0x00, 0xf8, 0x02, 0x3e, 0x00, 0x0c, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3a, 0x00, 0x0c, - 0x80, 0x13, 0x20, 0x02, 0xe8, 0x00, 0x32, 0x00, - 0x4c, 0x80, 0x0b, 0x20, 0x00, 0xf8, 0x00, 0x32, - 0x00, 0x8f, 0xc0, 0x13, 0xe0, 0x00, 0xed, 0x09, - 0x00, 0x42, 0x01, 0xf8, 0x00, 0x36, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x0c, 0xf8, 0x00, 0x3a, 0x00, - 0x8f, 0xa0, 0x03, 0x20, 0x02, 0xc8, 0x00, 0x38, - 0x00, 0x0c, 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x1d, 0xf4, 0x00, 0xfd, - 0x42, 0x3f, 0x40, 0x0f, 0xd4, 0x43, 0xf4, 0x00, - 0xfd, 0x00, 0x1d, 0x41, 0x0f, 0x50, 0x03, 0xf4, - 0x08, 0xdd, 0x00, 0x37, 0x40, 0x0f, 0xd0, 0x43, - 0xf4, 0x00, 0xf9, 0x00, 0x34, 0x40, 0x0f, 0x90, - 0x03, 0xf4, 0x00, 0xfd, 0x00, 0x3a, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x08, 0xfd, 0x40, 0x3f, 0x50, - 0x8f, 0xd4, 0x13, 0xf5, 0x01, 0xfd, 0x41, 0x3f, - 0x50, 0x0f, 0xf4, 0x03, 0xe6, 0x06, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x05, 0xd4, 0x00, 0xcd, - 0x20, 0x33, 0x40, 0x0f, 0xd4, 0xa3, 0xb4, 0x00, - 0xfd, 0x01, 0x3f, 0x40, 0x0b, 0xd0, 0x43, 0x34, - 0x00, 0xc5, 0x02, 0x33, 0x40, 0x0c, 0xd0, 0x72, - 0x54, 0x10, 0x7d, 0x00, 0x3f, 0x40, 0x0f, 0xd0, - 0x03, 0xf4, 0x00, 0xcd, 0x00, 0x32, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x01, 0xfd, 0x00, 0x33, 0xd0, - 0x0f, 0xd0, 0x83, 0xf5, 0x00, 0xcd, 0x40, 0x33, - 0x50, 0x0d, 0xf3, 0x03, 0xc6, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, 0x02, 0x88, - 0x00, 0x22, 0x00, 0x0b, 0x86, 0x03, 0x60, 0x04, - 0xba, 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x03, 0x68, - 0x00, 0x88, 0x00, 0xb6, 0x00, 0x0a, 0x80, 0x02, - 0xe0, 0x00, 0xe8, 0x02, 0x2e, 0x00, 0x0b, 0x80, - 0x02, 0xe0, 0x02, 0x88, 0x00, 0x22, 0x00, 0x0b, - 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x20, 0x22, 0x00, - 0x8b, 0xa2, 0x02, 0xe1, 0x80, 0x88, 0x40, 0x22, - 0x10, 0x0a, 0x87, 0x02, 0xce, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, 0x00, 0x81, - 0xc0, 0xed, 0x09, 0x00, 0x43, 0x01, 0x20, 0x40, - 0x0b, 0x10, 0x02, 0x84, 0x00, 0xb1, 0x00, 0x0c, - 0x40, 0x09, 0x10, 0x02, 0x24, 0x22, 0x81, 0x00, - 0x2a, 0x40, 0x09, 0x10, 0x00, 0x4c, 0x01, 0xb1, - 0x00, 0x2c, 0x4a, 0x0b, 0x12, 0x82, 0xe4, 0x26, - 0x89, 0x03, 0x20, 0x40, 0x4b, 0x10, 0x42, 0xc4, - 0x00, 0xb1, 0x48, 0x24, 0xd0, 0x0b, 0x10, 0x82, - 0xc5, 0x81, 0x81, 0x60, 0x20, 0x58, 0x09, 0x10, - 0x22, 0xc2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x15, 0xa5, 0x00, 0x89, 0x80, 0xa2, 0x40, - 0x0b, 0x94, 0x02, 0x64, 0x04, 0xb9, 0x00, 0x2e, - 0x60, 0x03, 0x90, 0x02, 0x64, 0x40, 0x89, 0x00, - 0x4e, 0x40, 0x0b, 0x90, 0x82, 0x64, 0x60, 0xa9, - 0x00, 0x2e, 0x40, 0x03, 0x90, 0x02, 0xe4, 0x08, - 0x89, 0x00, 0x6a, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x10, 0x26, 0x40, 0x0b, 0x90, 0x02, - 0xc4, 0x06, 0x89, 0x00, 0x22, 0xc0, 0x0a, 0x90, - 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x15, 0xc7, 0x00, 0xc9, 0xc0, 0x32, 0x52, - 0x0f, 0x9d, 0x03, 0xa5, 0xc0, 0xf9, 0xc0, 0x3e, - 0x42, 0x0d, 0x9f, 0x03, 0x05, 0x10, 0xc1, 0x80, - 0x3a, 0x68, 0x5d, 0x94, 0x22, 0x64, 0x04, 0xf9, - 0x04, 0x3e, 0x40, 0xcf, 0x90, 0x47, 0xc5, 0x24, - 0xc9, 0x00, 0xb2, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xb9, 0x00, 0xb6, 0x58, 0x0f, 0x98, 0x03, - 0xe5, 0x80, 0xc9, 0x18, 0xb2, 0x40, 0x0d, 0x95, - 0x03, 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x01, 0xa4, 0x60, 0xf1, 0x00, 0x3e, 0x40, - 0x0f, 0x10, 0x03, 0xe4, 0x04, 0xf9, 0xc0, 0x3e, - 0x40, 0x0f, 0x90, 0x13, 0xe4, 0x10, 0x79, 0x10, - 0x36, 0x65, 0x0e, 0x90, 0x03, 0xe6, 0x00, 0xe9, - 0x00, 0x3e, 0x41, 0x4f, 0x92, 0x37, 0xe4, 0x00, - 0xf9, 0x00, 0x36, 0x40, 0xed, 0x09, 0x00, 0x44, - 0x01, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3a, 0x44, 0x1f, 0x9c, 0x23, 0xe4, 0x80, 0xf9, - 0x00, 0x3e, 0x40, 0x05, 0x90, 0x03, 0xca, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0xa0, - 0x00, 0xd8, 0x80, 0x3e, 0x30, 0x0f, 0x84, 0x13, - 0xa0, 0x30, 0xd8, 0xc0, 0x3e, 0x00, 0x0f, 0x80, - 0x23, 0x20, 0x00, 0xc8, 0x00, 0x32, 0x20, 0x0f, - 0x8c, 0x03, 0xe2, 0x00, 0xe8, 0x90, 0x3e, 0x00, - 0xcf, 0x81, 0x83, 0xe1, 0x20, 0xd8, 0x80, 0xb2, - 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xd0, 0x24, - 0x32, 0x18, 0x0f, 0x82, 0x03, 0xe1, 0x20, 0xf8, - 0xc1, 0x3c, 0x00, 0x2c, 0x87, 0x03, 0xca, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x38, - 0x00, 0x8e, 0xc4, 0x2f, 0xb2, 0x0b, 0xe6, 0x02, - 0x39, 0x00, 0x8e, 0x40, 0x2f, 0x83, 0x03, 0x62, - 0x02, 0xb8, 0x42, 0x8e, 0x84, 0x81, 0xb8, 0x0b, - 0xe4, 0xa2, 0xf9, 0x00, 0x8e, 0xc1, 0x2f, 0x90, - 0x4b, 0xe4, 0x02, 0xf9, 0x80, 0x86, 0xe0, 0x22, - 0x80, 0x0b, 0xa0, 0x02, 0xe8, 0x00, 0xbe, 0x00, - 0x23, 0x90, 0x4b, 0xe0, 0x02, 0xf9, 0x30, 0xbe, - 0x08, 0x2f, 0xa0, 0x48, 0xec, 0x02, 0xca, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x4c, - 0x00, 0x90, 0x00, 0x2c, 0x40, 0x0b, 0x34, 0x86, - 0x88, 0x00, 0x93, 0x00, 0x2c, 0xc0, 0x0b, 0x38, - 0x02, 0x0f, 0x00, 0x83, 0x80, 0x2c, 0x20, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x80, 0x2c, 0xdc, - 0x09, 0x34, 0x02, 0xcc, 0x00, 0x93, 0x00, 0x24, - 0xc0, 0x0b, 0x30, 0x00, 0xcc, 0x00, 0xb3, 0x80, - 0x20, 0xc0, 0x0b, 0x3c, 0x02, 0x4c, 0x00, 0xbb, - 0x00, 0x2c, 0xc0, 0x08, 0x38, 0x02, 0xca, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1d, - 0x00, 0x84, 0x40, 0x2d, 0x40, 0x0b, 0xf0, 0xed, - 0x09, 0x00, 0x45, 0x01, 0x02, 0x16, 0x08, 0x86, - 0x0a, 0x2d, 0xc0, 0x0b, 0xd0, 0x02, 0xbc, 0x28, - 0x87, 0x40, 0x2d, 0x00, 0x0b, 0x70, 0x22, 0xda, - 0x00, 0x17, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xdc, 0x08, 0x8f, 0x00, 0x25, 0xc0, 0x0b, 0x70, - 0x12, 0xdc, 0x00, 0xb7, 0x40, 0x21, 0xc0, 0x8b, - 0x70, 0x92, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0x51, - 0x88, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x00, 0xd4, 0x80, - 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0x92, 0x00, 0xd7, - 0x80, 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0x1e, 0x00, - 0xc7, 0x80, 0x39, 0x20, 0x0f, 0x78, 0x03, 0xda, - 0x00, 0xf7, 0x80, 0x3d, 0xe0, 0x0d, 0x58, 0x03, - 0xfe, 0x00, 0xd7, 0x80, 0x35, 0xe0, 0x0f, 0x78, - 0x03, 0xde, 0x00, 0xf3, 0x80, 0xb1, 0xe0, 0x0f, - 0x78, 0x13, 0x5e, 0x08, 0xf7, 0x80, 0x3c, 0xe0, - 0x0c, 0x78, 0x43, 0xea, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x1d, 0xa8, 0x10, 0xf8, 0x04, - 0x3e, 0x40, 0x0f, 0x20, 0x03, 0xc0, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x0f, 0x30, 0x00, 0xc8, 0x00, - 0xfa, 0x00, 0x32, 0x80, 0x0f, 0xb0, 0x03, 0xe8, - 0x00, 0xeb, 0x02, 0x3e, 0x40, 0x0f, 0x80, 0x03, - 0xec, 0x00, 0xf2, 0x00, 0x3a, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xf9, 0x00, 0x3e, 0x00, 0x0f, - 0xa0, 0x23, 0xe4, 0x04, 0xfa, 0x01, 0x3e, 0x80, - 0x0f, 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xcf, 0x80, - 0x3d, 0x60, 0x0c, 0xe8, 0x43, 0x3e, 0x00, 0xfc, - 0x90, 0x1f, 0xe4, 0x24, 0xd8, 0x43, 0x3e, 0x00, - 0xef, 0x84, 0x21, 0x25, 0x6c, 0x79, 0x03, 0x3a, - 0x00, 0xfe, 0x80, 0x33, 0x64, 0x0f, 0xe8, 0x03, - 0x3e, 0x00, 0xc5, 0x80, 0x33, 0xe0, 0x0f, 0xf8, - 0x03, 0xfe, 0xed, 0x09, 0x00, 0x46, 0x01, 0x00, - 0xff, 0x80, 0x33, 0xe0, 0x0e, 0xf8, 0x01, 0x3e, - 0x40, 0xdf, 0x94, 0x3f, 0xe4, 0x04, 0xf8, 0x03, - 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x11, 0x9c, 0x00, 0x86, 0x00, 0x2d, 0x46, 0x08, - 0x60, 0x02, 0x10, 0x44, 0xb4, 0x00, 0x2d, 0xc0, - 0x08, 0x50, 0x03, 0x74, 0x10, 0x85, 0x00, 0x35, - 0x10, 0x08, 0x60, 0x22, 0x10, 0x00, 0xb7, 0x00, - 0x21, 0x40, 0x0b, 0x40, 0x02, 0x1c, 0x08, 0x85, - 0x00, 0x21, 0xc0, 0x8b, 0x70, 0x02, 0xdc, 0x00, - 0xb6, 0x08, 0x35, 0xc0, 0x08, 0x54, 0x42, 0x19, - 0x00, 0xb7, 0x00, 0x2f, 0x4c, 0x4f, 0x75, 0x02, - 0x2a, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb4, 0x00, 0x87, 0x08, 0x2f, 0xc0, 0x08, - 0x60, 0x02, 0x11, 0x00, 0xb6, 0x01, 0x2f, 0xc0, - 0x19, 0xd0, 0x82, 0x54, 0x40, 0xaf, 0x00, 0x23, - 0x00, 0xc8, 0x74, 0x0a, 0x18, 0x00, 0xbf, 0x00, - 0x21, 0x40, 0x0b, 0xc0, 0x02, 0x1c, 0x00, 0xad, - 0x00, 0x25, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, - 0xb7, 0x00, 0x21, 0xc0, 0x0a, 0x70, 0x02, 0x5c, - 0x18, 0x95, 0x0a, 0x2d, 0x40, 0x08, 0x00, 0x02, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x14, 0xc6, 0x20, 0x82, 0x00, 0x2c, 0xd0, 0x08, - 0x80, 0x8a, 0x02, 0x00, 0xb2, 0x48, 0x2c, 0x82, - 0x09, 0x12, 0x02, 0x43, 0x01, 0x80, 0x80, 0x24, - 0x00, 0x08, 0x30, 0x02, 0x02, 0x01, 0xb3, 0x00, - 0x22, 0x60, 0x0b, 0x84, 0x02, 0x0c, 0x20, 0xa1, - 0x00, 0x24, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb0, 0x88, 0x24, 0x12, 0x08, 0x0a, 0x20, 0xc0, - 0x00, 0xb0, 0x88, 0x2e, 0x00, 0x1b, 0x84, 0x02, - 0x08, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x15, 0x8f, 0x00, 0xca, 0x82, 0x3e, 0x70, 0x2c, - 0x88, 0x03, 0x24, 0x00, 0xfb, 0xed, 0x09, 0x00, - 0x47, 0x01, 0xc0, 0x3e, 0xc1, 0x0d, 0xbc, 0x2a, - 0x6d, 0x00, 0xeb, 0x80, 0xb2, 0x42, 0x0c, 0xb4, - 0x03, 0x2b, 0x80, 0xf1, 0xa0, 0x32, 0x5c, 0x8f, - 0x84, 0x03, 0x0d, 0x02, 0xeb, 0x00, 0x26, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xbb, 0x00, 0x32, - 0xf0, 0x0e, 0xb4, 0x01, 0x6e, 0x00, 0xdb, 0x84, - 0x3e, 0x90, 0x0c, 0xb4, 0x83, 0x2a, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0x40, - 0xfa, 0x40, 0x3e, 0x50, 0x0f, 0x88, 0x03, 0xe0, - 0x44, 0xfa, 0x80, 0x3e, 0xc4, 0x0e, 0x90, 0x03, - 0xec, 0x60, 0xfb, 0x50, 0x3a, 0x00, 0x0f, 0xb4, - 0x03, 0xe8, 0x20, 0xfb, 0x00, 0xbe, 0x50, 0x0d, - 0x80, 0x03, 0xec, 0x04, 0xdb, 0x30, 0x3a, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3c, - 0xc4, 0x4f, 0xb1, 0x03, 0x0c, 0x40, 0x79, 0x00, - 0x1e, 0x47, 0x2c, 0x80, 0x03, 0xe0, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, 0x00, - 0xc6, 0x90, 0x33, 0xc2, 0x0f, 0x80, 0x03, 0x76, - 0x00, 0xce, 0x00, 0x3f, 0xe8, 0x8c, 0xf2, 0x03, - 0xf8, 0x04, 0xfd, 0x80, 0x3f, 0x20, 0x0c, 0xf2, - 0x02, 0xf8, 0x00, 0xff, 0x00, 0x33, 0x40, 0x0d, - 0xc0, 0x83, 0x3c, 0x00, 0xcf, 0x00, 0x33, 0xc0, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xfa, 0x00, 0x3f, - 0xc0, 0x0c, 0xd9, 0x03, 0xf8, 0x60, 0xcf, 0x00, - 0x13, 0x80, 0x0e, 0xf0, 0x81, 0x00, 0x44, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x68, 0x00, - 0x8a, 0x88, 0x22, 0x08, 0x0b, 0x88, 0x02, 0x80, - 0xc0, 0xaa, 0x40, 0x2c, 0xa0, 0x48, 0xac, 0x42, - 0xeb, 0x20, 0xb9, 0x00, 0x2c, 0x14, 0x0d, 0xbc, - 0x02, 0xe8, 0x00, 0xbb, 0x10, 0x22, 0x60, 0x88, - 0x8e, 0x02, 0xaf, 0x00, 0x80, 0x10, 0x22, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x08, 0xb8, 0xd8, 0x2e, - 0xed, 0x09, 0x00, 0x48, 0x01, 0x00, 0x28, 0x84, - 0x02, 0xe1, 0x00, 0x88, 0x08, 0x22, 0x90, 0x00, - 0x8d, 0x0a, 0x20, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x05, 0x2c, 0x00, 0x8b, 0x00, 0xa2, - 0x40, 0x0b, 0x88, 0x02, 0x64, 0x08, 0x88, 0x08, - 0x2e, 0xc0, 0x08, 0x90, 0x82, 0xe6, 0x00, 0xbb, - 0x18, 0x2e, 0x00, 0x08, 0xb4, 0x02, 0xe8, 0x80, - 0xba, 0x00, 0x22, 0x30, 0x49, 0x88, 0x02, 0x2e, - 0x20, 0x89, 0x00, 0x22, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0x89, 0x00, 0x2e, 0x04, 0x08, 0xa0, - 0x02, 0xe4, 0x00, 0x82, 0x80, 0x2a, 0x80, 0x08, - 0xb0, 0x22, 0xa0, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x2c, 0x10, 0x82, 0x00, 0x20, - 0x40, 0x4b, 0x08, 0x02, 0x84, 0x04, 0xa0, 0x00, - 0x2c, 0xc0, 0x28, 0x10, 0x02, 0xc4, 0x00, 0xb1, - 0x00, 0x2c, 0x00, 0x09, 0x30, 0x02, 0xc2, 0x00, - 0xbb, 0x04, 0x20, 0x00, 0x08, 0x00, 0x02, 0xac, - 0x00, 0x81, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x08, 0xb0, 0x00, 0x2c, 0x20, 0x08, 0x00, - 0x42, 0xc0, 0x02, 0x80, 0x00, 0xa8, 0x40, 0x08, - 0x00, 0x02, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x64, 0x00, 0xca, 0x00, 0x32, - 0x80, 0x0f, 0x80, 0x03, 0x64, 0x00, 0x8a, 0x00, - 0x3e, 0x40, 0x0c, 0xb0, 0x13, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x00, 0x0c, 0xb0, 0x03, 0xe8, 0x00, - 0xfb, 0x00, 0x32, 0x00, 0x85, 0x80, 0x43, 0x24, - 0x04, 0xc9, 0x00, 0xb2, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x11, 0xd8, 0x00, 0x3c, 0x00, 0x0c, 0x00, - 0x03, 0xe0, 0x00, 0xc8, 0x00, 0x3a, 0x00, 0x0e, - 0x80, 0x03, 0x80, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x1d, 0xd4, 0x00, 0xfe, 0x00, 0x3f, - 0x80, 0x0f, 0xc0, 0x03, 0xf4, 0x00, 0xfe, 0x01, - 0x1d, 0x01, 0x8f, 0xed, 0x09, 0x00, 0x49, 0x01, - 0x60, 0x07, 0xf0, 0x00, 0xf5, 0x00, 0x3f, 0x00, - 0x0f, 0xd0, 0x01, 0xf8, 0x00, 0xf7, 0x00, 0x3f, - 0x00, 0x0f, 0x40, 0x13, 0xd0, 0x00, 0xfd, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x01, 0xfc, - 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x02, 0xf0, 0x00, - 0xfc, 0x00, 0x37, 0x00, 0x0f, 0xc0, 0x03, 0x68, - 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x85, - 0xd0, 0x00, 0xcf, 0x20, 0x3f, 0xcc, 0x0e, 0xc4, - 0x03, 0x30, 0x40, 0xfc, 0x14, 0x33, 0xc0, 0x2c, - 0xc0, 0x03, 0x9c, 0x80, 0xff, 0x28, 0x33, 0xc0, - 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0xff, 0x20, 0x33, - 0xc2, 0x0c, 0xc0, 0x03, 0xfc, 0x00, 0xd4, 0x00, - 0x33, 0x04, 0x0f, 0xc4, 0x03, 0x70, 0x00, 0xdc, - 0x00, 0x37, 0x00, 0x0c, 0x40, 0x03, 0x38, 0x00, - 0xff, 0x10, 0x37, 0x00, 0x0c, 0xf0, 0x03, 0xf0, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x18, - 0xac, 0x00, 0x8f, 0x10, 0x2f, 0xd9, 0x08, 0xb0, - 0x02, 0x2c, 0x80, 0x9b, 0x00, 0x23, 0xd4, 0x08, - 0xb2, 0x02, 0x3c, 0x10, 0xbf, 0x40, 0x23, 0xd4, - 0x0b, 0xb0, 0x02, 0xec, 0x80, 0x8f, 0x10, 0x23, - 0xd0, 0x08, 0x32, 0x02, 0xec, 0x20, 0xb8, 0x20, - 0x22, 0x00, 0x08, 0x82, 0x02, 0xe0, 0xa0, 0xb8, - 0x00, 0x20, 0x80, 0xc8, 0x80, 0x02, 0x21, 0x80, - 0xb3, 0x42, 0x22, 0x18, 0x0a, 0xb0, 0x02, 0xe0, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x04, - 0x8c, 0x00, 0x83, 0x00, 0x2c, 0xd0, 0x08, 0xb0, - 0x02, 0x8c, 0x00, 0xb3, 0x23, 0x20, 0xc0, 0x0a, - 0xb2, 0x82, 0x8d, 0x00, 0xb3, 0x00, 0xa0, 0xc0, - 0x4b, 0x30, 0x22, 0xec, 0x20, 0xa3, 0x00, 0x20, - 0xc0, 0x28, 0x30, 0x82, 0x8c, 0x80, 0x8b, 0x08, - 0x28, 0x08, 0x0a, 0x02, 0x02, 0x48, 0x80, 0x90, - 0x00, 0x24, 0x02, 0x08, 0x80, 0x0a, 0xed, 0x09, - 0x00, 0x4a, 0x01, 0x89, 0x24, 0xb3, 0x60, 0x24, - 0x12, 0x08, 0x30, 0x02, 0xe2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x04, 0xa8, 0x00, 0x8b, - 0x00, 0x2e, 0xc0, 0x08, 0xa1, 0x0a, 0xac, 0x00, - 0x9b, 0x00, 0x22, 0xc0, 0x0a, 0xb0, 0x02, 0x2c, - 0x00, 0xbb, 0x00, 0x22, 0xc0, 0x03, 0xb0, 0x02, - 0xec, 0x00, 0x8b, 0x00, 0x22, 0xc0, 0x08, 0xa4, - 0x02, 0xec, 0x05, 0xb8, 0x40, 0xa8, 0x00, 0x08, - 0x80, 0x12, 0xe8, 0x00, 0xb8, 0x00, 0x22, 0x81, - 0x08, 0xb5, 0x00, 0xa0, 0x00, 0xbb, 0x00, 0x22, - 0x22, 0x0a, 0xb0, 0x02, 0xf0, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x51, 0x11, 0xcd, 0x40, 0xcb, - 0x00, 0x3e, 0xc0, 0x2e, 0x3c, 0x03, 0xad, 0x60, - 0xfb, 0x48, 0x92, 0xc0, 0x0e, 0xbc, 0x83, 0xac, - 0x00, 0xbb, 0x00, 0x22, 0xc0, 0x0b, 0xb8, 0x02, - 0xcc, 0x98, 0xfb, 0x00, 0xb2, 0xc0, 0x08, 0xbd, - 0x63, 0xec, 0x00, 0xd0, 0x82, 0x3a, 0x88, 0x0e, - 0x8a, 0x01, 0x60, 0x80, 0xd3, 0x00, 0x16, 0x08, - 0x00, 0x88, 0x43, 0xaa, 0x00, 0xfb, 0x00, 0x36, - 0x70, 0x2c, 0xb0, 0x03, 0xd0, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x01, 0xb0, 0x10, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xd0, 0x03, 0x7e, 0x00, - 0xdd, 0x90, 0x3d, 0xc0, 0x0d, 0xfa, 0x03, 0xfc, - 0x00, 0xf7, 0x08, 0x3f, 0xc1, 0x0f, 0xf4, 0x42, - 0xfe, 0x50, 0xff, 0x01, 0x3d, 0xc0, 0x0f, 0xf8, - 0x03, 0xfc, 0x00, 0xfc, 0x98, 0x37, 0x80, 0x0e, - 0xc9, 0x13, 0xf0, 0x00, 0xff, 0x00, 0x3f, 0x80, - 0x0f, 0xe0, 0x03, 0x7e, 0x40, 0xf7, 0x00, 0x3f, - 0x40, 0x0f, 0xf0, 0x03, 0xf8, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x50, 0x10, 0xa8, 0x00, 0xcb, - 0x88, 0x3c, 0xc0, 0x0c, 0xb0, 0x03, 0x64, 0x00, - 0xca, 0x42, 0x3e, 0xc0, 0x0c, 0x90, 0x03, 0xee, - 0x00, 0xed, 0x09, 0x00, 0x4b, 0x01, 0xcb, 0x05, - 0x3e, 0xc8, 0x4f, 0xb0, 0xa3, 0x69, 0x00, 0xf3, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0x2c, 0x00, - 0xf9, 0x54, 0x36, 0xa2, 0x4f, 0x88, 0xa3, 0xaa, - 0x10, 0xcb, 0x00, 0x32, 0x20, 0x0d, 0x92, 0x03, - 0x29, 0x00, 0xcb, 0x01, 0x32, 0x60, 0x8f, 0xb0, - 0x03, 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xc8, 0x05, 0x2e, 0x80, 0x8f, 0x40, 0x27, 0xc0, - 0x08, 0xb0, 0x03, 0x2c, 0x00, 0x8b, 0x00, 0x2f, - 0xc0, 0x4b, 0x30, 0x02, 0xfc, 0x00, 0x8f, 0xc0, - 0x2f, 0xc0, 0x0b, 0xb6, 0x02, 0xec, 0x00, 0xbf, - 0x80, 0x2f, 0xe8, 0x0b, 0xb0, 0x02, 0x2c, 0x00, - 0xb9, 0xc0, 0x02, 0xa0, 0x0b, 0x88, 0x02, 0x2a, - 0x00, 0x8b, 0x70, 0x62, 0xb1, 0x08, 0x32, 0x22, - 0x2c, 0x00, 0x8f, 0x00, 0x22, 0x74, 0x0b, 0xb0, - 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x04, 0x4c, 0x80, 0x83, 0x00, 0x2c, 0xc0, - 0x08, 0x30, 0x02, 0x4c, 0x02, 0x8b, 0x00, 0x2c, - 0xf6, 0x08, 0x30, 0x02, 0xcc, 0x20, 0x83, 0x40, - 0x2c, 0xd0, 0x0b, 0x24, 0x02, 0xcc, 0x00, 0xb3, - 0xc8, 0x24, 0xc2, 0x0b, 0x30, 0x02, 0x0c, 0x00, - 0xa0, 0x40, 0x04, 0x50, 0x0b, 0x34, 0x02, 0xc5, - 0x20, 0xb0, 0x80, 0x2e, 0x42, 0x0a, 0x08, 0x02, - 0xc0, 0x00, 0x83, 0x00, 0x22, 0x40, 0x0b, 0x30, - 0x02, 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xb0, 0x00, 0x56, 0x00, 0x87, 0x80, 0x24, 0xe0, - 0x08, 0xf8, 0x02, 0x16, 0x00, 0x86, 0x90, 0x2d, - 0xe0, 0x1b, 0x58, 0x02, 0xde, 0x02, 0x87, 0x80, - 0x2d, 0xe2, 0x0b, 0x79, 0x02, 0xda, 0x00, 0xb7, - 0x80, 0x2d, 0xe0, 0x0b, 0x79, 0x0a, 0x9e, 0x10, - 0xbc, 0x80, 0x21, 0x60, 0x0b, 0x78, 0x06, 0xd6, - 0x09, 0x9c, 0x80, 0x29, 0xe0, 0x0a, 0xd8, 0x0a, - 0xf6, 0x02, 0x87, 0x80, 0xed, 0x09, 0x00, 0x4c, - 0x01, 0x21, 0x60, 0x0b, 0x78, 0x02, 0xc8, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x4d, - 0x00, 0xc3, 0x00, 0x3c, 0xc0, 0x0c, 0x14, 0x03, - 0x6c, 0x00, 0xc1, 0x00, 0x3c, 0xc0, 0x0c, 0x30, - 0x03, 0xcc, 0x80, 0xc3, 0x08, 0x3c, 0xc0, 0x0f, - 0x30, 0x03, 0x4c, 0x00, 0xf3, 0x08, 0x3c, 0xc4, - 0x0f, 0x30, 0x03, 0x0c, 0x00, 0xe2, 0x20, 0x34, - 0x49, 0x0f, 0xb2, 0x03, 0xec, 0x00, 0xf0, 0x00, - 0x38, 0x40, 0x0c, 0x20, 0x03, 0xc0, 0x00, 0x43, - 0x00, 0x30, 0x40, 0x0f, 0x30, 0x03, 0xd2, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, 0xbc, - 0x00, 0xff, 0x00, 0x37, 0xc4, 0x0f, 0x70, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc4, 0x0f, 0xf0, - 0x03, 0xfc, 0x20, 0xff, 0x18, 0x3f, 0xc2, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x48, 0x3f, 0xc2, - 0x0f, 0xf0, 0x03, 0x7c, 0x00, 0xfe, 0x00, 0x3f, - 0x40, 0x0f, 0xf0, 0x03, 0x3c, 0x44, 0xe4, 0x10, - 0x33, 0xc0, 0x0c, 0xf0, 0x03, 0x14, 0x48, 0xff, - 0x10, 0xbf, 0x40, 0x0f, 0xf0, 0x03, 0xd0, 0x06, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0xa4, - 0x00, 0xfb, 0x68, 0x2e, 0xd0, 0x0f, 0xa0, 0x03, - 0xec, 0x00, 0xfb, 0x80, 0x36, 0xd3, 0x0f, 0xb0, - 0x03, 0xed, 0xa0, 0xfb, 0xc8, 0x3a, 0xda, 0x0f, - 0xb0, 0x03, 0x2c, 0x00, 0xfb, 0x20, 0x3e, 0xd9, - 0x0f, 0xa0, 0x23, 0x6c, 0x00, 0xf0, 0x00, 0x36, - 0xc0, 0x0f, 0xb0, 0x03, 0x64, 0x00, 0xdb, 0x01, - 0x3e, 0x60, 0x04, 0xb8, 0x03, 0x2a, 0x04, 0xcb, - 0x00, 0x3c, 0xc0, 0x2c, 0xb0, 0x03, 0xea, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x98, 0x9c, - 0x00, 0xb7, 0x00, 0x2d, 0xd2, 0x0b, 0x70, 0x00, - 0xdc, 0x00, 0xb7, 0x01, 0x21, 0xc0, 0x8b, 0x70, - 0x02, 0xdc, 0x80, 0xb7, 0x20, 0x21, 0xc8, 0xed, - 0x09, 0x00, 0x4d, 0x01, 0x0b, 0x70, 0x02, 0x9c, - 0x00, 0xb7, 0x20, 0x2d, 0xc2, 0x0f, 0x70, 0x02, - 0xbc, 0x00, 0x84, 0x00, 0x29, 0xc0, 0x0b, 0x70, - 0x12, 0x14, 0x10, 0x97, 0x00, 0x2f, 0xc0, 0x08, - 0x70, 0x12, 0xbc, 0x00, 0x87, 0x24, 0x2d, 0xc0, - 0x08, 0x70, 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x9e, 0x20, 0xb7, 0x90, - 0x2d, 0xe8, 0x8b, 0x78, 0x02, 0xde, 0x00, 0xbf, - 0x86, 0x0d, 0xec, 0x0b, 0x78, 0x02, 0xde, 0x98, - 0xb7, 0x80, 0x29, 0xe8, 0x0b, 0x70, 0x40, 0x1e, - 0x00, 0xa7, 0xa0, 0x29, 0xe0, 0x0b, 0xfc, 0x02, - 0xde, 0x00, 0xac, 0x88, 0x29, 0xe0, 0x0a, 0x78, - 0x02, 0x1e, 0x00, 0x97, 0x80, 0x2d, 0x60, 0x28, - 0x78, 0x82, 0x1a, 0x20, 0x87, 0x90, 0x2f, 0xe0, - 0x08, 0x78, 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x68, 0x04, 0x8d, 0x80, 0xb3, 0x00, - 0x2e, 0xc0, 0x0b, 0x86, 0x12, 0xc6, 0x00, 0xb0, - 0x80, 0x20, 0xc0, 0x0b, 0x90, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x20, 0xc0, 0x0b, 0x38, 0x02, 0x0b, - 0x80, 0xb3, 0x00, 0x2c, 0xc0, 0x0a, 0x28, 0x02, - 0x8c, 0x04, 0x80, 0x80, 0x68, 0xe0, 0x0b, 0xb0, - 0x02, 0x0c, 0x05, 0x93, 0x00, 0x2c, 0xc0, 0x08, - 0x38, 0x02, 0x8d, 0x00, 0x83, 0x00, 0x2c, 0xc6, - 0x08, 0x30, 0x02, 0xd3, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x15, 0xfa, 0x00, 0xfa, 0x00, - 0x3e, 0x80, 0x0f, 0xe4, 0x03, 0xfb, 0x20, 0xfe, - 0xc8, 0x36, 0x80, 0x0f, 0xe4, 0x03, 0xe8, 0x04, - 0xfa, 0x00, 0x3a, 0x80, 0x0b, 0x64, 0x03, 0x39, - 0x00, 0xfa, 0x00, 0x7e, 0x81, 0x0b, 0x68, 0x43, - 0xe8, 0x01, 0xfe, 0xc0, 0x3e, 0xa9, 0x0f, 0xa0, - 0x0b, 0x68, 0x00, 0xda, 0x20, 0x3e, 0x80, 0x0c, - 0xe5, 0x03, 0x38, 0x02, 0xca, 0x00, 0x3f, 0xa0, - 0x0c, 0xa0, 0xed, 0x09, 0x00, 0x4e, 0x01, 0x03, - 0xfb, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x01, 0xa0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, - 0x81, 0x03, 0xe2, 0x00, 0xf8, 0x08, 0x3e, 0x00, - 0x0f, 0x88, 0x03, 0xc1, 0x00, 0xf8, 0x40, 0x1e, - 0x10, 0x0f, 0x89, 0x43, 0xe0, 0x40, 0xf8, 0x00, - 0x3e, 0x10, 0x0f, 0x80, 0x83, 0x60, 0x01, 0xe8, - 0x20, 0x0e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0x38, 0xc0, 0x36, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x10, 0xa4, 0x00, 0xf9, 0x40, 0x32, 0x40, 0x8c, - 0x90, 0x03, 0x24, 0x00, 0xc9, 0x00, 0x3e, 0x60, - 0x8f, 0x90, 0x03, 0x66, 0x04, 0x89, 0x80, 0x3e, - 0x50, 0x0e, 0x98, 0x03, 0xa4, 0x00, 0xc9, 0x80, - 0x3e, 0x60, 0x0f, 0x90, 0x03, 0x24, 0x00, 0xf9, - 0x84, 0x3a, 0x71, 0x0c, 0x90, 0x0b, 0x26, 0x88, - 0xc9, 0x82, 0x3e, 0x60, 0x0f, 0x98, 0x03, 0x64, - 0x20, 0xf9, 0x00, 0x3c, 0x40, 0x0c, 0x90, 0x03, - 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x04, 0x64, 0x40, 0xb1, 0x80, 0x2a, 0x40, 0x08, - 0x90, 0x02, 0x24, 0x00, 0x89, 0x00, 0x0e, 0x60, - 0x09, 0x90, 0x62, 0x27, 0xc4, 0x89, 0xa0, 0x2e, - 0x62, 0x0b, 0x98, 0x02, 0x24, 0x00, 0x89, 0xc0, - 0x2e, 0x64, 0x0b, 0x90, 0x02, 0xa4, 0x00, 0x81, - 0x90, 0x22, 0x70, 0x08, 0x9c, 0x12, 0x27, 0x00, - 0x89, 0xe0, 0x0e, 0x74, 0x0b, 0x9c, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x28, 0x90, 0x02, - 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, - 0x05, 0x24, 0x00, 0xb9, 0x00, 0x22, 0x40, 0x08, - 0x90, 0x02, 0x04, 0x00, 0x99, 0x00, 0x06, 0x44, - 0x09, 0x90, 0x02, 0x24, 0x00, 0xa9, 0x20, 0x2e, - 0x40, 0x0b, 0x92, 0x02, 0x84, 0xed, 0x09, 0x00, - 0x4f, 0x01, 0x00, 0xa9, 0x20, 0x2a, 0x42, 0x0b, - 0x90, 0x02, 0x84, 0x00, 0xa9, 0x08, 0xa0, 0x40, - 0x08, 0xd2, 0x02, 0x94, 0x00, 0x8d, 0x10, 0x07, - 0x40, 0x0b, 0x92, 0x02, 0x6c, 0x00, 0xb9, 0x00, - 0x2e, 0x44, 0x08, 0x90, 0x02, 0xc6, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x14, 0x04, 0x00, - 0xb1, 0x80, 0x28, 0x50, 0x08, 0x14, 0x02, 0x05, - 0x02, 0x91, 0x40, 0x2c, 0x40, 0x09, 0x14, 0x4a, - 0x04, 0x02, 0xa1, 0x00, 0x2c, 0x40, 0x0b, 0x90, - 0x02, 0x05, 0x10, 0xa1, 0x02, 0x2c, 0x40, 0x8b, - 0x94, 0x00, 0x85, 0x11, 0x89, 0x40, 0x21, 0x70, - 0x08, 0x5c, 0x22, 0x97, 0x02, 0x85, 0x04, 0x2d, - 0x70, 0x0b, 0x30, 0x02, 0xc5, 0x00, 0xb1, 0x40, - 0x2c, 0x50, 0x08, 0x10, 0x02, 0xc2, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0d, 0x60, 0x10, - 0xf8, 0x00, 0x32, 0x00, 0x0c, 0x80, 0x0b, 0x20, - 0x00, 0xd8, 0x00, 0x3e, 0x80, 0x0d, 0x80, 0x03, - 0x20, 0x00, 0xe8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xa0, 0x02, 0xea, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xa0, 0x00, 0xe8, 0x00, 0x32, 0x00, - 0x2c, 0x00, 0x03, 0xa0, 0x00, 0xc8, 0x02, 0x3f, - 0x00, 0x8f, 0x80, 0x03, 0x60, 0x08, 0xf8, 0x00, - 0x3e, 0x00, 0x0c, 0x80, 0x03, 0xee, 0x03, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x98, 0x95, 0xf5, 0x00, - 0xf9, 0x41, 0x3e, 0x50, 0x2f, 0xd0, 0x03, 0xf4, - 0x00, 0xe5, 0x04, 0x36, 0x51, 0x01, 0xd0, 0x13, - 0xe5, 0x04, 0x91, 0x40, 0x3e, 0x50, 0x0f, 0x50, - 0x03, 0xf4, 0x10, 0x59, 0x40, 0x3e, 0x50, 0x0b, - 0x70, 0x03, 0xe4, 0x00, 0xed, 0x00, 0x36, 0x40, - 0x0f, 0x90, 0x13, 0x64, 0x00, 0xb9, 0x00, 0x3e, - 0x40, 0x0f, 0x50, 0x03, 0xf5, 0x04, 0xf9, 0x40, - 0x3f, 0x50, 0x0f, 0x90, 0x03, 0xe6, 0x06, 0x70, - 0xed, 0x09, 0x00, 0x50, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x05, 0xf4, 0x00, 0xed, 0x08, 0x36, - 0x4a, 0x0c, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x40, - 0x33, 0x48, 0x0f, 0xb0, 0x03, 0xf4, 0x80, 0xfd, - 0x00, 0x3d, 0x42, 0x07, 0xd0, 0x03, 0xe4, 0x00, - 0xed, 0x00, 0x33, 0x48, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf5, 0x40, 0xbb, 0x44, 0x0d, 0xd0, 0x03, - 0x34, 0x00, 0xcd, 0x00, 0x3b, 0x50, 0x0c, 0xd0, - 0x03, 0xe5, 0x00, 0xc9, 0x40, 0x3f, 0x51, 0x0f, - 0x90, 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x08, 0xe1, 0x44, 0x88, 0x42, 0x2e, - 0x18, 0x08, 0x00, 0x02, 0xe0, 0x00, 0xb8, 0x20, - 0x22, 0x10, 0x0b, 0x82, 0xc2, 0xe1, 0x00, 0xb8, - 0x00, 0x2e, 0x10, 0x0b, 0xa0, 0x00, 0xe0, 0x00, - 0xd8, 0x40, 0x2e, 0x00, 0x09, 0x82, 0x82, 0xe0, - 0x00, 0xb8, 0x20, 0xbe, 0x00, 0x08, 0x82, 0x82, - 0x20, 0x80, 0x88, 0x00, 0x2c, 0x00, 0x08, 0x80, - 0x42, 0xe1, 0x00, 0x88, 0x40, 0x2e, 0x10, 0x0b, - 0x80, 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x86, 0x00, 0xa1, 0x00, 0x24, - 0x42, 0x88, 0x12, 0x82, 0xc4, 0xa0, 0xb9, 0x04, - 0x20, 0x44, 0x09, 0x10, 0x02, 0xc4, 0x40, 0xb1, - 0x40, 0x2c, 0x40, 0x0b, 0x10, 0x20, 0xe4, 0x30, - 0x81, 0x40, 0x24, 0x51, 0x8b, 0x10, 0x02, 0x84, - 0xa0, 0xa1, 0x20, 0x28, 0x41, 0x0a, 0x12, 0x02, - 0xc4, 0xa0, 0x81, 0x00, 0x28, 0x40, 0x08, 0x10, - 0x02, 0xc5, 0x84, 0x81, 0x60, 0x2c, 0x58, 0x0b, - 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x98, 0x05, 0xa4, 0x42, 0x89, 0x00, 0x2c, - 0x40, 0x20, 0x92, 0x02, 0xe4, 0x80, 0x39, 0x81, - 0xaa, 0x40, 0x0b, 0x92, 0x82, 0xe4, 0x00, 0xb9, - 0x00, 0x4e, 0xc0, 0x0b, 0xb1, 0x42, 0xe4, 0x80, - 0x99, 0x00, 0x2e, 0xed, 0x09, 0x00, 0x51, 0x01, - 0x40, 0x09, 0x90, 0x10, 0xe4, 0x08, 0xb9, 0x40, - 0x2e, 0x40, 0x08, 0x90, 0x42, 0xe4, 0x80, 0xa9, - 0x00, 0x2e, 0x40, 0x08, 0x90, 0x00, 0xe4, 0x00, - 0x89, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xc6, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, - 0xe7, 0x02, 0xe9, 0x00, 0x36, 0x40, 0x04, 0x92, - 0x23, 0xe4, 0x20, 0xf9, 0x48, 0x32, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x14, 0xf9, 0x00, 0x3e, 0x40, - 0x4f, 0x9c, 0x03, 0xe5, 0x21, 0xa1, 0x00, 0x32, - 0x40, 0x0f, 0x9d, 0x03, 0xe4, 0x10, 0xf9, 0x50, - 0x3a, 0x40, 0x2d, 0x90, 0x0b, 0xe4, 0x02, 0xc9, - 0x00, 0x3a, 0x40, 0x2c, 0x96, 0x03, 0xe4, 0x02, - 0xc9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe8, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, - 0xa6, 0x04, 0xf9, 0x00, 0x3e, 0x40, 0x0b, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x04, 0x36, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0x79, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x07, 0xe4, 0x00, 0x79, 0x00, 0x3a, - 0x40, 0x0f, 0x98, 0x23, 0xe4, 0x00, 0xf9, 0x80, - 0x3e, 0x42, 0x0f, 0x90, 0x03, 0x24, 0x20, 0xd9, - 0x00, 0x3e, 0x43, 0x0f, 0x99, 0x03, 0xc4, 0x01, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xca, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, - 0x82, 0x10, 0xd8, 0x84, 0x32, 0x01, 0x8d, 0x84, - 0x13, 0x21, 0x10, 0xf8, 0x44, 0x7e, 0x20, 0x0d, - 0x84, 0x03, 0xe0, 0x20, 0x78, 0x80, 0x3e, 0x21, - 0x0f, 0x8c, 0x07, 0xa1, 0x00, 0xd8, 0x80, 0x32, - 0x08, 0x8e, 0x84, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x32, 0x00, 0x0d, 0x89, 0x23, 0xe0, 0x00, 0xe8, - 0x90, 0x36, 0x04, 0x0c, 0x82, 0x03, 0xa0, 0x00, - 0xc8, 0x00, 0x36, 0x02, 0x1e, 0x80, 0x03, 0xca, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x52, 0x01, 0x28, 0x01, 0xb9, 0x02, 0x8e, - 0xc8, 0x22, 0x80, 0x0e, 0xa0, 0x02, 0x28, 0x04, - 0xb2, 0x00, 0x2f, 0x98, 0x20, 0xa0, 0x02, 0xfb, - 0x00, 0x9e, 0xc8, 0x2f, 0xb0, 0x8a, 0xe4, 0x03, - 0x48, 0x00, 0x8e, 0x40, 0x23, 0xb0, 0x08, 0xa0, - 0x02, 0xe8, 0x00, 0xbe, 0xc0, 0x37, 0xa0, 0x08, - 0xe8, 0x02, 0xfa, 0x90, 0x8e, 0xc0, 0x2f, 0x80, - 0x0e, 0xea, 0x02, 0x28, 0x00, 0x8a, 0x00, 0x0f, - 0x90, 0x0e, 0xa0, 0x02, 0xca, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x04, 0x4e, 0x00, 0x91, - 0x02, 0x84, 0xc0, 0x09, 0x30, 0x02, 0x8c, 0x0c, - 0xb3, 0x00, 0x0c, 0x40, 0x08, 0x30, 0x02, 0xc3, - 0x00, 0xb1, 0x00, 0x2c, 0x60, 0x08, 0x30, 0x02, - 0x8c, 0x02, 0x82, 0x84, 0x60, 0xa0, 0x0a, 0x30, - 0x06, 0xcc, 0x00, 0xbb, 0x60, 0xa6, 0xc0, 0x09, - 0xb0, 0x02, 0xec, 0x00, 0xa3, 0x00, 0x66, 0xc0, - 0x29, 0x3c, 0x06, 0x8c, 0x00, 0x83, 0x00, 0x2c, - 0xc0, 0x0a, 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0x45, 0x04, 0x87, - 0x81, 0x25, 0xc0, 0x0a, 0x7a, 0x02, 0x9c, 0xc0, - 0xb7, 0x24, 0x2d, 0xe0, 0x08, 0x70, 0x42, 0xdc, - 0x21, 0x97, 0x00, 0x25, 0xe2, 0x0b, 0xfc, 0x02, - 0x1c, 0x80, 0x80, 0x40, 0x21, 0xf0, 0x18, 0x70, - 0x22, 0xdc, 0x80, 0x97, 0x08, 0x25, 0xd0, 0x08, - 0x70, 0x02, 0xdc, 0x00, 0xa6, 0x00, 0x2d, 0xc0, - 0x0a, 0x78, 0x02, 0x9c, 0x00, 0x87, 0x20, 0x2d, - 0x80, 0x0a, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x88, 0x98, 0x5e, 0x04, 0xd1, - 0x80, 0x75, 0xf0, 0x0d, 0x78, 0x0b, 0x9e, 0xa0, - 0xf7, 0x80, 0x0c, 0xe0, 0x0d, 0x7c, 0x83, 0xde, - 0x00, 0xf7, 0x80, 0x3d, 0xe0, 0x8c, 0x78, 0x02, - 0xbf, 0x50, 0xd4, 0x80, 0xb1, 0xe0, 0x0e, 0x7c, - 0x83, 0xed, 0x09, 0x00, 0x53, 0x01, 0xdf, 0xa0, - 0xb7, 0x80, 0x37, 0xe0, 0x0d, 0x78, 0x03, 0xfe, - 0x00, 0xa7, 0x80, 0x35, 0xe0, 0x0d, 0x78, 0x01, - 0xbf, 0x82, 0xc7, 0xb0, 0x35, 0xe0, 0x0e, 0x78, - 0x03, 0xea, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x1d, 0xac, 0x00, 0xf9, 0x00, 0x3a, 0xd2, - 0x0f, 0xb5, 0x03, 0x6d, 0x80, 0xfb, 0x20, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xe8, 0x00, 0xf9, 0x00, - 0x3e, 0xc0, 0x0e, 0x30, 0x01, 0x6d, 0x00, 0xfa, - 0x00, 0x3c, 0xc0, 0x0b, 0xb2, 0x23, 0xec, 0x00, - 0xfa, 0x00, 0xbe, 0xc0, 0x0f, 0xb0, 0x03, 0xe4, - 0x00, 0xda, 0x00, 0x3e, 0xc0, 0x0d, 0x30, 0x03, - 0x6c, 0x00, 0xfb, 0x60, 0x3e, 0x00, 0x0f, 0xb0, - 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x84, 0xba, 0x00, 0xcc, 0x80, 0x3f, 0xe0, - 0x2c, 0xfc, 0x03, 0xfe, 0x00, 0xff, 0xc8, 0x3f, - 0xe1, 0x4f, 0xf8, 0x43, 0xfe, 0x04, 0xcf, 0x80, - 0x3f, 0xc8, 0x0d, 0xf8, 0x13, 0xfe, 0x48, 0xfc, - 0x80, 0x3f, 0xe0, 0x0c, 0xf8, 0x00, 0xfe, 0x40, - 0xff, 0x80, 0x3f, 0xe1, 0x0f, 0xf8, 0x03, 0xbe, - 0x00, 0xfe, 0x80, 0x37, 0xe0, 0x0f, 0xf8, 0x03, - 0xfe, 0x10, 0xcf, 0x9c, 0x33, 0xe0, 0x0f, 0xf8, - 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x18, 0x94, 0x40, 0x84, 0x00, 0x2d, 0xc0, - 0x08, 0x70, 0x02, 0xdc, 0x40, 0xb7, 0x10, 0x2d, - 0x40, 0x0b, 0x70, 0x02, 0xd4, 0x40, 0x87, 0x00, - 0x2d, 0xc4, 0x0d, 0x70, 0x02, 0xdc, 0xc0, 0xb4, - 0x20, 0x2d, 0x90, 0x08, 0x70, 0x02, 0xdc, 0x00, - 0xe5, 0x00, 0x2d, 0xc0, 0x0b, 0x60, 0x32, 0x1c, - 0x00, 0x86, 0x00, 0x21, 0xc0, 0x0b, 0x50, 0x02, - 0xdc, 0x00, 0xaf, 0x00, 0x21, 0x80, 0x0b, 0x70, - 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x91, 0x00, 0xed, 0x09, 0x00, 0x54, - 0x01, 0x84, 0x00, 0x2d, 0xc0, 0x08, 0x70, 0x82, - 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x71, - 0x02, 0xdc, 0x00, 0x87, 0x00, 0x2d, 0x40, 0x08, - 0x71, 0x02, 0x9c, 0x04, 0x34, 0x02, 0x28, 0xc0, - 0x08, 0x70, 0x02, 0x9c, 0x00, 0x97, 0x40, 0x2d, - 0x00, 0x0b, 0x50, 0x02, 0x98, 0x40, 0xac, 0x00, - 0x21, 0x00, 0x09, 0x70, 0x02, 0xdc, 0x00, 0x97, - 0x04, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xc0, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x8e, - 0x08, 0x81, 0x00, 0x2c, 0xc0, 0x08, 0x38, 0x02, - 0xce, 0x00, 0xb3, 0x40, 0x2c, 0xc0, 0x0b, 0x3e, - 0x02, 0xcc, 0x10, 0x83, 0x00, 0x6c, 0xc0, 0x09, - 0x34, 0x02, 0xcf, 0x00, 0xb0, 0x00, 0x2c, 0xc0, - 0x28, 0xbc, 0x02, 0xcc, 0x00, 0xa1, 0x00, 0x2c, - 0x00, 0x09, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x64, 0x20, 0x8b, 0x18, 0x02, 0xed, 0x10, 0xa3, - 0x00, 0x20, 0x00, 0x0b, 0x30, 0x02, 0xc8, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, 0xe8, - 0x00, 0xcb, 0x00, 0x3f, 0xc0, 0x2c, 0xf8, 0x03, - 0xdf, 0x80, 0xff, 0x04, 0x3e, 0xc0, 0x4f, 0xfc, - 0x13, 0xcc, 0x02, 0xcb, 0x00, 0x3e, 0xc0, 0x2c, - 0xb1, 0x33, 0xff, 0x00, 0xb8, 0x01, 0x3e, 0xc0, - 0x48, 0xf8, 0x43, 0xfc, 0x00, 0xd3, 0x00, 0x3e, - 0xc0, 0x0b, 0xb0, 0x03, 0xac, 0x00, 0xfb, 0x00, - 0xb2, 0xe2, 0x0f, 0xb0, 0x03, 0xfc, 0x60, 0xcf, - 0x00, 0x32, 0x40, 0x0b, 0xb0, 0x03, 0xea, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xac, - 0x44, 0xf9, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x80, 0xfb, 0x88, 0x3e, 0xd0, 0x0f, 0xb1, - 0x03, 0xed, 0x00, 0xf3, 0x40, 0x3c, 0x40, 0x0e, - 0xbc, 0x03, 0xec, 0xc0, 0x78, 0x44, 0x3e, 0xd0, - 0x0f, 0xb1, 0x93, 0xec, 0x00, 0xfb, 0x80, 0xed, - 0x09, 0x00, 0x55, 0x01, 0x3e, 0x10, 0x0f, 0x94, - 0x03, 0xe9, 0x00, 0xf8, 0x00, 0x3a, 0x00, 0x0f, - 0xa5, 0x83, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x21, 0x10, 0xa0, 0x00, 0xf5, 0x80, - 0x32, 0xc0, 0x0f, 0xf0, 0x83, 0xfc, 0x00, 0xdf, - 0x00, 0x33, 0x40, 0x0c, 0xf0, 0x03, 0x24, 0x40, - 0xcf, 0x00, 0x32, 0xc0, 0x0d, 0xf1, 0x03, 0xfc, - 0x00, 0xfd, 0xa0, 0x3f, 0x84, 0x8c, 0xf0, 0x03, - 0xbc, 0x00, 0xfd, 0x00, 0x33, 0xe0, 0x0e, 0xe8, - 0x03, 0xfc, 0x04, 0xde, 0x00, 0x3f, 0xc8, 0x08, - 0xd0, 0x02, 0xec, 0x00, 0xcf, 0x00, 0x1f, 0x40, - 0x0c, 0xf0, 0x03, 0xc0, 0x44, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xa1, 0x04, 0x64, 0x00, 0x39, 0x84, - 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0x8b, - 0x00, 0x20, 0xc0, 0x0a, 0xb0, 0x42, 0x2c, 0x80, - 0x8b, 0x40, 0x22, 0xf4, 0x08, 0xbc, 0x02, 0xec, - 0x00, 0xb8, 0xa0, 0x2c, 0xd0, 0x0d, 0xb0, 0x12, - 0x2c, 0x00, 0xe9, 0x84, 0xa2, 0x18, 0x0b, 0x8d, - 0x83, 0xa1, 0x20, 0x88, 0x80, 0x2e, 0x00, 0x08, - 0x90, 0x42, 0xec, 0x00, 0x8b, 0x02, 0x2e, 0x74, - 0x08, 0xb0, 0x02, 0xe0, 0x40, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x05, 0x28, 0x40, 0x38, 0x18, - 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0x93, - 0x00, 0x22, 0xd5, 0x08, 0x30, 0x02, 0x28, 0x00, - 0x89, 0xc0, 0x22, 0xc0, 0x08, 0xb0, 0x02, 0xec, - 0x00, 0xba, 0x00, 0x2e, 0xc0, 0x08, 0xb0, 0x02, - 0x2c, 0x00, 0xbb, 0x80, 0x22, 0xc9, 0x0b, 0xb0, - 0x02, 0xc4, 0x80, 0x9a, 0x10, 0x2c, 0xc2, 0x8b, - 0xb1, 0x86, 0xec, 0x08, 0x8b, 0x02, 0x2c, 0x10, - 0x08, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x14, 0x0a, 0x08, 0xb1, 0x00, - 0xa0, 0xc0, 0xed, 0x09, 0x00, 0x56, 0x01, 0x0b, - 0x30, 0x02, 0xec, 0x00, 0x83, 0x04, 0xa0, 0xc0, - 0x0a, 0x30, 0x42, 0x0c, 0x00, 0x83, 0x00, 0x20, - 0xc0, 0x08, 0x20, 0x06, 0xcc, 0x00, 0xb0, 0x00, - 0x6c, 0xc0, 0x09, 0x30, 0x1a, 0x0c, 0x00, 0x89, - 0x80, 0x20, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x00, - 0x80, 0x80, 0x2c, 0x00, 0x0b, 0x10, 0x02, 0xcc, - 0x00, 0x83, 0x00, 0x2c, 0x80, 0x08, 0x30, 0x02, - 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x33, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xdf, 0x00, 0x32, 0xc0, - 0x0c, 0xf0, 0x03, 0x2c, 0x02, 0x8b, 0x00, 0xb2, - 0xc0, 0x28, 0xb0, 0x03, 0xfc, 0x00, 0xf8, 0x00, - 0x2e, 0xc0, 0x0c, 0xf0, 0x03, 0x3c, 0x04, 0xf9, - 0x00, 0xb2, 0x00, 0x0f, 0x00, 0x03, 0xc0, 0x00, - 0xd8, 0x00, 0x3e, 0x00, 0x2f, 0x90, 0x03, 0xec, - 0x02, 0xcf, 0x00, 0x3e, 0x00, 0x0c, 0xb0, 0x03, - 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa2, - 0x15, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xc0, 0x4f, - 0xf0, 0x43, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x00, - 0x0f, 0xf0, 0x0b, 0xf0, 0x00, 0xfc, 0x00, 0x3f, - 0x00, 0x1e, 0xc0, 0x13, 0xfc, 0x00, 0xfe, 0x01, - 0x3f, 0x00, 0x8f, 0xf0, 0x03, 0xfc, 0x00, 0x6d, - 0x00, 0xbf, 0x01, 0x0f, 0xc0, 0x13, 0xb0, 0x00, - 0xf4, 0x00, 0x7f, 0x00, 0x0c, 0xd0, 0x03, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0x00, 0x0f, 0xf0, 0x03, - 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x05, 0xfc, 0x00, 0xcc, 0x00, 0x3f, 0xc0, 0x00, - 0xe0, 0x03, 0x30, 0x80, 0xcf, 0x00, 0x39, 0x01, - 0x0f, 0xc0, 0x43, 0x30, 0x00, 0xcd, 0x00, 0x33, - 0x80, 0x0f, 0xe0, 0x03, 0xfc, 0x00, 0xcd, 0x10, - 0x3b, 0xc0, 0x0c, 0x50, 0x03, 0xf1, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0xed, 0x09, 0x00, - 0x57, 0x01, 0x03, 0xdc, 0x00, 0xdc, 0x20, 0x33, - 0x02, 0x0c, 0xc1, 0x03, 0xb0, 0x40, 0xdc, 0x35, - 0x37, 0x18, 0x0c, 0x42, 0x83, 0x30, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xfc, 0x01, - 0x88, 0x00, 0x2e, 0x81, 0x08, 0xb0, 0x02, 0x2d, - 0x08, 0x8b, 0x00, 0x22, 0x40, 0x09, 0x92, 0x00, - 0x20, 0x00, 0xc9, 0x00, 0x22, 0xc0, 0x0b, 0xb0, - 0x42, 0xec, 0x00, 0x81, 0x00, 0x2a, 0x81, 0x0a, - 0x90, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xb8, 0x40, 0x22, - 0x13, 0x08, 0x87, 0x12, 0x28, 0x40, 0xb8, 0x30, - 0x22, 0x0d, 0x28, 0x84, 0x02, 0x20, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, 0xa0, - 0x80, 0x00, 0x2c, 0x80, 0x48, 0x30, 0x0a, 0x04, - 0x40, 0x89, 0x00, 0x2c, 0x20, 0x4b, 0x80, 0xde, - 0x00, 0x00, 0x88, 0x00, 0x20, 0xc0, 0x0b, 0x20, - 0x02, 0xec, 0x04, 0x9b, 0x20, 0x2c, 0xc0, 0x19, - 0x10, 0x02, 0xcc, 0x80, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb0, 0xb8, 0x20, - 0x08, 0x1a, 0x00, 0x02, 0x00, 0x80, 0x90, 0x20, - 0x24, 0x00, 0x09, 0x10, 0x02, 0x22, 0x01, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xac, 0x08, - 0x88, 0x80, 0x2e, 0x80, 0x08, 0xb1, 0x42, 0x2c, - 0x88, 0x8b, 0x01, 0x2e, 0x48, 0x09, 0x90, 0x46, - 0x20, 0x80, 0x0b, 0x44, 0x22, 0xca, 0x0b, 0xb0, - 0x52, 0xec, 0x00, 0x9b, 0x52, 0x2e, 0x82, 0x0b, - 0x90, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x08, 0xb3, 0x10, 0x22, - 0x03, 0x88, 0xbc, 0x02, 0x28, 0x20, 0xba, 0x00, - 0x22, 0xc8, 0x08, 0x90, 0x02, 0x30, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xec, 0x02, - 0x89, 0xc0, 0x3c, 0xe2, 0x0c, 0x2a, 0x13, 0x25, - 0xed, 0x09, 0x00, 0x58, 0x01, 0x02, 0xcb, 0xe1, - 0x3e, 0x00, 0x0f, 0x10, 0x03, 0x05, 0x38, 0xca, - 0x40, 0xb2, 0xd0, 0x0f, 0xa0, 0x43, 0xed, 0x02, - 0xd3, 0x40, 0x3c, 0xc1, 0x0d, 0x98, 0x03, 0xec, - 0x80, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xe4, 0x00, 0xf8, 0x84, 0x32, 0x74, 0x28, 0x84, - 0x11, 0x25, 0x08, 0x98, 0x20, 0x36, 0x28, 0x0c, - 0xa0, 0x03, 0x10, 0x44, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xe1, 0x01, 0x9c, 0x00, 0xf9, 0x00, 0x3f, - 0xe4, 0x2f, 0xf8, 0x03, 0xfe, 0x00, 0xff, 0xcc, - 0x33, 0xe0, 0x0b, 0xfa, 0x03, 0xf2, 0x10, 0xee, - 0x00, 0x3f, 0xe0, 0x0f, 0xf1, 0x03, 0xfe, 0x80, - 0xef, 0x00, 0x3b, 0xc0, 0x0e, 0xdc, 0x43, 0xfe, - 0x40, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x88, 0xbf, 0xc0, 0x0f, 0xd0, - 0x03, 0x74, 0x00, 0xfd, 0xa0, 0x3f, 0x80, 0x0f, - 0xf1, 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x10, 0xac, 0x80, 0xc9, 0x40, 0xb2, - 0xc2, 0x0f, 0x94, 0x03, 0xed, 0x00, 0xf9, 0x40, - 0x36, 0xc2, 0x8c, 0x90, 0x03, 0x2c, 0x04, 0xfa, - 0x48, 0xb2, 0xc4, 0x8f, 0xb8, 0x03, 0xec, 0x20, - 0xfb, 0x00, 0x32, 0x41, 0x0f, 0x90, 0x03, 0x2c, - 0x40, 0xdb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xf8, 0x00, 0x30, 0x48, 0x0e, 0xa0, - 0x03, 0xed, 0x00, 0xe3, 0x00, 0x2e, 0x42, 0x0c, - 0xa0, 0x83, 0x10, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xc8, 0x05, 0x3c, 0x00, 0x88, 0x05, 0x22, - 0xe2, 0x0b, 0x95, 0x02, 0xcc, 0x10, 0xb3, 0xc4, - 0x82, 0xd0, 0x4a, 0xb4, 0x02, 0x2d, 0x80, 0xb2, - 0x44, 0x22, 0xf0, 0x09, 0xb8, 0x10, 0xcf, 0x00, - 0xbb, 0x00, 0x22, 0xfd, 0x0b, 0x99, 0x02, 0x2c, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0x8b, 0xed, 0x09, 0x00, 0x59, 0x01, - 0x00, 0x22, 0xf0, 0x4b, 0xb8, 0x12, 0xec, 0x00, - 0xab, 0x90, 0x26, 0xc2, 0x08, 0x34, 0x02, 0x32, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, - 0x4e, 0x00, 0x82, 0x00, 0x20, 0xb0, 0x0b, 0x04, - 0x12, 0xc6, 0x08, 0xb0, 0x00, 0x24, 0x20, 0x08, - 0x20, 0x02, 0xc3, 0x21, 0xb1, 0xd0, 0x20, 0x72, - 0x0b, 0x00, 0x02, 0xcd, 0x00, 0xb3, 0x10, 0xa0, - 0xd0, 0x09, 0x18, 0x02, 0x0c, 0x04, 0x93, 0x02, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb0, - 0x40, 0x20, 0x80, 0x0b, 0x80, 0x14, 0xc0, 0x10, - 0x80, 0x80, 0x26, 0x00, 0x08, 0x00, 0x02, 0x30, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x11, - 0x0e, 0x20, 0x86, 0x80, 0x21, 0xa0, 0x0b, 0x48, - 0x02, 0xde, 0x40, 0xb7, 0xb0, 0xa1, 0xe0, 0x0a, - 0x7c, 0x02, 0x52, 0x08, 0xbd, 0x80, 0x21, 0xe4, - 0x09, 0x7c, 0x02, 0xda, 0x20, 0xb7, 0xf0, 0x21, - 0xe0, 0x4b, 0xd8, 0x22, 0x1e, 0x40, 0xb7, 0x81, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xf8, 0x40, 0x80, - 0x80, 0x21, 0x24, 0x0b, 0x68, 0x82, 0xfa, 0x20, - 0xa7, 0x90, 0x64, 0x60, 0x88, 0x69, 0x02, 0x88, - 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, - 0x0c, 0x40, 0xc2, 0x00, 0x30, 0x80, 0x0f, 0x10, - 0x03, 0xcc, 0x20, 0xf0, 0x38, 0x34, 0x82, 0x4c, - 0x80, 0x0b, 0xc0, 0x00, 0xf0, 0x00, 0x30, 0xc4, - 0x0f, 0x20, 0x03, 0xcd, 0x00, 0xf3, 0x20, 0x30, - 0xc0, 0x0f, 0x10, 0x83, 0x0c, 0x00, 0xd3, 0x00, - 0x3c, 0xc0, 0x0f, 0x30, 0x17, 0xcd, 0x40, 0xf3, - 0x01, 0x30, 0xc3, 0x0f, 0x10, 0x03, 0xc0, 0x00, - 0xe1, 0x08, 0x3c, 0x81, 0x4c, 0x10, 0x03, 0x12, - 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, - 0xbd, 0x04, 0xfe, 0x00, 0x3f, 0x04, 0x4f, 0xd0, - 0x01, 0xfc, 0x00, 0xf7, 0x30, 0x3f, 0xed, 0x09, - 0x00, 0x5a, 0x01, 0xc0, 0x0f, 0xd0, 0x03, 0xb0, - 0x00, 0xf7, 0x00, 0x3f, 0xc4, 0x01, 0xf1, 0x01, - 0xfc, 0x40, 0xfe, 0x20, 0x3f, 0xc0, 0x4f, 0xf0, - 0x0b, 0xfc, 0x10, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xf8, 0x80, 0xff, 0x00, 0x3f, 0x40, - 0x0f, 0xf0, 0x03, 0xd8, 0x40, 0xff, 0x00, 0x3f, - 0xc4, 0x0f, 0xf0, 0x43, 0x50, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x05, 0xed, 0x00, 0x7b, - 0x80, 0x10, 0xc0, 0x2c, 0x80, 0x02, 0x24, 0x00, - 0xc1, 0x80, 0x32, 0x40, 0x0f, 0xb0, 0x03, 0x00, - 0x00, 0xcb, 0x00, 0x3c, 0xc0, 0x08, 0xb0, 0x03, - 0xec, 0x00, 0xc3, 0x00, 0x30, 0xe0, 0x0c, 0x90, - 0x03, 0xcc, 0x00, 0xcb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xe4, 0x00, 0xfb, 0x00, 0x3e, 0xa0, - 0x0d, 0xb8, 0x0b, 0x20, 0x00, 0xda, 0x80, 0xba, - 0xc0, 0x0f, 0x88, 0x0b, 0x02, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x11, 0x9d, 0x00, 0xb7, - 0x01, 0x35, 0x40, 0xa8, 0x50, 0x02, 0x1c, 0x00, - 0x87, 0x01, 0x21, 0xc0, 0x0b, 0xf0, 0x23, 0x50, - 0x00, 0x87, 0x04, 0x2d, 0xc0, 0x08, 0x70, 0x02, - 0xd4, 0x04, 0x87, 0x00, 0x29, 0xc0, 0x0a, 0x70, - 0x02, 0xdc, 0x00, 0x87, 0x01, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2c, 0x81, - 0x08, 0x70, 0x02, 0x30, 0x00, 0x87, 0x00, 0x21, - 0xc0, 0x0b, 0x30, 0x02, 0x12, 0x26, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xc1, 0x00, 0x9e, 0x00, 0xb1, - 0x80, 0x61, 0xe0, 0x08, 0xd8, 0x0a, 0x3e, 0x0a, - 0xbd, 0x80, 0x21, 0xf0, 0x0b, 0x58, 0x82, 0x36, - 0x04, 0x06, 0x80, 0x2d, 0xf0, 0x09, 0x78, 0x12, - 0xfe, 0x00, 0x8f, 0x80, 0x63, 0x60, 0x08, 0x58, - 0x02, 0xfe, 0x22, 0x87, 0x80, 0x2d, 0xe0, 0x0b, - 0x78, 0x02, 0xde, 0x00, 0xb7, 0xc0, 0x2d, 0xe0, - 0x0a, 0xed, 0x09, 0x00, 0x5b, 0x01, 0x38, 0x02, - 0x5a, 0x00, 0x97, 0x80, 0x21, 0xe0, 0x0b, 0x48, - 0x02, 0x88, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x14, 0xcc, 0x00, 0xb3, 0x88, 0x24, 0x60, - 0x98, 0x10, 0x02, 0x0c, 0x00, 0xb3, 0x40, 0x20, - 0xe0, 0x0b, 0xb8, 0x02, 0x4e, 0x02, 0x83, 0x80, - 0x2c, 0xe0, 0x09, 0x30, 0x02, 0xcd, 0x00, 0x8b, - 0x90, 0x28, 0xe0, 0x0a, 0x31, 0x02, 0xee, 0x00, - 0xa3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xca, - 0x41, 0xb3, 0xe0, 0x2c, 0xd4, 0x2a, 0x31, 0x02, - 0x4a, 0x00, 0x83, 0x00, 0x60, 0xd8, 0x0b, 0x3d, - 0x02, 0x9a, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xe8, 0x15, 0xa8, 0x00, 0xfe, 0x00, 0x31, 0x92, - 0x08, 0xe6, 0x03, 0x38, 0x00, 0xfe, 0x10, 0x33, - 0x90, 0x0f, 0xe4, 0x03, 0x39, 0x10, 0xc6, 0xc8, - 0x3d, 0xb0, 0x2d, 0xe4, 0x03, 0xda, 0x62, 0xce, - 0xc0, 0x33, 0x90, 0x4c, 0xe8, 0x03, 0xf9, 0x00, - 0xca, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xf9, - 0x00, 0xfe, 0x40, 0x2f, 0xa0, 0x0e, 0xe9, 0x03, - 0x59, 0x00, 0xde, 0xd8, 0x33, 0xb2, 0x0f, 0xe1, - 0x03, 0xba, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0xe0, 0x14, 0xf8, 0x10, 0x3e, 0x20, - 0x2f, 0x88, 0x0b, 0xe2, 0x00, 0x08, 0x42, 0xbe, - 0x30, 0x0f, 0x8c, 0x03, 0xe3, 0x40, 0xf8, 0x80, - 0x3e, 0x20, 0x0e, 0x8d, 0x03, 0xe0, 0x00, 0xf8, - 0x80, 0x3e, 0x24, 0x0f, 0x84, 0x03, 0xe2, 0x00, - 0xd8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x23, 0xe2, - 0x00, 0xf8, 0x04, 0x3e, 0x08, 0x0c, 0x84, 0x03, - 0xa0, 0xc0, 0xf8, 0x00, 0x56, 0x00, 0x0f, 0x80, - 0x03, 0x52, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x80, 0x3e, 0x40, - 0x2e, 0x90, 0x03, 0x24, 0x02, 0xc9, 0x00, 0x3e, - 0x60, 0x0f, 0x91, 0x03, 0xed, 0x09, 0x00, 0x5c, - 0x01, 0x26, 0x42, 0xd9, 0x20, 0x32, 0x40, 0x0c, - 0x9a, 0x23, 0xe4, 0x80, 0xc9, 0x00, 0x3a, 0x40, - 0x0f, 0x92, 0x03, 0x24, 0x00, 0xe9, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf1, 0x80, - 0x32, 0x40, 0x0f, 0x9a, 0x03, 0xe4, 0x80, 0xc9, - 0x80, 0x3e, 0x40, 0x0c, 0x90, 0x03, 0xc2, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x65, - 0x00, 0xb9, 0x00, 0x6e, 0x50, 0x08, 0x10, 0x0a, - 0x86, 0x00, 0x89, 0x48, 0x2e, 0x52, 0x0b, 0x9e, - 0x23, 0x04, 0x98, 0x89, 0x03, 0x36, 0x76, 0x08, - 0x90, 0x82, 0xe5, 0x80, 0xd9, 0x08, 0x36, 0x40, - 0x0b, 0x14, 0x02, 0x24, 0x00, 0xa9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x10, - 0x22, 0x50, 0x4b, 0x98, 0x02, 0xe6, 0x10, 0xa9, - 0x88, 0x2e, 0x40, 0x0a, 0x94, 0x02, 0xe0, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, - 0x40, 0xbb, 0x20, 0x2e, 0x40, 0x0a, 0x90, 0x02, - 0x2c, 0x80, 0x89, 0x20, 0x2e, 0x48, 0x4b, 0x90, - 0x0a, 0xa4, 0x00, 0x89, 0x00, 0x62, 0x41, 0x98, - 0xb0, 0x02, 0xe4, 0x00, 0x89, 0x80, 0xae, 0x40, - 0xcb, 0x90, 0x02, 0x24, 0x00, 0x89, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xa4, 0x00, 0xa9, 0x00, - 0x22, 0x4a, 0x8b, 0x90, 0x06, 0xe4, 0x00, 0x89, - 0x10, 0x2c, 0x48, 0x0a, 0x95, 0x02, 0xce, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x05, - 0x00, 0xb1, 0x00, 0x2e, 0x40, 0x08, 0x90, 0x02, - 0xa6, 0x01, 0x81, 0x00, 0x2c, 0x40, 0x1b, 0x14, - 0x0a, 0x04, 0x00, 0x91, 0x00, 0x26, 0x41, 0x08, - 0x10, 0x06, 0xc4, 0x00, 0x91, 0x40, 0x24, 0x40, - 0x0b, 0x30, 0x02, 0x05, 0x00, 0xa1, 0x00, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0xc0, - 0x20, 0x50, 0x03, 0x14, 0x02, 0xe5, 0x00, 0xed, - 0x09, 0x00, 0x5d, 0x01, 0xa1, 0x40, 0x2c, 0x70, - 0x0a, 0x10, 0x02, 0xca, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb8, 0x0d, 0x68, 0x00, 0xf8, 0x02, - 0x2e, 0x80, 0x0e, 0x80, 0x42, 0x20, 0x10, 0xc8, - 0x00, 0x3e, 0x00, 0x4b, 0x80, 0x02, 0xa0, 0x04, - 0xca, 0x00, 0xb2, 0x00, 0x0c, 0x80, 0x03, 0xe0, - 0x00, 0xc8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0x20, 0x00, 0xe8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xa0, 0x00, 0xe8, 0x00, 0xb2, 0x01, 0x0f, - 0xa0, 0x03, 0xe0, 0x00, 0xc0, 0x00, 0x3e, 0x00, - 0x2c, 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x98, 0x1d, 0xe5, 0x00, 0xfd, 0x42, - 0x3f, 0x40, 0x0f, 0x70, 0x03, 0xdd, 0x00, 0xfd, - 0x00, 0x3f, 0x40, 0x0f, 0xd0, 0x03, 0xb4, 0x00, - 0xed, 0x00, 0x3f, 0xc0, 0x2b, 0xd0, 0x01, 0xd4, - 0x04, 0xfd, 0x00, 0xbf, 0x40, 0x0f, 0xd0, 0x0b, - 0xf4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xfc, 0x00, 0xff, 0x40, 0x3f, 0x50, 0x0f, - 0xd4, 0x13, 0xf5, 0x00, 0xfd, 0x40, 0x3f, 0x51, - 0x0d, 0xd4, 0x03, 0xe6, 0x24, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x98, 0x05, 0xf4, 0xc0, 0xfd, 0x00, - 0x33, 0x40, 0x83, 0xd0, 0x03, 0x3c, 0x80, 0xe5, - 0x00, 0x3f, 0x40, 0x0c, 0xd0, 0x13, 0x34, 0x08, - 0xe5, 0x00, 0x33, 0x40, 0x07, 0xd0, 0x43, 0xf4, - 0x00, 0xfd, 0x00, 0x37, 0x40, 0x0f, 0xd0, 0x03, - 0xf4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xed, 0x10, 0x3f, 0x48, 0x0c, - 0xd2, 0x83, 0x34, 0xc0, 0xcd, 0x00, 0x33, 0x40, - 0x0c, 0xd0, 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x39, 0x10, 0xe0, 0xc0, 0xba, 0x40, - 0x22, 0x00, 0x0b, 0x80, 0x02, 0x20, 0x00, 0x88, - 0x00, 0x0e, 0x00, 0x08, 0x80, 0x82, 0x20, 0x00, - 0xd8, 0x00, 0xed, 0x09, 0x00, 0x5e, 0x01, 0x22, - 0x00, 0x0b, 0x80, 0x02, 0xe8, 0x00, 0xb2, 0x08, - 0x32, 0x00, 0x0b, 0x80, 0x03, 0xa0, 0xa0, 0xb8, - 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x00, - 0x80, 0x10, 0x2e, 0x0b, 0x08, 0x02, 0x02, 0x20, - 0xc0, 0x88, 0x48, 0x22, 0x82, 0x48, 0xc1, 0x02, - 0xce, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x05, 0xc4, 0x80, 0xb1, 0x10, 0x20, 0x60, 0x0b, - 0x10, 0x02, 0x04, 0x48, 0xa1, 0x00, 0x2e, 0x60, - 0xa8, 0x12, 0x02, 0xc4, 0x00, 0x81, 0x00, 0xac, - 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x20, - 0xa4, 0x40, 0x0b, 0x10, 0x12, 0xc4, 0x80, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xe4, 0x00, - 0xa1, 0x00, 0x2c, 0x4c, 0x18, 0x12, 0x8a, 0x4c, - 0x80, 0x83, 0x30, 0x28, 0x44, 0x08, 0x10, 0x22, - 0xd2, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x15, 0xa4, 0x00, 0xb9, 0x00, 0x22, 0x60, 0x8b, - 0x91, 0x0a, 0x24, 0x10, 0x89, 0x00, 0x2e, 0x60, - 0x08, 0x90, 0x04, 0xac, 0x40, 0x99, 0x00, 0x26, - 0x40, 0x0b, 0x90, 0x02, 0x64, 0x40, 0xb1, 0x05, - 0xe2, 0xc4, 0x0b, 0x90, 0x06, 0xa4, 0x80, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x80, - 0x89, 0x00, 0x2e, 0x42, 0x38, 0x92, 0x82, 0x64, - 0x80, 0x89, 0x00, 0x2a, 0x40, 0x08, 0x90, 0x02, - 0xc6, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x15, 0xe4, 0x00, 0xf9, 0xd0, 0x32, 0x70, 0x0f, - 0x18, 0x03, 0x27, 0x08, 0xe9, 0x90, 0x3e, 0x50, - 0x4c, 0x90, 0x0b, 0xe6, 0x2c, 0xc1, 0x9c, 0x3e, - 0x60, 0x0f, 0x9e, 0x03, 0xe6, 0x00, 0xf9, 0x50, - 0x36, 0x61, 0x0f, 0x90, 0x03, 0xe4, 0x80, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe5, 0x00, - 0xe9, 0xc0, 0x3e, 0x50, 0x0c, 0x94, 0x63, 0x66, - 0x01, 0x89, 0x18, 0xba, 0x70, 0xed, 0x09, 0x00, - 0x5f, 0x01, 0x2c, 0x94, 0x83, 0xe8, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0xa4, 0x00, - 0xf1, 0x00, 0xbe, 0x40, 0x0f, 0x98, 0x03, 0xe7, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x92, 0x03, - 0x24, 0x30, 0xd9, 0x80, 0x3a, 0x50, 0x0f, 0x94, - 0x03, 0xe4, 0x00, 0xf9, 0x80, 0xbe, 0x60, 0x8f, - 0x92, 0xd3, 0xe4, 0x00, 0xf9, 0x00, 0x36, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x20, 0x3c, - 0x40, 0x07, 0x98, 0x03, 0x84, 0x02, 0xf1, 0x00, - 0x34, 0x64, 0x0f, 0x90, 0x03, 0xd2, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0xa2, 0x00, - 0xc8, 0x50, 0xb2, 0x21, 0x0f, 0x88, 0x03, 0x00, - 0x00, 0xf8, 0x90, 0x32, 0x20, 0x0f, 0x88, 0x03, - 0x60, 0x00, 0xf8, 0xc0, 0xb2, 0x11, 0x0b, 0x88, - 0x13, 0xe0, 0x00, 0xf8, 0x40, 0xb6, 0x20, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xe8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xe1, 0x00, 0xf8, 0x40, 0x72, - 0x12, 0x2c, 0x80, 0x83, 0x20, 0x00, 0xc8, 0x00, - 0x3a, 0x00, 0x0d, 0x8c, 0x03, 0x82, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0x38, 0x02, - 0x8a, 0x00, 0xa3, 0x90, 0x4e, 0xe4, 0x0a, 0x39, - 0x00, 0xbe, 0x41, 0x21, 0x92, 0x0b, 0xe0, 0x83, - 0x99, 0x20, 0x1e, 0x60, 0x83, 0x84, 0x0b, 0xe4, - 0x12, 0xfa, 0x44, 0xbe, 0x00, 0x2b, 0xb1, 0x4b, - 0xe0, 0x02, 0xea, 0x00, 0x8e, 0x00, 0x2e, 0x80, - 0x0b, 0xa0, 0x03, 0x88, 0x00, 0xbe, 0x51, 0x23, - 0xa1, 0x08, 0xe4, 0x02, 0x28, 0x02, 0xee, 0x40, - 0x23, 0x81, 0x4b, 0xa4, 0x03, 0x0a, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, 0x0e, 0x40, - 0x83, 0x00, 0x20, 0xc0, 0x0b, 0x11, 0x0a, 0x03, - 0xc0, 0xb3, 0x00, 0x20, 0xe0, 0x0b, 0xb0, 0x00, - 0x8f, 0x04, 0xb3, 0x80, 0x00, 0x50, 0x0b, 0x38, - 0xed, 0x09, 0x00, 0x60, 0x01, 0x02, 0xc5, 0x00, - 0xb3, 0x04, 0xa0, 0xc0, 0xcb, 0x15, 0x02, 0xcc, - 0x00, 0xa2, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x06, - 0x8c, 0x00, 0xb3, 0xc0, 0x60, 0xd0, 0x09, 0xb8, - 0x02, 0xcc, 0x00, 0x83, 0x48, 0x08, 0xc0, 0x0b, - 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x01, 0x1e, 0x00, 0x83, 0x00, 0x21, - 0xc0, 0x0a, 0x50, 0x0a, 0x10, 0x00, 0xbd, 0x80, - 0x21, 0xc0, 0x0b, 0x60, 0x02, 0x90, 0x00, 0x9e, - 0x00, 0x21, 0x82, 0x0b, 0x50, 0x82, 0xdc, 0x20, - 0xb7, 0x40, 0xa9, 0xc2, 0x0b, 0x70, 0x02, 0xdf, - 0x00, 0x96, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0x9c, 0x00, 0xb7, 0xc1, 0x20, 0xc2, 0x09, 0x74, - 0x02, 0x7c, 0x08, 0xb7, 0x00, 0x21, 0xc0, 0x83, - 0x28, 0x02, 0x20, 0x04, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x08, 0x3e, 0x00, 0xc7, 0x80, 0x21, - 0xa0, 0x4f, 0x58, 0x0b, 0x1e, 0x00, 0xf7, 0x80, - 0x31, 0xe0, 0x0f, 0xf8, 0x03, 0x9a, 0x00, 0xf6, - 0x84, 0x31, 0xa0, 0x0f, 0x58, 0x03, 0xde, 0x00, - 0xf7, 0x80, 0x21, 0xe0, 0x0f, 0x78, 0x03, 0xfe, - 0x00, 0xe6, 0x84, 0x3d, 0xe0, 0x0b, 0x78, 0x03, - 0x9e, 0x00, 0xf6, 0x80, 0xa1, 0xe0, 0x0d, 0x78, - 0x0b, 0xde, 0x00, 0xcf, 0x81, 0x29, 0xa1, 0x05, - 0x48, 0x83, 0xe2, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x1d, 0xa4, 0x00, 0xfb, 0x00, 0xbe, - 0x80, 0x4e, 0x10, 0x03, 0xec, 0x00, 0xfa, 0x00, - 0xbe, 0xc0, 0x0b, 0xa0, 0x03, 0xa0, 0x00, 0xda, - 0x00, 0x3e, 0x80, 0x0f, 0x90, 0x03, 0xe8, 0x00, - 0xfb, 0x00, 0x32, 0xc0, 0x4f, 0xb0, 0x13, 0xec, - 0x04, 0xea, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xac, 0x00, 0xfb, 0x00, 0x3e, 0x40, 0x0e, 0x90, - 0x03, 0x84, 0x00, 0xe9, 0x05, 0x3e, 0x00, 0x0f, - 0x92, 0x03, 0xc2, 0xed, 0x09, 0x00, 0x61, 0x01, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, - 0xfe, 0x00, 0xff, 0x84, 0x35, 0xe0, 0x4c, 0x78, - 0x03, 0x32, 0x00, 0x4e, 0x80, 0x33, 0xe0, 0x4f, - 0xf0, 0x03, 0xbe, 0x00, 0xff, 0x80, 0x3f, 0xa0, - 0x0e, 0xc8, 0x03, 0xfe, 0x00, 0xff, 0x80, 0xb5, - 0xa0, 0x0d, 0x79, 0x0b, 0x3e, 0x40, 0xee, 0x90, - 0x37, 0xe0, 0x0f, 0xf8, 0x03, 0xfe, 0x00, 0xdd, - 0x80, 0x33, 0xe1, 0x2c, 0xd8, 0x23, 0x3e, 0x00, - 0xcf, 0x86, 0x3f, 0xe4, 0x08, 0xe8, 0x03, 0x00, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, - 0x9d, 0x00, 0xb7, 0x08, 0x35, 0x80, 0x08, 0x62, - 0x02, 0x10, 0x02, 0x86, 0x00, 0x21, 0xc3, 0x0b, - 0xe2, 0x42, 0x50, 0x40, 0xb7, 0x10, 0x2d, 0x84, - 0x0b, 0x40, 0x12, 0xd4, 0x00, 0xbf, 0x10, 0xa9, - 0xc4, 0x0d, 0x70, 0x02, 0x1c, 0xe0, 0xf6, 0x11, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x28, 0xbc, - 0x00, 0x23, 0x90, 0x08, 0x51, 0x02, 0x1c, 0x40, - 0x86, 0x00, 0x2f, 0xc4, 0x88, 0x72, 0x12, 0x2a, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, - 0x94, 0x00, 0xb7, 0x10, 0x27, 0x80, 0x28, 0xf0, - 0x02, 0x38, 0x00, 0x96, 0x08, 0x21, 0x40, 0x0b, - 0x41, 0x0e, 0x98, 0x00, 0xb7, 0x00, 0x2d, 0x80, - 0x0b, 0x40, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x25, - 0x80, 0x09, 0xe0, 0x02, 0x1c, 0x05, 0xb6, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb4, - 0x00, 0x21, 0xc0, 0x1a, 0x60, 0x0a, 0x9c, 0x00, - 0x87, 0x00, 0x2d, 0x80, 0x88, 0x10, 0x42, 0x80, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, - 0xc4, 0x10, 0xb3, 0x61, 0x24, 0xa0, 0x88, 0x20, - 0x02, 0x0a, 0x00, 0x92, 0x40, 0x20, 0xf0, 0x0b, - 0x8c, 0x02, 0x89, 0x80, 0xb3, 0xa4, 0x2c, 0xa8, - 0x0b, 0x0d, 0x82, 0xcd, 0x00, 0xb1, 0xed, 0x09, - 0x00, 0x62, 0x01, 0x40, 0x28, 0xd0, 0x09, 0x39, - 0x02, 0x2d, 0x08, 0xa2, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcf, 0x00, 0x38, 0x40, 0x20, 0x20, - 0x08, 0x03, 0x02, 0xa4, 0x40, 0x88, 0x48, 0x2c, - 0x34, 0x08, 0x04, 0x02, 0x88, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xb8, 0x15, 0xa4, 0x00, 0xf3, - 0xc0, 0x36, 0xd6, 0x0c, 0xb0, 0x03, 0x2b, 0x20, - 0xdb, 0x40, 0x30, 0xf0, 0x0f, 0xa4, 0x83, 0x8b, - 0x20, 0xfb, 0xa0, 0x3e, 0x82, 0x1e, 0x90, 0x43, - 0xef, 0x20, 0xfb, 0x40, 0x76, 0xf2, 0x0d, 0x38, - 0x03, 0x2f, 0x00, 0xea, 0x00, 0x36, 0xc0, 0x0f, - 0xb0, 0x03, 0xed, 0x40, 0xdb, 0x00, 0x32, 0xc2, - 0x1e, 0xa4, 0x03, 0xac, 0x00, 0xcb, 0xa0, 0x3e, - 0x50, 0x0c, 0xaa, 0x03, 0xaa, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0xe4, 0x08, 0xfb, - 0x01, 0xfe, 0x40, 0x0f, 0xb6, 0x03, 0xe0, 0x20, - 0xeb, 0x09, 0x3e, 0xd2, 0x0f, 0xa6, 0x03, 0x61, - 0x08, 0xfa, 0x02, 0x3e, 0x80, 0x87, 0x90, 0x03, - 0xed, 0x00, 0xfb, 0x40, 0x3a, 0xd0, 0x2f, 0xb0, - 0x43, 0xec, 0x00, 0xfa, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x02, 0xec, 0x00, 0xfb, 0x81, 0x3e, 0xc0, - 0x4f, 0x24, 0x03, 0x6c, 0x02, 0xfb, 0x00, 0x3e, - 0x92, 0x4f, 0xb4, 0x01, 0x60, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x10, 0xf4, 0x00, 0xfb, - 0x20, 0x33, 0xc0, 0x8f, 0xf8, 0x03, 0xf8, 0x02, - 0xcf, 0x00, 0x3f, 0xd0, 0x0c, 0xc0, 0x03, 0x78, - 0x00, 0xce, 0x00, 0x3f, 0xb0, 0x0c, 0xd0, 0x0b, - 0x35, 0x20, 0xcf, 0x08, 0x33, 0xc2, 0x0f, 0xf0, - 0x03, 0x3c, 0x20, 0xde, 0x00, 0x33, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x10, 0xfc, 0x88, 0x33, 0x80, - 0x0c, 0xf0, 0x43, 0x2d, 0x00, 0xce, 0x40, 0x33, - 0x40, 0x0c, 0x70, 0x83, 0x08, 0x44, 0x30, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x63, 0x01, 0x00, 0x00, - 0x81, 0x04, 0x63, 0x10, 0xbb, 0x00, 0x32, 0x74, - 0x0b, 0xb4, 0x02, 0xc8, 0x00, 0x8b, 0x70, 0x2e, - 0xe8, 0x6a, 0x8c, 0x03, 0xa3, 0x40, 0x8a, 0x05, - 0x6c, 0xb2, 0x1d, 0x00, 0x82, 0x0c, 0x20, 0x8a, - 0x48, 0x22, 0xd4, 0x0b, 0xb0, 0x03, 0x6c, 0x48, - 0xf2, 0x04, 0x36, 0xc0, 0x0b, 0xb0, 0x12, 0xec, - 0x00, 0x99, 0x92, 0x22, 0x00, 0x08, 0x90, 0x22, - 0xa6, 0x00, 0x88, 0x80, 0x22, 0x36, 0x08, 0xa2, - 0x02, 0x28, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x05, 0x22, 0x00, 0xbb, 0x01, 0x22, 0xc3, - 0x0b, 0xb6, 0x02, 0xe8, 0x80, 0x8a, 0x00, 0x2e, - 0xc0, 0x48, 0xac, 0x02, 0x2c, 0x10, 0x8b, 0x80, - 0x2e, 0x80, 0x0a, 0x88, 0x02, 0x2c, 0x00, 0x83, - 0x00, 0x62, 0xc0, 0x4b, 0xb2, 0x82, 0x2c, 0x00, - 0x8a, 0x06, 0x22, 0xc0, 0x0b, 0xb0, 0x06, 0xec, - 0x00, 0xbb, 0x00, 0x20, 0x44, 0x08, 0x84, 0x02, - 0xa4, 0x00, 0x89, 0x08, 0x20, 0x40, 0x89, 0xb1, - 0x02, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x00, 0x00, 0xb3, 0x00, 0x20, 0x40, - 0x4b, 0x30, 0x02, 0xca, 0x05, 0x82, 0x04, 0x2c, - 0xc0, 0x0a, 0x20, 0x0a, 0xa0, 0x00, 0x83, 0x04, - 0x2c, 0x80, 0x0a, 0x00, 0x02, 0x0c, 0x00, 0x83, - 0x00, 0x00, 0x00, 0x1b, 0x30, 0x02, 0x44, 0x02, - 0xb2, 0x00, 0x24, 0xc0, 0x0b, 0x30, 0x22, 0xcc, - 0x00, 0x92, 0x00, 0x20, 0x00, 0x08, 0x00, 0x0a, - 0x04, 0x00, 0x80, 0x01, 0xa0, 0x80, 0x09, 0x20, - 0x02, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x0d, 0x60, 0x08, 0xf9, 0x00, 0x22, 0xc0, - 0x0f, 0xb0, 0x03, 0xe8, 0x08, 0x8a, 0x00, 0x3e, - 0x80, 0x0c, 0x80, 0x13, 0x28, 0x00, 0xc9, 0x00, - 0x2e, 0x80, 0x4a, 0x80, 0x22, 0x2c, 0x00, 0xcb, - 0x00, 0x32, 0xc0, 0x0f, 0xed, 0x09, 0x00, 0x64, - 0x01, 0xb0, 0x53, 0x2c, 0x10, 0xca, 0x04, 0x32, - 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xf8, 0x00, - 0x32, 0x01, 0x0c, 0x20, 0x03, 0xa4, 0x10, 0xc8, - 0x04, 0x32, 0x40, 0x25, 0xa0, 0x03, 0x00, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xf0, - 0x00, 0xfd, 0x00, 0x3b, 0x40, 0x0f, 0xf0, 0x03, - 0xd8, 0x00, 0x76, 0x00, 0x3f, 0xc0, 0x0f, 0xc0, - 0x13, 0xb0, 0x10, 0xff, 0x00, 0x3f, 0x80, 0x09, - 0xc0, 0x03, 0xf4, 0x00, 0xfc, 0x00, 0xbf, 0x00, - 0x0f, 0xf0, 0x03, 0xf4, 0x00, 0xfe, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x02, 0xfc, 0x00, 0xfc, 0x00, - 0x3f, 0x00, 0x8f, 0xc0, 0x43, 0xf4, 0x00, 0xfc, - 0x07, 0x3f, 0x00, 0x0e, 0xf0, 0x03, 0xe8, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xf8, - 0x00, 0xff, 0x08, 0x33, 0x04, 0x0f, 0xc0, 0x03, - 0xfc, 0x80, 0xcf, 0x20, 0x3b, 0xc0, 0x0f, 0xf2, - 0x13, 0x7c, 0x04, 0xfc, 0x10, 0x3f, 0xc0, 0x07, - 0x72, 0x03, 0xf0, 0x00, 0xfc, 0x10, 0x33, 0xc8, - 0x0f, 0xc4, 0x43, 0x38, 0x00, 0xcc, 0x00, 0xb3, - 0xc1, 0x0a, 0xe1, 0x03, 0xb0, 0x00, 0xfc, 0x12, - 0x3f, 0x00, 0x2f, 0xe0, 0x0b, 0x30, 0x40, 0x9e, - 0x10, 0xb3, 0x0e, 0x0c, 0xf0, 0x03, 0xf0, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0xe0, - 0x04, 0xbf, 0x60, 0x22, 0x08, 0x0b, 0x82, 0x22, - 0xfd, 0xe0, 0x8f, 0x50, 0x23, 0xd0, 0x0b, 0xf1, - 0x02, 0xec, 0x80, 0xb2, 0x20, 0x2f, 0xc4, 0x0b, - 0xf4, 0x42, 0xec, 0x20, 0xbb, 0x20, 0x23, 0xc4, - 0x0b, 0xb2, 0x02, 0xac, 0x00, 0xaa, 0x08, 0x22, - 0xc1, 0x0a, 0xa0, 0x02, 0x28, 0x00, 0xb0, 0x20, - 0x26, 0x00, 0x08, 0xa4, 0x82, 0x2c, 0x80, 0xaa, - 0x10, 0x22, 0x10, 0x08, 0xb0, 0x02, 0xe0, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xed, - 0x09, 0x00, 0x65, 0x01, 0xce, 0x00, 0xb3, 0x08, - 0x20, 0x40, 0x0b, 0x10, 0x82, 0xcc, 0x00, 0x83, - 0x00, 0x24, 0xc4, 0x0b, 0x30, 0x02, 0x4c, 0x20, - 0xb2, 0x20, 0x2c, 0xc0, 0x0b, 0x34, 0x02, 0xcc, - 0x80, 0xb3, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, - 0x20, 0x00, 0xa9, 0x22, 0x22, 0xc0, 0x43, 0x82, - 0x02, 0x88, 0x00, 0xb0, 0x20, 0x24, 0x00, 0x09, - 0x86, 0x02, 0x2c, 0x04, 0x92, 0xa1, 0x20, 0xc8, - 0x08, 0x30, 0x02, 0xe2, 0x01, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x05, 0xa4, 0x80, 0xbb, 0x00, - 0xa2, 0x00, 0x0b, 0x80, 0x02, 0xcc, 0x00, 0x8b, - 0x00, 0x26, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, - 0xba, 0x80, 0x2e, 0xc1, 0x09, 0xb0, 0x02, 0xec, - 0x04, 0xb1, 0x40, 0x22, 0xc0, 0x0b, 0x30, 0x82, - 0x2c, 0x00, 0xaa, 0x08, 0x22, 0xc0, 0x8b, 0xa1, - 0x02, 0x2c, 0x40, 0xbb, 0x00, 0x66, 0x88, 0x02, - 0x82, 0x82, 0x2c, 0x00, 0x2a, 0x00, 0x00, 0xc2, - 0x08, 0xb0, 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x05, 0xee, 0x08, 0xfb, 0x00, - 0xb2, 0x72, 0x0f, 0x90, 0x03, 0xec, 0x02, 0xcb, - 0x00, 0x36, 0xc1, 0x8f, 0xb0, 0x03, 0x6c, 0x00, - 0xf9, 0x80, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xed, - 0x40, 0xfb, 0xc0, 0x32, 0xc0, 0x0b, 0xbc, 0x0b, - 0x0f, 0x10, 0xe8, 0x50, 0x32, 0xc0, 0x0f, 0xbc, - 0x0b, 0xa9, 0x00, 0xb8, 0x24, 0x36, 0x02, 0x0f, - 0x8c, 0x03, 0x20, 0x00, 0xda, 0x80, 0x32, 0x30, - 0x0c, 0xb0, 0x03, 0xd0, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x41, 0xb4, 0x00, 0x7f, 0x00, - 0x3f, 0x64, 0x0f, 0xdc, 0x03, 0xec, 0x00, 0xf7, - 0x00, 0x33, 0xc0, 0x0f, 0xf0, 0x23, 0xfc, 0x00, - 0xfe, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x83, 0xfe, - 0x00, 0xff, 0x92, 0xbf, 0xc0, 0x0f, 0xf4, 0x13, - 0xff, 0x00, 0xed, 0x09, 0x00, 0x66, 0x01, 0xfe, - 0x80, 0x3f, 0xf0, 0x0c, 0xf0, 0x03, 0xf8, 0x00, - 0xfc, 0x42, 0x37, 0x02, 0x2d, 0x90, 0x03, 0xfc, - 0x00, 0xfc, 0x90, 0x3f, 0x04, 0x6f, 0xf0, 0x03, - 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x00, 0xac, 0x00, 0xc3, 0x00, 0x32, 0x40, 0x0f, - 0x90, 0x03, 0xec, 0x00, 0xcb, 0x00, 0x32, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xcb, 0x40, 0x32, - 0xc0, 0x4f, 0xb1, 0x23, 0xa5, 0x02, 0xeb, 0x04, - 0x3e, 0xc6, 0x0f, 0x94, 0x03, 0xe5, 0x80, 0xc9, - 0x40, 0x32, 0xd0, 0x0d, 0xb4, 0x03, 0xad, 0x60, - 0xfb, 0x40, 0x22, 0x90, 0x0e, 0x90, 0x03, 0x2c, - 0x00, 0xd1, 0x00, 0x76, 0xc0, 0x0f, 0xb0, 0x03, - 0x50, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xc8, - 0x05, 0x24, 0x00, 0x8f, 0x04, 0x22, 0xc0, 0x0b, - 0x90, 0x02, 0xfc, 0x00, 0x8f, 0x90, 0x2b, 0xf8, - 0x0b, 0xf0, 0x02, 0xec, 0x00, 0x8a, 0x00, 0x23, - 0xc2, 0x0b, 0xf8, 0x02, 0x2c, 0x00, 0x8b, 0x00, - 0x2f, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0x82, - 0x10, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0x2e, 0x00, - 0xbb, 0x00, 0x20, 0xb0, 0x08, 0x1a, 0x22, 0x0c, - 0x00, 0xbb, 0x00, 0x6e, 0xc0, 0x1b, 0xb0, 0x02, - 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x15, 0x40, 0x00, 0x83, 0x00, 0x20, 0x40, 0x0b, - 0x10, 0x02, 0xcc, 0x00, 0xa3, 0xc0, 0x20, 0xe8, - 0x8b, 0x30, 0x02, 0xcc, 0x00, 0x93, 0x02, 0x20, - 0xe8, 0x0b, 0x30, 0x02, 0x4c, 0x00, 0x93, 0x00, - 0x2c, 0xd0, 0x0b, 0x30, 0x02, 0xcd, 0x00, 0x82, - 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0x8a, 0x00, - 0xb0, 0x00, 0x24, 0x34, 0x0a, 0x20, 0x42, 0x40, - 0x00, 0x91, 0x00, 0x20, 0x00, 0x0a, 0x30, 0x02, - 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x01, 0x3a, 0x00, 0x87, 0x90, 0xed, 0x09, 0x00, - 0x67, 0x01, 0x21, 0x20, 0x0b, 0x48, 0x02, 0xde, - 0x02, 0x83, 0x98, 0x21, 0xe0, 0x8b, 0x78, 0x02, - 0xde, 0x02, 0x96, 0x80, 0x21, 0xe0, 0x0b, 0x79, - 0x02, 0x56, 0x00, 0x97, 0x82, 0x2d, 0xe0, 0x0b, - 0x58, 0x02, 0xdc, 0x00, 0x86, 0xa0, 0x21, 0xa4, - 0x0b, 0x78, 0x02, 0x9e, 0x00, 0xb7, 0x90, 0x2f, - 0xa0, 0x02, 0x70, 0x02, 0x5e, 0x00, 0xb5, 0x80, - 0x2d, 0x04, 0x0b, 0x78, 0x02, 0xc8, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x08, 0x40, - 0xcb, 0x10, 0x30, 0x08, 0x0f, 0x00, 0x03, 0xcc, - 0x00, 0xe3, 0x00, 0x30, 0xc8, 0x0f, 0x30, 0x03, - 0xec, 0x00, 0xd3, 0x00, 0x30, 0xc0, 0x0f, 0x30, - 0x03, 0xe9, 0x00, 0xd3, 0x00, 0x1c, 0xc0, 0x0f, - 0x30, 0x03, 0xec, 0x40, 0xca, 0x00, 0x30, 0xd4, - 0x0f, 0xb4, 0x03, 0x88, 0x80, 0xf0, 0x00, 0x34, - 0x00, 0x0e, 0x31, 0x43, 0x4c, 0x00, 0xd1, 0x00, - 0x30, 0x00, 0x0e, 0x30, 0x03, 0x52, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x0d, 0x90, 0x00, - 0xff, 0x12, 0xbf, 0x00, 0x0f, 0xe1, 0x03, 0xfc, - 0x00, 0xff, 0x04, 0x3f, 0xc2, 0x0f, 0xf0, 0x83, - 0xfc, 0x00, 0xee, 0x10, 0x3f, 0xd4, 0x0f, 0xf0, - 0x43, 0xbc, 0x00, 0xef, 0x10, 0x37, 0xc0, 0x0f, - 0xf1, 0x33, 0xfc, 0x80, 0xfe, 0x20, 0x3f, 0xc4, - 0x0b, 0xf0, 0x03, 0x7c, 0x00, 0xff, 0x00, 0x31, - 0x80, 0x0d, 0xf2, 0x03, 0xbc, 0x00, 0xfd, 0x10, - 0x3f, 0x08, 0x0f, 0xf0, 0x03, 0xd0, 0x06, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, 0xe0, 0x00, - 0xfb, 0x28, 0x32, 0x40, 0x4f, 0x98, 0x03, 0x2d, - 0x20, 0xf3, 0xc8, 0x30, 0xd0, 0x0d, 0xbe, 0x03, - 0x6c, 0x00, 0xfb, 0x00, 0x3e, 0xc8, 0x0f, 0xbe, - 0x03, 0x2c, 0x00, 0xf9, 0x00, 0x32, 0xcb, 0x0f, - 0x38, 0x03, 0xac, 0x00, 0xfb, 0x00, 0x22, 0x40, - 0xed, 0x09, 0x00, 0x68, 0x01, 0x2d, 0xb8, 0x03, - 0x0c, 0x00, 0xdb, 0x00, 0x26, 0x80, 0x0f, 0xa0, - 0x03, 0x22, 0x00, 0xca, 0x00, 0x32, 0xc0, 0x0f, - 0xb0, 0x03, 0xea, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x11, 0x98, 0x00, 0xb7, 0x40, 0x21, - 0xc0, 0x0b, 0x50, 0x02, 0x1c, 0x80, 0xb7, 0x00, - 0x31, 0xc2, 0x08, 0x33, 0x02, 0x1c, 0x00, 0xb7, - 0x00, 0x2d, 0xc8, 0x0b, 0x32, 0x8a, 0x1c, 0x00, - 0xbf, 0x00, 0x21, 0xd0, 0x0b, 0x70, 0x03, 0x5c, - 0x00, 0xbe, 0x00, 0x29, 0x40, 0x08, 0x70, 0x0a, - 0x1c, 0x00, 0x87, 0x04, 0x21, 0xc0, 0x03, 0xf0, - 0x02, 0xbc, 0x10, 0xa4, 0x00, 0x21, 0xc0, 0x0b, - 0x70, 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x00, 0x9e, 0x00, 0xb7, 0xa0, 0x21, - 0x60, 0x1b, 0x78, 0x02, 0x1e, 0xc0, 0x97, 0xb6, - 0xa1, 0xe0, 0x09, 0x7a, 0x02, 0x5e, 0x00, 0xb7, - 0x80, 0x2d, 0xe4, 0x0b, 0x79, 0x02, 0x5e, 0x00, - 0xb7, 0x80, 0x21, 0xe0, 0x0b, 0xf8, 0x02, 0x1e, - 0x00, 0xb7, 0x80, 0x23, 0xe0, 0x0b, 0xf8, 0x0a, - 0x7e, 0x08, 0x9f, 0x80, 0x2d, 0xe0, 0x4b, 0x78, - 0x02, 0x9e, 0x00, 0x85, 0x80, 0x21, 0xe0, 0x0b, - 0x78, 0x02, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x14, 0xc4, 0x00, 0xb3, 0x00, 0x26, - 0x40, 0x0b, 0x18, 0x02, 0x2c, 0x00, 0xb3, 0x00, - 0x00, 0xc0, 0x08, 0x30, 0x02, 0x8c, 0x00, 0xb3, - 0x08, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0x06, 0x00, - 0xb1, 0x80, 0x24, 0xc0, 0x0b, 0x11, 0x02, 0x4d, - 0x08, 0xb2, 0x00, 0x20, 0xc0, 0x0a, 0x38, 0x02, - 0x4c, 0x08, 0x8b, 0xe0, 0x20, 0xc4, 0x99, 0xb4, - 0x42, 0x8c, 0x00, 0xab, 0x50, 0x20, 0xd9, 0x0b, - 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xe8, 0x15, 0xb9, 0x00, 0xfa, 0x00, 0xb3, - 0x98, 0x4f, 0xec, 0xed, 0x09, 0x00, 0x69, 0x01, - 0x0b, 0x28, 0x04, 0xfa, 0x00, 0x32, 0x80, 0x0d, - 0xa0, 0x03, 0x68, 0x00, 0xfe, 0x40, 0x3e, 0x80, - 0x0f, 0xa0, 0x03, 0x3b, 0x80, 0xf6, 0xc8, 0xb2, - 0x80, 0x0b, 0xec, 0x03, 0x18, 0x08, 0xfe, 0x40, - 0xb3, 0xb0, 0x2f, 0xec, 0x83, 0x5b, 0x20, 0xde, - 0xa4, 0x3f, 0xb0, 0x0f, 0xe6, 0x03, 0xb8, 0x00, - 0xce, 0x00, 0xb3, 0x90, 0x0f, 0xa0, 0x03, 0xfa, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, - 0x62, 0x00, 0xf8, 0x00, 0x3a, 0x20, 0x0f, 0x89, - 0x03, 0xe0, 0x00, 0xf8, 0x44, 0x3a, 0x11, 0x0f, - 0x80, 0x03, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x10, - 0x0f, 0x80, 0x43, 0xe2, 0x00, 0xf8, 0x80, 0x3a, - 0x00, 0x0f, 0x88, 0x03, 0xe0, 0x80, 0xf8, 0x80, - 0x3e, 0x24, 0x0d, 0x88, 0x03, 0xa3, 0x00, 0xf8, - 0x00, 0x3e, 0x20, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xd2, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, - 0xe4, 0x00, 0xf1, 0x01, 0x36, 0x40, 0x0c, 0x90, - 0x03, 0xe4, 0x00, 0xc9, 0x00, 0x3e, 0x41, 0x0e, - 0x90, 0x02, 0x64, 0x00, 0xe9, 0x01, 0x3e, 0x70, - 0x0d, 0x9c, 0x03, 0x64, 0x00, 0xc9, 0x00, 0x36, - 0x60, 0x0f, 0x90, 0x03, 0xe4, 0x01, 0xc9, 0x00, - 0x3a, 0x40, 0x0e, 0x90, 0x03, 0xe4, 0x00, 0xe9, - 0x00, 0x3a, 0x40, 0x0c, 0x90, 0x83, 0x24, 0x00, - 0x59, 0x08, 0x38, 0x40, 0x0c, 0x90, 0x03, 0xc3, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, - 0x64, 0x4c, 0xb9, 0x00, 0x22, 0x40, 0x08, 0x90, - 0x02, 0xe4, 0x02, 0xc9, 0xd2, 0x2c, 0x50, 0x08, - 0x90, 0x02, 0xe4, 0x00, 0x89, 0x00, 0x2e, 0x42, - 0x0b, 0x94, 0x03, 0xa4, 0x00, 0x89, 0x00, 0x22, - 0x51, 0x0b, 0x90, 0x02, 0xe4, 0x20, 0xf1, 0x00, - 0x20, 0x4c, 0x0a, 0x90, 0x02, 0xe5, 0xed, 0x09, - 0x00, 0x6a, 0x01, 0x40, 0x89, 0x01, 0x20, 0x54, - 0x0c, 0x90, 0x02, 0x24, 0x00, 0xb9, 0x00, 0x22, - 0x40, 0x08, 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x01, 0x24, 0x00, 0xb9, - 0x00, 0xa2, 0x40, 0x09, 0xb0, 0x02, 0xe4, 0x00, - 0x99, 0x00, 0x2e, 0x48, 0x4a, 0x90, 0x42, 0x44, - 0x01, 0xab, 0x00, 0x2e, 0x40, 0x09, 0x90, 0x02, - 0xc4, 0x04, 0x89, 0x00, 0x22, 0x59, 0x0b, 0x90, - 0x02, 0xec, 0x00, 0x99, 0x08, 0x2a, 0x40, 0x08, - 0x90, 0x02, 0xec, 0x02, 0xa9, 0x00, 0x22, 0x50, - 0x88, 0x90, 0x02, 0x64, 0x00, 0x99, 0x00, 0x26, - 0x40, 0x09, 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, 0x00, 0xb1, - 0x40, 0x20, 0x50, 0x09, 0x14, 0x42, 0xc5, 0x00, - 0x83, 0x00, 0x24, 0xc0, 0x08, 0x10, 0x02, 0xc5, - 0x00, 0x81, 0x40, 0x2c, 0x40, 0x0b, 0x10, 0x02, - 0x85, 0x00, 0x89, 0x40, 0x80, 0x40, 0x0b, 0x14, - 0x52, 0xe5, 0x00, 0xa1, 0x40, 0x20, 0x40, 0x0a, - 0x14, 0x02, 0xcc, 0x00, 0x81, 0x40, 0x20, 0x40, - 0x08, 0x14, 0x42, 0x45, 0x00, 0xb1, 0x40, 0x24, - 0x50, 0x09, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x60, 0x00, 0xf0, - 0x00, 0x32, 0x00, 0x0d, 0x00, 0x03, 0xe0, 0x00, - 0xd8, 0x04, 0x2e, 0x01, 0x0e, 0x80, 0x03, 0x60, - 0x08, 0xe8, 0x00, 0x3e, 0x00, 0x09, 0xa0, 0x03, - 0xe0, 0x02, 0xc8, 0x00, 0x12, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x00, 0x98, 0x00, 0x3a, 0x00, 0x0c, - 0x80, 0x03, 0xe0, 0x00, 0xe8, 0x00, 0x92, 0x00, - 0x2c, 0x80, 0x0b, 0x60, 0x00, 0xd0, 0x00, 0x36, - 0x00, 0x2d, 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x1d, 0xf4, 0x00, 0xf9, - 0x40, 0x3b, 0x40, 0x2e, 0xd0, 0x03, 0xe5, 0x10, - 0xf9, 0xed, 0x09, 0x00, 0x6b, 0x01, 0x40, 0x3e, - 0x50, 0x0f, 0x94, 0x03, 0xe4, 0x04, 0xfd, 0x40, - 0x3e, 0x51, 0x0f, 0x94, 0x03, 0xf4, 0x00, 0xfd, - 0x00, 0x3a, 0x50, 0x4b, 0xd0, 0x03, 0xf4, 0x00, - 0xfd, 0x02, 0x3d, 0x40, 0x0f, 0x50, 0x21, 0xf4, - 0x00, 0xf5, 0x00, 0x3f, 0x40, 0x0e, 0xd4, 0x03, - 0xb4, 0x00, 0xfd, 0x40, 0xbb, 0x50, 0x0e, 0x90, - 0x03, 0xe7, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x01, 0xf4, 0x00, 0xc9, 0x00, 0x32, 0x40, - 0x07, 0x91, 0x03, 0x24, 0x80, 0xf5, 0x28, 0x3f, - 0x48, 0x0f, 0x90, 0x0b, 0x24, 0x00, 0xf9, 0x10, - 0x3d, 0x48, 0x0c, 0xd2, 0x83, 0xe4, 0x40, 0xc9, - 0x00, 0x3f, 0x40, 0x1c, 0x91, 0x03, 0xf4, 0x00, - 0xcd, 0x00, 0x1b, 0x40, 0x0f, 0x90, 0x0b, 0x14, - 0x00, 0xd9, 0x12, 0x37, 0x40, 0x0f, 0xd2, 0x83, - 0xe4, 0x44, 0xe9, 0x00, 0x3e, 0xc0, 0x0f, 0x90, - 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x10, 0xe0, 0x00, 0x88, 0x48, 0xa2, 0x02, - 0x0b, 0x80, 0x02, 0x20, 0xa0, 0xb8, 0x02, 0x26, - 0x04, 0x0b, 0x84, 0x02, 0x20, 0x30, 0xb8, 0x10, - 0x2e, 0x00, 0x08, 0x80, 0x02, 0x68, 0x82, 0x88, - 0x08, 0x2e, 0x00, 0x28, 0xa0, 0x02, 0xe0, 0xa0, - 0xd8, 0x20, 0x2e, 0x00, 0x0b, 0x80, 0x82, 0xa0, - 0x00, 0x88, 0x00, 0x22, 0x00, 0x0b, 0x82, 0x02, - 0xe0, 0x80, 0xaa, 0x48, 0x2e, 0x02, 0x0b, 0x80, - 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x05, 0xc4, 0x00, 0x81, 0x30, 0x20, 0x40, - 0x0b, 0x10, 0x02, 0x04, 0xc0, 0xb1, 0x02, 0x6c, - 0x40, 0x09, 0x11, 0x02, 0x44, 0x00, 0xb1, 0x00, - 0x24, 0x44, 0x08, 0x10, 0x02, 0xe4, 0x80, 0x81, - 0x20, 0x2c, 0xc4, 0x09, 0x10, 0x02, 0xe4, 0x80, - 0x81, 0xa8, 0x28, 0x40, 0x09, 0x92, 0x02, 0x04, - 0x00, 0xb9, 0x00, 0x24, 0xed, 0x09, 0x00, 0x6c, - 0x01, 0x60, 0x0b, 0x12, 0x82, 0xe4, 0x80, 0x81, - 0x30, 0x2c, 0x44, 0x0b, 0x10, 0x02, 0xc2, 0x01, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa5, - 0x00, 0x89, 0x00, 0x22, 0x50, 0x0b, 0x94, 0x02, - 0x24, 0x00, 0xb9, 0x00, 0x6e, 0x41, 0x0b, 0x90, - 0x02, 0x64, 0x08, 0xb9, 0x20, 0x2e, 0xc0, 0x08, - 0x90, 0x12, 0x64, 0x10, 0x89, 0x00, 0x26, 0x40, - 0x09, 0x90, 0x02, 0xe4, 0x00, 0x99, 0x04, 0x2e, - 0x54, 0x0b, 0x90, 0x02, 0xa5, 0x80, 0xb9, 0x51, - 0x22, 0x48, 0x0b, 0x91, 0x02, 0xe4, 0x00, 0xa9, - 0x00, 0x2e, 0x50, 0x0b, 0x90, 0x02, 0xc6, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe7, - 0x40, 0xc9, 0x00, 0x32, 0x60, 0x0f, 0x98, 0x03, - 0x24, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0d, 0x90, - 0x03, 0x64, 0x00, 0xf9, 0x01, 0x16, 0x40, 0x0c, - 0x90, 0x03, 0xe7, 0x00, 0xc9, 0xc8, 0x3e, 0x40, - 0x09, 0x99, 0x03, 0xe6, 0x40, 0xc9, 0x00, 0x3a, - 0x70, 0x0d, 0x98, 0x03, 0x05, 0x00, 0xf9, 0x80, - 0x36, 0x70, 0x0f, 0x9a, 0x03, 0xc4, 0x80, 0xc9, - 0xc0, 0x3e, 0x60, 0x0f, 0x90, 0x03, 0xe0, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0xa6, - 0x02, 0xf1, 0x00, 0x3e, 0x50, 0x0f, 0x99, 0x1b, - 0xe4, 0x00, 0xf9, 0x00, 0x36, 0x40, 0x0f, 0x10, - 0x03, 0xa4, 0x00, 0xf9, 0x80, 0x3e, 0x40, 0x2f, - 0x90, 0x03, 0x66, 0x44, 0xf9, 0x20, 0x3c, 0x40, - 0x0e, 0x98, 0x03, 0xe4, 0x00, 0xf9, 0x01, 0x3e, - 0x60, 0x0f, 0x99, 0x0b, 0x66, 0x00, 0xc9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe6, 0x80, 0xf9, - 0x20, 0x3e, 0x48, 0x0f, 0x90, 0x03, 0xca, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0xa0, - 0x00, 0xc8, 0x00, 0x3e, 0x10, 0x0f, 0x80, 0x03, - 0xe0, 0x00, 0xc8, 0x80, 0x3a, 0x20, 0x0f, 0xed, - 0x09, 0x00, 0x6d, 0x01, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x01, 0x38, 0x24, 0x0c, 0x88, 0x03, 0xe1, - 0x00, 0xf8, 0x40, 0x3e, 0x20, 0x4f, 0x84, 0x03, - 0xe0, 0x30, 0xe8, 0x00, 0x36, 0x20, 0x8e, 0x80, - 0x03, 0x63, 0x00, 0xd8, 0x40, 0x3e, 0x20, 0x0f, - 0x84, 0x13, 0xe1, 0x02, 0xc8, 0x40, 0xa2, 0x00, - 0x0f, 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x05, 0x0a, 0x00, 0xaa, 0x00, - 0x2e, 0x80, 0x0b, 0xa0, 0x02, 0xe8, 0x00, 0xae, - 0x20, 0x33, 0xa0, 0x0b, 0xa0, 0x03, 0xa8, 0x00, - 0x9a, 0x00, 0x23, 0xb0, 0x28, 0xec, 0x82, 0xc8, - 0x00, 0xba, 0x00, 0x2f, 0x90, 0x0b, 0xa0, 0x02, - 0xda, 0x00, 0x8e, 0x80, 0x23, 0xb0, 0x08, 0x20, - 0x03, 0x3b, 0x00, 0x02, 0x05, 0x3b, 0xb0, 0x0e, - 0xa8, 0x12, 0xe8, 0x00, 0x0a, 0x00, 0x22, 0x80, - 0x0b, 0xa0, 0x02, 0x4a, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x04, 0x0c, 0x02, 0x83, 0x00, - 0x2c, 0xc0, 0x1b, 0xb0, 0x42, 0xcc, 0x00, 0x81, - 0x80, 0x2c, 0x20, 0x0b, 0x30, 0x02, 0x8c, 0x00, - 0xb3, 0x00, 0x28, 0x40, 0x08, 0x10, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0x40, 0x0b, 0x30, 0x02, - 0xcd, 0x00, 0xa3, 0x80, 0x24, 0xc4, 0x1a, 0x30, - 0x06, 0x0e, 0x00, 0x93, 0x00, 0x2c, 0xc0, 0x0b, - 0x38, 0x06, 0xcc, 0x00, 0x83, 0x00, 0x20, 0xc0, - 0x0b, 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x01, 0x1d, 0x00, 0xa7, 0x24, - 0x2d, 0xcc, 0x0b, 0x72, 0x02, 0xde, 0x80, 0xa6, - 0x80, 0x21, 0xc2, 0x0b, 0x70, 0x02, 0x9c, 0xc0, - 0x93, 0xa0, 0x29, 0xc0, 0x08, 0x70, 0x02, 0xdc, - 0xc8, 0xb7, 0x20, 0x2d, 0xc0, 0x0b, 0x72, 0x00, - 0xfd, 0x00, 0x87, 0x88, 0x21, 0xe0, 0x08, 0x72, - 0x0a, 0x3c, 0x21, 0x87, 0x30, 0x29, 0xc2, 0x1a, - 0x54, 0x06, 0xed, 0x09, 0x00, 0x6e, 0x01, 0xdc, - 0x00, 0x03, 0x80, 0x21, 0xc0, 0x0b, 0x70, 0x02, - 0x68, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x08, 0x1e, 0x00, 0xc7, 0xc0, 0x2d, 0xea, 0x0f, - 0x7a, 0x03, 0xff, 0x20, 0xc6, 0x80, 0x3d, 0xe0, - 0x0f, 0x78, 0x03, 0x9e, 0x80, 0xf7, 0x82, 0x39, - 0xe0, 0x0c, 0x78, 0x03, 0xde, 0x40, 0xf7, 0xe8, - 0x2d, 0xe0, 0x0f, 0x7a, 0x82, 0xde, 0x04, 0xaf, - 0x84, 0x35, 0x60, 0x0e, 0xfa, 0x23, 0x1e, 0x00, - 0xd7, 0xa0, 0x3d, 0xe0, 0x0f, 0x78, 0x13, 0xfe, - 0x80, 0xc7, 0x80, 0x21, 0xe4, 0x8f, 0x78, 0x03, - 0xea, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x1d, 0x8c, 0x00, 0xdb, 0x2a, 0x3e, 0xd0, 0x43, - 0xb6, 0xa3, 0xec, 0x80, 0xf8, 0x02, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xac, 0x90, 0xdb, 0x20, 0x36, - 0xc0, 0x07, 0x90, 0x03, 0xec, 0x90, 0xfb, 0x20, - 0x3e, 0xc0, 0x0f, 0xb3, 0x03, 0xcc, 0x00, 0x7b, - 0x00, 0x3c, 0x40, 0x8f, 0xb1, 0x03, 0xac, 0x02, - 0xfb, 0x08, 0x2a, 0xc0, 0x0f, 0x90, 0x03, 0xec, - 0x00, 0xfb, 0x78, 0x3e, 0xd4, 0x0f, 0xb0, 0x03, - 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0xf6, 0x00, 0xcf, 0x80, 0x33, 0xe4, 0x0c, - 0xf9, 0x83, 0xfe, 0x04, 0xce, 0x80, 0x0f, 0xe4, - 0x0c, 0xf2, 0x03, 0xff, 0x00, 0xff, 0xc8, 0x33, - 0xe0, 0x4c, 0xf9, 0x23, 0xfe, 0x50, 0xff, 0x84, - 0x0f, 0xe4, 0x0c, 0xf9, 0x03, 0xde, 0x00, 0xcf, - 0x80, 0x33, 0xe0, 0x0f, 0x7b, 0x23, 0x7e, 0x00, - 0xef, 0x84, 0x33, 0xe0, 0x0f, 0xf8, 0x03, 0xbe, - 0x20, 0xff, 0x80, 0x3f, 0xe0, 0x0c, 0xf8, 0x03, - 0xc0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x11, 0x94, 0x00, 0x87, 0x00, 0x21, 0xc1, 0x08, - 0x71, 0x82, 0xdc, 0x80, 0x87, 0x00, 0x25, 0xc0, - 0x08, 0x70, 0x02, 0xdc, 0x00, 0xed, 0x09, 0x00, - 0x6f, 0x01, 0xbf, 0x00, 0x21, 0x44, 0x28, 0x70, - 0x02, 0xdc, 0x0c, 0x37, 0x00, 0x39, 0x00, 0x08, - 0x70, 0x02, 0x5c, 0x00, 0xdf, 0x50, 0x21, 0xc0, - 0x0d, 0x73, 0x0a, 0x1c, 0x00, 0xb7, 0x00, 0x21, - 0x00, 0x0b, 0x50, 0x42, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x08, 0x70, 0x02, 0xea, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x42, - 0x87, 0x10, 0x21, 0xc0, 0x88, 0x71, 0x02, 0x5c, - 0x10, 0x96, 0x00, 0x2d, 0x00, 0x08, 0x71, 0x02, - 0xdc, 0x00, 0xb7, 0x00, 0x25, 0xc0, 0x08, 0x70, - 0x12, 0xdc, 0x00, 0x37, 0x08, 0x2d, 0xc0, 0x88, - 0x70, 0x26, 0xfc, 0x00, 0x87, 0x00, 0x29, 0x80, - 0x0b, 0xf3, 0x0a, 0x18, 0x20, 0xa7, 0x00, 0xa9, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x20, 0xb7, 0x08, - 0x2c, 0xc0, 0x08, 0x70, 0x02, 0xc0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, 0xcc, 0x00, - 0x8b, 0x00, 0x20, 0xf8, 0x18, 0x34, 0x02, 0xcc, - 0x00, 0x92, 0x02, 0x24, 0xc0, 0x08, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0xc0, 0x24, 0xc1, 0x88, 0x30, - 0x02, 0xcd, 0x00, 0x93, 0xe0, 0x28, 0xc1, 0x88, - 0xbf, 0x02, 0x4c, 0x20, 0x13, 0x98, 0x20, 0x90, - 0x08, 0x30, 0x02, 0x09, 0x00, 0xb3, 0x50, 0x28, - 0x90, 0x1b, 0x12, 0x12, 0xcf, 0x04, 0xb3, 0x00, - 0x2e, 0xc0, 0x08, 0x30, 0x02, 0xc8, 0x05, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, 0xae, 0x20, - 0xcf, 0x00, 0xb1, 0xc0, 0x2c, 0x7d, 0x03, 0x7c, - 0x02, 0xda, 0x00, 0x1e, 0xc0, 0xa8, 0xb0, 0x02, - 0xfc, 0x00, 0x7f, 0xc0, 0x36, 0xc0, 0x0c, 0xb0, - 0x02, 0xfd, 0x40, 0xff, 0x40, 0x3e, 0xc1, 0x08, - 0xf4, 0x03, 0xcc, 0x04, 0xc9, 0x40, 0xb8, 0xd4, - 0x0b, 0x70, 0x83, 0x2c, 0x00, 0xef, 0x40, 0x3a, - 0xe0, 0x0f, 0xb4, 0x03, 0xbd, 0x00, 0xff, 0x80, - 0xed, 0x09, 0x00, 0x70, 0x01, 0x3f, 0xc0, 0x28, - 0xb0, 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x00, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc4, 0x0f, 0xb0, 0x03, 0xcc, 0x00, 0xea, 0x00, - 0x34, 0x01, 0x8f, 0xb0, 0x13, 0xec, 0x00, 0xfb, - 0x30, 0x3a, 0xc0, 0x0f, 0xb0, 0x02, 0xee, 0x00, - 0xfb, 0x00, 0x3c, 0xd0, 0x0f, 0xb0, 0x03, 0x6d, - 0x40, 0xf9, 0x40, 0x16, 0xc0, 0x0d, 0xb0, 0x03, - 0xa9, 0x00, 0xfb, 0x0c, 0x36, 0xd6, 0x0f, 0x90, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x10, 0xfc, 0x00, 0xff, 0x00, 0x37, - 0xc0, 0x0c, 0xf0, 0x03, 0x3c, 0x00, 0xcf, 0xa0, - 0x3e, 0xc4, 0x0e, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3e, 0x70, 0x1f, 0x71, 0x03, 0x3c, 0x10, - 0xff, 0x00, 0x3f, 0x44, 0x0c, 0xf0, 0x03, 0x3c, - 0x01, 0xcd, 0x00, 0x37, 0x40, 0x0e, 0xf0, 0x03, - 0x3f, 0x20, 0xff, 0x00, 0x3f, 0x80, 0x0f, 0x72, - 0x03, 0x3c, 0x20, 0xef, 0x00, 0x3f, 0xc0, 0x2c, - 0xf0, 0x03, 0x40, 0x44, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x81, 0x04, 0x6c, 0x00, 0xbb, 0x00, 0x22, - 0xc0, 0x8a, 0xb0, 0x02, 0xac, 0x01, 0x8a, 0x00, - 0x2e, 0xc0, 0x48, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x01, 0x26, 0xf0, 0x8f, 0xb4, 0xa2, 0x2c, 0x04, - 0xbb, 0x01, 0x2e, 0xc9, 0x08, 0xb0, 0x02, 0x2e, - 0x81, 0xf0, 0x82, 0x2a, 0x40, 0x0a, 0xb0, 0x02, - 0x29, 0x00, 0x9b, 0x00, 0x2e, 0x98, 0x0e, 0x90, - 0x12, 0x0c, 0x12, 0x8b, 0x00, 0x2e, 0xc1, 0x18, - 0xb0, 0x02, 0xe0, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x05, 0x2c, 0x40, 0xbb, 0x00, 0x26, - 0xc0, 0x08, 0xb0, 0x02, 0x2c, 0x06, 0x88, 0x02, - 0x2e, 0xc0, 0x09, 0xb0, 0x46, 0xec, 0x00, 0xbb, - 0x00, 0x6e, 0xc0, 0xed, 0x09, 0x00, 0x71, 0x01, - 0x8b, 0x90, 0x02, 0x2c, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x08, 0xb0, 0x02, 0x26, 0x04, 0x8b, 0x80, - 0x26, 0xc0, 0x0a, 0xb0, 0x02, 0x6c, 0x30, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0x2c, 0x00, - 0xab, 0x00, 0x2e, 0xc0, 0x08, 0xb0, 0x02, 0xe0, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x0c, 0x00, 0xb3, 0x00, 0x22, 0xc0, 0x0a, 0xb0, - 0x02, 0x8c, 0x01, 0x82, 0x84, 0x24, 0xe0, 0x28, - 0x30, 0x02, 0xcc, 0x00, 0x93, 0x00, 0x2c, 0xc0, - 0x0a, 0x30, 0x0a, 0x0c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x28, 0x30, 0x0a, 0x20, 0x08, 0xb3, 0x00, - 0x24, 0xc0, 0x08, 0xb0, 0x26, 0x40, 0x00, 0x93, - 0x00, 0x2c, 0x00, 0x0a, 0x30, 0x02, 0x2c, 0x00, - 0x83, 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, - 0x6c, 0x00, 0xf7, 0x00, 0x35, 0xc1, 0x0c, 0xf0, - 0x03, 0x1c, 0x00, 0x8a, 0x00, 0x3e, 0xc0, 0x0d, - 0xb0, 0x07, 0xfc, 0x00, 0xff, 0x00, 0x1e, 0xc0, - 0x8b, 0xb0, 0x03, 0x3c, 0x00, 0xff, 0x02, 0x3e, - 0xc0, 0x1c, 0xf0, 0x03, 0x24, 0x00, 0x8b, 0x00, - 0x36, 0x80, 0x0e, 0xb0, 0x03, 0x68, 0x00, 0xf7, - 0x00, 0x3e, 0x80, 0x0f, 0xb0, 0x03, 0x2c, 0x02, - 0xef, 0x00, 0x3f, 0xc0, 0x08, 0xb0, 0x03, 0x40, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, - 0xdc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x07, 0xf0, - 0x43, 0xfc, 0x00, 0xfd, 0x00, 0x3f, 0x00, 0x0d, - 0xf0, 0x03, 0xfc, 0x08, 0xff, 0x00, 0x17, 0x00, - 0x0f, 0xc0, 0x07, 0xfc, 0x00, 0xff, 0x00, 0x3d, - 0x00, 0x0f, 0xf0, 0x00, 0xf4, 0x00, 0xfe, 0x00, - 0x3b, 0x80, 0x0f, 0xf0, 0x2b, 0xb8, 0x08, 0xff, - 0x00, 0x3f, 0x80, 0x0e, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0xed, 0x09, - 0x00, 0x72, 0x01, 0x03, 0xe8, 0x06, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x05, 0xf0, 0x02, 0xcc, - 0x00, 0x2f, 0x08, 0x8c, 0xc0, 0x0b, 0x30, 0x00, - 0xf7, 0x04, 0x33, 0x80, 0x0c, 0xd0, 0x43, 0x30, - 0x00, 0xf5, 0x00, 0x1f, 0x01, 0x2c, 0xe0, 0x43, - 0xf0, 0x00, 0xcc, 0x00, 0x3f, 0x10, 0x2c, 0xc0, - 0x03, 0xf1, 0x00, 0xfc, 0x00, 0x3b, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xfc, 0x1c, 0x37, 0x08, - 0x2d, 0xc1, 0x83, 0x30, 0x80, 0xcc, 0x20, 0x17, - 0x00, 0x0c, 0xc0, 0x03, 0x30, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x10, 0xe4, 0x20, 0x89, - 0x00, 0x2e, 0x44, 0x08, 0x90, 0x82, 0x24, 0x00, - 0xbb, 0x00, 0x22, 0xc1, 0x0d, 0xa0, 0x03, 0x60, - 0x00, 0x3b, 0x20, 0x2e, 0x00, 0x08, 0xb0, 0x22, - 0xe0, 0x20, 0x8a, 0x02, 0x2e, 0x80, 0x0a, 0x80, - 0x02, 0xc0, 0x80, 0xb8, 0x28, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xec, 0xa0, 0xb0, 0x40, 0x32, 0x58, - 0x08, 0x92, 0x22, 0xa1, 0xb2, 0x80, 0x60, 0xa2, - 0x18, 0x08, 0x97, 0x83, 0x60, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x88, 0x05, 0xe4, 0x80, 0x90, - 0x00, 0x2c, 0x40, 0x48, 0x92, 0x06, 0x00, 0x04, - 0xbb, 0x00, 0x22, 0x40, 0x88, 0x00, 0x02, 0x00, - 0x00, 0xb1, 0x28, 0x2e, 0xc0, 0x8a, 0x30, 0x02, - 0xc8, 0x00, 0x81, 0x00, 0x6c, 0x00, 0x2a, 0x30, - 0x02, 0xc0, 0x81, 0xb1, 0x20, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb0, 0x00, 0x24, 0x12, - 0x0a, 0x22, 0x02, 0x82, 0xc0, 0xa0, 0x18, 0x20, - 0x06, 0x08, 0x00, 0x02, 0x22, 0x11, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x15, 0xa4, 0x00, 0x9b, - 0x00, 0x2e, 0x60, 0x08, 0x98, 0x06, 0x24, 0x00, - 0xbb, 0x8c, 0xa2, 0x40, 0x09, 0x80, 0x86, 0x61, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0a, 0xb0, 0x06, - 0xc8, 0xed, 0x09, 0x00, 0x73, 0x01, 0x00, 0x8b, - 0x01, 0x6c, 0x82, 0x0a, 0xb0, 0x12, 0xe0, 0x60, - 0xb9, 0x20, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, - 0x00, 0xb9, 0x50, 0x22, 0x42, 0x08, 0xb1, 0x02, - 0x8c, 0x01, 0xa8, 0x00, 0x02, 0x00, 0x18, 0x98, - 0x02, 0x70, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x15, 0xca, 0x00, 0xda, 0x00, 0x3c, 0x20, - 0x0c, 0x18, 0x13, 0x25, 0x40, 0xf9, 0x00, 0x32, - 0xd0, 0x0c, 0x1c, 0x03, 0x20, 0x44, 0xbb, 0xc8, - 0x3e, 0xd8, 0x0e, 0xbd, 0x03, 0xe1, 0x00, 0x88, - 0x00, 0x2e, 0x10, 0x8e, 0x80, 0x03, 0xe3, 0x00, - 0xf8, 0x80, 0x3a, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xf8, 0xc0, 0x36, 0xb0, 0x0f, 0x88, 0x43, - 0xa0, 0x00, 0xeb, 0x84, 0x12, 0x94, 0x0c, 0x1c, - 0x83, 0x10, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x01, 0xb7, 0x00, 0xef, 0xc0, 0x3f, 0x42, - 0x0f, 0xd0, 0x03, 0xfe, 0x20, 0xfd, 0x00, 0x3f, - 0xd2, 0x0f, 0xec, 0x03, 0xf0, 0x00, 0xfe, 0xc1, - 0x3f, 0xe4, 0x0d, 0xf0, 0x03, 0xf0, 0x02, 0xfe, - 0x01, 0x3f, 0x80, 0x2f, 0xc0, 0x13, 0xf2, 0x00, - 0xfc, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x80, 0x39, 0xc5, 0x2d, 0x48, 0x03, - 0xf1, 0x00, 0xdc, 0x94, 0x3f, 0xe0, 0x6b, 0xd0, - 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x10, 0xac, 0x08, 0x4a, 0x00, 0x3e, 0x44, - 0x4f, 0x93, 0x0b, 0x2d, 0x08, 0xf9, 0x48, 0x32, - 0xd0, 0x0f, 0x88, 0x03, 0xe1, 0x04, 0x5b, 0x04, - 0x32, 0x49, 0x0f, 0xb1, 0xa3, 0x6b, 0x82, 0xe9, - 0x10, 0x3e, 0x30, 0x2f, 0xb1, 0x83, 0xe2, 0x02, - 0xe9, 0xa0, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x20, 0xe2, 0x00, 0xb2, 0x81, 0x06, 0x91, 0x0b, - 0x2c, 0x84, 0xf3, 0x00, 0xb2, 0x92, 0x0f, 0x94, - 0x03, 0x10, 0x04, 0x20, 0xed, 0x09, 0x00, 0x74, - 0x01, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, - 0x00, 0x8b, 0xc3, 0x2e, 0x41, 0x8b, 0x94, 0x22, - 0x2d, 0x80, 0xb1, 0x00, 0x28, 0xc8, 0x0b, 0xa8, - 0x42, 0xe0, 0x08, 0x8a, 0x41, 0xa8, 0x50, 0x4b, - 0xbc, 0x42, 0x2a, 0x10, 0x8b, 0x80, 0x2e, 0xb0, - 0x20, 0xbc, 0x02, 0xe2, 0x02, 0x89, 0xc0, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x80, 0x0b, 0x00, - 0x22, 0xc4, 0x0a, 0x95, 0x02, 0x2d, 0x20, 0xe8, - 0xf0, 0x22, 0xf0, 0x8b, 0x90, 0x03, 0x32, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x48, - 0x00, 0x83, 0x90, 0x2c, 0xb0, 0x0b, 0x14, 0x42, - 0x4f, 0x00, 0xb1, 0x40, 0x20, 0x61, 0x0b, 0x26, - 0x02, 0xc1, 0x80, 0x33, 0x00, 0x20, 0xc4, 0x0b, - 0x30, 0x02, 0x45, 0x00, 0xa0, 0x61, 0x2c, 0x58, - 0x8a, 0x04, 0x22, 0xcd, 0x80, 0xb2, 0x40, 0x6c, - 0xc0, 0x0b, 0x30, 0x02, 0xce, 0x00, 0xa0, 0x80, - 0x20, 0x20, 0x09, 0x08, 0x10, 0x00, 0x08, 0xb0, - 0x80, 0x2a, 0x54, 0x0b, 0x20, 0x02, 0x38, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x16, - 0x58, 0x85, 0xc0, 0x2d, 0x20, 0x4b, 0x59, 0x02, - 0x5e, 0x04, 0xb7, 0x80, 0x29, 0x60, 0x0b, 0x68, - 0x02, 0xf6, 0x08, 0x8f, 0xd0, 0x29, 0xe8, 0x0b, - 0xd8, 0x06, 0x56, 0x02, 0x86, 0x80, 0x2d, 0xe4, - 0x28, 0x48, 0x02, 0xde, 0x40, 0x96, 0x80, 0x2d, - 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0x86, 0x88, - 0x21, 0x22, 0x0a, 0x18, 0x02, 0x1c, 0x40, 0xa7, - 0x84, 0x29, 0x60, 0x0b, 0x69, 0x02, 0x08, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x2c, - 0x02, 0xc3, 0x00, 0x3c, 0xc4, 0x9f, 0x91, 0x03, - 0x4c, 0x80, 0xf0, 0x00, 0x30, 0x44, 0x0f, 0x00, - 0x03, 0xc0, 0x90, 0xf3, 0x00, 0x70, 0xc0, 0x0f, - 0x31, 0x03, 0x6d, 0x02, 0xe1, 0x02, 0x3e, 0xed, - 0x09, 0x00, 0x75, 0x01, 0x44, 0x0f, 0x30, 0x13, - 0xcc, 0x02, 0xf3, 0x00, 0x3c, 0xc0, 0x0b, 0x30, - 0x03, 0xec, 0x00, 0xe3, 0x00, 0x22, 0x80, 0x0e, - 0x20, 0x03, 0x00, 0xc0, 0xf0, 0x40, 0x38, 0xd0, - 0x0f, 0x91, 0x03, 0x12, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x01, - 0x3f, 0xc1, 0x0f, 0xf1, 0x03, 0xbc, 0x00, 0xff, - 0x00, 0xff, 0x40, 0x0f, 0xe0, 0x03, 0xdc, 0x00, - 0xef, 0x00, 0x3f, 0xc8, 0x0f, 0x70, 0x02, 0xbc, - 0x00, 0xff, 0x00, 0x3f, 0xc4, 0x0f, 0xf0, 0x03, - 0xfc, 0x02, 0xef, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xfc, 0x40, 0x7f, 0x02, 0x3f, 0x80, 0x8e, - 0xf0, 0x03, 0xfc, 0x00, 0xef, 0x11, 0x37, 0xc0, - 0x8f, 0xf1, 0x43, 0x90, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x05, 0xe8, 0x04, 0xcb, 0x01, - 0x36, 0x80, 0x0f, 0x90, 0x03, 0x0e, 0x00, 0xc9, - 0x00, 0xb2, 0xc0, 0x4f, 0xb0, 0x03, 0xe4, 0x00, - 0xfb, 0x00, 0x38, 0xa0, 0x2c, 0xb0, 0x13, 0xe4, - 0x02, 0x58, 0x00, 0x3e, 0x40, 0x0d, 0x80, 0x03, - 0xec, 0x00, 0xca, 0x02, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xac, 0x00, 0xf9, 0x00, 0x3e, 0x00, 0x1f, - 0xa0, 0x03, 0x6c, 0x00, 0xfb, 0x00, 0x72, 0x00, - 0x2c, 0xb8, 0x03, 0x2a, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x11, 0x84, 0x00, 0x87, 0x00, - 0x2d, 0xc0, 0x8b, 0xd0, 0x22, 0x1c, 0x00, 0x85, - 0x00, 0x21, 0xc0, 0x0b, 0x40, 0x02, 0xd4, 0x00, - 0xb7, 0x00, 0x21, 0x80, 0x08, 0x70, 0x02, 0xd4, - 0x00, 0x86, 0x00, 0x2f, 0xc0, 0x28, 0x40, 0x02, - 0xfc, 0x02, 0xf6, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0x00, 0x58, - 0x60, 0x02, 0xdc, 0x00, 0xb3, 0x00, 0x60, 0x40, - 0x08, 0xf0, 0x02, 0x12, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x76, 0x01, 0xc0, - 0x00, 0x9e, 0x00, 0x87, 0x80, 0x25, 0xe2, 0x0b, - 0x78, 0x02, 0x3e, 0x08, 0x87, 0x80, 0x21, 0xe2, - 0x0a, 0x68, 0x02, 0xd6, 0x00, 0xb7, 0x80, 0x29, - 0xe0, 0x09, 0x7c, 0x02, 0xde, 0x00, 0x95, 0x80, - 0x2d, 0x60, 0x29, 0x78, 0x02, 0xde, 0x00, 0x97, - 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, - 0xb7, 0x80, 0x2d, 0xa0, 0x49, 0x78, 0x72, 0x5e, - 0x18, 0xb7, 0x80, 0x25, 0xa1, 0x48, 0x78, 0x0a, - 0xb0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x14, 0xce, 0x42, 0x83, 0x02, 0x2c, 0xe0, 0x0b, - 0xb1, 0x42, 0x0c, 0x40, 0x83, 0x10, 0x20, 0xe0, - 0x0b, 0x21, 0x02, 0xcc, 0x08, 0xb3, 0x10, 0x20, - 0xf4, 0x09, 0x38, 0x22, 0xec, 0x08, 0x83, 0x00, - 0x2c, 0xc0, 0x88, 0x30, 0x02, 0xcc, 0x10, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x08, 0x2c, 0xa0, 0x08, 0x32, 0x02, 0xcc, - 0x00, 0xbb, 0x80, 0x24, 0xc9, 0x08, 0x31, 0x02, - 0x92, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, - 0x15, 0xb8, 0x00, 0xce, 0x83, 0x37, 0x80, 0x4f, - 0xe8, 0x0b, 0x3b, 0x02, 0xc6, 0x40, 0x33, 0xb0, - 0x0f, 0xec, 0x01, 0xf9, 0x00, 0xf6, 0xc0, 0x1b, - 0xb0, 0x89, 0xec, 0x03, 0xe8, 0x00, 0xda, 0x04, - 0x2e, 0x80, 0x2d, 0xa0, 0x03, 0xe8, 0x00, 0xda, - 0x00, 0x2e, 0x80, 0x0f, 0xa0, 0x03, 0xa8, 0x00, - 0xfe, 0x08, 0x3d, 0xa2, 0x0d, 0xe2, 0x43, 0x79, - 0x00, 0xfe, 0x60, 0xb7, 0xa2, 0x0c, 0xec, 0x03, - 0xba, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x00, 0xc0, 0x00, 0xf8, 0x50, 0x1e, 0x20, 0x0f, - 0x84, 0x83, 0xe0, 0x20, 0xf8, 0x80, 0x3e, 0x20, - 0x0f, 0x88, 0x03, 0xe3, 0x00, 0xf8, 0x09, 0x3e, - 0x02, 0x4e, 0x88, 0x03, 0xe0, 0x00, 0xf8, 0x40, - 0x3e, 0x00, 0x0f, 0x84, 0x03, 0xed, 0x09, 0x00, - 0x77, 0x01, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x07, 0xe0, 0x00, 0xf8, 0x40, 0x3e, - 0x01, 0x6d, 0x00, 0x22, 0xe0, 0x20, 0x78, 0x08, - 0x3a, 0x00, 0x0f, 0x86, 0x03, 0x52, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, - 0xe9, 0xc0, 0x3c, 0x48, 0x0c, 0x94, 0x03, 0xa6, - 0x00, 0xb9, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x03, - 0x64, 0x08, 0xf9, 0x00, 0x32, 0x60, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0x19, 0x80, 0x3e, 0x60, 0x0e, - 0x92, 0x03, 0x66, 0x80, 0xc9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xe7, 0x10, 0xe1, 0x80, 0x32, - 0x40, 0x0d, 0x98, 0x03, 0x24, 0x00, 0xc9, 0x80, - 0x32, 0x64, 0x08, 0x92, 0x43, 0xc2, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x64, 0x04, - 0x89, 0xc8, 0x2e, 0x40, 0x0a, 0x90, 0x82, 0x24, - 0x00, 0xb9, 0xc0, 0x36, 0x40, 0x0b, 0x18, 0x0a, - 0xa4, 0x84, 0xb9, 0x00, 0xa2, 0x40, 0x09, 0x98, - 0x02, 0xe5, 0x00, 0x89, 0x48, 0x2e, 0x70, 0x48, - 0x9e, 0x02, 0xe5, 0x00, 0xa9, 0x40, 0x2e, 0x40, - 0x0b, 0x90, 0x03, 0xe7, 0x80, 0x89, 0xc0, 0x22, - 0x44, 0x0a, 0x9c, 0x2a, 0x24, 0xc2, 0x89, 0x98, - 0xa2, 0x40, 0x08, 0x94, 0x02, 0xe0, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x18, 0xb0, 0x02, 0xec, - 0x40, 0xb9, 0x80, 0xa2, 0xc0, 0x0b, 0x98, 0x02, - 0x64, 0x00, 0xb9, 0x20, 0x22, 0x4a, 0x0b, 0xb5, - 0x02, 0xe4, 0x02, 0xbd, 0x10, 0x2d, 0x48, 0x4a, - 0xd0, 0x12, 0xd4, 0x0c, 0x8d, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xc4, 0x00, 0xa9, 0x10, 0x22, - 0x40, 0x29, 0x95, 0x42, 0x04, 0x00, 0x99, 0x00, - 0x20, 0x40, 0x0a, 0x90, 0x02, 0xc6, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x05, 0x00, - 0xed, 0x09, 0x00, 0x78, 0x01, 0x91, 0x00, 0x2c, - 0x40, 0x1a, 0x14, 0x02, 0x44, 0x00, 0xb9, 0x80, - 0x24, 0x40, 0x0b, 0x90, 0x02, 0x84, 0x00, 0xb9, - 0x44, 0x20, 0x40, 0x1b, 0x10, 0x02, 0xd7, 0x04, - 0xa5, 0x00, 0x2d, 0x70, 0x08, 0x54, 0x06, 0xd7, - 0x08, 0xa5, 0xc0, 0x2c, 0x40, 0x0b, 0x10, 0x02, - 0xc5, 0x02, 0x83, 0x40, 0xa2, 0x50, 0x0a, 0x14, - 0x02, 0x05, 0x00, 0x91, 0x40, 0x20, 0x50, 0x28, - 0x14, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb8, 0x0d, 0x60, 0x00, 0xf8, 0x01, 0x3e, - 0x00, 0x2c, 0x80, 0x0b, 0xe0, 0x00, 0xf8, 0x00, - 0x32, 0x00, 0x0f, 0xa0, 0x03, 0x60, 0x00, 0xfa, - 0x01, 0x32, 0x00, 0x1f, 0x80, 0x03, 0xc0, 0x00, - 0xf8, 0x00, 0x2e, 0x00, 0x0e, 0x80, 0x01, 0x60, - 0x00, 0xcc, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xe0, 0x00, 0xe8, 0x02, 0x30, 0x01, 0x0d, 0x80, - 0x03, 0x20, 0x00, 0xd8, 0x00, 0x32, 0x80, 0x0e, - 0xa0, 0x03, 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x98, 0x19, 0xf5, 0x00, 0xed, 0x00, 0x3f, - 0x50, 0x4f, 0xd0, 0x13, 0xb4, 0x00, 0xf5, 0x00, - 0xbb, 0x40, 0x0f, 0xf0, 0x13, 0xf4, 0x00, 0xf5, - 0x02, 0x3f, 0x41, 0x0d, 0xd0, 0x03, 0xe4, 0x00, - 0xc9, 0x02, 0x1e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xa4, 0x00, 0xfd, 0x40, 0x3f, 0x50, 0x0f, 0xd4, - 0x03, 0xf5, 0x00, 0xed, 0x40, 0x3f, 0x50, 0x8f, - 0xd4, 0x03, 0xe6, 0x02, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x05, 0xf5, 0x80, 0xc5, 0x00, 0x37, - 0x48, 0x0c, 0xd4, 0x03, 0x74, 0x00, 0xcd, 0x00, - 0x33, 0x40, 0x0c, 0xd0, 0x03, 0xf4, 0x00, 0xf5, - 0x00, 0x3f, 0x40, 0x0e, 0xd0, 0x03, 0xf4, 0x02, - 0xd5, 0x00, 0x3f, 0x40, 0x0c, 0x50, 0x03, 0xf4, - 0x02, 0xdd, 0x00, 0xed, 0x09, 0x00, 0x79, 0x01, - 0x32, 0x40, 0x0f, 0x90, 0x03, 0xf5, 0x00, 0xfd, - 0x4c, 0x3f, 0x40, 0x0d, 0xd2, 0x83, 0x3d, 0x00, - 0xcd, 0x25, 0x3f, 0x4a, 0xac, 0xd6, 0x03, 0xc6, - 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, - 0xe1, 0x80, 0x88, 0x00, 0x22, 0x00, 0x08, 0x82, - 0x02, 0xa0, 0x00, 0x08, 0x00, 0x22, 0x00, 0x0d, - 0x80, 0x42, 0xe0, 0x08, 0x38, 0x22, 0x22, 0x00, - 0x82, 0x80, 0x02, 0xc0, 0x10, 0xf8, 0x01, 0x2c, - 0x08, 0x8a, 0x80, 0x02, 0xe0, 0x08, 0xf8, 0x00, - 0xa2, 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x80, 0xb0, - 0x40, 0x2e, 0x14, 0x8c, 0x86, 0x0a, 0x20, 0x04, - 0x88, 0x28, 0x2e, 0x08, 0x08, 0x87, 0x02, 0xce, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, - 0xcc, 0xc0, 0x81, 0x00, 0x64, 0x50, 0x08, 0x10, - 0x02, 0x64, 0x01, 0x89, 0x00, 0xa0, 0x40, 0x18, - 0x10, 0x02, 0xc4, 0x04, 0xb1, 0x08, 0xac, 0x40, - 0x0b, 0x10, 0x02, 0xc4, 0xa2, 0x91, 0x00, 0x2c, - 0x42, 0x28, 0x12, 0x86, 0xc4, 0xb0, 0x91, 0x28, - 0x20, 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, - 0x00, 0x2c, 0x4a, 0x0b, 0x18, 0x82, 0x45, 0x02, - 0x81, 0x31, 0x2c, 0x4b, 0x08, 0x18, 0x22, 0xc2, - 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, - 0xa6, 0x00, 0x89, 0x00, 0x22, 0x4a, 0x28, 0x90, - 0x82, 0xa4, 0x10, 0x8b, 0x1c, 0x22, 0x50, 0x09, - 0x90, 0x06, 0xe6, 0x08, 0xb9, 0x00, 0xa2, 0x44, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0x39, 0x08, 0x2c, - 0x40, 0x0a, 0x95, 0x22, 0xc4, 0x08, 0xb9, 0x08, - 0x22, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x40, 0x2e, 0x40, 0x0b, 0x90, 0x12, 0x64, 0x00, - 0x89, 0x02, 0x2e, 0x48, 0x08, 0x92, 0x02, 0xc6, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, - 0xe4, 0x80, 0xc9, 0x10, 0x36, 0x40, 0xed, 0x09, - 0x00, 0x7a, 0x01, 0x4c, 0x91, 0x23, 0x46, 0x40, - 0xc1, 0x00, 0x30, 0x70, 0x0c, 0x94, 0x03, 0xe4, - 0x00, 0xf9, 0x01, 0x3c, 0x72, 0x0f, 0x98, 0x92, - 0xe6, 0x02, 0xd9, 0x02, 0x1e, 0x40, 0x0c, 0x94, - 0x13, 0xe4, 0x02, 0xd9, 0x00, 0xb2, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x80, 0x3e, 0x40, - 0x4f, 0x98, 0x03, 0x65, 0x20, 0xc9, 0x00, 0x3e, - 0x40, 0x0c, 0x90, 0x03, 0xe8, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x01, 0xa4, 0x02, 0xf9, - 0x80, 0xbe, 0x60, 0x0f, 0x98, 0x13, 0xe4, 0x02, - 0xf9, 0x80, 0x3e, 0x67, 0x0f, 0x92, 0x03, 0xe4, - 0x00, 0xf9, 0x01, 0x3e, 0x60, 0x08, 0x9c, 0x83, - 0xe4, 0x80, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x98, - 0x03, 0xe4, 0x22, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0xc2, 0x3e, 0x48, - 0x0c, 0x94, 0x83, 0x84, 0x40, 0xf9, 0x00, 0x7c, - 0x60, 0x0f, 0x98, 0x13, 0xca, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x10, 0xa1, 0x00, 0xc8, - 0x80, 0x36, 0x10, 0x0e, 0x84, 0x03, 0x22, 0x00, - 0xf8, 0x40, 0x32, 0x10, 0x0f, 0x8c, 0x03, 0xe2, - 0x00, 0xf8, 0x08, 0xf2, 0x18, 0x07, 0x80, 0x03, - 0xe0, 0x04, 0xe8, 0x83, 0x32, 0x00, 0x4c, 0x84, - 0x03, 0x20, 0x00, 0xf8, 0x20, 0x32, 0x00, 0x0f, - 0x80, 0x03, 0xa0, 0x20, 0xf8, 0x01, 0x32, 0x00, - 0x8d, 0x80, 0x03, 0x21, 0x22, 0xe8, 0x20, 0x02, - 0x08, 0x0f, 0x80, 0x02, 0xca, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x05, 0x08, 0x00, 0x86, - 0xc0, 0xa1, 0x81, 0x08, 0xe5, 0x12, 0xb9, 0x00, - 0xbe, 0x10, 0x2b, 0x80, 0x4b, 0xee, 0x22, 0xf9, - 0x00, 0xbe, 0xa0, 0x23, 0x82, 0x49, 0xe8, 0x42, - 0xfb, 0x60, 0x8e, 0xc0, 0x23, 0x90, 0x28, 0xef, - 0x13, 0xf8, 0x00, 0xbe, 0x00, 0x3e, 0x80, 0x0b, - 0xa0, 0xed, 0x09, 0x00, 0x7b, 0x01, 0x02, 0xf9, - 0x00, 0x3e, 0x40, 0xa3, 0x90, 0x2a, 0xe0, 0x8a, - 0x39, 0x04, 0x8e, 0x81, 0x23, 0xa1, 0x0b, 0xe8, - 0x82, 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x05, 0x4c, 0x00, 0x83, 0x80, 0x20, 0x80, - 0x0a, 0xb0, 0x12, 0x04, 0x10, 0xb3, 0x40, 0x20, - 0xd0, 0x0b, 0x38, 0x02, 0xc4, 0x40, 0xbb, 0xc0, - 0x20, 0x90, 0x0b, 0x09, 0x02, 0xef, 0x02, 0xa1, - 0x02, 0x28, 0xf2, 0x18, 0x3c, 0x02, 0x4d, 0x40, - 0xbb, 0xc0, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0x8e, - 0x00, 0xb3, 0x09, 0x22, 0xd2, 0x20, 0xb4, 0x02, - 0x0f, 0x00, 0xa3, 0x00, 0x20, 0xc0, 0x0b, 0x30, - 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x01, 0x1c, 0x00, 0x87, 0x08, 0x20, 0xd0, - 0x28, 0x70, 0x82, 0x9c, 0x00, 0xbf, 0x00, 0xa9, - 0xc0, 0x8b, 0x70, 0x02, 0xd4, 0x00, 0xbe, 0x00, - 0x21, 0xc0, 0x0b, 0x70, 0x22, 0xdc, 0x02, 0xa7, - 0xc0, 0x21, 0xc2, 0x08, 0xf8, 0x00, 0xdc, 0x00, - 0xb7, 0x08, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, - 0x20, 0xb7, 0x82, 0x23, 0x00, 0x08, 0x30, 0x02, - 0x1c, 0x20, 0x83, 0x88, 0xa1, 0xc2, 0x4b, 0x70, - 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x08, 0x3e, 0x02, 0xc7, 0x80, 0x31, 0xa0, - 0x4e, 0xf8, 0x0b, 0x1e, 0x00, 0xf5, 0x80, 0x71, - 0xe0, 0x0f, 0x78, 0x03, 0xd6, 0x04, 0xf6, 0x80, - 0xa1, 0xe0, 0x0f, 0x78, 0x02, 0xde, 0x04, 0xe7, - 0x80, 0xb9, 0xe0, 0x2c, 0x78, 0x03, 0x5e, 0x00, - 0xff, 0x84, 0x31, 0xe0, 0x0f, 0x78, 0x27, 0x9a, - 0x04, 0xf5, 0x80, 0x31, 0xe0, 0x28, 0x78, 0x23, - 0x06, 0x00, 0xe7, 0x80, 0x31, 0xe0, 0x8f, 0x68, - 0x03, 0xea, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x1d, 0xac, 0x00, 0xba, 0x00, 0x3a, 0xc1, - 0x0f, 0xb0, 0x07, 0xec, 0xed, 0x09, 0x00, 0x7c, - 0x01, 0x00, 0xf1, 0x00, 0xbe, 0xc0, 0x4d, 0xb0, - 0x01, 0xe0, 0x08, 0xfa, 0x00, 0x2e, 0xc0, 0x0d, - 0xb0, 0x22, 0xec, 0x00, 0xdb, 0x00, 0x36, 0xc0, - 0x0f, 0xa0, 0x03, 0x6c, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x07, 0xe4, 0x00, 0xfb, 0x03, - 0x3c, 0x00, 0x8e, 0x90, 0x03, 0xe8, 0x00, 0xf9, - 0x00, 0x3e, 0xc0, 0x0f, 0xa0, 0x03, 0xc2, 0x06, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xf6, - 0x00, 0xee, 0x80, 0x3f, 0xa0, 0x4e, 0xf8, 0x43, - 0x36, 0x00, 0xf7, 0x80, 0xb9, 0xe4, 0x0c, 0xe9, - 0x43, 0xf6, 0x40, 0x8f, 0x80, 0x3f, 0xe0, 0x0c, - 0x78, 0x03, 0x7e, 0x10, 0xcf, 0x90, 0x33, 0xe0, - 0x0c, 0xf8, 0x03, 0x3e, 0x40, 0xcf, 0x80, 0xb3, - 0xe0, 0x0f, 0xf8, 0x03, 0xf6, 0x00, 0xfe, 0x00, - 0x31, 0xe4, 0x2c, 0xf8, 0x03, 0x3a, 0x00, 0xff, - 0x80, 0x37, 0xe0, 0x0c, 0xd8, 0x0b, 0x00, 0x02, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, 0x94, - 0x00, 0x84, 0x00, 0x2d, 0x40, 0x08, 0xf0, 0x0a, - 0x18, 0x44, 0xb7, 0x10, 0x21, 0xc5, 0x08, 0x40, - 0x02, 0xd1, 0x00, 0xdf, 0x20, 0x35, 0x80, 0x08, - 0x50, 0x00, 0x1c, 0x80, 0xa7, 0x30, 0x23, 0xc0, - 0x0f, 0xe0, 0x53, 0x5c, 0x44, 0xdf, 0x10, 0x3d, - 0xc0, 0x0b, 0x70, 0x02, 0xd0, 0x00, 0xbe, 0x00, - 0x35, 0x0c, 0x08, 0x72, 0x42, 0x10, 0x40, 0xb6, - 0x01, 0x2d, 0xc0, 0x08, 0x54, 0x02, 0x2a, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, - 0x40, 0xb6, 0x10, 0x2d, 0x00, 0x0a, 0x70, 0x02, - 0x1c, 0x00, 0xb4, 0x00, 0x29, 0xc0, 0x18, 0x60, - 0x92, 0xf4, 0x00, 0x96, 0x0a, 0x2f, 0xc0, 0x08, - 0x64, 0x82, 0x1c, 0x04, 0x8c, 0x00, 0x65, 0xc0, - 0x29, 0x70, 0x02, 0x1c, 0x01, 0x87, 0x00, 0x21, - 0xc0, 0x0b, 0x70, 0x02, 0xd8, 0x00, 0xa5, 0xed, - 0x09, 0x00, 0x7d, 0x01, 0x00, 0x23, 0xc0, 0x1a, - 0x60, 0x22, 0x94, 0x20, 0xb7, 0x00, 0x24, 0x00, - 0x08, 0x64, 0x82, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x14, 0xc5, 0x00, 0x90, 0x81, - 0x2c, 0xd1, 0x08, 0x84, 0x02, 0x08, 0x84, 0xb1, - 0x80, 0xa0, 0xd0, 0x18, 0x0e, 0x02, 0xc1, 0x80, - 0x9a, 0xc0, 0x2c, 0x40, 0x08, 0x38, 0x02, 0x08, - 0x00, 0xa3, 0x00, 0x24, 0x24, 0x2b, 0x00, 0x02, - 0x40, 0x01, 0x92, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x22, 0xc0, 0x00, 0xbb, 0x40, 0x20, 0x00, 0x00, - 0x04, 0x02, 0xa2, 0x00, 0xb0, 0x02, 0x2c, 0x10, - 0x08, 0x28, 0x02, 0x08, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x15, 0xad, 0x40, 0xfb, 0x02, - 0x3e, 0xe0, 0x0a, 0x94, 0x83, 0x07, 0x00, 0xfb, - 0x48, 0x38, 0xc0, 0x0c, 0xb8, 0x13, 0xee, 0x00, - 0xda, 0xd0, 0x1e, 0xc0, 0x2c, 0xbc, 0x03, 0x2c, - 0x00, 0xc3, 0x00, 0x36, 0xc0, 0x0d, 0x30, 0x02, - 0x2c, 0x02, 0xcb, 0x00, 0x32, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xeb, 0x40, 0x22, 0xc0, 0x02, - 0xb0, 0x03, 0xac, 0x00, 0xfb, 0x18, 0x36, 0xc0, - 0x6c, 0xb8, 0x23, 0x2a, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0xce, 0x00, 0xeb, 0x74, - 0x3e, 0xa8, 0x8f, 0x86, 0x03, 0xee, 0x00, 0xfb, - 0x60, 0x3e, 0x50, 0x0f, 0xa4, 0x03, 0xea, 0x00, - 0xda, 0x40, 0x16, 0xd0, 0x0f, 0xa0, 0x03, 0xac, - 0x00, 0xf9, 0xc0, 0x3a, 0xc0, 0x0f, 0xa4, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x23, 0xec, 0x00, 0xf9, 0xa0, 0x3e, 0xd2, 0x8d, - 0xa2, 0x01, 0x6c, 0x20, 0xfb, 0x00, 0x3e, 0x00, - 0x0f, 0xb4, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x10, 0xfc, 0x02, 0xec, 0x01, - 0x30, 0xc8, 0x0e, 0xd0, 0x03, 0xbc, 0x02, 0xce, - 0x40, 0x17, 0xed, 0x09, 0x00, 0x7e, 0x01, 0xe2, - 0x0c, 0xf0, 0x03, 0xfe, 0x80, 0xbe, 0x01, 0xb7, - 0xa0, 0x0f, 0xdc, 0x23, 0xfe, 0x02, 0x0f, 0x00, - 0x33, 0xc0, 0x2e, 0xf0, 0x03, 0x3c, 0x00, 0xcf, - 0xc0, 0xb3, 0xc0, 0x0f, 0xf0, 0x03, 0xf8, 0x00, - 0xfc, 0x10, 0x35, 0x60, 0x0e, 0xf8, 0x03, 0xf4, - 0x00, 0xc6, 0x10, 0x01, 0xc2, 0x0c, 0x54, 0x33, - 0x00, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, - 0x00, 0x6c, 0x02, 0x80, 0x80, 0x22, 0xa0, 0xa8, - 0x88, 0x33, 0x6c, 0x00, 0xa3, 0xc2, 0x2a, 0x60, - 0x28, 0xb4, 0x82, 0xe8, 0x00, 0xba, 0xa0, 0xa2, - 0xc0, 0x1b, 0xb6, 0x02, 0x6e, 0x44, 0xab, 0xb1, - 0x22, 0xc0, 0x0c, 0xa8, 0x12, 0x2c, 0x00, 0xcb, - 0x80, 0xbe, 0xc0, 0x0b, 0xb0, 0x02, 0xe4, 0x00, - 0xb8, 0xe0, 0x22, 0x46, 0x8a, 0x89, 0x02, 0xe8, - 0x00, 0xa8, 0x0c, 0x22, 0x10, 0x08, 0x94, 0x02, - 0xa0, 0x50, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x05, 0x2e, 0x03, 0xaa, 0x60, 0xa2, 0xc2, 0x0a, - 0x9c, 0x02, 0xa4, 0x08, 0x8b, 0x00, 0x2e, 0xd8, - 0x09, 0xa2, 0x02, 0xe4, 0x01, 0xba, 0x80, 0x22, - 0xd4, 0x0b, 0xb0, 0x02, 0xcc, 0x00, 0xab, 0x00, - 0x20, 0xc0, 0x0a, 0xbc, 0x02, 0x0c, 0x08, 0x83, - 0x00, 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xe4, 0x04, - 0xba, 0x00, 0x22, 0x80, 0x0a, 0x90, 0x82, 0xe8, - 0x00, 0x89, 0x00, 0x0a, 0xf0, 0x08, 0x90, 0x02, - 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x0c, 0x00, 0x88, 0x00, 0x20, 0x80, 0x28, - 0x00, 0x02, 0x48, 0x00, 0xa3, 0x00, 0x28, 0x01, - 0x09, 0x00, 0x02, 0xc0, 0x00, 0xb2, 0x00, 0x20, - 0xc0, 0x0b, 0x30, 0x06, 0xc4, 0x16, 0xab, 0x00, - 0x20, 0xc0, 0x38, 0x80, 0x00, 0x0c, 0x00, 0x81, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc0, 0x00, - 0xb0, 0x00, 0x20, 0x80, 0x08, 0xed, 0x09, 0x00, - 0x7f, 0x01, 0x00, 0x02, 0xc0, 0x00, 0xa0, 0x01, - 0xa8, 0x00, 0x08, 0x10, 0x02, 0x82, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x0c, - 0xe8, 0x02, 0x32, 0x40, 0x0e, 0x90, 0x13, 0xac, - 0x02, 0xcb, 0x00, 0x3e, 0xc0, 0x0d, 0x80, 0x03, - 0xe4, 0x00, 0xb8, 0x02, 0x32, 0xc0, 0x0b, 0xb0, - 0x02, 0xcc, 0x02, 0xeb, 0x00, 0x32, 0xc0, 0x4e, - 0xb0, 0x07, 0x0c, 0x02, 0xcb, 0x00, 0x32, 0xc0, - 0x0f, 0xb0, 0x03, 0xe8, 0x00, 0xf8, 0x00, 0x32, - 0x00, 0x9e, 0x00, 0x23, 0xe4, 0x00, 0xc8, 0x02, - 0x3a, 0x00, 0x0c, 0x90, 0x03, 0x00, 0x01, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x04, - 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, 0xf8, - 0x00, 0xff, 0x00, 0x1f, 0x00, 0x0e, 0xc0, 0x43, - 0xd0, 0x04, 0xfc, 0x00, 0x19, 0x80, 0x8f, 0xc0, - 0x00, 0x70, 0x00, 0xf4, 0x00, 0x3f, 0x00, 0x04, - 0xc0, 0x1b, 0xf0, 0x00, 0xec, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0xfc, 0x00, 0x7b, - 0x00, 0x1f, 0xc0, 0x03, 0xf0, 0x00, 0xfc, 0x00, - 0x37, 0x00, 0x0f, 0x50, 0x62, 0xe8, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc1, 0x4d, 0xfc, 0x80, - 0xff, 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x13, 0xbc, - 0x20, 0xcc, 0x00, 0x33, 0xcc, 0x0c, 0xf0, 0x03, - 0xb1, 0x00, 0x1f, 0x20, 0x3f, 0x04, 0x09, 0xf2, - 0x03, 0x70, 0x40, 0xfc, 0x02, 0x37, 0x00, 0x09, - 0xd0, 0x03, 0x78, 0x44, 0xe6, 0x00, 0x23, 0x80, - 0x0d, 0x60, 0x0b, 0x14, 0x40, 0xc6, 0x08, 0x37, - 0xc8, 0x0c, 0xf2, 0x03, 0xbc, 0x80, 0x8f, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0xbc, 0x40, - 0xbf, 0x50, 0x2e, 0x00, 0x0b, 0x00, 0x12, 0x3d, - 0x00, 0xa0, 0x00, 0x23, 0xdc, 0x08, 0xf5, 0x03, - 0xed, 0x09, 0x00, 0x80, 0x01, 0xac, 0x88, 0xbf, - 0x00, 0xa6, 0xc8, 0x0b, 0xf1, 0x0b, 0x2c, 0x00, - 0xbb, 0x20, 0x20, 0xc8, 0x0a, 0x90, 0x02, 0x28, - 0x0c, 0xe8, 0x00, 0x22, 0xc0, 0x08, 0xa0, 0x82, - 0xa4, 0x0c, 0xfa, 0x44, 0x2e, 0xd0, 0x0a, 0xf0, - 0x02, 0xed, 0xc0, 0xfb, 0x00, 0x2e, 0xc1, 0x8b, - 0xb0, 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xca, 0x44, 0x0c, 0xa4, 0xb3, 0x00, 0x2c, - 0x40, 0x09, 0x30, 0x02, 0x8c, 0x00, 0x80, 0x08, - 0x20, 0xc8, 0x08, 0x30, 0x42, 0x8c, 0x80, 0xb3, - 0x40, 0x20, 0xc0, 0x02, 0x30, 0x02, 0x88, 0x84, - 0xb3, 0x2c, 0x28, 0x6a, 0x00, 0x10, 0x02, 0x40, - 0x00, 0xaa, 0x02, 0x2c, 0xc0, 0x09, 0xa2, 0x02, - 0xac, 0x00, 0xa0, 0x00, 0x24, 0xc4, 0x09, 0x31, - 0x06, 0xcc, 0x20, 0x83, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x14, 0xac, 0x00, 0xbb, 0x00, 0x2e, - 0x0a, 0x1b, 0x30, 0x0a, 0x2c, 0x00, 0xa8, 0x00, - 0x20, 0xc0, 0x08, 0xb0, 0x02, 0xa8, 0x68, 0x9b, - 0x01, 0x26, 0x44, 0x4b, 0xb0, 0x02, 0x6c, 0x00, - 0xb1, 0x02, 0x2a, 0xe0, 0x09, 0x92, 0x02, 0x48, - 0x40, 0x8a, 0x00, 0x26, 0xc0, 0x0b, 0xb4, 0x02, - 0xac, 0x00, 0xba, 0x20, 0x6e, 0xc4, 0x0a, 0xb0, - 0x02, 0xec, 0x00, 0x3b, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x84, 0xac, 0x00, 0xfb, 0x00, 0x3e, - 0x20, 0x05, 0x90, 0x83, 0xac, 0x00, 0xc9, 0x00, - 0x22, 0xc0, 0x0c, 0xb0, 0x03, 0xae, 0x00, 0xdb, - 0x00, 0x3a, 0xf2, 0x0e, 0xb0, 0x03, 0x2d, 0x08, - 0x7b, 0xc0, 0x3a, 0xe0, 0x0c, 0x10, 0x03, 0x69, - 0x00, 0xeb, 0x34, 0x3c, 0x48, 0x0d, 0x84, 0x03, - 0x08, 0x80, 0xea, 0x80, 0x36, 0x60, 0x04, 0xb0, - 0x07, 0xac, 0x00, 0xed, 0x09, 0x00, 0x81, 0x01, - 0x8b, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x02, 0xd0, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, - 0xbc, 0x04, 0xff, 0x00, 0x3f, 0x00, 0x0f, 0xf0, - 0x83, 0xdc, 0x00, 0xfc, 0x04, 0x3f, 0xc0, 0x0f, - 0xb0, 0x13, 0xf6, 0x00, 0xff, 0x02, 0x3b, 0xe0, - 0x8f, 0xf0, 0x03, 0x3e, 0x40, 0xff, 0x94, 0xb3, - 0xc0, 0x0e, 0xd8, 0x43, 0xba, 0x00, 0xed, 0x08, - 0x33, 0xc0, 0x0c, 0xf4, 0x03, 0x7c, 0x00, 0xff, - 0x81, 0x3d, 0x40, 0x0f, 0xf0, 0x03, 0xdc, 0x00, - 0xaf, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf8, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, - 0xac, 0x00, 0xeb, 0x20, 0x32, 0x42, 0x0c, 0xb4, - 0x03, 0x2c, 0x02, 0xca, 0x00, 0x3a, 0xc0, 0x1e, - 0xb0, 0x07, 0x2d, 0x02, 0xcb, 0x00, 0x3e, 0xc0, - 0x0d, 0x31, 0x02, 0x6d, 0x00, 0xcb, 0x40, 0x7e, - 0xc0, 0x2a, 0x90, 0x83, 0xe9, 0x00, 0xdb, 0x40, - 0x36, 0x50, 0x0c, 0xa0, 0x03, 0x2d, 0x00, 0xf9, - 0x04, 0x1a, 0xc0, 0x0e, 0xb0, 0x41, 0x6c, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x1f, 0xb0, 0x03, 0xd0, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x04, - 0x3c, 0x00, 0x8f, 0x80, 0x22, 0x08, 0x00, 0x94, - 0x02, 0x3e, 0x00, 0x8a, 0x00, 0x2b, 0xc0, 0x0c, - 0xf0, 0x02, 0x2c, 0x08, 0x87, 0x20, 0x2e, 0xc0, - 0x0b, 0xf8, 0x00, 0xec, 0x00, 0x5b, 0x01, 0x3e, - 0xc0, 0x09, 0x90, 0xc2, 0x68, 0x04, 0x83, 0x00, - 0x36, 0xe2, 0x0d, 0x30, 0x43, 0x6c, 0x00, 0xab, - 0x00, 0x22, 0xd0, 0x08, 0xff, 0x02, 0x7c, 0x00, - 0x9b, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xf2, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x04, - 0x0c, 0x00, 0xa3, 0x54, 0x20, 0xb0, 0x0b, 0x05, - 0x2a, 0x4e, 0x40, 0xa8, 0x00, 0x20, 0xc0, 0x09, - 0x30, 0x02, 0x0c, 0x00, 0xa3, 0x80, 0xed, 0x09, - 0x00, 0x82, 0x01, 0x2c, 0xc0, 0x0b, 0x38, 0x02, - 0xcc, 0x00, 0xa3, 0x00, 0x2e, 0xc0, 0x09, 0x14, - 0x02, 0xc8, 0x00, 0x93, 0x40, 0x20, 0xd2, 0x8b, - 0x20, 0x02, 0x84, 0x00, 0x90, 0x48, 0x2c, 0x62, - 0x0a, 0x30, 0x02, 0x4c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0a, 0x30, 0x02, 0x78, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xd8, 0x00, 0x0c, 0x02, 0x83, - 0x80, 0x23, 0xa0, 0x29, 0x48, 0x02, 0x4e, 0x08, - 0x84, 0x80, 0x29, 0xe0, 0x0a, 0x78, 0x02, 0x1e, - 0x48, 0x07, 0xc2, 0x2d, 0xe0, 0x1b, 0x78, 0x02, - 0xde, 0x00, 0x87, 0x91, 0x29, 0xe0, 0x09, 0x58, - 0x20, 0x7a, 0x08, 0x8f, 0x93, 0x25, 0xe1, 0x09, - 0xe8, 0x82, 0xf6, 0x01, 0xa7, 0x80, 0x25, 0x60, - 0x0a, 0x78, 0x02, 0x5e, 0x00, 0x97, 0x80, 0x2d, - 0xe0, 0x0b, 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x0c, 0x40, 0xa3, - 0x00, 0x30, 0x04, 0x0f, 0x20, 0x03, 0x4c, 0x00, - 0xc0, 0x00, 0x32, 0xc8, 0x0b, 0x30, 0x02, 0x24, - 0x40, 0xe3, 0x00, 0x3c, 0xc0, 0x0f, 0x31, 0x02, - 0xec, 0x80, 0x83, 0x10, 0x2c, 0xc4, 0x0e, 0x30, - 0x03, 0xc8, 0x00, 0x53, 0x00, 0x34, 0xc8, 0x0f, - 0x30, 0x03, 0x8c, 0x00, 0xf1, 0x04, 0x3c, 0xc3, - 0x0e, 0x30, 0x03, 0x4c, 0x00, 0xf3, 0x00, 0x3c, - 0xc0, 0x0e, 0x30, 0x03, 0xd2, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x14, 0xbd, 0x90, 0xff, - 0x40, 0x9d, 0x40, 0x0c, 0xe1, 0x03, 0xbd, 0x00, - 0xfc, 0x00, 0x17, 0xc2, 0x0d, 0xf1, 0x8b, 0xfc, - 0x40, 0xbf, 0x50, 0x3f, 0xc0, 0x0f, 0xf0, 0x01, - 0xfc, 0x00, 0xdf, 0x10, 0x3f, 0xc0, 0x0e, 0xf0, - 0x03, 0x58, 0x00, 0xdf, 0x01, 0x3d, 0xc0, 0x0f, - 0xf0, 0x03, 0x7c, 0x00, 0xdf, 0x00, 0x39, 0xc0, - 0x0d, 0xf4, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0xed, 0x09, 0x00, 0x83, 0x01, 0x0f, 0xf0, - 0x03, 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0xac, 0x40, 0xfb, 0xb0, 0x32, 0x80, - 0x0f, 0x08, 0x03, 0x2c, 0x80, 0xf9, 0x00, 0x1e, - 0xd2, 0x0d, 0xb4, 0x83, 0xc8, 0x00, 0xab, 0x51, - 0x3e, 0x40, 0x07, 0xb7, 0x03, 0x8e, 0x00, 0xf9, - 0x80, 0x32, 0xc0, 0x0b, 0x90, 0x03, 0xe8, 0x00, - 0x73, 0x00, 0x32, 0x41, 0x0f, 0xb8, 0x01, 0x2c, - 0x00, 0xd8, 0x00, 0x3e, 0x40, 0x0f, 0xb6, 0x03, - 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0e, 0xb0, - 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc8, 0x98, 0x9c, 0x00, 0xb7, 0x00, 0x21, 0x80, - 0x0b, 0x60, 0x02, 0x9c, 0x80, 0xb4, 0x00, 0x2d, - 0xc8, 0x0b, 0x70, 0x03, 0x9c, 0x00, 0xd7, 0x20, - 0x2d, 0xc0, 0x0b, 0x70, 0x82, 0xdc, 0x00, 0xaf, - 0x00, 0x29, 0xc0, 0x83, 0x50, 0x03, 0x9c, 0x00, - 0xd7, 0x00, 0x2d, 0xc0, 0x0f, 0xf0, 0x02, 0x9c, - 0x00, 0xd7, 0x00, 0x25, 0x40, 0x0b, 0x76, 0x02, - 0xdd, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x9e, 0x80, 0xb3, 0x80, 0x21, 0x20, - 0x0b, 0xf8, 0x02, 0x5e, 0x40, 0xb6, 0x80, 0x2d, - 0xe0, 0x0b, 0x7a, 0x02, 0xbe, 0x00, 0x87, 0x80, - 0x2d, 0xe0, 0x0b, 0x7a, 0x02, 0xfe, 0x00, 0x87, - 0x80, 0x21, 0xe0, 0x09, 0x78, 0x22, 0x5e, 0x00, - 0xb7, 0x80, 0x25, 0x60, 0x59, 0x78, 0x02, 0x3e, - 0x00, 0x85, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, - 0x9e, 0x80, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x78, - 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x04, 0xac, 0x00, 0xb3, 0x00, 0xa0, 0x40, - 0x0b, 0x11, 0x02, 0xcc, 0x00, 0xb2, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0x83, 0x20, 0x93, 0x00, - 0x2c, 0x60, 0x0b, 0x30, 0xed, 0x09, 0x00, 0x84, - 0x01, 0x02, 0x4e, 0x40, 0xa1, 0x80, 0x20, 0xc0, - 0x9b, 0x30, 0x02, 0x2c, 0x10, 0x83, 0x00, 0x2c, - 0xe0, 0x4a, 0x34, 0x02, 0xac, 0x00, 0xb3, 0x00, - 0x6c, 0xe0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xd2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x04, 0xa8, - 0x00, 0xfa, 0x00, 0x31, 0x80, 0x0f, 0xec, 0x03, - 0x68, 0x00, 0xfe, 0x19, 0x3e, 0x80, 0x0d, 0xa0, - 0x23, 0xbb, 0x80, 0xca, 0x00, 0x3f, 0xb8, 0x0f, - 0xa0, 0x43, 0xfb, 0x00, 0xce, 0xc8, 0xb3, 0xa2, - 0x0d, 0xa0, 0x02, 0x7b, 0x00, 0xb6, 0x40, 0x37, - 0xb2, 0x0b, 0xe6, 0x02, 0x3b, 0xc0, 0x4e, 0x40, - 0x3e, 0x88, 0x0f, 0xa0, 0x17, 0xa8, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x1f, 0xa0, 0x03, 0xfa, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x40, 0xa0, - 0x00, 0xf8, 0x04, 0x3e, 0x00, 0x0b, 0x88, 0x03, - 0xa0, 0x00, 0xf8, 0x00, 0x2e, 0x00, 0x0d, 0x80, - 0x03, 0xa0, 0x00, 0xf8, 0x01, 0x3e, 0x20, 0x0f, - 0x84, 0x02, 0xe2, 0x00, 0xe8, 0x80, 0x3e, 0x08, - 0x0f, 0x80, 0x03, 0xe2, 0x40, 0xd8, 0xc0, 0x3a, - 0x20, 0x4f, 0x80, 0x83, 0xe0, 0x00, 0xd8, 0x00, - 0x36, 0x10, 0x0f, 0x00, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xd2, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xa4, - 0x00, 0xc9, 0x00, 0x3e, 0x50, 0x0e, 0x98, 0x03, - 0xc4, 0x00, 0xc9, 0x00, 0x34, 0x41, 0x4c, 0x90, - 0x03, 0xe4, 0x04, 0xe9, 0xc0, 0x3a, 0x40, 0x0e, - 0x90, 0x03, 0xe4, 0x10, 0xe9, 0x00, 0x7c, 0x40, - 0x0f, 0x12, 0x01, 0xa4, 0x00, 0xc9, 0x90, 0x3e, - 0x60, 0x8f, 0x91, 0x03, 0xe4, 0x00, 0xf9, 0x88, - 0x34, 0x68, 0x2c, 0x90, 0x03, 0x24, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xc2, 0xed, - 0x09, 0x00, 0x85, 0x01, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x24, 0x00, 0x89, 0xd0, - 0x2e, 0x40, 0x18, 0x94, 0x03, 0xe4, 0x10, 0x89, - 0x00, 0x2e, 0x40, 0x2d, 0x90, 0x02, 0xe4, 0x00, - 0xd1, 0xa0, 0xbe, 0x40, 0x08, 0x91, 0x02, 0xe4, - 0x08, 0xb9, 0x00, 0x2e, 0x40, 0x08, 0x90, 0x03, - 0xa4, 0x00, 0xa9, 0xa0, 0x22, 0x54, 0x0b, 0x90, - 0x03, 0xa4, 0x00, 0xa9, 0xc0, 0x3a, 0x40, 0x88, - 0x94, 0x0a, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x04, 0xa4, 0x00, 0xb9, 0x08, - 0x2e, 0x40, 0x0b, 0x91, 0x02, 0xe4, 0x02, 0x89, - 0x00, 0x2e, 0x40, 0x00, 0x90, 0x02, 0xc4, 0x00, - 0x89, 0x00, 0x20, 0x40, 0x08, 0x90, 0x02, 0x6c, - 0x00, 0xab, 0x00, 0x26, 0x40, 0x09, 0x90, 0x82, - 0x2c, 0x03, 0x89, 0x00, 0x26, 0x40, 0x0b, 0x90, - 0x02, 0xe4, 0x02, 0xab, 0x60, 0x26, 0x40, 0x48, - 0x9c, 0x42, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x14, 0x05, 0xa0, 0x91, 0x00, - 0x2e, 0x40, 0x09, 0x1c, 0x06, 0x84, 0x00, 0x81, - 0x40, 0x2c, 0x50, 0x49, 0x10, 0x02, 0xc5, 0x00, - 0x91, 0x00, 0x28, 0x50, 0x08, 0x30, 0x02, 0xc5, - 0x00, 0x91, 0x40, 0x2c, 0x50, 0x09, 0x10, 0x02, - 0xc5, 0x01, 0x81, 0x00, 0x20, 0x61, 0x19, 0x14, - 0x02, 0xc5, 0x04, 0x01, 0x00, 0x28, 0x40, 0x08, - 0x10, 0x22, 0x05, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xd8, 0x08, 0x60, 0x80, 0xb8, 0x00, - 0x3e, 0x80, 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xc8, - 0x00, 0x3e, 0x00, 0x0c, 0x80, 0x03, 0xe0, 0x02, - 0xe8, 0x00, 0x22, 0x00, 0x2c, 0x80, 0x03, 0xe0, - 0x00, 0xe8, 0xed, 0x09, 0x00, 0x86, 0x01, 0x02, - 0x2e, 0x00, 0x05, 0x80, 0x02, 0x20, 0x00, 0xc8, - 0x00, 0x36, 0x01, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x16, 0x80, 0x0c, 0x80, 0x43, 0x20, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x95, 0xa4, 0x02, 0x69, 0x40, 0x3f, 0x40, 0x0e, - 0xd0, 0x03, 0xe5, 0x10, 0xff, 0x00, 0x1e, 0x50, - 0x0f, 0x94, 0x37, 0xf4, 0x00, 0xe9, 0x40, 0x37, - 0x40, 0x0b, 0x94, 0x03, 0xf4, 0x00, 0x7d, 0x00, - 0x1f, 0xd0, 0x0e, 0xd4, 0x03, 0xbc, 0x10, 0xfd, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0x94, 0x12, - 0xfd, 0x40, 0x3b, 0x50, 0x0f, 0x94, 0x03, 0xe5, - 0x10, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe7, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x15, 0xe4, 0x00, 0xed, 0x20, 0x3f, 0x41, 0x0c, - 0xd0, 0x53, 0xf4, 0x00, 0xf1, 0x00, 0x3a, 0x4a, - 0x0c, 0x92, 0x03, 0x24, 0x00, 0x7d, 0x00, 0x32, - 0x44, 0x0f, 0xd2, 0x02, 0xe4, 0x00, 0xe9, 0x14, - 0x3e, 0x40, 0x0b, 0xd0, 0x03, 0xe4, 0x40, 0xbd, - 0x00, 0xb3, 0x40, 0x0f, 0xd1, 0x03, 0xe4, 0x00, - 0xcd, 0x04, 0x37, 0x41, 0x0f, 0x52, 0x03, 0x24, - 0xa0, 0xc9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, - 0x00, 0xe0, 0x80, 0x88, 0x11, 0x2e, 0x00, 0x0d, - 0x80, 0x82, 0xe0, 0x40, 0xb8, 0x28, 0x06, 0x08, - 0x08, 0x81, 0x02, 0x20, 0x20, 0xb8, 0x00, 0x62, - 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x84, 0x88, 0x20, - 0x2e, 0x12, 0x0f, 0x80, 0x02, 0xe0, 0x00, 0xb8, - 0x00, 0x32, 0x00, 0x0b, 0x82, 0x42, 0x20, 0x20, - 0xc8, 0x00, 0x2a, 0x04, 0x4b, 0x80, 0x0a, 0x20, - 0x80, 0x88, 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x02, - 0xce, 0x04, 0x30, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x87, 0x01, 0x00, 0x00, 0x68, 0x00, 0x84, 0xe0, - 0xa1, 0x00, 0x2e, 0x40, 0x02, 0x10, 0x02, 0xc4, - 0x00, 0xb1, 0x20, 0x2c, 0x4a, 0x08, 0x10, 0x02, - 0x04, 0x80, 0xb1, 0x10, 0x20, 0x40, 0x0b, 0x11, - 0x02, 0xc4, 0xa2, 0x91, 0x20, 0x2c, 0x4c, 0x0b, - 0x11, 0x02, 0xc4, 0x00, 0xb9, 0x00, 0x20, 0x40, - 0x0b, 0x12, 0x02, 0x44, 0x80, 0x81, 0x90, 0x64, - 0x40, 0x0b, 0x11, 0x06, 0x44, 0xa2, 0x81, 0x00, - 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xb8, 0x14, 0xa4, 0x10, - 0x89, 0x00, 0x2e, 0x50, 0x0b, 0x90, 0x80, 0xe4, - 0x00, 0xb9, 0x00, 0x26, 0x40, 0x48, 0x90, 0x0a, - 0x24, 0x00, 0x9b, 0x00, 0x22, 0x40, 0x0b, 0x90, - 0x02, 0xc4, 0x00, 0x89, 0x08, 0x2e, 0x40, 0x08, - 0x90, 0x02, 0x64, 0x40, 0xb9, 0x00, 0x22, 0x40, - 0x4b, 0x90, 0x02, 0x47, 0x00, 0xa9, 0x20, 0x2e, - 0x41, 0x0b, 0x90, 0x02, 0x64, 0x00, 0x89, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xc6, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x90, 0xa4, 0x00, - 0xe9, 0x00, 0x1c, 0x60, 0x0e, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x10, 0x3a, 0x40, 0x2c, 0x90, 0x02, - 0x25, 0x60, 0xf9, 0x00, 0x22, 0x62, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xd9, 0xc0, 0x3e, 0x50, 0x0b, - 0x99, 0x02, 0xe6, 0x00, 0xf9, 0x81, 0x32, 0x50, - 0x4f, 0x98, 0x23, 0x65, 0x02, 0xc9, 0x40, 0xb6, - 0x40, 0x0f, 0x90, 0x02, 0x64, 0x00, 0xc9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe0, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x00, - 0xf9, 0x04, 0x3e, 0x44, 0x0d, 0x91, 0x13, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe6, 0x00, 0xf9, 0x00, 0xae, 0x45, 0x0f, 0x90, - 0x03, 0x66, 0x48, 0xd9, 0x20, 0x3e, 0x40, 0x0f, - 0xed, 0x09, 0x00, 0x88, 0x01, 0x98, 0x03, 0xe6, - 0x00, 0xd9, 0x48, 0x32, 0x40, 0x0f, 0x9a, 0x03, - 0x24, 0x10, 0xc1, 0x00, 0x3a, 0x50, 0x0f, 0x10, - 0x83, 0x84, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0x10, 0xa0, 0x00, 0xe8, 0x81, 0x3e, - 0x34, 0x07, 0x84, 0x03, 0xe0, 0x00, 0xc8, 0x40, - 0x38, 0x01, 0x0f, 0x00, 0x03, 0xe0, 0x00, 0xf0, - 0x08, 0x3e, 0x10, 0x0c, 0x88, 0x02, 0xa0, 0x00, - 0xf8, 0x44, 0x3e, 0x10, 0x07, 0x88, 0x43, 0xe0, - 0x18, 0xf8, 0x11, 0x32, 0x1c, 0x2f, 0x84, 0x13, - 0xe0, 0x08, 0xf8, 0x80, 0x16, 0x00, 0x0f, 0x81, - 0x03, 0x60, 0x00, 0xe8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x28, 0x00, 0x8e, 0x42, 0x2f, - 0xb0, 0x09, 0xed, 0x01, 0xe8, 0x80, 0x8a, 0x00, - 0x22, 0x80, 0x0b, 0xa0, 0x02, 0xe8, 0x00, 0xee, - 0x80, 0x3e, 0x80, 0x08, 0xe4, 0x03, 0x68, 0x00, - 0xba, 0x00, 0x26, 0x80, 0x0b, 0xe4, 0x03, 0xa8, - 0x08, 0xb6, 0x40, 0x3b, 0xb0, 0x08, 0xa0, 0x02, - 0xe8, 0x04, 0xee, 0xe0, 0x2b, 0xb4, 0x0b, 0xe8, - 0x03, 0x68, 0x00, 0x8a, 0x00, 0x2e, 0x80, 0x0b, - 0xa0, 0x02, 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x0c, 0x00, 0xa1, 0x80, 0x2c, - 0x40, 0x83, 0x34, 0x02, 0xc4, 0x0c, 0x83, 0x00, - 0x08, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xa0, - 0x00, 0x24, 0xc0, 0x29, 0x18, 0x02, 0x0c, 0x00, - 0x33, 0x00, 0x24, 0xc0, 0x1b, 0x38, 0x00, 0xcc, - 0x00, 0xb3, 0xc0, 0xac, 0xc0, 0x0b, 0xb0, 0x42, - 0xcc, 0x00, 0xa3, 0x00, 0x20, 0xd4, 0x0b, 0x2c, - 0x02, 0x0c, 0x00, 0xa3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0xed, 0x09, 0x00, 0x89, 0x01, - 0x1c, 0x80, 0x87, 0x0a, 0x2d, 0xc0, 0x0b, 0x74, - 0x02, 0x96, 0x00, 0x8f, 0x80, 0x21, 0xc0, 0x09, - 0x70, 0x02, 0xdc, 0x01, 0xa7, 0x0a, 0x29, 0xe0, - 0x09, 0x3c, 0x02, 0x5c, 0x80, 0xb7, 0x10, 0x25, - 0xc0, 0x0b, 0x70, 0x82, 0xdc, 0x80, 0xbf, 0x00, - 0x23, 0xe0, 0x28, 0x50, 0x12, 0xfc, 0x80, 0xaf, - 0x00, 0x69, 0xc0, 0x0b, 0x70, 0x02, 0x5c, 0xc8, - 0x87, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xe8, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x98, - 0x0e, 0x00, 0xe5, 0x80, 0x3d, 0x60, 0x0b, 0x78, - 0x12, 0xc6, 0x02, 0xc7, 0xe8, 0x29, 0xfa, 0x07, - 0x78, 0x03, 0xdf, 0x80, 0xe7, 0x82, 0x2f, 0xe8, - 0x0d, 0x58, 0x0a, 0x9f, 0x20, 0xf7, 0xa8, 0x3d, - 0xe4, 0x0b, 0x78, 0x03, 0xde, 0x80, 0xf7, 0x81, - 0x25, 0xe0, 0x0f, 0x78, 0x03, 0xdf, 0xa0, 0xe7, - 0x81, 0x31, 0xe0, 0x0f, 0x78, 0x03, 0x3e, 0x00, - 0xe7, 0x80, 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0xea, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x1d, - 0xac, 0x28, 0xf9, 0x04, 0x3e, 0x40, 0x05, 0xa0, - 0x03, 0xe4, 0x00, 0xfb, 0x40, 0x36, 0xd0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0x6a, 0x00, 0x3e, 0xd1, - 0x0e, 0x90, 0x03, 0xad, 0x08, 0x7b, 0x40, 0x36, - 0xc0, 0x0b, 0xb0, 0x03, 0xad, 0x40, 0xf3, 0x00, - 0x3c, 0xc0, 0x0f, 0x90, 0x03, 0xcd, 0x00, 0xc3, - 0x00, 0xb2, 0x40, 0x0f, 0x90, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0x42, - 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x0d, - 0xbe, 0x20, 0xae, 0x94, 0x3f, 0x21, 0x0c, 0xf8, - 0x03, 0xd6, 0x00, 0xcf, 0x80, 0x1f, 0xe0, 0x0d, - 0xf8, 0x47, 0xfd, 0x40, 0xef, 0x90, 0x3f, 0xf2, - 0x07, 0xc8, 0x41, 0xbe, 0x40, 0xff, 0x90, 0x3f, - 0xe2, 0x0f, 0xf8, 0x03, 0xff, 0x00, 0xed, 0x09, - 0x00, 0x8a, 0x01, 0xdf, 0x80, 0x3f, 0xe0, 0x0f, - 0xf8, 0x03, 0xfe, 0x08, 0xcf, 0x80, 0x37, 0xe0, - 0x0f, 0xf8, 0x03, 0x7e, 0x00, 0xff, 0x84, 0x3f, - 0xe0, 0x0f, 0xf8, 0x03, 0xc0, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xa9, 0x00, 0x9c, 0x00, 0x84, - 0x10, 0x2d, 0x00, 0x0f, 0x64, 0x02, 0xd4, 0x00, - 0x87, 0x10, 0x25, 0xc0, 0x08, 0x70, 0x06, 0xdc, - 0x00, 0x87, 0x10, 0x2d, 0xc2, 0x0b, 0x60, 0x0b, - 0x5c, 0x40, 0x97, 0x08, 0x2d, 0xc4, 0x0b, 0x70, - 0x02, 0xdc, 0x20, 0x97, 0x00, 0x2d, 0xc0, 0x0b, - 0x50, 0x02, 0xdc, 0x00, 0xa7, 0x0a, 0x2d, 0x84, - 0x03, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xea, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xb8, 0x00, 0x9c, 0x00, 0xb4, - 0x10, 0x2f, 0x00, 0x08, 0x70, 0x02, 0xd4, 0x00, - 0x87, 0x00, 0x24, 0xc0, 0x08, 0x70, 0x02, 0xfc, - 0x40, 0xa5, 0x10, 0x65, 0xc0, 0x0b, 0x50, 0x02, - 0x1c, 0x10, 0xb7, 0x00, 0x2d, 0xd0, 0x09, 0x70, - 0x02, 0x5c, 0x00, 0xb7, 0x08, 0x2d, 0xc0, 0x0a, - 0x70, 0x02, 0xdc, 0x00, 0xa6, 0x10, 0x2d, 0xc0, - 0x0b, 0x60, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0x40, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x42, 0x04, 0x8c, 0x00, 0x90, - 0x00, 0x2c, 0x53, 0x0b, 0xb0, 0x02, 0xc4, 0x00, - 0x83, 0x00, 0x24, 0xc0, 0x09, 0x30, 0x02, 0xcd, - 0x00, 0x83, 0x00, 0x4c, 0xe0, 0x0b, 0x10, 0x02, - 0x8f, 0x40, 0xb3, 0x80, 0x2c, 0xe0, 0x0b, 0x30, - 0x12, 0xcd, 0x80, 0xb3, 0x84, 0x6c, 0xd0, 0x0b, - 0x10, 0x02, 0xcc, 0x00, 0xa2, 0x21, 0x2c, 0x00, - 0x0b, 0x10, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xc8, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x82, 0x05, 0xbc, 0x00, 0xf9, - 0x00, 0xed, 0x09, 0x00, 0x8b, 0x01, 0x3e, 0xc1, - 0x0c, 0xb2, 0x03, 0xc4, 0x02, 0xc7, 0x40, 0x37, - 0xc0, 0x0d, 0xb0, 0x02, 0xfd, 0x00, 0x6b, 0x05, - 0x75, 0xf4, 0x4b, 0xa0, 0x02, 0x3c, 0x00, 0xb7, - 0x00, 0x3f, 0xe9, 0x0d, 0xb0, 0x06, 0x7d, 0x00, - 0xdb, 0x82, 0x3c, 0xf8, 0x0e, 0xbc, 0x92, 0xfc, - 0x08, 0xc3, 0x80, 0x36, 0xc0, 0x0f, 0x30, 0x03, - 0x7c, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0xac, 0x00, 0xe9, 0x40, 0x3e, 0x40, - 0x0d, 0x84, 0x23, 0xec, 0x00, 0xfb, 0x20, 0x36, - 0xc0, 0x0e, 0xb0, 0x23, 0xec, 0x40, 0xf9, 0x42, - 0x3e, 0xc0, 0x0f, 0xa0, 0x02, 0x6c, 0x00, 0xdb, - 0x09, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xdb, 0x40, 0x3e, 0xc2, 0x0f, 0x90, 0x03, 0x6c, - 0x92, 0xda, 0x00, 0x2e, 0xc0, 0x0f, 0xa0, 0x03, - 0xec, 0x00, 0xbb, 0x00, 0x36, 0xc0, 0x0f, 0xb0, - 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x81, 0x00, 0xac, 0x00, 0x8d, 0x80, 0x33, 0x45, - 0x0e, 0xd1, 0x02, 0x74, 0x40, 0xcf, 0x00, 0x33, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x20, 0xf7, 0x01, - 0x37, 0xc0, 0x0c, 0xda, 0x03, 0xfc, 0x21, 0xff, - 0x00, 0x73, 0xc0, 0x05, 0xf2, 0x03, 0xfc, 0x00, - 0xff, 0x80, 0x33, 0xc0, 0x0d, 0xf2, 0x81, 0xbc, - 0x04, 0xcf, 0x02, 0x3b, 0x80, 0x2c, 0xf8, 0x03, - 0xbc, 0x00, 0xff, 0x01, 0x3f, 0xc1, 0x0d, 0xf0, - 0x03, 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xc1, 0x90, 0x2c, 0x00, 0x81, 0xd8, 0x28, 0x40, - 0x0a, 0xbc, 0x03, 0x2c, 0x00, 0x8b, 0x00, 0x2a, - 0xc0, 0x09, 0xb0, 0x02, 0xec, 0x00, 0x9b, 0xc0, - 0x22, 0xc0, 0x0a, 0xb0, 0x22, 0x6c, 0x00, 0xcb, - 0x00, 0x22, 0xc0, 0x0b, 0xb4, 0x02, 0xec, 0x00, - 0xb3, 0x18, 0x36, 0x11, 0xed, 0x09, 0x00, 0x8c, - 0x01, 0x8f, 0x38, 0x03, 0x4c, 0x00, 0x8a, 0x4a, - 0x20, 0x24, 0x08, 0x99, 0x02, 0x2c, 0x10, 0x9b, - 0x00, 0x0e, 0xc0, 0x4b, 0xb0, 0x02, 0xe0, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x0c, - 0x01, 0x88, 0x01, 0x22, 0x00, 0x08, 0x90, 0x02, - 0x6c, 0x00, 0x8b, 0x00, 0x22, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x10, 0xba, 0x20, 0x22, 0xc0, 0x48, - 0x80, 0x12, 0xec, 0x00, 0xbb, 0x00, 0x22, 0xc0, - 0x0b, 0xb4, 0x02, 0xec, 0x00, 0x9b, 0x00, 0x2a, - 0xe2, 0x08, 0xb0, 0x00, 0x2c, 0x00, 0x99, 0x80, - 0x22, 0x50, 0x4a, 0x90, 0x82, 0xac, 0x00, 0xbb, - 0x00, 0x26, 0xc0, 0x09, 0xb0, 0x02, 0xe0, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x04, 0x0c, - 0x00, 0xa1, 0x00, 0x28, 0x60, 0x0a, 0x30, 0x02, - 0x04, 0x00, 0x8b, 0x00, 0x28, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0x93, 0x00, 0x62, 0xc0, 0x08, - 0x28, 0x02, 0x4c, 0x10, 0x8b, 0x00, 0x20, 0xc0, - 0x09, 0x30, 0x02, 0x4c, 0x14, 0x93, 0x00, 0x24, - 0xc0, 0x8b, 0x90, 0x42, 0x6c, 0x00, 0x90, 0x00, - 0x20, 0x00, 0x0a, 0x10, 0x02, 0x0c, 0x00, 0x93, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc2, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7c, - 0x00, 0xc9, 0x00, 0x32, 0x00, 0x0e, 0xb0, 0x03, - 0x6c, 0x02, 0xcf, 0x00, 0x33, 0xc0, 0x0b, 0xb0, - 0x03, 0xfc, 0x00, 0xfb, 0x00, 0x37, 0xc0, 0x0c, - 0x80, 0x02, 0xfc, 0x01, 0xbf, 0x00, 0xa3, 0xc0, - 0x0d, 0xb0, 0x03, 0xfc, 0x00, 0xd9, 0x00, 0x3a, - 0xc0, 0x0c, 0xb0, 0x13, 0x1c, 0x02, 0x5a, 0x00, - 0x1a, 0x00, 0x0c, 0x90, 0x03, 0xac, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0d, 0xb0, 0x07, 0xc0, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x80, 0x95, 0xbc, - 0x02, 0xdc, 0x00, 0x3d, 0x00, 0x0b, 0xc0, 0xed, - 0x09, 0x00, 0x8d, 0x01, 0x4b, 0xb4, 0x00, 0xff, - 0x04, 0x3f, 0xc0, 0x0d, 0xf0, 0x03, 0xdc, 0x04, - 0xbc, 0x00, 0x3f, 0xc0, 0x1f, 0x40, 0x03, 0xfc, - 0x00, 0xef, 0x00, 0x37, 0xc0, 0x0f, 0xc0, 0x23, - 0xfc, 0x04, 0xfc, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x07, 0x7c, 0x00, 0xee, 0x01, 0x3f, 0x00, 0x05, - 0xc0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xe8, 0x02, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x05, 0xf0, 0x00, 0xde, 0x00, - 0x37, 0x04, 0x0c, 0xc1, 0x83, 0x70, 0x00, 0xcf, - 0x60, 0xbf, 0xc8, 0x2e, 0xf0, 0x03, 0x14, 0x08, - 0xfe, 0x00, 0x3f, 0x40, 0x0f, 0xc0, 0x03, 0xf0, - 0x00, 0xb4, 0x00, 0x3f, 0x00, 0x0b, 0xe0, 0x03, - 0xf0, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf1, - 0x03, 0xf0, 0x20, 0xcc, 0x00, 0x33, 0x10, 0x8c, - 0xc0, 0x83, 0x30, 0x40, 0xcc, 0x20, 0xb7, 0x18, - 0x0c, 0xc3, 0x03, 0xf0, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x10, 0xe0, 0x00, 0xb9, 0x00, - 0x2c, 0x80, 0x88, 0xa6, 0x02, 0xa1, 0x00, 0xaf, - 0x30, 0x23, 0xd4, 0x08, 0xb0, 0x02, 0x2c, 0x00, - 0xba, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe4, - 0x00, 0xb8, 0x00, 0x2e, 0xc0, 0x8b, 0xb0, 0x02, - 0xec, 0x10, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb2, - 0x03, 0x81, 0x20, 0x81, 0x68, 0x20, 0x01, 0x08, - 0x86, 0xc2, 0x2d, 0x40, 0x8b, 0x72, 0x22, 0x04, - 0x08, 0x01, 0x02, 0xf0, 0x02, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x88, 0x05, 0xc8, 0x00, 0xb1, 0x02, - 0x24, 0x00, 0x08, 0x00, 0x02, 0x41, 0x00, 0x83, - 0x00, 0x2c, 0xc0, 0x2a, 0x30, 0x52, 0x0c, 0x00, - 0xb0, 0x00, 0x2c, 0x80, 0x0b, 0x00, 0x02, 0xc4, - 0x01, 0x90, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x12, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xc4, 0xed, 0x09, 0x00, 0x8e, 0x01, 0x80, - 0x90, 0x40, 0x20, 0x50, 0x49, 0x00, 0x06, 0x00, - 0x80, 0x80, 0x09, 0x60, 0x08, 0xa8, 0x02, 0x02, - 0xf2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x15, 0xa9, 0x00, 0xba, 0x40, 0x2e, 0x00, 0x08, - 0x81, 0x08, 0xa2, 0x00, 0xab, 0x00, 0x22, 0xc0, - 0x28, 0xa0, 0x02, 0x2c, 0x30, 0x3b, 0x00, 0x2e, - 0xc0, 0x0b, 0xb8, 0x82, 0xe0, 0x60, 0xb8, 0x54, - 0x2e, 0xd0, 0x0b, 0xb2, 0x00, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x12, 0xac, 0x01, - 0x99, 0x00, 0x22, 0xc6, 0x09, 0xa0, 0x06, 0x28, - 0x00, 0x8b, 0x00, 0x60, 0x48, 0x08, 0xa1, 0x02, - 0xf0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x15, 0xe1, 0x40, 0xdb, 0x40, 0x36, 0xc0, 0x4c, - 0xac, 0x21, 0x67, 0x20, 0x4b, 0x00, 0x3e, 0xc0, - 0x4e, 0xb4, 0x03, 0x24, 0x40, 0xba, 0x80, 0x1e, - 0xc8, 0x0f, 0xb4, 0x03, 0xe4, 0x00, 0xf8, 0x42, - 0x3e, 0xc0, 0x0b, 0xb4, 0x01, 0xe9, 0x80, 0xfb, - 0x04, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xe1, 0x80, - 0xd8, 0x64, 0x32, 0x10, 0x0d, 0x89, 0x03, 0x20, - 0x00, 0xc8, 0xa0, 0x36, 0x28, 0x0c, 0x8a, 0x03, - 0xd1, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x01, 0xb4, 0x00, 0xfc, 0x00, 0x3f, 0xe8, 0x2f, - 0x60, 0x4b, 0xc4, 0x30, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf4, 0x00, 0xfc, 0x00, 0xff, 0xc0, 0x3f, - 0xc4, 0x0f, 0xf0, 0x01, 0xf4, 0x00, 0xfe, 0x80, - 0x3f, 0xe4, 0x0f, 0xf8, 0x43, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x43, 0xb2, 0x40, - 0xed, 0xa4, 0x3f, 0x00, 0x4e, 0xd0, 0x3b, 0xee, - 0x42, 0xf8, 0x94, 0x3f, 0xe1, 0x4f, 0xf0, 0x03, - 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x10, 0xa9, 0x00, 0xc8, 0x50, 0x3e, 0x50, 0x0e, - 0xa4, 0x33, 0xe6, 0x00, 0xeb, 0xed, 0x09, 0x00, - 0x8f, 0x01, 0x00, 0x3c, 0xc8, 0x0c, 0xb4, 0x03, - 0xed, 0x00, 0xca, 0x80, 0x36, 0xd2, 0x0f, 0xb0, - 0x03, 0xe5, 0x00, 0xca, 0x00, 0x3a, 0xd0, 0x0f, - 0xb3, 0x03, 0xec, 0x20, 0xfb, 0x00, 0x3e, 0xc0, - 0x0d, 0xb0, 0x03, 0x24, 0x00, 0xc2, 0x00, 0x32, - 0x44, 0x0c, 0xb0, 0x03, 0xe0, 0x00, 0xc0, 0x10, - 0x32, 0x80, 0x0c, 0x90, 0x03, 0x10, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0x28, 0x04, - 0xab, 0xc0, 0x2e, 0x40, 0x2a, 0xa0, 0x02, 0xe5, - 0x00, 0x8f, 0x00, 0x2f, 0xd0, 0x0a, 0x38, 0x82, - 0xef, 0x40, 0x8b, 0x10, 0x22, 0xd3, 0x0b, 0xb4, - 0x22, 0xe4, 0x90, 0x8a, 0x24, 0x22, 0xf0, 0x8b, - 0xb0, 0x02, 0xef, 0x20, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0x2e, 0x00, 0x8b, 0x0a, 0x22, - 0xc0, 0x0d, 0xb5, 0x22, 0xe9, 0x00, 0xa8, 0xd4, - 0x32, 0xe4, 0x88, 0xb0, 0x0a, 0x36, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x40, 0x00, - 0x83, 0x86, 0x2e, 0x00, 0x08, 0x20, 0x42, 0xc0, - 0x08, 0xab, 0x48, 0x2c, 0xc4, 0x08, 0x38, 0x02, - 0xcb, 0x02, 0x22, 0x00, 0x2c, 0xe0, 0x0b, 0x32, - 0x02, 0xc4, 0x01, 0x90, 0x81, 0x28, 0xe0, 0x0b, - 0x38, 0x02, 0xc3, 0x00, 0x33, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0x28, 0x00, 0x82, 0x80, 0x22, - 0xa2, 0x18, 0x8c, 0x06, 0xe0, 0x20, 0x80, 0xc1, - 0x20, 0x00, 0x08, 0x01, 0x02, 0x38, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x32, 0x00, - 0xa5, 0xc0, 0x2d, 0xa4, 0x2a, 0x78, 0x02, 0xda, - 0x00, 0xa7, 0x80, 0x2d, 0xe0, 0x0a, 0x78, 0x02, - 0xde, 0x20, 0xaf, 0x80, 0x21, 0xe0, 0x0b, 0x69, - 0x42, 0xf6, 0x0a, 0x14, 0x80, 0x21, 0x70, 0x0b, - 0x78, 0x02, 0xda, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x03, 0x78, 0x02, 0x1e, 0x60, 0x96, 0x86, 0x21, - 0xed, 0x09, 0x00, 0x90, 0x01, 0x60, 0x09, 0x78, - 0x96, 0xd6, 0x00, 0xa7, 0x90, 0x21, 0xa0, 0x08, - 0x5c, 0x02, 0x28, 0x04, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x08, 0x00, 0x00, 0xc1, 0x30, 0x3c, - 0x00, 0x2e, 0x20, 0x03, 0xc0, 0x00, 0xe3, 0x11, - 0x3c, 0xc8, 0x1c, 0x30, 0x07, 0xc4, 0x00, 0xe2, - 0x00, 0x3c, 0xc0, 0x4f, 0x30, 0x03, 0xc4, 0x00, - 0xd0, 0x00, 0x38, 0xc2, 0x0f, 0x34, 0x03, 0xcc, - 0x00, 0xb3, 0x00, 0x3c, 0xc0, 0x0d, 0xb0, 0x02, - 0x00, 0x40, 0xc3, 0x20, 0x30, 0x80, 0x0c, 0x14, - 0x03, 0xc4, 0x20, 0xc0, 0x10, 0x32, 0xc6, 0x0c, - 0x33, 0x03, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x1d, 0x90, 0x40, 0x7f, 0x10, 0x1f, - 0x80, 0x0f, 0xf0, 0x03, 0xf8, 0x00, 0xdf, 0x00, - 0x3d, 0xc2, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xd7, - 0x00, 0x3f, 0xc4, 0x0f, 0xe0, 0x43, 0xd4, 0x40, - 0xec, 0x00, 0x3f, 0xc4, 0x0f, 0xd0, 0x03, 0xfc, - 0x00, 0xff, 0x10, 0x3f, 0xc4, 0x4f, 0xf0, 0x03, - 0xfc, 0x40, 0xef, 0x00, 0x3f, 0xc0, 0x0e, 0xf0, - 0x03, 0xf4, 0x01, 0xff, 0x14, 0x3f, 0xc0, 0x0f, - 0xf1, 0x03, 0xd0, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x05, 0xe0, 0x00, 0xfa, 0x00, 0x3e, - 0xc0, 0x0c, 0xa0, 0x03, 0x68, 0x00, 0xcb, 0x30, - 0x3e, 0xd2, 0x0e, 0xb0, 0x03, 0xec, 0x00, 0xfa, - 0x00, 0x3e, 0x40, 0x0b, 0x98, 0x21, 0xa0, 0x00, - 0xfa, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x08, 0xfb, 0x00, 0x1a, 0xc0, 0x0f, 0xb8, 0x03, - 0x28, 0x00, 0xc8, 0x01, 0x3e, 0xc0, 0x8f, 0xa0, - 0x03, 0xe8, 0x04, 0xfb, 0x02, 0x32, 0x40, 0x0f, - 0xa0, 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x11, 0x90, 0x00, 0xb5, 0x00, 0x2f, - 0xc0, 0x0d, 0x60, 0x02, 0x1c, 0x00, 0xa7, 0x28, - 0x2d, 0xc8, 0x2d, 0xed, 0x09, 0x00, 0x91, 0x01, - 0x50, 0x22, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x03, 0x54, 0x00, 0xb6, 0x01, 0x2d, - 0xc0, 0x8b, 0x70, 0x22, 0xdc, 0x00, 0xb7, 0x00, - 0x25, 0xc0, 0x0b, 0xf0, 0x0a, 0x1c, 0x08, 0x04, - 0x00, 0x2d, 0x40, 0x4e, 0x70, 0x02, 0xdc, 0x11, - 0xb3, 0x01, 0x21, 0xc0, 0x09, 0x70, 0x02, 0xf2, - 0x24, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, - 0x92, 0x00, 0xb5, 0x80, 0x2d, 0xa0, 0x08, 0x28, - 0x02, 0x4e, 0x00, 0x87, 0x80, 0x2c, 0xe8, 0x2a, - 0x78, 0x82, 0xd6, 0x00, 0xb6, 0x80, 0x2d, 0xe2, - 0x0b, 0x58, 0x12, 0x96, 0x00, 0x96, 0x80, 0x2d, - 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x22, 0x12, 0x02, 0x87, - 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, - 0xb7, 0xc4, 0x29, 0xe0, 0x0b, 0x78, 0x02, 0xe0, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, - 0xc0, 0x00, 0xb2, 0x01, 0x2e, 0xe0, 0x09, 0xbd, - 0x02, 0x0e, 0x08, 0xa3, 0x00, 0x2c, 0xc0, 0xa9, - 0x1e, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x6c, 0xc0, - 0x0b, 0x38, 0x02, 0x4a, 0x20, 0xb3, 0x80, 0x2c, - 0xc0, 0x0b, 0x31, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x24, 0xc0, 0x0b, 0x30, 0x02, 0x0c, 0x00, 0x83, - 0x80, 0x2c, 0xd0, 0x0a, 0x36, 0x02, 0xee, 0x40, - 0xb3, 0xc0, 0x28, 0xc5, 0x09, 0x3c, 0x42, 0xf2, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, - 0xb9, 0x00, 0xfe, 0x40, 0x3f, 0x98, 0x0c, 0xec, - 0x03, 0x7a, 0x80, 0xca, 0x00, 0x3e, 0x80, 0x6e, - 0xe4, 0x03, 0xf9, 0x00, 0xfe, 0x4a, 0x2f, 0x90, - 0x8f, 0xee, 0x23, 0xbb, 0x00, 0xf6, 0xc0, 0x3f, - 0x90, 0x0f, 0xec, 0x03, 0xfb, 0x80, 0xfa, 0x00, - 0x7a, 0x80, 0x0f, 0xa0, 0x03, 0x38, 0x00, 0xce, - 0x80, 0x1f, 0x80, 0x0f, 0xe4, 0x03, 0xed, 0x09, - 0x00, 0x92, 0x01, 0xfa, 0x00, 0xbe, 0xc0, 0xbb, - 0xb0, 0x0f, 0xe4, 0x83, 0xfa, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0xe2, 0x00, 0xf8, - 0x80, 0x3e, 0x20, 0x8f, 0x80, 0x2b, 0xe3, 0x00, - 0xf8, 0x40, 0x3e, 0x00, 0x2f, 0x80, 0x03, 0xe3, - 0x00, 0xf8, 0xc0, 0x3e, 0x30, 0x0f, 0x88, 0x07, - 0xa0, 0x40, 0xf8, 0x90, 0x3e, 0x20, 0x0f, 0x8c, - 0x03, 0xe2, 0x00, 0xf8, 0x00, 0x76, 0x00, 0x0f, - 0x84, 0x03, 0xc0, 0x00, 0xf0, 0x50, 0x3c, 0x02, - 0x0e, 0x84, 0x03, 0xe0, 0x10, 0xf8, 0x20, 0x36, - 0x02, 0x0d, 0x84, 0x83, 0xd2, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, 0x10, 0xf9, - 0x22, 0x3e, 0x40, 0x0c, 0x90, 0x83, 0x85, 0x00, - 0xc1, 0x40, 0xbe, 0x40, 0x0d, 0x9a, 0x07, 0xe6, - 0x00, 0xf9, 0x00, 0x3e, 0x44, 0x8f, 0x98, 0x03, - 0xe4, 0x80, 0xd9, 0xa0, 0x32, 0x51, 0x06, 0x90, - 0x01, 0x66, 0x80, 0xf9, 0x01, 0x3e, 0x40, 0x0f, - 0x98, 0x03, 0xe4, 0x04, 0xe9, 0x80, 0x32, 0x60, - 0x0c, 0x1c, 0x03, 0x24, 0x00, 0xc1, 0x00, 0x32, - 0x44, 0x0f, 0x90, 0x43, 0xc2, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x44, 0x64, 0x00, 0xb9, - 0xc0, 0x2e, 0x40, 0x08, 0x90, 0x02, 0x26, 0x20, - 0x89, 0x00, 0xa8, 0x70, 0x08, 0x9c, 0x42, 0xe5, - 0xc8, 0xb9, 0x60, 0x26, 0x78, 0x8b, 0x90, 0x02, - 0x44, 0x08, 0xa9, 0xc0, 0x34, 0x60, 0x28, 0x90, - 0x92, 0xe7, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x98, 0x02, 0xe6, 0x00, 0x89, 0x40, 0x22, 0x74, - 0x08, 0x90, 0x02, 0x24, 0x00, 0x89, 0x40, 0x22, - 0x60, 0x0b, 0x94, 0x02, 0xe0, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, 0x00, 0xb9, - 0x00, 0x2e, 0xc0, 0x08, 0xb0, 0x02, 0xa4, 0x00, - 0x89, 0x00, 0xae, 0x4b, 0xc9, 0xb0, 0x82, 0xe4, - 0x01, 0xed, 0x09, 0x00, 0x93, 0x01, 0xbb, 0x80, - 0x2e, 0x40, 0x0b, 0x91, 0x82, 0xa4, 0x00, 0x89, - 0x40, 0x26, 0x50, 0x08, 0x90, 0x02, 0x64, 0x20, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x91, 0x02, 0xe4, - 0x40, 0xa9, 0x10, 0x22, 0x50, 0x08, 0x90, 0x02, - 0x2c, 0x00, 0x89, 0x20, 0x26, 0x40, 0x0b, 0x98, - 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x04, 0x00, 0xb1, 0xc0, 0x2c, 0xd0, - 0x28, 0x14, 0x12, 0x04, 0x02, 0x83, 0x40, 0x28, - 0x40, 0x08, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, - 0x24, 0x41, 0x0b, 0x10, 0x02, 0xe4, 0x00, 0x29, - 0x02, 0x24, 0x40, 0x0a, 0x10, 0x16, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x14, 0x02, 0xcd, - 0x00, 0x81, 0x40, 0xa0, 0x50, 0x28, 0x34, 0x42, - 0x05, 0x00, 0x83, 0x40, 0xa4, 0x50, 0x0b, 0x34, - 0x42, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb8, 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0c, 0x80, 0x03, 0xa0, 0x00, 0xc8, 0x00, 0x3e, - 0x00, 0x0d, 0x80, 0x12, 0xe0, 0x00, 0xf8, 0x01, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xd8, - 0x00, 0x36, 0x00, 0x0c, 0x80, 0x03, 0x60, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0xa0, 0x03, 0xc0, - 0x00, 0xea, 0x00, 0x32, 0x00, 0x0c, 0x80, 0x0b, - 0x28, 0x02, 0xc8, 0x00, 0x36, 0x00, 0x0f, 0x80, - 0x03, 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x98, 0x1d, 0xfc, 0x00, 0xfd, 0x00, 0x0f, 0x40, - 0x0f, 0xd4, 0x03, 0xf5, 0x00, 0xf9, 0x42, 0xbe, - 0x50, 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xfd, 0x01, - 0x3f, 0x40, 0x0f, 0x50, 0x23, 0x74, 0x00, 0xfd, - 0x06, 0x3f, 0xc0, 0x0d, 0xd0, 0x03, 0xfc, 0x00, - 0xf9, 0x01, 0x3e, 0x40, 0x0f, 0x90, 0x13, 0xfd, - 0x00, 0xfd, 0x40, 0x3f, 0x50, 0x0f, 0xd4, 0x03, - 0xf5, 0x01, 0xfd, 0x40, 0xed, 0x09, 0x00, 0x94, - 0x01, 0x3b, 0x50, 0x8f, 0xd4, 0x03, 0xe6, 0x26, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, - 0x18, 0xfd, 0x03, 0x3f, 0x41, 0x2c, 0x91, 0x03, - 0x74, 0x98, 0xc5, 0x28, 0x33, 0x48, 0x2c, 0xd0, - 0x03, 0x74, 0x00, 0xf5, 0x00, 0x3f, 0x40, 0x0c, - 0xd0, 0x03, 0xf4, 0x00, 0x8d, 0x00, 0x3f, 0xc0, - 0x0b, 0xd0, 0x0b, 0x34, 0x00, 0xf9, 0x00, 0x2e, - 0x40, 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xed, 0x10, - 0xb3, 0x48, 0x0c, 0xf2, 0xc3, 0x74, 0xc6, 0xcd, - 0x04, 0x3b, 0x40, 0x0c, 0xd1, 0x03, 0x06, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, - 0x00, 0xb8, 0x08, 0x2e, 0x02, 0x08, 0x81, 0x42, - 0x20, 0x00, 0x88, 0x22, 0x22, 0x04, 0x28, 0x80, - 0x02, 0x20, 0x00, 0xb8, 0x00, 0x2e, 0x80, 0x08, - 0x80, 0x02, 0xe0, 0x00, 0x8a, 0x00, 0x2e, 0x00, - 0x0b, 0x80, 0x02, 0x20, 0x04, 0xb8, 0x00, 0x2e, - 0x00, 0x0b, 0x00, 0x82, 0xe0, 0x20, 0x8a, 0x12, - 0x22, 0x0a, 0x28, 0x02, 0x02, 0x08, 0xc8, 0x80, - 0x48, 0x2e, 0x02, 0x08, 0x81, 0x02, 0x0e, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, - 0x00, 0xb1, 0x20, 0x2c, 0x60, 0x28, 0x10, 0x22, - 0xc6, 0x40, 0x81, 0x28, 0x20, 0x40, 0x28, 0x90, - 0x02, 0x04, 0x00, 0xb1, 0x80, 0x2c, 0x40, 0x08, - 0x10, 0x02, 0xcc, 0x00, 0x81, 0x01, 0x2c, 0x40, - 0x0b, 0x10, 0x12, 0x04, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x0b, 0x12, 0x62, 0xc4, 0x40, 0x81, 0x00, - 0x20, 0x4c, 0x09, 0x12, 0x82, 0xc4, 0x80, 0x91, - 0x30, 0x2c, 0x44, 0x18, 0x38, 0x02, 0x12, 0x01, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, - 0x00, 0xb9, 0x41, 0x2c, 0x40, 0x08, 0x96, 0x22, - 0xa4, 0x00, 0x8b, 0x00, 0x22, 0x40, 0x28, 0x94, - 0x0a, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x60, 0xed, - 0x09, 0x00, 0x95, 0x01, 0x28, 0x90, 0x06, 0xe6, - 0x0a, 0xa9, 0x81, 0x2e, 0x44, 0x0b, 0x90, 0x80, - 0x24, 0x10, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x22, 0xe4, 0x41, 0xa9, 0x20, 0x22, 0x48, 0x09, - 0x12, 0x00, 0xa4, 0x00, 0x99, 0x00, 0x2c, 0x48, - 0x08, 0xb8, 0x02, 0x06, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x15, 0xe7, 0x00, 0xf9, 0xc0, - 0x3e, 0x44, 0x0c, 0x90, 0x03, 0xe5, 0x02, 0xc9, - 0x00, 0xb2, 0x40, 0x8c, 0x90, 0x03, 0x27, 0x20, - 0xb9, 0xc0, 0x3c, 0x70, 0x0c, 0x90, 0x43, 0xe4, - 0x80, 0xc9, 0xc0, 0x3e, 0x60, 0x1f, 0x90, 0x03, - 0x25, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe7, 0x02, 0xc9, 0x42, 0x32, 0x52, 0x0d, - 0x9e, 0x03, 0xe4, 0x00, 0xd9, 0x00, 0x3a, 0x48, - 0x2c, 0x90, 0x0b, 0x28, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x01, 0xa5, 0x00, 0xf9, 0x10, - 0x3e, 0x62, 0x0f, 0x90, 0x03, 0x44, 0x00, 0xf9, - 0x08, 0x3e, 0x42, 0x2b, 0x90, 0x03, 0xa4, 0x60, - 0xf9, 0x90, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x08, 0xd9, 0x00, 0x3e, 0x40, 0x0f, 0x92, 0x07, - 0xe4, 0x50, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe6, 0x00, 0xd1, 0x00, 0x3c, 0x40, 0x82, - 0x90, 0x03, 0x64, 0x00, 0xe9, 0x00, 0x3e, 0x62, - 0x0f, 0x10, 0x03, 0xda, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x10, 0xa1, 0x00, 0xf8, 0x64, - 0x3e, 0x00, 0x04, 0x80, 0x03, 0x22, 0x10, 0xe8, - 0x00, 0x30, 0x00, 0x0c, 0x88, 0x03, 0xe1, 0x00, - 0xd8, 0x00, 0x36, 0x08, 0x4f, 0x89, 0x0b, 0x20, - 0x00, 0xf8, 0x40, 0x3e, 0x30, 0x8f, 0x81, 0x03, - 0xe2, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0x60, 0x28, 0xc8, 0x60, 0xb2, 0x10, 0x0e, - 0x86, 0x03, 0x00, 0x82, 0xc8, 0x00, 0x32, 0x14, - 0x0c, 0x88, 0xed, 0x09, 0x00, 0x96, 0x01, 0x03, - 0x0a, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x05, 0x28, 0x00, 0xbe, 0x00, 0x2f, 0x80, 0x28, - 0xa0, 0x02, 0x39, 0x08, 0x86, 0xa0, 0x23, 0x80, - 0x2a, 0x64, 0x03, 0xb8, 0x00, 0x8e, 0x81, 0x23, - 0xa3, 0x0b, 0xec, 0x02, 0x88, 0x00, 0xbe, 0x04, - 0x2f, 0xb8, 0x03, 0x60, 0x42, 0xf9, 0x00, 0xba, - 0x00, 0x2e, 0x80, 0x0b, 0xed, 0x03, 0x38, 0x00, - 0x8e, 0x00, 0x23, 0x80, 0x08, 0xe8, 0x00, 0x39, - 0x00, 0x8e, 0x00, 0x23, 0xa0, 0x08, 0xe0, 0x02, - 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x04, 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xf0, 0x48, - 0xb0, 0x00, 0x0c, 0x08, 0xa3, 0x00, 0x20, 0x70, - 0x08, 0x38, 0x12, 0xc4, 0x00, 0x90, 0x8a, 0x24, - 0x00, 0x0b, 0x30, 0x02, 0xc4, 0x00, 0xb0, 0xa0, - 0x2c, 0xe0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x38, 0x0a, 0x2c, 0x08, - 0x13, 0x00, 0xa0, 0xc0, 0x08, 0x38, 0x4a, 0x8e, - 0x00, 0x93, 0x98, 0x20, 0xe0, 0x89, 0x30, 0x0e, - 0x0a, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x01, 0x1c, 0x04, 0xb6, 0x0c, 0x2d, 0xd0, 0x08, - 0xf2, 0x02, 0x04, 0x3c, 0x87, 0x00, 0x21, 0x02, - 0x2a, 0x70, 0x82, 0xbe, 0x20, 0x87, 0xc0, 0x21, - 0xc0, 0x0b, 0xf8, 0x02, 0xdc, 0x08, 0xb6, 0x40, - 0x2d, 0x80, 0x8b, 0x70, 0x02, 0x5c, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x0b, 0x78, 0x82, 0x0c, 0x0a, - 0x95, 0x02, 0x20, 0x40, 0x28, 0x70, 0x82, 0x99, - 0x18, 0x87, 0x82, 0xa0, 0x40, 0x09, 0x70, 0x02, - 0x28, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x08, 0x1e, 0x00, 0xf7, 0x80, 0x2f, 0xe0, 0x2c, - 0x78, 0x0b, 0x1e, 0x00, 0xe7, 0x80, 0xb0, 0xe0, - 0x1c, 0x78, 0x03, 0xde, 0x00, 0xd7, 0x80, 0x35, - 0xe0, 0x0f, 0x78, 0x03, 0x5e, 0xed, 0x09, 0x00, - 0x97, 0x01, 0x00, 0xf7, 0x80, 0x2d, 0xa0, 0x0f, - 0x68, 0x03, 0xde, 0x00, 0xf7, 0x80, 0x3d, 0xe0, - 0x0f, 0x78, 0x03, 0x12, 0x00, 0xdf, 0x82, 0x31, - 0xa0, 0x1e, 0x78, 0x03, 0x9e, 0x02, 0xc7, 0x80, - 0x21, 0xe0, 0x2d, 0xf8, 0x03, 0x2a, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, 0xac, 0x00, - 0xf8, 0x00, 0x3e, 0xc0, 0x0f, 0x31, 0x43, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0x90, 0x03, - 0x0c, 0x04, 0xfa, 0x00, 0x3e, 0x40, 0x0f, 0x30, - 0x43, 0x2c, 0x00, 0xd9, 0x00, 0x3e, 0x80, 0x0f, - 0xa0, 0x03, 0xe4, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x53, 0xa0, 0x00, 0xe9, 0x00, 0x3e, - 0x00, 0x1f, 0x90, 0x03, 0x6c, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0e, 0xb0, 0x43, 0xc2, 0x06, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, - 0xff, 0x80, 0x3f, 0xe0, 0x0c, 0xf8, 0x43, 0x7a, - 0x08, 0xdd, 0x80, 0x3b, 0x64, 0x2e, 0xd0, 0x03, - 0x3e, 0x00, 0xff, 0x80, 0x2d, 0xe4, 0x0c, 0xf8, - 0x11, 0xfe, 0x00, 0xff, 0x80, 0x33, 0xa0, 0x0f, - 0x58, 0x43, 0x3a, 0x00, 0xff, 0x80, 0x3f, 0xe0, - 0x0f, 0xd8, 0x03, 0x3e, 0xc0, 0xdf, 0x80, 0x3b, - 0xe1, 0x0c, 0xf8, 0x00, 0x36, 0x44, 0xcf, 0x80, - 0x3f, 0xa0, 0x04, 0xf8, 0x21, 0xc0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, 0x9c, 0x00, - 0xbc, 0x00, 0x23, 0xc0, 0x08, 0x70, 0x12, 0x10, - 0x40, 0x85, 0x00, 0x21, 0xcc, 0x2d, 0x70, 0x03, - 0x5c, 0x10, 0xb5, 0x20, 0x2d, 0xc0, 0x08, 0x72, - 0x02, 0xdc, 0x04, 0xb7, 0x40, 0x21, 0x90, 0x0b, - 0x70, 0x02, 0x1c, 0x40, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x50, 0x02, 0x1d, 0x40, 0x85, 0x00, 0xa1, - 0x40, 0x08, 0x61, 0x02, 0x18, 0xc0, 0xc7, 0x00, - 0x2f, 0xc6, 0x08, 0x60, 0x02, 0xea, 0x04, 0x60, - 0xed, 0x09, 0x00, 0x98, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9c, 0x00, 0xb6, 0x18, 0x29, - 0xc4, 0x28, 0x70, 0x02, 0x5c, 0x00, 0x91, 0x00, - 0xa9, 0xc1, 0x0a, 0xe0, 0x82, 0x1c, 0x00, 0xb7, - 0x00, 0x27, 0x82, 0x89, 0x70, 0xa2, 0xdd, 0x00, - 0xb7, 0x00, 0x21, 0x80, 0x0b, 0xc0, 0x02, 0x1c, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x60, 0x02, - 0x15, 0x80, 0xb6, 0x00, 0x20, 0x84, 0x28, 0x30, - 0x02, 0x00, 0x08, 0xa6, 0x00, 0x2d, 0x00, 0x08, - 0x54, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x14, 0xcd, 0x80, 0xb0, 0x48, 0x20, - 0xe0, 0x08, 0x30, 0x02, 0x4c, 0x04, 0x99, 0x02, - 0x20, 0x40, 0x29, 0x2c, 0x02, 0x4f, 0x40, 0xb3, - 0x80, 0x2c, 0xe0, 0x09, 0x34, 0xc2, 0xcc, 0x00, - 0xb3, 0xa0, 0x20, 0x10, 0x0b, 0x27, 0x02, 0x04, - 0x20, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x20, 0x02, - 0x06, 0x41, 0xa0, 0x45, 0x20, 0x18, 0x08, 0x01, - 0x02, 0x0a, 0x00, 0x88, 0x70, 0x2c, 0x70, 0x08, - 0x00, 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x15, 0xad, 0x00, 0xfa, 0x80, 0x38, - 0x70, 0x0c, 0x78, 0x8b, 0x6a, 0x00, 0xdb, 0x00, - 0x3a, 0xc0, 0x4a, 0x98, 0x42, 0x0b, 0x00, 0xfb, - 0xe0, 0x36, 0xe0, 0x2d, 0x98, 0x03, 0xec, 0x00, - 0x73, 0x88, 0x82, 0x10, 0x0b, 0xb0, 0x4b, 0x0e, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xa0, 0x0b, - 0x2c, 0x00, 0xfa, 0x40, 0x32, 0xe8, 0x0c, 0xbc, - 0x0b, 0x2e, 0x40, 0xcb, 0x00, 0x3e, 0xc0, 0x2c, - 0xb8, 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x00, 0xec, 0x00, 0xfa, 0x40, 0x3a, - 0x46, 0x0f, 0xb0, 0x83, 0xa6, 0x20, 0xeb, 0x40, - 0xbc, 0x00, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xdb, - 0x00, 0x3e, 0x88, 0x0e, 0x94, 0x03, 0xee, 0x00, - 0xfb, 0x00, 0x3e, 0xed, 0x09, 0x00, 0x99, 0x01, - 0x30, 0x0f, 0xa4, 0x03, 0xee, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xa0, 0x03, 0xc4, 0x00, 0x9a, - 0x08, 0x3e, 0x80, 0x0f, 0xb6, 0x03, 0xe0, 0x40, - 0xea, 0x00, 0x3c, 0x08, 0x0f, 0x11, 0x03, 0xe0, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, - 0xfc, 0x01, 0xfe, 0x00, 0x33, 0x20, 0x4c, 0xb0, - 0x03, 0x0b, 0x00, 0xcc, 0xc0, 0xb2, 0xc0, 0x2c, - 0xd0, 0x87, 0x3c, 0x20, 0x4d, 0x08, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xfe, 0x04, 0xff, 0x80, 0x33, - 0x22, 0x0f, 0xea, 0x03, 0x3c, 0x00, 0xcf, 0x00, - 0x3f, 0xc0, 0x0d, 0xc0, 0x03, 0xea, 0x00, 0xc4, - 0x14, 0x33, 0x40, 0x0c, 0xe0, 0x03, 0xde, 0x40, - 0xcf, 0x10, 0x33, 0xc0, 0x0c, 0xe0, 0x01, 0x00, - 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, - 0x6c, 0x00, 0xb0, 0xc8, 0x2a, 0x10, 0x48, 0xb0, - 0x02, 0x2c, 0x00, 0xd8, 0x01, 0x22, 0x64, 0x0f, - 0x39, 0x03, 0xec, 0x08, 0xab, 0xd0, 0x26, 0xe6, - 0x8b, 0xb9, 0x02, 0xee, 0x00, 0xbb, 0xc0, 0x36, - 0x34, 0x8b, 0x20, 0x02, 0xa5, 0x20, 0x0b, 0x00, - 0x3a, 0xc0, 0x0b, 0x87, 0x02, 0xe0, 0x00, 0x88, - 0x80, 0x2a, 0x30, 0x28, 0x86, 0x02, 0x66, 0x00, - 0x88, 0x4a, 0x22, 0x12, 0x0a, 0x89, 0x02, 0x20, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, - 0x2c, 0x00, 0xba, 0x80, 0x62, 0x86, 0x08, 0xb0, - 0x02, 0x21, 0x00, 0xab, 0x00, 0xa2, 0x40, 0x48, - 0xb0, 0x42, 0x2c, 0xb0, 0xaa, 0x40, 0x2e, 0x40, - 0x0b, 0xb4, 0x02, 0xe4, 0x80, 0xb9, 0x20, 0x22, - 0x00, 0x0b, 0xb0, 0x92, 0x28, 0x00, 0x8b, 0x00, - 0x2e, 0xc0, 0x0b, 0x90, 0x02, 0xe8, 0x40, 0x8b, - 0x40, 0x20, 0xd8, 0x08, 0x91, 0x02, 0xe4, 0x00, - 0xa9, 0x02, 0x22, 0x80, 0x08, 0xb0, 0x02, 0xa0, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x9a, 0x01, 0x08, 0x04, 0x0c, 0x00, 0xb2, - 0x00, 0x2a, 0x80, 0x08, 0xb0, 0x02, 0x00, 0x05, - 0xb2, 0x00, 0x20, 0x40, 0x0b, 0x30, 0x02, 0xcc, - 0x00, 0xa3, 0x00, 0x24, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0x3b, 0x00, 0x24, 0x00, 0x1b, 0x00, - 0x00, 0xac, 0x02, 0x83, 0x00, 0x28, 0xc0, 0x0b, - 0x10, 0x02, 0xc0, 0x02, 0x83, 0x00, 0x28, 0x80, - 0x08, 0x00, 0x02, 0x40, 0x00, 0x80, 0x02, 0x20, - 0x80, 0x28, 0x00, 0x02, 0x82, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xba, - 0x05, 0x22, 0xc0, 0x8c, 0xb0, 0x0b, 0x20, 0x00, - 0xe8, 0x00, 0x32, 0xc0, 0x4c, 0xa0, 0x22, 0x2c, - 0x00, 0xeb, 0x01, 0x3e, 0xc0, 0x0f, 0x90, 0x02, - 0xec, 0x00, 0xfb, 0x00, 0x72, 0x00, 0x0f, 0xa0, - 0x13, 0x2c, 0x00, 0xcb, 0x00, 0x3e, 0xc0, 0x0d, - 0x00, 0x03, 0xe8, 0x00, 0xc0, 0x00, 0x32, 0x40, - 0x0c, 0x80, 0x03, 0xe0, 0x00, 0xe8, 0x00, 0xb2, - 0x00, 0x0c, 0x80, 0x0b, 0x80, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, 0xfc, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf4, 0x00, - 0xdd, 0x00, 0xb7, 0x40, 0x0e, 0x60, 0x03, 0xbc, - 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, - 0xfc, 0x00, 0xf5, 0x00, 0x3f, 0x00, 0x0f, 0xc0, - 0x03, 0xf0, 0x00, 0xff, 0x00, 0x3b, 0xc0, 0x0f, - 0xc0, 0x03, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0x00, - 0x0f, 0xc0, 0x01, 0x70, 0x00, 0xfc, 0x00, 0x3f, - 0x00, 0x07, 0xc0, 0x03, 0x68, 0x06, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x05, 0xfc, 0x70, 0xcf, - 0x00, 0x33, 0xd8, 0x0f, 0xc0, 0x0b, 0x7c, 0xc8, - 0xcf, 0x21, 0x3f, 0x00, 0x0c, 0xf1, 0x03, 0xf0, - 0x00, 0xfc, 0x00, 0x3b, 0x00, 0x0d, 0xf0, 0x23, - 0xfc, 0x00, 0xcf, 0x05, 0x31, 0xc8, 0x0f, 0xf0, - 0x03, 0xed, 0x09, 0x00, 0x9b, 0x01, 0xd0, 0x00, - 0xcf, 0x00, 0xb3, 0xc0, 0x0f, 0xc0, 0x03, 0xfc, - 0x04, 0xcc, 0x00, 0xb7, 0x80, 0x0d, 0xf4, 0x03, - 0x7c, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc2, 0x98, 0xfd, 0x82, 0x87, 0x38, 0x23, 0xd0, - 0x0b, 0x92, 0x8a, 0x1d, 0x00, 0x8f, 0x10, 0x2e, - 0x00, 0x0b, 0xf7, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x22, 0xc0, 0x08, 0xf4, 0x82, 0xfd, 0x48, 0xaf, - 0x50, 0x37, 0xc4, 0x0f, 0xb0, 0x82, 0xec, 0x00, - 0xaa, 0x08, 0x22, 0x81, 0x0b, 0xb0, 0x03, 0xe8, - 0x00, 0xf8, 0x00, 0x22, 0xc0, 0x08, 0xb5, 0x02, - 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xf0, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xca, 0x40, 0xcc, 0x90, 0x83, 0x00, 0x20, 0xcc, - 0x0b, 0x10, 0x02, 0x0c, 0x40, 0x83, 0x01, 0x2c, - 0x4a, 0x0b, 0x30, 0x42, 0xcc, 0x00, 0xb3, 0x00, - 0x2a, 0x80, 0x0b, 0x36, 0x02, 0xcc, 0x04, 0x83, - 0x04, 0x28, 0xc1, 0x0b, 0x32, 0x02, 0xcc, 0x04, - 0xab, 0x24, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0xec, - 0x04, 0x80, 0x00, 0x66, 0xc0, 0x09, 0x32, 0x02, - 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xf2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x05, 0xac, 0x00, 0x8b, 0x00, 0x22, 0xc0, - 0x8b, 0x81, 0x12, 0x2c, 0x00, 0x8b, 0x00, 0x2e, - 0x20, 0x0b, 0xb0, 0x02, 0xe4, 0x40, 0xbb, 0x40, - 0x22, 0xc2, 0x08, 0xb0, 0x02, 0xec, 0x00, 0xab, - 0x00, 0xaa, 0xc0, 0x0a, 0xb0, 0x42, 0xed, 0x80, - 0xa9, 0x00, 0x22, 0xc9, 0x0b, 0xb5, 0x40, 0xac, - 0x00, 0xaa, 0x00, 0x22, 0xc8, 0x69, 0xb0, 0x02, - 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x15, 0xec, 0x00, 0xed, 0x09, 0x00, 0x9c, - 0x01, 0xcb, 0x00, 0xb2, 0xc0, 0x0f, 0x9c, 0x03, - 0x2c, 0x02, 0xcb, 0x00, 0x3e, 0x52, 0x0e, 0xb0, - 0x03, 0xee, 0x00, 0xf3, 0x50, 0x3a, 0xc0, 0x1f, - 0xb0, 0x03, 0xcc, 0x00, 0xc3, 0x00, 0x0a, 0xc0, - 0x0b, 0xb0, 0x03, 0xec, 0x00, 0x8b, 0x40, 0x32, - 0x40, 0x0f, 0xb0, 0x10, 0xec, 0x00, 0x80, 0x80, - 0x36, 0x58, 0x0d, 0xb0, 0x03, 0x6c, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xf0, 0x44, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x9c, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xd8, 0x03, - 0xfc, 0x00, 0xff, 0x02, 0x3f, 0x40, 0x0f, 0xf0, - 0x03, 0xfe, 0x00, 0xfe, 0x82, 0x3f, 0xe4, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xff, 0x00, 0x27, 0xc0, - 0x0f, 0xf0, 0x03, 0xfe, 0x00, 0x7f, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x23, 0xfc, 0x80, 0x3e, 0x40, - 0x3f, 0xe0, 0x4e, 0x70, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x07, 0xf0, 0x03, 0xf8, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, - 0x00, 0xf3, 0x00, 0x36, 0xc0, 0x2c, 0x94, 0x03, - 0x0c, 0x00, 0xdb, 0x00, 0x3e, 0x40, 0x0d, 0xb0, - 0x03, 0x28, 0x08, 0xc9, 0x14, 0x3e, 0xc8, 0x0c, - 0xb0, 0x03, 0x2c, 0x00, 0xcb, 0x08, 0x3e, 0xc0, - 0x0c, 0xb0, 0x03, 0xed, 0x00, 0xeb, 0x00, 0x3a, - 0x40, 0x0c, 0xb4, 0x03, 0xad, 0x20, 0xf9, 0x00, - 0x36, 0xd0, 0x8c, 0xb0, 0x03, 0xac, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x05, 0x3c, - 0x00, 0xbf, 0x00, 0x23, 0xc0, 0x08, 0x90, 0x02, - 0xbc, 0x04, 0x8f, 0xd0, 0x2e, 0xc0, 0x0b, 0xf0, - 0x02, 0x2e, 0x00, 0x8b, 0x40, 0x2c, 0xd0, 0x0b, - 0xf0, 0x02, 0xbc, 0x00, 0x8f, 0xe0, 0x2f, 0xd0, - 0x08, 0xb0, 0x02, 0xcf, 0x60, 0x93, 0x00, 0xed, - 0x09, 0x00, 0x9d, 0x01, 0x22, 0xd0, 0x08, 0xb6, - 0x03, 0x4f, 0x00, 0xbb, 0x80, 0x20, 0xdd, 0x08, - 0xf0, 0x02, 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x04, 0x4c, 0x00, 0xa3, 0x00, - 0x24, 0xc0, 0x89, 0x80, 0x22, 0x0c, 0x00, 0x83, - 0x80, 0x2c, 0x40, 0x0b, 0x30, 0x02, 0x0d, 0xc0, - 0x83, 0x80, 0x2c, 0xd0, 0x0a, 0x30, 0x02, 0x0f, - 0x20, 0xb3, 0x00, 0x2c, 0xe8, 0x08, 0x30, 0x02, - 0xcf, 0x00, 0x93, 0x00, 0x28, 0xd2, 0x08, 0x3a, - 0x42, 0x8f, 0x00, 0x90, 0xb0, 0xa0, 0xc0, 0x88, - 0x30, 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xf8, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xb8, 0x10, 0x5e, 0x00, 0xb7, 0x80, - 0x20, 0xe4, 0x09, 0xc8, 0x02, 0x9e, 0x07, 0x87, - 0x8a, 0x2d, 0x20, 0x0b, 0x31, 0x02, 0x3a, 0x00, - 0x85, 0xc0, 0x2d, 0xe2, 0x0b, 0x78, 0x02, 0x9e, - 0x20, 0x37, 0x80, 0x6d, 0xe3, 0x08, 0x78, 0x02, - 0xdc, 0x15, 0x97, 0x80, 0x21, 0xa0, 0x28, 0xf8, - 0x02, 0xde, 0x10, 0xb4, 0x80, 0xa3, 0xe0, 0x20, - 0x78, 0x02, 0x1e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0b, 0x78, 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x08, 0x4c, 0x00, 0xe3, 0x00, - 0x34, 0xc4, 0x0d, 0x04, 0x03, 0x0c, 0x00, 0xd3, - 0x10, 0x3c, 0x00, 0x0f, 0x31, 0x13, 0x0c, 0x11, - 0xc2, 0x14, 0x3c, 0xc0, 0x0e, 0x30, 0x03, 0x0c, - 0x40, 0xf3, 0x00, 0x2c, 0xc0, 0x0c, 0x31, 0x01, - 0xcc, 0x40, 0xeb, 0x01, 0x38, 0xc0, 0x2c, 0x30, - 0x03, 0x8d, 0xa0, 0xf2, 0x20, 0x30, 0xc8, 0x0c, - 0xb0, 0x03, 0x8c, 0x00, 0xf3, 0x00, 0x3c, 0xc0, - 0x0f, 0x30, 0x03, 0xd2, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x15, 0xbc, 0x00, 0xff, 0x00, - 0x3f, 0xc5, 0xed, 0x09, 0x00, 0x9e, 0x01, 0x0e, - 0x40, 0x03, 0xfc, 0x00, 0xff, 0x08, 0x3f, 0x00, - 0x0f, 0xf0, 0x8b, 0xdc, 0x06, 0xff, 0x10, 0x3f, - 0xc0, 0x0f, 0xf1, 0x03, 0x7c, 0x22, 0xcf, 0x08, - 0x3f, 0xd2, 0x0f, 0xf1, 0x03, 0xfc, 0x80, 0xed, - 0x02, 0x1d, 0xc0, 0x0f, 0x71, 0x03, 0x74, 0x08, - 0xf6, 0x00, 0x39, 0xc0, 0x0f, 0xf1, 0x03, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xd0, 0x26, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0xae, 0xf2, 0xdb, 0x20, 0x3a, 0xf8, 0x0c, - 0x90, 0x03, 0xec, 0x80, 0xcb, 0x00, 0x3e, 0x60, - 0x24, 0xb2, 0x03, 0x24, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb4, 0x83, 0xed, 0x20, 0xfb, 0x02, - 0x3a, 0xc1, 0x0f, 0xb0, 0x13, 0xec, 0x00, 0xcb, - 0x01, 0x26, 0xc0, 0x0f, 0xb8, 0x03, 0x2c, 0x00, - 0xd2, 0x80, 0x32, 0xe0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc8, - 0xd8, 0xbc, 0x80, 0x8f, 0x48, 0x21, 0xcd, 0x08, - 0x70, 0x02, 0xcd, 0x40, 0x87, 0x28, 0x2d, 0x40, - 0x08, 0x72, 0x82, 0x9c, 0x00, 0xb7, 0x01, 0x2d, - 0xc0, 0x83, 0x74, 0x02, 0xdc, 0x00, 0xb7, 0x08, - 0x2d, 0xc8, 0x09, 0x70, 0x20, 0xdc, 0x00, 0xaf, - 0x00, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0x9c, 0x00, - 0x86, 0x00, 0x29, 0xc0, 0x0b, 0x72, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xf2, 0x24, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x9e, 0x80, 0x87, 0xa0, 0x28, 0xe4, 0x08, - 0x78, 0x82, 0xde, 0x80, 0xa7, 0x80, 0x25, 0xe0, - 0x09, 0x3a, 0x62, 0x5e, 0x00, 0xb7, 0xc0, 0x2d, - 0xe1, 0x03, 0x78, 0x02, 0xde, 0x80, 0xb7, 0xa0, - 0x2d, 0xe8, 0x0b, 0x78, 0x02, 0xfe, 0x20, 0x87, - 0x81, 0x25, 0xe0, 0x0b, 0x78, 0xed, 0x09, 0x00, - 0x9f, 0x01, 0x02, 0x7e, 0x00, 0x97, 0x80, 0x69, - 0xc0, 0x0b, 0x79, 0x02, 0xde, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xe0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x68, 0x04, 0xcc, 0x02, - 0x83, 0x00, 0x20, 0xc0, 0x08, 0x18, 0x02, 0xcc, - 0x00, 0x83, 0x00, 0x2c, 0x40, 0x89, 0x30, 0x02, - 0x42, 0x10, 0x90, 0x80, 0x2c, 0xc0, 0x03, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x24, 0xc0, 0x0b, - 0xb0, 0x02, 0xce, 0x04, 0xab, 0x80, 0x20, 0xe0, - 0x0b, 0x30, 0x02, 0xc4, 0x00, 0x83, 0x00, 0x28, - 0xc2, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x22, 0xd2, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x15, 0xe8, 0x00, - 0xca, 0x00, 0x3a, 0x80, 0x2c, 0xec, 0x03, 0xe8, - 0x00, 0xea, 0x00, 0x37, 0xb8, 0x0c, 0xa0, 0x02, - 0x7b, 0x00, 0xfe, 0x80, 0x3f, 0x90, 0x0f, 0xa0, - 0x03, 0xe8, 0x00, 0xf2, 0x00, 0x3c, 0x80, 0x0f, - 0xa0, 0x02, 0xf8, 0x08, 0xce, 0x60, 0x37, 0xb0, - 0x0f, 0xec, 0x13, 0x59, 0x00, 0xde, 0x40, 0xbb, - 0xb0, 0x0f, 0xa0, 0x03, 0xe8, 0x00, 0xfa, 0x00, - 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xf8, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0xa0, 0x00, - 0xe8, 0x00, 0x3e, 0x00, 0x4f, 0x88, 0x03, 0xe0, - 0x02, 0xf0, 0x40, 0x3e, 0x20, 0x0e, 0x80, 0x0b, - 0xa0, 0xc0, 0xf8, 0x80, 0x3e, 0x20, 0x57, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0d, - 0x80, 0x03, 0xe0, 0x80, 0xf8, 0x80, 0x3e, 0x24, - 0x0f, 0x8d, 0x13, 0xa2, 0x04, 0xf8, 0x82, 0x3e, - 0x04, 0x1f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xd2, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xa4, 0x00, - 0xe1, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x03, 0xc4, - 0xed, 0x09, 0x00, 0xa0, 0x01, 0x00, 0x89, 0x40, - 0x32, 0x40, 0x0f, 0x90, 0x03, 0x66, 0x80, 0xf9, - 0x24, 0x36, 0x60, 0x0f, 0x90, 0x03, 0xe5, 0x00, - 0xf9, 0x00, 0x32, 0x60, 0x0c, 0x90, 0x43, 0x26, - 0x00, 0xc9, 0x00, 0xba, 0x40, 0x2c, 0x98, 0x13, - 0xa6, 0x08, 0xe9, 0x80, 0x3e, 0x44, 0x4c, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x00, 0x64, 0x00, 0xb9, 0x00, 0xa2, - 0x40, 0x09, 0x90, 0x03, 0xe4, 0x00, 0x89, 0x60, - 0xa2, 0x41, 0x0b, 0x90, 0x02, 0x27, 0x00, 0xb9, - 0x00, 0x3e, 0x40, 0x09, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0xd8, 0x22, 0x50, 0x08, 0x90, 0x03, 0x05, - 0x00, 0xd9, 0x04, 0x28, 0x51, 0x20, 0x9c, 0x02, - 0xe7, 0x00, 0xa9, 0x00, 0x2c, 0x78, 0x08, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x05, 0x24, 0x00, 0xa9, 0x00, 0x22, - 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xa9, 0x00, - 0x22, 0x40, 0x0b, 0x10, 0x0a, 0xac, 0x00, 0xb9, - 0x00, 0x2e, 0x48, 0x0b, 0x90, 0x22, 0xe4, 0x04, - 0xb9, 0x01, 0x22, 0x54, 0x08, 0x90, 0x02, 0xa4, - 0x40, 0x9b, 0x00, 0x22, 0x40, 0x00, 0x95, 0x06, - 0xa4, 0x80, 0xa9, 0x10, 0x0e, 0x40, 0x08, 0x90, - 0x22, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x14, 0x05, 0x00, 0xb1, 0x40, 0x20, - 0x50, 0x0b, 0x14, 0x12, 0x85, 0x00, 0xb1, 0x00, - 0x20, 0x50, 0x0b, 0x14, 0x02, 0x06, 0x00, 0xb1, - 0x00, 0x28, 0x40, 0x89, 0x14, 0x22, 0xc4, 0x00, - 0xb1, 0x00, 0x20, 0x40, 0x28, 0x14, 0x42, 0x4c, - 0x00, 0x91, 0x40, 0x22, 0x61, 0x08, 0x10, 0x02, - 0xc6, 0x00, 0x81, 0xed, 0x09, 0x00, 0xa1, 0x01, - 0x02, 0x2e, 0x40, 0x18, 0x14, 0x02, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x40, 0x09, 0x10, 0x02, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0d, - 0x60, 0x00, 0xe8, 0x00, 0x32, 0x00, 0x0f, 0x80, - 0x12, 0xe0, 0x02, 0xe8, 0x00, 0x30, 0x00, 0x0f, - 0x80, 0x03, 0xa0, 0x00, 0xfa, 0x00, 0x26, 0x00, - 0x03, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0xb2, - 0x00, 0x0c, 0x80, 0x0b, 0xa0, 0x00, 0xc8, 0x00, - 0x3a, 0x00, 0x0c, 0x80, 0x23, 0xa0, 0x00, 0xea, - 0x00, 0x3e, 0x00, 0x0c, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xee, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x95, - 0xe5, 0x00, 0xf9, 0x41, 0x3e, 0x50, 0x0d, 0xd0, - 0x03, 0xe5, 0x00, 0x89, 0x40, 0x3f, 0x40, 0x0f, - 0x94, 0x03, 0x34, 0x00, 0xfd, 0x00, 0x3f, 0x40, - 0x4d, 0x94, 0x03, 0xe5, 0x00, 0xf9, 0x40, 0x3e, - 0x50, 0x0f, 0x90, 0x43, 0x94, 0x00, 0xfd, 0x00, - 0x3f, 0xc0, 0x0b, 0x50, 0x03, 0xd4, 0x04, 0xfd, - 0x03, 0x3f, 0x40, 0x0f, 0x94, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xf6, - 0x26, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, - 0xe4, 0xc0, 0xf9, 0x00, 0x36, 0x40, 0x0d, 0x91, - 0x03, 0x64, 0x80, 0xc5, 0x28, 0x3e, 0x45, 0x0f, - 0x90, 0x03, 0xf4, 0x00, 0xf5, 0x00, 0x3d, 0xc0, - 0x06, 0x92, 0x83, 0xb4, 0x90, 0xcd, 0x00, 0x3f, - 0x40, 0x0c, 0x91, 0x63, 0xd4, 0x00, 0xc9, 0x04, - 0x35, 0x41, 0x0c, 0xd0, 0x03, 0x14, 0x08, 0xcf, - 0x00, 0x3d, 0x41, 0x2e, 0x92, 0xa3, 0xe4, 0x10, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xc6, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, - 0xc0, 0xc0, 0xb8, 0x48, 0x00, 0x03, 0x08, 0x00, - 0x02, 0xe0, 0xa0, 0xa8, 0x00, 0x2e, 0xed, 0x09, - 0x00, 0xa2, 0x01, 0x08, 0x0b, 0x84, 0xc2, 0xe0, - 0x00, 0xb8, 0x04, 0x2e, 0x00, 0x0b, 0x82, 0x02, - 0x20, 0x48, 0xa8, 0x40, 0x2e, 0x00, 0x08, 0x80, - 0x02, 0xe0, 0x10, 0xb8, 0x22, 0x22, 0x00, 0x28, - 0x80, 0x4b, 0x60, 0x0c, 0xa8, 0x01, 0x2e, 0x00, - 0x0c, 0x82, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, - 0x00, 0x0b, 0x80, 0x02, 0xde, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0x84, 0x80, 0xb1, - 0x30, 0x28, 0x44, 0x0a, 0x18, 0x02, 0xc4, 0xc2, - 0x11, 0x00, 0x24, 0x68, 0x0b, 0x13, 0x02, 0xc4, - 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x1b, 0x12, 0x82, - 0x04, 0x00, 0xa1, 0x10, 0x2c, 0x44, 0x0a, 0x10, - 0x02, 0xe4, 0x00, 0x91, 0x2a, 0x24, 0x41, 0x0b, - 0x10, 0x02, 0xa4, 0x10, 0xb1, 0x00, 0x2c, 0x40, - 0x09, 0x12, 0x82, 0xc4, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x0a, 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x04, 0xa4, 0x00, 0xb9, - 0x05, 0x22, 0x40, 0x0a, 0x90, 0x02, 0xe4, 0x00, - 0x89, 0x00, 0x2e, 0x44, 0x0b, 0x90, 0x42, 0xed, - 0x00, 0xb9, 0x80, 0x2e, 0xc0, 0x89, 0x90, 0x22, - 0xa4, 0x01, 0xa9, 0x01, 0x2e, 0xc0, 0x80, 0x90, - 0x02, 0xe4, 0x20, 0xb9, 0x00, 0x62, 0x40, 0x4b, - 0x91, 0x02, 0xe4, 0x10, 0xb9, 0x08, 0x2e, 0x4a, - 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, - 0x00, 0x9a, 0x40, 0x2f, 0x98, 0x03, 0x64, 0x00, - 0xc9, 0x04, 0x3e, 0x40, 0x07, 0x90, 0x13, 0xe7, - 0x00, 0xf9, 0x60, 0x2e, 0x40, 0x4f, 0x90, 0x0b, - 0xa4, 0x00, 0xe9, 0x00, 0x3e, 0x40, 0x2e, 0x90, - 0x03, 0xe7, 0x00, 0xc9, 0x20, 0xb4, 0x50, 0x0f, - 0x14, 0x87, 0xa5, 0x88, 0xd9, 0x15, 0x3e, 0x40, - 0x09, 0xed, 0x09, 0x00, 0xa3, 0x01, 0x90, 0x01, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x01, 0x24, 0x00, 0xf9, 0x00, 0x3c, 0x40, - 0x0d, 0x92, 0x03, 0xc4, 0x00, 0xf9, 0x00, 0x1e, - 0x40, 0x0f, 0x90, 0x03, 0x65, 0x00, 0xf9, 0x00, - 0x3e, 0x70, 0x0f, 0x90, 0x03, 0x64, 0x00, 0xf9, - 0x00, 0x3c, 0x42, 0x07, 0x90, 0x03, 0xe6, 0x8c, - 0xe9, 0x14, 0x3e, 0x40, 0x04, 0x90, 0x07, 0x66, - 0x80, 0xe9, 0x82, 0x3e, 0x41, 0x2e, 0x90, 0x23, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xda, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x10, 0xa0, 0x00, 0xc8, 0x00, 0xbe, 0x00, - 0x4d, 0x80, 0x03, 0x20, 0x12, 0xc8, 0x80, 0x3a, - 0x00, 0x0d, 0x80, 0x03, 0xe3, 0x00, 0xd8, 0xd2, - 0x32, 0x20, 0x0e, 0x00, 0x03, 0xc2, 0x01, 0x78, - 0x00, 0x36, 0x00, 0x0c, 0x80, 0x13, 0xe0, 0x10, - 0xc8, 0x00, 0x3e, 0x21, 0x0c, 0x88, 0x0b, 0xa2, - 0x00, 0xe8, 0xc0, 0x3a, 0x20, 0x0c, 0x80, 0x03, - 0x20, 0x00, 0xf8, 0x00, 0x36, 0x00, 0x0f, 0x80, - 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x01, 0xa8, 0x00, 0x8a, 0x00, 0x3a, 0x80, - 0x2c, 0xa0, 0x22, 0x28, 0x00, 0x8e, 0xc2, 0x82, - 0x80, 0x0b, 0xa0, 0x02, 0x79, 0x28, 0x9e, 0x40, - 0x23, 0xb2, 0x01, 0xa0, 0x00, 0x79, 0x04, 0xfe, - 0x40, 0x3b, 0x98, 0x08, 0xa0, 0x02, 0xd9, 0x00, - 0xaa, 0x04, 0x2f, 0xb0, 0x0d, 0xe4, 0x02, 0x19, - 0x00, 0x8e, 0x40, 0x21, 0x90, 0x28, 0xa0, 0x02, - 0x28, 0x00, 0xba, 0x00, 0x3a, 0x80, 0x0b, 0xa0, - 0x02, 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x4c, 0x00, 0x8b, 0x00, 0x20, 0xc0, - 0x0a, 0x30, 0x02, 0x0c, 0x00, 0x81, 0x00, 0x20, - 0xc0, 0x09, 0x30, 0x02, 0xed, 0x09, 0x00, 0xa4, - 0x01, 0x44, 0x00, 0x91, 0x00, 0x60, 0xc0, 0x0b, - 0x30, 0x02, 0xce, 0x00, 0xb0, 0x60, 0x20, 0x20, - 0x28, 0x30, 0x02, 0xcd, 0x80, 0x9b, 0x00, 0x24, - 0xe0, 0x09, 0x30, 0x18, 0x84, 0x04, 0xa3, 0x80, - 0x28, 0xc0, 0x08, 0x30, 0x12, 0x8c, 0x10, 0xb3, - 0x00, 0x24, 0xc0, 0x0b, 0x30, 0x02, 0xca, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x5e, - 0x80, 0x83, 0x24, 0x29, 0xc0, 0x08, 0x7a, 0x02, - 0x1c, 0x80, 0xa7, 0xc2, 0x21, 0xc8, 0x0b, 0x72, - 0x02, 0x5c, 0x00, 0x9f, 0x84, 0x21, 0xe0, 0x09, - 0x70, 0x02, 0x5c, 0x20, 0xa7, 0xc0, 0x29, 0xc1, - 0x08, 0x72, 0x02, 0xdd, 0x00, 0xb7, 0x00, 0x05, - 0xd1, 0x09, 0x50, 0x82, 0x1c, 0x00, 0x8d, 0xc2, - 0x23, 0xc0, 0x08, 0x38, 0x02, 0x9c, 0x00, 0xb7, - 0x00, 0x29, 0xc0, 0x0b, 0x70, 0x02, 0xe8, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x5e, - 0xa2, 0xc7, 0xc0, 0x31, 0xf2, 0x0e, 0x7a, 0x0b, - 0x3f, 0x40, 0xc5, 0x84, 0x39, 0xf0, 0x09, 0x7a, - 0x02, 0xde, 0x00, 0xd7, 0x80, 0xb1, 0xe0, 0x0e, - 0x78, 0x83, 0xde, 0x08, 0xb3, 0x80, 0x30, 0xe0, - 0x0c, 0x7f, 0x03, 0xde, 0x00, 0xd7, 0x81, 0x35, - 0xc0, 0x4d, 0x78, 0x0a, 0x9c, 0x04, 0xe7, 0x80, - 0x79, 0xe0, 0x4c, 0x78, 0x0b, 0x9e, 0x00, 0xf7, - 0x80, 0x35, 0xe0, 0x0f, 0x78, 0x03, 0xea, 0x22, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x15, 0xad, - 0x40, 0xfb, 0x00, 0x02, 0xd0, 0x0f, 0xb7, 0x03, - 0xec, 0x00, 0xd9, 0x00, 0x3e, 0xda, 0x0f, 0xb0, - 0x00, 0x64, 0x00, 0xfb, 0x00, 0x2e, 0xc0, 0x0e, - 0xb1, 0x03, 0x6c, 0x00, 0xf9, 0x00, 0xb2, 0xc0, - 0x0f, 0xb4, 0x03, 0xec, 0x00, 0xeb, 0x10, 0x3e, - 0xc0, 0x0f, 0x30, 0x03, 0xec, 0x00, 0xf3, 0x03, - 0x3e, 0xc0, 0x0f, 0xb1, 0x03, 0x6c, 0x00, 0xed, - 0x09, 0x00, 0xa5, 0x01, 0xfb, 0x00, 0x3a, 0xc0, - 0x0f, 0xb0, 0x03, 0xc2, 0x86, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x85, 0xbe, 0x00, 0xcf, 0xc4, - 0x33, 0xe0, 0x4c, 0xfc, 0x03, 0xfe, 0x00, 0xcc, - 0x80, 0x3f, 0xe0, 0x4e, 0xfc, 0xc3, 0x7e, 0x00, - 0xef, 0x80, 0x37, 0xe0, 0x4f, 0xf8, 0x03, 0x3e, - 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0d, 0xf8, 0x03, - 0x7e, 0x00, 0xcf, 0x80, 0x31, 0xc0, 0x0c, 0xf8, - 0x03, 0x76, 0x00, 0xdf, 0x80, 0x3f, 0xe4, 0x0c, - 0xf8, 0x03, 0xfe, 0x00, 0xff, 0x80, 0x3f, 0xe0, - 0x0f, 0xf8, 0x03, 0xc0, 0x80, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x18, 0x9c, 0x00, 0x87, 0x10, - 0x23, 0xc0, 0x08, 0x70, 0x02, 0xdc, 0x00, 0x84, - 0x40, 0x2f, 0xc0, 0x0c, 0xf0, 0x03, 0x5c, 0x00, - 0x85, 0x10, 0x2d, 0xc0, 0x0b, 0xf0, 0x02, 0x1c, - 0x40, 0xb6, 0x00, 0x2d, 0x44, 0x0d, 0x70, 0x02, - 0xdc, 0x30, 0xdf, 0x00, 0x35, 0xc4, 0x0f, 0x70, - 0x02, 0xdc, 0x41, 0x87, 0x11, 0x2d, 0xcc, 0x08, - 0x71, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xea, 0x84, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0xa7, 0x00, - 0x21, 0xc0, 0x0a, 0x70, 0x02, 0xdc, 0x00, 0xa4, - 0x10, 0x2d, 0xc0, 0x08, 0x70, 0x02, 0x9c, 0x00, - 0xa7, 0x08, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0x1c, - 0x00, 0xb7, 0x00, 0x2d, 0x80, 0x0b, 0x70, 0x02, - 0xdc, 0x00, 0x87, 0x00, 0xa3, 0x86, 0x08, 0x70, - 0x82, 0xfc, 0x22, 0x97, 0x00, 0x2f, 0x80, 0x08, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x04, 0x8c, 0x00, 0xa3, 0x01, - 0x20, 0xc0, 0x0a, 0x34, 0x02, 0xec, 0x00, 0xa0, - 0x02, 0x2c, 0xd0, 0x09, 0x30, 0x02, 0x0c, 0x20, - 0x83, 0xe0, 0xed, 0x09, 0x00, 0xa6, 0x01, 0x2c, - 0xd0, 0x0b, 0x30, 0x22, 0x0c, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xce, 0x08, 0x93, - 0xe0, 0x20, 0xd0, 0x0b, 0x38, 0x02, 0xcf, 0x08, - 0x82, 0x00, 0x2c, 0x82, 0x28, 0xb0, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x15, 0xfc, 0x00, 0xef, 0x00, 0xb3, 0xc0, 0x0e, - 0xf0, 0x03, 0xfc, 0x02, 0xeb, 0x00, 0x3d, 0xf8, - 0x0c, 0xf0, 0x02, 0xac, 0x00, 0xeb, 0x80, 0x2e, - 0xd0, 0x0f, 0xf0, 0x02, 0x2c, 0x00, 0xbb, 0x00, - 0x3e, 0xc1, 0x09, 0xf0, 0x03, 0x6c, 0x50, 0x8f, - 0xc2, 0x22, 0xe0, 0x0c, 0xb4, 0x02, 0x6c, 0x02, - 0xdb, 0x80, 0x2e, 0xf8, 0x0c, 0xf0, 0x23, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x01, 0x8c, 0x00, 0xd3, 0x00, 0x3e, 0xc0, 0x09, - 0xb8, 0x83, 0xec, 0x00, 0x59, 0x40, 0x3e, 0xc0, - 0x0e, 0xb0, 0x0b, 0xef, 0x00, 0xfb, 0x42, 0x3e, - 0xc4, 0x0f, 0xb0, 0x03, 0xed, 0x00, 0xfb, 0x00, - 0x3e, 0x80, 0x0f, 0xb0, 0x03, 0xed, 0x00, 0xfb, - 0x10, 0x3e, 0xd8, 0x0f, 0xb0, 0x83, 0xed, 0x80, - 0xfb, 0x80, 0x3e, 0x81, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, - 0x10, 0xbc, 0x00, 0xcf, 0x00, 0x33, 0xc0, 0x0f, - 0xf0, 0x43, 0x3c, 0x00, 0xc5, 0x00, 0x33, 0xc2, - 0x0c, 0xf0, 0x03, 0xfe, 0x80, 0xfd, 0x00, 0x2f, - 0xe2, 0x17, 0xf0, 0x02, 0xbf, 0x00, 0x56, 0x80, - 0xb3, 0x60, 0x0f, 0xf0, 0x03, 0xb4, 0x00, 0xcf, - 0x00, 0x23, 0xc0, 0x03, 0xf0, 0x13, 0xbc, 0x00, - 0xcf, 0x00, 0x3f, 0xe0, 0x08, 0xf0, 0x03, 0x3c, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0xed, 0x09, 0x00, - 0xa7, 0x01, 0x0f, 0xf0, 0x03, 0xc0, 0x44, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xa1, 0x04, 0x6c, 0x00, - 0x8b, 0x00, 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0x2c, - 0x02, 0x89, 0x00, 0x22, 0xc0, 0x0a, 0xb0, 0x02, - 0xee, 0x00, 0xbb, 0xd9, 0x2e, 0xd1, 0x9f, 0xb0, - 0x02, 0x2e, 0x80, 0x9b, 0x60, 0x22, 0xe0, 0x8b, - 0xb0, 0x22, 0x8c, 0x44, 0xe3, 0x00, 0x02, 0xc4, - 0x0b, 0x33, 0x02, 0x8c, 0x20, 0x8b, 0x00, 0x2c, - 0x20, 0x08, 0xb0, 0x02, 0x2c, 0x00, 0xbb, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, - 0x8b, 0x02, 0x26, 0xc0, 0x0b, 0x30, 0x02, 0x2c, - 0x00, 0x88, 0x80, 0x22, 0xc0, 0x09, 0xb0, 0x06, - 0xe4, 0x00, 0xbb, 0x00, 0x2e, 0xc4, 0x0b, 0x30, - 0x02, 0x2c, 0x00, 0xb9, 0x20, 0x66, 0xc8, 0x0b, - 0x30, 0x00, 0x2c, 0x20, 0x8b, 0x00, 0x0a, 0x42, - 0x0b, 0xb0, 0x02, 0xac, 0x40, 0x8b, 0x24, 0x2e, - 0xc8, 0x0b, 0xb0, 0x02, 0x2c, 0x00, 0xbb, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x14, 0x0c, 0x00, - 0x83, 0x00, 0xa4, 0xc0, 0x0b, 0x30, 0x4a, 0x0c, - 0x00, 0x81, 0x00, 0x22, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x01, 0x2c, 0x80, 0x4a, 0x30, - 0x22, 0x88, 0x00, 0xb3, 0x00, 0x24, 0xc0, 0x09, - 0x30, 0x02, 0x0c, 0x08, 0xbb, 0x00, 0xa8, 0x40, - 0x0b, 0x30, 0x32, 0x0c, 0x00, 0x83, 0x00, 0x2c, - 0xa1, 0x0b, 0x30, 0x0a, 0x0c, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc2, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x0d, 0x5c, 0x00, - 0xc7, 0x00, 0x37, 0xc0, 0x0f, 0xf0, 0x03, 0x1c, - 0x00, 0x89, 0x00, 0x33, 0xc0, 0x0d, 0xf0, 0x03, - 0xec, 0x04, 0xfb, 0x00, 0x3e, 0xc0, 0x8b, 0xf0, - 0xed, 0x09, 0x00, 0xa8, 0x01, 0x07, 0x2c, 0x00, - 0xfb, 0x00, 0x36, 0xc0, 0x0f, 0xf0, 0x13, 0xa8, - 0x01, 0xcb, 0x00, 0xba, 0x40, 0x0f, 0xb0, 0x03, - 0xa8, 0x00, 0xcb, 0x00, 0x3e, 0x80, 0x2f, 0xb0, - 0x03, 0x2c, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x95, 0xfc, 0x00, 0xff, 0x00, 0x3b, - 0xc0, 0x0f, 0xf0, 0x43, 0xfc, 0x00, 0xfc, 0x01, - 0x3f, 0xc0, 0x0e, 0xf0, 0x03, 0xd0, 0x00, 0xfc, - 0x00, 0x3f, 0x00, 0x0f, 0xf0, 0x03, 0x70, 0x11, - 0xdc, 0x03, 0x3b, 0x00, 0x0f, 0xf0, 0x03, 0xdc, - 0x01, 0xef, 0x00, 0x37, 0x41, 0x0f, 0xe0, 0x03, - 0xdc, 0x02, 0xfe, 0x00, 0x3d, 0x00, 0x0c, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x05, 0xfc, 0x40, 0xc7, 0x00, 0x2f, - 0x4a, 0x8c, 0x40, 0x23, 0x34, 0x40, 0xcf, 0x00, - 0x3f, 0x84, 0x4e, 0xe0, 0x23, 0xf8, 0x00, 0xfe, - 0x00, 0x3f, 0x40, 0x0c, 0x70, 0x03, 0x3c, 0x00, - 0xef, 0x00, 0x31, 0xc0, 0x0d, 0xf0, 0x03, 0xf0, - 0x40, 0xdf, 0x00, 0x33, 0xc0, 0x0f, 0xc1, 0x0b, - 0xb1, 0x80, 0xfc, 0x20, 0x3f, 0x00, 0x2c, 0xc1, - 0x83, 0x30, 0x48, 0xcc, 0x39, 0x1b, 0x0c, 0x0c, - 0xc6, 0xa3, 0x30, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x10, 0xec, 0x80, 0x8b, 0x01, 0x22, - 0x18, 0x08, 0x90, 0x02, 0x24, 0x80, 0xab, 0x00, - 0x2e, 0xc8, 0x08, 0xa0, 0x02, 0xec, 0x00, 0xba, - 0x00, 0x2e, 0x00, 0x48, 0x80, 0x00, 0xa0, 0x00, - 0xb8, 0x00, 0x22, 0x00, 0x0d, 0xb0, 0x42, 0xec, - 0x00, 0x87, 0x58, 0x2a, 0xc0, 0x0b, 0x25, 0x02, - 0x20, 0x80, 0xb0, 0x28, 0x2e, 0x00, 0x08, 0x82, - 0x02, 0x21, 0x40, 0xa8, 0x64, 0x22, 0x18, 0x08, - 0x84, 0x02, 0x20, 0xed, 0x09, 0x00, 0xa9, 0x01, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, - 0xcc, 0x02, 0x89, 0x02, 0xa8, 0x02, 0x08, 0x10, - 0x02, 0x0c, 0x00, 0x83, 0x00, 0x2c, 0x88, 0x0a, - 0x20, 0x02, 0xcc, 0x00, 0xb2, 0x00, 0x2e, 0x40, - 0x28, 0xb0, 0x00, 0x0c, 0x00, 0xb3, 0x00, 0xa6, - 0xc0, 0x08, 0x30, 0x02, 0xe4, 0x94, 0xa3, 0x20, - 0x24, 0xc0, 0xc3, 0x12, 0x02, 0xc1, 0x80, 0x90, - 0x31, 0x2c, 0x0e, 0x08, 0x00, 0x02, 0x40, 0x81, - 0xa1, 0x00, 0x20, 0x18, 0x48, 0x22, 0x0a, 0xa2, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x11, - 0xac, 0x00, 0x89, 0x00, 0x22, 0x20, 0x08, 0x90, - 0x8a, 0x2c, 0x00, 0x2b, 0x00, 0x2c, 0xc1, 0x28, - 0xb1, 0xa2, 0xec, 0x20, 0xba, 0x00, 0x0e, 0x00, - 0x08, 0x80, 0x1a, 0x20, 0x00, 0xb8, 0x00, 0x26, - 0x00, 0x0b, 0xb0, 0x02, 0xec, 0x84, 0xab, 0x04, - 0x2e, 0xc0, 0x0b, 0x80, 0x02, 0x6c, 0x94, 0xba, - 0x08, 0x2c, 0x80, 0x08, 0xb0, 0x02, 0x68, 0x00, - 0xab, 0x00, 0x6a, 0x50, 0x08, 0x20, 0x02, 0xb0, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, - 0xec, 0x00, 0xc2, 0xc0, 0x3a, 0x20, 0x2c, 0x88, - 0x03, 0x2a, 0x40, 0xcb, 0x00, 0x3e, 0xc8, 0x2e, - 0xb4, 0x02, 0xec, 0x00, 0xfa, 0x00, 0x3c, 0x40, - 0x0c, 0xb0, 0x03, 0x2c, 0x00, 0xe3, 0x00, 0x36, - 0xc0, 0x0c, 0xb8, 0x03, 0xc8, 0x02, 0xeb, 0x00, - 0x36, 0xc0, 0x0f, 0x82, 0x03, 0xe1, 0x00, 0xf8, - 0xd0, 0x3e, 0x26, 0x04, 0x8c, 0x03, 0x63, 0x08, - 0xca, 0x40, 0x72, 0x00, 0x0c, 0x84, 0xa1, 0x90, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, - 0xbc, 0x00, 0xff, 0xa0, 0x3c, 0x81, 0x0f, 0xcc, - 0x83, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf8, 0x83, 0xfc, 0x54, 0xfe, 0x05, 0x3f, 0x00, - 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0xfc, 0xed, 0x09, - 0x00, 0xaa, 0x01, 0x00, 0x3b, 0x02, 0x0d, 0xf9, - 0x03, 0xf6, 0x00, 0xc7, 0x00, 0x3b, 0xc0, 0x0f, - 0x60, 0x03, 0xa6, 0x00, 0xfd, 0x00, 0x3f, 0x40, - 0x0f, 0x7c, 0x8b, 0xae, 0x48, 0x9c, 0x00, 0xf7, - 0x28, 0x8f, 0xd9, 0x03, 0x78, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, 0x00, 0xf9, - 0x88, 0x3a, 0x80, 0x0c, 0x80, 0x03, 0x28, 0x00, - 0xcb, 0x00, 0x3e, 0x40, 0x0d, 0xb4, 0x03, 0xed, - 0x08, 0xfa, 0x08, 0x3e, 0x48, 0x0f, 0xb0, 0x03, - 0x2c, 0x08, 0xfb, 0x00, 0x3e, 0xc0, 0x0c, 0xb2, - 0x03, 0xec, 0x04, 0xcb, 0x00, 0xba, 0xc0, 0x0f, - 0xb0, 0x03, 0x29, 0x22, 0xcb, 0x42, 0x32, 0xc0, - 0x0f, 0x84, 0x03, 0x05, 0x02, 0xc2, 0x40, 0xb2, - 0x95, 0x9d, 0xa0, 0x83, 0x10, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x04, 0xb9, - 0xc0, 0x22, 0xb4, 0x0a, 0x04, 0x02, 0x2f, 0x80, - 0xdb, 0x00, 0x2e, 0x40, 0x08, 0xb8, 0x81, 0xac, - 0x00, 0xba, 0x40, 0x2e, 0x30, 0x0b, 0x0d, 0x8a, - 0x23, 0x40, 0xb8, 0x00, 0x2c, 0x00, 0x08, 0xbc, - 0x02, 0xe4, 0x00, 0x8f, 0x00, 0x36, 0xc1, 0x0b, - 0xa1, 0x02, 0x2d, 0x24, 0x8b, 0x90, 0x22, 0xc0, - 0x0b, 0xbc, 0x82, 0x2f, 0xc0, 0xca, 0x14, 0x22, - 0xd4, 0x08, 0xbc, 0x02, 0x32, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x05, 0x6c, 0x00, 0xb3, - 0x40, 0x20, 0x60, 0x48, 0x1d, 0x02, 0x2c, 0x00, - 0xa3, 0x00, 0x2c, 0xc0, 0x29, 0x38, 0x42, 0xcc, - 0x00, 0x92, 0x40, 0x2c, 0x74, 0x0b, 0x34, 0x02, - 0x8d, 0x40, 0xb3, 0x00, 0x2c, 0xf0, 0x18, 0x3c, - 0x02, 0xc8, 0x00, 0x03, 0x00, 0x28, 0xc0, 0x0b, - 0x04, 0x0a, 0x42, 0x00, 0x80, 0x10, 0x20, 0x00, - 0x0b, 0x04, 0x02, 0x80, 0x10, 0x90, 0x50, 0x06, - 0xd0, 0x08, 0x1d, 0x00, 0xb8, 0x00, 0x50, 0x00, - 0x00, 0xed, 0x09, 0x00, 0xab, 0x01, 0x00, 0x00, - 0x20, 0x01, 0x1e, 0x08, 0xbd, 0x90, 0xa1, 0xe0, - 0x0a, 0x58, 0x02, 0x1f, 0x00, 0xb7, 0x81, 0x2d, - 0xe0, 0x08, 0x78, 0x62, 0xde, 0x00, 0xb6, 0x80, - 0x2d, 0x24, 0x0b, 0xc9, 0x02, 0x12, 0x00, 0x34, - 0x80, 0x2f, 0x22, 0x18, 0x78, 0xc2, 0xde, 0x00, - 0x87, 0x82, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0x1a, - 0x10, 0x87, 0x80, 0x21, 0xe0, 0x0b, 0x08, 0x2a, - 0x96, 0x44, 0xa4, 0x90, 0x24, 0xe4, 0x09, 0x18, - 0x02, 0x08, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x08, 0x0c, 0x40, 0xf1, 0x10, 0x20, 0xc2, - 0x0c, 0x00, 0x03, 0x2c, 0x00, 0xe3, 0x00, 0x3e, - 0xc8, 0x2d, 0x33, 0x03, 0xc4, 0x00, 0xd2, 0x00, - 0x3c, 0x44, 0x0f, 0x30, 0x02, 0x8c, 0x00, 0xf3, - 0x00, 0x3c, 0xc0, 0x2c, 0x32, 0x13, 0xec, 0x02, - 0xc3, 0x00, 0x38, 0xc4, 0x0b, 0x10, 0x03, 0x05, - 0x00, 0xc1, 0x20, 0x30, 0x40, 0xcf, 0x30, 0x03, - 0x8d, 0x40, 0xd9, 0x50, 0xb4, 0x80, 0x04, 0x10, - 0x0b, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x1d, 0xbc, 0x00, 0xfd, 0x12, 0x1f, 0xc4, - 0x2f, 0xd1, 0x0b, 0xfc, 0x00, 0xdf, 0x00, 0x3f, - 0xc0, 0x0f, 0xd1, 0x03, 0xbc, 0x40, 0xbe, 0x00, - 0x3f, 0x05, 0x0f, 0xc0, 0x23, 0xf0, 0x00, 0xfc, - 0x10, 0x3f, 0x24, 0x0f, 0xf0, 0x23, 0xfc, 0x40, - 0xff, 0x00, 0xb7, 0xc0, 0x0f, 0xd0, 0x03, 0xfc, - 0x04, 0xff, 0x00, 0x2f, 0xc0, 0x0f, 0xf0, 0x03, - 0x7c, 0x50, 0xdf, 0x10, 0x3b, 0xc1, 0x0e, 0xd1, - 0x03, 0x50, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x05, 0xec, 0x00, 0xfb, 0x00, 0x36, 0x40, - 0x0c, 0x80, 0x03, 0xe8, 0x00, 0xdb, 0x00, 0x3e, - 0xc0, 0x0c, 0xb0, 0x03, 0xce, 0x00, 0x42, 0x80, - 0x30, 0x40, 0x2c, 0x38, 0x0a, 0x2c, 0x00, 0xf3, - 0x00, 0xb0, 0xe0, 0x0c, 0xed, 0x09, 0x00, 0xac, - 0x01, 0xb8, 0x03, 0x28, 0x08, 0xdb, 0x58, 0x36, - 0xc0, 0x0f, 0x80, 0x03, 0xee, 0x00, 0xca, 0x80, - 0x32, 0x80, 0x9d, 0xb0, 0x0b, 0x28, 0x00, 0xcb, - 0x80, 0x72, 0x40, 0x0c, 0xa0, 0x03, 0xea, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, - 0x01, 0xb5, 0x00, 0x31, 0xc0, 0x0d, 0x40, 0x02, - 0xfc, 0x00, 0x87, 0x00, 0x2d, 0xc0, 0xc8, 0x70, - 0x02, 0xdc, 0x00, 0xd6, 0x00, 0x21, 0x00, 0x08, - 0x40, 0x02, 0x10, 0x00, 0xb4, 0x00, 0x21, 0x01, - 0x0a, 0x70, 0x0a, 0x3c, 0x00, 0xaf, 0x00, 0x29, - 0xc0, 0x0b, 0x70, 0x22, 0xdc, 0x00, 0xc7, 0x00, - 0x21, 0xc0, 0x8b, 0xf0, 0x02, 0x1c, 0x00, 0x85, - 0x04, 0x21, 0x40, 0x08, 0x70, 0x00, 0xd2, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, - 0x00, 0xbd, 0x88, 0x20, 0xe0, 0x1a, 0x48, 0x02, - 0xda, 0x00, 0x97, 0x80, 0x27, 0x60, 0x08, 0x78, - 0x02, 0xfe, 0x20, 0x8e, 0x82, 0x27, 0x60, 0x08, - 0x78, 0x02, 0x1e, 0x14, 0xbf, 0x80, 0x29, 0xe0, - 0x08, 0x78, 0x82, 0x5e, 0x04, 0xb7, 0x84, 0x25, - 0xe0, 0x0b, 0x7c, 0x02, 0xde, 0x02, 0x83, 0x84, - 0x61, 0xe0, 0x0b, 0x78, 0x02, 0x1e, 0x00, 0x97, - 0xc0, 0x21, 0xa2, 0xaa, 0x68, 0x02, 0xf0, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xec, - 0x00, 0xb3, 0xc0, 0x26, 0xc4, 0x0b, 0x28, 0x02, - 0xed, 0x00, 0x83, 0x00, 0x2e, 0x55, 0x08, 0x10, - 0x02, 0xcc, 0x00, 0x92, 0x00, 0x24, 0x00, 0x08, - 0x00, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x28, 0x00, - 0x0a, 0x18, 0x12, 0x4c, 0x00, 0xa3, 0x04, 0x28, - 0xc0, 0x0b, 0x30, 0x02, 0xcd, 0x00, 0x83, 0xa0, - 0x60, 0xf4, 0x0b, 0x3d, 0x02, 0x2f, 0x04, 0x93, - 0x40, 0x20, 0xe0, 0x0a, 0x39, 0x42, 0xd2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, 0xed, - 0x09, 0x00, 0xad, 0x01, 0xa8, 0x00, 0xf6, 0xc0, - 0x33, 0xb0, 0x0e, 0xec, 0x23, 0xfa, 0x8c, 0xda, - 0x02, 0x37, 0xa0, 0x2c, 0x64, 0x03, 0xf9, 0x00, - 0xca, 0x00, 0x36, 0x80, 0x0c, 0xa0, 0x03, 0x28, - 0x11, 0xf2, 0x00, 0x3a, 0x80, 0x4c, 0xa0, 0x03, - 0x7a, 0x82, 0xda, 0x01, 0x36, 0x81, 0x1f, 0xe0, - 0x03, 0xf8, 0x40, 0xce, 0xa0, 0xb3, 0x94, 0x0d, - 0xe0, 0x03, 0x3a, 0x02, 0xde, 0x40, 0xb3, 0xa0, - 0x0e, 0xe5, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x00, 0xe0, 0x10, 0xf8, 0x41, - 0xba, 0x00, 0x01, 0x89, 0x03, 0xe1, 0x80, 0xf8, - 0x00, 0x3e, 0x02, 0x0f, 0x88, 0x02, 0xe2, 0x04, - 0xf8, 0x00, 0xbb, 0x00, 0x0f, 0xc0, 0x03, 0xf0, - 0x01, 0xfc, 0x00, 0x07, 0x00, 0x4f, 0x84, 0x43, - 0xa0, 0x00, 0xf0, 0x00, 0x3e, 0x00, 0x0f, 0x84, - 0x03, 0xe0, 0x02, 0xe8, 0x00, 0x3c, 0x10, 0x0f, - 0x84, 0x83, 0xe1, 0xc0, 0xe8, 0x20, 0x3e, 0x00, - 0x89, 0x80, 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, 0xc9, 0x0a, - 0xba, 0x72, 0xac, 0x90, 0x03, 0x24, 0x00, 0xc9, - 0x00, 0x3e, 0x40, 0x4f, 0x90, 0x03, 0x24, 0x10, - 0x79, 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x03, 0xe5, - 0x00, 0xf9, 0x80, 0x3a, 0x49, 0x0f, 0x92, 0x13, - 0xe4, 0x00, 0xc9, 0x00, 0xba, 0x40, 0x0f, 0x91, - 0x02, 0x26, 0x00, 0xf9, 0x20, 0x3e, 0x40, 0x0c, - 0x92, 0x03, 0x26, 0x00, 0xc9, 0x40, 0x3c, 0x60, - 0x2c, 0x90, 0x23, 0x02, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x04, 0x64, 0x04, 0xa9, 0x08, - 0x2a, 0x70, 0x28, 0x1c, 0x22, 0xa4, 0x00, 0xd9, - 0x00, 0x2e, 0x41, 0x08, 0x90, 0x0a, 0x24, 0x00, - 0xb9, 0x00, 0x2c, 0x40, 0x0a, 0x90, 0x02, 0xe7, - 0x00, 0xb9, 0x40, 0x22, 0x78, 0x0b, 0x9c, 0x02, - 0xe4, 0x00, 0xed, 0x09, 0x00, 0xae, 0x01, 0x89, - 0x00, 0x22, 0x40, 0x0b, 0x9c, 0x02, 0x27, 0x40, - 0xb9, 0x00, 0x2e, 0x42, 0x08, 0x90, 0x0a, 0x27, - 0x42, 0x89, 0x00, 0x2e, 0x50, 0x08, 0x94, 0x02, - 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x01, 0x24, 0x00, 0x8b, 0x10, 0x2a, 0xd0, 0x09, - 0x98, 0x0a, 0x24, 0x40, 0x89, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0x24, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x08, 0xd0, 0x02, 0xf4, 0x00, 0xad, 0x10, - 0xa3, 0x40, 0x0b, 0x90, 0x02, 0xc4, 0x00, 0x89, - 0x00, 0x2a, 0x40, 0x0b, 0x10, 0x02, 0xa5, 0x00, - 0xb9, 0x00, 0x2a, 0x44, 0x08, 0x34, 0x02, 0x24, - 0x21, 0x89, 0x00, 0x2e, 0x58, 0x09, 0x11, 0x00, - 0x06, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x05, 0x00, 0xa1, 0x00, 0xe8, 0x51, 0x29, - 0x98, 0x22, 0x8d, 0x00, 0x91, 0x00, 0x2c, 0x50, - 0x28, 0xb0, 0x02, 0x04, 0x00, 0xb1, 0x02, 0x6d, - 0x40, 0x0a, 0x50, 0x42, 0xd6, 0x00, 0xb5, 0x80, - 0x21, 0x40, 0x0b, 0x10, 0x02, 0xc5, 0x06, 0x81, - 0x40, 0x20, 0x40, 0x0b, 0x14, 0x0a, 0x85, 0x00, - 0x91, 0x40, 0x2c, 0x50, 0x00, 0x14, 0x02, 0x05, - 0x01, 0x83, 0x40, 0x2c, 0x50, 0x09, 0x14, 0x2a, - 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, - 0x0d, 0x60, 0x00, 0xc8, 0x00, 0xba, 0x00, 0x4d, - 0x80, 0x23, 0x20, 0x02, 0xc8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0x20, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x8c, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x33, 0x00, 0x0f, 0xa0, 0x23, 0xe0, 0x00, 0xc8, - 0x00, 0x3a, 0x00, 0x0f, 0xa0, 0x03, 0x80, 0x00, - 0xfa, 0x00, 0x3a, 0x00, 0x0c, 0x80, 0x03, 0x00, - 0x00, 0xc0, 0x00, 0x3c, 0x00, 0x0d, 0xa0, 0x03, - 0x2e, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x1d, 0xe4, 0x00, 0xf7, 0x04, 0xed, 0x09, 0x00, - 0xaf, 0x01, 0x3f, 0x51, 0x2e, 0xd0, 0x03, 0xf4, - 0x00, 0xf9, 0x00, 0x3d, 0x40, 0x0f, 0xd0, 0x03, - 0xf4, 0x00, 0xf9, 0x03, 0x3e, 0x40, 0x0f, 0x90, - 0x41, 0xe4, 0x04, 0xf9, 0x00, 0x3e, 0x40, 0x0b, - 0x50, 0x13, 0xf4, 0x00, 0xf9, 0x44, 0x3e, 0x40, - 0x0f, 0xd4, 0x03, 0x75, 0x00, 0xfd, 0x44, 0x3f, - 0x50, 0x2f, 0xd4, 0x03, 0xf5, 0x00, 0xfd, 0x40, - 0x3f, 0x50, 0x0e, 0xd4, 0x03, 0xe6, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, 0x00, - 0xf5, 0x00, 0x33, 0x40, 0x0c, 0xd0, 0x03, 0xf4, - 0x40, 0xc9, 0x00, 0x3e, 0x40, 0x0f, 0xd0, 0x01, - 0x84, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x07, 0x90, - 0x03, 0xd4, 0x00, 0x6d, 0x00, 0x3f, 0x40, 0x07, - 0x50, 0x03, 0xe4, 0x40, 0xc9, 0x20, 0x3e, 0x40, - 0x0f, 0xd3, 0x03, 0x3c, 0x00, 0xcd, 0x00, 0x3f, - 0x44, 0x0f, 0xd2, 0x03, 0x34, 0xa0, 0xfd, 0x30, - 0x33, 0x40, 0x0c, 0xd0, 0x03, 0x06, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, 0x80, - 0xb8, 0x00, 0xa2, 0x12, 0x28, 0x80, 0x02, 0xe0, - 0x00, 0xa8, 0x00, 0x2e, 0x08, 0x88, 0x80, 0x07, - 0xa0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, 0xc0, - 0x02, 0xe0, 0x00, 0x88, 0x04, 0x3e, 0x00, 0x0b, - 0x80, 0x02, 0xc0, 0x00, 0xd8, 0x28, 0x2e, 0x00, - 0x0b, 0x83, 0x02, 0x21, 0x22, 0x80, 0x08, 0x2e, - 0x04, 0x4b, 0x82, 0x8b, 0x60, 0x88, 0xb8, 0x34, - 0x22, 0x92, 0x28, 0x80, 0x83, 0x4e, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, 0xa0, - 0xb9, 0x00, 0x20, 0xec, 0x08, 0x30, 0x02, 0xc4, - 0x00, 0x81, 0x00, 0x2c, 0x4b, 0x0b, 0x18, 0x02, - 0x84, 0x00, 0xb5, 0x00, 0x2d, 0x40, 0x0b, 0x50, - 0x02, 0xc4, 0x00, 0xa1, 0x00, 0x68, 0x40, 0x0b, - 0x10, 0x02, 0xe4, 0x00, 0xa1, 0x30, 0x2c, 0x40, - 0xed, 0x09, 0x00, 0xb0, 0x01, 0x0b, 0x12, 0x22, - 0x0c, 0xc0, 0x81, 0x90, 0x2c, 0x40, 0x0b, 0x13, - 0x02, 0x44, 0xb0, 0xb1, 0x20, 0x28, 0x4c, 0x0a, - 0x11, 0x02, 0x82, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, 0x00, 0x22, - 0x40, 0x08, 0xb2, 0xa2, 0xe4, 0x40, 0xa9, 0x00, - 0x2c, 0x49, 0x08, 0x90, 0x02, 0xa4, 0x00, 0xb9, - 0x00, 0x2f, 0x40, 0x0b, 0xd0, 0x22, 0xe4, 0x00, - 0x8b, 0x00, 0x6e, 0xc0, 0x0b, 0xb0, 0x42, 0xe5, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, - 0x24, 0x00, 0x89, 0x21, 0x2e, 0x62, 0x0b, 0x12, - 0x02, 0x2d, 0x01, 0xb1, 0x00, 0x2a, 0x44, 0x0a, - 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf1, 0x40, 0x32, - 0x60, 0x0c, 0x90, 0x03, 0xe6, 0x00, 0xc9, 0x00, - 0x3e, 0x40, 0x3f, 0x91, 0x43, 0xa6, 0x80, 0xf9, - 0x00, 0x1e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x09, - 0xe9, 0x00, 0x3a, 0x40, 0x0f, 0x91, 0x01, 0xe5, - 0x00, 0xe9, 0x00, 0x3e, 0x40, 0x0f, 0x97, 0x0b, - 0x26, 0x80, 0xc9, 0x80, 0x3e, 0x40, 0x0f, 0x96, - 0x02, 0x64, 0x00, 0xf9, 0xc8, 0x3a, 0x60, 0x4e, - 0x90, 0x0b, 0xa8, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x00, 0xa4, 0x00, 0xf9, 0x90, 0x3c, - 0x50, 0x0f, 0x90, 0x03, 0xe6, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x2f, 0x98, 0x43, 0xe6, 0x80, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3a, 0x40, 0x0f, 0x98, 0x03, 0xe4, - 0x00, 0xd9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x23, - 0xe4, 0x80, 0xf9, 0x08, 0x3e, 0x40, 0x0f, 0x90, - 0x13, 0xe6, 0x60, 0xf9, 0x24, 0xb4, 0x61, 0x0d, - 0x92, 0x83, 0x4a, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x10, 0xa0, 0x00, 0xd8, 0x80, 0x32, - 0x20, 0x0c, 0x80, 0xed, 0x09, 0x00, 0xb1, 0x01, - 0x03, 0xe0, 0x20, 0xc8, 0x00, 0x3e, 0x00, 0x0d, - 0x88, 0x03, 0xa0, 0x08, 0xcc, 0x00, 0x3f, 0x00, - 0x0c, 0xc0, 0x23, 0xe0, 0x82, 0xc8, 0x04, 0x3e, - 0x08, 0x0f, 0x89, 0x23, 0x20, 0x04, 0xc8, 0x00, - 0xba, 0x00, 0x0f, 0x80, 0x03, 0x20, 0x80, 0xf8, - 0x00, 0x32, 0x30, 0x2e, 0x81, 0x03, 0xe1, 0x00, - 0xf8, 0x00, 0xb2, 0x00, 0x2c, 0x80, 0x03, 0x0a, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x04, - 0x28, 0x00, 0x8e, 0x40, 0x23, 0x80, 0xaa, 0xe0, - 0x02, 0xfb, 0x00, 0x8a, 0x02, 0x2e, 0x80, 0x0a, - 0xe4, 0x02, 0xe8, 0x02, 0xca, 0x00, 0x6e, 0x80, - 0x0a, 0xa0, 0x02, 0xdb, 0x08, 0x8e, 0xa1, 0x2f, - 0xa0, 0x0b, 0xec, 0x03, 0x48, 0x00, 0xda, 0x00, - 0x36, 0x80, 0x0b, 0xe0, 0x02, 0x38, 0x00, 0xee, - 0xe1, 0x23, 0xa0, 0x88, 0xe8, 0x02, 0xf8, 0x00, - 0xbe, 0x00, 0x03, 0xb0, 0x00, 0xe0, 0x0a, 0x0a, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x4c, 0x00, 0x93, 0x10, 0x20, 0xc0, 0x08, 0x00, - 0x02, 0xec, 0x00, 0x83, 0x00, 0x2c, 0xc0, 0x09, - 0x30, 0x12, 0xc8, 0x04, 0x80, 0x00, 0x2c, 0x00, - 0x08, 0x00, 0x02, 0xc3, 0x00, 0x80, 0x01, 0x2c, - 0x21, 0x0b, 0x10, 0x52, 0x8c, 0x00, 0x03, 0x00, - 0x28, 0xc0, 0x0b, 0xb8, 0x02, 0x2c, 0x10, 0xa3, - 0xc0, 0x20, 0xe0, 0x0a, 0x38, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x20, 0xf2, 0x00, 0xb0, 0x00, 0x0a, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, - 0x1e, 0x08, 0x8f, 0x00, 0x21, 0xc0, 0x0a, 0x40, - 0x02, 0xdc, 0x24, 0x87, 0x02, 0x2d, 0xc8, 0x4a, - 0x74, 0x02, 0xda, 0x00, 0x85, 0x00, 0x2d, 0xe0, - 0x0a, 0x70, 0x12, 0xdd, 0x00, 0x84, 0x02, 0x6d, - 0xc2, 0x1b, 0xf8, 0x02, 0xdc, 0x80, 0x97, 0x90, - 0x25, 0xc0, 0x0b, 0x70, 0x8a, 0x1c, 0xed, 0x09, - 0x00, 0xb2, 0x01, 0x00, 0xa7, 0x80, 0x21, 0xe3, - 0x08, 0x50, 0x22, 0x5c, 0x20, 0xb5, 0x00, 0x21, - 0xc2, 0x08, 0x30, 0x02, 0x28, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x08, 0x3f, 0x80, 0xd7, - 0x80, 0x33, 0xe0, 0x28, 0x78, 0x13, 0xfe, 0x02, - 0xc7, 0x80, 0x3f, 0xf0, 0x0d, 0x78, 0x03, 0x9a, - 0x00, 0xc4, 0x80, 0x2d, 0x20, 0x08, 0x48, 0x02, - 0xde, 0x00, 0x47, 0x80, 0x3d, 0xe0, 0x0b, 0x78, - 0x43, 0x9e, 0xa2, 0xcf, 0xa0, 0x39, 0xe0, 0x0f, - 0x38, 0x03, 0x1e, 0x00, 0xe7, 0x80, 0xb3, 0xe0, - 0x0e, 0x68, 0x03, 0xde, 0x00, 0xf3, 0x80, 0x30, - 0xa0, 0x08, 0x68, 0x03, 0x2a, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x1d, 0xac, 0x00, 0xfb, - 0x00, 0x8e, 0x40, 0x0f, 0xa0, 0x03, 0xec, 0x08, - 0xfb, 0x00, 0x3e, 0xd8, 0x2d, 0xb0, 0x03, 0xe8, - 0x00, 0xe9, 0x00, 0x3c, 0xc1, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x23, 0x6d, 0x40, 0xfb, 0x08, 0x3e, 0xc0, 0x0f, - 0xa0, 0x43, 0xe8, 0x00, 0xeb, 0x00, 0x3e, 0xc0, - 0x0f, 0x90, 0x03, 0xec, 0x00, 0xfa, 0x02, 0x3e, - 0x00, 0x0f, 0x90, 0x03, 0xc2, 0x06, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xe7, - 0x80, 0xbb, 0xe0, 0x4c, 0xc8, 0x03, 0xde, 0x00, - 0xcf, 0x90, 0x3f, 0xf1, 0x0c, 0xe8, 0x07, 0x78, - 0x08, 0xf4, 0x90, 0x33, 0x20, 0x0f, 0xc8, 0x13, - 0x1e, 0x06, 0xce, 0x90, 0x3f, 0xe0, 0x07, 0xf8, - 0x03, 0xfe, 0x00, 0xff, 0x80, 0x33, 0xe0, 0x0f, - 0xd8, 0x03, 0x7e, 0x00, 0xcf, 0x80, 0x33, 0x20, - 0x0c, 0xf8, 0x03, 0xfe, 0x00, 0x7f, 0x80, 0x33, - 0x60, 0x0c, 0xf8, 0x03, 0x00, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x11, 0xbc, 0x00, 0x86, - 0x20, 0x35, 0xc0, 0x08, 0x41, 0x02, 0xdd, 0x00, - 0x87, 0xed, 0x09, 0x00, 0xb3, 0x01, 0x00, 0x2d, - 0xc4, 0x48, 0x74, 0x07, 0x18, 0x88, 0xb5, 0x00, - 0x21, 0xc8, 0x4b, 0x70, 0x02, 0x55, 0x00, 0x86, - 0x00, 0x2d, 0x84, 0x0b, 0x61, 0x02, 0xdc, 0x80, - 0xb7, 0x00, 0x21, 0xc0, 0x0b, 0x51, 0x82, 0xdc, - 0x02, 0x8c, 0x00, 0x21, 0x00, 0x0a, 0x74, 0x02, - 0xd8, 0x00, 0xb5, 0x00, 0x35, 0x08, 0x08, 0x60, - 0x02, 0x2a, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9c, 0x00, 0xae, 0x00, 0x69, 0xd0, - 0x08, 0x70, 0x82, 0xfc, 0x00, 0x87, 0x04, 0x2d, - 0xc0, 0x28, 0x60, 0x0a, 0x18, 0x40, 0xb4, 0x01, - 0x21, 0x00, 0x1b, 0x48, 0x02, 0x78, 0x00, 0x85, - 0x04, 0x6d, 0x42, 0x0b, 0x50, 0x02, 0xdc, 0x01, - 0xb7, 0x00, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xc4, - 0x00, 0x87, 0x08, 0x21, 0x96, 0x08, 0x40, 0x02, - 0xd4, 0x20, 0xb7, 0x10, 0x21, 0xd1, 0x08, 0x20, - 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x14, 0xcc, 0x00, 0x80, 0x00, 0x24, 0x40, - 0x48, 0x28, 0x02, 0xc0, 0x00, 0x83, 0x00, 0x2c, - 0xd0, 0x08, 0x24, 0x02, 0x0a, 0x00, 0xb1, 0x00, - 0x20, 0xd0, 0x0b, 0x31, 0x02, 0x4c, 0x20, 0x81, - 0x51, 0x6c, 0xe0, 0x1b, 0x38, 0x02, 0xcd, 0x00, - 0xb3, 0x00, 0xa0, 0xc0, 0x0b, 0xa4, 0x02, 0xc0, - 0x04, 0x80, 0x60, 0x20, 0xa0, 0x0a, 0x95, 0x02, - 0xc3, 0x80, 0xb2, 0x00, 0x26, 0x00, 0x08, 0x04, - 0x02, 0x08, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x15, 0xbc, 0x00, 0xeb, 0x40, 0x3a, 0xe0, - 0x2c, 0x08, 0x03, 0xe1, 0x40, 0xcb, 0x00, 0x3d, - 0xd4, 0x2c, 0x28, 0x03, 0x28, 0xc0, 0xf8, 0x00, - 0x32, 0x04, 0x0f, 0x88, 0x03, 0x6c, 0x20, 0xc9, - 0x00, 0x3e, 0xe0, 0x0f, 0xba, 0x03, 0xfe, 0x90, - 0xff, 0x00, 0x32, 0xc0, 0x0f, 0xac, 0x03, 0x6c, - 0x68, 0xcb, 0x00, 0xb2, 0xed, 0x09, 0x00, 0xb4, - 0x01, 0xe0, 0x2c, 0xb4, 0x03, 0xef, 0x08, 0xfa, - 0xa0, 0x32, 0xc0, 0x2c, 0x90, 0x03, 0x2a, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, - 0x00, 0xfb, 0x11, 0x3e, 0xe0, 0x8f, 0x84, 0x83, - 0xe1, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xa5, - 0x13, 0xa8, 0x00, 0xf9, 0x00, 0x3e, 0xc0, 0x0f, - 0xb2, 0x03, 0xa9, 0x00, 0xf9, 0x00, 0x3e, 0x50, - 0x0f, 0x90, 0x03, 0xec, 0x04, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xa0, 0x03, 0xe4, 0x00, 0xf3, 0x00, - 0x3e, 0xc0, 0x5d, 0x80, 0x03, 0xe4, 0x00, 0xf8, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xe0, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, - 0x00, 0xff, 0x88, 0xb0, 0xc0, 0x0c, 0xd8, 0x02, - 0x30, 0x00, 0xcf, 0x00, 0x3f, 0xc0, 0x0c, 0xe8, - 0x83, 0x38, 0x01, 0xfc, 0x00, 0x33, 0x00, 0x0f, - 0xc0, 0x03, 0xf5, 0x00, 0xde, 0x0d, 0x3f, 0x92, - 0x0c, 0xf9, 0x03, 0xfc, 0x20, 0xeb, 0x00, 0x3f, - 0xc0, 0x0f, 0xd0, 0x8b, 0x3e, 0x00, 0xfc, 0x10, - 0x31, 0x20, 0x08, 0xe0, 0x83, 0x38, 0x18, 0xf1, - 0x82, 0x33, 0x80, 0x0c, 0x41, 0x83, 0x00, 0x44, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, - 0x00, 0xb3, 0x80, 0x22, 0x40, 0x08, 0xbc, 0x02, - 0x02, 0x00, 0x8b, 0x02, 0x2e, 0xc0, 0x88, 0xa8, - 0x02, 0xa8, 0x10, 0xb1, 0x04, 0x22, 0xc0, 0x8b, - 0xb0, 0x02, 0xec, 0x00, 0xba, 0x40, 0x38, 0xd0, - 0x0c, 0xb8, 0x12, 0xec, 0x00, 0x8b, 0x01, 0x2e, - 0xc0, 0x0b, 0x81, 0x02, 0x20, 0x40, 0xb8, 0x00, - 0x22, 0x34, 0x05, 0x80, 0x02, 0x23, 0x00, 0xb8, - 0x10, 0x22, 0x00, 0x0a, 0x90, 0x02, 0x20, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, - 0x00, 0xbb, 0x20, 0x22, 0xe0, 0x08, 0x82, 0x02, - 0xa2, 0x00, 0xab, 0x00, 0x2e, 0xc0, 0x08, 0xed, - 0x09, 0x00, 0xb5, 0x01, 0xa2, 0x42, 0x28, 0x00, - 0xb8, 0x00, 0x22, 0x00, 0x0b, 0x80, 0x02, 0xec, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x08, 0xb0, 0x02, - 0xcc, 0x00, 0xab, 0x00, 0x2e, 0xc0, 0x0b, 0x80, - 0x00, 0x28, 0x00, 0xbb, 0x00, 0x22, 0x50, 0x2a, - 0xb0, 0x00, 0x2c, 0x80, 0xba, 0x00, 0x22, 0x40, - 0x0a, 0x90, 0x02, 0x20, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb2, 0x00, - 0x20, 0x20, 0x08, 0x80, 0x0a, 0xa0, 0x00, 0x83, - 0x00, 0x2e, 0xc0, 0x08, 0x80, 0x02, 0x88, 0x04, - 0xb1, 0x00, 0x20, 0xc0, 0x1b, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x28, 0xc0, 0x08, 0x30, 0x32, - 0xcc, 0x02, 0x83, 0x00, 0x2c, 0xc0, 0x0b, 0x08, - 0x06, 0x02, 0x00, 0xb0, 0x81, 0xa0, 0x40, 0x09, - 0x20, 0x02, 0x00, 0x00, 0xb0, 0x81, 0x20, 0x00, - 0x4a, 0x20, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xfa, 0x00, - 0x32, 0xc0, 0x2c, 0xb0, 0x03, 0xa0, 0x00, 0xeb, - 0x00, 0x3d, 0xc0, 0x0c, 0xa0, 0x12, 0x28, 0x10, - 0xb8, 0x00, 0x32, 0x00, 0x0f, 0x80, 0x43, 0xec, - 0x00, 0xd8, 0x00, 0x3e, 0xc0, 0x0c, 0xb0, 0x03, - 0xfc, 0x02, 0xaf, 0x00, 0x3e, 0xc0, 0x8f, 0x90, - 0x03, 0x20, 0x00, 0xf8, 0x00, 0x30, 0x00, 0x0e, - 0x80, 0x23, 0x20, 0x00, 0xf9, 0x00, 0xb0, 0xc0, - 0x0c, 0x80, 0x03, 0x00, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, 0xfe, 0x00, - 0x3f, 0xc0, 0x0f, 0xd0, 0x03, 0x70, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x2f, 0x40, 0x03, 0xf8, 0x10, - 0xfd, 0x00, 0x3f, 0xc0, 0x0f, 0x70, 0x03, 0xf0, - 0x00, 0xfc, 0x00, 0x3b, 0x00, 0x0e, 0xc0, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xc0, - 0x01, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x8e, - 0xc0, 0x23, 0xed, 0x09, 0x00, 0xb6, 0x01, 0xf0, - 0x04, 0xfc, 0x00, 0x3f, 0x00, 0x2d, 0xc0, 0x03, - 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x05, 0xf0, 0x00, 0xfc, 0x10, 0x3d, 0xca, 0x0f, - 0xf4, 0x03, 0x3c, 0x80, 0xff, 0x20, 0x37, 0x04, - 0x0c, 0xf4, 0x03, 0xbd, 0x01, 0xcf, 0x31, 0x33, - 0xc9, 0x0f, 0xe1, 0x03, 0x7c, 0x90, 0xfc, 0x00, - 0x37, 0xc0, 0x0c, 0xc0, 0x03, 0x3c, 0x00, 0xfc, - 0x14, 0x3f, 0xc0, 0x0d, 0x50, 0x03, 0xfc, 0x10, - 0xff, 0x00, 0x37, 0xc0, 0x0c, 0x72, 0x03, 0x7c, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0xa4, 0x04, 0xb9, 0x20, 0x2f, 0xd0, 0x0b, - 0xf3, 0x02, 0x3d, 0x00, 0xbf, 0x40, 0x26, 0x48, - 0x08, 0xf3, 0x02, 0x2c, 0x00, 0xbf, 0x60, 0x23, - 0xd0, 0x0f, 0x12, 0x42, 0x3c, 0x40, 0xfb, 0x01, - 0x2f, 0xd6, 0x88, 0xb0, 0x02, 0xbd, 0x28, 0xbb, - 0x00, 0x2f, 0xd0, 0x08, 0xb0, 0x02, 0xcc, 0xa0, - 0xba, 0x00, 0x22, 0xd4, 0x0a, 0xb4, 0x02, 0x2c, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, - 0x04, 0xc2, 0xa0, 0xb0, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0x0d, 0x00, 0xb3, 0x10, 0x2c, 0x08, - 0x88, 0x32, 0x02, 0x8c, 0x80, 0xb3, 0x64, 0x20, - 0xd0, 0x0b, 0x90, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc8, 0x0a, 0x30, 0x02, 0x0c, 0xc0, 0xb2, - 0x00, 0x2c, 0xc4, 0x09, 0x32, 0xe2, 0xc4, 0x80, - 0xbb, 0x28, 0x24, 0xcb, 0x09, 0x31, 0x02, 0x4c, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x15, 0xa0, 0x00, 0xb8, 0x00, 0x2e, 0xc0, 0x0b, - 0x30, 0x02, 0x2c, 0x00, 0xbb, 0x00, 0x2c, 0x22, - 0x08, 0xb0, 0x02, 0x2c, 0x00, 0xed, 0x09, 0x00, - 0xb7, 0x01, 0xbb, 0x03, 0x22, 0xc0, 0x02, 0x98, - 0x00, 0xac, 0x00, 0xab, 0x20, 0x2e, 0xc0, 0x2a, - 0x82, 0x02, 0xac, 0x00, 0x39, 0x10, 0x2c, 0xc0, - 0x08, 0xb0, 0x42, 0xec, 0xa0, 0xb8, 0x10, 0x22, - 0xc0, 0x0b, 0xb0, 0x02, 0x6c, 0x00, 0xbb, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xf0, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xe6, 0x00, - 0xf9, 0x80, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0x2c, - 0x04, 0xfb, 0x02, 0x36, 0x50, 0x0c, 0xb0, 0x03, - 0xac, 0x00, 0xfb, 0x00, 0x32, 0xc0, 0xcb, 0x14, - 0x03, 0xec, 0x00, 0xbb, 0x00, 0x3e, 0xc0, 0x0e, - 0x34, 0x83, 0x2c, 0x00, 0xfb, 0x80, 0x3e, 0xc0, - 0x0d, 0xb8, 0x03, 0xee, 0x00, 0xfb, 0xa0, 0x36, - 0xc0, 0x0d, 0xb0, 0x03, 0x6c, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xb6, 0x80, - 0xfd, 0x20, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x03, 0x37, 0x40, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xd0, - 0x03, 0x7c, 0x00, 0xff, 0x81, 0x3d, 0xc0, 0x0d, - 0xf8, 0x03, 0xfc, 0x08, 0xff, 0x80, 0x3f, 0xc0, - 0x0f, 0xf4, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3d, - 0xc0, 0x0e, 0x70, 0x03, 0xbc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf8, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0xa4, 0x00, - 0xf9, 0x40, 0x3e, 0xc0, 0x8c, 0xb0, 0x03, 0x2c, - 0x00, 0xcb, 0x00, 0x3e, 0x50, 0x0f, 0xb0, 0x03, - 0xac, 0x00, 0xcb, 0x00, 0x7e, 0xc0, 0x0f, 0xa4, - 0x0b, 0x2c, 0x20, 0xfb, 0x30, 0x3e, 0xc0, 0x4c, - 0xb2, 0x00, 0xec, 0x00, 0xdb, 0x40, 0xb2, 0xc0, - 0x0e, 0x90, 0x03, 0x25, 0x00, 0xeb, 0x00, 0x3a, - 0xc0, 0x0e, 0xb0, 0x03, 0x2c, 0x00, 0xfb, 0x00, - 0xed, 0x09, 0x00, 0xb8, 0x01, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xc8, 0x05, 0x24, 0x00, 0xb9, 0x00, 0x2f, - 0xe0, 0x08, 0xf0, 0x02, 0x3c, 0x02, 0x8f, 0x20, - 0x22, 0xc0, 0x0b, 0xf0, 0x03, 0x6c, 0x04, 0x8f, - 0x00, 0x2f, 0xd0, 0x0b, 0x90, 0x02, 0x3c, 0x00, - 0xbb, 0x81, 0x6f, 0xc0, 0x08, 0xba, 0x03, 0xbc, - 0x00, 0xbb, 0x00, 0x23, 0xc0, 0x08, 0xb0, 0x03, - 0x6c, 0x00, 0x83, 0x00, 0x23, 0xc0, 0x08, 0xf2, - 0x03, 0x6c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x05, 0x44, 0x00, 0xb1, 0x00, 0x2c, - 0xc4, 0x08, 0x30, 0x02, 0x0d, 0x81, 0x83, 0xe0, - 0x20, 0x40, 0x0b, 0xb0, 0x02, 0x8c, 0x10, 0xab, - 0x00, 0x2c, 0xe8, 0x0b, 0x10, 0x02, 0x8f, 0x00, - 0xb2, 0x40, 0x2c, 0xc0, 0x00, 0x3c, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x0a, 0x30, 0x02, - 0x0c, 0x00, 0xa3, 0x00, 0x28, 0xc1, 0x0a, 0x32, - 0x02, 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x01, 0x12, 0x08, 0xb4, 0x80, 0x2d, - 0xf0, 0x48, 0x38, 0x52, 0x0e, 0x10, 0x83, 0x80, - 0x21, 0x20, 0x0b, 0x78, 0x02, 0x5e, 0x00, 0xa7, - 0x90, 0x2d, 0xe2, 0x8b, 0x68, 0x02, 0x9e, 0x10, - 0xb7, 0x80, 0x2d, 0xe0, 0xa8, 0x78, 0x02, 0x9e, - 0x00, 0xb7, 0x80, 0x21, 0xe0, 0x08, 0xd8, 0x02, - 0x5a, 0x00, 0x87, 0x80, 0x21, 0xe0, 0x08, 0x78, - 0x02, 0x5e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, - 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x2c, - 0xc0, 0x0c, 0x30, 0x03, 0x0c, 0x60, 0xc3, 0x00, - 0x3c, 0x04, 0x4f, 0xb2, 0x0b, 0xac, 0x00, 0xe3, - 0x00, 0x2c, 0xc0, 0xed, 0x09, 0x00, 0xb9, 0x01, - 0x0f, 0x14, 0x43, 0x8c, 0x20, 0xf3, 0x00, 0x2e, - 0xc0, 0x0c, 0x31, 0x03, 0xcc, 0x00, 0xfb, 0x40, - 0x22, 0xc0, 0x0e, 0x31, 0x03, 0x0c, 0x00, 0xeb, - 0x10, 0x3a, 0xc0, 0x0e, 0x30, 0x03, 0x0c, 0x00, - 0xf3, 0x00, 0x3c, 0xc0, 0x0f, 0x30, 0x03, 0xd2, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, - 0xb8, 0x00, 0xfe, 0x00, 0x3f, 0xc0, 0x23, 0xf0, - 0x83, 0xfd, 0x00, 0xff, 0x10, 0x3f, 0x04, 0x0f, - 0xf0, 0x03, 0xbc, 0x00, 0xdf, 0x04, 0x3f, 0xc0, - 0x0f, 0xd0, 0x03, 0x7c, 0x00, 0x7f, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x43, 0xfc, 0x40, 0xff, 0x00, - 0x3f, 0xc2, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x83, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xd0, - 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, - 0xc4, 0x00, 0xe9, 0x80, 0x92, 0xc9, 0x0f, 0xb0, - 0xa3, 0xec, 0xc0, 0xfb, 0x0c, 0x0e, 0x40, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0xa0, 0x32, 0xee, - 0x0e, 0x90, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc8, 0x0f, 0x80, 0x43, 0x6c, 0x40, 0xc9, 0x80, - 0xb2, 0xf8, 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xe4, 0x1d, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xea, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, - 0x9c, 0x04, 0x85, 0x00, 0x21, 0xda, 0x0b, 0x72, - 0x02, 0xdc, 0x00, 0x37, 0x02, 0x25, 0x40, 0x0f, - 0x73, 0x03, 0xdc, 0x00, 0xb7, 0x28, 0xa1, 0xc8, - 0x08, 0x50, 0x02, 0xdd, 0x20, 0xb7, 0x00, 0x2d, - 0xca, 0x0b, 0x70, 0x02, 0xcc, 0x40, 0x87, 0x00, - 0x20, 0xc4, 0x0f, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0xc8, 0x1c, 0x72, 0x03, 0xdc, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0xed, 0x09, - 0x00, 0xba, 0x01, 0x02, 0xd2, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x00, 0xb6, 0x00, 0xa7, - 0x88, 0x21, 0xe0, 0x0b, 0x7a, 0x02, 0xde, 0x00, - 0xb7, 0xb0, 0x2d, 0xe1, 0x0b, 0x7b, 0x02, 0xde, - 0x00, 0xa7, 0x90, 0x20, 0xc8, 0x0a, 0x58, 0x02, - 0xde, 0x88, 0x37, 0x80, 0x2d, 0xe4, 0x4b, 0x78, - 0x06, 0xde, 0x00, 0x8f, 0x80, 0x21, 0xe8, 0x08, - 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2c, 0xe8, - 0x28, 0x7a, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, - 0xe0, 0x0b, 0x78, 0x02, 0xf0, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x14, 0xc4, 0x00, 0x81, - 0x80, 0x20, 0xc0, 0x03, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x02, 0x24, 0x40, 0x0a, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x20, 0xc1, 0x1a, 0x20, 0x02, - 0xcc, 0x00, 0xb3, 0x10, 0x2c, 0xc0, 0x0b, 0x00, - 0x02, 0xec, 0x00, 0x81, 0x00, 0x20, 0xc0, 0x0a, - 0x10, 0x02, 0xcc, 0x00, 0xb3, 0x10, 0x2c, 0xc0, - 0x08, 0x30, 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xe8, 0x15, 0xb9, 0x00, 0xee, - 0x40, 0x32, 0x80, 0x8b, 0xa0, 0x03, 0xe8, 0x00, - 0xfa, 0x00, 0x3f, 0x98, 0x0b, 0xa0, 0x03, 0xe8, - 0x00, 0xea, 0x00, 0x32, 0x80, 0x0e, 0xe5, 0x03, - 0xe8, 0x00, 0xfe, 0x40, 0x3e, 0x80, 0x0f, 0xec, - 0x83, 0xe8, 0x02, 0xce, 0xc8, 0x32, 0x80, 0x08, - 0xa8, 0x93, 0xf9, 0x04, 0xf6, 0x40, 0x3e, 0x80, - 0x0c, 0x20, 0x02, 0xe8, 0x00, 0xfa, 0x00, 0x3e, - 0x80, 0x0f, 0xa0, 0x03, 0xfa, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0xe2, 0x04, 0xf8, - 0x80, 0x3e, 0x10, 0x0f, 0x80, 0x03, 0xe0, 0x04, - 0xf8, 0x00, 0x36, 0x20, 0x0f, 0x80, 0x03, 0xa0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0d, 0x80, 0x03, - 0xe0, 0xed, 0x09, 0x00, 0xbb, 0x01, 0x00, 0xf8, - 0x80, 0x3e, 0x00, 0x0f, 0x80, 0x83, 0xe0, 0x00, - 0xf8, 0x08, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe2, - 0x00, 0xf8, 0x80, 0x3e, 0x00, 0x0e, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x10, 0xe4, 0x00, 0xc9, 0x00, 0x3e, 0x44, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x01, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xa4, 0x00, 0xf9, 0x00, - 0x3e, 0x60, 0x0c, 0x90, 0x03, 0xc4, 0x00, 0xc9, - 0x00, 0x22, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xc9, 0x00, 0x3e, 0x40, 0x0b, 0x90, 0x03, 0x24, - 0x00, 0xf9, 0x00, 0x32, 0x40, 0x0f, 0x92, 0x03, - 0xa4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x04, 0x64, 0x00, 0x89, 0x01, 0x2e, 0x78, - 0x0b, 0x90, 0x02, 0xe6, 0x40, 0xb9, 0x00, 0x3a, - 0x40, 0x0b, 0x90, 0x03, 0x64, 0x08, 0xb9, 0x00, - 0x2c, 0x64, 0x0a, 0x90, 0x02, 0xe4, 0x22, 0x81, - 0x98, 0x22, 0x40, 0x0b, 0x94, 0x02, 0xe4, 0x00, - 0x89, 0x02, 0x2e, 0x40, 0x09, 0x90, 0x42, 0x24, - 0x00, 0xb9, 0x02, 0x22, 0x40, 0x0b, 0x92, 0x02, - 0xa4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0x04, 0x00, 0x8b, 0x00, 0x2e, 0x40, - 0x1b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x10, 0x2e, - 0x40, 0x0b, 0x10, 0x02, 0xa4, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x08, 0x90, 0x22, 0xe4, 0x80, 0x89, - 0x00, 0x2a, 0x40, 0x8b, 0x98, 0x02, 0xe4, 0x00, - 0x89, 0x00, 0x2e, 0x40, 0x01, 0x10, 0x02, 0x24, - 0x08, 0xb9, 0x00, 0x22, 0x41, 0x0b, 0x90, 0x02, - 0xa4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xc6, 0x00, 0x40, 0xed, 0x09, 0x00, 0xbc, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x05, - 0x02, 0x01, 0x40, 0x2c, 0x40, 0x1b, 0x14, 0x02, - 0xc4, 0x01, 0xb1, 0x80, 0x28, 0x50, 0x03, 0x10, - 0x02, 0x45, 0x00, 0xb1, 0x40, 0x2c, 0x40, 0x08, - 0x14, 0x02, 0xc4, 0x00, 0x81, 0x00, 0x28, 0x50, - 0x0b, 0x18, 0x02, 0xc5, 0x02, 0x81, 0x40, 0x2c, - 0x50, 0x09, 0x14, 0x0a, 0x05, 0x00, 0xb9, 0x40, - 0x20, 0x50, 0x0b, 0x10, 0x02, 0x04, 0x00, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x60, - 0x00, 0x40, 0x00, 0x2e, 0x00, 0x0f, 0x80, 0x03, - 0xe8, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x8f, 0x80, - 0x03, 0xa0, 0x09, 0xf0, 0x01, 0x3e, 0x00, 0x0c, - 0x80, 0x23, 0xe0, 0x00, 0xc8, 0x00, 0x3a, 0x00, - 0x0f, 0x80, 0x03, 0xe0, 0x08, 0xc8, 0x00, 0x3e, - 0x00, 0x5f, 0x80, 0x03, 0x20, 0x00, 0xf8, 0x00, - 0x32, 0x00, 0x8f, 0x80, 0x03, 0xa0, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xee, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x19, 0xf4, - 0x00, 0xfd, 0x00, 0x3e, 0x50, 0x0f, 0x94, 0x03, - 0xe5, 0x04, 0xf9, 0x40, 0x3b, 0x40, 0x4f, 0x96, - 0x83, 0xe4, 0x00, 0xf9, 0x40, 0x3e, 0x50, 0x0f, - 0xd0, 0x03, 0xe5, 0x00, 0xff, 0x00, 0xb6, 0x50, - 0x0f, 0xd0, 0x03, 0xe5, 0x00, 0xf5, 0x00, 0x3e, - 0x51, 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xfd, 0x00, - 0xbe, 0x50, 0x0f, 0x94, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe6, 0x06, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xed, - 0x08, 0x09, 0x40, 0x3b, 0x40, 0x0f, 0x90, 0x03, - 0xf4, 0x00, 0xbd, 0x20, 0x3e, 0x50, 0x0f, 0x91, - 0x03, 0xa4, 0x00, 0xf9, 0x08, 0x3f, 0x40, 0x0f, - 0xb4, 0x03, 0xf4, 0x2c, 0xcd, 0x01, 0x3e, 0xed, - 0x09, 0x00, 0xbd, 0x01, 0x50, 0x0f, 0xd0, 0x43, - 0xe5, 0x20, 0xf9, 0x00, 0x32, 0x42, 0x0f, 0x90, - 0x03, 0xe4, 0x42, 0xe9, 0x00, 0x32, 0x40, 0x0f, - 0xd0, 0x83, 0x24, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x42, 0xc6, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x10, 0xc0, 0x00, 0x80, 0x00, - 0x22, 0x10, 0x0b, 0x86, 0x02, 0xe1, 0x40, 0xb8, - 0x50, 0x2e, 0x00, 0x0b, 0x86, 0x02, 0x20, 0x80, - 0xb8, 0x60, 0x2e, 0x00, 0x09, 0x82, 0x02, 0xe1, - 0x09, 0xd8, 0x00, 0x2e, 0x1c, 0x4b, 0x80, 0x02, - 0xe1, 0x10, 0xb0, 0x00, 0x22, 0x08, 0x0b, 0x80, - 0x02, 0xe0, 0x00, 0xa8, 0x20, 0x22, 0x01, 0x0b, - 0x84, 0x02, 0x20, 0x00, 0xb8, 0x00, 0x2e, 0x00, - 0x0b, 0x80, 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x05, 0xc4, 0x82, 0x99, 0x20, - 0x28, 0x50, 0x0b, 0x14, 0x82, 0xc4, 0x00, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x16, 0x02, 0x84, 0x20, - 0xb1, 0x08, 0x2c, 0x50, 0x0b, 0x12, 0x02, 0xc4, - 0x00, 0x81, 0x00, 0x2c, 0x41, 0x8b, 0x10, 0x02, - 0xc4, 0x00, 0xb9, 0x28, 0x20, 0x42, 0x0b, 0x10, - 0x82, 0xe4, 0x80, 0xa1, 0x0c, 0x20, 0x5a, 0x0b, - 0x10, 0x02, 0x04, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x05, 0xa4, 0x88, 0x99, 0x00, - 0x22, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0x39, - 0x00, 0x2e, 0x40, 0x0b, 0x10, 0x12, 0x24, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x92, 0x02, 0xec, - 0x00, 0x89, 0x10, 0x2e, 0x40, 0x8b, 0x90, 0x02, - 0xe4, 0x00, 0xb9, 0x00, 0x22, 0x40, 0x8b, 0x92, - 0x02, 0xe5, 0x02, 0xa9, 0x10, 0x22, 0x40, 0x0b, - 0x90, 0x00, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0xbe, 0x01, 0xa0, - 0x05, 0xe4, 0x80, 0xd9, 0x0d, 0x3a, 0x40, 0x0b, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x2e, 0x48, - 0x0f, 0x90, 0x13, 0xa4, 0x00, 0xf9, 0x01, 0x3e, - 0x40, 0x07, 0x92, 0x13, 0xc4, 0x02, 0x89, 0x41, - 0x3e, 0x40, 0x0f, 0x9a, 0x03, 0xe4, 0x00, 0xf9, - 0x80, 0xb2, 0x40, 0x0f, 0x90, 0x03, 0xc4, 0x06, - 0xe9, 0x00, 0x32, 0x40, 0x4b, 0x90, 0x01, 0x24, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x01, 0xa4, 0x00, 0xe9, 0x40, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x68, - 0x0f, 0x90, 0x02, 0xe4, 0x00, 0xf9, 0x00, 0x3e, - 0x40, 0x01, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x01, - 0x3e, 0x40, 0x0f, 0x94, 0x03, 0xe4, 0x00, 0xf9, - 0x90, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe5, 0x02, - 0xf9, 0x80, 0xbe, 0x40, 0x0f, 0x10, 0x0a, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x00, 0xa0, 0x00, 0xc8, 0x40, 0x32, 0x20, 0x4e, - 0x80, 0x43, 0x22, 0x00, 0xf8, 0x80, 0x3e, 0x10, - 0x0c, 0x80, 0x03, 0xe0, 0x04, 0xf8, 0x00, 0x32, - 0x20, 0x0f, 0x84, 0x23, 0x22, 0x04, 0xf8, 0x42, - 0x22, 0x00, 0x2c, 0x88, 0x13, 0xe0, 0x05, 0xf8, - 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x32, 0x01, 0x4f, 0x80, 0x03, 0xa0, - 0x00, 0xd8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x15, 0x28, 0x00, 0x82, 0x00, 0x23, 0xb0, 0x0b, - 0xa0, 0x02, 0x39, 0x84, 0xbe, 0xc0, 0x2e, 0x80, - 0x0a, 0xa0, 0x02, 0xe8, 0x00, 0xba, 0x00, 0x23, - 0xb2, 0x0b, 0xa0, 0x02, 0xb9, 0x00, 0xbe, 0x02, - 0x22, 0x80, 0x08, 0xee, 0x02, 0xed, 0x09, 0x00, - 0xbf, 0x01, 0xe8, 0x00, 0xb2, 0x04, 0x22, 0x80, - 0x0b, 0xa0, 0x00, 0xe8, 0x00, 0xba, 0x00, 0x22, - 0x80, 0x0e, 0xee, 0x02, 0xa8, 0x00, 0xba, 0x00, - 0x2e, 0x80, 0x0b, 0xa0, 0x02, 0xca, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x6c, 0x00, - 0x83, 0x00, 0x20, 0x60, 0x0b, 0x30, 0x02, 0x04, - 0x00, 0xb1, 0x80, 0x2c, 0xc0, 0x08, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0xa0, 0xc0, 0x0b, 0x30, - 0x02, 0x06, 0x40, 0xb0, 0x08, 0x20, 0xc0, 0x08, - 0x10, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0xa0, 0xc0, - 0x0b, 0x30, 0x12, 0xcc, 0x00, 0x9b, 0x00, 0xa0, - 0xc0, 0x0b, 0x3e, 0x0a, 0x0c, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xca, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1c, 0x80, - 0x87, 0x20, 0x21, 0x42, 0x0b, 0x3a, 0x02, 0x14, - 0x00, 0xb5, 0x08, 0x2f, 0xe8, 0x0a, 0x72, 0x02, - 0xdc, 0x00, 0xb7, 0xa1, 0x21, 0xc1, 0x0b, 0x78, - 0x02, 0x9c, 0x00, 0xb7, 0xc0, 0x21, 0xe4, 0x08, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x20, 0x21, 0xc8, - 0x0b, 0x70, 0x46, 0xdc, 0x04, 0xbf, 0x00, 0x21, - 0xc8, 0x0b, 0x70, 0x02, 0x1c, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xe8, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x82, - 0xc7, 0xa8, 0xb1, 0x60, 0x8f, 0x79, 0x03, 0x16, - 0x00, 0xf5, 0x81, 0x3d, 0xf9, 0x0c, 0x7c, 0x03, - 0xde, 0x80, 0xf3, 0xa0, 0x31, 0xe0, 0x8f, 0xfa, - 0x0b, 0x1e, 0x00, 0xf7, 0x80, 0x30, 0xea, 0x0c, - 0x78, 0x03, 0xde, 0x80, 0xb7, 0x80, 0x31, 0xe1, - 0x0f, 0x79, 0x03, 0xde, 0x28, 0xf7, 0xa0, 0x31, - 0xe0, 0x0f, 0x78, 0x03, 0x9e, 0x00, 0xd7, 0x80, - 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0xea, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x0d, 0xac, 0xe0, - 0xed, 0x09, 0x00, 0xc0, 0x01, 0xfb, 0x50, 0x3e, - 0x40, 0x0f, 0xb3, 0x0b, 0xe4, 0x00, 0xf9, 0x01, - 0x3c, 0xc8, 0x0f, 0xb0, 0x01, 0xec, 0x00, 0xfb, - 0x52, 0x3e, 0xc0, 0x0f, 0xb6, 0x43, 0x64, 0x00, - 0xf2, 0x02, 0xbe, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0xa8, 0xfb, 0x38, 0x1e, 0xd8, 0x0f, 0xb1, 0x43, - 0xec, 0x80, 0xf3, 0x00, 0x3e, 0xc4, 0x0e, 0x30, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0xfe, 0x00, 0xff, 0x82, 0x33, - 0xa1, 0x0d, 0xf8, 0x03, 0x3a, 0x00, 0xce, 0x81, - 0x1b, 0xf8, 0x0f, 0xfc, 0x03, 0x3f, 0x20, 0x8f, - 0xc0, 0x3f, 0xe4, 0x0f, 0x7c, 0x83, 0x3e, 0x00, - 0xc7, 0x80, 0x37, 0xec, 0x4c, 0x78, 0x03, 0x3e, - 0x20, 0xcf, 0x90, 0x3f, 0xf2, 0x8c, 0xf8, 0x03, - 0x5e, 0x20, 0xc7, 0x88, 0x33, 0xe1, 0x0f, 0xf8, - 0x2b, 0x3e, 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0f, - 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x11, 0x9c, 0x00, 0xbf, 0x00, 0x21, - 0x10, 0x08, 0xf0, 0x02, 0x10, 0x00, 0xd4, 0x00, - 0x21, 0xc0, 0x0b, 0x70, 0x02, 0x1c, 0x00, 0x87, - 0x20, 0x2d, 0xc4, 0x0b, 0x70, 0x02, 0x1c, 0x40, - 0x85, 0x00, 0x21, 0xc4, 0x08, 0x71, 0x82, 0x1c, - 0x00, 0x87, 0x39, 0x2d, 0xc4, 0x08, 0x71, 0x42, - 0xdc, 0x40, 0xa7, 0x10, 0xa1, 0xc0, 0x0b, 0x71, - 0x02, 0x1c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x21, - 0x00, 0x08, 0x70, 0x02, 0x10, 0x00, 0x84, 0x00, - 0x21, 0xc8, 0x8b, 0x30, 0x02, 0x1c, 0x02, 0xb7, - 0x03, 0x2d, 0xc0, 0x0b, 0xf0, 0x02, 0x4c, 0x00, - 0x8f, 0x40, 0x25, 0xc9, 0x08, 0xd0, 0x02, 0x1c, - 0x00, 0x87, 0x00, 0xed, 0x09, 0x00, 0xc1, 0x01, - 0x2d, 0xc0, 0x0a, 0x70, 0x02, 0xfc, 0x00, 0x8f, - 0x00, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0x1c, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xc0, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, - 0xee, 0x20, 0xbb, 0x01, 0x20, 0x00, 0x08, 0x30, - 0x12, 0x04, 0x00, 0x91, 0x01, 0x02, 0xf0, 0x0b, - 0x30, 0x12, 0x0c, 0x08, 0x93, 0x02, 0x2c, 0xc1, - 0x0b, 0x34, 0x02, 0x4c, 0x00, 0x83, 0x00, 0x20, - 0xc0, 0x08, 0x36, 0x02, 0x0c, 0x00, 0x83, 0x80, - 0x2c, 0xc0, 0x08, 0xb9, 0x02, 0xef, 0x00, 0xa3, - 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0x0c, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc8, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x15, - 0xbe, 0x80, 0xff, 0xf0, 0x32, 0xc0, 0x28, 0xf0, - 0x03, 0x2c, 0x00, 0xcb, 0x02, 0x93, 0xd6, 0x0f, - 0xf0, 0x03, 0x3c, 0x00, 0xff, 0x00, 0x3e, 0xc0, - 0x0b, 0xf0, 0x03, 0x6c, 0x00, 0xcb, 0x08, 0x37, - 0xc0, 0x2c, 0xb8, 0x02, 0x3c, 0x00, 0xcf, 0xc1, - 0x3f, 0xc0, 0x0e, 0xf0, 0x03, 0x7d, 0x20, 0xcf, - 0xa0, 0x33, 0xc0, 0x4b, 0xb0, 0x03, 0x2c, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xea, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0xec, 0x00, 0xfb, 0x00, 0xbc, 0x40, 0x0e, 0xb0, - 0x0b, 0xe4, 0x00, 0xf9, 0x41, 0x7e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x10, 0xab, 0x00, 0x3c, 0xc0, - 0x0f, 0xb3, 0x23, 0xad, 0x08, 0xfb, 0x40, 0x3e, - 0xc0, 0x8f, 0x94, 0x03, 0xec, 0x00, 0xfb, 0x20, - 0x3e, 0xc0, 0x0f, 0xb0, 0x13, 0xec, 0x80, 0xfb, - 0x20, 0x3e, 0xc0, 0x1f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xe0, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, - 0xfc, 0x00, 0xcf, 0x00, 0x32, 0x40, 0xed, 0x09, - 0x00, 0xc2, 0x01, 0x0c, 0xf0, 0x03, 0xd6, 0x00, - 0xc9, 0x00, 0x37, 0xc0, 0x4c, 0x70, 0x03, 0x3c, - 0x00, 0xb7, 0x00, 0x33, 0xe9, 0x0c, 0xf0, 0x03, - 0x7d, 0x00, 0xfd, 0x80, 0x3f, 0xc0, 0x0f, 0xf0, - 0x43, 0xdc, 0x00, 0xdf, 0x00, 0x3e, 0xc0, 0x0f, - 0xf0, 0x03, 0x3c, 0x00, 0xef, 0x00, 0x9b, 0xc0, - 0x0b, 0xfa, 0x0b, 0x3c, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xc0, 0x44, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, 0x8b, - 0x00, 0x22, 0x74, 0x08, 0xb0, 0x02, 0xe7, 0x24, - 0x81, 0x90, 0x22, 0xc0, 0x0a, 0xb0, 0x02, 0x2c, - 0x00, 0xbb, 0x01, 0x22, 0xf8, 0x08, 0xb0, 0x02, - 0xef, 0x00, 0xbb, 0xe0, 0x2e, 0xc0, 0x0b, 0xbc, - 0x02, 0xec, 0x00, 0x8b, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x00, 0x2c, 0x04, 0x83, 0x00, 0x2a, 0xc0, - 0x0b, 0x30, 0x02, 0xac, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x40, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, 0x8b, - 0x00, 0x22, 0x00, 0x08, 0xb0, 0x02, 0xe0, 0x80, - 0x88, 0x40, 0x22, 0xc0, 0x88, 0xb0, 0x02, 0x2c, - 0x00, 0xab, 0x00, 0x22, 0xc0, 0x08, 0xb0, 0x06, - 0xe4, 0x04, 0xba, 0x12, 0x2e, 0xc0, 0x0b, 0xb5, - 0x02, 0xec, 0x00, 0x8b, 0x00, 0x06, 0xc0, 0x0b, - 0xb0, 0x02, 0x2c, 0x00, 0xab, 0x00, 0xaa, 0xc0, - 0x4b, 0xb0, 0x82, 0x2c, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x83, - 0x00, 0x20, 0x40, 0x28, 0x30, 0x02, 0xc4, 0x00, - 0x81, 0x00, 0x20, 0xc0, 0x08, 0x30, 0x02, 0x0c, - 0x01, 0xb3, 0x00, 0xa0, 0x80, 0x88, 0x30, 0x06, - 0xcc, 0x00, 0xb3, 0x02, 0x24, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x08, 0x83, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0xed, 0x09, 0x00, 0xc3, 0x01, 0x0a, 0x0c, - 0x00, 0x8b, 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, - 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x7c, 0x00, 0xcf, 0x00, 0xb2, 0x40, - 0x0c, 0xf0, 0x03, 0xe0, 0x00, 0xc8, 0x00, 0x33, - 0xc0, 0x2c, 0xf0, 0x03, 0x1c, 0x00, 0xef, 0x00, - 0x32, 0xc0, 0x2c, 0xf0, 0x03, 0x6c, 0x00, 0xfb, - 0x00, 0x3d, 0xc0, 0x0f, 0xb0, 0x03, 0xdc, 0x00, - 0xcf, 0x01, 0x37, 0xc0, 0x8f, 0xf0, 0x03, 0x3c, - 0x00, 0xeb, 0x01, 0x3a, 0xc1, 0x1f, 0xa0, 0x03, - 0x2c, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x1d, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x00, - 0x0f, 0xf0, 0x03, 0xd0, 0x00, 0xfc, 0x00, 0xaf, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x01, - 0x3f, 0x00, 0x1f, 0xf0, 0x03, 0x70, 0x00, 0xfc, - 0x00, 0x3f, 0xc0, 0x8f, 0xc0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x00, 0xbf, 0xc0, 0x8f, 0x50, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x05, 0xf4, 0x00, 0xcc, 0x00, 0x33, 0x84, - 0x0d, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0x80, 0x0c, 0x70, 0x03, 0x1c, 0x10, 0xf6, 0x00, - 0x3d, 0x40, 0x0c, 0xf0, 0x03, 0xdc, 0x00, 0xfc, - 0x00, 0x3b, 0x80, 0x0f, 0xc0, 0x02, 0xd0, 0x00, - 0xcf, 0x04, 0x33, 0xc0, 0x0f, 0xf0, 0x03, 0xf1, - 0x82, 0xcc, 0x04, 0x33, 0x49, 0x0d, 0xf1, 0x43, - 0xf0, 0x00, 0xff, 0x00, 0x33, 0x00, 0x0f, 0xf0, - 0x03, 0xf0, 0x05, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x10, 0xec, 0x00, 0x8b, 0x00, 0xa2, 0xc8, - 0x08, 0xb0, 0x02, 0xec, 0xed, 0x09, 0x00, 0xc4, - 0x01, 0x00, 0xbb, 0x00, 0x2e, 0x80, 0x08, 0xb0, - 0x02, 0x2c, 0x00, 0x3a, 0x04, 0x2e, 0x00, 0x2a, - 0x80, 0x03, 0xa0, 0x00, 0x9b, 0x00, 0x22, 0x80, - 0x49, 0x80, 0x12, 0xe0, 0x00, 0xdb, 0x00, 0x22, - 0xc0, 0x0b, 0xb0, 0x22, 0xe1, 0x84, 0x88, 0x40, - 0x22, 0x46, 0x0b, 0x80, 0x02, 0xe1, 0x20, 0xbb, - 0x04, 0x20, 0x02, 0x0b, 0xb0, 0x02, 0xe0, 0x02, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, 0xe4, - 0x00, 0x80, 0x00, 0x22, 0xc0, 0x09, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x2e, 0xc0, 0x08, 0xb0, - 0x02, 0x4c, 0x00, 0xa2, 0x00, 0x2e, 0x40, 0x00, - 0x30, 0x02, 0xcc, 0x09, 0xb3, 0x00, 0x28, 0xc0, - 0x0b, 0x00, 0x02, 0xe8, 0x00, 0xa3, 0x00, 0x64, - 0xc0, 0x0b, 0x30, 0x02, 0xc1, 0x00, 0xb0, 0x10, - 0x20, 0x48, 0x0b, 0x20, 0x12, 0xc1, 0x88, 0xb3, - 0x00, 0x20, 0x04, 0x0b, 0x30, 0x02, 0xe2, 0x01, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xa8, - 0x00, 0x8b, 0x00, 0x22, 0x40, 0x08, 0xb0, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x08, 0xb0, - 0x02, 0x6c, 0x11, 0xba, 0x00, 0x2e, 0x00, 0x08, - 0x80, 0x12, 0xe0, 0x00, 0x9b, 0x88, 0x62, 0xd0, - 0x09, 0xa2, 0x82, 0xec, 0x00, 0x1b, 0x00, 0x26, - 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x80, 0xbb, 0x40, - 0x62, 0x44, 0x0b, 0x90, 0x02, 0xec, 0x20, 0xbb, - 0x00, 0x22, 0x08, 0x0b, 0xb0, 0x02, 0xf0, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, 0xed, - 0x00, 0xc8, 0x88, 0x32, 0xd0, 0x0d, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3c, 0xe8, 0x0c, 0x1c, - 0x03, 0x6a, 0x00, 0xfa, 0x02, 0x3e, 0x40, 0x0c, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3a, 0xf0, - 0x8f, 0x88, 0x03, 0xe9, 0x00, 0xe3, 0xc0, 0x36, - 0xc0, 0x0f, 0xb0, 0x03, 0xe1, 0x00, 0xf0, 0xed, - 0x09, 0x00, 0xc5, 0x01, 0xc4, 0x32, 0x60, 0x4d, - 0xa8, 0x03, 0xe0, 0x00, 0xfb, 0x00, 0x12, 0x32, - 0x0f, 0xb0, 0x03, 0xd0, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x01, 0xbc, 0x00, 0xff, 0xc0, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xd0, 0x4f, 0xe4, 0x03, 0xbd, 0x00, - 0xfe, 0x00, 0x3f, 0x00, 0x0b, 0xc0, 0x03, 0xb0, - 0x04, 0xfc, 0x00, 0x3f, 0xe4, 0x0f, 0xd0, 0x03, - 0xf8, 0x40, 0xff, 0x10, 0xbb, 0xc0, 0x0f, 0xf0, - 0x23, 0xec, 0x00, 0x8b, 0x10, 0xbf, 0xe0, 0x0f, - 0xd2, 0x43, 0xfe, 0x40, 0x7f, 0x00, 0x3f, 0xe0, - 0x4f, 0xf0, 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x10, 0xad, 0x00, 0xea, 0x40, - 0x32, 0xf0, 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xd0, 0x0f, 0xb4, 0x23, 0x28, 0x40, - 0xda, 0x00, 0x32, 0x40, 0x0c, 0xb0, 0x83, 0xec, - 0x08, 0xcb, 0x00, 0x32, 0xd0, 0x0f, 0xb4, 0x03, - 0xec, 0x00, 0xcb, 0x42, 0x32, 0xc0, 0x0f, 0xb0, - 0x07, 0xcd, 0x22, 0xc8, 0x40, 0x32, 0xe8, 0x2c, - 0xb0, 0x03, 0xe1, 0x20, 0xcb, 0x00, 0x7e, 0xc4, - 0x0c, 0xb0, 0x03, 0xd0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0xc8, 0x01, 0x0c, 0x00, 0x83, 0x10, - 0x28, 0x40, 0x0d, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xf4, 0x0b, 0xb2, 0x02, 0x2c, 0x00, - 0x8a, 0x01, 0x28, 0x14, 0x28, 0x88, 0x02, 0xe0, - 0x70, 0x83, 0x20, 0x22, 0xe1, 0x0b, 0xb1, 0x02, - 0xcf, 0x00, 0x0b, 0x00, 0x22, 0xc0, 0x0b, 0xb0, - 0x02, 0xed, 0x18, 0x0b, 0x50, 0x22, 0xd0, 0x08, - 0x8c, 0x82, 0xef, 0x00, 0xd3, 0x05, 0x72, 0xd4, - 0x28, 0xb0, 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x05, 0x44, 0x00, 0xa1, 0xc0, - 0x20, 0xc0, 0x08, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xed, 0x09, 0x00, 0xc6, 0x01, 0xe0, - 0x0b, 0x34, 0x82, 0x06, 0x00, 0xa2, 0x00, 0x20, - 0x40, 0x0a, 0x3c, 0x02, 0xcd, 0x00, 0x93, 0x20, - 0x24, 0xe8, 0x03, 0x00, 0x02, 0xc8, 0xc0, 0xa2, - 0xc8, 0x24, 0xc0, 0x0b, 0x30, 0x02, 0xc3, 0x40, - 0x80, 0x42, 0x64, 0x50, 0x11, 0x28, 0x02, 0xc3, - 0x50, 0x83, 0x18, 0x28, 0x30, 0x08, 0x30, 0x02, - 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x01, 0x3e, 0x04, 0x8f, 0xa2, 0x29, 0xe0, 0x09, - 0x78, 0x02, 0xde, 0x00, 0xb7, 0x82, 0x2d, 0xe0, - 0x0b, 0x78, 0x02, 0x1e, 0x04, 0x86, 0x80, 0x2b, - 0x20, 0x08, 0x48, 0x02, 0xf2, 0x40, 0x9f, 0x80, - 0x25, 0xe2, 0x0b, 0x48, 0x12, 0xda, 0x00, 0xaf, - 0x80, 0x25, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x50, - 0x84, 0xa0, 0x25, 0xe0, 0x99, 0x7c, 0x02, 0xc2, - 0x00, 0x97, 0x84, 0x21, 0xe4, 0x08, 0x78, 0x02, - 0xc8, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x08, 0x04, 0x00, 0xe1, 0x08, 0x32, 0xc0, 0x2c, - 0x30, 0x03, 0xcc, 0x00, 0xf3, 0x00, 0x3c, 0x82, - 0x0f, 0x30, 0x03, 0x0c, 0x08, 0xe2, 0x00, 0x30, - 0x44, 0x0e, 0x30, 0x83, 0xcc, 0x02, 0xd0, 0x00, - 0x34, 0x40, 0x0f, 0x20, 0x03, 0xcd, 0x02, 0xe3, - 0x48, 0x34, 0xc0, 0x0b, 0x30, 0x02, 0xcd, 0x00, - 0xc3, 0x00, 0xb6, 0xc0, 0x99, 0x30, 0x03, 0xcc, - 0x40, 0xc3, 0x00, 0x38, 0xc0, 0x0c, 0x30, 0x03, - 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x1d, 0x9c, 0x00, 0xf7, 0x24, 0x3f, 0x44, 0x0e, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x80, - 0x8f, 0xf0, 0x10, 0xfc, 0x00, 0xee, 0x00, 0x1f, - 0x04, 0x8f, 0xc1, 0x03, 0xf2, 0x00, 0xe7, 0x00, - 0xbb, 0xc4, 0x0f, 0xe1, 0x07, 0xfc, 0x00, 0xd7, - 0x00, 0x3b, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x24, 0x3b, 0xc0, 0x0e, 0xed, 0x09, 0x00, - 0xc7, 0x01, 0xe5, 0x03, 0xfc, 0x00, 0xff, 0x10, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xd0, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, 0xec, 0x00, - 0xf3, 0x80, 0x32, 0xe1, 0x0c, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3c, 0x40, 0x4e, 0xb0, 0x03, - 0xe4, 0x00, 0x7a, 0x00, 0x3e, 0x40, 0x0f, 0x38, - 0x03, 0x2c, 0x00, 0xcb, 0x00, 0x3e, 0xe0, 0x4c, - 0x90, 0x03, 0xe8, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xe2, 0x02, 0xcb, 0x80, 0x32, - 0x40, 0x0c, 0xb4, 0x03, 0xec, 0x10, 0xfb, 0x00, - 0x3e, 0x00, 0x0c, 0xb0, 0x03, 0xea, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, 0x04, - 0xb7, 0x00, 0x23, 0xc0, 0x08, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x08, 0x70, 0x02, - 0xdc, 0x00, 0xb6, 0x00, 0x2d, 0x00, 0x0b, 0x40, - 0x02, 0x10, 0x00, 0xa7, 0x00, 0x2d, 0xc0, 0x08, - 0x50, 0x12, 0xd8, 0x00, 0xb7, 0x01, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xfc, 0x00, 0x83, 0x02, 0x21, - 0xc0, 0x0d, 0x60, 0x02, 0xdc, 0x10, 0xb7, 0x00, - 0x2f, 0xc0, 0x08, 0x70, 0x02, 0xd2, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, 0x00, - 0xbf, 0x88, 0x21, 0xe0, 0x08, 0x78, 0x02, 0xde, - 0x00, 0xb7, 0x80, 0x2f, 0xe0, 0x82, 0x78, 0x02, - 0xde, 0x00, 0xb6, 0x80, 0x2d, 0x60, 0x0b, 0xf8, - 0x42, 0x1e, 0x00, 0x87, 0x82, 0x6d, 0xe0, 0x0a, - 0x78, 0x02, 0xde, 0x04, 0xb5, 0x80, 0x6d, 0xe0, - 0x0b, 0x78, 0x02, 0xde, 0x00, 0xa7, 0x80, 0x21, - 0xe0, 0x08, 0x68, 0x02, 0xde, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x08, 0x78, 0x02, 0xf0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xce, 0x00, - 0xb3, 0x81, 0xa0, 0x40, 0x08, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xe0, 0x58, 0x3a, 0x02, - 0xed, 0x09, 0x00, 0xc8, 0x01, 0xcd, 0x20, 0xb2, - 0x00, 0x2c, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x11, - 0xa0, 0x40, 0x2c, 0xe0, 0x2a, 0x38, 0x42, 0xcc, - 0x00, 0xb3, 0xc8, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xcd, 0x40, 0xa3, 0xc2, 0xa0, 0xe0, 0x19, 0x30, - 0x02, 0xcc, 0x20, 0xb3, 0x00, 0x2c, 0xdc, 0x28, - 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xe8, 0x15, 0xb9, 0x90, 0xfe, 0x00, 0x33, - 0x90, 0x2c, 0xa0, 0x03, 0xe8, 0x00, 0xfa, 0x00, - 0x3d, 0xb0, 0x8e, 0x68, 0x03, 0xf9, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x4f, 0xa0, 0x0b, 0x08, 0x00, - 0xce, 0x80, 0x3f, 0xb2, 0x0e, 0xec, 0x03, 0xf9, - 0x10, 0xfe, 0x20, 0x3e, 0x80, 0x0f, 0xa0, 0x03, - 0xf9, 0x00, 0xee, 0x81, 0x32, 0x80, 0x0c, 0xa4, - 0x43, 0xfb, 0x00, 0xfa, 0x00, 0x3f, 0xb0, 0x0c, - 0xa0, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0xe2, 0x00, 0x38, 0x00, 0x3e, - 0x20, 0x0f, 0x80, 0x01, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x24, 0x0f, 0x85, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, - 0xf8, 0x70, 0x3e, 0x30, 0x01, 0x89, 0x03, 0xe3, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xe0, 0x80, 0x98, 0x18, 0x3e, 0x14, 0x0f, 0x88, - 0x03, 0xe0, 0x40, 0xf8, 0x41, 0x3e, 0x00, 0x0f, - 0x80, 0x13, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x40, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x64, 0x0c, 0x98, 0x03, 0x24, 0x40, 0xf9, - 0x00, 0x2e, 0x40, 0x4f, 0x90, 0x03, 0xe4, 0x00, - 0xc9, 0x10, 0x3e, 0x40, 0x0f, 0x92, 0x03, 0xe6, - 0x40, 0xf9, 0x20, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe6, 0x00, 0xf9, 0x04, 0x3c, 0x60, 0x0e, 0x90, - 0x03, 0xe4, 0x40, 0xed, 0x09, 0x00, 0xc9, 0x01, - 0xc9, 0x00, 0xb0, 0x40, 0x0c, 0x90, 0x03, 0xc2, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, - 0x64, 0x10, 0xb9, 0xc8, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x50, 0x08, - 0x90, 0x02, 0x26, 0x80, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xa9, 0x09, 0x2e, - 0x50, 0x0b, 0x9c, 0x02, 0xe4, 0x00, 0xb9, 0x80, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe7, 0x40, 0xb9, - 0x40, 0x2e, 0x58, 0x00, 0x94, 0x00, 0xe7, 0x00, - 0x81, 0x20, 0x22, 0x50, 0x08, 0x90, 0x00, 0xe0, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, - 0x2c, 0x00, 0xb9, 0x00, 0x2e, 0xc4, 0x0b, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x42, 0x08, - 0xb2, 0x2a, 0x2c, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0xd0, 0x02, 0xf4, 0x00, 0x89, 0x00, 0x2e, - 0x60, 0x0b, 0x94, 0x02, 0xe4, 0x28, 0xb9, 0x40, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x08, 0x2e, 0x48, 0x2a, 0xb1, 0x02, 0xc4, 0x20, - 0x89, 0x00, 0x22, 0x46, 0x08, 0x90, 0x02, 0xc6, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x04, 0x00, 0xb1, 0x00, 0x2c, 0x50, 0x0b, 0x10, - 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x08, - 0xb0, 0x02, 0x04, 0x00, 0xb1, 0x02, 0x2d, 0x40, - 0x0b, 0x50, 0x02, 0xf4, 0x00, 0xa1, 0x00, 0x2c, - 0xc0, 0x0b, 0x10, 0x22, 0xc4, 0x00, 0xb1, 0x00, - 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xcd, 0x10, 0x91, - 0x00, 0x2c, 0x50, 0x08, 0x1c, 0x02, 0xc5, 0x02, - 0x81, 0x00, 0x24, 0x50, 0x08, 0x10, 0x02, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, - 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0c, - 0x80, 0x03, 0x20, 0x00, 0xf8, 0x00, 0xed, 0x09, - 0x00, 0xca, 0x01, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xf0, 0x00, 0xc8, 0x00, 0x3e, 0x00, 0x8f, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x04, 0x3c, 0x00, - 0x2e, 0xc0, 0x03, 0xe0, 0x00, 0xc8, 0x00, 0x32, - 0x00, 0x2c, 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x98, 0x1d, 0xf4, 0x04, 0xfd, - 0x01, 0x3f, 0xc0, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3f, 0x40, 0x2f, 0xd0, 0x03, 0xf4, - 0x00, 0xf9, 0x01, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xc4, 0x10, 0xff, 0x01, 0x3d, 0x41, 0x0f, 0xd0, - 0x43, 0xf4, 0x00, 0xfd, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xf5, 0x00, 0xff, 0x40, 0x3f, 0x50, - 0x4f, 0xd0, 0x03, 0xf5, 0x04, 0xf9, 0x00, 0x3b, - 0x50, 0x0f, 0x90, 0x03, 0xe6, 0x06, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, 0x00, 0xfd, - 0x00, 0xb3, 0x41, 0x0d, 0x90, 0x23, 0xe4, 0x00, - 0xf9, 0x00, 0x3d, 0x40, 0x0c, 0xd0, 0x03, 0x14, - 0x00, 0xc9, 0x00, 0x3c, 0x40, 0x0f, 0x90, 0x03, - 0xa4, 0x00, 0xfd, 0x00, 0x3b, 0x40, 0x07, 0xd0, - 0x03, 0x3c, 0x00, 0xfd, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xf4, 0x00, 0xfd, 0x00, 0x33, 0x48, - 0x0f, 0xd0, 0x03, 0xf4, 0xd0, 0xfd, 0x02, 0x1b, - 0x40, 0x0f, 0x90, 0x03, 0xc6, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x00, 0xe0, 0x00, 0xb8, - 0x00, 0x22, 0x02, 0x08, 0x80, 0x02, 0xe0, 0x00, - 0xb8, 0x00, 0x2e, 0x00, 0x8d, 0x80, 0x42, 0x20, - 0x00, 0x88, 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x02, - 0x30, 0x00, 0xb8, 0x04, 0x22, 0x00, 0x4b, 0x80, - 0x03, 0x60, 0x10, 0xba, 0x00, 0x2e, 0x00, 0x0b, - 0x80, 0x22, 0xe0, 0x20, 0xbc, 0x10, 0x22, 0x0a, - 0x0b, 0x82, 0x02, 0xe8, 0xc0, 0xbc, 0x00, 0x2e, - 0x82, 0xed, 0x09, 0x00, 0xcb, 0x01, 0x0b, 0x80, - 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x05, 0xc4, 0x00, 0xb9, 0x02, 0x22, 0x40, - 0x49, 0x10, 0x06, 0xc4, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x08, 0x90, 0x02, 0x24, 0x00, 0x81, 0x04, - 0x6d, 0x40, 0x0b, 0x50, 0x02, 0x94, 0x00, 0x91, - 0x01, 0x28, 0x60, 0x0b, 0x90, 0x02, 0x04, 0x00, - 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, - 0x40, 0xb1, 0x04, 0xa0, 0x4c, 0x0a, 0x12, 0x82, - 0xcc, 0x80, 0xb1, 0x00, 0x2c, 0x44, 0x0b, 0x10, - 0x02, 0xc2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x15, 0xa4, 0x00, 0x39, 0x80, 0x22, 0x44, - 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x0e, - 0x40, 0x89, 0xb4, 0x02, 0x2c, 0x40, 0x89, 0x00, - 0x2e, 0x40, 0x0b, 0xd0, 0x06, 0x34, 0x01, 0xb9, - 0x00, 0x22, 0x40, 0x03, 0xb0, 0x00, 0x64, 0x45, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x20, 0x22, 0x40, 0x1b, 0x90, 0x02, - 0xe4, 0x80, 0xb9, 0x00, 0x2e, 0x60, 0x0b, 0x90, - 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x15, 0xe5, 0x80, 0xf1, 0x80, 0x72, 0x60, - 0x0d, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, - 0x42, 0x0c, 0x1c, 0x03, 0x24, 0x02, 0xc9, 0x00, - 0x3e, 0x40, 0x0f, 0x10, 0x03, 0xa4, 0x08, 0xd1, - 0x80, 0x3a, 0x74, 0x0f, 0x90, 0x83, 0x25, 0x20, - 0x79, 0x04, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe7, - 0x80, 0xf9, 0x80, 0x32, 0x60, 0x0e, 0x96, 0x03, - 0xe5, 0x00, 0xf9, 0x00, 0x3e, 0x50, 0x0f, 0x90, - 0x03, 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x02, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, - 0x44, 0x0f, 0x9c, 0x0b, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0xed, 0x09, 0x00, 0xcc, - 0x01, 0x03, 0xe4, 0x01, 0xf9, 0xa0, 0x3e, 0x60, - 0x0f, 0x9a, 0x03, 0xe6, 0x00, 0xf9, 0x98, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x80, 0xb9, 0x04, - 0x3e, 0x64, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x42, 0x4f, 0x90, 0x03, 0xca, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0xa1, - 0x00, 0xf8, 0x20, 0x32, 0x00, 0x0c, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x12, 0x0d, 0x88, - 0x03, 0xe2, 0x00, 0xd8, 0x00, 0x33, 0x00, 0x0c, - 0xc0, 0x03, 0xf0, 0x00, 0xc8, 0x00, 0x3e, 0x00, - 0x0f, 0x88, 0x23, 0xe0, 0x00, 0xe8, 0x00, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xe0, 0xc0, 0xf0, 0xd0, - 0x32, 0x00, 0x0f, 0x84, 0x03, 0xe1, 0x22, 0xc8, - 0x80, 0x3e, 0x10, 0x8f, 0x80, 0x03, 0xca, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x28, - 0x00, 0xbe, 0x40, 0x38, 0xa0, 0x00, 0xa0, 0x02, - 0xe8, 0x00, 0xba, 0x00, 0x2d, 0xb8, 0x08, 0xec, - 0x03, 0x99, 0x00, 0x8a, 0x00, 0x22, 0x80, 0x28, - 0xa0, 0x02, 0xe8, 0x00, 0x0e, 0x00, 0x2f, 0x81, - 0x0b, 0x6e, 0x12, 0xf8, 0x40, 0x8e, 0xc1, 0x2e, - 0x80, 0x0b, 0xa0, 0x02, 0xf8, 0x00, 0xba, 0x40, - 0x23, 0x88, 0x0b, 0xe4, 0x02, 0xf8, 0x00, 0x8a, - 0x40, 0x2f, 0xb0, 0x0b, 0xa0, 0x02, 0xca, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0x4c, - 0x00, 0xb3, 0x92, 0x24, 0xe0, 0x20, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x09, 0x30, - 0x12, 0xce, 0x40, 0x92, 0x00, 0x24, 0x00, 0x08, - 0x00, 0x06, 0xc0, 0x00, 0x90, 0x32, 0x2c, 0x1c, - 0x0b, 0x30, 0x12, 0xce, 0x00, 0xb3, 0x90, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0x8e, 0x00, 0xb3, 0x00, - 0xa0, 0xe8, 0x0b, 0x38, 0x92, 0xcd, 0x00, 0x03, - 0x10, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xca, 0xed, - 0x09, 0x00, 0xcd, 0x01, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x11, 0x1c, 0x00, 0xbf, 0x00, - 0x2b, 0xc2, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x08, 0x70, 0x82, 0xb4, 0x00, - 0x8e, 0x80, 0x25, 0x60, 0x08, 0x70, 0x02, 0xde, - 0x02, 0x97, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xde, 0x20, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x22, 0xdc, 0x00, 0xb6, 0x00, 0x21, 0xc0, 0x1b, - 0x74, 0x02, 0xce, 0x00, 0x86, 0x00, 0x2d, 0xc2, - 0x0b, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x00, 0x1e, 0x00, 0xf5, 0x80, - 0x25, 0xe0, 0x0c, 0x78, 0x03, 0xde, 0x00, 0xf7, - 0x80, 0x3d, 0xe0, 0x0d, 0x78, 0x13, 0xde, 0x08, - 0xd6, 0x80, 0xb5, 0x20, 0x0c, 0x48, 0x03, 0xd2, - 0x00, 0xd7, 0x80, 0x3d, 0xe0, 0x4f, 0x78, 0x03, - 0xde, 0x00, 0xf7, 0x80, 0x3d, 0xe0, 0x0f, 0x78, - 0x03, 0x9e, 0x00, 0xf6, 0x90, 0x31, 0xe0, 0x4f, - 0x78, 0x03, 0xde, 0x10, 0xc6, 0x80, 0x2d, 0xe0, - 0x0f, 0x78, 0x03, 0xea, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x15, 0xac, 0x00, 0xf3, 0x02, - 0x3c, 0x40, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xa0, 0x03, 0xac, 0x00, - 0xf2, 0x02, 0x3a, 0x40, 0x0f, 0xb0, 0x03, 0xcc, - 0x00, 0xea, 0x01, 0x3e, 0x40, 0x0f, 0xb0, 0x03, - 0xcc, 0x00, 0xcb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x04, 0xf3, 0x00, 0x3e, 0xc0, 0x9f, - 0xb0, 0x03, 0xec, 0x04, 0xfb, 0x08, 0x3e, 0x00, - 0x0f, 0xb0, 0x13, 0xc2, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xcf, 0x80, - 0x33, 0xe0, 0x0c, 0xf8, 0x03, 0xfe, 0x00, 0xff, - 0x80, 0x3d, 0xe0, 0x0c, 0xe2, 0x03, 0xfa, 0x00, - 0xfe, 0x80, 0x3d, 0x20, 0x2c, 0x49, 0x0a, 0x32, - 0x80, 0xff, 0xed, 0x09, 0x00, 0xce, 0x01, 0x90, - 0x11, 0xe4, 0x0c, 0xd8, 0x03, 0xfa, 0x00, 0xff, - 0x80, 0x33, 0xe0, 0x0f, 0xf8, 0x03, 0xfe, 0x00, - 0xfc, 0xa0, 0x3f, 0xe4, 0x1d, 0xf9, 0x03, 0xfe, - 0x02, 0xcc, 0x90, 0x3f, 0xe0, 0x0c, 0xf8, 0x03, - 0xc0, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x11, 0x9c, 0x10, 0x87, 0x03, 0x21, 0x48, 0x0d, - 0x70, 0x02, 0x5c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x8d, 0x60, 0x02, 0xd8, 0x80, 0xb6, 0x20, 0x2d, - 0x48, 0x08, 0x70, 0x82, 0x1c, 0x20, 0xb5, 0x40, - 0x35, 0x85, 0x0d, 0x50, 0x02, 0xdd, 0x00, 0xb7, - 0x44, 0x29, 0xc0, 0x0b, 0x70, 0x16, 0xd0, 0x00, - 0xb5, 0x08, 0x2d, 0x00, 0x0b, 0x51, 0x02, 0xfc, - 0x40, 0x87, 0x41, 0x2d, 0xc0, 0x08, 0x70, 0x02, - 0xea, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xbc, 0x40, 0xa7, 0x00, 0x23, 0xc0, 0x1a, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0x00, - 0x08, 0x61, 0x82, 0xdc, 0x04, 0xb6, 0x01, 0x2d, - 0x00, 0x48, 0x40, 0x00, 0x52, 0x84, 0xbf, 0x00, - 0x23, 0xc6, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xbf, - 0x00, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, - 0xb5, 0x21, 0x2d, 0xc2, 0x09, 0x70, 0x02, 0xd0, - 0x00, 0x85, 0x00, 0x2c, 0xc0, 0x08, 0x70, 0x02, - 0xc0, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x14, 0xcd, 0x80, 0xa3, 0x08, 0x22, 0x68, 0x0b, - 0x30, 0x02, 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xe1, - 0x09, 0x2c, 0x62, 0xcf, 0x40, 0xb2, 0x01, 0x6c, - 0x40, 0x08, 0x3a, 0x02, 0x4d, 0x00, 0xb3, 0xc9, - 0x24, 0xe0, 0x0b, 0x30, 0x02, 0xcd, 0x00, 0xb3, - 0x00, 0x28, 0xc0, 0x0b, 0x30, 0x02, 0xc2, 0x10, - 0xb0, 0x00, 0x6c, 0x00, 0x0b, 0xb4, 0x02, 0xc1, - 0x00, 0x82, 0x00, 0x2c, 0x22, 0x08, 0x30, 0x02, - 0xc8, 0x00, 0x30, 0x00, 0x00, 0xed, 0x09, 0x00, - 0xcf, 0x01, 0x00, 0x00, 0xa8, 0x15, 0xae, 0x30, - 0xeb, 0xc0, 0x32, 0xd0, 0x4e, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc8, 0x0c, 0xb4, 0x03, - 0xcf, 0x00, 0xfa, 0x00, 0x3e, 0x04, 0x4c, 0x84, - 0x03, 0x63, 0x40, 0xfb, 0x88, 0x32, 0xe0, 0x0e, - 0xb9, 0x23, 0xed, 0x00, 0xf3, 0x50, 0x32, 0xc0, - 0x0f, 0xb0, 0x03, 0xee, 0x20, 0xfa, 0xc0, 0x3e, - 0xc0, 0x0d, 0x92, 0x23, 0xef, 0x00, 0xca, 0x00, - 0x3e, 0xc0, 0x2c, 0xb0, 0x03, 0xea, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0x02, - 0x1b, 0x10, 0xbe, 0xc4, 0x09, 0xb0, 0x01, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0x84, 0x83, - 0xec, 0x20, 0xfa, 0x04, 0x3e, 0x40, 0x0f, 0xb0, - 0x03, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x09, - 0xbc, 0x03, 0xed, 0x00, 0xfb, 0x14, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x20, 0xfb, 0x00, 0x3e, - 0xd0, 0x0f, 0x94, 0x03, 0xe0, 0x60, 0xfb, 0x40, - 0x3c, 0xc4, 0x0f, 0xb0, 0x03, 0xe0, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, 0x00, - 0xfd, 0x05, 0x3f, 0x40, 0x0c, 0xf0, 0x23, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0c, 0xd1, 0x03, - 0xfc, 0x00, 0xde, 0x00, 0x3f, 0x00, 0x0f, 0xc0, - 0x03, 0x30, 0x00, 0xfd, 0x80, 0x3f, 0xa0, 0x0f, - 0xf9, 0x03, 0xfe, 0xa8, 0xff, 0x00, 0x33, 0xc0, - 0x0f, 0xf0, 0x03, 0xf2, 0x00, 0xcf, 0x08, 0x3f, - 0x08, 0x8f, 0xc0, 0x83, 0x3c, 0x00, 0xff, 0x00, - 0x1f, 0xc4, 0x0c, 0xf0, 0x03, 0xc0, 0x40, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, 0x00, - 0xbb, 0x48, 0x2e, 0xe4, 0x08, 0xb0, 0x02, 0xec, - 0x00, 0xbb, 0x00, 0x2c, 0xf0, 0x08, 0x80, 0x02, - 0xec, 0x00, 0xaa, 0x00, 0x2e, 0x40, 0x0b, 0x30, - 0x22, 0x2c, 0x04, 0xbb, 0x80, 0x2e, 0xf0, 0x0b, - 0xed, 0x09, 0x00, 0xd0, 0x01, 0xb8, 0x42, 0xec, - 0x00, 0xba, 0xc0, 0x36, 0xc0, 0x0b, 0xb0, 0x22, - 0xe3, 0x00, 0x8a, 0x80, 0x2e, 0x32, 0x0f, 0x8c, - 0x80, 0xa2, 0x80, 0xba, 0x40, 0x2e, 0x20, 0x28, - 0xb0, 0x02, 0xe0, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x05, 0x2c, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x08, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x2e, 0xd4, 0x08, 0x80, 0x02, 0xec, 0x80, 0x9a, - 0x00, 0x2e, 0x00, 0x4b, 0x80, 0x02, 0x20, 0x00, - 0xba, 0x20, 0x2e, 0x46, 0x0b, 0xb0, 0x02, 0xec, - 0x00, 0xbb, 0x20, 0x22, 0xc0, 0x0b, 0xb0, 0x02, - 0xcd, 0x80, 0x8b, 0x20, 0x2e, 0xc0, 0x02, 0x98, - 0x02, 0x2c, 0x40, 0xb9, 0x00, 0x0e, 0x00, 0x08, - 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb3, 0x00, 0x2c, - 0x40, 0x28, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x08, 0x00, 0x02, 0xcc, 0x00, 0xa2, - 0x02, 0x2c, 0x40, 0x0b, 0xb0, 0x0a, 0x0c, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x22, 0xcc, - 0x00, 0xb1, 0x00, 0x24, 0xc0, 0x0b, 0x30, 0x06, - 0xc0, 0x00, 0x82, 0x80, 0x2c, 0x00, 0x0b, 0x00, - 0x02, 0x80, 0x00, 0xb2, 0x04, 0x6c, 0x20, 0x08, - 0x30, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xfb, 0x02, 0x3e, - 0x40, 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0c, 0x80, 0x03, 0xe8, 0x00, 0xda, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x02, 0x20, 0x10, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0x80, 0x03, 0xec, - 0x00, 0xbb, 0x00, 0x32, 0xc0, 0x8f, 0xb0, 0x03, - 0xe0, 0x00, 0xca, 0x00, 0x3e, 0x00, 0x0e, 0x90, - 0x03, 0x20, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0c, - 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x1d, 0xed, 0x09, 0x00, 0xd1, 0x01, - 0xdc, 0x00, 0x76, 0x00, 0x3d, 0x40, 0x8f, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x2f, - 0xc0, 0x03, 0xf8, 0x00, 0xfe, 0x00, 0x3f, 0x40, - 0x0f, 0xf0, 0x03, 0xfc, 0x0c, 0xf4, 0x00, 0x3f, - 0x00, 0x0f, 0xd0, 0x13, 0xf4, 0x00, 0xf7, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0xff, - 0x00, 0x3f, 0x00, 0x0e, 0xc0, 0x03, 0xf0, 0x00, - 0xff, 0x00, 0x3f, 0x00, 0x0f, 0xf0, 0x03, 0xe8, - 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, - 0xf0, 0x00, 0xff, 0x48, 0x39, 0x01, 0x4d, 0xf0, - 0x83, 0xdc, 0x80, 0xcf, 0x04, 0x33, 0xc8, 0x0c, - 0xc0, 0x03, 0xfc, 0x20, 0xdf, 0x20, 0x37, 0xc1, - 0x0c, 0xc0, 0x03, 0xf0, 0x00, 0xe7, 0x20, 0x3f, - 0xc0, 0x4f, 0xc0, 0x2b, 0x7c, 0x00, 0xff, 0x08, - 0x35, 0x00, 0x0e, 0xf2, 0x83, 0x30, 0x40, 0x4f, - 0x11, 0x37, 0x10, 0x4c, 0x40, 0x02, 0x3c, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, - 0xc4, 0x00, 0xbf, 0x60, 0x32, 0x00, 0x08, 0xf4, - 0x22, 0xfd, 0x48, 0xdf, 0x42, 0x03, 0xc4, 0x88, - 0x80, 0x22, 0xfd, 0xa4, 0xbf, 0x40, 0x2f, 0xd4, - 0x28, 0xb0, 0x02, 0x2c, 0x00, 0x0f, 0x50, 0x27, - 0xc0, 0x08, 0xb0, 0x02, 0x3d, 0x40, 0xbf, 0x40, - 0x2e, 0xc2, 0x0a, 0xf0, 0x02, 0xac, 0x00, 0xab, - 0x20, 0x22, 0xc0, 0x08, 0xb2, 0x02, 0xac, 0x00, - 0x9b, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, - 0xc0, 0xa0, 0xb3, 0x20, 0x28, 0x00, 0x09, 0x30, - 0x02, 0x8c, 0x00, 0x83, 0x40, 0x20, 0xca, 0x28, - 0x00, 0x26, 0xcc, 0x80, 0x93, 0x10, 0x2c, 0xc0, - 0x00, 0xb8, 0x02, 0x4c, 0x00, 0x93, 0x00, 0x28, - 0xcf, 0x08, 0x38, 0x82, 0x0c, 0x01, 0xed, 0x09, - 0x00, 0xd2, 0x01, 0x93, 0x29, 0x20, 0xc0, 0x19, - 0x30, 0x06, 0xcc, 0x81, 0xa3, 0x00, 0x24, 0xc8, - 0x08, 0xb0, 0x82, 0x4c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xe2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x15, 0xa0, 0x60, 0xbb, - 0x00, 0xa6, 0xc0, 0x08, 0xb0, 0x02, 0xec, 0x00, - 0x9b, 0x03, 0x22, 0xc0, 0x0a, 0xa4, 0x06, 0xec, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x48, 0xb2, 0x02, - 0xec, 0x80, 0x9b, 0x00, 0x2e, 0xc0, 0x29, 0x30, - 0x02, 0x6c, 0x00, 0xbb, 0x00, 0x24, 0x20, 0x0b, - 0xb0, 0x42, 0xcd, 0x5d, 0xab, 0x00, 0x46, 0x41, - 0x08, 0xa0, 0x02, 0xec, 0x00, 0x9b, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xf0, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x15, 0xe7, 0x00, 0xfb, - 0x00, 0x38, 0xd2, 0x0d, 0xb0, 0x03, 0x8c, 0x04, - 0x43, 0x00, 0xb2, 0xc0, 0x08, 0x94, 0x13, 0xec, - 0x00, 0x5b, 0x00, 0x2e, 0xc0, 0x0c, 0xb0, 0x03, - 0x6d, 0x20, 0xfb, 0x00, 0x7e, 0xc0, 0x0f, 0xb9, - 0x03, 0x6c, 0x00, 0xdb, 0x00, 0x16, 0xc0, 0x0f, - 0xb0, 0x01, 0xee, 0x02, 0xcb, 0x02, 0x36, 0xe1, - 0x0c, 0xb0, 0x02, 0x6c, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xc0, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x01, 0xb4, 0x00, 0xf7, - 0x00, 0x3b, 0xd2, 0x0f, 0xf0, 0x03, 0xfc, 0x20, - 0xff, 0x00, 0x37, 0xc1, 0x0d, 0xf9, 0x83, 0xfc, - 0x00, 0xff, 0x04, 0x3d, 0xc2, 0x8f, 0xd0, 0x83, - 0x3e, 0x02, 0xef, 0x02, 0x77, 0xc0, 0x0e, 0xf0, - 0x03, 0xbc, 0x00, 0xdf, 0x00, 0x3f, 0xc0, 0x0e, - 0xf0, 0x03, 0xbe, 0x10, 0xdf, 0x00, 0x3b, 0xa4, - 0x2f, 0xdc, 0x03, 0xbc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x43, 0xf8, 0x40, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x10, 0xa4, 0x00, 0xcb, - 0x00, 0xed, 0x09, 0x00, 0xd3, 0x01, 0xf2, 0xc0, - 0x0e, 0xb0, 0x83, 0xec, 0x00, 0xcb, 0x00, 0x7c, - 0xc0, 0x0c, 0x98, 0x03, 0xac, 0x02, 0xcb, 0x04, - 0x02, 0xc5, 0x13, 0xb0, 0x03, 0x64, 0x40, 0xdb, - 0x04, 0x10, 0xc0, 0x0f, 0x90, 0x03, 0x2e, 0x00, - 0xfb, 0x00, 0x32, 0xd0, 0x0c, 0xb0, 0x03, 0xe5, - 0x02, 0xcb, 0x00, 0x36, 0xd0, 0x0c, 0xb4, 0x03, - 0x2c, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xc8, 0x05, 0x24, 0x00, 0x8f, 0x00, 0x62, 0xf8, - 0x08, 0xf2, 0x02, 0xfe, 0x00, 0x8f, 0xf0, 0x5f, - 0xc0, 0x0d, 0x90, 0x03, 0xbc, 0x00, 0x8f, 0x00, - 0x23, 0xd0, 0x0b, 0x3c, 0x67, 0x0c, 0x00, 0xbf, - 0x08, 0x23, 0xc1, 0x0f, 0xb0, 0x02, 0x3d, 0x44, - 0xef, 0x00, 0x36, 0xc0, 0x0c, 0x7d, 0x82, 0xec, - 0x00, 0xcb, 0x00, 0x26, 0xc0, 0x08, 0x30, 0x02, - 0x2c, 0x00, 0xeb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x05, 0x44, 0x00, 0x83, 0x00, 0x20, 0x30, - 0x1a, 0x30, 0x02, 0xce, 0x10, 0xa3, 0x00, 0x2c, - 0xc0, 0x40, 0x24, 0x52, 0x8c, 0x08, 0xa3, 0x00, - 0x28, 0xf0, 0x1b, 0x39, 0x12, 0xcc, 0x00, 0x93, - 0x88, 0x28, 0xc0, 0x0b, 0x30, 0x06, 0x8c, 0x00, - 0xb3, 0x01, 0x20, 0xc1, 0x09, 0x38, 0x12, 0xcc, - 0x00, 0xbb, 0x00, 0x26, 0xc1, 0x08, 0x30, 0x02, - 0x0c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x01, 0x12, 0x04, 0x83, 0x80, 0xa1, 0xa0, - 0x48, 0x78, 0x02, 0xde, 0x01, 0xa7, 0x90, 0x29, - 0xe0, 0x09, 0x79, 0x02, 0x8e, 0x00, 0xa3, 0x80, - 0xa9, 0xe0, 0x4b, 0x78, 0x06, 0x17, 0x00, 0xb7, - 0x90, 0x21, 0xe0, 0x82, 0x58, 0x02, 0x1e, 0x40, - 0xa3, 0x90, 0x27, 0xe0, 0xed, 0x09, 0x00, 0xd4, - 0x01, 0x20, 0x78, 0x02, 0xd6, 0x08, 0xa7, 0x80, - 0x27, 0xc0, 0x08, 0xf0, 0x02, 0x1e, 0x00, 0xa7, - 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xc8, 0x80, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, - 0x00, 0x83, 0x00, 0x20, 0x40, 0x0e, 0x32, 0x03, - 0xcc, 0x62, 0xe3, 0x00, 0x2e, 0xc0, 0x0c, 0x30, - 0x03, 0x8c, 0x98, 0xa3, 0x11, 0x38, 0xc4, 0x8b, - 0x10, 0x52, 0xcc, 0x08, 0x93, 0x06, 0x38, 0xc1, - 0xc3, 0xb0, 0x43, 0x8c, 0x54, 0xf3, 0x04, 0x30, - 0xc0, 0x49, 0x30, 0x43, 0xec, 0x40, 0x73, 0x10, - 0x34, 0x84, 0x0c, 0x11, 0x03, 0x0c, 0x00, 0xf3, - 0x00, 0x3c, 0xc0, 0x0f, 0x30, 0x03, 0xd2, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, 0xb8, - 0x02, 0xff, 0x00, 0x3f, 0x04, 0x0f, 0xf0, 0x03, - 0xfc, 0x10, 0xdf, 0x00, 0x3f, 0xd0, 0x4f, 0xe0, - 0x03, 0xfc, 0x00, 0xdf, 0x05, 0x37, 0xc0, 0x0b, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x1b, 0xfc, 0x40, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf1, 0x03, 0xfc, 0x40, 0xdf, 0x04, - 0x35, 0xcc, 0x0f, 0xf3, 0x03, 0xfc, 0x40, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xd0, 0x06, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, 0xe4, - 0x00, 0xeb, 0x21, 0x3e, 0xc0, 0x0c, 0xb0, 0x03, - 0xec, 0x28, 0xfb, 0x70, 0x32, 0xd0, 0x0f, 0x38, - 0x03, 0x6d, 0x20, 0xeb, 0x70, 0x3e, 0xdc, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0xd8, 0x3a, 0xc0, - 0x2c, 0xb0, 0x03, 0xcd, 0x40, 0xdb, 0x30, 0x32, - 0x00, 0x0e, 0xb6, 0x03, 0xec, 0x00, 0xab, 0x04, - 0x3e, 0x60, 0x0c, 0xa0, 0x03, 0xac, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xea, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0xbc, - 0x18, 0x87, 0x28, 0x0d, 0xc0, 0x08, 0x76, 0xed, - 0x09, 0x00, 0xd5, 0x01, 0xc2, 0xdd, 0x80, 0x37, - 0x11, 0x09, 0xc0, 0x09, 0x70, 0x02, 0xdc, 0x80, - 0xa7, 0x30, 0x2d, 0xcc, 0x09, 0x70, 0x02, 0x5c, - 0x00, 0xb3, 0x20, 0x03, 0xda, 0x09, 0x70, 0x02, - 0xdc, 0xc0, 0x87, 0x29, 0x21, 0xc0, 0x0b, 0x75, - 0x02, 0x5c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x08, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x00, 0x96, 0x08, 0x27, 0x95, - 0x2d, 0xe1, 0x08, 0x78, 0x02, 0xde, 0x81, 0xb7, - 0xa0, 0x21, 0xe4, 0x0b, 0xf8, 0x46, 0x0e, 0x40, - 0x87, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x32, 0xde, - 0x00, 0xa7, 0x80, 0xa1, 0xe0, 0x09, 0x78, 0x02, - 0xde, 0x8c, 0x83, 0xa6, 0x21, 0xf0, 0x0a, 0x78, - 0x02, 0xde, 0x00, 0xa7, 0x82, 0x29, 0xf0, 0x08, - 0x78, 0x82, 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0b, 0x78, 0x02, 0xf0, 0x40, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x14, 0xe4, 0x10, 0x83, 0x00, - 0x2c, 0xc0, 0x08, 0x30, 0x22, 0xcc, 0x00, 0xb3, - 0x00, 0x28, 0xc0, 0x09, 0x30, 0x06, 0x8c, 0x01, - 0x83, 0x00, 0x2c, 0xc0, 0x01, 0x19, 0x12, 0x44, - 0x00, 0xb3, 0x00, 0x28, 0xc0, 0x0b, 0x10, 0x10, - 0xcc, 0x00, 0x03, 0x00, 0x00, 0x18, 0x0b, 0x30, - 0x02, 0x44, 0x49, 0xb3, 0x00, 0x2c, 0x10, 0x08, - 0x0e, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xe8, 0x15, 0xb9, 0x00, 0xea, 0x01, - 0x3f, 0xb2, 0x0c, 0xa0, 0x03, 0xe8, 0x00, 0xfa, - 0x00, 0x32, 0x80, 0x0f, 0xe4, 0x13, 0x68, 0x02, - 0xca, 0x00, 0x3e, 0x80, 0x17, 0xec, 0x03, 0xf9, - 0x80, 0x7a, 0x00, 0x12, 0x80, 0x08, 0xec, 0x01, - 0xe8, 0x02, 0xda, 0x00, 0x11, 0x90, 0x0e, 0xa0, - 0x03, 0xfb, 0xed, 0x09, 0x00, 0xd6, 0x01, 0x00, - 0xea, 0x00, 0x3b, 0x80, 0xac, 0xe4, 0x03, 0xa8, - 0x00, 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, - 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x00, 0xe2, 0x00, 0xf8, 0x00, 0x3e, 0x30, 0x2f, - 0x04, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x88, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x8c, 0x03, 0xe2, 0x00, 0xf8, 0x00, - 0x16, 0x00, 0x0c, 0x89, 0x03, 0xc0, 0x00, 0xf8, - 0x02, 0xbe, 0x00, 0x0f, 0x00, 0x02, 0xe2, 0x04, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x07, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x10, 0xe4, 0x00, 0xc9, 0x00, 0x3e, 0x40, 0x8e, - 0x94, 0x03, 0x24, 0x40, 0xc1, 0x00, 0x30, 0x40, - 0x0c, 0x94, 0x03, 0xe4, 0x00, 0xe9, 0x00, 0x3e, - 0x40, 0x0f, 0x98, 0x07, 0xe4, 0x40, 0xf9, 0x00, - 0x3e, 0x40, 0x0c, 0x90, 0x03, 0xe4, 0x00, 0xe9, - 0x00, 0x36, 0x40, 0x0d, 0x9c, 0x13, 0x24, 0x00, - 0xf9, 0x00, 0x3e, 0x42, 0x0d, 0x90, 0x13, 0x64, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x04, 0x64, 0x00, 0x89, 0x00, 0x2c, 0x40, 0x08, - 0x9e, 0x02, 0x06, 0x00, 0xa9, 0x92, 0xa2, 0x40, - 0x0a, 0x98, 0x03, 0xa4, 0x00, 0xa9, 0x00, 0x2e, - 0x4c, 0x0e, 0x9a, 0x02, 0xe4, 0x00, 0xb9, 0x80, - 0x2e, 0x40, 0x0a, 0x90, 0x02, 0xe4, 0x02, 0x99, - 0x00, 0x36, 0x40, 0x08, 0x90, 0x1a, 0x24, 0x00, - 0xb9, 0x00, 0x3a, 0x40, 0x0b, 0x90, 0x02, 0x24, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, - 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x05, 0x24, 0x02, 0x89, 0x00, 0x2e, 0x54, 0x0a, - 0x90, 0x02, 0xa4, 0x01, 0x99, 0xed, 0x09, 0x00, - 0xd7, 0x01, 0x40, 0x2a, 0x40, 0x28, 0x94, 0x02, - 0xc4, 0x00, 0x89, 0x00, 0x2e, 0x40, 0x0b, 0x91, - 0x02, 0x64, 0x20, 0xb9, 0x10, 0x2c, 0x40, 0x08, - 0x90, 0x02, 0xe6, 0x00, 0x91, 0x00, 0x22, 0xc0, - 0x49, 0x90, 0x82, 0x24, 0x00, 0xb9, 0x00, 0x2e, - 0xc0, 0x0b, 0x30, 0x02, 0x24, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xc6, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x05, 0x00, - 0x81, 0x40, 0x2c, 0x40, 0x08, 0x10, 0x4a, 0x06, - 0x11, 0xb1, 0x00, 0x20, 0x50, 0x4a, 0x10, 0x02, - 0x85, 0x00, 0xa1, 0x00, 0x2c, 0x40, 0x0a, 0x10, - 0x02, 0xc4, 0x00, 0xb3, 0x00, 0x2c, 0x50, 0x08, - 0x14, 0x02, 0xc4, 0x00, 0x91, 0x40, 0x26, 0x50, - 0x08, 0x10, 0x02, 0x05, 0x00, 0xb1, 0x44, 0x6c, - 0x50, 0x0b, 0x14, 0x02, 0x04, 0x00, 0xb1, 0x00, - 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x60, 0x00, - 0xc8, 0x00, 0x2e, 0x00, 0x0e, 0x80, 0x03, 0xa0, - 0x00, 0x98, 0x00, 0x3a, 0x00, 0x0c, 0x80, 0x03, - 0xe0, 0x02, 0xc8, 0x00, 0x3e, 0x00, 0xcf, 0x80, - 0x02, 0x60, 0x04, 0xf8, 0x01, 0x3e, 0x00, 0x2c, - 0x80, 0x02, 0xe8, 0x00, 0xc8, 0x00, 0x32, 0x00, - 0x0d, 0x80, 0x03, 0x20, 0x01, 0xf8, 0x00, 0x3c, - 0x00, 0x0f, 0x80, 0x0b, 0x20, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xee, 0x02, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x98, 0x1d, 0xf4, 0x00, - 0xf9, 0x40, 0x3d, 0x40, 0x8d, 0x94, 0x03, 0xe5, - 0x00, 0xe1, 0x44, 0x1e, 0x50, 0x2d, 0xd0, 0x23, - 0xa5, 0x00, 0xd9, 0x40, 0x3e, 0x50, 0x0b, 0xd0, - 0x03, 0xf4, 0x00, 0xf9, 0x40, 0x3e, 0x50, 0x0f, - 0xd0, 0x13, 0xe5, 0x00, 0xc9, 0x40, 0x3f, 0x40, - 0x0f, 0x94, 0x03, 0xf4, 0x00, 0xf9, 0x00, 0x3b, - 0xed, 0x09, 0x00, 0xd8, 0x01, 0x40, 0x0f, 0xd0, - 0x23, 0xa4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xe6, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x05, 0xec, 0x40, 0xf9, 0x05, 0x3f, - 0x40, 0x0a, 0xd0, 0x03, 0xf4, 0x80, 0xcd, 0x28, - 0x3e, 0x4c, 0x0c, 0xf0, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3f, 0x49, 0x9e, 0x50, 0x63, 0xf4, 0x00, - 0xdd, 0x00, 0x36, 0x40, 0x0c, 0x91, 0x03, 0x74, - 0x80, 0xd9, 0x28, 0x36, 0x44, 0x0f, 0x50, 0x03, - 0x24, 0x08, 0xb9, 0x10, 0x14, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x10, 0xe0, 0x90, 0xb8, 0x48, 0x2e, - 0x00, 0x28, 0x81, 0x02, 0xe0, 0x00, 0x88, 0x02, - 0x26, 0x0c, 0x08, 0x80, 0x02, 0xe0, 0x20, 0xf8, - 0x10, 0x2e, 0x00, 0x08, 0x80, 0x02, 0xe0, 0x00, - 0xb8, 0x40, 0x2e, 0x02, 0x08, 0x80, 0x02, 0xe0, - 0x00, 0xb8, 0x20, 0x2e, 0x88, 0x0b, 0x84, 0x02, - 0x20, 0x30, 0xb8, 0x00, 0x22, 0x0a, 0x0b, 0xa2, - 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, - 0x80, 0x02, 0xce, 0x44, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x05, 0xc4, 0x80, 0x91, 0x30, 0x2e, - 0x40, 0x18, 0x10, 0x02, 0xc4, 0x43, 0x83, 0x00, - 0x2c, 0x48, 0x08, 0x18, 0x06, 0xc4, 0x44, 0xb1, - 0x00, 0x2c, 0x44, 0x0a, 0x10, 0x02, 0xcc, 0x00, - 0xa3, 0x10, 0x2c, 0x44, 0x09, 0x10, 0x02, 0x84, - 0x40, 0xb1, 0x28, 0x2c, 0x48, 0x0b, 0x11, 0x0e, - 0x46, 0x01, 0x91, 0x00, 0x24, 0x48, 0x8b, 0x12, - 0x82, 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x0b, - 0x10, 0x02, 0xc2, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, 0x02, 0x2e, - 0x40, 0x08, 0x90, 0x42, 0xe4, 0x00, 0x89, 0x00, - 0x24, 0x40, 0x08, 0xed, 0x09, 0x00, 0xd9, 0x01, - 0x92, 0x06, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x08, 0x90, 0x42, 0xe4, 0x20, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x30, 0xe4, 0x00, 0x39, 0x00, - 0x6e, 0x44, 0x03, 0x90, 0x20, 0x64, 0x00, 0xb9, - 0x00, 0x22, 0x40, 0x0b, 0x98, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xc6, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, - 0xe6, 0x20, 0xf9, 0x00, 0x3e, 0x52, 0x6c, 0x90, - 0x03, 0xc4, 0x00, 0xc9, 0x00, 0x3e, 0x40, 0x2c, - 0x90, 0x03, 0xe4, 0x15, 0xf9, 0x04, 0x3e, 0x40, - 0x0a, 0x90, 0x83, 0xe5, 0x00, 0xf9, 0x00, 0x1e, - 0x40, 0x0d, 0x92, 0x03, 0xe4, 0x00, 0xf9, 0x04, - 0x2e, 0x41, 0x0f, 0x90, 0x03, 0x64, 0x00, 0xd9, - 0x00, 0x36, 0x78, 0x0f, 0x94, 0x02, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe8, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, - 0xa4, 0x80, 0xf9, 0x00, 0x3e, 0x64, 0x8f, 0x90, - 0x03, 0xe4, 0x04, 0xf9, 0x00, 0x36, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x01, 0xe9, 0x00, 0x3e, 0x42, - 0x0f, 0x99, 0x03, 0xe6, 0x60, 0xf9, 0x00, 0x3c, - 0x41, 0x2c, 0x99, 0x03, 0xe4, 0x00, 0xf9, 0x02, - 0x3e, 0x60, 0x0f, 0x10, 0x93, 0xa6, 0x80, 0xf9, - 0x00, 0x3e, 0x48, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xca, - 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, - 0xa0, 0x00, 0xf8, 0x00, 0x32, 0x30, 0x2e, 0x88, - 0x03, 0xa2, 0x00, 0xf8, 0x80, 0x36, 0x00, 0x0c, - 0x88, 0x03, 0xe0, 0x02, 0xc8, 0x00, 0x3e, 0x00, - 0x0f, 0x88, 0x73, 0xa1, 0x10, 0xe8, 0x80, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xa0, 0x88, 0x38, 0x01, - 0x12, 0x10, 0x4f, 0x80, 0x03, 0xe0, 0x10, 0xc8, - 0x00, 0x3e, 0x10, 0x8c, 0x80, 0x03, 0xed, 0x09, - 0x00, 0xda, 0x01, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x05, 0x28, 0x00, 0xba, - 0x00, 0x21, 0x90, 0x08, 0xe6, 0x02, 0x39, 0x00, - 0xbe, 0x40, 0x2e, 0x80, 0x48, 0xec, 0x03, 0xa8, - 0x00, 0x8a, 0x00, 0x2d, 0x92, 0x0b, 0xec, 0x02, - 0x39, 0x00, 0x8e, 0x40, 0x0e, 0x81, 0x0f, 0xa0, - 0x02, 0x3a, 0x00, 0x3a, 0x00, 0x26, 0x80, 0x0b, - 0xe4, 0x03, 0x28, 0x00, 0xda, 0x05, 0x2e, 0x80, - 0x08, 0xa0, 0x02, 0x68, 0x00, 0xba, 0x00, 0x2e, - 0x80, 0x0b, 0xa0, 0x02, 0xc8, 0x20, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x04, 0x0c, 0x00, 0xb3, - 0x00, 0x20, 0xc4, 0x08, 0x20, 0x02, 0x8e, 0x00, - 0xb3, 0x00, 0x64, 0xc0, 0x08, 0x38, 0x02, 0x8c, - 0x00, 0x93, 0x00, 0x2c, 0x30, 0x0b, 0x19, 0x02, - 0x80, 0x00, 0xa1, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0x81, 0x40, 0xb3, 0x00, 0x24, 0xc0, 0x0b, - 0x18, 0x42, 0x8c, 0x00, 0xbb, 0x05, 0x2c, 0xc0, - 0x88, 0x30, 0x42, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x01, 0x1c, 0xc0, 0xb7, - 0x80, 0xa3, 0xc0, 0x09, 0x58, 0x02, 0x95, 0x08, - 0xb7, 0x01, 0x2d, 0xc8, 0x28, 0x70, 0x82, 0x9e, - 0x80, 0x97, 0x00, 0x2d, 0xc0, 0x0b, 0x78, 0x26, - 0x3e, 0x00, 0x87, 0x00, 0x2d, 0xc8, 0x88, 0xf8, - 0x02, 0x9c, 0x09, 0xb7, 0xa0, 0xa5, 0xc0, 0x03, - 0x60, 0x80, 0xbe, 0x00, 0xb7, 0x30, 0x0f, 0xe8, - 0x18, 0x71, 0x00, 0x5c, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xc8, 0x40, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x08, 0x1e, 0xa0, 0x7f, - 0xe8, 0x21, 0xe0, 0x0c, 0x58, 0x13, 0x9e, 0x08, - 0xf5, 0x80, 0x34, 0xf4, 0x04, 0x78, 0x03, 0xbe, - 0xc0, 0xed, 0x09, 0x00, 0xdb, 0x01, 0x17, 0x80, - 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0x9e, 0x04, 0xe7, - 0x81, 0x2d, 0xea, 0x0b, 0x7b, 0x13, 0x9e, 0x00, - 0xff, 0xa8, 0x31, 0xe0, 0x0f, 0x68, 0x01, 0x9f, - 0x40, 0xf7, 0xa0, 0x3d, 0xe0, 0x4c, 0x7a, 0x21, - 0xde, 0x00, 0xf7, 0x80, 0x3d, 0xe0, 0x0f, 0x78, - 0x03, 0xca, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x1d, 0xad, 0x80, 0xfb, 0x20, 0x3c, 0xc1, - 0x0e, 0x30, 0x03, 0x6c, 0x10, 0xf9, 0x02, 0x3e, - 0xc8, 0x8f, 0xb0, 0x03, 0xac, 0x80, 0xeb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0x4c, 0x00, 0xf9, - 0x00, 0x3e, 0xc0, 0x0f, 0x32, 0x03, 0x6c, 0x00, - 0xfb, 0x00, 0x3a, 0xc8, 0x1f, 0x90, 0x43, 0x0c, - 0x80, 0xdb, 0x08, 0x3e, 0xcc, 0x8f, 0xb2, 0x13, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x15, 0xfe, 0x00, 0xcf, 0x80, 0x3f, 0xa1, - 0x0f, 0xd8, 0x41, 0xfa, 0x10, 0xce, 0x80, 0x0b, - 0xe0, 0x0c, 0xc1, 0x03, 0x7e, 0x20, 0xdf, 0x80, - 0x3f, 0xe0, 0x0c, 0xf8, 0x02, 0xfe, 0x48, 0xbf, - 0x94, 0x3f, 0xe2, 0x0f, 0xf8, 0x83, 0xfe, 0x00, - 0xcf, 0x88, 0x17, 0xf2, 0x07, 0xe8, 0x13, 0xfe, - 0x00, 0xff, 0x80, 0x33, 0xd0, 0x0b, 0xfd, 0x13, - 0xfe, 0x40, 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, - 0x03, 0xd0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x11, 0x9c, 0x60, 0x87, 0x00, 0x0d, 0xc8, - 0x09, 0x70, 0x02, 0x11, 0x00, 0x87, 0x00, 0x21, - 0xc8, 0x08, 0x70, 0x02, 0x9c, 0x00, 0xa7, 0x00, - 0x2d, 0x80, 0x08, 0x70, 0x02, 0xd8, 0xc0, 0x37, - 0x00, 0x2d, 0xc4, 0x09, 0x70, 0x02, 0xdc, 0x00, - 0x87, 0x00, 0x2d, 0xc0, 0x19, 0x60, 0x42, 0xdc, - 0x80, 0xb7, 0x00, 0x21, 0xc4, 0x0b, 0x70, 0x02, - 0xdc, 0x00, 0x97, 0x00, 0xed, 0x09, 0x00, 0xdc, - 0x01, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xea, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, - 0x02, 0x87, 0x00, 0x2d, 0x82, 0x19, 0x70, 0x02, - 0x4c, 0x00, 0x93, 0x00, 0x25, 0xc0, 0x08, 0x41, - 0x86, 0x0c, 0x00, 0x87, 0x00, 0x2d, 0x40, 0x09, - 0x50, 0x02, 0xd5, 0x00, 0xb7, 0x04, 0x29, 0xc0, - 0x0a, 0x70, 0x02, 0xd0, 0x00, 0xa7, 0x00, 0x2d, - 0xc0, 0x09, 0x60, 0x02, 0xdc, 0x28, 0xb7, 0x00, - 0xa1, 0xc4, 0x0b, 0x70, 0x02, 0xdc, 0x08, 0xb7, - 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xe0, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, 0xcc, - 0x00, 0x83, 0x00, 0x2c, 0xb0, 0x19, 0x10, 0x02, - 0x40, 0x00, 0x90, 0x00, 0x26, 0xc0, 0x08, 0x06, - 0x02, 0x8c, 0x00, 0x83, 0x00, 0x2c, 0xc0, 0x09, - 0x3e, 0x22, 0xce, 0x00, 0xb3, 0x02, 0x2c, 0xc0, - 0x0b, 0x38, 0x00, 0xcc, 0x00, 0x83, 0x00, 0x2e, - 0xf4, 0x09, 0x20, 0x22, 0xcf, 0x00, 0x33, 0x02, - 0x28, 0xec, 0x0b, 0xb4, 0x02, 0xcc, 0x00, 0x93, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xd8, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x05, 0x9e, - 0x00, 0xcf, 0x00, 0x3e, 0x60, 0x09, 0x80, 0x03, - 0xec, 0x00, 0xdb, 0x00, 0x37, 0xc1, 0x3c, 0x3c, - 0x03, 0x3c, 0x00, 0xcb, 0x00, 0x2e, 0xc0, 0x1d, - 0xb8, 0x07, 0xef, 0x00, 0xbb, 0x00, 0x5f, 0xc0, - 0x07, 0xfe, 0x03, 0xec, 0x02, 0xef, 0x00, 0x2f, - 0xc0, 0x4d, 0xa0, 0x03, 0xfd, 0x00, 0xff, 0x00, - 0x33, 0xd0, 0x0f, 0xf5, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xea, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x07, 0xb0, 0x03, - 0xac, 0x00, 0xeb, 0x40, 0x32, 0xc0, 0x0f, 0xb0, - 0x43, 0xac, 0x01, 0xeb, 0x00, 0x3c, 0x50, 0xed, - 0x09, 0x00, 0xdd, 0x01, 0xae, 0x91, 0x03, 0xe5, - 0x40, 0xfb, 0x41, 0x3e, 0xc0, 0x0d, 0xb0, 0x23, - 0xe0, 0x00, 0x7b, 0x00, 0x3e, 0xc0, 0x0d, 0xa4, - 0x00, 0xec, 0x00, 0xfb, 0x00, 0x16, 0xc0, 0x0f, - 0xb8, 0x03, 0xec, 0x00, 0xdb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0xfc, 0x08, 0xdf, 0x00, - 0x33, 0xc2, 0x0f, 0x78, 0x03, 0x1c, 0x40, 0xcf, - 0x80, 0x3b, 0xc0, 0x08, 0xf0, 0x03, 0x5c, 0x04, - 0x67, 0x00, 0x33, 0x80, 0x0c, 0xf9, 0x03, 0xf8, - 0x00, 0xf7, 0xc0, 0x33, 0xc0, 0x0f, 0xf0, 0x83, - 0xdc, 0x40, 0xcf, 0x00, 0x3f, 0xc2, 0x0c, 0xe8, - 0x02, 0xfc, 0x30, 0x1f, 0x00, 0x2b, 0xc0, 0x0f, - 0xf0, 0x03, 0x3c, 0x00, 0x9f, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xc0, 0x44, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x81, 0x44, 0x6c, 0x00, 0x8b, 0x00, - 0x22, 0x64, 0x0b, 0x91, 0x02, 0x25, 0x00, 0x89, - 0x40, 0x2e, 0xc0, 0x08, 0xb0, 0x03, 0x6c, 0x02, - 0x8b, 0x04, 0x22, 0xec, 0x2c, 0xb4, 0x92, 0xed, - 0x20, 0xbb, 0x40, 0x22, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0x8b, 0x00, 0x2e, 0xc0, 0x08, 0xa4, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x22, 0xc0, 0x0b, - 0xb0, 0x02, 0x2c, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xf0, 0x40, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x05, 0x2c, 0x00, 0xb3, 0x00, - 0x22, 0x42, 0x0a, 0xb0, 0x02, 0x2c, 0x00, 0x9a, - 0x50, 0x2a, 0xc0, 0x0a, 0xb2, 0x02, 0x2c, 0x10, - 0x8b, 0x00, 0xa6, 0xc0, 0x09, 0xb0, 0x42, 0x6e, - 0x00, 0xb9, 0x40, 0x22, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x34, 0x9b, 0x04, 0x2e, 0xc0, 0x08, 0x92, - 0x82, 0xec, 0x00, 0xb3, 0x00, 0x2a, 0xc0, 0x4b, - 0xb0, 0x12, 0xac, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0xed, 0x09, 0x00, 0xde, 0x01, 0x02, - 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x2c, 0x00, 0xa3, 0x04, 0x28, 0x00, 0x0b, - 0x10, 0x00, 0x00, 0x02, 0x92, 0x00, 0x2c, 0xc0, - 0x28, 0x88, 0x02, 0x4c, 0x00, 0x03, 0x00, 0x20, - 0xc0, 0x0a, 0x30, 0x02, 0xcc, 0x01, 0xb3, 0x00, - 0x20, 0xc0, 0x0b, 0x30, 0x22, 0x4c, 0x00, 0x93, - 0x04, 0x24, 0xc0, 0x28, 0x20, 0x02, 0xcc, 0x08, - 0xb3, 0x00, 0x28, 0xc0, 0x03, 0x30, 0x00, 0x0c, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x12, - 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0d, 0x5c, 0x00, 0xff, 0x00, 0x22, 0x00, 0x1e, - 0x90, 0x0b, 0x28, 0x00, 0x98, 0x00, 0x39, 0xc0, - 0x0e, 0x80, 0x03, 0x3c, 0x00, 0xcb, 0x03, 0x76, - 0xc0, 0x0d, 0xb0, 0x03, 0x6c, 0x15, 0xfb, 0x04, - 0x33, 0xc0, 0x0f, 0xf0, 0x03, 0xec, 0x02, 0xdf, - 0x00, 0x3f, 0xc0, 0x0c, 0xa0, 0x03, 0xfc, 0x00, - 0xd7, 0x00, 0x3b, 0xc0, 0x0f, 0xf0, 0x09, 0x2c, - 0x00, 0xdb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x0d, 0xfc, 0x00, 0xdf, 0x00, 0xb7, 0x00, 0x0b, - 0x70, 0x03, 0xf0, 0x00, 0xec, 0x00, 0x2f, 0xc0, - 0x4f, 0x40, 0x03, 0xfc, 0x00, 0xdf, 0x02, 0x7d, - 0x00, 0x0d, 0xc0, 0x03, 0xf0, 0x01, 0xfc, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xd0, 0x00, 0xef, - 0x00, 0x3f, 0xc0, 0x0f, 0xd0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x17, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x05, 0xf0, 0x90, 0xcc, 0x04, 0x33, 0x08, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x00, - 0x0f, 0xc0, 0x03, 0xf8, 0x00, 0xfe, 0x00, 0x13, - 0x80, 0x0f, 0xd0, 0x03, 0xfc, 0xed, 0x09, 0x00, - 0xdf, 0x01, 0x10, 0xc7, 0x00, 0x39, 0xc0, 0x0c, - 0xf0, 0x03, 0x38, 0x00, 0xf6, 0x02, 0x33, 0xc0, - 0x0f, 0xf0, 0x03, 0xfd, 0x10, 0xcc, 0x00, 0x3f, - 0x00, 0x0c, 0xc1, 0x03, 0xf4, 0x00, 0xfc, 0x20, - 0x33, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x10, 0xe0, 0xe0, - 0x88, 0x20, 0x22, 0x14, 0x0b, 0xb0, 0x02, 0xec, - 0x00, 0x9b, 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x02, - 0xe8, 0x00, 0xba, 0x00, 0x22, 0x80, 0x0b, 0x80, - 0x02, 0xe0, 0x00, 0xd8, 0x00, 0x2e, 0x01, 0x28, - 0x80, 0x0a, 0x2c, 0x10, 0xb9, 0x00, 0x22, 0xc0, - 0x0b, 0xb0, 0x02, 0xcc, 0x82, 0xd8, 0x49, 0x2e, - 0x04, 0x08, 0x81, 0x02, 0xe4, 0x04, 0xb9, 0x68, - 0xb6, 0xc2, 0x0b, 0xb5, 0x02, 0xe0, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0xc4, 0x00, - 0x80, 0x0a, 0x20, 0x20, 0x0b, 0x30, 0x06, 0xcc, - 0x00, 0xb3, 0x01, 0x6c, 0x40, 0x0b, 0x00, 0x02, - 0xc0, 0x01, 0xbb, 0x00, 0x20, 0x80, 0x0b, 0x10, - 0x12, 0xcc, 0x00, 0x93, 0x00, 0x2a, 0xc0, 0x99, - 0x30, 0x02, 0x4c, 0x00, 0xb3, 0x00, 0x20, 0xc0, - 0x0b, 0x30, 0x02, 0xe8, 0x02, 0x80, 0x36, 0x2c, - 0x00, 0x08, 0x00, 0x02, 0xc0, 0x04, 0xb0, 0x10, - 0xe0, 0xc8, 0x8b, 0x30, 0x02, 0xe2, 0x11, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, 0xa6, 0x20, - 0x88, 0x00, 0x22, 0xa0, 0x0b, 0xb0, 0x02, 0xec, - 0x00, 0x9b, 0x00, 0x6e, 0x40, 0x0b, 0xa0, 0x02, - 0xec, 0x10, 0xbb, 0x00, 0x22, 0x80, 0x0b, 0x80, - 0x02, 0xe0, 0x00, 0x98, 0x04, 0x2e, 0x00, 0x09, - 0x80, 0x02, 0x6d, 0x10, 0xbb, 0x08, 0x22, 0xc0, - 0x0b, 0xb0, 0x02, 0xe9, 0x02, 0x9a, 0x24, 0x2c, - 0xc1, 0x28, 0xa0, 0x82, 0xe0, 0x10, 0xb9, 0xc0, - 0xa6, 0xc0, 0x0b, 0xb0, 0x02, 0xf0, 0x04, 0x60, - 0xed, 0x09, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, - 0x00, 0xc1, 0x15, 0xe2, 0x00, 0xc8, 0xca, 0x32, - 0x60, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0x13, 0x0f, 0x8d, 0x83, 0xe9, 0xc4, 0xfb, - 0x40, 0xb2, 0x80, 0x0f, 0x90, 0x07, 0xec, 0x00, - 0xcb, 0x00, 0x3a, 0xc0, 0x0d, 0x30, 0x23, 0x6c, - 0x40, 0xf3, 0x40, 0x32, 0xc0, 0x0f, 0xb0, 0x03, - 0xcd, 0x00, 0xc8, 0x4c, 0x3e, 0x10, 0x0c, 0x85, - 0x03, 0xe4, 0x20, 0xf0, 0x80, 0x32, 0xc0, 0x0f, - 0xb0, 0x03, 0xd0, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0x01, 0xb0, 0x08, 0xfd, 0x10, 0x2f, - 0x40, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0x50, 0x0f, 0xc8, 0x03, 0xfe, 0x00, 0xff, - 0x00, 0x3f, 0x80, 0x0f, 0xc0, 0x37, 0xf0, 0x00, - 0xfc, 0x00, 0x3f, 0x00, 0x0e, 0xc0, 0x43, 0xbe, - 0x00, 0xff, 0xc0, 0xbf, 0xc0, 0x0f, 0xf0, 0x23, - 0xfe, 0x40, 0xfd, 0x80, 0x3e, 0x68, 0x0f, 0xf0, - 0x03, 0xf5, 0x00, 0xfd, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x10, 0xa4, 0x00, 0xc8, 0x08, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3a, 0x40, 0x0d, 0xa1, 0x03, 0xe9, 0x00, 0xfb, - 0x60, 0x3e, 0x80, 0x0f, 0x90, 0x03, 0xec, 0x80, - 0xcb, 0x08, 0x32, 0xc8, 0x0c, 0xb3, 0x03, 0xaf, - 0x20, 0xfb, 0x40, 0x32, 0xc0, 0x0f, 0xb0, 0x03, - 0xe9, 0xc0, 0xcb, 0x00, 0x32, 0x98, 0x2c, 0x94, - 0x03, 0xe1, 0x00, 0xc9, 0x48, 0x3e, 0xc1, 0x0f, - 0xb0, 0x03, 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xd8, 0x05, 0x25, 0x40, 0x88, 0x00, 0x2e, - 0xc0, 0x4b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x2e, 0x40, 0x88, 0xb8, 0x02, 0xed, 0x40, 0xb1, - 0x08, 0x2e, 0x80, 0x4b, 0x81, 0x26, 0xc2, 0x00, - 0xa8, 0x60, 0x20, 0xed, 0x09, 0x00, 0xe1, 0x01, - 0x20, 0x0a, 0x80, 0x02, 0x2d, 0x00, 0xbb, 0xe0, - 0x36, 0xc0, 0x0b, 0xb0, 0x02, 0xe9, 0x00, 0x8b, - 0x00, 0x22, 0xf1, 0x08, 0xbd, 0x02, 0xe3, 0x92, - 0x89, 0x08, 0x2e, 0xc0, 0x4b, 0xf0, 0x02, 0xf2, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, - 0x62, 0x00, 0x88, 0xc0, 0x2c, 0x00, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0x33, 0x00, 0x28, 0x40, 0x09, - 0x18, 0x02, 0xc9, 0x04, 0xb3, 0xc1, 0x2c, 0x80, - 0x4b, 0x10, 0x02, 0xcd, 0x00, 0x83, 0x00, 0x20, - 0xd0, 0x89, 0x3c, 0x02, 0x0d, 0x00, 0xb3, 0x20, - 0x20, 0xc0, 0x03, 0x30, 0x02, 0xc5, 0x00, 0x80, - 0x00, 0xa0, 0x00, 0x08, 0x05, 0x02, 0xc7, 0x80, - 0x83, 0x82, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xf8, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x01, - 0x1a, 0x00, 0x84, 0x84, 0x2d, 0xa0, 0x0b, 0x78, - 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2f, 0x60, 0x08, - 0x7c, 0x02, 0xde, 0x00, 0xb7, 0x90, 0x2d, 0xa0, - 0x0b, 0x48, 0x02, 0xf2, 0x00, 0xac, 0x80, 0xa3, - 0x20, 0x0b, 0xc8, 0x02, 0x1e, 0x00, 0xbf, 0x80, - 0x25, 0xe0, 0x0b, 0x78, 0x02, 0xd6, 0x02, 0x87, - 0x82, 0x21, 0xa0, 0x08, 0x58, 0x02, 0xd6, 0x40, - 0x85, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xc8, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x08, - 0x2c, 0x20, 0xc0, 0x18, 0x3c, 0x44, 0x0f, 0x30, - 0x03, 0xcc, 0x00, 0xf3, 0x00, 0x38, 0xc0, 0x0d, - 0x11, 0x03, 0xc8, 0x20, 0xf2, 0x00, 0x3c, 0x80, - 0x0f, 0x10, 0x02, 0xcc, 0x20, 0xc3, 0x00, 0x30, - 0xc6, 0x0d, 0x31, 0x03, 0x84, 0x40, 0xf3, 0x00, - 0x30, 0xc0, 0x0f, 0x30, 0x03, 0xcc, 0x00, 0xc9, - 0x18, 0x30, 0x52, 0xcc, 0x30, 0x67, 0xec, 0x40, - 0xc3, 0x00, 0x3c, 0xc4, 0x0f, 0x30, 0x03, 0xd2, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0xe2, 0x01, 0x42, 0x1d, 0xbc, 0x00, 0xfc, - 0x00, 0x1f, 0xc0, 0x4f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3d, 0xc4, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xfe, 0x04, 0x3f, 0x80, 0x0f, 0xc0, 0x03, - 0xd0, 0x00, 0xfc, 0x01, 0x3f, 0x00, 0x0e, 0x48, - 0x4b, 0xfc, 0x54, 0xff, 0x10, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x40, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf1, 0x07, 0xfc, 0x40, 0xff, 0x10, 0x3f, - 0xc0, 0x0f, 0xf0, 0x83, 0xd0, 0x06, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x05, 0xe4, 0x08, 0xf9, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0x40, 0x0f, 0xb0, 0x02, 0xe8, - 0x00, 0xfb, 0x00, 0x12, 0x80, 0x0e, 0x90, 0x03, - 0xec, 0x00, 0xf3, 0x80, 0x32, 0xc0, 0x0d, 0xb0, - 0x03, 0xec, 0x04, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xc4, 0x02, 0xea, 0x00, 0x3e, 0xc0, - 0x0c, 0xa8, 0x03, 0x36, 0x00, 0xca, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xea, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc8, 0x91, 0x98, 0x00, 0xb5, - 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x42, 0xdc, 0x00, - 0xb7, 0x00, 0x2d, 0x40, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x35, 0x80, 0x08, 0x40, 0x02, - 0xd0, 0x00, 0xb4, 0x00, 0x21, 0x00, 0x0b, 0x40, - 0x22, 0xdc, 0x00, 0xb7, 0x02, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0xd4, 0x00, 0x87, 0x01, 0x2f, 0xc0, - 0x08, 0x70, 0x02, 0x14, 0x00, 0xd7, 0x00, 0x2d, - 0xc0, 0x0b, 0x7a, 0x02, 0xd2, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0x9e, 0x00, 0xb6, - 0x80, 0x2d, 0xe0, 0x4b, 0x78, 0x06, 0xde, 0x00, - 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xda, - 0x00, 0xb7, 0xc0, 0x61, 0xa0, 0x0a, 0x58, 0x02, - 0xde, 0x00, 0xbf, 0x80, 0x21, 0xe1, 0x09, 0x78, - 0x02, 0xed, 0x09, 0x00, 0xe3, 0x01, 0xde, 0x20, - 0xb7, 0x80, 0x6d, 0xe0, 0x0b, 0x78, 0x02, 0xfe, - 0x00, 0xa7, 0xc0, 0x25, 0xe2, 0x08, 0x38, 0x02, - 0x0e, 0x00, 0x87, 0x80, 0x2d, 0xe0, 0x0b, 0x7a, - 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x14, 0xcd, 0x00, 0xb2, 0x00, 0x2c, 0xf0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x31, 0x02, 0xce, 0x00, 0xb1, 0x80, - 0x24, 0x80, 0x08, 0x00, 0x02, 0xc0, 0x00, 0xb0, - 0x00, 0xa0, 0x00, 0x0b, 0x00, 0x02, 0xce, 0x00, - 0xb3, 0x40, 0x6c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, - 0x00, 0xa3, 0xc8, 0x2e, 0xc2, 0x88, 0x34, 0x42, - 0x0c, 0x00, 0x93, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x15, 0xb8, 0x40, 0xf6, 0x40, 0x3f, 0x98, - 0x4f, 0xa0, 0x03, 0xe8, 0x00, 0xfa, 0x00, 0x3f, - 0x90, 0x0f, 0xe4, 0x03, 0xfb, 0x20, 0xf6, 0xc0, - 0x30, 0x80, 0x0e, 0xa0, 0x03, 0xe8, 0x00, 0xfa, - 0x00, 0x32, 0x80, 0x0d, 0xa0, 0x03, 0xf9, 0x00, - 0xf6, 0x70, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xd8, - 0x00, 0xee, 0x80, 0x37, 0xb0, 0x0c, 0xe0, 0x9b, - 0x38, 0x02, 0xce, 0x08, 0x3e, 0x80, 0x0f, 0xa0, - 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0xe0, 0x00, 0xf8, 0x80, 0x3e, 0x08, - 0x0f, 0x80, 0x01, 0xe0, 0x00, 0xf8, 0x00, 0x2e, - 0x20, 0x0f, 0x88, 0x03, 0xe2, 0x00, 0xf8, 0x80, - 0x3e, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, 0xfc, - 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x02, 0xe3, 0x00, - 0xf8, 0x40, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0x50, 0x01, 0x3e, 0x10, 0x2f, 0x80, 0x93, - 0xe0, 0x00, 0xf8, 0xc0, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x10, 0xe6, 0x80, 0xed, 0x09, 0x00, 0xe4, - 0x01, 0xc9, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x8f, 0x98, - 0x03, 0xe4, 0x00, 0xf9, 0x20, 0x32, 0x40, 0x0c, - 0x90, 0x03, 0x24, 0x00, 0xf9, 0x00, 0x2e, 0x40, - 0x0e, 0x90, 0x03, 0xe4, 0x4c, 0xf9, 0x00, 0xa2, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x08, 0xc9, 0x00, - 0x32, 0x40, 0x0c, 0x9a, 0x01, 0xe4, 0x00, 0xb9, - 0x10, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xc2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x67, - 0x00, 0x89, 0x40, 0x22, 0x40, 0x0b, 0x90, 0x02, - 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x9d, - 0x02, 0xe4, 0x80, 0xb9, 0x40, 0x22, 0x40, 0x0a, - 0x10, 0x02, 0xa4, 0x00, 0xb9, 0x04, 0x2c, 0x40, - 0x08, 0x90, 0x02, 0xe6, 0x00, 0xb9, 0x40, 0x2a, - 0x40, 0x0b, 0x90, 0x02, 0xe7, 0x00, 0x89, 0x82, - 0xa2, 0x50, 0x08, 0x9c, 0x02, 0xe4, 0x00, 0x99, - 0x80, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe0, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0x05, - 0x00, 0x89, 0x00, 0x22, 0x40, 0x0b, 0x90, 0x02, - 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0x82, 0xe6, 0x00, 0xbb, 0x08, 0x22, 0x40, 0x08, - 0x90, 0x02, 0x34, 0x00, 0xbd, 0x00, 0x2f, 0x40, - 0x0a, 0xd0, 0x02, 0xe5, 0x00, 0xb9, 0x50, 0x2a, - 0x40, 0x0b, 0x90, 0x02, 0xe6, 0x00, 0x89, 0x11, - 0x02, 0x40, 0x28, 0x94, 0x02, 0xe4, 0x00, 0xb9, - 0x04, 0x0e, 0x40, 0x0b, 0x90, 0x02, 0xc6, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x05, - 0x00, 0x89, 0xc0, 0x20, 0x40, 0x0b, 0x10, 0x02, - 0xc4, 0x00, 0xb1, 0x04, 0x2c, 0x40, 0x0b, 0x10, - 0x02, 0xc4, 0x00, 0xb1, 0x00, 0xa2, 0x40, 0x0a, - 0x50, 0x02, 0x94, 0x00, 0xb5, 0x00, 0x2d, 0x40, - 0x08, 0x50, 0x02, 0xc4, 0x00, 0xb9, 0x00, 0xed, - 0x09, 0x00, 0xe5, 0x01, 0x28, 0x40, 0x0b, 0x10, - 0x02, 0xe7, 0x00, 0x81, 0x42, 0x20, 0x50, 0x08, - 0x14, 0x02, 0xc5, 0x00, 0x91, 0x42, 0x2c, 0x50, - 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb8, 0x0d, 0x60, 0x02, 0xc8, 0x00, - 0x32, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x32, 0x00, 0x0c, 0x80, 0x03, 0x20, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0e, 0xc0, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x3a, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x00, 0xc8, 0x01, 0x32, 0x80, 0x8c, - 0x80, 0x03, 0xe0, 0x00, 0xfa, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xd8, 0x9d, 0xf5, 0x00, 0xff, 0x00, - 0xbf, 0xd0, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3f, 0x40, 0x0f, 0xd0, 0x03, 0xf4, 0x00, - 0xf5, 0x00, 0x3c, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xf4, 0x00, 0xfd, 0x00, 0x36, 0x40, 0x0f, 0x90, - 0x13, 0xf4, 0x02, 0xff, 0x40, 0x3f, 0x50, 0x0f, - 0xf4, 0x03, 0xfd, 0x04, 0xfd, 0x40, 0x3e, 0x40, - 0x0d, 0x94, 0x03, 0xe6, 0x06, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x05, 0xf5, 0x00, 0xcf, 0x00, - 0x3e, 0x48, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0xd0, 0x03, 0xf4, 0x00, - 0xfd, 0x01, 0x3e, 0x40, 0x0b, 0x90, 0x03, 0x04, - 0x00, 0xf1, 0x00, 0x3e, 0x40, 0x0d, 0x90, 0x03, - 0x34, 0x00, 0xfd, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xf4, 0x00, 0xcd, 0x68, 0x3f, 0x53, 0x4f, - 0xd0, 0x83, 0x35, 0x00, 0xcd, 0x40, 0x3e, 0x50, - 0x0c, 0x92, 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x78, 0x10, 0xe1, 0x12, 0x88, 0x28, - 0x2e, 0x00, 0xed, 0x09, 0x00, 0xe6, 0x01, 0x0b, - 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, - 0x0b, 0x80, 0x12, 0xe0, 0x00, 0xb8, 0x00, 0x2e, - 0x00, 0x0b, 0x80, 0x03, 0x60, 0x08, 0xb8, 0x00, - 0x2e, 0x00, 0x8b, 0xc0, 0x02, 0x28, 0x00, 0xba, - 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x80, - 0xd8, 0x41, 0x2e, 0x10, 0x0b, 0x86, 0x0a, 0x21, - 0x04, 0x88, 0x40, 0x2e, 0x00, 0x0a, 0x85, 0x02, - 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x05, 0xc5, 0x80, 0x81, 0x00, 0x2c, 0x50, 0x0b, - 0x10, 0x06, 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x60, - 0x0b, 0x10, 0x02, 0xc4, 0x01, 0xb1, 0x00, 0x2c, - 0x40, 0x0b, 0xd0, 0x02, 0x54, 0x00, 0xb5, 0x00, - 0x2d, 0x40, 0x0b, 0xd0, 0x02, 0x04, 0x00, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xe4, 0x20, - 0xa1, 0x00, 0x2c, 0x40, 0x0b, 0x12, 0x86, 0x85, - 0x82, 0x81, 0xe0, 0x2c, 0x48, 0x08, 0x10, 0x02, - 0xc2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x15, 0xa4, 0x00, 0x89, 0x00, 0x2e, 0x48, 0x0b, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x44, - 0x0b, 0x98, 0x02, 0xe4, 0x00, 0xb9, 0x08, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0x74, 0x00, 0xbd, 0x00, - 0x2f, 0x40, 0x0b, 0xd0, 0x22, 0x24, 0x00, 0xb9, - 0x10, 0x0e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, - 0x99, 0x00, 0x2e, 0x50, 0x0b, 0x90, 0x02, 0x24, - 0x00, 0x89, 0x20, 0x2e, 0x40, 0x02, 0x90, 0x02, - 0xc6, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x15, 0xe7, 0x80, 0xc9, 0x01, 0x3e, 0x40, 0x8f, - 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x92, 0x03, 0xe4, 0x80, 0xf9, 0xc0, 0x3e, - 0x40, 0x0f, 0x10, 0x03, 0x64, 0x00, 0xf9, 0x01, - 0x3e, 0x41, 0x0d, 0x10, 0x0b, 0x27, 0x00, 0xf9, - 0x80, 0x3e, 0x40, 0x0f, 0x90, 0xed, 0x09, 0x00, - 0xe7, 0x01, 0x03, 0xe7, 0x20, 0xc9, 0x00, 0x3e, - 0x40, 0x0f, 0x9d, 0x03, 0x24, 0x00, 0xc9, 0x00, - 0x3e, 0x40, 0x0c, 0x90, 0x03, 0xe8, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x68, 0x01, 0x84, 0x80, - 0xf9, 0xc0, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x43, - 0xe6, 0x88, 0xf9, 0x10, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0x64, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x4f, - 0x90, 0x03, 0xe4, 0x40, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x80, 0xf9, 0xc1, 0x3e, - 0x64, 0x0f, 0x90, 0x03, 0xe7, 0x00, 0xf9, 0x80, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xca, 0x00, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, 0xa3, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x8d, 0x03, - 0xe2, 0x00, 0xf8, 0x48, 0x3e, 0x01, 0x0f, 0xc0, - 0x03, 0xf0, 0x00, 0xcc, 0x00, 0x33, 0x00, 0x0f, - 0xc0, 0x03, 0xe2, 0x10, 0xf8, 0x44, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xe1, 0x00, 0xc8, 0x40, 0x32, - 0x01, 0x4f, 0x82, 0x03, 0xc1, 0x00, 0xc8, 0x00, - 0x32, 0x00, 0x0f, 0x80, 0x03, 0xca, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x3a, 0x20, - 0xbe, 0xc0, 0x2e, 0x80, 0x0b, 0xa0, 0x02, 0xe8, - 0x00, 0xba, 0x00, 0x2e, 0x80, 0x0b, 0xec, 0x02, - 0xfb, 0x00, 0xbe, 0x48, 0x2e, 0x80, 0x0b, 0xa0, - 0x02, 0xe8, 0x00, 0xaa, 0x00, 0xa2, 0x80, 0x0b, - 0xa0, 0x42, 0xf9, 0x10, 0xbe, 0xa4, 0x26, 0x80, - 0x0b, 0xa0, 0x02, 0xd8, 0x12, 0xaa, 0x80, 0x23, - 0x80, 0x03, 0xe8, 0x02, 0x78, 0x02, 0x8e, 0x10, - 0x32, 0x80, 0x0b, 0xa0, 0x02, 0xca, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, 0x4c, 0x00, - 0xb3, 0x30, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, - 0xed, 0x09, 0x00, 0xe8, 0x01, 0x00, 0x33, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xce, 0x00, 0xb0, - 0x00, 0x2c, 0x80, 0x0b, 0x00, 0x02, 0xc0, 0x00, - 0x80, 0x00, 0x20, 0x00, 0x4b, 0x00, 0x22, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xcd, 0x60, 0x83, 0x80, 0x20, 0xc1, 0x0b, 0xb8, - 0x02, 0xcc, 0x00, 0x82, 0x80, 0x26, 0xc0, 0x0b, - 0x30, 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x01, 0x1c, 0x00, 0xb7, 0x02, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x50, 0x02, 0xdc, 0x20, 0xb7, - 0x00, 0x2d, 0x80, 0x0b, 0x50, 0x02, 0xfe, 0x00, - 0xa7, 0x80, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xdc, - 0x08, 0xb6, 0x02, 0x05, 0xc0, 0x0b, 0x70, 0x02, - 0xfc, 0x00, 0xa7, 0x88, 0xa1, 0x00, 0x0b, 0x70, - 0x82, 0x44, 0x00, 0x83, 0xc0, 0x21, 0xc8, 0x0b, - 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x88, 0x1e, 0x00, 0xf7, 0x80, 0x3d, - 0xe0, 0x0f, 0x78, 0x03, 0xde, 0x00, 0xf7, 0x80, - 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0xde, 0x00, 0xf7, - 0x80, 0x3d, 0xa0, 0x0f, 0x48, 0x03, 0xd2, 0x00, - 0xc4, 0x80, 0x31, 0x20, 0x0f, 0x48, 0x03, 0xde, - 0x00, 0xf7, 0x80, 0x1d, 0xe0, 0x0f, 0x78, 0x02, - 0xde, 0x00, 0xcf, 0x80, 0x31, 0xa0, 0x0f, 0x78, - 0x13, 0xde, 0x10, 0xc6, 0x80, 0xb5, 0xe8, 0x0f, - 0x78, 0x03, 0xea, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0x1d, 0xa0, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x4f, 0xb0, 0x13, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x04, 0xfa, - 0x00, 0x3e, 0x80, 0x0f, 0x90, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0d, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xc8, 0x02, 0xfb, 0xed, 0x09, 0x00, 0xe9, 0x01, - 0x00, 0x3f, 0x00, 0x0f, 0xb0, 0x02, 0xf4, 0x00, - 0xf9, 0x00, 0x3e, 0xe0, 0x0f, 0xb0, 0x03, 0xc2, - 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, - 0xfe, 0x00, 0xfe, 0x80, 0x3f, 0xe0, 0x0c, 0xf9, - 0x03, 0xfe, 0x40, 0xff, 0x80, 0x3f, 0xe0, 0x0f, - 0x78, 0x03, 0x1e, 0x00, 0xef, 0x90, 0x3f, 0xa0, - 0x0f, 0x48, 0x03, 0xb2, 0x00, 0xf4, 0x80, 0x33, - 0x20, 0x0f, 0xc8, 0x03, 0xde, 0x00, 0xc7, 0x81, - 0x33, 0xe0, 0x0f, 0xf8, 0x03, 0xde, 0x00, 0xef, - 0x81, 0x33, 0xe0, 0x0c, 0xf8, 0x03, 0x3e, 0x00, - 0xcf, 0x80, 0x33, 0xe2, 0x0d, 0xf8, 0x03, 0xc0, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, - 0x99, 0x40, 0xb4, 0x40, 0x2d, 0xc0, 0x08, 0x70, - 0x42, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x03, 0x5c, 0x00, 0x85, 0x00, 0x2d, 0x80, - 0x0b, 0x50, 0x02, 0x1c, 0x00, 0xb7, 0x0c, 0x21, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x02, 0x86, 0x00, - 0x35, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x80, 0xd7, - 0x10, 0x21, 0x00, 0x08, 0x50, 0x02, 0x34, 0x00, - 0xaf, 0x00, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xea, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x9c, 0x00, 0xb6, 0x00, 0x2d, 0xc0, 0x08, 0x70, - 0x06, 0xdc, 0x01, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0xf5, 0x02, 0x3d, 0x20, 0xa7, 0x00, 0x2d, 0x80, - 0x0b, 0x40, 0x02, 0xd0, 0x00, 0xb4, 0x00, 0x21, - 0x00, 0x0b, 0x48, 0x02, 0xf8, 0x00, 0x87, 0x00, - 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xf4, 0x01, 0xa5, - 0x00, 0x20, 0x80, 0x08, 0x20, 0x82, 0x5c, 0x40, - 0x86, 0x40, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xc0, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x14, - 0xc6, 0x00, 0xb8, 0x00, 0x2c, 0xc4, 0x08, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xed, 0x09, - 0x00, 0xea, 0x01, 0xd2, 0x1b, 0x18, 0x06, 0x4e, - 0x00, 0x83, 0x80, 0x2c, 0x80, 0x0b, 0x10, 0x82, - 0x4e, 0x60, 0xb3, 0x04, 0x20, 0xe0, 0x0b, 0x30, - 0x82, 0xce, 0x20, 0x83, 0x00, 0x24, 0xc0, 0x0b, - 0x30, 0x02, 0xe0, 0x00, 0x99, 0xd0, 0x20, 0x04, - 0x88, 0x0c, 0x02, 0x44, 0x00, 0xa1, 0x80, 0xa0, - 0xc0, 0x0b, 0x30, 0x02, 0xc8, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x15, 0xad, 0x00, 0xf9, - 0x10, 0x3e, 0xe0, 0x0c, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0x2f, - 0x00, 0xeb, 0xa2, 0x3e, 0x80, 0x0f, 0x00, 0x03, - 0xe2, 0x00, 0xf8, 0x12, 0x70, 0x22, 0x0f, 0x08, - 0x03, 0xe4, 0x20, 0xcb, 0xa0, 0x32, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xeb, 0x80, 0xb2, 0x60, - 0x0c, 0xbc, 0x2b, 0x60, 0x00, 0xcb, 0x48, 0x33, - 0xc0, 0x0d, 0xb0, 0x03, 0xea, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, 0xc0, 0xf9, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0x91, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0x80, 0x0f, 0x90, 0x03, - 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc2, 0x0f, 0xb1, - 0x03, 0xed, 0x00, 0xf9, 0x40, 0x3e, 0xc0, 0x07, - 0xb0, 0x03, 0xe4, 0x00, 0xf9, 0x08, 0x3f, 0x00, - 0x0f, 0xa4, 0x83, 0xa5, 0x00, 0xfb, 0x40, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xe0, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x10, 0xf0, 0x40, 0xfd, - 0x00, 0x32, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0x74, - 0x09, 0xfd, 0x80, 0x33, 0x80, 0x0f, 0xc0, 0x03, - 0x30, 0x00, 0xcc, 0x00, 0x3f, 0x00, 0x08, 0xc0, - 0x03, 0xbe, 0x00, 0xcf, 0x0c, 0x33, 0xc0, 0x0f, - 0xf0, 0x03, 0xfe, 0x00, 0xcb, 0x00, 0x33, 0x02, - 0x0c, 0xed, 0x09, 0x00, 0xeb, 0x01, 0xd8, 0x00, - 0xb0, 0x40, 0xcf, 0x00, 0x3f, 0xc0, 0x0f, 0x70, - 0x03, 0x00, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x63, 0x04, 0xb9, 0xc4, 0x22, 0xc0, - 0x0b, 0xb0, 0x03, 0xac, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x4b, 0x34, 0x82, 0x2d, 0x08, 0xb3, 0x48, - 0x2a, 0x80, 0x0b, 0x90, 0x02, 0x8c, 0x02, 0x8b, - 0x04, 0x2e, 0xc0, 0x0c, 0xb0, 0x02, 0x07, 0x80, - 0x82, 0x00, 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xe1, - 0x20, 0x89, 0x00, 0x22, 0x24, 0x08, 0x8d, 0x82, - 0x25, 0x00, 0x89, 0xcc, 0x2e, 0xc0, 0x09, 0xb0, - 0x02, 0xa0, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x05, 0x24, 0x00, 0xb9, 0x80, 0x22, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0x6e, 0x20, 0xba, 0x10, - 0x22, 0x80, 0x0b, 0x80, 0x02, 0xa0, 0x00, 0x88, - 0x00, 0x2e, 0x00, 0x0a, 0x80, 0x02, 0xa4, 0x40, - 0x8b, 0x88, 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xe8, - 0x40, 0x9b, 0x10, 0x20, 0x40, 0x08, 0x30, 0x02, - 0x00, 0x20, 0x89, 0x80, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x00, 0x01, 0xb0, 0x00, 0x20, 0xc0, - 0x0b, 0x30, 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0x08, 0x00, 0xbb, 0x00, - 0x28, 0x80, 0x0b, 0x90, 0x02, 0x8c, 0x10, 0x83, - 0x00, 0x2c, 0xc0, 0x0a, 0x30, 0x02, 0x0c, 0x00, - 0x8b, 0x02, 0xa0, 0xc0, 0x0b, 0x30, 0x02, 0xc0, - 0x00, 0x81, 0x00, 0xa0, 0x01, 0x08, 0x00, 0x06, - 0x04, 0x02, 0x81, 0x00, 0x2c, 0xc0, 0x09, 0x30, - 0x02, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0d, 0x68, 0x00, 0xf8, 0x00, 0xb2, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xed, 0x09, 0x00, 0xec, - 0x01, 0x6c, 0x00, 0xbb, 0x04, 0x32, 0x80, 0x0f, - 0x80, 0x03, 0xa0, 0x00, 0xc8, 0x00, 0x3e, 0x00, - 0x8e, 0x80, 0x03, 0xac, 0x00, 0xcb, 0x00, 0x32, - 0xc0, 0x0f, 0xb0, 0x03, 0xe0, 0x02, 0xc9, 0x00, - 0x32, 0x00, 0x2c, 0x80, 0x0b, 0x20, 0x00, 0xc9, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0x00, 0x03, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xf0, - 0x00, 0xfc, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xc0, - 0x03, 0xf4, 0x00, 0xfc, 0x00, 0x3f, 0x80, 0x0f, - 0xd0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0c, 0xf0, 0x43, 0xf4, 0x00, 0xfc, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0xfd, 0x00, - 0x37, 0x00, 0x0f, 0xc0, 0x03, 0xf4, 0x04, 0xfd, - 0x00, 0x3f, 0xc0, 0x0d, 0xf0, 0x03, 0xe8, 0x06, - 0x50, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x85, 0xfc, - 0x00, 0xfc, 0x00, 0x33, 0x00, 0x0c, 0xd0, 0x01, - 0xfc, 0x80, 0xcf, 0x08, 0x33, 0xcd, 0x0c, 0xf3, - 0x23, 0x30, 0x00, 0xff, 0x28, 0x3f, 0x00, 0x0e, - 0xf2, 0x03, 0x3c, 0x00, 0xdd, 0x10, 0x33, 0xcc, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x33, - 0xd0, 0x0f, 0xe1, 0x03, 0x30, 0x40, 0xcf, 0x24, - 0x3b, 0xc0, 0x0c, 0xf4, 0x13, 0x3c, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x80, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x08, 0xbd, - 0x00, 0xba, 0x02, 0x22, 0x00, 0x18, 0x90, 0x12, - 0xfc, 0x40, 0x8f, 0x41, 0x23, 0xc4, 0x08, 0xf6, - 0x02, 0x20, 0x00, 0xbf, 0x40, 0x2e, 0xc0, 0x0b, - 0xf4, 0x4a, 0x3d, 0xc0, 0x83, 0x20, 0x27, 0xc0, - 0x0e, 0xf1, 0x02, 0xfc, 0x00, 0xbf, 0x10, 0x2a, - 0xc0, 0x0b, 0x80, 0x02, 0xac, 0x80, 0x8f, 0x10, - 0x2f, 0xd0, 0x28, 0xb0, 0x02, 0x2c, 0x00, 0xed, - 0x09, 0x00, 0xed, 0x01, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xc8, 0x04, 0x8c, 0x40, 0xb8, 0x00, - 0x22, 0x00, 0x09, 0x10, 0x02, 0xcc, 0x02, 0x83, - 0x00, 0x20, 0xc9, 0x08, 0x36, 0x02, 0x00, 0xa0, - 0xb3, 0x00, 0x2c, 0xc0, 0x0a, 0x31, 0x42, 0x0c, - 0x20, 0x83, 0x00, 0x2c, 0xd0, 0x0b, 0x30, 0x22, - 0x8c, 0x40, 0xa3, 0x00, 0x20, 0xc0, 0x0b, 0x80, - 0x02, 0x6c, 0x10, 0xa3, 0x00, 0x28, 0xc4, 0x08, - 0x32, 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xe2, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x04, 0xac, 0x00, 0xbb, 0x02, - 0x22, 0x00, 0x08, 0x92, 0x02, 0xec, 0x00, 0x8b, - 0x00, 0x22, 0xc0, 0x08, 0xb0, 0x02, 0x2e, 0x01, - 0xbb, 0x05, 0x2e, 0xd4, 0x0b, 0xb0, 0x42, 0x2c, - 0x00, 0x8b, 0x00, 0x2e, 0xc0, 0x0a, 0xb0, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0x2a, 0xc0, 0x0b, 0x80, - 0xa2, 0xec, 0xa0, 0xab, 0x04, 0x2e, 0xc0, 0x08, - 0x30, 0x02, 0xac, 0x00, 0xbb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xf0, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x41, 0x15, 0xec, 0x00, 0xf3, 0x40, - 0xb0, 0x32, 0x2d, 0x90, 0x03, 0xec, 0x00, 0xcb, - 0x00, 0x32, 0xc0, 0x2c, 0xb0, 0x03, 0x2c, 0x88, - 0xfb, 0x00, 0x3e, 0xe0, 0x0e, 0xb0, 0x03, 0x2c, - 0x10, 0xdb, 0x80, 0x3a, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xf3, 0x00, 0x32, 0xc0, 0x0f, 0x88, - 0x03, 0x4e, 0x00, 0xeb, 0x00, 0x3a, 0xc0, 0x0c, - 0xb0, 0x03, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xd0, 0x44, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x01, 0xac, 0x00, 0xfd, 0xa0, - 0x3f, 0xb0, 0x0f, 0xf0, 0x43, 0xcc, 0x00, 0xf7, - 0x00, 0x3f, 0xc0, 0x0f, 0x70, 0x03, 0xfc, 0x14, - 0xff, 0x00, 0xed, 0x09, 0x00, 0xee, 0x01, 0x3f, - 0x43, 0x0f, 0xf0, 0x03, 0xdc, 0x00, 0xfd, 0x20, - 0x32, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x01, 0x3f, 0xc0, 0x0f, 0xe9, 0x03, 0xb6, 0x00, - 0xdf, 0x00, 0x3d, 0xc0, 0x0f, 0xf0, 0x03, 0x7c, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x43, - 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x10, 0xac, 0x40, 0xcb, 0x44, 0x1e, 0xc0, 0x2c, - 0x90, 0x03, 0xee, 0x28, 0xcb, 0x00, 0x3c, 0xc0, - 0x0c, 0xb0, 0x03, 0x2c, 0x00, 0xcb, 0x00, 0x32, - 0xc1, 0x9f, 0x30, 0xc3, 0x6c, 0x10, 0xcb, 0x00, - 0x32, 0xc0, 0x0c, 0xb0, 0x03, 0xec, 0x80, 0xcb, - 0x00, 0x3e, 0xc0, 0x0f, 0x80, 0x03, 0xe8, 0x10, - 0xfb, 0x10, 0x3e, 0xc1, 0x0f, 0xb0, 0x03, 0x2c, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xd0, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x05, 0x3f, 0x40, 0x88, 0x22, 0x2e, 0x21, 0x28, - 0xb0, 0x02, 0xfd, 0x02, 0x8f, 0xa0, 0x2f, 0xc0, - 0x08, 0xf0, 0x02, 0x2c, 0x02, 0x8f, 0x00, 0x22, - 0xf0, 0x0b, 0xf4, 0x92, 0xfc, 0x00, 0x8b, 0x00, - 0x23, 0xc0, 0x48, 0xf4, 0x82, 0xff, 0x00, 0xff, - 0x60, 0x2e, 0xc0, 0x0e, 0x00, 0x22, 0xec, 0x00, - 0xbf, 0x00, 0x2f, 0xfc, 0x0b, 0xb0, 0x00, 0x2c, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xf2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xc8, - 0x04, 0x4e, 0x00, 0x82, 0x80, 0x2c, 0x38, 0x08, - 0x10, 0x02, 0xcc, 0x00, 0x83, 0x00, 0x2c, 0xc0, - 0x08, 0x30, 0x02, 0x00, 0x00, 0x93, 0x90, 0x20, - 0xf0, 0x0b, 0x3c, 0x02, 0xcc, 0x00, 0x8b, 0x00, - 0x0c, 0xc0, 0x09, 0x3e, 0x02, 0xcd, 0x40, 0x83, - 0x08, 0x2c, 0xc0, 0x8b, 0x00, 0x02, 0xcc, 0x00, - 0xb3, 0x88, 0x2c, 0xc0, 0x4b, 0x30, 0x02, 0x0c, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0xed, 0x09, 0x00, - 0xef, 0x01, 0x0b, 0x30, 0x02, 0xf8, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x5e, 0x40, - 0x85, 0x80, 0x2d, 0x20, 0x08, 0x78, 0x02, 0xde, - 0x40, 0x87, 0xc0, 0x2d, 0xc0, 0x08, 0x38, 0x02, - 0x1a, 0x00, 0x97, 0x80, 0xa1, 0xe0, 0xcb, 0x78, - 0x02, 0xce, 0x08, 0x87, 0x80, 0x25, 0xe0, 0x09, - 0x78, 0x02, 0xce, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0a, 0x49, 0x22, 0xda, 0x00, 0xb7, 0x90, 0x2d, - 0xe0, 0x0b, 0x78, 0x12, 0x1e, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xc8, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x18, 0x4c, 0x00, - 0xc1, 0x10, 0x3c, 0x47, 0x0c, 0x10, 0x03, 0xcc, - 0x50, 0xc3, 0x21, 0x3e, 0xc4, 0x2c, 0x30, 0x03, - 0x24, 0x40, 0xd3, 0x10, 0x30, 0x46, 0x0b, 0x30, - 0x43, 0xcc, 0x00, 0x81, 0x00, 0x3c, 0xc0, 0x0d, - 0x31, 0x03, 0xcc, 0x00, 0xc3, 0x10, 0x3c, 0xc0, - 0x0f, 0x21, 0x03, 0xc4, 0x00, 0xf3, 0x00, 0x3c, - 0xc0, 0x0f, 0xb0, 0x03, 0x0c, 0x00, 0xf3, 0x00, - 0x3c, 0xc0, 0x0f, 0x30, 0x03, 0xd2, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x00, - 0xff, 0x00, 0x3d, 0x00, 0x0f, 0xf0, 0x03, 0xfc, - 0x60, 0xff, 0x48, 0x3f, 0xc0, 0x0f, 0xf0, 0x83, - 0xf0, 0x00, 0xe7, 0x45, 0x3f, 0xc1, 0x4f, 0xf0, - 0x03, 0xfc, 0x20, 0xff, 0x00, 0xbb, 0xc2, 0x2e, - 0xf4, 0x83, 0xfc, 0x68, 0xdf, 0x4c, 0x3f, 0xc0, - 0x8f, 0xc1, 0x03, 0xfc, 0x40, 0xff, 0x40, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xd0, 0x06, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xaf, 0x40, - 0xc9, 0x00, 0x3e, 0x80, 0x0f, 0xb0, 0x03, 0xed, - 0xa2, 0xcb, 0x00, 0x32, 0xd8, 0x4c, 0xb0, 0x43, - 0xec, 0x00, 0xfb, 0x50, 0x3e, 0xc0, 0x0f, 0x36, - 0xed, 0x09, 0x00, 0xf0, 0x01, 0x03, 0x2d, 0x00, - 0xfb, 0x04, 0x3e, 0xd2, 0x0f, 0xb2, 0x13, 0xee, - 0x30, 0xfb, 0x00, 0x3e, 0xc0, 0x0d, 0x80, 0x03, - 0x4c, 0x00, 0x4b, 0x90, 0x34, 0xca, 0x0c, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xca, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xc8, 0x98, 0x8c, 0x20, 0x86, 0x01, 0x2d, - 0x00, 0x0b, 0x70, 0x02, 0xdc, 0x80, 0x87, 0x00, - 0x21, 0xd4, 0x08, 0x73, 0x02, 0xdc, 0x00, 0xb7, - 0x20, 0x2d, 0xc0, 0x0b, 0x72, 0x82, 0x1c, 0xc0, - 0xb7, 0x00, 0x2d, 0xc8, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0x87, 0x04, 0x2d, 0xc0, 0x0b, 0x40, 0x02, - 0x1c, 0x00, 0x87, 0x04, 0x29, 0xd8, 0x4a, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x02, 0xd2, 0x24, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x9e, 0x02, 0x86, 0x80, 0x2d, - 0x22, 0x0b, 0x78, 0x02, 0xde, 0x00, 0x97, 0xa0, - 0x24, 0xe8, 0x08, 0x78, 0x02, 0xde, 0x20, 0xb7, - 0x80, 0x2d, 0xe0, 0x89, 0x79, 0x1a, 0x5e, 0x88, - 0xa7, 0x80, 0x29, 0xe8, 0x0b, 0x7a, 0x02, 0xce, - 0x82, 0x87, 0xa0, 0x69, 0xe0, 0x08, 0x48, 0x42, - 0x3e, 0x00, 0x97, 0xa0, 0x29, 0xe8, 0x08, 0x78, - 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, - 0x78, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x68, 0x04, 0x8c, 0x00, 0x80, 0x00, 0x2c, - 0x80, 0x0b, 0x38, 0x22, 0xcc, 0x04, 0x93, 0x00, - 0x26, 0xc0, 0x08, 0xb0, 0x02, 0xce, 0x00, 0xb3, - 0x00, 0x2c, 0x60, 0x8b, 0x30, 0x02, 0x4c, 0x00, - 0xb1, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x00, 0xcc, - 0x00, 0x83, 0x00, 0x2c, 0xc0, 0x0b, 0xb8, 0x02, - 0x62, 0x80, 0x93, 0x00, 0x28, 0xc0, 0x0a, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xd2, 0xed, 0x09, 0x00, 0xf1, 0x01, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x11, - 0xe8, 0x00, 0xce, 0xc8, 0x1f, 0x90, 0x0f, 0xa0, - 0x03, 0xe8, 0x00, 0xda, 0x00, 0xb6, 0x80, 0x0c, - 0xa0, 0x03, 0xfb, 0x00, 0xfa, 0x00, 0x3d, 0xb3, - 0x0d, 0xa0, 0x03, 0x68, 0x00, 0xfa, 0x00, 0x3e, - 0x80, 0x0b, 0xa0, 0x13, 0xe8, 0x00, 0xfa, 0x00, - 0x3e, 0x80, 0x0d, 0xee, 0x0b, 0x7b, 0x80, 0xda, - 0x00, 0x3a, 0x80, 0x0c, 0xa0, 0x03, 0xe8, 0x00, - 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xf8, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, - 0xa0, 0x00, 0xf8, 0x80, 0x3e, 0x30, 0x0f, 0x81, - 0x03, 0xe0, 0x00, 0xe8, 0x40, 0x3a, 0x00, 0x0f, - 0x80, 0x03, 0xe2, 0x00, 0xf8, 0x00, 0x3e, 0x30, - 0x4f, 0x80, 0x03, 0xa0, 0x00, 0xf8, 0x00, 0x3e, - 0x01, 0x4f, 0x80, 0x03, 0xe0, 0x04, 0xf8, 0x40, - 0x3e, 0x00, 0x0f, 0x88, 0x03, 0xa0, 0x02, 0xe8, - 0x40, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xd2, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, - 0xa5, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe6, 0x04, 0xc9, 0x80, 0x32, 0x40, 0x2c, - 0x90, 0x03, 0x24, 0x00, 0xf9, 0x40, 0x3e, 0x60, - 0x0e, 0x90, 0x03, 0x24, 0x00, 0xf9, 0x00, 0x2e, - 0x40, 0x0f, 0x94, 0x03, 0x64, 0x10, 0xf9, 0x00, - 0x7e, 0x40, 0x0f, 0x90, 0x02, 0x24, 0x10, 0xc9, - 0x00, 0x36, 0x40, 0x0c, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xc2, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, - 0x64, 0x00, 0xb9, 0x80, 0x2e, 0x56, 0x0f, 0x90, - 0x02, 0xc4, 0x42, 0xa1, 0x88, 0x22, 0x40, 0x08, - 0x90, 0x03, 0x64, 0x04, 0xf9, 0x00, 0x2e, 0x60, - 0x08, 0x11, 0x02, 0x24, 0x10, 0xb9, 0xed, 0x09, - 0x00, 0xf2, 0x01, 0x00, 0x26, 0x41, 0x0e, 0x9c, - 0x02, 0xe6, 0x01, 0xb9, 0x20, 0x6e, 0x40, 0x0b, - 0x90, 0x02, 0x24, 0x00, 0x89, 0xe2, 0x2c, 0x54, - 0x0d, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x05, 0x25, 0x00, 0xbb, - 0x80, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe5, 0x01, - 0x89, 0x10, 0x2a, 0x40, 0x09, 0x90, 0x02, 0x24, - 0x00, 0xb9, 0x00, 0x2e, 0x44, 0x0a, 0x94, 0x02, - 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, - 0xa2, 0xe5, 0x40, 0xb9, 0x21, 0x2a, 0x41, 0x0b, - 0x90, 0x02, 0xa4, 0x01, 0x89, 0x20, 0x26, 0x50, - 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x14, 0x04, 0x00, 0xb1, - 0x04, 0x2c, 0x40, 0x0a, 0x10, 0x02, 0xc4, 0x00, - 0xa1, 0x00, 0x20, 0x50, 0x09, 0x14, 0x02, 0x45, - 0x00, 0xa1, 0x00, 0x2e, 0xc0, 0x08, 0x10, 0x02, - 0x05, 0x00, 0xb1, 0x44, 0x24, 0x51, 0x0b, 0x10, - 0x02, 0xc4, 0x04, 0xb1, 0x00, 0x2c, 0x50, 0x0b, - 0x14, 0x02, 0x85, 0x09, 0x81, 0x00, 0x2c, 0x40, - 0x09, 0x14, 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xf8, 0x0d, 0x60, 0x10, 0xf8, - 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x03, 0xe0, 0x04, - 0xc8, 0x00, 0xb2, 0x00, 0x0d, 0x80, 0x0b, 0x20, - 0x00, 0xb8, 0x00, 0x3e, 0x00, 0x0e, 0x80, 0x0b, - 0x20, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x08, 0xb8, 0x02, 0x3a, 0x00, 0x0f, - 0x00, 0x0b, 0xa0, 0x02, 0xc8, 0x00, 0x36, 0x00, - 0x8c, 0x80, 0x23, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xfe, 0x03, 0x50, 0x00, - 0x00, 0xed, 0x09, 0x00, 0xf3, 0x01, 0x00, 0x00, - 0x98, 0x95, 0xe5, 0x00, 0xfd, 0x00, 0x3f, 0x40, - 0x0f, 0xd0, 0x23, 0xc5, 0x00, 0xd1, 0x40, 0x3e, - 0x50, 0x0e, 0x94, 0x03, 0xf4, 0x00, 0xf9, 0x40, - 0x3f, 0x40, 0x0f, 0x94, 0x03, 0xe5, 0x00, 0xfd, - 0x04, 0x3e, 0x50, 0x0e, 0x94, 0x63, 0xe5, 0x00, - 0xf9, 0x40, 0x3e, 0x40, 0x0f, 0xd0, 0x01, 0x74, - 0x10, 0xf1, 0x40, 0x3e, 0x50, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe6, 0x26, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x05, 0x74, 0x00, 0xfd, 0x00, 0x35, 0x40, - 0x04, 0xd0, 0x03, 0x14, 0x30, 0x8d, 0x20, 0x3e, - 0x48, 0x0c, 0x92, 0x01, 0x24, 0x00, 0xed, 0x00, - 0x3f, 0x40, 0x0d, 0xd2, 0x02, 0xe4, 0xa8, 0xfb, - 0x01, 0x2e, 0x46, 0x06, 0xd2, 0x43, 0x54, 0x00, - 0xfd, 0x00, 0x22, 0x50, 0x0f, 0x94, 0x03, 0xe4, - 0x00, 0xfd, 0x28, 0x33, 0x40, 0x8f, 0x94, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xc6, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x18, 0xe0, 0x00, 0xb8, 0x04, 0x2a, 0x00, - 0x0b, 0x80, 0x02, 0x21, 0x00, 0x88, 0x40, 0x26, - 0x0a, 0x08, 0x86, 0x02, 0x08, 0xa0, 0x88, 0x00, - 0x2e, 0x00, 0x00, 0x80, 0x00, 0xe1, 0x80, 0xb8, - 0x00, 0x2c, 0x10, 0x0a, 0x84, 0x02, 0xa0, 0x10, - 0xb8, 0x00, 0x2a, 0x00, 0x0b, 0x80, 0x02, 0xc0, - 0x94, 0xb8, 0x40, 0xa2, 0x00, 0x0b, 0x80, 0x02, - 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, 0x80, - 0x02, 0xce, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x05, 0x85, 0x00, 0xb1, 0x00, 0x24, 0x40, - 0x09, 0x10, 0x02, 0x84, 0x02, 0x81, 0x40, 0x24, - 0x50, 0x08, 0x11, 0x82, 0x04, 0x00, 0x81, 0x40, - 0x2c, 0x60, 0x09, 0x14, 0x06, 0x44, 0x20, 0xb1, - 0x28, 0x2c, 0x48, 0x08, 0xed, 0x09, 0x00, 0xf4, - 0x01, 0x11, 0x02, 0x05, 0x10, 0x81, 0x40, 0x20, - 0x48, 0x0a, 0x12, 0x26, 0xc6, 0xa0, 0xb1, 0x00, - 0x28, 0x51, 0x03, 0x10, 0x02, 0xc4, 0x00, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xd2, 0x01, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x98, 0x04, 0xa4, - 0x00, 0xb9, 0x10, 0x22, 0x70, 0x4b, 0x90, 0x12, - 0xa4, 0x00, 0x8b, 0x00, 0x24, 0x40, 0x08, 0x90, - 0x22, 0x06, 0x00, 0x89, 0x00, 0x2e, 0x41, 0x08, - 0x90, 0x06, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x8a, 0x90, 0x02, 0xac, 0x00, 0x99, 0x00, 0x0a, - 0x40, 0x0b, 0x94, 0x02, 0xe4, 0x40, 0xb9, 0x00, - 0x22, 0x40, 0x09, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe6, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe4, - 0x00, 0xf9, 0x88, 0x36, 0x70, 0x4c, 0x90, 0x0b, - 0xa4, 0x02, 0xc9, 0x01, 0x3e, 0x40, 0x2c, 0x90, - 0x0b, 0x25, 0x02, 0xc9, 0x00, 0x3c, 0x64, 0x0d, - 0x90, 0x03, 0xe4, 0x04, 0xb9, 0x90, 0x3e, 0x40, - 0x0c, 0x10, 0x03, 0x64, 0x00, 0xd9, 0x00, 0x22, - 0x40, 0x0f, 0x9d, 0x03, 0xe6, 0x04, 0xf9, 0x00, - 0x3a, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe8, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x01, 0xa4, - 0x00, 0xf9, 0x80, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0x64, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0x64, 0x04, 0xf9, 0x00, 0x3e, 0x41, 0x0f, - 0x90, 0x43, 0xe4, 0x00, 0xf9, 0x80, 0x3e, 0x41, - 0x0f, 0x90, 0x13, 0xe4, 0x14, 0xf9, 0x01, 0x3e, - 0x40, 0x4f, 0x98, 0x03, 0xe6, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x4f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xda, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xed, - 0x09, 0x00, 0xf5, 0x01, 0xa2, 0x00, 0xf8, 0x01, - 0x3a, 0x20, 0x2f, 0x80, 0x43, 0xc2, 0x50, 0xc8, - 0x80, 0x36, 0x01, 0x0c, 0x00, 0x03, 0x20, 0x00, - 0xc8, 0x00, 0x3e, 0x20, 0x0d, 0x82, 0x03, 0x60, - 0x00, 0xf8, 0x03, 0x3c, 0x00, 0x0e, 0x88, 0x03, - 0xe0, 0x22, 0x90, 0x80, 0x3e, 0x00, 0x2e, 0x80, - 0x03, 0xe0, 0x02, 0xc0, 0x80, 0x3e, 0x04, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x01, 0xbb, 0x00, 0xb2, 0x00, - 0x23, 0xb8, 0x0c, 0x2a, 0x02, 0xf9, 0x02, 0x8e, - 0xc0, 0xa2, 0x80, 0x08, 0xa0, 0x42, 0x28, 0x00, - 0x8a, 0x80, 0x2f, 0xb0, 0x4b, 0xe0, 0x82, 0xe8, - 0x00, 0xba, 0x00, 0x2e, 0x80, 0x00, 0xec, 0x82, - 0xfb, 0x80, 0x8e, 0x40, 0x26, 0x80, 0x08, 0xa0, - 0x02, 0xe8, 0x00, 0x8e, 0x4c, 0x0f, 0xb4, 0x0e, - 0xa0, 0x02, 0xe8, 0x00, 0xba, 0x00, 0x2e, 0x80, - 0x0b, 0xa0, 0x02, 0xca, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x04, 0x4a, 0x40, 0xb1, 0x00, - 0x20, 0xe1, 0x28, 0x38, 0x02, 0xcc, 0x10, 0x83, - 0x90, 0x20, 0xc0, 0x08, 0x30, 0x02, 0x0c, 0x01, - 0x81, 0x80, 0x2c, 0x40, 0x09, 0x00, 0x02, 0x4c, - 0x00, 0x93, 0x00, 0x2c, 0xc0, 0x0a, 0x10, 0x02, - 0xc2, 0x08, 0x81, 0x10, 0x2c, 0xc0, 0x08, 0x30, - 0x22, 0x4c, 0x04, 0x81, 0x00, 0x2c, 0x80, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xca, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x10, 0x54, 0x00, 0xbd, 0x08, - 0xa1, 0x20, 0x2a, 0x70, 0x02, 0xdc, 0x04, 0x87, - 0x81, 0x28, 0xc8, 0x08, 0x32, 0x02, 0x1c, 0x80, - 0x87, 0x08, 0x25, 0xd0, 0x0b, 0x70, 0x62, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0xc8, 0xc0, 0x70, 0x22, - 0xde, 0x00, 0xed, 0x09, 0x00, 0xf6, 0x01, 0x87, - 0x00, 0x25, 0xe4, 0x08, 0x70, 0x02, 0xde, 0x80, - 0x87, 0x00, 0x2d, 0x40, 0x8a, 0x71, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xe8, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x88, - 0x88, 0x52, 0x00, 0xf5, 0x80, 0x31, 0x21, 0x0c, - 0x78, 0x23, 0xde, 0x00, 0x43, 0x80, 0x35, 0xf2, - 0x2c, 0x7d, 0x03, 0x1e, 0x82, 0x47, 0x80, 0x3d, - 0xe0, 0x0d, 0x78, 0x03, 0x5e, 0x00, 0xd7, 0xb0, - 0x3d, 0xea, 0x0e, 0x78, 0x23, 0xde, 0x00, 0x87, - 0x80, 0x3f, 0xe4, 0x4c, 0x7c, 0x03, 0x5f, 0x00, - 0xc7, 0x80, 0x3d, 0x60, 0x07, 0x7a, 0x83, 0xde, - 0x00, 0xf7, 0x80, 0x3d, 0xe0, 0x0f, 0x78, 0x03, - 0xea, 0x22, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, - 0x15, 0xa4, 0x00, 0xf1, 0x00, 0x36, 0xc0, 0x05, - 0xb0, 0x03, 0xec, 0x00, 0x5b, 0x00, 0x36, 0xc8, - 0x8f, 0xb2, 0x0b, 0xed, 0xc0, 0xdb, 0x02, 0x3e, - 0xc0, 0x0f, 0xb0, 0x01, 0xec, 0x40, 0xfb, 0x20, - 0x3e, 0xc0, 0x0f, 0x90, 0x43, 0xec, 0x04, 0xeb, - 0x00, 0x3e, 0xc8, 0x0b, 0xb2, 0x00, 0xed, 0x80, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb6, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xc2, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x92, 0x00, 0xc7, 0x80, 0x3b, 0x20, 0x0f, - 0xd9, 0x03, 0xfa, 0x00, 0xfe, 0x81, 0x37, 0xe0, - 0x0c, 0xf8, 0x03, 0x3f, 0x00, 0xcf, 0x80, 0x33, - 0xe4, 0x1f, 0xf9, 0x03, 0x7f, 0x00, 0x6f, 0x88, - 0x3f, 0xe2, 0x0c, 0xf8, 0x01, 0xfe, 0x00, 0x7f, - 0x90, 0x3f, 0xe0, 0x0f, 0xfc, 0x03, 0xff, 0x08, - 0xff, 0x80, 0x3f, 0x60, 0x0f, 0xf8, 0x03, 0xfe, - 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, - 0xc0, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x18, 0x94, 0x00, 0x85, 0x00, 0xed, 0x09, 0x00, - 0xf7, 0x01, 0x21, 0xc6, 0x0b, 0x50, 0x22, 0xdc, - 0x00, 0xb7, 0x00, 0x21, 0xc0, 0x08, 0x72, 0x02, - 0x3c, 0x20, 0x87, 0x00, 0x21, 0x46, 0x0e, 0x75, - 0x0a, 0x1c, 0x00, 0x87, 0x00, 0x2f, 0xc0, 0x08, - 0x70, 0x4a, 0x18, 0x00, 0x97, 0x00, 0x2d, 0xc1, - 0x0b, 0x70, 0xc2, 0x5c, 0x60, 0xb7, 0x00, 0x2d, - 0x00, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xea, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, - 0x8d, 0x00, 0x29, 0xd0, 0x0b, 0x50, 0xa2, 0xd8, - 0x00, 0xb6, 0x10, 0x21, 0xc0, 0x08, 0x70, 0x00, - 0x1c, 0x00, 0x85, 0x00, 0x21, 0xc0, 0x83, 0x41, - 0x02, 0x9c, 0x00, 0x87, 0x00, 0x29, 0xc0, 0x0a, - 0x70, 0x02, 0x14, 0x00, 0xb5, 0x02, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xdd, 0x00, 0xa5, 0x00, 0x2d, - 0x40, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, - 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xc0, 0x20, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x80, 0x00, - 0x81, 0x00, 0x20, 0x20, 0x09, 0x10, 0x02, 0xc8, - 0x00, 0xb2, 0x01, 0x20, 0xc0, 0x08, 0x30, 0x02, - 0x0f, 0x20, 0xa3, 0x00, 0x20, 0xd0, 0x0a, 0x30, - 0x42, 0x2c, 0x00, 0x83, 0x80, 0x24, 0xc0, 0x0a, - 0x30, 0x22, 0x8c, 0x19, 0x13, 0x00, 0x2c, 0xc0, - 0x1b, 0x38, 0x20, 0x4c, 0x00, 0xb3, 0x00, 0x2c, - 0x40, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc8, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, 0xe0, 0x00, - 0xcb, 0x80, 0x38, 0x10, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0xb3, 0xc0, 0x2c, 0xf0, 0x0b, - 0x1e, 0x00, 0xcb, 0x00, 0xb2, 0xe4, 0x0b, 0xb0, - 0x23, 0xfc, 0x0a, 0xcf, 0x08, 0x3f, 0xc0, 0x0e, - 0xb0, 0x03, 0x4c, 0x00, 0xbb, 0x00, 0x3f, 0xc0, - 0xed, 0x09, 0x00, 0xf8, 0x01, 0x0f, 0xf8, 0x03, - 0xfe, 0x00, 0xfb, 0x00, 0x3e, 0x40, 0x0f, 0xf0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xea, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x01, 0xa4, 0x08, 0xf9, 0x30, 0x3e, - 0xd0, 0x0f, 0x90, 0x23, 0xec, 0x00, 0xf9, 0x40, - 0x38, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xd1, - 0x00, 0x3e, 0xc0, 0x0f, 0x84, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0d, 0x34, 0x03, 0x64, - 0x00, 0xd9, 0x40, 0x3e, 0xc0, 0x0f, 0xb0, 0x82, - 0xec, 0x00, 0xf9, 0x00, 0x3c, 0x40, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xe0, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x21, 0x10, 0xba, 0x80, 0xed, 0x90, 0x3f, - 0xc0, 0x1c, 0xd0, 0x03, 0x35, 0x04, 0xcf, 0xa0, - 0x33, 0xc0, 0x0c, 0xf0, 0x03, 0x7c, 0x00, 0xcb, - 0x10, 0x33, 0x40, 0x0e, 0xb1, 0x03, 0xfc, 0x00, - 0xcf, 0x00, 0x37, 0xc0, 0x09, 0xb1, 0x02, 0x38, - 0x00, 0xd7, 0xa0, 0x33, 0xc0, 0x0c, 0xf0, 0x03, - 0xfc, 0x00, 0xf7, 0x00, 0x33, 0x00, 0x0c, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xc0, 0x44, 0x20, 0x00, 0x00, 0x00, - 0x00, 0xa1, 0x04, 0x46, 0x00, 0x89, 0x00, 0x2e, - 0x28, 0x0c, 0x10, 0x22, 0x05, 0x80, 0x81, 0xc0, - 0x22, 0xc0, 0x00, 0xb0, 0x03, 0x6c, 0x10, 0xdb, - 0x00, 0x22, 0xc0, 0x0b, 0xbc, 0x02, 0xec, 0x00, - 0x83, 0x00, 0x22, 0xc0, 0x0b, 0xb6, 0x02, 0x2c, - 0x00, 0x8b, 0xa0, 0x22, 0xc0, 0x08, 0xb0, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0xa2, 0x64, 0x08, 0xb0, - 0x02, 0xec, 0x00, 0xeb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xe0, 0x40, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x05, 0x20, 0x00, 0xb9, 0x01, 0x2e, - 0xc4, 0x0a, 0xb2, 0xed, 0x09, 0x00, 0xf9, 0x01, - 0x02, 0x2c, 0x00, 0x8b, 0x04, 0x22, 0xc1, 0x08, - 0x30, 0x02, 0x2c, 0x00, 0x8b, 0x00, 0x22, 0xc4, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0x9b, 0x00, 0x66, - 0xc0, 0x09, 0x90, 0x02, 0xac, 0x82, 0x8b, 0x00, - 0x20, 0xc0, 0x0a, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x20, 0x62, 0xc0, 0x08, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x14, - 0x04, 0x00, 0xb1, 0x04, 0x2e, 0x00, 0x28, 0xb0, - 0x00, 0x00, 0x03, 0xa0, 0x00, 0x20, 0xc0, 0x08, - 0x30, 0x02, 0x6c, 0x00, 0x93, 0x00, 0xa0, 0xe0, - 0x0b, 0x30, 0x32, 0xcc, 0x02, 0x9b, 0x00, 0x20, - 0xc0, 0x0b, 0x30, 0x0a, 0x8c, 0x01, 0x83, 0x00, - 0xa0, 0xc0, 0x2a, 0x30, 0x06, 0xcc, 0x00, 0xb3, - 0x80, 0x00, 0x60, 0x08, 0x30, 0x02, 0xcc, 0x00, - 0xa3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x12, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, - 0x64, 0x00, 0xf9, 0x02, 0x2e, 0x00, 0x0a, 0xb0, - 0x03, 0x20, 0x04, 0xc8, 0x00, 0xb1, 0xc0, 0x2c, - 0x70, 0x03, 0x3c, 0x00, 0xcb, 0x00, 0x32, 0xc0, - 0x0f, 0xb0, 0x03, 0xdc, 0x00, 0xdf, 0x00, 0x37, - 0xc0, 0x0d, 0xb0, 0x03, 0xac, 0x00, 0xcb, 0x00, - 0x33, 0xc0, 0x0a, 0xf0, 0x03, 0xfc, 0x00, 0xfb, - 0x00, 0x32, 0x40, 0x2c, 0xf0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xc0, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x15, - 0xf0, 0x00, 0xcd, 0x00, 0x3f, 0xc0, 0x0e, 0xf0, - 0x23, 0xf0, 0x00, 0xd4, 0x00, 0x1f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xfd, 0x00, 0x3f, 0x00, - 0x0f, 0xc0, 0x03, 0xfc, 0x00, 0xef, 0x00, 0x1f, - 0xc0, 0x0f, 0xc0, 0x03, 0x70, 0x01, 0xfc, 0x00, - 0x3f, 0xc0, 0x0d, 0xf0, 0x03, 0xfc, 0xed, 0x09, - 0x00, 0xfa, 0x01, 0x00, 0xfc, 0x04, 0x3f, 0x80, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xe8, 0x06, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x05, 0xd0, 0x52, 0xcc, - 0x28, 0x33, 0x80, 0x0c, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xc0, 0x03, 0xf4, - 0x10, 0xfd, 0x00, 0x3f, 0x00, 0x0f, 0xe0, 0x03, - 0x74, 0x10, 0xff, 0x00, 0x3d, 0xc0, 0x0c, 0xf0, - 0x03, 0xbc, 0x04, 0xfc, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x20, 0xfc, 0x20, 0x3f, 0xc4, - 0x4c, 0x70, 0x03, 0xd0, 0x08, 0xcf, 0x00, 0x3f, - 0xc8, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x10, 0xe0, 0x88, 0xd8, - 0x40, 0x62, 0x80, 0x08, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, - 0x00, 0xb9, 0x00, 0x2e, 0xc0, 0x0b, 0xa0, 0x02, - 0xe0, 0x00, 0xb8, 0x04, 0x2e, 0x00, 0x08, 0x80, - 0x02, 0x20, 0x00, 0xba, 0x01, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xed, 0x04, 0xb9, 0x28, 0x2e, 0xc8, - 0x0d, 0xa0, 0x02, 0xe0, 0x04, 0xdb, 0x18, 0x2e, - 0xd0, 0x0b, 0xb0, 0x02, 0xe0, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x88, 0x05, 0xcc, 0x80, 0x80, - 0x00, 0x6e, 0x80, 0x88, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x38, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x20, 0x12, - 0x44, 0x01, 0xb3, 0x01, 0x2e, 0xc0, 0x19, 0x30, - 0x12, 0xcc, 0x00, 0xb2, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb0, 0x30, 0x2c, 0xc0, - 0x08, 0x20, 0x02, 0xe0, 0x02, 0x83, 0x20, 0x2c, - 0xc4, 0x0b, 0x30, 0x02, 0xe2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x15, 0xac, 0x40, 0x98, - 0xc0, 0x6a, 0x80, 0x08, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0xed, 0x09, 0x00, 0xfb, 0x01, 0x00, 0x2e, - 0xc1, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xba, 0x02, - 0x2e, 0x44, 0x0b, 0xa0, 0x02, 0xe0, 0x01, 0xb8, - 0x00, 0x2e, 0x00, 0x31, 0x80, 0x02, 0x60, 0x00, - 0xbb, 0x08, 0x2e, 0xc0, 0x03, 0xb0, 0x02, 0xec, - 0x00, 0xb9, 0xc0, 0x2e, 0xc0, 0x09, 0xb0, 0x82, - 0xe0, 0x00, 0x9b, 0x00, 0x2e, 0xc1, 0x0b, 0xb0, - 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x15, 0xe0, 0x00, 0xc9, 0xc0, 0xbe, 0xa1, - 0x0c, 0xb0, 0x23, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb8, 0x13, 0xec, 0x48, 0xfb, 0xa0, - 0x3e, 0xf0, 0x0f, 0xa0, 0x03, 0x64, 0x00, 0xfb, - 0x05, 0x3e, 0xc0, 0x05, 0xb0, 0x43, 0xec, 0x00, - 0xf8, 0x40, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x04, 0xf9, 0x81, 0x3e, 0xc1, 0x0c, 0xa4, 0x03, - 0xc2, 0x88, 0xcb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xd0, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x01, 0xb6, 0x00, 0xf1, 0x00, 0x37, 0xf0, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xd1, 0x00, 0xfe, 0x20, 0xff, 0x10, - 0x3f, 0xe0, 0x0f, 0xe0, 0x03, 0xf0, 0x00, 0xfc, - 0x00, 0x3f, 0x00, 0x0e, 0xc0, 0x43, 0xb0, 0x08, - 0x7f, 0x40, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xec, - 0x00, 0xb9, 0x02, 0x3f, 0xc0, 0x0f, 0xf0, 0x43, - 0xf2, 0x80, 0xbf, 0x00, 0x3e, 0xc0, 0x0f, 0xf0, - 0x03, 0xf8, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x10, 0xac, 0x40, 0xc9, 0x58, 0x32, 0xc2, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc2, 0x0f, 0xa0, 0x83, 0xe4, 0x00, 0xfb, 0x00, - 0x3e, 0x88, 0x0f, 0xa0, 0x03, 0xe4, 0x20, 0xfb, - 0x00, 0x3e, 0xc2, 0x0c, 0xb2, 0x03, 0x2c, 0x00, - 0xfa, 0x50, 0x3e, 0xc1, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xc9, 0x40, 0x32, 0xed, 0x09, 0x00, 0xfc, - 0x01, 0xc8, 0x0c, 0xb4, 0x83, 0x22, 0x00, 0xcb, - 0x20, 0x36, 0xc0, 0x0c, 0xb0, 0x03, 0xd0, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2d, - 0x04, 0x89, 0x80, 0x0c, 0x90, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb2, - 0x42, 0xed, 0x00, 0xbb, 0x00, 0x2e, 0xd0, 0x0b, - 0xa5, 0x90, 0xe3, 0x00, 0xb8, 0xd9, 0x2c, 0x08, - 0x08, 0x06, 0x02, 0x21, 0x40, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xfc, 0x01, 0x89, 0xa0, - 0x22, 0xf0, 0x08, 0xa4, 0x02, 0x24, 0x00, 0xdf, - 0xc8, 0x6b, 0xc1, 0x0d, 0xb0, 0x02, 0xf2, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x60, - 0x00, 0x80, 0xc0, 0x04, 0x10, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xd0, 0x0b, 0x30, - 0x02, 0xcf, 0x10, 0x33, 0x00, 0x2c, 0xc0, 0x0b, - 0x2c, 0x00, 0xc7, 0x00, 0xb3, 0x80, 0x2c, 0xc0, - 0x0b, 0x34, 0x02, 0x0d, 0x40, 0xb2, 0x20, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x06, 0x82, 0x80, - 0x22, 0xc0, 0x08, 0x24, 0x02, 0x00, 0x00, 0x83, - 0x40, 0x20, 0xc0, 0x08, 0x30, 0x02, 0xf8, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x33, - 0x00, 0x87, 0x80, 0x2d, 0xa4, 0x0b, 0x78, 0x02, - 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x68, - 0x42, 0xd6, 0x00, 0xb7, 0x80, 0x2d, 0xa0, 0x0b, - 0x68, 0x02, 0xd2, 0x00, 0xb4, 0x80, 0x2f, 0x20, - 0x0b, 0xc8, 0x02, 0x12, 0x00, 0xb7, 0x81, 0x0d, - 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0x87, 0xc0, - 0x21, 0xe0, 0x08, 0x79, 0x02, 0x32, 0x00, 0x97, - 0x80, 0x29, 0xe0, 0x09, 0x78, 0x02, 0xc8, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x08, 0x0c, - 0x00, 0xc2, 0x10, 0x30, 0xd0, 0x0f, 0x30, 0x03, - 0xcc, 0x00, 0xf3, 0x00, 0x3c, 0xc0, 0x0f, 0xed, - 0x09, 0x00, 0xfd, 0x01, 0x12, 0x03, 0xcc, 0x20, - 0xf1, 0x10, 0x3c, 0xc0, 0x0f, 0x20, 0x03, 0xc4, - 0x20, 0xf3, 0x10, 0x3c, 0xc0, 0x4f, 0x31, 0x03, - 0x0c, 0x40, 0xf2, 0x00, 0x3c, 0xc0, 0x0b, 0x30, - 0x03, 0xcc, 0x40, 0x81, 0x00, 0xb2, 0xc2, 0x2c, - 0x31, 0x03, 0x00, 0x00, 0xc3, 0x01, 0x30, 0xc0, - 0x1c, 0x30, 0x03, 0xd2, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x1d, 0xbc, 0x02, 0xfe, 0x00, - 0x3b, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xfd, 0x00, 0x3f, 0xc0, 0x4f, 0xe0, 0x03, 0xf0, - 0x00, 0xfc, 0x00, 0x3f, 0x04, 0x2c, 0x41, 0x4b, - 0xf2, 0x44, 0xff, 0x10, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xfc, 0x30, 0xff, 0x10, 0x3f, 0xc0, 0x0f, - 0xe5, 0x0b, 0xf0, 0x00, 0xf7, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xd0, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x05, 0xe8, 0x00, 0xf9, 0x00, - 0x3e, 0xe0, 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0d, 0xb0, 0x03, 0xec, 0x04, - 0xfb, 0x00, 0x3c, 0x40, 0x0e, 0x20, 0x03, 0x86, - 0x00, 0xeb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x04, 0xfa, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xfa, 0x80, 0xb2, 0xc0, 0x0f, - 0xb8, 0x03, 0x20, 0x01, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x11, 0x9c, 0x10, 0xb7, 0x01, - 0x2d, 0xc0, 0x0d, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x0d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0xc8, 0x60, 0x10, 0x90, - 0x00, 0x84, 0x00, 0x2d, 0x00, 0x0b, 0x40, 0x02, - 0xd0, 0x00, 0xb7, 0x00, 0x25, 0xc0, 0x0b, 0x70, - 0x02, 0xde, 0x00, 0xb7, 0x00, 0x35, 0xc0, 0x0b, - 0x60, 0x02, 0xed, 0x09, 0x00, 0xfe, 0x01, 0x18, - 0x10, 0xb7, 0xa0, 0x2d, 0xe8, 0x0b, 0x70, 0x02, - 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x00, 0x9e, 0x20, 0xb7, 0x80, 0x2d, 0xe0, 0x08, - 0x78, 0x12, 0xde, 0x01, 0xb7, 0x80, 0x2d, 0xe0, - 0x09, 0x78, 0x82, 0xde, 0x00, 0xb7, 0x80, 0x2f, - 0xe2, 0x0b, 0xe8, 0x00, 0xd6, 0x00, 0xa7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x04, 0xb6, - 0x80, 0x6d, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x80, - 0xb7, 0x80, 0xa1, 0xe0, 0x0b, 0x68, 0x0a, 0x52, - 0x04, 0xb7, 0xb0, 0x2d, 0xec, 0x0b, 0x78, 0x02, - 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x14, 0xce, 0x20, 0xb3, 0x48, 0x2c, 0xe0, 0x09, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x08, 0x02, 0xc4, 0x00, 0xb3, 0x80, 0x2c, - 0x20, 0x09, 0x20, 0x02, 0x40, 0x00, 0x80, 0x02, - 0x2c, 0x00, 0x0b, 0x00, 0x02, 0xc0, 0x05, 0xb3, - 0x00, 0x24, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x04, 0xa4, 0xc0, 0x0b, 0x34, 0x02, 0x42, - 0x20, 0xb3, 0x03, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xd2, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, - 0x15, 0xb9, 0x00, 0xfe, 0x40, 0x3f, 0x98, 0x0c, - 0xa0, 0x03, 0xe8, 0x00, 0xfa, 0x00, 0x3e, 0x80, - 0x0d, 0xe8, 0x03, 0xe8, 0x20, 0xfe, 0xc0, 0x3f, - 0x90, 0x0f, 0xa0, 0x03, 0xe8, 0x00, 0xea, 0x00, - 0x3e, 0x80, 0x4f, 0xa0, 0x03, 0xc8, 0x00, 0xfe, - 0x40, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xe8, 0x00, - 0xfe, 0x52, 0xb2, 0x80, 0x0f, 0xa4, 0x23, 0x59, - 0x00, 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, - 0xfa, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x00, 0xe0, 0x00, 0xf8, 0x02, 0x1e, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0b, 0x88, 0x03, 0xe0, 0x00, 0xed, 0x09, 0x00, - 0xff, 0x01, 0xf8, 0x90, 0x3e, 0x08, 0x0e, 0x80, - 0x03, 0xb0, 0x00, 0xfc, 0x00, 0x2f, 0x00, 0x0f, - 0xc0, 0x03, 0xf1, 0x01, 0xf8, 0x80, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x40, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xa0, 0x48, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xd2, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, - 0xf9, 0x40, 0x3e, 0x42, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x43, - 0xe4, 0x00, 0xf9, 0x00, 0x1e, 0x40, 0x0d, 0x90, - 0x03, 0x64, 0x00, 0xf9, 0x00, 0x7a, 0x40, 0x4c, - 0x91, 0x01, 0xe6, 0x00, 0xe9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x07, 0xc4, 0x00, 0xd9, 0x10, 0x3e, - 0x40, 0x0c, 0x98, 0x83, 0xe4, 0x00, 0xc9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xc2, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x64, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x26, 0x40, 0x0b, 0x90, 0x02, - 0xe4, 0x01, 0x99, 0x00, 0x2c, 0x40, 0x08, 0x10, - 0x02, 0x24, 0x00, 0xb9, 0x00, 0x3c, 0x40, 0xcd, - 0x90, 0x02, 0xe4, 0x50, 0x89, 0x80, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0x89, 0x40, 0x2e, - 0x40, 0x08, 0x90, 0x02, 0xe4, 0x00, 0x89, 0x05, - 0x3a, 0x40, 0x0b, 0x90, 0x02, 0xe0, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0x24, 0x00, - 0xb9, 0x00, 0x2e, 0x41, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, - 0xe4, 0x04, 0xb9, 0x00, 0x2e, 0xc0, 0x09, 0x90, - 0x02, 0xe4, 0x00, 0xbd, 0x00, 0x0f, 0x40, 0x1a, - 0xd0, 0x02, 0xf4, 0x02, 0x89, 0x10, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xe4, 0x00, 0x99, 0x40, 0x2c, - 0x40, 0x18, 0x92, 0x06, 0xe4, 0x42, 0x89, 0x24, - 0xed, 0x09, 0x00, 0x00, 0x02, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x07, 0x00, 0xb1, 0x80, 0x2c, - 0xc0, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, - 0x2c, 0x40, 0x0b, 0x10, 0x12, 0xc4, 0x00, 0x91, - 0x00, 0x2e, 0x40, 0x18, 0x10, 0x42, 0x94, 0x00, - 0xb5, 0x00, 0x2d, 0x40, 0x0b, 0x50, 0x02, 0xd4, - 0x00, 0x01, 0x00, 0x0c, 0x40, 0x0b, 0x10, 0x02, - 0xc4, 0x08, 0x81, 0x40, 0x2c, 0x50, 0x38, 0x10, - 0x02, 0xc4, 0x00, 0x81, 0x40, 0x28, 0x40, 0x0b, - 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb8, 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x02, 0xe0, 0x00, 0xb8, - 0x00, 0x3e, 0x00, 0x0d, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3a, 0x00, 0x0e, 0xa0, 0x03, 0xf8, - 0x00, 0xea, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x02, - 0xe0, 0x00, 0xd8, 0x00, 0x3e, 0x00, 0x0c, 0xc0, - 0x03, 0xe0, 0x00, 0xc8, 0x00, 0x3e, 0x00, 0xcf, - 0x80, 0x03, 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x98, 0x1d, 0xfc, 0x00, 0xfd, 0x40, 0x3d, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x36, 0x40, 0x0f, 0xd0, 0x03, 0xf4, 0x10, 0x9d, - 0x00, 0x3f, 0x40, 0x0f, 0x90, 0x03, 0x64, 0x00, - 0xf9, 0x00, 0x3a, 0x40, 0x45, 0x90, 0x13, 0xe4, - 0x00, 0xfd, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe5, 0x08, 0xf5, 0x44, 0x3e, 0x40, 0x8f, 0x10, - 0x03, 0xf4, 0x10, 0xf9, 0x40, 0x3e, 0x50, 0x0f, - 0x90, 0x03, 0xe6, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x05, 0xf4, 0x40, 0xfd, 0x00, 0x33, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x10, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0xed, 0x09, 0x00, 0x01, 0x02, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xe1, 0x00, 0x76, - 0x40, 0x0e, 0xd0, 0x03, 0x34, 0x00, 0xcd, 0x04, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xef, - 0x10, 0x33, 0x40, 0x0f, 0xd0, 0x03, 0xf4, 0x00, - 0xcd, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x03, 0xc6, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, - 0xe0, 0x88, 0xb8, 0x40, 0x22, 0x80, 0x0b, 0x80, - 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, - 0x80, 0x22, 0xf0, 0x00, 0xb8, 0x00, 0x2e, 0x00, - 0x03, 0x80, 0x02, 0xe0, 0x00, 0x88, 0x00, 0x23, - 0x01, 0x08, 0x80, 0x02, 0x20, 0x10, 0xa8, 0x00, - 0x2e, 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x00, 0x88, - 0x10, 0xa2, 0x0a, 0x0b, 0xa0, 0x42, 0xe0, 0x02, - 0xd0, 0x48, 0x22, 0x00, 0x0b, 0x80, 0x02, 0xce, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, - 0xcc, 0x80, 0xb1, 0x90, 0x20, 0x40, 0x0b, 0x10, - 0x22, 0xc4, 0x00, 0xb1, 0x00, 0x2d, 0x40, 0x0b, - 0x50, 0x02, 0xd4, 0x00, 0xb1, 0x00, 0x2d, 0x40, - 0x0b, 0x50, 0x02, 0xd4, 0x00, 0xbd, 0x00, 0x21, - 0x40, 0x4b, 0x10, 0x0a, 0x44, 0x06, 0x91, 0x00, - 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x40, 0xa1, - 0x00, 0x20, 0x48, 0x0b, 0x10, 0x02, 0xe4, 0x00, - 0x81, 0x30, 0x20, 0x44, 0x0b, 0x10, 0x02, 0xc2, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, - 0xa4, 0x00, 0xb9, 0x80, 0x22, 0x60, 0x0b, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x1b, - 0xd8, 0x02, 0xf4, 0x00, 0xb9, 0x28, 0x2e, 0x40, - 0x09, 0xd0, 0x02, 0xf4, 0x00, 0x9d, 0x00, 0xe3, - 0x40, 0x09, 0x90, 0x00, 0x64, 0x00, 0xb9, 0x80, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0x89, - 0x00, 0x22, 0x40, 0x0b, 0x90, 0x00, 0xe4, 0x00, - 0x91, 0x00, 0x22, 0x40, 0x0b, 0x90, 0xed, 0x09, - 0x00, 0x02, 0x02, 0x02, 0xc6, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe4, 0x00, 0xf9, - 0x00, 0xb2, 0x70, 0x0f, 0x90, 0x23, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x9c, 0xc3, 0xe6, - 0x04, 0xf9, 0x00, 0x3e, 0x52, 0x0f, 0x90, 0x03, - 0xc4, 0x00, 0xf9, 0x00, 0x76, 0x40, 0x1f, 0x10, - 0x03, 0x44, 0x00, 0xd9, 0x88, 0x1e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xe9, 0x60, 0x32, 0x40, - 0x0f, 0x90, 0x03, 0xe5, 0x20, 0xc9, 0x00, 0xb2, - 0x40, 0x0f, 0x90, 0x03, 0xe8, 0x04, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x01, 0xa5, 0x00, 0xf1, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe6, - 0x40, 0xf9, 0x00, 0x3e, 0x68, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xe9, 0x00, 0x3a, 0x40, 0x0e, 0x90, - 0xa7, 0xa4, 0x08, 0x49, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xc4, 0x00, 0xf9, 0x90, 0x3e, 0x40, - 0x0f, 0x90, 0x23, 0xe4, 0x80, 0xf9, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xca, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x10, 0xa2, 0x00, 0xf8, - 0x80, 0x3e, 0x20, 0x2c, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3f, 0x00, 0x0e, 0xc4, 0x03, 0xf0, - 0x00, 0xd8, 0x40, 0x37, 0x10, 0x0f, 0xc0, 0x03, - 0xf0, 0x00, 0xfc, 0x00, 0x37, 0x00, 0x4e, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x48, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xc8, 0x48, 0x3e, 0x02, - 0x0f, 0x8c, 0x03, 0xe1, 0x00, 0xf8, 0x20, 0x32, - 0x00, 0x0f, 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x05, 0x38, 0x00, 0xbe, - 0xc8, 0x2f, 0x92, 0x08, 0xa0, 0x02, 0xe8, 0x00, - 0xba, 0x00, 0x2e, 0x80, 0x0b, 0xa0, 0x02, 0x28, - 0x00, 0x8a, 0x00, 0x22, 0x80, 0x09, 0xa0, 0x02, - 0xe8, 0xed, 0x09, 0x00, 0x03, 0x02, 0x00, 0xb2, - 0x00, 0x20, 0x80, 0x0b, 0xe4, 0x02, 0xf9, 0x80, - 0xbe, 0x00, 0x2e, 0x80, 0x0b, 0xa0, 0x02, 0xe8, - 0x00, 0x8e, 0xc0, 0x2f, 0xa0, 0x0b, 0xe4, 0x82, - 0xc8, 0x00, 0xbe, 0x80, 0x22, 0x80, 0x0b, 0xa0, - 0x02, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x04, 0x0c, 0x00, 0xb2, 0x80, 0x2c, 0xe0, - 0x08, 0x30, 0x02, 0xcc, 0x00, 0xb2, 0x00, 0x2c, - 0x00, 0x0a, 0x00, 0x02, 0x40, 0x00, 0x92, 0x00, - 0x24, 0x00, 0x0b, 0x00, 0x02, 0xc0, 0x00, 0xb0, - 0x00, 0x24, 0x00, 0x0b, 0x01, 0x02, 0xc1, 0x81, - 0xb0, 0x10, 0x6c, 0xc0, 0x0b, 0x30, 0x02, 0x8c, - 0x02, 0x8a, 0x40, 0x2c, 0xf0, 0x03, 0x08, 0x02, - 0xc4, 0x40, 0xb1, 0x80, 0x20, 0xc0, 0x0b, 0x30, - 0x02, 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x01, 0x18, 0x04, 0xb7, 0x00, 0x2d, 0xe0, - 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb6, 0x00, 0x2d, - 0x40, 0x0b, 0xf8, 0x02, 0x5e, 0x00, 0x8e, 0x80, - 0x61, 0x40, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x08, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xcc, - 0x00, 0x87, 0x40, 0x2d, 0xd0, 0x0b, 0x50, 0x02, - 0xdc, 0x00, 0xb4, 0x09, 0x21, 0xc0, 0x03, 0x70, - 0x02, 0xe8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x08, 0x1e, 0x00, 0xf6, 0x80, 0x3d, 0xe0, - 0x0c, 0x78, 0x03, 0xde, 0x00, 0xf6, 0x80, 0x3d, - 0x20, 0x0e, 0x48, 0x07, 0x52, 0x00, 0xd6, 0x80, - 0x35, 0x20, 0x0f, 0x48, 0x43, 0xd2, 0x10, 0xf4, - 0x81, 0x75, 0x21, 0x0e, 0x78, 0x03, 0xde, 0x00, - 0xf7, 0x80, 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0x9e, - 0x00, 0xc6, 0x80, 0x3d, 0xe0, 0x0f, 0x68, 0x03, - 0xde, 0x04, 0xf7, 0x80, 0xa1, 0xe1, 0x0f, 0x78, - 0x03, 0xea, 0x02, 0x00, 0xed, 0x09, 0x00, 0x04, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, 0xa8, - 0x10, 0xfa, 0x00, 0x3c, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfa, 0x00, 0x3e, 0x40, 0x0f, 0xb0, - 0x16, 0x0c, 0x10, 0xf2, 0x00, 0x3e, 0x40, 0x0d, - 0xb0, 0x03, 0xec, 0x00, 0xdb, 0x00, 0x7a, 0xc0, - 0x0d, 0x80, 0x03, 0xe4, 0x04, 0xfa, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x13, 0xe4, 0x00, 0xf8, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xc2, 0x06, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, - 0x00, 0xff, 0x80, 0x33, 0xe0, 0x0c, 0xf8, 0x03, - 0xfe, 0x00, 0xfe, 0x80, 0x3d, 0x20, 0x0e, 0x40, - 0x03, 0x32, 0x00, 0xfe, 0x80, 0x3f, 0x20, 0x0f, - 0xc8, 0x03, 0xd2, 0x02, 0xc4, 0x80, 0x7b, 0x24, - 0x0f, 0xf9, 0x03, 0x1e, 0x01, 0xc7, 0x90, 0x33, - 0xe0, 0x0f, 0xf8, 0x03, 0xfe, 0x00, 0xef, 0x84, - 0x3f, 0xe0, 0x0f, 0xe8, 0x03, 0xfe, 0x40, 0xcd, - 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0xc0, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, 0x94, - 0x00, 0xb7, 0x00, 0x21, 0x80, 0x08, 0x70, 0x02, - 0xdc, 0x00, 0xb6, 0x00, 0x2d, 0x40, 0x08, 0x72, - 0x12, 0x1c, 0x80, 0x86, 0x00, 0x2d, 0x40, 0x0b, - 0x71, 0x02, 0xdc, 0x00, 0x87, 0x08, 0x21, 0xc4, - 0x0b, 0x71, 0x02, 0x18, 0x28, 0x85, 0x00, 0x29, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0x85, 0x00, - 0x2d, 0x00, 0x0b, 0x60, 0x02, 0xd4, 0x40, 0xa5, - 0x06, 0x2d, 0xc4, 0x0b, 0x70, 0x02, 0xea, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, - 0x00, 0xb6, 0x40, 0x23, 0x80, 0x08, 0x70, 0x02, - 0xdc, 0x00, 0xb6, 0x00, 0x2d, 0x00, 0x0a, 0xc1, - 0x06, 0x12, 0x00, 0xa6, 0x40, 0x2d, 0x00, 0x0b, - 0x40, 0x02, 0xf0, 0x40, 0xa4, 0x00, 0x29, 0xed, - 0x09, 0x00, 0x05, 0x02, 0x21, 0x4b, 0xf0, 0x02, - 0x7c, 0x40, 0xaf, 0x08, 0x21, 0xc0, 0x0b, 0x70, - 0x02, 0xdc, 0x00, 0xa7, 0x48, 0x2d, 0xc0, 0x0b, - 0x40, 0x02, 0xfc, 0x60, 0x85, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x14, 0xc0, 0x00, 0xb2, 0x80, - 0x20, 0x80, 0x08, 0x30, 0x02, 0xcc, 0x00, 0xb2, - 0x00, 0x2c, 0x40, 0x48, 0x30, 0x02, 0x0e, 0x00, - 0x82, 0x05, 0x2c, 0x52, 0x0b, 0x30, 0x06, 0xcd, - 0x00, 0xa3, 0xc8, 0x20, 0xe0, 0x0b, 0x39, 0x02, - 0x4e, 0x10, 0xa3, 0xc0, 0x28, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0x81, 0x00, 0x2c, 0x00, 0x0b, - 0x00, 0x12, 0xc4, 0x04, 0xa1, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x15, 0xa4, 0x00, 0xf2, 0xc0, - 0xb2, 0x46, 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xfa, - 0x00, 0x3e, 0x00, 0x0e, 0x8c, 0x03, 0x20, 0x20, - 0xea, 0x40, 0x3c, 0x30, 0x0f, 0x00, 0x03, 0xe1, - 0x14, 0xe8, 0x40, 0x3a, 0x16, 0x0f, 0xb9, 0x03, - 0x6c, 0x00, 0xeb, 0x80, 0x32, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xeb, 0x40, 0x3e, 0x00, 0x0f, - 0x31, 0x03, 0xcc, 0x02, 0xc9, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0xe1, 0x00, 0xfb, 0x10, - 0x3e, 0x40, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfa, - 0x00, 0x3e, 0x40, 0x0f, 0xb8, 0x03, 0xec, 0x00, - 0xea, 0x00, 0x3e, 0x60, 0x0f, 0xb0, 0x03, 0xec, - 0x21, 0x5b, 0x00, 0x3e, 0xc0, 0x4f, 0xb4, 0x0b, - 0xac, 0x04, 0x1b, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb4, 0x03, 0xe4, 0x00, 0xf9, 0x40, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x06, 0x02, 0x01, - 0x10, 0xf4, 0x00, 0xfe, 0xa0, 0x73, 0x40, 0x0c, - 0xf0, 0x03, 0xfc, 0x00, 0xfe, 0x00, 0x37, 0x00, - 0x0d, 0xc0, 0x83, 0xf0, 0x08, 0xce, 0x00, 0x3f, - 0x00, 0x0c, 0xc0, 0x03, 0xf0, 0x00, 0xdc, 0x02, - 0x33, 0x00, 0x0f, 0xf8, 0x03, 0xf8, 0xa0, 0x4d, - 0x88, 0x33, 0xc0, 0x0f, 0xf0, 0x03, 0xcc, 0x00, - 0xcc, 0x00, 0x3f, 0x04, 0x0c, 0xd0, 0x03, 0x3c, - 0xa8, 0xc5, 0xc0, 0x33, 0xc0, 0x0f, 0xf0, 0x03, - 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, - 0x04, 0x63, 0x28, 0xba, 0x86, 0x20, 0x5c, 0x08, - 0xb0, 0x02, 0xec, 0x00, 0xb2, 0x00, 0x20, 0x41, - 0x08, 0xb0, 0x03, 0x8c, 0x00, 0x8a, 0x00, 0x2e, - 0x40, 0x08, 0xb0, 0x02, 0x0c, 0x00, 0x83, 0x00, - 0xa2, 0xc0, 0x09, 0xb9, 0x02, 0xcd, 0x28, 0x83, - 0x80, 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, - 0xa9, 0x80, 0x2e, 0xc0, 0x88, 0x98, 0x82, 0xa6, - 0x00, 0xa9, 0x48, 0x22, 0xc0, 0x0b, 0xb0, 0x02, - 0xe0, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x05, 0x26, 0x00, 0xbb, 0x00, 0x22, 0xc0, 0x08, - 0xb0, 0x02, 0xec, 0x00, 0xba, 0x00, 0x26, 0x00, - 0x09, 0x80, 0x02, 0xe0, 0x00, 0x8a, 0x00, 0x2e, - 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x98, 0x00, - 0x22, 0x00, 0x1b, 0x84, 0x02, 0xe4, 0x00, 0xaa, - 0x28, 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, - 0x8b, 0x88, 0x2c, 0x10, 0x08, 0x81, 0x02, 0xac, - 0x00, 0x89, 0x00, 0x22, 0xc0, 0x4b, 0xb0, 0x02, - 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x00, 0x00, 0xb3, 0x00, 0xa2, 0xc0, 0x48, - 0x30, 0x02, 0xcc, 0x00, 0xb2, 0x00, 0x20, 0x40, - 0x08, 0x30, 0x02, 0xac, 0x00, 0x82, 0x00, 0x2c, - 0x40, 0x08, 0x30, 0x4a, 0x2c, 0x00, 0x8b, 0x00, - 0x20, 0xc0, 0x09, 0x30, 0x46, 0xed, 0x09, 0x00, - 0x07, 0x02, 0xec, 0x00, 0xa3, 0x00, 0x20, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xa1, 0x00, 0x2c, - 0x00, 0x28, 0x90, 0x02, 0xa4, 0x00, 0xa1, 0x00, - 0x20, 0xc0, 0x03, 0x30, 0x02, 0xc2, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x64, 0x00, - 0xf8, 0x00, 0xa2, 0xc0, 0x2c, 0xb0, 0x03, 0xec, - 0x00, 0xfa, 0x00, 0x36, 0x00, 0x0d, 0x80, 0x03, - 0xe0, 0x00, 0xca, 0x00, 0x3e, 0x00, 0x2c, 0x80, - 0x03, 0x60, 0x00, 0xd8, 0x00, 0x32, 0x00, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xeb, 0x00, 0xb2, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xc9, 0x00, 0x3e, - 0x00, 0x8c, 0xa0, 0x13, 0xa4, 0x02, 0xc9, 0x00, - 0x32, 0xc0, 0x07, 0xb0, 0x03, 0xc0, 0x03, 0x50, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xf0, 0x18, - 0xf6, 0x00, 0x3d, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0xfe, 0x00, 0x3f, 0x40, 0x0f, 0xf0, 0x03, - 0x9c, 0x00, 0xfe, 0x00, 0x3f, 0x40, 0x0f, 0xf0, - 0x03, 0x7c, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0d, - 0x40, 0x03, 0xf0, 0x06, 0xdc, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xfc, 0x02, 0xfd, 0x00, 0x1f, - 0x00, 0x0f, 0xf0, 0x03, 0xdc, 0x14, 0xfd, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xe8, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x11, 0xf0, 0x00, - 0xfc, 0x00, 0x33, 0x01, 0x0f, 0xf0, 0x03, 0x3c, - 0x80, 0xfc, 0x00, 0x3b, 0xc6, 0x0f, 0xc1, 0x13, - 0xf0, 0x48, 0xcf, 0x30, 0x3f, 0x05, 0x0c, 0x60, - 0x0b, 0x30, 0x40, 0xcf, 0x00, 0x33, 0x05, 0x0c, - 0xf2, 0x03, 0x70, 0x40, 0xcf, 0x08, 0x33, 0x40, - 0x0c, 0xf2, 0x43, 0x3c, 0x80, 0xcf, 0x24, 0x33, - 0xc8, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0xe0, 0x00, - 0xed, 0x09, 0x00, 0x08, 0x02, 0xba, 0x00, 0x22, - 0x00, 0x0b, 0x90, 0x02, 0x3c, 0x40, 0xb8, 0x08, - 0x23, 0xd8, 0x0b, 0x80, 0x12, 0xe0, 0x80, 0x8f, - 0x40, 0x2e, 0xc8, 0x08, 0x92, 0x82, 0x2c, 0x80, - 0x8f, 0x48, 0x22, 0xc8, 0x08, 0xf4, 0x00, 0x2c, - 0x10, 0x8f, 0x40, 0x2a, 0xc0, 0x08, 0xf5, 0x02, - 0x1c, 0xe0, 0x8f, 0x10, 0x2b, 0xce, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x88, 0x05, 0xc2, 0x00, 0xb2, 0x00, 0x20, - 0x00, 0x0b, 0x10, 0x02, 0x0c, 0x00, 0xb2, 0x20, - 0x20, 0xc8, 0x0b, 0x22, 0x22, 0xca, 0x00, 0xa3, - 0x10, 0x2e, 0xc8, 0x98, 0x90, 0x02, 0x0c, 0x00, - 0x83, 0x30, 0x20, 0xc0, 0x09, 0x31, 0x02, 0x4c, - 0x00, 0x83, 0x00, 0x24, 0xca, 0x08, 0x30, 0x02, - 0x0c, 0x00, 0x93, 0x00, 0x20, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x15, 0xa4, 0x00, 0xb9, 0x20, 0xa2, - 0xc0, 0x0b, 0xb4, 0x42, 0x2c, 0x00, 0xbb, 0x20, - 0x22, 0xc0, 0x0b, 0xa5, 0x02, 0xcc, 0x00, 0x8b, - 0x01, 0x2e, 0x58, 0x08, 0x80, 0x00, 0x0c, 0x41, - 0x8b, 0x00, 0xa2, 0x20, 0x09, 0xb0, 0x12, 0x0c, - 0x10, 0x8b, 0x00, 0x2c, 0xc0, 0x08, 0xb0, 0x02, - 0x2c, 0x00, 0xbb, 0x01, 0x2a, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x05, 0xee, 0x00, 0xfb, 0x48, 0x32, - 0x12, 0x4f, 0x19, 0x0b, 0x2c, 0x00, 0xf9, 0x80, - 0x32, 0xc0, 0x0f, 0x9c, 0x03, 0xe6, 0x00, 0xeb, - 0x00, 0x3c, 0xf0, 0x0c, 0x9c, 0x03, 0x2e, 0x82, - 0xcb, 0x02, 0x32, 0xd2, 0x0d, 0x30, 0x03, 0x6f, - 0x02, 0xc3, 0x02, 0xed, 0x09, 0x00, 0x09, 0x02, - 0x36, 0xe0, 0x0c, 0xb0, 0x03, 0x2c, 0x00, 0xd3, - 0x00, 0x32, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, - 0xbd, 0x00, 0xfd, 0x00, 0x3f, 0x52, 0x0f, 0xf8, - 0x43, 0xec, 0x00, 0xfd, 0x02, 0xb7, 0xc1, 0x0f, - 0xf8, 0x23, 0xfe, 0x40, 0xfb, 0x00, 0x3f, 0xa0, - 0x0f, 0xf9, 0x03, 0xfa, 0x00, 0xf7, 0x00, 0x3f, - 0xc0, 0x2e, 0xf0, 0x03, 0xfe, 0x50, 0xff, 0x00, - 0x3b, 0xe4, 0xaf, 0xf0, 0x4b, 0xfc, 0x00, 0xcf, - 0x04, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xf8, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0xac, 0x00, 0xe9, 0x00, 0x3e, 0x00, 0x4f, 0xb4, - 0x0b, 0x2c, 0x00, 0xdb, 0x00, 0x32, 0xc0, 0x0c, - 0xb0, 0x0b, 0x2c, 0x00, 0xcb, 0x00, 0x32, 0xd0, - 0x4c, 0x94, 0x03, 0xa4, 0x02, 0xcb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xe5, 0x00, 0xcb, 0x08, - 0x3e, 0x40, 0x0f, 0x30, 0x07, 0xec, 0x00, 0xcb, - 0x00, 0x32, 0xc0, 0x0c, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, - 0x2c, 0x08, 0x82, 0xe4, 0x2e, 0x60, 0x1b, 0x94, - 0x02, 0x3f, 0x10, 0x8b, 0x00, 0x37, 0xc0, 0x08, - 0xb0, 0x02, 0x2c, 0x00, 0xdf, 0x00, 0x22, 0xc0, - 0x08, 0x10, 0x02, 0x2c, 0x00, 0x8f, 0x00, 0x2e, - 0xc0, 0x0b, 0xf7, 0x02, 0xec, 0x00, 0xdf, 0x60, - 0x2e, 0xc0, 0x0b, 0xfa, 0x06, 0xfc, 0x00, 0x8f, - 0x88, 0x23, 0xc0, 0x08, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x3a, 0xc0, 0x0b, 0xb0, 0x02, 0xf2, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, - 0x40, 0x00, 0xa2, 0xc8, 0x2c, 0x34, 0xed, 0x09, - 0x00, 0x0a, 0x02, 0x4b, 0x0e, 0x02, 0x0e, 0x80, - 0x98, 0x00, 0x20, 0xc0, 0x08, 0x00, 0x02, 0x00, - 0x00, 0x83, 0x00, 0x20, 0xc0, 0x09, 0x10, 0x02, - 0x8c, 0x00, 0x93, 0x00, 0x2e, 0xc0, 0x09, 0x30, - 0x02, 0xcc, 0x00, 0x83, 0x40, 0x2c, 0xc0, 0x0b, - 0x34, 0x82, 0xec, 0x00, 0x83, 0x08, 0x20, 0xc0, - 0x08, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xf8, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x01, 0x3a, 0x08, 0x85, - 0x81, 0x2d, 0x60, 0x1b, 0xf8, 0x82, 0x1e, 0x00, - 0x8f, 0x80, 0x24, 0xe4, 0x08, 0x59, 0x06, 0x3a, - 0x40, 0x97, 0x80, 0x23, 0xe0, 0x09, 0xd8, 0x02, - 0x16, 0x00, 0x97, 0x80, 0x2d, 0xe0, 0x0b, 0x78, - 0x02, 0xf6, 0x40, 0x97, 0x80, 0x2d, 0x64, 0x0b, - 0x78, 0x12, 0xde, 0x00, 0x87, 0x90, 0x20, 0xe0, - 0x08, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x29, - 0xe0, 0x0b, 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x08, 0x0c, 0x00, 0xe1, - 0x14, 0x3c, 0x08, 0x8b, 0x30, 0x03, 0x0c, 0x20, - 0xd2, 0x01, 0x30, 0xc4, 0x2c, 0xb0, 0x03, 0x0c, - 0x40, 0xc3, 0x00, 0xb0, 0x84, 0x09, 0x35, 0x03, - 0xa8, 0x80, 0xd3, 0x00, 0x3c, 0xc0, 0x05, 0x30, - 0x13, 0xcd, 0x44, 0xc3, 0x00, 0x3c, 0xc4, 0x0f, - 0x30, 0x22, 0xcc, 0x00, 0xc3, 0x00, 0x30, 0xc0, - 0x0c, 0x30, 0x03, 0xcc, 0x00, 0xf3, 0x00, 0x3c, - 0xc0, 0x0f, 0x30, 0x03, 0xd2, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x0d, 0x9c, 0x04, 0xff, - 0x04, 0x3f, 0xc0, 0x0f, 0x41, 0x23, 0xfd, 0x60, - 0xf6, 0x02, 0x3f, 0xc4, 0x0f, 0xe0, 0x03, 0xd8, - 0x50, 0xff, 0x10, 0x3d, 0xc0, 0x0e, 0xd1, 0x03, - 0x7c, 0x00, 0xef, 0x50, 0x3f, 0xc0, 0x0f, 0xf4, - 0x83, 0xdc, 0x40, 0xff, 0x09, 0x2f, 0xc4, 0x8f, - 0xf4, 0xed, 0x09, 0x00, 0x0b, 0x02, 0x03, 0xfc, - 0x40, 0xf7, 0x44, 0x3f, 0xc0, 0x0f, 0xf1, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3b, 0xc0, 0x0f, 0xf0, - 0x03, 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x05, 0xec, 0x00, 0xfb, 0x01, 0x3e, 0x01, - 0x0f, 0x30, 0x03, 0x2c, 0x00, 0xcb, 0x00, 0x36, - 0xe4, 0x0c, 0x30, 0x03, 0x26, 0x00, 0xcb, 0xb0, - 0x32, 0x40, 0x0e, 0x80, 0x03, 0xec, 0x00, 0xfb, - 0x20, 0x36, 0x00, 0x0f, 0xb0, 0x23, 0xee, 0x00, - 0xcb, 0x68, 0x3e, 0xe0, 0x08, 0xb0, 0x03, 0xef, - 0xc0, 0xcb, 0x10, 0x32, 0xcc, 0x0c, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xea, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x01, 0x9c, 0x00, 0xb4, 0x00, 0x2d, 0x40, - 0x0b, 0x40, 0x02, 0x0c, 0x84, 0x85, 0x00, 0x2f, - 0xcc, 0x08, 0x50, 0x02, 0xb4, 0x00, 0x87, 0x08, - 0x21, 0xc0, 0x0b, 0x50, 0x02, 0xdc, 0x00, 0xb7, - 0x60, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xfc, 0x00, - 0x87, 0x00, 0x2f, 0xc1, 0x08, 0x76, 0x02, 0xdc, - 0x20, 0x87, 0x00, 0x23, 0xc4, 0x28, 0x70, 0x02, - 0x5c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, - 0x02, 0xd2, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x00, 0x9e, 0x20, 0xb4, 0x82, 0x2d, 0x20, - 0x0b, 0xc8, 0x12, 0x1e, 0x08, 0x87, 0x8b, 0x2d, - 0xe0, 0x18, 0xf8, 0x82, 0x1e, 0x00, 0xb7, 0x80, - 0x25, 0xe0, 0x09, 0x58, 0x02, 0xde, 0x00, 0xb7, - 0xa0, 0x2d, 0xe2, 0x0b, 0x7a, 0x02, 0xde, 0x00, - 0x87, 0xa0, 0x2d, 0xe0, 0x1a, 0x78, 0x02, 0xce, - 0x80, 0xb3, 0xa0, 0xa1, 0xe8, 0x0a, 0x78, 0x02, - 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, 0x78, - 0x02, 0xf0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x14, 0xce, 0x04, 0xb2, 0x04, 0x2c, 0xc1, - 0x0b, 0x38, 0x02, 0x0c, 0xed, 0x09, 0x00, 0x0c, - 0x02, 0x02, 0x83, 0x80, 0x2c, 0xc0, 0x08, 0xb0, - 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x24, 0x22, 0x4b, - 0x2f, 0x02, 0xc1, 0x60, 0xbb, 0x00, 0x2c, 0x00, - 0x8b, 0x30, 0x02, 0xc4, 0x40, 0x83, 0x00, 0x2c, - 0x40, 0x12, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x20, 0xc0, 0x0a, 0x30, 0x02, 0x4c, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xd2, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, 0xb9, - 0x00, 0xf6, 0xc8, 0x3f, 0xb2, 0x0f, 0xe4, 0x8b, - 0x28, 0x00, 0xce, 0x40, 0x2e, 0x80, 0x2c, 0xe4, - 0x03, 0x39, 0x22, 0xfa, 0x00, 0x37, 0xb8, 0x0d, - 0xe4, 0x03, 0xfa, 0x00, 0xfa, 0x00, 0x3f, 0x80, - 0x0f, 0xa0, 0x02, 0xfb, 0x02, 0x4a, 0x00, 0x3e, - 0xa2, 0x2e, 0xa0, 0x43, 0xe8, 0x06, 0xfa, 0x01, - 0x32, 0x80, 0x0e, 0xa0, 0x03, 0xe8, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xfa, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xe2, - 0x00, 0xf8, 0x80, 0x3e, 0x20, 0x0f, 0x88, 0x03, - 0xe0, 0x00, 0xf8, 0x80, 0x3e, 0x00, 0x0f, 0x88, - 0x03, 0xe2, 0x00, 0x88, 0x00, 0xba, 0x00, 0x4f, - 0x80, 0x03, 0xe0, 0x01, 0xf8, 0x00, 0x3e, 0x08, - 0x0f, 0x80, 0x03, 0xe2, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0d, 0x80, 0x03, 0xe0, 0x00, 0x40, 0x00, - 0x3e, 0x00, 0x09, 0x80, 0x03, 0x60, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xd2, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0xe4, - 0x00, 0xf9, 0x10, 0x32, 0x40, 0x4c, 0x90, 0x03, - 0x04, 0x08, 0xc9, 0x00, 0x3a, 0x40, 0x0f, 0x90, - 0x0b, 0x24, 0x00, 0xf9, 0x04, 0x3e, 0x40, 0x0f, - 0x90, 0x53, 0x64, 0x02, 0xc9, 0x04, 0x12, 0x40, - 0x0c, 0x94, 0x03, 0xe4, 0x00, 0xb1, 0xc0, 0xf2, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0xed, - 0x09, 0x00, 0x0d, 0x02, 0x00, 0x30, 0x40, 0x0c, - 0x90, 0x43, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x04, 0x66, 0x04, 0xb9, 0xc0, - 0x20, 0x40, 0x08, 0x12, 0x02, 0x27, 0x00, 0x89, - 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0x24, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0x04, - 0x00, 0x89, 0x04, 0x20, 0x40, 0x08, 0x98, 0x02, - 0xe4, 0x00, 0xb9, 0x80, 0x22, 0x40, 0x0b, 0x94, - 0x02, 0xe4, 0x00, 0xb9, 0xc0, 0xa2, 0x41, 0x28, - 0x90, 0x03, 0xa4, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x05, 0x24, 0x40, 0xb9, 0x40, - 0x26, 0x50, 0x48, 0x98, 0x02, 0x24, 0x72, 0x8b, - 0x00, 0x2e, 0x40, 0x0a, 0x90, 0x02, 0x24, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x10, 0x02, 0x24, - 0x00, 0x89, 0x00, 0x2e, 0x40, 0x08, 0x94, 0x12, - 0xe4, 0x00, 0xb9, 0x40, 0x22, 0x40, 0x0b, 0x96, - 0x02, 0xe4, 0x00, 0xb9, 0x10, 0x22, 0x40, 0x08, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x04, 0x00, 0xb9, 0x04, - 0x26, 0x40, 0x08, 0x10, 0x2a, 0x04, 0x00, 0x81, - 0x40, 0x2c, 0x50, 0x0b, 0x14, 0x02, 0x05, 0x00, - 0xb1, 0x40, 0x2c, 0x50, 0x0b, 0x14, 0x00, 0x25, - 0x00, 0x81, 0x40, 0x2e, 0x50, 0x18, 0x10, 0x02, - 0xc5, 0x04, 0xb1, 0x00, 0x20, 0x50, 0x8b, 0x10, - 0x22, 0xc5, 0x00, 0xb3, 0x01, 0x20, 0x50, 0x08, - 0x10, 0x02, 0x84, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb8, 0x04, 0x60, 0x00, 0xf8, 0x00, - 0xb6, 0x00, 0x2c, 0x80, 0x0b, 0x20, 0x10, 0xc8, - 0x00, 0x3a, 0xed, 0x09, 0x00, 0x0e, 0x02, 0x00, - 0x0e, 0x80, 0x03, 0x20, 0x00, 0xf0, 0x00, 0x3e, - 0x00, 0x0f, 0x80, 0x0b, 0x60, 0x00, 0xc8, 0x00, - 0x3e, 0x00, 0x0c, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x22, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x32, 0x00, 0x0c, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, - 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, - 0x1d, 0xb4, 0x00, 0xfd, 0x04, 0x3b, 0x40, 0x0f, - 0xf0, 0x43, 0xe5, 0x00, 0x3f, 0x00, 0x3e, 0x50, - 0x0f, 0xd0, 0x03, 0xf4, 0x00, 0xf9, 0x40, 0x3f, - 0x40, 0x4f, 0xf0, 0x03, 0xf4, 0x00, 0xf9, 0x40, - 0xb3, 0x40, 0x2f, 0x94, 0x03, 0xf4, 0x00, 0xf9, - 0x40, 0x3f, 0x40, 0x0f, 0x94, 0x43, 0xe5, 0x00, - 0x79, 0x40, 0x3e, 0x50, 0x0f, 0x90, 0x03, 0xa4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe6, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x05, 0xf4, 0x00, 0xf5, 0x00, 0x31, 0x40, 0x0f, - 0xd0, 0x03, 0x34, 0x90, 0xc9, 0x00, 0x32, 0x4c, - 0x07, 0x90, 0x03, 0x24, 0x00, 0xf9, 0x11, 0x3e, - 0x40, 0x4f, 0x90, 0x11, 0xe4, 0x40, 0xc9, 0x00, - 0x32, 0x40, 0x0f, 0xd0, 0x03, 0x24, 0x00, 0xfd, - 0x28, 0x3e, 0x44, 0x8f, 0xd0, 0x03, 0x24, 0x00, - 0xfd, 0x00, 0x3e, 0x48, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xc6, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, - 0x10, 0xe0, 0x00, 0xb8, 0x02, 0x22, 0x00, 0x0b, - 0x80, 0x02, 0x20, 0x00, 0x88, 0x20, 0x30, 0x0c, - 0x0b, 0xa0, 0x82, 0xa8, 0x28, 0xb8, 0x10, 0x2e, - 0x0b, 0x0b, 0x82, 0x02, 0xe0, 0x80, 0x88, 0x48, - 0x2a, 0x02, 0x0b, 0x81, 0x02, 0x20, 0xb1, 0x98, - 0x00, 0x2e, 0x08, 0x0b, 0x84, 0x0a, 0x20, 0x20, - 0xb8, 0x10, 0x2c, 0x0a, 0x0b, 0xed, 0x09, 0x00, - 0x0f, 0x02, 0x80, 0x02, 0x60, 0x00, 0xb8, 0x00, - 0x2e, 0x00, 0x0b, 0x80, 0x02, 0xce, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xcc, 0x00, - 0xb1, 0x00, 0x20, 0x40, 0x0b, 0x30, 0x02, 0x04, - 0x40, 0x81, 0x28, 0xa4, 0x48, 0x0b, 0x92, 0x02, - 0x84, 0x00, 0xb1, 0x00, 0x2c, 0x48, 0x03, 0x12, - 0x82, 0xe6, 0x80, 0x81, 0x30, 0x20, 0x41, 0x0b, - 0x10, 0x02, 0x04, 0x90, 0xb1, 0x00, 0x2c, 0x48, - 0x0b, 0x11, 0x02, 0x04, 0x40, 0xb1, 0x02, 0x2c, - 0x4c, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, - 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc2, 0x01, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa6, 0x20, - 0xbb, 0x82, 0xa2, 0x40, 0x4b, 0x90, 0x02, 0x24, - 0x00, 0x89, 0x00, 0x22, 0x40, 0x0b, 0x91, 0x42, - 0xa4, 0x80, 0xb9, 0x00, 0x2e, 0x51, 0x0b, 0x98, - 0x22, 0xe4, 0x05, 0x89, 0x00, 0x2a, 0x50, 0x0b, - 0x90, 0x22, 0x25, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0x24, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0x64, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xc6, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0xa0, 0x15, 0xe6, 0x00, - 0xf1, 0xe0, 0x32, 0x68, 0x4f, 0x9c, 0x0b, 0x24, - 0x02, 0xc9, 0x40, 0x32, 0x40, 0x0f, 0x98, 0x03, - 0xa5, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x94, - 0x13, 0xe4, 0x00, 0xc9, 0x03, 0x32, 0x60, 0x0f, - 0x90, 0x0b, 0x26, 0x00, 0xb9, 0x00, 0x3e, 0x60, - 0x0f, 0x90, 0x03, 0x24, 0x00, 0xf9, 0x00, 0x3e, - 0x40, 0x1f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe8, 0x04, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x01, 0xa4, 0x00, - 0xf9, 0x02, 0x3e, 0x68, 0x0f, 0x92, 0x03, 0xe4, - 0x00, 0xf9, 0xa0, 0x3e, 0x40, 0x0f, 0x98, 0x03, - 0xed, 0x09, 0x00, 0x10, 0x02, 0xe6, 0x00, 0xf9, - 0x00, 0x3e, 0x70, 0x0f, 0x90, 0x03, 0xe6, 0x82, - 0xf9, 0x02, 0x3e, 0x48, 0x0f, 0x10, 0x03, 0xe4, - 0x40, 0xd9, 0x04, 0x3e, 0x48, 0x0f, 0x10, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0x64, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xca, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x10, 0xa1, 0x00, 0xf8, 0x00, 0x32, - 0x20, 0x3c, 0x88, 0x23, 0xc2, 0x08, 0xf8, 0x01, - 0x3e, 0x00, 0x2c, 0x80, 0x03, 0xe0, 0x00, 0xc8, - 0x00, 0x32, 0x10, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xe0, 0x02, 0x3e, 0x00, 0x0f, 0x88, 0x03, 0xe0, - 0x08, 0xe8, 0x80, 0x3e, 0x00, 0x0f, 0x82, 0x03, - 0x60, 0x00, 0xf8, 0x90, 0x3e, 0x00, 0x0c, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x05, 0x28, 0x00, 0xbe, 0x30, 0x23, - 0x90, 0x28, 0x60, 0x42, 0xfb, 0x10, 0xba, 0x00, - 0x2e, 0x80, 0x08, 0x20, 0x03, 0xa8, 0x00, 0xda, - 0x02, 0x22, 0x80, 0x03, 0xa0, 0x02, 0xc8, 0x00, - 0xba, 0x02, 0x2e, 0x80, 0x0b, 0xec, 0x82, 0xe8, - 0x00, 0xbe, 0x4c, 0x2e, 0x80, 0x0b, 0xe2, 0x43, - 0xa8, 0x00, 0xbe, 0x01, 0x2e, 0x80, 0x08, 0xa0, - 0x42, 0xe8, 0x00, 0xba, 0x00, 0x2e, 0x80, 0x0b, - 0xa0, 0x02, 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x05, 0x44, 0x00, 0xb3, 0x80, 0x20, - 0x84, 0x08, 0x20, 0x02, 0xce, 0x48, 0xbb, 0x00, - 0x2c, 0xc0, 0x08, 0x30, 0x02, 0x8c, 0x00, 0x83, - 0x00, 0x20, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xa3, 0x00, 0x2c, 0xc0, 0x0b, 0x10, 0x12, 0xcc, - 0x00, 0xb1, 0x80, 0x2c, 0xc0, 0x0b, 0x08, 0x02, - 0x8c, 0x00, 0xb0, 0x80, 0x2c, 0xc0, 0x28, 0x30, - 0x02, 0xcc, 0x00, 0xed, 0x09, 0x00, 0x11, 0x02, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xca, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, - 0x14, 0x00, 0xbc, 0x00, 0x21, 0x60, 0x08, 0x70, - 0x22, 0xdc, 0x00, 0xb7, 0x22, 0x2d, 0xe0, 0x08, - 0x72, 0x02, 0xbe, 0x04, 0x97, 0x80, 0x21, 0xc0, - 0x0b, 0x70, 0x02, 0xdc, 0x80, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x06, 0xdc, 0x41, 0xb7, 0x00, - 0x2d, 0xc4, 0x0b, 0x70, 0x02, 0x9c, 0x00, 0xb7, - 0x00, 0x2d, 0xe0, 0x18, 0x70, 0x02, 0xdc, 0x00, - 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xe8, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x08, - 0x16, 0x00, 0xf4, 0x80, 0xa1, 0xe0, 0x08, 0x58, - 0x03, 0xd6, 0x08, 0xf7, 0xc0, 0x3d, 0xec, 0x0c, - 0x7c, 0x83, 0x9f, 0x80, 0xc3, 0xa8, 0xb1, 0xea, - 0x0f, 0x7a, 0x03, 0xdf, 0x20, 0xe7, 0xa0, 0x2d, - 0xea, 0x0f, 0x78, 0x03, 0xde, 0x00, 0xf7, 0x80, - 0x3d, 0xe4, 0x0f, 0x78, 0x23, 0x1e, 0xc0, 0xf7, - 0x80, 0x3d, 0xec, 0x0c, 0x78, 0x03, 0xde, 0x00, - 0xf7, 0x80, 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0xea, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, - 0xa4, 0x00, 0xfb, 0x00, 0x3e, 0x00, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xbb, 0x4a, 0x3e, 0xd0, 0x0f, - 0xb6, 0x03, 0x8c, 0x00, 0xfb, 0x10, 0x3e, 0xc4, - 0x07, 0xb6, 0x03, 0xec, 0x04, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0x90, 0x03, 0xec, 0xb0, 0xf9, 0x00, - 0x3e, 0xd0, 0x8f, 0xb0, 0x03, 0xad, 0x00, 0xbb, - 0x02, 0x3e, 0xc8, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xc2, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, - 0xfe, 0x00, 0xfd, 0x80, 0x3d, 0x60, 0x0c, 0xf8, - 0x03, 0xfa, 0x10, 0xcf, 0x80, 0x37, 0xe2, 0x03, - 0xf3, 0x43, 0x3f, 0x00, 0xef, 0x80, 0xed, 0x09, - 0x00, 0x12, 0x02, 0x3f, 0xe0, 0x0c, 0xfc, 0xc5, - 0xfe, 0x40, 0xff, 0xd8, 0x3d, 0xe2, 0x0c, 0xf9, - 0x03, 0xfe, 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x4f, - 0xf9, 0x43, 0x3e, 0x20, 0xff, 0x80, 0x2f, 0xe6, - 0x0f, 0xf8, 0x21, 0xfe, 0x00, 0xff, 0x80, 0x3f, - 0xe0, 0x0f, 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x11, 0x9c, 0x00, 0xb6, - 0x00, 0x2d, 0x08, 0x08, 0x40, 0x42, 0xd8, 0x00, - 0x87, 0x00, 0x21, 0xc8, 0x0b, 0x70, 0x02, 0x1c, - 0xa0, 0x97, 0x00, 0x2d, 0xc2, 0x08, 0x70, 0x07, - 0x5c, 0x40, 0xb7, 0x00, 0x2d, 0xc0, 0x08, 0x70, - 0x40, 0xdc, 0x00, 0xb7, 0x40, 0x2d, 0xc1, 0x0b, - 0x40, 0x02, 0x1c, 0x40, 0xb7, 0x10, 0x25, 0xcc, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xea, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0xb7, - 0x00, 0x2d, 0x01, 0x08, 0x50, 0x02, 0xdc, 0x00, - 0x87, 0x00, 0x29, 0xc0, 0x49, 0x71, 0x02, 0x1c, - 0x10, 0xa7, 0x00, 0x2d, 0xc0, 0x09, 0x70, 0x02, - 0xdd, 0x0c, 0xb7, 0x00, 0x27, 0xc0, 0x08, 0x70, - 0x42, 0xdd, 0x20, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x42, 0x9c, 0x00, 0xb4, 0x00, 0x25, 0xc0, - 0x8b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x14, 0xc5, 0x20, 0xb1, - 0x48, 0x2c, 0x50, 0x00, 0x18, 0x02, 0xc0, 0x01, - 0x83, 0x58, 0x2c, 0xc0, 0x0b, 0x30, 0x82, 0x0e, - 0x04, 0xbb, 0x05, 0x0e, 0xf0, 0x09, 0xb4, 0x12, - 0x4e, 0x00, 0xb3, 0x04, 0x2c, 0xf0, 0x08, 0x30, - 0x02, 0x4e, 0x00, 0xb3, 0x00, 0x0c, 0xe0, 0x43, - 0x30, 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x24, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0xed, 0x09, 0x00, 0x13, 0x02, 0x0b, 0x30, - 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xac, 0x05, 0xad, 0x00, 0xf1, 0x80, 0x3c, 0x70, - 0x2c, 0x39, 0x01, 0xec, 0x02, 0xcf, 0x00, 0xbb, - 0xc0, 0x0d, 0xf4, 0x0b, 0x1e, 0x00, 0xef, 0x00, - 0x3f, 0xc0, 0x2d, 0xf0, 0x03, 0xfc, 0x20, 0xff, - 0x00, 0x27, 0xc6, 0x0c, 0xb0, 0x03, 0xfe, 0x00, - 0x3b, 0x00, 0x3f, 0xc0, 0x0b, 0x30, 0x4b, 0xbc, - 0x00, 0xfb, 0x02, 0x37, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0xee, 0x00, 0xf9, 0xc0, 0x3e, 0x20, - 0x0f, 0x81, 0x13, 0xed, 0x00, 0xfb, 0x00, 0x22, - 0xc0, 0x0f, 0xb8, 0x43, 0xec, 0x00, 0xdb, 0x00, - 0x3e, 0xc2, 0x0e, 0xb8, 0x87, 0x2c, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x2f, 0x30, 0x03, 0xec, 0x00, - 0xf3, 0x40, 0x3e, 0xc4, 0x0f, 0xb0, 0x13, 0x4c, - 0x10, 0xf8, 0x00, 0x36, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0xf6, 0x40, 0xfc, 0x80, 0x33, 0x22, - 0x1c, 0xda, 0x03, 0x3f, 0x00, 0xcf, 0x00, 0x31, - 0xc0, 0x8c, 0xf0, 0x03, 0xfc, 0x20, 0xef, 0x04, - 0x3b, 0xc0, 0x0c, 0xf0, 0x03, 0x3c, 0x00, 0xff, - 0x00, 0x33, 0xc0, 0x0c, 0xf1, 0x03, 0x3c, 0x00, - 0xbf, 0x12, 0x33, 0xc0, 0x4c, 0xc4, 0x03, 0x3c, - 0x00, 0xcf, 0x80, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xc0, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x81, 0x04, 0x64, 0x00, 0xb8, 0x80, 0x22, 0x50, - 0x08, 0x9a, 0x12, 0x05, 0x80, 0x8b, 0x00, 0x22, - 0xc0, 0x08, 0xb0, 0x02, 0xec, 0x00, 0xdb, 0x00, - 0x22, 0xc0, 0x08, 0xb0, 0xed, 0x09, 0x00, 0x14, - 0x02, 0x02, 0x2c, 0x04, 0xbb, 0x00, 0x36, 0xc0, - 0x0d, 0xb4, 0x92, 0x2c, 0x00, 0xbb, 0x40, 0x20, - 0xc0, 0x08, 0xb0, 0x03, 0x6c, 0x00, 0x8b, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0x24, - 0x00, 0xb9, 0x11, 0x22, 0x86, 0x08, 0x80, 0x02, - 0x2c, 0x00, 0x83, 0x00, 0x26, 0xc0, 0x08, 0xb0, - 0x02, 0xec, 0x08, 0x8b, 0x00, 0xa2, 0xc0, 0x18, - 0xb0, 0x06, 0x2c, 0x00, 0xb3, 0x03, 0x20, 0xc0, - 0x88, 0x90, 0x02, 0x2c, 0x08, 0xb9, 0x00, 0x22, - 0xc0, 0x08, 0xb4, 0x02, 0x6c, 0x00, 0x8b, 0x22, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x00, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x04, - 0x00, 0xb9, 0x00, 0x22, 0x40, 0x28, 0x90, 0x0a, - 0x08, 0x00, 0x83, 0x00, 0x20, 0xc0, 0x28, 0x30, - 0x02, 0xec, 0x04, 0x93, 0x00, 0x20, 0xc0, 0x28, - 0x30, 0x1a, 0x0c, 0x00, 0xb3, 0x01, 0x24, 0xc0, - 0x09, 0x30, 0x0a, 0x0c, 0x01, 0xb3, 0x00, 0xa2, - 0xc0, 0xa8, 0x30, 0x02, 0x4c, 0x12, 0x83, 0x80, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x10, 0xc2, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x64, - 0x00, 0xf8, 0x00, 0xb2, 0xc0, 0x08, 0x90, 0x03, - 0x20, 0x02, 0xc7, 0x00, 0xb3, 0xc0, 0x0c, 0x70, - 0x02, 0xfc, 0x00, 0x8f, 0x00, 0x31, 0xc0, 0x4c, - 0xf0, 0x43, 0x3c, 0x00, 0x7f, 0x00, 0x63, 0xc0, - 0x0c, 0xb0, 0x03, 0x3c, 0x01, 0xfb, 0x02, 0x33, - 0xc0, 0x0c, 0xb0, 0x03, 0x7c, 0x00, 0xcb, 0x00, - 0x3f, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xc0, 0xed, - 0x09, 0x00, 0x15, 0x02, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x1d, 0xf4, 0x00, 0xfc, 0x04, - 0x3f, 0x00, 0xcf, 0xd0, 0x13, 0xd0, 0x00, 0xff, - 0x04, 0x17, 0xc0, 0x0f, 0xf0, 0x23, 0xfc, 0x08, - 0xff, 0x00, 0x37, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x00, 0x7f, 0x00, 0x3f, 0xc0, 0x0f, 0xc0, 0x03, - 0xfc, 0x04, 0xfc, 0x00, 0x3f, 0xc0, 0x1f, 0x40, - 0x03, 0xfc, 0x00, 0xfc, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xc0, 0x05, 0xdc, 0x00, 0xfd, 0x00, - 0x3d, 0x40, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0x00, 0x0f, 0xe0, 0x03, 0xd4, 0x00, - 0xcf, 0x01, 0x3f, 0xc0, 0x0f, 0xe0, 0x43, 0xf4, - 0x00, 0xc7, 0x00, 0x31, 0xc0, 0x0f, 0x70, 0x03, - 0xfc, 0x00, 0xfc, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xfc, 0x00, 0xfe, 0x01, 0x33, 0x00, 0x0e, - 0xe0, 0x03, 0x3c, 0xc8, 0xcf, 0x00, 0x33, 0x00, - 0x0c, 0xf0, 0x03, 0xf0, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x10, 0xec, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xa0, 0x02, 0xe0, 0x10, - 0xd8, 0x00, 0x2e, 0x00, 0x0b, 0xa0, 0x02, 0xe0, - 0x00, 0xd8, 0x00, 0x36, 0x00, 0x0b, 0x80, 0x02, - 0xe0, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x08, 0xba, 0x00, 0x22, 0x80, 0x08, - 0xb0, 0x02, 0x2d, 0x00, 0x8b, 0x02, 0x22, 0x00, - 0x08, 0xb0, 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x88, 0x05, 0xcc, 0x00, 0xb1, 0x01, - 0x2c, 0x40, 0x1b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x20, 0x02, 0xe4, 0x00, - 0xb3, 0x00, 0x2c, 0xc1, 0x8b, 0x20, 0x02, 0xc4, - 0x00, 0x83, 0xed, 0x09, 0x00, 0x16, 0x02, 0x00, - 0x20, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x08, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb0, 0x00, 0x22, 0x01, 0x8b, 0xb0, 0x02, 0x4d, - 0x00, 0x8a, 0x00, 0x20, 0xa0, 0x28, 0x30, 0x02, - 0xe2, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, - 0x15, 0xa4, 0x90, 0xb9, 0x02, 0x2e, 0x42, 0x0b, - 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc8, - 0x0b, 0xa0, 0x02, 0xe0, 0x01, 0xb8, 0x00, 0x2e, - 0x00, 0x0b, 0xa0, 0x02, 0xe0, 0x10, 0x98, 0x04, - 0x26, 0x00, 0x0b, 0x80, 0x42, 0xe0, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x08, - 0xbb, 0x00, 0x22, 0x80, 0x09, 0xb8, 0xa2, 0x6c, - 0x40, 0x8b, 0x40, 0x22, 0xe0, 0x08, 0xb0, 0x02, - 0xf0, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x15, 0xef, 0x00, 0xf9, 0x00, 0x3e, 0xa0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xe0, - 0x4f, 0xa0, 0x13, 0xe4, 0x08, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xa0, 0x03, 0xe4, 0x00, 0xc3, 0x00, - 0x32, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfa, 0x00, 0xb0, 0x00, 0x0f, 0xb0, 0x0b, 0x6e, - 0x02, 0xca, 0x00, 0x90, 0x01, 0x0c, 0xb0, 0x03, - 0xd0, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x01, 0xb8, 0x00, 0xfd, 0x90, 0x3f, 0xd0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xe0, - 0x0f, 0xe0, 0x83, 0xf0, 0x10, 0x9c, 0x00, 0x3f, - 0x00, 0x0f, 0xe0, 0x03, 0xf0, 0x00, 0xfc, 0x00, - 0x3f, 0x00, 0x07, 0xc0, 0x03, 0xf0, 0x00, 0x7f, - 0x20, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x08, - 0xf2, 0x40, 0x3f, 0xa4, 0x2e, 0xf0, 0x03, 0xbc, - 0x04, 0xfe, 0x01, 0x3f, 0x40, 0x0f, 0xf0, 0x03, - 0xf8, 0x00, 0x60, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x17, 0x02, 0x00, 0x00, 0x40, 0x10, 0xaf, 0x20, - 0xc9, 0x00, 0x3e, 0xe0, 0x2c, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0x08, 0x0f, 0xa0, 0x03, - 0xe4, 0x80, 0xcb, 0x00, 0x3e, 0xc2, 0x0f, 0xa2, - 0x03, 0xe4, 0x00, 0xfb, 0x00, 0x32, 0xc8, 0x0c, - 0xb0, 0x03, 0x2e, 0x00, 0xc8, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xf8, 0x00, 0xb2, - 0x04, 0x4c, 0xb0, 0x8b, 0x28, 0x02, 0xc8, 0x30, - 0x3e, 0xa0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2e, 0x00, - 0x29, 0x00, 0x2e, 0xa0, 0x08, 0xb0, 0x02, 0xec, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xa4, 0x02, - 0xc1, 0x00, 0xa8, 0x00, 0x2e, 0x10, 0x03, 0xa4, - 0x02, 0xc2, 0x00, 0xb8, 0x80, 0x36, 0x00, 0x08, - 0x8a, 0x22, 0xa0, 0x00, 0x8b, 0xe4, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x22, - 0xb4, 0x0a, 0x32, 0x22, 0x2f, 0x60, 0x80, 0x40, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xf2, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4d, 0x00, - 0x81, 0x00, 0x2c, 0xc0, 0x09, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xd0, 0x0b, 0x25, 0x22, - 0xc6, 0x00, 0x13, 0x00, 0x2c, 0xd0, 0x13, 0x21, - 0x02, 0xc7, 0x80, 0xb3, 0x20, 0x20, 0xd0, 0x08, - 0x32, 0x02, 0x0c, 0x00, 0x83, 0x80, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb2, 0x00, 0x20, - 0x30, 0x08, 0x18, 0x02, 0x2e, 0x00, 0x83, 0x40, - 0x2c, 0x00, 0x0b, 0x30, 0x02, 0xf8, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x1e, 0x00, - 0xa5, 0x90, 0x2d, 0xe0, 0x09, 0x78, 0x02, 0xde, - 0x00, 0xb7, 0x80, 0x2d, 0x20, 0x0b, 0x68, 0x02, - 0xf2, 0x00, 0xb4, 0x80, 0x2d, 0x28, 0x0b, 0x68, - 0x02, 0xd2, 0x20, 0xbc, 0x80, 0x27, 0x22, 0x08, - 0xed, 0x09, 0x00, 0x18, 0x02, 0x49, 0x42, 0x92, - 0x40, 0x84, 0xc0, 0x2d, 0xe0, 0x0b, 0x78, 0x02, - 0xde, 0x00, 0xb7, 0x80, 0x23, 0x24, 0x0a, 0xfa, - 0x02, 0x16, 0x00, 0x87, 0x80, 0x2d, 0x70, 0x0b, - 0x78, 0x02, 0xc8, 0x10, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x08, 0x0c, 0x00, 0xc1, 0x10, 0x3c, - 0xc8, 0x0d, 0x30, 0x03, 0xcc, 0x00, 0xf3, 0x00, - 0x3c, 0xd0, 0x0f, 0x20, 0x02, 0xc4, 0x20, 0xd3, - 0x00, 0x3c, 0xc0, 0x0f, 0x20, 0x03, 0xc4, 0x00, - 0xf3, 0x08, 0x30, 0xc0, 0x0c, 0x30, 0x03, 0x0c, - 0x00, 0xc3, 0x00, 0x3c, 0xc0, 0x0f, 0x30, 0x03, - 0xcc, 0x40, 0xf2, 0x00, 0x30, 0x00, 0x1c, 0x30, - 0x03, 0x2c, 0x04, 0xc2, 0x23, 0x7c, 0x81, 0x4f, - 0x30, 0x03, 0xd2, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x1d, 0xbc, 0x00, 0xfd, 0x10, 0x3f, - 0xc0, 0x0e, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xe1, 0x03, 0xf0, 0x00, 0xec, - 0x00, 0x3f, 0x28, 0x0f, 0xe1, 0x03, 0xf0, 0x00, - 0xfc, 0x00, 0x3f, 0x00, 0x2f, 0xc0, 0x43, 0xd2, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3d, 0x00, 0x0f, 0x72, - 0x03, 0xf4, 0x40, 0xfe, 0x00, 0x3f, 0x40, 0x0f, - 0xf0, 0x03, 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x05, 0xcc, 0x02, 0xc9, 0x80, 0xb2, - 0xc0, 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x80, - 0x3a, 0xc0, 0x0f, 0xa0, 0x03, 0xe4, 0x00, 0xfb, - 0x00, 0x3e, 0xe0, 0x0c, 0xa0, 0x03, 0xe6, 0x00, - 0xe3, 0x80, 0x32, 0xc0, 0x1d, 0xb8, 0x03, 0x2c, - 0x04, 0xcb, 0x80, 0x32, 0xc0, 0x0f, 0xb0, 0x07, - 0xec, 0x00, 0xfa, 0x00, 0x3a, 0x00, 0x0c, 0x38, - 0x03, 0x2c, 0x06, 0xca, 0x00, 0x10, 0x20, 0x0c, - 0xb0, 0x03, 0xea, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x11, 0xed, 0x09, 0x00, 0x19, 0x02, - 0x9c, 0x00, 0x85, 0x00, 0x21, 0x80, 0x08, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x21, 0xc0, 0x0b, - 0x60, 0x22, 0xd0, 0x00, 0xb4, 0x02, 0x2d, 0x00, - 0x0d, 0x60, 0x22, 0xd0, 0x00, 0x84, 0x00, 0x35, - 0x00, 0x0b, 0x40, 0x02, 0x10, 0x00, 0x87, 0x00, - 0x35, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, - 0x00, 0x21, 0x40, 0x28, 0x70, 0x02, 0x1c, 0x00, - 0x86, 0x00, 0x21, 0x40, 0x08, 0x70, 0x42, 0xd2, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, - 0xbe, 0x00, 0x8d, 0x80, 0x23, 0xa0, 0x08, 0x78, - 0x02, 0xde, 0x00, 0xb7, 0x80, 0x29, 0xe0, 0x0b, - 0x68, 0x02, 0xd6, 0x00, 0xb7, 0x80, 0x2f, 0xe0, - 0x08, 0x68, 0x02, 0xf6, 0x00, 0xa7, 0x80, 0x21, - 0xe0, 0x0b, 0xf8, 0x7a, 0x3e, 0x08, 0x87, 0x80, - 0x21, 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x08, 0xb2, - 0x80, 0x2b, 0x20, 0x2a, 0x78, 0x02, 0x0a, 0x00, - 0x8c, 0x80, 0x27, 0xa0, 0x28, 0x78, 0x02, 0xf0, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, - 0xcf, 0x00, 0x83, 0x81, 0x20, 0xa4, 0x08, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x20, 0x1c, 0x0b, - 0x20, 0x02, 0xc0, 0x00, 0xb0, 0x00, 0x2c, 0x00, - 0x09, 0x20, 0x02, 0xc0, 0x00, 0x80, 0x00, 0x24, - 0x00, 0x0b, 0x00, 0x02, 0x00, 0x10, 0x80, 0x64, - 0x24, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x02, 0x22, 0x10, 0x0a, 0x30, 0x12, 0x0d, 0x44, - 0x80, 0x90, 0x24, 0xc0, 0x08, 0x30, 0x02, 0xd2, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, - 0x98, 0x00, 0xca, 0x20, 0x33, 0x90, 0x2c, 0xa0, - 0x03, 0xe8, 0x00, 0xfa, 0x00, 0x3b, 0xa0, 0x0f, - 0x20, 0x03, 0xe8, 0x00, 0xf2, 0x00, 0x3e, 0x80, - 0x0c, 0xa0, 0x03, 0xe8, 0x00, 0xea, 0x00, 0x32, - 0x80, 0x0d, 0xa0, 0x03, 0x28, 0x0c, 0xed, 0x09, - 0x00, 0x1a, 0x02, 0xce, 0x44, 0x32, 0x80, 0x0f, - 0xa0, 0x03, 0xe8, 0x00, 0xfe, 0x00, 0x3b, 0x90, - 0x0e, 0xe4, 0x03, 0x3a, 0x00, 0xce, 0x40, 0xb7, - 0x80, 0x0c, 0xa0, 0x03, 0xfa, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x48, 0x00, 0xe0, 0x40, 0xf8, - 0x00, 0x3e, 0x20, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xf0, - 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0x80, 0x03, - 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0xc0, - 0x03, 0xf0, 0x12, 0xf8, 0x10, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x08, - 0x49, 0x88, 0x0b, 0xc0, 0x20, 0xf8, 0x80, 0x3a, - 0x20, 0x0f, 0x80, 0x03, 0xd2, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x10, 0xe6, 0x20, 0xc9, - 0x01, 0x3e, 0x44, 0x0c, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x23, 0x24, - 0x00, 0xf9, 0x00, 0x32, 0x40, 0x4f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xc9, 0x00, 0x2e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xf1, 0x00, 0x32, 0x40, - 0x0d, 0x98, 0x13, 0xe6, 0x80, 0x89, 0x90, 0x32, - 0x44, 0x0f, 0x90, 0x03, 0xc2, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x04, 0x65, 0x02, 0x89, - 0x00, 0x2c, 0x52, 0x28, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x2c, 0x40, 0x08, 0x90, 0x02, 0xa4, - 0x10, 0x99, 0x04, 0x2a, 0x40, 0x0b, 0x90, 0x02, - 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x41, 0x03, 0x98, - 0x00, 0xc4, 0x62, 0x89, 0x10, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x22, 0x40, - 0x08, 0x90, 0x02, 0xe7, 0x02, 0x81, 0x00, 0x22, - 0x40, 0x0b, 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x05, 0x2c, 0x80, 0x09, - 0x00, 0xed, 0x09, 0x00, 0x1b, 0x02, 0x2e, 0x40, - 0x08, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x08, 0x90, 0x22, 0x24, 0x00, 0xbd, 0x00, - 0x23, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xbd, - 0x00, 0x2f, 0x40, 0x0b, 0xd2, 0x00, 0xf4, 0x00, - 0x8b, 0x00, 0x2e, 0x40, 0x4b, 0x90, 0x02, 0xe4, - 0x00, 0xbb, 0x00, 0xa2, 0xc0, 0x09, 0x92, 0x02, - 0xe5, 0x00, 0xa9, 0x00, 0x62, 0x42, 0x0b, 0x90, - 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x2c, 0x08, 0x81, 0x00, 0x2c, 0x40, - 0x08, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x2e, - 0x40, 0x08, 0x90, 0x02, 0x94, 0x00, 0x9d, 0x00, - 0x29, 0x40, 0x0b, 0x10, 0x02, 0xd4, 0x00, 0xb5, - 0x00, 0x2d, 0x40, 0x0b, 0x50, 0x42, 0xd4, 0x00, - 0x81, 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, - 0x10, 0xb1, 0x00, 0x20, 0x50, 0x08, 0x10, 0x02, - 0xc5, 0x10, 0xa1, 0x00, 0x20, 0x40, 0x0b, 0x10, - 0x02, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb8, 0x0d, 0x60, 0x00, 0xc8, 0x00, 0x3e, 0x00, - 0x0c, 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, - 0x00, 0x0c, 0x80, 0x03, 0x20, 0x00, 0xf8, 0x00, - 0x33, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0xa0, 0x03, 0xf0, 0x00, - 0xca, 0x00, 0x3e, 0x00, 0x07, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x00, 0x32, 0x00, 0x0d, 0x80, 0x03, - 0xe0, 0x00, 0xe8, 0x00, 0x32, 0x00, 0x8f, 0x80, - 0x03, 0xee, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x98, 0x1d, 0xfc, 0x06, 0xf5, 0x00, 0x3d, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf1, 0x00, 0x3f, - 0x41, 0x2f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x02, - 0x3c, 0x40, 0x0f, 0x90, 0x03, 0xc4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x10, 0x03, 0xc4, 0x00, - 0xf5, 0x00, 0x3e, 0x40, 0xed, 0x09, 0x00, 0x1c, - 0x02, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xfd, 0x40, - 0x3d, 0x40, 0x0f, 0xd0, 0x23, 0xf5, 0x00, 0xd7, - 0x00, 0xbf, 0x40, 0x0f, 0x90, 0x03, 0xe6, 0x06, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xd4, - 0x00, 0xf9, 0x00, 0x3f, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xc4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0x04, 0x00, 0xf9, 0x00, 0x3e, 0x40, - 0x0c, 0xd0, 0x23, 0xf4, 0x00, 0xfd, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, 0x09, - 0x33, 0x44, 0x0e, 0x70, 0x03, 0xf5, 0x80, 0xcd, - 0x00, 0x3f, 0xc0, 0x0c, 0x90, 0x03, 0xc6, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, - 0x00, 0xb8, 0x00, 0x2e, 0x80, 0x0b, 0x80, 0x02, - 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, 0x80, - 0x02, 0xf0, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, - 0x80, 0x23, 0x60, 0x08, 0xb8, 0x00, 0x2f, 0x00, - 0x88, 0x80, 0x02, 0xe0, 0x0c, 0x9a, 0x00, 0x2e, - 0x00, 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x40, - 0x22, 0x00, 0x08, 0xa0, 0x02, 0xe0, 0x02, 0x88, - 0x00, 0x2e, 0x00, 0x28, 0x80, 0x02, 0xce, 0x04, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, - 0x00, 0xb1, 0x01, 0x2c, 0xc0, 0x1b, 0x10, 0x02, - 0xc4, 0x00, 0xb1, 0x00, 0x2d, 0x60, 0x0b, 0x50, - 0x22, 0xd4, 0x00, 0xb1, 0x00, 0x2d, 0x40, 0x0b, - 0x50, 0x02, 0x14, 0x00, 0xb5, 0x00, 0x2f, 0x40, - 0x48, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, - 0x20, 0x48, 0x0a, 0x10, 0x02, 0xc5, 0x80, 0x81, - 0x00, 0x2e, 0x40, 0x08, 0x10, 0x02, 0xc2, 0x01, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, - 0x40, 0xb9, 0x20, 0x2e, 0xc0, 0x0b, 0x90, 0xed, - 0x09, 0x00, 0x1d, 0x02, 0x02, 0xe4, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0xd0, 0x02, 0xf4, 0x00, - 0xb9, 0x00, 0x2e, 0x41, 0x0b, 0xd0, 0x02, 0x74, - 0x00, 0xbd, 0x02, 0x2f, 0x40, 0x08, 0x90, 0x02, - 0xe4, 0x08, 0x99, 0x20, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xe4, 0x04, 0xb9, 0x00, 0xa2, 0x40, 0x18, - 0x90, 0x02, 0xe4, 0x20, 0x89, 0x00, 0x4e, 0x40, - 0x08, 0x90, 0x02, 0xc6, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x15, 0xe5, 0x00, 0xf9, 0x01, - 0x3e, 0x50, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x74, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x10, 0x03, 0x24, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0c, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x40, 0x7e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x98, 0x30, 0x48, 0x0e, - 0x90, 0x43, 0xe5, 0x00, 0xc9, 0x00, 0x3e, 0x63, - 0x0c, 0x90, 0x03, 0xe8, 0x04, 0x70, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0b, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x60, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0x99, 0x00, 0x3e, 0x40, 0xaf, 0x90, 0x03, - 0xe4, 0x10, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x08, 0xf1, 0x00, 0x3e, 0x40, 0x0f, - 0x9c, 0x03, 0xe4, 0x10, 0xf9, 0x20, 0x3e, 0x48, - 0x0f, 0x90, 0x03, 0xca, 0x00, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x10, 0xa2, 0x00, 0xc8, 0x01, - 0x3e, 0x20, 0x2c, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, 0xf0, 0x00, - 0xc8, 0x00, 0x3f, 0x00, 0x0c, 0xc0, 0x03, 0x70, - 0x00, 0xcc, 0x00, 0x33, 0x00, 0x4c, 0x80, 0x03, - 0x20, 0x80, 0xf8, 0xc0, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0xed, 0x09, 0x00, 0x1e, 0x02, 0x00, - 0xf8, 0x40, 0x32, 0x00, 0x0d, 0x84, 0x03, 0x20, - 0x02, 0xc8, 0xc0, 0x32, 0x02, 0x0f, 0x80, 0x03, - 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x05, 0x3b, 0x22, 0x8a, 0x00, 0x2f, 0x90, 0x08, - 0xa0, 0x02, 0xe8, 0x00, 0xba, 0x00, 0x2e, 0x80, - 0x0b, 0xa0, 0x02, 0xe8, 0x02, 0x8a, 0x04, 0x2e, - 0x80, 0x0a, 0xa0, 0x02, 0x28, 0x08, 0xaa, 0x01, - 0x20, 0x80, 0x0a, 0xe8, 0x02, 0x38, 0x04, 0x3e, - 0xe0, 0x2e, 0x80, 0x0b, 0xa0, 0x02, 0xe8, 0x00, - 0xba, 0x00, 0xa3, 0x80, 0x4a, 0xe2, 0x0a, 0x38, - 0x80, 0x8e, 0x49, 0x21, 0x80, 0x0b, 0xa0, 0x02, - 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x05, 0x46, 0x00, 0x83, 0x00, 0x2c, 0x40, 0x09, - 0x30, 0x02, 0xcc, 0x00, 0xb2, 0x00, 0x2c, 0x00, - 0x0b, 0x00, 0x02, 0xc0, 0x00, 0x82, 0x00, 0x2c, - 0x00, 0x08, 0x00, 0x02, 0x40, 0x00, 0x80, 0x00, - 0x20, 0x00, 0x48, 0x02, 0x02, 0x0c, 0x04, 0xb3, - 0x80, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x20, 0xc0, 0x09, 0x08, 0x82, 0x2e, - 0x00, 0x81, 0x80, 0x6c, 0xe0, 0x0b, 0x30, 0x02, - 0xca, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, - 0x01, 0x3e, 0x08, 0x87, 0x00, 0x2d, 0x60, 0x09, - 0x70, 0x02, 0xdc, 0x00, 0xb6, 0x00, 0x2d, 0x40, - 0x0b, 0x70, 0x02, 0xde, 0x00, 0x86, 0x00, 0x2f, - 0x60, 0x0a, 0xf0, 0x02, 0x1e, 0x00, 0xaf, 0x80, - 0xa1, 0xc0, 0x0a, 0xf8, 0x8a, 0x1d, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, - 0xbf, 0x00, 0x23, 0x40, 0x0b, 0x48, 0x02, 0x18, - 0x00, 0x8f, 0x80, 0x25, 0xc2, 0x4b, 0x70, 0x02, - 0xe8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xa8, - 0x08, 0x16, 0x00, 0xc7, 0x82, 0x7d, 0xa0, 0x0d, - 0x78, 0x07, 0xde, 0x00, 0xf6, 0xed, 0x09, 0x00, - 0x1f, 0x02, 0x80, 0x3d, 0x20, 0x0f, 0x48, 0x03, - 0xd2, 0x04, 0xc6, 0x80, 0x7d, 0x20, 0x0c, 0x48, - 0x13, 0x52, 0x01, 0xc4, 0x80, 0x31, 0x20, 0x0c, - 0x78, 0x03, 0x12, 0x00, 0xf7, 0x80, 0x3d, 0xe0, - 0x0f, 0x78, 0x03, 0xde, 0x00, 0xf7, 0x80, 0x31, - 0xe0, 0x0d, 0x48, 0x03, 0x3a, 0x02, 0xc7, 0x80, - 0xbd, 0x20, 0x0f, 0x78, 0x03, 0xea, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1d, 0xa0, 0x00, - 0xfb, 0x00, 0x7c, 0x00, 0x0e, 0xb0, 0x03, 0xec, - 0x00, 0xfa, 0x00, 0x3e, 0x40, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfa, 0x00, 0x2c, 0x40, 0x0f, 0x30, - 0x03, 0xec, 0x04, 0xf3, 0x00, 0x1c, 0xc0, 0x0f, - 0x10, 0x03, 0xe8, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xf3, 0x00, 0x3c, - 0x40, 0x0e, 0xa0, 0x03, 0xec, 0x00, 0xf3, 0x01, - 0x3a, 0x00, 0x0f, 0xb0, 0x03, 0x42, 0x06, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, - 0xff, 0x84, 0x3f, 0x60, 0x0c, 0xf8, 0x03, 0xfe, - 0x00, 0xfe, 0x80, 0x3f, 0x20, 0x0f, 0x48, 0x03, - 0x12, 0x00, 0xce, 0x80, 0x3b, 0x20, 0x0e, 0xc8, - 0x03, 0xf2, 0x00, 0xfc, 0x80, 0x3f, 0x24, 0x0f, - 0x78, 0x23, 0x1e, 0x00, 0xcf, 0x80, 0x3f, 0xe0, - 0x0f, 0xf8, 0x03, 0xfe, 0x00, 0xff, 0x80, 0x39, - 0xe0, 0x0d, 0x48, 0x03, 0x3e, 0x00, 0xc7, 0x80, - 0x31, 0xe4, 0x0c, 0xf8, 0x03, 0xc0, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0xa8, 0x11, 0x98, 0x20, - 0xb7, 0x00, 0x2d, 0x44, 0x0d, 0x70, 0x02, 0xdc, - 0x00, 0xb6, 0x00, 0x2d, 0x40, 0x0b, 0x70, 0x12, - 0x1c, 0x00, 0x86, 0x00, 0x21, 0x40, 0x08, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x20, 0x2d, 0xcc, 0x0b, - 0x70, 0x03, 0x5c, 0x40, 0x87, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xdc, 0x01, 0xb7, 0x00, 0x35, - 0xed, 0x09, 0x00, 0x20, 0x02, 0x40, 0x0d, 0x70, - 0x02, 0x10, 0x00, 0x87, 0x00, 0x21, 0xc0, 0x08, - 0x70, 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x94, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x08, 0x70, 0x02, 0xdc, 0x00, 0xb6, 0x00, - 0x2d, 0x10, 0x0b, 0x40, 0x02, 0x12, 0x00, 0x86, - 0x00, 0x29, 0x00, 0x0a, 0x40, 0x02, 0xd0, 0x00, - 0xb4, 0x09, 0x2d, 0x20, 0x1b, 0x60, 0x02, 0x3c, - 0x00, 0x87, 0x08, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xdc, 0x00, 0xb7, 0x08, 0x2b, 0xc0, 0x08, 0xe0, - 0x82, 0x10, 0x20, 0x8f, 0x00, 0x21, 0x00, 0x08, - 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x14, 0xc0, 0x08, 0xb3, 0x80, 0x2c, - 0x58, 0x89, 0x30, 0x02, 0xcc, 0x00, 0xb2, 0x00, - 0x2c, 0x60, 0x0b, 0x30, 0x22, 0x0c, 0x08, 0x82, - 0x50, 0x20, 0x68, 0x88, 0x30, 0x02, 0xcd, 0x88, - 0xb3, 0xe0, 0x2c, 0xe0, 0x0b, 0x38, 0x82, 0x46, - 0x72, 0x82, 0xc0, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x24, 0x78, 0x09, 0x3c, - 0x22, 0x0d, 0x20, 0x83, 0x08, 0x20, 0x24, 0x08, - 0x30, 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0xa8, 0x15, 0x80, 0x00, 0xfb, 0xa2, 0x3e, - 0xc0, 0x0c, 0xb0, 0x03, 0xec, 0x00, 0xfa, 0x00, - 0x3c, 0x10, 0x0f, 0x80, 0x03, 0x21, 0x42, 0xca, - 0x10, 0x38, 0x30, 0x0e, 0x00, 0x03, 0xc0, 0x00, - 0xf8, 0x80, 0x3e, 0x16, 0x0f, 0xb2, 0x03, 0x2e, - 0x01, 0xcb, 0x80, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0xd0, 0x3a, 0xa0, 0x0c, 0xad, - 0x0b, 0x28, 0x00, 0xcb, 0x00, 0xb2, 0x80, 0x2c, - 0xb0, 0x03, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x00, 0xe4, 0x90, 0xfb, 0x00, 0x3e, - 0x50, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfa, 0x00, - 0x3e, 0x44, 0x0f, 0xed, 0x09, 0x00, 0x21, 0x02, - 0xb0, 0x03, 0xec, 0x00, 0xfa, 0x00, 0x3e, 0x44, - 0x8f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xa0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xd4, 0x0f, 0xb4, 0x03, 0xec, 0x00, - 0xfb, 0x04, 0x3e, 0xd0, 0x0f, 0xb0, 0x03, 0xe0, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, - 0xf2, 0x80, 0xcf, 0x00, 0x33, 0xe4, 0x0c, 0xf0, - 0x03, 0xfc, 0x00, 0xfe, 0x00, 0x3f, 0x00, 0x0c, - 0xc0, 0x03, 0x30, 0x00, 0xfe, 0x00, 0x33, 0x00, - 0x0d, 0xc0, 0x03, 0x30, 0x00, 0xcc, 0x00, 0x3f, - 0x00, 0x0c, 0xf8, 0x03, 0xf4, 0x00, 0xfd, 0x18, - 0x33, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xf3, - 0x00, 0x33, 0x80, 0x4c, 0xe8, 0x03, 0xec, 0x00, - 0xbf, 0xa2, 0x33, 0x22, 0xac, 0xf0, 0x03, 0xc0, - 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, - 0x63, 0x00, 0x83, 0x02, 0x20, 0x50, 0x08, 0xb0, - 0x02, 0xec, 0x00, 0xba, 0x00, 0x2e, 0x40, 0x28, - 0x30, 0x02, 0x2c, 0x10, 0xb2, 0x00, 0x2a, 0x40, - 0x08, 0xb0, 0x02, 0xac, 0x00, 0x8b, 0x00, 0x24, - 0xc0, 0x08, 0xb0, 0x02, 0xec, 0x04, 0xb3, 0x80, - 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x20, 0xc0, 0x4a, 0x96, 0x02, 0xeb, 0x04, - 0xb3, 0x48, 0x34, 0x08, 0x08, 0xb0, 0x02, 0xe0, - 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, - 0x21, 0x00, 0x0b, 0x00, 0x22, 0x40, 0x00, 0xb0, - 0x02, 0xec, 0x00, 0xba, 0x00, 0x2e, 0x00, 0x08, - 0x80, 0x02, 0x20, 0x00, 0xba, 0x00, 0x22, 0x00, - 0x09, 0x80, 0x12, 0x20, 0x00, 0xa8, 0x00, 0x2e, - 0x00, 0x08, 0x96, 0x12, 0xec, 0x20, 0xbb, 0x00, - 0x22, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x22, 0x94, 0x18, 0xb1, 0x02, 0xed, 0x09, - 0x00, 0x22, 0x02, 0xe3, 0x00, 0xbb, 0x00, 0xa2, - 0xc8, 0x08, 0xb0, 0x02, 0xe0, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x8b, - 0x00, 0x20, 0x40, 0x88, 0x30, 0x02, 0xcc, 0x00, - 0xb2, 0x00, 0x2e, 0x40, 0x08, 0x30, 0x02, 0x0c, - 0x00, 0xba, 0x00, 0x28, 0x40, 0x08, 0x30, 0x02, - 0xac, 0x02, 0xa3, 0x00, 0x24, 0xc0, 0x48, 0x30, - 0x00, 0xcc, 0x00, 0xbb, 0x00, 0x20, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x20, 0xc0, - 0x0a, 0x10, 0x02, 0xcc, 0x10, 0xb2, 0x00, 0x26, - 0x40, 0x08, 0x30, 0x02, 0xc2, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0d, 0x60, 0x00, 0xcb, - 0x00, 0x32, 0x40, 0x2c, 0xb0, 0x03, 0xec, 0x00, - 0xfa, 0x00, 0x3e, 0x00, 0x0c, 0x80, 0x03, 0x20, - 0x00, 0xfa, 0x00, 0x32, 0x00, 0x0d, 0x80, 0x03, - 0x20, 0x00, 0xe8, 0x00, 0x3e, 0x00, 0x0c, 0xb0, - 0x03, 0xe8, 0x00, 0xfb, 0x00, 0xb2, 0xc0, 0x0f, - 0xb0, 0x02, 0xec, 0x00, 0xfb, 0x00, 0x32, 0x80, - 0x0c, 0x90, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x32, - 0x00, 0x0c, 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x1d, 0xf0, 0x00, 0xff, - 0x00, 0x3d, 0x40, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xfe, 0x00, 0x3f, 0x40, 0x0f, 0xf0, 0x23, 0xfc, - 0x00, 0xf6, 0x00, 0x3d, 0x40, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xdf, 0x00, 0x3f, 0xc0, 0x2f, 0xc0, - 0x03, 0xf0, 0x10, 0xfe, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, - 0x0f, 0xd0, 0x03, 0xf0, 0x00, 0xfe, 0x00, 0x3b, - 0x00, 0x0f, 0xf0, 0x03, 0xe8, 0x06, 0x70, 0x00, - 0x00, 0x00, 0x00, 0xc0, 0x0d, 0xdc, 0x00, 0xcc, - 0x00, 0x33, 0xc0, 0x0c, 0x40, 0x03, 0x30, 0x00, - 0xff, 0x00, 0x33, 0xc8, 0x0c, 0xf2, 0x43, 0xfd, - 0x00, 0xed, 0x09, 0x00, 0x23, 0x02, 0xcf, 0x00, - 0x3f, 0xc0, 0x0d, 0xf0, 0x03, 0xbc, 0x00, 0xcf, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x20, - 0xff, 0x02, 0x2b, 0xc0, 0x1c, 0xf3, 0x03, 0x7c, - 0x00, 0xff, 0x28, 0x27, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, - 0x03, 0xf0, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0xec, 0x00, 0x8a, 0x04, 0x23, 0xd1, - 0x08, 0x80, 0x02, 0x20, 0x00, 0xbf, 0x40, 0x23, - 0xd2, 0x08, 0xf5, 0x02, 0xdc, 0x40, 0x83, 0x08, - 0x2e, 0xc0, 0x8b, 0x75, 0x02, 0x0c, 0x80, 0x8b, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x22, 0xfd, 0x00, - 0xbf, 0x08, 0x23, 0xd0, 0x0b, 0xf3, 0x22, 0x3c, - 0x00, 0xbf, 0x40, 0x2a, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0x9b, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xe0, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x88, 0x05, 0x4c, 0x00, 0x80, 0x00, 0x68, 0xc4, - 0x08, 0x00, 0x02, 0x80, 0x01, 0x93, 0x68, 0x28, - 0xd8, 0x08, 0x30, 0x02, 0xcc, 0x80, 0x83, 0x04, - 0x2c, 0xc0, 0x0b, 0x30, 0x82, 0x0c, 0x20, 0x83, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x62, 0x4c, 0x00, - 0x93, 0x20, 0x2c, 0xd0, 0x0b, 0x32, 0x42, 0x4c, - 0x00, 0xb3, 0x00, 0x20, 0xc0, 0x09, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xea, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xe0, 0x11, 0xac, 0x00, 0x89, 0x40, 0x62, 0xc1, - 0x08, 0xb4, 0x02, 0x2c, 0x04, 0xbb, 0x04, 0x22, - 0xc0, 0x28, 0xb0, 0x62, 0xec, 0x00, 0x2b, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0x2c, 0x10, 0x8b, - 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x22, 0xec, 0x00, - 0xbb, 0x00, 0x26, 0xc0, 0x0b, 0xb0, 0x50, 0x6c, - 0x00, 0xbb, 0x00, 0x06, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0xed, 0x09, 0x00, 0x24, - 0x02, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0x78, 0x04, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xac, - 0x00, 0xcb, 0x40, 0x3a, 0xc0, 0x0c, 0x98, 0x13, - 0xae, 0x00, 0xfb, 0x00, 0xba, 0xc0, 0x0c, 0xb0, - 0x40, 0xec, 0x00, 0xcb, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x12, 0x2c, 0x10, 0xcb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0x6c, 0x10, 0xbb, 0x00, 0x3e, - 0xc1, 0x4f, 0xb0, 0x23, 0x6c, 0x00, 0xbb, 0x00, - 0x32, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xbb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x44, - 0x70, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x3c, - 0x00, 0xff, 0xc0, 0xbf, 0xc0, 0x2f, 0xf2, 0x03, - 0xfe, 0x80, 0xff, 0x00, 0x3e, 0xc1, 0x0f, 0xb0, - 0x03, 0xdc, 0x02, 0xdf, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x01, 0x3f, 0xc0, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xf7, 0x01, 0x3b, - 0xc0, 0x8f, 0xf0, 0x43, 0xbc, 0x10, 0xf7, 0x00, - 0x3b, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xdf, - 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x43, 0xf8, 0x00, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, - 0x80, 0xc9, 0x40, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0x2c, 0x00, 0xc3, 0x00, 0xf8, 0xc0, 0x0e, 0xb8, - 0x83, 0x2c, 0x10, 0xeb, 0x00, 0x32, 0xc0, 0x0f, - 0xb0, 0x03, 0xac, 0x00, 0xcb, 0x00, 0x3e, 0xc0, - 0x0b, 0xb0, 0x03, 0xec, 0x00, 0xcb, 0x00, 0x3a, - 0xc0, 0x1f, 0xb0, 0x03, 0x6c, 0x00, 0xeb, 0x00, - 0x32, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0x50, 0x04, - 0x20, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x04, 0x0c, - 0x00, 0x82, 0x88, 0x2d, 0xc0, 0x0b, 0x24, 0x02, - 0x2c, 0x40, 0xdf, 0x00, 0x63, 0xc0, 0x48, 0xf0, - 0x02, 0x3c, 0x08, 0x8b, 0x00, 0x22, 0xc0, 0xed, - 0x09, 0x00, 0x25, 0x02, 0x4b, 0xf0, 0x03, 0x2c, - 0x00, 0xdb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xfc, 0x40, 0x8f, 0x00, 0x23, 0xf8, 0x9f, 0xf0, - 0x02, 0xfc, 0x00, 0x8f, 0x00, 0x2a, 0xc0, 0x0b, - 0xb0, 0x02, 0xec, 0x00, 0xeb, 0x00, 0x2e, 0xc0, - 0x0b, 0xb0, 0x02, 0xf2, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0xe2, 0x05, 0x4c, 0x00, 0x82, 0x80, - 0x2c, 0xc0, 0x0b, 0x0b, 0x02, 0x03, 0x40, 0xb3, - 0x00, 0x20, 0xc0, 0x0a, 0x30, 0x32, 0x8c, 0x00, - 0xa3, 0x00, 0x20, 0xc0, 0x0b, 0xb0, 0x02, 0x2c, - 0x00, 0x83, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0x8e, 0x00, 0x83, 0x00, 0x2c, 0xe2, 0x1b, 0xb0, - 0x22, 0x4c, 0x00, 0xa3, 0x00, 0x28, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0x93, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xf8, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x62, 0x01, 0x1e, 0x20, 0x84, 0x80, - 0x6d, 0xe0, 0x0b, 0x78, 0x02, 0x36, 0x00, 0xb7, - 0x80, 0x21, 0xe0, 0x0a, 0x7b, 0x40, 0x9e, 0x01, - 0xa7, 0x80, 0x21, 0xe0, 0x03, 0x78, 0x02, 0x5e, - 0x00, 0x87, 0x80, 0x2d, 0xe0, 0x0b, 0x78, 0x02, - 0xde, 0x00, 0x83, 0x80, 0x05, 0xe0, 0x0a, 0x78, - 0x02, 0xce, 0x00, 0xa3, 0x80, 0x29, 0xe0, 0x0b, - 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0b, 0x78, 0x02, 0xc8, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x00, 0x0c, 0x00, 0xc3, 0x00, - 0x3c, 0xc0, 0x0f, 0x20, 0x0b, 0x09, 0x00, 0xfb, - 0x00, 0x00, 0xc0, 0x0a, 0x32, 0x03, 0x8c, 0x04, - 0xe3, 0x00, 0x90, 0xc4, 0x0f, 0x31, 0x03, 0x8c, - 0x00, 0x83, 0x00, 0x3c, 0xc4, 0x0f, 0x31, 0x03, - 0x8c, 0x60, 0x43, 0x11, 0x3c, 0xc1, 0x0b, 0x31, - 0x03, 0x4c, 0x80, 0xe3, 0x00, 0x10, 0xc0, 0x0f, - 0x30, 0x03, 0xcc, 0x00, 0xd3, 0x00, 0x3c, 0xc0, - 0x0f, 0x30, 0xed, 0x09, 0x00, 0x26, 0x02, 0x03, - 0x52, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x15, 0xac, 0x00, 0xfa, 0x00, 0x3e, 0xc6, 0x0f, - 0xa0, 0x03, 0xc0, 0x00, 0xdb, 0x00, 0x3e, 0xd0, - 0x0d, 0xb2, 0x93, 0x6d, 0x40, 0xdb, 0x00, 0x3e, - 0xc1, 0x0f, 0xb4, 0x43, 0xac, 0x00, 0xfb, 0x10, - 0x3e, 0xc4, 0x0f, 0xb0, 0x03, 0xcc, 0x30, 0xfb, - 0x40, 0x3a, 0xc4, 0x07, 0xb1, 0x03, 0xec, 0x00, - 0xdb, 0x18, 0x16, 0xc4, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xeb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x88, - 0x0d, 0xce, 0x00, 0xc1, 0x04, 0x30, 0xe0, 0x08, - 0xb0, 0x01, 0xee, 0x00, 0x5b, 0x50, 0x3e, 0xc1, - 0x0b, 0xb6, 0x03, 0x2c, 0x00, 0x4b, 0x00, 0x3e, - 0xc0, 0x8f, 0xb2, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0b, 0xb0, 0x03, 0xec, 0x90, 0x5b, - 0x30, 0x3a, 0xe0, 0x0c, 0xb2, 0x03, 0xee, 0x80, - 0xfb, 0x80, 0x3a, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xc2, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, - 0x01, 0x9c, 0x00, 0x85, 0x00, 0x21, 0xca, 0x08, - 0x60, 0x02, 0xdc, 0x00, 0xa7, 0x28, 0x2d, 0xc8, - 0x0b, 0x73, 0x02, 0x8c, 0x80, 0x87, 0x00, 0x2d, - 0xc0, 0x0b, 0x74, 0x00, 0xdc, 0x00, 0xf7, 0x00, - 0x39, 0xc0, 0x0b, 0x70, 0x12, 0x5c, 0x40, 0x97, - 0x00, 0x2d, 0xd4, 0xa0, 0x77, 0x02, 0xdd, 0x40, - 0xbf, 0x28, 0x21, 0xc0, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0x97, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0xd2, 0x24, 0x20, 0x00, 0x00, 0x00, 0x00, 0xe1, - 0x00, 0x9e, 0x02, 0x8e, 0x88, 0xa1, 0xe8, 0x08, - 0x78, 0x02, 0xde, 0x00, 0x97, 0x80, 0x2d, 0xec, - 0x0b, 0x7a, 0x12, 0x1e, 0xc0, 0x87, 0x80, 0x2d, - 0xe0, 0x0b, 0x78, 0x02, 0xde, 0xed, 0x09, 0x00, - 0x27, 0x02, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x0b, - 0x78, 0x12, 0xde, 0x10, 0xb7, 0xa0, 0x28, 0xe0, - 0x08, 0x7a, 0x02, 0xdc, 0x80, 0xb7, 0x00, 0x29, - 0xe0, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0xc0, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, 0x00, - 0x81, 0x00, 0x20, 0xc0, 0x48, 0x18, 0x02, 0xcc, - 0x40, 0xa3, 0x00, 0x2e, 0xc0, 0x0b, 0x30, 0x02, - 0xac, 0x00, 0x8b, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x28, 0xc0, 0x0b, - 0x30, 0x00, 0xcc, 0x08, 0x93, 0x04, 0x2c, 0xc0, - 0x08, 0x30, 0x02, 0xcc, 0x00, 0x93, 0x00, 0x20, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xd2, 0x04, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xe8, 0x15, 0xa8, 0x00, - 0xc6, 0x40, 0x32, 0x80, 0x2c, 0x64, 0x23, 0xfb, - 0x00, 0xda, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x02, - 0x28, 0x02, 0x8a, 0x00, 0x3e, 0x80, 0x0f, 0xa0, - 0x03, 0xe8, 0x00, 0xfa, 0x00, 0x3e, 0x80, 0x0f, - 0xa0, 0x02, 0xe8, 0x00, 0xba, 0x02, 0x1a, 0x80, - 0x08, 0xa0, 0x03, 0xe8, 0x00, 0xba, 0x00, 0x3a, - 0x80, 0x0f, 0xa0, 0x03, 0xe8, 0x00, 0xfa, 0x00, - 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xf8, 0x04, 0x60, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xe1, 0x00, - 0xf8, 0x83, 0x3e, 0x01, 0x0f, 0x89, 0x03, 0xe3, - 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x00, 0x43, - 0xe0, 0x02, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x00, - 0x03, 0xe0, 0x00, 0xe8, 0x00, 0x2e, 0x00, 0x0f, - 0x80, 0x03, 0x60, 0x00, 0xd8, 0x00, 0x36, 0x00, - 0x4f, 0x00, 0x03, 0xe0, 0x01, 0xf8, 0x00, 0x3e, - 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xd8, 0x00, - 0x3e, 0x00, 0x0d, 0x80, 0x03, 0xd2, 0x00, 0x30, - 0xed, 0x09, 0x00, 0x28, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x10, 0xe7, 0x00, 0xf9, 0x00, 0xb2, - 0x60, 0x0f, 0x92, 0x03, 0x26, 0x00, 0xf9, 0x00, - 0x32, 0x40, 0x0f, 0x94, 0x12, 0x24, 0x00, 0xf9, - 0x00, 0x32, 0x40, 0x0d, 0x90, 0x03, 0xa4, 0x01, - 0xf9, 0x01, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xc9, 0x00, 0x3e, 0x40, 0x8f, 0x90, 0x42, - 0x04, 0x04, 0xc9, 0x01, 0x32, 0x41, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xc2, 0x04, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x04, 0x66, 0x00, 0xb9, 0x00, 0x22, - 0x64, 0x0b, 0x94, 0x82, 0x25, 0x60, 0xb9, 0x00, - 0x22, 0x40, 0x88, 0x98, 0x02, 0x24, 0x00, 0x89, - 0x00, 0x22, 0x40, 0x0b, 0x90, 0x42, 0x24, 0x00, - 0xb9, 0x00, 0x2e, 0x40, 0x0b, 0x90, 0x12, 0xc7, - 0x40, 0xc9, 0x00, 0x2e, 0x41, 0x0e, 0x90, 0x42, - 0x24, 0x00, 0x89, 0x00, 0x22, 0x40, 0x0b, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xe0, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x04, 0x24, 0x00, 0xb9, 0x20, 0x22, - 0x41, 0x43, 0x90, 0x02, 0x64, 0x00, 0xb1, 0x00, - 0x22, 0x40, 0x0b, 0x90, 0x0a, 0xa4, 0x04, 0xb9, - 0x00, 0x22, 0x40, 0x0b, 0x90, 0x02, 0xa4, 0x08, - 0xb9, 0x06, 0x26, 0x40, 0x0a, 0x90, 0x02, 0xe4, - 0x00, 0x89, 0x00, 0x2e, 0x4a, 0x0b, 0x90, 0x02, - 0xa4, 0x00, 0x81, 0x00, 0x22, 0x40, 0x0b, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xc6, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb9, 0x00, 0x20, - 0x40, 0x0b, 0x90, 0x0a, 0x44, 0x00, 0xb1, 0x40, - 0xa0, 0x4a, 0x08, 0x30, 0x02, 0x84, 0x00, 0x81, - 0x40, 0xa0, 0x40, 0x0b, 0x16, 0x82, 0x05, 0x00, - 0xb1, 0x00, 0x2c, 0xed, 0x09, 0x00, 0x29, 0x02, - 0x40, 0x4b, 0x10, 0x02, 0xcc, 0x04, 0x91, 0x40, - 0x2c, 0x40, 0x4b, 0x14, 0x0a, 0x84, 0x00, 0x81, - 0x40, 0x20, 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc2, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, - 0x60, 0x00, 0xf8, 0x00, 0x32, 0x00, 0x0f, 0x80, - 0x03, 0x60, 0x10, 0xf8, 0x00, 0x32, 0x08, 0x0f, - 0x80, 0x03, 0xa0, 0x02, 0xf8, 0x00, 0x32, 0x00, - 0x0b, 0x82, 0x23, 0xa0, 0x00, 0xb8, 0x00, 0x36, - 0x00, 0xcf, 0x80, 0x07, 0xe0, 0x02, 0xc8, 0x02, - 0x7e, 0x00, 0x0f, 0x80, 0x03, 0x20, 0x00, 0xc8, - 0x00, 0x32, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xfe, - 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x98, 0x14, - 0xe4, 0x00, 0xfd, 0x00, 0x2e, 0x50, 0x0f, 0xd0, - 0x03, 0x94, 0x00, 0xb9, 0x40, 0x3e, 0x4a, 0x0f, - 0x14, 0x07, 0x65, 0xa0, 0xf9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x0b, 0xe4, 0x04, 0x79, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe5, 0x00, 0xe9, 0x41, - 0x1e, 0x50, 0x8e, 0x94, 0x03, 0x65, 0x00, 0xf9, - 0x40, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe6, - 0x26, 0x70, 0x00, 0x00, 0x00, 0x00, 0x98, 0x05, - 0xf4, 0x00, 0xfd, 0x00, 0x3f, 0x40, 0x1c, 0x50, - 0x03, 0x14, 0x00, 0xd9, 0x22, 0x32, 0x44, 0x0e, - 0xd2, 0x03, 0xa4, 0x10, 0xd9, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x08, 0xf9, 0x00, 0x36, - 0x40, 0x5b, 0x90, 0x23, 0xf4, 0x18, 0xf9, 0x20, - 0x3d, 0x4a, 0x0c, 0x93, 0x03, 0x64, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xc6, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x2a, 0x02, 0x39, 0x10, 0xe0, 0x00, 0xba, - 0x00, 0x2e, 0x10, 0x08, 0x80, 0x02, 0x28, 0x00, - 0x88, 0x29, 0x22, 0x14, 0x0a, 0x81, 0x02, 0xe1, - 0x80, 0x88, 0x08, 0x2e, 0x00, 0x0b, 0x82, 0x82, - 0xe0, 0x80, 0x98, 0x00, 0x2e, 0x00, 0x0b, 0x80, - 0x22, 0xe0, 0x40, 0x98, 0x28, 0x2e, 0x00, 0x08, - 0x83, 0x22, 0x21, 0x08, 0xb8, 0x08, 0x2e, 0x00, - 0x0b, 0x80, 0x02, 0x60, 0x00, 0xb8, 0x00, 0x2e, - 0x00, 0x0b, 0x80, 0x02, 0xce, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x00, 0xc4, 0x00, 0x31, - 0x00, 0x2c, 0x44, 0x08, 0x18, 0x12, 0x24, 0x00, - 0x91, 0x30, 0x20, 0x49, 0x0a, 0x10, 0x02, 0x84, - 0x61, 0x81, 0x00, 0x2c, 0x40, 0x0b, 0x16, 0x02, - 0x44, 0xa0, 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, - 0x02, 0xc4, 0x00, 0xb1, 0x30, 0x0c, 0x40, 0x09, - 0x12, 0x22, 0x44, 0x40, 0xb1, 0x10, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x2c, - 0x40, 0x0b, 0x10, 0x02, 0xd2, 0x01, 0x70, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x28, 0x91, 0x02, 0x24, 0x40, - 0xa9, 0x02, 0x22, 0x40, 0x08, 0xb0, 0x42, 0xc4, - 0x00, 0x89, 0x00, 0x2e, 0x41, 0x0b, 0x90, 0x02, - 0xe4, 0x00, 0xb9, 0x02, 0x2e, 0x40, 0x0b, 0x90, - 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x10, 0x02, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0x64, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xe6, 0x04, 0x60, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x94, 0xe4, 0x00, 0xf9, - 0xc0, 0x3e, 0x40, 0x08, 0x14, 0x0b, 0x26, 0x10, - 0xd9, 0x00, 0xb2, 0x40, 0x0e, 0x90, 0x01, 0xa4, - 0x00, 0xc9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0x64, 0x00, 0xf9, 0x00, 0x36, 0x40, 0x0b, 0x90, - 0x03, 0xed, 0x09, 0x00, 0x2b, 0x02, 0xe4, 0x08, - 0xf9, 0x00, 0x2e, 0x40, 0x0d, 0x90, 0x03, 0x64, - 0x10, 0xb9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe8, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x00, 0xa4, 0x00, 0xf9, 0x40, 0x3e, 0x40, - 0x0f, 0x98, 0x03, 0xe6, 0x00, 0xd1, 0x00, 0x7e, - 0x40, 0x0f, 0x90, 0x43, 0xe4, 0x02, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x43, 0xe4, 0x00, 0xd9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xd9, 0x00, 0x3e, 0x40, 0x3c, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0x64, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xda, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x2a, 0x10, 0xa0, 0x80, 0xf8, 0x00, 0x30, 0x00, - 0x0c, 0x88, 0x53, 0x23, 0x00, 0xc8, 0x00, 0x3e, - 0x00, 0x07, 0x88, 0x03, 0xe0, 0x00, 0xd8, 0x00, - 0x36, 0x00, 0x8f, 0x80, 0x03, 0xa0, 0x00, 0xf8, - 0x04, 0x1e, 0x00, 0x4f, 0x80, 0x03, 0xe0, 0x20, - 0xd8, 0x02, 0x1e, 0x08, 0x0c, 0x80, 0x03, 0xe0, - 0x00, 0xf8, 0x04, 0x0e, 0x00, 0x0f, 0x80, 0x03, - 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xca, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x04, 0x3b, 0x00, 0xba, 0x88, 0x22, 0x82, - 0x2a, 0xec, 0x82, 0x1b, 0x00, 0x0a, 0x00, 0x2e, - 0x80, 0x0b, 0xec, 0x02, 0xe8, 0x00, 0xca, 0x00, - 0x2e, 0x80, 0x0b, 0xa0, 0x03, 0x68, 0x00, 0xba, - 0x00, 0x2e, 0x80, 0x0b, 0xa0, 0x02, 0xfb, 0x00, - 0xba, 0x00, 0x2d, 0x80, 0x0d, 0xa0, 0x02, 0xe8, - 0x00, 0xea, 0x00, 0x2e, 0x80, 0x0b, 0xa0, 0x02, - 0xe8, 0x00, 0xba, 0x00, 0x2e, 0x80, 0x0b, 0xa0, - 0x02, 0xca, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x2c, 0x05, 0x40, 0x00, 0xed, 0x09, 0x00, 0x2c, - 0x02, 0xb1, 0x00, 0xa0, 0xe0, 0x08, 0x38, 0x02, - 0x0c, 0x00, 0x83, 0x00, 0x2e, 0xc0, 0x0b, 0x38, - 0x02, 0xcc, 0x04, 0x83, 0x00, 0x04, 0xc0, 0x0b, - 0x30, 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x24, 0xc0, - 0x83, 0x30, 0x02, 0xc3, 0x0c, 0x93, 0x00, 0x0c, - 0x70, 0x09, 0x30, 0x42, 0xcc, 0x00, 0xa3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xca, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x1d, - 0x00, 0xb5, 0x80, 0x21, 0xc0, 0x08, 0x40, 0x02, - 0x1c, 0x20, 0x87, 0x24, 0x25, 0xc8, 0x0b, 0x74, - 0x02, 0xdc, 0x40, 0x87, 0x20, 0x2d, 0xc0, 0x0b, - 0x3a, 0x02, 0x5c, 0x80, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xdc, 0x30, 0xb7, 0x00, 0x6d, - 0x90, 0x29, 0x72, 0x02, 0xdc, 0x08, 0xa7, 0x20, - 0x25, 0xc0, 0x0b, 0x70, 0x06, 0xdc, 0x00, 0xb7, - 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xe8, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x08, 0x1e, - 0x00, 0xf7, 0x80, 0x30, 0x60, 0x08, 0x48, 0x0b, - 0x16, 0x02, 0xc7, 0xd0, 0x2d, 0xf0, 0x0f, 0x78, - 0x23, 0xfe, 0x80, 0xc7, 0x80, 0x35, 0xe0, 0x0f, - 0x7f, 0x0b, 0x9e, 0x00, 0xb7, 0x80, 0x3d, 0xe0, - 0x0b, 0x78, 0x03, 0xde, 0x00, 0xd7, 0xa0, 0x1d, - 0xa0, 0x4d, 0x7e, 0x03, 0xde, 0x00, 0xe7, 0x80, - 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0xde, 0x00, 0xf7, - 0x80, 0x3d, 0xe0, 0x0f, 0x78, 0x03, 0xea, 0x22, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0d, 0xa0, - 0x00, 0xf1, 0x00, 0x3e, 0x40, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xed, 0x02, 0xeb, 0x60, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0xe0, 0xfb, 0x00, 0x2e, 0xc0, - 0x0f, 0xb0, 0x42, 0xec, 0x10, 0xfb, 0x4a, 0xed, - 0x09, 0x00, 0x2d, 0x02, 0x3e, 0x80, 0x0e, 0xb2, - 0x03, 0xec, 0x04, 0xeb, 0x76, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x05, 0xf2, 0x00, 0xfd, 0x90, - 0x03, 0x61, 0x0f, 0xc8, 0x03, 0xda, 0x00, 0xcf, - 0x80, 0x3f, 0xe0, 0x0d, 0xe8, 0x07, 0xfd, 0x40, - 0xff, 0xc8, 0x3f, 0xe0, 0x0f, 0xf8, 0x43, 0xfe, - 0x00, 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, - 0xfe, 0x00, 0xef, 0x88, 0x23, 0xa8, 0x0f, 0xfc, - 0x23, 0xfe, 0x00, 0xff, 0xd0, 0x3f, 0xe4, 0x0f, - 0xf8, 0x03, 0xfe, 0x00, 0xff, 0x80, 0x3f, 0xe0, - 0x0f, 0xf8, 0x03, 0xc0, 0x80, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xa8, 0x11, 0x91, 0x00, 0xb5, 0x30, - 0x21, 0x48, 0x08, 0x70, 0x02, 0xd8, 0x00, 0xa7, - 0x00, 0x25, 0xc0, 0x08, 0x70, 0x27, 0x9c, 0x80, - 0x37, 0x00, 0x2d, 0xc0, 0x09, 0x70, 0x03, 0xdc, - 0x00, 0xb7, 0x00, 0x0d, 0xc0, 0x0b, 0x70, 0x02, - 0xdd, 0x00, 0x07, 0x00, 0x21, 0xc0, 0x0f, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x70, 0x12, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0x6a, 0x84, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x92, 0x00, 0x90, 0x00, 0xbd, 0x01, - 0xa1, 0xc1, 0x0a, 0x70, 0x02, 0xf4, 0x20, 0x87, - 0x10, 0x2c, 0xc0, 0x09, 0x60, 0x02, 0x9c, 0x40, - 0xb7, 0x00, 0x2d, 0xc0, 0x09, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, - 0x50, 0x40, 0x87, 0x00, 0x21, 0x08, 0x0b, 0x71, - 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x0d, 0xc1, 0x09, - 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x62, 0x14, 0xc0, 0x00, 0xb1, 0x80, - 0x20, 0xc0, 0xed, 0x09, 0x00, 0x2e, 0x02, 0x48, - 0x08, 0x12, 0xc2, 0x00, 0xa3, 0x00, 0x0c, 0xc0, - 0x08, 0x20, 0x02, 0x8c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x89, 0x30, 0x02, 0x8c, 0x00, 0xb3, 0x00, - 0x0c, 0xc0, 0x03, 0x30, 0x00, 0xcc, 0x04, 0x8b, - 0x01, 0x28, 0x80, 0x4b, 0x30, 0x02, 0xcc, 0x10, - 0xb3, 0x00, 0x2c, 0xc0, 0x09, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0xaa, - 0x15, 0xa0, 0x00, 0xf9, 0xc0, 0xb0, 0x40, 0x0a, - 0xa8, 0x03, 0xef, 0x50, 0xcf, 0x06, 0x3f, 0xc0, - 0x05, 0x90, 0x03, 0xbc, 0x00, 0x7f, 0x00, 0x3e, - 0xc0, 0x0d, 0xf0, 0x02, 0xfc, 0x00, 0xfb, 0x00, - 0x7e, 0xc0, 0x0f, 0xb0, 0x03, 0x6c, 0x02, 0x6f, - 0x04, 0x92, 0x80, 0x0f, 0xf0, 0x03, 0xec, 0x00, - 0xff, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xea, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0x90, - 0x00, 0xe9, 0x08, 0xf9, 0x18, 0x3e, 0x40, 0x2e, - 0x97, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x74, 0xc0, - 0x0f, 0xb4, 0x03, 0xac, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0d, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x02, - 0x3e, 0xc0, 0x0d, 0xb0, 0x03, 0xc1, 0x00, 0xfb, - 0x01, 0x34, 0x00, 0x5e, 0xb0, 0x03, 0x6c, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x91, - 0x10, 0xf8, 0x00, 0xff, 0x00, 0x3e, 0xc8, 0x0e, - 0xd0, 0x03, 0xfc, 0x02, 0xcf, 0x04, 0x2f, 0xc0, - 0x2c, 0xda, 0x03, 0xbc, 0x10, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x13, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xec, 0x40, 0xcf, - 0x00, 0x33, 0xe1, 0x45, 0x70, 0xed, 0x09, 0x00, - 0x2f, 0x02, 0x13, 0xbc, 0x10, 0xff, 0x00, 0x37, - 0xc0, 0x0f, 0xf0, 0x23, 0x7c, 0x00, 0xff, 0x00, - 0x37, 0xc0, 0x0f, 0xf0, 0x03, 0xc0, 0x44, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xc1, 0x04, 0x61, 0x00, - 0xb9, 0x00, 0x2e, 0xe0, 0x08, 0xa4, 0x82, 0xc7, - 0xc0, 0x8b, 0x00, 0x2e, 0xc0, 0x08, 0x90, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, - 0xb0, 0x02, 0xed, 0x00, 0x8b, 0x00, 0x22, 0xb2, - 0x08, 0xb0, 0x02, 0x2c, 0x00, 0xbb, 0x03, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x40, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x20, 0x00, - 0xb9, 0x02, 0x2e, 0xc0, 0x08, 0x90, 0x02, 0xec, - 0x00, 0x8b, 0x00, 0x2e, 0xc0, 0x01, 0xb0, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xab, 0x00, 0x2e, 0xc0, 0x8b, - 0xb0, 0x06, 0xec, 0x00, 0xab, 0x02, 0x22, 0x88, - 0x0a, 0xb0, 0x02, 0x2c, 0x00, 0xbb, 0x00, 0x6e, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x26, 0xc0, 0x0b, 0xb0, 0x02, 0xe0, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, - 0xb1, 0x00, 0x2c, 0xc0, 0x28, 0x20, 0x02, 0xc8, - 0x1c, 0x83, 0x00, 0x2c, 0xc0, 0x08, 0x00, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x30, 0x02, 0xcc, 0x02, 0x83, 0x00, 0x20, 0x80, - 0x4a, 0x30, 0x0a, 0x0c, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x4b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xc2, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x09, 0x60, 0x00, - 0xf9, 0x00, 0x3e, 0x40, 0x0c, 0xa0, 0x13, 0xe0, - 0xed, 0x09, 0x00, 0x30, 0x02, 0x00, 0xcf, 0x00, - 0x3e, 0xc0, 0x0d, 0x80, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3e, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xfb, 0x02, 0x3e, 0xc0, 0x0f, 0xb0, 0x53, 0xec, - 0x08, 0x47, 0x00, 0xb2, 0x80, 0x2f, 0xf0, 0x03, - 0x2c, 0x00, 0xff, 0x00, 0x36, 0xc0, 0x0f, 0xb0, - 0x03, 0x6c, 0x00, 0xfb, 0x00, 0x36, 0xc0, 0x0f, - 0xb0, 0x03, 0xc0, 0x03, 0x50, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x1d, 0xf0, 0x04, 0xf5, 0x00, 0x2f, - 0x40, 0x07, 0xd0, 0x03, 0xf0, 0x00, 0xff, 0x04, - 0x3f, 0xc0, 0x0f, 0xc0, 0x02, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x8f, 0xf0, 0x23, 0xfc, 0x00, - 0xff, 0x00, 0x3f, 0xc1, 0x0b, 0xf0, 0x03, 0xf0, - 0x10, 0xff, 0x01, 0x3f, 0x40, 0x8d, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x04, 0x3f, 0xc0, 0x4f, 0xf0, - 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, - 0x00, 0xc0, 0x05, 0xfc, 0x00, 0xff, 0x00, 0x3f, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xe0, 0x03, 0xd4, 0x00, 0xf7, - 0x00, 0x3f, 0xc0, 0x0f, 0xe0, 0x03, 0xd4, 0x00, - 0xff, 0x00, 0x3f, 0xc0, 0x0c, 0xf0, 0x03, 0x3c, - 0x04, 0xfc, 0x02, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xfc, 0x00, 0x3f, 0x04, 0x8c, 0xc1, - 0x03, 0x31, 0x00, 0xcc, 0x00, 0x3f, 0xc8, 0x0c, - 0xf0, 0x03, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x10, 0xec, 0x00, 0xbb, 0x00, 0x2e, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x2e, 0xc0, 0x0b, 0xa0, 0x02, 0xe0, 0x00, 0xe8, - 0x00, 0x2e, 0x00, 0x0b, 0xa0, 0x02, 0xe0, 0x00, - 0xb8, 0x00, 0x2e, 0x00, 0x8d, 0x80, 0x0a, 0x20, - 0x00, 0xb8, 0x01, 0x2e, 0xc0, 0x0b, 0xb0, 0x02, - 0xec, 0x00, 0x38, 0xed, 0x09, 0x00, 0x31, 0x02, - 0x00, 0x2c, 0x08, 0x08, 0x80, 0x02, 0x20, 0x00, - 0x89, 0x00, 0x2e, 0xc4, 0x8a, 0xb5, 0x02, 0xe0, - 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x88, 0x05, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, - 0x02, 0x4c, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x20, 0x02, 0xc4, 0x10, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x20, 0x02, 0xc4, 0x01, 0xb3, 0x00, 0x2c, - 0xc0, 0x08, 0x30, 0x02, 0x8c, 0x00, 0xb1, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x04, 0x30, - 0x28, 0x2c, 0x08, 0x09, 0x12, 0x02, 0x00, 0x84, - 0x90, 0x00, 0x2c, 0xc0, 0x08, 0x30, 0x02, 0xe2, - 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x15, - 0xac, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x83, - 0xa0, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, 0x00, - 0x0b, 0xa0, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2e, - 0x00, 0x09, 0x80, 0x02, 0xa0, 0x00, 0xb9, 0x10, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x04, 0xba, - 0x00, 0x2e, 0x04, 0x09, 0x10, 0x0a, 0x00, 0x00, - 0x99, 0x10, 0x2e, 0xc4, 0x0a, 0xb0, 0x02, 0xf0, - 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, - 0xa0, 0x03, 0xe4, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xa0, 0x03, 0xe4, 0x04, 0xfb, 0x00, 0x3e, - 0xc0, 0x0c, 0x30, 0x03, 0xac, 0x00, 0xf8, 0xc0, - 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xf9, - 0xd0, 0x3e, 0x60, 0x2d, 0xa0, 0x0b, 0x29, 0x02, - 0xd8, 0x00, 0x3e, 0x80, 0x2c, 0xb0, 0x03, 0xd0, - 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, - 0xbc, 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0d, 0xf0, - 0x03, 0xfc, 0x00, 0xdf, 0x00, 0x3f, 0xed, 0x09, - 0x00, 0x32, 0x02, 0xc0, 0x0f, 0xe0, 0x03, 0xf0, - 0x00, 0xec, 0x00, 0x3f, 0x02, 0x0f, 0xe0, 0x03, - 0xf0, 0x00, 0xfc, 0x00, 0x2f, 0x00, 0x0f, 0xc0, - 0x03, 0x70, 0x00, 0xfd, 0x80, 0x3f, 0xc0, 0x0f, - 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, 0x3f, 0x60, - 0x0e, 0xe0, 0x03, 0xf8, 0x00, 0xed, 0x0a, 0x3f, - 0x80, 0x0f, 0xf0, 0x03, 0xf8, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x10, 0xac, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xa0, 0x13, 0xe4, - 0x02, 0xcb, 0x00, 0x32, 0xc0, 0xcf, 0xa1, 0x01, - 0xe4, 0x00, 0xdb, 0x10, 0x3a, 0xc8, 0x0c, 0xb0, - 0x03, 0x2c, 0x00, 0xf9, 0x40, 0x02, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xf9, 0x40, 0x3e, 0x60, - 0x2c, 0xb8, 0x03, 0x2b, 0x02, 0xc8, 0x00, 0x30, - 0xc0, 0x0f, 0xb0, 0x03, 0xd0, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0xc8, 0x05, 0x2c, 0x00, 0xbb, - 0x00, 0x2f, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, - 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xa0, 0x02, 0xe1, - 0x40, 0x88, 0xf0, 0x2a, 0x10, 0x0b, 0xa8, 0x02, - 0xe1, 0xc0, 0x88, 0x40, 0x2c, 0x20, 0x08, 0x88, - 0x10, 0x22, 0x20, 0xb9, 0xa0, 0x36, 0xc0, 0x0b, - 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2e, 0x60, - 0x88, 0xb8, 0x02, 0x2a, 0x00, 0x89, 0x88, 0x22, - 0xc0, 0x8b, 0xf0, 0x02, 0xf2, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xe0, 0x05, 0x4c, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, - 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x20, 0x02, 0xc5, - 0x00, 0x83, 0x00, 0x20, 0xc0, 0x0b, 0x28, 0x02, - 0xc7, 0x00, 0x93, 0xa0, 0x28, 0xe0, 0x98, 0x3a, - 0x02, 0x0f, 0x28, 0xb0, 0xc8, 0x20, 0xc1, 0x0b, - 0x30, 0x02, 0xcc, 0x00, 0xb0, 0x00, 0x2e, 0x80, - 0x08, 0xed, 0x09, 0x00, 0x33, 0x02, 0x00, 0x12, - 0x04, 0x00, 0x82, 0xc0, 0x20, 0x60, 0x0b, 0x30, - 0x02, 0xf8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x01, 0x1e, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x80, 0x2d, - 0xe0, 0x0b, 0x68, 0x02, 0xf2, 0x00, 0x8c, 0x80, - 0x29, 0x20, 0x8b, 0x68, 0x02, 0xf2, 0x00, 0x94, - 0x80, 0x2f, 0x20, 0x28, 0xc8, 0x8e, 0x12, 0x01, - 0xb5, 0x80, 0x25, 0xe0, 0x0b, 0x78, 0x02, 0xde, - 0x00, 0xb6, 0x80, 0x2d, 0xa0, 0x08, 0x48, 0x02, - 0x16, 0x00, 0x8f, 0x80, 0x21, 0x60, 0x0b, 0x78, - 0x02, 0xc8, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x08, 0x0c, 0x00, 0xf3, 0x00, 0x3c, 0xc0, - 0x0f, 0x30, 0x03, 0xcc, 0x00, 0xf3, 0x00, 0x3c, - 0xc4, 0x0f, 0x20, 0x03, 0xc4, 0x00, 0xc3, 0x00, - 0x30, 0xc2, 0x0f, 0x20, 0x02, 0xc4, 0x00, 0xd3, - 0x00, 0x38, 0xc2, 0x0c, 0x31, 0x03, 0x0c, 0x00, - 0xf3, 0x10, 0x30, 0xc0, 0x0f, 0x30, 0x03, 0xcc, - 0x00, 0xf0, 0x40, 0x3c, 0x80, 0x0c, 0x90, 0x03, - 0x25, 0x00, 0xc2, 0x00, 0x30, 0x42, 0x0f, 0x30, - 0x03, 0xd2, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x1d, 0xbc, 0x00, 0xff, 0x00, 0x2f, 0xc4, - 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x01, 0x7f, - 0xc0, 0x0f, 0xe0, 0x03, 0xf0, 0x00, 0xfc, 0x00, - 0x3f, 0x20, 0x0f, 0xe0, 0x03, 0xf0, 0x04, 0xec, - 0x00, 0x3d, 0x00, 0x0f, 0x40, 0x43, 0xf2, 0x00, - 0xf7, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, - 0x40, 0xfe, 0x00, 0x3f, 0x84, 0x0f, 0xd0, 0x0b, - 0xf4, 0x40, 0xf7, 0x00, 0xbf, 0x40, 0x0f, 0xf0, - 0x03, 0xd0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x05, 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc4, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xa0, 0x03, 0xed, 0x09, 0x00, 0x34, - 0x02, 0xe4, 0x00, 0xf3, 0x00, 0x32, 0xc0, 0x0f, - 0xa0, 0x01, 0xe4, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x23, 0xec, 0x00, 0xb8, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xf9, 0x00, - 0x3e, 0xc0, 0x0f, 0xa0, 0x03, 0xac, 0x08, 0xca, - 0x00, 0x32, 0x80, 0x0c, 0xf0, 0x03, 0xea, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x48, 0x11, 0x9c, - 0x00, 0xb7, 0x00, 0x2d, 0xc8, 0x0b, 0x70, 0x02, - 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, 0x60, - 0x02, 0xd0, 0x00, 0xb4, 0x00, 0x35, 0x00, 0x0b, - 0x60, 0x02, 0xd0, 0x00, 0xb4, 0x00, 0x2d, 0x00, - 0x0b, 0x40, 0x02, 0xd0, 0x00, 0xb5, 0x00, 0x2d, - 0xc0, 0x0b, 0x70, 0x02, 0xdc, 0x00, 0x36, 0x00, - 0x2d, 0xc0, 0x8b, 0xe0, 0x02, 0x3c, 0x00, 0xc7, - 0x00, 0x29, 0x80, 0x0a, 0x74, 0x02, 0xd2, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x9e, - 0x00, 0xb7, 0x80, 0x2d, 0xe8, 0x0b, 0x78, 0x02, - 0xde, 0x00, 0xb7, 0x80, 0x2d, 0xe0, 0x8b, 0x68, - 0x02, 0xd6, 0x00, 0xbf, 0x80, 0x21, 0xe0, 0x0b, - 0x68, 0x02, 0x56, 0x00, 0xb7, 0x80, 0x2d, 0xe0, - 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb7, 0x81, 0x2d, - 0xe1, 0x0b, 0x78, 0x02, 0xde, 0x00, 0xb5, 0xc0, - 0x2d, 0xe0, 0x0b, 0x78, 0x02, 0x9e, 0x00, 0x96, - 0x80, 0x24, 0xe0, 0x08, 0x7a, 0x02, 0xf0, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0x14, 0xcc, - 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, - 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, 0x20, - 0x02, 0xc0, 0x00, 0xb0, 0x00, 0x24, 0x00, 0x0b, - 0x20, 0x02, 0xc0, 0x00, 0xb0, 0x00, 0x2c, 0x00, - 0x0b, 0x00, 0x02, 0xc0, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xbb, 0x40, - 0x2e, 0xc0, 0x0b, 0xb1, 0x02, 0x0c, 0x40, 0xed, - 0x09, 0x00, 0x35, 0x02, 0x83, 0x00, 0x2c, 0xe0, - 0x0a, 0x30, 0x02, 0xd2, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xe8, 0x15, 0xa8, 0x00, 0xfa, 0x00, - 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xe8, 0x00, 0xfa, - 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x03, 0xe8, 0x00, - 0xf2, 0x00, 0x32, 0x80, 0x0f, 0x20, 0x03, 0x68, - 0x00, 0xfa, 0x00, 0x3e, 0x80, 0x0f, 0xa0, 0x23, - 0xe8, 0x00, 0xfe, 0x44, 0x5e, 0x80, 0x0f, 0xa0, - 0x03, 0xe8, 0x00, 0xfe, 0x50, 0x3e, 0x90, 0x0f, - 0xa8, 0x03, 0xaa, 0x02, 0xda, 0x00, 0x37, 0xb4, - 0x0c, 0xa0, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x48, 0x00, 0xe0, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xf0, 0x00, - 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0x84, 0x03, 0xf1, - 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x87, 0xc4, 0x43, - 0xf0, 0x00, 0xf8, 0xc0, 0x3e, 0x00, 0x0f, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x02, 0x0f, - 0x80, 0x23, 0xe0, 0x02, 0xe8, 0x00, 0x3a, 0x04, - 0x0f, 0x80, 0x03, 0xd2, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x10, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x8f, 0x90, 0x03, 0xe4, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0x24, 0x00, - 0xc9, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x03, 0x65, - 0x00, 0xf9, 0x90, 0x3e, 0x40, 0x07, 0x90, 0x03, - 0xe6, 0x80, 0xf9, 0x40, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x08, 0xf9, 0x00, 0x32, 0x40, 0x8d, - 0x90, 0x03, 0x24, 0x00, 0xc9, 0xa0, 0x30, 0x40, - 0x08, 0x10, 0x03, 0x02, 0x04, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x04, 0x64, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, - 0x00, 0x2e, 0x40, 0x0b, 0x10, 0x02, 0x84, 0x02, - 0x89, 0x00, 0xed, 0x09, 0x00, 0x36, 0x02, 0x2a, - 0x40, 0x8b, 0x96, 0x02, 0x27, 0x00, 0xb9, 0xa0, - 0x2e, 0x64, 0x0b, 0x9c, 0x02, 0xe4, 0x00, 0xb9, - 0x40, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x2a, 0x50, 0x08, 0x94, 0x02, 0x25, - 0x00, 0x81, 0x02, 0x22, 0x40, 0x08, 0x90, 0x03, - 0x60, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x05, 0x24, 0x00, 0xb9, 0x00, 0x2e, 0x40, 0x0b, - 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, 0x2e, 0x40, - 0x0b, 0x90, 0x02, 0x24, 0x00, 0x8d, 0x00, 0x23, - 0x40, 0x0b, 0x90, 0x02, 0x64, 0x00, 0xbd, 0x00, - 0x2f, 0x50, 0x0b, 0xdc, 0x42, 0xf4, 0x04, 0xbb, - 0x08, 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x22, 0x40, 0x09, 0xd0, 0x02, 0x14, - 0x00, 0x8d, 0x00, 0x22, 0x40, 0x0a, 0x90, 0x02, - 0x06, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x04, 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x0b, - 0x10, 0x02, 0xc4, 0x00, 0xb1, 0x00, 0x2c, 0x40, - 0x0b, 0x10, 0x02, 0x94, 0x00, 0x85, 0x00, 0x29, - 0x40, 0x0b, 0x90, 0x02, 0x14, 0x00, 0xb5, 0x00, - 0x2d, 0x40, 0x0b, 0x50, 0x02, 0xd4, 0x00, 0xb1, - 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, 0x00, - 0xb1, 0x40, 0x29, 0x70, 0x08, 0x5c, 0x0a, 0x17, - 0x03, 0x8d, 0x00, 0x60, 0x40, 0x0a, 0x10, 0x02, - 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, - 0x0d, 0x60, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, - 0x0f, 0x80, 0x03, 0x20, 0x00, 0xc8, 0x00, 0x33, - 0x00, 0x0f, 0x80, 0x03, 0x68, 0x00, 0xf8, 0x00, - 0x3e, 0x00, 0x0f, 0x80, 0x03, 0xf0, 0x00, 0xf8, - 0x00, 0x1e, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, - 0xf8, 0x00, 0x22, 0x00, 0x0d, 0x80, 0x03, 0x20, - 0x00, 0xcc, 0x02, 0x32, 0x00, 0xed, 0x09, 0x00, - 0x37, 0x02, 0x2e, 0x80, 0x03, 0x2e, 0x03, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x98, 0x1d, 0xe4, 0x00, - 0xf9, 0x01, 0x3e, 0x50, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, - 0x90, 0x03, 0xe4, 0x00, 0xfd, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x23, 0xe4, 0x00, 0xff, 0x00, 0x3e, - 0x40, 0x07, 0x90, 0x23, 0xe4, 0x02, 0xf1, 0x00, - 0xbf, 0x50, 0x0d, 0x94, 0x03, 0xe6, 0x06, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xe4, 0x00, - 0xf9, 0x00, 0x3e, 0x4a, 0x0f, 0x90, 0x03, 0xe4, - 0x00, 0xf9, 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x00, 0x3c, 0x40, 0x0e, 0x50, - 0x03, 0xd4, 0x00, 0xf5, 0x00, 0x31, 0x40, 0x0f, - 0xd0, 0x13, 0xf4, 0x08, 0xcd, 0x00, 0x3e, 0x40, - 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xf1, 0x00, 0x33, - 0x50, 0x0c, 0xd0, 0x03, 0xf5, 0x00, 0xc5, 0x00, - 0x3f, 0x4a, 0x0c, 0x90, 0x03, 0x06, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0xe0, 0x00, - 0xb8, 0x00, 0x2e, 0x10, 0x8b, 0x80, 0x02, 0xe0, - 0x00, 0xb8, 0x00, 0x2e, 0x00, 0x0b, 0x80, 0x02, - 0xe0, 0x00, 0xe8, 0x00, 0x2f, 0x00, 0x08, 0x80, - 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x22, 0x00, 0x8b, - 0x80, 0x02, 0xe0, 0x00, 0x88, 0x00, 0x26, 0x00, - 0x0b, 0x80, 0x02, 0xe0, 0x00, 0xb8, 0x00, 0x2a, - 0x08, 0x09, 0x02, 0x02, 0xe0, 0x00, 0x88, 0x00, - 0x2e, 0x10, 0x08, 0x84, 0x02, 0x8e, 0x04, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0xc4, 0x00, - 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, 0xc4, - 0x00, 0xb1, 0x00, 0x2c, 0x40, 0x0b, 0x10, 0x02, - 0x54, 0x00, 0xb5, 0x00, 0x2d, 0x40, 0x0a, 0x10, - 0xed, 0x09, 0x00, 0x38, 0x02, 0x02, 0xc4, 0x00, - 0xb9, 0x02, 0xa0, 0x40, 0x0b, 0x10, 0x02, 0xe4, - 0x02, 0x91, 0x02, 0x2c, 0x40, 0x0b, 0x10, 0x02, - 0xc4, 0x08, 0xb9, 0x28, 0x20, 0x40, 0x29, 0x10, - 0x82, 0xc4, 0x80, 0x81, 0x03, 0x2c, 0x40, 0x88, - 0x14, 0x02, 0x02, 0x01, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x15, 0xa4, 0x00, 0xb9, 0x00, 0x2e, - 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xb9, 0x00, - 0x2e, 0x40, 0x0b, 0x90, 0x02, 0xe4, 0x00, 0xad, - 0x00, 0x2f, 0x40, 0x08, 0x90, 0x02, 0xe4, 0x00, - 0xb9, 0x00, 0x02, 0x40, 0x0b, 0x90, 0x02, 0xe4, - 0x00, 0x99, 0x50, 0x2e, 0x40, 0x0b, 0x90, 0x02, - 0xe4, 0x08, 0xb9, 0x00, 0x2a, 0x40, 0x09, 0x94, - 0x02, 0xe4, 0x02, 0x89, 0x00, 0x2e, 0x50, 0x08, - 0x90, 0x02, 0x86, 0x04, 0x60, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x11, 0xe4, 0x00, 0xf9, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x13, 0xe4, 0x00, 0xf9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0x64, 0x00, 0xf9, - 0x00, 0x3e, 0x40, 0x0e, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x00, 0x32, 0x40, 0x0f, 0x90, 0x03, 0xc4, - 0x00, 0xd9, 0x80, 0x3e, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0xd0, 0x32, 0x40, 0x0c, 0x90, - 0x03, 0xe4, 0x00, 0xc9, 0x00, 0x3e, 0x40, 0x2c, - 0x90, 0x03, 0x28, 0x04, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x01, 0xa4, 0x00, 0xf9, 0x00, 0x3e, - 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xb9, 0x00, - 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, 0xe9, - 0x00, 0x3e, 0x40, 0x0f, 0x90, 0x03, 0xe4, 0x00, - 0xf9, 0x02, 0x3e, 0x40, 0x0f, 0x90, 0x83, 0xe4, - 0x00, 0xe9, 0x80, 0x36, 0x40, 0x0f, 0x90, 0x03, - 0xe4, 0x00, 0xf9, 0x80, 0x3e, 0x40, 0x0e, 0x90, - 0x03, 0xe4, 0x00, 0xf9, 0x00, 0x3c, 0x40, 0x0f, - 0x10, 0x03, 0xca, 0xed, 0x09, 0x00, 0x39, 0x02, - 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0x10, - 0xa0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0c, 0x80, - 0x03, 0xe0, 0x00, 0xf8, 0x00, 0x3e, 0x00, 0x0f, - 0x80, 0x03, 0xf0, 0x00, 0xcc, 0x00, 0x3f, 0x00, - 0x0c, 0x88, 0x03, 0x22, 0x00, 0xc8, 0x20, 0xb2, - 0x00, 0x8c, 0x81, 0x03, 0xe2, 0x04, 0xf8, 0x80, - 0x02, 0x00, 0x0f, 0x80, 0x03, 0xe0, 0x00, 0xf8, - 0x00, 0x32, 0x08, 0x0f, 0x80, 0x03, 0x20, 0x00, - 0xc8, 0x80, 0x32, 0x00, 0x2c, 0x80, 0x03, 0xca, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x28, 0x00, 0xba, 0x00, 0x2e, 0x80, 0x0a, 0xa0, - 0x03, 0xe8, 0x00, 0xba, 0x00, 0x2e, 0x80, 0x0b, - 0xa0, 0x02, 0xe8, 0x00, 0x8a, 0x00, 0x2c, 0x80, - 0x0a, 0xe4, 0x07, 0x7b, 0x00, 0xd6, 0x80, 0x23, - 0xa0, 0x08, 0xe8, 0x02, 0x7b, 0x00, 0xbe, 0x40, - 0x36, 0x80, 0x0b, 0xa0, 0x52, 0xe8, 0x00, 0xb2, - 0x00, 0x23, 0xb0, 0x0b, 0xe0, 0x02, 0x38, 0x00, - 0x8e, 0x40, 0x36, 0xa0, 0x08, 0xa0, 0x02, 0xca, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0x05, - 0x4c, 0x01, 0xb3, 0x00, 0x2c, 0xc0, 0x08, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, 0x0b, - 0x20, 0x02, 0xc0, 0x00, 0x80, 0x00, 0x2c, 0x00, - 0x0a, 0x31, 0x12, 0x0e, 0x00, 0x83, 0xc0, 0x28, - 0x28, 0x08, 0x0c, 0x22, 0xce, 0x00, 0xb3, 0x00, - 0x20, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x22, 0xc0, 0x9b, 0x30, 0x02, 0x2c, 0x00, - 0x83, 0x82, 0x20, 0xc0, 0x08, 0x30, 0x02, 0xca, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x01, - 0x1c, 0x00, 0xb7, 0x00, 0x2c, 0xe0, 0x0a, 0x70, - 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0b, - 0x60, 0x02, 0xf6, 0x00, 0x87, 0x00, 0x2d, 0xc0, - 0x0a, 0x58, 0x02, 0x5a, 0x20, 0x96, 0xed, 0x09, - 0x00, 0x3a, 0x02, 0x08, 0x2b, 0xf0, 0x28, 0x70, - 0x02, 0xdd, 0x00, 0xbf, 0x80, 0x25, 0xc0, 0x0b, - 0x70, 0x02, 0xdc, 0x00, 0xbf, 0x00, 0x21, 0x50, - 0x0b, 0x58, 0x02, 0x14, 0x02, 0x85, 0x88, 0x24, - 0xc2, 0x08, 0x70, 0x02, 0xe8, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x00, 0xa8, 0x08, 0x1e, 0x00, 0xf7, - 0x80, 0x3d, 0xe0, 0x0c, 0x78, 0x03, 0xde, 0x00, - 0xf7, 0x80, 0x2d, 0xe0, 0x0b, 0x68, 0x13, 0xd2, - 0x02, 0xc4, 0x80, 0x3d, 0x20, 0x0e, 0x78, 0x02, - 0x1e, 0x00, 0xc7, 0x82, 0x19, 0xe0, 0x0c, 0x78, - 0x03, 0xde, 0x00, 0xf7, 0x82, 0x31, 0xe0, 0x0f, - 0x78, 0x02, 0xde, 0x00, 0xf7, 0xa0, 0x31, 0xa0, - 0x0f, 0x68, 0x03, 0x3a, 0x00, 0xc7, 0x80, 0x31, - 0xe0, 0x0c, 0x78, 0x03, 0xea, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x1d, 0xac, 0x00, 0xfb, - 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, 0xac, 0x00, - 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xa0, 0x03, 0xc4, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0x90, 0x03, - 0xe8, 0x00, 0xf8, 0x00, 0x36, 0x80, 0x0b, 0xb0, - 0x03, 0x6c, 0x00, 0xf3, 0x00, 0x3e, 0xc0, 0x0f, - 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x80, 0xbe, 0x00, - 0x0f, 0x80, 0x0b, 0xe0, 0x00, 0xbb, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xc2, 0x06, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0x00, 0xff, - 0x80, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0xfe, 0x00, - 0xff, 0x80, 0x3f, 0xe0, 0x0f, 0x68, 0x03, 0x32, - 0x00, 0xfc, 0x80, 0x3b, 0x20, 0x0c, 0xe8, 0x03, - 0xfa, 0x00, 0xf5, 0x80, 0x33, 0xe0, 0x0f, 0xf8, - 0x03, 0xde, 0x00, 0xcf, 0x80, 0x3f, 0xe0, 0x0f, - 0xf8, 0x03, 0xfe, 0x00, 0xff, 0x88, 0x3f, 0xe0, - 0x0e, 0xf8, 0x03, 0x3e, 0x08, 0xc7, 0x80, 0x33, - 0xe0, 0x0c, 0xf8, 0x03, 0xc0, 0x00, 0x70, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x3b, 0x02, 0x00, 0x00, - 0xa8, 0x11, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x06, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0e, 0x60, 0x01, 0x54, 0x00, 0xb7, 0x00, - 0x21, 0xc0, 0x08, 0x62, 0x02, 0xd8, 0x00, 0xb4, - 0x00, 0x39, 0x40, 0x0e, 0x64, 0x02, 0xdc, 0x00, - 0x87, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, - 0x04, 0xb7, 0x08, 0x2d, 0xc0, 0x08, 0xd4, 0x02, - 0x35, 0x00, 0xa7, 0x00, 0x21, 0xc0, 0x0a, 0x70, - 0x02, 0xea, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9c, 0x00, 0xb7, 0x00, 0x2d, 0xc0, - 0x0b, 0x70, 0x02, 0xdc, 0x00, 0xb7, 0x00, 0x2d, - 0xc0, 0x0b, 0xe0, 0x02, 0x10, 0x00, 0xb4, 0x00, - 0x2b, 0x20, 0x08, 0x70, 0x22, 0xd8, 0x00, 0xb4, - 0x00, 0x25, 0xc0, 0x0b, 0x50, 0x02, 0xfc, 0x00, - 0x87, 0x00, 0x2d, 0xc0, 0x0b, 0x70, 0x02, 0xdc, - 0x00, 0xb7, 0x00, 0x2d, 0xc0, 0x0a, 0x60, 0x02, - 0x18, 0x00, 0x87, 0x00, 0x20, 0xc0, 0x08, 0x70, - 0x02, 0xc0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x14, 0xcc, 0x00, 0xb3, 0x00, 0x2c, 0xc0, - 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, 0x00, 0x2c, - 0xc0, 0x8b, 0x20, 0x02, 0x45, 0x20, 0xb3, 0x10, - 0x20, 0xc2, 0x08, 0x30, 0x02, 0xc1, 0x80, 0x30, - 0xf0, 0x28, 0xf0, 0x0a, 0x3e, 0x02, 0xce, 0x60, - 0x82, 0x00, 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, - 0x00, 0xb3, 0xe0, 0x2c, 0xc0, 0x08, 0x00, 0x02, - 0x00, 0x00, 0xa3, 0x00, 0x20, 0xc0, 0x0a, 0x30, - 0x02, 0xc8, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xa8, 0x15, 0xac, 0x00, 0xfb, 0x00, 0x3e, 0xc0, - 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3e, - 0xc0, 0x0f, 0xa0, 0x03, 0x01, 0x08, 0xf8, 0x50, - 0x38, 0x20, 0x0c, 0xb0, 0x03, 0xcc, 0x00, 0x7b, - 0x00, 0x36, 0xc2, 0x0f, 0xed, 0x09, 0x00, 0x3c, - 0x02, 0x36, 0x03, 0xee, 0x00, 0x4b, 0x00, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xff, 0x01, - 0x3e, 0xc0, 0x8e, 0xb0, 0x03, 0x2c, 0x00, 0xcb, - 0x00, 0x30, 0x40, 0x0c, 0xb0, 0x03, 0xea, 0x04, - 0x60, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xec, - 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0f, 0xb0, 0x03, - 0xec, 0x00, 0xfb, 0x00, 0x3e, 0xc0, 0x0e, 0xa0, - 0x03, 0xe4, 0x00, 0xfb, 0x00, 0x3e, 0xc4, 0x2f, - 0xb0, 0x07, 0xe9, 0x08, 0xf8, 0x40, 0x3e, 0xd2, - 0x0f, 0x90, 0x01, 0xed, 0x00, 0xfb, 0x40, 0x3e, - 0xc0, 0x0f, 0xb0, 0x03, 0xec, 0x00, 0xfb, 0x00, - 0x3e, 0x41, 0x0f, 0xb0, 0x0b, 0xec, 0x00, 0xfb, - 0x20, 0xbe, 0xc0, 0x0f, 0xb0, 0x03, 0xe0, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xfc, - 0x00, 0xff, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xfc, 0x00, 0xff, 0x00, 0x3b, 0xc0, 0x0f, 0xe0, - 0x03, 0xf0, 0x00, 0xcc, 0x00, 0x3f, 0x00, 0x0c, - 0xf1, 0x03, 0xf8, 0x0c, 0xcf, 0x44, 0x33, 0x48, - 0x0c, 0xe8, 0x03, 0x34, 0x00, 0xcf, 0x88, 0x33, - 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0x80, 0x0c, 0xf0, 0x03, 0x3c, 0x00, 0xcf, - 0x90, 0x2f, 0x40, 0x0c, 0x70, 0x03, 0x00, 0x44, - 0x30, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x6c, - 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x8b, 0xb0, 0x02, - 0xec, 0x00, 0xbb, 0x00, 0x2e, 0xc0, 0x0b, 0xa0, - 0x02, 0xe4, 0x02, 0x8b, 0x00, 0x2e, 0xc0, 0x08, - 0xb4, 0x82, 0xe9, 0x80, 0xa0, 0xe0, 0x28, 0xd0, - 0x0d, 0xbd, 0x02, 0x0c, 0x80, 0xd1, 0x80, 0x36, - 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, 0x00, - 0x2e, 0x00, 0x28, 0xbc, 0x02, 0x2f, 0x02, 0x8b, - 0x48, 0x2e, 0xe4, 0x8a, 0xb0, 0x02, 0x20, 0x40, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x05, 0xed, - 0x09, 0x00, 0x3d, 0x02, 0x2c, 0x00, 0xbb, 0x00, - 0x2e, 0xc0, 0x0b, 0xb0, 0x02, 0xec, 0x00, 0xbb, - 0x00, 0x2e, 0xc0, 0x0b, 0xa0, 0x02, 0xe0, 0x01, - 0x88, 0x00, 0x2e, 0x00, 0x08, 0xb0, 0x02, 0xe8, - 0x80, 0xa8, 0x00, 0x22, 0x90, 0x88, 0xb0, 0x2a, - 0x2e, 0x00, 0x8b, 0x50, 0x22, 0xc0, 0x0b, 0xb0, - 0x02, 0xec, 0x00, 0xbb, 0x00, 0x2c, 0xc0, 0x08, - 0x31, 0x02, 0x0c, 0x40, 0x8b, 0x00, 0x2e, 0xc0, - 0x08, 0xb0, 0x02, 0x20, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x0c, 0x00, 0xb3, 0x00, - 0x2c, 0xc0, 0x0b, 0x30, 0x02, 0xcc, 0x00, 0xb3, - 0x00, 0x2c, 0xc0, 0x0b, 0x20, 0x42, 0xc4, 0x01, - 0x83, 0x00, 0x2e, 0xc0, 0x08, 0x10, 0x02, 0xe8, - 0x00, 0xa8, 0x00, 0x28, 0xc0, 0x09, 0x30, 0x00, - 0x08, 0x00, 0x93, 0x00, 0x24, 0xc0, 0x0b, 0x30, - 0x02, 0xcc, 0x00, 0xb3, 0x02, 0x2c, 0xc0, 0x08, - 0x30, 0x02, 0x0c, 0x00, 0x82, 0x00, 0x2c, 0xc0, - 0x08, 0x30, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x00, 0xfb, 0x00, - 0x3e, 0xc0, 0x0f, 0xb0, 0x43, 0xec, 0x00, 0xfb, - 0x00, 0x3a, 0xc0, 0x0f, 0xa0, 0x03, 0xe0, 0x00, - 0x88, 0x00, 0x3e, 0x00, 0x08, 0xa0, 0x02, 0xe0, - 0x00, 0xe8, 0x00, 0x32, 0xc0, 0x0c, 0xb0, 0x03, - 0x2c, 0x00, 0xca, 0x00, 0x32, 0xc0, 0x0f, 0xb0, - 0x03, 0xec, 0x00, 0xfb, 0x00, 0x3c, 0xc0, 0x0c, - 0xb0, 0x03, 0x2c, 0x04, 0xcb, 0x00, 0x3e, 0xc0, - 0x0c, 0xb0, 0x0b, 0x00, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0x1d, 0xfc, 0x00, 0xff, 0x00, - 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, 0xff, - 0x00, 0x3f, 0xc0, 0x0f, 0xe0, 0x03, 0xf4, 0x00, - 0xf7, 0x00, 0x3d, 0xc0, 0x2f, 0xc0, 0x03, 0xf0, - 0x00, 0xfc, 0x00, 0x3f, 0x00, 0x0f, 0xc0, 0x03, - 0xf8, 0x00, 0xed, 0x09, 0x00, 0x3e, 0x02, 0xfc, - 0x02, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, 0xfc, 0x00, - 0xff, 0x00, 0x0f, 0xc0, 0x0f, 0xf0, 0x01, 0xfc, - 0x00, 0xfe, 0x00, 0x3f, 0xc0, 0x0f, 0xf0, 0x03, - 0xe8, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc5, 0x41, 0x03, 0x70, 0x40, 0xdc, 0x10, 0x37, - 0x02, 0x05, 0xc1, 0x03, 0x71, 0x40, 0xdc, 0x10, - 0x37, 0x00, 0x05, 0xc5, 0x01, 0x70, 0x40, 0xdc, - 0x08, 0x37, 0x04, 0x05, 0xc0, 0x23, 0x70, 0x44, - 0x9c, 0x10, 0x07, 0x04, 0x05, 0xc1, 0x03, 0x70, - 0x40, 0xdc, 0x10, 0x13, 0x04, 0x11, 0xc1, 0x02, - 0x70, 0x40, 0xdc, 0x10, 0x37, 0x00, 0x9d, 0xc1, - 0x03, 0x70, 0x40, 0xdc, 0x10, 0x37, 0x04, 0x0d, - 0xc0, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x45, 0x44, 0x05, 0x71, 0x01, 0x5c, 0x40, 0x57, - 0x12, 0x05, 0xc4, 0x01, 0x72, 0x01, 0x0c, 0x40, - 0x57, 0x10, 0xc5, 0xc1, 0x44, 0x21, 0x01, 0x5c, - 0x40, 0x57, 0x10, 0x05, 0xc4, 0x05, 0x71, 0x01, - 0x5c, 0x40, 0x17, 0x10, 0x15, 0xc4, 0x04, 0x31, - 0x01, 0x5c, 0x40, 0x13, 0x10, 0x0d, 0xc4, 0x05, - 0x71, 0x01, 0x5c, 0x40, 0x57, 0x10, 0x15, 0xc4, - 0x05, 0x71, 0x01, 0x5c, 0x40, 0x55, 0x10, 0x15, - 0xc0, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x03, 0x01, 0x20, 0x80, 0x48, 0x20, 0x12, - 0x0a, 0x04, 0x82, 0x01, 0x22, 0x80, 0x5c, 0x20, - 0x12, 0x08, 0x04, 0x82, 0x41, 0x30, 0x80, 0x48, - 0x20, 0x12, 0x08, 0x04, 0x82, 0x01, 0x20, 0x80, - 0x48, 0x20, 0x12, 0x08, 0x04, 0x82, 0x01, 0x70, - 0x80, 0x48, 0x20, 0x12, 0x08, 0x04, 0x82, 0x01, - 0x20, 0x80, 0x48, 0x20, 0x12, 0x08, 0x04, 0x82, - 0x01, 0x20, 0x80, 0x48, 0x20, 0x12, 0x08, 0x04, - 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x01, 0x60, 0x00, 0xed, 0x09, 0x00, - 0x3f, 0x02, 0x58, 0x00, 0x16, 0x00, 0x05, 0x80, - 0x01, 0x60, 0x09, 0x58, 0x00, 0x16, 0x00, 0x05, - 0x80, 0xa5, 0x60, 0x00, 0x58, 0x00, 0x06, 0x00, - 0x05, 0x80, 0x00, 0x60, 0x00, 0x58, 0x00, 0x16, - 0x00, 0x95, 0x80, 0x61, 0x60, 0x00, 0x58, 0x01, - 0x16, 0x00, 0x05, 0x80, 0x01, 0x60, 0x00, 0x58, - 0x00, 0x16, 0x00, 0x05, 0x80, 0x01, 0x60, 0x00, - 0x58, 0x00, 0x16, 0x00, 0x05, 0x80, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x48, 0x45, - 0x72, 0x01, 0x1c, 0x80, 0x57, 0x25, 0x15, 0xc8, - 0x04, 0x70, 0x21, 0x5c, 0x80, 0x57, 0x71, 0x94, - 0xc8, 0x05, 0x72, 0x01, 0x5c, 0x85, 0x57, 0x60, - 0x14, 0xd8, 0x65, 0x32, 0x01, 0x1c, 0x80, 0x47, - 0x20, 0x11, 0xc8, 0x05, 0x72, 0x01, 0x1c, 0x80, - 0x57, 0x20, 0x05, 0xc8, 0x05, 0x56, 0x09, 0x4c, - 0x80, 0x57, 0x21, 0x05, 0x48, 0x05, 0x72, 0x01, - 0x5c, 0x80, 0x57, 0x20, 0x15, 0xc0, 0x11, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x40, 0x00, - 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, - 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x01, 0x00, - 0x80, 0x00, 0x60, 0x10, 0x18, 0x00, 0x06, 0x01, - 0x00, 0x80, 0x40, 0x20, 0x00, 0x10, 0x00, 0x06, - 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, - 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x10, 0x08, - 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, - 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x31, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x48, 0x04, - 0x22, 0x01, 0x08, 0x80, 0x42, 0x20, 0x10, 0x88, - 0x04, 0x20, 0x81, 0x08, 0x80, 0x42, 0x20, 0x11, - 0x82, 0x04, 0x22, 0x01, 0x08, 0x80, 0x42, 0x20, - 0x11, 0x88, 0x04, 0x62, 0x01, 0x08, 0x80, 0x42, - 0x00, 0x10, 0x88, 0x04, 0x22, 0x01, 0x08, 0x80, - 0xed, 0x09, 0x00, 0x40, 0x02, 0x42, 0x20, 0x00, - 0x88, 0x04, 0x20, 0x01, 0x18, 0x80, 0x42, 0x20, - 0x00, 0x88, 0x04, 0x22, 0x01, 0x08, 0x80, 0x42, - 0x20, 0x10, 0x80, 0x31, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc1, 0x4a, 0x05, 0x42, 0x81, 0x50, - 0xa0, 0x54, 0x3c, 0x15, 0x0a, 0x05, 0x40, 0x80, - 0x58, 0xa0, 0x54, 0x2a, 0x15, 0x42, 0x01, 0x42, - 0x81, 0x50, 0xa1, 0x54, 0x28, 0x15, 0x4a, 0x04, - 0x52, 0x85, 0x50, 0xa0, 0x44, 0x08, 0x01, 0x0a, - 0x04, 0x42, 0x81, 0x50, 0xa0, 0x54, 0x28, 0x45, - 0x0a, 0x05, 0x42, 0x81, 0x54, 0xa0, 0x54, 0x28, - 0x15, 0x0a, 0x05, 0x42, 0x81, 0x50, 0xa0, 0x54, - 0x28, 0x15, 0x00, 0x31, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x84, 0x0d, 0x01, 0x53, 0x00, 0x54, - 0xc0, 0x15, 0x34, 0x04, 0x4c, 0x01, 0x53, 0x00, - 0x40, 0xc0, 0x15, 0x66, 0x04, 0x0c, 0x01, 0x57, - 0x00, 0x54, 0xd0, 0x15, 0x70, 0x05, 0x5d, 0x01, - 0x53, 0x00, 0x54, 0xc0, 0x15, 0x30, 0x05, 0x4c, - 0x01, 0x71, 0x00, 0x54, 0xc0, 0x15, 0x30, 0x05, - 0x4c, 0x01, 0x57, 0x00, 0x54, 0xc0, 0x15, 0x34, - 0x05, 0x4c, 0x01, 0x53, 0x00, 0x54, 0xc0, 0x15, - 0x30, 0x05, 0x40, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x10, - 0x00, 0x04, 0x10, 0x00, 0x40, 0x00, 0x42, 0x00, - 0x10, 0x00, 0x04, 0x90, 0x40, 0x00, 0x10, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x81, 0x11, 0x20, 0x00, - 0x40, 0x00, 0x10, 0x00, 0x04, 0x20, 0x01, 0x00, - 0x00, 0x40, 0x04, 0x10, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x00, 0x48, 0x00, 0x10, 0x00, 0x04, 0x00, - 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, - 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc5, 0x60, 0x02, 0x08, 0x00, 0x82, - 0x00, 0x20, 0x80, 0xed, 0x09, 0x00, 0x41, 0x02, - 0x18, 0x60, 0x00, 0x08, 0x08, 0x82, 0x00, 0x20, - 0x84, 0x18, 0x28, 0x22, 0x08, 0x00, 0x82, 0x00, - 0x20, 0x80, 0x58, 0x20, 0x02, 0x08, 0x00, 0x82, - 0x00, 0x00, 0x80, 0x88, 0x20, 0x22, 0x0a, 0x00, - 0x82, 0x00, 0x00, 0x80, 0x00, 0x20, 0x02, 0x0a, - 0x00, 0x82, 0x00, 0x20, 0x80, 0x08, 0x20, 0x02, - 0x08, 0x00, 0x82, 0x00, 0x20, 0x80, 0x08, 0x01, - 0x31, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, - 0x40, 0x05, 0x60, 0x01, 0x58, 0x00, 0x56, 0x00, - 0x1d, 0x80, 0x05, 0x60, 0x01, 0x58, 0x00, 0x56, - 0x40, 0x1d, 0x80, 0x07, 0x64, 0x01, 0x58, 0x00, - 0x56, 0x40, 0x15, 0x90, 0x05, 0x60, 0x00, 0x58, - 0x00, 0x76, 0x00, 0x1d, 0x80, 0x05, 0x60, 0x02, - 0x58, 0x00, 0x76, 0x00, 0x3d, 0x80, 0x05, 0x64, - 0x01, 0x58, 0x00, 0x56, 0x00, 0x05, 0x80, 0x05, - 0x60, 0x01, 0x58, 0x00, 0x56, 0x00, 0x15, 0x80, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, - 0x40, 0x03, 0x60, 0x00, 0xd8, 0x00, 0x36, 0x00, - 0x0d, 0x80, 0x03, 0x60, 0x01, 0xdc, 0x00, 0x36, - 0x00, 0x0d, 0x88, 0x03, 0x70, 0x00, 0x58, 0x00, - 0x16, 0x00, 0x0d, 0x80, 0x02, 0x60, 0x00, 0x98, - 0x00, 0x36, 0x20, 0x05, 0x80, 0x03, 0x70, 0x01, - 0xd8, 0x00, 0x36, 0x00, 0x0d, 0x80, 0x01, 0x60, - 0x00, 0xd8, 0x00, 0x36, 0x00, 0x1d, 0x80, 0x03, - 0x60, 0x00, 0xd8, 0x00, 0x36, 0x00, 0x0d, 0x80, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, - 0x42, 0x24, 0x30, 0x81, 0x0c, 0x20, 0x43, 0x08, - 0x90, 0xc2, 0x04, 0x30, 0x80, 0x18, 0x20, 0x43, - 0x08, 0x90, 0xc2, 0x04, 0x60, 0x80, 0x0c, 0x22, - 0x03, 0x08, 0x10, 0xc2, 0x34, 0x30, 0x81, 0x0c, - 0x21, 0x43, 0x0c, 0x10, 0xc2, 0x04, 0x60, 0x81, - 0x04, 0x20, 0x43, 0x08, 0x10, 0xc2, 0xed, 0x09, - 0x00, 0x42, 0x02, 0x00, 0x30, 0xc1, 0x04, 0x20, - 0x43, 0x08, 0x90, 0xc2, 0x04, 0x30, 0x81, 0x0c, - 0x20, 0x43, 0x08, 0x10, 0xc0, 0x31, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x30, - 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, - 0x30, 0x00, 0x08, 0x00, 0x03, 0x01, 0x00, 0xc0, - 0x00, 0x00, 0x11, 0x0c, 0x00, 0x03, 0x01, 0x00, - 0xc0, 0x40, 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, - 0x00, 0xc0, 0x00, 0x20, 0x00, 0x0c, 0x00, 0x03, - 0x00, 0x00, 0xc0, 0x04, 0x30, 0x10, 0x0c, 0x00, - 0x01, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, - 0x00, 0x03, 0x00, 0x00, 0xc0, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, 0x01, 0x30, - 0x80, 0x4c, 0x20, 0x13, 0x08, 0x04, 0xc2, 0x01, - 0x30, 0xc0, 0x4c, 0x20, 0x13, 0x08, 0x04, 0xc3, - 0x05, 0x30, 0x80, 0x4c, 0x20, 0x13, 0x08, 0x04, - 0xc2, 0x01, 0x30, 0x80, 0x4c, 0x20, 0x13, 0x08, - 0x14, 0xc2, 0x01, 0x30, 0x80, 0x4c, 0x20, 0x11, - 0x08, 0x04, 0xc2, 0x01, 0x12, 0xc0, 0x4c, 0x20, - 0x13, 0x08, 0x14, 0xc2, 0x01, 0x30, 0x80, 0x4c, - 0x20, 0x13, 0x08, 0x04, 0xc0, 0x21, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc5, 0x02, 0x05, 0x60, - 0x81, 0x58, 0x20, 0x56, 0x00, 0x15, 0x82, 0x05, - 0x60, 0xc0, 0x58, 0x20, 0x56, 0x04, 0x15, 0x83, - 0x05, 0x60, 0x81, 0x58, 0x00, 0x56, 0x08, 0x15, - 0x81, 0x04, 0x60, 0x81, 0x18, 0x20, 0x56, 0x08, - 0x15, 0x82, 0x04, 0x60, 0x80, 0x18, 0x20, 0x44, - 0x08, 0x11, 0x82, 0x05, 0x60, 0xc1, 0x58, 0x20, - 0x56, 0x00, 0x05, 0x82, 0x05, 0x60, 0x81, 0x58, - 0x20, 0x56, 0x08, 0x15, 0x80, 0x31, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xc5, 0x02, 0x00, 0x20, - 0x80, 0x08, 0x20, 0x02, 0x08, 0x00, 0x82, 0x00, - 0x20, 0xed, 0x09, 0x00, 0x43, 0x02, 0x80, 0x0c, - 0x20, 0x02, 0x08, 0x00, 0x82, 0x00, 0x30, 0x80, - 0x08, 0x20, 0x02, 0x08, 0x00, 0x82, 0x00, 0x20, - 0x80, 0x08, 0x20, 0x02, 0x08, 0x00, 0xc2, 0x00, - 0x20, 0x80, 0x08, 0x20, 0x02, 0x08, 0x00, 0x82, - 0x00, 0x20, 0x80, 0x08, 0x20, 0x02, 0x08, 0x10, - 0x82, 0x00, 0x20, 0x80, 0x08, 0x20, 0x02, 0x08, - 0x00, 0x80, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x45, 0x52, 0x04, 0x60, 0x81, 0x18, 0x20, - 0x46, 0x48, 0x11, 0x82, 0x04, 0x60, 0x80, 0x0c, - 0x20, 0x46, 0x4c, 0x11, 0x82, 0x04, 0x30, 0x81, - 0x19, 0x20, 0x46, 0x08, 0x11, 0x93, 0x04, 0x60, - 0x81, 0x18, 0x20, 0x46, 0x0c, 0x10, 0xc2, 0x04, - 0x60, 0x80, 0x18, 0x20, 0x46, 0x08, 0x11, 0x82, - 0x04, 0x60, 0xc1, 0x18, 0x20, 0x46, 0x48, 0x11, - 0x82, 0x04, 0x60, 0x81, 0x18, 0x20, 0x46, 0x08, - 0x11, 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc5, 0x60, 0x05, 0x58, 0x01, 0x56, 0x00, - 0x55, 0x80, 0x15, 0x60, 0x05, 0x58, 0x00, 0x46, - 0x00, 0x55, 0x80, 0x15, 0x60, 0x01, 0x18, 0x01, - 0x56, 0x00, 0x55, 0x80, 0x55, 0x60, 0x04, 0x58, - 0x01, 0x56, 0x00, 0x55, 0x80, 0x04, 0x60, 0x14, - 0x58, 0x01, 0x56, 0x00, 0x55, 0x80, 0x15, 0x60, - 0x05, 0x58, 0x01, 0x56, 0x00, 0x55, 0x80, 0x05, - 0x60, 0x05, 0x58, 0x01, 0x56, 0x00, 0x55, 0x80, - 0x15, 0x40, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x26, 0x01, 0x41, 0x80, 0x50, 0x60, - 0x14, 0x98, 0x05, 0x06, 0x01, 0x41, 0x81, 0x50, - 0x60, 0x04, 0x98, 0x01, 0x46, 0x01, 0x41, 0x80, - 0x52, 0x60, 0x14, 0x18, 0x05, 0x66, 0x01, 0x51, - 0x80, 0x50, 0x60, 0x14, 0x18, 0x05, 0x06, 0x01, - 0x41, 0x80, 0x50, 0x60, 0x04, 0x18, 0x05, 0x06, - 0x01, 0x41, 0x80, 0x54, 0xed, 0x09, 0x00, 0x44, - 0x02, 0x60, 0x04, 0x98, 0x01, 0x06, 0x01, 0x41, - 0x80, 0x50, 0x60, 0x14, 0x18, 0x05, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x48, 0x04, - 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x48, - 0x00, 0x03, 0x01, 0x00, 0x80, 0x01, 0x20, 0x10, - 0x28, 0x44, 0x12, 0x00, 0x00, 0x80, 0x40, 0x20, - 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x00, - 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, - 0x00, 0x20, 0x10, 0x48, 0x04, 0x02, 0x01, 0x00, - 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x46, - 0x03, 0x51, 0x80, 0xd4, 0x60, 0x35, 0x18, 0x0d, - 0x46, 0x03, 0x51, 0x91, 0xd4, 0x60, 0x35, 0x18, - 0x08, 0x46, 0x43, 0x51, 0x80, 0x44, 0x60, 0x75, - 0x18, 0x08, 0x46, 0x02, 0x11, 0x80, 0xd4, 0x60, - 0x35, 0x19, 0x0d, 0x46, 0x43, 0x51, 0x80, 0xc4, - 0x60, 0x35, 0x18, 0x0d, 0x46, 0x01, 0x51, 0x80, - 0x84, 0x60, 0x35, 0x18, 0x0d, 0x46, 0x03, 0x51, - 0x80, 0xd4, 0x60, 0x35, 0x18, 0x0d, 0x40, 0x31, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x42, - 0x25, 0x71, 0x81, 0x5c, 0x60, 0x57, 0x18, 0x95, - 0xc6, 0x05, 0x73, 0x01, 0x5c, 0x60, 0x57, 0x38, - 0x95, 0xcc, 0x05, 0x71, 0x81, 0x5c, 0x62, 0x77, - 0x38, 0x04, 0xc6, 0x25, 0x71, 0x81, 0x5c, 0x60, - 0x57, 0x18, 0x1d, 0xc4, 0x05, 0x71, 0x80, 0x5c, - 0x60, 0x57, 0x18, 0x15, 0xc6, 0x05, 0x71, 0x81, - 0x5c, 0x60, 0x57, 0x18, 0x95, 0xc6, 0x05, 0x71, - 0x81, 0x5c, 0x60, 0x57, 0x18, 0x15, 0xc0, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x46, - 0x03, 0x71, 0x80, 0xdc, 0x60, 0x34, 0x18, 0x05, - 0xc6, 0x03, 0x71, 0x80, 0x54, 0x60, 0x37, 0xed, - 0x09, 0x00, 0x45, 0x02, 0x38, 0x0d, 0xce, 0x01, - 0x71, 0x80, 0xdc, 0x60, 0x37, 0x18, 0x15, 0xc6, - 0x01, 0x71, 0x80, 0xdc, 0x60, 0x57, 0x18, 0x05, - 0xc6, 0x03, 0x71, 0x80, 0xd8, 0x61, 0x37, 0x18, - 0x09, 0xc6, 0x13, 0x71, 0x80, 0xd0, 0x60, 0x27, - 0x18, 0x15, 0xc6, 0x03, 0x71, 0x80, 0xdc, 0x60, - 0x17, 0x18, 0x0d, 0xc0, 0x11, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x45, 0x56, 0x05, 0x71, 0x81, - 0x5c, 0x60, 0x53, 0x58, 0x15, 0xc6, 0x05, 0x71, - 0x81, 0x0c, 0x61, 0x57, 0x59, 0x15, 0xc6, 0x14, - 0x31, 0x91, 0x5d, 0x60, 0x57, 0x19, 0x44, 0xd6, - 0x41, 0x71, 0x81, 0x5c, 0x60, 0x37, 0x18, 0x10, - 0xc6, 0x01, 0x31, 0x81, 0x4c, 0x60, 0x55, 0x18, - 0x15, 0xc6, 0x05, 0x51, 0x91, 0x4c, 0x60, 0x57, - 0x58, 0x05, 0xc6, 0x05, 0x71, 0x81, 0x5c, 0x60, - 0x12, 0x18, 0x15, 0xc0, 0x11, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x20, 0x80, - 0x48, 0x20, 0x12, 0x08, 0x04, 0x82, 0x01, 0x20, - 0x80, 0x5c, 0x20, 0x12, 0x08, 0x04, 0x83, 0x01, - 0x70, 0x80, 0x48, 0x20, 0x12, 0x08, 0x10, 0x82, - 0x01, 0x20, 0x80, 0x48, 0x20, 0x52, 0x08, 0x05, - 0xc2, 0x00, 0x20, 0x80, 0x48, 0x20, 0x12, 0x08, - 0x04, 0x82, 0x01, 0x00, 0x80, 0x48, 0x20, 0x12, - 0x08, 0x14, 0x82, 0x01, 0x20, 0x80, 0x48, 0x20, - 0x52, 0x08, 0x04, 0x80, 0x11, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x06, 0x01, 0x61, 0x80, - 0x58, 0x60, 0x16, 0x18, 0x05, 0x86, 0x01, 0x61, - 0x81, 0x58, 0x60, 0x16, 0x18, 0x05, 0x86, 0x05, - 0x61, 0x80, 0x58, 0x60, 0x16, 0x18, 0x05, 0x86, - 0x00, 0x61, 0x80, 0x58, 0x60, 0x16, 0x18, 0x15, - 0x86, 0x01, 0x61, 0x80, 0x58, 0x60, 0x16, 0x18, - 0x05, 0x86, 0x01, 0x61, 0x80, 0x58, 0x60, 0x16, - 0x18, 0x05, 0xed, 0x09, 0x00, 0x46, 0x02, 0x86, - 0x01, 0x61, 0x80, 0x58, 0x60, 0x16, 0x18, 0x05, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x45, 0x40, 0x05, 0x70, 0x01, 0x5c, 0x00, 0x57, - 0x00, 0x15, 0xc0, 0x05, 0x70, 0x01, 0x5c, 0x00, - 0x57, 0x00, 0x14, 0xc0, 0x04, 0x70, 0x01, 0x4c, - 0x00, 0x57, 0x00, 0x84, 0xc0, 0x04, 0x70, 0x01, - 0x5c, 0x00, 0x17, 0x00, 0x11, 0xc0, 0x05, 0x70, - 0x01, 0x5c, 0x00, 0x47, 0x00, 0x15, 0xc0, 0x05, - 0x70, 0x21, 0x5c, 0x00, 0x57, 0x00, 0x05, 0xc0, - 0x05, 0x70, 0x01, 0x5c, 0x00, 0x57, 0x00, 0x15, - 0xc0, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x43, 0x00, 0x60, 0x80, 0x18, 0x20, 0x06, - 0x08, 0x01, 0x82, 0x00, 0x60, 0x80, 0x18, 0x20, - 0x06, 0x0a, 0x00, 0x82, 0x00, 0x60, 0xc0, 0x08, - 0x20, 0x06, 0x0a, 0x00, 0x82, 0x80, 0x60, 0x80, - 0x18, 0x20, 0x04, 0x08, 0x01, 0x82, 0x00, 0x60, - 0x80, 0x18, 0x20, 0x06, 0x08, 0x00, 0x82, 0x00, - 0x60, 0xa0, 0x18, 0x20, 0x06, 0x08, 0x01, 0x82, - 0x00, 0x60, 0x80, 0x18, 0x20, 0x06, 0x08, 0x01, - 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x45, 0x42, 0x04, 0x20, 0x81, 0x08, 0x20, 0x42, - 0x08, 0x10, 0x82, 0x04, 0x20, 0x81, 0x08, 0x20, - 0x42, 0x28, 0x11, 0x82, 0x04, 0x20, 0x81, 0x18, - 0x20, 0x40, 0x0a, 0x01, 0x82, 0x84, 0x20, 0x81, - 0x08, 0x20, 0x02, 0x08, 0x10, 0x82, 0x04, 0x20, - 0x81, 0x08, 0x20, 0x42, 0x08, 0x10, 0x82, 0x04, - 0x20, 0xa1, 0x08, 0x20, 0x42, 0x08, 0x00, 0x82, - 0x04, 0x20, 0x81, 0x08, 0x20, 0x42, 0x08, 0x10, - 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x43, 0x05, 0x40, 0x81, 0x50, 0x20, 0x54, - 0x08, 0x15, 0x02, 0x05, 0x42, 0x80, 0x50, 0x20, - 0x54, 0x20, 0x95, 0x4a, 0x01, 0xed, 0x09, 0x00, - 0x47, 0x02, 0x40, 0x81, 0x54, 0x20, 0x54, 0x24, - 0x45, 0x40, 0x05, 0x40, 0x81, 0x50, 0x20, 0x14, - 0x08, 0x01, 0x02, 0x04, 0x40, 0x81, 0x50, 0x20, - 0x44, 0x08, 0x14, 0x02, 0x05, 0x40, 0x01, 0x50, - 0x20, 0x54, 0x08, 0x05, 0x82, 0x05, 0x40, 0x81, - 0x50, 0x20, 0x54, 0x08, 0x15, 0x00, 0x11, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x43, 0x01, - 0x10, 0xc0, 0x54, 0x30, 0x15, 0x08, 0x04, 0xc3, - 0x01, 0x50, 0xc0, 0x14, 0x30, 0x15, 0x28, 0x04, - 0xc3, 0x01, 0x50, 0xc0, 0x54, 0x30, 0x11, 0x0c, - 0x15, 0x43, 0x21, 0x00, 0xc0, 0x54, 0x30, 0x15, - 0x0c, 0x05, 0x43, 0x01, 0x50, 0xc0, 0x54, 0x30, - 0x15, 0x0c, 0x05, 0x43, 0x01, 0x50, 0xc0, 0x54, - 0x30, 0x15, 0x0c, 0x14, 0x43, 0x01, 0x50, 0xc0, - 0x54, 0x30, 0x15, 0x0c, 0x05, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x48, 0x00, - 0x12, 0x00, 0x10, 0x80, 0x04, 0x20, 0x00, 0x48, - 0x00, 0x42, 0x00, 0x10, 0x80, 0x04, 0x01, 0x00, - 0x08, 0x00, 0x40, 0x00, 0x10, 0x80, 0x01, 0x01, - 0x01, 0x08, 0x40, 0x02, 0x00, 0x10, 0x80, 0x04, - 0x20, 0x41, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80, - 0x04, 0x20, 0x41, 0x08, 0x00, 0x42, 0x10, 0x10, - 0x80, 0x04, 0x20, 0x00, 0x08, 0x00, 0x42, 0x00, - 0x10, 0x80, 0x04, 0x20, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x22, - 0x10, 0x80, 0x80, 0x20, 0x20, 0x08, 0x88, 0x42, - 0x02, 0x04, 0x90, 0x80, 0x20, 0x20, 0x08, 0xc8, - 0x92, 0x02, 0x02, 0x80, 0x80, 0x22, 0x21, 0x28, - 0x00, 0x02, 0x36, 0x00, 0x80, 0x80, 0x20, 0x00, - 0x08, 0x08, 0x12, 0x86, 0x00, 0x80, 0x80, 0x20, - 0x20, 0x08, 0x08, 0x02, 0x02, 0x00, 0x80, 0x80, - 0x20, 0x20, 0x08, 0x80, 0x42, 0x02, 0x00, 0x80, - 0xed, 0x09, 0x00, 0x48, 0x02, 0x80, 0x20, 0x00, - 0x08, 0x08, 0x00, 0x11, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x40, 0x85, 0x60, 0x01, 0x58, - 0x00, 0x56, 0x02, 0x1d, 0x80, 0x05, 0x60, 0x10, - 0xd8, 0x00, 0x56, 0x00, 0x14, 0x80, 0x43, 0x60, - 0x01, 0x58, 0x00, 0x56, 0x00, 0x15, 0x80, 0x87, - 0x20, 0x01, 0x58, 0x00, 0x56, 0x00, 0x1d, 0x80, - 0x45, 0x60, 0x00, 0x58, 0x00, 0x56, 0x00, 0x15, - 0x80, 0x05, 0x60, 0x01, 0x58, 0x00, 0x56, 0x02, - 0x14, 0x80, 0x05, 0x60, 0x01, 0x58, 0x00, 0x56, - 0x00, 0x15, 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc5, 0x40, 0x83, 0x60, 0x00, 0xd8, - 0x00, 0x16, 0x02, 0x0d, 0x80, 0x03, 0x60, 0x10, - 0x5c, 0x00, 0x16, 0x02, 0x81, 0x80, 0x41, 0x70, - 0x01, 0x58, 0x08, 0x36, 0x00, 0x19, 0x80, 0x81, - 0x60, 0x00, 0xd8, 0x00, 0x16, 0x00, 0x05, 0xc0, - 0x07, 0x60, 0x00, 0xd8, 0x00, 0x26, 0x00, 0x4d, - 0x00, 0x03, 0x60, 0x00, 0xd8, 0x00, 0x36, 0x02, - 0x0d, 0x80, 0x03, 0x60, 0x00, 0xd8, 0x00, 0x36, - 0x00, 0x0d, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x30, 0x01, 0x0c, - 0x00, 0x03, 0x02, 0x10, 0xc0, 0x04, 0x30, 0x09, - 0x18, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x24, 0x60, - 0x00, 0x0c, 0x09, 0x43, 0x00, 0x18, 0xc0, 0x00, - 0x30, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x11, 0x80, - 0x34, 0x30, 0x01, 0x0c, 0x00, 0x03, 0x00, 0x00, - 0xc0, 0x04, 0x30, 0x01, 0x0c, 0x00, 0x43, 0x01, - 0x10, 0xc0, 0x04, 0x30, 0x01, 0x0c, 0x00, 0x43, - 0x00, 0x10, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x30, 0x00, 0x0c, - 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x34, 0x00, - 0x08, 0x00, 0x03, 0x12, 0x00, 0xd0, 0x00, 0x20, - 0x01, 0x0c, 0x00, 0xed, 0x09, 0x00, 0x49, 0x02, - 0x03, 0x30, 0x00, 0xc0, 0x20, 0x30, 0x00, 0x0c, - 0x00, 0x43, 0x40, 0x00, 0x90, 0x00, 0x30, 0x00, - 0x0c, 0x00, 0x03, 0x00, 0x00, 0x40, 0x00, 0x30, - 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, - 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x01, 0x31, 0x40, 0x4c, 0x50, 0x13, 0x10, - 0x04, 0xc5, 0x01, 0x3b, 0x41, 0x4c, 0x50, 0x13, - 0x1a, 0x04, 0xe5, 0x25, 0x31, 0x40, 0x4c, 0x51, - 0x13, 0x06, 0x00, 0xc5, 0x01, 0x31, 0x40, 0x4c, - 0x50, 0x13, 0x14, 0x14, 0xe5, 0x01, 0x31, 0x40, - 0x44, 0x50, 0x13, 0x14, 0x04, 0xc5, 0x01, 0x31, - 0x40, 0x4c, 0x50, 0x13, 0x14, 0x04, 0xc5, 0x01, - 0x31, 0x40, 0x4c, 0x50, 0x13, 0x14, 0x04, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x23, 0x05, 0x68, 0xc1, 0x5a, 0x30, 0x56, 0x8c, - 0x15, 0xa3, 0x05, 0x68, 0x81, 0x5a, 0x30, 0x56, - 0x8e, 0x15, 0xa2, 0x05, 0x68, 0xc0, 0x5a, 0x30, - 0x46, 0x8c, 0x01, 0xa3, 0x05, 0x68, 0xc1, 0x1a, - 0x30, 0x56, 0x8c, 0x11, 0xa2, 0x01, 0x68, 0xc1, - 0x5a, 0x30, 0x56, 0x8c, 0x15, 0xa3, 0x04, 0x68, - 0xc1, 0x5a, 0x30, 0x56, 0x8c, 0x15, 0xa3, 0x05, - 0x68, 0xc1, 0x5a, 0x30, 0x56, 0x8c, 0x15, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, - 0x00, 0x80, 0x00, 0x24, 0x00, 0x0c, 0x00, 0x02, - 0x10, 0x00, 0x90, 0x00, 0x32, 0x00, 0x08, 0x00, - 0x02, 0x20, 0x10, 0x80, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x02, 0x40, 0x00, 0x10, 0x04, 0x30, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0xed, 0x09, - 0x00, 0x4a, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x44, 0x62, - 0x11, 0x18, 0x84, 0x46, 0x21, 0x11, 0x88, 0x44, - 0x62, 0x11, 0x0c, 0x84, 0x46, 0x01, 0x11, 0x88, - 0x44, 0x30, 0x10, 0x18, 0x84, 0x46, 0x01, 0x11, - 0x88, 0x44, 0x62, 0x11, 0x18, 0x84, 0x46, 0x21, - 0x11, 0x88, 0x44, 0x32, 0x11, 0x18, 0x84, 0x46, - 0x21, 0x11, 0x88, 0x44, 0x62, 0x11, 0x18, 0x84, - 0x46, 0x21, 0x11, 0x88, 0x44, 0x62, 0x11, 0x18, - 0x84, 0x46, 0x21, 0x11, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x50, - 0x11, 0x54, 0x04, 0x55, 0x01, 0x15, 0x40, 0x45, - 0x50, 0x30, 0x44, 0x04, 0x55, 0x01, 0x15, 0x40, - 0x41, 0x10, 0x10, 0x54, 0x04, 0x55, 0x11, 0x85, - 0x40, 0x55, 0x50, 0x11, 0x14, 0x04, 0x45, 0x01, - 0x05, 0x40, 0x45, 0x10, 0x11, 0x54, 0x05, 0x45, - 0x01, 0x15, 0x40, 0x45, 0x50, 0x11, 0x54, 0x04, - 0x55, 0x01, 0x15, 0x40, 0x45, 0x50, 0x11, 0x54, - 0x04, 0x55, 0x01, 0x15, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0x42, - 0x08, 0x50, 0x82, 0x14, 0x20, 0x85, 0x08, 0x20, - 0x42, 0x08, 0x50, 0x82, 0x14, 0x20, 0x84, 0x08, - 0xa1, 0x42, 0x09, 0x54, 0x82, 0x14, 0x20, 0x84, - 0x08, 0x21, 0x42, 0x08, 0x50, 0x82, 0x14, 0x20, - 0x85, 0x08, 0x21, 0x42, 0x08, 0x50, 0x82, 0x14, - 0x20, 0x85, 0x08, 0x21, 0x42, 0x08, 0x50, 0x82, - 0x14, 0x20, 0x85, 0x08, 0x21, 0x42, 0x08, 0x50, - 0x82, 0x14, 0x20, 0x85, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x02, - 0x84, 0x40, 0xa0, 0x10, 0x2a, 0x04, 0x0a, 0x01, - 0x00, 0x90, 0x40, 0xa0, 0x10, 0x08, 0x14, 0x02, - 0x41, 0x02, 0x80, 0x00, 0xa0, 0x10, 0x0c, 0x00, - 0x0a, 0xed, 0x09, 0x00, 0x4b, 0x02, 0x05, 0x02, - 0x80, 0x40, 0xa0, 0x10, 0x28, 0x04, 0x0a, 0x01, - 0x02, 0x80, 0x40, 0xa0, 0x10, 0x28, 0x04, 0x0a, - 0x01, 0x02, 0x80, 0x40, 0xa1, 0x10, 0x28, 0x04, - 0x0a, 0x01, 0x02, 0x80, 0x40, 0xa0, 0x10, 0x28, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x03, 0x53, 0x00, 0xd4, 0xc0, - 0x10, 0x32, 0x0d, 0x4c, 0x03, 0x53, 0x00, 0xd4, - 0xc0, 0x15, 0x32, 0x18, 0x0c, 0x03, 0x53, 0x00, - 0x04, 0xc0, 0x35, 0x30, 0x08, 0x4c, 0x07, 0x53, - 0x00, 0x54, 0xc0, 0x15, 0x30, 0x0d, 0x4c, 0x03, - 0x53, 0x00, 0xd4, 0xc0, 0x15, 0x30, 0x05, 0x4c, - 0x03, 0x03, 0x00, 0xd4, 0xc0, 0x35, 0x30, 0x0d, - 0x4c, 0x03, 0x53, 0x00, 0xd4, 0xc0, 0x35, 0x30, - 0x0d, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x05, 0x72, 0x01, 0x5c, 0x80, - 0x77, 0x21, 0x05, 0xc8, 0x05, 0x72, 0x00, 0xd4, - 0x80, 0x67, 0x26, 0x11, 0xc8, 0x07, 0x72, 0x01, - 0x5c, 0x80, 0x17, 0x20, 0x15, 0xc9, 0x05, 0x72, - 0x01, 0x5c, 0x80, 0x47, 0x20, 0x1d, 0xc8, 0x04, - 0x72, 0x01, 0x1c, 0x80, 0x47, 0x20, 0x15, 0xc8, - 0x05, 0x72, 0x41, 0x5c, 0x80, 0x57, 0x20, 0x15, - 0xc8, 0x05, 0x72, 0x01, 0x5c, 0x80, 0x57, 0x20, - 0x15, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x23, 0x08, 0x48, 0xc6, 0x12, 0x31, - 0x84, 0x8c, 0x21, 0x23, 0x18, 0x48, 0xc4, 0x12, - 0x31, 0x84, 0x0c, 0x21, 0x23, 0x10, 0x40, 0xc6, - 0x12, 0x30, 0x84, 0x0c, 0x61, 0x03, 0x08, 0x48, - 0xc6, 0x12, 0x31, 0x84, 0x8c, 0x41, 0x23, 0x10, - 0x48, 0xc6, 0x12, 0x31, 0x84, 0x8c, 0x61, 0x23, - 0x18, 0x40, 0xc6, 0x12, 0x31, 0x84, 0x8c, 0x21, - 0x23, 0x18, 0x48, 0xc6, 0x12, 0x31, 0x84, 0x8c, - 0x61, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x4c, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0x4f, 0xff, 0xd3, 0xff, 0xf4, 0xff, 0xfd, - 0x3f, 0xff, 0x4f, 0xff, 0xd3, 0xff, 0xf4, 0xff, - 0xfd, 0x3f, 0xff, 0x4f, 0xff, 0xd3, 0xff, 0xf4, - 0xff, 0xfd, 0x3f, 0xff, 0x4f, 0xff, 0xd3, 0xff, - 0xf4, 0xff, 0xfd, 0x3f, 0xff, 0x4f, 0xff, 0xd3, - 0xff, 0xf4, 0xff, 0xfd, 0x3f, 0xff, 0x4f, 0xff, - 0xd3, 0xff, 0xf4, 0xff, 0xfd, 0x3f, 0xff, 0x4f, - 0xff, 0xd3, 0xff, 0xf4, 0xff, 0xfd, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, - 0xdb, 0x0b, 0x36, 0xc2, 0xcd, 0xb0, 0xb7, 0xec, - 0x2c, 0xdb, 0x0b, 0x37, 0xd2, 0xcd, 0xb0, 0xff, - 0xec, 0x2c, 0xdf, 0x4b, 0x36, 0xc2, 0xcd, 0xb0, - 0xfb, 0x6c, 0x2c, 0xdb, 0x0b, 0x36, 0xc2, 0xcd, - 0xb0, 0xb3, 0x6c, 0x2c, 0xdb, 0x0b, 0x36, 0xc2, - 0xcd, 0xb0, 0xb3, 0x6c, 0x2c, 0xdb, 0x0b, 0x36, - 0xc2, 0xcd, 0xb0, 0xb3, 0x6c, 0x2c, 0xdb, 0x0b, - 0x36, 0xc2, 0xcd, 0xb0, 0xb3, 0x6c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, - 0x3c, 0x4c, 0xcf, 0x13, 0x33, 0xc4, 0xcf, 0xf1, - 0x33, 0x3c, 0x4c, 0xcf, 0xd3, 0x33, 0xc4, 0xff, - 0xf1, 0x33, 0x3f, 0x4c, 0xcf, 0x13, 0x33, 0xc4, - 0xfc, 0xf1, 0x33, 0x3c, 0x4c, 0xcf, 0x13, 0xed, - 0x09, 0x00, 0x4d, 0x02, 0x33, 0xc4, 0xcc, 0xf1, - 0x33, 0x3c, 0x4c, 0xcf, 0x13, 0x33, 0xc4, 0xcc, - 0xf1, 0x33, 0x3c, 0x4c, 0xcf, 0x13, 0x33, 0xc4, - 0xcc, 0xf1, 0x33, 0x3c, 0x4c, 0xcf, 0x13, 0x33, - 0xc4, 0xcc, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3b, 0x1e, 0x4e, 0xdf, - 0x93, 0xb7, 0xe4, 0xec, 0x79, 0x3b, 0x7e, 0x4e, - 0xde, 0x13, 0xb7, 0xe4, 0x8c, 0x79, 0x3b, 0x78, - 0x48, 0xdf, 0x93, 0xb1, 0xe4, 0x8d, 0xf9, 0x23, - 0x1e, 0x4e, 0xdf, 0x93, 0xb7, 0xe4, 0xed, 0xe1, - 0x3b, 0x78, 0x4e, 0xdf, 0x93, 0xb7, 0xe4, 0xed, - 0xf9, 0x3b, 0x7e, 0x48, 0xdf, 0x93, 0xb7, 0xe4, - 0xec, 0x79, 0x3b, 0x7e, 0x4e, 0xdf, 0x93, 0xb7, - 0xe4, 0xed, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x70, 0x40, - 0x9c, 0x10, 0x27, 0x04, 0x09, 0xc1, 0x02, 0x70, - 0x40, 0x9c, 0x50, 0x27, 0x00, 0x0d, 0xc1, 0x06, - 0x70, 0x40, 0x9c, 0x10, 0x27, 0x04, 0x09, 0xc1, - 0x00, 0x70, 0x40, 0x9c, 0x10, 0x27, 0x04, 0x09, - 0xc1, 0x02, 0x71, 0x40, 0x9c, 0x10, 0x27, 0x04, - 0x09, 0xc1, 0x02, 0x70, 0x40, 0x9c, 0x10, 0x27, - 0x04, 0x09, 0xc1, 0x02, 0x70, 0x40, 0x9c, 0x10, - 0x27, 0x04, 0x09, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x71, 0x01, - 0x5c, 0x40, 0x57, 0x10, 0x15, 0xc4, 0x05, 0x71, - 0x01, 0x5c, 0x40, 0x57, 0x10, 0x14, 0xc4, 0x04, - 0x31, 0x01, 0x5c, 0x40, 0x57, 0x10, 0x15, 0xc4, - 0x01, 0x71, 0x01, 0x5c, 0x40, 0x57, 0x10, 0x15, - 0xc4, 0x04, 0x31, 0x01, 0x5c, 0x40, 0x57, 0x10, - 0x15, 0xc4, 0x05, 0x71, 0x01, 0x5c, 0x40, 0x57, - 0x10, 0x15, 0xc4, 0x05, 0x71, 0x01, 0x5c, 0x40, - 0x57, 0x10, 0x15, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x4e, 0x02, 0x00, - 0x00, 0x02, 0x01, 0x20, 0x80, 0x48, 0x20, 0x12, - 0x08, 0x04, 0x82, 0x01, 0x20, 0x80, 0x48, 0x20, - 0x12, 0x08, 0x05, 0x82, 0x01, 0x70, 0x80, 0x48, - 0x20, 0x12, 0x08, 0x04, 0x82, 0x01, 0x20, 0x80, - 0x48, 0x20, 0x12, 0x08, 0x04, 0x82, 0x01, 0x70, - 0x80, 0x48, 0x60, 0x12, 0x08, 0x04, 0x82, 0x01, - 0x20, 0x80, 0x48, 0x20, 0x12, 0x08, 0x04, 0x82, - 0x01, 0x20, 0x80, 0x48, 0x20, 0x12, 0x08, 0x04, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x01, 0x06, - 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x18, 0x02, - 0x06, 0x00, 0x01, 0x80, 0x20, 0x60, 0x00, 0x18, - 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, - 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x60, 0x61, - 0x08, 0x18, 0x22, 0x06, 0x00, 0x01, 0x80, 0x00, - 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, - 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x72, 0x01, 0x1c, 0x80, 0x47, - 0x20, 0x11, 0xc8, 0x04, 0x72, 0x01, 0x1c, 0x80, - 0x47, 0x21, 0x11, 0xc8, 0x00, 0x72, 0x01, 0x1c, - 0x80, 0x47, 0x20, 0x11, 0xc8, 0x04, 0x72, 0x01, - 0x1c, 0x80, 0x47, 0x25, 0x11, 0xc8, 0x04, 0x72, - 0x81, 0x1c, 0x80, 0x47, 0x20, 0x11, 0xc8, 0x04, - 0x72, 0x01, 0x1c, 0x80, 0x47, 0x21, 0x11, 0xc8, - 0x04, 0x72, 0x01, 0x1c, 0x80, 0x47, 0x20, 0x11, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, - 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, - 0x06, 0x01, 0x01, 0x80, 0x04, 0x60, 0x00, 0x18, - 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, - 0x18, 0x00, 0x06, 0x00, 0x01, 0xed, 0x09, 0x00, - 0x4f, 0x02, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, - 0x06, 0x00, 0x01, 0x80, 0x40, 0x60, 0x00, 0x18, - 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, - 0x18, 0x00, 0x06, 0x00, 0x01, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x22, 0x01, 0x08, 0x80, 0x42, 0x20, 0x10, 0x88, - 0x04, 0x22, 0x01, 0x09, 0x80, 0x42, 0x20, 0x10, - 0x98, 0x04, 0x22, 0x01, 0x08, 0x80, 0x42, 0x20, - 0x10, 0x88, 0x04, 0x22, 0x01, 0x08, 0x80, 0x42, - 0x30, 0x10, 0x98, 0x04, 0x26, 0x01, 0x09, 0x80, - 0x42, 0x20, 0x10, 0x88, 0x04, 0x22, 0x01, 0x08, - 0x80, 0x42, 0x20, 0x10, 0x88, 0x04, 0x22, 0x01, - 0x08, 0x80, 0x42, 0x20, 0x10, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x04, - 0x4a, 0x81, 0x12, 0xa0, 0x44, 0xa8, 0x11, 0x2a, - 0x04, 0x4a, 0x81, 0x12, 0xa0, 0x44, 0xa8, 0x11, - 0x2a, 0x04, 0x4a, 0x81, 0x12, 0xa0, 0x44, 0xa8, - 0x11, 0x2a, 0x04, 0x4a, 0x81, 0x12, 0xa0, 0x44, - 0xa8, 0x11, 0x2a, 0x04, 0x4a, 0x81, 0x12, 0xa1, - 0x44, 0xa8, 0x11, 0x2a, 0x04, 0x4a, 0x81, 0x12, - 0xa0, 0x44, 0xac, 0x11, 0x2a, 0x04, 0x4a, 0x81, - 0x12, 0xa0, 0x44, 0xa8, 0x11, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0xc0, 0x0c, 0x00, - 0x53, 0x00, 0x14, 0xc0, 0x05, 0x30, 0x01, 0x4c, - 0x00, 0x53, 0x00, 0x14, 0xc0, 0x05, 0x34, 0x01, - 0x6c, 0x00, 0x53, 0x00, 0x14, 0xc0, 0x05, 0x30, - 0x01, 0x4c, 0x00, 0x53, 0x00, 0x14, 0xc0, 0x05, - 0x30, 0x01, 0x6c, 0x00, 0x53, 0x00, 0x14, 0xc0, - 0x05, 0x30, 0x01, 0x4c, 0x00, 0x53, 0x00, 0x14, - 0xc0, 0x05, 0x30, 0x00, 0x4c, 0x00, 0x53, 0x00, - 0x14, 0xc0, 0x05, 0x30, 0x01, 0x40, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x50, 0x02, 0x40, 0x00, 0x10, - 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, - 0x11, 0x00, 0x04, 0x00, 0x01, 0x10, 0x00, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x10, 0x00, 0x04, 0x10, 0x41, 0x10, - 0x00, 0x40, 0x00, 0x11, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, - 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, - 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0xc0, 0x40, 0x02, 0x00, 0x00, 0x80, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x80, 0x02, 0x20, 0x00, 0x08, 0x00, 0x22, 0x00, - 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, - 0x22, 0x04, 0x08, 0x81, 0x02, 0x20, 0x00, 0x08, - 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, - 0x08, 0x40, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, - 0x00, 0x08, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0xc0, 0x40, 0x04, 0x60, 0x01, 0x18, - 0x00, 0x06, 0x00, 0x11, 0x80, 0x04, 0x60, 0x01, - 0x18, 0x00, 0x46, 0x00, 0x11, 0x80, 0x04, 0x60, - 0x01, 0x18, 0x00, 0x46, 0x00, 0x11, 0x80, 0x0e, - 0x60, 0x01, 0x18, 0x00, 0x46, 0x00, 0x11, 0x80, - 0x04, 0x60, 0x01, 0x18, 0x00, 0x46, 0x00, 0x11, - 0x80, 0x04, 0x60, 0x01, 0x18, 0x00, 0x46, 0x00, - 0x11, 0x80, 0x04, 0x60, 0x01, 0x18, 0x00, 0x46, - 0x00, 0x11, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x01, 0x40, 0x02, 0x60, 0x00, 0x98, - 0x00, 0x26, 0x00, 0x09, 0x80, 0x02, 0x60, 0x00, - 0x98, 0x00, 0x26, 0x00, 0x19, 0x80, 0x02, 0x70, - 0x00, 0x98, 0x00, 0x26, 0x00, 0x09, 0x80, 0x02, - 0x60, 0x00, 0x98, 0x00, 0x26, 0x00, 0x09, 0x80, - 0x02, 0x74, 0x00, 0xed, 0x09, 0x00, 0x51, 0x02, - 0x99, 0x00, 0x26, 0x00, 0x09, 0x80, 0x02, 0x60, - 0x00, 0x98, 0x00, 0x26, 0x00, 0x09, 0x80, 0x02, - 0x60, 0x00, 0x98, 0x00, 0x26, 0x00, 0x09, 0x82, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, - 0x42, 0x04, 0x30, 0x81, 0x0c, 0x20, 0x43, 0x08, - 0x10, 0xc2, 0x04, 0x30, 0x81, 0x0c, 0x20, 0x43, - 0x08, 0x90, 0xd2, 0x04, 0x60, 0x81, 0x0c, 0x20, - 0x43, 0x08, 0x10, 0xc2, 0x04, 0x30, 0x81, 0x0c, - 0x20, 0x43, 0x08, 0x90, 0xd2, 0x04, 0x60, 0x81, - 0x0c, 0x20, 0x43, 0x08, 0x10, 0xc2, 0x04, 0x10, - 0x81, 0x0c, 0x20, 0x43, 0x08, 0x90, 0xc2, 0x04, - 0x30, 0x81, 0x0c, 0x20, 0x43, 0x08, 0x10, 0xc0, - 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, - 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, 0x00, 0x03, - 0x01, 0x00, 0xc0, 0x00, 0x20, 0x00, 0x0c, 0x00, - 0x03, 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x0c, - 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x20, 0x00, - 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x40, 0x10, - 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, 0x00, - 0x30, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x02, 0x00, 0x30, 0x80, 0x0c, 0x20, 0x03, 0x08, - 0x00, 0xc2, 0x00, 0x30, 0x80, 0x0c, 0x20, 0x03, - 0x08, 0x10, 0xc2, 0x00, 0x30, 0x80, 0x0c, 0x20, - 0x03, 0x08, 0x00, 0xc2, 0x00, 0x30, 0x80, 0x0c, - 0x20, 0x03, 0x08, 0x00, 0xc2, 0x00, 0x30, 0x80, - 0x0c, 0x20, 0x03, 0x08, 0x00, 0xc2, 0x00, 0x30, - 0x80, 0x0c, 0x20, 0x03, 0x08, 0x00, 0xc2, 0x00, - 0x30, 0x80, 0x04, 0x20, 0x03, 0x08, 0x00, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, - 0x42, 0x04, 0x60, 0x81, 0x18, 0x20, 0xed, 0x09, - 0x00, 0x52, 0x02, 0x46, 0x08, 0x11, 0x82, 0x04, - 0x60, 0x81, 0x18, 0x20, 0x46, 0x08, 0x01, 0x82, - 0x04, 0x60, 0x81, 0x18, 0x20, 0x46, 0x08, 0x11, - 0x82, 0x04, 0x60, 0x81, 0x18, 0x20, 0x46, 0x08, - 0x11, 0x82, 0x04, 0x60, 0x81, 0x18, 0x20, 0x46, - 0x08, 0x11, 0x82, 0x04, 0x60, 0x81, 0x18, 0x20, - 0x46, 0x08, 0x11, 0x82, 0x04, 0x60, 0x81, 0x18, - 0x20, 0x46, 0x08, 0x11, 0x80, 0x11, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x01, 0x42, 0x00, 0x20, - 0x80, 0x08, 0x20, 0x02, 0x08, 0x00, 0x82, 0x00, - 0x20, 0x80, 0x08, 0x20, 0x02, 0x08, 0x00, 0x82, - 0x00, 0x20, 0x80, 0x08, 0x20, 0x02, 0x08, 0x00, - 0x82, 0x00, 0x20, 0x80, 0x08, 0x20, 0x02, 0x08, - 0x00, 0x82, 0x00, 0x20, 0x80, 0x08, 0x20, 0x02, - 0x08, 0x00, 0x82, 0x00, 0x20, 0x80, 0x08, 0x20, - 0x02, 0x08, 0x00, 0x82, 0x00, 0x20, 0x80, 0x08, - 0x20, 0x02, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x50, 0x01, 0x42, 0x04, 0x60, - 0x81, 0x18, 0x20, 0x46, 0x08, 0x11, 0x82, 0x04, - 0x60, 0x81, 0x18, 0x20, 0x46, 0x08, 0x01, 0x82, - 0x04, 0x60, 0x81, 0x18, 0x20, 0x46, 0x08, 0x11, - 0x82, 0x04, 0x60, 0x81, 0x18, 0x20, 0x46, 0x08, - 0x11, 0x82, 0x04, 0x60, 0x81, 0x18, 0x20, 0x46, - 0x08, 0x11, 0x82, 0x04, 0x60, 0x81, 0x18, 0x20, - 0x46, 0x08, 0x11, 0x82, 0x04, 0x60, 0x81, 0x18, - 0x20, 0x46, 0x08, 0x11, 0x80, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x45, 0x40, 0x04, 0x50, - 0x01, 0x14, 0x00, 0x45, 0x00, 0x11, 0x40, 0x04, - 0x50, 0x01, 0x14, 0x00, 0x45, 0x00, 0x01, 0x40, - 0x04, 0x50, 0x01, 0x14, 0x00, 0x45, 0x00, 0x11, - 0x40, 0x04, 0x50, 0x01, 0x14, 0x00, 0x45, 0x00, - 0x11, 0x40, 0x04, 0x50, 0x01, 0x14, 0x00, 0x45, - 0x00, 0xed, 0x09, 0x00, 0x53, 0x02, 0x11, 0x40, - 0x04, 0x50, 0x01, 0x14, 0x00, 0x45, 0x00, 0x11, - 0x40, 0x04, 0x50, 0x01, 0x14, 0x00, 0x45, 0x00, - 0x11, 0x42, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x06, 0x00, 0x41, 0x80, 0x10, 0x60, - 0x04, 0x18, 0x01, 0x06, 0x00, 0x41, 0x80, 0x10, - 0x60, 0x04, 0x18, 0x01, 0x06, 0x00, 0x41, 0x80, - 0x10, 0x60, 0x04, 0x18, 0x01, 0x06, 0x00, 0x41, - 0x80, 0x10, 0x60, 0x04, 0x18, 0x01, 0x06, 0x00, - 0x41, 0x80, 0x10, 0x60, 0x04, 0x18, 0x01, 0x06, - 0x00, 0x41, 0x80, 0x10, 0x60, 0x04, 0x18, 0x01, - 0x06, 0x00, 0x41, 0x80, 0x10, 0x60, 0x04, 0x18, - 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x48, 0x00, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, - 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, - 0x20, 0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x80, - 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, - 0x80, 0x40, 0x20, 0x10, 0x00, 0x04, 0x03, 0x01, - 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, - 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, - 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x40, 0x45, 0x46, 0x03, 0x51, 0x80, 0xd4, 0x60, - 0x35, 0x18, 0x0d, 0x46, 0x03, 0x51, 0x80, 0xd4, - 0x64, 0x35, 0x58, 0x0d, 0x44, 0x43, 0x51, 0x80, - 0xd4, 0x60, 0x35, 0x18, 0x0d, 0x46, 0x03, 0x51, - 0x80, 0xd4, 0x60, 0x35, 0x18, 0x0d, 0x44, 0x43, - 0x51, 0x10, 0xd4, 0x44, 0x35, 0x18, 0x0d, 0x46, - 0x03, 0x51, 0x80, 0xd4, 0x60, 0x35, 0x18, 0x0d, - 0x46, 0x03, 0x51, 0x80, 0xd4, 0x60, 0x35, 0x18, - 0x0d, 0x40, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x46, 0x04, 0x71, 0x82, 0x1c, 0x60, - 0x47, 0x18, 0x11, 0xc6, 0xed, 0x09, 0x00, 0x54, - 0x02, 0x04, 0x71, 0x81, 0x1c, 0x60, 0x47, 0x18, - 0x91, 0xc6, 0x04, 0x71, 0x81, 0x1c, 0x60, 0x47, - 0x18, 0x11, 0xc6, 0x04, 0x71, 0x81, 0x1c, 0x60, - 0x47, 0x58, 0x91, 0xc6, 0x04, 0x71, 0x81, 0x1c, - 0x60, 0x47, 0x18, 0x11, 0xce, 0x04, 0x71, 0x81, - 0x1c, 0x60, 0x47, 0x18, 0x91, 0xc6, 0x04, 0x71, - 0x81, 0x1c, 0x60, 0x47, 0x18, 0x11, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x46, - 0x02, 0x71, 0x80, 0x9c, 0x60, 0x27, 0x18, 0x09, - 0xc6, 0x02, 0x71, 0x80, 0x9c, 0x60, 0x07, 0x18, - 0x01, 0xc6, 0x02, 0x71, 0x80, 0x9c, 0x60, 0x27, - 0x18, 0x09, 0xc6, 0x02, 0x71, 0x80, 0x9c, 0x60, - 0x27, 0x18, 0x09, 0xc6, 0x02, 0x71, 0x80, 0x9c, - 0x60, 0x27, 0x18, 0x09, 0xce, 0x02, 0x71, 0x80, - 0x9c, 0x60, 0x27, 0x18, 0x0d, 0xc6, 0x02, 0x71, - 0x80, 0x9c, 0x60, 0x27, 0x18, 0x09, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x46, - 0x05, 0x71, 0x81, 0x5c, 0x60, 0x57, 0x18, 0x15, - 0xc6, 0x05, 0x71, 0x81, 0x5c, 0x60, 0x17, 0x19, - 0x05, 0xc6, 0x05, 0x71, 0x81, 0x5c, 0x60, 0x57, - 0x18, 0x15, 0xc6, 0x05, 0x71, 0x80, 0x5c, 0x60, - 0x57, 0x58, 0x15, 0xc6, 0x05, 0x71, 0x81, 0x5c, - 0x60, 0x57, 0x18, 0x05, 0xc6, 0x45, 0x71, 0x81, - 0x5c, 0x60, 0x57, 0x18, 0x14, 0xc6, 0x05, 0x71, - 0x81, 0x5c, 0x60, 0x57, 0x18, 0x15, 0xc2, 0x11, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, - 0x01, 0x20, 0x80, 0x48, 0x20, 0x12, 0x08, 0x04, - 0x82, 0x01, 0x20, 0x80, 0x48, 0x20, 0x12, 0x40, - 0x04, 0x82, 0x01, 0x20, 0x80, 0x48, 0x20, 0x12, - 0x08, 0x04, 0x82, 0x01, 0x20, 0x80, 0x48, 0x20, - 0x12, 0x48, 0x04, 0x82, 0x01, 0x20, 0x80, 0x48, - 0x20, 0x12, 0x08, 0x04, 0x82, 0x01, 0x20, 0xed, - 0x09, 0x00, 0x55, 0x02, 0x80, 0x48, 0x20, 0x12, - 0x48, 0x05, 0x82, 0x01, 0x20, 0x80, 0x48, 0x20, - 0x12, 0x08, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x06, 0x00, 0x61, 0x80, - 0x18, 0x60, 0x06, 0x18, 0x01, 0x86, 0x00, 0x61, - 0x80, 0x18, 0x60, 0x06, 0x98, 0x01, 0x86, 0x00, - 0x61, 0x80, 0x18, 0x60, 0x06, 0x18, 0x01, 0x86, - 0x00, 0x61, 0x80, 0x18, 0x60, 0x06, 0x18, 0x01, - 0x86, 0x00, 0x61, 0x80, 0x18, 0x60, 0x06, 0x18, - 0x01, 0x86, 0x00, 0x61, 0x80, 0x18, 0x60, 0x06, - 0x18, 0x01, 0x86, 0x00, 0x61, 0x80, 0x18, 0x60, - 0x06, 0x18, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x45, 0x60, 0x04, 0x78, 0x01, - 0x1e, 0x00, 0x47, 0x80, 0x11, 0xe0, 0x04, 0x78, - 0x01, 0x1e, 0x00, 0x47, 0x80, 0x91, 0xe0, 0x04, - 0x78, 0x01, 0x1e, 0x00, 0x47, 0x80, 0x11, 0xe0, - 0x04, 0x78, 0x01, 0x1e, 0x00, 0x47, 0x80, 0x11, - 0xe0, 0x04, 0x78, 0x01, 0x1e, 0x00, 0x47, 0x80, - 0x11, 0xe0, 0x04, 0x78, 0x01, 0x1e, 0x00, 0x47, - 0x80, 0x11, 0xe0, 0x04, 0x78, 0x01, 0x1e, 0x00, - 0x47, 0x80, 0x11, 0xc0, 0x11, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x01, 0x42, 0x00, 0x60, 0x80, - 0x18, 0x20, 0x06, 0x08, 0x01, 0x82, 0x00, 0x60, - 0x80, 0x18, 0x20, 0x06, 0x4a, 0x01, 0x82, 0x00, - 0x60, 0x80, 0x18, 0x20, 0x06, 0x08, 0x01, 0x82, - 0x00, 0x60, 0x80, 0x18, 0x20, 0x06, 0x48, 0x01, - 0x82, 0x00, 0x60, 0x80, 0x18, 0x20, 0x06, 0x08, - 0x01, 0x82, 0x00, 0x60, 0x80, 0x18, 0x20, 0x06, - 0x48, 0x01, 0x82, 0x00, 0x60, 0x80, 0x18, 0x20, - 0x06, 0x08, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x40, 0x01, 0x42, 0x04, 0x20, 0x81, - 0x08, 0x20, 0x42, 0x08, 0x10, 0x82, 0x04, 0x20, - 0x81, 0x08, 0xed, 0x09, 0x00, 0x56, 0x02, 0x20, - 0x42, 0x0a, 0x10, 0x82, 0x04, 0x20, 0x81, 0x08, - 0x20, 0x42, 0x08, 0x10, 0x82, 0x04, 0x20, 0x81, - 0x08, 0x20, 0x42, 0x08, 0x10, 0x82, 0x04, 0x20, - 0x81, 0x08, 0x20, 0x42, 0x08, 0x10, 0x82, 0x04, - 0x20, 0x81, 0x08, 0x20, 0x42, 0x08, 0x10, 0x82, - 0x04, 0x20, 0x81, 0x08, 0x20, 0x42, 0x08, 0x10, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x45, 0x42, 0x04, 0x40, 0x81, 0x10, 0x20, 0x44, - 0x08, 0x11, 0x02, 0x04, 0x40, 0x81, 0x10, 0x20, - 0x44, 0x08, 0x11, 0x02, 0x04, 0x40, 0x81, 0x10, - 0x20, 0x44, 0x08, 0x11, 0x02, 0x04, 0x40, 0x81, - 0x10, 0x20, 0x44, 0x08, 0x11, 0x02, 0x04, 0x40, - 0x81, 0x10, 0x20, 0x44, 0x08, 0x51, 0x0a, 0x04, - 0x40, 0x81, 0x10, 0x20, 0x44, 0x08, 0x11, 0x02, - 0x04, 0x40, 0x81, 0x10, 0x20, 0x44, 0x08, 0x11, - 0x00, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x00, 0x03, 0x00, 0x50, 0xc0, 0x14, 0x30, 0x05, - 0x0c, 0x01, 0x43, 0x00, 0x50, 0xc0, 0x14, 0x30, - 0x05, 0x0c, 0x00, 0x43, 0x00, 0x50, 0xc0, 0x14, - 0x30, 0x05, 0x0c, 0x01, 0x43, 0x00, 0x50, 0xc0, - 0x14, 0x30, 0x05, 0x0c, 0x01, 0x43, 0x00, 0x50, - 0xc0, 0x14, 0x30, 0x05, 0x0c, 0x01, 0x43, 0x00, - 0x50, 0xc0, 0x14, 0x30, 0x05, 0x0c, 0x01, 0x43, - 0x00, 0x50, 0xc0, 0x14, 0x30, 0x05, 0x0c, 0x01, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x00, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80, 0x04, - 0x20, 0x01, 0x08, 0x00, 0x42, 0x00, 0x10, 0x80, - 0x04, 0x21, 0x00, 0x48, 0x00, 0x42, 0x04, 0x10, - 0x80, 0x04, 0x20, 0x01, 0x08, 0x00, 0x42, 0x00, - 0x10, 0x80, 0x04, 0x20, 0x01, 0x08, 0x00, 0x42, - 0x00, 0x10, 0x80, 0x04, 0x20, 0x01, 0x08, 0x00, - 0x42, 0x00, 0x10, 0x81, 0x04, 0xed, 0x09, 0x00, - 0x57, 0x02, 0x20, 0x01, 0x88, 0x00, 0x42, 0x00, - 0x10, 0x80, 0x04, 0x20, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, 0x42, 0x02, - 0x00, 0x80, 0x80, 0x20, 0x20, 0x08, 0x08, 0x02, - 0x02, 0x00, 0x80, 0x80, 0x20, 0x00, 0x08, 0x80, - 0x42, 0x02, 0x00, 0x80, 0x80, 0x20, 0x20, 0x08, - 0x08, 0x02, 0x02, 0x00, 0x80, 0x00, 0x20, 0x20, - 0x08, 0x88, 0x02, 0x02, 0x00, 0xa0, 0x80, 0x28, - 0x20, 0x08, 0x00, 0x02, 0x02, 0x00, 0x80, 0x80, - 0x20, 0x20, 0x0c, 0x08, 0x02, 0x02, 0x00, 0x80, - 0x80, 0x20, 0x20, 0x08, 0x08, 0x00, 0x11, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x40, 0x04, - 0x60, 0x01, 0x18, 0x00, 0x46, 0x00, 0x11, 0x80, - 0x04, 0x60, 0x01, 0x18, 0x00, 0x66, 0x02, 0x19, - 0x80, 0x64, 0x60, 0x01, 0x18, 0x00, 0x46, 0x00, - 0x11, 0x80, 0x04, 0x60, 0x01, 0x18, 0x00, 0x46, - 0x00, 0x11, 0x80, 0x44, 0x60, 0x11, 0x18, 0x04, - 0x46, 0x00, 0x11, 0x80, 0x04, 0x60, 0x01, 0x18, - 0x00, 0x46, 0x00, 0x11, 0x80, 0x04, 0x60, 0x01, - 0x18, 0x00, 0x46, 0x00, 0x11, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x40, 0x02, - 0x60, 0x00, 0x98, 0x00, 0x26, 0x00, 0x09, 0x80, - 0x02, 0x60, 0x00, 0x98, 0x00, 0x26, 0x42, 0x09, - 0x80, 0x42, 0x60, 0x00, 0x98, 0x00, 0x26, 0x00, - 0x09, 0x80, 0x06, 0x60, 0x00, 0x98, 0x00, 0x26, - 0x02, 0x89, 0x80, 0x42, 0x60, 0x10, 0x98, 0x00, - 0x26, 0x00, 0x09, 0x90, 0x02, 0x60, 0x00, 0x98, - 0x00, 0x26, 0x00, 0x19, 0x80, 0x02, 0x60, 0x00, - 0x98, 0x00, 0x26, 0x00, 0x09, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, 0x60, 0x04, - 0x38, 0x01, 0x0e, 0x00, 0x43, 0x80, 0x10, 0xe0, - 0x04, 0x38, 0x01, 0x0e, 0x00, 0x43, 0x81, 0x10, - 0xed, 0x09, 0x00, 0x58, 0x02, 0xe0, 0x24, 0x38, - 0x01, 0x0e, 0x00, 0x43, 0x80, 0x10, 0xe0, 0x04, - 0x38, 0x01, 0x0e, 0x00, 0x43, 0x80, 0x10, 0xe0, - 0x24, 0x38, 0x09, 0x0e, 0x02, 0x43, 0x80, 0x10, - 0xe0, 0x04, 0x38, 0x01, 0x0e, 0x00, 0x43, 0x84, - 0x10, 0xe0, 0x04, 0x38, 0x01, 0x0e, 0x00, 0x43, - 0x80, 0x10, 0xc0, 0x11, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x50, 0x01, 0x01, 0x00, 0x30, 0x40, 0x0c, - 0x10, 0x03, 0x04, 0x00, 0xc1, 0x00, 0x30, 0x40, - 0x0c, 0x10, 0x03, 0x14, 0x00, 0xc1, 0x00, 0x30, - 0x40, 0x0c, 0x10, 0x03, 0x04, 0x00, 0xc1, 0x00, - 0x30, 0x40, 0x0c, 0x10, 0x03, 0x04, 0x00, 0xc1, - 0x00, 0x30, 0x40, 0x0c, 0x10, 0x03, 0x04, 0x00, - 0xc0, 0x00, 0x30, 0x40, 0x0c, 0x10, 0x03, 0x04, - 0x00, 0xc1, 0x00, 0x30, 0x40, 0x0c, 0x10, 0x03, - 0x04, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x00, 0x05, 0x00, 0x31, 0x40, 0x0c, - 0x50, 0x03, 0x14, 0x00, 0xc5, 0x00, 0x31, 0x40, - 0x0c, 0x50, 0x03, 0x54, 0x00, 0xc5, 0x00, 0x31, - 0x40, 0x0c, 0x50, 0x03, 0x14, 0x00, 0xc5, 0x04, - 0x31, 0x40, 0x0c, 0x50, 0x03, 0x14, 0x00, 0xc5, - 0x20, 0x31, 0x40, 0x0c, 0x50, 0x03, 0x14, 0x00, - 0xd1, 0x00, 0x31, 0x40, 0x0c, 0x50, 0x03, 0x14, - 0x10, 0xc5, 0x00, 0x31, 0x40, 0x0c, 0x50, 0x03, - 0x14, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x45, 0x43, 0x04, 0x60, 0xc1, 0x18, - 0x30, 0x46, 0x0c, 0x11, 0x83, 0x04, 0x60, 0xc1, - 0x18, 0x30, 0x46, 0x4c, 0x11, 0x82, 0x04, 0x60, - 0xc1, 0x18, 0x30, 0x46, 0x0c, 0x11, 0x83, 0x00, - 0x60, 0xc1, 0x18, 0x30, 0x46, 0x0c, 0x11, 0x82, - 0x04, 0x60, 0xc1, 0x18, 0x30, 0x46, 0x0c, 0x11, - 0x83, 0x04, 0x60, 0xc1, 0x18, 0x30, 0x46, 0x0c, - 0x11, 0x83, 0x04, 0xed, 0x09, 0x00, 0x59, 0x02, - 0x60, 0xc1, 0x18, 0x30, 0x46, 0x0c, 0x11, 0x80, - 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, - 0x40, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, - 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, - 0x10, 0x00, 0x80, 0x00, 0x30, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x30, 0x00, - 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, - 0x48, 0x44, 0x62, 0x11, 0x18, 0x84, 0x46, 0x21, - 0x11, 0x88, 0x44, 0x62, 0x11, 0x18, 0x84, 0x46, - 0x60, 0x11, 0x88, 0x44, 0x32, 0x11, 0x18, 0x84, - 0x46, 0x21, 0x11, 0x88, 0x40, 0x62, 0x11, 0x18, - 0x84, 0x46, 0x21, 0x11, 0x88, 0x44, 0x32, 0x11, - 0x18, 0x84, 0x46, 0x21, 0x11, 0x88, 0x04, 0x62, - 0x11, 0x18, 0x84, 0x46, 0x21, 0x11, 0x88, 0x44, - 0x62, 0x11, 0x18, 0x84, 0x46, 0x21, 0x11, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x45, - 0x40, 0x44, 0x50, 0x11, 0x14, 0x04, 0x45, 0x01, - 0x11, 0x40, 0x44, 0x50, 0x11, 0x14, 0x0c, 0x45, - 0x05, 0x11, 0x40, 0x44, 0x10, 0x11, 0x14, 0x04, - 0x45, 0x01, 0x11, 0x40, 0x40, 0x50, 0x11, 0x14, - 0x04, 0x45, 0x00, 0x11, 0x40, 0x44, 0x10, 0x11, - 0x14, 0x04, 0x45, 0x01, 0x11, 0x44, 0x44, 0x50, - 0x11, 0x14, 0x04, 0x45, 0x01, 0x01, 0x40, 0x44, - 0x50, 0x11, 0x14, 0x04, 0x45, 0x01, 0x11, 0x40, - 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x08, 0x20, 0x42, 0x08, 0x10, 0x82, 0x04, 0x20, - 0x81, 0x08, 0x20, 0x42, 0x08, 0x10, 0x80, 0x04, - 0x20, 0x81, 0x08, 0x20, 0x42, 0x08, 0xed, 0x09, - 0x00, 0x5a, 0x02, 0x10, 0x82, 0x04, 0x20, 0x81, - 0x08, 0x20, 0x42, 0x08, 0x10, 0x82, 0x04, 0x20, - 0x81, 0x08, 0x20, 0x42, 0x00, 0x10, 0x80, 0x04, - 0x20, 0x81, 0x08, 0x20, 0x42, 0x08, 0x10, 0x82, - 0x04, 0x20, 0x81, 0x08, 0x20, 0x42, 0x08, 0x10, - 0x82, 0x04, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x02, - 0x80, 0x40, 0xa0, 0x10, 0x28, 0x04, 0x0a, 0x01, - 0x02, 0x80, 0x40, 0xa0, 0x10, 0x28, 0x04, 0x0a, - 0x01, 0x02, 0x84, 0x40, 0xa0, 0x10, 0x28, 0x04, - 0x0a, 0x01, 0x02, 0x80, 0x40, 0xa0, 0x10, 0x28, - 0x04, 0x0a, 0x01, 0x02, 0x80, 0x40, 0xa0, 0x10, - 0x28, 0x04, 0x0a, 0x01, 0x02, 0x80, 0x40, 0xa0, - 0x10, 0x28, 0x04, 0x0a, 0x01, 0x02, 0x80, 0x40, - 0xa0, 0x10, 0x28, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x45, 0x4d, 0x03, 0x53, - 0x40, 0xd4, 0xd0, 0x35, 0x34, 0x0d, 0x4d, 0x03, - 0x53, 0x40, 0xd4, 0xd0, 0x35, 0x34, 0x0d, 0x4d, - 0x03, 0x53, 0x40, 0xd4, 0xd0, 0x35, 0x34, 0x0d, - 0x4d, 0x03, 0x53, 0x40, 0xd4, 0xd0, 0x35, 0x34, - 0x0d, 0x4d, 0x03, 0x53, 0x40, 0xd4, 0xd0, 0x35, - 0x34, 0x0d, 0x4d, 0x03, 0x53, 0x40, 0xd4, 0xd0, - 0x35, 0x34, 0x0d, 0x4d, 0x03, 0x53, 0x40, 0xd4, - 0xd0, 0x35, 0x34, 0x0d, 0x40, 0x11, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x40, 0x01, 0x48, 0x04, 0x72, - 0x01, 0x1c, 0x80, 0x47, 0x20, 0x11, 0xc8, 0x04, - 0x72, 0x01, 0x1c, 0x80, 0x07, 0x20, 0x11, 0xc8, - 0x04, 0x72, 0x01, 0x1c, 0x80, 0x47, 0x20, 0x11, - 0xc8, 0x04, 0x72, 0x01, 0x1c, 0x80, 0x47, 0x20, - 0x11, 0xc8, 0x04, 0x72, 0x00, 0x1c, 0x80, 0x47, - 0x20, 0x11, 0xc8, 0x04, 0x72, 0x01, 0x1c, 0x80, - 0x47, 0x20, 0x11, 0xc8, 0x04, 0x72, 0x01, 0x1c, - 0x80, 0xed, 0x09, 0x00, 0x5b, 0x02, 0x47, 0x20, - 0x11, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x23, 0x18, 0x48, 0xc6, 0x12, 0x31, - 0x84, 0x8c, 0x61, 0x23, 0x18, 0x48, 0xc6, 0x12, - 0x31, 0x04, 0x0c, 0x21, 0x23, 0x10, 0x48, 0xc6, - 0x12, 0x31, 0x84, 0x8c, 0x61, 0x23, 0x18, 0x48, - 0xc6, 0x12, 0x31, 0x84, 0x8c, 0x21, 0x23, 0x10, - 0x48, 0xc4, 0x12, 0x31, 0x04, 0x8c, 0x61, 0x03, - 0x18, 0x48, 0xc6, 0x12, 0x31, 0x84, 0x8c, 0x21, - 0x23, 0x18, 0x48, 0xc6, 0x12, 0x31, 0x84, 0x8c, - 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0x4f, 0xff, 0xd3, 0xff, - 0xf4, 0xff, 0xfd, 0x3f, 0xff, 0x4f, 0xff, 0xd3, - 0xff, 0xf4, 0xff, 0xfd, 0x3f, 0xff, 0x4f, 0xff, - 0xd3, 0xff, 0xf4, 0xff, 0xfd, 0x3f, 0xff, 0x4f, - 0xff, 0xd3, 0xff, 0xf4, 0xff, 0xfd, 0x3f, 0xff, - 0x4f, 0xff, 0xd3, 0xff, 0xf4, 0xff, 0xfd, 0x3f, - 0xff, 0x4f, 0xff, 0xd3, 0xff, 0xf4, 0xff, 0xfd, - 0x3f, 0xff, 0x4f, 0xff, 0xd3, 0xff, 0xf4, 0xff, - 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2c, 0xdb, 0x0b, 0x36, 0xc2, 0xcd, - 0xb0, 0xb3, 0x6c, 0x2c, 0xdb, 0x0b, 0x36, 0xc2, - 0xcd, 0xf4, 0xfb, 0x6c, 0x2c, 0xdb, 0x0b, 0x36, - 0xc2, 0xcd, 0xb0, 0xb3, 0xed, 0x09, 0x00, 0x5c, - 0x02, 0x6c, 0x2c, 0xdb, 0x0b, 0x36, 0xc2, 0xcd, - 0xb0, 0xb7, 0xec, 0x2c, 0xdb, 0x0b, 0x37, 0xd2, - 0xcd, 0xf4, 0xb3, 0x6c, 0x3e, 0xdb, 0x0b, 0x36, - 0xc2, 0xcd, 0xb0, 0xb3, 0x6c, 0x2c, 0xdb, 0x0b, - 0x36, 0xc2, 0xcd, 0xb0, 0xb3, 0x6c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, - 0x3c, 0x4c, 0xcf, 0x13, 0x33, 0xc4, 0xcc, 0xf1, - 0x33, 0x3c, 0x4c, 0xcf, 0x13, 0x33, 0xf4, 0xfc, - 0xf1, 0x33, 0x3c, 0x4c, 0xcf, 0x13, 0x33, 0xc4, - 0xcc, 0xf1, 0x33, 0x3c, 0x4c, 0xcf, 0x13, 0x33, - 0xc4, 0xcf, 0xf1, 0x33, 0x3c, 0x4c, 0xcf, 0xd3, - 0x33, 0xf4, 0xcc, 0xf1, 0x3f, 0x3c, 0x4c, 0xcf, - 0x13, 0x33, 0xc4, 0xcc, 0xf1, 0x33, 0x3c, 0x4c, - 0xcf, 0x13, 0x33, 0xc4, 0xcc, 0xf1, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, - 0x7e, 0x4e, 0xdf, 0x93, 0xb7, 0xe4, 0xed, 0xf9, - 0x3b, 0x7e, 0x4e, 0xdf, 0x93, 0xb7, 0xe4, 0xfc, - 0x79, 0x3b, 0x78, 0x4e, 0xdf, 0x93, 0xb7, 0xe4, - 0xed, 0xf9, 0x3b, 0x7e, 0x4e, 0xdf, 0x93, 0xb7, - 0xe4, 0xef, 0xf9, 0x3b, 0x78, 0x4e, 0xdf, 0xd3, - 0xb7, 0xf4, 0xed, 0xf9, 0x3b, 0x7e, 0x4e, 0xdf, - 0x93, 0xb7, 0xe4, 0xec, 0x79, 0x3b, 0x7e, 0x4e, - 0xdf, 0x93, 0xb7, 0xe4, 0xed, 0xf9, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x84, 0x00, 0xa1, 0x00, 0x28, 0x40, 0x0a, 0x10, - 0x02, 0x84, 0x00, 0xa1, 0x00, 0x28, 0x40, 0x0a, - 0x10, 0x02, 0x84, 0x00, 0xa1, 0x8c, 0x28, 0x60, - 0x0a, 0x10, 0x02, 0x06, 0x24, 0x21, 0xc0, 0x08, - 0x60, 0x00, 0x14, 0x00, 0x47, 0x04, 0x20, 0x04, - 0x08, 0x40, 0x02, 0x54, 0x82, 0x84, 0x00, 0xa1, - 0x00, 0x28, 0x40, 0x0a, 0x10, 0x02, 0x84, 0x00, - 0xa1, 0x00, 0x28, 0x40, 0x0a, 0x10, 0x00, 0xed, - 0x09, 0x00, 0x5d, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, - 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, - 0x00, 0x01, 0x00, 0x00, 0x51, 0x00, 0x18, 0x00, - 0x07, 0x04, 0x01, 0x40, 0x20, 0x50, 0x08, 0x10, - 0x00, 0x47, 0x14, 0x01, 0x44, 0x20, 0x70, 0x00, - 0x14, 0x40, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x21, - 0x00, 0x08, 0x40, 0x02, 0x10, 0x00, 0x84, 0x00, - 0x21, 0x00, 0x88, 0x40, 0x22, 0x10, 0x08, 0x84, - 0x00, 0x21, 0x40, 0x08, 0x62, 0x22, 0x14, 0x00, - 0x85, 0x20, 0x11, 0x41, 0x20, 0x60, 0x01, 0x14, - 0x00, 0x85, 0x20, 0x91, 0x48, 0x28, 0x72, 0x0a, - 0x1c, 0x80, 0xc4, 0x00, 0x21, 0x00, 0x08, 0x40, - 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, - 0x40, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, - 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, - 0x00, 0x01, 0x8c, 0x00, 0x60, 0x00, 0x14, 0x00, - 0x04, 0x20, 0x81, 0x41, 0x20, 0x60, 0x01, 0x14, - 0x02, 0x07, 0x20, 0x01, 0x83, 0x20, 0x62, 0x00, - 0x1c, 0x80, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x02, 0x20, - 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x80, 0x02, - 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x83, - 0x32, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, - 0x80, 0x06, 0xed, 0x09, 0x00, 0x5e, 0x02, 0xa0, - 0x8d, 0x88, 0x23, 0x21, 0x08, 0x88, 0x01, 0x06, - 0x20, 0xc2, 0x84, 0x10, 0x22, 0x44, 0xc8, 0x83, - 0x12, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, - 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, - 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x02, 0x02, 0x00, 0x00, - 0x40, 0x00, 0x10, 0x01, 0x04, 0x82, 0x41, 0x00, - 0x40, 0xc0, 0x00, 0x33, 0x08, 0x0c, 0x02, 0x00, - 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, - 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, - 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, - 0x00, 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, - 0x88, 0x02, 0x22, 0x00, 0x08, 0x01, 0x06, 0x20, - 0xc0, 0xa8, 0x10, 0x20, 0x0c, 0xca, 0x83, 0x06, - 0xa0, 0xcb, 0xa0, 0x13, 0x22, 0x0c, 0x88, 0xc0, - 0x22, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, - 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x32, 0x80, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x80, - 0x00, 0xa0, 0x30, 0x28, 0x04, 0xc0, 0x01, 0x0a, - 0x80, 0x88, 0x84, 0x31, 0x20, 0x04, 0xc9, 0x03, - 0x10, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x5f, 0x02, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x84, - 0x02, 0xa1, 0x00, 0xa8, 0x40, 0x2a, 0x10, 0x0a, - 0x84, 0x02, 0xa1, 0x00, 0xa8, 0x40, 0x2a, 0x00, - 0x0a, 0x85, 0x02, 0xa1, 0x00, 0xa8, 0x40, 0x22, - 0x14, 0xc8, 0x05, 0x22, 0x11, 0x01, 0x88, 0x51, - 0x22, 0x10, 0x08, 0x44, 0x02, 0x01, 0x84, 0x84, - 0x10, 0x21, 0x1c, 0x0a, 0x84, 0x02, 0xb1, 0x00, - 0xa8, 0x40, 0x2a, 0x10, 0x0a, 0x84, 0x02, 0xa1, - 0x00, 0xa8, 0x40, 0x2a, 0x10, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x04, - 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, - 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x18, - 0x48, 0x06, 0x02, 0x11, 0x00, 0x80, 0x50, 0x28, - 0x14, 0x08, 0x04, 0x1a, 0x81, 0x41, 0x80, 0x52, - 0x20, 0x18, 0x08, 0x47, 0x0a, 0x01, 0xcc, 0x84, - 0x71, 0x29, 0x14, 0x08, 0x05, 0x02, 0x01, 0x00, - 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, - 0x00, 0x80, 0x40, 0x20, 0x10, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0x10, 0x00, - 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0x18, - 0x40, 0x85, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, - 0x10, 0x02, 0x05, 0x20, 0x21, 0x82, 0x08, 0x73, - 0x02, 0x14, 0x02, 0x45, 0x00, 0x21, 0x4e, 0x28, - 0x71, 0x02, 0x1c, 0x00, 0x86, 0x00, 0x21, 0x00, - 0x08, 0x40, 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, - 0x00, 0x08, 0x40, 0x02, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, - 0x30, 0x01, 0xcc, 0x00, 0x73, 0x00, 0x1c, 0xc0, - 0x07, 0x30, 0x01, 0x00, 0x00, 0x73, 0x00, 0x1c, - 0xc0, 0x07, 0x30, 0x01, 0xcc, 0x00, 0x60, 0x00, - 0x14, 0xd0, 0x07, 0x30, 0x01, 0x4e, 0x20, 0x63, - 0xed, 0x09, 0x00, 0x60, 0x02, 0x40, 0x18, 0xd0, - 0x46, 0x00, 0x81, 0x46, 0x20, 0x73, 0x40, 0x14, - 0xc0, 0x05, 0x30, 0x05, 0x00, 0x00, 0x73, 0x00, - 0x1c, 0xc0, 0x07, 0x30, 0x01, 0xcc, 0x00, 0x73, - 0x00, 0x1c, 0xc2, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x84, 0x00, 0x21, 0x00, - 0x08, 0x73, 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, - 0x00, 0x08, 0x40, 0x02, 0x10, 0x00, 0x84, 0x00, - 0x21, 0x00, 0x08, 0x52, 0x09, 0x1c, 0xf0, 0x84, - 0x00, 0x91, 0x48, 0x28, 0x40, 0x00, 0x18, 0x32, - 0x84, 0x38, 0xa1, 0x4c, 0x08, 0x40, 0x0a, 0x1c, - 0xc0, 0x44, 0x00, 0x31, 0xcc, 0x08, 0x73, 0x02, - 0x14, 0x80, 0x84, 0x00, 0x21, 0x00, 0x08, 0x73, - 0x02, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x20, 0x40, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x10, 0x00, 0x20, 0x21, 0x01, 0x14, 0x02, 0x01, - 0x00, 0x10, 0xc0, 0x00, 0x30, 0x09, 0x04, 0x00, - 0x07, 0x00, 0x41, 0xc0, 0x00, 0x10, 0x40, 0x18, - 0x02, 0x40, 0x00, 0x81, 0x00, 0x20, 0x40, 0x08, - 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x40, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, - 0x08, 0x40, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x20, 0x00, 0x08, 0x12, 0x0a, 0x18, 0x02, 0x82, - 0x0c, 0x00, 0xc9, 0x20, 0x10, 0x8a, 0x08, 0x00, - 0x87, 0x2c, 0xa1, 0x41, 0x00, 0x22, 0x0a, 0x14, - 0x00, 0x80, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, - 0x04, 0x80, 0x80, 0x00, 0x20, 0x00, 0x08, 0x40, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0xed, 0x09, 0x00, 0x61, 0x02, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x08, 0x0c, 0xc0, 0x02, 0x04, 0x00, 0x8a, - 0x00, 0x30, 0x40, 0x08, 0x00, 0x01, 0x30, 0x00, - 0x02, 0x24, 0x22, 0x48, 0x08, 0xc0, 0x00, 0x00, - 0x00, 0xcc, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, - 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x30, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x80, 0xb0, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x80, 0x80, 0x80, 0x00, - 0x00, 0x10, 0x10, 0x10, 0xd0, 0x80, 0x80, 0x80, - 0x00, 0x00, 0x10, 0x10, 0x10, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x19, 0x99, 0x91, 0xf8, 0xa1, 0xac, 0x80, - 0x28, 0xea, 0xf7, 0xad, 0xf7, 0x37, 0xed, 0x09, - 0x00, 0x62, 0x02, 0x13, 0x2a, 0xc0, 0x3c, 0x52, - 0xdc, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x26, 0x03, 0x81, 0xd3, 0x40, 0x1e, 0xa6, 0xc7, - 0x32, 0xd1, 0x47, 0x18, 0xd5, 0x00, 0x04, 0xea, - 0xbc, 0xa4, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0xe1, 0x52, 0x12, 0x08, 0xa2, 0x91, 0x32, - 0x14, 0x12, 0x11, 0x42, 0x91, 0x48, 0xb2, 0x01, - 0x81, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xbf, 0xbf, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xf7, 0xff, 0x7f, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xed, 0x09, 0x00, 0x63, 0x02, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x7d, - 0xfb, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xfe, - 0xff, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xdf, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x32, 0xfe, 0xf5, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xbf, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0x6f, 0x7f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf7, 0xfe, - 0xdf, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xbf, - 0xef, 0xff, 0xc0, 0x00, 0xed, 0x09, 0x00, 0x64, - 0x02, 0x00, 0x00, 0x00, 0x3f, 0xbf, 0xed, 0xfb, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xef, 0xff, 0xef, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x37, 0xfe, 0x7f, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x84, 0x00, 0xa1, 0x00, 0x28, 0x40, 0x0a, 0x10, - 0x02, 0x84, 0x00, 0xa1, 0x00, 0x28, 0x40, 0x0a, - 0x10, 0x02, 0x84, 0x00, 0xa1, 0x00, 0x28, 0x40, - 0x0a, 0x10, 0x02, 0x84, 0x00, 0xa1, 0x00, 0x28, - 0x40, 0x0a, 0x10, 0x02, 0x84, 0x00, 0xa1, 0x00, - 0x28, 0x40, 0x0a, 0x10, 0x02, 0x84, 0x00, 0xa1, - 0x00, 0x28, 0x40, 0x0a, 0x10, 0x02, 0x84, 0x00, - 0xa1, 0x00, 0x28, 0x40, 0x0a, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, - 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, - 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, - 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, - 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0xed, - 0x09, 0x00, 0x65, 0x02, 0x10, 0x00, 0x84, 0x00, - 0x21, 0x00, 0x08, 0x40, 0x02, 0x10, 0x00, 0x84, - 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0x10, 0x00, - 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0x10, - 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, - 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, - 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, - 0x40, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, - 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, 0x00, - 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x04, - 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, - 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x10, - 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, - 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x02, 0x20, - 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x80, 0x02, - 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x80, - 0x02, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, - 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, - 0x08, 0x80, 0x02, 0x20, 0x00, 0x08, 0x00, 0x22, - 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, - 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, - 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, - 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, - 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x02, 0xed, 0x09, 0x00, 0x66, 0x02, 0x00, - 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, - 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, - 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, 0x88, - 0x00, 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, 0x00, - 0x88, 0x00, 0x22, 0x00, 0x08, 0x80, 0x02, 0x20, - 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x80, 0x02, - 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, 0x80, - 0x02, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, 0x08, - 0x80, 0x02, 0x20, 0x00, 0x88, 0x00, 0x22, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, - 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, - 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x0a, 0x84, 0x02, 0xa1, 0x00, 0xa8, 0x40, - 0x2a, 0x10, 0x0a, 0x84, 0x02, 0xa1, 0x00, 0xa8, - 0x40, 0x2a, 0x1c, 0xca, 0x84, 0x02, 0xa1, 0x00, - 0xa8, 0x40, 0x2a, 0x1c, 0xca, 0x84, 0x02, 0xa1, - 0x00, 0xa8, 0x40, 0x2a, 0x10, 0x0a, 0x84, 0x02, - 0xa1, 0x00, 0xa8, 0x40, 0x2a, 0x10, 0x0a, 0x84, - 0x02, 0xa1, 0x00, 0xa8, 0x40, 0x2a, 0x10, 0x0a, - 0x84, 0x02, 0xa1, 0x00, 0xa8, 0x40, 0x2a, 0x10, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, - 0x20, 0x10, 0x08, 0x04, 0x02, 0xed, 0x09, 0x00, - 0x67, 0x02, 0x01, 0x00, 0x80, 0x40, 0x00, 0x10, - 0x00, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, - 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, - 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, - 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, - 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, - 0x00, 0x80, 0x40, 0x20, 0x10, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0x10, 0x00, - 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0x10, - 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, - 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, - 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, - 0x40, 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, - 0x08, 0x40, 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, - 0x00, 0x08, 0x40, 0x02, 0x10, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, - 0x30, 0x01, 0xcc, 0x00, 0x73, 0x00, 0x1c, 0xc0, - 0x07, 0x30, 0x01, 0xcc, 0x00, 0x73, 0x00, 0x1c, - 0xc0, 0x07, 0x30, 0x01, 0xcc, 0x00, 0x73, 0x00, - 0x1c, 0xc0, 0x07, 0x30, 0x01, 0xcc, 0x00, 0x73, - 0x00, 0x1c, 0xc0, 0x07, 0x30, 0x01, 0xcc, 0x00, - 0x73, 0x00, 0x1c, 0xc0, 0x07, 0x30, 0x01, 0x00, - 0x00, 0x73, 0x00, 0x1c, 0xc0, 0x07, 0x30, 0x01, - 0xcc, 0x00, 0x73, 0x00, 0x1c, 0xc2, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x84, - 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0x10, 0x00, - 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, 0x10, - 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, 0x02, - 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, - 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, - 0x40, 0x02, 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, - 0xed, 0x09, 0x00, 0x68, 0x02, 0x08, 0x40, 0x02, - 0x10, 0x00, 0x84, 0x00, 0x21, 0x00, 0x08, 0x40, - 0x02, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, - 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, - 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, - 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, - 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x20, - 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, - 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x80, - 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, - 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, - 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, - 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x69, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xed, 0x09, 0x00, 0x6b, 0x02, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, 0x00, - 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, - 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, - 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x3f, - 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, - 0x3f, 0xff, 0xff, 0xff, 0xed, 0x09, 0x00, 0x6c, - 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x20, - 0x01, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x44, - 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x09, 0x00, 0x6d, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x6e, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x6f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x70, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x71, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x72, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x73, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x74, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x09, 0x00, 0x75, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x76, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x77, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x78, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x79, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x7a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x7b, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x7c, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x09, 0x00, 0x7d, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x7e, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x30, 0x00, 0x20, 0x01, 0x02, - 0x02, 0x00, 0x00, 0x30, 0x00, 0x44, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x7f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x81, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x82, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x83, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x84, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x09, 0x00, 0x85, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x86, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x87, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x88, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x89, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x8a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x8b, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x8c, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x09, 0x00, 0x8d, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x8e, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x8f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x90, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x00, 0xed, 0x09, 0x00, 0x91, 0x02, - 0x00, 0x01, 0x00, 0x00, 0x93, 0x80, 0x30, 0x00, - 0x80, 0x01, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, - 0x40, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x00, 0x80, 0x01, 0x00, 0x00, - 0x00, 0x05, 0x30, 0x00, 0xa0, 0x01, 0x00, 0x00, - 0x01, 0x00, 0x30, 0x00, 0x00, 0x01, 0x00, 0x00, - 0xf8, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x00, 0x00, 0x70, 0x56, 0xaf, 0x12, 0xd7, - 0x35, 0x42, 0x01, 0x00, 0x00, 0x00, 0x20, 0xd0, - 0xb2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xea, 0xd0, - 0xb2, 0x03, 0x20, 0xf4, 0x17, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x20, 0x70, 0x65, 0x03, 0x20, 0x70, - 0x65, 0x03, 0x20, 0xf4, 0x17, 0x04, 0x20, 0x70, - 0x65, 0x03, 0x20, 0xf4, 0x17, 0x04, 0x20, 0x70, - 0x65, 0x03, 0x20, 0xbc, 0x65, 0x03, 0x20, 0xc0, - 0x65, 0x03, 0x20, 0xc4, 0x65, 0x03, 0x20, 0xec, - 0x66, 0x03, 0x20, 0x84, 0x65, 0x03, 0x20, 0x00, - 0x00, 0xa0, 0xe3, 0x10, 0x0f, 0x01, 0xee, 0x13, - 0xe0, 0xa0, 0xe3, 0xc0, 0xe0, 0x8e, 0xe2, 0x0e, - 0xf0, 0x21, 0xe1, 0x0e, 0xf0, 0x6f, 0xe1, 0x08, - 0x01, 0x9f, 0xe5, 0x00, 0xf0, 0xa0, 0xe1, 0x6a, - 0x00, 0x00, 0xeb, 0x5c, 0x00, 0x00, 0xeb, 0x4c, - 0x00, 0x1f, 0xe5, 0x04, 0x00, 0x80, 0xe2, 0x01, - 0x1a, 0xa0, 0xe3, 0x04, 0x10, 0x41, 0xe2, 0x01, - 0x20, 0x80, 0xe0, 0x03, 0x20, 0xc2, 0xe3, 0x00, - 0xa0, 0xa0, 0xe1, 0x50, 0x30, 0x1f, 0xe5, 0x00, - 0xa0, 0x83, 0xe5, 0x02, 0xd0, 0xa0, 0xe1, 0x60, - 0x30, 0x1f, 0xe5, 0x00, 0xd0, 0x83, 0xe5, 0x02, - 0x50, 0xa0, 0xe1, 0x01, 0x0a, 0xa0, 0xe3, 0x31, - 0x00, 0x00, 0xeb, 0x37, 0x00, 0x00, 0xeb, 0x3c, - 0x00, 0x00, 0xeb, 0x42, 0x00, 0x00, 0xeb, 0x05, - 0x20, 0xa0, 0xe1, 0x90, 0x30, 0x1f, 0xe5, 0x04, - 0x20, 0x82, 0xe2, 0x00, 0x20, 0x83, 0xe5, 0x02, - 0x1b, 0xa0, 0xe3, 0x03, 0x10, 0xc1, 0xe3, 0x01, - 0x20, 0x82, 0xe0, 0xa4, 0x30, 0x1f, 0xe5, 0x00, - 0x10, 0x83, 0xe5, 0x01, 0x10, 0xa0, 0xe3, 0xac, - 0x30, 0x1f, 0xe5, 0x00, 0x10, 0x83, 0xe5, 0x0f, - 0x00, 0x2d, 0xe9, 0xb3, 0xd5, 0x00, 0xeb, 0x63, - 0x45, 0xed, 0x09, 0x00, 0x01, 0x00, 0x00, 0xeb, - 0xb4, 0xd5, 0x00, 0xeb, 0x0f, 0x00, 0xbd, 0xe8, - 0x02, 0x00, 0xa0, 0xe1, 0xb4, 0xd5, 0x00, 0xea, - 0x02, 0x00, 0x2d, 0xe9, 0x00, 0x10, 0x4f, 0xe1, - 0x80, 0x00, 0x11, 0xe3, 0x02, 0x00, 0xbd, 0xe8, - 0x04, 0xf0, 0x5e, 0x12, 0x0f, 0x00, 0x2d, 0xe9, - 0x04, 0x30, 0x4e, 0xe2, 0x59, 0x48, 0x00, 0xeb, - 0xae, 0xd5, 0x00, 0xeb, 0x9d, 0x48, 0x00, 0xea, - 0x02, 0x00, 0x2d, 0xe9, 0x00, 0x10, 0x4f, 0xe1, - 0x40, 0x00, 0x11, 0xe3, 0x02, 0x00, 0xbd, 0xe8, - 0x04, 0xf0, 0x5e, 0x12, 0x0f, 0x00, 0x2d, 0xe9, - 0x04, 0x30, 0x4e, 0xe2, 0x4f, 0x48, 0x00, 0xeb, - 0xa7, 0xd5, 0x00, 0xeb, 0x93, 0x48, 0x00, 0xea, - 0x00, 0x00, 0xa0, 0xe3, 0x10, 0x0f, 0x01, 0xee, - 0x00, 0x00, 0xa0, 0xe3, 0x0e, 0x12, 0xa0, 0xe3, - 0x00, 0x00, 0x81, 0xe5, 0x00, 0xf0, 0xa0, 0xe1, - 0xf8, 0xff, 0xff, 0xea, 0x5c, 0x00, 0x00, 0x20, - 0x02, 0x0b, 0x80, 0xe2, 0xd2, 0x10, 0xa0, 0xe3, - 0x01, 0xf0, 0x21, 0xe1, 0x00, 0xd0, 0xa0, 0xe1, - 0xd3, 0x10, 0xa0, 0xe3, 0x01, 0xf0, 0x21, 0xe1, - 0x1e, 0xff, 0x2f, 0xe1, 0xd1, 0x10, 0xa0, 0xe3, - 0x01, 0xf0, 0x21, 0xe1, 0x00, 0xd0, 0xa0, 0xe1, - 0xd3, 0x10, 0xa0, 0xe3, 0x01, 0xf0, 0x21, 0xe1, - 0x1e, 0xff, 0x2f, 0xe1, 0x02, 0x0b, 0x80, 0xe2, - 0xd7, 0x10, 0xa0, 0xe3, 0x01, 0xf0, 0x21, 0xe1, - 0x00, 0xd0, 0xa0, 0xe1, 0xd3, 0x10, 0xa0, 0xe3, - 0x01, 0xf0, 0x21, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, - 0x02, 0x0b, 0x80, 0xe2, 0xdb, 0x10, 0xa0, 0xe3, - 0x01, 0xf0, 0x21, 0xe1, 0x00, 0xd0, 0xa0, 0xe1, - 0xd3, 0x10, 0xa0, 0xe3, 0x01, 0xf0, 0x21, 0xe1, - 0x1e, 0xff, 0x2f, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, - 0x24, 0x00, 0x9f, 0xe5, 0x24, 0x10, 0x9f, 0xe5, - 0x00, 0x00, 0x90, 0xe5, 0xed, 0x09, 0x00, 0x02, - 0x00, 0x00, 0x10, 0x91, 0xe5, 0x00, 0x20, 0xa0, - 0xe3, 0x01, 0x00, 0x50, 0xe1, 0x1e, 0xff, 0x2f, - 0x21, 0x04, 0x20, 0x80, 0xe4, 0x01, 0x00, 0x50, - 0xe1, 0xfc, 0xff, 0xff, 0x3a, 0x1e, 0xff, 0x2f, - 0xe1, 0x04, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, - 0x20, 0x30, 0x00, 0x9f, 0xe5, 0x14, 0x20, 0x1f, - 0xe5, 0x00, 0x10, 0x90, 0xe5, 0x28, 0x00, 0x9f, - 0xe5, 0x00, 0x00, 0x90, 0xe5, 0x00, 0x30, 0x92, - 0xe5, 0x03, 0x00, 0x50, 0xe1, 0x1e, 0xff, 0x2f, - 0x21, 0x04, 0x30, 0x91, 0xe4, 0x04, 0x30, 0x80, - 0xe4, 0x00, 0x30, 0x92, 0xe5, 0x03, 0x00, 0x50, - 0xe1, 0xfa, 0xff, 0xff, 0x3a, 0x1e, 0xff, 0x2f, - 0xe1, 0x10, 0x00, 0x00, 0x20, 0x14, 0x00, 0x00, - 0x20, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, 0xa0, - 0xe3, 0xa1, 0xc1, 0x70, 0xe0, 0x20, 0x00, 0x00, - 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x0f, 0x00, 0x00, - 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x24, 0x82, - 0xe3, 0x21, 0xc2, 0x70, 0xe0, 0x17, 0x00, 0x00, - 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x09, 0x00, 0x00, - 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x28, 0x82, - 0xe3, 0x21, 0xc4, 0x70, 0xe0, 0x00, 0x04, 0xa0, - 0x21, 0xff, 0x2c, 0x82, 0x23, 0x21, 0xc2, 0x70, - 0xe0, 0x0e, 0x00, 0x00, 0x3a, 0x00, 0xc0, 0x70, - 0xe2, 0x32, 0x01, 0x00, 0x2a, 0x20, 0x04, 0xa0, - 0x21, 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, 0x41, - 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, 0x70, - 0xe0, 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, - 0xe0, 0xa1, 0xc2, 0x70, 0xe0, 0x80, 0x12, 0x41, - 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc2, 0x70, - 0xe0, 0x00, 0x12, 0x41, 0x20, 0x02, 0x20, 0xa2, - 0xe0, 0xa1, 0xc1, 0x70, 0xe0, 0x80, 0x11, 0x41, - 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc1, 0xed, - 0x09, 0x00, 0x03, 0x00, 0x70, 0xe0, 0x00, 0x11, - 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc0, - 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, 0x02, 0x20, - 0xa2, 0xe0, 0x01, 0xc0, 0x70, 0xe0, 0x00, 0x10, - 0x41, 0x20, 0x02, 0x20, 0xb2, 0xe0, 0xe5, 0xff, - 0xff, 0x2a, 0x02, 0x00, 0xa0, 0xe1, 0x1e, 0xff, - 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x01, 0xe0, - 0x8e, 0xe3, 0x01, 0x40, 0x2d, 0xe9, 0x04, 0x20, - 0x52, 0xe2, 0x1c, 0x00, 0x00, 0x4a, 0x03, 0xc0, - 0x10, 0xe2, 0x23, 0x00, 0x00, 0x1a, 0xff, 0x10, - 0x01, 0xe2, 0x01, 0x14, 0x81, 0xe1, 0x01, 0x18, - 0x81, 0xe1, 0x01, 0x30, 0xa0, 0xe1, 0x01, 0xc0, - 0xa0, 0xe1, 0x01, 0xe0, 0xa0, 0xe1, 0x08, 0x20, - 0x52, 0xe2, 0x0c, 0x00, 0x00, 0xba, 0x14, 0x20, - 0x52, 0xe2, 0x06, 0x00, 0x00, 0xba, 0x0a, 0x50, - 0xa0, 0xe8, 0x0a, 0x50, 0xa0, 0xe8, 0x20, 0x20, - 0x52, 0xe2, 0xfb, 0xff, 0xff, 0xaa, 0x10, 0x00, - 0x72, 0xe3, 0x0a, 0x50, 0xa0, 0xa8, 0x10, 0x20, - 0x42, 0xa2, 0x14, 0x20, 0x92, 0xe2, 0x08, 0x50, - 0xa0, 0xa8, 0x0c, 0x20, 0x52, 0xa2, 0xfc, 0xff, - 0xff, 0xaa, 0x08, 0x20, 0x92, 0xe2, 0x03, 0x00, - 0x00, 0xba, 0x04, 0x20, 0x52, 0xe2, 0x04, 0x10, - 0x80, 0xb4, 0x0a, 0x00, 0xa0, 0xa8, 0x04, 0x20, - 0x42, 0xa2, 0x04, 0x20, 0x92, 0xe2, 0x01, 0x40, - 0xbd, 0x08, 0x1e, 0xff, 0x2f, 0x01, 0x02, 0x00, - 0x52, 0xe3, 0x01, 0x10, 0xc0, 0xe4, 0x01, 0x10, - 0xc0, 0xa4, 0x01, 0x10, 0xc0, 0xc4, 0x01, 0x40, - 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, 0x04, 0xc0, - 0x6c, 0xe2, 0x02, 0x00, 0x5c, 0xe3, 0x01, 0x10, - 0xc0, 0xe4, 0x01, 0x10, 0xc0, 0xa4, 0x01, 0x10, - 0xc0, 0xc4, 0x0c, 0x20, 0x52, 0xe0, 0xef, 0xff, - 0xff, 0xba, 0xd3, 0xff, 0xff, 0xea, 0x00, 0x47, - 0x08, 0x47, 0xed, 0x09, 0x00, 0x04, 0x00, 0x10, - 0x47, 0x18, 0x47, 0x20, 0x47, 0x28, 0x47, 0x30, - 0x47, 0x38, 0x47, 0x78, 0x47, 0x00, 0x00, 0x03, - 0x00, 0x51, 0xe1, 0x01, 0x00, 0xa0, 0xb3, 0x00, - 0x00, 0xa0, 0xc3, 0x1e, 0xff, 0x2f, 0x11, 0x02, - 0x00, 0x50, 0xe1, 0x01, 0x00, 0xa0, 0x33, 0x00, - 0x00, 0xa0, 0x23, 0x1e, 0xff, 0x2f, 0xe1, 0x78, - 0x47, 0x00, 0x00, 0x02, 0x00, 0x70, 0xe0, 0x00, - 0x10, 0xe1, 0xe2, 0x1e, 0xff, 0x2f, 0xe1, 0x78, - 0x47, 0x00, 0x00, 0x01, 0xe0, 0x8e, 0xe3, 0x01, - 0x40, 0x2d, 0xe9, 0x04, 0x20, 0x52, 0xe2, 0x20, - 0x00, 0x00, 0xba, 0x03, 0xc0, 0x10, 0xe2, 0x2a, - 0x00, 0x00, 0x1a, 0x03, 0xc0, 0x11, 0xe2, 0x34, - 0x00, 0x00, 0x1a, 0x08, 0x20, 0x52, 0xe2, 0x12, - 0x00, 0x00, 0xba, 0x14, 0x20, 0x52, 0xe2, 0x0b, - 0x00, 0x00, 0xba, 0x10, 0x00, 0x2d, 0xe9, 0x18, - 0x50, 0xb1, 0xe8, 0x18, 0x50, 0xa0, 0xe8, 0x18, - 0x50, 0xb1, 0xe8, 0x18, 0x50, 0xa0, 0xe8, 0x20, - 0x20, 0x52, 0xe2, 0xf9, 0xff, 0xff, 0xaa, 0x10, - 0x00, 0x72, 0xe3, 0x18, 0x50, 0xb1, 0xa8, 0x18, - 0x50, 0xa0, 0xa8, 0x10, 0x20, 0x42, 0xa2, 0x10, - 0x00, 0xbd, 0xe8, 0x14, 0x20, 0x92, 0xe2, 0x08, - 0x50, 0xb1, 0xa8, 0x08, 0x50, 0xa0, 0xa8, 0x0c, - 0x20, 0x52, 0xa2, 0xfb, 0xff, 0xff, 0xaa, 0x08, - 0x20, 0x92, 0xe2, 0x05, 0x00, 0x00, 0xba, 0x04, - 0x20, 0x52, 0xe2, 0x04, 0x30, 0x91, 0xb4, 0x04, - 0x30, 0x80, 0xb4, 0x08, 0x10, 0xb1, 0xa8, 0x08, - 0x10, 0xa0, 0xa8, 0x04, 0x20, 0x42, 0xa2, 0x04, - 0x20, 0x92, 0xe2, 0x01, 0x40, 0xbd, 0x08, 0x1e, - 0xff, 0x2f, 0x01, 0x02, 0x00, 0x52, 0xe3, 0x01, - 0x30, 0xd1, 0xe4, 0x01, 0x30, 0xc0, 0xe4, 0x01, - 0x30, 0xd1, 0xa4, 0x01, 0x30, 0xc0, 0xa4, 0x01, - 0x30, 0xd1, 0xc4, 0x01, 0x30, 0xed, 0x09, 0x00, - 0x05, 0x00, 0xc0, 0xc4, 0x01, 0x40, 0xbd, 0xe8, - 0x1e, 0xff, 0x2f, 0xe1, 0x04, 0xc0, 0x6c, 0xe2, - 0x02, 0x00, 0x5c, 0xe3, 0x01, 0x30, 0xd1, 0xe4, - 0x01, 0x30, 0xc0, 0xe4, 0x01, 0x30, 0xd1, 0xa4, - 0x01, 0x30, 0xc0, 0xa4, 0x01, 0x30, 0xd1, 0xc4, - 0x01, 0x30, 0xc0, 0xc4, 0x0c, 0x20, 0x52, 0xe0, - 0xe9, 0xff, 0xff, 0xba, 0x03, 0xc0, 0x11, 0xe2, - 0xca, 0xff, 0xff, 0x0a, 0x03, 0x10, 0xc1, 0xe3, - 0x04, 0xe0, 0x91, 0xe4, 0x02, 0x00, 0x5c, 0xe3, - 0x36, 0x00, 0x00, 0xca, 0x1a, 0x00, 0x00, 0x0a, - 0x0c, 0x00, 0x52, 0xe3, 0x10, 0x00, 0x00, 0xba, - 0x0c, 0x20, 0x42, 0xe2, 0x30, 0x00, 0x2d, 0xe9, - 0x2e, 0x34, 0xa0, 0xe1, 0x30, 0x50, 0xb1, 0xe8, - 0x04, 0x3c, 0x83, 0xe1, 0x24, 0x44, 0xa0, 0xe1, - 0x05, 0x4c, 0x84, 0xe1, 0x25, 0x54, 0xa0, 0xe1, - 0x0c, 0x5c, 0x85, 0xe1, 0x2c, 0xc4, 0xa0, 0xe1, - 0x0e, 0xcc, 0x8c, 0xe1, 0x38, 0x10, 0xa0, 0xe8, - 0x10, 0x20, 0x52, 0xe2, 0xf3, 0xff, 0xff, 0xaa, - 0x30, 0x00, 0xbd, 0xe8, 0x0c, 0x20, 0x92, 0xe2, - 0x05, 0x00, 0x00, 0xba, 0x2e, 0xc4, 0xa0, 0xe1, - 0x04, 0xe0, 0x91, 0xe4, 0x0e, 0xcc, 0x8c, 0xe1, - 0x04, 0xc0, 0x80, 0xe4, 0x04, 0x20, 0x52, 0xe2, - 0xf9, 0xff, 0xff, 0xaa, 0x03, 0x10, 0x41, 0xe2, - 0xc7, 0xff, 0xff, 0xea, 0x0c, 0x00, 0x52, 0xe3, - 0x10, 0x00, 0x00, 0xba, 0x0c, 0x20, 0x42, 0xe2, - 0x30, 0x00, 0x2d, 0xe9, 0x2e, 0x38, 0xa0, 0xe1, - 0x30, 0x50, 0xb1, 0xe8, 0x04, 0x38, 0x83, 0xe1, - 0x24, 0x48, 0xa0, 0xe1, 0x05, 0x48, 0x84, 0xe1, - 0x25, 0x58, 0xa0, 0xe1, 0x0c, 0x58, 0x85, 0xe1, - 0x2c, 0xc8, 0xa0, 0xe1, 0x0e, 0xc8, 0x8c, 0xe1, - 0x38, 0x10, 0xa0, 0xe8, 0x10, 0x20, 0x52, 0xe2, - 0xf3, 0xff, 0xff, 0xaa, 0x30, 0x00, 0xbd, 0xe8, - 0xed, 0x09, 0x00, 0x06, 0x00, 0x0c, 0x20, 0x92, - 0xe2, 0x05, 0x00, 0x00, 0xba, 0x2e, 0xc8, 0xa0, - 0xe1, 0x04, 0xe0, 0x91, 0xe4, 0x0e, 0xc8, 0x8c, - 0xe1, 0x04, 0xc0, 0x80, 0xe4, 0x04, 0x20, 0x52, - 0xe2, 0xf9, 0xff, 0xff, 0xaa, 0x02, 0x10, 0x41, - 0xe2, 0xac, 0xff, 0xff, 0xea, 0x0c, 0x00, 0x52, - 0xe3, 0x10, 0x00, 0x00, 0xba, 0x0c, 0x20, 0x42, - 0xe2, 0x30, 0x00, 0x2d, 0xe9, 0x2e, 0x3c, 0xa0, - 0xe1, 0x30, 0x50, 0xb1, 0xe8, 0x04, 0x34, 0x83, - 0xe1, 0x24, 0x4c, 0xa0, 0xe1, 0x05, 0x44, 0x84, - 0xe1, 0x25, 0x5c, 0xa0, 0xe1, 0x0c, 0x54, 0x85, - 0xe1, 0x2c, 0xcc, 0xa0, 0xe1, 0x0e, 0xc4, 0x8c, - 0xe1, 0x38, 0x10, 0xa0, 0xe8, 0x10, 0x20, 0x52, - 0xe2, 0xf3, 0xff, 0xff, 0xaa, 0x30, 0x00, 0xbd, - 0xe8, 0x0c, 0x20, 0x92, 0xe2, 0x05, 0x00, 0x00, - 0xba, 0x2e, 0xcc, 0xa0, 0xe1, 0x04, 0xe0, 0x91, - 0xe4, 0x0e, 0xc4, 0x8c, 0xe1, 0x04, 0xc0, 0x80, - 0xe4, 0x04, 0x20, 0x52, 0xe2, 0xf9, 0xff, 0xff, - 0xaa, 0x01, 0x10, 0x41, 0xe2, 0x91, 0xff, 0xff, - 0xea, 0x78, 0x47, 0x00, 0x00, 0x03, 0x00, 0x51, - 0xe1, 0x02, 0x00, 0x50, 0x01, 0x01, 0x00, 0xa0, - 0x03, 0x00, 0x00, 0xa0, 0x13, 0x1e, 0xff, 0x2f, - 0xe1, 0x78, 0x47, 0x00, 0x00, 0x0a, 0x10, 0x40, - 0xe2, 0x20, 0x01, 0x40, 0xe0, 0x20, 0x02, 0x80, - 0xe0, 0x20, 0x04, 0x80, 0xe0, 0x20, 0x08, 0x80, - 0xe0, 0xa0, 0x01, 0xa0, 0xe1, 0x00, 0x21, 0x80, - 0xe0, 0x82, 0x10, 0x51, 0xe0, 0x01, 0x00, 0x80, - 0x52, 0x0a, 0x10, 0x81, 0x42, 0x1e, 0xff, 0x2f, - 0xe1, 0x78, 0x47, 0x00, 0x00, 0x00, 0x30, 0xa0, - 0xe3, 0x38, 0x00, 0x00, 0xea, 0x78, 0x47, 0x00, - 0x00, 0x03, 0x00, 0x10, 0xe3, 0x03, 0x00, 0x11, - 0x03, 0x17, 0x00, 0x00, 0x1a, 0x04, 0xe0, 0x2d, - 0xe5, 0x84, 0xe0, 0xed, 0x09, 0x00, 0x07, 0x00, - 0x9f, 0xe5, 0x04, 0x20, 0x90, 0xe4, 0x04, 0x30, - 0x91, 0xe4, 0x0e, 0xc0, 0x42, 0xe0, 0x02, 0xc0, - 0xcc, 0xe1, 0x8e, 0xc3, 0x1c, 0xe0, 0x03, 0x00, - 0x52, 0x01, 0xf8, 0xff, 0xff, 0x0a, 0x04, 0xe0, - 0x9d, 0xe4, 0x03, 0x0c, 0xa0, 0xe1, 0x02, 0x0c, - 0x50, 0xe0, 0xff, 0x0e, 0x1c, 0x03, 0x07, 0x00, - 0x00, 0x1a, 0x03, 0x08, 0xa0, 0xe1, 0x02, 0x08, - 0x50, 0xe0, 0xff, 0x0c, 0x1c, 0x03, 0x03, 0x00, - 0x00, 0x1a, 0x03, 0x04, 0xa0, 0xe1, 0x02, 0x04, - 0x50, 0xe0, 0xff, 0x08, 0x1c, 0x03, 0x02, 0x00, - 0x53, 0x00, 0x60, 0x00, 0xa0, 0x11, 0x1e, 0xff, - 0x2f, 0xe1, 0x01, 0x20, 0xd0, 0xe4, 0x01, 0x30, - 0xd1, 0xe4, 0x01, 0x00, 0x52, 0xe3, 0x03, 0x00, - 0x52, 0x21, 0x04, 0x00, 0x00, 0x1a, 0x01, 0x20, - 0xd0, 0xe4, 0x01, 0x30, 0xd1, 0xe4, 0x01, 0x00, - 0x52, 0xe3, 0x03, 0x00, 0x52, 0x21, 0xf5, 0xff, - 0xff, 0x0a, 0x03, 0x00, 0x42, 0xe0, 0x1e, 0xff, - 0x2f, 0xe1, 0x01, 0x01, 0x01, 0x01, 0x78, 0x47, - 0x00, 0x00, 0x2c, 0xc0, 0x9f, 0xe5, 0xff, 0x7f, - 0x8c, 0xe8, 0x3c, 0xc0, 0x8c, 0xe2, 0x0c, 0x00, - 0x8f, 0xe2, 0x3c, 0x10, 0x4c, 0xe2, 0x04, 0xe0, - 0x4e, 0xe2, 0x00, 0xe0, 0x8c, 0xe5, 0x74, 0xfe, - 0xff, 0xea, 0x20, 0x00, 0x00, 0x80, 0x44, 0x69, - 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, - 0x7a, 0x65, 0x72, 0x6f, 0x00, 0x00, 0x60, 0x01, - 0x00, 0x20, 0x78, 0x47, 0x00, 0x00, 0x70, 0x40, - 0x2d, 0xe9, 0x00, 0xe0, 0xa0, 0xe1, 0x2e, 0x58, - 0xa0, 0xe1, 0x05, 0x48, 0xce, 0xe1, 0x22, 0xc8, - 0xa0, 0xe1, 0x0c, 0x68, 0xc2, 0xe1, 0x94, 0x06, - 0x00, 0xe0, 0x9c, 0x04, 0x04, 0xe0, 0x95, 0x0c, - 0x0c, 0xe0, 0x96, 0x05, 0x05, 0xe0, 0x04, 0x08, - 0x90, 0xe0, 0x24, 0xc8, 0xac, 0xe0, 0xed, 0x09, - 0x00, 0x08, 0x00, 0x05, 0x08, 0x90, 0xe0, 0x25, - 0xc8, 0xac, 0xe0, 0x92, 0xc1, 0x21, 0xe0, 0x93, - 0x1e, 0x21, 0xe0, 0x70, 0x40, 0xbd, 0xe8, 0x1e, - 0xff, 0x2f, 0xe1, 0xf0, 0xb5, 0x83, 0xb0, 0x8d, - 0x01, 0x04, 0x1c, 0x01, 0x20, 0x0f, 0x1c, 0x29, - 0x1c, 0x25, 0xf0, 0x7b, 0xf9, 0x31, 0x4e, 0x00, - 0x28, 0xf0, 0x60, 0x05, 0xd1, 0x1f, 0x20, 0xc0, - 0x43, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x0b, 0x22, 0x01, 0x92, 0x38, 0x21, 0x02, - 0x1c, 0x00, 0x91, 0x2b, 0xa1, 0x2a, 0x48, 0x2b, - 0x1c, 0x26, 0xf0, 0x45, 0xf8, 0x00, 0x28, 0xef, - 0xd1, 0x00, 0x2c, 0x47, 0xd1, 0x01, 0x37, 0xb8, - 0x00, 0x04, 0x1c, 0x25, 0xf0, 0x4c, 0xf9, 0x35, - 0x1c, 0x03, 0x1c, 0x30, 0x60, 0x02, 0xd1, 0x1f, - 0x20, 0xc0, 0x43, 0xe1, 0xe7, 0x06, 0x22, 0x01, - 0x21, 0x07, 0x20, 0x02, 0x92, 0x1a, 0x1c, 0x00, - 0x90, 0x01, 0x91, 0x20, 0xa1, 0x1f, 0x48, 0x3b, - 0x1c, 0x26, 0xf0, 0x8d, 0xf9, 0x00, 0x28, 0xd3, - 0xd1, 0x20, 0x1c, 0x25, 0xf0, 0x34, 0xf9, 0x68, - 0x60, 0x06, 0x1c, 0x02, 0xd1, 0x1f, 0x20, 0xc0, - 0x43, 0xca, 0xe7, 0x06, 0x22, 0x01, 0x21, 0x07, - 0x20, 0x02, 0x92, 0x32, 0x1c, 0x00, 0x90, 0x01, - 0x91, 0x19, 0xa1, 0x17, 0x48, 0x3b, 0x1c, 0x26, - 0xf0, 0x76, 0xf9, 0x00, 0x28, 0xbc, 0xd1, 0x20, - 0x1c, 0x25, 0xf0, 0x1d, 0xf9, 0xa8, 0x60, 0x04, - 0x1c, 0x02, 0xd1, 0x1f, 0x20, 0xc0, 0x43, 0xb3, - 0xe7, 0x06, 0x22, 0x01, 0x21, 0x07, 0x20, 0x02, - 0x92, 0x22, 0x1c, 0x00, 0x90, 0x01, 0x91, 0x11, - 0xa1, 0x10, 0x48, 0x3b, 0x1c, 0x26, 0xf0, 0x5f, - 0xf9, 0x00, 0x28, 0xa5, 0xd1, 0x00, 0x20, 0xa3, - 0xe7, 0x00, 0x00, 0xdc, 0x6c, 0x03, 0x20, 0xf0, - 0xe2, 0x03, 0x20, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0xed, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x18, 0xe2, 0x03, 0x20, 0x54, 0x6f, 0x4c, 0x43, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x00, 0x00, - 0x60, 0xe2, 0x03, 0x20, 0x54, 0x6f, 0x4c, 0x4d, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x00, 0x00, - 0xa8, 0xe2, 0x03, 0x20, 0x54, 0x6f, 0x48, 0x43, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x00, 0x00, - 0x80, 0xb5, 0x83, 0xb0, 0x16, 0x4f, 0x00, 0x22, - 0x00, 0x92, 0x01, 0x22, 0x38, 0x1c, 0x02, 0xa9, - 0x01, 0xab, 0x26, 0xf0, 0xcb, 0xfa, 0x00, 0x28, - 0xf5, 0xd0, 0x12, 0x4f, 0x00, 0x22, 0x00, 0x92, - 0x01, 0x22, 0x38, 0x1c, 0x02, 0xa9, 0x01, 0xab, - 0x26, 0xf0, 0xc0, 0xfa, 0x00, 0x28, 0xf5, 0xd0, - 0x0d, 0x4f, 0x00, 0x22, 0x00, 0x92, 0x01, 0x22, - 0x38, 0x1c, 0x02, 0xa9, 0x01, 0xab, 0x26, 0xf0, - 0xb5, 0xfa, 0x00, 0x28, 0xf5, 0xd0, 0x09, 0x48, - 0x26, 0xf0, 0x0c, 0xf8, 0x08, 0x4f, 0xf8, 0x68, - 0x25, 0xf0, 0xe8, 0xf8, 0x00, 0x20, 0xf8, 0x60, - 0x03, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xa8, 0xe2, 0x03, 0x20, 0x60, 0xe2, 0x03, 0x20, - 0x18, 0xe2, 0x03, 0x20, 0xf0, 0xe2, 0x03, 0x20, - 0xdc, 0x6c, 0x03, 0x20, 0x80, 0xb5, 0x82, 0xb0, - 0x68, 0x23, 0x58, 0x43, 0x07, 0x1c, 0x25, 0xf0, - 0xa5, 0xf8, 0x0b, 0x49, 0x00, 0x28, 0x08, 0x61, - 0x05, 0xd1, 0x1f, 0x20, 0xc0, 0x43, 0x02, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x0b, 0x22, - 0x01, 0x92, 0x60, 0x21, 0x02, 0x1c, 0x00, 0x91, - 0x05, 0xa1, 0x04, 0x48, 0x3b, 0x1c, 0x25, 0xf0, - 0x81, 0xff, 0x00, 0x28, 0xef, 0xd1, 0xee, 0xe7, - 0xdc, 0x6c, 0x03, 0x20, 0x2c, 0xe3, 0x03, 0x20, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x00, - 0x80, 0xb5, 0x06, 0x48, 0x25, 0xf0, 0xce, 0xff, - 0x05, 0x4f, 0x38, 0x69, 0xed, 0x09, 0x00, 0x0a, - 0x00, 0x25, 0xf0, 0xaa, 0xf8, 0x00, 0x20, 0x38, - 0x61, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x2c, 0xe3, 0x03, 0x20, 0xdc, 0x6c, 0x03, - 0x20, 0x90, 0xb5, 0x82, 0xb0, 0x21, 0x48, 0x25, - 0xf0, 0x6f, 0xf8, 0x21, 0x4c, 0x1f, 0x27, 0xff, - 0x43, 0x00, 0x28, 0x60, 0x61, 0x04, 0xd1, 0x38, - 0x1c, 0x02, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x22, 0x21, 0x0b, 0x22, 0x01, 0x92, 0x02, - 0x1c, 0x00, 0x91, 0x1b, 0xa1, 0x19, 0x48, 0x17, - 0x4b, 0x25, 0xf0, 0x4a, 0xff, 0x00, 0x28, 0xef, - 0xd1, 0x19, 0x48, 0x25, 0xf0, 0x55, 0xf8, 0xa0, - 0x61, 0x00, 0x28, 0x01, 0xd1, 0x38, 0x1c, 0xe7, - 0xe7, 0xbd, 0x21, 0x0b, 0x22, 0x01, 0x92, 0x02, - 0x1c, 0x00, 0x91, 0x15, 0xa1, 0x13, 0x48, 0x12, - 0x4b, 0x25, 0xf0, 0x36, 0xff, 0x00, 0x28, 0xdb, - 0xd1, 0x79, 0x20, 0x80, 0x01, 0x25, 0xf0, 0x40, - 0xf8, 0xe0, 0x61, 0x00, 0x28, 0x01, 0xd1, 0x38, - 0x1c, 0xd2, 0xe7, 0xff, 0x21, 0x59, 0x31, 0x0b, - 0x22, 0x01, 0x92, 0x02, 0x1c, 0x79, 0x23, 0x00, - 0x91, 0x0c, 0xa1, 0x9b, 0x01, 0x0a, 0x48, 0x25, - 0xf0, 0x1f, 0xff, 0xc5, 0xe7, 0x60, 0x27, 0x00, - 0x00, 0xdc, 0x6c, 0x03, 0x20, 0x68, 0xe3, 0x03, - 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x00, - 0x00, 0x52, 0x20, 0x00, 0x00, 0xa4, 0xe3, 0x03, - 0x20, 0x4d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x00, - 0x00, 0xe0, 0xe3, 0x03, 0x20, 0x4c, 0x61, 0x72, - 0x67, 0x65, 0x00, 0x00, 0x00, 0x90, 0xb5, 0x0d, - 0x48, 0x25, 0xf0, 0x5e, 0xff, 0x0c, 0x48, 0x25, - 0xf0, 0x5b, 0xff, 0x0c, 0x48, 0x25, 0xf0, 0x58, - 0xff, 0x0b, 0x4f, 0xf8, 0x69, 0x25, 0xf0, 0x34, - 0xf8, 0x00, 0x24, 0xfc, 0x61, 0xb8, 0x69, 0x25, - 0xf0, 0x2f, 0xf8, 0xbc, 0x61, 0x78, 0x69, 0xed, - 0x09, 0x00, 0x0b, 0x00, 0x25, 0xf0, 0x2b, 0xf8, - 0x7c, 0x61, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xe0, 0xe3, 0x03, 0x20, 0xa4, 0xe3, - 0x03, 0x20, 0x68, 0xe3, 0x03, 0x20, 0xdc, 0x6c, - 0x03, 0x20, 0x98, 0xb5, 0x07, 0x1c, 0x12, 0xf0, - 0x24, 0xf9, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x22, - 0x01, 0xe0, 0x00, 0x22, 0xd2, 0x43, 0x00, 0x24, - 0x22, 0x2f, 0x01, 0xd8, 0x0c, 0x48, 0x08, 0xe0, - 0xbd, 0x2f, 0x01, 0xd8, 0x0b, 0x48, 0x04, 0xe0, - 0xff, 0x23, 0x59, 0x33, 0x9f, 0x42, 0x09, 0xd8, - 0x09, 0x48, 0x69, 0x46, 0x25, 0xf0, 0x77, 0xff, - 0x00, 0x28, 0x05, 0xd0, 0x20, 0x1c, 0x98, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x20, 0x1c, 0xfa, 0xe7, - 0x00, 0x98, 0xf8, 0xe7, 0x00, 0x00, 0x68, 0xe3, - 0x03, 0x20, 0xa4, 0xe3, 0x03, 0x20, 0xe0, 0xe3, - 0x03, 0x20, 0x00, 0xb5, 0x25, 0xf0, 0xbf, 0xff, - 0x08, 0xbc, 0x18, 0x47, 0x08, 0xb5, 0x69, 0x46, - 0x00, 0x22, 0x0f, 0x48, 0x25, 0xf0, 0x5b, 0xff, - 0x22, 0x23, 0xd8, 0x42, 0x0b, 0xd1, 0x00, 0x20, - 0x14, 0xf0, 0x3f, 0xf9, 0x0c, 0xa0, 0x14, 0xf0, - 0x00, 0xfa, 0x08, 0x20, 0x34, 0xf0, 0x41, 0xfe, - 0x34, 0xf0, 0x3b, 0xfe, 0x01, 0xe0, 0x00, 0x28, - 0x03, 0xd0, 0x00, 0x20, 0x01, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x0e, 0x48, 0x01, 0x6a, 0x01, 0x31, - 0x01, 0x62, 0x00, 0x98, 0x41, 0x60, 0x00, 0x98, - 0xf4, 0xe7, 0xf0, 0xe2, 0x03, 0x20, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x3a, 0x20, 0x4e, 0x55, 0x5f, - 0x4e, 0x4f, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x28, 0x72, 0x65, - 0x62, 0x6f, 0x6f, 0x74, 0x20, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x29, 0x0a, 0x00, 0xdc, 0x6c, - 0x03, 0x20, 0x00, 0xb5, 0x25, 0xf0, 0x7f, 0xff, - 0x08, 0xbc, 0xed, 0x09, 0x00, 0x0c, 0x00, 0x18, - 0x47, 0x08, 0xb5, 0x12, 0xf0, 0xb4, 0xf8, 0x00, - 0x28, 0x01, 0xd0, 0x00, 0x22, 0x01, 0xe0, 0x00, - 0x22, 0xd2, 0x43, 0x69, 0x46, 0x0a, 0x48, 0x25, - 0xf0, 0x14, 0xff, 0x00, 0x21, 0x00, 0x28, 0x03, - 0xd0, 0x08, 0x1c, 0x01, 0xb0, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x98, 0x00, 0x22, 0x01, 0x63, 0x00, - 0x98, 0x00, 0x21, 0x00, 0x23, 0x18, 0x30, 0x0e, - 0xc0, 0x0e, 0xc0, 0x00, 0x98, 0xf1, 0xe7, 0x2c, - 0xe3, 0x03, 0x20, 0x00, 0xb5, 0x25, 0xf0, 0x59, - 0xff, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x1c, 0x00, - 0x20, 0x00, 0x22, 0x8b, 0x5c, 0x01, 0x32, 0x18, - 0x18, 0x34, 0x2a, 0xfa, 0xd3, 0x70, 0x47, 0x93, - 0xb5, 0x00, 0x27, 0x00, 0x24, 0x0f, 0x28, 0x1b, - 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, - 0x44, 0x00, 0x1c, 0x08, 0x08, 0x0a, 0x0c, 0x0e, - 0x08, 0x0a, 0x0c, 0x08, 0x0a, 0x0c, 0x0e, 0x17, - 0x17, 0x0c, 0x00, 0x12, 0x4f, 0x12, 0xe0, 0x12, - 0x4f, 0x10, 0xe0, 0x12, 0x4f, 0x0e, 0xe0, 0x00, - 0x20, 0x01, 0x99, 0x02, 0xf0, 0x0a, 0xff, 0x00, - 0x20, 0x02, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x33, 0xf0, 0xef, 0xfa, 0x01, 0x1c, 0x0c, - 0xa0, 0x14, 0xf0, 0x79, 0xf9, 0x12, 0xf0, 0x5f, - 0xf8, 0x00, 0x28, 0x00, 0xd1, 0xc4, 0x43, 0x01, - 0x22, 0x38, 0x1c, 0x23, 0x1c, 0x01, 0xa9, 0x26, - 0xf0, 0x3c, 0xf8, 0x01, 0x21, 0x00, 0x28, 0x00, - 0xd1, 0x00, 0x21, 0x08, 0x1c, 0xe4, 0xe7, 0xa8, - 0xe2, 0x03, 0x20, 0x60, 0xe2, 0x03, 0x20, 0x18, - 0xe2, 0x03, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x3a, 0x20, 0x27, 0x25, 0x73, 0x27, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0xb5, 0x83, 0xb0, 0x01, - 0x1c, 0x00, 0x20, 0xc2, 0x43, 0xed, 0x09, 0x00, - 0x0d, 0x00, 0x00, 0x29, 0x11, 0xd0, 0x01, 0x29, - 0x11, 0xd0, 0x02, 0x29, 0x00, 0xd1, 0x0a, 0x48, - 0x00, 0x92, 0x01, 0x22, 0x01, 0xa9, 0x02, 0xab, - 0x26, 0xf0, 0xe6, 0xf8, 0x2d, 0x23, 0xd8, 0x42, - 0x07, 0xd1, 0x00, 0x20, 0x03, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x04, 0x48, 0xf0, 0xe7, 0x04, 0x48, - 0xee, 0xe7, 0x01, 0x98, 0xf6, 0xe7, 0x00, 0x00, - 0x18, 0xe2, 0x03, 0x20, 0xa8, 0xe2, 0x03, 0x20, - 0x60, 0xe2, 0x03, 0x20, 0x04, 0x48, 0x00, 0x21, - 0x00, 0x22, 0x0a, 0x23, 0x06, 0xc0, 0x01, 0x3b, - 0xfc, 0xd1, 0x04, 0xc0, 0x70, 0x47, 0x00, 0x00, - 0xe4, 0xe4, 0x03, 0x20, 0xb0, 0xb5, 0x82, 0xb0, - 0x0c, 0x1c, 0x17, 0x1c, 0x00, 0x2b, 0x01, 0xd0, - 0x05, 0x25, 0x00, 0xe0, 0x01, 0x25, 0x15, 0x49, - 0x49, 0x69, 0x01, 0x29, 0x1e, 0xd0, 0x02, 0x29, - 0x06, 0xd1, 0x09, 0x21, 0x0f, 0xf0, 0xbc, 0xff, - 0x6a, 0x46, 0x03, 0xc2, 0x00, 0x98, 0x01, 0x99, - 0xc2, 0x1f, 0x0f, 0x49, 0x21, 0x3a, 0x8a, 0x60, - 0xff, 0x30, 0xff, 0x30, 0x42, 0x30, 0xc8, 0x60, - 0x01, 0x2f, 0x01, 0xd0, 0x03, 0x2f, 0x04, 0xd1, - 0x08, 0x23, 0x1d, 0x43, 0x09, 0x4a, 0x60, 0x08, - 0x10, 0x60, 0x0d, 0x60, 0x02, 0xb0, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x10, 0x21, 0x0f, 0xf0, - 0x9f, 0xff, 0x6a, 0x46, 0x03, 0xc2, 0x00, 0x98, - 0x01, 0x99, 0xe1, 0xe7, 0x48, 0xe6, 0x03, 0x20, - 0x00, 0x51, 0x00, 0xe0, 0x80, 0x55, 0x00, 0xe0, - 0x80, 0xb5, 0x0d, 0x4f, 0xb8, 0x68, 0x00, 0x28, - 0x12, 0xd0, 0x01, 0x23, 0x07, 0x22, 0x00, 0x21, - 0x01, 0xf0, 0x98, 0xfd, 0x00, 0x20, 0xb8, 0x60, - 0xf8, 0x63, 0x78, 0x68, 0xc0, 0x69, 0x00, 0x28, - 0x01, 0xd0, 0x24, 0xf0, 0xb5, 0xfe, 0x78, 0x68, - 0x00, 0x28, 0x01, 0xd0, 0xff, 0xf7, 0x24, 0xff, - 0xed, 0x09, 0x00, 0x0e, 0x00, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe4, 0xe4, 0x03, - 0x20, 0x90, 0xb4, 0x11, 0x4b, 0x11, 0x4f, 0x5c, - 0x69, 0x11, 0x4b, 0x01, 0x2c, 0x14, 0xd0, 0x02, - 0x2c, 0x10, 0xd1, 0x62, 0x24, 0x3c, 0x60, 0x00, - 0x2a, 0x13, 0xd1, 0x99, 0x61, 0x09, 0x09, 0x09, - 0x07, 0x09, 0x0f, 0x18, 0x68, 0x01, 0x31, 0x01, - 0x30, 0x48, 0x43, 0xc0, 0x08, 0x1a, 0x30, 0x58, - 0x61, 0x01, 0x20, 0xd8, 0x61, 0x90, 0xbc, 0x70, - 0x47, 0x14, 0x33, 0x07, 0xc3, 0x80, 0x20, 0x38, - 0x60, 0xf8, 0xe7, 0x14, 0x33, 0x07, 0xc3, 0xf5, - 0xe7, 0x48, 0xe6, 0x03, 0x20, 0x40, 0x53, 0x00, - 0xe0, 0xe4, 0xe4, 0x03, 0x20, 0x09, 0x49, 0xca, - 0x1d, 0xb9, 0x32, 0x52, 0x69, 0x01, 0x2a, 0x07, - 0xd0, 0x02, 0x2a, 0x04, 0xd1, 0x80, 0x22, 0x00, - 0x28, 0x00, 0xd1, 0x00, 0x22, 0x0a, 0x60, 0x70, - 0x47, 0x40, 0x22, 0x00, 0x28, 0x00, 0xd1, 0x00, - 0x22, 0x0a, 0x60, 0x70, 0x47, 0x88, 0xe5, 0x03, - 0x20, 0xb0, 0xb5, 0x1f, 0x4f, 0x01, 0x25, 0x49, - 0x07, 0xf8, 0x60, 0x49, 0x0f, 0x3a, 0x61, 0x39, - 0x60, 0xbb, 0x63, 0x04, 0xa9, 0x18, 0xc9, 0xf8, - 0x1d, 0x19, 0x30, 0x18, 0xc0, 0xb8, 0x68, 0x00, - 0x24, 0x00, 0x28, 0x06, 0xd1, 0x01, 0x20, 0x29, - 0x1c, 0x03, 0xf0, 0x28, 0xfa, 0xb8, 0x60, 0xc4, - 0x60, 0x04, 0xe0, 0x00, 0x23, 0x07, 0x22, 0x00, - 0x21, 0x01, 0xf0, 0x26, 0xfd, 0x78, 0x68, 0x00, - 0x28, 0x02, 0xd1, 0xff, 0xf7, 0x9a, 0xfe, 0x78, - 0x60, 0x0e, 0x49, 0x78, 0x68, 0x0c, 0xc9, 0x0c, - 0xc0, 0x78, 0x68, 0x04, 0x72, 0x79, 0x68, 0x01, - 0x20, 0x48, 0x72, 0x79, 0x68, 0x8c, 0x72, 0x79, - 0x68, 0xc8, 0x72, 0x78, 0x68, 0x84, 0x61, 0x78, - 0x68, 0xc4, 0x61, 0x78, 0x68, 0x04, 0x62, 0x78, - 0x68, 0x44, 0x62, 0xed, 0x09, 0x00, 0x0f, 0x00, - 0x78, 0x68, 0x84, 0x62, 0x78, 0x68, 0xc4, 0x62, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe4, 0xe4, - 0x03, 0x20, 0x88, 0xe6, 0x03, 0x20, 0x04, 0x49, - 0x05, 0x48, 0xc1, 0x60, 0x00, 0x21, 0x81, 0x60, - 0x05, 0xa1, 0x0c, 0xc9, 0x03, 0x48, 0x0c, 0xc0, - 0x70, 0x47, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x50, - 0x00, 0xe0, 0x88, 0xe6, 0x03, 0x20, 0x55, 0x55, - 0x33, 0x33, 0x00, 0x00, 0xff, 0x4f, 0xf0, 0xb5, - 0x0d, 0x1c, 0x14, 0x1c, 0x07, 0x1c, 0x47, 0xa1, - 0x34, 0xf0, 0x7d, 0xfc, 0x47, 0x4e, 0x00, 0x28, - 0x03, 0xd1, 0x71, 0x68, 0x10, 0x20, 0xc8, 0x60, - 0x6d, 0xe0, 0x38, 0x1c, 0x44, 0xa1, 0x34, 0xf0, - 0x72, 0xfc, 0x00, 0x28, 0x14, 0xd1, 0x71, 0x68, - 0x09, 0x20, 0xc8, 0x60, 0x71, 0x68, 0x1d, 0x20, - 0x88, 0x61, 0x20, 0x20, 0x24, 0xf0, 0xc9, 0xfd, - 0x71, 0x68, 0xc8, 0x61, 0x71, 0x68, 0x03, 0x20, - 0x48, 0x61, 0x71, 0x68, 0x01, 0x20, 0x08, 0x61, - 0x70, 0x68, 0x81, 0x69, 0x81, 0x63, 0x52, 0xe0, - 0x38, 0x1c, 0x38, 0xa1, 0x34, 0xf0, 0x57, 0xfc, - 0x00, 0x28, 0x14, 0xd1, 0x71, 0x68, 0x04, 0x20, - 0xc8, 0x60, 0x71, 0x68, 0x1b, 0x20, 0x88, 0x61, - 0x20, 0x20, 0x24, 0xf0, 0xae, 0xfd, 0x71, 0x68, - 0xc8, 0x61, 0x71, 0x68, 0x03, 0x20, 0x48, 0x61, - 0x71, 0x68, 0x01, 0x20, 0x08, 0x61, 0x70, 0x68, - 0x81, 0x69, 0x81, 0x63, 0x37, 0xe0, 0x38, 0x1c, - 0x2c, 0xa1, 0x34, 0xf0, 0x3c, 0xfc, 0x00, 0x28, - 0x15, 0xd1, 0x71, 0x68, 0x0b, 0x20, 0xc8, 0x60, - 0x71, 0x68, 0xb7, 0x20, 0x88, 0x61, 0xff, 0x20, - 0x01, 0x30, 0x24, 0xf0, 0x92, 0xfd, 0x71, 0x68, - 0xc8, 0x61, 0x71, 0x68, 0x03, 0x20, 0x48, 0x61, - 0x71, 0x68, 0x01, 0x20, 0x08, 0x61, 0x70, 0x68, - 0x81, 0x69, 0x81, 0x63, 0x1b, 0xe0, 0xed, 0x09, - 0x00, 0x10, 0x00, 0x38, 0x1c, 0x1f, 0xa1, 0x34, - 0xf0, 0x20, 0xfc, 0x00, 0x28, 0x28, 0xd1, 0x71, - 0x68, 0x0f, 0x20, 0xc8, 0x60, 0xff, 0x20, 0x71, - 0x68, 0x54, 0x30, 0x88, 0x61, 0x01, 0x20, 0x40, - 0x02, 0x24, 0xf0, 0x75, 0xfd, 0x71, 0x68, 0xc8, - 0x61, 0x71, 0x68, 0x03, 0x20, 0x48, 0x61, 0x71, - 0x68, 0x01, 0x20, 0x08, 0x61, 0x70, 0x68, 0x81, - 0x69, 0x81, 0x63, 0x72, 0x68, 0x00, 0x20, 0xd1, - 0x69, 0x92, 0x69, 0xd2, 0x08, 0x0a, 0x1c, 0x54, - 0x60, 0x15, 0x60, 0x72, 0x68, 0x92, 0x69, 0xd2, - 0x08, 0x01, 0x30, 0x08, 0x31, 0x82, 0x42, 0xf5, - 0xd2, 0x00, 0x20, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x34, 0xf0, 0xeb, 0xfb, 0x01, 0x20, 0xf8, - 0xe7, 0x00, 0x00, 0x49, 0x44, 0x00, 0x00, 0xe4, - 0xe4, 0x03, 0x20, 0x41, 0x55, 0x58, 0x31, 0x00, - 0x00, 0x00, 0x00, 0x44, 0x48, 0x31, 0x00, 0x44, - 0x48, 0x33, 0x00, 0x44, 0x48, 0x35, 0x00, 0xff, - 0xb5, 0x82, 0xb0, 0x04, 0x1c, 0x1f, 0x1c, 0x0c, - 0x9d, 0x0b, 0x9e, 0x34, 0xf0, 0xd6, 0xfb, 0xff, - 0xf7, 0x40, 0xff, 0x1d, 0x4a, 0x00, 0x2f, 0x02, - 0xd1, 0x02, 0x20, 0xd0, 0x63, 0x01, 0xe0, 0x01, - 0x20, 0xd0, 0x63, 0x00, 0x20, 0x19, 0x4a, 0x14, - 0x21, 0x10, 0x64, 0x51, 0x64, 0x90, 0x64, 0xd0, - 0x64, 0x01, 0x2c, 0x24, 0xd1, 0x28, 0x1c, 0xff, - 0xf7, 0xd2, 0xfe, 0x0d, 0x99, 0x0e, 0x9a, 0x00, - 0x91, 0x01, 0x92, 0x3a, 0x1c, 0x00, 0x21, 0x33, - 0x1c, 0x04, 0x98, 0xff, 0xf7, 0xde, 0xfe, 0x0e, - 0x4f, 0xf8, 0x6b, 0x01, 0x28, 0x0c, 0xd1, 0x03, - 0x98, 0x0d, 0x99, 0x0e, 0x9a, 0xff, 0xf7, 0x2d, - 0xff, 0x00, 0x28, 0x05, 0xd0, 0x34, 0xf0, 0xa5, - 0xfb, 0x06, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x07, 0x23, 0x1c, 0x22, 0x00, 0x21, 0xb8, - 0x68, 0xed, 0x09, 0x00, 0x11, 0x00, 0x01, 0xf0, - 0xe3, 0xf9, 0x01, 0xe0, 0xff, 0xf7, 0x66, 0xfe, - 0x34, 0xf0, 0x96, 0xfb, 0xef, 0xe7, 0x00, 0x00, - 0xe4, 0xe4, 0x03, 0x20, 0xff, 0xb5, 0x82, 0xb0, - 0x0e, 0x9c, 0x0d, 0x9d, 0x0c, 0x9e, 0x0b, 0x9f, - 0x34, 0xf0, 0x8e, 0xfb, 0xff, 0xf7, 0xf8, 0xfe, - 0x00, 0x2f, 0x03, 0xd1, 0x1a, 0x49, 0x03, 0x20, - 0xc8, 0x63, 0x02, 0xe0, 0x18, 0x49, 0x00, 0x20, - 0xc8, 0x63, 0x02, 0x98, 0x01, 0x28, 0x26, 0xd1, - 0x30, 0x1c, 0x29, 0x1c, 0x22, 0x1c, 0xff, 0xf7, - 0x63, 0xfe, 0x10, 0x99, 0x11, 0x9a, 0x00, 0x91, - 0x01, 0x92, 0x3a, 0x1c, 0x04, 0x99, 0x05, 0x98, - 0x0f, 0x9b, 0xff, 0xf7, 0x99, 0xfe, 0x0e, 0x4f, - 0xf8, 0x6b, 0x00, 0x28, 0x0c, 0xd1, 0x03, 0x98, - 0x10, 0x99, 0x11, 0x9a, 0xff, 0xf7, 0xe8, 0xfe, - 0x00, 0x28, 0x05, 0xd0, 0x34, 0xf0, 0x60, 0xfb, - 0x06, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x07, 0x23, 0x1c, 0x22, 0x00, 0x21, 0xb8, 0x68, - 0x01, 0xf0, 0x9e, 0xf9, 0x01, 0xe0, 0xff, 0xf7, - 0x21, 0xfe, 0x34, 0xf0, 0x51, 0xfb, 0xef, 0xe7, - 0xe4, 0xe4, 0x03, 0x20, 0xf0, 0xb5, 0xc8, 0x1d, - 0xff, 0x30, 0x7a, 0x30, 0x0f, 0x1c, 0x01, 0x69, - 0x03, 0x23, 0x19, 0x43, 0x01, 0x61, 0x23, 0x4e, - 0x00, 0x20, 0x30, 0x63, 0x70, 0x63, 0xf1, 0x6b, - 0x14, 0x1c, 0x00, 0x29, 0x20, 0x4d, 0x0e, 0xd0, - 0x20, 0x4a, 0x01, 0x29, 0x25, 0xd0, 0x02, 0x29, - 0x29, 0xd0, 0x03, 0x29, 0x04, 0xd1, 0x28, 0x60, - 0x38, 0x1c, 0x21, 0x1c, 0x00, 0xf0, 0x7c, 0xfc, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x34, 0xf0, - 0x2f, 0xfb, 0xf0, 0x69, 0xe8, 0x60, 0x71, 0x68, - 0x17, 0x48, 0x28, 0xc9, 0x28, 0xc0, 0x18, 0x48, - 0x16, 0x49, 0xc1, 0x60, 0x81, 0x68, 0x01, 0x23, - 0x9b, 0x02, 0x19, 0x43, 0xed, 0x09, 0x00, 0x12, - 0x00, 0x81, 0x60, 0x00, 0x69, 0xff, 0x30, 0x91, - 0x30, 0xb0, 0x62, 0x00, 0x20, 0x00, 0xf0, 0x1e, - 0xfd, 0x34, 0xf0, 0x14, 0xfb, 0xe2, 0xe7, 0x38, - 0x1c, 0x21, 0x1c, 0x12, 0x68, 0x00, 0xf0, 0xd2, - 0xf8, 0xdc, 0xe7, 0xd0, 0x1d, 0xb9, 0x30, 0x40, - 0x69, 0x02, 0x28, 0x03, 0xd1, 0x05, 0x21, 0x31, - 0x20, 0x00, 0xf0, 0x13, 0xfe, 0x00, 0x22, 0x38, - 0x1c, 0x21, 0x1c, 0x00, 0xf0, 0x37, 0xf8, 0xcd, - 0xe7, 0xe4, 0xe4, 0x03, 0x20, 0x00, 0x52, 0x00, - 0xe0, 0x88, 0xe5, 0x03, 0x20, 0x90, 0x57, 0x00, - 0xe0, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x50, 0x00, - 0xe0, 0x90, 0xb5, 0x11, 0x4c, 0x0f, 0x1c, 0xe0, - 0x6b, 0x02, 0x28, 0x19, 0xd0, 0x03, 0x28, 0x17, - 0xd0, 0x34, 0xf0, 0xec, 0xfa, 0x0d, 0x49, 0x0e, - 0x48, 0xc1, 0x60, 0xe1, 0x6b, 0x01, 0x29, 0x06, - 0xd0, 0x02, 0x29, 0x04, 0xd0, 0x81, 0x68, 0x01, - 0x23, 0x9b, 0x02, 0x99, 0x43, 0x81, 0x60, 0xf8, - 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x01, 0x69, 0x89, - 0x08, 0x89, 0x00, 0x01, 0x61, 0x34, 0xf0, 0xd2, - 0xfa, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0xe4, 0xe4, 0x03, 0x20, 0xfc, 0x07, 0x00, - 0x00, 0x00, 0x50, 0x00, 0xe0, 0xf0, 0xb5, 0x17, - 0x1c, 0x34, 0xf0, 0xc8, 0xfa, 0x39, 0x49, 0x3a, - 0x4a, 0xc8, 0x69, 0xd0, 0x60, 0x4c, 0x68, 0x39, - 0x48, 0x60, 0xcc, 0x60, 0xc0, 0x38, 0x4e, 0xb0, - 0x68, 0xb0, 0x60, 0x38, 0x48, 0xf0, 0x60, 0x30, - 0x69, 0xff, 0x30, 0x91, 0x30, 0xc8, 0x62, 0x36, - 0x4d, 0xcc, 0x68, 0x69, 0x69, 0x01, 0x29, 0x3a, - 0xd0, 0x02, 0x29, 0x20, 0xd1, 0x09, 0x21, 0x0f, - 0xf0, 0x0b, 0xfd, 0xc8, 0x22, 0x0f, 0xf0, 0x12, - 0xfd, 0x34, 0x22, 0x0f, 0xf0, 0x0f, 0xfd, 0x50, - 0x22, 0x0f, 0xf0, 0x0c, 0xfd, 0x0d, 0x22, 0xed, - 0x09, 0x00, 0x13, 0x00, 0x0f, 0xf0, 0x09, 0xfd, - 0x04, 0x22, 0x0f, 0xf0, 0x06, 0xfd, 0x28, 0x22, - 0x0f, 0xf0, 0x03, 0xfd, 0xa1, 0x1c, 0x09, 0x02, - 0x10, 0x22, 0x0a, 0x43, 0x27, 0x49, 0x0a, 0x62, - 0x42, 0x22, 0x3a, 0x43, 0x12, 0x02, 0x11, 0x23, - 0x1a, 0x43, 0x4a, 0x62, 0x24, 0x4a, 0x24, 0x49, - 0x0a, 0x62, 0x08, 0x60, 0x30, 0x69, 0x69, 0x69, - 0xff, 0x30, 0x91, 0x30, 0x01, 0x29, 0x2d, 0xd0, - 0x02, 0x29, 0x00, 0xd1, 0x09, 0x30, 0xc1, 0x1f, - 0x1f, 0x48, 0x21, 0x39, 0x81, 0x60, 0x00, 0x21, - 0x01, 0x60, 0x34, 0xf0, 0x76, 0xfa, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x10, 0x21, 0x0f, 0xf0, - 0xd2, 0xfc, 0xff, 0x22, 0x05, 0x32, 0x0f, 0xf0, - 0xd8, 0xfc, 0x46, 0x22, 0x0f, 0xf0, 0xd5, 0xfc, - 0x0d, 0x22, 0x0f, 0xf0, 0xd2, 0xfc, 0x04, 0x22, - 0x0f, 0xf0, 0xcf, 0xfc, 0x28, 0x22, 0x0f, 0xf0, - 0xcc, 0xfc, 0xa1, 0x1c, 0x09, 0x02, 0x20, 0x22, - 0x0a, 0x43, 0x0b, 0x49, 0x0a, 0x62, 0x82, 0x22, - 0x3a, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, - 0x4a, 0x62, 0xc7, 0xe7, 0x10, 0x30, 0xd2, 0xe7, - 0x00, 0x00, 0xe4, 0xe4, 0x03, 0x20, 0x00, 0x52, - 0x00, 0xe0, 0x90, 0x57, 0x00, 0xe0, 0x00, 0x50, - 0x00, 0xe0, 0xfc, 0x07, 0x00, 0x00, 0x48, 0xe6, - 0x03, 0x20, 0xa0, 0x55, 0x00, 0xe0, 0x02, 0x05, - 0x00, 0x00, 0x08, 0x53, 0x00, 0xe0, 0x00, 0x51, - 0x00, 0xe0, 0xf0, 0xb5, 0x17, 0x1c, 0x34, 0xf0, - 0x3c, 0xfa, 0x68, 0x48, 0x69, 0x4a, 0xc1, 0x69, - 0xd1, 0x60, 0x44, 0x68, 0x68, 0x49, 0x60, 0xcc, - 0x60, 0xc1, 0x44, 0x68, 0x67, 0x49, 0x60, 0xcc, - 0x60, 0xc1, 0x66, 0x4e, 0x03, 0x22, 0xb2, 0x62, - 0x66, 0x4b, 0x66, 0x49, 0xcb, 0x60, 0x8c, 0x68, - 0x7d, 0x23, 0xdb, 0x00, 0x23, 0x43, 0x8b, 0x60, - 0x03, 0x69, 0xed, 0x09, 0x00, 0x14, 0x00, 0x09, - 0x69, 0x5b, 0x00, 0x59, 0x18, 0x62, 0x4c, 0xc1, - 0x62, 0x65, 0x69, 0x61, 0x4b, 0x01, 0x2d, 0x4f, - 0xd0, 0x02, 0x2d, 0x01, 0xd1, 0x60, 0x4d, 0x1d, - 0x62, 0xff, 0x23, 0x50, 0x31, 0x5f, 0x4a, 0x02, - 0x33, 0x13, 0x62, 0x11, 0x60, 0x53, 0x49, 0xc8, - 0x6a, 0xcd, 0x68, 0x61, 0x69, 0x01, 0x29, 0x42, - 0xd0, 0x02, 0x29, 0x20, 0xd1, 0x09, 0x21, 0x0f, - 0xf0, 0x64, 0xfc, 0xc8, 0x22, 0x0f, 0xf0, 0x6b, - 0xfc, 0x34, 0x22, 0x0f, 0xf0, 0x68, 0xfc, 0x50, - 0x22, 0x0f, 0xf0, 0x65, 0xfc, 0x0d, 0x22, 0x0f, - 0xf0, 0x62, 0xfc, 0x04, 0x22, 0x0f, 0xf0, 0x5f, - 0xfc, 0x28, 0x22, 0x0f, 0xf0, 0x5c, 0xfc, 0xa9, - 0x1c, 0x09, 0x02, 0x10, 0x22, 0x0a, 0x43, 0x4d, - 0x49, 0x0a, 0x62, 0x42, 0x22, 0x3a, 0x43, 0x12, - 0x02, 0x11, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x4a, - 0x4a, 0x4b, 0x49, 0x0a, 0x62, 0x08, 0x60, 0x3c, - 0x48, 0x41, 0x68, 0xc9, 0x68, 0x10, 0x29, 0x3a, - 0xd1, 0x03, 0x22, 0x32, 0x60, 0xc0, 0x6a, 0x61, - 0x69, 0x01, 0x29, 0x30, 0xd0, 0x02, 0x29, 0x02, - 0xd1, 0x09, 0x21, 0x0f, 0xf0, 0x32, 0xfc, 0xc1, - 0x1f, 0x21, 0x39, 0xb1, 0x60, 0xb0, 0x30, 0xf0, - 0x60, 0x32, 0x20, 0x10, 0xf0, 0xcc, 0xf9, 0x54, - 0xe0, 0x3e, 0x4d, 0x1d, 0x62, 0xb0, 0xe7, 0x10, - 0x21, 0x0f, 0xf0, 0x23, 0xfc, 0xff, 0x22, 0x05, - 0x32, 0x0f, 0xf0, 0x29, 0xfc, 0x46, 0x22, 0x0f, - 0xf0, 0x26, 0xfc, 0x0d, 0x22, 0x0f, 0xf0, 0x23, - 0xfc, 0x04, 0x22, 0x0f, 0xf0, 0x20, 0xfc, 0x28, - 0x22, 0x0f, 0xf0, 0x1d, 0xfc, 0xa9, 0x1c, 0x09, - 0x02, 0x20, 0x22, 0x0a, 0x43, 0x2e, 0x49, 0x0a, - 0x62, 0x82, 0x22, 0x3a, 0x43, 0x12, 0x02, 0x10, - 0x23, 0x1a, 0x43, 0x4a, 0x62, 0xbf, 0xe7, 0x10, - 0x21, 0x0f, 0xf0, 0x03, 0xfc, 0xed, 0x09, 0x00, - 0x15, 0x00, 0xcf, 0xe7, 0xc5, 0x6a, 0x66, 0x69, - 0x3e, 0x23, 0x3d, 0x22, 0x2d, 0x21, 0x01, 0x2e, - 0x28, 0x4f, 0x2a, 0xd0, 0x02, 0x2e, 0x02, 0xd1, - 0x39, 0x62, 0x2c, 0x26, 0x7e, 0x62, 0xef, 0x1d, - 0x25, 0x4d, 0x26, 0x4e, 0x21, 0x37, 0x35, 0x62, - 0x37, 0x60, 0xc7, 0x6a, 0x64, 0x69, 0x64, 0x37, - 0x01, 0x2c, 0x23, 0x4d, 0x1c, 0xd0, 0x02, 0x2c, - 0x02, 0xd1, 0x29, 0x62, 0x2c, 0x26, 0x6e, 0x62, - 0x1d, 0x4d, 0x20, 0x4a, 0xf9, 0x1d, 0x21, 0x31, - 0x15, 0x62, 0x11, 0x60, 0x81, 0x6b, 0x01, 0x23, - 0x00, 0x29, 0x00, 0xd1, 0x00, 0x23, 0x00, 0x22, - 0x00, 0x21, 0xc0, 0x6a, 0xff, 0xf7, 0x06, 0xfc, - 0x34, 0xf0, 0x70, 0xf9, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x3a, 0x62, 0x7b, 0x62, 0xd6, 0xe7, - 0x2a, 0x62, 0x6b, 0x62, 0xe4, 0xe7, 0x00, 0x00, - 0xe4, 0xe4, 0x03, 0x20, 0x00, 0x52, 0x00, 0xe0, - 0x20, 0x51, 0x00, 0xe0, 0x90, 0x57, 0x00, 0xe0, - 0x00, 0x51, 0x00, 0xe0, 0xfc, 0x07, 0x00, 0x00, - 0x00, 0x50, 0x00, 0xe0, 0x48, 0xe6, 0x03, 0x20, - 0xb0, 0x55, 0x00, 0xe0, 0x11, 0x40, 0x00, 0x00, - 0x0c, 0x53, 0x00, 0xe0, 0xa0, 0x55, 0x00, 0xe0, - 0x02, 0x05, 0x00, 0x00, 0x08, 0x53, 0x00, 0xe0, - 0x10, 0x80, 0x00, 0x00, 0xc0, 0x55, 0x00, 0xe0, - 0x02, 0x03, 0x00, 0x00, 0x10, 0x53, 0x00, 0xe0, - 0xd0, 0x55, 0x00, 0xe0, 0x14, 0x53, 0x00, 0xe0, - 0xf0, 0xb5, 0x82, 0xb0, 0xf0, 0x4e, 0x05, 0x1c, - 0xf7, 0x6a, 0x10, 0xf0, 0x2f, 0xf9, 0x30, 0x6b, - 0x01, 0x30, 0x30, 0x63, 0xff, 0x20, 0x0a, 0x30, - 0x28, 0x40, 0x18, 0xd0, 0x68, 0x08, 0x02, 0xd3, - 0xea, 0xa0, 0x13, 0xf0, 0xe3, 0xfc, 0x68, 0x0a, - 0x02, 0xd3, 0xe9, 0xa0, 0x13, 0xf0, 0xde, 0xfc, - 0x30, 0x6b, 0x0a, 0x28, 0x01, 0xd9, 0x00, 0x20, - 0xed, 0x09, 0x00, 0x16, 0x00, 0x30, 0x63, 0xe6, - 0x49, 0xb0, 0x68, 0x0a, 0x68, 0x00, 0x21, 0xff, - 0xf7, 0xdf, 0xfe, 0x02, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x30, 0x69, 0x40, 0x00, 0xc7, - 0x19, 0x68, 0x09, 0x0d, 0xd3, 0xdf, 0xa0, 0x13, - 0xf0, 0xc7, 0xfc, 0xdf, 0x48, 0xc1, 0x6a, 0x09, - 0x09, 0x0a, 0x07, 0xc0, 0x6a, 0x12, 0x0f, 0x01, - 0x07, 0x09, 0x0f, 0xdc, 0xa0, 0x13, 0xf0, 0xbc, - 0xfc, 0x04, 0x24, 0x2c, 0x40, 0x02, 0xd0, 0xe1, - 0xa0, 0x13, 0xf0, 0xb6, 0xfc, 0xd1, 0x4a, 0xd0, - 0x6b, 0x01, 0x28, 0x6f, 0xd1, 0x20, 0x1c, 0xde, - 0x4c, 0x12, 0xd0, 0xde, 0x48, 0x80, 0x6a, 0x41, - 0x07, 0x49, 0x0f, 0x00, 0xab, 0x19, 0x70, 0x41, - 0x06, 0x09, 0x0f, 0x01, 0x91, 0x01, 0x06, 0xc9, - 0x0f, 0x59, 0x70, 0xc1, 0x05, 0xc9, 0x0f, 0x80, - 0x05, 0xc0, 0x0f, 0x99, 0x70, 0xd8, 0x70, 0x61, - 0xe0, 0xe8, 0x09, 0x5f, 0xd2, 0x28, 0x0a, 0x5d, - 0xd2, 0x11, 0x20, 0x40, 0x01, 0x28, 0x40, 0x61, - 0xd0, 0x00, 0x21, 0x28, 0x1c, 0x02, 0xf0, 0x0c, - 0xff, 0x05, 0x1c, 0xc0, 0x69, 0x00, 0x28, 0x6c, - 0xd0, 0xbf, 0x48, 0xcd, 0x4a, 0x01, 0x68, 0x10, - 0x6a, 0x52, 0x6a, 0x00, 0x0a, 0xff, 0x23, 0x1b, - 0x02, 0x1a, 0x40, 0x10, 0x43, 0x62, 0x69, 0x01, - 0x2a, 0x3d, 0xd0, 0x02, 0x2a, 0x07, 0xd1, 0xd7, - 0x03, 0x03, 0x0c, 0x00, 0xd2, 0x00, 0x27, 0x38, - 0x43, 0x01, 0x23, 0xdb, 0x03, 0x98, 0x43, 0xc3, - 0x4b, 0x1f, 0x6a, 0x5e, 0x6a, 0x3f, 0x0a, 0xff, - 0x23, 0x1b, 0x02, 0x33, 0x40, 0x1f, 0x43, 0x3e, - 0x1c, 0x01, 0x2a, 0x30, 0xd0, 0x02, 0x2a, 0x09, - 0xd1, 0xd7, 0x03, 0x31, 0x0c, 0x00, 0xd2, 0x00, - 0x27, 0x37, 0x43, 0x01, 0x23, 0xdb, 0x03, 0x39, - 0x1c, 0x99, 0x43, 0x0e, 0x1c, 0x26, 0xf0, 0xf6, - 0xfd, 0x07, 0x1c, 0xed, 0x09, 0x00, 0x17, 0x00, - 0x30, 0x1c, 0x26, 0xf0, 0xf2, 0xfd, 0x06, 0x1c, - 0x28, 0x1c, 0x00, 0xf0, 0x82, 0xf9, 0xa0, 0x4a, - 0x11, 0x6c, 0x01, 0x31, 0x11, 0x64, 0x01, 0x29, - 0x1c, 0xd1, 0xf9, 0x00, 0xc9, 0x1b, 0xc9, 0x19, - 0xc9, 0x10, 0x91, 0x64, 0xf1, 0x00, 0x89, 0x1b, - 0x89, 0x19, 0xc9, 0x10, 0x10, 0x65, 0xd1, 0x64, - 0x32, 0xe0, 0x20, 0xe1, 0x01, 0x27, 0x3f, 0x04, - 0x00, 0x29, 0x00, 0xd1, 0x00, 0x27, 0x38, 0x43, - 0xc4, 0xe7, 0x5f, 0xe0, 0x01, 0x27, 0x3f, 0x04, - 0x00, 0x29, 0x00, 0xd1, 0x00, 0x27, 0x3e, 0x43, - 0xd3, 0xe7, 0x4f, 0xe0, 0x53, 0x6c, 0x99, 0x42, - 0x0f, 0xd1, 0x90, 0x6c, 0xc1, 0x00, 0x08, 0x1a, - 0xc0, 0x19, 0xc0, 0x10, 0x90, 0x64, 0xd1, 0x6c, - 0xc8, 0x00, 0x40, 0x1a, 0x80, 0x19, 0xc0, 0x10, - 0xd0, 0x64, 0x00, 0x20, 0x10, 0x64, 0x0f, 0xe0, - 0x18, 0xe0, 0x91, 0x6c, 0xcb, 0x00, 0x59, 0x1a, - 0xc9, 0x19, 0xc9, 0x10, 0x91, 0x64, 0xd1, 0x6c, - 0xcb, 0x00, 0x59, 0x1a, 0x89, 0x19, 0xc9, 0x10, - 0xd1, 0x64, 0x11, 0x6d, 0x08, 0x18, 0x10, 0x65, - 0x28, 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xff, 0xf7, - 0xf6, 0xf9, 0xe8, 0x69, 0xff, 0xf7, 0xf3, 0xf9, - 0x00, 0x20, 0x28, 0x63, 0x7e, 0x48, 0x07, 0x69, - 0x02, 0xf0, 0x0f, 0xfc, 0x00, 0x90, 0x01, 0x91, - 0x60, 0x69, 0x01, 0x28, 0x14, 0xd0, 0x02, 0x28, - 0x04, 0xd1, 0x8e, 0x21, 0x38, 0x1c, 0x0f, 0xf0, - 0xb2, 0xfa, 0x07, 0x1c, 0x00, 0x98, 0x87, 0x42, - 0x02, 0xd9, 0x01, 0x98, 0x01, 0x38, 0x01, 0x90, - 0x81, 0x4b, 0x00, 0x97, 0xff, 0x18, 0x28, 0x1c, - 0x01, 0x99, 0xff, 0xf7, 0x3a, 0xfa, 0x0d, 0xe0, - 0x95, 0x21, 0x38, 0x1c, 0x0f, 0xf0, 0x9f, 0xfa, - 0x07, 0x1c, 0xeb, 0xe7, 0x67, 0x4a, 0x11, 0x6b, - 0x48, 0x1c, 0x10, 0x63, 0x0a, 0x29, 0xed, 0x09, - 0x00, 0x18, 0x00, 0x01, 0xd9, 0x00, 0x20, 0x10, - 0x63, 0x63, 0x69, 0x03, 0x22, 0x01, 0x2b, 0x64, - 0x49, 0x75, 0x48, 0x52, 0xd0, 0x02, 0x2b, 0x01, - 0xd1, 0x74, 0x4b, 0x03, 0x62, 0xf8, 0x1d, 0x49, - 0x30, 0xff, 0x23, 0x72, 0x4a, 0x02, 0x33, 0x13, - 0x62, 0x10, 0x60, 0x5a, 0x4d, 0x0e, 0x68, 0xed, - 0x68, 0x61, 0x69, 0x38, 0x1c, 0x01, 0x29, 0x43, - 0xd0, 0x02, 0x29, 0x20, 0xd1, 0x09, 0x21, 0x0f, - 0xf0, 0x66, 0xfa, 0xc8, 0x22, 0x0f, 0xf0, 0x6d, - 0xfa, 0x34, 0x22, 0x0f, 0xf0, 0x6a, 0xfa, 0x50, - 0x22, 0x0f, 0xf0, 0x67, 0xfa, 0x0d, 0x22, 0x0f, - 0xf0, 0x64, 0xfa, 0x04, 0x22, 0x0f, 0xf0, 0x61, - 0xfa, 0x28, 0x22, 0x0f, 0xf0, 0x5e, 0xfa, 0xa9, - 0x1c, 0x09, 0x02, 0x10, 0x22, 0x0a, 0x43, 0x60, - 0x49, 0x0a, 0x62, 0x42, 0x22, 0x32, 0x43, 0x12, - 0x02, 0x11, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x5d, - 0x4a, 0x5e, 0x49, 0x0a, 0x62, 0x44, 0x4d, 0x08, - 0x60, 0x68, 0x68, 0xc0, 0x68, 0x10, 0x28, 0x3b, - 0xd1, 0x46, 0x4e, 0x03, 0x22, 0x32, 0x60, 0x61, - 0x69, 0x38, 0x1c, 0x01, 0x29, 0x30, 0xd0, 0x02, - 0x29, 0x02, 0xd1, 0x09, 0x21, 0x0f, 0xf0, 0x33, - 0xfa, 0xc1, 0x1f, 0x21, 0x39, 0xb1, 0x60, 0xb0, - 0x30, 0xf0, 0x60, 0x32, 0x20, 0x0f, 0xf0, 0xcd, - 0xff, 0x54, 0xe0, 0x50, 0x4b, 0x03, 0x62, 0xad, - 0xe7, 0x10, 0x21, 0x0f, 0xf0, 0x24, 0xfa, 0xff, - 0x22, 0x05, 0x32, 0x0f, 0xf0, 0x2a, 0xfa, 0x46, - 0x22, 0x0f, 0xf0, 0x27, 0xfa, 0x0d, 0x22, 0x0f, - 0xf0, 0x24, 0xfa, 0x04, 0x22, 0x0f, 0xf0, 0x21, - 0xfa, 0x28, 0x22, 0x0f, 0xf0, 0x1e, 0xfa, 0xa9, - 0x1c, 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0x40, - 0x49, 0x0a, 0x62, 0x82, 0x22, 0x32, 0x43, 0x12, - 0x02, 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0xbe, - 0xe7, 0xed, 0x09, 0x00, 0x19, 0x00, 0x10, 0x21, - 0x0f, 0xf0, 0x04, 0xfa, 0xcf, 0xe7, 0x62, 0x69, - 0x3e, 0x21, 0x3d, 0x20, 0x01, 0x2a, 0x39, 0xd0, - 0x02, 0x2a, 0x04, 0xd1, 0x30, 0x4a, 0x2d, 0x23, - 0x13, 0x62, 0x2c, 0x23, 0x53, 0x62, 0x38, 0x4b, - 0x38, 0x4e, 0xfa, 0x1d, 0x21, 0x32, 0x33, 0x62, - 0x32, 0x60, 0x63, 0x69, 0xfa, 0x1d, 0x5d, 0x32, - 0x01, 0x2b, 0x2b, 0xd0, 0x02, 0x2b, 0x04, 0xd1, - 0x28, 0x48, 0x2d, 0x23, 0x03, 0x62, 0x2c, 0x23, - 0x43, 0x62, 0x2f, 0x4b, 0x30, 0x49, 0xd0, 0x1d, - 0x21, 0x30, 0x0b, 0x62, 0x08, 0x60, 0xa8, 0x6b, - 0x01, 0x23, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x23, - 0x00, 0x22, 0x00, 0x21, 0x38, 0x1c, 0xff, 0xf7, - 0x07, 0xfa, 0x69, 0x68, 0x29, 0x48, 0x0c, 0xc9, - 0x0c, 0xc0, 0x69, 0x68, 0x28, 0x48, 0x28, 0xc9, - 0x28, 0xc0, 0x0d, 0x4e, 0x00, 0x20, 0xb0, 0x62, - 0x32, 0x20, 0x0f, 0xf0, 0x69, 0xff, 0x05, 0x4a, - 0xd7, 0x62, 0x46, 0xe6, 0x14, 0x4a, 0x10, 0x62, - 0x51, 0x62, 0xc8, 0xe7, 0x13, 0x4b, 0x18, 0x62, - 0x59, 0x62, 0xd6, 0xe7, 0xe4, 0xe4, 0x03, 0x20, - 0x77, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, - 0x88, 0xe5, 0x03, 0x20, 0x73, 0x00, 0x00, 0x00, - 0x00, 0x51, 0x00, 0xe0, 0x43, 0x6f, 0x72, 0x72, - 0x42, 0x69, 0x74, 0x73, 0x3d, 0x30, 0x78, 0x25, - 0x78, 0x2c, 0x20, 0x50, 0x72, 0x65, 0x42, 0x69, - 0x74, 0x73, 0x3d, 0x30, 0x78, 0x25, 0x78, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x48, 0xe6, 0x03, 0x20, 0x40, 0x55, 0x00, 0xe0, - 0xc0, 0x55, 0x00, 0xe0, 0xd0, 0x55, 0x00, 0xe0, - 0xd8, 0x1f, 0x00, 0x00, 0xb0, 0x55, 0x00, 0xe0, - 0x11, 0x40, 0x00, 0x00, 0x0c, 0x53, 0x00, 0xe0, - 0xa0, 0x55, 0x00, 0xe0, 0x02, 0x05, 0x00, 0x00, - 0x08, 0x53, 0x00, 0xe0, 0xed, 0x09, 0x00, 0x1a, - 0x00, 0x10, 0x80, 0x00, 0x00, 0x02, 0x03, 0x00, - 0x00, 0x10, 0x53, 0x00, 0xe0, 0x14, 0x53, 0x00, - 0xe0, 0x20, 0x51, 0x00, 0xe0, 0x90, 0x57, 0x00, - 0xe0, 0xf1, 0xb5, 0x88, 0xb0, 0x08, 0x98, 0x00, - 0x25, 0xc1, 0x69, 0x00, 0x91, 0x00, 0x21, 0x01, - 0x91, 0x80, 0x69, 0xc0, 0x08, 0x3e, 0xd0, 0x27, - 0x48, 0x27, 0xa1, 0x43, 0x68, 0x07, 0x93, 0x02, - 0x68, 0x27, 0xa0, 0x06, 0x92, 0x4b, 0x68, 0x05, - 0x93, 0x0a, 0x68, 0x04, 0x92, 0x43, 0x68, 0x03, - 0x93, 0x02, 0x68, 0x02, 0x92, 0x00, 0x99, 0x08, - 0x68, 0x49, 0x68, 0x07, 0x9b, 0x06, 0x9a, 0x59, - 0x40, 0x50, 0x40, 0x04, 0x1c, 0x0f, 0x1c, 0x02, - 0x9a, 0x03, 0x9b, 0x0f, 0xf0, 0xb3, 0xf8, 0x00, - 0x28, 0x15, 0xd0, 0x00, 0x26, 0x01, 0x22, 0x20, - 0x1c, 0x39, 0x1c, 0x0f, 0xf0, 0xb5, 0xf8, 0x05, - 0x9b, 0x0f, 0x1c, 0x19, 0x40, 0x04, 0x9a, 0x04, - 0x1c, 0x10, 0x40, 0x02, 0x9a, 0x03, 0x9b, 0x0f, - 0xf0, 0xa1, 0xf8, 0x00, 0x28, 0x00, 0xd0, 0x01, - 0x35, 0x01, 0x36, 0x40, 0x2e, 0xea, 0xd3, 0x00, - 0x99, 0x08, 0x31, 0x00, 0x91, 0x01, 0x99, 0x08, - 0x98, 0x01, 0x31, 0x01, 0x91, 0x80, 0x69, 0xc0, - 0x08, 0x88, 0x42, 0xcf, 0xd8, 0x0c, 0x49, 0x01, - 0x98, 0x69, 0x43, 0x00, 0x28, 0x04, 0xd0, 0x01, - 0x98, 0x80, 0x01, 0xfe, 0xf7, 0xed, 0xfb, 0x00, - 0xe0, 0x07, 0x48, 0x09, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x04, 0xe5, 0x03, - 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x42, 0x0f, 0x00, 0xf8, 0xb5, 0x33, - 0xf0, 0xb5, 0xfe, 0x51, 0x49, 0x51, 0x4a, 0xc8, - 0x69, 0xd0, 0x60, 0x4f, 0x68, 0x50, 0x48, 0x60, - 0xcf, 0x60, 0xc0, 0x50, 0x48, 0x50, 0x4a, 0xed, - 0x09, 0x00, 0x1b, 0x00, 0xd0, 0x60, 0x90, 0x68, - 0x90, 0x60, 0x10, 0x69, 0xff, 0x30, 0x91, 0x30, - 0x88, 0x62, 0x00, 0x22, 0x0a, 0x63, 0x4a, 0x63, - 0x0c, 0x68, 0x4d, 0x69, 0x8e, 0x69, 0xcf, 0x68, - 0x4a, 0x49, 0x00, 0x91, 0x49, 0x69, 0x01, 0x29, - 0x55, 0xd0, 0x02, 0x29, 0x27, 0xd1, 0x47, 0x4a, - 0x03, 0x21, 0xd1, 0x62, 0x06, 0x21, 0x0f, 0xf0, - 0x00, 0xf9, 0xc8, 0x22, 0x0f, 0xf0, 0xf5, 0xf8, - 0x6a, 0x00, 0x0f, 0xf0, 0xf2, 0xf8, 0x28, 0x22, - 0x0f, 0xf0, 0xef, 0xf8, 0x03, 0x22, 0x0f, 0xf0, - 0xfc, 0xf8, 0xb9, 0x1c, 0x09, 0x02, 0x10, 0x23, - 0x3d, 0x4a, 0x19, 0x43, 0x11, 0x62, 0xe1, 0x00, - 0x44, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, - 0x19, 0x43, 0x51, 0x62, 0x31, 0x02, 0x16, 0x23, - 0x19, 0x43, 0x91, 0x62, 0x37, 0x49, 0x08, 0x60, - 0x05, 0x20, 0x00, 0x02, 0x08, 0x62, 0x2d, 0x48, - 0x81, 0x6a, 0x02, 0x68, 0x00, 0x98, 0x43, 0x69, - 0x33, 0x48, 0x01, 0x2b, 0x49, 0xd0, 0x02, 0x2b, - 0x06, 0xd1, 0xd2, 0x00, 0x40, 0x23, 0x1a, 0x43, - 0x12, 0x02, 0x11, 0x23, 0x1a, 0x43, 0x02, 0x62, - 0xc8, 0x1d, 0x5d, 0x30, 0x2d, 0x49, 0xff, 0x22, - 0x02, 0x32, 0x0a, 0x62, 0x26, 0x4a, 0x08, 0x60, - 0x10, 0x69, 0x00, 0x99, 0xff, 0x30, 0x49, 0x69, - 0x91, 0x30, 0x01, 0x29, 0x39, 0xd0, 0x02, 0x29, - 0x00, 0xd1, 0x06, 0x38, 0x1d, 0x49, 0x88, 0x60, - 0x00, 0x22, 0x0a, 0x60, 0x33, 0xf0, 0x41, 0xfe, - 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x06, 0x21, - 0x0f, 0xf0, 0xaf, 0xf8, 0xff, 0x22, 0x05, 0x32, - 0x0f, 0xf0, 0xa3, 0xf8, 0x6a, 0x00, 0x0f, 0xf0, - 0xa0, 0xf8, 0x28, 0x22, 0x0f, 0xf0, 0x9d, 0xf8, - 0x03, 0x22, 0x0f, 0xf0, 0xaa, 0xf8, 0xb9, 0x1c, - 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0x13, 0x49, - 0x0a, 0x62, 0xed, 0x09, 0x00, 0x1c, 0x00, 0xe2, - 0x00, 0x84, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, - 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x32, 0x02, 0x19, - 0x23, 0x1a, 0x43, 0x8a, 0x62, 0x0e, 0x49, 0x08, - 0x60, 0x10, 0x48, 0x08, 0x62, 0xad, 0xe7, 0xd2, - 0x00, 0x80, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, - 0x23, 0x1a, 0x43, 0x02, 0x62, 0xb6, 0xe7, 0x06, - 0x38, 0xc6, 0xe7, 0xe4, 0xe4, 0x03, 0x20, 0x00, - 0x52, 0x00, 0xe0, 0x90, 0x57, 0x00, 0xe0, 0xfc, - 0x07, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, 0x48, - 0xe6, 0x03, 0x20, 0x80, 0x55, 0x00, 0xe0, 0x00, - 0x53, 0x00, 0xe0, 0x90, 0x55, 0x00, 0xe0, 0x04, - 0x53, 0x00, 0xe0, 0x03, 0x05, 0x00, 0x00, 0xf0, - 0xb5, 0x82, 0xb0, 0x6c, 0x4d, 0x04, 0x1c, 0xaf, - 0x6a, 0x0f, 0xf0, 0xe9, 0xfd, 0xff, 0x20, 0x0a, - 0x30, 0x20, 0x40, 0x08, 0xd0, 0x00, 0x22, 0x01, - 0x20, 0xa9, 0x68, 0xff, 0xf7, 0x9a, 0xfa, 0x02, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x63, - 0x48, 0xc0, 0x6b, 0x00, 0x28, 0x65, 0xd1, 0x61, - 0x48, 0x62, 0x4c, 0x01, 0x69, 0x03, 0x68, 0x49, - 0x00, 0xcf, 0x19, 0x66, 0x69, 0x39, 0x1c, 0x01, - 0x25, 0x01, 0x2e, 0x5e, 0x4a, 0x5a, 0xd0, 0x02, - 0x2e, 0x06, 0xd1, 0xde, 0x00, 0x40, 0x23, 0x33, - 0x43, 0x1e, 0x02, 0x11, 0x23, 0x33, 0x43, 0x13, - 0x62, 0xff, 0x22, 0x64, 0x31, 0x59, 0x4b, 0x02, - 0x32, 0x1a, 0x62, 0x54, 0x48, 0x19, 0x60, 0x42, - 0x69, 0xc5, 0x68, 0x06, 0x68, 0x00, 0x92, 0x82, - 0x69, 0x01, 0x92, 0x60, 0x69, 0x01, 0x28, 0x49, - 0xd0, 0x02, 0x28, 0x2b, 0xd1, 0x52, 0x49, 0x03, - 0x20, 0xc8, 0x62, 0x06, 0x21, 0x38, 0x1c, 0x0f, - 0xf0, 0x26, 0xf8, 0xc8, 0x22, 0x0f, 0xf0, 0x1b, - 0xf8, 0x00, 0x9a, 0x52, 0x00, 0x0f, 0xf0, 0x17, - 0xf8, 0x28, 0x22, 0x0f, 0xf0, 0xed, 0x09, 0x00, - 0x1d, 0x00, 0x14, 0xf8, 0x03, 0x22, 0x0f, 0xf0, - 0x21, 0xf8, 0xa9, 0x1c, 0x09, 0x02, 0x10, 0x23, - 0x46, 0x4a, 0x19, 0x43, 0x11, 0x62, 0xf1, 0x00, - 0x44, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, - 0x19, 0x43, 0x51, 0x62, 0x01, 0x9a, 0x11, 0x02, - 0x16, 0x23, 0x40, 0x4a, 0x19, 0x43, 0x91, 0x62, - 0x3f, 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, 0x02, - 0x08, 0x62, 0x38, 0x4d, 0x68, 0x68, 0xc0, 0x68, - 0x10, 0x28, 0x43, 0xd1, 0x61, 0x69, 0x38, 0x1c, - 0x01, 0x29, 0x3b, 0xd0, 0x02, 0x29, 0x02, 0xd1, - 0x06, 0x21, 0x0e, 0xf0, 0xf3, 0xff, 0x37, 0x49, - 0x88, 0x60, 0x03, 0x20, 0x08, 0x60, 0x4b, 0xe0, - 0x4d, 0xe0, 0xde, 0x00, 0x80, 0x23, 0x33, 0x43, - 0x1e, 0x02, 0x10, 0x23, 0x33, 0x43, 0x13, 0x62, - 0xa5, 0xe7, 0x06, 0x21, 0x38, 0x1c, 0x0e, 0xf0, - 0xe1, 0xff, 0xff, 0x22, 0x05, 0x32, 0x0e, 0xf0, - 0xd5, 0xff, 0x00, 0x9a, 0x52, 0x00, 0x0e, 0xf0, - 0xd1, 0xff, 0x28, 0x22, 0x0e, 0xf0, 0xce, 0xff, - 0x03, 0x22, 0x0e, 0xf0, 0xdb, 0xff, 0xa9, 0x1c, - 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0x23, 0x49, - 0x0a, 0x62, 0xf2, 0x00, 0x84, 0x23, 0x1a, 0x43, - 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, - 0x01, 0x9a, 0x12, 0x02, 0x19, 0x23, 0x1a, 0x43, - 0x8a, 0x62, 0x1d, 0x49, 0x08, 0x60, 0x1e, 0x48, - 0x08, 0x62, 0xba, 0xe7, 0x06, 0x21, 0x0e, 0xf0, - 0xb9, 0xff, 0xc4, 0xe7, 0xaa, 0x6b, 0x01, 0x21, - 0x38, 0x1c, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x21, - 0x00, 0x29, 0x01, 0xd0, 0x05, 0x26, 0x00, 0xe0, - 0x01, 0x26, 0x61, 0x69, 0x01, 0x29, 0x10, 0xd0, - 0x02, 0x29, 0x02, 0xd1, 0x06, 0x21, 0x0e, 0xf0, - 0xa5, 0xff, 0x10, 0x49, 0x88, 0x60, 0x0e, 0x60, - 0x68, 0x68, 0x02, 0xf0, 0x05, 0xfd, 0x32, 0x20, - 0xed, 0x09, 0x00, 0x1e, 0x00, 0x0f, 0xf0, 0x2c, - 0xfd, 0x05, 0x48, 0x87, 0x62, 0x3c, 0xe7, 0x06, - 0x21, 0x0e, 0xf0, 0x96, 0xff, 0x6a, 0x46, 0x03, - 0xc2, 0x00, 0x98, 0x01, 0x99, 0xeb, 0xe7, 0x00, - 0x00, 0xe4, 0xe4, 0x03, 0x20, 0x48, 0xe6, 0x03, - 0x20, 0x90, 0x55, 0x00, 0xe0, 0x04, 0x53, 0x00, - 0xe0, 0x80, 0x55, 0x00, 0xe0, 0x00, 0x53, 0x00, - 0xe0, 0x00, 0x52, 0x00, 0xe0, 0x03, 0x05, 0x00, - 0x00, 0x80, 0xb5, 0x1f, 0x1c, 0x00, 0x28, 0x05, - 0xd0, 0x08, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x13, - 0xf8, 0x38, 0x60, 0x03, 0xe0, 0x08, 0x1c, 0x00, - 0xf0, 0x2d, 0xf8, 0x38, 0x60, 0x80, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0xb5, 0x00, - 0x20, 0x33, 0xf0, 0x0e, 0xfd, 0x01, 0x20, 0x33, - 0xf0, 0x0b, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb4, 0x01, 0x27, 0x0b, 0x4a, 0x3f, 0x03, 0xd7, - 0x60, 0x09, 0x02, 0x08, 0x43, 0x09, 0x49, 0x08, - 0x62, 0x09, 0x48, 0x51, 0x68, 0x49, 0x0b, 0x07, - 0xd2, 0x01, 0x38, 0x02, 0xd1, 0x01, 0x20, 0x80, - 0xbc, 0x70, 0x47, 0x51, 0x68, 0x49, 0x0b, 0xf7, - 0xd3, 0xd7, 0x60, 0x00, 0x20, 0xf7, 0xe7, 0x00, - 0x00, 0x00, 0x50, 0x00, 0xe0, 0x40, 0x53, 0x00, - 0xe0, 0x10, 0x27, 0x00, 0x00, 0x90, 0xb4, 0x01, - 0x27, 0x0b, 0x49, 0xff, 0x02, 0xcf, 0x60, 0x0b, - 0x4a, 0x50, 0x62, 0x0b, 0x48, 0x4c, 0x68, 0x23, - 0x0b, 0x07, 0xd2, 0x01, 0x38, 0x02, 0xd1, 0x01, - 0x20, 0x90, 0xbc, 0x70, 0x47, 0x4c, 0x68, 0x23, - 0x0b, 0xf7, 0xd3, 0x50, 0x6a, 0x00, 0x0a, 0x00, - 0x06, 0x00, 0x0e, 0xcf, 0x60, 0xf4, 0xe7, 0x00, - 0x00, 0x00, 0x50, 0x00, 0xe0, 0x40, 0x53, 0x00, - 0xe0, 0x10, 0x27, 0x00, 0x00, 0x90, 0xb5, 0x01, - 0x21, 0x20, 0x20, 0x23, 0xf0, 0x8b, 0xf8, 0x00, - 0x20, 0x00, 0xf0, 0xed, 0x09, 0x00, 0x1f, 0x00, - 0x62, 0xf9, 0x00, 0x20, 0xff, 0x27, 0x01, 0x37, - 0x01, 0x06, 0x02, 0x04, 0x89, 0x18, 0x02, 0x02, - 0x89, 0x18, 0x0a, 0x18, 0x00, 0x21, 0x8c, 0x00, - 0x3b, 0x4b, 0x01, 0x31, 0xe3, 0x18, 0x1a, 0x60, - 0xb9, 0x42, 0xf8, 0xd3, 0x00, 0x21, 0x37, 0x4b, - 0x8c, 0x00, 0xe3, 0x18, 0x1b, 0x68, 0x93, 0x42, - 0x01, 0xd0, 0xff, 0xe7, 0xfe, 0xe7, 0x01, 0x31, - 0xb9, 0x42, 0xf4, 0xd3, 0x01, 0x30, 0xb8, 0x42, - 0xe2, 0xd3, 0x31, 0x49, 0x0a, 0x69, 0x00, 0x20, - 0x01, 0x30, 0x64, 0x28, 0xfc, 0xd3, 0x08, 0x69, - 0x82, 0x42, 0x01, 0xd3, 0xff, 0xe7, 0xfe, 0xe7, - 0xff, 0xf7, 0x83, 0xff, 0xff, 0xf7, 0x81, 0xff, - 0x3a, 0x20, 0xff, 0xf7, 0xa6, 0xff, 0x07, 0x1c, - 0x3b, 0x20, 0xff, 0xf7, 0xa2, 0xff, 0x00, 0x02, - 0x38, 0x43, 0x01, 0x1c, 0x26, 0x4a, 0x26, 0x48, - 0x0a, 0x40, 0x5f, 0x23, 0xdb, 0x01, 0x9a, 0x42, - 0x16, 0xd1, 0x02, 0x22, 0x24, 0x4b, 0x42, 0x61, - 0x19, 0x40, 0x08, 0xd0, 0x01, 0x29, 0x08, 0xd0, - 0x02, 0x29, 0x09, 0xd0, 0x03, 0x29, 0x0a, 0xd1, - 0x05, 0x21, 0x81, 0x61, 0x2a, 0xe0, 0x82, 0x61, - 0x28, 0xe0, 0x03, 0x21, 0x81, 0x61, 0x25, 0xe0, - 0x04, 0x21, 0x81, 0x61, 0x22, 0xe0, 0xfe, 0xe7, - 0x01, 0x21, 0x41, 0x61, 0xa5, 0x21, 0x31, 0x20, - 0xff, 0xf7, 0x5c, 0xff, 0x00, 0x28, 0x01, 0xd0, - 0xff, 0xe7, 0xfe, 0xe7, 0x5a, 0x21, 0x32, 0x20, - 0xff, 0xf7, 0x54, 0xff, 0x00, 0x28, 0x01, 0xd0, - 0xff, 0xe7, 0xfe, 0xe7, 0x31, 0x20, 0xff, 0xf7, - 0x6c, 0xff, 0xa5, 0x28, 0x01, 0xd0, 0xff, 0xe7, - 0xfe, 0xe7, 0x32, 0x20, 0xff, 0xf7, 0x65, 0xff, - 0x40, 0x06, 0x40, 0x0e, 0x5a, 0x28, 0x01, 0xd0, - 0xff, 0xe7, 0xfe, 0xe7, 0x00, 0x21, 0x20, 0x20, - 0x23, 0xf0, 0x0b, 0xf8, 0x90, 0xbc, 0xed, 0x09, - 0x00, 0x20, 0x00, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0x00, 0x00, 0x00, 0x54, 0x00, 0xe0, 0x00, - 0x50, 0x00, 0xe0, 0xe0, 0xff, 0x00, 0x00, 0x48, - 0xe6, 0x03, 0x20, 0x1f, 0x00, 0xff, 0xff, 0xf0, - 0xb5, 0x07, 0x1c, 0x00, 0x28, 0x40, 0x4d, 0x13, - 0xd1, 0xff, 0x22, 0x00, 0x21, 0x28, 0x1c, 0x09, - 0x32, 0xfe, 0xf7, 0x9b, 0xf9, 0x3d, 0x48, 0x00, - 0x21, 0x00, 0x22, 0x00, 0x24, 0x00, 0x26, 0x06, - 0x23, 0x56, 0xc0, 0x01, 0x3b, 0xfc, 0xd1, 0x40, - 0xc0, 0xff, 0xf7, 0x55, 0xff, 0x00, 0x28, 0x67, - 0xd1, 0x02, 0xf0, 0xb5, 0xfc, 0xec, 0x1d, 0xb9, - 0x34, 0x60, 0x69, 0x01, 0x28, 0x19, 0xd0, 0x02, - 0x28, 0x01, 0xd1, 0x80, 0x20, 0x28, 0x60, 0x05, - 0x20, 0x68, 0x60, 0x00, 0x26, 0x6e, 0x61, 0xa8, - 0x68, 0x40, 0x19, 0xc0, 0x30, 0x01, 0x79, 0xe9, - 0x60, 0x00, 0x7b, 0x28, 0x61, 0x01, 0x20, 0xe0, - 0x62, 0x26, 0x63, 0x33, 0xf0, 0xfe, 0xfb, 0xff, - 0x23, 0x03, 0x33, 0x98, 0x42, 0x04, 0xd3, 0x07, - 0x20, 0x03, 0xe0, 0x40, 0x20, 0x28, 0x60, 0xe6, - 0xe7, 0x05, 0x20, 0xe0, 0x61, 0x33, 0xf0, 0xf1, - 0xfb, 0xff, 0x23, 0x03, 0x33, 0x98, 0x42, 0x01, - 0xd3, 0x07, 0x20, 0x00, 0xe0, 0x05, 0x20, 0xa8, - 0x60, 0x1f, 0x48, 0x60, 0x63, 0x01, 0x20, 0xa0, - 0x62, 0x01, 0x2f, 0x09, 0xd1, 0x02, 0xf0, 0x2d, - 0xfe, 0x02, 0xf0, 0x81, 0xff, 0x00, 0xf0, 0x0b, - 0xf9, 0xfe, 0xf7, 0xab, 0xfc, 0xfe, 0xf7, 0x19, - 0xfd, 0x02, 0xf0, 0xd1, 0xfe, 0x00, 0x2f, 0x01, - 0xd1, 0x33, 0xf0, 0xcf, 0xfb, 0x00, 0xf0, 0x00, - 0xf9, 0x00, 0x28, 0x1d, 0xd1, 0x00, 0x2f, 0x06, - 0xd1, 0xff, 0x21, 0x38, 0x1c, 0xa5, 0x31, 0xfe, - 0xf7, 0xac, 0xfb, 0x00, 0x28, 0x14, 0xd1, 0xff, - 0x20, 0x7d, 0x30, 0xfe, 0xf7, 0x6c, 0xfc, 0x00, - 0x28, 0xed, 0x09, 0x00, 0x21, 0x00, 0x0e, 0xd1, - 0xfe, 0xf7, 0xa0, 0xfc, 0x00, 0x28, 0x0a, 0xd1, - 0x38, 0x1c, 0x00, 0xf0, 0x5d, 0xf8, 0x02, 0xf0, - 0xed, 0xfd, 0x38, 0x1c, 0x00, 0xf0, 0x82, 0xf8, - 0x03, 0xf0, 0x86, 0xfa, 0x30, 0x1c, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x88, 0xe5, 0x03, 0x20, - 0x90, 0xe6, 0x03, 0x20, 0x14, 0x02, 0x42, 0x00, - 0x00, 0xb5, 0x83, 0xb0, 0x05, 0x21, 0xc9, 0x02, - 0x01, 0x22, 0x12, 0x03, 0x01, 0x92, 0x00, 0x91, - 0x19, 0xa1, 0x17, 0x4a, 0x00, 0x23, 0x17, 0x48, - 0x10, 0xf0, 0xec, 0xfa, 0x00, 0x28, 0x02, 0xd0, - 0x03, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x02, 0xaa, - 0x15, 0x49, 0x08, 0x20, 0x10, 0xf0, 0xf8, 0xfe, - 0x00, 0x28, 0x00, 0xd0, 0xf4, 0xe7, 0x07, 0x21, - 0xc9, 0x02, 0x01, 0x22, 0xd2, 0x02, 0x01, 0x92, - 0x00, 0x91, 0x12, 0xa1, 0x0f, 0x4a, 0x00, 0x23, - 0x0f, 0x48, 0x10, 0xf0, 0xd3, 0xfa, 0x00, 0x28, - 0x00, 0xd0, 0xe5, 0xe7, 0x02, 0xaa, 0x0f, 0x49, - 0x03, 0x20, 0x10, 0xf0, 0xe1, 0xfe, 0x00, 0x28, - 0x00, 0xd0, 0xdd, 0xe7, 0x08, 0x20, 0x33, 0xf0, - 0x6b, 0xfb, 0x00, 0x20, 0xd8, 0xe7, 0x00, 0x00, - 0x45, 0x59, 0x00, 0x20, 0x34, 0xf2, 0x03, 0x20, - 0x48, 0x5f, 0x4c, 0x63, 0x49, 0x72, 0x71, 0x00, - 0x09, 0x59, 0x00, 0x20, 0x39, 0x59, 0x00, 0x20, - 0x8c, 0xf2, 0x03, 0x20, 0x48, 0x5f, 0x4c, 0x63, - 0x54, 0x4d, 0x4f, 0x00, 0x21, 0x59, 0x00, 0x20, - 0x90, 0xb5, 0x01, 0x24, 0x00, 0x28, 0x13, 0xd1, - 0x0e, 0x4f, 0x01, 0x20, 0x3c, 0x60, 0x10, 0xf0, - 0x65, 0xfd, 0x03, 0x20, 0x38, 0x60, 0x01, 0x20, - 0x10, 0xf0, 0x60, 0xfd, 0x02, 0x20, 0x38, 0x60, - 0x01, 0x20, 0x10, 0xf0, 0x5b, 0xfd, 0xff, 0x20, - 0x07, 0x30, 0x38, 0x60, 0x06, 0x48, 0x44, 0x60, - 0x06, 0x48, 0x00, 0x21, 0xed, 0x09, 0x00, 0x22, - 0x00, 0x81, 0x60, 0x06, 0x4a, 0xc2, 0x60, 0x01, - 0x61, 0x84, 0x61, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x58, 0x00, 0xe0, 0x40, 0x53, 0x00, - 0xe0, 0x00, 0x50, 0x00, 0xe0, 0xff, 0xff, 0x07, - 0x00, 0x90, 0xb5, 0x2a, 0x4c, 0x61, 0x69, 0x01, - 0x29, 0x42, 0xd0, 0x02, 0x29, 0x3d, 0xd1, 0x00, - 0x28, 0x29, 0xd1, 0xa0, 0x69, 0x26, 0x4f, 0x03, - 0x28, 0x00, 0xdd, 0x08, 0x37, 0x38, 0x68, 0xff, - 0x28, 0x09, 0xd0, 0xff, 0xf7, 0x11, 0xfe, 0x03, - 0xcf, 0x08, 0x3f, 0xff, 0xf7, 0x16, 0xfe, 0x38, - 0x69, 0x10, 0x37, 0xff, 0x28, 0xf5, 0xd1, 0x01, - 0x20, 0x10, 0xf0, 0x26, 0xfd, 0xa0, 0x69, 0x1d, - 0x4f, 0x03, 0x28, 0x00, 0xdd, 0x08, 0x37, 0x38, - 0x68, 0xff, 0x28, 0x09, 0xd0, 0xff, 0xf7, 0xfc, - 0xfd, 0x03, 0xcf, 0x08, 0x3f, 0xff, 0xf7, 0x01, - 0xfe, 0x38, 0x69, 0x10, 0x37, 0xff, 0x28, 0xf5, - 0xd1, 0x01, 0x20, 0x10, 0xf0, 0x11, 0xfd, 0xa0, - 0x69, 0x13, 0x4f, 0x03, 0x28, 0x00, 0xdd, 0x08, - 0x37, 0x38, 0x68, 0xff, 0x28, 0x09, 0xd0, 0xff, - 0xf7, 0xe7, 0xfd, 0x03, 0xcf, 0x08, 0x3f, 0xff, - 0xf7, 0xec, 0xfd, 0x38, 0x69, 0x10, 0x37, 0xff, - 0x28, 0xf5, 0xd1, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x0a, 0x4f, 0x38, 0x68, 0xff, 0x28, 0xf8, - 0xd0, 0x03, 0xcf, 0x08, 0x3f, 0xff, 0xf7, 0xdd, - 0xfd, 0xb8, 0x68, 0x08, 0x37, 0xff, 0x28, 0xf7, - 0xd1, 0xef, 0xe7, 0x00, 0x00, 0x48, 0xe6, 0x03, - 0x20, 0xe0, 0x6f, 0x03, 0x20, 0x80, 0x70, 0x03, - 0x20, 0xb0, 0x70, 0x03, 0x20, 0x78, 0x6e, 0x03, - 0x20, 0x70, 0x47, 0x00, 0xb5, 0x23, 0x22, 0x12, - 0x01, 0x00, 0x21, 0x05, 0x48, 0xfe, 0xf7, 0x3e, - 0xf8, 0x04, 0x49, 0x00, 0x20, 0x88, 0x61, 0x04, - 0x49, 0x48, 0x60, 0x08, 0xbc, 0x18, 0x47, 0xed, - 0x09, 0x00, 0x23, 0x00, 0x00, 0x00, 0x44, 0xe7, - 0x03, 0x20, 0x88, 0xe5, 0x03, 0x20, 0x74, 0x73, - 0x03, 0x20, 0xf0, 0xb5, 0x8f, 0xb0, 0x01, 0xf0, - 0x80, 0xfe, 0x03, 0x1c, 0x0a, 0x1c, 0x19, 0x1c, - 0x2f, 0xa0, 0x12, 0xf0, 0x56, 0xfe, 0x35, 0x49, - 0x34, 0x4c, 0x00, 0x25, 0x0e, 0x91, 0x20, 0x68, - 0x00, 0x28, 0x4b, 0xd0, 0x32, 0xf0, 0x23, 0xfb, - 0x07, 0x1c, 0x60, 0x6a, 0x00, 0x28, 0x05, 0xd0, - 0x00, 0x7e, 0x10, 0x22, 0x04, 0xa9, 0x23, 0xf0, - 0x8c, 0xfb, 0x00, 0xe0, 0x2d, 0xa0, 0x06, 0x1c, - 0x20, 0x6a, 0x00, 0x28, 0x05, 0xd0, 0x00, 0x68, - 0x0a, 0x22, 0x09, 0xa9, 0x23, 0xf0, 0x81, 0xfb, - 0x00, 0xe0, 0x2a, 0xa0, 0x02, 0x1c, 0x29, 0x1c, - 0x33, 0x1c, 0x2c, 0xa0, 0x00, 0x97, 0x12, 0xf0, - 0x30, 0xfe, 0x0e, 0x99, 0x60, 0x6a, 0x32, 0x4f, - 0x00, 0x28, 0x01, 0xd0, 0xc1, 0x1d, 0x09, 0x31, - 0x31, 0xa0, 0x12, 0xf0, 0x26, 0xfe, 0x20, 0x6a, - 0x00, 0x69, 0x32, 0xf0, 0x86, 0xfb, 0x01, 0x1c, - 0x2f, 0xa0, 0x12, 0xf0, 0x1e, 0xfe, 0x63, 0x69, - 0x26, 0x69, 0xb8, 0x69, 0xa0, 0x42, 0x01, 0xd1, - 0x2d, 0xa2, 0x00, 0xe0, 0x2f, 0xa2, 0x60, 0x68, - 0x00, 0x28, 0x01, 0xd0, 0x2f, 0xa1, 0x00, 0xe0, - 0x31, 0xa1, 0xe0, 0x6a, 0x03, 0x92, 0xe2, 0x1d, - 0x01, 0x32, 0x00, 0x93, 0x01, 0x90, 0x02, 0x91, - 0x11, 0x68, 0x52, 0x68, 0x2f, 0xa0, 0x33, 0x1c, - 0x12, 0xf0, 0x03, 0xfe, 0x38, 0x34, 0x01, 0x35, - 0x0a, 0x2d, 0xac, 0xd3, 0x0f, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x5b, 0x53, - 0x63, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x5d, 0x20, - 0x6e, 0x6f, 0x77, 0x3d, 0x25, 0x4c, 0x78, 0x3a, - 0x0a, 0x00, 0x44, 0xe7, 0x03, 0x20, 0x80, 0xe6, - 0x03, 0x20, 0xed, 0x09, 0x00, 0x24, 0x00, 0x3c, - 0x6e, 0x6f, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x3e, - 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x6f, 0x20, 0x70, - 0x69, 0x63, 0x6f, 0x6e, 0x65, 0x74, 0x3e, 0x00, - 0x00, 0x00, 0x00, 0x5b, 0x25, 0x75, 0x5d, 0x20, - 0x50, 0x69, 0x63, 0x6f, 0x6e, 0x65, 0x74, 0x20, - 0x25, 0x73, 0x20, 0x4c, 0x69, 0x6e, 0x6b, 0x20, - 0x25, 0x73, 0x20, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x25, 0x73, 0x20, 0x00, 0x00, 0x88, - 0xe5, 0x03, 0x20, 0x28, 0x25, 0x3a, 0x2d, 0x36, - 0x42, 0x00, 0x00, 0x20, 0x25, 0x73, 0x29, 0x0a, - 0x00, 0x00, 0x00, 0x3c, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x3e, 0x00, 0x00, 0x00, 0x3c, - 0x6f, 0x74, 0x68, 0x65, 0x72, 0x3e, 0x00, 0x3c, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x3e, 0x00, - 0x00, 0x00, 0x00, 0x3c, 0x77, 0x61, 0x69, 0x74, - 0x69, 0x6e, 0x67, 0x3e, 0x00, 0x00, 0x00, 0x09, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x20, 0x25, 0x4c, - 0x78, 0x20, 0x45, 0x6e, 0x64, 0x20, 0x25, 0x4c, - 0x78, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x20, - 0x25, 0x75, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, - 0x20, 0x0a, 0x00, 0xf1, 0xb5, 0x01, 0xf0, 0xa1, - 0xfd, 0x04, 0x1c, 0x0f, 0x1c, 0x23, 0x23, 0x0e, - 0x4d, 0x1b, 0x01, 0xee, 0x18, 0xb5, 0x42, 0x15, - 0xd2, 0x28, 0x68, 0x00, 0x28, 0x0f, 0xd0, 0x28, - 0x6a, 0x00, 0x99, 0x88, 0x42, 0x0b, 0xd0, 0xa8, - 0x68, 0x22, 0x1c, 0x3b, 0x1c, 0xe9, 0x68, 0x0e, - 0xf0, 0x4a, 0xfc, 0x00, 0x28, 0x03, 0xd0, 0x28, - 0x6a, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, - 0x35, 0xb5, 0x42, 0xe9, 0xd3, 0x00, 0x20, 0xf7, - 0xe7, 0x00, 0x00, 0x44, 0xe7, 0x03, 0x20, 0xff, - 0xb5, 0x1c, 0x1c, 0x0d, 0x1c, 0x07, 0x1c, 0x33, - 0xf0, 0xb6, 0xf9, 0x3b, 0x4e, 0xed, 0x09, 0x00, - 0x25, 0x00, 0x00, 0x20, 0x31, 0x68, 0x00, 0x29, - 0x69, 0xd1, 0x75, 0x62, 0xf5, 0x1d, 0x01, 0x35, - 0x37, 0x62, 0x01, 0xf0, 0x6d, 0xfd, 0x03, 0xc5, - 0x36, 0xa1, 0x28, 0xc9, 0xf0, 0x1d, 0x09, 0x30, - 0x28, 0xc0, 0x34, 0x60, 0x02, 0x9a, 0x00, 0x20, - 0xb2, 0x62, 0xf0, 0x62, 0xf8, 0x1d, 0x79, 0x30, - 0x08, 0x2c, 0x33, 0x4a, 0x31, 0x4d, 0x33, 0x49, - 0x08, 0xd2, 0x02, 0xa3, 0x1b, 0x5d, 0x5b, 0x00, - 0x9f, 0x44, 0x00, 0x1c, 0x04, 0x04, 0x04, 0x16, - 0x1e, 0x27, 0x2f, 0x37, 0x38, 0x6d, 0xb0, 0x61, - 0x78, 0x6d, 0xf0, 0x61, 0x30, 0x6a, 0x00, 0x69, - 0x01, 0x28, 0x04, 0xd1, 0x2a, 0x48, 0x30, 0x63, - 0x2a, 0x48, 0x70, 0x63, 0x2d, 0xe0, 0x2a, 0x48, - 0x30, 0x63, 0x2a, 0x48, 0x70, 0x63, 0x28, 0xe0, - 0xfa, 0x6f, 0xb2, 0x61, 0x00, 0x68, 0xf0, 0x61, - 0x27, 0x48, 0x30, 0x63, 0x71, 0x63, 0x20, 0xe0, - 0x78, 0x6e, 0xb0, 0x61, 0xb8, 0x6e, 0xf0, 0x61, - 0x23, 0x48, 0x30, 0x63, 0x71, 0x63, 0x7e, 0x67, - 0x17, 0xe0, 0xc1, 0x6a, 0xb1, 0x61, 0x01, 0x6b, - 0xf1, 0x61, 0x32, 0x63, 0x75, 0x63, 0xc6, 0x63, - 0x0f, 0xe0, 0xc1, 0x68, 0xb1, 0x61, 0x01, 0x69, - 0xf1, 0x61, 0x32, 0x63, 0x75, 0x63, 0x86, 0x62, - 0x07, 0xe0, 0x01, 0x20, 0x00, 0x03, 0xb0, 0x61, - 0xf0, 0x61, 0x18, 0x48, 0x30, 0x63, 0x18, 0x48, - 0x70, 0x63, 0x33, 0xf0, 0x4f, 0xf9, 0x01, 0x20, - 0x00, 0xf0, 0x4e, 0xfa, 0x15, 0x48, 0x01, 0x21, - 0x33, 0xf0, 0x68, 0xf9, 0x00, 0x20, 0x04, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0xe7, - 0x01, 0x30, 0x38, 0x36, 0x0a, 0x28, 0x8d, 0xd3, - 0x33, 0xf0, 0x3c, 0xf9, 0x07, 0x20, 0xf2, 0xe7, - 0x44, 0xe7, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x39, 0x5c, 0x00, 0x20, - 0xed, 0x09, 0x00, 0x26, 0x00, 0x6d, 0x5a, 0x00, - 0x20, 0x89, 0x5f, 0x00, 0x20, 0x59, 0x72, 0x00, - 0x20, 0xad, 0x73, 0x00, 0x20, 0x21, 0x84, 0x00, - 0x20, 0x3d, 0x85, 0x00, 0x20, 0x11, 0x60, 0x00, - 0x20, 0x65, 0x11, 0x00, 0x20, 0x1d, 0x12, 0x00, - 0x20, 0x78, 0x73, 0x03, 0x20, 0x80, 0xb4, 0x1a, - 0x4a, 0x00, 0x23, 0x17, 0x68, 0x8f, 0x42, 0x29, - 0xd1, 0x17, 0x6a, 0x87, 0x42, 0x26, 0xd1, 0x0f, - 0x1c, 0xc1, 0x1d, 0x79, 0x31, 0x07, 0x2f, 0x0b, - 0xd2, 0x01, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, - 0x44, 0x07, 0x07, 0x03, 0x09, 0x0e, 0x13, 0x18, - 0x00, 0x01, 0x6d, 0x91, 0x61, 0x40, 0x6d, 0xd0, - 0x61, 0x80, 0xbc, 0x70, 0x47, 0xc0, 0x6f, 0x90, - 0x61, 0x08, 0x68, 0xd0, 0x61, 0xf8, 0xe7, 0x41, - 0x6e, 0x91, 0x61, 0x80, 0x6e, 0xd0, 0x61, 0xf3, - 0xe7, 0xc8, 0x6a, 0x90, 0x61, 0x08, 0x6b, 0xd0, - 0x61, 0xee, 0xe7, 0xc8, 0x68, 0x90, 0x61, 0x08, - 0x69, 0xd0, 0x61, 0xe9, 0xe7, 0x38, 0x32, 0x01, - 0x33, 0x0a, 0x2b, 0xce, 0xd3, 0xe4, 0xe7, 0x00, - 0x00, 0x44, 0xe7, 0x03, 0x20, 0xb0, 0xb5, 0x0c, - 0x1c, 0x07, 0x1c, 0x00, 0x28, 0x13, 0xd0, 0x00, - 0x2c, 0x01, 0xd0, 0x33, 0xf0, 0xe1, 0xf8, 0x0a, - 0x48, 0x00, 0x25, 0x01, 0x6a, 0xb9, 0x42, 0x03, - 0xd0, 0x38, 0x30, 0x01, 0x35, 0x0a, 0x2d, 0xf8, - 0xd3, 0x00, 0x2c, 0x01, 0xd0, 0x33, 0xf0, 0xd0, - 0xf8, 0x0a, 0x2d, 0x00, 0xd1, 0x00, 0x27, 0x38, - 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x44, 0xe7, 0x03, 0x20, 0xf3, 0xb5, 0x81, - 0xb0, 0x45, 0x68, 0x1b, 0x4b, 0x00, 0x27, 0x01, - 0x1c, 0xec, 0x18, 0xb3, 0x23, 0x9b, 0x00, 0x17, - 0x4a, 0xeb, 0x18, 0x00, 0x95, 0x15, 0x6a, 0x00, - 0x9e, 0xb5, 0x42, 0x22, 0xd1, 0x15, 0x68, 0x02, - 0x9e, 0xb5, 0x42, 0xed, 0x09, 0x00, 0x27, 0x00, - 0x1e, 0xd1, 0xff, 0x31, 0x35, 0x31, 0x81, 0x42, - 0x1a, 0xd0, 0x8c, 0x42, 0x00, 0xd8, 0x19, 0x1c, - 0xcd, 0x68, 0x05, 0x2d, 0x01, 0xd0, 0x03, 0x2d, - 0x0e, 0xd1, 0x0d, 0x4b, 0x5f, 0x69, 0x87, 0x42, - 0x00, 0xd1, 0x59, 0x61, 0x51, 0x62, 0x49, 0x6f, - 0x00, 0x29, 0x01, 0xd0, 0x00, 0x20, 0x88, 0x65, - 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xff, 0x31, 0x35, 0x31, 0x81, 0x42, 0xe4, 0xd1, - 0x38, 0x32, 0x01, 0x37, 0x0a, 0x2f, 0xd4, 0xd3, - 0xf2, 0xe7, 0x44, 0xe7, 0x03, 0x20, 0x38, 0x0b, - 0x00, 0x00, 0x68, 0x14, 0x04, 0x20, 0xff, 0xb5, - 0x1c, 0x1c, 0x0f, 0x1c, 0x33, 0xf0, 0x87, 0xf8, - 0x6d, 0x4e, 0x00, 0x20, 0x00, 0x21, 0x35, 0x1c, - 0x2a, 0x6a, 0x00, 0x9b, 0x9a, 0x42, 0x16, 0xd1, - 0x2a, 0x68, 0xa2, 0x42, 0x13, 0xd1, 0x07, 0x2c, - 0x11, 0xd2, 0x01, 0xa3, 0x1b, 0x5d, 0x5b, 0x00, - 0x9f, 0x44, 0x0d, 0x0d, 0x13, 0x0d, 0x09, 0x0d, - 0x03, 0x00, 0x00, 0x9b, 0x00, 0x20, 0xd9, 0x1d, - 0x79, 0x31, 0x88, 0x62, 0x09, 0xe0, 0x00, 0x9b, - 0x00, 0x20, 0x58, 0x67, 0x05, 0xe0, 0x01, 0x29, - 0x03, 0xd0, 0x01, 0x30, 0x38, 0x35, 0x0a, 0x28, - 0xde, 0xd3, 0x00, 0x20, 0x00, 0x22, 0x31, 0x1c, - 0x0b, 0x6a, 0xbb, 0x42, 0x13, 0xd1, 0x0b, 0x68, - 0x09, 0x9e, 0xb3, 0x42, 0x03, 0xd0, 0x02, 0x2c, - 0x0d, 0xd1, 0x01, 0x2b, 0x0b, 0xd1, 0x09, 0x9e, - 0x07, 0x2e, 0x08, 0xd2, 0x02, 0xa3, 0x9b, 0x5d, - 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x04, 0x0b, - 0x0b, 0x04, 0x04, 0x04, 0x04, 0x00, 0x01, 0x2a, - 0x04, 0xd0, 0x01, 0x30, 0x38, 0x31, 0x0a, 0x28, - 0xe2, 0xd3, 0x17, 0xe0, 0x8d, 0x42, 0x15, 0xd0, - 0x02, 0x9a, 0x02, 0x20, 0x08, 0x60, 0x48, 0x48, - 0x4a, 0x62, 0x01, 0x60, 0x0b, 0x98, 0xed, 0x09, - 0x00, 0x28, 0x00, 0x00, 0x28, 0x07, 0xd0, 0x00, - 0x98, 0x0a, 0x99, 0x0c, 0x9b, 0x22, 0x1c, 0x00, - 0xf0, 0x9c, 0xf8, 0x07, 0x1c, 0x79, 0xe0, 0x02, - 0x20, 0x00, 0xf0, 0x29, 0xf9, 0x07, 0x1c, 0x74, - 0xe0, 0x0a, 0x99, 0xe8, 0x1d, 0xa9, 0x62, 0x09, - 0x9e, 0x3e, 0xa1, 0x2e, 0x60, 0x02, 0x9a, 0x09, - 0x30, 0x6a, 0x62, 0x48, 0xc9, 0x48, 0xc0, 0xee, - 0x1d, 0x01, 0x36, 0x01, 0xf0, 0xdc, 0xfb, 0x03, - 0xc6, 0x04, 0x2c, 0x0a, 0xd1, 0x09, 0x9e, 0x02, - 0x2e, 0x07, 0xd1, 0xf8, 0x1d, 0xff, 0x30, 0x7a, - 0x30, 0x41, 0x69, 0x00, 0x29, 0x01, 0xd0, 0x01, - 0x39, 0x41, 0x61, 0x09, 0x9e, 0xf8, 0x1d, 0x79, - 0x30, 0x07, 0x2e, 0x31, 0x4c, 0x32, 0x4a, 0x32, - 0x49, 0x39, 0xd2, 0x01, 0xa3, 0x9b, 0x5d, 0x5b, - 0x00, 0x9f, 0x44, 0x35, 0x03, 0x03, 0x15, 0x1d, - 0x26, 0x2e, 0x00, 0x38, 0x6d, 0xa8, 0x61, 0x78, - 0x6d, 0xe8, 0x61, 0x28, 0x6a, 0x00, 0x69, 0x01, - 0x28, 0x04, 0xd1, 0x2a, 0x48, 0x28, 0x63, 0x2a, - 0x48, 0x68, 0x63, 0x24, 0xe0, 0x2a, 0x48, 0x28, - 0x63, 0x2a, 0x48, 0x68, 0x63, 0x1f, 0xe0, 0xfa, - 0x6f, 0xaa, 0x61, 0x00, 0x68, 0xe8, 0x61, 0x27, - 0x48, 0x28, 0x63, 0x69, 0x63, 0x17, 0xe0, 0x78, - 0x6e, 0xa8, 0x61, 0xb8, 0x6e, 0xe8, 0x61, 0x23, - 0x48, 0x28, 0x63, 0x69, 0x63, 0x7d, 0x67, 0x0e, - 0xe0, 0xc1, 0x6a, 0xa9, 0x61, 0x01, 0x6b, 0xe9, - 0x61, 0x2a, 0x63, 0x6c, 0x63, 0xc5, 0x63, 0x06, - 0xe0, 0xc1, 0x68, 0xa9, 0x61, 0x01, 0x69, 0xe9, - 0x61, 0x2a, 0x63, 0x6c, 0x63, 0x85, 0x62, 0x02, - 0x9a, 0xd0, 0x1d, 0x79, 0x30, 0x40, 0x69, 0x00, - 0x28, 0x06, 0xd1, 0x02, 0x9a, 0x50, 0x68, 0xff, - 0x30, 0x81, 0x30, 0x00, 0x69, 0x80, 0x07, 0x04, - 0xd0, 0x04, 0x20, 0x00, 0xf0, 0xb8, 0xf8, 0x07, - 0x1c, 0xed, 0x09, 0x00, 0x29, 0x00, 0x03, 0xe0, - 0x02, 0x20, 0x00, 0xf0, 0xb3, 0xf8, 0x07, 0x1c, - 0x32, 0xf0, 0xae, 0xff, 0x38, 0x1c, 0x04, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x44, 0xe7, 0x03, 0x20, 0x74, 0x73, 0x03, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x39, 0x5c, 0x00, 0x20, 0x6d, 0x5a, 0x00, 0x20, - 0x89, 0x5f, 0x00, 0x20, 0x59, 0x72, 0x00, 0x20, - 0xad, 0x73, 0x00, 0x20, 0x21, 0x84, 0x00, 0x20, - 0x3d, 0x85, 0x00, 0x20, 0x11, 0x60, 0x00, 0x20, - 0xf0, 0xb5, 0x14, 0x1c, 0x1d, 0x1c, 0x0e, 0x1c, - 0x07, 0x1c, 0x32, 0xf0, 0x8d, 0xff, 0x29, 0x48, - 0x00, 0x21, 0x02, 0x6a, 0xba, 0x42, 0x44, 0xd1, - 0x02, 0x68, 0xa2, 0x42, 0x41, 0xd1, 0x22, 0x1c, - 0xfc, 0x1d, 0xff, 0x34, 0xf9, 0x1d, 0x79, 0x31, - 0x7a, 0x34, 0x08, 0x2a, 0x15, 0xd2, 0x02, 0xa3, - 0x9b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, - 0x11, 0x11, 0x11, 0x09, 0x07, 0x04, 0x0f, 0x11, - 0x00, 0x22, 0xca, 0x63, 0x09, 0xe0, 0x00, 0x22, - 0x7a, 0x67, 0x61, 0x69, 0x00, 0x29, 0x04, 0xd0, - 0x01, 0x39, 0x61, 0x61, 0x01, 0xe0, 0x00, 0x22, - 0x8a, 0x62, 0x00, 0x22, 0x02, 0x60, 0x00, 0x6a, - 0xc6, 0x60, 0x02, 0x20, 0x00, 0xf0, 0x5e, 0xf8, - 0x06, 0x1c, 0x32, 0xf0, 0x59, 0xff, 0x12, 0x48, - 0x01, 0x21, 0x32, 0xf0, 0x71, 0xff, 0x01, 0x28, - 0x01, 0xd1, 0x0e, 0xf0, 0x49, 0xff, 0x00, 0x2d, - 0x0b, 0xd0, 0x60, 0x69, 0x00, 0x28, 0x08, 0xd1, - 0x01, 0x21, 0x38, 0x1c, 0x01, 0xf0, 0x64, 0xfc, - 0x00, 0x28, 0x02, 0xd1, 0x38, 0x1c, 0x01, 0xf0, - 0xc1, 0xfc, 0x30, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x38, 0x30, 0x01, 0x31, 0x0a, 0x29, - 0xb3, 0xd3, 0x32, 0xf0, 0x39, 0xff, 0x00, 0x20, - 0xf4, 0xe7, 0x00, 0x00, 0xed, 0x09, 0x00, 0x2a, - 0x00, 0x44, 0xe7, 0x03, 0x20, 0x78, 0x73, 0x03, - 0x20, 0xf0, 0xb5, 0x82, 0xb0, 0x0c, 0x1c, 0x05, - 0x1c, 0x17, 0x1c, 0x32, 0xf0, 0x2f, 0xff, 0x15, - 0x4e, 0x00, 0x20, 0x31, 0x6a, 0xa9, 0x42, 0x1d, - 0xd1, 0x31, 0x68, 0xa1, 0x42, 0x1a, 0xd1, 0x01, - 0xf0, 0xe7, 0xfa, 0x00, 0x90, 0x01, 0x91, 0x00, - 0x99, 0xf8, 0x1f, 0xc1, 0x38, 0x81, 0x42, 0x02, - 0xd9, 0x01, 0x98, 0x01, 0x30, 0x01, 0x90, 0x69, - 0x46, 0xf0, 0x1d, 0x48, 0xc9, 0x01, 0x30, 0x48, - 0xc0, 0x02, 0x20, 0x00, 0xf0, 0x11, 0xf8, 0x32, - 0xf0, 0x0d, 0xff, 0x00, 0x20, 0x02, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x30, 0x38, - 0x36, 0x0a, 0x28, 0xda, 0xd3, 0x32, 0xf0, 0x02, - 0xff, 0x01, 0x20, 0xf3, 0xe7, 0x44, 0xe7, 0x03, - 0x20, 0xf0, 0xb5, 0x86, 0xb0, 0x82, 0xa3, 0x5c, - 0x68, 0x1d, 0x68, 0x07, 0x1c, 0x32, 0xf0, 0xfa, - 0xfe, 0x01, 0xf0, 0xba, 0xfa, 0x01, 0x90, 0x80, - 0x48, 0x02, 0x91, 0x86, 0x69, 0x05, 0x2f, 0x75, - 0xd2, 0x01, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, - 0x44, 0x0b, 0x02, 0x28, 0x19, 0xa2, 0x00, 0x00, - 0x2e, 0x23, 0xd0, 0x32, 0xf0, 0xe3, 0xfe, 0x00, - 0x20, 0x06, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x2e, 0x1a, 0xd0, 0x30, 0x69, 0x71, - 0x69, 0x01, 0x9a, 0x02, 0x9b, 0x0e, 0xf0, 0xfe, - 0xf8, 0x00, 0x28, 0x12, 0xd0, 0x32, 0xf0, 0xd2, - 0xfe, 0x00, 0x20, 0xed, 0xe7, 0x2d, 0x23, 0x9b, - 0x01, 0x30, 0x6a, 0x6e, 0x4a, 0xc0, 0x18, 0x40, - 0x68, 0xf7, 0x1d, 0x42, 0x43, 0x01, 0x98, 0x01, - 0x37, 0x02, 0x99, 0x00, 0x23, 0x80, 0x18, 0x59, - 0x41, 0x03, 0xc7, 0x69, 0x49, 0x01, 0x20, 0xc8, - 0x60, 0x88, 0x68, 0x40, 0x08, 0x40, 0x00, 0x88, - 0x60, 0x66, 0x4f, 0x00, 0x2e, 0x0d, 0xd0, 0xed, - 0x09, 0x00, 0x2b, 0x00, 0x72, 0x6b, 0x00, 0x2a, - 0x03, 0xd0, 0x01, 0x20, 0x31, 0x6a, 0xfd, 0xf7, - 0xa0, 0xfc, 0x00, 0x20, 0x70, 0x60, 0x31, 0x68, - 0x00, 0x29, 0x03, 0xd1, 0x30, 0x62, 0x01, 0xe0, - 0xfe, 0x1f, 0x31, 0x3e, 0x5e, 0x49, 0x08, 0x68, - 0x00, 0x28, 0x03, 0xd0, 0xc6, 0x1f, 0x31, 0x3e, - 0x00, 0x20, 0x08, 0x60, 0x00, 0x20, 0x00, 0x90, - 0x5a, 0x48, 0x05, 0x90, 0x05, 0x98, 0x38, 0x36, - 0x86, 0x42, 0x55, 0x4f, 0x00, 0xd1, 0x3e, 0x1c, - 0x30, 0x68, 0x00, 0x28, 0x44, 0xd0, 0x01, 0x28, - 0x42, 0xd0, 0xb0, 0x68, 0xf7, 0x1d, 0x04, 0x90, - 0xf1, 0x68, 0x01, 0x9a, 0x02, 0x9b, 0x01, 0x37, - 0x03, 0x91, 0x0e, 0xf0, 0x0a, 0xf9, 0x00, 0x28, - 0x2c, 0xd0, 0xb0, 0x69, 0x49, 0x4a, 0x00, 0x23, - 0x42, 0x43, 0xb0, 0x68, 0xf1, 0x68, 0x80, 0x18, - 0x59, 0x41, 0x03, 0xc7, 0x08, 0x3f, 0x01, 0x9a, - 0x00, 0xe0, 0x47, 0xe0, 0x02, 0x9b, 0x0e, 0xf0, - 0xf8, 0xf8, 0x00, 0x28, 0x03, 0xd0, 0x02, 0x99, - 0x79, 0x60, 0x01, 0x98, 0x38, 0x60, 0xf0, 0x69, - 0x3e, 0x4a, 0xf7, 0x1d, 0x42, 0x43, 0x01, 0x98, - 0x09, 0x37, 0x02, 0x99, 0x00, 0x23, 0x80, 0x18, - 0x59, 0x41, 0x03, 0xc7, 0x01, 0x20, 0x70, 0x60, - 0xf0, 0x6a, 0x01, 0x30, 0xf0, 0x62, 0xb0, 0x6a, - 0x31, 0x6a, 0xc8, 0x60, 0x00, 0x98, 0x0a, 0x28, - 0x2f, 0xd2, 0x16, 0xe0, 0x2a, 0x1c, 0x23, 0x1c, - 0x04, 0x98, 0x03, 0x99, 0x0e, 0xf0, 0xd5, 0xf8, - 0x00, 0x28, 0x01, 0xd0, 0x7c, 0x68, 0x3d, 0x68, - 0x00, 0x98, 0x01, 0x30, 0x00, 0x90, 0x0a, 0x28, - 0xac, 0xd3, 0x1e, 0xe0, 0x72, 0x6b, 0x00, 0x2a, - 0x03, 0xd0, 0x01, 0x20, 0x31, 0x6a, 0xfd, 0xf7, - 0x30, 0xfc, 0x00, 0x2e, 0x15, 0xd0, 0x30, 0x6a, - 0x25, 0x49, 0x48, 0x61, 0x8e, 0x61, 0x33, 0x6b, - 0x00, 0x2b, 0xed, 0x09, 0x00, 0x2c, 0x00, 0x04, - 0xd0, 0x31, 0x6a, 0x72, 0x6a, 0x01, 0x20, 0xfd, - 0xf7, 0x23, 0xfc, 0x32, 0xf0, 0x30, 0xfe, 0x35, - 0xe0, 0x1e, 0x49, 0x00, 0x20, 0x88, 0x61, 0x32, - 0xf0, 0x2a, 0xfe, 0x01, 0x20, 0x45, 0xe7, 0x1a, - 0x48, 0x00, 0x27, 0x47, 0x61, 0x87, 0x61, 0x16, - 0xa3, 0x1a, 0x68, 0x28, 0x1c, 0x21, 0x1c, 0x5b, - 0x68, 0x0d, 0xf0, 0xdd, 0xff, 0x00, 0x28, 0x1f, - 0xd0, 0x0e, 0xf0, 0x11, 0xfe, 0x28, 0x1c, 0x14, - 0x4e, 0x21, 0x1c, 0x31, 0x69, 0x40, 0x1a, 0x14, - 0x28, 0x01, 0xda, 0x01, 0x20, 0x00, 0xe0, 0x38, - 0x1c, 0x00, 0x28, 0x06, 0xd0, 0x01, 0xf0, 0xd1, - 0xf9, 0x64, 0x22, 0x0e, 0xf0, 0x84, 0xf8, 0x0c, - 0x1c, 0x05, 0x1c, 0x01, 0x20, 0xf0, 0x60, 0x75, - 0x61, 0xb0, 0x68, 0x01, 0x23, 0x18, 0x43, 0xb0, - 0x60, 0x21, 0x1c, 0x32, 0xf0, 0xfc, 0xfd, 0x01, - 0xe0, 0x32, 0xf0, 0xf9, 0xfd, 0x01, 0x20, 0x14, - 0xe7, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x88, 0xe5, 0x03, 0x20, 0x71, - 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, 0x44, - 0xe7, 0x03, 0x20, 0x74, 0x73, 0x03, 0x20, 0x74, - 0xe9, 0x03, 0x20, 0xf7, 0xb5, 0x00, 0x24, 0x0d, - 0x1c, 0x06, 0x1c, 0xfd, 0xf7, 0x89, 0xff, 0x07, - 0x1c, 0x02, 0xd1, 0xff, 0x24, 0x01, 0x34, 0x42, - 0xe0, 0x01, 0x20, 0x07, 0xf0, 0xb6, 0xf8, 0x00, - 0x28, 0x08, 0xd0, 0x74, 0x20, 0x38, 0x60, 0x0c, - 0x24, 0x09, 0x20, 0x39, 0x1c, 0xfc, 0x60, 0xfd, - 0xf7, 0xe6, 0xff, 0x34, 0xe0, 0x07, 0xf0, 0x6f, - 0xf8, 0x00, 0x28, 0x0e, 0xd1, 0x1b, 0xa1, 0x01, - 0x20, 0x06, 0xf0, 0xf5, 0xff, 0x00, 0x28, 0x08, - 0xd1, 0x74, 0x20, 0x38, 0x60, 0x07, 0x24, 0x09, - 0x20, 0x39, 0x1c, 0xfc, 0x60, 0xfd, 0xf7, 0xd3, - 0xff, 0x21, 0xe0, 0x37, 0x23, 0xed, 0x09, 0x00, - 0x2d, 0x00, 0x9b, 0x01, 0xc1, 0x18, 0x02, 0x9a, - 0x15, 0x4b, 0x0a, 0x62, 0xc1, 0x18, 0x4d, 0x60, - 0x0e, 0x60, 0xf8, 0x60, 0x01, 0x21, 0x39, 0x60, - 0x01, 0x69, 0x1a, 0x29, 0x02, 0xd1, 0xc1, 0x68, - 0x39, 0x61, 0x01, 0xe0, 0x00, 0x21, 0x39, 0x61, - 0x01, 0x21, 0x49, 0x03, 0xf9, 0x61, 0xbd, 0x61, - 0x7e, 0x61, 0x39, 0x62, 0x00, 0x22, 0x04, 0x21, - 0x06, 0xf0, 0x32, 0xff, 0x0b, 0x20, 0x39, 0x1c, - 0xfd, 0xf7, 0xb0, 0xff, 0x20, 0x1c, 0x03, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x69, 0x66, - 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x36, 0x30, 0x00, - 0xd8, 0x0d, 0x00, 0x00, 0xf0, 0xb5, 0x00, 0x24, - 0x06, 0x1c, 0xfd, 0xf7, 0x2c, 0xff, 0x07, 0x1c, - 0x02, 0xd1, 0xff, 0x24, 0x01, 0x34, 0x3c, 0xe0, - 0x0c, 0x20, 0x07, 0xf0, 0x11, 0xf8, 0x05, 0x1c, - 0x13, 0xd1, 0x14, 0x20, 0x07, 0xf0, 0x0c, 0xf8, - 0x05, 0x1c, 0x0e, 0xd1, 0x0c, 0x24, 0x00, 0x2e, - 0x07, 0xd0, 0x75, 0x20, 0x38, 0x60, 0x09, 0x20, - 0x39, 0x1c, 0xfc, 0x60, 0xfd, 0xf7, 0x82, 0xff, - 0x27, 0xe0, 0x38, 0x1c, 0xfd, 0xf7, 0x4a, 0xff, - 0x23, 0xe0, 0x00, 0x22, 0x05, 0x21, 0x28, 0x1c, - 0x06, 0xf0, 0xf6, 0xfe, 0x00, 0x28, 0x0e, 0xd0, - 0x0c, 0x24, 0x00, 0x2e, 0x07, 0xd0, 0x75, 0x20, - 0x38, 0x60, 0x09, 0x20, 0x39, 0x1c, 0xfc, 0x60, - 0xfd, 0xf7, 0x6c, 0xff, 0x11, 0xe0, 0x38, 0x1c, - 0xfd, 0xf7, 0x34, 0xff, 0x0d, 0xe0, 0x02, 0x20, - 0x6e, 0x61, 0x38, 0x60, 0xe8, 0x68, 0x01, 0x22, - 0xf8, 0x60, 0x00, 0x20, 0x29, 0x1c, 0x07, 0xf0, - 0x8d, 0xf8, 0x0b, 0x20, 0x39, 0x1c, 0xfd, 0xf7, - 0x59, 0xff, 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xff, 0xb5, 0x84, 0xb0, 0x07, 0x1c, - 0xed, 0x09, 0x00, 0x2e, 0x00, 0x00, 0x20, 0x47, - 0x4e, 0x03, 0x90, 0x03, 0xce, 0x08, 0x3e, 0x81, - 0x42, 0x02, 0xd0, 0x0c, 0x20, 0x03, 0x90, 0x73, - 0xe0, 0xb8, 0x42, 0x3c, 0xd0, 0x01, 0x2f, 0x0c, - 0xd1, 0x00, 0x28, 0x02, 0xd1, 0x01, 0x25, 0x00, - 0x24, 0x49, 0xe0, 0x02, 0x28, 0x02, 0xd1, 0x01, - 0x25, 0x02, 0x24, 0x2c, 0xe0, 0x00, 0x25, 0x02, - 0x24, 0x29, 0xe0, 0x02, 0x2f, 0x0c, 0xd1, 0x00, - 0x28, 0x02, 0xd1, 0x00, 0x25, 0x01, 0x24, 0x3a, - 0xe0, 0x01, 0x28, 0x02, 0xd1, 0x02, 0x25, 0x01, - 0x24, 0x2e, 0xe0, 0x02, 0x25, 0x00, 0x24, 0x2b, - 0xe0, 0x03, 0x2f, 0x0c, 0xd1, 0x00, 0x28, 0x02, - 0xd1, 0x01, 0x25, 0x01, 0x24, 0x26, 0xe0, 0x01, - 0x28, 0x02, 0xd1, 0x00, 0x25, 0x01, 0x24, 0x0e, - 0xe0, 0x01, 0x25, 0x00, 0x24, 0x0b, 0xe0, 0x03, - 0x28, 0x02, 0xd1, 0x02, 0x25, 0x02, 0x24, 0x19, - 0xe0, 0x01, 0x28, 0x02, 0xd1, 0x02, 0x25, 0x00, - 0x24, 0x01, 0xe0, 0x00, 0x25, 0x02, 0x24, 0x00, - 0x2d, 0x0e, 0xd1, 0x00, 0x2c, 0x13, 0xd1, 0xfd, - 0xf7, 0x98, 0xfe, 0x00, 0x28, 0x3c, 0xd0, 0x6e, - 0x21, 0x01, 0x60, 0x00, 0x21, 0xc1, 0x60, 0x01, - 0x1c, 0x09, 0x20, 0xfd, 0xf7, 0xfd, 0xfe, 0x33, - 0xe0, 0x00, 0x2c, 0x04, 0xd0, 0x01, 0x20, 0xf0, - 0x60, 0x00, 0x20, 0x30, 0x61, 0x01, 0xe0, 0x00, - 0x20, 0xf0, 0x60, 0x06, 0x98, 0x07, 0x99, 0x0d, - 0x9a, 0x00, 0x90, 0x01, 0x91, 0x29, 0x1c, 0x00, - 0x20, 0x02, 0x92, 0x22, 0x1c, 0x05, 0x9b, 0x08, - 0xf0, 0x05, 0xfd, 0x03, 0x90, 0x00, 0x28, 0x0f, - 0xd1, 0xb4, 0x61, 0x75, 0x61, 0x77, 0x60, 0x07, - 0x99, 0x71, 0x62, 0x0d, 0x9a, 0xb2, 0x62, 0x05, - 0x99, 0xf1, 0x61, 0x06, 0x98, 0x30, 0x62, 0x07, - 0x98, 0x0d, 0x99, 0x08, 0xf0, 0xa3, 0xfe, 0x0b, - 0xe0, 0xfd, 0xf7, 0xed, 0x09, 0x00, 0x2f, 0x00, - 0x63, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x6e, 0x21, - 0x01, 0x60, 0x03, 0x99, 0xc1, 0x60, 0x01, 0x1c, - 0x09, 0x20, 0xfd, 0xf7, 0xc8, 0xfe, 0x03, 0x98, - 0x08, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xd8, 0xeb, 0x03, 0x20, 0xf0, 0xb5, - 0x06, 0x1c, 0x03, 0x20, 0x00, 0x24, 0x0d, 0x1c, - 0x06, 0xf0, 0x37, 0xff, 0x07, 0x1c, 0x0b, 0xd1, - 0x04, 0x20, 0x06, 0xf0, 0x32, 0xff, 0x07, 0x1c, - 0x06, 0xd1, 0x05, 0x20, 0x06, 0xf0, 0x2d, 0xff, - 0x07, 0x1c, 0x01, 0xd1, 0x0c, 0x24, 0x14, 0xe0, - 0x0c, 0x48, 0x05, 0x62, 0xc6, 0x61, 0xfd, 0xf7, - 0x37, 0xfe, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x24, - 0x0b, 0xe0, 0x06, 0x21, 0x01, 0x60, 0xf9, 0x68, - 0xc1, 0x60, 0x71, 0x00, 0x01, 0x61, 0x69, 0x00, - 0x41, 0x61, 0x01, 0x1c, 0x0b, 0x20, 0xfd, 0xf7, - 0x96, 0xfe, 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xd8, 0xeb, 0x03, 0x20, 0xf0, 0xb5, - 0x06, 0x1c, 0x07, 0x20, 0x00, 0x24, 0x0d, 0x1c, - 0x06, 0xf0, 0x07, 0xff, 0x07, 0x1c, 0x0b, 0xd1, - 0x08, 0x20, 0x06, 0xf0, 0x02, 0xff, 0x07, 0x1c, - 0x06, 0xd1, 0x09, 0x20, 0x06, 0xf0, 0xfd, 0xfe, - 0x07, 0x1c, 0x01, 0xd1, 0x0c, 0x24, 0x18, 0xe0, - 0x0e, 0x48, 0x85, 0x62, 0x46, 0x62, 0x30, 0x1c, - 0x29, 0x1c, 0x08, 0xf0, 0x42, 0xfe, 0xfd, 0xf7, - 0x03, 0xfe, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x24, - 0x0b, 0xe0, 0x0b, 0x21, 0x01, 0x60, 0xf9, 0x68, - 0xc1, 0x60, 0x71, 0x00, 0x01, 0x61, 0x69, 0x00, - 0x41, 0x61, 0x01, 0x1c, 0x0b, 0x20, 0xfd, 0xf7, - 0x62, 0xfe, 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xd8, 0xeb, 0x03, 0x20, 0x0f, 0xb4, - 0xf0, 0xb5, 0x00, 0x25, 0x06, 0x1c, 0x01, 0x20, - 0x06, 0xf0, 0x1b, 0xff, 0x00, 0x28, 0xed, 0x09, - 0x00, 0x30, 0x00, 0x01, 0xd0, 0x0c, 0x25, 0x1f, - 0xe0, 0xfd, 0xf7, 0xe0, 0xfd, 0x07, 0x1c, 0x01, - 0xd1, 0x07, 0x25, 0x19, 0xe0, 0x06, 0xf0, 0xd5, - 0xfe, 0x04, 0x1c, 0x0a, 0xd1, 0x33, 0xa1, 0x01, - 0x20, 0x06, 0xf0, 0x5b, 0xfe, 0x04, 0x1c, 0x04, - 0xd1, 0x38, 0x1c, 0xfd, 0xf7, 0x0a, 0xfe, 0x07, - 0x25, 0x0a, 0xe0, 0x02, 0x21, 0x20, 0x1c, 0x0b, - 0x9a, 0x06, 0xf0, 0xef, 0xff, 0x00, 0x28, 0x16, - 0xd1, 0x38, 0x1c, 0xfd, 0xf7, 0xfe, 0xfd, 0x09, - 0x25, 0xfd, 0xf7, 0xc0, 0xfd, 0x00, 0x28, 0x09, - 0xd0, 0x6f, 0x21, 0x01, 0x60, 0x00, 0x21, 0x01, - 0x61, 0x45, 0x61, 0xc6, 0x60, 0x01, 0x1c, 0x09, - 0x20, 0xfd, 0xf7, 0x23, 0xfe, 0x28, 0x1c, 0xf0, - 0xbc, 0x08, 0xbc, 0x04, 0xb0, 0x18, 0x47, 0xc6, - 0x60, 0x07, 0x9a, 0x08, 0xae, 0x82, 0x61, 0x06, - 0x9a, 0x42, 0x61, 0x0a, 0x99, 0x01, 0x87, 0x0c, - 0xce, 0xc1, 0x1d, 0x29, 0x31, 0x0c, 0xc1, 0x37, - 0x23, 0x9b, 0x01, 0xe1, 0x18, 0x48, 0x63, 0x1a, - 0x4e, 0xe1, 0x1d, 0x0c, 0xce, 0x29, 0x31, 0x0c, - 0xc1, 0xf8, 0x60, 0x07, 0x21, 0x39, 0x60, 0x41, - 0x68, 0x39, 0x61, 0x21, 0x69, 0x1a, 0x29, 0x03, - 0xd1, 0x41, 0x68, 0xc9, 0x68, 0x79, 0x61, 0x01, - 0xe0, 0x00, 0x21, 0x79, 0x61, 0x00, 0x7f, 0xb8, - 0x61, 0x07, 0x9a, 0xf8, 0x1d, 0x3a, 0x62, 0x06, - 0x99, 0x1d, 0x30, 0xf9, 0x61, 0x08, 0xa9, 0x0c, - 0xc9, 0x0c, 0xc0, 0x0f, 0x98, 0x00, 0x22, 0xf8, - 0x62, 0x10, 0x98, 0x08, 0x21, 0x38, 0x63, 0x0c, - 0x98, 0x78, 0x63, 0x20, 0x1c, 0x06, 0xf0, 0x63, - 0xfd, 0x0b, 0x20, 0x39, 0x1c, 0xfd, 0xf7, 0xe1, - 0xfd, 0xbc, 0xe7, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x63, 0x69, 0x66, 0x2e, 0x63, 0x3a, 0x20, 0x36, - 0x31, 0x33, 0x00, 0xc4, 0xeb, 0x03, 0x20, 0xf0, - 0xb5, 0xed, 0x09, 0x00, 0x31, 0x00, 0x00, 0x25, - 0x0c, 0x1c, 0x07, 0x1c, 0x06, 0xf0, 0xd5, 0xfe, - 0x00, 0x28, 0x01, 0xd1, 0x02, 0x25, 0x22, 0xe0, - 0x38, 0x69, 0x05, 0x28, 0x02, 0xd0, 0xff, 0x25, - 0x0a, 0x35, 0x1c, 0xe0, 0xfc, 0x60, 0x38, 0x1c, - 0x08, 0xf0, 0x05, 0xff, 0x04, 0x1c, 0x16, 0xd0, - 0x7a, 0x26, 0xfd, 0xf7, 0x4e, 0xfd, 0x00, 0x28, - 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xa1, 0x24, 0xf0, - 0xda, 0xff, 0x07, 0xe0, 0x06, 0x60, 0xf9, 0x68, - 0xc1, 0x60, 0x04, 0x61, 0x01, 0x1c, 0x09, 0x20, - 0xfd, 0xf7, 0xae, 0xfd, 0x38, 0x1c, 0x08, 0xf0, - 0xee, 0xfe, 0x04, 0x1c, 0xe9, 0xd1, 0x28, 0x1c, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x69, 0x66, - 0x2e, 0x63, 0x3a, 0x20, 0x37, 0x31, 0x34, 0x00, - 0x00, 0xb5, 0x00, 0x21, 0x08, 0xf0, 0xe6, 0xfc, - 0x08, 0xbc, 0x18, 0x47, 0xff, 0xb5, 0x82, 0xb0, - 0x00, 0x27, 0x04, 0x1c, 0x0d, 0x1c, 0x0b, 0x9e, - 0x06, 0xf0, 0x93, 0xfe, 0x00, 0x28, 0x07, 0xd1, - 0x02, 0x27, 0x39, 0x1c, 0x20, 0x1c, 0x32, 0x1c, - 0x2b, 0x1c, 0x09, 0xf0, 0x10, 0xf9, 0x26, 0xe0, - 0x20, 0x69, 0x05, 0x28, 0x07, 0xd0, 0x0c, 0x27, - 0x39, 0x1c, 0x20, 0x1c, 0x32, 0x1c, 0x2b, 0x1c, - 0x09, 0xf0, 0x05, 0xf9, 0x1b, 0xe0, 0x00, 0x2d, - 0x07, 0xd1, 0x11, 0x27, 0x39, 0x1c, 0x20, 0x1c, - 0x32, 0x1c, 0x2b, 0x1c, 0x09, 0xf0, 0xfb, 0xf8, - 0x11, 0xe0, 0x03, 0x2d, 0x02, 0xd1, 0xe0, 0x1d, - 0xb5, 0x30, 0x01, 0xe0, 0xe0, 0x1d, 0x55, 0x30, - 0x05, 0x9b, 0x11, 0x22, 0x03, 0x61, 0x01, 0x92, - 0x02, 0x1c, 0x20, 0x1c, 0x33, 0x1c, 0x00, 0x95, - 0x04, 0x99, 0x09, 0xf0, 0xd1, 0xf9, 0x38, 0x1c, - 0x06, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xb0, 0xb5, 0x00, 0x24, 0xed, 0x09, 0x00, 0x32, - 0x00, 0x0d, 0x1c, 0x07, 0x1c, 0x06, 0xf0, 0x57, - 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xff, 0x24, 0x0c, - 0x34, 0x10, 0xe0, 0x0a, 0x49, 0x69, 0x43, 0x38, - 0x1c, 0x07, 0xf0, 0xc4, 0xfe, 0xf8, 0x6c, 0x00, - 0x28, 0x08, 0xd1, 0x38, 0x1c, 0x07, 0xf0, 0xae, - 0xfe, 0x38, 0x1c, 0x07, 0xf0, 0xd9, 0xfd, 0x38, - 0x1c, 0x07, 0xf0, 0xee, 0xfd, 0x20, 0x1c, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe2, 0x04, 0x00, - 0x00, 0xf0, 0xb5, 0x00, 0x25, 0x0c, 0x1c, 0x07, - 0x1c, 0x00, 0x28, 0x0a, 0x4e, 0x0b, 0xd9, 0xa8, - 0x00, 0x20, 0x58, 0x01, 0x02, 0x09, 0x0a, 0xe8, - 0x00, 0x80, 0x19, 0xa0, 0x30, 0x25, 0xf0, 0xb4, - 0xfc, 0x01, 0x35, 0xbd, 0x42, 0xf3, 0xd3, 0xf0, - 0x1d, 0x79, 0x30, 0xc7, 0x61, 0xf0, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x18, 0xeb, 0x03, - 0x20, 0xf0, 0xb5, 0x00, 0x27, 0xfd, 0xf7, 0xa7, - 0xfc, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, 0x1c, - 0xe0, 0x10, 0x4b, 0xc3, 0x21, 0xda, 0x1d, 0x79, - 0x32, 0x01, 0x60, 0xd5, 0x69, 0xc4, 0x1d, 0x09, - 0x34, 0x00, 0x21, 0x00, 0x2d, 0x0b, 0xd9, 0xcd, - 0x00, 0xed, 0x18, 0x80, 0x35, 0x6d, 0x6a, 0xad, - 0x01, 0x2e, 0x0a, 0x8d, 0x00, 0x66, 0x51, 0xd5, - 0x69, 0x01, 0x31, 0x8d, 0x42, 0xf3, 0xd8, 0xd1, - 0x69, 0xc1, 0x60, 0x01, 0x1c, 0x08, 0x20, 0xfd, - 0xf7, 0xf5, 0xfc, 0x38, 0x1c, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x18, 0xeb, 0x03, - 0x20, 0xf0, 0xb5, 0x00, 0x27, 0x04, 0x1c, 0x15, - 0x1c, 0x0e, 0x1c, 0x06, 0xf0, 0xec, 0xfd, 0x00, - 0x28, 0x02, 0xd1, 0xff, 0x27, 0x0c, 0x37, 0x12, - 0xe0, 0xfd, 0xf7, 0x71, 0xfc, 0x00, 0x28, 0x01, - 0xd1, 0x07, 0x27, 0x0c, 0xe0, 0x17, 0x21, 0x01, - 0x60, 0xa1, 0x68, 0xc1, 0x60, 0x5c, 0xce, 0xed, - 0x09, 0x00, 0x33, 0x00, 0xc1, 0x1d, 0x09, 0x31, - 0x5c, 0xc1, 0x05, 0x62, 0x01, 0x1c, 0x0b, 0x20, - 0xfd, 0xf7, 0xcf, 0xfc, 0x38, 0x1c, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x00, 0x24, - 0x07, 0x1c, 0x06, 0xf0, 0xcb, 0xfd, 0x00, 0x28, - 0x02, 0xd1, 0xff, 0x24, 0x0c, 0x34, 0x42, 0xe0, - 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x69, 0x3a, 0x31, - 0x05, 0x2a, 0x02, 0xd1, 0xfa, 0x6c, 0x00, 0x2a, - 0x09, 0xd0, 0x48, 0x6b, 0x0c, 0x24, 0x01, 0x30, - 0x48, 0x63, 0x38, 0x1c, 0x00, 0x22, 0x21, 0x1c, - 0x07, 0xf0, 0x7f, 0xff, 0x2f, 0xe0, 0xfa, 0x1d, - 0xff, 0x32, 0x7a, 0x32, 0x12, 0x6b, 0x00, 0x2a, - 0x09, 0xd0, 0x48, 0x6b, 0x0c, 0x24, 0x01, 0x30, - 0x48, 0x63, 0x38, 0x1c, 0x00, 0x22, 0x21, 0x1c, - 0x07, 0xf0, 0x6f, 0xff, 0x1f, 0xe0, 0x4a, 0x6b, - 0x01, 0x32, 0x4a, 0x63, 0x80, 0x69, 0x01, 0x28, - 0x06, 0xd1, 0x38, 0x1c, 0x08, 0xf0, 0x12, 0xf8, - 0x01, 0x21, 0x38, 0x1c, 0x08, 0xf0, 0x27, 0xf8, - 0xfd, 0xf7, 0x20, 0xfc, 0x00, 0x28, 0x07, 0xd0, - 0x15, 0x21, 0x01, 0x60, 0xb9, 0x68, 0xc1, 0x60, - 0x01, 0x1c, 0x0b, 0x20, 0xfd, 0xf7, 0x85, 0xfc, - 0x00, 0x21, 0x38, 0x1c, 0x07, 0xf0, 0x99, 0xff, - 0x38, 0x1c, 0x07, 0xf0, 0xb8, 0xff, 0x20, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x00, 0x27, 0x04, 0x1c, 0x06, 0xf0, 0x7a, 0xfd, - 0x00, 0x28, 0x02, 0xd1, 0xff, 0x27, 0x0c, 0x37, - 0x0d, 0xe0, 0xfd, 0xf7, 0xff, 0xfb, 0x00, 0x28, - 0x01, 0xd1, 0x07, 0x27, 0x07, 0xe0, 0x24, 0x21, - 0x01, 0x60, 0xa1, 0x68, 0xc1, 0x60, 0x01, 0x1c, - 0x0b, 0x20, 0xfd, 0xf7, 0x62, 0xfc, 0x38, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, - 0x00, 0x25, 0x04, 0x1c, 0x06, 0xf0, 0x5e, 0xfd, - 0x00, 0x28, 0xed, 0x09, 0x00, 0x34, 0x00, 0x02, - 0xd1, 0xff, 0x25, 0x0c, 0x35, 0x2e, 0xe0, 0xfd, - 0xf7, 0xe3, 0xfb, 0x07, 0x1c, 0x2a, 0xd0, 0x7e, - 0x20, 0x38, 0x60, 0xe0, 0x68, 0x16, 0x49, 0xf8, - 0x60, 0x00, 0x20, 0x38, 0x61, 0xe0, 0x1d, 0xff, - 0x30, 0x3a, 0x30, 0x00, 0x6a, 0x13, 0x4b, 0x00, - 0x01, 0x40, 0x18, 0xc0, 0x68, 0xff, 0x34, 0x81, - 0x34, 0x78, 0x75, 0xa0, 0x68, 0x98, 0x42, 0x02, - 0xd1, 0x88, 0x20, 0x38, 0x75, 0x02, 0xe0, 0x24, - 0xf0, 0x70, 0xff, 0x38, 0x75, 0xe0, 0x68, 0xb8, - 0x61, 0x20, 0x69, 0xf8, 0x61, 0x60, 0x6a, 0x38, - 0x62, 0xa0, 0x6a, 0xf8, 0x62, 0xe0, 0x69, 0xb8, - 0x62, 0xe0, 0x6a, 0x78, 0x62, 0x09, 0x20, 0x39, - 0x1c, 0xfd, 0xf7, 0x25, 0xfc, 0x28, 0x1c, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x50, - 0x7b, 0x03, 0x20, 0xff, 0xff, 0x00, 0x00, 0xf8, - 0xb5, 0x00, 0x24, 0x00, 0x26, 0xfd, 0xf7, 0xa8, - 0xfb, 0x07, 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x2c, - 0xe0, 0x18, 0x49, 0x01, 0x20, 0xca, 0x1d, 0xf9, - 0x32, 0x10, 0x61, 0xc8, 0x1d, 0xa5, 0x30, 0x05, - 0x1c, 0x06, 0x22, 0x14, 0xa1, 0x22, 0xf0, 0xe3, - 0xfb, 0x15, 0x49, 0x00, 0x28, 0x00, 0x91, 0x0c, - 0xd0, 0xc8, 0x1f, 0x2d, 0x38, 0xc0, 0x6a, 0x01, - 0x02, 0x09, 0x0a, 0x00, 0x98, 0x25, 0xf0, 0x89, - 0xfb, 0x01, 0x26, 0x29, 0x1c, 0x0f, 0xa0, 0x11, - 0xf0, 0x96, 0xfd, 0x19, 0x20, 0x38, 0x60, 0xfe, - 0x60, 0x48, 0xcd, 0xf8, 0x1d, 0x09, 0x30, 0x48, - 0xc0, 0x00, 0x99, 0xf8, 0x1d, 0x60, 0xc9, 0x11, - 0x30, 0x60, 0xc0, 0x0b, 0x20, 0x39, 0x1c, 0xfd, - 0xf7, 0xe6, 0xfb, 0x20, 0x1c, 0xf8, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x18, 0xeb, 0x03, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, - 0xeb, 0x03, 0x20, 0x0a, 0x4d, 0xed, 0x09, 0x00, - 0x35, 0x00, 0x79, 0x20, 0x42, 0x54, 0x41, 0x64, - 0x64, 0x72, 0x3a, 0x20, 0x25, 0x3a, 0x2d, 0x36, - 0x42, 0x20, 0x28, 0x66, 0x69, 0x6e, 0x61, 0x6c, - 0x29, 0x0a, 0x00, 0x00, 0xf0, 0xb5, 0x00, 0x27, - 0x0c, 0x1c, 0x05, 0x1c, 0x16, 0x1c, 0x06, 0xf0, - 0xca, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0xff, 0x27, - 0x0c, 0x37, 0x04, 0xe0, 0xe8, 0x1d, 0xf9, 0x30, - 0xc4, 0x61, 0x34, 0x40, 0x04, 0x62, 0x38, 0x1c, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, - 0x00, 0x27, 0x14, 0x1c, 0x05, 0x1c, 0x0e, 0x1c, - 0x06, 0xf0, 0xb5, 0xfc, 0x00, 0x28, 0x02, 0xd1, - 0xff, 0x27, 0x0c, 0x37, 0x0d, 0xe0, 0xe8, 0x1d, - 0xf9, 0x30, 0x01, 0x2c, 0x01, 0xd0, 0x02, 0x2c, - 0x02, 0xd1, 0x01, 0x21, 0x41, 0x62, 0x01, 0xe0, - 0x00, 0x21, 0x41, 0x62, 0xc1, 0x69, 0x31, 0x40, - 0x01, 0x62, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf0, 0xb5, 0x00, 0x24, 0x15, 0x1c, - 0x0e, 0x1c, 0x07, 0x1c, 0x00, 0x28, 0x07, 0xd0, - 0x38, 0x1c, 0x06, 0xf0, 0x94, 0xfc, 0x00, 0x28, - 0x02, 0xd1, 0xff, 0x24, 0x0c, 0x34, 0x1c, 0xe0, - 0xfd, 0xf7, 0x19, 0xfb, 0x00, 0x28, 0x18, 0xd0, - 0x18, 0x21, 0x01, 0x60, 0x00, 0x2f, 0x07, 0xd0, - 0xf9, 0x1d, 0xff, 0x31, 0x7a, 0x31, 0x4d, 0x60, - 0x0e, 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x04, 0xe0, - 0x08, 0x49, 0xcd, 0x63, 0x8e, 0x63, 0x00, 0x21, - 0xc1, 0x60, 0x05, 0x21, 0x41, 0x61, 0x85, 0x61, - 0x06, 0x61, 0x01, 0x1c, 0x0b, 0x20, 0xfd, 0xf7, - 0x6d, 0xfb, 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xd8, 0xeb, 0x03, 0x20, - 0xf7, 0xb5, 0x8e, 0xb0, 0x00, 0x25, 0x07, 0x1c, - 0x06, 0xf0, 0x65, 0xfc, 0x06, 0x1c, 0x02, 0xd1, - 0xff, 0x25, 0x0c, 0x35, 0x6b, 0xe0, 0xf8, 0x6c, - 0xed, 0x09, 0x00, 0x36, 0x00, 0x00, 0x28, 0x03, - 0xd0, 0x78, 0x6d, 0x00, 0x28, 0x65, 0xd0, 0x05, - 0xe0, 0x0f, 0x99, 0x00, 0x29, 0x02, 0xd1, 0x10, - 0x9a, 0x00, 0x2a, 0x5e, 0xd0, 0xfd, 0xf7, 0xdd, - 0xfa, 0x04, 0x1c, 0x5a, 0xd0, 0xf8, 0x6c, 0x00, - 0x28, 0x3b, 0xd1, 0xb0, 0x69, 0x01, 0x28, 0x15, - 0xd1, 0x00, 0x20, 0xb8, 0x65, 0x39, 0x7f, 0x30, - 0x1c, 0x06, 0xf0, 0x2e, 0xfc, 0x00, 0x28, 0x0b, - 0xd0, 0x39, 0xa1, 0x02, 0x20, 0x06, 0xf0, 0x50, - 0xfb, 0x78, 0x65, 0x00, 0x28, 0x02, 0xd0, 0x1a, - 0x21, 0x01, 0x61, 0x16, 0xe0, 0x07, 0x25, 0x42, - 0xe0, 0x7e, 0x65, 0x12, 0xe0, 0x06, 0xf0, 0xb8, - 0xfb, 0x78, 0x65, 0x00, 0x28, 0x07, 0xd0, 0xf9, - 0x1d, 0xf9, 0x31, 0xca, 0x69, 0x01, 0x21, 0x06, - 0xf0, 0xdb, 0xfc, 0xb8, 0x65, 0x01, 0xe0, 0x7e, - 0x65, 0xbf, 0x65, 0xb8, 0x6d, 0x00, 0x28, 0x2d, - 0xd0, 0x07, 0x65, 0x38, 0x1c, 0x07, 0xf0, 0x2e, - 0xfc, 0x38, 0x1c, 0x07, 0xf0, 0xaf, 0xfb, 0x38, - 0x1c, 0x07, 0xf0, 0xa5, 0xfd, 0x38, 0x1c, 0x07, - 0xf0, 0x8c, 0xfe, 0x01, 0x21, 0x38, 0x1c, 0x07, - 0xf0, 0x23, 0xfe, 0x01, 0x20, 0xf8, 0x64, 0x1a, - 0x21, 0x21, 0x60, 0xb8, 0x68, 0xe0, 0x61, 0x0f, - 0x99, 0x21, 0x62, 0x10, 0x9a, 0x62, 0x62, 0xb8, - 0x6d, 0xe0, 0x60, 0x78, 0x6d, 0x20, 0x61, 0x78, - 0x6d, 0xc0, 0x68, 0x60, 0x61, 0xb9, 0x6d, 0x00, - 0x20, 0x00, 0x29, 0x00, 0xd0, 0x08, 0x7f, 0xa0, - 0x61, 0x0b, 0x20, 0x21, 0x1c, 0xfd, 0xf7, 0xf0, - 0xfa, 0x0b, 0xe0, 0x1f, 0xe0, 0x09, 0x25, 0x7d, - 0x20, 0x20, 0x60, 0xe7, 0x60, 0xf8, 0x68, 0x20, - 0x61, 0x09, 0x20, 0x21, 0x1c, 0x65, 0x61, 0xfd, - 0xf7, 0xe3, 0xfa, 0x0f, 0x99, 0x00, 0x29, 0x11, - 0xd1, 0x10, 0x9a, 0x00, 0x2a, 0x0e, 0xd1, 0x41, - 0x20, 0x00, 0x90, 0xed, 0x09, 0x00, 0x37, 0x00, - 0x38, 0x7f, 0x03, 0x90, 0x78, 0x68, 0x04, 0x90, - 0x00, 0x20, 0x06, 0x90, 0x05, 0x90, 0x1f, 0x20, - 0x07, 0x90, 0x68, 0x46, 0x01, 0x21, 0x06, 0xf0, - 0xee, 0xff, 0x28, 0x1c, 0x11, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x31, 0x32, 0x31, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x80, 0xb4, 0xc1, 0x1d, 0x10, 0x4b, - 0xff, 0x31, 0xe6, 0x31, 0x00, 0x27, 0x28, 0x22, - 0xc3, 0x18, 0x8b, 0x42, 0x0e, 0xd3, 0x08, 0x69, - 0x05, 0x28, 0x07, 0xd1, 0xc8, 0x1d, 0xff, 0x30, - 0x3a, 0x30, 0xc0, 0x6a, 0x01, 0x37, 0x90, 0x42, - 0x00, 0xd2, 0x02, 0x1c, 0xff, 0x31, 0xb5, 0x31, - 0x8b, 0x42, 0xf0, 0xd2, 0x78, 0x00, 0x81, 0x1c, - 0x91, 0x42, 0x03, 0xd2, 0x10, 0x1a, 0x02, 0x38, - 0x80, 0xbc, 0x70, 0x47, 0x00, 0x20, 0xfb, 0xe7, - 0x00, 0x00, 0x24, 0x0c, 0x00, 0x00, 0xf7, 0xb5, - 0x00, 0x27, 0x04, 0x1c, 0x0e, 0x1c, 0x06, 0xf0, - 0x97, 0xfb, 0x05, 0x1c, 0x02, 0xd1, 0xff, 0x27, - 0x0c, 0x37, 0x29, 0xe0, 0x00, 0x2e, 0x09, 0xd0, - 0xe0, 0x1d, 0xff, 0x30, 0x3a, 0x30, 0xc6, 0x62, - 0x02, 0x9a, 0x60, 0x68, 0x07, 0x23, 0x5b, 0x02, - 0xc0, 0x18, 0x42, 0x60, 0x20, 0x69, 0x05, 0x28, - 0x02, 0xd0, 0xff, 0x27, 0x0a, 0x37, 0x17, 0xe0, - 0xfd, 0xf7, 0x0a, 0xfa, 0x06, 0x1c, 0x01, 0xd1, - 0x07, 0x27, 0x11, 0xe0, 0x28, 0x1c, 0xff, 0xf7, - 0xb4, 0xff, 0x25, 0x21, 0x40, 0x00, 0x31, 0x60, - 0xa1, 0x68, 0x30, 0x61, 0x07, 0x23, 0x5b, 0x02, - 0xe8, 0x18, 0xf1, 0x60, 0x40, 0x68, 0x70, 0x61, - 0x0b, 0x20, 0x31, 0x1c, 0xfd, 0xf7, 0x63, 0xfa, - 0x38, 0x1c, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xff, 0xb5, 0x00, 0x27, 0xed, 0x09, - 0x00, 0x38, 0x00, 0x0c, 0x1c, 0x05, 0x1c, 0x16, - 0x1c, 0x06, 0xf0, 0x5c, 0xfb, 0x00, 0x28, 0x02, - 0xd1, 0xff, 0x27, 0x0c, 0x37, 0x26, 0xe0, 0x28, - 0x69, 0x05, 0x28, 0x02, 0xd0, 0xff, 0x27, 0x0a, - 0x37, 0x20, 0xe0, 0xfd, 0xf7, 0xdb, 0xf9, 0x00, - 0x28, 0x01, 0xd1, 0x07, 0x27, 0x1a, 0xe0, 0x1b, - 0x21, 0x01, 0x60, 0x00, 0x2c, 0x07, 0xd0, 0xff, - 0x2c, 0x05, 0xd0, 0x00, 0x2e, 0x03, 0xd1, 0x03, - 0x9b, 0x43, 0x62, 0x09, 0x99, 0x81, 0x62, 0xa9, - 0x68, 0x0c, 0x30, 0x52, 0xc0, 0x0a, 0x99, 0x18, - 0x38, 0x89, 0x00, 0x01, 0x62, 0x0b, 0x99, 0x81, - 0x61, 0x0c, 0x99, 0xc1, 0x61, 0x01, 0x1c, 0x0b, - 0x20, 0xfd, 0xf7, 0x2b, 0xfa, 0x38, 0x1c, 0x04, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, - 0xb5, 0x00, 0x27, 0x04, 0x1c, 0x0d, 0x1c, 0x06, - 0xf0, 0x25, 0xfb, 0x00, 0x28, 0x02, 0xd1, 0xff, - 0x27, 0x0c, 0x37, 0x20, 0xe0, 0xfd, 0xf7, 0xaa, - 0xf9, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, 0x1a, - 0xe0, 0x23, 0x21, 0x01, 0x60, 0xa1, 0x68, 0x00, - 0x22, 0xc1, 0x60, 0x01, 0x21, 0x00, 0x2d, 0x07, - 0xd0, 0x64, 0x68, 0x37, 0x23, 0x9b, 0x01, 0xe3, - 0x18, 0x99, 0x63, 0x02, 0x61, 0x41, 0x61, 0x06, - 0xe0, 0x64, 0x68, 0x37, 0x23, 0x9b, 0x01, 0xe3, - 0x18, 0x9a, 0x63, 0x01, 0x61, 0x42, 0x61, 0x01, - 0x1c, 0x0b, 0x20, 0xfd, 0xf7, 0xfa, 0xf9, 0x38, - 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, - 0xb5, 0x00, 0x24, 0x05, 0x1c, 0x0a, 0x9e, 0x06, - 0xf0, 0xf5, 0xfa, 0x00, 0x28, 0x02, 0xd1, 0xff, - 0x24, 0x0c, 0x34, 0x33, 0xe0, 0x28, 0x69, 0x05, - 0x28, 0x02, 0xd0, 0xff, 0x24, 0x0a, 0x34, 0x2d, - 0xe0, 0xfd, 0xf7, 0x74, 0xf9, 0x07, 0x1c, 0x01, - 0xd1, 0x07, 0x24, 0x27, 0xe0, 0x03, 0x9b, 0x07, - 0x2b, 0xed, 0x09, 0x00, 0x39, 0x00, 0x01, 0xd1, - 0x02, 0x21, 0x05, 0xe0, 0x03, 0x9b, 0x06, 0x2b, - 0x01, 0xd1, 0x03, 0x21, 0x00, 0xe0, 0x06, 0x21, - 0x28, 0x1c, 0x06, 0xf0, 0x79, 0xf8, 0x68, 0x68, - 0x80, 0x69, 0x02, 0x28, 0x02, 0xd1, 0xb0, 0x1c, - 0x06, 0x01, 0x36, 0x09, 0x26, 0x20, 0x38, 0x60, - 0xa8, 0x68, 0xf8, 0x60, 0x01, 0x99, 0x39, 0x61, - 0x02, 0x9a, 0x7a, 0x61, 0x03, 0x9b, 0xbb, 0x61, - 0x09, 0x98, 0xf8, 0x61, 0x3e, 0x62, 0x0b, 0x98, - 0x78, 0x62, 0x0b, 0x20, 0x39, 0x1c, 0xfd, 0xf7, - 0xb7, 0xf9, 0x20, 0x1c, 0x04, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x00, 0x24, - 0x05, 0x1c, 0x0e, 0x1c, 0x06, 0xf0, 0xb1, 0xfa, - 0x00, 0x28, 0x02, 0xd1, 0xff, 0x24, 0x0c, 0x34, - 0x11, 0xe0, 0xfd, 0xf7, 0x36, 0xf9, 0x07, 0x1c, - 0x01, 0xd1, 0x07, 0x24, 0x0b, 0xe0, 0x28, 0x1c, - 0x06, 0xf0, 0x53, 0xf8, 0x27, 0x20, 0x38, 0x60, - 0xa8, 0x68, 0xf8, 0x60, 0x0b, 0x20, 0x39, 0x1c, - 0x3e, 0x61, 0xfd, 0xf7, 0x95, 0xf9, 0x20, 0x1c, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, - 0x00, 0x27, 0x04, 0x1c, 0x15, 0x1c, 0x0e, 0x1c, - 0x06, 0xf0, 0x8f, 0xfa, 0x00, 0x28, 0x02, 0xd1, - 0xff, 0x27, 0x0c, 0x37, 0x0f, 0xe0, 0xfd, 0xf7, - 0x14, 0xf9, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, - 0x09, 0xe0, 0x1f, 0x21, 0x01, 0x60, 0xa1, 0x68, - 0xc1, 0x60, 0x06, 0x61, 0x45, 0x61, 0x01, 0x1c, - 0x0b, 0x20, 0xfd, 0xf7, 0x75, 0xf9, 0x38, 0x1c, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x04, 0x1c, 0x0f, 0x1c, 0xfd, 0xf7, 0xfd, 0xf8, - 0x00, 0x28, 0x19, 0xd0, 0x10, 0x49, 0x00, 0x2c, - 0x0d, 0xd0, 0x21, 0x22, 0xcc, 0x1d, 0xa5, 0x34, - 0x02, 0x60, 0x0c, 0xcc, 0xc7, 0x1d, 0x05, 0x37, - 0x0c, 0xc7, 0xb4, 0x31, 0xed, 0x09, 0x00, 0x3a, - 0x00, 0x18, 0xc9, 0xc7, 0x1d, 0x0d, 0x37, 0x18, - 0xc7, 0x08, 0xe0, 0x22, 0x22, 0x02, 0x60, 0x00, - 0x2f, 0x04, 0xd0, 0xff, 0x31, 0x01, 0x31, 0x4a, - 0x69, 0x01, 0x32, 0x4a, 0x61, 0x01, 0x1c, 0x0b, - 0x20, 0xfd, 0xf7, 0x4c, 0xf9, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x18, 0xeb, 0x03, - 0x20, 0x00, 0xb5, 0xfd, 0xf7, 0xd4, 0xf8, 0x00, - 0x28, 0x04, 0xd1, 0x06, 0x49, 0x01, 0x20, 0x88, - 0x60, 0x08, 0xbc, 0x18, 0x47, 0x28, 0x21, 0x01, - 0x60, 0x01, 0x1c, 0x0b, 0x20, 0xfd, 0xf7, 0x36, - 0xf9, 0xf6, 0xe7, 0x00, 0x00, 0x18, 0xec, 0x03, - 0x20, 0xf0, 0xb5, 0x92, 0xb0, 0x00, 0x24, 0x0f, - 0x1c, 0x08, 0xf0, 0x96, 0xfc, 0x06, 0x1c, 0x08, - 0xf0, 0xdb, 0xf8, 0x10, 0x90, 0x00, 0x28, 0x01, - 0xd1, 0x02, 0x24, 0x39, 0xe0, 0x00, 0x21, 0x00, - 0x22, 0x07, 0x23, 0x02, 0xa8, 0x06, 0xc0, 0x01, - 0x3b, 0xfc, 0xd1, 0x14, 0x20, 0x02, 0x90, 0x11, - 0x2e, 0x08, 0xd1, 0xff, 0x23, 0x54, 0x33, 0x9f, - 0x42, 0x01, 0xd9, 0xff, 0x27, 0x54, 0x37, 0x0a, - 0x97, 0x01, 0x27, 0x05, 0xe0, 0xf0, 0x00, 0x80, - 0x19, 0x14, 0x49, 0x80, 0x00, 0x08, 0x58, 0x0a, - 0x90, 0x13, 0x48, 0x0a, 0x99, 0x0b, 0x90, 0x00, - 0x20, 0x00, 0x29, 0x05, 0xd9, 0x0b, 0x9a, 0x10, - 0x54, 0x0a, 0x99, 0x01, 0x30, 0x81, 0x42, 0xf9, - 0xd8, 0x00, 0x25, 0x00, 0x2f, 0x10, 0xd9, 0x10, - 0x98, 0xc2, 0x1d, 0x55, 0x32, 0x11, 0x92, 0x02, - 0x21, 0x00, 0x91, 0x01, 0x96, 0x11, 0x9a, 0x10, - 0x98, 0x02, 0xa9, 0x00, 0x23, 0x08, 0xf0, 0x62, - 0xfd, 0x04, 0x1c, 0x01, 0x35, 0xbd, 0x42, 0xf2, - 0xd3, 0x20, 0x1c, 0x12, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x78, 0x7b, 0x03, - 0x20, 0x74, 0xe9, 0x03, 0x20, 0x01, 0x49, 0xed, - 0x09, 0x00, 0x3b, 0x00, 0x08, 0x63, 0x70, 0x47, - 0x00, 0x00, 0xd8, 0xeb, 0x03, 0x20, 0x80, 0xb5, - 0x0a, 0x68, 0x0f, 0x1c, 0x17, 0x2a, 0x45, 0xd0, - 0x11, 0xdc, 0x17, 0x2a, 0x43, 0xd2, 0x01, 0xa3, - 0x9b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x74, 0x64, - 0x68, 0x4b, 0x6d, 0x4b, 0x75, 0x79, 0x7d, 0x8b, - 0x81, 0x87, 0x90, 0x50, 0xa3, 0x74, 0x74, 0x74, - 0xb2, 0xb2, 0x55, 0x59, 0x9f, 0x00, 0x72, 0x49, - 0x21, 0x2a, 0x45, 0xd0, 0x0c, 0xdc, 0xd0, 0x1f, - 0x11, 0x38, 0x09, 0x28, 0x2b, 0xd2, 0x01, 0xa3, - 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x8f, 0x9e, - 0x83, 0x96, 0x7c, 0xa2, 0xa8, 0xaf, 0xb3, 0x00, - 0x26, 0x2a, 0x21, 0xd0, 0x10, 0xdc, 0x22, 0x2a, - 0x4a, 0xd0, 0x23, 0x2a, 0x4e, 0xd0, 0x24, 0x2a, - 0x4d, 0xd0, 0x25, 0x2a, 0x4c, 0xd1, 0x38, 0x1c, - 0x00, 0xf0, 0x3c, 0xfc, 0x38, 0x1c, 0xfd, 0xf7, - 0x6c, 0xf8, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x27, 0x2a, 0x0d, 0xd0, 0x28, 0x2a, 0x51, 0xd0, - 0x87, 0x2a, 0x0d, 0xd0, 0x9d, 0x2a, 0x3b, 0xd1, - 0xf8, 0x68, 0x48, 0x63, 0x38, 0x1c, 0xfd, 0xf7, - 0x5c, 0xf8, 0xee, 0xe7, 0x1d, 0xe0, 0xab, 0xe0, - 0x39, 0x1c, 0x01, 0xf0, 0x6c, 0xfe, 0xe8, 0xe7, - 0x38, 0x1c, 0x01, 0xf0, 0xdd, 0xfc, 0x38, 0x1c, - 0xfd, 0xf7, 0x4f, 0xf8, 0xe1, 0xe7, 0x00, 0x22, - 0x39, 0x1c, 0x08, 0xf0, 0x8e, 0xfd, 0xdc, 0xe7, - 0x38, 0x1c, 0x08, 0xf0, 0xe2, 0xff, 0xd8, 0xe7, - 0x81, 0xe0, 0x39, 0x1c, 0x09, 0xf0, 0x67, 0xf9, - 0xd3, 0xe7, 0x39, 0x1c, 0x09, 0xf0, 0x6d, 0xf9, - 0xcf, 0xe7, 0x39, 0x1c, 0x09, 0xf0, 0x75, 0xf9, - 0x38, 0x1c, 0xfd, 0xf7, 0x36, 0xf8, 0xc8, 0xe7, - 0x39, 0x1c, 0x09, 0xf0, 0xb2, 0xf9, 0xc4, 0xe7, - 0x39, 0x1c, 0x09, 0xf0, 0x09, 0xfa, 0xc0, 0xe7, - 0x61, 0xe0, 0xed, 0x09, 0x00, 0x3c, 0x00, 0x01, - 0x22, 0x39, 0x1c, 0x08, 0xf0, 0xf2, 0xfd, 0xba, - 0xe7, 0x6a, 0xe0, 0x70, 0xe0, 0x76, 0xe0, 0x39, - 0x1c, 0x08, 0xf0, 0x51, 0xfd, 0xb3, 0xe7, 0x39, - 0x1c, 0x09, 0xf0, 0x2b, 0xfa, 0xaf, 0xe7, 0x39, - 0x1c, 0x09, 0xf0, 0xed, 0xfa, 0xab, 0xe7, 0x01, - 0x22, 0x39, 0x1c, 0x09, 0xf0, 0x96, 0xfb, 0xa6, - 0xe7, 0x4b, 0xe0, 0x39, 0x1c, 0x09, 0xf0, 0x35, - 0xfb, 0xa1, 0xe7, 0x01, 0x22, 0x39, 0x1c, 0x09, - 0xf0, 0x44, 0xfb, 0x9c, 0xe7, 0x39, 0x1c, 0x09, - 0xf0, 0xc8, 0xfb, 0x98, 0xe7, 0x38, 0x1c, 0x09, - 0xf0, 0xac, 0xfb, 0x38, 0x1c, 0xfc, 0xf7, 0xff, - 0xff, 0x91, 0xe7, 0x38, 0x1c, 0x09, 0xf0, 0x00, - 0xfc, 0x8d, 0xe7, 0x38, 0x1c, 0x00, 0xf0, 0xf8, - 0xff, 0x89, 0xe7, 0x38, 0x1c, 0xfc, 0xf7, 0xf3, - 0xff, 0x85, 0xe7, 0x38, 0x1c, 0x00, 0xf0, 0x58, - 0xff, 0x38, 0x1c, 0xfc, 0xf7, 0xec, 0xff, 0x7e, - 0xe7, 0x38, 0x1c, 0x09, 0xf0, 0x3e, 0xfd, 0x7a, - 0xe7, 0x38, 0x1c, 0xfc, 0xf7, 0xe4, 0xff, 0x76, - 0xe7, 0x38, 0x1c, 0x00, 0xf0, 0x7c, 0xff, 0x72, - 0xe7, 0xf8, 0x68, 0xc8, 0x62, 0x38, 0x1c, 0xfc, - 0xf7, 0xda, 0xff, 0x6c, 0xe7, 0x38, 0x1c, 0x09, - 0xf0, 0xd6, 0xfb, 0x38, 0x1c, 0xfc, 0xf7, 0xd3, - 0xff, 0x65, 0xe7, 0x38, 0x1c, 0x00, 0xf0, 0xe1, - 0xf9, 0x61, 0xe7, 0x38, 0x1c, 0x09, 0xf0, 0xe7, - 0xfd, 0x5d, 0xe7, 0x38, 0x1c, 0x00, 0xf0, 0x1b, - 0xff, 0x59, 0xe7, 0x38, 0x1c, 0x00, 0xf0, 0xf7, - 0xfe, 0x55, 0xe7, 0x38, 0x1c, 0x00, 0xf0, 0x01, - 0xff, 0x38, 0x1c, 0xfc, 0xf7, 0xbc, 0xff, 0x4e, - 0xe7, 0x38, 0x1c, 0x00, 0xf0, 0x57, 0xfb, 0x38, - 0x1c, 0xfc, 0xf7, 0xb5, 0xff, 0x47, 0xe7, 0x38, - 0x1c, 0x00, 0xf0, 0x8f, 0xff, 0x38, 0x1c, 0xfc, - 0xf7, 0xae, 0xff, 0x40, 0xe7, 0xed, 0x09, 0x00, - 0x3d, 0x00, 0x38, 0x1c, 0xfc, 0xf7, 0xaa, 0xff, - 0x3c, 0xe7, 0x00, 0x00, 0x48, 0xe6, 0x03, 0x20, - 0xb0, 0xb5, 0x8a, 0xb0, 0xbf, 0x4c, 0x02, 0x20, - 0xfd, 0xf7, 0x1e, 0xf8, 0xc5, 0x1d, 0x07, 0x1c, - 0x20, 0x69, 0x05, 0x35, 0x00, 0x28, 0x02, 0xd0, - 0x38, 0x68, 0x3f, 0x28, 0xf3, 0xd1, 0x38, 0x68, - 0x55, 0x28, 0x51, 0xd0, 0x27, 0xdc, 0x31, 0x38, - 0x22, 0x28, 0x01, 0xd2, 0x43, 0x00, 0x9f, 0x44, - 0x5d, 0xe0, 0xa3, 0xe0, 0x5c, 0xe0, 0x5a, 0xe0, - 0x84, 0xe0, 0x7e, 0xe0, 0x5c, 0xe0, 0x5f, 0xe0, - 0x67, 0xe0, 0x6a, 0xe0, 0x60, 0xe0, 0x6c, 0xe0, - 0x51, 0xe0, 0x47, 0xe0, 0x4b, 0xe0, 0x80, 0xe0, - 0x90, 0xe0, 0x82, 0xe0, 0x69, 0xe0, 0x85, 0xe0, - 0x88, 0xe0, 0x48, 0xe0, 0x47, 0xe0, 0x46, 0xe0, - 0x45, 0xe0, 0x44, 0xe0, 0x43, 0xe0, 0x42, 0xe0, - 0x41, 0xe0, 0x8b, 0xe0, 0x91, 0xe0, 0x96, 0xe0, - 0xb0, 0xe0, 0xb4, 0xe0, 0xa8, 0xe0, 0x62, 0x28, - 0x34, 0xd0, 0x0d, 0xdc, 0x56, 0x38, 0x0c, 0x28, - 0x35, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, - 0x9f, 0x44, 0x00, 0x1c, 0xcf, 0xce, 0xcd, 0xcc, - 0xcb, 0x91, 0x98, 0xca, 0xc9, 0x95, 0xc8, 0xc7, - 0x68, 0x28, 0x39, 0xd0, 0x09, 0xdc, 0x63, 0x38, - 0x05, 0x28, 0x24, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, - 0x5b, 0x00, 0x9f, 0x44, 0xc7, 0xc6, 0xc5, 0xc4, - 0xc3, 0x00, 0x8e, 0x28, 0x3f, 0xd0, 0x08, 0xdc, - 0x84, 0x28, 0x3d, 0xd0, 0x8d, 0x28, 0x40, 0xd1, - 0x03, 0xcd, 0xff, 0xf7, 0xb7, 0xf8, 0x15, 0xe1, - 0x8d, 0xe0, 0xa7, 0x28, 0x40, 0xd0, 0xa8, 0x28, - 0x37, 0xd1, 0x28, 0x68, 0x29, 0x1d, 0xff, 0xf7, - 0x37, 0xfa, 0x0b, 0xe1, 0x38, 0x1c, 0x06, 0xf0, - 0x32, 0xfc, 0x07, 0xe1, 0xd1, 0xe0, 0x38, 0x1c, - 0x06, 0xf0, 0x39, 0xfc, 0x02, 0xe1, 0x01, 0xe1, - 0xed, 0x09, 0x00, 0x3e, 0x00, 0x03, 0xcd, 0x23, - 0xf0, 0xd5, 0xfe, 0xfd, 0xe0, 0x38, 0x1c, 0x06, - 0xf0, 0x9b, 0xfa, 0xf9, 0xe0, 0x38, 0x1c, 0x06, - 0xf0, 0xfb, 0xfa, 0xf5, 0xe0, 0x38, 0x1c, 0x06, - 0xf0, 0xad, 0xf9, 0xf1, 0xe0, 0xd3, 0xe0, 0x38, - 0x1c, 0x06, 0xf0, 0x30, 0xfb, 0xec, 0xe0, 0x38, - 0x1c, 0x06, 0xf0, 0xb2, 0xfb, 0xe8, 0xe0, 0x38, - 0x1c, 0x06, 0xf0, 0xde, 0xfb, 0xe4, 0xe0, 0x05, - 0xcd, 0x08, 0x3d, 0xa9, 0x68, 0x07, 0xf0, 0x92, - 0xff, 0xde, 0xe0, 0xd2, 0xe0, 0xd8, 0xe0, 0x38, - 0x1c, 0x08, 0xf0, 0x40, 0xf9, 0xd8, 0xe0, 0xd7, - 0xe0, 0x38, 0x1c, 0x08, 0xf0, 0xdb, 0xfa, 0x0e, - 0xf0, 0x57, 0xff, 0xd1, 0xe0, 0xc9, 0xe0, 0x38, - 0x1c, 0x06, 0xf0, 0x12, 0xfc, 0xcc, 0xe0, 0x00, - 0x21, 0x38, 0x1c, 0x06, 0xf0, 0x49, 0xfc, 0xc7, - 0xe0, 0x38, 0x1c, 0x07, 0xf0, 0xa1, 0xff, 0xc3, - 0xe0, 0x38, 0x1c, 0x07, 0xf0, 0xc7, 0xff, 0xbf, - 0xe0, 0x38, 0x1c, 0x08, 0xf0, 0x19, 0xf8, 0xbb, - 0xe0, 0x38, 0x1c, 0x08, 0xf0, 0x4b, 0xf8, 0xb7, - 0xe0, 0x05, 0xcd, 0x08, 0x3d, 0xa9, 0x68, 0xeb, - 0x68, 0x07, 0xf0, 0xfa, 0xfe, 0xb0, 0xe0, 0x2a, - 0x69, 0x00, 0x92, 0x0f, 0xcd, 0x07, 0xf0, 0x2e, - 0xff, 0xaa, 0xe0, 0x00, 0x22, 0x00, 0x92, 0x00, - 0x23, 0x00, 0x21, 0x28, 0x68, 0x07, 0xf0, 0x26, - 0xff, 0xa2, 0xe0, 0x28, 0x68, 0xff, 0xf7, 0x35, - 0xfa, 0x9e, 0xe0, 0xff, 0xf7, 0xe1, 0xfa, 0x9b, - 0xe0, 0x28, 0x68, 0x6a, 0x69, 0x29, 0x1d, 0xff, - 0xf7, 0x09, 0xfa, 0x95, 0xe0, 0x2a, 0x69, 0x00, - 0x92, 0x0f, 0xcd, 0xfe, 0xf7, 0x9c, 0xff, 0x8f, - 0xe0, 0x2a, 0x7a, 0x03, 0xcd, 0xfe, 0xf7, 0xee, - 0xfe, 0x8a, 0xe0, 0x28, 0x68, 0xfe, 0xf7, 0x48, - 0xff, 0x86, 0xe0, 0xe9, 0x1d, 0x05, 0x31, 0x0c, - 0xc9, 0x08, 0xa8, 0xed, 0x09, 0x00, 0x3f, 0x00, - 0x0c, 0xc0, 0x68, 0x8c, 0x69, 0x6a, 0xaa, 0x6a, - 0x06, 0x91, 0x05, 0x90, 0x07, 0x92, 0xe8, 0x69, - 0x69, 0x69, 0xaa, 0x69, 0x03, 0x91, 0x02, 0x90, - 0x04, 0x92, 0x2a, 0x8c, 0x09, 0x99, 0x00, 0x91, - 0x01, 0x92, 0x07, 0xcd, 0x08, 0x9b, 0xff, 0xf7, - 0x72, 0xf8, 0x6c, 0xe0, 0x32, 0xe0, 0x2d, 0xe0, - 0x24, 0xe0, 0x1f, 0xe0, 0x1a, 0xe0, 0x0f, 0xe0, - 0x24, 0xe0, 0x09, 0xe0, 0xff, 0xe7, 0x03, 0xcd, - 0xff, 0xf7, 0xeb, 0xf8, 0x5f, 0xe0, 0x4f, 0xe0, - 0x44, 0xe0, 0x3b, 0xe0, 0x36, 0xe0, 0x29, 0xe0, - 0x28, 0x68, 0xff, 0xf7, 0x1c, 0xf9, 0x56, 0xe0, - 0x69, 0x69, 0x2a, 0x69, 0x00, 0x91, 0x01, 0x92, - 0x0d, 0xcd, 0x0c, 0x3d, 0xe9, 0x68, 0xff, 0xf7, - 0x18, 0xf9, 0x4c, 0xe0, 0x03, 0xcd, 0xff, 0xf7, - 0x52, 0xf9, 0x48, 0xe0, 0x07, 0xcd, 0xff, 0xf7, - 0xda, 0xfa, 0x44, 0xe0, 0x07, 0xcd, 0xff, 0xf7, - 0xeb, 0xfa, 0x40, 0xe0, 0x07, 0xcd, 0x06, 0xf0, - 0x00, 0xfd, 0x3c, 0xe0, 0x07, 0xcd, 0xff, 0xf7, - 0x01, 0xfb, 0x38, 0xe0, 0x07, 0xcd, 0xff, 0xf7, - 0x30, 0xfb, 0x34, 0xe0, 0x07, 0xcd, 0xff, 0xf7, - 0xfa, 0xfb, 0x30, 0xe0, 0x14, 0x35, 0x07, 0xcd, - 0x20, 0x3d, 0x02, 0x91, 0x01, 0x90, 0x03, 0x92, - 0x2a, 0x69, 0x00, 0x92, 0x0f, 0xcd, 0xff, 0xf7, - 0x28, 0xfc, 0x24, 0xe0, 0x28, 0x68, 0xff, 0xf7, - 0x24, 0xfa, 0x20, 0xe0, 0x03, 0xcd, 0xff, 0xf7, - 0x58, 0xfc, 0x1c, 0xe0, 0x07, 0xcd, 0xff, 0xf7, - 0xe9, 0xfc, 0x18, 0xe0, 0x10, 0x35, 0x07, 0xcd, - 0x1c, 0x3d, 0x01, 0x91, 0x00, 0x90, 0x02, 0x92, - 0x0f, 0xcd, 0xff, 0xf7, 0x7a, 0xfc, 0x0e, 0xe0, - 0x03, 0xcd, 0xff, 0xf7, 0xba, 0xfc, 0x0a, 0xe0, - 0x03, 0xcd, 0xfe, 0xf7, 0xd8, 0xff, 0x06, 0xe0, - 0xff, 0xf7, 0x4b, 0xf9, 0x03, 0xe0, 0xed, 0x09, - 0x00, 0x40, 0x00, 0x01, 0x21, 0x00, 0x20, 0xff, - 0xf7, 0xef, 0xfc, 0x00, 0x2f, 0x00, 0xd1, 0x85, - 0xe6, 0x38, 0x1c, 0xfc, 0xf7, 0x26, 0xfe, 0x81, - 0xe6, 0x00, 0x00, 0x18, 0xec, 0x03, 0x20, 0xa7, - 0x20, 0x70, 0x47, 0x02, 0x20, 0x70, 0x47, 0x82, - 0xb0, 0x08, 0x48, 0x00, 0x69, 0x00, 0x90, 0x07, - 0x48, 0x01, 0x68, 0x01, 0x91, 0x00, 0x99, 0x40, - 0x68, 0x81, 0x42, 0x02, 0xd2, 0x01, 0x98, 0x01, - 0x30, 0x01, 0x90, 0x00, 0x98, 0x01, 0x99, 0x02, - 0xb0, 0x70, 0x47, 0x00, 0x50, 0x00, 0xe0, 0x70, - 0x7b, 0x03, 0x20, 0x90, 0xb5, 0x31, 0xf0, 0x25, - 0xfc, 0xff, 0xf7, 0xe5, 0xff, 0x04, 0x1c, 0x0f, - 0x1c, 0x31, 0xf0, 0x1b, 0xfc, 0x20, 0x1c, 0x39, - 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x03, - 0x48, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x02, - 0x49, 0x09, 0x69, 0x41, 0x60, 0x70, 0x47, 0x70, - 0x7b, 0x03, 0x20, 0x00, 0x50, 0x00, 0xe0, 0xf0, - 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0xc6, 0x68, 0x00, - 0x69, 0x01, 0x90, 0x78, 0x69, 0x00, 0x90, 0xff, - 0xf7, 0xdc, 0xff, 0x72, 0x68, 0x13, 0x69, 0x02, - 0x2b, 0x04, 0xd1, 0x14, 0x6b, 0xd5, 0x6a, 0x40, - 0x19, 0x61, 0x41, 0x02, 0xe0, 0x10, 0xa2, 0x54, - 0x68, 0x15, 0x68, 0x10, 0xa3, 0x1a, 0x68, 0x5b, - 0x68, 0x0c, 0xf0, 0xcf, 0xfd, 0x43, 0x21, 0x39, - 0x60, 0xb1, 0x68, 0x38, 0x61, 0xf9, 0x60, 0xbc, - 0x61, 0x7d, 0x61, 0x70, 0x68, 0xff, 0x30, 0x81, - 0x30, 0x00, 0x68, 0xf8, 0x61, 0x01, 0x98, 0x38, - 0x62, 0x00, 0x98, 0x78, 0x62, 0x0a, 0x20, 0x39, - 0x1c, 0xfc, 0xf7, 0xf3, 0xfd, 0x02, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xb5, 0xed, 0x09, 0x00, 0x41, 0x00, 0x82, 0xb0, - 0x07, 0x1c, 0xff, 0xf7, 0x8f, 0xff, 0x00, 0x90, - 0x01, 0x91, 0x87, 0x42, 0x02, 0xd2, 0x01, 0x98, - 0x01, 0x30, 0x01, 0x90, 0x00, 0x97, 0x05, 0xa3, - 0x01, 0x99, 0x1a, 0x68, 0x5b, 0x68, 0x38, 0x1c, - 0x0c, 0xf0, 0x9a, 0xfd, 0x02, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x71, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0xb5, 0x84, 0xb0, - 0x07, 0x1c, 0xff, 0xf7, 0x73, 0xff, 0x00, 0x90, - 0x01, 0x91, 0x0e, 0xa3, 0x1a, 0x68, 0x5b, 0x68, - 0x0c, 0xf0, 0x86, 0xfd, 0x02, 0x90, 0x00, 0x98, - 0x03, 0x91, 0x80, 0x1a, 0x01, 0x99, 0x00, 0x90, - 0x99, 0x41, 0x01, 0x91, 0x03, 0x99, 0x09, 0xa3, - 0x02, 0x98, 0x1a, 0x68, 0x5b, 0x68, 0x19, 0x40, - 0x10, 0x40, 0x02, 0x90, 0x03, 0x91, 0x38, 0x60, - 0x00, 0x98, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xb5, 0x82, 0xb0, - 0x1c, 0x1c, 0x05, 0x1c, 0xff, 0xf7, 0x46, 0xff, - 0xe6, 0x1d, 0x25, 0x36, 0x00, 0x2c, 0x00, 0x90, - 0x01, 0x91, 0x09, 0xd0, 0x00, 0x2d, 0x07, 0xd1, - 0x00, 0x98, 0x01, 0x99, 0x0c, 0xce, 0x08, 0x3e, - 0x80, 0x18, 0x59, 0x41, 0x01, 0x91, 0x00, 0x90, - 0x3f, 0xa3, 0x00, 0x98, 0x01, 0x99, 0x1a, 0x68, - 0x5b, 0x68, 0x0c, 0xf0, 0x49, 0xfd, 0x07, 0x1c, - 0x00, 0x98, 0x01, 0x99, 0x80, 0x1a, 0x99, 0x41, - 0x01, 0x91, 0x03, 0x99, 0x00, 0x90, 0xa9, 0x42, - 0x2c, 0xd1, 0xb8, 0x07, 0x80, 0x0f, 0x20, 0xd0, - 0x01, 0x28, 0x0c, 0xd0, 0x02, 0x28, 0x13, 0xd0, - 0x03, 0x28, 0x4f, 0xd1, 0x00, 0x98, 0x01, 0x99, - 0x33, 0x4a, 0x0c, 0xf0, 0xcd, 0xfd, 0x00, 0x90, - 0x01, 0x91, 0x01, 0x37, 0xed, 0x09, 0x00, 0x42, - 0x00, 0x46, 0xe0, 0x00, 0x98, 0x01, 0x99, 0x30, - 0x4a, 0x0c, 0xf0, 0xc4, 0xfd, 0x00, 0x90, 0x01, - 0x91, 0x03, 0x37, 0x3d, 0xe0, 0x00, 0x98, 0x01, - 0x99, 0x2c, 0x4a, 0x0c, 0xf0, 0xbb, 0xfd, 0x00, - 0x90, 0x01, 0x91, 0x02, 0x37, 0x34, 0xe0, 0x00, - 0x98, 0x01, 0x99, 0x29, 0x4a, 0x0c, 0xf0, 0xb2, - 0xfd, 0x00, 0x90, 0x01, 0x91, 0x04, 0x37, 0x2b, - 0xe0, 0xb8, 0x07, 0x80, 0x0f, 0x20, 0xd0, 0x01, - 0x28, 0x0c, 0xd0, 0x02, 0x28, 0x13, 0xd0, 0x03, - 0x28, 0x22, 0xd1, 0x00, 0x98, 0x01, 0x99, 0x1e, - 0x4a, 0x0c, 0xf0, 0xa0, 0xfd, 0x00, 0x90, 0x01, - 0x91, 0x03, 0x37, 0x19, 0xe0, 0x00, 0x98, 0x01, - 0x99, 0x18, 0x4a, 0x0c, 0xf0, 0x97, 0xfd, 0x00, - 0x90, 0x01, 0x91, 0x01, 0x37, 0x10, 0xe0, 0x00, - 0x98, 0x01, 0x99, 0x17, 0x4a, 0x0c, 0xf0, 0x8e, - 0xfd, 0x00, 0x90, 0x01, 0x91, 0x04, 0x37, 0x07, - 0xe0, 0x00, 0x98, 0x01, 0x99, 0x11, 0x4a, 0x0c, - 0xf0, 0x85, 0xfd, 0x00, 0x90, 0x01, 0x91, 0x02, - 0x37, 0x3f, 0x01, 0x3f, 0x09, 0x00, 0x2c, 0x08, - 0xd0, 0x00, 0x2d, 0x06, 0xd1, 0x00, 0x98, 0x01, - 0x99, 0x0c, 0xce, 0x80, 0x1a, 0x99, 0x41, 0x01, - 0x91, 0x00, 0x90, 0x69, 0x46, 0x0c, 0xc9, 0x04, - 0x98, 0x0c, 0xc0, 0x06, 0xb0, 0x38, 0x1c, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x71, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x02, 0x00, - 0x00, 0x53, 0x07, 0x00, 0x00, 0xe2, 0x04, 0x00, - 0x00, 0xc4, 0x09, 0x00, 0x00, 0x80, 0xb4, 0xb3, - 0x23, 0x9b, 0x00, 0xc2, 0x18, 0x00, 0x20, 0x00, - 0x23, 0xd7, 0x68, 0x05, 0x2f, 0x03, 0xd0, 0x00, - 0x29, 0x02, 0xd0, 0x03, 0x2f, 0x00, 0xd1, 0x01, - 0x30, 0xff, 0x32, 0x35, 0x32, 0x01, 0x33, 0x07, - 0x2b, 0xf2, 0xd3, 0x80, 0xbc, 0x70, 0x47, 0xed, - 0x09, 0x00, 0x43, 0x00, 0xb3, 0x23, 0x9b, 0x00, - 0xc1, 0x18, 0x00, 0x20, 0x00, 0x22, 0xcb, 0x68, - 0x05, 0x2b, 0x03, 0xd0, 0x03, 0x2b, 0x01, 0xd0, - 0x01, 0x2b, 0x00, 0xd1, 0x01, 0x30, 0xff, 0x31, - 0x35, 0x31, 0x01, 0x32, 0x07, 0x2a, 0xf2, 0xd3, - 0x70, 0x47, 0xb0, 0xb5, 0x14, 0x1c, 0x0d, 0x1c, - 0x07, 0x1c, 0x00, 0x21, 0x0e, 0x4a, 0xfc, 0xf7, - 0x3c, 0xf8, 0x00, 0x20, 0xf8, 0x60, 0x0c, 0x49, - 0x3d, 0x61, 0x0b, 0x68, 0x5a, 0x1c, 0x0a, 0x60, - 0x18, 0xc7, 0x08, 0x3f, 0xf9, 0x1d, 0xff, 0x31, - 0x00, 0x22, 0x92, 0x31, 0x0a, 0x60, 0x0a, 0x76, - 0xc8, 0x60, 0x4f, 0x60, 0xff, 0x31, 0x35, 0x31, - 0x01, 0x32, 0x08, 0x2a, 0xf6, 0xd3, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x4c, 0x0b, - 0x00, 0x00, 0xdc, 0x7d, 0x03, 0x20, 0xb0, 0xb5, - 0x0c, 0x1c, 0x05, 0x1c, 0x07, 0x48, 0x21, 0xf0, - 0xfa, 0xfb, 0x07, 0x1c, 0x04, 0xd0, 0x38, 0x1c, - 0x29, 0x1c, 0x22, 0x1c, 0xff, 0xf7, 0xcd, 0xff, - 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x4c, 0x0b, 0x00, 0x00, 0x00, 0xb5, - 0x21, 0xf0, 0x15, 0xfc, 0x08, 0xbc, 0x18, 0x47, - 0x80, 0xb4, 0xc2, 0x68, 0x43, 0x69, 0x51, 0x68, - 0xff, 0x31, 0x91, 0x31, 0x0f, 0x68, 0x3b, 0x43, - 0x0b, 0x60, 0x51, 0x68, 0x00, 0x69, 0xff, 0x31, - 0x91, 0x31, 0x0a, 0x68, 0xc0, 0x43, 0x10, 0x40, - 0x08, 0x60, 0x80, 0xbc, 0x70, 0x47, 0xf0, 0xb5, - 0x05, 0x1c, 0xff, 0x20, 0x35, 0x30, 0x48, 0x43, - 0x40, 0x19, 0xc7, 0x1d, 0xff, 0x37, 0x92, 0x37, - 0x16, 0x1c, 0x0c, 0x1c, 0x00, 0x21, 0xff, 0x22, - 0x38, 0x1c, 0x35, 0x32, 0xfb, 0xf7, 0xe1, 0xff, - 0x3c, 0x60, 0x3c, 0x76, 0x00, 0x21, 0x7d, 0x60, - 0xf9, 0x60, 0xbe, 0x60, 0x38, 0x1c, 0xf0, 0xbc, - 0x08, 0xbc, 0xed, 0x09, 0x00, 0x44, 0x00, 0x18, - 0x47, 0x80, 0xb4, 0xc1, 0x68, 0x2d, 0x23, 0x4f, - 0x68, 0x9b, 0x01, 0x02, 0x69, 0xfb, 0x18, 0x5a, - 0x60, 0x0b, 0x23, 0x4a, 0x68, 0x1b, 0x02, 0xd2, - 0x18, 0x40, 0x69, 0x2d, 0x23, 0x90, 0x63, 0x48, - 0x68, 0x9b, 0x01, 0xc0, 0x18, 0x41, 0x68, 0x00, - 0x29, 0x01, 0xd0, 0x01, 0x21, 0x01, 0x60, 0x80, - 0xbc, 0x70, 0x47, 0x80, 0xb5, 0x85, 0xb0, 0x6a, - 0x46, 0x07, 0x1c, 0x2f, 0x49, 0x04, 0x20, 0x08, - 0xc9, 0x08, 0xc2, 0x03, 0x1c, 0x01, 0x38, 0x00, - 0x2b, 0xf9, 0xd1, 0x2c, 0x49, 0x38, 0x1c, 0x49, - 0x69, 0x3c, 0x31, 0x0c, 0xc9, 0x0c, 0xc0, 0x00, - 0x98, 0x38, 0x61, 0x78, 0x69, 0x01, 0x99, 0x80, - 0x08, 0x80, 0x00, 0x89, 0x07, 0x89, 0x0f, 0x01, - 0x43, 0x79, 0x61, 0x38, 0x6b, 0x01, 0x9a, 0x00, - 0x0e, 0x00, 0x06, 0x92, 0x10, 0x12, 0x02, 0x12, - 0x0a, 0x10, 0x43, 0x38, 0x63, 0x01, 0x9a, 0x92, - 0x00, 0x92, 0x0f, 0xba, 0x61, 0x01, 0x9a, 0x92, - 0x0f, 0xfa, 0x61, 0x02, 0x9a, 0x00, 0x02, 0x00, - 0x0a, 0x12, 0x06, 0x10, 0x43, 0x38, 0x63, 0x02, - 0x9a, 0x12, 0x02, 0x12, 0x0c, 0xba, 0x86, 0x02, - 0x9a, 0x03, 0x9b, 0x12, 0x0e, 0x1b, 0x04, 0x1b, - 0x0c, 0x1b, 0x02, 0x1a, 0x43, 0x3a, 0x62, 0x03, - 0x9a, 0x52, 0x03, 0x52, 0x0f, 0x7a, 0x62, 0x03, - 0x9a, 0x04, 0x9b, 0xd2, 0x0c, 0xdb, 0x04, 0xdb, - 0x0c, 0x5b, 0x03, 0x1a, 0x43, 0xba, 0x62, 0x04, - 0x9a, 0x0e, 0x4b, 0x12, 0x04, 0x52, 0x0f, 0x00, - 0x02, 0x00, 0x0a, 0x19, 0x40, 0x80, 0x00, 0x08, - 0x43, 0xfa, 0x62, 0x78, 0x61, 0x80, 0x01, 0x00, - 0x0a, 0x23, 0xf0, 0x3d, 0xfe, 0x79, 0x69, 0x89, - 0x01, 0x89, 0x09, 0x80, 0x06, 0x08, 0x43, 0x78, - 0x61, 0x05, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x00, 0x54, 0xed, 0x09, 0x00, - 0x45, 0x00, 0x00, 0xe0, 0x88, 0xe5, 0x03, 0x20, - 0x03, 0x00, 0x00, 0xfc, 0xf0, 0xb5, 0x82, 0xb0, - 0x0c, 0x1c, 0x05, 0x1c, 0xfc, 0xf7, 0xaf, 0xfb, - 0x07, 0x1c, 0x04, 0xd1, 0x00, 0x20, 0x02, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x10, 0x21, - 0x29, 0x40, 0x10, 0x20, 0x00, 0x29, 0x0b, 0xd0, - 0x00, 0x21, 0xf9, 0x61, 0x39, 0x63, 0x74, 0x49, - 0xf8, 0x60, 0x49, 0x69, 0x38, 0x1c, 0x3c, 0x31, - 0x0c, 0xc9, 0x0c, 0xc0, 0x38, 0x1c, 0xea, 0xe7, - 0x70, 0x4b, 0x1a, 0x6b, 0xd6, 0x06, 0xf6, 0x0e, - 0xf9, 0x1d, 0x39, 0x31, 0x0e, 0x70, 0x16, 0x0a, - 0x4e, 0x70, 0x12, 0x0c, 0x8a, 0x70, 0xda, 0x6a, - 0xd3, 0x06, 0xdb, 0x0e, 0xcb, 0x70, 0x13, 0x0a, - 0xdb, 0x06, 0xdb, 0x0e, 0x12, 0x0b, 0xd2, 0x06, - 0xd2, 0x0e, 0x0b, 0x71, 0x4a, 0x71, 0x69, 0x0a, - 0x05, 0xd3, 0x00, 0x21, 0xf9, 0x61, 0x39, 0x63, - 0xf8, 0x60, 0x38, 0x1c, 0xcb, 0xe7, 0x62, 0x48, - 0xf9, 0x1d, 0x82, 0x6a, 0x01, 0x31, 0x53, 0x07, - 0x5b, 0x0f, 0x0b, 0x70, 0x53, 0x06, 0x1b, 0x0f, - 0x4b, 0x60, 0x13, 0x06, 0xdb, 0x0f, 0x4b, 0x70, - 0xd3, 0x05, 0xdb, 0x0f, 0x92, 0x05, 0xd2, 0x0f, - 0x8b, 0x70, 0xca, 0x70, 0xf9, 0x68, 0x00, 0x29, - 0x01, 0xd0, 0x01, 0x29, 0x01, 0xd1, 0x38, 0x1c, - 0xb1, 0xe7, 0x02, 0x39, 0x0e, 0x29, 0x0a, 0xd2, - 0x01, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, - 0x29, 0x0b, 0x0b, 0x2b, 0x2d, 0x2f, 0x0b, 0x0b, - 0x1a, 0x1a, 0x06, 0x06, 0x1a, 0x1a, 0x38, 0x1c, - 0xfc, 0xf7, 0x6e, 0xfb, 0x00, 0x20, 0x9e, 0xe7, - 0x00, 0x6a, 0x00, 0xab, 0x18, 0x70, 0x00, 0x98, - 0x80, 0x07, 0x80, 0x0f, 0x78, 0x61, 0x00, 0x98, - 0x40, 0x07, 0xc0, 0x0f, 0x38, 0x61, 0x00, 0x98, - 0x00, 0x06, 0xc5, 0x0e, 0x15, 0xe0, 0x00, 0x6a, - 0xed, 0x09, 0x00, 0x46, 0x00, 0x01, 0xab, 0x18, - 0x80, 0x01, 0x98, 0x80, 0x07, 0x80, 0x0f, 0x78, - 0x61, 0x01, 0x98, 0x40, 0x07, 0xc0, 0x0f, 0x38, - 0x61, 0x01, 0x98, 0x00, 0x05, 0xc5, 0x0d, 0x06, - 0xe0, 0x12, 0x25, 0x04, 0xe0, 0x0a, 0x25, 0x02, - 0xe0, 0x14, 0x25, 0x00, 0xe0, 0x1e, 0x25, 0xf8, - 0x68, 0x02, 0x38, 0x0e, 0x28, 0x67, 0xd2, 0x02, - 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, - 0x1c, 0x07, 0x1e, 0x1e, 0x44, 0x44, 0x44, 0x0b, - 0x1e, 0x1e, 0x1e, 0x63, 0x63, 0x1e, 0x1e, 0x38, - 0x1c, 0xff, 0xf7, 0xf4, 0xfe, 0x57, 0xe0, 0x0c, - 0x20, 0xfc, 0xf7, 0x9e, 0xfa, 0x38, 0x63, 0x00, - 0x28, 0x04, 0xd1, 0x38, 0x1c, 0xfc, 0xf7, 0x2a, - 0xfb, 0x00, 0x20, 0x5a, 0xe7, 0x2a, 0x4a, 0x02, - 0x21, 0x08, 0xca, 0x08, 0xc0, 0x0b, 0x1c, 0x01, - 0x39, 0x00, 0x2b, 0xf9, 0xd1, 0xe8, 0x1c, 0x06, - 0x1c, 0xfc, 0xf7, 0x8a, 0xfa, 0xf8, 0x61, 0x00, - 0x28, 0x0b, 0xd1, 0x38, 0x6b, 0x00, 0x28, 0x03, - 0xd0, 0xfc, 0xf7, 0xae, 0xfa, 0x00, 0x21, 0x39, - 0x63, 0x38, 0x1c, 0xfc, 0xf7, 0x0f, 0xfb, 0x00, - 0x20, 0x3f, 0xe7, 0x00, 0x2c, 0x02, 0xd0, 0x01, - 0x20, 0x00, 0xf0, 0xc6, 0xf8, 0xb3, 0x08, 0x5a, - 0x1e, 0x00, 0x2b, 0xf8, 0x69, 0x19, 0x49, 0x05, - 0xd0, 0x08, 0xc9, 0x08, 0xc0, 0x13, 0x1c, 0x01, - 0x3a, 0x00, 0x2b, 0xf9, 0xd1, 0xbd, 0x61, 0x1e, - 0xe0, 0xe8, 0x1c, 0x04, 0x1c, 0xfc, 0xf7, 0x64, - 0xfa, 0xf8, 0x61, 0x00, 0x28, 0x0b, 0xd1, 0x38, - 0x6b, 0x00, 0x28, 0x03, 0xd0, 0xfc, 0xf7, 0x88, - 0xfa, 0x00, 0x21, 0x39, 0x63, 0x38, 0x1c, 0xfc, - 0xf7, 0xe9, 0xfa, 0x00, 0x20, 0x19, 0xe7, 0xa3, - 0x08, 0x5a, 0x1e, 0x00, 0x2b, 0x09, 0x49, 0x05, - 0xd0, 0x08, 0xc9, 0x08, 0xc0, 0x13, 0x1c, 0x01, - 0x3a, 0x00, 0x2b, 0xed, 0x09, 0x00, 0x47, 0x00, - 0xf9, 0xd1, 0xbd, 0x61, 0x38, 0x1c, 0x0b, 0xe7, - 0x00, 0x00, 0x88, 0xe5, 0x03, 0x20, 0x00, 0x51, - 0x00, 0xe0, 0x40, 0x55, 0x00, 0xe0, 0x70, 0x55, - 0x00, 0xe0, 0x00, 0x54, 0x00, 0xe0, 0x90, 0xb4, - 0x00, 0x23, 0x00, 0x2a, 0x0e, 0xd9, 0x4f, 0x78, - 0x0c, 0x78, 0x3f, 0x02, 0x27, 0x43, 0x8c, 0x78, - 0x24, 0x04, 0x27, 0x43, 0xcc, 0x78, 0x24, 0x06, - 0x27, 0x43, 0x80, 0xc0, 0x04, 0x31, 0x04, 0x33, - 0x93, 0x42, 0xf0, 0xd3, 0x90, 0xbc, 0x70, 0x47, - 0x80, 0xb4, 0x02, 0x69, 0x36, 0x49, 0x0a, 0x60, - 0x42, 0x69, 0x4b, 0x68, 0x92, 0x07, 0x92, 0x0f, - 0x9b, 0x08, 0x9b, 0x00, 0x13, 0x43, 0x4b, 0x60, - 0x02, 0x6b, 0x12, 0x02, 0x12, 0x0a, 0x1f, 0x1c, - 0x30, 0x4b, 0x3b, 0x40, 0x92, 0x00, 0x1a, 0x43, - 0x03, 0x23, 0x9b, 0x06, 0x9a, 0x43, 0x17, 0x1c, - 0x4a, 0x60, 0x82, 0x69, 0x9b, 0x00, 0x9f, 0x43, - 0x92, 0x07, 0x92, 0x0f, 0x12, 0x07, 0x3b, 0x1c, - 0x13, 0x43, 0x4b, 0x60, 0x9b, 0x00, 0xc2, 0x69, - 0x9b, 0x08, 0x92, 0x07, 0x1a, 0x43, 0x4a, 0x60, - 0x02, 0x6b, 0x8b, 0x68, 0x12, 0x0e, 0x1b, 0x0a, - 0x1b, 0x02, 0x13, 0x43, 0x8b, 0x60, 0x1f, 0x1c, - 0x21, 0x4b, 0x82, 0x8e, 0x3b, 0x40, 0x12, 0x02, - 0x13, 0x43, 0x8b, 0x60, 0x1b, 0x02, 0x02, 0x6a, - 0x1b, 0x0a, 0x12, 0x06, 0x1a, 0x43, 0x8a, 0x60, - 0x02, 0x6a, 0xcb, 0x68, 0x12, 0x0a, 0x1b, 0x0c, - 0x1b, 0x04, 0x12, 0x04, 0x12, 0x0c, 0x13, 0x43, - 0xcb, 0x60, 0x1f, 0x1c, 0x07, 0x23, 0x1b, 0x04, - 0x42, 0x6a, 0x9f, 0x43, 0x52, 0x07, 0x52, 0x0f, - 0x12, 0x04, 0x3b, 0x1c, 0x13, 0x43, 0xcb, 0x60, - 0x5b, 0x03, 0x82, 0x6a, 0x5b, 0x0b, 0xd2, 0x04, - 0x1a, 0x43, 0xca, 0x60, 0x82, 0x6a, 0x0b, 0x69, - 0x52, 0x0b, 0x5b, 0x0b, 0x5b, 0x03, 0xed, 0x09, - 0x00, 0x48, 0x00, 0xd2, 0x04, 0xd2, 0x0c, 0x1a, - 0x43, 0x0a, 0x61, 0x07, 0x23, 0x5b, 0x03, 0xc0, - 0x6a, 0x9a, 0x43, 0x40, 0x07, 0x40, 0x0f, 0x40, - 0x03, 0x10, 0x43, 0x08, 0x61, 0x06, 0x48, 0x41, - 0x60, 0x14, 0x21, 0x01, 0x60, 0x80, 0xbc, 0x70, - 0x47, 0x00, 0x00, 0x30, 0xed, 0x03, 0x20, 0x03, - 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xff, 0xe4, - 0x7d, 0x03, 0x20, 0x06, 0x49, 0xff, 0x23, 0x0a, - 0x68, 0x01, 0x33, 0x9a, 0x43, 0xc0, 0x07, 0xc0, - 0x0f, 0x00, 0x02, 0x10, 0x43, 0x08, 0x60, 0x02, - 0x49, 0x88, 0x62, 0x70, 0x47, 0x00, 0x00, 0xe0, - 0x7d, 0x03, 0x20, 0x40, 0x57, 0x00, 0xe0, 0xf0, - 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0xc0, 0x68, 0x10, - 0x28, 0x06, 0xd1, 0x57, 0x49, 0x03, 0x20, 0x08, - 0x60, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x55, 0x48, 0x39, 0x7a, 0x02, 0x68, 0xd2, - 0x08, 0xd2, 0x00, 0x49, 0x07, 0x49, 0x0f, 0x0a, - 0x43, 0x02, 0x60, 0xf9, 0x68, 0x78, 0x23, 0x9a, - 0x43, 0x09, 0x07, 0x09, 0x0f, 0xc9, 0x00, 0x0a, - 0x43, 0x02, 0x60, 0x79, 0x7a, 0x80, 0x23, 0x9a, - 0x43, 0xc9, 0x07, 0xc9, 0x0f, 0xc9, 0x01, 0x0a, - 0x43, 0x02, 0x60, 0xb9, 0x7a, 0x5b, 0x00, 0x9a, - 0x43, 0xc9, 0x07, 0xc9, 0x0f, 0x09, 0x02, 0x0a, - 0x43, 0x02, 0x60, 0xf9, 0x7a, 0x5b, 0x00, 0x9a, - 0x43, 0xc9, 0x07, 0xc9, 0x0f, 0x49, 0x02, 0x11, - 0x43, 0x42, 0x4a, 0x01, 0x60, 0x91, 0x62, 0xf9, - 0x68, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x29, 0x00, - 0xd1, 0xca, 0xe7, 0xf8, 0x1d, 0x11, 0x30, 0x00, - 0x24, 0x00, 0x25, 0x8e, 0x1e, 0x0e, 0x2e, 0x66, - 0xd2, 0x02, 0xa3, 0x9b, 0x5d, 0x5b, 0x00, 0x9f, - 0x44, 0x00, 0x1c, 0x49, 0x09, 0x09, 0x4e, 0x50, - 0x52, 0x07, 0x09, 0x28, 0x28, 0x63, 0x63, 0x28, - 0x28, 0xed, 0x09, 0x00, 0x49, 0x00, 0x3c, 0x6b, - 0x0a, 0x25, 0x79, 0x69, 0x00, 0x9b, 0x9b, 0x08, - 0x9b, 0x00, 0x89, 0x07, 0x89, 0x0f, 0x19, 0x43, - 0x00, 0x91, 0x39, 0x69, 0x00, 0x9e, 0x04, 0x23, - 0x9e, 0x43, 0xc9, 0x07, 0xc9, 0x0f, 0x89, 0x00, - 0x31, 0x43, 0x00, 0x91, 0xb9, 0x6b, 0x00, 0x9f, - 0xf8, 0x23, 0x9f, 0x43, 0xc9, 0x06, 0xc9, 0x0e, - 0xc9, 0x00, 0x39, 0x43, 0x00, 0x91, 0x00, 0x9b, - 0x09, 0x06, 0xc9, 0x0e, 0x13, 0x62, 0x1d, 0xe0, - 0x79, 0x69, 0x01, 0x9b, 0x9b, 0x08, 0x9b, 0x00, - 0x89, 0x07, 0x89, 0x0f, 0x19, 0x43, 0x01, 0x91, - 0x39, 0x69, 0x01, 0x9e, 0x04, 0x23, 0x9e, 0x43, - 0xc9, 0x07, 0xc9, 0x0f, 0x89, 0x00, 0x31, 0x43, - 0x01, 0x91, 0xb9, 0x6b, 0x01, 0x9f, 0x1b, 0x4b, - 0x3b, 0x40, 0xc9, 0x05, 0xc9, 0x0d, 0xc9, 0x00, - 0x19, 0x43, 0x01, 0x91, 0x01, 0x9b, 0x09, 0x05, - 0xc9, 0x0d, 0x13, 0x62, 0x00, 0x29, 0x11, 0xd0, - 0x09, 0xe0, 0x38, 0x1c, 0xff, 0xf7, 0xe1, 0xfe, - 0x14, 0x21, 0x04, 0xe0, 0x0a, 0x21, 0x02, 0xe0, - 0x14, 0x21, 0x00, 0xe0, 0x1e, 0x21, 0x00, 0x28, - 0x04, 0xd0, 0x0a, 0x1c, 0x01, 0x1c, 0x0e, 0x48, - 0x30, 0xf0, 0xa6, 0xff, 0x00, 0x2c, 0x04, 0xd0, - 0x21, 0x1c, 0x2a, 0x1c, 0x0b, 0x48, 0xff, 0xf7, - 0xb7, 0xfe, 0x5c, 0xe7, 0xff, 0xe7, 0x08, 0x1c, - 0x30, 0xf0, 0xc6, 0xf8, 0x02, 0x1c, 0x08, 0xa0, - 0xf9, 0x68, 0x10, 0xf0, 0x29, 0xfb, 0xed, 0xe7, - 0x00, 0x52, 0x00, 0xe0, 0xe0, 0x7d, 0x03, 0x20, - 0x40, 0x57, 0x00, 0xe0, 0x07, 0xf0, 0xff, 0xff, - 0x00, 0x56, 0x00, 0xe0, 0x70, 0x57, 0x00, 0xe0, - 0x4c, 0x63, 0x49, 0x72, 0x71, 0x5f, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x75, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x70, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0xed, 0x09, 0x00, 0x4a, - 0x00, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x25, - 0x78, 0x20, 0x28, 0x25, 0x73, 0x29, 0x00, 0x00, - 0x00, 0x80, 0xb5, 0x88, 0xb0, 0x18, 0x49, 0x06, - 0xa8, 0x88, 0xc9, 0x88, 0xc0, 0x17, 0x49, 0x04, - 0xa8, 0x88, 0xc9, 0x88, 0xc0, 0x16, 0x49, 0x02, - 0xa8, 0x88, 0xc9, 0x88, 0xc0, 0x15, 0x49, 0x68, - 0x46, 0x88, 0xc9, 0x88, 0xc0, 0x14, 0x48, 0x41, - 0x69, 0xc0, 0x38, 0xc7, 0x1d, 0xbd, 0x37, 0xcc, - 0x30, 0x01, 0x29, 0x0e, 0xd0, 0x02, 0x29, 0x08, - 0xd1, 0x69, 0x46, 0x08, 0x22, 0xfb, 0xf7, 0x3e, - 0xfd, 0x08, 0x22, 0x38, 0x1c, 0x02, 0xa9, 0xfb, - 0xf7, 0x39, 0xfd, 0x08, 0xb0, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x08, 0x22, 0x04, 0xa9, 0xfb, - 0xf7, 0x31, 0xfd, 0x08, 0x22, 0x38, 0x1c, 0x06, - 0xa9, 0xfb, 0xf7, 0x2c, 0xfd, 0xf1, 0xe7, 0x00, - 0x00, 0x80, 0x0f, 0x01, 0x20, 0x88, 0x0f, 0x01, - 0x20, 0x90, 0x0f, 0x01, 0x20, 0x98, 0x0f, 0x01, - 0x20, 0x48, 0xe6, 0x03, 0x20, 0xf0, 0xb4, 0x11, - 0x4f, 0xc0, 0x30, 0x7c, 0x18, 0xc0, 0x34, 0x25, - 0x79, 0x24, 0x7b, 0xc1, 0x60, 0xc0, 0x37, 0xfe, - 0x69, 0xb1, 0x42, 0x00, 0xd9, 0xc6, 0x60, 0x00, - 0x2a, 0x0a, 0xd0, 0x79, 0x69, 0x01, 0x29, 0x04, - 0xd0, 0x02, 0x29, 0x07, 0xd1, 0x80, 0x21, 0x81, - 0x60, 0x04, 0xe0, 0x40, 0x21, 0x81, 0x60, 0x01, - 0xe0, 0x00, 0x21, 0x81, 0x60, 0x04, 0x49, 0x01, - 0x62, 0x83, 0x61, 0x44, 0x61, 0x05, 0x61, 0xf0, - 0xbc, 0x70, 0x47, 0x00, 0x00, 0x88, 0xe5, 0x03, - 0x20, 0xff, 0xff, 0x00, 0x00, 0x00, 0xb5, 0x31, - 0x21, 0x01, 0x60, 0x04, 0x49, 0x49, 0x69, 0xc1, - 0x60, 0x01, 0x1c, 0x0a, 0x20, 0xfc, 0xf7, 0xf6, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x48, 0xe6, 0x03, - 0x20, 0x90, 0xb4, 0x07, 0x49, 0xc4, 0x1d, 0xed, - 0x09, 0x00, 0x4b, 0x00, 0x05, 0x34, 0xcf, 0x1d, - 0xf1, 0x37, 0x0c, 0xcc, 0x0c, 0xc7, 0x14, 0x30, - 0x90, 0xc8, 0xff, 0x31, 0x01, 0x31, 0x90, 0xc1, - 0x90, 0xbc, 0x70, 0x47, 0x00, 0x00, 0x88, 0xe5, - 0x03, 0x20, 0x80, 0xb5, 0x82, 0xb0, 0x07, 0x1c, - 0x68, 0x46, 0x30, 0xf0, 0x20, 0xfb, 0x40, 0x20, - 0x38, 0x60, 0x69, 0x46, 0x0c, 0xc9, 0xf8, 0x1d, - 0x05, 0x30, 0x0c, 0xc0, 0x0a, 0x20, 0x39, 0x1c, - 0xfc, 0xf7, 0xcf, 0xf8, 0x02, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x02, 0x69, - 0x17, 0x49, 0x53, 0x18, 0xc0, 0x33, 0x1c, 0x79, - 0x1b, 0x7b, 0xc7, 0x68, 0x00, 0x2f, 0x1d, 0xd1, - 0xcf, 0x1d, 0xb9, 0x37, 0x8a, 0x60, 0xfd, 0x69, - 0xaa, 0x42, 0x00, 0xd9, 0x8d, 0x60, 0x82, 0x69, - 0x00, 0x2a, 0x0a, 0xd0, 0x7a, 0x69, 0x01, 0x2a, - 0x04, 0xd0, 0x02, 0x2a, 0x07, 0xd1, 0x80, 0x22, - 0x0a, 0x60, 0x04, 0xe0, 0x40, 0x22, 0x0a, 0x60, - 0x01, 0xe0, 0x00, 0x22, 0x0a, 0x60, 0x40, 0x69, - 0x48, 0x60, 0x0b, 0x61, 0xcc, 0x60, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x43, 0x69, 0x84, 0x69, - 0x38, 0x1c, 0x11, 0x1c, 0x22, 0x1c, 0xff, 0xf7, - 0x74, 0xff, 0xf4, 0xe7, 0x00, 0x00, 0x88, 0xe5, - 0x03, 0x20, 0xf0, 0xb5, 0x82, 0xb0, 0x69, 0x46, - 0xc7, 0x1d, 0x09, 0x37, 0x48, 0xcf, 0xc4, 0x69, - 0x85, 0x69, 0x48, 0xc1, 0xc7, 0x68, 0xfc, 0xf7, - 0x58, 0xf8, 0x30, 0xf0, 0x76, 0xfe, 0x01, 0x20, - 0xfd, 0xf7, 0x51, 0xfa, 0x00, 0x2f, 0x0a, 0xd0, - 0x6e, 0x46, 0x15, 0x48, 0x0c, 0xce, 0xc1, 0x1d, - 0xf1, 0x31, 0x0c, 0xc1, 0xff, 0x30, 0x01, 0x30, - 0x44, 0x60, 0x05, 0x60, 0x02, 0xe0, 0x68, 0x46, - 0x30, 0xf0, 0xbd, 0xfa, 0xfc, 0xf7, 0x06, 0xf8, - 0x3f, 0x21, 0x01, 0x60, 0x04, 0x1c, 0x01, 0x20, - 0x00, 0x2f, 0xed, 0x09, 0x00, 0x4c, 0x00, 0x00, - 0xd0, 0x00, 0x20, 0x20, 0x61, 0x69, 0x46, 0x0c, - 0xc9, 0xe0, 0x1d, 0x0d, 0x30, 0x0c, 0xc0, 0x00, - 0x20, 0xe0, 0x60, 0x30, 0xf0, 0x4c, 0xfe, 0x0a, - 0x20, 0x21, 0x1c, 0xfc, 0xf7, 0x60, 0xf8, 0x08, - 0x20, 0x30, 0xf0, 0x51, 0xfe, 0x02, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x88, - 0xe5, 0x03, 0x20, 0xc0, 0x68, 0x02, 0x49, 0xc0, - 0x30, 0x01, 0x62, 0x70, 0x47, 0x00, 0x00, 0xff, - 0xff, 0x00, 0x00, 0x08, 0x1a, 0x90, 0x42, 0x01, - 0xda, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, - 0x47, 0x90, 0xb5, 0x90, 0xc9, 0xfb, 0xf7, 0xd4, - 0xff, 0x00, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x32, 0x21, 0x01, - 0x60, 0xc4, 0x60, 0x07, 0x61, 0x01, 0x1c, 0x0e, - 0x20, 0xfc, 0xf7, 0x35, 0xf8, 0x00, 0x20, 0xf2, - 0xe7, 0xf0, 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0x68, - 0x46, 0xf9, 0x1d, 0x05, 0x31, 0x60, 0xc9, 0x60, - 0xc0, 0x00, 0x98, 0x01, 0x99, 0x26, 0xa6, 0x0c, - 0xce, 0x08, 0x3e, 0xfb, 0xf7, 0x44, 0xfd, 0x00, - 0x28, 0x09, 0xd0, 0x24, 0x48, 0x2f, 0xf0, 0x8b, - 0xfa, 0x38, 0x1c, 0xfb, 0xf7, 0xe8, 0xff, 0x02, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x69, - 0x46, 0x0c, 0xc9, 0x1f, 0x48, 0x0c, 0xc0, 0xff, - 0xf7, 0xd6, 0xf9, 0x0c, 0x1c, 0x05, 0x1c, 0x00, - 0x9a, 0x01, 0x9b, 0x0c, 0xf0, 0x78, 0xf8, 0x00, - 0x28, 0x0d, 0xd0, 0x00, 0x98, 0x01, 0x99, 0x40, - 0x1b, 0xa1, 0x41, 0x01, 0x91, 0x00, 0x90, 0x17, - 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0x0b, 0xf0, 0xc7, - 0xff, 0x00, 0x90, 0x01, 0x91, 0x03, 0xe0, 0x68, - 0x46, 0x31, 0x1c, 0x0c, 0xc9, 0x0c, 0xc0, 0x00, - 0x98, 0x01, 0x99, 0x0c, 0xce, 0xfb, 0xf7, 0x13, - 0xfd, 0x00, 0x28, 0x08, 0xd0, 0xed, 0x09, 0x00, - 0x4d, 0x00, 0x0c, 0x4c, 0x20, 0x1c, 0x2f, 0xf0, - 0x59, 0xfa, 0x0b, 0x49, 0x20, 0x1c, 0xff, 0xf7, - 0xa2, 0xff, 0x07, 0xe0, 0x00, 0x98, 0x01, 0x99, - 0x07, 0x4b, 0x01, 0x1c, 0x05, 0x48, 0x09, 0x4a, - 0x2f, 0xf0, 0x02, 0xfa, 0x38, 0x1c, 0xfb, 0xf7, - 0xa9, 0xff, 0xbf, 0xe7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x94, 0xed, 0x03, 0x20, - 0xfc, 0x7d, 0x03, 0x20, 0xd0, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa3, 0x4b, 0x00, 0x20, - 0x80, 0xb5, 0x08, 0x48, 0x02, 0x21, 0xc1, 0x60, - 0x81, 0x68, 0x02, 0x23, 0x19, 0x43, 0x81, 0x60, - 0x05, 0x48, 0x00, 0x27, 0xc7, 0x60, 0x2f, 0xf0, - 0xbb, 0xf9, 0x38, 0x1c, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, - 0x94, 0xed, 0x03, 0x20, 0x00, 0xb5, 0x2f, 0xf0, - 0xc5, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x01, 0x2a, 0x04, 0xd1, 0x00, 0x0b, 0x40, 0x18, - 0xc0, 0x06, 0xc0, 0x0e, 0x70, 0x47, 0x00, 0x20, - 0x70, 0x47, 0x01, 0x2a, 0x11, 0xd1, 0x0a, 0x0b, - 0xd2, 0x06, 0xd2, 0x0e, 0x88, 0x42, 0x03, 0xd3, - 0x40, 0x1a, 0x01, 0x30, 0x80, 0x08, 0x04, 0xe0, - 0x05, 0x4b, 0x19, 0x43, 0x40, 0x1a, 0x01, 0x30, - 0x80, 0x08, 0x10, 0x18, 0xc0, 0x06, 0xc0, 0x0e, - 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xf0, 0xb0, 0xb4, 0x01, 0x29, - 0x41, 0xd1, 0x41, 0x08, 0x0e, 0x23, 0x19, 0x40, - 0xc3, 0x07, 0xdb, 0x0f, 0x19, 0x43, 0x0d, 0x1c, - 0x01, 0x0b, 0xcc, 0x06, 0xe4, 0x0e, 0x01, 0x0b, - 0xc9, 0x06, 0xc9, 0x0e, 0xcf, 0x1d, 0x01, 0x37, - 0x18, 0x31, 0x02, 0x2a, 0x0e, 0xd1, 0x0e, 0x22, - 0x22, 0x40, 0x00, 0x0b, 0x02, 0x23, 0x18, 0x40, - 0xaa, 0x42, 0x03, 0xd8, 0x00, 0x28, 0x19, 0xd0, - 0xed, 0x09, 0x00, 0x4e, 0x00, 0x39, 0x1c, 0x17, - 0xe0, 0x00, 0x28, 0x15, 0xd1, 0x39, 0x1c, 0x13, - 0xe0, 0x01, 0x2a, 0x0e, 0xd1, 0x22, 0x07, 0x12, - 0x0f, 0x00, 0x0b, 0xc0, 0x07, 0xc0, 0x0f, 0xaa, - 0x42, 0x03, 0xd8, 0x00, 0x28, 0x08, 0xd0, 0x39, - 0x1c, 0x06, 0xe0, 0x00, 0x28, 0x04, 0xd1, 0x39, - 0x1c, 0x02, 0xe0, 0x80, 0x09, 0x00, 0xd3, 0x39, - 0x1c, 0xa5, 0x42, 0x02, 0xd3, 0x28, 0x1b, 0x40, - 0x18, 0x03, 0xe0, 0x60, 0x1b, 0x00, 0x07, 0x00, - 0x0f, 0x08, 0x1a, 0xc0, 0x06, 0xc0, 0x0e, 0xb0, - 0xbc, 0x70, 0x47, 0x00, 0x20, 0xfb, 0xe7, 0xb0, - 0xb4, 0x01, 0x2a, 0x34, 0xd1, 0x1b, 0x4a, 0x0a, - 0x40, 0x88, 0x42, 0x02, 0xd3, 0x80, 0x1a, 0x80, - 0x08, 0x03, 0xe0, 0x19, 0x4b, 0x1a, 0x43, 0x80, - 0x1a, 0x80, 0x08, 0x4a, 0x08, 0x0e, 0x23, 0x1a, - 0x40, 0xcb, 0x07, 0xdb, 0x0f, 0x13, 0x43, 0x0a, - 0x0b, 0xd2, 0x06, 0xd2, 0x0e, 0x17, 0x07, 0x3f, - 0x0f, 0x09, 0x0b, 0xc9, 0x06, 0xc9, 0x0e, 0xcd, - 0x07, 0xed, 0x0f, 0xcc, 0x1d, 0x11, 0x34, 0x08, - 0x31, 0x9f, 0x42, 0x03, 0xd8, 0x00, 0x2d, 0x04, - 0xd1, 0x21, 0x1c, 0x02, 0xe0, 0x00, 0x2d, 0x00, - 0xd0, 0x21, 0x1c, 0x93, 0x42, 0x02, 0xd3, 0x9a, - 0x1a, 0x51, 0x18, 0x03, 0xe0, 0xd2, 0x1a, 0x12, - 0x07, 0x12, 0x0f, 0x89, 0x1a, 0x08, 0x18, 0xc0, - 0x06, 0xc0, 0x0e, 0xb0, 0xbc, 0x70, 0x47, 0x00, - 0x20, 0xfb, 0xe7, 0x00, 0x00, 0xfc, 0xff, 0xff, - 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xb5, 0x8f, - 0xb0, 0x50, 0x4f, 0x38, 0x68, 0x00, 0x28, 0x0a, - 0xd1, 0x01, 0x20, 0x00, 0x03, 0x20, 0xf0, 0x52, - 0xfe, 0x38, 0x60, 0x00, 0x28, 0x03, 0xd1, 0x0f, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x78, - 0x68, 0x00, 0x28, 0x07, 0xd1, 0x01, 0x20, 0x00, - 0x03, 0x20, 0xf0, 0xed, 0x09, 0x00, 0x4f, 0x00, - 0x44, 0xfe, 0x78, 0x60, 0x00, 0x28, 0x00, 0xd1, - 0xf0, 0xe7, 0x68, 0x46, 0x44, 0x4c, 0x07, 0x23, - 0x06, 0xcc, 0x06, 0xc0, 0x01, 0x3b, 0xfb, 0xd1, - 0x00, 0x24, 0x00, 0x20, 0x63, 0x01, 0x0e, 0x93, - 0x06, 0x27, 0x01, 0x1c, 0x02, 0x1c, 0x01, 0x25, - 0xbd, 0x40, 0x2b, 0x1c, 0x23, 0x40, 0x1d, 0x1c, - 0x08, 0xd0, 0xbb, 0x00, 0x6b, 0x44, 0xdb, 0x69, - 0x1e, 0x1c, 0x16, 0x40, 0x02, 0xd0, 0x9e, 0x42, - 0x00, 0xd0, 0x5a, 0x40, 0x00, 0x2d, 0x08, 0xd0, - 0xbb, 0x00, 0x6d, 0x46, 0xeb, 0x58, 0x1d, 0x1c, - 0x0d, 0x40, 0x02, 0xd0, 0x9d, 0x42, 0x00, 0xd0, - 0x59, 0x40, 0x01, 0x3f, 0xe3, 0xd5, 0x0e, 0x9b, - 0x2e, 0x4d, 0x1b, 0x18, 0x2f, 0x68, 0x01, 0x30, - 0xfa, 0x54, 0x6a, 0x68, 0x20, 0x28, 0xd1, 0x54, - 0xd6, 0xd3, 0x01, 0x34, 0x80, 0x2c, 0xd0, 0xd3, - 0x28, 0x4f, 0xb8, 0x68, 0x00, 0x28, 0x07, 0xd1, - 0x01, 0x20, 0x40, 0x03, 0x20, 0xf0, 0x01, 0xfe, - 0xb8, 0x60, 0x00, 0x28, 0x00, 0xd1, 0xad, 0xe7, - 0x00, 0x20, 0x01, 0x21, 0x49, 0x03, 0xc2, 0x07, - 0xd2, 0x0f, 0x44, 0x10, 0x02, 0x23, 0x23, 0x40, - 0x1a, 0x43, 0x84, 0x10, 0x04, 0x23, 0x23, 0x40, - 0x1a, 0x43, 0xc4, 0x10, 0x08, 0x23, 0x23, 0x40, - 0x1a, 0x43, 0x04, 0x11, 0x10, 0x23, 0x23, 0x40, - 0x1a, 0x43, 0x44, 0x11, 0x20, 0x23, 0x23, 0x40, - 0x1a, 0x43, 0x84, 0x11, 0x40, 0x23, 0x23, 0x40, - 0x13, 0x43, 0xba, 0x68, 0x13, 0x54, 0x01, 0x30, - 0x88, 0x42, 0xe0, 0xdb, 0xf8, 0x68, 0x3c, 0x1c, - 0x00, 0x28, 0x07, 0xd1, 0x01, 0x20, 0x40, 0x02, - 0x20, 0xf0, 0xd3, 0xfd, 0xe0, 0x60, 0x00, 0x28, - 0x00, 0xd1, 0x7f, 0xe7, 0x00, 0x27, 0x01, 0x25, - 0x6d, 0x02, 0x4f, 0x20, 0x39, 0x1c, 0x0b, 0xf0, - 0xee, 0xfe, 0x28, 0x29, 0x03, 0xda, 0xed, 0x09, - 0x00, 0x50, 0x00, 0x48, 0x00, 0xe1, 0x68, 0xc8, - 0x55, 0x05, 0xe0, 0xc8, 0x1f, 0x21, 0x38, 0x40, - 0x00, 0x41, 0x1c, 0xe0, 0x68, 0xc1, 0x55, 0x01, - 0x37, 0xaf, 0x42, 0xec, 0xdb, 0x68, 0xe7, 0x04, - 0x7e, 0x03, 0x20, 0xa0, 0x0f, 0x01, 0x20, 0x90, - 0xb5, 0x0e, 0x4c, 0x00, 0x27, 0x20, 0x68, 0x00, - 0x28, 0x02, 0xd0, 0x20, 0xf0, 0xd8, 0xfd, 0x27, - 0x60, 0x60, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, - 0xf0, 0xd2, 0xfd, 0x67, 0x60, 0xa0, 0x68, 0x00, - 0x28, 0x02, 0xd0, 0x20, 0xf0, 0xcc, 0xfd, 0xa7, - 0x60, 0xe0, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, - 0xf0, 0xc6, 0xfd, 0xe7, 0x60, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x04, 0x7e, 0x03, 0x20, 0xff, - 0xb5, 0x95, 0xb0, 0x00, 0x27, 0x45, 0x08, 0x20, - 0x9c, 0x14, 0x95, 0x1f, 0x9a, 0x1e, 0x9b, 0x01, - 0x2c, 0x5f, 0xd1, 0x18, 0x9f, 0xfe, 0x1e, 0x07, - 0x0b, 0x12, 0x06, 0x1a, 0x43, 0x12, 0x01, 0x12, - 0x09, 0xd5, 0x05, 0xed, 0x0d, 0x93, 0x0a, 0x11, - 0x93, 0xdb, 0x05, 0xdb, 0x0d, 0x12, 0x93, 0xd3, - 0x0c, 0x1c, 0x07, 0xe9, 0x4b, 0x13, 0x97, 0x5b, - 0x68, 0x24, 0x0f, 0x10, 0x93, 0xe7, 0x4b, 0xd7, - 0x0d, 0x1b, 0x68, 0x0f, 0x93, 0xe5, 0x4b, 0xdb, - 0x68, 0x0e, 0x93, 0x02, 0x23, 0x03, 0x40, 0x0a, - 0x93, 0x1b, 0x01, 0x52, 0x08, 0xd2, 0x04, 0xd2, - 0x0c, 0x0c, 0x92, 0x0a, 0x0b, 0xd2, 0x06, 0xd2, - 0x0e, 0x0b, 0x92, 0xdd, 0x4a, 0x0d, 0x93, 0x92, - 0x68, 0x18, 0x2e, 0x5e, 0xd2, 0x02, 0xa3, 0x9b, - 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0xe4, - 0xe3, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0, 0xe3, 0xe3, - 0x0c, 0xe3, 0xe3, 0x0c, 0x84, 0xe0, 0xe3, 0xe3, - 0x0c, 0xe3, 0xe3, 0x0c, 0x84, 0xe0, 0xe0, 0x14, - 0x99, 0x0e, 0x23, 0x19, 0x40, 0xc3, 0x07, 0xdb, - 0x0f, 0xed, 0x09, 0x00, 0x51, 0x00, 0x19, 0x43, - 0x13, 0x9b, 0xde, 0x06, 0xf6, 0x0e, 0x00, 0x96, - 0x06, 0x0b, 0xf6, 0x06, 0xf6, 0x0e, 0x04, 0x96, - 0x18, 0x36, 0x21, 0x9b, 0x09, 0x96, 0x04, 0x9e, - 0x08, 0x36, 0x08, 0x96, 0x02, 0x2b, 0x14, 0xd1, - 0x00, 0x9e, 0x0e, 0x23, 0x1e, 0x40, 0x00, 0x0b, - 0x02, 0x23, 0x18, 0x40, 0x8e, 0x42, 0x06, 0xd8, - 0x00, 0x28, 0x02, 0xd0, 0x08, 0x9e, 0x24, 0xe0, - 0x69, 0xe1, 0x09, 0x9e, 0x21, 0xe0, 0x00, 0x28, - 0x01, 0xd0, 0x09, 0x9e, 0x1d, 0xe0, 0x08, 0x9e, - 0x1b, 0xe0, 0x21, 0x9b, 0x01, 0x2b, 0x13, 0xd1, - 0x00, 0x9e, 0x33, 0x07, 0x1b, 0x0f, 0x00, 0x0b, - 0xc0, 0x07, 0xc0, 0x0f, 0x8b, 0x42, 0x05, 0xd8, - 0x00, 0x28, 0x01, 0xd0, 0x08, 0x9e, 0x0c, 0xe0, - 0x09, 0x9e, 0x0a, 0xe0, 0x00, 0x28, 0x01, 0xd0, - 0x09, 0x9e, 0x06, 0xe0, 0x08, 0x9e, 0x04, 0xe0, - 0x80, 0x09, 0x01, 0xd3, 0x08, 0x9e, 0x00, 0xe0, - 0x09, 0x9e, 0x00, 0x98, 0x81, 0x42, 0x04, 0xd3, - 0x00, 0x98, 0x08, 0x1a, 0x80, 0x19, 0x05, 0xe0, - 0x3b, 0xe1, 0x00, 0x98, 0x40, 0x1a, 0x00, 0x07, - 0x00, 0x0f, 0x30, 0x1a, 0x38, 0x18, 0xc0, 0x06, - 0xc0, 0x0e, 0x60, 0x40, 0x53, 0x5d, 0x0a, 0x9c, - 0x12, 0x99, 0x00, 0x2c, 0x02, 0xd0, 0x1f, 0x1c, - 0x1f, 0x23, 0x7b, 0x40, 0x5b, 0x02, 0x19, 0x43, - 0xcb, 0x09, 0x5b, 0x01, 0x18, 0x43, 0x0f, 0x9b, - 0x49, 0x06, 0x18, 0x5c, 0x49, 0x0e, 0x49, 0x01, - 0x10, 0x9b, 0x08, 0x43, 0x18, 0x5c, 0x0c, 0x9f, - 0xd1, 0x5d, 0x0d, 0x9b, 0x08, 0x18, 0x18, 0x18, - 0x0e, 0x9b, 0x18, 0x5c, 0x19, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x97, 0x4b, 0x0b, 0x40, - 0x88, 0x42, 0x03, 0xd3, 0xc0, 0x1a, 0x80, 0x08, - 0x00, 0x90, 0x05, 0xe0, 0x1e, 0x1c, 0x94, 0x4b, - 0x33, 0x43, 0xc0, 0x1a, 0xed, 0x09, 0x00, 0x52, - 0x00, 0x80, 0x08, 0x00, 0x90, 0x48, 0x08, 0x0e, - 0x23, 0x18, 0x40, 0xcb, 0x07, 0xdb, 0x0f, 0x18, - 0x43, 0x0b, 0x9b, 0x1e, 0x07, 0x36, 0x0f, 0x09, - 0x0b, 0xc9, 0x06, 0xc9, 0x0e, 0x03, 0x91, 0x18, - 0x31, 0x07, 0x91, 0x03, 0x99, 0x08, 0x31, 0x06, - 0x91, 0x03, 0x99, 0xc9, 0x07, 0xc9, 0x0f, 0x86, - 0x42, 0x05, 0xd8, 0x00, 0x29, 0x01, 0xd0, 0x06, - 0x99, 0x06, 0xe0, 0x07, 0x99, 0x04, 0xe0, 0x00, - 0x29, 0x01, 0xd0, 0x07, 0x99, 0x00, 0xe0, 0x06, - 0x99, 0x98, 0x42, 0x02, 0xd3, 0xc0, 0x1a, 0x40, - 0x18, 0x03, 0xe0, 0x18, 0x1a, 0x00, 0x07, 0x00, - 0x0f, 0x08, 0x1a, 0x00, 0x99, 0x53, 0x5d, 0x79, - 0x18, 0x08, 0x18, 0xc0, 0x06, 0xc0, 0x0e, 0x60, - 0x40, 0x0a, 0x9c, 0x12, 0x99, 0x00, 0x2c, 0x02, - 0xd0, 0x1f, 0x1c, 0x1f, 0x23, 0x7b, 0x40, 0x5b, - 0x02, 0x19, 0x43, 0xcb, 0x09, 0x5b, 0x01, 0x18, - 0x43, 0x0f, 0x9b, 0x49, 0x06, 0x18, 0x5c, 0x49, - 0x0e, 0x49, 0x01, 0x10, 0x9b, 0x08, 0x43, 0x18, - 0x5c, 0x0c, 0x9f, 0xd1, 0x5d, 0x0d, 0x9b, 0x08, - 0x18, 0x18, 0x18, 0x0e, 0x9b, 0x18, 0x5c, 0x9f, - 0xe7, 0x82, 0xe0, 0x02, 0xe0, 0x66, 0xe0, 0xb2, - 0xe0, 0x3e, 0xe0, 0x0b, 0x9b, 0x46, 0x1a, 0x02, - 0x93, 0x66, 0x4b, 0x0b, 0x43, 0xc3, 0x1a, 0x05, - 0x93, 0x88, 0x42, 0x02, 0xd3, 0x73, 0x1c, 0x9b, - 0x08, 0x02, 0xe0, 0x05, 0x9b, 0x01, 0x33, 0x9b, - 0x08, 0xfb, 0x18, 0x02, 0x9f, 0xdb, 0x19, 0xdb, - 0x06, 0xdb, 0x0e, 0x5c, 0x40, 0x12, 0x9b, 0x27, - 0x1c, 0x01, 0x93, 0x54, 0x5d, 0x88, 0x42, 0x01, - 0xd3, 0x33, 0x1c, 0x00, 0xe0, 0x05, 0x9b, 0x5d, - 0x1c, 0xab, 0x08, 0x01, 0xd3, 0x1f, 0x23, 0x5c, - 0x40, 0x63, 0x02, 0x01, 0x9c, 0x23, 0x43, 0xdc, - 0x09, 0x64, 0x01, 0x27, 0x43, 0x0f, 0x9c, 0xed, - 0x09, 0x00, 0x53, 0x00, 0x5b, 0x06, 0xe7, 0x5d, - 0x5b, 0x0e, 0x5b, 0x01, 0x3b, 0x43, 0x10, 0x9f, - 0xfb, 0x5c, 0x0c, 0x9f, 0xd2, 0x5d, 0xd2, 0x18, - 0x88, 0x42, 0x00, 0xd2, 0x05, 0x9e, 0x02, 0x23, - 0x70, 0x1c, 0x18, 0x40, 0x00, 0x01, 0x0e, 0x9b, - 0x80, 0x18, 0x18, 0x5c, 0x5b, 0xe7, 0x17, 0x98, - 0x13, 0x9b, 0x18, 0x18, 0xc0, 0x19, 0xc0, 0x06, - 0x53, 0x5d, 0x18, 0x9f, 0xc0, 0x0e, 0x60, 0x40, - 0x05, 0x2f, 0x12, 0x99, 0x02, 0xd1, 0x1f, 0x1c, - 0x1f, 0x23, 0x7b, 0x40, 0x5b, 0x02, 0x19, 0x43, - 0xcb, 0x09, 0x5b, 0x01, 0x18, 0x43, 0x0f, 0x9b, - 0x49, 0x06, 0x18, 0x5c, 0x49, 0x0e, 0x49, 0x01, - 0x10, 0x9b, 0x08, 0x43, 0x18, 0x5c, 0x0c, 0x9f, - 0xd1, 0x5d, 0x18, 0x9b, 0x08, 0x18, 0x05, 0x2b, - 0x00, 0xd1, 0x20, 0x30, 0x0e, 0x9b, 0x18, 0x5c, - 0x35, 0xe7, 0x13, 0x9b, 0xd8, 0x19, 0xc0, 0x06, - 0x53, 0x5d, 0xc0, 0x0e, 0x60, 0x40, 0x12, 0x99, - 0x5b, 0x02, 0x19, 0x43, 0xcb, 0x09, 0x5b, 0x01, - 0x18, 0x43, 0x0f, 0x9b, 0x49, 0x06, 0x18, 0x5c, - 0x49, 0x0e, 0x49, 0x01, 0x10, 0x9b, 0x08, 0x43, - 0x18, 0x5c, 0x0c, 0x9f, 0xd1, 0x5d, 0x0e, 0x9b, - 0x08, 0x18, 0x18, 0x5c, 0x1b, 0xe7, 0x41, 0x0d, - 0x79, 0x40, 0x83, 0x08, 0xc9, 0x18, 0xc9, 0x06, - 0xc9, 0x0e, 0x61, 0x40, 0x11, 0x9b, 0xc7, 0x09, - 0x7b, 0x40, 0xdf, 0x05, 0xff, 0x0d, 0x04, 0x0c, - 0x53, 0x5d, 0xe4, 0x06, 0xe4, 0x0e, 0x63, 0x40, - 0x0a, 0x9c, 0x00, 0x2c, 0x02, 0xd0, 0x1c, 0x1c, - 0x1f, 0x23, 0x63, 0x40, 0x5b, 0x02, 0x3b, 0x43, - 0xdf, 0x09, 0x7f, 0x01, 0x39, 0x43, 0x0f, 0x9c, - 0x5b, 0x06, 0x61, 0x5c, 0x5b, 0x0e, 0x5b, 0x01, - 0x19, 0x43, 0x10, 0x9b, 0x59, 0x5c, 0x0c, 0x9f, - 0xd2, 0x5d, 0x57, 0x18, 0x16, 0x49, 0xc0, 0x08, - 0x01, 0x40, 0xed, 0x09, 0x00, 0x54, 0x00, 0x4f, - 0x20, 0xfa, 0xf7, 0x83, 0xff, 0x0d, 0x9b, 0xc8, - 0x19, 0x18, 0x18, 0x0e, 0x9b, 0x18, 0x5c, 0xe8, - 0xe6, 0x00, 0x20, 0xe6, 0xe6, 0x00, 0x2c, 0x09, - 0xd1, 0x81, 0x07, 0x89, 0x0f, 0x0e, 0x48, 0x01, - 0xd1, 0x47, 0x6a, 0x0c, 0xe0, 0x02, 0x29, 0x0a, - 0xd1, 0x07, 0x6a, 0x08, 0xe0, 0x05, 0x2c, 0x06, - 0xd1, 0x05, 0x20, 0x14, 0x99, 0xfa, 0xf7, 0x69, - 0xff, 0x08, 0x48, 0x40, 0x5c, 0xd1, 0xe6, 0x38, - 0x06, 0x00, 0x0e, 0xce, 0xe6, 0x00, 0x00, 0x04, - 0x7e, 0x03, 0x20, 0xfc, 0xff, 0xff, 0x0f, 0x00, - 0x00, 0x00, 0xf0, 0xf0, 0xff, 0xff, 0x01, 0x48, - 0xe6, 0x03, 0x20, 0x14, 0x7e, 0x03, 0x20, 0xf0, - 0xb5, 0x83, 0xb0, 0x00, 0x27, 0x99, 0x26, 0xb6, - 0x00, 0x05, 0x1c, 0x30, 0x1c, 0x20, 0xf0, 0x91, - 0xfb, 0x04, 0x1c, 0x01, 0xd1, 0x07, 0x27, 0x17, - 0xe0, 0x0e, 0x48, 0x29, 0x1a, 0xf4, 0x20, 0x0b, - 0xf0, 0xae, 0xfc, 0x0c, 0x4b, 0x30, 0x30, 0x98, - 0x71, 0x0d, 0x20, 0x00, 0x90, 0x06, 0x22, 0x1e, - 0x21, 0x01, 0x91, 0x02, 0x92, 0xe8, 0x1d, 0xa5, - 0x30, 0x22, 0x1c, 0x19, 0x1c, 0x33, 0x1c, 0x20, - 0xf0, 0x68, 0xfc, 0x00, 0x28, 0x00, 0xd0, 0x07, - 0x27, 0x38, 0x1c, 0x03, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xfc, 0xef, 0x03, 0x20, 0x1c, - 0x7e, 0x03, 0x20, 0xf0, 0xb5, 0x9e, 0xb0, 0x15, - 0x1c, 0x04, 0x1c, 0x68, 0x46, 0x0a, 0x1c, 0x0f, - 0x1c, 0xaa, 0x21, 0xfa, 0xf7, 0x80, 0xff, 0x6e, - 0x1e, 0x00, 0x2d, 0x09, 0xd0, 0x69, 0x46, 0x00, - 0x23, 0x20, 0x1c, 0x3a, 0x1c, 0x20, 0xf0, 0x13, - 0xfd, 0x30, 0x1c, 0x01, 0x3e, 0x00, 0x28, 0xf5, - 0xd1, 0x1e, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x08, 0x48, 0xc1, 0x1d, 0xff, 0x31, 0xe2, - 0x31, 0x81, 0x42, 0x07, 0xd9, 0xed, 0x09, 0x00, - 0x55, 0x00, 0x02, 0x68, 0x00, 0x2a, 0x01, 0xd0, - 0x01, 0x20, 0x70, 0x47, 0xf4, 0x30, 0x81, 0x42, - 0xf7, 0xd8, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, - 0xfc, 0xef, 0x03, 0x20, 0x06, 0x48, 0xc1, 0x1d, - 0xff, 0x31, 0xe2, 0x31, 0x81, 0x42, 0x05, 0xd9, - 0x02, 0x68, 0x00, 0x2a, 0x03, 0xd0, 0xf4, 0x30, - 0x81, 0x42, 0xf9, 0xd8, 0x00, 0x20, 0x70, 0x47, - 0xfc, 0xef, 0x03, 0x20, 0x01, 0x1c, 0x08, 0x48, - 0xc2, 0x1d, 0xff, 0x32, 0xe2, 0x32, 0x82, 0x42, - 0x08, 0xd9, 0x03, 0x68, 0x00, 0x2b, 0x02, 0xd0, - 0x83, 0x68, 0x8b, 0x42, 0x03, 0xd0, 0xf4, 0x30, - 0x82, 0x42, 0xf6, 0xd8, 0x00, 0x20, 0x70, 0x47, - 0xfc, 0xef, 0x03, 0x20, 0x01, 0x1c, 0x08, 0x48, - 0xc2, 0x1d, 0xff, 0x32, 0xe2, 0x32, 0x82, 0x42, - 0x08, 0xd9, 0x03, 0x68, 0x00, 0x2b, 0x02, 0xd0, - 0x43, 0x68, 0x8b, 0x42, 0x03, 0xd0, 0xf4, 0x30, - 0x82, 0x42, 0xf6, 0xd8, 0x00, 0x20, 0x70, 0x47, - 0xfc, 0xef, 0x03, 0x20, 0xc1, 0x68, 0x00, 0x29, - 0x05, 0xd0, 0x01, 0x39, 0xc1, 0x60, 0x02, 0xd1, - 0x01, 0x21, 0x09, 0x03, 0x81, 0x60, 0x70, 0x47, - 0x70, 0x47, 0xf0, 0xb5, 0x82, 0xb0, 0x46, 0x69, - 0xc1, 0x68, 0x70, 0x6a, 0x00, 0x25, 0x00, 0x90, - 0xc8, 0x1d, 0xf9, 0x30, 0x34, 0x6a, 0x47, 0x69, - 0x00, 0x2f, 0x06, 0xd1, 0x30, 0x1c, 0x22, 0xf0, - 0xeb, 0xff, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf8, 0x6a, 0x00, 0x28, 0x1c, 0xd0, - 0xb9, 0x6a, 0x22, 0x1c, 0x09, 0x1a, 0xa1, 0x42, - 0x00, 0xd2, 0x0a, 0x1c, 0xc0, 0x19, 0x30, 0x30, - 0x15, 0x1c, 0x00, 0x99, 0xfa, 0xf7, 0x7e, 0xff, - 0xf8, 0x6a, 0xba, 0x6a, 0x40, 0x19, 0x90, 0x42, - 0x09, 0xd3, 0xf8, 0x1d, 0xa5, 0x30, 0x00, 0x23, - 0xf9, 0x1d, 0x29, 0x31, 0x20, 0xf0, 0x86, 0xfc, - 0xed, 0x09, 0x00, 0x56, 0x00, 0x00, 0x20, 0xf8, - 0x62, 0x00, 0xe0, 0xf8, 0x62, 0x64, 0x1b, 0xb8, - 0x6a, 0xa0, 0x42, 0x0e, 0xd8, 0xf8, 0x1d, 0xa5, - 0x30, 0x01, 0x90, 0xba, 0x6a, 0x00, 0x99, 0x01, - 0x98, 0x49, 0x19, 0x00, 0x23, 0x20, 0xf0, 0x74, - 0xfc, 0xb8, 0x6a, 0x45, 0x19, 0x24, 0x1a, 0xa0, - 0x42, 0xf3, 0xd9, 0x00, 0x2c, 0x07, 0xd0, 0xfc, - 0x62, 0x00, 0x99, 0xf8, 0x1d, 0x29, 0x30, 0x49, - 0x19, 0x22, 0x1c, 0xfa, 0xf7, 0x51, 0xff, 0x30, - 0x1c, 0x22, 0xf0, 0xa8, 0xff, 0xbb, 0xe7, 0x80, - 0xb5, 0x83, 0xb0, 0x10, 0x4f, 0xff, 0xf7, 0x51, - 0xff, 0x00, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x0d, - 0xf0, 0x59, 0xfb, 0xf7, 0xe7, 0x00, 0x22, 0xd2, - 0x43, 0x00, 0x92, 0x01, 0x22, 0x38, 0x1c, 0x01, - 0xa9, 0x02, 0xab, 0x21, 0xf0, 0x83, 0xfc, 0x00, - 0x28, 0xec, 0xd1, 0x01, 0x9a, 0xd0, 0x6d, 0xd1, - 0x69, 0x93, 0x69, 0x42, 0x6f, 0x02, 0x2a, 0xe5, - 0xd1, 0x90, 0x30, 0x0a, 0x1c, 0x30, 0xf0, 0x44, - 0xf9, 0xe0, 0xe7, 0x00, 0x00, 0xbc, 0xed, 0x03, - 0x20, 0xb0, 0xb5, 0x12, 0x4c, 0xff, 0x22, 0x00, - 0x21, 0x20, 0x1c, 0xe9, 0x32, 0xfa, 0xf7, 0x98, - 0xfe, 0x00, 0x27, 0x01, 0x25, 0x2d, 0x03, 0xf4, - 0x20, 0x78, 0x43, 0x00, 0x19, 0x85, 0x60, 0xff, - 0xf7, 0xd7, 0xfe, 0x01, 0x37, 0x02, 0x2f, 0xf6, - 0xd3, 0x09, 0x4f, 0x1e, 0x22, 0xaa, 0x21, 0xf8, - 0x1d, 0xa9, 0x30, 0xfa, 0xf7, 0x85, 0xfe, 0x00, - 0x20, 0xb8, 0x66, 0xf8, 0x66, 0x38, 0x67, 0x78, - 0x67, 0xb8, 0x67, 0xf8, 0x67, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xfc, 0xef, 0x03, - 0x20, 0xb4, 0xed, 0x03, 0x20, 0xf0, 0xb5, 0x04, - 0x1c, 0xff, 0x30, 0x01, 0x30, 0x45, 0x69, 0x00, - 0x2d, 0x16, 0xd0, 0xae, 0x6a, 0xfb, 0xf7, 0xcd, - 0xfa, 0x07, 0x1c, 0xed, 0x09, 0x00, 0x57, 0x00, - 0x11, 0xd0, 0x28, 0x6d, 0xf8, 0x60, 0x20, 0x7e, - 0x38, 0x72, 0x68, 0x6d, 0x00, 0x28, 0x01, 0xd0, - 0xf8, 0x61, 0x0f, 0xe0, 0x30, 0x1c, 0xfb, 0xf7, - 0x4e, 0xfa, 0xf8, 0x61, 0x00, 0x28, 0x05, 0xd1, - 0x38, 0x1c, 0xfb, 0xf7, 0xda, 0xfa, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xaa, 0x21, 0x32, 0x1c, - 0xfa, 0xf7, 0x51, 0xfe, 0x01, 0x22, 0x20, 0x1c, - 0x39, 0x1c, 0xbe, 0x61, 0x00, 0xf0, 0x01, 0xf8, - 0xf1, 0xe7, 0xf7, 0xb5, 0xcd, 0x69, 0x8e, 0x69, - 0x00, 0x98, 0x0f, 0x1c, 0xff, 0x30, 0x01, 0x30, - 0x44, 0x69, 0x00, 0x2c, 0x63, 0xd0, 0xa0, 0x6d, - 0x00, 0x28, 0x05, 0xd1, 0x78, 0x20, 0xfb, 0xf7, - 0x2a, 0xfa, 0xa0, 0x65, 0x00, 0x28, 0x4c, 0xd0, - 0xa0, 0x6d, 0xe1, 0x6d, 0x40, 0x18, 0x29, 0x1c, - 0x32, 0x1c, 0xfa, 0xf7, 0xb8, 0xfe, 0x01, 0x20, - 0x38, 0x61, 0xe0, 0x6d, 0x80, 0x19, 0xe0, 0x65, - 0x02, 0x9a, 0x00, 0x2a, 0x07, 0xd1, 0x20, 0x6e, - 0x80, 0x19, 0x20, 0x66, 0x60, 0x6e, 0x01, 0x30, - 0x60, 0x66, 0xb8, 0x6c, 0xa0, 0x66, 0x60, 0x6d, - 0x00, 0x28, 0x03, 0xd0, 0xa8, 0x42, 0x01, 0xd0, - 0xfb, 0xf7, 0x35, 0xfa, 0x65, 0x65, 0xe0, 0x6d, - 0x5a, 0x28, 0x27, 0xd9, 0xa0, 0x6d, 0x00, 0x25, - 0xf8, 0x61, 0xe0, 0x6d, 0xb8, 0x61, 0x20, 0x6e, - 0x38, 0x62, 0x60, 0x6e, 0xb8, 0x62, 0xa0, 0x6e, - 0x58, 0x34, 0xb8, 0x64, 0x00, 0x20, 0x21, 0xc4, - 0x21, 0xc4, 0x68, 0x3c, 0x77, 0x20, 0xc0, 0x43, - 0xa0, 0x66, 0xfb, 0xf7, 0x21, 0xfa, 0x06, 0x1c, - 0x21, 0xd0, 0x35, 0x20, 0x30, 0x60, 0x00, 0x98, - 0x40, 0x68, 0x40, 0x68, 0xf0, 0x60, 0x0e, 0x20, - 0x31, 0x1c, 0x37, 0x61, 0xfb, 0xf7, 0x83, 0xfa, - 0x00, 0x28, 0x27, 0xd0, 0x30, 0x1c, 0xfb, 0xf7, - 0x4a, 0xfa, 0x14, 0xe0, 0x00, 0x20, 0xed, 0x09, - 0x00, 0x58, 0x00, 0xf8, 0x61, 0x11, 0xe0, 0x60, - 0x6d, 0x00, 0x28, 0x03, 0xd0, 0xa8, 0x42, 0x01, - 0xd0, 0xfb, 0xf7, 0xff, 0xf9, 0xfb, 0xf7, 0x02, - 0xfa, 0x06, 0x1c, 0x03, 0xd0, 0x00, 0x20, 0x60, - 0x65, 0xdd, 0xe7, 0x02, 0xe0, 0x00, 0x20, 0x65, - 0x65, 0xf8, 0x61, 0x00, 0x2f, 0x0c, 0xd0, 0x38, - 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xfb, 0xf7, 0xed, - 0xf9, 0xf8, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xfb, - 0xf7, 0xe8, 0xf9, 0x38, 0x1c, 0xfb, 0xf7, 0x4b, - 0xfa, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0xff, - 0x30, 0x01, 0x30, 0x15, 0x4c, 0x45, 0x69, 0xbc, - 0x67, 0x7a, 0x68, 0x20, 0x1c, 0xd6, 0x1d, 0x51, - 0x36, 0x0c, 0xce, 0x0c, 0xc0, 0x38, 0x7e, 0x00, - 0x26, 0x20, 0x72, 0x01, 0x20, 0x60, 0x72, 0xe1, - 0x60, 0x20, 0x1c, 0x39, 0x1c, 0xe6, 0x63, 0x07, - 0xf0, 0xed, 0xfa, 0xa8, 0x6a, 0x0c, 0x49, 0xa0, - 0x61, 0xa8, 0x6a, 0x00, 0x22, 0xa0, 0x63, 0xe1, - 0x61, 0x00, 0x92, 0xe8, 0x1d, 0xa5, 0x30, 0xaa, - 0x6a, 0x01, 0xab, 0x20, 0xf0, 0x24, 0xfc, 0x00, - 0x28, 0x01, 0xd0, 0x05, 0x48, 0xe0, 0x61, 0xb9, - 0x6f, 0x8e, 0x65, 0x02, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x04, 0xee, 0x03, 0x20, 0x82, - 0xee, 0x03, 0x20, 0x64, 0xee, 0x03, 0x20, 0xf0, - 0xb5, 0x08, 0x68, 0x0f, 0x1c, 0x26, 0x28, 0x3d, - 0xd0, 0x27, 0x28, 0x35, 0xd1, 0xfd, 0x68, 0x30, - 0xf0, 0x00, 0xf8, 0xe8, 0x1d, 0xf9, 0x30, 0x44, - 0x69, 0x00, 0x2c, 0x25, 0xd0, 0x69, 0x68, 0xff, - 0x31, 0x91, 0x31, 0x0a, 0x68, 0x02, 0x23, 0x9a, - 0x43, 0x0a, 0x60, 0x00, 0x25, 0x25, 0x60, 0xe5, - 0x61, 0x25, 0x62, 0x65, 0x62, 0x45, 0x61, 0x20, - 0x1c, 0xff, 0xf7, 0x4b, 0xfe, 0x07, 0x20, 0x20, - 0x65, 0xed, 0x09, 0x00, 0x59, 0x00, 0x1e, 0x22, - 0xa2, 0x62, 0xa0, 0x6d, 0x00, 0x28, 0x08, 0xd0, - 0xfb, 0xf7, 0x82, 0xf9, 0xa5, 0x65, 0xe5, 0x65, - 0x77, 0x21, 0xc9, 0x43, 0x25, 0x66, 0xa1, 0x66, - 0x65, 0x66, 0x60, 0x6d, 0x00, 0x28, 0x02, 0xd0, - 0xfb, 0xf7, 0x76, 0xf9, 0x65, 0x65, 0x2f, 0xf0, - 0xcf, 0xff, 0xff, 0xf7, 0x3b, 0xfe, 0xe0, 0x1d, - 0xa5, 0x30, 0x2f, 0xf0, 0x57, 0xfd, 0x38, 0x1c, - 0xfb, 0xf7, 0xaa, 0xf9, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xfc, 0x68, 0x7d, 0x6a, 0xe6, 0x1d, - 0xf9, 0x36, 0x70, 0x69, 0x00, 0x28, 0xf2, 0xd1, - 0x2f, 0xf0, 0xbe, 0xff, 0x28, 0x1c, 0xff, 0xf7, - 0xf3, 0xfd, 0x00, 0x28, 0x06, 0xd1, 0xff, 0xf7, - 0xdf, 0xfd, 0x00, 0x28, 0x02, 0xd1, 0x2f, 0xf0, - 0xaf, 0xff, 0xe4, 0xe7, 0x00, 0x21, 0xc1, 0x61, - 0x3a, 0x6a, 0x02, 0x62, 0xfa, 0x69, 0x42, 0x62, - 0xba, 0x69, 0x02, 0x65, 0x7b, 0x69, 0x05, 0x2a, - 0x43, 0x67, 0x1e, 0xd0, 0x06, 0x2a, 0x1f, 0xd0, - 0x07, 0x2a, 0x01, 0xd1, 0x1e, 0x22, 0x82, 0x62, - 0x41, 0x65, 0xc1, 0x62, 0x81, 0x65, 0xc1, 0x65, - 0x01, 0x66, 0x41, 0x66, 0x77, 0x21, 0xc9, 0x43, - 0x81, 0x66, 0x61, 0x68, 0xff, 0x31, 0x91, 0x31, - 0x0a, 0x68, 0x02, 0x23, 0x1a, 0x43, 0x0a, 0x60, - 0x85, 0x60, 0xc1, 0x68, 0x01, 0x31, 0xc1, 0x60, - 0x04, 0x60, 0x70, 0x61, 0x2f, 0xf0, 0x84, 0xff, - 0xb9, 0xe7, 0x0a, 0x22, 0x82, 0x62, 0xe3, 0xe7, - 0x14, 0x22, 0x82, 0x62, 0xe0, 0xe7, 0x00, 0x00, - 0x00, 0xb5, 0x08, 0x20, 0x2f, 0xf0, 0xa8, 0xff, - 0x02, 0x48, 0x2f, 0xf0, 0xa1, 0xff, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x34, 0xf2, 0x03, 0x20, - 0x00, 0xb5, 0xff, 0x20, 0x01, 0x30, 0x2f, 0xf0, - 0x9b, 0xff, 0x02, 0x48, 0x2f, 0xf0, 0x94, 0xff, - 0x08, 0xbc, 0x18, 0x47, 0xed, 0x09, 0x00, 0x5a, - 0x00, 0x8c, 0xf2, 0x03, 0x20, 0x00, 0xb5, 0x01, - 0x20, 0x08, 0xf0, 0x62, 0xf9, 0x08, 0xbc, 0x18, - 0x47, 0xb0, 0xb5, 0x48, 0x4f, 0x38, 0x68, 0x38, - 0x68, 0x40, 0x08, 0x08, 0xd3, 0x01, 0x20, 0xf8, - 0x60, 0xb8, 0x68, 0x40, 0x08, 0x40, 0x00, 0xb8, - 0x60, 0x00, 0x20, 0xfd, 0xf7, 0x51, 0xf8, 0x38, - 0x68, 0x80, 0x08, 0x03, 0xd3, 0x02, 0x20, 0xf8, - 0x60, 0xfe, 0xf7, 0x32, 0xfb, 0x2f, 0xf0, 0x4a, - 0xff, 0xff, 0x25, 0x3c, 0x68, 0x09, 0x35, 0x25, - 0x40, 0x07, 0xd0, 0x0b, 0xf0, 0x37, 0xff, 0xff, - 0x20, 0x09, 0x30, 0xf8, 0x60, 0x28, 0x1c, 0x08, - 0xf0, 0x3b, 0xf9, 0x60, 0x09, 0x03, 0xd3, 0x10, - 0x20, 0xf8, 0x60, 0x08, 0xf0, 0xcb, 0xf9, 0xe0, - 0x08, 0x03, 0xd3, 0x04, 0x20, 0xf8, 0x60, 0x08, - 0xf0, 0x49, 0xfa, 0x0b, 0x20, 0x3c, 0x68, 0x80, - 0x01, 0x20, 0x40, 0x04, 0xd0, 0x0b, 0x21, 0x89, - 0x01, 0xf9, 0x60, 0x08, 0xf0, 0x3f, 0xfb, 0xa0, - 0x09, 0x03, 0xd3, 0x20, 0x20, 0xf8, 0x60, 0x08, - 0xf0, 0xb1, 0xfa, 0x2f, 0xf0, 0x1b, 0xff, 0x38, - 0x68, 0xc0, 0x0a, 0x04, 0xd3, 0x01, 0x20, 0x80, - 0x02, 0xf8, 0x60, 0x08, 0xf0, 0xb3, 0xfb, 0x38, - 0x68, 0x00, 0x0b, 0x04, 0xd3, 0x01, 0x20, 0xc0, - 0x02, 0xf8, 0x60, 0x08, 0xf0, 0x2f, 0xfc, 0x38, - 0x68, 0x40, 0x0b, 0x04, 0xd3, 0x01, 0x20, 0x00, - 0x03, 0xf8, 0x60, 0x08, 0xf0, 0x27, 0xfc, 0x38, - 0x68, 0x80, 0x0b, 0x04, 0xd3, 0x01, 0x20, 0x40, - 0x03, 0xf8, 0x60, 0x08, 0xf0, 0x1f, 0xfc, 0x38, - 0x68, 0xc0, 0x0b, 0x04, 0xd3, 0x01, 0x20, 0x80, - 0x03, 0xf8, 0x60, 0x08, 0xf0, 0x17, 0xfc, 0x38, - 0x68, 0x00, 0x0c, 0x04, 0xd3, 0x01, 0x20, 0xc0, - 0x03, 0xf8, 0x60, 0x08, 0xf0, 0x0f, 0xfc, 0x38, - 0x68, 0x40, 0x0c, 0x04, 0xd3, 0x01, 0x20, 0xed, - 0x09, 0x00, 0x5b, 0x00, 0x00, 0x04, 0xf8, 0x60, - 0x08, 0xf0, 0x07, 0xfc, 0x38, 0x68, 0x80, 0x0c, - 0x04, 0xd3, 0x01, 0x20, 0x40, 0x04, 0xf8, 0x60, - 0x08, 0xf0, 0xff, 0xfb, 0x38, 0x68, 0xc0, 0x0c, - 0x04, 0xd3, 0x01, 0x20, 0x80, 0x04, 0xf8, 0x60, - 0x08, 0xf0, 0xf7, 0xfb, 0x08, 0x20, 0x2f, 0xf0, - 0xdc, 0xfe, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, 0xf0, 0xb5, - 0x85, 0xb0, 0x0f, 0x1c, 0x61, 0x49, 0x5f, 0x48, - 0xc8, 0x60, 0x60, 0x4c, 0xf9, 0x1d, 0x22, 0x63, - 0xe7, 0x62, 0xf8, 0x68, 0x35, 0x31, 0x04, 0x91, - 0x5e, 0x49, 0xfc, 0x1d, 0x03, 0x91, 0x5d, 0x49, - 0xfd, 0x1d, 0xfe, 0x1d, 0x8d, 0x36, 0xad, 0x35, - 0x79, 0x34, 0x03, 0x28, 0x02, 0x91, 0x75, 0xd0, - 0x05, 0x28, 0x74, 0xd0, 0x07, 0x28, 0x2c, 0xd1, - 0x03, 0x98, 0x54, 0x4a, 0x80, 0x6b, 0x01, 0x02, - 0x09, 0x0a, 0x00, 0x0e, 0x90, 0x63, 0x51, 0x63, - 0x02, 0x99, 0x01, 0x20, 0x48, 0x60, 0xe0, 0x69, - 0x02, 0x99, 0x88, 0x60, 0x00, 0x20, 0x78, 0x61, - 0x38, 0x62, 0x4f, 0xa1, 0x0c, 0xc9, 0xf8, 0x1d, - 0x1d, 0x30, 0x0c, 0xc0, 0x4d, 0xa1, 0x0c, 0xc9, - 0xf8, 0x1d, 0x11, 0x30, 0x0c, 0xc0, 0x4a, 0xa1, - 0x0c, 0xc9, 0xf8, 0x1d, 0x25, 0x30, 0x0c, 0xc0, - 0x00, 0x20, 0x78, 0x63, 0x49, 0x49, 0x04, 0x98, - 0x01, 0x91, 0x0c, 0xc9, 0x0c, 0xc0, 0x01, 0x99, - 0x30, 0x1c, 0x0c, 0xc9, 0x0c, 0xc0, 0x00, 0x20, - 0x78, 0x64, 0x2f, 0xf0, 0x82, 0xfe, 0x43, 0x48, - 0x03, 0x21, 0x01, 0x60, 0x43, 0x49, 0x4a, 0x68, - 0x82, 0x62, 0x03, 0x98, 0x43, 0x4b, 0x42, 0x69, - 0x41, 0x48, 0x01, 0x2a, 0x56, 0xd0, 0x02, 0x2a, - 0x03, 0xd1, 0x62, 0x21, 0x19, 0x60, 0x01, 0x21, - 0xc1, 0x60, 0xfa, 0x68, 0x3e, 0x48, 0x3e, 0x49, - 0x03, 0x2a, 0xed, 0x09, 0x00, 0x5c, 0x00, 0x50, - 0xd0, 0x05, 0x2a, 0x4e, 0xd0, 0x07, 0x2a, 0x0d, - 0xd1, 0x35, 0x1c, 0x0c, 0xcd, 0x0c, 0xc1, 0x31, - 0x1c, 0x28, 0xc9, 0x28, 0xc0, 0x28, 0xce, 0x04, - 0x98, 0x2c, 0x4a, 0x28, 0xc0, 0x20, 0x69, 0x90, - 0x61, 0xe0, 0x68, 0xd0, 0x61, 0x29, 0x4c, 0x27, - 0x48, 0xe7, 0x62, 0x81, 0x68, 0x1f, 0x23, 0x5b, - 0x01, 0x99, 0x43, 0x81, 0x60, 0x31, 0x49, 0xc1, - 0x60, 0x81, 0x68, 0x2f, 0x4b, 0x19, 0x43, 0x81, - 0x60, 0x68, 0x46, 0xfe, 0xf7, 0x92, 0xfa, 0x00, - 0x21, 0x2d, 0x4a, 0x0b, 0xf0, 0xbc, 0xf8, 0x00, - 0x9a, 0x02, 0x32, 0x17, 0x01, 0x3f, 0x09, 0x01, - 0xe0, 0x12, 0xe0, 0x0b, 0xe0, 0x00, 0x97, 0x60, - 0x60, 0x00, 0x20, 0x27, 0x60, 0x00, 0xf0, 0x91, - 0xf8, 0x2f, 0xf0, 0x31, 0xfe, 0x05, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x0c, 0xcd, 0x08, - 0x3d, 0x00, 0x21, 0x38, 0x1c, 0x06, 0xf0, 0xfc, - 0xfd, 0x20, 0x48, 0x11, 0x4a, 0x50, 0x63, 0x00, - 0x20, 0x90, 0x63, 0x02, 0x99, 0x01, 0x20, 0x48, - 0x60, 0xe0, 0x69, 0x02, 0x99, 0x88, 0x60, 0x9a, - 0xe7, 0x80, 0x22, 0x1a, 0x60, 0xc9, 0x68, 0xc1, - 0x60, 0xa9, 0xe7, 0x2e, 0x1c, 0x0c, 0xce, 0x0c, - 0xc1, 0x29, 0x1c, 0x48, 0xc9, 0x48, 0xc0, 0x48, - 0xcd, 0x04, 0x98, 0x05, 0x4a, 0x48, 0xc0, 0x20, - 0x6b, 0x90, 0x61, 0xe0, 0x6a, 0xd0, 0x61, 0xb1, - 0xe7, 0x00, 0x00, 0xfc, 0x07, 0x02, 0x00, 0x00, - 0x50, 0x00, 0xe0, 0x34, 0xf3, 0x03, 0x20, 0x48, - 0xe6, 0x03, 0x20, 0x74, 0x03, 0x04, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, - 0xe6, 0x03, 0x20, 0x00, 0x51, 0x00, 0xe0, 0x88, - 0xe5, 0x03, 0x20, 0x00, 0x52, 0x00, 0xe0, 0x40, - 0x53, 0x00, 0xe0, 0x90, 0x57, 0x00, 0xe0, 0x20, - 0x51, 0x00, 0xe0, 0x18, 0x00, 0xed, 0x09, 0x00, - 0x5d, 0x00, 0x02, 0x00, 0xe2, 0x04, 0x00, 0x00, - 0x33, 0x8b, 0x9e, 0x00, 0x00, 0xb5, 0x2f, 0xf0, - 0xe5, 0xfd, 0x18, 0x49, 0x00, 0x20, 0x08, 0x60, - 0x17, 0x49, 0x08, 0x60, 0x17, 0x49, 0x8a, 0x68, - 0x17, 0x4b, 0x1a, 0x40, 0x8a, 0x60, 0xda, 0x43, - 0xca, 0x60, 0x16, 0x49, 0x08, 0x62, 0x48, 0x62, - 0x88, 0x62, 0xc8, 0x62, 0x08, 0x63, 0x48, 0x63, - 0x13, 0x49, 0xc8, 0x1d, 0xb9, 0x30, 0x42, 0x69, - 0x12, 0x48, 0x01, 0x2a, 0x0e, 0xd0, 0x02, 0x2a, - 0x06, 0xd1, 0x09, 0x68, 0x40, 0x23, 0x19, 0x43, - 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x01, 0x62, - 0x01, 0x21, 0x41, 0x60, 0x2f, 0xf0, 0xba, 0xfd, - 0x08, 0xbc, 0x18, 0x47, 0x09, 0x68, 0x80, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, - 0x01, 0x62, 0xf1, 0xe7, 0x00, 0x51, 0x00, 0xe0, - 0x00, 0x52, 0x00, 0xe0, 0x00, 0x50, 0x00, 0xe0, - 0x03, 0xf8, 0xfd, 0xff, 0x00, 0x53, 0x00, 0xe0, - 0x88, 0xe5, 0x03, 0x20, 0x40, 0x53, 0x00, 0xe0, - 0xf0, 0xb5, 0x85, 0xb0, 0x73, 0x4e, 0x71, 0x68, - 0x73, 0x4b, 0xcc, 0x18, 0x31, 0x68, 0xf7, 0x6a, - 0x8d, 0x1c, 0x40, 0x08, 0x08, 0xd3, 0x00, 0x20, - 0x39, 0x1c, 0x32, 0x6b, 0xff, 0xf7, 0xc8, 0xfe, - 0x05, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x20, 0xfc, 0xf7, 0x8d, 0xfe, 0x00, 0x28, - 0x00, 0xd0, 0xf5, 0xe7, 0x69, 0x48, 0x00, 0x69, - 0xff, 0x21, 0xf5, 0x31, 0x20, 0x1a, 0x88, 0x42, - 0x01, 0xda, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, - 0x00, 0x28, 0x05, 0xd0, 0x01, 0x20, 0x39, 0x1c, - 0x32, 0x6b, 0xff, 0xf7, 0xad, 0xfe, 0xe3, 0xe7, - 0x5e, 0x4e, 0x41, 0x23, 0x9b, 0x01, 0xf0, 0x18, - 0x02, 0x1d, 0x06, 0xca, 0xb0, 0x6b, 0x03, 0x92, - 0x00, 0x06, 0x00, 0x0e, 0x01, 0x90, 0x02, 0x91, - 0xed, 0x09, 0x00, 0x5e, 0x00, 0x72, 0x6b, 0x03, - 0x23, 0x00, 0x92, 0xf8, 0x68, 0x05, 0x28, 0x00, - 0xd0, 0x03, 0x1c, 0xf8, 0x1d, 0xff, 0x30, 0x7a, - 0x30, 0x42, 0x68, 0x00, 0x21, 0x28, 0x1c, 0xff, - 0xf7, 0x31, 0xf9, 0x54, 0x49, 0x07, 0x1c, 0x0e, - 0x68, 0xc0, 0x31, 0x04, 0x91, 0x49, 0x69, 0x20, - 0x1c, 0x01, 0x29, 0x6b, 0xd0, 0x02, 0x29, 0x20, - 0xd1, 0x09, 0x21, 0x0a, 0xf0, 0xaf, 0xff, 0xc8, - 0x22, 0x0a, 0xf0, 0xb6, 0xff, 0x34, 0x22, 0x0a, - 0xf0, 0xb3, 0xff, 0x50, 0x22, 0x0a, 0xf0, 0xb0, - 0xff, 0x0d, 0x22, 0x0a, 0xf0, 0xad, 0xff, 0x04, - 0x22, 0x0a, 0xf0, 0xaa, 0xff, 0x28, 0x22, 0x0a, - 0xf0, 0xa7, 0xff, 0xb9, 0x1c, 0x09, 0x02, 0x10, - 0x22, 0x0a, 0x43, 0x43, 0x49, 0x0a, 0x62, 0x42, - 0x22, 0x32, 0x43, 0x12, 0x02, 0x11, 0x23, 0x1a, - 0x43, 0x4a, 0x62, 0x40, 0x4a, 0x40, 0x49, 0x0a, - 0x62, 0x08, 0x60, 0x3c, 0x49, 0x09, 0x68, 0x04, - 0x98, 0x42, 0x69, 0x3e, 0x48, 0x01, 0x2a, 0x5e, - 0xd0, 0x02, 0x2a, 0x05, 0xd1, 0x40, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x01, - 0x62, 0xe1, 0x1d, 0x49, 0x31, 0xff, 0x22, 0x38, - 0x48, 0x02, 0x32, 0x02, 0x62, 0x01, 0x60, 0x04, - 0x99, 0x36, 0x4b, 0x4a, 0x69, 0xe0, 0x18, 0x01, - 0x2a, 0x35, 0x49, 0x4f, 0xd0, 0x02, 0x2a, 0x03, - 0xd1, 0x2d, 0x22, 0x0a, 0x62, 0x2c, 0x22, 0x4a, - 0x62, 0x32, 0x4a, 0x33, 0x49, 0x28, 0x30, 0x0a, - 0x62, 0x08, 0x60, 0xe1, 0x1f, 0x31, 0x48, 0x0d, - 0x39, 0x81, 0x60, 0x23, 0x4e, 0x2b, 0x4b, 0xb1, - 0x69, 0x59, 0x43, 0x09, 0x19, 0x9c, 0x31, 0xc1, - 0x60, 0x01, 0x23, 0x1b, 0x03, 0xc8, 0x1f, 0xc1, - 0x38, 0xf1, 0x18, 0xc8, 0x63, 0xb0, 0x69, 0x25, - 0x49, 0x41, 0x43, 0x09, 0x19, 0x71, 0x60, 0x40, - 0x19, 0x30, 0x60, 0xed, 0x09, 0x00, 0x5f, 0x00, - 0x7d, 0x20, 0x00, 0x01, 0x0b, 0xf0, 0xeb, 0xfc, - 0x53, 0xe7, 0xff, 0xe7, 0x10, 0x21, 0x0a, 0xf0, - 0x44, 0xff, 0xff, 0x22, 0x05, 0x32, 0x0a, 0xf0, - 0x4a, 0xff, 0x46, 0x22, 0x0a, 0xf0, 0x47, 0xff, - 0x0d, 0x22, 0x0a, 0xf0, 0x44, 0xff, 0x04, 0x22, - 0x0a, 0xf0, 0x41, 0xff, 0x28, 0x22, 0x0a, 0xf0, - 0x3e, 0xff, 0xb9, 0x1c, 0x09, 0x02, 0x20, 0x22, - 0x0a, 0x43, 0x0e, 0x49, 0x0a, 0x62, 0x82, 0x22, - 0x32, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, - 0x4a, 0x62, 0x95, 0xe7, 0x80, 0x23, 0x19, 0x43, - 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x01, 0x62, - 0xa1, 0xe7, 0x3d, 0x22, 0x0a, 0x62, 0x3e, 0x22, - 0x4a, 0x62, 0xb0, 0xe7, 0x00, 0x00, 0x34, 0xf3, - 0x03, 0x20, 0xe2, 0x04, 0x00, 0x00, 0x00, 0x50, - 0x00, 0xe0, 0x88, 0xe5, 0x03, 0x20, 0xa0, 0x55, - 0x00, 0xe0, 0x02, 0x05, 0x00, 0x00, 0x08, 0x53, - 0x00, 0xe0, 0xb0, 0x55, 0x00, 0xe0, 0x0c, 0x53, - 0x00, 0xe0, 0x71, 0x02, 0x00, 0x00, 0xc0, 0x55, - 0x00, 0xe0, 0x02, 0x03, 0x00, 0x00, 0x10, 0x53, - 0x00, 0xe0, 0x00, 0x51, 0x00, 0xe0, 0xb0, 0xb5, - 0x22, 0x48, 0x04, 0x69, 0x22, 0x48, 0x22, 0x4a, - 0xc5, 0x68, 0x11, 0x6a, 0x57, 0x6a, 0x09, 0x0a, - 0xff, 0x23, 0x1b, 0x02, 0x3b, 0x40, 0x19, 0x43, - 0x1f, 0x4b, 0x5f, 0x69, 0x01, 0x23, 0x1b, 0x04, - 0x01, 0x2f, 0x28, 0xd0, 0x02, 0x2f, 0x07, 0xd1, - 0x1d, 0x1c, 0x0b, 0x0c, 0x00, 0xd2, 0x00, 0x25, - 0x29, 0x43, 0x01, 0x23, 0xdb, 0x03, 0x99, 0x43, - 0x41, 0x23, 0x9b, 0x01, 0xc3, 0x18, 0x19, 0x60, - 0x01, 0x2f, 0x1d, 0xd0, 0x02, 0x2f, 0x03, 0xd1, - 0x2d, 0x21, 0x11, 0x62, 0x2c, 0x21, 0x51, 0x62, - 0x12, 0x4b, 0xe7, 0x18, 0x01, 0x23, 0x1b, 0x03, - 0xc0, 0x18, 0xc1, 0x6b, 0xc8, 0x22, 0xed, 0x09, - 0x00, 0x60, 0x00, 0x38, 0x1c, 0xfe, 0xf7, 0x33, - 0xfe, 0x00, 0x28, 0x03, 0xd1, 0x0d, 0x49, 0x0d, - 0x48, 0x01, 0x63, 0x07, 0x61, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x2d, 0x00, 0xd1, 0x00, - 0x23, 0x19, 0x43, 0xdb, 0xe7, 0x3d, 0x21, 0x11, - 0x62, 0x3e, 0x21, 0x51, 0x62, 0xe2, 0xe7, 0x00, - 0x50, 0x00, 0xe0, 0x34, 0xf3, 0x03, 0x20, 0xc0, - 0x55, 0x00, 0xe0, 0x48, 0xe6, 0x03, 0x20, 0xe2, - 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, - 0x53, 0x00, 0xe0, 0x00, 0xb5, 0x04, 0x48, 0xc1, - 0x6a, 0x02, 0x6b, 0x01, 0x20, 0xff, 0xf7, 0x77, - 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x34, - 0xf3, 0x03, 0x20, 0x00, 0xb5, 0x2f, 0xf0, 0x3d, - 0xfc, 0x18, 0x49, 0x00, 0x20, 0x08, 0x60, 0x17, - 0x49, 0x08, 0x60, 0x17, 0x49, 0x8a, 0x68, 0x17, - 0x4b, 0x1a, 0x40, 0x8a, 0x60, 0xda, 0x43, 0xca, - 0x60, 0x16, 0x49, 0x08, 0x62, 0x48, 0x62, 0x88, - 0x62, 0xc8, 0x62, 0x08, 0x63, 0x48, 0x63, 0x13, - 0x48, 0x14, 0x49, 0x42, 0x69, 0x14, 0x48, 0x01, - 0x2a, 0x0e, 0xd0, 0x02, 0x2a, 0x06, 0xd1, 0x09, - 0x69, 0x40, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, - 0x23, 0x19, 0x43, 0x01, 0x62, 0x01, 0x21, 0x41, - 0x60, 0x2f, 0xf0, 0x13, 0xfc, 0x08, 0xbc, 0x18, - 0x47, 0x09, 0x69, 0x80, 0x23, 0x19, 0x43, 0x09, - 0x02, 0x10, 0x23, 0x19, 0x43, 0x01, 0x62, 0xf1, - 0xe7, 0x00, 0x00, 0x00, 0x51, 0x00, 0xe0, 0x00, - 0x52, 0x00, 0xe0, 0x00, 0x50, 0x00, 0xe0, 0x03, - 0xf8, 0xff, 0xff, 0x00, 0x53, 0x00, 0xe0, 0x48, - 0xe6, 0x03, 0x20, 0xd4, 0x03, 0x04, 0x20, 0x40, - 0x53, 0x00, 0xe0, 0xf0, 0xb5, 0x85, 0xb0, 0xc8, - 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x14, 0x1c, 0x0f, - 0x1c, 0x87, 0x49, 0x40, 0x68, 0xc8, 0x61, 0x0f, - 0x62, 0xed, 0x09, 0x00, 0x61, 0x00, 0x4a, 0x62, - 0x2f, 0xf0, 0xee, 0xfb, 0x84, 0x49, 0x88, 0x68, - 0x84, 0x4b, 0x18, 0x40, 0x88, 0x60, 0xd8, 0x43, - 0xc8, 0x60, 0x83, 0x4a, 0x00, 0x21, 0x11, 0x60, - 0x82, 0x4a, 0x83, 0x48, 0x11, 0x60, 0x01, 0x62, - 0x41, 0x62, 0x81, 0x62, 0xc1, 0x62, 0x01, 0x63, - 0x41, 0x63, 0x80, 0x49, 0x01, 0x20, 0x48, 0x60, - 0xf8, 0x68, 0x7f, 0x49, 0xfd, 0x1d, 0x04, 0x91, - 0xf9, 0x1d, 0x79, 0x31, 0xfe, 0x1d, 0xad, 0x36, - 0x65, 0x35, 0x0c, 0x38, 0x0e, 0x28, 0x03, 0x91, - 0x4d, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, - 0x9f, 0x44, 0x00, 0x1c, 0x07, 0x49, 0x49, 0x23, - 0x23, 0x23, 0x49, 0x49, 0x07, 0x49, 0x49, 0x23, - 0x23, 0x23, 0x74, 0x48, 0x6b, 0x4c, 0x00, 0x21, - 0xa0, 0x62, 0x00, 0x20, 0xe0, 0x62, 0x0c, 0xce, - 0x08, 0x3e, 0x38, 0x1c, 0x06, 0xf0, 0x85, 0xfb, - 0x6f, 0x49, 0x08, 0x68, 0x20, 0x61, 0x88, 0x68, - 0xe0, 0x60, 0xc8, 0x68, 0x60, 0x61, 0x08, 0x69, - 0xa0, 0x61, 0x01, 0x20, 0x60, 0x63, 0x04, 0x99, - 0x00, 0x20, 0x08, 0x60, 0x02, 0x20, 0xa0, 0x63, - 0x25, 0xe0, 0x20, 0x69, 0x5d, 0x4a, 0x00, 0x02, - 0x00, 0x0a, 0x90, 0x62, 0x20, 0x69, 0x00, 0x0e, - 0xd0, 0x62, 0x21, 0x7e, 0x0c, 0xcd, 0x08, 0x3d, - 0x38, 0x1c, 0x06, 0xf0, 0x66, 0xfb, 0x01, 0x22, - 0x38, 0x1c, 0x21, 0x7e, 0x06, 0xf0, 0x8a, 0xfb, - 0xe0, 0x1d, 0xb9, 0x30, 0x81, 0x68, 0x53, 0x4a, - 0x11, 0x61, 0xc1, 0x68, 0xd1, 0x60, 0x01, 0x69, - 0x51, 0x61, 0x40, 0x69, 0x90, 0x61, 0x01, 0x20, - 0x50, 0x63, 0x04, 0x99, 0x00, 0x20, 0x08, 0x60, - 0x03, 0x99, 0xc8, 0x69, 0x90, 0x63, 0x68, 0x46, - 0xfd, 0xf7, 0xc4, 0xff, 0x53, 0x4b, 0x00, 0x99, - 0xc0, 0x18, 0x02, 0x31, 0x09, 0x01, 0x09, 0x09, - 0x00, 0x91, 0xf9, 0x1d, 0xed, 0x09, 0x00, 0x62, - 0x00, 0xfa, 0x68, 0x35, 0x31, 0x50, 0x4b, 0x02, - 0x91, 0x4e, 0x49, 0x0c, 0x2a, 0x01, 0x93, 0x1b, - 0xd0, 0x0f, 0x2a, 0x03, 0xd0, 0x14, 0x2a, 0x17, - 0xd0, 0x17, 0x2a, 0x33, 0xd1, 0x2c, 0x1c, 0x0c, - 0xcc, 0x0c, 0xc1, 0x18, 0xcd, 0x49, 0x49, 0x3f, - 0x4a, 0x18, 0xc1, 0x30, 0xce, 0x02, 0x99, 0x30, - 0xc1, 0x47, 0x49, 0x11, 0x60, 0x3c, 0x4a, 0x03, - 0x21, 0x11, 0x60, 0x38, 0x49, 0x8a, 0x68, 0x10, - 0x23, 0x1a, 0x43, 0x8a, 0x60, 0xb9, 0x6e, 0x1e, - 0xe0, 0x84, 0x37, 0x3c, 0x1c, 0x0c, 0xcf, 0x0c, - 0xc1, 0x88, 0xcc, 0x3e, 0x49, 0x88, 0xc1, 0x90, - 0xce, 0x02, 0x99, 0x90, 0xc1, 0x01, 0x9b, 0x3d, - 0x49, 0x9a, 0x6a, 0x00, 0x2a, 0x00, 0xd1, 0x04, - 0x39, 0x2e, 0x4a, 0x11, 0x60, 0x2e, 0x4a, 0x03, - 0x21, 0x11, 0x60, 0x2a, 0x49, 0x8a, 0x68, 0x17, - 0x23, 0x5b, 0x01, 0x1a, 0x43, 0x8a, 0x60, 0x03, - 0x99, 0x09, 0x68, 0x00, 0xe0, 0x00, 0x21, 0x2d, - 0x4a, 0x26, 0x4b, 0x52, 0x68, 0x9a, 0x62, 0x01, - 0x9b, 0x5a, 0x69, 0x01, 0x2a, 0x21, 0xd0, 0x02, - 0x2a, 0x05, 0xd1, 0x25, 0x4b, 0x62, 0x22, 0x1a, - 0x60, 0x21, 0x4b, 0x01, 0x22, 0xda, 0x60, 0x00, - 0x9a, 0x93, 0x07, 0x9b, 0x0f, 0x0a, 0xd0, 0x01, - 0x2b, 0x1b, 0xd0, 0x02, 0x2b, 0x1e, 0xd0, 0x03, - 0x2b, 0x25, 0xd1, 0x01, 0x32, 0xff, 0x30, 0xff, - 0x30, 0x73, 0x30, 0x00, 0x92, 0x14, 0x4c, 0xa0, - 0x60, 0x00, 0x98, 0x60, 0x60, 0x40, 0x18, 0x20, - 0x60, 0x01, 0x20, 0x80, 0x02, 0x00, 0xf0, 0x40, - 0xf8, 0x15, 0xe0, 0x15, 0x4b, 0x80, 0x22, 0x1a, - 0x60, 0x0d, 0x4c, 0x11, 0x4b, 0x62, 0x69, 0xda, - 0x60, 0xdd, 0xe7, 0x01, 0x32, 0xff, 0x30, 0xff, - 0x30, 0x73, 0x30, 0x00, 0x92, 0x08, 0x4c, 0xa0, - 0x60, 0x00, 0x98, 0x60, 0x60, 0x40, 0x18, 0xed, - 0x09, 0x00, 0x63, 0x00, 0x20, 0x60, 0x08, 0x20, - 0x00, 0xf0, 0xff, 0xf9, 0x04, 0x49, 0x63, 0x20, - 0x08, 0x63, 0x2f, 0xf0, 0xe6, 0xfa, 0x05, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xd4, 0x03, - 0x04, 0x20, 0x00, 0x50, 0x00, 0xe0, 0x03, 0xf8, - 0xff, 0xff, 0x00, 0x51, 0x00, 0xe0, 0x00, 0x52, - 0x00, 0xe0, 0x00, 0x53, 0x00, 0xe0, 0x40, 0x53, - 0x00, 0xe0, 0x14, 0x14, 0x04, 0x20, 0x33, 0x8b, - 0x9e, 0x00, 0x88, 0xe5, 0x03, 0x20, 0xe2, 0x04, - 0x00, 0x00, 0x20, 0x51, 0x00, 0xe0, 0x48, 0xe6, - 0x03, 0x20, 0x90, 0x57, 0x00, 0xe0, 0x23, 0x3f, - 0x00, 0x00, 0x25, 0x3f, 0x00, 0x00, 0xf0, 0xb5, - 0x86, 0xb0, 0xd4, 0x48, 0x06, 0x1d, 0x60, 0xce, - 0x00, 0x68, 0x85, 0x42, 0x06, 0xd9, 0x00, 0x20, - 0xfc, 0xf7, 0xb9, 0xfb, 0x06, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xd0, 0x48, 0xce, 0x4b, - 0x01, 0x69, 0xf7, 0x18, 0x7b, 0x1a, 0x01, 0x21, - 0x00, 0x22, 0xc8, 0x2b, 0x00, 0xda, 0x0a, 0x1c, - 0x00, 0x2a, 0x06, 0xd0, 0xc8, 0x48, 0x01, 0x6a, - 0x42, 0x6a, 0x01, 0x20, 0xff, 0xf7, 0xa9, 0xfe, - 0xe8, 0xe7, 0xc6, 0x48, 0x81, 0x68, 0x01, 0x23, - 0x9b, 0x02, 0x99, 0x43, 0x81, 0x60, 0xc4, 0x4c, - 0x38, 0x1c, 0x61, 0x69, 0x01, 0x29, 0x73, 0xd0, - 0x02, 0x29, 0x02, 0xd1, 0x06, 0x21, 0x0a, 0xf0, - 0x04, 0xfd, 0x01, 0x1c, 0xc0, 0x48, 0x81, 0x60, - 0x03, 0x21, 0x01, 0x60, 0xba, 0x48, 0xbe, 0x49, - 0xc2, 0x68, 0x63, 0x69, 0x01, 0x2b, 0x64, 0xd0, - 0x02, 0x2b, 0x06, 0xd1, 0xd2, 0x00, 0x40, 0x23, - 0x1a, 0x43, 0x12, 0x02, 0x11, 0x23, 0x1a, 0x43, - 0x0a, 0x62, 0xfa, 0x1d, 0x5d, 0x32, 0xff, 0x23, - 0xb7, 0x49, 0x02, 0x33, 0x0b, 0x62, 0xaf, 0x48, - 0x0a, 0x60, 0x82, 0x6b, 0x41, 0x6b, 0xc0, 0x6a, - 0x03, 0x92, 0xed, 0x09, 0x00, 0x64, 0x00, 0x00, - 0x06, 0x00, 0x0e, 0x01, 0x90, 0xab, 0x48, 0x02, - 0x91, 0x82, 0x6a, 0x00, 0x92, 0x00, 0x6a, 0xc3, - 0x68, 0xa8, 0x48, 0xc2, 0x69, 0xa8, 0x1c, 0x05, - 0x90, 0x00, 0x21, 0xfe, 0xf7, 0x36, 0xfe, 0xa4, - 0x49, 0x04, 0x90, 0x0a, 0x69, 0xaa, 0x4b, 0x03, - 0x92, 0x61, 0x69, 0xf0, 0x18, 0x07, 0x1c, 0x01, - 0x29, 0x75, 0xd0, 0x02, 0x29, 0x22, 0xd1, 0x09, - 0x21, 0x0a, 0xf0, 0xb3, 0xfc, 0xc8, 0x22, 0x0a, - 0xf0, 0xba, 0xfc, 0x34, 0x22, 0x0a, 0xf0, 0xb7, - 0xfc, 0x50, 0x22, 0x0a, 0xf0, 0xb4, 0xfc, 0x0d, - 0x22, 0x0a, 0xf0, 0xb1, 0xfc, 0x04, 0x22, 0x0a, - 0xf0, 0xae, 0xfc, 0x28, 0x22, 0x0a, 0xf0, 0xab, - 0xfc, 0x04, 0x99, 0x02, 0x31, 0x09, 0x02, 0x10, - 0x22, 0x0a, 0x43, 0x99, 0x49, 0x0a, 0x62, 0x03, - 0x9a, 0x42, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x11, - 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x96, 0x4a, 0x96, - 0x49, 0x0a, 0x62, 0x08, 0x60, 0x8b, 0x48, 0x41, - 0x6b, 0x82, 0x6b, 0x05, 0x98, 0xfe, 0xf7, 0xaf, - 0xfc, 0x20, 0x23, 0x18, 0x43, 0x92, 0x4a, 0x00, - 0x02, 0x50, 0x60, 0x01, 0xe0, 0xaa, 0xe0, 0xad, - 0xe0, 0x61, 0x69, 0x38, 0x1c, 0x01, 0x29, 0x73, - 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x09, 0x21, 0x0a, - 0xf0, 0x78, 0xfc, 0xc1, 0x1f, 0x8a, 0x4a, 0x21, - 0x39, 0x91, 0x60, 0xb0, 0x30, 0xd0, 0x60, 0x32, - 0x20, 0x0b, 0xf0, 0x11, 0xfa, 0x7b, 0x48, 0x86, - 0x49, 0x02, 0x69, 0x63, 0x69, 0x01, 0x2b, 0x60, - 0xd0, 0x02, 0x2b, 0x05, 0xd1, 0x40, 0x23, 0x1a, - 0x43, 0x12, 0x02, 0x11, 0x23, 0x1a, 0x43, 0x0a, - 0x62, 0xf9, 0x1d, 0x49, 0x31, 0xff, 0x23, 0x7f, - 0x4a, 0x02, 0x33, 0x13, 0x62, 0x11, 0x60, 0x63, - 0x69, 0x02, 0x22, 0x01, 0x2b, 0x7d, 0x49, 0x74, - 0xd0, 0x02, 0x2b, 0x03, 0xd1, 0xed, 0x09, 0x00, - 0x65, 0x00, 0x2d, 0x23, 0x0b, 0x62, 0x2c, 0x23, - 0x4b, 0x62, 0x7a, 0x4b, 0x7a, 0x4a, 0xf9, 0x1d, - 0x21, 0x31, 0x13, 0x62, 0x11, 0x60, 0x02, 0x22, - 0x78, 0x48, 0xff, 0x21, 0xc2, 0x63, 0x68, 0x48, - 0x09, 0x31, 0x00, 0xe0, 0x75, 0xe0, 0xc1, 0x60, - 0x81, 0x68, 0xff, 0x23, 0x09, 0x33, 0x19, 0x43, - 0x81, 0x60, 0x69, 0x49, 0x08, 0x6a, 0x49, 0x6a, - 0x00, 0x0a, 0xff, 0x23, 0x1b, 0x02, 0x19, 0x40, - 0x08, 0x43, 0x00, 0x09, 0x80, 0x05, 0x80, 0x0d, - 0x5b, 0x49, 0x80, 0x00, 0x40, 0x18, 0xc1, 0x6b, - 0x01, 0x31, 0xc1, 0x63, 0x58, 0x48, 0x82, 0x6b, - 0x41, 0x6b, 0xc0, 0x6a, 0x03, 0x92, 0x00, 0x06, - 0x00, 0x0e, 0x01, 0x90, 0x54, 0x48, 0x02, 0x91, - 0x82, 0x6a, 0x00, 0x21, 0x00, 0x92, 0x00, 0x6a, - 0xc3, 0x68, 0x51, 0x48, 0xc2, 0x69, 0xe8, 0x1c, - 0xfe, 0xf7, 0x8a, 0xfd, 0x60, 0x4b, 0x05, 0x1c, - 0x4d, 0x49, 0xf0, 0x18, 0x0e, 0x69, 0x61, 0x69, - 0x5e, 0x4c, 0x01, 0x29, 0x63, 0xd0, 0x02, 0x29, - 0x22, 0xd1, 0x09, 0x21, 0x01, 0xe0, 0x5f, 0xe0, - 0x62, 0xe0, 0x0a, 0xf0, 0x05, 0xfc, 0xc8, 0x22, - 0x0a, 0xf0, 0x0c, 0xfc, 0x34, 0x22, 0x0a, 0xf0, - 0x09, 0xfc, 0x50, 0x22, 0x0a, 0xf0, 0x06, 0xfc, - 0x0d, 0x22, 0x0a, 0xf0, 0x03, 0xfc, 0x04, 0x22, - 0x0a, 0xf0, 0x00, 0xfc, 0x28, 0x22, 0x0a, 0xf0, - 0xfd, 0xfb, 0xa9, 0x1c, 0x09, 0x02, 0x10, 0x23, - 0x19, 0x43, 0x21, 0x62, 0x42, 0x21, 0x31, 0x43, - 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x61, 0x62, - 0x40, 0x4a, 0x4b, 0x49, 0x0a, 0x62, 0x08, 0x60, - 0x35, 0x48, 0x87, 0x60, 0x41, 0x68, 0x00, 0xe0, - 0x41, 0xe0, 0x02, 0x31, 0x41, 0x60, 0x63, 0x21, - 0x01, 0x63, 0x32, 0x20, 0x0b, 0xf0, 0x7a, 0xf9, - 0xbd, 0xe6, 0x06, 0x21, 0x0a, 0xf0, 0xe6, 0xfb, - 0xed, 0x09, 0x00, 0x66, 0x00, 0xe0, 0xe6, 0xd2, - 0x00, 0x80, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, - 0x23, 0x1a, 0x43, 0x0a, 0x62, 0xec, 0xe6, 0x10, - 0x21, 0x0a, 0xf0, 0xc8, 0xfb, 0xff, 0x22, 0x05, - 0x32, 0x0a, 0xf0, 0xce, 0xfb, 0x46, 0x22, 0x0a, - 0xf0, 0xcb, 0xfb, 0x0d, 0x22, 0x0a, 0xf0, 0xc8, - 0xfb, 0x04, 0x22, 0x0a, 0xf0, 0xc5, 0xfb, 0x28, - 0x22, 0x0a, 0xf0, 0xc2, 0xfb, 0x04, 0x99, 0x02, - 0x31, 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0x25, - 0x49, 0x0a, 0x62, 0x03, 0x9a, 0x82, 0x23, 0x1a, - 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, 0x4a, - 0x62, 0x15, 0xe7, 0x0f, 0xe0, 0x10, 0x21, 0x0a, - 0xf0, 0xa5, 0xfb, 0x2b, 0xe7, 0x80, 0x23, 0x1a, - 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, 0x0a, - 0x62, 0x3b, 0xe7, 0x3d, 0x23, 0x0b, 0x62, 0x3e, - 0x23, 0x4b, 0x62, 0x48, 0xe7, 0x10, 0x21, 0x0a, - 0xf0, 0x95, 0xfb, 0xff, 0x22, 0x05, 0x32, 0x0a, - 0xf0, 0x9b, 0xfb, 0x46, 0x22, 0x0a, 0xf0, 0x98, - 0xfb, 0x0d, 0x22, 0x0a, 0xf0, 0x95, 0xfb, 0x04, - 0x22, 0x0a, 0xf0, 0x92, 0xfb, 0x28, 0x22, 0x0a, - 0xf0, 0x8f, 0xfb, 0xa9, 0x1c, 0x09, 0x02, 0x20, - 0x23, 0x19, 0x43, 0x21, 0x62, 0x82, 0x21, 0x31, - 0x43, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x61, - 0x62, 0x90, 0xe7, 0x00, 0x00, 0xd4, 0x03, 0x04, - 0x20, 0x71, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, - 0xe0, 0x48, 0xe6, 0x03, 0x20, 0x00, 0x52, 0x00, - 0xe0, 0xc0, 0x55, 0x00, 0xe0, 0x10, 0x53, 0x00, - 0xe0, 0xe2, 0x04, 0x00, 0x00, 0x80, 0x55, 0x00, - 0xe0, 0x02, 0x05, 0x00, 0x00, 0x00, 0x53, 0x00, - 0xe0, 0x00, 0x51, 0x00, 0xe0, 0xd0, 0x55, 0x00, - 0xe0, 0x14, 0x53, 0x00, 0xe0, 0xa0, 0x55, 0x00, - 0xe0, 0x02, 0x03, 0x00, 0x00, 0x08, 0x53, 0x00, - 0xe0, 0xd4, 0x13, 0xed, 0x09, 0x00, 0x67, 0x00, - 0x04, 0x20, 0x53, 0x07, 0x00, 0x00, 0x90, 0x55, - 0x00, 0xe0, 0x04, 0x53, 0x00, 0xe0, 0xf0, 0xb5, - 0x87, 0xb0, 0xf0, 0x49, 0x0e, 0x1d, 0x60, 0xce, - 0x40, 0x08, 0x08, 0xd3, 0x4a, 0x6a, 0x09, 0x6a, - 0x01, 0x20, 0xff, 0xf7, 0xe8, 0xfc, 0x07, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe9, 0x49, - 0x08, 0x68, 0x85, 0x42, 0x03, 0xd9, 0x00, 0x20, - 0xfc, 0xf7, 0xd7, 0xf9, 0xf3, 0xe7, 0xe7, 0x48, - 0xe6, 0x4b, 0x01, 0x69, 0xf4, 0x18, 0x61, 0x1a, - 0xc8, 0x29, 0x01, 0xda, 0x01, 0x21, 0x00, 0xe0, - 0x00, 0x21, 0x00, 0x29, 0x06, 0xd0, 0xdf, 0x49, - 0x01, 0x20, 0x4a, 0x6a, 0x09, 0x6a, 0xff, 0xf7, - 0xca, 0xfc, 0xe0, 0xe7, 0xde, 0x48, 0x81, 0x68, - 0xff, 0x23, 0x09, 0x33, 0x99, 0x43, 0x81, 0x60, - 0xdc, 0x4f, 0x20, 0x1c, 0x79, 0x69, 0x01, 0x29, - 0x73, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x09, 0x21, - 0x0a, 0xf0, 0x13, 0xfb, 0xc1, 0x1f, 0xd7, 0x4a, - 0x21, 0x39, 0x91, 0x60, 0xb0, 0x30, 0xd0, 0x60, - 0x32, 0x20, 0x0b, 0xf0, 0xac, 0xf8, 0xcf, 0x48, - 0x82, 0x6b, 0x41, 0x6b, 0x68, 0x1c, 0x06, 0x90, - 0xfe, 0xf7, 0x29, 0xfb, 0x20, 0x23, 0x18, 0x43, - 0xcf, 0x49, 0x00, 0x02, 0x48, 0x60, 0xc9, 0x48, - 0x01, 0x69, 0x7a, 0x69, 0xcd, 0x48, 0x01, 0x2a, - 0x73, 0xd0, 0x02, 0x2a, 0x05, 0xd1, 0x40, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, - 0x01, 0x62, 0xe1, 0x1d, 0x49, 0x31, 0xff, 0x23, - 0xc7, 0x4a, 0x02, 0x33, 0x13, 0x62, 0x11, 0x60, - 0x7a, 0x69, 0xc5, 0x49, 0x01, 0x2a, 0x61, 0xd0, - 0x02, 0x2a, 0x03, 0xd1, 0x2d, 0x22, 0x0a, 0x62, - 0x2c, 0x22, 0x4a, 0x62, 0xe1, 0x1d, 0xc1, 0x4a, - 0xc2, 0x4b, 0x21, 0x31, 0x00, 0x24, 0x1a, 0x62, - 0x19, 0x60, 0xc0, 0x49, 0xcc, 0x63, 0xed, 0x09, - 0x00, 0x68, 0x00, 0x01, 0x68, 0x40, 0x68, 0x09, - 0x0a, 0xff, 0x23, 0x1b, 0x02, 0x18, 0x40, 0x08, - 0x43, 0x00, 0x09, 0x80, 0x05, 0x80, 0x0d, 0xb0, - 0x49, 0x80, 0x00, 0x40, 0x18, 0xc1, 0x6b, 0x01, - 0x31, 0xc1, 0x63, 0xad, 0x48, 0x82, 0x6b, 0x41, - 0x6b, 0xc0, 0x6a, 0x03, 0x92, 0x00, 0x06, 0x00, - 0x0e, 0x01, 0x90, 0xa9, 0x48, 0x02, 0x91, 0x82, - 0x6a, 0x00, 0x92, 0x00, 0x6a, 0xc3, 0x68, 0xa6, - 0x48, 0xc2, 0x69, 0xa8, 0x1c, 0x05, 0x90, 0x00, - 0x21, 0xfe, 0xf7, 0x25, 0xfc, 0x04, 0x90, 0xa2, - 0x48, 0xad, 0x4b, 0xc1, 0x68, 0xf4, 0x18, 0x01, - 0x91, 0x42, 0x69, 0x02, 0x92, 0x81, 0x69, 0x03, - 0x91, 0x78, 0x69, 0x01, 0x28, 0x00, 0xe0, 0xc8, - 0xe0, 0x73, 0xd0, 0x02, 0x28, 0x2f, 0xd1, 0xa6, - 0x49, 0x03, 0x20, 0xc8, 0x62, 0x06, 0x21, 0x20, - 0x1c, 0x0a, 0xf0, 0xab, 0xfa, 0xc8, 0x22, 0x0a, - 0xf0, 0xa0, 0xfa, 0x02, 0x9a, 0x52, 0x00, 0x0a, - 0xf0, 0x9c, 0xfa, 0x28, 0x22, 0x0a, 0xf0, 0x99, - 0xfa, 0x03, 0x22, 0x0a, 0xf0, 0xa6, 0xfa, 0x04, - 0x99, 0x9c, 0x4a, 0x02, 0x31, 0x09, 0x02, 0x10, - 0x23, 0x19, 0x43, 0x11, 0x62, 0x01, 0xe0, 0xac, - 0xe0, 0xb2, 0xe0, 0x01, 0x99, 0xc9, 0x00, 0x44, - 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, - 0x43, 0x51, 0x62, 0x03, 0x99, 0x09, 0x02, 0x16, - 0x23, 0x19, 0x43, 0x91, 0x62, 0x92, 0x49, 0x08, - 0x60, 0x05, 0x20, 0x00, 0x02, 0x08, 0x62, 0x82, - 0x48, 0xc1, 0x68, 0x7a, 0x69, 0x8f, 0x48, 0x01, - 0x2a, 0x73, 0xd0, 0x02, 0x2a, 0x06, 0xd1, 0xc9, - 0x00, 0x40, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, - 0x23, 0x19, 0x43, 0x01, 0x62, 0xe0, 0x1d, 0x5d, - 0x30, 0xff, 0x22, 0x88, 0x49, 0x02, 0x32, 0x0a, - 0x62, 0x08, 0x60, 0x79, 0x69, 0x20, 0x1c, 0x01, - 0x29, 0xed, 0x09, 0x00, 0x69, 0x00, 0x60, 0xd0, - 0x02, 0x29, 0x02, 0xd1, 0x06, 0x21, 0x0a, 0xf0, - 0x63, 0xfa, 0x01, 0x1c, 0x82, 0x48, 0x81, 0x60, - 0x03, 0x21, 0x01, 0x60, 0x01, 0x21, 0x72, 0x48, - 0x89, 0x02, 0xc1, 0x60, 0x81, 0x68, 0x01, 0x23, - 0x9b, 0x02, 0x19, 0x43, 0x81, 0x60, 0x6c, 0x48, - 0x82, 0x6b, 0x41, 0x6b, 0xc0, 0x6a, 0x03, 0x92, - 0x00, 0x06, 0x00, 0x0e, 0x01, 0x90, 0x68, 0x48, - 0x02, 0x91, 0x82, 0x6a, 0x00, 0x21, 0x00, 0x92, - 0x00, 0x6a, 0xc3, 0x68, 0x64, 0x48, 0xc2, 0x69, - 0xe8, 0x1c, 0xfe, 0xf7, 0xa3, 0xfb, 0x00, 0xe0, - 0x62, 0xe0, 0x04, 0x90, 0x71, 0x4b, 0x60, 0x49, - 0xf0, 0x18, 0x4e, 0x69, 0xcd, 0x68, 0x89, 0x69, - 0x03, 0x91, 0x79, 0x69, 0x6e, 0x4f, 0x01, 0x29, - 0x74, 0xd0, 0x02, 0x29, 0x2a, 0xd1, 0x03, 0x21, - 0xf9, 0x62, 0x06, 0x21, 0x0a, 0xf0, 0x2c, 0xfa, - 0xc8, 0x22, 0x0a, 0xf0, 0x21, 0xfa, 0x72, 0x00, - 0x0a, 0xf0, 0x1e, 0xfa, 0x28, 0x22, 0x0a, 0xf0, - 0x1b, 0xfa, 0x03, 0x22, 0x0a, 0xf0, 0x28, 0xfa, - 0x04, 0x99, 0x02, 0x31, 0x09, 0x02, 0x10, 0x23, - 0x19, 0x43, 0x39, 0x62, 0xe9, 0x00, 0x44, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, - 0x79, 0x62, 0x03, 0x99, 0x09, 0x02, 0x16, 0x23, - 0x19, 0x43, 0xb9, 0x62, 0x5b, 0x49, 0x08, 0x60, - 0x05, 0x20, 0x00, 0x02, 0x08, 0x62, 0x01, 0xe0, - 0x57, 0xe0, 0x5e, 0xe0, 0x44, 0x4f, 0xf8, 0x6a, - 0x79, 0x6b, 0xba, 0x6b, 0x00, 0x06, 0x00, 0x0e, - 0x01, 0x90, 0x02, 0x91, 0x03, 0x92, 0xba, 0x6a, - 0x10, 0x23, 0x00, 0x92, 0xfa, 0x69, 0x05, 0x98, - 0x06, 0x99, 0xfe, 0xf7, 0x57, 0xfb, 0x38, 0x63, - 0xbc, 0x60, 0x78, 0x68, 0x02, 0x30, 0x78, 0x60, - 0x32, 0x20, 0x0a, 0xf0, 0x7d, 0xff, 0x97, 0xe6, - 0x10, 0x21, 0x0a, 0xf0, 0xed, 0x09, 0x00, 0x6a, - 0x00, 0xd7, 0xf9, 0xc2, 0xe6, 0x80, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x01, - 0x62, 0xde, 0xe6, 0x3d, 0x22, 0x0a, 0x62, 0x3e, - 0x22, 0x4a, 0x62, 0xea, 0xe6, 0x06, 0x21, 0x20, - 0x1c, 0x0a, 0xf0, 0xd8, 0xf9, 0xff, 0x22, 0x05, - 0x32, 0x0a, 0xf0, 0xcc, 0xf9, 0x02, 0x9a, 0x52, - 0x00, 0x0a, 0xf0, 0xc8, 0xf9, 0x28, 0x22, 0x0a, - 0xf0, 0xc5, 0xf9, 0x03, 0x22, 0x0a, 0xf0, 0xd2, - 0xf9, 0x04, 0x99, 0x02, 0x31, 0x09, 0x02, 0x20, - 0x22, 0x0a, 0x43, 0x30, 0x49, 0x0a, 0x62, 0x01, - 0x9a, 0xd2, 0x00, 0x84, 0x23, 0x1a, 0x43, 0x00, - 0xe0, 0x19, 0xe0, 0x12, 0x02, 0x10, 0x23, 0x1a, - 0x43, 0x4a, 0x62, 0x03, 0x9a, 0x12, 0x02, 0x19, - 0x23, 0x1a, 0x43, 0x8a, 0x62, 0x28, 0x49, 0x08, - 0x60, 0x2e, 0x48, 0x08, 0x62, 0x2c, 0xe7, 0xc9, - 0x00, 0x80, 0x23, 0x19, 0x43, 0x09, 0x02, 0x10, - 0x23, 0x19, 0x43, 0x01, 0x62, 0x33, 0xe7, 0x06, - 0x21, 0x0a, 0xf0, 0xa4, 0xf9, 0x3f, 0xe7, 0x06, - 0x21, 0x0a, 0xf0, 0xa0, 0xf9, 0xff, 0x22, 0x05, - 0x32, 0x0a, 0xf0, 0x94, 0xf9, 0x72, 0x00, 0x0a, - 0xf0, 0x91, 0xf9, 0x28, 0x22, 0x0a, 0xf0, 0x8e, - 0xf9, 0x03, 0x22, 0x0a, 0xf0, 0x9b, 0xf9, 0x04, - 0x99, 0x02, 0x31, 0x09, 0x02, 0x20, 0x23, 0x19, - 0x43, 0x39, 0x62, 0xe9, 0x00, 0x84, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x79, - 0x62, 0x03, 0x99, 0x09, 0x02, 0x19, 0x23, 0x19, - 0x43, 0xb9, 0x62, 0x15, 0x49, 0x08, 0x60, 0x15, - 0x48, 0x08, 0x62, 0x75, 0xe7, 0xd4, 0x03, 0x04, - 0x20, 0x71, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, - 0xe0, 0x48, 0xe6, 0x03, 0x20, 0x00, 0x51, 0x00, - 0xe0, 0xc0, 0x55, 0x00, 0xe0, 0x10, 0x53, 0x00, - 0xe0, 0x80, 0x55, 0x00, 0xe0, 0x02, 0x03, 0xed, - 0x09, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x53, - 0x00, 0xe0, 0xd4, 0x13, 0x04, 0x20, 0xe2, 0x04, - 0x00, 0x00, 0xa0, 0x55, 0x00, 0xe0, 0x08, 0x53, - 0x00, 0xe0, 0xd0, 0x55, 0x00, 0xe0, 0x14, 0x53, - 0x00, 0xe0, 0x00, 0x52, 0x00, 0xe0, 0x53, 0x07, - 0x00, 0x00, 0xb0, 0x55, 0x00, 0xe0, 0x0c, 0x53, - 0x00, 0xe0, 0x03, 0x05, 0x00, 0x00, 0xf0, 0xb5, - 0x07, 0x1c, 0xfa, 0xf7, 0x83, 0xf8, 0x04, 0x1c, - 0x00, 0x28, 0x22, 0x4d, 0x19, 0xd0, 0x00, 0x21, - 0x38, 0x1c, 0xfd, 0xf7, 0x06, 0xfd, 0x07, 0x1c, - 0x10, 0xd0, 0xf8, 0x68, 0x02, 0x28, 0x18, 0xd0, - 0xf8, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, - 0x6c, 0xf8, 0x00, 0x26, 0xbe, 0x61, 0xfe, 0x61, - 0x38, 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, - 0x64, 0xf8, 0x3e, 0x63, 0x20, 0x1c, 0xfa, 0xf7, - 0xa0, 0xf8, 0x29, 0x6a, 0x6a, 0x6a, 0x01, 0x20, - 0xff, 0xf7, 0xbf, 0xfa, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0x23, 0x1b, 0x03, 0xe8, 0x18, - 0xc0, 0x6b, 0x0f, 0x4b, 0x00, 0x01, 0xc1, 0x18, - 0x08, 0x6a, 0x49, 0x6a, 0x00, 0x0a, 0xff, 0x23, - 0x1b, 0x02, 0x19, 0x40, 0x01, 0x43, 0x01, 0x20, - 0x2a, 0x69, 0x00, 0x04, 0x00, 0x2a, 0x00, 0xd1, - 0x00, 0x20, 0x08, 0x43, 0xb8, 0x64, 0x35, 0x20, - 0x20, 0x60, 0x28, 0x6a, 0x40, 0x68, 0xe0, 0x60, - 0x0e, 0x20, 0x21, 0x1c, 0x27, 0x61, 0xfa, 0xf7, - 0xac, 0xf8, 0xd6, 0xe7, 0x00, 0x00, 0xd4, 0x03, - 0x04, 0x20, 0x80, 0x55, 0x00, 0xe0, 0x00, 0xb5, - 0x04, 0x48, 0x01, 0x6a, 0x42, 0x6a, 0x01, 0x20, - 0xff, 0xf7, 0x8f, 0xfa, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xd4, 0x03, 0x04, 0x20, 0xf1, 0xb5, - 0x8c, 0xb0, 0xfa, 0x48, 0x00, 0x21, 0x04, 0x6a, - 0x06, 0x91, 0x0c, 0x99, 0xcb, 0x07, 0xdb, 0x0f, - 0x0f, 0x22, 0xed, 0x09, 0x00, 0x6c, 0x00, 0x17, - 0x21, 0x00, 0x2b, 0x1a, 0xd0, 0xe3, 0x68, 0x9f, - 0x1a, 0x0b, 0x2f, 0x0d, 0xd2, 0x02, 0xa3, 0xdb, - 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x08, - 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x06, - 0x06, 0x06, 0x00, 0xe1, 0x60, 0x00, 0xe0, 0xe2, - 0x60, 0x42, 0x6a, 0x01, 0x20, 0x21, 0x1c, 0xff, - 0xf7, 0x66, 0xfa, 0x0d, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xff, 0x23, 0x0c, 0x9f, 0x09, - 0x33, 0x3b, 0x40, 0xe6, 0x4f, 0x10, 0x26, 0xfd, - 0x1d, 0xb9, 0x35, 0x00, 0x2b, 0x39, 0xd0, 0x00, - 0x23, 0x05, 0x93, 0xe3, 0x68, 0x10, 0x2b, 0x06, - 0xd0, 0x11, 0x2b, 0x1b, 0xd0, 0x18, 0x2b, 0x02, - 0xd0, 0x19, 0x2b, 0x17, 0xd0, 0xe5, 0xe7, 0xa3, - 0x6c, 0x01, 0x33, 0xa3, 0x64, 0xa3, 0x6c, 0x04, - 0x2b, 0x71, 0xd9, 0xe3, 0x68, 0x10, 0x2b, 0x03, - 0xd1, 0x61, 0x6f, 0x8a, 0x62, 0xe2, 0x60, 0x02, - 0xe0, 0x62, 0x6f, 0x91, 0x62, 0xe1, 0x60, 0x40, - 0x6a, 0x06, 0xf0, 0x29, 0xfb, 0x02, 0x20, 0xfb, - 0xf7, 0x30, 0xff, 0xce, 0xe7, 0xe3, 0x6c, 0x01, - 0x33, 0xe3, 0x64, 0xe3, 0x6c, 0x10, 0x2b, 0x5a, - 0xd9, 0xe3, 0x68, 0x11, 0x2b, 0x03, 0xd1, 0x61, - 0x6f, 0x8a, 0x62, 0xe2, 0x60, 0x02, 0xe0, 0x62, - 0x6f, 0x91, 0x62, 0xe1, 0x60, 0x40, 0x6a, 0x06, - 0xf0, 0x12, 0xfb, 0x02, 0x20, 0xfb, 0xf7, 0x19, - 0xff, 0xb7, 0xe7, 0x0c, 0x99, 0x49, 0x09, 0x52, - 0xd3, 0x01, 0x23, 0x05, 0x93, 0xe2, 0x68, 0x05, - 0x21, 0x0f, 0x2a, 0x06, 0xd0, 0x10, 0x2a, 0x22, - 0xd0, 0x17, 0x2a, 0x02, 0xd0, 0x18, 0x2a, 0x1e, - 0xd0, 0xa7, 0xe7, 0x00, 0x22, 0xa2, 0x64, 0xe2, - 0x64, 0xe2, 0x68, 0x17, 0x2a, 0x04, 0xd1, 0x63, - 0x6f, 0x18, 0x22, 0x9a, 0x62, 0xe2, 0x60, 0x02, - 0xe0, 0x62, 0x6f, 0x96, 0x62, 0xed, 0x09, 0x00, - 0x6d, 0x00, 0xe6, 0x60, 0xaa, 0x6a, 0x00, 0x2a, - 0x00, 0xd1, 0x01, 0x21, 0xb6, 0x4a, 0x11, 0x60, - 0x01, 0x6b, 0x63, 0x29, 0x03, 0xd0, 0x41, 0x68, - 0x01, 0x39, 0x61, 0x64, 0x2c, 0xe0, 0x41, 0x68, - 0x61, 0x64, 0x29, 0xe0, 0x63, 0x6f, 0x11, 0x22, - 0x9a, 0x62, 0xe2, 0x60, 0xaa, 0x6a, 0x00, 0x2a, - 0x00, 0xd1, 0x01, 0x21, 0xad, 0x4a, 0x11, 0x60, - 0x2f, 0x22, 0xad, 0x49, 0x12, 0x01, 0xca, 0x60, - 0x8a, 0x68, 0x17, 0x23, 0x5b, 0x01, 0x1a, 0x43, - 0x8a, 0x60, 0x8a, 0x68, 0x10, 0x23, 0x9a, 0x43, - 0x8a, 0x60, 0xff, 0x37, 0x01, 0x37, 0x39, 0x1c, - 0xa6, 0x4e, 0x00, 0xe0, 0x0c, 0xe0, 0x0c, 0xcf, - 0x0c, 0xc6, 0x0e, 0x1c, 0x0c, 0xce, 0xa4, 0x4f, - 0x0c, 0xc7, 0x48, 0xc9, 0xe7, 0x1d, 0x35, 0x37, - 0x48, 0xc7, 0x01, 0xe0, 0x00, 0x23, 0x05, 0x93, - 0x01, 0x23, 0x1b, 0x03, 0xc1, 0x18, 0x0b, 0x91, - 0xc9, 0x6b, 0x9e, 0x4b, 0x09, 0x01, 0xcb, 0x18, - 0x02, 0x69, 0x19, 0x6a, 0x5f, 0x6a, 0x09, 0x0a, - 0xff, 0x23, 0x1b, 0x02, 0x3b, 0x40, 0x19, 0x43, - 0x01, 0x27, 0x6b, 0x69, 0x3f, 0x04, 0x01, 0x2b, - 0x20, 0xd0, 0x02, 0x2b, 0x06, 0xd1, 0x0a, 0x0c, - 0x00, 0xd2, 0x00, 0x27, 0x39, 0x43, 0x01, 0x23, - 0xdb, 0x03, 0x99, 0x43, 0x41, 0x23, 0x9b, 0x01, - 0xc2, 0x18, 0x0a, 0x92, 0x04, 0x91, 0x11, 0x68, - 0x4a, 0x04, 0x04, 0x99, 0x52, 0x0c, 0x49, 0x04, - 0x49, 0x0c, 0x8a, 0x42, 0x02, 0xd2, 0x04, 0x99, - 0x0a, 0x9a, 0x11, 0x60, 0x82, 0x48, 0x07, 0x6b, - 0x63, 0x2f, 0x08, 0xd0, 0x81, 0x68, 0x09, 0x91, - 0x46, 0x68, 0x36, 0xe0, 0x00, 0x2a, 0x00, 0xd1, - 0x00, 0x27, 0x39, 0x43, 0xe2, 0xe7, 0x7c, 0x4f, - 0x83, 0x4b, 0xb8, 0x68, 0xc0, 0x18, 0x09, 0x90, - 0x78, 0x68, 0xe3, 0x68, 0x86, 0x1c, 0x10, 0x2b, - 0xed, 0x09, 0x00, 0x6e, 0x00, 0x06, 0xd0, 0x11, - 0x2b, 0x15, 0xd0, 0x18, 0x2b, 0x02, 0xd0, 0x19, - 0x2b, 0x11, 0xd0, 0x13, 0xe7, 0xf8, 0x6a, 0x79, - 0x6b, 0xba, 0x6b, 0x00, 0x06, 0x00, 0x0e, 0x01, - 0x90, 0x02, 0x91, 0x03, 0x92, 0xba, 0x6a, 0x30, - 0x1c, 0x00, 0x92, 0xfa, 0x69, 0x61, 0x6c, 0xfe, - 0xf7, 0x39, 0xf9, 0x07, 0x1c, 0x0f, 0xe0, 0x79, - 0x6b, 0xba, 0x6b, 0xaf, 0x6b, 0x03, 0x92, 0x38, - 0x0e, 0x3a, 0x02, 0x12, 0x0a, 0x00, 0x92, 0x02, - 0x91, 0x00, 0x21, 0x00, 0x22, 0x01, 0x90, 0x30, - 0x1c, 0xfe, 0xf7, 0x28, 0xf9, 0x07, 0x1c, 0x09, - 0x98, 0x6a, 0x4b, 0x09, 0x99, 0xc0, 0x18, 0x08, - 0x90, 0xb0, 0x1c, 0x07, 0x90, 0x5f, 0x48, 0xc2, - 0x68, 0x01, 0x92, 0x42, 0x69, 0x02, 0x92, 0x82, - 0x69, 0x03, 0x20, 0x03, 0x92, 0x6a, 0x69, 0x01, - 0x2a, 0x34, 0xd0, 0x02, 0x2a, 0x2b, 0xd1, 0x60, - 0x4a, 0xd0, 0x62, 0x08, 0x1c, 0x06, 0x21, 0x09, - 0xf0, 0xab, 0xff, 0xc8, 0x22, 0x09, 0xf0, 0xa0, - 0xff, 0x02, 0x9a, 0x52, 0x00, 0x09, 0xf0, 0x9c, - 0xff, 0x28, 0x22, 0x09, 0xf0, 0x99, 0xff, 0x03, - 0x22, 0x09, 0xf0, 0xa6, 0xff, 0xb9, 0x1c, 0x09, - 0x02, 0x10, 0x23, 0x55, 0x4a, 0x19, 0x43, 0x11, - 0x62, 0x01, 0x99, 0xc9, 0x00, 0x44, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x51, - 0x62, 0x03, 0x9a, 0x11, 0x02, 0x16, 0x23, 0x4e, - 0x4a, 0x19, 0x43, 0x91, 0x62, 0x4e, 0x49, 0x08, - 0x60, 0x05, 0x20, 0x00, 0x02, 0x08, 0x62, 0x09, - 0x98, 0xa9, 0x6a, 0x00, 0x29, 0x2c, 0xd0, 0x05, - 0x21, 0x03, 0x91, 0x2b, 0xe0, 0x08, 0x1c, 0x06, - 0x21, 0x09, 0xf0, 0x7a, 0xff, 0xff, 0x22, 0x05, - 0x32, 0x09, 0xf0, 0x6e, 0xff, 0x02, 0x9a, 0x52, - 0x00, 0x09, 0xf0, 0x6a, 0xff, 0x28, 0x22, 0x09, - 0xf0, 0x67, 0xff, 0xed, 0x09, 0x00, 0x6f, 0x00, - 0x03, 0x22, 0x09, 0xf0, 0x74, 0xff, 0xb9, 0x1c, - 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0x3b, 0x49, - 0x0a, 0x62, 0x01, 0x9a, 0xd2, 0x00, 0x84, 0x23, - 0x1a, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, - 0x4a, 0x62, 0x03, 0x9a, 0x12, 0x02, 0x19, 0x23, - 0x1a, 0x43, 0x8a, 0x62, 0x36, 0x49, 0x08, 0x60, - 0x36, 0x48, 0x08, 0x62, 0xce, 0xe7, 0x01, 0x21, - 0x03, 0x91, 0x69, 0x69, 0x01, 0x29, 0x14, 0xd0, - 0x02, 0x29, 0x02, 0xd1, 0x06, 0x21, 0x09, 0xf0, - 0x4a, 0xff, 0x01, 0x1c, 0x27, 0x48, 0x81, 0x60, - 0x00, 0x21, 0x03, 0x99, 0x01, 0x60, 0xe0, 0x68, - 0x10, 0x28, 0x0e, 0xd0, 0x11, 0x28, 0x25, 0xd0, - 0x18, 0x28, 0x0a, 0xd0, 0x19, 0x28, 0x21, 0xd0, - 0x67, 0xe6, 0x06, 0x21, 0x09, 0xf0, 0x37, 0xff, - 0x01, 0xaa, 0x03, 0xc2, 0x01, 0x98, 0x02, 0x99, - 0xe7, 0xe7, 0x19, 0x49, 0x30, 0x1c, 0x4a, 0x6b, - 0x61, 0x6c, 0xfd, 0xf7, 0x87, 0xff, 0x16, 0x49, - 0x20, 0x23, 0x18, 0x43, 0xc9, 0x6a, 0x00, 0x02, - 0x08, 0x43, 0x15, 0x49, 0x48, 0x60, 0xb1, 0x08, - 0xe0, 0x1d, 0xb9, 0x30, 0x81, 0x62, 0x00, 0x21, - 0xe2, 0x1d, 0xf9, 0x32, 0x91, 0x61, 0xfd, 0xf7, - 0x80, 0xfc, 0x30, 0xe0, 0xa8, 0x6b, 0x00, 0x0e, - 0x71, 0x08, 0x09, 0x02, 0x08, 0x43, 0x0c, 0x49, - 0x48, 0x60, 0xa8, 0x6b, 0x07, 0x99, 0x00, 0x0e, - 0x49, 0x08, 0x09, 0x02, 0x08, 0x43, 0x09, 0x49, - 0x48, 0x60, 0xe0, 0x1d, 0xff, 0x30, 0x3a, 0x30, - 0x00, 0x21, 0x81, 0x63, 0xe0, 0x1d, 0xff, 0x30, - 0x1a, 0x30, 0xfd, 0xf7, 0x66, 0xfc, 0x16, 0xe0, - 0x00, 0x00, 0xd4, 0x03, 0x04, 0x20, 0x88, 0xe5, - 0x03, 0x20, 0x00, 0x52, 0x00, 0xe0, 0x00, 0x51, - 0x00, 0xe0, 0x00, 0x50, 0x00, 0xe0, 0x90, 0x57, - 0x00, 0xe0, 0x20, 0x51, 0x00, 0xe0, 0xed, 0x09, - 0x00, 0x70, 0x00, 0x80, 0x55, 0x00, 0xe0, 0xe2, - 0x04, 0x00, 0x00, 0x00, 0x53, 0x00, 0xe0, 0x03, - 0x05, 0x00, 0x00, 0x94, 0x4e, 0x09, 0x98, 0xf2, - 0x68, 0x6b, 0x69, 0x93, 0x49, 0x01, 0x2b, 0x73, - 0xd0, 0x02, 0x2b, 0x06, 0xd1, 0xd2, 0x00, 0x40, - 0x23, 0x1a, 0x43, 0x12, 0x02, 0x11, 0x23, 0x1a, - 0x43, 0x0a, 0x62, 0xff, 0x22, 0x64, 0x30, 0x8d, - 0x49, 0x02, 0x32, 0x0a, 0x62, 0x08, 0x60, 0x05, - 0x98, 0x01, 0x28, 0x0e, 0xd1, 0x00, 0x21, 0x0c, - 0x98, 0xfd, 0xf7, 0x8b, 0xfa, 0xe1, 0x1d, 0x65, - 0x31, 0x06, 0x90, 0x0c, 0xc9, 0x0c, 0xc0, 0x06, - 0x98, 0x04, 0x99, 0x81, 0x64, 0x0a, 0x9a, 0x00, - 0x21, 0x11, 0x60, 0xe0, 0x68, 0x10, 0x28, 0x73, - 0xd0, 0x11, 0x28, 0x03, 0xd0, 0x18, 0x28, 0x6f, - 0xd0, 0x19, 0x28, 0x11, 0xd1, 0x71, 0x6b, 0xb2, - 0x6b, 0xab, 0x6b, 0x03, 0x92, 0x18, 0x0e, 0x1a, - 0x02, 0x12, 0x0a, 0x00, 0x92, 0x01, 0x90, 0x02, - 0x91, 0x30, 0x6a, 0xf2, 0x69, 0xc3, 0x68, 0x61, - 0x6c, 0x07, 0x98, 0xfe, 0xf7, 0x08, 0xf8, 0x07, - 0x1c, 0x08, 0x98, 0x34, 0x69, 0x69, 0x69, 0x01, - 0x29, 0x73, 0xd0, 0x02, 0x29, 0x20, 0xd1, 0x09, - 0x21, 0x09, 0xf0, 0x89, 0xfe, 0xc8, 0x22, 0x09, - 0xf0, 0x90, 0xfe, 0x34, 0x22, 0x09, 0xf0, 0x8d, - 0xfe, 0x50, 0x22, 0x09, 0xf0, 0x8a, 0xfe, 0x0d, - 0x22, 0x09, 0xf0, 0x87, 0xfe, 0x04, 0x22, 0x09, - 0xf0, 0x84, 0xfe, 0x28, 0x22, 0x09, 0xf0, 0x81, - 0xfe, 0xb9, 0x1c, 0x09, 0x02, 0x10, 0x22, 0x0a, - 0x43, 0x66, 0x49, 0x0a, 0x62, 0x42, 0x22, 0x22, - 0x43, 0x12, 0x02, 0x11, 0x23, 0x1a, 0x43, 0x4a, - 0x62, 0x63, 0x4a, 0x63, 0x49, 0x0a, 0x62, 0x08, - 0x60, 0x08, 0x98, 0x32, 0x69, 0x6b, 0x69, 0x61, - 0x49, 0x01, 0x2b, 0x60, 0xd0, 0x02, 0x2b, 0x07, - 0xd1, 0xed, 0x09, 0x00, 0x71, 0x00, 0x40, 0x23, - 0x1a, 0x43, 0x12, 0x02, 0x00, 0xe0, 0x5a, 0xe0, - 0x11, 0x23, 0x1a, 0x43, 0x0a, 0x62, 0xff, 0x22, - 0x50, 0x30, 0x5b, 0x49, 0x02, 0x32, 0x0a, 0x62, - 0x08, 0x60, 0x08, 0x9a, 0x69, 0x69, 0x59, 0x48, - 0x01, 0x29, 0x67, 0xd0, 0x02, 0x29, 0x03, 0xd1, - 0x2d, 0x21, 0x01, 0x62, 0x2c, 0x21, 0x41, 0x62, - 0xd0, 0x1d, 0x56, 0x4a, 0x54, 0x49, 0x21, 0x30, - 0x04, 0x23, 0x11, 0x62, 0x10, 0x60, 0x0b, 0x99, - 0xcb, 0x63, 0x08, 0x98, 0x69, 0x69, 0x01, 0x29, - 0x74, 0xd0, 0x02, 0x29, 0x00, 0xe0, 0x3e, 0xe0, - 0x02, 0xd1, 0x09, 0x21, 0x09, 0xf0, 0x32, 0xfe, - 0xc1, 0x1f, 0x4d, 0x4a, 0x21, 0x39, 0x91, 0x60, - 0xb0, 0x30, 0xd0, 0x60, 0x32, 0x20, 0x0a, 0xf0, - 0xcb, 0xfb, 0xa1, 0x20, 0x49, 0x49, 0xc0, 0x00, - 0xc8, 0x60, 0x88, 0x68, 0x01, 0x23, 0x9b, 0x02, - 0x98, 0x43, 0x88, 0x60, 0x88, 0x68, 0xff, 0x23, - 0x09, 0x33, 0x18, 0x43, 0x88, 0x60, 0x00, 0xe0, - 0x35, 0xe0, 0x63, 0x20, 0x30, 0x63, 0x08, 0x98, - 0xb0, 0x60, 0x07, 0x98, 0x70, 0x60, 0x06, 0x98, - 0x00, 0x28, 0x61, 0xd0, 0xf9, 0xf7, 0x55, 0xfd, - 0x00, 0x28, 0x5a, 0xd0, 0x35, 0x21, 0x01, 0x60, - 0x31, 0x6a, 0x49, 0x68, 0xc1, 0x60, 0x06, 0x99, - 0x01, 0x61, 0x01, 0x1c, 0x0e, 0x20, 0xf9, 0xf7, - 0xb7, 0xfd, 0x51, 0xe0, 0x3d, 0xe0, 0xd2, 0x00, - 0x80, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, 0x23, - 0x1a, 0x43, 0x0a, 0x62, 0x30, 0xe7, 0xf0, 0x6a, - 0x71, 0x6b, 0xb2, 0x6b, 0x00, 0x06, 0x00, 0x0e, - 0x01, 0x90, 0x02, 0x91, 0x03, 0x92, 0xb2, 0x6a, - 0x00, 0x92, 0x30, 0x6a, 0xf2, 0x69, 0xc3, 0x68, - 0x61, 0x6c, 0x07, 0x98, 0xfd, 0xf7, 0x5a, 0xff, - 0x07, 0x1c, 0x50, 0xe7, 0x28, 0xe0, 0x10, 0x21, - 0x09, 0xf0, 0xe0, 0xfd, 0xed, 0x09, 0x00, 0x72, - 0x00, 0xff, 0x22, 0x05, 0x32, 0x09, 0xf0, 0xe6, - 0xfd, 0x46, 0x22, 0x09, 0xf0, 0xe3, 0xfd, 0x0d, - 0x22, 0x09, 0xf0, 0xe0, 0xfd, 0x04, 0x22, 0x09, - 0xf0, 0xdd, 0xfd, 0x28, 0x22, 0x09, 0xf0, 0xda, - 0xfd, 0xb9, 0x1c, 0x09, 0x02, 0x20, 0x22, 0x0a, - 0x43, 0x12, 0x49, 0x0a, 0x62, 0x82, 0x22, 0x22, - 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, 0x00, - 0xe0, 0x0d, 0xe0, 0x4a, 0x62, 0x55, 0xe7, 0x80, - 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, - 0x43, 0x0a, 0x62, 0x62, 0xe7, 0x3d, 0x21, 0x01, - 0x62, 0x3e, 0x21, 0x41, 0x62, 0x6e, 0xe7, 0x10, - 0x21, 0x09, 0xf0, 0xb2, 0xfd, 0x7e, 0xe7, 0x06, - 0x98, 0xf9, 0xf7, 0x56, 0xfd, 0xec, 0xe4, 0x00, - 0x00, 0xd4, 0x03, 0x04, 0x20, 0x90, 0x55, 0x00, - 0xe0, 0x04, 0x53, 0x00, 0xe0, 0xa0, 0x55, 0x00, - 0xe0, 0x02, 0x05, 0x00, 0x00, 0x08, 0x53, 0x00, - 0xe0, 0xb0, 0x55, 0x00, 0xe0, 0x0c, 0x53, 0x00, - 0xe0, 0xc0, 0x55, 0x00, 0xe0, 0x02, 0x03, 0x00, - 0x00, 0x10, 0x53, 0x00, 0xe0, 0x00, 0x51, 0x00, - 0xe0, 0x00, 0x50, 0x00, 0xe0, 0xf0, 0xb5, 0x84, - 0xb0, 0x2a, 0x4e, 0x04, 0x1c, 0x75, 0x6a, 0xf9, - 0xf7, 0xd2, 0xfc, 0x07, 0x1c, 0x06, 0xd1, 0x08, - 0x20, 0xff, 0xf7, 0xa2, 0xfc, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x21, 0x20, - 0x1c, 0xfd, 0xf7, 0x50, 0xf9, 0x04, 0x1c, 0x06, - 0xd1, 0x38, 0x1c, 0xf9, 0xf7, 0xfb, 0xfc, 0x08, - 0x20, 0xff, 0xf7, 0x92, 0xfc, 0xee, 0xe7, 0xe9, - 0x1d, 0x30, 0x69, 0xb9, 0x31, 0x88, 0x60, 0xf0, - 0x68, 0x05, 0x22, 0xc8, 0x60, 0x70, 0x69, 0x08, - 0x61, 0x19, 0x48, 0x40, 0x68, 0x88, 0x61, 0x00, - 0x20, 0x48, 0x62, 0xea, 0x60, 0xe8, 0x64, 0x28, - 0x65, 0x68, 0x65, 0xa8, 0x65, 0xe8, 0x65, 0xed, - 0x09, 0x00, 0x73, 0x00, 0x28, 0x66, 0xa8, 0x66, - 0x68, 0x67, 0xea, 0x1d, 0x79, 0x32, 0xa8, 0x67, - 0x50, 0x60, 0xd0, 0x60, 0x28, 0x64, 0x68, 0x64, - 0x88, 0x63, 0x28, 0x1c, 0x05, 0xf0, 0x10, 0xfd, - 0x35, 0x20, 0x38, 0x60, 0x30, 0x6a, 0x40, 0x68, - 0xf8, 0x60, 0x0e, 0x20, 0x39, 0x1c, 0x3c, 0x61, - 0xf9, 0xf7, 0xff, 0xfc, 0x00, 0x22, 0x03, 0x92, - 0x02, 0x22, 0x01, 0x21, 0x1a, 0x20, 0x01, 0x90, - 0x02, 0x91, 0x00, 0x92, 0x30, 0x6a, 0x04, 0x23, - 0x01, 0x1c, 0x2a, 0x1c, 0xfb, 0xf7, 0x51, 0xfa, - 0xb3, 0xe7, 0xd4, 0x03, 0x04, 0x20, 0x88, 0xe5, - 0x03, 0x20, 0xf0, 0xb5, 0x82, 0xb0, 0x14, 0x1c, - 0x0f, 0x1c, 0x2e, 0xf0, 0xd2, 0xfa, 0x39, 0x4e, - 0x3a, 0x4d, 0x37, 0x61, 0xe0, 0x68, 0x05, 0x28, - 0x08, 0xd0, 0x03, 0x28, 0x06, 0xd0, 0x20, 0x1c, - 0x00, 0xf0, 0xd7, 0xf8, 0x70, 0x61, 0xa9, 0x69, - 0x48, 0x62, 0x00, 0xe0, 0x74, 0x61, 0xe0, 0x1d, - 0xf9, 0x30, 0x00, 0x21, 0x30, 0x4e, 0x01, 0x63, - 0x70, 0x69, 0xb0, 0x61, 0x38, 0x1c, 0xfc, 0xf7, - 0xd0, 0xff, 0x2d, 0x23, 0x9b, 0x01, 0xf9, 0x18, - 0x88, 0x60, 0x00, 0x2c, 0x04, 0xd0, 0x60, 0x6f, - 0x00, 0x28, 0x01, 0xd0, 0x00, 0x21, 0x81, 0x65, - 0xe8, 0x1d, 0xb9, 0x30, 0x42, 0x69, 0xe0, 0x1d, - 0xb9, 0x30, 0x01, 0x2a, 0x26, 0x49, 0x43, 0xd0, - 0x02, 0x2a, 0x01, 0xd1, 0x01, 0x22, 0xca, 0x60, - 0xfd, 0x1d, 0x51, 0x35, 0x29, 0x1c, 0x0c, 0xcd, - 0x22, 0x4e, 0x22, 0x4d, 0x0c, 0xc6, 0x48, 0xc9, - 0x48, 0xc5, 0x80, 0x6b, 0x00, 0x28, 0x0a, 0xd0, - 0xe1, 0x1d, 0xe1, 0x31, 0x6c, 0xc9, 0x1e, 0x48, - 0x6c, 0xc0, 0x61, 0x68, 0x1e, 0x48, 0xff, 0x31, - 0x89, 0x31, 0x60, 0xc9, 0x60, 0xc0, 0x6a, 0x46, - 0x00, 0x21, 0x01, 0x20, 0x3b, 0x1c, 0xfc, 0xf7, - 0xfa, 0xfe, 0xed, 0x09, 0x00, 0x74, 0x00, 0x05, - 0x1c, 0x01, 0x99, 0x00, 0x9c, 0x78, 0x6d, 0x17, - 0x4a, 0x10, 0x4f, 0x42, 0x43, 0xfe, 0x1d, 0x01, - 0x36, 0x00, 0x23, 0xa0, 0x18, 0x59, 0x41, 0x03, - 0xc6, 0x7c, 0x60, 0x13, 0x48, 0x3d, 0x60, 0x01, - 0x22, 0x02, 0x60, 0x13, 0x48, 0x12, 0x49, 0xc1, - 0x60, 0x81, 0x68, 0xfb, 0x23, 0x9b, 0x00, 0x19, - 0x43, 0x81, 0x60, 0x80, 0x04, 0x00, 0xf0, 0xb7, - 0xf8, 0x2e, 0xf0, 0x61, 0xfa, 0x02, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x02, 0x69, 0xca, - 0x60, 0xbc, 0xe7, 0x68, 0x14, 0x04, 0x20, 0x88, - 0xe5, 0x03, 0x20, 0x00, 0x52, 0x00, 0xe0, 0x20, - 0x51, 0x00, 0xe0, 0x90, 0x57, 0x00, 0xe0, 0xa0, - 0x57, 0x00, 0xe0, 0xb0, 0x57, 0x00, 0xe0, 0x71, - 0x02, 0x00, 0x00, 0x24, 0x7e, 0x03, 0x20, 0xfc, - 0x07, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, 0x80, - 0xb4, 0x09, 0x49, 0x49, 0x69, 0x81, 0x42, 0x0c, - 0xd1, 0xc7, 0x1d, 0xe1, 0x37, 0x0c, 0xcf, 0x06, - 0x49, 0x0c, 0xc1, 0x0c, 0xcf, 0x0c, 0xc1, 0x40, - 0x68, 0x05, 0x49, 0xff, 0x30, 0x89, 0x30, 0x88, - 0xc8, 0x88, 0xc1, 0x80, 0xbc, 0x70, 0x47, 0x68, - 0x14, 0x04, 0x20, 0xa0, 0x57, 0x00, 0xe0, 0xb0, - 0x57, 0x00, 0xe0, 0x00, 0xb5, 0x2e, 0xf0, 0x2b, - 0xfa, 0x13, 0x49, 0x00, 0x20, 0x08, 0x60, 0x12, - 0x49, 0x8a, 0x68, 0x12, 0x4b, 0x1a, 0x40, 0x8a, - 0x60, 0xda, 0x43, 0xca, 0x60, 0x11, 0x49, 0x08, - 0x60, 0x11, 0x49, 0x08, 0x60, 0x11, 0x49, 0x08, - 0x62, 0x48, 0x62, 0x88, 0x62, 0xc8, 0x62, 0x08, - 0x63, 0x48, 0x63, 0x0e, 0x48, 0x41, 0x69, 0x0e, - 0x48, 0x01, 0x29, 0x09, 0xd0, 0x02, 0x29, 0x01, - 0xd1, 0x0d, 0x49, 0x01, 0x62, 0x01, 0x21, 0x41, - 0x60, 0x2e, 0xf0, 0x05, 0xfa, 0x08, 0xbc, 0x18, - 0x47, 0x0a, 0x49, 0x01, 0x62, 0xed, 0x09, 0x00, - 0x75, 0x00, 0xf6, 0xe7, 0x24, 0x7e, 0x03, 0x20, - 0x00, 0x50, 0x00, 0xe0, 0x03, 0xf8, 0xff, 0xff, - 0x00, 0x51, 0x00, 0xe0, 0x00, 0x52, 0x00, 0xe0, - 0x00, 0x53, 0x00, 0xe0, 0x48, 0xe6, 0x03, 0x20, - 0x40, 0x53, 0x00, 0xe0, 0x11, 0x40, 0x00, 0x00, - 0x10, 0x80, 0x00, 0x00, 0xf8, 0xb5, 0x07, 0x1c, - 0x40, 0x68, 0x1d, 0x4b, 0x00, 0x25, 0xc6, 0x18, - 0xff, 0x30, 0xff, 0x30, 0xce, 0x30, 0x00, 0x90, - 0xff, 0x37, 0x35, 0x37, 0xb7, 0x42, 0x00, 0xd3, - 0x00, 0x9f, 0xf8, 0x68, 0x05, 0x28, 0x08, 0xd1, - 0x78, 0x6f, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x21, - 0x81, 0x65, 0x38, 0x1c, 0xf8, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x03, 0x28, 0x1a, 0xd1, 0xf9, 0xf7, - 0x76, 0xfb, 0x04, 0x1c, 0x16, 0xd0, 0x01, 0x20, - 0x39, 0x1c, 0x05, 0xf0, 0x33, 0xfc, 0x38, 0x1c, - 0x05, 0xf0, 0xd8, 0xfb, 0x04, 0x20, 0xf8, 0x60, - 0x02, 0x21, 0x38, 0x1c, 0xfb, 0xf7, 0xf8, 0xf8, - 0x3b, 0x20, 0x20, 0x60, 0xb8, 0x68, 0xe0, 0x60, - 0x00, 0x20, 0x20, 0x61, 0x0e, 0x20, 0x21, 0x1c, - 0xf9, 0xf7, 0xcc, 0xfb, 0x01, 0x35, 0x08, 0x2d, - 0xce, 0xd3, 0x00, 0x20, 0xda, 0xe7, 0x00, 0x00, - 0x38, 0x0b, 0x00, 0x00, 0xf1, 0xb5, 0x92, 0xb0, - 0xf9, 0x4a, 0xfa, 0x4b, 0x10, 0x68, 0x01, 0x1d, - 0x50, 0x68, 0xc4, 0x18, 0x5b, 0x08, 0xe3, 0x1a, - 0x08, 0x93, 0x00, 0x23, 0x57, 0x69, 0x06, 0x93, - 0x05, 0x93, 0x01, 0x23, 0x0e, 0x01, 0x36, 0x09, - 0x88, 0x1e, 0x00, 0x01, 0x04, 0x93, 0xd7, 0x61, - 0x00, 0x09, 0x09, 0x90, 0xf8, 0x68, 0x03, 0x28, - 0x31, 0xd1, 0x3d, 0x1c, 0xf9, 0xf7, 0x37, 0xfb, - 0x03, 0x90, 0x00, 0x28, 0x28, 0xd0, 0x01, 0x20, - 0x29, 0x1c, 0x05, 0xf0, 0xf3, 0xfb, 0x28, 0x1c, - 0x05, 0xf0, 0x98, 0xfb, 0x04, 0x20, 0xe8, 0x60, - 0xed, 0x09, 0x00, 0x76, 0x00, 0x03, 0x99, 0x3b, - 0x20, 0x08, 0x60, 0xa8, 0x68, 0x03, 0x99, 0xc8, - 0x60, 0x03, 0x99, 0x00, 0x20, 0x08, 0x61, 0x03, - 0x99, 0x0e, 0x20, 0xf9, 0xf7, 0x8d, 0xfb, 0x28, - 0x1c, 0xff, 0xf7, 0x86, 0xff, 0x07, 0x1c, 0x09, - 0xd1, 0x01, 0x23, 0x02, 0x22, 0x00, 0x21, 0x68, - 0x68, 0xfb, 0xf7, 0xda, 0xf9, 0x13, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x02, 0x21, 0x28, - 0x1c, 0xfb, 0xf7, 0x9c, 0xf8, 0xd5, 0x4a, 0x00, - 0x20, 0xd0, 0x61, 0xfd, 0x1d, 0x79, 0x35, 0x69, - 0x69, 0x01, 0x29, 0x4d, 0xd1, 0x28, 0x6b, 0xb0, - 0x42, 0x4a, 0xd2, 0x74, 0x30, 0xb0, 0x42, 0x22, - 0xd9, 0x78, 0x6f, 0x00, 0x28, 0x06, 0xd0, 0xc0, - 0x68, 0x02, 0x28, 0x03, 0xd0, 0x01, 0x28, 0x01, - 0xd0, 0x00, 0x28, 0x0e, 0xd1, 0xf8, 0x1d, 0x45, - 0x30, 0x05, 0xf0, 0x83, 0xf9, 0x00, 0x28, 0x08, - 0xd1, 0xf8, 0x1d, 0x4d, 0x30, 0x05, 0xf0, 0x7d, - 0xf9, 0x00, 0x28, 0x02, 0xd1, 0x07, 0xf0, 0x4c, - 0xf8, 0xd0, 0xe7, 0xf8, 0x1d, 0x45, 0x30, 0x05, - 0xf0, 0x74, 0xf9, 0x00, 0x28, 0x03, 0xd1, 0xf8, - 0x1d, 0x4d, 0x30, 0x05, 0xf0, 0x6e, 0xf9, 0xf9, - 0xf7, 0xd8, 0xfa, 0x00, 0x28, 0x0f, 0xd0, 0x41, - 0x21, 0x01, 0x60, 0x79, 0x68, 0x81, 0x61, 0x47, - 0x61, 0x79, 0x68, 0x49, 0x68, 0x01, 0x61, 0x39, - 0x7e, 0xc1, 0x60, 0x08, 0x21, 0xc1, 0x61, 0x01, - 0x1c, 0x0e, 0x20, 0xf9, 0xf7, 0x35, 0xfb, 0x00, - 0x20, 0x68, 0x61, 0xa8, 0x69, 0x00, 0x28, 0x08, - 0xd0, 0x79, 0x68, 0x40, 0x68, 0x81, 0x42, 0x04, - 0xd0, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, 0xfb, - 0xf7, 0x7f, 0xf9, 0x00, 0x20, 0xa8, 0x61, 0x0f, - 0xe0, 0x04, 0x29, 0x0d, 0xd1, 0x28, 0x6b, 0x01, - 0x38, 0x28, 0x63, 0x09, 0xd1, 0x38, 0x1c, 0x06, - 0xf0, 0x6b, 0xfe, 0xed, 0x09, 0x00, 0x77, 0x00, - 0x00, 0x28, 0x00, 0xd0, 0x95, 0xe7, 0xa4, 0x4a, - 0x00, 0x20, 0x57, 0x69, 0xd0, 0x61, 0xa4, 0x4d, - 0xe8, 0x1d, 0xff, 0x30, 0xe2, 0x30, 0x11, 0x90, - 0xa8, 0x42, 0x20, 0xd9, 0x09, 0x98, 0x04, 0x38, - 0x10, 0x90, 0x28, 0x68, 0x0f, 0x90, 0x00, 0x28, - 0x15, 0xd0, 0x10, 0x98, 0x29, 0x6a, 0x41, 0x1a, - 0x68, 0x6a, 0x0e, 0x90, 0xf8, 0xf7, 0x0d, 0xfe, - 0x04, 0x91, 0x00, 0x29, 0x04, 0xd1, 0x0f, 0x98, - 0x96, 0x49, 0x05, 0x90, 0xc8, 0x61, 0x06, 0xe0, - 0x0e, 0x98, 0x04, 0x99, 0x04, 0x38, 0x88, 0x42, - 0x01, 0xd1, 0x0f, 0x98, 0x06, 0x90, 0x11, 0x98, - 0xf4, 0x35, 0xa8, 0x42, 0xe1, 0xd8, 0x12, 0x98, - 0x00, 0x28, 0x71, 0xd0, 0x12, 0x98, 0x80, 0x0f, - 0x0a, 0xd2, 0x78, 0x6e, 0x40, 0x08, 0x03, 0xd3, - 0x01, 0x21, 0x38, 0x1c, 0x05, 0xf0, 0x1f, 0xfb, - 0x05, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x38, 0x66, - 0x12, 0x98, 0x40, 0x0a, 0x08, 0xd3, 0xf8, 0x1d, - 0xf9, 0x30, 0x41, 0x68, 0x01, 0x31, 0x41, 0x60, - 0x01, 0x69, 0x01, 0x31, 0x01, 0x61, 0x08, 0xe0, - 0x12, 0x98, 0x40, 0x08, 0x05, 0xd3, 0x01, 0x20, - 0x3a, 0x1c, 0x79, 0x68, 0xff, 0xf7, 0xdb, 0xfd, - 0x43, 0xe7, 0xf8, 0x1d, 0x79, 0x30, 0x40, 0x69, - 0x04, 0x28, 0x2e, 0xd0, 0x12, 0x98, 0xc0, 0x0f, - 0x2b, 0xd2, 0x05, 0x98, 0x00, 0x28, 0x28, 0xd1, - 0xf8, 0x1d, 0x45, 0x30, 0x05, 0xf0, 0xdc, 0xf8, - 0x00, 0x28, 0x09, 0xd1, 0xf8, 0x1d, 0x4d, 0x30, - 0x05, 0xf0, 0xd6, 0xf8, 0x00, 0x28, 0x03, 0xd1, - 0x78, 0x6f, 0xf9, 0x6f, 0x88, 0x42, 0x06, 0xd0, - 0xf8, 0x1d, 0xf9, 0x30, 0x02, 0x6b, 0x51, 0x1c, - 0x01, 0x63, 0x10, 0x2a, 0x11, 0xd3, 0xf9, 0x1d, - 0xf9, 0x31, 0x00, 0x20, 0x08, 0x63, 0x38, 0x1c, - 0xff, 0xf7, 0x99, 0xfe, 0x07, 0x1c, 0xed, 0x09, - 0x00, 0x78, 0x00, 0x06, 0xd1, 0x69, 0xa0, 0x0d, - 0xf0, 0x1c, 0xfc, 0x02, 0x20, 0xfb, 0xf7, 0x7f, - 0xf9, 0x11, 0xe7, 0x62, 0x4a, 0x57, 0x61, 0x78, - 0x68, 0xc1, 0x1d, 0xff, 0x31, 0x7a, 0x31, 0x09, - 0x69, 0x89, 0x07, 0x38, 0xd1, 0xf9, 0x1d, 0x79, - 0x31, 0x49, 0x69, 0x00, 0x29, 0x33, 0xd1, 0x2d, - 0x23, 0x9b, 0x01, 0xc1, 0x18, 0x0a, 0x68, 0x00, - 0x2a, 0x0f, 0xd0, 0x89, 0x68, 0x00, 0x29, 0x06, - 0xd0, 0x62, 0x4b, 0xc0, 0x18, 0x01, 0x68, 0x01, - 0x39, 0x01, 0x60, 0x24, 0xe0, 0x2a, 0xe0, 0x03, - 0x20, 0xfb, 0xf7, 0x5d, 0xf9, 0x00, 0x28, 0x1e, - 0xd0, 0xed, 0xe6, 0xfc, 0xf7, 0x1c, 0xfc, 0x5b, - 0x4d, 0x0c, 0xcd, 0x08, 0x3d, 0x09, 0xf0, 0x91, - 0xfa, 0x00, 0x28, 0x14, 0xd0, 0x78, 0x68, 0xfa, - 0xf7, 0x6e, 0xfe, 0x00, 0x28, 0x05, 0xd0, 0x00, - 0x20, 0xfb, 0xf7, 0x49, 0xf9, 0x00, 0x28, 0x0a, - 0xd0, 0xd9, 0xe6, 0x78, 0x68, 0x53, 0x4a, 0x40, - 0x6d, 0x00, 0x23, 0x42, 0x43, 0x03, 0xcd, 0x08, - 0x3d, 0x80, 0x18, 0x59, 0x41, 0x03, 0xc5, 0x05, - 0x98, 0x00, 0x28, 0x23, 0xd0, 0x05, 0x98, 0xfd, - 0xf7, 0x46, 0xff, 0x1f, 0xe0, 0x05, 0x98, 0x00, - 0x28, 0x1c, 0xd1, 0xf8, 0x1d, 0xf9, 0x30, 0x01, - 0x6b, 0x10, 0x29, 0x02, 0xd2, 0x01, 0x31, 0x01, - 0x63, 0x14, 0xe0, 0xf9, 0x1d, 0x79, 0x31, 0x49, - 0x69, 0x04, 0x29, 0x0f, 0xd0, 0x00, 0x21, 0x01, - 0x63, 0x38, 0x1c, 0xff, 0xf7, 0x32, 0xfe, 0x07, - 0x1c, 0x06, 0xd1, 0x35, 0xa0, 0x0d, 0xf0, 0xb5, - 0xfb, 0x02, 0x20, 0xfb, 0xf7, 0x18, 0xf9, 0xaa, - 0xe6, 0x2f, 0x4a, 0x57, 0x61, 0x3c, 0x49, 0x08, - 0x98, 0x09, 0x69, 0xff, 0x22, 0x91, 0x32, 0xfd, - 0xf7, 0xd6, 0xf9, 0x00, 0x28, 0x05, 0xd1, 0x01, - 0x20, 0x3a, 0x1c, 0x79, 0x68, 0xff, 0xf7, 0x31, - 0xfd, 0xed, 0x09, 0x00, 0x79, 0x00, 0x99, 0xe6, - 0x06, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x9f, - 0x24, 0x48, 0x87, 0x61, 0x78, 0x68, 0xc1, 0x1d, - 0x79, 0x31, 0xca, 0x69, 0xff, 0x30, 0x81, 0x30, - 0xb9, 0x6a, 0x83, 0x68, 0x03, 0x92, 0x18, 0x0e, - 0x1a, 0x02, 0x12, 0x0a, 0x00, 0x92, 0x00, 0x22, - 0x1a, 0x23, 0x01, 0x90, 0x02, 0x91, 0x00, 0x21, - 0x09, 0x98, 0xfd, 0xf7, 0xbf, 0xfb, 0xf9, 0x1d, - 0xb9, 0x31, 0x07, 0x90, 0x08, 0x98, 0x0d, 0x91, - 0xca, 0x68, 0x25, 0x4d, 0x01, 0x92, 0x0a, 0x69, - 0x02, 0x92, 0x4a, 0x69, 0x03, 0x21, 0x03, 0x92, - 0x6a, 0x69, 0x01, 0x2a, 0x6c, 0xd0, 0x02, 0x2a, - 0x4f, 0xd1, 0x20, 0x4a, 0xd1, 0x62, 0x06, 0x21, - 0x09, 0xf0, 0x46, 0xfa, 0xc8, 0x22, 0x09, 0xf0, - 0x3b, 0xfa, 0x02, 0x9a, 0x52, 0x00, 0x09, 0xf0, - 0x37, 0xfa, 0x28, 0x22, 0x09, 0xf0, 0x34, 0xfa, - 0x03, 0x22, 0x09, 0xf0, 0x41, 0xfa, 0x07, 0x99, - 0x16, 0x4a, 0x02, 0x31, 0x09, 0x02, 0x10, 0x23, - 0x19, 0x43, 0x11, 0x62, 0x01, 0x9a, 0xd1, 0x00, - 0x44, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, - 0x19, 0x43, 0x21, 0xe0, 0x68, 0x14, 0x04, 0x20, - 0xc4, 0x09, 0x00, 0x00, 0xfc, 0xef, 0x03, 0x20, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x20, 0x6e, - 0x6f, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x66, - 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x0a, 0x00, - 0x48, 0x0b, 0x00, 0x00, 0x70, 0x14, 0x04, 0x20, - 0x71, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, - 0x48, 0xe6, 0x03, 0x20, 0x80, 0x55, 0x00, 0xe0, - 0xf8, 0x4a, 0x51, 0x62, 0x03, 0x9a, 0x11, 0x02, - 0x16, 0x23, 0xf6, 0x4a, 0x19, 0x43, 0x91, 0x62, - 0xf5, 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, 0x02, - 0x08, 0x62, 0x0d, 0x98, 0xed, 0x09, 0x00, 0x7a, - 0x00, 0x08, 0x99, 0xc2, 0x68, 0x6b, 0x69, 0xf2, - 0x48, 0x01, 0x2b, 0x5c, 0xd0, 0x02, 0x2b, 0x06, - 0xd1, 0xd2, 0x00, 0x40, 0x23, 0x1a, 0x43, 0x12, - 0x02, 0x11, 0x23, 0x1a, 0x43, 0x02, 0x62, 0xc8, - 0x1d, 0x5d, 0x30, 0xec, 0x49, 0xff, 0x22, 0x02, - 0x32, 0x0a, 0x62, 0x08, 0x60, 0xf9, 0x1d, 0xe1, - 0x31, 0xe9, 0x48, 0x00, 0xe0, 0x1d, 0xe0, 0x0c, - 0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x06, - 0x98, 0x00, 0x28, 0x73, 0xd0, 0xf8, 0x1d, 0xf9, - 0x30, 0x40, 0x69, 0x01, 0x6d, 0x38, 0x1c, 0xfd, - 0xf7, 0x20, 0xff, 0x00, 0x20, 0x2d, 0x23, 0x79, - 0x68, 0x9b, 0x01, 0xc9, 0x18, 0x08, 0x60, 0x0d, - 0x99, 0x08, 0x98, 0x89, 0x6b, 0x03, 0x91, 0xf9, - 0x6a, 0x00, 0x29, 0x34, 0xd0, 0x05, 0x21, 0x02, - 0x91, 0x33, 0xe0, 0x06, 0x21, 0x09, 0xf0, 0xbe, - 0xf9, 0xff, 0x22, 0x05, 0x32, 0x09, 0xf0, 0xb2, - 0xf9, 0x02, 0x9a, 0x52, 0x00, 0x09, 0xf0, 0xae, - 0xf9, 0x28, 0x22, 0x09, 0xf0, 0xab, 0xf9, 0x03, - 0x22, 0x09, 0xf0, 0xb8, 0xf9, 0x07, 0x99, 0x02, - 0x31, 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0xca, - 0x49, 0x0a, 0x62, 0x01, 0x9a, 0xd2, 0x00, 0x84, - 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, - 0x43, 0x4a, 0x62, 0x03, 0x9a, 0x12, 0x02, 0x19, - 0x23, 0x1a, 0x43, 0x8a, 0x62, 0xc3, 0x49, 0x08, - 0x60, 0xc6, 0x48, 0x08, 0x62, 0x9b, 0xe7, 0xd2, - 0x00, 0x80, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, - 0x23, 0x1a, 0x43, 0x02, 0x62, 0xa3, 0xe7, 0x01, - 0x21, 0x02, 0x91, 0x69, 0x69, 0x01, 0x29, 0x27, - 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x06, 0x21, 0x09, - 0xf0, 0x85, 0xf9, 0x01, 0x1c, 0xbc, 0x48, 0x81, - 0x60, 0x03, 0x99, 0x02, 0x29, 0x02, 0xd0, 0x03, - 0x99, 0x03, 0x29, 0x07, 0xd1, 0x02, 0x99, 0xed, - 0x09, 0x00, 0x7b, 0x00, 0x08, 0x23, 0x19, 0x43, - 0x02, 0x91, 0x09, 0x99, 0xb7, 0x4a, 0x49, 0x08, - 0x11, 0x60, 0x02, 0x99, 0x01, 0x60, 0x79, 0x68, - 0xff, 0x31, 0x81, 0x31, 0x89, 0x68, 0x09, 0x9a, - 0x09, 0x0e, 0x52, 0x08, 0x12, 0x02, 0x11, 0x43, - 0x41, 0x60, 0xb8, 0x6f, 0xfc, 0xf7, 0xcb, 0xfe, - 0x00, 0xe0, 0x08, 0xe0, 0x9e, 0xe0, 0x06, 0x21, - 0x09, 0xf0, 0x5f, 0xf9, 0x6a, 0x46, 0x03, 0xc2, - 0x00, 0x98, 0x01, 0x99, 0xd4, 0xe7, 0xf8, 0x1d, - 0x79, 0x30, 0x40, 0x69, 0x01, 0x21, 0x04, 0x28, - 0x00, 0xd0, 0x00, 0x21, 0x38, 0x1c, 0x04, 0xf0, - 0x1f, 0xff, 0x78, 0x6f, 0x00, 0x28, 0x5c, 0xd0, - 0xc0, 0x68, 0x0a, 0x28, 0x01, 0xd0, 0x0b, 0x28, - 0x0b, 0xd1, 0x05, 0x98, 0x00, 0x28, 0x08, 0xd1, - 0x04, 0x99, 0x01, 0x29, 0x05, 0xd0, 0x96, 0x49, - 0x08, 0x62, 0x48, 0x62, 0x9a, 0x49, 0x08, 0x60, - 0x78, 0xe0, 0x0d, 0x99, 0x08, 0x98, 0x89, 0x6b, - 0x03, 0x91, 0xf9, 0x6a, 0x00, 0x29, 0x02, 0xd0, - 0x05, 0x21, 0x02, 0x91, 0x01, 0xe0, 0x01, 0x21, - 0x02, 0x91, 0x69, 0x69, 0x01, 0x29, 0x34, 0xd0, - 0x02, 0x29, 0x02, 0xd1, 0x06, 0x21, 0x09, 0xf0, - 0x28, 0xf9, 0x01, 0x1c, 0x8e, 0x48, 0x81, 0x60, - 0x03, 0x99, 0x02, 0x29, 0x02, 0xd0, 0x03, 0x99, - 0x03, 0x29, 0x07, 0xd1, 0x02, 0x99, 0x08, 0x23, - 0x19, 0x43, 0x02, 0x91, 0x09, 0x99, 0x88, 0x4a, - 0x49, 0x08, 0x11, 0x60, 0x02, 0x99, 0x01, 0x60, - 0x79, 0x68, 0xff, 0x31, 0x81, 0x31, 0x89, 0x68, - 0x09, 0x9a, 0x09, 0x0e, 0x52, 0x08, 0x12, 0x02, - 0x11, 0x43, 0x41, 0x60, 0x78, 0x6f, 0xfc, 0xf7, - 0x6e, 0xfe, 0x78, 0x6f, 0xc0, 0x68, 0x10, 0x28, - 0x40, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, - 0x9f, 0x44, 0x3c, 0x30, 0x3c, 0x10, 0x10, 0x3c, - 0x3c, 0x3c, 0xed, 0x09, 0x00, 0x7c, 0x00, 0x3c, - 0x3c, 0x17, 0x17, 0x1d, 0x1d, 0x23, 0x23, 0x06, - 0x21, 0x09, 0xf0, 0xf5, 0xf8, 0x6a, 0x46, 0x03, - 0xc2, 0x00, 0x98, 0x01, 0x99, 0xc7, 0xe7, 0x25, - 0xe0, 0x00, 0x20, 0x2d, 0x23, 0x79, 0x68, 0x9b, - 0x01, 0xc9, 0x18, 0x08, 0x60, 0x24, 0xe0, 0x00, - 0x20, 0x2d, 0x23, 0x79, 0x68, 0x9b, 0x01, 0xc9, - 0x18, 0x08, 0x60, 0x30, 0x1d, 0x06, 0x01, 0x6c, - 0x4b, 0x36, 0x09, 0xe4, 0x18, 0x18, 0xe0, 0x00, - 0x20, 0x2d, 0x23, 0x79, 0x68, 0x9b, 0x01, 0xc9, - 0x18, 0x08, 0x60, 0xf0, 0x1d, 0x01, 0x30, 0x06, - 0x01, 0x67, 0x4b, 0x36, 0x09, 0xe4, 0x18, 0x0b, - 0xe0, 0x0d, 0x98, 0x40, 0x6a, 0x0d, 0x99, 0x01, - 0x30, 0x48, 0x62, 0x05, 0xe0, 0x5a, 0x49, 0x00, - 0x20, 0x08, 0x62, 0x48, 0x62, 0x5d, 0x49, 0x08, - 0x60, 0x60, 0x49, 0xff, 0x22, 0x20, 0x1c, 0x09, - 0x69, 0x91, 0x32, 0xfd, 0xf7, 0x12, 0xf8, 0x00, - 0x28, 0x05, 0xd1, 0x01, 0x20, 0x3a, 0x1c, 0x79, - 0x68, 0xff, 0xf7, 0x6d, 0xfb, 0xd5, 0xe4, 0x78, - 0x68, 0xc1, 0x1d, 0x79, 0x31, 0xca, 0x69, 0xff, - 0x30, 0x81, 0x30, 0xb9, 0x6a, 0x83, 0x68, 0x03, - 0x92, 0x18, 0x0e, 0x1a, 0x02, 0x12, 0x0a, 0x00, - 0x92, 0x02, 0x91, 0x00, 0x21, 0x00, 0x22, 0x1a, - 0x23, 0x01, 0x90, 0x30, 0x1c, 0xfd, 0xf7, 0x01, - 0xfa, 0x07, 0x90, 0x78, 0x68, 0xff, 0x30, 0x81, - 0x30, 0x80, 0x68, 0x00, 0x0e, 0x71, 0x08, 0x0c, - 0x91, 0x09, 0x02, 0x08, 0x43, 0x4a, 0x49, 0x48, - 0x60, 0x0d, 0x99, 0x20, 0x1c, 0x8a, 0x68, 0x03, - 0x92, 0x69, 0x69, 0x01, 0x29, 0x71, 0xd0, 0x02, - 0x29, 0x22, 0xd1, 0x09, 0x21, 0x09, 0xf0, 0x75, - 0xf8, 0xc8, 0x22, 0x09, 0xf0, 0x7c, 0xf8, 0x34, - 0x22, 0x09, 0xf0, 0x79, 0xf8, 0x50, 0x22, 0x09, - 0xf0, 0x76, 0xf8, 0x0d, 0x22, 0xed, 0x09, 0x00, - 0x7d, 0x00, 0x09, 0xf0, 0x73, 0xf8, 0x04, 0x22, - 0x09, 0xf0, 0x70, 0xf8, 0x28, 0x22, 0x09, 0xf0, - 0x6d, 0xf8, 0x07, 0x99, 0x02, 0x31, 0x09, 0x02, - 0x10, 0x22, 0x0a, 0x43, 0x38, 0x49, 0x0a, 0x62, - 0x03, 0x9a, 0x42, 0x23, 0x1a, 0x43, 0x12, 0x02, - 0x11, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x35, 0x4a, - 0x35, 0x49, 0x0a, 0x62, 0x08, 0x60, 0x0d, 0x98, - 0x81, 0x68, 0x6a, 0x69, 0x33, 0x48, 0x01, 0x2a, - 0x44, 0xd0, 0x02, 0x2a, 0x05, 0xd1, 0x40, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, - 0x01, 0x62, 0xe0, 0x1d, 0x49, 0x30, 0xff, 0x22, - 0x2d, 0x49, 0x02, 0x32, 0x0a, 0x62, 0x08, 0x60, - 0x2c, 0x48, 0xc0, 0x69, 0x00, 0x28, 0x73, 0xd0, - 0xc2, 0x1d, 0xb9, 0x32, 0x0b, 0x92, 0x93, 0x68, - 0x29, 0x4a, 0x02, 0x93, 0x11, 0x6a, 0x52, 0x6a, - 0x09, 0x0a, 0xff, 0x23, 0x1b, 0x02, 0x1a, 0x40, - 0x11, 0x43, 0x6a, 0x69, 0x01, 0x2a, 0x64, 0xd0, - 0x02, 0x2a, 0x07, 0xd1, 0xd2, 0x03, 0x0b, 0x0c, - 0x00, 0xd2, 0x00, 0x22, 0x11, 0x43, 0x01, 0x23, - 0xdb, 0x03, 0x99, 0x43, 0x03, 0x91, 0x0b, 0x9a, - 0x03, 0x23, 0x11, 0x6a, 0x03, 0x9a, 0x1b, 0x04, - 0x1a, 0x40, 0x0b, 0x40, 0x01, 0x93, 0x03, 0x23, - 0x1b, 0x04, 0x02, 0x92, 0x0a, 0x1c, 0x9a, 0x43, - 0xd2, 0x00, 0x00, 0x92, 0x02, 0x9a, 0x01, 0x9b, - 0x9a, 0x42, 0x5f, 0xd0, 0x03, 0x99, 0x62, 0xe0, - 0x28, 0xe0, 0x27, 0xe0, 0x4b, 0xe0, 0x00, 0x00, - 0x80, 0x55, 0x00, 0xe0, 0x00, 0x53, 0x00, 0xe0, - 0x90, 0x55, 0x00, 0xe0, 0x04, 0x53, 0x00, 0xe0, - 0xa0, 0x57, 0x00, 0xe0, 0x03, 0x05, 0x00, 0x00, - 0x00, 0x52, 0x00, 0xe0, 0x80, 0x57, 0x00, 0xe0, - 0xc4, 0x09, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, - 0x00, 0x50, 0x00, 0xe0, 0x00, 0x51, 0x00, 0xe0, - 0xed, 0x09, 0x00, 0x7e, 0x00, 0xa0, 0x55, 0x00, - 0xe0, 0x02, 0x05, 0x00, 0x00, 0x08, 0x53, 0x00, - 0xe0, 0xb0, 0x55, 0x00, 0xe0, 0x0c, 0x53, 0x00, - 0xe0, 0x68, 0x14, 0x04, 0x20, 0xd0, 0x55, 0x00, - 0xe0, 0x10, 0x21, 0x08, 0xf0, 0xdb, 0xff, 0xff, - 0x22, 0x05, 0x32, 0x08, 0xf0, 0xe1, 0xff, 0x46, - 0x22, 0x08, 0xf0, 0xde, 0xff, 0x0d, 0x22, 0x08, - 0xf0, 0xdb, 0xff, 0x04, 0x22, 0x08, 0xf0, 0xd8, - 0xff, 0x28, 0x22, 0x08, 0xf0, 0xd5, 0xff, 0x07, - 0x99, 0x02, 0x31, 0x09, 0x02, 0x20, 0x22, 0x0a, - 0x43, 0x65, 0x49, 0x01, 0xe0, 0x26, 0xe0, 0x0f, - 0xe0, 0x0a, 0x62, 0x03, 0x9a, 0x82, 0x23, 0x1a, - 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, 0x4a, - 0x62, 0x63, 0xe7, 0x80, 0x23, 0x19, 0x43, 0x09, - 0x02, 0x10, 0x23, 0x19, 0x43, 0x01, 0x62, 0x6e, - 0xe7, 0x01, 0x22, 0x02, 0x9b, 0x12, 0x04, 0x00, - 0x2b, 0x00, 0xd1, 0x00, 0x22, 0x11, 0x43, 0x8b, - 0xe7, 0x00, 0x9a, 0x51, 0x1a, 0x03, 0x9a, 0x89, - 0x18, 0xc9, 0x08, 0x01, 0x22, 0x02, 0x9b, 0x12, - 0x04, 0x00, 0x2b, 0x00, 0xd1, 0x00, 0x22, 0x11, - 0x43, 0x0b, 0x9a, 0x11, 0x62, 0x6a, 0x69, 0x21, - 0x1c, 0x01, 0x2a, 0x5e, 0xd0, 0x02, 0x2a, 0x05, - 0xd1, 0x4e, 0x4a, 0x2d, 0x23, 0x13, 0x62, 0x2c, - 0x23, 0x53, 0x62, 0x3c, 0x39, 0x4c, 0x4b, 0x4d, - 0x4a, 0x13, 0x62, 0x11, 0x60, 0x12, 0x99, 0x4c, - 0x4b, 0x19, 0x40, 0x35, 0xd1, 0x00, 0x28, 0x33, - 0xd0, 0xc0, 0x30, 0x0a, 0x90, 0x49, 0x4a, 0x81, - 0x68, 0x10, 0x6a, 0x52, 0x6a, 0x00, 0x0a, 0xff, - 0x23, 0x1b, 0x02, 0x1a, 0x40, 0x10, 0x43, 0x6a, - 0x69, 0x01, 0x2a, 0x45, 0xd0, 0x02, 0x2a, 0x07, - 0xd1, 0xd2, 0x03, 0x01, 0x0c, 0x00, 0xd2, 0x00, - 0x22, 0x10, 0x43, 0x01, 0x23, 0xdb, 0x03, 0x98, - 0x43, 0x03, 0x22, 0xed, 0x09, 0x00, 0x7f, 0x00, - 0x12, 0x04, 0x0a, 0x99, 0x02, 0x40, 0x03, 0x23, - 0xc9, 0x69, 0x1b, 0x04, 0x0b, 0x40, 0x02, 0x93, - 0x3b, 0x4b, 0x0b, 0x40, 0xdb, 0x00, 0x01, 0x93, - 0x02, 0x9b, 0x9a, 0x42, 0x03, 0xd1, 0x01, 0x9b, - 0x59, 0x1a, 0x08, 0x18, 0xc0, 0x08, 0x01, 0x21, - 0x09, 0x04, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x21, - 0x08, 0x43, 0x0a, 0x99, 0xc8, 0x61, 0x68, 0x69, - 0x01, 0x28, 0x23, 0xd0, 0x02, 0x28, 0x04, 0xd1, - 0x2e, 0x4a, 0x2d, 0x23, 0x13, 0x62, 0x2c, 0x23, - 0x53, 0x62, 0x28, 0x4b, 0x2d, 0x49, 0xe0, 0x1d, - 0x21, 0x30, 0x0b, 0x62, 0x08, 0x60, 0x0d, 0x99, - 0x20, 0x1c, 0x89, 0x6b, 0x03, 0x91, 0xf9, 0x6a, - 0x00, 0x29, 0x15, 0xd0, 0x05, 0x27, 0x14, 0xe0, - 0x20, 0x4a, 0x3d, 0x23, 0x13, 0x62, 0x3e, 0x23, - 0x53, 0x62, 0x46, 0x39, 0xa1, 0xe7, 0x01, 0x22, - 0x12, 0x04, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x22, - 0x10, 0x43, 0xbc, 0xe7, 0x1d, 0x4a, 0x3d, 0x23, - 0x13, 0x62, 0x3e, 0x23, 0x53, 0x62, 0xdc, 0xe7, - 0x01, 0x27, 0x69, 0x69, 0x01, 0x29, 0x1d, 0xd0, - 0x02, 0x29, 0x02, 0xd1, 0x09, 0x21, 0x08, 0xf0, - 0x1c, 0xff, 0xc2, 0x1f, 0x18, 0x49, 0x21, 0x3a, - 0x8a, 0x60, 0xb0, 0x30, 0xc8, 0x60, 0x03, 0x98, - 0x01, 0x28, 0x02, 0xd0, 0x03, 0x98, 0x03, 0x28, - 0x04, 0xd1, 0x0c, 0x98, 0x13, 0x4a, 0x08, 0x23, - 0x1f, 0x43, 0x10, 0x60, 0x32, 0x20, 0x0f, 0x60, - 0x09, 0xf0, 0xa9, 0xfc, 0x10, 0x48, 0x44, 0x60, - 0x06, 0x60, 0x23, 0xe4, 0x10, 0x21, 0x08, 0xf0, - 0x00, 0xff, 0x01, 0xaa, 0x03, 0xc2, 0x01, 0x98, - 0x02, 0x99, 0xde, 0xe7, 0x00, 0x00, 0xa0, 0x55, - 0x00, 0xe0, 0xd0, 0x55, 0x00, 0xe0, 0x02, 0x03, - 0x00, 0x00, 0x14, 0x53, 0x00, 0xe0, 0x09, 0x00, - 0x00, 0x40, 0xc0, 0x55, 0x00, 0xe0, 0xed, 0x09, - 0x00, 0x80, 0x00, 0xff, 0xff, 0xfc, 0xff, 0x10, - 0x53, 0x00, 0xe0, 0x00, 0x51, 0x00, 0xe0, 0x80, - 0x55, 0x00, 0xe0, 0x68, 0x14, 0x04, 0x20, 0xf1, - 0xb5, 0x88, 0xb0, 0xad, 0x48, 0x00, 0x21, 0x60, - 0xc8, 0x08, 0x38, 0x40, 0x69, 0x02, 0x91, 0x08, - 0x91, 0xab, 0x49, 0x00, 0x24, 0x89, 0x6a, 0x07, - 0x1c, 0x4a, 0x07, 0x52, 0x0f, 0x07, 0x92, 0x04, - 0xab, 0x1a, 0x70, 0x4a, 0x06, 0x12, 0x0f, 0x05, - 0x92, 0x0a, 0x06, 0xd2, 0x0f, 0x5a, 0x70, 0xca, - 0x05, 0xd2, 0x0f, 0x89, 0x05, 0xc9, 0x0f, 0x9a, - 0x70, 0xd9, 0x70, 0x39, 0x7e, 0x07, 0x9a, 0x38, - 0x1c, 0x91, 0x42, 0x09, 0xd0, 0x04, 0xaa, 0x12, - 0x78, 0xff, 0x23, 0x35, 0x33, 0x5a, 0x43, 0x79, - 0x68, 0x89, 0x18, 0xcf, 0x1d, 0xff, 0x37, 0x92, - 0x37, 0x04, 0xa9, 0x89, 0x78, 0x01, 0x29, 0x47, - 0xd1, 0xc0, 0x68, 0x03, 0x28, 0x07, 0xd1, 0x2d, - 0xf0, 0x50, 0xfc, 0x00, 0x22, 0x01, 0x21, 0x38, - 0x1c, 0x04, 0xf0, 0xfc, 0xfd, 0x3c, 0xe0, 0x78, - 0x6f, 0x01, 0x90, 0x00, 0x28, 0x38, 0xd0, 0x78, - 0x6a, 0xfd, 0x28, 0x35, 0xd0, 0xf8, 0x1d, 0x79, - 0x30, 0x06, 0x90, 0xc0, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x78, 0x67, 0x2d, 0xe0, 0x38, 0x1c, 0x04, - 0xf0, 0x02, 0xff, 0x00, 0x28, 0x1b, 0xd1, 0x01, - 0x98, 0x88, 0x49, 0xc0, 0x68, 0xc3, 0x00, 0x18, - 0x18, 0x80, 0x00, 0x40, 0x18, 0xc0, 0x69, 0x00, - 0x28, 0x0c, 0xd0, 0x01, 0x21, 0xfa, 0x6d, 0x08, - 0x1c, 0x00, 0x2a, 0x00, 0xd0, 0x00, 0x20, 0xf8, - 0x65, 0xf8, 0x1d, 0xb9, 0x30, 0xf9, 0x66, 0xc1, - 0x6b, 0x01, 0x31, 0xc1, 0x63, 0x01, 0x98, 0x39, - 0x1c, 0x04, 0xf0, 0xe0, 0xfe, 0x0c, 0xe0, 0x06, - 0x98, 0x40, 0x68, 0x06, 0x99, 0x02, 0x90, 0x00, - 0x20, 0x48, 0x60, 0x01, 0x99, 0xcc, 0x6b, 0xc8, - 0x63, 0xed, 0x09, 0x00, 0x81, 0x00, 0x06, 0x99, - 0xc9, 0x68, 0x03, 0x91, 0x78, 0x67, 0x78, 0x6e, - 0x40, 0x08, 0x07, 0xd3, 0x04, 0xa8, 0x40, 0x78, - 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x38, 0x1c, - 0x04, 0xf0, 0x56, 0xfe, 0x78, 0x6e, 0x40, 0x08, - 0x07, 0xd2, 0x04, 0xa8, 0x40, 0x78, 0x00, 0x28, - 0x03, 0xd1, 0x01, 0x21, 0x38, 0x1c, 0x04, 0xf0, - 0x31, 0xfe, 0xf8, 0x1d, 0xf9, 0x30, 0x41, 0x68, - 0x01, 0x31, 0x41, 0x60, 0x05, 0x98, 0x10, 0x28, - 0x67, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, - 0x9f, 0x44, 0x00, 0x1c, 0x08, 0x6c, 0x6c, 0x11, - 0x11, 0x46, 0x46, 0x46, 0x11, 0x6c, 0x4d, 0x4d, - 0x5d, 0x5d, 0x64, 0x64, 0xf8, 0x1d, 0xb9, 0x30, - 0x40, 0x6a, 0x00, 0x28, 0x5e, 0xd1, 0x01, 0x21, - 0x49, 0x07, 0x08, 0x91, 0x69, 0xe0, 0x04, 0xa9, - 0xc9, 0x78, 0x38, 0x6c, 0x88, 0x42, 0x02, 0xd1, - 0x01, 0x21, 0x39, 0x66, 0x01, 0xe0, 0x00, 0x20, - 0x38, 0x66, 0x00, 0x20, 0x2d, 0x23, 0x79, 0x68, - 0x9b, 0x01, 0xc9, 0x18, 0x08, 0x60, 0x53, 0x48, - 0x00, 0x68, 0x80, 0x09, 0x55, 0xd3, 0x4f, 0x48, - 0x00, 0x6a, 0x00, 0xab, 0x18, 0x70, 0x00, 0x98, - 0x80, 0x07, 0x80, 0x0f, 0x03, 0x28, 0x14, 0xd0, - 0x78, 0x6e, 0x02, 0x23, 0x18, 0x40, 0x07, 0xd0, - 0x00, 0x99, 0xc9, 0x08, 0x04, 0xd3, 0x02, 0x21, - 0x38, 0x1c, 0x04, 0xf0, 0x05, 0xfe, 0x08, 0xe0, - 0x00, 0x28, 0x06, 0xd1, 0x00, 0x98, 0xc0, 0x08, - 0x03, 0xd2, 0x02, 0x21, 0x38, 0x1c, 0x04, 0xf0, - 0xe1, 0xfd, 0x01, 0x21, 0x39, 0x66, 0x34, 0xe0, - 0x00, 0x20, 0x2d, 0x23, 0x79, 0x68, 0x9b, 0x01, - 0xc9, 0x18, 0x08, 0x60, 0x2d, 0xe0, 0x04, 0xa9, - 0xc9, 0x78, 0x38, 0x6c, 0x88, 0x42, 0x02, 0xd1, - 0x01, 0x21, 0x39, 0x66, 0x01, 0xe0, 0x00, 0x20, - 0x38, 0x66, 0x00, 0x20, 0xed, 0x09, 0x00, 0x82, - 0x00, 0x2d, 0x23, 0x79, 0x68, 0x9b, 0x01, 0xc9, - 0x18, 0x08, 0x60, 0x28, 0x1d, 0x05, 0x01, 0x35, - 0x4b, 0x2d, 0x09, 0xf6, 0x18, 0x17, 0xe0, 0x16, - 0xe0, 0x04, 0xa9, 0xc9, 0x78, 0x38, 0x6c, 0x88, - 0x42, 0x03, 0xd1, 0x01, 0x21, 0x39, 0x66, 0x02, - 0xe0, 0x0d, 0xe0, 0x00, 0x20, 0x38, 0x66, 0xe8, - 0x1d, 0x01, 0x30, 0x05, 0x01, 0x2d, 0x09, 0x2c, - 0x4b, 0x00, 0x20, 0xf6, 0x18, 0x2d, 0x23, 0x79, - 0x68, 0x9b, 0x01, 0xc9, 0x18, 0x08, 0x60, 0x23, - 0x48, 0x60, 0xc0, 0x08, 0x98, 0xff, 0xf7, 0xba, - 0xf9, 0x02, 0x98, 0x00, 0x28, 0x10, 0xd0, 0x00, - 0x2c, 0x13, 0xd0, 0x34, 0x20, 0x20, 0x60, 0xb8, - 0x68, 0xe0, 0x60, 0x00, 0x20, 0x20, 0x61, 0x02, - 0x98, 0x60, 0x61, 0x03, 0x99, 0x0e, 0x20, 0xa1, - 0x61, 0x21, 0x1c, 0xf8, 0xf7, 0x6b, 0xfd, 0x04, - 0xe0, 0x00, 0x2c, 0x02, 0xd0, 0x20, 0x1c, 0xf8, - 0xf7, 0x31, 0xfd, 0xfc, 0x1d, 0x79, 0x34, 0x60, - 0x69, 0x04, 0x28, 0x1f, 0xd1, 0xf8, 0xf7, 0xef, - 0xfc, 0x00, 0x28, 0x1b, 0xd0, 0x41, 0x21, 0x01, - 0x60, 0x79, 0x68, 0x00, 0x25, 0x81, 0x61, 0x47, - 0x61, 0x79, 0x68, 0x49, 0x68, 0x01, 0x61, 0x39, - 0x7e, 0xc1, 0x60, 0xc5, 0x61, 0x01, 0x1c, 0x0e, - 0x20, 0xf8, 0xf7, 0x4c, 0xfd, 0xf9, 0x1d, 0xb9, - 0x31, 0x49, 0x68, 0x78, 0x68, 0x4a, 0x68, 0x90, - 0x42, 0x03, 0xd0, 0x4d, 0x60, 0x10, 0x1c, 0xfc, - 0xf7, 0xa7, 0xf8, 0x65, 0x61, 0x09, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x68, 0x14, 0x04, - 0x20, 0x40, 0x55, 0x00, 0xe0, 0x78, 0x7b, 0x03, - 0x20, 0x00, 0x50, 0x00, 0xe0, 0xc4, 0x09, 0x00, - 0x00, 0x88, 0x13, 0x00, 0x00, 0xf0, 0xb5, 0x25, - 0x48, 0xc5, 0x69, 0x00, 0x2d, 0x2b, 0xd0, 0xe8, - 0x1d, 0xf9, 0x30, 0xc1, 0x68, 0xee, 0x1d, 0xed, - 0x09, 0x00, 0x83, 0x00, 0x01, 0x31, 0xc1, 0x60, - 0xb9, 0x36, 0x70, 0x6a, 0x00, 0x28, 0x21, 0xd0, - 0xf8, 0xf7, 0xf0, 0xfc, 0x07, 0x1c, 0x1d, 0xd0, - 0x1d, 0x49, 0xf8, 0x1d, 0x89, 0x6a, 0x01, 0x30, - 0x4a, 0x07, 0x52, 0x0f, 0x02, 0x70, 0x4a, 0x06, - 0x12, 0x0f, 0x42, 0x60, 0x0a, 0x06, 0xd2, 0x0f, - 0x42, 0x70, 0xca, 0x05, 0xd2, 0x0f, 0x89, 0x05, - 0xc9, 0x0f, 0x82, 0x70, 0xc1, 0x70, 0x00, 0x20, - 0xf8, 0x60, 0xf0, 0x69, 0xb8, 0x64, 0xf8, 0xf7, - 0x95, 0xfc, 0x04, 0x1c, 0x05, 0xd1, 0x38, 0x1c, - 0xf8, 0xf7, 0xf1, 0xfc, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x35, 0x20, 0x20, 0x60, 0x68, 0x68, - 0x40, 0x68, 0xe0, 0x60, 0x0e, 0x20, 0x21, 0x1c, - 0x27, 0x61, 0xf8, 0xf7, 0xf2, 0xfc, 0x00, 0x28, - 0x06, 0xd0, 0x38, 0x1c, 0xf8, 0xf7, 0xdf, 0xfc, - 0x20, 0x1c, 0xf8, 0xf7, 0xb6, 0xfc, 0xe9, 0xe7, - 0x70, 0x6a, 0x01, 0x38, 0x70, 0x62, 0xe5, 0xe7, - 0x00, 0x00, 0x68, 0x14, 0x04, 0x20, 0x40, 0x55, - 0x00, 0xe0, 0xf0, 0xb5, 0x69, 0x4d, 0x07, 0x1c, - 0xec, 0x69, 0x68, 0x68, 0x2e, 0x69, 0x00, 0x2c, - 0x09, 0xd0, 0x66, 0x49, 0x00, 0x22, 0x09, 0x69, - 0xfc, 0xf7, 0x85, 0xfc, 0x00, 0x28, 0x05, 0xd1, - 0x38, 0x1c, 0xff, 0xf7, 0x9e, 0xff, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xa8, 0x69, 0x01, 0x21, - 0xa0, 0x42, 0x00, 0xd0, 0x00, 0x21, 0x38, 0x1c, - 0xfc, 0xf7, 0xdf, 0xf8, 0x00, 0x21, 0x07, 0x1c, - 0x00, 0x28, 0x08, 0xd1, 0x20, 0x66, 0xfc, 0xf7, - 0x6c, 0xfa, 0xe0, 0x1d, 0xf9, 0x30, 0xc1, 0x68, - 0x01, 0x31, 0xc1, 0x60, 0xe7, 0xe7, 0x20, 0x7e, - 0x3a, 0x7a, 0x90, 0x42, 0x16, 0xd0, 0x00, 0x20, - 0x21, 0x66, 0xfc, 0xf7, 0x5e, 0xfa, 0xe0, 0x1d, - 0xf9, 0x30, 0xc1, 0x68, 0x01, 0x31, 0xc1, 0x60, - 0x38, 0x6b, 0xed, 0x09, 0x00, 0x84, 0x00, 0x00, - 0x28, 0x01, 0xd0, 0xf8, 0xf7, 0x30, 0xfc, 0xf8, - 0x69, 0x00, 0x28, 0x01, 0xd0, 0xf8, 0xf7, 0x2b, - 0xfc, 0x38, 0x1c, 0xf8, 0xf7, 0x8e, 0xfc, 0xcc, - 0xe7, 0xe5, 0x1d, 0xb9, 0x35, 0xe8, 0x69, 0xb8, - 0x64, 0xf8, 0x68, 0x03, 0x38, 0x0d, 0x28, 0x40, - 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, - 0x44, 0x00, 0x1c, 0x07, 0x07, 0x36, 0x36, 0x36, - 0x07, 0x3c, 0x07, 0x07, 0x3c, 0x3c, 0x07, 0x07, - 0x00, 0x78, 0x69, 0x02, 0x28, 0x01, 0xd0, 0x01, - 0x28, 0x14, 0xd1, 0x60, 0x6e, 0x02, 0x23, 0x18, - 0x40, 0x07, 0xd0, 0x39, 0x69, 0x00, 0x29, 0x04, - 0xd0, 0x02, 0x21, 0x20, 0x1c, 0x04, 0xf0, 0xb7, - 0xfc, 0x08, 0xe0, 0x00, 0x28, 0x06, 0xd1, 0x38, - 0x69, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, 0x20, - 0x1c, 0x04, 0xf0, 0x93, 0xfc, 0xf8, 0x1d, 0x01, - 0x30, 0x21, 0x1c, 0x04, 0xf0, 0x09, 0xfd, 0x00, - 0x28, 0x13, 0xd0, 0x38, 0x6b, 0x00, 0x28, 0x01, - 0xd0, 0xf8, 0xf7, 0xed, 0xfb, 0xf8, 0x69, 0x00, - 0x28, 0x01, 0xd0, 0xf8, 0xf7, 0xe8, 0xfb, 0x38, - 0x1c, 0xf8, 0xf7, 0x4b, 0xfc, 0x89, 0xe7, 0x00, - 0x22, 0x20, 0x1c, 0x39, 0x1c, 0xfd, 0xf7, 0x79, - 0xf9, 0x83, 0xe7, 0x68, 0x6a, 0x00, 0x28, 0x02, - 0xd0, 0x01, 0x38, 0x68, 0x62, 0x10, 0xe0, 0xf8, - 0x68, 0x00, 0x28, 0x0d, 0xd1, 0x38, 0x6b, 0x00, - 0x28, 0x01, 0xd0, 0xf8, 0xf7, 0xd0, 0xfb, 0xf8, - 0x69, 0x00, 0x28, 0x01, 0xd0, 0xf8, 0xf7, 0xcb, - 0xfb, 0x38, 0x1c, 0xf8, 0xf7, 0x2e, 0xfc, 0x6c, - 0xe7, 0xf8, 0xf7, 0xca, 0xfb, 0x04, 0x1c, 0x0d, - 0xd1, 0x38, 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xf8, - 0xf7, 0xbe, 0xfb, 0xf8, 0x69, 0x00, 0x28, 0x01, - 0xd0, 0xf8, 0xf7, 0xb9, 0xfb, 0x38, 0x1c, 0xf8, - 0xf7, 0x1c, 0xfc, 0x5a, 0xe7, 0xed, 0x09, 0x00, - 0x85, 0x00, 0x35, 0x20, 0x20, 0x60, 0x70, 0x68, - 0xe0, 0x60, 0x0e, 0x20, 0x21, 0x1c, 0x27, 0x61, - 0xf8, 0xf7, 0x20, 0xfc, 0x00, 0x28, 0xc4, 0xd0, - 0x38, 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xf8, 0xf7, - 0xa5, 0xfb, 0xf8, 0x69, 0x00, 0x28, 0x01, 0xd0, - 0xf8, 0xf7, 0xa0, 0xfb, 0x38, 0x1c, 0xf8, 0xf7, - 0x03, 0xfc, 0x20, 0x1c, 0xf8, 0xf7, 0xda, 0xfb, - 0x3e, 0xe7, 0x00, 0x00, 0x68, 0x14, 0x04, 0x20, - 0x00, 0x50, 0x00, 0xe0, 0xf0, 0xb5, 0x84, 0xb0, - 0x0c, 0x1c, 0x17, 0x1c, 0x2d, 0xf0, 0xee, 0xf9, - 0x2c, 0x4d, 0x2c, 0x61, 0x6f, 0x61, 0xfb, 0xf7, - 0xab, 0xfd, 0x02, 0x90, 0x03, 0x91, 0x60, 0x6d, - 0x29, 0x4b, 0x58, 0x43, 0x00, 0x21, 0x6a, 0x46, - 0x51, 0x60, 0x10, 0x60, 0x02, 0x98, 0x00, 0x9a, - 0xee, 0x1d, 0x01, 0x36, 0x03, 0x99, 0x01, 0x9b, - 0x80, 0x18, 0x59, 0x41, 0x03, 0xc6, 0x00, 0x21, - 0x00, 0x20, 0x23, 0x1c, 0x02, 0xaa, 0xfb, 0xf7, - 0x47, 0xfe, 0x28, 0x60, 0x03, 0x99, 0x02, 0x98, - 0x1e, 0x49, 0x68, 0x60, 0x02, 0x20, 0x08, 0x60, - 0x1d, 0x48, 0x1e, 0x49, 0x42, 0x69, 0xf8, 0x1d, - 0xb9, 0x30, 0x01, 0x2a, 0x2a, 0xd0, 0x02, 0x2a, - 0x01, 0xd1, 0x01, 0x22, 0xca, 0x60, 0xe5, 0x1d, - 0x51, 0x35, 0x2c, 0x1c, 0x0c, 0xcd, 0x18, 0x49, - 0x0c, 0xc1, 0x28, 0xcc, 0x17, 0x49, 0x28, 0xc1, - 0x80, 0x6b, 0x00, 0x28, 0x09, 0xd0, 0xf9, 0x1d, - 0xe1, 0x31, 0x3c, 0xc9, 0x14, 0x48, 0xf9, 0x1d, - 0x3c, 0xc0, 0x09, 0x31, 0xa0, 0xc9, 0x13, 0x48, - 0xa0, 0xc0, 0x13, 0x49, 0x13, 0x48, 0xc1, 0x60, - 0x81, 0x68, 0xfb, 0x23, 0x9b, 0x00, 0x19, 0x43, - 0x81, 0x60, 0x80, 0x04, 0x00, 0xf0, 0x76, 0xf8, - 0x2d, 0xf0, 0x98, 0xf9, 0x04, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x02, 0x69, 0xca, 0x60, - 0xed, 0x09, 0x00, 0x86, 0x00, 0xd5, 0xe7, 0x00, - 0x00, 0x68, 0x14, 0x04, 0x20, 0x71, 0x02, 0x00, - 0x00, 0x24, 0x7e, 0x03, 0x20, 0x48, 0xe6, 0x03, - 0x20, 0x00, 0x52, 0x00, 0xe0, 0x20, 0x51, 0x00, - 0xe0, 0x90, 0x57, 0x00, 0xe0, 0xa0, 0x57, 0x00, - 0xe0, 0xb0, 0x57, 0x00, 0xe0, 0xfc, 0x07, 0x00, - 0x00, 0x00, 0x50, 0x00, 0xe0, 0x80, 0xb4, 0x08, - 0x49, 0x49, 0x69, 0x81, 0x42, 0x0a, 0xd1, 0xc7, - 0x1d, 0xe1, 0x37, 0x0c, 0xcf, 0x05, 0x49, 0x10, - 0x30, 0x0c, 0xc1, 0x0c, 0xcf, 0x0c, 0xc1, 0x88, - 0xc8, 0x03, 0x49, 0x88, 0xc1, 0x80, 0xbc, 0x70, - 0x47, 0x68, 0x14, 0x04, 0x20, 0xa0, 0x57, 0x00, - 0xe0, 0xb0, 0x57, 0x00, 0xe0, 0x00, 0xb5, 0x2d, - 0xf0, 0x63, 0xf9, 0x13, 0x49, 0x00, 0x20, 0x08, - 0x60, 0x12, 0x49, 0x8a, 0x68, 0x12, 0x4b, 0x1a, - 0x40, 0x8a, 0x60, 0xda, 0x43, 0xca, 0x60, 0x11, - 0x49, 0x08, 0x60, 0x11, 0x49, 0x08, 0x60, 0x11, - 0x49, 0x08, 0x62, 0x48, 0x62, 0x88, 0x62, 0xc8, - 0x62, 0x08, 0x63, 0x48, 0x63, 0x0e, 0x48, 0x41, - 0x69, 0x0e, 0x48, 0x01, 0x29, 0x09, 0xd0, 0x02, - 0x29, 0x01, 0xd1, 0x0d, 0x49, 0x01, 0x62, 0x01, - 0x21, 0x41, 0x60, 0x2d, 0xf0, 0x3d, 0xf9, 0x08, - 0xbc, 0x18, 0x47, 0x0a, 0x49, 0x01, 0x62, 0xf6, - 0xe7, 0x24, 0x7e, 0x03, 0x20, 0x00, 0x50, 0x00, - 0xe0, 0x03, 0xf8, 0xff, 0xff, 0x00, 0x51, 0x00, - 0xe0, 0x00, 0x52, 0x00, 0xe0, 0x00, 0x53, 0x00, - 0xe0, 0x48, 0xe6, 0x03, 0x20, 0x40, 0x53, 0x00, - 0xe0, 0x11, 0x40, 0x00, 0x00, 0x10, 0x80, 0x00, - 0x00, 0xf1, 0xb5, 0x8b, 0xb0, 0xf8, 0x4a, 0xf9, - 0x4b, 0x10, 0x68, 0x51, 0x68, 0x54, 0x69, 0x04, - 0x30, 0xcf, 0x18, 0x61, 0x68, 0x05, 0x01, 0x05, - 0x91, 0xe0, 0x68, 0x2d, 0x09, 0x03, 0x28, 0x23, - 0xd1, 0xf8, 0xf7, 0xed, 0x09, 0x00, 0x87, 0x00, - 0xbb, 0xfa, 0x06, 0x1c, 0x1f, 0xd0, 0x20, 0x1c, - 0x05, 0xf0, 0x1b, 0xf8, 0x01, 0x20, 0x21, 0x1c, - 0x04, 0xf0, 0x75, 0xfb, 0x20, 0x1c, 0x04, 0xf0, - 0x1a, 0xfb, 0x3b, 0x20, 0x30, 0x60, 0xa0, 0x68, - 0xf0, 0x60, 0x00, 0x20, 0x30, 0x61, 0x0e, 0x20, - 0x31, 0x1c, 0xf8, 0xf7, 0x14, 0xfb, 0x04, 0x20, - 0xe0, 0x60, 0x01, 0x23, 0x02, 0x22, 0x00, 0x21, - 0x60, 0x68, 0xfa, 0xf7, 0x64, 0xf9, 0x0c, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe0, 0x1d, - 0x79, 0x30, 0x0a, 0x90, 0x40, 0x69, 0x08, 0x26, - 0x01, 0x28, 0x4e, 0xd1, 0x0a, 0x99, 0x09, 0x6b, - 0xa9, 0x42, 0x4a, 0xd2, 0xc8, 0x1d, 0x6d, 0x30, - 0xa8, 0x42, 0x20, 0xd9, 0x60, 0x6f, 0x00, 0x28, - 0x04, 0xd0, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, - 0x02, 0x28, 0x0e, 0xd1, 0xe0, 0x1d, 0x45, 0x30, - 0x04, 0xf0, 0x12, 0xf9, 0x00, 0x28, 0x08, 0xd1, - 0xe0, 0x1d, 0x4d, 0x30, 0x04, 0xf0, 0x0c, 0xf9, - 0x00, 0x28, 0x02, 0xd1, 0x06, 0xf0, 0x9d, 0xfc, - 0xd5, 0xe7, 0xe0, 0x1d, 0x45, 0x30, 0x04, 0xf0, - 0x03, 0xf9, 0x00, 0x28, 0x03, 0xd1, 0xe0, 0x1d, - 0x4d, 0x30, 0x04, 0xf0, 0xfd, 0xf8, 0xf8, 0xf7, - 0x67, 0xfa, 0x00, 0x28, 0x0e, 0xd0, 0x41, 0x21, - 0x01, 0x60, 0x61, 0x68, 0x81, 0x61, 0x44, 0x61, - 0x61, 0x68, 0x49, 0x68, 0x01, 0x61, 0x21, 0x7e, - 0xc1, 0x60, 0xc6, 0x61, 0x01, 0x1c, 0x0e, 0x20, - 0xf8, 0xf7, 0xc5, 0xfa, 0x0a, 0x98, 0x00, 0x26, - 0x46, 0x61, 0x0a, 0x98, 0x80, 0x69, 0x00, 0x28, - 0x08, 0xd0, 0x61, 0x68, 0x40, 0x68, 0x81, 0x42, - 0x04, 0xd0, 0x01, 0x23, 0x01, 0x22, 0x00, 0x21, - 0xfa, 0xf7, 0x0d, 0xf9, 0x0a, 0x98, 0x86, 0x61, - 0x0d, 0xe0, 0x04, 0x28, 0x0b, 0xd1, 0x0a, 0x98, - 0x00, 0x6b, 0x0a, 0x99, 0x01, 0x38, 0xed, 0x09, - 0x00, 0x88, 0x00, 0x08, 0x63, 0x05, 0xd1, 0x20, - 0x1c, 0x06, 0xf0, 0x31, 0xfb, 0x00, 0x28, 0x00, - 0xd0, 0x97, 0xe7, 0x0b, 0x98, 0x00, 0x28, 0x6b, - 0xd0, 0x29, 0x1c, 0x3a, 0x1c, 0x05, 0x98, 0x01, - 0xf0, 0xf4, 0xf8, 0x07, 0x1c, 0x60, 0x6e, 0x40, - 0x08, 0x03, 0xd3, 0x01, 0x21, 0x20, 0x1c, 0x04, - 0xf0, 0xd4, 0xfa, 0x00, 0x26, 0x26, 0x66, 0x0b, - 0x98, 0x40, 0x08, 0x05, 0xd3, 0x01, 0x20, 0x22, - 0x1c, 0x61, 0x68, 0xff, 0xf7, 0x82, 0xfe, 0x7c, - 0xe7, 0xe6, 0x1d, 0xf9, 0x36, 0x70, 0x69, 0x09, - 0x90, 0x00, 0x28, 0x1a, 0xd0, 0x09, 0x98, 0xc0, - 0x69, 0x00, 0x28, 0x16, 0xd0, 0xa9, 0x1e, 0x09, - 0x98, 0x08, 0x91, 0x00, 0x6a, 0x09, 0x1a, 0x09, - 0x98, 0x40, 0x6a, 0xf7, 0xf7, 0x84, 0xfd, 0x00, - 0x29, 0x0b, 0xd1, 0x09, 0x98, 0x97, 0x4b, 0x00, - 0x6d, 0xfa, 0x18, 0x03, 0x1c, 0x20, 0x1c, 0x08, - 0x99, 0x00, 0xf0, 0xfd, 0xfa, 0x20, 0x1c, 0xfc, - 0xf7, 0x62, 0xff, 0x60, 0x6a, 0xfd, 0x28, 0x37, - 0xd1, 0x70, 0x68, 0x01, 0x30, 0x70, 0x60, 0x30, - 0x69, 0x01, 0x30, 0x30, 0x61, 0x0b, 0x98, 0x00, - 0x09, 0x54, 0xd3, 0x60, 0x6f, 0x00, 0x28, 0x23, - 0xd0, 0xa0, 0x6b, 0x0a, 0x28, 0x4e, 0xd3, 0xe0, - 0x6b, 0xae, 0x1e, 0x31, 0x1a, 0x60, 0x6b, 0xf7, - 0xf7, 0x5e, 0xfd, 0x00, 0x29, 0x46, 0xd1, 0x84, - 0x4b, 0x20, 0x1c, 0xfa, 0x18, 0x31, 0x1c, 0x00, - 0xf0, 0xee, 0xf9, 0x60, 0x6f, 0xc0, 0x68, 0x0a, - 0x38, 0x06, 0x28, 0x3b, 0xd2, 0x02, 0xa3, 0x1b, - 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x03, - 0x03, 0x03, 0x03, 0x0a, 0x0a, 0x28, 0x1d, 0x05, - 0x01, 0x79, 0x4b, 0x2d, 0x09, 0xff, 0x18, 0x2d, - 0xe0, 0x2c, 0xe0, 0xe8, 0x1d, 0x01, 0x30, 0x05, - 0x01, 0x77, 0x4b, 0x2d, 0x09, 0xff, 0x18, 0x25, - 0xe0, 0xed, 0x09, 0x00, 0x89, 0x00, 0x00, 0x28, - 0x01, 0xd0, 0xff, 0x28, 0x21, 0xd1, 0x0b, 0x98, - 0x40, 0x0a, 0x05, 0xd3, 0x70, 0x68, 0x01, 0x30, - 0x70, 0x60, 0x30, 0x69, 0x01, 0x30, 0x30, 0x61, - 0x60, 0x68, 0xff, 0x30, 0x81, 0x30, 0x00, 0x69, - 0x80, 0x07, 0x12, 0xd1, 0x0a, 0x98, 0x40, 0x69, - 0x00, 0x28, 0x0e, 0xd1, 0xfb, 0xf7, 0xd8, 0xfb, - 0x69, 0x4b, 0x1a, 0x68, 0x5b, 0x68, 0x08, 0xf0, - 0x37, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x00, 0x20, - 0xfa, 0xf7, 0xf4, 0xf8, 0x00, 0x28, 0x00, 0xd0, - 0xfa, 0xe6, 0x64, 0x49, 0xff, 0x22, 0x38, 0x1c, - 0x09, 0x69, 0xb9, 0x32, 0xfc, 0xf7, 0xb2, 0xf9, - 0x00, 0x28, 0x05, 0xd1, 0x01, 0x20, 0x22, 0x1c, - 0x61, 0x68, 0xff, 0xf7, 0xf1, 0xfd, 0xeb, 0xe6, - 0x60, 0x68, 0xa1, 0x6a, 0x80, 0x30, 0xc2, 0x69, - 0x23, 0x69, 0x03, 0x92, 0x18, 0x0e, 0x1a, 0x02, - 0x12, 0x0a, 0x00, 0x92, 0x02, 0x91, 0x00, 0x21, - 0x00, 0x22, 0x1a, 0x23, 0x01, 0x90, 0x28, 0x1c, - 0xfc, 0xf7, 0xa4, 0xfb, 0x04, 0x90, 0x20, 0x69, - 0x00, 0x0e, 0x69, 0x08, 0x07, 0x91, 0x09, 0x02, - 0x08, 0x43, 0x51, 0x49, 0x48, 0x60, 0xe6, 0x1d, - 0xb9, 0x36, 0xb2, 0x68, 0x38, 0x1c, 0x03, 0x92, - 0x4e, 0x4a, 0x06, 0x92, 0x51, 0x69, 0x01, 0x29, - 0x75, 0xd0, 0x02, 0x29, 0x22, 0xd1, 0x09, 0x21, - 0x08, 0xf0, 0x18, 0xfa, 0xc8, 0x22, 0x08, 0xf0, - 0x1f, 0xfa, 0x34, 0x22, 0x08, 0xf0, 0x1c, 0xfa, - 0x50, 0x22, 0x08, 0xf0, 0x19, 0xfa, 0x0d, 0x22, - 0x08, 0xf0, 0x16, 0xfa, 0x04, 0x22, 0x08, 0xf0, - 0x13, 0xfa, 0x28, 0x22, 0x08, 0xf0, 0x10, 0xfa, - 0x04, 0x99, 0x02, 0x31, 0x09, 0x02, 0x10, 0x22, - 0x0a, 0x43, 0x3f, 0x49, 0x0a, 0x62, 0x03, 0x9a, - 0x42, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x11, 0x23, - 0x1a, 0x43, 0x4a, 0x62, 0xed, 0x09, 0x00, 0x8a, - 0x00, 0x3b, 0x4a, 0x3c, 0x49, 0x0a, 0x62, 0x08, - 0x60, 0xb1, 0x68, 0x06, 0x9a, 0x3a, 0x48, 0x52, - 0x69, 0x01, 0x2a, 0x59, 0xd0, 0x02, 0x2a, 0x05, - 0xd1, 0x40, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, - 0x23, 0x19, 0x43, 0x01, 0x62, 0xf8, 0x1d, 0x49, - 0x30, 0xff, 0x22, 0x34, 0x49, 0x02, 0x32, 0x0a, - 0x62, 0x08, 0x60, 0x33, 0x4a, 0xb0, 0x68, 0x11, - 0x6a, 0x52, 0x6a, 0x09, 0x0a, 0xff, 0x23, 0x1b, - 0x02, 0x1a, 0x40, 0x11, 0x43, 0x06, 0x9a, 0x52, - 0x69, 0x01, 0x2a, 0x3e, 0xd0, 0x02, 0x2a, 0x09, - 0xd1, 0xd2, 0x03, 0x08, 0x0c, 0x00, 0xd2, 0x00, - 0x22, 0x0a, 0x43, 0x01, 0x23, 0xdb, 0x03, 0x10, - 0x1c, 0x98, 0x43, 0x01, 0x1c, 0x03, 0x20, 0x00, - 0x04, 0x08, 0x40, 0x03, 0x23, 0x32, 0x6a, 0x1b, - 0x04, 0x13, 0x40, 0x03, 0x93, 0x23, 0x4b, 0x13, - 0x40, 0xdb, 0x00, 0x02, 0x93, 0x03, 0x9b, 0x98, - 0x42, 0x03, 0xd1, 0x02, 0x9b, 0x9a, 0x1a, 0x51, - 0x18, 0xc9, 0x08, 0x01, 0x22, 0x12, 0x04, 0x00, - 0x28, 0x00, 0xd1, 0x00, 0x22, 0x0a, 0x43, 0x32, - 0x62, 0x06, 0x9a, 0x38, 0x1c, 0x51, 0x69, 0x01, - 0x29, 0x00, 0xe0, 0x82, 0xe0, 0x73, 0xd0, 0x02, - 0x29, 0x05, 0xd1, 0x15, 0x49, 0x2d, 0x22, 0x0a, - 0x62, 0x2c, 0x22, 0x4a, 0x62, 0x3c, 0x38, 0x14, - 0x4a, 0x14, 0x49, 0x0a, 0x62, 0x08, 0x60, 0x0b, - 0x98, 0x13, 0x4b, 0x18, 0x40, 0x57, 0xd1, 0x25, - 0xe0, 0x92, 0xe0, 0x98, 0xe0, 0x68, 0x14, 0x04, - 0x20, 0xc4, 0x09, 0x00, 0x00, 0x1e, 0xfb, 0xff, - 0xff, 0x88, 0x13, 0x00, 0x00, 0x70, 0x14, 0x04, - 0x20, 0x00, 0x50, 0x00, 0xe0, 0x00, 0x51, 0x00, - 0xe0, 0x48, 0xe6, 0x03, 0x20, 0xa0, 0x55, 0x00, - 0xe0, 0x02, 0x05, 0x00, 0x00, 0x08, 0x53, 0x00, - 0xe0, 0xb0, 0x55, 0x00, 0xe0, 0x0c, 0x53, 0xed, - 0x09, 0x00, 0x8b, 0x00, 0x00, 0xe0, 0xd0, 0x55, - 0x00, 0xe0, 0xff, 0xff, 0xfc, 0xff, 0x02, 0x03, - 0x00, 0x00, 0x14, 0x53, 0x00, 0xe0, 0x09, 0x00, - 0x00, 0x40, 0x5b, 0x4a, 0xb1, 0x68, 0x10, 0x6a, - 0x52, 0x6a, 0x00, 0x0a, 0xff, 0x23, 0x1b, 0x02, - 0x1a, 0x40, 0x10, 0x43, 0x06, 0x9a, 0x52, 0x69, - 0x01, 0x2a, 0x5f, 0xd0, 0x02, 0x2a, 0x07, 0xd1, - 0xd2, 0x03, 0x01, 0x0c, 0x00, 0xd2, 0x00, 0x22, - 0x10, 0x43, 0x01, 0x23, 0xdb, 0x03, 0x98, 0x43, - 0x03, 0x22, 0x12, 0x04, 0x02, 0x40, 0x03, 0x23, - 0xf1, 0x69, 0x1b, 0x04, 0x0b, 0x40, 0x03, 0x93, - 0x4d, 0x4b, 0x0b, 0x40, 0xdb, 0x00, 0x02, 0x93, - 0x03, 0x9b, 0x9a, 0x42, 0x03, 0xd1, 0x02, 0x9b, - 0x59, 0x1a, 0x08, 0x18, 0xc0, 0x08, 0x01, 0x21, - 0x09, 0x04, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x21, - 0x08, 0x43, 0xf0, 0x61, 0x06, 0x9a, 0x50, 0x69, - 0x01, 0x28, 0x54, 0xd0, 0x02, 0x28, 0x06, 0xd1, - 0x40, 0x48, 0x2d, 0x22, 0x02, 0x62, 0x2c, 0x22, - 0x42, 0x62, 0x00, 0xe0, 0x3d, 0xe0, 0x3e, 0x4a, - 0x3f, 0x49, 0xf8, 0x1d, 0x21, 0x30, 0x0a, 0x62, - 0x08, 0x60, 0xb6, 0x6b, 0xe1, 0x6a, 0x38, 0x1c, - 0x00, 0x29, 0x46, 0xd0, 0x05, 0x24, 0x45, 0xe0, - 0x10, 0x21, 0x08, 0xf0, 0x20, 0xf9, 0xff, 0x22, - 0x05, 0x32, 0x08, 0xf0, 0x26, 0xf9, 0x46, 0x22, - 0x08, 0xf0, 0x23, 0xf9, 0x0d, 0x22, 0x08, 0xf0, - 0x20, 0xf9, 0x04, 0x22, 0x08, 0xf0, 0x1d, 0xf9, - 0x28, 0x22, 0x08, 0xf0, 0x1a, 0xf9, 0x04, 0x99, - 0x02, 0x31, 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, - 0x2e, 0x49, 0x0a, 0x62, 0x03, 0x9a, 0x82, 0x23, - 0x1a, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, - 0x4a, 0x62, 0x08, 0xe7, 0x14, 0xe0, 0x80, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, - 0x01, 0x62, 0xed, 0x09, 0x00, 0x8c, 0x00, 0x12, - 0xe7, 0x01, 0x22, 0x12, 0x04, 0x00, 0x28, 0x00, - 0xd1, 0x00, 0x22, 0x11, 0x43, 0x2b, 0xe7, 0x22, - 0x49, 0x3d, 0x22, 0x0a, 0x62, 0x3e, 0x22, 0x4a, - 0x62, 0x46, 0x38, 0x4d, 0xe7, 0x01, 0x22, 0x12, - 0x04, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x22, 0x10, - 0x43, 0x8c, 0xe7, 0x16, 0x48, 0x3d, 0x22, 0x02, - 0x62, 0x3e, 0x22, 0x42, 0x62, 0xad, 0xe7, 0x01, - 0x24, 0x06, 0x9a, 0x51, 0x69, 0x01, 0x29, 0x1a, - 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x09, 0x21, 0x08, - 0xf0, 0xd4, 0xf8, 0xc2, 0x1f, 0x14, 0x49, 0x21, - 0x3a, 0x8a, 0x60, 0xb0, 0x30, 0xc8, 0x60, 0x01, - 0x2e, 0x01, 0xd0, 0x03, 0x2e, 0x04, 0xd1, 0x07, - 0x98, 0x10, 0x4a, 0x08, 0x23, 0x1c, 0x43, 0x10, - 0x60, 0x32, 0x20, 0x0c, 0x60, 0x08, 0xf0, 0x63, - 0xfe, 0x0d, 0x4a, 0xa0, 0xc2, 0x67, 0xe5, 0x10, - 0x21, 0x08, 0xf0, 0xbb, 0xf8, 0x02, 0xaa, 0x03, - 0xc2, 0x02, 0x98, 0x03, 0x99, 0xe1, 0xe7, 0xc0, - 0x55, 0x00, 0xe0, 0xff, 0xff, 0xfc, 0xff, 0x02, - 0x03, 0x00, 0x00, 0x10, 0x53, 0x00, 0xe0, 0xa0, - 0x55, 0x00, 0xe0, 0xd0, 0x55, 0x00, 0xe0, 0x00, - 0x51, 0x00, 0xe0, 0x80, 0x55, 0x00, 0xe0, 0x68, - 0x14, 0x04, 0x20, 0xf0, 0xb5, 0x87, 0xb0, 0x07, - 0x1c, 0x00, 0x20, 0x78, 0x64, 0x0d, 0x1c, 0x00, - 0x21, 0x38, 0x1c, 0x14, 0x1c, 0x03, 0xf0, 0x7a, - 0xfe, 0x78, 0x6f, 0x00, 0x28, 0x73, 0xd0, 0x2d, - 0x01, 0x78, 0x68, 0x2d, 0x09, 0x80, 0x30, 0xc2, - 0x69, 0xb9, 0x6a, 0x3b, 0x69, 0x03, 0x92, 0x18, - 0x0e, 0x1a, 0x02, 0x12, 0x0a, 0x00, 0x92, 0x02, - 0x91, 0x00, 0x21, 0x00, 0x22, 0x1a, 0x23, 0x01, - 0x90, 0x28, 0x1c, 0xfc, 0xf7, 0xf6, 0xf9, 0x04, - 0x90, 0x38, 0x69, 0x00, 0x0e, 0x69, 0x08, 0x06, - 0x91, 0x09, 0x02, 0x08, 0x43, 0xed, 0x09, 0x00, - 0x8d, 0x00, 0x59, 0x49, 0x48, 0x60, 0xfd, 0x1d, - 0xb9, 0x35, 0x2a, 0x69, 0xee, 0x68, 0x02, 0x92, - 0x6a, 0x69, 0x56, 0x48, 0x03, 0x92, 0x05, 0x90, - 0x40, 0x69, 0x01, 0x28, 0x4d, 0xd0, 0x02, 0x28, - 0x2c, 0xd1, 0x53, 0x49, 0x03, 0x20, 0xc8, 0x62, - 0x06, 0x21, 0x20, 0x1c, 0x08, 0xf0, 0x76, 0xf8, - 0xc8, 0x22, 0x08, 0xf0, 0x6b, 0xf8, 0x02, 0x9a, - 0x52, 0x00, 0x08, 0xf0, 0x67, 0xf8, 0x28, 0x22, - 0x08, 0xf0, 0x64, 0xf8, 0x03, 0x22, 0x08, 0xf0, - 0x71, 0xf8, 0x04, 0x99, 0x48, 0x4a, 0x02, 0x31, - 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x11, 0x62, - 0xf1, 0x00, 0x44, 0x23, 0x19, 0x43, 0x09, 0x02, - 0x11, 0x23, 0x19, 0x43, 0x51, 0x62, 0x03, 0x9a, - 0x11, 0x02, 0x16, 0x23, 0x40, 0x4a, 0x19, 0x43, - 0x91, 0x62, 0x40, 0x49, 0x08, 0x60, 0x05, 0x20, - 0x00, 0x02, 0x08, 0x62, 0xe9, 0x68, 0x05, 0x98, - 0x42, 0x69, 0x3d, 0x48, 0x01, 0x2a, 0x42, 0xd0, - 0x02, 0x2a, 0x06, 0xd1, 0xc9, 0x00, 0x40, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, - 0x01, 0x62, 0xe0, 0x1d, 0x5d, 0x30, 0xff, 0x22, - 0x36, 0x49, 0x02, 0x32, 0x0a, 0x62, 0x08, 0x60, - 0xae, 0x6b, 0xf9, 0x6a, 0x20, 0x1c, 0x00, 0x29, - 0x35, 0xd0, 0x00, 0xe0, 0x4c, 0xe0, 0x05, 0x25, - 0x32, 0xe0, 0x06, 0x21, 0x20, 0x1c, 0x08, 0xf0, - 0x2d, 0xf8, 0xff, 0x22, 0x05, 0x32, 0x08, 0xf0, - 0x21, 0xf8, 0x02, 0x9a, 0x52, 0x00, 0x08, 0xf0, - 0x1d, 0xf8, 0x28, 0x22, 0x08, 0xf0, 0x1a, 0xf8, - 0x03, 0x22, 0x08, 0xf0, 0x27, 0xf8, 0x04, 0x99, - 0x02, 0x31, 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, - 0x21, 0x49, 0x0a, 0x62, 0xf2, 0x00, 0x84, 0x23, - 0x1a, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, - 0x4a, 0x62, 0x03, 0x9a, 0x12, 0x02, 0x19, 0x23, - 0xed, 0x09, 0x00, 0x8e, 0x00, 0x1a, 0x43, 0x8a, - 0x62, 0x1b, 0x49, 0x08, 0x60, 0x1d, 0x48, 0x08, - 0x62, 0xb6, 0xe7, 0xc9, 0x00, 0x80, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x01, - 0x62, 0xbd, 0xe7, 0x01, 0x25, 0x05, 0x99, 0x49, - 0x69, 0x01, 0x29, 0x17, 0xd0, 0x02, 0x29, 0x02, - 0xd1, 0x06, 0x21, 0x07, 0xf0, 0xf5, 0xff, 0x0d, - 0x49, 0x88, 0x60, 0x02, 0x2e, 0x01, 0xd0, 0x03, - 0x2e, 0x04, 0xd1, 0x06, 0x98, 0x10, 0x4a, 0x08, - 0x23, 0x1d, 0x43, 0x10, 0x60, 0x0d, 0x60, 0x78, - 0x6f, 0xfb, 0xf7, 0x4c, 0xfd, 0x07, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x06, 0x21, 0x07, - 0xf0, 0xdf, 0xff, 0x02, 0xaa, 0x03, 0xc2, 0x02, - 0x98, 0x03, 0x99, 0xe4, 0xe7, 0x00, 0x52, 0x00, - 0xe0, 0x48, 0xe6, 0x03, 0x20, 0x80, 0x55, 0x00, - 0xe0, 0x00, 0x53, 0x00, 0xe0, 0x90, 0x55, 0x00, - 0xe0, 0x04, 0x53, 0x00, 0xe0, 0x03, 0x05, 0x00, - 0x00, 0x80, 0x57, 0x00, 0xe0, 0xf0, 0xb5, 0x87, - 0xb0, 0x0d, 0x1c, 0x19, 0x1c, 0x14, 0x1c, 0x07, - 0x1c, 0xfc, 0xf7, 0x11, 0xfd, 0xb8, 0x6f, 0x00, - 0x28, 0x73, 0xd0, 0x2d, 0x01, 0x78, 0x68, 0x2d, - 0x09, 0x80, 0x30, 0xc2, 0x69, 0xb9, 0x6a, 0x3b, - 0x69, 0x03, 0x92, 0x18, 0x0e, 0x1a, 0x02, 0x12, - 0x0a, 0x00, 0x92, 0x02, 0x91, 0x00, 0x21, 0x00, - 0x22, 0x1a, 0x23, 0x01, 0x90, 0x28, 0x1c, 0xfc, - 0xf7, 0x0d, 0xf9, 0x04, 0x90, 0x38, 0x69, 0x00, - 0x0e, 0x69, 0x08, 0x06, 0x91, 0x09, 0x02, 0x08, - 0x43, 0x59, 0x49, 0x48, 0x60, 0xfd, 0x1d, 0xb9, - 0x35, 0x2a, 0x69, 0xee, 0x68, 0x02, 0x92, 0x6a, - 0x69, 0x56, 0x48, 0x03, 0x92, 0x05, 0x90, 0x40, - 0x69, 0x01, 0x28, 0x4d, 0xd0, 0x02, 0x28, 0x2c, - 0xd1, 0x53, 0x49, 0x03, 0x20, 0xc8, 0x62, 0x06, - 0x21, 0x20, 0x1c, 0xed, 0x09, 0x00, 0x8f, 0x00, - 0x07, 0xf0, 0x8d, 0xff, 0xc8, 0x22, 0x07, 0xf0, - 0x82, 0xff, 0x02, 0x9a, 0x52, 0x00, 0x07, 0xf0, - 0x7e, 0xff, 0x28, 0x22, 0x07, 0xf0, 0x7b, 0xff, - 0x03, 0x22, 0x07, 0xf0, 0x88, 0xff, 0x04, 0x99, - 0x49, 0x4a, 0x02, 0x31, 0x09, 0x02, 0x10, 0x23, - 0x19, 0x43, 0x11, 0x62, 0xf1, 0x00, 0x44, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, - 0x51, 0x62, 0x03, 0x9a, 0x11, 0x02, 0x16, 0x23, - 0x41, 0x4a, 0x19, 0x43, 0x91, 0x62, 0x40, 0x49, - 0x08, 0x60, 0x05, 0x20, 0x00, 0x02, 0x08, 0x62, - 0xe9, 0x68, 0x05, 0x98, 0x42, 0x69, 0x3d, 0x48, - 0x01, 0x2a, 0x42, 0xd0, 0x02, 0x2a, 0x06, 0xd1, - 0xc9, 0x00, 0x40, 0x23, 0x19, 0x43, 0x09, 0x02, - 0x11, 0x23, 0x19, 0x43, 0x01, 0x62, 0xe0, 0x1d, - 0x5d, 0x30, 0xff, 0x22, 0x37, 0x49, 0x02, 0x32, - 0x0a, 0x62, 0x08, 0x60, 0xae, 0x6b, 0xf9, 0x6a, - 0x20, 0x1c, 0x00, 0x29, 0x35, 0xd0, 0x00, 0xe0, - 0x4c, 0xe0, 0x05, 0x25, 0x32, 0xe0, 0x06, 0x21, - 0x20, 0x1c, 0x07, 0xf0, 0x44, 0xff, 0xff, 0x22, - 0x05, 0x32, 0x07, 0xf0, 0x38, 0xff, 0x02, 0x9a, - 0x52, 0x00, 0x07, 0xf0, 0x34, 0xff, 0x28, 0x22, - 0x07, 0xf0, 0x31, 0xff, 0x03, 0x22, 0x07, 0xf0, - 0x3e, 0xff, 0x04, 0x99, 0x02, 0x31, 0x09, 0x02, - 0x20, 0x22, 0x0a, 0x43, 0x22, 0x49, 0x0a, 0x62, - 0xf2, 0x00, 0x84, 0x23, 0x1a, 0x43, 0x12, 0x02, - 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x03, 0x9a, - 0x12, 0x02, 0x19, 0x23, 0x1a, 0x43, 0x8a, 0x62, - 0x1c, 0x49, 0x08, 0x60, 0x1e, 0x48, 0x08, 0x62, - 0xb6, 0xe7, 0xc9, 0x00, 0x80, 0x23, 0x19, 0x43, - 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x01, 0x62, - 0xbd, 0xe7, 0x01, 0x25, 0x05, 0x99, 0x49, 0x69, - 0x01, 0x29, 0x17, 0xd0, 0x02, 0x29, 0xed, 0x09, - 0x00, 0x90, 0x00, 0x02, 0xd1, 0x06, 0x21, 0x07, - 0xf0, 0x0c, 0xff, 0x0d, 0x49, 0x88, 0x60, 0x02, - 0x2e, 0x01, 0xd0, 0x03, 0x2e, 0x04, 0xd1, 0x06, - 0x98, 0x11, 0x4a, 0x08, 0x23, 0x1d, 0x43, 0x10, - 0x60, 0x0d, 0x60, 0xb8, 0x6f, 0xfb, 0xf7, 0x63, - 0xfc, 0x07, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x06, 0x21, 0x07, 0xf0, 0xf6, 0xfe, 0x02, - 0xaa, 0x03, 0xc2, 0x02, 0x98, 0x03, 0x99, 0xe4, - 0xe7, 0x00, 0x00, 0x00, 0x52, 0x00, 0xe0, 0x48, - 0xe6, 0x03, 0x20, 0x80, 0x55, 0x00, 0xe0, 0x00, - 0x53, 0x00, 0xe0, 0x90, 0x55, 0x00, 0xe0, 0x04, - 0x53, 0x00, 0xe0, 0x03, 0x05, 0x00, 0x00, 0x80, - 0x57, 0x00, 0xe0, 0xf0, 0xb5, 0x00, 0x24, 0xc6, - 0x1d, 0xb9, 0x36, 0xcc, 0x60, 0x05, 0x1c, 0xf0, - 0x69, 0x0f, 0x1c, 0x88, 0x64, 0x08, 0x6b, 0x00, - 0x28, 0x02, 0xd0, 0xf7, 0xf7, 0x02, 0xfe, 0x3c, - 0x63, 0xf8, 0x69, 0x00, 0x28, 0x02, 0xd0, 0xf7, - 0xf7, 0xfc, 0xfd, 0xfc, 0x61, 0xf7, 0xf7, 0xfe, - 0xfd, 0x04, 0x1c, 0x05, 0xd1, 0x38, 0x1c, 0xf7, - 0xf7, 0x5a, 0xfe, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x35, 0x20, 0x20, 0x60, 0x68, 0x68, 0x40, - 0x68, 0xe0, 0x60, 0x0e, 0x20, 0x21, 0x1c, 0x27, - 0x61, 0xf7, 0xf7, 0x5b, 0xfe, 0x00, 0x28, 0x06, - 0xd0, 0x38, 0x1c, 0xf7, 0xf7, 0x48, 0xfe, 0x20, - 0x1c, 0xf7, 0xf7, 0x1f, 0xfe, 0xe9, 0xe7, 0x70, - 0x6a, 0x01, 0x38, 0x70, 0x62, 0xe5, 0xe7, 0xf0, - 0xb5, 0x99, 0xb0, 0xfb, 0x48, 0x47, 0x69, 0x44, - 0x68, 0x05, 0x68, 0x78, 0x68, 0x0f, 0x90, 0x00, - 0x20, 0x08, 0x90, 0xf8, 0x48, 0x00, 0x26, 0x00, - 0x69, 0x04, 0x90, 0xfa, 0xf7, 0xec, 0xff, 0x05, - 0x90, 0xf6, 0x48, 0x06, 0x91, 0x18, 0x90, 0x40, - 0x69, 0x01, 0x28, 0x2a, 0xd0, 0x02, 0x28, 0x04, - 0xd1, 0xed, 0x09, 0x00, 0x91, 0x00, 0x8e, 0x21, - 0x04, 0x98, 0x07, 0xf0, 0x8d, 0xfe, 0x04, 0x90, - 0x04, 0x98, 0x05, 0x99, 0x88, 0x42, 0x02, 0xd9, - 0x06, 0x98, 0x01, 0x38, 0x06, 0x90, 0x04, 0x98, - 0x06, 0x99, 0x05, 0x90, 0x10, 0x90, 0xeb, 0x48, - 0x11, 0x91, 0x80, 0x6a, 0x41, 0x07, 0x49, 0x0f, - 0x42, 0x06, 0x0d, 0xab, 0x19, 0x70, 0x12, 0x0f, - 0x0e, 0x92, 0x02, 0x06, 0xd2, 0x0f, 0x5a, 0x70, - 0xc2, 0x05, 0xd2, 0x0f, 0x80, 0x05, 0xc0, 0x0f, - 0x9a, 0x70, 0xd8, 0x70, 0x38, 0x7e, 0x88, 0x42, - 0x08, 0xd0, 0x01, 0x21, 0x0b, 0x91, 0x71, 0xe0, - 0x95, 0x21, 0x04, 0x98, 0x07, 0xf0, 0x64, 0xfe, - 0x04, 0x90, 0xd5, 0xe7, 0x00, 0x21, 0x0b, 0x91, - 0x0d, 0xa8, 0x80, 0x78, 0x01, 0x28, 0x47, 0xd1, - 0xf8, 0x68, 0x03, 0x28, 0x07, 0xd1, 0x2c, 0xf0, - 0xe7, 0xfb, 0x00, 0x22, 0x01, 0x21, 0x38, 0x1c, - 0x03, 0xf0, 0x93, 0xfd, 0x3c, 0xe0, 0x78, 0x6f, - 0x07, 0x90, 0x00, 0x28, 0x38, 0xd0, 0x78, 0x6a, - 0xfd, 0x28, 0x35, 0xd0, 0xf8, 0x1d, 0x79, 0x30, - 0x17, 0x90, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, - 0x78, 0x67, 0x2d, 0xe0, 0x38, 0x1c, 0x03, 0xf0, - 0x99, 0xfe, 0x00, 0x28, 0x1b, 0xd1, 0x07, 0x98, - 0xc9, 0x49, 0xc0, 0x68, 0xc3, 0x00, 0x18, 0x18, - 0x80, 0x00, 0x40, 0x18, 0xc0, 0x69, 0x00, 0x28, - 0x0c, 0xd0, 0x01, 0x21, 0xfa, 0x6d, 0x08, 0x1c, - 0x00, 0x2a, 0x00, 0xd0, 0x00, 0x20, 0xf8, 0x65, - 0xf8, 0x1d, 0xb9, 0x30, 0xf9, 0x66, 0xc1, 0x6b, - 0x01, 0x31, 0xc1, 0x63, 0x07, 0x98, 0x39, 0x1c, - 0x03, 0xf0, 0x77, 0xfe, 0x0c, 0xe0, 0x17, 0x98, - 0x40, 0x68, 0x17, 0x99, 0x08, 0x90, 0x00, 0x20, - 0x48, 0x60, 0x07, 0x99, 0xce, 0x6b, 0xc8, 0x63, - 0x17, 0x99, 0xc9, 0x68, 0x09, 0x91, 0x78, 0x67, - 0x78, 0x6e, 0x40, 0x08, 0xed, 0x09, 0x00, 0x92, - 0x00, 0x07, 0xd3, 0x0d, 0xa8, 0x40, 0x78, 0x00, - 0x28, 0x03, 0xd0, 0x01, 0x21, 0x38, 0x1c, 0x03, - 0xf0, 0xed, 0xfd, 0x78, 0x6e, 0x40, 0x08, 0x07, - 0xd2, 0x0d, 0xa8, 0x40, 0x78, 0x00, 0x28, 0x03, - 0xd1, 0x01, 0x21, 0x38, 0x1c, 0x03, 0xf0, 0xc8, - 0xfd, 0xf8, 0x1d, 0xf9, 0x30, 0x41, 0x68, 0x01, - 0x31, 0x41, 0x60, 0x0d, 0xa8, 0x80, 0x78, 0x78, - 0x64, 0x38, 0x7e, 0x0d, 0xa9, 0x09, 0x78, 0x88, - 0x42, 0x09, 0xd1, 0x10, 0x98, 0x11, 0x99, 0x22, - 0x1a, 0x0f, 0x98, 0x29, 0x1c, 0x00, 0xf0, 0x96, - 0xfb, 0x24, 0x1a, 0x00, 0x20, 0xb8, 0x64, 0x00, - 0x20, 0x0a, 0x90, 0x0e, 0x98, 0x10, 0x28, 0x44, - 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, - 0x44, 0x40, 0x3d, 0x40, 0x33, 0x33, 0x07, 0x07, - 0x07, 0x31, 0x40, 0x0c, 0x0c, 0x16, 0x16, 0x1e, - 0x1e, 0x01, 0x20, 0x0a, 0x90, 0x0e, 0x98, 0x0c, - 0x90, 0x35, 0xe0, 0x0d, 0xa9, 0xc9, 0x78, 0x38, - 0x6c, 0x88, 0x42, 0x02, 0xd1, 0x01, 0x21, 0x39, - 0x66, 0x01, 0xe0, 0x00, 0x20, 0x38, 0x66, 0x00, - 0x20, 0x0c, 0x90, 0x28, 0x1d, 0x05, 0x01, 0x8e, - 0x4b, 0x2d, 0x09, 0xe4, 0x18, 0x23, 0xe0, 0x0d, - 0xa9, 0xc9, 0x78, 0x38, 0x6c, 0x88, 0x42, 0x02, - 0xd1, 0x01, 0x21, 0x39, 0x66, 0x01, 0xe0, 0x00, - 0x20, 0x38, 0x66, 0x00, 0x20, 0x0c, 0x90, 0xe8, - 0x1d, 0x01, 0x30, 0x05, 0x01, 0x85, 0x4b, 0x2d, - 0x09, 0xe4, 0x18, 0x10, 0xe0, 0x01, 0x20, 0x0a, - 0x90, 0x0d, 0xa9, 0xc9, 0x78, 0x38, 0x6c, 0x88, - 0x42, 0x02, 0xd1, 0x01, 0x21, 0x39, 0x66, 0x01, - 0xe0, 0x00, 0x20, 0x38, 0x66, 0x00, 0x20, 0x0c, - 0x90, 0x01, 0xe0, 0x11, 0x20, 0x0c, 0x90, 0x0b, - 0x99, 0x7b, 0x48, 0x01, 0x29, 0x0f, 0xd1, 0x73, - 0x49, 0x4c, 0x60, 0x0d, 0x60, 0x72, 0x49, 0xed, - 0x09, 0x00, 0x93, 0x00, 0x00, 0x25, 0x0d, 0x60, - 0x17, 0x21, 0x49, 0x01, 0xc1, 0x60, 0x00, 0x20, - 0xff, 0xf7, 0xf3, 0xf9, 0x19, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x0e, 0x99, 0x01, 0x29, - 0x09, 0xd1, 0x79, 0x6a, 0xfd, 0x29, 0x06, 0xd1, - 0xb9, 0x6b, 0x0a, 0x29, 0x01, 0xd2, 0x01, 0x31, - 0xb9, 0x63, 0xa9, 0x1c, 0xf9, 0x63, 0x0e, 0x99, - 0x03, 0x29, 0x03, 0xd0, 0x04, 0x29, 0x01, 0xd0, - 0x08, 0x29, 0x22, 0xd1, 0x00, 0x68, 0x80, 0x09, - 0x1f, 0xd3, 0x62, 0x48, 0x00, 0x6a, 0x06, 0xab, - 0x18, 0x70, 0x06, 0x98, 0x80, 0x07, 0x80, 0x0f, - 0x03, 0x28, 0x14, 0xd0, 0x78, 0x6e, 0x02, 0x23, - 0x18, 0x40, 0x07, 0xd0, 0x06, 0x99, 0xc9, 0x08, - 0x04, 0xd3, 0x02, 0x21, 0x38, 0x1c, 0x03, 0xf0, - 0x40, 0xfd, 0x08, 0xe0, 0x00, 0x28, 0x06, 0xd1, - 0x06, 0x98, 0xc0, 0x08, 0x03, 0xd2, 0x02, 0x21, - 0x38, 0x1c, 0x03, 0xf0, 0x1c, 0xfd, 0x01, 0x21, - 0x39, 0x66, 0x0a, 0x98, 0x01, 0x28, 0x1a, 0xd1, - 0xf8, 0x1d, 0xf9, 0x30, 0x16, 0x90, 0x40, 0x69, - 0x15, 0x90, 0x00, 0x28, 0x13, 0xd0, 0xa9, 0x1c, - 0x15, 0x98, 0x14, 0x91, 0x40, 0x6a, 0xf6, 0xf7, - 0xf2, 0xff, 0x15, 0x98, 0x4f, 0x4b, 0x01, 0x62, - 0x16, 0x98, 0x01, 0x21, 0x40, 0x69, 0xe2, 0x18, - 0xc1, 0x61, 0x14, 0x99, 0x0c, 0x9b, 0x38, 0x1c, - 0xff, 0xf7, 0x69, 0xfd, 0x7d, 0xe0, 0x0c, 0x99, - 0x38, 0x1c, 0x03, 0xf0, 0xfd, 0xfa, 0x78, 0x6f, - 0x00, 0x28, 0x76, 0xd0, 0x45, 0x4b, 0xa8, 0x1c, - 0xe1, 0x18, 0x00, 0x01, 0x00, 0x09, 0x05, 0x90, - 0x04, 0x91, 0x78, 0x68, 0xb9, 0x6a, 0x80, 0x30, - 0xc2, 0x69, 0x3b, 0x69, 0x03, 0x92, 0x18, 0x0e, - 0x1a, 0x02, 0x12, 0x0a, 0x00, 0x92, 0x00, 0x22, - 0x1a, 0x23, 0x01, 0x90, 0x02, 0x91, 0x00, 0x21, - 0x05, 0x98, 0xed, 0x09, 0x00, 0x94, 0x00, 0xfb, - 0xf7, 0x74, 0xfe, 0x06, 0x90, 0x38, 0x69, 0x05, - 0x99, 0x00, 0x0e, 0x49, 0x08, 0x13, 0x91, 0x09, - 0x02, 0x08, 0x43, 0x35, 0x49, 0x48, 0x60, 0xf8, - 0x1d, 0xb9, 0x30, 0x12, 0x90, 0x04, 0x99, 0xc2, - 0x68, 0x01, 0x92, 0x02, 0x69, 0x02, 0x92, 0x40, - 0x69, 0x03, 0x90, 0x18, 0x98, 0x40, 0x69, 0x01, - 0x28, 0x48, 0xd0, 0x02, 0x28, 0x2d, 0xd1, 0x2d, - 0x4a, 0x03, 0x20, 0xd0, 0x62, 0x08, 0x1c, 0x06, - 0x21, 0x07, 0xf0, 0xf1, 0xfc, 0xc8, 0x22, 0x07, - 0xf0, 0xe6, 0xfc, 0x02, 0x9a, 0x52, 0x00, 0x07, - 0xf0, 0xe2, 0xfc, 0x28, 0x22, 0x07, 0xf0, 0xdf, - 0xfc, 0x03, 0x22, 0x07, 0xf0, 0xec, 0xfc, 0x06, - 0x99, 0x23, 0x4a, 0x02, 0x31, 0x09, 0x02, 0x10, - 0x23, 0x19, 0x43, 0x11, 0x62, 0x01, 0x9a, 0xd1, - 0x00, 0x44, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, - 0x23, 0x1d, 0x4a, 0x19, 0x43, 0x51, 0x62, 0x03, - 0x99, 0x09, 0x02, 0x16, 0x23, 0x19, 0x43, 0x91, - 0x62, 0x1a, 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, - 0x02, 0x08, 0x62, 0x12, 0x98, 0x04, 0x99, 0xc2, - 0x68, 0x18, 0x98, 0x43, 0x69, 0x16, 0x48, 0x01, - 0x2b, 0x64, 0xd0, 0x02, 0x2b, 0x06, 0xd1, 0xd2, - 0x00, 0x40, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x11, - 0x23, 0x1a, 0x43, 0x02, 0x62, 0xc8, 0x1d, 0x5d, - 0x30, 0xff, 0x22, 0x02, 0x32, 0x00, 0xe0, 0x9d, - 0xe0, 0x0e, 0x49, 0x1c, 0xe0, 0x27, 0xe0, 0x68, - 0x14, 0x04, 0x20, 0x00, 0x51, 0x00, 0xe0, 0x48, - 0xe6, 0x03, 0x20, 0x40, 0x55, 0x00, 0xe0, 0x78, - 0x7b, 0x03, 0x20, 0xc4, 0x09, 0x00, 0x00, 0x88, - 0x13, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, 0xe2, - 0x04, 0x00, 0x00, 0x00, 0x52, 0x00, 0xe0, 0x80, - 0x55, 0x00, 0xe0, 0x00, 0x53, 0x00, 0xe0, 0x90, - 0x55, 0x00, 0xe0, 0x04, 0x53, 0xed, 0x09, 0x00, - 0x95, 0x00, 0x00, 0xe0, 0x0a, 0x62, 0x08, 0x60, - 0x12, 0x99, 0x04, 0x98, 0x89, 0x6b, 0x03, 0x91, - 0xf9, 0x6a, 0x00, 0x29, 0x36, 0xd0, 0x05, 0x21, - 0x02, 0x91, 0x35, 0xe0, 0x08, 0x1c, 0x06, 0x21, - 0x07, 0xf0, 0x84, 0xfc, 0xff, 0x22, 0x05, 0x32, - 0x07, 0xf0, 0x78, 0xfc, 0x02, 0x9a, 0x52, 0x00, - 0x07, 0xf0, 0x74, 0xfc, 0x28, 0x22, 0x07, 0xf0, - 0x71, 0xfc, 0x03, 0x22, 0x07, 0xf0, 0x7e, 0xfc, - 0x06, 0x99, 0x02, 0x31, 0x09, 0x02, 0x20, 0x22, - 0x0a, 0x43, 0x59, 0x49, 0x0a, 0x62, 0x01, 0x9a, - 0xd2, 0x00, 0x84, 0x23, 0x1a, 0x43, 0x12, 0x02, - 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x03, 0x9a, - 0x12, 0x02, 0x19, 0x23, 0x1a, 0x43, 0x8a, 0x62, - 0x52, 0x49, 0x08, 0x60, 0x52, 0x48, 0x08, 0x62, - 0x92, 0xe7, 0xff, 0xe7, 0xd2, 0x00, 0x80, 0x23, - 0x1a, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, - 0x02, 0x62, 0x9a, 0xe7, 0x01, 0x21, 0x02, 0x91, - 0x18, 0x99, 0x49, 0x69, 0x01, 0x29, 0x24, 0xd0, - 0x02, 0x29, 0x02, 0xd1, 0x06, 0x21, 0x07, 0xf0, - 0x49, 0xfc, 0x48, 0x49, 0x88, 0x60, 0x03, 0x98, - 0x02, 0x28, 0x02, 0xd0, 0x03, 0x98, 0x03, 0x28, - 0x06, 0xd1, 0x02, 0x98, 0x08, 0x23, 0x18, 0x43, - 0x02, 0x90, 0x13, 0x98, 0x42, 0x4a, 0x10, 0x60, - 0x02, 0x98, 0x08, 0x60, 0x78, 0x6f, 0xfb, 0xf7, - 0x9b, 0xf9, 0x78, 0x6f, 0xc0, 0x68, 0x0a, 0x38, - 0x06, 0x28, 0x1a, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, - 0x5b, 0x00, 0x9f, 0x44, 0x0a, 0x0a, 0x0a, 0x0a, - 0x10, 0x10, 0x06, 0x21, 0x07, 0xf0, 0x26, 0xfc, - 0x6a, 0x46, 0x03, 0xc2, 0x00, 0x98, 0x01, 0x99, - 0xd7, 0xe7, 0x28, 0x1d, 0x05, 0x01, 0x35, 0x4b, - 0x2d, 0x09, 0xe4, 0x18, 0x05, 0xe0, 0xe8, 0x1d, - 0x01, 0x30, 0x05, 0x01, 0x32, 0x4b, 0x2d, 0x09, - 0xed, 0x09, 0x00, 0x96, 0x00, 0xe4, 0x18, 0x32, - 0x48, 0x44, 0x60, 0x05, 0x60, 0x00, 0x20, 0xff, - 0xf7, 0x77, 0xf8, 0x08, 0x98, 0x00, 0x28, 0x10, - 0xd0, 0x00, 0x2e, 0x13, 0xd0, 0x34, 0x20, 0x30, - 0x60, 0xb8, 0x68, 0xf0, 0x60, 0x00, 0x20, 0x30, - 0x61, 0x08, 0x98, 0x70, 0x61, 0x09, 0x99, 0x0e, - 0x20, 0xb1, 0x61, 0x31, 0x1c, 0xf7, 0xf7, 0xa0, - 0xfb, 0x04, 0xe0, 0x00, 0x2e, 0x02, 0xd0, 0x30, - 0x1c, 0xf7, 0xf7, 0x66, 0xfb, 0xfc, 0x1d, 0x79, - 0x34, 0x60, 0x69, 0x04, 0x28, 0x30, 0xd1, 0xf7, - 0xf7, 0x24, 0xfb, 0x00, 0x28, 0x2c, 0xd0, 0x41, - 0x21, 0x01, 0x60, 0x79, 0x68, 0x00, 0x25, 0x81, - 0x61, 0x47, 0x61, 0x79, 0x68, 0x49, 0x68, 0x01, - 0x61, 0x39, 0x7e, 0xc1, 0x60, 0xc5, 0x61, 0x01, - 0x1c, 0x0e, 0x20, 0xf7, 0xf7, 0x81, 0xfb, 0x65, - 0x61, 0x79, 0x68, 0xc0, 0x37, 0x78, 0x68, 0x44, - 0x68, 0xa1, 0x42, 0x13, 0xd0, 0xc5, 0x60, 0x20, - 0x1c, 0xfa, 0xf7, 0x8f, 0xfe, 0x00, 0x28, 0x05, - 0xd1, 0x78, 0x68, 0x45, 0x60, 0x20, 0x1c, 0xfa, - 0xf7, 0xd5, 0xfe, 0x09, 0xe0, 0x78, 0x68, 0x80, - 0x30, 0x85, 0x61, 0x78, 0x68, 0x02, 0x21, 0xf9, - 0xf7, 0x89, 0xf8, 0x01, 0xe0, 0x80, 0x30, 0x85, - 0x61, 0x33, 0xe6, 0x00, 0x00, 0x80, 0x55, 0x00, - 0xe0, 0x00, 0x53, 0x00, 0xe0, 0x03, 0x05, 0x00, - 0x00, 0x00, 0x52, 0x00, 0xe0, 0x80, 0x57, 0x00, - 0xe0, 0xc4, 0x09, 0x00, 0x00, 0x88, 0x13, 0x00, - 0x00, 0x68, 0x14, 0x04, 0x20, 0x80, 0xb5, 0x1b, - 0x49, 0x4f, 0x69, 0xf9, 0x1d, 0xf9, 0x31, 0xca, - 0x68, 0x01, 0x32, 0xca, 0x60, 0x79, 0x6a, 0xfe, - 0x29, 0x0a, 0xd1, 0xff, 0x23, 0xcd, 0x33, 0x18, - 0x40, 0x06, 0xd1, 0x11, 0x20, 0x40, 0x01, 0x00, - 0xf0, 0x29, 0xf8, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf8, 0x1d, 0xed, 0x09, 0x00, 0x97, 0x00, - 0xb9, 0x30, 0x40, 0x6a, 0x00, 0x28, 0xf7, 0xd0, - 0xf7, 0xf7, 0x06, 0xfb, 0x00, 0x28, 0xf3, 0xd0, - 0x0d, 0x4a, 0xc1, 0x1d, 0x92, 0x6a, 0x01, 0x31, - 0x53, 0x07, 0x5b, 0x0f, 0x0b, 0x70, 0x53, 0x06, - 0x1b, 0x0f, 0x4b, 0x60, 0x13, 0x06, 0xdb, 0x0f, - 0x4b, 0x70, 0xd3, 0x05, 0xdb, 0x0f, 0x92, 0x05, - 0xd2, 0x0f, 0x8b, 0x70, 0xca, 0x70, 0x01, 0x1c, - 0x38, 0x1c, 0xff, 0xf7, 0x98, 0xfc, 0xdb, 0xe7, - 0x00, 0x00, 0x68, 0x14, 0x04, 0x20, 0x40, 0x55, - 0x00, 0xe0, 0xf8, 0xb5, 0x07, 0x1c, 0x8b, 0x48, - 0x00, 0x22, 0x01, 0x69, 0x44, 0x69, 0x00, 0x91, - 0x8a, 0x49, 0x40, 0x68, 0x09, 0x69, 0xfb, 0xf7, - 0xbc, 0xfa, 0x01, 0x26, 0x76, 0x02, 0x3e, 0x40, - 0x00, 0x28, 0x0d, 0xd1, 0x00, 0x2e, 0x04, 0xd0, - 0xe0, 0x1d, 0xf9, 0x30, 0xc1, 0x68, 0x01, 0x39, - 0xc1, 0x60, 0x08, 0x20, 0x38, 0x43, 0xff, 0xf7, - 0xa8, 0xff, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x01, 0x21, 0x00, 0x2e, 0x00, 0xd0, 0x00, 0x21, - 0x38, 0x1c, 0xfa, 0xf7, 0x0c, 0xff, 0x07, 0x1c, - 0x09, 0xd1, 0x00, 0x20, 0x20, 0x66, 0xfb, 0xf7, - 0x9a, 0xf8, 0xe0, 0x1d, 0xf9, 0x30, 0xc1, 0x68, - 0x01, 0x31, 0xc1, 0x60, 0xe9, 0xe7, 0xe5, 0x1d, - 0xb9, 0x35, 0xe8, 0x69, 0xb8, 0x64, 0x60, 0x6a, - 0xfd, 0x28, 0x4a, 0xd0, 0xfe, 0x28, 0x48, 0xd1, - 0x20, 0x6b, 0x00, 0x28, 0x13, 0xd0, 0x00, 0x6b, - 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, 0x5f, 0xfa, - 0x20, 0x6b, 0x00, 0x21, 0x01, 0x63, 0x20, 0x6b, - 0xc0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, - 0x56, 0xfa, 0x20, 0x6b, 0x00, 0x21, 0xc1, 0x61, - 0x20, 0x6b, 0xf7, 0xf7, 0xb6, 0xfa, 0x78, 0x69, - 0x03, 0x28, 0x05, 0xd1, 0xf8, 0x68, 0x03, 0x28, - 0x02, 0xd1, 0x00, 0x20, 0x20, 0x63, 0xed, 0x09, - 0x00, 0x98, 0x00, 0x28, 0xe0, 0xf8, 0x68, 0x10, - 0x28, 0x15, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x11, 0x0f, 0x11, 0x07, 0x07, - 0x11, 0x11, 0x11, 0x07, 0x11, 0x07, 0x07, 0x11, - 0x11, 0x07, 0x07, 0x00, 0x2e, 0x07, 0xd1, 0xf8, - 0x1d, 0x01, 0x30, 0x21, 0x1c, 0x03, 0xf0, 0x46, - 0xfb, 0x01, 0xe0, 0x00, 0x20, 0xf8, 0x60, 0x27, - 0x63, 0x68, 0x6a, 0x00, 0x28, 0x1a, 0xd0, 0xf7, - 0xf7, 0x6d, 0xfa, 0x08, 0x37, 0x0c, 0xcf, 0xc1, - 0x1d, 0x01, 0x31, 0x0c, 0xc1, 0x00, 0x21, 0xc1, - 0x60, 0xe9, 0x69, 0x07, 0x1c, 0x81, 0x64, 0xf8, - 0x68, 0x03, 0x38, 0x0d, 0x28, 0x4a, 0xd2, 0x01, - 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x07, - 0x07, 0x40, 0x40, 0x40, 0x07, 0x46, 0x07, 0x07, - 0x46, 0x46, 0x07, 0x07, 0x00, 0x87, 0xe7, 0x78, - 0x69, 0x02, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x14, - 0xd1, 0x60, 0x6e, 0x02, 0x23, 0x18, 0x40, 0x07, - 0xd0, 0x39, 0x69, 0x00, 0x29, 0x04, 0xd0, 0x02, - 0x21, 0x20, 0x1c, 0x03, 0xf0, 0xb2, 0xfa, 0x08, - 0xe0, 0x00, 0x28, 0x06, 0xd1, 0x38, 0x69, 0x00, - 0x28, 0x03, 0xd1, 0x02, 0x21, 0x20, 0x1c, 0x03, - 0xf0, 0x8e, 0xfa, 0x00, 0x2e, 0x06, 0xd1, 0xf8, - 0x1d, 0x01, 0x30, 0x21, 0x1c, 0x03, 0xf0, 0x02, - 0xfb, 0x00, 0x28, 0x1b, 0xd0, 0x68, 0x6a, 0x00, - 0x28, 0x04, 0xd0, 0x20, 0x1c, 0x39, 0x1c, 0xff, - 0xf7, 0xd4, 0xfb, 0x0c, 0xe0, 0x38, 0x6b, 0x00, - 0x28, 0x01, 0xd0, 0xf7, 0xf7, 0xde, 0xf9, 0xf8, - 0x69, 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, 0xd9, - 0xf9, 0x38, 0x1c, 0xf7, 0xf7, 0x3c, 0xfa, 0x4e, - 0xe7, 0x00, 0x22, 0x20, 0x1c, 0x39, 0x1c, 0xfb, - 0xf7, 0x6a, 0xff, 0x48, 0xe7, 0x68, 0x6a, 0x00, - 0x28, 0x02, 0xd0, 0x01, 0x38, 0x68, 0x62, 0x10, - 0xe0, 0xed, 0x09, 0x00, 0x99, 0x00, 0xf8, 0x68, - 0x00, 0x28, 0x0d, 0xd1, 0x38, 0x6b, 0x00, 0x28, - 0x01, 0xd0, 0xf7, 0xf7, 0xc1, 0xf9, 0xf8, 0x69, - 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, 0xbc, 0xf9, - 0x38, 0x1c, 0xf7, 0xf7, 0x1f, 0xfa, 0x31, 0xe7, - 0xf7, 0xf7, 0xbb, 0xf9, 0x04, 0x1c, 0x0d, 0xd1, - 0x38, 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, - 0xaf, 0xf9, 0xf8, 0x69, 0x00, 0x28, 0x01, 0xd0, - 0xf7, 0xf7, 0xaa, 0xf9, 0x38, 0x1c, 0xf7, 0xf7, - 0x0d, 0xfa, 0x1f, 0xe7, 0x35, 0x20, 0x20, 0x60, - 0x00, 0x99, 0x48, 0x68, 0xe0, 0x60, 0x0e, 0x20, - 0x21, 0x1c, 0x27, 0x61, 0xf7, 0xf7, 0x10, 0xfa, - 0x00, 0x28, 0x0f, 0xd0, 0x38, 0x6b, 0x00, 0x28, - 0x01, 0xd0, 0xf7, 0xf7, 0x95, 0xf9, 0xf8, 0x69, - 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, 0x90, 0xf9, - 0x38, 0x1c, 0xf7, 0xf7, 0xf3, 0xf9, 0x20, 0x1c, - 0xf7, 0xf7, 0xca, 0xf9, 0x02, 0xe7, 0x00, 0x00, - 0x68, 0x14, 0x04, 0x20, 0x00, 0x50, 0x00, 0xe0, - 0xf0, 0xb5, 0x04, 0x1c, 0x01, 0x62, 0x00, 0x20, - 0x60, 0x63, 0xe5, 0x1d, 0x25, 0x35, 0xe0, 0x6a, - 0x21, 0x6b, 0x17, 0x1c, 0x07, 0xf0, 0xd0, 0xfa, - 0x03, 0xc5, 0x08, 0x3d, 0xe0, 0x1d, 0x1d, 0x30, - 0x0c, 0xcd, 0x06, 0x1c, 0x0c, 0xc0, 0x60, 0x69, - 0x21, 0x6a, 0x09, 0x1a, 0x09, 0x01, 0x09, 0x09, - 0x01, 0x23, 0x1b, 0x05, 0xe5, 0x1d, 0x11, 0x35, - 0x99, 0x42, 0x13, 0xd9, 0x49, 0x08, 0x08, 0x18, - 0x00, 0x01, 0x00, 0x09, 0x60, 0x61, 0x03, 0xce, - 0x0c, 0xcd, 0x08, 0x3d, 0x08, 0x3e, 0x80, 0x1a, - 0x99, 0x41, 0x01, 0x22, 0x07, 0xf0, 0xb8, 0xfa, - 0x0c, 0xcd, 0x08, 0x3d, 0x80, 0x18, 0x59, 0x41, - 0x03, 0xc5, 0x08, 0x3d, 0x03, 0xcd, 0x0c, 0xa3, - 0x1a, 0x68, 0x5b, 0x68, 0x08, 0x3d, 0xf6, 0xf7, - 0xdf, 0xfe, 0x00, 0x28, 0xed, 0x09, 0x00, 0x9a, - 0x00, 0x0c, 0xd0, 0x20, 0x6a, 0x61, 0x69, 0x40, - 0x1a, 0x00, 0x01, 0x00, 0x09, 0x01, 0x23, 0x5b, - 0x02, 0x98, 0x42, 0x03, 0xd9, 0x0c, 0xce, 0x0c, - 0xc5, 0x20, 0x6a, 0x60, 0x61, 0x38, 0x1c, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xb5, 0xc1, - 0x1d, 0x11, 0x31, 0x04, 0x1c, 0x08, 0x68, 0x49, - 0x68, 0x17, 0x1c, 0x22, 0xa3, 0x1a, 0x68, 0x0d, - 0x1c, 0x06, 0x1c, 0x5b, 0x68, 0xf6, 0xf7, 0xba, - 0xfe, 0x00, 0x28, 0x04, 0xd0, 0x38, 0x1c, 0x03, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x20, - 0x6a, 0x61, 0x69, 0x40, 0x1a, 0x00, 0x01, 0x00, - 0x09, 0x01, 0x23, 0x9b, 0x02, 0x98, 0x42, 0x01, - 0xd2, 0x38, 0x1c, 0xf0, 0xe7, 0x60, 0x6a, 0xa1, - 0x6a, 0x80, 0x1b, 0xa9, 0x41, 0x18, 0x22, 0x07, - 0xf0, 0xb5, 0xf9, 0x02, 0x1c, 0x20, 0x6a, 0x0b, - 0x1c, 0x61, 0x69, 0x40, 0x1a, 0x00, 0x01, 0x00, - 0x09, 0x00, 0x21, 0x07, 0xf0, 0x79, 0xfa, 0xa0, - 0x63, 0x20, 0x6a, 0x01, 0x99, 0xa2, 0x6b, 0x08, - 0x1a, 0x00, 0x01, 0x00, 0x09, 0x00, 0x21, 0x07, - 0xf0, 0x7d, 0xfa, 0x18, 0x22, 0x07, 0xf0, 0x56, - 0xfa, 0x01, 0x1c, 0x60, 0x6b, 0x0d, 0x1a, 0x40, - 0x19, 0x60, 0x63, 0xe0, 0x6a, 0x21, 0x6b, 0x2a, - 0x1c, 0x2c, 0x34, 0x07, 0xf0, 0x43, 0xfa, 0x03, - 0xc4, 0x78, 0x1b, 0xc4, 0xe7, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x68, 0x52, - 0x6a, 0x52, 0x18, 0x06, 0x2a, 0x06, 0xd8, 0xc2, - 0x1d, 0xf9, 0x32, 0x91, 0x62, 0x40, 0x68, 0x42, - 0x6a, 0x51, 0x18, 0x41, 0x62, 0x70, 0x47, 0xc2, - 0x1d, 0xf9, 0x32, 0x91, 0x6a, 0x00, 0x29, 0x09, - 0xd0, 0x40, 0x68, 0x43, 0x6a, 0x00, 0x2b, 0x03, - 0xd0, 0x43, 0x6a, 0x59, 0x1a, 0x41, 0x62, 0xed, - 0x09, 0x00, 0x9b, 0x00, 0x24, 0x30, 0x00, 0x20, - 0x90, 0x62, 0x70, 0x47, 0x97, 0xb5, 0x83, 0xb0, - 0xc4, 0x1d, 0xff, 0x34, 0x3a, 0x34, 0x21, 0x6b, - 0x00, 0x27, 0x00, 0x29, 0x02, 0xd0, 0xff, 0x27, - 0x02, 0x37, 0x11, 0xe0, 0x02, 0x68, 0x40, 0x68, - 0x00, 0x23, 0x81, 0x68, 0x09, 0x48, 0x02, 0x92, - 0x01, 0x91, 0x00, 0x90, 0x04, 0x98, 0x05, 0x99, - 0x01, 0x22, 0x1e, 0xf0, 0x9c, 0xf9, 0x20, 0x63, - 0x00, 0x28, 0x01, 0xd1, 0xff, 0x27, 0x02, 0x37, - 0x38, 0x1c, 0x06, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf7, 0xaa, 0x00, 0x20, 0x90, 0xb5, - 0xc4, 0x1d, 0xff, 0x34, 0x3a, 0x34, 0x20, 0x6b, - 0x00, 0x27, 0x00, 0x28, 0x05, 0xd0, 0x05, 0xa1, - 0x1e, 0xf0, 0x51, 0xfa, 0x00, 0x20, 0x20, 0x63, - 0x01, 0xe0, 0xff, 0x27, 0x02, 0x37, 0x38, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x30, 0x36, - 0x00, 0x00, 0xb0, 0xb5, 0x07, 0x1c, 0xff, 0x30, - 0x81, 0x30, 0x04, 0x68, 0x2b, 0xf0, 0xed, 0xfe, - 0xff, 0x25, 0x03, 0x35, 0xa8, 0x42, 0x01, 0xd3, - 0x07, 0x20, 0x00, 0xe0, 0x05, 0x20, 0x40, 0x10, - 0xa0, 0x42, 0x09, 0xd2, 0x2b, 0xf0, 0xe1, 0xfe, - 0xa8, 0x42, 0x01, 0xd3, 0x07, 0x21, 0x00, 0xe0, - 0x05, 0x21, 0x49, 0x10, 0x00, 0x22, 0x07, 0xe0, - 0x2b, 0xf0, 0xd7, 0xfe, 0xa8, 0x42, 0x01, 0xd3, - 0x07, 0x21, 0x00, 0xe0, 0x05, 0x21, 0x01, 0x22, - 0x38, 0x1c, 0xf9, 0xf7, 0x39, 0xfd, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x03, 0x21, - 0x09, 0x04, 0x01, 0x40, 0x0d, 0x0c, 0x17, 0x1c, - 0x1e, 0xf0, 0x01, 0xfc, 0x04, 0x1c, 0x00, 0x2f, - 0x02, 0xd0, 0x38, 0x1c, 0xff, 0xf7, 0xab, 0xff, - 0xff, 0x26, 0xed, 0x09, 0x00, 0x9c, 0x00, 0x03, - 0x36, 0x28, 0x23, 0xdc, 0x42, 0x22, 0xdb, 0x00, - 0x2d, 0x18, 0xd9, 0x2b, 0xf0, 0xb4, 0xfe, 0xb0, - 0x42, 0x01, 0xd3, 0x07, 0x21, 0x00, 0xe0, 0x05, - 0x21, 0x49, 0x10, 0x00, 0x22, 0x38, 0x1c, 0xf9, - 0xf7, 0x15, 0xfd, 0x00, 0x2f, 0x0d, 0xd0, 0x38, - 0x8f, 0x13, 0x4b, 0x58, 0x43, 0x00, 0xd5, 0x01, - 0x30, 0x40, 0x10, 0xc2, 0x17, 0x01, 0x1c, 0x38, - 0x1c, 0xff, 0xf7, 0x66, 0xff, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x01, 0xf0, 0xa2, 0xfa, 0x01, - 0xf0, 0x7e, 0xfa, 0xf7, 0xe7, 0x32, 0x23, 0xdc, - 0x42, 0xf4, 0xdc, 0x01, 0x2d, 0xf2, 0xd2, 0x2b, - 0xf0, 0x8e, 0xfe, 0xb0, 0x42, 0x01, 0xd3, 0x07, - 0x21, 0x00, 0xe0, 0x05, 0x21, 0x01, 0x22, 0x38, - 0x1c, 0xf9, 0xf7, 0xf0, 0xfc, 0x00, 0x2f, 0xe5, - 0xd1, 0x01, 0xf0, 0x8b, 0xfa, 0xe2, 0xe7, 0xe2, - 0x04, 0x00, 0x00, 0xb0, 0xb5, 0x07, 0x1c, 0x3d, - 0x69, 0x00, 0x20, 0x13, 0x4c, 0xab, 0x00, 0xe4, - 0x58, 0x63, 0x00, 0x1b, 0x19, 0x12, 0x4c, 0x9b, - 0x00, 0x1c, 0x19, 0x23, 0x68, 0x24, 0x2b, 0x11, - 0xd0, 0x23, 0x68, 0x8b, 0x42, 0x13, 0xd1, 0x61, - 0x68, 0x39, 0x61, 0xa3, 0x68, 0x00, 0x2b, 0x06, - 0xd0, 0x38, 0x1c, 0x11, 0x1c, 0xf6, 0xf7, 0x40, - 0xfc, 0x00, 0x28, 0x00, 0xd0, 0x3d, 0x61, 0x21, - 0x68, 0x24, 0x29, 0x01, 0xd1, 0xff, 0x20, 0x0a, - 0x30, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe3, - 0x68, 0x0c, 0x34, 0x24, 0x2b, 0xe4, 0xd1, 0xf5, - 0xe7, 0x00, 0x00, 0x18, 0xeb, 0x03, 0x20, 0x7c, - 0x73, 0x03, 0x20, 0x43, 0x68, 0x00, 0x22, 0x00, - 0x2b, 0x03, 0xd0, 0x19, 0x60, 0x43, 0x68, 0x4b, - 0x60, 0x01, 0xe0, 0x01, 0x60, 0x4a, 0x60, 0x0a, - 0x60, 0x41, 0x60, 0x81, 0x68, 0x01, 0x31, 0x81, - 0x60, 0x70, 0x47, 0x0a, 0x68, 0xed, 0x09, 0x00, - 0x9d, 0x00, 0x00, 0x2a, 0x02, 0xd0, 0x4b, 0x68, - 0x53, 0x60, 0x01, 0xe0, 0x4a, 0x68, 0x42, 0x60, - 0x4a, 0x68, 0x00, 0x2a, 0x02, 0xd0, 0x09, 0x68, - 0x11, 0x60, 0x01, 0xe0, 0x09, 0x68, 0x01, 0x60, - 0x81, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, - 0x81, 0x60, 0x70, 0x47, 0xb0, 0xb5, 0x07, 0x23, - 0x5b, 0x02, 0x04, 0x1c, 0xc0, 0x18, 0x80, 0x68, - 0x1b, 0x4b, 0x0f, 0x1c, 0x98, 0x42, 0x30, 0xd1, - 0x08, 0x2f, 0x2e, 0xd2, 0xff, 0x20, 0xb5, 0x30, - 0x78, 0x43, 0x00, 0x19, 0xc5, 0x1d, 0x31, 0x35, - 0x28, 0x1c, 0xff, 0xf7, 0xcc, 0xfe, 0xff, 0x22, - 0x00, 0x21, 0x28, 0x1c, 0xb5, 0x32, 0xf6, 0xf7, - 0x81, 0xfb, 0x00, 0x20, 0x28, 0x61, 0x6c, 0x60, - 0x2f, 0x60, 0xe9, 0x1d, 0x59, 0x31, 0x2f, 0x77, - 0x0f, 0x71, 0x29, 0x7f, 0xea, 0x1d, 0xb9, 0x32, - 0x11, 0x71, 0xe9, 0x1d, 0x0b, 0x4a, 0xf9, 0x31, - 0xca, 0x61, 0x0b, 0x4b, 0xea, 0x1d, 0xff, 0x32, - 0x9f, 0x6b, 0x7a, 0x32, 0x17, 0x60, 0xdb, 0x6b, - 0x53, 0x60, 0x18, 0x22, 0x0a, 0x62, 0x48, 0x62, - 0xe8, 0x1d, 0xff, 0x30, 0x28, 0x21, 0x3a, 0x30, - 0xc1, 0x62, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x11, 0x19, 0x03, 0x64, 0x18, 0xcc, 0x00, 0x00, - 0xd8, 0xeb, 0x03, 0x20, 0xf0, 0xb5, 0x04, 0x1c, - 0x13, 0x48, 0x1e, 0xf0, 0xfb, 0xf9, 0x07, 0x1c, - 0x1d, 0xd0, 0x00, 0x20, 0x07, 0x23, 0x5b, 0x02, - 0x38, 0x61, 0x10, 0x48, 0xfe, 0x18, 0xb0, 0x60, - 0x00, 0x25, 0x38, 0x1c, 0x29, 0x1c, 0xff, 0xf7, - 0xa9, 0xff, 0x01, 0x35, 0x08, 0x2d, 0xf8, 0xd3, - 0x0b, 0x49, 0xbc, 0x61, 0xc8, 0x1d, 0x79, 0x30, - 0x83, 0x6a, 0x5a, 0x1c, 0x82, 0x62, 0xbb, 0x60, - 0x01, 0x20, 0x70, 0x60, 0xc8, 0x1d, 0x89, 0x30, - 0x39, 0x1c, 0xff, 0xf7, 0x71, 0xff, 0x38, 0x1c, - 0xed, 0x09, 0x00, 0x9e, 0x00, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x0c, 0x0e, 0x00, - 0x00, 0x11, 0x19, 0x03, 0x64, 0x18, 0xeb, 0x03, - 0x20, 0xb0, 0xb5, 0x07, 0x1c, 0x0c, 0x1c, 0x39, - 0x1c, 0x0a, 0x48, 0xff, 0xf7, 0x6f, 0xff, 0x00, - 0x25, 0xff, 0x20, 0xb5, 0x30, 0x68, 0x43, 0xc0, - 0x19, 0x38, 0x30, 0x00, 0xf0, 0xff, 0xf8, 0x01, - 0x35, 0x08, 0x2d, 0xf5, 0xd3, 0x38, 0x1c, 0x21, - 0x1c, 0x1e, 0xf0, 0xc0, 0xf9, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xa8, 0xeb, 0x03, - 0x20, 0x80, 0xb5, 0x06, 0x48, 0x00, 0x69, 0x00, - 0x28, 0x05, 0xd0, 0x07, 0x68, 0x04, 0xa1, 0xff, - 0xf7, 0xdb, 0xff, 0x38, 0x1c, 0xf9, 0xd1, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x98, 0xeb, 0x03, - 0x20, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x35, 0x34, 0x36, 0x00, 0x00, 0x01, 0x1c, 0x05, - 0x48, 0x00, 0x69, 0x00, 0x28, 0x05, 0xd0, 0x02, - 0x69, 0x8a, 0x42, 0x02, 0xd0, 0x00, 0x68, 0x00, - 0x28, 0xf9, 0xd1, 0x70, 0x47, 0x98, 0xeb, 0x03, - 0x20, 0x05, 0x48, 0x00, 0x69, 0x00, 0x28, 0x05, - 0xd0, 0x81, 0x69, 0x01, 0x29, 0x02, 0xd0, 0x00, - 0x68, 0x00, 0x28, 0xf9, 0xd1, 0x70, 0x47, 0x00, - 0x00, 0x98, 0xeb, 0x03, 0x20, 0x01, 0x1c, 0x07, - 0x48, 0x00, 0x69, 0x00, 0x28, 0x08, 0xd0, 0x02, - 0x69, 0x1a, 0x2a, 0x02, 0xd1, 0x82, 0x69, 0x8a, - 0x42, 0x02, 0xd0, 0x00, 0x68, 0x00, 0x28, 0xf6, - 0xd1, 0x70, 0x47, 0x00, 0x00, 0x98, 0xeb, 0x03, - 0x20, 0x80, 0xb4, 0x01, 0x1c, 0x09, 0x48, 0x00, - 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x08, 0x4a, 0x83, - 0x68, 0x8b, 0x42, 0x05, 0xd1, 0x07, 0x23, 0x5b, - 0x02, 0xc3, 0x18, 0x9f, 0x68, 0x97, 0x42, 0x02, - 0xd0, 0x00, 0x68, 0xed, 0x09, 0x00, 0x9f, 0x00, - 0x00, 0x28, 0xf3, 0xd1, 0x80, 0xbc, 0x70, 0x47, - 0x00, 0x00, 0x98, 0xeb, 0x03, 0x20, 0x11, 0x19, - 0x03, 0x64, 0x01, 0x1c, 0x08, 0x48, 0x00, 0x69, - 0x00, 0x28, 0x0a, 0xd0, 0x02, 0x69, 0x00, 0x2a, - 0x04, 0xd0, 0x1a, 0x2a, 0x02, 0xd0, 0x82, 0x69, - 0x8a, 0x42, 0x02, 0xd0, 0x00, 0x68, 0x00, 0x28, - 0xf4, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x98, 0xeb, - 0x03, 0x20, 0x01, 0x21, 0xff, 0x22, 0xb5, 0x32, - 0x4a, 0x43, 0x12, 0x18, 0x92, 0x6c, 0x05, 0x2a, - 0x08, 0xd0, 0x02, 0x2a, 0x06, 0xd0, 0x03, 0x2a, - 0x04, 0xd0, 0x04, 0x2a, 0x02, 0xd0, 0x01, 0x31, - 0x08, 0x29, 0xef, 0xd3, 0x01, 0x20, 0x08, 0x29, - 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x01, 0x22, - 0x8a, 0x42, 0x0c, 0xd0, 0xff, 0x23, 0xb5, 0x33, - 0x53, 0x43, 0x1b, 0x18, 0x9b, 0x6c, 0x00, 0x2b, - 0x05, 0xd0, 0xff, 0x21, 0xb5, 0x31, 0x51, 0x43, - 0x08, 0x18, 0x38, 0x30, 0x70, 0x47, 0x01, 0x32, - 0x08, 0x2a, 0xed, 0xd3, 0x00, 0x20, 0x70, 0x47, - 0x00, 0x28, 0x09, 0xd0, 0x40, 0x68, 0x00, 0x28, - 0x06, 0xd0, 0x07, 0x23, 0x5b, 0x02, 0xc1, 0x18, - 0x89, 0x68, 0x02, 0x4b, 0x99, 0x42, 0x00, 0xd0, - 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x11, 0x19, - 0x03, 0x64, 0x80, 0xb4, 0x0b, 0x4a, 0x00, 0x23, - 0x12, 0x69, 0x00, 0x2a, 0x0e, 0xd0, 0x97, 0x68, - 0x87, 0x42, 0x08, 0xd1, 0x08, 0x29, 0x06, 0xd2, - 0xff, 0x20, 0xb5, 0x30, 0x48, 0x43, 0x80, 0x18, - 0xc3, 0x1d, 0x31, 0x33, 0x02, 0xe0, 0x12, 0x68, - 0x00, 0x2a, 0xf0, 0xd1, 0x80, 0xbc, 0x18, 0x1c, - 0x70, 0x47, 0x98, 0xeb, 0x03, 0x20, 0x90, 0xb4, - 0x00, 0x24, 0x00, 0x29, 0x1c, 0xd0, 0x0b, 0x69, - 0x0a, 0x2b, 0x19, 0xd0, 0x0c, 0x2b, 0x17, 0xd0, - 0x12, 0x2b, 0x15, 0xd0, 0x14, 0x2b, 0xed, 0x09, - 0x00, 0xa0, 0x00, 0x13, 0xd0, 0x01, 0x27, 0xff, - 0x23, 0xb5, 0x33, 0x7b, 0x43, 0x5b, 0x18, 0x9b, - 0x6c, 0x05, 0x2b, 0x08, 0xd0, 0x00, 0x2a, 0x01, - 0xd0, 0x02, 0x2b, 0x04, 0xd0, 0x01, 0x2b, 0x02, - 0xd0, 0x01, 0x37, 0x08, 0x2f, 0xef, 0xd3, 0x08, - 0x2f, 0x00, 0xd1, 0xcc, 0x60, 0x00, 0x28, 0x00, - 0xd0, 0x84, 0x60, 0x90, 0xbc, 0x70, 0x47, 0x90, - 0xb5, 0xc4, 0x1d, 0xf9, 0x34, 0x07, 0x1c, 0x20, - 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x38, 0x1c, 0x00, - 0xf0, 0xb6, 0xff, 0xe0, 0x6a, 0x00, 0x28, 0x02, - 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x34, 0xff, 0x60, - 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x38, 0x1c, 0x01, - 0xf0, 0x27, 0xf9, 0xfc, 0x1d, 0xff, 0x34, 0x3a, - 0x34, 0xe0, 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x38, - 0x1c, 0x01, 0xf0, 0x08, 0xfa, 0xa0, 0x6b, 0x00, - 0x28, 0x03, 0xd0, 0x01, 0x21, 0x38, 0x1c, 0x01, - 0xf0, 0x9c, 0xf9, 0xf8, 0x6a, 0x00, 0x28, 0x02, - 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0xc6, 0xfe, 0xf8, - 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x00, 0x6b, 0x00, - 0x28, 0x02, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x63, - 0xfe, 0x38, 0x1c, 0x01, 0xf0, 0xb5, 0xff, 0x00, - 0x28, 0x07, 0xd0, 0x0e, 0xa1, 0x1e, 0xf0, 0x90, - 0xf8, 0x38, 0x1c, 0x01, 0xf0, 0xad, 0xff, 0x00, - 0x28, 0xf7, 0xd1, 0x38, 0x1c, 0xff, 0xf7, 0x1a, - 0xfd, 0x00, 0x20, 0x38, 0x61, 0xf8, 0x64, 0x60, - 0x60, 0xf8, 0x60, 0xf8, 0x1d, 0xff, 0x30, 0x86, - 0x30, 0x00, 0x24, 0x00, 0x21, 0x00, 0x22, 0x00, - 0x23, 0x00, 0x27, 0x9e, 0xc0, 0x9c, 0xc0, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, - 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x37, 0x37, - 0x30, 0x00, 0x00, 0xf0, 0xb5, 0xc5, 0x1d, 0xff, - 0x35, 0xed, 0x09, 0x00, 0xa1, 0x00, 0xe6, 0x35, - 0x01, 0x26, 0x0c, 0x1c, 0x17, 0x1c, 0x29, 0x69, - 0x00, 0x29, 0x0d, 0xd1, 0x31, 0x1c, 0xff, 0xf7, - 0x0f, 0xfe, 0x2c, 0x61, 0x28, 0x1c, 0x0a, 0x49, - 0x00, 0xf0, 0xb2, 0xff, 0xe8, 0x1d, 0xf9, 0x30, - 0x18, 0x21, 0x01, 0x62, 0xc7, 0x61, 0x04, 0xe0, - 0xff, 0x35, 0xb5, 0x35, 0x01, 0x36, 0x08, 0x2e, - 0xe9, 0xd3, 0x00, 0x20, 0x08, 0x2e, 0x00, 0xd0, - 0x28, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x5a, 0x62, 0x02, 0x90, 0xb5, 0x83, 0xb0, - 0x12, 0x4f, 0x38, 0x68, 0x00, 0x28, 0x1c, 0xd0, - 0x79, 0x68, 0x00, 0x24, 0x88, 0x42, 0x0b, 0xd1, - 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x07, 0xd1, - 0x01, 0x24, 0x07, 0x23, 0xb8, 0x6a, 0x1b, 0x02, - 0x98, 0x42, 0x01, 0xd1, 0x22, 0x20, 0xb8, 0x62, - 0x20, 0x37, 0x07, 0xcf, 0x01, 0x91, 0x00, 0x90, - 0x2c, 0x3f, 0x02, 0x92, 0x01, 0x20, 0x00, 0x21, - 0x22, 0x1c, 0xfb, 0x69, 0x01, 0xf0, 0x1e, 0xfc, - 0xb8, 0x60, 0x03, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xd8, 0xeb, 0x03, 0x20, - 0x07, 0x48, 0x01, 0x68, 0x00, 0x29, 0x08, 0xd0, - 0x00, 0x20, 0x01, 0x29, 0x04, 0xd0, 0x02, 0x29, - 0x02, 0xd0, 0x03, 0x29, 0x00, 0xd1, 0x02, 0x20, - 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, - 0xd8, 0xeb, 0x03, 0x20, 0x05, 0x48, 0x01, 0x68, - 0x00, 0x20, 0x00, 0x29, 0x04, 0xd0, 0x01, 0x29, - 0x02, 0xd0, 0x02, 0x29, 0x00, 0xd1, 0x01, 0x20, - 0x70, 0x47, 0x00, 0x00, 0xd8, 0xeb, 0x03, 0x20, - 0x06, 0x48, 0x01, 0x68, 0x01, 0x20, 0x00, 0x29, - 0x07, 0xd0, 0x01, 0x29, 0x05, 0xd0, 0x00, 0x20, - 0x02, 0x29, 0x02, 0xd0, 0x03, 0x29, 0x00, 0xd1, - 0x02, 0x20, 0x70, 0x47, 0xd8, 0xeb, 0x03, 0x20, - 0x08, 0x48, 0x02, 0x68, 0xed, 0x09, 0x00, 0xa2, - 0x00, 0x00, 0x2a, 0x09, 0xd0, 0x01, 0x21, 0x01, - 0x2a, 0x08, 0xd0, 0x00, 0x20, 0x02, 0x2a, 0x02, - 0xd0, 0x03, 0x2a, 0x00, 0xd1, 0x08, 0x1c, 0x70, - 0x47, 0x02, 0x20, 0x70, 0x47, 0x08, 0x1c, 0x70, - 0x47, 0xd8, 0xeb, 0x03, 0x20, 0x05, 0x48, 0x01, - 0x68, 0x00, 0x20, 0x00, 0x29, 0x04, 0xd0, 0x01, - 0x29, 0x02, 0xd0, 0x02, 0x29, 0x00, 0xd1, 0x01, - 0x20, 0x70, 0x47, 0x00, 0x00, 0xd8, 0xeb, 0x03, - 0x20, 0xf0, 0xb5, 0x83, 0xb0, 0xc5, 0x68, 0x6a, - 0x4c, 0x00, 0x2d, 0x06, 0xd0, 0x07, 0x23, 0x5b, - 0x02, 0xe9, 0x18, 0x89, 0x68, 0x67, 0x4b, 0x99, - 0x42, 0x05, 0xd0, 0x20, 0x68, 0x60, 0x60, 0x03, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x47, - 0x69, 0x00, 0x69, 0x2e, 0x69, 0xe8, 0x60, 0x00, - 0x2f, 0x01, 0xd1, 0x19, 0x21, 0x00, 0xe0, 0x1a, - 0x21, 0x00, 0x22, 0x28, 0x1c, 0xff, 0xf7, 0x04, - 0xfd, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x68, 0x60, - 0x60, 0xe9, 0xe7, 0x37, 0x23, 0x9b, 0x01, 0xe8, - 0x18, 0x01, 0x6b, 0x00, 0x29, 0x05, 0xd0, 0x06, - 0x2e, 0x00, 0xd1, 0xa7, 0x60, 0x00, 0x21, 0x01, - 0x63, 0x9c, 0xe0, 0x60, 0x69, 0x00, 0x28, 0x5d, - 0xd0, 0xa0, 0x69, 0x00, 0x28, 0x5a, 0xd0, 0xe0, - 0x68, 0x00, 0x28, 0x34, 0xd0, 0x00, 0x2f, 0x03, - 0xd0, 0xff, 0x23, 0x11, 0x33, 0x9f, 0x42, 0x2e, - 0xd1, 0xff, 0xf7, 0x8c, 0xff, 0x07, 0x1c, 0xff, - 0xf7, 0x7b, 0xff, 0x06, 0x1c, 0x20, 0x34, 0x07, - 0xcc, 0x01, 0x91, 0x00, 0x90, 0x2c, 0x3c, 0x02, - 0x92, 0x00, 0x20, 0x31, 0x1c, 0x3a, 0x1c, 0xe3, - 0x69, 0x01, 0xf0, 0x72, 0xfb, 0x07, 0x1c, 0x3d, - 0xd0, 0xff, 0xf7, 0x9c, 0xff, 0x06, 0x1c, 0xff, - 0xf7, 0x85, 0xff, 0x03, 0x1c, 0x20, 0x34, 0x07, - 0xcc, 0x2c, 0x3c, 0x01, 0x91, 0x00, 0x90, 0xed, - 0x09, 0x00, 0xa3, 0x00, 0x02, 0x92, 0xe0, 0x69, - 0x19, 0x1c, 0x03, 0x1c, 0x00, 0x20, 0x32, 0x1c, - 0x01, 0xf0, 0x5d, 0xfb, 0x00, 0x28, 0x28, 0xd0, - 0x00, 0x20, 0xe0, 0x60, 0xff, 0xf7, 0x41, 0xff, - 0x20, 0x60, 0x22, 0xe0, 0x00, 0x28, 0x20, 0xd1, - 0x00, 0x2f, 0x1e, 0xd0, 0xff, 0x23, 0x11, 0x33, - 0x9f, 0x42, 0x1a, 0xd0, 0xff, 0xf7, 0x79, 0xff, - 0x06, 0x1c, 0xff, 0xf7, 0x62, 0xff, 0x03, 0x1c, - 0x20, 0x34, 0x07, 0xcc, 0x2c, 0x3c, 0x01, 0x91, - 0x00, 0x90, 0x02, 0x92, 0xe0, 0x69, 0x19, 0x1c, - 0x03, 0x1c, 0x00, 0x20, 0x32, 0x1c, 0x01, 0xf0, - 0x3a, 0xfb, 0x00, 0x28, 0x03, 0xd0, 0xff, 0xf7, - 0x20, 0xff, 0x20, 0x60, 0x01, 0xe0, 0x01, 0x20, - 0xe0, 0x60, 0xe0, 0x68, 0x00, 0x28, 0x03, 0xd0, - 0x00, 0x20, 0xe0, 0x60, 0x27, 0x61, 0x34, 0xe0, - 0x20, 0x69, 0x00, 0x28, 0x01, 0xd0, 0x07, 0x1c, - 0x04, 0xe0, 0x00, 0x2f, 0x02, 0xd1, 0x60, 0x68, - 0x20, 0x60, 0x09, 0xe0, 0xff, 0x23, 0x11, 0x33, - 0x9f, 0x42, 0x03, 0xd1, 0x60, 0x68, 0x00, 0x27, - 0x20, 0x60, 0x01, 0xe0, 0x20, 0x68, 0x60, 0x60, - 0x20, 0x68, 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, - 0x10, 0xd1, 0x07, 0x20, 0xff, 0xf7, 0x6f, 0xfd, - 0x00, 0x28, 0x0b, 0xd1, 0x08, 0x20, 0xff, 0xf7, - 0x6a, 0xfd, 0x00, 0x28, 0x06, 0xd1, 0x09, 0x20, - 0xff, 0xf7, 0x65, 0xfd, 0x00, 0x28, 0x01, 0xd1, - 0xff, 0xf7, 0xc1, 0xfe, 0xf6, 0xf7, 0x72, 0xfc, - 0x00, 0x28, 0x06, 0xd0, 0x6e, 0x21, 0x01, 0x60, - 0xc7, 0x60, 0x01, 0x1c, 0x09, 0x20, 0xf6, 0xf7, - 0xd8, 0xfc, 0x28, 0x69, 0x00, 0x28, 0x00, 0xd0, - 0x3c, 0xe7, 0x28, 0x1c, 0x04, 0xa1, 0xff, 0xf7, - 0x18, 0xfd, 0x37, 0xe7, 0x00, 0x00, 0xd8, 0xeb, - 0x03, 0x20, 0x11, 0x19, 0x03, 0x64, 0x73, 0x72, - 0x63, 0x5c, 0xed, 0x09, 0x00, 0xa4, 0x00, 0x6c, - 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, - 0x3a, 0x20, 0x31, 0x30, 0x35, 0x38, 0x00, 0xf0, - 0xb5, 0x84, 0xb0, 0xc4, 0x68, 0x00, 0x2c, 0x49, - 0xd0, 0x07, 0x23, 0x5b, 0x02, 0xe1, 0x18, 0x89, - 0x68, 0x25, 0x4b, 0x99, 0x42, 0x42, 0xd1, 0x45, - 0x69, 0x00, 0x69, 0x00, 0x2d, 0xe0, 0x60, 0x01, - 0xd1, 0x1b, 0x26, 0x00, 0xe0, 0x1c, 0x26, 0xf6, - 0xf7, 0x3b, 0xfc, 0x07, 0x1c, 0x36, 0xd0, 0x00, - 0x22, 0x20, 0x1c, 0x31, 0x1c, 0xff, 0xf7, 0x21, - 0xfc, 0x00, 0x28, 0x2f, 0xd1, 0x00, 0x2d, 0x19, - 0xd1, 0x37, 0x23, 0x9b, 0x01, 0xe6, 0x18, 0x30, - 0x6a, 0x00, 0x21, 0x17, 0x4a, 0xf6, 0xf7, 0xdb, - 0xf9, 0x03, 0x90, 0xf0, 0x69, 0x80, 0x01, 0x02, - 0x0a, 0x0b, 0x1c, 0xa1, 0x68, 0x14, 0x48, 0x01, - 0x91, 0x19, 0x1c, 0x00, 0x23, 0x02, 0x92, 0x00, - 0x90, 0x03, 0x98, 0x01, 0x22, 0x1d, 0xf0, 0x01, - 0xfd, 0x70, 0x62, 0x0c, 0xe0, 0x20, 0x69, 0x00, - 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0d, 0xa1, 0xff, - 0xf7, 0xc6, 0xfc, 0x04, 0xe0, 0x00, 0x22, 0x00, - 0x20, 0x21, 0x1c, 0xff, 0xf7, 0xa8, 0xfd, 0x74, - 0x20, 0x38, 0x60, 0x09, 0x20, 0x39, 0x1c, 0xfd, - 0x60, 0xf6, 0xf7, 0x71, 0xfc, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x11, - 0x19, 0x03, 0x64, 0x00, 0x10, 0x27, 0x00, 0xb9, - 0xaa, 0x00, 0x20, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, - 0x3a, 0x20, 0x31, 0x31, 0x31, 0x31, 0x00, 0x90, - 0xb5, 0x07, 0x1c, 0xc4, 0x68, 0x00, 0x69, 0x00, - 0x28, 0x01, 0xd1, 0x1d, 0x21, 0x00, 0xe0, 0x1e, - 0x21, 0x00, 0x2c, 0x22, 0xd0, 0x07, 0x23, 0x5b, - 0x02, 0xe0, 0x18, 0x80, 0x68, 0x11, 0x4b, 0x98, - 0x42, 0x1b, 0xd1, 0x00, 0x22, 0xed, 0x09, 0x00, - 0xa5, 0x00, 0x20, 0x1c, 0xff, 0xf7, 0xc4, 0xfb, - 0x00, 0x28, 0x15, 0xd1, 0x60, 0x69, 0x00, 0x28, - 0x0b, 0xd0, 0xf6, 0xf7, 0xd0, 0xfb, 0x00, 0x28, - 0x07, 0xd0, 0x75, 0x21, 0x01, 0x60, 0x39, 0x69, - 0xc1, 0x60, 0x01, 0x1c, 0x09, 0x20, 0xf6, 0xf7, - 0x35, 0xfc, 0x20, 0x69, 0x00, 0x28, 0x03, 0xd1, - 0x20, 0x1c, 0x04, 0xa1, 0xff, 0xf7, 0x76, 0xfc, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x11, 0x19, 0x03, 0x64, 0x73, 0x72, 0x63, 0x5c, - 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, - 0x63, 0x3a, 0x20, 0x31, 0x31, 0x36, 0x39, 0x00, - 0xf0, 0xb5, 0x84, 0xb0, 0xc5, 0x68, 0x07, 0x1c, - 0x28, 0x1c, 0xff, 0xf7, 0x1c, 0xfd, 0x04, 0x1c, - 0x64, 0xd0, 0x38, 0x69, 0xbe, 0x69, 0xe0, 0x60, - 0x78, 0x69, 0x00, 0x2e, 0xa8, 0x60, 0x02, 0xd1, - 0x1f, 0x21, 0x03, 0x91, 0x01, 0xe0, 0x20, 0x21, - 0x03, 0x91, 0xf6, 0xf7, 0x98, 0xfb, 0x07, 0x1c, - 0x54, 0xd0, 0x00, 0x22, 0x20, 0x1c, 0x03, 0x99, - 0xff, 0xf7, 0x7e, 0xfb, 0x00, 0x28, 0x03, 0xd0, - 0x38, 0x1c, 0xf6, 0xf7, 0xc7, 0xfb, 0x49, 0xe0, - 0x6f, 0x20, 0x38, 0x60, 0x3d, 0x61, 0xe8, 0x68, - 0xf8, 0x60, 0x09, 0x20, 0x39, 0x1c, 0x7e, 0x61, - 0xf6, 0xf7, 0xf0, 0xfb, 0x00, 0x2e, 0x28, 0xd1, - 0x28, 0x8f, 0x20, 0x4a, 0xc1, 0x17, 0xf6, 0xf7, - 0x2d, 0xf9, 0x0b, 0x1c, 0x2a, 0x68, 0xa1, 0x68, - 0x07, 0x1c, 0x1d, 0x48, 0x01, 0x91, 0x19, 0x1c, - 0x02, 0x92, 0x01, 0x22, 0x00, 0x23, 0x00, 0x90, - 0x38, 0x1c, 0x1d, 0xf0, 0x55, 0xfc, 0xe8, 0x63, - 0x28, 0x8f, 0x16, 0x49, 0x17, 0x4b, 0x41, 0x43, - 0x99, 0x42, 0x23, 0xdb, 0xc1, 0x17, 0x5a, 0x0b, - 0xf6, 0xf7, 0x14, 0xf9, 0x14, 0xa3, 0x1a, 0x68, - 0x5b, 0x68, 0x06, 0xf0, 0x93, 0xfb, 0x0a, 0x1c, - 0xed, 0x09, 0x00, 0xa6, 0x00, 0x01, 0x1c, 0x28, - 0x1c, 0xff, 0xf7, 0x8b, 0xfa, 0x14, 0xe0, 0x20, - 0x69, 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0f, - 0xa1, 0xff, 0xf7, 0x06, 0xfc, 0x0c, 0xe0, 0x00, - 0x22, 0x00, 0x20, 0x69, 0x68, 0xff, 0xf7, 0xe8, - 0xfc, 0x28, 0x1c, 0xff, 0xf7, 0x0b, 0xfd, 0x00, - 0x20, 0x37, 0x23, 0x9b, 0x01, 0xe1, 0x18, 0x48, - 0x63, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xe2, 0x04, 0x00, 0x00, 0x47, 0xab, 0x00, - 0x20, 0x00, 0x40, 0x9c, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x32, 0x33, 0x37, - 0x00, 0xb0, 0xb5, 0xc4, 0x68, 0x07, 0x1c, 0x20, - 0x1c, 0xff, 0xf7, 0x97, 0xfc, 0x00, 0x28, 0x1c, - 0xd0, 0x3f, 0x69, 0xff, 0x25, 0x11, 0x35, 0x00, - 0x2f, 0x02, 0xd1, 0x04, 0x27, 0x21, 0x21, 0x06, - 0xe0, 0xaf, 0x42, 0x03, 0xd1, 0x21, 0x6c, 0x00, - 0x29, 0x00, 0xd1, 0x00, 0x27, 0x22, 0x21, 0x3a, - 0x1c, 0xff, 0xf7, 0xfc, 0xfa, 0x20, 0x6c, 0x00, - 0x28, 0x0a, 0xd0, 0xaf, 0x42, 0x08, 0xd1, 0x00, - 0x20, 0x20, 0x64, 0x00, 0x21, 0x20, 0x1c, 0x01, - 0xf0, 0xc1, 0xfa, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x2f, 0xfa, 0xd0, 0x00, 0x22, 0x20, - 0x1c, 0x61, 0x68, 0xff, 0xf7, 0x99, 0xfc, 0xf4, - 0xe7, 0x90, 0xb5, 0xc4, 0x68, 0x07, 0x1c, 0x20, - 0x1c, 0xff, 0xf7, 0x67, 0xfc, 0x00, 0x28, 0x17, - 0xd0, 0x04, 0x20, 0x20, 0x61, 0xe0, 0x1d, 0xf9, - 0x30, 0x3f, 0x69, 0x01, 0x6b, 0x00, 0x29, 0x12, - 0xd0, 0x00, 0x21, 0x01, 0x63, 0xf6, 0xf7, 0xe5, - 0xfa, 0x00, 0x28, 0x09, 0xd0, 0x78, 0x21, 0x01, - 0x60, 0xe1, 0x68, 0xc1, 0x60, 0x08, 0x21, 0x01, - 0x61, 0x01, 0x1c, 0xed, 0x09, 0x00, 0xa7, 0x00, - 0x09, 0x20, 0xf6, 0xf7, 0x48, 0xfb, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf6, 0xf7, 0xd4, 0xfa, - 0x00, 0x28, 0xf8, 0xd0, 0x72, 0x21, 0x01, 0x60, - 0xe1, 0x68, 0xc1, 0x60, 0x07, 0x61, 0x01, 0x1c, - 0x09, 0x20, 0xf6, 0xf7, 0x38, 0xfb, 0xee, 0xe7, - 0x00, 0xb5, 0xc0, 0x68, 0xff, 0xf7, 0x38, 0xfc, - 0x00, 0x28, 0x03, 0xd0, 0x00, 0x22, 0x16, 0x21, - 0xff, 0xf7, 0xab, 0xfa, 0x08, 0xbc, 0x18, 0x47, - 0x80, 0xb5, 0x07, 0x1c, 0xc0, 0x68, 0x3a, 0x69, - 0x17, 0x21, 0xff, 0xf7, 0xa2, 0xfa, 0x00, 0x28, - 0x02, 0xd1, 0x38, 0x69, 0x1d, 0xf0, 0x59, 0xfe, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x07, 0x1c, 0x00, 0x69, 0x00, 0x28, 0x12, 0xd0, - 0x13, 0x4c, 0x13, 0xa0, 0xe1, 0x1d, 0xa5, 0x31, - 0x0a, 0xf0, 0xb1, 0xfc, 0xe0, 0x1d, 0x79, 0x30, - 0xc0, 0x6a, 0x01, 0x02, 0x09, 0x0a, 0xe0, 0x1d, - 0xad, 0x30, 0x1e, 0xf0, 0x96, 0xfa, 0x00, 0x21, - 0x01, 0x20, 0xf9, 0xf7, 0x93, 0xf9, 0x1e, 0xf0, - 0xb8, 0xf8, 0xf9, 0xf7, 0xba, 0xf9, 0xf6, 0xf7, - 0x8f, 0xfa, 0x00, 0x28, 0x07, 0xd0, 0x7c, 0x21, - 0x01, 0x60, 0xf9, 0x68, 0xc1, 0x60, 0x01, 0x1c, - 0x09, 0x20, 0xf6, 0xf7, 0xf4, 0xfa, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x18, 0xeb, - 0x03, 0x20, 0x0a, 0x4d, 0x79, 0x20, 0x42, 0x54, - 0x41, 0x64, 0x64, 0x72, 0x3a, 0x20, 0x25, 0x3a, - 0x2d, 0x36, 0x42, 0x20, 0x28, 0x66, 0x69, 0x6e, - 0x61, 0x6c, 0x29, 0x0a, 0x00, 0x00, 0xf3, 0xb5, - 0x84, 0xb0, 0x04, 0x98, 0x06, 0x69, 0xc0, 0x68, - 0x00, 0x2e, 0x73, 0xd0, 0x07, 0x23, 0x5b, 0x02, - 0xf1, 0x18, 0x89, 0x68, 0x8f, 0x4b, 0x99, 0x42, - 0x6d, 0xd1, 0x00, 0x28, 0x6a, 0xd0, 0x07, 0x28, - 0x6a, 0xd8, 0xff, 0x23, 0xb5, 0x33, 0xed, 0x09, - 0x00, 0xa8, 0x00, 0x58, 0x43, 0x80, 0x19, 0xc4, - 0x1d, 0x31, 0x34, 0xe0, 0x6c, 0x00, 0x28, 0x05, - 0xd1, 0x20, 0x6d, 0x00, 0x28, 0x5c, 0xd0, 0xc0, - 0x6c, 0x00, 0x28, 0x59, 0xd0, 0xf6, 0xf7, 0x4e, - 0xfa, 0x07, 0x1c, 0x55, 0xd0, 0x04, 0x98, 0xc0, - 0x69, 0x01, 0x90, 0x00, 0x20, 0xe0, 0x64, 0x01, - 0x98, 0x00, 0x28, 0x1e, 0xd0, 0xe0, 0x68, 0x38, - 0x61, 0x65, 0x6d, 0x00, 0x2d, 0x73, 0xd0, 0xb5, - 0x42, 0x71, 0xd0, 0xa0, 0x6d, 0x00, 0x28, 0x03, - 0xd0, 0xa0, 0x42, 0x01, 0xd0, 0xff, 0xf7, 0xfb, - 0xfb, 0x00, 0x21, 0x28, 0x1c, 0xff, 0xf7, 0x91, - 0xfb, 0x00, 0x28, 0x05, 0xd0, 0x01, 0x22, 0x00, - 0x20, 0x29, 0x1c, 0xff, 0xf7, 0xca, 0xfb, 0xc4, - 0xe0, 0x28, 0x1c, 0x71, 0xa1, 0xff, 0xf7, 0xdd, - 0xfa, 0xbf, 0xe0, 0x25, 0x6d, 0x00, 0x2d, 0x05, - 0xd1, 0xe0, 0x68, 0x38, 0x61, 0xff, 0x20, 0x0c, - 0x30, 0x01, 0x90, 0xb6, 0xe0, 0xe8, 0x68, 0x38, - 0x61, 0x62, 0x68, 0x69, 0x68, 0x6e, 0x48, 0x8a, - 0x42, 0x0f, 0xd1, 0xb1, 0x69, 0x01, 0x29, 0x02, - 0xd1, 0x02, 0x21, 0xb1, 0x61, 0x09, 0xe0, 0x02, - 0x29, 0x07, 0xd1, 0x01, 0x21, 0xb1, 0x61, 0xf1, - 0x1d, 0x29, 0x31, 0xc6, 0x1d, 0xa5, 0x36, 0x0c, - 0xce, 0x0c, 0xc1, 0x61, 0x68, 0x89, 0x69, 0x01, - 0x29, 0x10, 0xd1, 0xe8, 0x1d, 0xf9, 0x30, 0x81, - 0x6b, 0x20, 0x1c, 0x00, 0xf0, 0xe6, 0xfb, 0xe0, - 0x1d, 0x0d, 0x30, 0xe9, 0x1d, 0x0d, 0x31, 0x02, - 0xe0, 0xa8, 0xe0, 0xa7, 0xe0, 0xa6, 0xe0, 0x0c, - 0xc9, 0x0c, 0xc0, 0x14, 0xe0, 0xff, 0x30, 0x01, - 0x30, 0x01, 0x68, 0x40, 0x68, 0x41, 0x43, 0xe8, - 0x1d, 0xf9, 0x30, 0x80, 0x6b, 0x09, 0x18, 0x20, - 0x1c, 0x00, 0xf0, 0xcf, 0xfb, 0xe9, 0x1d, 0xff, - 0x31, 0x7a, 0x31, 0x00, 0x20, 0x08, 0x61, 0xe9, - 0x1d, 0xed, 0x09, 0x00, 0xa9, 0x00, 0xff, 0x31, - 0x3a, 0x31, 0x08, 0x61, 0xac, 0x42, 0x0d, 0xd0, - 0x68, 0x68, 0x00, 0x90, 0x04, 0x98, 0x40, 0x69, - 0xa0, 0x60, 0x60, 0x68, 0xc1, 0x68, 0x04, 0x9a, - 0x92, 0x69, 0x91, 0x42, 0x00, 0xd0, 0xc2, 0x60, - 0x05, 0x20, 0x00, 0xe0, 0x64, 0xe0, 0x20, 0x61, - 0xe8, 0x1d, 0xf9, 0x30, 0xc2, 0x69, 0xe1, 0x1d, - 0xf9, 0x31, 0xca, 0x61, 0x00, 0x6a, 0xee, 0x1d, - 0x08, 0x62, 0xe8, 0x1d, 0xff, 0x30, 0x3a, 0x30, - 0xe1, 0x1d, 0xff, 0x31, 0x03, 0x90, 0x40, 0x69, - 0x3a, 0x31, 0x02, 0x91, 0x48, 0x61, 0x03, 0x98, - 0xff, 0x36, 0x80, 0x69, 0x02, 0x99, 0x86, 0x36, - 0x88, 0x61, 0x03, 0x98, 0xc0, 0x69, 0x02, 0x99, - 0xc8, 0x61, 0x03, 0x98, 0x00, 0x6a, 0x02, 0x99, - 0x08, 0x62, 0x0e, 0xce, 0xe0, 0x1d, 0xff, 0x30, - 0x86, 0x30, 0x0e, 0xc0, 0x0e, 0xce, 0x0e, 0xc0, - 0x0e, 0xce, 0x0e, 0xc0, 0x03, 0x98, 0x80, 0x68, - 0x02, 0x99, 0x88, 0x60, 0x03, 0x98, 0xc0, 0x68, - 0x02, 0x99, 0xc8, 0x60, 0x03, 0x98, 0x00, 0x69, - 0x02, 0x99, 0x08, 0x61, 0xe8, 0x1d, 0xff, 0x30, - 0x7a, 0x30, 0xe1, 0x1d, 0xff, 0x31, 0x02, 0x68, - 0x7a, 0x31, 0x0a, 0x60, 0x40, 0x68, 0x48, 0x60, - 0x03, 0x98, 0x40, 0x6b, 0x02, 0x99, 0x48, 0x63, - 0x20, 0x1c, 0x29, 0x1c, 0x01, 0xf0, 0x3d, 0xfb, - 0xe8, 0x68, 0xe0, 0x60, 0x28, 0x1c, 0xff, 0xf7, - 0x41, 0xfb, 0x00, 0x21, 0x00, 0x98, 0xff, 0xf7, - 0xd7, 0xfa, 0x00, 0x28, 0x03, 0xd1, 0x00, 0x98, - 0x1d, 0xa1, 0xff, 0xf7, 0x29, 0xfa, 0xf6, 0xf7, - 0x70, 0xf9, 0x00, 0x28, 0x08, 0xd0, 0x1e, 0x21, - 0x01, 0x60, 0xc4, 0x60, 0xa1, 0x68, 0x01, 0x61, - 0x01, 0x1c, 0x0b, 0x20, 0xf6, 0xf7, 0xd4, 0xf9, - 0x00, 0x20, 0x20, 0x65, 0x60, 0x65, 0xa0, 0x65, - 0x05, 0x99, 0x00, 0x29, 0xed, 0x09, 0x00, 0xaa, - 0x00, 0x08, 0xd1, 0x7d, 0x20, 0x38, 0x60, 0xfc, - 0x60, 0x01, 0x98, 0x78, 0x61, 0x09, 0x20, 0x39, - 0x1c, 0xf6, 0xf7, 0xc4, 0xf9, 0x20, 0x1c, 0x00, - 0xf0, 0x2d, 0xfb, 0x20, 0x1c, 0x00, 0xf0, 0x70, - 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x67, 0xfc, 0x06, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x11, 0x19, 0x03, 0x64, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x34, 0x36, 0x34, - 0x00, 0x18, 0xeb, 0x03, 0x20, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x35, 0x37, 0x33, - 0x00, 0xf7, 0xb5, 0x83, 0xb0, 0x04, 0x1c, 0xf9, - 0xf7, 0x5d, 0xfb, 0x00, 0x90, 0x01, 0x91, 0x04, - 0x9a, 0x05, 0x9b, 0x06, 0xf0, 0xa9, 0xfa, 0x06, - 0x1c, 0x20, 0x1c, 0x0d, 0x1c, 0xff, 0xf7, 0x93, - 0xfa, 0x07, 0x1c, 0x32, 0xd0, 0x20, 0x69, 0x02, - 0x90, 0x04, 0x28, 0x02, 0xd0, 0x02, 0x98, 0x02, - 0x28, 0x2b, 0xd1, 0x18, 0xa3, 0x1a, 0x68, 0x30, - 0x1c, 0x29, 0x1c, 0x5b, 0x68, 0x06, 0xf0, 0x9c, - 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x20, 0x1c, 0x31, - 0x1c, 0x2a, 0x1c, 0x00, 0xf0, 0x9c, 0xf9, 0x1c, - 0xe0, 0x02, 0x9d, 0x20, 0x1c, 0xff, 0xf7, 0xc8, - 0xfa, 0x04, 0x2d, 0x09, 0xd1, 0x38, 0x1c, 0xff, - 0xf7, 0x47, 0xfa, 0x00, 0x28, 0x04, 0xd1, 0x00, - 0x22, 0x0a, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0xe4, - 0xf8, 0x38, 0x69, 0x00, 0x28, 0x09, 0xd1, 0x38, - 0x1c, 0x08, 0xa1, 0xff, 0xf7, 0xa7, 0xf9, 0x0c, - 0x48, 0x80, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xff, - 0xf7, 0x37, 0xfb, 0x06, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x72, 0xed, - 0x09, 0x00, 0xab, 0x00, 0x63, 0x5c, 0x6c, 0x63, - 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, - 0x20, 0x31, 0x36, 0x33, 0x37, 0x00, 0xd8, 0xeb, - 0x03, 0x20, 0xb0, 0xb5, 0x83, 0xb0, 0xff, 0xf7, - 0xec, 0xf9, 0x04, 0x1c, 0x3a, 0xd0, 0x37, 0x23, - 0x9b, 0x01, 0xe5, 0x18, 0xa8, 0x6a, 0x00, 0x28, - 0x34, 0xd0, 0x00, 0x20, 0xa8, 0x62, 0x00, 0x22, - 0x15, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0xaf, 0xf8, - 0x00, 0x28, 0x1d, 0xd1, 0xf6, 0xf7, 0xbe, 0xf8, - 0x07, 0x1c, 0x19, 0xd0, 0x05, 0x20, 0x38, 0x60, - 0xe0, 0x68, 0xf8, 0x60, 0x14, 0x48, 0xc1, 0x69, - 0x49, 0x00, 0x39, 0x61, 0x01, 0x6a, 0x49, 0x00, - 0x79, 0x61, 0x41, 0x6a, 0x49, 0x00, 0xb9, 0x61, - 0x80, 0x6a, 0x40, 0x00, 0xf8, 0x61, 0xf8, 0x1d, - 0x19, 0x30, 0x21, 0x1c, 0x00, 0xf0, 0x2c, 0xff, - 0x0b, 0x20, 0x39, 0x1c, 0xf6, 0xf7, 0x11, 0xf9, - 0xa1, 0x68, 0x00, 0x22, 0x09, 0x48, 0x02, 0x92, - 0x01, 0x91, 0x08, 0xa1, 0x00, 0x90, 0x08, 0x68, - 0x00, 0x23, 0x01, 0x22, 0x49, 0x68, 0x1d, 0xf0, - 0x7e, 0xf9, 0xe8, 0x62, 0x03, 0xb0, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xd8, 0xeb, - 0x03, 0x20, 0x45, 0xaa, 0x00, 0x20, 0x00, 0x10, - 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xb5, - 0xff, 0xf7, 0x9f, 0xf9, 0x04, 0x1c, 0x2e, 0xd0, - 0x37, 0x23, 0x9b, 0x01, 0xe0, 0x18, 0xc1, 0x6a, - 0x00, 0x29, 0x28, 0xd0, 0x01, 0x21, 0x01, 0x63, - 0x00, 0x21, 0xc1, 0x62, 0x02, 0x21, 0x00, 0x22, - 0x20, 0x1c, 0xff, 0xf7, 0x60, 0xf8, 0x00, 0x28, - 0x1d, 0xd1, 0xf6, 0xf7, 0x6f, 0xf8, 0x07, 0x1c, - 0x19, 0xd0, 0x0c, 0x20, 0x38, 0x60, 0xe0, 0x68, - 0xf8, 0x60, 0x0c, 0x48, 0xc1, 0x69, 0x49, 0x00, - 0x39, 0x61, 0x01, 0x6a, 0x49, 0x00, 0x79, 0x61, - 0x41, 0x6a, 0xed, 0x09, 0x00, 0xac, 0x00, 0x49, - 0x00, 0xb9, 0x61, 0x80, 0x6a, 0x40, 0x00, 0xf8, - 0x61, 0xf8, 0x1d, 0x19, 0x30, 0x21, 0x1c, 0x00, - 0xf0, 0xdd, 0xfe, 0x0b, 0x20, 0x39, 0x1c, 0xf6, - 0xf7, 0xc2, 0xf8, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0xd8, 0xeb, 0x03, 0x20, 0x80, - 0xb5, 0x0f, 0x1c, 0xff, 0xf7, 0x64, 0xf9, 0x00, - 0x28, 0x15, 0xd0, 0x37, 0x23, 0x9b, 0x01, 0xc0, - 0x18, 0x41, 0x6a, 0x00, 0x29, 0x0f, 0xd0, 0x00, - 0x21, 0x41, 0x62, 0xf6, 0xf7, 0x3d, 0xf8, 0x00, - 0x28, 0x06, 0xd0, 0x76, 0x21, 0x01, 0x60, 0xc7, - 0x60, 0x01, 0x1c, 0x09, 0x20, 0xf6, 0xf7, 0xa3, - 0xf8, 0x00, 0x20, 0xf8, 0xf7, 0x00, 0xf9, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xff, - 0xf7, 0xb0, 0xf9, 0x07, 0x1c, 0x0f, 0xd0, 0x38, - 0x1c, 0xff, 0xf7, 0x9a, 0xf9, 0x00, 0x28, 0x0a, - 0xd0, 0xf8, 0x1d, 0xff, 0x30, 0x3a, 0x30, 0x01, - 0x6b, 0x00, 0x29, 0x04, 0xd0, 0x00, 0x21, 0x01, - 0x63, 0x38, 0x1c, 0xfe, 0xf7, 0x90, 0xff, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x2a, - 0xf0, 0x7e, 0xfe, 0xff, 0x23, 0x03, 0x33, 0x98, - 0x42, 0x01, 0xd3, 0x07, 0x21, 0x00, 0xe0, 0x05, - 0x21, 0x01, 0x22, 0x00, 0x20, 0xf8, 0xf7, 0xde, - 0xfc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xff, - 0xf7, 0x88, 0xf9, 0x07, 0x1c, 0x0b, 0xd0, 0x38, - 0x1c, 0xff, 0xf7, 0x72, 0xf9, 0x00, 0x28, 0x06, - 0xd0, 0xf8, 0x6b, 0x00, 0x28, 0x03, 0xd0, 0x01, - 0x21, 0x38, 0x1c, 0x00, 0xf0, 0x66, 0xff, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xff, - 0xf7, 0x74, 0xf9, 0x07, 0x1c, 0x21, 0xd0, 0x38, - 0x1c, 0xff, 0xf7, 0x5e, 0xf9, 0x00, 0x28, 0x1c, - 0xd0, 0xf8, 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x01, - 0x6b, 0x00, 0x29, 0x16, 0xd0, 0xed, 0x09, 0x00, - 0xad, 0x00, 0x00, 0x21, 0x01, 0x63, 0x38, 0x1c, - 0x00, 0xf0, 0xb8, 0xf9, 0x38, 0x1c, 0x00, 0xf0, - 0xfb, 0xf8, 0x38, 0x1c, 0x00, 0xf0, 0xf2, 0xfa, - 0xf5, 0xf7, 0xd5, 0xff, 0x00, 0x28, 0x07, 0xd0, - 0x6d, 0x21, 0x01, 0x60, 0xf9, 0x68, 0xc1, 0x60, - 0x01, 0x1c, 0x09, 0x20, 0xf6, 0xf7, 0x3a, 0xf8, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x97, 0xb5, - 0x83, 0xb0, 0xc4, 0x1d, 0xff, 0x34, 0x7a, 0x34, - 0x21, 0x6b, 0x00, 0x27, 0x00, 0x29, 0x02, 0xd0, - 0xff, 0x27, 0x02, 0x37, 0x11, 0xe0, 0x02, 0x68, - 0x40, 0x68, 0x00, 0x23, 0x81, 0x68, 0x09, 0x48, - 0x02, 0x92, 0x01, 0x91, 0x00, 0x90, 0x04, 0x98, - 0x05, 0x99, 0x01, 0x22, 0x1d, 0xf0, 0x98, 0xf8, - 0x20, 0x63, 0x00, 0x28, 0x01, 0xd1, 0xff, 0x27, - 0x02, 0x37, 0x38, 0x1c, 0x06, 0xb0, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x6f, 0xab, 0x00, 0x20, - 0x90, 0xb5, 0xc4, 0x1d, 0xff, 0x34, 0x7a, 0x34, - 0x20, 0x6b, 0x00, 0x27, 0x00, 0x28, 0x05, 0xd0, - 0x05, 0xa1, 0x1d, 0xf0, 0x4d, 0xf9, 0x00, 0x20, - 0x20, 0x63, 0x01, 0xe0, 0xff, 0x27, 0x02, 0x37, - 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, - 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x31, - 0x38, 0x38, 0x38, 0x00, 0x80, 0xb5, 0xff, 0xf7, - 0x07, 0xf9, 0x07, 0x1c, 0x10, 0xd0, 0x38, 0x1c, - 0xff, 0xf7, 0xf1, 0xf8, 0x00, 0x28, 0x0b, 0xd0, - 0xf8, 0x6a, 0x00, 0x28, 0x08, 0xd0, 0x00, 0x20, - 0xf8, 0x62, 0xf9, 0xf7, 0xa7, 0xf9, 0x0a, 0x1c, - 0x01, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x40, 0xfe, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x97, 0xb5, - 0x83, 0xb0, 0x04, 0x1c, 0xc0, 0x6a, 0x00, 0x27, - 0x00, 0x28, 0x02, 0xd0, 0xff, 0x27, 0x02, 0x37, - 0xed, 0x09, 0x00, 0xae, 0x00, 0x11, 0xe0, 0x60, - 0x68, 0x22, 0x68, 0x81, 0x68, 0x09, 0x48, 0x02, - 0x92, 0x00, 0x23, 0x01, 0x91, 0x00, 0x90, 0x04, - 0x98, 0x05, 0x99, 0x01, 0x22, 0x1d, 0xf0, 0x3e, - 0xf8, 0xe0, 0x62, 0x00, 0x28, 0x01, 0xd1, 0xff, - 0x27, 0x02, 0x37, 0x38, 0x1c, 0x06, 0xb0, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x49, 0xac, 0x00, - 0x20, 0x90, 0xb5, 0x04, 0x1c, 0xc0, 0x6a, 0x00, - 0x27, 0x00, 0x28, 0x05, 0xd0, 0x05, 0xa1, 0x1d, - 0xf0, 0xf5, 0xf8, 0x00, 0x20, 0xe0, 0x62, 0x01, - 0xe0, 0xff, 0x27, 0x02, 0x37, 0x38, 0x1c, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x39, 0x34, 0x37, - 0x00, 0x80, 0xb4, 0x02, 0x1c, 0xd1, 0x1d, 0xff, - 0x31, 0x7a, 0x31, 0x4b, 0x69, 0x0f, 0x6a, 0xc9, - 0x69, 0xff, 0x32, 0xdb, 0x1b, 0x59, 0x1a, 0x41, - 0x32, 0x93, 0x68, 0x00, 0x20, 0x8b, 0x42, 0x01, - 0xd0, 0x01, 0x20, 0x91, 0x60, 0x80, 0xbc, 0x70, - 0x47, 0x80, 0xb5, 0xff, 0xf7, 0x9b, 0xf8, 0x07, - 0x1c, 0x19, 0xd0, 0x38, 0x1c, 0xff, 0xf7, 0x85, - 0xf8, 0x00, 0x28, 0x14, 0xd0, 0xf8, 0x1d, 0xf9, - 0x30, 0xc1, 0x6a, 0x00, 0x29, 0x0f, 0xd0, 0x00, - 0x21, 0xc1, 0x62, 0x80, 0x6b, 0x00, 0x28, 0x07, - 0xd0, 0x38, 0x1c, 0xff, 0xf7, 0xd5, 0xff, 0x00, - 0x28, 0x02, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0xd8, - 0xf8, 0x38, 0x1c, 0x00, 0xf0, 0x1b, 0xf8, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xc7, - 0x1d, 0xf9, 0x37, 0xf8, 0x6a, 0x00, 0x28, 0x04, - 0xd0, 0x03, 0xa1, 0x1d, 0xf0, 0xa3, 0xf8, 0x00, - 0x20, 0xf8, 0x62, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0xed, 0x09, 0x00, 0xaf, 0x00, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x30, 0x31, - 0x36, 0x00, 0x90, 0xb5, 0x85, 0xb0, 0x07, 0x1c, - 0x00, 0x69, 0x05, 0x28, 0x1a, 0xd1, 0xfc, 0x1d, - 0xf9, 0x34, 0xe1, 0x6b, 0x00, 0x29, 0x15, 0xd0, - 0x38, 0x1c, 0x00, 0xf0, 0x76, 0xfe, 0x00, 0x21, - 0x03, 0xaa, 0xe0, 0x6b, 0x51, 0x60, 0x10, 0x60, - 0x78, 0x68, 0x3a, 0x68, 0x81, 0x68, 0x07, 0x48, - 0x02, 0x92, 0x00, 0x23, 0x01, 0x91, 0x00, 0x90, - 0x03, 0x98, 0x04, 0x99, 0x01, 0x22, 0x1c, 0xf0, - 0xa8, 0xff, 0xe0, 0x62, 0x05, 0xb0, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x21, 0xad, - 0x00, 0x20, 0x80, 0xb5, 0xff, 0xf7, 0x39, 0xf8, - 0x07, 0x1c, 0x11, 0xd0, 0x38, 0x1c, 0xff, 0xf7, - 0x23, 0xf8, 0x00, 0x28, 0x0c, 0xd0, 0xf8, 0x1d, - 0xf9, 0x30, 0x00, 0x6b, 0x00, 0x28, 0x07, 0xd0, - 0x38, 0x1c, 0xff, 0xf7, 0x78, 0xff, 0x00, 0x28, - 0x05, 0xd0, 0x38, 0x1c, 0x00, 0xf0, 0x3d, 0xf8, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x78, 0x68, - 0x80, 0x69, 0x01, 0x28, 0x10, 0xd1, 0xf8, 0x1d, - 0xff, 0x30, 0x3a, 0x30, 0x0c, 0x4a, 0x41, 0x68, - 0x12, 0x68, 0x91, 0x42, 0x08, 0xd2, 0x01, 0x31, - 0x41, 0x60, 0x38, 0x1c, 0x00, 0xf0, 0x29, 0xf8, - 0x38, 0x1c, 0x01, 0xf0, 0x93, 0xfb, 0xe7, 0xe7, - 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x00, 0x20, - 0x48, 0x60, 0x01, 0x21, 0x38, 0x1c, 0x00, 0xf0, - 0x3c, 0xfe, 0xdd, 0xe7, 0x00, 0x00, 0x18, 0xec, - 0x03, 0x20, 0x80, 0xb5, 0xc7, 0x1d, 0xf9, 0x37, - 0x38, 0x6b, 0x00, 0x28, 0x04, 0xd0, 0x03, 0xa1, - 0x1d, 0xf0, 0x27, 0xf8, 0x00, 0x20, 0x38, 0x63, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, 0xed, 0x09, - 0x00, 0xb0, 0x00, 0x30, 0x38, 0x32, 0x00, 0xb0, - 0xb5, 0x89, 0xb0, 0x07, 0x1c, 0x00, 0x69, 0x05, - 0x28, 0x30, 0xd1, 0xfc, 0x1d, 0xf9, 0x34, 0xa1, - 0x6b, 0x00, 0x29, 0x2b, 0xd0, 0xe0, 0x6b, 0x00, - 0x28, 0x02, 0xd1, 0x38, 0x1c, 0x00, 0xf0, 0xf7, - 0xfd, 0x78, 0x68, 0x03, 0xad, 0x80, 0x69, 0x01, - 0x28, 0x0b, 0xd1, 0xf8, 0x1d, 0xff, 0x30, 0x3a, - 0x30, 0x41, 0x68, 0x00, 0x29, 0x05, 0xd0, 0x00, - 0x68, 0x00, 0x21, 0x05, 0x90, 0x05, 0xa8, 0x06, - 0x91, 0x04, 0xe0, 0xa0, 0x6b, 0x00, 0x21, 0x07, - 0x90, 0x07, 0xa8, 0x08, 0x91, 0x0c, 0xc8, 0x0c, - 0xc5, 0x78, 0x68, 0x3a, 0x68, 0x81, 0x68, 0x07, - 0x48, 0x02, 0x92, 0x00, 0x23, 0x01, 0x91, 0x00, - 0x90, 0x03, 0x98, 0x04, 0x99, 0x01, 0x22, 0x1c, - 0xf0, 0x16, 0xff, 0x20, 0x63, 0x09, 0xb0, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe5, - 0xad, 0x00, 0x20, 0x80, 0xb5, 0x07, 0x1c, 0xf9, - 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x00, 0x20, 0x48, - 0x60, 0x38, 0x1c, 0xff, 0xf7, 0xa0, 0xff, 0x38, - 0x1c, 0xff, 0xf7, 0xb5, 0xff, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0xc5, 0x1d, 0xff, - 0x35, 0xc4, 0x1d, 0xf9, 0x34, 0x3a, 0x35, 0x0f, - 0x1c, 0x00, 0x29, 0x1d, 0x4e, 0x25, 0xd0, 0x40, - 0x68, 0x80, 0x69, 0x01, 0x28, 0x21, 0xd1, 0x1b, - 0x48, 0x02, 0x68, 0x00, 0x2a, 0x03, 0xd1, 0x00, - 0x20, 0xa7, 0x63, 0x28, 0x60, 0x1e, 0xe0, 0x41, - 0x68, 0x13, 0x1c, 0x4b, 0x43, 0xbb, 0x42, 0x0d, - 0xd3, 0x10, 0x1c, 0x79, 0x1e, 0xf5, 0xf7, 0x73, - 0xf9, 0x28, 0x60, 0x00, 0x28, 0x02, 0xd0, 0x38, - 0x1a, 0xa0, 0x63, 0x0f, 0xe0, 0x01, 0x20, 0xa0, - 0x63, 0x28, 0x60, 0x0b, 0xe0, 0x29, 0x60, 0x01, - 0x68, 0x40, 0x68, 0x41, 0x43, 0x78, 0x1a, 0xa0, - 0x63, 0xed, 0x09, 0x00, 0xb1, 0x00, 0x04, 0xe0, - 0x00, 0x20, 0xa7, 0x63, 0x28, 0x60, 0x00, 0x2f, - 0x02, 0xd0, 0x09, 0x4b, 0x9f, 0x42, 0x03, 0xd9, - 0xe6, 0x63, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xb7, 0x42, 0x02, 0xd9, 0x05, 0x48, 0xe0, 0x63, - 0xf7, 0xe7, 0x00, 0x20, 0xe0, 0x63, 0xf4, 0xe7, - 0x40, 0x0d, 0x03, 0x00, 0x18, 0xec, 0x03, 0x20, - 0x80, 0x1a, 0x06, 0x00, 0xa0, 0x86, 0x01, 0x00, - 0x90, 0xb5, 0x04, 0x1c, 0xc0, 0x6b, 0x00, 0x27, - 0x00, 0x28, 0x05, 0xd0, 0x05, 0xa1, 0x1c, 0xf0, - 0x75, 0xff, 0x00, 0x20, 0xe0, 0x63, 0x01, 0xe0, - 0xff, 0x27, 0x02, 0x37, 0x38, 0x1c, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, 0x63, 0x5c, - 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, - 0x63, 0x3a, 0x20, 0x32, 0x31, 0x37, 0x32, 0x00, - 0x80, 0xb5, 0x83, 0xb0, 0x00, 0x21, 0x00, 0x22, - 0x0a, 0x48, 0x02, 0x92, 0x01, 0x91, 0x0a, 0xa1, - 0x00, 0x90, 0x08, 0x68, 0x00, 0x27, 0x00, 0x23, - 0x01, 0x22, 0x49, 0x68, 0x1c, 0xf0, 0x86, 0xfe, - 0x07, 0x49, 0x00, 0x28, 0x88, 0x61, 0x00, 0xd1, - 0x07, 0x27, 0x38, 0x1c, 0x03, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x27, 0xab, 0x00, 0x20, - 0x00, 0x40, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0xec, 0x03, 0x20, 0x90, 0xb5, 0x08, 0x4c, - 0x00, 0x27, 0xa0, 0x69, 0x00, 0x28, 0x05, 0xd0, - 0x06, 0xa1, 0x1c, 0xf0, 0x37, 0xff, 0x00, 0x20, - 0xa0, 0x61, 0x01, 0xe0, 0xff, 0x27, 0x02, 0x37, - 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x18, 0xec, 0x03, 0x20, 0x73, 0x72, 0x63, 0x5c, - 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, - 0x63, 0x3a, 0x20, 0x32, 0x32, 0x30, 0x30, 0x00, - 0xb0, 0xb5, 0xc7, 0x1d, 0xff, 0x37, 0x3a, 0x37, - 0x38, 0x6a, 0x1e, 0x4c, 0xed, 0x09, 0x00, 0xb2, - 0x00, 0x03, 0x01, 0x1b, 0x19, 0xbc, 0x69, 0x01, - 0x34, 0xbc, 0x61, 0x5c, 0x68, 0x4c, 0x43, 0x99, - 0x68, 0x25, 0x1c, 0x51, 0x43, 0x00, 0x24, 0x8d, - 0x42, 0x13, 0xd3, 0x79, 0x69, 0xfa, 0x69, 0x8a, - 0x42, 0x0c, 0xd3, 0x00, 0x28, 0x05, 0xd0, 0x01, - 0x38, 0x38, 0x62, 0xbc, 0x61, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x29, 0xfa, 0xd0, 0x48, - 0x1e, 0x78, 0x61, 0xf7, 0xe7, 0x50, 0x1c, 0xf8, - 0x61, 0xf4, 0xe7, 0xf8, 0xf7, 0x5f, 0xff, 0x41, - 0x1e, 0x38, 0x6a, 0x81, 0x42, 0x06, 0xd9, 0xb9, - 0x69, 0x01, 0x29, 0x03, 0xd9, 0x01, 0x30, 0x38, - 0x62, 0xfc, 0x61, 0xbc, 0x61, 0x78, 0x69, 0x40, - 0x00, 0x78, 0x61, 0x10, 0x28, 0x02, 0xd9, 0x10, - 0x20, 0x78, 0x61, 0xdf, 0xe7, 0x00, 0x28, 0xdd, - 0xd1, 0x01, 0x20, 0x78, 0x61, 0xda, 0xe7, 0x00, - 0x00, 0x50, 0x7b, 0x03, 0x20, 0xf0, 0xb5, 0xfe, - 0xf7, 0xab, 0xfe, 0x07, 0x1c, 0x22, 0xd0, 0x38, - 0x1c, 0xfe, 0xf7, 0x95, 0xfe, 0x00, 0x28, 0x1d, - 0xd0, 0xf8, 0x1d, 0xf9, 0x30, 0x41, 0x6b, 0x00, - 0x29, 0x18, 0xd0, 0x39, 0x69, 0x05, 0x29, 0x15, - 0xd1, 0xf9, 0x1d, 0xff, 0x31, 0x7a, 0x31, 0xcd, - 0x68, 0x0e, 0x69, 0xfc, 0x1d, 0xff, 0x34, 0x00, - 0x21, 0x41, 0x63, 0x3a, 0x34, 0x20, 0x69, 0x32, - 0x1a, 0xe0, 0x68, 0x29, 0x1a, 0x38, 0x1c, 0xff, - 0xf7, 0x99, 0xff, 0xe5, 0x60, 0x26, 0x61, 0x38, - 0x1c, 0x00, 0xf0, 0x1c, 0xf8, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xc7, 0x1d, 0xf9, - 0x37, 0x78, 0x6b, 0x00, 0x28, 0x04, 0xd0, 0x04, - 0xa1, 0x1c, 0xf0, 0xaa, 0xfe, 0x00, 0x20, 0x78, - 0x63, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0xed, - 0x09, 0x00, 0xb3, 0x00, 0x20, 0x32, 0x33, 0x30, - 0x38, 0x00, 0x80, 0xb5, 0x83, 0xb0, 0x01, 0x69, - 0x05, 0x29, 0x13, 0xd1, 0xc7, 0x1d, 0xf9, 0x37, - 0x79, 0x6b, 0x00, 0x29, 0x0e, 0xd1, 0x02, 0x68, - 0x40, 0x68, 0x00, 0x23, 0x81, 0x68, 0x07, 0x48, - 0x02, 0x92, 0x01, 0x91, 0x07, 0xa1, 0x00, 0x90, - 0x08, 0x68, 0x49, 0x68, 0x01, 0x22, 0x1c, 0xf0, - 0xb6, 0xfd, 0x78, 0x63, 0x03, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x01, 0xb1, - 0x00, 0x20, 0x80, 0x84, 0x1e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0x15, 0x1c, - 0x0e, 0x1c, 0xf5, 0xf7, 0xbb, 0xfc, 0x07, 0x1c, - 0x1f, 0xd0, 0xe0, 0x1d, 0xff, 0x30, 0x3a, 0x30, - 0x41, 0x6b, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, - 0x41, 0x63, 0x60, 0x68, 0x80, 0x69, 0x01, 0x28, - 0x02, 0xd1, 0x20, 0x1c, 0x00, 0xf0, 0x96, 0xf8, - 0x00, 0x21, 0x20, 0x1c, 0x00, 0xf0, 0x2d, 0xf8, - 0x79, 0x20, 0x38, 0x60, 0x3e, 0x61, 0xe0, 0x68, - 0xf8, 0x60, 0x28, 0x1c, 0x1d, 0xf0, 0x47, 0xf8, - 0x78, 0x61, 0x09, 0x20, 0x39, 0x1c, 0xf5, 0xf7, - 0x08, 0xfd, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x80, 0xb5, 0xfe, 0xf7, 0x18, 0xfe, 0x07, 0x1c, - 0x14, 0xd0, 0x38, 0x1c, 0xfe, 0xf7, 0x02, 0xfe, - 0x00, 0x28, 0x0f, 0xd0, 0xf8, 0x1d, 0xff, 0x30, - 0x3a, 0x30, 0x81, 0x6b, 0x00, 0x29, 0x09, 0xd0, - 0x39, 0x69, 0x05, 0x29, 0x06, 0xd1, 0x00, 0x21, - 0x81, 0x63, 0x0c, 0x21, 0x00, 0x22, 0x38, 0x1c, - 0xff, 0xf7, 0xbb, 0xff, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xb0, 0xb5, 0xc5, 0x1d, 0xff, 0x35, - 0x3a, 0x35, 0x07, 0x1c, 0xa8, 0x6b, 0x0c, 0x1c, - 0x00, 0x28, 0x0b, 0xd0, 0x07, 0xa1, 0x1c, 0xf0, - 0x22, 0xfe, 0x00, 0x20, 0xa8, 0x63, 0x00, 0x2c, - 0x04, 0xd0, 0xed, 0x09, 0x00, 0xb4, 0x00, 0x00, - 0x22, 0x0c, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0xa3, - 0xff, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, - 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x33, - 0x39, 0x39, 0x00, 0x80, 0xb5, 0x83, 0xb0, 0x01, - 0x69, 0x05, 0x29, 0x14, 0xd1, 0xc7, 0x1d, 0xff, - 0x37, 0x3a, 0x37, 0xb9, 0x6b, 0x00, 0x29, 0x0e, - 0xd1, 0x02, 0x68, 0x40, 0x68, 0x00, 0x23, 0x81, - 0x68, 0x07, 0x48, 0x02, 0x92, 0x01, 0x91, 0x06, - 0xa1, 0x00, 0x90, 0x08, 0x68, 0x49, 0x68, 0x01, - 0x22, 0x1c, 0xf0, 0x27, 0xfd, 0xb8, 0x63, 0x03, - 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x27, - 0xb2, 0x00, 0x20, 0x40, 0x77, 0x1b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0xb5, 0xfe, 0xf7, 0xb5, - 0xfd, 0x07, 0x1c, 0x16, 0xd0, 0x38, 0x1c, 0xfe, - 0xf7, 0x9f, 0xfd, 0x00, 0x28, 0x11, 0xd0, 0xf8, - 0x1d, 0xff, 0x30, 0x3a, 0x30, 0xc1, 0x6b, 0x00, - 0x29, 0x0b, 0xd0, 0x39, 0x69, 0x05, 0x29, 0x08, - 0xd1, 0x00, 0x21, 0xc1, 0x63, 0x38, 0x1c, 0x01, - 0xf0, 0x25, 0xf9, 0x00, 0x21, 0x38, 0x1c, 0x00, - 0xf0, 0x1c, 0xf8, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x80, 0xb5, 0xc7, 0x1d, 0xff, 0x37, 0x3a, - 0x37, 0xf8, 0x6b, 0x00, 0x28, 0x04, 0xd0, 0x03, - 0xa1, 0x1c, 0xf0, 0xbf, 0xfd, 0x00, 0x20, 0xf8, - 0x63, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, - 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x34, - 0x35, 0x38, 0x00, 0x80, 0xb5, 0x83, 0xb0, 0x0b, - 0x1c, 0x01, 0x69, 0x05, 0x29, 0x18, 0xd1, 0xc7, - 0x1d, 0xff, 0x37, 0x3a, 0x37, 0xf9, 0x6b, 0x00, - 0x29, 0x12, 0xd1, 0x02, 0x68, 0x40, 0x68, 0x00, - 0x2b, 0x81, 0x68, 0x09, 0x48, 0xed, 0x09, 0x00, - 0xb5, 0x00, 0x02, 0x92, 0x01, 0x91, 0x00, 0x90, - 0x01, 0xd0, 0x08, 0xa1, 0x00, 0xe0, 0x09, 0xa1, - 0x08, 0x68, 0x00, 0x23, 0x01, 0x22, 0x49, 0x68, - 0x1c, 0xf0, 0xc6, 0xfc, 0xf8, 0x63, 0x03, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0xed, 0xb2, 0x00, 0x20, 0x40, 0x0d, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0xa1, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf3, 0xb5, 0x81, 0xb0, - 0x00, 0x24, 0x37, 0x23, 0x9b, 0x01, 0xc1, 0x18, - 0x00, 0x91, 0x4e, 0x6b, 0x05, 0x1c, 0x00, 0x2e, - 0x02, 0xd1, 0xff, 0x24, 0x0c, 0x34, 0x2f, 0xe0, - 0x30, 0x69, 0x02, 0x28, 0x02, 0xd0, 0xff, 0x24, - 0x0a, 0x34, 0x29, 0xe0, 0xf5, 0xf7, 0xb7, 0xfb, - 0x07, 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x23, 0xe0, - 0x00, 0x99, 0x00, 0x20, 0x48, 0x63, 0x02, 0x99, - 0x00, 0x29, 0x0c, 0xd1, 0x05, 0x20, 0x30, 0x61, - 0x1a, 0x20, 0x28, 0x61, 0x30, 0x1c, 0xff, 0xf7, - 0x81, 0xfd, 0x30, 0x1c, 0xff, 0xf7, 0xc4, 0xfc, - 0x30, 0x1c, 0xff, 0xf7, 0xbb, 0xfe, 0x70, 0x20, - 0x38, 0x60, 0xf0, 0x68, 0xf8, 0x60, 0x02, 0x99, - 0xf0, 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x39, 0x61, - 0x01, 0x68, 0x79, 0x61, 0x40, 0x68, 0xb8, 0x61, - 0x09, 0x20, 0x39, 0x1c, 0xf5, 0xf7, 0xfe, 0xfb, - 0x20, 0x1c, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x21, 0x01, 0x61, 0x08, 0x1c, - 0x70, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0xb6, 0xff, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x90, 0xb5, - 0xff, 0x23, 0x11, 0x33, 0x00, 0x24, 0x07, 0x1c, - 0x99, 0x42, 0x06, 0xd1, 0x1a, 0x20, 0x37, 0x23, - 0x9b, 0x01, 0x38, 0x61, 0xf8, 0x18, 0x44, 0x63, - 0x0b, 0xe0, 0x38, 0x1c, 0xff, 0xf7, 0xa2, 0xff, - 0x00, 0x28, 0x06, 0xd0, 0x38, 0x69, 0x00, 0x28, - 0xed, 0x09, 0x00, 0xb6, 0x00, 0x03, 0xd1, 0x38, - 0x1c, 0x03, 0xa1, 0xfe, 0xf7, 0x1d, 0xfc, 0x20, - 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x32, 0x35, 0x37, 0x39, 0x00, 0x90, 0xb5, 0x83, - 0xb0, 0x07, 0x1c, 0x0f, 0x48, 0x1c, 0xf0, 0x4c, - 0xfe, 0x00, 0x21, 0x0e, 0x4a, 0xf5, 0xf7, 0x00, - 0xf9, 0x0b, 0x1c, 0xb9, 0x68, 0x04, 0x1c, 0x0c, - 0x48, 0x00, 0x22, 0x01, 0x91, 0x19, 0x1c, 0x02, - 0x92, 0x01, 0x22, 0x00, 0x23, 0x00, 0x90, 0x20, - 0x1c, 0x1c, 0xf0, 0x28, 0xfc, 0x37, 0x23, 0x9b, - 0x01, 0xf9, 0x18, 0x88, 0x62, 0x03, 0xb0, 0x90, - 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0x00, 0xdf, 0x03, 0x00, 0x00, 0xe2, 0x04, 0x00, - 0x00, 0xa9, 0xa9, 0x00, 0x20, 0x90, 0xb5, 0x37, - 0x23, 0x9b, 0x01, 0xc4, 0x18, 0xa0, 0x6a, 0x00, - 0x27, 0x00, 0x28, 0x03, 0xd0, 0x03, 0xa1, 0x1c, - 0xf0, 0xd9, 0xfc, 0xa7, 0x62, 0x38, 0x1c, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x36, 0x30, 0x36, - 0x00, 0x90, 0xb5, 0x37, 0x23, 0x9b, 0x01, 0xc4, - 0x18, 0xe0, 0x6a, 0x00, 0x27, 0x00, 0x28, 0x03, - 0xd0, 0x03, 0xa1, 0x1c, 0xf0, 0xbf, 0xfc, 0xe7, - 0x62, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x32, 0x36, 0x32, 0x30, 0x00, 0x90, 0xb5, 0x37, - 0x23, 0x9b, 0x01, 0xc4, 0x18, 0xe0, 0x6a, 0x00, - 0x27, 0x00, 0x28, 0x03, 0xd0, 0x03, 0xa1, 0x1c, - 0xf0, 0xa5, 0xfc, 0xe7, 0x62, 0x38, 0x1c, 0x90, - 0xbc, 0x08, 0xbc, 0xed, 0x09, 0x00, 0xb7, 0x00, - 0x18, 0x47, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, - 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, - 0x20, 0x32, 0x36, 0x33, 0x37, 0x00, 0xf8, 0xb5, - 0x04, 0x1c, 0x08, 0x7a, 0xff, 0x23, 0xb5, 0x33, - 0x58, 0x43, 0x00, 0x19, 0xc5, 0x1d, 0x80, 0x6c, - 0x31, 0x35, 0x0e, 0x1c, 0x00, 0x28, 0x42, 0xd1, - 0xf5, 0xf7, 0xd2, 0xfa, 0x07, 0x1c, 0x3e, 0xd0, - 0x03, 0x23, 0xb0, 0x6c, 0x1b, 0x04, 0x18, 0x40, - 0x06, 0x0c, 0x05, 0x20, 0x28, 0x61, 0xe8, 0x1d, - 0xff, 0x30, 0x7a, 0x30, 0x00, 0x90, 0x46, 0x60, - 0x28, 0x1c, 0x1a, 0x49, 0xff, 0xf7, 0xab, 0xfc, - 0x1a, 0x20, 0x20, 0x61, 0x28, 0x1c, 0xff, 0xf7, - 0x96, 0xfc, 0x28, 0x1c, 0xff, 0xf7, 0xd9, 0xfb, - 0x28, 0x1c, 0xff, 0xf7, 0xd0, 0xfd, 0xff, 0xf7, - 0x28, 0xfd, 0x2a, 0xf0, 0x1c, 0xf9, 0xff, 0x23, - 0x03, 0x33, 0x98, 0x42, 0x01, 0xd3, 0x07, 0x21, - 0x00, 0xe0, 0x05, 0x21, 0x01, 0x22, 0x00, 0x20, - 0xf7, 0xf7, 0x7c, 0xff, 0x71, 0x20, 0x38, 0x60, - 0xfd, 0x60, 0x28, 0x6a, 0xe9, 0x1d, 0x38, 0x61, - 0x0d, 0x31, 0x28, 0xc9, 0xf8, 0x1d, 0x0d, 0x30, - 0x28, 0xc0, 0x00, 0x98, 0x00, 0x68, 0xf8, 0x61, - 0x09, 0x20, 0x39, 0x1c, 0x3e, 0x62, 0xf5, 0xf7, - 0x02, 0xfb, 0xfe, 0xf7, 0xde, 0xfc, 0xf8, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x5a, - 0x62, 0x02, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, - 0x70, 0x47, 0x00, 0xb5, 0x02, 0x1c, 0x08, 0x1c, - 0x11, 0x1c, 0x00, 0x22, 0xfe, 0xf7, 0x20, 0xfa, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0xf0, 0xb5, - 0x04, 0x1c, 0x48, 0x6a, 0xff, 0x23, 0xb5, 0x33, - 0x58, 0x43, 0x00, 0x19, 0xc6, 0x1d, 0x80, 0x6c, - 0x31, 0x36, 0x00, 0x27, 0x0d, 0x1c, 0x00, 0x28, - 0x02, 0xd0, 0xff, 0x27, 0x0a, 0x37, 0xed, 0x09, - 0x00, 0xb8, 0x00, 0x13, 0xe0, 0x30, 0x1c, 0x29, - 0x1c, 0x00, 0xf0, 0x38, 0xfc, 0xa8, 0x6c, 0x1c, - 0xf0, 0x0e, 0xfe, 0x00, 0x22, 0x21, 0x1c, 0xa8, - 0x6c, 0xfe, 0xf7, 0x00, 0xfa, 0x06, 0x48, 0xf2, - 0x1d, 0xff, 0x32, 0xc1, 0x6b, 0x7a, 0x32, 0x51, - 0x60, 0x80, 0x6b, 0x10, 0x60, 0x38, 0x1c, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xd8, - 0xeb, 0x03, 0x20, 0x00, 0x20, 0x70, 0x47, 0x90, - 0xb5, 0x37, 0x23, 0x9b, 0x01, 0xc4, 0x18, 0x60, - 0x6a, 0x00, 0x27, 0x00, 0x28, 0x03, 0xd0, 0x03, - 0xa1, 0x1c, 0xf0, 0xf9, 0xfb, 0x67, 0x62, 0x38, - 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, - 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x37, - 0x36, 0x36, 0x00, 0xb0, 0xb5, 0x00, 0x27, 0x0c, - 0x1c, 0xf5, 0xf7, 0x30, 0xfa, 0x00, 0x28, 0x01, - 0xd1, 0x07, 0x27, 0x31, 0xe0, 0x77, 0x21, 0x01, - 0x60, 0x61, 0x68, 0x89, 0x01, 0x09, 0x0a, 0xc1, - 0x60, 0xe5, 0x1d, 0x29, 0x35, 0x0c, 0xcd, 0xc1, - 0x1d, 0x09, 0x31, 0x0c, 0xc1, 0x21, 0x6b, 0xc2, - 0x69, 0x14, 0x4b, 0x09, 0x02, 0x09, 0x0a, 0x1a, - 0x40, 0x89, 0x00, 0x11, 0x43, 0xc1, 0x61, 0x22, - 0x6b, 0x12, 0x0e, 0x06, 0xd3, 0x89, 0x01, 0x89, - 0x09, 0x13, 0x23, 0x9b, 0x06, 0x19, 0x43, 0xc1, - 0x61, 0x04, 0xe0, 0x89, 0x01, 0x0c, 0x4b, 0x89, - 0x09, 0x19, 0x43, 0xc1, 0x61, 0xa1, 0x69, 0x01, - 0x62, 0xe1, 0x69, 0x41, 0x62, 0xe1, 0x6a, 0x81, - 0x62, 0x21, 0x6a, 0x01, 0x63, 0xa1, 0x6a, 0xc1, - 0x62, 0x01, 0x1c, 0x09, 0x20, 0xf5, 0xf7, 0x69, - 0xfa, 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x03, 0x00, 0x00, 0xfc, 0x00, - 0x00, 0x00, 0xb0, 0x00, 0xb5, 0x37, 0x23, 0x9b, - 0x01, 0xed, 0x09, 0x00, 0xb9, 0x00, 0xc2, 0x18, - 0x52, 0x6b, 0x8b, 0x6c, 0x01, 0x1c, 0x18, 0x1c, - 0xfe, 0xf7, 0x87, 0xf9, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x29, - 0x06, 0xd0, 0x37, 0x23, 0x9b, 0x01, 0xc0, 0x18, - 0x40, 0x6b, 0x88, 0x42, 0x00, 0xd1, 0x08, 0x69, - 0x00, 0x20, 0x70, 0x47, 0xb0, 0xb5, 0x04, 0x1c, - 0x08, 0x7a, 0xff, 0x23, 0xb5, 0x33, 0x58, 0x43, - 0x00, 0x19, 0x00, 0x27, 0x37, 0x23, 0x9b, 0x01, - 0xc5, 0x1d, 0xe0, 0x18, 0x40, 0x6b, 0x31, 0x35, - 0x00, 0x28, 0x01, 0xd0, 0xa8, 0x42, 0x02, 0xd0, - 0xff, 0x27, 0x12, 0x37, 0x0f, 0xe0, 0x28, 0x69, - 0x02, 0x28, 0x02, 0xd0, 0xff, 0x27, 0x0a, 0x37, - 0x09, 0xe0, 0x28, 0x1c, 0xfe, 0xf7, 0x12, 0xf9, - 0x28, 0x1c, 0xff, 0xf7, 0xed, 0xfb, 0x00, 0x21, - 0x20, 0x1c, 0xff, 0xf7, 0xe5, 0xfd, 0x38, 0x1c, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x29, - 0x06, 0xd0, 0x37, 0x23, 0x9b, 0x01, 0xc0, 0x18, - 0x40, 0x6b, 0x88, 0x42, 0x00, 0xd1, 0x08, 0x69, - 0x00, 0x20, 0x70, 0x47, 0x90, 0xb5, 0x0b, 0x7a, - 0x4a, 0x6a, 0x01, 0x2b, 0x1f, 0xd3, 0x08, 0x2b, - 0x1d, 0xd2, 0x01, 0x2a, 0x1b, 0xd3, 0x08, 0x2a, - 0x19, 0xd2, 0x1f, 0x1c, 0xff, 0x23, 0xb5, 0x33, - 0x7b, 0x43, 0x18, 0x18, 0xc7, 0x1d, 0x80, 0x6c, - 0x31, 0x37, 0x01, 0x28, 0x01, 0xd0, 0x05, 0x28, - 0x0d, 0xd1, 0xf8, 0x6c, 0x00, 0x28, 0x0a, 0xd0, - 0xff, 0x23, 0xb5, 0x33, 0x5a, 0x43, 0x78, 0x6d, - 0x10, 0x18, 0xc4, 0x1d, 0x31, 0x34, 0x20, 0x1c, - 0x00, 0xf0, 0x4f, 0xfb, 0x27, 0x65, 0x90, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x02, 0x49, - 0x0c, 0xc9, 0x0c, 0xc0, 0x70, 0x47, 0x00, 0x00, - 0xb8, 0xeb, 0x03, 0x20, 0xff, 0xb5, 0x81, 0xb0, - 0x00, 0x27, 0x01, 0x20, 0xed, 0x09, 0x00, 0xba, - 0x00, 0x14, 0x1c, 0x0d, 0x1c, 0x0c, 0x9e, 0xfe, - 0xf7, 0x9f, 0xfa, 0x00, 0x28, 0x02, 0xd1, 0x01, - 0x20, 0xfe, 0xf7, 0x6e, 0xfa, 0x02, 0x2d, 0x24, - 0xd1, 0x03, 0x20, 0xfe, 0xf7, 0x4d, 0xfa, 0x04, - 0x1c, 0x0b, 0xd1, 0x04, 0x20, 0xfe, 0xf7, 0x48, - 0xfa, 0x04, 0x1c, 0x06, 0xd1, 0x05, 0x20, 0xfe, - 0xf7, 0x43, 0xfa, 0x04, 0x1c, 0x01, 0xd1, 0x0c, - 0x27, 0x95, 0xe0, 0xf5, 0xf7, 0x50, 0xf9, 0x05, - 0x1c, 0x01, 0xd1, 0x07, 0x27, 0x8f, 0xe0, 0x00, - 0x22, 0x03, 0x21, 0x20, 0x1c, 0xfe, 0xf7, 0x34, - 0xf9, 0x04, 0x20, 0x28, 0x60, 0xe0, 0x68, 0xe8, - 0x60, 0x0b, 0x20, 0x29, 0x1c, 0xf5, 0xf7, 0xae, - 0xf9, 0x81, 0xe0, 0x02, 0x2c, 0x24, 0xd1, 0x07, - 0x20, 0xfe, 0xf7, 0x26, 0xfa, 0x04, 0x1c, 0x0b, - 0xd1, 0x08, 0x20, 0xfe, 0xf7, 0x21, 0xfa, 0x04, - 0x1c, 0x06, 0xd1, 0x09, 0x20, 0xfe, 0xf7, 0x1c, - 0xfa, 0x04, 0x1c, 0x01, 0xd1, 0x0c, 0x27, 0x6e, - 0xe0, 0xf5, 0xf7, 0x29, 0xf9, 0x05, 0x1c, 0x01, - 0xd1, 0x07, 0x27, 0x68, 0xe0, 0x00, 0x22, 0x03, - 0x21, 0x20, 0x1c, 0xfe, 0xf7, 0x0d, 0xf9, 0x0a, - 0x20, 0x28, 0x60, 0xe0, 0x68, 0xe8, 0x60, 0x0b, - 0x20, 0x29, 0x1c, 0xf5, 0xf7, 0x87, 0xf9, 0x5a, - 0xe0, 0x0b, 0x98, 0x76, 0x00, 0x40, 0x00, 0x00, - 0x90, 0x01, 0x2d, 0x2c, 0xd1, 0x2c, 0xa1, 0x02, - 0x20, 0xfe, 0xf7, 0x94, 0xf9, 0x05, 0x1c, 0x01, - 0xd1, 0x07, 0x27, 0x4c, 0xe0, 0xf5, 0xf7, 0x07, - 0xf9, 0x04, 0x1c, 0x05, 0xd1, 0x28, 0x1c, 0x2b, - 0xa1, 0xfe, 0xf7, 0xb8, 0xf9, 0x07, 0x27, 0x42, - 0xe0, 0x00, 0x22, 0x01, 0x21, 0x28, 0x1c, 0xfe, - 0xf7, 0xe7, 0xf8, 0x03, 0x20, 0x20, 0x60, 0xe5, - 0x60, 0x04, 0x9b, 0x58, 0x00, 0x20, 0x61, 0x0a, - 0x98, 0x40, 0x00, 0x60, 0x61, 0x00, 0x98, 0xed, - 0x09, 0x00, 0xbb, 0x00, 0xa0, 0x61, 0xe0, 0x1d, - 0x19, 0x30, 0x29, 0x1c, 0xe6, 0x61, 0xff, 0xf7, - 0x6f, 0xff, 0x0b, 0x20, 0x21, 0x1c, 0xf5, 0xf7, - 0x54, 0xf9, 0x27, 0xe0, 0x01, 0x2c, 0x25, 0xd1, - 0x1f, 0xa1, 0x02, 0x20, 0xfe, 0xf7, 0x65, 0xf9, - 0x05, 0x1c, 0x01, 0xd1, 0x07, 0x27, 0x1d, 0xe0, - 0xf5, 0xf7, 0xd8, 0xf8, 0x04, 0x1c, 0x05, 0xd1, - 0x28, 0x1c, 0x1d, 0xa1, 0xfe, 0xf7, 0x89, 0xf9, - 0x07, 0x27, 0x13, 0xe0, 0x37, 0x23, 0x9b, 0x01, - 0x01, 0x98, 0xe9, 0x18, 0x08, 0x63, 0x06, 0x21, - 0x00, 0x22, 0x28, 0x1c, 0xfe, 0xf7, 0xb3, 0xf8, - 0x09, 0x20, 0x20, 0x60, 0xe5, 0x60, 0x00, 0x98, - 0x20, 0x61, 0x0b, 0x20, 0x21, 0x1c, 0x66, 0x61, - 0xf5, 0xf7, 0x2b, 0xf9, 0x38, 0x1c, 0x05, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x30, 0x34, - 0x32, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, - 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, - 0x20, 0x33, 0x30, 0x34, 0x38, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x30, 0x36, - 0x39, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, - 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, - 0x20, 0x33, 0x30, 0x37, 0x35, 0x00, 0xf3, 0xb5, - 0x00, 0x24, 0x07, 0x1c, 0xfe, 0xf7, 0xfe, 0xf9, - 0x06, 0x1c, 0x02, 0xd1, 0xff, 0x24, 0x0c, 0x34, - 0x24, 0xe0, 0x38, 0x69, 0x02, 0x28, 0x04, 0xd0, - 0x05, 0x28, 0x02, 0xd0, 0xff, 0x24, 0x0a, 0x34, - 0x1c, 0xe0, 0xf5, 0xf7, 0x7b, 0xf8, 0x05, 0x1c, - 0x02, 0xd1, 0xff, 0x24, 0x01, 0x34, 0x15, 0xe0, - 0x38, 0x1c, 0xfd, 0xf7, 0xcc, 0xff, 0x01, 0x99, - 0x00, 0x29, 0xed, 0x09, 0x00, 0xbc, 0x00, 0x02, - 0xd1, 0x38, 0x1c, 0xff, 0xf7, 0xa4, 0xfa, 0x09, - 0x21, 0x30, 0x1c, 0x3a, 0x1c, 0xfe, 0xf7, 0x55, - 0xf8, 0x08, 0x20, 0x28, 0x60, 0xb8, 0x68, 0xe8, - 0x60, 0x0b, 0x20, 0x29, 0x1c, 0xf5, 0xf7, 0xcf, - 0xf8, 0x20, 0x1c, 0x02, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, 0xfe, - 0xf7, 0xcb, 0xf9, 0x00, 0x28, 0x0e, 0xd0, 0x38, - 0x69, 0x05, 0x28, 0x0b, 0xd1, 0xf5, 0xf7, 0x50, - 0xf8, 0x00, 0x28, 0x07, 0xd0, 0x20, 0x21, 0x01, - 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x01, 0x1c, 0x0b, - 0x20, 0xf5, 0xf7, 0xb5, 0xf8, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x00, 0x24, 0x0d, - 0x1c, 0x07, 0x1c, 0xfe, 0xf7, 0xb1, 0xf9, 0x00, - 0x28, 0x02, 0xd1, 0xff, 0x24, 0x0c, 0x34, 0x54, - 0xe0, 0x38, 0x69, 0x05, 0x28, 0x04, 0xd0, 0x02, - 0x28, 0x02, 0xd0, 0xff, 0x24, 0x0a, 0x34, 0x4c, - 0xe0, 0xfe, 0x1d, 0xf9, 0x36, 0x00, 0x2d, 0x05, - 0xd1, 0x30, 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x38, - 0x1c, 0xff, 0xf7, 0xab, 0xf9, 0x38, 0x69, 0x02, - 0x28, 0x08, 0xd1, 0x00, 0x2d, 0x01, 0xd1, 0x01, - 0x20, 0x38, 0x64, 0x00, 0x21, 0x38, 0x1c, 0xff, - 0xf7, 0x8c, 0xff, 0x36, 0xe0, 0xf5, 0xf7, 0x18, - 0xf8, 0x05, 0x1c, 0x02, 0xd1, 0xff, 0x24, 0x01, - 0x34, 0x2f, 0xe0, 0x38, 0x1c, 0xff, 0xf7, 0x19, - 0xf9, 0x38, 0x1c, 0xff, 0xf7, 0x0f, 0xfb, 0x38, - 0x1c, 0xff, 0xf7, 0xf6, 0xfb, 0x01, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0x8d, 0xfb, 0x38, 0x1c, 0xff, - 0xf7, 0x60, 0xf8, 0x38, 0x1c, 0xfd, 0xf7, 0x59, - 0xff, 0x38, 0x1c, 0xff, 0xf7, 0x34, 0xfa, 0xb0, - 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x38, - 0x1c, 0xf7, 0xf7, 0xb3, 0xfe, 0x00, 0x21, 0x38, - 0x1c, 0xf7, 0xf7, 0x3b, 0xfe, 0xed, 0x09, 0x00, - 0xbd, 0x00, 0x03, 0x20, 0x38, 0x61, 0x14, 0x20, - 0x28, 0x60, 0xb8, 0x68, 0x01, 0x22, 0xe8, 0x60, - 0x79, 0x68, 0x38, 0x1c, 0xfe, 0xf7, 0x86, 0xf9, - 0x0b, 0x20, 0x29, 0x1c, 0xf5, 0xf7, 0x52, 0xf8, - 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x0c, 0x48, 0x00, 0x69, 0x00, 0x28, 0x13, 0xd0, - 0x01, 0x21, 0xff, 0x22, 0xb5, 0x32, 0x4a, 0x43, - 0x12, 0x18, 0x92, 0x6c, 0x05, 0x2a, 0x05, 0xd1, - 0xff, 0x23, 0xb5, 0x33, 0x59, 0x43, 0x08, 0x18, - 0x38, 0x30, 0x70, 0x47, 0x01, 0x31, 0x08, 0x29, - 0xef, 0xd3, 0x00, 0x68, 0x00, 0x28, 0xeb, 0xd1, - 0x00, 0x20, 0x70, 0x47, 0x98, 0xeb, 0x03, 0x20, - 0x80, 0xb5, 0x88, 0x42, 0x01, 0xd1, 0x00, 0x27, - 0x06, 0xe0, 0x01, 0x23, 0xdb, 0x02, 0x98, 0x42, - 0x01, 0xd8, 0x01, 0x27, 0x00, 0xe0, 0x02, 0x27, - 0xf4, 0xf7, 0xb5, 0xff, 0x00, 0x28, 0x06, 0xd0, - 0x1d, 0x21, 0x01, 0x60, 0xc7, 0x60, 0x01, 0x1c, - 0x0b, 0x20, 0xf5, 0xf7, 0x1b, 0xf8, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x1c, 0x1c, - 0x15, 0x1c, 0x0e, 0x1c, 0x07, 0x1c, 0xfe, 0xf7, - 0x16, 0xf9, 0x00, 0x28, 0x2b, 0xd0, 0x38, 0x69, - 0x05, 0x28, 0x28, 0xd1, 0xf4, 0xf7, 0x9b, 0xff, - 0x00, 0x28, 0x24, 0xd0, 0x10, 0x21, 0x01, 0x60, - 0xb9, 0x68, 0xc1, 0x60, 0x71, 0x00, 0x01, 0x61, - 0x69, 0x00, 0x41, 0x61, 0x00, 0x21, 0x81, 0x61, - 0xc1, 0x61, 0x01, 0x1c, 0x0b, 0x20, 0xf4, 0xf7, - 0xf9, 0xff, 0x38, 0x1c, 0xff, 0xf7, 0x0c, 0xf9, - 0x38, 0x1c, 0xff, 0xf7, 0x8d, 0xf8, 0x38, 0x1c, - 0xff, 0xf7, 0x83, 0xfa, 0x38, 0x1c, 0xff, 0xf7, - 0x6a, 0xfb, 0x01, 0x21, 0x38, 0x1c, 0xff, 0xf7, - 0x01, 0xfb, 0x04, 0x49, 0x00, 0x22, 0x61, 0x43, - 0x38, 0x1c, 0xfe, 0xf7, 0xac, 0xff, 0xf0, 0xbc, - 0xed, 0x09, 0x00, 0xbe, 0x00, 0x08, 0xbc, 0x18, - 0x47, 0xe2, 0x04, 0x00, 0x00, 0xff, 0xb5, 0x14, - 0x1c, 0x0d, 0x1c, 0x07, 0x1c, 0x09, 0x9e, 0xfe, - 0xf7, 0xdc, 0xf8, 0x00, 0x28, 0x10, 0xd0, 0x38, - 0x69, 0x05, 0x28, 0x0d, 0xd1, 0xf4, 0xf7, 0x61, - 0xff, 0x00, 0x28, 0x09, 0xd0, 0x00, 0x2c, 0x0b, - 0xd1, 0x11, 0x21, 0x01, 0x60, 0xb9, 0x68, 0xc1, - 0x60, 0x01, 0x1c, 0x0b, 0x20, 0xf4, 0xf7, 0xc4, - 0xff, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x10, 0x21, 0x01, 0x60, 0xb9, 0x68, 0xc1, - 0x60, 0x69, 0x00, 0x01, 0x61, 0x61, 0x00, 0x41, - 0x61, 0x03, 0x9b, 0x99, 0x00, 0x81, 0x61, 0xb1, - 0x00, 0xc1, 0x61, 0x01, 0x1c, 0x0b, 0x20, 0xf4, - 0xf7, 0xaf, 0xff, 0xe9, 0xe7, 0x90, 0xb5, 0x17, - 0x1c, 0x00, 0x29, 0x20, 0xd0, 0x07, 0x29, 0x1e, - 0xd8, 0x00, 0x28, 0x1c, 0xd0, 0x07, 0x23, 0x5b, - 0x02, 0xc2, 0x18, 0x92, 0x68, 0x0d, 0x4b, 0x9a, - 0x42, 0x15, 0xd1, 0xff, 0x23, 0xb5, 0x33, 0x59, - 0x43, 0x08, 0x18, 0xc4, 0x1d, 0x80, 0x6c, 0x31, - 0x34, 0x00, 0x28, 0x0c, 0xd1, 0xf4, 0xf7, 0x25, - 0xff, 0x00, 0x28, 0x08, 0xd0, 0x1c, 0x21, 0xa7, - 0x60, 0x01, 0x60, 0x04, 0x61, 0xc7, 0x60, 0x01, - 0x1c, 0x0b, 0x20, 0xf4, 0xf7, 0x89, 0xff, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x11, 0x19, 0x03, - 0x64, 0x90, 0xb5, 0xc4, 0x68, 0x07, 0x1c, 0x20, - 0x1c, 0xfe, 0xf7, 0x83, 0xf8, 0x00, 0x28, 0x1e, - 0xd0, 0x20, 0x69, 0x05, 0x28, 0x1b, 0xd1, 0xf4, - 0xf7, 0x08, 0xff, 0x00, 0x28, 0x17, 0xd0, 0x7f, - 0x21, 0x01, 0x60, 0xe1, 0x68, 0xfc, 0x1d, 0xc1, - 0x60, 0x00, 0x21, 0x01, 0x61, 0x39, 0x69, 0x0d, - 0x34, 0x41, 0x61, 0x0c, 0xcc, 0xc1, 0x1d, 0x11, - 0x31, 0x0c, 0xc1, 0xf9, 0x69, 0x01, 0x62, 0x39, - 0x6a, 0x41, 0x62, 0xed, 0x09, 0x00, 0xbf, 0x00, - 0x79, 0x6a, 0x81, 0x62, 0x01, 0x1c, 0x09, 0x20, - 0xf4, 0xf7, 0x5d, 0xff, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf8, 0xb5, 0xc5, 0x68, 0x04, 0x1c, - 0x28, 0x1c, 0xfe, 0xf7, 0x59, 0xf8, 0x07, 0x1c, - 0x44, 0xd0, 0x28, 0x69, 0x05, 0x28, 0x41, 0xd1, - 0xf8, 0xf7, 0x11, 0xf9, 0x21, 0xa3, 0x1a, 0x68, - 0x5b, 0x68, 0x04, 0xf0, 0x10, 0xff, 0x00, 0x90, - 0xe6, 0x1d, 0x09, 0x36, 0x0e, 0xce, 0xe8, 0x1d, - 0xff, 0x30, 0x86, 0x30, 0x0e, 0xc0, 0x0e, 0xce, - 0x0e, 0xc0, 0xea, 0x1d, 0xff, 0x32, 0xa0, 0x6a, - 0x7a, 0x32, 0x90, 0x60, 0xe8, 0x1d, 0xff, 0x30, - 0x3a, 0x30, 0x83, 0x6a, 0xd1, 0x68, 0x44, 0x6a, - 0xc9, 0x1a, 0xd3, 0x6a, 0x43, 0x62, 0xc9, 0x18, - 0x09, 0x1b, 0xd2, 0x68, 0x07, 0x23, 0x5b, 0x02, - 0x82, 0x62, 0xf8, 0x18, 0x02, 0x68, 0x8a, 0x42, - 0x06, 0xd0, 0x01, 0x60, 0x37, 0x23, 0x9b, 0x01, - 0x00, 0x98, 0xf9, 0x18, 0xc8, 0x63, 0x11, 0xe0, - 0x37, 0x23, 0x9b, 0x01, 0xff, 0x18, 0xf9, 0x6b, - 0x00, 0x29, 0x0b, 0xd0, 0x00, 0x9a, 0x08, 0x4b, - 0x51, 0x1a, 0x99, 0x42, 0x06, 0xd9, 0x42, 0x68, - 0x00, 0x21, 0x28, 0x1c, 0xf7, 0xf7, 0x77, 0xfc, - 0x00, 0x20, 0xf8, 0x63, 0xf8, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xd0, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x90, 0xb5, - 0x18, 0x4c, 0x0c, 0x30, 0x0c, 0xc8, 0xe1, 0x1d, - 0xa5, 0x31, 0x0f, 0x1c, 0x0c, 0xc1, 0xe0, 0x1d, - 0xf9, 0x30, 0x41, 0x69, 0x00, 0x29, 0x12, 0xd0, - 0x01, 0x39, 0x41, 0x61, 0xf4, 0xf7, 0x84, 0xfe, - 0x00, 0x28, 0x09, 0xd0, 0xe3, 0x21, 0x01, 0x60, - 0x0c, 0xcf, 0xc1, 0x1d, 0x05, 0x31, 0x0c, 0xc1, - 0x01, 0x1c, 0x08, 0x20, 0xf4, 0xf7, 0xe7, 0xfe, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xed, 0x09, - 0x00, 0xc0, 0x00, 0x39, 0x1c, 0x09, 0x48, 0x09, - 0xf0, 0x80, 0xf8, 0xe0, 0x1d, 0x79, 0x30, 0xc0, - 0x6a, 0x01, 0x02, 0x09, 0x0a, 0xe0, 0x1d, 0xad, - 0x30, 0x1c, 0xf0, 0x65, 0xfe, 0x00, 0x21, 0x01, - 0x20, 0xf7, 0xf7, 0x62, 0xfd, 0xea, 0xe7, 0x18, - 0xeb, 0x03, 0x20, 0x54, 0xa6, 0x00, 0x20, 0xc0, - 0x68, 0x01, 0x49, 0x88, 0x60, 0x70, 0x47, 0x18, - 0xec, 0x03, 0x20, 0x00, 0x22, 0x4a, 0x65, 0x82, - 0x6c, 0x00, 0x2a, 0x02, 0xd0, 0x51, 0x65, 0x81, - 0x64, 0x70, 0x47, 0x41, 0x64, 0x81, 0x64, 0x70, - 0x47, 0x01, 0x1c, 0x40, 0x6c, 0x00, 0x28, 0x04, - 0xd0, 0x42, 0x6d, 0x4a, 0x64, 0x00, 0x2a, 0x00, - 0xd1, 0x8a, 0x64, 0x70, 0x47, 0x90, 0xb5, 0x04, - 0x1c, 0x08, 0x1c, 0x0f, 0x1c, 0xff, 0xf7, 0xf0, - 0xff, 0x00, 0x28, 0x08, 0xd0, 0x01, 0x1c, 0x20, - 0x1c, 0xff, 0xf7, 0xdf, 0xff, 0x38, 0x1c, 0xff, - 0xf7, 0xe7, 0xff, 0x00, 0x28, 0xf6, 0xd1, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb4, 0xcc, - 0x1d, 0x29, 0x34, 0x0c, 0xcc, 0xc7, 0x1d, 0x0d, - 0x37, 0x0c, 0xc7, 0x09, 0x6a, 0x01, 0x62, 0x90, - 0xbc, 0x70, 0x47, 0xf7, 0xb5, 0x81, 0x69, 0x01, - 0x29, 0x0e, 0xd1, 0x16, 0x4b, 0xc1, 0x18, 0x01, - 0xa8, 0x08, 0x22, 0x19, 0xf0, 0x66, 0xfe, 0x00, - 0x28, 0x04, 0xd1, 0x01, 0x20, 0x03, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, 0xf9, - 0xe7, 0x00, 0x26, 0x02, 0x29, 0x18, 0xd1, 0x0e, - 0x4c, 0x00, 0x27, 0xe5, 0x1d, 0x79, 0x35, 0xe8, - 0x69, 0x00, 0x28, 0x0f, 0xd9, 0xf8, 0x00, 0x00, - 0x19, 0xc1, 0x1d, 0x99, 0x31, 0x08, 0x22, 0x01, - 0xa8, 0x19, 0xf0, 0x4b, 0xfe, 0x00, 0x28, 0x01, - 0xd1, 0x01, 0x20, 0xe3, 0xe7, 0xe8, 0x69, 0x01, - 0x37, 0xb8, 0x42, 0xef, 0xd8, 0x30, 0x1c, 0xdd, - 0xe7, 0xed, 0x09, 0x00, 0xc1, 0x00, 0x30, 0x1c, - 0xdb, 0xe7, 0x00, 0x00, 0xd8, 0x0d, 0x00, 0x00, - 0x18, 0xeb, 0x03, 0x20, 0x07, 0xb5, 0x82, 0x69, - 0x00, 0x21, 0x01, 0x2a, 0x15, 0xd1, 0x37, 0x23, - 0x9b, 0x01, 0xc0, 0x18, 0x40, 0x6b, 0x00, 0x28, - 0x0d, 0xd0, 0xc1, 0x1d, 0x29, 0x31, 0x08, 0x22, - 0x01, 0xa8, 0x19, 0xf0, 0x29, 0xfe, 0x00, 0x28, - 0x03, 0xd1, 0x01, 0x20, 0x03, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x20, 0xfa, 0xe7, 0x08, 0x1c, - 0xf8, 0xe7, 0x02, 0x2a, 0x0a, 0xd1, 0x06, 0x49, - 0x08, 0x22, 0x01, 0xa8, 0x19, 0xf0, 0x18, 0xfe, - 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xed, 0xe7, - 0x00, 0x20, 0xeb, 0xe7, 0x08, 0x1c, 0xe9, 0xe7, - 0xcc, 0xeb, 0x03, 0x20, 0xb0, 0xb5, 0x04, 0x1c, - 0xc8, 0x68, 0x23, 0x25, 0x0f, 0x1c, 0x11, 0x28, - 0x2e, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, - 0x9f, 0x44, 0x00, 0x1c, 0x1e, 0x20, 0x22, 0x24, - 0x24, 0x28, 0x28, 0x28, 0x26, 0x26, 0x24, 0x24, - 0x2a, 0x2a, 0x24, 0x24, 0x09, 0x00, 0x06, 0xcf, - 0x08, 0x3f, 0x20, 0x1c, 0xff, 0xf7, 0x84, 0xff, - 0x00, 0x28, 0x03, 0xd0, 0x0b, 0x20, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x06, 0xcf, 0x20, 0x1c, - 0xff, 0xf7, 0xb0, 0xff, 0x00, 0x28, 0x01, 0xd0, - 0x0c, 0x20, 0xf4, 0xe7, 0x28, 0x1c, 0xf2, 0xe7, - 0x0d, 0x20, 0xf0, 0xe7, 0x0e, 0x20, 0xee, 0xe7, - 0x0f, 0x20, 0xec, 0xe7, 0x10, 0x20, 0xea, 0xe7, - 0x11, 0x20, 0xe8, 0xe7, 0x14, 0x20, 0xe6, 0xe7, - 0x28, 0x1c, 0xe4, 0xe7, 0xb0, 0xb5, 0xc4, 0x68, - 0x07, 0x69, 0x00, 0x2f, 0x1b, 0xd0, 0x00, 0x2c, - 0x06, 0xd0, 0x07, 0x23, 0x5b, 0x02, 0xe0, 0x18, - 0x80, 0x68, 0x7d, 0x4b, 0x98, 0x42, 0x19, 0xd0, - 0xf8, 0x68, 0x03, 0x38, 0x0d, 0x28, 0x11, 0xd2, - 0x01, 0xa3, 0x1b, 0x5c, 0xed, 0x09, 0x00, 0xc2, - 0x00, 0x5b, 0x00, 0x9f, 0x44, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0d, 0x0d, - 0x06, 0x06, 0x00, 0x38, 0x1c, 0x74, 0xa1, 0x1b, - 0xf0, 0xfc, 0xff, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x38, 0x1c, 0xf4, 0xf7, 0xc5, 0xfd, 0xf8, - 0xe7, 0x20, 0x1c, 0x39, 0x1c, 0xff, 0xf7, 0x9c, - 0xff, 0x01, 0x1c, 0x05, 0x1c, 0x20, 0x1c, 0x3a, - 0x1c, 0xfd, 0xf7, 0x46, 0xfd, 0x10, 0x2d, 0x05, - 0xd0, 0x0d, 0x2d, 0x03, 0xd0, 0x0e, 0x2d, 0x01, - 0xd0, 0x11, 0x2d, 0x73, 0xd1, 0x38, 0x7a, 0xff, - 0x23, 0xb5, 0x33, 0x58, 0x43, 0x00, 0x19, 0x38, - 0x30, 0xc1, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x49, - 0x6b, 0x00, 0x29, 0x06, 0xd0, 0xba, 0x6c, 0x78, - 0x23, 0xda, 0x42, 0x02, 0xd0, 0x00, 0x21, 0xff, - 0xf7, 0x7d, 0xf8, 0x10, 0x2d, 0x5e, 0xd1, 0x38, - 0x7a, 0xff, 0x23, 0xb5, 0x33, 0x58, 0x43, 0x00, - 0x19, 0xc5, 0x1d, 0x31, 0x35, 0xe8, 0x1d, 0xff, - 0x30, 0x7a, 0x30, 0x81, 0x6a, 0xba, 0x69, 0x89, - 0x18, 0x81, 0x62, 0xc1, 0x6a, 0x01, 0x31, 0xc1, - 0x62, 0x28, 0x69, 0x05, 0x28, 0x04, 0xd0, 0x38, - 0x1c, 0x56, 0xa1, 0x1b, 0xf0, 0xb6, 0xff, 0xb8, - 0xe7, 0x01, 0x22, 0xe9, 0x68, 0x13, 0x1c, 0x00, - 0x29, 0x00, 0xd0, 0x00, 0x23, 0x78, 0x69, 0x03, - 0x28, 0x00, 0xd0, 0x00, 0x22, 0x1a, 0x40, 0x04, - 0xd0, 0x28, 0x1c, 0x39, 0x1c, 0xff, 0xf7, 0xba, - 0xfe, 0xa7, 0xe7, 0x51, 0x4a, 0x12, 0x6b, 0x00, - 0x2a, 0x06, 0xd0, 0x03, 0x28, 0x04, 0xd0, 0x28, - 0x1c, 0x39, 0x1c, 0x00, 0xf0, 0x21, 0xfa, 0x9c, - 0xe7, 0x03, 0x28, 0x12, 0xd1, 0xf4, 0xf7, 0x03, - 0xfd, 0x00, 0x28, 0x09, 0xd0, 0x7a, 0x21, 0x01, - 0x60, 0xe9, 0x68, 0xc1, 0x60, 0x07, 0x61, 0x01, - 0x1c, 0x09, 0x20, 0xf4, 0xf7, 0x67, 0xfd, 0xed, - 0x09, 0x00, 0xc3, 0x00, 0x8c, 0xe7, 0x38, 0x1c, - 0x44, 0xa1, 0x1b, 0xf0, 0x85, 0xff, 0x87, 0xe7, - 0x00, 0x29, 0x1b, 0xd0, 0x37, 0x23, 0x9b, 0x01, - 0xe0, 0x18, 0x80, 0x6b, 0x00, 0x28, 0x15, 0xd1, - 0xf4, 0xf7, 0xe8, 0xfc, 0x00, 0x28, 0x0c, 0xd0, - 0xd7, 0x21, 0x01, 0x60, 0xe9, 0x68, 0xc9, 0x6a, - 0xc1, 0x60, 0x07, 0x61, 0x01, 0x1c, 0x08, 0x20, - 0x00, 0xe0, 0x0c, 0xe0, 0xf4, 0xf7, 0x49, 0xfd, - 0x6e, 0xe7, 0x38, 0x1c, 0x3a, 0xa1, 0x1b, 0xf0, - 0x67, 0xff, 0x69, 0xe7, 0x38, 0x1c, 0x3c, 0xa1, - 0x1b, 0xf0, 0x62, 0xff, 0x64, 0xe7, 0x14, 0x2d, - 0x3b, 0xd1, 0x38, 0x7a, 0xff, 0x23, 0xb5, 0x33, - 0x58, 0x43, 0x00, 0x19, 0xc5, 0x1d, 0x31, 0x35, - 0xe8, 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x81, 0x6a, - 0x3a, 0x6a, 0x89, 0x18, 0x81, 0x62, 0xc1, 0x6a, - 0xba, 0x6a, 0x89, 0x18, 0xc1, 0x62, 0x28, 0x69, - 0x05, 0x28, 0x04, 0xd0, 0x38, 0x1c, 0x33, 0xa1, - 0x1b, 0xf0, 0x46, 0xff, 0x48, 0xe7, 0xe8, 0x68, - 0x00, 0x28, 0x19, 0xd0, 0x37, 0x23, 0x9b, 0x01, - 0xe0, 0x18, 0x80, 0x6b, 0x00, 0x28, 0x13, 0xd1, - 0xf4, 0xf7, 0xa8, 0xfc, 0x00, 0x28, 0x04, 0xd1, - 0x38, 0x1c, 0x2f, 0xa1, 0x1b, 0xf0, 0x34, 0xff, - 0x36, 0xe7, 0xe1, 0x21, 0x01, 0x60, 0xe9, 0x68, - 0xc9, 0x6a, 0xc1, 0x60, 0x07, 0x61, 0x01, 0x1c, - 0x08, 0x20, 0xf4, 0xf7, 0x06, 0xfd, 0x2b, 0xe7, - 0x38, 0x1c, 0x2c, 0xa1, 0x1b, 0xf0, 0x24, 0xff, - 0x26, 0xe7, 0x11, 0x2d, 0x04, 0xd1, 0x38, 0x1c, - 0x2e, 0xa1, 0x1b, 0xf0, 0x1d, 0xff, 0x1f, 0xe7, - 0x38, 0x1c, 0xf4, 0xf7, 0xe8, 0xfc, 0x1b, 0xe7, - 0x00, 0x00, 0x11, 0x19, 0x03, 0x64, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x72, 0x63, 0x76, 0x2e, - 0x63, 0x3a, 0x20, 0x32, 0x36, 0x35, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0xc4, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x72, 0x63, 0x76, - 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x30, 0x32, 0x00, - 0x00, 0x00, 0x00, 0xd8, 0xeb, 0x03, 0x20, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x72, 0x63, 0x76, - 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x33, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x63, 0x72, 0x63, 0x76, 0x2e, 0x63, 0x3a, 0x20, - 0x33, 0x34, 0x36, 0x00, 0x00, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x72, 0x63, 0x76, - 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x35, 0x36, 0x00, - 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x63, 0x72, 0x63, 0x76, 0x2e, 0x63, 0x3a, 0x20, - 0x33, 0x36, 0x39, 0x00, 0x00, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x72, 0x63, 0x76, - 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x37, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x63, 0x72, 0x63, 0x76, 0x2e, 0x63, 0x3a, 0x20, - 0x33, 0x39, 0x30, 0x00, 0x00, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x72, 0x63, 0x76, - 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x39, 0x36, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x23, 0xdb, 0x02, 0x98, - 0x42, 0x16, 0xd0, 0x08, 0xdc, 0x08, 0x28, 0x0f, - 0xd0, 0x10, 0x28, 0x0f, 0xd0, 0x5b, 0x08, 0x98, - 0x42, 0x12, 0xd1, 0x0a, 0x20, 0x70, 0x47, 0x01, - 0x23, 0x9b, 0x03, 0x98, 0x42, 0x0a, 0xd0, 0x5b, - 0x00, 0x98, 0x42, 0x09, 0xd1, 0x0f, 0x20, 0x70, - 0x47, 0x03, 0x20, 0x70, 0x47, 0x04, 0x20, 0x70, - 0x47, 0x0b, 0x20, 0x70, 0x47, 0x0e, 0x20, 0x70, - 0x47, 0x11, 0x20, 0x70, 0x47, 0xf0, 0xb5, 0x1c, - 0x1c, 0x15, 0x1c, 0x0e, 0x1c, 0x07, 0x1c, 0xfd, - 0xf7, 0x73, 0xfd, 0x00, 0x28, 0x0e, 0xd0, 0xf4, - 0xf7, 0xfb, 0xfb, 0x00, 0x28, 0xed, 0x09, 0x00, - 0xc5, 0x00, 0x0a, 0xd0, 0x73, 0x21, 0x01, 0x60, - 0xf9, 0x68, 0xc1, 0x60, 0x06, 0x61, 0x84, 0x61, - 0x45, 0x61, 0x01, 0x1c, 0x09, 0x20, 0xf4, 0xf7, - 0x5d, 0xfc, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x90, 0xb5, 0xc4, 0x68, 0x07, 0x1c, 0x20, 0x1c, - 0xfd, 0xf7, 0x59, 0xfd, 0x00, 0x28, 0x28, 0xd0, - 0x20, 0x69, 0x05, 0x28, 0x03, 0xd0, 0x03, 0x28, - 0x01, 0xd0, 0x04, 0x28, 0x21, 0xd1, 0xf4, 0xf7, - 0xda, 0xfb, 0x00, 0x28, 0x1d, 0xd0, 0x79, 0x69, - 0x00, 0x29, 0x0c, 0xd0, 0x0b, 0x68, 0x14, 0x22, - 0xd2, 0x1a, 0x8b, 0x69, 0x09, 0x6a, 0xd2, 0x18, - 0x52, 0x18, 0xe1, 0x1d, 0xff, 0x31, 0x7a, 0x31, - 0x4b, 0x6a, 0xd2, 0x18, 0x4a, 0x62, 0x73, 0x21, - 0x01, 0x60, 0xe1, 0x68, 0xc1, 0x60, 0x39, 0x69, - 0x01, 0x61, 0x79, 0x69, 0x41, 0x61, 0xb9, 0x69, - 0x81, 0x61, 0x01, 0x1c, 0x09, 0x20, 0xf4, 0xf7, - 0x29, 0xfc, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xf3, 0xb5, 0x8d, 0xb0, 0x21, 0x4d, 0x06, 0xac, - 0x4e, 0xcd, 0x4e, 0xc4, 0x48, 0xcd, 0x48, 0xc4, - 0x1f, 0x4d, 0x07, 0x1c, 0x4e, 0xcd, 0x11, 0x20, - 0x6c, 0x46, 0x4e, 0xc4, 0x48, 0xcd, 0x48, 0xc4, - 0x79, 0x68, 0x4a, 0x6a, 0x00, 0x21, 0x03, 0x2a, - 0x01, 0xd3, 0x08, 0x91, 0x09, 0x91, 0x7a, 0x68, - 0x52, 0x6a, 0x02, 0x2a, 0x01, 0xd3, 0x0a, 0x91, - 0x0b, 0x91, 0x3b, 0x1c, 0xfa, 0x1d, 0xf9, 0x32, - 0xdd, 0x1d, 0xff, 0x35, 0x00, 0x21, 0x3a, 0x35, - 0x17, 0x6a, 0x12, 0x4e, 0x0c, 0x95, 0x8c, 0x00, - 0x06, 0xab, 0x1b, 0x59, 0x3b, 0x40, 0x12, 0xd0, - 0x55, 0x6a, 0x00, 0x2d, 0x05, 0xd1, 0x0c, 0x9d, - 0x2d, 0x6a, 0x2d, 0x01, 0x75, 0x59, 0x2b, 0x40, - 0x09, 0xd0, 0x68, 0x46, 0x00, 0x59, 0x0a, 0x4c, - 0xc3, 0x00, 0x1b, 0x18, 0x9b, 0x00, 0xe3, 0x58, - 0xed, 0x09, 0x00, 0xc6, 0x00, 0x0e, 0x9c, 0xa3, - 0x42, 0x02, 0xd2, 0x01, 0x31, 0x06, 0x29, 0xe4, - 0xd3, 0x0f, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xd8, 0x0f, 0x01, 0x20, 0xf0, 0x0f, 0x01, - 0x20, 0x50, 0x7b, 0x03, 0x20, 0x78, 0x7b, 0x03, - 0x20, 0xf0, 0xb5, 0x07, 0x1c, 0x05, 0x98, 0x0c, - 0x1c, 0x14, 0x21, 0x11, 0x28, 0x21, 0x4e, 0x26, - 0xd1, 0x00, 0x2a, 0x21, 0xd0, 0x10, 0x68, 0x08, - 0x1a, 0x91, 0x69, 0x40, 0x18, 0x11, 0x6a, 0x45, - 0x18, 0x03, 0x2b, 0x01, 0xd1, 0x03, 0x20, 0x03, - 0xe0, 0x20, 0x1c, 0x29, 0x1c, 0xff, 0xf7, 0x9a, - 0xff, 0x78, 0x62, 0x11, 0x28, 0x10, 0xd0, 0xc3, - 0x00, 0x18, 0x18, 0x80, 0x00, 0x32, 0x58, 0x29, - 0x1c, 0xaa, 0x42, 0x00, 0xd2, 0x11, 0x1c, 0xf9, - 0x61, 0x30, 0x58, 0x29, 0x1c, 0xf3, 0xf7, 0xbe, - 0xfe, 0x20, 0x1c, 0xff, 0xf7, 0x87, 0xff, 0xb8, - 0x62, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x78, - 0x62, 0x00, 0x2a, 0xf9, 0xd0, 0x13, 0x68, 0xc9, - 0x1a, 0x93, 0x69, 0x12, 0x6a, 0xc9, 0x18, 0x8a, - 0x18, 0xc3, 0x00, 0x18, 0x18, 0x80, 0x00, 0x33, - 0x58, 0x11, 0x1c, 0x93, 0x42, 0x00, 0xd2, 0x19, - 0x1c, 0xf9, 0x61, 0x30, 0x58, 0x11, 0x1c, 0xf3, - 0xf7, 0xa1, 0xfe, 0x20, 0x1c, 0xff, 0xf7, 0x6a, - 0xff, 0xb8, 0x62, 0xe1, 0xe7, 0x78, 0x7b, 0x03, - 0x20, 0xff, 0xb5, 0x81, 0xb0, 0x00, 0x24, 0x05, - 0x1c, 0x0a, 0x9e, 0xf4, 0xf7, 0x16, 0xfb, 0x07, - 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x16, 0xe0, 0x0b, - 0x9a, 0x38, 0x1c, 0x29, 0x1c, 0x00, 0x92, 0x02, - 0x9a, 0x33, 0x1c, 0xff, 0xf7, 0xa1, 0xff, 0x0d, - 0x20, 0x38, 0x60, 0xa8, 0x68, 0xf8, 0x60, 0x02, - 0x99, 0x0b, 0x20, 0xb9, 0x61, 0x03, 0x9a, 0x39, - 0x1c, 0x3a, 0x61, 0x04, 0x9b, 0x7b, 0x61, 0x3e, - 0x62, 0xf4, 0xf7, 0xed, 0x09, 0x00, 0xc7, 0x00, - 0x6a, 0xfb, 0x20, 0x1c, 0x05, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x82, 0xb0, - 0x01, 0x22, 0x03, 0x21, 0x00, 0x91, 0x01, 0x92, - 0xc2, 0x1d, 0x00, 0x21, 0x00, 0x23, 0xb5, 0x32, - 0xff, 0xf7, 0xcd, 0xff, 0x02, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0x90, 0xb0, 0x0f, 0x1c, - 0x00, 0x21, 0x00, 0x22, 0x07, 0x23, 0x02, 0xac, - 0x06, 0xc4, 0x01, 0x3b, 0xfc, 0xd1, 0x14, 0x21, - 0x02, 0x91, 0xf9, 0x69, 0x0b, 0x91, 0xb9, 0x69, - 0x0a, 0x91, 0xfa, 0x68, 0x02, 0x21, 0x01, 0x92, - 0xc2, 0x1d, 0x00, 0x91, 0x02, 0xa9, 0x55, 0x32, - 0xff, 0xf7, 0xb1, 0xff, 0x04, 0x1c, 0x38, 0x1c, - 0x04, 0xa1, 0x1b, 0xf0, 0x5b, 0xfd, 0x20, 0x1c, - 0x10, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, - 0x73, 0x65, 0x6e, 0x64, 0x2e, 0x63, 0x3a, 0x20, - 0x35, 0x31, 0x37, 0x00, 0x00, 0x00, 0x80, 0xb5, - 0x01, 0x21, 0x0d, 0x48, 0x19, 0xf0, 0x87, 0xfa, - 0x07, 0x1c, 0xf4, 0xf7, 0xb1, 0xfa, 0x03, 0x21, - 0x01, 0x60, 0xc7, 0x60, 0xff, 0x21, 0x01, 0x31, - 0x01, 0x61, 0x41, 0x61, 0x81, 0x61, 0xc1, 0x61, - 0x07, 0xa7, 0x0c, 0xcf, 0xc1, 0x1d, 0x19, 0x31, - 0x0c, 0xc1, 0x00, 0x22, 0x01, 0x1c, 0x00, 0x20, - 0x00, 0xf0, 0x1d, 0xf8, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x0c, 0x0e, 0x00, 0x00, 0xe2, 0x3a, - 0x1a, 0x33, 0xce, 0x2c, 0x7a, 0x4e, 0x90, 0xb5, - 0xc8, 0x68, 0x0f, 0x1c, 0x0a, 0x69, 0xc1, 0x1d, - 0x79, 0x31, 0xca, 0x62, 0x7a, 0x69, 0x00, 0x24, - 0x0a, 0x63, 0x05, 0x21, 0xf5, 0xf7, 0xc1, 0xff, - 0x38, 0x1c, 0xf4, 0xf7, 0xc0, 0xfa, 0x20, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, - 0x81, 0xb0, 0x0c, 0x1c, 0x08, 0x68, 0xed, 0x09, - 0x00, 0xc8, 0x00, 0x20, 0x31, 0x17, 0x1c, 0x03, - 0x28, 0x00, 0x91, 0x52, 0xd1, 0x00, 0x25, 0x00, - 0x2f, 0xe6, 0x68, 0x07, 0xd1, 0x02, 0x20, 0x31, - 0x1c, 0xf7, 0xf7, 0x31, 0xfe, 0x07, 0x1c, 0x01, - 0xd1, 0x07, 0x25, 0x28, 0xe0, 0xf8, 0x1d, 0x21, - 0x69, 0x79, 0x30, 0xc1, 0x62, 0x61, 0x69, 0x01, - 0x63, 0xa1, 0x69, 0xc1, 0x60, 0xe1, 0x69, 0x01, - 0x61, 0x00, 0x99, 0xf8, 0x1d, 0x0c, 0xc9, 0xad, - 0x30, 0x0c, 0xc0, 0x00, 0x20, 0x78, 0x61, 0x38, - 0x62, 0x78, 0x64, 0x2c, 0xa1, 0x0c, 0xc9, 0xf8, - 0x1d, 0x1d, 0x30, 0x0c, 0xc0, 0x2a, 0xa1, 0x0c, - 0xc9, 0xf8, 0x1d, 0x11, 0x30, 0x0c, 0xc0, 0x27, - 0xa1, 0x0c, 0xc9, 0xf8, 0x1d, 0x25, 0x30, 0x0c, - 0xc0, 0x00, 0x20, 0x78, 0x63, 0xf8, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x03, 0x20, 0xf8, 0x60, 0x3a, - 0x20, 0x20, 0x60, 0x65, 0x61, 0xe6, 0x60, 0x27, - 0x61, 0x01, 0x98, 0x00, 0x28, 0x04, 0xd0, 0x0e, - 0x20, 0x21, 0x1c, 0xf4, 0xf7, 0xa6, 0xfa, 0x03, - 0xe0, 0x0a, 0x20, 0x21, 0x1c, 0xf4, 0xf7, 0xa1, - 0xfa, 0x00, 0x2f, 0x05, 0xd0, 0x05, 0x23, 0x03, - 0x22, 0x00, 0x21, 0x38, 0x1c, 0xf5, 0xf7, 0xc9, - 0xfe, 0x00, 0x20, 0x04, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x05, 0x28, 0x1f, 0xd1, 0xe7, - 0x68, 0x21, 0x69, 0xf8, 0x1d, 0x79, 0x30, 0xc1, - 0x62, 0x61, 0x69, 0x01, 0x63, 0xa1, 0x69, 0xc1, - 0x60, 0xe1, 0x69, 0x01, 0x61, 0x00, 0x99, 0xf8, - 0x1d, 0x0c, 0xc9, 0xad, 0x30, 0x0c, 0xc0, 0xf8, - 0x68, 0x04, 0x28, 0x01, 0xd1, 0x05, 0x20, 0xf8, - 0x60, 0x20, 0x1c, 0xf4, 0xf7, 0x46, 0xfa, 0x05, - 0x23, 0x05, 0x22, 0x00, 0x21, 0x38, 0x1c, 0xf5, - 0xf7, 0xa4, 0xfe, 0x00, 0x20, 0xd9, 0xe7, 0xff, - 0x20, 0x0d, 0x30, 0xd6, 0xe7, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0xc9, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xf7, 0xb5, 0xcd, 0x68, - 0x13, 0x1c, 0x14, 0x1c, 0x0f, 0x1c, 0x00, 0x21, - 0x05, 0x22, 0x00, 0x26, 0x28, 0x1c, 0xf6, 0xf7, - 0xb7, 0xf8, 0x00, 0x2c, 0x03, 0xd1, 0x38, 0x1c, - 0xf4, 0xf7, 0x26, 0xfa, 0x10, 0xe0, 0x3a, 0x20, - 0x38, 0x60, 0x68, 0x68, 0xf8, 0x60, 0x7e, 0x61, - 0x00, 0x98, 0x00, 0x28, 0x04, 0xd0, 0x0e, 0x20, - 0x39, 0x1c, 0xf4, 0xf7, 0x4d, 0xfa, 0x03, 0xe0, - 0x0a, 0x20, 0x39, 0x1c, 0xf4, 0xf7, 0x48, 0xfa, - 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0xf0, 0xb4, 0xc7, 0x1d, 0xb9, 0x37, - 0x0c, 0xc7, 0x08, 0x3f, 0x00, 0x24, 0x3c, 0x72, - 0x02, 0x22, 0xfa, 0x60, 0x01, 0x22, 0x7a, 0x72, - 0xbc, 0x72, 0x0b, 0x4e, 0xfc, 0x72, 0x0c, 0xce, - 0xc5, 0x1d, 0xc9, 0x35, 0x0c, 0xc5, 0x09, 0x4a, - 0xf0, 0x30, 0xd3, 0x6a, 0xbb, 0x61, 0x13, 0x6b, - 0xfb, 0x61, 0x52, 0x6b, 0x79, 0x62, 0x3a, 0x62, - 0xbc, 0x62, 0x05, 0x49, 0xfc, 0x62, 0xc0, 0xc9, - 0xc0, 0xc0, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0x00, - 0x88, 0xe6, 0x03, 0x20, 0x48, 0xe6, 0x03, 0x20, - 0x80, 0xe6, 0x03, 0x20, 0xf0, 0xb4, 0xc5, 0x1d, - 0xc6, 0x1d, 0x51, 0x36, 0xff, 0x35, 0x17, 0x1c, - 0x1a, 0x35, 0x2c, 0x1c, 0x0c, 0xce, 0x0c, 0xc5, - 0xff, 0x30, 0x01, 0x30, 0x21, 0x72, 0xc7, 0x62, - 0x01, 0x20, 0x60, 0x72, 0x00, 0x20, 0xa0, 0x72, - 0xe0, 0x72, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0x00, - 0x90, 0xb5, 0x07, 0x1c, 0x00, 0x20, 0xb8, 0x60, - 0x0c, 0x1c, 0x28, 0xf0, 0xe9, 0xff, 0x60, 0x68, - 0x00, 0x28, 0x01, 0xd1, 0x27, 0x60, 0x00, 0xe0, - 0x87, 0x60, 0x67, 0x60, 0x28, 0xf0, 0xdc, 0xff, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, - 0x07, 0x1c, 0x00, 0x68, 0xed, 0x09, 0x00, 0xca, - 0x00, 0x00, 0x25, 0x00, 0x28, 0x03, 0xd1, 0x28, - 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x28, - 0xf0, 0xd1, 0xff, 0x3c, 0x68, 0xa0, 0x68, 0x38, - 0x60, 0x00, 0x28, 0x00, 0xd1, 0x7d, 0x60, 0x28, - 0xf0, 0xc5, 0xff, 0x20, 0x1c, 0xf0, 0xe7, 0x00, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x70, 0x47, 0x01, - 0x20, 0x70, 0x47, 0xf0, 0xb5, 0x04, 0x1c, 0xe6, - 0x1d, 0x40, 0x6f, 0x79, 0x36, 0x0d, 0x1c, 0x00, - 0x28, 0x5b, 0xd0, 0x61, 0x6a, 0xfe, 0x29, 0x0d, - 0xd1, 0x21, 0x6b, 0x00, 0x29, 0x18, 0xd0, 0x00, - 0x27, 0x61, 0x67, 0x77, 0x60, 0xf7, 0x60, 0x20, - 0x6b, 0x61, 0x6f, 0x80, 0x69, 0x88, 0x63, 0x60, - 0x6f, 0xc7, 0x63, 0x72, 0xe0, 0xfd, 0x29, 0x0b, - 0xd1, 0x61, 0x6c, 0x01, 0x29, 0x04, 0xd1, 0xe2, - 0x6d, 0x00, 0x2a, 0x00, 0xd0, 0x00, 0x21, 0xe1, - 0x65, 0x21, 0x1c, 0x00, 0xf0, 0x60, 0xfa, 0x2e, - 0xe0, 0x01, 0x7a, 0xe7, 0x1d, 0xf9, 0x37, 0x00, - 0x29, 0x11, 0xd1, 0x60, 0x68, 0x85, 0x4b, 0xc0, - 0x18, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x60, - 0x68, 0x0b, 0x23, 0x1b, 0x02, 0xc0, 0x18, 0xc1, - 0x6b, 0x80, 0x6b, 0x81, 0x42, 0x1f, 0xd8, 0x38, - 0x68, 0x01, 0x30, 0x38, 0x60, 0x17, 0xe0, 0xc1, - 0x68, 0x03, 0x39, 0x0d, 0x29, 0x17, 0xd2, 0x02, - 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, - 0x1c, 0x07, 0x07, 0x13, 0x13, 0x13, 0x07, 0x13, - 0x07, 0x07, 0x13, 0x13, 0x07, 0x07, 0x00, 0x21, - 0x1c, 0x00, 0xf0, 0x35, 0xfa, 0xe0, 0x6e, 0x00, - 0x28, 0xe5, 0xd0, 0x00, 0x27, 0xe7, 0x66, 0x00, - 0x20, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0x6f, 0xc0, 0x6b, 0x00, 0x28, 0x01, 0xd0, 0xf4, - 0xf7, 0x41, 0xf9, 0x60, 0x6f, 0x00, 0x27, 0xc7, - 0x63, 0x67, 0x67, 0x60, 0x6e, 0x40, 0x08, 0xed, - 0x09, 0x00, 0xcb, 0x00, 0x0e, 0xd2, 0xe0, 0x1d, - 0x45, 0x30, 0xff, 0xf7, 0x79, 0xff, 0x00, 0x28, - 0x6e, 0xd1, 0x60, 0x6e, 0x00, 0x28, 0x05, 0xd1, - 0xe0, 0x1d, 0x4d, 0x30, 0xff, 0xf7, 0x70, 0xff, - 0x00, 0x28, 0x65, 0xd1, 0x60, 0x6a, 0xfe, 0x28, - 0x19, 0xd1, 0x20, 0x6b, 0x00, 0x28, 0x16, 0xd0, - 0x00, 0x27, 0x60, 0x67, 0x77, 0x60, 0xf7, 0x60, - 0x60, 0x6f, 0xc7, 0x63, 0x20, 0x6b, 0x61, 0x6f, - 0x80, 0x69, 0x88, 0x63, 0xe0, 0x6d, 0x01, 0x21, - 0x00, 0x28, 0x00, 0xd0, 0x00, 0x21, 0xe1, 0x65, - 0x60, 0x6f, 0x21, 0x1c, 0x87, 0x65, 0x60, 0x6f, - 0x00, 0xf0, 0xf4, 0xf9, 0x46, 0xe0, 0x00, 0x27, - 0x77, 0x60, 0x11, 0x2d, 0x42, 0xd0, 0xa0, 0x6e, - 0x00, 0x28, 0x02, 0xd9, 0x01, 0x25, 0x01, 0x38, - 0xa0, 0x66, 0xe0, 0x6f, 0x60, 0x67, 0x00, 0x28, - 0x38, 0xd0, 0x61, 0x68, 0x58, 0x31, 0x0c, 0xc9, - 0x0c, 0xc0, 0x20, 0x7e, 0x61, 0x6f, 0x08, 0x72, - 0x60, 0x6f, 0x01, 0x21, 0x41, 0x72, 0x60, 0x6f, - 0x21, 0x1c, 0xc5, 0x60, 0x77, 0x60, 0xf7, 0x60, - 0x60, 0x6f, 0x87, 0x63, 0x60, 0x6f, 0xc7, 0x63, - 0x60, 0x6f, 0x00, 0xf0, 0xcf, 0xf9, 0x02, 0x2d, - 0x1e, 0xd1, 0x60, 0x6f, 0xc1, 0x1d, 0x3f, 0x48, - 0x09, 0x31, 0xc5, 0x1d, 0xf9, 0x35, 0x48, 0xcd, - 0x48, 0xc1, 0xc1, 0x1d, 0xb9, 0x31, 0xca, 0x6a, - 0x63, 0x6f, 0xf8, 0x30, 0x9a, 0x61, 0x0a, 0x6b, - 0x63, 0x6f, 0xda, 0x61, 0x49, 0x6b, 0x62, 0x6f, - 0x11, 0x62, 0xe1, 0x1d, 0x99, 0x31, 0x09, 0x7b, - 0x62, 0x6f, 0x51, 0x62, 0x61, 0x6f, 0xcf, 0x62, - 0x61, 0x6f, 0x60, 0xc8, 0x30, 0x31, 0x60, 0xc1, - 0x60, 0x6f, 0x87, 0x65, 0x38, 0x1c, 0x7a, 0xe7, - 0xff, 0xe7, 0x01, 0x69, 0x00, 0x27, 0x61, 0x67, - 0x41, 0x69, 0x71, 0x60, 0x01, 0x6a, 0xf1, 0x60, - 0x62, 0x6f, 0xed, 0x09, 0x00, 0xcc, 0x00, 0x01, - 0x21, 0x51, 0x72, 0xe7, 0x66, 0x62, 0x6f, 0xd0, - 0x63, 0x02, 0x6a, 0x63, 0x6f, 0x5a, 0x61, 0x42, - 0x6a, 0x63, 0x6f, 0xda, 0x60, 0x82, 0x69, 0x00, - 0x2a, 0x1e, 0xd0, 0x12, 0x68, 0x14, 0x23, 0x9a, - 0x1a, 0x63, 0x6f, 0x9a, 0x61, 0x82, 0x69, 0x13, - 0x68, 0xd2, 0x18, 0x63, 0x6f, 0x04, 0x32, 0xda, - 0x61, 0x82, 0x69, 0x63, 0x6f, 0x92, 0x69, 0x1a, - 0x62, 0x82, 0x69, 0x63, 0x6f, 0xd2, 0x69, 0x5a, - 0x62, 0x82, 0x69, 0x63, 0x6f, 0x12, 0x6a, 0x9a, - 0x62, 0x82, 0x69, 0x63, 0x6f, 0x52, 0x6a, 0xda, - 0x62, 0xc2, 0x69, 0x63, 0x6f, 0x9a, 0x63, 0x07, - 0xe0, 0x62, 0x6f, 0x97, 0x61, 0x62, 0x6f, 0x17, - 0x62, 0x62, 0x6f, 0x97, 0x62, 0x62, 0x6f, 0x97, - 0x63, 0x00, 0x69, 0xc0, 0x68, 0x03, 0x38, 0x0d, - 0x28, 0x14, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x06, 0x06, 0x10, 0x10, 0x10, - 0x06, 0x10, 0x06, 0x06, 0x10, 0x10, 0x06, 0x06, - 0x00, 0xe0, 0x1d, 0xb9, 0x30, 0xc2, 0x6b, 0x01, - 0x32, 0xc2, 0x63, 0xe0, 0x6d, 0x00, 0x28, 0x00, - 0xd0, 0x00, 0x21, 0xe1, 0x65, 0x60, 0x6f, 0x21, - 0x1c, 0x00, 0xf0, 0x4e, 0xf9, 0x9e, 0xe7, 0x3c, - 0x0b, 0x00, 0x00, 0x88, 0xe5, 0x03, 0x20, 0xb0, - 0xb5, 0xc4, 0x68, 0x07, 0x1c, 0xe0, 0x68, 0x00, - 0x25, 0x05, 0x28, 0x18, 0xd0, 0x78, 0x69, 0x00, - 0x28, 0x11, 0xd0, 0xf4, 0xf7, 0x1d, 0xf8, 0x00, - 0x28, 0x0d, 0xd0, 0x34, 0x21, 0x01, 0x60, 0xa1, - 0x68, 0xc1, 0x60, 0x02, 0x21, 0x01, 0x61, 0x79, - 0x69, 0x41, 0x61, 0x39, 0x6a, 0x81, 0x61, 0x01, - 0x1c, 0x0a, 0x20, 0xf4, 0xf7, 0x7c, 0xf8, 0x38, - 0x1c, 0xf4, 0xf7, 0x45, 0xf8, 0x10, 0xe0, 0x38, - 0x6a, 0x00, 0x28, 0x0d, 0xd0, 0x01, 0x28, 0x06, - 0xd0, 0x02, 0x28, 0x04, 0xd0, 0xed, 0x09, 0x00, - 0xcd, 0x00, 0x03, 0x28, 0x07, 0xd1, 0xe1, 0x1d, - 0x45, 0x31, 0x01, 0xe0, 0xe1, 0x1d, 0x4d, 0x31, - 0x38, 0x1c, 0xff, 0xf7, 0x63, 0xfe, 0x28, 0x1c, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, - 0x44, 0x6f, 0x07, 0x1c, 0x00, 0x2c, 0x2b, 0xd0, - 0x78, 0x6a, 0xfd, 0x28, 0x28, 0xd0, 0xfd, 0x1d, - 0x79, 0x35, 0xe8, 0x68, 0x00, 0x28, 0x01, 0xd1, - 0x78, 0x67, 0x21, 0xe0, 0x02, 0x9a, 0x00, 0x2a, - 0x24, 0xd1, 0x38, 0x1c, 0x00, 0xf0, 0x04, 0xf9, - 0x00, 0x28, 0x1f, 0xd1, 0xe0, 0x68, 0x22, 0x49, - 0xc3, 0x00, 0x18, 0x18, 0x80, 0x00, 0x40, 0x18, - 0xc0, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x01, 0x20, - 0xfa, 0x6d, 0x01, 0x1c, 0x00, 0x2a, 0x00, 0xd0, - 0x00, 0x21, 0xf8, 0x66, 0xf8, 0x1d, 0xb9, 0x30, - 0xf9, 0x65, 0xc1, 0x6b, 0x01, 0x31, 0xc1, 0x63, - 0x20, 0x1c, 0x39, 0x1c, 0x00, 0xf0, 0xe3, 0xf8, - 0x28, 0xf0, 0x18, 0xfe, 0x03, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, 0x6e, 0x68, - 0x68, 0x60, 0xed, 0x68, 0x78, 0x67, 0x28, 0xf0, - 0x0d, 0xfe, 0x00, 0x2e, 0x13, 0xd0, 0xe1, 0x6b, - 0x00, 0x29, 0xef, 0xd0, 0x34, 0x20, 0x08, 0x60, - 0xb8, 0x68, 0xc8, 0x60, 0x02, 0x9a, 0x0a, 0x61, - 0x4e, 0x61, 0x8d, 0x61, 0x01, 0x98, 0x00, 0x28, - 0x01, 0xd0, 0x0e, 0x20, 0x00, 0xe0, 0x0a, 0x20, - 0xf4, 0xf7, 0x10, 0xf8, 0xde, 0xe7, 0xe0, 0x6b, - 0x00, 0x28, 0xdb, 0xd0, 0xf3, 0xf7, 0xd6, 0xff, - 0x00, 0x20, 0xe0, 0x63, 0xd6, 0xe7, 0x00, 0x00, - 0x78, 0x7b, 0x03, 0x20, 0x00, 0xb5, 0x00, 0x22, - 0xc1, 0x6f, 0xc2, 0x67, 0x00, 0x29, 0x02, 0xd0, - 0x08, 0x1c, 0xf3, 0xf7, 0xed, 0xff, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0x00, 0x24, 0x04, 0x64, - 0x07, 0x1c, 0x44, 0x64, 0x44, 0x66, 0x80, 0x30, - 0xed, 0x09, 0x00, 0xce, 0x00, 0x04, 0x60, 0x84, - 0x60, 0x04, 0x61, 0x09, 0x48, 0xf9, 0x1d, 0xb9, - 0x31, 0xbc, 0x64, 0x08, 0x62, 0x38, 0x1c, 0x00, - 0xf0, 0x91, 0xfc, 0xf8, 0x6f, 0x00, 0x28, 0x03, - 0xd1, 0xf3, 0xf7, 0xb3, 0xff, 0xf8, 0x67, 0xc4, - 0x63, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0xff, 0xff, 0x00, 0x00, 0x4a, 0x08, 0x10, - 0xd3, 0x42, 0x6e, 0x01, 0x23, 0x1a, 0x43, 0x42, - 0x66, 0xc2, 0x6f, 0x43, 0x6f, 0x93, 0x42, 0x08, - 0xd0, 0xc2, 0x1d, 0x79, 0x32, 0x13, 0x60, 0x53, - 0x68, 0x93, 0x60, 0xd3, 0x68, 0x13, 0x61, 0x00, - 0x22, 0x42, 0x67, 0x89, 0x08, 0x03, 0xd3, 0x41, - 0x6e, 0x02, 0x23, 0x19, 0x43, 0x41, 0x66, 0x70, - 0x47, 0x42, 0x6e, 0x8a, 0x43, 0x42, 0x66, 0x49, - 0x08, 0x0d, 0xd3, 0x51, 0x08, 0x0b, 0xd2, 0xc1, - 0x1d, 0x79, 0x31, 0x0a, 0x68, 0x00, 0x2a, 0x06, - 0xd0, 0x42, 0x67, 0x88, 0x68, 0x48, 0x60, 0x08, - 0x69, 0xc8, 0x60, 0x00, 0x20, 0x08, 0x60, 0x70, - 0x47, 0xf0, 0xb5, 0x82, 0xb0, 0x05, 0x1c, 0x0f, - 0x1c, 0x28, 0xf0, 0x92, 0xfd, 0x03, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0xe2, 0xff, 0x02, 0x22, 0x38, - 0x1c, 0x29, 0x1c, 0xff, 0xf7, 0x3a, 0xff, 0xf8, - 0x1d, 0x45, 0x30, 0xfe, 0x1d, 0x79, 0x36, 0x01, - 0x90, 0x01, 0x98, 0xff, 0xf7, 0xa4, 0xfd, 0x04, - 0x1c, 0x03, 0xd1, 0xf8, 0x1d, 0x4d, 0x30, 0x00, - 0x90, 0x12, 0xe0, 0x28, 0xf0, 0x79, 0xfd, 0x20, - 0x69, 0x78, 0x67, 0xc4, 0x63, 0x60, 0x69, 0x70, - 0x60, 0x20, 0x6a, 0xf0, 0x60, 0x28, 0xf0, 0x70, - 0xfd, 0x02, 0x22, 0x38, 0x1c, 0x29, 0x1c, 0xff, - 0xf7, 0x1c, 0xff, 0x28, 0xf0, 0x65, 0xfd, 0xe3, - 0xe7, 0x00, 0x98, 0xff, 0xf7, 0x88, 0xfd, 0x04, - 0x1c, 0x12, 0xd0, 0x28, 0xf0, 0x61, 0xfd, 0x20, - 0x69, 0x78, 0x67, 0xed, 0x09, 0x00, 0xcf, 0x00, - 0xc4, 0x63, 0x60, 0x69, 0x70, 0x60, 0x20, 0x6a, - 0xf0, 0x60, 0x28, 0xf0, 0x58, 0xfd, 0x02, 0x22, - 0x38, 0x1c, 0x29, 0x1c, 0xff, 0xf7, 0x04, 0xff, - 0x28, 0xf0, 0x4d, 0xfd, 0xe7, 0xe7, 0x02, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0xc3, 0x78, 0x0a, 0x6c, 0x01, 0x20, 0x9a, 0x42, - 0x06, 0xd1, 0x08, 0x66, 0xff, 0x31, 0x01, 0x31, - 0x8a, 0x68, 0x01, 0x32, 0x8a, 0x60, 0x70, 0x47, - 0x08, 0x66, 0x0b, 0x64, 0x00, 0x20, 0x70, 0x47, - 0x0a, 0x6e, 0x82, 0x72, 0xc9, 0x6d, 0xc1, 0x72, - 0x70, 0x47, 0x90, 0xb4, 0x41, 0x6f, 0x01, 0x27, - 0x8b, 0x6b, 0xca, 0x1d, 0x11, 0x32, 0x00, 0x2b, - 0x28, 0xd0, 0x40, 0x6a, 0xff, 0x28, 0x01, 0xd0, - 0x00, 0x28, 0x23, 0xd1, 0x00, 0x20, 0x88, 0x65, - 0x4c, 0x69, 0x03, 0x2c, 0x1e, 0xd0, 0x4f, 0x61, - 0x14, 0x68, 0x9c, 0x42, 0x0f, 0xd9, 0x14, 0x68, - 0xe4, 0x1a, 0x14, 0x60, 0x54, 0x68, 0xe3, 0x18, - 0x53, 0x60, 0x8a, 0x69, 0x0b, 0x6a, 0xd2, 0x18, - 0x8b, 0x6a, 0xd2, 0x18, 0x0e, 0xd0, 0x8b, 0x6b, - 0x93, 0x42, 0x0c, 0xd9, 0x10, 0xe0, 0x10, 0x60, - 0x08, 0x32, 0x1b, 0x1b, 0x00, 0x2b, 0xe7, 0xd1, - 0x8a, 0x69, 0x0b, 0x6a, 0xd2, 0x18, 0x8b, 0x6a, - 0xd2, 0x18, 0x02, 0xd1, 0x38, 0x1c, 0x90, 0xbc, - 0x70, 0x47, 0x8b, 0x6b, 0x93, 0x42, 0xfa, 0xd9, - 0x8a, 0x63, 0xca, 0x6b, 0x92, 0x6a, 0xca, 0x60, - 0xf5, 0xe7, 0x00, 0xb5, 0xca, 0x68, 0x03, 0x20, - 0xd0, 0x60, 0x08, 0x1c, 0xf3, 0xf7, 0xd3, 0xfe, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0xb5, - 0xc8, 0x68, 0xc0, 0x30, 0x42, 0x6a, 0x01, 0x32, - 0x42, 0x62, 0x08, 0x1c, 0xf3, 0xf7, 0xc7, 0xfe, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x90, 0xb5, - 0xcc, 0x68, 0x0f, 0x1c, 0x28, 0xf0, 0xed, 0x09, - 0x00, 0xd0, 0x00, 0xdf, 0xfc, 0xf9, 0x1d, 0x09, - 0x31, 0x0c, 0xc9, 0xe0, 0x1d, 0xe1, 0x30, 0x0c, - 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x38, 0x6a, 0xe1, - 0x1d, 0xb9, 0x31, 0x88, 0x63, 0x60, 0x68, 0x00, - 0x69, 0x01, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0xfa, - 0xf7, 0x84, 0xfa, 0x02, 0xe0, 0x20, 0x1c, 0xfb, - 0xf7, 0x4a, 0xfb, 0x28, 0xf0, 0xc2, 0xfc, 0x90, - 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x90, - 0xb5, 0x01, 0x21, 0x0c, 0x48, 0x18, 0xf0, 0x35, - 0xfe, 0x07, 0x1c, 0xf3, 0xf7, 0x5f, 0xfe, 0x01, - 0x21, 0x01, 0x60, 0x09, 0xa4, 0x0c, 0xcc, 0xc1, - 0x1d, 0x0d, 0x31, 0x0c, 0xc1, 0x01, 0x21, 0x49, - 0x03, 0xc1, 0x61, 0xc7, 0x60, 0x01, 0x62, 0x01, - 0x1c, 0x00, 0x20, 0x00, 0xf0, 0x0a, 0xf8, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x0c, - 0x0e, 0x00, 0x00, 0xe2, 0x3a, 0x1a, 0x33, 0xce, - 0x2c, 0x7a, 0x4e, 0xf3, 0xb5, 0x81, 0xb0, 0x00, - 0x20, 0x00, 0x90, 0xce, 0x68, 0x0c, 0x1c, 0x28, - 0xf0, 0x98, 0xfc, 0x27, 0x69, 0x00, 0x2f, 0x14, - 0xd0, 0x00, 0x21, 0x38, 0x1c, 0xf5, 0xf7, 0xa7, - 0xfb, 0x00, 0x28, 0x0e, 0xd0, 0xf8, 0x68, 0x1a, - 0x28, 0x01, 0xd1, 0x14, 0x25, 0x00, 0xe0, 0x0c, - 0x25, 0xf8, 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x41, - 0x69, 0x01, 0x31, 0x41, 0x61, 0x28, 0xf0, 0x7d, - 0xfc, 0x0e, 0xe0, 0x28, 0xf0, 0x7a, 0xfc, 0x01, - 0x20, 0x31, 0x1c, 0xf7, 0xf7, 0xe0, 0xf9, 0x07, - 0x1c, 0x26, 0xd0, 0xf8, 0x1d, 0xff, 0x30, 0x7a, - 0x30, 0x41, 0x69, 0x01, 0x31, 0x41, 0x61, 0x0c, - 0x25, 0xe1, 0x1d, 0x0d, 0x31, 0x0c, 0xc9, 0xf8, - 0x1d, 0x7d, 0x30, 0x0c, 0xc0, 0xe0, 0x69, 0xf9, - 0x1d, 0xf8, 0x67, 0x20, 0x6a, 0x79, 0x31, 0x08, - 0x60, 0x00, 0x21, 0x38, 0x1c, 0x03, 0x23, 0x2a, - 0x1c, 0xed, 0x09, 0x00, 0xd1, 0x00, 0xf5, 0xf7, - 0xa3, 0xfa, 0x36, 0x20, 0x20, 0x60, 0xe6, 0x60, - 0x27, 0x61, 0x00, 0x98, 0x60, 0x61, 0x01, 0x98, - 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x20, 0x21, 0x1c, - 0xf3, 0xf7, 0x66, 0xfe, 0x06, 0xe0, 0x07, 0x20, - 0x00, 0x90, 0xee, 0xe7, 0x0a, 0x20, 0x21, 0x1c, - 0xf3, 0xf7, 0x5e, 0xfe, 0x03, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0xb0, 0xb5, - 0xcd, 0x68, 0x04, 0x1c, 0xe8, 0x68, 0x0f, 0x1c, - 0x00, 0x28, 0x0d, 0xd0, 0x0c, 0x28, 0x0b, 0xd0, - 0x14, 0x28, 0x01, 0xd0, 0x1a, 0x28, 0x0f, 0xd1, - 0x01, 0x23, 0x03, 0x22, 0x1a, 0x21, 0x28, 0x1c, - 0xf5, 0xf7, 0x9e, 0xfc, 0x00, 0x20, 0x08, 0xe0, - 0x01, 0x23, 0x03, 0x22, 0x00, 0x21, 0x28, 0x1c, - 0xf5, 0xf7, 0x96, 0xfc, 0x00, 0x20, 0x00, 0xe0, - 0x0c, 0x20, 0x37, 0x21, 0x39, 0x60, 0x69, 0x68, - 0x38, 0x61, 0xf9, 0x60, 0x00, 0x2c, 0x04, 0xd0, - 0x0e, 0x20, 0x39, 0x1c, 0xf3, 0xf7, 0x30, 0xfe, - 0x03, 0xe0, 0x0a, 0x20, 0x39, 0x1c, 0xf3, 0xf7, - 0x2b, 0xfe, 0xb0, 0xbc, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x00, 0x00, 0xf3, 0xb5, 0x84, 0xb0, - 0x00, 0x25, 0x0c, 0x1c, 0x09, 0x69, 0x02, 0x91, - 0xe2, 0x68, 0x01, 0x92, 0xa1, 0x69, 0x00, 0x91, - 0x28, 0xf0, 0x06, 0xfc, 0x67, 0x69, 0x00, 0x2f, - 0x2e, 0xd0, 0x00, 0x21, 0x38, 0x1c, 0xf5, 0xf7, - 0x15, 0xfb, 0x00, 0x28, 0x28, 0xd0, 0xf8, 0x68, - 0x17, 0x28, 0x16, 0xd0, 0x0f, 0xdc, 0x00, 0x28, - 0x05, 0xd0, 0x0f, 0x28, 0x03, 0xd0, 0x10, 0x28, - 0x01, 0xd0, 0x11, 0x28, 0x15, 0xd1, 0xf8, 0x1d, - 0xff, 0x30, 0x7a, 0x30, 0x41, 0x69, 0x0f, 0x26, - 0x01, 0x31, 0x41, 0x61, 0x0e, 0xe0, 0x18, 0x28, - 0x03, 0xd0, 0x19, 0x28, 0x01, 0xd0, 0x1a, 0x28, - 0x07, 0xd1, 0xf8, 0x1d, 0xed, 0x09, 0x00, 0xd2, - 0x00, 0xff, 0x30, 0x7a, 0x30, 0x41, 0x69, 0x17, - 0x26, 0x01, 0x31, 0x41, 0x61, 0x00, 0xe0, 0x00, - 0x27, 0x28, 0xf0, 0xd4, 0xfb, 0x00, 0x2f, 0x10, - 0xd1, 0x07, 0x26, 0x69, 0xe0, 0x28, 0xf0, 0xce, - 0xfb, 0x01, 0x20, 0x02, 0x99, 0xf7, 0xf7, 0x34, - 0xf9, 0x07, 0x1c, 0xf5, 0xd0, 0xf8, 0x1d, 0xff, - 0x30, 0x7a, 0x30, 0x41, 0x69, 0x01, 0x31, 0x41, - 0x61, 0x0f, 0x26, 0x00, 0x99, 0x01, 0x9a, 0x38, - 0x1c, 0xf7, 0xf7, 0x52, 0xf9, 0xe1, 0x1d, 0x15, - 0x31, 0x0c, 0xc9, 0x05, 0x1c, 0x10, 0x30, 0x0c, - 0xc0, 0xe8, 0x1d, 0x15, 0x30, 0xe1, 0x1d, 0x1d, - 0x31, 0x03, 0x90, 0x0c, 0xc9, 0x0c, 0xc0, 0xe1, - 0x6a, 0x05, 0x23, 0x28, 0x1c, 0x22, 0x6b, 0xf7, - 0xf7, 0x99, 0xfc, 0x02, 0x20, 0xe8, 0x60, 0xf8, - 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x00, 0x21, 0x41, - 0x60, 0x29, 0x49, 0xf8, 0x1d, 0x0c, 0xc9, 0xff, - 0x30, 0x82, 0x30, 0x0c, 0xc0, 0x00, 0x21, 0xe9, - 0x64, 0x29, 0x65, 0x69, 0x65, 0xa9, 0x65, 0xe9, - 0x65, 0x29, 0x66, 0xa9, 0x66, 0x69, 0x67, 0xa9, - 0x67, 0xe8, 0x1d, 0x79, 0x30, 0xe9, 0x67, 0x41, - 0x60, 0xc1, 0x60, 0xe8, 0x1d, 0x29, 0x64, 0x69, - 0x64, 0xb9, 0x30, 0x81, 0x63, 0xf8, 0x1d, 0x61, - 0x6b, 0x79, 0x30, 0xc1, 0x61, 0x1b, 0x49, 0x09, - 0x6b, 0x01, 0x62, 0x00, 0x21, 0x41, 0x62, 0x01, - 0x20, 0x00, 0x03, 0x78, 0x66, 0xb8, 0x66, 0x03, - 0x99, 0xf8, 0x1d, 0x0c, 0xc9, 0x65, 0x30, 0x0c, - 0xc0, 0x15, 0x49, 0xf8, 0x1d, 0x0c, 0xc9, 0x51, - 0x30, 0x0c, 0xc0, 0xff, 0x20, 0x01, 0x30, 0x38, - 0x65, 0x78, 0x65, 0x38, 0x1c, 0x04, 0x23, 0x29, - 0x1c, 0x32, 0x1c, 0xf5, 0xf7, 0xaf, 0xf9, 0x00, - 0x26, 0x38, 0x20, 0x20, 0x60, 0x01, 0x9a, 0xe2, - 0x60, 0x27, 0x61, 0x65, 0x61, 0xa6, 0x61, 0xed, - 0x09, 0x00, 0xd3, 0x00, 0x04, 0x98, 0x00, 0x28, - 0x04, 0xd0, 0x0e, 0x20, 0x21, 0x1c, 0xf3, 0xf7, - 0x70, 0xfd, 0x03, 0xe0, 0x0a, 0x20, 0x21, 0x1c, - 0xf3, 0xf7, 0x6b, 0xfd, 0x30, 0x1c, 0x06, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xe6, - 0x03, 0x20, 0x48, 0xe6, 0x03, 0x20, 0x88, 0xe6, - 0x03, 0x20, 0xf0, 0xb5, 0x0f, 0x1c, 0xc9, 0x68, - 0x04, 0x1c, 0x0e, 0x1d, 0x41, 0xce, 0xc2, 0x68, - 0x00, 0x25, 0x17, 0x2a, 0x17, 0xd0, 0x08, 0xdc, - 0x00, 0x2a, 0x1a, 0xd0, 0x0f, 0x2a, 0x18, 0xd0, - 0x10, 0x2a, 0x16, 0xd0, 0x11, 0x2a, 0x14, 0xd0, - 0x05, 0xe0, 0x18, 0x2a, 0x0b, 0xd0, 0x19, 0x2a, - 0x09, 0xd0, 0x1a, 0x2a, 0x01, 0xd0, 0x0c, 0x25, - 0x10, 0xe0, 0xc9, 0x68, 0x05, 0x29, 0x02, 0xd1, - 0xff, 0x25, 0x11, 0x35, 0x0a, 0xe0, 0x01, 0x23, - 0x04, 0x22, 0x1a, 0x21, 0xf5, 0xf7, 0x91, 0xfb, - 0x04, 0xe0, 0x01, 0x23, 0x04, 0x22, 0x00, 0x21, - 0xf5, 0xf7, 0x8b, 0xfb, 0x39, 0x20, 0x38, 0x60, - 0x3d, 0x61, 0xfe, 0x60, 0x00, 0x2c, 0x04, 0xd0, - 0x0e, 0x20, 0x39, 0x1c, 0xf3, 0xf7, 0x29, 0xfd, - 0x03, 0xe0, 0x0a, 0x20, 0x39, 0x1c, 0xf3, 0xf7, - 0x24, 0xfd, 0xf0, 0xbc, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, 0xf3, 0xf7, - 0xad, 0xfc, 0x00, 0x28, 0x07, 0xd0, 0x3d, 0x21, - 0x01, 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x01, 0x1c, - 0x0e, 0x20, 0xf3, 0xf7, 0x12, 0xfd, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x90, 0xb5, - 0xc8, 0x68, 0x0f, 0x1c, 0x0a, 0x69, 0xc1, 0x1d, - 0x79, 0x31, 0xca, 0x60, 0x7a, 0x69, 0x00, 0x24, - 0x0a, 0x61, 0x06, 0x21, 0xf5, 0xf7, 0xcb, 0xf9, - 0x38, 0x1c, 0xf3, 0xf7, 0xca, 0xfc, 0x20, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, - 0xce, 0x68, 0xed, 0x09, 0x00, 0xd4, 0x00, 0x00, - 0x25, 0x0f, 0x1c, 0x02, 0x20, 0x31, 0x1c, 0xf7, - 0xf7, 0x44, 0xf8, 0x04, 0x1c, 0x01, 0xd1, 0x07, - 0x25, 0x13, 0xe0, 0xe0, 0x1d, 0x39, 0x69, 0x79, - 0x30, 0xc1, 0x60, 0x79, 0x69, 0x01, 0x61, 0x19, - 0x49, 0xe0, 0x1d, 0x0c, 0xc9, 0x8d, 0x30, 0x0c, - 0xc0, 0xff, 0x20, 0x01, 0x30, 0x20, 0x65, 0x60, - 0x65, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, - 0x20, 0xe0, 0x60, 0x02, 0x9a, 0x00, 0x2a, 0x03, - 0xd1, 0x38, 0x1c, 0xf3, 0xf7, 0xa0, 0xfc, 0x10, - 0xe0, 0x3a, 0x20, 0x38, 0x60, 0x3c, 0x61, 0x7d, - 0x61, 0xfe, 0x60, 0x00, 0x98, 0x00, 0x28, 0x04, - 0xd0, 0x0e, 0x20, 0x39, 0x1c, 0xf3, 0xf7, 0xc7, - 0xfc, 0x03, 0xe0, 0x0a, 0x20, 0x39, 0x1c, 0xf3, - 0xf7, 0xc2, 0xfc, 0x00, 0x2d, 0x05, 0xd1, 0x06, - 0x23, 0x07, 0x22, 0x00, 0x21, 0x20, 0x1c, 0xf5, - 0xf7, 0xea, 0xf8, 0x03, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, 0x88, - 0xe6, 0x03, 0x20, 0xf7, 0xb5, 0xcd, 0x68, 0x13, - 0x1c, 0x14, 0x1c, 0x0f, 0x1c, 0x00, 0x21, 0x06, - 0x22, 0x00, 0x26, 0x28, 0x1c, 0xf5, 0xf7, 0xff, - 0xfa, 0x00, 0x2c, 0x03, 0xd1, 0x38, 0x1c, 0xf3, - 0xf7, 0x6e, 0xfc, 0x11, 0xe0, 0x3a, 0x20, 0x38, - 0x60, 0x68, 0x68, 0x0c, 0x37, 0x61, 0xc7, 0x00, - 0x98, 0x18, 0x3f, 0x00, 0x28, 0x04, 0xd0, 0x0e, - 0x20, 0x39, 0x1c, 0xf3, 0xf7, 0x94, 0xfc, 0x03, - 0xe0, 0x0a, 0x20, 0x39, 0x1c, 0xf3, 0xf7, 0x8f, - 0xfc, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0xc1, 0x68, 0x00, 0x69, 0x88, - 0x60, 0x00, 0x20, 0x70, 0x47, 0x90, 0xb5, 0x04, - 0x1c, 0x0f, 0x1c, 0xf3, 0xf7, 0x11, 0xfc, 0x00, - 0x28, 0x08, 0xd0, 0x3e, 0x21, 0x01, 0x60, 0x61, - 0x68, 0xc1, 0x60, 0x07, 0x61, 0xed, 0x09, 0x00, - 0xd5, 0x00, 0x01, 0x1c, 0x0e, 0x20, 0xf3, 0xf7, - 0x75, 0xfc, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xf0, 0xb5, 0x87, 0xb0, 0xcd, 0x68, 0x04, 0x1c, - 0x6e, 0x68, 0x08, 0x69, 0x05, 0x90, 0x48, 0x69, - 0x04, 0x90, 0x88, 0x69, 0x01, 0x90, 0xc8, 0x69, - 0x00, 0x90, 0xc8, 0x1d, 0x19, 0x30, 0x06, 0x90, - 0x0f, 0x1c, 0x01, 0x68, 0x02, 0x91, 0x40, 0x68, - 0x03, 0x90, 0xf3, 0xf7, 0xec, 0xfb, 0x01, 0x1c, - 0x04, 0x20, 0x08, 0x60, 0x00, 0x22, 0x20, 0x1c, - 0xcd, 0x60, 0xff, 0xf7, 0xe9, 0xf9, 0x03, 0x20, - 0x38, 0x60, 0x05, 0x98, 0x38, 0x61, 0x04, 0x98, - 0x78, 0x61, 0x01, 0x98, 0xb8, 0x61, 0x00, 0x98, - 0xf8, 0x61, 0x06, 0x98, 0x03, 0x99, 0x41, 0x60, - 0x02, 0x99, 0x01, 0x60, 0xfe, 0x60, 0x28, 0x1c, - 0x32, 0x1c, 0x29, 0x69, 0xf6, 0xf7, 0x6a, 0xff, - 0x20, 0x1c, 0x39, 0x1c, 0x2a, 0x1c, 0xff, 0xf7, - 0x49, 0xf9, 0x07, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x01, 0x69, 0xc0, 0x68, - 0x88, 0x60, 0x00, 0x20, 0x70, 0x47, 0xf0, 0xb5, - 0x85, 0xb0, 0xc2, 0x68, 0xc5, 0x69, 0x00, 0x92, - 0x01, 0x69, 0x47, 0x69, 0x04, 0x1c, 0x67, 0x48, - 0x01, 0x91, 0xc1, 0x1d, 0xf9, 0x31, 0x04, 0x91, - 0xc1, 0x1d, 0xf1, 0x31, 0x03, 0x91, 0x00, 0x2a, - 0x57, 0xd0, 0xa6, 0x69, 0x00, 0x2f, 0x1a, 0xd0, - 0x68, 0x68, 0xb8, 0x42, 0x09, 0xd1, 0xff, 0x20, - 0x35, 0x30, 0x70, 0x43, 0xc0, 0x19, 0xff, 0x30, - 0x99, 0x30, 0xe9, 0x1d, 0x79, 0x31, 0x88, 0x61, - 0x09, 0xe0, 0x38, 0x1c, 0x31, 0x1c, 0x00, 0x9a, - 0xf6, 0xf7, 0x86, 0xff, 0xe9, 0x1d, 0x79, 0x31, - 0x88, 0x61, 0x01, 0x21, 0xc1, 0x60, 0xe8, 0x1d, - 0x99, 0x30, 0x06, 0x73, 0x6f, 0xe0, 0xe8, 0x1d, - 0x79, 0x30, 0x02, 0x90, 0x80, 0x69, 0x00, 0x28, - 0xed, 0x09, 0x00, 0xd6, 0x00, 0x05, 0xd0, 0x40, - 0x68, 0x01, 0x21, 0xf5, 0xf7, 0xf7, 0xf8, 0x07, - 0x1c, 0x63, 0xd1, 0x01, 0x20, 0x01, 0x99, 0xf6, - 0xf7, 0x41, 0xff, 0x07, 0x1c, 0x5d, 0xd0, 0x38, - 0x1c, 0x31, 0x1c, 0x00, 0x9a, 0xf6, 0xf7, 0x66, - 0xff, 0x02, 0x99, 0x1a, 0x22, 0x88, 0x61, 0x01, - 0x21, 0xc1, 0x60, 0xe8, 0x1d, 0x99, 0x30, 0xf9, - 0x1d, 0xff, 0x31, 0x06, 0x73, 0x00, 0x20, 0x7a, - 0x31, 0x48, 0x60, 0x03, 0x99, 0xf8, 0x1d, 0xff, - 0x30, 0x48, 0xc9, 0x82, 0x30, 0x48, 0xc0, 0x04, - 0x99, 0xf8, 0x1d, 0x48, 0xc9, 0x51, 0x30, 0x48, - 0xc0, 0xff, 0x20, 0x01, 0x30, 0x38, 0x65, 0x78, - 0x65, 0x02, 0x98, 0x01, 0x23, 0x81, 0x69, 0x38, - 0x1c, 0xf4, 0xf7, 0xf6, 0xff, 0x35, 0xe0, 0x00, - 0x2f, 0x2c, 0xd1, 0xe8, 0x1d, 0x79, 0x30, 0x80, - 0x69, 0x00, 0x28, 0x05, 0xd0, 0x40, 0x68, 0x01, - 0x21, 0xf5, 0xf7, 0xbc, 0xf8, 0x07, 0x1c, 0x21, - 0xd1, 0x02, 0x20, 0x01, 0x99, 0xf6, 0xf7, 0x06, - 0xff, 0x07, 0x1c, 0x1b, 0xd0, 0xf9, 0x1d, 0xff, - 0x31, 0x7a, 0x31, 0x00, 0x20, 0x48, 0x60, 0x03, - 0x99, 0xf8, 0x1d, 0xff, 0x30, 0x0c, 0xc9, 0x82, - 0x30, 0x0c, 0xc0, 0x04, 0x99, 0xf8, 0x1d, 0x0c, - 0xc9, 0x51, 0x30, 0x0c, 0xc0, 0xff, 0x20, 0x01, - 0x30, 0x38, 0x65, 0x78, 0x65, 0xf9, 0x1d, 0xff, - 0x31, 0x38, 0x1c, 0x01, 0x23, 0x1a, 0x22, 0x92, - 0x31, 0xf4, 0xf7, 0xc6, 0xff, 0xe9, 0x1d, 0x79, - 0x31, 0x00, 0x20, 0x88, 0x61, 0xe9, 0x1d, 0x99, - 0x31, 0x08, 0x73, 0x00, 0x2f, 0x14, 0xd1, 0x41, - 0x20, 0x20, 0x60, 0x68, 0x68, 0xa0, 0x61, 0x65, - 0x61, 0x68, 0x68, 0x40, 0x68, 0x20, 0x61, 0x28, - 0x7e, 0xe0, 0x60, 0x07, 0x20, 0xe0, 0x61, 0x0e, - 0x20, 0x21, 0x1c, 0xf3, 0xf7, 0x7d, 0xfb, 0x00, - 0x20, 0x05, 0xb0, 0xed, 0x09, 0x00, 0xd7, 0x00, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, 0x6a, - 0x40, 0x00, 0x80, 0x35, 0xe8, 0x61, 0x21, 0x6a, - 0x00, 0x28, 0x29, 0x63, 0x08, 0xd1, 0x00, 0x29, - 0x06, 0xd1, 0x00, 0x27, 0x20, 0x1c, 0x69, 0x61, - 0xf3, 0xf7, 0x35, 0xfb, 0x38, 0x1c, 0xea, 0xe7, - 0x20, 0x1c, 0xf3, 0xf7, 0x30, 0xfb, 0xa8, 0x69, - 0x00, 0x28, 0x03, 0xd1, 0xf8, 0x1d, 0xff, 0x30, - 0x92, 0x30, 0xa8, 0x61, 0x01, 0x21, 0x69, 0x61, - 0x00, 0x20, 0xdc, 0xe7, 0x00, 0x00, 0x88, 0xe5, - 0x03, 0x20, 0xff, 0x21, 0x41, 0x62, 0x01, 0x21, - 0x81, 0x62, 0x06, 0x49, 0x89, 0x6a, 0xc1, 0x62, - 0x00, 0x21, 0x01, 0x63, 0x40, 0x68, 0xff, 0x30, - 0x91, 0x30, 0x01, 0x68, 0x02, 0x23, 0x99, 0x43, - 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, 0x48, 0xe6, - 0x03, 0x20, 0xb0, 0xb5, 0x05, 0x1c, 0x0f, 0x1c, - 0x03, 0xd1, 0x00, 0x20, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x38, 0x1c, 0xf3, 0xf7, 0x97, 0xfa, - 0x04, 0x1c, 0x0a, 0x2d, 0x25, 0xd2, 0x01, 0xa3, - 0x5b, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x21, 0x04, - 0x0a, 0x10, 0x1c, 0x21, 0x21, 0x21, 0x21, 0x16, - 0x00, 0x21, 0x20, 0x1c, 0x3a, 0x1c, 0xf2, 0xf7, - 0x96, 0xfe, 0x16, 0xe0, 0xff, 0x21, 0x20, 0x1c, - 0x3a, 0x1c, 0xf2, 0xf7, 0x90, 0xfe, 0x10, 0xe0, - 0xaa, 0x21, 0x20, 0x1c, 0x3a, 0x1c, 0xf2, 0xf7, - 0x8a, 0xfe, 0x0a, 0xe0, 0xf0, 0x21, 0x20, 0x1c, - 0x3a, 0x1c, 0xf2, 0xf7, 0x84, 0xfe, 0x04, 0xe0, - 0x3a, 0x1c, 0x20, 0x1c, 0x02, 0x49, 0xf2, 0xf7, - 0x06, 0xff, 0x20, 0x1c, 0xce, 0xe7, 0x60, 0x63, - 0x03, 0x20, 0xb0, 0xb5, 0x00, 0x25, 0x13, 0x4c, - 0x85, 0x63, 0x07, 0x1c, 0x20, 0x6e, 0x00, 0x28, - 0x06, 0xd0, 0x40, 0x6a, 0xf3, 0xf7, 0x8b, 0xfa, - 0x20, 0x6e, 0x1a, 0xf0, 0x4e, 0xff, 0xed, 0x09, - 0x00, 0xd8, 0x00, 0x25, 0x66, 0x38, 0x6b, 0x00, - 0x28, 0x0e, 0xd0, 0x00, 0x6b, 0x00, 0x28, 0x01, - 0xd0, 0xf3, 0xf7, 0x7f, 0xfa, 0x38, 0x6b, 0xc0, - 0x69, 0x00, 0x28, 0x01, 0xd0, 0xf3, 0xf7, 0x79, - 0xfa, 0x38, 0x6b, 0xf3, 0xf7, 0xdc, 0xfa, 0x3d, - 0x63, 0x78, 0x6a, 0xfd, 0x28, 0x01, 0xd1, 0xff, - 0x20, 0x78, 0x62, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x90, 0xe6, 0x03, 0x20, 0xf0, - 0xb5, 0x85, 0xb0, 0x07, 0x1c, 0xc4, 0x68, 0x00, - 0x69, 0xfe, 0x26, 0x05, 0x28, 0x5d, 0x4d, 0x73, - 0xd0, 0x08, 0xdc, 0x05, 0x28, 0x71, 0xd2, 0x01, - 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x1b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x00, 0x08, 0x28, 0x04, - 0xd0, 0x11, 0xdc, 0x06, 0x28, 0x64, 0xd0, 0x07, - 0x28, 0x64, 0xd1, 0x28, 0xf0, 0xae, 0xf8, 0x66, - 0x62, 0x78, 0x69, 0xa0, 0x62, 0x78, 0x6a, 0x28, - 0x62, 0xb8, 0x6a, 0x68, 0x62, 0x00, 0x20, 0xe0, - 0x62, 0x28, 0xf0, 0x9f, 0xf8, 0x93, 0xe0, 0x09, - 0x28, 0x21, 0xd0, 0xff, 0x28, 0x52, 0xd1, 0x28, - 0xf0, 0x9c, 0xf8, 0x00, 0x20, 0xa0, 0x63, 0x39, - 0x69, 0x61, 0x62, 0xff, 0x29, 0x03, 0xd1, 0x79, - 0x69, 0xa1, 0x62, 0x01, 0x21, 0xe1, 0x62, 0x25, - 0x6b, 0x00, 0x2d, 0x6f, 0xd0, 0x20, 0x63, 0x28, - 0xf0, 0x88, 0xf8, 0x28, 0x6b, 0x00, 0x28, 0x01, - 0xd0, 0xf3, 0xf7, 0x27, 0xfa, 0xe8, 0x69, 0x00, - 0x28, 0x01, 0xd0, 0xf3, 0xf7, 0x22, 0xfa, 0x28, - 0x1c, 0xf3, 0xf7, 0x85, 0xfa, 0x6f, 0xe0, 0x39, - 0x6a, 0xfe, 0x69, 0x04, 0x91, 0xb9, 0x69, 0x02, - 0x90, 0x03, 0x91, 0x78, 0x69, 0x38, 0x49, 0x01, - 0x90, 0x08, 0x6e, 0x00, 0x90, 0x1a, 0xf0, 0xb5, - 0xfe, 0x35, 0x49, 0x08, 0x66, 0x02, 0x98, 0x31, - 0x1c, 0xff, 0xf7, 0x3d, 0xff, 0x32, 0x49, 0x09, - 0x6e, 0xed, 0x09, 0x00, 0xd9, 0x00, 0x48, 0x62, - 0x30, 0x49, 0x08, 0x6e, 0x06, 0x62, 0x28, 0xf0, - 0x63, 0xf8, 0xfd, 0x20, 0x60, 0x62, 0x01, 0x98, - 0x2c, 0x4a, 0xa0, 0x62, 0x00, 0x20, 0xe0, 0x62, - 0x04, 0x99, 0x61, 0x63, 0xa0, 0x63, 0x79, 0x6a, - 0x29, 0x62, 0xb9, 0x6a, 0x69, 0x62, 0x0d, 0x21, - 0x39, 0x60, 0x26, 0x49, 0xfc, 0x60, 0x39, 0x61, - 0x21, 0x7e, 0x11, 0x72, 0x02, 0xe0, 0x2d, 0xe0, - 0x3c, 0xe0, 0x3b, 0xe0, 0x21, 0x49, 0x09, 0x6e, - 0xb9, 0x61, 0x78, 0x61, 0x02, 0x20, 0x38, 0x62, - 0xfe, 0x61, 0x03, 0x99, 0x38, 0x1c, 0x79, 0x62, - 0x03, 0x99, 0xb9, 0x62, 0xff, 0xf7, 0xb8, 0xf9, - 0x60, 0x6f, 0x00, 0x28, 0x09, 0xd0, 0xc0, 0x6b, - 0x00, 0x28, 0x04, 0xd0, 0xf3, 0xf7, 0x14, 0xfa, - 0x61, 0x6f, 0x00, 0x20, 0xc8, 0x63, 0x00, 0x20, - 0x60, 0x67, 0x28, 0xf0, 0x29, 0xf8, 0x00, 0x98, - 0x00, 0x28, 0x06, 0xd0, 0x00, 0x98, 0x40, 0x6a, - 0xf3, 0xf7, 0xc6, 0xf9, 0x00, 0x98, 0x1a, 0xf0, - 0x89, 0xfe, 0x05, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x0d, 0xe0, 0x28, 0xf0, 0x1c, 0xf8, - 0x66, 0x62, 0x78, 0x69, 0x01, 0x21, 0xa0, 0x62, - 0x78, 0x6a, 0x28, 0x62, 0xb8, 0x6a, 0x68, 0x62, - 0xe1, 0x62, 0x28, 0xf0, 0x0d, 0xf8, 0x01, 0xe0, - 0x28, 0xf0, 0x0a, 0xf8, 0x00, 0x2f, 0xe8, 0xd0, - 0x38, 0x1c, 0xf3, 0xf7, 0xe9, 0xf9, 0xe4, 0xe7, - 0x48, 0xe6, 0x03, 0x20, 0x90, 0xe6, 0x03, 0x20, - 0xb0, 0xb5, 0xc7, 0x68, 0x44, 0x21, 0x01, 0x60, - 0xb9, 0x68, 0xfd, 0x1d, 0xf5, 0x35, 0xc1, 0x60, - 0x0e, 0xcd, 0xc4, 0x1d, 0x09, 0x34, 0x0e, 0xc4, - 0x0e, 0xcd, 0x0e, 0xc4, 0xf9, 0x1d, 0xb9, 0x31, - 0x09, 0x6a, 0x81, 0x62, 0x01, 0x1c, 0x0a, 0x20, - 0xf3, 0xf7, 0x02, 0xfa, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xed, 0x09, 0x00, 0xda, - 0x00, 0xf0, 0x47, 0x2d, 0xe9, 0x00, 0x30, 0xa0, - 0xe3, 0x00, 0xc0, 0xa0, 0xe3, 0x18, 0x70, 0x81, - 0xe2, 0x04, 0x80, 0xa0, 0xe3, 0x65, 0x00, 0x00, - 0xea, 0x00, 0xe0, 0x91, 0xe5, 0x0e, 0x00, 0x52, - 0xe1, 0x02, 0xe0, 0xa0, 0x31, 0x00, 0x00, 0x5e, - 0xe3, 0x5f, 0x00, 0x00, 0x0a, 0x04, 0x40, 0x91, - 0xe5, 0x04, 0x50, 0x48, 0xe0, 0x03, 0x50, 0x05, - 0xe2, 0x0e, 0x00, 0x55, 0xe1, 0x0e, 0x50, 0xa0, - 0x21, 0x05, 0x60, 0x83, 0xe0, 0x03, 0x60, 0x06, - 0xe2, 0x06, 0x00, 0x53, 0xe1, 0x0e, 0x00, 0x00, - 0x0a, 0x03, 0x00, 0x53, 0xe3, 0x06, 0x00, 0x00, - 0x1a, 0x01, 0x30, 0xd4, 0xe4, 0x03, 0x3c, 0x8c, - 0xe1, 0x00, 0x30, 0x80, 0xe5, 0x04, 0x00, 0x80, - 0xe2, 0x00, 0xc0, 0xa0, 0xe3, 0x00, 0x30, 0xa0, - 0xe3, 0x03, 0x00, 0x00, 0xea, 0x01, 0x90, 0xd4, - 0xe4, 0x83, 0xa1, 0xa0, 0xe1, 0x01, 0x30, 0x83, - 0xe2, 0x19, 0xca, 0x8c, 0xe1, 0x06, 0x00, 0x53, - 0xe1, 0xf0, 0xff, 0xff, 0x1a, 0x05, 0x60, 0x4e, - 0xe0, 0x26, 0x91, 0xa0, 0xe1, 0x00, 0x00, 0x53, - 0xe3, 0x1d, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x53, - 0xe3, 0x24, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x53, - 0xe3, 0x2d, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x53, - 0xe3, 0x09, 0x00, 0x00, 0x1a, 0x01, 0x60, 0x49, - 0xe2, 0x00, 0x00, 0x59, 0xe3, 0x06, 0x00, 0x00, - 0x0a, 0x04, 0x90, 0x94, 0xe4, 0x09, 0xcc, 0x8c, - 0xe1, 0x00, 0xc0, 0x80, 0xe5, 0x29, 0xc4, 0xa0, - 0xe1, 0x01, 0x60, 0x56, 0xe2, 0x04, 0x00, 0x80, - 0xe2, 0xf8, 0xff, 0xff, 0x2a, 0x0e, 0x60, 0x83, - 0xe0, 0x05, 0x50, 0x46, 0xe0, 0x03, 0x50, 0x05, - 0xe2, 0x05, 0x00, 0x53, 0xe1, 0x2d, 0x00, 0x00, - 0x0a, 0x03, 0x00, 0x53, 0xe3, 0x25, 0x00, 0x00, - 0x1a, 0x01, 0x30, 0xd4, 0xe4, 0x03, 0x3c, 0xed, - 0x09, 0x00, 0xdb, 0x00, 0x8c, 0xe1, 0x00, 0x30, - 0x80, 0xe5, 0x04, 0x00, 0x80, 0xe2, 0x00, 0xc0, - 0xa0, 0xe3, 0x00, 0x30, 0xa0, 0xe3, 0x22, 0x00, - 0x00, 0xea, 0x01, 0x60, 0x49, 0xe2, 0x00, 0x00, - 0x59, 0xe3, 0xee, 0xff, 0xff, 0x0a, 0x04, 0x90, - 0x94, 0xe4, 0x00, 0x90, 0x80, 0xe5, 0x04, 0x00, - 0x80, 0xe2, 0x01, 0x60, 0x56, 0xe2, 0xfa, 0xff, - 0xff, 0x2a, 0xe8, 0xff, 0xff, 0xea, 0x01, 0x60, - 0x49, 0xe2, 0x00, 0x00, 0x59, 0xe3, 0xe5, 0xff, - 0xff, 0x0a, 0x04, 0x90, 0x94, 0xe4, 0x09, 0xc4, - 0x8c, 0xe1, 0x00, 0xc0, 0x80, 0xe5, 0x29, 0xcc, - 0xa0, 0xe1, 0x01, 0x60, 0x56, 0xe2, 0x04, 0x00, - 0x80, 0xe2, 0xf8, 0xff, 0xff, 0x2a, 0xdd, 0xff, - 0xff, 0xea, 0x01, 0x60, 0x49, 0xe2, 0x00, 0x00, - 0x59, 0xe3, 0xda, 0xff, 0xff, 0x0a, 0x04, 0x90, - 0x94, 0xe4, 0x09, 0xc8, 0x8c, 0xe1, 0x00, 0xc0, - 0x80, 0xe5, 0x29, 0xc8, 0xa0, 0xe1, 0x01, 0x60, - 0x56, 0xe2, 0x04, 0x00, 0x80, 0xe2, 0xf8, 0xff, - 0xff, 0x2a, 0xd2, 0xff, 0xff, 0xea, 0x01, 0x90, - 0xd4, 0xe4, 0x83, 0x61, 0xa0, 0xe1, 0x01, 0x30, - 0x83, 0xe2, 0x19, 0xc6, 0x8c, 0xe1, 0x05, 0x00, - 0x53, 0xe1, 0xd1, 0xff, 0xff, 0x1a, 0x0e, 0x20, - 0x42, 0xe0, 0x08, 0x10, 0x81, 0xe2, 0x00, 0x00, - 0x52, 0xe3, 0x01, 0x00, 0x00, 0xda, 0x07, 0x00, - 0x51, 0xe1, 0x95, 0xff, 0xff, 0x3a, 0x00, 0xc0, - 0x80, 0xe5, 0xf0, 0x47, 0xbd, 0xe8, 0x1e, 0xff, - 0x2f, 0xe1, 0x00, 0x10, 0xa0, 0xe3, 0x0a, 0x2b, - 0xa0, 0xe3, 0x06, 0x00, 0x80, 0xe8, 0x0c, 0x10, - 0x80, 0xe5, 0x0a, 0x20, 0xa0, 0xe3, 0x08, 0x20, - 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0xf0, 0x4f, - 0x2d, 0xe9, 0x00, 0x09, 0x90, 0xe9, 0x00, 0x40, - 0xa0, 0xe1, 0x01, 0x70, 0xa0, 0xe1, 0x02, 0x60, - 0xa0, 0xe1, 0xed, 0x09, 0x00, 0xdc, 0x00, 0x03, - 0x50, 0xa0, 0xe1, 0x00, 0x00, 0x53, 0xe3, 0x00, - 0xa0, 0x90, 0xe5, 0x00, 0x90, 0xa0, 0xe3, 0x2a, - 0x00, 0x00, 0xda, 0x09, 0x10, 0xd6, 0xe7, 0x02, - 0x34, 0xa0, 0xe3, 0x01, 0x3b, 0x43, 0xe2, 0x81, - 0x11, 0x8b, 0xe1, 0x02, 0x1b, 0x81, 0xe3, 0x00, - 0x00, 0xa0, 0xe3, 0x0f, 0x20, 0x01, 0xe2, 0x0f, - 0x00, 0x52, 0xe3, 0x00, 0x00, 0x52, 0x13, 0x03, - 0x00, 0x00, 0x1a, 0x0a, 0x8b, 0x88, 0xe2, 0x05, - 0x07, 0x58, 0xe3, 0x05, 0x87, 0xa0, 0xc3, 0x03, - 0x00, 0x00, 0xea, 0x08, 0x25, 0x68, 0xe0, 0x42, - 0x85, 0xa0, 0xe1, 0x0a, 0x0b, 0x58, 0xe3, 0x0a, - 0x8b, 0xa0, 0xb3, 0x08, 0x00, 0x11, 0xe3, 0x08, - 0x20, 0x8a, 0x00, 0x08, 0x20, 0x4a, 0x10, 0x03, - 0x00, 0x52, 0xe1, 0x03, 0x20, 0xa0, 0xc1, 0x01, - 0x00, 0x00, 0xca, 0xfe, 0x04, 0x52, 0xe3, 0xfe, - 0x24, 0xa0, 0xb3, 0x82, 0x22, 0x62, 0xe0, 0xc2, - 0xa2, 0xa0, 0xe1, 0xc1, 0x10, 0xa0, 0xe1, 0x10, - 0x00, 0x51, 0xe3, 0x0a, 0x00, 0x80, 0xe0, 0xe5, - 0xff, 0xff, 0xaa, 0xc0, 0x06, 0xa0, 0xe1, 0x00, - 0x08, 0xa0, 0xe1, 0x40, 0x08, 0xa0, 0xe1, 0x07, - 0xb0, 0x01, 0xe2, 0x63, 0x9f, 0x00, 0xeb, 0x20, - 0x10, 0x9f, 0xe5, 0x00, 0x00, 0xd1, 0xe7, 0x09, - 0x00, 0xc7, 0xe7, 0x01, 0x90, 0x89, 0xe2, 0x05, - 0x00, 0x59, 0xe1, 0xd4, 0xff, 0xff, 0xba, 0x00, - 0x09, 0x84, 0xe9, 0x00, 0xa0, 0x84, 0xe5, 0xf0, - 0x4f, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, 0x08, - 0x10, 0x01, 0x20, 0xff, 0x4f, 0x2d, 0xe9, 0x0c, - 0x40, 0x90, 0xe5, 0x04, 0x40, 0x90, 0xe9, 0x84, - 0x61, 0xa0, 0xe1, 0x00, 0x00, 0x53, 0xe3, 0x02, - 0xa4, 0xa0, 0xc3, 0x01, 0xab, 0x4a, 0xc2, 0x00, - 0xc0, 0x90, 0xe5, 0x00, 0x50, 0xa0, 0xe3, 0x00, - 0x00, 0x00, 0xca, 0x2d, 0x00, 0xed, 0x09, 0x00, - 0xdd, 0x00, 0x00, 0xea, 0x08, 0x90, 0x9d, 0xe5, - 0x3c, 0xb0, 0x1f, 0xe5, 0x05, 0x90, 0xd9, 0xe7, - 0x00, 0x80, 0xa0, 0xe3, 0x01, 0x70, 0xa0, 0xe3, - 0x09, 0x90, 0xdb, 0xe7, 0xb0, 0xb0, 0x9f, 0xe5, - 0x89, 0x90, 0xa0, 0xe1, 0xf9, 0x90, 0x9b, 0xe1, - 0x09, 0x95, 0xa0, 0xe1, 0x04, 0xb0, 0x49, 0xe0, - 0x0f, 0x40, 0xa0, 0xe3, 0x8e, 0xe0, 0x04, 0xe0, - 0x0b, 0x60, 0x86, 0xe0, 0x06, 0x00, 0x5c, 0xe1, - 0x01, 0xe0, 0x8e, 0xc3, 0x07, 0x80, 0x88, 0xc1, - 0x0f, 0x00, 0x5e, 0xe3, 0x00, 0x00, 0x5e, 0x13, - 0x03, 0x00, 0x00, 0x1a, 0x0a, 0x2b, 0x82, 0xe2, - 0x05, 0x07, 0x52, 0xe3, 0x05, 0x27, 0xa0, 0xc3, - 0x03, 0x00, 0x00, 0xea, 0x02, 0x25, 0x62, 0xe0, - 0x42, 0x25, 0xa0, 0xe1, 0x0a, 0x0b, 0x52, 0xe3, - 0x0a, 0x2b, 0xa0, 0xb3, 0x06, 0x00, 0x5c, 0xe1, - 0x02, 0x40, 0x8c, 0xd0, 0x02, 0x40, 0x4c, 0xc0, - 0x0a, 0x00, 0x54, 0xe1, 0x0a, 0x40, 0xa0, 0xc1, - 0x01, 0x00, 0x00, 0xca, 0xfe, 0x04, 0x54, 0xe3, - 0xfe, 0x44, 0xa0, 0xb3, 0x84, 0xc2, 0x64, 0xe0, - 0xcc, 0xc2, 0xa0, 0xe1, 0x87, 0x70, 0xa0, 0xe1, - 0x80, 0x00, 0x57, 0xe3, 0xe1, 0xff, 0xff, 0xda, - 0x05, 0x80, 0xc1, 0xe7, 0x01, 0x50, 0x85, 0xe2, - 0x09, 0x40, 0xa0, 0xe1, 0x03, 0x00, 0x55, 0xe1, - 0xd1, 0xff, 0xff, 0xba, 0x04, 0x40, 0x80, 0xe9, - 0x0c, 0x40, 0x80, 0xe5, 0x00, 0xc0, 0x80, 0xe5, - 0x10, 0xd0, 0x8d, 0xe2, 0xf0, 0x4f, 0xbd, 0xe8, - 0x1e, 0xff, 0x2f, 0xe1, 0x08, 0x11, 0x01, 0x20, - 0x90, 0xb5, 0x2d, 0x49, 0x49, 0x69, 0x00, 0x29, - 0x17, 0xd0, 0xcf, 0x68, 0xf9, 0x1e, 0x1a, 0x29, - 0x49, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, - 0x9f, 0x44, 0x00, 0x1c, 0x0d, 0x45, 0x0d, 0x45, - 0x0d, 0x12, 0x15, 0x45, 0x45, 0x1b, 0x45, 0x45, - 0xed, 0x09, 0x00, 0xde, 0x00, 0x1b, 0x18, 0x18, - 0x45, 0x45, 0x1b, 0x45, 0x45, 0x1b, 0x18, 0x18, - 0x1e, 0x45, 0x42, 0xf8, 0xf7, 0x3f, 0xf8, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x02, 0xf0, 0x1a, - 0xf9, 0xf9, 0xe7, 0x02, 0xf0, 0xb3, 0xfa, 0xf6, - 0xe7, 0xf8, 0xf7, 0x54, 0xff, 0xf3, 0xe7, 0xf8, - 0xf7, 0xe7, 0xfc, 0xf0, 0xe7, 0x18, 0x49, 0x09, - 0x68, 0x05, 0x29, 0x12, 0xd2, 0x01, 0xa3, 0x5b, - 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x0e, 0x02, 0x05, - 0x08, 0x0b, 0x00, 0xf9, 0xf7, 0x19, 0xfc, 0xe2, - 0xe7, 0xfa, 0xf7, 0x9e, 0xfc, 0xdf, 0xe7, 0x00, - 0xf0, 0x39, 0xfd, 0xdc, 0xe7, 0x01, 0xf0, 0x0c, - 0xfa, 0xd9, 0xe7, 0x08, 0x1c, 0x27, 0xf0, 0x02, - 0xf8, 0x04, 0x1c, 0x38, 0x1c, 0x26, 0xf0, 0xd2, - 0xfb, 0x01, 0x1c, 0x0a, 0xa0, 0x22, 0x1c, 0x07, - 0xf0, 0x67, 0xf9, 0xcc, 0xe7, 0xf3, 0xf7, 0x6e, - 0xfc, 0xc9, 0xe7, 0x38, 0x1c, 0x26, 0xf0, 0xc6, - 0xfb, 0x01, 0x1c, 0x13, 0xa0, 0x07, 0xf0, 0x5c, - 0xf9, 0xc1, 0xe7, 0x00, 0x00, 0x88, 0xe5, 0x03, - 0x20, 0x24, 0x7e, 0x03, 0x20, 0x4c, 0x63, 0x49, - 0x72, 0x71, 0x5f, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x52, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x49, 0x72, 0x71, 0x3a, 0x20, 0x69, - 0x6e, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, - 0x25, 0x73, 0x20, 0x69, 0x6c, 0x6c, 0x65, 0x67, - 0x61, 0x6c, 0x20, 0x53, 0x75, 0x62, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, 0x0a, 0x00, - 0x00, 0x4c, 0x63, 0x49, 0x72, 0x71, 0x5f, 0x48, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x78, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x72, - 0x71, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, 0x20, 0x69, - 0x6c, 0x6c, 0x65, 0xed, 0x09, 0x00, 0xdf, 0x00, - 0x67, 0x61, 0x6c, 0x0a, 0x00, 0x00, 0x90, 0xb5, - 0x26, 0x49, 0x49, 0x69, 0xcf, 0x68, 0x10, 0x2f, - 0x1f, 0xd0, 0x08, 0xdc, 0x03, 0x2f, 0x16, 0xd0, - 0x05, 0x2f, 0x11, 0xd0, 0x07, 0x2f, 0x15, 0xd0, - 0x0f, 0x2f, 0x35, 0xd1, 0x15, 0xe0, 0x17, 0x2f, - 0x13, 0xd0, 0x18, 0x2f, 0x11, 0xd0, 0x1a, 0x2f, - 0x12, 0xd0, 0x1c, 0x2f, 0x2c, 0xd1, 0xf3, 0xf7, - 0x10, 0xfc, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x02, 0xf0, 0x95, 0xfd, 0xf9, 0xe7, 0x02, 0xf0, - 0x1a, 0xfd, 0xf6, 0xe7, 0x01, 0xf0, 0xa3, 0xfc, - 0xf3, 0xe7, 0xf8, 0xf7, 0xbe, 0xfe, 0xf0, 0xe7, - 0x13, 0x49, 0x09, 0x68, 0x05, 0x29, 0x0a, 0xd2, - 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, - 0x00, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x03, 0x00, - 0x01, 0xf0, 0x15, 0xfc, 0xe1, 0xe7, 0x08, 0x1c, - 0x26, 0xf0, 0x77, 0xff, 0x04, 0x1c, 0x38, 0x1c, - 0x26, 0xf0, 0x47, 0xfb, 0x01, 0x1c, 0x08, 0xa0, - 0x22, 0x1c, 0x07, 0xf0, 0xdc, 0xf8, 0xd4, 0xe7, - 0x38, 0x1c, 0x26, 0xf0, 0x3e, 0xfb, 0x01, 0x1c, - 0x12, 0xa0, 0x07, 0xf0, 0xd4, 0xf8, 0xcc, 0xe7, - 0x00, 0x00, 0x88, 0xe5, 0x03, 0x20, 0x24, 0x7e, - 0x03, 0x20, 0x4c, 0x63, 0x49, 0x72, 0x71, 0x5f, - 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x78, - 0x53, 0x79, 0x6e, 0x63, 0x49, 0x72, 0x71, 0x3a, - 0x20, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x20, 0x69, 0x6c, 0x6c, - 0x65, 0x67, 0x61, 0x6c, 0x20, 0x53, 0x75, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, - 0x0a, 0x00, 0x4c, 0x63, 0x49, 0x72, 0x71, 0x5f, - 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x78, - 0x53, 0x79, 0x6e, 0x63, 0x49, 0x72, 0x71, 0x3a, - 0x20, 0x69, 0x6e, 0x20, 0x53, 0x74, 0xed, 0x09, - 0x00, 0xe0, 0x00, 0x61, 0x74, 0x65, 0x20, 0x25, - 0x73, 0x20, 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, - 0x6c, 0x0a, 0x00, 0x90, 0xb5, 0x20, 0x49, 0x49, - 0x69, 0xcf, 0x68, 0x08, 0x2f, 0x0a, 0xd0, 0x09, - 0x2f, 0x0b, 0xd0, 0x1a, 0x2f, 0x0c, 0xd0, 0x1c, - 0x2f, 0x2c, 0xd1, 0xf3, 0xf7, 0x98, 0xfb, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0xf0, 0x97, - 0xfd, 0xf9, 0xe7, 0x02, 0xf0, 0xf7, 0xfa, 0xf6, - 0xe7, 0x16, 0x49, 0x09, 0x68, 0x05, 0x29, 0x10, - 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, - 0x44, 0x00, 0x1c, 0x0c, 0x03, 0x06, 0x09, 0x0c, - 0x00, 0xfa, 0xf7, 0x3d, 0xf8, 0xe7, 0xe7, 0xfb, - 0xf7, 0x86, 0xf8, 0xe4, 0xe7, 0x00, 0xf0, 0xd1, - 0xfd, 0xe1, 0xe7, 0x08, 0x1c, 0x26, 0xf0, 0xff, - 0xfe, 0x04, 0x1c, 0x38, 0x1c, 0x26, 0xf0, 0xcf, - 0xfa, 0x01, 0x1c, 0x08, 0xa0, 0x22, 0x1c, 0x07, - 0xf0, 0x64, 0xf8, 0xd4, 0xe7, 0x38, 0x1c, 0x26, - 0xf0, 0xc6, 0xfa, 0x01, 0x1c, 0x12, 0xa0, 0x07, - 0xf0, 0x5c, 0xf8, 0xcc, 0xe7, 0x00, 0x00, 0x88, - 0xe5, 0x03, 0x20, 0x24, 0x7e, 0x03, 0x20, 0x48, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x78, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x3a, 0x20, 0x69, 0x6e, 0x20, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, - 0x20, 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, - 0x20, 0x53, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x48, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x78, 0x50, - 0x61, 0x63, 0x6b, 0x65, 0x74, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x3a, 0x20, 0x69, 0x6e, 0x20, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, - 0x20, 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, - 0x0a, 0xed, 0x09, 0x00, 0xe1, 0x00, 0x00, 0x00, - 0x90, 0xb5, 0x28, 0x49, 0x49, 0x69, 0xcf, 0x68, - 0x14, 0x2f, 0x1d, 0xd0, 0x08, 0xdc, 0x08, 0x2f, - 0x11, 0xd0, 0x09, 0x2f, 0x12, 0xd0, 0x0c, 0x2f, - 0x16, 0xd0, 0x11, 0x2f, 0x39, 0xd1, 0x10, 0xe0, - 0x19, 0x2f, 0x0e, 0xd0, 0x1a, 0x2f, 0x12, 0xd0, - 0x1c, 0x2f, 0x32, 0xd1, 0xf3, 0xf7, 0x16, 0xfb, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0xf0, - 0x31, 0xfe, 0xf9, 0xe7, 0x02, 0xf0, 0x6e, 0xfa, - 0xf6, 0xe7, 0xf9, 0xf7, 0x19, 0xf9, 0xf3, 0xe7, - 0xf8, 0xf7, 0x68, 0xfd, 0xf0, 0xe7, 0x16, 0x49, - 0x09, 0x68, 0x05, 0x29, 0x10, 0xd2, 0x02, 0xa3, - 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, - 0x0c, 0x03, 0x06, 0x09, 0x0c, 0x00, 0xfa, 0xf7, - 0x6f, 0xf9, 0xe1, 0xe7, 0xfb, 0xf7, 0x36, 0xfb, - 0xde, 0xe7, 0x00, 0xf0, 0x67, 0xfe, 0xdb, 0xe7, - 0x08, 0x1c, 0x26, 0xf0, 0x77, 0xfe, 0x04, 0x1c, - 0x38, 0x1c, 0x26, 0xf0, 0x47, 0xfa, 0x01, 0x1c, - 0x08, 0xa0, 0x22, 0x1c, 0x06, 0xf0, 0xdc, 0xff, - 0xce, 0xe7, 0x38, 0x1c, 0x26, 0xf0, 0x3e, 0xfa, - 0x01, 0x1c, 0x12, 0xa0, 0x06, 0xf0, 0xd4, 0xff, - 0xc6, 0xe7, 0x00, 0x00, 0x88, 0xe5, 0x03, 0x20, - 0x24, 0x7e, 0x03, 0x20, 0x4c, 0x63, 0x49, 0x72, - 0x71, 0x5f, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x52, 0x78, 0x45, 0x6e, 0x64, 0x49, 0x72, 0x71, - 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x20, 0x25, 0x73, 0x20, 0x69, 0x6c, - 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, 0x53, 0x75, - 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, - 0x73, 0x0a, 0x00, 0x00, 0x4c, 0x63, 0x49, 0x72, - 0x71, 0x5f, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x52, 0x78, 0x45, 0x6e, 0x64, 0x49, 0x72, 0x71, - 0x3a, 0x20, 0x69, 0x6e, 0xed, 0x09, 0x00, 0xe2, - 0x00, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, - 0x25, 0x73, 0x20, 0x69, 0x6c, 0x6c, 0x65, 0x67, - 0x61, 0x6c, 0x0a, 0x00, 0x00, 0x90, 0xb5, 0x24, - 0x49, 0x49, 0x69, 0xcf, 0x68, 0x14, 0x2f, 0x06, - 0xd0, 0x0a, 0xdc, 0x08, 0x2f, 0x0f, 0xd0, 0x09, - 0x2f, 0x10, 0xd0, 0x0c, 0x2f, 0x33, 0xd1, 0xf8, - 0xf7, 0x47, 0xfd, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x1a, 0x2f, 0x0a, 0xd0, 0x1c, 0x2f, 0x2a, - 0xd1, 0xf3, 0xf7, 0x8e, 0xfa, 0xf5, 0xe7, 0x01, - 0xf0, 0x9b, 0xfd, 0xf2, 0xe7, 0x02, 0xf0, 0xe9, - 0xf9, 0xef, 0xe7, 0x16, 0x49, 0x09, 0x68, 0x05, - 0x29, 0x10, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x0c, 0x03, 0x06, - 0x09, 0x0c, 0x00, 0xfa, 0xf7, 0x9f, 0xf8, 0xe0, - 0xe7, 0xfb, 0xf7, 0x7a, 0xfa, 0xdd, 0xe7, 0x00, - 0xf0, 0xbd, 0xfd, 0xda, 0xe7, 0x08, 0x1c, 0x26, - 0xf0, 0xf7, 0xfd, 0x04, 0x1c, 0x38, 0x1c, 0x26, - 0xf0, 0xc7, 0xf9, 0x01, 0x1c, 0x08, 0xa0, 0x22, - 0x1c, 0x06, 0xf0, 0x5c, 0xff, 0xcd, 0xe7, 0x38, - 0x1c, 0x26, 0xf0, 0xbe, 0xf9, 0x01, 0x1c, 0x13, - 0xa0, 0x06, 0xf0, 0x54, 0xff, 0xc5, 0xe7, 0x00, - 0x00, 0x88, 0xe5, 0x03, 0x20, 0x24, 0x7e, 0x03, - 0x20, 0x4c, 0x63, 0x49, 0x72, 0x71, 0x5f, 0x48, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x78, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x49, 0x72, 0x71, 0x3a, - 0x20, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x20, 0x69, 0x6c, 0x6c, - 0x65, 0x67, 0x61, 0x6c, 0x20, 0x53, 0x75, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x63, 0x49, - 0x72, 0x71, 0x5f, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x52, 0x78, 0x45, 0x72, 0x72, 0x6f, 0xed, - 0x09, 0x00, 0xe3, 0x00, 0x72, 0x49, 0x72, 0x71, - 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x20, 0x25, 0x73, 0x20, 0x69, 0x6c, - 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x90, 0xb5, 0x26, 0x49, 0x49, 0x69, - 0xcf, 0x68, 0x14, 0x2f, 0x1f, 0xd0, 0x10, 0xdc, - 0x09, 0x2f, 0x19, 0xd0, 0x08, 0xdc, 0x03, 0x2f, - 0x01, 0xd0, 0x05, 0x2f, 0x36, 0xd1, 0xf7, 0xf7, - 0x08, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x0c, 0x2f, 0x10, 0xd0, 0x0f, 0x2f, 0x2d, 0xd1, - 0x0d, 0xe0, 0x17, 0x2f, 0x0b, 0xd0, 0x1a, 0x2f, - 0x0c, 0xd0, 0x1b, 0x2f, 0x0a, 0xd0, 0x1c, 0x2f, - 0x24, 0xd1, 0xf3, 0xf7, 0x46, 0xfd, 0xec, 0xe7, - 0x02, 0xf0, 0xe1, 0xfa, 0xe9, 0xe7, 0xf8, 0xf7, - 0x76, 0xf8, 0xe6, 0xe7, 0x13, 0x49, 0x09, 0x68, - 0x05, 0x29, 0x0a, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, - 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x06, 0x06, - 0x06, 0x03, 0x06, 0x00, 0x00, 0xf0, 0x27, 0xfc, - 0xd7, 0xe7, 0x08, 0x1c, 0x26, 0xf0, 0x6f, 0xfd, - 0x04, 0x1c, 0x38, 0x1c, 0x26, 0xf0, 0x3f, 0xf9, - 0x01, 0x1c, 0x08, 0xa0, 0x22, 0x1c, 0x06, 0xf0, - 0xd4, 0xfe, 0xca, 0xe7, 0x38, 0x1c, 0x26, 0xf0, - 0x36, 0xf9, 0x01, 0x1c, 0x12, 0xa0, 0x06, 0xf0, - 0xcc, 0xfe, 0xc2, 0xe7, 0x00, 0x00, 0x88, 0xe5, - 0x03, 0x20, 0x24, 0x7e, 0x03, 0x20, 0x4c, 0x63, - 0x49, 0x72, 0x71, 0x5f, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x54, 0x78, 0x45, 0x6e, 0x64, 0x49, - 0x72, 0x71, 0x3a, 0x20, 0x69, 0x6e, 0x20, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, 0x20, - 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, - 0x53, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x4c, 0x63, - 0x49, 0x72, 0xed, 0x09, 0x00, 0xe4, 0x00, 0x71, - 0x5f, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x54, - 0x78, 0x45, 0x6e, 0x64, 0x49, 0x72, 0x71, 0x3a, - 0x20, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x20, 0x69, 0x6c, 0x6c, - 0x65, 0x67, 0x61, 0x6c, 0x0a, 0x00, 0x00, 0x80, - 0xb5, 0x13, 0x49, 0x4f, 0x69, 0xf9, 0x68, 0x1e, - 0x29, 0x17, 0xd2, 0x01, 0xa3, 0x5b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x13, 0x13, 0x13, 0x0e, 0x13, - 0x0e, 0x13, 0x0e, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0xf7, 0xf7, 0x25, 0xfe, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x08, 0x1c, 0x26, 0xf0, 0xd9, - 0xf8, 0x01, 0x1c, 0x03, 0xa0, 0x3a, 0x68, 0x06, - 0xf0, 0x6e, 0xfe, 0xf3, 0xe7, 0x00, 0x00, 0x88, - 0xe5, 0x03, 0x20, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x52, - 0x65, 0x61, 0x64, 0x49, 0x72, 0x71, 0x3a, 0x20, - 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x64, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, - 0x25, 0x73, 0x20, 0x50, 0x69, 0x63, 0x6f, 0x6e, - 0x65, 0x74, 0x20, 0x25, 0x75, 0x0a, 0x00, 0xf0, - 0xb5, 0x87, 0xb0, 0x07, 0x1c, 0x54, 0x48, 0x54, - 0x4b, 0x01, 0x68, 0x02, 0x31, 0x01, 0x60, 0x41, - 0x68, 0xc9, 0x18, 0x41, 0x60, 0x78, 0x68, 0x01, - 0x21, 0xf5, 0xf7, 0xa5, 0xff, 0xfe, 0x1d, 0xb9, - 0x36, 0x04, 0x90, 0x11, 0xce, 0xf9, 0x1d, 0x79, - 0x31, 0xe0, 0x65, 0x06, 0x91, 0xc8, 0x6b, 0x08, - 0x3e, 0x20, 0x64, 0xf8, 0x6c, 0xe0, 0x64, 0x38, - 0x6d, 0x20, 0x65, 0x00, 0x20, 0x60, 0x65, 0xa0, - 0x65, 0x20, 0x66, 0xa0, 0x66, 0x60, 0x67, 0xa0, - 0x67, 0xf9, 0x6f, 0xbc, 0x42, 0xed, 0x09, 0x00, - 0xe5, 0x00, 0xe1, 0x67, 0x00, 0xd0, 0xf8, 0x67, - 0xe1, 0x1d, 0x79, 0x31, 0x05, 0x91, 0x00, 0x20, - 0x48, 0x60, 0xc8, 0x60, 0x60, 0x64, 0xb0, 0x6b, - 0xe5, 0x1d, 0xb9, 0x35, 0xa8, 0x63, 0xf9, 0x1d, - 0xe1, 0x31, 0x0c, 0xc9, 0xe0, 0x1d, 0xe1, 0x30, - 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0xa8, 0x6b, - 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0xfa, 0xf7, - 0xdb, 0xf8, 0xb0, 0x68, 0xa8, 0x60, 0xf0, 0x68, - 0xe8, 0x60, 0x30, 0x69, 0x28, 0x61, 0x70, 0x69, - 0x68, 0x61, 0xb0, 0x69, 0xa8, 0x61, 0x30, 0x6a, - 0x28, 0x62, 0x01, 0x20, 0xa0, 0x64, 0x06, 0x99, - 0x00, 0x20, 0x48, 0x61, 0xf8, 0x60, 0x2d, 0x49, - 0x65, 0x68, 0x08, 0x1c, 0x0c, 0xc9, 0xee, 0x1d, - 0x51, 0x36, 0x0c, 0xc6, 0x48, 0xc8, 0xe9, 0x1d, - 0x35, 0x31, 0x48, 0xc1, 0x02, 0x20, 0x28, 0x61, - 0x1a, 0x20, 0xe8, 0x60, 0x05, 0x20, 0xe0, 0x60, - 0x05, 0x99, 0x00, 0x20, 0x48, 0x61, 0x05, 0x99, - 0x88, 0x61, 0x20, 0x1c, 0xfe, 0xf7, 0x49, 0xfc, - 0xf2, 0xf7, 0xd1, 0xfb, 0x00, 0x28, 0x0f, 0xd0, - 0x41, 0x21, 0x01, 0x60, 0x61, 0x68, 0x49, 0x68, - 0x01, 0x61, 0x21, 0x7e, 0xc1, 0x60, 0x61, 0x68, - 0x81, 0x61, 0x44, 0x61, 0x08, 0x21, 0xc1, 0x61, - 0x01, 0x1c, 0x0e, 0x20, 0xf2, 0xf7, 0x2e, 0xfc, - 0x04, 0x98, 0x01, 0x28, 0x0d, 0xd9, 0x02, 0x21, - 0x38, 0x1c, 0xf4, 0xf7, 0x49, 0xf9, 0x02, 0x23, - 0x1a, 0x22, 0x28, 0x1c, 0x21, 0x1c, 0xf4, 0xf7, - 0x51, 0xf8, 0x07, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x78, 0x68, 0xa8, 0x42, 0x05, 0xd0, - 0x02, 0x23, 0x1a, 0x22, 0x28, 0x1c, 0x21, 0x1c, - 0xf4, 0xf7, 0x44, 0xf8, 0x01, 0x22, 0x03, 0x92, - 0x01, 0x21, 0x02, 0x91, 0x02, 0x22, 0x1a, 0x20, - 0x00, 0x92, 0x01, 0x90, 0x29, 0x1c, 0x02, 0x23, - 0xed, 0x09, 0x00, 0xe6, 0x00, 0x22, 0x1c, 0x78, - 0x68, 0xf4, 0xf7, 0x66, 0xf9, 0xe3, 0xe7, 0x00, - 0x00, 0x68, 0x14, 0x04, 0x20, 0xe2, 0x04, 0x00, - 0x00, 0x88, 0xe6, 0x03, 0x20, 0xf0, 0xb5, 0x88, - 0xb0, 0x07, 0x1c, 0x72, 0x48, 0xf9, 0x1d, 0x06, - 0x68, 0xf8, 0x1d, 0x79, 0x30, 0x07, 0x90, 0x80, - 0x69, 0x99, 0x31, 0x40, 0x68, 0x09, 0x7b, 0xff, - 0x23, 0x35, 0x33, 0x59, 0x43, 0x40, 0x18, 0xc4, - 0x1d, 0xff, 0x34, 0x92, 0x34, 0xe1, 0x1d, 0xb9, - 0x31, 0x06, 0x91, 0x4f, 0x60, 0xf8, 0x6d, 0x08, - 0x60, 0xe1, 0x1d, 0x79, 0x31, 0x38, 0x6c, 0x05, - 0x91, 0xc8, 0x63, 0x01, 0x20, 0xf8, 0x60, 0x65, - 0x68, 0x07, 0x98, 0x00, 0x21, 0x41, 0x61, 0xf9, - 0x1d, 0x9d, 0x31, 0x0c, 0xc9, 0xe0, 0x1d, 0x09, - 0x30, 0x0c, 0xc0, 0xf8, 0x6c, 0x00, 0x21, 0xe0, - 0x64, 0x38, 0x6d, 0x20, 0x65, 0x54, 0x34, 0x00, - 0x20, 0x03, 0xc4, 0x03, 0xc4, 0x64, 0x3c, 0xa0, - 0x66, 0x60, 0x67, 0xa0, 0x67, 0xf8, 0x6f, 0xbc, - 0x42, 0xe0, 0x67, 0x01, 0xd0, 0x00, 0x20, 0xf8, - 0x67, 0x05, 0x99, 0x00, 0x20, 0x48, 0x60, 0x05, - 0x99, 0xc8, 0x60, 0x20, 0x64, 0x60, 0x64, 0xf8, - 0x1d, 0xb9, 0x30, 0x04, 0x90, 0x80, 0x6b, 0x06, - 0x99, 0x88, 0x63, 0xf9, 0x1d, 0xe1, 0x31, 0x0c, - 0xc9, 0xe0, 0x1d, 0xe1, 0x30, 0x0c, 0xc0, 0x0c, - 0xc9, 0x0c, 0xc0, 0x06, 0x99, 0x88, 0x6b, 0x00, - 0x28, 0x02, 0xd0, 0x20, 0x1c, 0xfa, 0xf7, 0x12, - 0xf8, 0x07, 0x98, 0x01, 0x6a, 0x30, 0x1c, 0x02, - 0xf0, 0xcf, 0xfc, 0xee, 0x1d, 0x25, 0x36, 0x44, - 0x4a, 0xf2, 0xf7, 0xde, 0xf8, 0x03, 0xc6, 0x07, - 0x98, 0x42, 0x49, 0xc0, 0x69, 0x08, 0x3e, 0x0a, - 0x1a, 0x07, 0x98, 0xc2, 0x61, 0x03, 0xce, 0x08, - 0x3e, 0x02, 0xf0, 0xf2, 0xfb, 0x03, 0xc6, 0x08, - 0x3e, 0x02, 0xf0, 0xed, 0x09, 0x00, 0xe7, 0x00, - 0xc2, 0xfc, 0x3c, 0xa3, 0x1a, 0x68, 0x5b, 0x68, - 0x02, 0xf0, 0xc5, 0xfc, 0xe9, 0x1d, 0xff, 0x31, - 0x7a, 0x31, 0x08, 0x60, 0x07, 0x98, 0x39, 0xa1, - 0x00, 0x6a, 0x28, 0x62, 0x07, 0x98, 0x00, 0x6a, - 0x68, 0x61, 0x0c, 0xc9, 0xe8, 0x1d, 0x11, 0x30, - 0x0c, 0xc0, 0x0c, 0xce, 0xe8, 0x1d, 0x1d, 0x30, - 0x0c, 0xc0, 0x00, 0x20, 0xf9, 0x1d, 0xad, 0x31, - 0x68, 0x63, 0x08, 0x1c, 0x0c, 0xc9, 0xee, 0x1d, - 0x51, 0x36, 0x0c, 0xc6, 0xe9, 0x1d, 0x60, 0xc8, - 0x35, 0x31, 0x60, 0xc1, 0x05, 0x20, 0xe0, 0x60, - 0x61, 0x68, 0x02, 0x20, 0x08, 0x61, 0x61, 0x68, - 0x1a, 0x20, 0xc8, 0x60, 0x05, 0x99, 0x04, 0x20, - 0x48, 0x61, 0x07, 0x98, 0xfd, 0x1d, 0x00, 0x6b, - 0x05, 0x99, 0xf5, 0x35, 0x08, 0x63, 0x04, 0x98, - 0x80, 0x68, 0x06, 0x99, 0x88, 0x60, 0x04, 0x98, - 0xc0, 0x68, 0x06, 0x99, 0xc8, 0x60, 0x04, 0x98, - 0x00, 0x69, 0x06, 0x99, 0x08, 0x61, 0x04, 0x98, - 0x40, 0x69, 0x06, 0x99, 0x48, 0x61, 0x04, 0x98, - 0x80, 0x69, 0x06, 0x99, 0x88, 0x61, 0x04, 0x98, - 0x00, 0x6a, 0x06, 0x99, 0x08, 0x62, 0x4e, 0xcd, - 0xe0, 0x1d, 0xf5, 0x30, 0x4e, 0xc0, 0x48, 0xcd, - 0x48, 0xc0, 0xe1, 0x1d, 0xf9, 0x31, 0x00, 0x20, - 0x08, 0x60, 0x20, 0x1c, 0xfe, 0xf7, 0x36, 0xfb, - 0x78, 0x68, 0xf5, 0xf7, 0x45, 0xfe, 0x01, 0x28, - 0x01, 0xd1, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, - 0x00, 0x22, 0x03, 0x92, 0x02, 0x22, 0x1a, 0x20, - 0x00, 0x92, 0x01, 0x90, 0x02, 0x91, 0x61, 0x68, - 0x02, 0x23, 0x22, 0x1c, 0x78, 0x68, 0xf4, 0xf7, - 0x7a, 0xf8, 0x08, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x68, 0x14, 0x04, 0x20, 0x71, 0x02, - 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x71, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xb5, 0x0b, 0x48, 0x0b, - 0x4b, 0x02, 0x68, 0x41, 0x69, 0x02, 0x32, 0x02, - 0x60, 0x42, 0x68, 0xd2, 0x18, 0x42, 0x60, 0x20, - 0x20, 0x80, 0x31, 0x08, 0x63, 0x07, 0x4a, 0x03, - 0x20, 0x10, 0x60, 0x02, 0x20, 0x48, 0x61, 0x58, - 0x07, 0x00, 0xf0, 0x55, 0xf8, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x68, 0x14, 0x04, 0x20, 0xe2, - 0x04, 0x00, 0x00, 0x24, 0x7e, 0x03, 0x20, 0xb0, - 0xb5, 0x21, 0x4f, 0x21, 0x4b, 0x38, 0x68, 0x7c, - 0x69, 0x06, 0x30, 0x38, 0x60, 0x78, 0x68, 0xc0, - 0x18, 0x78, 0x60, 0x1e, 0x48, 0x81, 0x68, 0x01, - 0x23, 0x9b, 0x02, 0x99, 0x43, 0x81, 0x60, 0xf2, - 0xf7, 0x69, 0xfa, 0x00, 0x28, 0x13, 0xd0, 0x41, - 0x21, 0x01, 0x60, 0x79, 0x69, 0x49, 0x68, 0x81, - 0x61, 0x79, 0x69, 0x41, 0x61, 0x79, 0x69, 0x49, - 0x68, 0x49, 0x68, 0x01, 0x61, 0x79, 0x69, 0x09, - 0x7e, 0xc1, 0x60, 0x08, 0x21, 0xc1, 0x61, 0x01, - 0x1c, 0x0e, 0x20, 0xf2, 0xf7, 0xc2, 0xfa, 0xe7, - 0x1d, 0x79, 0x37, 0x00, 0x25, 0x7d, 0x61, 0xb8, - 0x69, 0x00, 0x28, 0x08, 0xd0, 0x61, 0x68, 0x40, - 0x68, 0x81, 0x42, 0x04, 0xd0, 0x01, 0x23, 0x01, - 0x22, 0x00, 0x21, 0xf4, 0xf7, 0x0a, 0xf9, 0x08, - 0x49, 0x01, 0x20, 0xbd, 0x61, 0x08, 0x60, 0x01, - 0x20, 0x80, 0x07, 0xf8, 0xf7, 0xe6, 0xfe, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x68, - 0x14, 0x04, 0x20, 0xa6, 0x0e, 0x00, 0x00, 0x00, - 0x50, 0x00, 0xe0, 0x24, 0x7e, 0x03, 0x20, 0xf0, - 0xb5, 0x87, 0xb0, 0x05, 0x1c, 0xaf, 0x48, 0xaf, - 0x4b, 0x01, 0x68, 0x04, 0x31, 0x05, 0x91, 0x41, - 0x68, 0x44, 0x69, 0xcf, 0x18, 0x00, 0x2d, 0x0e, - 0xd0, 0x60, 0x6e, 0x00, 0x28, 0x03, 0xd0, 0x01, - 0x21, 0xed, 0x09, 0x00, 0xe9, 0x00, 0x20, 0x1c, - 0xfe, 0xf7, 0xca, 0xfa, 0x68, 0x08, 0x05, 0xd3, - 0xff, 0xf7, 0x9c, 0xff, 0x07, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xe0, 0x1d, 0x79, 0x30, - 0x01, 0x6b, 0x01, 0x39, 0x01, 0x63, 0x02, 0xd1, - 0xff, 0xf7, 0x90, 0xff, 0xf2, 0xe7, 0xa0, 0x49, - 0xff, 0x22, 0x38, 0x1c, 0x09, 0x69, 0xb9, 0x32, - 0xf6, 0xf7, 0x24, 0xfa, 0x00, 0x28, 0x04, 0xd1, - 0x9c, 0x4b, 0x05, 0x98, 0xff, 0x18, 0x04, 0x30, - 0x05, 0x90, 0x60, 0x68, 0xc1, 0x1d, 0x79, 0x31, - 0xca, 0x69, 0xff, 0x30, 0x81, 0x30, 0xa1, 0x6a, - 0x83, 0x68, 0x03, 0x92, 0x18, 0x0e, 0x1a, 0x02, - 0x12, 0x0a, 0x00, 0x92, 0x00, 0x22, 0x1a, 0x23, - 0x01, 0x90, 0x02, 0x91, 0x00, 0x21, 0x05, 0x98, - 0xf6, 0xf7, 0x14, 0xfc, 0x04, 0x90, 0x60, 0x68, - 0xff, 0x30, 0x81, 0x30, 0x80, 0x68, 0x05, 0x99, - 0x00, 0x0e, 0x49, 0x08, 0x06, 0x91, 0x09, 0x02, - 0x08, 0x43, 0x8b, 0x49, 0x48, 0x60, 0xe6, 0x1d, - 0xb9, 0x36, 0xb2, 0x68, 0x89, 0x4d, 0x03, 0x92, - 0x69, 0x69, 0x38, 0x1c, 0x01, 0x29, 0x73, 0xd0, - 0x02, 0x29, 0x22, 0xd1, 0x09, 0x21, 0x02, 0xf0, - 0x85, 0xfa, 0xc8, 0x22, 0x02, 0xf0, 0x8c, 0xfa, - 0x34, 0x22, 0x02, 0xf0, 0x89, 0xfa, 0x50, 0x22, - 0x02, 0xf0, 0x86, 0xfa, 0x0d, 0x22, 0x02, 0xf0, - 0x83, 0xfa, 0x04, 0x22, 0x02, 0xf0, 0x80, 0xfa, - 0x28, 0x22, 0x02, 0xf0, 0x7d, 0xfa, 0x04, 0x99, - 0x02, 0x31, 0x09, 0x02, 0x10, 0x22, 0x0a, 0x43, - 0x79, 0x49, 0x0a, 0x62, 0x03, 0x9a, 0x42, 0x23, - 0x1a, 0x43, 0x12, 0x02, 0x11, 0x23, 0x1a, 0x43, - 0x4a, 0x62, 0x76, 0x4a, 0x76, 0x49, 0x0a, 0x62, - 0x08, 0x60, 0xb1, 0x68, 0x6a, 0x69, 0x75, 0x48, - 0x01, 0x2a, 0x65, 0xd0, 0x02, 0x2a, 0x05, 0xd1, - 0x40, 0x23, 0x19, 0x43, 0xed, 0x09, 0x00, 0xea, - 0x00, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x01, - 0x62, 0xf9, 0x1d, 0x49, 0x31, 0xff, 0x22, 0x6f, - 0x48, 0x02, 0x32, 0x02, 0x62, 0x01, 0x60, 0x6e, - 0x4a, 0xb1, 0x68, 0x10, 0x6a, 0x52, 0x6a, 0x00, - 0x0a, 0xff, 0x23, 0x1b, 0x02, 0x1a, 0x40, 0x10, - 0x43, 0x6a, 0x69, 0x01, 0x2a, 0x6d, 0xd0, 0x02, - 0x2a, 0x07, 0xd1, 0xd2, 0x03, 0x01, 0x0c, 0x00, - 0xd2, 0x00, 0x22, 0x10, 0x43, 0x01, 0x23, 0xdb, - 0x03, 0x98, 0x43, 0x30, 0x62, 0x69, 0x69, 0x38, - 0x1c, 0x01, 0x29, 0x5f, 0xd0, 0x02, 0x29, 0x05, - 0xd1, 0x5f, 0x49, 0x2d, 0x22, 0x0a, 0x62, 0x2c, - 0x22, 0x4a, 0x62, 0x3c, 0x38, 0x5d, 0x4a, 0x5e, - 0x49, 0x0a, 0x62, 0x08, 0x60, 0x5d, 0x4a, 0xb1, - 0x68, 0x10, 0x6a, 0x52, 0x6a, 0x00, 0x0a, 0xff, - 0x23, 0x1b, 0x02, 0x1a, 0x40, 0x10, 0x43, 0x6a, - 0x69, 0x01, 0x2a, 0x5d, 0xd0, 0x02, 0x2a, 0x09, - 0xd1, 0xd2, 0x03, 0x00, 0xe0, 0x1f, 0xe0, 0x01, - 0x0c, 0x00, 0xd2, 0x00, 0x22, 0x10, 0x43, 0x01, - 0x23, 0xdb, 0x03, 0x98, 0x43, 0xf0, 0x61, 0x68, - 0x69, 0x01, 0x28, 0x54, 0xd0, 0x02, 0x28, 0x04, - 0xd1, 0x4e, 0x48, 0x2d, 0x22, 0x02, 0x62, 0x2c, - 0x22, 0x42, 0x62, 0x4a, 0x4a, 0x4c, 0x49, 0xf8, - 0x1d, 0x21, 0x30, 0x0a, 0x62, 0x08, 0x60, 0xb6, - 0x6b, 0xe1, 0x6a, 0x38, 0x1c, 0x00, 0x29, 0x48, - 0xd0, 0x05, 0x24, 0x47, 0xe0, 0x23, 0xe0, 0x10, - 0x21, 0x02, 0xf0, 0xf2, 0xf9, 0xff, 0x22, 0x05, - 0x32, 0x02, 0xf0, 0xf8, 0xf9, 0x46, 0x22, 0x02, - 0xf0, 0xf5, 0xf9, 0x0d, 0x22, 0x02, 0xf0, 0xf2, - 0xf9, 0x04, 0x22, 0x02, 0xf0, 0xef, 0xf9, 0x28, - 0x22, 0x02, 0xf0, 0xec, 0xf9, 0x04, 0x99, 0x02, - 0x31, 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0x31, - 0x49, 0x0a, 0x62, 0x03, 0x9a, 0x82, 0x23, 0xed, - 0x09, 0x00, 0xeb, 0x00, 0x1a, 0x43, 0x12, 0x02, - 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x6d, 0xe7, - 0x07, 0xe0, 0x0d, 0xe0, 0x80, 0x23, 0x19, 0x43, - 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x01, 0x62, - 0x75, 0xe7, 0x01, 0x22, 0x12, 0x04, 0x00, 0x29, - 0x00, 0xd1, 0x00, 0x22, 0x10, 0x43, 0x8b, 0xe7, - 0x29, 0x49, 0x3d, 0x22, 0x0a, 0x62, 0x3e, 0x22, - 0x4a, 0x62, 0x46, 0x38, 0x91, 0xe7, 0x01, 0x22, - 0x12, 0x04, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x22, - 0x10, 0x43, 0xa6, 0xe7, 0x25, 0x48, 0x3d, 0x22, - 0x02, 0x62, 0x3e, 0x22, 0x42, 0x62, 0xab, 0xe7, - 0x01, 0x24, 0x69, 0x69, 0x01, 0x29, 0x1b, 0xd0, - 0x02, 0x29, 0x02, 0xd1, 0x09, 0x21, 0x02, 0xf0, - 0xa6, 0xf9, 0xc2, 0x1f, 0x13, 0x49, 0x21, 0x3a, - 0x8a, 0x60, 0xb0, 0x30, 0xc8, 0x60, 0x01, 0x2e, - 0x01, 0xd0, 0x03, 0x2e, 0x04, 0xd1, 0x06, 0x98, - 0x1a, 0x4a, 0x08, 0x23, 0x1c, 0x43, 0x10, 0x60, - 0x32, 0x20, 0x0c, 0x60, 0x02, 0xf0, 0x35, 0xff, - 0x05, 0x98, 0x05, 0x49, 0x81, 0xc1, 0xbe, 0xe6, - 0x10, 0x21, 0x02, 0xf0, 0x8c, 0xf9, 0x02, 0xaa, - 0x03, 0xc2, 0x02, 0x98, 0x03, 0x99, 0xe0, 0xe7, - 0x00, 0x00, 0x68, 0x14, 0x04, 0x20, 0xc4, 0x09, - 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, 0x88, 0x13, - 0x00, 0x00, 0x00, 0x51, 0x00, 0xe0, 0x48, 0xe6, - 0x03, 0x20, 0xa0, 0x55, 0x00, 0xe0, 0x02, 0x05, - 0x00, 0x00, 0x08, 0x53, 0x00, 0xe0, 0xb0, 0x55, - 0x00, 0xe0, 0x0c, 0x53, 0x00, 0xe0, 0xd0, 0x55, - 0x00, 0xe0, 0x02, 0x03, 0x00, 0x00, 0x14, 0x53, - 0x00, 0xe0, 0xc0, 0x55, 0x00, 0xe0, 0x10, 0x53, - 0x00, 0xe0, 0x80, 0x55, 0x00, 0xe0, 0x00, 0xb5, - 0x0a, 0x48, 0x01, 0x22, 0x41, 0x69, 0x09, 0x48, - 0x92, 0x02, 0xc2, 0x60, 0x82, 0x68, 0x01, 0x23, - 0x9b, 0x02, 0xed, 0x09, 0x00, 0xec, 0x00, 0x9a, - 0x43, 0x82, 0x60, 0xca, 0x1d, 0x79, 0x32, 0x04, - 0x20, 0x50, 0x61, 0x08, 0x1c, 0xff, 0xf7, 0x09, - 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x68, - 0x14, 0x04, 0x20, 0x00, 0x50, 0x00, 0xe0, 0xf0, - 0xb5, 0x89, 0xb0, 0x6d, 0x48, 0x6e, 0x4b, 0x01, - 0x68, 0x44, 0x69, 0x0a, 0x1d, 0x41, 0x68, 0x6c, - 0x48, 0xc9, 0x18, 0x5b, 0x08, 0xcf, 0x1a, 0x80, - 0x6a, 0x95, 0x1e, 0x41, 0x07, 0x49, 0x0f, 0x04, - 0xab, 0x19, 0x70, 0x41, 0x06, 0x09, 0x0f, 0x05, - 0x91, 0x01, 0x06, 0xc9, 0x0f, 0x59, 0x70, 0xc1, - 0x05, 0xc9, 0x0f, 0x80, 0x05, 0xc0, 0x0f, 0x99, - 0x70, 0xd8, 0x70, 0x05, 0x98, 0x02, 0x28, 0x06, - 0xd0, 0x00, 0x20, 0xff, 0xf7, 0x3e, 0xfe, 0x09, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0x68, 0xc1, 0x1d, 0x79, 0x31, 0xca, 0x69, 0xff, - 0x30, 0x81, 0x30, 0xa1, 0x6a, 0x83, 0x68, 0x03, - 0x92, 0x18, 0x0e, 0x1a, 0x02, 0x12, 0x0a, 0x00, - 0x92, 0x02, 0x91, 0x00, 0x21, 0x00, 0x22, 0x1a, - 0x23, 0x01, 0x90, 0x28, 0x1c, 0xf6, 0xf7, 0x81, - 0xfa, 0x06, 0x90, 0xe0, 0x1d, 0xb9, 0x30, 0x08, - 0x90, 0x41, 0x69, 0x05, 0x69, 0xc6, 0x68, 0x4f, - 0x48, 0x03, 0x91, 0x07, 0x90, 0x40, 0x69, 0x01, - 0x28, 0x5e, 0xd0, 0x02, 0x28, 0x2a, 0xd1, 0x4c, - 0x49, 0x03, 0x20, 0xc8, 0x62, 0x06, 0x21, 0x38, - 0x1c, 0x02, 0xf0, 0x09, 0xf9, 0xc8, 0x22, 0x02, - 0xf0, 0xfe, 0xf8, 0x6a, 0x00, 0x02, 0xf0, 0xfb, - 0xf8, 0x28, 0x22, 0x02, 0xf0, 0xf8, 0xf8, 0x03, - 0x22, 0x02, 0xf0, 0x05, 0xf9, 0x06, 0x99, 0x42, - 0x4a, 0x02, 0x31, 0x09, 0x02, 0x10, 0x23, 0x19, - 0x43, 0x11, 0x62, 0xf1, 0x00, 0x44, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x51, - 0x62, 0x03, 0x99, 0x09, 0x02, 0xed, 0x09, 0x00, - 0xed, 0x00, 0x16, 0x23, 0x19, 0x43, 0x91, 0x62, - 0x3a, 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, 0x02, - 0x08, 0x62, 0x08, 0x98, 0xc1, 0x68, 0x07, 0x98, - 0x42, 0x69, 0x37, 0x48, 0x01, 0x2a, 0x53, 0xd0, - 0x02, 0x2a, 0x06, 0xd1, 0xc9, 0x00, 0x40, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, - 0x01, 0x62, 0xf8, 0x1d, 0x5d, 0x30, 0xff, 0x22, - 0x30, 0x49, 0x02, 0x32, 0x0a, 0x62, 0x08, 0x60, - 0xe0, 0x1d, 0x79, 0x30, 0x03, 0x25, 0x45, 0x61, - 0x07, 0x99, 0x38, 0x1c, 0x49, 0x69, 0x01, 0x29, - 0x42, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x06, 0x21, - 0x02, 0xf0, 0xc0, 0xf8, 0x28, 0x49, 0x88, 0x60, - 0x0d, 0x60, 0x01, 0x21, 0x27, 0x48, 0x89, 0x02, - 0xc1, 0x60, 0x81, 0x68, 0x01, 0x23, 0x9b, 0x02, - 0x19, 0x43, 0x81, 0x60, 0x7a, 0xe7, 0x06, 0x21, - 0x38, 0x1c, 0x02, 0xf0, 0xaf, 0xf8, 0xff, 0x22, - 0x05, 0x32, 0x02, 0xf0, 0xa3, 0xf8, 0x6a, 0x00, - 0x02, 0xf0, 0xa0, 0xf8, 0x28, 0x22, 0x02, 0xf0, - 0x9d, 0xf8, 0x03, 0x22, 0x02, 0xf0, 0xaa, 0xf8, - 0x06, 0x99, 0x02, 0x31, 0x09, 0x02, 0x20, 0x22, - 0x0a, 0x43, 0x13, 0x49, 0x0a, 0x62, 0xf2, 0x00, - 0x84, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, 0x23, - 0x1a, 0x43, 0x4a, 0x62, 0x03, 0x9a, 0x12, 0x02, - 0x19, 0x23, 0x1a, 0x43, 0x8a, 0x62, 0x0d, 0x49, - 0x08, 0x60, 0x11, 0x48, 0x08, 0x62, 0xa4, 0xe7, - 0xc9, 0x00, 0x80, 0x23, 0x19, 0x43, 0x09, 0x02, - 0x10, 0x23, 0x19, 0x43, 0x01, 0x62, 0xac, 0xe7, - 0x06, 0x21, 0x02, 0xf0, 0x7f, 0xf8, 0xbd, 0xe7, - 0x68, 0x14, 0x04, 0x20, 0xc4, 0x09, 0x00, 0x00, - 0x40, 0x55, 0x00, 0xe0, 0x48, 0xe6, 0x03, 0x20, - 0x80, 0x55, 0x00, 0xe0, 0x00, 0x53, 0x00, 0xe0, - 0x90, 0x55, 0x00, 0xe0, 0x04, 0x53, 0x00, 0xe0, - 0xed, 0x09, 0x00, 0xee, 0x00, 0x00, 0x52, 0x00, - 0xe0, 0x00, 0x50, 0x00, 0xe0, 0x03, 0x05, 0x00, - 0x00, 0x00, 0xb5, 0x82, 0xb0, 0x10, 0x48, 0x80, - 0x6a, 0x41, 0x07, 0x49, 0x0f, 0x00, 0xab, 0x19, - 0x70, 0x41, 0x06, 0x09, 0x0f, 0x01, 0x91, 0x01, - 0x06, 0xc9, 0x0f, 0x59, 0x70, 0xc1, 0x05, 0xc9, - 0x0f, 0x80, 0x05, 0xc0, 0x0f, 0x99, 0x70, 0xd8, - 0x70, 0x01, 0x98, 0x02, 0x28, 0x02, 0xd0, 0x02, - 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x05, 0x49, 0x00, - 0x20, 0x08, 0x62, 0x48, 0x62, 0x04, 0x49, 0x08, - 0x60, 0xff, 0xf7, 0x4c, 0xfd, 0xf3, 0xe7, 0x00, - 0x00, 0x40, 0x55, 0x00, 0xe0, 0x00, 0x53, 0x00, - 0xe0, 0x00, 0x52, 0x00, 0xe0, 0xf0, 0xb5, 0x82, - 0xb0, 0x30, 0x49, 0x4d, 0x69, 0x0e, 0x69, 0x30, - 0x49, 0x89, 0x6a, 0x4a, 0x07, 0x52, 0x0f, 0x00, - 0xab, 0x1a, 0x70, 0x4a, 0x06, 0x12, 0x0f, 0x01, - 0x92, 0x0a, 0x06, 0xd2, 0x0f, 0x5a, 0x70, 0xca, - 0x05, 0xd2, 0x0f, 0x89, 0x05, 0xc9, 0x0f, 0x9a, - 0x70, 0xd9, 0x70, 0x01, 0x99, 0x02, 0x29, 0x03, - 0xd0, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x21, 0xf5, 0xf7, 0xdd, 0xfb, 0x07, - 0x1c, 0x0c, 0xd1, 0x22, 0x49, 0x00, 0x20, 0x08, - 0x62, 0x48, 0x62, 0x21, 0x49, 0x08, 0x60, 0x28, - 0x66, 0xf5, 0xf7, 0x66, 0xfd, 0x00, 0x20, 0xff, - 0xf7, 0x15, 0xfd, 0xe9, 0xe7, 0xf1, 0xf7, 0x41, - 0xff, 0x04, 0x1c, 0x06, 0xd1, 0x19, 0x49, 0x00, - 0x20, 0x08, 0x62, 0x48, 0x62, 0x18, 0x49, 0x08, - 0x60, 0xde, 0xe7, 0x03, 0x21, 0xe8, 0x1d, 0x79, - 0x30, 0x41, 0x61, 0xb9, 0x6a, 0x89, 0x00, 0x01, - 0x62, 0xf9, 0x1d, 0x29, 0x31, 0x0c, 0xc9, 0xe8, - 0x1d, 0x9d, 0x30, 0x0c, 0xc0, 0x78, 0x6a, 0xe9, - 0x1d, 0x99, 0x31, 0x08, 0x73, 0xf9, 0x1d, 0xe8, - 0x1d, 0x09, 0x31, 0xed, 0x09, 0x00, 0xef, 0x00, - 0x28, 0xc9, 0xad, 0x30, 0x28, 0xc0, 0x35, 0x20, - 0x20, 0x60, 0x70, 0x68, 0xe0, 0x60, 0x0e, 0x20, - 0x21, 0x1c, 0x27, 0x61, 0xf1, 0xf7, 0x87, 0xff, - 0x00, 0x28, 0x05, 0xd0, 0x38, 0x1c, 0xf1, 0xf7, - 0x74, 0xff, 0x20, 0x1c, 0xf1, 0xf7, 0x4b, 0xff, - 0xb5, 0xe7, 0x68, 0x14, 0x04, 0x20, 0x40, 0x55, - 0x00, 0xe0, 0x00, 0x53, 0x00, 0xe0, 0x00, 0x52, - 0x00, 0xe0, 0xf0, 0xb5, 0x87, 0xb0, 0xc6, 0x1d, - 0x07, 0x1c, 0x4b, 0x48, 0xb9, 0x36, 0x01, 0x68, - 0x74, 0x68, 0x02, 0x31, 0x01, 0x60, 0x41, 0x68, - 0x49, 0x4b, 0xc9, 0x18, 0x41, 0x60, 0x00, 0x20, - 0xf8, 0x60, 0xf9, 0x6c, 0xbc, 0x42, 0xe1, 0x64, - 0x39, 0x6d, 0x21, 0x65, 0x60, 0x65, 0xa0, 0x65, - 0x31, 0x68, 0xe1, 0x65, 0x20, 0x66, 0xa0, 0x66, - 0x60, 0x67, 0xf9, 0x6f, 0xe1, 0x67, 0x00, 0xd0, - 0xf8, 0x67, 0xe1, 0x1d, 0x79, 0x31, 0x06, 0x91, - 0x00, 0x20, 0x48, 0x60, 0xc8, 0x60, 0xf9, 0x1d, - 0x79, 0x31, 0x60, 0x64, 0x05, 0x91, 0xc8, 0x6b, - 0xe5, 0x1d, 0x20, 0x64, 0xb0, 0x6b, 0xb9, 0x35, - 0xa8, 0x63, 0xf9, 0x1d, 0xe1, 0x31, 0x0c, 0xc9, - 0xe0, 0x1d, 0xe1, 0x30, 0x0c, 0xc0, 0x0c, 0xc9, - 0x0c, 0xc0, 0xa8, 0x6b, 0x00, 0x28, 0x02, 0xd0, - 0x20, 0x1c, 0xf8, 0xf7, 0xdc, 0xfa, 0x05, 0x20, - 0xe0, 0x60, 0x61, 0x68, 0x01, 0x20, 0x08, 0x61, - 0x61, 0x68, 0x1a, 0x20, 0xc8, 0x60, 0x60, 0x68, - 0xc1, 0x1d, 0x2b, 0x48, 0x51, 0x31, 0x04, 0x90, - 0x0c, 0xc8, 0x0c, 0xc1, 0x60, 0x68, 0x04, 0x99, - 0x3c, 0x30, 0x0c, 0xc9, 0x0c, 0xc0, 0x06, 0x99, - 0x00, 0x20, 0x48, 0x61, 0x05, 0x99, 0x09, 0x6b, - 0x06, 0x9a, 0x11, 0x63, 0x06, 0x99, 0x88, 0x61, - 0xb0, 0x68, 0xa8, 0x60, 0xf0, 0x68, 0xe8, 0x60, - 0x30, 0x69, 0x28, 0x61, 0x70, 0x69, 0xed, 0x09, - 0x00, 0xf0, 0x00, 0x68, 0x61, 0xb0, 0x69, 0xa8, - 0x61, 0x30, 0x6a, 0x28, 0x62, 0xf1, 0xf7, 0x9e, - 0xfe, 0x00, 0x28, 0x0f, 0xd0, 0x41, 0x21, 0x01, - 0x60, 0x61, 0x68, 0x49, 0x68, 0x01, 0x61, 0x21, - 0x7e, 0xc1, 0x60, 0x61, 0x68, 0x81, 0x61, 0x44, - 0x61, 0x08, 0x21, 0xc1, 0x61, 0x01, 0x1c, 0x0e, - 0x20, 0xf1, 0xf7, 0xfb, 0xfe, 0x79, 0x68, 0x60, - 0x68, 0x81, 0x42, 0x09, 0xd0, 0xf5, 0xf7, 0x0e, - 0xfa, 0x01, 0x28, 0x05, 0xd1, 0x02, 0x23, 0x1a, - 0x22, 0x21, 0x1c, 0x60, 0x68, 0xf3, 0xf7, 0x1d, - 0xfb, 0x01, 0x22, 0x03, 0x92, 0x02, 0x22, 0x01, - 0x21, 0x1a, 0x20, 0x00, 0x92, 0x01, 0x90, 0x02, - 0x91, 0x61, 0x68, 0x02, 0x23, 0x22, 0x1c, 0x78, - 0x68, 0xf3, 0xf7, 0x3f, 0xfc, 0x07, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x68, - 0x14, 0x04, 0x20, 0xe2, 0x04, 0x00, 0x00, 0x88, - 0xe6, 0x03, 0x20, 0xf0, 0xb5, 0x86, 0xb0, 0xc2, - 0x1d, 0x79, 0x32, 0x05, 0x92, 0x94, 0x69, 0x07, - 0x1c, 0x20, 0x20, 0x10, 0x63, 0xe0, 0x1d, 0x00, - 0x21, 0xf9, 0x60, 0xb9, 0x30, 0x47, 0x60, 0xfa, - 0x6d, 0xe3, 0x1d, 0x02, 0x60, 0x3a, 0x6c, 0x79, - 0x33, 0x04, 0x93, 0xda, 0x63, 0xfa, 0x6c, 0xe2, - 0x64, 0x3a, 0x6d, 0x22, 0x65, 0x54, 0x34, 0x00, - 0x22, 0x06, 0xc4, 0x06, 0xc4, 0x64, 0x3c, 0xa1, - 0x66, 0x61, 0x67, 0xfa, 0x6f, 0xbc, 0x42, 0xe2, - 0x67, 0x00, 0xd0, 0xf9, 0x67, 0x04, 0x9b, 0xfe, - 0x1d, 0x59, 0x60, 0x04, 0x9b, 0xe1, 0x36, 0xd9, - 0x60, 0x61, 0x64, 0x21, 0x64, 0xf9, 0x1d, 0xb9, - 0x31, 0x8a, 0x6b, 0xe5, 0x1d, 0x82, 0x63, 0x0c, - 0xce, 0xe1, 0x35, 0x0c, 0xc5, 0x0c, 0xce, 0x0c, - 0xc5, 0x05, 0x22, 0xe2, 0x60, 0x63, 0x68, 0x01, - 0x22, 0x1a, 0x61, 0x63, 0x68, 0x1a, 0x22, 0xda, - 0x60, 0xed, 0x09, 0x00, 0xf1, 0x00, 0x04, 0x9b, - 0x04, 0x22, 0x5a, 0x61, 0x05, 0x9a, 0xfe, 0x1d, - 0x12, 0x6b, 0x04, 0x9b, 0xf5, 0x36, 0x1a, 0x63, - 0x8a, 0x68, 0xe5, 0x1d, 0x82, 0x60, 0xca, 0x68, - 0xf5, 0x35, 0xc2, 0x60, 0x0a, 0x69, 0x02, 0x61, - 0x4a, 0x69, 0x42, 0x61, 0x8a, 0x69, 0x82, 0x61, - 0x09, 0x6a, 0x01, 0x62, 0x0e, 0xce, 0x0e, 0xc5, - 0x0e, 0xce, 0x0e, 0xc5, 0x7a, 0x68, 0xf9, 0x1d, - 0xd5, 0x1d, 0x51, 0x35, 0x48, 0xcd, 0xad, 0x31, - 0x48, 0xc1, 0x61, 0x68, 0xcd, 0x1d, 0x14, 0x49, - 0x51, 0x35, 0xce, 0x1d, 0xf9, 0x36, 0x0c, 0xce, - 0x0c, 0xc5, 0x62, 0x68, 0xf8, 0x31, 0xd5, 0x1d, - 0xff, 0x35, 0x48, 0xc9, 0x82, 0x35, 0x48, 0xc5, - 0x80, 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, - 0xf8, 0xf7, 0x02, 0xfa, 0x20, 0x1c, 0xfd, 0xf7, - 0x62, 0xfe, 0x00, 0x22, 0x03, 0x92, 0x02, 0x22, - 0x01, 0x21, 0x1a, 0x20, 0x00, 0x92, 0x01, 0x90, - 0x02, 0x91, 0x61, 0x68, 0x02, 0x23, 0x22, 0x1c, - 0x78, 0x68, 0xf3, 0xf7, 0xad, 0xfb, 0x06, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x88, 0xe5, 0x03, 0x20, 0x00, 0xb5, 0x0f, 0x48, - 0x0f, 0x4b, 0x02, 0x68, 0x41, 0x69, 0x02, 0x32, - 0x02, 0x60, 0x42, 0x68, 0xd2, 0x18, 0x42, 0x60, - 0x0c, 0x48, 0x82, 0x68, 0x0c, 0x4b, 0x1a, 0x40, - 0x82, 0x60, 0x0c, 0x4a, 0xc2, 0x60, 0x82, 0x68, - 0x10, 0x23, 0x1a, 0x43, 0x82, 0x60, 0x0a, 0x4a, - 0x04, 0x20, 0x10, 0x60, 0x20, 0x20, 0x80, 0x31, - 0x08, 0x63, 0x00, 0x20, 0x00, 0xf0, 0x60, 0xf8, - 0x08, 0xbc, 0x18, 0x47, 0x68, 0x14, 0x04, 0x20, - 0xe2, 0x04, 0x00, 0x00, 0x00, 0x50, 0x00, 0xe0, - 0x1b, 0xf8, 0xff, 0xff, 0xfc, 0x07, 0x00, 0x00, - 0x24, 0x7e, 0x03, 0x20, 0xb0, 0xb5, 0x24, 0x4f, - 0x24, 0x4b, 0x38, 0x68, 0xed, 0x09, 0x00, 0xf2, - 0x00, 0x7c, 0x69, 0x06, 0x30, 0x38, 0x60, 0x78, - 0x68, 0xc0, 0x18, 0x78, 0x60, 0x21, 0x48, 0x81, - 0x68, 0x10, 0x23, 0x99, 0x43, 0x81, 0x60, 0x81, - 0x68, 0xfb, 0x23, 0x9b, 0x00, 0x19, 0x43, 0x81, - 0x60, 0xf1, 0xf7, 0x95, 0xfd, 0x00, 0x28, 0x13, - 0xd0, 0x41, 0x21, 0x01, 0x60, 0x79, 0x69, 0x41, - 0x61, 0x79, 0x69, 0x49, 0x68, 0x81, 0x61, 0x79, - 0x69, 0x49, 0x68, 0x49, 0x68, 0x01, 0x61, 0x79, - 0x69, 0x09, 0x7e, 0xc1, 0x60, 0x08, 0x21, 0xc1, - 0x61, 0x01, 0x1c, 0x0e, 0x20, 0xf1, 0xf7, 0xee, - 0xfd, 0xe7, 0x1d, 0x79, 0x37, 0x00, 0x25, 0x7d, - 0x61, 0xb8, 0x69, 0x00, 0x28, 0x08, 0xd0, 0x61, - 0x68, 0x40, 0x68, 0x81, 0x42, 0x04, 0xd0, 0x01, - 0x23, 0x01, 0x22, 0x00, 0x21, 0xf3, 0xf7, 0x36, - 0xfc, 0x01, 0x20, 0xbd, 0x61, 0xa0, 0x64, 0x08, - 0x49, 0x02, 0x20, 0x08, 0x60, 0x01, 0x20, 0x80, - 0x07, 0xf9, 0xf7, 0x98, 0xfa, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x68, 0x14, 0x04, - 0x20, 0xa6, 0x0e, 0x00, 0x00, 0x00, 0x50, 0x00, - 0xe0, 0x24, 0x7e, 0x03, 0x20, 0xf0, 0xb5, 0x8c, - 0xb0, 0xf9, 0x49, 0x05, 0x1c, 0x08, 0x68, 0xf9, - 0x4b, 0x06, 0x1d, 0x48, 0x68, 0xc7, 0x18, 0x08, - 0x69, 0x4c, 0x69, 0x08, 0x90, 0xe1, 0x1d, 0x79, - 0x31, 0x0b, 0x91, 0x08, 0x6b, 0x01, 0x38, 0x08, - 0x63, 0x08, 0x6b, 0x00, 0x28, 0x05, 0xd1, 0xff, - 0xf7, 0x97, 0xff, 0x0c, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x2d, 0x11, 0xd0, 0x60, - 0x6e, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x20, - 0x1c, 0xfd, 0xf7, 0xe4, 0xfd, 0x68, 0x08, 0x02, - 0xd3, 0xff, 0xf7, 0x86, 0xff, 0xed, 0xe7, 0x31, - 0x1c, 0x3a, 0x1c, 0x08, 0x98, 0xfa, 0xf7, 0xf2, - 0xfb, 0x07, 0x1c, 0xe6, 0x49, 0xe4, 0x4a, 0xed, - 0x09, 0x00, 0xf3, 0x00, 0x09, 0x69, 0x38, 0x1c, - 0xf5, 0xf7, 0x45, 0xfd, 0x00, 0x28, 0x02, 0xd1, - 0xe3, 0x4b, 0xff, 0x18, 0x04, 0x36, 0x02, 0x21, - 0x20, 0x1c, 0xfd, 0xf7, 0xb5, 0xfb, 0x60, 0x6f, - 0x02, 0x21, 0x00, 0x28, 0xdf, 0x4d, 0x73, 0xd0, - 0xb2, 0x1e, 0xde, 0x4b, 0x05, 0x92, 0xfa, 0x18, - 0x04, 0x92, 0xc0, 0x68, 0x02, 0x28, 0x07, 0xd0, - 0x26, 0xf0, 0x67, 0xfb, 0x0c, 0x22, 0x01, 0x21, - 0x20, 0x1c, 0xfd, 0xf7, 0x13, 0xfd, 0xd6, 0xe0, - 0x0b, 0x98, 0x41, 0x61, 0x60, 0x68, 0xa1, 0x6a, - 0x80, 0x30, 0xc2, 0x69, 0x23, 0x69, 0x03, 0x92, - 0x18, 0x0e, 0x1a, 0x02, 0x12, 0x0a, 0x00, 0x92, - 0x00, 0x22, 0x1a, 0x23, 0x01, 0x90, 0x02, 0x91, - 0x00, 0x21, 0x05, 0x98, 0xf5, 0xf7, 0x1f, 0xff, - 0x06, 0x90, 0x20, 0x69, 0x05, 0x99, 0x00, 0x0e, - 0x49, 0x08, 0x0a, 0x91, 0x09, 0x02, 0x08, 0x43, - 0xca, 0x49, 0x48, 0x60, 0xe1, 0x1d, 0xb9, 0x31, - 0x09, 0x91, 0x04, 0x98, 0xca, 0x68, 0x01, 0x92, - 0x0a, 0x69, 0x02, 0x92, 0x49, 0x69, 0x03, 0x91, - 0x69, 0x69, 0x01, 0x29, 0x50, 0xd0, 0x02, 0x29, - 0x2b, 0xd1, 0xc2, 0x4a, 0x03, 0x21, 0xd1, 0x62, - 0x06, 0x21, 0x01, 0xf0, 0x9e, 0xfd, 0xc8, 0x22, - 0x01, 0xf0, 0x93, 0xfd, 0x02, 0x9a, 0x52, 0x00, - 0x01, 0xf0, 0x8f, 0xfd, 0x28, 0x22, 0x01, 0xf0, - 0x8c, 0xfd, 0x03, 0x22, 0x01, 0xf0, 0x99, 0xfd, - 0x06, 0x99, 0xb8, 0x4a, 0x02, 0x31, 0x09, 0x02, - 0x10, 0x23, 0x19, 0x43, 0x11, 0x62, 0x01, 0x99, - 0xc9, 0x00, 0x44, 0x23, 0x19, 0x43, 0x09, 0x02, - 0x11, 0x23, 0x19, 0x43, 0x51, 0x62, 0x03, 0x99, - 0x09, 0x02, 0x16, 0x23, 0x19, 0x43, 0x91, 0x62, - 0xb0, 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, 0x02, - 0x08, 0x62, 0x09, 0x98, 0x04, 0x99, 0xc2, 0x68, - 0x6b, 0x69, 0xed, 0x09, 0x00, 0xf4, 0x00, 0xac, - 0x48, 0x01, 0x2b, 0x45, 0xd0, 0x02, 0x2b, 0x08, - 0xd1, 0xd2, 0x00, 0x00, 0xe0, 0x71, 0xe0, 0x40, - 0x23, 0x1a, 0x43, 0x12, 0x02, 0x11, 0x23, 0x1a, - 0x43, 0x02, 0x62, 0xc8, 0x1d, 0x5d, 0x30, 0xa5, - 0x49, 0xff, 0x22, 0x02, 0x32, 0x0a, 0x62, 0x08, - 0x60, 0x09, 0x99, 0x04, 0x98, 0x89, 0x6b, 0x03, - 0x91, 0xe1, 0x6a, 0x00, 0x29, 0x34, 0xd0, 0x05, - 0x21, 0x02, 0x91, 0x33, 0xe0, 0x06, 0x21, 0x01, - 0xf0, 0x52, 0xfd, 0xff, 0x22, 0x05, 0x32, 0x01, - 0xf0, 0x46, 0xfd, 0x02, 0x9a, 0x52, 0x00, 0x01, - 0xf0, 0x42, 0xfd, 0x28, 0x22, 0x01, 0xf0, 0x3f, - 0xfd, 0x03, 0x22, 0x01, 0xf0, 0x4c, 0xfd, 0x06, - 0x99, 0x02, 0x31, 0x09, 0x02, 0x20, 0x22, 0x0a, - 0x43, 0x90, 0x49, 0x0a, 0x62, 0x01, 0x9a, 0xd2, - 0x00, 0x84, 0x23, 0x1a, 0x43, 0x12, 0x02, 0x10, - 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x03, 0x9a, 0x12, - 0x02, 0x19, 0x23, 0x1a, 0x43, 0x8a, 0x62, 0x89, - 0x49, 0x08, 0x60, 0x8b, 0x48, 0x08, 0x62, 0xb2, - 0xe7, 0xd2, 0x00, 0x80, 0x23, 0x1a, 0x43, 0x12, - 0x02, 0x10, 0x23, 0x1a, 0x43, 0x02, 0x62, 0xbc, - 0xe7, 0x01, 0x21, 0x02, 0x91, 0x69, 0x69, 0x01, - 0x29, 0x73, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x06, - 0x21, 0x01, 0xf0, 0x19, 0xfd, 0x7c, 0x49, 0x88, - 0x60, 0x03, 0x98, 0x02, 0x28, 0x02, 0xd0, 0x03, - 0x98, 0x03, 0x28, 0x06, 0xd1, 0x02, 0x98, 0x08, - 0x23, 0x18, 0x43, 0x02, 0x90, 0x0a, 0x98, 0x7b, - 0x4a, 0x10, 0x60, 0x02, 0x98, 0x08, 0x60, 0x04, - 0x98, 0xf4, 0xf7, 0xc3, 0xfe, 0x6b, 0x49, 0x08, - 0x62, 0x61, 0x6f, 0x80, 0x08, 0x88, 0x62, 0x61, - 0x6f, 0x00, 0x20, 0x88, 0x65, 0x60, 0x6f, 0xf5, - 0xf7, 0x60, 0xfa, 0x68, 0x49, 0xff, 0x22, 0x38, - 0x1c, 0x09, 0x69, 0xb9, 0x32, 0xed, 0x09, 0x00, - 0xf5, 0x00, 0xf5, 0xf7, 0x49, 0xfc, 0x00, 0x28, - 0x07, 0xd1, 0x6a, 0x49, 0x08, 0x62, 0x48, 0x62, - 0x63, 0x4b, 0x66, 0x49, 0xff, 0x18, 0x04, 0x36, - 0x08, 0x60, 0x60, 0x68, 0xa1, 0x6a, 0x80, 0x30, - 0xc2, 0x69, 0x23, 0x69, 0x03, 0x92, 0x18, 0x0e, - 0x1a, 0x02, 0x12, 0x0a, 0x00, 0x92, 0x02, 0x91, - 0x00, 0x21, 0x00, 0x22, 0x1a, 0x23, 0x01, 0x90, - 0x30, 0x1c, 0xf5, 0xf7, 0x39, 0xfe, 0x07, 0x90, - 0x20, 0x69, 0x00, 0x0e, 0x71, 0x08, 0x09, 0x02, - 0x08, 0x43, 0x5f, 0x49, 0x48, 0x60, 0xc0, 0x34, - 0xa2, 0x68, 0x38, 0x1c, 0x06, 0x92, 0x69, 0x69, - 0x01, 0x29, 0x73, 0xd0, 0x02, 0x29, 0x24, 0xd1, - 0x09, 0x21, 0x01, 0xf0, 0xb1, 0xfc, 0xc8, 0x22, - 0x01, 0xf0, 0xb8, 0xfc, 0x34, 0x22, 0x01, 0xf0, - 0xb5, 0xfc, 0x50, 0x22, 0x01, 0xf0, 0xb2, 0xfc, - 0x0d, 0x22, 0x01, 0xf0, 0xaf, 0xfc, 0x04, 0x22, - 0x01, 0xf0, 0xac, 0xfc, 0x28, 0x22, 0x01, 0xf0, - 0xa9, 0xfc, 0x07, 0x99, 0x02, 0x31, 0x09, 0x02, - 0x10, 0x22, 0x0a, 0x43, 0x4d, 0x49, 0x00, 0xe0, - 0xbe, 0xe0, 0x0a, 0x62, 0x06, 0x9a, 0x42, 0x23, - 0x1a, 0x43, 0x12, 0x02, 0x11, 0x23, 0x1a, 0x43, - 0x4a, 0x62, 0x49, 0x4a, 0x49, 0x49, 0x0a, 0x62, - 0x08, 0x60, 0xa1, 0x68, 0x6a, 0x69, 0x48, 0x48, - 0x01, 0x2a, 0x65, 0xd0, 0x02, 0x2a, 0x05, 0xd1, - 0x40, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, - 0x19, 0x43, 0x01, 0x62, 0xf8, 0x1d, 0x49, 0x30, - 0xff, 0x22, 0x42, 0x49, 0x02, 0x32, 0x0a, 0x62, - 0x08, 0x60, 0x41, 0x4a, 0xa1, 0x68, 0x10, 0x6a, - 0x52, 0x6a, 0x00, 0x0a, 0xff, 0x23, 0x1b, 0x02, - 0x1a, 0x40, 0x10, 0x43, 0x6a, 0x69, 0x01, 0x2a, - 0x4b, 0xd0, 0x02, 0x2a, 0x07, 0xd1, 0xd1, 0x03, - 0x02, 0x0c, 0x00, 0xd2, 0x00, 0x21, 0x08, 0x43, - 0xed, 0x09, 0x00, 0xf6, 0x00, 0x01, 0x23, 0xdb, - 0x03, 0x98, 0x43, 0x20, 0x62, 0x69, 0x69, 0x38, - 0x1c, 0x01, 0x29, 0x3d, 0xd0, 0x02, 0x29, 0x05, - 0xd1, 0x32, 0x49, 0x2d, 0x22, 0x0a, 0x62, 0x2c, - 0x22, 0x4a, 0x62, 0x3c, 0x38, 0x30, 0x4a, 0x31, - 0x49, 0x0a, 0x62, 0x08, 0x60, 0x30, 0x4a, 0xa1, - 0x68, 0x10, 0x6a, 0x52, 0x6a, 0x00, 0x0a, 0xff, - 0x23, 0x1b, 0x02, 0x1a, 0x40, 0x10, 0x43, 0x6a, - 0x69, 0x01, 0x2a, 0x6a, 0xd0, 0x02, 0x2a, 0x00, - 0xe0, 0x71, 0xe0, 0x07, 0xd1, 0xd1, 0x03, 0x02, - 0x0c, 0x00, 0xd2, 0x00, 0x21, 0x08, 0x43, 0x01, - 0x23, 0xdb, 0x03, 0x98, 0x43, 0xe0, 0x61, 0x68, - 0x69, 0x01, 0x28, 0x63, 0xd0, 0x02, 0x28, 0x04, - 0xd1, 0x21, 0x48, 0x2d, 0x22, 0x02, 0x62, 0x2c, - 0x22, 0x42, 0x62, 0x1d, 0x4a, 0x1f, 0x49, 0xf8, - 0x1d, 0x21, 0x30, 0x0a, 0x62, 0x08, 0x60, 0x13, - 0x4c, 0x03, 0x20, 0x20, 0x60, 0x69, 0x69, 0x38, - 0x1c, 0x01, 0x29, 0x35, 0xe0, 0x71, 0xe0, 0x77, - 0xe0, 0x7d, 0xe0, 0x00, 0x00, 0x68, 0x14, 0x04, - 0x20, 0xc4, 0x09, 0x00, 0x00, 0x7c, 0x0b, 0x00, - 0x00, 0x00, 0x50, 0x00, 0xe0, 0x88, 0x13, 0x00, - 0x00, 0x48, 0xe6, 0x03, 0x20, 0x1e, 0xfb, 0xff, - 0xff, 0x00, 0x52, 0x00, 0xe0, 0x80, 0x55, 0x00, - 0xe0, 0x00, 0x53, 0x00, 0xe0, 0x90, 0x55, 0x00, - 0xe0, 0x04, 0x53, 0x00, 0xe0, 0x03, 0x05, 0x00, - 0x00, 0x80, 0x57, 0x00, 0xe0, 0x00, 0x51, 0x00, - 0xe0, 0xa0, 0x55, 0x00, 0xe0, 0x02, 0x05, 0x00, - 0x00, 0x08, 0x53, 0x00, 0xe0, 0xb0, 0x55, 0x00, - 0xe0, 0x0c, 0x53, 0x00, 0xe0, 0xd0, 0x55, 0x00, - 0xe0, 0x02, 0x03, 0x00, 0x00, 0x14, 0x53, 0x00, - 0xe0, 0xc0, 0x55, 0x00, 0xe0, 0x10, 0x53, 0x00, - 0xe0, 0x5d, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x09, - 0x21, 0x01, 0xf0, 0xed, 0x09, 0x00, 0xf7, 0x00, - 0xe4, 0xfb, 0xc1, 0x1f, 0x21, 0x39, 0xa1, 0x60, - 0xb0, 0x30, 0xe0, 0x60, 0x32, 0x20, 0x02, 0xf0, - 0x7e, 0xf9, 0x2a, 0x49, 0xc0, 0xc1, 0xdd, 0xe5, - 0x3f, 0xe0, 0x06, 0x21, 0x01, 0xf0, 0xe7, 0xfb, - 0x6a, 0x46, 0x03, 0xc2, 0x00, 0x98, 0x01, 0x99, - 0xc8, 0xe6, 0x3d, 0xe0, 0x10, 0x21, 0x01, 0xf0, - 0xcc, 0xfb, 0xff, 0x22, 0x05, 0x32, 0x01, 0xf0, - 0xd2, 0xfb, 0x46, 0x22, 0x01, 0xf0, 0xcf, 0xfb, - 0x0d, 0x22, 0x01, 0xf0, 0xcc, 0xfb, 0x04, 0x22, - 0x01, 0xf0, 0xc9, 0xfb, 0x28, 0x22, 0x01, 0xf0, - 0xc6, 0xfb, 0x07, 0x99, 0x02, 0x31, 0x09, 0x02, - 0x20, 0x22, 0x0a, 0x43, 0x19, 0x49, 0x0a, 0x62, - 0x06, 0x9a, 0x82, 0x23, 0x1a, 0x43, 0x12, 0x02, - 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x1d, 0xe7, - 0x80, 0x23, 0x19, 0x43, 0x09, 0x02, 0x10, 0x23, - 0x19, 0x43, 0x01, 0x62, 0x27, 0xe7, 0x01, 0x22, - 0x12, 0x04, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x22, - 0x10, 0x43, 0x3d, 0xe7, 0x0e, 0x49, 0x3d, 0x22, - 0x0a, 0x62, 0x3e, 0x22, 0x4a, 0x62, 0x46, 0x38, - 0x43, 0xe7, 0x01, 0x22, 0x12, 0x04, 0x00, 0x29, - 0x00, 0xd1, 0x00, 0x22, 0x10, 0x43, 0x58, 0xe7, - 0x08, 0x48, 0x3d, 0x22, 0x02, 0x62, 0x3e, 0x22, - 0x42, 0x62, 0x5d, 0xe7, 0x10, 0x21, 0x01, 0xf0, - 0x88, 0xfb, 0xa2, 0xe7, 0x00, 0x00, 0x68, 0x14, - 0x04, 0x20, 0xa0, 0x55, 0x00, 0xe0, 0xd0, 0x55, - 0x00, 0xe0, 0xc0, 0x55, 0x00, 0xe0, 0x00, 0xb5, - 0x03, 0x48, 0x40, 0x69, 0xff, 0xf7, 0x5b, 0xfc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x68, 0x14, - 0x04, 0x20, 0x80, 0x21, 0xc0, 0x10, 0x02, 0x04, - 0x12, 0x14, 0x03, 0xd5, 0x00, 0x21, 0xd0, 0x43, - 0x02, 0x04, 0x12, 0x14, 0x09, 0x4b, 0x50, 0x11, - 0x18, 0x5c, 0x00, 0x28, 0x01, 0xd0, 0xed, 0x09, - 0x00, 0xf8, 0x00, 0x02, 0x41, 0x00, 0xe0, 0x52, - 0x10, 0x12, 0x07, 0x12, 0x0f, 0x00, 0x01, 0x08, - 0x43, 0x10, 0x43, 0x55, 0x23, 0x58, 0x40, 0x00, - 0x06, 0x00, 0x0e, 0x70, 0x47, 0x00, 0x00, 0x08, - 0x15, 0x01, 0x20, 0x80, 0x10, 0x00, 0x04, 0x00, - 0x14, 0x04, 0xd5, 0x80, 0x22, 0xc0, 0x43, 0x00, - 0x04, 0x00, 0x14, 0x00, 0xe0, 0x00, 0x22, 0x21, - 0x30, 0x00, 0x04, 0x22, 0x4b, 0x00, 0x14, 0x98, - 0x42, 0x00, 0xdd, 0x18, 0x1c, 0x01, 0x23, 0x1b, - 0x03, 0x98, 0x42, 0x03, 0xdb, 0x07, 0x21, 0xc0, - 0x1a, 0x00, 0x12, 0x2f, 0xe0, 0x01, 0x23, 0xdb, - 0x02, 0x98, 0x42, 0x03, 0xdb, 0x06, 0x21, 0xc0, - 0x1a, 0xc0, 0x11, 0x27, 0xe0, 0x01, 0x23, 0x9b, - 0x02, 0x98, 0x42, 0x03, 0xdb, 0x05, 0x21, 0xc0, - 0x1a, 0x80, 0x11, 0x1f, 0xe0, 0x01, 0x23, 0x5b, - 0x02, 0x98, 0x42, 0x03, 0xdb, 0x04, 0x21, 0xc0, - 0x1a, 0x40, 0x11, 0x17, 0xe0, 0xff, 0x23, 0x01, - 0x33, 0x98, 0x42, 0x04, 0xdb, 0x03, 0x21, 0xff, - 0x38, 0x01, 0x38, 0x00, 0x11, 0x0e, 0xe0, 0x80, - 0x28, 0x03, 0xdb, 0x02, 0x21, 0x80, 0x38, 0xc0, - 0x10, 0x08, 0xe0, 0x40, 0x28, 0x03, 0xdb, 0x01, - 0x21, 0x40, 0x38, 0x80, 0x10, 0x02, 0xe0, 0x00, - 0x21, 0x20, 0x38, 0x40, 0x10, 0x00, 0x06, 0x00, - 0x0e, 0x09, 0x01, 0x11, 0x43, 0x08, 0x43, 0xff, - 0x23, 0x58, 0x40, 0x18, 0x40, 0x70, 0x47, 0xff, - 0x1f, 0x00, 0x00, 0xf0, 0xb5, 0x89, 0xb0, 0x9e, - 0x49, 0x9f, 0x4a, 0xcd, 0x6a, 0x00, 0x21, 0x11, - 0x63, 0x9e, 0x4a, 0x9e, 0x49, 0xca, 0x60, 0x8a, - 0x68, 0x9e, 0x4b, 0x1a, 0x40, 0x8a, 0x60, 0x00, - 0x21, 0xf4, 0xf7, 0xc3, 0xfe, 0x07, 0x1c, 0x09, - 0xd1, 0x96, 0x48, 0x02, 0x6b, 0x01, 0x20, 0x29, - 0x1c, 0xf6, 0xf7, 0xbd, 0xf9, 0x09, 0xb0, 0xf0, - 0xbc, 0xed, 0x09, 0x00, 0xf9, 0x00, 0x08, 0xbc, - 0x18, 0x47, 0xfe, 0x1d, 0x45, 0x36, 0x95, 0x48, - 0x08, 0x96, 0x04, 0x69, 0xf4, 0xf7, 0x42, 0xfc, - 0x02, 0x90, 0x93, 0x48, 0x03, 0x91, 0x07, 0x90, - 0x40, 0x69, 0x01, 0x28, 0x73, 0xd0, 0x02, 0x28, - 0x04, 0xd1, 0x8e, 0x21, 0x20, 0x1c, 0x01, 0xf0, - 0xe3, 0xfa, 0x04, 0x1c, 0x02, 0x98, 0x84, 0x42, - 0x02, 0xd9, 0x03, 0x98, 0x01, 0x38, 0x03, 0x90, - 0x03, 0x99, 0x02, 0x94, 0x71, 0x60, 0xe9, 0x1d, - 0x79, 0x31, 0x34, 0x60, 0x89, 0x6a, 0x08, 0x20, - 0x88, 0x62, 0xe8, 0x60, 0x85, 0x48, 0x00, 0x26, - 0x06, 0x90, 0x06, 0x60, 0x08, 0x9e, 0x84, 0xa3, - 0x30, 0x68, 0x05, 0x90, 0x71, 0x68, 0x1a, 0x68, - 0x5b, 0x68, 0x04, 0x1c, 0x01, 0xf0, 0x30, 0xfa, - 0x01, 0x01, 0x09, 0x09, 0x80, 0x4b, 0x0e, 0x1c, - 0xe4, 0x18, 0x88, 0x1c, 0x00, 0x01, 0x00, 0x09, - 0x69, 0x64, 0x04, 0x90, 0x06, 0x98, 0x02, 0x1d, - 0x06, 0xca, 0x07, 0x98, 0x83, 0x6b, 0x03, 0x92, - 0x18, 0x0e, 0x1a, 0x02, 0x12, 0x0a, 0x01, 0x90, - 0xe8, 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x02, 0x91, - 0x00, 0x92, 0x42, 0x68, 0x08, 0x23, 0x31, 0x1c, - 0x04, 0x98, 0xf5, 0xf7, 0x07, 0xfc, 0x06, 0x1c, - 0x72, 0x48, 0x82, 0x68, 0x01, 0x92, 0xc2, 0x68, - 0x02, 0x92, 0x00, 0x69, 0x03, 0x90, 0x07, 0x98, - 0x40, 0x69, 0x01, 0x28, 0x73, 0xd0, 0x02, 0x28, - 0x2f, 0xd1, 0x6d, 0x49, 0x03, 0x20, 0xc8, 0x62, - 0x06, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0x90, 0xfa, - 0xc8, 0x22, 0x01, 0xf0, 0x85, 0xfa, 0x02, 0x9a, - 0x52, 0x00, 0x01, 0xf0, 0x81, 0xfa, 0x28, 0x22, - 0x01, 0xf0, 0x7e, 0xfa, 0x03, 0x22, 0x01, 0xf0, - 0x8b, 0xfa, 0xb1, 0x1c, 0x09, 0x02, 0x10, 0x23, - 0x61, 0x4a, 0x19, 0x43, 0x11, 0x62, 0x01, 0x9a, - 0xd1, 0x00, 0x44, 0x23, 0xed, 0x09, 0x00, 0xfa, - 0x00, 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, - 0x43, 0x00, 0xe0, 0x5c, 0xe0, 0x5b, 0x4a, 0x51, - 0x62, 0x03, 0x9a, 0x11, 0x02, 0x16, 0x23, 0x59, - 0x4a, 0x19, 0x43, 0x91, 0x62, 0x4c, 0x49, 0x08, - 0x60, 0x05, 0x20, 0x00, 0x02, 0x08, 0x62, 0x54, - 0x48, 0x81, 0x68, 0x07, 0x98, 0x42, 0x69, 0x54, - 0x48, 0x01, 0x2a, 0x74, 0xd0, 0x02, 0x2a, 0x06, - 0xd1, 0xc9, 0x00, 0x40, 0x23, 0x19, 0x43, 0x09, - 0x02, 0x11, 0x23, 0x19, 0x43, 0x01, 0x62, 0xe0, - 0x1d, 0x5d, 0x30, 0xff, 0x22, 0x4d, 0x49, 0x02, - 0x32, 0x0a, 0x62, 0x08, 0x60, 0x07, 0x99, 0x20, - 0x1c, 0x49, 0x69, 0x01, 0x29, 0x68, 0xd0, 0x02, - 0x29, 0x02, 0xd1, 0x06, 0x21, 0x01, 0xf0, 0x46, - 0xfa, 0x47, 0x49, 0x88, 0x60, 0x03, 0x20, 0x08, - 0x60, 0x00, 0x26, 0xae, 0x64, 0xee, 0x64, 0x38, - 0x4d, 0xa8, 0x68, 0x44, 0x4b, 0x18, 0x40, 0xa8, - 0x60, 0xd8, 0x43, 0xe8, 0x60, 0x42, 0x4b, 0xe0, - 0x18, 0x30, 0x4c, 0x60, 0x60, 0x04, 0x98, 0x03, - 0x38, 0x20, 0x60, 0x00, 0x20, 0x00, 0xf0, 0xf8, - 0xfa, 0xa8, 0x68, 0xfb, 0x23, 0x9b, 0x00, 0x18, - 0x43, 0xa8, 0x60, 0xf1, 0xf7, 0x5c, 0xf9, 0x00, - 0x28, 0x00, 0xe0, 0x15, 0xe0, 0x0a, 0xd0, 0x35, - 0x21, 0xbe, 0x64, 0x01, 0x60, 0xe1, 0x6a, 0x49, - 0x68, 0xc1, 0x60, 0x07, 0x61, 0x01, 0x1c, 0x0e, - 0x20, 0xf1, 0xf7, 0xbc, 0xf9, 0x1b, 0xe7, 0x95, - 0x21, 0x20, 0x1c, 0x01, 0xf0, 0x13, 0xfa, 0x6a, - 0x46, 0x03, 0xc2, 0x01, 0x99, 0x00, 0x9c, 0x2b, - 0xe7, 0x06, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0x0a, - 0xfa, 0xff, 0x22, 0x05, 0x32, 0x01, 0xf0, 0xfe, - 0xf9, 0x02, 0x9a, 0x52, 0x00, 0x01, 0xf0, 0xfa, - 0xf9, 0x28, 0x22, 0x01, 0xf0, 0xf7, 0xf9, 0x03, - 0x22, 0x01, 0xf0, 0x04, 0xfa, 0xb1, 0x1c, 0xed, - 0x09, 0x00, 0xfb, 0x00, 0x09, 0x02, 0x20, 0x22, - 0x0a, 0x43, 0x1d, 0x49, 0x0a, 0x62, 0x01, 0x9a, - 0xd2, 0x00, 0x84, 0x23, 0x1a, 0x43, 0x12, 0x02, - 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x03, 0x9a, - 0x12, 0x02, 0x00, 0xe0, 0x08, 0xe0, 0x19, 0x23, - 0x1a, 0x43, 0x8a, 0x62, 0x0a, 0x49, 0x08, 0x60, - 0x1a, 0x48, 0x08, 0x62, 0x7a, 0xe7, 0x07, 0xe0, - 0xc9, 0x00, 0x80, 0x23, 0x19, 0x43, 0x09, 0x02, - 0x10, 0x23, 0x19, 0x43, 0x01, 0x62, 0x81, 0xe7, - 0x06, 0x21, 0x01, 0xf0, 0xd6, 0xf9, 0x8e, 0xe7, - 0x00, 0x00, 0x34, 0xf3, 0x03, 0x20, 0x00, 0x53, - 0x00, 0xe0, 0x08, 0x01, 0x02, 0x00, 0x00, 0x50, - 0x00, 0xe0, 0xe7, 0xfe, 0xfd, 0xff, 0x00, 0x51, - 0x00, 0xe0, 0x48, 0xe6, 0x03, 0x20, 0x74, 0x03, - 0x04, 0x20, 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, 0x88, 0xe5, - 0x03, 0x20, 0x80, 0x55, 0x00, 0xe0, 0x90, 0x55, - 0x00, 0xe0, 0x04, 0x53, 0x00, 0xe0, 0x00, 0x52, - 0x00, 0xe0, 0x03, 0xf8, 0xfd, 0xff, 0xad, 0xf8, - 0xff, 0xff, 0x03, 0x05, 0x00, 0x00, 0xf0, 0xb5, - 0x88, 0xb0, 0x75, 0x48, 0xc6, 0x6a, 0x75, 0x48, - 0x80, 0x6a, 0x41, 0x07, 0x49, 0x0f, 0x06, 0xab, - 0x19, 0x70, 0x41, 0x06, 0x09, 0x0f, 0x07, 0x91, - 0x01, 0x06, 0xc9, 0x0f, 0x59, 0x70, 0xc1, 0x05, - 0xc9, 0x0f, 0x80, 0x05, 0xc0, 0x0f, 0x99, 0x70, - 0xd8, 0x70, 0x07, 0x9a, 0x00, 0x21, 0x02, 0x2a, - 0x6c, 0x48, 0x0b, 0xd0, 0x01, 0x60, 0x17, 0x20, - 0x6b, 0x49, 0x40, 0x01, 0xc8, 0x60, 0x00, 0x20, - 0x00, 0xf0, 0x55, 0xfa, 0x08, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x07, 0x69, 0xf4, 0xf7, - 0xd6, 0xfa, 0x65, 0x4d, 0x02, 0x90, 0x03, 0x91, - 0x68, 0x69, 0x01, 0x28, 0x73, 0xd0, 0x02, 0x28, - 0x04, 0xd1, 0xed, 0x09, 0x00, 0xfc, 0x00, 0x8e, - 0x21, 0x38, 0x1c, 0x01, 0xf0, 0x78, 0xf9, 0x07, - 0x1c, 0x02, 0x98, 0x87, 0x42, 0x02, 0xd9, 0x03, - 0x98, 0x01, 0x38, 0x03, 0x90, 0x02, 0x97, 0x03, - 0x99, 0x38, 0x1c, 0x5b, 0x4a, 0x01, 0xf0, 0x73, - 0xf9, 0x5b, 0xa3, 0x1a, 0x68, 0x04, 0x1c, 0x0f, - 0x1c, 0x5b, 0x68, 0x01, 0xf0, 0xd0, 0xf8, 0x04, - 0x90, 0x59, 0x48, 0x02, 0x1d, 0x06, 0xca, 0xab, - 0x6b, 0x03, 0x92, 0x18, 0x0e, 0x1a, 0x02, 0x12, - 0x0a, 0x01, 0x90, 0xf0, 0x1d, 0xff, 0x30, 0x7a, - 0x30, 0x00, 0x92, 0x02, 0x91, 0x42, 0x68, 0x71, - 0x6c, 0x04, 0x98, 0x08, 0x23, 0xf5, 0xf7, 0xb1, - 0xfa, 0x39, 0x1c, 0x4f, 0x49, 0x05, 0x90, 0x8e, - 0x68, 0xca, 0x68, 0x20, 0x1c, 0x02, 0x92, 0x09, - 0x69, 0x03, 0x91, 0x69, 0x69, 0x01, 0x29, 0x51, - 0xd0, 0x02, 0x29, 0x2a, 0xd1, 0x4a, 0x4a, 0x03, - 0x21, 0xd1, 0x62, 0x06, 0x21, 0x01, 0xf0, 0x3b, - 0xf9, 0xc8, 0x22, 0x01, 0xf0, 0x30, 0xf9, 0x02, - 0x9a, 0x52, 0x00, 0x01, 0xf0, 0x2c, 0xf9, 0x28, - 0x22, 0x01, 0xf0, 0x29, 0xf9, 0x03, 0x22, 0x01, - 0xf0, 0x36, 0xf9, 0x05, 0x99, 0x40, 0x4a, 0x02, - 0x31, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x11, - 0x62, 0xf1, 0x00, 0x44, 0x23, 0x19, 0x43, 0x09, - 0x02, 0x11, 0x23, 0x19, 0x43, 0x51, 0x62, 0x03, - 0x99, 0x09, 0x02, 0x16, 0x23, 0x19, 0x43, 0x91, - 0x62, 0x38, 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, - 0x02, 0x08, 0x62, 0x39, 0x1c, 0x33, 0x49, 0x20, - 0x1c, 0x89, 0x68, 0x6b, 0x69, 0x34, 0x4a, 0x01, - 0x2b, 0x45, 0xd0, 0x02, 0x2b, 0x08, 0xd1, 0xc9, - 0x00, 0x00, 0xe0, 0x11, 0xe0, 0x40, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x11, - 0x62, 0xff, 0x22, 0x64, 0x30, 0x2d, 0x49, 0x02, - 0x32, 0x0a, 0x62, 0x08, 0x60, 0xed, 0x09, 0x00, - 0xfd, 0x00, 0x39, 0x1c, 0x1d, 0x49, 0x4c, 0x60, - 0x04, 0x98, 0x08, 0x60, 0x6b, 0xe7, 0x95, 0x21, - 0x38, 0x1c, 0x01, 0xf0, 0xf3, 0xf8, 0x07, 0x1c, - 0x79, 0xe7, 0x06, 0x21, 0x01, 0xf0, 0xee, 0xf8, - 0xff, 0x22, 0x05, 0x32, 0x01, 0xf0, 0xe2, 0xf8, - 0x02, 0x9a, 0x52, 0x00, 0x01, 0xf0, 0xde, 0xf8, - 0x28, 0x22, 0x01, 0xf0, 0xdb, 0xf8, 0x03, 0x22, - 0x01, 0xf0, 0xe8, 0xf8, 0x05, 0x99, 0x02, 0x31, - 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0x17, 0x49, - 0x0a, 0x62, 0xf2, 0x00, 0x84, 0x23, 0x1a, 0x43, - 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, - 0x03, 0x9a, 0x12, 0x02, 0x19, 0x23, 0x1a, 0x43, - 0x8a, 0x62, 0x11, 0x49, 0x08, 0x60, 0x13, 0x48, - 0x08, 0x62, 0xb1, 0xe7, 0xc9, 0x00, 0x80, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, - 0x11, 0x62, 0xbc, 0xe7, 0x34, 0xf3, 0x03, 0x20, - 0x40, 0x55, 0x00, 0xe0, 0x00, 0x51, 0x00, 0xe0, - 0x00, 0x50, 0x00, 0xe0, 0x48, 0xe6, 0x03, 0x20, - 0xe2, 0x04, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x74, 0x03, 0x04, 0x20, - 0x88, 0xe5, 0x03, 0x20, 0x80, 0x55, 0x00, 0xe0, - 0x00, 0x53, 0x00, 0xe0, 0x90, 0x55, 0x00, 0xe0, - 0x04, 0x53, 0x00, 0xe0, 0x03, 0x05, 0x00, 0x00, - 0x00, 0xb5, 0x05, 0x49, 0x00, 0x20, 0x08, 0x62, - 0x48, 0x62, 0x04, 0x49, 0x08, 0x60, 0x00, 0xf0, - 0x63, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x00, 0x53, 0x00, 0xe0, 0x00, 0x51, 0x00, 0xe0, - 0xf0, 0xb5, 0x8c, 0xb0, 0x07, 0x1c, 0x9c, 0x48, - 0xc5, 0x6a, 0x01, 0x68, 0x04, 0x91, 0x40, 0x68, - 0x9a, 0x4a, 0x9b, 0x49, 0xca, 0x60, 0x8a, 0x68, - 0x9a, 0x4b, 0x1a, 0x40, 0x8a, 0x60, 0x9a, 0x49, - 0x0b, 0x91, 0x49, 0x69, 0x01, 0x29, 0x73, 0xd0, - 0xed, 0x09, 0x00, 0xfe, 0x00, 0x02, 0x29, 0x02, - 0xd1, 0x06, 0x21, 0x01, 0xf0, 0x79, 0xf8, 0x01, - 0x1c, 0x95, 0x48, 0x81, 0x60, 0x03, 0x21, 0x01, - 0x60, 0x00, 0x21, 0x38, 0x1c, 0xf4, 0xf7, 0x30, - 0xfc, 0xc6, 0x1d, 0x45, 0x36, 0x07, 0x1c, 0x91, - 0x48, 0x0a, 0x96, 0x04, 0x69, 0xf4, 0xf7, 0xba, - 0xf9, 0x03, 0x91, 0x0b, 0x99, 0x02, 0x90, 0x48, - 0x69, 0x01, 0x28, 0x6d, 0xd0, 0x02, 0x28, 0x04, - 0xd1, 0x8e, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0x5c, - 0xf8, 0x04, 0x1c, 0x02, 0x98, 0x84, 0x42, 0x02, - 0xd9, 0x03, 0x98, 0x01, 0x38, 0x03, 0x90, 0x03, - 0x99, 0x02, 0x94, 0x71, 0x60, 0x84, 0x48, 0x34, - 0x60, 0x84, 0x4a, 0x00, 0x68, 0x11, 0x6a, 0x52, - 0x6a, 0x09, 0x0a, 0xff, 0x23, 0x1b, 0x02, 0x1a, - 0x40, 0x11, 0x43, 0x0e, 0x1c, 0x0b, 0x99, 0x4a, - 0x69, 0x01, 0x2a, 0x74, 0xd0, 0x02, 0x2a, 0x08, - 0xd1, 0xd1, 0x03, 0x33, 0x0c, 0x00, 0xd2, 0x00, - 0x21, 0x31, 0x43, 0x01, 0x23, 0xdb, 0x03, 0x99, - 0x43, 0x0e, 0x1c, 0x79, 0x4b, 0x31, 0x1c, 0x1c, - 0x6a, 0x5e, 0x6a, 0x24, 0x0a, 0xff, 0x23, 0x1b, - 0x02, 0x33, 0x40, 0x1c, 0x43, 0x26, 0x1c, 0x01, - 0x2a, 0x6f, 0xd0, 0x02, 0x2a, 0x09, 0xd1, 0xd2, - 0x03, 0x30, 0x0c, 0x00, 0xd2, 0x00, 0x22, 0x32, - 0x43, 0x01, 0x23, 0xdb, 0x03, 0x10, 0x1c, 0x98, - 0x43, 0x06, 0x1c, 0x48, 0x04, 0x40, 0x0c, 0x72, - 0x04, 0x52, 0x0c, 0x90, 0x42, 0x00, 0xd9, 0x0e, - 0x1c, 0xe9, 0x1d, 0x79, 0x31, 0x89, 0x6a, 0x09, - 0x20, 0x88, 0x62, 0xe8, 0x60, 0x00, 0x22, 0x28, - 0x1c, 0x79, 0x6a, 0xf4, 0xf7, 0x2f, 0xfb, 0x04, - 0x1c, 0x5a, 0x48, 0x00, 0xe0, 0x92, 0xe0, 0x04, - 0x63, 0xe8, 0x1d, 0x35, 0x30, 0xf9, 0x1d, 0x09, - 0x31, 0x09, 0x90, 0x0c, 0xc9, 0x0c, 0xc0, 0xe8, - 0x1d, 0x51, 0x30, 0xed, 0x09, 0x00, 0xff, 0x00, - 0x09, 0x99, 0x08, 0x90, 0x0c, 0xc9, 0x0c, 0xc0, - 0xe0, 0x1d, 0x09, 0x30, 0xf9, 0x1d, 0x29, 0x31, - 0x06, 0x91, 0x07, 0x90, 0x00, 0xe0, 0x84, 0xe0, - 0x0c, 0xc9, 0x0c, 0xc0, 0x00, 0x21, 0xe1, 0x64, - 0x21, 0x65, 0x61, 0x65, 0xa1, 0x65, 0xe1, 0x65, - 0x21, 0x66, 0xa1, 0x66, 0x61, 0x67, 0xa1, 0x67, - 0xe0, 0x1d, 0x79, 0x30, 0xe1, 0x67, 0x41, 0x60, - 0xc1, 0x60, 0xe0, 0x1d, 0x21, 0x64, 0x61, 0x64, - 0xb9, 0x30, 0x81, 0x63, 0xb8, 0x6a, 0x4c, 0x4a, - 0x80, 0x00, 0xf0, 0xf7, 0xc0, 0xfc, 0x0a, 0x9b, - 0x1a, 0x68, 0x5b, 0x68, 0x80, 0x1a, 0x99, 0x41, - 0xea, 0x1d, 0x25, 0x32, 0x05, 0x92, 0x03, 0xc2, - 0xb8, 0x6a, 0x00, 0xe0, 0x66, 0xe0, 0x04, 0x99, - 0x80, 0x00, 0x08, 0x1a, 0xe9, 0x1d, 0xff, 0x31, - 0x7a, 0x31, 0x08, 0x60, 0xb8, 0x6a, 0x41, 0xa1, - 0x80, 0x00, 0x28, 0x62, 0xb8, 0x6a, 0x80, 0x00, - 0x68, 0x61, 0xe8, 0x1d, 0x11, 0x30, 0x00, 0xe0, - 0x5b, 0xe0, 0x0c, 0xc9, 0x0c, 0xc0, 0x05, 0x99, - 0xe8, 0x1d, 0x0c, 0xc9, 0x1d, 0x30, 0x0c, 0xc0, - 0x00, 0x21, 0x69, 0x63, 0x06, 0x99, 0x07, 0x98, - 0x0c, 0xc9, 0x0c, 0xc0, 0x08, 0x99, 0x37, 0x48, - 0x0c, 0xc9, 0x0c, 0xc0, 0x0a, 0x9b, 0x03, 0xcb, - 0x28, 0x49, 0x48, 0x60, 0xb8, 0x6a, 0x80, 0x00, - 0x08, 0x60, 0x27, 0x49, 0x88, 0x68, 0x32, 0x4b, - 0x18, 0x40, 0x88, 0x60, 0xd8, 0x43, 0xc8, 0x60, - 0x00, 0x20, 0x00, 0xf0, 0xfe, 0xf9, 0x22, 0x49, - 0x88, 0x68, 0xfb, 0x23, 0x9b, 0x00, 0x18, 0x43, - 0x88, 0x60, 0x00, 0x22, 0x28, 0x1c, 0x21, 0x7e, - 0xfc, 0xf7, 0x17, 0xfd, 0xf0, 0xf7, 0xc0, 0xfe, - 0x00, 0x28, 0x0b, 0xd0, 0x35, 0x21, 0xbe, 0x64, - 0x01, 0x60, 0x17, 0x49, 0xc9, 0x6a, 0x49, 0x68, - 0xc1, 0x60, 0x07, 0x61, 0x01, 0x1c, 0xed, 0x09, - 0x00, 0x00, 0x01, 0x0e, 0x20, 0xf0, 0xf7, 0x21, - 0xff, 0x22, 0x49, 0x00, 0x20, 0x08, 0x60, 0x0c, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x06, - 0x21, 0x00, 0xf0, 0x73, 0xff, 0x02, 0xaa, 0x03, - 0xc2, 0x02, 0x98, 0x03, 0x99, 0xf4, 0xe6, 0x95, - 0x21, 0x20, 0x1c, 0x00, 0xf0, 0x6a, 0xff, 0x6a, - 0x46, 0x03, 0xc2, 0x01, 0x99, 0x00, 0x9c, 0x09, - 0xe7, 0x01, 0x21, 0x09, 0x04, 0x00, 0x28, 0x00, - 0xd1, 0x00, 0x21, 0x0e, 0x43, 0x26, 0xe7, 0x01, - 0x22, 0x12, 0x04, 0x00, 0x28, 0x00, 0xd1, 0x00, - 0x22, 0x16, 0x43, 0x37, 0xe7, 0x00, 0x00, 0x34, - 0xf3, 0x03, 0x20, 0x08, 0x01, 0x02, 0x00, 0x00, - 0x50, 0x00, 0xe0, 0xe7, 0xfe, 0xfd, 0xff, 0x48, - 0xe6, 0x03, 0x20, 0x00, 0x52, 0x00, 0xe0, 0x00, - 0x51, 0x00, 0xe0, 0x88, 0xe5, 0x03, 0x20, 0xd0, - 0x55, 0x00, 0xe0, 0xc0, 0x55, 0x00, 0xe0, 0x71, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x51, 0x00, 0xe0, 0x03, - 0xf8, 0xfd, 0xff, 0x74, 0x03, 0x04, 0x20, 0xf0, - 0xb5, 0x88, 0xb0, 0xbc, 0x49, 0x4a, 0x68, 0xbc, - 0x4b, 0xbd, 0x4e, 0xd5, 0x18, 0x0a, 0x68, 0xbc, - 0x4f, 0x04, 0x32, 0x05, 0x92, 0xcc, 0x6a, 0x00, - 0x28, 0x41, 0xd0, 0xf1, 0x1f, 0xb9, 0x39, 0x09, - 0x68, 0xb9, 0x4a, 0x07, 0x91, 0x03, 0x91, 0x11, - 0x6a, 0x52, 0x6a, 0x09, 0x0a, 0xff, 0x23, 0x1b, - 0x02, 0x1a, 0x40, 0x11, 0x43, 0x72, 0x69, 0x06, - 0x92, 0x01, 0x2a, 0x47, 0xd0, 0x02, 0x2a, 0x07, - 0xd1, 0xd2, 0x03, 0x0b, 0x0c, 0x00, 0xd2, 0x00, - 0x22, 0x11, 0x43, 0x01, 0x23, 0xdb, 0x03, 0x99, - 0x43, 0x4a, 0x04, 0x3b, 0x68, 0x52, 0x0c, 0x5b, - 0x04, 0x5b, 0x0c, 0x9a, 0x42, 0x00, 0xd9, 0x39, - 0x60, 0x07, 0x99, 0xa9, 0x4a, 0x03, 0x91, 0x11, - 0x6a, 0xed, 0x09, 0x00, 0x01, 0x01, 0x52, 0x6a, - 0x09, 0x0a, 0xff, 0x23, 0x1b, 0x02, 0x1a, 0x40, - 0x11, 0x43, 0x06, 0x9a, 0x01, 0x2a, 0x30, 0xd0, - 0x02, 0x2a, 0x07, 0xd1, 0xd2, 0x03, 0x0b, 0x0c, - 0x00, 0xd2, 0x00, 0x22, 0x11, 0x43, 0x01, 0x23, - 0xdb, 0x03, 0x99, 0x43, 0x4a, 0x04, 0x3b, 0x68, - 0x52, 0x0c, 0x5b, 0x04, 0x5b, 0x0c, 0x9a, 0x42, - 0x00, 0xd9, 0x39, 0x60, 0xc1, 0x07, 0xc9, 0x0f, - 0x07, 0x20, 0x00, 0x29, 0x21, 0xd0, 0xe1, 0x1d, - 0x79, 0x31, 0x89, 0x6a, 0x88, 0x62, 0xe0, 0x60, - 0x39, 0x68, 0x20, 0x1c, 0xfd, 0xf7, 0xf7, 0xf9, - 0x00, 0x20, 0xf8, 0x60, 0x02, 0x20, 0xf2, 0xf7, - 0x61, 0xfd, 0x08, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0x22, 0x03, 0x9b, 0x12, 0x04, - 0x00, 0x2b, 0x00, 0xd1, 0x00, 0x22, 0x11, 0x43, - 0xb9, 0xe7, 0x01, 0x22, 0x03, 0x9b, 0x12, 0x04, - 0x00, 0x2b, 0x00, 0xd1, 0x00, 0x22, 0x11, 0x43, - 0xd0, 0xe7, 0xa1, 0x6c, 0x4a, 0x1c, 0xa2, 0x64, - 0x04, 0x29, 0x1a, 0xd9, 0xe1, 0x1d, 0x79, 0x31, - 0x89, 0x6a, 0x7e, 0x4d, 0x88, 0x62, 0xe0, 0x60, - 0x39, 0x68, 0x20, 0x1c, 0xfd, 0xf7, 0xcf, 0xf9, - 0xf8, 0x68, 0x04, 0x28, 0x07, 0xd2, 0x01, 0x30, - 0xf8, 0x60, 0x01, 0x20, 0x21, 0x1c, 0x2a, 0x6b, - 0xf5, 0xf7, 0x68, 0xfd, 0xd1, 0xe7, 0x00, 0x20, - 0xf8, 0x60, 0x02, 0x20, 0xf2, 0xf7, 0x2e, 0xfd, - 0xcb, 0xe7, 0x3a, 0x1d, 0x06, 0xca, 0xb3, 0x6b, - 0x03, 0x92, 0x18, 0x0e, 0x1a, 0x02, 0x12, 0x0a, - 0x01, 0x90, 0xe0, 0x1d, 0xff, 0x30, 0x7a, 0x30, - 0x00, 0x92, 0x02, 0x91, 0x42, 0x68, 0x61, 0x6c, - 0x05, 0x98, 0x08, 0x23, 0xf4, 0xf7, 0xee, 0xff, - 0x04, 0x90, 0x7a, 0x68, 0x61, 0x6c, 0x05, 0x98, - 0xf4, 0xf7, 0x81, 0xfe, 0x20, 0x23, 0xb1, 0x6b, - 0x18, 0x43, 0x09, 0x0e, 0xed, 0x09, 0x00, 0x02, - 0x01, 0x00, 0x02, 0x69, 0x4f, 0x08, 0x43, 0x78, - 0x60, 0x68, 0x49, 0x28, 0x1c, 0x0c, 0x68, 0x71, - 0x69, 0x01, 0x29, 0x73, 0xd0, 0x02, 0x29, 0x21, - 0xd1, 0x09, 0x21, 0x00, 0xf0, 0x61, 0xfe, 0xc8, - 0x22, 0x00, 0xf0, 0x68, 0xfe, 0x34, 0x22, 0x00, - 0xf0, 0x65, 0xfe, 0x50, 0x22, 0x00, 0xf0, 0x62, - 0xfe, 0x0d, 0x22, 0x00, 0xf0, 0x5f, 0xfe, 0x04, - 0x22, 0x00, 0xf0, 0x5c, 0xfe, 0x28, 0x22, 0x00, - 0xf0, 0x59, 0xfe, 0x04, 0x99, 0x02, 0x31, 0x09, - 0x02, 0x10, 0x22, 0x0a, 0x43, 0x58, 0x49, 0x0a, - 0x62, 0x42, 0x22, 0x22, 0x43, 0x12, 0x02, 0x11, - 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x55, 0x4a, 0x56, - 0x49, 0x0a, 0x62, 0x08, 0x60, 0x51, 0x48, 0x01, - 0x68, 0x72, 0x69, 0x54, 0x48, 0x01, 0x2a, 0x74, - 0xd0, 0x02, 0x2a, 0x05, 0xd1, 0x40, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x01, - 0x62, 0xe8, 0x1d, 0x49, 0x30, 0xff, 0x22, 0x4e, - 0x49, 0x02, 0x32, 0x0a, 0x62, 0x08, 0x60, 0x72, - 0x69, 0x3e, 0x21, 0x3d, 0x20, 0x01, 0x2a, 0x61, - 0xd0, 0x02, 0x2a, 0x04, 0xd1, 0x40, 0x4a, 0x2d, - 0x23, 0x13, 0x62, 0x2c, 0x23, 0x53, 0x62, 0x47, - 0x4b, 0x47, 0x4c, 0xea, 0x1d, 0x21, 0x32, 0x23, - 0x62, 0x27, 0x23, 0x1b, 0x01, 0x22, 0x60, 0xea, - 0x18, 0x73, 0x69, 0x01, 0x2b, 0x5c, 0xd0, 0x02, - 0x2b, 0x04, 0xd1, 0x38, 0x48, 0x2d, 0x23, 0x03, - 0x62, 0x2c, 0x23, 0x43, 0x62, 0xd0, 0x1d, 0x3d, - 0x4b, 0x3e, 0x49, 0x21, 0x30, 0x05, 0x24, 0x0b, - 0x62, 0x08, 0x60, 0xb1, 0x6a, 0x28, 0x1c, 0x00, - 0x29, 0x00, 0xd1, 0x01, 0x24, 0x71, 0x69, 0x01, - 0x29, 0x4a, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x09, - 0x21, 0x00, 0xf0, 0xf6, 0xfd, 0xc1, 0x1f, 0x21, - 0x39, 0xb9, 0x60, 0x00, 0xe0, 0x0d, 0xe0, 0xed, - 0x09, 0x00, 0x03, 0x01, 0xff, 0x30, 0xff, 0x30, - 0xff, 0x30, 0x23, 0x30, 0xf8, 0x60, 0x32, 0x20, - 0x3c, 0x60, 0x01, 0xf0, 0x8a, 0xfb, 0x1f, 0x48, - 0x45, 0x60, 0x05, 0x9a, 0x02, 0x60, 0x21, 0xe7, - 0x10, 0x21, 0x00, 0xf0, 0xe0, 0xfd, 0xff, 0x22, - 0x05, 0x32, 0x00, 0xf0, 0xe6, 0xfd, 0x46, 0x22, - 0x00, 0xf0, 0xe3, 0xfd, 0x0d, 0x22, 0x00, 0xf0, - 0xe0, 0xfd, 0x04, 0x22, 0x00, 0xf0, 0xdd, 0xfd, - 0x28, 0x22, 0x00, 0xf0, 0xda, 0xfd, 0x04, 0x99, - 0x02, 0x31, 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, - 0x19, 0x49, 0x0a, 0x62, 0x82, 0x22, 0x22, 0x43, - 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, 0x01, 0xe0, - 0x02, 0xe0, 0x08, 0xe0, 0x4a, 0x62, 0x7c, 0xe7, - 0x80, 0x23, 0x19, 0x43, 0x09, 0x02, 0x10, 0x23, - 0x19, 0x43, 0x01, 0x62, 0x87, 0xe7, 0x0b, 0x4a, - 0x10, 0x62, 0x51, 0x62, 0x96, 0xe7, 0x0a, 0x4b, - 0x18, 0x62, 0x59, 0x62, 0xa5, 0xe7, 0x10, 0x21, - 0x00, 0xf0, 0xad, 0xfd, 0x02, 0xaa, 0x03, 0xc2, - 0x02, 0x98, 0x03, 0x99, 0xb1, 0xe7, 0x34, 0xf3, - 0x03, 0x20, 0xc4, 0x09, 0x00, 0x00, 0x48, 0xe6, - 0x03, 0x20, 0x74, 0x03, 0x04, 0x20, 0xc0, 0x55, - 0x00, 0xe0, 0xd0, 0x55, 0x00, 0xe0, 0x00, 0x51, - 0x00, 0xe0, 0x88, 0xe5, 0x03, 0x20, 0xa0, 0x55, - 0x00, 0xe0, 0x02, 0x05, 0x00, 0x00, 0x08, 0x53, - 0x00, 0xe0, 0xb0, 0x55, 0x00, 0xe0, 0x0c, 0x53, - 0x00, 0xe0, 0x02, 0x03, 0x00, 0x00, 0x10, 0x53, - 0x00, 0xe0, 0x14, 0x53, 0x00, 0xe0, 0xf0, 0xb5, - 0x86, 0xb0, 0x94, 0x4d, 0x69, 0x68, 0x94, 0x4b, - 0xcf, 0x18, 0x29, 0x68, 0x94, 0x4b, 0x04, 0x31, - 0x05, 0x91, 0x29, 0x6b, 0xee, 0x6a, 0x04, 0x91, - 0x1a, 0x68, 0x91, 0x4b, 0x19, 0x6a, 0x5c, 0x6a, - 0x09, 0x0a, 0xff, 0x23, 0x1b, 0x02, 0x23, 0x40, - 0x8f, 0x4c, 0xed, 0x09, 0x00, 0x04, 0x01, 0x19, - 0x43, 0x63, 0x69, 0x01, 0x2b, 0x29, 0xd0, 0x02, - 0x2b, 0x07, 0xd1, 0xda, 0x03, 0x0b, 0x0c, 0x00, - 0xd2, 0x00, 0x22, 0x11, 0x43, 0x01, 0x23, 0xdb, - 0x03, 0x99, 0x43, 0x88, 0x4d, 0x4a, 0x04, 0x2b, - 0x68, 0x52, 0x0c, 0x5b, 0x04, 0x5b, 0x0c, 0x9a, - 0x42, 0x00, 0xd9, 0x29, 0x60, 0xc1, 0x07, 0xc9, - 0x0f, 0x07, 0x20, 0x00, 0x29, 0x18, 0xd0, 0xf1, - 0x1d, 0x79, 0x31, 0x89, 0x6a, 0x88, 0x62, 0xf0, - 0x60, 0x29, 0x68, 0x30, 0x1c, 0xfd, 0xf7, 0x7e, - 0xf8, 0x00, 0x20, 0xe8, 0x60, 0x02, 0x20, 0xf2, - 0xf7, 0xe8, 0xfb, 0x06, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x01, 0x23, 0x1b, 0x04, 0x00, - 0x2a, 0x00, 0xd1, 0x00, 0x23, 0x19, 0x43, 0xd8, - 0xe7, 0xf1, 0x6c, 0x4a, 0x1c, 0xf2, 0x64, 0x04, - 0x29, 0x1a, 0xd9, 0xf1, 0x1d, 0x79, 0x31, 0x89, - 0x6a, 0x6c, 0x4f, 0x88, 0x62, 0xf0, 0x60, 0x29, - 0x68, 0x30, 0x1c, 0xfd, 0xf7, 0x5f, 0xf8, 0xe8, - 0x68, 0x04, 0x28, 0x07, 0xd2, 0x01, 0x30, 0xe8, - 0x60, 0x01, 0x20, 0x31, 0x1c, 0x3a, 0x6b, 0xf5, - 0xf7, 0xf8, 0xfb, 0xda, 0xe7, 0x00, 0x20, 0xe8, - 0x60, 0x02, 0x20, 0xf2, 0xf7, 0xbe, 0xfb, 0xd4, - 0xe7, 0x2a, 0x1d, 0x06, 0xca, 0x04, 0x98, 0x03, - 0x69, 0x03, 0x92, 0x18, 0x0e, 0x1a, 0x02, 0x12, - 0x0a, 0x00, 0x92, 0x00, 0x22, 0x09, 0x23, 0x01, - 0x90, 0x02, 0x91, 0x00, 0x21, 0x05, 0x98, 0xf4, - 0xf7, 0x80, 0xfe, 0x06, 0x1c, 0x04, 0x98, 0x00, - 0x69, 0x05, 0x99, 0x00, 0x0e, 0x49, 0x08, 0x09, - 0x02, 0x08, 0x43, 0x59, 0x49, 0x48, 0x60, 0x54, - 0x49, 0x38, 0x1c, 0x0d, 0x68, 0x61, 0x69, 0x01, - 0x29, 0x68, 0xd0, 0x02, 0x29, 0x20, 0xd1, 0x09, - 0x21, 0x00, 0xf0, 0xf7, 0xfc, 0xc8, 0x22, 0x00, - 0xf0, 0xfe, 0xfc, 0x34, 0x22, 0xed, 0x09, 0x00, - 0x05, 0x01, 0x00, 0xf0, 0xfb, 0xfc, 0x50, 0x22, - 0x00, 0xf0, 0xf8, 0xfc, 0x0d, 0x22, 0x00, 0xf0, - 0xf5, 0xfc, 0x04, 0x22, 0x00, 0xf0, 0xf2, 0xfc, - 0x28, 0x22, 0x00, 0xf0, 0xef, 0xfc, 0xb1, 0x1c, - 0x09, 0x02, 0x10, 0x22, 0x0a, 0x43, 0x49, 0x49, - 0x0a, 0x62, 0x42, 0x22, 0x2a, 0x43, 0x12, 0x02, - 0x11, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x46, 0x4a, - 0x46, 0x49, 0x0a, 0x62, 0x08, 0x60, 0x3e, 0x48, - 0x01, 0x68, 0x62, 0x69, 0x44, 0x48, 0x01, 0x2a, - 0x5c, 0xd0, 0x02, 0x2a, 0x05, 0xd1, 0x40, 0x23, - 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, - 0x01, 0x62, 0xf8, 0x1d, 0x49, 0x30, 0xff, 0x22, - 0x3e, 0x49, 0x02, 0x32, 0x0a, 0x62, 0x08, 0x60, - 0x60, 0x69, 0x01, 0x28, 0x51, 0xd0, 0x02, 0x28, - 0x04, 0xd1, 0x32, 0x4b, 0x2d, 0x20, 0x18, 0x62, - 0x2c, 0x20, 0x58, 0x62, 0x38, 0x4a, 0x39, 0x48, - 0xf9, 0x1d, 0x21, 0x31, 0x02, 0x62, 0x01, 0x60, - 0xa1, 0x6a, 0x38, 0x1c, 0x05, 0x25, 0x00, 0x29, - 0x00, 0xd1, 0x01, 0x25, 0x61, 0x69, 0x01, 0x29, - 0x41, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x09, 0x21, - 0x00, 0xf0, 0xa2, 0xfc, 0xc1, 0x1f, 0x28, 0x4a, - 0x21, 0x39, 0x91, 0x60, 0xb0, 0x30, 0xd0, 0x60, - 0x32, 0x20, 0x15, 0x60, 0x01, 0xf0, 0x3a, 0xfa, - 0x1d, 0x48, 0x47, 0x60, 0x05, 0x99, 0x01, 0x60, - 0x4a, 0xe7, 0xff, 0xe7, 0x10, 0x21, 0x00, 0xf0, - 0x8f, 0xfc, 0xff, 0x22, 0x05, 0x32, 0x00, 0xf0, - 0x95, 0xfc, 0x46, 0x22, 0x00, 0xf0, 0x92, 0xfc, - 0x0d, 0x22, 0x00, 0xf0, 0x8f, 0xfc, 0x04, 0x22, - 0x00, 0xf0, 0x8c, 0xfc, 0x28, 0x22, 0x00, 0xf0, - 0x89, 0xfc, 0xb1, 0x1c, 0x09, 0x02, 0x20, 0x22, - 0x0a, 0x43, 0x16, 0x49, 0x0a, 0x62, 0x82, 0x22, - 0x2a, 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, - 0xed, 0x09, 0x00, 0x06, 0x01, 0x4a, 0x62, 0x98, - 0xe7, 0x80, 0x23, 0x19, 0x43, 0x09, 0x02, 0x10, - 0x23, 0x19, 0x43, 0x01, 0x62, 0xa3, 0xe7, 0x0a, - 0x4b, 0x3d, 0x20, 0x18, 0x62, 0x3e, 0x20, 0x58, - 0x62, 0xae, 0xe7, 0x10, 0x21, 0x00, 0xf0, 0x62, - 0xfc, 0x02, 0xaa, 0x03, 0xc2, 0x02, 0x98, 0x03, - 0x99, 0xba, 0xe7, 0x00, 0x00, 0x34, 0xf3, 0x03, - 0x20, 0xc4, 0x09, 0x00, 0x00, 0x88, 0xe5, 0x03, - 0x20, 0xc0, 0x55, 0x00, 0xe0, 0x48, 0xe6, 0x03, - 0x20, 0x74, 0x03, 0x04, 0x20, 0x00, 0x51, 0x00, - 0xe0, 0xa0, 0x55, 0x00, 0xe0, 0x02, 0x05, 0x00, - 0x00, 0x08, 0x53, 0x00, 0xe0, 0xb0, 0x55, 0x00, - 0xe0, 0x0c, 0x53, 0x00, 0xe0, 0x02, 0x03, 0x00, - 0x00, 0x10, 0x53, 0x00, 0xe0, 0x70, 0x47, 0x00, - 0xb5, 0x00, 0x20, 0xff, 0xf7, 0xb3, 0xfe, 0x08, - 0xbc, 0x18, 0x47, 0xf1, 0xb5, 0x88, 0xb0, 0xad, - 0x49, 0x48, 0x68, 0x0c, 0x6b, 0xce, 0x6a, 0xac, - 0x4b, 0xc7, 0x18, 0x08, 0x68, 0x85, 0x1c, 0xab, - 0x48, 0x80, 0x6a, 0x42, 0x07, 0x52, 0x0f, 0x05, - 0xab, 0x1a, 0x70, 0x42, 0x06, 0x12, 0x0f, 0x06, - 0x92, 0x02, 0x06, 0xd2, 0x0f, 0x5a, 0x70, 0xc2, - 0x05, 0xd2, 0x0f, 0x9a, 0x70, 0x80, 0x05, 0xc0, - 0x0f, 0xd8, 0x70, 0x17, 0x20, 0xa2, 0x4a, 0x40, - 0x01, 0xd0, 0x60, 0xa2, 0x4a, 0x00, 0x20, 0x10, - 0x60, 0x06, 0x9a, 0x01, 0x2a, 0x08, 0xd0, 0x06, - 0x9a, 0x03, 0x2a, 0x05, 0xd0, 0xff, 0xf7, 0x86, - 0xfe, 0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x9b, 0x49, 0x00, 0x20, 0x07, 0x91, 0xc8, - 0x60, 0xf1, 0x1d, 0x51, 0x31, 0x0c, 0xc9, 0x99, - 0x48, 0x0c, 0xc0, 0x07, 0x99, 0x8a, 0x68, 0x49, - 0x68, 0x23, 0x69, 0x03, 0x92, 0x18, 0x0e, 0x1a, - 0x02, 0x12, 0x0a, 0x00, 0x92, 0x02, 0x91, 0x00, - 0x21, 0x00, 0x22, 0xed, 0x09, 0x00, 0x07, 0x01, - 0x09, 0x23, 0x01, 0x90, 0x28, 0x1c, 0xf4, 0xf7, - 0x64, 0xfd, 0x04, 0x90, 0x20, 0x69, 0x00, 0x0e, - 0x69, 0x08, 0x09, 0x02, 0x08, 0x43, 0x8d, 0x49, - 0x48, 0x60, 0x8d, 0x49, 0x8a, 0x68, 0xcd, 0x1d, - 0x01, 0x92, 0xca, 0x68, 0xb9, 0x35, 0x02, 0x92, - 0x08, 0x69, 0x03, 0x90, 0x68, 0x69, 0x01, 0x28, - 0x4a, 0xd0, 0x02, 0x28, 0x2c, 0xd1, 0x87, 0x49, - 0x03, 0x20, 0xc8, 0x62, 0x06, 0x21, 0x38, 0x1c, - 0x00, 0xf0, 0xe5, 0xfb, 0xc8, 0x22, 0x00, 0xf0, - 0xda, 0xfb, 0x02, 0x9a, 0x52, 0x00, 0x00, 0xf0, - 0xd6, 0xfb, 0x28, 0x22, 0x00, 0xf0, 0xd3, 0xfb, - 0x03, 0x22, 0x00, 0xf0, 0xe0, 0xfb, 0x04, 0x99, - 0x7d, 0x4a, 0x02, 0x31, 0x09, 0x02, 0x10, 0x23, - 0x19, 0x43, 0x11, 0x62, 0x01, 0x99, 0xc9, 0x00, - 0x44, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, 0x23, - 0x19, 0x43, 0x51, 0x62, 0x03, 0x99, 0x09, 0x02, - 0x16, 0x23, 0x19, 0x43, 0x91, 0x62, 0x74, 0x49, - 0x08, 0x60, 0x05, 0x20, 0x00, 0x02, 0x08, 0x62, - 0x70, 0x49, 0x72, 0x48, 0x8a, 0x68, 0x6b, 0x69, - 0x01, 0x2b, 0x40, 0xd0, 0x02, 0x2b, 0x06, 0xd1, - 0xd2, 0x00, 0x40, 0x23, 0x1a, 0x43, 0x12, 0x02, - 0x11, 0x23, 0x1a, 0x43, 0x02, 0x62, 0xf8, 0x1d, - 0x5d, 0x30, 0xff, 0x22, 0x6b, 0x4b, 0x02, 0x32, - 0x1a, 0x62, 0x18, 0x60, 0xaa, 0x6a, 0x38, 0x1c, - 0x00, 0x2a, 0x34, 0xd0, 0x05, 0x27, 0x33, 0xe0, - 0x06, 0x21, 0x38, 0x1c, 0x00, 0xf0, 0x9f, 0xfb, - 0xff, 0x22, 0x05, 0x32, 0x00, 0xf0, 0x93, 0xfb, - 0x02, 0x9a, 0x52, 0x00, 0x00, 0xf0, 0x8f, 0xfb, - 0x28, 0x22, 0x00, 0xf0, 0x8c, 0xfb, 0x03, 0x22, - 0x00, 0xf0, 0x99, 0xfb, 0x04, 0x99, 0x02, 0x31, - 0x09, 0x02, 0x20, 0x22, 0x0a, 0x43, 0x57, 0x49, - 0x0a, 0x62, 0x01, 0x9a, 0xd2, 0x00, 0xed, 0x09, - 0x00, 0x08, 0x01, 0x84, 0x23, 0x1a, 0x43, 0x12, - 0x02, 0x10, 0x23, 0x1a, 0x43, 0x4a, 0x62, 0x03, - 0x9a, 0x12, 0x02, 0x19, 0x23, 0x1a, 0x43, 0x8a, - 0x62, 0x51, 0x49, 0x08, 0x60, 0x53, 0x48, 0x08, - 0x62, 0xb8, 0xe7, 0xd2, 0x00, 0x80, 0x23, 0x1a, - 0x43, 0x12, 0x02, 0x10, 0x23, 0x1a, 0x43, 0x02, - 0x62, 0xbf, 0xe7, 0x01, 0x27, 0x69, 0x69, 0x01, - 0x29, 0x27, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x06, - 0x21, 0x00, 0xf0, 0x67, 0xfb, 0x43, 0x49, 0x88, - 0x60, 0x00, 0x20, 0x0f, 0x60, 0x07, 0x1c, 0xf0, - 0x1d, 0xff, 0x30, 0x3a, 0x30, 0x87, 0x63, 0xf0, - 0x1d, 0xff, 0x30, 0x1a, 0x30, 0xf4, 0xf7, 0xbf, - 0xf8, 0x05, 0x20, 0xe0, 0x60, 0x37, 0x48, 0x81, - 0x68, 0x41, 0x4b, 0x19, 0x40, 0x81, 0x60, 0xd9, - 0x43, 0xc1, 0x60, 0x81, 0x68, 0x01, 0x23, 0x9b, - 0x02, 0x19, 0x43, 0x81, 0x60, 0x00, 0x21, 0x08, - 0x98, 0xf3, 0xf7, 0x07, 0xff, 0x06, 0x1c, 0x08, - 0xd1, 0x23, 0xe7, 0x06, 0x21, 0x00, 0xf0, 0x41, - 0xfb, 0x02, 0xaa, 0x03, 0xc2, 0x02, 0x98, 0x03, - 0x99, 0xd4, 0xe7, 0x2e, 0x49, 0x35, 0x4a, 0x09, - 0x68, 0x10, 0x6a, 0x52, 0x6a, 0x00, 0x0a, 0xff, - 0x23, 0x1b, 0x02, 0x1a, 0x40, 0x10, 0x43, 0x01, - 0x23, 0x6a, 0x69, 0x1b, 0x04, 0x01, 0x2a, 0x38, - 0xd0, 0x02, 0x2a, 0x07, 0xd1, 0x19, 0x1c, 0x02, - 0x0c, 0x00, 0xd2, 0x00, 0x21, 0x08, 0x43, 0x01, - 0x23, 0xdb, 0x03, 0x98, 0x43, 0x07, 0x99, 0x19, - 0x4d, 0x08, 0x60, 0xb0, 0x64, 0xf0, 0x68, 0x03, - 0x28, 0x08, 0xd1, 0x01, 0x20, 0xf0, 0x60, 0xf0, - 0x69, 0x00, 0x28, 0x01, 0xd0, 0xf0, 0xf7, 0x45, - 0xfa, 0xf7, 0x61, 0xb7, 0x61, 0xf0, 0xf7, 0x46, - 0xfa, 0x00, 0x28, 0x0b, 0xd0, 0x42, 0x21, 0x01, - 0x60, 0xe9, 0x6a, 0x49, 0x68, 0xc1, 0x60, 0x04, - 0x61, 0xed, 0x09, 0x00, 0x09, 0x01, 0x21, 0x7e, - 0x41, 0x61, 0x01, 0x1c, 0x0e, 0x20, 0xf0, 0xf7, - 0xa7, 0xfa, 0xf0, 0xf7, 0x36, 0xfa, 0x00, 0x28, - 0x09, 0xd0, 0x35, 0x21, 0x01, 0x60, 0xe9, 0x6a, - 0x49, 0x68, 0xc1, 0x60, 0x06, 0x61, 0x01, 0x1c, - 0x0e, 0x20, 0xf0, 0xf7, 0x99, 0xfa, 0xd3, 0xe6, - 0x00, 0x29, 0x00, 0xd1, 0x00, 0x23, 0x18, 0x43, - 0xcb, 0xe7, 0x00, 0x00, 0x34, 0xf3, 0x03, 0x20, - 0xe2, 0x04, 0x00, 0x00, 0x40, 0x55, 0x00, 0xe0, - 0x00, 0x50, 0x00, 0xe0, 0x00, 0x51, 0x00, 0xe0, - 0x74, 0x03, 0x04, 0x20, 0x90, 0x57, 0x00, 0xe0, - 0x00, 0x52, 0x00, 0xe0, 0x88, 0xe5, 0x03, 0x20, - 0x80, 0x55, 0x00, 0xe0, 0x00, 0x53, 0x00, 0xe0, - 0x90, 0x55, 0x00, 0xe0, 0x04, 0x53, 0x00, 0xe0, - 0x03, 0x05, 0x00, 0x00, 0x03, 0xf8, 0xfd, 0xff, - 0xc0, 0x55, 0x00, 0xe0, 0x90, 0xb5, 0x84, 0xb0, - 0x13, 0x49, 0xcc, 0x6a, 0x0f, 0x6b, 0x13, 0x49, - 0xf8, 0x1d, 0x0a, 0x68, 0xb9, 0x30, 0x82, 0x60, - 0x8a, 0x68, 0xc2, 0x60, 0xca, 0x68, 0x02, 0x61, - 0x0a, 0x69, 0x42, 0x61, 0x49, 0x68, 0x81, 0x61, - 0x00, 0x21, 0x41, 0x62, 0x38, 0x1c, 0xfc, 0xf7, - 0x62, 0xfa, 0x00, 0x22, 0x03, 0x92, 0x01, 0x21, - 0x1a, 0x20, 0x01, 0x90, 0x02, 0x91, 0x02, 0x22, - 0x00, 0x92, 0x21, 0x1c, 0x20, 0x1c, 0x06, 0x23, - 0x3a, 0x1c, 0xf1, 0xf7, 0xad, 0xff, 0x04, 0xb0, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x34, 0xf3, 0x03, 0x20, 0x88, 0xe5, 0x03, 0x20, - 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x1c, 0x33, 0x48, - 0x33, 0x49, 0xc0, 0x6a, 0x04, 0x90, 0x00, 0x20, - 0x08, 0x63, 0x32, 0x49, 0x32, 0x48, 0xc1, 0x60, - 0x81, 0x68, 0x32, 0x4b, 0x19, 0x40, 0x81, 0x60, - 0xf0, 0xf7, 0xc3, 0xf9, 0x07, 0x1c, 0x08, 0xd1, - 0x00, 0x22, 0x01, 0x20, 0xed, 0x09, 0x00, 0x0a, - 0x01, 0x04, 0x99, 0xf5, 0xf7, 0x49, 0xf9, 0x05, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x21, 0x20, 0x1c, 0xf3, 0xf7, 0x3f, 0xfe, 0x05, - 0x1c, 0x08, 0xd1, 0x38, 0x1c, 0xf0, 0xf7, 0xea, - 0xf9, 0x00, 0x22, 0x01, 0x20, 0x04, 0x99, 0xf5, - 0xf7, 0x37, 0xf9, 0xec, 0xe7, 0x23, 0x48, 0xee, - 0x1d, 0x04, 0x69, 0x45, 0x36, 0xf3, 0xf7, 0xc0, - 0xfb, 0x02, 0x90, 0x21, 0x48, 0x03, 0x91, 0x40, - 0x69, 0x01, 0x28, 0x27, 0xd0, 0x02, 0x28, 0x04, - 0xd1, 0x8e, 0x21, 0x20, 0x1c, 0x00, 0xf0, 0x62, - 0xfa, 0x04, 0x1c, 0x02, 0x98, 0x84, 0x42, 0x02, - 0xd9, 0x03, 0x98, 0x01, 0x38, 0x03, 0x90, 0x03, - 0x99, 0x02, 0x94, 0x71, 0x60, 0x10, 0x48, 0x41, - 0x23, 0x9b, 0x01, 0xc1, 0x18, 0x34, 0x60, 0x09, - 0x68, 0xa9, 0x64, 0x35, 0x21, 0x39, 0x60, 0xc0, - 0x6a, 0x40, 0x68, 0xf8, 0x60, 0x0e, 0x20, 0x39, - 0x1c, 0x3d, 0x61, 0xf0, 0xf7, 0xeb, 0xf9, 0x00, - 0x23, 0x05, 0x22, 0x04, 0x21, 0x04, 0x98, 0xf2, - 0xf7, 0x3d, 0xf8, 0xb8, 0xe7, 0x95, 0x21, 0x20, - 0x1c, 0x00, 0xf0, 0x3c, 0xfa, 0x6a, 0x46, 0x03, - 0xc2, 0x01, 0x99, 0x00, 0x9c, 0xd5, 0xe7, 0x00, - 0x00, 0x34, 0xf3, 0x03, 0x20, 0x00, 0x53, 0x00, - 0xe0, 0x08, 0x01, 0x02, 0x00, 0x00, 0x50, 0x00, - 0xe0, 0xe7, 0xfe, 0xfd, 0xff, 0x00, 0x51, 0x00, - 0xe0, 0x48, 0xe6, 0x03, 0x20, 0xf0, 0xb5, 0x8a, - 0xb0, 0xa7, 0x49, 0xa8, 0x4a, 0xcc, 0x6a, 0x00, - 0x21, 0x11, 0x63, 0xa7, 0x4a, 0xa7, 0x49, 0xca, - 0x60, 0x8a, 0x68, 0xa7, 0x4b, 0x1a, 0x40, 0x8a, - 0x60, 0x00, 0x21, 0xf3, 0xf7, 0xd7, 0xfd, 0x07, - 0x1c, 0x08, 0xd1, 0x00, 0x22, 0x01, 0x20, 0x21, - 0x1c, 0xf5, 0xf7, 0xd2, 0xf8, 0x0a, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x9f, 0x48, 0xed, - 0x09, 0x00, 0x0b, 0x01, 0xfe, 0x1d, 0x05, 0x69, - 0x45, 0x36, 0xf3, 0xf7, 0x58, 0xfb, 0x02, 0x90, - 0x9d, 0x48, 0x03, 0x91, 0x09, 0x90, 0x40, 0x69, - 0x01, 0x28, 0x73, 0xd0, 0x02, 0x28, 0x04, 0xd1, - 0x8e, 0x21, 0x28, 0x1c, 0x00, 0xf0, 0xf9, 0xf9, - 0x05, 0x1c, 0x02, 0x98, 0x85, 0x42, 0x02, 0xd9, - 0x03, 0x98, 0x01, 0x38, 0x03, 0x90, 0x03, 0x99, - 0x02, 0x95, 0x71, 0x60, 0x35, 0x60, 0x03, 0xce, - 0x08, 0x3e, 0x91, 0x4a, 0x00, 0xf0, 0xf1, 0xf9, - 0x05, 0x1c, 0x03, 0xce, 0x8f, 0x4a, 0x00, 0xf0, - 0xec, 0xf9, 0x8e, 0xa3, 0x1a, 0x68, 0x5b, 0x68, - 0x00, 0xf0, 0x4b, 0xf9, 0x06, 0x01, 0x36, 0x09, - 0xb0, 0x08, 0xe1, 0x1d, 0xb9, 0x31, 0x08, 0x91, - 0x88, 0x62, 0x8a, 0x48, 0x07, 0x90, 0x02, 0x1d, - 0x06, 0xca, 0x7e, 0x48, 0x80, 0x6b, 0x02, 0x91, - 0x00, 0x06, 0x00, 0x0e, 0x01, 0x90, 0x7b, 0x48, - 0x03, 0x92, 0x42, 0x6b, 0xe0, 0x1d, 0xff, 0x30, - 0x7a, 0x30, 0x06, 0x90, 0x05, 0x90, 0x00, 0x92, - 0x42, 0x68, 0x05, 0x23, 0x00, 0x21, 0x30, 0x1c, - 0xf4, 0xf7, 0x21, 0xfb, 0x04, 0x90, 0x07, 0x98, - 0x42, 0x68, 0x05, 0x98, 0x41, 0x68, 0x30, 0x1c, - 0xf4, 0xf7, 0xa9, 0xf9, 0x20, 0x23, 0x18, 0x43, - 0x7a, 0x49, 0x00, 0x02, 0x48, 0x60, 0x79, 0x48, - 0x7a, 0x4e, 0x82, 0x68, 0x01, 0x92, 0xc2, 0x68, - 0x02, 0x92, 0x00, 0x69, 0x03, 0x90, 0x09, 0x98, - 0x40, 0x69, 0x01, 0x28, 0x55, 0xd0, 0x02, 0x28, - 0x2c, 0xd1, 0x03, 0x20, 0xf0, 0x62, 0x06, 0x21, - 0x28, 0x1c, 0x00, 0xf0, 0x9e, 0xf9, 0xc8, 0x22, - 0x00, 0xf0, 0x93, 0xf9, 0x02, 0x9a, 0x52, 0x00, - 0x00, 0xf0, 0x8f, 0xf9, 0x28, 0x22, 0x00, 0xf0, - 0x8c, 0xf9, 0x03, 0x22, 0x00, 0xf0, 0x99, 0xf9, - 0x04, 0x99, 0x02, 0x31, 0x09, 0x02, 0x10, 0x23, - 0x19, 0x43, 0xed, 0x09, 0x00, 0x0c, 0x01, 0x00, - 0xe0, 0x30, 0xe0, 0x31, 0x62, 0x01, 0x9a, 0xd1, - 0x00, 0x44, 0x23, 0x19, 0x43, 0x09, 0x02, 0x11, - 0x23, 0x19, 0x43, 0x71, 0x62, 0x03, 0x9a, 0x11, - 0x02, 0x16, 0x23, 0x19, 0x43, 0xb1, 0x62, 0x53, - 0x49, 0x08, 0x60, 0x05, 0x20, 0x00, 0x02, 0x08, - 0x62, 0x5c, 0x48, 0x81, 0x68, 0x09, 0x98, 0x42, - 0x69, 0x5c, 0x48, 0x01, 0x2a, 0x49, 0xd0, 0x02, - 0x2a, 0x06, 0xd1, 0xc9, 0x00, 0x40, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x11, 0x23, 0x19, 0x43, 0x01, - 0x62, 0xe8, 0x1d, 0x5d, 0x30, 0xff, 0x22, 0x55, - 0x49, 0x02, 0x32, 0x0a, 0x62, 0x08, 0x60, 0x09, - 0x99, 0x28, 0x1c, 0x89, 0x6a, 0x00, 0x29, 0x3c, - 0xd0, 0x05, 0x26, 0x3b, 0xe0, 0x95, 0x21, 0x28, - 0x1c, 0x00, 0xf0, 0x55, 0xf9, 0x6a, 0x46, 0x03, - 0xc2, 0x01, 0x99, 0x00, 0x9d, 0x57, 0xe7, 0x06, - 0x21, 0x28, 0x1c, 0x00, 0xf0, 0x4c, 0xf9, 0xff, - 0x22, 0x05, 0x32, 0x00, 0xf0, 0x40, 0xf9, 0x02, - 0x9a, 0x52, 0x00, 0x00, 0xf0, 0x3c, 0xf9, 0x28, - 0x22, 0x00, 0xf0, 0x39, 0xf9, 0x03, 0x22, 0x00, - 0xf0, 0x46, 0xf9, 0x04, 0x99, 0x02, 0x31, 0x09, - 0x02, 0x20, 0x22, 0x0a, 0x43, 0x32, 0x62, 0x01, - 0x9a, 0xd2, 0x00, 0x84, 0x23, 0x1a, 0x43, 0x12, - 0x02, 0x10, 0x23, 0x1a, 0x43, 0x72, 0x62, 0x03, - 0x9a, 0x12, 0x02, 0x19, 0x23, 0x1a, 0x43, 0xb2, - 0x62, 0x2b, 0x49, 0x08, 0x60, 0x39, 0x48, 0x08, - 0x62, 0xae, 0xe7, 0xc9, 0x00, 0x80, 0x23, 0x19, - 0x43, 0x09, 0x02, 0x10, 0x23, 0x19, 0x43, 0x01, - 0x62, 0xb6, 0xe7, 0x01, 0x26, 0x09, 0x99, 0x49, - 0x69, 0x01, 0x29, 0x26, 0xd0, 0x02, 0x29, 0x02, - 0xd1, 0x06, 0x21, 0x00, 0xf0, 0x14, 0xf9, 0x29, - 0x49, 0x88, 0x60, 0x0e, 0x60, 0xe1, 0x1d, 0x00, - 0x20, 0xf9, 0x31, 0x88, 0x61, 0xed, 0x09, 0x00, - 0x0d, 0x01, 0x08, 0x98, 0xf3, 0xf7, 0x70, 0xfe, - 0x06, 0x98, 0x40, 0x68, 0x06, 0x99, 0x01, 0x30, - 0x48, 0x60, 0xe1, 0x1d, 0x03, 0x20, 0x79, 0x31, - 0xc9, 0x6b, 0x88, 0x62, 0xe0, 0x60, 0xf0, 0xf7, - 0x32, 0xf8, 0x00, 0x28, 0x10, 0xd1, 0x38, 0x1c, - 0xf0, 0xf7, 0x8e, 0xf8, 0x00, 0x22, 0x01, 0x20, - 0x21, 0x1c, 0xf4, 0xf7, 0xb5, 0xff, 0xe1, 0xe6, - 0x06, 0x21, 0x00, 0xf0, 0xef, 0xf8, 0x02, 0xaa, - 0x03, 0xc2, 0x02, 0x98, 0x03, 0x99, 0xd5, 0xe7, - 0x07, 0x9a, 0x09, 0x49, 0x12, 0x68, 0xba, 0x64, - 0x35, 0x22, 0x02, 0x60, 0xc9, 0x6a, 0x49, 0x68, - 0xc1, 0x60, 0x07, 0x61, 0x01, 0x1c, 0x0e, 0x20, - 0xf0, 0xf7, 0x80, 0xf8, 0x00, 0x22, 0x01, 0x20, - 0x21, 0x1c, 0xf4, 0xf7, 0x99, 0xff, 0xc5, 0xe6, - 0x34, 0xf3, 0x03, 0x20, 0x00, 0x53, 0x00, 0xe0, - 0x08, 0x01, 0x02, 0x00, 0x00, 0x50, 0x00, 0xe0, - 0xe7, 0xfe, 0xfd, 0xff, 0x00, 0x51, 0x00, 0xe0, - 0x48, 0xe6, 0x03, 0x20, 0xe2, 0x04, 0x00, 0x00, - 0x71, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x74, 0x03, 0x04, 0x20, 0x00, 0x52, 0x00, 0xe0, - 0x88, 0xe5, 0x03, 0x20, 0x80, 0x55, 0x00, 0xe0, - 0x90, 0x55, 0x00, 0xe0, 0x04, 0x53, 0x00, 0xe0, - 0x03, 0x05, 0x00, 0x00, 0x78, 0x47, 0x00, 0x00, - 0x02, 0x00, 0x50, 0xe0, 0x03, 0x00, 0x51, 0x01, - 0x01, 0x00, 0xa0, 0x13, 0x1e, 0xff, 0x2f, 0xe1, - 0x78, 0x47, 0x00, 0x00, 0x20, 0x30, 0x52, 0xe2, - 0x04, 0x00, 0x00, 0x5a, 0x20, 0x30, 0x62, 0xe2, - 0x30, 0x02, 0xa0, 0xe1, 0x11, 0x03, 0x80, 0xe1, - 0x31, 0x12, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, - 0x31, 0x03, 0xa0, 0xe1, 0x00, 0x10, 0xa0, 0xe3, - 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, - 0x70, 0x40, 0x2d, 0xe9, 0x00, 0x40, 0xa0, 0xe1, - 0xed, 0x09, 0x00, 0x0e, 0x01, 0x01, 0x50, 0xa0, - 0xe1, 0x02, 0x60, 0xa0, 0xe1, 0x03, 0xe0, 0xa0, - 0xe1, 0x00, 0x00, 0xa0, 0xe3, 0x00, 0x10, 0xa0, - 0xe3, 0x05, 0x30, 0xa0, 0xe1, 0x04, 0x20, 0xa0, - 0xe1, 0x00, 0x00, 0x3e, 0xe3, 0x00, 0x00, 0x36, - 0x03, 0x14, 0x00, 0x00, 0x0a, 0x00, 0xc0, 0xb0, - 0xe3, 0x06, 0x60, 0x96, 0xe0, 0x0e, 0xe0, 0xbe, - 0xe0, 0x04, 0x00, 0x00, 0x2a, 0x03, 0x00, 0x5e, - 0xe1, 0x02, 0x00, 0x56, 0x01, 0x01, 0xc0, 0x8c, - 0x92, 0xf8, 0xff, 0xff, 0x9a, 0x00, 0xc0, 0x9c, - 0xe2, 0x6e, 0xe0, 0xb0, 0xe1, 0x66, 0x60, 0xa0, - 0xe1, 0x06, 0x40, 0x52, 0xe0, 0x0e, 0x50, 0xd3, - 0xe0, 0x05, 0x30, 0xa0, 0x21, 0x04, 0x20, 0xa0, - 0x21, 0x00, 0x00, 0xb0, 0xe0, 0x01, 0x10, 0xa1, - 0xe0, 0xae, 0xe0, 0xb0, 0xe1, 0x66, 0x60, 0xa0, - 0xe1, 0x01, 0xc0, 0x5c, 0xe2, 0xf5, 0xff, 0xff, - 0xaa, 0x70, 0x40, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, - 0xe1, 0x78, 0x47, 0x00, 0x00, 0x03, 0x00, 0x51, - 0xe1, 0x02, 0x00, 0x50, 0x01, 0x01, 0x00, 0xa0, - 0x83, 0x00, 0x00, 0xa0, 0x93, 0x1e, 0xff, 0x2f, - 0xe1, 0x78, 0x47, 0x00, 0x00, 0x03, 0x00, 0x51, - 0xe1, 0x02, 0x00, 0x50, 0x01, 0x01, 0x00, 0xa0, - 0x93, 0x00, 0x00, 0xa0, 0x83, 0x1e, 0xff, 0x2f, - 0xe1, 0x78, 0x47, 0x00, 0x00, 0x03, 0x00, 0x51, - 0xe1, 0x02, 0x00, 0x50, 0x01, 0x01, 0x00, 0xa0, - 0x23, 0x00, 0x00, 0xa0, 0x33, 0x1e, 0xff, 0x2f, - 0xe1, 0x78, 0x47, 0x00, 0x00, 0x20, 0x30, 0x52, - 0xe2, 0x04, 0x00, 0x00, 0x5a, 0x20, 0x30, 0x62, - 0xe2, 0x11, 0x12, 0xa0, 0xe1, 0x30, 0x13, 0x81, - 0xe1, 0x10, 0x02, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, - 0xe1, 0x10, 0x13, 0xa0, 0xe1, 0x00, 0x00, 0xa0, - 0xe3, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, - 0x00, 0x00, 0x20, 0xed, 0x09, 0x00, 0x0f, 0x01, - 0xa0, 0xe3, 0x01, 0x00, 0x90, 0xe0, 0x00, 0x10, - 0xa2, 0xe2, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, - 0x00, 0x00, 0x02, 0x00, 0x50, 0xe0, 0x00, 0x10, - 0xc1, 0xe2, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, - 0x00, 0x00, 0x01, 0x00, 0x50, 0xe0, 0x01, 0x10, - 0xc1, 0xe0, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, - 0x00, 0x00, 0x02, 0x00, 0x90, 0xe0, 0x00, 0x10, - 0xa1, 0xe2, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, - 0x00, 0x00, 0x03, 0x00, 0x51, 0xe1, 0x02, 0x00, - 0x50, 0x01, 0x01, 0x00, 0xa0, 0x33, 0x00, 0x00, - 0xa0, 0x23, 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, - 0x00, 0x00, 0x02, 0x21, 0x10, 0xe2, 0x00, 0x00, - 0x60, 0x42, 0x41, 0x30, 0x32, 0xe0, 0x00, 0x10, - 0x61, 0x22, 0xa1, 0xc1, 0x70, 0xe0, 0x20, 0x00, - 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x0f, 0x00, - 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x24, - 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, 0x17, 0x00, - 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x09, 0x00, - 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x28, - 0x82, 0xe3, 0x21, 0xc4, 0x70, 0xe0, 0x00, 0x04, - 0xa0, 0x21, 0xff, 0x2c, 0x82, 0x23, 0x21, 0xc2, - 0x70, 0xe0, 0x0e, 0x00, 0x00, 0x3a, 0x00, 0xc0, - 0x70, 0xe2, 0x7a, 0xbe, 0xff, 0x2a, 0x20, 0x04, - 0xa0, 0x21, 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, - 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, - 0x70, 0xe0, 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, - 0xa2, 0xe0, 0xa1, 0xc2, 0x70, 0xe0, 0x80, 0x12, - 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc2, - 0x70, 0xe0, 0x00, 0x12, 0x41, 0x20, 0x02, 0x20, - 0xa2, 0xe0, 0xa1, 0xc1, 0x70, 0xe0, 0x80, 0x11, - 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc1, - 0x70, 0xe0, 0x00, 0x11, 0x41, 0x20, 0xed, 0x09, - 0x00, 0x10, 0x01, 0x02, 0x20, 0xa2, 0xe0, 0xa1, - 0xc0, 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, 0x02, - 0x20, 0xa2, 0xe0, 0x01, 0xc0, 0x70, 0xe0, 0x00, - 0x10, 0x41, 0x20, 0x02, 0x20, 0xb2, 0xe0, 0xe5, - 0xff, 0xff, 0x2a, 0xc3, 0x0f, 0x32, 0xe0, 0xa3, - 0x0f, 0x80, 0xe0, 0x00, 0x10, 0x61, 0x22, 0x1e, - 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x02, - 0x00, 0x90, 0xe0, 0xc2, 0x1f, 0xa1, 0xe0, 0x1e, - 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x20, - 0x30, 0x52, 0xe2, 0x04, 0x00, 0x00, 0x5a, 0x20, - 0x30, 0x62, 0xe2, 0x30, 0x02, 0xa0, 0xe1, 0x11, - 0x03, 0x80, 0xe1, 0x51, 0x12, 0xa0, 0xe1, 0x1e, - 0xff, 0x2f, 0xe1, 0x51, 0x03, 0xa0, 0xe1, 0xc1, - 0x1f, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x78, - 0x47, 0x00, 0x00, 0xf0, 0x40, 0x2d, 0xe9, 0x02, - 0x40, 0xa0, 0xe1, 0x03, 0x50, 0xa0, 0xe1, 0x00, - 0x60, 0xa0, 0xe1, 0x01, 0x70, 0xa0, 0xe1, 0x1d, - 0x00, 0x00, 0xea, 0x78, 0x47, 0x00, 0x00, 0xc2, - 0x3f, 0xa0, 0xe1, 0x52, 0xbe, 0xff, 0xea, 0x78, - 0x47, 0x00, 0x00, 0x02, 0x00, 0x70, 0xe0, 0x03, - 0x10, 0xe1, 0xe0, 0x1e, 0xff, 0x2f, 0xe1, 0x78, - 0x47, 0x00, 0x00, 0x03, 0x00, 0x51, 0xe1, 0x01, - 0x00, 0xa0, 0xc3, 0x00, 0x00, 0xa0, 0xb3, 0x1e, - 0xff, 0x2f, 0x11, 0x02, 0x00, 0x50, 0xe1, 0x01, - 0x00, 0xa0, 0x83, 0x00, 0x00, 0xa0, 0x93, 0x1e, - 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x01, - 0x00, 0x70, 0xe0, 0x01, 0x10, 0xe1, 0xe0, 0x1e, - 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x00, - 0x00, 0x70, 0xe2, 0x00, 0x10, 0xe1, 0xe2, 0x1e, - 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0xf0, - 0x40, 0x2d, 0xe9, 0x00, 0x40, 0xa0, 0xe1, 0x01, - 0x50, 0xa0, 0xe1, 0x02, 0x60, 0xa0, 0xe1, 0x03, - 0x70, 0xed, 0x09, 0x00, 0x11, 0x01, 0xa0, 0xe1, - 0x02, 0xc1, 0x17, 0xe2, 0x01, 0x00, 0x00, 0x5a, - 0x00, 0x60, 0x76, 0xe2, 0x00, 0x70, 0xe7, 0xe2, - 0x45, 0xc0, 0x3c, 0xe0, 0x01, 0x00, 0x00, 0x3a, - 0x00, 0x40, 0x74, 0xe2, 0x00, 0x50, 0xe5, 0xe2, - 0x00, 0x00, 0xa0, 0xe3, 0x00, 0x10, 0xa0, 0xe3, - 0x05, 0x30, 0xa0, 0xe1, 0x04, 0x20, 0xa0, 0xe1, - 0x00, 0x00, 0x37, 0xe3, 0x00, 0x00, 0x36, 0x03, - 0x14, 0x00, 0x00, 0x0a, 0x00, 0xe0, 0xb0, 0xe3, - 0x06, 0x60, 0x96, 0xe0, 0x07, 0x70, 0xb7, 0xe0, - 0x04, 0x00, 0x00, 0x2a, 0x03, 0x00, 0x57, 0xe1, - 0x02, 0x00, 0x56, 0x01, 0x01, 0xe0, 0x8e, 0x92, - 0xf8, 0xff, 0xff, 0x9a, 0x00, 0xe0, 0x9e, 0xe2, - 0x67, 0x70, 0xb0, 0xe1, 0x66, 0x60, 0xa0, 0xe1, - 0x06, 0x40, 0x52, 0xe0, 0x07, 0x50, 0xd3, 0xe0, - 0x05, 0x30, 0xa0, 0x21, 0x04, 0x20, 0xa0, 0x21, - 0x00, 0x00, 0xb0, 0xe0, 0x01, 0x10, 0xa1, 0xe0, - 0xa7, 0x70, 0xb0, 0xe1, 0x66, 0x60, 0xa0, 0xe1, - 0x01, 0xe0, 0x5e, 0xe2, 0xf5, 0xff, 0xff, 0xaa, - 0x8c, 0xc0, 0xb0, 0xe1, 0x01, 0x00, 0x00, 0x3a, - 0x00, 0x00, 0x70, 0xe2, 0x00, 0x10, 0xe1, 0xe2, - 0x8c, 0xc0, 0xb0, 0xe1, 0x01, 0x00, 0x00, 0x3a, - 0x00, 0x20, 0x72, 0xe2, 0x00, 0x30, 0xe3, 0xe2, - 0xf0, 0x40, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x12, - 0x01, 0x09, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, - 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, - 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, - 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, - 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, - 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, - 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, - 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0x0c, 0x8c, 0x4c, - 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, - 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, - 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, - 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, - 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, - 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x06, 0x86, 0x46, - 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, - 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, - 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, - 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, - 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, - 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x09, 0x89, 0x49, - 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, - 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, - 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, - 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, - 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0xed, - 0x09, 0x00, 0x13, 0x01, 0x5d, 0xdd, 0x3d, 0xbd, - 0x7d, 0xfd, 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, - 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, - 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, - 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, - 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, - 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, - 0x77, 0xf7, 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, - 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, - 0x7f, 0xff, 0x50, 0xfd, 0x70, 0xfd, 0x10, 0xfd, - 0x30, 0xfd, 0xd0, 0xfd, 0xf0, 0xfd, 0x90, 0xfd, - 0xb0, 0xfd, 0x50, 0xfc, 0x70, 0xfc, 0x10, 0xfc, - 0x30, 0xfc, 0xd0, 0xfc, 0xf0, 0xfc, 0x90, 0xfc, - 0xb0, 0xfc, 0xa8, 0xfe, 0xb8, 0xfe, 0x88, 0xfe, - 0x98, 0xfe, 0xe8, 0xfe, 0xf8, 0xfe, 0xc8, 0xfe, - 0xd8, 0xfe, 0x28, 0xfe, 0x38, 0xfe, 0x08, 0xfe, - 0x18, 0xfe, 0x68, 0xfe, 0x78, 0xfe, 0x48, 0xfe, - 0x58, 0xfe, 0x40, 0xf5, 0xc0, 0xf5, 0x40, 0xf4, - 0xc0, 0xf4, 0x40, 0xf7, 0xc0, 0xf7, 0x40, 0xf6, - 0xc0, 0xf6, 0x40, 0xf1, 0xc0, 0xf1, 0x40, 0xf0, - 0xc0, 0xf0, 0x40, 0xf3, 0xc0, 0xf3, 0x40, 0xf2, - 0xc0, 0xf2, 0xa0, 0xfa, 0xe0, 0xfa, 0x20, 0xfa, - 0x60, 0xfa, 0xa0, 0xfb, 0xe0, 0xfb, 0x20, 0xfb, - 0x60, 0xfb, 0xa0, 0xf8, 0xe0, 0xf8, 0x20, 0xf8, - 0x60, 0xf8, 0xa0, 0xf9, 0xe0, 0xf9, 0x20, 0xf9, - 0x60, 0xf9, 0xd5, 0xff, 0xd7, 0xff, 0xd1, 0xff, - 0xd3, 0xff, 0xdd, 0xff, 0xdf, 0xff, 0xd9, 0xff, - 0xdb, 0xff, 0xc5, 0xff, 0xc7, 0xff, 0xc1, 0xff, - 0xc3, 0xff, 0xcd, 0xff, 0xcf, 0xff, 0xc9, 0xff, - 0xcb, 0xff, 0xf5, 0xff, 0xf7, 0xff, 0xf1, 0xff, - 0xf3, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xf9, 0xff, - 0xfb, 0xff, 0xe5, 0xff, 0xe7, 0xff, 0xe1, 0xff, - 0xe3, 0xff, 0xed, 0x09, 0x00, 0x14, 0x01, 0xed, - 0xff, 0xef, 0xff, 0xe9, 0xff, 0xeb, 0xff, 0x54, - 0xff, 0x5c, 0xff, 0x44, 0xff, 0x4c, 0xff, 0x74, - 0xff, 0x7c, 0xff, 0x64, 0xff, 0x6c, 0xff, 0x14, - 0xff, 0x1c, 0xff, 0x04, 0xff, 0x0c, 0xff, 0x34, - 0xff, 0x3c, 0xff, 0x24, 0xff, 0x2c, 0xff, 0xaa, - 0xff, 0xae, 0xff, 0xa2, 0xff, 0xa6, 0xff, 0xba, - 0xff, 0xbe, 0xff, 0xb2, 0xff, 0xb6, 0xff, 0x8a, - 0xff, 0x8e, 0xff, 0x82, 0xff, 0x86, 0xff, 0x9a, - 0xff, 0x9e, 0xff, 0x92, 0xff, 0x96, 0xff, 0xb0, - 0x02, 0x90, 0x02, 0xf0, 0x02, 0xd0, 0x02, 0x30, - 0x02, 0x10, 0x02, 0x70, 0x02, 0x50, 0x02, 0xb0, - 0x03, 0x90, 0x03, 0xf0, 0x03, 0xd0, 0x03, 0x30, - 0x03, 0x10, 0x03, 0x70, 0x03, 0x50, 0x03, 0x58, - 0x01, 0x48, 0x01, 0x78, 0x01, 0x68, 0x01, 0x18, - 0x01, 0x08, 0x01, 0x38, 0x01, 0x28, 0x01, 0xd8, - 0x01, 0xc8, 0x01, 0xf8, 0x01, 0xe8, 0x01, 0x98, - 0x01, 0x88, 0x01, 0xb8, 0x01, 0xa8, 0x01, 0xc0, - 0x0a, 0x40, 0x0a, 0xc0, 0x0b, 0x40, 0x0b, 0xc0, - 0x08, 0x40, 0x08, 0xc0, 0x09, 0x40, 0x09, 0xc0, - 0x0e, 0x40, 0x0e, 0xc0, 0x0f, 0x40, 0x0f, 0xc0, - 0x0c, 0x40, 0x0c, 0xc0, 0x0d, 0x40, 0x0d, 0x60, - 0x05, 0x20, 0x05, 0xe0, 0x05, 0xa0, 0x05, 0x60, - 0x04, 0x20, 0x04, 0xe0, 0x04, 0xa0, 0x04, 0x60, - 0x07, 0x20, 0x07, 0xe0, 0x07, 0xa0, 0x07, 0x60, - 0x06, 0x20, 0x06, 0xe0, 0x06, 0xa0, 0x06, 0x2b, - 0x00, 0x29, 0x00, 0x2f, 0x00, 0x2d, 0x00, 0x23, - 0x00, 0x21, 0x00, 0x27, 0x00, 0x25, 0x00, 0x3b, - 0x00, 0x39, 0x00, 0x3f, 0x00, 0x3d, 0x00, 0x33, - 0x00, 0x31, 0x00, 0x37, 0x00, 0x35, 0x00, 0x0b, - 0x00, 0x09, 0x00, 0x0f, 0x00, 0x0d, 0x00, 0x03, - 0x00, 0x01, 0x00, 0x07, 0x00, 0x05, 0x00, 0x1b, - 0x00, 0x19, 0x00, 0x1f, 0x00, 0xed, 0x09, 0x00, - 0x15, 0x01, 0x1d, 0x00, 0x13, 0x00, 0x11, 0x00, - 0x17, 0x00, 0x15, 0x00, 0xac, 0x00, 0xa4, 0x00, - 0xbc, 0x00, 0xb4, 0x00, 0x8c, 0x00, 0x84, 0x00, - 0x9c, 0x00, 0x94, 0x00, 0xec, 0x00, 0xe4, 0x00, - 0xfc, 0x00, 0xf4, 0x00, 0xcc, 0x00, 0xc4, 0x00, - 0xdc, 0x00, 0xd4, 0x00, 0x56, 0x00, 0x52, 0x00, - 0x5e, 0x00, 0x5a, 0x00, 0x46, 0x00, 0x42, 0x00, - 0x4e, 0x00, 0x4a, 0x00, 0x76, 0x00, 0x72, 0x00, - 0x7e, 0x00, 0x7a, 0x00, 0x66, 0x00, 0x62, 0x00, - 0x6e, 0x00, 0x6a, 0x00, 0xa1, 0xe0, 0xa1, 0xe1, - 0xa1, 0xe2, 0xa1, 0xe3, 0xa1, 0xe4, 0xa1, 0xe5, - 0xa1, 0xe6, 0xa1, 0xe7, 0xa1, 0xe8, 0xa1, 0xe9, - 0xa1, 0xea, 0xa1, 0xeb, 0xa1, 0xec, 0xa1, 0xed, - 0xa1, 0xee, 0xa1, 0xef, 0x61, 0xf0, 0xe1, 0xf0, - 0x61, 0xf1, 0xe1, 0xf1, 0x61, 0xf2, 0xe1, 0xf2, - 0x61, 0xf3, 0xe1, 0xf3, 0x61, 0xf4, 0xe1, 0xf4, - 0x61, 0xf5, 0xe1, 0xf5, 0x61, 0xf6, 0xe1, 0xf6, - 0x61, 0xf7, 0xe1, 0xf7, 0x41, 0xf8, 0x81, 0xf8, - 0xc1, 0xf8, 0x01, 0xf9, 0x41, 0xf9, 0x81, 0xf9, - 0xc1, 0xf9, 0x01, 0xfa, 0x41, 0xfa, 0x81, 0xfa, - 0xc1, 0xfa, 0x01, 0xfb, 0x41, 0xfb, 0x81, 0xfb, - 0xc1, 0xfb, 0x01, 0xfc, 0x31, 0xfc, 0x51, 0xfc, - 0x71, 0xfc, 0x91, 0xfc, 0xb1, 0xfc, 0xd1, 0xfc, - 0xf1, 0xfc, 0x11, 0xfd, 0x31, 0xfd, 0x51, 0xfd, - 0x71, 0xfd, 0x91, 0xfd, 0xb1, 0xfd, 0xd1, 0xfd, - 0xf1, 0xfd, 0x11, 0xfe, 0x29, 0xfe, 0x39, 0xfe, - 0x49, 0xfe, 0x59, 0xfe, 0x69, 0xfe, 0x79, 0xfe, - 0x89, 0xfe, 0x99, 0xfe, 0xa9, 0xfe, 0xb9, 0xfe, - 0xc9, 0xfe, 0xd9, 0xfe, 0xe9, 0xfe, 0xf9, 0xfe, - 0x09, 0xff, 0x19, 0xff, 0x25, 0xff, 0x2d, 0xff, - 0x35, 0xff, 0x3d, 0xff, 0x45, 0xff, 0x4d, 0xff, - 0x55, 0xff, 0x5d, 0xff, 0x65, 0xff, 0x6d, 0xff, - 0xed, 0x09, 0x00, 0x16, 0x01, 0x75, 0xff, 0x7d, - 0xff, 0x85, 0xff, 0x8d, 0xff, 0x95, 0xff, 0x9d, - 0xff, 0xa3, 0xff, 0xa7, 0xff, 0xab, 0xff, 0xaf, - 0xff, 0xb3, 0xff, 0xb7, 0xff, 0xbb, 0xff, 0xbf, - 0xff, 0xc3, 0xff, 0xc7, 0xff, 0xcb, 0xff, 0xcf, - 0xff, 0xd3, 0xff, 0xd7, 0xff, 0xdb, 0xff, 0xdf, - 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xe6, 0xff, 0xe8, - 0xff, 0xea, 0xff, 0xec, 0xff, 0xee, 0xff, 0xf0, - 0xff, 0xf2, 0xff, 0xf4, 0xff, 0xf6, 0xff, 0xf8, - 0xff, 0xfa, 0xff, 0xfc, 0xff, 0xfe, 0xff, 0x00, - 0x00, 0x5f, 0x1f, 0x5f, 0x1e, 0x5f, 0x1d, 0x5f, - 0x1c, 0x5f, 0x1b, 0x5f, 0x1a, 0x5f, 0x19, 0x5f, - 0x18, 0x5f, 0x17, 0x5f, 0x16, 0x5f, 0x15, 0x5f, - 0x14, 0x5f, 0x13, 0x5f, 0x12, 0x5f, 0x11, 0x5f, - 0x10, 0x9f, 0x0f, 0x1f, 0x0f, 0x9f, 0x0e, 0x1f, - 0x0e, 0x9f, 0x0d, 0x1f, 0x0d, 0x9f, 0x0c, 0x1f, - 0x0c, 0x9f, 0x0b, 0x1f, 0x0b, 0x9f, 0x0a, 0x1f, - 0x0a, 0x9f, 0x09, 0x1f, 0x09, 0x9f, 0x08, 0x1f, - 0x08, 0xbf, 0x07, 0x7f, 0x07, 0x3f, 0x07, 0xff, - 0x06, 0xbf, 0x06, 0x7f, 0x06, 0x3f, 0x06, 0xff, - 0x05, 0xbf, 0x05, 0x7f, 0x05, 0x3f, 0x05, 0xff, - 0x04, 0xbf, 0x04, 0x7f, 0x04, 0x3f, 0x04, 0xff, - 0x03, 0xcf, 0x03, 0xaf, 0x03, 0x8f, 0x03, 0x6f, - 0x03, 0x4f, 0x03, 0x2f, 0x03, 0x0f, 0x03, 0xef, - 0x02, 0xcf, 0x02, 0xaf, 0x02, 0x8f, 0x02, 0x6f, - 0x02, 0x4f, 0x02, 0x2f, 0x02, 0x0f, 0x02, 0xef, - 0x01, 0xd7, 0x01, 0xc7, 0x01, 0xb7, 0x01, 0xa7, - 0x01, 0x97, 0x01, 0x87, 0x01, 0x77, 0x01, 0x67, - 0x01, 0x57, 0x01, 0x47, 0x01, 0x37, 0x01, 0x27, - 0x01, 0x17, 0x01, 0x07, 0x01, 0xf7, 0x00, 0xe7, - 0x00, 0xdb, 0x00, 0xd3, 0x00, 0xcb, 0x00, 0xc3, - 0x00, 0xbb, 0x00, 0xb3, 0x00, 0xab, 0x00, 0xa3, - 0x00, 0x9b, 0x00, 0xed, 0x09, 0x00, 0x17, 0x01, - 0x93, 0x00, 0x8b, 0x00, 0x83, 0x00, 0x7b, 0x00, - 0x73, 0x00, 0x6b, 0x00, 0x63, 0x00, 0x5d, 0x00, - 0x59, 0x00, 0x55, 0x00, 0x51, 0x00, 0x4d, 0x00, - 0x49, 0x00, 0x45, 0x00, 0x41, 0x00, 0x3d, 0x00, - 0x39, 0x00, 0x35, 0x00, 0x31, 0x00, 0x2d, 0x00, - 0x29, 0x00, 0x25, 0x00, 0x21, 0x00, 0x1e, 0x00, - 0x1c, 0x00, 0x1a, 0x00, 0x18, 0x00, 0x16, 0x00, - 0x14, 0x00, 0x12, 0x00, 0x10, 0x00, 0x0e, 0x00, - 0x0c, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, - 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01, 0x20, - 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x20, - 0x70, 0x47, 0xb0, 0xb5, 0x1a, 0x4c, 0x01, 0x25, - 0x1a, 0x48, 0x25, 0x60, 0x07, 0x69, 0x38, 0x09, - 0x02, 0xd3, 0x08, 0x20, 0x01, 0xf0, 0x8f, 0xfc, - 0xf8, 0x0a, 0x02, 0xd3, 0x02, 0x20, 0x01, 0xf0, - 0x8a, 0xfc, 0x78, 0x0a, 0x02, 0xd3, 0xed, 0x09, - 0x00, 0x18, 0x01, 0x03, 0x20, 0x01, 0xf0, 0x85, - 0xfc, 0x38, 0x09, 0x00, 0x07, 0x02, 0xd0, 0x04, - 0x20, 0x01, 0xf0, 0x7f, 0xfc, 0xf8, 0x08, 0x02, - 0xd3, 0x06, 0x20, 0x01, 0xf0, 0x7a, 0xfc, 0xb8, - 0x08, 0x02, 0xd3, 0x01, 0x20, 0x01, 0xf0, 0x75, - 0xfc, 0x78, 0x08, 0x02, 0xd3, 0x07, 0x20, 0x01, - 0xf0, 0x70, 0xfc, 0xb8, 0x0a, 0x03, 0xd3, 0x06, - 0x48, 0x05, 0x62, 0x24, 0xf0, 0x40, 0xf9, 0x00, - 0x20, 0x20, 0x60, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x70, 0x65, 0x03, 0x20, 0x00, - 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xd0, 0x80, - 0xb5, 0x18, 0x48, 0x07, 0x69, 0xf8, 0x0e, 0x02, - 0xd3, 0x02, 0x20, 0x01, 0xf0, 0x56, 0xfc, 0x78, - 0x0e, 0x02, 0xd3, 0x03, 0x20, 0x01, 0xf0, 0x51, - 0xfc, 0x38, 0x0d, 0x00, 0x07, 0x02, 0xd0, 0x04, - 0x20, 0x01, 0xf0, 0x4b, 0xfc, 0x38, 0x0d, 0x02, - 0xd3, 0x05, 0x20, 0x01, 0xf0, 0x46, 0xfc, 0xf8, - 0x0c, 0x02, 0xd3, 0x06, 0x20, 0x01, 0xf0, 0x41, - 0xfc, 0xb8, 0x0c, 0x02, 0xd3, 0x01, 0x20, 0x01, - 0xf0, 0x3c, 0xfc, 0x78, 0x0c, 0x02, 0xd3, 0x07, - 0x20, 0x01, 0xf0, 0x37, 0xfc, 0xb8, 0x0e, 0x04, - 0xd3, 0x05, 0x49, 0x01, 0x20, 0x08, 0x62, 0x24, - 0xf0, 0x06, 0xf9, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, - 0x00, 0x00, 0xd0, 0x00, 0x00, 0xa0, 0xe3, 0x10, - 0x0f, 0x01, 0xee, 0x19, 0x00, 0xa0, 0xe3, 0x17, - 0x0f, 0x06, 0xee, 0x1f, 0x00, 0xa0, 0xe3, 0x16, - 0x0f, 0x06, 0xee, 0xa2, 0x02, 0x80, 0xe2, 0x15, - 0x0f, 0x06, 0xee, 0x01, 0x00, 0x40, 0xe2, 0x14, - 0x0f, 0x06, 0xee, 0x13, 0x0f, 0x06, 0xee, 0x9d, - 0x02, 0xa0, 0xe3, 0x10, 0x00, 0x80, 0xe2, 0x12, - 0x0f, 0x06, 0xee, 0x81, 0x02, 0x80, 0xe2, 0x11, - 0x0f, 0xed, 0x09, 0x00, 0x19, 0x01, 0x06, 0xee, - 0x0e, 0x02, 0xa0, 0xe3, 0x20, 0x00, 0x80, 0xe2, - 0x10, 0x0f, 0x06, 0xee, 0xc0, 0x07, 0xe0, 0xe1, - 0x10, 0x0f, 0x05, 0xee, 0x3f, 0x0d, 0xa0, 0xe3, - 0x10, 0x0f, 0x02, 0xee, 0xff, 0x00, 0xa0, 0xe3, - 0x10, 0x0f, 0x04, 0xee, 0x00, 0x00, 0xa0, 0xe3, - 0x10, 0x0f, 0x03, 0xee, 0x03, 0x00, 0xa0, 0xe3, - 0x10, 0x0f, 0x07, 0xee, 0x0f, 0x00, 0xa0, 0xe3, - 0x10, 0x0f, 0x01, 0xee, 0x1e, 0xff, 0x2f, 0xe1, - 0x00, 0x00, 0xa0, 0xe3, 0x10, 0x0f, 0x01, 0xee, - 0x10, 0x0f, 0x03, 0xee, 0x03, 0x00, 0xa0, 0xe3, - 0x10, 0x0f, 0x07, 0xee, 0x1e, 0xff, 0x2f, 0xe1, - 0x00, 0x00, 0xa0, 0xe3, 0x10, 0x0f, 0x01, 0xee, - 0x10, 0x0f, 0x03, 0xee, 0x03, 0x00, 0xa0, 0xe3, - 0x10, 0x0f, 0x07, 0xee, 0x01, 0x09, 0xa0, 0xe3, - 0x01, 0x00, 0x40, 0xe2, 0x10, 0x0f, 0x05, 0xee, - 0x3f, 0x0d, 0xa0, 0xe3, 0x10, 0x0f, 0x02, 0xee, - 0x0f, 0x00, 0xa0, 0xe3, 0x10, 0x0f, 0x01, 0xee, - 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0xa0, 0xe3, - 0x10, 0x0f, 0x01, 0xee, 0x10, 0x0f, 0x03, 0xee, - 0x03, 0x00, 0xa0, 0xe3, 0x10, 0x0f, 0x07, 0xee, - 0x01, 0x09, 0xa0, 0xe3, 0x01, 0x00, 0x40, 0xe2, - 0x10, 0x0f, 0x05, 0xee, 0x3f, 0x0d, 0xa0, 0xe3, - 0x10, 0x0f, 0x02, 0xee, 0x0f, 0x00, 0xa0, 0xe3, - 0x10, 0x0f, 0x01, 0xee, 0x1e, 0xff, 0x2f, 0xe1, - 0x10, 0x0f, 0x18, 0xee, 0x1e, 0xff, 0x2f, 0xe1, - 0x07, 0x48, 0x02, 0x21, 0x41, 0x62, 0x00, 0x21, - 0x01, 0x63, 0x06, 0x4a, 0xc2, 0x62, 0x81, 0x62, - 0x09, 0x21, 0x81, 0x63, 0x03, 0x21, 0x41, 0x63, - 0x01, 0x21, 0x41, 0x62, 0x01, 0x62, 0x70, 0x47, - 0x00, 0x00, 0x00, 0xd0, 0x7f, 0xbb, 0x00, 0x00, - 0x07, 0x48, 0x02, 0x21, 0x41, 0x60, 0x00, 0x21, - 0x01, 0x61, 0x06, 0x4a, 0xed, 0x09, 0x00, 0x1a, - 0x01, 0xc2, 0x60, 0x81, 0x60, 0x41, 0x61, 0x81, - 0x61, 0x01, 0x22, 0x42, 0x60, 0x02, 0x60, 0x08, - 0x1c, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xd0, 0x7f, 0xbb, 0x00, 0x00, 0x00, 0xb5, 0x03, - 0x48, 0x01, 0x69, 0x30, 0x20, 0xee, 0xf7, 0x38, - 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, - 0xd0, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0xb5, 0x04, - 0x49, 0x00, 0x20, 0x48, 0x61, 0xff, 0x20, 0x01, - 0x30, 0x24, 0xf0, 0x30, 0xf8, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x00, 0xd0, 0x00, 0xb5, 0x06, - 0x49, 0x01, 0x22, 0x0a, 0x60, 0x8b, 0x68, 0xc0, - 0x18, 0x88, 0x61, 0x4a, 0x61, 0x10, 0x02, 0x23, - 0xf0, 0xfd, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd0, 0x00, 0xb5, 0x03, - 0xa0, 0x03, 0xf0, 0xa0, 0xfb, 0x00, 0x20, 0x00, - 0xdf, 0x08, 0xbc, 0x18, 0x47, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x20, 0x4a, 0x55, 0x4d, 0x50, 0x20, 0x54, 0x4f, - 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x20, 0x44, 0x45, - 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x20, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x00, 0xf0, 0xb4, 0x82, - 0xb0, 0x20, 0x49, 0x00, 0x20, 0x0a, 0x68, 0x4b, - 0x0d, 0x1a, 0x43, 0x0a, 0x60, 0x1e, 0x4a, 0x00, - 0x21, 0x8b, 0x00, 0x01, 0x31, 0x08, 0x29, 0xc2, - 0x50, 0xfa, 0xd3, 0xc6, 0x1d, 0x11, 0x36, 0x01, - 0x96, 0xc6, 0x1d, 0x15, 0x36, 0xc2, 0x1d, 0xc4, - 0x1d, 0x01, 0x34, 0x09, 0x32, 0x00, 0x21, 0x05, - 0x1d, 0xc7, 0x1d, 0x05, 0x37, 0x00, 0x96, 0x08, - 0x29, 0x1e, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x04, 0x07, 0xed, - 0x09, 0x00, 0x1b, 0x01, 0x0a, 0x0d, 0x10, 0x1a, - 0x13, 0x17, 0x0f, 0x4b, 0x03, 0x62, 0x12, 0xe0, - 0x0f, 0x4b, 0x2b, 0x62, 0x0f, 0xe0, 0x0e, 0x4b, - 0x23, 0x62, 0x0c, 0xe0, 0x0e, 0x4b, 0x3b, 0x62, - 0x09, 0xe0, 0x0d, 0x4b, 0x13, 0x62, 0x06, 0xe0, - 0x0d, 0x4b, 0x01, 0x9e, 0x33, 0x62, 0x02, 0xe0, - 0x0c, 0x4b, 0x00, 0x9e, 0x33, 0x62, 0x01, 0x31, - 0x08, 0x29, 0xdb, 0xd3, 0x02, 0xb0, 0xf0, 0xbc, - 0x70, 0x47, 0x00, 0x00, 0x00, 0xe0, 0x18, 0xf0, - 0x9f, 0xe5, 0x29, 0x18, 0x01, 0x20, 0xe8, 0x59, - 0x03, 0x20, 0x88, 0x5a, 0x03, 0x20, 0xcc, 0x5a, - 0x03, 0x20, 0x48, 0x5b, 0x03, 0x20, 0xf8, 0x00, - 0x00, 0x20, 0x20, 0x01, 0x00, 0x20, 0x08, 0x10, - 0x9f, 0xe5, 0x00, 0x00, 0xa0, 0xe3, 0x00, 0x00, - 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x74, 0x65, - 0x03, 0x20, 0x30, 0x40, 0x2d, 0xe9, 0x00, 0x50, - 0xa0, 0xe1, 0x01, 0x40, 0xa0, 0xe1, 0xe2, 0x8f, - 0x00, 0xeb, 0x00, 0x00, 0x50, 0xe3, 0x30, 0x40, - 0xbd, 0x18, 0x1e, 0xff, 0x2f, 0x11, 0x28, 0x00, - 0x1f, 0xe5, 0x00, 0x00, 0x90, 0xe5, 0x00, 0x00, - 0x50, 0xe3, 0x30, 0x40, 0xbd, 0x08, 0x1e, 0xff, - 0x2f, 0x01, 0x00, 0x00, 0xa0, 0xe3, 0xd5, 0x8f, - 0x00, 0xeb, 0xd1, 0x8f, 0x00, 0xeb, 0x04, 0x20, - 0xa0, 0xe1, 0x05, 0x10, 0xa0, 0xe1, 0x04, 0x0f, - 0x8f, 0xe2, 0xca, 0x8f, 0x00, 0xeb, 0x00, 0x00, - 0xa0, 0xe3, 0x00, 0x00, 0x00, 0xef, 0x30, 0x40, - 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, 0x41, 0x53, - 0x53, 0x45, 0x52, 0x54, 0x20, 0x4e, 0x4f, 0x54, - 0x20, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, - 0x4c, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x75, - 0x0a, 0x00, 0x10, 0x40, 0x2d, 0xe9, 0xba, 0x8f, - 0x00, 0xeb, 0x01, 0x10, 0xa0, 0xe3, 0xb2, 0x8f, - 0x00, 0xeb, 0xed, 0x09, 0x00, 0x1c, 0x01, 0x00, - 0x40, 0xa0, 0xe1, 0x2c, 0x00, 0x9f, 0xe5, 0x01, - 0x10, 0xa0, 0xe3, 0x3b, 0x00, 0x00, 0xeb, 0x00, - 0x00, 0x50, 0xe3, 0x10, 0x40, 0xbd, 0x18, 0x1e, - 0xff, 0x2f, 0x11, 0x08, 0x00, 0xa0, 0xe3, 0xac, - 0x8f, 0x00, 0xeb, 0x10, 0x10, 0x9f, 0xe5, 0x01, - 0x00, 0xc1, 0xe5, 0x00, 0x40, 0xc1, 0xe5, 0x10, - 0x40, 0xbd, 0xe8, 0x1e, 0xff, 0x2f, 0xe1, 0x74, - 0x65, 0x03, 0x20, 0x7c, 0x65, 0x03, 0x20, 0x30, - 0x40, 0x2d, 0xe9, 0x14, 0x00, 0x1f, 0xe5, 0x01, - 0x10, 0xa0, 0xe3, 0x21, 0x00, 0x00, 0xeb, 0x00, - 0x00, 0x50, 0xe3, 0x30, 0x40, 0xbd, 0x08, 0x1e, - 0xff, 0x2f, 0x01, 0x01, 0x00, 0x50, 0xe3, 0x30, - 0x40, 0xbd, 0x18, 0x1e, 0xff, 0x2f, 0x11, 0x9d, - 0x8f, 0x00, 0xeb, 0x38, 0x50, 0x1f, 0xe5, 0x00, - 0x40, 0xa0, 0xe1, 0x01, 0x00, 0xd5, 0xe5, 0x0a, - 0x00, 0x50, 0xe3, 0x95, 0x8f, 0x00, 0x0b, 0x00, - 0x10, 0xd5, 0xe5, 0x04, 0x00, 0xa0, 0xe1, 0x30, - 0x40, 0xbd, 0xe8, 0x8e, 0x8f, 0x00, 0xea, 0x8e, - 0x12, 0xa0, 0xe3, 0x00, 0x20, 0xa0, 0xe3, 0x92, - 0x10, 0x01, 0xe1, 0x00, 0x00, 0x81, 0xe1, 0x0e, - 0x12, 0xa0, 0xe3, 0x08, 0x00, 0x81, 0xe5, 0x1e, - 0xff, 0x2f, 0xe1, 0x00, 0x10, 0xa0, 0xe1, 0x8e, - 0x02, 0xa0, 0xe3, 0x00, 0x20, 0xa0, 0xe3, 0x92, - 0x00, 0x00, 0xe1, 0x0e, 0x22, 0xa0, 0xe3, 0x01, - 0x10, 0xc0, 0xe1, 0x08, 0x10, 0x82, 0xe5, 0x1e, - 0xff, 0x2f, 0xe1, 0x01, 0x10, 0xa0, 0xe3, 0x91, - 0x00, 0x00, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x00, - 0x20, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe3, 0x8e, - 0x32, 0xa0, 0xe3, 0x90, 0x30, 0x03, 0xe1, 0x00, - 0x00, 0x92, 0xe5, 0x01, 0x10, 0x40, 0xe0, 0x00, - 0x10, 0x82, 0xe5, 0x0e, 0x12, 0xa0, 0xe3, 0x08, - 0x30, 0x81, 0xe5, 0x1e, 0xff, 0xed, 0x09, 0x00, - 0x1d, 0x01, 0x2f, 0xe1, 0x00, 0x20, 0xa0, 0xe1, - 0x00, 0x00, 0xa0, 0xe3, 0x8e, 0x32, 0xa0, 0xe3, - 0x90, 0x30, 0x03, 0xe1, 0x00, 0x00, 0x92, 0xe5, - 0x01, 0x10, 0x80, 0xe0, 0x00, 0x10, 0x82, 0xe5, - 0x0e, 0x12, 0xa0, 0xe3, 0x08, 0x30, 0x81, 0xe5, - 0x1e, 0xff, 0x2f, 0xe1, 0x91, 0x00, 0x00, 0xe1, - 0x1e, 0xff, 0x2f, 0xe1, 0x14, 0x00, 0x9f, 0xe5, - 0x00, 0x10, 0xa0, 0xe3, 0x00, 0x10, 0x80, 0xe5, - 0x04, 0x10, 0x80, 0xe5, 0x01, 0x10, 0xa0, 0xe3, - 0x08, 0x10, 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, - 0xd0, 0xb2, 0x03, 0x20, 0x8e, 0x12, 0xa0, 0xe3, - 0x00, 0x00, 0xa0, 0xe3, 0x90, 0x10, 0x01, 0xe1, - 0x18, 0x00, 0x1f, 0xe5, 0x00, 0x30, 0x90, 0xe5, - 0x01, 0x20, 0x83, 0xe2, 0x00, 0x20, 0x80, 0xe5, - 0x00, 0x00, 0x53, 0xe3, 0x04, 0x10, 0x80, 0x05, - 0x1e, 0xff, 0x2f, 0xe1, 0x8e, 0x12, 0xa0, 0xe3, - 0x00, 0x00, 0xa0, 0xe3, 0x90, 0x10, 0x01, 0xe1, - 0x01, 0x00, 0xa0, 0xe1, 0x44, 0x10, 0x1f, 0xe5, - 0x00, 0x20, 0x91, 0xe5, 0x01, 0x20, 0x52, 0xe2, - 0x00, 0x20, 0x81, 0xe5, 0x04, 0x10, 0x91, 0x05, - 0x00, 0x00, 0x81, 0x01, 0x0e, 0x12, 0xa0, 0xe3, - 0x08, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, - 0x90, 0xb5, 0x07, 0x1c, 0x14, 0x4c, 0x01, 0x20, - 0x20, 0x60, 0x01, 0xf0, 0x97, 0xfc, 0x01, 0xf0, - 0x99, 0xfc, 0x01, 0xf0, 0x9b, 0xfc, 0x01, 0xf0, - 0x9f, 0xfc, 0x01, 0xf0, 0xb3, 0xfc, 0x01, 0xf0, - 0x27, 0xfd, 0x01, 0xf0, 0x33, 0xfd, 0x01, 0xf0, - 0x3f, 0xfd, 0x01, 0xf0, 0x4b, 0xfd, 0x01, 0xf0, - 0x57, 0xfd, 0x01, 0xf0, 0x63, 0xfd, 0x01, 0xf0, - 0x6f, 0xfd, 0x01, 0xf0, 0x7b, 0xfd, 0x01, 0xf0, - 0xd3, 0xfd, 0x38, 0x1c, 0x03, 0xf0, 0xf4, 0xf9, - 0x02, 0x20, 0x20, 0x60, 0x23, 0xf0, 0x92, 0xfe, - 0xed, 0x09, 0x00, 0x1e, 0x01, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x80, 0x65, 0x03, - 0x20, 0x84, 0x65, 0x03, 0x20, 0x18, 0x67, 0x03, - 0x20, 0x5d, 0x2d, 0x01, 0x20, 0xa8, 0x24, 0x01, - 0x20, 0x95, 0x2d, 0x01, 0x20, 0xe8, 0x66, 0x03, - 0x20, 0xe4, 0x66, 0x03, 0x20, 0xd8, 0x66, 0x03, - 0x20, 0xb0, 0x65, 0x03, 0x20, 0xb8, 0x65, 0x03, - 0x20, 0xec, 0x66, 0x03, 0x20, 0xf0, 0x66, 0x03, - 0x20, 0x60, 0xb7, 0x03, 0x20, 0x54, 0xb7, 0x03, - 0x20, 0x00, 0x20, 0x0f, 0xe1, 0xc0, 0x20, 0x82, - 0xe3, 0x02, 0xf0, 0x2f, 0xe1, 0x48, 0x10, 0x1f, - 0xe5, 0x00, 0x30, 0x91, 0xe5, 0xc0, 0x20, 0xc2, - 0xe3, 0x00, 0x20, 0x82, 0xe1, 0x00, 0x00, 0x81, - 0xe5, 0x02, 0xf0, 0x2f, 0xe1, 0xc0, 0x00, 0x03, - 0xe2, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x20, 0x0f, - 0xe1, 0x02, 0x30, 0xa0, 0xe1, 0xc0, 0x20, 0xc2, - 0xe3, 0x00, 0x20, 0x82, 0xe1, 0x02, 0xf0, 0x2f, - 0xe1, 0xc0, 0x00, 0x03, 0xe2, 0x1e, 0xff, 0x2f, - 0xe1, 0x00, 0x10, 0x0f, 0xe1, 0x01, 0x20, 0xa0, - 0xe1, 0xc0, 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x2f, - 0xe1, 0xc0, 0x20, 0xc2, 0xe3, 0x98, 0x10, 0x1f, - 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x00, 0x20, 0x82, - 0xe1, 0x02, 0xf0, 0x2f, 0xe1, 0x1e, 0xff, 0x2f, - 0xe1, 0x24, 0x20, 0x90, 0xe5, 0x30, 0x10, 0x90, - 0xe5, 0x02, 0x30, 0x81, 0xe0, 0x03, 0x30, 0xc3, - 0xe3, 0x04, 0x30, 0x43, 0xe2, 0x28, 0x30, 0x80, - 0xe5, 0xc0, 0x20, 0x1f, 0xe5, 0x01, 0x20, 0xc2, - 0xe3, 0x04, 0x20, 0x03, 0xe4, 0x00, 0x20, 0xa0, - 0xe3, 0x04, 0x20, 0x03, 0xe4, 0x08, 0x20, 0x83, - 0xe2, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, 0x03, - 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x24, 0x20, 0x90, - 0xe5, 0x04, 0x20, 0x03, 0xe4, 0x00, 0x20, 0xa0, - 0xe3, 0x04, 0x20, 0xed, 0x09, 0x00, 0x1f, 0x01, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x02, 0xf0, - 0x28, 0xe1, 0x00, 0x20, 0x0f, 0xe1, 0xc0, 0x20, - 0xc2, 0xe3, 0x20, 0x20, 0x82, 0xe3, 0x04, 0x20, - 0x03, 0xe4, 0x01, 0x20, 0xa0, 0xe3, 0x00, 0x20, - 0x83, 0xe5, 0x48, 0x20, 0xa0, 0xe3, 0x02, 0x10, - 0x41, 0xe0, 0x34, 0x10, 0x80, 0xe5, 0x2c, 0x30, - 0x80, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x24, 0x20, - 0x90, 0xe5, 0x30, 0x10, 0x90, 0xe5, 0x02, 0x30, - 0x81, 0xe0, 0x03, 0x30, 0xc3, 0xe3, 0x04, 0x30, - 0x43, 0xe2, 0x28, 0x30, 0x80, 0xe5, 0x5c, 0x21, - 0x1f, 0xe5, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x83, 0xe2, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x24, 0x20, 0x90, 0xe5, 0x04, 0x20, - 0x03, 0xe4, 0x00, 0x20, 0xa0, 0xe3, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x00, 0x20, 0x83, 0xe5, 0x30, 0x20, - 0xa0, 0xe3, 0x02, 0x10, 0x41, 0xe0, 0x34, 0x10, - 0x80, 0xe5, 0x2c, 0x30, 0x80, 0xe5, 0x1e, 0xff, - 0x2f, 0xe1, 0x2c, 0x30, 0x90, 0xe5, 0xb0, 0x21, - 0x1f, 0xe5, 0x01, 0x20, 0xc2, 0xe3, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x83, 0xe2, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x24, 0x20, - 0x90, 0xe5, 0x04, 0x20, 0x03, 0xe4, 0x00, 0x20, - 0xa0, 0xe3, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0x04, 0x20, - 0x03, 0xe4, 0x04, 0x20, 0x03, 0xe4, 0xed, 0x09, - 0x00, 0x20, 0x01, 0x04, 0x20, 0x03, 0xe4, 0x20, - 0x10, 0xa0, 0xe3, 0x04, 0x10, 0x03, 0xe4, 0x00, - 0x20, 0x83, 0xe5, 0x2c, 0x30, 0x80, 0xe5, 0x1e, - 0xff, 0x2f, 0xe1, 0xfc, 0x01, 0x1f, 0xe5, 0x00, - 0x00, 0x90, 0xe5, 0x00, 0x00, 0x50, 0xe3, 0x00, - 0x30, 0xa0, 0xe3, 0x13, 0x00, 0x00, 0x0a, 0x24, - 0x20, 0x90, 0xe5, 0x02, 0x00, 0x5d, 0xe1, 0x02, - 0x00, 0x00, 0xba, 0x28, 0x10, 0x90, 0xe5, 0x01, - 0x00, 0x5d, 0xe1, 0x03, 0x00, 0x00, 0xda, 0x04, - 0xe0, 0xad, 0xe5, 0x03, 0x00, 0xa0, 0xe3, 0x94, - 0x37, 0x9f, 0xe5, 0x13, 0xff, 0x2f, 0xe1, 0x02, - 0x30, 0x4d, 0xe0, 0x50, 0x00, 0x53, 0xe3, 0x03, - 0x00, 0x00, 0x2a, 0x04, 0xe0, 0xad, 0xe5, 0x03, - 0x00, 0xa0, 0xe3, 0x78, 0x37, 0x9f, 0xe5, 0x13, - 0xff, 0x2f, 0xe1, 0x34, 0x20, 0x90, 0xe5, 0x02, - 0x00, 0x53, 0xe1, 0x34, 0x30, 0x80, 0x35, 0x03, - 0x00, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x78, - 0x12, 0x1f, 0xe5, 0x00, 0x00, 0x0f, 0xe1, 0x00, - 0x20, 0x91, 0xe5, 0xc0, 0x00, 0xc0, 0xe3, 0x02, - 0x00, 0x80, 0xe1, 0x00, 0xf0, 0x2f, 0xe1, 0x7c, - 0x22, 0x1f, 0xe5, 0x7c, 0x32, 0x1f, 0xe5, 0x00, - 0x00, 0x92, 0xe5, 0x00, 0x00, 0x50, 0xe3, 0x02, - 0x00, 0x00, 0x1a, 0x00, 0x00, 0x93, 0xe5, 0x00, - 0x00, 0x50, 0xe3, 0xf9, 0xff, 0xff, 0x0a, 0x00, - 0x10, 0x0f, 0xe1, 0xc0, 0x10, 0x81, 0xe3, 0x01, - 0xf0, 0x2f, 0xe1, 0xac, 0x12, 0x1f, 0xe5, 0x1c, - 0x20, 0x90, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x20, - 0x30, 0x90, 0xe5, 0x01, 0x20, 0x82, 0xe2, 0x1c, - 0x20, 0x80, 0xe5, 0x00, 0x00, 0x53, 0xe3, 0x04, - 0x00, 0x00, 0x0a, 0xc0, 0x22, 0x1f, 0xe5, 0xc0, - 0x12, 0x1f, 0xe5, 0x00, 0x30, 0x82, 0xe5, 0x00, - 0x20, 0xa0, 0xe3, 0x00, 0x20, 0x81, 0xe5, 0x2c, - 0xd0, 0xed, 0x09, 0x00, 0x21, 0x01, 0x90, 0xe5, - 0x04, 0x10, 0x9d, 0xe4, 0x01, 0x00, 0x51, 0xe3, - 0x08, 0x00, 0x00, 0x0a, 0x00, 0x13, 0x1f, 0xe5, - 0x00, 0x00, 0x0f, 0xe1, 0xc0, 0x00, 0xc0, 0xe3, - 0x00, 0x20, 0x91, 0xe5, 0x02, 0x00, 0x80, 0xe1, - 0x04, 0x20, 0x9d, 0xe4, 0x02, 0x00, 0x80, 0xe1, - 0x00, 0xf0, 0x6f, 0xe1, 0xf0, 0x9f, 0xfd, 0xe8, - 0x04, 0x00, 0x9d, 0xe4, 0x28, 0x13, 0x1f, 0xe5, - 0xc0, 0x00, 0xc0, 0xe3, 0x00, 0x20, 0x91, 0xe5, - 0x02, 0x00, 0x80, 0xe1, 0x00, 0xf0, 0x6f, 0xe1, - 0xff, 0xff, 0xdd, 0xe8, 0x00, 0x00, 0x0f, 0xe1, - 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, - 0xf0, 0x5f, 0x2d, 0xe9, 0x0e, 0x20, 0xa0, 0xe1, - 0x82, 0x2f, 0xa0, 0xe1, 0x22, 0x2d, 0xa0, 0xe1, - 0x04, 0x20, 0x2d, 0xe5, 0x00, 0x20, 0xa0, 0xe3, - 0x04, 0x20, 0x2d, 0xe5, 0x58, 0x13, 0x1f, 0xe5, - 0x00, 0x00, 0x91, 0xe5, 0x50, 0x33, 0x1f, 0xe5, - 0x00, 0x20, 0x81, 0xe5, 0x00, 0x10, 0x93, 0xe5, - 0x00, 0x00, 0x51, 0xe3, 0x03, 0x00, 0x00, 0x1a, - 0x40, 0x10, 0x90, 0xe5, 0x01, 0x20, 0xa0, 0xe3, - 0x00, 0x20, 0x83, 0xe5, 0x20, 0x10, 0x80, 0xe5, - 0x2c, 0xd0, 0x80, 0xe5, 0x38, 0x10, 0x90, 0xe5, - 0x00, 0x20, 0xa0, 0xe3, 0x38, 0x20, 0x80, 0xe5, - 0x00, 0x20, 0x81, 0xe5, 0x84, 0x13, 0x1f, 0xe5, - 0xb0, 0x23, 0x1f, 0xe5, 0x00, 0xd0, 0x91, 0xe5, - 0x00, 0xa0, 0x92, 0xe5, 0xae, 0xff, 0xff, 0xea, - 0x00, 0x30, 0x0f, 0xe1, 0xc0, 0x30, 0x83, 0xe3, - 0x03, 0xf0, 0x2f, 0xe1, 0xb8, 0x13, 0x1f, 0xe5, - 0x00, 0x20, 0xa0, 0xe3, 0x00, 0x00, 0x91, 0xe5, - 0xb4, 0x33, 0x1f, 0xe5, 0x00, 0x20, 0x81, 0xe5, - 0x00, 0x10, 0x93, 0xe5, 0x00, 0x00, 0x51, 0xe3, - 0x03, 0x00, 0x00, 0x1a, 0x40, 0x10, 0x90, 0xe5, - 0x01, 0x20, 0xa0, 0xe3, 0xed, 0x09, 0x00, 0x22, - 0x01, 0x00, 0x20, 0x83, 0xe5, 0x20, 0x10, 0x80, - 0xe5, 0x3c, 0x10, 0x90, 0xe5, 0x2c, 0x10, 0x80, - 0xe5, 0x38, 0x10, 0x90, 0xe5, 0x00, 0x20, 0xa0, - 0xe3, 0x38, 0x20, 0x80, 0xe5, 0x00, 0x20, 0x81, - 0xe5, 0xec, 0x13, 0x1f, 0xe5, 0x18, 0x24, 0x1f, - 0xe5, 0x00, 0xd0, 0x91, 0xe5, 0x00, 0xa0, 0x92, - 0xe5, 0x94, 0xff, 0xff, 0xea, 0x14, 0x04, 0x1f, - 0xe5, 0x00, 0x00, 0x90, 0xe5, 0x1e, 0xff, 0x2f, - 0xe1, 0x18, 0x14, 0x1f, 0xe5, 0x00, 0x00, 0x81, - 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x2c, 0x14, 0x1f, - 0xe5, 0x00, 0x30, 0x91, 0xe5, 0x00, 0x00, 0x53, - 0xe3, 0x1d, 0x00, 0x00, 0x0a, 0x00, 0x10, 0x0f, - 0xe1, 0xc0, 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x2f, - 0xe1, 0x00, 0x10, 0x90, 0xe5, 0x00, 0x00, 0x51, - 0xe3, 0x0d, 0x00, 0x00, 0x0a, 0x01, 0x20, 0xa0, - 0xe3, 0x04, 0x20, 0x80, 0xe5, 0x04, 0x00, 0x2d, - 0xe5, 0x04, 0xe0, 0x2d, 0xe5, 0x03, 0x00, 0xa0, - 0xe1, 0x72, 0x00, 0x00, 0xeb, 0x04, 0xe0, 0x9d, - 0xe4, 0x04, 0x00, 0x9d, 0xe4, 0x74, 0x14, 0x1f, - 0xe5, 0x00, 0x30, 0x91, 0xe5, 0x00, 0x10, 0x0f, - 0xe1, 0xc0, 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x2f, - 0xe1, 0xee, 0xff, 0xff, 0xea, 0x00, 0x30, 0x80, - 0xe5, 0x00, 0x20, 0xa0, 0xe3, 0x04, 0x20, 0x80, - 0xe5, 0x38, 0x00, 0x83, 0xe5, 0xac, 0x24, 0x1f, - 0xe5, 0x00, 0x10, 0x0f, 0xe1, 0x00, 0x30, 0x92, - 0xe5, 0xc0, 0x10, 0xc1, 0xe3, 0x03, 0x10, 0x81, - 0xe1, 0x01, 0xf0, 0x2f, 0xe1, 0x1e, 0xff, 0x2f, - 0xe1, 0xb8, 0x14, 0x1f, 0xe5, 0x00, 0x30, 0x91, - 0xe5, 0x00, 0x00, 0x53, 0xe3, 0x12, 0x00, 0x00, - 0x0a, 0x38, 0x00, 0x93, 0xe5, 0x00, 0x00, 0x50, - 0xe3, 0x0f, 0x00, 0x00, 0x0a, 0x00, 0x10, 0x0f, - 0xe1, 0xc0, 0x10, 0x81, 0xe3, 0x01, 0xf0, 0xed, - 0x09, 0x00, 0x23, 0x01, 0x2f, 0xe1, 0x04, 0x20, - 0x90, 0xe5, 0x00, 0x00, 0x52, 0xe3, 0x00, 0x00, - 0x00, 0x0a, 0x8f, 0xff, 0xff, 0xea, 0x00, 0x20, - 0xa0, 0xe3, 0x00, 0x20, 0x80, 0xe5, 0x38, 0x20, - 0x83, 0xe5, 0x0c, 0x25, 0x1f, 0xe5, 0x00, 0x10, - 0x0f, 0xe1, 0x00, 0x30, 0x92, 0xe5, 0xc0, 0x10, - 0xc1, 0xe3, 0x03, 0x10, 0x81, 0xe1, 0x01, 0xf0, - 0x2f, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0x18, 0x15, - 0x1f, 0xe5, 0x00, 0x30, 0x91, 0xe5, 0x00, 0x00, - 0x53, 0xe3, 0x25, 0x00, 0x00, 0x0a, 0x00, 0x10, - 0x0f, 0xe1, 0xc0, 0x10, 0x81, 0xe3, 0x01, 0xf0, - 0x2f, 0xe1, 0x00, 0x20, 0xa0, 0xe3, 0x00, 0x20, - 0x80, 0xe5, 0x04, 0x10, 0x90, 0xe5, 0x00, 0x00, - 0x51, 0xe3, 0x17, 0x00, 0x00, 0x0a, 0xf0, 0x5f, - 0x2d, 0xe9, 0x0e, 0x20, 0xa0, 0xe1, 0x82, 0x2f, - 0xa0, 0xe1, 0x22, 0x2d, 0xa0, 0xe1, 0x04, 0x20, - 0x2d, 0xe5, 0x00, 0x20, 0xa0, 0xe3, 0x04, 0x20, - 0x2d, 0xe5, 0x64, 0x15, 0x1f, 0xe5, 0x00, 0x00, - 0x91, 0xe5, 0x5c, 0x35, 0x1f, 0xe5, 0x00, 0x20, - 0x81, 0xe5, 0x00, 0x10, 0x93, 0xe5, 0x00, 0x00, - 0x51, 0xe3, 0x03, 0x00, 0x00, 0x1a, 0x40, 0x10, - 0x90, 0xe5, 0x01, 0x20, 0xa0, 0xe3, 0x00, 0x20, - 0x83, 0xe5, 0x20, 0x10, 0x80, 0xe5, 0x2c, 0xd0, - 0x80, 0xe5, 0x80, 0x15, 0x1f, 0xe5, 0xac, 0x25, - 0x1f, 0xe5, 0x00, 0xd0, 0x91, 0xe5, 0x00, 0xa0, - 0x92, 0xe5, 0x2f, 0xff, 0xff, 0xea, 0xb8, 0x25, - 0x1f, 0xe5, 0x00, 0x10, 0x0f, 0xe1, 0x00, 0x30, - 0x92, 0xe5, 0xc0, 0x10, 0xc1, 0xe3, 0x03, 0x10, - 0x81, 0xe1, 0x01, 0xf0, 0x2f, 0xe1, 0x1e, 0xff, - 0x2f, 0xe1, 0xc4, 0x15, 0x1f, 0xe5, 0x00, 0x30, - 0x91, 0xe5, 0x00, 0x00, 0x53, 0xe3, 0x38, 0x00, - 0x83, 0x15, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x10, - 0x0f, 0xe1, 0xed, 0x09, 0x00, 0x24, 0x01, 0xc0, - 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x2f, 0xe1, 0x38, - 0x10, 0x90, 0xe5, 0x00, 0x00, 0x51, 0xe3, 0x0a, - 0x00, 0x00, 0x0a, 0x01, 0x20, 0xa0, 0xe3, 0x04, - 0x20, 0x81, 0xe5, 0xf8, 0x25, 0x1f, 0xe5, 0x04, - 0x00, 0x2d, 0xe5, 0x04, 0xe0, 0x2d, 0xe5, 0x00, - 0x10, 0xa0, 0xe1, 0x00, 0x00, 0x92, 0xe5, 0x09, - 0x00, 0x00, 0xeb, 0x04, 0xe0, 0x9d, 0xe4, 0x04, - 0x00, 0x9d, 0xe4, 0xee, 0xff, 0xff, 0xea, 0x2c, - 0x26, 0x1f, 0xe5, 0x00, 0x10, 0x0f, 0xe1, 0x00, - 0x30, 0x92, 0xe5, 0xc0, 0x10, 0xc1, 0xe3, 0x03, - 0x10, 0x81, 0xe1, 0x01, 0xf0, 0x2f, 0xe1, 0x1e, - 0xff, 0x2f, 0xe1, 0xf0, 0x5f, 0x2d, 0xe9, 0x0e, - 0x20, 0xa0, 0xe1, 0x82, 0x2f, 0xa0, 0xe1, 0x22, - 0x2d, 0xa0, 0xe1, 0x04, 0x20, 0x2d, 0xe5, 0x00, - 0x20, 0xa0, 0xe3, 0x04, 0x20, 0x2d, 0xe5, 0x01, - 0x40, 0xa0, 0xe1, 0x58, 0x16, 0x1f, 0xe5, 0x4c, - 0x36, 0x1f, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0x00, - 0x10, 0x93, 0xe5, 0x00, 0x00, 0x51, 0xe3, 0x03, - 0x00, 0x00, 0x1a, 0x40, 0x10, 0x90, 0xe5, 0x01, - 0x20, 0xa0, 0xe3, 0x00, 0x20, 0x83, 0xe5, 0x20, - 0x10, 0x80, 0xe5, 0x2c, 0xd0, 0x80, 0xe5, 0x70, - 0x16, 0x1f, 0xe5, 0x9c, 0x26, 0x1f, 0xe5, 0x00, - 0xd0, 0x91, 0xe5, 0x00, 0xa0, 0x92, 0xe5, 0xa4, - 0x26, 0x1f, 0xe5, 0x00, 0x10, 0x0f, 0xe1, 0x00, - 0x30, 0x92, 0xe5, 0xc0, 0x10, 0xc1, 0xe3, 0x03, - 0x10, 0x81, 0xe1, 0x04, 0x00, 0xa0, 0xe1, 0x01, - 0xf0, 0x2f, 0xe1, 0xc0, 0x10, 0x81, 0xe3, 0x01, - 0xf0, 0x2f, 0xe1, 0xfb, 0xfe, 0xff, 0xea, 0x00, - 0x20, 0x4f, 0xe1, 0x80, 0x20, 0x02, 0xe2, 0x00, - 0x00, 0x52, 0xe3, 0x19, 0x00, 0x00, 0x0a, 0xb4, - 0x06, 0x1f, 0xe5, 0x00, 0x10, 0x90, 0xe5, 0x01, - 0x10, 0x81, 0xe2, 0x00, 0x10, 0xed, 0x09, 0x00, - 0x25, 0x01, 0x80, 0xe5, 0x70, 0x00, 0x2d, 0xe9, - 0x00, 0x40, 0x4f, 0xe1, 0x0e, 0x50, 0xa0, 0xe1, - 0x0d, 0x60, 0xa0, 0xe1, 0x1c, 0xd0, 0x8d, 0xe2, - 0x00, 0x00, 0x0f, 0xe1, 0x1f, 0x00, 0xc0, 0xe3, - 0x13, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, - 0x0d, 0x10, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, - 0x04, 0x30, 0x21, 0xe5, 0x09, 0x30, 0xa0, 0xe1, - 0x80, 0x7f, 0x21, 0xe9, 0x01, 0xd0, 0xa0, 0xe1, - 0x80, 0x03, 0xb6, 0xe8, 0x80, 0x03, 0x2d, 0xe9, - 0x03, 0x90, 0xa0, 0xe1, 0x0f, 0x00, 0x96, 0xe8, - 0x0f, 0x00, 0x2d, 0xe9, 0x04, 0x40, 0x2d, 0xe5, - 0x15, 0xff, 0x2f, 0xe1, 0x34, 0x17, 0x1f, 0xe5, - 0x00, 0x10, 0x91, 0xe5, 0x00, 0x00, 0x51, 0xe3, - 0x1c, 0x00, 0x00, 0x0a, 0x70, 0x00, 0x2d, 0xe9, - 0x0e, 0x50, 0xa0, 0xe1, 0x00, 0x40, 0x4f, 0xe1, - 0x0d, 0x60, 0xa0, 0xe1, 0x1c, 0xd0, 0x8d, 0xe2, - 0x00, 0x00, 0x0f, 0xe1, 0x1f, 0x00, 0xc0, 0xe3, - 0x13, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, - 0x0d, 0x10, 0xa0, 0xe1, 0x00, 0x00, 0xa0, 0xe1, - 0x04, 0x30, 0x21, 0xe5, 0x80, 0x7f, 0x21, 0xe9, - 0x01, 0xd0, 0xa0, 0xe1, 0x80, 0x03, 0xb6, 0xe8, - 0x80, 0x03, 0x2d, 0xe9, 0x0f, 0x00, 0x96, 0xe8, - 0x0f, 0x00, 0x2d, 0xe9, 0x04, 0x40, 0x2d, 0xe5, - 0x01, 0x10, 0xa0, 0xe3, 0x04, 0x10, 0x2d, 0xe5, - 0x98, 0x17, 0x1f, 0xe5, 0x00, 0x00, 0x91, 0xe5, - 0x2c, 0xd0, 0x80, 0xe5, 0x90, 0x17, 0x1f, 0xe5, - 0xbc, 0x27, 0x1f, 0xe5, 0x00, 0xd0, 0x91, 0xe5, - 0x00, 0xa0, 0x92, 0xe5, 0x15, 0xff, 0x2f, 0xe1, - 0x0e, 0x50, 0xa0, 0xe1, 0x10, 0xd0, 0x8d, 0xe2, - 0x00, 0x00, 0x0f, 0xe1, 0x1f, 0x00, 0xc0, 0xe3, - 0x13, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, - 0x15, 0xff, 0x2f, 0xe1, 0x00, 0x10, 0x0f, 0xe1, - 0xed, 0x09, 0x00, 0x26, 0x01, 0xc0, 0x10, 0x81, - 0xe3, 0x01, 0xf0, 0x2f, 0xe1, 0xc8, 0x07, 0x1f, - 0xe5, 0x00, 0x10, 0x90, 0xe5, 0x00, 0x00, 0x51, - 0xe3, 0x04, 0x00, 0x00, 0x0a, 0x01, 0x10, 0x41, - 0xe2, 0x00, 0x10, 0x80, 0xe5, 0x04, 0x00, 0x9d, - 0xe4, 0x00, 0xf0, 0x6f, 0xe1, 0xff, 0xff, 0xdd, - 0xe8, 0x04, 0x18, 0x1f, 0xe5, 0x00, 0x00, 0x91, - 0xe5, 0x00, 0x00, 0x50, 0xe3, 0x0a, 0x00, 0x00, - 0x0a, 0x04, 0x38, 0x1f, 0xe5, 0x00, 0x20, 0xa0, - 0xe3, 0x00, 0x20, 0x81, 0xe5, 0x00, 0x10, 0x93, - 0xe5, 0x00, 0x00, 0x51, 0xe3, 0x04, 0x00, 0x00, - 0x1a, 0x20, 0x28, 0x1f, 0xe5, 0x01, 0x10, 0xa0, - 0xe3, 0x00, 0x20, 0x92, 0xe5, 0x00, 0x10, 0x83, - 0xe5, 0x20, 0x20, 0x80, 0xe5, 0x2c, 0x18, 0x1f, - 0xe5, 0x58, 0x28, 0x1f, 0xe5, 0x00, 0xd0, 0x91, - 0xe5, 0x00, 0xa0, 0x92, 0xe5, 0x84, 0xfe, 0xff, - 0xea, 0x04, 0x40, 0x2d, 0xe5, 0x00, 0x40, 0x0f, - 0xe1, 0xc0, 0x10, 0x84, 0xe3, 0x01, 0xf0, 0x2f, - 0xe1, 0x40, 0x10, 0x90, 0xe5, 0x00, 0x00, 0x51, - 0xe3, 0x04, 0x00, 0x00, 0x0a, 0x01, 0x10, 0x91, - 0xe2, 0x40, 0x10, 0x80, 0xe5, 0x00, 0x10, 0xe0, - 0x03, 0x40, 0x10, 0x80, 0x05, 0x13, 0x00, 0x00, - 0xea, 0x01, 0x10, 0xa0, 0xe3, 0x40, 0x10, 0x80, - 0xe5, 0x1a, 0x10, 0xd0, 0xe5, 0x74, 0x28, 0x1f, - 0xe5, 0x01, 0x31, 0x92, 0xe7, 0x00, 0x00, 0x53, - 0xe3, 0x02, 0x00, 0x00, 0x0a, 0x3c, 0x00, 0x83, - 0xe5, 0x01, 0x01, 0x82, 0xe7, 0x09, 0x00, 0x00, - 0xea, 0x8c, 0x38, 0x1f, 0xe5, 0x01, 0x01, 0x82, - 0xe7, 0x01, 0x01, 0x83, 0xe7, 0x00, 0x10, 0x93, - 0xe5, 0xb8, 0x08, 0x1f, 0xe5, 0x00, 0x00, 0x51, - 0xe3, 0x04, 0x10, 0x93, 0x05, 0x00, 0x00, 0x51, - 0x03, 0x08, 0x10, 0x93, 0x05, 0x00, 0x10, 0x80, - 0xe5, 0x04, 0xf0, 0xed, 0x09, 0x00, 0x27, 0x01, - 0x2f, 0xe1, 0x04, 0x40, 0x9d, 0xe4, 0x00, 0x00, - 0xa0, 0xe3, 0x1e, 0xff, 0x2f, 0xe1, 0xe4, 0x08, - 0x1f, 0xe5, 0x00, 0x50, 0x90, 0xe5, 0x44, 0x40, - 0x95, 0xe5, 0x01, 0x00, 0x14, 0xe3, 0x02, 0x00, - 0x00, 0x1a, 0x0f, 0xe0, 0xa0, 0xe1, 0x14, 0xff, - 0x2f, 0xe1, 0x02, 0x00, 0x00, 0xea, 0xc4, 0xe0, - 0x9f, 0xe5, 0x14, 0xff, 0x2f, 0xe1, 0x31, 0x49, - 0x08, 0x47, 0x00, 0x10, 0x0f, 0xe1, 0xc0, 0x10, - 0x81, 0xe3, 0x01, 0xf0, 0x2f, 0xe1, 0x40, 0x00, - 0x95, 0xe5, 0x01, 0x00, 0x50, 0xe2, 0x40, 0x00, - 0x85, 0xe5, 0x06, 0x00, 0x00, 0x0a, 0x3c, 0x29, - 0x1f, 0xe5, 0x00, 0x10, 0x0f, 0xe1, 0x00, 0x30, - 0x92, 0xe5, 0xc0, 0x10, 0xc1, 0xe3, 0x03, 0x10, - 0x81, 0xe1, 0x01, 0xf0, 0x2f, 0xe1, 0xe8, 0xff, - 0xff, 0xea, 0x2c, 0xe9, 0x1f, 0xe5, 0x1a, 0x30, - 0xd5, 0xe5, 0x03, 0x61, 0x9e, 0xe7, 0x50, 0x29, - 0x1f, 0xe5, 0x00, 0xc0, 0xa0, 0xe3, 0x3c, 0x19, - 0x1f, 0xe5, 0x05, 0x00, 0x56, 0xe1, 0x08, 0x00, - 0x00, 0x1a, 0x03, 0xc1, 0x81, 0xe7, 0x03, 0xc1, - 0x8e, 0xe7, 0x00, 0x30, 0x91, 0xe5, 0x00, 0x00, - 0x53, 0xe3, 0x04, 0x30, 0x91, 0x05, 0x00, 0x00, - 0x53, 0x03, 0x08, 0x30, 0x91, 0x05, 0x00, 0x30, - 0x82, 0xe5, 0x02, 0x00, 0x00, 0xea, 0x3c, 0xe0, - 0x95, 0xe5, 0x03, 0xe1, 0x81, 0xe7, 0x00, 0xe0, - 0x82, 0xe5, 0xa0, 0xe9, 0x1f, 0xe5, 0xf0, 0x5f, - 0x2d, 0xe9, 0x00, 0x20, 0xa0, 0xe3, 0x04, 0x20, - 0x2d, 0xe5, 0x04, 0x20, 0x2d, 0xe5, 0xac, 0x19, - 0x1f, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0x2c, 0xd0, - 0x85, 0xe5, 0xa4, 0x19, 0x1f, 0xe5, 0xd0, 0x29, - 0x1f, 0xe5, 0x00, 0xd0, 0x91, 0xe5, 0x00, 0xa0, - 0x92, 0xe5, 0x26, 0xfe, 0xff, 0xea, 0x61, 0x37, - 0x01, 0x20, 0xd1, 0x24, 0x01, 0x20, 0xed, 0x09, - 0x00, 0x28, 0x01, 0xd4, 0x24, 0x01, 0x20, 0xff, - 0xb5, 0x07, 0x1c, 0x0d, 0x98, 0x00, 0x21, 0x0c, - 0x9c, 0x0b, 0x9d, 0x0a, 0x9e, 0xf9, 0x60, 0x01, - 0x9a, 0x7b, 0x18, 0x52, 0x5c, 0x01, 0x31, 0x08, - 0x29, 0x1a, 0x74, 0xf8, 0xdb, 0x02, 0x9a, 0xfa, - 0x65, 0x03, 0x9b, 0x3b, 0x66, 0x09, 0x99, 0x79, - 0x66, 0x01, 0x21, 0x39, 0x76, 0x00, 0x21, 0x79, - 0x76, 0xf9, 0x61, 0x38, 0x64, 0x38, 0x62, 0xb9, - 0x63, 0xb9, 0x66, 0xf9, 0x66, 0x39, 0x67, 0x0e, - 0x98, 0x0a, 0x28, 0x02, 0xd1, 0x01, 0x21, 0xf9, - 0x76, 0x01, 0xe0, 0x00, 0x21, 0xf9, 0x76, 0x55, - 0x21, 0x30, 0x1c, 0x2a, 0x1c, 0xed, 0xf7, 0x8d, - 0xfe, 0x7e, 0x62, 0x00, 0x26, 0x2d, 0x49, 0xa0, - 0x00, 0x40, 0x18, 0xbe, 0x62, 0x3d, 0x63, 0x7d, - 0x63, 0x62, 0x07, 0x52, 0x0f, 0xbc, 0x76, 0x38, - 0x65, 0x01, 0x21, 0x08, 0x1c, 0x90, 0x40, 0xfd, - 0x1d, 0x49, 0x35, 0x28, 0x72, 0xe0, 0x10, 0x00, - 0x06, 0x00, 0x0e, 0x81, 0x40, 0xf9, 0x64, 0x23, - 0x49, 0x08, 0x18, 0x78, 0x65, 0x3e, 0x60, 0x7e, - 0x60, 0x7e, 0x64, 0xbe, 0x64, 0x38, 0x1c, 0x23, - 0xf0, 0x6c, 0xf9, 0xf8, 0x1d, 0x79, 0x30, 0xc6, - 0x60, 0x06, 0x61, 0x46, 0x61, 0xf8, 0x1d, 0x71, - 0x30, 0xae, 0x72, 0x7e, 0x67, 0x39, 0x1c, 0x01, - 0xf0, 0x8e, 0xf8, 0x19, 0x48, 0x23, 0xf0, 0x45, - 0xf9, 0x19, 0x48, 0xf8, 0x60, 0x19, 0x48, 0x01, - 0x68, 0x00, 0x29, 0x06, 0xd0, 0x09, 0x68, 0x39, - 0x60, 0x4f, 0x60, 0x00, 0x68, 0x78, 0x60, 0x07, - 0x60, 0x03, 0xe0, 0x07, 0x60, 0x3f, 0x60, 0x7f, - 0x60, 0x38, 0x1c, 0x12, 0x48, 0x01, 0x68, 0x01, - 0x31, 0x01, 0x60, 0x23, 0xf0, 0x2a, 0xf9, 0x0f, - 0x98, 0x0c, 0x28, 0x0d, 0xd1, 0x0f, 0x48, 0x23, - 0xf0, 0x28, 0xf9, 0x01, 0x21, 0x38, 0x1c, 0x00, - 0xf0, 0xed, 0x09, 0x00, 0x29, 0x01, 0x3e, 0xf9, - 0x00, 0x28, 0x02, 0xd0, 0x23, 0xf0, 0x28, 0xf9, - 0x01, 0xe0, 0x23, 0xf0, 0x19, 0xf9, 0x30, 0x1c, - 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x34, 0xb3, 0x03, 0x20, 0x34, 0xb7, 0x03, 0x20, - 0xf8, 0x66, 0x03, 0x20, 0x4b, 0x53, 0x41, 0x54, - 0xc8, 0x65, 0x03, 0x20, 0xcc, 0x65, 0x03, 0x20, - 0x00, 0x67, 0x03, 0x20, 0xff, 0xb5, 0x00, 0x23, - 0x0a, 0x9c, 0x09, 0x9d, 0xc3, 0x60, 0x07, 0x1c, - 0x00, 0x20, 0x0b, 0x5c, 0x3e, 0x18, 0x01, 0x30, - 0x08, 0x28, 0x33, 0x74, 0xf9, 0xdb, 0x00, 0x26, - 0x7a, 0x64, 0xfe, 0x61, 0x3e, 0x62, 0x55, 0x21, - 0x28, 0x1c, 0x22, 0x1c, 0x3e, 0x64, 0xed, 0xf7, - 0x0b, 0xfe, 0x3c, 0x63, 0x7d, 0x62, 0xbe, 0x62, - 0x7c, 0x63, 0x03, 0x9b, 0x98, 0x07, 0x80, 0x0f, - 0xb8, 0x76, 0x3e, 0x60, 0x7e, 0x60, 0xfe, 0x63, - 0xbe, 0x63, 0x38, 0x1c, 0x23, 0xf0, 0x00, 0xf9, - 0x0e, 0x48, 0x23, 0xf0, 0xe1, 0xf8, 0x0e, 0x48, - 0xf8, 0x60, 0x0e, 0x48, 0x01, 0x68, 0x00, 0x29, - 0x06, 0xd0, 0x09, 0x68, 0x39, 0x60, 0x4f, 0x60, - 0x00, 0x68, 0x78, 0x60, 0x07, 0x60, 0x02, 0xe0, - 0x07, 0x60, 0x3f, 0x60, 0x7f, 0x60, 0x08, 0x48, - 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x23, 0xf0, - 0xc7, 0xf8, 0x30, 0x1c, 0x04, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x10, 0x67, 0x03, 0x20, - 0x52, 0x53, 0x49, 0x48, 0xdc, 0x66, 0x03, 0x20, - 0xe0, 0x66, 0x03, 0x20, 0x90, 0xb5, 0x07, 0x1c, - 0x0f, 0x48, 0x23, 0xf0, 0xb9, 0xf8, 0x39, 0x68, - 0x00, 0x24, 0xb9, 0x42, 0x0d, 0x48, 0x01, 0xd1, - 0x04, 0x60, 0x09, 0xe0, 0x7a, 0x68, 0x4a, 0x60, - 0x06, 0xcf, 0x08, 0x3f, 0x11, 0x60, 0x01, 0x68, - 0x8f, 0x42, 0x01, 0xd1, 0x79, 0x68, 0x01, 0x60, - 0x07, 0x48, 0x01, 0x68, 0xed, 0x09, 0x00, 0x2a, - 0x01, 0x01, 0x39, 0x01, 0x60, 0xfc, 0x60, 0x23, - 0xf0, 0x9d, 0xf8, 0x20, 0x1c, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xf8, 0x66, 0x03, - 0x20, 0xc8, 0x65, 0x03, 0x20, 0xcc, 0x65, 0x03, - 0x20, 0x90, 0xb5, 0x07, 0x1c, 0x0f, 0x48, 0x23, - 0xf0, 0x91, 0xf8, 0x39, 0x68, 0x00, 0x24, 0xb9, - 0x42, 0x0d, 0x48, 0x01, 0xd1, 0x04, 0x60, 0x09, - 0xe0, 0x7a, 0x68, 0x4a, 0x60, 0x06, 0xcf, 0x08, - 0x3f, 0x11, 0x60, 0x01, 0x68, 0x8f, 0x42, 0x01, - 0xd1, 0x79, 0x68, 0x01, 0x60, 0x07, 0x48, 0x01, - 0x68, 0x01, 0x39, 0x01, 0x60, 0xfc, 0x60, 0x23, - 0xf0, 0x75, 0xf8, 0x20, 0x1c, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x10, 0x67, 0x03, - 0x20, 0xdc, 0x66, 0x03, 0x20, 0xe0, 0x66, 0x03, - 0x20, 0xf0, 0xb5, 0x14, 0x1c, 0x0d, 0x1c, 0x06, - 0x1c, 0x0e, 0x48, 0x23, 0xf0, 0x67, 0xf8, 0x30, - 0x7e, 0x0b, 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x0d, - 0xd1, 0x74, 0x66, 0x35, 0x66, 0x01, 0x20, 0x30, - 0x76, 0x00, 0x20, 0x70, 0x76, 0xf0, 0x61, 0x30, - 0x6b, 0x00, 0x27, 0x70, 0x63, 0x30, 0x1c, 0x23, - 0xf0, 0x6d, 0xf8, 0x01, 0xe0, 0x25, 0x27, 0xff, - 0x43, 0x23, 0xf0, 0x4c, 0xf8, 0x38, 0x1c, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x67, 0x03, - 0x20, 0xf8, 0xb5, 0x07, 0x1c, 0x2e, 0x48, 0x2f, - 0x4c, 0x00, 0x68, 0x87, 0x42, 0x0c, 0xd1, 0x20, - 0x1c, 0x23, 0xf0, 0x40, 0xf8, 0x00, 0x22, 0xd2, - 0x43, 0x00, 0x92, 0x00, 0x22, 0x00, 0x23, 0x0c, - 0x21, 0x38, 0x1c, 0x00, 0xf0, 0xf1, 0xf8, 0x46, - 0xe0, 0x20, 0x1c, 0x23, 0xf0, 0x33, 0xf8, 0xfe, - 0x1d, 0x71, 0x36, 0x39, 0xe0, 0x00, 0x2d, 0x0a, - 0xd1, 0xea, 0x43, 0x00, 0x92, 0x00, 0x22, 0x00, - 0x23, 0x0c, 0x21, 0x38, 0x1c, 0x00, 0xf0, 0xed, - 0x09, 0x00, 0x2b, 0x01, 0xe0, 0xf8, 0x23, 0xf0, - 0x20, 0xf8, 0x29, 0xe0, 0x3c, 0x6f, 0x23, 0xf0, - 0x1c, 0xf8, 0x00, 0x2c, 0x02, 0xd0, 0x20, 0x1c, - 0x23, 0xf0, 0x1b, 0xf8, 0x19, 0x48, 0x23, 0xf0, - 0x18, 0xf8, 0x38, 0x7e, 0xa8, 0x42, 0x12, 0xd1, - 0x38, 0x6f, 0xa0, 0x42, 0x0f, 0xd1, 0xb9, 0x6e, - 0x00, 0x29, 0x02, 0xd0, 0xf8, 0x6e, 0xed, 0xf7, - 0x8b, 0xfd, 0x0c, 0x20, 0x38, 0x76, 0x78, 0x6f, - 0x00, 0x28, 0x04, 0xd0, 0x30, 0x1c, 0x00, 0xf0, - 0x55, 0xff, 0x00, 0x21, 0x79, 0x67, 0x00, 0x2c, - 0x04, 0xd0, 0x20, 0x1c, 0x23, 0xf0, 0x09, 0xf8, - 0x00, 0x21, 0x39, 0x67, 0x22, 0xf0, 0xf5, 0xff, - 0x08, 0x48, 0x22, 0xf0, 0xf6, 0xff, 0x3d, 0x7e, - 0x0b, 0x2d, 0x01, 0xd0, 0x0c, 0x2d, 0xc0, 0xd1, - 0x22, 0xf0, 0xeb, 0xff, 0xf8, 0xbc, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, 0xe8, 0x66, - 0x03, 0x20, 0x00, 0x67, 0x03, 0x20, 0xf0, 0xb5, - 0x04, 0x1c, 0x02, 0x7e, 0xe6, 0x1d, 0x49, 0x36, - 0x78, 0x30, 0x00, 0x27, 0x00, 0x25, 0x8a, 0x42, - 0x4c, 0xd1, 0xb1, 0x7a, 0x00, 0x29, 0x02, 0xd1, - 0x68, 0x34, 0xa2, 0xc4, 0x74, 0x3c, 0x61, 0x6f, - 0x00, 0x29, 0x05, 0xd0, 0xb1, 0x7a, 0x00, 0x29, - 0x02, 0xd1, 0x00, 0xf0, 0x1f, 0xff, 0x65, 0x67, - 0x60, 0x7e, 0x00, 0x28, 0x03, 0xd0, 0x65, 0x76, - 0x01, 0x20, 0x20, 0x76, 0x46, 0xe0, 0x25, 0x76, - 0x20, 0x6d, 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, - 0x41, 0x6c, 0x61, 0x64, 0x8c, 0x64, 0xa0, 0x64, - 0x44, 0x64, 0x3b, 0xe0, 0x64, 0x64, 0xa4, 0x64, - 0x20, 0x6d, 0x04, 0x60, 0x1e, 0x48, 0xe1, 0x6c, - 0x02, 0x68, 0x11, 0x43, 0x01, 0x60, 0x60, 0x6d, - 0x32, 0x7a, 0x01, 0x78, 0x11, 0x43, 0x01, 0x70, - 0x1a, 0x48, 0xa1, 0x7e, 0x02, 0x68, 0x91, 0x42, - 0x28, 0xda, 0xed, 0x09, 0x00, 0x2c, 0x01, 0x01, - 0x60, 0x18, 0x48, 0x01, 0x68, 0x00, 0x29, 0x01, - 0xd1, 0x04, 0x60, 0x21, 0xe0, 0xc9, 0x7e, 0x00, - 0x29, 0x03, 0xd1, 0x14, 0x49, 0x09, 0x68, 0x01, - 0x29, 0x1a, 0xd1, 0x04, 0x60, 0x13, 0x48, 0x00, - 0x68, 0x00, 0x28, 0x15, 0xd0, 0xc0, 0x68, 0x11, - 0x4b, 0x98, 0x42, 0x11, 0xd1, 0x01, 0x27, 0x0f, - 0xe0, 0x01, 0x29, 0x00, 0xd1, 0x65, 0x76, 0x72, - 0x7a, 0x8a, 0x42, 0x09, 0xd1, 0xb1, 0x7a, 0x00, - 0x29, 0x06, 0xd0, 0x75, 0x72, 0x61, 0x6f, 0x00, - 0x29, 0x02, 0xd0, 0x00, 0xf0, 0xd1, 0xfe, 0x65, - 0x67, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0xd0, 0x65, 0x03, 0x20, 0xd4, - 0x66, 0x03, 0x20, 0xd8, 0x66, 0x03, 0x20, 0x80, - 0x65, 0x03, 0x20, 0xe8, 0x66, 0x03, 0x20, 0x4b, - 0x53, 0x41, 0x54, 0xb0, 0xb5, 0x07, 0x1c, 0x10, - 0x48, 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x84, - 0x6b, 0x00, 0xe0, 0x00, 0x24, 0x0e, 0x4d, 0x28, - 0x1c, 0x22, 0xf0, 0x61, 0xff, 0x01, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0x77, 0xff, 0x00, 0x28, 0x01, - 0xd0, 0x22, 0xf0, 0x61, 0xff, 0x00, 0x2c, 0x06, - 0xd0, 0x20, 0x1c, 0x22, 0xf0, 0x64, 0xff, 0x28, - 0x1c, 0x22, 0xf0, 0x5d, 0xff, 0x01, 0xe0, 0x22, - 0xf0, 0x4a, 0xff, 0xb0, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0xe8, 0x66, 0x03, 0x20, 0x00, - 0x67, 0x03, 0x20, 0xf0, 0xb5, 0x0f, 0x1c, 0x05, - 0x99, 0x1c, 0x1c, 0x01, 0x23, 0x15, 0x1c, 0x06, - 0x1c, 0xd9, 0x42, 0x05, 0xd0, 0x01, 0x20, 0x70, - 0x67, 0xf0, 0x1d, 0x71, 0x30, 0x00, 0xf0, 0x83, - 0xfe, 0x42, 0x48, 0x00, 0x68, 0x86, 0x42, 0x0d, - 0xd0, 0xb0, 0x6b, 0x00, 0x28, 0x0a, 0xd0, 0x22, - 0xf0, 0x2a, 0xff, 0x30, 0x1c, 0x22, 0xf0, 0x3f, - 0xff, 0x3d, 0x48, 0x22, 0xf0, 0xed, 0x09, 0x00, - 0x2d, 0x01, 0x28, 0xff, 0xb0, 0x6b, 0x00, 0x28, - 0xf1, 0xd1, 0x30, 0x7e, 0x00, 0x28, 0x68, 0xd1, - 0x37, 0x76, 0xf4, 0x66, 0xb5, 0x66, 0xb0, 0x6c, - 0xff, 0x24, 0x01, 0x34, 0x00, 0x27, 0xb0, 0x42, - 0x35, 0x4a, 0x3b, 0xd1, 0x77, 0x64, 0xb7, 0x64, - 0x30, 0x6d, 0xf3, 0x1d, 0x07, 0x60, 0x70, 0x6d, - 0x49, 0x33, 0x1b, 0x7a, 0x01, 0x78, 0x99, 0x43, - 0x01, 0x70, 0x70, 0x6d, 0x01, 0x78, 0x2f, 0x48, - 0x00, 0x29, 0x04, 0xd1, 0xf1, 0x6c, 0x03, 0x68, - 0xc9, 0x43, 0x19, 0x40, 0x01, 0x60, 0xb1, 0x7e, - 0x13, 0x68, 0x1b, 0x06, 0x1b, 0x0e, 0x99, 0x42, - 0x2d, 0xd1, 0x01, 0x68, 0x00, 0x29, 0x01, 0xd1, - 0x14, 0x60, 0x28, 0xe0, 0x08, 0x06, 0x01, 0xd0, - 0x00, 0x20, 0x0a, 0xe0, 0x08, 0x0a, 0x00, 0x06, - 0x01, 0xd0, 0x08, 0x20, 0x05, 0xe0, 0x08, 0x0c, - 0x00, 0x06, 0x01, 0xd0, 0x10, 0x20, 0x00, 0xe0, - 0x18, 0x20, 0xc1, 0x40, 0x0b, 0x06, 0x1e, 0x49, - 0x1b, 0x0e, 0xcb, 0x5c, 0x18, 0x18, 0x1d, 0x4b, - 0x1b, 0x5c, 0xc0, 0x00, 0xc9, 0x5c, 0x40, 0x18, - 0x10, 0x60, 0x0c, 0xe0, 0x71, 0x6c, 0x88, 0x64, - 0x70, 0x6c, 0xb1, 0x6c, 0x48, 0x64, 0x30, 0x6d, - 0x01, 0x68, 0xb1, 0x42, 0x01, 0xd1, 0xb1, 0x6c, - 0x01, 0x60, 0xb7, 0x64, 0x77, 0x64, 0x14, 0x48, - 0x01, 0x68, 0x8e, 0x42, 0x08, 0xd1, 0x11, 0x68, - 0xa1, 0x42, 0x04, 0xda, 0x11, 0x4a, 0x89, 0x00, - 0x51, 0x58, 0x01, 0x60, 0x00, 0xe0, 0x07, 0x60, - 0x07, 0x48, 0x00, 0x68, 0x86, 0x42, 0x01, 0xd1, - 0x22, 0xf0, 0xc4, 0xfe, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xff, 0xe7, 0x01, 0x2f, 0xf9, 0xd1, - 0x01, 0x20, 0x70, 0x76, 0xf6, 0xe7, 0x00, 0x00, - 0xe8, 0x66, 0x03, 0x20, 0x00, 0x67, 0x03, 0x20, - 0xd4, 0x66, 0x03, 0x20, 0xd0, 0x65, 0x03, 0x20, - 0xed, 0x09, 0x00, 0x2e, 0x01, 0xd4, 0x65, 0x03, - 0x20, 0x34, 0xb7, 0x03, 0x20, 0xd8, 0x66, 0x03, - 0x20, 0x34, 0xb3, 0x03, 0x20, 0x88, 0xb5, 0x07, - 0x1c, 0x08, 0x48, 0x22, 0xf0, 0x9d, 0xfe, 0x00, - 0x22, 0xd2, 0x43, 0x00, 0x92, 0x00, 0x22, 0x00, - 0x23, 0x01, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0x4e, - 0xff, 0x22, 0xf0, 0x8e, 0xfe, 0x88, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x67, 0x03, - 0x20, 0xf0, 0xb5, 0x07, 0x1c, 0x1e, 0x48, 0x22, - 0xf0, 0x87, 0xfe, 0xfe, 0x1d, 0x49, 0x36, 0xb0, - 0x7a, 0x3d, 0x6f, 0x00, 0x28, 0x01, 0xd0, 0x74, - 0x7a, 0x00, 0xe0, 0x3c, 0x7e, 0x22, 0xf0, 0x78, - 0xfe, 0x00, 0x2d, 0x02, 0xd0, 0x28, 0x1c, 0x22, - 0xf0, 0x77, 0xfe, 0x15, 0x48, 0x22, 0xf0, 0x74, - 0xfe, 0x38, 0x7e, 0xa0, 0x42, 0x05, 0xd0, 0xb0, - 0x7a, 0x00, 0x28, 0x13, 0xd0, 0x70, 0x7a, 0xa0, - 0x42, 0x10, 0xd1, 0x78, 0x6f, 0x00, 0x28, 0x0d, - 0xd0, 0xf8, 0x6f, 0x00, 0x28, 0x0a, 0xd1, 0x78, - 0x67, 0xb9, 0x6e, 0x00, 0x29, 0x02, 0xd0, 0xf8, - 0x6e, 0xed, 0xf7, 0xdd, 0xfb, 0x38, 0x1c, 0x21, - 0x1c, 0xff, 0xf7, 0x74, 0xfe, 0x00, 0x2d, 0x05, - 0xd0, 0x28, 0x1c, 0x22, 0xf0, 0x65, 0xfe, 0x04, - 0x48, 0x22, 0xf0, 0x5e, 0xfe, 0x22, 0xf0, 0x4c, - 0xfe, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x00, 0x67, 0x03, 0x20, 0x88, 0xb5, 0x07, - 0x1c, 0x07, 0x48, 0x22, 0xf0, 0x45, 0xfe, 0x07, - 0x48, 0x00, 0x97, 0x00, 0x23, 0x00, 0x22, 0x02, - 0x21, 0x00, 0x68, 0xff, 0xf7, 0xf7, 0xfe, 0x22, - 0xf0, 0x37, 0xfe, 0x88, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x67, 0x03, 0x20, 0xe8, 0x66, 0x03, - 0x20, 0x80, 0xb5, 0x0f, 0x48, 0x22, 0xf0, 0x30, - 0xfe, 0x0e, 0x48, 0x0f, 0x49, 0x00, 0x68, 0x82, - 0x6c, 0x82, 0x42, 0xed, 0x09, 0x00, 0x2f, 0x01, - 0x05, 0xd1, 0x83, 0x7e, 0x0f, 0x68, 0x3f, 0x06, - 0x3f, 0x0e, 0xbb, 0x42, 0x09, 0xd0, 0x00, 0x6d, - 0x02, 0x60, 0x08, 0x68, 0x09, 0x49, 0x80, 0x00, - 0x08, 0x58, 0x08, 0x49, 0x08, 0x60, 0x22, 0xf0, - 0x22, 0xfe, 0x22, 0xf0, 0x14, 0xfe, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x67, - 0x03, 0x20, 0xe8, 0x66, 0x03, 0x20, 0xd4, 0x66, - 0x03, 0x20, 0x34, 0xb3, 0x03, 0x20, 0xd8, 0x66, - 0x03, 0x20, 0x80, 0xb5, 0x07, 0x1c, 0x10, 0x48, - 0x22, 0xf0, 0x05, 0xfe, 0x38, 0x7e, 0x00, 0x28, - 0x16, 0xd1, 0xf8, 0x7e, 0x00, 0x28, 0x13, 0xd0, - 0xb9, 0x6c, 0x0c, 0x48, 0xb9, 0x42, 0x05, 0xd1, - 0xba, 0x7e, 0x03, 0x68, 0x1b, 0x06, 0x1b, 0x0e, - 0x9a, 0x42, 0x09, 0xd0, 0x3a, 0x6d, 0x11, 0x60, - 0x00, 0x68, 0x07, 0x49, 0x80, 0x00, 0x08, 0x58, - 0x07, 0x49, 0x08, 0x60, 0x38, 0x6c, 0x38, 0x62, - 0x22, 0xf0, 0xe5, 0xfd, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x67, 0x03, 0x20, 0xd4, 0x66, - 0x03, 0x20, 0x34, 0xb3, 0x03, 0x20, 0xd8, 0x66, - 0x03, 0x20, 0x04, 0x48, 0x00, 0x68, 0x00, 0x28, - 0x03, 0xd0, 0xc1, 0x68, 0x03, 0x4b, 0x99, 0x42, - 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0xe8, 0x66, - 0x03, 0x20, 0x4b, 0x53, 0x41, 0x54, 0x04, 0x48, - 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0xc1, 0x68, - 0x03, 0x4b, 0x99, 0x42, 0x00, 0xd0, 0x00, 0x20, - 0x70, 0x47, 0xe8, 0x66, 0x03, 0x20, 0x52, 0x53, - 0x49, 0x48, 0x88, 0xb5, 0x0b, 0x4f, 0x3a, 0x68, - 0x10, 0x6e, 0x51, 0x6e, 0xd2, 0x6d, 0xed, 0xf7, - 0x3a, 0xfb, 0x08, 0x48, 0x22, 0xf0, 0xb7, 0xfd, - 0x00, 0x22, 0xd2, 0x43, 0x00, 0x92, 0x00, 0x22, - 0x00, 0x23, 0x0b, 0x21, 0x38, 0x68, 0xff, 0xf7, - 0x68, 0xfe, 0x88, 0xbc, 0x08, 0xbc, 0xed, 0x09, - 0x00, 0x30, 0x01, 0x18, 0x47, 0x00, 0x00, 0xd8, - 0x66, 0x03, 0x20, 0x00, 0x67, 0x03, 0x20, 0xf0, - 0xb5, 0x44, 0x48, 0x44, 0x4d, 0x07, 0x68, 0x28, - 0x1c, 0x22, 0xf0, 0x9f, 0xfd, 0xfc, 0x1d, 0x79, - 0x34, 0xe0, 0x68, 0x21, 0x69, 0x08, 0x40, 0x00, - 0x26, 0x00, 0x28, 0x10, 0xd0, 0xe5, 0x68, 0xe6, - 0x60, 0x22, 0xf0, 0x8f, 0xfd, 0x61, 0x69, 0x00, - 0x29, 0x02, 0xd0, 0x28, 0x1c, 0xed, 0xf7, 0x0c, - 0xfb, 0x39, 0x48, 0x22, 0xf0, 0x8a, 0xfd, 0xe0, - 0x68, 0x21, 0x69, 0x08, 0x40, 0xee, 0xd1, 0xfb, - 0x1d, 0x49, 0x33, 0x9e, 0x72, 0xf8, 0x6b, 0x00, - 0x28, 0x5e, 0xd0, 0x58, 0x7a, 0x00, 0x28, 0x59, - 0xd0, 0x38, 0x76, 0xbc, 0x6c, 0xff, 0x22, 0x01, - 0x32, 0xbc, 0x42, 0x30, 0x48, 0x2f, 0x49, 0x3b, - 0xd1, 0xbe, 0x64, 0x7e, 0x64, 0x3c, 0x6d, 0x26, - 0x60, 0x7c, 0x6d, 0x1b, 0x7a, 0x25, 0x78, 0xdb, - 0x43, 0x2b, 0x40, 0x23, 0x70, 0x7b, 0x6d, 0x1c, - 0x78, 0x2a, 0x4b, 0x00, 0x2c, 0x04, 0xd1, 0xfc, - 0x6c, 0x1d, 0x68, 0xe4, 0x43, 0x2c, 0x40, 0x1c, - 0x60, 0xbf, 0x7e, 0x04, 0x68, 0x24, 0x06, 0x24, - 0x0e, 0xa7, 0x42, 0x2e, 0xd1, 0x1c, 0x68, 0x00, - 0x2c, 0x01, 0xd1, 0x02, 0x60, 0x31, 0xe0, 0x23, - 0x06, 0x01, 0xd0, 0x00, 0x27, 0x0a, 0xe0, 0x23, - 0x0a, 0x1b, 0x06, 0x01, 0xd0, 0x08, 0x27, 0x05, - 0xe0, 0x23, 0x0c, 0x1b, 0x06, 0x01, 0xd0, 0x10, - 0x27, 0x00, 0xe0, 0x18, 0x27, 0xfc, 0x40, 0x23, - 0x1c, 0x24, 0x06, 0x18, 0x4b, 0x24, 0x0e, 0x1c, - 0x5d, 0xe7, 0x19, 0x17, 0x4c, 0xe4, 0x5d, 0xff, - 0x00, 0x1b, 0x5d, 0xfb, 0x18, 0x03, 0x60, 0x0c, - 0xe0, 0x7b, 0x6c, 0x9c, 0x64, 0x7b, 0x6c, 0xbc, - 0x6c, 0x63, 0x64, 0x3b, 0x6d, 0x1c, 0x68, 0xbc, - 0x42, 0x01, 0xd1, 0xbc, 0x6c, 0x1c, 0x60, 0xbe, - 0x64, 0xed, 0x09, 0x00, 0x31, 0x01, 0x7e, 0x64, - 0x00, 0x68, 0x90, 0x42, 0x04, 0xda, 0x0d, 0x4a, - 0x80, 0x00, 0x10, 0x58, 0x08, 0x60, 0x00, 0xe0, - 0x0e, 0x60, 0x22, 0xf0, 0x25, 0xfd, 0x22, 0xf0, - 0x1b, 0xfd, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xe8, 0x66, 0x03, 0x20, 0x00, 0x67, 0x03, 0x20, - 0xd8, 0x66, 0x03, 0x20, 0xd4, 0x66, 0x03, 0x20, - 0xd0, 0x65, 0x03, 0x20, 0xd4, 0x65, 0x03, 0x20, - 0x34, 0xb7, 0x03, 0x20, 0x34, 0xb3, 0x03, 0x20, - 0x00, 0xb5, 0x08, 0x49, 0x09, 0x5c, 0x00, 0x29, - 0x06, 0xd0, 0x07, 0x4a, 0x89, 0x00, 0x51, 0x58, - 0xed, 0xf7, 0x81, 0xfa, 0x08, 0xbc, 0x18, 0x47, - 0x04, 0x49, 0x08, 0x60, 0x04, 0x20, 0x00, 0xf0, - 0x3b, 0xfc, 0xf7, 0xe7, 0x6c, 0xb7, 0x03, 0x20, - 0x78, 0xb7, 0x03, 0x20, 0x1c, 0x67, 0x03, 0x20, - 0xf0, 0xb5, 0x15, 0x1c, 0x0e, 0x1c, 0x07, 0x1c, - 0x0a, 0x28, 0x04, 0xdd, 0x1a, 0x20, 0xc0, 0x43, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x24, - 0x20, 0x48, 0x22, 0xf0, 0xe5, 0xfc, 0x00, 0x22, - 0x00, 0x2e, 0x1f, 0x4b, 0x1f, 0x49, 0x2a, 0xd0, - 0xc8, 0x5d, 0x00, 0x28, 0x07, 0xd0, 0xca, 0x55, - 0x82, 0x00, 0x9b, 0x58, 0x2b, 0x60, 0x1a, 0x4b, - 0x9e, 0x50, 0xc8, 0x55, 0x2a, 0xe0, 0x01, 0x20, - 0x00, 0xe0, 0x01, 0x30, 0x81, 0x00, 0x59, 0x58, - 0x00, 0x29, 0x02, 0xd0, 0x0a, 0x28, 0xf8, 0xdd, - 0x12, 0xe0, 0x0a, 0x28, 0x10, 0xdc, 0x81, 0x00, - 0x5e, 0x50, 0x12, 0x49, 0xc8, 0x55, 0x2a, 0x60, - 0xfe, 0xf7, 0x16, 0xfb, 0x00, 0x28, 0x15, 0xd1, - 0x38, 0x1c, 0xfe, 0xf7, 0x13, 0xfb, 0x01, 0x1c, - 0x38, 0x1c, 0xfe, 0xf7, 0x11, 0xfb, 0x0d, 0xe0, - 0x20, 0x24, 0xe4, 0x43, 0x0a, 0xe0, 0xc8, 0x5d, - 0x00, 0x28, 0x05, 0xd0, 0xca, 0x55, 0x80, 0x00, - 0x19, 0x58, 0x29, 0x60, 0xed, 0x09, 0x00, 0x32, - 0x01, 0x1a, 0x50, 0x01, 0xe0, 0x24, 0x24, 0xe4, - 0x43, 0x22, 0xf0, 0xa4, 0xfc, 0x20, 0x1c, 0xb9, - 0xe7, 0x08, 0x67, 0x03, 0x20, 0x78, 0xb7, 0x03, - 0x20, 0x6c, 0xb7, 0x03, 0x20, 0xa0, 0x65, 0x03, - 0x20, 0xa8, 0x65, 0x03, 0x20, 0xac, 0x65, 0x03, - 0x20, 0xb8, 0x65, 0x03, 0x20, 0xb0, 0x65, 0x03, - 0x20, 0xe8, 0x66, 0x03, 0x20, 0xb4, 0x65, 0x03, - 0x20, 0xdc, 0xb2, 0x03, 0x20, 0x18, 0x67, 0x03, - 0x20, 0x2c, 0x10, 0x1f, 0xe5, 0x00, 0x00, 0x81, - 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x38, 0x00, 0x1f, - 0xe5, 0x00, 0x00, 0x90, 0xe5, 0x1e, 0xff, 0x2f, - 0xe1, 0x40, 0x00, 0x1f, 0xe5, 0x00, 0x00, 0x90, - 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x4c, 0x10, 0x1f, - 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x00, 0x00, 0xa0, - 0xe3, 0x54, 0x10, 0x1f, 0xe5, 0x00, 0x00, 0x81, - 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x20, 0x0f, - 0xe1, 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, 0x2f, - 0xe1, 0x70, 0x10, 0x1f, 0xe5, 0x00, 0x20, 0x91, - 0xe5, 0x00, 0x00, 0x52, 0xe1, 0x00, 0x00, 0x00, - 0xba, 0x00, 0x00, 0x81, 0xe5, 0x68, 0x10, 0x1f, - 0xe5, 0x00, 0x10, 0x91, 0xe5, 0x00, 0x20, 0x0f, - 0xe1, 0xc0, 0x20, 0xc2, 0xe3, 0x01, 0x20, 0x82, - 0xe1, 0x02, 0xf0, 0x2f, 0xe1, 0x1e, 0xff, 0x2f, - 0xe1, 0x01, 0x10, 0xa0, 0xe3, 0xa0, 0x00, 0x1f, - 0xe5, 0x00, 0x10, 0x80, 0xe5, 0x1e, 0xff, 0x2f, - 0xe1, 0x9c, 0x10, 0x1f, 0xe5, 0x00, 0x00, 0x91, - 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0xc0, 0x00, 0x1f, - 0xe5, 0x00, 0x10, 0x90, 0xe5, 0x01, 0x10, 0x81, - 0xe2, 0x00, 0x10, 0x80, 0xe5, 0xc8, 0x10, 0x1f, - 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x02, 0x30, 0xa0, - 0xe3, 0x00, 0x00, 0x50, 0xe3, 0x07, 0x00, 0x00, - 0x1a, 0xe0, 0x00, 0x1f, 0xe5, 0x00, 0x20, 0xed, - 0x09, 0x00, 0x33, 0x01, 0x90, 0xe5, 0x00, 0x00, - 0x52, 0xe3, 0x02, 0x00, 0x00, 0x0a, 0x01, 0x20, - 0x52, 0xe2, 0x00, 0x20, 0x80, 0xe5, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x30, 0x81, 0x05, 0xf8, 0x00, - 0x1f, 0xe5, 0x00, 0x20, 0x90, 0xe5, 0x00, 0x00, - 0x52, 0xe3, 0x0c, 0x00, 0x00, 0x1a, 0x04, 0x21, - 0x1f, 0xe5, 0x00, 0x30, 0x92, 0xe5, 0x01, 0x30, - 0x53, 0xe2, 0x00, 0x30, 0x82, 0xe5, 0x07, 0x00, - 0x00, 0x1a, 0x02, 0x30, 0xa0, 0xe3, 0x00, 0x30, - 0x80, 0xe5, 0x1c, 0x21, 0x1f, 0xe5, 0x00, 0x20, - 0x92, 0xe5, 0x20, 0x31, 0x1f, 0xe5, 0x00, 0x20, - 0x83, 0xe5, 0x01, 0x30, 0xa0, 0xe3, 0x20, 0x30, - 0xa2, 0xe5, 0x00, 0x10, 0x91, 0xe5, 0x02, 0x00, - 0x51, 0xe3, 0x00, 0x00, 0x90, 0x15, 0x02, 0x00, - 0x50, 0x13, 0x1e, 0xff, 0x2f, 0x11, 0x04, 0xe0, - 0x2d, 0xe5, 0x44, 0x01, 0x1f, 0xe5, 0xc5, 0xfc, - 0xff, 0xeb, 0x04, 0xe0, 0x9d, 0xe4, 0x1e, 0xff, - 0x2f, 0xe1, 0xf0, 0xb5, 0x83, 0xb0, 0x04, 0x1c, - 0x54, 0x48, 0x0f, 0x1c, 0x22, 0xf0, 0xe5, 0xfb, - 0xa0, 0x7e, 0x00, 0x90, 0xb8, 0x42, 0x63, 0xd0, - 0xfe, 0x10, 0x50, 0x48, 0x01, 0x22, 0x31, 0x18, - 0x10, 0x1c, 0xb0, 0x40, 0x7e, 0x07, 0x76, 0x0f, - 0xb2, 0x40, 0x12, 0x06, 0x12, 0x0e, 0x4c, 0x4e, - 0xbb, 0x00, 0x9b, 0x19, 0x25, 0x7e, 0x02, 0x93, - 0xe3, 0x1d, 0x49, 0x33, 0x00, 0x2d, 0x74, 0xd1, - 0xa5, 0x6c, 0xa5, 0x42, 0x17, 0xd1, 0x00, 0x25, - 0x65, 0x64, 0xa5, 0x64, 0x26, 0x6d, 0x35, 0x60, - 0x65, 0x6d, 0x01, 0x95, 0x2d, 0x78, 0x1e, 0x7a, - 0xb5, 0x43, 0x01, 0x9e, 0x35, 0x70, 0x65, 0x6d, - 0x2d, 0x78, 0x00, 0x2d, 0x16, 0xd1, 0x3f, 0x4e, - 0xe5, 0x6c, 0x36, 0x68, 0xed, 0x43, 0x35, 0x40, - 0x3d, 0x4e, 0x35, 0x60, 0x0e, 0xe0, 0x66, 0x6c, - 0xb5, 0x64, 0xed, 0x09, 0x00, 0x34, 0x01, 0x65, - 0x6c, 0xa6, 0x6c, 0x75, 0x64, 0x25, 0x6d, 0x2e, - 0x1c, 0x2d, 0x68, 0xa5, 0x42, 0x01, 0xd1, 0xa5, - 0x6c, 0x35, 0x60, 0x00, 0x25, 0x65, 0x64, 0xa5, - 0x64, 0xa7, 0x76, 0x02, 0x9d, 0x32, 0x4f, 0x25, - 0x65, 0x1a, 0x72, 0xe0, 0x64, 0x61, 0x65, 0x21, - 0x6d, 0x2e, 0x48, 0x09, 0x68, 0x00, 0x29, 0x05, - 0xd0, 0x4a, 0x6c, 0x62, 0x64, 0x94, 0x64, 0xa1, - 0x64, 0x4c, 0x64, 0x0d, 0xe0, 0x64, 0x64, 0xa4, - 0x64, 0x21, 0x6d, 0x29, 0x4a, 0x0c, 0x60, 0xe1, - 0x6c, 0x15, 0x68, 0x29, 0x43, 0x11, 0x60, 0x61, - 0x6d, 0x1b, 0x7a, 0x0a, 0x78, 0x1a, 0x43, 0x0a, - 0x70, 0x24, 0x4a, 0x12, 0x68, 0x11, 0x06, 0x02, - 0xd0, 0x00, 0x21, 0x0b, 0xe0, 0x34, 0xe0, 0x11, - 0x0a, 0x09, 0x06, 0x01, 0xd0, 0x08, 0x21, 0x05, - 0xe0, 0x11, 0x0c, 0x09, 0x06, 0x01, 0xd0, 0x10, - 0x21, 0x00, 0xe0, 0x18, 0x21, 0xca, 0x40, 0x13, - 0x06, 0x1b, 0x4a, 0x1b, 0x0e, 0xd3, 0x5c, 0x59, - 0x18, 0x40, 0x5c, 0xc9, 0x00, 0x10, 0x5c, 0x19, - 0x4a, 0x08, 0x18, 0x17, 0x49, 0x08, 0x60, 0x11, - 0x68, 0x8b, 0x7e, 0x83, 0x42, 0x18, 0xdb, 0xc9, - 0x7e, 0x00, 0x29, 0x15, 0xd0, 0x80, 0x00, 0x38, - 0x58, 0x10, 0x60, 0x13, 0x48, 0x00, 0xe0, 0x09, - 0xe0, 0x00, 0x68, 0x00, 0x28, 0x0c, 0xd0, 0xc0, - 0x68, 0x11, 0x4b, 0x98, 0x42, 0x08, 0xd1, 0x22, - 0xf0, 0x56, 0xfb, 0x05, 0xe0, 0xa7, 0x76, 0x02, - 0x9d, 0x25, 0x65, 0x1a, 0x72, 0xe0, 0x64, 0x61, - 0x65, 0x22, 0xf0, 0x41, 0xfb, 0x00, 0x98, 0x03, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x67, 0x03, 0x20, 0x34, 0xb7, 0x03, 0x20, 0x34, - 0xb3, 0x03, 0x20, 0xd0, 0x65, 0x03, 0x20, 0xd4, - 0x65, 0x03, 0x20, 0xd4, 0x66, 0x03, 0x20, 0xd8, - 0x66, 0x03, 0x20, 0xe8, 0x66, 0xed, 0x09, 0x00, - 0x35, 0x01, 0x03, 0x20, 0x4b, 0x53, 0x41, 0x54, - 0x90, 0xb5, 0x04, 0x1c, 0x13, 0x48, 0x22, 0xf0, - 0x29, 0xfb, 0x13, 0x48, 0x00, 0x68, 0xc1, 0x7e, - 0x00, 0x29, 0x01, 0xd0, 0x0a, 0x27, 0x00, 0xe0, - 0x08, 0x27, 0x10, 0x49, 0x08, 0x2c, 0x03, 0xd1, - 0x09, 0x68, 0x00, 0x20, 0xc8, 0x76, 0x0f, 0xe0, - 0x01, 0x22, 0xc2, 0x76, 0x0a, 0x68, 0x90, 0x42, - 0x0a, 0xd1, 0x0b, 0x48, 0x92, 0x7e, 0x00, 0x68, - 0x82, 0x42, 0x05, 0xdd, 0x09, 0x4a, 0x80, 0x00, - 0x10, 0x58, 0x08, 0x60, 0x22, 0xf0, 0x12, 0xfb, - 0x22, 0xf0, 0x04, 0xfb, 0x38, 0x1c, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x67, 0x03, 0x20, - 0xe8, 0x66, 0x03, 0x20, 0xd8, 0x66, 0x03, 0x20, - 0xd4, 0x66, 0x03, 0x20, 0x34, 0xb3, 0x03, 0x20, - 0xb0, 0xb5, 0x0c, 0x1c, 0x05, 0x1c, 0x07, 0x48, - 0x22, 0xf0, 0xf4, 0xfa, 0x2f, 0x6c, 0x2c, 0x64, - 0x05, 0x49, 0x2c, 0x62, 0x00, 0x20, 0x08, 0x60, - 0x22, 0xf0, 0xe8, 0xfa, 0x38, 0x1c, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x67, 0x03, 0x20, - 0xb8, 0x65, 0x03, 0x20, 0xb0, 0xb5, 0x04, 0x1c, - 0x11, 0x48, 0x05, 0x68, 0x11, 0x48, 0x22, 0xf0, - 0xdd, 0xfa, 0xe8, 0x1d, 0x79, 0x30, 0x07, 0x69, - 0x04, 0x61, 0xc1, 0x68, 0x21, 0x40, 0x10, 0xd0, - 0xe9, 0x1d, 0x49, 0x31, 0x8a, 0x7a, 0x00, 0x2a, - 0x0b, 0xd1, 0x40, 0x69, 0x00, 0x28, 0x08, 0xd0, - 0x01, 0x20, 0x88, 0x72, 0x00, 0x20, 0xe8, 0x63, - 0x22, 0xf0, 0xc4, 0xfa, 0xff, 0xf7, 0x20, 0xfd, - 0x01, 0xe0, 0x22, 0xf0, 0xbf, 0xfa, 0x38, 0x1c, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0xe8, 0x66, 0x03, 0x20, 0x00, 0x67, 0x03, 0x20, - 0x80, 0xb5, 0x08, 0x48, 0x07, 0x68, 0x08, 0x48, - 0x22, 0xf0, 0xb4, 0xfa, 0xf9, 0x1d, 0x79, 0x31, - 0xed, 0x09, 0x00, 0x36, 0x01, 0xcf, 0x68, 0x00, - 0x20, 0xc8, 0x60, 0x22, 0xf0, 0xa9, 0xfa, 0x38, - 0x1c, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0xe8, 0x66, 0x03, 0x20, 0x00, 0x67, 0x03, - 0x20, 0xb0, 0xb5, 0x07, 0x1c, 0x11, 0x48, 0x04, - 0x68, 0x11, 0x48, 0x22, 0xf0, 0x9d, 0xfa, 0xe0, - 0x1d, 0x79, 0x30, 0x47, 0x61, 0x01, 0x69, 0xc0, - 0x68, 0x08, 0x40, 0x00, 0x25, 0x00, 0x28, 0x0e, - 0xd0, 0xe0, 0x1d, 0x49, 0x30, 0x81, 0x7a, 0x00, - 0x29, 0x09, 0xd1, 0x00, 0x2f, 0x07, 0xd0, 0x01, - 0x21, 0x81, 0x72, 0xe5, 0x63, 0x22, 0xf0, 0x84, - 0xfa, 0xff, 0xf7, 0xe0, 0xfc, 0x01, 0xe0, 0x22, - 0xf0, 0x7f, 0xfa, 0x28, 0x1c, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe8, 0x66, 0x03, - 0x20, 0x00, 0x67, 0x03, 0x20, 0xf0, 0xb5, 0x28, - 0x4e, 0x0c, 0x1c, 0x07, 0x1c, 0x30, 0x1c, 0x22, - 0xf0, 0x73, 0xfa, 0xf8, 0x1d, 0x79, 0x30, 0xc1, - 0x68, 0x21, 0x43, 0xc1, 0x60, 0x02, 0x69, 0x11, - 0x40, 0x00, 0x25, 0x00, 0x29, 0x39, 0xd0, 0xfc, - 0x1d, 0x49, 0x34, 0xa1, 0x7a, 0x00, 0x29, 0x34, - 0xd1, 0x39, 0x7e, 0x0c, 0x29, 0x31, 0xd0, 0x0b, - 0x29, 0x2f, 0xd0, 0x40, 0x69, 0x00, 0x28, 0x2c, - 0xd0, 0x01, 0x20, 0x1a, 0x49, 0xa0, 0x72, 0x09, - 0x68, 0x8f, 0x42, 0x05, 0xd1, 0xfd, 0x63, 0x22, - 0xf0, 0x4f, 0xfa, 0xff, 0xf7, 0xab, 0xfc, 0x20, - 0xe0, 0xb8, 0x6b, 0x00, 0x28, 0x0a, 0xd0, 0x22, - 0xf0, 0x47, 0xfa, 0x38, 0x1c, 0x22, 0xf0, 0x5c, - 0xfa, 0x30, 0x1c, 0x22, 0xf0, 0x45, 0xfa, 0xb8, - 0x6b, 0x00, 0x28, 0xf1, 0xd1, 0x38, 0x7e, 0x60, - 0x72, 0xf8, 0x6a, 0xf8, 0x63, 0x38, 0x1c, 0x22, - 0xf0, 0x5b, 0xfa, 0x39, 0x7e, 0x00, 0x29, 0x08, - 0xd0, 0x01, 0x29, 0x06, 0xd0, 0x38, 0x1c, 0xff, - 0xf7, 0x4d, 0xfa, 0xed, 0x09, 0x00, 0x37, 0x01, - 0x00, 0x28, 0x01, 0xd0, 0x22, 0xf0, 0x37, 0xfa, - 0x22, 0xf0, 0x29, 0xfa, 0x28, 0x1c, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x67, - 0x03, 0x20, 0xe8, 0x66, 0x03, 0x20, 0x00, 0x48, - 0x70, 0x47, 0xdc, 0x5b, 0x03, 0x20, 0x00, 0x48, - 0x70, 0x47, 0x70, 0x5c, 0x03, 0x20, 0x01, 0x49, - 0x00, 0x20, 0x08, 0x60, 0x70, 0x47, 0x20, 0x67, - 0x03, 0x20, 0x05, 0x49, 0x00, 0x20, 0x08, 0x60, - 0x05, 0x49, 0x08, 0x60, 0x05, 0x49, 0x08, 0x60, - 0x05, 0x49, 0x08, 0x60, 0x05, 0x49, 0x08, 0x60, - 0x70, 0x47, 0x24, 0x67, 0x03, 0x20, 0x28, 0x67, - 0x03, 0x20, 0x2c, 0x67, 0x03, 0x20, 0x30, 0x67, - 0x03, 0x20, 0x34, 0x67, 0x03, 0x20, 0x80, 0xb4, - 0x24, 0x48, 0x00, 0x21, 0x01, 0x60, 0x23, 0x48, - 0xff, 0x22, 0x01, 0x60, 0x00, 0x20, 0x22, 0x4f, - 0x01, 0x32, 0x83, 0x00, 0x01, 0x30, 0x90, 0x42, - 0xf9, 0x50, 0xfa, 0xdb, 0x20, 0x48, 0x20, 0x4b, - 0x01, 0x60, 0x00, 0x20, 0x19, 0x54, 0x01, 0x30, - 0x20, 0x28, 0xfb, 0xdb, 0x1e, 0x48, 0x23, 0x4f, - 0x02, 0x60, 0x1d, 0x48, 0x23, 0x4b, 0x01, 0x60, - 0x1d, 0x48, 0x01, 0x60, 0x1d, 0x48, 0x01, 0x60, - 0x1d, 0x48, 0x01, 0x60, 0x1d, 0x48, 0x01, 0x60, - 0x00, 0x20, 0x82, 0x00, 0x99, 0x50, 0x01, 0x30, - 0x03, 0x28, 0xb9, 0x50, 0xf9, 0xdb, 0x1b, 0x4a, - 0x00, 0x20, 0x11, 0x54, 0x01, 0x30, 0x0a, 0x28, - 0xfb, 0xdb, 0x19, 0x4a, 0x00, 0x20, 0x83, 0x00, - 0x01, 0x30, 0x0a, 0x28, 0xd1, 0x50, 0xfa, 0xdd, - 0x17, 0x48, 0x01, 0x60, 0x17, 0x48, 0x01, 0x60, - 0x17, 0x48, 0x01, 0x60, 0x17, 0x48, 0x01, 0x60, - 0x17, 0x48, 0x01, 0x60, 0x17, 0x48, 0x01, 0x60, - 0x17, 0x48, 0x01, 0x60, 0x80, 0xbc, 0x70, 0x47, - 0x00, 0x00, 0xc8, 0x65, 0x03, 0x20, 0xed, 0x09, - 0x00, 0x38, 0x01, 0xcc, 0x65, 0x03, 0x20, 0x34, - 0xb3, 0x03, 0x20, 0xd0, 0x65, 0x03, 0x20, 0x34, - 0xb7, 0x03, 0x20, 0xd4, 0x66, 0x03, 0x20, 0xd8, - 0x66, 0x03, 0x20, 0xe4, 0x66, 0x03, 0x20, 0xe8, - 0x66, 0x03, 0x20, 0xdc, 0x66, 0x03, 0x20, 0xe0, - 0x66, 0x03, 0x20, 0x60, 0xb7, 0x03, 0x20, 0x54, - 0xb7, 0x03, 0x20, 0x6c, 0xb7, 0x03, 0x20, 0x78, - 0xb7, 0x03, 0x20, 0xf0, 0x66, 0x03, 0x20, 0xf4, - 0x66, 0x03, 0x20, 0xf8, 0x66, 0x03, 0x20, 0x00, - 0x67, 0x03, 0x20, 0x08, 0x67, 0x03, 0x20, 0x10, - 0x67, 0x03, 0x20, 0x18, 0x67, 0x03, 0x20, 0x03, - 0x49, 0x00, 0x20, 0x08, 0x60, 0x03, 0x49, 0x08, - 0x60, 0x03, 0x49, 0x08, 0x60, 0x70, 0x47, 0x3c, - 0x67, 0x03, 0x20, 0x40, 0x67, 0x03, 0x20, 0x44, - 0x67, 0x03, 0x20, 0x03, 0x49, 0x00, 0x20, 0x08, - 0x60, 0x03, 0x49, 0x08, 0x60, 0x03, 0x49, 0x08, - 0x60, 0x70, 0x47, 0x4c, 0x67, 0x03, 0x20, 0x50, - 0x67, 0x03, 0x20, 0x54, 0x67, 0x03, 0x20, 0x03, - 0x49, 0x00, 0x20, 0x08, 0x60, 0x03, 0x49, 0x08, - 0x60, 0x03, 0x49, 0x08, 0x60, 0x70, 0x47, 0x5c, - 0x67, 0x03, 0x20, 0x60, 0x67, 0x03, 0x20, 0x64, - 0x67, 0x03, 0x20, 0x03, 0x49, 0x00, 0x20, 0x08, - 0x60, 0x03, 0x49, 0x08, 0x60, 0x03, 0x49, 0x08, - 0x60, 0x70, 0x47, 0x6c, 0x67, 0x03, 0x20, 0x70, - 0x67, 0x03, 0x20, 0x74, 0x67, 0x03, 0x20, 0x03, - 0x49, 0x00, 0x20, 0x08, 0x60, 0x03, 0x49, 0x08, - 0x60, 0x03, 0x49, 0x08, 0x60, 0x70, 0x47, 0x7c, - 0x67, 0x03, 0x20, 0x80, 0x67, 0x03, 0x20, 0x84, - 0x67, 0x03, 0x20, 0x03, 0x49, 0x00, 0x20, 0x08, - 0x60, 0x03, 0x49, 0x08, 0x60, 0x03, 0x49, 0x08, - 0x60, 0x70, 0x47, 0x8c, 0x67, 0x03, 0x20, 0x90, - 0x67, 0x03, 0x20, 0x94, 0x67, 0x03, 0x20, 0x03, - 0x49, 0xed, 0x09, 0x00, 0x39, 0x01, 0x00, 0x20, - 0x08, 0x60, 0x03, 0x49, 0x08, 0x60, 0x03, 0x49, - 0x08, 0x60, 0x70, 0x47, 0x9c, 0x67, 0x03, 0x20, - 0xa0, 0x67, 0x03, 0x20, 0xa4, 0x67, 0x03, 0x20, - 0x00, 0xb5, 0x82, 0xb0, 0x18, 0x49, 0x00, 0x20, - 0x08, 0x60, 0x18, 0x49, 0x1c, 0x4a, 0x08, 0x60, - 0x17, 0x49, 0x08, 0x60, 0x17, 0x49, 0x08, 0x60, - 0x17, 0x49, 0x08, 0x60, 0x17, 0x49, 0x08, 0x60, - 0x01, 0x21, 0x11, 0x60, 0x17, 0x4a, 0x10, 0x60, - 0x17, 0x4a, 0x10, 0x60, 0x17, 0x4a, 0x11, 0x60, - 0x17, 0x49, 0x08, 0x60, 0x01, 0x1c, 0x17, 0x48, - 0xc1, 0x60, 0x17, 0x49, 0x0a, 0x68, 0x17, 0x49, - 0x09, 0x68, 0x01, 0x92, 0x00, 0x91, 0x16, 0x49, - 0x16, 0x4a, 0x09, 0x68, 0x0b, 0x06, 0x1b, 0x0e, - 0x15, 0xa1, 0xfe, 0xf7, 0xf3, 0xff, 0x00, 0x28, - 0x02, 0xd0, 0x01, 0x20, 0x00, 0xf0, 0x38, 0xf8, - 0x02, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x88, 0x65, 0x03, 0x20, 0x8c, 0x65, 0x03, 0x20, - 0x90, 0x65, 0x03, 0x20, 0x94, 0x65, 0x03, 0x20, - 0xa0, 0x65, 0x03, 0x20, 0xa8, 0x65, 0x03, 0x20, - 0xac, 0x65, 0x03, 0x20, 0xb0, 0x65, 0x03, 0x20, - 0xb4, 0x65, 0x03, 0x20, 0xb8, 0x65, 0x03, 0x20, - 0x98, 0x65, 0x03, 0x20, 0xdc, 0xb2, 0x03, 0x20, - 0xc0, 0x65, 0x03, 0x20, 0xbc, 0x65, 0x03, 0x20, - 0xc4, 0x65, 0x03, 0x20, 0xa1, 0x38, 0x01, 0x20, - 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x20, 0x48, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x49, 0x00, 0x20, - 0x08, 0x60, 0x03, 0x49, 0x08, 0x60, 0x03, 0x49, - 0x08, 0x60, 0x70, 0x47, 0xac, 0x67, 0x03, 0x20, - 0xb0, 0x67, 0x03, 0x20, 0xb4, 0x67, 0x03, 0x20, - 0x01, 0x49, 0x08, 0x60, 0xff, 0xe7, 0xfe, 0xe7, - 0x20, 0x67, 0x03, 0x20, 0x00, 0x22, 0x02, 0x60, - 0x81, 0x60, 0xc2, 0x60, 0xed, 0x09, 0x00, 0x3a, - 0x01, 0x02, 0x61, 0x70, 0x47, 0x00, 0xb5, 0x00, - 0xf0, 0x0a, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0xc1, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x00, - 0xf0, 0x65, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0xf0, - 0xb5, 0x0c, 0x1c, 0x2c, 0x49, 0x07, 0x1c, 0x0d, - 0x68, 0x2b, 0x4e, 0x00, 0x2d, 0x10, 0xd1, 0xff, - 0x60, 0x3f, 0x61, 0x2a, 0x4a, 0x0f, 0x60, 0x14, - 0x60, 0x7c, 0x60, 0x00, 0x2c, 0x05, 0xd0, 0x10, - 0x68, 0x22, 0xf0, 0xb8, 0xf8, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x02, 0x20, 0x30, 0x60, 0xf9, - 0xe7, 0x23, 0x48, 0x00, 0x68, 0x00, 0x28, 0x0e, - 0xd1, 0x22, 0xf0, 0xbc, 0xf8, 0x1f, 0x4a, 0x11, - 0x68, 0x08, 0x1a, 0x09, 0x1a, 0x11, 0x60, 0x69, - 0x68, 0x81, 0x42, 0x02, 0xd9, 0x08, 0x1a, 0x68, - 0x60, 0x01, 0xe0, 0x00, 0x20, 0x68, 0x60, 0x17, - 0x49, 0x00, 0x20, 0x0a, 0x68, 0x6b, 0x68, 0xa3, - 0x42, 0x07, 0xd9, 0x68, 0x68, 0x00, 0x1b, 0x68, - 0x60, 0x08, 0x68, 0x85, 0x42, 0x07, 0xd1, 0x0f, - 0x60, 0x05, 0xe0, 0xed, 0x68, 0xe4, 0x1a, 0x95, - 0x42, 0x01, 0xd0, 0x00, 0x28, 0xee, 0xd0, 0xfd, - 0x60, 0x28, 0x69, 0x38, 0x61, 0x28, 0x69, 0xc7, - 0x60, 0x2f, 0x61, 0x0d, 0x48, 0x7c, 0x60, 0x00, - 0x68, 0x00, 0x28, 0xc7, 0xd1, 0x08, 0x68, 0x09, - 0x4a, 0x40, 0x68, 0x11, 0x68, 0x88, 0x42, 0xc1, - 0xd8, 0x10, 0x60, 0x00, 0x28, 0x02, 0xd0, 0x22, - 0xf0, 0x81, 0xf8, 0xbb, 0xe7, 0x02, 0x20, 0x30, - 0x60, 0xb8, 0xe7, 0x00, 0x00, 0x90, 0x65, 0x03, - 0x20, 0xac, 0x65, 0x03, 0x20, 0xa4, 0x65, 0x03, - 0x20, 0x94, 0x65, 0x03, 0x20, 0x90, 0xb5, 0xc1, - 0x68, 0x07, 0x1c, 0x0f, 0x48, 0x02, 0x68, 0x91, - 0x42, 0x03, 0xd0, 0x4a, 0x68, 0x7b, 0x68, 0xd2, - 0x18, 0x4a, 0x60, 0xf9, 0x68, 0x00, 0x24, 0xed, - 0x09, 0x00, 0x3b, 0x01, 0xb9, 0x42, 0x03, 0xd1, - 0x04, 0x60, 0x22, 0xf0, 0x5a, 0xf8, 0x09, 0xe0, - 0x3a, 0x69, 0xd1, 0x60, 0x39, 0x69, 0xfa, 0x68, - 0x11, 0x61, 0x01, 0x68, 0xb9, 0x42, 0x01, 0xd1, - 0xf9, 0x68, 0x01, 0x60, 0xfc, 0x60, 0x3c, 0x61, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0x65, - 0x03, 0x20, 0x00, 0xb5, 0x0a, 0x48, 0x00, 0x68, - 0x02, 0x28, 0x01, 0xd1, 0x00, 0xf0, 0x15, 0xf8, - 0x22, 0xf0, 0x43, 0xf8, 0x00, 0x28, 0x07, 0xd0, - 0x06, 0x4a, 0x01, 0x21, 0x11, 0x60, 0xff, 0xf7, - 0x06, 0xfa, 0x04, 0x49, 0x00, 0x20, 0x08, 0x60, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xac, 0x65, - 0x03, 0x20, 0xb8, 0x65, 0x03, 0x20, 0xb4, 0x65, - 0x03, 0x20, 0xf0, 0xb5, 0x83, 0xb0, 0x00, 0x20, - 0x00, 0x21, 0x36, 0x4c, 0x02, 0x90, 0x01, 0x90, - 0x00, 0x25, 0x20, 0x1c, 0x00, 0x91, 0x21, 0xf0, - 0xf8, 0xff, 0x22, 0xf0, 0x1e, 0xf8, 0x32, 0x48, - 0x01, 0x27, 0x07, 0x60, 0x32, 0x48, 0x00, 0x68, - 0x00, 0x28, 0x09, 0xd0, 0x31, 0x49, 0x42, 0x68, - 0x09, 0x68, 0x8a, 0x42, 0x02, 0xd9, 0x51, 0x1a, - 0x41, 0x60, 0x01, 0xe0, 0x00, 0x21, 0x41, 0x60, - 0x21, 0xf0, 0xdf, 0xff, 0x00, 0x26, 0x27, 0x48, - 0x21, 0xf0, 0xdf, 0xff, 0x28, 0x48, 0x07, 0x68, - 0x00, 0x2f, 0x23, 0xd0, 0x78, 0x68, 0x00, 0x28, - 0x20, 0xd1, 0x38, 0x68, 0x01, 0x28, 0x16, 0xd1, - 0xbc, 0x68, 0x01, 0x25, 0x60, 0x6a, 0x40, 0x19, - 0x60, 0x62, 0xe0, 0x69, 0x01, 0x90, 0xa1, 0x69, - 0x00, 0x20, 0x00, 0x91, 0x20, 0x62, 0x38, 0x1c, - 0xff, 0xf7, 0x83, 0xff, 0xe1, 0x6a, 0x00, 0x29, - 0x0d, 0xd0, 0x01, 0x20, 0x20, 0x62, 0x38, 0x1c, - 0xff, 0xf7, 0x18, 0xff, 0x07, 0xe0, 0x00, 0x25, - 0x38, 0x1c, 0xff, 0xf7, 0x76, 0xff, 0xb8, 0x68, - 0x02, 0x90, 0xed, 0x09, 0x00, 0x3c, 0x01, 0x00, - 0xe0, 0x01, 0x26, 0x21, 0xf0, 0xb0, 0xff, 0x00, - 0x2e, 0x0a, 0xd1, 0x01, 0x2d, 0x04, 0xd1, 0x01, - 0x98, 0x00, 0x99, 0xec, 0xf7, 0x2b, 0xfd, 0xc8, - 0xe7, 0x02, 0x98, 0xff, 0xf7, 0x1c, 0xf9, 0xc4, - 0xe7, 0x0a, 0x48, 0x21, 0xf0, 0xa4, 0xff, 0x09, - 0x49, 0x00, 0x20, 0x08, 0x60, 0x09, 0x48, 0x00, - 0x68, 0x00, 0x28, 0x04, 0xd0, 0x40, 0x68, 0x07, - 0x49, 0x08, 0x60, 0x21, 0xf0, 0xbc, 0xff, 0x21, - 0xf0, 0x92, 0xff, 0x03, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x67, 0x03, 0x20, 0x94, - 0x65, 0x03, 0x20, 0x90, 0x65, 0x03, 0x20, 0xa4, - 0x65, 0x03, 0x20, 0x90, 0xb5, 0x04, 0x1c, 0xc0, - 0x07, 0xc0, 0x0f, 0xa2, 0x07, 0x92, 0x0f, 0x01, - 0x27, 0x07, 0x29, 0x58, 0xd2, 0x02, 0xa3, 0x5b, - 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x04, - 0x12, 0x36, 0x1e, 0x2a, 0x36, 0x54, 0x00, 0x00, - 0x2a, 0x2f, 0xd0, 0x08, 0x1c, 0x0f, 0xf0, 0xb9, - 0xf9, 0x21, 0x1c, 0x02, 0x1c, 0x26, 0xa0, 0x01, - 0xf0, 0xb6, 0xfa, 0x38, 0x1c, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x28, 0x21, 0xd0, 0x08, - 0x1c, 0x0f, 0xf0, 0xab, 0xf9, 0x21, 0x1c, 0x02, - 0x1c, 0x1f, 0xa0, 0x01, 0xf0, 0xa8, 0xfa, 0x38, - 0x1c, 0xf0, 0xe7, 0x00, 0x2a, 0x15, 0xd0, 0x08, - 0x1c, 0x0f, 0xf0, 0x9f, 0xf9, 0x21, 0x1c, 0x02, - 0x1c, 0x19, 0xa0, 0x01, 0xf0, 0x9c, 0xfa, 0x38, - 0x1c, 0xe4, 0xe7, 0x00, 0x28, 0x09, 0xd0, 0x08, - 0x1c, 0x0f, 0xf0, 0x93, 0xf9, 0x21, 0x1c, 0x02, - 0x1c, 0x13, 0xa0, 0x01, 0xf0, 0x90, 0xfa, 0x38, - 0x1c, 0xd8, 0xe7, 0x01, 0x23, 0x5b, 0x07, 0x9c, - 0x42, 0x0b, 0xd2, 0x08, 0x1c, 0x0f, 0xf0, 0x85, - 0xf9, 0x21, 0x1c, 0x02, 0x1c, 0x01, 0x23, 0x5b, - 0x07, 0x14, 0xa0, 0x01, 0xf0, 0xed, 0x09, 0x00, - 0x3d, 0x01, 0x80, 0xfa, 0x02, 0x20, 0xc8, 0xe7, - 0x1c, 0x4b, 0x9c, 0x42, 0x0c, 0xd3, 0x08, 0x1c, - 0x0f, 0xf0, 0x76, 0xf9, 0x21, 0x1c, 0x02, 0x1c, - 0x19, 0xa0, 0x18, 0x4b, 0x01, 0xf0, 0x72, 0xfa, - 0x03, 0x20, 0xba, 0xe7, 0x04, 0x20, 0xb8, 0xe7, - 0x00, 0x20, 0xb6, 0xe7, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x28, 0x25, 0x23, 0x70, 0x2c, 0x20, 0x25, 0x73, - 0x29, 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, - 0x6c, 0x69, 0x67, 0x6e, 0x0a, 0x00, 0x00, 0x00, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x28, 0x25, 0x23, 0x70, - 0x2c, 0x20, 0x25, 0x73, 0x29, 0x3a, 0x20, 0x74, - 0x6f, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x20, 0x28, - 0x6d, 0x69, 0x6e, 0x3d, 0x25, 0x23, 0x78, 0x29, - 0x20, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x28, 0x25, 0x23, 0x70, - 0x2c, 0x20, 0x25, 0x73, 0x29, 0x3a, 0x20, 0x74, - 0x6f, 0x6f, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, - 0x28, 0x6d, 0x61, 0x78, 0x3d, 0x25, 0x23, 0x78, - 0x29, 0x0a, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, - 0x08, 0x60, 0x70, 0x47, 0xd0, 0x67, 0x03, 0x20, - 0xf7, 0xb5, 0xbc, 0xb0, 0x3e, 0x9a, 0x0c, 0x1c, - 0x07, 0x1c, 0x04, 0x2a, 0x03, 0xd1, 0x3f, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, - 0x13, 0x90, 0x00, 0x23, 0xf8, 0x56, 0x00, 0x25, - 0x00, 0x28, 0x6e, 0xd0, 0x0a, 0xaa, 0x01, 0x32, - 0x3b, 0x92, 0x09, 0xe0, 0x3d, 0x2d, 0x07, 0xd3, - 0x00, 0x21, 0x1b, 0xa8, 0x41, 0x55, 0x3e, 0x9a, - 0x29, 0x1c, 0x01, 0xf0, 0xb5, 0xf9, 0x00, 0x25, - 0x00, 0x23, 0xf8, 0x56, 0x08, 0x28, 0x0b, 0xd0, - 0xed, 0x09, 0x00, 0x3e, 0x01, 0x09, 0x28, 0x0d, - 0xd0, 0x25, 0x28, 0x61, 0xd1, 0x00, 0x20, 0x00, - 0x26, 0x01, 0x37, 0x17, 0x90, 0x15, 0x90, 0x14, - 0x90, 0x16, 0x90, 0x39, 0xe0, 0x00, 0x2d, 0x6d, - 0xd0, 0x01, 0x3d, 0x7e, 0xe3, 0xa8, 0x07, 0x69, - 0xd0, 0x20, 0x22, 0x28, 0x1c, 0x1b, 0xa9, 0x0a, - 0x54, 0x01, 0x35, 0xa8, 0x07, 0xf9, 0xd1, 0x74, - 0xe3, 0x2d, 0x28, 0x02, 0xd1, 0x01, 0x20, 0x15, - 0x90, 0x3f, 0x18, 0x00, 0x23, 0xf8, 0x56, 0x20, - 0x28, 0x05, 0xd1, 0x14, 0x98, 0x00, 0x28, 0x01, - 0xd1, 0x20, 0x20, 0x14, 0x90, 0x01, 0x37, 0x00, - 0x23, 0xf8, 0x56, 0x2b, 0x28, 0x01, 0xd1, 0x14, - 0x90, 0x01, 0x37, 0x00, 0x23, 0xf8, 0x56, 0x30, - 0x28, 0x05, 0xd1, 0x15, 0x98, 0x01, 0x37, 0x00, - 0x28, 0x01, 0xd1, 0x01, 0x20, 0x16, 0x90, 0x00, - 0x23, 0xf8, 0x56, 0x23, 0x28, 0x02, 0xd1, 0x30, - 0x20, 0x14, 0x90, 0x01, 0x37, 0x00, 0x23, 0xf8, - 0x56, 0x3a, 0x28, 0x01, 0xd1, 0x14, 0x90, 0x01, - 0x37, 0x00, 0x23, 0xf8, 0x56, 0x2d, 0x28, 0xcf, - 0xd0, 0x2b, 0x28, 0xcd, 0xd0, 0x20, 0x28, 0xcb, - 0xd0, 0x30, 0x28, 0xc9, 0xd0, 0x23, 0x28, 0xc7, - 0xd0, 0x3a, 0x28, 0xc5, 0xd0, 0xf9, 0x56, 0x2a, - 0x29, 0x06, 0xd1, 0x04, 0x34, 0xe0, 0x1f, 0x39, - 0x38, 0xc6, 0x6b, 0x01, 0x37, 0x0f, 0xe0, 0x6e, - 0xe3, 0x30, 0x38, 0x09, 0x28, 0x0b, 0xd8, 0x38, - 0x1c, 0x11, 0xf0, 0xde, 0xfd, 0x06, 0x1c, 0x01, - 0xe0, 0x7e, 0xe3, 0x01, 0x37, 0x00, 0x23, 0xf8, - 0x56, 0x30, 0x38, 0x09, 0x28, 0xf9, 0xd9, 0x00, - 0x23, 0xf8, 0x56, 0x2e, 0x28, 0x16, 0xd1, 0x01, - 0x37, 0xf8, 0x56, 0x2a, 0x28, 0x07, 0xd1, 0x04, - 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, 0x6b, 0x01, - 0x37, 0x17, 0x90, 0x0b, 0xe0, 0x69, 0xe3, 0x38, - 0x1c, 0x11, 0xf0, 0xed, 0x09, 0x00, 0x3f, 0x01, - 0xc2, 0xfd, 0x17, 0x90, 0x00, 0xe0, 0x01, 0x37, - 0x00, 0x23, 0xf8, 0x56, 0x30, 0x38, 0x09, 0x28, - 0xf9, 0xd9, 0x17, 0x98, 0xb0, 0x42, 0x00, 0xd9, - 0x17, 0x9e, 0x00, 0x23, 0xf8, 0x56, 0x4e, 0x28, - 0x1a, 0xd0, 0x15, 0xdc, 0x46, 0x28, 0x17, 0xd0, - 0x4c, 0x28, 0x02, 0xd1, 0x01, 0x20, 0x13, 0x90, - 0x3f, 0x18, 0x00, 0x23, 0xf8, 0x56, 0x69, 0x28, - 0x18, 0xd0, 0x34, 0xdc, 0x58, 0x28, 0x54, 0xd0, - 0x0e, 0xdc, 0x25, 0x28, 0x3d, 0xd0, 0x42, 0x28, - 0x64, 0xd0, 0x50, 0x28, 0x63, 0xd1, 0x05, 0xe1, - 0x68, 0x28, 0x01, 0xd0, 0x6c, 0x28, 0xec, 0xd1, - 0x00, 0x20, 0x13, 0x90, 0x01, 0x37, 0xe8, 0xe7, - 0x62, 0x28, 0x59, 0xd0, 0x63, 0x28, 0x38, 0xd0, - 0x64, 0x28, 0x54, 0xd1, 0x13, 0x98, 0x01, 0x28, - 0x53, 0xd1, 0x08, 0x34, 0xe1, 0x1f, 0x01, 0x39, - 0x08, 0x68, 0xf4, 0xa3, 0x11, 0x90, 0x49, 0x68, - 0x12, 0x91, 0x1a, 0x68, 0x5b, 0x68, 0xec, 0xf7, - 0x7c, 0xfb, 0x00, 0x28, 0x6b, 0xd0, 0x2d, 0x21, - 0x1b, 0xa8, 0x41, 0x55, 0x11, 0x98, 0x12, 0x99, - 0x00, 0x22, 0xec, 0xf7, 0x84, 0xfb, 0x11, 0x90, - 0x12, 0x91, 0x01, 0x35, 0x7b, 0xe0, 0xc1, 0x1f, - 0x67, 0x39, 0x0b, 0x29, 0x5c, 0xd2, 0x01, 0xa3, - 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x0a, 0xd3, - 0xd2, 0xd1, 0xd1, 0xd0, 0xcf, 0x1a, 0xd1, 0xd1, - 0xce, 0x00, 0x25, 0x21, 0x1b, 0xa8, 0x41, 0x55, - 0x01, 0x35, 0x74, 0xe2, 0x04, 0x34, 0xe0, 0x1f, - 0x39, 0x38, 0xc0, 0x6b, 0x01, 0x37, 0x05, 0x60, - 0x6d, 0xe2, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, - 0xc0, 0x6b, 0x1b, 0xa9, 0x48, 0x55, 0x01, 0x35, - 0x65, 0xe2, 0x9a, 0xe2, 0x14, 0x98, 0x00, 0x28, - 0x03, 0xd0, 0x14, 0x98, 0x1b, 0xa9, 0x48, 0x55, - 0x01, 0x35, 0x13, 0x98, 0x01, 0x28, 0xed, 0x09, - 0x00, 0x40, 0x01, 0x0d, 0xd1, 0x08, 0x34, 0xe1, - 0x1f, 0x01, 0x39, 0x08, 0x68, 0x49, 0x68, 0x0a, - 0x23, 0x0b, 0xaa, 0x11, 0xf0, 0x74, 0xfd, 0x0b, - 0xe0, 0x29, 0xe1, 0x15, 0xe3, 0x8f, 0xe0, 0x47, - 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, - 0x6b, 0x0a, 0x22, 0x0b, 0xa9, 0x11, 0xf0, 0x35, - 0xfe, 0x0b, 0xa8, 0x11, 0xf0, 0x8e, 0xfe, 0x19, - 0x90, 0x15, 0x98, 0x01, 0x28, 0x07, 0xd1, 0x1b, - 0xa8, 0x40, 0x19, 0x19, 0x9a, 0x0b, 0xa9, 0xec, - 0xf7, 0x38, 0xfb, 0x19, 0x98, 0x2d, 0x18, 0x19, - 0x98, 0x86, 0x42, 0x13, 0xd9, 0x20, 0x22, 0x30, - 0x21, 0x16, 0x98, 0x00, 0x28, 0x07, 0xd0, 0x15, - 0x98, 0x00, 0x28, 0x04, 0xd1, 0x1b, 0xa8, 0x41, - 0x55, 0x03, 0xe0, 0x13, 0xe0, 0xec, 0xe2, 0x1b, - 0xa8, 0x42, 0x55, 0x19, 0x98, 0x01, 0x35, 0x01, - 0x3e, 0x86, 0x42, 0xed, 0xd8, 0x15, 0x98, 0x00, - 0x28, 0x07, 0xd1, 0x1b, 0xa8, 0x40, 0x19, 0x19, - 0x9a, 0x0b, 0xa9, 0xec, 0xf7, 0x16, 0xfb, 0x19, - 0x98, 0x2d, 0x18, 0x12, 0xe2, 0x14, 0x98, 0x00, - 0x28, 0x03, 0xd0, 0x14, 0x98, 0x1b, 0xa9, 0x48, - 0x55, 0x01, 0x35, 0x0a, 0x23, 0x11, 0x98, 0x12, - 0x99, 0x0b, 0xaa, 0x11, 0xf0, 0x28, 0xfd, 0x16, - 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, - 0x6b, 0x00, 0x28, 0x05, 0xda, 0x2d, 0x22, 0x1b, - 0xa9, 0x4a, 0x55, 0x40, 0x42, 0x01, 0x35, 0x06, - 0xe0, 0x14, 0x99, 0x00, 0x29, 0x03, 0xd0, 0x14, - 0x99, 0x1b, 0xaa, 0x51, 0x55, 0x01, 0x35, 0x0a, - 0x22, 0x0b, 0xa9, 0x11, 0xf0, 0xde, 0xfd, 0x0b, - 0xa8, 0x11, 0xf0, 0x37, 0xfe, 0x19, 0x90, 0x15, - 0x98, 0x01, 0x28, 0x07, 0xd1, 0x1b, 0xa8, 0x40, - 0x19, 0x19, 0x9a, 0x0b, 0xa9, 0xec, 0xf7, 0xe1, - 0xfa, 0x19, 0x98, 0x2d, 0x18, 0x19, 0x98, 0x86, - 0x42, 0xed, 0x09, 0x00, 0x41, 0x01, 0x11, 0xd9, - 0x20, 0x22, 0x30, 0x21, 0x16, 0x98, 0x00, 0x28, - 0x05, 0xd0, 0x15, 0x98, 0x00, 0x28, 0x02, 0xd1, - 0x1b, 0xa8, 0x41, 0x55, 0x01, 0xe0, 0x1b, 0xa8, - 0x42, 0x55, 0x19, 0x98, 0x01, 0x35, 0x01, 0x3e, - 0x86, 0x42, 0xef, 0xd8, 0x15, 0x98, 0x00, 0x28, - 0x07, 0xd1, 0x1b, 0xa8, 0x40, 0x19, 0x19, 0x9a, - 0x0b, 0xa9, 0xec, 0xf7, 0xc1, 0xfa, 0x19, 0x98, - 0x2d, 0x18, 0xbd, 0xe1, 0x13, 0x98, 0x01, 0x28, - 0x0f, 0xd1, 0x08, 0x34, 0x6a, 0x46, 0xe1, 0x1f, - 0x01, 0x39, 0x08, 0x68, 0x49, 0x68, 0x02, 0x23, - 0x11, 0xf0, 0xd4, 0xfc, 0x0d, 0xe0, 0xe5, 0xe1, - 0x59, 0xe2, 0x0b, 0xe1, 0x73, 0xe2, 0x54, 0xe1, - 0x37, 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, - 0x69, 0x46, 0x02, 0x22, 0xc0, 0x6b, 0x11, 0xf0, - 0x93, 0xfd, 0x68, 0x46, 0x11, 0xf0, 0xec, 0xfd, - 0x19, 0x90, 0x15, 0x98, 0x01, 0x28, 0x07, 0xd1, - 0x1b, 0xa8, 0x40, 0x19, 0x69, 0x46, 0x19, 0x9a, - 0xec, 0xf7, 0x96, 0xfa, 0x19, 0x98, 0x2d, 0x18, - 0x19, 0x98, 0x86, 0x42, 0x11, 0xd9, 0x20, 0x22, - 0x30, 0x21, 0x16, 0x98, 0x00, 0x28, 0x05, 0xd0, - 0x15, 0x98, 0x00, 0x28, 0x02, 0xd1, 0x1b, 0xa8, - 0x41, 0x55, 0x01, 0xe0, 0x1b, 0xa8, 0x42, 0x55, - 0x19, 0x98, 0x01, 0x35, 0x01, 0x3e, 0x86, 0x42, - 0xef, 0xd8, 0x15, 0x98, 0x00, 0x28, 0x07, 0xd1, - 0x1b, 0xa8, 0x40, 0x19, 0x69, 0x46, 0x19, 0x9a, - 0xec, 0xf7, 0x76, 0xfa, 0x19, 0x98, 0x2d, 0x18, - 0x72, 0xe1, 0x14, 0x98, 0x30, 0x28, 0x04, 0xd1, - 0x14, 0x98, 0x0a, 0xab, 0x18, 0x70, 0x3b, 0x9a, - 0x00, 0xe0, 0x0a, 0xaa, 0x13, 0x98, 0x01, 0x28, - 0x08, 0xd1, 0x08, 0x34, 0xe1, 0x1f, 0x01, 0x39, - 0x08, 0x68, 0x49, 0x68, 0x08, 0x23, 0x11, 0xf0, - 0x81, 0xfc, 0x07, 0xe0, 0xed, 0x09, 0x00, 0x42, - 0x01, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0x11, - 0x1c, 0x08, 0x22, 0xc0, 0x6b, 0x11, 0xf0, 0x46, - 0xfd, 0x0a, 0xa8, 0x11, 0xf0, 0x9f, 0xfd, 0x19, - 0x90, 0x15, 0x98, 0x01, 0x28, 0x07, 0xd1, 0x1b, - 0xa8, 0x40, 0x19, 0x19, 0x9a, 0x0a, 0xa9, 0xec, - 0xf7, 0x49, 0xfa, 0x19, 0x98, 0x2d, 0x18, 0x19, - 0x98, 0x86, 0x42, 0x11, 0xd9, 0x20, 0x22, 0x30, - 0x21, 0x16, 0x98, 0x00, 0x28, 0x05, 0xd0, 0x15, - 0x98, 0x00, 0x28, 0x02, 0xd1, 0x1b, 0xa8, 0x41, - 0x55, 0x01, 0xe0, 0x1b, 0xa8, 0x42, 0x55, 0x19, - 0x98, 0x01, 0x35, 0x01, 0x3e, 0x86, 0x42, 0xef, - 0xd8, 0x15, 0x98, 0x00, 0x28, 0x07, 0xd1, 0x1b, - 0xa8, 0x40, 0x19, 0x19, 0x9a, 0x0a, 0xa9, 0xec, - 0xf7, 0x29, 0xfa, 0x19, 0x98, 0x2d, 0x18, 0x25, - 0xe1, 0x3a, 0x48, 0x0b, 0xa9, 0x0c, 0xc8, 0x0c, - 0xc1, 0x0d, 0xc8, 0x0d, 0xc1, 0x04, 0x34, 0xe0, - 0x1f, 0x39, 0x38, 0xc1, 0x6b, 0x00, 0x2e, 0x10, - 0x91, 0x00, 0xd1, 0x01, 0x26, 0x15, 0x98, 0x01, - 0x28, 0x03, 0xd1, 0x10, 0x99, 0x88, 0x19, 0x41, - 0x1e, 0x10, 0x91, 0x70, 0x1e, 0x18, 0x90, 0x00, - 0x2e, 0x57, 0xd0, 0x3a, 0x26, 0x75, 0x2d, 0x07, - 0xd3, 0x00, 0x21, 0x1b, 0xa8, 0x41, 0x55, 0x3e, - 0x9a, 0x29, 0x1c, 0x00, 0xf0, 0x59, 0xff, 0x00, - 0x25, 0x14, 0x98, 0x30, 0x28, 0x06, 0xd1, 0x30, - 0x22, 0x1b, 0xa9, 0x4a, 0x55, 0x78, 0x22, 0x68, - 0x1c, 0x0a, 0x54, 0x45, 0x1c, 0x10, 0x99, 0x00, - 0x29, 0x19, 0xd1, 0x28, 0x20, 0x1b, 0xaa, 0x50, - 0x55, 0x69, 0x1c, 0x6e, 0x23, 0x53, 0x54, 0x75, - 0x23, 0x48, 0x1c, 0x13, 0x54, 0x6c, 0x23, 0x41, - 0x1c, 0x6a, 0x46, 0xd2, 0x18, 0x53, 0x54, 0x48, - 0x1c, 0x01, 0x1c, 0x6a, 0x46, 0xd2, 0x18, 0x53, - 0x54, 0x29, 0x22, 0x01, 0x30, 0x69, 0x46, 0xed, - 0x09, 0x00, 0x43, 0x01, 0xc9, 0x18, 0x0a, 0x54, - 0x45, 0x1c, 0x37, 0xe0, 0x10, 0x99, 0x1b, 0xaa, - 0x08, 0x78, 0x0b, 0xa9, 0x00, 0x09, 0x09, 0x5c, - 0x51, 0x55, 0x10, 0x99, 0x09, 0x78, 0x09, 0x07, - 0x09, 0x0f, 0x40, 0x3a, 0x51, 0x5c, 0x68, 0x1c, - 0x1b, 0xaa, 0x11, 0x54, 0x45, 0x1c, 0x15, 0x98, - 0x01, 0x28, 0x03, 0xd1, 0x10, 0x99, 0x01, 0x39, - 0x10, 0x91, 0x02, 0xe0, 0x10, 0x99, 0x01, 0x31, - 0x10, 0x91, 0x18, 0x98, 0x00, 0x28, 0x14, 0xd0, - 0x14, 0x98, 0x3a, 0x28, 0x0c, 0xd1, 0x28, 0x1c, - 0x1b, 0xa9, 0x0e, 0x54, 0x01, 0x35, 0x06, 0xe0, - 0x10, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb4, 0x5c, 0x03, 0x20, 0x04, 0xe0, - 0x20, 0x22, 0x28, 0x1c, 0x1b, 0xa9, 0x0a, 0x54, - 0x01, 0x35, 0x18, 0x98, 0x41, 0x1e, 0x18, 0x91, - 0x00, 0x28, 0x96, 0xd1, 0xa1, 0xe0, 0x04, 0x34, - 0xe0, 0x1f, 0x39, 0x38, 0xc1, 0x6b, 0x1a, 0x91, - 0x00, 0x29, 0x01, 0xd1, 0xbf, 0xa1, 0x1a, 0x91, - 0x17, 0x98, 0x00, 0x28, 0x03, 0xd1, 0x7f, 0x20, - 0x40, 0x1b, 0x02, 0x38, 0x17, 0x90, 0x00, 0x20, - 0x19, 0x90, 0x02, 0xe0, 0x19, 0x98, 0x01, 0x30, - 0x19, 0x90, 0x19, 0x98, 0x1a, 0x99, 0x08, 0x56, - 0x00, 0x28, 0x03, 0xd0, 0x19, 0x98, 0x17, 0x99, - 0x88, 0x42, 0xf3, 0xd3, 0x15, 0x98, 0x01, 0x28, - 0x07, 0xd1, 0x1b, 0xa8, 0x40, 0x19, 0x1a, 0x99, - 0x19, 0x9a, 0xec, 0xf7, 0x7a, 0xf9, 0x19, 0x98, - 0x2d, 0x18, 0x19, 0x98, 0x86, 0x42, 0x11, 0xd9, - 0x20, 0x22, 0x30, 0x21, 0x16, 0x98, 0x00, 0x28, - 0x05, 0xd0, 0x15, 0x98, 0x00, 0x28, 0x02, 0xd1, - 0x1b, 0xa8, 0x41, 0x55, 0x01, 0xe0, 0x1b, 0xa8, - 0x42, 0x55, 0x19, 0x98, 0x01, 0x35, 0x01, 0x3e, - 0x86, 0x42, 0xef, 0xd8, 0x15, 0x98, 0x00, 0x28, - 0x5f, 0xd1, 0xed, 0x09, 0x00, 0x44, 0x01, 0x1b, - 0xa8, 0x40, 0x19, 0x1a, 0x99, 0x19, 0x9a, 0xec, - 0xf7, 0x5a, 0xf9, 0x19, 0x98, 0x2d, 0x18, 0x20, - 0xe1, 0x13, 0x98, 0x01, 0x28, 0x1a, 0xd1, 0x08, - 0x34, 0xe1, 0x1f, 0x01, 0x39, 0x08, 0x68, 0x9b, - 0xa3, 0x0a, 0x90, 0x49, 0x68, 0x0b, 0x91, 0x1a, - 0x68, 0x5b, 0x68, 0xec, 0xf7, 0x70, 0xfa, 0x00, - 0x28, 0x05, 0xd0, 0x0c, 0xa8, 0x94, 0xa1, 0x07, - 0x22, 0xec, 0xf7, 0x41, 0xf9, 0x05, 0xe0, 0x10, - 0x23, 0x0a, 0x98, 0x0b, 0x99, 0x0c, 0xaa, 0x11, - 0xf0, 0x5c, 0xfb, 0x0f, 0xe0, 0x04, 0x34, 0xe0, - 0x1f, 0x39, 0x38, 0xc0, 0x6b, 0x00, 0x28, 0x05, - 0xd1, 0x0c, 0xa8, 0x8a, 0xa1, 0x07, 0x22, 0xec, - 0xf7, 0x2e, 0xf9, 0x03, 0xe0, 0x10, 0x22, 0x0c, - 0xa9, 0x11, 0xf0, 0x19, 0xfc, 0x0c, 0xa8, 0x11, - 0xf0, 0x72, 0xfc, 0x19, 0x90, 0x15, 0x98, 0x01, - 0x28, 0x02, 0xd0, 0x19, 0x98, 0x86, 0x42, 0x1f, - 0xd8, 0x14, 0x98, 0x30, 0x28, 0x07, 0xd1, 0x30, - 0x21, 0x1b, 0xaa, 0x51, 0x55, 0x78, 0x22, 0x68, - 0x1c, 0x1b, 0xa9, 0x0a, 0x54, 0x45, 0x1c, 0x1b, - 0xa8, 0x40, 0x19, 0x19, 0x9a, 0x0c, 0xa9, 0xec, - 0xf7, 0x0e, 0xf9, 0x19, 0x98, 0x2d, 0x18, 0x86, - 0x42, 0x3d, 0xd9, 0x20, 0x22, 0x28, 0x1c, 0x1b, - 0xa9, 0x0a, 0x54, 0x19, 0x98, 0x01, 0x35, 0x01, - 0x3e, 0x86, 0x42, 0xf7, 0xd8, 0x33, 0xe0, 0xc8, - 0xe0, 0x16, 0x98, 0x00, 0x28, 0x13, 0xd0, 0x14, - 0x98, 0x30, 0x28, 0x06, 0xd1, 0x30, 0x21, 0x1b, - 0xaa, 0x51, 0x55, 0x78, 0x21, 0x68, 0x1c, 0x11, - 0x54, 0x45, 0x1c, 0x30, 0x22, 0x28, 0x1c, 0x1b, - 0xa9, 0x0a, 0x54, 0x19, 0x98, 0x01, 0x35, 0x01, - 0x3e, 0x86, 0x42, 0xf7, 0xd8, 0x13, 0xe0, 0x20, - 0x22, 0x28, 0x1c, 0x1b, 0xa9, 0x0a, 0x54, 0x19, - 0x98, 0x01, 0x35, 0x01, 0x3e, 0xed, 0x09, 0x00, - 0x45, 0x01, 0x86, 0x42, 0xf7, 0xd8, 0x14, 0x98, - 0x30, 0x28, 0x07, 0xd1, 0x30, 0x21, 0x1b, 0xaa, - 0x51, 0x55, 0x78, 0x22, 0x68, 0x1c, 0x1b, 0xa9, - 0x0a, 0x54, 0x45, 0x1c, 0x1b, 0xa8, 0x40, 0x19, - 0x19, 0x9a, 0x0c, 0xa9, 0xec, 0xf7, 0xce, 0xf8, - 0x19, 0x98, 0x2d, 0x18, 0x94, 0xe0, 0x99, 0xe0, - 0x13, 0x98, 0x01, 0x28, 0x09, 0xd1, 0x08, 0x34, - 0xe1, 0x1f, 0x01, 0x39, 0x08, 0x68, 0x49, 0x68, - 0x10, 0x23, 0x0c, 0xaa, 0x11, 0xf0, 0xe0, 0xfa, - 0x07, 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, - 0xc0, 0x6b, 0x10, 0x22, 0x0c, 0xa9, 0x11, 0xf0, - 0xa5, 0xfb, 0x0c, 0xa8, 0x11, 0xf0, 0xfe, 0xfb, - 0x19, 0x90, 0x15, 0x98, 0x01, 0x28, 0x02, 0xd0, - 0x19, 0x98, 0x86, 0x42, 0x1e, 0xd8, 0x14, 0x98, - 0x30, 0x28, 0x06, 0xd1, 0x30, 0x21, 0x1b, 0xaa, - 0x51, 0x55, 0x78, 0x21, 0x68, 0x1c, 0x11, 0x54, - 0x45, 0x1c, 0x1b, 0xa8, 0x40, 0x19, 0x19, 0x9a, - 0x0c, 0xa9, 0xec, 0xf7, 0x9b, 0xf8, 0x19, 0x98, - 0x2d, 0x18, 0x86, 0x42, 0x40, 0xd9, 0x20, 0x22, - 0x28, 0x1c, 0x1b, 0xa9, 0x0a, 0x54, 0x19, 0x98, - 0x01, 0x35, 0x01, 0x3e, 0x86, 0x42, 0xf7, 0xd8, - 0x36, 0xe0, 0x64, 0xe0, 0x16, 0x98, 0x00, 0x28, - 0x16, 0xd0, 0x14, 0x98, 0x30, 0x28, 0x07, 0xd1, - 0x30, 0x21, 0x1b, 0xaa, 0x51, 0x55, 0x78, 0x22, - 0x68, 0x1c, 0x1b, 0xa9, 0x0a, 0x54, 0x45, 0x1c, - 0x30, 0x22, 0x28, 0x1c, 0x1b, 0xa9, 0x0a, 0x54, - 0x19, 0x98, 0x01, 0x35, 0x01, 0x3e, 0x86, 0x42, - 0xf7, 0xd8, 0x15, 0xe0, 0x3f, 0xe0, 0x41, 0xe0, - 0x20, 0x22, 0x28, 0x1c, 0x1b, 0xa9, 0x0a, 0x54, - 0x19, 0x98, 0x01, 0x35, 0x01, 0x3e, 0x86, 0x42, - 0xf7, 0xd8, 0x14, 0x98, 0x30, 0x28, 0x07, 0xd1, - 0x30, 0x21, 0x1b, 0xaa, 0x51, 0x55, 0x78, 0x22, - 0xed, 0x09, 0x00, 0x46, 0x01, 0x68, 0x1c, 0x1b, - 0xa9, 0x0a, 0x54, 0x45, 0x1c, 0x1b, 0xa8, 0x40, - 0x19, 0x19, 0x9a, 0x0c, 0xa9, 0xec, 0xf7, 0x58, - 0xf8, 0x19, 0x98, 0x2d, 0x18, 0x1e, 0xe0, 0x04, - 0x34, 0xe0, 0x1f, 0x39, 0x38, 0x54, 0x22, 0xd2, - 0x43, 0xc0, 0x6b, 0x1b, 0xab, 0x5a, 0x55, 0x69, - 0x1c, 0x58, 0x54, 0x03, 0x0a, 0x4a, 0x1c, 0x1b, - 0xad, 0xab, 0x54, 0x03, 0x0c, 0x51, 0x1c, 0x6b, - 0x54, 0x00, 0x0e, 0x4a, 0x1c, 0x1b, 0xab, 0x98, - 0x54, 0x45, 0x20, 0xc0, 0x43, 0x51, 0x1c, 0x1b, - 0xaa, 0x50, 0x54, 0x4d, 0x1c, 0x02, 0xe0, 0x1b, - 0xa9, 0x48, 0x55, 0x01, 0x35, 0x00, 0x20, 0x13, - 0x90, 0x02, 0xe0, 0x1b, 0xa9, 0x48, 0x55, 0x01, - 0x35, 0x00, 0x23, 0x01, 0x37, 0xf8, 0x56, 0x00, - 0x28, 0x01, 0xd0, 0xff, 0xf7, 0xc1, 0xfb, 0x00, - 0x2d, 0x01, 0xd1, 0xff, 0xf7, 0xae, 0xfb, 0x00, - 0x20, 0x1b, 0xa9, 0x48, 0x55, 0x3e, 0x9a, 0x29, - 0x1c, 0x1b, 0xa8, 0x00, 0xf0, 0x73, 0xfd, 0xf4, - 0xe7, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xb5, 0x9d, 0xb0, 0x07, 0x1c, 0x00, - 0x20, 0x13, 0x90, 0x00, 0x23, 0xd0, 0x56, 0x00, - 0x26, 0x15, 0x1c, 0x00, 0x28, 0x74, 0xd0, 0x1e, - 0x99, 0x0a, 0xaa, 0x01, 0x32, 0xc8, 0x1f, 0x3b, - 0x38, 0x1b, 0x92, 0xca, 0x1f, 0x03, 0x3a, 0x1a, - 0x92, 0x1c, 0x90, 0x1c, 0x98, 0xb0, 0x42, 0x05, - 0xd8, 0x00, 0x20, 0xb8, 0x55, 0x21, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x23, 0xe8, - 0x56, 0x08, 0x28, 0x0c, 0xd0, 0x09, 0x28, 0x0e, - 0xd0, 0x25, 0x28, 0x5e, 0xd1, 0x00, 0x22, 0x00, - 0x20, 0x00, 0x24, 0x01, 0x35, 0x17, 0x90, 0x15, - 0x92, 0x14, 0x92, 0x16, 0x92, 0x3a, 0xe0, 0x00, - 0x2e, 0x73, 0xd0, 0xed, 0x09, 0x00, 0x47, 0x01, - 0x01, 0x3e, 0x72, 0xe3, 0xb0, 0x07, 0x6f, 0xd0, - 0x20, 0x21, 0x30, 0x1c, 0x39, 0x54, 0x01, 0x36, - 0xb0, 0x07, 0xfa, 0xd1, 0x69, 0xe3, 0x2d, 0x28, - 0x02, 0xd1, 0x01, 0x22, 0x15, 0x92, 0xad, 0x18, - 0x00, 0x23, 0xe8, 0x56, 0x20, 0x28, 0x05, 0xd1, - 0x14, 0x9a, 0x00, 0x2a, 0x01, 0xd1, 0x20, 0x22, - 0x14, 0x92, 0x01, 0x35, 0x00, 0x23, 0xe8, 0x56, - 0x2b, 0x28, 0x02, 0xd1, 0x2b, 0x22, 0x14, 0x92, - 0x01, 0x35, 0x00, 0x23, 0xe8, 0x56, 0x30, 0x28, - 0x05, 0xd1, 0x15, 0x9a, 0x01, 0x35, 0x00, 0x2a, - 0x01, 0xd1, 0x01, 0x22, 0x16, 0x92, 0x00, 0x23, - 0xe8, 0x56, 0x23, 0x28, 0x02, 0xd1, 0x30, 0x22, - 0x14, 0x92, 0x01, 0x35, 0x00, 0x23, 0xe8, 0x56, - 0x3a, 0x28, 0x02, 0xd1, 0x3a, 0x22, 0x14, 0x92, - 0x01, 0x35, 0x00, 0x23, 0xe8, 0x56, 0x2d, 0x28, - 0xcd, 0xd0, 0x2b, 0x28, 0xcb, 0xd0, 0x20, 0x28, - 0xc9, 0xd0, 0x30, 0x28, 0xc7, 0xd0, 0x23, 0x28, - 0xc5, 0xd0, 0x3a, 0x28, 0xc3, 0xd0, 0xe9, 0x56, - 0x2a, 0x29, 0x0a, 0xd1, 0x20, 0x9b, 0x04, 0x33, - 0x20, 0x93, 0x01, 0x35, 0x00, 0xe0, 0x69, 0xe3, - 0xd8, 0x1f, 0x39, 0x38, 0xc4, 0x6b, 0x0e, 0xe0, - 0x7e, 0xe3, 0x30, 0x38, 0x09, 0x28, 0x0a, 0xd8, - 0x28, 0x1c, 0x11, 0xf0, 0x70, 0xf9, 0x04, 0x1c, - 0x00, 0xe0, 0x01, 0x35, 0x00, 0x23, 0xe8, 0x56, - 0x30, 0x38, 0x09, 0x28, 0xf9, 0xd9, 0x00, 0x23, - 0xe8, 0x56, 0x2e, 0x28, 0x18, 0xd1, 0x01, 0x35, - 0xe8, 0x56, 0x2a, 0x28, 0x09, 0xd1, 0x20, 0x9b, - 0x04, 0x33, 0xd8, 0x1f, 0x39, 0x38, 0x20, 0x93, - 0xc0, 0x6b, 0x01, 0x35, 0x17, 0x90, 0x0b, 0xe0, - 0x79, 0xe3, 0x28, 0x1c, 0x11, 0xf0, 0x53, 0xf9, - 0x17, 0x90, 0x00, 0xe0, 0x01, 0x35, 0x00, 0x23, - 0xe8, 0x56, 0x30, 0x38, 0x09, 0x28, 0xed, 0x09, - 0x00, 0x48, 0x01, 0xf9, 0xd9, 0x17, 0x98, 0xa0, - 0x42, 0x00, 0xd9, 0x17, 0x9c, 0x00, 0x23, 0xe8, - 0x56, 0x4e, 0x28, 0x1a, 0xd0, 0x15, 0xdc, 0x46, - 0x28, 0x17, 0xd0, 0x4c, 0x28, 0x02, 0xd1, 0x01, - 0x20, 0x13, 0x90, 0x2d, 0x18, 0x00, 0x23, 0xe8, - 0x56, 0x69, 0x28, 0x18, 0xd0, 0x35, 0xdc, 0x58, - 0x28, 0x57, 0xd0, 0x0e, 0xdc, 0x25, 0x28, 0x3e, - 0xd0, 0x42, 0x28, 0x53, 0xd0, 0x50, 0x28, 0x52, - 0xd1, 0x04, 0xe1, 0x68, 0x28, 0x01, 0xd0, 0x6c, - 0x28, 0xec, 0xd1, 0x00, 0x20, 0x13, 0x90, 0x01, - 0x35, 0xe8, 0xe7, 0x62, 0x28, 0x5d, 0xd0, 0x63, - 0x28, 0x3a, 0xd0, 0x64, 0x28, 0x43, 0xd1, 0x13, - 0x98, 0x01, 0x28, 0x57, 0xd1, 0x20, 0x9b, 0x08, - 0x33, 0xd9, 0x1f, 0x01, 0x39, 0x20, 0x93, 0x08, - 0x68, 0xf6, 0xa3, 0x11, 0x90, 0x49, 0x68, 0x12, - 0x91, 0x1a, 0x68, 0x5b, 0x68, 0xeb, 0xf7, 0x0b, - 0xff, 0x00, 0x28, 0x6d, 0xd0, 0x2d, 0x20, 0xb8, - 0x55, 0x11, 0x98, 0x12, 0x99, 0x00, 0x22, 0xeb, - 0xf7, 0x14, 0xff, 0x11, 0x90, 0x12, 0x91, 0x01, - 0x36, 0x7b, 0xe0, 0xc1, 0x1f, 0x67, 0x39, 0x0b, - 0x29, 0x5f, 0xd2, 0x01, 0xa3, 0x5b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x09, 0xd1, 0xd0, 0xcf, 0xcf, - 0xce, 0xcd, 0x1e, 0xcf, 0xcf, 0xcc, 0x00, 0x25, - 0x20, 0xb8, 0x55, 0x01, 0x36, 0x59, 0xe2, 0x20, - 0x9b, 0x04, 0x33, 0xd8, 0x1f, 0x39, 0x38, 0x20, - 0x93, 0xc0, 0x6b, 0x01, 0x35, 0x06, 0x60, 0x50, - 0xe2, 0x20, 0x9b, 0x04, 0x33, 0xd8, 0x1f, 0x39, - 0x38, 0x20, 0x93, 0xc0, 0x6b, 0xb8, 0x55, 0x01, - 0x36, 0x47, 0xe2, 0x75, 0xe2, 0x37, 0xe1, 0xfd, - 0xe2, 0x14, 0x9a, 0x00, 0x2a, 0x02, 0xd0, 0x14, - 0x9a, 0xba, 0x55, 0x01, 0x36, 0x13, 0x98, 0x01, - 0x28, 0x0d, 0xd1, 0x20, 0x9b, 0x0b, 0xaa, 0x08, - 0x33, 0xed, 0x09, 0x00, 0x49, 0x01, 0xd9, 0x1f, - 0x01, 0x39, 0x20, 0x93, 0x08, 0x68, 0x49, 0x68, - 0x0a, 0x23, 0x11, 0xf0, 0xff, 0xf8, 0x0b, 0xe0, - 0x88, 0xe0, 0x44, 0xe0, 0x20, 0x9b, 0x0b, 0xa9, - 0x04, 0x33, 0xd8, 0x1f, 0x39, 0x38, 0x20, 0x93, - 0xc0, 0x6b, 0x0a, 0x22, 0x11, 0xf0, 0xc0, 0xf9, - 0x0b, 0xa8, 0x11, 0xf0, 0x19, 0xfa, 0x15, 0x9a, - 0x18, 0x90, 0x01, 0x2a, 0x06, 0xd1, 0xb8, 0x19, - 0x18, 0x9a, 0x0b, 0xa9, 0xeb, 0xf7, 0xc4, 0xfe, - 0x18, 0x98, 0x36, 0x18, 0x18, 0x98, 0x84, 0x42, - 0x11, 0xd9, 0x20, 0x21, 0x30, 0x20, 0x16, 0x9a, - 0x00, 0x2a, 0x06, 0xd0, 0x15, 0x9a, 0x00, 0x2a, - 0x03, 0xd1, 0xb8, 0x55, 0x02, 0xe0, 0x11, 0xe0, - 0xbf, 0xe2, 0xb9, 0x55, 0x18, 0x9a, 0x01, 0x3c, - 0x01, 0x36, 0x94, 0x42, 0xef, 0xd8, 0x15, 0x9a, - 0x00, 0x2a, 0x06, 0xd1, 0xb8, 0x19, 0x18, 0x9a, - 0x0b, 0xa9, 0xeb, 0xf7, 0xa5, 0xfe, 0x18, 0x98, - 0x36, 0x18, 0xf5, 0xe1, 0x14, 0x9a, 0x00, 0x2a, - 0x02, 0xd0, 0x14, 0x9a, 0xba, 0x55, 0x01, 0x36, - 0x0a, 0x23, 0x11, 0x98, 0x12, 0x99, 0x0b, 0xaa, - 0x11, 0xf0, 0xb8, 0xf8, 0x16, 0xe0, 0x20, 0x9b, - 0x04, 0x33, 0xd8, 0x1f, 0x39, 0x38, 0x20, 0x93, - 0xc0, 0x6b, 0x00, 0x28, 0x04, 0xda, 0x2d, 0x21, - 0xb9, 0x55, 0x40, 0x42, 0x01, 0x36, 0x05, 0xe0, - 0x14, 0x9a, 0x00, 0x2a, 0x02, 0xd0, 0x14, 0x9a, - 0xba, 0x55, 0x01, 0x36, 0x0a, 0x22, 0x0b, 0xa9, - 0x11, 0xf0, 0x6e, 0xf9, 0x0b, 0xa8, 0x11, 0xf0, - 0xc7, 0xf9, 0x15, 0x9a, 0x18, 0x90, 0x01, 0x2a, - 0x06, 0xd1, 0xb8, 0x19, 0x18, 0x9a, 0x0b, 0xa9, - 0xeb, 0xf7, 0x72, 0xfe, 0x18, 0x98, 0x36, 0x18, - 0x18, 0x98, 0x84, 0x42, 0x0f, 0xd9, 0x20, 0x21, - 0x30, 0x20, 0x16, 0x9a, 0x00, 0x2a, 0x04, 0xd0, - 0x15, 0x9a, 0x00, 0x2a, 0xed, 0x09, 0x00, 0x4a, - 0x01, 0x01, 0xd1, 0xb8, 0x55, 0x00, 0xe0, 0xb9, - 0x55, 0x18, 0x9a, 0x01, 0x3c, 0x01, 0x36, 0x94, - 0x42, 0xf1, 0xd8, 0x15, 0x9a, 0x00, 0x2a, 0x06, - 0xd1, 0xb8, 0x19, 0x18, 0x9a, 0x0b, 0xa9, 0xeb, - 0xf7, 0x55, 0xfe, 0x18, 0x98, 0x36, 0x18, 0xa5, - 0xe1, 0x13, 0x98, 0x01, 0x28, 0x11, 0xd1, 0x20, - 0x9b, 0x08, 0x33, 0x6a, 0x46, 0xd9, 0x1f, 0x01, - 0x39, 0x20, 0x93, 0x08, 0x68, 0x49, 0x68, 0x02, - 0x23, 0x11, 0xf0, 0x66, 0xf8, 0x0f, 0xe0, 0xc4, - 0xe1, 0x32, 0xe2, 0xe5, 0xe0, 0x4b, 0xe2, 0x38, - 0xe1, 0x35, 0xe0, 0x20, 0x9b, 0x04, 0x33, 0xd8, - 0x1f, 0x39, 0x38, 0x69, 0x46, 0x20, 0x93, 0xc0, - 0x6b, 0x02, 0x22, 0x11, 0xf0, 0x23, 0xf9, 0x68, - 0x46, 0x11, 0xf0, 0x7c, 0xf9, 0x15, 0x9a, 0x18, - 0x90, 0x01, 0x2a, 0x06, 0xd1, 0xb8, 0x19, 0x69, - 0x46, 0x18, 0x9a, 0xeb, 0xf7, 0x27, 0xfe, 0x18, - 0x98, 0x36, 0x18, 0x18, 0x98, 0x84, 0x42, 0x0f, - 0xd9, 0x20, 0x21, 0x30, 0x20, 0x16, 0x9a, 0x00, - 0x2a, 0x04, 0xd0, 0x15, 0x9a, 0x00, 0x2a, 0x01, - 0xd1, 0xb8, 0x55, 0x00, 0xe0, 0xb9, 0x55, 0x18, - 0x9a, 0x01, 0x3c, 0x01, 0x36, 0x94, 0x42, 0xf1, - 0xd8, 0x15, 0x9a, 0x00, 0x2a, 0x06, 0xd1, 0xb8, - 0x19, 0x69, 0x46, 0x18, 0x9a, 0xeb, 0xf7, 0x0a, - 0xfe, 0x18, 0x98, 0x36, 0x18, 0x5a, 0xe1, 0x14, - 0x9a, 0x30, 0x2a, 0x04, 0xd1, 0x14, 0x9a, 0x0a, - 0xab, 0x1a, 0x70, 0x1b, 0x9a, 0x00, 0xe0, 0x0a, - 0xaa, 0x13, 0x98, 0x01, 0x28, 0x0a, 0xd1, 0x20, - 0x9b, 0x08, 0x33, 0xd9, 0x1f, 0x01, 0x39, 0x20, - 0x93, 0x08, 0x68, 0x49, 0x68, 0x08, 0x23, 0x11, - 0xf0, 0x13, 0xf8, 0x09, 0xe0, 0x20, 0x9b, 0x04, - 0x33, 0xd8, 0x1f, 0x39, 0x38, 0x11, 0x1c, 0x20, - 0x93, 0xc0, 0x6b, 0x08, 0x22, 0x11, 0xf0, 0xed, - 0x09, 0x00, 0x4b, 0x01, 0xd6, 0xf8, 0x0a, 0xa8, - 0x11, 0xf0, 0x2f, 0xf9, 0x15, 0x9a, 0x18, 0x90, - 0x01, 0x2a, 0x06, 0xd1, 0xb8, 0x19, 0x18, 0x9a, - 0x0a, 0xa9, 0xeb, 0xf7, 0xda, 0xfd, 0x18, 0x98, - 0x36, 0x18, 0x18, 0x98, 0x84, 0x42, 0x0f, 0xd9, - 0x20, 0x21, 0x30, 0x20, 0x16, 0x9a, 0x00, 0x2a, - 0x04, 0xd0, 0x15, 0x9a, 0x00, 0x2a, 0x01, 0xd1, - 0xb8, 0x55, 0x00, 0xe0, 0xb9, 0x55, 0x18, 0x9a, - 0x01, 0x3c, 0x01, 0x36, 0x94, 0x42, 0xf1, 0xd8, - 0x15, 0x9a, 0x00, 0x2a, 0x06, 0xd1, 0xb8, 0x19, - 0x18, 0x9a, 0x0a, 0xa9, 0xeb, 0xf7, 0xbd, 0xfd, - 0x18, 0x98, 0x36, 0x18, 0x0d, 0xe1, 0x3e, 0x49, - 0x0c, 0xa8, 0x0c, 0xc9, 0x0c, 0xc0, 0x0e, 0xc9, - 0x0e, 0xc0, 0x20, 0x9b, 0x04, 0x33, 0xd8, 0x1f, - 0x39, 0x38, 0x20, 0x93, 0xc0, 0x6b, 0x00, 0x2c, - 0x00, 0xd1, 0x01, 0x24, 0x15, 0x9a, 0x01, 0x2a, - 0x01, 0xd1, 0x00, 0x19, 0x01, 0x38, 0x61, 0x1e, - 0x00, 0x2c, 0x47, 0xd0, 0x3a, 0x24, 0x1a, 0x9a, - 0xb2, 0x42, 0x02, 0xd8, 0x00, 0x20, 0xb8, 0x55, - 0xa1, 0xe5, 0x14, 0x9a, 0x30, 0x2a, 0x05, 0xd1, - 0x30, 0x23, 0xbb, 0x55, 0x78, 0x23, 0x72, 0x1c, - 0xbb, 0x54, 0x56, 0x1c, 0x00, 0x28, 0x11, 0xd1, - 0x28, 0x20, 0xb8, 0x55, 0x71, 0x1c, 0x6e, 0x22, - 0x7a, 0x54, 0x48, 0x1c, 0x75, 0x22, 0x3a, 0x54, - 0x41, 0x1c, 0x6c, 0x22, 0x7a, 0x54, 0x48, 0x1c, - 0x3a, 0x54, 0x41, 0x1c, 0x29, 0x20, 0x78, 0x54, - 0x4e, 0x1c, 0x23, 0xe0, 0x02, 0x78, 0x0c, 0xab, - 0x12, 0x09, 0x9b, 0x5c, 0xbb, 0x55, 0x03, 0x78, - 0x1b, 0x07, 0x1b, 0x0f, 0x72, 0x1c, 0x0c, 0xae, - 0xf3, 0x5c, 0x56, 0x1c, 0xbb, 0x54, 0x15, 0x9a, - 0x01, 0x2a, 0x01, 0xd1, 0x01, 0x38, 0x00, 0xe0, - 0x01, 0x30, 0x00, 0x29, 0x0a, 0xd0, 0x14, 0x9a, - 0x3a, 0x2a, 0xed, 0x09, 0x00, 0x4c, 0x01, 0x03, - 0xd1, 0x32, 0x1c, 0xbc, 0x54, 0x01, 0x36, 0x03, - 0xe0, 0x20, 0x23, 0x32, 0x1c, 0xbb, 0x54, 0x01, - 0x36, 0x0a, 0x1c, 0x01, 0x39, 0x00, 0x2a, 0xb8, - 0xd1, 0xad, 0xe0, 0x20, 0x9b, 0x04, 0x33, 0xd8, - 0x1f, 0x39, 0x38, 0x20, 0x93, 0xc1, 0x6b, 0x19, - 0x91, 0x00, 0x29, 0x01, 0xd1, 0x0b, 0xa1, 0x19, - 0x91, 0x17, 0x98, 0x00, 0x28, 0x03, 0xd1, 0x1e, - 0x99, 0x88, 0x1b, 0x02, 0x38, 0x17, 0x90, 0x00, - 0x22, 0x18, 0x92, 0x0e, 0xe0, 0x18, 0x9a, 0x01, - 0x32, 0x18, 0x92, 0x0a, 0xe0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, - 0x5c, 0x03, 0x20, 0x28, 0x6e, 0x75, 0x6c, 0x6c, - 0x29, 0x00, 0x00, 0x19, 0x99, 0x18, 0x9a, 0x88, - 0x56, 0x00, 0x28, 0x03, 0xd0, 0x17, 0x98, 0x18, - 0x9a, 0x82, 0x42, 0xe7, 0xd3, 0x15, 0x9a, 0x01, - 0x2a, 0x06, 0xd1, 0xb8, 0x19, 0x19, 0x99, 0x18, - 0x9a, 0xeb, 0xf7, 0x25, 0xfd, 0x18, 0x9a, 0xb6, - 0x18, 0x18, 0x9a, 0x94, 0x42, 0x0f, 0xd9, 0x20, - 0x21, 0x30, 0x20, 0x16, 0x9a, 0x00, 0x2a, 0x04, - 0xd0, 0x15, 0x9a, 0x00, 0x2a, 0x01, 0xd1, 0xb8, - 0x55, 0x00, 0xe0, 0xb9, 0x55, 0x18, 0x9a, 0x01, - 0x3c, 0x01, 0x36, 0x94, 0x42, 0xf1, 0xd8, 0x15, - 0x9a, 0x00, 0x2a, 0x60, 0xd1, 0xb8, 0x19, 0x19, - 0x99, 0x18, 0x9a, 0xeb, 0xf7, 0x08, 0xfd, 0x18, - 0x9a, 0xb6, 0x18, 0x13, 0xe1, 0x13, 0x98, 0x01, - 0x28, 0x1d, 0xd1, 0x20, 0x9b, 0x08, 0x33, 0xd9, - 0x1f, 0x01, 0x39, 0x20, 0x93, 0x08, 0x68, 0x8e, - 0xa3, 0x0a, 0x90, 0x49, 0x68, 0x0b, 0x91, 0x1a, - 0x68, 0x5b, 0x68, 0xeb, 0xf7, 0x1c, 0xfe, 0x00, - 0x28, 0x06, 0xd0, 0x00, 0xa1, 0x07, 0x22, 0x94, - 0x39, 0x0c, 0xa8, 0xeb, 0xf7, 0xec, 0xfc, 0x05, - 0xe0, 0x10, 0x23, 0x0a, 0x98, 0xed, 0x09, 0x00, - 0x4d, 0x01, 0x0b, 0x99, 0x0c, 0xaa, 0x10, 0xf0, - 0x07, 0xff, 0x12, 0xe0, 0x20, 0x9b, 0x04, 0x33, - 0xd8, 0x1f, 0x39, 0x38, 0x20, 0x93, 0xc0, 0x6b, - 0x00, 0x28, 0x06, 0xd1, 0x00, 0xa1, 0x07, 0x22, - 0xc0, 0x39, 0x0c, 0xa8, 0xeb, 0xf7, 0xd6, 0xfc, - 0x03, 0xe0, 0x10, 0x22, 0x0c, 0xa9, 0x10, 0xf0, - 0xc1, 0xff, 0x0c, 0xa8, 0x11, 0xf0, 0x1a, 0xf8, - 0x15, 0x9a, 0x18, 0x90, 0x01, 0x2a, 0x02, 0xd0, - 0x18, 0x98, 0x84, 0x42, 0x1b, 0xd8, 0x14, 0x9a, - 0x30, 0x2a, 0x05, 0xd1, 0x30, 0x21, 0xb9, 0x55, - 0x78, 0x21, 0x70, 0x1c, 0x39, 0x54, 0x46, 0x1c, - 0xb8, 0x19, 0x18, 0x9a, 0x0c, 0xa9, 0xeb, 0xf7, - 0xb9, 0xfc, 0x18, 0x98, 0x36, 0x18, 0x84, 0x42, - 0x36, 0xd9, 0x20, 0x21, 0x30, 0x1c, 0x39, 0x54, - 0x18, 0x98, 0x01, 0x36, 0x01, 0x3c, 0x84, 0x42, - 0xf8, 0xd8, 0x2d, 0xe0, 0xb9, 0xe0, 0x16, 0x9a, - 0x00, 0x2a, 0x11, 0xd0, 0x14, 0x9a, 0x30, 0x2a, - 0x05, 0xd1, 0x30, 0x21, 0xb9, 0x55, 0x78, 0x21, - 0x70, 0x1c, 0x39, 0x54, 0x46, 0x1c, 0x30, 0x21, - 0x30, 0x1c, 0x39, 0x54, 0x18, 0x98, 0x01, 0x36, - 0x01, 0x3c, 0x84, 0x42, 0xf8, 0xd8, 0x10, 0xe0, - 0x20, 0x21, 0x30, 0x1c, 0x39, 0x54, 0x18, 0x98, - 0x01, 0x36, 0x01, 0x3c, 0x84, 0x42, 0xf8, 0xd8, - 0x14, 0x9a, 0x30, 0x2a, 0x05, 0xd1, 0x30, 0x21, - 0xb9, 0x55, 0x78, 0x21, 0x70, 0x1c, 0x39, 0x54, - 0x46, 0x1c, 0xb8, 0x19, 0x18, 0x9a, 0x0c, 0xa9, - 0xeb, 0xf7, 0x80, 0xfc, 0x18, 0x98, 0x36, 0x18, - 0x8b, 0xe0, 0x13, 0x98, 0x01, 0x28, 0x0c, 0xd1, - 0x20, 0x9b, 0x0c, 0xaa, 0x08, 0x33, 0xd9, 0x1f, - 0x01, 0x39, 0x20, 0x93, 0x08, 0x68, 0x49, 0x68, - 0x10, 0x23, 0x10, 0xf0, 0x91, 0xfe, 0x0a, 0xe0, - 0x80, 0xe0, 0x20, 0x9b, 0x0c, 0xa9, 0x04, 0x33, - 0xed, 0x09, 0x00, 0x4e, 0x01, 0xd8, 0x1f, 0x39, - 0x38, 0x20, 0x93, 0xc0, 0x6b, 0x10, 0x22, 0x10, - 0xf0, 0x53, 0xff, 0x0c, 0xa8, 0x10, 0xf0, 0xac, - 0xff, 0x15, 0x9a, 0x18, 0x90, 0x01, 0x2a, 0x02, - 0xd0, 0x18, 0x98, 0x84, 0x42, 0x1a, 0xd8, 0x14, - 0x9a, 0x30, 0x2a, 0x05, 0xd1, 0x30, 0x21, 0xb9, - 0x55, 0x78, 0x21, 0x70, 0x1c, 0x39, 0x54, 0x46, - 0x1c, 0xb8, 0x19, 0x18, 0x9a, 0x0c, 0xa9, 0xeb, - 0xf7, 0x4b, 0xfc, 0x18, 0x98, 0x36, 0x18, 0x84, - 0x42, 0x36, 0xd9, 0x20, 0x21, 0x30, 0x1c, 0x39, - 0x54, 0x18, 0x98, 0x01, 0x36, 0x01, 0x3c, 0x84, - 0x42, 0xf8, 0xd8, 0x2d, 0xe0, 0x16, 0x9a, 0x00, - 0x2a, 0x12, 0xd0, 0x14, 0x9a, 0x30, 0x2a, 0x05, - 0xd1, 0x30, 0x21, 0xb9, 0x55, 0x78, 0x21, 0x70, - 0x1c, 0x39, 0x54, 0x46, 0x1c, 0x30, 0x21, 0x30, - 0x1c, 0x39, 0x54, 0x18, 0x98, 0x01, 0x36, 0x01, - 0x3c, 0x84, 0x42, 0xf8, 0xd8, 0x11, 0xe0, 0x44, - 0xe0, 0x20, 0x21, 0x30, 0x1c, 0x39, 0x54, 0x18, - 0x98, 0x01, 0x36, 0x01, 0x3c, 0x84, 0x42, 0xf8, - 0xd8, 0x14, 0x9a, 0x30, 0x2a, 0x05, 0xd1, 0x30, - 0x21, 0xb9, 0x55, 0x78, 0x21, 0x70, 0x1c, 0x39, - 0x54, 0x46, 0x1c, 0xb8, 0x19, 0x18, 0x9a, 0x0c, - 0xa9, 0xeb, 0xf7, 0x12, 0xfc, 0x18, 0x98, 0x36, - 0x18, 0x1d, 0xe0, 0x1f, 0xe0, 0x20, 0x9b, 0x04, - 0x33, 0xd8, 0x1f, 0x39, 0x38, 0x54, 0x21, 0xc9, - 0x43, 0x20, 0x93, 0xc0, 0x6b, 0x72, 0x1c, 0xb9, - 0x55, 0x03, 0x0a, 0x51, 0x1c, 0xb8, 0x54, 0x7b, - 0x54, 0x03, 0x0c, 0x4a, 0x1c, 0x00, 0x0e, 0x51, - 0x1c, 0xbb, 0x54, 0x78, 0x54, 0x45, 0x20, 0xc0, - 0x43, 0x4a, 0x1c, 0xb8, 0x54, 0x56, 0x1c, 0x02, - 0xe0, 0x06, 0xe0, 0xb8, 0x55, 0x01, 0x36, 0x00, - 0x20, 0x13, 0x90, 0x01, 0xe0, 0xb8, 0x55, 0x01, - 0x36, 0x00, 0x23, 0xed, 0x09, 0x00, 0x4f, 0x01, - 0x01, 0x35, 0xe8, 0x56, 0x00, 0x28, 0x01, 0xd0, - 0xff, 0xf7, 0xe6, 0xfb, 0x00, 0x2e, 0x00, 0xd1, - 0x44, 0xe6, 0x00, 0x20, 0xb8, 0x55, 0x41, 0xe6, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0f, 0xb4, 0x00, 0xb5, 0x00, 0x21, - 0xc9, 0x43, 0x02, 0x9a, 0x03, 0xab, 0xff, 0xf7, - 0xbe, 0xfb, 0x08, 0xbc, 0x04, 0xb0, 0x18, 0x47, - 0x0f, 0xb4, 0x00, 0xb5, 0x03, 0x9a, 0x04, 0xab, - 0xff, 0xf7, 0xb5, 0xfb, 0x08, 0xbc, 0x04, 0xb0, - 0x18, 0x47, 0xf0, 0xb5, 0xa2, 0xb0, 0x00, 0x22, - 0x00, 0x92, 0x31, 0x4f, 0x7f, 0x22, 0x38, 0x1c, - 0x02, 0xa9, 0x01, 0xab, 0x11, 0xf0, 0xb9, 0xf9, - 0x28, 0x23, 0xd8, 0x42, 0x07, 0xd1, 0x82, 0x11, - 0x00, 0x92, 0x7f, 0x22, 0x38, 0x1c, 0x02, 0xa9, - 0x01, 0xab, 0x11, 0xf0, 0xae, 0xf9, 0x01, 0x98, - 0x00, 0x22, 0x02, 0xa9, 0x0a, 0x54, 0x06, 0x28, - 0x02, 0xac, 0x02, 0xad, 0x40, 0xd3, 0x20, 0x78, - 0xab, 0x28, 0x36, 0xd1, 0x60, 0x79, 0xba, 0x28, - 0x33, 0xd1, 0xac, 0x42, 0x05, 0xd0, 0x00, 0x22, - 0x22, 0x70, 0x28, 0x1c, 0x10, 0xf0, 0x07, 0xf9, - 0x25, 0x1c, 0x61, 0x78, 0x00, 0xab, 0x19, 0x70, - 0xa1, 0x78, 0x59, 0x70, 0xe1, 0x78, 0x99, 0x70, - 0x20, 0x79, 0xd8, 0x70, 0x00, 0x99, 0x00, 0x29, - 0x16, 0xd0, 0x7d, 0x20, 0xc0, 0x00, 0xeb, 0xf7, - 0xa0, 0xfa, 0x0e, 0x1c, 0x01, 0x1c, 0x3c, 0x20, - 0xeb, 0xf7, 0x9b, 0xfa, 0x0f, 0x1c, 0x01, 0x1c, - 0x3c, 0x20, 0xeb, 0xf7, 0x96, 0xfa, 0x0a, 0x1c, - 0x3b, 0x1c, 0x10, 0xa7, 0x01, 0x1c, 0x38, 0x1c, - 0x00, 0x96, 0x00, 0xf0, 0x16, 0xf9, 0x02, 0xe0, - 0x13, 0xa0, 0x00, 0xf0, 0x12, 0xf9, 0x01, 0x98, - 0x06, 0x34, 0x06, 0x38, 0x01, 0x90, 0x06, 0x35, - 0x03, 0xe0, 0x01, 0x98, 0x01, 0x38, 0xed, 0x09, - 0x00, 0x50, 0x01, 0x01, 0x90, 0x01, 0x34, 0x01, - 0x98, 0x06, 0x28, 0xbe, 0xd2, 0x00, 0x23, 0xe8, - 0x56, 0x00, 0x28, 0x9e, 0xd0, 0x28, 0x1c, 0x10, - 0xf0, 0xcc, 0xf8, 0x9a, 0xe7, 0x00, 0x00, 0x4c, - 0xb8, 0x03, 0x20, 0x5b, 0x25, 0x30, 0x32, 0x75, - 0x3a, 0x25, 0x30, 0x32, 0x75, 0x3a, 0x25, 0x30, - 0x32, 0x75, 0x20, 0x25, 0x30, 0x33, 0x75, 0x5d, - 0x00, 0x00, 0x00, 0x5b, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x20, 0x74, 0x69, 0x6d, 0x65, - 0x20, 0x28, 0x6e, 0x75, 0x6c, 0x6c, 0x29, 0x5d, - 0x00, 0x00, 0x00, 0x90, 0xb5, 0xa2, 0xb0, 0x0c, - 0xa0, 0x10, 0xf0, 0xd9, 0xf8, 0x10, 0x4c, 0x00, - 0x27, 0x00, 0x22, 0x00, 0x92, 0x7f, 0x22, 0x20, - 0x1c, 0x02, 0xa9, 0x01, 0xab, 0x11, 0xf0, 0x33, - 0xf9, 0x00, 0x28, 0x05, 0xd1, 0x01, 0x99, 0x02, - 0xa8, 0x47, 0x54, 0x10, 0xf0, 0xc8, 0xf8, 0xef, - 0xe7, 0x22, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x50, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x5f, 0x46, - 0x6c, 0x75, 0x73, 0x68, 0x3a, 0x0a, 0x00, 0x4c, - 0xb8, 0x03, 0x20, 0x80, 0xb5, 0x07, 0x1c, 0xfd, - 0xf7, 0xa8, 0xff, 0x00, 0x28, 0x01, 0xd1, 0x20, - 0xf0, 0xb0, 0xfd, 0x0e, 0x48, 0x05, 0x2f, 0x0f, - 0xd2, 0x02, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, - 0x44, 0x00, 0x1c, 0x03, 0x09, 0x06, 0x06, 0x06, - 0x00, 0xfd, 0xf7, 0xf9, 0xfd, 0x04, 0xe0, 0xfd, - 0xf7, 0xc2, 0xfe, 0x01, 0xe0, 0xfd, 0xf7, 0xf3, - 0xfd, 0x06, 0x48, 0x07, 0x60, 0xfd, 0xf7, 0x8d, - 0xff, 0x00, 0x28, 0x01, 0xd1, 0x20, 0xf0, 0x91, - 0xfd, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xa4, - 0xb7, 0x03, 0x20, 0xd0, 0x67, 0x03, 0x20, 0x80, - 0xb5, 0x87, 0xb0, 0x01, 0x20, 0x40, 0x03, 0x10, - 0xf0, 0xed, 0x09, 0x00, 0x51, 0x01, 0x46, 0xfe, - 0x1f, 0x27, 0xff, 0x43, 0x19, 0x49, 0x03, 0x1c, - 0x00, 0x28, 0x48, 0x60, 0x04, 0xd1, 0x38, 0x1c, - 0x07, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x06, 0x22, 0x7f, 0x21, 0x0d, 0x20, 0x02, 0x92, - 0x1a, 0x1c, 0x01, 0x23, 0x00, 0x90, 0x01, 0x91, - 0x12, 0xa1, 0x11, 0x48, 0x5b, 0x03, 0x10, 0xf0, - 0x1d, 0xff, 0x11, 0x48, 0x10, 0xf0, 0x2a, 0xfe, - 0x03, 0x1c, 0x01, 0xd1, 0x38, 0x1c, 0xe7, 0xe7, - 0x09, 0x22, 0x06, 0x92, 0x64, 0x22, 0x0a, 0x21, - 0x05, 0x91, 0x03, 0x92, 0x00, 0x22, 0x0a, 0x49, - 0x14, 0x20, 0x04, 0x90, 0x00, 0x92, 0x01, 0x93, - 0x02, 0x91, 0x06, 0xa1, 0x00, 0x23, 0x07, 0x4a, - 0x07, 0x48, 0xfd, 0xf7, 0x77, 0xfb, 0x00, 0x20, - 0xd2, 0xe7, 0x00, 0x00, 0xd0, 0x67, 0x03, 0x20, - 0x4c, 0xb8, 0x03, 0x20, 0x44, 0x62, 0x67, 0x00, - 0xfe, 0x04, 0x00, 0x00, 0x95, 0x4c, 0x01, 0x20, - 0xa4, 0xb7, 0x03, 0x20, 0x90, 0xb5, 0x17, 0x1c, - 0x1c, 0xd0, 0x01, 0x2f, 0x03, 0xd0, 0x02, 0x2f, - 0x01, 0xd0, 0x03, 0x2f, 0x13, 0xd1, 0x0a, 0x1c, - 0x11, 0x4c, 0x01, 0x1c, 0x00, 0x23, 0x20, 0x1c, - 0x10, 0xf0, 0xae, 0xff, 0x29, 0x23, 0xd8, 0x42, - 0x05, 0xd1, 0x20, 0x1c, 0x00, 0x23, 0x06, 0x22, - 0x0c, 0xa1, 0x10, 0xf0, 0xa5, 0xff, 0x02, 0x2f, - 0x01, 0xd1, 0x0e, 0xf0, 0xb3, 0xfa, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x10, 0xf0, 0x22, 0xf8, - 0x08, 0x48, 0x41, 0x79, 0x60, 0x23, 0x19, 0x40, - 0x60, 0x29, 0xf4, 0xd0, 0x41, 0x79, 0x60, 0x23, - 0x19, 0x40, 0x60, 0x29, 0xfa, 0xd1, 0xee, 0xe7, - 0x4c, 0xb8, 0x03, 0x20, 0x3c, 0x46, 0x55, 0x4c, - 0x4c, 0x3e, 0x00, 0x00, 0x60, 0x00, 0x00, 0xd0, - 0x0f, 0xb4, 0x00, 0xb5, 0x06, 0x48, 0x01, 0x22, - 0x03, 0x68, 0x02, 0xa9, 0xed, 0x09, 0x00, 0x52, - 0x01, 0x00, 0x2b, 0x00, 0xd0, 0x02, 0x68, 0x01, - 0x98, 0xfe, 0xf7, 0xea, 0xfd, 0x08, 0xbc, 0x04, - 0xb0, 0x18, 0x47, 0x00, 0x00, 0xd0, 0x67, 0x03, - 0x20, 0x0f, 0xb4, 0x00, 0xb5, 0x00, 0x22, 0x01, - 0x98, 0x02, 0xa9, 0xfe, 0xf7, 0xdd, 0xfd, 0x08, - 0xbc, 0x04, 0xb0, 0x18, 0x47, 0x0f, 0xb4, 0x00, - 0xb5, 0x04, 0x48, 0x02, 0xa9, 0x02, 0x68, 0x01, - 0x98, 0xfe, 0xf7, 0xd2, 0xfd, 0x08, 0xbc, 0x04, - 0xb0, 0x18, 0x47, 0x00, 0x00, 0xd0, 0x67, 0x03, - 0x20, 0x90, 0xb5, 0x87, 0xb0, 0x07, 0x1c, 0x23, - 0x48, 0xc4, 0x1b, 0x9c, 0x20, 0x0f, 0xf0, 0x5a, - 0xff, 0x0f, 0xf0, 0x6c, 0xff, 0xfe, 0xf7, 0xba, - 0xfd, 0x20, 0xf0, 0xe0, 0xfc, 0xfc, 0xf7, 0xfe, - 0xfb, 0x0f, 0xf0, 0xec, 0xff, 0x10, 0xf0, 0x3e, - 0xf8, 0x1b, 0xa3, 0x22, 0xa2, 0x24, 0xa1, 0x27, - 0xa0, 0xff, 0xf7, 0xd8, 0xff, 0xff, 0x21, 0x01, - 0x31, 0x06, 0x22, 0x01, 0x92, 0x3a, 0x1c, 0x00, - 0x91, 0x2d, 0xa1, 0x23, 0x1c, 0x2b, 0x48, 0x11, - 0xf0, 0xa3, 0xf9, 0x10, 0xf0, 0x6d, 0xf8, 0x06, - 0xf0, 0x03, 0xfc, 0x00, 0xf0, 0x27, 0xf9, 0x01, - 0x27, 0x3f, 0x03, 0x38, 0x1c, 0x10, 0xf0, 0x74, - 0xfd, 0x27, 0x49, 0x0c, 0x22, 0x48, 0x60, 0x06, - 0x92, 0x01, 0x22, 0x03, 0x1c, 0x03, 0x92, 0x00, - 0x22, 0x00, 0x20, 0x08, 0x21, 0x05, 0x91, 0x04, - 0x90, 0x00, 0x92, 0x01, 0x93, 0x00, 0x23, 0x21, - 0x4a, 0x21, 0x48, 0x22, 0xa1, 0x02, 0x97, 0xfd, - 0xf7, 0xc3, 0xfa, 0x07, 0xb0, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x20, 0x24, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x3a, 0x20, 0x31, 0x2e, 0x36, 0x39, 0x20, - 0x24, 0x00, 0x00, 0x00, 0x00, 0x31, 0x36, 0xed, - 0x09, 0x00, 0x53, 0x01, 0x3a, 0x30, 0x34, 0x3a, - 0x32, 0x31, 0x00, 0x00, 0x00, 0x00, 0x41, 0x70, - 0x72, 0x20, 0x32, 0x33, 0x20, 0x32, 0x30, 0x30, - 0x33, 0x00, 0x0d, 0x0a, 0x42, 0x6c, 0x75, 0x65, - 0x74, 0x6f, 0x6f, 0x74, 0x68, 0x20, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x20, 0x28, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x20, 0x25, 0x73, 0x20, 0x25, - 0x73, 0x20, 0x25, 0x73, 0x29, 0x0d, 0x0a, 0x00, - 0x00, 0x00, 0x94, 0xb8, 0x03, 0x20, 0x53, 0x59, - 0x53, 0x4d, 0x45, 0x4d, 0x00, 0x00, 0xd8, 0x67, - 0x03, 0x20, 0x11, 0x51, 0x01, 0x20, 0x1c, 0xb9, - 0x03, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x00, 0x00, - 0x00, 0x00, 0x80, 0xb5, 0x09, 0x4f, 0x38, 0x1c, - 0xfd, 0xf7, 0xd1, 0xfb, 0x38, 0x1c, 0xfd, 0xf7, - 0x5a, 0xfb, 0x06, 0x4f, 0x78, 0x68, 0x10, 0xf0, - 0x6c, 0xfd, 0x00, 0x20, 0x78, 0x60, 0x02, 0x20, - 0x38, 0x60, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x1c, 0xb9, 0x03, 0x20, 0xd8, 0x67, - 0x03, 0x20, 0x80, 0xb4, 0x0e, 0x49, 0x00, 0x23, - 0x0a, 0x68, 0x17, 0x78, 0x11, 0x1c, 0xff, 0x2f, - 0x12, 0xd0, 0x17, 0x78, 0x00, 0x2f, 0x0b, 0xd1, - 0x00, 0x28, 0x07, 0xd1, 0x18, 0x1c, 0x00, 0x23, - 0xca, 0x56, 0x00, 0x2a, 0x00, 0xd0, 0x08, 0x1c, - 0x80, 0xbc, 0x70, 0x47, 0x01, 0x38, 0x51, 0x1c, - 0x57, 0x78, 0x01, 0x32, 0xff, 0x2f, 0xec, 0xd1, - 0x18, 0x1c, 0xf5, 0xe7, 0x00, 0x00, 0xc8, 0x67, - 0x03, 0x20, 0x00, 0xb5, 0x68, 0x22, 0xff, 0x21, - 0x1f, 0x20, 0x80, 0x02, 0xeb, 0xf7, 0xf9, 0xf8, - 0x68, 0x22, 0x1f, 0x20, 0x80, 0x02, 0x0c, 0x49, - 0x10, 0xf0, 0x0f, 0xf8, 0x01, 0x20, 0x40, 0x02, - 0x20, 0xf0, 0x73, 0xfb, 0x00, 0x20, 0x20, 0xf0, - 0x14, 0xfc, 0xff, 0xf7, 0x80, 0xfe, 0x00, 0xf0, - 0x7c, 0xf9, 0xed, 0x09, 0x00, 0x54, 0x01, 0x9c, - 0x20, 0x0f, 0xf0, 0x85, 0xfe, 0x00, 0xf0, 0xf9, - 0xf9, 0x0d, 0xf0, 0xf9, 0xfe, 0x03, 0x49, 0x01, - 0x20, 0x08, 0x60, 0x08, 0xbc, 0x18, 0x47, 0x98, - 0x1f, 0x00, 0x00, 0xd8, 0x67, 0x03, 0x20, 0x70, - 0x47, 0x00, 0x00, 0x00, 0x20, 0x70, 0x47, 0xb0, - 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x17, 0x1c, 0x20, - 0xf0, 0xfe, 0xfb, 0x05, 0x49, 0x00, 0x20, 0x08, - 0x60, 0x21, 0x1c, 0x2a, 0x1c, 0x3b, 0x1c, 0x03, - 0xa0, 0xff, 0xf7, 0xf5, 0xfe, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xd0, 0x67, 0x03, 0x20, 0x0a, - 0x0d, 0x50, 0x72, 0x65, 0x66, 0x65, 0x74, 0x63, - 0x68, 0x5f, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x5f, - 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x3a, - 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x2e, 0x3a, - 0x25, 0x78, 0x20, 0x61, 0x74, 0x20, 0x25, 0x78, - 0x20, 0x28, 0x4d, 0x50, 0x55, 0x5f, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x3a, 0x20, 0x25, 0x78, - 0x29, 0x0a, 0x00, 0xf0, 0xb5, 0x0c, 0x1c, 0x05, - 0x1c, 0x17, 0x1c, 0x20, 0xf0, 0xcc, 0xfb, 0x00, - 0x26, 0x06, 0x48, 0x29, 0x1c, 0x22, 0x1c, 0x06, - 0x60, 0x05, 0xa0, 0x3b, 0x1c, 0xff, 0xf7, 0xc3, - 0xfe, 0x30, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0xd0, 0x67, 0x03, 0x20, 0x0a, - 0x0d, 0x44, 0x61, 0x74, 0x61, 0x5f, 0x41, 0x62, - 0x6f, 0x72, 0x74, 0x5f, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x72, 0x3a, 0x20, 0x69, 0x6e, 0x73, - 0x74, 0x72, 0x2e, 0x3a, 0x25, 0x78, 0x20, 0x61, - 0x74, 0x20, 0x25, 0x78, 0x20, 0x28, 0x4d, 0x50, - 0x55, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x3a, 0x20, 0x25, 0x78, 0x29, 0x0a, 0x00, 0x80, - 0xb5, 0x87, 0xb0, 0x01, 0x20, 0x14, 0x49, 0x01, - 0x27, 0xff, 0x02, 0x08, 0x60, 0xed, 0x09, 0x00, - 0x55, 0x01, 0x38, 0x1c, 0x10, 0xf0, 0x48, 0xfc, - 0x03, 0x1c, 0x05, 0xd1, 0x1f, 0x20, 0xc0, 0x43, - 0x07, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x0c, 0x22, 0x06, 0x92, 0x64, 0x22, 0x03, 0x92, - 0x00, 0x22, 0x0a, 0x21, 0x00, 0x20, 0x04, 0x90, - 0x05, 0x91, 0x00, 0x92, 0x01, 0x93, 0x00, 0x23, - 0x07, 0x4a, 0x09, 0xa1, 0x07, 0x48, 0x02, 0x97, - 0xfd, 0xf7, 0x92, 0xf9, 0x07, 0x1c, 0x03, 0xd0, - 0x38, 0x1c, 0x00, 0xdf, 0x38, 0x1c, 0xe3, 0xe7, - 0x00, 0x20, 0xe1, 0xe7, 0xe0, 0x67, 0x03, 0x20, - 0x79, 0x53, 0x01, 0x20, 0xc4, 0xb9, 0x03, 0x20, - 0x69, 0x64, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x18, 0x4f, 0x00, 0x26, 0x78, 0x68, - 0x00, 0x28, 0x06, 0xd1, 0xfc, 0xf7, 0x9c, 0xfa, - 0x78, 0x60, 0xbe, 0x60, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xb8, 0x68, 0x01, 0x30, 0xb8, 0x60, - 0xfc, 0xf7, 0x92, 0xfa, 0x79, 0x68, 0x10, 0x4b, - 0xcd, 0x18, 0x85, 0x42, 0xf2, 0xd2, 0x3c, 0x1c, - 0xbf, 0x68, 0xa0, 0x69, 0x87, 0x42, 0x00, 0xd9, - 0xa7, 0x61, 0x60, 0x69, 0x87, 0x42, 0x00, 0xd9, - 0x67, 0x61, 0xe0, 0x69, 0x87, 0x42, 0x00, 0xd2, - 0xe7, 0x61, 0x64, 0x21, 0x79, 0x43, 0xa0, 0x69, - 0xea, 0xf7, 0xae, 0xff, 0xe1, 0x68, 0x40, 0x18, - 0x40, 0x08, 0xe0, 0x60, 0x27, 0x61, 0x65, 0x60, - 0xa6, 0x60, 0xd7, 0xe7, 0xe0, 0x67, 0x03, 0x20, - 0x88, 0x13, 0x00, 0x00, 0xf0, 0xb5, 0x11, 0x4e, - 0x01, 0x23, 0xf5, 0x69, 0xdd, 0x42, 0x19, 0xd0, - 0x70, 0x69, 0x64, 0x21, 0x41, 0x43, 0xb0, 0x69, - 0x07, 0x1c, 0xea, 0xf7, 0x95, 0xff, 0x64, 0x21, - 0x69, 0x43, 0x04, 0x1c, 0x38, 0x1c, 0xea, 0xf7, - 0x8f, 0xff, 0x01, 0x1c, 0x08, 0xa0, 0x22, 0x1c, - 0xf3, 0x68, 0x06, 0xf0, 0x18, 0xff, 0x00, 0x20, - 0xed, 0x09, 0x00, 0x56, 0x01, 0xc0, 0x43, 0xf0, - 0x61, 0x00, 0x20, 0x70, 0x61, 0x64, 0x20, 0xf0, - 0x60, 0x30, 0x69, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xe0, 0x67, 0x03, 0x20, 0x49, 0x64, 0x6c, - 0x65, 0x5b, 0x30, 0x5d, 0x3a, 0x20, 0x6d, 0x69, - 0x6e, 0x20, 0x25, 0x64, 0x25, 0x25, 0x20, 0x6d, - 0x61, 0x78, 0x20, 0x25, 0x64, 0x25, 0x25, 0x20, - 0x61, 0x76, 0x72, 0x20, 0x25, 0x64, 0x25, 0x25, - 0x00, 0xb0, 0xb5, 0x0b, 0x4c, 0x0b, 0x4d, 0x00, - 0x27, 0xff, 0xf7, 0x8c, 0xff, 0x08, 0xf0, 0x2f, - 0xfa, 0x20, 0x68, 0x01, 0x28, 0x01, 0xd1, 0xff, - 0xf7, 0x87, 0xfe, 0x38, 0x1c, 0x01, 0x37, 0xa8, - 0x42, 0x02, 0xd9, 0x00, 0x27, 0x00, 0xf0, 0x19, - 0xf8, 0xfd, 0xf7, 0x6a, 0xfc, 0xec, 0xe7, 0x00, - 0x00, 0xd8, 0x67, 0x03, 0x20, 0x40, 0x42, 0x0f, - 0x00, 0x80, 0xb5, 0x07, 0x1c, 0xfc, 0xf7, 0x16, - 0xfa, 0xc7, 0x19, 0xfc, 0xf7, 0x13, 0xfa, 0xb8, - 0x42, 0xfb, 0xd3, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0x0b, 0xfa, 0x08, - 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0xfc, 0xf7, 0x06, - 0xfa, 0x0b, 0x4d, 0x07, 0x1c, 0x29, 0x68, 0x2c, - 0x1d, 0x88, 0x42, 0x08, 0xd2, 0x09, 0xa3, 0x03, - 0xcc, 0x1a, 0x68, 0x5b, 0x68, 0x08, 0x3c, 0x80, - 0x18, 0x59, 0x41, 0x03, 0xc4, 0x08, 0x3c, 0x2f, - 0x60, 0x03, 0xcc, 0x00, 0x23, 0xc0, 0x19, 0xb0, - 0xbc, 0x59, 0x41, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x00, 0x68, 0x03, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xb5, 0x07, - 0x4f, 0x04, 0x21, 0x38, 0x1c, 0x11, 0xf0, 0x20, - 0xfa, 0x79, 0x6c, 0x00, 0x29, 0x02, 0xd0, 0xb8, - 0x6c, 0xea, 0xf7, 0xd9, 0xff, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x6c, 0xba, 0x03, - 0x20, 0x00, 0xb5, 0xed, 0x09, 0x00, 0x57, 0x01, - 0x83, 0xb0, 0x04, 0x22, 0x00, 0x21, 0x0a, 0x20, - 0x00, 0x90, 0x01, 0x91, 0x02, 0x92, 0x04, 0x4a, - 0x06, 0xa1, 0x04, 0x48, 0x00, 0x23, 0x11, 0xf0, - 0x5c, 0xf9, 0x03, 0xb0, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x15, 0x54, 0x01, 0x20, 0x6c, 0xba, - 0x03, 0x20, 0x43, 0x41, 0x5f, 0x54, 0x49, 0x4d, - 0x45, 0x52, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, - 0x0f, 0x1c, 0x0d, 0x4e, 0x04, 0x21, 0x14, 0x1c, - 0x05, 0x1c, 0x30, 0x1c, 0x11, 0xf0, 0xef, 0xf9, - 0x00, 0x2f, 0x0f, 0xd0, 0x28, 0x1c, 0xeb, 0xf7, - 0xfe, 0xf8, 0x00, 0x28, 0x00, 0xd1, 0x01, 0x20, - 0xb4, 0x64, 0x77, 0x64, 0x05, 0x22, 0x00, 0x92, - 0x02, 0x1c, 0x00, 0x23, 0x30, 0x1c, 0x03, 0x49, - 0x11, 0xf0, 0xb7, 0xf9, 0xf8, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x6c, 0xba, 0x03, 0x20, 0x15, 0x54, - 0x01, 0x20, 0x1f, 0x48, 0x00, 0x21, 0x01, 0x60, - 0x01, 0x22, 0x42, 0x60, 0xfd, 0x22, 0x52, 0x01, - 0x08, 0x30, 0x00, 0x23, 0x0a, 0xc0, 0x0a, 0xc0, - 0x18, 0x38, 0x82, 0x61, 0x01, 0x22, 0xd2, 0x03, - 0x01, 0x23, 0xdb, 0x02, 0xc2, 0x61, 0x03, 0x62, - 0x22, 0x22, 0x42, 0x62, 0x83, 0x62, 0xc2, 0x62, - 0xca, 0x43, 0x30, 0x30, 0x00, 0x23, 0x0a, 0xc0, - 0x0a, 0xc0, 0x0a, 0xc0, 0x48, 0x38, 0xc1, 0x64, - 0x01, 0x65, 0xff, 0x23, 0x55, 0x33, 0x42, 0x65, - 0x83, 0x66, 0x41, 0x66, 0x01, 0x22, 0x12, 0x03, - 0xc1, 0x66, 0x02, 0x67, 0x02, 0x22, 0x42, 0x67, - 0x81, 0x65, 0xc1, 0x65, 0xc2, 0x1d, 0x79, 0x32, - 0x01, 0x66, 0x93, 0x60, 0x51, 0x60, 0xd1, 0x60, - 0x11, 0x61, 0x51, 0x61, 0x81, 0x67, 0xc1, 0x67, - 0x11, 0x60, 0x60, 0x20, 0xd0, 0x61, 0x11, 0x62, - 0x51, 0x62, 0x02, 0x48, 0x91, 0x62, 0xd0, 0x62, - 0x70, 0x47, 0x60, 0xbb, 0x03, 0x20, 0xed, 0x09, - 0x00, 0x58, 0x01, 0xff, 0xff, 0x00, 0x00, 0xb0, - 0xb5, 0x87, 0xb0, 0x1c, 0x4c, 0x20, 0x68, 0x00, - 0x28, 0x02, 0xd0, 0xff, 0x27, 0x10, 0x37, 0x30, - 0xe0, 0x13, 0xf0, 0x23, 0xfa, 0x07, 0x1c, 0x04, - 0xd0, 0x38, 0x1c, 0x07, 0xb0, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x20, 0xe1, 0x1d, 0x79, - 0x31, 0x88, 0x61, 0xff, 0xf7, 0xa4, 0xff, 0x00, - 0xf0, 0x91, 0xf9, 0x0b, 0x23, 0xdb, 0x02, 0x09, - 0x22, 0x06, 0x92, 0x46, 0x22, 0x0a, 0x21, 0x00, - 0x20, 0x05, 0x91, 0x03, 0x21, 0x89, 0x02, 0x03, - 0x92, 0x00, 0x22, 0x0c, 0x4d, 0x04, 0x90, 0x28, - 0x1c, 0x00, 0x92, 0x02, 0x91, 0x01, 0x93, 0x00, - 0x23, 0x0a, 0xa1, 0x07, 0x4a, 0xfc, 0xf7, 0xff, - 0xff, 0x00, 0x28, 0xda, 0xd1, 0x28, 0x1c, 0xfd, - 0xf7, 0x2e, 0xfa, 0x00, 0x28, 0xd5, 0xd1, 0x01, - 0x20, 0x20, 0x60, 0x38, 0x1c, 0xd1, 0xe7, 0x60, - 0xbb, 0x03, 0x20, 0x8f, 0x56, 0x01, 0x20, 0xb8, - 0xba, 0x03, 0x20, 0x54, 0x5f, 0x48, 0x43, 0x00, - 0x00, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, 0x00, - 0x27, 0x20, 0x68, 0x00, 0x28, 0x0e, 0xd0, 0x13, - 0xf0, 0x36, 0xfa, 0x09, 0x4d, 0x28, 0x1c, 0xfd, - 0xf7, 0x36, 0xf9, 0x28, 0x1c, 0xfd, 0xf7, 0xbf, - 0xf8, 0x00, 0xf0, 0xcb, 0xf9, 0x02, 0xf0, 0x93, - 0xfa, 0x00, 0x20, 0x20, 0x60, 0x38, 0x1c, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0xb8, 0xba, 0x03, 0x20, 0x00, - 0xb5, 0x02, 0xf0, 0x85, 0xfa, 0xff, 0xf7, 0x53, - 0xff, 0x02, 0x49, 0x01, 0x20, 0x08, 0x60, 0x08, - 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, 0xb0, - 0xb5, 0x0c, 0x1c, 0x05, 0x1c, 0x17, 0x1c, 0xeb, - 0xf7, 0x95, 0xfa, 0x00, 0x28, 0x08, 0xd0, 0xde, - 0x21, 0x01, 0x60, 0x0c, 0x30, 0xb0, 0xc0, 0x18, - 0x38, 0xed, 0x09, 0x00, 0x59, 0x01, 0x01, 0x1c, - 0x01, 0x20, 0xeb, 0xf7, 0xf9, 0xfa, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x02, 0x1c, - 0x41, 0x69, 0xc0, 0x68, 0x12, 0x69, 0xea, 0xf7, - 0xc7, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, - 0x83, 0xb0, 0x15, 0x1c, 0x08, 0x9a, 0x0f, 0x1c, - 0x04, 0x1c, 0x07, 0x48, 0x07, 0x99, 0x00, 0x90, - 0x01, 0x91, 0x39, 0x1c, 0x20, 0x1c, 0x02, 0x92, - 0x2a, 0x1c, 0x12, 0xf0, 0x57, 0xfb, 0x03, 0xb0, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x1d, 0x56, 0x01, 0x20, 0x00, 0xb5, 0x12, 0xf0, - 0x19, 0xfc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x78, 0x4c, 0xfd, 0xf7, 0xf1, 0xfa, 0x00, 0x20, - 0xeb, 0xf7, 0x14, 0xfb, 0x07, 0x1c, 0x20, 0x6a, - 0x00, 0x28, 0x04, 0xd0, 0x38, 0x68, 0xbe, 0x28, - 0x01, 0xd0, 0xb7, 0x28, 0xf1, 0xd1, 0x38, 0x68, - 0xb7, 0x38, 0x2b, 0x28, 0x01, 0xd2, 0x43, 0x00, - 0x9f, 0x44, 0xd4, 0xe0, 0xd1, 0xe0, 0x54, 0xe0, - 0x4f, 0xe0, 0x4a, 0xe0, 0xc1, 0xe0, 0x54, 0xe0, - 0xbb, 0xe0, 0xb6, 0xe0, 0xad, 0xe0, 0xa8, 0xe0, - 0xa3, 0xe0, 0x9e, 0xe0, 0x29, 0xe0, 0x98, 0xe0, - 0x93, 0xe0, 0x8e, 0xe0, 0xa9, 0xe0, 0x34, 0xe0, - 0x27, 0xe0, 0x2a, 0xe0, 0x2d, 0xe0, 0x34, 0xe0, - 0x47, 0xe0, 0x4a, 0xe0, 0x4d, 0xe0, 0x50, 0xe0, - 0x53, 0xe0, 0x66, 0xe0, 0x6d, 0xe0, 0x70, 0xe0, - 0x67, 0xe0, 0x0a, 0xe0, 0x0d, 0xe0, 0x70, 0xe0, - 0x73, 0xe0, 0x4e, 0xe0, 0x51, 0xe0, 0x54, 0xe0, - 0x57, 0xe0, 0x72, 0xe0, 0xa1, 0xe0, 0xa4, 0xe0, - 0x07, 0xe0, 0x38, 0x1c, 0x02, 0xf0, 0xbc, 0xff, - 0xa5, 0xe0, 0x38, 0x1c, 0x02, 0xf0, 0xfa, 0xff, - 0xa1, 0xe0, 0x38, 0x1c, 0x03, 0xf0, 0x16, 0xf8, - 0x9d, 0xe0, 0x38, 0x1c, 0x02, 0xf0, 0x96, 0xfe, - 0x99, 0xe0, 0x38, 0x1c, 0xed, 0x09, 0x00, 0x5a, - 0x01, 0x02, 0xf0, 0x88, 0xfa, 0x95, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x98, 0xfa, 0x91, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xa6, 0xfa, 0x8d, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xb4, 0xfa, 0x89, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xf0, 0xfa, 0x85, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x14, 0xfb, 0x81, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x20, 0xfb, 0x7d, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x2a, 0xfb, 0x79, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x6c, 0xff, 0x75, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xec, 0xfa, 0x71, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xf4, 0xfa, 0x6d, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x28, 0xfb, 0x69, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x82, 0xfb, 0x65, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xb8, 0xfb, 0x61, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xcc, 0xfb, 0x5d, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xf8, 0xfb, 0x59, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x04, 0xfc, 0x55, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x10, 0xfc, 0x51, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x18, 0xfc, 0x4d, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x54, 0xfc, 0x49, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xae, 0xfc, 0x45, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x50, 0xfd, 0x41, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x06, 0xfd, 0x3d, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xd8, 0xfd, 0x39, 0xe0, 0x38, - 0x1c, 0xff, 0xf7, 0x26, 0xff, 0x35, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x0a, 0xfe, 0x31, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x1a, 0xfe, 0x2d, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x3c, 0xfe, 0x29, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x58, 0xfe, 0x25, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x70, 0xfe, 0x21, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0x7c, 0xfe, 0x1d, 0xe0, 0x38, - 0x1c, 0x02, 0xf0, 0xc2, 0xfe, 0x19, 0xe0, 0xed, - 0x09, 0x00, 0x5b, 0x01, 0x38, 0x1c, 0x02, 0xf0, - 0xd8, 0xfd, 0x15, 0xe0, 0x38, 0x1c, 0x02, 0xf0, - 0xca, 0xfe, 0x11, 0xe0, 0x38, 0x1c, 0x02, 0xf0, - 0xf6, 0xfe, 0x0d, 0xe0, 0x38, 0x1c, 0x02, 0xf0, - 0xe2, 0xfe, 0x09, 0xe0, 0x38, 0x1c, 0x02, 0xf0, - 0x8c, 0xfe, 0x05, 0xe0, 0x38, 0x1c, 0x02, 0xf0, - 0x08, 0xff, 0x01, 0xe0, 0x01, 0xf0, 0x73, 0xff, - 0x00, 0x2f, 0x00, 0xd1, 0x12, 0xe7, 0x38, 0x1c, - 0xeb, 0xf7, 0xab, 0xf9, 0x0e, 0xe7, 0xe0, 0xbb, - 0x03, 0x20, 0x00, 0xb5, 0xeb, 0xf7, 0x6a, 0xf9, - 0x00, 0x28, 0x05, 0xd0, 0xb7, 0x21, 0x01, 0x60, - 0x01, 0x1c, 0x01, 0x20, 0xeb, 0xf7, 0xd1, 0xf9, - 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x87, 0xb0, - 0x1f, 0x4f, 0x01, 0x20, 0x39, 0x1c, 0x10, 0xf0, - 0x2c, 0xf9, 0x1d, 0x4c, 0x0b, 0x22, 0xe0, 0x60, - 0x01, 0x92, 0x1c, 0x49, 0x02, 0x1c, 0x00, 0x91, - 0x1d, 0xa1, 0x1b, 0x48, 0x3b, 0x1c, 0x10, 0xf0, - 0xfe, 0xff, 0x03, 0x21, 0x04, 0x20, 0x10, 0xf0, - 0x1c, 0xf9, 0x20, 0x61, 0x03, 0x1c, 0x07, 0x20, - 0x06, 0x22, 0x01, 0x21, 0x02, 0x92, 0x1a, 0x1c, - 0x01, 0x91, 0x00, 0x90, 0x17, 0x48, 0x17, 0xa1, - 0x03, 0x23, 0x11, 0xf0, 0x50, 0xf9, 0x07, 0x23, - 0x1b, 0x03, 0x0c, 0x22, 0x06, 0x92, 0x0a, 0x20, - 0x46, 0x22, 0x08, 0x21, 0x05, 0x91, 0x03, 0x21, - 0x89, 0x02, 0x03, 0x92, 0x00, 0x22, 0x00, 0x92, - 0x02, 0x91, 0x04, 0x90, 0x01, 0x93, 0x00, 0x23, - 0x10, 0x48, 0x10, 0xa1, 0x0e, 0x4a, 0xfc, 0xf7, - 0x4a, 0xfe, 0x07, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, 0x3f, 0x30, - 0x00, 0x00, 0x10, 0x68, 0x03, 0x20, 0x05, 0x10, - 0x00, 0x00, 0x18, 0xbc, 0x03, 0x20, 0x48, 0x43, - 0x49, 0x50, 0x55, 0x53, 0x42, 0x52, 0x78, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x5c, 0x01, 0x54, - 0xbc, 0x03, 0x20, 0x51, 0x5f, 0x48, 0x43, 0x49, - 0x50, 0x00, 0x00, 0x4d, 0x59, 0x01, 0x20, 0x9c, - 0xbc, 0x03, 0x20, 0x54, 0x5f, 0x48, 0x43, 0x49, - 0x50, 0x00, 0x00, 0x80, 0xb5, 0x83, 0xb0, 0x0a, - 0x4f, 0x00, 0x22, 0xd2, 0x43, 0x00, 0x92, 0x01, - 0x22, 0x38, 0x1c, 0x01, 0xa9, 0x02, 0xab, 0x11, - 0xf0, 0xa8, 0xfa, 0x00, 0x28, 0xf4, 0xd1, 0x01, - 0x98, 0x02, 0xf0, 0x15, 0xff, 0x00, 0x28, 0xef, - 0xd0, 0x01, 0x98, 0x11, 0xf0, 0xaa, 0xf8, 0xeb, - 0xe7, 0x00, 0x00, 0x54, 0xbc, 0x03, 0x20, 0xb0, - 0xb5, 0x0d, 0x48, 0xfc, 0xf7, 0xee, 0xfe, 0x0c, - 0x48, 0x11, 0xf0, 0x51, 0xf9, 0x0c, 0x4f, 0x38, - 0x69, 0x10, 0xf0, 0xcb, 0xf8, 0x00, 0x24, 0x3c, - 0x61, 0x0a, 0x48, 0x10, 0xf0, 0xe6, 0xff, 0x05, - 0x1c, 0xf8, 0x68, 0x10, 0xf0, 0xc2, 0xf8, 0x20, - 0x1c, 0x00, 0x2d, 0xfc, 0x60, 0x00, 0xd0, 0x07, - 0x20, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x9c, - 0xbc, 0x03, 0x20, 0x54, 0xbc, 0x03, 0x20, 0x10, - 0x68, 0x03, 0x20, 0x18, 0xbc, 0x03, 0x20, 0x00, - 0xb5, 0x0c, 0x22, 0x0d, 0xf0, 0x76, 0xfb, 0x08, - 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x0c, 0x1c, 0x05, - 0x1c, 0x17, 0x1c, 0xeb, 0xf7, 0xb9, 0xf8, 0x00, - 0x28, 0x0c, 0xd0, 0x07, 0x49, 0x4a, 0x68, 0x01, - 0x3a, 0x4a, 0x60, 0x8f, 0x21, 0x01, 0x60, 0xc5, - 0x60, 0x04, 0x74, 0x47, 0x61, 0x01, 0x1c, 0x02, - 0x20, 0xeb, 0xf7, 0x19, 0xf9, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, 0x00, - 0xb5, 0xeb, 0xf7, 0xa2, 0xf8, 0x00, 0x28, 0x09, - 0xd0, 0x06, 0x49, 0x4a, 0x68, 0x01, 0x3a, 0x4a, - 0x60, 0x90, 0x21, 0x01, 0x60, 0x01, 0x1c, 0x02, - 0x20, 0xeb, 0xf7, 0x05, 0xf9, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x60, 0xbb, 0xed, 0x09, 0x00, - 0x5d, 0x01, 0x03, 0x20, 0x00, 0xb5, 0x04, 0x48, - 0x01, 0x22, 0x04, 0x49, 0x40, 0x68, 0x03, 0xf0, - 0x18, 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x03, 0x04, 0x00, 0x00, - 0x00, 0xb5, 0x04, 0x48, 0x01, 0x22, 0x04, 0x49, - 0x40, 0x68, 0x03, 0xf0, 0x0a, 0xfb, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, - 0x04, 0x04, 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, - 0x0d, 0x1c, 0x08, 0x09, 0x09, 0x9e, 0x09, 0xd2, - 0x27, 0x48, 0x28, 0x4a, 0x41, 0x68, 0x11, 0x20, - 0x03, 0xf0, 0xbe, 0xf8, 0x04, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x20, 0x1c, 0x01, 0xf0, - 0xed, 0xfe, 0x00, 0x28, 0x06, 0xd0, 0x20, 0x48, - 0x20, 0x4a, 0x41, 0x68, 0x0b, 0x20, 0x03, 0xf0, - 0xaf, 0xf8, 0xef, 0xe7, 0xeb, 0xf7, 0x57, 0xf8, - 0x07, 0x1c, 0x06, 0xd1, 0x1a, 0x48, 0x1b, 0x4a, - 0x41, 0x68, 0x07, 0x20, 0x03, 0xf0, 0xa4, 0xf8, - 0xe4, 0xe7, 0x20, 0x1c, 0x18, 0xa1, 0x01, 0xf0, - 0xe5, 0xff, 0x00, 0x28, 0x09, 0xd1, 0x14, 0x48, - 0x14, 0x4a, 0x41, 0x68, 0x07, 0x20, 0x03, 0xf0, - 0x97, 0xf8, 0x38, 0x1c, 0xeb, 0xf7, 0x7a, 0xf8, - 0xd4, 0xe7, 0x01, 0x21, 0x0e, 0x4a, 0x41, 0x63, - 0x51, 0x68, 0x01, 0x39, 0x51, 0x60, 0xf8, 0x60, - 0xf8, 0x1d, 0x91, 0x21, 0x39, 0x60, 0x09, 0x30, - 0x06, 0x22, 0x21, 0x1c, 0xea, 0xf7, 0x96, 0xfc, - 0xbd, 0x61, 0x02, 0x9a, 0xfa, 0x61, 0x03, 0x9b, - 0x05, 0x4a, 0x3b, 0x62, 0x7e, 0x62, 0xd0, 0x69, - 0xb8, 0x62, 0x0a, 0x98, 0xf8, 0x62, 0x02, 0x20, - 0x39, 0x1c, 0xeb, 0xf7, 0x8f, 0xf8, 0xb5, 0xe7, - 0x60, 0xbb, 0x03, 0x20, 0x05, 0x04, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, 0x69, 0x66, - 0x2e, 0x63, 0x3a, 0x20, 0x34, 0x39, 0x35, 0x00, - 0xed, 0x09, 0x00, 0x5e, 0x01, 0xf8, 0xb5, 0x0d, - 0x1c, 0x69, 0x46, 0x01, 0xf0, 0x09, 0xff, 0x07, - 0x1c, 0x00, 0x28, 0x21, 0x4e, 0x05, 0xd1, 0x71, - 0x68, 0x20, 0x4a, 0x02, 0x20, 0x03, 0xf0, 0x5a, - 0xf8, 0x37, 0xe0, 0x78, 0x6b, 0x04, 0x28, 0x05, - 0xd1, 0x71, 0x68, 0x1c, 0x4a, 0x00, 0x20, 0x03, - 0xf0, 0x51, 0xf8, 0x2e, 0xe0, 0xb8, 0x68, 0x00, - 0x28, 0x05, 0xd1, 0x71, 0x68, 0x17, 0x4a, 0x02, - 0x20, 0x03, 0xf0, 0x48, 0xf8, 0x25, 0xe0, 0xea, - 0xf7, 0xf0, 0xff, 0x04, 0x1c, 0x05, 0xd1, 0x71, - 0x68, 0x12, 0x4a, 0x07, 0x20, 0x03, 0xf0, 0x3e, - 0xf8, 0x1b, 0xe0, 0x00, 0x99, 0x03, 0x20, 0x00, - 0x29, 0x03, 0xd0, 0xc9, 0x00, 0xc9, 0x19, 0x48, - 0x61, 0x00, 0xe0, 0x78, 0x63, 0x38, 0x1c, 0x02, - 0xf0, 0x11, 0xf8, 0x70, 0x68, 0x01, 0x38, 0x70, - 0x60, 0x94, 0x20, 0x20, 0x60, 0xb8, 0x68, 0xe0, - 0x60, 0x65, 0x61, 0x00, 0x98, 0x20, 0x61, 0x00, - 0x20, 0xa0, 0x61, 0x02, 0x20, 0x21, 0x1c, 0xeb, - 0xf7, 0x3b, 0xf8, 0xf8, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x60, 0xbb, 0x03, 0x20, 0x06, 0x04, 0x00, - 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x01, 0xf0, 0x4c, - 0xfe, 0x07, 0x1c, 0x00, 0x28, 0x1b, 0x4d, 0x09, - 0xd1, 0x02, 0x22, 0x85, 0x21, 0xc9, 0x00, 0x23, - 0x1c, 0x68, 0x68, 0x03, 0xf0, 0x44, 0xfa, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x78, 0x6b, 0x01, - 0x28, 0x07, 0xd0, 0x0b, 0x22, 0x85, 0x21, 0xc9, - 0x00, 0x23, 0x1c, 0x68, 0x68, 0x03, 0xf0, 0x37, - 0xfa, 0xf1, 0xe7, 0xea, 0xf7, 0xa6, 0xff, 0x00, - 0x28, 0x07, 0xd1, 0x07, 0x22, 0x85, 0x21, 0xc9, - 0x00, 0x23, 0x1c, 0x68, 0x68, 0x03, 0xf0, 0x2b, - 0xfa, 0xe5, 0xe7, 0x03, 0x21, 0x79, 0x63, 0x69, - 0x68, 0x01, 0x39, 0x69, 0x60, 0x94, 0x21, 0x01, - 0x60, 0xb9, 0x68, 0xed, 0x09, 0x00, 0x5f, 0x01, - 0xc1, 0x60, 0x02, 0x21, 0x41, 0x61, 0x00, 0x21, - 0x01, 0x61, 0x01, 0x21, 0x81, 0x61, 0x01, 0x1c, - 0x02, 0x20, 0xea, 0xf7, 0xf8, 0xff, 0xd1, 0xe7, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0xf0, 0xb5, - 0xc0, 0x23, 0x0c, 0x1c, 0x19, 0x40, 0x20, 0x4d, - 0x07, 0xd1, 0x69, 0x68, 0x20, 0x4a, 0x11, 0x20, - 0x02, 0xf0, 0xcf, 0xff, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0xf0, 0x1e, 0xfe, 0x07, 0x1c, - 0x05, 0xd1, 0x69, 0x68, 0x1a, 0x4a, 0x02, 0x20, - 0x02, 0xf0, 0xc3, 0xff, 0xf2, 0xe7, 0x01, 0x26, - 0x38, 0x6b, 0x36, 0x03, 0xb0, 0x42, 0x05, 0xd0, - 0x69, 0x68, 0x14, 0x4a, 0x0c, 0x20, 0x02, 0xf0, - 0xb8, 0xff, 0xe7, 0xe7, 0x01, 0xf0, 0xb7, 0xfe, - 0x38, 0x63, 0xb0, 0x42, 0x05, 0xd1, 0x69, 0x68, - 0x0f, 0x4a, 0x0d, 0x20, 0x02, 0xf0, 0xad, 0xff, - 0xdc, 0xe7, 0xea, 0xf7, 0x55, 0xff, 0x00, 0x28, - 0x05, 0xd1, 0x69, 0x68, 0x0a, 0x4a, 0x02, 0x20, - 0x02, 0xf0, 0xa3, 0xff, 0xd2, 0xe7, 0x69, 0x68, - 0x01, 0x39, 0x69, 0x60, 0x95, 0x21, 0x01, 0x60, - 0xb9, 0x68, 0xc1, 0x60, 0x04, 0x61, 0x01, 0x1c, - 0x02, 0x20, 0xea, 0xf7, 0xb0, 0xff, 0xc5, 0xe7, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x07, 0x04, - 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, - 0x01, 0xf0, 0xc1, 0xfd, 0x04, 0x1c, 0x19, 0xd1, - 0x33, 0x48, 0x40, 0x68, 0x01, 0x28, 0x03, 0xd0, - 0x32, 0x48, 0x00, 0x68, 0x00, 0x28, 0x08, 0xd0, - 0x31, 0x48, 0x31, 0x4a, 0x41, 0x68, 0x02, 0x20, - 0x02, 0xf0, 0x7b, 0xff, 0xf8, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x22, 0x00, 0x92, 0x2a, 0x1c, - 0x01, 0x23, 0x02, 0x20, 0x2c, 0x49, 0x02, 0xf0, - 0xec, 0xfd, 0xf3, 0xe7, 0x20, 0x6c, 0x00, 0x28, - 0x0e, 0xd0, 0x24, 0x48, 0x40, 0x68, 0xed, 0x09, - 0x00, 0x60, 0x01, 0x01, 0x28, 0x03, 0xd0, 0x23, - 0x48, 0x00, 0x68, 0x00, 0x28, 0xe8, 0xd0, 0x22, - 0x48, 0x23, 0x4a, 0x41, 0x68, 0x00, 0x20, 0x02, - 0xf0, 0x5e, 0xff, 0xe1, 0xe7, 0xea, 0xf7, 0x06, - 0xff, 0x07, 0x1c, 0x17, 0xd1, 0x1b, 0x48, 0x40, - 0x68, 0x01, 0x28, 0x03, 0xd0, 0x1a, 0x48, 0x00, - 0x68, 0x00, 0x28, 0x06, 0xd0, 0x19, 0x48, 0x19, - 0x4a, 0x41, 0x68, 0x07, 0x20, 0x02, 0xf0, 0x4b, - 0xff, 0xce, 0xe7, 0x00, 0x22, 0x00, 0x92, 0x2a, - 0x1c, 0x01, 0x23, 0x07, 0x20, 0x15, 0x49, 0x02, - 0xf0, 0xbe, 0xfd, 0xc5, 0xe7, 0x20, 0x1c, 0x01, - 0xf0, 0x1e, 0xff, 0x0d, 0x48, 0x40, 0x68, 0x01, - 0x28, 0x03, 0xd0, 0x0c, 0x48, 0x00, 0x68, 0x00, - 0x28, 0x03, 0xd0, 0x0b, 0x48, 0x41, 0x68, 0x01, - 0x39, 0x41, 0x60, 0x01, 0x20, 0xe0, 0x63, 0x92, - 0x20, 0x38, 0x60, 0xfc, 0x60, 0xa0, 0x68, 0x38, - 0x61, 0x00, 0x20, 0x78, 0x61, 0x02, 0x20, 0x39, - 0x1c, 0xbe, 0x61, 0xea, 0xf7, 0x3e, 0xff, 0xa7, - 0xe7, 0x00, 0x00, 0x10, 0x68, 0x03, 0x20, 0xc0, - 0x69, 0x03, 0x20, 0x60, 0xbb, 0x03, 0x20, 0x09, - 0x04, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xf8, - 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x01, 0xf0, 0x49, - 0xfd, 0x04, 0x1c, 0x19, 0xd1, 0x40, 0x48, 0x40, - 0x68, 0x01, 0x28, 0x03, 0xd0, 0x3f, 0x48, 0x00, - 0x68, 0x00, 0x28, 0x08, 0xd0, 0x3e, 0x48, 0x3e, - 0x4a, 0x41, 0x68, 0x02, 0x20, 0x02, 0xf0, 0x03, - 0xff, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x22, 0x00, 0x92, 0x2a, 0x1c, 0x01, 0x23, 0x02, - 0x20, 0x39, 0x49, 0x02, 0xf0, 0x74, 0xfd, 0xf3, - 0xe7, 0x00, 0x2e, 0x17, 0xd1, 0x32, 0x48, 0x40, - 0x68, 0x01, 0x28, 0x03, 0xd0, 0x31, 0x48, 0x00, - 0x68, 0x00, 0x28, 0x06, 0xd0, 0x30, 0x48, 0x30, - 0x4a, 0xed, 0x09, 0x00, 0x61, 0x01, 0x41, 0x68, - 0x11, 0x20, 0x02, 0xf0, 0xe7, 0xfe, 0xe2, 0xe7, - 0x00, 0x22, 0x00, 0x92, 0x2a, 0x1c, 0x01, 0x23, - 0x11, 0x20, 0x2c, 0x49, 0x02, 0xf0, 0x5a, 0xfd, - 0xd9, 0xe7, 0x20, 0x6c, 0x00, 0x28, 0x0e, 0xd0, - 0x24, 0x48, 0x40, 0x68, 0x01, 0x28, 0x03, 0xd0, - 0x23, 0x48, 0x00, 0x68, 0x00, 0x28, 0xce, 0xd0, - 0x22, 0x48, 0x23, 0x4a, 0x41, 0x68, 0x00, 0x20, - 0x02, 0xf0, 0xcc, 0xfe, 0xc7, 0xe7, 0xea, 0xf7, - 0x74, 0xfe, 0x07, 0x1c, 0x17, 0xd1, 0x1b, 0x48, - 0x40, 0x68, 0x01, 0x28, 0x03, 0xd0, 0x1a, 0x48, - 0x00, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x19, 0x48, - 0x19, 0x4a, 0x41, 0x68, 0x07, 0x20, 0x02, 0xf0, - 0xb9, 0xfe, 0xb4, 0xe7, 0x00, 0x22, 0x00, 0x92, - 0x2a, 0x1c, 0x01, 0x23, 0x07, 0x20, 0x15, 0x49, - 0x02, 0xf0, 0x2c, 0xfd, 0xab, 0xe7, 0x20, 0x1c, - 0x01, 0xf0, 0x8c, 0xfe, 0x0d, 0x48, 0x40, 0x68, - 0x01, 0x28, 0x03, 0xd0, 0x0c, 0x48, 0x00, 0x68, - 0x00, 0x28, 0x03, 0xd0, 0x0b, 0x48, 0x41, 0x68, - 0x01, 0x39, 0x41, 0x60, 0x00, 0x20, 0xe0, 0x63, - 0x92, 0x20, 0x38, 0x60, 0xfc, 0x60, 0xa0, 0x68, - 0x38, 0x61, 0x7e, 0x61, 0x01, 0x20, 0xb8, 0x61, - 0x02, 0x20, 0x39, 0x1c, 0xea, 0xf7, 0xac, 0xfe, - 0x8d, 0xe7, 0x00, 0x00, 0x10, 0x68, 0x03, 0x20, - 0xc0, 0x69, 0x03, 0x20, 0x60, 0xbb, 0x03, 0x20, - 0x0a, 0x04, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, - 0xf0, 0xb5, 0x04, 0x1c, 0x0e, 0x1c, 0x01, 0xf0, - 0xb7, 0xfc, 0x05, 0x1c, 0x09, 0xd1, 0x19, 0x48, - 0x02, 0x22, 0x23, 0x1c, 0x18, 0x49, 0x40, 0x68, - 0x03, 0xf0, 0xb1, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xea, 0xf7, 0x1e, 0xfe, 0x07, 0x1c, - 0x07, 0xd1, 0x12, 0x48, 0x07, 0x22, 0x23, 0x1c, - 0x11, 0x49, 0x40, 0x68, 0xed, 0x09, 0x00, 0x62, - 0x01, 0x03, 0xf0, 0xa3, 0xf8, 0xf0, 0xe7, 0x10, - 0x48, 0x40, 0x68, 0x01, 0x28, 0x03, 0xd0, 0x0f, - 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x0a, - 0x48, 0x41, 0x68, 0x01, 0x39, 0x41, 0x60, 0x9e, - 0x20, 0x38, 0x60, 0xa8, 0x68, 0x10, 0x22, 0xf8, - 0x60, 0x00, 0x20, 0x38, 0x61, 0xf8, 0x1d, 0x0d, - 0x30, 0x31, 0x1c, 0xea, 0xf7, 0x63, 0xfa, 0x02, - 0x20, 0x39, 0x1c, 0xea, 0xf7, 0x67, 0xfe, 0xd3, - 0xe7, 0x60, 0xbb, 0x03, 0x20, 0x0b, 0x04, 0x00, - 0x00, 0x10, 0x68, 0x03, 0x20, 0xc0, 0x69, 0x03, - 0x20, 0xb0, 0xb5, 0x07, 0x1c, 0x01, 0xf0, 0x76, - 0xfc, 0x04, 0x1c, 0x00, 0x28, 0x15, 0x4d, 0x08, - 0xd1, 0x02, 0x22, 0x3b, 0x1c, 0x68, 0x68, 0x14, - 0x49, 0x03, 0xf0, 0x6f, 0xf8, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xea, 0xf7, 0xdc, 0xfd, 0x00, - 0x28, 0x06, 0xd1, 0x07, 0x22, 0x3b, 0x1c, 0x68, - 0x68, 0x0d, 0x49, 0x03, 0xf0, 0x62, 0xf8, 0xf1, - 0xe7, 0x0c, 0x49, 0x49, 0x68, 0x01, 0x29, 0x03, - 0xd0, 0x0b, 0x49, 0x09, 0x68, 0x00, 0x29, 0x02, - 0xd0, 0x69, 0x68, 0x01, 0x39, 0x69, 0x60, 0x9e, - 0x21, 0x01, 0x60, 0xa1, 0x68, 0xc1, 0x60, 0x1f, - 0x21, 0x01, 0x61, 0x01, 0x1c, 0x02, 0x20, 0xea, - 0xf7, 0x2d, 0xfe, 0xdb, 0xe7, 0x60, 0xbb, 0x03, - 0x20, 0x0c, 0x04, 0x00, 0x00, 0x10, 0x68, 0x03, - 0x20, 0xc0, 0x69, 0x03, 0x20, 0xf7, 0xb5, 0x04, - 0x1c, 0x0e, 0x1c, 0x01, 0xf0, 0x3b, 0xfc, 0x05, - 0x1c, 0x0a, 0xd1, 0x1a, 0x48, 0x02, 0x22, 0x23, - 0x1c, 0x19, 0x49, 0x40, 0x68, 0x03, 0xf0, 0x35, - 0xf8, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xea, 0xf7, 0xa1, 0xfd, 0x07, 0x1c, 0x07, - 0xd1, 0x12, 0x48, 0x07, 0x22, 0x23, 0x1c, 0x12, - 0x49, 0x40, 0x68, 0x03, 0xf0, 0x26, 0xf8, 0xed, - 0x09, 0x00, 0x63, 0x01, 0xef, 0xe7, 0x10, 0x48, - 0x40, 0x68, 0x01, 0x28, 0x03, 0xd0, 0x0f, 0x48, - 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x48, - 0x41, 0x68, 0x01, 0x39, 0x41, 0x60, 0x9f, 0x20, - 0x38, 0x60, 0xa8, 0x68, 0xf8, 0x60, 0x00, 0x20, - 0x38, 0x61, 0xf8, 0x1d, 0x11, 0x30, 0x7e, 0x61, - 0x02, 0x99, 0x32, 0x1c, 0xea, 0xf7, 0xe5, 0xf9, - 0x02, 0x20, 0x39, 0x1c, 0xea, 0xf7, 0xe9, 0xfd, - 0xd1, 0xe7, 0x60, 0xbb, 0x03, 0x20, 0x0d, 0x04, - 0x00, 0x00, 0x10, 0x68, 0x03, 0x20, 0xc0, 0x69, - 0x03, 0x20, 0xb0, 0xb5, 0x07, 0x1c, 0x01, 0xf0, - 0xf8, 0xfb, 0x04, 0x1c, 0x00, 0x28, 0x15, 0x4d, - 0x08, 0xd1, 0x02, 0x22, 0x3b, 0x1c, 0x68, 0x68, - 0x14, 0x49, 0x02, 0xf0, 0xf1, 0xff, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xea, 0xf7, 0x5e, 0xfd, - 0x00, 0x28, 0x06, 0xd1, 0x07, 0x22, 0x3b, 0x1c, - 0x68, 0x68, 0x0d, 0x49, 0x02, 0xf0, 0xe4, 0xff, - 0xf1, 0xe7, 0x0c, 0x49, 0x49, 0x68, 0x01, 0x29, - 0x03, 0xd0, 0x0b, 0x49, 0x09, 0x68, 0x00, 0x29, - 0x02, 0xd0, 0x69, 0x68, 0x01, 0x39, 0x69, 0x60, - 0x9f, 0x21, 0x01, 0x60, 0xa1, 0x68, 0xc1, 0x60, - 0x18, 0x21, 0x01, 0x61, 0x01, 0x1c, 0x02, 0x20, - 0xea, 0xf7, 0xaf, 0xfd, 0xdb, 0xe7, 0x60, 0xbb, - 0x03, 0x20, 0x0e, 0x04, 0x00, 0x00, 0x10, 0x68, - 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, 0xf0, 0xb5, - 0x2b, 0x4d, 0x07, 0x1c, 0x0d, 0x40, 0x2a, 0x4e, - 0x15, 0xd1, 0x2a, 0x48, 0x40, 0x68, 0x01, 0x28, - 0x03, 0xd0, 0x29, 0x48, 0x00, 0x68, 0x00, 0x28, - 0x07, 0xd0, 0x71, 0x68, 0x28, 0x4a, 0x11, 0x20, - 0x02, 0xf0, 0x79, 0xfd, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x11, 0x20, 0x39, 0x1c, 0x2a, 0x1c, - 0x02, 0xf0, 0x09, 0xff, 0xf6, 0xe7, 0x38, 0x1c, - 0x01, 0xf0, 0xed, 0x09, 0x00, 0x64, 0x01, 0xc1, - 0xfb, 0x04, 0x1c, 0x13, 0xd1, 0x1d, 0x48, 0x40, - 0x68, 0x01, 0x28, 0x03, 0xd0, 0x1c, 0x48, 0x00, - 0x68, 0x00, 0x28, 0x05, 0xd0, 0x71, 0x68, 0x1a, - 0x4a, 0x02, 0x20, 0x02, 0xf0, 0x5e, 0xfd, 0xe3, - 0xe7, 0x02, 0x20, 0x39, 0x1c, 0x2a, 0x1c, 0x02, - 0xf0, 0xf0, 0xfe, 0xdd, 0xe7, 0xea, 0xf7, 0x00, - 0xfd, 0x00, 0x28, 0x13, 0xd1, 0x11, 0x48, 0x40, - 0x68, 0x01, 0x28, 0x03, 0xd0, 0x10, 0x48, 0x00, - 0x68, 0x00, 0x28, 0x05, 0xd0, 0x71, 0x68, 0x0e, - 0x4a, 0x07, 0x20, 0x02, 0xf0, 0x46, 0xfd, 0xcb, - 0xe7, 0x07, 0x20, 0x39, 0x1c, 0x2a, 0x1c, 0x02, - 0xf0, 0xd8, 0xfe, 0xc5, 0xe7, 0xac, 0x21, 0x01, - 0x60, 0xa1, 0x68, 0xc1, 0x60, 0x05, 0x61, 0x01, - 0x1c, 0x02, 0x20, 0xea, 0xf7, 0x50, 0xfd, 0xbb, - 0xe7, 0x00, 0x00, 0x18, 0xcc, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0x10, 0x68, 0x03, 0x20, 0xc0, - 0x69, 0x03, 0x20, 0x0f, 0x04, 0x00, 0x00, 0xf0, - 0xb5, 0x07, 0x1c, 0x01, 0xf0, 0x7a, 0xfb, 0x04, - 0x1c, 0x00, 0x28, 0x1f, 0x4e, 0x20, 0x4d, 0x13, - 0xd1, 0x20, 0x49, 0x48, 0x68, 0x01, 0x28, 0x02, - 0xd0, 0x28, 0x68, 0x00, 0x28, 0x07, 0xd0, 0x71, - 0x68, 0x1d, 0x4a, 0x02, 0x20, 0x02, 0xf0, 0x15, - 0xfd, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x02, - 0x20, 0x39, 0x1c, 0x02, 0xf0, 0xf2, 0xfb, 0xf7, - 0xe7, 0xea, 0xf7, 0xb6, 0xfc, 0x00, 0x28, 0x11, - 0xd1, 0x14, 0x49, 0x48, 0x68, 0x01, 0x28, 0x02, - 0xd0, 0x28, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x71, - 0x68, 0x11, 0x4a, 0x07, 0x20, 0x02, 0xf0, 0xfd, - 0xfc, 0xe6, 0xe7, 0x07, 0x20, 0x39, 0x1c, 0x02, - 0xf0, 0xdc, 0xfb, 0xe1, 0xe7, 0x0b, 0x49, 0x49, - 0x68, 0x01, 0x29, 0x02, 0xd0, 0x29, 0x68, 0x00, - 0x29, 0x02, 0xd0, 0x71, 0x68, 0xed, 0x09, 0x00, - 0x65, 0x01, 0x01, 0x39, 0x71, 0x60, 0xb2, 0x21, - 0x01, 0x60, 0xa1, 0x68, 0xc1, 0x60, 0x01, 0x1c, - 0x02, 0x20, 0xea, 0xf7, 0xff, 0xfc, 0xce, 0xe7, - 0x60, 0xbb, 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, - 0x10, 0x68, 0x03, 0x20, 0x11, 0x04, 0x00, 0x00, - 0xf0, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, 0x01, 0xf0, - 0x2b, 0xfb, 0x05, 0x1c, 0x00, 0x2f, 0x01, 0xd0, - 0x00, 0x26, 0x00, 0xe0, 0x01, 0x26, 0x00, 0x28, - 0x16, 0xd1, 0x23, 0x49, 0x48, 0x68, 0x01, 0x28, - 0x03, 0xd0, 0x22, 0x49, 0x08, 0x68, 0x00, 0x28, - 0x08, 0xd0, 0x21, 0x49, 0x21, 0x4a, 0x02, 0x20, - 0x49, 0x68, 0x02, 0xf0, 0xc1, 0xfc, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x02, 0x20, 0x21, 0x1c, - 0x32, 0x1c, 0x02, 0xf0, 0xde, 0xfb, 0xf6, 0xe7, - 0xea, 0xf7, 0x61, 0xfc, 0x00, 0x28, 0x14, 0xd1, - 0x15, 0x49, 0x48, 0x68, 0x01, 0x28, 0x03, 0xd0, - 0x14, 0x49, 0x08, 0x68, 0x00, 0x28, 0x06, 0xd0, - 0x13, 0x49, 0x14, 0x4a, 0x07, 0x20, 0x49, 0x68, - 0x02, 0xf0, 0xa6, 0xfc, 0xe3, 0xe7, 0x07, 0x20, - 0x21, 0x1c, 0x32, 0x1c, 0x02, 0xf0, 0xc5, 0xfb, - 0xdd, 0xe7, 0x0b, 0x49, 0x49, 0x68, 0x01, 0x29, - 0x03, 0xd0, 0x0a, 0x49, 0x09, 0x68, 0x00, 0x29, - 0x03, 0xd0, 0x09, 0x49, 0x4a, 0x68, 0x01, 0x3a, - 0x4a, 0x60, 0xaf, 0x21, 0x01, 0x60, 0xa9, 0x68, - 0xc1, 0x60, 0x07, 0x61, 0x01, 0x1c, 0x02, 0x20, - 0xea, 0xf7, 0xa4, 0xfc, 0xc7, 0xe7, 0x00, 0x00, - 0x10, 0x68, 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, - 0x60, 0xbb, 0x03, 0x20, 0x13, 0x04, 0x00, 0x00, - 0x90, 0xb5, 0x01, 0xf0, 0xd1, 0xfa, 0x07, 0x1c, - 0x00, 0x28, 0x10, 0x4c, 0x07, 0xd1, 0x61, 0x68, - 0x0f, 0x4a, 0x02, 0x20, 0x02, 0xf0, 0x74, 0xfc, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xea, 0xf7, - 0xed, 0x09, 0x00, 0x66, 0x01, 0x1a, 0xfc, 0x00, - 0x28, 0x05, 0xd1, 0x61, 0x68, 0x09, 0x4a, 0x07, - 0x20, 0x02, 0xf0, 0x68, 0xfc, 0xf2, 0xe7, 0x61, - 0x68, 0x01, 0x39, 0x61, 0x60, 0xb1, 0x21, 0x01, - 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x01, 0x1c, 0x02, - 0x20, 0xea, 0xf7, 0x76, 0xfc, 0xe6, 0xe7, 0x00, - 0x00, 0x60, 0xbb, 0x03, 0x20, 0x15, 0x04, 0x00, - 0x00, 0x00, 0xb5, 0x04, 0x48, 0x04, 0x4a, 0x41, - 0x68, 0x01, 0x20, 0x02, 0xf0, 0x4f, 0xfc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x17, 0x04, 0x00, 0x00, 0xff, 0xb5, 0x14, - 0x1c, 0x0d, 0x1c, 0x06, 0x1c, 0xea, 0xf7, 0xed, - 0xfb, 0x07, 0x1c, 0x00, 0x28, 0x11, 0x49, 0x08, - 0xd1, 0x49, 0x68, 0x11, 0x4a, 0x07, 0x20, 0x02, - 0xf0, 0x39, 0xfc, 0x04, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x0c, 0x49, 0x06, 0x22, 0x48, - 0x68, 0x01, 0x38, 0x48, 0x60, 0xa6, 0x20, 0x38, - 0x60, 0xf8, 0x1d, 0x05, 0x30, 0x31, 0x1c, 0xea, - 0xf7, 0x3b, 0xf8, 0xbc, 0x61, 0x7d, 0x61, 0x03, - 0x9b, 0x04, 0x49, 0xfb, 0x61, 0xc8, 0x69, 0x38, - 0x62, 0x02, 0x20, 0x39, 0x1c, 0xea, 0xf7, 0x38, - 0xfc, 0xe3, 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x19, 0x04, 0x00, 0x00, 0x90, 0xb5, 0x01, - 0xf0, 0x69, 0xfa, 0x07, 0x1c, 0x00, 0x28, 0x10, - 0x4c, 0x07, 0xd1, 0x61, 0x68, 0x0f, 0x4a, 0x02, - 0x20, 0x02, 0xf0, 0x0c, 0xfc, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xea, 0xf7, 0xb2, 0xfb, 0x00, - 0x28, 0x05, 0xd1, 0x61, 0x68, 0x09, 0x4a, 0x07, - 0x20, 0x02, 0xf0, 0x00, 0xfc, 0xf2, 0xe7, 0x61, - 0x68, 0x01, 0x39, 0x61, 0x60, 0xa5, 0x21, 0x01, - 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x01, 0x1c, 0x02, - 0x20, 0xea, 0xf7, 0x0e, 0xfc, 0xe6, 0xe7, 0x00, - 0x00, 0x60, 0xbb, 0xed, 0x09, 0x00, 0x67, 0x01, - 0x03, 0x20, 0x1b, 0x04, 0x00, 0x00, 0x90, 0xb5, - 0x01, 0xf0, 0x3f, 0xfa, 0x07, 0x1c, 0x00, 0x28, - 0x10, 0x4c, 0x07, 0xd1, 0x61, 0x68, 0x0f, 0x4a, - 0x02, 0x20, 0x02, 0xf0, 0xe2, 0xfb, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xea, 0xf7, 0x88, 0xfb, - 0x00, 0x28, 0x05, 0xd1, 0x61, 0x68, 0x09, 0x4a, - 0x07, 0x20, 0x02, 0xf0, 0xd6, 0xfb, 0xf2, 0xe7, - 0x61, 0x68, 0x01, 0x39, 0x61, 0x60, 0xa4, 0x21, - 0x01, 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x01, 0x1c, - 0x02, 0x20, 0xea, 0xf7, 0xe4, 0xfb, 0xe6, 0xe7, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x1d, 0x04, - 0x00, 0x00, 0x90, 0xb5, 0x01, 0xf0, 0x15, 0xfa, - 0x07, 0x1c, 0x00, 0x28, 0x10, 0x4c, 0x07, 0xd1, - 0x61, 0x68, 0x0f, 0x4a, 0x02, 0x20, 0x02, 0xf0, - 0xb8, 0xfb, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xea, 0xf7, 0x5e, 0xfb, 0x00, 0x28, 0x05, 0xd1, - 0x61, 0x68, 0x09, 0x4a, 0x07, 0x20, 0x02, 0xf0, - 0xac, 0xfb, 0xf2, 0xe7, 0x61, 0x68, 0x01, 0x39, - 0x61, 0x60, 0xaa, 0x21, 0x01, 0x60, 0xb9, 0x68, - 0xc1, 0x60, 0x01, 0x1c, 0x02, 0x20, 0xea, 0xf7, - 0xba, 0xfb, 0xe6, 0xe7, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x1f, 0x04, 0x00, 0x00, 0x00, 0xb5, - 0x04, 0x48, 0x04, 0x4a, 0x41, 0x68, 0x01, 0x20, - 0x02, 0xf0, 0x93, 0xfb, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x01, 0x08, - 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, 0x04, 0x4a, - 0x41, 0x68, 0x01, 0x20, 0x02, 0xf0, 0x85, 0xfb, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x03, 0x08, 0x00, 0x00, 0x00, 0xb5, - 0x04, 0x48, 0x04, 0x4a, 0x41, 0x68, 0x01, 0x20, - 0x02, 0xf0, 0x77, 0xfb, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0xed, 0x09, - 0x00, 0x68, 0x01, 0x04, 0x08, 0x00, 0x00, 0x00, - 0xb5, 0x04, 0x48, 0x04, 0x4a, 0x41, 0x68, 0x01, - 0x20, 0x02, 0xf0, 0x69, 0xfb, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x05, - 0x08, 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, 0x04, - 0x4a, 0x41, 0x68, 0x01, 0x20, 0x02, 0xf0, 0x5b, - 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0x06, 0x08, 0x00, 0x00, 0xff, - 0xb5, 0x0b, 0x9c, 0x0a, 0x9d, 0x09, 0x9e, 0x01, - 0xf0, 0xa2, 0xf9, 0x07, 0x1c, 0x09, 0xd1, 0x14, - 0x49, 0x15, 0x4a, 0x02, 0x20, 0x49, 0x68, 0x02, - 0xf0, 0x46, 0xfb, 0x04, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xea, 0xf7, 0xeb, 0xfa, 0x00, - 0x28, 0x06, 0xd1, 0x0d, 0x49, 0x0e, 0x4a, 0x07, - 0x20, 0x49, 0x68, 0x02, 0xf0, 0x38, 0xfb, 0xf0, - 0xe7, 0x0a, 0x49, 0x4a, 0x68, 0x01, 0x3a, 0x4a, - 0x60, 0xa9, 0x21, 0x01, 0x60, 0xb9, 0x68, 0xc1, - 0x60, 0x02, 0x9a, 0x01, 0x1c, 0x02, 0x61, 0x03, - 0x9b, 0x43, 0x61, 0x86, 0x61, 0x04, 0x62, 0xc5, - 0x61, 0x02, 0x20, 0xea, 0xf7, 0x3e, 0xfb, 0xdc, - 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x07, - 0x08, 0x00, 0x00, 0xb8, 0xb5, 0x04, 0x1c, 0x01, - 0xf0, 0x6e, 0xf9, 0x07, 0x1c, 0x00, 0x28, 0x0f, - 0x4d, 0x04, 0xd0, 0xb8, 0x68, 0x12, 0xf0, 0x7b, - 0xfb, 0x00, 0x28, 0x0a, 0xd1, 0x00, 0x22, 0x00, - 0x92, 0x02, 0x22, 0x23, 0x1c, 0x68, 0x68, 0x0a, - 0x49, 0x02, 0xf0, 0x42, 0xfd, 0xb8, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xb8, 0x68, 0x01, 0x22, 0x00, - 0x69, 0x01, 0x28, 0x00, 0xd1, 0x00, 0x22, 0x00, - 0x92, 0x00, 0x22, 0x23, 0x1c, 0x68, 0x68, 0x02, - 0x49, 0x02, 0xf0, 0x32, 0xfd, 0xee, 0xe7, 0x60, - 0xbb, 0x03, 0x20, 0x09, 0x08, 0x00, 0x00, 0xb0, - 0xb5, 0xed, 0x09, 0x00, 0x69, 0x01, 0x0f, 0x1c, - 0x00, 0x29, 0x16, 0x4d, 0x09, 0xd0, 0x01, 0x2f, - 0x07, 0xd0, 0x69, 0x68, 0x14, 0x4a, 0x11, 0x20, - 0x02, 0xf0, 0xe8, 0xfa, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0xf0, 0x19, 0xf9, 0x04, 0x1c, - 0x05, 0xd1, 0x69, 0x68, 0x0e, 0x4a, 0x02, 0x20, - 0x02, 0xf0, 0xdc, 0xfa, 0xf2, 0xe7, 0xea, 0xf7, - 0x84, 0xfa, 0x00, 0x28, 0x05, 0xd1, 0x69, 0x68, - 0x09, 0x4a, 0x07, 0x20, 0x02, 0xf0, 0xd2, 0xfa, - 0xe8, 0xe7, 0x69, 0x68, 0x01, 0x39, 0x69, 0x60, - 0xb4, 0x21, 0x01, 0x60, 0xa1, 0x68, 0xc1, 0x60, - 0x07, 0x61, 0x01, 0x1c, 0x02, 0x20, 0xea, 0xf7, - 0xdf, 0xfa, 0xdb, 0xe7, 0x60, 0xbb, 0x03, 0x20, - 0x0b, 0x08, 0x00, 0x00, 0x88, 0xb5, 0x07, 0x1c, - 0x01, 0xf0, 0x10, 0xf9, 0x0b, 0x49, 0x00, 0x28, - 0x0a, 0xd1, 0x00, 0x22, 0x00, 0x92, 0x48, 0x68, - 0x02, 0x22, 0x3b, 0x1c, 0x08, 0x49, 0x02, 0xf0, - 0xea, 0xfc, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x42, 0x6c, 0x00, 0x92, 0x48, 0x68, 0x00, 0x22, - 0x3b, 0x1c, 0x03, 0x49, 0x02, 0xf0, 0xdf, 0xfc, - 0xf3, 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, - 0x0c, 0x08, 0x00, 0x00, 0xf0, 0xb5, 0x07, 0x1c, - 0x48, 0x08, 0x40, 0x00, 0x0d, 0x1c, 0x00, 0x28, - 0x19, 0x4e, 0x08, 0xd0, 0x11, 0x22, 0x3b, 0x1c, - 0x70, 0x68, 0x18, 0x49, 0x02, 0xf0, 0xcb, 0xfc, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, - 0x01, 0xf0, 0xe0, 0xf8, 0x04, 0x1c, 0x06, 0xd1, - 0x02, 0x22, 0x3b, 0x1c, 0x70, 0x68, 0x11, 0x49, - 0x02, 0xf0, 0xbd, 0xfc, 0xf0, 0xe7, 0xea, 0xf7, - 0x2c, 0xfa, 0x00, 0x28, 0x06, 0xd1, 0x07, 0x22, - 0x3b, 0x1c, 0x70, 0x68, 0x0b, 0x49, 0x02, 0xf0, - 0xb2, 0xfc, 0xe5, 0xe7, 0xb3, 0x21, 0x65, 0x64, - 0x01, 0x60, 0xa1, 0x68, 0xed, 0x09, 0x00, 0x6a, - 0x01, 0xc1, 0x60, 0x05, 0x61, 0x01, 0x1c, 0x02, - 0x20, 0xea, 0xf7, 0x88, 0xfa, 0x00, 0x22, 0x3b, - 0x1c, 0x70, 0x68, 0x03, 0x49, 0x02, 0xf0, 0xa1, - 0xfc, 0xd4, 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x0d, 0x08, 0x00, 0x00, 0x00, 0xb5, 0x82, - 0xb0, 0x01, 0x1c, 0x68, 0x46, 0x08, 0x22, 0xe9, - 0xf7, 0x6d, 0xfe, 0x01, 0x99, 0x00, 0x98, 0x05, - 0x49, 0x00, 0x23, 0x48, 0x65, 0x48, 0x68, 0x04, - 0x49, 0x00, 0x22, 0x02, 0xf0, 0x8a, 0xfc, 0x02, - 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, - 0x20, 0x01, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0xea, - 0xf7, 0xf2, 0xf9, 0x0b, 0x49, 0x00, 0x28, 0x06, - 0xd1, 0x48, 0x68, 0x0a, 0x49, 0x07, 0x22, 0x02, - 0xf0, 0x78, 0xfc, 0x08, 0xbc, 0x18, 0x47, 0x4a, - 0x68, 0x01, 0x3a, 0x4a, 0x60, 0x80, 0x31, 0x01, - 0x22, 0x0a, 0x62, 0xad, 0x21, 0x01, 0x60, 0x01, - 0x1c, 0x02, 0x20, 0xea, 0xf7, 0x4b, 0xfa, 0xf0, - 0xe7, 0x60, 0xbb, 0x03, 0x20, 0x03, 0x0c, 0x00, - 0x00, 0xf0, 0xb5, 0x00, 0x27, 0x00, 0x24, 0x06, - 0x1c, 0x1a, 0x48, 0x07, 0x9b, 0x06, 0x9d, 0x0b, - 0xd0, 0x01, 0x2e, 0x0d, 0xd0, 0x02, 0x2e, 0x23, - 0xd1, 0x00, 0x2a, 0x14, 0xd0, 0x01, 0x2a, 0x01, - 0xd0, 0x02, 0x2a, 0x1b, 0xd1, 0x11, 0x27, 0x1c, - 0xe0, 0x13, 0x49, 0x44, 0x62, 0xc1, 0x62, 0x18, - 0xe0, 0x02, 0x29, 0x06, 0xd1, 0xc1, 0x62, 0x06, - 0x22, 0x29, 0x1c, 0x10, 0x48, 0xe9, 0xf7, 0x1e, - 0xfe, 0x0f, 0xe0, 0x11, 0x27, 0x0d, 0xe0, 0x01, - 0x2b, 0x01, 0xd1, 0x44, 0x62, 0x09, 0xe0, 0x02, - 0x2b, 0x02, 0xd1, 0x01, 0x21, 0x41, 0x62, 0x04, - 0xe0, 0x11, 0x27, 0x02, 0xe0, 0x11, 0x27, 0x00, - 0xe0, 0x11, 0x27, 0x07, 0x48, 0x3a, 0x1c, 0x07, - 0x49, 0x40, 0x68, 0x02, 0xf0, 0x2e, 0xfc, 0xed, - 0x09, 0x00, 0x6b, 0x01, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xe0, 0xbb, 0x03, 0x20, 0xff, 0xff, - 0x00, 0x00, 0x10, 0xbc, 0x03, 0x20, 0x60, 0xbb, - 0x03, 0x20, 0x05, 0x0c, 0x00, 0x00, 0x00, 0xb5, - 0x03, 0x1c, 0x03, 0x48, 0x01, 0x22, 0x03, 0x49, - 0x40, 0x68, 0x02, 0xf0, 0x19, 0xfc, 0x08, 0xbc, - 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, 0x08, 0x0c, - 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, 0x00, 0x22, - 0xc3, 0x6c, 0x40, 0x68, 0x03, 0x49, 0x02, 0xf0, - 0x0b, 0xfc, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x09, 0x0c, 0x00, 0x00, 0xb0, 0xb5, - 0x04, 0x1c, 0xea, 0xf7, 0x73, 0xf9, 0x07, 0x1c, - 0x00, 0x28, 0x0c, 0x4d, 0x07, 0xd1, 0x07, 0x22, - 0x68, 0x68, 0x0b, 0x49, 0x02, 0xf0, 0xf8, 0xfb, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x22, - 0x68, 0x68, 0x07, 0x49, 0x02, 0xf0, 0xf0, 0xfb, - 0xa0, 0x20, 0xec, 0x64, 0x38, 0x60, 0xe8, 0x6c, - 0xf8, 0x60, 0x02, 0x20, 0x39, 0x1c, 0xea, 0xf7, - 0xc8, 0xf9, 0xed, 0xe7, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x0a, 0x0c, 0x00, 0x00, 0x00, 0xb5, - 0x04, 0x48, 0x01, 0x22, 0x04, 0x49, 0x40, 0x68, - 0x02, 0xf0, 0xda, 0xfb, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x0b, 0x0c, - 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x05, 0x1c, - 0xea, 0xf7, 0x40, 0xf9, 0x07, 0x1c, 0x00, 0x28, - 0x0e, 0x49, 0x08, 0xd1, 0x00, 0x23, 0x48, 0x68, - 0x0d, 0x49, 0x07, 0x22, 0x02, 0xf0, 0xc4, 0xfb, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x08, 0x1c, - 0x49, 0x68, 0x06, 0x22, 0x01, 0x39, 0x41, 0x60, - 0xa1, 0x20, 0x38, 0x60, 0xf8, 0x1d, 0x05, 0x30, - 0x29, 0x1c, 0xe9, 0xf7, 0x8e, 0xfd, 0x02, 0x20, - 0x39, 0x1c, 0x7c, 0x61, 0xea, 0xf7, 0x91, 0xf9, - 0xea, 0xe7, 0xed, 0x09, 0x00, 0x6c, 0x01, 0x60, - 0xbb, 0x03, 0x20, 0x0d, 0x0c, 0x00, 0x00, 0xf7, - 0xb5, 0x81, 0xb0, 0x07, 0x1c, 0x0b, 0x28, 0x00, - 0xd9, 0x0b, 0x27, 0x00, 0x2f, 0x07, 0xd1, 0x2d, - 0x48, 0x00, 0x23, 0x11, 0x22, 0x2d, 0x49, 0x40, - 0x68, 0x02, 0xf0, 0x9c, 0xfb, 0x4e, 0xe0, 0xf8, - 0x00, 0x2b, 0xa1, 0x11, 0xf0, 0x90, 0xfb, 0x04, - 0x1c, 0x07, 0xd1, 0x26, 0x48, 0x00, 0x23, 0x07, - 0x22, 0x26, 0x49, 0x40, 0x68, 0x02, 0xf0, 0x8e, - 0xfb, 0x40, 0xe0, 0x38, 0x01, 0x00, 0x90, 0x28, - 0xa1, 0x11, 0xf0, 0x81, 0xfb, 0x06, 0x1c, 0x04, - 0xd1, 0x20, 0x1c, 0x2a, 0xa1, 0x11, 0xf0, 0x81, - 0xfb, 0x34, 0xe0, 0xea, 0xf7, 0xf1, 0xf8, 0x05, - 0x1c, 0x0f, 0xd1, 0x1a, 0x48, 0x00, 0x23, 0x07, - 0x22, 0x1a, 0x49, 0x40, 0x68, 0x02, 0xf0, 0x76, - 0xfb, 0x30, 0x1c, 0x27, 0xa1, 0x11, 0xf0, 0x71, - 0xfb, 0x20, 0x1c, 0x2a, 0xa1, 0x11, 0xf0, 0x6d, - 0xfb, 0x20, 0xe0, 0x12, 0x48, 0x41, 0x68, 0x01, - 0x39, 0x41, 0x60, 0xa2, 0x20, 0x28, 0x60, 0x2c, - 0x61, 0x6e, 0x61, 0x00, 0x26, 0x00, 0x2f, 0xef, - 0x60, 0x0b, 0xd9, 0x06, 0x22, 0x20, 0x1c, 0x02, - 0x99, 0xe9, 0xf7, 0x35, 0xfd, 0x02, 0x99, 0x08, - 0x34, 0x06, 0x31, 0x01, 0x36, 0xbe, 0x42, 0x02, - 0x91, 0xf3, 0xd3, 0x00, 0x9a, 0x68, 0x69, 0x03, - 0x99, 0xe9, 0xf7, 0x29, 0xfd, 0x02, 0x20, 0x29, - 0x1c, 0xea, 0xf7, 0x2d, 0xf9, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0x11, 0x0c, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x68, 0x63, 0x69, 0x66, 0x2e, - 0x63, 0x3a, 0x20, 0x31, 0x37, 0x34, 0x37, 0x00, - 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x68, - 0x63, 0x69, 0x66, 0x2e, 0x63, 0x3a, 0x20, 0x31, - 0x37, 0x35, 0x32, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x6d, 0x01, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, - 0x68, 0x63, 0x69, 0x66, 0x2e, 0x63, 0x3a, 0x20, - 0x31, 0x37, 0x35, 0x34, 0x00, 0x00, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, 0x69, 0x66, - 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x37, 0x35, 0x39, - 0x00, 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, - 0x68, 0x63, 0x69, 0x66, 0x2e, 0x63, 0x3a, 0x20, - 0x31, 0x37, 0x36, 0x30, 0x00, 0x00, 0x00, 0x00, - 0xb0, 0xb5, 0x0c, 0x1c, 0x05, 0x1c, 0xea, 0xf7, - 0x7e, 0xf8, 0x07, 0x1c, 0x00, 0x28, 0x0e, 0x49, - 0x08, 0xd1, 0x00, 0x23, 0x48, 0x68, 0x0d, 0x49, - 0x07, 0x22, 0x02, 0xf0, 0x02, 0xfb, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x08, 0x1c, 0x49, 0x68, - 0x06, 0x22, 0x01, 0x39, 0x41, 0x60, 0xa3, 0x20, - 0x38, 0x60, 0xf8, 0x1d, 0x05, 0x30, 0x29, 0x1c, - 0xe9, 0xf7, 0xcc, 0xfc, 0x02, 0x20, 0x39, 0x1c, - 0x7c, 0x61, 0xea, 0xf7, 0xcf, 0xf8, 0xea, 0xe7, - 0x60, 0xbb, 0x03, 0x20, 0x12, 0x0c, 0x00, 0x00, - 0x00, 0xb5, 0x12, 0xf0, 0x0b, 0xf9, 0x04, 0x48, - 0x00, 0x22, 0x04, 0x49, 0x40, 0x68, 0x02, 0xf0, - 0xe0, 0xfa, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x13, 0x0c, 0x00, 0x00, - 0x00, 0xb5, 0xbf, 0xb0, 0x68, 0x46, 0x12, 0xf0, - 0xf1, 0xf8, 0x05, 0x48, 0x6b, 0x46, 0x00, 0x22, - 0x04, 0x49, 0x40, 0x68, 0x02, 0xf0, 0xcd, 0xfa, - 0x3f, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x14, 0x0c, 0x00, 0x00, - 0x00, 0xb5, 0x04, 0x48, 0x00, 0x22, 0x83, 0x69, - 0x40, 0x68, 0x03, 0x49, 0x02, 0xf0, 0xbd, 0xfa, - 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, - 0x15, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x0a, 0x4b, - 0x08, 0x49, 0x98, 0x42, 0x06, 0xd9, 0x48, 0x68, - 0xed, 0x09, 0x00, 0x6e, 0x01, 0x08, 0x49, 0x11, - 0x22, 0x02, 0xf0, 0xad, 0xfa, 0x08, 0xbc, 0x18, - 0x47, 0x88, 0x61, 0x48, 0x68, 0x04, 0x49, 0x00, - 0x22, 0x02, 0xf0, 0xa5, 0xfa, 0xf6, 0xe7, 0x00, - 0x00, 0x60, 0xbb, 0x03, 0x20, 0xff, 0xff, 0x00, - 0x00, 0x16, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x04, - 0x48, 0x00, 0x22, 0xc3, 0x69, 0x40, 0x68, 0x03, - 0x49, 0x02, 0xf0, 0x95, 0xfa, 0x08, 0xbc, 0x18, - 0x47, 0x60, 0xbb, 0x03, 0x20, 0x17, 0x0c, 0x00, - 0x00, 0x00, 0xb5, 0x08, 0x49, 0x00, 0x28, 0x07, - 0xd0, 0xc8, 0x61, 0x48, 0x68, 0x06, 0x49, 0x00, - 0x22, 0x02, 0xf0, 0x85, 0xfa, 0x08, 0xbc, 0x18, - 0x47, 0x48, 0x68, 0x03, 0x49, 0x11, 0x22, 0x02, - 0xf0, 0x7e, 0xfa, 0xf7, 0xe7, 0x60, 0xbb, 0x03, - 0x20, 0x18, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x04, - 0x48, 0x00, 0x22, 0x83, 0x68, 0x40, 0x68, 0x03, - 0x49, 0x02, 0xf0, 0x71, 0xfa, 0x08, 0xbc, 0x18, - 0x47, 0x60, 0xbb, 0x03, 0x20, 0x19, 0x0c, 0x00, - 0x00, 0x90, 0xb5, 0x07, 0x1c, 0x00, 0x28, 0x17, - 0x4c, 0x0d, 0xd0, 0x01, 0x2f, 0x0b, 0xd0, 0x02, - 0x2f, 0x09, 0xd0, 0x03, 0x2f, 0x07, 0xd0, 0x11, - 0x22, 0x60, 0x68, 0x13, 0x49, 0x02, 0xf0, 0x5b, - 0xfa, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe9, - 0xf7, 0xc8, 0xff, 0x00, 0x28, 0x05, 0xd1, 0x11, - 0x22, 0x60, 0x68, 0x0d, 0x49, 0x02, 0xf0, 0x4f, - 0xfa, 0xf2, 0xe7, 0x61, 0x68, 0x01, 0x39, 0x61, - 0x60, 0x8c, 0x21, 0x01, 0x60, 0xe7, 0x60, 0xc7, - 0x60, 0x21, 0x6a, 0x81, 0x61, 0x61, 0x6a, 0xc1, - 0x61, 0xa1, 0x6a, 0x01, 0x61, 0xe1, 0x6a, 0x41, - 0x61, 0x01, 0x1c, 0x02, 0x20, 0xea, 0xf7, 0x1c, - 0xf8, 0xde, 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x1a, 0x0c, 0x00, 0x00, 0x08, 0xb5, 0x06, - 0x48, 0x06, 0x49, 0xed, 0x09, 0x00, 0x6f, 0x01, - 0xc2, 0x6a, 0x00, 0x92, 0x83, 0x6a, 0x40, 0x68, - 0x00, 0x22, 0x02, 0xf0, 0x2b, 0xfa, 0x01, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x1b, 0x0c, 0x00, 0x00, 0xb0, 0xb5, - 0x04, 0x1c, 0x0f, 0x1c, 0x88, 0x42, 0x11, 0x4d, - 0x07, 0xd2, 0x11, 0x22, 0x68, 0x68, 0x10, 0x49, - 0x02, 0xf0, 0x18, 0xfa, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xe9, 0xf7, 0x85, 0xff, 0x00, 0x28, - 0x05, 0xd1, 0x07, 0x22, 0x68, 0x68, 0x0a, 0x49, - 0x02, 0xf0, 0x0c, 0xfa, 0xf2, 0xe7, 0xac, 0x62, - 0xef, 0x62, 0x8e, 0x21, 0x01, 0x60, 0xc4, 0x60, - 0x07, 0x61, 0x01, 0x1c, 0x03, 0x20, 0xe9, 0xf7, - 0xe2, 0xff, 0x00, 0x22, 0x68, 0x68, 0x02, 0x49, - 0x02, 0xf0, 0xfc, 0xf9, 0xe2, 0xe7, 0x60, 0xbb, - 0x03, 0x20, 0x1c, 0x0c, 0x00, 0x00, 0x08, 0xb5, - 0x06, 0x48, 0x06, 0x49, 0x42, 0x6a, 0x00, 0x92, - 0x03, 0x6a, 0x40, 0x68, 0x00, 0x22, 0x02, 0xf0, - 0xed, 0xf9, 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x1d, 0x0c, - 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0f, 0x1c, - 0x88, 0x42, 0x11, 0x4d, 0x07, 0xd2, 0x11, 0x22, - 0x68, 0x68, 0x10, 0x49, 0x02, 0xf0, 0xda, 0xf9, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe9, 0xf7, - 0x47, 0xff, 0x00, 0x28, 0x05, 0xd1, 0x07, 0x22, - 0x68, 0x68, 0x0a, 0x49, 0x02, 0xf0, 0xce, 0xf9, - 0xf2, 0xe7, 0x2c, 0x62, 0x6f, 0x62, 0x8d, 0x21, - 0x01, 0x60, 0xc4, 0x60, 0x07, 0x61, 0x01, 0x1c, - 0x03, 0x20, 0xe9, 0xf7, 0xa4, 0xff, 0x00, 0x22, - 0x68, 0x68, 0x02, 0x49, 0x02, 0xf0, 0xbe, 0xf9, - 0xe2, 0xe7, 0x60, 0xbb, 0x03, 0x20, 0x1e, 0x0c, - 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, 0x00, 0x22, - 0x03, 0x6b, 0x40, 0x68, 0x03, 0x49, 0xed, 0x09, - 0x00, 0x70, 0x01, 0x02, 0xf0, 0xb1, 0xf9, 0x08, - 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, 0x1f, - 0x0c, 0x00, 0x00, 0x90, 0xb5, 0x07, 0x1c, 0x00, - 0x28, 0x13, 0x4c, 0x0a, 0xd0, 0x01, 0x2f, 0x08, - 0xd0, 0x11, 0x22, 0x61, 0x21, 0x49, 0x01, 0x60, - 0x68, 0x02, 0xf0, 0x9e, 0xf9, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xe9, 0xf7, 0x0b, 0xff, 0x00, - 0x28, 0x06, 0xd1, 0x07, 0x22, 0x61, 0x21, 0x49, - 0x01, 0x60, 0x68, 0x02, 0xf0, 0x91, 0xf9, 0xf1, - 0xe7, 0x97, 0x21, 0x27, 0x63, 0x01, 0x60, 0xc7, - 0x60, 0x01, 0x1c, 0x02, 0x20, 0xe9, 0xf7, 0x69, - 0xff, 0x00, 0x22, 0x61, 0x21, 0x49, 0x01, 0x60, - 0x68, 0x02, 0xf0, 0x82, 0xf9, 0xe2, 0xe7, 0x60, - 0xbb, 0x03, 0x20, 0x00, 0xb5, 0x04, 0x48, 0x00, - 0x22, 0x43, 0x6b, 0x40, 0x68, 0x03, 0x49, 0x02, - 0xf0, 0x77, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x21, 0x0c, 0x00, 0x00, 0x90, - 0xb5, 0x07, 0x1c, 0x00, 0x28, 0x13, 0x4c, 0x0b, - 0xd0, 0x01, 0x2f, 0x09, 0xd0, 0x02, 0x2f, 0x07, - 0xd0, 0x11, 0x22, 0x60, 0x68, 0x10, 0x49, 0x02, - 0xf0, 0x63, 0xf9, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xe9, 0xf7, 0xd0, 0xfe, 0x00, 0x28, 0x05, - 0xd1, 0x07, 0x22, 0x60, 0x68, 0x0a, 0x49, 0x02, - 0xf0, 0x57, 0xf9, 0xf2, 0xe7, 0x98, 0x21, 0x67, - 0x63, 0x01, 0x60, 0xc7, 0x60, 0x01, 0x1c, 0x02, - 0x20, 0xe9, 0xf7, 0x2f, 0xff, 0x00, 0x22, 0x60, - 0x68, 0x03, 0x49, 0x02, 0xf0, 0x49, 0xf9, 0xe4, - 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x22, - 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, 0x00, - 0x22, 0x83, 0x6b, 0x40, 0x68, 0x03, 0x49, 0x02, - 0xf0, 0x3b, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x23, 0x0c, 0x00, 0x00, 0x90, - 0xb5, 0xed, 0x09, 0x00, 0x71, 0x01, 0x0e, 0x4c, - 0x07, 0x1c, 0xa0, 0x63, 0xe9, 0xf7, 0xa1, 0xfe, - 0x00, 0x28, 0x07, 0xd1, 0x07, 0x22, 0x60, 0x68, - 0x0a, 0x49, 0x02, 0xf0, 0x28, 0xf9, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x9d, 0x21, 0x01, 0x60, - 0xc7, 0x60, 0x01, 0x1c, 0x04, 0x20, 0xe9, 0xf7, - 0xff, 0xfe, 0x00, 0x22, 0x60, 0x68, 0x03, 0x49, - 0x02, 0xf0, 0x19, 0xf9, 0xef, 0xe7, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x24, 0x0c, 0x00, 0x00, - 0x00, 0xb5, 0x05, 0x48, 0xc1, 0x1d, 0x79, 0x31, - 0xcb, 0x69, 0x40, 0x68, 0x03, 0x49, 0x00, 0x22, - 0x02, 0xf0, 0x09, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0x60, 0xbb, 0x03, 0x20, 0x25, 0x0c, 0x00, 0x00, - 0xb0, 0xb5, 0x85, 0x07, 0xad, 0x0f, 0x07, 0x1c, - 0x03, 0x2d, 0x18, 0x4c, 0x07, 0xd1, 0x11, 0x22, - 0x60, 0x68, 0x17, 0x49, 0x02, 0xf0, 0xf7, 0xf8, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xe9, 0xf7, - 0x64, 0xfe, 0x00, 0x28, 0x05, 0xd1, 0x07, 0x22, - 0x60, 0x68, 0x11, 0x49, 0x02, 0xf0, 0xeb, 0xf8, - 0xf2, 0xe7, 0xe1, 0x1d, 0x79, 0x31, 0xcf, 0x61, - 0x8b, 0x21, 0x01, 0x60, 0x00, 0x2d, 0x0f, 0xd0, - 0x01, 0x2d, 0x10, 0xd0, 0x02, 0x2d, 0x01, 0xd1, - 0x01, 0x21, 0xc1, 0x60, 0x01, 0x1c, 0x02, 0x20, - 0xe9, 0xf7, 0xba, 0xfe, 0x00, 0x22, 0x60, 0x68, - 0x05, 0x49, 0x02, 0xf0, 0xd4, 0xf8, 0xdb, 0xe7, - 0x02, 0x21, 0xc1, 0x60, 0xf2, 0xe7, 0x00, 0x21, - 0xc1, 0x60, 0xef, 0xe7, 0x60, 0xbb, 0x03, 0x20, - 0x26, 0x0c, 0x00, 0x00, 0x08, 0xb5, 0x00, 0x22, - 0x03, 0x1c, 0x05, 0x48, 0x00, 0x92, 0x40, 0x68, - 0x01, 0x22, 0x04, 0x49, 0x02, 0xf0, 0xbf, 0xf8, - 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x27, 0x0c, 0x00, 0x00, - 0x00, 0xb5, 0x03, 0x1c, 0xed, 0x09, 0x00, 0x72, - 0x01, 0x03, 0x48, 0x01, 0x22, 0x03, 0x49, 0x40, - 0x68, 0x02, 0xf0, 0xaf, 0xf8, 0x08, 0xbc, 0x18, - 0x47, 0x60, 0xbb, 0x03, 0x20, 0x28, 0x0c, 0x00, - 0x00, 0x00, 0xb5, 0x04, 0x48, 0x00, 0x23, 0x01, - 0x22, 0x03, 0x49, 0x40, 0x68, 0x02, 0xf0, 0xa1, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, - 0x20, 0x29, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x04, - 0x48, 0x01, 0x22, 0x04, 0x49, 0x40, 0x68, 0x02, - 0xf0, 0x94, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x60, 0xbb, 0x03, 0x20, 0x2a, 0x0c, 0x00, - 0x00, 0x00, 0xb5, 0x04, 0x48, 0x00, 0x23, 0x01, - 0x22, 0x03, 0x49, 0x40, 0x68, 0x02, 0xf0, 0x85, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, - 0x20, 0x2b, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x04, - 0x48, 0x01, 0x22, 0x04, 0x49, 0x40, 0x68, 0x02, - 0xf0, 0x78, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x60, 0xbb, 0x03, 0x20, 0x2c, 0x0c, 0x00, - 0x00, 0x08, 0xb5, 0x00, 0x22, 0x03, 0x1c, 0x05, - 0x48, 0x00, 0x92, 0x40, 0x68, 0x01, 0x22, 0x04, - 0x49, 0x02, 0xf0, 0x67, 0xf8, 0x01, 0xb0, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x2d, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x04, - 0x48, 0x00, 0x23, 0x01, 0x22, 0x03, 0x49, 0x40, - 0x68, 0x02, 0xf0, 0x57, 0xf8, 0x08, 0xbc, 0x18, - 0x47, 0x60, 0xbb, 0x03, 0x20, 0x2e, 0x0c, 0x00, - 0x00, 0x00, 0xb5, 0x04, 0x48, 0x01, 0x22, 0x04, - 0x49, 0x40, 0x68, 0x02, 0xf0, 0x4a, 0xf8, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x2f, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x08, - 0x49, 0x00, 0x28, 0x06, 0xd1, 0x48, 0x68, 0x07, - 0x49, 0x00, 0x22, 0x02, 0xf0, 0x3a, 0xf8, 0x08, - 0xbc, 0x18, 0x47, 0x48, 0x68, 0x03, 0x49, 0xed, - 0x09, 0x00, 0x73, 0x01, 0x11, 0x22, 0x02, 0xf0, - 0x33, 0xf8, 0xf7, 0xe7, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x31, 0x0c, 0x00, 0x00, 0xf0, 0xb5, - 0x1c, 0x1c, 0x0d, 0x1c, 0x06, 0x1c, 0x17, 0x1c, - 0x0d, 0x4a, 0x10, 0x6d, 0x00, 0xf0, 0xb4, 0xfb, - 0x00, 0x28, 0x05, 0xd0, 0x0a, 0x4a, 0xd0, 0x6e, - 0x51, 0x6e, 0x38, 0x1a, 0x08, 0x18, 0x50, 0x66, - 0x07, 0x4a, 0x07, 0x49, 0xd0, 0x1d, 0x79, 0x30, - 0x96, 0x66, 0x85, 0x60, 0xd7, 0x66, 0xc4, 0x60, - 0x50, 0x68, 0x00, 0x22, 0x02, 0xf0, 0x10, 0xf8, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x33, 0x0c, 0x00, 0x00, 0xf0, 0xb5, - 0x05, 0x1c, 0x0d, 0x48, 0x0c, 0x1c, 0x17, 0x1c, - 0x00, 0x6d, 0x00, 0xf0, 0x91, 0xfb, 0x00, 0x28, - 0x0f, 0xd0, 0x00, 0x26, 0x00, 0x2d, 0x0c, 0xd9, - 0x20, 0x68, 0x00, 0xf0, 0xf4, 0xfb, 0x00, 0x28, - 0x02, 0xd0, 0x38, 0x68, 0x00, 0xf0, 0x8c, 0xfb, - 0x04, 0x34, 0x01, 0x36, 0x04, 0x37, 0xae, 0x42, - 0xf2, 0xd3, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0xb8, 0xb5, - 0x04, 0x1c, 0x00, 0xf0, 0x00, 0xfc, 0x07, 0x1c, - 0x00, 0x28, 0x11, 0x4d, 0x0a, 0xd1, 0x00, 0x22, - 0x00, 0x92, 0x02, 0x22, 0x23, 0x1c, 0x68, 0x68, - 0x0f, 0x49, 0x01, 0xf0, 0xd9, 0xff, 0xb8, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xe9, 0xf7, 0x46, 0xfd, - 0x00, 0x28, 0x05, 0xd1, 0x07, 0x22, 0x68, 0x68, - 0x09, 0x49, 0x01, 0xf0, 0xcd, 0xff, 0xf2, 0xe7, - 0x69, 0x68, 0x01, 0x39, 0x69, 0x60, 0x99, 0x21, - 0x01, 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x01, 0x1c, - 0x02, 0x20, 0xe9, 0xf7, 0xa2, 0xfd, 0xe6, 0xe7, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x36, 0x0c, - 0x00, 0x00, 0xf0, 0xb5, 0x0d, 0x1c, 0x07, 0x1c, - 0x00, 0xf0, 0xed, 0x09, 0x00, 0x74, 0x01, 0xd1, - 0xfb, 0x04, 0x1c, 0x00, 0x28, 0x13, 0x4e, 0x08, - 0xd1, 0x02, 0x22, 0x3b, 0x1c, 0x70, 0x68, 0x11, - 0x49, 0x01, 0xf0, 0xac, 0xff, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xe9, 0xf7, 0x19, 0xfd, 0x00, - 0x28, 0x06, 0xd1, 0x07, 0x22, 0x3b, 0x1c, 0x70, - 0x68, 0x0b, 0x49, 0x01, 0xf0, 0x9f, 0xff, 0xf1, - 0xe7, 0x9a, 0x21, 0x01, 0x60, 0xa1, 0x68, 0xc1, - 0x60, 0x05, 0x61, 0x01, 0x1c, 0x02, 0x20, 0xe9, - 0xf7, 0x76, 0xfd, 0x00, 0x22, 0x3b, 0x1c, 0x70, - 0x68, 0x03, 0x49, 0x01, 0xf0, 0x8f, 0xff, 0xe1, - 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x37, - 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, 0x01, - 0x23, 0x00, 0x22, 0x03, 0x49, 0x40, 0x68, 0x01, - 0xf0, 0x81, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x38, 0x0c, 0x00, 0x00, 0x08, - 0xb5, 0xe9, 0xf7, 0xea, 0xfc, 0x0c, 0x49, 0x00, - 0x28, 0x0a, 0xd1, 0x00, 0x22, 0x00, 0x92, 0x48, - 0x68, 0x00, 0x23, 0x07, 0x22, 0x09, 0x49, 0x01, - 0xf0, 0x6d, 0xff, 0x01, 0xb0, 0x08, 0xbc, 0x18, - 0x47, 0x4a, 0x68, 0x01, 0x3a, 0x4a, 0x60, 0xa7, - 0x21, 0x01, 0x60, 0x01, 0x1c, 0x03, 0x20, 0xe9, - 0xf7, 0x42, 0xfd, 0xf2, 0xe7, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0x39, 0x0c, 0x00, 0x00, 0xf0, - 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x00, 0x28, 0x14, - 0x4e, 0x07, 0xd1, 0x11, 0x22, 0x70, 0x68, 0x13, - 0x49, 0x01, 0xf0, 0x50, 0xff, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xe9, 0xf7, 0xbd, 0xfc, 0x07, - 0x1c, 0x05, 0xd1, 0x07, 0x22, 0x70, 0x68, 0x0d, - 0x49, 0x01, 0xf0, 0x44, 0xff, 0xf2, 0xe7, 0x01, - 0x2c, 0x00, 0xd9, 0x01, 0x24, 0xa8, 0x20, 0x38, - 0x60, 0xa2, 0x00, 0xf8, 0x1d, 0x09, 0x30, 0x29, - 0x1c, 0xfc, 0x60, 0xe9, 0xf7, 0xed, 0x09, 0x00, - 0x75, 0x01, 0x10, 0xf9, 0x03, 0x20, 0x39, 0x1c, - 0xe9, 0xf7, 0x14, 0xfd, 0x00, 0x22, 0x70, 0x68, - 0x02, 0x49, 0x01, 0xf0, 0x2e, 0xff, 0xdc, 0xe7, - 0x60, 0xbb, 0x03, 0x20, 0x3a, 0x0c, 0x00, 0x00, - 0x00, 0xb5, 0x04, 0x48, 0x00, 0x22, 0x03, 0x69, - 0x40, 0x68, 0x03, 0x49, 0x01, 0xf0, 0x21, 0xff, - 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, - 0x3b, 0x0c, 0x00, 0x00, 0x90, 0xb5, 0x0e, 0x4c, - 0x07, 0x1c, 0x20, 0x61, 0xe9, 0xf7, 0x87, 0xfc, - 0x00, 0x28, 0x07, 0xd1, 0x07, 0x22, 0x60, 0x68, - 0x0a, 0x49, 0x01, 0xf0, 0x0e, 0xff, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x9b, 0x21, 0x01, 0x60, - 0xc7, 0x60, 0x01, 0x1c, 0x03, 0x20, 0xe9, 0xf7, - 0xe5, 0xfc, 0x00, 0x22, 0x60, 0x68, 0x03, 0x49, - 0x01, 0xf0, 0xff, 0xfe, 0xef, 0xe7, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x3c, 0x0c, 0x00, 0x00, - 0x00, 0xb5, 0x04, 0x48, 0x00, 0x22, 0x43, 0x69, - 0x40, 0x68, 0x03, 0x49, 0x01, 0xf0, 0xf1, 0xfe, - 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, - 0x3d, 0x0c, 0x00, 0x00, 0x90, 0xb5, 0x0e, 0x4c, - 0x07, 0x1c, 0x60, 0x61, 0xe9, 0xf7, 0x57, 0xfc, - 0x00, 0x28, 0x07, 0xd1, 0x07, 0x22, 0x60, 0x68, - 0x0a, 0x49, 0x01, 0xf0, 0xde, 0xfe, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x9c, 0x21, 0x01, 0x60, - 0xc7, 0x60, 0x01, 0x1c, 0x03, 0x20, 0xe9, 0xf7, - 0xb5, 0xfc, 0x00, 0x22, 0x60, 0x68, 0x03, 0x49, - 0x01, 0xf0, 0xcf, 0xfe, 0xef, 0xe7, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x3e, 0x0c, 0x00, 0x00, - 0x80, 0xb5, 0x87, 0xb0, 0x1a, 0x48, 0x1b, 0xa1, - 0x0e, 0xf0, 0x5a, 0xfc, 0x00, 0x23, 0x0d, 0x30, - 0xc1, 0x56, 0x8b, 0x00, 0x59, 0x18, 0x49, 0x00, - 0x01, 0x23, 0xc2, 0x56, 0x89, 0x18, 0xff, 0x39, - 0xed, 0x09, 0x00, 0x76, 0x01, 0xff, 0x39, 0x12, - 0x39, 0x0a, 0x02, 0x03, 0x23, 0xc1, 0x56, 0x8b, - 0x00, 0x59, 0x18, 0x49, 0x00, 0x04, 0x23, 0xc0, - 0x56, 0x08, 0x18, 0xff, 0x38, 0xff, 0x38, 0x12, - 0x38, 0x02, 0x43, 0x17, 0x1c, 0x05, 0xaa, 0x06, - 0xa8, 0x04, 0xa9, 0x11, 0xf0, 0xa6, 0xfc, 0x06, - 0x98, 0x04, 0x99, 0x05, 0x9a, 0x01, 0x90, 0x0b, - 0x48, 0x02, 0x91, 0x03, 0x92, 0x00, 0x97, 0x01, - 0x23, 0x00, 0x22, 0x40, 0x68, 0x08, 0x49, 0x01, - 0xf0, 0x96, 0xfe, 0x07, 0xb0, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xc4, 0x5d, 0x03, - 0x20, 0x24, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x3a, 0x20, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x01, 0x10, 0x00, 0x00, 0x00, 0xb5, 0x82, - 0xb0, 0x68, 0x46, 0x11, 0xf0, 0x97, 0xfc, 0x05, - 0x48, 0x6b, 0x46, 0x00, 0x22, 0x04, 0x49, 0x40, - 0x68, 0x01, 0xf0, 0x79, 0xfe, 0x02, 0xb0, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x03, 0x10, 0x00, 0x00, 0x80, 0xb5, 0x83, - 0xb0, 0x09, 0x4f, 0xf8, 0x1d, 0x79, 0x30, 0x42, - 0x69, 0x79, 0x6f, 0x00, 0x69, 0x02, 0x92, 0x01, - 0x91, 0x00, 0x90, 0x78, 0x68, 0x3b, 0x6f, 0x05, - 0x49, 0x00, 0x22, 0x01, 0xf0, 0x60, 0xfe, 0x03, - 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x60, 0xbb, 0x03, 0x20, 0x05, 0x10, 0x00, - 0x00, 0x00, 0xb5, 0x10, 0xf0, 0xe9, 0xfe, 0x03, - 0x1c, 0x03, 0x48, 0x00, 0x22, 0x03, 0x49, 0x40, - 0x68, 0x01, 0xf0, 0x4d, 0xfe, 0x08, 0xbc, 0x18, - 0x47, 0x60, 0xbb, 0x03, 0x20, 0x07, 0x10, 0x00, - 0x00, 0x00, 0xb5, 0x82, 0xb0, 0x68, 0x46, 0x10, - 0xf0, 0xd1, 0xfe, 0x05, 0x48, 0x6b, 0x46, 0x00, - 0x22, 0x04, 0x49, 0x40, 0x68, 0x01, 0xf0, 0x3b, - 0xfe, 0x02, 0xb0, 0xed, 0x09, 0x00, 0x77, 0x01, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x09, 0x10, 0x00, 0x00, 0x08, 0xb5, - 0x00, 0x22, 0x03, 0x1c, 0x05, 0x48, 0x00, 0x92, - 0x40, 0x68, 0x01, 0x22, 0x04, 0x49, 0x01, 0xf0, - 0x29, 0xfe, 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x01, 0x14, - 0x00, 0x00, 0x00, 0xb5, 0x03, 0x1c, 0x03, 0x48, - 0x01, 0x22, 0x03, 0x49, 0x40, 0x68, 0x01, 0xf0, - 0x19, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x02, 0x14, 0x00, 0x00, 0x08, 0xb5, - 0x00, 0x22, 0x03, 0x1c, 0x05, 0x48, 0x00, 0x92, - 0x40, 0x68, 0x01, 0x22, 0x04, 0x49, 0x01, 0xf0, - 0x09, 0xfe, 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x03, 0x14, - 0x00, 0x00, 0xb8, 0xb5, 0x07, 0x1c, 0x00, 0xf0, - 0x18, 0xfa, 0x04, 0x1c, 0x00, 0x28, 0x12, 0x4d, - 0x0a, 0xd1, 0x00, 0x22, 0x00, 0x92, 0x02, 0x22, - 0x3b, 0x1c, 0x68, 0x68, 0x10, 0x49, 0x01, 0xf0, - 0xf1, 0xfd, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xe9, 0xf7, 0x5e, 0xfb, 0x00, 0x28, 0x08, 0xd1, - 0x00, 0x22, 0x00, 0x92, 0x07, 0x22, 0x3b, 0x1c, - 0x68, 0x68, 0x08, 0x49, 0x01, 0xf0, 0xe2, 0xfd, - 0xef, 0xe7, 0x69, 0x68, 0x01, 0x39, 0x69, 0x60, - 0xab, 0x21, 0x01, 0x60, 0xa1, 0x68, 0xc1, 0x60, - 0x01, 0x1c, 0x02, 0x20, 0xe9, 0xf7, 0xb7, 0xfb, - 0xe3, 0xe7, 0x60, 0xbb, 0x03, 0x20, 0x05, 0x14, - 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, 0x00, 0x23, - 0x01, 0x22, 0x03, 0x49, 0x40, 0x68, 0x01, 0xf0, - 0xc9, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x01, 0x18, 0x00, 0x00, 0x00, 0xb5, - 0x04, 0x48, 0x01, 0x22, 0x04, 0x49, 0x40, 0x68, - 0x01, 0xf0, 0xbc, 0xfd, 0x08, 0xbc, 0xed, 0x09, - 0x00, 0x78, 0x01, 0x18, 0x47, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0x02, 0x18, 0x00, 0x00, 0x80, - 0xb5, 0xe9, 0xf7, 0x24, 0xfb, 0x0b, 0x4f, 0x00, - 0x28, 0x07, 0xd1, 0x07, 0x22, 0x78, 0x68, 0x09, - 0x49, 0x01, 0xf0, 0xaa, 0xfd, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xb5, 0x21, 0x01, 0x60, 0x01, - 0x1c, 0x02, 0x20, 0xe9, 0xf7, 0x82, 0xfb, 0x00, - 0x22, 0x78, 0x68, 0x02, 0x49, 0x01, 0xf0, 0x9c, - 0xfd, 0xf0, 0xe7, 0x60, 0xbb, 0x03, 0x20, 0x03, - 0x18, 0x00, 0x00, 0x90, 0xb5, 0x89, 0xb0, 0x01, - 0x90, 0x00, 0xf0, 0xad, 0xf9, 0x07, 0x1c, 0x00, - 0x28, 0x14, 0x4c, 0x08, 0xd1, 0x01, 0xaa, 0x00, - 0x92, 0x20, 0x23, 0x02, 0x22, 0x60, 0x68, 0x11, - 0x49, 0x01, 0xf0, 0x86, 0xfd, 0x19, 0xe0, 0xe9, - 0xf7, 0xf5, 0xfa, 0x00, 0x28, 0x08, 0xd1, 0x01, - 0xaa, 0x00, 0x92, 0x20, 0x23, 0x07, 0x22, 0x60, - 0x68, 0x0b, 0x49, 0x01, 0xf0, 0x79, 0xfd, 0x0c, - 0xe0, 0x61, 0x68, 0x01, 0x39, 0x61, 0x60, 0xb6, - 0x21, 0x01, 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x00, - 0x21, 0x01, 0x61, 0x01, 0x1c, 0x02, 0x20, 0xe9, - 0xf7, 0x4c, 0xfb, 0x09, 0xb0, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, 0x01, - 0xfc, 0x00, 0x00, 0x90, 0xb5, 0x89, 0xb0, 0x01, - 0x90, 0x00, 0xf0, 0x79, 0xf9, 0x07, 0x1c, 0x00, - 0x28, 0x14, 0x4c, 0x08, 0xd1, 0x01, 0xaa, 0x00, - 0x92, 0x20, 0x23, 0x02, 0x22, 0x60, 0x68, 0x11, - 0x49, 0x01, 0xf0, 0x52, 0xfd, 0x19, 0xe0, 0xe9, - 0xf7, 0xc1, 0xfa, 0x00, 0x28, 0x08, 0xd1, 0x01, - 0xaa, 0x00, 0x92, 0x20, 0x23, 0x07, 0x22, 0x60, - 0x68, 0x0b, 0x49, 0x01, 0xf0, 0x45, 0xfd, 0x0c, - 0xe0, 0x61, 0x68, 0x01, 0x39, 0x61, 0x60, 0xb6, - 0x21, 0x01, 0x60, 0xb9, 0x68, 0xc1, 0x60, 0x01, - 0x21, 0xed, 0x09, 0x00, 0x79, 0x01, 0x01, 0x61, - 0x01, 0x1c, 0x02, 0x20, 0xe9, 0xf7, 0x18, 0xfb, - 0x09, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x60, 0xbb, 0x03, 0x20, 0x12, 0xfc, 0x00, 0x00, - 0xff, 0xb5, 0x81, 0xb0, 0x01, 0x20, 0x00, 0x90, - 0x18, 0x68, 0x0d, 0x1c, 0x14, 0x21, 0x08, 0x1a, - 0x99, 0x69, 0x40, 0x18, 0x19, 0x6a, 0x46, 0x18, - 0x01, 0x98, 0x1f, 0x1c, 0x00, 0xf0, 0x3a, 0xf9, - 0x04, 0x1c, 0x08, 0xd1, 0x6a, 0x46, 0x01, 0x20, - 0x01, 0xa9, 0x01, 0xf0, 0x47, 0xfb, 0x38, 0x1c, - 0x10, 0xf0, 0x48, 0xff, 0x54, 0xe0, 0x60, 0x6b, - 0x02, 0x28, 0x08, 0xd0, 0x6a, 0x46, 0x01, 0x20, - 0x01, 0xa9, 0x01, 0xf0, 0x3b, 0xfb, 0x38, 0x1c, - 0x10, 0xf0, 0x3c, 0xff, 0x48, 0xe0, 0x02, 0x2d, - 0x0a, 0xd0, 0x01, 0x2d, 0x08, 0xd0, 0x6a, 0x46, - 0x01, 0x20, 0x01, 0xa9, 0x01, 0xf0, 0x2e, 0xfb, - 0x38, 0x1c, 0x10, 0xf0, 0x2f, 0xff, 0x3b, 0xe0, - 0x1f, 0x48, 0x00, 0x6f, 0xb0, 0x42, 0x0b, 0xd2, - 0x01, 0x20, 0x01, 0xf0, 0x06, 0xfc, 0x6a, 0x46, - 0x01, 0x20, 0x01, 0xa9, 0x01, 0xf0, 0x1e, 0xfb, - 0x38, 0x1c, 0x10, 0xf0, 0x1f, 0xff, 0x2b, 0xe0, - 0x20, 0x1c, 0x02, 0xf0, 0x95, 0xf9, 0x00, 0x28, - 0x0b, 0xd0, 0x01, 0x20, 0x01, 0xf0, 0xf5, 0xfb, - 0x6a, 0x46, 0x01, 0x20, 0x01, 0xa9, 0x01, 0xf0, - 0x0d, 0xfb, 0x38, 0x1c, 0x10, 0xf0, 0x0e, 0xff, - 0x1a, 0xe0, 0xe9, 0xf7, 0x4a, 0xfa, 0x00, 0x28, - 0x09, 0xd1, 0x20, 0x1c, 0x39, 0x1c, 0x02, 0xf0, - 0x92, 0xf9, 0x6a, 0x46, 0x01, 0x20, 0x01, 0xa9, - 0x01, 0xf0, 0xfc, 0xfa, 0x0c, 0xe0, 0x93, 0x21, - 0x01, 0x60, 0xa1, 0x68, 0xc1, 0x60, 0x07, 0x61, - 0x45, 0x61, 0x03, 0x9a, 0x01, 0x1c, 0x82, 0x61, - 0xc7, 0x61, 0x02, 0x20, 0xe9, 0xf7, 0xa0, 0xfa, - 0x05, 0xb0, 0xf0, 0xbc, 0xed, 0x09, 0x00, 0x7a, - 0x01, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, - 0x20, 0x98, 0xb5, 0x0f, 0x1c, 0x69, 0x46, 0x00, - 0xf0, 0xf1, 0xf8, 0x04, 0x1c, 0x03, 0xd1, 0x38, - 0x1c, 0x10, 0xf0, 0xe2, 0xfe, 0x19, 0xe0, 0x60, - 0x6b, 0x02, 0x28, 0x03, 0xd0, 0x38, 0x1c, 0x10, - 0xf0, 0xdb, 0xfe, 0x12, 0xe0, 0xe9, 0xf7, 0x17, - 0xfa, 0x00, 0x28, 0x03, 0xd1, 0x38, 0x1c, 0x10, - 0xf0, 0xd3, 0xfe, 0x0a, 0xe0, 0x87, 0x21, 0x01, - 0x60, 0xa1, 0x68, 0x09, 0x6b, 0x89, 0x68, 0xc1, - 0x60, 0x47, 0x61, 0x01, 0x1c, 0x04, 0x20, 0xe9, - 0xf7, 0x75, 0xfa, 0x98, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x04, 0x48, 0x81, 0x69, 0x01, - 0x31, 0x81, 0x61, 0xff, 0xf7, 0x07, 0xf8, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe0, 0xbb, 0x03, - 0x20, 0x00, 0x22, 0x4a, 0x65, 0x42, 0x68, 0x00, - 0x2a, 0x02, 0xd0, 0x51, 0x65, 0x41, 0x60, 0x70, - 0x47, 0x41, 0x60, 0x01, 0x60, 0x70, 0x47, 0x01, - 0x1c, 0x00, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x42, - 0x6d, 0x0a, 0x60, 0x00, 0x2a, 0x00, 0xd1, 0x4a, - 0x60, 0x70, 0x47, 0x01, 0x21, 0x01, 0x28, 0x02, - 0xd0, 0x03, 0x28, 0x00, 0xd0, 0x00, 0x21, 0x08, - 0x1c, 0x70, 0x47, 0x02, 0x49, 0x4a, 0x6e, 0x10, - 0x18, 0x48, 0x66, 0x70, 0x47, 0x60, 0xbb, 0x03, - 0x20, 0xf0, 0xb5, 0x84, 0xb0, 0x25, 0x48, 0x00, - 0x22, 0x01, 0x92, 0x03, 0x90, 0x35, 0xe0, 0xbe, - 0x6d, 0xf0, 0x6d, 0x02, 0x90, 0xb0, 0x69, 0x39, - 0x6e, 0x45, 0x1a, 0x1c, 0xe0, 0x20, 0x48, 0x87, - 0x6e, 0xaf, 0x42, 0x00, 0xd3, 0x2f, 0x1c, 0x00, - 0x97, 0x1d, 0x48, 0xf1, 0x69, 0x00, 0x6e, 0xed, - 0x1b, 0x0b, 0x18, 0x01, 0x21, 0x00, 0x28, 0x00, - 0xd1, 0x71, 0x69, 0x02, 0x98, 0x40, 0x69, 0x01, - 0x9a, 0x02, 0xf0, 0xdc, 0xf9, 0x16, 0x49, 0xed, - 0x09, 0x00, 0x7b, 0x01, 0x08, 0x6e, 0xc0, 0x19, - 0x08, 0x66, 0x00, 0x2c, 0x02, 0xd0, 0x48, 0x6e, - 0x01, 0x38, 0x48, 0x66, 0x00, 0x2d, 0x06, 0xd0, - 0x00, 0x2c, 0xde, 0xd0, 0x10, 0x48, 0x40, 0x6e, - 0x00, 0x28, 0xda, 0xdc, 0x08, 0xe0, 0x0d, 0x4f, - 0x00, 0x20, 0x38, 0x66, 0x03, 0x98, 0xff, 0xf7, - 0xad, 0xff, 0x0b, 0xa1, 0x10, 0xf0, 0x28, 0xfc, - 0x09, 0x4f, 0xb8, 0x6d, 0x00, 0x28, 0x07, 0xd0, - 0x38, 0x6d, 0xff, 0xf7, 0xad, 0xff, 0x04, 0x1c, - 0xc0, 0xd0, 0x78, 0x6e, 0x00, 0x28, 0xbd, 0xdc, - 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xb8, 0xbb, 0x03, 0x20, 0x60, 0xbb, - 0x03, 0x20, 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, - 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, - 0x20, 0x35, 0x30, 0x33, 0x00, 0x00, 0x01, 0x20, - 0x70, 0x47, 0x90, 0xb4, 0x01, 0x1c, 0x0c, 0x48, - 0xc0, 0x6b, 0x00, 0x28, 0x12, 0xd0, 0x0b, 0x68, - 0x1f, 0x02, 0x3f, 0x0a, 0xc2, 0x68, 0x14, 0x02, - 0x24, 0x0a, 0xbc, 0x42, 0x07, 0xd1, 0x12, 0x0e, - 0x1c, 0x0e, 0xa2, 0x42, 0x03, 0xd1, 0x02, 0x8a, - 0x8c, 0x88, 0xa2, 0x42, 0x02, 0xd0, 0x00, 0x68, - 0x00, 0x28, 0xef, 0xd1, 0x90, 0xbc, 0x70, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x01, 0x1c, - 0x07, 0x48, 0x00, 0x6c, 0x00, 0x28, 0x08, 0xd0, - 0x06, 0x4a, 0x43, 0x69, 0x8b, 0x42, 0x04, 0xd0, - 0x91, 0x42, 0x02, 0xd0, 0x40, 0x68, 0x00, 0x28, - 0xf7, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0xff, 0x0f, 0x00, 0x00, 0x01, 0x1c, - 0x05, 0x48, 0xc0, 0x6b, 0x00, 0x28, 0x05, 0xd0, - 0x42, 0x69, 0x8a, 0x42, 0x02, 0xd0, 0x00, 0x68, - 0x00, 0x28, 0xf9, 0xd1, 0x70, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x16, 0x4a, 0xd2, 0x6b, 0x00, 0x2a, - 0x26, 0xd0, 0xed, 0x09, 0x00, 0x7c, 0x01, 0x53, - 0x69, 0x83, 0x42, 0x02, 0xd0, 0x13, 0x6b, 0x83, - 0x42, 0x02, 0xd1, 0x00, 0x20, 0x08, 0x60, 0x1d, - 0xe0, 0xd3, 0x69, 0x00, 0x2b, 0x05, 0xd0, 0x93, - 0x69, 0x83, 0x42, 0x02, 0xd1, 0x01, 0x20, 0x08, - 0x60, 0x14, 0xe0, 0x53, 0x6a, 0x00, 0x2b, 0x05, - 0xd0, 0x13, 0x6a, 0x83, 0x42, 0x02, 0xd1, 0x02, - 0x20, 0x08, 0x60, 0x0b, 0xe0, 0xd3, 0x6a, 0x00, - 0x2b, 0x05, 0xd0, 0x93, 0x6a, 0x83, 0x42, 0x02, - 0xd1, 0x03, 0x20, 0x08, 0x60, 0x02, 0xe0, 0x12, - 0x68, 0x00, 0x2a, 0xd8, 0xd1, 0x10, 0x1c, 0x70, - 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x80, - 0xb4, 0x1a, 0x4a, 0x12, 0x6c, 0x00, 0x2a, 0x2c, - 0xd0, 0x19, 0x4f, 0xd3, 0x69, 0x00, 0x2b, 0x07, - 0xd0, 0x93, 0x69, 0x83, 0x42, 0x01, 0xd0, 0xb8, - 0x42, 0x02, 0xd1, 0x01, 0x20, 0x08, 0x60, 0x20, - 0xe0, 0x53, 0x6a, 0x00, 0x2b, 0x07, 0xd0, 0x13, - 0x6a, 0x83, 0x42, 0x01, 0xd0, 0xb8, 0x42, 0x02, - 0xd1, 0x02, 0x20, 0x08, 0x60, 0x15, 0xe0, 0xd3, - 0x6a, 0x00, 0x2b, 0x07, 0xd0, 0x93, 0x6a, 0x83, - 0x42, 0x01, 0xd0, 0xb8, 0x42, 0x02, 0xd1, 0x03, - 0x20, 0x08, 0x60, 0x0a, 0xe0, 0x53, 0x69, 0x83, - 0x42, 0x01, 0xd0, 0xb8, 0x42, 0x02, 0xd1, 0x00, - 0x20, 0x08, 0x60, 0x02, 0xe0, 0x52, 0x68, 0x00, - 0x2a, 0xd3, 0xd1, 0x80, 0xbc, 0x10, 0x1c, 0x70, - 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0xff, - 0x0f, 0x00, 0x00, 0xc3, 0x69, 0x01, 0x22, 0x02, - 0x2b, 0x03, 0xd1, 0x80, 0x69, 0x08, 0x60, 0x10, - 0x1c, 0x70, 0x47, 0x43, 0x6a, 0x02, 0x2b, 0x03, - 0xd1, 0x00, 0x6a, 0x08, 0x60, 0x10, 0x1c, 0x70, - 0x47, 0xc3, 0x6a, 0x02, 0x2b, 0x03, 0xd1, 0x80, - 0x6a, 0x08, 0x60, 0x10, 0x1c, 0x70, 0x47, 0x00, - 0x20, 0x70, 0x47, 0x00, 0x28, 0xed, 0x09, 0x00, - 0x7d, 0x01, 0x03, 0xd0, 0xc1, 0x6c, 0x02, 0x4b, - 0x99, 0x42, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, - 0x19, 0x64, 0x11, 0x03, 0xf8, 0xb5, 0x0c, 0x4d, - 0x0c, 0x4e, 0x00, 0x24, 0xa8, 0x6c, 0x0b, 0x4f, - 0x41, 0x1c, 0xa9, 0x64, 0x07, 0x40, 0x69, 0x46, - 0x38, 0x1c, 0xff, 0xf7, 0x67, 0xff, 0x00, 0x28, - 0x03, 0xd1, 0x38, 0x1c, 0xf8, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0x34, 0xb4, 0x42, 0xed, 0xd3, - 0x01, 0x20, 0x00, 0x03, 0xf6, 0xe7, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0xff, 0x0e, 0x00, 0x00, - 0x43, 0x68, 0x00, 0x22, 0x00, 0x2b, 0x03, 0xd0, - 0x19, 0x60, 0x43, 0x68, 0x4b, 0x60, 0x01, 0xe0, - 0x01, 0x60, 0x4a, 0x60, 0x0a, 0x60, 0x41, 0x60, - 0x81, 0x68, 0x01, 0x31, 0x81, 0x60, 0x70, 0x47, - 0x0a, 0x68, 0x00, 0x2a, 0x02, 0xd0, 0x4b, 0x68, - 0x53, 0x60, 0x01, 0xe0, 0x4a, 0x68, 0x42, 0x60, - 0x4a, 0x68, 0x00, 0x2a, 0x02, 0xd0, 0x09, 0x68, - 0x11, 0x60, 0x01, 0xe0, 0x09, 0x68, 0x01, 0x60, - 0x81, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, - 0x81, 0x60, 0x70, 0x47, 0x90, 0xb5, 0x04, 0x1c, - 0x50, 0x20, 0x10, 0xf0, 0xe7, 0xfa, 0x07, 0x1c, - 0x12, 0xd0, 0x0b, 0x48, 0xf8, 0x64, 0xff, 0xf7, - 0xb1, 0xff, 0x78, 0x61, 0x0c, 0xcc, 0xf8, 0x1d, - 0x05, 0x30, 0x0c, 0xc0, 0x00, 0x20, 0xb8, 0x60, - 0x78, 0x63, 0x01, 0x20, 0x00, 0x03, 0x38, 0x63, - 0x04, 0x48, 0x39, 0x1c, 0xff, 0xf7, 0xc0, 0xff, - 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x19, 0x64, 0x11, 0x03, 0x9c, 0xbb, 0x03, 0x20, - 0x90, 0xb5, 0x14, 0x1c, 0x07, 0x1c, 0x00, 0x29, - 0x0b, 0xd0, 0xe9, 0xf7, 0x3c, 0xf8, 0x00, 0x28, - 0x07, 0xd0, 0xae, 0x21, 0x01, 0x60, 0xb9, 0x68, - 0xc1, 0x60, 0x01, 0x1c, 0x02, 0x20, 0xe9, 0xf7, - 0xed, 0x09, 0x00, 0x7e, 0x01, 0xa1, 0xf8, 0x38, - 0x1c, 0x00, 0xf0, 0x64, 0xf8, 0x06, 0x48, 0x39, - 0x1c, 0xff, 0xf7, 0xb0, 0xff, 0x00, 0x20, 0xf8, - 0x64, 0x38, 0x1c, 0x21, 0x1c, 0x10, 0xf0, 0xb2, - 0xfa, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x9c, 0xbb, 0x03, 0x20, 0x80, 0xb5, 0x07, - 0x48, 0xc0, 0x6b, 0x00, 0x28, 0x06, 0xd0, 0x07, - 0x68, 0x05, 0xa2, 0x00, 0x21, 0xff, 0xf7, 0xd2, - 0xff, 0x38, 0x1c, 0xf8, 0xd1, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x37, 0x37, 0x35, 0x00, 0x00, 0xb0, 0xb5, 0x0c, - 0x1c, 0x15, 0x1c, 0x07, 0x1c, 0xff, 0xf7, 0x54, - 0xff, 0x01, 0x23, 0x1b, 0x03, 0x98, 0x42, 0x0b, - 0xd0, 0x61, 0x1e, 0xc9, 0x00, 0xc9, 0x19, 0xca, - 0x69, 0x00, 0x2a, 0x05, 0xd1, 0x88, 0x61, 0xcd, - 0x61, 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x20, 0xfa, 0xe7, 0x90, 0xb5, 0xff, - 0xf7, 0xa5, 0xfe, 0x07, 0x1c, 0x17, 0xd0, 0xb8, - 0x6c, 0x00, 0x28, 0x14, 0xd0, 0x00, 0x24, 0xbc, - 0x64, 0xe8, 0xf7, 0xdf, 0xff, 0x00, 0x28, 0x0e, - 0xd0, 0x01, 0x21, 0x39, 0x64, 0xfc, 0x63, 0x92, - 0x22, 0x02, 0x60, 0xc7, 0x60, 0xba, 0x68, 0x02, - 0x61, 0x81, 0x61, 0x10, 0x22, 0x42, 0x61, 0x01, - 0x1c, 0x02, 0x20, 0xe9, 0xf7, 0x3d, 0xf8, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x07, - 0x1c, 0x80, 0x6c, 0x00, 0x28, 0x04, 0xd0, 0x04, - 0xa1, 0xfd, 0xf7, 0x5c, 0xfd, 0x00, 0x20, 0xb8, - 0x64, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x38, 0x34, 0x32, 0xed, 0x09, 0x00, 0x7f, 0x01, - 0x00, 0x00, 0x80, 0xb5, 0x82, 0xb0, 0x07, 0x1c, - 0x80, 0x6c, 0x00, 0x28, 0x02, 0xd0, 0x0b, 0xa1, - 0xfd, 0xf7, 0x43, 0xfd, 0x0f, 0x48, 0x00, 0x21, - 0x0f, 0x4a, 0x80, 0x69, 0xe8, 0xf7, 0x57, 0xfd, - 0x7a, 0x69, 0x0b, 0x1c, 0x0d, 0x49, 0x01, 0x92, - 0x00, 0x91, 0x19, 0x1c, 0x00, 0x23, 0x01, 0x22, - 0xfd, 0xf7, 0x1c, 0xfd, 0xb8, 0x64, 0x02, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, - 0x63, 0x5c, 0x68, 0x63, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x38, 0x35, 0x34, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0xe2, 0x04, - 0x00, 0x00, 0x7d, 0x7b, 0x01, 0x20, 0x08, 0xb5, - 0x07, 0x4a, 0x01, 0x1c, 0x50, 0x68, 0x01, 0x30, - 0x50, 0x60, 0x4a, 0x69, 0x00, 0x92, 0xca, 0x68, - 0x0b, 0x69, 0x03, 0x49, 0x01, 0xf0, 0x06, 0xfa, - 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x0d, 0x0c, 0x00, 0x00, 0x00, 0xb5, - 0x06, 0x4a, 0x01, 0x1c, 0x50, 0x68, 0x01, 0x30, - 0x50, 0x60, 0xca, 0x68, 0x0b, 0x69, 0x03, 0x49, - 0x01, 0xf0, 0xf4, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x11, 0x0c, - 0x00, 0x00, 0x00, 0xb5, 0x06, 0x4a, 0x01, 0x1c, - 0x50, 0x68, 0x01, 0x30, 0x50, 0x60, 0xca, 0x68, - 0x0b, 0x69, 0x03, 0x49, 0x01, 0xf0, 0xe2, 0xf9, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x12, 0x0c, 0x00, 0x00, 0x90, 0xb5, - 0x91, 0xb0, 0x07, 0x1c, 0x13, 0x48, 0x40, 0x6d, - 0x40, 0x0d, 0x1e, 0xd3, 0xf8, 0x68, 0x00, 0x24, - 0x00, 0x28, 0x0d, 0xd9, 0x38, 0x69, 0xe1, 0x00, - 0x41, 0x18, 0x60, 0x00, 0x00, 0x19, 0x40, 0x00, - 0x68, 0x44, 0x06, 0x22, 0xe8, 0xf7, 0x9f, 0xfb, - 0xf8, 0x68, 0x01, 0x34, 0xa0, 0x42, 0xed, 0x09, - 0x00, 0x80, 0x01, 0xf1, 0xd8, 0xf8, 0x68, 0x7a, - 0x69, 0x69, 0x46, 0x01, 0xf0, 0x3d, 0xf8, 0x38, - 0x69, 0x06, 0xa1, 0x10, 0xf0, 0xb8, 0xf9, 0x78, - 0x69, 0x09, 0xa1, 0x10, 0xf0, 0xb4, 0xf9, 0x11, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x73, 0x72, 0x63, 0x5c, 0x68, - 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, - 0x3a, 0x20, 0x39, 0x32, 0x32, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x68, 0x63, 0x63, 0x6e, 0x74, - 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x39, 0x32, - 0x33, 0x00, 0x00, 0x00, 0xb5, 0x06, 0x49, 0x49, - 0x6d, 0x09, 0x0e, 0x06, 0xd3, 0xc1, 0x1d, 0x02, - 0x6a, 0xc0, 0x68, 0x09, 0x31, 0x0c, 0x30, 0x01, - 0xf0, 0x7a, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x00, 0xb5, 0x04, 0x49, 0x49, - 0x6d, 0xc9, 0x0d, 0x02, 0xd3, 0x0c, 0x30, 0x01, - 0xf0, 0x52, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x00, 0xb5, 0x04, 0x49, 0x49, - 0x6d, 0x89, 0x0d, 0x02, 0xd3, 0x0c, 0x30, 0x01, - 0xf0, 0x2a, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x00, 0xb5, 0x06, 0x49, 0x49, - 0x6d, 0x89, 0x0a, 0x05, 0xd3, 0x01, 0x69, 0x42, - 0x69, 0x49, 0x69, 0xc0, 0x68, 0x00, 0xf0, 0x8a, - 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0x00, 0xb5, 0x05, 0x49, 0x49, - 0x6d, 0x49, 0x0a, 0x04, 0xd3, 0x01, 0x69, 0x49, - 0x69, 0xc0, 0x68, 0x00, 0xf0, 0x61, 0xfe, 0x08, - 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, 0x00, - 0xb5, 0x05, 0x49, 0x49, 0x6d, 0x89, 0x09, 0x04, - 0xd3, 0x01, 0x69, 0x49, 0x69, 0xc0, 0x68, 0x00, - 0xf0, 0xf6, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x90, 0xb5, 0xc4, 0x68, 0x2a, - 0x4b, 0xed, 0x09, 0x00, 0x81, 0x01, 0x27, 0x4f, - 0x27, 0x4a, 0x28, 0x49, 0x9c, 0x42, 0x2d, 0xd0, - 0x02, 0x33, 0x9c, 0x42, 0x03, 0xd0, 0x27, 0x4b, - 0x9c, 0x42, 0x3a, 0xd1, 0x13, 0xe0, 0x53, 0x68, - 0x01, 0x2b, 0x10, 0xd0, 0x0b, 0x68, 0x00, 0x2b, - 0x0d, 0xd1, 0x02, 0x69, 0x00, 0x2a, 0x07, 0xd0, - 0x40, 0x69, 0x39, 0x1c, 0x00, 0x28, 0x00, 0xd0, - 0x41, 0x69, 0x10, 0x1c, 0x00, 0xf0, 0xd2, 0xfd, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x52, 0x68, - 0x01, 0x2a, 0x22, 0xd0, 0x09, 0x68, 0x00, 0x29, - 0x1f, 0xd1, 0x02, 0x69, 0x00, 0x2a, 0xf3, 0xd0, - 0x40, 0x69, 0x39, 0x1c, 0x00, 0x28, 0x00, 0xd0, - 0x41, 0x69, 0x10, 0x1c, 0x00, 0x22, 0x00, 0xf0, - 0xfe, 0xfd, 0xe9, 0xe7, 0x52, 0x68, 0x01, 0x2a, - 0x0f, 0xd0, 0x09, 0x68, 0x00, 0x29, 0x0c, 0xd1, - 0x02, 0x69, 0x00, 0x2a, 0xe0, 0xd0, 0x40, 0x69, - 0x39, 0x1c, 0x00, 0x28, 0x00, 0xd0, 0x41, 0x69, - 0x10, 0x1c, 0x00, 0x22, 0x01, 0xf0, 0x5e, 0xf8, - 0xd6, 0xe7, 0x09, 0x4a, 0x51, 0x68, 0x01, 0x31, - 0x51, 0x60, 0xc2, 0x68, 0x00, 0x69, 0x00, 0xf0, - 0xbd, 0xfe, 0xcd, 0xe7, 0xff, 0x0f, 0x00, 0x00, - 0x24, 0x68, 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, - 0x0f, 0x04, 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x80, 0xb5, 0x01, 0x1c, - 0x16, 0x48, 0xca, 0x1d, 0x43, 0x68, 0x0d, 0x32, - 0x01, 0x2b, 0x15, 0x48, 0x03, 0xd0, 0x15, 0x4b, - 0x1b, 0x68, 0x00, 0x2b, 0x0b, 0xd0, 0x43, 0x68, - 0x01, 0x33, 0x43, 0x60, 0x18, 0x1c, 0x13, 0x1c, - 0x0a, 0x69, 0xc9, 0x68, 0x01, 0xf0, 0xd3, 0xf8, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xcf, 0x68, - 0x0d, 0x4b, 0x9f, 0x42, 0xf8, 0xd0, 0x01, 0x33, - 0x9f, 0x42, 0xf5, 0xd0, 0x0b, 0x4b, 0x9f, 0x42, - 0xf2, 0xd0, 0x01, 0x33, 0xed, 0x09, 0x00, 0x82, - 0x01, 0x9f, 0x42, 0xef, 0xd0, 0x43, 0x68, 0x01, - 0x33, 0x43, 0x60, 0x18, 0x1c, 0x13, 0x1c, 0x0a, - 0x69, 0xc9, 0x68, 0x01, 0xf0, 0xba, 0xf8, 0xe5, - 0xe7, 0x24, 0x68, 0x03, 0x20, 0x60, 0xbb, 0x03, - 0x20, 0xc0, 0x69, 0x03, 0x20, 0x0b, 0x04, 0x00, - 0x00, 0x0d, 0x04, 0x00, 0x00, 0x00, 0xb5, 0x09, - 0x49, 0x4a, 0x68, 0x53, 0x1c, 0x4b, 0x60, 0xc2, - 0x68, 0x00, 0x2a, 0x02, 0xd0, 0xca, 0x68, 0x00, - 0x2a, 0x01, 0xd1, 0xca, 0x68, 0x8a, 0x60, 0xc2, - 0x68, 0x18, 0x1c, 0x03, 0x49, 0x01, 0xf0, 0x9d, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, - 0x20, 0x1a, 0x0c, 0x00, 0x00, 0x90, 0xb5, 0x86, - 0xb0, 0x07, 0x1c, 0x15, 0x48, 0x41, 0x6d, 0x89, - 0x08, 0x21, 0xd3, 0xc1, 0x1d, 0x79, 0x31, 0xc9, - 0x6a, 0xfc, 0x1d, 0x05, 0x34, 0x02, 0x29, 0x06, - 0xd1, 0x06, 0x22, 0xb0, 0x30, 0x21, 0x1c, 0x0d, - 0xf0, 0x41, 0xfe, 0x00, 0x28, 0x13, 0xd1, 0xf8, - 0x69, 0xfa, 0x1d, 0x05, 0x90, 0x78, 0x69, 0x19, - 0x32, 0x04, 0x90, 0xb8, 0x69, 0xf9, 0x1d, 0x03, - 0x90, 0x05, 0xa8, 0x00, 0x90, 0x1d, 0x31, 0x01, - 0x91, 0x01, 0x20, 0x02, 0x92, 0x04, 0xaa, 0x21, - 0x1c, 0x03, 0xab, 0x00, 0xf0, 0x4c, 0xfc, 0x06, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x60, 0xbb, 0x03, 0x20, 0x00, 0xb5, 0x05, - 0x4a, 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, 0xc0, - 0x68, 0x03, 0x4a, 0x00, 0xf0, 0x25, 0xfe, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, - 0x20, 0x01, 0x04, 0x00, 0x00, 0x00, 0xb5, 0x05, - 0x4a, 0x01, 0x1c, 0x50, 0x68, 0x01, 0x30, 0x50, - 0x60, 0xca, 0x68, 0x03, 0x49, 0x01, 0xf0, 0x4d, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, - 0x20, 0x02, 0x04, 0x00, 0x00, 0x00, 0xb5, 0xed, - 0x09, 0x00, 0x83, 0x01, 0x04, 0x49, 0x49, 0x6d, - 0x49, 0x08, 0x02, 0xd3, 0xc0, 0x68, 0x00, 0xf0, - 0x08, 0xfc, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0xb0, 0xb5, 0x17, 0x4d, 0x07, 0x1c, - 0x68, 0x68, 0x01, 0x30, 0x68, 0x60, 0xf8, 0x68, - 0xff, 0xf7, 0xf1, 0xfc, 0x00, 0x28, 0x1b, 0xd0, - 0xbc, 0x69, 0x00, 0x2c, 0x05, 0xd1, 0x79, 0x69, - 0x00, 0x29, 0x10, 0xd1, 0x39, 0x69, 0x81, 0x60, - 0x0a, 0xe0, 0x79, 0x69, 0x00, 0x29, 0x03, 0xd0, - 0x01, 0x21, 0x09, 0x03, 0x01, 0x63, 0x03, 0xe0, - 0x0b, 0xa2, 0x00, 0x21, 0xff, 0xf7, 0x4b, 0xfd, - 0x78, 0x69, 0x00, 0x28, 0x07, 0xd0, 0x69, 0x68, - 0x20, 0x1c, 0x0b, 0x4a, 0x00, 0xf0, 0xdb, 0xfd, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x69, 0x68, - 0x20, 0x1c, 0x08, 0x4a, 0x00, 0xf0, 0xd3, 0xfd, - 0xf6, 0xe7, 0x60, 0xbb, 0x03, 0x20, 0x73, 0x72, - 0x63, 0x5c, 0x68, 0x63, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x31, 0x39, - 0x32, 0x00, 0x07, 0x04, 0x00, 0x00, 0x05, 0x04, - 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0xc5, 0x69, - 0x10, 0x30, 0x00, 0x2d, 0x2f, 0xd0, 0xff, 0xf7, - 0xf0, 0xfb, 0x00, 0x28, 0x28, 0xd0, 0x01, 0x22, - 0x29, 0x1c, 0xff, 0xf7, 0x5c, 0xfd, 0x07, 0x1c, - 0x22, 0xd0, 0x1e, 0x4e, 0xf0, 0x1d, 0x79, 0x30, - 0x40, 0x6a, 0x00, 0x28, 0x27, 0xd0, 0xe8, 0xf7, - 0x55, 0xfd, 0x00, 0x28, 0x18, 0xd0, 0x1a, 0x49, - 0x49, 0x68, 0x01, 0x29, 0x03, 0xd0, 0x19, 0x49, - 0x09, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x71, 0x68, - 0x01, 0x39, 0x71, 0x60, 0x01, 0x22, 0xfa, 0x63, - 0x92, 0x21, 0x01, 0x60, 0xc7, 0x60, 0xb9, 0x68, - 0x01, 0x61, 0x00, 0x21, 0x41, 0x61, 0x82, 0x61, - 0x01, 0x1c, 0x02, 0x20, 0xe8, 0xf7, 0xa9, 0xfd, - 0xf0, 0xbc, 0xed, 0x09, 0x00, 0x84, 0x01, 0x08, - 0xbc, 0x18, 0x47, 0x0e, 0xa1, 0xff, 0xf7, 0xcf, - 0xfc, 0x07, 0x1c, 0xf7, 0xd0, 0xe0, 0x68, 0xb8, - 0x60, 0xd1, 0xe7, 0x38, 0x1c, 0xff, 0xf7, 0x79, - 0xfd, 0x70, 0x6d, 0x00, 0x09, 0xee, 0xd3, 0x01, - 0x22, 0x00, 0x2d, 0x00, 0xd0, 0x00, 0x22, 0xf8, - 0x1d, 0x05, 0x30, 0xa1, 0x69, 0x00, 0xf0, 0x19, - 0xfc, 0xe4, 0xe7, 0x60, 0xbb, 0x03, 0x20, 0x24, - 0x68, 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, 0x73, - 0x72, 0x63, 0x5c, 0x68, 0x63, 0x63, 0x6e, 0x74, - 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x32, - 0x32, 0x30, 0x00, 0x98, 0xb5, 0x07, 0x1c, 0xc0, - 0x68, 0xff, 0xf7, 0x57, 0xfc, 0x00, 0x28, 0x10, - 0xd0, 0x04, 0x6c, 0x25, 0x4b, 0x26, 0x4a, 0x26, - 0x49, 0x00, 0x2c, 0x0d, 0xd0, 0x00, 0x27, 0x07, - 0x64, 0x48, 0x68, 0x01, 0x28, 0x02, 0xd0, 0x10, - 0x68, 0x00, 0x28, 0x02, 0xd0, 0x58, 0x68, 0x01, - 0x30, 0x58, 0x60, 0x98, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xc4, 0x6b, 0x00, 0x2c, 0x1a, 0xd0, 0x49, - 0x68, 0x01, 0x29, 0x02, 0xd0, 0x11, 0x68, 0x00, - 0x29, 0x07, 0xd0, 0x58, 0x68, 0x1a, 0x4a, 0x41, - 0x1c, 0x59, 0x60, 0x38, 0x69, 0x00, 0xf0, 0x39, - 0xfd, 0xeb, 0xe7, 0x39, 0x69, 0x00, 0x29, 0xe8, - 0xd0, 0x00, 0x22, 0x00, 0x92, 0xc2, 0x1d, 0x05, - 0x32, 0x01, 0x23, 0x08, 0x1c, 0x13, 0x49, 0x00, - 0xf0, 0xa8, 0xfb, 0xde, 0xe7, 0x49, 0x68, 0x01, - 0x29, 0x02, 0xd0, 0x11, 0x68, 0x00, 0x29, 0x07, - 0xd0, 0x58, 0x68, 0x0e, 0x4a, 0x41, 0x1c, 0x59, - 0x60, 0x38, 0x69, 0x00, 0xf0, 0x1e, 0xfd, 0xd0, - 0xe7, 0x39, 0x69, 0x00, 0x29, 0xcd, 0xd0, 0x00, - 0x22, 0x00, 0x92, 0xc2, 0x1d, 0x05, 0x32, 0x01, - 0x23, 0x08, 0x1c, 0x05, 0x49, 0x00, 0xf0, 0x8d, - 0xfb, 0xc3, 0xe7, 0x60, 0xbb, 0xed, 0x09, 0x00, - 0x85, 0x01, 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, - 0x24, 0x68, 0x03, 0x20, 0x09, 0x04, 0x00, 0x00, - 0xff, 0x0f, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, - 0xf0, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xff, 0xf7, - 0xf7, 0xfb, 0x07, 0x1c, 0x07, 0xd0, 0x25, 0x69, - 0x00, 0x2d, 0x07, 0xd1, 0xb8, 0x6b, 0x00, 0x28, - 0x04, 0xd0, 0x04, 0x20, 0x78, 0x63, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x2d, 0x03, 0xd0, - 0xe8, 0x00, 0xc0, 0x19, 0x01, 0x69, 0x00, 0xe0, - 0x79, 0x69, 0x10, 0x4e, 0x70, 0x6d, 0x40, 0x09, - 0x0e, 0xd3, 0x60, 0x69, 0xa2, 0x69, 0x00, 0xf0, - 0xab, 0xfb, 0xf0, 0x1d, 0x79, 0x30, 0x81, 0x6a, - 0x00, 0x29, 0x05, 0xd0, 0x01, 0x39, 0x81, 0x62, - 0x02, 0xd1, 0x20, 0x20, 0x01, 0xf0, 0xb6, 0xfb, - 0x00, 0x2d, 0x04, 0xd0, 0x00, 0x20, 0xe9, 0x00, - 0xc9, 0x19, 0x48, 0x61, 0xdb, 0xe7, 0x38, 0x1c, - 0x01, 0x21, 0x03, 0xa2, 0xff, 0xf7, 0x34, 0xfc, - 0xd5, 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, - 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, 0x63, 0x6e, - 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x31, - 0x33, 0x37, 0x38, 0x00, 0xf8, 0xb5, 0xc7, 0x68, - 0x04, 0x1c, 0x00, 0x2f, 0x04, 0xd0, 0x38, 0x1c, - 0xff, 0xf7, 0xae, 0xfb, 0x07, 0x1c, 0x5e, 0xd0, - 0x25, 0x6a, 0x00, 0x2f, 0x1f, 0xd0, 0x01, 0x20, - 0xa1, 0x69, 0x00, 0x03, 0x00, 0x29, 0x0f, 0xd1, - 0x02, 0x21, 0x00, 0x2d, 0x0a, 0xd0, 0x3a, 0x6b, - 0x82, 0x42, 0x03, 0xd0, 0xeb, 0x00, 0xdb, 0x19, - 0x1a, 0x61, 0x38, 0x63, 0xe8, 0x00, 0xc0, 0x19, - 0x41, 0x61, 0x0c, 0xe0, 0x79, 0x63, 0x0a, 0xe0, - 0x00, 0x21, 0x00, 0x2d, 0x06, 0xd0, 0x38, 0x63, - 0x03, 0x2d, 0x04, 0xd8, 0xe8, 0x00, 0xc0, 0x19, - 0x41, 0x61, 0x00, 0xe0, 0x79, 0x63, 0x24, 0x48, - 0xed, 0x09, 0x00, 0x86, 0x01, 0x04, 0x23, 0x40, - 0x6d, 0x18, 0x40, 0xe6, 0x1d, 0x09, 0x36, 0x00, - 0x28, 0x27, 0xd0, 0x00, 0x2f, 0x0d, 0xd0, 0x00, - 0x2d, 0x08, 0xd0, 0x03, 0x2d, 0x03, 0xd8, 0xe8, - 0x00, 0xc0, 0x19, 0x01, 0x69, 0x00, 0xe0, 0x1c, - 0x49, 0x00, 0x23, 0x04, 0xe0, 0x01, 0x23, 0x79, - 0x69, 0x01, 0xe0, 0x19, 0x49, 0x01, 0x23, 0x62, - 0x6a, 0x00, 0x92, 0xfa, 0x1d, 0x05, 0x32, 0x00, - 0x2f, 0x00, 0xd1, 0x32, 0x1c, 0xa0, 0x69, 0x00, - 0xf0, 0xe9, 0xfa, 0xa0, 0x69, 0x00, 0x28, 0x08, - 0xd1, 0x12, 0x48, 0x81, 0x6a, 0x01, 0x31, 0x81, - 0x62, 0x01, 0x29, 0x02, 0xd1, 0x20, 0x20, 0x01, - 0xf0, 0x3f, 0xfb, 0x00, 0x2d, 0x09, 0xd1, 0xa0, - 0x69, 0x00, 0x28, 0x06, 0xd0, 0x00, 0x2f, 0x07, - 0xd0, 0x38, 0x1c, 0x01, 0x21, 0x0a, 0xa2, 0xff, - 0xf7, 0xbd, 0xfb, 0xf8, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x30, 0x1c, 0xff, 0xf7, 0x85, 0xfa, 0x00, - 0x28, 0xf7, 0xd0, 0x0a, 0xa2, 0x00, 0x21, 0xff, - 0xf7, 0xb1, 0xfb, 0xf2, 0xe7, 0x60, 0xbb, 0x03, - 0x20, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0xbb, 0x03, - 0x20, 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x31, 0x34, 0x37, 0x31, 0x00, 0x73, 0x72, 0x63, - 0x5c, 0x68, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x34, 0x37, 0x36, - 0x00, 0x90, 0xb5, 0x0f, 0x4c, 0x07, 0x1c, 0x60, - 0x68, 0x41, 0x1c, 0x61, 0x60, 0x78, 0x69, 0x00, - 0x28, 0x11, 0xd0, 0xf8, 0x68, 0x00, 0x28, 0x0b, - 0xd0, 0xff, 0xf7, 0x18, 0xfb, 0x00, 0x28, 0x07, - 0xd0, 0xc3, 0x1d, 0x05, 0x33, 0x85, 0x21, 0x3a, - 0x69, 0x60, 0x68, 0xc9, 0x00, 0x00, 0xf0, 0x4f, - 0xfe, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, - 0x69, 0x02, 0x4a, 0xed, 0x09, 0x00, 0x87, 0x01, - 0x00, 0xf0, 0x0f, 0xfc, 0xf7, 0xe7, 0x60, 0xbb, - 0x03, 0x20, 0x06, 0x04, 0x00, 0x00, 0x08, 0xb5, - 0x08, 0x4a, 0x01, 0x1c, 0x50, 0x68, 0x01, 0x30, - 0x50, 0x60, 0x0a, 0x69, 0x00, 0x92, 0xc9, 0x68, - 0x00, 0x22, 0x4b, 0x69, 0x04, 0x49, 0x00, 0xf0, - 0x35, 0xfe, 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x36, 0x0c, - 0x00, 0x00, 0x08, 0xb5, 0x08, 0x49, 0x49, 0x6d, - 0x09, 0x0b, 0x08, 0xd3, 0xc2, 0x69, 0x10, 0x30, - 0x00, 0x92, 0x0e, 0xc8, 0x1c, 0x38, 0x49, 0x69, - 0xc0, 0x68, 0x00, 0xf0, 0x80, 0xfb, 0x01, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x00, 0xb5, 0x06, 0x49, 0x49, 0x6d, - 0xc9, 0x0a, 0x06, 0xd3, 0x01, 0x69, 0xc2, 0x1d, - 0x49, 0x69, 0xc0, 0x68, 0x0d, 0x32, 0x00, 0xf0, - 0x4b, 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x08, 0xb5, 0x08, 0x4a, 0x01, 0x1c, - 0x50, 0x68, 0x01, 0x30, 0x50, 0x60, 0xca, 0x1d, - 0x09, 0x32, 0x00, 0x92, 0xcb, 0x68, 0x04, 0x49, - 0x00, 0x22, 0x00, 0xf0, 0xfb, 0xfd, 0x01, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x39, 0x0c, 0x00, 0x00, 0x80, 0xb5, - 0x07, 0x1c, 0x08, 0x48, 0x40, 0x6d, 0xc0, 0x09, - 0x09, 0xd3, 0xf8, 0x68, 0xf9, 0x1d, 0x09, 0x31, - 0xba, 0x69, 0x00, 0xf0, 0xac, 0xfa, 0xb8, 0x69, - 0x04, 0xa1, 0x0f, 0xf0, 0xe2, 0xfd, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, - 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, - 0x20, 0x31, 0x35, 0x37, 0x30, 0x00, 0x80, 0xb5, - 0x84, 0xb0, 0x07, 0x1c, 0x0b, 0x48, 0x40, 0x6d, - 0x40, 0x0b, 0x0e, 0xd3, 0x1c, 0x37, 0xed, 0x09, - 0x00, 0x88, 0x01, 0x07, 0xcf, 0x28, 0x3f, 0x02, - 0x91, 0x01, 0x90, 0x03, 0x92, 0xba, 0x69, 0x00, - 0x92, 0x38, 0x69, 0x7b, 0x69, 0x41, 0x69, 0xf8, - 0x68, 0x00, 0x22, 0x00, 0xf0, 0x42, 0xfb, 0x04, - 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, - 0xbb, 0x03, 0x20, 0x00, 0xb5, 0x06, 0x49, 0x49, - 0x6d, 0x09, 0x0f, 0x05, 0xd3, 0x01, 0x69, 0x42, - 0x69, 0x49, 0x69, 0xc0, 0x68, 0x00, 0xf0, 0xed, - 0xfc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0x08, 0xb5, 0x08, 0x4a, 0x01, - 0x1c, 0x50, 0x68, 0x01, 0x30, 0x50, 0x60, 0x4a, - 0x69, 0x00, 0x92, 0xca, 0x68, 0x53, 0x69, 0x0a, - 0x69, 0x04, 0x49, 0x00, 0xf0, 0x99, 0xfd, 0x01, - 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, - 0xbb, 0x03, 0x20, 0x05, 0x14, 0x00, 0x00, 0x00, - 0xb5, 0x01, 0x1c, 0x05, 0x4a, 0xcb, 0x1d, 0x50, - 0x68, 0x05, 0x49, 0x01, 0x30, 0x50, 0x60, 0x00, - 0x22, 0x05, 0x33, 0x00, 0xf0, 0x85, 0xfd, 0x08, - 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, 0x09, - 0x10, 0x00, 0x00, 0x08, 0xb5, 0x01, 0x1c, 0xca, - 0x68, 0x40, 0x69, 0x52, 0x69, 0x4a, 0x61, 0xca, - 0x1d, 0x0d, 0x32, 0x00, 0x28, 0x08, 0xd0, 0x13, - 0x1c, 0x08, 0x22, 0x08, 0x69, 0x12, 0x21, 0x00, - 0xf0, 0x41, 0xfd, 0x01, 0xb0, 0x08, 0xbc, 0x18, - 0x47, 0x05, 0x4b, 0x58, 0x68, 0x01, 0x30, 0x58, - 0x60, 0x00, 0x92, 0x0a, 0x69, 0x03, 0x49, 0x20, - 0x23, 0x00, 0xf0, 0x62, 0xfd, 0xf1, 0xe7, 0x60, - 0xbb, 0x03, 0x20, 0x01, 0xfc, 0x00, 0x00, 0x00, - 0xb5, 0x06, 0x49, 0x49, 0x6d, 0x49, 0x0f, 0x05, - 0xd3, 0xc1, 0x68, 0x02, 0x69, 0x49, 0x69, 0x40, - 0x69, 0x00, 0xf0, 0xb1, 0xfc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x80, - 0xb5, 0xed, 0x09, 0x00, 0x89, 0x01, 0x07, 0x1c, - 0xfd, 0xf7, 0x14, 0xf8, 0x00, 0x21, 0x20, 0x20, - 0x01, 0xf0, 0xea, 0xf9, 0x09, 0x48, 0xc1, 0x1d, - 0x79, 0x31, 0x8a, 0x69, 0x00, 0x2a, 0x06, 0xd0, - 0x00, 0x20, 0x88, 0x61, 0x0a, 0xf0, 0x2a, 0xfd, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xfa, 0x68, - 0x40, 0x68, 0x03, 0x49, 0x00, 0xf0, 0x33, 0xfd, - 0xf6, 0xe7, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, - 0x03, 0x0c, 0x00, 0x00, 0x00, 0xb5, 0x06, 0x49, - 0x49, 0x6d, 0x89, 0x0c, 0x05, 0xd3, 0xc1, 0x1d, - 0x82, 0x69, 0x40, 0x69, 0x05, 0x31, 0x00, 0xf0, - 0x30, 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x00, 0xb5, 0x05, 0x49, - 0x49, 0x6d, 0xc9, 0x0e, 0x04, 0xd3, 0x01, 0x69, - 0xc0, 0x68, 0x40, 0x69, 0x00, 0xf0, 0x3a, 0xfc, - 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, - 0x00, 0xb5, 0x06, 0x49, 0x49, 0x6d, 0x09, 0x0a, - 0x05, 0xd3, 0xc1, 0x68, 0x42, 0x69, 0x49, 0x69, - 0x00, 0x69, 0x00, 0xf0, 0xf0, 0xf9, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, - 0x00, 0xb5, 0x06, 0x49, 0x49, 0x6d, 0x09, 0x0d, - 0x06, 0xd3, 0xc1, 0x68, 0x42, 0x69, 0x83, 0x69, - 0x49, 0x69, 0x00, 0x69, 0x00, 0xf0, 0x53, 0xfb, - 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, - 0xb8, 0xb5, 0x04, 0x1c, 0x01, 0x20, 0x00, 0x90, - 0xe0, 0x68, 0xff, 0xf7, 0xa7, 0xf9, 0x07, 0x1c, - 0x28, 0xd0, 0x61, 0x69, 0x38, 0x1c, 0x01, 0xf0, - 0xa2, 0xf9, 0x6a, 0x46, 0x01, 0x20, 0xf9, 0x1d, - 0x0d, 0x31, 0x00, 0xf0, 0x0b, 0xfb, 0x78, 0x6b, - 0x04, 0x28, 0x1b, 0xd1, 0xb8, 0x6b, 0x00, 0x28, - 0x18, 0xd1, 0x0e, 0x4d, 0x68, 0x6d, 0x40, 0x09, - 0x0f, 0xd3, 0xa2, 0x69, 0x79, 0x69, 0x60, 0x69, - 0x00, 0xf0, 0x5c, 0xf9, 0xed, 0x09, 0x00, 0x8a, - 0x01, 0xe8, 0x1d, 0x79, 0x30, 0x81, 0x6a, 0x00, - 0x29, 0x05, 0xd0, 0x01, 0x39, 0x81, 0x62, 0x02, - 0xd1, 0x20, 0x20, 0x01, 0xf0, 0x67, 0xf9, 0x38, - 0x1c, 0x01, 0x21, 0x04, 0xa2, 0xff, 0xf7, 0xec, - 0xf9, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x60, 0xbb, 0x03, 0x20, 0x73, 0x72, 0x63, - 0x5c, 0x68, 0x63, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x38, 0x30, 0x30, - 0x00, 0x00, 0xb5, 0x01, 0x69, 0x00, 0x29, 0x06, - 0xd0, 0xc0, 0x68, 0x00, 0x28, 0x05, 0xd1, 0x08, - 0x1c, 0x05, 0xa1, 0x0f, 0xf0, 0xa6, 0xfc, 0x08, - 0xbc, 0x18, 0x47, 0xc8, 0x65, 0x07, 0x48, 0xff, - 0xf7, 0x17, 0xf8, 0xff, 0xf7, 0x39, 0xf8, 0xf6, - 0xe7, 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x31, 0x38, 0x31, 0x39, 0x00, 0xb8, 0xbb, 0x03, - 0x20, 0x88, 0xb5, 0x07, 0x69, 0x00, 0x2f, 0x10, - 0xd0, 0xc0, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x69, - 0x46, 0xff, 0xf7, 0x2a, 0xf9, 0x00, 0x28, 0x04, - 0xd0, 0xf9, 0x69, 0xba, 0x69, 0x00, 0x98, 0x01, - 0xf0, 0x48, 0xfa, 0x38, 0x1c, 0x02, 0xa1, 0x0f, - 0xf0, 0x7c, 0xfc, 0x88, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x73, 0x72, 0x63, 0x5c, 0x68, 0x63, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x31, 0x38, 0x37, 0x39, 0x00, 0x90, 0xb5, 0x01, - 0x78, 0x01, 0x27, 0xc4, 0x19, 0x07, 0x29, 0x10, - 0xd2, 0x01, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, - 0x44, 0x0c, 0x03, 0x07, 0x07, 0x0c, 0x0c, 0x0c, - 0x00, 0x20, 0x1c, 0x01, 0xf0, 0x4b, 0xfa, 0x04, - 0xe0, 0x02, 0x1c, 0x20, 0x1c, 0x01, 0xf0, 0xac, - 0xf9, 0x07, 0x1c, 0x38, 0x1c, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb5, 0xed, - 0x09, 0x00, 0x8b, 0x01, 0xc1, 0xb0, 0x69, 0x46, - 0x04, 0x22, 0x00, 0xab, 0x1a, 0x70, 0x0e, 0x22, - 0x5a, 0x70, 0xc8, 0x70, 0x00, 0x20, 0x08, 0x71, - 0x48, 0x71, 0x05, 0x31, 0x48, 0x1c, 0x69, 0x46, - 0x41, 0x1a, 0xc8, 0x1e, 0x98, 0x70, 0x68, 0x46, - 0xfd, 0xf7, 0xe7, 0xf8, 0x41, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xc1, 0xb0, 0x69, 0x46, - 0x04, 0x22, 0x00, 0xab, 0x1a, 0x70, 0x01, 0x22, - 0x5a, 0x70, 0xc8, 0x70, 0x03, 0x31, 0x88, 0x18, - 0x69, 0x46, 0x41, 0x1a, 0xc8, 0x1e, 0x98, 0x70, - 0x68, 0x46, 0xfd, 0xf7, 0xd2, 0xf8, 0x41, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0xff, 0xb5, 0xc1, 0xb0, - 0x04, 0x25, 0x00, 0xab, 0x4b, 0x9a, 0x4c, 0x9f, - 0x1d, 0x70, 0x02, 0x25, 0x5d, 0x70, 0x6b, 0x46, - 0x5b, 0x19, 0x58, 0x70, 0x02, 0x33, 0x00, 0x24, - 0x00, 0x28, 0x0a, 0xd9, 0x00, 0x25, 0x0e, 0x78, - 0x01, 0x31, 0x01, 0x35, 0x1e, 0x70, 0x01, 0x33, - 0x06, 0x2d, 0xf8, 0xd3, 0x01, 0x34, 0x84, 0x42, - 0xf4, 0xd3, 0x00, 0x21, 0x00, 0x28, 0x07, 0xd9, - 0x43, 0x9d, 0x8c, 0x00, 0x2c, 0x59, 0x01, 0x31, - 0x1c, 0x70, 0x01, 0x33, 0x81, 0x42, 0xf7, 0xd3, - 0x00, 0x21, 0x00, 0x28, 0x07, 0xd9, 0x44, 0x9d, - 0x8c, 0x00, 0x2c, 0x59, 0x01, 0x31, 0x1c, 0x70, - 0x01, 0x33, 0x81, 0x42, 0xf7, 0xd3, 0x00, 0x21, - 0x00, 0x28, 0x07, 0xd9, 0x4a, 0x9d, 0x8c, 0x00, - 0x2c, 0x59, 0x01, 0x31, 0x1c, 0x70, 0x01, 0x33, - 0x81, 0x42, 0xf7, 0xd3, 0x00, 0x21, 0x00, 0x28, - 0x0c, 0xd9, 0x8c, 0x00, 0x15, 0x59, 0x1d, 0x70, - 0x15, 0x59, 0x2d, 0x0a, 0x5d, 0x70, 0x14, 0x59, - 0x24, 0x0c, 0x9c, 0x70, 0x03, 0x33, 0x01, 0x31, - 0x81, 0x42, 0xf2, 0xd3, 0x00, 0x21, 0x00, 0x28, - 0x09, 0xd9, 0x8a, 0x00, 0xbc, 0x58, 0x1c, 0x70, - 0xba, 0x58, 0xed, 0x09, 0x00, 0x8c, 0x01, 0x12, - 0x0a, 0x5a, 0x70, 0x02, 0x33, 0x01, 0x31, 0x81, - 0x42, 0xf5, 0xd3, 0x68, 0x46, 0x19, 0x1a, 0xc8, - 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfd, - 0xf7, 0x6e, 0xf8, 0x45, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0xc1, 0xb0, 0x1f, - 0x1c, 0x00, 0xab, 0x04, 0x26, 0x46, 0x9d, 0x1e, - 0x70, 0x03, 0x26, 0x5e, 0x70, 0x6b, 0x46, 0x9b, - 0x19, 0x18, 0x70, 0x58, 0x1c, 0x01, 0x70, 0x09, - 0x0a, 0x41, 0x70, 0x00, 0x21, 0x02, 0x30, 0x13, - 0x78, 0x01, 0x32, 0x01, 0x31, 0x03, 0x70, 0x01, - 0x30, 0x06, 0x29, 0xf8, 0xd3, 0x07, 0x70, 0x45, - 0x70, 0x69, 0x46, 0x02, 0x30, 0x41, 0x1a, 0xc8, - 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfd, - 0xf7, 0x46, 0xf8, 0x41, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x90, 0xb5, 0xc1, 0xb0, 0x6f, - 0x46, 0x04, 0x24, 0x00, 0xab, 0x1c, 0x70, 0x5c, - 0x70, 0xfb, 0x1c, 0x00, 0x27, 0x04, 0x78, 0x01, - 0x30, 0x01, 0x37, 0x1c, 0x70, 0x01, 0x33, 0x06, - 0x2f, 0xf8, 0xd3, 0x19, 0x70, 0x58, 0x1c, 0x0b, - 0x0a, 0x03, 0x70, 0x09, 0x0c, 0x41, 0x70, 0x82, - 0x70, 0x69, 0x46, 0x03, 0x30, 0x41, 0x1a, 0xc8, - 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfd, - 0xf7, 0x22, 0xf8, 0x41, 0xb0, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x90, 0xb5, 0xc1, 0xb0, 0x6f, - 0x46, 0x04, 0x24, 0x00, 0xab, 0x1c, 0x70, 0x05, - 0x24, 0x5c, 0x70, 0xf8, 0x70, 0xfb, 0x1c, 0x58, - 0x1c, 0x01, 0x70, 0x09, 0x0a, 0x41, 0x70, 0x82, - 0x70, 0x69, 0x46, 0x03, 0x30, 0x41, 0x1a, 0xc8, - 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfd, - 0xf7, 0x06, 0xf8, 0x41, 0xb0, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xc1, 0xb0, 0x6a, - 0x46, 0x04, 0x27, 0x00, 0xab, 0xed, 0x09, 0x00, - 0x8d, 0x01, 0x1f, 0x70, 0x06, 0x27, 0x5f, 0x70, - 0xd0, 0x70, 0x03, 0x32, 0x50, 0x1c, 0x01, 0x70, - 0x09, 0x0a, 0x41, 0x70, 0x69, 0x46, 0x02, 0x30, - 0x41, 0x1a, 0xc8, 0x1e, 0x98, 0x70, 0x68, 0x46, - 0xfc, 0xf7, 0xec, 0xff, 0x41, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0xc1, 0xb0, - 0x6f, 0x46, 0x04, 0x24, 0x00, 0xab, 0x1c, 0x70, - 0x07, 0x24, 0x5c, 0x70, 0xf8, 0x70, 0xfb, 0x1c, - 0x58, 0x1c, 0x00, 0x23, 0x0f, 0x78, 0x01, 0x31, - 0x01, 0x33, 0x07, 0x70, 0x01, 0x30, 0x06, 0x2b, - 0xf8, 0xd3, 0x00, 0x21, 0x13, 0x78, 0x01, 0x32, - 0x01, 0x31, 0x03, 0x70, 0x01, 0x30, 0xf8, 0x29, - 0xf8, 0xd3, 0x69, 0x46, 0x41, 0x1a, 0xc8, 0x1e, - 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, - 0xc5, 0xff, 0x41, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0xc1, 0xb0, 0x6f, 0x46, - 0x04, 0x24, 0x00, 0xab, 0x1c, 0x70, 0x08, 0x24, - 0x5c, 0x70, 0xf8, 0x70, 0xfb, 0x1c, 0x58, 0x1c, - 0x01, 0x70, 0x09, 0x0a, 0x41, 0x70, 0x82, 0x70, - 0x69, 0x46, 0x03, 0x30, 0x41, 0x1a, 0xc8, 0x1e, - 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, - 0xa9, 0xff, 0x41, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x80, 0xb5, 0xc1, 0xb0, 0x6a, 0x46, - 0x04, 0x27, 0x00, 0xab, 0x1f, 0x70, 0x09, 0x27, - 0x5f, 0x70, 0xd0, 0x70, 0x03, 0x32, 0x50, 0x1c, - 0x01, 0x70, 0x09, 0x0a, 0x41, 0x70, 0x69, 0x46, - 0x02, 0x30, 0x41, 0x1a, 0xc8, 0x1e, 0x98, 0x70, - 0x68, 0x46, 0xfc, 0xf7, 0x8f, 0xff, 0x41, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0xc1, 0xb0, 0x6f, 0x46, 0x04, 0x24, 0x00, 0xab, - 0x1c, 0x70, 0x0a, 0x24, 0x5c, 0x70, 0xf8, 0x70, - 0xfb, 0x1c, 0x58, 0x1c, 0x01, 0x70, 0x09, 0x0a, - 0xed, 0x09, 0x00, 0x8e, 0x01, 0x41, 0x70, 0x82, - 0x70, 0x69, 0x46, 0x03, 0x30, 0x41, 0x1a, 0xc8, - 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, - 0xf7, 0x73, 0xff, 0x41, 0xb0, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x90, 0xb5, 0xc1, 0xb0, 0x6f, - 0x46, 0x04, 0x24, 0x00, 0xab, 0x1c, 0x70, 0x0b, - 0x24, 0x5c, 0x70, 0xf8, 0x70, 0xfb, 0x1c, 0x58, - 0x1c, 0x01, 0x70, 0x09, 0x0a, 0x41, 0x70, 0x00, - 0x21, 0x02, 0x30, 0x13, 0x78, 0x01, 0x32, 0x01, - 0x31, 0x03, 0x70, 0x01, 0x30, 0x08, 0x29, 0xf8, - 0xd3, 0x69, 0x46, 0x41, 0x1a, 0xc8, 0x1e, 0x00, - 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, 0x50, - 0xff, 0x41, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0xc1, 0xb0, 0x6c, 0x46, 0x1f, - 0x1c, 0x00, 0xab, 0x04, 0x26, 0x46, 0x9d, 0x1e, - 0x70, 0x0c, 0x26, 0x5e, 0x70, 0xe0, 0x70, 0xe3, - 0x1c, 0x58, 0x1c, 0x01, 0x70, 0x09, 0x0a, 0x41, - 0x70, 0x82, 0x70, 0xc7, 0x70, 0x39, 0x0a, 0x01, - 0x71, 0x45, 0x71, 0x29, 0x0a, 0x81, 0x71, 0x69, - 0x46, 0x07, 0x30, 0x41, 0x1a, 0xc8, 0x1e, 0x00, - 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, 0x2c, - 0xff, 0x41, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xff, 0xb5, 0xc1, 0xb0, 0x6d, 0x46, 0x04, - 0x26, 0x00, 0xab, 0x4d, 0x98, 0x4c, 0x9a, 0x4a, - 0x9c, 0x4b, 0x9f, 0x1e, 0x70, 0x0d, 0x26, 0x5e, - 0x70, 0xeb, 0x1c, 0x41, 0x9d, 0x1d, 0x70, 0x59, - 0x70, 0x09, 0x0a, 0x99, 0x70, 0x02, 0x33, 0x59, - 0x1c, 0x43, 0x9b, 0x0b, 0x70, 0x44, 0x9b, 0x4b, - 0x70, 0x8c, 0x70, 0x23, 0x0a, 0xcb, 0x70, 0x23, - 0x0c, 0x0b, 0x71, 0x23, 0x0e, 0x4b, 0x71, 0x8f, - 0x71, 0x3b, 0x0a, 0xcb, 0x71, 0x3b, 0x0c, 0x0b, - 0x72, 0x3b, 0x0e, 0x4b, 0x72, 0x8a, 0x72, 0x13, - 0x0a, 0xcb, 0x72, 0xed, 0x09, 0x00, 0x8f, 0x01, - 0x13, 0x0c, 0x0b, 0x73, 0x12, 0x0e, 0x4a, 0x73, - 0x88, 0x73, 0x02, 0x0a, 0xca, 0x73, 0x02, 0x0c, - 0x0a, 0x74, 0x00, 0x0e, 0x48, 0x74, 0x11, 0x31, - 0x48, 0x1c, 0x69, 0x46, 0x41, 0x1a, 0xc8, 0x1e, - 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, - 0xea, 0xfe, 0x45, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0xc1, 0xb0, 0x6f, 0x46, - 0x04, 0x24, 0x00, 0xab, 0x1c, 0x70, 0x0f, 0x24, - 0x5c, 0x70, 0xf8, 0x70, 0xfb, 0x1c, 0x59, 0x70, - 0x9a, 0x70, 0x11, 0x0a, 0xd9, 0x70, 0x69, 0x46, - 0x18, 0x1d, 0x41, 0x1a, 0xc8, 0x1e, 0x00, 0xab, - 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, 0xcf, 0xfe, - 0x41, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0xc1, 0xb0, 0x69, 0x46, 0x04, 0x22, - 0x00, 0xab, 0x1a, 0x70, 0x10, 0x22, 0x5a, 0x70, - 0xc8, 0x70, 0x03, 0x31, 0x48, 0x1c, 0x69, 0x46, - 0x41, 0x1a, 0xc8, 0x1e, 0x98, 0x70, 0x68, 0x46, - 0xfc, 0xf7, 0xb9, 0xfe, 0x41, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xc1, 0xb0, 0x69, 0x46, - 0x04, 0x22, 0x00, 0xab, 0x1a, 0x70, 0x11, 0x22, - 0x5a, 0x70, 0xc8, 0x70, 0x00, 0x0a, 0x08, 0x71, - 0x04, 0x31, 0x48, 0x1c, 0x69, 0x46, 0x41, 0x1a, - 0xc8, 0x1e, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, - 0xa2, 0xfe, 0x41, 0xb0, 0x08, 0xbc, 0x18, 0x47, - 0x90, 0xb5, 0xc1, 0xb0, 0x6f, 0x46, 0x04, 0x24, - 0x00, 0xab, 0x1c, 0x70, 0x12, 0x24, 0x5c, 0x70, - 0xf8, 0x70, 0xfb, 0x1c, 0x58, 0x1c, 0x00, 0x23, - 0x0f, 0x78, 0x01, 0x31, 0x01, 0x33, 0x07, 0x70, - 0x01, 0x30, 0x06, 0x2b, 0xf8, 0xd3, 0x02, 0x70, - 0x69, 0x46, 0x01, 0x30, 0x41, 0x1a, 0xc8, 0x1e, - 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, - 0x82, 0xfe, 0x41, 0xb0, 0x90, 0xbc, 0xed, 0x09, - 0x00, 0x90, 0x01, 0x08, 0xbc, 0x18, 0x47, 0xb0, - 0xb5, 0xc1, 0xb0, 0x6f, 0x46, 0x04, 0x24, 0x00, - 0xab, 0x1c, 0x70, 0x13, 0x24, 0x5c, 0x70, 0xfb, - 0x1c, 0x18, 0x70, 0x01, 0x33, 0x00, 0x27, 0x00, - 0x28, 0x09, 0xd9, 0xbc, 0x00, 0x0d, 0x59, 0x1d, - 0x70, 0x0c, 0x59, 0x24, 0x0a, 0x5c, 0x70, 0x02, - 0x33, 0x01, 0x37, 0x87, 0x42, 0xf5, 0xd3, 0x00, - 0x21, 0x00, 0x28, 0x09, 0xd9, 0x8f, 0x00, 0xd4, - 0x59, 0x1c, 0x70, 0xd7, 0x59, 0x3f, 0x0a, 0x5f, - 0x70, 0x02, 0x33, 0x01, 0x31, 0x81, 0x42, 0xf5, - 0xd3, 0x68, 0x46, 0x19, 0x1a, 0xc8, 0x1e, 0x00, - 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, 0x51, - 0xfe, 0x41, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xb0, 0xb5, 0xc1, 0xb0, 0x6c, 0x46, 0x1f, - 0x1c, 0x00, 0xab, 0x04, 0x25, 0x1d, 0x70, 0x14, - 0x25, 0x5d, 0x70, 0xe0, 0x70, 0xe3, 0x1c, 0x58, - 0x1c, 0x01, 0x70, 0x09, 0x0a, 0x41, 0x70, 0x82, - 0x70, 0xc7, 0x70, 0x39, 0x0a, 0x01, 0x71, 0x69, - 0x46, 0x05, 0x30, 0x41, 0x1a, 0xc8, 0x1e, 0x00, - 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, 0x31, - 0xfe, 0x41, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xb0, 0xb5, 0xc1, 0xb0, 0x6f, 0x46, 0x04, - 0x24, 0x00, 0xab, 0x1c, 0x70, 0x15, 0x24, 0x5c, - 0x70, 0xfb, 0x1c, 0x18, 0x70, 0x01, 0x33, 0x00, - 0x24, 0x00, 0x28, 0x0a, 0xd9, 0x00, 0x27, 0x0d, - 0x78, 0x01, 0x31, 0x01, 0x37, 0x1d, 0x70, 0x01, - 0x33, 0x06, 0x2f, 0xf8, 0xd3, 0x01, 0x34, 0x84, - 0x42, 0xf4, 0xd3, 0x00, 0x27, 0x00, 0x28, 0x0a, - 0xd9, 0x00, 0x21, 0x14, 0x78, 0x01, 0x32, 0x01, - 0x31, 0x1c, 0x70, 0x01, 0x33, 0x10, 0x29, 0xf8, - 0xd3, 0x01, 0x37, 0x87, 0x42, 0xf4, 0xd3, 0x68, - 0x46, 0x19, 0x1a, 0xc8, 0x1e, 0x00, 0xab, 0x98, - 0x70, 0xed, 0x09, 0x00, 0x91, 0x01, 0x68, 0x46, - 0xfc, 0xf7, 0xfe, 0xfd, 0x41, 0xb0, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xc1, 0xb0, - 0x69, 0x46, 0x04, 0x22, 0x00, 0xab, 0x1a, 0x70, - 0x16, 0x22, 0x5a, 0x70, 0x00, 0x22, 0x03, 0x31, - 0x03, 0x78, 0x01, 0x30, 0x01, 0x32, 0x0b, 0x70, - 0x01, 0x31, 0x06, 0x2a, 0xf8, 0xd3, 0x68, 0x46, - 0x09, 0x1a, 0xc8, 0x1e, 0x00, 0xab, 0x98, 0x70, - 0x68, 0x46, 0xfc, 0xf7, 0xe1, 0xfd, 0x41, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xc1, 0xb0, - 0x69, 0x46, 0x04, 0x22, 0x00, 0xab, 0x1a, 0x70, - 0x17, 0x22, 0x5a, 0x70, 0x00, 0x22, 0x03, 0x31, - 0x03, 0x78, 0x01, 0x30, 0x01, 0x32, 0x0b, 0x70, - 0x01, 0x31, 0x06, 0x2a, 0xf8, 0xd3, 0x68, 0x46, - 0x09, 0x1a, 0xc8, 0x1e, 0x00, 0xab, 0x98, 0x70, - 0x68, 0x46, 0xfc, 0xf7, 0xc5, 0xfd, 0x41, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0xc1, 0xb0, - 0x6f, 0x46, 0x04, 0x24, 0x00, 0xab, 0x1c, 0x70, - 0x18, 0x24, 0x5c, 0x70, 0xfb, 0x1c, 0x00, 0x27, - 0x04, 0x78, 0x01, 0x30, 0x01, 0x37, 0x1c, 0x70, - 0x01, 0x33, 0x06, 0x2f, 0xf8, 0xd3, 0x00, 0x20, - 0x0f, 0x78, 0x01, 0x31, 0x01, 0x30, 0x1f, 0x70, - 0x01, 0x33, 0x10, 0x28, 0xf8, 0xd3, 0x69, 0x46, - 0x58, 0x1c, 0x41, 0x1a, 0x1a, 0x70, 0x00, 0xab, - 0xc8, 0x1e, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, - 0x9f, 0xfd, 0x41, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xc1, 0xb0, 0x69, 0x46, - 0x04, 0x22, 0x00, 0xab, 0x1a, 0x70, 0x1a, 0x22, - 0x5a, 0x70, 0xc8, 0x70, 0x03, 0x31, 0x48, 0x1c, - 0x69, 0x46, 0x41, 0x1a, 0xc8, 0x1e, 0x98, 0x70, - 0x68, 0x46, 0xfc, 0xf7, 0x89, 0xfd, 0x41, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xc1, 0xb0, - 0x6a, 0x46, 0x04, 0x27, 0xed, 0x09, 0x00, 0x92, - 0x01, 0x00, 0xab, 0x1f, 0x70, 0x1b, 0x27, 0x5f, - 0x70, 0xd0, 0x70, 0x00, 0x0a, 0x10, 0x71, 0x04, - 0x32, 0x51, 0x70, 0x69, 0x46, 0x90, 0x1c, 0x41, - 0x1a, 0xc8, 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, - 0x46, 0xfc, 0xf7, 0x70, 0xfd, 0x41, 0xb0, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0xc1, - 0xb0, 0x6f, 0x46, 0x04, 0x24, 0x00, 0xab, 0x1c, - 0x70, 0x1c, 0x24, 0x5c, 0x70, 0xf8, 0x70, 0xfb, - 0x1c, 0x58, 0x1c, 0x01, 0x70, 0x09, 0x0a, 0x41, - 0x70, 0x82, 0x70, 0x11, 0x0a, 0xc1, 0x70, 0x69, - 0x46, 0x04, 0x30, 0x41, 0x1a, 0xc8, 0x1e, 0x00, - 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, 0x52, - 0xfd, 0x41, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x90, 0xb5, 0xc1, 0xb0, 0x6f, 0x46, 0x04, - 0x24, 0x00, 0xab, 0x1c, 0x70, 0x1d, 0x24, 0x5c, - 0x70, 0xf8, 0x70, 0xfb, 0x1c, 0x58, 0x1c, 0x01, - 0x70, 0x09, 0x0a, 0x41, 0x70, 0x82, 0x70, 0x11, - 0x0a, 0xc1, 0x70, 0x69, 0x46, 0x04, 0x30, 0x41, - 0x1a, 0xc8, 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, - 0x46, 0xfc, 0xf7, 0x34, 0xfd, 0x41, 0xb0, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xc1, - 0xb0, 0x69, 0x46, 0x04, 0x22, 0x00, 0xab, 0x1a, - 0x70, 0x1e, 0x22, 0x5a, 0x70, 0xc8, 0x70, 0x00, - 0x0a, 0x08, 0x71, 0x04, 0x31, 0x48, 0x1c, 0x69, - 0x46, 0x41, 0x1a, 0xc8, 0x1e, 0x98, 0x70, 0x68, - 0x46, 0xfc, 0xf7, 0x1c, 0xfd, 0x41, 0xb0, 0x08, - 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xc1, 0xb0, 0x6a, - 0x46, 0x04, 0x27, 0x00, 0xab, 0x1f, 0x70, 0x1f, - 0x27, 0x5f, 0x70, 0x00, 0x23, 0x03, 0x32, 0x07, - 0x78, 0x01, 0x30, 0x01, 0x33, 0x17, 0x70, 0x01, - 0x32, 0x06, 0x2b, 0xf8, 0xd3, 0x11, 0x70, 0x69, - 0x46, 0x50, 0x1c, 0x41, 0x1a, 0xc8, 0x1e, 0xed, - 0x09, 0x00, 0x93, 0x01, 0x00, 0xab, 0x98, 0x70, - 0x68, 0x46, 0xfc, 0xf7, 0xfe, 0xfc, 0x41, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, - 0xc1, 0xb0, 0x6a, 0x46, 0x04, 0x27, 0x00, 0xab, - 0x1f, 0x70, 0x20, 0x27, 0x5f, 0x70, 0x00, 0x23, - 0x03, 0x32, 0x07, 0x78, 0x01, 0x30, 0x01, 0x33, - 0x17, 0x70, 0x01, 0x32, 0x06, 0x2b, 0xf8, 0xd3, - 0x11, 0x70, 0x69, 0x46, 0x50, 0x1c, 0x41, 0x1a, - 0xc8, 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, - 0xfc, 0xf7, 0xdf, 0xfc, 0x41, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0xc1, 0xb0, - 0x6c, 0x46, 0x1f, 0x1c, 0x00, 0xab, 0x04, 0x25, - 0x1d, 0x70, 0xff, 0x25, 0x5d, 0x70, 0xe0, 0x70, - 0xe3, 0x1c, 0x59, 0x70, 0x9a, 0x70, 0x98, 0x1c, - 0x43, 0x1c, 0x00, 0x20, 0x00, 0x2a, 0x0f, 0xd9, - 0x81, 0x00, 0x7c, 0x58, 0x1c, 0x70, 0x7c, 0x58, - 0x24, 0x0a, 0x5c, 0x70, 0x7c, 0x58, 0x24, 0x0c, - 0x9c, 0x70, 0x79, 0x58, 0x09, 0x0e, 0xd9, 0x70, - 0x04, 0x33, 0x01, 0x30, 0x90, 0x42, 0xef, 0xd3, - 0x68, 0x46, 0x19, 0x1a, 0xc8, 0x1e, 0x00, 0xab, - 0x98, 0x70, 0x68, 0x46, 0xfc, 0xf7, 0xb1, 0xfc, - 0x41, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x0f, 0xb4, 0xf0, 0xb5, 0xcf, 0xb0, 0x69, 0x46, - 0x04, 0x22, 0x00, 0xab, 0x1a, 0x70, 0x0e, 0x22, - 0x5a, 0x70, 0xc8, 0x70, 0x03, 0x31, 0x48, 0x1c, - 0x55, 0x99, 0x01, 0x70, 0x55, 0x99, 0x09, 0x0a, - 0x41, 0x70, 0x57, 0xa9, 0x0b, 0x1d, 0x01, 0x30, - 0x42, 0x1c, 0x68, 0x46, 0x07, 0x30, 0xcf, 0x1f, - 0x41, 0x1c, 0x4c, 0x1c, 0xdd, 0x1f, 0x4e, 0x93, - 0x63, 0x1c, 0x4c, 0x93, 0x01, 0x33, 0x55, 0x9e, - 0x4d, 0x93, 0x4e, 0x9b, 0x39, 0x3d, 0x3c, 0x3b, - 0x4b, 0x93, 0xd2, 0x4b, 0x39, 0x3f, 0x9e, 0x42, - 0x51, 0xd0, 0xed, 0x09, 0x00, 0x94, 0x01, 0x51, - 0xdc, 0xd1, 0x4b, 0x9e, 0x42, 0x4f, 0xd0, 0x4f, - 0xdc, 0xd0, 0x4b, 0x9e, 0x42, 0x4d, 0xd0, 0x45, - 0xdc, 0xcf, 0x4b, 0x9e, 0x42, 0x4a, 0xd0, 0x1d, - 0xdc, 0xce, 0x4b, 0x9e, 0x42, 0x47, 0xd0, 0x08, - 0xdc, 0x02, 0x3b, 0x9e, 0x42, 0x44, 0xd0, 0xcb, - 0x4b, 0x9e, 0x42, 0x42, 0xd1, 0xf9, 0x6b, 0x11, - 0x70, 0xff, 0xe1, 0xc9, 0x4b, 0x9e, 0x42, 0x3d, - 0xd0, 0x01, 0x33, 0x9e, 0x42, 0x39, 0xd1, 0xf9, - 0x6b, 0x11, 0x70, 0xea, 0x6b, 0x00, 0x21, 0x53, - 0x5c, 0x01, 0x31, 0x03, 0x70, 0x01, 0x30, 0x06, - 0x29, 0xf9, 0xd3, 0xee, 0xe1, 0xc2, 0x4b, 0x9e, - 0x42, 0x72, 0xd0, 0x11, 0xdc, 0xc1, 0x4b, 0x9e, - 0x42, 0x6f, 0xd0, 0x85, 0x23, 0xdb, 0x00, 0x9e, - 0x42, 0x23, 0xd1, 0xf9, 0x6b, 0x11, 0x70, 0xea, - 0x6b, 0x00, 0x21, 0x53, 0x5c, 0x01, 0x31, 0x03, - 0x70, 0x01, 0x30, 0x06, 0x29, 0xf9, 0xd3, 0xd8, - 0xe1, 0xb9, 0x4b, 0x9e, 0x42, 0x5e, 0xd0, 0x01, - 0x33, 0x9e, 0x42, 0x12, 0xd1, 0xfb, 0x6b, 0x13, - 0x70, 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, - 0x70, 0x20, 0x1c, 0xca, 0xe1, 0xb3, 0x4b, 0xf6, - 0x18, 0x09, 0xe0, 0x85, 0xe2, 0x2a, 0xe0, 0xf3, - 0xe1, 0x14, 0xe0, 0x9c, 0xe1, 0x2e, 0xe1, 0x1f, - 0xe1, 0x18, 0xe1, 0x48, 0xe0, 0x1f, 0xe1, 0x12, - 0x2e, 0x45, 0xd2, 0x01, 0xa3, 0x9b, 0x5d, 0x5b, - 0x00, 0x9f, 0x44, 0xac, 0x84, 0xab, 0x84, 0x84, - 0xaa, 0xa9, 0xa8, 0xa7, 0x84, 0xa6, 0x84, 0x84, - 0x84, 0xa5, 0xa4, 0xa3, 0xa2, 0xa6, 0x4b, 0xf6, - 0x18, 0x16, 0x2e, 0x34, 0xd2, 0x02, 0xa3, 0x9b, - 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0xc8, - 0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0, - 0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8, - 0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xed, 0x09, 0x00, - 0x95, 0x01, 0x6b, 0x46, 0x0c, 0x33, 0x45, 0x93, - 0x01, 0x33, 0x46, 0x93, 0x01, 0x33, 0x49, 0x93, - 0x01, 0x33, 0x4a, 0x93, 0x5a, 0xab, 0x41, 0x93, - 0x04, 0x33, 0x43, 0x93, 0x04, 0x33, 0x47, 0x93, - 0x40, 0x3b, 0x48, 0x93, 0x43, 0x9b, 0x40, 0x3b, - 0x44, 0x93, 0x41, 0x9b, 0x40, 0x3b, 0x42, 0x93, - 0x91, 0x4b, 0x9e, 0x42, 0x2b, 0xd0, 0x2b, 0xdc, - 0x90, 0x4b, 0x9e, 0x42, 0x29, 0xd0, 0x15, 0xdc, - 0x8f, 0x4b, 0xf6, 0x18, 0x03, 0xe0, 0xfa, 0xe0, - 0xee, 0xe0, 0x3b, 0xe1, 0x46, 0xe0, 0x0f, 0x2e, - 0x3f, 0xd2, 0x02, 0xa3, 0x9b, 0x5d, 0x5b, 0x00, - 0x9f, 0x44, 0x00, 0x1c, 0xac, 0xab, 0xaa, 0x40, - 0xa9, 0x40, 0xa8, 0x40, 0x40, 0xa7, 0xa6, 0xa5, - 0xa4, 0xa3, 0xa2, 0x00, 0x85, 0x4b, 0x9e, 0x42, - 0x30, 0xd0, 0x30, 0xdc, 0x06, 0x3b, 0x9e, 0x42, - 0x2e, 0xd0, 0x0b, 0xdc, 0x82, 0x4b, 0x9e, 0x42, - 0x2b, 0xd0, 0x01, 0x33, 0x9e, 0x42, 0x29, 0xd1, - 0xf9, 0x6b, 0x11, 0x70, 0x54, 0xe1, 0xc2, 0xe2, - 0x48, 0xe0, 0x67, 0xe2, 0x7d, 0x4b, 0x9e, 0x42, - 0x38, 0xd0, 0x02, 0x33, 0x9e, 0x42, 0x1d, 0xd1, - 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, - 0x10, 0x0a, 0x08, 0x70, 0x4b, 0x98, 0xc0, 0x6b, - 0x20, 0x70, 0x42, 0x9b, 0x4c, 0x98, 0xd9, 0x6b, - 0x01, 0x70, 0x4d, 0x98, 0x09, 0x0a, 0x01, 0x70, - 0x44, 0x98, 0x45, 0x9b, 0xc0, 0x6b, 0x18, 0x70, - 0x46, 0x9b, 0x00, 0x0a, 0x18, 0x70, 0x49, 0x98, - 0x32, 0xe1, 0x55, 0xe0, 0x77, 0xe2, 0x02, 0xe0, - 0x4d, 0xe2, 0x46, 0xe2, 0x89, 0xe0, 0x6c, 0x4b, - 0x9e, 0x42, 0x34, 0xd0, 0x6b, 0x4b, 0x9e, 0x42, - 0x32, 0xd0, 0x01, 0x33, 0x9e, 0x42, 0x46, 0xd0, - 0x69, 0x4b, 0x9e, 0x42, 0x44, 0xd1, 0xfb, 0x6b, - 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, - 0xed, 0x09, 0x00, 0x96, 0x01, 0x08, 0x70, 0x4b, - 0x98, 0xc0, 0x6b, 0x20, 0x70, 0x4c, 0x98, 0x15, - 0xe1, 0x50, 0xe2, 0x33, 0xe1, 0x2f, 0xe1, 0x26, - 0xe1, 0x1f, 0xe1, 0x10, 0xe1, 0x0c, 0xe1, 0x08, - 0xe1, 0x01, 0xe1, 0xf8, 0xe0, 0xf4, 0xe0, 0xf0, - 0xe0, 0x5d, 0x4b, 0x9e, 0x42, 0x34, 0xd0, 0x34, - 0xdc, 0x07, 0x3b, 0x9e, 0x42, 0x32, 0xd0, 0x32, - 0xdc, 0x5a, 0x4b, 0x9e, 0x42, 0x30, 0xd0, 0x22, - 0xdc, 0x02, 0x3b, 0x9e, 0x42, 0x2d, 0xd0, 0x58, - 0x4b, 0x9e, 0x42, 0x1b, 0xd1, 0xf9, 0x6b, 0x11, - 0x70, 0xf4, 0xe0, 0x41, 0xe2, 0x4b, 0xe2, 0xaa, - 0xe1, 0xa6, 0xe1, 0x9f, 0xe1, 0x96, 0xe1, 0x87, - 0xe1, 0x83, 0xe1, 0x7a, 0xe1, 0x76, 0xe1, 0x6b, - 0xe1, 0x67, 0xe1, 0x60, 0xe1, 0x5c, 0xe1, 0x55, - 0xe1, 0x51, 0xe1, 0x42, 0xe1, 0x3e, 0xe1, 0x2f, - 0xe1, 0x2b, 0xe1, 0x24, 0xe1, 0x20, 0xe1, 0x17, - 0xe1, 0x13, 0xe1, 0x42, 0xe2, 0x38, 0xe0, 0x49, - 0x4b, 0x9e, 0x42, 0x33, 0xd0, 0x01, 0x33, 0x9e, - 0x42, 0x31, 0xd1, 0xf9, 0x6b, 0x11, 0x70, 0xd1, - 0xe0, 0x9c, 0xe2, 0x1a, 0xe0, 0x5e, 0xe2, 0x0c, - 0xe0, 0x4c, 0xe2, 0x45, 0xe2, 0xda, 0xe1, 0xd6, - 0xe1, 0xc0, 0xe1, 0xb9, 0xe1, 0xb0, 0xe1, 0xa1, - 0xe1, 0x9d, 0xe1, 0x99, 0xe1, 0x95, 0xe1, 0x8e, - 0xe1, 0x82, 0xe1, 0x3d, 0x4b, 0xf1, 0x18, 0x06, - 0x29, 0x1a, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x91, 0x90, 0x8f, - 0x8e, 0x8d, 0x8c, 0x38, 0x4b, 0xf6, 0x18, 0x0a, - 0x2e, 0x0e, 0xd2, 0x02, 0xa3, 0x9b, 0x5d, 0x5b, - 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x92, 0x91, 0x90, - 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0xf9, - 0x6b, 0x11, 0x70, 0xa3, 0xe0, 0x25, 0xe2, 0x02, - 0xe3, 0x01, 0xe3, 0xf9, 0x6b, 0x11, 0x70, 0x9d, - 0xe0, 0xf9, 0x6b, 0xed, 0x09, 0x00, 0x97, 0x01, - 0x11, 0x70, 0xea, 0x6b, 0x00, 0x21, 0x53, 0x5c, - 0x01, 0x31, 0x03, 0x70, 0x01, 0x30, 0x06, 0x29, - 0xf9, 0xd3, 0x92, 0xe0, 0xf9, 0x6b, 0x11, 0x70, - 0xea, 0x6b, 0x00, 0x21, 0x53, 0x5c, 0x01, 0x31, - 0x03, 0x70, 0x01, 0x30, 0x06, 0x29, 0xf9, 0xd3, - 0x87, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0xea, 0x6b, - 0x00, 0x21, 0x53, 0x5c, 0x01, 0x31, 0x03, 0x70, - 0x01, 0x30, 0x06, 0x29, 0xf9, 0xd3, 0x7c, 0xe0, - 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x13, 0x1c, - 0x35, 0xe0, 0x2c, 0x0c, 0x00, 0x00, 0x15, 0x0c, - 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x0d, 0x04, - 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x03, 0x04, - 0x00, 0x00, 0x0b, 0x04, 0x00, 0x00, 0x09, 0x08, - 0x00, 0x00, 0x0e, 0x04, 0x00, 0x00, 0x0c, 0x08, - 0x00, 0x00, 0xfd, 0xf3, 0xff, 0xff, 0xea, 0xf3, - 0xff, 0xff, 0x05, 0x14, 0x00, 0x00, 0x3c, 0x0c, - 0x00, 0x00, 0xd3, 0xf3, 0xff, 0xff, 0x07, 0x10, - 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0x03, 0x10, - 0x00, 0x00, 0x09, 0x10, 0x00, 0x00, 0x01, 0x14, - 0x00, 0x00, 0x03, 0x14, 0x00, 0x00, 0x0a, 0xfc, - 0x00, 0x00, 0x03, 0x18, 0x00, 0x00, 0x02, 0x18, - 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfc, 0x03, - 0xff, 0xff, 0xf5, 0x03, 0xff, 0xff, 0x03, 0x70, - 0x10, 0x0a, 0x08, 0x70, 0x4b, 0x98, 0xc0, 0x6b, - 0x20, 0x70, 0x4c, 0x98, 0x39, 0xe0, 0xfb, 0x6b, - 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, - 0x08, 0x70, 0x4b, 0x98, 0xc0, 0x6b, 0x20, 0x70, - 0x4c, 0x9b, 0x00, 0x0a, 0x18, 0x70, 0x4d, 0x98, - 0x2b, 0xe0, 0xeb, 0xe1, 0xe7, 0xe1, 0x89, 0xe2, - 0xe2, 0xe1, 0xd2, 0xe1, 0xce, 0xe1, 0xf9, 0x6b, - 0x11, 0x70, 0x22, 0xe0, 0x73, 0xe2, 0x6c, 0xe2, - 0x68, 0xe2, 0x64, 0xe2, 0x60, 0xe2, 0xed, 0x09, - 0x00, 0x98, 0x01, 0x59, 0xe2, 0x55, 0xe2, 0xf7, - 0xe1, 0xf3, 0xe1, 0xe7, 0xe1, 0xf9, 0x6b, 0x11, - 0x70, 0x15, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0x12, - 0xe0, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, - 0x70, 0x10, 0x0a, 0x08, 0x70, 0x20, 0x1c, 0x0a, - 0xe0, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, - 0x70, 0x08, 0x1c, 0x04, 0xe0, 0xf9, 0x6b, 0x11, - 0x70, 0x01, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0x4b, - 0xe1, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, - 0x70, 0x10, 0x0a, 0x08, 0x70, 0x4b, 0x98, 0xc0, - 0x6b, 0x20, 0x70, 0x4c, 0x9b, 0x00, 0x0a, 0x18, - 0x70, 0x4d, 0x98, 0x3d, 0xe1, 0xfb, 0x6b, 0x13, - 0x70, 0xea, 0x6b, 0x02, 0x70, 0x08, 0x1c, 0x37, - 0xe1, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, - 0x70, 0x10, 0x0a, 0x08, 0x70, 0x20, 0x1c, 0x2f, - 0xe1, 0xf9, 0x6b, 0x11, 0x70, 0x2c, 0xe1, 0xf9, - 0x6b, 0x11, 0x70, 0xec, 0x6b, 0x21, 0x1c, 0x07, - 0x1c, 0x0c, 0xf0, 0x6b, 0xfb, 0x20, 0x1c, 0x0c, - 0xf0, 0xb8, 0xfa, 0xc0, 0x19, 0x00, 0x21, 0x01, - 0x70, 0x01, 0x30, 0x1d, 0xe1, 0xfb, 0x6b, 0x13, - 0x70, 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, - 0x70, 0x20, 0x1c, 0x15, 0xe1, 0xf9, 0x6b, 0x11, - 0x70, 0x12, 0xe1, 0xfb, 0x6b, 0x13, 0x70, 0xea, - 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, 0x70, 0x20, - 0x1c, 0x0a, 0xe1, 0xf9, 0x6b, 0x11, 0x70, 0x07, - 0xe1, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, - 0x70, 0x08, 0x1c, 0x01, 0xe1, 0xf9, 0x6b, 0x11, - 0x70, 0xfe, 0xe0, 0xfb, 0x6b, 0x13, 0x70, 0xea, - 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, 0x70, 0x4b, - 0x98, 0xc0, 0x6b, 0x20, 0x70, 0x4c, 0x9b, 0x00, - 0x0a, 0x18, 0x70, 0x4d, 0x98, 0xf0, 0xe0, 0xf9, - 0x6b, 0x11, 0x70, 0xed, 0xe0, 0xfb, 0x6b, 0x13, - 0x70, 0xed, 0x09, 0x00, 0x99, 0x01, 0xea, 0x6b, - 0x02, 0x70, 0x10, 0x0a, 0x08, 0x70, 0x4b, 0x98, - 0xc0, 0x6b, 0x20, 0x70, 0x4c, 0x9b, 0x00, 0x0a, - 0x18, 0x70, 0x4d, 0x98, 0xdf, 0xe0, 0xf9, 0x6b, - 0x11, 0x70, 0xdc, 0xe0, 0xfb, 0x6b, 0x13, 0x70, - 0xea, 0x6b, 0x02, 0x70, 0x08, 0x1c, 0xd6, 0xe0, - 0xf9, 0x6b, 0x11, 0x70, 0xd3, 0xe0, 0xfb, 0x6b, - 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, 0x08, 0x1c, - 0xcd, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0xca, 0xe0, - 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, - 0x10, 0x0a, 0x08, 0x70, 0x10, 0x0c, 0x20, 0x70, - 0x4c, 0x98, 0xc0, 0xe0, 0xf9, 0x6b, 0x11, 0x70, - 0xbd, 0xe0, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, - 0x02, 0x70, 0x10, 0x0a, 0x08, 0x70, 0x20, 0x1c, - 0xb5, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0xb2, 0xe0, - 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, - 0x10, 0x0a, 0x08, 0x70, 0x4b, 0x98, 0xc0, 0x6b, - 0x20, 0x70, 0x4c, 0x9b, 0x00, 0x0a, 0x18, 0x70, - 0x4d, 0x98, 0xa4, 0xe0, 0xfb, 0x6b, 0x13, 0x70, - 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, 0x70, - 0x20, 0x1c, 0x9c, 0xe0, 0xfb, 0x6b, 0x13, 0x70, - 0xea, 0x6b, 0x02, 0x70, 0x08, 0x1c, 0x96, 0xe0, - 0xf9, 0x6b, 0x11, 0x70, 0x93, 0xe0, 0xfb, 0x6b, - 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, 0x08, 0x1c, - 0x8d, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0x8a, 0xe0, - 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, - 0x10, 0x0a, 0x08, 0x70, 0x4b, 0x98, 0xc0, 0x6b, - 0x20, 0x70, 0x4c, 0x98, 0x7f, 0xe0, 0xfb, 0x6b, - 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, 0x08, 0x1c, - 0x79, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0x76, 0xe0, - 0xf9, 0x6b, 0x11, 0x70, 0x73, 0xe0, 0xf9, 0x6b, - 0x11, 0x70, 0x70, 0xe0, 0xfb, 0x6b, 0x13, 0x70, - 0xea, 0x6b, 0x02, 0x70, 0xed, 0x09, 0x00, 0x9a, - 0x01, 0x10, 0x0a, 0x08, 0x70, 0x4b, 0x98, 0xc0, - 0x6b, 0x20, 0x70, 0x4c, 0x9b, 0x00, 0x0a, 0x18, - 0x70, 0x4d, 0x98, 0x62, 0xe0, 0xfb, 0x6b, 0x13, - 0x70, 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, - 0x70, 0x20, 0x1c, 0x5a, 0xe0, 0xfb, 0x6b, 0x13, - 0x70, 0xea, 0x6b, 0x02, 0x70, 0x08, 0x1c, 0x54, - 0xe0, 0xfb, 0x6b, 0x00, 0x27, 0x13, 0x70, 0xea, - 0x6b, 0x02, 0x70, 0x4b, 0x9b, 0x08, 0x1c, 0xd9, - 0x6b, 0x00, 0x2a, 0x4a, 0xd9, 0x08, 0xc9, 0x03, - 0x70, 0x1c, 0x0a, 0x1b, 0x0c, 0x44, 0x70, 0x83, - 0x70, 0x03, 0x30, 0x01, 0x37, 0x97, 0x42, 0xf5, - 0xd3, 0x46, 0xe1, 0xf9, 0x6b, 0x11, 0x70, 0x43, - 0xe1, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, - 0x70, 0x08, 0x1c, 0x3d, 0xe1, 0xf9, 0x6b, 0x11, - 0x70, 0x3a, 0xe1, 0xfb, 0x6b, 0x13, 0x70, 0xea, - 0x6b, 0x02, 0x70, 0x08, 0x1c, 0x34, 0xe1, 0xfb, - 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, 0x4b, - 0x98, 0xc0, 0x6b, 0x08, 0x70, 0x00, 0x0a, 0x20, - 0x70, 0x42, 0x9b, 0x4c, 0x98, 0xd9, 0x6b, 0x01, - 0x70, 0x44, 0x9b, 0x4d, 0x98, 0xd9, 0x6b, 0x01, - 0x70, 0x45, 0x9b, 0x08, 0x0a, 0x18, 0x70, 0x48, - 0x98, 0x46, 0x9b, 0xc0, 0x6b, 0x18, 0x70, 0x49, - 0x9b, 0x00, 0x0a, 0x18, 0x70, 0x4a, 0x98, 0x17, - 0xe1, 0xf9, 0x6b, 0x11, 0x70, 0xea, 0x6b, 0x00, - 0x21, 0x53, 0x5c, 0x01, 0x31, 0x03, 0x70, 0x01, - 0x30, 0x08, 0x29, 0xf9, 0xd3, 0x0c, 0xe1, 0xfb, - 0x6b, 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, 0x08, - 0x1c, 0x06, 0xe1, 0x05, 0xe1, 0xf9, 0x6b, 0x11, - 0x70, 0xea, 0x6b, 0x00, 0x21, 0x53, 0x5c, 0x01, - 0x31, 0x03, 0x70, 0x01, 0x30, 0x06, 0x29, 0xf9, - 0xd3, 0xfa, 0xe0, 0xfb, 0x6b, 0x13, 0x70, 0xea, - 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, 0x70, 0xed, - 0x09, 0x00, 0x9b, 0x01, 0x4b, 0x98, 0xc0, 0x6b, - 0x20, 0x70, 0x4c, 0x9b, 0x00, 0x0a, 0x18, 0x70, - 0x4d, 0x98, 0xec, 0xe0, 0xfb, 0x6b, 0x13, 0x70, - 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, 0x70, - 0x20, 0x1c, 0xe4, 0xe0, 0xfb, 0x6b, 0x13, 0x70, - 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, 0x70, - 0x4b, 0x98, 0xc0, 0x6b, 0x20, 0x70, 0x4c, 0x98, - 0xd9, 0xe0, 0xfb, 0x6b, 0x13, 0x70, 0xea, 0x6b, - 0x02, 0x70, 0x08, 0x1c, 0xd3, 0xe0, 0xf9, 0x6b, - 0x11, 0x70, 0xd0, 0xe0, 0xfb, 0x6b, 0x0c, 0x1c, - 0x13, 0x70, 0xef, 0x6b, 0x07, 0x70, 0x4b, 0x98, - 0xc1, 0x6b, 0x20, 0x1c, 0x3a, 0x1c, 0xe6, 0xf7, - 0x08, 0xfe, 0xe0, 0x19, 0xc3, 0xe0, 0xfb, 0x6b, - 0x13, 0x70, 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, - 0x08, 0x70, 0x4b, 0x98, 0xc0, 0x6b, 0x20, 0x70, - 0x4c, 0x9b, 0x00, 0x0a, 0x18, 0x70, 0x42, 0x9b, - 0x4d, 0x98, 0xdf, 0x6b, 0x07, 0x70, 0x44, 0x98, - 0x45, 0x9c, 0xc1, 0x6b, 0x20, 0x1c, 0x3a, 0x1c, - 0xe6, 0xf7, 0xef, 0xfd, 0xe0, 0x19, 0xaa, 0xe0, - 0xf9, 0x6b, 0x11, 0x70, 0xa7, 0xe0, 0xf9, 0x6b, - 0x11, 0x70, 0xec, 0x6b, 0x21, 0x1c, 0x07, 0x1c, - 0x0c, 0xf0, 0xdf, 0xf9, 0x20, 0x1c, 0x0c, 0xf0, - 0x2c, 0xf9, 0xc0, 0x19, 0x00, 0x21, 0x01, 0x70, - 0x01, 0x30, 0x98, 0xe0, 0xf9, 0x6b, 0x11, 0x70, - 0x95, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0x92, 0xe0, - 0xf9, 0x6b, 0x11, 0x70, 0xea, 0x6b, 0x00, 0x21, - 0x53, 0x5c, 0x01, 0x31, 0x03, 0x70, 0x01, 0x30, - 0x10, 0x29, 0xf9, 0xd3, 0x87, 0xe0, 0xf9, 0x6b, - 0x11, 0x70, 0x84, 0xe0, 0xf9, 0x6b, 0x11, 0x70, - 0xea, 0x6b, 0x00, 0x21, 0x53, 0x5c, 0x01, 0x31, - 0x03, 0x70, 0x01, 0x30, 0x10, 0x29, 0xf9, 0xd3, - 0x79, 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0x76, 0xe0, - 0xfb, 0x6b, 0xed, 0x09, 0x00, 0x9c, 0x01, 0x13, - 0x70, 0xea, 0x6b, 0x02, 0x70, 0x10, 0x0a, 0x08, - 0x70, 0x10, 0x0c, 0x20, 0x70, 0x4c, 0x98, 0x11, - 0x0e, 0x01, 0x70, 0x4b, 0x9b, 0x4d, 0x98, 0xd9, - 0x6b, 0x01, 0x70, 0x45, 0x9b, 0x08, 0x0a, 0x18, - 0x70, 0x46, 0x9b, 0x08, 0x0c, 0x18, 0x70, 0x49, - 0x9b, 0x08, 0x0e, 0x18, 0x70, 0x42, 0x98, 0x4a, - 0x9b, 0xc0, 0x6b, 0x18, 0x70, 0x02, 0x0a, 0x5a, - 0x70, 0x02, 0x0c, 0x00, 0x0e, 0x9a, 0x70, 0xd8, - 0x70, 0xd9, 0x1c, 0x44, 0x9b, 0x48, 0x1c, 0xd9, - 0x6b, 0x01, 0x70, 0x0a, 0x0a, 0x42, 0x70, 0x0a, - 0x0c, 0x82, 0x70, 0x09, 0x0e, 0xc1, 0x70, 0x48, - 0x99, 0x47, 0x9b, 0xc9, 0x6b, 0x01, 0x71, 0x0a, - 0x0a, 0x42, 0x71, 0x0a, 0x0c, 0x82, 0x71, 0x09, - 0x0e, 0xc1, 0x71, 0x07, 0x30, 0x41, 0x1c, 0x18, - 0x1d, 0xc2, 0x1f, 0x39, 0x3a, 0xd2, 0x6b, 0x0a, - 0x70, 0x13, 0x0a, 0x4b, 0x70, 0x13, 0x0c, 0x8b, - 0x70, 0x12, 0x0e, 0xca, 0x70, 0x03, 0x31, 0x4a, - 0x1c, 0x01, 0x1d, 0xc8, 0x1f, 0x39, 0x38, 0xc0, - 0x6b, 0x10, 0x70, 0x03, 0x0a, 0x53, 0x70, 0x03, - 0x0c, 0x93, 0x70, 0x00, 0x0e, 0xd0, 0x70, 0x09, - 0x68, 0x03, 0x32, 0x50, 0x1c, 0x01, 0x70, 0x0a, - 0x0a, 0x42, 0x70, 0x0a, 0x0c, 0x82, 0x70, 0x09, - 0x0e, 0xc1, 0x70, 0x04, 0x30, 0x19, 0xe0, 0xf9, - 0x6b, 0x11, 0x70, 0x16, 0xe0, 0xfb, 0x6b, 0x13, - 0x70, 0xea, 0x6b, 0x02, 0x70, 0x08, 0x1c, 0x10, - 0xe0, 0xf9, 0x6b, 0x11, 0x70, 0x0d, 0xe0, 0xf9, - 0x6b, 0x11, 0x70, 0x0a, 0xe0, 0xf9, 0x6b, 0x11, - 0x70, 0x07, 0xe0, 0xfb, 0x6b, 0x13, 0x70, 0xea, - 0x6b, 0x02, 0x70, 0x08, 0x1c, 0x01, 0xe0, 0xf9, - 0x6b, 0x11, 0x70, 0x69, 0x46, 0x41, 0x1a, 0xc8, - 0x1e, 0x00, 0xab, 0x98, 0x70, 0x68, 0x46, 0xfc, - 0xf7, 0x0e, 0xf8, 0x4f, 0xb0, 0xed, 0x09, 0x00, - 0x9d, 0x01, 0xf0, 0xbc, 0x08, 0xbc, 0x04, 0xb0, - 0x18, 0x47, 0xf9, 0xe7, 0x80, 0xb5, 0x00, 0x27, - 0x0b, 0xf0, 0xfe, 0xfa, 0x38, 0x1c, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x00, 0x27, - 0x38, 0x30, 0x01, 0x21, 0x04, 0x1c, 0x1b, 0xf0, - 0x35, 0xff, 0x02, 0x28, 0x05, 0xd3, 0x01, 0x21, - 0x20, 0x1c, 0x1b, 0xf0, 0x2b, 0xff, 0xff, 0x27, - 0x0f, 0x37, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0x0f, 0x1c, 0x01, 0x21, - 0x38, 0x30, 0x04, 0x1c, 0x1b, 0xf0, 0x1e, 0xff, - 0x00, 0x28, 0x03, 0xd1, 0x01, 0x21, 0x20, 0x1c, - 0x1b, 0xf0, 0x1c, 0xff, 0x38, 0x1c, 0x0e, 0xf0, - 0x63, 0xfd, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xb0, 0xb4, 0x00, 0x23, 0x00, 0x29, 0x0e, 0xd9, - 0x08, 0x4c, 0x07, 0x78, 0x15, 0x12, 0x7a, 0x40, - 0x12, 0x06, 0x12, 0x0e, 0x52, 0x00, 0xa2, 0x5a, - 0x6a, 0x40, 0x12, 0x04, 0x12, 0x0c, 0x01, 0x30, - 0x01, 0x33, 0x8b, 0x42, 0xf1, 0xd3, 0xb0, 0xbc, - 0x10, 0x1c, 0x70, 0x47, 0x18, 0xe0, 0x03, 0x20, - 0x80, 0xb5, 0x82, 0xb0, 0x13, 0x48, 0xc7, 0x6b, - 0x00, 0x2f, 0x1e, 0xd0, 0xb8, 0x68, 0x00, 0x28, - 0x0e, 0xd0, 0x78, 0x6b, 0x09, 0xf0, 0x10, 0xfa, - 0x02, 0x1c, 0xb8, 0x68, 0x81, 0x68, 0x01, 0x92, - 0x00, 0x91, 0x79, 0x69, 0xbb, 0x6b, 0x3a, 0x1c, - 0x0b, 0xa0, 0xfb, 0xf7, 0x7f, 0xfa, 0x09, 0xe0, - 0x78, 0x6b, 0x09, 0xf0, 0x01, 0xfa, 0x00, 0x90, - 0x79, 0x69, 0xbb, 0x6b, 0x18, 0xa0, 0x3a, 0x1c, - 0xfb, 0xf7, 0x74, 0xfa, 0x3f, 0x68, 0x00, 0x2f, - 0xe0, 0xd1, 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, - 0x3c, 0x25, 0x75, 0x3e, 0x2c, 0x20, 0x25, 0x23, - 0x70, 0x2c, 0x20, 0x48, 0x63, 0x4d, 0x69, 0x73, - 0xed, 0x09, 0x00, 0x9e, 0x01, 0x63, 0x53, 0x68, - 0x6f, 0x77, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x2c, - 0x20, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x25, 0x75, - 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x7b, 0x25, 0x75, 0x7d, - 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, 0x0a, - 0x0d, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x25, 0x75, - 0x3e, 0x2c, 0x20, 0x25, 0x23, 0x70, 0x2c, 0x20, - 0x48, 0x63, 0x4d, 0x69, 0x73, 0x63, 0x53, 0x68, - 0x6f, 0x77, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x2c, - 0x20, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x25, 0x75, - 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, 0x0a, - 0x0d, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x82, - 0xb0, 0x14, 0x1c, 0x07, 0x1c, 0x02, 0x78, 0x40, - 0x78, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x13, - 0x43, 0x1d, 0x1c, 0x02, 0x29, 0x20, 0xd1, 0x01, - 0x09, 0x8e, 0x07, 0xb6, 0x0f, 0x80, 0x09, 0x82, - 0x07, 0x92, 0x0f, 0x01, 0x92, 0xb8, 0x78, 0xf9, - 0x78, 0x09, 0x02, 0x01, 0x43, 0x0b, 0x1c, 0x00, - 0x91, 0x0e, 0xf0, 0x9e, 0xfc, 0x00, 0x9b, 0x39, - 0x1d, 0xc1, 0x61, 0x83, 0x61, 0x00, 0x22, 0x02, - 0x62, 0x10, 0x49, 0x42, 0x62, 0x01, 0x63, 0xc4, - 0x62, 0x03, 0x1c, 0x28, 0x1c, 0x31, 0x1c, 0x01, - 0x9a, 0xfd, 0xf7, 0x4e, 0xfd, 0x00, 0x20, 0x10, - 0xe0, 0xbe, 0x78, 0x0e, 0xf0, 0x89, 0xfc, 0x00, - 0x22, 0x82, 0x61, 0xc2, 0x61, 0xf9, 0x1c, 0x41, - 0x62, 0x06, 0x49, 0x06, 0x62, 0x01, 0x63, 0xc4, - 0x62, 0x01, 0x1c, 0x28, 0x1c, 0xfd, 0xf7, 0xb2, - 0xfd, 0x00, 0x20, 0x02, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xcd, 0x6a, 0x02, - 0x20, 0xf0, 0xb5, 0xed, 0x09, 0x00, 0x9f, 0x01, - 0x82, 0xb0, 0x6d, 0x46, 0x02, 0x26, 0x1f, 0x1c, - 0x00, 0xab, 0x07, 0x9c, 0x1e, 0x70, 0x58, 0x70, - 0x00, 0x0a, 0x00, 0x07, 0x00, 0x0f, 0x89, 0x07, - 0x89, 0x0f, 0x09, 0x01, 0x08, 0x43, 0xa8, 0x70, - 0xa9, 0x78, 0x90, 0x01, 0x08, 0x43, 0xab, 0x1c, - 0x21, 0x0a, 0xa8, 0x70, 0x5c, 0x70, 0x99, 0x70, - 0x00, 0x2c, 0x05, 0xd1, 0x68, 0x46, 0x0c, 0x22, - 0x05, 0x21, 0x09, 0xf0, 0x6a, 0xfa, 0x09, 0xe0, - 0x68, 0x46, 0x04, 0x22, 0x05, 0x21, 0x09, 0xf0, - 0x64, 0xfa, 0x08, 0x22, 0x38, 0x1c, 0x21, 0x1c, - 0x09, 0xf0, 0x5f, 0xfa, 0x02, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x98, 0xb5, 0x0c, 0x1c, - 0x69, 0x46, 0x17, 0x1c, 0x03, 0x22, 0x00, 0xab, - 0x1a, 0x70, 0x58, 0x70, 0x00, 0x0a, 0x00, 0x07, - 0x00, 0x0f, 0x88, 0x70, 0x02, 0x31, 0x48, 0x1c, - 0x07, 0x70, 0x00, 0x2f, 0x05, 0xd1, 0x68, 0x46, - 0x0c, 0x22, 0x04, 0x21, 0x09, 0xf0, 0x45, 0xfa, - 0x09, 0xe0, 0x68, 0x46, 0x04, 0x22, 0x04, 0x21, - 0x09, 0xf0, 0x3f, 0xfa, 0x08, 0x22, 0x20, 0x1c, - 0x39, 0x1c, 0x09, 0xf0, 0x3a, 0xfa, 0x98, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb5, - 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x93, 0x07, - 0x9b, 0x0f, 0x1b, 0x02, 0x18, 0x43, 0x93, 0x08, - 0x8a, 0x78, 0x03, 0x31, 0x04, 0x2b, 0x1b, 0xd0, - 0x0b, 0xdc, 0x00, 0x2b, 0x07, 0xd0, 0x01, 0x2b, - 0x10, 0xd0, 0x02, 0x2b, 0x11, 0xd0, 0x03, 0x2b, - 0x01, 0xd1, 0x00, 0xf0, 0x03, 0xf9, 0x08, 0xbc, - 0x18, 0x47, 0x05, 0x2b, 0x0f, 0xd0, 0x06, 0x2b, - 0x10, 0xd0, 0x3f, 0x2b, 0xf7, 0xd1, 0x00, 0xf0, - 0xa1, 0xfa, 0xf4, 0xe7, 0x00, 0xf0, 0x0d, 0xf8, - 0xf1, 0xe7, 0x00, 0xf0, 0xaf, 0xf8, 0xee, 0xe7, - 0x00, 0xf0, 0x39, 0xfa, 0xeb, 0xe7, 0xed, 0x09, - 0x00, 0xa0, 0x01, 0x00, 0xf0, 0x5e, 0xfa, 0xe8, - 0xe7, 0x00, 0xf0, 0x7a, 0xfa, 0xe5, 0xe7, 0x80, - 0xb5, 0x0f, 0x1c, 0x29, 0x28, 0x01, 0xd2, 0x43, - 0x00, 0x9f, 0x44, 0x2c, 0xe0, 0x2b, 0xe0, 0x26, - 0xe0, 0x2c, 0xe0, 0x30, 0xe0, 0x34, 0xe0, 0x38, - 0xe0, 0x3c, 0xe0, 0x40, 0xe0, 0x23, 0xe0, 0x43, - 0xe0, 0x47, 0xe0, 0x4b, 0xe0, 0x4f, 0xe0, 0x53, - 0xe0, 0x57, 0xe0, 0x5b, 0xe0, 0x1b, 0xe0, 0x5e, - 0xe0, 0x19, 0xe0, 0x61, 0xe0, 0x17, 0xe0, 0x64, - 0xe0, 0x15, 0xe0, 0x67, 0xe0, 0x13, 0xe0, 0x6a, - 0xe0, 0x11, 0xe0, 0x6d, 0xe0, 0x0f, 0xe0, 0x70, - 0xe0, 0x0d, 0xe0, 0x73, 0xe0, 0x0b, 0xe0, 0x0a, - 0xe0, 0x09, 0xe0, 0x08, 0xe0, 0x07, 0xe0, 0x06, - 0xe0, 0x05, 0xe0, 0x04, 0xe0, 0x6f, 0xe0, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xd2, 0xfa, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0xdc, 0xfa, 0xf7, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xdc, 0xfa, 0xf2, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xf6, - 0xfa, 0xed, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0xf6, 0xfa, 0xe8, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0x1d, 0xfb, 0xe3, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x23, 0xfb, 0xde, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x2c, - 0xfb, 0xd9, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x40, 0xfb, 0xd4, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0x53, 0xfb, 0xcf, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x76, 0xfb, 0xca, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x89, - 0xfb, 0xc5, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0xac, 0xfb, 0xc0, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0xbf, 0xfb, 0xbb, 0xe7, 0x38, - 0x1c, 0xed, 0x09, 0x00, 0xa1, 0x01, 0x11, 0x1c, - 0x00, 0xf0, 0xc8, 0xfb, 0xb6, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0xcc, 0xfb, 0xb1, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xd2, 0xfb, - 0xac, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0xd6, 0xfb, 0xa7, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0xd7, 0xfb, 0xa2, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0xef, 0xfb, 0x9d, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xf3, 0xfb, - 0x98, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0xf7, 0xfb, 0x93, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0xfb, 0xfb, 0x8e, 0xe7, 0x80, 0xb5, - 0x0f, 0x1c, 0x0e, 0x28, 0x0f, 0xd2, 0x02, 0xa3, - 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, - 0x0b, 0x07, 0x0b, 0x0e, 0x13, 0x18, 0x1d, 0x22, - 0x0b, 0x27, 0x0b, 0x2c, 0x31, 0x36, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0xfd, 0xfb, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0x0b, 0xfc, 0xf7, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0x28, 0xfc, 0xf2, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x2c, 0xfc, - 0xed, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x3c, 0xfc, 0xe8, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0x40, 0xfc, 0xe3, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0x7d, 0xfc, 0xde, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x81, 0xfc, - 0xd9, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x95, 0xfc, 0xd4, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0x99, 0xfc, 0xcf, 0xe7, 0x80, 0xb5, - 0x0f, 0x1c, 0x3f, 0x28, 0x03, 0xd2, 0x02, 0xa3, - 0x1b, 0x18, 0x1b, 0x5a, 0x9f, 0x44, 0x42, 0xe0, - 0x86, 0x00, 0x7e, 0x00, 0x86, 0x00, 0x8c, 0x00, - 0x86, 0x00, 0x96, 0x00, 0xed, 0x09, 0x00, 0xa2, - 0x01, 0x86, 0x00, 0x86, 0x00, 0xa0, 0x00, 0xaa, - 0x00, 0xb4, 0x00, 0xbe, 0x00, 0x86, 0x00, 0xc8, - 0x00, 0x86, 0x00, 0x86, 0x00, 0x86, 0x00, 0xd2, - 0x00, 0xdc, 0x00, 0xe6, 0x00, 0xf0, 0x00, 0xfa, - 0x00, 0x04, 0x01, 0x0e, 0x01, 0x18, 0x01, 0x22, - 0x01, 0x2c, 0x01, 0x36, 0x01, 0x40, 0x01, 0x4a, - 0x01, 0x54, 0x01, 0x5e, 0x01, 0x68, 0x01, 0x72, - 0x01, 0x7c, 0x01, 0x86, 0x01, 0x90, 0x01, 0x9a, - 0x01, 0xa4, 0x01, 0xae, 0x01, 0xb8, 0x01, 0xc2, - 0x01, 0xcc, 0x01, 0xd6, 0x01, 0xe0, 0x01, 0xea, - 0x01, 0xf4, 0x01, 0xfe, 0x01, 0x86, 0x00, 0x08, - 0x02, 0x86, 0x00, 0x12, 0x02, 0x86, 0x00, 0x1c, - 0x02, 0x26, 0x02, 0x30, 0x02, 0x3a, 0x02, 0x44, - 0x02, 0x4e, 0x02, 0x58, 0x02, 0x62, 0x02, 0x6c, - 0x02, 0x76, 0x02, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x5a, 0xfc, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x6a, - 0xfc, 0xf7, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x6a, 0xfc, 0xf2, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0xfc, 0xfc, 0xed, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x00, 0xfd, 0xe8, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x00, - 0xfd, 0xe3, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x01, 0xfd, 0xde, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0x01, 0xfd, 0xd9, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x15, 0xfd, 0xd4, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x55, - 0xfd, 0xcf, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x69, 0xfd, 0xca, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0x86, 0xfd, 0xc5, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x86, 0xfd, 0xc0, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xed, - 0x09, 0x00, 0xa3, 0x01, 0x86, 0xfd, 0xbb, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x8a, 0xfd, - 0xb6, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x8a, 0xfd, 0xb1, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0x8e, 0xfd, 0xac, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0x8e, 0xfd, 0xa7, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x8f, 0xfd, - 0xa2, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x8f, 0xfd, 0x9d, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0x98, 0xfd, 0x98, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0x98, 0xfd, 0x93, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xa1, 0xfd, - 0x8e, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0xa1, 0xfd, 0x89, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0xa2, 0xfd, 0x84, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0xa2, 0xfd, 0x7f, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xa3, 0xfd, - 0x7a, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0xa3, 0xfd, 0x75, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0xab, 0xfd, 0x70, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0xab, 0xfd, 0x6b, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xaf, 0xfd, - 0x66, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0xb3, 0xfd, 0x61, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0xbc, 0xfd, 0x5c, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0xbc, 0xfd, 0x57, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xbd, 0xfd, - 0x52, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0xbd, 0xfd, 0x4d, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0xbe, 0xfd, 0x48, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0xc4, 0xfd, 0x43, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xc4, 0xfd, - 0x3e, 0xe7, 0xed, 0x09, 0x00, 0xa4, 0x01, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xc5, 0xfd, 0x39, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xc6, - 0xfd, 0x34, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0xd8, 0xfd, 0x2f, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0x0e, 0xfe, 0x2a, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x12, 0xfe, 0x25, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x1b, - 0xfe, 0x20, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x1b, 0xfe, 0x1b, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0x1b, 0xfe, 0x16, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x3e, 0xfe, 0x11, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x3e, - 0xfe, 0x0c, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x3f, 0xfe, 0x07, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0x3f, 0xfe, 0x02, 0xe7, 0x80, - 0xb5, 0x0f, 0x1c, 0x0a, 0x28, 0x0c, 0xd2, 0x01, - 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x08, - 0x04, 0x08, 0x0b, 0x08, 0x10, 0x08, 0x15, 0x08, - 0x1a, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x33, - 0xfe, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x31, 0xfe, 0xf7, - 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x31, - 0xfe, 0xf2, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x31, 0xfe, 0xed, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0x31, 0xfe, 0xe8, 0xe7, 0x00, - 0xb5, 0x0b, 0x1c, 0x01, 0x28, 0x0b, 0xd0, 0x02, - 0x28, 0x0e, 0xd0, 0x03, 0x28, 0x11, 0xd0, 0x05, - 0x28, 0x03, 0xd1, 0x18, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0x42, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x18, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x21, 0xfe, 0xf8, - 0xe7, 0x18, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x25, - 0xfe, 0xf3, 0xe7, 0x18, 0x1c, 0xed, 0x09, 0x00, - 0xa5, 0x01, 0x11, 0x1c, 0x00, 0xf0, 0x29, 0xfe, - 0xee, 0xe7, 0x00, 0xb5, 0x0b, 0x1c, 0x01, 0x28, - 0x09, 0xd0, 0x02, 0x28, 0x0c, 0xd0, 0x03, 0x28, - 0x03, 0xd1, 0x18, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x39, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x18, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0x28, 0xfe, 0xf8, 0xe7, - 0x18, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x28, 0xfe, - 0xf3, 0xe7, 0x80, 0xb5, 0x0f, 0x1c, 0x15, 0x28, - 0x13, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, - 0x9f, 0x44, 0x00, 0x1c, 0x0f, 0x0b, 0x12, 0x17, - 0x1c, 0x21, 0x26, 0x0f, 0x2b, 0x30, 0x35, 0x3a, - 0x3f, 0x44, 0x49, 0x4e, 0x53, 0x58, 0x5d, 0x62, - 0x67, 0x00, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x1a, 0xfe, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x1c, 0xfe, - 0xf7, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x40, 0xfe, 0xf2, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0x40, 0xfe, 0xed, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0x5d, 0xfe, 0xe8, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x5d, 0xfe, - 0xe3, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x6f, 0xfe, 0xde, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0x84, 0xfe, 0xd9, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0x84, 0xfe, 0xd4, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x9c, 0xfe, - 0xcf, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x9d, 0xfe, 0xca, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0x00, 0xf0, 0x09, 0xff, 0xc5, 0xe7, 0x38, 0x1c, - 0x11, 0x1c, 0x00, 0xf0, 0x09, 0xff, 0xc0, 0xe7, - 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0x0c, 0xff, - 0xbb, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, 0xf0, - 0x0d, 0xff, 0xb6, 0xe7, 0x38, 0x1c, 0x11, 0x1c, - 0xed, 0x09, 0x00, 0xa6, 0x01, 0x00, 0xf0, 0xb2, - 0xff, 0xb1, 0xe7, 0x38, 0x1c, 0x11, 0x1c, 0x00, - 0xf0, 0xc4, 0xff, 0xac, 0xe7, 0x38, 0x1c, 0x11, - 0x1c, 0x00, 0xf0, 0xc8, 0xff, 0xa7, 0xe7, 0x38, - 0x1c, 0x11, 0x1c, 0x00, 0xf0, 0xec, 0xff, 0xa2, - 0xe7, 0x00, 0xb5, 0x01, 0x1c, 0x4a, 0x78, 0x00, - 0x78, 0x12, 0x02, 0x10, 0x43, 0x8a, 0x78, 0x12, - 0x04, 0x10, 0x43, 0x03, 0x31, 0x0a, 0x1c, 0x09, - 0x78, 0x52, 0x78, 0xfb, 0xf7, 0x7b, 0xfb, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfb, 0xf7, 0x90, - 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x88, 0xb5, 0x01, - 0x1c, 0x4a, 0x1c, 0x49, 0x78, 0x00, 0x78, 0x09, - 0x02, 0x08, 0x43, 0x51, 0x78, 0x01, 0x32, 0x53, - 0x1c, 0x52, 0x78, 0x9f, 0x78, 0x12, 0x02, 0x11, - 0x43, 0x5a, 0x78, 0x3f, 0x02, 0x3a, 0x43, 0xdf, - 0x78, 0x3f, 0x04, 0x17, 0x43, 0x04, 0x33, 0x1a, - 0x1c, 0x1b, 0x78, 0x52, 0x78, 0x00, 0x92, 0x3a, - 0x1c, 0xfb, 0xf7, 0x86, 0xfb, 0x88, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfb, 0xf7, 0x8e, - 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x84, - 0xb0, 0x13, 0x4f, 0x02, 0xa9, 0x18, 0xcf, 0x18, - 0xc1, 0x00, 0x21, 0x03, 0x78, 0x02, 0xaa, 0x01, - 0x30, 0x53, 0x54, 0x01, 0x31, 0x06, 0x29, 0xf8, - 0xd3, 0x01, 0x1c, 0x4a, 0x1c, 0x49, 0x78, 0x00, - 0x78, 0x09, 0x02, 0x08, 0x43, 0x01, 0x32, 0x17, - 0x78, 0x53, 0x78, 0x51, 0x1c, 0x4a, 0x1c, 0x54, - 0x78, 0x49, 0x78, 0x92, 0x78, 0x24, 0x02, 0x21, - 0x43, 0x00, 0x91, 0x01, 0x1c, 0x01, 0x92, 0x3a, - 0x1c, 0x02, 0xa8, 0xfb, 0xf7, 0x75, 0xfb, 0x04, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0xdc, 0x5c, 0x03, 0x20, 0x00, 0xb5, 0x01, - 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x89, 0x78, 0x12, - 0x02, 0x10, 0x43, 0xed, 0x09, 0x00, 0xa7, 0x01, - 0xfb, 0xf7, 0xc7, 0xfb, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, - 0x12, 0x02, 0x10, 0x43, 0x8a, 0x78, 0xc9, 0x78, - 0x09, 0x02, 0x11, 0x43, 0xfb, 0xf7, 0x47, 0xfc, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x82, 0xb0, - 0x0a, 0x4f, 0x69, 0x46, 0x0c, 0xcf, 0x0c, 0xc1, - 0x00, 0x21, 0x03, 0x78, 0x6a, 0x46, 0x01, 0x30, - 0x53, 0x54, 0x01, 0x31, 0x06, 0x29, 0xf8, 0xd3, - 0x01, 0x78, 0x68, 0x46, 0xfb, 0xf7, 0x7d, 0xfc, - 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xe4, 0x5c, 0x03, 0x20, 0x80, 0xb5, - 0x82, 0xb0, 0x09, 0x4f, 0x69, 0x46, 0x0c, 0xcf, - 0x0c, 0xc1, 0x00, 0x21, 0x03, 0x78, 0x6a, 0x46, - 0x01, 0x30, 0x53, 0x54, 0x01, 0x31, 0x06, 0x29, - 0xf8, 0xd3, 0x01, 0x78, 0x68, 0x46, 0xfb, 0xf7, - 0xdc, 0xfc, 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xec, 0x5c, 0x03, 0x20, 0x80, 0xb5, - 0x86, 0xb0, 0x10, 0x4f, 0x04, 0xa9, 0x0c, 0xcf, - 0x0c, 0xc1, 0x0f, 0x4f, 0x69, 0x46, 0x0c, 0xcf, - 0x0c, 0xc1, 0x0c, 0xcf, 0x0c, 0xc1, 0x00, 0x21, - 0x02, 0x78, 0x04, 0xab, 0x01, 0x30, 0x5a, 0x54, - 0x01, 0x31, 0x06, 0x29, 0xf8, 0xd3, 0x00, 0x21, - 0x02, 0x78, 0x6b, 0x46, 0x01, 0x30, 0x5a, 0x54, - 0x01, 0x31, 0x10, 0x29, 0xf8, 0xd3, 0x69, 0x46, - 0x04, 0xa8, 0xfb, 0xf7, 0x48, 0xfd, 0x06, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf4, 0x5c, - 0x03, 0x20, 0xfc, 0x5c, 0x03, 0x20, 0x80, 0xb5, - 0x82, 0xb0, 0x09, 0x4f, 0x69, 0x46, 0x0c, 0xcf, - 0x0c, 0xc1, 0x00, 0x21, 0x02, 0x78, 0x6b, 0x46, - 0x01, 0x30, 0x5a, 0x54, 0x01, 0x31, 0x06, 0x29, - 0xf8, 0xd3, 0x68, 0x46, 0xfb, 0xf7, 0x71, 0xfd, - 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0xed, 0x09, - 0x00, 0xa8, 0x01, 0x18, 0x47, 0x00, 0x00, 0x0c, - 0x5d, 0x03, 0x20, 0x80, 0xb5, 0x86, 0xb0, 0x10, - 0x4f, 0x04, 0xa9, 0x0c, 0xcf, 0x0c, 0xc1, 0x0f, - 0x4f, 0x69, 0x46, 0x0c, 0xcf, 0x0c, 0xc1, 0x0c, - 0xcf, 0x0c, 0xc1, 0x00, 0x21, 0x03, 0x78, 0x04, - 0xaa, 0x01, 0x30, 0x53, 0x54, 0x01, 0x31, 0x06, - 0x29, 0xf8, 0xd3, 0x07, 0x78, 0x41, 0x1c, 0x68, - 0x46, 0x3a, 0x1c, 0xe5, 0xf7, 0xa6, 0xff, 0x6a, - 0x46, 0x39, 0x1c, 0x04, 0xa8, 0xfb, 0xf7, 0x85, - 0xfd, 0x06, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x14, 0x5d, 0x03, 0x20, 0x1c, - 0x5d, 0x03, 0x20, 0x80, 0xb5, 0x82, 0xb0, 0x09, - 0x4f, 0x69, 0x46, 0x0c, 0xcf, 0x0c, 0xc1, 0x00, - 0x21, 0x02, 0x78, 0x6b, 0x46, 0x01, 0x30, 0x5a, - 0x54, 0x01, 0x31, 0x06, 0x29, 0xf8, 0xd3, 0x68, - 0x46, 0xfb, 0xf7, 0xaf, 0xfd, 0x02, 0xb0, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x2c, - 0x5d, 0x03, 0x20, 0x00, 0xb5, 0x01, 0x1c, 0x4a, - 0x78, 0x00, 0x78, 0x12, 0x02, 0x10, 0x43, 0x8a, - 0x78, 0xc9, 0x78, 0x09, 0x02, 0x11, 0x43, 0xfb, - 0xf7, 0xd6, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, - 0x43, 0xfb, 0xf7, 0x2f, 0xfe, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x01, 0x1c, 0x4a, 0x78, 0x00, - 0x78, 0x89, 0x78, 0x12, 0x02, 0x10, 0x43, 0xfb, - 0xf7, 0x72, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, - 0x43, 0xfb, 0xf7, 0xc5, 0xfe, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0x78, 0xfb, 0xf7, 0xe9, - 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x82, - 0xb0, 0x0c, 0x4f, 0x69, 0x46, 0x0c, 0xcf, 0x0c, - 0xc1, 0x00, 0x21, 0x03, 0x78, 0x6a, 0x46, 0x01, - 0x30, 0xed, 0x09, 0x00, 0xa9, 0x01, 0x53, 0x54, - 0x01, 0x31, 0x06, 0x29, 0xf8, 0xd3, 0x01, 0x78, - 0x42, 0x78, 0x83, 0x78, 0xc0, 0x78, 0x00, 0x02, - 0x03, 0x43, 0x68, 0x46, 0xfb, 0xf7, 0xde, 0xfe, - 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x34, 0x5d, 0x03, 0x20, 0x00, 0xb5, 0x01, 0x78, - 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, 0xfb, 0xf7, - 0x01, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, - 0xfb, 0xf7, 0x22, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, - 0x08, 0x43, 0xfb, 0xf7, 0x43, 0xff, 0x08, 0xbc, - 0x18, 0x47, 0x80, 0xb5, 0x82, 0xb0, 0x09, 0x4f, - 0x69, 0x46, 0x0c, 0xcf, 0x0c, 0xc1, 0x00, 0x21, - 0x02, 0x78, 0x6b, 0x46, 0x01, 0x30, 0x5a, 0x54, - 0x01, 0x31, 0x06, 0x29, 0xf8, 0xd3, 0x68, 0x46, - 0xfb, 0xf7, 0xda, 0xfa, 0x02, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x3c, 0x5d, 0x03, 0x20, - 0x00, 0xb5, 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, - 0x12, 0x02, 0x10, 0x43, 0x02, 0x31, 0x0a, 0x1c, - 0x53, 0x1c, 0x52, 0x78, 0x09, 0x78, 0x12, 0x02, - 0x11, 0x43, 0x5a, 0x78, 0x9b, 0x78, 0x1b, 0x02, - 0x1a, 0x43, 0xfb, 0xf7, 0x41, 0xff, 0x08, 0xbc, - 0x18, 0x47, 0x98, 0xb5, 0x01, 0x1c, 0x4a, 0x1c, - 0x49, 0x78, 0x00, 0x78, 0x09, 0x02, 0x08, 0x43, - 0x51, 0x78, 0x01, 0x32, 0x53, 0x1c, 0x52, 0x78, - 0x9f, 0x78, 0x12, 0x02, 0x11, 0x43, 0x5a, 0x78, - 0x3f, 0x02, 0x17, 0x43, 0xda, 0x78, 0x03, 0x33, - 0x5c, 0x1c, 0x5b, 0x78, 0x1b, 0x02, 0x13, 0x43, - 0x62, 0x78, 0xa4, 0x78, 0x24, 0x02, 0x22, 0x43, - 0x00, 0x92, 0x3a, 0x1c, 0xfb, 0xf7, 0x2e, 0xff, - 0x98, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0x01, 0x78, 0x40, 0x78, 0xed, 0x09, 0x00, 0xaa, - 0x01, 0x00, 0x02, 0x08, 0x43, 0xfb, 0xf7, 0x32, - 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, - 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x12, 0x02, 0x10, - 0x43, 0x02, 0x31, 0x0a, 0x1c, 0x53, 0x1c, 0x52, - 0x78, 0x09, 0x78, 0x12, 0x02, 0x11, 0x43, 0x5a, - 0x78, 0x9b, 0x78, 0x1b, 0x02, 0x1a, 0x43, 0xfb, - 0xf7, 0x2b, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, - 0x43, 0xfb, 0xf7, 0x30, 0xff, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0x84, 0xb0, 0x42, 0x78, 0x01, - 0x78, 0x85, 0x78, 0x12, 0x02, 0x0a, 0x43, 0xc4, - 0x78, 0x03, 0x30, 0x41, 0x1c, 0x17, 0x1c, 0x4a, - 0x78, 0x40, 0x78, 0x4e, 0x7a, 0x12, 0x02, 0x10, - 0x43, 0x8a, 0x78, 0x12, 0x04, 0x10, 0x43, 0xca, - 0x78, 0x12, 0x06, 0x02, 0x43, 0x13, 0x1c, 0x4a, - 0x79, 0x08, 0x79, 0x12, 0x02, 0x10, 0x43, 0x8a, - 0x79, 0x12, 0x04, 0x10, 0x43, 0xca, 0x79, 0x12, - 0x06, 0x10, 0x43, 0x0a, 0x7a, 0x36, 0x02, 0x32, - 0x43, 0x8e, 0x7a, 0x36, 0x04, 0x32, 0x43, 0xce, - 0x7a, 0x36, 0x06, 0x32, 0x43, 0x03, 0x92, 0x4a, - 0x7b, 0x0e, 0x7b, 0x12, 0x02, 0x16, 0x43, 0x8a, - 0x7b, 0xc9, 0x7b, 0x00, 0x90, 0x12, 0x04, 0x32, - 0x43, 0x09, 0x06, 0x0a, 0x43, 0x03, 0x99, 0x02, - 0x92, 0x01, 0x91, 0x29, 0x1c, 0x38, 0x1c, 0x22, - 0x1c, 0xfb, 0xf7, 0xfe, 0xfe, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, - 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, 0xfb, - 0xf7, 0x29, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb5, 0x82, 0xb0, 0x0a, 0x4f, 0x69, 0x46, 0x0c, - 0xcf, 0x0c, 0xc1, 0x00, 0x21, 0x03, 0x78, 0x6a, - 0x46, 0x01, 0x30, 0x53, 0x54, 0x01, 0x31, 0x06, - 0x29, 0xf8, 0xd3, 0x01, 0x78, 0x68, 0x46, 0xed, - 0x09, 0x00, 0xab, 0x01, 0xfb, 0xf7, 0x3f, 0xff, - 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x44, 0x5d, 0x03, 0x20, 0x00, 0xb5, - 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, - 0xfb, 0xf7, 0x65, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, - 0x12, 0x02, 0x10, 0x43, 0x8a, 0x78, 0xc9, 0x78, - 0x09, 0x02, 0x11, 0x43, 0xfb, 0xf7, 0x77, 0xff, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x82, 0xb0, - 0x09, 0x4f, 0x69, 0x46, 0x0c, 0xcf, 0x0c, 0xc1, - 0x00, 0x21, 0x02, 0x78, 0x6b, 0x46, 0x01, 0x30, - 0x5a, 0x54, 0x01, 0x31, 0x08, 0x29, 0xf8, 0xd3, - 0x68, 0x46, 0xfb, 0xf7, 0xa2, 0xff, 0x02, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x5d, - 0x03, 0x20, 0x00, 0xb5, 0xfb, 0xf7, 0xb1, 0xff, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x89, 0xb0, - 0x00, 0x23, 0x48, 0x4e, 0x07, 0x93, 0x06, 0x93, - 0x0c, 0xce, 0x04, 0xad, 0x0c, 0xc5, 0x00, 0x23, - 0x03, 0x93, 0x03, 0x78, 0x02, 0x1c, 0x01, 0x30, - 0x00, 0x24, 0x00, 0x27, 0x01, 0x2b, 0x08, 0x93, - 0x04, 0xd1, 0x83, 0x1a, 0x8b, 0x42, 0x01, 0xd2, - 0x04, 0x78, 0x01, 0x30, 0x08, 0x9b, 0x02, 0x2b, - 0x04, 0xd1, 0x83, 0x1a, 0x8b, 0x42, 0x01, 0xd2, - 0x07, 0x78, 0x01, 0x30, 0x01, 0x2c, 0x0b, 0xd1, - 0x83, 0x1a, 0x8b, 0x42, 0x08, 0xd2, 0x45, 0x78, - 0x03, 0x78, 0x2d, 0x02, 0x2b, 0x43, 0x85, 0x78, - 0x2d, 0x04, 0x2b, 0x43, 0x07, 0x93, 0x03, 0x30, - 0x01, 0x2c, 0x0b, 0xd1, 0x83, 0x1a, 0x8b, 0x42, - 0x08, 0xd2, 0x45, 0x78, 0x03, 0x78, 0x2d, 0x02, - 0x2b, 0x43, 0x85, 0x78, 0x2d, 0x04, 0x2b, 0x43, - 0x06, 0x93, 0x03, 0x30, 0x02, 0x2c, 0x0a, 0xd1, - 0x83, 0x1a, 0x8b, 0x42, 0x07, 0xd2, 0x00, 0x23, - 0x06, 0x78, 0xed, 0x09, 0x00, 0xac, 0x01, 0x04, - 0xad, 0x01, 0x30, 0xee, 0x54, 0x01, 0x33, 0x06, - 0x2b, 0xf8, 0xd3, 0x00, 0x2f, 0x05, 0xd1, 0x83, - 0x1a, 0x8b, 0x42, 0x02, 0xd2, 0x03, 0x78, 0x01, - 0x30, 0x03, 0x93, 0x01, 0x2f, 0x1d, 0xd1, 0x83, - 0x1a, 0x8b, 0x42, 0x08, 0xd2, 0x45, 0x78, 0x03, - 0x78, 0x2d, 0x02, 0x2b, 0x43, 0x85, 0x78, 0x2d, - 0x04, 0x2b, 0x43, 0x07, 0x93, 0x03, 0x30, 0x83, - 0x1a, 0x8b, 0x42, 0x08, 0xd2, 0x45, 0x78, 0x03, - 0x78, 0x2d, 0x02, 0x2b, 0x43, 0x85, 0x78, 0x2d, - 0x04, 0x2b, 0x43, 0x06, 0x93, 0x03, 0x30, 0x83, - 0x1a, 0x8b, 0x42, 0x02, 0xd2, 0x03, 0x78, 0x01, - 0x30, 0x03, 0x93, 0x02, 0x2f, 0x11, 0xd1, 0x83, - 0x1a, 0x8b, 0x42, 0x09, 0xd2, 0x00, 0x23, 0x06, - 0x78, 0x04, 0xad, 0x01, 0x30, 0xee, 0x54, 0x01, - 0x33, 0x06, 0x2b, 0xf8, 0xd3, 0x02, 0x2f, 0x04, - 0xd1, 0x82, 0x1a, 0x8a, 0x42, 0x01, 0xd2, 0x02, - 0x78, 0x03, 0x92, 0x06, 0x98, 0x03, 0x9a, 0x04, - 0xa9, 0x01, 0x91, 0x21, 0x1c, 0x00, 0x90, 0x02, - 0x92, 0x3a, 0x1c, 0x08, 0x98, 0x07, 0x9b, 0xfb, - 0xf7, 0x3c, 0xff, 0x09, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x54, 0x5d, 0x03, 0x20, 0x00, - 0xb5, 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, - 0x43, 0xfb, 0xf7, 0x73, 0xff, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0xfb, 0xf7, 0x7c, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0x78, 0xfb, - 0xf7, 0x84, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0xfb, 0xf7, 0xa3, 0xff, 0x08, 0xbc, 0x18, - 0x47, 0x80, 0xb5, 0x82, 0xb0, 0x0a, 0x4f, 0x69, - 0x46, 0x0c, 0xcf, 0x0c, 0xc1, 0x00, 0x21, 0x03, - 0x78, 0x6a, 0x46, 0x01, 0x30, 0x53, 0x54, 0x01, - 0x31, 0x06, 0x29, 0xf8, 0xd3, 0x01, 0x78, 0x68, - 0x46, 0xfb, 0xf7, 0x9d, 0xff, 0xed, 0x09, 0x00, - 0xad, 0x01, 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x5c, 0x5d, 0x03, 0x20, - 0xb0, 0xb5, 0xff, 0xb0, 0xff, 0xb0, 0xe2, 0xb0, - 0x07, 0x1c, 0x01, 0x20, 0x80, 0x02, 0xff, 0x22, - 0x00, 0x21, 0x81, 0x32, 0x68, 0x44, 0xe5, 0xf7, - 0xad, 0xfc, 0x68, 0x46, 0x01, 0x22, 0x92, 0x02, - 0x00, 0x21, 0xe5, 0xf7, 0xa7, 0xfc, 0x38, 0x78, - 0x01, 0x37, 0x00, 0x22, 0x00, 0x28, 0x10, 0xd9, - 0x00, 0x21, 0x53, 0x00, 0x9b, 0x18, 0x5b, 0x00, - 0x01, 0x24, 0xa4, 0x02, 0x6c, 0x44, 0x1c, 0x19, - 0x3d, 0x78, 0x01, 0x37, 0x65, 0x54, 0x01, 0x31, - 0x06, 0x29, 0xf9, 0xd3, 0x01, 0x32, 0x82, 0x42, - 0xee, 0xd3, 0x00, 0x22, 0x00, 0x28, 0x0c, 0xd9, - 0x00, 0x21, 0x13, 0x01, 0x1c, 0x1c, 0x6c, 0x44, - 0x3d, 0x78, 0x01, 0x37, 0x65, 0x54, 0x01, 0x31, - 0x10, 0x29, 0xf9, 0xd3, 0x01, 0x32, 0x82, 0x42, - 0xf2, 0xd3, 0x6a, 0x46, 0x01, 0x21, 0x89, 0x02, - 0x69, 0x44, 0xfb, 0xf7, 0x7f, 0xff, 0x7f, 0xb0, - 0x7f, 0xb0, 0x62, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x80, 0xb5, 0x82, 0xb0, 0x0a, 0x4f, - 0x69, 0x46, 0x0c, 0xcf, 0x0c, 0xc1, 0x00, 0x21, - 0x03, 0x78, 0x6a, 0x46, 0x01, 0x30, 0x53, 0x54, - 0x01, 0x31, 0x06, 0x29, 0xf8, 0xd3, 0x01, 0x78, - 0x68, 0x46, 0xfc, 0xf7, 0x01, 0xf8, 0x02, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x64, 0x5d, 0x03, 0x20, 0xb0, 0xb5, 0xbf, 0xb0, - 0x04, 0x1c, 0x68, 0x46, 0xfc, 0x22, 0x0f, 0x1c, - 0x00, 0x21, 0xe5, 0xf7, 0x53, 0xfc, 0x00, 0x25, - 0xf8, 0x2f, 0x07, 0xd1, 0x68, 0x46, 0x21, 0x1c, - 0x3a, 0x1c, 0xe5, 0xf7, 0xd3, 0xfc, 0x68, 0x46, - 0xc5, 0x55, 0x06, 0xe0, 0x68, 0x46, 0x21, 0x1c, - 0x0b, 0xf0, 0xc8, 0xf8, 0x68, 0x46, 0x0b, 0xf0, - 0xed, 0x09, 0x00, 0xae, 0x01, 0x15, 0xf8, 0x68, - 0x46, 0xfc, 0xf7, 0x04, 0xf8, 0x3f, 0xb0, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, - 0xf7, 0x0d, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0xfc, 0xf7, 0x1c, 0xf8, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x01, 0x78, 0x40, 0x78, 0x00, - 0x02, 0x08, 0x43, 0xfc, 0xf7, 0x21, 0xf8, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0x36, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, - 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, 0xfc, - 0xf7, 0x3b, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0xfc, 0xf7, 0x4c, 0xf8, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0x78, 0xfc, 0xf7, 0x54, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, - 0xf7, 0x85, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x12, - 0x02, 0x10, 0x43, 0x8a, 0x78, 0xc9, 0x78, 0x09, - 0x02, 0x11, 0x43, 0xfc, 0xf7, 0x89, 0xf8, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0xb0, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, - 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x12, 0x02, 0x10, - 0x43, 0x8a, 0x78, 0xc9, 0x78, 0x09, 0x02, 0x11, - 0x43, 0xfc, 0xf7, 0xb4, 0xf8, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0xdb, 0xf8, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0x78, 0xfc, - 0xf7, 0xe3, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0xfc, 0xf7, 0x0a, 0xf9, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0x78, 0xfc, 0xf7, 0x12, - 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, - 0xf7, 0x3b, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x89, - 0x78, 0x12, 0x02, 0x10, 0x43, 0x09, 0x04, 0x08, - 0x43, 0xfc, 0xf7, 0xed, 0x09, 0x00, 0xaf, 0x01, - 0x3c, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0xfc, 0xf7, 0x59, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, - 0x08, 0x43, 0xfc, 0xf7, 0x60, 0xf9, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0x01, 0x78, 0x40, 0x78, - 0x00, 0x02, 0x08, 0x43, 0xfc, 0xf7, 0x91, 0xf9, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0x1c, - 0x4a, 0x78, 0x00, 0x78, 0x12, 0x02, 0x10, 0x43, - 0x8a, 0x78, 0xc9, 0x78, 0x09, 0x02, 0x11, 0x43, - 0xfc, 0xf7, 0x95, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0xfc, 0xf7, 0x9e, 0xf9, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0x00, 0x78, 0xfc, 0xf7, - 0xa6, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0xfc, 0xf7, 0xaf, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x00, 0x78, 0xfc, 0xf7, 0xb7, 0xf9, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0x1c, - 0x4a, 0x78, 0x00, 0x78, 0x89, 0x78, 0x12, 0x02, - 0x10, 0x43, 0xfc, 0xf7, 0xba, 0xf9, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0xc7, 0xf9, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0x78, - 0xfc, 0xf7, 0xcf, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x00, 0x78, 0xfc, 0xf7, 0xd7, 0xf9, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x01, 0x1c, - 0x4a, 0x78, 0x00, 0x78, 0x12, 0x02, 0x10, 0x43, - 0x02, 0x31, 0x0a, 0x1c, 0x53, 0x1c, 0x5f, 0x78, - 0x52, 0x78, 0x09, 0x78, 0x3f, 0x02, 0x3a, 0x43, - 0x9f, 0x78, 0xdb, 0x78, 0x1b, 0x02, 0x3b, 0x43, - 0xfc, 0xf7, 0xd7, 0xf9, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0xff, 0xb0, 0x81, 0xb0, - 0x07, 0x1c, 0xff, 0x22, 0x00, 0x21, 0x01, 0x32, - 0x40, 0xa8, 0xe5, 0xf7, 0x48, 0xfb, 0x68, 0x46, - 0xff, 0x22, 0x00, 0x21, 0x01, 0x32, 0xed, 0x09, - 0x00, 0xb0, 0x01, 0xe5, 0xf7, 0x42, 0xfb, 0x38, - 0x78, 0x00, 0x21, 0x7a, 0x1c, 0x00, 0x28, 0x0c, - 0xd9, 0x17, 0x78, 0x8b, 0x00, 0x40, 0xac, 0xe7, - 0x50, 0x54, 0x78, 0x24, 0x02, 0x27, 0x43, 0x01, - 0x31, 0x02, 0x32, 0x40, 0xac, 0xe7, 0x50, 0x81, - 0x42, 0xf2, 0xd3, 0x00, 0x21, 0x00, 0x28, 0x0c, - 0xd9, 0x17, 0x78, 0x8b, 0x00, 0x6c, 0x46, 0xe7, - 0x50, 0x54, 0x78, 0x24, 0x02, 0x27, 0x43, 0x6c, - 0x46, 0x01, 0x31, 0x02, 0x32, 0x81, 0x42, 0xe7, - 0x50, 0xf2, 0xd3, 0x6a, 0x46, 0x40, 0xa9, 0xfc, - 0xf7, 0xc2, 0xf9, 0x7f, 0xb0, 0x01, 0xb0, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, - 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, 0xfc, - 0xf7, 0xd6, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x12, - 0x02, 0x10, 0x43, 0x8a, 0x78, 0xc9, 0x78, 0x09, - 0x02, 0x11, 0x43, 0xfc, 0xf7, 0xf6, 0xf9, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0x23, - 0xfa, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, - 0xf7, 0x2c, 0xfa, 0x08, 0xbc, 0x18, 0x47, 0x90, - 0xb5, 0xc0, 0xb0, 0x07, 0x1c, 0x68, 0x46, 0xff, - 0x22, 0x00, 0x21, 0x01, 0x32, 0xe5, 0xf7, 0xed, - 0xfa, 0x3a, 0x78, 0x00, 0x20, 0x7b, 0x1c, 0x00, - 0x2a, 0x11, 0xd9, 0x1f, 0x78, 0x81, 0x00, 0x6c, - 0x46, 0x67, 0x50, 0x5c, 0x78, 0x24, 0x02, 0x27, - 0x43, 0x6c, 0x46, 0x67, 0x50, 0x9c, 0x78, 0x24, - 0x04, 0x27, 0x43, 0x6c, 0x46, 0x01, 0x30, 0x03, - 0x33, 0x90, 0x42, 0x67, 0x50, 0xed, 0xd3, 0x69, - 0x46, 0x10, 0x1c, 0xfc, 0xf7, 0x26, 0xfa, 0x40, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0xfc, 0xf7, 0x51, 0xfa, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0x78, 0xfc, 0xf7, 0x59, - 0xfa, 0xed, 0x09, 0x00, 0xb1, 0x01, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0x76, 0xfa, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0x78, - 0xfc, 0xf7, 0x7e, 0xfa, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0xfc, 0xf7, 0x9b, 0xfa, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0xda, 0xfa, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, - 0xe9, 0xfa, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0xfc, 0xf7, 0xfe, 0xfa, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0xfc, 0xf7, 0x09, 0xfb, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0x01, 0x78, 0x40, 0x78, - 0x00, 0x02, 0x08, 0x43, 0xfc, 0xf7, 0x14, 0xfb, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0x78, - 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, 0xfc, 0xf7, - 0x1d, 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, - 0xfc, 0xf7, 0x22, 0xfb, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, - 0x08, 0x43, 0xfc, 0xf7, 0x2b, 0xfb, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0x56, 0xfb, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0x78, - 0xfc, 0xf7, 0x5e, 0xfb, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0xfc, 0xf7, 0x67, 0xfb, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0x01, 0x78, 0x40, 0x78, - 0x00, 0x02, 0x08, 0x43, 0xfc, 0xf7, 0x7c, 0xfb, - 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0xa0, 0xb0, - 0x6f, 0x46, 0x00, 0x21, 0x00, 0x22, 0x00, 0x24, - 0x00, 0x25, 0x08, 0x23, 0x36, 0xc7, 0x01, 0x3b, - 0xfc, 0xd1, 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, - 0x12, 0x02, 0x02, 0x43, 0x02, 0x31, 0x08, 0x1c, - 0x14, 0x1c, 0x42, 0x78, 0x09, 0x78, 0x87, 0x78, - 0x12, 0x02, 0x0a, 0x43, 0x15, 0x1c, 0x02, 0x30, - 0x41, 0x1c, 0x68, 0x46, 0xed, 0x09, 0x00, 0xb2, - 0x01, 0x3a, 0x1c, 0xe5, 0xf7, 0xcb, 0xfa, 0x6b, - 0x46, 0x20, 0x1c, 0x29, 0x1c, 0x3a, 0x1c, 0x00, - 0xf0, 0x7b, 0xfa, 0x20, 0xb0, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0xf0, 0x8e, - 0xfa, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0xbf, - 0xb0, 0x04, 0x1c, 0x68, 0x46, 0xfc, 0x22, 0x0f, - 0x1c, 0x00, 0x21, 0xe5, 0xf7, 0x2b, 0xfa, 0x00, - 0x25, 0xf8, 0x2f, 0x07, 0xd1, 0x68, 0x46, 0x21, - 0x1c, 0x3a, 0x1c, 0xe5, 0xf7, 0xab, 0xfa, 0x68, - 0x46, 0xc5, 0x55, 0x06, 0xe0, 0x68, 0x46, 0x21, - 0x1c, 0x0a, 0xf0, 0xa0, 0xfe, 0x68, 0x46, 0x0a, - 0xf0, 0xed, 0xfd, 0x68, 0x46, 0x00, 0xf0, 0x9a, - 0xfa, 0x3f, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0xf0, 0xa1, 0xfa, 0x08, - 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x82, 0xb0, 0x09, - 0x4f, 0x69, 0x46, 0x0c, 0xcf, 0x0c, 0xc1, 0x00, - 0x21, 0x02, 0x78, 0x6b, 0x46, 0x01, 0x30, 0x5a, - 0x54, 0x01, 0x31, 0x06, 0x29, 0xf8, 0xd3, 0x68, - 0x46, 0x00, 0xf0, 0xb2, 0xfa, 0x02, 0xb0, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x6c, 0x5d, 0x03, - 0x20, 0x80, 0xb5, 0x84, 0xb0, 0x0a, 0x4f, 0x69, - 0x46, 0x0c, 0xcf, 0x0c, 0xc1, 0x0c, 0xcf, 0x0c, - 0xc1, 0x00, 0x21, 0x02, 0x78, 0x6b, 0x46, 0x01, - 0x30, 0x5a, 0x54, 0x01, 0x31, 0x10, 0x29, 0xf8, - 0xd3, 0x68, 0x46, 0x00, 0xf0, 0xab, 0xfa, 0x04, - 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x74, 0x5d, 0x03, 0x20, 0x00, 0xb5, 0x00, - 0xf0, 0xb5, 0xfa, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb5, 0x84, 0xb0, 0x0c, 0x4f, 0x69, 0x46, 0x0c, - 0xcf, 0x0c, 0xc1, 0x0c, 0xcf, 0x0c, 0xc1, 0x02, - 0x78, 0x41, 0x1c, 0x00, 0x20, 0x0b, 0x78, 0x6f, - 0x46, 0x01, 0x31, 0x3b, 0x54, 0x01, 0x30, 0xed, - 0x09, 0x00, 0xb3, 0x01, 0x10, 0x28, 0xf8, 0xd3, - 0x69, 0x46, 0x10, 0x1c, 0x00, 0xf0, 0xbf, 0xfa, - 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x84, 0x5d, 0x03, 0x20, 0x00, 0xb5, - 0x00, 0x78, 0x00, 0xf0, 0xc2, 0xfa, 0x08, 0xbc, - 0x18, 0x47, 0xf0, 0xb5, 0x86, 0xb0, 0x01, 0x1c, - 0x4a, 0x78, 0x00, 0x78, 0x12, 0x02, 0x10, 0x43, - 0x8a, 0x78, 0x12, 0x04, 0x10, 0x43, 0xca, 0x78, - 0x12, 0x06, 0x02, 0x43, 0x04, 0x31, 0x08, 0x1c, - 0x15, 0x1c, 0x42, 0x78, 0x09, 0x78, 0x12, 0x02, - 0x11, 0x43, 0x82, 0x78, 0x12, 0x04, 0x11, 0x43, - 0xc2, 0x78, 0x12, 0x06, 0x0a, 0x43, 0x17, 0x1c, - 0x42, 0x79, 0x01, 0x79, 0x12, 0x02, 0x11, 0x43, - 0x82, 0x79, 0x12, 0x04, 0x11, 0x43, 0xc2, 0x79, - 0x12, 0x06, 0x0a, 0x43, 0x16, 0x1c, 0x42, 0x7a, - 0x01, 0x7a, 0x12, 0x02, 0x11, 0x43, 0x82, 0x7a, - 0x12, 0x04, 0x11, 0x43, 0xc2, 0x7a, 0x12, 0x06, - 0x0a, 0x43, 0x0c, 0x30, 0x01, 0x1c, 0x14, 0x1c, - 0x4a, 0x78, 0x00, 0x78, 0x12, 0x02, 0x10, 0x43, - 0x8a, 0x78, 0x12, 0x04, 0x10, 0x43, 0xca, 0x78, - 0x12, 0x06, 0x02, 0x43, 0x13, 0x1c, 0x4a, 0x79, - 0x08, 0x79, 0x12, 0x02, 0x10, 0x43, 0x8a, 0x79, - 0x12, 0x04, 0x02, 0x43, 0x07, 0x31, 0x08, 0x1c, - 0x09, 0x78, 0x09, 0x06, 0x11, 0x43, 0x05, 0x91, - 0x82, 0x78, 0x41, 0x78, 0x12, 0x02, 0x11, 0x43, - 0xc2, 0x78, 0x12, 0x04, 0x11, 0x43, 0x02, 0x79, - 0x12, 0x06, 0x11, 0x43, 0x04, 0x91, 0x81, 0x79, - 0x42, 0x79, 0x09, 0x02, 0x0a, 0x43, 0xc1, 0x79, - 0x00, 0x7a, 0x00, 0x93, 0x09, 0x04, 0x11, 0x43, - 0x00, 0x06, 0x08, 0x43, 0x02, 0x1c, 0x05, 0x98, - 0x04, 0x99, 0x03, 0x92, 0x01, 0x90, 0x02, 0x91, - 0x39, 0x1c, 0x28, 0x1c, 0x32, 0x1c, 0x23, 0x1c, - 0x00, 0xf0, 0xed, 0x09, 0x00, 0xb4, 0x01, 0x6b, - 0xfa, 0x06, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0xf0, 0x86, 0xfa, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0x1c, 0x00, - 0x78, 0x49, 0x78, 0x00, 0xf0, 0xbc, 0xfa, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x00, 0x78, 0x00, - 0xf0, 0xa8, 0xfa, 0x08, 0xbc, 0x18, 0x47, 0xf0, - 0xb5, 0x95, 0xb0, 0x52, 0x4f, 0x0d, 0x1c, 0x50, - 0xcf, 0x06, 0xa9, 0x50, 0xc1, 0x00, 0x21, 0x00, - 0x24, 0x00, 0x22, 0x00, 0x23, 0x00, 0x26, 0x0c, - 0xaf, 0x5e, 0xc7, 0x5c, 0xc7, 0x43, 0x78, 0x01, - 0x78, 0x1b, 0x02, 0x19, 0x43, 0x83, 0x78, 0x1b, - 0x04, 0x19, 0x43, 0xc3, 0x78, 0xc2, 0x1c, 0x54, - 0x1c, 0x1a, 0x06, 0x0a, 0x43, 0x20, 0x1a, 0x2d, - 0x1a, 0x17, 0x1c, 0x20, 0x2d, 0x09, 0xd1, 0x21, - 0x1c, 0x2a, 0x1c, 0x0c, 0xa8, 0xe5, 0xf7, 0x93, - 0xf9, 0x00, 0x21, 0x0c, 0xa8, 0x41, 0x55, 0x60, - 0x19, 0x08, 0xe0, 0x0c, 0xa8, 0x21, 0x1c, 0x0a, - 0xf0, 0x86, 0xfd, 0x0c, 0xa8, 0x0a, 0xf0, 0xd3, - 0xfc, 0x00, 0x19, 0x01, 0x30, 0x42, 0x78, 0x01, - 0x78, 0x12, 0x02, 0x11, 0x43, 0x82, 0x78, 0x12, - 0x04, 0x11, 0x43, 0xc2, 0x78, 0x12, 0x06, 0x0a, - 0x43, 0x15, 0x1c, 0x42, 0x79, 0x01, 0x79, 0x12, - 0x02, 0x11, 0x43, 0x82, 0x79, 0x12, 0x04, 0x11, - 0x43, 0xc2, 0x79, 0x12, 0x06, 0x0a, 0x43, 0x14, - 0x1c, 0x42, 0x7a, 0x01, 0x7a, 0x12, 0x02, 0x11, - 0x43, 0x82, 0x7a, 0x12, 0x04, 0x11, 0x43, 0xc2, - 0x7a, 0x12, 0x06, 0x0a, 0x43, 0x0c, 0x30, 0x01, - 0x1c, 0x13, 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x8e, - 0x78, 0x12, 0x02, 0x10, 0x43, 0x02, 0x31, 0x4a, - 0x1c, 0x31, 0x04, 0x16, 0x78, 0x01, 0x43, 0x50, - 0x1c, 0x32, 0x06, 0x11, 0x43, 0x0b, 0x91, 0x01, - 0x1c, 0x4a, 0x78, 0x00, 0x78, 0xed, 0x09, 0x00, - 0xb5, 0x01, 0x12, 0x02, 0x10, 0x43, 0x8a, 0x78, - 0x12, 0x04, 0x10, 0x43, 0xca, 0x78, 0x12, 0x06, - 0x10, 0x43, 0x0a, 0x90, 0x4a, 0x79, 0x08, 0x79, - 0x8e, 0x79, 0x12, 0x02, 0x02, 0x43, 0x06, 0x31, - 0x48, 0x1c, 0x31, 0x04, 0x11, 0x43, 0x02, 0x78, - 0x12, 0x06, 0x11, 0x43, 0x09, 0x91, 0x01, 0x30, - 0x01, 0x1c, 0x4a, 0x78, 0x00, 0x78, 0x12, 0x02, - 0x10, 0x43, 0x8a, 0x78, 0x12, 0x04, 0x10, 0x43, - 0xca, 0x78, 0x12, 0x06, 0x10, 0x43, 0x08, 0x90, - 0x00, 0x20, 0x04, 0x31, 0x0a, 0x78, 0x06, 0xae, - 0x01, 0x31, 0x32, 0x54, 0x01, 0x30, 0x08, 0x28, - 0xf8, 0xd3, 0x09, 0x98, 0x06, 0xaa, 0x08, 0x99, - 0x05, 0x92, 0x03, 0x90, 0x0a, 0x9a, 0x04, 0x91, - 0x0b, 0x99, 0x02, 0x92, 0x2a, 0x1c, 0x38, 0x1c, - 0x00, 0x93, 0x01, 0x91, 0x0c, 0xa9, 0x23, 0x1c, - 0x00, 0xf0, 0x5a, 0xfa, 0x15, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x94, 0x5d, 0x03, 0x20, - 0x80, 0xb5, 0x89, 0xb0, 0x6f, 0x46, 0x00, 0x21, - 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc7, 0x0e, 0xc7, - 0x0e, 0xc7, 0x07, 0x78, 0x41, 0x1c, 0x68, 0x46, - 0x3a, 0x1c, 0xe5, 0xf7, 0xff, 0xf8, 0x69, 0x46, - 0x38, 0x1c, 0x00, 0xf0, 0x1b, 0xf9, 0x09, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0x01, 0x78, 0x40, 0x78, 0x00, 0x02, 0x08, 0x43, - 0xfc, 0xf7, 0xb4, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0xb0, 0xb5, 0x89, 0xb0, 0x07, 0x1c, 0x68, 0x46, - 0x0c, 0x1c, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, - 0x00, 0x25, 0x2e, 0xc0, 0x2e, 0xc0, 0x20, 0xc0, - 0x20, 0x2c, 0x08, 0xd1, 0x68, 0x46, 0x39, 0x1c, - 0x22, 0x1c, 0xe5, 0xf7, 0xdb, 0xf8, 0x68, 0x46, - 0x05, 0x55, 0x38, 0x19, 0x08, 0xe0, 0x68, 0x46, - 0x39, 0x1c, 0x0a, 0xf0, 0xcf, 0xfc, 0x68, 0x46, - 0xed, 0x09, 0x00, 0xb6, 0x01, 0x0a, 0xf0, 0x1c, - 0xfc, 0xc0, 0x19, 0x01, 0x30, 0x01, 0x78, 0x42, - 0x78, 0x68, 0x46, 0x00, 0xf0, 0x3d, 0xfa, 0x09, - 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, - 0xb5, 0x8f, 0xb0, 0x3b, 0x4f, 0x0d, 0x1c, 0x50, - 0xcf, 0x03, 0xa9, 0x50, 0xc1, 0x00, 0x21, 0x00, - 0x24, 0x00, 0x22, 0x00, 0x23, 0x00, 0x26, 0x06, - 0xaf, 0x5e, 0xc7, 0x5c, 0xc7, 0x43, 0x78, 0x02, - 0x78, 0x1b, 0x02, 0x1a, 0x43, 0x83, 0x78, 0x1b, - 0x04, 0x1a, 0x43, 0xc3, 0x78, 0xc1, 0x1c, 0x4c, - 0x1c, 0x19, 0x06, 0x11, 0x43, 0x20, 0x1a, 0x2d, - 0x1a, 0x0f, 0x1c, 0x20, 0x2d, 0x09, 0xd1, 0x21, - 0x1c, 0x2a, 0x1c, 0x06, 0xa8, 0xe5, 0xf7, 0xa0, - 0xf8, 0x00, 0x21, 0x06, 0xa8, 0x41, 0x55, 0x60, - 0x19, 0x08, 0xe0, 0x06, 0xa8, 0x21, 0x1c, 0x0a, - 0xf0, 0x93, 0xfc, 0x06, 0xa8, 0x0a, 0xf0, 0xe0, - 0xfb, 0x00, 0x19, 0x01, 0x30, 0x42, 0x78, 0x01, - 0x78, 0x12, 0x02, 0x11, 0x43, 0x82, 0x78, 0x12, - 0x04, 0x11, 0x43, 0xc2, 0x78, 0x12, 0x06, 0x0a, - 0x43, 0x14, 0x1c, 0x42, 0x79, 0x01, 0x79, 0x12, - 0x02, 0x11, 0x43, 0x82, 0x79, 0x12, 0x04, 0x11, - 0x43, 0xc2, 0x79, 0x12, 0x06, 0x0a, 0x43, 0x08, - 0x30, 0x01, 0x1c, 0x13, 0x1c, 0x4a, 0x1c, 0x49, - 0x78, 0x00, 0x78, 0x15, 0x79, 0x09, 0x02, 0x08, - 0x43, 0x51, 0x78, 0x09, 0x04, 0x08, 0x43, 0x91, - 0x78, 0x09, 0x06, 0x08, 0x43, 0xd1, 0x78, 0x2d, - 0x02, 0x29, 0x43, 0x55, 0x79, 0x2d, 0x04, 0x29, - 0x43, 0x95, 0x79, 0x2d, 0x06, 0x29, 0x43, 0x05, - 0x91, 0x00, 0x21, 0x07, 0x32, 0x16, 0x78, 0x03, - 0xad, 0x01, 0x32, 0x6e, 0x54, 0x01, 0x31, 0x08, - 0x29, 0xf8, 0xd3, 0x05, 0x99, 0x03, 0xaa, 0x00, - 0x90, 0x38, 0x1c, 0x02, 0x92, 0x01, 0x91, 0x06, - 0xa9, 0x22, 0x1c, 0xed, 0x09, 0x00, 0xb7, 0x01, - 0x00, 0xf0, 0x6d, 0xf9, 0x0f, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x9c, 0x5d, - 0x03, 0x20, 0x80, 0xb5, 0x17, 0x1c, 0x1a, 0x1c, - 0x3b, 0x1c, 0x0f, 0x1c, 0x01, 0x1c, 0x38, 0x1c, - 0x0a, 0xf0, 0xc9, 0xf8, 0x00, 0x22, 0x00, 0x28, - 0x00, 0xd0, 0x03, 0x22, 0x04, 0x48, 0x04, 0x49, - 0x40, 0x68, 0xfd, 0xf7, 0x5f, 0xfe, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x60, 0xbb, - 0x03, 0x20, 0x02, 0xfc, 0x00, 0x00, 0x00, 0xb5, - 0xa6, 0xb0, 0x00, 0x21, 0x00, 0x22, 0x10, 0x23, - 0x06, 0xa8, 0x06, 0xc0, 0x01, 0x3b, 0xfc, 0xd1, - 0x00, 0x20, 0x05, 0x90, 0x04, 0x90, 0x80, 0x20, - 0x03, 0x90, 0x05, 0xa8, 0x04, 0xa9, 0x06, 0xaa, - 0x03, 0xab, 0x0a, 0xf0, 0x84, 0xf8, 0x03, 0x1c, - 0x06, 0xaa, 0x02, 0x92, 0x05, 0x98, 0x03, 0x99, - 0x00, 0x22, 0x00, 0x2b, 0x00, 0x90, 0x01, 0x91, - 0x00, 0xd0, 0x03, 0x22, 0x04, 0x48, 0x04, 0x49, - 0x40, 0x68, 0x04, 0x9b, 0xfd, 0xf7, 0x32, 0xfe, - 0x26, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x03, 0xfc, 0x00, 0x00, 0x00, 0xb5, - 0x04, 0x48, 0x03, 0x22, 0x04, 0x49, 0x40, 0x68, - 0xfd, 0xf7, 0x24, 0xfe, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x04, 0xfc, - 0x00, 0x00, 0x00, 0xb5, 0x82, 0xb0, 0x00, 0x20, - 0x01, 0x90, 0x00, 0xab, 0x18, 0x70, 0x68, 0x46, - 0x01, 0x90, 0x04, 0x48, 0x03, 0x22, 0x40, 0x68, - 0x01, 0x9b, 0x03, 0x49, 0xfd, 0xf7, 0x0e, 0xfe, - 0x02, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, - 0x03, 0x20, 0x05, 0xfc, 0x00, 0x00, 0x00, 0xb5, - 0x04, 0x48, 0x03, 0x22, 0x04, 0x49, 0x40, 0x68, - 0xfd, 0xf7, 0x00, 0xfe, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0xed, 0x09, - 0x00, 0xb8, 0x01, 0x11, 0xfc, 0x00, 0x00, 0x00, - 0xb5, 0x09, 0xf0, 0x91, 0xff, 0x00, 0x22, 0x00, - 0x28, 0x00, 0xd0, 0x03, 0x22, 0x03, 0x48, 0x03, - 0x49, 0x40, 0x68, 0xfd, 0xf7, 0xed, 0xfd, 0x08, - 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, 0x06, - 0xfc, 0x00, 0x00, 0x00, 0xb5, 0x10, 0x21, 0x09, - 0xf0, 0xe0, 0xff, 0x00, 0x22, 0x00, 0x28, 0x00, - 0xd0, 0x03, 0x22, 0x03, 0x48, 0x04, 0x49, 0x40, - 0x68, 0xfd, 0xf7, 0xda, 0xfd, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x08, - 0xfc, 0x00, 0x00, 0x00, 0xb5, 0x85, 0xb0, 0x0c, - 0x49, 0x01, 0xa8, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, - 0xc9, 0x0c, 0xc0, 0x10, 0x20, 0x00, 0x90, 0x01, - 0xa8, 0x69, 0x46, 0x09, 0xf0, 0xa8, 0xff, 0x00, - 0x22, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x22, 0x05, - 0x48, 0x01, 0xab, 0x05, 0x49, 0x40, 0x68, 0xfd, - 0xf7, 0xbb, 0xfd, 0x05, 0xb0, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0xa4, 0x5d, 0x03, 0x20, 0x60, - 0xbb, 0x03, 0x20, 0x09, 0xfc, 0x00, 0x00, 0x00, - 0xb5, 0x04, 0x48, 0x03, 0x22, 0x04, 0x49, 0x40, - 0x68, 0xfd, 0xf7, 0xaa, 0xfd, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x60, 0xbb, 0x03, 0x20, 0x0a, - 0xfc, 0x00, 0x00, 0x00, 0xb5, 0x84, 0xb0, 0x07, - 0x49, 0x68, 0x46, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, - 0xc9, 0x0c, 0xc0, 0x05, 0x48, 0x03, 0x22, 0x6b, - 0x46, 0x05, 0x49, 0x40, 0x68, 0xfd, 0xf7, 0x94, - 0xfd, 0x04, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0xb4, - 0x5d, 0x03, 0x20, 0x60, 0xbb, 0x03, 0x20, 0x0b, - 0xfc, 0x00, 0x00, 0xf0, 0xb5, 0x84, 0xb0, 0x17, - 0x1c, 0x0a, 0xaa, 0x05, 0x1c, 0x0c, 0x1c, 0x07, - 0xca, 0x09, 0x9e, 0x01, 0x90, 0x02, 0x91, 0x21, - 0x1c, 0x28, 0x1c, 0x03, 0x92, 0x3a, 0x1c, 0x00, - 0x96, 0xed, 0x09, 0x00, 0xb9, 0x01, 0x0a, 0xf0, - 0x2d, 0xf8, 0x00, 0x22, 0x00, 0x28, 0x00, 0xd0, - 0x03, 0x22, 0x04, 0x48, 0x04, 0x49, 0x40, 0x68, - 0xfd, 0xf7, 0x71, 0xfd, 0x04, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, - 0x0c, 0xfc, 0x00, 0x00, 0x00, 0xb5, 0x8f, 0xb0, - 0x07, 0xaa, 0x03, 0x92, 0x0c, 0x32, 0x09, 0xa8, - 0x01, 0x90, 0x08, 0xa9, 0x02, 0x91, 0x14, 0x30, - 0x00, 0x92, 0x0c, 0xaa, 0x14, 0x31, 0x0b, 0xab, - 0x0a, 0xf0, 0x0e, 0xf8, 0x07, 0x9a, 0x08, 0x99, - 0x06, 0x92, 0x0a, 0x9a, 0x03, 0x1c, 0x05, 0x91, - 0x0b, 0x99, 0x03, 0x92, 0x09, 0x98, 0x0d, 0x9a, - 0x04, 0x90, 0x0c, 0x98, 0x00, 0x92, 0x00, 0x22, - 0x00, 0x2b, 0x02, 0x91, 0x01, 0x90, 0x00, 0xd0, - 0x03, 0x22, 0x04, 0x48, 0x04, 0x49, 0x40, 0x68, - 0x0e, 0x9b, 0xfd, 0xf7, 0x40, 0xfd, 0x0f, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, 0x20, - 0x0d, 0xfc, 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, - 0x00, 0x23, 0x03, 0x22, 0x03, 0x49, 0x40, 0x68, - 0xfd, 0xf7, 0x31, 0xfd, 0x08, 0xbc, 0x18, 0x47, - 0x60, 0xbb, 0x03, 0x20, 0x0f, 0xfc, 0x00, 0x00, - 0x80, 0xb5, 0x00, 0x27, 0x00, 0x28, 0x05, 0xd0, - 0x01, 0x28, 0x07, 0xd1, 0x20, 0x20, 0x09, 0xf0, - 0xc9, 0xfc, 0x04, 0xe0, 0x10, 0x20, 0x09, 0xf0, - 0xc5, 0xfc, 0x00, 0xe0, 0x01, 0x27, 0x00, 0x22, - 0x00, 0x2f, 0x00, 0xd0, 0x03, 0x22, 0x04, 0x48, - 0x04, 0x49, 0x40, 0x68, 0xfd, 0xf7, 0x13, 0xfd, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x60, 0xbb, 0x03, 0x20, 0x0e, 0xfc, 0x00, 0x00, - 0xff, 0xb5, 0x8e, 0xb0, 0x0f, 0x1c, 0x04, 0x1c, - 0x0c, 0xa8, 0x08, 0x22, 0x19, 0x99, 0x18, 0x9d, - 0x17, 0x9e, 0xe4, 0xf7, 0xd9, 0xfe, 0x20, 0x22, - 0x39, 0x1c, 0x04, 0xa8, 0xed, 0x09, 0x00, 0xba, - 0x01, 0xe4, 0xf7, 0xd4, 0xfe, 0x0c, 0x99, 0x0d, - 0x9a, 0x01, 0x95, 0x00, 0x96, 0x02, 0x91, 0x03, - 0x92, 0x10, 0x9a, 0x04, 0xa9, 0x11, 0x9b, 0x20, - 0x1c, 0xe5, 0xf7, 0xde, 0xfc, 0x04, 0x48, 0x00, - 0x22, 0x04, 0x49, 0x40, 0x68, 0xfd, 0xf7, 0xe9, - 0xfc, 0x12, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x60, 0xbb, 0x03, 0x20, 0x14, 0xfc, 0x00, - 0x00, 0xff, 0xb5, 0x91, 0xb0, 0x08, 0x22, 0x1f, - 0x99, 0x1c, 0x9c, 0x1d, 0x9f, 0x1b, 0x9d, 0x1a, - 0x9e, 0x0f, 0xa8, 0xe4, 0xf7, 0xaf, 0xfe, 0x20, - 0x22, 0x12, 0x99, 0x07, 0xa8, 0xe4, 0xf7, 0xaa, - 0xfe, 0x1e, 0x98, 0x0f, 0x99, 0x10, 0x9a, 0x04, - 0x90, 0x03, 0x97, 0x01, 0x95, 0x05, 0x91, 0x06, - 0x92, 0x13, 0x9a, 0x07, 0xa9, 0x11, 0x98, 0x14, - 0x9b, 0x00, 0x96, 0x02, 0x94, 0xe5, 0xf7, 0xf8, - 0xfc, 0x04, 0x48, 0x00, 0x22, 0x04, 0x49, 0x40, - 0x68, 0xfd, 0xf7, 0xbb, 0xfc, 0x15, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, 0xbb, 0x03, - 0x20, 0x10, 0xfc, 0x00, 0x00, 0xf8, 0xb5, 0x06, - 0x1c, 0x00, 0x20, 0x00, 0x90, 0x30, 0x1c, 0x00, - 0x27, 0x14, 0x1c, 0x0d, 0x1c, 0x12, 0xa1, 0x1a, - 0xf0, 0x79, 0xf8, 0x00, 0x28, 0x06, 0xd1, 0x6b, - 0x46, 0x29, 0x1c, 0x22, 0x1c, 0xe6, 0xf7, 0x5e, - 0xfb, 0x07, 0x1c, 0x0c, 0xe0, 0x30, 0x1c, 0x0d, - 0xa1, 0x1a, 0xf0, 0x6c, 0xf8, 0x00, 0x28, 0x06, - 0xd1, 0x6b, 0x46, 0x01, 0x20, 0x29, 0x1c, 0x22, - 0x1c, 0xe6, 0xf7, 0x50, 0xfb, 0x07, 0x1c, 0x00, - 0x22, 0x00, 0x2f, 0x00, 0xd0, 0x03, 0x22, 0x06, - 0x48, 0x06, 0x49, 0x40, 0x68, 0x00, 0x9b, 0xfd, - 0xf7, 0x88, 0xfc, 0xf8, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x72, 0x64, 0x00, 0x00, 0x77, 0x72, 0x00, - 0x00, 0x60, 0xbb, 0x03, 0x20, 0x13, 0xfc, 0xed, - 0x09, 0x00, 0xbb, 0x01, 0x00, 0x00, 0x90, 0xb5, - 0x4c, 0x1e, 0x07, 0x1c, 0x00, 0x29, 0x07, 0xd0, - 0x38, 0x78, 0x01, 0x37, 0x02, 0xf0, 0x39, 0xf8, - 0x20, 0x1c, 0x01, 0x3c, 0x00, 0x28, 0xf7, 0xd1, - 0x03, 0x48, 0x1a, 0xf0, 0x62, 0xf8, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x30, 0xbe, - 0x03, 0x20, 0x00, 0xb5, 0x01, 0xf0, 0xb7, 0xfe, - 0x00, 0x28, 0x07, 0xd0, 0x01, 0xf0, 0xc7, 0xfe, - 0x02, 0xf0, 0x23, 0xf8, 0x01, 0xf0, 0xaf, 0xfe, - 0x00, 0x28, 0xf7, 0xd1, 0x01, 0xf0, 0xc2, 0xfd, - 0x04, 0x48, 0xc0, 0x6a, 0x00, 0x28, 0x02, 0xd1, - 0x03, 0x48, 0x1a, 0xf0, 0x46, 0xf8, 0x08, 0xbc, - 0x18, 0x47, 0x28, 0x69, 0x03, 0x20, 0x30, 0xbe, - 0x03, 0x20, 0x01, 0x49, 0x08, 0x62, 0x70, 0x47, - 0x00, 0x00, 0x28, 0x69, 0x03, 0x20, 0x80, 0xb5, - 0x84, 0xb0, 0x00, 0x20, 0x03, 0x90, 0x01, 0x20, - 0xff, 0xf7, 0xf3, 0xff, 0x01, 0xf0, 0x89, 0xfe, - 0x00, 0x20, 0x26, 0x49, 0x00, 0x27, 0x42, 0x00, - 0x12, 0x18, 0x92, 0x00, 0x01, 0x30, 0x14, 0x28, - 0x8f, 0x50, 0xf8, 0xd3, 0x23, 0x48, 0x01, 0xf0, - 0xad, 0xfd, 0x22, 0x49, 0x4f, 0x67, 0xc8, 0x1d, - 0x75, 0x30, 0x8f, 0x67, 0xc7, 0x60, 0x07, 0x61, - 0x87, 0x61, 0xc7, 0x61, 0x47, 0x62, 0xc7, 0x62, - 0xcf, 0x67, 0x01, 0x21, 0x09, 0x06, 0x81, 0x60, - 0x47, 0x60, 0x07, 0x63, 0x47, 0x63, 0x87, 0x63, - 0xc7, 0x63, 0x07, 0x64, 0x01, 0xf0, 0xd5, 0xff, - 0x02, 0xf0, 0x07, 0xf8, 0x01, 0x27, 0xff, 0x02, - 0x3a, 0x1c, 0x00, 0x23, 0x03, 0xa9, 0x14, 0x48, - 0x0a, 0xf0, 0x17, 0xfe, 0x00, 0x28, 0x04, 0xd0, - 0x00, 0xdf, 0x04, 0xb0, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x03, 0x99, 0x01, 0x97, 0x00, 0x91, - 0x11, 0xa1, 0x0e, 0x4a, 0x0f, 0x48, 0x02, 0x23, - 0xf6, 0xf7, 0xed, 0x09, 0x00, 0xbc, 0x01, 0x2d, - 0xff, 0x00, 0x28, 0x01, 0xd0, 0x00, 0xdf, 0xee, - 0xe7, 0x02, 0xaa, 0x0d, 0x49, 0x02, 0x20, 0xf7, - 0xf7, 0x3a, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x00, - 0xdf, 0xe5, 0xe7, 0x01, 0xf0, 0x52, 0xfd, 0xe2, - 0xe7, 0x00, 0x00, 0x30, 0x68, 0x03, 0x20, 0xa0, - 0xbd, 0x03, 0x20, 0xac, 0x68, 0x03, 0x20, 0x94, - 0xb8, 0x03, 0x20, 0x39, 0xb9, 0x01, 0x20, 0x30, - 0xbe, 0x03, 0x20, 0x48, 0x5f, 0x4d, 0x4f, 0x4e, - 0x00, 0x00, 0x00, 0xa1, 0xb7, 0x01, 0x20, 0x00, - 0xb5, 0x04, 0x49, 0x01, 0x20, 0xc8, 0x62, 0x01, - 0xf0, 0x42, 0xfe, 0x01, 0xf0, 0x4e, 0xfd, 0x08, - 0xbc, 0x18, 0x47, 0x28, 0x69, 0x03, 0x20, 0x00, - 0xb5, 0x01, 0xf0, 0x4f, 0xfe, 0x04, 0x48, 0x41, - 0x6b, 0x00, 0x29, 0x02, 0xd1, 0xc1, 0x62, 0x01, - 0xf0, 0x41, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x28, - 0x69, 0x03, 0x20, 0x80, 0xb5, 0x07, 0x1c, 0x0a, - 0x28, 0x02, 0xd1, 0x0d, 0x20, 0xff, 0xf7, 0xf9, - 0xff, 0x01, 0xf0, 0x10, 0xfe, 0x00, 0x28, 0xfb, - 0xd1, 0x38, 0x1c, 0x01, 0xf0, 0x15, 0xfe, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x01, - 0xf0, 0x00, 0xfe, 0x00, 0x28, 0xfb, 0xd0, 0x01, - 0xf0, 0x10, 0xfe, 0x07, 0x1c, 0x05, 0x48, 0x40, - 0x6c, 0x00, 0x28, 0x02, 0xd1, 0x38, 0x1c, 0xff, - 0xf7, 0xe0, 0xff, 0x38, 0x1c, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x28, 0x69, 0x03, 0x20, 0xf0, - 0xb5, 0x26, 0x4d, 0x24, 0x4f, 0x28, 0x7d, 0x3c, - 0x18, 0x01, 0xf0, 0x7b, 0xff, 0x00, 0x28, 0x39, - 0xd1, 0x23, 0x4e, 0x01, 0xf0, 0x66, 0xff, 0x07, - 0x1c, 0x28, 0x6a, 0x00, 0x28, 0x02, 0xd0, 0x38, - 0x1c, 0xff, 0xf7, 0xc7, 0xff, 0x03, 0x2f, 0x02, - 0xd1, 0x00, 0x20, 0x68, 0x64, 0x1d, 0xe0, 0x0a, - 0x2f, 0x01, 0xd0, 0x0d, 0x2f, 0xed, 0x09, 0x00, - 0xbd, 0x01, 0x0e, 0xd1, 0x00, 0x27, 0x27, 0x70, - 0x67, 0x70, 0xa7, 0x70, 0xe7, 0x70, 0x68, 0x46, - 0xb0, 0x67, 0x44, 0x30, 0x70, 0x67, 0x00, 0x20, - 0x01, 0xf0, 0x56, 0xf8, 0x2f, 0x75, 0x11, 0x4c, - 0x1a, 0xe0, 0x08, 0x2f, 0x08, 0xd1, 0x28, 0x7d, - 0x00, 0x28, 0x15, 0xd0, 0x01, 0x38, 0x28, 0x75, - 0x00, 0x20, 0x01, 0x3c, 0x20, 0x70, 0x0f, 0xe0, - 0x27, 0x70, 0x28, 0x7d, 0x01, 0x34, 0x01, 0x30, - 0x28, 0x75, 0x28, 0x7d, 0x4b, 0x28, 0x07, 0xd3, - 0x00, 0x20, 0x28, 0x75, 0x08, 0xa0, 0x00, 0xf0, - 0xd6, 0xfb, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x01, 0xf0, 0x3a, 0xff, 0x00, 0x28, 0xbf, 0xd0, - 0xf7, 0xe7, 0x00, 0x00, 0xe0, 0xbd, 0x03, 0x20, - 0x28, 0x69, 0x03, 0x20, 0xac, 0x68, 0x03, 0x20, - 0x6c, 0x6f, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, - 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x6c, 0x69, 0x64, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x20, 0x6c, - 0x69, 0x6e, 0x65, 0x20, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x64, 0x0a, 0x00, 0x90, 0xb5, 0x14, 0x1c, - 0x0f, 0x1c, 0xff, 0xf7, 0x57, 0xff, 0x04, 0x21, - 0x20, 0x1c, 0x01, 0xf0, 0x1d, 0xfd, 0x1e, 0x4c, - 0x04, 0x21, 0xa0, 0x67, 0x80, 0x6b, 0x01, 0xf0, - 0x17, 0xfd, 0x60, 0x67, 0x1b, 0x48, 0x00, 0x24, - 0x44, 0x64, 0x00, 0x20, 0x02, 0xf0, 0x82, 0xf9, - 0x00, 0x2f, 0x05, 0xd1, 0xf8, 0x43, 0x00, 0xf0, - 0xff, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x01, 0x3f, 0x14, 0x2f, 0x09, 0xd3, 0x79, 0x1c, - 0x13, 0xa0, 0x00, 0xf0, 0x90, 0xfb, 0x00, 0x20, - 0xc0, 0x43, 0x00, 0xf0, 0xf1, 0xff, 0x20, 0x1c, - 0xef, 0xe7, 0x78, 0x00, 0xc0, 0x19, 0x14, 0x49, - 0x80, 0x00, 0x08, 0x58, 0x00, 0x28, 0x09, 0xd1, - 0x79, 0x1c, 0x12, 0xa0, 0x00, 0xf0, 0x7f, 0xfb, - 0xed, 0x09, 0x00, 0xbe, 0x01, 0x00, 0x20, 0xc0, - 0x43, 0x00, 0xf0, 0xe0, 0xff, 0x20, 0x1c, 0xde, - 0xe7, 0x00, 0x22, 0x00, 0x21, 0x38, 0x1c, 0x03, - 0xf0, 0x9f, 0xf8, 0x78, 0x1c, 0x00, 0xf0, 0xd6, - 0xff, 0xd5, 0xe7, 0x00, 0x00, 0xac, 0x68, 0x03, - 0x20, 0x28, 0x69, 0x03, 0x20, 0x0a, 0x23, 0x20, - 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, - 0x53, 0x57, 0x49, 0x20, 0x4e, 0x72, 0x20, 0x25, - 0x64, 0x00, 0x00, 0x00, 0x00, 0x30, 0x68, 0x03, - 0x20, 0x0a, 0x23, 0x20, 0x53, 0x57, 0x49, 0x5f, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x25, - 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x00, 0x80, 0xb5, 0x07, - 0x1c, 0x00, 0x78, 0x00, 0x28, 0x06, 0xd0, 0x38, - 0x78, 0x01, 0x37, 0xff, 0xf7, 0x07, 0xff, 0x38, - 0x78, 0x00, 0x28, 0xf8, 0xd1, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x05, 0x1c, 0x07, - 0x1c, 0x40, 0x18, 0x46, 0x1f, 0x16, 0xa0, 0xff, - 0xf7, 0xe9, 0xff, 0x01, 0xf0, 0x9f, 0xfe, 0x00, - 0x28, 0x03, 0xd0, 0x01, 0xf0, 0x9b, 0xfe, 0x00, - 0x28, 0xfb, 0xd1, 0x01, 0xf0, 0x87, 0xfe, 0x04, - 0x1c, 0x10, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x02, - 0xd0, 0x20, 0x1c, 0xff, 0xf7, 0xe7, 0xfe, 0x0a, - 0x2c, 0x03, 0xd0, 0x0d, 0x2c, 0x01, 0xd0, 0xb7, - 0x42, 0x07, 0xd3, 0x00, 0x20, 0x38, 0x70, 0x78, - 0x70, 0xb8, 0x70, 0xf8, 0x70, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x08, 0x2c, 0x05, 0xd1, 0xaf, - 0x42, 0xdb, 0xd9, 0x00, 0x20, 0x01, 0x3f, 0x38, - 0x70, 0xd7, 0xe7, 0x3c, 0x70, 0x01, 0x37, 0xd4, - 0xe7, 0x0a, 0x23, 0x20, 0x00, 0x28, 0x69, 0x03, - 0x20, 0xb0, 0xb4, 0x1e, 0x49, 0x00, 0x27, 0x00, - 0x23, 0xca, 0x1d, 0x48, 0x32, 0x01, 0xe0, 0x6c, - 0x1c, 0x04, 0x60, 0xed, 0x09, 0x00, 0xbf, 0x01, - 0x05, 0x68, 0x2c, 0x78, 0x00, 0x2c, 0x05, 0xd0, - 0x20, 0x2c, 0xf7, 0xd0, 0x09, 0x2c, 0xf5, 0xd0, - 0x0c, 0x1c, 0x20, 0xe0, 0x18, 0x1c, 0xb0, 0xbc, - 0x70, 0x47, 0x05, 0x68, 0x2d, 0x78, 0x20, 0x2d, - 0x0f, 0xd0, 0x06, 0xdc, 0x09, 0x2d, 0x0c, 0xd0, - 0x0a, 0x2d, 0x16, 0xd0, 0x0d, 0x2d, 0x14, 0xd0, - 0x09, 0xe0, 0x28, 0x2d, 0x03, 0xd0, 0x29, 0x2d, - 0x05, 0xd1, 0x01, 0x3f, 0x03, 0xe0, 0x01, 0x37, - 0x01, 0xe0, 0x00, 0x2f, 0x09, 0xd0, 0x0d, 0x70, - 0x05, 0x68, 0x01, 0x31, 0x01, 0x35, 0x05, 0x60, - 0x2d, 0x78, 0x00, 0x2d, 0x01, 0xd0, 0x8a, 0x42, - 0xdf, 0xd2, 0x8a, 0x42, 0x01, 0xd2, 0x18, 0x1c, - 0xd9, 0xe7, 0x0b, 0x70, 0x20, 0x1c, 0xd6, 0xe7, - 0x00, 0x00, 0x44, 0xbd, 0x03, 0x20, 0xb0, 0xb5, - 0x07, 0x1c, 0x00, 0x68, 0x01, 0x78, 0x28, 0x29, - 0x06, 0xd1, 0x01, 0x30, 0x38, 0x60, 0x38, 0x1c, - 0xff, 0xf7, 0xf5, 0xff, 0x04, 0x1c, 0x03, 0xe0, - 0x38, 0x1c, 0x00, 0xf0, 0xb6, 0xf8, 0x04, 0x1c, - 0x38, 0x68, 0x00, 0x78, 0x00, 0x28, 0x5d, 0xd0, - 0x01, 0x25, 0x05, 0xe0, 0x48, 0x1c, 0x38, 0x60, - 0x38, 0x68, 0x00, 0x78, 0x00, 0x28, 0x15, 0xd0, - 0x39, 0x68, 0x08, 0x78, 0x2b, 0x28, 0x11, 0xd0, - 0x2d, 0x28, 0x0f, 0xd0, 0x26, 0x28, 0x0d, 0xd0, - 0x7c, 0x28, 0x0b, 0xd0, 0x2a, 0x28, 0x09, 0xd0, - 0x2f, 0x28, 0x07, 0xd0, 0x3c, 0x28, 0x05, 0xd0, - 0x3e, 0x28, 0x03, 0xd0, 0x28, 0x28, 0x01, 0xd0, - 0x29, 0x28, 0xe3, 0xd1, 0x38, 0x68, 0x01, 0x78, - 0x2d, 0x29, 0x4c, 0xd0, 0x0a, 0xdc, 0x26, 0x39, - 0x06, 0x29, 0x5d, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, - 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x4b, 0x63, - 0x6c, 0x74, 0x52, 0x3d, 0x2f, 0x29, 0x54, 0xd0, - 0x3c, 0x29, 0x0a, 0xd0, 0x3e, 0x29, 0xed, 0x09, - 0x00, 0xc0, 0x01, 0x1d, 0xd0, 0x7c, 0x29, 0x57, - 0xd1, 0x01, 0x30, 0x38, 0x60, 0x38, 0x1c, 0x00, - 0xf0, 0x76, 0xf8, 0x04, 0x43, 0x50, 0xe0, 0x01, - 0x30, 0x38, 0x60, 0x01, 0x78, 0x3c, 0x29, 0x06, - 0xd1, 0x01, 0x30, 0x38, 0x60, 0x38, 0x1c, 0x00, - 0xf0, 0x6a, 0xf8, 0x84, 0x40, 0x44, 0xe0, 0x38, - 0x1c, 0x00, 0xf0, 0x65, 0xf8, 0x29, 0x1c, 0x84, - 0x42, 0x00, 0xd3, 0x00, 0x21, 0x0c, 0x1c, 0x3b, - 0xe0, 0x01, 0x30, 0x38, 0x60, 0x01, 0x78, 0x3e, - 0x29, 0x07, 0xd1, 0x01, 0x30, 0x38, 0x60, 0x38, - 0x1c, 0x00, 0xf0, 0x55, 0xf8, 0xc4, 0x40, 0x2f, - 0xe0, 0x33, 0xe0, 0x38, 0x1c, 0x00, 0xf0, 0x4f, - 0xf8, 0x29, 0x1c, 0x84, 0x42, 0x00, 0xd8, 0x00, - 0x21, 0x0c, 0x1c, 0x25, 0xe0, 0x01, 0x30, 0x38, - 0x60, 0x38, 0x1c, 0x00, 0xf0, 0x44, 0xf8, 0x24, - 0x18, 0x1e, 0xe0, 0x01, 0x30, 0x38, 0x60, 0x38, - 0x1c, 0x00, 0xf0, 0x3d, 0xf8, 0x24, 0x1a, 0x17, - 0xe0, 0x01, 0x30, 0x38, 0x60, 0x38, 0x1c, 0x00, - 0xf0, 0x36, 0xf8, 0x04, 0x40, 0x10, 0xe0, 0x01, - 0x30, 0x38, 0x60, 0x38, 0x1c, 0x00, 0xf0, 0x2f, - 0xf8, 0x44, 0x43, 0x09, 0xe0, 0x08, 0xe0, 0x01, - 0x30, 0x38, 0x60, 0x38, 0x1c, 0x00, 0xf0, 0x27, - 0xf8, 0x21, 0x1c, 0xe4, 0xf7, 0x98, 0xfa, 0x04, - 0x1c, 0x38, 0x68, 0x00, 0x78, 0x00, 0x28, 0x00, - 0xd0, 0x70, 0xe7, 0x20, 0x1c, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x38, 0x68, 0x01, 0x30, 0x38, - 0x60, 0x05, 0xa0, 0x00, 0xf0, 0x17, 0xfa, 0x20, - 0x1c, 0xf4, 0xe7, 0x38, 0x68, 0x01, 0x30, 0x38, - 0x60, 0x20, 0x1c, 0xef, 0xe7, 0x00, 0x00, 0x0a, - 0x27, 0x28, 0x27, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x20, 0x21, 0x00, 0xb0, - 0xb5, 0xed, 0x09, 0x00, 0xc1, 0x01, 0x07, 0x1c, - 0x00, 0x20, 0x04, 0x21, 0x01, 0xe0, 0x5a, 0x1c, - 0x3a, 0x60, 0x3b, 0x68, 0x1a, 0x78, 0x00, 0x2a, - 0x0d, 0xd0, 0x20, 0x2a, 0xf7, 0xd0, 0x09, 0x2a, - 0xf5, 0xd0, 0x3c, 0x68, 0x24, 0x78, 0x7e, 0x2c, - 0x08, 0xd1, 0x58, 0x1c, 0x38, 0x60, 0x38, 0x1c, - 0xff, 0xf7, 0xe8, 0xff, 0xc0, 0x43, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x28, 0x2a, 0x05, 0xd1, - 0x58, 0x1c, 0x38, 0x60, 0x38, 0x1c, 0xff, 0xf7, - 0x17, 0xff, 0xf4, 0xe7, 0x2a, 0x2a, 0x06, 0xd1, - 0x58, 0x1c, 0x38, 0x60, 0x38, 0x1c, 0xff, 0xf7, - 0xd5, 0xff, 0x00, 0x68, 0xeb, 0xe7, 0x3a, 0x2a, - 0x64, 0xd1, 0x58, 0x1c, 0x38, 0x60, 0x02, 0x22, - 0xb7, 0xa1, 0x09, 0xf0, 0x2f, 0xff, 0xb7, 0x4c, - 0x00, 0x28, 0x01, 0xd1, 0x20, 0x68, 0xde, 0xe7, - 0x38, 0x68, 0xb5, 0xa1, 0x02, 0x22, 0x09, 0xf0, - 0x25, 0xff, 0x00, 0x28, 0x01, 0xd1, 0x60, 0x68, - 0xd5, 0xe7, 0x38, 0x68, 0xb1, 0xa1, 0x02, 0x22, - 0x09, 0xf0, 0x1c, 0xff, 0x00, 0x28, 0x01, 0xd1, - 0xa0, 0x68, 0xcc, 0xe7, 0x38, 0x68, 0xae, 0xa1, - 0x02, 0x22, 0x09, 0xf0, 0x13, 0xff, 0x00, 0x28, - 0x01, 0xd1, 0xe0, 0x68, 0xc3, 0xe7, 0x38, 0x68, - 0xaa, 0xa1, 0x02, 0x22, 0x09, 0xf0, 0x0a, 0xff, - 0x00, 0x28, 0x01, 0xd1, 0x20, 0x69, 0xba, 0xe7, - 0x38, 0x68, 0xa7, 0xa1, 0x02, 0x22, 0x09, 0xf0, - 0x01, 0xff, 0x00, 0x28, 0x01, 0xd1, 0x60, 0x69, - 0xb1, 0xe7, 0x38, 0x68, 0xa3, 0xa1, 0x02, 0x22, - 0x09, 0xf0, 0xf8, 0xfe, 0x00, 0x28, 0x01, 0xd1, - 0x60, 0x69, 0xa8, 0xe7, 0x38, 0x68, 0xa0, 0xa1, - 0x02, 0x22, 0x09, 0xf0, 0xef, 0xfe, 0x00, 0x28, - 0x01, 0xd1, 0xe0, 0x69, 0x9f, 0xe7, 0x38, 0x68, - 0x9c, 0xa1, 0x02, 0x22, 0x09, 0xf0, 0xe6, 0xfe, - 0x00, 0x28, 0x01, 0xd1, 0xed, 0x09, 0x00, 0xc2, - 0x01, 0x20, 0x6a, 0x96, 0xe7, 0x38, 0x68, 0x99, - 0xa1, 0x02, 0x22, 0x09, 0xf0, 0xdd, 0xfe, 0x00, - 0x28, 0x01, 0xd1, 0x60, 0x6a, 0x8d, 0xe7, 0x38, - 0x68, 0x95, 0xa1, 0x02, 0x22, 0x09, 0xf0, 0xd4, - 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6a, 0x84, - 0xe7, 0xcf, 0xe0, 0x38, 0x68, 0x91, 0xa1, 0x02, - 0x22, 0x09, 0xf0, 0xca, 0xfe, 0x00, 0x28, 0x01, - 0xd1, 0xe0, 0x6a, 0x7a, 0xe7, 0x38, 0x68, 0x8e, - 0xa1, 0x02, 0x22, 0x09, 0xf0, 0xc1, 0xfe, 0x00, - 0x28, 0x01, 0xd1, 0x20, 0x6b, 0x71, 0xe7, 0x38, - 0x68, 0x8a, 0xa1, 0x02, 0x22, 0x09, 0xf0, 0xb8, - 0xfe, 0x00, 0x28, 0x01, 0xd1, 0x60, 0x6b, 0x68, - 0xe7, 0x38, 0x68, 0x87, 0xa1, 0x02, 0x22, 0x09, - 0xf0, 0xaf, 0xfe, 0x00, 0x28, 0x01, 0xd1, 0xa0, - 0x6b, 0x5f, 0xe7, 0x38, 0x68, 0x83, 0xa1, 0x02, - 0x22, 0x09, 0xf0, 0xa6, 0xfe, 0x00, 0x28, 0x01, - 0xd1, 0xe0, 0x6b, 0x56, 0xe7, 0x38, 0x68, 0x80, - 0xa1, 0x02, 0x22, 0x09, 0xf0, 0x9d, 0xfe, 0x7f, - 0x4c, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6f, 0x40, - 0x68, 0x4b, 0xe7, 0x38, 0x68, 0x7c, 0xa1, 0x02, - 0x22, 0x09, 0xf0, 0x92, 0xfe, 0x00, 0x28, 0x02, - 0xd1, 0xa0, 0x6f, 0x80, 0x68, 0x41, 0xe7, 0x38, - 0x68, 0x78, 0xa1, 0x02, 0x22, 0x09, 0xf0, 0x88, - 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6f, 0xc0, - 0x68, 0x37, 0xe7, 0x38, 0x68, 0x74, 0xa1, 0x02, - 0x22, 0x09, 0xf0, 0x7e, 0xfe, 0x00, 0x28, 0x02, - 0xd1, 0xa0, 0x6f, 0x00, 0x69, 0x2d, 0xe7, 0x38, - 0x68, 0x70, 0xa1, 0x02, 0x22, 0x09, 0xf0, 0x74, - 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6f, 0x40, - 0x69, 0x23, 0xe7, 0x38, 0x68, 0x6c, 0xa1, 0x02, - 0x22, 0x09, 0xf0, 0x6a, 0xfe, 0x00, 0x28, 0x02, - 0xd1, 0xa0, 0x6f, 0x80, 0x69, 0x19, 0xe7, 0xed, - 0x09, 0x00, 0xc3, 0x01, 0x38, 0x68, 0x68, 0xa1, - 0x02, 0x22, 0x09, 0xf0, 0x60, 0xfe, 0x00, 0x28, - 0x02, 0xd1, 0xa0, 0x6f, 0xc0, 0x69, 0x0f, 0xe7, - 0x38, 0x68, 0x64, 0xa1, 0x02, 0x22, 0x09, 0xf0, - 0x56, 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6f, - 0x00, 0x6a, 0x05, 0xe7, 0x38, 0x68, 0x60, 0xa1, - 0x02, 0x22, 0x09, 0xf0, 0x4c, 0xfe, 0x00, 0x28, - 0x02, 0xd1, 0xa0, 0x6f, 0x40, 0x6a, 0xfb, 0xe6, - 0x38, 0x68, 0x5c, 0xa1, 0x02, 0x22, 0x09, 0xf0, - 0x42, 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6f, - 0x80, 0x6a, 0xf1, 0xe6, 0x38, 0x68, 0x58, 0xa1, - 0x02, 0x22, 0x09, 0xf0, 0x38, 0xfe, 0x00, 0x28, - 0x02, 0xd1, 0xa0, 0x6f, 0xc0, 0x6a, 0xe7, 0xe6, - 0x38, 0x68, 0x54, 0xa1, 0x02, 0x22, 0x09, 0xf0, - 0x2e, 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6f, - 0x00, 0x6b, 0xdd, 0xe6, 0x38, 0x68, 0x50, 0xa1, - 0x02, 0x22, 0x09, 0xf0, 0x24, 0xfe, 0x00, 0x28, - 0x02, 0xd1, 0xa0, 0x6f, 0x40, 0x6b, 0xd3, 0xe6, - 0x38, 0x68, 0x4c, 0xa1, 0x02, 0x22, 0x09, 0xf0, - 0x1a, 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6f, - 0xc0, 0x6b, 0xc9, 0xe6, 0x38, 0x68, 0x48, 0xa1, - 0x02, 0x22, 0x09, 0xf0, 0x10, 0xfe, 0x00, 0x28, - 0x02, 0xd1, 0xa0, 0x6f, 0x80, 0x6b, 0xbf, 0xe6, - 0x38, 0x68, 0x44, 0xa1, 0x02, 0x22, 0x09, 0xf0, - 0x06, 0xfe, 0x00, 0x28, 0x02, 0xd1, 0xa0, 0x6f, - 0x00, 0x6c, 0xb5, 0xe6, 0x00, 0x20, 0xb3, 0xe6, - 0x23, 0x2a, 0x04, 0xd1, 0x58, 0x1c, 0x38, 0x60, - 0x09, 0xf0, 0xdb, 0xfb, 0xac, 0xe6, 0x78, 0x2a, - 0x02, 0xd1, 0x59, 0x1c, 0x39, 0x60, 0x04, 0x21, - 0x3a, 0x68, 0x13, 0x78, 0x6f, 0x2b, 0x02, 0xd1, - 0x51, 0x1c, 0x39, 0x60, 0x03, 0x21, 0x3a, 0x68, - 0x13, 0x78, 0x42, 0x2b, 0x02, 0xd1, 0x51, 0x1c, - 0x39, 0x60, 0xed, 0x09, 0x00, 0xc4, 0x01, 0x01, - 0x21, 0x3a, 0x68, 0x12, 0x78, 0x00, 0x2a, 0x84, - 0xd0, 0x3d, 0x68, 0x2a, 0x78, 0xd4, 0x1f, 0x29, - 0x3c, 0x09, 0x2c, 0x02, 0xd8, 0x88, 0x40, 0x20, - 0x18, 0x0e, 0xe0, 0xd3, 0x1f, 0x3a, 0x3b, 0x05, - 0x2b, 0x03, 0xd8, 0x88, 0x40, 0x37, 0x3a, 0x10, - 0x18, 0x06, 0xe0, 0xd3, 0x1f, 0x5a, 0x3b, 0x05, - 0x2b, 0x8d, 0xd8, 0x88, 0x40, 0x57, 0x3a, 0x10, - 0x18, 0x6a, 0x1c, 0x3a, 0x60, 0x12, 0x78, 0x00, - 0x2a, 0xe2, 0xd1, 0x77, 0xe6, 0x00, 0x00, 0x74, - 0x31, 0x00, 0x00, 0xa0, 0xbd, 0x03, 0x20, 0x74, - 0x32, 0x00, 0x00, 0x74, 0x33, 0x00, 0x00, 0x74, - 0x34, 0x00, 0x00, 0x74, 0x35, 0x00, 0x00, 0x74, - 0x36, 0x00, 0x00, 0x74, 0x37, 0x00, 0x00, 0x74, - 0x38, 0x00, 0x00, 0x74, 0x39, 0x00, 0x00, 0x74, - 0x31, 0x30, 0x00, 0x74, 0x31, 0x31, 0x00, 0x74, - 0x31, 0x32, 0x00, 0x74, 0x31, 0x33, 0x00, 0x74, - 0x31, 0x34, 0x00, 0x74, 0x31, 0x35, 0x00, 0x74, - 0x31, 0x36, 0x00, 0x61, 0x31, 0x00, 0x00, 0xac, - 0x68, 0x03, 0x20, 0x61, 0x32, 0x00, 0x00, 0x61, - 0x33, 0x00, 0x00, 0x61, 0x34, 0x00, 0x00, 0x76, - 0x31, 0x00, 0x00, 0x76, 0x32, 0x00, 0x00, 0x76, - 0x33, 0x00, 0x00, 0x76, 0x34, 0x00, 0x00, 0x76, - 0x35, 0x00, 0x00, 0x76, 0x36, 0x00, 0x00, 0x76, - 0x37, 0x00, 0x00, 0x76, 0x38, 0x00, 0x00, 0x69, - 0x70, 0x00, 0x00, 0x6c, 0x72, 0x00, 0x00, 0x73, - 0x70, 0x00, 0x00, 0x70, 0x63, 0x00, 0x00, 0x80, - 0xb4, 0x00, 0x27, 0x03, 0xe0, 0x03, 0x70, 0x01, - 0x30, 0x01, 0x31, 0x01, 0x3a, 0x00, 0x23, 0xcb, - 0x56, 0x00, 0x2b, 0x08, 0xd0, 0x20, 0x2b, 0x06, - 0xd0, 0x0a, 0x2b, 0x04, 0xd0, 0x09, 0x2b, 0x02, - 0xd0, 0x00, 0x2a, 0xef, 0xd1, 0x05, 0xe0, 0x00, - 0x2a, 0x03, 0xd0, 0x07, 0x70, 0xed, 0x09, 0x00, - 0xc5, 0x01, 0x01, 0x30, 0x01, 0x3a, 0xfb, 0xd1, - 0x07, 0x70, 0x80, 0xbc, 0x70, 0x47, 0x0f, 0xb4, - 0xf0, 0xb5, 0xbb, 0xb0, 0x00, 0x21, 0x40, 0x98, - 0x13, 0x91, 0x00, 0x23, 0xc0, 0x56, 0x00, 0x27, - 0x41, 0xac, 0x00, 0x28, 0x73, 0xd0, 0x0a, 0xaa, - 0x01, 0x32, 0x3a, 0x92, 0x0c, 0xe0, 0x3d, 0x2f, - 0x0a, 0xd3, 0x00, 0x21, 0x1a, 0xa8, 0xc1, 0x55, - 0xff, 0xf7, 0x9a, 0xfc, 0x02, 0x22, 0x39, 0x1c, - 0x1a, 0xa8, 0xf8, 0xf7, 0x95, 0xfe, 0x00, 0x27, - 0x40, 0x98, 0x00, 0x23, 0xc1, 0x56, 0x08, 0x29, - 0x0c, 0xd0, 0x09, 0x29, 0x0e, 0xd0, 0x25, 0x29, - 0x67, 0xd1, 0x01, 0x30, 0x40, 0x90, 0x00, 0x20, - 0x00, 0x26, 0x00, 0x25, 0x16, 0x90, 0x14, 0x90, - 0x15, 0x90, 0x42, 0xe0, 0x00, 0x2f, 0x65, 0xd0, - 0x01, 0x3f, 0x76, 0xe3, 0xb8, 0x07, 0x61, 0xd0, - 0x20, 0x22, 0x38, 0x1c, 0x1a, 0xa9, 0x0a, 0x54, - 0x01, 0x37, 0xb8, 0x07, 0xf9, 0xd1, 0x6c, 0xe3, - 0x2d, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x14, 0x90, - 0x08, 0x18, 0x40, 0x90, 0x40, 0x98, 0x00, 0x23, - 0xc1, 0x56, 0x20, 0x29, 0x04, 0xd1, 0x00, 0x2d, - 0x00, 0xd1, 0x20, 0x25, 0x01, 0x30, 0x40, 0x90, - 0x40, 0x98, 0x00, 0x23, 0xc1, 0x56, 0x2b, 0x29, - 0x02, 0xd1, 0x2b, 0x25, 0x01, 0x30, 0x40, 0x90, - 0x40, 0x98, 0x00, 0x23, 0xc1, 0x56, 0x30, 0x29, - 0x06, 0xd1, 0x01, 0x30, 0x40, 0x90, 0x14, 0x98, - 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x15, 0x90, - 0x40, 0x98, 0x00, 0x23, 0xc1, 0x56, 0x23, 0x29, - 0x02, 0xd1, 0x30, 0x25, 0x01, 0x30, 0x40, 0x90, - 0x40, 0x98, 0x00, 0x23, 0xc0, 0x56, 0x3a, 0x28, - 0x03, 0xd1, 0x40, 0x98, 0x3a, 0x25, 0x01, 0x30, - 0x40, 0x90, 0x40, 0x99, 0x00, 0x23, 0xc8, 0x56, - 0x2d, 0x28, 0xc5, 0xd0, 0x2b, 0x28, 0xc3, 0xd0, - 0xed, 0x09, 0x00, 0xc6, 0x01, 0x20, 0x28, 0xc1, - 0xd0, 0x30, 0x28, 0xbf, 0xd0, 0x23, 0x28, 0xbd, - 0xd0, 0x00, 0xe0, 0x7d, 0xe3, 0x3a, 0x28, 0xb9, - 0xd0, 0x40, 0x9a, 0xd2, 0x56, 0x2a, 0x2a, 0x07, - 0xd1, 0x48, 0x1c, 0x40, 0x90, 0x04, 0x34, 0xe0, - 0x1f, 0x39, 0x38, 0xc6, 0x6b, 0x11, 0xe0, 0x70, - 0xe3, 0x30, 0x38, 0x09, 0x28, 0x0d, 0xd8, 0x08, - 0x1c, 0x09, 0xf0, 0xae, 0xfa, 0x06, 0x1c, 0x02, - 0xe0, 0x68, 0xe3, 0x01, 0x30, 0x40, 0x90, 0x40, - 0x98, 0x00, 0x23, 0xc1, 0x56, 0x30, 0x39, 0x09, - 0x29, 0xf7, 0xd9, 0x40, 0x98, 0x00, 0x23, 0xc1, - 0x56, 0x2e, 0x29, 0x18, 0xd1, 0x01, 0x30, 0x40, - 0x90, 0xc1, 0x56, 0x2a, 0x29, 0x07, 0xd1, 0x01, - 0x30, 0x40, 0x90, 0x04, 0x34, 0xe0, 0x1f, 0x39, - 0x38, 0xc0, 0x6b, 0x16, 0x90, 0x0b, 0xe0, 0x09, - 0xf0, 0x8f, 0xfa, 0x16, 0x90, 0x01, 0xe0, 0x01, - 0x30, 0x40, 0x90, 0x40, 0x98, 0x00, 0x23, 0xc1, - 0x56, 0x30, 0x39, 0x09, 0x29, 0xf7, 0xd9, 0x16, - 0x98, 0xb0, 0x42, 0x00, 0xd9, 0x16, 0x9e, 0x40, - 0x98, 0x00, 0x23, 0xc1, 0x56, 0x4e, 0x29, 0x1c, - 0xd0, 0x17, 0xdc, 0x46, 0x29, 0x19, 0xd0, 0x4c, - 0x29, 0x03, 0xd1, 0x01, 0x21, 0x40, 0x18, 0x40, - 0x90, 0x13, 0x91, 0x40, 0x98, 0x00, 0x23, 0xc0, - 0x56, 0x69, 0x28, 0x19, 0xd0, 0x35, 0xdc, 0x58, - 0x28, 0x50, 0xd0, 0x0f, 0xdc, 0x25, 0x28, 0x3f, - 0xd0, 0x42, 0x28, 0x54, 0xd0, 0x50, 0x28, 0x53, - 0xd1, 0xfb, 0xe0, 0x68, 0x29, 0x01, 0xd0, 0x6c, - 0x29, 0xeb, 0xd1, 0x00, 0x21, 0x01, 0x30, 0x40, - 0x90, 0x13, 0x91, 0xe6, 0xe7, 0x62, 0x28, 0x5a, - 0xd0, 0x63, 0x28, 0x3c, 0xd0, 0x64, 0x28, 0x43, - 0xd1, 0x13, 0x99, 0x01, 0x29, 0x54, 0xd1, 0x08, - 0x34, 0xe1, 0x1f, 0x01, 0x39, 0x08, 0x68, 0xf5, - 0xa3, 0x11, 0x90, 0xed, 0x09, 0x00, 0xc7, 0x01, - 0x49, 0x68, 0x12, 0x91, 0x1a, 0x68, 0x5b, 0x68, - 0xe4, 0xf7, 0x43, 0xf8, 0x00, 0x28, 0x6a, 0xd0, - 0x2d, 0x21, 0x1a, 0xa8, 0xc1, 0x55, 0x11, 0x98, - 0x12, 0x99, 0x00, 0x22, 0xe4, 0xf7, 0x4b, 0xf8, - 0x11, 0x90, 0x12, 0x91, 0x01, 0x37, 0x76, 0xe0, - 0xc1, 0x1f, 0x67, 0x39, 0x0b, 0x29, 0x5b, 0xd2, - 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, - 0x00, 0x1c, 0x0b, 0xc8, 0xc7, 0xc6, 0xc6, 0xc5, - 0xc4, 0x1f, 0xc6, 0xc6, 0xc3, 0x00, 0x25, 0x21, - 0x1a, 0xa8, 0xc1, 0x55, 0x01, 0x37, 0x56, 0xe2, - 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, 0x6b, - 0x07, 0x60, 0x40, 0x98, 0x01, 0x30, 0x40, 0x90, - 0x4d, 0xe2, 0x80, 0xe2, 0x04, 0x34, 0xe0, 0x1f, - 0x39, 0x38, 0xc0, 0x6b, 0x1a, 0xa9, 0xc8, 0x55, - 0x01, 0x37, 0x44, 0xe2, 0x25, 0xe1, 0x05, 0xe3, - 0x00, 0x2d, 0x02, 0xd0, 0x1a, 0xa8, 0xc5, 0x55, - 0x01, 0x37, 0x13, 0x99, 0x01, 0x29, 0x0b, 0xd1, - 0x08, 0x34, 0xe1, 0x1f, 0x01, 0x39, 0x08, 0x68, - 0x49, 0x68, 0x0a, 0x23, 0x0b, 0xaa, 0x09, 0xf0, - 0x38, 0xfa, 0x09, 0xe0, 0x83, 0xe0, 0x41, 0xe0, - 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, 0x6b, - 0x0a, 0x22, 0x0b, 0xa9, 0x09, 0xf0, 0xfb, 0xfa, - 0x0b, 0xa8, 0x09, 0xf0, 0x54, 0xfb, 0x05, 0x1c, - 0x14, 0x98, 0x01, 0x28, 0x06, 0xd1, 0x1a, 0xa8, - 0xc0, 0x19, 0x2a, 0x1c, 0x0b, 0xa9, 0xe3, 0xf7, - 0xfe, 0xff, 0x7f, 0x19, 0xae, 0x42, 0x12, 0xd9, - 0x20, 0x22, 0x30, 0x21, 0x15, 0x98, 0x00, 0x28, - 0x07, 0xd0, 0x14, 0x98, 0x00, 0x28, 0x04, 0xd1, - 0x1a, 0xa8, 0xc1, 0x55, 0x03, 0xe0, 0x11, 0xe0, - 0xcc, 0xe2, 0x1a, 0xa8, 0xc2, 0x55, 0x01, 0x3e, - 0x01, 0x37, 0xae, 0x42, 0xee, 0xd8, 0x14, 0x98, - 0x00, 0x28, 0x06, 0xd1, 0x1a, 0xa8, 0xed, 0x09, - 0x00, 0xc8, 0x01, 0xc0, 0x19, 0x2a, 0x1c, 0x0b, - 0xa9, 0xe3, 0xf7, 0xdf, 0xff, 0x7f, 0x19, 0xf8, - 0xe1, 0x00, 0x2d, 0x02, 0xd0, 0x1a, 0xa8, 0xc5, - 0x55, 0x01, 0x37, 0x0a, 0x23, 0x11, 0x98, 0x12, - 0x99, 0x0b, 0xaa, 0x09, 0xf0, 0xf4, 0xf9, 0x14, - 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, - 0x6b, 0x00, 0x28, 0x05, 0xda, 0x2d, 0x22, 0x1a, - 0xa9, 0xca, 0x55, 0x40, 0x42, 0x01, 0x37, 0x04, - 0xe0, 0x00, 0x2d, 0x02, 0xd0, 0x1a, 0xa9, 0xcd, - 0x55, 0x01, 0x37, 0x0a, 0x22, 0x0b, 0xa9, 0x09, - 0xf0, 0xac, 0xfa, 0x0b, 0xa8, 0x09, 0xf0, 0x05, - 0xfb, 0x05, 0x1c, 0x14, 0x98, 0x01, 0x28, 0x06, - 0xd1, 0x1a, 0xa8, 0xc0, 0x19, 0x2a, 0x1c, 0x0b, - 0xa9, 0xe3, 0xf7, 0xaf, 0xff, 0x7f, 0x19, 0xae, - 0x42, 0x10, 0xd9, 0x20, 0x22, 0x30, 0x21, 0x15, - 0x98, 0x00, 0x28, 0x05, 0xd0, 0x14, 0x98, 0x00, - 0x28, 0x02, 0xd1, 0x1a, 0xa8, 0xc1, 0x55, 0x01, - 0xe0, 0x1a, 0xa8, 0xc2, 0x55, 0x01, 0x3e, 0x01, - 0x37, 0xae, 0x42, 0xf0, 0xd8, 0x14, 0x98, 0x00, - 0x28, 0x06, 0xd1, 0x1a, 0xa8, 0xc0, 0x19, 0x2a, - 0x1c, 0x0b, 0xa9, 0xe3, 0xf7, 0x92, 0xff, 0x7f, - 0x19, 0xab, 0xe1, 0x13, 0x99, 0x01, 0x29, 0x0f, - 0xd1, 0x08, 0x34, 0x6a, 0x46, 0xe1, 0x1f, 0x01, - 0x39, 0x08, 0x68, 0x49, 0x68, 0x02, 0x23, 0x09, - 0xf0, 0xa6, 0xf9, 0x0d, 0xe0, 0xd1, 0xe1, 0x43, - 0xe2, 0xf6, 0xe0, 0x5d, 0xe2, 0x41, 0xe1, 0x33, - 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0x69, - 0x46, 0x02, 0x22, 0xc0, 0x6b, 0x09, 0xf0, 0x65, - 0xfa, 0x68, 0x46, 0x09, 0xf0, 0xbe, 0xfa, 0x05, - 0x1c, 0x14, 0x98, 0x01, 0x28, 0x06, 0xd1, 0x1a, - 0xa8, 0xc0, 0x19, 0x69, 0x46, 0x2a, 0x1c, 0xe3, - 0xf7, 0x68, 0xff, 0x7f, 0x19, 0xae, 0x42, 0x10, - 0xd9, 0xed, 0x09, 0x00, 0xc9, 0x01, 0x20, 0x22, - 0x30, 0x21, 0x15, 0x98, 0x00, 0x28, 0x05, 0xd0, - 0x14, 0x98, 0x00, 0x28, 0x02, 0xd1, 0x1a, 0xa8, - 0xc1, 0x55, 0x01, 0xe0, 0x1a, 0xa8, 0xc2, 0x55, - 0x01, 0x3e, 0x01, 0x37, 0xae, 0x42, 0xf0, 0xd8, - 0x14, 0x98, 0x00, 0x28, 0x06, 0xd1, 0x1a, 0xa8, - 0xc0, 0x19, 0x69, 0x46, 0x2a, 0x1c, 0xe3, 0xf7, - 0x4b, 0xff, 0x7f, 0x19, 0x64, 0xe1, 0x30, 0x2d, - 0x03, 0xd1, 0x0a, 0xab, 0x1d, 0x70, 0x3a, 0x9a, - 0x00, 0xe0, 0x0a, 0xaa, 0x13, 0x99, 0x01, 0x29, - 0x08, 0xd1, 0x08, 0x34, 0xe1, 0x1f, 0x01, 0x39, - 0x08, 0x68, 0x49, 0x68, 0x08, 0x23, 0x09, 0xf0, - 0x59, 0xf9, 0x07, 0xe0, 0x04, 0x34, 0xe0, 0x1f, - 0x39, 0x38, 0x11, 0x1c, 0x08, 0x22, 0xc0, 0x6b, - 0x09, 0xf0, 0x1e, 0xfa, 0x0a, 0xa8, 0x09, 0xf0, - 0x77, 0xfa, 0x05, 0x1c, 0x14, 0x98, 0x01, 0x28, - 0x06, 0xd1, 0x1a, 0xa8, 0xc0, 0x19, 0x2a, 0x1c, - 0x0a, 0xa9, 0xe3, 0xf7, 0x21, 0xff, 0x7f, 0x19, - 0xae, 0x42, 0x10, 0xd9, 0x20, 0x22, 0x30, 0x21, - 0x15, 0x98, 0x00, 0x28, 0x05, 0xd0, 0x14, 0x98, - 0x00, 0x28, 0x02, 0xd1, 0x1a, 0xa8, 0xc1, 0x55, - 0x01, 0xe0, 0x1a, 0xa8, 0xc2, 0x55, 0x01, 0x3e, - 0x01, 0x37, 0xae, 0x42, 0xf0, 0xd8, 0x14, 0x98, - 0x00, 0x28, 0x06, 0xd1, 0x1a, 0xa8, 0xc0, 0x19, - 0x2a, 0x1c, 0x0a, 0xa9, 0xe3, 0xf7, 0x04, 0xff, - 0x7f, 0x19, 0x1d, 0xe1, 0x45, 0x49, 0x0b, 0xa8, - 0x0c, 0xc9, 0x0c, 0xc0, 0x0e, 0xc9, 0x0e, 0xc0, - 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, 0x6b, - 0x00, 0x2e, 0x10, 0x90, 0x00, 0xd1, 0x01, 0x26, - 0x14, 0x98, 0x01, 0x28, 0x03, 0xd1, 0x10, 0x98, - 0x80, 0x19, 0x01, 0x38, 0x10, 0x90, 0x70, 0x1e, - 0x17, 0x90, 0x00, 0x2e, 0x53, 0xd0, 0x3a, 0x26, - 0x75, 0x2f, 0x0a, 0xd3, 0xed, 0x09, 0x00, 0xca, - 0x01, 0x00, 0x21, 0x1a, 0xa8, 0xc1, 0x55, 0xff, - 0xf7, 0x37, 0xfa, 0x02, 0x22, 0x39, 0x1c, 0x1a, - 0xa8, 0xf8, 0xf7, 0x32, 0xfc, 0x00, 0x27, 0x30, - 0x2d, 0x06, 0xd1, 0x30, 0x22, 0x1a, 0xa9, 0xca, - 0x55, 0x78, 0x22, 0x78, 0x1c, 0x0a, 0x54, 0x47, - 0x1c, 0x10, 0x98, 0x00, 0x28, 0x14, 0xd1, 0x28, - 0x20, 0x1a, 0xaa, 0xd0, 0x55, 0x79, 0x1c, 0x6e, - 0x23, 0x53, 0x54, 0x48, 0x1c, 0x75, 0x23, 0x13, - 0x54, 0x41, 0x1c, 0x6c, 0x23, 0x53, 0x54, 0x48, - 0x1c, 0x01, 0x1c, 0x53, 0x54, 0x29, 0x22, 0x01, - 0x30, 0x1a, 0xa9, 0x0a, 0x54, 0x47, 0x1c, 0x2f, - 0xe0, 0x10, 0x98, 0x0b, 0xa9, 0x00, 0x78, 0x1a, - 0xaa, 0x00, 0x09, 0x09, 0x5c, 0xd1, 0x55, 0x10, - 0x99, 0x09, 0x78, 0x09, 0x07, 0x09, 0x0f, 0x3c, - 0x3a, 0x51, 0x5c, 0x78, 0x1c, 0x1a, 0xaa, 0x11, - 0x54, 0x47, 0x1c, 0x14, 0x98, 0x01, 0x28, 0x03, - 0xd1, 0x10, 0x98, 0x01, 0x38, 0x10, 0x90, 0x02, - 0xe0, 0x10, 0x98, 0x01, 0x30, 0x10, 0x90, 0x17, - 0x98, 0x00, 0x28, 0x0c, 0xd0, 0x3a, 0x2d, 0x05, - 0xd1, 0x38, 0x1c, 0x1a, 0xa9, 0x0e, 0x54, 0x01, - 0x37, 0x05, 0xe0, 0x09, 0xe0, 0x20, 0x22, 0x38, - 0x1c, 0x1a, 0xa9, 0x0a, 0x54, 0x01, 0x37, 0x17, - 0x98, 0x41, 0x1e, 0x17, 0x91, 0x00, 0x28, 0xa1, - 0xd1, 0xa4, 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, - 0x38, 0xc1, 0x6b, 0x19, 0x91, 0x00, 0x29, 0x01, - 0xd1, 0x06, 0xa1, 0x19, 0x91, 0x16, 0x98, 0x00, - 0x28, 0x0e, 0xd1, 0x7f, 0x20, 0xc0, 0x1b, 0x09, - 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x5e, 0x03, 0x20, 0x28, 0x6e, 0x75, - 0x6c, 0x6c, 0x29, 0x00, 0x00, 0x02, 0x38, 0x16, - 0x90, 0x00, 0x25, 0x00, 0xe0, 0x01, 0x35, 0x19, - 0x99, 0x48, 0x57, 0x00, 0x28, 0x02, 0xd0, 0xed, - 0x09, 0x00, 0xcb, 0x01, 0x16, 0x98, 0x85, 0x42, - 0xf7, 0xd3, 0x14, 0x98, 0x01, 0x28, 0x06, 0xd1, - 0x1a, 0xa8, 0xc0, 0x19, 0x2a, 0x1c, 0x19, 0x99, - 0xe3, 0xf7, 0x5b, 0xfe, 0x7f, 0x19, 0xae, 0x42, - 0x10, 0xd9, 0x20, 0x22, 0x30, 0x21, 0x15, 0x98, - 0x00, 0x28, 0x05, 0xd0, 0x14, 0x98, 0x00, 0x28, - 0x02, 0xd1, 0x1a, 0xa8, 0xc1, 0x55, 0x01, 0xe0, - 0x1a, 0xa8, 0xc2, 0x55, 0x01, 0x3e, 0x01, 0x37, - 0xae, 0x42, 0xf0, 0xd8, 0x14, 0x98, 0x00, 0x28, - 0x5f, 0xd1, 0x1a, 0xa8, 0xc0, 0x19, 0x2a, 0x1c, - 0x19, 0x99, 0xe3, 0xf7, 0x3e, 0xfe, 0x7f, 0x19, - 0x1d, 0xe1, 0x13, 0x99, 0x01, 0x29, 0x1b, 0xd1, - 0x08, 0x34, 0xe1, 0x1f, 0x01, 0x39, 0x08, 0x68, - 0x9d, 0xa3, 0x0a, 0x90, 0x49, 0x68, 0x0b, 0x91, - 0x1a, 0x68, 0x5b, 0x68, 0xe3, 0xf7, 0x55, 0xff, - 0x00, 0x28, 0x06, 0xd0, 0x01, 0xa1, 0x07, 0x22, - 0x98, 0x39, 0x0c, 0xa8, 0xe3, 0xf7, 0x25, 0xfe, - 0x05, 0xe0, 0x10, 0x23, 0x0a, 0x98, 0x0b, 0x99, - 0x0c, 0xaa, 0x09, 0xf0, 0x40, 0xf8, 0x10, 0xe0, - 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, 0x6b, - 0x00, 0x28, 0x06, 0xd1, 0x01, 0xa1, 0x07, 0x22, - 0xc0, 0x39, 0x0c, 0xa8, 0xe3, 0xf7, 0x11, 0xfe, - 0x03, 0xe0, 0x10, 0x22, 0x0c, 0xa9, 0x09, 0xf0, - 0xfc, 0xf8, 0x0c, 0xa8, 0x09, 0xf0, 0x55, 0xf9, - 0x18, 0x90, 0x14, 0x98, 0x01, 0x28, 0x02, 0xd0, - 0x18, 0x98, 0x86, 0x42, 0x1e, 0xd8, 0x30, 0x2d, - 0x07, 0xd1, 0x30, 0x21, 0x1a, 0xaa, 0xd1, 0x55, - 0x78, 0x22, 0x78, 0x1c, 0x1a, 0xa9, 0x0a, 0x54, - 0x47, 0x1c, 0x1a, 0xa8, 0xc0, 0x19, 0x18, 0x9a, - 0x0c, 0xa9, 0xe3, 0xf7, 0xf2, 0xfd, 0x18, 0x98, - 0x3f, 0x18, 0x86, 0x42, 0x3b, 0xd9, 0x20, 0x22, - 0x38, 0x1c, 0x1a, 0xa9, 0x0a, 0x54, 0x18, 0x98, - 0x01, 0x37, 0xed, 0x09, 0x00, 0xcc, 0x01, 0x01, - 0x3e, 0x86, 0x42, 0xf7, 0xd8, 0x31, 0xe0, 0xc4, - 0xe0, 0x15, 0x98, 0x00, 0x28, 0x12, 0xd0, 0x30, - 0x2d, 0x06, 0xd1, 0x30, 0x21, 0x1a, 0xaa, 0xd1, - 0x55, 0x78, 0x21, 0x78, 0x1c, 0x11, 0x54, 0x47, - 0x1c, 0x30, 0x22, 0x38, 0x1c, 0x1a, 0xa9, 0x0a, - 0x54, 0x18, 0x98, 0x01, 0x37, 0x01, 0x3e, 0x86, - 0x42, 0xf7, 0xd8, 0x12, 0xe0, 0x20, 0x22, 0x38, - 0x1c, 0x1a, 0xa9, 0x0a, 0x54, 0x18, 0x98, 0x01, - 0x37, 0x01, 0x3e, 0x86, 0x42, 0xf7, 0xd8, 0x30, - 0x2d, 0x07, 0xd1, 0x30, 0x21, 0x1a, 0xaa, 0xd1, - 0x55, 0x78, 0x22, 0x78, 0x1c, 0x1a, 0xa9, 0x0a, - 0x54, 0x47, 0x1c, 0x1a, 0xa8, 0xc0, 0x19, 0x18, - 0x9a, 0x0c, 0xa9, 0xe3, 0xf7, 0xb4, 0xfd, 0x18, - 0x98, 0x3f, 0x18, 0x92, 0xe0, 0x97, 0xe0, 0x13, - 0x99, 0x01, 0x29, 0x09, 0xd1, 0x08, 0x34, 0xe1, - 0x1f, 0x01, 0x39, 0x08, 0x68, 0x49, 0x68, 0x10, - 0x23, 0x0c, 0xaa, 0x08, 0xf0, 0xc6, 0xff, 0x07, - 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, 0xc0, - 0x6b, 0x10, 0x22, 0x0c, 0xa9, 0x09, 0xf0, 0x8b, - 0xf8, 0x0c, 0xa8, 0x09, 0xf0, 0xe4, 0xf8, 0x18, - 0x90, 0x14, 0x98, 0x01, 0x28, 0x02, 0xd0, 0x18, - 0x98, 0x86, 0x42, 0x1d, 0xd8, 0x30, 0x2d, 0x07, - 0xd1, 0x30, 0x21, 0x1a, 0xaa, 0xd1, 0x55, 0x78, - 0x22, 0x78, 0x1c, 0x1a, 0xa9, 0x0a, 0x54, 0x47, - 0x1c, 0x1a, 0xa8, 0xc0, 0x19, 0x18, 0x9a, 0x0c, - 0xa9, 0xe3, 0xf7, 0x81, 0xfd, 0x18, 0x98, 0x3f, - 0x18, 0x86, 0x42, 0x3e, 0xd9, 0x20, 0x22, 0x38, - 0x1c, 0x1a, 0xa9, 0x0a, 0x54, 0x18, 0x98, 0x01, - 0x37, 0x01, 0x3e, 0x86, 0x42, 0xf7, 0xd8, 0x34, - 0xe0, 0x15, 0x98, 0x00, 0x28, 0x16, 0xd0, 0x30, - 0x2d, 0x07, 0xd1, 0x30, 0x21, 0x1a, 0xaa, 0xd1, - 0x55, 0x78, 0x22, 0x78, 0x1c, 0xed, 0x09, 0x00, - 0xcd, 0x01, 0x1a, 0xa9, 0x0a, 0x54, 0x47, 0x1c, - 0x30, 0x22, 0x38, 0x1c, 0x1a, 0xa9, 0x0a, 0x54, - 0x18, 0x98, 0x01, 0x37, 0x01, 0x3e, 0x86, 0x42, - 0xf7, 0xd8, 0x15, 0xe0, 0x4d, 0xe0, 0x3e, 0xe0, - 0x40, 0xe0, 0x20, 0x22, 0x38, 0x1c, 0x1a, 0xa9, - 0x0a, 0x54, 0x18, 0x98, 0x01, 0x37, 0x01, 0x3e, - 0x86, 0x42, 0xf7, 0xd8, 0x30, 0x2d, 0x07, 0xd1, - 0x30, 0x21, 0x1a, 0xaa, 0xd1, 0x55, 0x78, 0x22, - 0x78, 0x1c, 0x1a, 0xa9, 0x0a, 0x54, 0x47, 0x1c, - 0x1a, 0xa8, 0xc0, 0x19, 0x18, 0x9a, 0x0c, 0xa9, - 0xe3, 0xf7, 0x40, 0xfd, 0x18, 0x98, 0x3f, 0x18, - 0x1e, 0xe0, 0x04, 0x34, 0xe0, 0x1f, 0x39, 0x38, - 0x54, 0x21, 0xc9, 0x43, 0xc0, 0x6b, 0x1a, 0xab, - 0xd9, 0x55, 0x7a, 0x1c, 0x98, 0x54, 0x03, 0x0a, - 0x51, 0x1c, 0x1a, 0xaf, 0x7b, 0x54, 0x03, 0x0c, - 0x4a, 0x1c, 0xbb, 0x54, 0x00, 0x0e, 0x51, 0x1c, - 0x1a, 0xab, 0x58, 0x54, 0x45, 0x20, 0xc0, 0x43, - 0x4a, 0x1c, 0x1a, 0xa9, 0x88, 0x54, 0x57, 0x1c, - 0x02, 0xe0, 0x1a, 0xa9, 0xc8, 0x55, 0x01, 0x37, - 0x00, 0x21, 0x13, 0x91, 0x02, 0xe0, 0x1a, 0xa8, - 0xc1, 0x55, 0x01, 0x37, 0x40, 0x98, 0x00, 0x23, - 0x01, 0x30, 0x40, 0x90, 0xc0, 0x56, 0x00, 0x28, - 0x01, 0xd0, 0xff, 0xf7, 0xc4, 0xfb, 0x00, 0x2f, - 0x04, 0xd1, 0x3b, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x04, 0xb0, 0x18, 0x47, 0x00, 0x20, 0x1a, 0xa9, - 0xc8, 0x55, 0x1a, 0xa8, 0xff, 0xf7, 0x58, 0xf8, - 0x02, 0x22, 0x39, 0x1c, 0x1a, 0xa8, 0xf8, 0xf7, - 0x53, 0xfa, 0x00, 0xf0, 0x9f, 0xfc, 0xec, 0xe7, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x85, 0xb0, 0x00, 0x21, 0x01, 0x91, - 0x00, 0x28, 0x05, 0xd1, 0xe9, 0x4e, 0x74, 0x1c, - 0x60, 0x1e, 0x04, 0x90, 0x65, 0x1c, 0x1e, 0xe0, - 0xed, 0x09, 0x00, 0xce, 0x01, 0x47, 0x1e, 0x14, - 0x2f, 0x10, 0xd2, 0x01, 0x20, 0x01, 0x90, 0x13, - 0x2f, 0x14, 0xd0, 0x00, 0xf0, 0xad, 0xfd, 0x01, - 0x1c, 0xe8, 0xa0, 0x00, 0x97, 0xe1, 0xa3, 0xe4, - 0xa2, 0xff, 0xf7, 0x7f, 0xfb, 0xee, 0xa0, 0xff, - 0xf7, 0x7c, 0xfb, 0x07, 0xe0, 0x00, 0xf0, 0xa0, - 0xfd, 0x01, 0x1c, 0xec, 0xa0, 0xdb, 0xa3, 0xde, - 0xa2, 0xff, 0xf7, 0x73, 0xfb, 0x02, 0xf0, 0x62, - 0xfd, 0xda, 0xe7, 0xf3, 0x48, 0xc0, 0x6a, 0x00, - 0x28, 0x03, 0xd0, 0xf2, 0x48, 0x50, 0x21, 0xff, - 0xf7, 0x28, 0xf8, 0xf0, 0x48, 0x01, 0x78, 0x03, - 0x96, 0x6d, 0x29, 0x57, 0xd0, 0x41, 0xdc, 0x66, - 0x29, 0x55, 0xd0, 0x33, 0xdc, 0x62, 0x29, 0x53, - 0xd0, 0x0c, 0xdc, 0x2e, 0x29, 0x49, 0xd0, 0x3a, - 0x29, 0x4f, 0xd0, 0x3f, 0x29, 0x4e, 0xd1, 0x03, - 0x98, 0x00, 0x78, 0x3f, 0x28, 0x4f, 0xd1, 0x00, - 0xf0, 0x8d, 0xfe, 0x7a, 0xe0, 0x63, 0x29, 0x4e, - 0xd0, 0x64, 0x29, 0x4d, 0xd0, 0x65, 0x29, 0x41, - 0xd1, 0x03, 0x98, 0x00, 0x78, 0x76, 0x28, 0x3d, - 0xd1, 0x03, 0x94, 0x20, 0x78, 0x68, 0x28, 0x68, - 0xd0, 0x68, 0xdc, 0x23, 0x28, 0x03, 0xd0, 0x62, - 0x28, 0x65, 0xd0, 0x64, 0x28, 0x64, 0xd1, 0x03, - 0x95, 0x03, 0xa8, 0xff, 0xf7, 0x2d, 0xf8, 0x02, - 0x90, 0x00, 0x28, 0x5e, 0xd0, 0x02, 0xa8, 0xff, - 0xf7, 0x2d, 0xf9, 0x01, 0x1c, 0xd4, 0xa0, 0xff, - 0xf7, 0x2c, 0xfb, 0x57, 0xe0, 0xc8, 0x1f, 0x60, - 0x38, 0x06, 0x28, 0x53, 0xd2, 0x01, 0xa3, 0x1b, - 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0xbd, 0xbc, 0xbb, - 0x75, 0x75, 0xba, 0xc8, 0x1f, 0x67, 0x38, 0x0d, - 0x28, 0x48, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x6a, 0x6a, 0xdf, - 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd9, 0x6a, 0x6a, - 0x6a, 0x6a, 0x00, 0xed, 0x09, 0x00, 0xcf, 0x01, - 0xca, 0x49, 0x0a, 0x22, 0xe3, 0xf7, 0x67, 0xfc, - 0xa2, 0xe7, 0x21, 0xe2, 0x42, 0xe1, 0x0b, 0xe0, - 0x00, 0xe0, 0x2c, 0xe1, 0x03, 0x98, 0x02, 0xf0, - 0xce, 0xf8, 0x54, 0xe0, 0xff, 0xe7, 0x02, 0xf0, - 0x4e, 0xfe, 0x50, 0xe0, 0x2e, 0xe0, 0xc4, 0xe0, - 0x03, 0x98, 0x00, 0x78, 0x72, 0x28, 0x4a, 0xd1, - 0x03, 0x94, 0x03, 0xa8, 0xfe, 0xf7, 0xeb, 0xff, - 0x02, 0x90, 0x00, 0x28, 0x1e, 0xd0, 0x02, 0xa8, - 0xff, 0xf7, 0xeb, 0xf8, 0x07, 0x1c, 0x03, 0xa8, - 0xfe, 0xf7, 0xe1, 0xff, 0x00, 0x21, 0x00, 0x28, - 0x02, 0x90, 0x03, 0xd0, 0x02, 0xa8, 0xff, 0xf7, - 0xe0, 0xf8, 0x01, 0x1c, 0xac, 0x48, 0x01, 0x22, - 0xc0, 0x6a, 0x00, 0x28, 0x00, 0xd0, 0x00, 0x22, - 0x38, 0x1c, 0x02, 0xf0, 0x04, 0xf8, 0xfe, 0xe0, - 0xdf, 0xe0, 0xda, 0xe0, 0xec, 0xe0, 0x0a, 0xe1, - 0x0f, 0xe1, 0xf5, 0xe1, 0xac, 0xa0, 0xff, 0xf7, - 0xcf, 0xfa, 0xf4, 0xe0, 0x03, 0x98, 0x00, 0x78, - 0x6c, 0x28, 0x4c, 0xd0, 0x10, 0xdc, 0x63, 0x28, - 0x0b, 0xd0, 0x06, 0xdc, 0x34, 0x28, 0x4a, 0xd0, - 0x62, 0x28, 0x14, 0xd1, 0x03, 0x94, 0x01, 0x27, - 0x62, 0xe0, 0x64, 0x28, 0x4f, 0xd0, 0x65, 0x28, - 0x0d, 0xd1, 0x00, 0xf0, 0x32, 0xfe, 0xde, 0xe0, - 0x73, 0x28, 0x1c, 0xd0, 0x74, 0x28, 0x3b, 0xd0, - 0x75, 0x28, 0x05, 0xd0, 0x77, 0x28, 0x02, 0xd1, - 0x03, 0x94, 0x02, 0x27, 0x50, 0xe0, 0x51, 0xe2, - 0x91, 0x49, 0x08, 0x6c, 0x00, 0x28, 0x03, 0xd0, - 0x01, 0x21, 0x01, 0xf0, 0x6e, 0xfa, 0xca, 0xe0, - 0xc8, 0x6b, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, - 0x01, 0xf0, 0xeb, 0xfa, 0xc3, 0xe0, 0x9b, 0xa0, - 0xff, 0xf7, 0x9a, 0xfa, 0xbf, 0xe0, 0x03, 0x94, - 0x03, 0xa8, 0xfe, 0xf7, 0x8c, 0xff, 0x02, 0x90, - 0x00, 0x28, 0x15, 0xd0, 0x02, 0xa8, 0xed, 0x09, - 0x00, 0xd0, 0x01, 0xff, 0xf7, 0x8c, 0xf8, 0x07, - 0x1c, 0x03, 0xa8, 0xfe, 0xf7, 0x82, 0xff, 0x02, - 0x90, 0x00, 0x28, 0x03, 0xd0, 0x02, 0xa8, 0xff, - 0xf7, 0x82, 0xf8, 0x01, 0xe0, 0xff, 0x20, 0x01, - 0x30, 0x01, 0x1c, 0x38, 0x1c, 0x00, 0xf0, 0x31, - 0xfe, 0xa3, 0xe0, 0x17, 0xe0, 0x00, 0xf0, 0x0d, - 0xfe, 0x9f, 0xe0, 0x19, 0xe0, 0x03, 0x94, 0x03, - 0xa8, 0xfe, 0xf7, 0x6b, 0xff, 0x02, 0x90, 0x00, - 0x28, 0x04, 0xd0, 0x02, 0xa8, 0xff, 0xf7, 0x6b, - 0xf8, 0x01, 0xe0, 0x0a, 0xe0, 0x0a, 0x20, 0x00, - 0xf0, 0x48, 0xfe, 0x8e, 0xe0, 0x77, 0xe1, 0x6f, - 0xe1, 0x52, 0xe1, 0x36, 0xe1, 0x01, 0xf0, 0x29, - 0xff, 0x87, 0xe0, 0x03, 0x94, 0x04, 0x27, 0x01, - 0xe0, 0x03, 0x94, 0x10, 0x27, 0x03, 0xa8, 0xfe, - 0xf7, 0x50, 0xff, 0x02, 0x90, 0x00, 0x28, 0x0f, - 0xd0, 0x02, 0xa8, 0xff, 0xf7, 0x50, 0xf8, 0x64, - 0x49, 0x88, 0x61, 0x03, 0xa8, 0xfe, 0xf7, 0x45, - 0xff, 0x02, 0x90, 0x00, 0x28, 0x04, 0xd0, 0x02, - 0xa8, 0xff, 0xf7, 0x45, 0xf8, 0x5f, 0x49, 0xc8, - 0x61, 0x38, 0x1c, 0x03, 0xf0, 0xbe, 0xfc, 0x5c, - 0x49, 0x88, 0x69, 0xc0, 0x19, 0x88, 0x61, 0x64, - 0xe0, 0xaf, 0xe2, 0x3a, 0xe2, 0xc9, 0xe1, 0xb7, - 0xe1, 0xa3, 0xe1, 0x64, 0xe1, 0x7c, 0xe1, 0x03, - 0x98, 0x00, 0x78, 0x34, 0x28, 0x0e, 0xd0, 0x62, - 0x28, 0x06, 0xd0, 0x64, 0x28, 0x07, 0xd0, 0x77, - 0x28, 0x53, 0xd1, 0x03, 0x94, 0x02, 0x27, 0x07, - 0xe0, 0x03, 0x94, 0x01, 0x27, 0x04, 0xe0, 0x03, - 0x94, 0x04, 0x27, 0x01, 0xe0, 0x03, 0x94, 0x10, - 0x27, 0x03, 0xa8, 0xfe, 0xf7, 0x16, 0xff, 0x02, - 0x90, 0x00, 0x28, 0x17, 0xd0, 0x02, 0xa8, 0xff, - 0xf7, 0x16, 0xf8, 0x47, 0x49, 0xc8, 0x60, 0x03, - 0xa8, 0xfe, 0xf7, 0x0b, 0xff, 0x02, 0x90, 0x00, - 0x28, 0xed, 0x09, 0x00, 0xd1, 0x01, 0x07, 0xd0, - 0x02, 0xa8, 0xff, 0xf7, 0x0b, 0xf8, 0x42, 0x49, - 0xca, 0x68, 0x80, 0x18, 0x08, 0x61, 0x09, 0xe0, - 0x3f, 0x49, 0xc8, 0x68, 0x20, 0x30, 0x08, 0x61, - 0x04, 0xe0, 0x3d, 0x49, 0x08, 0x69, 0xc8, 0x60, - 0x20, 0x30, 0x08, 0x61, 0x38, 0x1c, 0x03, 0xf0, - 0x1c, 0xfb, 0x37, 0xe0, 0x6f, 0x28, 0x20, 0xd0, - 0x78, 0x28, 0x2d, 0xd1, 0x03, 0x95, 0x03, 0xa8, - 0xfe, 0xf7, 0xea, 0xfe, 0x02, 0x90, 0x00, 0x28, - 0x2c, 0xd0, 0x02, 0xa8, 0xfe, 0xf7, 0xea, 0xff, - 0x01, 0x1c, 0x49, 0xa0, 0xff, 0xf7, 0xe9, 0xf9, - 0x0b, 0xe1, 0x03, 0x95, 0x03, 0xa8, 0xfe, 0xf7, - 0xdb, 0xfe, 0x02, 0x90, 0x00, 0x28, 0x1d, 0xd0, - 0x02, 0xa8, 0xfe, 0xf7, 0xdb, 0xff, 0x01, 0x1c, - 0x45, 0xa0, 0xff, 0xf7, 0xda, 0xf9, 0xfc, 0xe0, - 0xee, 0xe1, 0x03, 0x95, 0x03, 0xa8, 0xfe, 0xf7, - 0xcb, 0xfe, 0x02, 0x90, 0x00, 0x28, 0x0d, 0xd0, - 0x02, 0xa8, 0xfe, 0xf7, 0xcb, 0xff, 0x01, 0x1c, - 0x41, 0xa0, 0xff, 0xf7, 0xca, 0xf9, 0xec, 0xe0, - 0x01, 0xf0, 0xe4, 0xfd, 0xe9, 0xe0, 0x03, 0x98, - 0x00, 0x78, 0x83, 0xe0, 0xd9, 0xe1, 0x00, 0x00, - 0xe1, 0xbd, 0x03, 0x20, 0x41, 0x70, 0x72, 0x20, - 0x32, 0x33, 0x20, 0x32, 0x30, 0x30, 0x33, 0x00, - 0x31, 0x36, 0x3a, 0x30, 0x35, 0x3a, 0x31, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x0a, 0x20, 0x2d, 0x2d, - 0x2d, 0x20, 0x25, 0x73, 0x20, 0x28, 0x25, 0x73, - 0x20, 0x25, 0x73, 0x29, 0x20, 0x62, 0x72, 0x65, - 0x61, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, - 0x25, 0x64, 0x20, 0x68, 0x69, 0x74, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x20, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x20, 0x25, 0x73, 0x20, 0x28, 0x25, - 0x73, 0x20, 0x25, 0x73, 0xed, 0x09, 0x00, 0xd2, - 0x01, 0x29, 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x28, 0x69, 0x03, - 0x20, 0xe0, 0xbd, 0x03, 0x20, 0x0a, 0x65, 0x76, - 0x61, 0x6c, 0x20, 0x28, 0x64, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x29, 0x3a, 0x20, 0x25, 0x75, - 0x00, 0x94, 0xbd, 0x03, 0x20, 0x75, 0x73, 0x65, - 0x3a, 0x20, 0x62, 0x72, 0x20, 0x3c, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x20, 0x3c, 0x30, - 0x7c, 0x41, 0x64, 0x64, 0x72, 0x3e, 0x20, 0x28, - 0x30, 0x3d, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x29, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6f, 0x20, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, - 0x48, 0x49, 0x53, 0x52, 0x2f, 0x54, 0x61, 0x73, - 0x6b, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x65, 0x76, - 0x61, 0x6c, 0x20, 0x28, 0x68, 0x65, 0x78, 0x29, - 0x3a, 0x20, 0x25, 0x58, 0x00, 0x0a, 0x65, 0x76, - 0x61, 0x6c, 0x20, 0x28, 0x62, 0x69, 0x6e, 0x29, - 0x3a, 0x20, 0x25, 0x62, 0x00, 0x0a, 0x65, 0x76, - 0x61, 0x6c, 0x20, 0x28, 0x6f, 0x6b, 0x74, 0x61, - 0x6c, 0x29, 0x3a, 0x20, 0x25, 0x6f, 0x00, 0x00, - 0x00, 0x62, 0x28, 0x06, 0xd0, 0x64, 0x28, 0x07, - 0xd0, 0x77, 0x28, 0x5c, 0xd1, 0x03, 0x94, 0x02, - 0x21, 0x04, 0xe0, 0x03, 0x94, 0x01, 0x21, 0x01, - 0xe0, 0x03, 0x94, 0x04, 0x21, 0x03, 0x98, 0x03, - 0xf0, 0x45, 0xf9, 0xd2, 0xe0, 0x03, 0x98, 0x00, - 0x78, 0x6f, 0x28, 0x4c, 0xd1, 0xe1, 0xa0, 0xff, - 0xf7, 0x26, 0xf9, 0xfe, 0xf7, 0xd7, 0xfc, 0x03, - 0x98, 0x40, 0x78, 0x2b, 0x28, 0x04, 0xd1, 0x00, - 0xf0, 0x1b, 0xfa, 0xe1, 0xa0, 0xff, 0xf7, 0x1b, - 0xf9, 0x01, 0x99, 0x01, 0x20, 0x01, 0x29, 0x00, - 0xd0, 0x00, 0x20, 0x05, 0xb0, 0xf0, 0xbc, 0xed, - 0x09, 0x00, 0xd3, 0x01, 0x08, 0xbc, 0x18, 0x47, - 0x03, 0x98, 0x00, 0x78, 0x49, 0x28, 0x12, 0xd0, - 0x61, 0x28, 0x06, 0xd0, 0x69, 0x28, 0x2d, 0xd1, - 0x00, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x53, 0xf9, - 0xaa, 0xe0, 0xda, 0x48, 0xc0, 0x6a, 0x00, 0x28, - 0x01, 0xd1, 0xfe, 0xf7, 0xa6, 0xfc, 0xd8, 0xa0, - 0xff, 0xf7, 0xfc, 0xf8, 0xa0, 0xe0, 0x01, 0x21, - 0x00, 0x20, 0x01, 0xf0, 0x44, 0xf9, 0x9b, 0xe0, - 0x03, 0x98, 0x00, 0x78, 0x64, 0x28, 0x15, 0xd1, - 0x03, 0xf0, 0xed, 0xfb, 0x94, 0xe0, 0x03, 0x98, - 0x00, 0x78, 0x69, 0x28, 0x0e, 0xd1, 0x01, 0xf0, - 0xd6, 0xfd, 0x8d, 0xe0, 0x03, 0x98, 0x00, 0x78, - 0x45, 0x28, 0x0c, 0xd0, 0x65, 0x28, 0x06, 0xd0, - 0x6c, 0x28, 0x03, 0xd1, 0xcd, 0x48, 0x03, 0xf0, - 0xca, 0xfc, 0x81, 0xe0, 0x61, 0xe1, 0x00, 0x20, - 0x01, 0xf0, 0x57, 0xfb, 0x7c, 0xe0, 0x01, 0x20, - 0x01, 0xf0, 0x53, 0xfb, 0x78, 0xe0, 0x03, 0x98, - 0x00, 0x27, 0x00, 0x78, 0x55, 0x28, 0x02, 0xd0, - 0x75, 0x28, 0x71, 0xd1, 0x00, 0xe0, 0x01, 0x27, - 0x03, 0x94, 0x03, 0xa8, 0xfe, 0xf7, 0xbd, 0xfd, - 0x02, 0x90, 0x00, 0x28, 0x03, 0xd0, 0x39, 0x1c, - 0x01, 0xf0, 0x75, 0xf9, 0xd5, 0xe0, 0x00, 0x20, - 0x39, 0x1c, 0x01, 0xf0, 0x70, 0xf9, 0xd0, 0xe0, - 0x03, 0x98, 0x00, 0x27, 0x00, 0x78, 0x41, 0x28, - 0x0a, 0xd0, 0x49, 0x28, 0x0c, 0xd0, 0x61, 0x28, - 0x02, 0xd0, 0x69, 0x28, 0x54, 0xd1, 0x08, 0xe0, - 0x00, 0x20, 0x01, 0xf0, 0x46, 0xfc, 0xc0, 0xe0, - 0x01, 0x20, 0x01, 0xf0, 0x42, 0xfc, 0xbc, 0xe0, - 0x01, 0x27, 0x03, 0x94, 0x03, 0xa8, 0xfe, 0xf7, - 0x98, 0xfd, 0x02, 0x90, 0x00, 0x28, 0x03, 0xd0, - 0x39, 0x1c, 0x01, 0xf0, 0x46, 0xfa, 0xb0, 0xe0, - 0x00, 0x20, 0x39, 0x1c, 0x01, 0xf0, 0x41, 0xfa, - 0xab, 0xe0, 0xed, 0x09, 0x00, 0xd4, 0x01, 0x03, - 0x98, 0x00, 0x78, 0x65, 0x28, 0x36, 0xd1, 0x03, - 0x94, 0x20, 0x78, 0x67, 0x28, 0x04, 0xd0, 0x73, - 0x28, 0x05, 0xd1, 0x00, 0xf0, 0x9c, 0xfa, 0x9e, - 0xe0, 0x02, 0xf0, 0x77, 0xfa, 0x9b, 0xe0, 0x04, - 0x98, 0x03, 0x90, 0x98, 0xe0, 0x03, 0x98, 0x00, - 0x78, 0x65, 0x28, 0x09, 0xd0, 0x74, 0x28, 0x21, - 0xd1, 0x03, 0x94, 0x03, 0xa8, 0xfe, 0xf7, 0x6f, - 0xfd, 0x02, 0x90, 0x02, 0xf0, 0x7c, 0xfb, 0x8a, - 0xe0, 0x01, 0xf0, 0xb1, 0xfb, 0x87, 0xe0, 0x03, - 0x98, 0x00, 0x78, 0x68, 0x28, 0x22, 0xd0, 0x12, - 0xdc, 0x41, 0x28, 0x3a, 0xd0, 0x61, 0x28, 0x0d, - 0xd1, 0x03, 0x94, 0x20, 0x78, 0x72, 0x28, 0x39, - 0xd1, 0x03, 0x95, 0x03, 0xa8, 0xfe, 0xf7, 0x57, - 0xfd, 0x02, 0x90, 0x00, 0x28, 0x73, 0xd0, 0x00, - 0xf0, 0x62, 0xff, 0x71, 0xe0, 0xdf, 0xe0, 0x69, - 0x28, 0x52, 0xd0, 0x72, 0x28, 0x6c, 0xd1, 0x03, - 0x94, 0x03, 0xa8, 0xfe, 0xf7, 0x48, 0xfd, 0x02, - 0x90, 0x00, 0x28, 0x14, 0xd0, 0x02, 0xa8, 0xfe, - 0xf7, 0x48, 0xfe, 0x12, 0xe0, 0x03, 0x94, 0x03, - 0xa8, 0xfe, 0xf7, 0x3d, 0xfd, 0x02, 0x90, 0x00, - 0x28, 0x59, 0xd0, 0x02, 0xa8, 0xfe, 0xf7, 0x3d, - 0xfe, 0x01, 0x22, 0x00, 0x28, 0x00, 0xd1, 0x00, - 0x22, 0x76, 0x48, 0x82, 0x63, 0xbf, 0xe0, 0x00, - 0x20, 0xc0, 0x43, 0x01, 0x1c, 0x01, 0x98, 0x03, - 0xf0, 0x40, 0xfb, 0xfe, 0xf7, 0xe4, 0xfb, 0x00, - 0x20, 0x18, 0xe7, 0x01, 0x21, 0x00, 0x20, 0x00, - 0xf0, 0xf4, 0xff, 0xb0, 0xe0, 0x52, 0x28, 0x09, - 0xd1, 0x03, 0x95, 0x03, 0xa8, 0xfe, 0xf7, 0x1b, - 0xfd, 0x02, 0x90, 0x00, 0x28, 0x37, 0xd0, 0x00, - 0xf0, 0x72, 0xff, 0xa4, 0xe0, 0x73, 0x28, 0x09, - 0xd1, 0x03, 0x95, 0x03, 0xa8, 0xfe, 0xf7, 0x0f, - 0xfd, 0x02, 0x90, 0x00, 0x28, 0xed, 0x09, 0x00, - 0xd5, 0x01, 0x2b, 0xd0, 0x00, 0xf0, 0xcc, 0xfe, - 0x98, 0xe0, 0x03, 0xa8, 0xfe, 0xf7, 0x06, 0xfd, - 0x02, 0x90, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, - 0x8f, 0xfd, 0x8f, 0xe0, 0x00, 0x21, 0x00, 0x20, - 0x00, 0xf0, 0xce, 0xff, 0x8a, 0xe0, 0x01, 0xf0, - 0x71, 0xfc, 0x87, 0xe0, 0x03, 0x98, 0x00, 0x78, - 0x6e, 0x28, 0x14, 0xd1, 0x56, 0x48, 0x03, 0x94, - 0x80, 0x6a, 0x01, 0x28, 0x01, 0xd3, 0x20, 0x28, - 0x02, 0xd9, 0x53, 0x48, 0x01, 0x22, 0x82, 0x62, - 0x03, 0xa8, 0xfe, 0xf7, 0xe7, 0xfc, 0x02, 0x90, - 0x00, 0x28, 0x36, 0xd0, 0x01, 0x78, 0x2b, 0x29, - 0x10, 0xd1, 0x01, 0xe0, 0x6e, 0xe0, 0x6d, 0xe0, - 0x01, 0x30, 0x02, 0x90, 0x02, 0xa8, 0xfe, 0xf7, - 0xdf, 0xfd, 0x49, 0x4f, 0x80, 0x00, 0x79, 0x6a, - 0x40, 0x18, 0x04, 0x21, 0x00, 0xf0, 0xee, 0xf8, - 0x78, 0x62, 0x17, 0xe0, 0x2d, 0x29, 0x0d, 0xd1, - 0x01, 0x30, 0x02, 0x90, 0x02, 0xa8, 0xfe, 0xf7, - 0xcf, 0xfd, 0x41, 0x4f, 0x80, 0x00, 0x79, 0x6a, - 0x08, 0x1a, 0x04, 0x21, 0x00, 0xf0, 0xde, 0xf8, - 0x78, 0x62, 0x07, 0xe0, 0x02, 0xa8, 0xfe, 0xf7, - 0xc3, 0xfd, 0x04, 0x21, 0x00, 0xf0, 0xd6, 0xf8, - 0x39, 0x4f, 0x78, 0x62, 0x03, 0xa8, 0xfe, 0xf7, - 0xb5, 0xfc, 0x02, 0x90, 0x00, 0x28, 0x04, 0xd0, - 0x02, 0xa8, 0xfe, 0xf7, 0xb5, 0xfd, 0x34, 0x4f, - 0xb8, 0x62, 0x33, 0x48, 0x00, 0x27, 0x81, 0x6a, - 0x00, 0x29, 0x37, 0xd9, 0x30, 0x49, 0x48, 0x6a, - 0x35, 0x49, 0x09, 0x68, 0x88, 0x42, 0x0b, 0xd2, - 0x2d, 0x49, 0x89, 0x6b, 0x01, 0x29, 0x03, 0xd1, - 0x01, 0x88, 0x03, 0xf0, 0x11, 0xfc, 0x05, 0xe0, - 0x01, 0x68, 0x04, 0xf0, 0x97, 0xf8, 0x01, 0xe0, - 0x04, 0xf0, 0x74, 0xf8, 0x26, 0x49, 0x88, 0x6b, - 0x01, 0x28, 0x03, 0xd1, 0x48, 0x6a, 0x02, 0x30, - 0xed, 0x09, 0x00, 0xd6, 0x01, 0x48, 0x62, 0x02, - 0xe0, 0x48, 0x6a, 0x04, 0x30, 0x48, 0x62, 0x88, - 0x6a, 0x01, 0x37, 0x87, 0x42, 0xdc, 0xd3, 0x13, - 0xe0, 0x03, 0x98, 0x01, 0x78, 0x65, 0x29, 0x0f, - 0xd1, 0x40, 0x78, 0x72, 0x28, 0x0c, 0xd1, 0x68, - 0x46, 0x00, 0xf0, 0x4a, 0xf8, 0x01, 0x1c, 0x20, - 0xa0, 0xfe, 0xf7, 0x7f, 0xff, 0x00, 0x99, 0x00, - 0x29, 0x02, 0xd0, 0x1d, 0xa0, 0xfe, 0xf7, 0x79, - 0xff, 0x1c, 0x4f, 0x38, 0x1c, 0x00, 0xf0, 0xac, - 0xf9, 0x39, 0x1c, 0x09, 0x22, 0x1a, 0x48, 0xfe, - 0xf7, 0x53, 0xff, 0x10, 0x48, 0xc0, 0x6a, 0x00, - 0x28, 0x01, 0xd0, 0xff, 0xf7, 0xfa, 0xfb, 0x17, - 0xa0, 0xfe, 0xf7, 0x18, 0xfc, 0x00, 0x20, 0x4e, - 0xe6, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, - 0x28, 0x72, 0x65, 0x29, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x0a, 0x00, 0x20, 0x57, 0x61, - 0x74, 0x63, 0x68, 0x64, 0x6f, 0x67, 0x20, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x20, - 0x21, 0x21, 0x20, 0x00, 0x00, 0x28, 0x69, 0x03, - 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, - 0x73, 0x74, 0x6f, 0x70, 0x65, 0x64, 0x0a, 0x00, - 0x00, 0x94, 0xb8, 0x03, 0x20, 0x24, 0x00, 0x00, - 0x20, 0x0a, 0x25, 0x73, 0x00, 0xe0, 0xbd, 0x03, - 0x20, 0x94, 0xbd, 0x03, 0x20, 0x0a, 0x40, 0x20, - 0x00, 0x80, 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0x68, - 0x46, 0x0a, 0xf0, 0x44, 0xff, 0x05, 0x48, 0x6b, - 0x46, 0x28, 0x21, 0x05, 0xa2, 0x38, 0x60, 0xf7, - 0xf7, 0xb8, 0xfc, 0x02, 0xb0, 0x80, 0xbc, 0x08, - 0xbc, 0x05, 0x48, 0x18, 0x47, 0x88, 0xbe, 0x03, - 0x20, 0x42, 0x44, 0x5f, 0x41, 0x44, 0x44, 0x52, - 0x3a, 0x20, 0x25, 0x3a, 0x2d, 0x36, 0x42, 0x00, - 0x00, 0xc4, 0x5d, 0x03, 0x20, 0x00, 0xb5, 0x01, - 0x20, 0x80, 0x02, 0xed, 0x09, 0x00, 0xd7, 0x01, - 0x18, 0xf0, 0x6d, 0xfa, 0x08, 0xbc, 0x18, 0x47, - 0x01, 0x48, 0x80, 0x78, 0x70, 0x47, 0x60, 0x00, - 0x00, 0xd0, 0x00, 0xb5, 0x01, 0x20, 0x80, 0x02, - 0x18, 0xf0, 0x85, 0xfa, 0x08, 0xbc, 0x18, 0x47, - 0x01, 0x48, 0x00, 0x68, 0x70, 0x47, 0x70, 0x65, - 0x03, 0x20, 0x70, 0x47, 0x70, 0x47, 0x70, 0x47, - 0x08, 0x49, 0xca, 0x1d, 0xcc, 0x31, 0x41, 0x60, - 0xbd, 0x32, 0x02, 0x60, 0x08, 0x30, 0x00, 0x22, - 0x00, 0x21, 0x00, 0x23, 0x0e, 0xc0, 0x0e, 0xc0, - 0x0e, 0xc0, 0x0e, 0xc0, 0x0c, 0xc0, 0x70, 0x47, - 0x00, 0x00, 0x88, 0xe5, 0x03, 0x20, 0x90, 0xb5, - 0x0c, 0x1c, 0x01, 0x1c, 0x07, 0x1c, 0x20, 0x1c, - 0xe2, 0xf7, 0x57, 0xff, 0x00, 0x29, 0x0b, 0xd0, - 0x60, 0x1e, 0x3c, 0x1c, 0x84, 0x43, 0x39, 0x1c, - 0x22, 0x1c, 0x16, 0xa0, 0xfe, 0xf7, 0xdc, 0xfe, - 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x01, 0x23, 0xdb, 0x03, 0x9f, 0x42, 0x01, 0xd2, - 0x38, 0x1c, 0xf6, 0xe7, 0x01, 0x23, 0x5b, 0x07, - 0xf8, 0x1a, 0x9b, 0x0a, 0x98, 0x42, 0x01, 0xd2, - 0x38, 0x1c, 0xee, 0xe7, 0x03, 0x23, 0x1b, 0x07, - 0xf8, 0x18, 0x01, 0x23, 0x9b, 0x03, 0x98, 0x42, - 0x01, 0xd2, 0x38, 0x1c, 0xe5, 0xe7, 0x01, 0x23, - 0x5b, 0x07, 0xf8, 0x18, 0x59, 0x23, 0x1b, 0x02, - 0x98, 0x42, 0x01, 0xd2, 0x38, 0x1c, 0xdc, 0xe7, - 0x39, 0x1c, 0x0b, 0xa0, 0xfe, 0xf7, 0xb4, 0xfe, - 0x00, 0x20, 0xd6, 0xe7, 0x00, 0x00, 0x0a, 0x75, - 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x41, 0x64, - 0x64, 0x72, 0x20, 0x25, 0x58, 0x20, 0x73, 0x65, - 0x74, 0x20, 0x74, 0x6f, 0x20, 0x25, 0x58, 0x00, - 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x72, 0x65, 0x61, 0xed, 0x09, - 0x00, 0xd8, 0x01, 0x64, 0x20, 0x41, 0x64, 0x64, - 0x72, 0x20, 0x25, 0x58, 0x20, 0x73, 0x65, 0x74, - 0x20, 0x74, 0x6f, 0x20, 0x30, 0x00, 0x00, 0x90, - 0xb5, 0x0c, 0x1c, 0x01, 0x1c, 0x07, 0x1c, 0x20, - 0x1c, 0xe2, 0xf7, 0xf9, 0xfe, 0x00, 0x29, 0x0b, - 0xd0, 0x60, 0x1e, 0x3c, 0x1c, 0x84, 0x43, 0x39, - 0x1c, 0x22, 0x1c, 0x16, 0xa0, 0xfe, 0xf7, 0x7e, - 0xfe, 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x01, 0x23, 0xdb, 0x03, 0x9f, 0x42, 0x01, - 0xd2, 0x38, 0x1c, 0xf6, 0xe7, 0x01, 0x23, 0x5b, - 0x07, 0xf8, 0x1a, 0x9b, 0x0a, 0x98, 0x42, 0x01, - 0xd2, 0x38, 0x1c, 0xee, 0xe7, 0x03, 0x23, 0x1b, - 0x07, 0xf8, 0x18, 0x01, 0x23, 0x9b, 0x03, 0x98, - 0x42, 0x01, 0xd2, 0x38, 0x1c, 0xe5, 0xe7, 0x01, - 0x23, 0x5b, 0x07, 0xf8, 0x18, 0x59, 0x23, 0x1b, - 0x02, 0x98, 0x42, 0x01, 0xd2, 0x38, 0x1c, 0xdc, - 0xe7, 0x39, 0x1c, 0x0b, 0xa0, 0xfe, 0xf7, 0x56, - 0xfe, 0x00, 0x20, 0xd6, 0xe7, 0x00, 0x00, 0x0a, - 0x75, 0x6e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, - 0x41, 0x64, 0x64, 0x72, 0x20, 0x25, 0x58, 0x20, - 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x25, - 0x58, 0x00, 0x00, 0x0a, 0x75, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x20, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x20, 0x41, 0x64, 0x64, 0x72, 0x20, 0x25, - 0x58, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, - 0x20, 0x30, 0x00, 0x01, 0x49, 0x01, 0x20, 0x48, - 0x70, 0x70, 0x47, 0x60, 0x00, 0x00, 0xd0, 0x00, - 0xb5, 0x07, 0xf0, 0xc7, 0xfc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x07, 0xf0, 0xcc, 0xfc, 0x00, - 0x28, 0x02, 0xd1, 0x01, 0x20, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x20, 0xfb, 0xe7, 0x01, 0x49, 0x08, - 0x70, 0xed, 0x09, 0x00, 0xd9, 0x01, 0x70, 0x47, - 0x60, 0x00, 0x00, 0xd0, 0x01, 0x48, 0x00, 0x78, - 0x70, 0x47, 0x00, 0x00, 0x60, 0x00, 0x00, 0xd0, - 0x80, 0xb5, 0x08, 0x48, 0x18, 0xf0, 0x88, 0xf9, - 0x07, 0x4f, 0x78, 0x60, 0x01, 0x20, 0x80, 0x02, - 0x18, 0xf0, 0x5e, 0xf9, 0x00, 0x20, 0x18, 0xf0, - 0xff, 0xf9, 0x38, 0x60, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, - 0x70, 0x69, 0x03, 0x20, 0x80, 0xb5, 0x05, 0x4f, - 0x38, 0x68, 0x18, 0xf0, 0xf1, 0xf9, 0x78, 0x68, - 0x18, 0xf0, 0x4a, 0xf9, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x70, 0x69, 0x03, 0x20, - 0x00, 0xb5, 0x03, 0xa0, 0xfe, 0xf7, 0xe9, 0xfd, - 0x18, 0xf0, 0x2a, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0x0a, 0x2d, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x20, 0x2d, 0x2d, 0x2d, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x70, 0x47, 0x42, 0x6c, 0x75, 0x65, - 0x74, 0x6f, 0x6f, 0x74, 0x68, 0x20, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x20, 0x4d, 0x6f, 0x6e, - 0x69, 0x74, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xb5, 0x81, 0xb0, 0x01, 0x98, 0x01, 0x78, - 0x75, 0x29, 0x02, 0xd0, 0x02, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0x30, 0x01, 0x90, 0x01, 0x78, - 0x65, 0x29, 0x4d, 0xd0, 0x13, 0xdc, 0x3f, 0x29, - 0x1e, 0xd0, 0x64, 0x29, 0x59, 0xd1, 0x01, 0x30, - 0x01, 0x90, 0x01, 0x78, 0x72, 0x29, 0x54, 0xd1, - 0x01, 0x30, 0x01, 0x90, 0x00, 0x78, 0x6f, 0x28, - 0x3a, 0xd0, 0x21, 0xdc, 0x61, 0x28, 0x27, 0xd0, - 0x63, 0x28, 0x31, 0xd0, 0x20, 0xe0, 0x66, 0x29, - 0x17, 0xd0, 0x73, 0x29, 0x45, 0xd1, 0xe4, 0xf7, - 0x43, 0xfe, 0xfc, 0xf7, 0x0b, 0xfa, 0x0b, 0xf0, - 0x91, 0xfb, 0x0a, 0xf0, 0xed, 0x09, 0x00, 0xda, - 0x01, 0x73, 0xfe, 0x3c, 0xe0, 0x1e, 0xa0, 0xfe, - 0xf7, 0x96, 0xfd, 0x31, 0xa0, 0xfe, 0xf7, 0x93, - 0xfd, 0x3a, 0xa0, 0xfe, 0xf7, 0x90, 0xfd, 0x47, - 0xa0, 0xfe, 0xf7, 0x8d, 0xfd, 0x2f, 0xe0, 0xf7, - 0xf7, 0xa1, 0xfb, 0x2c, 0xe0, 0x73, 0x28, 0x09, - 0xd0, 0x75, 0x28, 0x0b, 0xd0, 0x4d, 0xa0, 0xfe, - 0xf7, 0x82, 0xfd, 0x24, 0xe0, 0x01, 0x20, 0xf7, - 0xf7, 0xbd, 0xfb, 0x20, 0xe0, 0x00, 0x20, 0xf7, - 0xf7, 0xb9, 0xfb, 0x1c, 0xe0, 0x02, 0x20, 0xf7, - 0xf7, 0xb5, 0xfb, 0x18, 0xe0, 0x03, 0x20, 0xf7, - 0xf7, 0xb1, 0xfb, 0x14, 0xe0, 0x04, 0x20, 0xf7, - 0xf7, 0xad, 0xfb, 0x10, 0xe0, 0x01, 0x30, 0x01, - 0x90, 0x01, 0xa8, 0xfe, 0xf7, 0x5f, 0xfa, 0x00, - 0x90, 0x00, 0x28, 0x05, 0xd0, 0x68, 0x46, 0xfe, - 0xf7, 0x5f, 0xfb, 0xe6, 0xf7, 0xe3, 0xf9, 0x02, - 0xe0, 0x01, 0x20, 0xe6, 0xf7, 0xdf, 0xf9, 0x97, - 0xe7, 0x0a, 0x64, 0x72, 0x3c, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x3e, 0x20, 0x20, 0x3c, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x3e, 0x3d, 0x20, 0x5b, 0x61, - 0x5d, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, - 0x6e, 0x65, 0x20, 0x5b, 0x73, 0x5d, 0x79, 0x6e, - 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x65, 0x20, 0x5b, - 0x75, 0x5d, 0x73, 0x62, 0x20, 0x5b, 0x63, 0x5d, - 0x61, 0x70, 0x69, 0x20, 0x5b, 0x6f, 0x5d, 0x66, - 0x66, 0x20, 0x44, 0x65, 0x62, 0x75, 0x67, 0x72, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x00, - 0x00, 0x66, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x20, 0x64, 0x65, 0x62, - 0x75, 0x67, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x0a, 0x00, 0x65, 0x20, 0xed, - 0x09, 0x00, 0xdb, 0x01, 0x65, 0x63, 0x68, 0x6f, - 0x66, 0x6c, 0x61, 0x67, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x65, 0x63, 0x68, 0x6f, 0x20, 0x62, 0x61, 0x63, - 0x6b, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x64, 0x20, 0x64, 0x6d, 0x2f, 0x68, 0x20, - 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x0a, - 0x00, 0x00, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x68, 0x6f, 0x77, 0x20, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x0a, 0x00, - 0x00, 0x00, 0x0a, 0x75, 0x73, 0x65, 0x3a, 0x20, - 0x5b, 0x75, 0x5d, 0x64, 0x72, 0x3c, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x3e, 0x20, 0x20, 0x3c, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x3e, 0x3d, 0x20, 0x5b, - 0x61, 0x5d, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, - 0x6f, 0x6e, 0x65, 0x20, 0x5b, 0x73, 0x5d, 0x79, - 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x65, 0x20, - 0x5b, 0x75, 0x5d, 0x73, 0x62, 0x20, 0x5b, 0x63, - 0x5d, 0x61, 0x70, 0x69, 0x20, 0x5b, 0x6f, 0x5d, - 0x66, 0x66, 0x0a, 0x00, 0x00, 0x00, 0x70, 0x47, - 0x70, 0x47, 0x02, 0x48, 0x00, 0x21, 0x01, 0x60, - 0x41, 0x60, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xbe, - 0x03, 0x20, 0x01, 0x1c, 0x07, 0x48, 0x43, 0x68, - 0x5a, 0x1c, 0x42, 0x60, 0x1a, 0x18, 0x11, 0x72, - 0x41, 0x68, 0x01, 0x23, 0x9b, 0x02, 0x99, 0x42, - 0x01, 0xd3, 0x00, 0x21, 0x41, 0x60, 0x70, 0x47, - 0x00, 0x00, 0xb0, 0xbe, 0x03, 0x20, 0x06, 0x49, - 0x08, 0x68, 0x42, 0x1c, 0x40, 0x18, 0x01, 0x23, - 0x9b, 0x02, 0x0a, 0x60, 0x00, 0x7a, 0x9a, 0x42, - 0x01, 0xd3, 0xed, 0x09, 0x00, 0xdc, 0x01, 0x00, - 0x22, 0x0a, 0x60, 0x70, 0x47, 0x00, 0x00, 0xb0, - 0xbe, 0x03, 0x20, 0x03, 0x49, 0x01, 0x20, 0x4a, - 0x68, 0x09, 0x68, 0x8a, 0x42, 0x00, 0xd0, 0x00, - 0x20, 0x70, 0x47, 0xb0, 0xbe, 0x03, 0x20, 0x01, - 0x49, 0x00, 0x20, 0x08, 0x60, 0x70, 0x47, 0x7c, - 0x69, 0x03, 0x20, 0x80, 0xb5, 0x07, 0x4f, 0x38, - 0x68, 0x00, 0x28, 0x01, 0xd0, 0x08, 0xf0, 0x93, - 0xf9, 0x00, 0x20, 0x38, 0x60, 0x04, 0xa0, 0xfe, - 0xf7, 0x7b, 0xfc, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x7c, 0x69, 0x03, 0x20, 0x0a, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x3a, 0x20, 0x63, - 0x6c, 0x65, 0x61, 0x72, 0x65, 0x64, 0x00, 0x00, - 0xb5, 0x07, 0x49, 0x08, 0x68, 0x00, 0x28, 0x04, - 0xd1, 0x06, 0xa0, 0xfe, 0xf7, 0x65, 0xfc, 0x08, - 0xbc, 0x18, 0x47, 0x8a, 0x68, 0x49, 0x68, 0x92, - 0x00, 0xe2, 0xf7, 0xb9, 0xfd, 0xf7, 0xe7, 0x7c, - 0x69, 0x03, 0x20, 0x0a, 0x6e, 0x6f, 0x20, 0x72, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0xf0, - 0xb5, 0x0d, 0x4e, 0x07, 0x1c, 0x30, 0x68, 0x0c, - 0x1c, 0x00, 0x28, 0x01, 0xd0, 0x08, 0xf0, 0x57, - 0xf9, 0xa0, 0x00, 0x05, 0x1c, 0x08, 0xf0, 0x28, - 0xf9, 0x81, 0xc6, 0x08, 0x3e, 0x39, 0x1c, 0x2a, - 0x1c, 0xb4, 0x60, 0xe2, 0xf7, 0x94, 0xfd, 0xea, - 0x19, 0x39, 0x1c, 0x03, 0xa0, 0xfe, 0xf7, 0x34, - 0xfc, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x7c, - 0x69, 0x03, 0x20, 0x0a, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x3a, 0x20, 0x73, 0x65, 0x74, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x25, 0x58, 0x20, 0x74, - 0x6f, 0x20, 0x25, 0x58, 0x00, 0x00, 0x00, 0xf0, - 0xb5, 0x13, 0x4e, 0x07, 0x1c, 0xed, 0x09, 0x00, - 0xdd, 0x01, 0x30, 0x68, 0x00, 0x28, 0x05, 0xd1, - 0x11, 0xa0, 0xfe, 0xf7, 0x18, 0xfc, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x25, 0x00, 0x24, - 0x0c, 0xe0, 0x32, 0x68, 0xa8, 0x00, 0x71, 0x68, - 0x13, 0x58, 0x0a, 0x58, 0x93, 0x42, 0x04, 0xd0, - 0x41, 0x18, 0x0f, 0xa0, 0x01, 0x34, 0xfe, 0xf7, - 0x06, 0xfc, 0x01, 0x35, 0xb0, 0x68, 0x85, 0x42, - 0x01, 0xd2, 0xbc, 0x42, 0xed, 0xd3, 0x00, 0x2c, - 0xe5, 0xd1, 0x10, 0xa0, 0xfe, 0xf7, 0xfb, 0xfb, - 0xe1, 0xe7, 0x00, 0x00, 0x7c, 0x69, 0x03, 0x20, - 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x3a, - 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x20, 0x73, 0x65, 0x74, 0x00, 0x00, 0x00, - 0x0a, 0x25, 0x30, 0x38, 0x78, 0x3a, 0x20, 0x25, - 0x30, 0x38, 0x58, 0x20, 0x21, 0x3d, 0x20, 0x25, - 0x30, 0x38, 0x58, 0x20, 0x28, 0x6f, 0x6c, 0x64, - 0x29, 0x20, 0x00, 0x00, 0x0a, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x3a, 0x20, 0x6e, 0x6f, 0x20, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x73, 0x00, 0x00, 0x00, - 0x0d, 0x28, 0x24, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, - 0x5b, 0x00, 0x9f, 0x44, 0x18, 0x14, 0x1c, 0x0c, - 0x16, 0x12, 0x1a, 0x08, 0x10, 0x0e, 0x06, 0x0a, - 0x1e, 0x00, 0x0e, 0xa0, 0x70, 0x47, 0x13, 0xa0, - 0x70, 0x47, 0x18, 0xa0, 0x70, 0x47, 0x1d, 0xa0, - 0x70, 0x47, 0x22, 0xa0, 0x70, 0x47, 0x27, 0xa0, - 0x70, 0x47, 0x2c, 0xa0, 0x70, 0x47, 0x31, 0xa0, - 0x70, 0x47, 0x36, 0xa0, 0x70, 0x47, 0x3b, 0xa0, - 0x70, 0x47, 0x40, 0xa0, 0x70, 0x47, 0x45, 0xa0, - 0x70, 0x47, 0x4a, 0xa0, 0x70, 0x47, 0x4f, 0xa0, - 0x70, 0x47, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x44, - 0x52, 0x49, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x55, - 0x53, 0x50, 0x45, 0x4e, 0x44, 0x20, 0x20, 0x20, - 0xed, 0x09, 0x00, 0xde, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, - 0x44, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x46, 0x49, 0x4e, 0x49, - 0x53, 0x48, 0x45, 0x44, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x4d, 0x41, 0x49, 0x4c, - 0x42, 0x4f, 0x58, 0x5f, 0x53, 0x55, 0x53, 0x50, - 0x45, 0x4e, 0x44, 0x20, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, - 0x52, 0x59, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, - 0x4e, 0x44, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x50, 0x41, 0x52, 0x54, - 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x55, - 0x53, 0x50, 0x45, 0x4e, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x50, 0x49, 0x50, 0x45, - 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x50, 0x55, 0x52, 0x45, - 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x51, 0x55, 0x45, 0x55, - 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, - 0x44, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x52, 0x45, 0x41, 0x44, - 0x59, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x53, 0x45, 0x4d, 0x41, - 0x50, 0x48, 0x4f, 0x52, 0x45, 0x5f, 0x53, 0x55, - 0x53, 0x50, 0x45, 0x4e, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x53, 0x4c, 0x45, 0x45, - 0x50, 0x5f, 0x53, 0xed, 0x09, 0x00, 0xdf, 0x01, - 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x20, 0x20, - 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, - 0x54, 0x45, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x75, - 0x6e, 0x6b, 0x6f, 0x6e, 0x6f, 0x77, 0x6e, 0x20, - 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb5, - 0x04, 0x68, 0x07, 0x1c, 0xff, 0xf7, 0xf4, 0xfb, - 0x00, 0x28, 0x02, 0xd0, 0x23, 0xa0, 0xfe, 0xf7, - 0xf7, 0xfa, 0x10, 0x20, 0x20, 0x40, 0x10, 0x28, - 0x06, 0xd1, 0x25, 0xa0, 0xfe, 0xf7, 0xf0, 0xfa, - 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x27, 0x4d, 0x01, 0x2c, 0x25, 0xd0, 0x26, 0xa0, - 0xfe, 0xf7, 0xe6, 0xfa, 0x2e, 0x48, 0x00, 0x24, - 0x28, 0x60, 0x04, 0x35, 0x00, 0x20, 0x11, 0xc5, - 0x11, 0xc5, 0x78, 0x68, 0x14, 0x3d, 0x68, 0x61, - 0xb8, 0x68, 0xa8, 0x61, 0xf8, 0x68, 0xe8, 0x61, - 0x38, 0x69, 0x28, 0x62, 0x78, 0x69, 0x68, 0x62, - 0xb8, 0x69, 0xa8, 0x62, 0xf8, 0x69, 0xe8, 0x62, - 0x38, 0x6a, 0x28, 0x63, 0x78, 0x6a, 0x68, 0x63, - 0xf8, 0x1d, 0x21, 0x30, 0xa8, 0x63, 0xb8, 0x6a, - 0xe8, 0x63, 0xb8, 0x6a, 0x28, 0x64, 0x28, 0x1c, - 0xd3, 0xe7, 0x1d, 0xa0, 0xfe, 0xf7, 0xc0, 0xfa, - 0x08, 0x23, 0x28, 0x1c, 0x3c, 0x1d, 0x06, 0xcc, - 0x06, 0xc0, 0x01, 0x3b, 0xfb, 0xd1, 0x04, 0xcc, - 0x04, 0xc0, 0xaf, 0x63, 0x28, 0x1c, 0xc4, 0xe7, - 0x00, 0x00, 0x20, 0x28, 0x68, 0x61, 0x72, 0x64, - 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x29, 0x20, - 0x00, 0x00, 0x20, 0x28, 0x6d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0xed, 0x09, - 0x00, 0xe0, 0x01, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x29, 0x20, 0x00, 0xb8, 0xc2, 0x03, 0x20, 0x20, - 0x28, 0x74, 0x61, 0x73, 0x6b, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x6e, - 0x6f, 0x3a, 0x20, 0x61, 0x31, 0x2d, 0x61, 0x34, - 0x2c, 0x20, 0x63, 0x70, 0x73, 0x72, 0x29, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x20, - 0x28, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, - 0x70, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, - 0xb5, 0x00, 0xf0, 0x5b, 0xf8, 0x00, 0x28, 0x0a, - 0xd0, 0x04, 0x21, 0xff, 0xf7, 0xe4, 0xfb, 0x04, - 0x49, 0x08, 0x60, 0x80, 0x6b, 0x04, 0x21, 0xff, - 0xf7, 0xde, 0xfb, 0x02, 0x49, 0x08, 0x60, 0x08, - 0xbc, 0x18, 0x47, 0x24, 0x69, 0x03, 0x20, 0x20, - 0x69, 0x03, 0x20, 0x00, 0xb5, 0x02, 0x1c, 0x40, - 0x6a, 0x92, 0x6a, 0x01, 0x1c, 0x03, 0x78, 0x01, - 0x30, 0x55, 0x2b, 0x01, 0xd1, 0x82, 0x42, 0xf9, - 0xd8, 0x13, 0x1a, 0x02, 0xa0, 0xfe, 0xf7, 0x56, - 0xfa, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x0a, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x25, 0x78, - 0x2d, 0x25, 0x78, 0x20, 0x75, 0x73, 0x65, 0x64, - 0x3a, 0x20, 0x25, 0x78, 0x20, 0x00, 0x00, 0x80, - 0xb5, 0x07, 0x1c, 0x0b, 0x48, 0x00, 0x68, 0x00, - 0x28, 0x05, 0xd0, 0x41, 0x6a, 0x39, 0x60, 0x80, - 0x6a, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x07, - 0x48, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x41, - 0x6a, 0x39, 0x60, 0x80, 0x6a, 0xf4, 0xe7, 0x04, - 0xa0, 0xfe, 0xf7, 0x30, 0xfa, 0x00, 0x20, 0x38, - 0x60, 0xee, 0xe7, 0x68, 0x69, 0x03, 0x20, 0x64, - 0x69, 0x03, 0x20, 0x0a, 0x6e, 0x6f, 0x20, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x48, - 0x49, 0xed, 0x09, 0x00, 0xe1, 0x01, 0x53, 0x52, - 0x2f, 0x54, 0x61, 0x73, 0x6b, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x38, 0x4e, 0x07, 0x1c, 0x00, 0x28, - 0x37, 0x4d, 0x34, 0x68, 0x17, 0xd1, 0x37, 0x49, - 0x28, 0x60, 0x08, 0x60, 0xf4, 0xf7, 0xee, 0xff, - 0x28, 0x60, 0x00, 0x28, 0x05, 0xd0, 0xc0, 0x6a, - 0xff, 0xf7, 0x0a, 0xff, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf4, 0xf7, 0xf1, 0xff, 0x2f, 0x49, - 0x00, 0x28, 0x08, 0x60, 0x03, 0xd0, 0xc0, 0x6a, - 0xff, 0xf7, 0xfe, 0xfe, 0xf2, 0xe7, 0x00, 0x2c, - 0x22, 0xd0, 0x08, 0x22, 0x38, 0x1c, 0xe1, 0x1d, - 0x09, 0x31, 0x07, 0xf0, 0x57, 0xff, 0x00, 0x28, - 0x14, 0xd1, 0x39, 0x1c, 0x26, 0xa0, 0xfe, 0xf7, - 0xf0, 0xf9, 0x24, 0x48, 0x00, 0x27, 0x2c, 0x60, - 0x07, 0x60, 0xf4, 0xf7, 0xc7, 0xff, 0xa0, 0x42, - 0x04, 0xd1, 0x29, 0xa0, 0xfe, 0xf7, 0xe5, 0xf9, - 0x38, 0x1c, 0xd7, 0xe7, 0xe0, 0x6a, 0xff, 0xf7, - 0xdf, 0xfe, 0xd3, 0xe7, 0x64, 0x68, 0x30, 0x68, - 0x84, 0x42, 0x01, 0xd0, 0x00, 0x2c, 0xdc, 0xd1, - 0x2d, 0x4e, 0x34, 0x68, 0x00, 0x2c, 0x22, 0xd0, - 0x08, 0x22, 0x38, 0x1c, 0xe1, 0x1d, 0x09, 0x31, - 0x07, 0xf0, 0x30, 0xff, 0x00, 0x28, 0x14, 0xd1, - 0x39, 0x1c, 0x28, 0xa0, 0xfe, 0xf7, 0xc9, 0xf9, - 0x00, 0x27, 0x10, 0x48, 0x2f, 0x60, 0x04, 0x60, - 0xf4, 0xf7, 0xae, 0xff, 0xa0, 0x42, 0x04, 0xd1, - 0x2a, 0xa0, 0xfe, 0xf7, 0xbe, 0xf9, 0x38, 0x1c, - 0xb0, 0xe7, 0xe0, 0x6a, 0xff, 0xf7, 0xb8, 0xfe, - 0xac, 0xe7, 0x64, 0x68, 0x30, 0x68, 0x84, 0x42, - 0x01, 0xd0, 0x00, 0x2c, 0xdc, 0xd1, 0x39, 0x1c, - 0x2e, 0xa0, 0xfe, 0xf7, 0xae, 0xf9, 0x00, 0x20, - 0xa0, 0xe7, 0x00, 0x00, 0xc8, 0x65, 0x03, 0x20, - 0x68, 0x69, 0x03, 0x20, 0x64, 0x69, 0x03, 0x20, - 0x0a, 0x43, 0x75, 0x72, 0xed, 0x09, 0x00, 0xe2, - 0x01, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x20, 0x73, 0x65, 0x74, 0x20, - 0x74, 0x6f, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x20, - 0x27, 0x25, 0x73, 0x27, 0x00, 0x20, 0x74, 0x61, - 0x73, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x6f, - 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x62, 0x6c, - 0x65, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x03, - 0x20, 0x0a, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, - 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x68, - 0x69, 0x73, 0x72, 0x20, 0x27, 0x25, 0x73, 0x27, - 0x00, 0x20, 0x68, 0x69, 0x73, 0x72, 0x20, 0x69, - 0x73, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x20, 0x6e, 0x6f, 0x20, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x20, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x62, 0x6c, 0x65, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x2f, 0x68, - 0x69, 0x73, 0x72, 0x20, 0x25, 0x73, 0x20, 0x75, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x00, 0x00, - 0x00, 0xf0, 0xb5, 0x07, 0x1c, 0x07, 0xf0, 0xea, - 0xfd, 0x08, 0x28, 0x03, 0xd2, 0x38, 0x1c, 0x07, - 0xf0, 0xe5, 0xfd, 0x00, 0xe0, 0x08, 0x20, 0x12, - 0x4d, 0x06, 0x1c, 0x2c, 0x68, 0x00, 0x2c, 0x1a, - 0xd0, 0xe1, 0x1d, 0x09, 0x31, 0x38, 0x1c, 0x32, - 0x1c, 0x07, 0xf0, 0x92, 0xfe, 0x00, 0x28, 0x0c, - 0xd1, 0x20, 0x1c, 0xf4, 0xf7, 0x45, 0xfe, 0x09, - 0xf0, 0x21, 0xf9, 0x39, 0x1c, 0x02, 0x1c, 0x09, - 0xa0, 0xfe, 0xf7, 0x25, 0xf9, 0xf0, 0xbc, 0xed, - 0x09, 0x00, 0xe3, 0x01, 0x08, 0xbc, 0x18, 0x47, - 0x64, 0x68, 0x28, 0x68, 0x84, 0x42, 0x01, 0xd0, - 0x00, 0x2c, 0xe4, 0xd1, 0x39, 0x1c, 0x08, 0xa0, - 0xfe, 0xf7, 0x18, 0xf9, 0xf1, 0xe7, 0xc8, 0x65, - 0x03, 0x20, 0x0a, 0x53, 0x75, 0x73, 0x70, 0x65, - 0x6e, 0x64, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x28, - 0x25, 0x73, 0x29, 0x3a, 0x20, 0x25, 0x73, 0x20, - 0x00, 0x00, 0x0a, 0x53, 0x75, 0x73, 0x70, 0x65, - 0x6e, 0x64, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x28, - 0x25, 0x73, 0x29, 0x3a, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0xb5, 0x07, 0x1c, 0x07, 0xf0, - 0x9c, 0xfd, 0x08, 0x28, 0x03, 0xd2, 0x38, 0x1c, - 0x07, 0xf0, 0x97, 0xfd, 0x00, 0xe0, 0x08, 0x20, - 0x12, 0x4d, 0x06, 0x1c, 0x2c, 0x68, 0x00, 0x2c, - 0x1a, 0xd0, 0xe1, 0x1d, 0x09, 0x31, 0x38, 0x1c, - 0x32, 0x1c, 0x07, 0xf0, 0x44, 0xfe, 0x00, 0x28, - 0x0c, 0xd1, 0x20, 0x1c, 0xf4, 0xf7, 0x2b, 0xfd, - 0x09, 0xf0, 0xd3, 0xf8, 0x39, 0x1c, 0x02, 0x1c, - 0x09, 0xa0, 0xfe, 0xf7, 0xd7, 0xf8, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x64, 0x68, 0x28, 0x68, - 0x84, 0x42, 0x01, 0xd0, 0x00, 0x2c, 0xe4, 0xd1, - 0x39, 0x1c, 0x08, 0xa0, 0xfe, 0xf7, 0xca, 0xf8, - 0xf1, 0xe7, 0xc8, 0x65, 0x03, 0x20, 0x0a, 0x52, - 0x65, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x54, 0x61, - 0x73, 0x6b, 0x28, 0x25, 0x73, 0x29, 0x3a, 0x20, - 0x25, 0x73, 0x20, 0x00, 0x00, 0x00, 0x0a, 0x52, - 0x65, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x54, 0x61, - 0x73, 0x6b, 0x28, 0x25, 0x73, 0x29, 0x3a, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x00, 0xf0, 0xb5, 0x07, 0x1c, 0x07, 0xf0, - 0x50, 0xfd, 0x08, 0x28, 0x03, 0xd2, 0x38, 0x1c, - 0x07, 0xf0, 0xed, 0x09, 0x00, 0xe4, 0x01, 0x4b, - 0xfd, 0x00, 0xe0, 0x08, 0x20, 0x1d, 0x4d, 0x06, - 0x1c, 0x2c, 0x68, 0x00, 0x2c, 0x30, 0xd0, 0xe1, - 0x1d, 0x09, 0x31, 0x38, 0x1c, 0x32, 0x1c, 0x07, - 0xf0, 0xf8, 0xfd, 0x00, 0x28, 0x22, 0xd1, 0x20, - 0x1c, 0xf4, 0xf7, 0xab, 0xfd, 0x09, 0xf0, 0x87, - 0xf8, 0x39, 0x1c, 0x02, 0x1c, 0x14, 0x48, 0xfe, - 0xf7, 0x8b, 0xf8, 0x20, 0x1c, 0xf4, 0xf7, 0xf9, - 0xfb, 0x09, 0xf0, 0x7d, 0xf8, 0x39, 0x1c, 0x02, - 0x1c, 0x10, 0xa0, 0xfe, 0xf7, 0x81, 0xf8, 0x00, - 0x22, 0x00, 0x21, 0x20, 0x1c, 0xf4, 0xf7, 0xc9, - 0xfb, 0x09, 0xf0, 0x71, 0xf8, 0x39, 0x1c, 0x02, - 0x1c, 0x11, 0xa0, 0xfe, 0xf7, 0x75, 0xf8, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x64, 0x68, 0x28, - 0x68, 0x84, 0x42, 0x01, 0xd0, 0x00, 0x2c, 0xce, - 0xd1, 0x39, 0x1c, 0x12, 0xa0, 0xfe, 0xf7, 0x68, - 0xf8, 0xf1, 0xe7, 0xc8, 0x65, 0x03, 0x20, 0x40, - 0xdf, 0x01, 0x20, 0x0a, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x65, 0x5f, 0x54, 0x61, - 0x73, 0x6b, 0x28, 0x25, 0x73, 0x29, 0x3a, 0x20, - 0x25, 0x73, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0a, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x54, 0x61, - 0x73, 0x6b, 0x28, 0x25, 0x73, 0x2c, 0x20, 0x30, - 0x2c, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x29, 0x3a, - 0x20, 0x25, 0x73, 0x20, 0x00, 0x00, 0x00, 0x0a, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x54, 0x61, - 0x73, 0x6b, 0x28, 0x25, 0x73, 0x29, 0x3a, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x00, 0x00, 0xf0, 0xb5, 0x84, 0xb0, 0x0c, - 0x1c, 0x23, 0x4e, 0x07, 0x1c, 0x23, 0xa0, 0x35, - 0x68, 0xfe, 0xf7, 0x2e, 0xf8, 0x00, 0x2d, 0x39, - 0xd0, 0x00, 0x2f, 0x01, 0xd0, 0xaf, 0x42, 0x2e, - 0xd1, 0x08, 0x22, 0xe9, 0x1d, 0xed, 0x09, 0x00, - 0xe5, 0x01, 0x09, 0x31, 0x01, 0xa8, 0x07, 0xf0, - 0x9b, 0xfd, 0x00, 0x20, 0x03, 0xab, 0x18, 0x70, - 0x28, 0x7e, 0xff, 0xf7, 0x49, 0xfc, 0xaa, 0x7e, - 0x03, 0x1c, 0x1a, 0xa0, 0x00, 0x92, 0xea, 0x6d, - 0x01, 0xa9, 0xfe, 0xf7, 0x14, 0xf8, 0x00, 0x2c, - 0x11, 0xd0, 0x69, 0x6a, 0xa8, 0x6a, 0x0a, 0x1c, - 0x00, 0xe0, 0x04, 0x32, 0x16, 0x68, 0x1c, 0x4b, - 0x9e, 0x42, 0x01, 0xd1, 0x90, 0x42, 0xf8, 0xd8, - 0x82, 0x1a, 0x00, 0x92, 0x02, 0x1c, 0x19, 0xa0, - 0x2b, 0x6b, 0xfe, 0xf7, 0x00, 0xf8, 0xf4, 0xf7, - 0xdb, 0xfd, 0xa8, 0x42, 0x02, 0xd1, 0x21, 0xa0, - 0xfd, 0xf7, 0xf9, 0xff, 0x05, 0x4e, 0x6d, 0x68, - 0x30, 0x68, 0x85, 0x42, 0x01, 0xd0, 0x00, 0x2d, - 0xc5, 0xd1, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xc8, 0x65, 0x03, 0x20, - 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x6c, 0x69, 0x73, - 0x74, 0x3a, 0x00, 0x00, 0x0a, 0x5b, 0x25, 0x38, - 0x73, 0x5d, 0x20, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x20, 0x25, 0x30, 0x38, 0x78, 0x20, 0x25, 0x73, - 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x20, 0x25, 0x33, 0x64, 0x00, 0x00, 0x00, - 0x55, 0x55, 0x55, 0x55, 0x20, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x20, 0x25, 0x23, 0x30, 0x38, 0x70, - 0x20, 0x2d, 0x20, 0x25, 0x23, 0x30, 0x38, 0x70, - 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x25, - 0x75, 0x29, 0x20, 0x25, 0x75, 0x20, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x3c, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x3e, 0x00, 0x00, - 0xf0, 0xb5, 0x84, 0xb0, 0x0c, 0x1c, 0x22, 0x4e, - 0x07, 0x1c, 0x22, 0xa0, 0x35, 0x68, 0xfd, 0xf7, - 0xaa, 0xff, 0x00, 0x2d, 0x38, 0xd0, 0x00, 0x2f, - 0xed, 0x09, 0x00, 0xe6, 0x01, 0x01, 0xd0, 0xaf, - 0x42, 0x2d, 0xd1, 0x08, 0x22, 0xe9, 0x1d, 0x09, - 0x31, 0x01, 0xa8, 0x07, 0xf0, 0x17, 0xfd, 0x00, - 0x20, 0x03, 0xab, 0x18, 0x70, 0xaa, 0x7e, 0x1b, - 0xa0, 0x01, 0xa9, 0x00, 0x92, 0x6a, 0x6c, 0x2b, - 0x6c, 0xfd, 0xf7, 0x93, 0xff, 0x00, 0x2c, 0x12, - 0xd0, 0x69, 0x6a, 0xa8, 0x6a, 0x0a, 0x1c, 0x00, - 0xe0, 0x04, 0x32, 0x16, 0x68, 0x1e, 0x4b, 0x9e, - 0x42, 0x01, 0xd1, 0x90, 0x42, 0xf8, 0xd8, 0x82, - 0x1a, 0x00, 0x92, 0x02, 0x1c, 0x00, 0xa0, 0xa0, - 0x38, 0x2b, 0x6b, 0xfd, 0xf7, 0x7e, 0xff, 0xf4, - 0xf7, 0x67, 0xfd, 0xa8, 0x42, 0x03, 0xd1, 0x00, - 0xa0, 0x80, 0x38, 0xfd, 0xf7, 0x76, 0xff, 0x05, - 0x4e, 0x6d, 0x68, 0x30, 0x68, 0x85, 0x42, 0x01, - 0xd0, 0x00, 0x2d, 0xc6, 0xd1, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xdc, 0x66, 0x03, - 0x20, 0x0a, 0x48, 0x49, 0x53, 0x52, 0x6c, 0x69, - 0x73, 0x74, 0x3a, 0x00, 0x00, 0x0a, 0x5b, 0x25, - 0x38, 0x73, 0x5d, 0x20, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x20, 0x25, 0x30, 0x38, 0x78, 0x20, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x43, 0x6e, 0x74, 0x20, - 0x25, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x20, 0x25, 0x64, 0x00, 0x00, - 0x00, 0x55, 0x55, 0x55, 0x55, 0xf3, 0xb5, 0x89, - 0xb0, 0x32, 0x4d, 0x07, 0x1c, 0x00, 0x28, 0x2c, - 0x68, 0x02, 0xd1, 0x31, 0xa0, 0xfd, 0xf7, 0x41, - 0xff, 0x00, 0x2c, 0x56, 0xd0, 0x08, 0x22, 0xe1, - 0x1d, 0x09, 0x31, 0x06, 0xa8, 0x07, 0xf0, 0xb2, - 0xfc, 0x00, 0x20, 0x08, 0xab, 0x18, 0x70, 0x00, - 0x2f, 0x05, 0xd0, 0x06, 0xa8, 0x39, 0x1c, 0x17, - 0xf0, 0x83, 0xfa, 0x00, 0x28, 0x3e, 0xd1, 0xa0, - 0x6a, 0xa1, 0x6b, 0x62, 0x6b, 0x03, 0x91, 0x02, - 0x90, 0x04, 0x92, 0xed, 0x09, 0x00, 0xe7, 0x01, - 0xe1, 0x69, 0x22, 0x6a, 0x00, 0x91, 0x01, 0x92, - 0x60, 0x7e, 0x00, 0x28, 0x01, 0xd0, 0x22, 0xa3, - 0x00, 0xe0, 0x23, 0xa3, 0x20, 0x7e, 0x00, 0x28, - 0x01, 0xd0, 0x24, 0xa2, 0x00, 0xe0, 0x27, 0xa2, - 0x06, 0xa9, 0x2b, 0xa0, 0xfd, 0xf7, 0x14, 0xff, - 0x0a, 0x99, 0x00, 0x29, 0x11, 0xd0, 0x3c, 0x34, - 0x07, 0xcc, 0x48, 0x3c, 0x04, 0x91, 0x03, 0x90, - 0x05, 0x92, 0x60, 0x6a, 0xe1, 0x6a, 0x22, 0x6b, - 0x01, 0x91, 0x00, 0x90, 0x02, 0x92, 0x21, 0x1c, - 0x22, 0x1c, 0xe3, 0x68, 0x32, 0xa0, 0xfd, 0xf7, - 0xff, 0xfe, 0x65, 0x6c, 0xe6, 0x6b, 0x06, 0xe0, - 0x28, 0x69, 0xc1, 0x1d, 0x09, 0x31, 0x4f, 0xa0, - 0xfd, 0xf7, 0xf6, 0xfe, 0x6d, 0x68, 0x00, 0x2d, - 0x03, 0xd0, 0x30, 0x1c, 0x01, 0x3e, 0x00, 0x28, - 0xf2, 0xd1, 0x05, 0x4d, 0x64, 0x68, 0x28, 0x68, - 0x84, 0x42, 0x01, 0xd0, 0x00, 0x2c, 0xa8, 0xd1, - 0x0b, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x4c, 0x67, 0x03, 0x20, 0x0a, 0x51, - 0x75, 0x65, 0x75, 0x65, 0x6c, 0x69, 0x73, 0x74, - 0x3a, 0x00, 0x4e, 0x55, 0x5f, 0x46, 0x49, 0x46, - 0x4f, 0x00, 0x4e, 0x55, 0x5f, 0x50, 0x52, 0x49, - 0x4f, 0x52, 0x49, 0x54, 0x59, 0x00, 0x4e, 0x55, - 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x5f, 0x53, - 0x49, 0x5a, 0x45, 0x00, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, - 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x5b, 0x25, 0x38, 0x73, 0x5d, - 0x20, 0x25, 0x31, 0x36, 0x73, 0x20, 0x25, 0x31, - 0x31, 0x73, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3d, - 0x25, 0x34, 0x64, 0x20, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x3d, 0x25, 0x34, 0x75, - 0x20, 0x46, 0x72, 0x65, 0x65, 0x3d, 0xed, 0x09, - 0x00, 0xe8, 0x01, 0x25, 0x34, 0x75, 0x20, 0x28, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x25, 0x78, - 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x25, 0x78, - 0x29, 0x00, 0x00, 0x0a, 0x71, 0x75, 0x65, 0x75, - 0x65, 0x3d, 0x25, 0x78, 0x20, 0x71, 0x75, 0x5f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3d, - 0x25, 0x78, 0x20, 0x71, 0x75, 0x5f, 0x69, 0x64, - 0x3d, 0x25, 0x78, 0x20, 0x71, 0x75, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x3d, 0x25, 0x75, 0x20, 0x71, - 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3d, - 0x25, 0x78, 0x20, 0x71, 0x75, 0x5f, 0x65, 0x6e, - 0x64, 0x3d, 0x25, 0x78, 0x20, 0x71, 0x75, 0x5f, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5f, 0x77, 0x61, - 0x69, 0x74, 0x69, 0x6e, 0x67, 0x3d, 0x25, 0x78, - 0x20, 0x71, 0x75, 0x5f, 0x75, 0x72, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x3d, - 0x25, 0x78, 0x20, 0x71, 0x75, 0x5f, 0x73, 0x75, - 0x73, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x3d, 0x25, 0x78, - 0x00, 0x00, 0x00, 0x20, 0x28, 0x25, 0x38, 0x73, - 0x29, 0x00, 0x00, 0xf3, 0xb5, 0x89, 0xb0, 0x30, - 0x4d, 0x07, 0x1c, 0x00, 0x28, 0x2c, 0x68, 0x02, - 0xd1, 0x2f, 0xa0, 0xfd, 0xf7, 0x4b, 0xfe, 0x00, - 0x2c, 0x53, 0xd0, 0x08, 0x22, 0xe1, 0x1d, 0x09, - 0x31, 0x06, 0xa8, 0x07, 0xf0, 0xbc, 0xfb, 0x00, - 0x20, 0x08, 0xab, 0x18, 0x70, 0x00, 0x2f, 0x05, - 0xd0, 0x06, 0xa8, 0x39, 0x1c, 0x17, 0xf0, 0x8d, - 0xf9, 0x00, 0x28, 0x3b, 0xd1, 0xe0, 0x69, 0x21, - 0x6a, 0xa2, 0x6a, 0x01, 0x91, 0x00, 0x90, 0x02, - 0x92, 0x60, 0x7e, 0x00, 0x28, 0x01, 0xd0, 0x22, - 0xa3, 0x00, 0xe0, 0x23, 0x4b, 0x20, 0x7e, 0x00, - 0x28, 0xed, 0x09, 0x00, 0xe9, 0x01, 0x01, 0xd0, - 0x22, 0x4a, 0x00, 0xe0, 0x22, 0x4a, 0x06, 0xa9, - 0x22, 0xa0, 0xfd, 0xf7, 0x22, 0xfe, 0x0a, 0x99, - 0x00, 0x29, 0x11, 0xd0, 0x3c, 0x34, 0x07, 0xcc, - 0x48, 0x3c, 0x04, 0x91, 0x03, 0x90, 0x05, 0x92, - 0x60, 0x6a, 0xe1, 0x6a, 0x22, 0x6b, 0x01, 0x91, - 0x00, 0x90, 0x02, 0x92, 0x21, 0x1c, 0x22, 0x1c, - 0xe3, 0x68, 0x25, 0xa0, 0xfd, 0xf7, 0x0d, 0xfe, - 0x65, 0x6c, 0xe6, 0x6b, 0x07, 0xe0, 0x28, 0x69, - 0xc1, 0x1d, 0x09, 0x31, 0x00, 0xa0, 0xa8, 0x38, - 0xfd, 0xf7, 0x03, 0xfe, 0x6d, 0x68, 0x00, 0x2d, - 0x03, 0xd0, 0x30, 0x1c, 0x01, 0x3e, 0x00, 0x28, - 0xf1, 0xd1, 0x05, 0x4d, 0x64, 0x68, 0x28, 0x68, - 0x84, 0x42, 0x01, 0xd0, 0x00, 0x2c, 0xab, 0xd1, - 0x0b, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x5c, 0x67, 0x03, 0x20, 0x0a, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x00, 0x00, - 0x4e, 0x55, 0x5f, 0x46, 0x49, 0x46, 0x4f, 0x00, - 0xbc, 0xe3, 0x01, 0x20, 0xc8, 0xe3, 0x01, 0x20, - 0xd8, 0xe3, 0x01, 0x20, 0x0a, 0x5b, 0x25, 0x38, - 0x73, 0x5d, 0x20, 0x25, 0x2d, 0x31, 0x36, 0x73, - 0x20, 0x25, 0x31, 0x31, 0x73, 0x20, 0x53, 0x69, - 0x7a, 0x65, 0x3d, 0x25, 0x34, 0x64, 0x20, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x3d, - 0x25, 0x34, 0x75, 0x20, 0x46, 0x72, 0x65, 0x65, - 0x3d, 0x25, 0x34, 0x75, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x70, 0x69, 0x70, 0x65, 0x3d, 0x25, 0x78, - 0x20, 0x70, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x3d, 0x25, 0x78, 0x20, 0x70, - 0x69, 0x5f, 0x69, 0x64, 0x3d, 0x25, 0x78, 0x20, - 0x70, 0x69, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3d, - 0x25, 0x75, 0x20, 0x70, 0xed, 0x09, 0x00, 0xea, - 0x01, 0x69, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x3d, 0x25, 0x78, 0x20, 0x70, 0x69, 0x5f, 0x65, - 0x6e, 0x64, 0x3d, 0x25, 0x78, 0x20, 0x70, 0x69, - 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5f, 0x77, - 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x3d, 0x25, - 0x78, 0x20, 0x70, 0x69, 0x5f, 0x75, 0x72, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x3d, 0x25, 0x78, 0x20, 0x70, 0x69, 0x5f, 0x73, - 0x75, 0x73, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x3d, 0x25, - 0x78, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x86, - 0xb0, 0x2d, 0x4d, 0x07, 0x1c, 0x2d, 0xa0, 0x2c, - 0x68, 0xfd, 0xf7, 0x79, 0xfd, 0x00, 0x2c, 0x4e, - 0xd0, 0x1f, 0x26, 0xf6, 0x43, 0x08, 0x22, 0xe1, - 0x1d, 0x11, 0x31, 0x03, 0xa8, 0x07, 0xf0, 0xe8, - 0xfa, 0x00, 0x20, 0x05, 0xab, 0x18, 0x70, 0xe0, - 0x1d, 0x29, 0x30, 0x00, 0x7a, 0xe2, 0x6a, 0x00, - 0x28, 0x01, 0xd0, 0x27, 0xa1, 0x00, 0xe0, 0x28, - 0x49, 0xa0, 0x6a, 0x01, 0x91, 0x00, 0x90, 0x02, - 0x92, 0x22, 0x6a, 0x63, 0x6a, 0x25, 0xa0, 0x03, - 0xa9, 0xfd, 0xf7, 0x59, 0xfd, 0x00, 0x2f, 0x27, - 0xd0, 0x2f, 0xa0, 0xfd, 0xf7, 0x54, 0xfd, 0x65, - 0x6b, 0x00, 0x2d, 0x21, 0xd0, 0x28, 0x68, 0x40, - 0x1b, 0x10, 0x38, 0x03, 0x1c, 0x00, 0x28, 0x00, - 0xda, 0x33, 0x1a, 0x29, 0x7a, 0x00, 0x29, 0x01, - 0xd0, 0x2b, 0xa2, 0x04, 0xe0, 0x00, 0x28, 0x01, - 0xda, 0x2b, 0xa2, 0x00, 0xe0, 0x2c, 0xa2, 0x29, - 0x1c, 0x2d, 0xa0, 0xfd, 0xf7, 0x3c, 0xfd, 0xe9, - 0x68, 0xa1, 0x42, 0x03, 0xd0, 0x22, 0x1c, 0x30, - 0xa0, 0xfd, 0xf7, 0x35, 0xfd, 0x2d, 0x68, 0x60, - 0x6b, 0xa8, 0x42, 0x01, 0xd0, 0x00, 0x2d, 0xdd, - 0xd1, 0x05, 0x4d, 0x64, 0x68, 0x28, 0x68, 0xed, - 0x09, 0x00, 0xeb, 0x01, 0x84, 0x42, 0x01, 0xd0, - 0x00, 0x2c, 0xb2, 0xd1, 0x06, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x9c, 0x67, - 0x03, 0x20, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x20, 0x50, 0x6f, 0x6f, 0x6c, 0x6c, 0x69, - 0x73, 0x74, 0x3a, 0x00, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x46, 0x49, 0x46, 0x4f, 0x00, 0xbc, 0xe3, - 0x01, 0x20, 0x0a, 0x5b, 0x25, 0x73, 0x5d, 0x20, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x3d, 0x25, 0x30, - 0x38, 0x78, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3d, - 0x25, 0x30, 0x38, 0x78, 0x20, 0x4d, 0x69, 0x6e, - 0x3d, 0x25, 0x34, 0x75, 0x20, 0x25, 0x31, 0x31, - 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x3d, - 0x25, 0x34, 0x75, 0x00, 0x00, 0x00, 0x0a, 0x09, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x6c, - 0x69, 0x73, 0x74, 0x3a, 0x00, 0x00, 0x66, 0x72, - 0x65, 0x65, 0x00, 0x00, 0x00, 0x00, 0x73, 0x69, - 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x75, 0x73, - 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x09, - 0x5b, 0x25, 0x23, 0x30, 0x38, 0x58, 0x5d, 0x20, - 0x25, 0x73, 0x20, 0x25, 0x64, 0x20, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x00, 0x00, 0x00, 0x0a, 0x09, - 0x49, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, - 0x50, 0x6f, 0x6f, 0x6c, 0x20, 0x5b, 0x25, 0x23, - 0x30, 0x38, 0x58, 0x5d, 0x20, 0x73, 0x68, 0x6f, - 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x5b, - 0x25, 0x23, 0x30, 0x38, 0x58, 0x5d, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0xb5, 0x84, 0xb0, 0x1c, 0x4c, - 0x1d, 0xa0, 0x27, 0x68, 0xfd, 0xf7, 0xba, 0xfc, - 0x00, 0x2f, 0x2d, 0xd0, 0x00, 0x26, 0x08, 0x22, - 0xf9, 0x1d, 0x09, 0x31, 0x01, 0xa8, 0x07, 0xf0, - 0x2a, 0xfa, 0x03, 0xab, 0x1e, 0x70, 0x3a, 0x6a, - 0x00, 0x92, 0xed, 0x09, 0x00, 0xec, 0x01, 0x38, - 0x7f, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xa3, 0xdc, - 0x3b, 0x00, 0xe0, 0x15, 0x4b, 0xba, 0x69, 0x01, - 0xa9, 0x15, 0xa0, 0xfd, 0xf7, 0xa1, 0xfc, 0x7c, - 0x6a, 0x3d, 0x6a, 0x06, 0xe0, 0x20, 0x69, 0xc1, - 0x1d, 0x09, 0x31, 0x18, 0xa0, 0xfd, 0xf7, 0x98, - 0xfc, 0x64, 0x68, 0x00, 0x2c, 0x03, 0xd0, 0x28, - 0x1c, 0x01, 0x3d, 0x00, 0x28, 0xf2, 0xd1, 0x05, - 0x4c, 0x7f, 0x68, 0x20, 0x68, 0x87, 0x42, 0x01, - 0xd0, 0x00, 0x2f, 0xd2, 0xd1, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x6c, - 0x67, 0x03, 0x20, 0x0a, 0x53, 0x65, 0x6d, 0x61, - 0x70, 0x68, 0x6f, 0x72, 0x65, 0x6c, 0x69, 0x73, - 0x74, 0x3a, 0x00, 0xbc, 0xe3, 0x01, 0x20, 0x0a, - 0x5b, 0x25, 0x38, 0x73, 0x5d, 0x20, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x3d, 0x25, 0x33, 0x75, 0x20, - 0x25, 0x31, 0x31, 0x73, 0x20, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x3d, 0x25, 0x33, 0x75, 0x00, 0x20, - 0x28, 0x25, 0x38, 0x73, 0x29, 0x00, 0x00, 0xf0, - 0xb5, 0x88, 0xb0, 0x1f, 0x4d, 0x07, 0x1c, 0x1f, - 0xa0, 0x2c, 0x68, 0xfd, 0xf7, 0x5d, 0xfc, 0x00, - 0x2c, 0x32, 0xd0, 0x00, 0x26, 0x08, 0x22, 0xe1, - 0x1d, 0x09, 0x31, 0x05, 0xa8, 0x07, 0xf0, 0xcd, - 0xf9, 0x07, 0xab, 0x1e, 0x70, 0x60, 0x6b, 0x61, - 0x6a, 0xa2, 0x6a, 0x02, 0x90, 0xe0, 0x1d, 0x29, - 0x30, 0x03, 0x91, 0x04, 0x92, 0x00, 0x78, 0x00, - 0x28, 0x01, 0xd0, 0x18, 0xa2, 0x00, 0xe0, 0x19, - 0x4a, 0x21, 0x6a, 0x01, 0x92, 0x00, 0x91, 0xa2, - 0x69, 0xe3, 0x69, 0x05, 0xa9, 0x17, 0xa0, 0xfd, - 0xf7, 0x3b, 0xfc, 0x00, 0x2f, 0x0a, 0xd0, 0xe0, - 0x6a, 0x00, 0x21, 0x00, 0x28, 0x03, 0xd0, 0x00, - 0x68, 0x01, 0x31, 0x00, 0x28, 0xfb, 0xd1, 0x23, - 0xa0, 0xfd, 0xf7, 0x2e, 0xfc, 0xed, 0x09, 0x00, - 0xed, 0x01, 0x64, 0x68, 0x28, 0x68, 0x84, 0x42, - 0x01, 0xd0, 0x00, 0x2c, 0xcd, 0xd1, 0x08, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x8c, 0x67, 0x03, 0x20, 0x0a, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, - 0x6f, 0x6f, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, - 0x3a, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x46, - 0x49, 0x46, 0x4f, 0x00, 0xbc, 0xe3, 0x01, 0x20, - 0x0a, 0x5b, 0x25, 0x38, 0x73, 0x5d, 0x20, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x3d, 0x25, 0x30, 0x38, - 0x78, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x3d, 0x25, - 0x34, 0x64, 0x20, 0x50, 0x61, 0x72, 0x74, 0x2d, - 0x53, 0x69, 0x7a, 0x65, 0x3d, 0x25, 0x34, 0x64, - 0x20, 0x25, 0x31, 0x31, 0x73, 0x20, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x3d, 0x25, 0x32, 0x75, 0x20, - 0x46, 0x72, 0x65, 0x65, 0x3d, 0x25, 0x33, 0x75, - 0x20, 0x55, 0x73, 0x65, 0x64, 0x3d, 0x25, 0x33, - 0x75, 0x00, 0x00, 0x00, 0x20, 0x52, 0x65, 0x61, - 0x6c, 0x3d, 0x25, 0x33, 0x75, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x83, 0xb0, 0x18, 0x4c, 0x19, 0xa0, - 0x27, 0x68, 0xfd, 0xf7, 0xdc, 0xfb, 0x00, 0x2f, - 0x25, 0xd0, 0x00, 0x26, 0x68, 0x46, 0x08, 0x22, - 0xf9, 0x1d, 0x09, 0x31, 0x07, 0xf0, 0x4c, 0xf9, - 0x02, 0xab, 0x1e, 0x70, 0xba, 0x69, 0xfb, 0x69, - 0x69, 0x46, 0x14, 0xa0, 0xfd, 0xf7, 0xcb, 0xfb, - 0x3c, 0x6a, 0xfd, 0x69, 0x06, 0xe0, 0xa0, 0x69, - 0xc1, 0x1d, 0x09, 0x31, 0x17, 0xa0, 0xfd, 0xf7, - 0xc2, 0xfb, 0x64, 0x68, 0x00, 0x2c, 0x03, 0xd0, - 0x28, 0x1c, 0x01, 0x3d, 0x00, 0x28, 0xf2, 0xd1, - 0x05, 0x4c, 0x7f, 0x68, 0x20, 0x68, 0x87, 0x42, - 0x01, 0xd0, 0x00, 0x2f, 0xda, 0xd1, 0x03, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0xed, 0x09, 0x00, 0xee, 0x01, 0x7c, 0x67, 0x03, - 0x20, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x3a, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0x5b, 0x25, 0x38, 0x73, 0x5d, 0x20, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x25, - 0x30, 0x33, 0x32, 0x62, 0x20, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x3a, 0x25, 0x75, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x28, 0x25, 0x38, 0x73, 0x29, 0x00, - 0x00, 0xb0, 0xb5, 0x85, 0xb0, 0x14, 0x4c, 0x15, - 0xa0, 0x27, 0x68, 0xfd, 0xf7, 0x8a, 0xfb, 0x00, - 0x2f, 0x1d, 0xd0, 0x00, 0x25, 0x08, 0x22, 0xf9, - 0x1d, 0x09, 0x31, 0x02, 0xa8, 0x07, 0xf0, 0xfa, - 0xf8, 0x04, 0xab, 0x1d, 0x70, 0x38, 0x6a, 0x00, - 0x28, 0x01, 0xd0, 0x10, 0xa2, 0x00, 0xe0, 0x12, - 0xa2, 0xf9, 0x6a, 0x01, 0x92, 0x00, 0x91, 0xba, - 0x69, 0xbb, 0x6a, 0x02, 0xa9, 0x11, 0xa0, 0xfd, - 0xf7, 0x70, 0xfb, 0x7f, 0x68, 0x20, 0x68, 0x87, - 0x42, 0x01, 0xd0, 0x00, 0x2f, 0xe2, 0xd1, 0x05, - 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x88, 0x65, 0x03, 0x20, 0x0a, 0x54, 0x69, - 0x6d, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x73, 0x74, - 0x3a, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, - 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x44, 0x49, 0x53, 0x41, - 0x42, 0x4c, 0x45, 0x00, 0x00, 0x0a, 0x5b, 0x25, - 0x38, 0x73, 0x5d, 0x20, 0x46, 0x75, 0x6e, 0x63, - 0x3d, 0x25, 0x30, 0x38, 0x78, 0x20, 0x49, 0x6e, - 0x69, 0x74, 0x3d, 0x25, 0x35, 0x75, 0x20, 0x52, - 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x3d, 0x25, - 0x35, 0x75, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, - 0x00, 0x90, 0xb5, 0x0b, 0xa0, 0xfd, 0xf7, 0x35, - 0xfb, 0x0f, 0x4c, 0x00, 0x27, 0x78, 0x00, 0xc0, - 0x19, 0x80, 0x00, 0xed, 0x09, 0x00, 0xef, 0x01, - 0x20, 0x58, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x22, - 0x00, 0x21, 0x38, 0x1c, 0x00, 0xf0, 0x53, 0xf8, - 0x01, 0x37, 0x14, 0x2f, 0xf1, 0xd3, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x0a, 0x63, - 0x6c, 0x65, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x00, 0x00, 0x30, 0x68, - 0x03, 0x20, 0xb0, 0xb5, 0x0d, 0xa0, 0xfd, 0xf7, - 0x0f, 0xfb, 0x11, 0x4d, 0x00, 0x27, 0x78, 0x00, - 0xc0, 0x19, 0x80, 0x00, 0x29, 0x58, 0x01, 0x29, - 0x09, 0xd1, 0x44, 0x19, 0xa2, 0x68, 0x0d, 0xa0, - 0x39, 0x1c, 0xfd, 0xf7, 0x01, 0xfb, 0xa0, 0x68, - 0x61, 0x68, 0x02, 0xf0, 0xf4, 0xfb, 0x01, 0x37, - 0x14, 0x2f, 0xec, 0xd3, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x72, 0x65, 0x61, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x00, - 0x00, 0x00, 0x30, 0x68, 0x03, 0x20, 0x0a, 0x62, - 0x72, 0x65, 0x61, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x20, 0x25, 0x64, 0x3a, 0x20, 0x20, 0x41, - 0x64, 0x64, 0x72, 0x3d, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x00, 0xf0, 0xb5, - 0x0c, 0x1c, 0x07, 0x1c, 0x14, 0x28, 0x07, 0xd3, - 0x39, 0x1c, 0x14, 0x22, 0x23, 0xa0, 0xfd, 0xf7, - 0xcb, 0xfa, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x7e, 0x00, 0xf6, 0x19, 0x2b, 0x48, 0xb6, 0x00, - 0x85, 0x19, 0x00, 0x2c, 0x1e, 0xd0, 0x80, 0x59, - 0x01, 0x28, 0x04, 0xd1, 0x39, 0x1c, 0x27, 0xa0, - 0xfd, 0xf7, 0xba, 0xfa, 0xed, 0xe7, 0x39, 0x1c, - 0x22, 0x1c, 0x2a, 0xa0, 0xfd, 0xf7, 0xb4, 0xfa, - 0x22, 0x49, 0x01, 0x20, 0x88, 0x51, 0xed, 0x09, - 0x00, 0xf0, 0x01, 0xac, 0x60, 0x20, 0x68, 0x68, - 0x60, 0x16, 0xf0, 0xb7, 0xfe, 0x78, 0x1c, 0x2c, - 0x4b, 0x00, 0x02, 0x18, 0x43, 0x20, 0x60, 0x16, - 0xf0, 0xac, 0xfe, 0xa8, 0x68, 0x00, 0x68, 0xd6, - 0xe7, 0x04, 0x1c, 0x80, 0x59, 0x00, 0x28, 0x04, - 0xd1, 0x39, 0x1c, 0x26, 0xa0, 0xfd, 0xf7, 0x9a, - 0xfa, 0xcd, 0xe7, 0x13, 0x2f, 0x03, 0xd0, 0x39, - 0x1c, 0x2a, 0xa0, 0xfd, 0xf7, 0x93, 0xfa, 0x16, - 0xf0, 0x9c, 0xfe, 0x29, 0x1d, 0x03, 0xc9, 0x08, - 0x60, 0x16, 0xf0, 0x93, 0xfe, 0xa8, 0x68, 0x00, - 0x68, 0x00, 0x20, 0xa0, 0x51, 0xbb, 0xe7, 0x0a, - 0x69, 0x6c, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x20, - 0x62, 0x72, 0x65, 0x61, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x20, 0x25, 0x64, 0x20, 0x28, 0x73, 0x68, - 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, - 0x3c, 0x20, 0x25, 0x64, 0x29, 0x00, 0x00, 0x30, - 0x68, 0x03, 0x20, 0x0a, 0x62, 0x72, 0x65, 0x61, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x25, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, - 0x00, 0x00, 0x00, 0x0a, 0x73, 0x65, 0x74, 0x20, - 0x62, 0x72, 0x65, 0x61, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x20, 0x25, 0x64, 0x20, 0x74, 0x6f, - 0x20, 0x61, 0x64, 0x64, 0x72, 0x20, 0x25, 0x30, - 0x38, 0x58, 0x00, 0x10, 0x00, 0x00, 0xe6, 0x0a, - 0x62, 0x72, 0x65, 0x61, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x20, 0x25, 0x64, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, - 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6c, 0x65, 0x61, - 0x72, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x25, 0x64, 0x00, - 0x00, 0x00, 0x00, 0x91, 0xb5, 0x81, 0xb0, 0x01, - 0x99, 0xed, 0x09, 0x00, 0xf1, 0x01, 0xfa, 0xa0, - 0x03, 0x22, 0x06, 0xf0, 0x8f, 0xff, 0xf9, 0x4f, - 0x00, 0x28, 0x17, 0xd1, 0x01, 0x98, 0x03, 0x30, - 0x01, 0x90, 0x38, 0x68, 0x44, 0x68, 0x01, 0xa8, - 0xfc, 0xf7, 0x1a, 0xff, 0x00, 0x90, 0x68, 0x46, - 0xfd, 0xf7, 0x1c, 0xf8, 0x39, 0x68, 0x22, 0x1c, - 0x48, 0x60, 0x03, 0x1c, 0xf1, 0xa0, 0xf0, 0xa1, - 0xfd, 0xf7, 0x17, 0xfa, 0x02, 0xb0, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x01, 0x99, 0xf2, 0xa0, - 0x03, 0x22, 0x06, 0xf0, 0x6f, 0xff, 0x00, 0x28, - 0x14, 0xd1, 0x01, 0x98, 0x03, 0x30, 0x01, 0x90, - 0x38, 0x68, 0x84, 0x68, 0x01, 0xa8, 0xfc, 0xf7, - 0xfb, 0xfe, 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, - 0xfd, 0xff, 0x39, 0x68, 0x22, 0x1c, 0x88, 0x60, - 0x03, 0x1c, 0xe2, 0xa0, 0xe7, 0xa1, 0xfd, 0xf7, - 0xf8, 0xf9, 0xdf, 0xe7, 0x01, 0x99, 0xe6, 0xa0, - 0x03, 0x22, 0x06, 0xf0, 0x53, 0xff, 0x00, 0x28, - 0x14, 0xd1, 0x01, 0x98, 0x03, 0x30, 0x01, 0x90, - 0x38, 0x68, 0xc4, 0x68, 0x01, 0xa8, 0xfc, 0xf7, - 0xdf, 0xfe, 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, - 0xe1, 0xff, 0x39, 0x68, 0x22, 0x1c, 0xc8, 0x60, - 0x03, 0x1c, 0xd4, 0xa0, 0xdb, 0xa1, 0xfd, 0xf7, - 0xdc, 0xf9, 0xc3, 0xe7, 0x01, 0x99, 0xda, 0xa0, - 0x03, 0x22, 0x06, 0xf0, 0x37, 0xff, 0x00, 0x28, - 0x14, 0xd1, 0x01, 0x98, 0x03, 0x30, 0x01, 0x90, - 0x38, 0x68, 0x04, 0x69, 0x01, 0xa8, 0xfc, 0xf7, - 0xc3, 0xfe, 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, - 0xc5, 0xff, 0x39, 0x68, 0x22, 0x1c, 0x08, 0x61, - 0x03, 0x1c, 0xc6, 0xa0, 0xcf, 0xa1, 0xfd, 0xf7, - 0xc0, 0xf9, 0xa7, 0xe7, 0x01, 0x99, 0xce, 0xa0, - 0x03, 0x22, 0x06, 0xf0, 0x1b, 0xff, 0x00, 0x28, - 0x14, 0xd1, 0x01, 0x98, 0x03, 0x30, 0x01, 0x90, - 0x38, 0x68, 0x44, 0x69, 0xed, 0x09, 0x00, 0xf2, - 0x01, 0x01, 0xa8, 0xfc, 0xf7, 0xa7, 0xfe, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0xa9, 0xff, 0x39, - 0x68, 0x22, 0x1c, 0x48, 0x61, 0x03, 0x1c, 0xb8, - 0xa0, 0xc3, 0xa1, 0xfd, 0xf7, 0xa4, 0xf9, 0x8b, - 0xe7, 0x01, 0x99, 0xc2, 0xa0, 0x03, 0x22, 0x06, - 0xf0, 0xff, 0xfe, 0x00, 0x28, 0x14, 0xd1, 0x01, - 0x98, 0x03, 0x30, 0x01, 0x90, 0x38, 0x68, 0x84, - 0x69, 0x01, 0xa8, 0xfc, 0xf7, 0x8b, 0xfe, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x8d, 0xff, 0x39, - 0x68, 0x22, 0x1c, 0x88, 0x61, 0x03, 0x1c, 0xaa, - 0xa0, 0xb7, 0xa1, 0xfd, 0xf7, 0x88, 0xf9, 0x6f, - 0xe7, 0x01, 0x99, 0xb6, 0xa0, 0x03, 0x22, 0x06, - 0xf0, 0xe3, 0xfe, 0x00, 0x28, 0x14, 0xd1, 0x01, - 0x98, 0x03, 0x30, 0x01, 0x90, 0x38, 0x68, 0xc4, - 0x69, 0x01, 0xa8, 0xfc, 0xf7, 0x6f, 0xfe, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x71, 0xff, 0x39, - 0x68, 0x22, 0x1c, 0xc8, 0x61, 0x03, 0x1c, 0x9c, - 0xa0, 0xab, 0xa1, 0xfd, 0xf7, 0x6c, 0xf9, 0x53, - 0xe7, 0x01, 0x99, 0xaa, 0xa0, 0x03, 0x22, 0x06, - 0xf0, 0xc7, 0xfe, 0x00, 0x28, 0x14, 0xd1, 0x01, - 0x98, 0x03, 0x30, 0x01, 0x90, 0x38, 0x68, 0x04, - 0x6a, 0x01, 0xa8, 0xfc, 0xf7, 0x53, 0xfe, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x55, 0xff, 0x39, - 0x68, 0x22, 0x1c, 0x08, 0x62, 0x03, 0x1c, 0x8e, - 0xa0, 0x9f, 0xa1, 0xfd, 0xf7, 0x50, 0xf9, 0x37, - 0xe7, 0x01, 0x99, 0x9e, 0xa0, 0x03, 0x22, 0x06, - 0xf0, 0xab, 0xfe, 0x00, 0x28, 0x14, 0xd1, 0x01, - 0x98, 0x03, 0x30, 0x01, 0x90, 0x38, 0x68, 0x44, - 0x6a, 0x01, 0xa8, 0xfc, 0xf7, 0x37, 0xfe, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x39, 0xff, 0x39, - 0x68, 0x22, 0x1c, 0x48, 0x62, 0x03, 0x1c, 0x80, - 0xa0, 0x93, 0xa1, 0xfd, 0xf7, 0x34, 0xf9, 0xed, - 0x09, 0x00, 0xf3, 0x01, 0x1b, 0xe7, 0x01, 0x99, - 0x92, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x8f, 0xfe, - 0x00, 0x28, 0x14, 0xd1, 0x01, 0x98, 0x03, 0x30, - 0x01, 0x90, 0x38, 0x68, 0x84, 0x6a, 0x01, 0xa8, - 0xfc, 0xf7, 0x1b, 0xfe, 0x00, 0x90, 0x68, 0x46, - 0xfc, 0xf7, 0x1d, 0xff, 0x39, 0x68, 0x22, 0x1c, - 0x88, 0x62, 0x03, 0x1c, 0x72, 0xa0, 0x87, 0xa1, - 0xfd, 0xf7, 0x18, 0xf9, 0xff, 0xe6, 0x01, 0x99, - 0x86, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x73, 0xfe, - 0x00, 0x28, 0x14, 0xd1, 0x01, 0x98, 0x03, 0x30, - 0x01, 0x90, 0x38, 0x68, 0xc4, 0x6a, 0x01, 0xa8, - 0xfc, 0xf7, 0xff, 0xfd, 0x00, 0x90, 0x68, 0x46, - 0xfc, 0xf7, 0x01, 0xff, 0x39, 0x68, 0x22, 0x1c, - 0xc8, 0x62, 0x03, 0x1c, 0x64, 0xa0, 0x7b, 0xa1, - 0xfd, 0xf7, 0xfc, 0xf8, 0xe3, 0xe6, 0x01, 0x99, - 0x7a, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x57, 0xfe, - 0x00, 0x28, 0x14, 0xd1, 0x01, 0x98, 0x03, 0x30, - 0x01, 0x90, 0x38, 0x68, 0x04, 0x6b, 0x01, 0xa8, - 0xfc, 0xf7, 0xe3, 0xfd, 0x00, 0x90, 0x68, 0x46, - 0xfc, 0xf7, 0xe5, 0xfe, 0x39, 0x68, 0x22, 0x1c, - 0x08, 0x63, 0x03, 0x1c, 0x56, 0xa0, 0x6f, 0xa1, - 0xfd, 0xf7, 0xe0, 0xf8, 0xc7, 0xe6, 0x01, 0x99, - 0x6e, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x3b, 0xfe, - 0x00, 0x28, 0x14, 0xd1, 0x01, 0x98, 0x03, 0x30, - 0x01, 0x90, 0x38, 0x68, 0x44, 0x6b, 0x01, 0xa8, - 0xfc, 0xf7, 0xc7, 0xfd, 0x00, 0x90, 0x68, 0x46, - 0xfc, 0xf7, 0xc9, 0xfe, 0x39, 0x68, 0x22, 0x1c, - 0x48, 0x63, 0x03, 0x1c, 0x48, 0xa0, 0x63, 0xa1, - 0xfd, 0xf7, 0xc4, 0xf8, 0xab, 0xe6, 0x01, 0x99, - 0x62, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x1f, 0xfe, - 0x00, 0x28, 0x15, 0xd1, 0x01, 0x98, 0x03, 0x30, - 0x01, 0x90, 0x38, 0x68, 0x84, 0x6b, 0x01, 0xa8, - 0xfc, 0xf7, 0xed, 0x09, 0x00, 0xf4, 0x01, 0xab, - 0xfd, 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, 0xad, - 0xfe, 0x83, 0x08, 0x9b, 0x00, 0x38, 0x68, 0x22, - 0x1c, 0x83, 0x63, 0x39, 0xa0, 0x57, 0xa1, 0xfd, - 0xf7, 0xa7, 0xf8, 0x8e, 0xe6, 0x01, 0x99, 0x55, - 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x02, 0xfe, 0x00, - 0x28, 0x15, 0xd1, 0x01, 0x98, 0x03, 0x30, 0x01, - 0x90, 0x38, 0x68, 0xc4, 0x6b, 0x01, 0xa8, 0xfc, - 0xf7, 0x8e, 0xfd, 0x00, 0x90, 0x68, 0x46, 0xfc, - 0xf7, 0x90, 0xfe, 0x83, 0x08, 0x9b, 0x00, 0x38, - 0x68, 0x22, 0x1c, 0xc3, 0x63, 0x2b, 0xa0, 0x4a, - 0xa1, 0xfd, 0xf7, 0x8a, 0xf8, 0x71, 0xe6, 0x01, - 0x99, 0x49, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0xe5, - 0xfd, 0x00, 0x28, 0x15, 0xd1, 0x01, 0x98, 0x03, - 0x30, 0x01, 0x90, 0x38, 0x68, 0x04, 0x6c, 0x01, - 0xa8, 0xfc, 0xf7, 0x71, 0xfd, 0x00, 0x90, 0x68, - 0x46, 0xfc, 0xf7, 0x73, 0xfe, 0x83, 0x08, 0x9b, - 0x00, 0x38, 0x68, 0x22, 0x1c, 0x03, 0x64, 0x1c, - 0xa0, 0x3e, 0xa1, 0xfd, 0xf7, 0x6d, 0xf8, 0x54, - 0xe6, 0x01, 0x99, 0x3c, 0xa0, 0x03, 0x22, 0x06, - 0xf0, 0xc8, 0xfd, 0x3b, 0x4f, 0x00, 0x28, 0x12, - 0xd1, 0x01, 0x98, 0x03, 0x30, 0x01, 0x90, 0x3c, - 0x68, 0x01, 0xa8, 0xfc, 0xf7, 0x54, 0xfd, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x56, 0xfe, 0x22, - 0x1c, 0x03, 0x1c, 0x38, 0x60, 0x0f, 0xa0, 0x33, - 0xa1, 0xfd, 0xf7, 0x52, 0xf8, 0x39, 0xe6, 0x01, - 0x99, 0x32, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0xad, - 0xfd, 0x00, 0x28, 0x69, 0xd1, 0x01, 0x98, 0x03, - 0x30, 0x01, 0x90, 0x7c, 0x68, 0x01, 0xa8, 0xfc, - 0xf7, 0x3a, 0xfd, 0x00, 0x90, 0x68, 0x46, 0xfc, - 0xf7, 0x3c, 0xfe, 0x54, 0xe0, 0x00, 0x00, 0x61, - 0x31, 0x3d, 0x00, 0x24, 0x69, 0x03, 0x20, 0x41, - 0x31, 0x00, 0x00, 0x0a, 0x25, 0xed, 0x09, 0x00, - 0xf5, 0x01, 0x73, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x2d, 0x3e, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x00, 0x00, 0x00, 0x00, 0x61, 0x32, 0x3d, 0x00, - 0x41, 0x32, 0x00, 0x00, 0x61, 0x33, 0x3d, 0x00, - 0x41, 0x33, 0x00, 0x00, 0x61, 0x34, 0x3d, 0x00, - 0x41, 0x34, 0x00, 0x00, 0x76, 0x31, 0x3d, 0x00, - 0x56, 0x31, 0x00, 0x00, 0x76, 0x32, 0x3d, 0x00, - 0x56, 0x32, 0x00, 0x00, 0x76, 0x33, 0x3d, 0x00, - 0x56, 0x33, 0x00, 0x00, 0x76, 0x34, 0x3d, 0x00, - 0x56, 0x34, 0x00, 0x00, 0x76, 0x35, 0x3d, 0x00, - 0x56, 0x35, 0x00, 0x00, 0x76, 0x36, 0x3d, 0x00, - 0x56, 0x36, 0x00, 0x00, 0x76, 0x37, 0x3d, 0x00, - 0x56, 0x37, 0x00, 0x00, 0x76, 0x38, 0x3d, 0x00, - 0x56, 0x38, 0x00, 0x00, 0x69, 0x70, 0x3d, 0x00, - 0x49, 0x50, 0x00, 0x00, 0x73, 0x70, 0x3d, 0x00, - 0x53, 0x50, 0x00, 0x00, 0x6c, 0x72, 0x3d, 0x00, - 0x4c, 0x52, 0x00, 0x00, 0x70, 0x63, 0x3d, 0x00, - 0x50, 0x43, 0x00, 0x00, 0x74, 0x31, 0x3d, 0x00, - 0xa0, 0xbd, 0x03, 0x20, 0x54, 0x31, 0x00, 0x00, - 0x74, 0x32, 0x3d, 0x00, 0x78, 0x60, 0x03, 0x1c, - 0x01, 0xa0, 0x22, 0x1c, 0xa8, 0x38, 0xbb, 0xa1, - 0xfc, 0xf7, 0xe1, 0xff, 0xc8, 0xe5, 0xff, 0xe7, - 0x01, 0x99, 0xb9, 0xa0, 0x03, 0x22, 0x06, 0xf0, - 0x3b, 0xfd, 0x00, 0x28, 0x13, 0xd1, 0x01, 0x98, - 0x03, 0x30, 0x01, 0x90, 0xbc, 0x68, 0x01, 0xa8, - 0xfc, 0xf7, 0xc8, 0xfc, 0x00, 0x90, 0x68, 0x46, - 0xfc, 0xf7, 0xca, 0xfd, 0xb8, 0x60, 0x03, 0x1c, - 0x01, 0xa0, 0x22, 0x1c, 0xe0, 0x38, 0xaf, 0xa1, - 0xfc, 0xf7, 0xc5, 0xff, 0xac, 0xe5, 0x01, 0x99, - 0xad, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x20, 0xfd, - 0x00, 0x28, 0x12, 0xd1, 0x01, 0x98, 0x03, 0x30, - 0x01, 0x90, 0xfc, 0x68, 0x01, 0xa8, 0xfc, 0xf7, - 0xed, 0x09, 0x00, 0xf6, 0x01, 0xad, 0xfc, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0xaf, 0xfd, 0x22, - 0x1c, 0x03, 0x1c, 0xf8, 0x60, 0xa5, 0x48, 0xa4, - 0xa1, 0xfc, 0xf7, 0xab, 0xff, 0x92, 0xe5, 0x01, - 0x99, 0xa3, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x06, - 0xfd, 0x00, 0x28, 0x12, 0xd1, 0x01, 0x98, 0x03, - 0x30, 0x01, 0x90, 0x3c, 0x69, 0x01, 0xa8, 0xfc, - 0xf7, 0x93, 0xfc, 0x00, 0x90, 0x68, 0x46, 0xfc, - 0xf7, 0x95, 0xfd, 0x22, 0x1c, 0x03, 0x1c, 0x38, - 0x61, 0x98, 0x48, 0x9a, 0xa1, 0xfc, 0xf7, 0x91, - 0xff, 0x78, 0xe5, 0x01, 0x99, 0x98, 0xa0, 0x03, - 0x22, 0x06, 0xf0, 0xec, 0xfc, 0x00, 0x28, 0x12, - 0xd1, 0x01, 0x98, 0x03, 0x30, 0x01, 0x90, 0x7c, - 0x69, 0x01, 0xa8, 0xfc, 0xf7, 0x79, 0xfc, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x7b, 0xfd, 0x22, - 0x1c, 0x03, 0x1c, 0x78, 0x61, 0x8b, 0x48, 0x8f, - 0xa1, 0xfc, 0xf7, 0x77, 0xff, 0x5e, 0xe5, 0x01, - 0x99, 0x8d, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0xd2, - 0xfc, 0x00, 0x28, 0x12, 0xd1, 0x01, 0x98, 0x03, - 0x30, 0x01, 0x90, 0xbc, 0x69, 0x01, 0xa8, 0xfc, - 0xf7, 0x5f, 0xfc, 0x00, 0x90, 0x68, 0x46, 0xfc, - 0xf7, 0x61, 0xfd, 0x22, 0x1c, 0x03, 0x1c, 0xb8, - 0x61, 0x7e, 0x48, 0x84, 0xa1, 0xfc, 0xf7, 0x5d, - 0xff, 0x44, 0xe5, 0x01, 0x99, 0x82, 0xa0, 0x03, - 0x22, 0x06, 0xf0, 0xb8, 0xfc, 0x00, 0x28, 0x12, - 0xd1, 0x01, 0x98, 0x03, 0x30, 0x01, 0x90, 0xfc, - 0x69, 0x01, 0xa8, 0xfc, 0xf7, 0x45, 0xfc, 0x00, - 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x47, 0xfd, 0x22, - 0x1c, 0x03, 0x1c, 0xf8, 0x61, 0x71, 0x48, 0x79, - 0xa1, 0xfc, 0xf7, 0x43, 0xff, 0x2a, 0xe5, 0x01, - 0x99, 0x77, 0xa0, 0x03, 0x22, 0x06, 0xf0, 0x9e, - 0xfc, 0x00, 0x28, 0x12, 0xd1, 0x01, 0x98, 0x03, - 0x30, 0x01, 0x90, 0xed, 0x09, 0x00, 0xf7, 0x01, - 0x3c, 0x6a, 0x01, 0xa8, 0xfc, 0xf7, 0x2b, 0xfc, - 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x2d, 0xfd, - 0x22, 0x1c, 0x03, 0x1c, 0x38, 0x62, 0x64, 0x48, - 0x6e, 0xa1, 0xfc, 0xf7, 0x29, 0xff, 0x10, 0xe5, - 0x01, 0x99, 0x6c, 0xa0, 0x04, 0x22, 0x06, 0xf0, - 0x84, 0xfc, 0x00, 0x28, 0x12, 0xd1, 0x01, 0x98, - 0x04, 0x30, 0x01, 0x90, 0x7c, 0x6a, 0x01, 0xa8, - 0xfc, 0xf7, 0x11, 0xfc, 0x00, 0x90, 0x68, 0x46, - 0xfc, 0xf7, 0x13, 0xfd, 0x22, 0x1c, 0x03, 0x1c, - 0x78, 0x62, 0x57, 0x48, 0x64, 0xa1, 0xfc, 0xf7, - 0x0f, 0xff, 0xf6, 0xe4, 0x01, 0x99, 0x62, 0xa0, - 0x04, 0x22, 0x06, 0xf0, 0x6a, 0xfc, 0x00, 0x28, - 0x12, 0xd1, 0x01, 0x98, 0x04, 0x30, 0x01, 0x90, - 0xbc, 0x6a, 0x01, 0xa8, 0xfc, 0xf7, 0xf7, 0xfb, - 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, 0xf9, 0xfc, - 0x22, 0x1c, 0x03, 0x1c, 0xb8, 0x62, 0x4a, 0x48, - 0x5a, 0xa1, 0xfc, 0xf7, 0xf5, 0xfe, 0xdc, 0xe4, - 0x01, 0x99, 0x58, 0xa0, 0x04, 0x22, 0x06, 0xf0, - 0x50, 0xfc, 0x00, 0x28, 0x12, 0xd1, 0x01, 0x98, - 0x04, 0x30, 0x01, 0x90, 0xfc, 0x6a, 0x01, 0xa8, - 0xfc, 0xf7, 0xdd, 0xfb, 0x00, 0x90, 0x68, 0x46, - 0xfc, 0xf7, 0xdf, 0xfc, 0x22, 0x1c, 0x03, 0x1c, - 0xf8, 0x62, 0x3d, 0x48, 0x50, 0xa1, 0xfc, 0xf7, - 0xdb, 0xfe, 0xc2, 0xe4, 0x01, 0x99, 0x4e, 0xa0, - 0x04, 0x22, 0x06, 0xf0, 0x36, 0xfc, 0x00, 0x28, - 0x12, 0xd1, 0x01, 0x98, 0x04, 0x30, 0x01, 0x90, - 0x3c, 0x6b, 0x01, 0xa8, 0xfc, 0xf7, 0xc3, 0xfb, - 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, 0xc5, 0xfc, - 0x22, 0x1c, 0x03, 0x1c, 0x38, 0x63, 0x30, 0x48, - 0x46, 0xa1, 0xfc, 0xf7, 0xc1, 0xfe, 0xa8, 0xe4, - 0x01, 0x99, 0x44, 0xa0, 0x04, 0x22, 0x06, 0xf0, - 0x1c, 0xfc, 0x00, 0x28, 0x12, 0xd1, 0xed, 0x09, - 0x00, 0xf8, 0x01, 0x01, 0x98, 0x04, 0x30, 0x01, - 0x90, 0x7c, 0x6b, 0x01, 0xa8, 0xfc, 0xf7, 0xa9, - 0xfb, 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, 0xab, - 0xfc, 0x22, 0x1c, 0x03, 0x1c, 0x78, 0x63, 0x23, - 0x48, 0x3c, 0xa1, 0xfc, 0xf7, 0xa7, 0xfe, 0x8e, - 0xe4, 0x01, 0x99, 0x3a, 0xa0, 0x04, 0x22, 0x06, - 0xf0, 0x02, 0xfc, 0x00, 0x28, 0x12, 0xd1, 0x01, - 0x98, 0x04, 0x30, 0x01, 0x90, 0xbc, 0x6b, 0x01, - 0xa8, 0xfc, 0xf7, 0x8f, 0xfb, 0x00, 0x90, 0x68, - 0x46, 0xfc, 0xf7, 0x91, 0xfc, 0x22, 0x1c, 0x03, - 0x1c, 0xb8, 0x63, 0x16, 0x48, 0x32, 0xa1, 0xfc, - 0xf7, 0x8d, 0xfe, 0x74, 0xe4, 0x01, 0x99, 0x30, - 0xa0, 0x04, 0x22, 0x06, 0xf0, 0xe8, 0xfb, 0x00, - 0x28, 0x12, 0xd1, 0x01, 0x98, 0x04, 0x30, 0x01, - 0x90, 0xfc, 0x6b, 0x01, 0xa8, 0xfc, 0xf7, 0x75, - 0xfb, 0x00, 0x90, 0x68, 0x46, 0xfc, 0xf7, 0x77, - 0xfc, 0x22, 0x1c, 0x03, 0x1c, 0xf8, 0x63, 0x09, - 0x48, 0x28, 0xa1, 0xfc, 0xf7, 0x73, 0xfe, 0x5a, - 0xe4, 0x01, 0x99, 0x26, 0xa0, 0xfc, 0xf7, 0x6e, - 0xfe, 0x55, 0xe4, 0x54, 0x32, 0x00, 0x00, 0x74, - 0x33, 0x3d, 0x00, 0x54, 0x33, 0x00, 0x00, 0x74, - 0x34, 0x3d, 0x00, 0x54, 0x34, 0x00, 0x00, 0xfc, - 0xf0, 0x01, 0x20, 0x74, 0x35, 0x3d, 0x00, 0x54, - 0x35, 0x00, 0x00, 0x74, 0x36, 0x3d, 0x00, 0x54, - 0x36, 0x00, 0x00, 0x74, 0x37, 0x3d, 0x00, 0x54, - 0x37, 0x00, 0x00, 0x74, 0x38, 0x3d, 0x00, 0x54, - 0x38, 0x00, 0x00, 0x74, 0x39, 0x3d, 0x00, 0x54, - 0x39, 0x00, 0x00, 0x74, 0x31, 0x30, 0x3d, 0x00, - 0x00, 0x00, 0x00, 0x54, 0x31, 0x30, 0x00, 0x74, - 0x31, 0x31, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x54, - 0x31, 0x31, 0x00, 0x74, 0x31, 0x32, 0x3d, 0x00, - 0x00, 0x00, 0x00, 0x54, 0x31, 0x32, 0x00, 0x74, - 0x31, 0xed, 0x09, 0x00, 0xf9, 0x01, 0x33, 0x3d, - 0x00, 0x00, 0x00, 0x00, 0x54, 0x31, 0x33, 0x00, - 0x74, 0x31, 0x34, 0x3d, 0x00, 0x00, 0x00, 0x00, - 0x54, 0x31, 0x34, 0x00, 0x74, 0x31, 0x35, 0x3d, - 0x00, 0x00, 0x00, 0x00, 0x54, 0x31, 0x35, 0x00, - 0x74, 0x31, 0x36, 0x3d, 0x00, 0x00, 0x00, 0x00, - 0x54, 0x31, 0x36, 0x00, 0x0a, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x25, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x90, 0xb5, 0x86, 0xb0, - 0x36, 0xa0, 0xfc, 0xf7, 0x0a, 0xfe, 0x3b, 0x4f, - 0x38, 0x68, 0x00, 0x28, 0x06, 0xd1, 0x3a, 0xa0, - 0xfc, 0xf7, 0x03, 0xfe, 0x06, 0xb0, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x01, 0x68, 0x3d, 0x4c, - 0xa1, 0x42, 0x03, 0xd1, 0x3c, 0xa0, 0xfc, 0xf7, - 0xf8, 0xfd, 0x06, 0xe0, 0x02, 0x69, 0x03, 0x1d, - 0x00, 0x92, 0x0e, 0xcb, 0x3e, 0xa0, 0xfc, 0xf7, - 0xf0, 0xfd, 0x38, 0x68, 0x02, 0x6a, 0x14, 0x30, - 0x00, 0x92, 0x0e, 0xc8, 0x44, 0xa0, 0xfc, 0xf7, - 0xe8, 0xfd, 0x38, 0x68, 0x02, 0x6b, 0x24, 0x30, - 0x00, 0x92, 0x0e, 0xc8, 0x4a, 0xa0, 0xfc, 0xf7, - 0xe0, 0xfd, 0x38, 0x68, 0x02, 0x6c, 0x00, 0x92, - 0x41, 0x6b, 0x83, 0x6b, 0xc2, 0x6b, 0x50, 0xa0, - 0xfc, 0xf7, 0xd7, 0xfd, 0x38, 0x68, 0x07, 0x68, - 0xa7, 0x42, 0x03, 0xd1, 0x56, 0xa0, 0xfc, 0xf7, - 0xd0, 0xfd, 0xcb, 0xe7, 0xfa, 0x06, 0xd2, 0x0e, - 0xb8, 0x09, 0x01, 0xd3, 0x58, 0xa1, 0x00, 0xe0, - 0x21, 0xa1, 0xf8, 0x09, 0x01, 0xd3, 0x57, 0xa0, - 0x00, 0xe0, 0x1f, 0xa0, 0x03, 0x90, 0x38, 0x0a, - 0x05, 0x92, 0x04, 0x91, 0x01, 0xd3, 0x54, 0xa2, - 0x00, 0xe0, 0x1b, 0xa2, 0xed, 0x09, 0x00, 0xfa, - 0x01, 0x78, 0x0f, 0x01, 0xd3, 0x52, 0xa1, 0x00, - 0xe0, 0x18, 0xa1, 0xb8, 0x0f, 0x01, 0xd3, 0x51, - 0xa0, 0x00, 0xe0, 0x16, 0xa0, 0x00, 0x90, 0xf8, - 0x0f, 0x02, 0x92, 0x01, 0x91, 0x01, 0xd3, 0x4e, - 0xa3, 0x00, 0xe0, 0x12, 0xa3, 0x38, 0x08, 0x01, - 0xd3, 0x4c, 0xa2, 0x00, 0xe0, 0x0f, 0xa2, 0x39, - 0x1c, 0x4b, 0xa0, 0xfc, 0xf7, 0xa0, 0xfd, 0x9b, - 0xe7, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x20, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x00, 0x00, - 0x00, 0x24, 0x69, 0x03, 0x20, 0x0a, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, - 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x00, 0x0a, 0x41, 0x31, - 0x2d, 0x41, 0x34, 0x3a, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x41, 0x31, - 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, 0x20, - 0x41, 0x32, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x41, 0x33, 0x3a, 0x20, 0x25, 0x30, 0x38, - 0x58, 0x20, 0x41, 0x34, 0x3a, 0x20, 0x25, 0x30, - 0x38, 0x58, 0x00, 0x00, 0x00, 0x0a, 0x56, 0x31, - 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, 0x20, - 0x56, 0x32, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x56, 0x33, 0x3a, 0x20, 0x25, 0x30, 0x38, - 0x58, 0x20, 0x56, 0x34, 0x3a, 0x20, 0x25, 0x30, - 0x38, 0x58, 0x00, 0x00, 0x00, 0x0a, 0x56, 0x35, - 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, 0x56, - 0x36, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, - 0x56, 0x37, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x56, 0x38, 0x3a, 0x20, 0x25, 0x30, 0xed, - 0x09, 0x00, 0xfb, 0x01, 0x38, 0x58, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x49, 0x50, 0x3a, 0x20, 0x25, - 0x30, 0x38, 0x58, 0x20, 0x20, 0x4c, 0x52, 0x3a, - 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, 0x53, 0x50, - 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, 0x50, - 0x43, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, 0x00, - 0x00, 0x00, 0x20, 0x43, 0x50, 0x53, 0x52, 0x3a, - 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x00, 0x00, - 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x46, 0x00, - 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x56, 0x00, - 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x20, 0x43, - 0x50, 0x53, 0x52, 0x3a, 0x20, 0x25, 0x30, 0x38, - 0x58, 0x20, 0x28, 0x25, 0x73, 0x25, 0x73, 0x25, - 0x73, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x25, - 0x73, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x78, 0x29, - 0x00, 0x00, 0xb8, 0xb5, 0x00, 0x28, 0x01, 0xd0, - 0xfe, 0xf7, 0x79, 0xfa, 0x68, 0x46, 0xfe, 0xf7, - 0xaa, 0xfa, 0x0e, 0x4d, 0x04, 0x1c, 0x28, 0x68, - 0x00, 0x99, 0x04, 0x38, 0x43, 0x1a, 0x0c, 0xa0, - 0x22, 0x1c, 0xfc, 0xf7, 0xe7, 0xfc, 0x00, 0x27, - 0x28, 0x68, 0xba, 0x00, 0x11, 0x18, 0xa1, 0x42, - 0x09, 0xd8, 0x82, 0x58, 0x12, 0xa0, 0xfc, 0xf7, - 0xdd, 0xfc, 0x14, 0xa0, 0xfc, 0xf7, 0xda, 0xfc, - 0x01, 0x37, 0x10, 0x2f, 0xf0, 0xd3, 0xb8, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x20, 0x69, - 0x03, 0x20, 0x0a, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x3a, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, 0x45, - 0x6e, 0x64, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x2c, 0x20, 0x46, 0x72, 0x65, 0x65, 0x3a, 0x20, - 0x25, 0x64, 0xed, 0x09, 0x00, 0xfc, 0x01, 0x29, - 0x0a, 0x00, 0x00, 0x25, 0x30, 0x38, 0x58, 0x3a, - 0x20, 0x20, 0x20, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0xb5, 0xfd, 0xf7, 0xd5, 0xfe, 0x01, 0x1c, 0x25, - 0xa0, 0x1f, 0xa3, 0x21, 0xa2, 0xfc, 0xf7, 0xa8, - 0xfc, 0x2e, 0xa0, 0xfc, 0xf7, 0xa5, 0xfc, 0x32, - 0xa0, 0xfc, 0xf7, 0xa2, 0xfc, 0x3d, 0xa0, 0xfc, - 0xf7, 0x9f, 0xfc, 0x4c, 0xa0, 0xfc, 0xf7, 0x9c, - 0xfc, 0x58, 0xa0, 0xfc, 0xf7, 0x99, 0xfc, 0x62, - 0xa0, 0xfc, 0xf7, 0x96, 0xfc, 0x72, 0xa0, 0xfc, - 0xf7, 0x93, 0xfc, 0x7c, 0xa0, 0xfc, 0xf7, 0x90, - 0xfc, 0x88, 0xa0, 0xfc, 0xf7, 0x8d, 0xfc, 0x94, - 0xa0, 0xfc, 0xf7, 0x8a, 0xfc, 0xa1, 0xa0, 0xfc, - 0xf7, 0x87, 0xfc, 0xae, 0xa0, 0xfc, 0xf7, 0x84, - 0xfc, 0xba, 0xa0, 0xfc, 0xf7, 0x81, 0xfc, 0xc6, - 0xa0, 0xfc, 0xf7, 0x7e, 0xfc, 0xcb, 0xa0, 0xfc, - 0xf7, 0x7b, 0xfc, 0xd6, 0xa0, 0xfc, 0xf7, 0x78, - 0xfc, 0xe2, 0xa0, 0xfc, 0xf7, 0x75, 0xfc, 0xeb, - 0xa0, 0xfc, 0xf7, 0x72, 0xfc, 0xf3, 0xa0, 0xfc, - 0xf7, 0x6f, 0xfc, 0xf6, 0xe1, 0x00, 0x00, 0x41, - 0x70, 0x72, 0x20, 0x32, 0x33, 0x20, 0x32, 0x30, - 0x30, 0x33, 0x00, 0x31, 0x36, 0x3a, 0x30, 0x35, - 0x3a, 0x31, 0x34, 0x00, 0x00, 0x00, 0x00, 0x0a, - 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x20, 0x25, 0x73, - 0x20, 0x28, 0x25, 0x73, 0x20, 0x25, 0x73, 0x29, - 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x00, - 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x20, 0x28, 0x6e, 0x75, 0x63, - 0x6c, 0x65, 0x75, 0x73, 0x29, 0x3a, 0x0a, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x20, 0xed, 0x09, 0x00, - 0xfd, 0x01, 0x20, 0x74, 0x61, 0x5b, 0x61, 0x73, - 0x6b, 0x73, 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x0a, 0x00, - 0x20, 0x20, 0x20, 0x74, 0x41, 0x5b, 0x61, 0x73, - 0x6b, 0x73, 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x28, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x29, - 0x0a, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x74, - 0x61, 0x5b, 0x61, 0x73, 0x6b, 0x73, 0x5d, 0x20, - 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x20, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, - 0x74, 0x61, 0x73, 0x6b, 0x0a, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x68, 0x69, 0x5b, 0x69, 0x73, - 0x72, 0x73, 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x48, 0x49, 0x53, 0x52, 0x73, 0x0a, 0x00, - 0x20, 0x20, 0x20, 0x68, 0x49, 0x5b, 0x69, 0x73, - 0x72, 0x73, 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, - 0xed, 0x09, 0x00, 0xfe, 0x01, 0x20, 0x48, 0x49, - 0x53, 0x52, 0x73, 0x20, 0x28, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, - 0x69, 0x6e, 0x66, 0x6f, 0x29, 0x0a, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x70, 0x69, 0x5b, 0x70, - 0x65, 0x73, 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x70, 0x69, 0x70, 0x65, 0x73, 0x0a, - 0x00, 0x20, 0x20, 0x20, 0x71, 0x75, 0x5b, 0x65, - 0x75, 0x65, 0x73, 0x5d, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x71, 0x75, 0x65, 0x75, 0x65, 0x73, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, - 0x73, 0x65, 0x5b, 0x6d, 0x61, 0x70, 0x68, 0x6f, - 0x72, 0x65, 0x73, 0x5d, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, - 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x65, - 0x6d, 0x61, 0x70, 0x68, 0x6f, 0x72, 0x65, 0x73, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, - 0x6d, 0x65, 0x5b, 0x6d, 0x6f, 0x72, 0x79, 0x20, - 0x70, 0x6f, 0x6f, 0x6c, 0x5d, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, - 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x0a, 0x00, 0x00, 0x20, 0x20, 0x20, - 0x70, 0x61, 0x5b, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x5d, 0xed, 0x09, 0x00, 0xff, 0x01, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x00, 0x20, 0x20, - 0x20, 0x74, 0x69, 0x5b, 0x6d, 0x65, 0x72, 0x73, - 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, - 0x69, 0x6d, 0x65, 0x72, 0x73, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x20, 0x20, 0x63, 0x75, 0x5b, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, - 0x61, 0x73, 0x6b, 0x2f, 0x48, 0x49, 0x53, 0x52, - 0x0a, 0x00, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x20, 0x28, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x29, 0x3a, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x20, 0x20, 0x72, 0x65, 0x67, - 0x5b, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x5d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x0a, 0x00, 0x20, 0x20, - 0x20, 0x73, 0x74, 0x5b, 0x61, 0x63, 0x6b, 0x5d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xed, 0x09, - 0x00, 0x00, 0x02, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x0a, 0x00, 0x20, - 0x20, 0x20, 0x72, 0x65, 0x73, 0x5b, 0x65, 0x74, - 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, - 0x65, 0x73, 0x65, 0x74, 0x20, 0x63, 0x61, 0x72, - 0x64, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x67, 0x6f, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x67, 0x6f, 0x0a, 0x00, 0x20, - 0x20, 0x20, 0x68, 0x61, 0x5b, 0x6c, 0x74, 0x5d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, - 0x61, 0x6c, 0x74, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0xa0, 0x15, 0xe0, 0x20, 0x20, 0x20, 0x64, 0x62, - 0x20, 0x5b, 0x61, 0x64, 0x64, 0x72, 0x5d, 0x20, - 0x5b, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x20, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x0a, 0x00, 0xfc, - 0xf7, 0x5d, 0xfa, 0x1b, 0xa0, 0xfc, 0xf7, 0x5a, - 0xfa, 0x26, 0xa0, 0xfc, 0xf7, 0x57, 0xfa, 0x2f, - 0xa0, 0xfc, 0xf7, 0x54, 0xfa, 0x3a, 0xa0, 0xfc, - 0xf7, 0x51, 0xfa, 0x44, 0xa0, 0xfc, 0xf7, 0x4e, - 0xfa, 0x4f, 0xa0, 0xfc, 0xf7, 0x4b, 0xfa, 0x5a, - 0xa0, 0xfc, 0xf7, 0x48, 0xfa, 0x67, 0xa0, 0xfc, - 0xf7, 0x45, 0xfa, 0x72, 0xa0, 0xfc, 0xf7, 0x42, - 0xfa, 0xed, 0x09, 0x00, 0x01, 0x02, 0x80, 0xa0, - 0xfc, 0xf7, 0x3f, 0xfa, 0x8c, 0xa0, 0xfc, 0xf7, - 0x3c, 0xfa, 0x99, 0xa0, 0xfc, 0xf7, 0x39, 0xfa, - 0xa7, 0xa0, 0xfc, 0xf7, 0x36, 0xfa, 0xb4, 0xa0, - 0xfc, 0xf7, 0x33, 0xfa, 0xc1, 0xa0, 0xfc, 0xf7, - 0x30, 0xfa, 0xcf, 0xa0, 0xfc, 0xf7, 0x2d, 0xfa, - 0xdf, 0xa0, 0xfc, 0xf7, 0x2a, 0xfa, 0xf5, 0xa0, - 0xfc, 0xf7, 0x27, 0xfa, 0x02, 0xe2, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x64, 0x77, 0x20, 0x5b, 0x61, - 0x64, 0x64, 0x72, 0x5d, 0x20, 0x5b, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x5d, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x75, 0x6d, 0x70, 0x20, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x64, 0x64, 0x20, 0x5b, 0x61, - 0x64, 0x64, 0x72, 0x5d, 0x20, 0x5b, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x5d, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x64, 0x75, 0x6d, 0x70, 0x20, 0x77, 0x6f, 0x72, - 0x64, 0x73, 0x0a, 0x00, 0x20, 0x20, 0x20, 0x63, - 0x62, 0x20, 0x5b, 0x61, 0x64, 0x64, 0x72, 0x5d, - 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x0a, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x63, - 0x77, 0x20, 0x5b, 0x61, 0x64, 0x64, 0x72, 0x5d, - 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x73, 0x0a, 0x00, 0x00, 0x20, 0x20, 0x20, 0x63, - 0x64, 0x20, 0x5b, 0x61, 0xed, 0x09, 0x00, 0x02, - 0x02, 0x64, 0x64, 0x72, 0x5d, 0x20, 0x5b, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x5d, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, - 0x77, 0x6f, 0x72, 0x64, 0x73, 0x0a, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x66, 0x62, 0x20, 0x5b, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5d, 0x20, 0x5b, - 0x2d, 0x7c, 0x66, 0x72, 0x6f, 0x6d, 0x5d, 0x20, - 0x5b, 0x74, 0x6f, 0x5d, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x62, 0x79, - 0x74, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, - 0x74, 0x6f, 0x20, 0x0a, 0x00, 0x20, 0x20, 0x20, - 0x66, 0x77, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x5d, 0x20, 0x5b, 0x2d, 0x7c, 0x66, 0x72, - 0x6f, 0x6d, 0x5d, 0x20, 0x5b, 0x74, 0x6f, 0x5d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6e, - 0x64, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x6f, 0x20, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, - 0x66, 0x64, 0x20, 0x5b, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x5d, 0x20, 0x5b, 0x2d, 0x7c, 0x66, 0x72, - 0x6f, 0x6d, 0x5d, 0x20, 0x5b, 0x74, 0x6f, 0x5d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6e, - 0x64, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x66, - 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x0a, - 0x00, 0x20, 0x20, 0x20, 0x62, 0x72, 0x20, 0x3c, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x20, - 0x3c, 0x30, 0x7c, 0x41, 0x64, 0x64, 0x72, 0x3e, - 0x20, 0x28, 0x30, 0x3d, 0x63, 0x6c, 0x65, 0x61, - 0x72, 0x29, 0x20, 0x73, 0x65, 0x74, 0x2f, 0x72, - 0x65, 0x73, 0x65, 0x74, 0x20, 0x62, 0x72, 0x65, - 0x61, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0xed, - 0x09, 0x00, 0x03, 0x02, 0x73, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x5b, - 0x69, 0x73, 0x74, 0x5d, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x0a, 0x00, - 0x00, 0x00, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x5b, - 0x65, 0x61, 0x72, 0x5d, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x72, 0x65, 0x61, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x0a, - 0x00, 0x00, 0x20, 0x20, 0x20, 0x74, 0x72, 0x5b, - 0x61, 0x63, 0x65, 0x5d, 0x20, 0x5b, 0x61, 0x64, - 0x64, 0x72, 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x20, - 0x6f, 0x6e, 0x65, 0x2f, 0x74, 0x6f, 0x20, 0x61, - 0x64, 0x64, 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, - 0x00, 0x00, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x5b, - 0x61, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, - 0x5d, 0x20, 0x3c, 0x61, 0x64, 0x64, 0x72, 0x3e, - 0x20, 0x3c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3e, - 0x20, 0x20, 0x75, 0x6e, 0x61, 0x73, 0x73, 0x65, - 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x0a, 0x00, 0x20, 0x20, 0x20, 0x61, 0x64, 0x5b, - 0x64, 0x5d, 0x20, 0x61, 0x64, 0x64, 0x72, 0x20, - 0x6c, 0x65, 0xed, 0x09, 0x00, 0x04, 0x02, 0x6e, - 0x67, 0x74, 0x68, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, - 0x64, 0x64, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x28, - 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x29, - 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x0a, - 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x64, 0x65, - 0x5b, 0x6c, 0x65, 0x74, 0x65, 0x5d, 0x20, 0x61, - 0x64, 0x64, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x20, 0x28, 0x64, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x29, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x20, 0x20, 0x73, 0x79, 0x5b, 0x6d, 0x62, 0x6f, - 0x6c, 0x5d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, - 0x69, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x73, 0x20, 0x28, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x29, 0x20, 0x28, 0x6c, 0x61, 0x74, 0x65, - 0x72, 0x29, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x20, 0x20, 0x65, 0x76, 0x5b, 0x61, 0x6c, 0x5d, - 0x3c, 0x68, 0x7c, 0x64, 0x7c, 0x62, 0x7c, 0x6f, - 0x3e, 0x20, 0x3c, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x3e, 0x20, 0x65, - 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, - 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x20, 0x69, 0x6e, 0x3a, 0x20, - 0x6f, 0x63, 0x74, 0x61, 0x6c, 0x2c, 0x20, 0x68, - 0x65, 0x78, 0x2c, 0x20, 0x64, 0xed, 0x09, 0x00, - 0x05, 0x02, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x0a, 0x00, 0x00, - 0x20, 0x20, 0x20, 0x2e, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x20, 0x6c, - 0x61, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x1b, 0xe0, 0x20, 0x20, 0x20, 0x5b, - 0x61, 0x64, 0x64, 0x72, 0x5d, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x62, 0x65, 0x3a, 0x20, 0x20, 0x3c, - 0x68, 0x65, 0x78, 0x2d, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x3e, 0x20, 0x3c, 0x3a, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x3e, 0x20, - 0x3c, 0x3d, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, - 0x3e, 0x0a, 0x00, 0x00, 0xfc, 0xf7, 0x03, 0xf8, - 0x02, 0xa0, 0xfc, 0xf7, 0x00, 0xf8, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x20, 0x20, 0x20, 0x61, - 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, - 0x63, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, - 0x28, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x29, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0xf3, 0xb5, 0x82, 0xb0, - 0x02, 0xa8, 0x0f, 0x1c, 0xfb, 0xf7, 0xda, 0xfc, - 0x01, 0x90, 0x4a, 0x4c, 0x4a, 0x4d, 0x4b, 0x4e, - 0x00, 0x28, 0x31, 0xd0, 0x01, 0xa8, 0xfb, 0xf7, - 0xd7, 0xfd, 0x20, 0x60, 0x01, 0xe0, 0x01, 0x30, - 0x02, 0x90, 0x02, 0x98, 0x01, 0x78, 0x00, 0x29, - 0x05, 0xd0, 0x20, 0x29, 0xf7, 0xd0, 0x02, 0x99, - 0x09, 0x78, 0x2d, 0x29, 0x14, 0xd0, 0x02, 0xa8, - 0xfb, 0xf7, 0xc0, 0xfc, 0x01, 0x90, 0x00, 0x28, - 0xed, 0x09, 0x00, 0x06, 0x02, 0x1a, 0xd0, 0x01, - 0xa8, 0xfb, 0xf7, 0xc0, 0xfd, 0x30, 0x60, 0x02, - 0xa8, 0xfb, 0xf7, 0xb6, 0xfc, 0x01, 0x90, 0x00, - 0x28, 0x10, 0xd0, 0x01, 0xa8, 0xfb, 0xf7, 0xb6, - 0xfd, 0x28, 0x60, 0x0b, 0xe0, 0x01, 0x30, 0x02, - 0x90, 0x02, 0xa8, 0xfb, 0xf7, 0xa9, 0xfc, 0x01, - 0x90, 0x00, 0x28, 0x03, 0xd0, 0x01, 0xa8, 0xfb, - 0xf7, 0xa9, 0xfd, 0x28, 0x60, 0x30, 0x68, 0x39, - 0x1c, 0xfd, 0xf7, 0xba, 0xf8, 0x30, 0x60, 0x28, - 0x68, 0x39, 0x1c, 0xfd, 0xf7, 0xb5, 0xf8, 0x28, - 0x60, 0x00, 0x90, 0x04, 0x2f, 0x01, 0xd1, 0x2b, - 0xa1, 0x08, 0xe0, 0x02, 0x2f, 0x01, 0xd1, 0x2d, - 0xa1, 0x04, 0xe0, 0x01, 0x2f, 0x01, 0xd1, 0x2f, - 0xa1, 0x00, 0xe0, 0x32, 0xa1, 0x33, 0x68, 0x22, - 0x68, 0x32, 0xa0, 0xfb, 0xf7, 0x8e, 0xff, 0x31, - 0x68, 0x28, 0x68, 0x81, 0x42, 0x36, 0xd2, 0x22, - 0x68, 0x01, 0x2f, 0x20, 0xd0, 0x02, 0x2f, 0x10, - 0xd0, 0x04, 0x2f, 0x2a, 0xd1, 0x31, 0x68, 0x09, - 0x68, 0x91, 0x42, 0x26, 0xd1, 0x31, 0x68, 0x30, - 0xa0, 0xfb, 0xf7, 0x7b, 0xff, 0x30, 0x68, 0x04, - 0x30, 0x30, 0x60, 0x04, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x31, 0x68, 0x09, 0x88, 0x91, - 0x42, 0x17, 0xd1, 0x12, 0x04, 0x12, 0x0c, 0x31, - 0x68, 0x2c, 0xa0, 0xfb, 0xf7, 0x6a, 0xff, 0x30, - 0x68, 0x02, 0x30, 0x30, 0x60, 0xed, 0xe7, 0x31, - 0x68, 0x09, 0x78, 0x91, 0x42, 0x09, 0xd1, 0x12, - 0x06, 0x12, 0x0e, 0x31, 0x68, 0x2a, 0xa0, 0xfb, - 0xf7, 0x5c, 0xff, 0x30, 0x68, 0x01, 0x30, 0x30, - 0x60, 0xdf, 0xe7, 0x31, 0x68, 0xc9, 0x19, 0x31, - 0x60, 0x81, 0x42, 0xc9, 0xd3, 0x21, 0x68, 0x29, - 0xa0, 0xfb, 0xf7, 0x4f, 0xff, 0xd5, 0xe7, 0x00, - 0x00, 0x28, 0x69, 0x03, 0x20, 0x30, 0x69, 0x03, - 0x20, 0x2c, 0x69, 0xed, 0x09, 0x00, 0x07, 0x02, - 0x03, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x00, 0x00, - 0x00, 0x00, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x00, 0x00, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x20, 0x63, 0x68, 0x61, 0x72, 0x00, - 0x00, 0x00, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x00, 0x0a, 0x66, 0x69, 0x6e, 0x64, 0x20, - 0x27, 0x25, 0x73, 0x27, 0x20, 0x25, 0x78, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x25, 0x78, 0x20, - 0x74, 0x6f, 0x20, 0x25, 0x78, 0x00, 0x0a, 0x66, - 0x69, 0x6e, 0x64, 0x3a, 0x20, 0x20, 0x25, 0x30, - 0x38, 0x58, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x00, 0x00, 0x0a, 0x66, 0x69, 0x6e, 0x64, 0x3a, - 0x20, 0x20, 0x25, 0x30, 0x38, 0x58, 0x3a, 0x20, - 0x25, 0x30, 0x34, 0x58, 0x00, 0x00, 0x0a, 0x66, - 0x69, 0x6e, 0x64, 0x3a, 0x20, 0x20, 0x25, 0x30, - 0x38, 0x58, 0x3a, 0x20, 0x25, 0x30, 0x32, 0x58, - 0x00, 0x00, 0x0a, 0x66, 0x69, 0x6e, 0x64, 0x3a, - 0x20, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, - 0x00, 0x00, 0x42, 0x78, 0x01, 0x78, 0x12, 0x02, - 0x11, 0x43, 0x82, 0x78, 0xc0, 0x78, 0x12, 0x04, - 0x11, 0x43, 0x00, 0x06, 0x08, 0x43, 0x70, 0x47, - 0x01, 0x70, 0x0a, 0x0a, 0x42, 0x70, 0x0a, 0x0c, - 0x82, 0x70, 0x09, 0x0e, 0xc1, 0x70, 0x70, 0x47, - 0xf0, 0xb5, 0x8e, 0xb0, 0x07, 0x1c, 0x6f, 0x48, - 0x39, 0x1c, 0x00, 0x68, 0xfc, 0xf7, 0xeb, 0xff, - 0x39, 0x1c, 0x6d, 0x4d, 0x04, 0x1c, 0x28, 0x68, - 0xfc, 0xf7, 0xe5, 0xff, 0x28, 0x60, 0x84, 0x42, - 0x73, 0xd2, 0x01, 0x2f, 0x3d, 0xd0, 0x02, 0x2f, - 0x28, 0xd0, 0x04, 0x2f, 0x1b, 0xd0, 0xed, 0x09, - 0x00, 0x08, 0x02, 0x10, 0x2f, 0x6c, 0xd1, 0xe0, - 0x1d, 0x05, 0x30, 0xff, 0xf7, 0xd0, 0xff, 0x06, - 0x1c, 0xe0, 0x1d, 0x01, 0x30, 0xff, 0xf7, 0xcb, - 0xff, 0x05, 0x1c, 0x20, 0x1d, 0xff, 0xf7, 0xc7, - 0xff, 0x0d, 0x90, 0x20, 0x1c, 0xff, 0xf7, 0xc3, - 0xff, 0x21, 0x1c, 0x02, 0x1c, 0x5d, 0xa0, 0x01, - 0x96, 0x00, 0x95, 0x0d, 0x9b, 0xfb, 0xf7, 0xae, - 0xfe, 0xa2, 0xe0, 0xa1, 0x68, 0xe2, 0x68, 0x00, - 0x91, 0x01, 0x92, 0x0c, 0xcc, 0x08, 0x3c, 0x21, - 0x1c, 0x5d, 0xa0, 0xfb, 0xf7, 0xa3, 0xfe, 0x97, - 0xe0, 0xe2, 0x89, 0xa1, 0x89, 0x60, 0x89, 0x05, - 0x92, 0x04, 0x91, 0x03, 0x90, 0x22, 0x89, 0xe1, - 0x88, 0xa0, 0x88, 0x02, 0x92, 0x01, 0x91, 0x00, - 0x90, 0x63, 0x88, 0x22, 0x88, 0x5b, 0xa0, 0x21, - 0x1c, 0xfb, 0xf7, 0x90, 0xfe, 0x84, 0xe0, 0xe2, - 0x7b, 0xa1, 0x7b, 0x60, 0x7b, 0x0d, 0x92, 0x0c, - 0x91, 0x0b, 0x90, 0x22, 0x7b, 0xe1, 0x7a, 0xa0, - 0x7a, 0x0a, 0x92, 0x09, 0x91, 0x08, 0x90, 0x62, - 0x7a, 0x21, 0x7a, 0xe0, 0x79, 0x07, 0x92, 0x06, - 0x91, 0x05, 0x90, 0xa2, 0x79, 0x61, 0x79, 0x20, - 0x79, 0x04, 0x92, 0x03, 0x91, 0x02, 0x90, 0xe2, - 0x78, 0xa1, 0x78, 0x57, 0xa0, 0x01, 0x92, 0x00, - 0x91, 0x63, 0x78, 0x22, 0x78, 0x21, 0x1c, 0xfb, - 0xf7, 0x6d, 0xfe, 0xe0, 0x7b, 0x2e, 0x22, 0x20, - 0x28, 0x00, 0xdb, 0x02, 0x1c, 0xa0, 0x7b, 0x2e, - 0x21, 0x20, 0x28, 0x00, 0xdb, 0x01, 0x1c, 0x63, - 0x7b, 0x2e, 0x20, 0x20, 0x2b, 0x00, 0xdb, 0x18, - 0x1c, 0x0c, 0x92, 0x0b, 0x91, 0x01, 0xe0, 0x55, - 0xe0, 0x4e, 0xe0, 0x0a, 0x90, 0x20, 0x7b, 0x2e, - 0x22, 0x20, 0x28, 0x00, 0xdb, 0x02, 0x1c, 0xe0, - 0x7a, 0x2e, 0x21, 0x20, 0x28, 0x00, 0xdb, 0x01, - 0x1c, 0xa3, 0x7a, 0x2e, 0x20, 0x20, 0x2b, 0x00, - 0xdb, 0xed, 0x09, 0x00, 0x09, 0x02, 0x18, 0x1c, - 0x09, 0x92, 0x08, 0x91, 0x07, 0x90, 0x60, 0x7a, - 0x2e, 0x22, 0x20, 0x28, 0x00, 0xdb, 0x02, 0x1c, - 0x20, 0x7a, 0x2e, 0x21, 0x20, 0x28, 0x00, 0xdb, - 0x01, 0x1c, 0xe3, 0x79, 0x2e, 0x20, 0x20, 0x2b, - 0x00, 0xdb, 0x18, 0x1c, 0x06, 0x92, 0x05, 0x91, - 0x04, 0x90, 0xa0, 0x79, 0x2e, 0x22, 0x20, 0x28, - 0x00, 0xdb, 0x02, 0x1c, 0x60, 0x79, 0x2e, 0x21, - 0x20, 0x28, 0x00, 0xdb, 0x01, 0x1c, 0x23, 0x79, - 0x2e, 0x20, 0x20, 0x2b, 0x00, 0xdb, 0x18, 0x1c, - 0x03, 0x92, 0x02, 0x91, 0x01, 0x90, 0xe0, 0x78, - 0x2e, 0x22, 0x20, 0x28, 0x00, 0xdb, 0x02, 0x1c, - 0x00, 0x92, 0xa0, 0x78, 0x2e, 0x21, 0x0b, 0x1c, - 0x20, 0x28, 0x00, 0xdb, 0x03, 0x1c, 0x60, 0x78, - 0x0a, 0x1c, 0x20, 0x28, 0x00, 0xdb, 0x02, 0x1c, - 0x20, 0x78, 0x20, 0x28, 0x00, 0xdb, 0x01, 0x1c, - 0x3a, 0xa0, 0xfb, 0xf7, 0x0a, 0xfe, 0x07, 0x4d, - 0x10, 0x34, 0x28, 0x68, 0x84, 0x42, 0x00, 0xd2, - 0x34, 0xe7, 0x03, 0x48, 0x04, 0x60, 0x0e, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x34, 0x69, 0x03, 0x20, 0x38, 0x69, 0x03, 0x20, - 0x0a, 0x25, 0x30, 0x38, 0x58, 0x3a, 0x20, 0x25, - 0x30, 0x38, 0x58, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, 0x25, 0x30, - 0x38, 0x58, 0x20, 0x00, 0x0a, 0x25, 0x30, 0x38, - 0x58, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, - 0x25, 0x30, 0x38, 0x58, 0x20, 0x25, 0x30, 0x38, - 0x58, 0x20, 0x25, 0x30, 0x38, 0x58, 0x00, 0x00, - 0x0a, 0x25, 0x30, 0x38, 0x58, 0x3a, 0x20, 0x25, - 0x30, 0x34, 0x58, 0x20, 0x25, 0x30, 0x34, 0x58, - 0x20, 0x25, 0x30, 0x34, 0x58, 0x20, 0x25, 0x30, - 0x34, 0x58, 0x20, 0x25, 0x30, 0x34, 0x58, 0x20, - 0x25, 0x30, 0x34, 0x58, 0xed, 0x09, 0x00, 0x0a, - 0x02, 0x20, 0x25, 0x30, 0x34, 0x58, 0x20, 0x25, - 0x30, 0x34, 0x58, 0x00, 0x00, 0x0a, 0x25, 0x30, - 0x38, 0x58, 0x3a, 0x20, 0x25, 0x30, 0x32, 0x58, - 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x30, - 0x32, 0x58, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, - 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x30, 0x32, - 0x58, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, - 0x30, 0x32, 0x58, 0x20, 0x25, 0x30, 0x32, 0x58, - 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x30, - 0x32, 0x58, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, - 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, 0x30, 0x32, - 0x58, 0x20, 0x25, 0x30, 0x32, 0x58, 0x20, 0x25, - 0x30, 0x32, 0x58, 0x20, 0x20, 0x20, 0x00, 0x00, - 0x00, 0x3a, 0x20, 0x25, 0x63, 0x25, 0x63, 0x25, - 0x63, 0x25, 0x63, 0x25, 0x63, 0x25, 0x63, 0x25, - 0x63, 0x25, 0x63, 0x25, 0x63, 0x25, 0x63, 0x25, - 0x63, 0x25, 0x63, 0x25, 0x63, 0x25, 0x63, 0x25, - 0x63, 0x25, 0x63, 0x00, 0x00, 0xb0, 0xb5, 0x01, - 0x1c, 0x1c, 0x4c, 0x07, 0x1c, 0x20, 0x68, 0xfc, - 0xf7, 0xef, 0xfe, 0x39, 0x1c, 0x01, 0x29, 0x1a, - 0x4f, 0x20, 0x60, 0x24, 0xd0, 0x02, 0x29, 0x18, - 0xd0, 0x04, 0x29, 0x0e, 0xd0, 0x10, 0x29, 0x09, - 0xd1, 0x05, 0x68, 0x39, 0x68, 0xff, 0xf7, 0x87, - 0xfe, 0x3b, 0x68, 0x21, 0x68, 0x2a, 0x1c, 0x13, - 0xa0, 0xfb, 0xf7, 0x69, 0xfd, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x39, 0x68, 0x01, 0x60, 0x3a, - 0x68, 0x21, 0x68, 0x18, 0xa0, 0xfb, 0xf7, 0x5f, - 0xfd, 0xf4, 0xe7, 0x39, 0x68, 0x01, 0x80, 0x38, - 0x68, 0x21, 0x68, 0x02, 0x04, 0x12, 0x0c, 0x1a, - 0xa0, 0xfb, 0xf7, 0x55, 0xfd, 0xea, 0xe7, 0x39, - 0x68, 0x01, 0x70, 0x38, 0x68, 0x21, 0x68, 0x02, - 0x06, 0x12, 0x0e, 0x1d, 0xa0, 0xfb, 0xf7, 0xed, - 0x09, 0x00, 0x0b, 0x02, 0x4b, 0xfd, 0xe0, 0xe7, - 0x00, 0x00, 0x40, 0x69, 0x03, 0x20, 0x44, 0x69, - 0x03, 0x20, 0x0a, 0x25, 0x30, 0x38, 0x58, 0x20, - 0x28, 0x34, 0x20, 0x2a, 0x20, 0x75, 0x6e, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x29, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x2d, 0x3e, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x00, 0x00, 0x0a, 0x25, 0x30, 0x38, 0x58, 0x20, - 0x28, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x74, 0x29, 0x20, 0x3d, - 0x20, 0x25, 0x30, 0x38, 0x58, 0x00, 0x0a, 0x25, - 0x30, 0x38, 0x58, 0x20, 0x28, 0x75, 0x6e, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x29, 0x20, 0x3d, 0x20, 0x25, - 0x30, 0x38, 0x58, 0x00, 0x00, 0x00, 0x0a, 0x25, - 0x30, 0x38, 0x58, 0x20, 0x28, 0x75, 0x6e, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x29, 0x20, 0x3d, 0x20, 0x25, 0x30, - 0x38, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, - 0xf4, 0xf7, 0xcf, 0xfd, 0x01, 0x1c, 0x02, 0xa0, - 0xfb, 0xf7, 0xfc, 0xfc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x0a, 0x49, 0x64, 0x6c, 0x65, 0x3a, - 0x20, 0x25, 0x75, 0x00, 0x00, 0x00, 0xf0, 0xb5, - 0x07, 0x1c, 0x26, 0x48, 0x0c, 0x1c, 0x00, 0x68, - 0x00, 0x25, 0x00, 0x6c, 0x06, 0x1f, 0x01, 0xe0, - 0x00, 0x2d, 0x05, 0xd1, 0x01, 0x2f, 0x03, 0xd1, - 0x22, 0xa0, 0xfb, 0xf7, 0xe3, 0xfc, 0x06, 0xe0, - 0x04, 0x2d, 0x04, 0xd1, 0x00, 0x2f, 0x02, 0xd1, - 0x1e, 0xa0, 0xfb, 0xf7, 0xdb, 0xfc, 0x31, 0x68, - 0x30, 0x1c, 0x00, 0xf0, 0xce, 0xfd, 0x00, 0x2d, - 0x05, 0xd1, 0x01, 0x2f, 0x03, 0xd1, 0x1a, 0xa0, - 0xfb, 0xf7, 0xd0, 0xfc, 0x06, 0xe0, 0x04, 0x2d, - 0x04, 0xd1, 0xed, 0x09, 0x00, 0x0c, 0x02, 0x00, - 0x2f, 0x02, 0xd1, 0x16, 0xa0, 0xfb, 0xf7, 0xc8, - 0xfc, 0x04, 0x35, 0x04, 0x36, 0x10, 0x2d, 0xd9, - 0xd3, 0x01, 0x2f, 0x0a, 0xd1, 0x0f, 0x4f, 0x38, - 0x68, 0x00, 0x6c, 0x04, 0x38, 0x00, 0xf0, 0x21, - 0xf8, 0x39, 0x68, 0x0a, 0x6c, 0x04, 0x3a, 0x0a, - 0x64, 0x04, 0xe0, 0x09, 0x48, 0x00, 0x68, 0x00, - 0x6c, 0x00, 0xf0, 0x17, 0xf8, 0x01, 0x23, 0xdc, - 0x42, 0x00, 0xd0, 0x20, 0x1c, 0x04, 0x21, 0xfc, - 0xf7, 0xbe, 0xfd, 0x00, 0x22, 0x01, 0x1c, 0x13, - 0x20, 0xfe, 0xf7, 0xd1, 0xf9, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x24, 0x69, 0x03, 0x20, 0x1b, - 0x5b, 0x37, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x1b, - 0x5b, 0x6d, 0x00, 0xf8, 0xb4, 0x41, 0x4b, 0x05, - 0x68, 0x1b, 0x68, 0x01, 0x21, 0x1e, 0x68, 0x0a, - 0x1c, 0x33, 0x08, 0x00, 0xd2, 0x00, 0x22, 0x0f, - 0x1c, 0xf3, 0x0f, 0x00, 0xd2, 0x00, 0x27, 0x0c, - 0x1c, 0xb3, 0x0f, 0x00, 0xd2, 0x00, 0x24, 0x73, - 0x0f, 0x00, 0xd2, 0x00, 0x21, 0x00, 0x23, 0x07, - 0x26, 0x76, 0x06, 0x2e, 0x40, 0x00, 0x93, 0x05, - 0x23, 0x5b, 0x06, 0x9e, 0x42, 0x62, 0xd1, 0x2e, - 0x02, 0x36, 0x0a, 0x33, 0x0e, 0x01, 0xd3, 0x31, - 0x4b, 0x1e, 0x43, 0xb3, 0x00, 0x1b, 0x18, 0x2d, - 0x0f, 0xde, 0x1d, 0x01, 0x36, 0x10, 0x2d, 0x4f, - 0xd2, 0x02, 0xa3, 0x5b, 0x5d, 0x5b, 0x00, 0x9f, - 0x44, 0x00, 0x1c, 0x08, 0x0b, 0x0e, 0x11, 0x14, - 0x17, 0x1a, 0x1d, 0x20, 0x25, 0x2a, 0x32, 0x3a, - 0x41, 0x4e, 0x4b, 0x00, 0x2f, 0x47, 0xd0, 0x42, - 0xe0, 0x00, 0x2f, 0x43, 0xd1, 0x3f, 0xe0, 0x00, - 0x2c, 0x41, 0xd0, 0x3c, 0xe0, 0x00, 0x2c, 0x3d, - 0xd1, 0x39, 0xe0, 0x00, 0x2a, 0x3b, 0xd0, 0x36, - 0xe0, 0x00, 0x2a, 0x37, 0xd1, 0x33, 0xe0, 0x00, - 0x29, 0x35, 0xd0, 0x30, 0xe0, 0xed, 0x09, 0x00, - 0x0d, 0x02, 0x00, 0x29, 0x31, 0xd1, 0x2d, 0xe0, - 0x00, 0x2c, 0x2f, 0xd0, 0x00, 0x2f, 0x2c, 0xd1, - 0x28, 0xe0, 0x00, 0x2c, 0x26, 0xd0, 0x00, 0x2f, - 0x28, 0xd0, 0x23, 0xe0, 0x00, 0x2a, 0x02, 0xd0, - 0x00, 0x29, 0x23, 0xd0, 0x1e, 0xe0, 0x00, 0x29, - 0x1f, 0xd1, 0x1b, 0xe0, 0x00, 0x2a, 0x02, 0xd0, - 0x00, 0x29, 0x1a, 0xd1, 0x16, 0xe0, 0x00, 0x29, - 0x18, 0xd0, 0x13, 0xe0, 0x00, 0x2f, 0x11, 0xd0, - 0x00, 0x2a, 0x12, 0xd1, 0x00, 0x29, 0x10, 0xd1, - 0x0c, 0xe0, 0x00, 0x2f, 0x0a, 0xd1, 0x00, 0x2a, - 0x02, 0xd0, 0x00, 0x29, 0x09, 0xd1, 0x05, 0xe0, - 0x00, 0x29, 0x07, 0xd0, 0x02, 0xe0, 0x00, 0x9b, - 0x00, 0x2b, 0x03, 0xd0, 0x30, 0x1c, 0xf8, 0xbc, - 0x70, 0x47, 0xff, 0xe7, 0x04, 0x30, 0xfa, 0xe7, - 0x24, 0x69, 0x03, 0x20, 0x00, 0x00, 0x00, 0xff, - 0xb8, 0xb5, 0xc1, 0x1d, 0x11, 0x31, 0x07, 0x1c, - 0x1b, 0xa0, 0xfb, 0xf7, 0x0c, 0xfc, 0x39, 0x6a, - 0x7b, 0x6a, 0x1a, 0xa0, 0xca, 0x18, 0xfb, 0xf7, - 0x06, 0xfc, 0xb9, 0x6a, 0x1d, 0xa0, 0xfb, 0xf7, - 0x02, 0xfc, 0xf9, 0x6a, 0x1f, 0xa0, 0xfb, 0xf7, - 0xfe, 0xfb, 0x3c, 0x6b, 0x00, 0x25, 0x00, 0x2c, - 0x0d, 0xd0, 0x23, 0x7a, 0x00, 0x2b, 0x07, 0xd0, - 0x1a, 0x1b, 0x00, 0x92, 0x22, 0x1c, 0x29, 0x1c, - 0x01, 0x35, 0x1d, 0xa0, 0xfb, 0xf7, 0xef, 0xfb, - 0x24, 0x7a, 0x00, 0x2c, 0xf1, 0xd1, 0x7f, 0x6b, - 0x00, 0x24, 0x00, 0x2f, 0x0d, 0xd0, 0x3b, 0x7a, - 0x00, 0x2b, 0x07, 0xd0, 0xda, 0x1b, 0x00, 0x92, - 0x3a, 0x1c, 0x21, 0x1c, 0x01, 0x34, 0x1d, 0xa0, - 0xfb, 0xf7, 0xdd, 0xfb, 0x3f, 0x7a, 0x00, 0x2f, - 0xf1, 0xd1, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x25, 0x73, 0x20, 0x00, 0x25, 0x30, 0x38, 0x58, - 0x20, 0x2d, 0x20, 0x25, 0x30, 0x38, 0x58, 0x20, - 0xed, 0x09, 0x00, 0x0e, 0x02, 0x28, 0x53, 0x69, - 0x7a, 0x65, 0x3a, 0x20, 0x25, 0x64, 0x29, 0x00, - 0x00, 0x28, 0x6d, 0x69, 0x6e, 0x20, 0x25, 0x64, - 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x0a, - 0x00, 0x25, 0x64, 0x20, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x0a, 0x00, 0x5b, 0x25, 0x34, - 0x64, 0x5d, 0x20, 0x75, 0x73, 0x65, 0x64, 0x3a, - 0x20, 0x25, 0x30, 0x36, 0x58, 0x20, 0x2d, 0x20, - 0x25, 0x30, 0x36, 0x58, 0x20, 0x28, 0x25, 0x64, - 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x0a, - 0x00, 0x5b, 0x25, 0x34, 0x64, 0x5d, 0x20, 0x66, - 0x72, 0x65, 0x65, 0x3a, 0x20, 0x25, 0x30, 0x36, - 0x58, 0x20, 0x2d, 0x20, 0x25, 0x30, 0x36, 0x58, - 0x20, 0x28, 0x25, 0x64, 0x20, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x29, 0x0a, 0x00, 0xb0, 0xb5, 0x0c, - 0x1c, 0x10, 0x4d, 0x07, 0x1c, 0xa8, 0x88, 0xe9, - 0x88, 0x20, 0x40, 0x88, 0x42, 0x18, 0xd1, 0x0e, - 0xa0, 0xfb, 0xf7, 0x87, 0xfb, 0x3a, 0x88, 0x39, - 0x1c, 0x0c, 0xa0, 0xfb, 0xf7, 0x82, 0xfb, 0xab, - 0x68, 0x00, 0x2b, 0x07, 0xd0, 0x38, 0x1c, 0x21, - 0x1c, 0x2a, 0x1c, 0xdf, 0xf7, 0xb6, 0xfc, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0x21, - 0x1c, 0x2a, 0x1c, 0x00, 0xf0, 0x0f, 0xf8, 0xf6, - 0xe7, 0x0c, 0x35, 0xdf, 0xe7, 0x24, 0x5e, 0x03, - 0x20, 0x0a, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, - 0x58, 0x3a, 0x20, 0x25, 0x30, 0x34, 0x58, 0x3a, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x09, - 0x04, 0x09, 0x0c, 0x13, 0x68, 0x02, 0x1c, 0x02, - 0xa0, 0xfb, 0xf7, 0x5b, 0xfb, 0x08, 0xbc, 0x18, - 0x47, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, - 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x69, 0x6f, 0xed, 0x09, 0x00, 0x0f, 0x02, - 0x6e, 0x20, 0x25, 0x30, 0x34, 0x78, 0x20, 0x61, - 0x74, 0x20, 0x25, 0x30, 0x38, 0x78, 0x20, 0x28, - 0x4e, 0x72, 0x3d, 0x25, 0x75, 0x29, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xb5, 0x09, 0x06, 0x09, 0x0e, - 0x02, 0xa0, 0xfb, 0xf7, 0x3d, 0xfb, 0x08, 0xbc, - 0x18, 0x47, 0x53, 0x57, 0x49, 0x20, 0x20, 0x23, - 0x25, 0x75, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xb5, - 0xc8, 0x10, 0x40, 0x07, 0x40, 0x0f, 0x0f, 0x1c, - 0x00, 0xf0, 0x47, 0xfd, 0x05, 0x1c, 0xb8, 0x11, - 0x40, 0x07, 0x40, 0x0f, 0x00, 0xf0, 0x41, 0xfd, - 0x04, 0x1c, 0x78, 0x07, 0x40, 0x0f, 0x00, 0xf0, - 0x3c, 0xfd, 0xb9, 0x0a, 0x01, 0xd3, 0x06, 0xa1, - 0x00, 0xe0, 0x07, 0xa1, 0x2b, 0x1c, 0x08, 0xa7, - 0x02, 0x1c, 0x38, 0x1c, 0x00, 0x94, 0xfb, 0xf7, - 0x17, 0xfb, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x41, 0x44, 0x44, 0x53, 0x00, 0x00, - 0x00, 0x00, 0x53, 0x55, 0x42, 0x53, 0x00, 0x00, - 0x00, 0x00, 0x25, 0x73, 0x20, 0x20, 0x25, 0x73, - 0x2c, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, - 0x00, 0x00, 0x98, 0xb5, 0xc8, 0x10, 0x40, 0x07, - 0x40, 0x0f, 0x0f, 0x1c, 0x00, 0xf0, 0x15, 0xfd, - 0x04, 0x1c, 0x78, 0x07, 0x40, 0x0f, 0x00, 0xf0, - 0x10, 0xfd, 0xb9, 0x0a, 0x02, 0xd3, 0x00, 0xa1, - 0x40, 0x39, 0x01, 0xe0, 0x00, 0xa1, 0x3c, 0x39, - 0xba, 0x11, 0x52, 0x07, 0x52, 0x0f, 0x00, 0x92, - 0x02, 0x1c, 0x23, 0x1c, 0x03, 0xa7, 0x38, 0x1c, - 0xfb, 0xf7, 0xe6, 0xfa, 0x98, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x25, 0x73, 0x20, 0x20, 0x25, 0x73, - 0x2c, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x23, 0x25, - 0x75, 0x00, 0x88, 0xb5, 0x08, 0x12, 0x40, 0x07, - 0x40, 0x0f, 0x0f, 0x1c, 0x00, 0xf0, 0xed, 0xfc, - 0x3a, 0x06, 0x12, 0x0e, 0xfb, 0x12, 0xed, 0x09, - 0x00, 0x10, 0x02, 0x9b, 0x07, 0x9b, 0x0f, 0x0d, - 0xa1, 0x11, 0xd0, 0x01, 0x2b, 0x11, 0xd0, 0x02, - 0x2b, 0x11, 0xd0, 0x03, 0x2b, 0x01, 0xd1, 0x00, - 0xa1, 0x94, 0x39, 0x00, 0x92, 0x02, 0x1c, 0x00, - 0xa0, 0x44, 0x38, 0x13, 0x1c, 0xfb, 0xf7, 0xbe, - 0xfa, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x05, - 0xa1, 0xf3, 0xe7, 0x05, 0xa1, 0xf1, 0xe7, 0x00, - 0xa1, 0xbc, 0x39, 0xee, 0xe7, 0x00, 0x00, 0x75, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x00, 0x43, - 0x4d, 0x50, 0x00, 0x4d, 0x4f, 0x56, 0x53, 0x00, - 0x00, 0x00, 0x00, 0x0b, 0x68, 0x02, 0x68, 0x03, - 0x60, 0x0a, 0x60, 0x70, 0x47, 0x90, 0xb5, 0x84, - 0xb0, 0xc8, 0x10, 0x40, 0x07, 0x40, 0x0f, 0x0f, - 0x1c, 0x00, 0xf0, 0xb5, 0xfc, 0x03, 0x90, 0x78, - 0x07, 0x40, 0x0f, 0x00, 0xf0, 0xb0, 0xfc, 0x02, - 0x90, 0x00, 0xa4, 0x00, 0x20, 0xb9, 0x11, 0x09, - 0x07, 0x09, 0x0f, 0x3c, 0x3c, 0x10, 0x29, 0x3f, - 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, 0x9f, - 0x44, 0x00, 0x1c, 0x08, 0x0b, 0x0e, 0x11, 0x14, - 0x17, 0x1a, 0x1d, 0x20, 0x23, 0x26, 0x2e, 0x31, - 0x34, 0x36, 0x39, 0x2f, 0xa4, 0x02, 0x20, 0x2f, - 0xe0, 0x30, 0xa4, 0x02, 0x20, 0x2c, 0xe0, 0x30, - 0xa4, 0x01, 0x20, 0x29, 0xe0, 0x30, 0xa4, 0x01, - 0x20, 0x26, 0xe0, 0x2f, 0xa4, 0x01, 0x20, 0x23, - 0xe0, 0x2f, 0xa4, 0x02, 0x20, 0x20, 0xe0, 0x2f, - 0xa4, 0x02, 0x20, 0x1d, 0xe0, 0x30, 0xa4, 0x01, - 0x20, 0x1a, 0xe0, 0x2f, 0xa4, 0x03, 0x20, 0x17, - 0xe0, 0x2f, 0xa4, 0x04, 0x20, 0x14, 0xe0, 0x00, - 0xa4, 0x9c, 0x3c, 0x02, 0xa8, 0x03, 0xa9, 0xff, - 0xf7, 0xb4, 0xff, 0x03, 0x20, 0x0c, 0xe0, 0x2b, - 0xa4, 0x03, 0x20, 0x09, 0xe0, 0x2b, 0xa4, 0x02, - 0x20, 0x06, 0xe0, 0x2b, 0xa4, 0x04, 0xe0, 0x2c, - 0xa4, 0xed, 0x09, 0x00, 0x11, 0x02, 0x02, 0x20, - 0x01, 0xe0, 0x2d, 0xa4, 0x03, 0x20, 0x01, 0x28, - 0x0f, 0xd0, 0x02, 0x28, 0x18, 0xd0, 0x03, 0x28, - 0x1f, 0xd0, 0x04, 0x28, 0x05, 0xd1, 0x02, 0x9a, - 0x03, 0x9b, 0x21, 0x1c, 0x28, 0xa0, 0xfb, 0xf7, - 0x40, 0xfa, 0x04, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x03, 0x9a, 0x01, 0xa1, 0x01, 0x92, - 0x02, 0x9a, 0xec, 0x39, 0x13, 0x1c, 0x00, 0x94, - 0x25, 0xa0, 0xfb, 0xf7, 0x32, 0xfa, 0xf0, 0xe7, - 0x03, 0x9a, 0x21, 0x1c, 0x00, 0x92, 0x02, 0x9a, - 0x26, 0x48, 0x13, 0x1c, 0xfb, 0xf7, 0x29, 0xfa, - 0xe7, 0xe7, 0x02, 0x9a, 0x03, 0x9b, 0x21, 0x1c, - 0x23, 0xa0, 0xfb, 0xf7, 0x22, 0xfa, 0xe0, 0xe7, - 0x41, 0x4e, 0x44, 0x53, 0x00, 0x00, 0x00, 0x00, - 0x45, 0x4f, 0x52, 0x53, 0x00, 0x00, 0x00, 0x00, - 0x4c, 0x53, 0x4c, 0x00, 0x4c, 0x53, 0x52, 0x00, - 0x41, 0x53, 0x52, 0x00, 0x41, 0x44, 0x43, 0x53, - 0x00, 0x00, 0x00, 0x00, 0x53, 0x42, 0x43, 0x53, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x4f, 0x52, 0x00, - 0x54, 0x53, 0x54, 0x00, 0x52, 0x53, 0x42, 0x53, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x4d, 0x4e, 0x00, - 0x4f, 0x52, 0x52, 0x53, 0x00, 0x00, 0x00, 0x00, - 0x4d, 0x55, 0x4c, 0x53, 0x00, 0x00, 0x00, 0x00, - 0x42, 0x49, 0x43, 0x53, 0x00, 0x00, 0x00, 0x00, - 0x4d, 0x56, 0x4e, 0x53, 0x00, 0x00, 0x00, 0x00, - 0x25, 0x73, 0x20, 0x20, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x2c, 0x20, 0x23, 0x30, 0x00, 0x00, - 0x25, 0x73, 0x20, 0x20, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x20, 0x25, - 0x73, 0x00, 0x00, 0x00, 0x54, 0x0b, 0x02, 0x20, - 0x25, 0x73, 0x20, 0x20, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x00, 0x00, 0x00, 0xb5, 0x49, 0x05, - 0x49, 0x0d, 0xca, 0x0a, 0xed, 0x09, 0x00, 0x12, - 0x02, 0x01, 0xd3, 0x05, 0x4b, 0x19, 0x43, 0x49, - 0x00, 0x08, 0x18, 0x01, 0x1f, 0x03, 0xa0, 0xfb, - 0xf7, 0xca, 0xf9, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x00, 0xf8, 0xff, 0xff, 0x42, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x25, 0x78, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb5, 0x49, 0x05, 0x49, 0x0d, 0x02, - 0xa0, 0xfb, 0xf7, 0xb9, 0xf9, 0x08, 0xbc, 0x18, - 0x47, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x23, - 0x25, 0x78, 0x00, 0x00, 0x00, 0x80, 0xb5, 0x01, - 0x22, 0xd2, 0x02, 0x0a, 0x40, 0x49, 0x05, 0x49, - 0x0d, 0x00, 0x2a, 0x0c, 0x4f, 0x0c, 0xd0, 0xca, - 0x0a, 0x01, 0xd3, 0x0b, 0x4b, 0x19, 0x43, 0x09, - 0x03, 0x08, 0x18, 0x38, 0x60, 0x09, 0xa0, 0xfb, - 0xf7, 0x9e, 0xf9, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x38, 0x68, 0x40, 0x18, 0x01, 0x1f, 0x39, - 0x60, 0x08, 0xa0, 0xfb, 0xf7, 0x94, 0xf9, 0x00, - 0x20, 0x38, 0x60, 0xf2, 0xe7, 0x88, 0x69, 0x03, - 0x20, 0x00, 0xf8, 0xff, 0xff, 0x42, 0x4c, 0x20, - 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, - 0x61, 0x72, 0x74, 0x29, 0x00, 0x42, 0x4c, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x25, 0x78, 0x00, 0x00, - 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x08, 0x12, 0x40, - 0x07, 0x40, 0x0f, 0x0f, 0x1c, 0x00, 0xf0, 0x90, - 0xfb, 0x3a, 0x06, 0x12, 0x0e, 0x01, 0x1c, 0x90, - 0x00, 0x63, 0x00, 0xc3, 0x18, 0x02, 0xa0, 0xfb, - 0xf7, 0x6e, 0xf9, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x4c, 0x44, 0x52, 0x20, 0x20, 0x20, 0x25, - 0x73, 0x2c, 0x20, 0x5b, 0x50, 0x43, 0x2c, 0x20, - 0x23, 0x25, 0x78, 0x5d, 0x20, 0x20, 0x20, 0x20, - 0x3b, 0x20, 0x23, 0x25, 0x78, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0xb5, 0x48, 0x12, 0x46, 0x07, 0x76, - 0x0f, 0x88, 0x11, 0x40, 0x07, 0x40, 0x0f, 0xed, - 0x09, 0x00, 0x13, 0x02, 0x0f, 0x1c, 0x00, 0xf0, - 0x6a, 0xfb, 0x05, 0x1c, 0xf8, 0x10, 0x40, 0x07, - 0x40, 0x0f, 0x00, 0xf0, 0x64, 0xfb, 0x04, 0x1c, - 0x78, 0x07, 0x40, 0x0f, 0x00, 0xf0, 0x5f, 0xfb, - 0x10, 0xa1, 0x08, 0x2e, 0x12, 0xd2, 0x01, 0xa3, - 0x9b, 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x0e, 0x03, - 0x05, 0x07, 0x0e, 0x09, 0x0b, 0x0d, 0x0c, 0xa1, - 0x08, 0xe0, 0x0d, 0xa1, 0x06, 0xe0, 0x0e, 0xa1, - 0x04, 0xe0, 0x0f, 0xa1, 0x02, 0xe0, 0x10, 0xa1, - 0x00, 0xe0, 0x11, 0xa1, 0x23, 0x1c, 0x12, 0xa7, - 0x02, 0x1c, 0x38, 0x1c, 0x00, 0x95, 0xfb, 0xf7, - 0x29, 0xf9, 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x00, 0x53, 0x54, 0x52, 0x48, 0x20, 0x00, - 0x00, 0x00, 0x53, 0x54, 0x52, 0x42, 0x20, 0x00, - 0x00, 0x00, 0x4c, 0x44, 0x52, 0x53, 0x42, 0x00, - 0x00, 0x00, 0x4c, 0x44, 0x52, 0x48, 0x20, 0x00, - 0x00, 0x00, 0x4c, 0x44, 0x52, 0x42, 0x20, 0x00, - 0x00, 0x00, 0x4c, 0x44, 0x52, 0x53, 0x48, 0x00, - 0x00, 0x00, 0x25, 0x73, 0x20, 0x20, 0x20, 0x25, - 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x5d, 0x00, 0x00, 0x00, 0x80, 0xb5, - 0x08, 0x12, 0x40, 0x07, 0x40, 0x0f, 0x0f, 0x1c, - 0x00, 0xf0, 0x11, 0xfb, 0x3a, 0x06, 0x12, 0x0e, - 0x39, 0x0b, 0x07, 0xd3, 0x07, 0xa3, 0x01, 0x1c, - 0x18, 0x1c, 0xfb, 0xf7, 0xef, 0xf8, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x08, 0xa3, 0x01, 0x1c, - 0x18, 0x1c, 0xfb, 0xf7, 0xe7, 0xf8, 0xf6, 0xe7, - 0x00, 0x00, 0x41, 0x44, 0x44, 0x20, 0x20, 0x20, - 0x25, 0x73, 0x2c, 0x20, 0x53, 0x50, 0x2c, 0x20, - 0x23, 0x25, 0x78, 0x00, 0x00, 0x00, 0x41, 0x44, - 0x44, 0x20, 0x20, 0x20, 0x25, 0x73, 0x2c, 0x20, - 0x50, 0x43, 0xed, 0x09, 0x00, 0x14, 0x02, 0x2c, - 0x20, 0x23, 0x25, 0x78, 0x00, 0x00, 0x00, 0x00, - 0xb5, 0x49, 0x06, 0x49, 0x0e, 0x02, 0xa0, 0xfb, - 0xf7, 0xcb, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x53, - 0x55, 0x42, 0x20, 0x20, 0x53, 0x50, 0x2c, 0x20, - 0x53, 0x50, 0x2c, 0x20, 0x23, 0x25, 0x78, 0x00, - 0x00, 0x00, 0x00, 0x80, 0xb5, 0x08, 0x06, 0x00, - 0x0e, 0x0f, 0x1c, 0x49, 0x0a, 0x02, 0xd3, 0x01, - 0x23, 0xdb, 0x03, 0x18, 0x43, 0x01, 0xf0, 0x79, - 0xfc, 0x39, 0x0b, 0x07, 0xd3, 0x07, 0xa2, 0x01, - 0x1c, 0x10, 0x1c, 0xfb, 0xf7, 0xad, 0xf8, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x07, 0xa2, 0x01, - 0x1c, 0x10, 0x1c, 0xfb, 0xf7, 0xa5, 0xf8, 0xf6, - 0xe7, 0x00, 0x00, 0x4c, 0x44, 0x4d, 0x49, 0x41, - 0x20, 0x53, 0x50, 0x21, 0x2c, 0x20, 0x7b, 0x25, - 0x73, 0x7d, 0x00, 0x53, 0x54, 0x4d, 0x44, 0x42, - 0x20, 0x53, 0x50, 0x21, 0x2c, 0x20, 0x7b, 0x25, - 0x73, 0x7d, 0x00, 0xb0, 0xb5, 0x0d, 0x06, 0x2d, - 0x0e, 0x08, 0x12, 0x40, 0x07, 0x40, 0x0f, 0x0f, - 0x1c, 0x00, 0xf0, 0xa3, 0xfa, 0x04, 0x1c, 0x28, - 0x1c, 0x01, 0xf0, 0x4b, 0xfc, 0x39, 0x0b, 0x08, - 0xd3, 0x21, 0x1c, 0x07, 0xa3, 0x02, 0x1c, 0x18, - 0x1c, 0xfb, 0xf7, 0x7e, 0xf8, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x21, 0x1c, 0x07, 0xa3, 0x02, - 0x1c, 0x18, 0x1c, 0xfb, 0xf7, 0x75, 0xf8, 0xf5, - 0xe7, 0x00, 0x00, 0x4c, 0x44, 0x4d, 0x49, 0x41, - 0x20, 0x25, 0x73, 0x21, 0x2c, 0x20, 0x7b, 0x25, - 0x73, 0x7d, 0x00, 0x53, 0x54, 0x4d, 0x44, 0x42, - 0x20, 0x25, 0x73, 0x21, 0x2c, 0x20, 0x7b, 0x25, - 0x73, 0x7d, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x08, - 0x12, 0x00, 0x07, 0x00, 0x0f, 0x0f, 0x1c, 0x00, - 0xf0, 0x7e, 0xf9, 0x39, 0x06, 0x09, 0x0e, 0x0a, - 0x0a, 0x02, 0xd3, 0xff, 0x23, 0xed, 0x09, 0x00, - 0x15, 0x02, 0xdb, 0x43, 0x19, 0x43, 0x49, 0x00, - 0x62, 0x18, 0x01, 0x1c, 0x03, 0xa3, 0x18, 0x1c, - 0xfb, 0xf7, 0x4d, 0xf8, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x42, 0x25, 0x73, 0x20, - 0x20, 0x25, 0x78, 0x00, 0x80, 0xb5, 0x08, 0x12, - 0x40, 0x07, 0x40, 0x0f, 0x0f, 0x1c, 0x00, 0xf0, - 0x57, 0xfa, 0x3a, 0x06, 0x12, 0x0e, 0x39, 0x0b, - 0x01, 0xd3, 0x05, 0xa1, 0x00, 0xe0, 0x05, 0xa1, - 0x13, 0x1c, 0x02, 0x1c, 0x04, 0xa0, 0xfb, 0xf7, - 0x32, 0xf8, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x4c, 0x44, 0x52, 0x00, 0x53, 0x54, 0x52, 0x00, - 0x25, 0x73, 0x20, 0x20, 0x20, 0x20, 0x25, 0x73, - 0x2c, 0x20, 0x5b, 0x53, 0x50, 0x2c, 0x20, 0x23, - 0x25, 0x78, 0x5d, 0x00, 0x80, 0xb5, 0x08, 0x12, - 0x40, 0x07, 0x40, 0x0f, 0x0f, 0x1c, 0x00, 0xf0, - 0x33, 0xfa, 0x3a, 0x06, 0x12, 0x0e, 0x39, 0x0b, - 0x02, 0xd3, 0x00, 0xa1, 0x34, 0x39, 0x01, 0xe0, - 0x00, 0xa1, 0x38, 0x39, 0x13, 0x1c, 0x02, 0x1c, - 0x02, 0xa0, 0xfb, 0xf7, 0x0c, 0xf8, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x25, 0x73, 0x20, 0x20, - 0x20, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x50, - 0x43, 0x2c, 0x20, 0x23, 0x25, 0x78, 0x5d, 0x00, - 0x98, 0xb5, 0x48, 0x07, 0x40, 0x0f, 0x0f, 0x1c, - 0x00, 0xf0, 0x12, 0xfa, 0x04, 0x1c, 0xf8, 0x10, - 0x40, 0x07, 0x40, 0x0f, 0x00, 0xf0, 0x0c, 0xfa, - 0xb9, 0x11, 0xca, 0x06, 0xd2, 0x0e, 0x39, 0x0b, - 0x02, 0xd3, 0x00, 0xa1, 0x84, 0x39, 0x01, 0xe0, - 0x00, 0xa1, 0x88, 0x39, 0x00, 0x92, 0x22, 0x1c, - 0x03, 0x1c, 0x03, 0xa0, 0xfa, 0xf7, 0xe3, 0xff, - 0x98, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x25, 0x73, 0x20, 0x20, 0x20, 0x20, 0x25, 0x73, - 0x2c, 0x20, 0x5b, 0x25, 0x73, 0x2c, 0x20, 0x23, - 0xed, 0x09, 0x00, 0x16, 0x02, 0x25, 0x78, 0x5d, - 0x00, 0x98, 0xb5, 0x48, 0x07, 0x40, 0x0f, 0x0f, - 0x1c, 0x00, 0xf0, 0xe8, 0xf9, 0x04, 0x1c, 0xf8, - 0x10, 0x40, 0x07, 0x40, 0x0f, 0x00, 0xf0, 0xe2, - 0xf9, 0xb9, 0x11, 0xca, 0x06, 0xd2, 0x0e, 0xf9, - 0x12, 0x89, 0x07, 0x89, 0x0f, 0x05, 0xd0, 0x01, - 0x29, 0x05, 0xd0, 0x02, 0x29, 0x05, 0xd1, 0x08, - 0xa3, 0x04, 0xe0, 0x08, 0xa3, 0x02, 0xe0, 0x08, - 0xa3, 0x00, 0xe0, 0x08, 0xa3, 0x00, 0x92, 0x21, - 0x1c, 0x02, 0x1c, 0x08, 0xa0, 0xfa, 0xf7, 0xb1, - 0xff, 0x98, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x41, 0x53, 0x52, 0x00, 0x4c, 0x53, 0x4c, - 0x00, 0x4c, 0x53, 0x52, 0x00, 0x75, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x00, 0x4d, 0x4f, 0x56, - 0x53, 0x20, 0x20, 0x20, 0x20, 0x25, 0x73, 0x2c, - 0x20, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x20, - 0x23, 0x25, 0x78, 0x00, 0x00, 0xf8, 0xb5, 0x40, - 0x20, 0x08, 0x40, 0x80, 0x25, 0x0d, 0x40, 0x4a, - 0x07, 0x52, 0x0f, 0x08, 0x26, 0x0f, 0x1c, 0x31, - 0x1c, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x21, 0x0a, - 0x43, 0x10, 0x1c, 0x00, 0xf0, 0x9f, 0xf9, 0x04, - 0x1c, 0xf8, 0x10, 0x40, 0x07, 0x40, 0x0f, 0x00, - 0x2d, 0x00, 0xd1, 0x00, 0x26, 0x30, 0x43, 0x00, - 0xf0, 0x95, 0xf9, 0x39, 0x12, 0x89, 0x07, 0x89, - 0x0f, 0x0b, 0xd0, 0x01, 0x29, 0x0b, 0xd0, 0x03, - 0x29, 0x10, 0xd1, 0x02, 0x1c, 0x0d, 0xa0, 0x0c, - 0xa1, 0xfa, 0xf7, 0x6f, 0xff, 0xf8, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x0c, 0xa1, 0x08, 0xe0, 0x22, - 0x1c, 0x03, 0x1c, 0x0c, 0xa0, 0x0a, 0xa1, 0xfa, - 0xf7, 0x64, 0xff, 0xf3, 0xe7, 0x00, 0xa1, 0x8c, - 0x39, 0x00, 0x90, 0x22, 0x1c, 0x23, 0x1c, 0x0a, - 0xa0, 0xfa, 0xf7, 0x5b, 0xff, 0xea, 0xe7, 0x00, - 0x00, 0x42, 0x58, 0xed, 0x09, 0x00, 0x17, 0x02, - 0x00, 0x00, 0x25, 0x73, 0x20, 0x20, 0x20, 0x25, - 0x73, 0x00, 0x41, 0x44, 0x44, 0x00, 0x43, 0x4d, - 0x50, 0x00, 0x25, 0x73, 0x20, 0x20, 0x20, 0x25, - 0x73, 0x2c, 0x20, 0x25, 0x73, 0x00, 0x25, 0x73, - 0x20, 0x20, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x25, - 0x73, 0x2c, 0x20, 0x25, 0x73, 0x00, 0x4d, 0x55, - 0x4c, 0x00, 0x4d, 0x52, 0x53, 0x00, 0x4d, 0x53, - 0x52, 0x00, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x00, - 0x00, 0x00, 0x4c, 0x44, 0x52, 0x00, 0x4c, 0x44, - 0x52, 0x00, 0x4d, 0x53, 0x52, 0x00, 0x4c, 0x44, - 0x52, 0x00, 0x42, 0x00, 0x00, 0x00, 0x53, 0x57, - 0x49, 0x00, 0x65, 0x72, 0x72, 0x00, 0x80, 0xb5, - 0x01, 0x1c, 0x07, 0x1c, 0x06, 0xa0, 0xfa, 0xf7, - 0x23, 0xff, 0x06, 0xa0, 0xfa, 0xf7, 0x20, 0xff, - 0x39, 0x68, 0x07, 0xa0, 0xfa, 0xf7, 0x1c, 0xff, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x0a, 0x25, - 0x30, 0x38, 0x58, 0x09, 0x00, 0x00, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x00, 0x20, 0x20, 0x44, 0x43, 0x44, 0x20, - 0x25, 0x30, 0x38, 0x58, 0x00, 0x00, 0xf0, 0xb5, - 0x0e, 0x0f, 0x0d, 0x01, 0x2d, 0x09, 0x0d, 0x4c, - 0x07, 0x1c, 0xa0, 0x68, 0xe1, 0x68, 0x28, 0x40, - 0x88, 0x42, 0x11, 0xd1, 0x0b, 0xa0, 0xfa, 0xf7, - 0xfb, 0xfe, 0x3a, 0x68, 0x39, 0x1c, 0x09, 0xa0, - 0xfa, 0xf7, 0xf6, 0xfe, 0x38, 0x1c, 0x29, 0x1c, - 0x22, 0x1c, 0x33, 0x1c, 0x27, 0x69, 0xdf, 0xf7, - 0x2f, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x14, 0x34, 0xe6, 0xe7, 0x00, 0x00, 0x38, 0x5f, - 0x03, 0x20, 0x0a, 0x00, 0x00, 0x00, 0x25, 0x30, - 0x38, 0x58, 0x3a, 0x20, 0x25, 0x30, 0x38, 0x58, - 0x3a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x90, 0xb5, - 0x07, 0x1c, 0x10, 0x28, 0x2e, 0xd2, 0xed, 0x09, - 0x00, 0x18, 0x02, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x07, 0x0b, 0x0d, 0x0f, 0x11, - 0x13, 0x15, 0x17, 0x19, 0x1b, 0x1d, 0x1f, 0x21, - 0x23, 0x25, 0x28, 0x1a, 0xa0, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x19, 0xa0, 0xfa, 0xe7, 0x19, - 0xa0, 0xf8, 0xe7, 0x19, 0xa0, 0xf6, 0xe7, 0x19, - 0xa0, 0xf4, 0xe7, 0x19, 0xa0, 0xf2, 0xe7, 0x19, - 0xa0, 0xf0, 0xe7, 0x19, 0xa0, 0xee, 0xe7, 0x19, - 0xa0, 0xec, 0xe7, 0x19, 0xa0, 0xea, 0xe7, 0x19, - 0xa0, 0xe8, 0xe7, 0x19, 0xa0, 0xe6, 0xe7, 0x19, - 0xa0, 0xe4, 0xe7, 0x19, 0xa0, 0xe2, 0xe7, 0x00, - 0xa0, 0x64, 0x38, 0xdf, 0xe7, 0x18, 0xa0, 0xdd, - 0xe7, 0x19, 0xa1, 0x0e, 0xc9, 0x17, 0x4c, 0x20, - 0x1c, 0x0e, 0xc0, 0x20, 0x1c, 0x04, 0xf0, 0x49, - 0xfb, 0x01, 0x19, 0x10, 0x22, 0x38, 0x1c, 0x04, - 0xf0, 0xe8, 0xfa, 0x20, 0x1c, 0x15, 0xa1, 0x04, - 0xf0, 0x2e, 0xfc, 0x20, 0x1c, 0xca, 0xe7, 0x45, - 0x51, 0x00, 0x00, 0x4e, 0x45, 0x00, 0x00, 0x48, - 0x53, 0x00, 0x00, 0x4c, 0x4f, 0x00, 0x00, 0x4d, - 0x49, 0x00, 0x00, 0x50, 0x4c, 0x00, 0x00, 0x56, - 0x53, 0x00, 0x00, 0x56, 0x43, 0x00, 0x00, 0x48, - 0x49, 0x00, 0x00, 0x4c, 0x53, 0x00, 0x00, 0x47, - 0x45, 0x00, 0x00, 0x4c, 0x54, 0x00, 0x00, 0x47, - 0x54, 0x00, 0x00, 0x4c, 0x45, 0x00, 0x00, 0x4e, - 0x56, 0x00, 0x00, 0xfc, 0xc2, 0x03, 0x20, 0x27, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x00, 0x20, 0x75, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x27, 0x00, 0x00, 0x00, 0x90, - 0xb5, 0x07, 0x1c, 0x03, 0x20, 0x01, 0x24, 0x02, - 0x22, 0x10, 0x2f, 0x3e, 0xd2, 0x02, 0xa3, 0xdb, - 0x5d, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x08, - 0x0d, 0x10, 0x13, 0x16, 0x19, 0x1c, 0x1f, 0x22, - 0x25, 0xed, 0x09, 0x00, 0x19, 0x02, 0x28, 0x2b, - 0x2e, 0x31, 0x34, 0x37, 0x08, 0x60, 0x23, 0xa0, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x08, 0x60, - 0x21, 0xa0, 0xf9, 0xe7, 0x08, 0x60, 0x21, 0xa0, - 0xf6, 0xe7, 0x08, 0x60, 0x20, 0xa0, 0xf3, 0xe7, - 0x08, 0x60, 0x20, 0xa0, 0xf0, 0xe7, 0x08, 0x60, - 0x1f, 0xa0, 0xed, 0xe7, 0x08, 0x60, 0x1f, 0xa0, - 0xea, 0xe7, 0x08, 0x60, 0x1e, 0xa0, 0xe7, 0xe7, - 0x0a, 0x60, 0x1e, 0xa0, 0xe4, 0xe7, 0x0a, 0x60, - 0x1d, 0xa0, 0xe1, 0xe7, 0x0a, 0x60, 0x1d, 0xa0, - 0xde, 0xe7, 0x0a, 0x60, 0x1c, 0xa0, 0xdb, 0xe7, - 0x08, 0x60, 0x1c, 0xa0, 0xd8, 0xe7, 0x0c, 0x60, - 0x1b, 0xa0, 0xd5, 0xe7, 0x08, 0x60, 0x1b, 0xa0, - 0xd2, 0xe7, 0x0c, 0x60, 0x1a, 0xa0, 0xcf, 0xe7, - 0x1a, 0x4c, 0x1b, 0xa1, 0x20, 0x1c, 0x09, 0x22, - 0xde, 0xf7, 0x7a, 0xff, 0x20, 0x1c, 0x04, 0xf0, - 0xc3, 0xfa, 0x01, 0x19, 0x10, 0x22, 0x38, 0x1c, - 0x04, 0xf0, 0x62, 0xfa, 0x20, 0x1c, 0x00, 0xa1, - 0xb8, 0x39, 0x04, 0xf0, 0xa7, 0xfb, 0x20, 0x1c, - 0xba, 0xe7, 0x00, 0x00, 0x41, 0x4e, 0x44, 0x00, - 0x45, 0x4f, 0x52, 0x00, 0x53, 0x55, 0x42, 0x00, - 0x52, 0x53, 0x42, 0x00, 0x41, 0x44, 0x44, 0x00, - 0x41, 0x44, 0x43, 0x00, 0x53, 0x42, 0x43, 0x00, - 0x52, 0x53, 0x43, 0x00, 0x54, 0x53, 0x54, 0x00, - 0x54, 0x45, 0x51, 0x00, 0x43, 0x4d, 0x50, 0x00, - 0x43, 0x4d, 0x4e, 0x00, 0x4f, 0x52, 0x52, 0x00, - 0x4d, 0x4f, 0x56, 0x00, 0x42, 0x49, 0x43, 0x00, - 0x4d, 0x56, 0x4e, 0x00, 0x24, 0xc3, 0x03, 0x20, - 0x27, 0x4f, 0x70, 0x63, 0x6f, 0x64, 0x65, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x90, 0xb5, 0x07, 0x1c, - 0x10, 0x28, 0x2d, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, - 0x5b, 0x00, 0x9f, 0x44, 0x07, 0x0b, 0x0d, 0x0f, - 0x11, 0x13, 0x15, 0x17, 0xed, 0x09, 0x00, 0x1a, - 0x02, 0x19, 0x1b, 0x1d, 0x1f, 0x21, 0x23, 0x25, - 0x27, 0x1a, 0xa0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x19, 0xa0, 0xfa, 0xe7, 0x19, 0xa0, 0xf8, - 0xe7, 0x19, 0xa0, 0xf6, 0xe7, 0x19, 0xa0, 0xf4, - 0xe7, 0x19, 0xa0, 0xf2, 0xe7, 0x19, 0xa0, 0xf0, - 0xe7, 0x19, 0xa0, 0xee, 0xe7, 0x19, 0xa0, 0xec, - 0xe7, 0x19, 0xa0, 0xea, 0xe7, 0x19, 0xa0, 0xe8, - 0xe7, 0x19, 0xa0, 0xe6, 0xe7, 0x19, 0xa0, 0xe4, - 0xe7, 0x19, 0xa0, 0xe2, 0xe7, 0x19, 0xa0, 0xe0, - 0xe7, 0x19, 0xa0, 0xde, 0xe7, 0x19, 0x4c, 0x1a, - 0xa1, 0x20, 0x1c, 0x0b, 0x22, 0xde, 0xf7, 0x0a, - 0xff, 0x20, 0x1c, 0x04, 0xf0, 0x53, 0xfa, 0x01, - 0x19, 0x10, 0x22, 0x38, 0x1c, 0x04, 0xf0, 0xf2, - 0xf9, 0x20, 0x1c, 0x16, 0x49, 0x04, 0xf0, 0x38, - 0xfb, 0x20, 0x1c, 0xca, 0xe7, 0x61, 0x31, 0x00, - 0x00, 0x61, 0x32, 0x00, 0x00, 0x61, 0x33, 0x00, - 0x00, 0x61, 0x34, 0x00, 0x00, 0x76, 0x31, 0x00, - 0x00, 0x76, 0x32, 0x00, 0x00, 0x76, 0x33, 0x00, - 0x00, 0x76, 0x34, 0x00, 0x00, 0x76, 0x35, 0x00, - 0x00, 0x76, 0x36, 0x00, 0x00, 0x76, 0x37, 0x00, - 0x00, 0x76, 0x38, 0x00, 0x00, 0x69, 0x70, 0x00, - 0x00, 0x73, 0x70, 0x00, 0x00, 0x6c, 0x72, 0x00, - 0x00, 0x70, 0x63, 0x00, 0x00, 0x4c, 0xc3, 0x03, - 0x20, 0x27, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x20, 0x00, 0x00, 0x88, 0x14, 0x02, - 0x20, 0x90, 0xb5, 0x07, 0x1c, 0x10, 0x28, 0x2d, - 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, - 0x44, 0x07, 0x0b, 0x0d, 0x0f, 0x11, 0x13, 0x15, - 0x17, 0x19, 0x1b, 0x1d, 0x1f, 0x21, 0x23, 0x25, - 0x27, 0x1a, 0xa0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x1a, 0xa0, 0xfa, 0xe7, 0x1a, 0xa0, 0xf8, - 0xe7, 0x1a, 0xa0, 0xf6, 0xe7, 0x1a, 0xa0, 0xed, - 0x09, 0x00, 0x1b, 0x02, 0xf4, 0xe7, 0x1a, 0xa0, - 0xf2, 0xe7, 0x1a, 0xa0, 0xf0, 0xe7, 0x1a, 0xa0, - 0xee, 0xe7, 0x1b, 0xa0, 0xec, 0xe7, 0x1b, 0xa0, - 0xea, 0xe7, 0x1b, 0xa0, 0xe8, 0xe7, 0x1b, 0xa0, - 0xe6, 0xe7, 0x1c, 0xa0, 0xe4, 0xe7, 0x1c, 0xa0, - 0xe2, 0xe7, 0x1d, 0xa0, 0xe0, 0xe7, 0x1e, 0xa0, - 0xde, 0xe7, 0x1f, 0x4c, 0x20, 0xa1, 0x20, 0x1c, - 0x07, 0x22, 0xde, 0xf7, 0x9a, 0xfe, 0x20, 0x1c, - 0x04, 0xf0, 0xe3, 0xf9, 0x01, 0x19, 0x10, 0x22, - 0x38, 0x1c, 0x04, 0xf0, 0x82, 0xf9, 0x20, 0x1c, - 0x1b, 0x49, 0x04, 0xf0, 0xc8, 0xfa, 0x20, 0x1c, - 0xca, 0xe7, 0x5f, 0x6e, 0x6f, 0x6e, 0x00, 0x00, - 0x00, 0x00, 0x5f, 0x63, 0x00, 0x00, 0x5f, 0x78, - 0x00, 0x00, 0x5f, 0x78, 0x63, 0x00, 0x5f, 0x73, - 0x00, 0x00, 0x5f, 0x73, 0x63, 0x00, 0x5f, 0x73, - 0x78, 0x00, 0x5f, 0x73, 0x78, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x5f, 0x66, 0x00, 0x00, 0x5f, 0x66, - 0x63, 0x00, 0x5f, 0x66, 0x78, 0x00, 0x5f, 0x66, - 0x78, 0x63, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x66, - 0x73, 0x00, 0x5f, 0x66, 0x73, 0x63, 0x00, 0x00, - 0x00, 0x00, 0x5f, 0x66, 0x73, 0x78, 0x00, 0x00, - 0x00, 0x00, 0x5f, 0x66, 0x73, 0x78, 0x63, 0x00, - 0x00, 0x00, 0x74, 0xc3, 0x03, 0x20, 0x27, 0x4d, - 0x61, 0x73, 0x6b, 0x20, 0x00, 0x00, 0x88, 0x14, - 0x02, 0x20, 0xb8, 0xb5, 0x04, 0x1c, 0x18, 0x1c, - 0x15, 0x1c, 0x0f, 0x1c, 0xff, 0xf7, 0x19, 0xfe, - 0x00, 0x90, 0x21, 0x1c, 0x3a, 0x1c, 0x2b, 0x68, - 0x03, 0xa0, 0xfa, 0xf7, 0xef, 0xfc, 0xb8, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x25, 0x30, - 0x38, 0x58, 0x20, 0x25, 0x30, 0x38, 0x58, 0x3a, - 0x20, 0x4e, 0x72, 0x3a, 0x25, 0x64, 0x20, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x3a, 0x25, 0xed, 0x09, 0x00, 0x1c, 0x02, 0x73, - 0x00, 0x00, 0x00, 0xb8, 0xb5, 0x0c, 0x1c, 0x15, - 0x1c, 0x22, 0x02, 0x12, 0x0a, 0x92, 0x00, 0x19, - 0x1c, 0x93, 0x0e, 0x01, 0xd3, 0x0b, 0x4b, 0x1a, - 0x43, 0x80, 0x18, 0xc7, 0x1d, 0x01, 0x37, 0x08, - 0x1c, 0xff, 0xf7, 0xed, 0xfd, 0x00, 0x97, 0x61, - 0x0e, 0x01, 0xd3, 0x06, 0xa2, 0x01, 0xe0, 0x00, - 0xa2, 0xd8, 0x3a, 0x03, 0x1c, 0x05, 0xa0, 0x69, - 0x68, 0xfa, 0xf7, 0xbe, 0xfc, 0xb8, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xfc, 0x4c, - 0x00, 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, - 0x25, 0x73, 0x09, 0x30, 0x78, 0x25, 0x30, 0x38, - 0x58, 0x00, 0x00, 0xf0, 0xb5, 0x8b, 0xb0, 0x1d, - 0x1c, 0x0f, 0x1c, 0x48, 0x0d, 0x00, 0x07, 0x00, - 0x0f, 0x0a, 0xa9, 0x48, 0xa4, 0xff, 0xf7, 0x39, - 0xfe, 0x06, 0x1c, 0x28, 0x1c, 0xff, 0xf7, 0xc3, - 0xfd, 0x09, 0x90, 0x78, 0x0d, 0x01, 0xd3, 0x45, - 0xa0, 0x01, 0xe0, 0x00, 0xa0, 0xf8, 0x38, 0x08, - 0x90, 0x38, 0x0b, 0x00, 0x07, 0x00, 0x0f, 0xff, - 0xf7, 0xac, 0xfe, 0x07, 0x90, 0x38, 0x0c, 0x00, - 0x07, 0x00, 0x0f, 0xff, 0xf7, 0xa6, 0xfe, 0x06, - 0x90, 0x38, 0x07, 0x00, 0x0f, 0xff, 0xf7, 0xa1, - 0xfe, 0x05, 0x90, 0xf8, 0x09, 0xc5, 0x06, 0xed, - 0x0e, 0x78, 0x09, 0x80, 0x07, 0x80, 0x0f, 0x09, - 0xd0, 0x01, 0x28, 0x09, 0xd0, 0x02, 0x28, 0x09, - 0xd0, 0x03, 0x28, 0x0a, 0xd1, 0x00, 0x2d, 0x07, - 0xd1, 0x34, 0xa4, 0x06, 0xe0, 0x34, 0xa4, 0x04, - 0xe0, 0x34, 0xa4, 0x02, 0xe0, 0x34, 0xa4, 0x00, - 0xe0, 0x34, 0xa4, 0x0a, 0x98, 0x03, 0x28, 0x11, - 0xd1, 0x07, 0x99, 0x05, 0x98, 0x06, 0x9a, 0x00, - 0x91, 0x02, 0x90, 0x01, 0x92, 0x09, 0x9a, 0x2f, - 0xa0, 0x08, 0x9b, 0x31, 0x1c, 0x04, 0x95, 0x03, - 0x94, 0xfa, 0xf7, 0x5e, 0xfc, 0xed, 0x09, 0x00, - 0x1d, 0x02, 0x0b, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x02, 0x28, 0x0c, 0xd1, 0x05, 0x98, - 0x06, 0x9a, 0x01, 0x90, 0x00, 0x92, 0x08, 0x9b, - 0x09, 0x9a, 0x2d, 0xa0, 0x03, 0x95, 0x02, 0x94, - 0x31, 0x1c, 0xfa, 0xf7, 0x4c, 0xfc, 0xec, 0xe7, - 0x01, 0x28, 0x32, 0xd1, 0x08, 0x98, 0x00, 0x23, - 0xc0, 0x56, 0x00, 0x28, 0x13, 0xd1, 0x07, 0x98, - 0x05, 0x99, 0x13, 0xf0, 0x93, 0xff, 0x00, 0x28, - 0x0d, 0xd1, 0x30, 0x1c, 0x28, 0xa1, 0x13, 0xf0, - 0x8d, 0xff, 0x00, 0x28, 0x07, 0xd1, 0x00, 0x2d, - 0x12, 0xd1, 0x09, 0x9a, 0x25, 0xa1, 0x26, 0xa0, - 0xfa, 0xf7, 0x31, 0xfc, 0x18, 0xe0, 0x00, 0x2d, - 0x0a, 0xd1, 0x07, 0x99, 0x05, 0x9a, 0x00, 0x91, - 0x01, 0x92, 0x09, 0x9a, 0x08, 0x9b, 0x31, 0x1c, - 0x21, 0xa0, 0xfa, 0xf7, 0x24, 0xfc, 0x0b, 0xe0, - 0x05, 0x98, 0x07, 0x9a, 0x01, 0x90, 0x00, 0x92, - 0x08, 0x9b, 0x09, 0x9a, 0x12, 0xa0, 0x03, 0x95, - 0x02, 0x94, 0x31, 0x1c, 0xfa, 0xf7, 0x17, 0xfc, - 0xb7, 0xe7, 0xb6, 0xe7, 0x75, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x00, 0x53, 0x00, 0x00, 0x00, - 0x52, 0x52, 0x58, 0x00, 0x4c, 0x53, 0x4c, 0x00, - 0x4c, 0x53, 0x52, 0x00, 0x41, 0x53, 0x52, 0x00, - 0x52, 0x4f, 0x52, 0x00, 0x20, 0x25, 0x73, 0x25, - 0x73, 0x25, 0x73, 0x09, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x20, 0x25, - 0x73, 0x20, 0x23, 0x30, 0x78, 0x25, 0x58, 0x00, - 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x09, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x20, 0x25, - 0x73, 0x20, 0x23, 0x30, 0x78, 0x25, 0x58, 0x00, - 0x4d, 0x4f, 0x56, 0x00, 0x4e, 0x4f, 0x50, 0x00, - 0x20, 0x25, 0x73, 0x25, 0x73, 0x00, 0x00, 0x00, - 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x09, - 0xed, 0x09, 0x00, 0x1e, 0x02, 0x25, 0x73, 0x2c, - 0x20, 0x25, 0x73, 0x00, 0x00, 0xf0, 0xb5, 0x89, - 0xb0, 0x48, 0x0d, 0x00, 0x07, 0x00, 0x0f, 0x0f, - 0x1c, 0x08, 0xa9, 0x1c, 0x1c, 0xff, 0xf7, 0x66, - 0xfd, 0x06, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0xf0, - 0xfc, 0x04, 0x1c, 0x78, 0x0d, 0x02, 0xd3, 0x00, - 0xa5, 0x90, 0x3d, 0x00, 0xe0, 0x2f, 0xa5, 0x38, - 0x0b, 0x00, 0x07, 0x00, 0x0f, 0xff, 0xf7, 0xda, - 0xfd, 0x07, 0x90, 0x38, 0x0c, 0x00, 0x07, 0x00, - 0x0f, 0xff, 0xf7, 0xd4, 0xfd, 0x06, 0x90, 0x38, - 0x0a, 0x00, 0x07, 0x00, 0x0f, 0xff, 0xf7, 0xce, - 0xfd, 0x05, 0x90, 0x38, 0x07, 0x00, 0x0f, 0xff, - 0xf7, 0xc9, 0xfd, 0x00, 0xa1, 0x7a, 0x09, 0xcc, - 0x39, 0x92, 0x07, 0x92, 0x0f, 0x1c, 0xd0, 0x01, - 0x2a, 0x1c, 0xd0, 0x02, 0x2a, 0x1c, 0xd0, 0x03, - 0x2a, 0x01, 0xd1, 0x00, 0xa1, 0xc8, 0x39, 0x08, - 0x9a, 0x03, 0x2a, 0x17, 0xd1, 0x05, 0x9a, 0x03, - 0x91, 0x04, 0x92, 0x06, 0x9a, 0x07, 0x99, 0x01, - 0x92, 0x00, 0x91, 0x31, 0x1c, 0x22, 0x1c, 0x02, - 0x90, 0x17, 0xa0, 0x2b, 0x1c, 0xfa, 0xf7, 0x91, - 0xfb, 0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x1a, 0xa1, 0xe8, 0xe7, 0x1a, 0xa1, 0xe6, - 0xe7, 0x1a, 0xa1, 0xe4, 0xe7, 0x02, 0x2a, 0x0c, - 0xd1, 0x05, 0x9a, 0x02, 0x91, 0x03, 0x92, 0x06, - 0x9a, 0x31, 0x1c, 0x00, 0x92, 0x22, 0x1c, 0x01, - 0x90, 0x15, 0xa0, 0x2b, 0x1c, 0xfa, 0xf7, 0x79, - 0xfb, 0xe6, 0xe7, 0x01, 0x2a, 0x0c, 0xd1, 0x05, - 0x9a, 0x02, 0x91, 0x03, 0x92, 0x07, 0x9a, 0x31, - 0x1c, 0x00, 0x92, 0x22, 0x1c, 0x01, 0x90, 0x0e, - 0xa0, 0x2b, 0x1c, 0xfa, 0xf7, 0x6a, 0xfb, 0xd7, - 0xe7, 0xd6, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0xed, 0x09, 0x00, 0x1f, 0x02, - 0x2c, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, - 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x00, 0x00, - 0x00, 0x00, 0x4c, 0x53, 0x4c, 0x00, 0x4c, 0x53, - 0x52, 0x00, 0x41, 0x53, 0x52, 0x00, 0x20, 0x25, - 0x73, 0x25, 0x73, 0x25, 0x73, 0x09, 0x25, 0x73, - 0x2c, 0x20, 0x25, 0x73, 0x20, 0x25, 0x73, 0x20, - 0x25, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, - 0x08, 0xd0, 0x42, 0x08, 0x03, 0xd3, 0x03, 0x4b, - 0x40, 0x08, 0x18, 0x43, 0x00, 0xe0, 0x40, 0x08, - 0x01, 0x39, 0xf6, 0xd1, 0x70, 0x47, 0x00, 0x00, - 0x00, 0x80, 0xff, 0xb5, 0x87, 0xb0, 0x48, 0x0d, - 0x00, 0x07, 0x00, 0x0f, 0x0f, 0x1c, 0x06, 0xa9, - 0x1c, 0x1c, 0xff, 0xf7, 0xc2, 0xfc, 0x06, 0x1c, - 0x20, 0x1c, 0xff, 0xf7, 0x4c, 0xfc, 0x04, 0x1c, - 0x78, 0x0d, 0x01, 0xd3, 0x2f, 0xa3, 0x01, 0xe0, - 0x00, 0xa3, 0x88, 0x3b, 0x38, 0x0b, 0x00, 0x07, - 0x00, 0x0f, 0x05, 0x93, 0xff, 0xf7, 0x35, 0xfd, - 0x04, 0x90, 0x38, 0x0c, 0x00, 0x07, 0x00, 0x0f, - 0xff, 0xf7, 0x2f, 0xfd, 0x3d, 0x06, 0x2d, 0x0e, - 0x39, 0x0a, 0x09, 0x07, 0x03, 0x90, 0x06, 0x98, - 0x09, 0x0f, 0x4f, 0x00, 0x03, 0x28, 0x1f, 0xd1, - 0x28, 0x1c, 0x39, 0x1c, 0xff, 0xf7, 0xc3, 0xff, - 0x02, 0x1c, 0x03, 0x99, 0x04, 0x98, 0x01, 0x91, - 0x31, 0x1c, 0x02, 0x92, 0x00, 0x90, 0x1d, 0xa0, - 0x22, 0x1c, 0x05, 0x9b, 0xfa, 0xf7, 0xfc, 0xfa, - 0x03, 0x98, 0x00, 0x23, 0xc0, 0x56, 0x70, 0x28, - 0x0a, 0xd1, 0x28, 0x1c, 0x39, 0x1c, 0xff, 0xf7, - 0xae, 0xff, 0x07, 0x99, 0x40, 0x18, 0xc1, 0x1d, - 0x01, 0x31, 0x1a, 0xa0, 0xfa, 0xf7, 0xec, 0xfa, - 0x06, 0x98, 0x02, 0x28, 0x0c, 0xd1, 0x28, 0x1c, - 0x39, 0x1c, 0xff, 0xf7, 0xa0, 0xff, 0x03, 0x99, - 0x01, 0x90, 0x00, 0x91, 0x31, 0x1c, 0xed, 0x09, - 0x00, 0x20, 0x02, 0x22, 0x1c, 0x16, 0xa0, 0x05, - 0x9b, 0xfa, 0xf7, 0xdc, 0xfa, 0x06, 0x98, 0x01, - 0x28, 0x0c, 0xd1, 0x28, 0x1c, 0x39, 0x1c, 0xff, - 0xf7, 0x90, 0xff, 0x04, 0x99, 0x01, 0x90, 0x00, - 0x91, 0x31, 0x1c, 0x22, 0x1c, 0x0e, 0xa0, 0x05, - 0x9b, 0xfa, 0xf7, 0xcc, 0xfa, 0x0b, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x53, - 0x00, 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, - 0x25, 0x73, 0x09, 0x25, 0x73, 0x2c, 0x20, 0x25, - 0x73, 0x2c, 0x20, 0x23, 0x30, 0x78, 0x25, 0x58, - 0x00, 0x00, 0x00, 0x20, 0x20, 0x3b, 0x20, 0x23, - 0x30, 0x78, 0x25, 0x58, 0x00, 0x00, 0x00, 0x20, - 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x09, 0x25, - 0x73, 0x2c, 0x20, 0x23, 0x30, 0x78, 0x25, 0x58, - 0x00, 0x00, 0x00, 0xff, 0xb5, 0x82, 0xb0, 0x18, - 0x1c, 0x0f, 0x1c, 0xff, 0xf7, 0xc6, 0xfb, 0x04, - 0x1c, 0xf8, 0x0d, 0x02, 0xd3, 0x00, 0xa3, 0x50, - 0x3b, 0x00, 0xe0, 0x0c, 0xa3, 0x38, 0x07, 0x00, - 0x0f, 0x1e, 0x1c, 0xff, 0xf7, 0xb0, 0xfc, 0x05, - 0x1c, 0x38, 0x0c, 0x00, 0x07, 0x00, 0x0f, 0xff, - 0xf7, 0x1a, 0xfd, 0x00, 0x90, 0x04, 0x9a, 0x01, - 0x95, 0x51, 0x68, 0x22, 0x1c, 0x33, 0x1c, 0x04, - 0xa0, 0xfa, 0xf7, 0x88, 0xfa, 0x06, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x43, - 0x00, 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0x50, 0x53, 0x52, 0x25, 0x73, - 0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, 0xff, - 0xb5, 0x82, 0xb0, 0x18, 0x1c, 0x0f, 0x1c, 0xff, - 0xf7, 0x94, 0xfb, 0x04, 0x1c, 0xf8, 0x0d, 0x02, - 0xd3, 0x00, 0xa3, 0xb4, 0x3b, 0x01, 0xe0, 0x00, - 0xa3, 0x34, 0x3b, 0x38, 0x0c, 0x00, 0x07, 0x00, - 0x0f, 0x1e, 0x1c, 0xff, 0xf7, 0xec, 0xfc, 0x05, - 0x1c, 0xed, 0x09, 0x00, 0x21, 0x02, 0x38, 0x0a, - 0x00, 0x07, 0x00, 0x0f, 0x3a, 0x06, 0x12, 0x0e, - 0x41, 0x00, 0x10, 0x1c, 0xff, 0xf7, 0x14, 0xff, - 0x01, 0x90, 0x04, 0x9a, 0x00, 0x95, 0x51, 0x68, - 0x22, 0x1c, 0x33, 0x1c, 0x03, 0xa0, 0xfa, 0xf7, - 0x50, 0xfa, 0x06, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, - 0x73, 0x09, 0x25, 0x73, 0x50, 0x53, 0x52, 0x25, - 0x73, 0x2c, 0x20, 0x23, 0x30, 0x78, 0x25, 0x58, - 0x00, 0x00, 0x00, 0x00, 0xf8, 0xb5, 0x18, 0x1c, - 0x0c, 0x1c, 0x15, 0x1c, 0xff, 0xf7, 0x5c, 0xfb, - 0x07, 0x1c, 0xe0, 0x0d, 0x01, 0xd3, 0x0a, 0xa2, - 0x01, 0xe0, 0x00, 0xa2, 0xa0, 0x3a, 0x20, 0x0b, - 0x00, 0x07, 0x00, 0x0f, 0x16, 0x1c, 0xff, 0xf7, - 0x45, 0xfc, 0x3a, 0x1c, 0x03, 0x1c, 0x00, 0x96, - 0x69, 0x68, 0x04, 0xa0, 0xfa, 0xf7, 0x25, 0xfa, - 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x53, 0x00, 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, - 0x73, 0x09, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, - 0x50, 0x53, 0x52, 0x00, 0xff, 0xb5, 0x8a, 0xb0, - 0x18, 0x1c, 0x0c, 0x1c, 0xff, 0xf7, 0x34, 0xfb, - 0x09, 0x90, 0x01, 0x20, 0x01, 0x1c, 0x62, 0x0e, - 0x00, 0xd2, 0x00, 0x21, 0x08, 0x91, 0x06, 0x1c, - 0x21, 0x0e, 0x00, 0xd2, 0x00, 0x26, 0x01, 0x1c, - 0xe2, 0x0d, 0x00, 0xd2, 0x00, 0x21, 0x07, 0x91, - 0x01, 0x1c, 0xa2, 0x0d, 0x00, 0xd2, 0x00, 0x21, - 0x06, 0x91, 0x61, 0x0d, 0x00, 0xd2, 0x00, 0x20, - 0x05, 0x90, 0x20, 0x0b, 0x00, 0x07, 0x00, 0x0f, - 0xff, 0xf7, 0x0c, 0xfc, 0x04, 0x90, 0x20, 0x0c, - 0x00, 0x07, 0x00, 0x0f, 0xff, 0xf7, 0x06, 0xfc, - 0x27, 0x05, 0x3f, 0x0d, 0x05, 0x1c, 0x08, 0x98, - 0x01, 0x28, 0x5a, 0xd1, 0x21, 0x05, 0x09, 0x0d, - 0x06, 0x98, 0x4c, 0x42, 0xed, 0x09, 0x00, 0x22, - 0x02, 0x00, 0x28, 0x29, 0xd1, 0x3a, 0x1c, 0x00, - 0x2e, 0x02, 0xd0, 0x00, 0xa1, 0xc8, 0x39, 0x00, - 0xe0, 0x49, 0xa1, 0x03, 0x92, 0x02, 0x91, 0x07, - 0x99, 0x04, 0x9a, 0x01, 0x95, 0x00, 0x29, 0x00, - 0x92, 0x01, 0xd0, 0x46, 0xa2, 0x01, 0xe0, 0x00, - 0xa2, 0xe4, 0x3a, 0x05, 0x98, 0x00, 0x28, 0x01, - 0xd0, 0x43, 0xa1, 0x00, 0xe0, 0x43, 0xa1, 0x09, - 0x9b, 0x43, 0xa0, 0xfa, 0xf7, 0xc4, 0xf9, 0x00, - 0x23, 0xe8, 0x56, 0x70, 0x28, 0x68, 0xd1, 0x00, - 0x2e, 0x00, 0xd1, 0x27, 0x1c, 0x0a, 0x98, 0x39, - 0x18, 0x44, 0x48, 0xfa, 0xf7, 0xb8, 0xf9, 0x6b, - 0xe0, 0x06, 0x98, 0x01, 0x28, 0x27, 0xd1, 0x3a, - 0x1c, 0x00, 0x2e, 0x01, 0xd0, 0x40, 0xa1, 0x00, - 0xe0, 0x33, 0xa1, 0x03, 0x92, 0x02, 0x91, 0x07, - 0x99, 0x04, 0x9a, 0x01, 0x95, 0x00, 0x29, 0x00, - 0x92, 0x01, 0xd0, 0x30, 0xa2, 0x00, 0xe0, 0x3a, - 0xa2, 0x05, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x2e, - 0xa1, 0x00, 0xe0, 0x2e, 0xa1, 0x09, 0x9b, 0x37, - 0xa0, 0xfa, 0xf7, 0x99, 0xf9, 0x00, 0x23, 0xe8, - 0x56, 0x70, 0x28, 0x3d, 0xd1, 0x00, 0x2e, 0x00, - 0xd1, 0x27, 0x1c, 0x0a, 0x98, 0x39, 0x18, 0x2f, - 0x48, 0xfa, 0xf7, 0x8d, 0xf9, 0x40, 0xe0, 0x08, - 0x98, 0x00, 0x28, 0x3d, 0xd1, 0x06, 0x98, 0x01, - 0x28, 0x1b, 0xd1, 0x3a, 0x1c, 0x00, 0x2e, 0x01, - 0xd0, 0x29, 0xa1, 0x00, 0xe0, 0x1c, 0xa1, 0x03, - 0x92, 0x02, 0x91, 0x07, 0x99, 0x04, 0x9a, 0x01, - 0x95, 0x00, 0x29, 0x00, 0x92, 0x01, 0xd0, 0x19, - 0xa2, 0x00, 0xe0, 0x23, 0xa2, 0x05, 0x98, 0x00, - 0x28, 0x01, 0xd0, 0x17, 0xa1, 0x00, 0xe0, 0x17, - 0xa1, 0x09, 0x9b, 0x27, 0xa0, 0xfa, 0xf7, 0x6b, - 0xf9, 0x1e, 0xe0, 0x06, 0x98, 0x00, 0x28, 0x1b, - 0xd1, 0x3a, 0x1c, 0x00, 0x2e, 0x01, 0xd0, 0xed, - 0x09, 0x00, 0x23, 0x02, 0x1a, 0xa1, 0x00, 0xe0, - 0x0d, 0xa1, 0x03, 0x92, 0x02, 0x91, 0x07, 0x99, - 0x04, 0x9a, 0x01, 0x95, 0x00, 0x29, 0x00, 0x92, - 0x02, 0xd0, 0x09, 0xa2, 0x01, 0xe0, 0x0a, 0xe0, - 0x13, 0xa2, 0x05, 0x98, 0x00, 0x28, 0x01, 0xd0, - 0x07, 0xa1, 0x00, 0xe0, 0x07, 0xa1, 0x09, 0x9b, - 0x1e, 0xa0, 0xfa, 0xf7, 0x4b, 0xf9, 0x0e, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x2d, 0x00, - 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x4c, 0x44, - 0x52, 0x00, 0x53, 0x54, 0x52, 0x00, 0x20, 0x25, - 0x73, 0x25, 0x73, 0x25, 0x73, 0x09, 0x25, 0x73, - 0x2c, 0x20, 0x5b, 0x25, 0x73, 0x2c, 0x20, 0x23, - 0x25, 0x73, 0x30, 0x78, 0x25, 0x58, 0x5d, 0x00, - 0x00, 0x00, 0xf8, 0x1b, 0x02, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, - 0x73, 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, - 0x73, 0x2c, 0x20, 0x23, 0x25, 0x73, 0x30, 0x78, - 0x25, 0x58, 0x5d, 0x21, 0x00, 0x00, 0x20, 0x25, - 0x73, 0x25, 0x73, 0x25, 0x73, 0x54, 0x09, 0x25, - 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, 0x5d, 0x2c, - 0x20, 0x23, 0x25, 0x73, 0x30, 0x78, 0x25, 0x58, - 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, - 0x73, 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, - 0x73, 0x5d, 0x2c, 0x20, 0x23, 0x25, 0x73, 0x30, - 0x78, 0x25, 0x58, 0x00, 0x00, 0x00, 0xf0, 0xb5, - 0x8b, 0xb0, 0x18, 0x1c, 0x0f, 0x1c, 0xff, 0xf7, - 0x20, 0xfa, 0x04, 0x1c, 0x01, 0x20, 0x01, 0x1c, - 0x7a, 0x0e, 0x00, 0xd2, 0x00, 0x21, 0x0a, 0x91, - 0x06, 0x1c, 0x39, 0x0e, 0x00, 0xd2, 0x00, 0x26, - 0x05, 0x1c, 0xf9, 0x0d, 0x00, 0xd2, 0x00, 0x25, - 0x01, 0x1c, 0xba, 0x0d, 0x00, 0xd2, 0x00, 0x21, - 0x09, 0x91, 0x79, 0x0d, 0x00, 0xd2, 0x00, 0x20, - 0x08, 0x90, 0xed, 0x09, 0x00, 0x24, 0x02, 0x38, - 0x0b, 0x00, 0x07, 0x00, 0x0f, 0xff, 0xf7, 0xf9, - 0xfa, 0x07, 0x90, 0x38, 0x0c, 0x00, 0x07, 0x00, - 0x0f, 0xff, 0xf7, 0xf3, 0xfa, 0x06, 0x90, 0x38, - 0x07, 0x00, 0x0f, 0xff, 0xf7, 0xee, 0xfa, 0xfa, - 0x09, 0xd2, 0x06, 0xd2, 0x0e, 0x7b, 0x09, 0x9b, - 0x07, 0x9b, 0x0f, 0x8a, 0xa1, 0x09, 0xd0, 0x01, - 0x2b, 0x09, 0xd0, 0x02, 0x2b, 0x09, 0xd0, 0x03, - 0x2b, 0x0a, 0xd1, 0x00, 0x2a, 0x07, 0xd1, 0x87, - 0xa1, 0x06, 0xe0, 0x87, 0xa1, 0x04, 0xe0, 0x87, - 0xa1, 0x02, 0xe0, 0x87, 0xa1, 0x00, 0xe0, 0x87, - 0xa1, 0x0a, 0x9b, 0x01, 0x2b, 0x65, 0xd1, 0x09, - 0x9b, 0x00, 0x2b, 0x3a, 0xd1, 0x00, 0x2a, 0x1b, - 0xd1, 0x02, 0x1c, 0x00, 0x2e, 0x01, 0xd0, 0x82, - 0xa1, 0x00, 0xe0, 0x82, 0xa1, 0x03, 0x92, 0x07, - 0x9a, 0x06, 0x98, 0x02, 0x91, 0x00, 0x2d, 0x00, - 0x92, 0x01, 0x90, 0x01, 0xd0, 0x7f, 0xa2, 0x00, - 0xe0, 0x7c, 0xa2, 0x08, 0x98, 0x00, 0x28, 0x01, - 0xd0, 0x7d, 0xa1, 0x00, 0xe0, 0x7d, 0xa1, 0x23, - 0x1c, 0x7d, 0xa0, 0xfa, 0xf7, 0x99, 0xf8, 0xc4, - 0xe0, 0x05, 0x92, 0x04, 0x91, 0x03, 0x90, 0x00, - 0x2e, 0x01, 0xd0, 0x73, 0xa2, 0x00, 0xe0, 0x73, - 0xa2, 0x07, 0x98, 0x06, 0x99, 0x02, 0x92, 0x00, - 0x2d, 0x00, 0x90, 0x01, 0x91, 0x01, 0xd0, 0x70, - 0xa2, 0x00, 0xe0, 0x6d, 0xa2, 0x08, 0x98, 0x00, - 0x28, 0x01, 0xd0, 0x6e, 0xa1, 0x00, 0xe0, 0x6e, - 0xa1, 0x23, 0x1c, 0x74, 0xa0, 0xfa, 0xf7, 0x7c, - 0xf8, 0xa7, 0xe0, 0x09, 0x9b, 0x01, 0x2b, 0x24, - 0xd1, 0x00, 0x2a, 0x1b, 0xd1, 0x02, 0x1c, 0x00, - 0x2e, 0x01, 0xd0, 0x63, 0xa1, 0x00, 0xe0, 0x63, - 0xa1, 0x03, 0x92, 0x07, 0x9a, 0x06, 0x98, 0x02, - 0x91, 0x00, 0x2d, 0x00, 0x92, 0x01, 0x90, 0x01, - 0xd0, 0x60, 0xa2, 0x00, 0xe0, 0xed, 0x09, 0x00, - 0x25, 0x02, 0x5d, 0xa2, 0x08, 0x98, 0x00, 0x28, - 0x01, 0xd0, 0x5e, 0xa1, 0x00, 0xe0, 0x5e, 0xa1, - 0x23, 0x1c, 0x6d, 0xa0, 0xfa, 0xf7, 0x5b, 0xf8, - 0x86, 0xe0, 0x05, 0x92, 0x04, 0x91, 0x03, 0x90, - 0x00, 0x2e, 0x02, 0xd0, 0x54, 0xa2, 0x01, 0xe0, - 0x15, 0xe0, 0x54, 0xa2, 0x07, 0x98, 0x06, 0x99, - 0x02, 0x92, 0x00, 0x2d, 0x00, 0x90, 0x01, 0x91, - 0x01, 0xd0, 0x51, 0xa2, 0x00, 0xe0, 0x4e, 0xa2, - 0x08, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x4f, 0xa1, - 0x00, 0xe0, 0x4f, 0xa1, 0x23, 0x1c, 0x65, 0xa0, - 0xfa, 0xf7, 0x3d, 0xf8, 0x68, 0xe0, 0x0a, 0x9b, - 0x00, 0x2b, 0x65, 0xd1, 0x09, 0x9b, 0x01, 0x2b, - 0x3a, 0xd1, 0x00, 0x2a, 0x1b, 0xd1, 0x02, 0x1c, - 0x00, 0x2e, 0x01, 0xd0, 0x42, 0xa1, 0x00, 0xe0, - 0x42, 0xa1, 0x03, 0x92, 0x07, 0x9a, 0x06, 0x98, - 0x02, 0x91, 0x00, 0x2d, 0x00, 0x92, 0x01, 0x90, - 0x01, 0xd0, 0x3f, 0xa2, 0x00, 0xe0, 0x3c, 0xa2, - 0x08, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x3d, 0xa1, - 0x00, 0xe0, 0x3d, 0xa1, 0x23, 0x1c, 0x5c, 0xa0, - 0xfa, 0xf7, 0x19, 0xf8, 0x5a, 0xe0, 0x05, 0x92, - 0x04, 0x91, 0x03, 0x90, 0x00, 0x2e, 0x01, 0xd0, - 0x33, 0xa2, 0x00, 0xe0, 0x33, 0xa2, 0x07, 0x98, - 0x06, 0x99, 0x02, 0x92, 0x00, 0x2d, 0x00, 0x90, - 0x01, 0x91, 0x01, 0xd0, 0x30, 0xa2, 0x00, 0xe0, - 0x2d, 0xa2, 0x08, 0x98, 0x00, 0x28, 0x01, 0xd0, - 0x2e, 0xa1, 0x00, 0xe0, 0x2e, 0xa1, 0x23, 0x1c, - 0x54, 0xa0, 0xf9, 0xf7, 0xfc, 0xff, 0x3d, 0xe0, - 0x09, 0x9b, 0x00, 0x2b, 0x24, 0xd1, 0x00, 0x2a, - 0x1b, 0xd1, 0x02, 0x1c, 0x00, 0x2e, 0x01, 0xd0, - 0x23, 0xa1, 0x00, 0xe0, 0x23, 0xa1, 0x03, 0x92, - 0x07, 0x9a, 0x06, 0x98, 0x02, 0x91, 0x00, 0x2d, - 0x00, 0x92, 0x01, 0x90, 0x01, 0xd0, 0x20, 0xa2, - 0xed, 0x09, 0x00, 0x26, 0x02, 0x00, 0xe0, 0x1d, - 0xa2, 0x08, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x1e, - 0xa1, 0x00, 0xe0, 0x1e, 0xa1, 0x23, 0x1c, 0x4d, - 0xa0, 0xf9, 0xf7, 0xdb, 0xff, 0x1c, 0xe0, 0x05, - 0x92, 0x04, 0x91, 0x03, 0x90, 0x00, 0x2e, 0x02, - 0xd0, 0x14, 0xa2, 0x01, 0xe0, 0x14, 0xe0, 0x14, - 0xa2, 0x07, 0x98, 0x06, 0x99, 0x02, 0x92, 0x00, - 0x2d, 0x00, 0x90, 0x01, 0x91, 0x01, 0xd0, 0x11, - 0xa2, 0x00, 0xe0, 0x0e, 0xa2, 0x08, 0x98, 0x00, - 0x28, 0x01, 0xd0, 0x0f, 0xa1, 0x00, 0xe0, 0x0f, - 0xa1, 0x23, 0x1c, 0x44, 0xa0, 0xf9, 0xf7, 0xbd, - 0xff, 0x0b, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, - 0x00, 0x52, 0x52, 0x58, 0x00, 0x4c, 0x53, 0x4c, - 0x00, 0x4c, 0x53, 0x52, 0x00, 0x41, 0x53, 0x52, - 0x00, 0x52, 0x4f, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2d, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, - 0x00, 0x4c, 0x44, 0x52, 0x00, 0x53, 0x54, 0x52, - 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, - 0x2c, 0x20, 0x23, 0x25, 0x73, 0x25, 0x73, 0x5d, - 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, - 0x2c, 0x20, 0x23, 0x25, 0x73, 0x25, 0x73, 0x2c, - 0x20, 0x25, 0x73, 0x20, 0x30, 0x78, 0x25, 0x58, - 0x5d, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, 0x73, - 0x25, 0x73, 0x25, 0x73, 0x09, 0x25, 0x73, 0x2c, - 0x20, 0x5b, 0x25, 0x73, 0x2c, 0x20, 0x23, 0x25, - 0x73, 0x25, 0x73, 0x5d, 0x21, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, - 0x2c, 0x20, 0x23, 0x25, 0x73, 0x25, 0x73, 0x2c, - 0x20, 0x25, 0x73, 0xed, 0x09, 0x00, 0x27, 0x02, - 0x20, 0x30, 0x78, 0x25, 0x58, 0x5d, 0x21, 0x00, - 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, - 0x73, 0x54, 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, - 0x25, 0x73, 0x5d, 0x2c, 0x20, 0x23, 0x25, 0x73, - 0x25, 0x73, 0x00, 0x00, 0x00, 0x00, 0x20, 0x25, - 0x73, 0x25, 0x73, 0x25, 0x73, 0x54, 0x09, 0x25, - 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, 0x5d, 0x2c, - 0x20, 0x23, 0x25, 0x73, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x20, 0x30, 0x78, 0x25, 0x58, 0x00, - 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, - 0x73, 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, - 0x73, 0x5d, 0x2c, 0x20, 0x23, 0x25, 0x73, 0x25, - 0x73, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, 0x25, - 0x73, 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, - 0x73, 0x5d, 0x2c, 0x20, 0x23, 0x25, 0x73, 0x25, - 0x73, 0x2c, 0x20, 0x25, 0x73, 0x20, 0x30, 0x78, - 0x25, 0x58, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, - 0x86, 0xb0, 0x18, 0x1c, 0x0f, 0x1c, 0xff, 0xf7, - 0x42, 0xf8, 0x01, 0x26, 0x31, 0x1c, 0x04, 0x1c, - 0xb8, 0x0d, 0x00, 0xd2, 0x00, 0x21, 0x05, 0x91, - 0x78, 0x0d, 0x00, 0xd2, 0x00, 0x26, 0x38, 0x0c, - 0x00, 0x07, 0x00, 0x0f, 0xff, 0xf7, 0x29, 0xf9, - 0x05, 0x1c, 0x38, 0x0b, 0x00, 0x07, 0x00, 0x0f, - 0xff, 0xf7, 0x23, 0xf9, 0x04, 0x90, 0x38, 0x0a, - 0x00, 0x07, 0x00, 0x0f, 0xff, 0xf7, 0x1d, 0xf9, - 0x03, 0x90, 0x38, 0x07, 0x00, 0x0f, 0xff, 0xf7, - 0x18, 0xf9, 0x05, 0x99, 0x00, 0x29, 0x10, 0xd0, - 0x03, 0x99, 0x04, 0x9a, 0x00, 0x90, 0x00, 0x2e, - 0x01, 0x91, 0x02, 0x92, 0x01, 0xd0, 0x0d, 0xa2, - 0x01, 0xe0, 0x00, 0xa2, 0xcc, 0x3a, 0x21, 0x1c, - 0x2b, 0x1c, 0x0b, 0xa0, 0xf9, 0xf7, 0xec, 0xfe, - 0x0d, 0xe0, 0x03, 0x9a, 0x00, 0x90, 0xed, 0x09, - 0x00, 0x28, 0x02, 0x00, 0x2e, 0x01, 0x92, 0x01, - 0xd0, 0x06, 0xa2, 0x01, 0xe0, 0x00, 0xa2, 0xe8, - 0x3a, 0x21, 0x1c, 0x2b, 0x1c, 0x0a, 0xa0, 0xf9, - 0xf7, 0xdd, 0xfe, 0x06, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x53, 0x00, 0x00, 0x00, 0x20, - 0x4d, 0x4c, 0x41, 0x25, 0x73, 0x25, 0x73, 0x09, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x00, 0x20, - 0x4d, 0x55, 0x4c, 0x25, 0x73, 0x25, 0x73, 0x09, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x00, 0xf0, 0xb5, 0x88, 0xb0, 0x18, - 0x1c, 0x0f, 0x1c, 0xfe, 0xf7, 0xde, 0xff, 0x01, - 0x25, 0x29, 0x1c, 0x04, 0x1c, 0xb8, 0x0d, 0x00, - 0xd2, 0x00, 0x21, 0x2e, 0x1c, 0x78, 0x0d, 0x07, - 0x91, 0x00, 0xd2, 0x00, 0x26, 0xf8, 0x0d, 0x00, - 0xd2, 0x00, 0x25, 0x38, 0x0b, 0x00, 0x07, 0x00, - 0x0f, 0xff, 0xf7, 0xc1, 0xf8, 0x06, 0x90, 0x38, - 0x0c, 0x00, 0x07, 0x00, 0x0f, 0xff, 0xf7, 0xbb, - 0xf8, 0x05, 0x90, 0x38, 0x07, 0x00, 0x0f, 0xff, - 0xf7, 0xb6, 0xf8, 0x04, 0x90, 0x38, 0x0a, 0x00, - 0x07, 0x00, 0x0f, 0xff, 0xf7, 0xb0, 0xf8, 0x07, - 0x99, 0x00, 0x29, 0x18, 0xd0, 0x02, 0x1c, 0x03, - 0x92, 0x06, 0x9a, 0x05, 0x98, 0x04, 0x99, 0x00, - 0x2e, 0x00, 0x92, 0x01, 0x90, 0x02, 0x91, 0x02, - 0xd0, 0x00, 0xa3, 0xa0, 0x3b, 0x00, 0xe0, 0x13, - 0xa3, 0x00, 0x2d, 0x01, 0xd0, 0x13, 0xa1, 0x01, - 0xe0, 0x00, 0xa1, 0xb0, 0x39, 0x22, 0x1c, 0x11, - 0xa0, 0xf9, 0xf7, 0x7c, 0xfe, 0x17, 0xe0, 0x02, - 0x1c, 0x03, 0x92, 0x06, 0x9a, 0x05, 0x98, 0x04, - 0x99, 0x00, 0x2e, 0x00, 0x92, 0x01, 0x90, 0x02, - 0x91, 0x02, 0xd0, 0x00, 0xa3, 0xd4, 0x3b, 0x00, - 0xe0, 0x07, 0xa3, 0x00, 0x2d, 0x01, 0xd0, 0x06, - 0xa1, 0xed, 0x09, 0x00, 0x29, 0x02, 0x01, 0xe0, - 0x00, 0xa1, 0xe4, 0x39, 0x22, 0x1c, 0x0c, 0xa0, - 0xf9, 0xf7, 0x63, 0xfe, 0x08, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, - 0x55, 0x00, 0x00, 0x00, 0x20, 0x25, 0x73, 0x4d, - 0x4c, 0x41, 0x4c, 0x25, 0x73, 0x25, 0x73, 0x09, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, - 0x20, 0x25, 0x73, 0x4d, 0x55, 0x4c, 0x4c, 0x25, - 0x73, 0x25, 0x73, 0x09, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x2c, 0x20, - 0x25, 0x73, 0x00, 0x00, 0xff, 0xb5, 0x90, 0xb0, - 0x13, 0x98, 0x0f, 0x1c, 0xfe, 0xf7, 0x5c, 0xff, - 0x04, 0x1c, 0x01, 0x20, 0x01, 0x1c, 0x7a, 0x0e, - 0x00, 0xd2, 0x00, 0x21, 0x0c, 0x91, 0x06, 0x1c, - 0x39, 0x0e, 0x00, 0xd2, 0x00, 0x26, 0x01, 0x1c, - 0xfa, 0x0d, 0x00, 0xd2, 0x00, 0x21, 0x0b, 0x91, - 0x05, 0x1c, 0xb9, 0x0d, 0x00, 0xd2, 0x00, 0x25, - 0x01, 0x1c, 0x7a, 0x0d, 0x00, 0xd2, 0x00, 0x21, - 0x0a, 0x91, 0x01, 0x1c, 0xfa, 0x09, 0x00, 0xd2, - 0x00, 0x21, 0x09, 0x91, 0xb9, 0x09, 0x00, 0xd2, - 0x00, 0x20, 0x08, 0x90, 0x38, 0x07, 0x00, 0x0f, - 0x0f, 0x90, 0xff, 0xf7, 0x2b, 0xf8, 0x06, 0x90, - 0x0f, 0x20, 0x00, 0x02, 0x38, 0x40, 0x0f, 0x99, - 0x00, 0x09, 0x08, 0x43, 0x02, 0x1c, 0x39, 0x0b, - 0x09, 0x07, 0x09, 0x0f, 0x0e, 0x91, 0x39, 0x0c, - 0x09, 0x07, 0x05, 0x90, 0x0b, 0x98, 0x09, 0x0f, - 0x0d, 0x91, 0x01, 0x28, 0x68, 0xd1, 0x0d, 0x98, - 0xff, 0xf7, 0x14, 0xf8, 0x07, 0x90, 0x0e, 0x98, - 0xff, 0xf7, 0x10, 0xf8, 0x0c, 0x99, 0x01, 0x29, - 0x4a, 0xd1, 0x00, 0x2d, 0x23, 0xd1, 0x05, 0x9a, - 0x00, 0x2e, 0x02, 0xd0, 0x00, 0xa1, 0xe4, 0x39, - 0x00, 0xe0, 0x7c, 0xa1, 0xed, 0x09, 0x00, 0x2a, - 0x02, 0x02, 0x90, 0x08, 0x98, 0x04, 0x92, 0x07, - 0x9a, 0x03, 0x91, 0x00, 0x28, 0x01, 0xd0, 0x79, - 0xa1, 0x00, 0xe0, 0x79, 0xa1, 0x01, 0x92, 0x00, - 0x91, 0x09, 0x99, 0x00, 0x29, 0x01, 0xd0, 0x77, - 0xa3, 0x00, 0xe0, 0x77, 0xa3, 0x0a, 0x99, 0x00, - 0x29, 0x01, 0xd0, 0x76, 0xa1, 0x00, 0xe0, 0x76, - 0xa1, 0x22, 0x1c, 0x76, 0xa0, 0xf9, 0xf7, 0xcf, - 0xfd, 0xd6, 0xe0, 0x01, 0x2d, 0x22, 0xd1, 0x05, - 0x9a, 0x00, 0x2e, 0x01, 0xd0, 0x6e, 0xa1, 0x00, - 0xe0, 0x69, 0xa1, 0x02, 0x90, 0x08, 0x98, 0x04, - 0x92, 0x07, 0x9a, 0x03, 0x91, 0x00, 0x28, 0x01, - 0xd0, 0x66, 0xa1, 0x00, 0xe0, 0x66, 0xa1, 0x01, - 0x92, 0x00, 0x91, 0x09, 0x99, 0x00, 0x29, 0x01, - 0xd0, 0x64, 0xa3, 0x00, 0xe0, 0x64, 0xa3, 0x0a, - 0x99, 0x00, 0x29, 0x01, 0xd0, 0x63, 0xa1, 0x00, - 0xe0, 0x63, 0xa1, 0x22, 0x1c, 0x6a, 0xa0, 0xf9, - 0xf7, 0xaa, 0xfd, 0xb1, 0xe0, 0x0c, 0x99, 0x00, - 0x29, 0x25, 0xd1, 0x00, 0x2d, 0x23, 0xd1, 0x05, - 0x9a, 0x00, 0x2e, 0x01, 0xd0, 0x5a, 0xa1, 0x00, - 0xe0, 0x55, 0xa1, 0x02, 0x90, 0x08, 0x98, 0x04, - 0x92, 0x07, 0x9a, 0x03, 0x91, 0x00, 0x28, 0x02, - 0xd0, 0x52, 0xa1, 0x01, 0xe0, 0x1a, 0xe0, 0x52, - 0xa1, 0x01, 0x92, 0x00, 0x91, 0x09, 0x99, 0x00, - 0x29, 0x01, 0xd0, 0x50, 0xa3, 0x00, 0xe0, 0x50, - 0xa3, 0x0a, 0x99, 0x00, 0x29, 0x01, 0xd0, 0x4f, - 0xa1, 0x00, 0xe0, 0x4f, 0xa1, 0x22, 0x1c, 0x5e, - 0xa0, 0xf9, 0xf7, 0x81, 0xfd, 0x88, 0xe0, 0x10, - 0x98, 0x12, 0x9a, 0x13, 0x9b, 0x39, 0x1c, 0xff, - 0xf7, 0x7d, 0xf8, 0x81, 0xe0, 0x0e, 0x98, 0xfe, - 0xf7, 0x8f, 0xff, 0x07, 0x90, 0x0d, 0x98, 0xfe, - 0xf7, 0x8b, 0xff, 0x0c, 0x99, 0x01, 0x29, 0x49, - 0xd1, 0x00, 0x2d, 0x22, 0xd1, 0x06, 0x9a, 0xed, - 0x09, 0x00, 0x2b, 0x02, 0x00, 0x2e, 0x01, 0xd0, - 0x3f, 0xa1, 0x00, 0xe0, 0x3a, 0xa1, 0x02, 0x90, - 0x08, 0x98, 0x04, 0x92, 0x07, 0x9a, 0x03, 0x91, - 0x00, 0x28, 0x01, 0xd0, 0x37, 0xa1, 0x00, 0xe0, - 0x37, 0xa1, 0x01, 0x92, 0x00, 0x91, 0x09, 0x99, - 0x00, 0x29, 0x01, 0xd0, 0x35, 0xa3, 0x00, 0xe0, - 0x35, 0xa3, 0x0a, 0x99, 0x00, 0x29, 0x01, 0xd0, - 0x34, 0xa1, 0x00, 0xe0, 0x34, 0xa1, 0x22, 0x1c, - 0x4a, 0xa0, 0xf9, 0xf7, 0x4b, 0xfd, 0x52, 0xe0, - 0x01, 0x2d, 0x22, 0xd1, 0x06, 0x9a, 0x00, 0x2e, - 0x01, 0xd0, 0x2c, 0xa1, 0x00, 0xe0, 0x27, 0xa1, - 0x02, 0x90, 0x08, 0x98, 0x04, 0x92, 0x07, 0x9a, - 0x03, 0x91, 0x00, 0x28, 0x01, 0xd0, 0x24, 0xa1, - 0x00, 0xe0, 0x24, 0xa1, 0x01, 0x92, 0x00, 0x91, - 0x09, 0x99, 0x00, 0x29, 0x01, 0xd0, 0x22, 0xa3, - 0x00, 0xe0, 0x22, 0xa3, 0x0a, 0x99, 0x00, 0x29, - 0x01, 0xd0, 0x21, 0xa1, 0x00, 0xe0, 0x21, 0xa1, - 0x22, 0x1c, 0x3e, 0xa0, 0xf9, 0xf7, 0x26, 0xfd, - 0x2d, 0xe0, 0x0c, 0x99, 0x00, 0x29, 0x24, 0xd1, - 0x00, 0x2d, 0x22, 0xd1, 0x06, 0x9a, 0x00, 0x2e, - 0x01, 0xd0, 0x18, 0xa1, 0x00, 0xe0, 0x13, 0xa1, - 0x02, 0x90, 0x08, 0x98, 0x04, 0x92, 0x07, 0x9a, - 0x03, 0x91, 0x00, 0x28, 0x01, 0xd0, 0x10, 0xa1, - 0x00, 0xe0, 0x10, 0xa1, 0x01, 0x92, 0x00, 0x91, - 0x09, 0x99, 0x00, 0x29, 0x01, 0xd0, 0x0e, 0xa3, - 0x00, 0xe0, 0x0e, 0xa3, 0x0a, 0x99, 0x00, 0x29, - 0x01, 0xd0, 0x0d, 0xa1, 0x00, 0xe0, 0x0d, 0xa1, - 0x22, 0x1c, 0x31, 0xa0, 0xf9, 0xf7, 0xfe, 0xfc, - 0x05, 0xe0, 0x10, 0x98, 0x12, 0x9a, 0x13, 0x9b, - 0x39, 0x1c, 0xfe, 0xf7, 0xfa, 0xff, 0x14, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x2d, 0x00, - 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x42, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x2c, 0x02, 0x53, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, - 0x44, 0x52, 0x00, 0x53, 0x54, 0x52, 0x00, 0x20, - 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, - 0x2c, 0x20, 0x23, 0x25, 0x73, 0x30, 0x78, 0x25, - 0x58, 0x5d, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, - 0x25, 0x73, 0x25, 0x73, 0x09, 0x25, 0x73, 0x2c, - 0x20, 0x5b, 0x25, 0x73, 0x2c, 0x20, 0x23, 0x25, - 0x73, 0x30, 0x78, 0x25, 0x58, 0x5d, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, - 0x25, 0x73, 0x25, 0x73, 0x09, 0x25, 0x73, 0x2c, - 0x20, 0x5b, 0x25, 0x73, 0x5d, 0x2c, 0x20, 0x23, - 0x25, 0x73, 0x30, 0x78, 0x25, 0x58, 0x00, 0x20, - 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, - 0x2c, 0x20, 0x25, 0x73, 0x25, 0x73, 0x5d, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x25, 0x73, 0x25, 0x73, - 0x25, 0x73, 0x25, 0x73, 0x09, 0x25, 0x73, 0x2c, - 0x20, 0x5b, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, - 0x25, 0x73, 0x5d, 0x21, 0x00, 0x00, 0x00, 0x20, - 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0x2c, 0x20, 0x5b, 0x25, 0x73, - 0x5d, 0x2c, 0x20, 0x25, 0x73, 0x25, 0x73, 0x00, - 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x83, 0xb0, 0x18, - 0x1c, 0x0f, 0x1c, 0xfe, 0xf7, 0xac, 0xfd, 0x01, - 0x26, 0x04, 0x1c, 0xf8, 0x0d, 0x00, 0xd2, 0x00, - 0x26, 0x38, 0x0b, 0x00, 0x07, 0x00, 0x0f, 0xfe, - 0xf7, 0x98, 0xfe, 0x05, 0x1c, 0x38, 0x07, 0x00, - 0x0f, 0xfe, 0xf7, 0x93, 0xfe, 0x02, 0x90, 0x38, - 0x0c, 0x00, 0x07, 0x00, 0x0f, 0xfe, 0xf7, 0x8d, - 0xfe, 0x02, 0x99, 0x01, 0x90, 0x00, 0x2e, 0x00, - 0x91, 0x01, 0xd0, 0x06, 0xa2, 0xed, 0x09, 0x00, - 0x2d, 0x02, 0x01, 0xe0, 0x00, 0xa2, 0xbc, 0x3a, - 0x21, 0x1c, 0x2b, 0x1c, 0x04, 0xa0, 0xf9, 0xf7, - 0x66, 0xfc, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, - 0x20, 0x53, 0x57, 0x50, 0x25, 0x73, 0x25, 0x73, - 0x09, 0x25, 0x73, 0x2c, 0x20, 0x25, 0x73, 0x2c, - 0x20, 0x5b, 0x25, 0x73, 0x5d, 0x00, 0x00, 0x00, - 0x90, 0xb5, 0x18, 0x1c, 0x0f, 0x1c, 0xfe, 0xf7, - 0x71, 0xfd, 0x04, 0x1c, 0x38, 0x07, 0x00, 0x0f, - 0xfe, 0xf7, 0x62, 0xfe, 0x21, 0x1c, 0x02, 0x1c, - 0x02, 0xa0, 0xf9, 0xf7, 0x44, 0xfc, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x20, 0x42, 0x58, 0x25, - 0x73, 0x09, 0x25, 0x73, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0xb5, 0x07, 0x1c, 0x00, 0x20, 0x7a, 0x4a, - 0x00, 0x21, 0x00, 0x25, 0x10, 0x70, 0xc0, 0x43, - 0x01, 0x26, 0x04, 0x1c, 0x02, 0xe0, 0x01, 0x23, - 0xd8, 0x42, 0x16, 0xd1, 0x32, 0x1c, 0xaa, 0x40, - 0x3a, 0x40, 0x0f, 0xd0, 0x00, 0x29, 0x03, 0xd0, - 0x71, 0x48, 0x72, 0xa1, 0x03, 0xf0, 0xb8, 0xf9, - 0x28, 0x1c, 0xfe, 0xf7, 0x39, 0xfe, 0x01, 0x1c, - 0x6d, 0x48, 0x03, 0xf0, 0xb1, 0xf9, 0x01, 0x21, - 0x28, 0x1c, 0x2c, 0x1c, 0x01, 0x23, 0xd8, 0x42, - 0x27, 0xd0, 0x32, 0x1c, 0xaa, 0x40, 0x3a, 0x40, - 0x00, 0xd0, 0x2c, 0x1c, 0x00, 0x2a, 0x20, 0xd1, - 0x01, 0x30, 0xa0, 0x42, 0x0c, 0xd1, 0x64, 0x48, - 0x64, 0xa1, 0x03, 0xf0, 0x9d, 0xf9, 0x20, 0x1c, - 0xfe, 0xf7, 0x1e, 0xfe, 0x01, 0x1c, 0x60, 0x48, - 0x03, 0xf0, 0x96, 0xf9, 0x01, 0x21, 0x0d, 0xe0, - 0xa0, 0x42, 0x0b, 0xd2, 0x5c, 0x48, 0x5e, 0xa1, - 0x03, 0xf0, 0x8e, 0xf9, 0x20, 0x1c, 0xfe, 0xf7, - 0x0f, 0xfe, 0x01, 0x1c, 0x58, 0x48, 0x03, 0xf0, - 0x87, 0xf9, 0x01, 0x21, 0x00, 0x20, 0xc0, 0x43, - 0xed, 0x09, 0x00, 0x2e, 0x02, 0x04, 0x1c, 0x01, - 0x35, 0x04, 0x2d, 0xba, 0xd3, 0x01, 0x23, 0xd8, - 0x42, 0x20, 0xd0, 0x01, 0x30, 0xa0, 0x42, 0x0c, - 0xd1, 0x50, 0x48, 0x51, 0xa1, 0x03, 0xf0, 0x76, - 0xf9, 0x20, 0x1c, 0xfe, 0xf7, 0xf7, 0xfd, 0x01, - 0x1c, 0x4c, 0x48, 0x03, 0xf0, 0x6f, 0xf9, 0x01, - 0x21, 0x0d, 0xe0, 0xa0, 0x42, 0x0b, 0xd2, 0x49, - 0x48, 0x4a, 0xa1, 0x03, 0xf0, 0x67, 0xf9, 0x20, - 0x1c, 0xfe, 0xf7, 0xe8, 0xfd, 0x01, 0x1c, 0x45, - 0x48, 0x03, 0xf0, 0x60, 0xf9, 0x01, 0x21, 0x00, - 0x20, 0xc0, 0x43, 0x04, 0x1c, 0x0c, 0x2d, 0x43, - 0xd2, 0x01, 0x23, 0xd8, 0x42, 0x15, 0xd1, 0x32, - 0x1c, 0xaa, 0x40, 0x3a, 0x40, 0x39, 0xd0, 0x00, - 0x29, 0x03, 0xd0, 0x3c, 0x48, 0x3c, 0xa1, 0x03, - 0xf0, 0x4d, 0xf9, 0x28, 0x1c, 0xfe, 0xf7, 0xce, - 0xfd, 0x01, 0x1c, 0x38, 0x48, 0x03, 0xf0, 0x46, - 0xf9, 0x01, 0x21, 0x28, 0x1c, 0x2c, 0x1c, 0xcd, - 0x42, 0x27, 0xd0, 0x32, 0x1c, 0xaa, 0x40, 0x3a, - 0x40, 0x00, 0xd0, 0x2c, 0x1c, 0x00, 0x2a, 0x20, - 0xd1, 0x01, 0x30, 0xa0, 0x42, 0x0c, 0xd1, 0x2f, - 0x48, 0x2f, 0xa1, 0x03, 0xf0, 0x33, 0xf9, 0x20, - 0x1c, 0xfe, 0xf7, 0xb4, 0xfd, 0x01, 0x1c, 0x2b, - 0x48, 0x03, 0xf0, 0x2c, 0xf9, 0x01, 0x21, 0x0d, - 0xe0, 0xa0, 0x42, 0x0b, 0xd2, 0x27, 0x48, 0x29, - 0xa1, 0x03, 0xf0, 0x24, 0xf9, 0x20, 0x1c, 0xfe, - 0xf7, 0xa5, 0xfd, 0x01, 0x1c, 0x23, 0x48, 0x03, - 0xf0, 0x1d, 0xf9, 0x01, 0x21, 0x00, 0x20, 0xc0, - 0x43, 0x04, 0x1c, 0x01, 0x35, 0x0c, 0x2d, 0xbb, - 0xd3, 0x01, 0x23, 0xd8, 0x42, 0x1d, 0xd0, 0x01, - 0x30, 0xa0, 0x42, 0x0c, 0xd1, 0x1b, 0x48, 0x1c, - 0xa1, 0x03, 0xf0, 0x0c, 0xf9, 0x20, 0x1c, 0xfe, - 0xf7, 0x8d, 0xfd, 0x01, 0x1c, 0x17, 0x48, 0x03, - 0xf0, 0x05, 0xf9, 0xed, 0x09, 0x00, 0x2f, 0x02, - 0x01, 0x21, 0x0d, 0xe0, 0xa0, 0x42, 0x0b, 0xd2, - 0x14, 0x48, 0x15, 0xa1, 0x03, 0xf0, 0xfd, 0xf8, - 0x20, 0x1c, 0xfe, 0xf7, 0x7e, 0xfd, 0x01, 0x1c, - 0x10, 0x48, 0x03, 0xf0, 0xf6, 0xf8, 0x01, 0x21, - 0x10, 0x2d, 0x15, 0xd2, 0x0d, 0x4c, 0x30, 0x1c, - 0xa8, 0x40, 0x38, 0x40, 0x0d, 0xd0, 0x00, 0x29, - 0x03, 0xd0, 0x20, 0x1c, 0x0a, 0xa1, 0x03, 0xf0, - 0xe8, 0xf8, 0x28, 0x1c, 0xfe, 0xf7, 0x69, 0xfd, - 0x01, 0x1c, 0x20, 0x1c, 0x03, 0xf0, 0xe1, 0xf8, - 0x01, 0x21, 0x01, 0x35, 0x10, 0x2d, 0xea, 0xd3, - 0xf0, 0xbc, 0x08, 0xbc, 0x01, 0x48, 0x18, 0x47, - 0x00, 0x00, 0x9c, 0xc3, 0x03, 0x20, 0x2c, 0x00, - 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xf0, 0xb5, - 0x89, 0xb0, 0x18, 0x1c, 0x0c, 0x1c, 0xfe, 0xf7, - 0x5a, 0xfc, 0x01, 0x25, 0x07, 0x1c, 0x28, 0x1c, - 0x61, 0x0d, 0x00, 0xd2, 0x00, 0x20, 0x08, 0x90, - 0x28, 0x1c, 0xa1, 0x0d, 0x00, 0xd2, 0x00, 0x20, - 0x07, 0x90, 0x28, 0x1c, 0xe1, 0x0d, 0x00, 0xd2, - 0x00, 0x20, 0x06, 0x90, 0x2e, 0x1c, 0x20, 0x0e, - 0x00, 0xd2, 0x00, 0x26, 0x60, 0x0e, 0x00, 0xd2, - 0x00, 0x25, 0x20, 0x04, 0x00, 0x0c, 0x05, 0x90, - 0x20, 0x0c, 0x00, 0x07, 0x00, 0x0f, 0xfe, 0xf7, - 0x30, 0xfd, 0x04, 0x90, 0x1c, 0xa4, 0x00, 0x2e, - 0x07, 0xd1, 0x00, 0x2d, 0x01, 0xd1, 0x1b, 0xa4, - 0x0c, 0xe0, 0x01, 0x2d, 0x01, 0xd1, 0x1a, 0xa4, - 0x08, 0xe0, 0x01, 0x2e, 0x06, 0xd1, 0x00, 0x2d, - 0x01, 0xd1, 0x18, 0xa4, 0x02, 0xe0, 0x01, 0x2d, - 0x00, 0xd1, 0x17, 0xa4, 0x05, 0x98, 0xff, 0xf7, - 0xc4, 0xfe, 0x06, 0x99, 0x00, 0x29, 0x01, 0xd0, - 0x15, 0xa2, 0x00, 0xe0, 0x15, 0xa2, 0x01, 0x1c, - 0x07, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x13, 0xa0, - 0x00, 0xe0, 0x11, 0xa0, 0x03, 0x92, 0xed, 0x09, - 0x00, 0x30, 0x02, 0x04, 0x9a, 0x01, 0x90, 0x00, - 0x92, 0x08, 0x98, 0x02, 0x91, 0x00, 0x28, 0x01, - 0xd0, 0x0f, 0xa1, 0x00, 0xe0, 0x0f, 0xa1, 0x3a, - 0x1c, 0x23, 0x1c, 0x0e, 0xa0, 0xf9, 0xf7, 0xe2, - 0xfa, 0x09, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x00, 0x44, 0x41, 0x00, 0x00, 0x44, - 0x42, 0x00, 0x00, 0x49, 0x41, 0x00, 0x00, 0x49, - 0x42, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x4c, - 0x44, 0x4d, 0x00, 0x53, 0x54, 0x4d, 0x00, 0x20, - 0x25, 0x73, 0x25, 0x73, 0x25, 0x73, 0x09, 0x25, - 0x73, 0x25, 0x73, 0x2c, 0x20, 0x7b, 0x25, 0x73, - 0x7d, 0x25, 0x73, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xb5, 0x18, 0x1c, 0x0f, 0x1c, 0xfe, 0xf7, 0xd9, - 0xfb, 0x3a, 0x02, 0x12, 0x0a, 0x01, 0x1c, 0x02, - 0xa0, 0xf9, 0xf7, 0xb0, 0xfa, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x20, 0x53, 0x57, 0x49, 0x25, - 0x73, 0x09, 0x23, 0x30, 0x78, 0x25, 0x58, 0x00, - 0x00, 0x00, 0x00, 0x80, 0xb5, 0x18, 0x1c, 0x0f, - 0x1c, 0xfe, 0xf7, 0xc3, 0xfb, 0x3a, 0x02, 0x12, - 0x0a, 0x01, 0x1c, 0x02, 0xa0, 0xf9, 0xf7, 0x9a, - 0xfa, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x20, - 0x55, 0x6e, 0x64, 0x65, 0x66, 0x25, 0x73, 0x09, - 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x23, 0x30, 0x78, 0x25, 0x58, 0x29, - 0x00, 0x00, 0x00, 0xb0, 0xb5, 0x84, 0xb0, 0x18, - 0x1c, 0x0f, 0x1c, 0xfe, 0xf7, 0xa6, 0xfb, 0x05, - 0x1c, 0x38, 0x0b, 0x04, 0x07, 0x24, 0x0f, 0x38, - 0x0c, 0x00, 0x07, 0x00, 0x0f, 0x39, 0x07, 0x09, - 0x0f, 0x3a, 0x0d, 0x13, 0x07, 0x1b, 0x0f, 0x7a, - 0x09, 0x52, 0x07, 0x52, 0x0f, 0x3f, 0x0a, 0x3f, - 0x07, 0xed, 0x09, 0x00, 0x31, 0x02, 0x3f, 0x0f, - 0x02, 0x91, 0x29, 0x1c, 0x03, 0x92, 0x01, 0x90, - 0x04, 0xa0, 0x3a, 0x1c, 0x00, 0x94, 0xf9, 0xf7, - 0x68, 0xfa, 0x04, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x20, 0x43, 0x44, 0x50, - 0x25, 0x73, 0x09, 0x50, 0x25, 0x64, 0x2c, 0x20, - 0x23, 0x30, 0x78, 0x25, 0x58, 0x2c, 0x20, 0x43, - 0x52, 0x25, 0x64, 0x2c, 0x20, 0x43, 0x52, 0x25, - 0x64, 0x2c, 0x20, 0x43, 0x52, 0x25, 0x64, 0x2c, - 0x20, 0x23, 0x30, 0x78, 0x25, 0x58, 0x00, 0x00, - 0xf0, 0xb5, 0x87, 0xb0, 0x18, 0x1c, 0x0f, 0x1c, - 0xfe, 0xf7, 0x6a, 0xfb, 0x04, 0x1c, 0x38, 0x0b, - 0x00, 0x07, 0x00, 0x0f, 0xfe, 0xf7, 0x5a, 0xfc, - 0x05, 0x1c, 0x38, 0x0c, 0x00, 0x07, 0x00, 0x0f, - 0x39, 0x07, 0x09, 0x0f, 0x7a, 0x0d, 0x56, 0x07, - 0x76, 0x0f, 0x7a, 0x09, 0x52, 0x07, 0x52, 0x0f, - 0x06, 0x92, 0x3a, 0x0a, 0x12, 0x07, 0x12, 0x0f, - 0x05, 0x92, 0x01, 0x22, 0x7b, 0x0d, 0x00, 0xd2, - 0x00, 0x22, 0x13, 0x1c, 0x06, 0x9a, 0x03, 0x91, - 0x02, 0x90, 0x01, 0x95, 0x00, 0x96, 0x04, 0x92, - 0x01, 0xd0, 0x06, 0xa1, 0x00, 0xe0, 0x06, 0xa1, - 0x05, 0x9b, 0x22, 0x1c, 0x05, 0xa0, 0xf9, 0xf7, - 0x1c, 0xfa, 0x07, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x4d, 0x52, 0x43, 0x00, - 0x4d, 0x43, 0x52, 0x00, 0x20, 0x25, 0x73, 0x25, - 0x73, 0x09, 0x50, 0x25, 0x64, 0x2c, 0x20, 0x23, - 0x30, 0x78, 0x25, 0x58, 0x2c, 0x20, 0x25, 0x73, - 0x2c, 0x20, 0x43, 0x52, 0x25, 0x64, 0x2c, 0x20, - 0x43, 0x52, 0x25, 0x64, 0x2c, 0x20, 0x23, 0x30, - 0x78, 0x25, 0x58, 0x00, 0x00, 0x28, 0x01, 0xd1, - 0x0d, 0xa0, 0x70, 0x47, 0x01, 0x28, 0x01, 0xd1, - 0x12, 0xa0, 0x70, 0x47, 0x02, 0x28, 0x01, 0xd1, - 0x17, 0xa0, 0x70, 0x47, 0xed, 0x09, 0x00, 0x32, - 0x02, 0x03, 0x28, 0x01, 0xd1, 0x1c, 0xa0, 0x70, - 0x47, 0x04, 0x28, 0x01, 0xd1, 0x21, 0xa0, 0x70, - 0x47, 0x05, 0x28, 0x01, 0xd1, 0x26, 0xa0, 0x70, - 0x47, 0x06, 0x28, 0x01, 0xd1, 0x2b, 0xa0, 0x70, - 0x47, 0x2f, 0xa0, 0x70, 0x47, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x57, 0x6f, 0x72, 0x64, 0x5f, 0x52, 0x65, - 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x00, 0x00, - 0x00, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x5f, 0x52, 0x65, 0x61, 0x64, 0x4f, - 0x6e, 0x6c, 0x79, 0x00, 0x00, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x42, 0x79, 0x74, 0x65, 0x5f, 0x52, 0x65, - 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x00, 0x00, - 0x00, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x57, 0x6f, 0x72, - 0x64, 0x5f, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x00, 0x00, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x52, - 0x65, 0x61, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x00, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x5f, 0x42, 0x79, 0x74, - 0x65, 0x5f, 0x52, 0x65, 0x61, 0x64, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x00, 0x00, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x5f, 0x4e, 0x6f, 0x74, 0x4e, 0x75, 0x6c, 0x6c, - 0x00, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x01, 0xd1, 0x09, 0xa0, 0xed, - 0x09, 0x00, 0x33, 0x02, 0x70, 0x47, 0x01, 0x28, - 0x01, 0xd1, 0x0c, 0xa0, 0x70, 0x47, 0x02, 0x28, - 0x01, 0xd1, 0x11, 0xa0, 0x70, 0x47, 0x03, 0x28, - 0x01, 0xd1, 0x15, 0xa0, 0x70, 0x47, 0x04, 0x28, - 0x01, 0xd1, 0x1a, 0xa0, 0x70, 0x47, 0x20, 0xa0, - 0x70, 0x47, 0x42, 0x54, 0x5f, 0x48, 0x43, 0x5f, - 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, - 0x49, 0x44, 0x4c, 0x45, 0x00, 0x00, 0x42, 0x54, - 0x5f, 0x48, 0x43, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, - 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, - 0x45, 0x43, 0x54, 0x49, 0x4e, 0x47, 0x00, 0x00, - 0x00, 0x00, 0x42, 0x54, 0x5f, 0x48, 0x43, 0x5f, - 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, - 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, - 0x44, 0x00, 0x42, 0x54, 0x5f, 0x48, 0x43, 0x5f, - 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, - 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, - 0x43, 0x54, 0x49, 0x4e, 0x47, 0x00, 0x42, 0x54, - 0x5f, 0x48, 0x43, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, - 0x5f, 0x53, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, - 0x00, 0x00, 0x5f, 0x42, 0x54, 0x5f, 0x48, 0x63, - 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x00, 0xf0, 0xb5, 0x88, 0xb0, 0x2c, 0x4e, - 0x2e, 0x4d, 0x30, 0x68, 0x00, 0x24, 0x2b, 0x48, - 0x2d, 0x4f, 0x28, 0x60, 0x04, 0x35, 0x00, 0x20, - 0x11, 0xc5, 0x11, 0xc5, 0x14, 0x3d, 0xa8, 0x61, - 0x38, 0x7a, 0x7b, 0x7a, 0x1b, 0x02, 0x18, 0x43, - 0x28, 0x4b, 0x98, 0x42, 0x01, 0xd0, 0x00, 0x28, - 0x04, 0xd1, 0x11, 0x20, 0x40, 0x02, 0x38, 0x72, - 0x03, 0x0a, 0x7b, 0x72, 0x12, 0xf0, 0x55, 0xfc, - 0xb8, 0x71, 0xed, 0x09, 0x00, 0x34, 0x02, 0x03, - 0x0a, 0xfb, 0x71, 0x22, 0x48, 0x21, 0x49, 0x00, - 0xf0, 0xa8, 0xfb, 0x00, 0xf0, 0x94, 0xfa, 0x00, - 0x20, 0x6c, 0x61, 0x00, 0xf0, 0x37, 0xfc, 0x1e, - 0x48, 0x1f, 0xa1, 0x04, 0xf0, 0x66, 0xfb, 0x19, - 0x21, 0x89, 0x02, 0x01, 0x22, 0x92, 0x02, 0x01, - 0x92, 0x00, 0x91, 0x1f, 0xa1, 0x1d, 0x4a, 0x01, - 0x23, 0x1d, 0x48, 0xef, 0xf7, 0x8a, 0xfb, 0x07, - 0xaa, 0x1f, 0x49, 0x07, 0x20, 0xef, 0xf7, 0x9b, - 0xff, 0x0d, 0x23, 0xdb, 0x02, 0x0c, 0x22, 0x06, - 0x92, 0x00, 0x20, 0x46, 0x22, 0x0a, 0x21, 0x05, - 0x91, 0x01, 0x21, 0xc9, 0x02, 0x03, 0x92, 0x00, - 0x22, 0x00, 0x92, 0x02, 0x91, 0x04, 0x90, 0x01, - 0x93, 0x00, 0x23, 0x16, 0x48, 0x17, 0xa1, 0x14, - 0x4a, 0xef, 0xf7, 0xd7, 0xfa, 0x30, 0x68, 0x08, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xd0, - 0x67, 0x03, 0x20, 0xf8, 0xd4, 0x03, 0x20, 0x8c, - 0x69, 0x03, 0x20, 0x30, 0x7c, 0x00, 0x00, 0xff, - 0xff, 0x00, 0x00, 0x28, 0x7c, 0x00, 0x00, 0x3a, - 0x7c, 0x00, 0x00, 0xc4, 0xc4, 0x03, 0x20, 0x55, - 0x53, 0x42, 0x2d, 0x45, 0x76, 0x6e, 0x74, 0x00, - 0x00, 0x00, 0x00, 0x7d, 0x32, 0x02, 0x20, 0x6c, - 0xc4, 0x03, 0x20, 0x55, 0x53, 0x42, 0x2d, 0x48, - 0x49, 0x53, 0x52, 0x00, 0x00, 0x00, 0x00, 0x65, - 0x32, 0x02, 0x20, 0x87, 0x32, 0x02, 0x20, 0xc4, - 0xc3, 0x03, 0x20, 0x54, 0x5f, 0x55, 0x53, 0x42, - 0x00, 0x00, 0x00, 0x00, 0xb5, 0x04, 0x48, 0x00, - 0x68, 0x04, 0x49, 0x00, 0x20, 0x88, 0x61, 0x00, - 0xf0, 0x08, 0xfa, 0x08, 0xbc, 0x18, 0x47, 0xd0, - 0x67, 0x03, 0x20, 0x8c, 0x69, 0x03, 0x20, 0x00, - 0xb5, 0x10, 0x49, 0x09, 0x68, 0x10, 0x4a, 0x10, - 0x49, 0x00, 0x23, 0x0a, 0x60, 0x04, 0x31, 0x00, - 0x22, 0x0c, 0xc1, 0x0c, 0xc1, 0xed, 0x09, 0x00, - 0x35, 0x02, 0x14, 0x39, 0x00, 0x28, 0x0a, 0xd0, - 0x01, 0x20, 0xc8, 0x61, 0x0b, 0x48, 0x12, 0xf0, - 0x7d, 0xfc, 0x00, 0x28, 0x01, 0xd1, 0xf2, 0xf7, - 0xf1, 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x21, - 0x20, 0x20, 0x01, 0xf0, 0x8d, 0xff, 0xff, 0x20, - 0x09, 0x30, 0x12, 0xf0, 0xdb, 0xfb, 0xf4, 0xe7, - 0xd0, 0x67, 0x03, 0x20, 0xf8, 0xd4, 0x03, 0x20, - 0x8c, 0x69, 0x03, 0x20, 0xa4, 0x69, 0x03, 0x20, - 0xf7, 0xb5, 0x84, 0xb0, 0x37, 0x48, 0x0f, 0x1c, - 0x01, 0x68, 0x16, 0x1c, 0x36, 0x49, 0x01, 0x22, - 0x0b, 0x68, 0x92, 0x02, 0x00, 0x2b, 0x35, 0x49, - 0x20, 0xd0, 0x48, 0x68, 0xc4, 0x19, 0x94, 0x42, - 0x03, 0xd3, 0x07, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x0c, 0x1c, 0x09, 0x68, 0x08, 0x18, - 0x04, 0x99, 0x3a, 0x1c, 0xdd, 0xf7, 0x96, 0xf9, - 0x60, 0x68, 0xc0, 0x19, 0x60, 0x60, 0x08, 0x2e, - 0x00, 0xd0, 0xee, 0xe7, 0x00, 0xf0, 0xb4, 0xf9, - 0x00, 0x22, 0xd2, 0x43, 0x00, 0x92, 0x01, 0x22, - 0x01, 0x21, 0x01, 0xab, 0x26, 0x48, 0x04, 0xf0, - 0x95, 0xfb, 0xe2, 0xe7, 0x04, 0x25, 0x33, 0x1c, - 0x2b, 0x40, 0x00, 0xd1, 0x00, 0x25, 0x00, 0x24, - 0x00, 0x2f, 0x37, 0xd9, 0x08, 0x23, 0x1e, 0x40, - 0x00, 0xd1, 0x00, 0x23, 0x03, 0x93, 0xff, 0x22, - 0x01, 0x32, 0x38, 0x1b, 0x90, 0x42, 0x00, 0xd8, - 0x02, 0x1c, 0xa0, 0x18, 0x02, 0x90, 0xb8, 0x42, - 0x01, 0xd1, 0x03, 0x98, 0x05, 0x43, 0x17, 0x48, - 0x40, 0x68, 0x81, 0x18, 0x01, 0x23, 0x9b, 0x02, - 0x03, 0x31, 0x99, 0x42, 0x0d, 0xd2, 0x04, 0x99, - 0x09, 0x19, 0x12, 0x4c, 0x23, 0x68, 0x18, 0x18, - 0x2b, 0x1c, 0x00, 0xf0, 0x23, 0xf8, 0x61, 0x68, - 0x40, 0x18, 0x60, 0x60, 0x02, 0x9c, 0x00, 0x25, - 0x0e, 0xe0, 0x0a, 0x48, 0x00, 0x68, 0x00, 0xf0, - 0xed, 0x09, 0x00, 0x36, 0x02, 0x77, 0xf9, 0x00, - 0x22, 0xd2, 0x43, 0x00, 0x92, 0x01, 0x22, 0x01, - 0x21, 0x01, 0xab, 0x08, 0x48, 0x04, 0xf0, 0x58, - 0xfb, 0x03, 0x48, 0x00, 0x68, 0xbc, 0x42, 0xcc, - 0xd3, 0x00, 0xf0, 0x68, 0xf9, 0x9f, 0xe7, 0x00, - 0x00, 0xd0, 0x67, 0x03, 0x20, 0xc0, 0x69, 0x03, - 0x20, 0x8c, 0x69, 0x03, 0x20, 0xc4, 0xc4, 0x03, - 0x20, 0x80, 0xb5, 0x17, 0x1c, 0x0b, 0x4a, 0x12, - 0x68, 0x1a, 0x1c, 0xc1, 0x23, 0x1a, 0x43, 0x02, - 0x70, 0x12, 0x0a, 0x42, 0x70, 0xff, 0x23, 0x01, - 0x33, 0x00, 0x22, 0x9f, 0x42, 0x00, 0xd0, 0x3a, - 0x1c, 0x82, 0x70, 0x03, 0x30, 0x3a, 0x1c, 0xdd, - 0xf7, 0x23, 0xf9, 0xf8, 0x1c, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xd0, 0x67, 0x03, - 0x20, 0xf0, 0xb5, 0x05, 0x1c, 0x04, 0x20, 0x10, - 0x40, 0x14, 0x1c, 0x0f, 0x1c, 0x00, 0x28, 0x16, - 0x4e, 0x05, 0xd0, 0x31, 0x1c, 0x00, 0x22, 0xd2, - 0x43, 0x14, 0x48, 0x03, 0xf0, 0x07, 0xfc, 0x00, - 0x2f, 0x0b, 0xd0, 0x13, 0x49, 0x08, 0x6a, 0x49, - 0x6a, 0x40, 0x18, 0x29, 0x1c, 0x3a, 0x1c, 0xdd, - 0xf7, 0x03, 0xf9, 0x0f, 0x49, 0x48, 0x6a, 0xc0, - 0x19, 0x48, 0x62, 0x20, 0x09, 0x11, 0xd3, 0x0c, - 0x4f, 0x78, 0x6a, 0x03, 0x28, 0x06, 0xd9, 0x31, - 0x1c, 0x00, 0x23, 0x01, 0x22, 0x09, 0x48, 0x03, - 0xf0, 0x69, 0xfd, 0x04, 0xe0, 0x38, 0x6a, 0x03, - 0xf0, 0x45, 0xfc, 0x07, 0x48, 0x00, 0x68, 0x00, - 0x20, 0x78, 0x62, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xac, 0x69, 0x03, 0x20, 0x18, 0xbc, 0x03, - 0x20, 0x8c, 0x69, 0x03, 0x20, 0x54, 0xbc, 0x03, - 0x20, 0xd0, 0x67, 0x03, 0x20, 0x00, 0xb5, 0x01, - 0x20, 0x12, 0xf0, 0xfa, 0xfa, 0x02, 0x48, 0x12, - 0xf0, 0xf3, 0xfa, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x6c, 0xc4, 0xed, 0x09, 0x00, 0x37, 0x02, - 0x03, 0x20, 0x00, 0xb5, 0x00, 0xf0, 0xf5, 0xf8, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x83, 0xb0, - 0x71, 0x4c, 0x20, 0x68, 0x00, 0xf0, 0xed, 0xf8, - 0x70, 0x48, 0x70, 0x4e, 0x02, 0x90, 0x6d, 0x4c, - 0x20, 0x68, 0x01, 0x20, 0x12, 0xf0, 0xbb, 0xfa, - 0x00, 0x22, 0xd2, 0x43, 0x00, 0x92, 0x01, 0x22, - 0x02, 0x21, 0x01, 0xab, 0x6b, 0x48, 0x04, 0xf0, - 0xc6, 0xfa, 0x66, 0x4c, 0x20, 0x68, 0x00, 0xf0, - 0x4d, 0xf9, 0x00, 0x28, 0x0e, 0xd1, 0x71, 0x69, - 0x30, 0x1c, 0x00, 0x29, 0xe7, 0xd0, 0x00, 0x22, - 0x42, 0x61, 0x00, 0x20, 0x00, 0xf0, 0xdd, 0xf8, - 0x00, 0x20, 0x00, 0xf0, 0x97, 0xfa, 0x5d, 0x4c, - 0x20, 0x68, 0xdc, 0xe7, 0x71, 0x69, 0x81, 0x42, - 0x15, 0xd0, 0x70, 0x61, 0x01, 0x20, 0x37, 0x1c, - 0x00, 0xf0, 0xcf, 0xf8, 0x01, 0x20, 0x00, 0xf0, - 0x89, 0xfa, 0x56, 0x4c, 0x20, 0x68, 0x59, 0x48, - 0x00, 0x68, 0x00, 0x28, 0x07, 0xd1, 0x03, 0xcf, - 0x08, 0x3f, 0x40, 0x18, 0x00, 0xf0, 0xb1, 0xfa, - 0x79, 0x68, 0x40, 0x18, 0x78, 0x60, 0x54, 0x4d, - 0x28, 0x1c, 0x00, 0xf0, 0x80, 0xf9, 0x07, 0x1c, - 0x51, 0xd0, 0x4c, 0x4c, 0x20, 0x68, 0x70, 0x69, - 0x00, 0xf0, 0xb3, 0xf8, 0x29, 0x78, 0x89, 0x07, - 0x89, 0x0f, 0x28, 0x1c, 0x01, 0x29, 0x09, 0xd0, - 0x20, 0x68, 0x03, 0xce, 0x08, 0x3e, 0x40, 0x18, - 0x00, 0xf0, 0x97, 0xfa, 0x71, 0x68, 0x40, 0x18, - 0x70, 0x60, 0x3c, 0xe0, 0x00, 0x25, 0x00, 0x2f, - 0x39, 0xd9, 0x45, 0x48, 0x41, 0x5d, 0x40, 0x19, - 0x42, 0x78, 0x12, 0x02, 0x11, 0x43, 0x0a, 0x04, - 0x12, 0x0c, 0xd3, 0x0b, 0x81, 0x78, 0x01, 0xd3, - 0x02, 0x24, 0x05, 0xe0, 0x00, 0x29, 0x02, 0xd1, - 0xff, 0x24, 0x04, 0x34, 0x00, 0xe0, 0xcc, 0x1c, - 0x91, 0x09, 0x12, 0xd3, 0x36, 0x49, 0xed, 0x09, - 0x00, 0x38, 0x02, 0x09, 0x68, 0x72, 0x68, 0x01, - 0x23, 0x9b, 0x02, 0xd1, 0x1d, 0x21, 0x31, 0x99, - 0x42, 0x18, 0xd2, 0x31, 0x68, 0x8a, 0x18, 0x01, - 0x1c, 0x10, 0x1c, 0x00, 0xf0, 0xa2, 0xfa, 0x71, - 0x68, 0x40, 0x18, 0x70, 0x60, 0x0e, 0xe0, 0x91, - 0x09, 0x89, 0x07, 0x09, 0xd0, 0x2b, 0x49, 0x09, - 0x68, 0x00, 0x21, 0x02, 0x2c, 0x00, 0xd9, 0xe1, - 0x1e, 0x03, 0x30, 0xff, 0xf7, 0x1a, 0xff, 0x01, - 0xe0, 0x26, 0x49, 0x08, 0x68, 0x2d, 0x19, 0xbd, - 0x42, 0xc5, 0xd3, 0x00, 0xf0, 0xd4, 0xfa, 0x00, - 0x28, 0x89, 0xd1, 0xb0, 0x68, 0x00, 0x28, 0x07, - 0xd0, 0xf0, 0x68, 0x31, 0x69, 0x00, 0xf0, 0x57, - 0xf9, 0xb0, 0x60, 0x00, 0x28, 0x00, 0xd0, 0x5c, - 0xe7, 0x20, 0x48, 0x00, 0x68, 0x00, 0x28, 0x17, - 0xd1, 0x1a, 0x4c, 0x20, 0x68, 0x02, 0x28, 0x13, - 0xd1, 0x01, 0x27, 0xbf, 0x02, 0x70, 0x68, 0x34, - 0x1c, 0x82, 0x30, 0xb8, 0x42, 0x0c, 0xd2, 0x03, - 0xcc, 0x08, 0x3c, 0x40, 0x18, 0x00, 0xf0, 0x92, - 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x61, 0x68, 0x08, - 0x18, 0x60, 0x60, 0x82, 0x30, 0xb8, 0x42, 0xf2, - 0xd3, 0x71, 0x68, 0x37, 0x1c, 0x00, 0x29, 0xde, - 0xd0, 0x0c, 0x4c, 0x00, 0x22, 0x20, 0x68, 0x38, - 0x68, 0xf8, 0x60, 0x39, 0x61, 0x7a, 0x60, 0x00, - 0xf0, 0x2a, 0xf9, 0xb8, 0x60, 0x38, 0x68, 0x0c, - 0x49, 0x88, 0x42, 0x02, 0xd1, 0x02, 0x98, 0x38, - 0x60, 0x00, 0xe0, 0x39, 0x60, 0x00, 0x22, 0x01, - 0x21, 0x05, 0x48, 0x04, 0xf0, 0x98, 0xf9, 0x24, - 0xe7, 0x00, 0x00, 0xd0, 0x67, 0x03, 0x20, 0xf8, - 0xd8, 0x03, 0x20, 0x8c, 0x69, 0x03, 0x20, 0xc4, - 0xc4, 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, 0xe8, - 0xc4, 0x03, 0x20, 0xf8, 0xd4, 0x03, 0x20, 0x00, - 0xb5, 0x05, 0x48, 0x80, 0x69, 0x00, 0x28, 0x04, - 0xd1, 0xed, 0x09, 0x00, 0x39, 0x02, 0x00, 0x22, - 0x02, 0x21, 0x03, 0x48, 0x04, 0xf0, 0x7e, 0xf9, - 0x08, 0xbc, 0x18, 0x47, 0x8c, 0x69, 0x03, 0x20, - 0xc4, 0xc4, 0x03, 0x20, 0x90, 0xb5, 0x09, 0x4c, - 0x07, 0x1c, 0xa0, 0x6a, 0xb8, 0x42, 0x09, 0xd0, - 0x02, 0x2f, 0x03, 0xd1, 0x02, 0x20, 0xf1, 0xf7, - 0xa3, 0xfc, 0x02, 0xe0, 0x01, 0x20, 0xf1, 0xf7, - 0x9f, 0xfc, 0xa7, 0x62, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x8c, 0x69, 0x03, 0x20, - 0x90, 0xb5, 0x13, 0x4c, 0x00, 0x20, 0x20, 0x60, - 0x60, 0x60, 0xa0, 0x60, 0x00, 0xf0, 0x80, 0xf9, - 0x07, 0x1c, 0xc4, 0x22, 0x00, 0x21, 0x0f, 0x48, - 0xdc, 0xf7, 0x1e, 0xff, 0x38, 0x06, 0x00, 0x0e, - 0x00, 0xf0, 0xf0, 0xfb, 0x00, 0x2f, 0x0c, 0xd1, - 0x00, 0x21, 0x06, 0x20, 0x00, 0xf0, 0x0e, 0xfc, - 0x40, 0x21, 0x41, 0x20, 0x00, 0xf0, 0x10, 0xf8, - 0x00, 0xf0, 0xa8, 0xf9, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0x20, 0x60, 0x60, 0xc0, 0x21, - 0xc1, 0x20, 0x00, 0xf0, 0x05, 0xf8, 0xf5, 0xe7, - 0xb8, 0x69, 0x03, 0x20, 0xcc, 0xdd, 0x03, 0x20, - 0x80, 0xb5, 0x07, 0x1c, 0x0d, 0x20, 0x00, 0xf0, - 0xf5, 0xfb, 0x06, 0x20, 0x00, 0xf0, 0xfa, 0xfb, - 0x38, 0x43, 0x01, 0x06, 0x09, 0x0e, 0x06, 0x20, - 0x00, 0xf0, 0xec, 0xfb, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, 0x06, 0x20, - 0x00, 0xf0, 0xec, 0xfb, 0xb8, 0x43, 0x01, 0x06, - 0x09, 0x0e, 0x06, 0x20, 0x00, 0xf0, 0xde, 0xfb, - 0x0d, 0x20, 0x39, 0x1c, 0x00, 0xf0, 0xda, 0xfb, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, - 0x0d, 0x20, 0x00, 0xf0, 0xdb, 0xfb, 0x40, 0x23, - 0x07, 0x1c, 0x18, 0x40, 0x01, 0x26, 0x00, 0x25, - 0x00, 0x28, 0x28, 0x4c, 0x21, 0xd0, 0x20, 0x68, - 0x00, 0x28, 0x1e, 0xd1, 0xed, 0x09, 0x00, 0x3a, - 0x02, 0x40, 0x21, 0x0d, 0x20, 0x00, 0xf0, 0xc4, - 0xfb, 0x0d, 0x20, 0x00, 0xf0, 0xc9, 0xfb, 0xc0, - 0x09, 0x13, 0xd3, 0x65, 0x60, 0x26, 0x60, 0x00, - 0x20, 0x00, 0xf0, 0x96, 0xfb, 0x20, 0x21, 0x20, - 0x20, 0xff, 0xf7, 0xbc, 0xff, 0x40, 0x20, 0xff, - 0xf7, 0xca, 0xff, 0x40, 0x21, 0x0d, 0x20, 0x00, - 0xf0, 0xaf, 0xfb, 0x28, 0x1c, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x18, 0x48, 0x00, 0x68, 0xb8, - 0x09, 0x0b, 0xd3, 0x20, 0x68, 0x01, 0x28, 0x08, - 0xd1, 0x60, 0xc4, 0xc0, 0x21, 0xc0, 0x20, 0x08, - 0x3c, 0xff, 0xf7, 0xa4, 0xff, 0x20, 0x20, 0xff, - 0xf7, 0xb2, 0xff, 0x78, 0x08, 0x05, 0xd3, 0x01, - 0x21, 0x0d, 0x20, 0x00, 0xf0, 0x95, 0xfb, 0x00, - 0xf0, 0x4d, 0xfe, 0x60, 0x68, 0x01, 0x28, 0x0b, - 0xd1, 0x38, 0x0a, 0x03, 0xd2, 0x00, 0xf0, 0xc0, - 0xf9, 0x00, 0x28, 0x05, 0xd0, 0x80, 0x21, 0x0d, - 0x20, 0x00, 0xf0, 0x86, 0xfb, 0x00, 0xf0, 0xd5, - 0xf9, 0x05, 0x48, 0x01, 0x68, 0x04, 0x29, 0x01, - 0xd1, 0x40, 0x7a, 0xcf, 0xe7, 0x28, 0x1c, 0xcd, - 0xe7, 0xb8, 0x69, 0x03, 0x20, 0xd0, 0x67, 0x03, - 0x20, 0xcc, 0xdd, 0x03, 0x20, 0x98, 0xb5, 0x07, - 0x1c, 0x17, 0x48, 0x18, 0x4c, 0x80, 0x68, 0x00, - 0x28, 0x24, 0xd0, 0x68, 0x46, 0x00, 0xf0, 0xb4, - 0xfb, 0x00, 0x28, 0x0e, 0xd0, 0x08, 0x28, 0x08, - 0xd9, 0xc1, 0x1f, 0x00, 0x9a, 0x01, 0x20, 0xd0, - 0x71, 0x00, 0x98, 0x0c, 0x22, 0x07, 0x30, 0xff, - 0xf7, 0xd1, 0xfd, 0x00, 0x21, 0x00, 0x20, 0x00, - 0xf0, 0xc1, 0xfd, 0x20, 0x1c, 0x79, 0x1c, 0x00, - 0xf0, 0xdf, 0xfe, 0x00, 0x28, 0x06, 0xd0, 0x41, - 0x1c, 0x02, 0x20, 0x38, 0x70, 0x0c, 0x22, 0x38, - 0x1c, 0xff, 0xf7, 0xc0, 0xfd, 0x00, 0x20, 0x98, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x20, 0x1c, 0xed, - 0x09, 0x00, 0x3b, 0x02, 0x39, 0x1c, 0x00, 0xf0, - 0xce, 0xfe, 0xf7, 0xe7, 0x00, 0x00, 0xb8, 0x69, - 0x03, 0x20, 0xe8, 0xdd, 0x03, 0x20, 0x80, 0xb5, - 0x13, 0x4a, 0x13, 0x4f, 0x92, 0x68, 0xfb, 0x1d, - 0x31, 0x33, 0x00, 0x2a, 0x18, 0xd0, 0x02, 0x78, - 0x01, 0x30, 0x01, 0x39, 0x04, 0x2a, 0x09, 0xd1, - 0x0a, 0x1c, 0xfb, 0x1d, 0x69, 0x33, 0x01, 0x1c, - 0x18, 0x1c, 0x00, 0xf0, 0x1d, 0xff, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x02, 0x2a, 0x05, 0xd1, - 0x0a, 0x1c, 0x01, 0x1c, 0x18, 0x1c, 0x00, 0xf0, - 0x13, 0xff, 0xf4, 0xe7, 0x00, 0x20, 0xf2, 0xe7, - 0x0a, 0x1c, 0x01, 0x1c, 0x18, 0x1c, 0x00, 0xf0, - 0x0b, 0xff, 0xec, 0xe7, 0x00, 0x00, 0xb8, 0x69, - 0x03, 0x20, 0xcc, 0xdd, 0x03, 0x20, 0xb0, 0xb4, - 0x07, 0x78, 0x01, 0x24, 0x00, 0x23, 0x00, 0x2f, - 0x12, 0x4a, 0x01, 0xd0, 0xff, 0x2f, 0x01, 0xd1, - 0x11, 0x48, 0x05, 0xe0, 0x05, 0x78, 0x67, 0x1c, - 0x01, 0x30, 0x15, 0x55, 0xd3, 0x55, 0x7c, 0x1c, - 0x07, 0x78, 0x00, 0x2f, 0x01, 0xd0, 0x5d, 0x2c, - 0xf4, 0xd3, 0x14, 0x70, 0x0b, 0x4a, 0x01, 0x20, - 0x0f, 0x78, 0x00, 0x2f, 0x0b, 0xd0, 0xff, 0x2f, - 0x09, 0xd0, 0x17, 0x54, 0x44, 0x1c, 0x60, 0x1c, - 0x01, 0x31, 0x11, 0x28, 0x13, 0x55, 0xf3, 0xd3, - 0x10, 0x70, 0xb0, 0xbc, 0x70, 0x47, 0x13, 0x70, - 0xfa, 0xe7, 0xf8, 0xdc, 0x03, 0x20, 0x0c, 0x61, - 0x03, 0x20, 0x58, 0xdd, 0x03, 0x20, 0x90, 0xb4, - 0x06, 0x29, 0x32, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, - 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x03, 0x06, - 0x09, 0x0f, 0x15, 0x18, 0x03, 0x27, 0x15, 0x48, - 0x13, 0xe0, 0x15, 0x27, 0x15, 0x48, 0x10, 0xe0, - 0x15, 0x48, 0x01, 0x78, 0x0f, 0x06, 0x3f, 0x0e, - 0x01, 0x30, 0x0a, 0xe0, 0x13, 0x48, 0x01, 0x78, - 0x0f, 0x06, 0xed, 0x09, 0x00, 0x3c, 0x02, 0x3f, - 0x0e, 0x01, 0x30, 0x04, 0xe0, 0x25, 0x27, 0x10, - 0x48, 0x01, 0xe0, 0x10, 0x48, 0x1d, 0x27, 0x10, - 0x4b, 0x79, 0x1c, 0x19, 0x70, 0x03, 0x21, 0x59, - 0x70, 0x02, 0x21, 0x7f, 0x18, 0x02, 0x2f, 0x05, - 0xd9, 0x04, 0x78, 0x01, 0x30, 0x5c, 0x54, 0x01, - 0x31, 0x8f, 0x42, 0xf9, 0xd8, 0x18, 0x78, 0x10, - 0x70, 0x18, 0x1c, 0x90, 0xbc, 0x70, 0x47, 0x00, - 0x20, 0xfb, 0xe7, 0xf0, 0x60, 0x03, 0x20, 0xf4, - 0x60, 0x03, 0x20, 0xf8, 0xdc, 0x03, 0x20, 0x58, - 0xdd, 0x03, 0x20, 0x20, 0x61, 0x03, 0x20, 0x48, - 0x61, 0x03, 0x20, 0x6c, 0xdd, 0x03, 0x20, 0x80, - 0xb5, 0x12, 0xf0, 0xe5, 0xf8, 0x00, 0x28, 0x03, - 0xd0, 0x01, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x07, 0x4f, 0x01, 0x23, 0x38, 0x68, 0x18, - 0x43, 0x38, 0x60, 0x01, 0x20, 0xef, 0xf7, 0x31, - 0xfa, 0x38, 0x68, 0x40, 0x08, 0x40, 0x00, 0x38, - 0x60, 0x00, 0x20, 0xee, 0xe7, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe0, 0x00, 0xb5, 0xdc, 0xf7, 0xed, - 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x70, 0x47, 0x0d, - 0x48, 0x81, 0x68, 0x00, 0x22, 0x82, 0x60, 0x01, - 0x22, 0x42, 0x60, 0x02, 0x68, 0x40, 0x23, 0x1a, - 0x43, 0x02, 0x60, 0x02, 0x68, 0x9a, 0x43, 0x02, - 0x60, 0x02, 0x68, 0x80, 0x23, 0x1a, 0x43, 0xc0, - 0x46, 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x02, - 0x60, 0x02, 0x68, 0xc0, 0x46, 0xc0, 0x46, 0x9a, - 0x43, 0x81, 0x60, 0x02, 0x60, 0x70, 0x47, 0x00, - 0x00, 0x00, 0xe0, 0x00, 0xb5, 0x08, 0x20, 0x12, - 0xf0, 0xa2, 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x24, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x3a, - 0x20, 0x31, 0x2e, 0x36, 0x39, 0x20, 0x24, 0x00, - 0x00, 0x00, 0x00, 0xb0, 0xb5, 0xed, 0x09, 0x00, - 0x3d, 0x02, 0x07, 0x1c, 0xed, 0x20, 0x38, 0x70, - 0x04, 0x20, 0x13, 0x4c, 0x78, 0x70, 0x20, 0x68, - 0x0a, 0x30, 0x01, 0xf0, 0xb7, 0xff, 0xf8, 0x70, - 0x20, 0x68, 0x0d, 0x30, 0x01, 0xf0, 0xb2, 0xff, - 0x0e, 0x4c, 0x38, 0x71, 0x20, 0x68, 0x12, 0x30, - 0x01, 0xf0, 0xac, 0xff, 0x7d, 0x25, 0xed, 0x00, - 0x45, 0x43, 0x20, 0x68, 0x14, 0x30, 0x01, 0xf0, - 0xa5, 0xff, 0x40, 0x19, 0x78, 0x71, 0x00, 0x0a, - 0xb8, 0x71, 0xf8, 0x1d, 0x09, 0x22, 0x06, 0xa1, - 0xdc, 0xf7, 0xb4, 0xfd, 0x10, 0x20, 0x0d, 0x21, - 0xb9, 0x70, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xbc, 0x67, 0x03, 0x20, 0xc4, 0x69, 0x03, 0x20, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x90, 0xb5, 0x0a, 0x78, - 0x4b, 0x78, 0x00, 0x27, 0x1b, 0x02, 0x1a, 0x43, - 0x14, 0x04, 0x24, 0x0c, 0x8a, 0x1c, 0xe1, 0x0b, - 0x01, 0xd3, 0x00, 0x21, 0x05, 0xe0, 0x11, 0x78, - 0x01, 0x32, 0x00, 0x29, 0x01, 0xd1, 0xff, 0x21, - 0x01, 0x31, 0x63, 0x09, 0x03, 0xd3, 0x00, 0x20, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x23, 0x12, - 0x1b, 0x07, 0x1b, 0x0f, 0x04, 0x2b, 0x06, 0xd0, - 0x08, 0x2b, 0x02, 0xd1, 0x10, 0x1c, 0xf7, 0xf7, - 0x2b, 0xff, 0x38, 0x1c, 0xf0, 0xe7, 0xff, 0xf7, - 0xa3, 0xff, 0x07, 0x1c, 0xf9, 0xe7, 0x80, 0xb5, - 0x82, 0xb0, 0xc1, 0x1c, 0x07, 0x1c, 0x00, 0x22, - 0x00, 0x92, 0x7f, 0x22, 0x0b, 0x48, 0x01, 0xab, - 0x02, 0xf0, 0x6e, 0xfb, 0x00, 0x28, 0x02, 0xd1, - 0x01, 0x98, 0x00, 0x28, 0x04, 0xd1, 0x00, 0x20, - 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xed, 0x20, 0x38, 0x70, 0x08, 0x20, 0x78, 0x70, - 0x01, 0x98, 0xb8, 0x70, 0x01, 0x98, 0x03, 0x30, - 0xf2, 0xe7, 0x00, 0x00, 0x4c, 0xb8, 0x03, 0x20, - 0xed, 0x09, 0x00, 0x3e, 0x02, 0x00, 0xb5, 0x05, - 0x20, 0x00, 0xf0, 0xd0, 0xf9, 0x80, 0x08, 0x02, - 0xd3, 0x01, 0x20, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x20, 0xfb, 0xe7, 0x00, 0xb5, 0x11, 0x21, 0x05, - 0x20, 0x00, 0xf0, 0xbc, 0xf9, 0x05, 0x20, 0xef, - 0xf7, 0x5d, 0xf9, 0x01, 0x21, 0x05, 0x20, 0x00, - 0xf0, 0xb5, 0xf9, 0x01, 0x21, 0x10, 0x20, 0x01, - 0xf0, 0x0d, 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb5, 0x14, 0x4f, 0xf8, 0x1d, 0x31, 0x30, 0x00, - 0xf0, 0x5d, 0xfe, 0xf8, 0x1d, 0x69, 0x30, 0x00, - 0xf0, 0x59, 0xfe, 0x00, 0x20, 0xff, 0xf7, 0x54, - 0xfb, 0x00, 0x21, 0x10, 0x20, 0x01, 0xf0, 0xfa, - 0xfa, 0x38, 0x7e, 0x01, 0x28, 0x02, 0xd1, 0xff, - 0xf7, 0x1b, 0xff, 0x02, 0xe0, 0x00, 0x20, 0xff, - 0xf7, 0x17, 0xff, 0x38, 0x68, 0x04, 0x28, 0x05, - 0xd1, 0xff, 0xf7, 0xc4, 0xff, 0x00, 0x28, 0x04, - 0xd0, 0xff, 0xf7, 0xcb, 0xff, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x01, 0x21, 0x10, 0x20, 0x01, - 0xf0, 0xe1, 0xfa, 0xf7, 0xe7, 0xcc, 0xdd, 0x03, - 0x20, 0x08, 0x4a, 0x01, 0x1c, 0x13, 0x68, 0x00, - 0x20, 0x04, 0x2b, 0x06, 0xd1, 0x00, 0x29, 0x05, - 0xd0, 0xd1, 0x7a, 0x89, 0x09, 0x01, 0xd3, 0x01, - 0x20, 0x10, 0x76, 0x70, 0x47, 0x00, 0x20, 0x10, - 0x76, 0x01, 0x20, 0x70, 0x47, 0xcc, 0xdd, 0x03, - 0x20, 0x03, 0x4a, 0x53, 0x7e, 0x03, 0x70, 0x10, - 0x7e, 0x08, 0x70, 0x01, 0x20, 0x70, 0x47, 0x00, - 0x00, 0xcc, 0xdd, 0x03, 0x20, 0xb0, 0xb5, 0x16, - 0x4d, 0x0c, 0x1c, 0x29, 0x68, 0x07, 0x1c, 0x00, - 0x20, 0x04, 0x29, 0x21, 0xd1, 0x79, 0x06, 0x1f, - 0xd0, 0xe9, 0x1d, 0x19, 0x31, 0x09, 0x78, 0xb9, - 0x42, 0x05, 0xd1, 0xe8, 0x1d, 0x15, 0x30, 0x21, - 0x1c, 0x00, 0xf0, 0x2e, 0xfd, 0x01, 0x20, 0xe9, - 0x1d, 0x29, 0x31, 0xed, 0x09, 0x00, 0x3f, 0x02, - 0x09, 0x7b, 0xb9, 0x42, 0x05, 0xd1, 0xe8, 0x1d, - 0x31, 0x30, 0x21, 0x1c, 0x00, 0xf0, 0x23, 0xfd, - 0x01, 0x20, 0xe9, 0x1d, 0x69, 0x31, 0x0a, 0x79, - 0xba, 0x42, 0x04, 0xd1, 0x08, 0x1c, 0x21, 0x1c, - 0x00, 0xf0, 0x19, 0xfd, 0x01, 0x20, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xcc, 0xdd, - 0x03, 0x20, 0x05, 0x49, 0x0a, 0x68, 0x04, 0x2a, - 0x02, 0xd1, 0x49, 0x7a, 0x01, 0x70, 0x01, 0xe0, - 0x00, 0x21, 0x01, 0x70, 0x01, 0x20, 0x70, 0x47, - 0x00, 0x00, 0xcc, 0xdd, 0x03, 0x20, 0xf0, 0xb5, - 0x85, 0xb0, 0x04, 0x1c, 0x00, 0x20, 0x01, 0x90, - 0x69, 0x46, 0x20, 0x1c, 0x00, 0xf0, 0x45, 0xfe, - 0x07, 0x1c, 0x3e, 0x48, 0x04, 0x90, 0x10, 0x38, - 0x03, 0x90, 0x20, 0x38, 0xc6, 0x1f, 0xc5, 0x1f, - 0x4d, 0x3d, 0x31, 0x3e, 0x00, 0x2c, 0x02, 0x90, - 0x05, 0xd0, 0x00, 0x2f, 0x69, 0xd0, 0x70, 0x38, - 0x00, 0x68, 0x04, 0x28, 0x16, 0xd1, 0x00, 0x20, - 0xff, 0xf7, 0xb9, 0xfa, 0x28, 0x1c, 0x00, 0xf0, - 0xcb, 0xfd, 0x30, 0x1c, 0x00, 0xf0, 0xc8, 0xfd, - 0x02, 0x98, 0x00, 0xf0, 0xc5, 0xfd, 0x03, 0x98, - 0x00, 0x22, 0x02, 0x70, 0x04, 0x98, 0x2e, 0x49, - 0x02, 0x73, 0x03, 0x20, 0x08, 0x60, 0x0a, 0x71, - 0x00, 0x2f, 0x41, 0xd0, 0x20, 0x1c, 0xff, 0xf7, - 0xa2, 0xfa, 0x29, 0x4c, 0x09, 0x22, 0x20, 0x1d, - 0x39, 0x1c, 0xdc, 0xf7, 0x78, 0xfc, 0x21, 0x7a, - 0x00, 0x20, 0x00, 0x29, 0x07, 0xd9, 0x00, 0x22, - 0x81, 0x00, 0x09, 0x19, 0x0a, 0x61, 0x21, 0x7a, - 0x01, 0x30, 0x81, 0x42, 0xf8, 0xd8, 0x21, 0x48, - 0x04, 0x27, 0x00, 0x68, 0x00, 0x28, 0x17, 0xd0, - 0x40, 0x23, 0x01, 0x22, 0x03, 0x21, 0x28, 0x1c, - 0x00, 0xf0, 0x22, 0xfd, 0x40, 0x23, 0x01, 0x22, - 0x82, 0x21, 0x30, 0x1c, 0x00, 0xf0, 0xed, 0x09, - 0x00, 0x40, 0x02, 0x1c, 0xfd, 0x10, 0x23, 0x03, - 0x22, 0x81, 0x21, 0x02, 0x98, 0x00, 0xf0, 0x16, - 0xfd, 0x03, 0x98, 0x07, 0x70, 0x04, 0x99, 0x84, - 0x20, 0x08, 0x73, 0x0b, 0xe0, 0x40, 0x23, 0x01, - 0x22, 0x01, 0x21, 0x28, 0x1c, 0x00, 0xf0, 0x0a, - 0xfd, 0x40, 0x23, 0x01, 0x22, 0x82, 0x21, 0x30, - 0x1c, 0x00, 0xf0, 0x04, 0xfd, 0x0e, 0x49, 0x01, - 0x20, 0x27, 0x60, 0x08, 0x70, 0x0a, 0x48, 0x00, - 0x22, 0x02, 0x76, 0x00, 0x68, 0x01, 0x21, 0x04, - 0x28, 0x00, 0xd0, 0x00, 0x21, 0x10, 0x20, 0x01, - 0xf0, 0x02, 0xfa, 0x01, 0x20, 0x01, 0x90, 0x01, - 0x98, 0x05, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x6c, 0xde, 0x03, 0x20, 0xcc, - 0xdd, 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, 0xc8, - 0x69, 0x03, 0x20, 0xb0, 0xb5, 0x1d, 0x4d, 0x0c, - 0x1c, 0x29, 0x68, 0x07, 0x1c, 0x00, 0x20, 0x04, - 0x29, 0x30, 0xd1, 0x79, 0x06, 0x2e, 0xd0, 0xe9, - 0x1d, 0x19, 0x31, 0x09, 0x78, 0xb9, 0x42, 0x05, - 0xd1, 0xe8, 0x1d, 0x15, 0x30, 0x00, 0xf0, 0x69, - 0xfc, 0x20, 0x70, 0x01, 0x20, 0xe9, 0x1d, 0x29, - 0x31, 0x09, 0x7b, 0xb9, 0x42, 0x05, 0xd1, 0xe8, - 0x1d, 0x31, 0x30, 0x00, 0xf0, 0x5e, 0xfc, 0x20, - 0x70, 0x01, 0x20, 0xe9, 0x1d, 0x69, 0x31, 0x0a, - 0x79, 0xba, 0x42, 0x04, 0xd1, 0x08, 0x1c, 0x00, - 0xf0, 0x54, 0xfc, 0x20, 0x70, 0x01, 0x20, 0xe9, - 0x1d, 0x89, 0x31, 0x0a, 0x78, 0x00, 0x21, 0xba, - 0x42, 0x01, 0xd1, 0x21, 0x70, 0x01, 0x20, 0xea, - 0x1d, 0x99, 0x32, 0x12, 0x7b, 0xba, 0x42, 0x01, - 0xd1, 0x21, 0x70, 0x01, 0x20, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xcc, 0xdd, 0x03, 0x20, 0x80, - 0xb5, 0x03, 0x1c, 0x0a, 0x48, 0x00, 0x27, 0x02, - 0x68, 0x04, 0x2a, 0x0b, 0xd1, 0x9a, 0x00, 0x12, - 0x18, 0xed, 0x09, 0x00, 0x41, 0x02, 0x12, 0x69, - 0x0a, 0x70, 0x40, 0x7a, 0x0a, 0x78, 0x19, 0x1c, - 0x00, 0xf0, 0x08, 0xfe, 0x00, 0x28, 0x00, 0xd0, - 0x01, 0x27, 0x38, 0x1c, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xcc, 0xdd, 0x03, 0x20, - 0xf0, 0xb5, 0x0b, 0x4e, 0x05, 0x1c, 0x30, 0x68, - 0x00, 0x27, 0x0c, 0x1c, 0x04, 0x28, 0x0a, 0xd1, - 0x29, 0x1c, 0x22, 0x1c, 0x70, 0x7a, 0x00, 0xf0, - 0xf1, 0xfd, 0x00, 0x28, 0x03, 0xd0, 0xa8, 0x00, - 0x80, 0x19, 0x04, 0x61, 0x01, 0x27, 0x38, 0x1c, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0xcc, 0xdd, 0x03, 0x20, 0x88, 0xb5, 0x07, 0x1c, - 0x00, 0xf0, 0xfc, 0xfc, 0x69, 0x46, 0x01, 0x20, - 0x00, 0xf0, 0x44, 0xfd, 0xc0, 0x79, 0xc0, 0x09, - 0x01, 0xd3, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, - 0x08, 0x49, 0x48, 0x76, 0x00, 0x20, 0xff, 0xf7, - 0xeb, 0xfe, 0x38, 0x1c, 0x01, 0xf0, 0xa2, 0xf8, - 0x05, 0x48, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd0, - 0x11, 0xf0, 0x7e, 0xfd, 0x88, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xcc, 0xdd, 0x03, 0x20, - 0xc8, 0x69, 0x03, 0x20, 0x02, 0x1c, 0x02, 0x48, - 0x02, 0x70, 0x01, 0x71, 0x70, 0x47, 0x00, 0x00, - 0xc0, 0x00, 0x00, 0xe0, 0x01, 0x1c, 0x02, 0x48, - 0x01, 0x70, 0x00, 0x79, 0x70, 0x47, 0x00, 0x00, - 0xc0, 0x00, 0x00, 0xe0, 0x00, 0x2a, 0x0b, 0xd9, - 0x06, 0x4b, 0x18, 0x70, 0x50, 0x1e, 0x00, 0x2a, - 0x06, 0xd9, 0x0a, 0x78, 0x1a, 0x71, 0x02, 0x1c, - 0x01, 0x38, 0x01, 0x31, 0x00, 0x2a, 0xf8, 0xd8, - 0x70, 0x47, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xe0, - 0x00, 0x2a, 0x0b, 0xd9, 0x06, 0x4b, 0x18, 0x70, - 0x50, 0x1e, 0x00, 0x2a, 0x06, 0xd9, 0x1a, 0x79, - 0x0a, 0x70, 0x02, 0x1c, 0x01, 0x38, 0x01, 0x31, - 0x00, 0x2a, 0xf8, 0xd8, 0xed, 0x09, 0x00, 0x42, - 0x02, 0x70, 0x47, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0xe0, 0x80, 0xb4, 0x08, 0x4b, 0x18, 0x70, 0x1f, - 0x79, 0x18, 0x70, 0x38, 0x1c, 0x88, 0x43, 0x00, - 0x06, 0x00, 0x0e, 0x00, 0x2a, 0x02, 0xd0, 0x0f, - 0x43, 0x38, 0x06, 0x00, 0x0e, 0x18, 0x71, 0x80, - 0xbc, 0x70, 0x47, 0x00, 0x00, 0xc0, 0x00, 0x00, - 0xe0, 0xb0, 0xb4, 0x0d, 0x49, 0x00, 0x22, 0xcc, - 0x1d, 0xf9, 0x34, 0x67, 0x69, 0x00, 0x2f, 0x11, - 0xd0, 0x0d, 0x7a, 0x4b, 0x7a, 0x1b, 0x02, 0x1d, - 0x43, 0xfb, 0x1f, 0x01, 0x3b, 0x02, 0x31, 0x9d, - 0x42, 0x08, 0xd1, 0x01, 0x60, 0x62, 0x61, 0x88, - 0x79, 0xcb, 0x79, 0x1b, 0x02, 0x18, 0x43, 0x08, - 0x30, 0xb0, 0xbc, 0x70, 0x47, 0x10, 0x1c, 0xfb, - 0xe7, 0x90, 0xde, 0x03, 0x20, 0xf0, 0xb5, 0x72, - 0x4c, 0xe7, 0x1d, 0x09, 0x37, 0x71, 0x4d, 0x28, - 0x68, 0x03, 0x30, 0x00, 0x06, 0x00, 0x0e, 0xff, - 0xf7, 0x97, 0xff, 0x41, 0x09, 0x63, 0xd3, 0x41, - 0x08, 0x61, 0xd3, 0xff, 0x20, 0xf8, 0x70, 0xf8, - 0x73, 0x6a, 0x48, 0x6b, 0x4d, 0x00, 0x68, 0x02, - 0x30, 0x00, 0x06, 0x00, 0x0e, 0xff, 0xf7, 0x88, - 0xff, 0x06, 0x1c, 0x66, 0x48, 0x00, 0x68, 0x04, - 0x30, 0x00, 0x06, 0x00, 0x0e, 0xff, 0xf7, 0x80, - 0xff, 0x32, 0x1a, 0x40, 0x20, 0xa9, 0x1c, 0x0d, - 0x1c, 0x62, 0x61, 0xff, 0xf7, 0x93, 0xff, 0x5f, - 0x48, 0x08, 0x23, 0x00, 0x68, 0x5d, 0x49, 0x58, - 0x40, 0x08, 0x60, 0x02, 0x21, 0x00, 0x28, 0x00, - 0xd0, 0x0a, 0x21, 0xfb, 0x78, 0x40, 0x26, 0x32, - 0x1c, 0x00, 0x2b, 0x00, 0xd1, 0x00, 0x22, 0x11, - 0x43, 0x09, 0x06, 0x09, 0x0e, 0x00, 0x06, 0x00, - 0x0e, 0xff, 0xf7, 0x5a, 0xff, 0x0e, 0x20, 0xff, - 0xf7, 0x5f, 0xff, 0x40, 0x08, 0x01, 0xd3, 0x08, - 0x20, 0x00, 0xe0, 0x00, 0x20, 0x4f, 0x49, 0xed, - 0x09, 0x00, 0x43, 0x02, 0x08, 0x60, 0x01, 0x21, - 0x0d, 0x20, 0xff, 0xf7, 0x4c, 0xff, 0x60, 0x69, - 0x01, 0x06, 0x09, 0x0e, 0x28, 0x1c, 0x00, 0xf0, - 0x94, 0xff, 0x00, 0x28, 0x1b, 0xd0, 0x48, 0x4c, - 0xb9, 0x78, 0x20, 0x68, 0x02, 0x30, 0x00, 0x06, - 0x00, 0x0e, 0xff, 0xf7, 0x3c, 0xff, 0x22, 0x68, - 0x03, 0x20, 0x00, 0x2a, 0x00, 0xd0, 0x0b, 0x20, - 0xf9, 0x78, 0x00, 0x29, 0x00, 0xd1, 0x00, 0x26, - 0x30, 0x43, 0x01, 0x06, 0x09, 0x0e, 0x10, 0x06, - 0x00, 0x0e, 0xff, 0xf7, 0x2c, 0xff, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x02, 0xe0, 0x00, 0x20, - 0x60, 0x61, 0xf8, 0xe7, 0xc6, 0x07, 0xf6, 0x0f, - 0x2f, 0xd0, 0x01, 0x22, 0x11, 0x1c, 0x00, 0x09, - 0x00, 0xd3, 0x00, 0x21, 0xf8, 0x78, 0x00, 0x28, - 0x00, 0xd0, 0x00, 0x22, 0x91, 0x42, 0x24, 0xd1, - 0x32, 0x48, 0x00, 0x68, 0x02, 0x30, 0x00, 0x06, - 0x00, 0x0e, 0xff, 0xf7, 0x18, 0xff, 0x05, 0x1c, - 0x2e, 0x48, 0x00, 0x68, 0x04, 0x30, 0x00, 0x06, - 0x00, 0x0e, 0xff, 0xf7, 0x10, 0xff, 0x28, 0x1a, - 0x05, 0x06, 0x2d, 0x0e, 0x60, 0x69, 0xff, 0x23, - 0x11, 0x33, 0x42, 0x19, 0x9a, 0x42, 0x27, 0x49, - 0x08, 0xd8, 0x40, 0x18, 0x81, 0x1c, 0x40, 0x20, - 0x2a, 0x1c, 0xff, 0xf7, 0x1a, 0xff, 0x60, 0x69, - 0x40, 0x19, 0x60, 0x61, 0xf8, 0x78, 0xc0, 0x43, - 0xf8, 0x70, 0x00, 0x2e, 0x21, 0xd0, 0x1e, 0x4d, - 0x28, 0x68, 0x00, 0x06, 0x00, 0x0e, 0xff, 0xf7, - 0xf2, 0xfe, 0x00, 0x09, 0x01, 0xd2, 0x01, 0x20, - 0x00, 0xe0, 0x00, 0x20, 0x29, 0x68, 0x01, 0x22, - 0x00, 0x29, 0x00, 0xd0, 0x00, 0x22, 0x90, 0x42, - 0x0f, 0xd0, 0x08, 0x20, 0x48, 0x40, 0x28, 0x60, - 0x00, 0x06, 0x00, 0x0e, 0xff, 0xf7, 0xdf, 0xfe, - 0x40, 0x08, 0xa8, 0xd2, 0x0d, 0x20, 0xff, 0xf7, - 0xda, 0xfe, 0xed, 0x09, 0x00, 0x44, 0x02, 0x40, - 0x08, 0x00, 0xd2, 0x38, 0xe7, 0xa1, 0xe7, 0x0d, - 0x4c, 0xb9, 0x78, 0x20, 0x68, 0x02, 0x30, 0x00, - 0x06, 0x00, 0x0e, 0xff, 0xf7, 0xc6, 0xfe, 0x22, - 0x68, 0x03, 0x20, 0x00, 0x2a, 0x00, 0xd0, 0x0b, - 0x20, 0xf9, 0x78, 0x40, 0x26, 0x00, 0x29, 0x00, - 0xd1, 0x00, 0x26, 0x30, 0x43, 0x01, 0x06, 0x09, - 0x0e, 0x10, 0x06, 0x00, 0x0e, 0xff, 0xf7, 0xb5, - 0xfe, 0x87, 0xe7, 0x90, 0xdf, 0x03, 0x20, 0xcc, - 0x69, 0x03, 0x20, 0x90, 0xde, 0x03, 0x20, 0xf0, - 0xb5, 0x1e, 0x48, 0xc7, 0x1d, 0xff, 0x37, 0x0a, - 0x37, 0x39, 0x7b, 0xba, 0x78, 0x91, 0x42, 0x00, - 0xdb, 0x11, 0x1c, 0x0c, 0x06, 0x24, 0x0e, 0xc6, - 0x1d, 0xf9, 0x36, 0x40, 0x20, 0x22, 0x1c, 0xb1, - 0x69, 0xff, 0xf7, 0xab, 0xfe, 0x16, 0x4d, 0x28, - 0x68, 0x02, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x21, - 0x1c, 0xff, 0xf7, 0x93, 0xfe, 0x2a, 0x68, 0x07, - 0x20, 0x00, 0x2a, 0x00, 0xd0, 0x0f, 0x20, 0xfb, - 0x7b, 0x40, 0x21, 0x00, 0x2b, 0x00, 0xd1, 0x00, - 0x21, 0x08, 0x43, 0x01, 0x06, 0x09, 0x0e, 0x10, - 0x06, 0x00, 0x0e, 0xff, 0xf7, 0x82, 0xfe, 0xb0, - 0x69, 0x00, 0x19, 0xb0, 0x61, 0x38, 0x7b, 0x00, - 0x1b, 0x38, 0x73, 0x39, 0x7b, 0x01, 0x20, 0x00, - 0x29, 0x02, 0xd1, 0xb9, 0x78, 0xa1, 0x42, 0x00, - 0xd0, 0x00, 0x20, 0x78, 0x73, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x90, 0xde, 0x03, 0x20, 0xcc, - 0x69, 0x03, 0x20, 0xf0, 0xb5, 0x62, 0x4c, 0x20, - 0x68, 0x03, 0x30, 0x00, 0x06, 0x00, 0x0e, 0xff, - 0xf7, 0x6c, 0xfe, 0xc0, 0x07, 0xc0, 0x0f, 0x03, - 0x26, 0x40, 0x25, 0x00, 0x28, 0x5d, 0x4f, 0x03, - 0xd0, 0xf8, 0x7b, 0xc0, 0x43, 0xf8, 0x73, 0x53, - 0xe0, 0x20, 0x68, 0x00, 0x06, 0x00, 0x0e, 0xff, - 0xf7, 0x5c, 0xfe, 0x80, 0x09, 0xed, 0x09, 0x00, - 0x45, 0x02, 0x4c, 0xd2, 0x0e, 0x20, 0xff, 0xf7, - 0x57, 0xfe, 0xc1, 0x07, 0xc9, 0x0f, 0x20, 0x68, - 0x01, 0x22, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x22, - 0x91, 0x42, 0x32, 0xd0, 0x02, 0x30, 0x00, 0x06, - 0x00, 0x0e, 0xb9, 0x78, 0xff, 0xf7, 0x40, 0xfe, - 0x20, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0b, 0x26, - 0xfa, 0x78, 0x29, 0x1c, 0x00, 0x2a, 0x00, 0xd1, - 0x00, 0x21, 0x31, 0x43, 0x09, 0x06, 0x09, 0x0e, - 0x00, 0x06, 0x00, 0x0e, 0xff, 0xf7, 0x30, 0xfe, - 0x20, 0x68, 0x08, 0x23, 0x58, 0x40, 0x20, 0x60, - 0x02, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x21, - 0xff, 0xf7, 0x26, 0xfe, 0x22, 0x68, 0x07, 0x20, - 0x00, 0x2a, 0x00, 0xd0, 0x0f, 0x20, 0xf9, 0x7b, - 0x00, 0x29, 0x00, 0xd1, 0x00, 0x25, 0x28, 0x43, - 0x01, 0x06, 0x09, 0x0e, 0x10, 0x06, 0x00, 0x0e, - 0xff, 0xf7, 0x16, 0xfe, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x06, 0x00, 0x0e, 0xff, 0xf7, - 0x17, 0xfe, 0x01, 0x23, 0x18, 0x43, 0x01, 0x06, - 0x20, 0x68, 0x09, 0x0e, 0x00, 0x06, 0x00, 0x0e, - 0xff, 0xf7, 0x06, 0xfe, 0xee, 0xe7, 0x79, 0x7b, - 0x30, 0x48, 0x00, 0x29, 0x02, 0xd1, 0x39, 0x7b, - 0x00, 0x29, 0x02, 0xd0, 0xff, 0xf7, 0x4e, 0xff, - 0xe4, 0xe7, 0x41, 0x78, 0x00, 0x29, 0x05, 0xd0, - 0x07, 0x20, 0xff, 0xf7, 0xf5, 0xfd, 0x29, 0x49, - 0x00, 0x20, 0x48, 0x70, 0xb8, 0x7b, 0x00, 0x28, - 0x13, 0xd0, 0x00, 0x20, 0xb8, 0x73, 0x20, 0x68, - 0x08, 0x23, 0x58, 0x40, 0x20, 0x60, 0x00, 0x06, - 0x00, 0x0e, 0xff, 0xf7, 0xed, 0xfd, 0x40, 0x08, - 0xcc, 0xd2, 0x0d, 0x20, 0xff, 0xf7, 0xe8, 0xfd, - 0x40, 0x08, 0xc7, 0xd2, 0xff, 0xf7, 0x42, 0xfe, - 0xc4, 0xe7, 0x20, 0x68, 0x08, 0x23, 0x58, 0x40, - 0x20, 0x60, 0x02, 0x30, 0x00, 0x06, 0x00, 0x0e, - 0xed, 0x09, 0x00, 0x46, 0x02, 0xb9, 0x78, 0xff, - 0xf7, 0xd1, 0xfd, 0x20, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x0b, 0x26, 0xfa, 0x78, 0x29, 0x1c, 0x00, - 0x2a, 0x00, 0xd1, 0x00, 0x21, 0x31, 0x43, 0x09, - 0x06, 0x09, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0xff, - 0xf7, 0xc1, 0xfd, 0x20, 0x68, 0x08, 0x23, 0x58, - 0x40, 0x20, 0x60, 0x02, 0x30, 0x00, 0x06, 0x00, - 0x0e, 0xb9, 0x78, 0xff, 0xf7, 0xb7, 0xfd, 0x22, - 0x68, 0x0b, 0x20, 0x00, 0x2a, 0x00, 0xd0, 0x03, - 0x20, 0xf9, 0x78, 0x00, 0x29, 0x00, 0xd1, 0x00, - 0x25, 0x28, 0x43, 0x01, 0x06, 0x09, 0x0e, 0x10, - 0x06, 0x00, 0x0e, 0xff, 0xf7, 0xa7, 0xfd, 0x8f, - 0xe7, 0xcc, 0x69, 0x03, 0x20, 0xa0, 0xdf, 0x03, - 0x20, 0x90, 0xde, 0x03, 0x20, 0x01, 0x49, 0x48, - 0x70, 0x70, 0x47, 0x00, 0x00, 0x90, 0xde, 0x03, - 0x20, 0xb0, 0xb5, 0x27, 0x4a, 0x00, 0x23, 0xd7, - 0x1d, 0xff, 0x37, 0x0a, 0x37, 0x7b, 0x73, 0x01, - 0x23, 0x00, 0x29, 0x39, 0x73, 0x00, 0xd0, 0x00, - 0x23, 0x19, 0x06, 0x09, 0x0e, 0xb9, 0x73, 0x39, - 0xd0, 0x20, 0x4c, 0x08, 0x23, 0x20, 0x68, 0x58, - 0x40, 0x20, 0x60, 0x02, 0x30, 0x00, 0x06, 0x00, - 0x0e, 0xb9, 0x78, 0xff, 0xf7, 0x7f, 0xfd, 0x20, - 0x68, 0x03, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x0b, - 0x21, 0xfb, 0x78, 0x40, 0x25, 0x2a, 0x1c, 0x00, - 0x2b, 0x00, 0xd1, 0x00, 0x22, 0x11, 0x43, 0x09, - 0x06, 0x09, 0x0e, 0x00, 0x06, 0x00, 0x0e, 0xff, - 0xf7, 0x6d, 0xfd, 0x20, 0x68, 0x08, 0x23, 0x58, - 0x40, 0x20, 0x60, 0x02, 0x30, 0x00, 0x06, 0x00, - 0x0e, 0x00, 0x21, 0xff, 0xf7, 0x63, 0xfd, 0x22, - 0x68, 0x0f, 0x20, 0x00, 0x2a, 0x00, 0xd0, 0x07, - 0x20, 0xf9, 0x7b, 0x00, 0x29, 0x00, 0xd1, 0x00, - 0x25, 0x28, 0x43, 0x01, 0x06, 0x09, 0x0e, 0x10, - 0x06, 0x00, 0x0e, 0xed, 0x09, 0x00, 0x47, 0x02, - 0xff, 0xf7, 0x53, 0xfd, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xd1, 0x1d, 0xf9, 0x31, 0x88, 0x61, - 0xff, 0xf7, 0x9d, 0xfe, 0xf6, 0xe7, 0x90, 0xde, - 0x03, 0x20, 0xcc, 0x69, 0x03, 0x20, 0x00, 0xb5, - 0x07, 0x48, 0x00, 0x68, 0x00, 0x06, 0x00, 0x0e, - 0xff, 0xf7, 0x47, 0xfd, 0xc0, 0x08, 0x03, 0xd3, - 0xff, 0xf7, 0xcf, 0xfe, 0x08, 0xbc, 0x18, 0x47, - 0xff, 0xf7, 0x9d, 0xfd, 0xfa, 0xe7, 0xcc, 0x69, - 0x03, 0x20, 0x00, 0xb5, 0x07, 0x48, 0x27, 0x21, - 0x00, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x2f, 0x21, - 0x09, 0x06, 0x09, 0x0e, 0x00, 0x06, 0x00, 0x0e, - 0xff, 0xf7, 0x27, 0xfd, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xcc, 0x69, 0x03, 0x20, 0xf8, 0xb5, - 0x52, 0x4d, 0x07, 0x1c, 0x28, 0x1c, 0xff, 0x22, - 0x00, 0x21, 0x21, 0x32, 0xdc, 0xf7, 0x1f, 0xf8, - 0x68, 0x46, 0x00, 0xf0, 0x2c, 0xfa, 0xec, 0x1d, - 0xff, 0x34, 0xc0, 0x79, 0x0a, 0x34, 0x00, 0x2f, - 0x4b, 0x4e, 0xa0, 0x70, 0x48, 0xd1, 0x00, 0x21, - 0x07, 0x20, 0xff, 0xf7, 0x0a, 0xfd, 0x00, 0x21, - 0x00, 0x20, 0xff, 0xf7, 0x06, 0xfd, 0x00, 0x21, - 0x08, 0x20, 0xff, 0xf7, 0x02, 0xfd, 0x01, 0x21, - 0x0d, 0x20, 0xff, 0xf7, 0xfe, 0xfc, 0x0e, 0x20, - 0xff, 0xf7, 0x03, 0xfd, 0x40, 0x08, 0x01, 0xd3, - 0x08, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x08, 0x23, - 0x58, 0x40, 0x30, 0x60, 0x01, 0x30, 0x00, 0x06, - 0x00, 0x0e, 0x40, 0x21, 0x37, 0x1c, 0xff, 0xf7, - 0xec, 0xfc, 0x38, 0x68, 0x08, 0x23, 0x58, 0x40, - 0x38, 0x60, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, - 0x40, 0x21, 0xff, 0xf7, 0xe2, 0xfc, 0xa1, 0x78, - 0x38, 0x68, 0x02, 0x30, 0x00, 0x06, 0x00, 0x0e, - 0xff, 0xf7, 0xdb, 0xfc, 0x3a, 0x68, 0x03, 0x20, - 0x00, 0x2a, 0x00, 0xd0, 0x0b, 0x20, 0xed, 0x09, - 0x00, 0x48, 0x02, 0xe3, 0x78, 0x40, 0x21, 0x00, - 0x2b, 0x00, 0xd1, 0x00, 0x21, 0x08, 0x43, 0x01, - 0x06, 0x09, 0x0e, 0x10, 0x06, 0x00, 0x0e, 0xff, - 0xf7, 0xca, 0xfc, 0x01, 0x21, 0x05, 0x20, 0xff, - 0xf7, 0xc6, 0xfc, 0x3f, 0xe0, 0x0e, 0x20, 0xff, - 0xf7, 0xca, 0xfc, 0x40, 0x08, 0x01, 0xd3, 0x08, - 0x20, 0x00, 0xe0, 0x00, 0x20, 0x30, 0x60, 0x00, - 0x20, 0xff, 0xf7, 0xc1, 0xfc, 0x00, 0x09, 0x23, - 0xd3, 0x08, 0x20, 0xff, 0xf7, 0xbc, 0xfc, 0x00, - 0x09, 0x1e, 0xd2, 0x00, 0x20, 0xff, 0xf7, 0xb7, - 0xfc, 0x40, 0x08, 0x11, 0xd2, 0x08, 0x20, 0xff, - 0xf7, 0xb2, 0xfc, 0x40, 0x08, 0x09, 0xd2, 0x0e, - 0x20, 0xff, 0xf7, 0xad, 0xfc, 0x40, 0x08, 0x01, - 0xd3, 0x08, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x30, - 0x60, 0x18, 0xe0, 0x00, 0x20, 0x30, 0x60, 0x15, - 0xe0, 0x08, 0x20, 0xff, 0xf7, 0xa0, 0xfc, 0x40, - 0x08, 0x10, 0xd2, 0x08, 0x20, 0x30, 0x60, 0x0d, - 0xe0, 0x30, 0x68, 0x08, 0x23, 0x58, 0x40, 0x30, - 0x60, 0x01, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x40, - 0x21, 0xff, 0xf7, 0x89, 0xfc, 0x30, 0x68, 0x08, - 0x23, 0x58, 0x40, 0x30, 0x60, 0x01, 0x20, 0x28, - 0x70, 0x07, 0x20, 0xff, 0xf7, 0x88, 0xfc, 0xf8, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x90, - 0xde, 0x03, 0x20, 0xcc, 0x69, 0x03, 0x20, 0xf0, - 0xb5, 0x07, 0x1c, 0x0d, 0x20, 0x00, 0x24, 0x0d, - 0x1c, 0xff, 0xf7, 0x79, 0xfc, 0x39, 0x7d, 0x08, - 0x40, 0x45, 0xd0, 0x0d, 0x20, 0xff, 0xf7, 0x6b, - 0xfc, 0x78, 0x7c, 0x03, 0x30, 0x00, 0x06, 0x00, - 0x0e, 0xff, 0xf7, 0x6d, 0xfc, 0x41, 0x08, 0x29, - 0xd3, 0x01, 0x21, 0x0a, 0x1c, 0x00, 0x09, 0x00, - 0xd3, 0x00, 0x22, 0xf8, 0x7c, 0x00, 0x28, 0x00, - 0xd0, 0x00, 0x21, 0x8a, 0x42, 0x1e, 0xd1, 0xc0, - 0x43, 0xed, 0x09, 0x00, 0x49, 0x02, 0xf8, 0x74, - 0x78, 0x7c, 0x04, 0x30, 0x00, 0x06, 0x00, 0x0e, - 0xff, 0xf7, 0x58, 0xfc, 0x39, 0x7c, 0x15, 0x4b, - 0x08, 0x1a, 0x06, 0x06, 0xb8, 0x69, 0x36, 0x0e, - 0x81, 0x19, 0x99, 0x42, 0x07, 0xd8, 0x41, 0x19, - 0xb8, 0x7c, 0x32, 0x1c, 0xff, 0xf7, 0x64, 0xfc, - 0xb8, 0x69, 0x80, 0x19, 0xb8, 0x61, 0x38, 0x7c, - 0xb0, 0x42, 0x02, 0xd9, 0x00, 0x20, 0xbc, 0x69, - 0xb8, 0x61, 0x39, 0x7c, 0x78, 0x7c, 0x02, 0x30, - 0x00, 0x06, 0x00, 0x0e, 0xff, 0xf7, 0x32, 0xfc, - 0xf9, 0x7c, 0x43, 0x20, 0x00, 0x29, 0x00, 0xdc, - 0x03, 0x20, 0x01, 0x06, 0x09, 0x0e, 0x78, 0x7c, - 0xff, 0xf7, 0x28, 0xfc, 0x20, 0x1c, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x10, 0x10, 0x00, 0x00, - 0x00, 0xb5, 0x0a, 0x1c, 0x20, 0x21, 0x40, 0x7c, - 0xff, 0xf7, 0x50, 0xfc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x40, 0x7c, 0xff, 0xf7, 0x1e, 0xfc, - 0x80, 0x09, 0x02, 0xd3, 0x01, 0x20, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x20, 0xfb, 0xe7, 0xf0, 0xb5, - 0x07, 0x1c, 0x0d, 0x20, 0x14, 0x1c, 0x0d, 0x1c, - 0xff, 0xf7, 0x10, 0xfc, 0x39, 0x7d, 0x08, 0x40, - 0x01, 0x26, 0x00, 0x28, 0x08, 0xd1, 0x78, 0x7c, - 0xff, 0xf7, 0x08, 0xfc, 0x40, 0x08, 0x03, 0xd3, - 0x30, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x0d, 0x20, 0xff, 0xf7, 0xff, 0xfb, 0x39, 0x7d, - 0x08, 0x40, 0x16, 0xd0, 0x0d, 0x20, 0xff, 0xf7, - 0xf1, 0xfb, 0x78, 0x7c, 0x03, 0x30, 0x00, 0x06, - 0x00, 0x0e, 0xff, 0xf7, 0xf3, 0xfb, 0x40, 0x08, - 0x2b, 0xd3, 0xf8, 0x7c, 0xc0, 0x43, 0xf8, 0x74, - 0x39, 0x7c, 0xb8, 0x69, 0x40, 0x18, 0xa0, 0x42, - 0x02, 0xd9, 0x00, 0x20, 0xb8, 0x61, 0xe0, 0xe7, - 0xb8, 0x61, 0xb8, 0x69, 0x39, 0x7c, 0x24, 0x1a, - 0x8c, 0x42, 0x00, 0xd2, 0xed, 0x09, 0x00, 0x4a, - 0x02, 0x21, 0x1c, 0x0c, 0x1c, 0x41, 0x19, 0xb8, - 0x7c, 0x22, 0x1c, 0xff, 0xf7, 0xe1, 0xfb, 0x78, - 0x7c, 0x02, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x21, - 0x06, 0x09, 0x0e, 0xff, 0xf7, 0xc9, 0xfb, 0xf9, - 0x7c, 0x47, 0x20, 0x00, 0x29, 0x00, 0xdc, 0x07, - 0x20, 0x01, 0x06, 0x09, 0x0e, 0x78, 0x7c, 0xff, - 0xf7, 0xbf, 0xfb, 0x30, 0x1c, 0xbf, 0xe7, 0xf9, - 0x7c, 0x47, 0x20, 0x00, 0x29, 0x00, 0xdc, 0x07, - 0x20, 0x01, 0x06, 0x09, 0x0e, 0x78, 0x7c, 0xff, - 0xf7, 0xb3, 0xfb, 0x30, 0x1c, 0xb3, 0xe7, 0xf0, - 0xb5, 0x07, 0x1c, 0x08, 0x1c, 0x14, 0x1c, 0x1d, - 0x1c, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, 0x3e, - 0x1c, 0x0e, 0xc6, 0x0e, 0xc6, 0x08, 0xc6, 0x01, - 0x22, 0x3a, 0x60, 0x11, 0x1c, 0x03, 0x0a, 0x38, - 0x71, 0x00, 0xd3, 0x00, 0x21, 0xb9, 0x60, 0xfc, - 0x60, 0x3d, 0x74, 0x45, 0x06, 0x6d, 0x0e, 0xaa, - 0x40, 0x00, 0x01, 0x40, 0x06, 0x40, 0x0e, 0x3a, - 0x75, 0x78, 0x74, 0x03, 0x2c, 0x05, 0xd1, 0x60, - 0x20, 0x00, 0x29, 0x00, 0xd0, 0x70, 0x20, 0xb8, - 0x74, 0x04, 0xe0, 0x80, 0x20, 0x00, 0x29, 0x00, - 0xd0, 0xc0, 0x20, 0xb8, 0x74, 0x00, 0x24, 0xfc, - 0x74, 0x78, 0x7c, 0x04, 0x30, 0x00, 0x06, 0x00, - 0x0e, 0x00, 0x21, 0xff, 0xf7, 0x7d, 0xfb, 0xb9, - 0x7c, 0x78, 0x7c, 0x01, 0x30, 0x00, 0x06, 0x00, - 0x0e, 0xff, 0xf7, 0x76, 0xfb, 0xb8, 0x68, 0x00, - 0x28, 0x00, 0xd0, 0x3c, 0x7c, 0x78, 0x7c, 0x21, - 0x06, 0x09, 0x0e, 0x02, 0x30, 0x00, 0x06, 0x00, - 0x0e, 0xff, 0xf7, 0x6a, 0xfb, 0x78, 0x7c, 0x00, - 0x21, 0xff, 0xf7, 0x66, 0xfb, 0x39, 0x7d, 0x08, - 0x1c, 0xfe, 0xf7, 0x68, 0xff, 0xb8, 0x68, 0x00, - 0x28, 0x05, 0xd1, 0xf9, 0x7c, 0x46, 0x20, 0x00, - 0x29, 0x06, 0xdc, 0x06, 0x20, 0x04, 0xe0, 0xed, - 0x09, 0x00, 0x4b, 0x02, 0xf9, 0x7c, 0x43, 0x20, - 0x00, 0x29, 0x00, 0xdc, 0x03, 0x20, 0x01, 0x06, - 0x09, 0x0e, 0x78, 0x7c, 0xff, 0xf7, 0x4f, 0xfb, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0x01, 0x68, 0x00, 0x29, 0x0c, 0xd0, 0x81, 0x68, - 0x00, 0x29, 0x09, 0xd1, 0xc2, 0x7c, 0x46, 0x21, - 0x00, 0x2a, 0x00, 0xdc, 0x06, 0x21, 0x09, 0x06, - 0x09, 0x0e, 0x40, 0x7c, 0xff, 0xf7, 0x3b, 0xfb, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, - 0x00, 0x68, 0x00, 0x28, 0x0c, 0xd0, 0x38, 0x7d, - 0xfe, 0xf7, 0x48, 0xff, 0x78, 0x7c, 0x00, 0x21, - 0xff, 0xf7, 0x2d, 0xfb, 0x00, 0x21, 0x00, 0x22, - 0x00, 0x23, 0x0e, 0xc7, 0x0e, 0xc7, 0x08, 0xc7, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x88, 0xb5, - 0x19, 0x48, 0x19, 0x4f, 0x43, 0x7a, 0x01, 0x7a, - 0x1b, 0x02, 0x19, 0x43, 0x79, 0x81, 0xc3, 0x79, - 0x80, 0x79, 0x1b, 0x02, 0x18, 0x43, 0xb8, 0x81, - 0x15, 0x48, 0x00, 0x68, 0x00, 0x28, 0x0c, 0xd0, - 0x78, 0x89, 0x01, 0x23, 0x18, 0x43, 0x78, 0x81, - 0x01, 0x20, 0x78, 0x74, 0x20, 0x21, 0xf9, 0x71, - 0xe0, 0x21, 0x39, 0x71, 0x78, 0x71, 0xb8, 0x71, - 0x07, 0xe0, 0x02, 0x20, 0x78, 0x74, 0x40, 0x20, - 0xf8, 0x71, 0xff, 0x20, 0x38, 0x71, 0x78, 0x71, - 0xb8, 0x71, 0x6a, 0x46, 0x03, 0x21, 0x00, 0x20, - 0xff, 0xf7, 0x15, 0xf8, 0x00, 0xa8, 0x00, 0x78, - 0x02, 0x28, 0x01, 0xdc, 0x00, 0x20, 0x38, 0x74, - 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x30, 0x7c, - 0x00, 0x00, 0xd0, 0x69, 0x03, 0x20, 0xc0, 0x69, - 0x03, 0x20, 0x90, 0xb5, 0x07, 0x4c, 0x07, 0x1c, - 0x12, 0x22, 0x20, 0x1c, 0x04, 0x49, 0xdb, 0xf7, - 0x70, 0xfe, 0x20, 0x78, 0x38, 0x70, 0x20, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xd0, 0x69, - 0x03, 0x20, 0xed, 0x09, 0x00, 0x4c, 0x02, 0xb0, - 0xdf, 0x03, 0x20, 0xf3, 0xb5, 0x82, 0xb0, 0x01, - 0x38, 0x05, 0x06, 0x45, 0x48, 0x2d, 0x0e, 0x40, - 0x7c, 0x00, 0x27, 0xa8, 0x42, 0x65, 0xdd, 0x43, - 0x48, 0x44, 0x4e, 0x00, 0x68, 0x44, 0x4c, 0x00, - 0x28, 0x08, 0xd0, 0xf1, 0x1d, 0xff, 0x31, 0x09, - 0x22, 0x20, 0x1c, 0x6b, 0x31, 0xdb, 0xf7, 0x4f, - 0xfe, 0x01, 0x25, 0x12, 0xe0, 0x01, 0x2d, 0x08, - 0xdb, 0x09, 0x22, 0x20, 0x1c, 0x31, 0x1c, 0xdb, - 0xf7, 0x46, 0xfe, 0x68, 0x1c, 0x60, 0x71, 0x00, - 0x25, 0x07, 0xe0, 0xff, 0x20, 0x72, 0x30, 0x68, - 0x43, 0x81, 0x19, 0x09, 0x22, 0x20, 0x1c, 0xdb, - 0xf7, 0x3a, 0xfe, 0x34, 0x48, 0x80, 0x21, 0xc1, - 0x71, 0x64, 0x21, 0x01, 0x72, 0x47, 0x80, 0x00, - 0x79, 0x00, 0x27, 0x00, 0x24, 0x00, 0x28, 0x4b, - 0xd9, 0xff, 0x20, 0x72, 0x30, 0x68, 0x43, 0x80, - 0x19, 0x01, 0x90, 0xb4, 0x21, 0x61, 0x43, 0x01, - 0x98, 0x2b, 0x4d, 0x40, 0x18, 0x39, 0x01, 0xc9, - 0x1b, 0x49, 0x00, 0x46, 0x18, 0x00, 0x90, 0x68, - 0x88, 0xf1, 0x1d, 0x02, 0x31, 0x09, 0x22, 0x40, - 0x19, 0x09, 0x30, 0xdb, 0xf7, 0x18, 0xfe, 0x68, - 0x88, 0x09, 0x30, 0x68, 0x80, 0x70, 0x7b, 0x00, - 0x25, 0x00, 0x28, 0x15, 0xd9, 0xe8, 0x00, 0x40, - 0x1b, 0x30, 0x18, 0x1e, 0x4a, 0xc1, 0x1d, 0x50, - 0x88, 0x0b, 0x31, 0x80, 0x18, 0x07, 0x22, 0x09, - 0x30, 0xdb, 0xf7, 0x05, 0xfe, 0x1a, 0x4a, 0x50, - 0x88, 0x07, 0x30, 0x50, 0x80, 0x02, 0x2d, 0x03, - 0xd0, 0x70, 0x7b, 0x01, 0x35, 0xa8, 0x42, 0xe9, - 0xd8, 0x05, 0x2f, 0x03, 0xd1, 0x00, 0x27, 0x01, - 0x34, 0x0e, 0xe0, 0x1c, 0xe0, 0x01, 0x37, 0x39, - 0x01, 0xc9, 0x1b, 0x00, 0x98, 0x49, 0x00, 0x40, - 0x18, 0xc1, 0x7a, 0xa1, 0x42, 0x02, 0xd1, 0x40, - 0x7a, 0x00, 0x28, 0x01, 0xd1, 0xed, 0x09, 0x00, - 0x4d, 0x02, 0x00, 0x27, 0x01, 0x34, 0x0b, 0x4d, - 0x28, 0x79, 0xa0, 0x42, 0xb8, 0xd8, 0x09, 0x48, - 0x41, 0x88, 0x09, 0x31, 0x41, 0x80, 0x41, 0x88, - 0x03, 0x9a, 0x11, 0x70, 0x04, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0xf9, 0xe7, - 0xd0, 0x69, 0x03, 0x20, 0xc0, 0x69, 0x03, 0x20, - 0xe4, 0x69, 0x03, 0x20, 0xc4, 0xdf, 0x03, 0x20, - 0xb0, 0xb5, 0x01, 0x38, 0x00, 0x06, 0x00, 0x0e, - 0x0c, 0x1c, 0x18, 0x49, 0x17, 0x1c, 0x49, 0x7c, - 0x81, 0x42, 0x28, 0xdd, 0x16, 0x49, 0x09, 0x68, - 0x00, 0x29, 0x01, 0xd0, 0x01, 0x20, 0x02, 0xe0, - 0x01, 0x28, 0x00, 0xdb, 0x00, 0x20, 0xff, 0x23, - 0x72, 0x33, 0x58, 0x43, 0x11, 0x49, 0x12, 0x4d, - 0x40, 0x18, 0xb4, 0x21, 0x61, 0x43, 0x40, 0x18, - 0x39, 0x01, 0xc9, 0x1b, 0x49, 0x00, 0x40, 0x18, - 0xc1, 0x1d, 0x02, 0x31, 0x09, 0x22, 0x28, 0x1c, - 0xdb, 0xf7, 0xa8, 0xfd, 0x28, 0x78, 0x00, 0x28, - 0x09, 0xd0, 0xa8, 0x78, 0xa0, 0x42, 0x06, 0xd1, - 0xe8, 0x78, 0xb8, 0x42, 0x03, 0xd1, 0x28, 0x1c, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, - 0xfa, 0xe7, 0x00, 0x00, 0xd0, 0x69, 0x03, 0x20, - 0xc0, 0x69, 0x03, 0x20, 0xe4, 0x69, 0x03, 0x20, - 0x0c, 0xe0, 0x03, 0x20, 0x90, 0xb4, 0x01, 0x38, - 0x00, 0x06, 0x00, 0x0e, 0x1f, 0x1c, 0x1b, 0x4b, - 0x5b, 0x7c, 0x83, 0x42, 0x30, 0xdd, 0x1a, 0x4b, - 0x1b, 0x68, 0x00, 0x2b, 0x01, 0xd0, 0x01, 0x20, - 0x02, 0xe0, 0x01, 0x28, 0x00, 0xdb, 0x00, 0x20, - 0xff, 0x23, 0x72, 0x33, 0x58, 0x43, 0x15, 0x4b, - 0xc0, 0x18, 0xb4, 0x23, 0x4b, 0x43, 0xc0, 0x18, - 0x13, 0x01, 0x9b, 0x1a, 0x5b, 0x00, 0xc0, 0x18, - 0xc3, 0x7a, 0x8b, 0x42, 0x18, 0xd1, 0x01, 0x7b, - 0x91, 0x42, 0x15, 0xd1, 0x42, 0x7b, 0x00, 0x21, - 0xed, 0x09, 0x00, 0x4e, 0x02, 0x00, 0x2a, 0x11, - 0xd9, 0xcb, 0x00, 0x5b, 0x1a, 0xc3, 0x18, 0x9c, - 0x7c, 0x00, 0x2c, 0x08, 0xd0, 0x1b, 0x7d, 0xbb, - 0x42, 0x05, 0xd1, 0xcb, 0x00, 0x59, 0x1a, 0x40, - 0x18, 0x12, 0x30, 0x90, 0xbc, 0x70, 0x47, 0x01, - 0x31, 0x8a, 0x42, 0xed, 0xd8, 0x00, 0x20, 0xf8, - 0xe7, 0xd0, 0x69, 0x03, 0x20, 0xc0, 0x69, 0x03, - 0x20, 0xe4, 0x69, 0x03, 0x20, 0xb0, 0xb5, 0x83, - 0xb0, 0x07, 0x1c, 0x40, 0x78, 0x00, 0x24, 0x0d, - 0x28, 0x68, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, - 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x07, 0x75, 0x74, - 0xae, 0x74, 0xd8, 0xd7, 0x74, 0xd6, 0xd5, 0xd4, - 0xd3, 0x74, 0x00, 0x38, 0x78, 0x80, 0x28, 0x03, - 0xd0, 0x81, 0x28, 0x01, 0xd0, 0x82, 0x28, 0x65, - 0xd1, 0xb9, 0x78, 0xfb, 0x78, 0x1b, 0x02, 0x19, - 0x43, 0x60, 0xd1, 0xb9, 0x79, 0xfb, 0x79, 0x1b, - 0x02, 0x19, 0x43, 0x02, 0x29, 0x5a, 0xd1, 0x00, - 0x07, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x28, 0x21, - 0xd0, 0x01, 0x28, 0x44, 0xd0, 0x02, 0x28, 0x1c, - 0xd1, 0x7b, 0x79, 0x38, 0x79, 0x01, 0xa9, 0x1b, - 0x02, 0x18, 0x43, 0x00, 0xab, 0x18, 0x70, 0x00, - 0xa8, 0x00, 0x78, 0xff, 0xf7, 0xf1, 0xf8, 0x00, - 0x28, 0x0f, 0xd0, 0x02, 0xab, 0x1d, 0x80, 0x02, - 0x98, 0x01, 0xa9, 0x09, 0x78, 0x40, 0x08, 0x40, - 0x00, 0xc9, 0x07, 0xc9, 0x0f, 0x08, 0x43, 0x02, - 0x90, 0x02, 0xa8, 0x02, 0x21, 0xff, 0xf7, 0xdc, - 0xfb, 0x01, 0x24, 0xad, 0xe0, 0x38, 0x79, 0x7b, - 0x79, 0x1b, 0x02, 0x18, 0x43, 0xf9, 0xd1, 0x69, - 0x46, 0x01, 0xa8, 0xfe, 0xf7, 0xfd, 0xff, 0x00, - 0x28, 0x17, 0xd0, 0x02, 0xab, 0x1d, 0x80, 0x02, - 0x98, 0x01, 0xa9, 0x09, 0x78, 0x40, 0x08, 0x40, - 0x00, 0xc9, 0x07, 0xc9, 0x0f, 0x08, 0x43, 0x00, - 0xa9, 0x09, 0x78, 0xed, 0x09, 0x00, 0x4f, 0x02, - 0x02, 0x23, 0x98, 0x43, 0xc9, 0x07, 0xc9, 0x0f, - 0x49, 0x00, 0x08, 0x43, 0x02, 0x90, 0x02, 0xa8, - 0x02, 0x21, 0xff, 0xf7, 0xb8, 0xfb, 0x01, 0x24, - 0xda, 0xe7, 0xa1, 0xe0, 0x38, 0x79, 0x7b, 0x79, - 0x1b, 0x02, 0x18, 0x43, 0xd4, 0xd1, 0x02, 0x98, - 0x00, 0x0c, 0x00, 0x04, 0x02, 0x90, 0x02, 0xa8, - 0x02, 0x21, 0xff, 0xf7, 0xa8, 0xfb, 0x01, 0x24, - 0xca, 0xe7, 0xee, 0xe0, 0x38, 0x78, 0x00, 0x28, - 0x03, 0xd0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, - 0x71, 0xd1, 0xb9, 0x79, 0xfb, 0x79, 0x1b, 0x02, - 0x19, 0x43, 0x6c, 0xd1, 0xb9, 0x78, 0xfb, 0x78, - 0x1b, 0x02, 0x19, 0x43, 0x12, 0xd0, 0x01, 0x29, - 0x65, 0xd1, 0x00, 0x07, 0x63, 0xd1, 0x38, 0x79, - 0x7b, 0x79, 0x1b, 0x02, 0x18, 0x43, 0x5e, 0xd1, - 0xfe, 0xf7, 0xa1, 0xff, 0x00, 0x28, 0x73, 0xd0, - 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x83, 0xfb, - 0x01, 0x24, 0xca, 0xe0, 0x00, 0x07, 0x00, 0x0f, - 0x02, 0x28, 0x50, 0xd1, 0x38, 0x79, 0x7b, 0x79, - 0x1b, 0x02, 0x18, 0x43, 0x00, 0x06, 0x00, 0x0e, - 0x00, 0x21, 0xfe, 0xf7, 0xaa, 0xff, 0x00, 0x28, - 0x5e, 0xd0, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, - 0x6e, 0xfb, 0x01, 0x24, 0xb5, 0xe0, 0x38, 0x78, - 0x00, 0x28, 0x03, 0xd0, 0x01, 0x28, 0x01, 0xd0, - 0x02, 0x28, 0x38, 0xd1, 0xb9, 0x79, 0xfb, 0x79, - 0x1b, 0x02, 0x19, 0x43, 0x33, 0xd1, 0xb9, 0x78, - 0xfb, 0x78, 0x1b, 0x02, 0x19, 0x43, 0x19, 0xd0, - 0x01, 0x29, 0x2c, 0xd1, 0x00, 0x07, 0x2a, 0xd1, - 0x38, 0x79, 0x7b, 0x79, 0x1b, 0x02, 0x18, 0x43, - 0x25, 0xd1, 0x01, 0x20, 0xfe, 0xf7, 0x67, 0xff, - 0x00, 0x28, 0x39, 0xd0, 0x00, 0x21, 0x00, 0x20, - 0xff, 0xf7, 0x49, 0xfb, 0x01, 0x24, 0x90, 0xe0, - 0x07, 0xe1, 0xe7, 0xe0, 0xc9, 0xe0, 0xed, 0x09, - 0x00, 0x50, 0x02, 0xaa, 0xe0, 0x36, 0xe0, 0x15, - 0xe0, 0x00, 0x07, 0x00, 0x0f, 0x02, 0x28, 0x10, - 0xd1, 0x38, 0x79, 0x7b, 0x79, 0x1b, 0x02, 0x18, - 0x43, 0x00, 0x06, 0x00, 0x0e, 0x01, 0x21, 0xfe, - 0xf7, 0x6a, 0xff, 0x00, 0x28, 0x1e, 0xd0, 0x00, - 0x21, 0x00, 0x20, 0xff, 0xf7, 0x2e, 0xfb, 0x01, - 0x24, 0x75, 0xe0, 0x91, 0xe0, 0x38, 0x78, 0x00, - 0x28, 0x71, 0xd1, 0x38, 0x79, 0x7b, 0x79, 0x1b, - 0x02, 0x18, 0x43, 0x6c, 0xd1, 0xb8, 0x79, 0xfb, - 0x79, 0x1b, 0x02, 0x18, 0x43, 0x67, 0xd1, 0xb8, - 0x78, 0xfb, 0x78, 0x1b, 0x02, 0x18, 0x43, 0x00, - 0x06, 0x00, 0x0e, 0xff, 0xf7, 0x10, 0xfb, 0x03, - 0x20, 0x7d, 0x49, 0x00, 0xe0, 0xf0, 0xe0, 0x08, - 0x60, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x0d, - 0xfb, 0x01, 0x24, 0x71, 0xe0, 0x38, 0x78, 0x80, - 0x28, 0x51, 0xd1, 0xb8, 0x78, 0xfb, 0x78, 0x1b, - 0x02, 0x18, 0x43, 0x01, 0x0a, 0x09, 0x06, 0x09, - 0x0e, 0x06, 0x29, 0x65, 0xd2, 0x02, 0xa3, 0x5b, - 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x1c, 0xd9, - 0x03, 0x26, 0x45, 0xd9, 0xd9, 0x00, 0x06, 0x3e, - 0xd1, 0x38, 0x79, 0x7b, 0x79, 0x1b, 0x02, 0x18, - 0x43, 0x39, 0xd1, 0xfb, 0x79, 0xb8, 0x79, 0x1b, - 0x02, 0x18, 0x43, 0x02, 0xab, 0x18, 0x70, 0x02, - 0xa8, 0xff, 0xf7, 0x97, 0xfd, 0x00, 0x28, 0x0f, - 0xd0, 0xfb, 0x79, 0xba, 0x79, 0x02, 0xa9, 0x1b, - 0x02, 0x1a, 0x43, 0x02, 0xab, 0x09, 0x78, 0x1b, - 0x78, 0x9a, 0x42, 0x00, 0xdc, 0x11, 0x1c, 0x09, - 0x06, 0x09, 0x0e, 0xff, 0xf7, 0xd6, 0xfa, 0x01, - 0x24, 0xb2, 0xe0, 0x39, 0x79, 0x7b, 0x79, 0x1b, - 0x02, 0x19, 0x43, 0x18, 0xd1, 0x01, 0x30, 0x00, - 0x06, 0x00, 0x0e, 0x02, 0xa9, 0xff, 0xf7, 0x8b, - 0xfd, 0x00, 0x28, 0x0f, 0xd0, 0xfb, 0x79, 0xba, - 0x79, 0xed, 0x09, 0x00, 0x51, 0x02, 0x02, 0xa9, - 0x1b, 0x02, 0x1a, 0x43, 0x02, 0xab, 0x09, 0x78, - 0x1b, 0x78, 0x9a, 0x42, 0x00, 0xdc, 0x11, 0x1c, - 0x09, 0x06, 0x09, 0x0e, 0xff, 0xf7, 0xb8, 0xfa, - 0x01, 0x24, 0x94, 0xe0, 0x95, 0xe0, 0x01, 0x06, - 0x38, 0x79, 0x7b, 0x79, 0x09, 0x0e, 0x02, 0xaa, - 0x1b, 0x02, 0x18, 0x43, 0xfe, 0xf7, 0x62, 0xfd, - 0x00, 0x28, 0x0f, 0xd0, 0xfb, 0x79, 0xba, 0x79, - 0x02, 0xa9, 0x1b, 0x02, 0x1a, 0x43, 0x02, 0xab, - 0x09, 0x78, 0x1b, 0x78, 0x9a, 0x42, 0x00, 0xdc, - 0x11, 0x1c, 0x09, 0x06, 0x09, 0x0e, 0xff, 0xf7, - 0x9b, 0xfa, 0x01, 0x24, 0x77, 0xe0, 0x78, 0xe0, - 0x38, 0x78, 0x80, 0x28, 0x73, 0xd1, 0xb8, 0x78, - 0xfb, 0x78, 0x1b, 0x02, 0x18, 0x43, 0x6e, 0xd1, - 0x38, 0x79, 0x7b, 0x79, 0x1b, 0x02, 0x18, 0x43, - 0x69, 0xd1, 0xb8, 0x79, 0xfb, 0x79, 0x1b, 0x02, - 0x18, 0x43, 0x01, 0x28, 0x63, 0xd1, 0x02, 0xa8, - 0xfe, 0xf7, 0xe8, 0xfe, 0x00, 0x28, 0x04, 0xd0, - 0x01, 0x21, 0x02, 0xa8, 0xff, 0xf7, 0x7c, 0xfa, - 0x01, 0x24, 0x5a, 0xe0, 0x38, 0x78, 0x00, 0x28, - 0x55, 0xd1, 0x38, 0x79, 0x7b, 0x79, 0x1b, 0x02, - 0x18, 0x43, 0x50, 0xd1, 0xb8, 0x79, 0xfb, 0x79, - 0x1b, 0x02, 0x18, 0x43, 0x4b, 0xd1, 0xb8, 0x78, - 0xfb, 0x78, 0x1b, 0x02, 0x18, 0x43, 0x00, 0x06, - 0x00, 0x0e, 0xfe, 0xf7, 0xd9, 0xfe, 0x00, 0x28, - 0x43, 0xd0, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, - 0x5f, 0xfa, 0x01, 0x24, 0x3d, 0xe0, 0x38, 0x78, - 0x81, 0x28, 0x38, 0xd1, 0xb8, 0x78, 0xfb, 0x78, - 0x1b, 0x02, 0x18, 0x43, 0x33, 0xd1, 0xb8, 0x79, - 0xfb, 0x79, 0x1b, 0x02, 0x18, 0x43, 0x01, 0x28, - 0x2d, 0xd1, 0x38, 0x79, 0x7b, 0x79, 0x02, 0xa9, - 0x1b, 0x02, 0x18, 0x43, 0x00, 0x06, 0x00, 0x0e, - 0xfe, 0xf7, 0x88, 0xff, 0xed, 0x09, 0x00, 0x52, - 0x02, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x21, 0x02, - 0xa8, 0xff, 0xf7, 0x40, 0xfa, 0x01, 0x24, 0x1e, - 0xe0, 0x38, 0x78, 0x01, 0x28, 0x19, 0xd1, 0xb8, - 0x79, 0xfb, 0x79, 0x1b, 0x02, 0x18, 0x43, 0x14, - 0xd1, 0xfb, 0x78, 0xb8, 0x78, 0x1b, 0x02, 0x18, - 0x43, 0x01, 0x06, 0x38, 0x79, 0x7b, 0x79, 0x09, - 0x0e, 0x1b, 0x02, 0x18, 0x43, 0x00, 0x06, 0x00, - 0x0e, 0xfe, 0xf7, 0x84, 0xff, 0x00, 0x28, 0x06, - 0xd0, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, 0x22, - 0xfa, 0x00, 0xe0, 0x00, 0xe0, 0x01, 0x24, 0x20, - 0x1c, 0x03, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xcc, 0xdd, 0x03, 0x20, 0x90, 0xb5, 0x02, - 0x1c, 0x00, 0x20, 0x08, 0x29, 0x36, 0xd1, 0x14, - 0x78, 0x11, 0x1c, 0x60, 0x22, 0x22, 0x40, 0x53, - 0x09, 0x17, 0xd0, 0x01, 0x27, 0x01, 0x2b, 0x19, - 0x4a, 0x17, 0xd0, 0x02, 0x2b, 0x28, 0xd1, 0x8c, - 0x78, 0xcb, 0x78, 0x1b, 0x02, 0x1c, 0x43, 0x16, - 0x4b, 0x9c, 0x42, 0x21, 0xd1, 0x49, 0x78, 0x30, - 0x29, 0x14, 0xd0, 0x40, 0x29, 0x1c, 0xd1, 0x00, - 0x21, 0x17, 0x60, 0xff, 0xf7, 0xf7, 0xf9, 0x01, - 0x20, 0x16, 0xe0, 0x08, 0x1c, 0xff, 0xf7, 0xcc, - 0xfd, 0x12, 0xe0, 0x11, 0x68, 0x00, 0x29, 0x0f, - 0xd0, 0x21, 0x0a, 0x0d, 0xd2, 0x38, 0x1c, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x09, 0x4f, 0x38, - 0x68, 0x00, 0xf0, 0x58, 0xfe, 0x01, 0x06, 0x09, - 0x0e, 0x38, 0x68, 0xff, 0xf7, 0xdf, 0xf9, 0x01, - 0x20, 0x00, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0x40, - 0xfa, 0x00, 0x20, 0xec, 0xe7, 0xc0, 0x69, 0x03, - 0x20, 0x7c, 0x05, 0x00, 0x00, 0xbc, 0x67, 0x03, - 0x20, 0x80, 0xb5, 0x07, 0x4f, 0x01, 0x21, 0x39, - 0x60, 0xff, 0xf7, 0x44, 0xfa, 0x00, 0x28, 0x04, - 0xd1, 0x02, 0x20, 0x38, 0x60, 0x80, 0xbc, 0xed, - 0x09, 0x00, 0x53, 0x02, 0x08, 0xbc, 0x18, 0x47, - 0x03, 0x20, 0x38, 0x60, 0xf9, 0xe7, 0xcc, 0xdd, - 0x03, 0x20, 0x07, 0x49, 0x07, 0x22, 0x8a, 0x70, - 0x01, 0x22, 0x8a, 0x70, 0x83, 0x22, 0xca, 0x70, - 0x08, 0x70, 0x00, 0x0a, 0x48, 0x70, 0x03, 0x20, - 0xc8, 0x70, 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, - 0x70, 0x47, 0x60, 0x00, 0x00, 0xd0, 0xc8, 0x6c, - 0x03, 0x20, 0x04, 0x48, 0x41, 0x79, 0x49, 0x08, - 0x03, 0xd3, 0x01, 0x78, 0x41, 0x79, 0x49, 0x08, - 0xfb, 0xd2, 0x00, 0x78, 0x70, 0x47, 0x60, 0x00, - 0x00, 0xd0, 0x04, 0x48, 0x41, 0x79, 0x4a, 0x08, - 0x00, 0xd3, 0x00, 0x78, 0x01, 0x20, 0x49, 0x09, - 0x00, 0xd2, 0x00, 0x20, 0x70, 0x47, 0x60, 0x00, - 0x00, 0xd0, 0x03, 0x49, 0x01, 0x20, 0x49, 0x79, - 0x49, 0x08, 0x00, 0xd2, 0x00, 0x20, 0x70, 0x47, - 0x00, 0x00, 0x60, 0x00, 0x00, 0xd0, 0x03, 0x49, - 0x01, 0x20, 0x49, 0x79, 0x89, 0x09, 0x00, 0xd2, - 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x60, 0x00, - 0x00, 0xd0, 0x00, 0xb5, 0xff, 0xf7, 0xf3, 0xff, - 0x00, 0x28, 0xfb, 0xd0, 0x08, 0xbc, 0x18, 0x47, - 0x80, 0xb5, 0x07, 0x1c, 0xff, 0xf7, 0xeb, 0xff, - 0x00, 0x28, 0xfb, 0xd0, 0x02, 0x48, 0x07, 0x70, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, 0x00, - 0x00, 0xd0, 0xf0, 0xb5, 0x00, 0x23, 0x07, 0x1c, - 0xc0, 0x56, 0x00, 0x28, 0x1c, 0xd0, 0x12, 0x4d, - 0x0d, 0x26, 0x68, 0x79, 0x10, 0x24, 0x80, 0x09, - 0x0e, 0xd2, 0xed, 0xf7, 0xb2, 0xfe, 0x68, 0x79, - 0x80, 0x09, 0xfa, 0xd3, 0x08, 0xe0, 0x0a, 0x28, - 0x03, 0xd1, 0x00, 0x2c, 0xf1, 0xd0, 0x2e, 0x70, - 0x01, 0x3c, 0x38, 0x78, 0x28, 0x70, 0x01, 0x37, - 0x20, 0x1c, 0x01, 0x3c, 0x00, 0x28, 0x06, 0xd0, - 0x00, 0x23, 0xf8, 0x56, 0x00, 0x28, 0xee, 0xd1, - 0xf0, 0xbc, 0xed, 0x09, 0x00, 0x54, 0x02, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x23, 0xf8, 0x56, 0x00, - 0x28, 0xdd, 0xd1, 0xf7, 0xe7, 0x00, 0x00, 0x60, - 0x00, 0x00, 0xd0, 0x80, 0xb5, 0x00, 0x23, 0x07, - 0x1c, 0xc0, 0x56, 0x00, 0x28, 0x0f, 0xd0, 0x00, - 0x23, 0xf8, 0x56, 0x0a, 0x28, 0x02, 0xd1, 0x0d, - 0x20, 0xff, 0xf7, 0xb8, 0xff, 0x00, 0x23, 0xf8, - 0x56, 0x01, 0x37, 0xff, 0xf7, 0xb3, 0xff, 0x00, - 0x23, 0xf8, 0x56, 0x00, 0x28, 0xef, 0xd1, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, - 0xb5, 0x0a, 0x48, 0x00, 0x21, 0x01, 0x60, 0x41, - 0x60, 0x10, 0xf0, 0x0d, 0xfd, 0x08, 0x48, 0x01, - 0x79, 0x49, 0x08, 0x49, 0x00, 0x01, 0x71, 0x30, - 0x20, 0x10, 0xf0, 0x01, 0xfd, 0x00, 0x21, 0x30, - 0x20, 0x10, 0xf0, 0xf9, 0xfc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0xcc, 0x6c, 0x03, 0x20, 0x40, - 0x00, 0x00, 0xd0, 0x00, 0xb5, 0x01, 0x23, 0x1b, - 0x07, 0x03, 0x40, 0x18, 0x4a, 0x0a, 0xd1, 0x00, - 0x29, 0x03, 0xd0, 0x11, 0x68, 0x08, 0x43, 0x10, - 0x60, 0x10, 0xe0, 0x11, 0x68, 0xc0, 0x43, 0x08, - 0x40, 0x10, 0x60, 0x0b, 0xe0, 0x00, 0x01, 0x00, - 0x09, 0x00, 0x29, 0x03, 0xd0, 0x51, 0x68, 0x08, - 0x43, 0x50, 0x60, 0x03, 0xe0, 0x51, 0x68, 0xc0, - 0x43, 0x08, 0x40, 0x50, 0x60, 0x50, 0x68, 0x11, - 0x68, 0x08, 0x43, 0xff, 0x22, 0x01, 0x32, 0x02, - 0x40, 0x0a, 0x49, 0x04, 0xd0, 0x0a, 0x79, 0x01, - 0x23, 0x1a, 0x43, 0x0a, 0x71, 0x03, 0xe0, 0x0a, - 0x79, 0x52, 0x08, 0x52, 0x00, 0x0a, 0x71, 0xc0, - 0x43, 0x30, 0x23, 0x18, 0x40, 0x30, 0x21, 0x10, - 0xf0, 0xbe, 0xfc, 0x08, 0xbc, 0x18, 0x47, 0xcc, - 0x6c, 0x03, 0x20, 0x40, 0x00, 0x00, 0xd0, 0x00, - 0xb5, 0x00, 0x20, 0x00, 0xf0, 0x1a, 0xf8, 0xec, - 0xf7, 0xb6, 0xfb, 0x06, 0x49, 0xed, 0x09, 0x00, - 0x55, 0x02, 0x48, 0x07, 0x01, 0x62, 0x06, 0x49, - 0x06, 0x4a, 0x11, 0x60, 0x06, 0x49, 0x07, 0x4a, - 0x11, 0x60, 0x00, 0x21, 0x41, 0x60, 0x81, 0x60, - 0x08, 0xbc, 0x18, 0x47, 0xbf, 0x03, 0x00, 0x80, - 0x29, 0x20, 0x28, 0xe8, 0xc0, 0x00, 0x00, 0xd0, - 0x31, 0x00, 0x30, 0x08, 0x00, 0x01, 0x00, 0xd0, - 0x90, 0xb5, 0x06, 0x24, 0x00, 0x22, 0x02, 0x27, - 0x01, 0x23, 0x01, 0x28, 0x0d, 0x49, 0x06, 0xd1, - 0x0b, 0x62, 0x4f, 0x62, 0x8a, 0x62, 0xca, 0x62, - 0x0a, 0x63, 0x4c, 0x63, 0x8a, 0x63, 0x88, 0xc1, - 0x08, 0x39, 0x8a, 0x60, 0xca, 0x60, 0x0a, 0x61, - 0x4c, 0x61, 0x8a, 0x61, 0x47, 0x21, 0x09, 0x02, - 0x4a, 0x05, 0x11, 0x60, 0x01, 0x28, 0x01, 0xd1, - 0x10, 0xf0, 0xa4, 0xfb, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, - 0x90, 0xb4, 0x00, 0x20, 0xff, 0x27, 0x0a, 0x4a, - 0x01, 0x37, 0x00, 0x21, 0x03, 0x1c, 0x5c, 0x08, - 0x5b, 0x08, 0x01, 0xd3, 0x07, 0x4b, 0x5c, 0x40, - 0x01, 0x31, 0x23, 0x1c, 0x08, 0x29, 0xf6, 0xdb, - 0x41, 0x00, 0x01, 0x30, 0xb8, 0x42, 0x53, 0x52, - 0xef, 0xd3, 0x90, 0xbc, 0x70, 0x47, 0x00, 0x00, - 0x18, 0xe0, 0x03, 0x20, 0x08, 0x84, 0x00, 0x00, - 0x00, 0xb5, 0x00, 0x23, 0x00, 0xf0, 0x02, 0xf8, - 0x08, 0xbc, 0x18, 0x47, 0xff, 0xb5, 0x04, 0x1c, - 0x1f, 0x30, 0x40, 0x09, 0x40, 0x01, 0x06, 0x1b, - 0x0d, 0x1c, 0x17, 0x1c, 0x00, 0xf0, 0x9a, 0xf8, - 0x00, 0x2e, 0x00, 0xd1, 0x20, 0x26, 0xbe, 0x42, - 0x00, 0xd9, 0x3e, 0x1c, 0x00, 0x2f, 0x11, 0xd0, - 0xa0, 0x20, 0x21, 0x1c, 0x32, 0x1c, 0x2b, 0x1c, - 0x00, 0xf0, 0x04, 0xf9, 0x03, 0x9b, 0x00, 0x2b, - 0x00, 0xd1, 0xad, 0x19, 0xa4, 0x19, 0xbf, 0x1b, - 0x20, 0x26, 0x20, 0x2f, 0x00, 0xd8, 0x3e, 0x1c, - 0xed, 0x09, 0x00, 0x56, 0x02, 0x00, 0x2f, 0xed, - 0xd1, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0xa0, 0x26, 0x04, 0x1c, 0x0d, - 0x1c, 0x17, 0x1c, 0x00, 0xf0, 0x75, 0xf8, 0x00, - 0xf0, 0x85, 0xf8, 0x30, 0x1c, 0x00, 0xf0, 0xa8, - 0xf8, 0x00, 0xf0, 0xc1, 0xf8, 0x00, 0x28, 0xf6, - 0xd0, 0x28, 0x0a, 0x00, 0x06, 0x00, 0x0e, 0x00, - 0xf0, 0x9f, 0xf8, 0x00, 0xf0, 0xb8, 0xf8, 0x28, - 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x99, 0xf8, 0x00, - 0xf0, 0xb2, 0xf8, 0x00, 0xf0, 0x6f, 0xf8, 0x01, - 0x20, 0x30, 0x43, 0x00, 0x06, 0x00, 0x0e, 0x00, - 0xf0, 0x8f, 0xf8, 0x00, 0xf0, 0xa8, 0xf8, 0x00, - 0x25, 0x00, 0x2f, 0x0a, 0xd9, 0x7e, 0x1e, 0x10, - 0xf0, 0xd3, 0xfa, 0x60, 0x55, 0xae, 0x42, 0x01, - 0xd9, 0x10, 0xf0, 0xf0, 0xfa, 0x01, 0x35, 0xbd, - 0x42, 0xf5, 0xd3, 0x00, 0xf0, 0x6e, 0xf8, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x06, 0x48, 0x41, - 0x69, 0x06, 0x23, 0x99, 0x43, 0x04, 0x23, 0x19, - 0x43, 0x41, 0x61, 0x80, 0x69, 0x80, 0x08, 0x01, - 0xd3, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, - 0x47, 0x00, 0x00, 0x00, 0xe0, 0x80, 0xb4, 0x16, - 0x4a, 0x57, 0x69, 0x06, 0x23, 0x3b, 0x43, 0x53, - 0x61, 0x14, 0x4f, 0x01, 0x28, 0x07, 0xd0, 0x02, - 0x28, 0x13, 0xd1, 0x00, 0x29, 0x0d, 0xd0, 0x38, - 0x68, 0x04, 0x23, 0x18, 0x43, 0x0c, 0xe0, 0x00, - 0x29, 0x03, 0xd0, 0x38, 0x68, 0x02, 0x23, 0x18, - 0x43, 0x06, 0xe0, 0x38, 0x68, 0x02, 0x23, 0x98, - 0x43, 0x02, 0xe0, 0x38, 0x68, 0x04, 0x23, 0x98, - 0x43, 0x38, 0x60, 0x38, 0x68, 0x91, 0x69, 0x06, - 0x23, 0x99, 0x43, 0x18, 0x40, 0x08, 0x43, 0xd0, - 0x61, 0x14, 0x21, 0x08, 0x1c, 0x01, 0x39, 0x00, - 0x28, 0xfb, 0xd1, 0x80, 0xbc, 0x70, 0x47, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x57, 0x02, - 0x00, 0xe0, 0xd4, 0x6c, 0x03, 0x20, 0x80, 0xb5, - 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, 0xc9, 0xff, - 0x00, 0x21, 0x02, 0x20, 0xff, 0xf7, 0xc5, 0xff, - 0x00, 0x27, 0x00, 0xf0, 0x1d, 0xf8, 0x01, 0x37, - 0x04, 0x2f, 0xfa, 0xd3, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0x01, 0x21, 0x02, 0x20, - 0xff, 0xf7, 0xb7, 0xff, 0x01, 0x21, 0x01, 0x20, - 0xff, 0xf7, 0xb3, 0xff, 0x00, 0x21, 0x01, 0x20, - 0xff, 0xf7, 0xaf, 0xff, 0x00, 0x21, 0x02, 0x20, - 0xff, 0xf7, 0xab, 0xff, 0x01, 0x21, 0x01, 0x20, - 0xff, 0xf7, 0xa7, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x00, 0x21, 0x01, 0x20, 0xff, 0xf7, - 0xa0, 0xff, 0x01, 0x21, 0x02, 0x20, 0xff, 0xf7, - 0x9c, 0xff, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, - 0x98, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x07, 0x24, 0x07, 0x1c, 0x38, 0x1c, 0x20, 0x41, - 0xc1, 0x07, 0xc9, 0x0f, 0x01, 0x20, 0xff, 0xf7, - 0x8c, 0xff, 0x01, 0x21, 0x02, 0x20, 0xff, 0xf7, - 0x88, 0xff, 0x00, 0x21, 0x02, 0x20, 0xff, 0xf7, - 0x84, 0xff, 0x01, 0x3c, 0xee, 0xd5, 0x01, 0x21, - 0x01, 0x20, 0xff, 0xf7, 0x7e, 0xff, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x7d, 0x27, - 0xff, 0x00, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, - 0x74, 0xff, 0x01, 0x21, 0x02, 0x20, 0xff, 0xf7, - 0x70, 0xff, 0xff, 0xf7, 0x5e, 0xff, 0x00, 0x28, - 0x0f, 0xd0, 0x09, 0xe0, 0x00, 0x2f, 0x07, 0xd1, - 0x00, 0x21, 0x02, 0x20, 0xff, 0xf7, 0x65, 0xff, - 0x00, 0x20, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x01, 0x3f, 0xff, 0xf7, 0x4e, 0xff, 0x00, 0x28, - 0xf0, 0xd1, 0x00, 0x21, 0x02, 0x20, 0xff, 0xf7, - 0x58, 0xff, 0x01, 0x20, 0xf1, 0xe7, 0xf0, 0xb5, - 0x40, 0x08, 0x40, 0x00, 0x06, 0x06, 0xed, 0x09, - 0x00, 0x58, 0x02, 0x36, 0x0e, 0x0c, 0x1c, 0x1d, - 0x1c, 0x17, 0x1c, 0xff, 0xf7, 0x90, 0xff, 0x30, - 0x1c, 0xff, 0xf7, 0xb3, 0xff, 0xff, 0xf7, 0xcc, - 0xff, 0x00, 0x28, 0xf6, 0xd0, 0x20, 0x0a, 0x00, - 0x06, 0x00, 0x0e, 0xff, 0xf7, 0xaa, 0xff, 0xff, - 0xf7, 0xc3, 0xff, 0x20, 0x06, 0x00, 0x0e, 0xff, - 0xf7, 0xa4, 0xff, 0xff, 0xf7, 0xbd, 0xff, 0x00, - 0x24, 0x00, 0x2f, 0x07, 0xd9, 0x28, 0x5d, 0xff, - 0xf7, 0x9c, 0xff, 0xff, 0xf7, 0xb5, 0xff, 0x01, - 0x34, 0xbc, 0x42, 0xf7, 0xd3, 0xff, 0xf7, 0x86, - 0xff, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x04, 0x49, 0x06, 0x22, 0x09, 0x68, 0xdb, - 0xf7, 0x44, 0xf8, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0x00, 0x00, 0xcc, 0x67, 0x03, 0x20, 0xf0, - 0xb5, 0x82, 0xb0, 0x1d, 0x49, 0x07, 0x1c, 0x60, - 0xc9, 0x68, 0x46, 0x60, 0xc0, 0x1c, 0x4c, 0x06, - 0x22, 0x1c, 0xa1, 0x20, 0x68, 0x00, 0xf0, 0x15, - 0xfc, 0x01, 0x25, 0x00, 0x28, 0x0c, 0xd0, 0x06, - 0x22, 0x39, 0x1c, 0x20, 0x68, 0x00, 0xf0, 0x0d, - 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x02, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x28, 0x1c, 0xf9, - 0xe7, 0xc0, 0x20, 0x10, 0xf0, 0xbe, 0xfa, 0x06, - 0x1c, 0x06, 0x22, 0x39, 0x1c, 0x11, 0x48, 0xff, - 0xf7, 0x7e, 0xfe, 0x68, 0x46, 0x06, 0x22, 0x0e, - 0x49, 0xff, 0xf7, 0xa7, 0xfe, 0x30, 0x1c, 0x10, - 0xf0, 0xb0, 0xfa, 0x69, 0x46, 0x06, 0x22, 0x38, - 0x1c, 0x00, 0xf0, 0xef, 0xfb, 0x00, 0x28, 0x01, - 0xd0, 0x28, 0x1c, 0xdf, 0xe7, 0x69, 0x46, 0x06, - 0x22, 0x20, 0x68, 0xdb, 0xf7, 0x02, 0xf8, 0x00, - 0x20, 0xd8, 0xe7, 0x68, 0x61, 0x03, 0x20, 0xcc, - 0x67, 0x03, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0xc8, 0x1f, 0x00, 0x00, 0x80, - 0xb5, 0xed, 0x09, 0x00, 0x59, 0x02, 0x07, 0x1c, - 0x0a, 0x68, 0x10, 0x20, 0x10, 0x2a, 0x00, 0xd2, - 0x10, 0x1c, 0x08, 0x60, 0x00, 0x21, 0x10, 0x22, - 0x38, 0x1c, 0xda, 0xf7, 0x61, 0xff, 0x05, 0x48, - 0x08, 0x22, 0x01, 0x68, 0x38, 0x1c, 0xda, 0xf7, - 0xe3, 0xff, 0x80, 0xbc, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x00, 0x00, 0xc0, 0x67, 0x03, 0x20, - 0xf0, 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0x1c, 0x4c, - 0x08, 0x22, 0x1c, 0xa1, 0x20, 0x68, 0x00, 0xf0, - 0xb7, 0xfb, 0x01, 0x25, 0x00, 0x28, 0x0c, 0xd0, - 0x08, 0x22, 0x39, 0x1c, 0x20, 0x68, 0x00, 0xf0, - 0xaf, 0xfb, 0x00, 0x28, 0x03, 0xd1, 0x02, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x28, 0x1c, - 0xf9, 0xe7, 0xc0, 0x20, 0x10, 0xf0, 0x60, 0xfa, - 0x06, 0x1c, 0x7f, 0x20, 0x80, 0x01, 0x08, 0x22, - 0x39, 0x1c, 0xff, 0xf7, 0x1f, 0xfe, 0x7f, 0x21, - 0x89, 0x01, 0x68, 0x46, 0x08, 0x22, 0xff, 0xf7, - 0x47, 0xfe, 0x30, 0x1c, 0x10, 0xf0, 0x50, 0xfa, - 0x69, 0x46, 0x08, 0x22, 0x38, 0x1c, 0x00, 0xf0, - 0x8f, 0xfb, 0x00, 0x28, 0x01, 0xd0, 0x28, 0x1c, - 0xdd, 0xe7, 0x08, 0x22, 0x39, 0x1c, 0x20, 0x68, - 0xda, 0xf7, 0xa2, 0xff, 0x00, 0x20, 0xd6, 0xe7, - 0xc0, 0x67, 0x03, 0x20, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0xb0, 0xb5, 0x0d, 0x4c, 0x1f, 0x1c, 0xe3, 0x79, - 0xa5, 0x79, 0x1b, 0x02, 0x1d, 0x43, 0x05, 0x60, - 0x63, 0x7a, 0x20, 0x7a, 0x1b, 0x02, 0x18, 0x43, - 0x08, 0x60, 0x38, 0x68, 0x2e, 0x23, 0x2e, 0x28, - 0x00, 0xd2, 0x03, 0x1c, 0x10, 0x1c, 0x1a, 0x1c, - 0x3b, 0x60, 0x04, 0x49, 0xda, 0xf7, 0x80, 0xff, - 0xb0, 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0x30, 0x7c, 0x00, 0x00, 0x3a, 0x7c, 0x00, 0x00, - 0xff, 0xb5, 0xa6, 0xb0, 0xed, 0x09, 0x00, 0x5a, - 0x02, 0x68, 0x46, 0x14, 0x1c, 0x1f, 0x1c, 0x00, - 0x23, 0x00, 0x22, 0x00, 0x21, 0x00, 0x25, 0x00, - 0x26, 0x6e, 0xc0, 0x6e, 0xc0, 0x60, 0xc0, 0xc0, - 0x20, 0x10, 0xf0, 0x08, 0xfa, 0x06, 0x1c, 0x1c, - 0x48, 0x02, 0x22, 0x26, 0xa9, 0xff, 0xf7, 0xc8, - 0xfd, 0x1a, 0x48, 0x02, 0x22, 0x27, 0xa9, 0xff, - 0xf7, 0xc3, 0xfd, 0x2e, 0x22, 0x2e, 0x2f, 0x00, - 0xd8, 0x3a, 0x1c, 0x68, 0x46, 0x21, 0x1c, 0x15, - 0x1c, 0xda, 0xf7, 0x54, 0xff, 0x69, 0x46, 0x2e, - 0x22, 0x13, 0x48, 0xff, 0xf7, 0xb5, 0xfd, 0x68, - 0x22, 0x0c, 0xa8, 0x12, 0x49, 0xff, 0xf7, 0xde, - 0xfd, 0x30, 0x1c, 0x10, 0xf0, 0xe7, 0xf9, 0x1a, - 0xa9, 0x02, 0x31, 0x20, 0x1c, 0x2a, 0x1c, 0x00, - 0xf0, 0x25, 0xfb, 0x00, 0x28, 0x09, 0xd1, 0x19, - 0xa8, 0x40, 0x88, 0x26, 0x99, 0x88, 0x42, 0x04, - 0xd1, 0x1a, 0xa8, 0x00, 0x88, 0x27, 0x99, 0x88, - 0x42, 0x04, 0xd0, 0x01, 0x20, 0x2a, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x20, 0xf9, - 0xe7, 0xce, 0x1f, 0x00, 0x00, 0xd0, 0x1f, 0x00, - 0x00, 0xd2, 0x1f, 0x00, 0x00, 0x98, 0x1f, 0x00, - 0x00, 0x01, 0x20, 0x70, 0x47, 0xff, 0xb5, 0x00, - 0x26, 0x0c, 0x9b, 0x0a, 0x9c, 0x0b, 0x9f, 0x09, - 0x9d, 0x06, 0x60, 0x0e, 0x60, 0x16, 0x60, 0x03, - 0x98, 0x06, 0x60, 0x2e, 0x60, 0x26, 0x60, 0x3e, - 0x60, 0x1e, 0x60, 0x04, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x01, 0x20, 0x18, 0x47, 0x0e, 0x12, 0xa0, - 0xe3, 0x14, 0x00, 0x91, 0xe5, 0x01, 0x2c, 0x00, - 0xe2, 0x00, 0x00, 0x52, 0xe3, 0x18, 0x20, 0x91, - 0x15, 0x34, 0x00, 0x9f, 0xe5, 0x01, 0x0c, 0x12, - 0x13, 0x07, 0x20, 0xa0, 0x13, 0x03, 0x2c, 0x82, - 0x12, 0x00, 0x20, 0x80, 0x15, 0x02, 0x00, 0x00, - 0x1a, 0x07, 0x20, 0xa0, 0xe3, 0x02, 0x2c, 0xed, - 0x09, 0x00, 0x5b, 0x02, 0x82, 0xe2, 0x00, 0x20, - 0x80, 0xe5, 0x00, 0x00, 0x90, 0xe5, 0x1c, 0x00, - 0x81, 0xe5, 0x07, 0x00, 0xa0, 0xe3, 0x23, 0x0c, - 0x80, 0xe2, 0x14, 0x00, 0x81, 0xe5, 0x1e, 0xff, - 0x2f, 0xe1, 0xd8, 0x6c, 0x03, 0x20, 0x1e, 0xff, - 0x2f, 0xe1, 0x8e, 0x12, 0xa0, 0xe3, 0x00, 0x30, - 0xa0, 0xe3, 0x93, 0x20, 0x01, 0xe1, 0x00, 0x30, - 0xb0, 0xe1, 0x20, 0x00, 0x1f, 0xe5, 0x00, 0x30, - 0x90, 0xe5, 0x02, 0x3a, 0x83, 0x03, 0x02, 0x3a, - 0xc3, 0x13, 0x00, 0x30, 0x80, 0xe5, 0x00, 0x30, - 0x90, 0xe5, 0x0e, 0x02, 0xa0, 0xe3, 0x1c, 0x30, - 0x80, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0x1e, 0xff, - 0x2f, 0xe1, 0x8e, 0x12, 0xa0, 0xe3, 0x00, 0x30, - 0xa0, 0xe3, 0x93, 0x20, 0x01, 0xe1, 0x00, 0x30, - 0xa0, 0xe1, 0x0e, 0x02, 0xa0, 0xe3, 0x14, 0xc0, - 0x90, 0xe5, 0x0c, 0x30, 0x83, 0xe1, 0x14, 0x30, - 0x80, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0x1e, 0xff, - 0x2f, 0xe1, 0x8e, 0x12, 0xa0, 0xe3, 0x00, 0x30, - 0xa0, 0xe3, 0x93, 0x20, 0x01, 0xe1, 0x00, 0x30, - 0xe0, 0xe1, 0x0e, 0x02, 0xa0, 0xe3, 0x14, 0xc0, - 0x90, 0xe5, 0x0c, 0x30, 0x03, 0xe0, 0x14, 0x30, - 0x80, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0x1e, 0xff, - 0x2f, 0xe1, 0x0e, 0x02, 0xa0, 0xe3, 0x18, 0x00, - 0x90, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x04, 0xe0, - 0x2d, 0xe5, 0x8e, 0x22, 0xa0, 0xe3, 0x00, 0xc0, - 0xa0, 0xe3, 0x9c, 0x30, 0x02, 0xe1, 0xb4, 0xc0, - 0x1f, 0xe5, 0x00, 0xe0, 0x9c, 0xe5, 0x01, 0x10, - 0xce, 0xe1, 0x00, 0x00, 0x81, 0xe1, 0x00, 0x00, - 0x8c, 0xe5, 0x0e, 0x12, 0xa0, 0xe3, 0x1c, 0x00, - 0x81, 0xe5, 0x00, 0x30, 0x82, 0xe5, 0x04, 0xe0, - 0x9d, 0xe4, 0x1e, 0xff, 0x2f, 0xe1, 0x8e, 0x12, - 0xa0, 0xe3, 0x00, 0x30, 0xa0, 0xe3, 0x93, 0x20, - 0x01, 0xe1, 0xed, 0x09, 0x00, 0x5c, 0x02, 0x01, - 0x30, 0xa0, 0xe3, 0x13, 0x30, 0xa0, 0xe1, 0xf0, - 0x00, 0x1f, 0xe5, 0x00, 0xc0, 0x90, 0xe5, 0x0c, - 0x30, 0x83, 0xe1, 0x00, 0x30, 0x80, 0xe5, 0x0e, - 0x02, 0xa0, 0xe3, 0x1c, 0x30, 0x80, 0xe5, 0x00, - 0x20, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x8e, - 0x12, 0xa0, 0xe3, 0x00, 0x30, 0xa0, 0xe3, 0x93, - 0x20, 0x01, 0xe1, 0x01, 0x30, 0xa0, 0xe3, 0x13, - 0x30, 0xe0, 0xe1, 0x24, 0x01, 0x1f, 0xe5, 0x00, - 0xc0, 0x90, 0xe5, 0x0c, 0x30, 0x03, 0xe0, 0x00, - 0x30, 0x80, 0xe5, 0x0e, 0x02, 0xa0, 0xe3, 0x1c, - 0x30, 0x80, 0xe5, 0x00, 0x20, 0x81, 0xe5, 0x1e, - 0xff, 0x2f, 0xe1, 0x44, 0x01, 0x1f, 0xe5, 0x00, - 0x00, 0x90, 0xe5, 0x01, 0x0c, 0x10, 0xe2, 0x01, - 0x00, 0xa0, 0x13, 0x1e, 0xff, 0x2f, 0xe1, 0x07, - 0x0a, 0xa0, 0xe3, 0x37, 0xcc, 0xd0, 0xe5, 0x36, - 0x0c, 0xd0, 0xe5, 0x0c, 0x04, 0x80, 0xe1, 0xff, - 0xcc, 0x40, 0xe2, 0xff, 0x00, 0x5c, 0xe3, 0x1e, - 0xff, 0x2f, 0x11, 0x04, 0xe0, 0x2d, 0xe5, 0x0f, - 0x00, 0xa0, 0xe3, 0xbb, 0xff, 0xff, 0xeb, 0xc4, - 0xff, 0xff, 0xeb, 0x00, 0x10, 0xe0, 0xe3, 0x20, - 0x05, 0x81, 0xe0, 0x07, 0x10, 0x00, 0xe2, 0xc0, - 0xff, 0xff, 0xeb, 0x03, 0x20, 0xa0, 0xe3, 0x20, - 0x07, 0x02, 0xe0, 0x00, 0x04, 0x81, 0xe1, 0x04, - 0xe0, 0x9d, 0xe4, 0x1e, 0xff, 0x2f, 0xe1, 0xb0, - 0xb4, 0x02, 0x1c, 0x11, 0x78, 0x19, 0x4c, 0x00, - 0x20, 0x00, 0x27, 0x63, 0x18, 0x5d, 0x78, 0x2b, - 0x09, 0x05, 0xd3, 0x51, 0x78, 0x63, 0x18, 0x5d, - 0x78, 0x01, 0x32, 0x2b, 0x09, 0xf9, 0xd2, 0x2d, - 0x29, 0x03, 0xd1, 0x01, 0x27, 0xd2, 0x19, 0x11, - 0x78, 0x03, 0xe0, 0x2b, 0x29, 0x01, 0xd1, 0x51, - 0x78, 0x01, 0x32, 0x63, 0x18, 0x5d, 0x78, 0xeb, - 0x08, 0x0a, 0xd3, 0x83, 0x00, 0xed, 0x09, 0x00, - 0x5d, 0x02, 0x18, 0x18, 0x40, 0x00, 0x30, 0x39, - 0x40, 0x18, 0x51, 0x78, 0x63, 0x18, 0x5d, 0x78, - 0x01, 0x32, 0xeb, 0x08, 0xf4, 0xd2, 0x00, 0x2f, - 0x07, 0xd0, 0x06, 0x4b, 0x41, 0x42, 0x98, 0x42, - 0x02, 0xd9, 0xc0, 0x1a, 0x59, 0x42, 0x09, 0x1a, - 0x08, 0x1c, 0xb0, 0xbc, 0x70, 0x47, 0x00, 0x00, - 0x98, 0x61, 0x03, 0x20, 0xff, 0xff, 0xff, 0x7f, - 0xff, 0xb5, 0x98, 0xb0, 0x15, 0x1c, 0x17, 0x1c, - 0x61, 0xa6, 0x18, 0x98, 0x19, 0x99, 0x0c, 0xce, - 0x00, 0x24, 0x08, 0x3e, 0xda, 0xf7, 0xfa, 0xfe, - 0x00, 0x21, 0x00, 0x28, 0x07, 0xd0, 0x30, 0x20, - 0x38, 0x70, 0x79, 0x70, 0x38, 0x1c, 0x1c, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x21, - 0x39, 0x70, 0x1b, 0x98, 0x02, 0x28, 0x47, 0xd0, - 0x08, 0x28, 0x23, 0xd0, 0x10, 0x28, 0x65, 0xd1, - 0x18, 0x98, 0x19, 0x99, 0x32, 0x68, 0x33, 0x1c, - 0x5b, 0x68, 0x16, 0x1c, 0x17, 0x93, 0xeb, 0xf7, - 0x65, 0xf9, 0x00, 0x28, 0x78, 0xd0, 0x18, 0x98, - 0x19, 0x99, 0x00, 0x07, 0x4e, 0x49, 0x00, 0x0f, - 0x09, 0x5c, 0x68, 0x46, 0x04, 0x22, 0x01, 0x55, - 0x18, 0x98, 0x19, 0x99, 0xeb, 0xf7, 0x60, 0xf9, - 0x32, 0x1c, 0x01, 0x34, 0x18, 0x90, 0x19, 0x91, - 0x17, 0x9b, 0xeb, 0xf7, 0x4f, 0xf9, 0x00, 0x28, - 0xe9, 0xd1, 0x78, 0xe0, 0x18, 0x98, 0x19, 0x99, - 0x32, 0x68, 0x33, 0x1c, 0x5b, 0x68, 0x16, 0x1c, - 0x16, 0x93, 0xeb, 0xf7, 0x43, 0xf9, 0x00, 0x28, - 0x56, 0xd0, 0x18, 0x98, 0x19, 0x99, 0x40, 0x07, - 0x3d, 0x49, 0x40, 0x0f, 0x09, 0x5c, 0x68, 0x46, - 0x03, 0x22, 0x01, 0x55, 0x18, 0x98, 0x19, 0x99, - 0xeb, 0xf7, 0x3e, 0xf9, 0x32, 0x1c, 0x01, 0x34, - 0x18, 0x90, 0x19, 0x91, 0x16, 0x9b, 0xeb, 0xf7, - 0x2d, 0xf9, 0x00, 0x28, 0xe9, 0xd1, 0x56, 0xe0, - 0xed, 0x09, 0x00, 0x5e, 0x02, 0x18, 0x98, 0x19, - 0x99, 0x32, 0x68, 0x33, 0x1c, 0x5b, 0x68, 0x16, - 0x1c, 0x15, 0x93, 0xeb, 0xf7, 0x21, 0xf9, 0x00, - 0x28, 0x34, 0xd0, 0x18, 0x98, 0x19, 0x99, 0xc0, - 0x07, 0x2c, 0x49, 0xc0, 0x0f, 0x09, 0x5c, 0x68, - 0x46, 0x01, 0x22, 0x01, 0x55, 0x18, 0x98, 0x19, - 0x99, 0xeb, 0xf7, 0x1c, 0xf9, 0x32, 0x1c, 0x01, - 0x34, 0x18, 0x90, 0x19, 0x91, 0x15, 0x9b, 0xeb, - 0xf7, 0x0b, 0xf9, 0x00, 0x28, 0xe9, 0xd1, 0x34, - 0xe0, 0xff, 0xe7, 0x18, 0x98, 0x19, 0x99, 0x32, - 0x68, 0x14, 0x92, 0x73, 0x68, 0x13, 0x93, 0xeb, - 0xf7, 0xff, 0xf8, 0x00, 0x28, 0x12, 0xd0, 0x1b, - 0x98, 0x00, 0x21, 0x11, 0x91, 0x12, 0x90, 0x18, - 0x98, 0x19, 0x99, 0x01, 0x1c, 0x1b, 0x98, 0xda, - 0xf7, 0x59, 0xfc, 0x0e, 0x06, 0x36, 0x16, 0x19, - 0x99, 0x18, 0x98, 0x12, 0x9a, 0x11, 0x9b, 0xeb, - 0xf7, 0x0b, 0xf9, 0x00, 0xe0, 0x1e, 0xe0, 0x18, - 0x90, 0x19, 0x91, 0x09, 0x2e, 0x04, 0xdc, 0x68, - 0x46, 0xf1, 0x1d, 0x29, 0x31, 0x01, 0x55, 0x03, - 0xe0, 0x69, 0x46, 0xf0, 0x1d, 0x30, 0x30, 0x08, - 0x55, 0x18, 0x98, 0x19, 0x99, 0x14, 0x9a, 0x13, - 0x9b, 0x01, 0x34, 0xeb, 0xf7, 0xd5, 0xf8, 0x00, - 0x28, 0xd9, 0xd1, 0x00, 0x2c, 0x06, 0xd0, 0x68, - 0x46, 0x01, 0x3c, 0x00, 0x5d, 0x28, 0x70, 0x01, - 0x35, 0x00, 0x2c, 0xf8, 0xd1, 0x00, 0x21, 0x29, - 0x70, 0x38, 0x1c, 0x4a, 0xe7, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x61, 0x03, - 0x20, 0xf0, 0xb5, 0x89, 0xb0, 0x0e, 0x1c, 0x0f, - 0x1c, 0x00, 0x21, 0x00, 0x25, 0x14, 0x1c, 0x00, - 0x28, 0x07, 0xd1, 0x30, 0x20, 0x38, 0x70, 0x79, - 0x70, 0x38, 0x1c, 0x09, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x21, 0x39, 0x70, 0x23, - 0x49, 0x02, 0x2c, 0xed, 0x09, 0x00, 0x5f, 0x02, - 0x17, 0xd0, 0x08, 0x2c, 0x0b, 0xd0, 0x10, 0x2c, - 0x1d, 0xd1, 0x02, 0x07, 0x12, 0x0f, 0x8b, 0x5c, - 0x6a, 0x46, 0x00, 0x09, 0x53, 0x55, 0x01, 0x35, - 0x00, 0x28, 0xf6, 0xd1, 0x27, 0xe0, 0x42, 0x07, - 0x52, 0x0f, 0x8b, 0x5c, 0x6a, 0x46, 0xc0, 0x08, - 0x53, 0x55, 0x01, 0x35, 0x00, 0x28, 0xf6, 0xd1, - 0x1d, 0xe0, 0xc2, 0x07, 0xd2, 0x0f, 0x8b, 0x5c, - 0x6a, 0x46, 0x40, 0x08, 0x53, 0x55, 0x01, 0x35, - 0x00, 0x28, 0xf6, 0xd1, 0x13, 0xe0, 0x01, 0x1c, - 0x20, 0x1c, 0xda, 0xf7, 0xea, 0xfb, 0x09, 0x06, - 0x09, 0x16, 0x09, 0x29, 0x04, 0xdc, 0xca, 0x1d, - 0x29, 0x32, 0x69, 0x46, 0x4a, 0x55, 0x03, 0xe0, - 0xca, 0x1d, 0x30, 0x32, 0x69, 0x46, 0x4a, 0x55, - 0x01, 0x35, 0x00, 0x28, 0xeb, 0xd1, 0x00, 0x2d, - 0x06, 0xd0, 0x68, 0x46, 0x01, 0x3d, 0x40, 0x5d, - 0x30, 0x70, 0x01, 0x36, 0x00, 0x2d, 0xf8, 0xd1, - 0x00, 0x21, 0x31, 0x70, 0x38, 0x1c, 0xb3, 0xe7, - 0x00, 0x00, 0x84, 0x61, 0x03, 0x20, 0x01, 0x1c, - 0x00, 0x23, 0xca, 0x56, 0x01, 0x31, 0x00, 0x20, - 0x00, 0x2a, 0x05, 0xd0, 0x00, 0x23, 0xca, 0x56, - 0x01, 0x31, 0x01, 0x30, 0x00, 0x2a, 0xf9, 0xd1, - 0x70, 0x47, 0x08, 0xb5, 0x69, 0x46, 0x02, 0x1c, - 0x06, 0x48, 0x00, 0x23, 0x00, 0xf0, 0xcf, 0xfc, - 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x00, 0x90, - 0x00, 0x98, 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x94, 0xb8, 0x03, 0x20, 0x88, 0xb5, - 0x48, 0x43, 0x69, 0x46, 0x02, 0x1c, 0x07, 0x1c, - 0x09, 0x48, 0x00, 0x23, 0x00, 0xf0, 0xbb, 0xfc, - 0x00, 0x28, 0x02, 0xd0, 0x00, 0x20, 0x00, 0x90, - 0x04, 0xe0, 0x00, 0x21, 0x3a, 0x1c, 0x00, 0x98, - 0xda, 0xf7, 0xf9, 0xfb, 0x00, 0x98, 0x88, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x60, 0x02, 0x94, 0xb8, 0x03, 0x20, 0x00, - 0xb5, 0x00, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0x39, - 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x08, 0xb5, 0x00, - 0x21, 0x00, 0x91, 0x69, 0x46, 0x02, 0x1c, 0x05, - 0x48, 0x00, 0x23, 0x00, 0xf0, 0x9a, 0xfc, 0x00, - 0x28, 0x03, 0xd1, 0x00, 0x98, 0x01, 0xb0, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x20, 0xfa, 0xe7, 0x94, - 0xb8, 0x03, 0x20, 0x88, 0xb5, 0x48, 0x43, 0x69, - 0x46, 0x02, 0x1c, 0x07, 0x1c, 0x08, 0x48, 0x00, - 0x23, 0x00, 0xf0, 0x87, 0xfc, 0x00, 0x28, 0x08, - 0xd1, 0x00, 0x21, 0x3a, 0x1c, 0x00, 0x98, 0xda, - 0xf7, 0xc8, 0xfb, 0x00, 0x98, 0x88, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x20, 0xfa, 0xe7, 0x94, - 0xb8, 0x03, 0x20, 0x00, 0xb5, 0x00, 0xf0, 0x09, - 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xb0, - 0xb5, 0x07, 0x1c, 0x08, 0x1c, 0x0c, 0x1c, 0xff, - 0xf7, 0x88, 0xff, 0x05, 0x1c, 0x03, 0xd1, 0x38, - 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x23, 0xf8, 0x56, 0x00, 0x28, 0x12, 0xd0, 0x00, - 0x23, 0xf8, 0x56, 0xe1, 0x56, 0x88, 0x42, 0x08, - 0xd1, 0x38, 0x1c, 0x21, 0x1c, 0x2a, 0x1c, 0x00, - 0xf0, 0x2e, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x38, - 0x1c, 0xea, 0xe7, 0x00, 0x23, 0x01, 0x37, 0xf8, - 0x56, 0x00, 0x28, 0xec, 0xd1, 0x00, 0x20, 0xe3, - 0xe7, 0x00, 0x00, 0x80, 0xb4, 0x82, 0x18, 0x90, - 0x42, 0x11, 0xd2, 0x03, 0x78, 0x0f, 0x78, 0xbb, - 0x42, 0x09, 0xd0, 0x00, 0x78, 0x09, 0x78, 0x88, - 0x42, 0x03, 0xda, 0x00, 0x20, 0xc0, 0x43, 0x80, - 0xbc, 0x70, 0x47, 0x01, 0x20, 0xfb, 0xe7, 0x01, - 0x30, 0x01, 0x31, 0x90, 0x42, 0xed, 0xd3, 0x00, - 0x20, 0xf5, 0xe7, 0x02, 0x1c, 0x00, 0x23, 0xcb, - 0x56, 0x01, 0x31, 0x03, 0x70, 0x01, 0x30, 0x00, - 0x2b, 0xed, 0x09, 0x00, 0x61, 0x02, 0xf8, 0xd1, - 0x10, 0x1c, 0x70, 0x47, 0x80, 0xb4, 0x02, 0xe0, - 0x01, 0x30, 0x01, 0x31, 0x01, 0x3a, 0x00, 0x2a, - 0x07, 0xd9, 0x00, 0x23, 0xc7, 0x56, 0xcb, 0x56, - 0x9f, 0x42, 0x07, 0xd1, 0x00, 0x2f, 0xf3, 0xd1, - 0x04, 0xe0, 0x00, 0x2a, 0x02, 0xd1, 0x00, 0x20, - 0x80, 0xbc, 0x70, 0x47, 0x00, 0x78, 0x09, 0x78, - 0x40, 0x1a, 0xf9, 0xe7, 0x80, 0xb4, 0x07, 0x1c, - 0x00, 0x2a, 0x09, 0xd9, 0x00, 0x23, 0xcb, 0x56, - 0x01, 0x31, 0x01, 0x3a, 0x03, 0x70, 0x01, 0x30, - 0x00, 0x2b, 0x01, 0xd0, 0x00, 0x2a, 0xf5, 0xd8, - 0x51, 0x1e, 0x00, 0x2a, 0x06, 0xd9, 0x00, 0x22, - 0x02, 0x70, 0x0b, 0x1c, 0x01, 0x39, 0x01, 0x30, - 0x00, 0x2b, 0xf9, 0xd8, 0x38, 0x1c, 0x80, 0xbc, - 0x70, 0x47, 0x00, 0x00, 0x02, 0x1c, 0x00, 0x23, - 0xd3, 0x56, 0x01, 0x32, 0x00, 0x2b, 0xfa, 0xd1, - 0x01, 0x3a, 0x00, 0x23, 0xcb, 0x56, 0x01, 0x31, - 0x13, 0x70, 0x01, 0x32, 0x00, 0x2b, 0xf8, 0xd1, - 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0x00, 0x26, - 0x06, 0x9d, 0xc6, 0x60, 0x04, 0x1c, 0x00, 0x20, - 0x17, 0x1c, 0x0a, 0x5c, 0x26, 0x18, 0x01, 0x30, - 0x08, 0x28, 0x32, 0x74, 0xf9, 0xdb, 0x07, 0x99, - 0x01, 0x20, 0x06, 0x29, 0x01, 0xd1, 0x60, 0x76, - 0x01, 0xe0, 0x00, 0x26, 0x66, 0x76, 0x05, 0x99, - 0x07, 0x29, 0x01, 0xd1, 0x20, 0x76, 0x01, 0xe0, - 0x00, 0x26, 0x26, 0x76, 0x00, 0x26, 0x65, 0x62, - 0x26, 0x62, 0xe3, 0x61, 0x20, 0x7e, 0x00, 0x28, - 0x05, 0xd0, 0x28, 0x1c, 0x19, 0x1c, 0xda, 0xf7, - 0xa5, 0xfa, 0x68, 0x43, 0x01, 0xe0, 0x98, 0x08, - 0x80, 0x00, 0xa0, 0x62, 0xe7, 0x62, 0x38, 0x18, - 0x20, 0x63, 0x67, 0x63, 0x66, 0x64, 0xa7, 0x63, - 0xe6, 0x63, 0x26, 0x64, 0x26, 0x60, 0x66, 0x60, - 0x0e, 0x48, 0x0f, 0xf0, 0xed, 0x09, 0x00, 0x62, - 0x02, 0xdd, 0xfd, 0x0e, 0x48, 0xe0, 0x60, 0x0e, - 0x48, 0x01, 0x68, 0x00, 0x29, 0x06, 0xd0, 0x09, - 0x68, 0x21, 0x60, 0x4c, 0x60, 0x00, 0x68, 0x60, - 0x60, 0x04, 0x60, 0x02, 0xe0, 0x04, 0x60, 0x24, - 0x60, 0x64, 0x60, 0x08, 0x48, 0x01, 0x68, 0x01, - 0x31, 0x01, 0x60, 0x0f, 0xf0, 0xc3, 0xfd, 0x30, - 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x64, 0x67, 0x03, 0x20, 0x45, 0x50, 0x49, - 0x50, 0x5c, 0x67, 0x03, 0x20, 0x60, 0x67, 0x03, - 0x20, 0xf0, 0xb5, 0x07, 0x1c, 0x31, 0x48, 0x0f, - 0xf0, 0xb5, 0xfd, 0x00, 0x21, 0xf9, 0x60, 0x0f, - 0xf0, 0xad, 0xfd, 0x2f, 0x48, 0x0f, 0xf0, 0xae, - 0xfd, 0x39, 0x68, 0x2e, 0x48, 0xb9, 0x42, 0x02, - 0xd1, 0x00, 0x21, 0x01, 0x60, 0x09, 0xe0, 0x7a, - 0x68, 0x4a, 0x60, 0x06, 0xcf, 0x08, 0x3f, 0x11, - 0x60, 0x01, 0x68, 0x8f, 0x42, 0x01, 0xd1, 0x79, - 0x68, 0x01, 0x60, 0x27, 0x48, 0x00, 0x25, 0x01, - 0x68, 0x01, 0x39, 0x01, 0x60, 0x7c, 0x6c, 0x00, - 0x2c, 0x19, 0xd0, 0x20, 0x48, 0x0f, 0xf0, 0x92, - 0xfd, 0x26, 0x20, 0xc0, 0x43, 0x20, 0x62, 0x20, - 0x69, 0x66, 0x68, 0x05, 0x21, 0xec, 0xf7, 0xa4, - 0xfd, 0x05, 0x43, 0x78, 0x6c, 0xb0, 0x42, 0x01, - 0xd1, 0x00, 0x24, 0x00, 0xe0, 0x34, 0x1c, 0x18, - 0x48, 0x0f, 0xf0, 0x90, 0xfd, 0x15, 0x48, 0x0f, - 0xf0, 0x89, 0xfd, 0x00, 0x2c, 0xe5, 0xd1, 0x3c, - 0x6c, 0x00, 0x2c, 0x19, 0xd0, 0x11, 0x48, 0x0f, - 0xf0, 0x75, 0xfd, 0x26, 0x20, 0xc0, 0x43, 0x20, - 0x62, 0x20, 0x69, 0x66, 0x68, 0x05, 0x21, 0xec, - 0xf7, 0x87, 0xfd, 0x05, 0x43, 0x38, 0x6c, 0xb0, - 0x42, 0x01, 0xd1, 0x00, 0x24, 0x00, 0xe0, 0x34, - 0x1c, 0x09, 0x48, 0x0f, 0xf0, 0x73, 0xfd, 0x07, - 0x48, 0x0f, 0xf0, 0x6c, 0xfd, 0x00, 0x2c, 0xed, - 0x09, 0x00, 0x63, 0x02, 0xe5, 0xd1, 0x00, 0x2d, - 0x01, 0xd0, 0x0f, 0xf0, 0x62, 0xfd, 0x0f, 0xf0, - 0x54, 0xfd, 0xf0, 0xbc, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x00, 0x67, 0x03, 0x20, 0x64, 0x67, - 0x03, 0x20, 0x5c, 0x67, 0x03, 0x20, 0x60, 0x67, - 0x03, 0x20, 0xff, 0xb5, 0x8c, 0xb0, 0x05, 0x1c, - 0x00, 0x26, 0x00, 0x24, 0x17, 0x1c, 0x6e, 0x48, - 0x0f, 0xf0, 0x43, 0xfd, 0x29, 0x7e, 0x00, 0x29, - 0x01, 0xd0, 0x00, 0x20, 0x19, 0xe0, 0xf8, 0x1c, - 0x80, 0x08, 0x80, 0x00, 0x6b, 0x6c, 0xc6, 0x1b, - 0x30, 0x1d, 0x00, 0x2b, 0x0b, 0x93, 0x10, 0xd0, - 0x2a, 0x6a, 0x00, 0x2a, 0x0d, 0xd0, 0x65, 0x4a, - 0x12, 0x68, 0x6b, 0x7e, 0x00, 0x2b, 0x07, 0xd1, - 0x0f, 0x9b, 0x00, 0x2b, 0x04, 0xd0, 0x0b, 0x9b, - 0x1b, 0x7a, 0x92, 0x7e, 0x93, 0x42, 0x00, 0xdc, - 0xa8, 0x6a, 0x3b, 0x18, 0xaa, 0x6a, 0x00, 0x20, - 0x9a, 0x42, 0x35, 0xd2, 0x0f, 0x9b, 0x00, 0x2b, - 0x2f, 0xd0, 0xe9, 0x6b, 0x5a, 0x4a, 0x01, 0x31, - 0xe9, 0x63, 0x05, 0x95, 0x0d, 0x99, 0x03, 0x90, - 0x02, 0x90, 0x08, 0x97, 0x07, 0x91, 0x17, 0x68, - 0x02, 0xac, 0x06, 0x97, 0x68, 0x7e, 0x00, 0x28, - 0x0d, 0xd0, 0x68, 0x6c, 0x00, 0x28, 0x06, 0xd0, - 0x00, 0x68, 0x02, 0x90, 0x44, 0x60, 0x68, 0x6c, - 0x03, 0x90, 0x04, 0x60, 0x0b, 0xe0, 0x6c, 0x64, - 0x02, 0x94, 0x03, 0x94, 0x07, 0xe0, 0xb8, 0x7e, - 0x04, 0xab, 0x18, 0x70, 0xe8, 0x1d, 0x3d, 0x30, - 0x21, 0x1c, 0x01, 0xf0, 0x1a, 0xfd, 0x0f, 0x9a, - 0x23, 0x1c, 0x05, 0x21, 0x00, 0x92, 0x46, 0x4a, - 0x38, 0x1c, 0xec, 0xf7, 0xa8, 0xfd, 0x0a, 0x9c, - 0x7b, 0xe0, 0x28, 0x24, 0xe4, 0x43, 0x78, 0xe0, - 0x6a, 0x6c, 0x00, 0x2a, 0x2a, 0xd0, 0x2a, 0x6a, - 0x00, 0x2a, 0x27, 0xd1, 0xe9, 0x6b, 0x01, 0x39, - 0xe9, 0x63, 0xed, 0x09, 0x00, 0x64, 0x02, 0x69, - 0x6c, 0x0a, 0x68, 0x8a, 0x42, 0x01, 0xd1, 0x68, - 0x64, 0x09, 0xe0, 0x4b, 0x68, 0x53, 0x60, 0x0c, - 0xc9, 0x08, 0x39, 0x1a, 0x60, 0x6a, 0x6c, 0x8a, - 0x42, 0x01, 0xd1, 0x4a, 0x68, 0x6a, 0x64, 0x0d, - 0x9a, 0x4b, 0x69, 0x08, 0x62, 0x38, 0x1c, 0x15, - 0x78, 0x1d, 0x70, 0x01, 0x33, 0x01, 0x38, 0x01, - 0xd0, 0x01, 0x32, 0xf8, 0xe7, 0xcf, 0x61, 0x08, - 0x69, 0x05, 0x21, 0xec, 0xf7, 0xda, 0xfc, 0x00, - 0x28, 0x4d, 0xd0, 0x0f, 0xf0, 0xc4, 0xfc, 0x4a, - 0xe0, 0x0d, 0x9a, 0xa8, 0x6b, 0x00, 0x29, 0x07, - 0xd0, 0x39, 0x1c, 0x13, 0x78, 0x03, 0x70, 0x01, - 0x30, 0x01, 0x39, 0x28, 0xd0, 0x01, 0x32, 0xf8, - 0xe7, 0x80, 0xc0, 0x29, 0x6b, 0x81, 0x42, 0x00, - 0xd8, 0xe8, 0x6a, 0xa9, 0x6a, 0x04, 0x39, 0xa9, - 0x62, 0x29, 0x6b, 0x09, 0x1a, 0x01, 0x91, 0xb9, - 0x42, 0x07, 0xd3, 0x39, 0x1c, 0x13, 0x78, 0x03, - 0x70, 0x01, 0x30, 0x01, 0x39, 0x13, 0xd0, 0x01, - 0x32, 0xf8, 0xe7, 0x01, 0x99, 0x13, 0x78, 0x01, - 0x32, 0x01, 0x39, 0x03, 0x70, 0x01, 0xd0, 0x01, - 0x30, 0xf8, 0xe7, 0xe8, 0x6a, 0x01, 0x99, 0x79, - 0x1a, 0x13, 0x78, 0x03, 0x70, 0x01, 0x30, 0x01, - 0x39, 0x01, 0xd0, 0x01, 0x32, 0xf8, 0xe7, 0x29, - 0x6b, 0x81, 0x42, 0x00, 0xd8, 0xe8, 0x6a, 0x00, - 0x2e, 0x0a, 0xd0, 0x09, 0x1a, 0xb1, 0x42, 0x03, - 0xd8, 0xe8, 0x6a, 0x71, 0x1a, 0x40, 0x18, 0x00, - 0xe0, 0x80, 0x19, 0xa9, 0x6a, 0x89, 0x1b, 0xa9, - 0x62, 0xa8, 0x63, 0xa8, 0x6a, 0xc0, 0x1b, 0xa8, - 0x62, 0x28, 0x6a, 0x01, 0x30, 0x28, 0x62, 0x0f, - 0xf0, 0x6a, 0xfc, 0x20, 0x1c, 0x10, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, - 0x67, 0x03, 0x20, 0xe8, 0x66, 0x03, 0x20, 0xe9, - 0x62, 0x02, 0x20, 0xff, 0xb5, 0xed, 0x09, 0x00, - 0x65, 0x02, 0x8d, 0xb0, 0x04, 0x1c, 0x00, 0x20, - 0x01, 0x90, 0x00, 0x25, 0x0e, 0x1c, 0x17, 0x1c, - 0xab, 0x48, 0x0f, 0xf0, 0x57, 0xfc, 0x20, 0x6c, - 0x00, 0x28, 0x2a, 0xd0, 0xe0, 0x6b, 0x01, 0x38, - 0xe0, 0x63, 0x20, 0x6c, 0x01, 0x68, 0x81, 0x42, - 0x02, 0xd1, 0x00, 0x21, 0x21, 0x64, 0x09, 0xe0, - 0x42, 0x68, 0x4a, 0x60, 0x06, 0xc8, 0x08, 0x38, - 0x11, 0x60, 0x21, 0x6c, 0x81, 0x42, 0x01, 0xd1, - 0x41, 0x68, 0x21, 0x64, 0x00, 0x23, 0x42, 0x69, - 0x03, 0x62, 0x31, 0x1c, 0x13, 0x78, 0x0b, 0x70, - 0x01, 0x31, 0x01, 0x3f, 0x01, 0xd0, 0x01, 0x32, - 0xf8, 0xe7, 0x81, 0x69, 0x10, 0x9b, 0x19, 0x60, - 0x00, 0x69, 0x05, 0x21, 0xec, 0xf7, 0x48, 0xfc, - 0x00, 0x28, 0x65, 0xd0, 0x0f, 0xf0, 0x32, 0xfc, - 0xb8, 0xe0, 0x20, 0x6a, 0x00, 0x28, 0x60, 0xd0, - 0x22, 0x7e, 0x31, 0x1c, 0x60, 0x6b, 0x00, 0x2a, - 0x07, 0xd0, 0x3e, 0x1c, 0x02, 0x78, 0x01, 0x30, - 0x01, 0x3e, 0x0a, 0x70, 0x2a, 0xd0, 0x01, 0x31, - 0xf8, 0xe7, 0x80, 0xc8, 0x22, 0x6b, 0x82, 0x42, - 0x00, 0xd8, 0xe0, 0x6a, 0xa2, 0x6a, 0x04, 0x32, - 0xa2, 0x62, 0xfa, 0x1c, 0x92, 0x08, 0x92, 0x00, - 0xd5, 0x1b, 0x22, 0x6b, 0x12, 0x1a, 0xba, 0x42, - 0x07, 0xd3, 0x3e, 0x1c, 0x02, 0x78, 0x01, 0x30, - 0x01, 0x3e, 0x0a, 0x70, 0x12, 0xd0, 0x01, 0x31, - 0xf8, 0xe7, 0x13, 0x1c, 0x06, 0x78, 0x0e, 0x70, - 0x01, 0x31, 0x01, 0x3b, 0x01, 0xd0, 0x01, 0x30, - 0xf8, 0xe7, 0xe0, 0x6a, 0xbe, 0x1a, 0x02, 0x78, - 0x01, 0x30, 0x01, 0x3e, 0x0a, 0x70, 0x01, 0xd0, - 0x01, 0x31, 0xf8, 0xe7, 0x21, 0x6b, 0x81, 0x42, - 0x00, 0xd8, 0xe0, 0x6a, 0x00, 0x2d, 0x0a, 0xd0, - 0x09, 0x1a, 0xa9, 0x42, 0x03, 0xd8, 0xe0, 0x6a, - 0x69, 0x1a, 0x40, 0x18, 0x00, 0xe0, 0x40, 0x19, - 0xed, 0x09, 0x00, 0x66, 0x02, 0xa1, 0x6a, 0x49, - 0x19, 0xa1, 0x62, 0x60, 0x63, 0xa0, 0x6a, 0xc0, - 0x19, 0xa0, 0x62, 0x20, 0x6a, 0x01, 0x38, 0x20, - 0x62, 0x10, 0x9b, 0x1f, 0x60, 0x60, 0x6c, 0x00, - 0x28, 0x62, 0xd0, 0x00, 0x21, 0x02, 0x91, 0x21, - 0x7e, 0x00, 0x25, 0x87, 0x69, 0x00, 0x29, 0x73, - 0xd1, 0xf9, 0x1c, 0x89, 0x08, 0x89, 0x00, 0xcd, - 0x1b, 0x2e, 0x1d, 0x77, 0xe0, 0xba, 0xe0, 0x7f, - 0xe0, 0x23, 0x7e, 0x42, 0x69, 0xa1, 0x6b, 0x00, - 0x2b, 0x07, 0xd0, 0x3e, 0x1c, 0x13, 0x78, 0x0b, - 0x70, 0x01, 0x31, 0x01, 0x3e, 0x27, 0xd0, 0x01, - 0x32, 0xf8, 0xe7, 0x80, 0xc1, 0x23, 0x6b, 0x8b, - 0x42, 0x00, 0xd8, 0xe1, 0x6a, 0xa6, 0x6a, 0x5b, - 0x1a, 0x04, 0x3e, 0xa6, 0x62, 0x03, 0x93, 0xbb, - 0x42, 0x07, 0xd3, 0x3e, 0x1c, 0x13, 0x78, 0x0b, - 0x70, 0x01, 0x31, 0x01, 0x3e, 0x13, 0xd0, 0x01, - 0x32, 0xf8, 0xe7, 0x03, 0x9b, 0x16, 0x78, 0x01, - 0x32, 0x01, 0x3b, 0x0e, 0x70, 0x01, 0xd0, 0x01, - 0x31, 0xf8, 0xe7, 0xe1, 0x6a, 0x03, 0x9b, 0xfe, - 0x1a, 0x13, 0x78, 0x0b, 0x70, 0x01, 0x31, 0x01, - 0x3e, 0x01, 0xd0, 0x01, 0x32, 0xf8, 0xe7, 0x22, - 0x6b, 0x8a, 0x42, 0x00, 0xd8, 0xe1, 0x6a, 0x00, - 0x2d, 0x0a, 0xd0, 0x52, 0x1a, 0xaa, 0x42, 0x03, - 0xd8, 0xe1, 0x6a, 0xaa, 0x1a, 0x89, 0x18, 0x00, - 0xe0, 0x49, 0x19, 0xa2, 0x6a, 0x52, 0x1b, 0xa2, - 0x62, 0xa1, 0x63, 0xa1, 0x6a, 0xc9, 0x1b, 0xa1, - 0x62, 0x21, 0x6a, 0x01, 0x31, 0x21, 0x62, 0xe1, - 0x6b, 0x01, 0x39, 0xe1, 0x63, 0x01, 0x68, 0x81, - 0x42, 0x03, 0xd1, 0x00, 0x21, 0x61, 0x64, 0x0a, - 0xe0, 0x64, 0xe0, 0x42, 0x68, 0x4a, 0x60, 0x06, - 0xc8, 0x08, 0x38, 0x11, 0x60, 0x61, 0x6c, 0x81, - 0x42, 0x01, 0xd1, 0x41, 0x68, 0x61, 0x64, 0x00, - 0x21, 0x01, 0x62, 0xed, 0x09, 0x00, 0x67, 0x02, - 0x00, 0x69, 0x05, 0x21, 0xec, 0xf7, 0x79, 0xfb, - 0x02, 0x99, 0x01, 0x43, 0x02, 0x91, 0x60, 0x6c, - 0x00, 0x28, 0x0e, 0xd0, 0x00, 0xe0, 0x08, 0xe0, - 0x21, 0x7e, 0x00, 0x29, 0x05, 0xd1, 0x87, 0x69, - 0xf9, 0x1c, 0x89, 0x08, 0x89, 0x00, 0xcd, 0x1b, - 0x2e, 0x1d, 0xa2, 0x6a, 0xb9, 0x19, 0x91, 0x42, - 0x85, 0xd9, 0x02, 0x99, 0x00, 0x29, 0x3c, 0xd0, - 0x0f, 0xf0, 0x4d, 0xfb, 0x39, 0xe0, 0x16, 0x98, - 0x00, 0x28, 0x33, 0xd0, 0xe0, 0x6b, 0x04, 0xad, - 0x01, 0x30, 0xe0, 0x63, 0x00, 0x20, 0x05, 0x90, - 0x04, 0x90, 0x1c, 0x48, 0x07, 0x94, 0x09, 0x96, - 0x0a, 0x97, 0x07, 0x68, 0x08, 0x97, 0x60, 0x7e, - 0x00, 0x28, 0x0d, 0xd0, 0x60, 0x6c, 0x00, 0x28, - 0x06, 0xd0, 0x00, 0x68, 0x04, 0x90, 0x45, 0x60, - 0x60, 0x6c, 0x05, 0x90, 0x05, 0x60, 0x0b, 0xe0, - 0x65, 0x64, 0x04, 0x95, 0x05, 0x95, 0x07, 0xe0, - 0xb8, 0x7e, 0x06, 0xab, 0x18, 0x70, 0xe0, 0x1d, - 0x3d, 0x30, 0x29, 0x1c, 0x01, 0xf0, 0x3f, 0xfb, - 0x16, 0x9a, 0x2b, 0x1c, 0x05, 0x21, 0x00, 0x92, - 0x0c, 0x4a, 0x38, 0x1c, 0xec, 0xf7, 0xcd, 0xfb, - 0x0c, 0x98, 0x10, 0x9b, 0x01, 0x90, 0x0b, 0x98, - 0x18, 0x60, 0x02, 0xe0, 0x27, 0x20, 0xc0, 0x43, - 0x01, 0x90, 0x0f, 0xf0, 0x04, 0xfb, 0x01, 0x98, - 0x11, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x00, 0x67, 0x03, 0x20, 0xe8, 0x66, - 0x03, 0x20, 0xe9, 0x62, 0x02, 0x20, 0x31, 0x21, - 0xc9, 0x43, 0x01, 0x62, 0xc1, 0x68, 0xca, 0x6b, - 0x01, 0x3a, 0xca, 0x63, 0x01, 0x68, 0x81, 0x42, - 0x03, 0xd1, 0xc0, 0x68, 0x00, 0x21, 0x41, 0x64, - 0x70, 0x47, 0x42, 0x68, 0x4a, 0x60, 0x06, 0xc8, - 0x08, 0x38, 0x11, 0x60, 0xc1, 0x68, 0x4a, 0x6c, - 0x82, 0x42, 0xf5, 0xd1, 0x40, 0x68, 0xed, 0x09, - 0x00, 0x68, 0x02, 0x48, 0x64, 0x70, 0x47, 0xff, - 0xb5, 0x00, 0x25, 0x0a, 0x9b, 0x09, 0x9c, 0x45, - 0x61, 0x07, 0x1c, 0x00, 0x20, 0x0d, 0x5c, 0x3e, - 0x18, 0x01, 0x30, 0x08, 0x28, 0x35, 0x76, 0xf9, - 0xdb, 0x03, 0x98, 0x80, 0x08, 0x80, 0x00, 0xe1, - 0x1c, 0x89, 0x08, 0x89, 0x00, 0x78, 0x62, 0xb9, - 0x62, 0x01, 0x21, 0x06, 0x2b, 0x3a, 0x62, 0x03, - 0xd1, 0xfb, 0x1d, 0x29, 0x33, 0x19, 0x72, 0x03, - 0xe0, 0x00, 0x24, 0xfb, 0x1d, 0x29, 0x33, 0x1c, - 0x72, 0x00, 0x24, 0x3c, 0x60, 0x7c, 0x60, 0xfc, - 0x63, 0x3c, 0x64, 0x20, 0x38, 0xf8, 0x62, 0x3a, - 0x63, 0x7a, 0x63, 0xd7, 0x60, 0x11, 0x72, 0xf8, - 0x6a, 0x80, 0x18, 0x10, 0x30, 0x10, 0x60, 0x50, - 0x60, 0x10, 0x68, 0x02, 0x60, 0x42, 0x60, 0xc7, - 0x60, 0x04, 0x72, 0xfc, 0x60, 0x0f, 0x48, 0x0f, - 0xf0, 0xa8, 0xfa, 0x0e, 0x48, 0x78, 0x61, 0x0e, - 0x48, 0x01, 0x68, 0x00, 0x29, 0x06, 0xd0, 0x09, - 0x68, 0x39, 0x60, 0x4f, 0x60, 0x00, 0x68, 0x78, - 0x60, 0x07, 0x60, 0x02, 0xe0, 0x07, 0x60, 0x3f, - 0x60, 0x7f, 0x60, 0x08, 0x48, 0x01, 0x68, 0x01, - 0x31, 0x01, 0x60, 0x0f, 0xf0, 0x8e, 0xfa, 0x20, - 0x1c, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0xa4, 0x67, 0x03, 0x20, 0x41, - 0x4e, 0x59, 0x44, 0x9c, 0x67, 0x03, 0x20, 0xa0, - 0x67, 0x03, 0x20, 0xf0, 0xb5, 0x07, 0x1c, 0x0c, - 0x30, 0x0f, 0xf0, 0x7f, 0xfa, 0x00, 0x21, 0x79, - 0x61, 0x0f, 0xf0, 0x77, 0xfa, 0x21, 0x4e, 0x30, - 0x1c, 0x0f, 0xf0, 0x77, 0xfa, 0x39, 0x68, 0x1f, - 0x48, 0xb9, 0x42, 0x02, 0xd1, 0x00, 0x21, 0x01, - 0x60, 0x09, 0xe0, 0x7a, 0x68, 0x4a, 0x60, 0x06, - 0xcf, 0x08, 0x3f, 0x11, 0x60, 0x01, 0x68, 0x8f, - 0x42, 0x01, 0xd1, 0x79, 0x68, 0x01, 0x60, 0x18, - 0x48, 0xed, 0x09, 0x00, 0x69, 0x02, 0x00, 0x25, - 0x01, 0x68, 0x01, 0x39, 0x01, 0x60, 0x3c, 0x6c, - 0x00, 0x2c, 0x1f, 0xd0, 0x15, 0x48, 0x0f, 0xf0, - 0x5b, 0xfa, 0x00, 0x20, 0xa0, 0x61, 0x2a, 0x20, - 0xc0, 0x43, 0xe0, 0x61, 0x60, 0x69, 0x66, 0x68, - 0x09, 0x21, 0xec, 0xf7, 0x6b, 0xfa, 0x05, 0x43, - 0x38, 0x6c, 0xb0, 0x42, 0x01, 0xd1, 0x00, 0x24, - 0x00, 0xe0, 0x34, 0x1c, 0x08, 0x48, 0x0f, 0xf0, - 0x57, 0xfa, 0x0a, 0x48, 0x0f, 0xf0, 0x50, 0xfa, - 0x00, 0x2c, 0xe3, 0xd1, 0x00, 0x2d, 0x01, 0xd0, - 0x0f, 0xf0, 0x46, 0xfa, 0x0f, 0xf0, 0x38, 0xfa, - 0xf0, 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0xa4, 0x67, 0x03, 0x20, 0x9c, 0x67, 0x03, 0x20, - 0xa0, 0x67, 0x03, 0x20, 0x00, 0x67, 0x03, 0x20, - 0xff, 0xb5, 0x8a, 0xb0, 0x86, 0x6a, 0x00, 0x25, - 0x04, 0x1c, 0x0f, 0x1c, 0x96, 0x42, 0x02, 0xd8, - 0xd0, 0x1c, 0x80, 0x08, 0x86, 0x00, 0xe0, 0x1d, - 0x05, 0x30, 0x09, 0x90, 0x0f, 0xf0, 0x20, 0xfa, - 0x60, 0x6b, 0x01, 0x1c, 0x0a, 0x7a, 0x00, 0x2a, - 0x03, 0xd0, 0x0a, 0x68, 0x52, 0x1a, 0x10, 0x3a, - 0x00, 0xe0, 0x00, 0x22, 0xb2, 0x42, 0x00, 0xd2, - 0x09, 0x68, 0xb2, 0x42, 0x01, 0xd2, 0x88, 0x42, - 0xf0, 0xd1, 0x00, 0x20, 0xb2, 0x42, 0x20, 0xd3, - 0xa3, 0x6a, 0x9b, 0x19, 0x10, 0x33, 0x93, 0x42, - 0x0e, 0xd8, 0x8a, 0x19, 0x01, 0x23, 0x13, 0x76, - 0x51, 0x61, 0xd4, 0x61, 0x0b, 0x68, 0x10, 0x32, - 0x13, 0x60, 0x5a, 0x60, 0x0a, 0x60, 0xe2, 0x6a, - 0x92, 0x1b, 0x10, 0x3a, 0xe2, 0x62, 0x02, 0xe0, - 0xe3, 0x6a, 0x9a, 0x1a, 0xe2, 0x62, 0x08, 0x72, - 0x60, 0x6b, 0x88, 0x42, 0x01, 0xd1, 0x08, 0x68, - 0x60, 0x63, 0xc8, 0x1d, 0x09, 0x30, 0x38, 0x60, - 0x41, 0xe0, 0x0d, 0x9b, 0x00, 0x2b, 0x3b, 0xd0, - 0xe1, 0x6b, 0x01, 0xad, 0xed, 0x09, 0x00, 0x6a, - 0x02, 0x01, 0x31, 0xe1, 0x63, 0x02, 0x90, 0x01, - 0x90, 0x1f, 0x49, 0x04, 0x94, 0x05, 0x96, 0x0e, - 0x68, 0xe0, 0x1d, 0x29, 0x30, 0x06, 0x96, 0x00, - 0x7a, 0x00, 0x28, 0x0d, 0xd0, 0x20, 0x6c, 0x00, - 0x28, 0x06, 0xd0, 0x00, 0x68, 0x01, 0x90, 0x45, - 0x60, 0x20, 0x6c, 0x02, 0x90, 0x05, 0x60, 0x0b, - 0xe0, 0x25, 0x64, 0x01, 0x95, 0x02, 0x95, 0x07, - 0xe0, 0xb0, 0x7e, 0x03, 0xab, 0x18, 0x70, 0xe0, - 0x1d, 0x39, 0x30, 0x29, 0x1c, 0x01, 0xf0, 0xe6, - 0xf9, 0x10, 0x48, 0x0f, 0xf0, 0xbf, 0xf9, 0x0e, - 0x49, 0x09, 0x98, 0x09, 0x68, 0x08, 0x67, 0x09, - 0x98, 0x0f, 0xf0, 0xc4, 0xf9, 0x0d, 0x9a, 0x2b, - 0x1c, 0x09, 0x21, 0x00, 0x92, 0x0a, 0x4a, 0x30, - 0x1c, 0xec, 0xf7, 0x6a, 0xfa, 0x07, 0x98, 0x08, - 0x9d, 0x38, 0x60, 0x02, 0xe0, 0x1f, 0x25, 0xed, - 0x43, 0x38, 0x60, 0x0f, 0xf0, 0xa3, 0xf9, 0x28, - 0x1c, 0x0e, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xe8, 0x66, 0x03, 0x20, 0x00, 0x67, 0x03, - 0x20, 0xd5, 0x66, 0x02, 0x20, 0xf8, 0xb5, 0x00, - 0x21, 0xc4, 0x1f, 0x09, 0x3c, 0x00, 0x91, 0xe7, - 0x68, 0xf8, 0x1d, 0x05, 0x30, 0x06, 0x1c, 0x0f, - 0xf0, 0x91, 0xf9, 0x01, 0x23, 0x23, 0x72, 0x20, - 0x68, 0xf9, 0x6a, 0x00, 0x1b, 0x08, 0x18, 0x10, - 0x38, 0xf8, 0x62, 0x61, 0x68, 0x09, 0x7a, 0x00, - 0x29, 0x09, 0xd0, 0x10, 0x30, 0xf8, 0x62, 0x03, - 0xcc, 0x08, 0x3c, 0x08, 0x60, 0x60, 0x68, 0x21, - 0x68, 0x48, 0x60, 0x64, 0x68, 0x7c, 0x63, 0x20, - 0x68, 0x00, 0x7a, 0x00, 0x28, 0x08, 0xd0, 0xf8, - 0x6a, 0x10, 0x30, 0xf8, 0x62, 0x20, 0x68, 0x01, - 0x68, 0x4c, 0x60, 0x00, 0x68, 0x20, 0x60, 0x7c, - 0x63, 0x3c, 0x6c, 0x00, 0x25, 0x00, 0x2c, 0x5b, - 0xd0, 0x22, 0x69, 0x78, 0x6b, 0x03, 0x1c, 0xed, - 0x09, 0x00, 0x6b, 0x02, 0x01, 0x7a, 0x00, 0x29, - 0x03, 0xd0, 0x01, 0x68, 0x09, 0x1a, 0x10, 0x39, - 0x00, 0xe0, 0x00, 0x21, 0x91, 0x42, 0x00, 0xd2, - 0x00, 0x68, 0x91, 0x42, 0x01, 0xd2, 0x83, 0x42, - 0xf0, 0xd1, 0x91, 0x42, 0x43, 0xd3, 0xbb, 0x6a, - 0x9b, 0x18, 0x10, 0x33, 0x8b, 0x42, 0x0e, 0xd8, - 0x81, 0x18, 0x01, 0x23, 0x0b, 0x76, 0x48, 0x61, - 0xcf, 0x61, 0x03, 0x68, 0x10, 0x31, 0x0b, 0x60, - 0x59, 0x60, 0x01, 0x60, 0xf9, 0x6a, 0x89, 0x1a, - 0x10, 0x39, 0xf9, 0x62, 0x02, 0xe0, 0xfa, 0x6a, - 0x51, 0x1a, 0xf9, 0x62, 0x00, 0x23, 0x03, 0x72, - 0x79, 0x6b, 0x81, 0x42, 0x01, 0xd1, 0x01, 0x68, - 0x79, 0x63, 0xf9, 0x6b, 0x01, 0x39, 0xf9, 0x63, - 0x21, 0x68, 0xa1, 0x42, 0x01, 0xd1, 0x3b, 0x64, - 0x09, 0xe0, 0x62, 0x68, 0x4a, 0x60, 0x06, 0xcc, - 0x08, 0x3c, 0x11, 0x60, 0x39, 0x6c, 0xa1, 0x42, - 0x01, 0xd1, 0x61, 0x68, 0x39, 0x64, 0x10, 0x30, - 0xa0, 0x61, 0xe3, 0x61, 0x0d, 0x48, 0x0f, 0xf0, - 0x20, 0xf9, 0x09, 0x21, 0x60, 0x69, 0xec, 0xf7, - 0x36, 0xf9, 0x05, 0x43, 0x30, 0x1c, 0x0f, 0xf0, - 0x28, 0xf9, 0x07, 0x48, 0x0f, 0xf0, 0x21, 0xf9, - 0x3c, 0x6c, 0x00, 0x2c, 0xa7, 0xd1, 0x00, 0x2d, - 0x01, 0xd0, 0x0f, 0xf0, 0x16, 0xf9, 0x0f, 0xf0, - 0x08, 0xf9, 0x00, 0x98, 0xf8, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x67, 0x03, 0x20, 0x31, 0x21, - 0xc9, 0x43, 0xc1, 0x61, 0x00, 0x22, 0x82, 0x61, - 0xc1, 0x68, 0xcb, 0x6b, 0x01, 0x3b, 0xcb, 0x63, - 0x01, 0x68, 0x81, 0x42, 0x02, 0xd1, 0xc0, 0x68, - 0x02, 0x64, 0x70, 0x47, 0x42, 0x68, 0x4a, 0x60, - 0x06, 0xc8, 0x08, 0x38, 0x11, 0x60, 0xc1, 0x68, - 0x0a, 0x6c, 0x82, 0x42, 0xf5, 0xd1, 0x40, 0x68, - 0x08, 0x64, 0x70, 0x47, 0x00, 0x00, 0xff, 0xb5, - 0x07, 0x1c, 0xed, 0x09, 0x00, 0x6c, 0x02, 0x00, - 0x24, 0x00, 0x23, 0x0a, 0x98, 0x0b, 0x9d, 0x09, - 0x9a, 0xfb, 0x60, 0xcc, 0x5c, 0xfe, 0x18, 0x01, - 0x33, 0x08, 0x2b, 0x34, 0x74, 0xf9, 0xdb, 0x02, - 0x99, 0x00, 0x24, 0xb9, 0x61, 0x03, 0x9b, 0xfb, - 0x61, 0x7c, 0x62, 0xf8, 0x62, 0xba, 0x62, 0x01, - 0x20, 0x38, 0x63, 0x3c, 0x60, 0x7c, 0x60, 0x3c, - 0x62, 0xfc, 0x63, 0x3c, 0x64, 0x38, 0x1c, 0x12, - 0x48, 0xbf, 0x63, 0x0f, 0xf0, 0xc8, 0xf8, 0x11, - 0x48, 0xf8, 0x60, 0x11, 0x48, 0x01, 0x68, 0x00, - 0x29, 0x06, 0xd0, 0x09, 0x68, 0x39, 0x60, 0x4f, - 0x60, 0x00, 0x68, 0x78, 0x60, 0x07, 0x60, 0x03, - 0xe0, 0x07, 0x60, 0x3f, 0x60, 0x7f, 0x60, 0x38, - 0x1c, 0x0b, 0x48, 0x01, 0x68, 0x01, 0x31, 0x01, - 0x60, 0x0f, 0xf0, 0xad, 0xf8, 0x05, 0x2d, 0x03, - 0xd1, 0x05, 0x21, 0x38, 0x1c, 0x00, 0xf0, 0x6b, - 0xf8, 0x20, 0x1c, 0x04, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x98, 0x65, 0x03, 0x20, 0x45, - 0x4d, 0x49, 0x54, 0x88, 0x65, 0x03, 0x20, 0x8c, - 0x65, 0x03, 0x20, 0xb0, 0xb5, 0x00, 0x27, 0x04, - 0x1c, 0x16, 0x48, 0x0f, 0xf0, 0x98, 0xf8, 0x20, - 0x6a, 0x00, 0x25, 0x00, 0x28, 0x02, 0xd0, 0x22, - 0x27, 0xff, 0x43, 0x00, 0xe0, 0xe5, 0x60, 0x0f, - 0xf0, 0x8a, 0xf8, 0x00, 0x2f, 0x18, 0xd1, 0x0f, - 0x48, 0x0f, 0xf0, 0x89, 0xf8, 0x21, 0x68, 0x0e, - 0x48, 0xa1, 0x42, 0x01, 0xd1, 0x05, 0x60, 0x09, - 0xe0, 0x62, 0x68, 0x4a, 0x60, 0x06, 0xcc, 0x08, - 0x3c, 0x11, 0x60, 0x01, 0x68, 0x8c, 0x42, 0x01, - 0xd1, 0x61, 0x68, 0x01, 0x60, 0x08, 0x48, 0x01, - 0x68, 0x01, 0x39, 0x01, 0x60, 0x0f, 0xf0, 0x6f, - 0xf8, 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x00, 0x67, 0x03, 0x20, 0x98, - 0x65, 0x03, 0x20, 0x88, 0x65, 0xed, 0x09, 0x00, - 0x6d, 0x02, 0x03, 0x20, 0x8c, 0x65, 0x03, 0x20, - 0xff, 0xb5, 0x14, 0x1c, 0x0d, 0x1c, 0x07, 0x1c, - 0x0f, 0x48, 0x09, 0x9e, 0x0f, 0xf0, 0x5e, 0xf8, - 0x38, 0x6a, 0x00, 0x28, 0x02, 0xd0, 0x22, 0x24, - 0xe4, 0x43, 0x06, 0xe0, 0x00, 0x20, 0xbd, 0x61, - 0x78, 0x62, 0xbc, 0x62, 0x03, 0x9b, 0x00, 0x24, - 0xfb, 0x62, 0x0f, 0xf0, 0x4b, 0xf8, 0x00, 0x2c, - 0x05, 0xd1, 0x05, 0x2e, 0x03, 0xd1, 0x05, 0x21, - 0x38, 0x1c, 0x00, 0xf0, 0x07, 0xf8, 0x20, 0x1c, - 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x67, 0x03, 0x20, 0xb0, 0xb5, 0x04, 0x1c, - 0x12, 0x48, 0x0f, 0x1c, 0x0f, 0xf0, 0x3a, 0xf8, - 0xe0, 0x1d, 0x29, 0x30, 0x00, 0x25, 0x05, 0x2f, - 0x0d, 0xd1, 0x21, 0x6a, 0x00, 0x29, 0x12, 0xd1, - 0x61, 0x6a, 0x00, 0x29, 0x01, 0xd0, 0xe1, 0x6a, - 0x00, 0xe0, 0xa1, 0x6a, 0x01, 0x22, 0x22, 0x62, - 0xec, 0xf7, 0x81, 0xff, 0x07, 0xe0, 0x04, 0x2f, - 0x05, 0xd1, 0x21, 0x6a, 0x00, 0x29, 0x02, 0xd0, - 0xec, 0xf7, 0xdc, 0xff, 0x25, 0x62, 0x0f, 0xf0, - 0x19, 0xf8, 0x28, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x67, 0x03, 0x20, - 0xf0, 0xb5, 0x00, 0x24, 0x05, 0x9d, 0xc4, 0x60, - 0x07, 0x1c, 0x00, 0x20, 0x0c, 0x5c, 0x3e, 0x18, - 0x01, 0x30, 0x08, 0x28, 0x34, 0x74, 0xf9, 0xdb, - 0x18, 0x37, 0x2c, 0xc7, 0x06, 0x98, 0x24, 0x3f, - 0x06, 0x28, 0x04, 0xd1, 0x01, 0x20, 0xf9, 0x1d, - 0x29, 0x31, 0x08, 0x70, 0x03, 0xe0, 0x00, 0x24, - 0xf8, 0x1d, 0x29, 0x30, 0x04, 0x70, 0x00, 0x24, - 0x3c, 0x60, 0x7c, 0x60, 0xe8, 0x1c, 0x80, 0x08, - 0x7c, 0x62, 0xbc, 0x62, 0x80, 0x00, 0xc1, 0x1d, - 0xfc, 0x62, 0x7c, 0x63, 0x01, 0x31, 0x99, 0x42, - 0xbc, 0x63, 0x0b, 0xd8, 0x57, 0x60, 0xfd, 0x6a, - 0xed, 0x09, 0x00, 0x6e, 0x02, 0x5b, 0x1a, 0x15, - 0x60, 0xfa, 0x62, 0x7d, 0x6a, 0x12, 0x18, 0x01, - 0x35, 0x08, 0x32, 0x99, 0x42, 0x7d, 0x62, 0xf3, - 0xd9, 0x0e, 0x48, 0x0e, 0xf0, 0xdd, 0xff, 0x0e, - 0x48, 0xf8, 0x60, 0x0e, 0x48, 0x01, 0x68, 0x00, - 0x29, 0x06, 0xd0, 0x09, 0x68, 0x39, 0x60, 0x4f, - 0x60, 0x00, 0x68, 0x78, 0x60, 0x07, 0x60, 0x02, - 0xe0, 0x07, 0x60, 0x3f, 0x60, 0x7f, 0x60, 0x08, - 0x48, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x0e, - 0xf0, 0xc3, 0xff, 0x20, 0x1c, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x94, 0x67, 0x03, - 0x20, 0x54, 0x52, 0x41, 0x50, 0x8c, 0x67, 0x03, - 0x20, 0x90, 0x67, 0x03, 0x20, 0xf0, 0xb5, 0x25, - 0x4e, 0x07, 0x1c, 0x30, 0x1c, 0x0e, 0xf0, 0xb4, - 0xff, 0x00, 0x21, 0xf9, 0x60, 0x0e, 0xf0, 0xac, - 0xff, 0x21, 0x48, 0x0e, 0xf0, 0xad, 0xff, 0x39, - 0x68, 0x20, 0x48, 0xb9, 0x42, 0x02, 0xd1, 0x00, - 0x21, 0x01, 0x60, 0x09, 0xe0, 0x7a, 0x68, 0x4a, - 0x60, 0x06, 0xcf, 0x08, 0x3f, 0x11, 0x60, 0x01, - 0x68, 0x8f, 0x42, 0x01, 0xd1, 0x79, 0x68, 0x01, - 0x60, 0x19, 0x48, 0x00, 0x25, 0x01, 0x68, 0x01, - 0x39, 0x01, 0x60, 0xbc, 0x6b, 0x00, 0x2c, 0x1f, - 0xd0, 0x12, 0x48, 0x0e, 0xf0, 0x91, 0xff, 0x00, - 0x20, 0x60, 0x61, 0x2a, 0x20, 0xc0, 0x43, 0xa0, - 0x61, 0x20, 0x69, 0x66, 0x68, 0x08, 0x21, 0xeb, - 0xf7, 0xa1, 0xff, 0x05, 0x43, 0xb8, 0x6b, 0xb0, - 0x42, 0x01, 0xd1, 0x00, 0x24, 0x00, 0xe0, 0x34, - 0x1c, 0x09, 0x48, 0x0e, 0xf0, 0x8d, 0xff, 0x07, - 0x48, 0x0e, 0xf0, 0x86, 0xff, 0x00, 0x2c, 0xe3, - 0xd1, 0x00, 0x2d, 0x01, 0xd0, 0x0e, 0xf0, 0x7c, - 0xff, 0x0e, 0xf0, 0x6e, 0xff, 0xf0, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x67, 0x03, - 0x20, 0x94, 0x67, 0xed, 0x09, 0x00, 0x6f, 0x02, - 0x03, 0x20, 0x8c, 0x67, 0x03, 0x20, 0x90, 0x67, - 0x03, 0x20, 0xf7, 0xb5, 0x88, 0xb0, 0x04, 0x1c, - 0x00, 0x25, 0x0f, 0x1c, 0x28, 0x48, 0x0e, 0xf0, - 0x5e, 0xff, 0x61, 0x6a, 0x00, 0x20, 0x00, 0x29, - 0x0c, 0xd0, 0x01, 0x39, 0x61, 0x62, 0xa1, 0x6a, - 0x01, 0x31, 0xa1, 0x62, 0xe1, 0x6a, 0x0a, 0x68, - 0xe2, 0x62, 0x08, 0x60, 0xc8, 0x1d, 0x01, 0x30, - 0x38, 0x60, 0x35, 0xe0, 0x0a, 0x9a, 0x00, 0x2a, - 0x30, 0xd0, 0x61, 0x6b, 0x01, 0xad, 0x01, 0x31, - 0x61, 0x63, 0x02, 0x90, 0x01, 0x90, 0x1a, 0x48, - 0x04, 0x94, 0x06, 0x68, 0xe0, 0x1d, 0x29, 0x30, - 0x05, 0x96, 0x00, 0x78, 0x00, 0x28, 0x0d, 0xd0, - 0xa0, 0x6b, 0x00, 0x28, 0x06, 0xd0, 0x00, 0x68, - 0x01, 0x90, 0x45, 0x60, 0xa0, 0x6b, 0x02, 0x90, - 0x05, 0x60, 0x0b, 0xe0, 0xa5, 0x63, 0x01, 0x95, - 0x02, 0x95, 0x07, 0xe0, 0xb0, 0x7e, 0x03, 0xab, - 0x18, 0x70, 0xe0, 0x1d, 0x31, 0x30, 0x29, 0x1c, - 0x00, 0xf0, 0x49, 0xff, 0x0a, 0x9a, 0x2b, 0x1c, - 0x08, 0x21, 0x00, 0x92, 0x0a, 0x4a, 0x30, 0x1c, - 0xeb, 0xf7, 0xd7, 0xff, 0x06, 0x98, 0x07, 0x9d, - 0x38, 0x60, 0x01, 0xe0, 0x21, 0x25, 0xed, 0x43, - 0x0e, 0xf0, 0x11, 0xff, 0x28, 0x1c, 0x0b, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x67, - 0x03, 0x20, 0xe8, 0x66, 0x03, 0x20, 0x45, 0x6b, - 0x02, 0x20, 0xf0, 0xb5, 0xc6, 0x1f, 0x01, 0x3e, - 0x00, 0x27, 0x04, 0x1c, 0x1a, 0x48, 0x75, 0x68, - 0x0e, 0xf0, 0x01, 0xff, 0x68, 0x6b, 0x00, 0x28, - 0x1d, 0xd0, 0x01, 0x38, 0x68, 0x63, 0xa8, 0x6b, - 0x00, 0x21, 0x02, 0x68, 0x82, 0x42, 0x01, 0xd1, - 0xa9, 0x63, 0x09, 0xe0, 0x43, 0x68, 0x53, 0x60, - 0x0c, 0xc8, 0x08, 0x38, 0x1a, 0x60, 0xaa, 0x6b, - 0x82, 0x42, 0x01, 0xd1, 0x42, 0x68, 0xed, 0x09, - 0x00, 0x70, 0x02, 0xaa, 0x63, 0x81, 0x61, 0x44, - 0x61, 0x00, 0x69, 0x08, 0x21, 0xeb, 0xf7, 0xff, - 0xfe, 0x00, 0x28, 0x0b, 0xd0, 0x0e, 0xf0, 0xe9, - 0xfe, 0x08, 0xe0, 0x68, 0x6a, 0x01, 0x30, 0x68, - 0x62, 0xa8, 0x6a, 0x01, 0x38, 0xa8, 0x62, 0xe8, - 0x6a, 0x30, 0x60, 0xee, 0x62, 0x0e, 0xf0, 0xd1, - 0xfe, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x00, 0x67, 0x03, 0x20, 0x31, - 0x21, 0xc9, 0x43, 0x81, 0x61, 0x00, 0x22, 0x42, - 0x61, 0xc1, 0x68, 0x4b, 0x6b, 0x01, 0x3b, 0x4b, - 0x63, 0x01, 0x68, 0x81, 0x42, 0x02, 0xd1, 0xc0, - 0x68, 0x82, 0x63, 0x70, 0x47, 0x42, 0x68, 0x4a, - 0x60, 0x06, 0xc8, 0x08, 0x38, 0x11, 0x60, 0xc1, - 0x68, 0x8a, 0x6b, 0x82, 0x42, 0xf5, 0xd1, 0x40, - 0x68, 0x88, 0x63, 0x70, 0x47, 0x00, 0x00, 0xf0, - 0xb5, 0x00, 0x26, 0x06, 0x9d, 0xc6, 0x60, 0x04, - 0x1c, 0x00, 0x20, 0x17, 0x1c, 0x0a, 0x5c, 0x26, - 0x18, 0x01, 0x30, 0x08, 0x28, 0x32, 0x74, 0xf9, - 0xdb, 0x07, 0x99, 0x01, 0x20, 0x06, 0x29, 0x01, - 0xd1, 0x60, 0x76, 0x01, 0xe0, 0x00, 0x26, 0x66, - 0x76, 0x05, 0x99, 0x07, 0x29, 0x01, 0xd1, 0x20, - 0x76, 0x01, 0xe0, 0x00, 0x26, 0x26, 0x76, 0x00, - 0x26, 0x65, 0x62, 0x26, 0x62, 0xe3, 0x61, 0x20, - 0x7e, 0x00, 0x28, 0x05, 0xd0, 0x28, 0x1c, 0x19, - 0x1c, 0xd9, 0xf7, 0x41, 0xfb, 0x68, 0x43, 0x03, - 0x1c, 0x98, 0x00, 0x38, 0x18, 0x20, 0x63, 0xa3, - 0x62, 0xe7, 0x62, 0x67, 0x63, 0x66, 0x64, 0xa7, - 0x63, 0xe6, 0x63, 0x26, 0x64, 0x26, 0x60, 0x66, - 0x60, 0x0e, 0x48, 0x0e, 0xf0, 0x7a, 0xfe, 0x0d, - 0x48, 0xe0, 0x60, 0x0d, 0x48, 0x01, 0x68, 0x00, - 0x29, 0x06, 0xd0, 0x09, 0x68, 0x21, 0x60, 0x4c, - 0x60, 0x00, 0x68, 0x60, 0x60, 0x04, 0x60, 0x02, - 0xe0, 0xed, 0x09, 0x00, 0x71, 0x02, 0x04, 0x60, - 0x24, 0x60, 0x64, 0x60, 0x07, 0x48, 0x01, 0x68, - 0x01, 0x31, 0x01, 0x60, 0x0e, 0xf0, 0x60, 0xfe, - 0x30, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x54, 0x67, 0x03, 0x20, 0x55, 0x45, 0x55, 0x51, - 0x4c, 0x67, 0x03, 0x20, 0x50, 0x67, 0x03, 0x20, - 0xf0, 0xb5, 0x07, 0x1c, 0x31, 0x48, 0x0e, 0xf0, - 0x53, 0xfe, 0x00, 0x21, 0xf9, 0x60, 0x0e, 0xf0, - 0x4b, 0xfe, 0x2f, 0x48, 0x0e, 0xf0, 0x4c, 0xfe, - 0x39, 0x68, 0x2e, 0x48, 0xb9, 0x42, 0x02, 0xd1, - 0x00, 0x21, 0x01, 0x60, 0x09, 0xe0, 0x7a, 0x68, - 0x4a, 0x60, 0x06, 0xcf, 0x08, 0x3f, 0x11, 0x60, - 0x01, 0x68, 0x8f, 0x42, 0x01, 0xd1, 0x79, 0x68, - 0x01, 0x60, 0x27, 0x48, 0x00, 0x25, 0x01, 0x68, - 0x01, 0x39, 0x01, 0x60, 0x7c, 0x6c, 0x00, 0x2c, - 0x19, 0xd0, 0x20, 0x48, 0x0e, 0xf0, 0x30, 0xfe, - 0x2b, 0x20, 0xc0, 0x43, 0x20, 0x62, 0x20, 0x69, - 0x66, 0x68, 0x04, 0x21, 0xeb, 0xf7, 0x42, 0xfe, - 0x05, 0x43, 0x78, 0x6c, 0xb0, 0x42, 0x01, 0xd1, - 0x00, 0x24, 0x00, 0xe0, 0x34, 0x1c, 0x18, 0x48, - 0x0e, 0xf0, 0x2e, 0xfe, 0x15, 0x48, 0x0e, 0xf0, - 0x27, 0xfe, 0x00, 0x2c, 0xe5, 0xd1, 0x3c, 0x6c, - 0x00, 0x2c, 0x19, 0xd0, 0x11, 0x48, 0x0e, 0xf0, - 0x13, 0xfe, 0x2b, 0x20, 0xc0, 0x43, 0x20, 0x62, - 0x20, 0x69, 0x66, 0x68, 0x04, 0x21, 0xeb, 0xf7, - 0x25, 0xfe, 0x05, 0x43, 0x38, 0x6c, 0xb0, 0x42, - 0x01, 0xd1, 0x00, 0x24, 0x00, 0xe0, 0x34, 0x1c, - 0x09, 0x48, 0x0e, 0xf0, 0x11, 0xfe, 0x07, 0x48, - 0x0e, 0xf0, 0x0a, 0xfe, 0x00, 0x2c, 0xe5, 0xd1, - 0x00, 0x2d, 0x01, 0xd0, 0x0e, 0xf0, 0x00, 0xfe, - 0x0e, 0xf0, 0xf2, 0xfd, 0xf0, 0xbc, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x00, 0x67, 0x03, 0x20, - 0x54, 0x67, 0x03, 0x20, 0xed, 0x09, 0x00, 0x72, - 0x02, 0x4c, 0x67, 0x03, 0x20, 0x50, 0x67, 0x03, - 0x20, 0xff, 0xb5, 0x8b, 0xb0, 0x06, 0x1c, 0x00, - 0x25, 0x0c, 0x1c, 0x17, 0x1c, 0x63, 0x48, 0x0e, - 0xf0, 0xe1, 0xfd, 0x32, 0x7e, 0x00, 0x2a, 0x01, - 0xd0, 0x00, 0x20, 0x15, 0xe0, 0x73, 0x6c, 0x01, - 0x20, 0x00, 0x2b, 0x0a, 0x93, 0x10, 0xd0, 0x31, - 0x6a, 0x00, 0x29, 0x0d, 0xd0, 0x5c, 0x49, 0x09, - 0x68, 0x73, 0x7e, 0x00, 0x2b, 0x07, 0xd1, 0x0e, - 0x9b, 0x00, 0x2b, 0x04, 0xd0, 0x0a, 0x9b, 0x1b, - 0x7a, 0x89, 0x7e, 0x8b, 0x42, 0x00, 0xdc, 0xb0, - 0x6a, 0x3b, 0x18, 0xb1, 0x6a, 0x00, 0x20, 0x99, - 0x42, 0x34, 0xd2, 0x0e, 0x9b, 0x00, 0x2b, 0x2e, - 0xd0, 0xf1, 0x6b, 0x01, 0xad, 0x01, 0x31, 0xf1, - 0x63, 0x4f, 0x49, 0x04, 0x96, 0x02, 0x90, 0x01, - 0x90, 0x06, 0x94, 0x07, 0x97, 0x0f, 0x68, 0x05, - 0x97, 0x70, 0x7e, 0x00, 0x28, 0x0d, 0xd0, 0x70, - 0x6c, 0x00, 0x28, 0x06, 0xd0, 0x00, 0x68, 0x01, - 0x90, 0x45, 0x60, 0x70, 0x6c, 0x02, 0x90, 0x05, - 0x60, 0x0b, 0xe0, 0x75, 0x64, 0x01, 0x95, 0x02, - 0x95, 0x07, 0xe0, 0xb8, 0x7e, 0x03, 0xab, 0x18, - 0x70, 0xf0, 0x1d, 0x3d, 0x30, 0x29, 0x1c, 0x00, - 0xf0, 0xbd, 0xfd, 0x0e, 0x9a, 0x2b, 0x1c, 0x04, - 0x21, 0x00, 0x92, 0x3e, 0x4a, 0x38, 0x1c, 0xeb, - 0xf7, 0x4b, 0xfe, 0x09, 0x9d, 0x6a, 0xe0, 0x2d, - 0x25, 0xed, 0x43, 0x67, 0xe0, 0x71, 0x6c, 0x00, - 0x29, 0x28, 0xd0, 0x31, 0x6a, 0x00, 0x29, 0x25, - 0xd1, 0xf1, 0x6b, 0x01, 0x39, 0xf1, 0x63, 0x71, - 0x6c, 0x0a, 0x68, 0x8a, 0x42, 0x01, 0xd1, 0x70, - 0x64, 0x09, 0xe0, 0x4b, 0x68, 0x53, 0x60, 0x0c, - 0xc9, 0x08, 0x39, 0x1a, 0x60, 0x72, 0x6c, 0x8a, - 0x42, 0x01, 0xd1, 0x4a, 0x68, 0x72, 0x64, 0x4a, - 0x69, 0x08, 0x62, 0x38, 0x1c, 0x23, 0x68, 0xed, - 0x09, 0x00, 0x73, 0x02, 0x01, 0x38, 0x08, 0xc2, - 0x01, 0xd0, 0x04, 0x34, 0xf9, 0xe7, 0xcf, 0x61, - 0x08, 0x69, 0x04, 0x21, 0xeb, 0xf7, 0x7f, 0xfd, - 0x00, 0x28, 0x3e, 0xd0, 0x0e, 0xf0, 0x69, 0xfd, - 0x3b, 0xe0, 0xb0, 0x6b, 0x00, 0x2a, 0x06, 0xd0, - 0x39, 0x1c, 0x22, 0x68, 0x01, 0x39, 0x04, 0xc0, - 0x26, 0xd0, 0x04, 0x34, 0xf9, 0xe7, 0x80, 0xc0, - 0x31, 0x6b, 0x81, 0x42, 0x00, 0xd8, 0xf0, 0x6a, - 0xb1, 0x6a, 0x01, 0x39, 0xb1, 0x62, 0x31, 0x6b, - 0x09, 0x1a, 0x00, 0xd5, 0x03, 0x31, 0x89, 0x10, - 0xb9, 0x42, 0x06, 0xd3, 0x39, 0x1c, 0x22, 0x68, - 0x01, 0x39, 0x04, 0xc0, 0x10, 0xd0, 0x04, 0x34, - 0xf9, 0xe7, 0x0a, 0x1c, 0x08, 0xcc, 0x01, 0x3a, - 0x03, 0x60, 0x01, 0xd0, 0x04, 0x30, 0xf9, 0xe7, - 0xf0, 0x6a, 0x79, 0x1a, 0x22, 0x68, 0x01, 0x39, - 0x04, 0xc0, 0x01, 0xd0, 0x04, 0x34, 0xf9, 0xe7, - 0x31, 0x6b, 0x81, 0x42, 0x02, 0xd8, 0xf0, 0x6a, - 0xb0, 0x63, 0x00, 0xe0, 0xb0, 0x63, 0xb0, 0x6a, - 0xc0, 0x1b, 0xb0, 0x62, 0x30, 0x6a, 0x01, 0x30, - 0x30, 0x62, 0x0e, 0xf0, 0x1e, 0xfd, 0x28, 0x1c, - 0x0f, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x00, 0x67, 0x03, 0x20, 0xe8, 0x66, - 0x03, 0x20, 0x25, 0x71, 0x02, 0x20, 0xff, 0xb5, - 0x8c, 0xb0, 0x05, 0x1c, 0x00, 0x20, 0x01, 0x90, - 0x0c, 0x1c, 0x17, 0x1c, 0x95, 0x48, 0x0e, 0xf0, - 0x0c, 0xfd, 0x29, 0x6c, 0x00, 0x20, 0x00, 0x29, - 0x27, 0xd0, 0xe9, 0x6b, 0x01, 0x39, 0xe9, 0x63, - 0x29, 0x6c, 0x0a, 0x68, 0x8a, 0x42, 0x01, 0xd1, - 0x28, 0x64, 0x09, 0xe0, 0x4b, 0x68, 0x53, 0x60, - 0x0c, 0xc9, 0x08, 0x39, 0x1a, 0x60, 0x2a, 0x6c, - 0x8a, 0x42, 0x01, 0xd1, 0x4a, 0x68, 0x2a, 0x64, - 0x4a, 0x69, 0x08, 0x62, 0x88, 0x69, 0x13, 0x68, - 0x01, 0x38, 0xed, 0x09, 0x00, 0x74, 0x02, 0x08, - 0xc4, 0x01, 0xd0, 0x04, 0x32, 0xf9, 0xe7, 0x88, - 0x69, 0x0f, 0x9b, 0x18, 0x60, 0x08, 0x69, 0x04, - 0x21, 0xeb, 0xf7, 0xff, 0xfc, 0x00, 0x28, 0x6f, - 0xd0, 0x0e, 0xf0, 0xe9, 0xfc, 0xb8, 0xe0, 0x29, - 0x6a, 0x00, 0x29, 0x6a, 0xd0, 0x2a, 0x7e, 0x69, - 0x6b, 0x00, 0x2a, 0x06, 0xd0, 0x3e, 0x1c, 0x04, - 0xc9, 0x01, 0x3e, 0x22, 0x60, 0x26, 0xd0, 0x04, - 0x34, 0xf9, 0xe7, 0x80, 0xc9, 0x2a, 0x6b, 0x8a, - 0x42, 0x00, 0xd8, 0xe9, 0x6a, 0xaa, 0x6a, 0x01, - 0x32, 0xaa, 0x62, 0x2a, 0x6b, 0x52, 0x1a, 0x00, - 0xd5, 0x03, 0x32, 0x92, 0x10, 0xba, 0x42, 0x06, - 0xd3, 0x3e, 0x1c, 0x04, 0xc9, 0x01, 0x3e, 0x22, - 0x60, 0x10, 0xd0, 0x04, 0x34, 0xf9, 0xe7, 0x13, - 0x1c, 0x0e, 0x68, 0x01, 0x3b, 0x40, 0xc4, 0x01, - 0xd0, 0x04, 0x31, 0xf9, 0xe7, 0xe9, 0x6a, 0xbe, - 0x1a, 0x04, 0xc9, 0x01, 0x3e, 0x22, 0x60, 0x01, - 0xd0, 0x04, 0x34, 0xf9, 0xe7, 0x2a, 0x6b, 0x8a, - 0x42, 0x02, 0xd8, 0xe9, 0x6a, 0x69, 0x63, 0x00, - 0xe0, 0x69, 0x63, 0xa9, 0x6a, 0xc9, 0x19, 0xa9, - 0x62, 0x29, 0x6a, 0x01, 0x39, 0x29, 0x62, 0x0f, - 0x9b, 0x1f, 0x60, 0x69, 0x6c, 0x00, 0x29, 0x73, - 0xd0, 0x2a, 0x7e, 0x00, 0x2a, 0x00, 0xd1, 0x01, - 0x26, 0x00, 0x22, 0x02, 0x92, 0x61, 0xe0, 0x2f, - 0x7e, 0x4a, 0x69, 0xa8, 0x6b, 0x00, 0x2f, 0x06, - 0xd0, 0x1e, 0x1c, 0x17, 0x68, 0x01, 0x3e, 0x80, - 0xc0, 0x27, 0xd0, 0x04, 0x32, 0xf9, 0xe7, 0x08, - 0xc0, 0x2f, 0x6b, 0x87, 0x42, 0x00, 0xd8, 0xe8, - 0x6a, 0xac, 0x6a, 0x01, 0x3c, 0xac, 0x62, 0x3f, - 0x1a, 0x00, 0xd5, 0x03, 0x37, 0xbf, 0x10, 0x9f, - 0x42, 0x08, 0xd3, 0x1e, 0x1c, 0x17, 0x68, 0x01, - 0x3e, 0x80, 0xc0, 0x12, 0xd0, 0x04, 0x32, 0xf9, - 0xe7, 0x85, 0xe0, 0x4b, 0xe0, 0xed, 0x09, 0x00, - 0x75, 0x02, 0x3c, 0x1c, 0x40, 0xca, 0x01, 0x3c, - 0x06, 0x60, 0x01, 0xd0, 0x04, 0x30, 0xf9, 0xe7, - 0xe8, 0x6a, 0xde, 0x1b, 0x17, 0x68, 0x01, 0x3e, - 0x80, 0xc0, 0x01, 0xd0, 0x04, 0x32, 0xf9, 0xe7, - 0x2a, 0x6b, 0x82, 0x42, 0x02, 0xd8, 0xe8, 0x6a, - 0xa8, 0x63, 0x00, 0xe0, 0xa8, 0x63, 0xa8, 0x6a, - 0xc0, 0x1a, 0xa8, 0x62, 0x28, 0x6a, 0x01, 0x30, - 0x28, 0x62, 0xe8, 0x6b, 0x01, 0x38, 0xe8, 0x63, - 0x08, 0x68, 0x88, 0x42, 0x02, 0xd1, 0x00, 0x20, - 0x68, 0x64, 0x09, 0xe0, 0x4a, 0x68, 0x42, 0x60, - 0x05, 0xc9, 0x08, 0x39, 0x10, 0x60, 0x68, 0x6c, - 0x88, 0x42, 0x01, 0xd1, 0x48, 0x68, 0x68, 0x64, - 0x00, 0x20, 0x08, 0x62, 0x08, 0x69, 0x04, 0x21, - 0xeb, 0xf7, 0x56, 0xfc, 0x02, 0x9a, 0x02, 0x43, - 0x02, 0x92, 0x28, 0x7e, 0x69, 0x6c, 0x00, 0x28, - 0x00, 0xd1, 0x01, 0x26, 0x00, 0x29, 0x04, 0xd0, - 0x8b, 0x69, 0xaa, 0x6a, 0x98, 0x19, 0x90, 0x42, - 0x98, 0xd9, 0x02, 0x9a, 0x00, 0x2a, 0x3d, 0xd0, - 0x0e, 0xf0, 0x30, 0xfc, 0x00, 0xe0, 0x39, 0xe0, - 0x38, 0xe0, 0x15, 0x99, 0x00, 0x29, 0x32, 0xd0, - 0xe9, 0x6b, 0x03, 0xae, 0x01, 0x31, 0xe9, 0x63, - 0x04, 0x90, 0x03, 0x90, 0x1c, 0x48, 0x06, 0x95, - 0x08, 0x94, 0x09, 0x97, 0x07, 0x68, 0x07, 0x97, - 0x68, 0x7e, 0x00, 0x28, 0x0d, 0xd0, 0x68, 0x6c, - 0x00, 0x28, 0x06, 0xd0, 0x00, 0x68, 0x03, 0x90, - 0x46, 0x60, 0x68, 0x6c, 0x04, 0x90, 0x06, 0x60, - 0x0b, 0xe0, 0x6e, 0x64, 0x03, 0x96, 0x04, 0x96, - 0x07, 0xe0, 0xb8, 0x7e, 0x05, 0xab, 0x18, 0x70, - 0xe8, 0x1d, 0x3d, 0x30, 0x31, 0x1c, 0x00, 0xf0, - 0x21, 0xfc, 0x15, 0x9a, 0x33, 0x1c, 0x04, 0x21, - 0x00, 0x92, 0x0c, 0x4a, 0x38, 0x1c, 0xeb, 0xf7, - 0xaf, 0xfc, 0x0b, 0x98, 0x0f, 0x9b, 0x01, 0x90, - 0xed, 0x09, 0x00, 0x76, 0x02, 0x0a, 0x98, 0x18, - 0x60, 0x02, 0xe0, 0x2c, 0x20, 0xc0, 0x43, 0x01, - 0x90, 0x0e, 0xf0, 0xe6, 0xfb, 0x01, 0x98, 0x10, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x00, 0x67, 0x03, 0x20, 0xe8, 0x66, 0x03, - 0x20, 0x25, 0x71, 0x02, 0x20, 0x31, 0x21, 0xc9, - 0x43, 0x01, 0x62, 0xc1, 0x68, 0xca, 0x6b, 0x01, - 0x3a, 0xca, 0x63, 0x01, 0x68, 0x81, 0x42, 0x03, - 0xd1, 0xc0, 0x68, 0x00, 0x21, 0x41, 0x64, 0x70, - 0x47, 0x42, 0x68, 0x4a, 0x60, 0x06, 0xc8, 0x08, - 0x38, 0x11, 0x60, 0xc1, 0x68, 0x4a, 0x6c, 0x82, - 0x42, 0xf5, 0xd1, 0x40, 0x68, 0x48, 0x64, 0x70, - 0x47, 0x33, 0x30, 0x34, 0x28, 0x01, 0xd2, 0x43, - 0x00, 0x9f, 0x44, 0x9b, 0xe0, 0x98, 0xe0, 0x95, - 0xe0, 0x92, 0xe0, 0x8f, 0xe0, 0x8c, 0xe0, 0x89, - 0xe0, 0x86, 0xe0, 0x83, 0xe0, 0x80, 0xe0, 0x7d, - 0xe0, 0x7a, 0xe0, 0x77, 0xe0, 0x74, 0xe0, 0x71, - 0xe0, 0x6e, 0xe0, 0x6b, 0xe0, 0x68, 0xe0, 0x65, - 0xe0, 0x62, 0xe0, 0x5f, 0xe0, 0x5c, 0xe0, 0x59, - 0xe0, 0x56, 0xe0, 0x53, 0xe0, 0x50, 0xe0, 0x4d, - 0xe0, 0x4a, 0xe0, 0x47, 0xe0, 0x44, 0xe0, 0x41, - 0xe0, 0x3e, 0xe0, 0x3b, 0xe0, 0x38, 0xe0, 0x35, - 0xe0, 0x32, 0xe0, 0x2f, 0xe0, 0x2c, 0xe0, 0x29, - 0xe0, 0x26, 0xe0, 0x23, 0xe0, 0x20, 0xe0, 0x1d, - 0xe0, 0x1a, 0xe0, 0x17, 0xe0, 0x14, 0xe0, 0x11, - 0xe0, 0x0e, 0xe0, 0x0b, 0xe0, 0x08, 0xe0, 0x05, - 0xe0, 0x02, 0xe0, 0xff, 0xe7, 0x34, 0xa0, 0x70, - 0x47, 0x36, 0xa0, 0x70, 0x47, 0x39, 0xa0, 0x70, - 0x47, 0x3d, 0xa0, 0x70, 0x47, 0x41, 0xa0, 0x70, - 0x47, 0x45, 0xa0, 0x70, 0x47, 0x49, 0xa0, 0x70, - 0x47, 0x4d, 0xa0, 0x70, 0x47, 0x51, 0xa0, 0x70, - 0x47, 0x55, 0xa0, 0x70, 0x47, 0x58, 0xa0, 0x70, - 0x47, 0x5c, 0xa0, 0xed, 0x09, 0x00, 0x77, 0x02, - 0x70, 0x47, 0x60, 0xa0, 0x70, 0x47, 0x64, 0xa0, - 0x70, 0x47, 0x69, 0xa0, 0x70, 0x47, 0x6c, 0xa0, - 0x70, 0x47, 0x70, 0xa0, 0x70, 0x47, 0x73, 0xa0, - 0x70, 0x47, 0x77, 0xa0, 0x70, 0x47, 0x7b, 0xa0, - 0x70, 0x47, 0x7f, 0xa0, 0x70, 0x47, 0x83, 0xa0, - 0x70, 0x47, 0x88, 0xa0, 0x70, 0x47, 0x8b, 0xa0, - 0x70, 0x47, 0x8f, 0xa0, 0x70, 0x47, 0x93, 0xa0, - 0x70, 0x47, 0x96, 0xa0, 0x70, 0x47, 0x9a, 0xa0, - 0x70, 0x47, 0x9e, 0xa0, 0x70, 0x47, 0xa2, 0xa0, - 0x70, 0x47, 0xa6, 0xa0, 0x70, 0x47, 0xa9, 0xa0, - 0x70, 0x47, 0xad, 0xa0, 0x70, 0x47, 0xb0, 0xa0, - 0x70, 0x47, 0xb4, 0xa0, 0x70, 0x47, 0xb7, 0xa0, - 0x70, 0x47, 0xba, 0xa0, 0x70, 0x47, 0xbd, 0xa0, - 0x70, 0x47, 0xc1, 0xa0, 0x70, 0x47, 0xc5, 0xa0, - 0x70, 0x47, 0xc8, 0xa0, 0x70, 0x47, 0xcb, 0xa0, - 0x70, 0x47, 0xce, 0xa0, 0x70, 0x47, 0xd1, 0xa0, - 0x70, 0x47, 0xd4, 0xa0, 0x70, 0x47, 0xd8, 0xa0, - 0x70, 0x47, 0xdb, 0xa0, 0x70, 0x47, 0xde, 0xa0, - 0x70, 0x47, 0xe1, 0xa0, 0x70, 0x47, 0xe6, 0xa0, - 0x70, 0x47, 0xea, 0xa0, 0x70, 0x47, 0xec, 0xa0, - 0x70, 0x47, 0xef, 0xa0, 0x70, 0x47, 0x4e, 0x55, - 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, - 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x45, 0x4e, 0x44, - 0x5f, 0x4f, 0x46, 0x5f, 0x4c, 0x4f, 0x47, 0x00, - 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x47, 0x52, 0x4f, - 0x55, 0x50, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, - 0x45, 0x44, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x00, - 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44, 0x52, 0x49, - 0x56, 0x45, 0x52, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x78, 0x02, 0x4e, 0x55, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, - 0x41, 0x42, 0x4c, 0x45, 0x00, 0x00, 0x00, 0x4e, - 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x00, - 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x55, - 0x4e, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x4e, - 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x48, 0x49, - 0x53, 0x52, 0x00, 0x4e, 0x55, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, - 0x49, 0x4c, 0x42, 0x4f, 0x58, 0x00, 0x00, 0x4e, - 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, - 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x45, - 0x53, 0x53, 0x41, 0x47, 0x45, 0x00, 0x00, 0x4e, - 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x4e, - 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x50, 0x49, 0x50, 0x45, 0x00, 0x4e, - 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x45, - 0x52, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x4f, - 0x4f, 0x4c, 0x00, 0x4e, 0x55, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x52, - 0x45, 0x45, 0x4d, 0x50, 0x54, 0x00, 0x00, 0x4e, - 0x55, 0xed, 0x09, 0x00, 0x79, 0x02, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, - 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x00, - 0x4e, 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, - 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, - 0x45, 0x53, 0x55, 0x4d, 0x45, 0x00, 0x00, 0x00, - 0x4e, 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x53, 0x45, 0x4d, 0x41, 0x50, - 0x48, 0x4f, 0x52, 0x45, 0x00, 0x00, 0x00, 0x00, - 0x4e, 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x00, - 0x4e, 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, - 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x00, 0x00, - 0x4e, 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x00, - 0x4e, 0x55, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x56, - 0x45, 0x43, 0x54, 0x4f, 0x52, 0x00, 0x00, 0x00, - 0x4e, 0x55, 0x5f, 0x4d, 0x41, 0x49, 0x4c, 0x42, - 0x4f, 0x58, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, - 0x45, 0x44, 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x4d, - 0x41, 0x49, 0x4c, 0x42, 0x4f, 0x58, 0x5f, 0x45, - 0x4d, 0x50, 0x54, 0x59, 0x00, 0x00, 0x00, 0x00, - 0x4e, 0x55, 0x5f, 0x4d, 0x41, 0x49, 0x4c, 0x42, - 0x4f, 0x58, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x00, - 0x4e, 0x55, 0x5f, 0x4d, 0xed, 0x09, 0x00, 0x7a, - 0x02, 0x41, 0x49, 0x4c, 0x42, 0x4f, 0x58, 0x5f, - 0x52, 0x45, 0x53, 0x45, 0x54, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x4e, 0x4f, 0x5f, 0x4d, - 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x4e, 0x4f, 0x5f, 0x4d, - 0x4f, 0x52, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x52, - 0x53, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, - 0x4e, 0x4f, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x4e, 0x55, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x41, - 0x42, 0x4c, 0x45, 0x44, 0x00, 0x4e, 0x55, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x53, - 0x45, 0x4e, 0x54, 0x00, 0x00, 0x4e, 0x55, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x47, 0x49, - 0x53, 0x54, 0x45, 0x52, 0x45, 0x44, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, - 0x45, 0x44, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, - 0x50, 0x49, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x4c, - 0x45, 0x54, 0x45, 0x44, 0x00, 0x4e, 0x55, 0x5f, - 0x50, 0x49, 0x50, 0x45, 0x5f, 0x45, 0x4d, 0x50, - 0x54, 0x59, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, - 0x50, 0x49, 0x50, 0x45, 0x5f, 0x46, 0x55, 0x4c, - 0x4c, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, - 0x50, 0x49, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, - 0x45, 0x54, 0x00, 0x00, 0x00, 0x4e, 0x55, 0x5f, - 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x44, 0x45, 0x4c, - 0x45, 0x54, 0x45, 0x44, 0x00, 0x4e, 0x55, 0x5f, - 0x51, 0x55, 0x45, 0x55, 0x45, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x00, 0x00, 0x00, - 0x00, 0x4e, 0x55, 0x5f, 0x51, 0x55, 0x45, 0x55, - 0x45, 0x5f, 0x45, 0x4d, 0x50, 0x54, 0x59, 0xed, - 0x09, 0x00, 0x7b, 0x02, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x5f, 0x46, - 0x55, 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x5f, 0x52, - 0x45, 0x53, 0x45, 0x54, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x53, 0x45, 0x4d, 0x41, 0x50, 0x48, 0x4f, - 0x52, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, - 0x45, 0x44, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x53, 0x45, 0x4d, 0x41, 0x50, 0x48, 0x4f, - 0x52, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, - 0x00, 0x00, 0x4e, 0x55, 0x5f, 0x54, 0x49, 0x4d, - 0x45, 0x4f, 0x55, 0x54, 0x00, 0x00, 0x4e, 0x55, - 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, - 0x41, 0x42, 0x4c, 0x45, 0x00, 0x00, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x00, 0x00, 0x90, 0xb5, - 0x00, 0x24, 0xc4, 0x60, 0x07, 0x1c, 0x00, 0x20, - 0x0a, 0x5c, 0x3b, 0x18, 0x01, 0x30, 0x08, 0x28, - 0x1a, 0x74, 0xf9, 0xdb, 0xbc, 0x61, 0x3c, 0x62, - 0xfc, 0x61, 0x3c, 0x60, 0x7c, 0x60, 0x0e, 0x48, - 0x0e, 0xf0, 0x27, 0xf9, 0x0e, 0x48, 0xf8, 0x60, - 0x0e, 0x48, 0x01, 0x68, 0x00, 0x29, 0x06, 0xd0, - 0x09, 0x68, 0x39, 0x60, 0x4f, 0x60, 0x00, 0x68, - 0x78, 0x60, 0x07, 0x60, 0x02, 0xe0, 0x07, 0x60, - 0x3f, 0x60, 0x7f, 0x60, 0x08, 0x48, 0x01, 0x68, - 0x01, 0x31, 0x01, 0x60, 0x0e, 0xf0, 0x0d, 0xf9, - 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x84, 0x67, 0x03, 0x20, 0x54, 0x4e, - 0x56, 0x45, 0x7c, 0x67, 0x03, 0x20, 0x80, 0x67, - 0x03, 0x20, 0xf0, 0xb5, 0x24, 0x4e, 0x07, 0x1c, - 0x30, 0x1c, 0x0e, 0xf0, 0xfe, 0xf8, 0x00, 0x21, - 0xf9, 0x60, 0x0e, 0xf0, 0xf6, 0xf8, 0x20, 0x48, - 0x0e, 0xf0, 0xed, 0x09, 0x00, 0x7c, 0x02, 0xf7, - 0xf8, 0x39, 0x68, 0x1f, 0x48, 0xb9, 0x42, 0x02, - 0xd1, 0x00, 0x21, 0x01, 0x60, 0x09, 0xe0, 0x7a, - 0x68, 0x4a, 0x60, 0x06, 0xcf, 0x08, 0x3f, 0x11, - 0x60, 0x01, 0x68, 0x8f, 0x42, 0x01, 0xd1, 0x79, - 0x68, 0x01, 0x60, 0x18, 0x48, 0x00, 0x25, 0x01, - 0x68, 0x01, 0x39, 0x01, 0x60, 0x3c, 0x6a, 0x00, - 0x2c, 0x1d, 0xd0, 0x11, 0x48, 0x0e, 0xf0, 0xdb, - 0xf8, 0x01, 0x20, 0xc0, 0x43, 0xe0, 0x61, 0xa0, - 0x69, 0x66, 0x68, 0x07, 0x21, 0xeb, 0xf7, 0xed, - 0xf8, 0x05, 0x43, 0x38, 0x6a, 0xb0, 0x42, 0x01, - 0xd1, 0x00, 0x24, 0x00, 0xe0, 0x34, 0x1c, 0x09, - 0x48, 0x0e, 0xf0, 0xd9, 0xf8, 0x07, 0x48, 0x0e, - 0xf0, 0xd2, 0xf8, 0x00, 0x2c, 0xe5, 0xd1, 0x00, - 0x2d, 0x01, 0xd0, 0x0e, 0xf0, 0xc8, 0xf8, 0x0e, - 0xf0, 0xba, 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x00, 0x67, 0x03, 0x20, 0x84, - 0x67, 0x03, 0x20, 0x7c, 0x67, 0x03, 0x20, 0x80, - 0x67, 0x03, 0x20, 0xf0, 0xb5, 0x82, 0xb0, 0x04, - 0x1c, 0x15, 0x1c, 0x0f, 0x1c, 0x2d, 0x48, 0x0e, - 0xf0, 0xaa, 0xf8, 0xa8, 0x08, 0x03, 0xd3, 0xa0, - 0x69, 0x38, 0x40, 0xa0, 0x61, 0x02, 0xe0, 0xa0, - 0x69, 0x38, 0x43, 0xa0, 0x61, 0x27, 0x6a, 0x00, - 0x2f, 0x43, 0xd0, 0x00, 0x21, 0x01, 0x91, 0x3e, - 0x68, 0x00, 0x91, 0xa0, 0x69, 0x39, 0x69, 0x3a, - 0x7d, 0x08, 0x40, 0x92, 0x08, 0x04, 0xd3, 0x01, - 0x22, 0x81, 0x42, 0x00, 0xd0, 0x00, 0x22, 0x10, - 0x1c, 0x7d, 0x68, 0x00, 0x28, 0x24, 0xd0, 0xe0, - 0x69, 0x01, 0x38, 0xe0, 0x61, 0x38, 0x7d, 0x40, - 0x08, 0x03, 0xd3, 0x38, 0x69, 0x01, 0x99, 0x01, - 0x43, 0x01, 0x91, 0x38, 0x68, 0xb8, 0x42, 0x02, - 0xd1, 0x00, 0x20, 0x20, 0x62, 0x09, 0xe0, 0x79, - 0x68, 0x41, 0x60, 0x03, 0xcf, 0xed, 0x09, 0x00, - 0x7d, 0x02, 0x08, 0x3f, 0x08, 0x60, 0x20, 0x6a, - 0xb8, 0x42, 0x01, 0xd1, 0x78, 0x68, 0x20, 0x62, - 0x00, 0x20, 0xf8, 0x61, 0xa0, 0x69, 0x07, 0x21, - 0x38, 0x62, 0xb8, 0x69, 0xeb, 0xf7, 0x84, 0xf8, - 0x00, 0x99, 0x01, 0x43, 0x00, 0x91, 0xb7, 0x42, - 0x01, 0xd0, 0x2f, 0x1c, 0xc8, 0xd1, 0xa0, 0x69, - 0x01, 0x99, 0x88, 0x43, 0xa0, 0x61, 0x00, 0x99, - 0x00, 0x29, 0x01, 0xd0, 0x0e, 0xf0, 0x62, 0xf8, - 0x0e, 0xf0, 0x54, 0xf8, 0x02, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, - 0x00, 0x67, 0x03, 0x20, 0xff, 0xb5, 0x8a, 0xb0, - 0x00, 0x27, 0x0c, 0x1c, 0x15, 0x1c, 0x06, 0x1c, - 0x26, 0x48, 0x0e, 0xf0, 0x47, 0xf8, 0xb1, 0x69, - 0x08, 0x1c, 0x20, 0x40, 0xaa, 0x08, 0x04, 0xd3, - 0x01, 0x22, 0xa0, 0x42, 0x00, 0xd0, 0x00, 0x22, - 0x10, 0x1c, 0x00, 0x28, 0x07, 0xd0, 0x0d, 0x9b, - 0x68, 0x08, 0x19, 0x60, 0x32, 0xd3, 0xb0, 0x69, - 0xa0, 0x43, 0xb0, 0x61, 0x2e, 0xe0, 0x13, 0x98, - 0x00, 0x21, 0x00, 0x28, 0x26, 0xd0, 0xf0, 0x69, - 0x06, 0xab, 0x01, 0x30, 0xf0, 0x61, 0x02, 0x91, - 0x01, 0x91, 0x17, 0x49, 0x04, 0x96, 0x09, 0x68, - 0x05, 0x94, 0x07, 0x91, 0x1d, 0x70, 0x32, 0x6a, - 0x01, 0xa8, 0x00, 0x2a, 0x06, 0xd0, 0x12, 0x68, - 0x01, 0x92, 0x50, 0x60, 0x32, 0x6a, 0x02, 0x92, - 0x10, 0x60, 0x02, 0xe0, 0x30, 0x62, 0x01, 0x90, - 0x02, 0x90, 0x13, 0x9a, 0x03, 0x1c, 0x08, 0x1c, - 0x00, 0x92, 0x0c, 0x4a, 0x07, 0x21, 0xeb, 0xf7, - 0xc7, 0xf8, 0x09, 0x98, 0x0d, 0x9b, 0x08, 0x9f, - 0x18, 0x60, 0x03, 0xe0, 0x0d, 0x9b, 0x23, 0x27, - 0xff, 0x43, 0x19, 0x60, 0x0d, 0xf0, 0xfe, 0xff, - 0x38, 0x1c, 0x0e, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x67, 0x03, 0x20, - 0xed, 0x09, 0x00, 0x7e, 0x02, 0xe8, 0x66, 0x03, - 0x20, 0xf5, 0x78, 0x02, 0x20, 0x31, 0x21, 0xc9, - 0x43, 0xc1, 0x61, 0xc1, 0x68, 0xca, 0x69, 0x01, - 0x3a, 0xca, 0x61, 0x01, 0x68, 0x81, 0x42, 0x03, - 0xd1, 0xc0, 0x68, 0x00, 0x21, 0x01, 0x62, 0x70, - 0x47, 0x42, 0x68, 0x4a, 0x60, 0x06, 0xc8, 0x08, - 0x38, 0x11, 0x60, 0xc1, 0x68, 0x0a, 0x6a, 0x82, - 0x42, 0xf5, 0xd1, 0x40, 0x68, 0x08, 0x62, 0x70, - 0x47, 0x90, 0xb4, 0x03, 0x68, 0x00, 0x2b, 0x15, - 0xd0, 0x1c, 0x7a, 0x0f, 0x7a, 0x1a, 0x1c, 0xbc, - 0x42, 0x01, 0xdd, 0x01, 0x60, 0x07, 0xe0, 0x52, - 0x68, 0x00, 0xe0, 0x52, 0x68, 0x10, 0x7a, 0xb8, - 0x42, 0x01, 0xdc, 0x9a, 0x42, 0xf9, 0xd1, 0x10, - 0x68, 0x08, 0x60, 0x41, 0x60, 0x4a, 0x60, 0x11, - 0x60, 0x90, 0xbc, 0x70, 0x47, 0x01, 0x60, 0x09, - 0x60, 0x49, 0x60, 0xf9, 0xe7, 0xf0, 0xb5, 0x06, - 0x1c, 0x13, 0x48, 0x00, 0x24, 0x00, 0x69, 0x0d, - 0x1c, 0x00, 0x28, 0x1c, 0xd1, 0xd9, 0xf7, 0xed, - 0xf8, 0x07, 0x1c, 0x02, 0xd1, 0xff, 0x24, 0x01, - 0x34, 0x15, 0xe0, 0x16, 0x20, 0x38, 0x60, 0x3d, - 0x61, 0xf8, 0x1d, 0x05, 0x30, 0xfe, 0x60, 0x0b, - 0xa3, 0x1a, 0x68, 0x30, 0x1c, 0x29, 0x1c, 0x5b, - 0x68, 0xe9, 0xf7, 0xf2, 0xf8, 0x09, 0x49, 0x00, - 0x28, 0x01, 0xd0, 0x01, 0x20, 0x08, 0x60, 0x0b, - 0x20, 0x39, 0x1c, 0xd9, 0xf7, 0x41, 0xf9, 0x20, - 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x18, 0xec, 0x03, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x03, - 0x20, 0x00, 0xb5, 0x02, 0x1c, 0x03, 0xa1, 0x08, - 0x68, 0x49, 0x68, 0xff, 0xf7, 0xc7, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x05, - 0x48, 0x40, 0x6f, 0xed, 0x09, 0x00, 0x7f, 0x02, - 0x00, 0xe0, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, - 0x82, 0x6a, 0x8a, 0x42, 0xf9, 0xd1, 0x70, 0x47, - 0x00, 0x00, 0x18, 0xeb, 0x03, 0x20, 0x0a, 0x68, - 0x00, 0x2a, 0x02, 0xd0, 0x4b, 0x68, 0x53, 0x60, - 0x01, 0xe0, 0x4a, 0x68, 0x42, 0x60, 0x4a, 0x68, - 0x00, 0x2a, 0x02, 0xd0, 0x08, 0x68, 0x10, 0x60, - 0x70, 0x47, 0x09, 0x68, 0x01, 0x60, 0x70, 0x47, - 0xff, 0xb5, 0x83, 0xb0, 0x04, 0x1c, 0x00, 0x26, - 0x0f, 0x1c, 0xf1, 0x43, 0x2a, 0x48, 0x0d, 0xf0, - 0xdc, 0xfb, 0x29, 0x4a, 0x2a, 0xa1, 0x02, 0x92, - 0xd0, 0x68, 0xd1, 0x61, 0x02, 0x9a, 0x01, 0x30, - 0xd0, 0x60, 0x25, 0x68, 0x00, 0x2d, 0x41, 0xd0, - 0x28, 0x69, 0x69, 0x69, 0x3a, 0x69, 0x01, 0x92, - 0x7b, 0x69, 0x00, 0x93, 0xe9, 0xf7, 0xfb, 0xf8, - 0x00, 0x28, 0x06, 0xd0, 0x6f, 0x60, 0x00, 0x20, - 0x3d, 0x60, 0x78, 0x60, 0x27, 0x60, 0x02, 0x26, - 0x1d, 0xe0, 0x28, 0x69, 0x69, 0x69, 0x01, 0x9a, - 0x00, 0x9b, 0xe9, 0xf7, 0xf8, 0xf8, 0x00, 0x28, - 0x0b, 0xd0, 0x28, 0x68, 0x00, 0x28, 0x02, 0xd0, - 0x05, 0x1c, 0xf2, 0xd1, 0x0b, 0xe0, 0x2f, 0x60, - 0x7d, 0x60, 0x00, 0x20, 0x38, 0x60, 0x67, 0x60, - 0x05, 0xe0, 0x68, 0x68, 0x07, 0x60, 0x68, 0x68, - 0x78, 0x60, 0x6f, 0x60, 0x3d, 0x60, 0x00, 0x2e, - 0x09, 0xd0, 0x02, 0x2e, 0x02, 0xd1, 0x12, 0xa0, - 0xff, 0xf7, 0x8d, 0xff, 0x16, 0xa2, 0x05, 0x98, - 0x06, 0x99, 0xff, 0xf7, 0x56, 0xff, 0x02, 0x9a, - 0xd0, 0x68, 0x01, 0x38, 0xd0, 0x60, 0x05, 0x48, - 0x0d, 0xf0, 0xdf, 0xfb, 0x07, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x27, 0x60, 0x67, 0x60, - 0x01, 0x26, 0xeb, 0xe7, 0x00, 0x00, 0x1c, 0xe4, - 0x03, 0x20, 0x18, 0xec, 0x03, 0x20, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x74, 0x69, 0xed, 0x09, - 0x00, 0x80, 0x02, 0x6d, 0x65, 0x72, 0x2e, 0x63, - 0x3a, 0x20, 0x32, 0x31, 0x30, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x74, 0x69, 0x6d, - 0x65, 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x34, - 0x36, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x63, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x63, - 0x3a, 0x20, 0x32, 0x34, 0x38, 0x00, 0x00, 0xf3, - 0xb5, 0x0f, 0x1c, 0x00, 0x21, 0xc9, 0x43, 0x40, - 0x48, 0x0d, 0xf0, 0x61, 0xfb, 0x40, 0x48, 0x40, - 0xa2, 0xc5, 0x1d, 0xf9, 0x35, 0xe9, 0x68, 0xea, - 0x61, 0x4e, 0x1c, 0xee, 0x60, 0x44, 0x6f, 0x00, - 0x2c, 0x66, 0xd0, 0x20, 0x69, 0x61, 0x69, 0x00, - 0x9a, 0x3b, 0x1c, 0xe9, 0xf7, 0x8e, 0xf8, 0x00, - 0x28, 0x5f, 0xd0, 0x3c, 0x48, 0x00, 0x27, 0x01, - 0x68, 0x00, 0x29, 0x00, 0xd0, 0x07, 0x60, 0x3a, - 0x48, 0x21, 0x1c, 0x06, 0x1c, 0xff, 0xf7, 0x4d, - 0xff, 0x31, 0x48, 0x40, 0x6f, 0x00, 0x28, 0x06, - 0xd0, 0xc1, 0x1d, 0x09, 0x31, 0x08, 0x68, 0x49, - 0x68, 0x35, 0xa2, 0xff, 0xf7, 0xf4, 0xfe, 0xe8, - 0x68, 0x01, 0x38, 0xe8, 0x60, 0x29, 0x48, 0x0d, - 0xf0, 0x7e, 0xfb, 0x20, 0x6a, 0x00, 0x28, 0x04, - 0xd0, 0x01, 0x23, 0xd8, 0x42, 0x01, 0xd0, 0x01, - 0x38, 0x20, 0x62, 0x63, 0x6a, 0x00, 0x2b, 0x04, - 0xd0, 0xa0, 0x68, 0xe1, 0x68, 0x22, 0x6a, 0xd8, - 0xf7, 0x1d, 0xfc, 0x20, 0x6a, 0x00, 0x28, 0x0e, - 0xd0, 0xdc, 0xf7, 0x03, 0xfa, 0xa2, 0x69, 0xe3, - 0x69, 0x82, 0x18, 0x59, 0x41, 0x0b, 0x1c, 0x30, - 0x1c, 0x21, 0x1c, 0xff, 0xf7, 0x2f, 0xff, 0x02, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x16, - 0x4e, 0x00, 0x21, 0xc9, 0x43, 0x30, 0x1c, 0x0d, - 0xf0, 0x0a, 0xfb, 0xe9, 0x68, 0x14, 0x48, 0x01, - 0x31, 0xe9, 0x60, 0xc1, 0x1d, 0x1f, 0xa2, 0xea, - 0x61, 0xed, 0x09, 0x00, 0x81, 0x02, 0x79, 0x31, - 0x4b, 0x68, 0xca, 0x68, 0x9b, 0x00, 0xd4, 0x50, - 0x84, 0x30, 0x02, 0x68, 0x01, 0x32, 0x02, 0x60, - 0x08, 0x68, 0x82, 0x42, 0x00, 0xd1, 0x4f, 0x60, - 0xe8, 0x68, 0x01, 0x38, 0xe8, 0x60, 0x30, 0x1c, - 0x0d, 0xf0, 0x3c, 0xfb, 0xda, 0xe7, 0x05, 0xe0, - 0x70, 0x1e, 0xe8, 0x60, 0x04, 0x48, 0x0d, 0xf0, - 0x35, 0xfb, 0xd3, 0xe7, 0x70, 0x1e, 0xe8, 0x60, - 0x01, 0x48, 0x0d, 0xf0, 0x2f, 0xfb, 0xcd, 0xe7, - 0x1c, 0xe4, 0x03, 0x20, 0x18, 0xeb, 0x03, 0x20, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x74, 0x69, - 0x6d, 0x65, 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x32, - 0x36, 0x33, 0x00, 0x00, 0x00, 0x6d, 0x03, 0x20, - 0x8c, 0xeb, 0x03, 0x20, 0x73, 0x72, 0x63, 0x5c, - 0x6c, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, - 0x63, 0x3a, 0x20, 0x32, 0x38, 0x32, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x74, 0x69, - 0x6d, 0x65, 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x33, - 0x30, 0x31, 0x00, 0x00, 0xff, 0xb5, 0x00, 0x27, - 0xf9, 0x43, 0x0b, 0x9c, 0x0a, 0x9d, 0x09, 0x9e, - 0x21, 0x48, 0x0d, 0xf0, 0xb3, 0xfa, 0x21, 0x4b, - 0x21, 0xa2, 0xd9, 0x1d, 0xf9, 0x31, 0xc8, 0x68, - 0x01, 0x30, 0xc8, 0x60, 0xd8, 0x1d, 0x79, 0x30, - 0xca, 0x61, 0x82, 0x68, 0x43, 0x68, 0x93, 0x42, - 0x27, 0xd0, 0xc7, 0x68, 0x92, 0x00, 0xbf, 0x58, - 0xc2, 0x1d, 0x01, 0x32, 0x13, 0x68, 0x01, 0x33, - 0x13, 0x60, 0x02, 0x68, 0x93, 0x42, 0x01, 0xd1, - 0x00, 0x22, 0x82, 0x60, 0x01, 0x9a, 0x7a, 0x61, - 0x00, 0x9a, 0x3a, 0x61, 0x03, 0x9b, 0xfb, 0x61, - 0x02, 0x9a, 0xba, 0x61, 0xbc, 0x60, 0x0c, 0x98, - 0x00, 0x22, 0xf8, 0x60, 0x3e, 0x62, 0x3a, 0x60, - 0x7a, 0x60, 0x0c, 0x48, 0x7d, 0x62, 0xc3, 0x6f, - 0x5a, 0x1c, 0xc2, 0x67, 0xed, 0x09, 0x00, 0x82, - 0x02, 0xbb, 0x62, 0x00, 0x2b, 0x03, 0xd1, 0xc3, - 0x6f, 0x5a, 0x1c, 0xc2, 0x67, 0xbb, 0x62, 0xc8, - 0x68, 0x01, 0x38, 0xc8, 0x60, 0x03, 0x48, 0x0d, - 0xf0, 0xc3, 0xfa, 0x38, 0x1c, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x1c, 0xe4, 0x03, - 0x20, 0x18, 0xeb, 0x03, 0x20, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x72, - 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x32, 0x35, 0x00, - 0x00, 0xff, 0xb5, 0x86, 0xb0, 0x1f, 0x1c, 0x00, - 0x2a, 0x11, 0x9c, 0x10, 0x9d, 0x0f, 0x9e, 0x0e, - 0xd0, 0x06, 0xa9, 0x0c, 0xc9, 0x04, 0xa8, 0x0c, - 0xc0, 0xdc, 0xf7, 0x3c, 0xf9, 0x06, 0x9a, 0x02, - 0x90, 0x80, 0x18, 0x07, 0x9b, 0x03, 0x91, 0x59, - 0x41, 0x07, 0x91, 0x06, 0x90, 0x16, 0xe0, 0xdc, - 0xf7, 0x31, 0xf9, 0x04, 0x90, 0x05, 0x91, 0x06, - 0x9a, 0x07, 0x9b, 0xe8, 0xf7, 0x8f, 0xff, 0x00, - 0x28, 0x04, 0xd0, 0x13, 0xa1, 0x0c, 0xc9, 0x04, - 0xa8, 0x0c, 0xc0, 0x07, 0xe0, 0x06, 0x98, 0x04, - 0x9a, 0x07, 0x99, 0x05, 0x9b, 0x80, 0x1a, 0x99, - 0x41, 0x05, 0x91, 0x04, 0x90, 0x03, 0x94, 0x02, - 0x95, 0x01, 0x96, 0x00, 0x97, 0x06, 0x98, 0x07, - 0x99, 0x04, 0x9a, 0x05, 0x9b, 0xff, 0xf7, 0x70, - 0xff, 0x07, 0x1c, 0x05, 0xd0, 0x08, 0x48, 0x06, - 0x9a, 0x07, 0x9b, 0x39, 0x1c, 0xff, 0xf7, 0x3f, - 0xfe, 0x00, 0x20, 0x00, 0x2f, 0x00, 0xd0, 0xb8, - 0x6a, 0x0a, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x8c, 0xeb, 0x03, 0x20, 0xf0, 0xb5, 0x82, - 0xb0, 0x00, 0x24, 0x07, 0x1c, 0x28, 0x4e, 0xe1, - 0x43, 0x30, 0x1c, 0x0d, 0xf0, 0x0d, 0xfa, 0x27, - 0x4a, 0x27, 0xa1, 0xd5, 0x1d, 0xf9, 0x35, 0xe8, - 0x68, 0x01, 0x30, 0xe8, 0x60, 0xe9, 0x61, 0xed, - 0x09, 0x00, 0x83, 0x02, 0x38, 0x1c, 0xff, 0xf7, - 0xfe, 0xfd, 0x07, 0x1c, 0x31, 0xd0, 0x39, 0x68, - 0x68, 0x46, 0x00, 0x29, 0x01, 0xd0, 0x10, 0x31, - 0x00, 0xe0, 0x23, 0xa1, 0x0c, 0xc9, 0x0c, 0xc0, - 0x24, 0x48, 0x39, 0x1c, 0xff, 0xf7, 0xfd, 0xfd, - 0x78, 0x68, 0x00, 0x28, 0x0a, 0xd1, 0x21, 0xa0, - 0xff, 0xf7, 0xdb, 0xfd, 0x38, 0x68, 0x00, 0x28, - 0x04, 0xd0, 0x23, 0xa2, 0x00, 0x98, 0x01, 0x99, - 0xff, 0xf7, 0xa1, 0xfd, 0x13, 0x49, 0xc8, 0x1d, - 0x79, 0x30, 0x43, 0x68, 0xc2, 0x68, 0x9b, 0x00, - 0xd7, 0x50, 0x84, 0x31, 0x0a, 0x68, 0x01, 0x32, - 0x0a, 0x60, 0x01, 0x68, 0x8a, 0x42, 0x01, 0xd1, - 0x00, 0x21, 0x41, 0x60, 0xe8, 0x68, 0x01, 0x38, - 0xe8, 0x60, 0x30, 0x1c, 0x0d, 0xf0, 0x1b, 0xfa, - 0x07, 0xe0, 0xe8, 0x68, 0x01, 0x38, 0xe8, 0x60, - 0x30, 0x1c, 0x0d, 0xf0, 0x14, 0xfa, 0xff, 0x24, - 0x05, 0x34, 0x20, 0x1c, 0x02, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x1c, 0xe4, - 0x03, 0x20, 0x18, 0xeb, 0x03, 0x20, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x74, 0x69, 0x6d, 0x65, - 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x38, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x8c, 0xeb, 0x03, 0x20, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x63, 0x74, 0x69, 0x6d, 0x65, - 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x39, 0x32, - 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, - 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x63, 0x3a, - 0x20, 0x33, 0x39, 0x35, 0x00, 0x00, 0x00, 0xb5, - 0xff, 0xf7, 0x7f, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0xf0, 0xb5, 0x00, 0x27, 0x06, 0x23, 0x01, 0x22, - 0x1c, 0x48, 0x1c, 0xa1, 0x0d, 0xf0, 0xfd, 0xf8, - 0xff, 0x20, 0x95, 0x30, 0x1c, 0xa1, 0x00, 0xf0, - 0xc0, 0xf8, 0xed, 0x09, 0x00, 0x84, 0x02, 0x1f, - 0x49, 0xcc, 0x1d, 0x79, 0x34, 0xe0, 0x60, 0x00, - 0x28, 0x01, 0xd1, 0x07, 0x27, 0x23, 0xe0, 0x00, - 0x26, 0x66, 0x60, 0x64, 0x25, 0x65, 0x20, 0xa6, - 0x60, 0x20, 0x60, 0x19, 0x48, 0x1a, 0xa1, 0x00, - 0xf0, 0xae, 0xf8, 0x1d, 0x49, 0x00, 0x28, 0x48, - 0x60, 0x01, 0xd1, 0x07, 0x27, 0x13, 0xe0, 0x1b, - 0x49, 0x0b, 0xe0, 0x63, 0x68, 0xe2, 0x68, 0x9b, - 0x00, 0xd0, 0x50, 0x0a, 0x68, 0x01, 0x32, 0x0a, - 0x60, 0x23, 0x68, 0x9a, 0x42, 0x00, 0xd1, 0x66, - 0x60, 0x2c, 0x30, 0x2a, 0x1c, 0x01, 0x3d, 0x00, - 0x2a, 0x01, 0xd0, 0x00, 0x2f, 0xed, 0xd0, 0x38, - 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x1c, - 0xe4, 0x03, 0x20, 0x53, 0x5f, 0x54, 0x49, 0x4d, - 0x45, 0x52, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x63, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x63, - 0x3a, 0x20, 0x34, 0x33, 0x32, 0x00, 0x00, 0x18, - 0xeb, 0x03, 0x20, 0x30, 0x11, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x74, 0x69, 0x6d, - 0x65, 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x34, 0x34, - 0x34, 0x00, 0x00, 0x00, 0x6d, 0x03, 0x20, 0x9c, - 0xeb, 0x03, 0x20, 0xf0, 0xb5, 0x24, 0x4e, 0x00, - 0x21, 0xc9, 0x43, 0x30, 0x1c, 0x0d, 0xf0, 0x2d, - 0xf9, 0x22, 0x4c, 0x22, 0xa1, 0xe7, 0x1d, 0xf9, - 0x37, 0xf8, 0x68, 0x01, 0x30, 0xf8, 0x60, 0xf9, - 0x61, 0x61, 0x6f, 0x00, 0x29, 0x07, 0xd0, 0xe5, - 0x1d, 0x6d, 0x35, 0x28, 0x1c, 0xff, 0xf7, 0x27, - 0xfd, 0x61, 0x6f, 0x00, 0x29, 0xf9, 0xd1, 0xf8, - 0x68, 0x01, 0x38, 0xf8, 0x60, 0x30, 0x1c, 0x0d, - 0xf0, 0x60, 0xf9, 0x30, 0x1c, 0x0d, 0xf0, 0xbf, - 0xf8, 0xe7, 0x1d, 0x79, 0x37, 0x39, 0x1d, 0x03, - 0xc9, 0x00, 0x25, 0x88, 0x42, 0x0c, 0xd0, 0xe0, - 0x1d, 0x81, 0x30, 0x01, 0x68, 0xed, 0x09, 0x00, - 0x85, 0x02, 0x01, 0x31, 0x01, 0x60, 0x3a, 0x68, - 0x91, 0x42, 0x00, 0xd1, 0xbd, 0x60, 0x3a, 0x1d, - 0x06, 0xca, 0x91, 0x42, 0xf4, 0xd1, 0x10, 0x4c, - 0x60, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x0f, 0xa1, - 0x00, 0xf0, 0x36, 0xf8, 0x65, 0x60, 0xf8, 0x68, - 0x00, 0x28, 0x03, 0xd0, 0x10, 0xa1, 0x00, 0xf0, - 0x2f, 0xf8, 0xfd, 0x60, 0x28, 0x1c, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x1c, 0xe4, 0x03, 0x20, - 0x18, 0xeb, 0x03, 0x20, 0x73, 0x72, 0x63, 0x5c, - 0x6c, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, - 0x63, 0x3a, 0x20, 0x34, 0x36, 0x33, 0x00, 0x00, - 0x00, 0x6d, 0x03, 0x20, 0x73, 0x72, 0x63, 0x5c, - 0x6c, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, - 0x63, 0x3a, 0x20, 0x34, 0x37, 0x37, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x63, 0x74, 0x69, - 0x6d, 0x65, 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x34, - 0x38, 0x31, 0x00, 0x00, 0x00, 0xb5, 0x01, 0x21, - 0xfd, 0xf7, 0x48, 0xfd, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0xfd, 0xf7, 0x5d, 0xfd, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0x07, 0x1c, 0xc0, 0x69, - 0x00, 0x24, 0x00, 0x28, 0x03, 0xd0, 0xd8, 0xf7, - 0x61, 0xfd, 0xfc, 0x61, 0xbc, 0x61, 0x78, 0x6a, - 0x00, 0x28, 0x03, 0xd0, 0xd8, 0xf7, 0x5a, 0xfd, - 0x7c, 0x62, 0x3c, 0x62, 0xf8, 0x6a, 0x00, 0x28, - 0x03, 0xd0, 0xd8, 0xf7, 0x53, 0xfd, 0xfc, 0x62, - 0xbc, 0x62, 0x38, 0x6b, 0x00, 0x28, 0x02, 0xd0, - 0xd8, 0xf7, 0x4c, 0xfd, 0x3c, 0x63, 0x38, 0x1c, - 0xd8, 0xf7, 0xae, 0xfd, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x0e, 0x01, 0xd3, - 0x13, 0x20, 0x70, 0x47, 0x2c, 0x20, 0x70, 0x47, - 0xb0, 0xb5, 0x00, 0x24, 0x00, 0x27, 0xd8, 0xf7, - 0x7e, 0xfd, 0x00, 0x28, 0x06, 0xd0, 0x44, 0x65, - 0xed, 0x09, 0x00, 0x86, 0x02, 0x04, 0x1c, 0x01, - 0x37, 0xd8, 0xf7, 0x77, 0xfd, 0x00, 0x28, 0xf8, - 0xd1, 0x00, 0x2c, 0x05, 0xd0, 0x65, 0x6d, 0x20, - 0x1c, 0xd8, 0xf7, 0x90, 0xfd, 0x2c, 0x1c, 0xf9, - 0xd1, 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xb0, 0xb5, 0x0f, 0x1c, 0x01, 0x1c, 0x0e, - 0x48, 0xd8, 0xf7, 0xa0, 0xf8, 0x0c, 0x1c, 0x39, - 0x1c, 0x05, 0x1c, 0x0b, 0x48, 0xd8, 0xf7, 0x9a, - 0xf8, 0x0f, 0x1c, 0x21, 0x1c, 0x41, 0x43, 0x7d, - 0x43, 0x49, 0x19, 0x07, 0x48, 0xd8, 0xf7, 0x92, - 0xf8, 0x05, 0x48, 0x7c, 0x43, 0x48, 0x43, 0x01, - 0x19, 0x04, 0x48, 0xd8, 0xf7, 0x8b, 0xf8, 0xb0, - 0xbc, 0x08, 0xbc, 0x08, 0x1c, 0x18, 0x47, 0x00, - 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0xe1, 0xf5, - 0x05, 0x90, 0xb5, 0x07, 0x1c, 0x00, 0xd1, 0x0b, - 0x4f, 0x0b, 0x4c, 0x0c, 0x49, 0xe0, 0x6a, 0xff, - 0xf7, 0xd3, 0xff, 0x41, 0x1c, 0x07, 0x48, 0xd8, - 0xf7, 0x75, 0xf8, 0xe1, 0x62, 0x08, 0x48, 0xd8, - 0xf7, 0x71, 0xf8, 0x78, 0x43, 0x01, 0x1c, 0x06, - 0x48, 0xd8, 0xf7, 0x6c, 0xf8, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xe1, 0xf5, - 0x05, 0xd8, 0xeb, 0x03, 0x20, 0x0d, 0x5e, 0xdf, - 0x01, 0x10, 0x27, 0x00, 0x00, 0x01, 0x49, 0x0c, - 0xc9, 0x0c, 0xc0, 0x70, 0x47, 0xc4, 0xeb, 0x03, - 0x20, 0x00, 0x20, 0x70, 0x47, 0x00, 0xb5, 0x08, - 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0x19, 0x40, 0x10, - 0x40, 0x07, 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0xe8, - 0xf7, 0xe7, 0xfc, 0x00, 0x28, 0x02, 0xd0, 0x05, - 0x20, 0x08, 0xbc, 0x18, 0x47, 0x0a, 0x20, 0xfb, - 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb5, 0x08, 0xa3, 0x1a, 0x68, 0x5b, - 0x68, 0x19, 0x40, 0xed, 0x09, 0x00, 0x87, 0x02, - 0x10, 0x40, 0x07, 0xa3, 0x1a, 0x68, 0x5b, 0x68, - 0xe8, 0xf7, 0xcd, 0xfc, 0x00, 0x28, 0x02, 0xd0, - 0x0a, 0x20, 0x08, 0xbc, 0x18, 0x47, 0x05, 0x20, - 0xfb, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xf3, 0xb5, 0x84, 0xb0, 0x1a, 0xa0, - 0x84, 0xc8, 0x0d, 0x1c, 0x00, 0x26, 0x08, 0x38, - 0x04, 0x68, 0x03, 0x92, 0x43, 0x68, 0x18, 0xa0, - 0x02, 0x93, 0x43, 0x68, 0x01, 0x93, 0x02, 0x68, - 0x00, 0x92, 0x01, 0x22, 0x20, 0x1c, 0x39, 0x1c, - 0xe8, 0xf7, 0x35, 0xfd, 0x04, 0x1c, 0x0f, 0x1c, - 0x01, 0x9b, 0x29, 0x1c, 0x19, 0x40, 0x04, 0x98, - 0x00, 0x9a, 0x02, 0x9b, 0x10, 0x40, 0x03, 0x9a, - 0xe8, 0xf7, 0x9d, 0xfc, 0x00, 0x28, 0x03, 0xd0, - 0x01, 0x9b, 0x00, 0x9a, 0x1f, 0x43, 0x14, 0x43, - 0x01, 0x22, 0x29, 0x1c, 0x04, 0x98, 0xe8, 0xf7, - 0x9c, 0xfc, 0x0d, 0x1c, 0x01, 0x36, 0x40, 0x2e, - 0x04, 0x90, 0xde, 0xd3, 0x20, 0x1c, 0x39, 0x1c, - 0x06, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x1c, 0x1d, 0x1c, - 0x16, 0x1c, 0x0f, 0x1c, 0xff, 0xf7, 0x85, 0xff, - 0x30, 0x60, 0x20, 0x1c, 0x39, 0x1c, 0xff, 0xf7, - 0x9a, 0xff, 0x28, 0x60, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf8, 0xb4, 0x00, 0x27, 0x61, 0x25, - 0x30, 0x21, 0x0a, 0x03, 0x02, 0x40, 0x12, 0x0c, - 0x00, 0x92, 0x17, 0x4a, 0x92, 0x68, 0x01, 0x2a, - 0x04, 0xd0, 0x02, 0x2a, 0x05, 0xd1, 0x66, 0x22, - 0x19, 0x24, 0x04, 0xe0, 0x14, 0x24, 0x66, 0x22, - 0x01, 0xe0, 0x66, 0x22, 0x14, 0x24, 0x07, 0x23, - 0xdb, 0x03, 0x98, 0x43, 0x03, 0x1c, 0xed, 0x09, - 0x00, 0x88, 0x02, 0x0f, 0x4e, 0x01, 0xe0, 0x00, - 0x29, 0x07, 0xd0, 0x48, 0x00, 0x80, 0x19, 0x20, - 0x38, 0xc0, 0x8b, 0x98, 0x42, 0x01, 0xd9, 0x0d, - 0x1c, 0x04, 0xe0, 0x48, 0x00, 0x30, 0x5a, 0x98, - 0x42, 0x05, 0xd8, 0x0f, 0x1c, 0xe8, 0x1b, 0x40, - 0x08, 0x39, 0x18, 0x00, 0x28, 0xeb, 0xd1, 0x00, - 0x98, 0x00, 0x28, 0x00, 0xd0, 0x12, 0x19, 0xf8, - 0xbc, 0x88, 0x1a, 0x70, 0x47, 0x00, 0x00, 0x18, - 0xec, 0x03, 0x20, 0x9c, 0x62, 0x03, 0x20, 0xb0, - 0xb5, 0x82, 0xb0, 0x1d, 0x48, 0x07, 0x69, 0x00, - 0x2f, 0x32, 0xd0, 0x38, 0x69, 0x0c, 0xf0, 0x87, - 0xf8, 0x3a, 0x1c, 0x03, 0x1c, 0x1a, 0xa0, 0xb9, - 0x68, 0xec, 0xf7, 0x1b, 0xfe, 0x00, 0x24, 0xff, - 0x20, 0xb5, 0x30, 0x60, 0x43, 0xc5, 0x19, 0xa8, - 0x6c, 0x00, 0x28, 0x1b, 0xd0, 0x69, 0x6c, 0x00, - 0x29, 0x0e, 0xd0, 0x0c, 0xf0, 0x7e, 0xfa, 0x02, - 0x1c, 0x68, 0x6c, 0xeb, 0x1d, 0x81, 0x68, 0x01, - 0x92, 0x22, 0x1c, 0x00, 0x91, 0xb9, 0x68, 0x31, - 0x33, 0x18, 0xa0, 0xec, 0xf7, 0x02, 0xfe, 0x09, - 0xe0, 0x0c, 0xf0, 0x6f, 0xfa, 0x00, 0x90, 0x22, - 0x1c, 0xeb, 0x1d, 0x31, 0x33, 0xb9, 0x68, 0x22, - 0xa0, 0xec, 0xf7, 0xf7, 0xfd, 0x01, 0x34, 0x08, - 0x2c, 0xd9, 0xd3, 0x3f, 0x68, 0x00, 0x2f, 0xcc, - 0xd1, 0x02, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x98, 0xeb, 0x03, 0x20, 0x5b, - 0x25, 0x75, 0x5d, 0x2c, 0x20, 0x25, 0x23, 0x70, - 0x2c, 0x20, 0x4c, 0x63, 0x4d, 0x69, 0x73, 0x63, - 0x53, 0x68, 0x6f, 0x77, 0x55, 0x73, 0x65, 0x64, - 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x2c, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, 0x0a, - 0x0d, 0x00, 0x00, 0x5b, 0x25, 0x75, 0x5d, 0x28, - 0x25, 0x75, 0x29, 0x2c, 0x20, 0x25, 0x23, 0x70, - 0x2c, 0xed, 0x09, 0x00, 0x89, 0x02, 0x20, 0x4c, - 0x63, 0x4d, 0x69, 0x73, 0x63, 0x53, 0x68, 0x6f, - 0x77, 0x55, 0x73, 0x65, 0x64, 0x4c, 0x69, 0x6e, - 0x6b, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x6e, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x7b, 0x25, - 0x75, 0x7d, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x0a, 0x0d, 0x00, 0x00, - 0x5b, 0x25, 0x75, 0x5d, 0x28, 0x25, 0x75, 0x29, - 0x2c, 0x20, 0x25, 0x23, 0x70, 0x2c, 0x20, 0x4c, - 0x63, 0x4d, 0x69, 0x73, 0x63, 0x53, 0x68, 0x6f, - 0x77, 0x55, 0x73, 0x65, 0x64, 0x4c, 0x69, 0x6e, - 0x6b, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x0a, 0x0d, 0x00, 0x00, - 0x80, 0xb5, 0x82, 0xb0, 0x87, 0x01, 0x38, 0x1c, - 0xfd, 0xf7, 0x48, 0xfb, 0x07, 0x49, 0x0b, 0x22, - 0x08, 0x60, 0x01, 0x92, 0x38, 0x21, 0x02, 0x1c, - 0x00, 0x91, 0x06, 0xa1, 0x04, 0x48, 0x3b, 0x1c, - 0xfe, 0xf7, 0x2c, 0xfa, 0x02, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x08, 0x6d, 0x03, 0x20, - 0x44, 0xe4, 0x03, 0x20, 0x42, 0x54, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x00, 0x00, 0xb5, 0x04, 0x48, - 0xfe, 0xf7, 0x78, 0xfa, 0x03, 0x48, 0x00, 0x68, - 0xfd, 0xf7, 0x54, 0xfb, 0x08, 0xbc, 0x18, 0x47, - 0x44, 0xe4, 0x03, 0x20, 0x08, 0x6d, 0x03, 0x20, - 0x08, 0xb5, 0xea, 0xf7, 0x55, 0xfc, 0x00, 0x28, - 0x01, 0xd0, 0x00, 0x22, 0x01, 0xe0, 0x00, 0x22, - 0xd2, 0x43, 0x69, 0x46, 0x0a, 0x48, 0xfe, 0xf7, - 0xb5, 0xfa, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, - 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x21, - 0x00, 0x22, 0x00, 0x98, 0x07, 0x23, 0x06, 0xc0, - 0x01, 0x3b, 0xfc, 0xd1, 0x00, 0x99, 0x14, 0x20, - 0x08, 0x60, 0x00, 0x98, 0xf0, 0xe7, 0x00, 0x00, - 0x44, 0xe4, 0x03, 0x20, 0xed, 0x09, 0x00, 0x8a, - 0x02, 0x80, 0xb5, 0x07, 0x1c, 0xc0, 0x6a, 0x00, - 0x28, 0x06, 0xd0, 0x39, 0x6b, 0x00, 0x29, 0x03, - 0xd0, 0xd7, 0xf7, 0x7b, 0xff, 0x00, 0x20, 0xf8, - 0x62, 0x00, 0x21, 0x38, 0x68, 0xc9, 0x43, 0x88, - 0x42, 0x03, 0xd0, 0x39, 0x60, 0x38, 0x1c, 0xfe, - 0xf7, 0xe7, 0xfa, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0x23, 0x4d, 0x00, 0x27, 0x6f, - 0x67, 0xec, 0x1d, 0x79, 0x34, 0xaf, 0x67, 0xef, - 0x67, 0x27, 0x61, 0x67, 0x61, 0x01, 0x26, 0xa7, - 0x61, 0xe8, 0x1d, 0x99, 0x30, 0xe6, 0x61, 0x1d, - 0x49, 0x00, 0xf0, 0x12, 0xfb, 0xe6, 0x63, 0xa7, - 0x62, 0xec, 0x1d, 0xb9, 0x34, 0xa7, 0x60, 0x27, - 0x60, 0x67, 0x60, 0xe7, 0x60, 0x01, 0x20, 0xc0, - 0x02, 0x27, 0x61, 0x67, 0x61, 0xe0, 0x61, 0x22, - 0x21, 0x21, 0x62, 0xa7, 0x61, 0x60, 0x62, 0xa1, - 0x62, 0xe6, 0x63, 0xe9, 0x1d, 0x13, 0x20, 0xf9, - 0x31, 0x27, 0x63, 0x08, 0x60, 0x10, 0x48, 0x48, - 0x60, 0xcf, 0x60, 0x0f, 0x61, 0x4f, 0x61, 0x0f, - 0xa0, 0xc8, 0x61, 0x8e, 0x60, 0x0d, 0xf0, 0x5e, - 0xf9, 0xff, 0x27, 0x03, 0x37, 0xb8, 0x42, 0x01, - 0xd3, 0x07, 0x20, 0x00, 0xe0, 0x05, 0x20, 0x60, - 0x63, 0x0d, 0xf0, 0x54, 0xf9, 0xb8, 0x42, 0x01, - 0xd3, 0x07, 0x20, 0x00, 0xe0, 0x05, 0x20, 0xa0, - 0x63, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x18, 0xeb, 0x03, 0x20, 0x33, 0x8b, 0x9e, - 0x00, 0x80, 0x84, 0x1e, 0x00, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x63, 0x5f, 0x69, 0x6e, 0x69, 0x74, - 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x31, 0x37, 0x00, - 0x00, 0xf0, 0xb5, 0x82, 0xb0, 0x01, 0x26, 0x22, - 0x4c, 0xdb, 0xf7, 0xe2, 0xfc, 0x43, 0x00, 0x18, - 0x18, 0x80, 0x00, 0x00, 0x19, 0x1f, 0x4d, 0x01, - 0x90, 0xe8, 0x1d, 0x27, 0x1c, 0x6d, 0x30, 0xed, - 0x09, 0x00, 0x8b, 0x02, 0x00, 0x90, 0x0c, 0xe0, - 0x00, 0x2e, 0x05, 0xd0, 0x00, 0x26, 0x39, 0x1b, - 0x0c, 0x20, 0xe8, 0xf7, 0x9e, 0xfb, 0x01, 0xc5, - 0x38, 0x68, 0x24, 0x28, 0x00, 0xd1, 0x01, 0x26, - 0x0c, 0x37, 0x01, 0x98, 0x87, 0x42, 0x04, 0xd2, - 0x00, 0x98, 0x85, 0x42, 0xec, 0xd3, 0x00, 0x2e, - 0xea, 0xd0, 0x00, 0x98, 0x85, 0x42, 0x0b, 0xd2, - 0x01, 0x98, 0x01, 0x1b, 0x0c, 0x20, 0xe8, 0xf7, - 0x88, 0xfb, 0x0e, 0xa3, 0x1d, 0x22, 0x01, 0x1c, - 0x18, 0x1c, 0xec, 0xf7, 0xaa, 0xfc, 0x0d, 0xe0, - 0x01, 0x98, 0x87, 0x42, 0x0a, 0xd2, 0x01, 0x98, - 0x01, 0x1b, 0x0c, 0x20, 0xe8, 0xf7, 0x79, 0xfb, - 0x12, 0xa3, 0x1d, 0x22, 0x01, 0x1c, 0x18, 0x1c, - 0xec, 0xf7, 0x9b, 0xfc, 0x02, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x7c, 0x73, - 0x03, 0x20, 0x18, 0xeb, 0x03, 0x20, 0x4c, 0x63, - 0x49, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x73, 0x2c, 0x20, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x44, 0x65, 0x73, 0x63, 0x20, 0x74, 0x6f, - 0x6f, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x20, - 0x28, 0x25, 0x75, 0x20, 0x25, 0x75, 0x29, 0x00, - 0x00, 0x00, 0x4c, 0x63, 0x49, 0x6e, 0x69, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x2c, 0x20, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x73, - 0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x28, 0x25, 0x75, - 0x20, 0x25, 0x75, 0x29, 0x00, 0x00, 0xb0, 0xb5, - 0x87, 0xb0, 0x00, 0x27, 0xff, 0xf7, 0x2b, 0xff, - 0xff, 0xf7, 0x81, 0xff, 0x64, 0x20, 0xff, 0xf7, - 0xc0, 0xfe, 0x00, 0x20, 0xd9, 0xf7, 0x83, 0xfc, - 0x00, 0x28, 0x4a, 0xd1, 0x01, 0x23, 0x9b, 0x03, - 0x26, 0x4d, 0x09, 0x22, 0xe8, 0x1d, 0xf9, 0x30, - 0x03, 0x62, 0xed, 0x09, 0x00, 0x8c, 0x02, 0x06, - 0x92, 0x00, 0x20, 0x32, 0x22, 0x0a, 0x21, 0x05, - 0x91, 0x03, 0x21, 0x89, 0x02, 0x03, 0x92, 0x04, - 0x90, 0x20, 0x48, 0x00, 0x22, 0x00, 0x92, 0x02, - 0x91, 0x01, 0x93, 0x04, 0x1c, 0x00, 0x23, 0x1e, - 0xa1, 0x1d, 0x4a, 0xe9, 0xf7, 0x52, 0xff, 0x00, - 0x28, 0x2d, 0xd1, 0xff, 0xf7, 0xe3, 0xfb, 0x20, - 0x1c, 0xea, 0xf7, 0x7f, 0xf9, 0x00, 0x28, 0x26, - 0xd1, 0xe8, 0x1d, 0xa5, 0x30, 0x04, 0x1c, 0x06, - 0x22, 0x18, 0xa1, 0xfd, 0xf7, 0x68, 0xfa, 0x00, - 0x28, 0x0d, 0xd0, 0xe8, 0x1d, 0x79, 0x30, 0xc0, - 0x6a, 0x01, 0x02, 0x09, 0x0a, 0xe8, 0x1d, 0xad, - 0x30, 0x00, 0xf0, 0x0f, 0xfa, 0x01, 0x27, 0x21, - 0x1c, 0x12, 0xa0, 0xec, 0xf7, 0x1c, 0xfc, 0xdb, - 0xf7, 0x3e, 0xfc, 0xe9, 0x1d, 0xb9, 0x31, 0xc8, - 0x62, 0xd9, 0xf7, 0xc9, 0xfc, 0x00, 0x28, 0x06, - 0xd1, 0x00, 0x21, 0x38, 0x1c, 0xdb, 0xf7, 0xfe, - 0xf8, 0xdb, 0xf7, 0x27, 0xf9, 0x00, 0x20, 0x07, - 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x18, - 0xeb, 0x03, 0x20, 0xa4, 0xe5, 0x03, 0x20, 0x7d, - 0x3c, 0x00, 0x20, 0x54, 0x5f, 0x4c, 0x43, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0a, 0x4d, 0x79, 0x20, 0x42, - 0x54, 0x41, 0x64, 0x64, 0x72, 0x3a, 0x20, 0x25, - 0x3a, 0x2d, 0x36, 0x42, 0x20, 0x28, 0x66, 0x69, - 0x6e, 0x61, 0x6c, 0x29, 0x0a, 0x00, 0x00, 0x00, - 0x20, 0x70, 0x47, 0x00, 0xb5, 0xe2, 0xf7, 0x4d, - 0xfc, 0xff, 0xf7, 0xef, 0xfb, 0xe1, 0xf7, 0xa7, - 0xfa, 0xdc, 0xf7, 0xdf, 0xfb, 0xdc, 0xf7, 0x35, - 0xfb, 0xff, 0xf7, 0xa7, 0xfe, 0xff, 0xf7, 0x86, - 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xf0, - 0xb5, 0x8a, 0xb0, 0x33, 0x49, 0x06, 0xa8, 0xf0, - 0xc9, 0xf0, 0xc0, 0x00, 0x27, 0xed, 0x09, 0x00, - 0x8d, 0x02, 0x05, 0x23, 0x31, 0x4c, 0x1b, 0x02, - 0xe0, 0x18, 0x15, 0x23, 0x07, 0x63, 0x47, 0x63, - 0x9b, 0x01, 0xe5, 0x18, 0x87, 0x63, 0x2f, 0x60, - 0x6f, 0x60, 0xaf, 0x60, 0x2f, 0x61, 0x6f, 0x62, - 0xaf, 0x62, 0x10, 0x20, 0x02, 0xa9, 0x00, 0xf0, - 0x13, 0xfa, 0x68, 0x46, 0xff, 0xf7, 0xc8, 0xfc, - 0x27, 0x4b, 0x00, 0x9a, 0xe0, 0x18, 0x01, 0x9b, - 0x02, 0xa9, 0x01, 0xf0, 0x05, 0xf8, 0x2f, 0x63, - 0x0b, 0x23, 0xdb, 0x01, 0x6f, 0x63, 0x23, 0x48, - 0xaf, 0x63, 0xe6, 0x18, 0x70, 0x61, 0x22, 0x48, - 0x22, 0x4b, 0xb0, 0x61, 0xe0, 0x18, 0x22, 0xa1, - 0x0c, 0xc9, 0x0c, 0xc0, 0xef, 0x63, 0x10, 0x25, - 0x21, 0x4b, 0x2a, 0x1c, 0xe0, 0x18, 0x35, 0x60, - 0x06, 0xa9, 0xd7, 0xf7, 0xf3, 0xfd, 0x75, 0x62, - 0x01, 0x25, 0x14, 0x20, 0xf0, 0x62, 0x37, 0x63, - 0xb5, 0x62, 0xdb, 0xf7, 0xb7, 0xfb, 0x70, 0x63, - 0x02, 0x20, 0x5b, 0x23, 0x1b, 0x01, 0xb0, 0x63, - 0xe0, 0x18, 0x05, 0x73, 0x1f, 0x20, 0x2d, 0x23, - 0x5b, 0x01, 0xe1, 0x18, 0x17, 0x23, 0x9b, 0x01, - 0xc8, 0x83, 0xe0, 0x18, 0x04, 0x33, 0xe1, 0x18, - 0x05, 0x80, 0x00, 0x25, 0x00, 0x26, 0x60, 0xc1, - 0x41, 0x68, 0x10, 0x4b, 0x19, 0x43, 0x41, 0x60, - 0x5d, 0x23, 0x1b, 0x01, 0xc7, 0x60, 0xe0, 0x18, - 0x11, 0x22, 0x0d, 0xa1, 0xd7, 0xf7, 0xca, 0xfd, - 0x0a, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x60, 0x65, 0x03, 0x20, 0xb8, 0xa8, 0x03, 0x20, - 0x54, 0x05, 0x00, 0x00, 0x80, 0x84, 0x1e, 0x00, - 0x00, 0x0e, 0x27, 0x07, 0x9c, 0x05, 0x00, 0x00, - 0x00, 0xc0, 0xae, 0x3b, 0x28, 0x00, 0x00, 0x00, - 0x84, 0x05, 0x00, 0x00, 0x2f, 0xbe, 0x05, 0x00, - 0x42, 0x6c, 0x75, 0x65, 0x74, 0x6f, 0x6f, 0x74, - 0x68, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0xed, 0x09, 0x00, 0x8e, 0x02, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0xb5, 0x82, 0xb0, 0x01, 0x26, 0x16, - 0x4c, 0x00, 0xf0, 0xb6, 0xfc, 0x43, 0x00, 0x18, - 0x18, 0x80, 0x00, 0x00, 0x19, 0x0c, 0x38, 0x01, - 0x90, 0x12, 0x48, 0x27, 0x1c, 0xc5, 0x1d, 0xff, - 0x35, 0x3a, 0x35, 0xff, 0x30, 0x8d, 0x30, 0x00, - 0x90, 0x0c, 0xe0, 0x00, 0x2e, 0x05, 0xd0, 0x00, - 0x26, 0x39, 0x1b, 0x0c, 0x20, 0xe8, 0xf7, 0x0c, - 0xfa, 0x01, 0xc5, 0x38, 0x68, 0xa5, 0x28, 0x00, - 0xd1, 0x01, 0x26, 0x0c, 0x37, 0x01, 0x98, 0x87, - 0x42, 0x04, 0xd8, 0x00, 0x98, 0x85, 0x42, 0xec, - 0xd9, 0x00, 0x2e, 0xea, 0xd0, 0x00, 0x98, 0x02, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x28, 0x7e, 0x03, 0x20, 0xb8, 0xa8, 0x03, - 0x20, 0xf0, 0xb5, 0x82, 0xb0, 0x01, 0x26, 0x14, - 0x4d, 0x00, 0xf0, 0x85, 0xfc, 0x43, 0x00, 0x18, - 0x18, 0x80, 0x00, 0x40, 0x19, 0x11, 0x4c, 0x01, - 0x90, 0xe0, 0x1d, 0xff, 0x30, 0x2f, 0x1c, 0x36, - 0x30, 0x00, 0x90, 0x0c, 0xe0, 0x00, 0x2e, 0x05, - 0xd0, 0x00, 0x26, 0x79, 0x1b, 0x0c, 0x20, 0xe8, - 0xf7, 0xdb, 0xf9, 0x01, 0xc4, 0x38, 0x68, 0xa5, - 0x28, 0x00, 0xd1, 0x01, 0x26, 0x0c, 0x37, 0x01, - 0x98, 0x87, 0x42, 0x04, 0xd2, 0x00, 0x98, 0x84, - 0x42, 0xec, 0xd9, 0x00, 0x2e, 0xea, 0xd0, 0x00, - 0x98, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x84, 0x94, 0x03, 0x20, 0xb8, 0xa8, 0x03, - 0x20, 0xb0, 0xb5, 0x87, 0xb0, 0xff, 0xf7, 0x82, - 0xfe, 0x07, 0x1c, 0x04, 0xd0, 0x38, 0x1c, 0x07, - 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, - 0xf7, 0x07, 0xff, 0xff, 0xf7, 0x8d, 0xff, 0xff, - 0xf7, 0xbf, 0xff, 0x13, 0x20, 0x80, 0x02, 0x1b, - 0x23, 0x9b, 0x01, 0x18, 0x4c, 0x09, 0x22, 0xe1, - 0x18, 0xc8, 0x60, 0xed, 0x09, 0x00, 0x8f, 0x02, - 0x03, 0x1c, 0x06, 0x92, 0x3c, 0x22, 0x00, 0x20, - 0x0a, 0x21, 0x05, 0x91, 0x03, 0x21, 0x89, 0x02, - 0x03, 0x92, 0x00, 0x22, 0x13, 0x4d, 0x04, 0x90, - 0x28, 0x1c, 0x00, 0x92, 0x02, 0x91, 0x01, 0x93, - 0x00, 0x23, 0x10, 0xa1, 0x0e, 0x4a, 0xe9, 0xf7, - 0xd4, 0xfd, 0x00, 0x28, 0xd6, 0xd1, 0x28, 0x1c, - 0xea, 0xf7, 0x03, 0xf8, 0x00, 0x28, 0xd1, 0xd1, - 0x0d, 0x49, 0x00, 0x22, 0x01, 0x92, 0x00, 0x91, - 0x0c, 0xa1, 0x08, 0x68, 0x00, 0x23, 0x01, 0x22, - 0x49, 0x68, 0x00, 0xf0, 0x9d, 0xfa, 0x15, 0x23, - 0x9b, 0x01, 0xe1, 0x18, 0xc8, 0x60, 0x38, 0x1c, - 0xc0, 0xe7, 0xb8, 0xa8, 0x03, 0x20, 0x8b, 0x8f, - 0x02, 0x20, 0x0c, 0x17, 0x04, 0x20, 0x54, 0x5f, - 0x4c, 0x4d, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xb3, - 0x02, 0x20, 0x80, 0x84, 0x1e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x90, 0xb5, 0x00, 0x27, 0xff, 0xf7, - 0xa6, 0xfe, 0x0b, 0x4c, 0x20, 0x1c, 0xe9, 0xf7, - 0xfc, 0xfe, 0x20, 0x1c, 0xe9, 0xf7, 0x85, 0xfe, - 0x02, 0xf0, 0x7d, 0xfa, 0x02, 0xf0, 0xa1, 0xfe, - 0x07, 0x4c, 0xe0, 0x68, 0x00, 0x28, 0x03, 0xd0, - 0xfd, 0xf7, 0x91, 0xf8, 0x00, 0x20, 0xe0, 0x60, - 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x0c, 0x17, 0x04, 0x20, 0x78, 0xaf, - 0x03, 0x20, 0x80, 0xb5, 0x82, 0xb0, 0x0c, 0x4f, - 0x00, 0x20, 0xf8, 0x60, 0x02, 0xf0, 0x63, 0xfa, - 0x02, 0xf0, 0x87, 0xfe, 0xff, 0xf7, 0x93, 0xfe, - 0x09, 0x49, 0x00, 0x22, 0x01, 0x92, 0x00, 0x91, - 0x08, 0xa1, 0x08, 0x68, 0x00, 0x23, 0x01, 0x22, - 0x49, 0x68, 0x00, 0xf0, 0x51, 0xfa, 0xf8, 0x60, - 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xf8, 0xad, 0x03, 0x20, 0xfd, 0xb3, - 0x02, 0x20, 0x80, 0x84, 0x1e, 0x00, 0xed, 0x09, - 0x00, 0x90, 0x02, 0x00, 0x00, 0x00, 0x00, 0xf0, - 0xb5, 0x85, 0xb0, 0x18, 0xa2, 0x13, 0x68, 0x00, - 0x93, 0x56, 0x68, 0x04, 0x22, 0xe8, 0xf7, 0xdd, - 0xf8, 0x00, 0x25, 0x04, 0x1c, 0x0f, 0x1c, 0x15, - 0xa1, 0x4b, 0x68, 0x16, 0xa0, 0x04, 0x93, 0x0a, - 0x68, 0x03, 0x92, 0x43, 0x68, 0x02, 0x93, 0x02, - 0x68, 0x01, 0x92, 0x01, 0x22, 0x20, 0x1c, 0x39, - 0x1c, 0xe8, 0xf7, 0xcb, 0xf8, 0x02, 0x9b, 0x0f, - 0x1c, 0x19, 0x40, 0x01, 0x9a, 0x04, 0x1c, 0x10, - 0x40, 0x03, 0x9a, 0x04, 0x9b, 0xe8, 0xf7, 0x35, - 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x9a, 0x77, - 0x40, 0x54, 0x40, 0x01, 0x35, 0x1e, 0x2d, 0xe8, - 0xd3, 0x20, 0x1c, 0x39, 0x1c, 0x05, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xa9, - 0x3d, 0x71, 0x85, 0x05, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, - 0xb5, 0x86, 0xb0, 0x07, 0x1c, 0x08, 0x0e, 0x05, - 0xd3, 0x08, 0x02, 0x00, 0x0a, 0x13, 0x23, 0x1b, - 0x06, 0x18, 0x43, 0x04, 0xe0, 0x08, 0x02, 0x00, - 0x0a, 0x0b, 0x23, 0x9b, 0x06, 0x18, 0x43, 0x00, - 0x21, 0x03, 0x91, 0x02, 0x90, 0x14, 0xa3, 0x1a, - 0x68, 0x5b, 0x68, 0x59, 0x40, 0x50, 0x40, 0x02, - 0x90, 0x03, 0x91, 0xff, 0xf7, 0xa4, 0xff, 0x04, - 0x90, 0x05, 0x91, 0x03, 0x99, 0x02, 0x98, 0x22, - 0x22, 0xe8, 0xf7, 0x83, 0xf8, 0x6a, 0x46, 0x03, - 0xc2, 0x05, 0x99, 0x01, 0x9b, 0x04, 0x98, 0x19, - 0x43, 0x00, 0x9a, 0x05, 0x91, 0x10, 0x43, 0x04, - 0x90, 0x09, 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0x59, - 0x40, 0x50, 0x40, 0x04, 0x90, 0x04, 0xa8, 0x05, - 0x91, 0x0c, 0xc8, 0x0c, 0xc7, 0x06, 0xb0, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x65, - 0x23, 0xed, 0x09, 0x00, 0x91, 0x02, 0xe1, 0x20, - 0x00, 0x00, 0x00, 0x00, 0xfc, 0x54, 0xcc, 0xbb, - 0x96, 0x8d, 0x84, 0x83, 0xb0, 0xb5, 0x0f, 0x1c, - 0x01, 0x1c, 0x0e, 0x48, 0xd7, 0xf7, 0x36, 0xfb, - 0x0c, 0x1c, 0x39, 0x1c, 0x05, 0x1c, 0x0b, 0x48, - 0xd7, 0xf7, 0x30, 0xfb, 0x0f, 0x1c, 0x21, 0x1c, - 0x41, 0x43, 0x7d, 0x43, 0x49, 0x19, 0x07, 0x48, - 0xd7, 0xf7, 0x28, 0xfb, 0x05, 0x48, 0x7c, 0x43, - 0x48, 0x43, 0x01, 0x19, 0x04, 0x48, 0xd7, 0xf7, - 0x21, 0xfb, 0xb0, 0xbc, 0x08, 0xbc, 0x08, 0x1c, - 0x18, 0x47, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, - 0x00, 0xe1, 0xf5, 0x05, 0xf0, 0xb5, 0x00, 0x25, - 0x0c, 0x1c, 0x07, 0x1c, 0x00, 0x28, 0x15, 0xd9, - 0x0c, 0x4e, 0x70, 0x6b, 0x0c, 0x49, 0xff, 0xf7, - 0xd1, 0xff, 0x41, 0x1c, 0x0b, 0x48, 0xd7, 0xf7, - 0x09, 0xfb, 0x71, 0x63, 0x0a, 0x48, 0xd7, 0xf7, - 0x05, 0xfb, 0x01, 0x02, 0x09, 0x1a, 0x08, 0x48, - 0xd7, 0xf7, 0x00, 0xfb, 0x60, 0x55, 0x01, 0x35, - 0xbd, 0x42, 0xea, 0xd3, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x38, 0xae, 0x03, 0x20, - 0x0d, 0x5e, 0xdf, 0x01, 0x00, 0xe1, 0xf5, 0x05, - 0x10, 0x27, 0x00, 0x00, 0x80, 0x02, 0x08, 0x43, - 0x70, 0x47, 0x80, 0xb4, 0x08, 0x4f, 0x5b, 0x23, - 0x1b, 0x01, 0xfb, 0x18, 0x1b, 0x7b, 0x03, 0x60, - 0x2d, 0x23, 0x5b, 0x01, 0xf8, 0x18, 0xc0, 0x8b, - 0x17, 0x23, 0x9b, 0x01, 0x08, 0x60, 0xf8, 0x18, - 0x00, 0x88, 0x10, 0x60, 0x80, 0xbc, 0x70, 0x47, - 0xb8, 0xa8, 0x03, 0x20, 0x01, 0x49, 0x0c, 0xc9, - 0x0c, 0xc0, 0x70, 0x47, 0x7c, 0xae, 0x03, 0x20, - 0x00, 0xb5, 0x02, 0x49, 0xfc, 0xf7, 0xb4, 0xff, - 0x08, 0xbc, 0x18, 0x47, 0x88, 0xae, 0x03, 0x20, - 0x00, 0xb5, 0x03, 0x4a, 0x01, 0x1c, 0x10, 0x1c, - 0xfc, 0xf7, 0xaa, 0xff, 0xed, 0x09, 0x00, 0x92, - 0x02, 0x08, 0xbc, 0x18, 0x47, 0x88, 0xae, 0x03, - 0x20, 0x00, 0x28, 0x06, 0xd0, 0x09, 0x23, 0xdb, - 0x01, 0xc1, 0x18, 0x89, 0x6b, 0x02, 0x4b, 0x99, - 0x42, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, - 0x00, 0x19, 0x64, 0x03, 0x11, 0xb0, 0xb5, 0x0c, - 0x1c, 0x05, 0x1c, 0x17, 0x1c, 0xd7, 0xf7, 0x2f, - 0xff, 0x00, 0x28, 0x09, 0xd0, 0x68, 0x21, 0x01, - 0x60, 0x29, 0x6b, 0x0c, 0x30, 0x92, 0xc0, 0x18, - 0x38, 0x01, 0x1c, 0x07, 0x20, 0xd7, 0xf7, 0x92, - 0xff, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x02, - 0x4b, 0x40, 0x18, 0x18, 0x40, 0x70, 0x47, 0x00, - 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x80, 0x08, 0x40, - 0x04, 0x40, 0x0c, 0x70, 0x47, 0x90, 0xb5, 0x03, - 0x9c, 0x17, 0x1c, 0x22, 0x1c, 0x18, 0x1c, 0x00, - 0x29, 0x02, 0xd0, 0x01, 0x23, 0xdb, 0x06, 0x9a, - 0x43, 0x51, 0x08, 0xd7, 0xf7, 0x85, 0xfa, 0x78, - 0x1a, 0x40, 0x00, 0x00, 0x19, 0x90, 0xbc, 0x00, - 0x01, 0x00, 0x09, 0x08, 0xbc, 0x40, 0x08, 0x18, - 0x47, 0x80, 0xb5, 0x84, 0xb0, 0x2e, 0x48, 0x07, - 0x6b, 0x00, 0x2f, 0x54, 0xd0, 0x38, 0x6b, 0x00, - 0x28, 0x2c, 0xd0, 0xf8, 0x6a, 0x00, 0x28, 0x17, - 0xd0, 0x78, 0x69, 0x0c, 0xf0, 0x01, 0xf8, 0x02, - 0x1c, 0xf8, 0x6a, 0x3b, 0x6b, 0x41, 0x69, 0x18, - 0x68, 0x03, 0x92, 0x02, 0x91, 0x01, 0x90, 0x58, - 0x68, 0x82, 0x68, 0xf8, 0x1d, 0xff, 0x30, 0x3a, - 0x30, 0x00, 0x92, 0x43, 0x68, 0xb9, 0x68, 0x21, - 0xa0, 0x3a, 0x1c, 0xec, 0xf7, 0xeb, 0xf8, 0x33, - 0xe0, 0x78, 0x69, 0x0b, 0xf0, 0xe9, 0xff, 0x02, - 0x1c, 0x38, 0x6b, 0x01, 0x68, 0xf8, 0x1d, 0xff, - 0x30, 0x3a, 0x30, 0x01, 0x92, 0x00, 0x91, 0x43, - 0x68, 0xb9, 0x68, 0x2c, 0xa0, 0x3a, 0x1c, 0xec, - 0xf7, 0xd9, 0xf8, 0x21, 0xe0, 0xf8, 0x6a, 0xed, - 0x09, 0x00, 0x93, 0x02, 0x00, 0x28, 0x11, 0xd0, - 0x78, 0x69, 0x0b, 0xf0, 0xd4, 0xff, 0x02, 0x1c, - 0xf8, 0x6a, 0x41, 0x69, 0xf8, 0x1d, 0xff, 0x30, - 0x3a, 0x30, 0x01, 0x92, 0x00, 0x91, 0x43, 0x68, - 0xb9, 0x68, 0x31, 0xa0, 0x3a, 0x1c, 0xec, 0xf7, - 0xc4, 0xf8, 0x0c, 0xe0, 0x78, 0x69, 0x0b, 0xf0, - 0xc2, 0xff, 0x00, 0x90, 0xf8, 0x1d, 0xff, 0x30, - 0x3a, 0x30, 0x43, 0x68, 0xb9, 0x68, 0x3a, 0xa0, - 0x3a, 0x1c, 0xec, 0xf7, 0xb6, 0xf8, 0x3f, 0x68, - 0x00, 0x2f, 0xaa, 0xd1, 0x04, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xb8, 0xad, - 0x03, 0x20, 0x7b, 0x25, 0x75, 0x7d, 0x2c, 0x20, - 0x25, 0x23, 0x70, 0x2c, 0x20, 0x4c, 0x6d, 0x4d, - 0x69, 0x73, 0x63, 0x53, 0x68, 0x6f, 0x77, 0x4c, - 0x69, 0x6e, 0x6b, 0x73, 0x2c, 0x20, 0x70, 0x65, - 0x6e, 0x64, 0x20, 0x25, 0x75, 0x2c, 0x20, 0x63, - 0x6f, 0x6e, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x5b, 0x25, 0x75, 0x5d, 0x28, 0x25, 0x75, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x3c, 0x25, - 0x75, 0x3e, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x0a, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x7b, 0x25, 0x75, 0x7d, 0x2c, 0x20, - 0x25, 0x23, 0x70, 0x2c, 0x20, 0x4c, 0x6d, 0x4d, - 0x69, 0x73, 0x63, 0x53, 0x68, 0x6f, 0x77, 0x4c, - 0x69, 0x6e, 0x6b, 0x73, 0x2c, 0x20, 0x70, 0x65, - 0x6e, 0x64, 0x20, 0x25, 0x75, 0x2c, 0x20, 0x63, - 0x6f, 0x6e, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x28, 0x25, 0x75, 0x29, 0x2c, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x73, 0x0a, - 0x0d, 0x00, 0x7b, 0x25, 0x75, 0x7d, 0x2c, 0x20, - 0x25, 0x23, 0x70, 0x2c, 0x20, 0x4c, 0x6d, 0x4d, - 0x69, 0x73, 0x63, 0x53, 0x68, 0x6f, 0x77, 0x4c, - 0x69, 0x6e, 0xed, 0x09, 0x00, 0x94, 0x02, 0x6b, - 0x73, 0x2c, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x20, - 0x25, 0x75, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x6e, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x3c, 0x25, - 0x75, 0x3e, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x0a, 0x0d, 0x00, 0x7b, - 0x25, 0x75, 0x7d, 0x2c, 0x20, 0x25, 0x23, 0x70, - 0x2c, 0x20, 0x4c, 0x6d, 0x4d, 0x69, 0x73, 0x63, - 0x53, 0x68, 0x6f, 0x77, 0x4c, 0x69, 0x6e, 0x6b, - 0x73, 0x2c, 0x20, 0x70, 0x65, 0x6e, 0x64, 0x20, - 0x25, 0x75, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x20, 0x25, 0x73, 0x0a, 0x0d, 0x00, 0xb0, - 0xb5, 0x0c, 0x1c, 0x05, 0x1c, 0x17, 0x1c, 0xd7, - 0xf7, 0x17, 0xfe, 0x00, 0x28, 0x08, 0xd0, 0x7b, - 0x21, 0x01, 0x60, 0x0c, 0x30, 0xb0, 0xc0, 0x18, - 0x38, 0x01, 0x1c, 0x06, 0x20, 0xd7, 0xf7, 0x7b, - 0xfe, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x02, 0x1c, 0x41, 0x69, 0xc0, 0x68, 0x12, - 0x69, 0xd7, 0xf7, 0x49, 0xfa, 0x08, 0xbc, 0x18, - 0x47, 0xb0, 0xb5, 0x83, 0xb0, 0x15, 0x1c, 0x08, - 0x9a, 0x0f, 0x1c, 0x04, 0x1c, 0x07, 0x48, 0x07, - 0x99, 0x00, 0x90, 0x01, 0x91, 0x39, 0x1c, 0x20, - 0x1c, 0x02, 0x92, 0x2a, 0x1c, 0xfe, 0xf7, 0xd9, - 0xfe, 0x03, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x19, 0x8f, 0x02, 0x20, 0x00, - 0xb5, 0xfe, 0xf7, 0x9b, 0xff, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0x85, 0xb0, 0xad, 0x48, 0x17, - 0x23, 0x9b, 0x01, 0xc5, 0x18, 0x0b, 0x23, 0xdb, - 0x01, 0xc4, 0x18, 0x01, 0x20, 0xd7, 0xf7, 0x91, - 0xfe, 0xc6, 0x1d, 0x07, 0x1c, 0xe8, 0x68, 0x05, - 0x36, 0x00, 0x28, 0x02, 0xd0, 0x38, 0x68, 0x7c, - 0x28, 0xf3, 0xd1, 0x38, 0x68, 0x6e, 0x38, 0x49, - 0x28, 0x03, 0xd2, 0x02, 0xa3, 0xed, 0x09, 0x00, - 0x95, 0x02, 0x1b, 0x18, 0x1b, 0x5a, 0x9f, 0x44, - 0x37, 0xe1, 0x00, 0x1c, 0xe2, 0x01, 0xea, 0x01, - 0xf2, 0x01, 0xfa, 0x01, 0x02, 0x02, 0x0a, 0x02, - 0x12, 0x02, 0x1a, 0x02, 0x22, 0x02, 0x2a, 0x02, - 0x4a, 0x02, 0x32, 0x02, 0x52, 0x02, 0x5a, 0x02, - 0x3a, 0x02, 0x42, 0x02, 0x62, 0x02, 0x6a, 0x02, - 0x70, 0x02, 0x70, 0x02, 0x70, 0x02, 0x70, 0x02, - 0x70, 0x02, 0x70, 0x02, 0x70, 0x02, 0x70, 0x02, - 0x70, 0x02, 0x70, 0x02, 0x70, 0x02, 0xdc, 0x01, - 0xa6, 0x00, 0x70, 0x02, 0x70, 0x02, 0x94, 0x00, - 0xa0, 0x00, 0xb8, 0x00, 0xd4, 0x00, 0xe0, 0x00, - 0xec, 0x00, 0xf4, 0x00, 0x70, 0x02, 0xfc, 0x00, - 0x04, 0x01, 0x14, 0x01, 0x0c, 0x01, 0x70, 0x02, - 0x70, 0x02, 0x70, 0x02, 0x1c, 0x01, 0x26, 0x01, - 0x30, 0x01, 0x38, 0x01, 0x40, 0x01, 0x48, 0x01, - 0x60, 0x01, 0x58, 0x01, 0x68, 0x01, 0x70, 0x02, - 0x70, 0x02, 0x78, 0x01, 0x88, 0x01, 0x90, 0x01, - 0x9e, 0x01, 0x98, 0x01, 0xae, 0x01, 0xa6, 0x01, - 0x70, 0x02, 0x50, 0x01, 0xb6, 0x01, 0xbe, 0x01, - 0xc6, 0x01, 0xce, 0x01, 0xd4, 0x01, 0x31, 0x79, - 0x30, 0x68, 0xb2, 0x68, 0x09, 0xf0, 0x52, 0xfa, - 0xe7, 0xe0, 0x09, 0xf0, 0x7d, 0xfa, 0xe4, 0xe0, - 0xb2, 0x68, 0x00, 0x92, 0x09, 0xce, 0x08, 0x3e, - 0xf1, 0x68, 0x32, 0x69, 0x09, 0xf0, 0x88, 0xfa, - 0xdb, 0xe0, 0x18, 0x36, 0x07, 0xce, 0x24, 0x3e, - 0x03, 0x91, 0x02, 0x90, 0x04, 0x92, 0x31, 0x69, - 0x72, 0x69, 0x00, 0x91, 0x01, 0x92, 0x0f, 0xce, - 0x09, 0xf0, 0xf2, 0xfa, 0xcd, 0xe0, 0x33, 0x1d, - 0x0d, 0xcb, 0x31, 0x68, 0x09, 0xf0, 0x29, 0xfb, - 0xc7, 0xe0, 0x32, 0x69, 0x00, 0x92, 0x0f, 0xce, - 0x09, 0xf0, 0xc4, 0xfb, 0xc1, 0xe0, 0x0f, 0xce, - 0x09, 0xf0, 0x18, 0xfc, 0xbd, 0xe0, 0x03, 0xce, - 0xed, 0x09, 0x00, 0x96, 0x02, 0x08, 0xf0, 0xfe, - 0xfe, 0xb9, 0xe0, 0x30, 0x68, 0x0a, 0xf0, 0x17, - 0xfb, 0xb5, 0xe0, 0x30, 0x68, 0x0a, 0xf0, 0x1a, - 0xfb, 0xb1, 0xe0, 0x03, 0xce, 0x09, 0xf0, 0x60, - 0xfc, 0xad, 0xe0, 0x30, 0x68, 0x09, 0xf0, 0x3e, - 0xfc, 0xa9, 0xe0, 0x03, 0xce, 0x32, 0x1c, 0x09, - 0xf0, 0x76, 0xfc, 0xa4, 0xe0, 0x07, 0xce, 0x33, - 0x1c, 0x09, 0xf0, 0xc5, 0xfc, 0x9f, 0xe0, 0x30, - 0x68, 0x09, 0xf0, 0x19, 0xfd, 0x9b, 0xe0, 0x07, - 0xce, 0x09, 0xf0, 0x1c, 0xfd, 0x97, 0xe0, 0x07, - 0xce, 0x09, 0xf0, 0x32, 0xfe, 0x93, 0xe0, 0x07, - 0xce, 0x09, 0xf0, 0xaa, 0xfe, 0x8f, 0xe0, 0x30, - 0x68, 0x09, 0xf0, 0xd8, 0xfe, 0x8b, 0xe0, 0x30, - 0x68, 0x09, 0xf0, 0x88, 0xff, 0x87, 0xe0, 0x30, - 0x68, 0x09, 0xf0, 0x2e, 0xff, 0x83, 0xe0, 0x31, - 0x69, 0x72, 0x69, 0x00, 0x91, 0x01, 0x92, 0x0f, - 0xce, 0x09, 0xf0, 0xd2, 0xff, 0x7b, 0xe0, 0x31, - 0x69, 0x72, 0x69, 0x00, 0x91, 0x01, 0x92, 0x0f, - 0xce, 0x0a, 0xf0, 0x46, 0xf8, 0x73, 0xe0, 0x30, - 0x68, 0x0a, 0xf0, 0x4a, 0xf9, 0x6f, 0xe0, 0x30, - 0x68, 0x0a, 0xf0, 0x96, 0xf9, 0x6b, 0xe0, 0x0a, - 0xf0, 0xec, 0xf9, 0x68, 0xe0, 0x03, 0xce, 0x0a, - 0xf0, 0x07, 0xfa, 0x64, 0xe0, 0x03, 0xce, 0x0a, - 0xf0, 0x35, 0xfb, 0x60, 0xe0, 0x30, 0x68, 0x0a, - 0xf0, 0xaf, 0xfb, 0x5c, 0xe0, 0x30, 0x68, 0x0a, - 0xf0, 0xc9, 0xfa, 0x58, 0xe0, 0x03, 0xce, 0x0a, - 0xf0, 0xad, 0xf8, 0x54, 0xe0, 0x03, 0xce, 0x0a, - 0xf0, 0xb8, 0xf8, 0x50, 0xe0, 0x0a, 0xf0, 0xe8, - 0xf9, 0x4d, 0xe0, 0x03, 0xce, 0x0a, 0xf0, 0xac, - 0xf9, 0x49, 0xe0, 0x30, 0x68, 0xa0, 0x63, 0x46, - 0xe0, 0x38, 0x1c, 0x03, 0xf0, 0x76, 0xfd, 0x42, - 0xe0, 0x38, 0x1c, 0x03, 0xf0, 0x83, 0xfd, 0x3e, - 0xe0, 0x38, 0x1c, 0xed, 0x09, 0x00, 0x97, 0x02, - 0x03, 0xf0, 0xd1, 0xfd, 0x3a, 0xe0, 0x38, 0x1c, - 0x03, 0xf0, 0x61, 0xfe, 0x36, 0xe0, 0x38, 0x1c, - 0x03, 0xf0, 0xfd, 0xfe, 0x32, 0xe0, 0x38, 0x1c, - 0x08, 0xf0, 0xa3, 0xfa, 0x2e, 0xe0, 0x38, 0x1c, - 0x03, 0xf0, 0xa1, 0xff, 0x2a, 0xe0, 0x38, 0x1c, - 0x03, 0xf0, 0xbb, 0xff, 0x26, 0xe0, 0x38, 0x1c, - 0x03, 0xf0, 0xcf, 0xff, 0x22, 0xe0, 0x38, 0x1c, - 0x03, 0xf0, 0xdf, 0xff, 0x1e, 0xe0, 0x38, 0x1c, - 0x0a, 0xf0, 0x42, 0xfc, 0x1a, 0xe0, 0x38, 0x1c, - 0x04, 0xf0, 0x37, 0xf9, 0x16, 0xe0, 0x38, 0x1c, - 0x04, 0xf0, 0xea, 0xfd, 0x12, 0xe0, 0x38, 0x1c, - 0x04, 0xf0, 0x1d, 0xf9, 0x0e, 0xe0, 0x38, 0x1c, - 0x08, 0xf0, 0xe1, 0xf8, 0x0a, 0xe0, 0x38, 0x1c, - 0xff, 0xf7, 0x8d, 0xfe, 0x06, 0xe0, 0x38, 0x1c, - 0x04, 0xf0, 0x11, 0xf8, 0x02, 0xe0, 0x38, 0x1c, - 0x04, 0xf0, 0x32, 0xf9, 0x00, 0x2f, 0x00, 0xd1, - 0xaf, 0xe6, 0x38, 0x1c, 0xd7, 0xf7, 0xc3, 0xfc, - 0xab, 0xe6, 0xb8, 0xa8, 0x03, 0x20, 0xff, 0x20, - 0xde, 0x30, 0x70, 0x47, 0xff, 0x20, 0xb0, 0x30, - 0x70, 0x47, 0x80, 0xb4, 0x0f, 0x1c, 0x0c, 0xcf, - 0x01, 0x1c, 0x0c, 0xc1, 0x0c, 0xcf, 0x0c, 0xc1, - 0x01, 0x78, 0xe9, 0x31, 0x01, 0x70, 0x41, 0x78, - 0xe5, 0x23, 0x59, 0x40, 0x41, 0x70, 0x81, 0x78, - 0xdf, 0x31, 0x81, 0x70, 0xc1, 0x78, 0xc1, 0x23, - 0x59, 0x40, 0xc1, 0x70, 0x01, 0x79, 0xb3, 0x31, - 0x01, 0x71, 0x41, 0x79, 0xa7, 0x23, 0x59, 0x40, - 0x41, 0x71, 0x81, 0x79, 0x95, 0x31, 0x81, 0x71, - 0xc1, 0x79, 0x83, 0x23, 0x59, 0x40, 0xc1, 0x71, - 0x01, 0x7a, 0xe9, 0x23, 0x59, 0x40, 0x01, 0x72, - 0x41, 0x7a, 0xe5, 0x31, 0x41, 0x72, 0x81, 0x7a, - 0xdf, 0x23, 0x59, 0x40, 0x81, 0x72, 0xc1, 0x7a, - 0xc1, 0x31, 0xc1, 0x72, 0x01, 0x7b, 0xed, 0x09, - 0x00, 0x98, 0x02, 0xb3, 0x23, 0x59, 0x40, 0x01, - 0x73, 0x41, 0x7b, 0xa7, 0x31, 0x41, 0x73, 0x81, - 0x7b, 0x95, 0x23, 0x59, 0x40, 0x81, 0x73, 0xc1, - 0x7b, 0x83, 0x31, 0xc1, 0x73, 0x80, 0xbc, 0x70, - 0x47, 0xf3, 0xb5, 0x86, 0xb0, 0xf0, 0xc9, 0x68, - 0x46, 0xf0, 0xc0, 0x00, 0x21, 0x00, 0x20, 0x6a, - 0x46, 0x12, 0x5c, 0x06, 0x9c, 0x51, 0x40, 0x09, - 0x06, 0x09, 0x0e, 0x22, 0x54, 0x01, 0x30, 0x10, - 0x28, 0xf5, 0xd3, 0x04, 0xab, 0x00, 0x22, 0x18, - 0x4e, 0x01, 0x20, 0x19, 0x70, 0x00, 0x21, 0x6b, - 0x46, 0x5b, 0x5c, 0xdf, 0x00, 0x5b, 0x09, 0x1f, - 0x43, 0x6b, 0x46, 0x5f, 0x54, 0x01, 0x31, 0x10, - 0x29, 0xf5, 0xd9, 0x11, 0x01, 0x89, 0x18, 0xcf, - 0x1d, 0x01, 0x32, 0x1c, 0x37, 0x00, 0x21, 0x06, - 0x9c, 0x03, 0x01, 0x1b, 0x19, 0x05, 0x92, 0x6c, - 0x46, 0xa5, 0x5c, 0x7c, 0x18, 0x24, 0x06, 0x24, - 0x0e, 0x34, 0x5d, 0x34, 0x5d, 0x2c, 0x19, 0x5c, - 0x54, 0x00, 0x24, 0x10, 0x2a, 0x00, 0xd0, 0x54, - 0x1c, 0x01, 0x31, 0x22, 0x1c, 0x10, 0x29, 0xee, - 0xd3, 0x05, 0x9a, 0x01, 0x30, 0x10, 0x2a, 0xd5, - 0xd3, 0x08, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x88, 0xaf, 0x03, 0x20, 0xf0, - 0xb4, 0x8a, 0xb0, 0x13, 0x78, 0x07, 0x78, 0x0c, - 0x78, 0x7b, 0x40, 0xb7, 0x4f, 0xfb, 0x5c, 0x1b, - 0x19, 0x13, 0x70, 0x53, 0x78, 0x44, 0x78, 0x4d, - 0x78, 0x1c, 0x19, 0xb4, 0x4b, 0x1c, 0x5d, 0x6c, - 0x40, 0x54, 0x70, 0x94, 0x78, 0x85, 0x78, 0x64, - 0x19, 0x1c, 0x5d, 0x8d, 0x78, 0x6c, 0x40, 0x94, - 0x70, 0xd4, 0x78, 0xc5, 0x78, 0x6c, 0x40, 0x3c, - 0x5d, 0xcd, 0x78, 0x64, 0x19, 0xd4, 0x70, 0x14, - 0x79, 0x05, 0x79, 0x6c, 0x40, 0x3c, 0x5d, 0x0d, - 0x79, 0x64, 0x19, 0x14, 0x71, 0x54, 0x79, 0x45, - 0x79, 0xed, 0x09, 0x00, 0x99, 0x02, 0x64, 0x19, - 0x1c, 0x5d, 0x4d, 0x79, 0x6c, 0x40, 0x54, 0x71, - 0x94, 0x79, 0x85, 0x79, 0x64, 0x19, 0x1c, 0x5d, - 0x8d, 0x79, 0x6c, 0x40, 0x94, 0x71, 0xd4, 0x79, - 0xc5, 0x79, 0x6c, 0x40, 0x3c, 0x5d, 0xcd, 0x79, - 0x64, 0x19, 0xd4, 0x71, 0x14, 0x7a, 0x05, 0x7a, - 0x6c, 0x40, 0x3c, 0x5d, 0x0d, 0x7a, 0x64, 0x19, - 0x14, 0x72, 0x54, 0x7a, 0x45, 0x7a, 0x64, 0x19, - 0x1c, 0x5d, 0x4d, 0x7a, 0x6c, 0x40, 0x54, 0x72, - 0x94, 0x7a, 0x85, 0x7a, 0x64, 0x19, 0x1c, 0x5d, - 0x8d, 0x7a, 0x6c, 0x40, 0x94, 0x72, 0xd4, 0x7a, - 0xc5, 0x7a, 0x6c, 0x40, 0x3c, 0x5d, 0xcd, 0x7a, - 0x64, 0x19, 0xd4, 0x72, 0x14, 0x7b, 0x05, 0x7b, - 0x6c, 0x40, 0x3c, 0x5d, 0x0d, 0x7b, 0x64, 0x19, - 0x14, 0x73, 0x54, 0x7b, 0x45, 0x7b, 0x64, 0x19, - 0x1c, 0x5d, 0x4d, 0x7b, 0x6c, 0x40, 0x54, 0x73, - 0x94, 0x7b, 0x85, 0x7b, 0x64, 0x19, 0x1b, 0x5d, - 0x8c, 0x7b, 0x63, 0x40, 0x93, 0x73, 0xd3, 0x7b, - 0xc0, 0x7b, 0xc9, 0x7b, 0x58, 0x40, 0x38, 0x5c, - 0x40, 0x18, 0xd0, 0x73, 0x51, 0x78, 0x10, 0x78, - 0x09, 0x18, 0x51, 0x70, 0x57, 0x78, 0x38, 0x18, - 0x10, 0x70, 0xd1, 0x78, 0x90, 0x78, 0x09, 0x18, - 0xd1, 0x70, 0xd3, 0x78, 0xc0, 0x18, 0x90, 0x70, - 0x50, 0x79, 0x11, 0x79, 0x40, 0x18, 0x50, 0x71, - 0x50, 0x79, 0x09, 0x18, 0x11, 0x71, 0xd4, 0x79, - 0x91, 0x79, 0x64, 0x18, 0xd4, 0x71, 0xd4, 0x79, - 0x09, 0x19, 0x91, 0x71, 0x51, 0x7a, 0x15, 0x7a, - 0x49, 0x19, 0x51, 0x72, 0x51, 0x7a, 0x6d, 0x18, - 0x15, 0x72, 0xd6, 0x7a, 0x95, 0x7a, 0x76, 0x19, - 0xd6, 0x72, 0xd6, 0x7a, 0x09, 0x96, 0xad, 0x19, - 0x95, 0x72, 0x56, 0x7b, 0x15, 0x7b, 0x76, 0x19, - 0x56, 0x73, 0x56, 0x7b, 0x08, 0x96, 0xad, 0x19, - 0x15, 0x73, 0xd5, 0x7b, 0xed, 0x09, 0x00, 0x9a, - 0x02, 0x96, 0x7b, 0xad, 0x19, 0xd5, 0x73, 0xd5, - 0x7b, 0x07, 0x95, 0x75, 0x19, 0x95, 0x73, 0x15, - 0x78, 0x64, 0x19, 0xd4, 0x71, 0xd4, 0x79, 0x06, - 0x94, 0x64, 0x19, 0x14, 0x70, 0x3c, 0x1c, 0x97, - 0x78, 0xe4, 0x19, 0x54, 0x70, 0x54, 0x78, 0x3f, - 0x19, 0x97, 0x70, 0x1f, 0x1c, 0x13, 0x79, 0xff, - 0x18, 0xd7, 0x70, 0xd7, 0x78, 0xdb, 0x19, 0x13, - 0x71, 0x03, 0x1c, 0x90, 0x79, 0x1b, 0x18, 0x53, - 0x71, 0x53, 0x79, 0x3e, 0x1c, 0x25, 0x1c, 0xc0, - 0x18, 0x90, 0x71, 0x10, 0x7a, 0x1f, 0x1c, 0x09, - 0x9b, 0x1b, 0x18, 0xd3, 0x72, 0xd3, 0x7a, 0x05, - 0x93, 0xc0, 0x18, 0x10, 0x72, 0x90, 0x7a, 0x09, - 0x18, 0x51, 0x72, 0x51, 0x7a, 0x04, 0x91, 0x40, - 0x18, 0x90, 0x72, 0x10, 0x7b, 0x07, 0x99, 0x09, - 0x18, 0xd1, 0x73, 0xd1, 0x7b, 0x40, 0x18, 0x10, - 0x73, 0x90, 0x7b, 0x0c, 0x1c, 0x08, 0x99, 0x09, - 0x18, 0x51, 0x73, 0x51, 0x7b, 0x40, 0x18, 0x90, - 0x73, 0x10, 0x78, 0x0b, 0x1c, 0x31, 0x18, 0xd1, - 0x70, 0xd1, 0x78, 0x03, 0x91, 0x08, 0x18, 0x10, - 0x70, 0x90, 0x78, 0x21, 0x18, 0xd1, 0x73, 0xd1, - 0x7b, 0x40, 0x18, 0x90, 0x70, 0x10, 0x79, 0x06, - 0x9c, 0x0e, 0x1c, 0x21, 0x18, 0xd1, 0x71, 0xd1, - 0x79, 0x02, 0x91, 0x40, 0x18, 0x10, 0x71, 0x90, - 0x79, 0x29, 0x18, 0x51, 0x70, 0x51, 0x78, 0x40, - 0x18, 0x90, 0x71, 0x10, 0x7a, 0x0d, 0x1c, 0x39, - 0x18, 0x51, 0x71, 0x57, 0x79, 0xc0, 0x19, 0x10, - 0x72, 0x90, 0x7a, 0x19, 0x18, 0x51, 0x73, 0x53, - 0x7b, 0xc0, 0x18, 0x90, 0x72, 0x11, 0x7b, 0x05, - 0x98, 0x40, 0x18, 0xd0, 0x72, 0x08, 0x1c, 0xd1, - 0x7a, 0x40, 0x18, 0x10, 0x73, 0x0c, 0x1c, 0x91, - 0x7b, 0x04, 0x98, 0x40, 0x18, 0x50, 0x72, 0x50, - 0x7a, 0x09, 0x18, 0x91, 0x73, 0x11, 0x78, 0xed, - 0x09, 0x00, 0x9b, 0x02, 0x5b, 0x18, 0x53, 0x73, - 0x53, 0x7b, 0x59, 0x18, 0x11, 0x70, 0x91, 0x78, - 0x7f, 0x18, 0x57, 0x71, 0x57, 0x79, 0xc9, 0x19, - 0x91, 0x70, 0x11, 0x79, 0x40, 0x18, 0x50, 0x72, - 0x50, 0x7a, 0x08, 0x18, 0x10, 0x71, 0x91, 0x79, - 0x60, 0x18, 0xd0, 0x72, 0xd0, 0x7a, 0x09, 0x18, - 0x91, 0x71, 0x14, 0x7a, 0x31, 0x19, 0xd1, 0x73, - 0xd1, 0x7b, 0x64, 0x18, 0x14, 0x72, 0x2c, 0x1c, - 0x95, 0x7a, 0x64, 0x19, 0x54, 0x70, 0x54, 0x78, - 0x2d, 0x19, 0x95, 0x72, 0x15, 0x7b, 0x03, 0x9e, - 0x76, 0x19, 0xd6, 0x70, 0xd6, 0x78, 0x01, 0x96, - 0xad, 0x19, 0x15, 0x73, 0x95, 0x7b, 0x02, 0x9e, - 0x76, 0x19, 0xd6, 0x71, 0xd6, 0x79, 0x00, 0x96, - 0xad, 0x19, 0x95, 0x73, 0x96, 0x7b, 0x15, 0x78, - 0x16, 0x70, 0x16, 0x7b, 0x96, 0x73, 0x96, 0x7a, - 0x16, 0x73, 0x96, 0x78, 0x96, 0x72, 0x16, 0x7a, - 0x96, 0x70, 0x16, 0x79, 0x16, 0x72, 0x15, 0x71, - 0x00, 0x9e, 0x56, 0x70, 0xd0, 0x71, 0xd7, 0x72, - 0x53, 0x71, 0x54, 0x73, 0x01, 0x9e, 0xd6, 0x73, - 0xd1, 0x70, 0x0a, 0xb0, 0xf0, 0xbc, 0x70, 0x47, - 0x00, 0x00, 0x88, 0xaf, 0x03, 0x20, 0x88, 0xb0, - 0x03, 0x20, 0x90, 0xb5, 0xc8, 0xb0, 0x14, 0x1c, - 0x0f, 0x1c, 0x01, 0x1c, 0x04, 0xaa, 0x10, 0x1c, - 0xff, 0xf7, 0x36, 0xfe, 0x00, 0x2c, 0x04, 0xd0, - 0x68, 0x46, 0x10, 0x22, 0x39, 0x1c, 0xd6, 0xf7, - 0xd4, 0xfe, 0x04, 0xa8, 0x08, 0xa9, 0x3a, 0x1c, - 0xff, 0xf7, 0x71, 0xfe, 0x0c, 0xa8, 0x10, 0xa9, - 0x3a, 0x1c, 0xff, 0xf7, 0x6c, 0xfe, 0x00, 0x2c, - 0x4f, 0xd0, 0x00, 0xa9, 0x09, 0x78, 0x38, 0x78, - 0x48, 0x40, 0x38, 0x70, 0x00, 0xa9, 0x49, 0x78, - 0x78, 0x78, 0x40, 0x18, 0x78, 0x70, 0x00, 0xa9, - 0x89, 0x78, 0xb8, 0x78, 0x40, 0x18, 0xb8, 0x70, - 0x00, 0xa9, 0xed, 0x09, 0x00, 0x9c, 0x02, 0xc9, - 0x78, 0xf8, 0x78, 0x48, 0x40, 0xf8, 0x70, 0x01, - 0xa9, 0x09, 0x78, 0x38, 0x79, 0x48, 0x40, 0x38, - 0x71, 0x01, 0xa9, 0x49, 0x78, 0x78, 0x79, 0x40, - 0x18, 0x78, 0x71, 0x01, 0xa9, 0x89, 0x78, 0xb8, - 0x79, 0x40, 0x18, 0xb8, 0x71, 0x01, 0xa9, 0xc9, - 0x78, 0xf8, 0x79, 0x48, 0x40, 0xf8, 0x71, 0x02, - 0xa9, 0x09, 0x78, 0x38, 0x7a, 0x48, 0x40, 0x38, - 0x72, 0x02, 0xa9, 0x49, 0x78, 0x78, 0x7a, 0x40, - 0x18, 0x78, 0x72, 0x02, 0xa9, 0x89, 0x78, 0xb8, - 0x7a, 0x40, 0x18, 0xb8, 0x72, 0x02, 0xa9, 0xc9, - 0x78, 0xf8, 0x7a, 0x48, 0x40, 0xf8, 0x72, 0x03, - 0xa9, 0x09, 0x78, 0x38, 0x7b, 0x48, 0x40, 0x38, - 0x73, 0x03, 0xa9, 0x49, 0x78, 0x78, 0x7b, 0x40, - 0x18, 0x78, 0x73, 0x03, 0xa9, 0x89, 0x78, 0xb8, - 0x7b, 0x40, 0x18, 0xb8, 0x73, 0x03, 0xa9, 0xc9, - 0x78, 0xf8, 0x7b, 0x48, 0x40, 0xf8, 0x73, 0x14, - 0xa8, 0x18, 0xa9, 0x3a, 0x1c, 0xff, 0xf7, 0x15, - 0xfe, 0x1c, 0xa8, 0x20, 0xa9, 0x3a, 0x1c, 0xff, - 0xf7, 0x10, 0xfe, 0x24, 0xa8, 0x28, 0xa9, 0x3a, - 0x1c, 0xff, 0xf7, 0x0b, 0xfe, 0x2c, 0xa8, 0x30, - 0xa9, 0x3a, 0x1c, 0xff, 0xf7, 0x06, 0xfe, 0x34, - 0xa8, 0x38, 0xa9, 0x3a, 0x1c, 0xff, 0xf7, 0x01, - 0xfe, 0x3c, 0xa8, 0x40, 0xa9, 0x3a, 0x1c, 0xff, - 0xf7, 0xfc, 0xfd, 0x44, 0xa9, 0x09, 0x78, 0x38, - 0x78, 0x48, 0x40, 0x38, 0x70, 0x44, 0xa9, 0x49, - 0x78, 0x78, 0x78, 0x40, 0x18, 0x78, 0x70, 0x44, - 0xa9, 0x89, 0x78, 0xb8, 0x78, 0x40, 0x18, 0xb8, - 0x70, 0x44, 0xa9, 0xc9, 0x78, 0xf8, 0x78, 0x48, - 0x40, 0xf8, 0x70, 0x45, 0xa9, 0x09, 0x78, 0x38, - 0x79, 0x48, 0x40, 0x38, 0x71, 0x45, 0xa9, 0x49, - 0x78, 0x78, 0x79, 0x40, 0x18, 0x78, 0x71, 0x45, - 0xa9, 0x89, 0x78, 0xb8, 0x79, 0xed, 0x09, 0x00, - 0x9d, 0x02, 0x40, 0x18, 0xb8, 0x71, 0x45, 0xa9, - 0xc9, 0x78, 0xf8, 0x79, 0x48, 0x40, 0xf8, 0x71, - 0x46, 0xa9, 0x09, 0x78, 0x38, 0x7a, 0x48, 0x40, - 0x38, 0x72, 0x46, 0xa9, 0x49, 0x78, 0x78, 0x7a, - 0x40, 0x18, 0x78, 0x72, 0x46, 0xa9, 0x89, 0x78, - 0xb8, 0x7a, 0x40, 0x18, 0xb8, 0x72, 0x46, 0xa9, - 0xc9, 0x78, 0xf8, 0x7a, 0x48, 0x40, 0xf8, 0x72, - 0x47, 0xa9, 0x09, 0x78, 0x38, 0x7b, 0x48, 0x40, - 0x38, 0x73, 0x47, 0xa9, 0x49, 0x78, 0x78, 0x7b, - 0x40, 0x18, 0x78, 0x73, 0x47, 0xa9, 0x89, 0x78, - 0xb8, 0x7b, 0x40, 0x18, 0xb8, 0x73, 0x47, 0xa9, - 0xc9, 0x78, 0xf8, 0x7b, 0x48, 0x40, 0xf8, 0x73, - 0x48, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x9f, 0xb5, 0x88, 0xb0, 0x04, 0x1c, 0x68, 0x46, - 0x0f, 0x22, 0x0f, 0x1c, 0xd6, 0xf7, 0xfe, 0xfd, - 0xf8, 0x7b, 0x06, 0x23, 0x0a, 0xa9, 0x58, 0x40, - 0x03, 0xab, 0xd8, 0x70, 0x04, 0xa8, 0x06, 0x22, - 0xd6, 0xf7, 0xf4, 0xfd, 0x06, 0x22, 0x05, 0xa8, - 0x02, 0x30, 0x0a, 0xa9, 0xd6, 0xf7, 0xee, 0xfd, - 0x04, 0x22, 0x07, 0xa8, 0x0a, 0xa9, 0xd6, 0xf7, - 0xe9, 0xfd, 0x68, 0x46, 0x01, 0x22, 0x04, 0xa9, - 0xff, 0xf7, 0x00, 0xff, 0x04, 0xa8, 0x8d, 0xc8, - 0x8d, 0xc4, 0x0c, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xff, 0xb5, 0x8c, 0xb0, 0x0f, 0x1c, - 0x16, 0x9d, 0x04, 0x1c, 0x10, 0x2d, 0x15, 0x99, - 0x00, 0xd9, 0x10, 0x25, 0x08, 0xa8, 0x2a, 0x1c, - 0xd6, 0xf7, 0xd0, 0xfd, 0x10, 0x20, 0x40, 0x1b, - 0x06, 0x26, 0x06, 0x28, 0x00, 0xd8, 0x06, 0x1c, - 0x00, 0x2e, 0x06, 0xd0, 0x08, 0xa8, 0x40, 0x19, - 0x32, 0x1c, 0x0e, 0xa9, 0xd6, 0xf7, 0xc2, 0xfd, - 0xad, 0x19, 0x00, 0x26, 0x28, 0x1c, 0x31, 0x1c, - 0xd6, 0xf7, 0xd2, 0xfc, 0x08, 0xa8, 0x41, 0x5c, - 0xed, 0x09, 0x00, 0x9e, 0x02, 0x68, 0x46, 0x81, - 0x55, 0x01, 0x36, 0x10, 0x2e, 0xf4, 0xd3, 0x0f, - 0x22, 0x39, 0x1c, 0x04, 0xa8, 0xd6, 0xf7, 0xb0, - 0xfd, 0xf8, 0x7b, 0x07, 0xab, 0x04, 0xa9, 0x68, - 0x40, 0xd8, 0x70, 0x68, 0x46, 0x01, 0x22, 0xff, - 0xf7, 0xc3, 0xfe, 0x04, 0xa8, 0xac, 0xc8, 0xac, - 0xc4, 0x10, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x0f, 0xb4, 0xf0, 0xb5, 0x84, 0xb0, 0x14, - 0x1c, 0x10, 0x22, 0x0d, 0x1c, 0x07, 0x1c, 0xd6, - 0xf7, 0x97, 0xfd, 0x00, 0x22, 0x20, 0x1c, 0x39, - 0x1c, 0xff, 0xf7, 0xae, 0xfe, 0x00, 0x20, 0x39, - 0x5c, 0x2a, 0x5c, 0x51, 0x40, 0x39, 0x54, 0x01, - 0x30, 0x10, 0x28, 0xf8, 0xd3, 0x00, 0x25, 0x06, - 0x20, 0x29, 0x1c, 0x7e, 0x5d, 0xd6, 0xf7, 0x9a, - 0xfc, 0x0c, 0xa8, 0x40, 0x5c, 0x30, 0x18, 0x78, - 0x55, 0x01, 0x35, 0x10, 0x2d, 0xf3, 0xd3, 0x68, - 0x46, 0x21, 0x1c, 0xff, 0xf7, 0x93, 0xfc, 0x68, - 0x46, 0x01, 0x22, 0x39, 0x1c, 0xff, 0xf7, 0x90, - 0xfe, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x04, - 0xb0, 0x18, 0x47, 0xff, 0xb5, 0x84, 0xb0, 0x14, - 0x1c, 0x10, 0x22, 0x0d, 0x1c, 0x07, 0x1c, 0xd6, - 0xf7, 0x67, 0xfd, 0x00, 0x22, 0x20, 0x1c, 0x39, - 0x1c, 0xff, 0xf7, 0x7e, 0xfe, 0x00, 0x20, 0x39, - 0x5c, 0x2a, 0x5c, 0x51, 0x40, 0x39, 0x54, 0x01, - 0x30, 0x10, 0x28, 0xf8, 0xd3, 0x00, 0x25, 0x0c, - 0x20, 0x29, 0x1c, 0x7e, 0x5d, 0xd6, 0xf7, 0x6a, - 0xfc, 0x07, 0x9b, 0x58, 0x5c, 0x30, 0x18, 0x78, - 0x55, 0x01, 0x35, 0x10, 0x2d, 0xf3, 0xd3, 0x68, - 0x46, 0x21, 0x1c, 0xff, 0xf7, 0x63, 0xfc, 0x68, - 0x46, 0x01, 0x22, 0x39, 0x1c, 0xff, 0xf7, 0x60, - 0xfe, 0x08, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0xda, - 0xf7, 0x07, 0xfb, 0xed, 0x09, 0x00, 0x9f, 0x02, - 0x05, 0x1c, 0x35, 0xa0, 0x0c, 0x1c, 0x01, 0x68, - 0x00, 0x91, 0x41, 0x68, 0x01, 0x91, 0xf9, 0x1d, - 0x9d, 0x31, 0x08, 0x68, 0x49, 0x68, 0x01, 0xf0, - 0x4c, 0xfe, 0x07, 0x1c, 0x4b, 0xd0, 0x7c, 0x61, - 0x3d, 0x61, 0xf8, 0x6c, 0x00, 0x28, 0x52, 0xd0, - 0xfe, 0x1d, 0x3d, 0x36, 0x03, 0x96, 0x32, 0x68, - 0x28, 0x1c, 0x02, 0x92, 0x73, 0x68, 0x21, 0x1c, - 0x1e, 0x1c, 0xe7, 0xf7, 0x40, 0xf9, 0x00, 0x28, - 0x06, 0xd0, 0x02, 0x98, 0x31, 0x1c, 0x40, 0x1b, - 0xa1, 0x41, 0x01, 0x91, 0x00, 0x90, 0x3e, 0xe0, - 0x02, 0x9a, 0x21, 0x1c, 0xad, 0x1a, 0xb1, 0x41, - 0x0c, 0x1c, 0x1f, 0xe0, 0x02, 0x1c, 0x28, 0x1c, - 0x00, 0x23, 0x21, 0x1c, 0xe7, 0xf7, 0x37, 0xf9, - 0x00, 0x28, 0x15, 0xd0, 0xfa, 0x6c, 0x00, 0x23, - 0x21, 0x1c, 0xad, 0x1a, 0xfa, 0x6c, 0x03, 0x9e, - 0x99, 0x41, 0x0c, 0x1c, 0x03, 0xce, 0x08, 0x3e, - 0x80, 0x18, 0x59, 0x41, 0x03, 0xc6, 0xf8, 0x6c, - 0x16, 0x4b, 0x40, 0x08, 0xf8, 0x64, 0x98, 0x42, - 0x04, 0xd2, 0x00, 0x20, 0xf8, 0x64, 0x01, 0xe0, - 0x74, 0x68, 0x35, 0x68, 0x0f, 0xa6, 0x0c, 0xce, - 0x08, 0x3e, 0x28, 0x1c, 0x21, 0x1c, 0xe7, 0xf7, - 0x96, 0xf8, 0x00, 0x28, 0x0f, 0xd0, 0xf8, 0x6c, - 0x00, 0x28, 0xd3, 0xd1, 0x0b, 0xe0, 0x01, 0xf0, - 0xba, 0xfe, 0x0a, 0x49, 0xca, 0x6a, 0x90, 0x42, - 0x05, 0xd9, 0x88, 0x69, 0x07, 0x4b, 0x58, 0x43, - 0x00, 0x21, 0x01, 0x91, 0x00, 0x90, 0x00, 0x98, - 0x01, 0x99, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x84, 0x1e, 0x00, 0x38, 0xae, - 0x03, 0x20, 0xf0, 0xb5, 0x84, 0xb0, 0x0c, 0x1c, - 0x07, 0x1c, 0xc5, 0x68, 0xda, 0xf7, 0x8b, 0xfa, - 0x00, 0x90, 0xf8, 0x1d, 0xff, 0x30, 0xed, 0x09, - 0x00, 0xa0, 0x02, 0x01, 0x91, 0x01, 0x21, 0x3a, - 0x30, 0x00, 0x22, 0x00, 0x2c, 0x04, 0xd1, 0xea, - 0x64, 0x02, 0x22, 0x2a, 0x65, 0x01, 0x63, 0x5f, - 0xe0, 0x00, 0x22, 0x02, 0x63, 0x29, 0x65, 0xe8, - 0x6c, 0x30, 0x49, 0x00, 0x28, 0x03, 0x91, 0x45, - 0xd0, 0xee, 0x1d, 0x3d, 0x36, 0x02, 0x96, 0x00, - 0x98, 0x01, 0x99, 0x32, 0x68, 0x73, 0x68, 0x1c, - 0x1c, 0x17, 0x1c, 0xe7, 0xf7, 0xb6, 0xf8, 0x00, - 0x28, 0x34, 0xd0, 0x00, 0x98, 0x01, 0x99, 0xc0, - 0x1b, 0xa1, 0x41, 0x04, 0x1c, 0x0f, 0x1c, 0x1e, - 0xe0, 0x02, 0x1c, 0x20, 0x1c, 0x00, 0x23, 0x39, - 0x1c, 0xe7, 0xf7, 0xbf, 0xf8, 0x00, 0x28, 0x15, - 0xd0, 0xea, 0x6c, 0x00, 0x23, 0x39, 0x1c, 0xa4, - 0x1a, 0xea, 0x6c, 0x02, 0x9e, 0x99, 0x41, 0x0f, - 0x1c, 0x03, 0xce, 0x08, 0x3e, 0x80, 0x18, 0x59, - 0x41, 0x03, 0xc6, 0xe8, 0x6c, 0x1a, 0x4b, 0x40, - 0x08, 0xe8, 0x64, 0x98, 0x42, 0x03, 0xd2, 0x00, - 0x20, 0xe8, 0x64, 0x00, 0xe0, 0x90, 0xce, 0x16, - 0xa6, 0x0c, 0xce, 0x08, 0x3e, 0x20, 0x1c, 0x39, - 0x1c, 0xe7, 0xf7, 0x1f, 0xf8, 0x00, 0x28, 0x02, - 0xd0, 0xe8, 0x6c, 0x00, 0x28, 0xd4, 0xd1, 0xe8, - 0x6c, 0x00, 0x28, 0x03, 0xd0, 0xe8, 0x6c, 0x40, - 0x00, 0xe8, 0x64, 0x02, 0xe0, 0x03, 0x99, 0x48, - 0x69, 0xe8, 0x64, 0xe8, 0x6c, 0x03, 0x99, 0x89, - 0x69, 0x88, 0x42, 0x00, 0xd9, 0xe9, 0x64, 0xea, - 0x6c, 0x00, 0x98, 0xef, 0x1d, 0x3d, 0x37, 0x01, - 0x99, 0x00, 0x23, 0x80, 0x18, 0x59, 0x41, 0x03, - 0xc7, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x38, 0xae, 0x03, 0x20, 0x80, - 0x84, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0xb5, 0x07, 0x1c, 0xf9, - 0x6a, 0x00, 0x20, 0x00, 0x29, 0x15, 0xd0, 0x39, - 0x6c, 0xed, 0x09, 0x00, 0xa1, 0x02, 0x00, 0x29, - 0x12, 0xd1, 0xb8, 0x68, 0xf9, 0x68, 0x01, 0xf0, - 0x7b, 0xfa, 0x00, 0x28, 0x05, 0xd0, 0x40, 0x69, - 0x00, 0x28, 0x02, 0xd0, 0x01, 0x20, 0x38, 0x64, - 0x05, 0xe0, 0x00, 0x20, 0xf8, 0x62, 0x38, 0x1c, - 0x03, 0xa1, 0x01, 0xf0, 0xa7, 0xfd, 0x01, 0x20, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x61, 0x75, - 0x74, 0x68, 0x2e, 0x63, 0x3a, 0x20, 0x36, 0x35, - 0x34, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x87, 0xb0, - 0x0f, 0x1c, 0x6d, 0x46, 0x04, 0x1c, 0x47, 0xa0, - 0x11, 0x1c, 0x06, 0x1c, 0x0c, 0xce, 0x0c, 0xc5, - 0x6a, 0x46, 0xd5, 0x1d, 0x01, 0x35, 0x06, 0x95, - 0x06, 0x1c, 0x0c, 0xce, 0x0c, 0xc5, 0xe5, 0x1d, - 0x00, 0x22, 0x01, 0x31, 0x01, 0x35, 0x00, 0x29, - 0x05, 0x91, 0x04, 0x92, 0x6f, 0xd9, 0xfe, 0x1d, - 0x01, 0x36, 0x3e, 0xa3, 0x1a, 0x68, 0x03, 0xcf, - 0x5b, 0x68, 0x08, 0x3f, 0x19, 0x40, 0x10, 0x40, - 0x38, 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0xe6, 0xf7, - 0xa3, 0xff, 0x00, 0x28, 0x0f, 0xd0, 0x02, 0x98, - 0x03, 0x99, 0x0c, 0xcd, 0x08, 0x3d, 0x59, 0x40, - 0x50, 0x40, 0x02, 0x90, 0x03, 0x91, 0x01, 0x99, - 0x00, 0x98, 0x0c, 0xcc, 0x08, 0x3c, 0x59, 0x40, - 0x50, 0x40, 0x00, 0x90, 0x01, 0x91, 0x03, 0xcd, - 0x01, 0x22, 0x08, 0x3d, 0xe7, 0xf7, 0x18, 0xf8, - 0x03, 0xc5, 0x2e, 0xa3, 0x1a, 0x68, 0x03, 0xcc, - 0x5b, 0x68, 0x08, 0x3d, 0x08, 0x3c, 0x19, 0x40, - 0x10, 0x40, 0x26, 0xa3, 0x1a, 0x68, 0x5b, 0x68, - 0xe6, 0xf7, 0x7e, 0xff, 0x00, 0x28, 0x08, 0xd0, - 0x24, 0xa3, 0x1a, 0x68, 0x03, 0xcd, 0x5b, 0x68, - 0x08, 0x3d, 0x19, 0x43, 0x10, 0x43, 0x03, 0xc5, - 0x08, 0x3d, 0x03, 0xcc, 0x01, 0x22, 0x08, 0x3c, - 0xe6, 0xf7, 0xfa, 0xff, 0xed, 0x09, 0x00, 0xa2, - 0x02, 0x03, 0xc4, 0x03, 0xcf, 0x08, 0x3c, 0x01, - 0x22, 0x08, 0x3f, 0xe6, 0xf7, 0x71, 0xff, 0x03, - 0xc7, 0x19, 0xa3, 0x1a, 0x68, 0x03, 0xce, 0x5b, - 0x68, 0x08, 0x3f, 0x08, 0x3e, 0x19, 0x40, 0x10, - 0x40, 0x13, 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0xe6, - 0xf7, 0x59, 0xff, 0x00, 0x28, 0x08, 0xd0, 0x14, - 0xa3, 0x1a, 0x68, 0x03, 0xcf, 0x5b, 0x68, 0x08, - 0x3f, 0x19, 0x43, 0x10, 0x43, 0x03, 0xc7, 0x08, - 0x3f, 0x03, 0xce, 0x01, 0x22, 0x08, 0x3e, 0xe6, - 0xf7, 0x53, 0xff, 0x03, 0xc6, 0x04, 0x99, 0x05, - 0x98, 0x01, 0x31, 0x08, 0x3e, 0x88, 0x42, 0x04, - 0x91, 0x91, 0xd8, 0x06, 0x98, 0x0c, 0xc8, 0x0c, - 0xc5, 0x68, 0x46, 0x28, 0xc8, 0x28, 0xc4, 0x07, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0xf7, 0xb5, 0x81, 0xb0, 0x07, 0x1c, 0xfc, - 0x1d, 0x80, 0x20, 0x86, 0x1a, 0x01, 0x34, 0x00, - 0x25, 0x00, 0x2e, 0x4e, 0xd9, 0x02, 0x99, 0xcb, - 0x1d, 0x01, 0x33, 0x00, 0x93, 0x26, 0xe0, 0x00, - 0x2d, 0x24, 0xd0, 0x03, 0xcc, 0x01, 0x22, 0x08, - 0x3c, 0xe6, 0xf7, 0xa0, 0xff, 0x03, 0xc4, 0x38, - 0xa3, 0x1a, 0x68, 0x03, 0xcf, 0x5b, 0x68, 0x08, - 0x3c, 0x08, 0x3f, 0x19, 0x40, 0x10, 0x40, 0x36, - 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0xe6, 0xf7, 0x06, - 0xff, 0x00, 0x28, 0x08, 0xd0, 0x34, 0xa3, 0x1a, - 0x68, 0x03, 0xcc, 0x5b, 0x68, 0x08, 0x3c, 0x19, - 0x43, 0x10, 0x43, 0x03, 0xc4, 0x08, 0x3c, 0x03, - 0xcf, 0x01, 0x22, 0x08, 0x3f, 0xe6, 0xf7, 0x82, - 0xff, 0x03, 0xc7, 0x08, 0x3f, 0x28, 0xa3, 0x1a, - 0x68, 0x03, 0xcc, 0x5b, 0x68, 0x08, 0x3c, 0xed, - 0x09, 0x00, 0xa3, 0x02, 0x19, 0x40, 0x10, 0x40, - 0x27, 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0xe6, 0xf7, - 0xe8, 0xfe, 0x00, 0x28, 0x11, 0xd0, 0x00, 0x9b, - 0x03, 0xcc, 0x1a, 0x68, 0x5b, 0x68, 0x08, 0x3c, - 0x59, 0x40, 0x50, 0x40, 0x03, 0xc4, 0x02, 0x9b, - 0x03, 0xcf, 0x1a, 0x68, 0x5b, 0x68, 0x08, 0x3c, - 0x08, 0x3f, 0x59, 0x40, 0x50, 0x40, 0x03, 0xc7, - 0x08, 0x3f, 0x01, 0x35, 0xae, 0x42, 0xb5, 0xd8, - 0x00, 0x25, 0x01, 0x3e, 0x27, 0xd0, 0x03, 0xcf, - 0x01, 0x22, 0x08, 0x3f, 0xe6, 0xf7, 0xd3, 0xfe, - 0x03, 0xc7, 0x16, 0xa3, 0x1a, 0x68, 0x03, 0xcc, - 0x5b, 0x68, 0x08, 0x3f, 0x08, 0x3c, 0x19, 0x40, - 0x10, 0x40, 0x10, 0xa3, 0x1a, 0x68, 0x5b, 0x68, - 0xe6, 0xf7, 0xbb, 0xfe, 0x00, 0x28, 0x08, 0xd0, - 0x0b, 0xa3, 0x1a, 0x68, 0x03, 0xcf, 0x5b, 0x68, - 0x08, 0x3f, 0x19, 0x43, 0x10, 0x43, 0x03, 0xc7, - 0x08, 0x3f, 0x03, 0xcc, 0x01, 0x22, 0x08, 0x3c, - 0xe6, 0xf7, 0xb5, 0xfe, 0x03, 0xc4, 0x08, 0x3c, - 0x01, 0x35, 0xae, 0x42, 0xd7, 0xd8, 0x04, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb5, - 0xff, 0xb0, 0x88, 0xb0, 0x04, 0x1c, 0x77, 0x20, - 0x78, 0x90, 0x70, 0x20, 0x79, 0x90, 0x68, 0x20, - 0x7a, 0x90, 0x60, 0x20, 0x7b, 0x90, 0x58, 0x20, - 0x7c, 0x90, 0x4d, 0x20, 0x7d, 0x90, 0x47, 0x20, - 0x7e, 0x90, 0x3f, 0x20, 0x7f, 0x90, 0x31, 0x20, - 0x80, 0x90, 0x2a, 0x20, 0x81, 0x90, 0x23, 0x20, - 0x82, 0x90, 0x1c, 0x20, 0x83, 0x90, 0x15, 0x20, - 0x84, 0x90, 0x0e, 0x20, 0x85, 0x90, 0x07, 0x20, - 0x86, 0x90, 0x0f, 0x1c, 0x9d, 0xa1, 0x60, 0xc9, - 0x3e, 0xa8, 0xed, 0x09, 0x00, 0xa4, 0x02, 0x60, - 0xc0, 0x9d, 0xa0, 0x05, 0x1c, 0x48, 0xcd, 0x3c, - 0xa9, 0x48, 0xc1, 0x9c, 0xa5, 0x48, 0xcd, 0x69, - 0x46, 0x08, 0x31, 0x48, 0xc1, 0x9c, 0xa5, 0x48, - 0xcd, 0x69, 0x46, 0x48, 0xc1, 0x9c, 0xa5, 0x48, - 0xcd, 0x42, 0xa9, 0x48, 0xc1, 0x05, 0x1c, 0x48, - 0xcd, 0x40, 0xa9, 0x48, 0xc1, 0x9a, 0xa5, 0x48, - 0xcd, 0x69, 0x46, 0x18, 0x31, 0x48, 0xc1, 0x99, - 0xa5, 0x48, 0xcd, 0x69, 0x46, 0x10, 0x31, 0x48, - 0xc1, 0x99, 0xa5, 0x48, 0xcd, 0x46, 0xa9, 0x48, - 0xc1, 0x05, 0x1c, 0x48, 0xcd, 0x44, 0xa9, 0x48, - 0xc1, 0x97, 0xa5, 0x48, 0xcd, 0x69, 0x46, 0x28, - 0x31, 0x48, 0xc1, 0x96, 0xa5, 0x48, 0xcd, 0x69, - 0x46, 0x20, 0x31, 0x48, 0xc1, 0x96, 0xa5, 0x48, - 0xcd, 0x4a, 0xa9, 0x48, 0xc1, 0x05, 0x1c, 0x48, - 0xcd, 0x48, 0xa9, 0x48, 0xc1, 0x94, 0xa5, 0x48, - 0xcd, 0x69, 0x46, 0x38, 0x31, 0x48, 0xc1, 0x93, - 0xa5, 0x48, 0xcd, 0x69, 0x46, 0x30, 0x31, 0x48, - 0xc1, 0x93, 0xa5, 0x48, 0xcd, 0x4e, 0xa9, 0x48, - 0xc1, 0x05, 0x1c, 0x48, 0xcd, 0x4c, 0xa9, 0x48, - 0xc1, 0x91, 0xa5, 0x48, 0xcd, 0x69, 0x46, 0x48, - 0x31, 0x48, 0xc1, 0x90, 0xa5, 0x48, 0xcd, 0x69, - 0x46, 0x40, 0x31, 0x48, 0xc1, 0x90, 0xa5, 0x48, - 0xcd, 0x52, 0xa9, 0x48, 0xc1, 0x05, 0x1c, 0x48, - 0xcd, 0x50, 0xa9, 0x48, 0xc1, 0x8e, 0xa5, 0x48, - 0xcd, 0x69, 0x46, 0x58, 0x31, 0x48, 0xc1, 0x8d, - 0xa5, 0x48, 0xcd, 0x69, 0x46, 0x50, 0x31, 0x48, - 0xc1, 0x8d, 0xa5, 0x48, 0xcd, 0x56, 0xa9, 0x48, - 0xc1, 0x05, 0x1c, 0x48, 0xcd, 0x54, 0xa9, 0x48, - 0xc1, 0x8b, 0xa5, 0x48, 0xcd, 0x69, 0x46, 0x68, - 0x31, 0x48, 0xc1, 0x8a, 0xa5, 0x48, 0xcd, 0x69, - 0x46, 0x60, 0x31, 0x48, 0xc1, 0x8a, 0xa5, 0x48, - 0xcd, 0x5a, 0xa9, 0x48, 0xc1, 0xed, 0x09, 0x00, - 0xa5, 0x02, 0x8a, 0xa1, 0x0e, 0x1c, 0x0c, 0xce, - 0x58, 0xad, 0x0c, 0xc5, 0x6a, 0x46, 0xd5, 0x1d, - 0x06, 0x1c, 0x0c, 0xce, 0x71, 0x35, 0x0c, 0xc5, - 0x6a, 0x46, 0xd5, 0x1d, 0x85, 0xa6, 0x0c, 0xce, - 0x69, 0x35, 0x0c, 0xc5, 0x85, 0xa6, 0x0c, 0xce, - 0x5e, 0xad, 0x0c, 0xc5, 0x85, 0xa6, 0x0c, 0xce, - 0x5c, 0xad, 0x0c, 0xc5, 0x6a, 0x46, 0xd5, 0x1d, - 0x06, 0x1c, 0x0c, 0xce, 0x81, 0x35, 0x0c, 0xc5, - 0x6a, 0x46, 0xd5, 0x1d, 0x81, 0xa6, 0x0c, 0xce, - 0x79, 0x35, 0x0c, 0xc5, 0x0e, 0x1c, 0x0c, 0xce, - 0x62, 0xad, 0x0c, 0xc5, 0x7f, 0xa6, 0x0c, 0xce, - 0x60, 0xad, 0x0c, 0xc5, 0x6a, 0x46, 0xd5, 0x1d, - 0x06, 0x1c, 0x0c, 0xce, 0x91, 0x35, 0x0c, 0xc5, - 0x6a, 0x46, 0xd5, 0x1d, 0x7b, 0xa6, 0x0c, 0xce, - 0x89, 0x35, 0x0c, 0xc5, 0x0e, 0x1c, 0x0c, 0xce, - 0x66, 0xad, 0x0c, 0xc5, 0x79, 0xa6, 0x0c, 0xce, - 0x64, 0xad, 0x0c, 0xc5, 0x6a, 0x46, 0xd5, 0x1d, - 0x06, 0x1c, 0x0c, 0xce, 0xa1, 0x35, 0x0c, 0xc5, - 0x6a, 0x46, 0xd5, 0x1d, 0x75, 0xa6, 0x0c, 0xce, - 0x99, 0x35, 0x0c, 0xc5, 0x0e, 0x1c, 0x0c, 0xce, - 0x6a, 0xad, 0x0c, 0xc5, 0x73, 0xa6, 0x0c, 0xce, - 0x68, 0xad, 0x0c, 0xc5, 0x6a, 0x46, 0xd5, 0x1d, - 0x06, 0x1c, 0x0c, 0xce, 0xb1, 0x35, 0x0c, 0xc5, - 0x6a, 0x46, 0xd5, 0x1d, 0x6f, 0xa6, 0x0c, 0xce, - 0xa9, 0x35, 0x0c, 0xc5, 0x0e, 0x1c, 0x0c, 0xce, - 0x6e, 0xad, 0x0c, 0xc5, 0x6d, 0xa6, 0x0c, 0xce, - 0x6c, 0xad, 0x0c, 0xc5, 0x6a, 0x46, 0xd5, 0x1d, - 0x06, 0x1c, 0x0c, 0xce, 0xc1, 0x35, 0x0c, 0xc5, - 0x6a, 0x46, 0xd5, 0x1d, 0x69, 0xa6, 0x0c, 0xce, - 0xb9, 0x35, 0x0c, 0xc5, 0x0e, 0x1c, 0x0c, 0xce, - 0x72, 0xad, 0x0c, 0xc5, 0x67, 0xa6, 0x0c, 0xce, - 0x70, 0xad, 0x0c, 0xc5, 0x6a, 0x46, 0xd5, 0x1d, - 0xed, 0x09, 0x00, 0xa6, 0x02, 0x06, 0x1c, 0x0c, - 0xce, 0xd1, 0x35, 0x0c, 0xc5, 0x6a, 0x46, 0xd5, - 0x1d, 0x63, 0xa6, 0x0c, 0xce, 0xc9, 0x35, 0x0c, - 0xc5, 0x48, 0xc9, 0x76, 0xad, 0x48, 0xc5, 0x62, - 0xa5, 0x48, 0xcd, 0x74, 0xa9, 0x48, 0xc1, 0x60, - 0xc8, 0x69, 0x46, 0xe8, 0x31, 0x60, 0xc1, 0x60, - 0xa1, 0x68, 0x46, 0xe0, 0x30, 0x60, 0xc9, 0x60, - 0xc0, 0x00, 0x2f, 0x18, 0xd0, 0x10, 0x2f, 0x16, - 0xd8, 0x10, 0x2f, 0x14, 0xd2, 0xfa, 0x00, 0x3d, - 0x01, 0x3c, 0xa8, 0x28, 0x18, 0xc1, 0x1f, 0x09, - 0x39, 0x20, 0x1c, 0xff, 0xf7, 0x1f, 0xfe, 0xb8, - 0x00, 0x78, 0xa9, 0x40, 0x18, 0x40, 0x38, 0xc2, - 0x6b, 0x28, 0x1c, 0x68, 0x44, 0xc1, 0x1f, 0x09, - 0x39, 0x20, 0x1c, 0xff, 0xf7, 0x73, 0xfd, 0x7f, - 0xb0, 0x08, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd4, 0x18, 0xd2, 0xab, 0xa0, 0x75, 0xe2, - 0x00, 0x8f, 0xb0, 0x6c, 0xbf, 0x9b, 0x8b, 0x92, - 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, - 0x80, 0xb3, 0x59, 0x76, 0x3d, 0xf6, 0xe3, 0x01, - 0x00, 0xef, 0xef, 0xf6, 0xcf, 0x58, 0xc2, 0x18, - 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x6d, 0x00, - 0x80, 0x3a, 0x6c, 0x6c, 0xf6, 0xbe, 0x01, 0x00, - 0x00, 0x8b, 0x80, 0x19, 0x19, 0x5a, 0x0a, 0x03, - 0xb1, 0x00, 0x00, 0x00, 0x80, 0x57, 0x00, 0x00, - 0x80, 0x69, 0x99, 0xb8, 0x6a, 0x01, 0x00, 0x00, - 0x00, 0xd9, 0x6a, 0x73, 0xd3, 0x7f, 0x46, 0x17, - 0xde, 0x00, 0x00, 0x80, 0x1c, 0x00, 0x00, 0x00, - 0x80, 0x32, 0x06, 0x63, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x47, 0x52, 0x71, 0x55, 0xec, 0x50, 0xda, - 0x91, 0x00, 0x80, 0x48, 0x01, 0x00, 0x00, 0x00, - 0x80, 0x93, 0x2c, 0xed, 0x09, 0x00, 0xa7, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x83, - 0x46, 0x54, 0xc0, 0x6c, 0xaa, 0x52, 0x80, 0x4a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb3, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xa0, - 0xf3, 0x79, 0xe2, 0xfc, 0xff, 0xf7, 0x0d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x25, 0x80, - 0xec, 0xc7, 0x5b, 0x81, 0xab, 0xa1, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x4d, 0xb0, - 0xd8, 0x11, 0x80, 0xc9, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x0a, 0x01, 0xbb, 0xa4, - 0xf9, 0x24, 0x8e, 0x05, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x9d, 0x00, 0x00, 0xd7, 0x24, - 0x60, 0xa7, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0x6e, 0x00, 0x00, 0x00, 0xb9, 0x26, - 0x9c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x4e, 0x02, 0x00, 0x00, 0x00, 0xe3, 0xd9, - 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x43, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb5, - 0x82, 0xb0, 0x0c, 0x1c, 0xc1, 0x1d, 0xff, 0x31, - 0x7a, 0x31, 0x43, 0x23, 0x1b, 0x01, 0x49, 0x6b, - 0xc7, 0x18, 0x00, 0x29, 0x22, 0xd0, 0x06, 0x33, - 0x01, 0x69, 0xc4, 0x18, 0x01, 0x29, 0x10, 0xd1, - 0x68, 0x46, 0xfd, 0xf7, 0x8a, 0xff, 0x69, 0x46, - 0x06, 0x22, 0x38, 0x1c, 0xd6, 0xf7, 0xcf, 0xf8, - 0x69, 0x46, 0x06, 0x22, 0x20, 0x1c, 0xd6, 0xf7, - 0xca, 0xf8, 0x02, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xc1, 0x1d, 0x9d, 0x31, 0xed, 0x09, - 0x00, 0xa8, 0x02, 0x38, 0x1c, 0x06, 0x22, 0x0d, - 0x1c, 0xd6, 0xf7, 0xbf, 0xf8, 0x06, 0x22, 0x20, - 0x1c, 0x29, 0x1c, 0xd6, 0xf7, 0xba, 0xf8, 0xee, - 0xe7, 0x06, 0x4b, 0x0c, 0x22, 0xc0, 0x18, 0x21, - 0x1c, 0xd6, 0xf7, 0xb3, 0xf8, 0x0c, 0x22, 0x38, - 0x1c, 0x21, 0x1c, 0xd6, 0xf7, 0xae, 0xf8, 0xe2, - 0xe7, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0xc2, - 0x1d, 0xff, 0x32, 0x3a, 0x32, 0x00, 0x21, 0xd1, - 0x62, 0x00, 0x22, 0xff, 0x30, 0x00, 0x23, 0x75, - 0x30, 0x0e, 0xc0, 0x08, 0xc0, 0x70, 0x47, 0xb0, - 0xb5, 0x04, 0x1c, 0xff, 0x30, 0xc1, 0x30, 0x0d, - 0x1c, 0xc1, 0x68, 0x00, 0x27, 0x00, 0x29, 0x10, - 0xd0, 0x00, 0x21, 0xc1, 0x60, 0xd6, 0xf7, 0x2a, - 0xfc, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, 0x08, - 0xe0, 0xb8, 0x21, 0x01, 0x60, 0xe1, 0x6a, 0x01, - 0x61, 0xc5, 0x60, 0x01, 0x1c, 0x05, 0x20, 0xd6, - 0xf7, 0x8c, 0xfc, 0x38, 0x1c, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xf3, 0xb5, 0x89, 0xb0, 0x07, - 0x1c, 0xff, 0x30, 0x81, 0x30, 0xf9, 0x1d, 0x9d, - 0x31, 0x00, 0x6a, 0x00, 0x24, 0x00, 0x25, 0x00, - 0x28, 0x08, 0x91, 0x03, 0xd0, 0xfd, 0x1d, 0xff, - 0x35, 0x9e, 0x35, 0x20, 0xe0, 0xf8, 0x1d, 0xff, - 0x30, 0x3a, 0x30, 0x07, 0x90, 0xfe, 0x1d, 0xff, - 0x36, 0xc0, 0x6a, 0x6e, 0x36, 0x00, 0x28, 0x01, - 0xd0, 0x35, 0x1c, 0x14, 0xe0, 0x08, 0x99, 0x08, - 0x68, 0x49, 0x68, 0x01, 0xf0, 0x7c, 0xf9, 0x00, - 0x28, 0x0d, 0xd0, 0xc1, 0x6a, 0x00, 0x29, 0x0a, - 0xd0, 0xc1, 0x1d, 0x29, 0x31, 0x0c, 0xc9, 0x30, - 0x1c, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x07, - 0x99, 0x01, 0x20, 0xc8, 0x62, 0x35, 0x1c, 0x00, - 0x2d, 0x25, 0xd0, 0x01, 0xa8, 0xfd, 0xf7, 0xff, - 0xfe, 0x02, 0x9a, 0x0a, 0x99, 0x00, 0x92, 0x2a, - 0x1c, 0xed, 0x09, 0x00, 0xa9, 0x02, 0x01, 0x9b, - 0x03, 0xa8, 0xff, 0xf7, 0xa1, 0xfa, 0x04, 0x21, - 0x09, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x00, 0x91, - 0x03, 0xaa, 0x01, 0x92, 0x42, 0x6b, 0x0c, 0x21, - 0x01, 0x23, 0x38, 0x1c, 0x07, 0xf0, 0x89, 0xfa, - 0x04, 0x1c, 0x27, 0xd1, 0x00, 0x22, 0x2a, 0x21, - 0x38, 0x1c, 0x02, 0xf0, 0x15, 0xfc, 0x00, 0x28, - 0x20, 0xd1, 0x38, 0x1c, 0x04, 0xa9, 0xff, 0xf7, - 0x3f, 0xff, 0x1b, 0xe0, 0x10, 0x4b, 0x0a, 0x99, - 0xf8, 0x18, 0x10, 0x22, 0xd6, 0xf7, 0x20, 0xf8, - 0xd6, 0xf7, 0xb7, 0xfb, 0x05, 0x1c, 0x11, 0xd0, - 0x00, 0x22, 0x18, 0x21, 0x38, 0x1c, 0x02, 0xf0, - 0xff, 0xfb, 0x00, 0x28, 0x0a, 0xd1, 0xcd, 0x20, - 0x28, 0x60, 0x08, 0x99, 0xe8, 0x1d, 0x88, 0xc9, - 0x05, 0x30, 0x88, 0xc0, 0x05, 0x20, 0x29, 0x1c, - 0xd6, 0xf7, 0x12, 0xfc, 0x20, 0x1c, 0x0b, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x04, 0x04, 0x00, 0x00, 0xb0, 0xb5, 0x82, 0xb0, - 0x07, 0x1c, 0x80, 0x6a, 0x1c, 0x1c, 0x00, 0x28, - 0x04, 0xd0, 0x01, 0x20, 0xf9, 0x1d, 0xb9, 0x31, - 0x48, 0x62, 0x12, 0xe0, 0x0b, 0x4b, 0x10, 0x20, - 0xf9, 0x18, 0x0d, 0x1c, 0xba, 0x61, 0xfe, 0xf7, - 0xed, 0xfb, 0x10, 0x21, 0x00, 0x91, 0x0b, 0x21, - 0x01, 0x23, 0x38, 0x1c, 0x22, 0x1c, 0x01, 0x95, - 0x07, 0xf0, 0x3b, 0xfa, 0x38, 0x1c, 0x01, 0xf0, - 0x17, 0xf8, 0x02, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x04, 0x04, 0x00, 0x00, - 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, 0x07, 0xf0, - 0x14, 0xf8, 0x09, 0x23, 0x9b, 0x01, 0xf9, 0x18, - 0x48, 0x63, 0x03, 0x1c, 0x38, 0x1c, 0x21, 0x22, - 0x21, 0x1c, 0xff, 0xf7, 0xcb, 0xff, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x09, 0x23, - 0x9b, 0x01, 0xc2, 0x18, 0xed, 0x09, 0x00, 0xaa, - 0x02, 0x53, 0x6b, 0x1e, 0x22, 0xff, 0xf7, 0xc0, - 0xff, 0x08, 0xbc, 0x18, 0x47, 0x88, 0xb5, 0x07, - 0x1c, 0xff, 0x30, 0x41, 0x30, 0xc0, 0x6a, 0x00, - 0x28, 0x0f, 0xd0, 0x00, 0x23, 0x21, 0x22, 0x38, - 0x1c, 0xff, 0xf7, 0xb2, 0xff, 0xb8, 0x6a, 0x00, - 0x28, 0x07, 0xd1, 0x06, 0xa2, 0x00, 0x92, 0x0b, - 0x22, 0x23, 0x23, 0x01, 0x21, 0x38, 0x1c, 0x07, - 0xf0, 0x82, 0xfa, 0x88, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x75, 0x62, 0x53, 0x74, - 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x4c, 0x69, 0x6e, - 0x6b, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x4f, 0x6b, 0x00, 0x00, 0x00, 0xb5, 0xfd, - 0x23, 0x9b, 0x00, 0xc1, 0x18, 0x02, 0xa2, 0x03, - 0xf0, 0x25, 0xfe, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0x4c, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x53, - 0x75, 0x62, 0x53, 0x74, 0x49, 0x6e, 0x69, 0x74, - 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, - 0x69, 0x6e, 0x6b, 0x4b, 0x65, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x00, 0x00, 0x00, 0x08, 0xb5, 0x09, - 0x23, 0x9b, 0x01, 0xc1, 0x18, 0x05, 0xa2, 0x00, - 0x92, 0x05, 0x23, 0x09, 0x22, 0x09, 0x6b, 0x07, - 0xf0, 0x3a, 0xfa, 0x01, 0xb0, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x75, 0x62, 0x53, 0x74, - 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6c, 0x6c, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x4b, - 0x65, 0x79, 0x49, 0x6e, 0x64, 0x53, 0x52, 0xed, - 0x09, 0x00, 0xab, 0x02, 0x65, 0x73, 0x46, 0x61, - 0x69, 0x6c, 0x75, 0x72, 0x65, 0x00, 0x90, 0xb5, - 0x04, 0x1c, 0xd6, 0xf7, 0xd7, 0xfa, 0x07, 0x1c, - 0x12, 0xd0, 0x20, 0x1c, 0x06, 0xf0, 0x76, 0xff, - 0x09, 0x23, 0x9b, 0x01, 0xe1, 0x18, 0x48, 0x63, - 0xcd, 0x20, 0x38, 0x60, 0xe1, 0x1d, 0x9d, 0x31, - 0x18, 0xc9, 0xf8, 0x1d, 0x05, 0x30, 0x18, 0xc0, - 0x05, 0x20, 0x39, 0x1c, 0xd6, 0xf7, 0x31, 0xfb, - 0x90, 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0xc9, 0x69, 0x09, 0x78, 0xc9, 0x07, 0xc9, 0x0f, - 0xff, 0x30, 0xff, 0x30, 0x42, 0x30, 0x41, 0x63, - 0x00, 0x20, 0x70, 0x47, 0x90, 0xb5, 0x07, 0x1c, - 0xc8, 0x69, 0x01, 0x78, 0xcc, 0x07, 0xe4, 0x0f, - 0xfd, 0x23, 0x9b, 0x00, 0x41, 0x1c, 0xf8, 0x18, - 0x10, 0x22, 0xd5, 0xf7, 0x0e, 0xff, 0x09, 0x23, - 0x9b, 0x01, 0xf8, 0x18, 0x04, 0x63, 0x00, 0x22, - 0x1f, 0x21, 0x38, 0x1c, 0x02, 0xf0, 0xed, 0xfa, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0xc4, 0x1d, 0xff, 0x34, 0x0c, 0xc9, 0x6e, 0x34, - 0x0c, 0xc4, 0x0c, 0xc9, 0x0c, 0xc4, 0xc2, 0x1d, - 0xff, 0x32, 0x3a, 0x32, 0x01, 0x21, 0xd1, 0x62, - 0x00, 0x22, 0x00, 0x27, 0x27, 0x21, 0x02, 0xf0, - 0xd8, 0xfa, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x80, 0xb5, 0x00, 0x27, 0x04, 0xf0, - 0xaa, 0xfd, 0x38, 0x1c, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf0, 0xb5, 0x87, 0xb0, 0x0d, 0x1c, - 0xc1, 0x1d, 0x07, 0x1c, 0x28, 0x1c, 0x4d, 0xc8, - 0xff, 0x31, 0x6e, 0x31, 0x4d, 0xc1, 0xf8, 0x1d, - 0xff, 0x30, 0x3a, 0x30, 0x01, 0x26, 0xc6, 0x62, - 0x38, 0x69, 0x00, 0x24, 0x01, 0x28, 0x05, 0xd1, - 0x00, 0x22, 0x27, 0x21, 0x38, 0x1c, 0x02, 0xf0, - 0xb4, 0xfa, 0x24, 0xe0, 0x01, 0xa8, 0xfd, 0xf7, - 0x7e, 0xfd, 0xed, 0x09, 0x00, 0xac, 0x02, 0x13, - 0x4b, 0x02, 0x9a, 0xf9, 0x18, 0x00, 0x92, 0x2a, - 0x1c, 0x01, 0x9b, 0x03, 0xa8, 0xff, 0xf7, 0x1f, - 0xf9, 0x04, 0x21, 0x03, 0xaa, 0x01, 0x92, 0x00, - 0x91, 0x0c, 0x21, 0x00, 0x22, 0x01, 0x23, 0x38, - 0x1c, 0x07, 0xf0, 0x0a, 0xf9, 0x04, 0x1c, 0x03, - 0xd1, 0x38, 0x1c, 0x04, 0xa9, 0xff, 0xf7, 0xc7, - 0xfd, 0x09, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x46, - 0x63, 0x00, 0x22, 0x2a, 0x21, 0x38, 0x1c, 0x02, - 0xf0, 0x8e, 0xfa, 0x20, 0x1c, 0x07, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x04, - 0x04, 0x00, 0x00, 0x98, 0xb5, 0x07, 0x1c, 0x06, - 0xf0, 0xdf, 0xfe, 0x07, 0xa2, 0x00, 0x92, 0x0b, - 0x22, 0x01, 0x1c, 0x06, 0x23, 0x38, 0x1c, 0x07, - 0xf0, 0x6b, 0xf9, 0x04, 0x1c, 0x38, 0x1c, 0x04, - 0xf0, 0x50, 0xfd, 0x20, 0x1c, 0x98, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x41, 0x75, 0x74, - 0x68, 0x53, 0x75, 0x62, 0x53, 0x74, 0x43, 0x6f, - 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x41, - 0x6e, 0x73, 0x77, 0x65, 0x72, 0x4b, 0x65, 0x79, - 0x52, 0x65, 0x71, 0x4c, 0x69, 0x6e, 0x6b, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x45, - 0x72, 0x72, 0x00, 0x90, 0xb5, 0x87, 0xb0, 0x07, - 0x1c, 0x0c, 0x1c, 0x0c, 0xc9, 0xff, 0x30, 0x75, - 0x30, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0xf9, - 0x1d, 0xff, 0x31, 0x01, 0x20, 0x3a, 0x31, 0xc8, - 0x62, 0x01, 0xa8, 0xfd, 0xf7, 0x16, 0xfd, 0x10, - 0x4b, 0x02, 0x9a, 0xf9, 0x18, 0x00, 0x92, 0x22, - 0x1c, 0x01, 0x9b, 0x03, 0xa8, 0xff, 0xf7, 0xb7, - 0xf8, 0x04, 0x21, 0x09, 0x23, 0x9b, 0x01, 0xf8, - 0x18, 0x00, 0x91, 0x03, 0xaa, 0x01, 0x92, 0x42, - 0x6b, 0x0c, 0x21, 0x01, 0x23, 0x38, 0x1c, 0x07, - 0xf0, 0x9f, 0xf8, 0x04, 0x1c, 0xed, 0x09, 0x00, - 0xad, 0x02, 0x03, 0xd1, 0x38, 0x1c, 0x04, 0xa9, - 0xff, 0xf7, 0x5c, 0xfd, 0x20, 0x1c, 0x07, 0xb0, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x04, 0x04, 0x00, 0x00, 0x08, 0xb5, 0x09, 0x23, - 0x9b, 0x01, 0xc1, 0x18, 0x04, 0xa2, 0x00, 0x92, - 0x06, 0x23, 0x0b, 0x22, 0x49, 0x6b, 0x07, 0xf0, - 0x0a, 0xf9, 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, - 0x4c, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x53, 0x75, - 0x62, 0x53, 0x74, 0x52, 0x65, 0x73, 0x70, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x4c, 0x69, 0x6e, - 0x6b, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x45, 0x72, 0x72, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb5, 0xc9, 0x69, 0x01, 0x31, 0xff, 0xf7, - 0x95, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x0c, 0x1c, 0x0a, 0xa1, 0x07, 0x1c, 0xff, 0xf7, - 0x63, 0xfd, 0x38, 0x1c, 0x21, 0x1c, 0xff, 0xf7, - 0x43, 0xf9, 0x23, 0x2c, 0x06, 0xd1, 0x78, 0x69, - 0x0e, 0x28, 0x03, 0xd1, 0x38, 0x1c, 0x21, 0x1c, - 0xff, 0xf7, 0x62, 0xfd, 0x90, 0xbc, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x4c, 0x6d, 0x41, 0x75, - 0x74, 0x68, 0x53, 0x75, 0x62, 0x53, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x52, 0x65, 0x71, 0x49, 0x6e, - 0x64, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x41, - 0x75, 0x52, 0x61, 0x6e, 0x64, 0x45, 0x72, 0x72, - 0x00, 0x00, 0x00, 0x00, 0x80, 0xb5, 0xc9, 0x69, - 0x05, 0x4b, 0x01, 0x31, 0xc0, 0x18, 0x00, 0x27, - 0x10, 0x22, 0xd5, 0xf7, 0xdf, 0xfd, 0x38, 0x1c, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x04, 0x04, 0x00, 0x00, 0x98, 0xb5, 0x00, 0x24, - 0x07, 0x1c, 0xc8, 0x69, 0x01, 0x78, 0x3a, 0x69, - 0xc9, 0x07, 0xc9, 0x0f, 0x01, 0x2a, 0x08, 0xd1, - 0x0b, 0xa2, 0x00, 0x92, 0x0b, 0x22, 0x23, 0x23, - 0xed, 0x09, 0x00, 0xae, 0x02, 0x38, 0x1c, 0x07, - 0xf0, 0xa0, 0xf8, 0x04, 0x1c, 0x0a, 0xe0, 0x0e, - 0x4b, 0x41, 0x1c, 0xf8, 0x18, 0x10, 0x22, 0xd5, - 0xf7, 0xbf, 0xfd, 0x00, 0x22, 0x2f, 0x21, 0x38, - 0x1c, 0x02, 0xf0, 0xa2, 0xf9, 0x20, 0x1c, 0x98, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x75, 0x62, 0x53, 0x74, - 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x52, - 0x65, 0x71, 0x53, 0x52, 0x65, 0x73, 0x00, 0x00, - 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0xb5, 0x00, - 0x22, 0x67, 0x21, 0x02, 0xf0, 0xc5, 0xf9, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x02, 0xa1, 0xff, - 0xf7, 0xf1, 0xfc, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0x4c, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x53, - 0x75, 0x62, 0x53, 0x74, 0x49, 0x6e, 0x69, 0x74, - 0x52, 0x65, 0x71, 0x49, 0x6e, 0x64, 0x41, 0x6e, - 0x73, 0x77, 0x65, 0x72, 0x41, 0x75, 0x52, 0x61, - 0x6e, 0x64, 0x45, 0x72, 0x72, 0x00, 0x00, 0x00, - 0x00, 0xb0, 0xb5, 0x07, 0x1c, 0xc8, 0x69, 0x00, - 0x78, 0xc5, 0x07, 0xed, 0x0f, 0x0c, 0x1c, 0x38, - 0x1c, 0x29, 0x1c, 0x03, 0xf0, 0x75, 0xfb, 0x00, - 0x28, 0x0b, 0xd1, 0x09, 0x23, 0x9b, 0x01, 0xf8, - 0x18, 0x05, 0x63, 0xe0, 0x69, 0xfd, 0x23, 0x9b, - 0x00, 0x41, 0x1c, 0xf8, 0x18, 0x10, 0x22, 0xd5, - 0xf7, 0x6b, 0xfd, 0xb0, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, 0x40, - 0x69, 0x0e, 0x28, 0x03, 0xd1, 0x22, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0xc0, 0xfc, 0x38, 0x1c, 0x03, - 0xa1, 0xff, 0xf7, 0xb0, 0xfc, 0x80, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x4c, 0x6d, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x75, 0x62, 0x53, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x54, 0x69, 0x6d, 0xed, 0x09, 0x00, 0xaf, 0x02, - 0x65, 0x6f, 0x75, 0x74, 0x00, 0x00, 0x90, 0xb5, - 0x07, 0x1c, 0xc8, 0x69, 0x01, 0x78, 0xcc, 0x07, - 0xe4, 0x0f, 0xfd, 0x23, 0x9b, 0x00, 0x41, 0x1c, - 0xf8, 0x18, 0x10, 0x22, 0xd5, 0xf7, 0x3b, 0xfd, - 0x09, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x04, 0x63, - 0x00, 0x22, 0x1f, 0x21, 0x38, 0x1c, 0x02, 0xf0, - 0x1a, 0xf9, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xff, 0x30, 0xff, 0x30, 0x42, 0x30, 0x81, 0x63, - 0x00, 0x20, 0x70, 0x47, 0x90, 0xb5, 0x87, 0xb0, - 0x07, 0x1c, 0x01, 0xa8, 0xfd, 0xf7, 0xd9, 0xfb, - 0x02, 0x9a, 0x11, 0x4b, 0x00, 0x92, 0xfa, 0x1d, - 0xff, 0x32, 0x6e, 0x32, 0xf9, 0x18, 0x01, 0x9b, - 0x03, 0xa8, 0xfe, 0xf7, 0x78, 0xff, 0x04, 0x21, - 0x03, 0xaa, 0x01, 0x92, 0x00, 0x91, 0x0c, 0x21, - 0x00, 0x22, 0x01, 0x23, 0x38, 0x1c, 0x06, 0xf0, - 0x63, 0xff, 0x04, 0x1c, 0x03, 0xd1, 0x38, 0x1c, - 0x04, 0xa9, 0xff, 0xf7, 0x20, 0xfc, 0x00, 0x22, - 0x27, 0x21, 0x38, 0x1c, 0x02, 0xf0, 0xeb, 0xf8, - 0x20, 0x1c, 0x07, 0xb0, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x04, 0x04, 0x00, 0x00, 0x90, 0xb5, - 0x87, 0xb0, 0x07, 0x1c, 0x01, 0xa8, 0x0c, 0x1c, - 0xfd, 0xf7, 0xab, 0xfb, 0x02, 0x9a, 0x00, 0x92, - 0xe0, 0x69, 0xfa, 0x1d, 0x41, 0x1c, 0xff, 0x32, - 0x6e, 0x32, 0x03, 0xa8, 0x01, 0x9b, 0xfe, 0xf7, - 0x4a, 0xff, 0x04, 0x21, 0x03, 0xaa, 0x01, 0x92, - 0x00, 0x91, 0xe0, 0x69, 0x00, 0x78, 0xc2, 0x07, - 0xd2, 0x0f, 0x01, 0x23, 0x0c, 0x21, 0x38, 0x1c, - 0x06, 0xf0, 0x32, 0xff, 0x04, 0x1c, 0x03, 0xd1, - 0x38, 0x1c, 0x04, 0xa9, 0xff, 0xf7, 0xef, 0xfb, - 0x00, 0x22, 0x27, 0x21, 0x38, 0x1c, 0x02, 0xf0, - 0xba, 0xf8, 0x20, 0x1c, 0x07, 0xb0, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xed, 0x09, - 0x00, 0xb0, 0x02, 0x42, 0x69, 0x0e, 0x2a, 0x01, - 0xd1, 0xff, 0xf7, 0x29, 0xfc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x90, 0xb5, 0x0c, 0x1c, 0x1f, - 0x21, 0x07, 0x1c, 0xfe, 0xf7, 0xf8, 0xff, 0x38, - 0x1c, 0x21, 0x1c, 0xff, 0xf7, 0xed, 0xff, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xff, - 0xf7, 0xe7, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x90, - 0xb5, 0x0c, 0x1c, 0x1f, 0x21, 0x07, 0x1c, 0xfe, - 0xf7, 0xe6, 0xff, 0x38, 0x1c, 0x21, 0x1c, 0xff, - 0xf7, 0xf1, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0x21, 0xff, 0xf7, 0x03, - 0xfc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0xb5, 0x00, 0x21, 0xff, 0xf7, 0xfc, 0xfb, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x90, 0xb5, 0x0c, - 0x1c, 0x68, 0x21, 0x00, 0x22, 0x07, 0x1c, 0x02, - 0xf0, 0x78, 0xf8, 0x38, 0x1c, 0x21, 0x1c, 0xff, - 0xf7, 0xee, 0xfb, 0x90, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0xe7, - 0xfb, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0xb5, 0xff, 0xf7, 0xe1, 0xfb, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0xdb, - 0xfb, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0xb5, 0x00, 0xf0, 0x8f, 0xfc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0xb0, 0xb5, 0x07, 0x1c, 0x00, - 0x24, 0x0d, 0x1c, 0xfd, 0x23, 0xc8, 0x69, 0x9b, - 0x00, 0x41, 0x1c, 0xf8, 0x18, 0x10, 0x22, 0xd5, - 0xf7, 0x64, 0xfc, 0xe8, 0x69, 0x00, 0x78, 0xc0, - 0x07, 0xc0, 0x0f, 0x09, 0x23, 0x9b, 0x01, 0xf9, - 0x18, 0x08, 0x63, 0xf9, 0x1d, 0xff, 0x31, 0xba, - 0x31, 0x02, 0x20, 0x48, 0x63, 0x20, 0x1c, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x07, - 0x1c, 0x15, 0x48, 0x00, 0x24, 0x81, 0x6a, 0xf8, - 0x1d, 0xed, 0x09, 0x00, 0xb1, 0x02, 0xb9, 0x30, - 0x00, 0x29, 0x05, 0xd0, 0x82, 0x6b, 0x00, 0x2a, - 0x02, 0xd0, 0xc2, 0x6b, 0xd2, 0x08, 0x16, 0xd2, - 0x00, 0x29, 0x00, 0xd0, 0x80, 0x6b, 0x38, 0x1c, - 0x06, 0xf0, 0x7b, 0xfc, 0x02, 0x1c, 0x00, 0x23, - 0x31, 0x21, 0x38, 0x1c, 0x06, 0xf0, 0x8d, 0xfe, - 0x00, 0x22, 0x37, 0x21, 0x38, 0x1c, 0x02, 0xf0, - 0x57, 0xf8, 0x04, 0x1c, 0x06, 0xd1, 0x38, 0x1c, - 0x00, 0xf0, 0x62, 0xfc, 0x02, 0xe0, 0x38, 0x1c, - 0x04, 0xf0, 0xcc, 0xfe, 0x20, 0x1c, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf8, 0xad, 0x03, 0x20, - 0x00, 0xb5, 0x01, 0x1c, 0x8a, 0x69, 0x00, 0x20, - 0x00, 0x2a, 0x03, 0xd1, 0x08, 0x1c, 0x2c, 0x21, - 0x02, 0xf0, 0x3e, 0xf8, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x02, 0xa1, 0x01, 0xf0, 0x91, 0xfa, - 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x41, 0x75, - 0x74, 0x68, 0x53, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x00, 0x90, 0xb5, 0x0c, 0x1c, - 0x07, 0x1c, 0x00, 0xf0, 0x57, 0xff, 0x38, 0x1c, - 0x00, 0xf0, 0x1a, 0xfc, 0xf8, 0x1d, 0x79, 0x30, - 0x04, 0x63, 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0x1d, - 0xa9, 0x33, 0x03, 0xa2, 0x01, 0xf0, 0x84, 0xfb, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x4c, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x00, 0x00, 0x90, 0xb5, 0x0c, 0x1c, - 0x07, 0x1c, 0x00, 0xf0, 0x7d, 0xff, 0xf8, 0x1d, - 0x79, 0x30, 0x04, 0x63, 0x38, 0x1c, 0x00, 0xf0, - 0xf7, 0xfb, 0x55, 0x21, 0x38, 0x1c, 0x22, 0x1c, - 0x01, 0xf0, 0xbe, 0xff, 0x90, 0xbc, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x90, 0xb5, 0x0c, 0x1c, - 0x07, 0x1c, 0x00, 0xf0, 0xed, 0x09, 0x00, 0xb2, - 0x02, 0x69, 0xff, 0x9a, 0x21, 0x38, 0x1c, 0x22, - 0x1c, 0x01, 0xf0, 0xb0, 0xff, 0x38, 0x1c, 0x21, - 0x1c, 0x02, 0xa2, 0x01, 0xf0, 0x1f, 0xfd, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x41, - 0x75, 0x74, 0x68, 0x53, 0x74, 0x42, 0x42, 0x44, - 0x65, 0x74, 0x61, 0x63, 0x68, 0x00, 0x00, 0x00, - 0x00, 0x90, 0xb5, 0x07, 0x1c, 0xc8, 0x69, 0x0c, - 0x1c, 0x08, 0x4b, 0x41, 0x1c, 0xf8, 0x18, 0x10, - 0x22, 0xd5, 0xf7, 0xac, 0xfb, 0xe0, 0x69, 0x00, - 0x78, 0xc0, 0x07, 0xc0, 0x0f, 0x09, 0x23, 0x9b, - 0x01, 0xf9, 0x18, 0x48, 0x63, 0x90, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x04, 0x04, 0x00, - 0x00, 0x80, 0xb5, 0x07, 0x1c, 0x00, 0x29, 0x0e, - 0xd0, 0x00, 0x22, 0x28, 0x21, 0x38, 0x1c, 0x01, - 0xf0, 0xb9, 0xff, 0x00, 0x28, 0x04, 0xd1, 0x00, - 0x22, 0x28, 0x21, 0x38, 0x1c, 0x01, 0xf0, 0x76, - 0xff, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x22, 0x18, 0x21, 0x38, 0x1c, 0x01, 0xf0, 0xaa, - 0xff, 0x00, 0x28, 0xf5, 0xd1, 0x00, 0x22, 0x18, - 0x21, 0x38, 0x1c, 0x01, 0xf0, 0x67, 0xff, 0xef, - 0xe7, 0x90, 0xb5, 0x82, 0xb0, 0x0c, 0x4b, 0x07, - 0x1c, 0xc1, 0x18, 0x10, 0x20, 0x0c, 0x1c, 0xfd, - 0xf7, 0x73, 0xff, 0x10, 0x21, 0x09, 0x23, 0x9b, - 0x01, 0xf8, 0x18, 0x00, 0x91, 0x01, 0x94, 0x42, - 0x6b, 0x0b, 0x21, 0x01, 0x23, 0x38, 0x1c, 0x06, - 0xf0, 0xbe, 0xfd, 0x38, 0x1c, 0x00, 0xf0, 0x9a, - 0xfb, 0x02, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x04, 0x04, 0x00, 0x00, 0x80, 0xb5, 0x00, - 0x27, 0x00, 0x29, 0x0a, 0xd1, 0xc1, 0x1d, 0xb9, - 0x31, 0x4a, 0x6a, 0x00, 0x2a, 0x10, 0xd0, 0x00, - 0x22, 0x4a, 0x62, 0x27, 0x21, 0x01, 0xf0, 0x3a, - 0xff, 0x0a, 0xe0, 0xc2, 0x1d, 0xff, 0x32, 0xed, - 0x09, 0x00, 0xb3, 0x02, 0xba, 0x32, 0xd3, 0x68, - 0x00, 0x2b, 0x02, 0xd1, 0x92, 0x68, 0x00, 0x2a, - 0x01, 0xd0, 0x03, 0xf0, 0x83, 0xf8, 0x38, 0x1c, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x43, 0x68, - 0x00, 0x22, 0x00, 0x2b, 0x03, 0xd0, 0x19, 0x60, - 0x43, 0x68, 0x4b, 0x60, 0x01, 0xe0, 0x01, 0x60, - 0x4a, 0x60, 0x0a, 0x60, 0x41, 0x60, 0x81, 0x68, - 0x01, 0x31, 0x81, 0x60, 0x70, 0x47, 0x0a, 0x68, - 0x00, 0x2a, 0x02, 0xd0, 0x4b, 0x68, 0x53, 0x60, - 0x01, 0xe0, 0x4a, 0x68, 0x42, 0x60, 0x4a, 0x68, - 0x00, 0x2a, 0x02, 0xd0, 0x09, 0x68, 0x11, 0x60, - 0x01, 0xe0, 0x09, 0x68, 0x01, 0x60, 0x81, 0x68, - 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, 0x81, 0x60, - 0x70, 0x47, 0x0f, 0xb4, 0xf0, 0xb5, 0x84, 0xb0, - 0x00, 0x27, 0x16, 0x1c, 0x09, 0x98, 0x0a, 0x99, - 0x10, 0x9d, 0x00, 0xf0, 0x30, 0xfc, 0x04, 0x1c, - 0x12, 0xd1, 0x01, 0x21, 0x2a, 0x1c, 0x02, 0x2e, - 0x00, 0xd0, 0x00, 0x21, 0x03, 0x92, 0x0e, 0x9a, - 0x0f, 0x98, 0x02, 0x91, 0x00, 0x92, 0x01, 0x90, - 0x09, 0x98, 0x0c, 0x9a, 0x0a, 0x99, 0x0d, 0x9b, - 0x00, 0xf0, 0x3d, 0xfc, 0x04, 0x1c, 0x58, 0xd0, - 0x29, 0x1c, 0x2e, 0x48, 0xfd, 0xf7, 0x19, 0xf9, - 0x07, 0x1c, 0x52, 0xd0, 0x09, 0xa9, 0x28, 0xc9, - 0xf8, 0x1d, 0x9d, 0x30, 0x28, 0xc0, 0x09, 0x23, - 0xdb, 0x01, 0xf9, 0x18, 0x29, 0x48, 0x05, 0x23, - 0x3e, 0x61, 0x28, 0x4a, 0x88, 0x63, 0x1b, 0x02, - 0xd0, 0x18, 0xc1, 0x6b, 0x4b, 0x1c, 0xc3, 0x63, - 0xb9, 0x60, 0xf8, 0x1d, 0xb9, 0x30, 0x00, 0x21, - 0x7d, 0x23, 0x1b, 0x02, 0x41, 0x60, 0x81, 0x60, - 0x03, 0x60, 0x01, 0x26, 0x0b, 0x23, 0x9b, 0x01, - 0xfd, 0x18, 0xae, 0x60, 0x01, 0x26, 0x6e, 0x60, - 0x05, 0x23, 0xdb, 0x01, 0x1d, 0x4e, 0xfb, 0x18, - 0x29, 0x60, 0xed, 0x09, 0x00, 0xb4, 0x02, 0xde, - 0x63, 0x9e, 0x63, 0xfb, 0x1d, 0xff, 0x33, 0x3a, - 0x33, 0x99, 0x60, 0x19, 0x49, 0x19, 0x61, 0x31, - 0x07, 0xd9, 0x60, 0x28, 0x21, 0xe9, 0x61, 0x77, - 0x21, 0xc9, 0x43, 0x19, 0x62, 0x59, 0x62, 0xf9, - 0x1d, 0xff, 0x31, 0xfa, 0x31, 0x14, 0x4b, 0x01, - 0x26, 0x0e, 0x61, 0xcb, 0x60, 0x86, 0x61, 0xa0, - 0x69, 0x00, 0x28, 0x01, 0xd1, 0xa7, 0x61, 0xfc, - 0x60, 0x00, 0x20, 0xc1, 0x00, 0x09, 0x18, 0x89, - 0x00, 0xc9, 0x19, 0x48, 0x63, 0x01, 0x30, 0x03, - 0x28, 0xf7, 0xd3, 0x53, 0x23, 0x1b, 0x01, 0xd0, - 0x18, 0x39, 0x1c, 0xff, 0xf7, 0x62, 0xff, 0x38, - 0x1c, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x04, - 0xb0, 0x18, 0x47, 0xbc, 0x04, 0x00, 0x00, 0x19, - 0x64, 0x03, 0x11, 0xb8, 0xa8, 0x03, 0x20, 0x18, - 0xcc, 0x00, 0x00, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0x00, 0x00, 0xf0, 0xb5, 0x07, 0x1c, 0x0c, - 0x1c, 0x39, 0x1c, 0x13, 0x48, 0xff, 0xf7, 0x59, - 0xff, 0x38, 0x1c, 0x06, 0xf0, 0x98, 0xfa, 0x00, - 0x28, 0x06, 0xd0, 0xfd, 0xf7, 0xde, 0xfa, 0x38, - 0x1c, 0x06, 0xf0, 0x91, 0xfa, 0x00, 0x28, 0xf8, - 0xd1, 0xf8, 0x68, 0x00, 0x25, 0x00, 0x28, 0x09, - 0xd0, 0xc6, 0x1d, 0x09, 0x36, 0xd9, 0xf7, 0x43, - 0xf8, 0x03, 0xc6, 0xf8, 0x68, 0x81, 0x69, 0x00, - 0x29, 0x00, 0xd0, 0x85, 0x61, 0x09, 0x23, 0xdb, - 0x01, 0xf8, 0x18, 0x85, 0x63, 0x38, 0x1c, 0x21, - 0x1c, 0xfd, 0xf7, 0x8f, 0xf8, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xe8, 0xad, 0x03, 0x20, 0x80, - 0xb5, 0x06, 0x48, 0x00, 0x6b, 0x00, 0x28, 0x05, - 0xd0, 0x07, 0x68, 0x04, 0xa1, 0xff, 0xf7, 0xc9, - 0xff, 0x38, 0x1c, 0xf9, 0xd1, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xb8, 0xad, 0x03, 0x20, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0xed, 0x09, 0x00, - 0xb5, 0x02, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, - 0x63, 0x3a, 0x20, 0x34, 0x30, 0x36, 0x00, 0x00, - 0xf7, 0xb5, 0x07, 0x1c, 0xff, 0x30, 0x01, 0x30, - 0x40, 0x68, 0x0d, 0x1c, 0x00, 0x28, 0x02, 0xd0, - 0x27, 0xa1, 0xfd, 0xf7, 0xef, 0xff, 0x38, 0x1c, - 0x00, 0xf0, 0x92, 0xfd, 0x38, 0x1c, 0x00, 0xf0, - 0x55, 0xfa, 0x38, 0x1c, 0x00, 0xf0, 0xd6, 0xfa, - 0x38, 0x1c, 0x08, 0xf0, 0x0b, 0xfd, 0x38, 0x1c, - 0x06, 0xf0, 0x4c, 0xfa, 0x00, 0x2d, 0x37, 0xd0, - 0xf9, 0x1d, 0x9d, 0x31, 0x08, 0x68, 0x49, 0x68, - 0x00, 0xf0, 0x46, 0xfb, 0x04, 0x1c, 0x02, 0x2d, - 0x1e, 0xd1, 0xd5, 0xf7, 0xbc, 0xfd, 0x05, 0x1c, - 0x1a, 0xd0, 0x58, 0x20, 0x28, 0x60, 0x38, 0x6b, - 0xfe, 0x1d, 0xe8, 0x60, 0xb1, 0x36, 0x03, 0xce, - 0x18, 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0x08, 0x3e, - 0xd5, 0xf7, 0x3c, 0xfb, 0x00, 0x28, 0x03, 0xd0, - 0xd8, 0xf7, 0xdc, 0xff, 0x03, 0xc6, 0x08, 0x3e, - 0x0c, 0xce, 0xe8, 0x1d, 0x09, 0x30, 0x0c, 0xc0, - 0x07, 0x20, 0x29, 0x1c, 0xd5, 0xf7, 0x0e, 0xfe, - 0x02, 0x99, 0x38, 0x1c, 0xff, 0xf7, 0x70, 0xff, - 0x00, 0x2c, 0x09, 0xd0, 0x20, 0x6c, 0x00, 0x28, - 0x02, 0xd0, 0x00, 0x20, 0xe0, 0x62, 0x20, 0x64, - 0x02, 0x99, 0x20, 0x1c, 0x00, 0xf0, 0x74, 0xfb, - 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, - 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x34, - 0x31, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x83, 0xb5, 0x12, 0x48, - 0x00, 0x6b, 0x00, 0x28, 0x1c, 0xd0, 0x00, 0x99, - 0x0a, 0x02, 0x12, 0x0a, 0x09, 0x0e, 0xc3, 0x1d, - 0x79, 0x33, 0x5b, 0x6a, 0x1f, 0x02, 0x3f, 0x0a, - 0x97, 0x42, 0x0e, 0xd1, 0x1b, 0x0e, 0x8b, 0x42, - 0xed, 0x09, 0x00, 0xb6, 0x02, 0x0b, 0xd1, 0xc3, - 0x1d, 0x99, 0x33, 0x1b, 0x89, 0x01, 0xaf, 0x3f, - 0x88, 0xbb, 0x42, 0x04, 0xd1, 0x43, 0x69, 0x00, - 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02, 0xd1, 0x00, - 0x68, 0x00, 0x28, 0xe6, 0xd1, 0x02, 0xb0, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb8, 0xad, 0x03, - 0x20, 0x83, 0xb5, 0x10, 0x48, 0x00, 0x6b, 0x00, - 0x28, 0x17, 0xd0, 0x00, 0x99, 0x0b, 0x02, 0x1b, - 0x0a, 0x0a, 0x0e, 0xc1, 0x1d, 0x79, 0x31, 0x49, - 0x6a, 0x0f, 0x02, 0x3f, 0x0a, 0x9f, 0x42, 0x09, - 0xd1, 0x09, 0x0e, 0x91, 0x42, 0x06, 0xd1, 0xc1, - 0x1d, 0x99, 0x31, 0x09, 0x89, 0x01, 0xaf, 0x3f, - 0x88, 0xb9, 0x42, 0x02, 0xd0, 0x00, 0x68, 0x00, - 0x28, 0xeb, 0xd1, 0x02, 0xb0, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xb8, 0xad, 0x03, - 0x20, 0x05, 0x49, 0x09, 0x6b, 0x00, 0x29, 0x05, - 0xd0, 0x0a, 0x69, 0x82, 0x42, 0x02, 0xd0, 0x09, - 0x68, 0x00, 0x29, 0xf9, 0xd1, 0x08, 0x1c, 0x70, - 0x47, 0xb8, 0xad, 0x03, 0x20, 0x05, 0x49, 0x09, - 0x6b, 0x00, 0x29, 0x05, 0xd0, 0x8a, 0x68, 0x82, - 0x42, 0x02, 0xd0, 0x09, 0x68, 0x00, 0x29, 0xf9, - 0xd1, 0x08, 0x1c, 0x70, 0x47, 0xb8, 0xad, 0x03, - 0x20, 0x83, 0xb5, 0x11, 0x48, 0x00, 0x6b, 0x00, - 0x28, 0x1a, 0xd0, 0x00, 0x99, 0x0b, 0x02, 0x1b, - 0x0a, 0x0a, 0x0e, 0xc1, 0x1d, 0x79, 0x31, 0x49, - 0x6a, 0x0f, 0x02, 0x3f, 0x0a, 0x9f, 0x42, 0x0c, - 0xd1, 0x09, 0x0e, 0x91, 0x42, 0x09, 0xd1, 0xc1, - 0x1d, 0x99, 0x31, 0x09, 0x89, 0x01, 0xaf, 0x3f, - 0x88, 0xb9, 0x42, 0x02, 0xd1, 0xc1, 0x68, 0x00, - 0x29, 0x02, 0xd1, 0x00, 0x68, 0x00, 0x28, 0xe8, - 0xd1, 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xb8, 0xad, 0x03, 0x20, 0x07, 0x49, 0x09, - 0x6b, 0x00, 0x29, 0xed, 0x09, 0x00, 0xb7, 0x02, - 0x09, 0xd0, 0x0a, 0x69, 0x01, 0x2a, 0x03, 0xd1, - 0x81, 0x42, 0x01, 0xd0, 0x08, 0x1c, 0x70, 0x47, - 0x09, 0x68, 0x00, 0x29, 0xf5, 0xd1, 0x00, 0x20, - 0x70, 0x47, 0xb8, 0xad, 0x03, 0x20, 0x06, 0x49, - 0x09, 0x6b, 0x00, 0x29, 0x07, 0xd0, 0x4a, 0x69, - 0x82, 0x42, 0x01, 0xd1, 0x08, 0x1c, 0x70, 0x47, - 0x09, 0x68, 0x00, 0x29, 0xf7, 0xd1, 0x00, 0x20, - 0x70, 0x47, 0xb8, 0xad, 0x03, 0x20, 0xb0, 0xb5, - 0xc5, 0x1d, 0xff, 0x35, 0x7a, 0x35, 0x04, 0x1c, - 0x68, 0x6b, 0x00, 0x27, 0x00, 0x28, 0x03, 0xd0, - 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xd5, 0xf7, 0xbe, 0xfc, 0x00, 0x28, 0x01, 0xd1, - 0x07, 0x27, 0x11, 0xe0, 0xcc, 0x21, 0x01, 0x60, - 0xe1, 0x6a, 0xff, 0x34, 0xc1, 0x60, 0x75, 0x34, - 0x0c, 0xcc, 0xc1, 0x1d, 0x09, 0x31, 0x0c, 0xc1, - 0x0c, 0xcc, 0x0c, 0xc1, 0xe9, 0x69, 0x01, 0x62, - 0x01, 0x1c, 0x05, 0x20, 0xd5, 0xf7, 0x17, 0xfd, - 0x38, 0x1c, 0xe2, 0xe7, 0x00, 0xb5, 0xff, 0xf7, - 0x80, 0xff, 0x00, 0x28, 0x0c, 0xd0, 0xc1, 0x1d, - 0xf9, 0x31, 0x4a, 0x68, 0x00, 0x2a, 0x07, 0xd0, - 0x00, 0x22, 0x4a, 0x60, 0xc1, 0x1d, 0x79, 0x31, - 0x0a, 0x6b, 0x02, 0x21, 0x01, 0xf0, 0x1f, 0xfd, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, - 0x6c, 0xff, 0x00, 0x28, 0x09, 0xd0, 0xc1, 0x1d, - 0xf9, 0x31, 0x8a, 0x68, 0x00, 0x2a, 0x04, 0xd0, - 0x00, 0x22, 0x8a, 0x60, 0xa1, 0x21, 0x01, 0xf0, - 0x0e, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0xff, 0xf7, 0x5b, 0xff, 0x00, 0x28, 0x09, 0xd0, - 0xc1, 0x1d, 0xf9, 0x31, 0xca, 0x68, 0x00, 0x2a, - 0x04, 0xd0, 0x00, 0x22, 0xca, 0x60, 0x22, 0x21, - 0x00, 0xf0, 0x63, 0xfb, 0x08, 0xbc, 0x18, 0x47, - 0x08, 0xb5, 0xff, 0xf7, 0x4a, 0xff, 0xed, 0x09, - 0x00, 0xb8, 0x02, 0x00, 0x28, 0x0b, 0xd0, 0xc1, - 0x1d, 0xf9, 0x31, 0x0a, 0x69, 0x00, 0x2a, 0x06, - 0xd0, 0x00, 0x22, 0x0a, 0x61, 0x00, 0x23, 0x22, - 0x21, 0x00, 0x92, 0x00, 0xf0, 0x00, 0xfb, 0x01, - 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xff, - 0xf7, 0x36, 0xff, 0x00, 0x28, 0x0f, 0xd0, 0xc1, - 0x1d, 0xf9, 0x31, 0x4a, 0x69, 0x00, 0x2a, 0x0a, - 0xd0, 0x00, 0x22, 0x4a, 0x61, 0xc1, 0x1d, 0xb9, - 0x31, 0xc9, 0x69, 0x00, 0x29, 0x05, 0xd0, 0x22, - 0x22, 0x02, 0x21, 0x01, 0xf0, 0xd2, 0xfc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x22, 0x22, 0x21, 0x00, - 0xf0, 0x6c, 0xfb, 0xf8, 0xe7, 0x00, 0xb5, 0xff, - 0xf7, 0x1a, 0xff, 0x00, 0x28, 0x0d, 0xd0, 0xc1, - 0x1d, 0xf9, 0x31, 0x8a, 0x69, 0x00, 0x2a, 0x08, - 0xd0, 0x00, 0x22, 0x05, 0x23, 0xdb, 0x01, 0x8a, - 0x61, 0xc1, 0x18, 0x4a, 0x6b, 0x22, 0x21, 0x00, - 0xf0, 0xca, 0xfb, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb5, 0x83, 0xb0, 0xff, 0xf7, 0x04, 0xff, 0x07, - 0x1c, 0x19, 0xd0, 0xf8, 0x1d, 0xf9, 0x30, 0xc1, - 0x69, 0x00, 0x29, 0x14, 0xd0, 0x00, 0x21, 0x0b, - 0x23, 0x9b, 0x01, 0xfb, 0x18, 0x10, 0x33, 0xc1, - 0x61, 0x07, 0xcb, 0x1c, 0x3b, 0x01, 0x91, 0x00, - 0x90, 0x02, 0x92, 0xd9, 0x68, 0x05, 0x23, 0xdb, - 0x01, 0xf8, 0x18, 0x0b, 0x1c, 0x22, 0x21, 0xc2, - 0x68, 0x38, 0x1c, 0x00, 0xf0, 0x7e, 0xfb, 0x03, - 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0xff, 0xf7, 0xe1, 0xfe, 0x00, 0x28, 0x0c, - 0xd0, 0xc1, 0x1d, 0xf9, 0x31, 0x0a, 0x6a, 0x00, - 0x2a, 0x07, 0xd0, 0x00, 0x22, 0x0a, 0x62, 0xc1, - 0x1d, 0xb9, 0x31, 0x4a, 0x63, 0x22, 0x21, 0x00, - 0xf0, 0xbb, 0xfa, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb5, 0xff, 0xf7, 0xcd, 0xfe, 0x07, 0x1c, 0x12, - 0xd0, 0xed, 0x09, 0x00, 0xb9, 0x02, 0xf8, 0x1d, - 0xf9, 0x30, 0x41, 0x6a, 0x00, 0x29, 0x0d, 0xd0, - 0x00, 0x21, 0x41, 0x62, 0xf9, 0x1d, 0x38, 0x1c, - 0x00, 0x23, 0xa0, 0x22, 0x1d, 0x31, 0x01, 0xf0, - 0xf5, 0xfb, 0x00, 0x22, 0xa0, 0x21, 0x38, 0x1c, - 0x01, 0xf0, 0x66, 0xfc, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x80, 0xb5, 0xff, 0xf7, 0xb2, 0xfe, - 0x07, 0x1c, 0x13, 0xd0, 0xf8, 0x1d, 0xff, 0x30, - 0x3a, 0x30, 0x01, 0x68, 0x00, 0x29, 0x0d, 0xd0, - 0x00, 0x21, 0x01, 0x60, 0xf9, 0x1d, 0x38, 0x1c, - 0x22, 0x23, 0xa4, 0x22, 0x21, 0x31, 0x01, 0xf0, - 0xd9, 0xfb, 0x00, 0x22, 0xa4, 0x21, 0x38, 0x1c, - 0x01, 0xf0, 0x4a, 0xfc, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xff, 0xf7, 0x96, 0xfe, - 0x00, 0x28, 0x09, 0xd0, 0xc1, 0x1d, 0xf9, 0x31, - 0x4a, 0x6b, 0x00, 0x2a, 0x04, 0xd0, 0x00, 0x22, - 0x4a, 0x63, 0xa2, 0x21, 0x01, 0xf0, 0x38, 0xfc, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x82, 0xb0, - 0x0c, 0x48, 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, - 0x07, 0x68, 0x0b, 0xa1, 0x00, 0xf0, 0x86, 0xf9, - 0x38, 0x1c, 0xf9, 0xd1, 0x0d, 0x49, 0x00, 0x22, - 0x01, 0x92, 0x00, 0x91, 0x0c, 0xa1, 0x08, 0x68, - 0x00, 0x23, 0x01, 0x22, 0x49, 0x68, 0xfd, 0xf7, - 0x94, 0xfd, 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xf8, 0xad, 0x03, 0x20, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, - 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x38, - 0x39, 0x36, 0x00, 0x00, 0xfd, 0xb3, 0x02, 0x20, - 0x80, 0x84, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0xb5, 0xc7, 0x1d, 0xf9, 0x37, 0xb8, 0x68, - 0x00, 0x28, 0x04, 0xd0, 0x03, 0xa1, 0xfd, 0xf7, - 0x8b, 0xfd, 0x00, 0x20, 0xb8, 0x60, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xed, 0x09, 0x00, 0xba, - 0x02, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x39, 0x30, 0x38, 0x00, 0x00, 0x90, 0xb5, 0x82, - 0xb0, 0xc4, 0x1d, 0xf9, 0x34, 0x07, 0x1c, 0xa0, - 0x68, 0x00, 0x28, 0x02, 0xd0, 0x09, 0xa1, 0xfd, - 0xf7, 0x71, 0xfd, 0xba, 0x68, 0x0c, 0x49, 0x01, - 0x92, 0x00, 0x91, 0x0c, 0xa1, 0x08, 0x68, 0x00, - 0x23, 0x01, 0x22, 0x49, 0x68, 0xfd, 0xf7, 0x4f, - 0xfd, 0xa0, 0x60, 0x02, 0xb0, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x6d, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x39, 0x32, 0x30, 0x00, - 0x00, 0x2f, 0xb2, 0x02, 0x20, 0x00, 0x87, 0x93, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb5, 0x08, - 0x68, 0x0f, 0x1c, 0x00, 0x28, 0x04, 0xd0, 0x04, - 0xa1, 0xfd, 0xf7, 0x48, 0xfd, 0x00, 0x20, 0x38, - 0x60, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x39, 0x33, 0x34, 0x00, 0x00, 0xb0, 0xb5, 0x82, - 0xb0, 0x05, 0x1c, 0x08, 0x68, 0x14, 0x1c, 0x0f, - 0x1c, 0x00, 0x28, 0x02, 0xd0, 0x08, 0xa1, 0xfd, - 0xf7, 0x2d, 0xfd, 0xaa, 0x68, 0x00, 0x94, 0x01, - 0x92, 0x0a, 0xa1, 0x08, 0x68, 0x00, 0x23, 0x01, - 0x22, 0x49, 0x68, 0xfd, 0xf7, 0x0c, 0xfd, 0x38, - 0x60, 0x02, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x39, 0x34, 0x36, 0x00, 0x00, 0x00, 0x87, 0x93, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb5, 0xc7, - 0x1d, 0xf9, 0x37, 0x78, 0x6b, 0x00, 0x28, 0x04, - 0xd0, 0x03, 0xa1, 0xfd, 0xf7, 0x07, 0xfd, 0xed, - 0x09, 0x00, 0xbb, 0x02, 0x00, 0x20, 0x78, 0x63, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x39, 0x36, 0x30, - 0x00, 0x00, 0xff, 0xb5, 0x82, 0xb0, 0xc6, 0x1d, - 0xf9, 0x36, 0x07, 0x1c, 0x70, 0x6b, 0x0c, 0x1c, - 0x00, 0x28, 0x02, 0xd0, 0x14, 0xa1, 0xfd, 0xf7, - 0xec, 0xfc, 0x00, 0x2c, 0x14, 0xd0, 0xf8, 0x1d, - 0xb9, 0x30, 0x00, 0x68, 0x01, 0x23, 0x1b, 0x03, - 0x98, 0x42, 0x0d, 0xd9, 0x13, 0x4b, 0x58, 0x43, - 0x40, 0x00, 0x5b, 0x03, 0xc4, 0x1a, 0x00, 0x25, - 0xd8, 0xf7, 0xf7, 0xfc, 0x22, 0x1c, 0xfc, 0x1d, - 0xb1, 0x34, 0x80, 0x18, 0x69, 0x41, 0x03, 0xc4, - 0xba, 0x68, 0x0c, 0x49, 0x00, 0x23, 0x01, 0x92, - 0x00, 0x91, 0x05, 0x99, 0x01, 0x22, 0x04, 0x98, - 0xfd, 0xf7, 0xb4, 0xfc, 0x70, 0x63, 0x06, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x39, 0x37, 0x33, - 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0xdb, 0xb3, - 0x02, 0x20, 0x43, 0x68, 0x00, 0x22, 0x00, 0x2b, - 0x03, 0xd0, 0x19, 0x60, 0x43, 0x68, 0x4b, 0x60, - 0x01, 0xe0, 0x01, 0x60, 0x4a, 0x60, 0x0a, 0x60, - 0x41, 0x60, 0x81, 0x68, 0x01, 0x31, 0x81, 0x60, - 0x70, 0x47, 0x0a, 0x68, 0x00, 0x2a, 0x02, 0xd0, - 0x4b, 0x68, 0x53, 0x60, 0x01, 0xe0, 0x4a, 0x68, - 0x42, 0x60, 0x4a, 0x68, 0x00, 0x2a, 0x02, 0xd0, - 0x09, 0x68, 0x11, 0x60, 0x01, 0xe0, 0x09, 0x68, - 0x01, 0x60, 0x81, 0x68, 0x00, 0x29, 0x01, 0xd0, - 0x01, 0x39, 0x81, 0x60, 0x70, 0x47, 0x83, 0xb5, - 0x0e, 0x48, 0x00, 0x68, 0x00, 0x28, 0x13, 0xd0, - 0x00, 0x99, 0x0b, 0x02, 0x1b, 0x0a, 0x0a, 0x0e, - 0x81, 0x68, 0xed, 0x09, 0x00, 0xbc, 0x02, 0x0f, - 0x02, 0x3f, 0x0a, 0x9f, 0x42, 0x07, 0xd1, 0x09, - 0x0e, 0x91, 0x42, 0x04, 0xd1, 0x81, 0x89, 0x01, - 0xaf, 0x3f, 0x88, 0xb9, 0x42, 0x02, 0xd0, 0x00, - 0x68, 0x00, 0x28, 0xef, 0xd1, 0x02, 0xb0, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xf8, - 0xad, 0x03, 0x20, 0xff, 0xb5, 0x0b, 0x98, 0x00, - 0x27, 0x00, 0x28, 0x0c, 0x9e, 0x0a, 0x9c, 0x09, - 0x9d, 0x05, 0xd0, 0x00, 0xf0, 0x94, 0xf8, 0x10, - 0x49, 0xc9, 0x6a, 0x88, 0x42, 0x18, 0xd2, 0x54, - 0x20, 0x31, 0x1c, 0xfc, 0xf7, 0xd0, 0xfc, 0x07, - 0x1c, 0x12, 0xd0, 0xfe, 0x1d, 0x09, 0x36, 0xd8, - 0xf7, 0x76, 0xfc, 0x03, 0xc6, 0x01, 0x99, 0x09, - 0x48, 0xf9, 0x60, 0x00, 0x99, 0xb9, 0x60, 0x03, - 0x9b, 0x39, 0x1c, 0x3b, 0x62, 0x02, 0x9a, 0xfa, - 0x61, 0xbc, 0x62, 0x7d, 0x62, 0xff, 0xf7, 0x93, - 0xff, 0x38, 0x1c, 0x04, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x38, 0xae, 0x03, 0x20, 0xf8, - 0xad, 0x03, 0x20, 0x90, 0xb5, 0x07, 0x1c, 0x0c, - 0x1c, 0x39, 0x1c, 0x04, 0x48, 0xff, 0xf7, 0x93, - 0xff, 0x38, 0x1c, 0x21, 0x1c, 0xfc, 0xf7, 0xad, - 0xfc, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf8, - 0xad, 0x03, 0x20, 0xf3, 0xb5, 0x82, 0xb0, 0x07, - 0x1c, 0xd8, 0xf7, 0x49, 0xfc, 0x05, 0x1c, 0xb8, - 0x69, 0x0c, 0x1c, 0x00, 0x28, 0x31, 0xd1, 0xf8, - 0x6a, 0x00, 0x28, 0x2e, 0xd1, 0x38, 0x6c, 0x00, - 0x28, 0x2b, 0xd1, 0x38, 0x6d, 0x00, 0x28, 0x24, - 0xd0, 0xfe, 0x1d, 0x09, 0x36, 0x01, 0x28, 0x12, - 0xd1, 0x14, 0x48, 0x00, 0x21, 0x01, 0x22, 0x80, - 0x69, 0xe5, 0xf7, 0xa1, 0xfa, 0x01, 0x91, 0x00, - 0x90, 0x0c, 0xce, 0x08, 0x3e, 0x21, 0x1c, 0xa8, - 0x1a, 0x99, 0x41, 0x01, 0x9b, 0x00, 0x9a, 0xe5, - 0xf7, 0x72, 0xfa, 0x00, 0x28, 0xed, 0x09, 0x00, - 0xbd, 0x02, 0x0d, 0xd1, 0x38, 0x6d, 0x02, 0x28, - 0x0e, 0xd1, 0x0c, 0xce, 0x21, 0x1c, 0xa8, 0x1a, - 0x99, 0x41, 0x08, 0x4b, 0x1a, 0x68, 0x5b, 0x68, - 0xe5, 0xf7, 0x64, 0xfa, 0x00, 0x28, 0x03, 0xd0, - 0x03, 0x99, 0x38, 0x1c, 0xff, 0xf7, 0xb4, 0xff, - 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x38, 0xae, 0x03, 0x20, 0x54, 0xae, 0x03, 0x20, - 0x80, 0xb5, 0x06, 0x48, 0x00, 0x68, 0x00, 0x28, - 0x05, 0xd0, 0x07, 0x68, 0x04, 0xa1, 0xff, 0xf7, - 0xa3, 0xff, 0x38, 0x1c, 0xf9, 0xd1, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf8, 0xad, 0x03, 0x20, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, - 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x31, - 0x31, 0x31, 0x32, 0x00, 0x06, 0x49, 0x00, 0x20, - 0x09, 0x68, 0x00, 0x29, 0x06, 0xd0, 0x0a, 0x6d, - 0x02, 0x2a, 0x00, 0xd0, 0x01, 0x30, 0x09, 0x68, - 0x00, 0x29, 0xf8, 0xd1, 0x70, 0x47, 0x00, 0x00, - 0xf8, 0xad, 0x03, 0x20, 0xf7, 0xb5, 0x00, 0x24, - 0x0d, 0x1c, 0x07, 0x1c, 0xd5, 0xf7, 0xa7, 0xf9, - 0x00, 0x28, 0x01, 0xd1, 0x07, 0x24, 0x1a, 0xe0, - 0xd4, 0x21, 0x01, 0x60, 0xf9, 0x6a, 0xc1, 0x60, - 0x00, 0x29, 0x05, 0xd1, 0xfe, 0x1d, 0x9d, 0x36, - 0x0c, 0xce, 0xc1, 0x1d, 0x09, 0x31, 0x0c, 0xc1, - 0xf9, 0x1d, 0x79, 0x31, 0x85, 0x61, 0xc9, 0x6a, - 0xc1, 0x61, 0x02, 0x9a, 0xf9, 0x1d, 0xb9, 0x31, - 0x02, 0x62, 0x49, 0x68, 0x41, 0x62, 0x01, 0x1c, - 0x05, 0x20, 0xd5, 0xf7, 0xf7, 0xf9, 0x20, 0x1c, - 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xff, 0xb5, 0x03, 0x9b, 0x00, 0x27, 0x14, 0x1c, - 0x0d, 0x1c, 0x06, 0x1c, 0x00, 0x2b, 0x04, 0xd1, - 0x30, 0x1c, 0x29, 0x1c, 0x22, 0x1c, 0x06, 0xf0, - 0xad, 0xfa, 0xd5, 0xf7, 0x74, 0xf9, 0x00, 0x28, - 0xed, 0x09, 0x00, 0xbe, 0x02, 0x01, 0xd1, 0x07, - 0x27, 0x0b, 0xe0, 0xd8, 0x21, 0x01, 0x60, 0xf1, - 0x6a, 0xc1, 0x60, 0x84, 0x61, 0x45, 0x61, 0x03, - 0x9b, 0x01, 0x1c, 0x03, 0x61, 0x05, 0x20, 0xd5, - 0xf7, 0xd3, 0xf9, 0x38, 0x1c, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0xb5, 0x04, - 0x1c, 0xff, 0x30, 0xc1, 0x30, 0x0d, 0x1c, 0x09, - 0x9e, 0xc1, 0x69, 0x00, 0x27, 0x00, 0x29, 0x15, - 0xd0, 0x00, 0x21, 0xc1, 0x61, 0xd5, 0xf7, 0x51, - 0xf9, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, 0x0d, - 0xe0, 0xc6, 0x21, 0x01, 0x60, 0xc5, 0x60, 0xe1, - 0x6a, 0x01, 0x61, 0x02, 0x9a, 0x01, 0x1c, 0x42, - 0x61, 0x03, 0x9b, 0x83, 0x61, 0xc6, 0x61, 0x05, - 0x20, 0xd5, 0xf7, 0xae, 0xf9, 0x38, 0x1c, 0x04, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, - 0xb5, 0x05, 0x1c, 0xff, 0x30, 0xc1, 0x30, 0x0e, - 0x1c, 0xc1, 0x6a, 0x00, 0x27, 0x14, 0x1c, 0x00, - 0x29, 0x1c, 0xd0, 0x00, 0x21, 0xc1, 0x62, 0xd5, - 0xf7, 0x2c, 0xf9, 0x00, 0x28, 0x01, 0xd1, 0x07, - 0x27, 0x14, 0xe0, 0xc5, 0x21, 0x01, 0x60, 0xc6, - 0x60, 0xe9, 0x6a, 0x00, 0x2c, 0x01, 0x61, 0x04, - 0xd0, 0x60, 0xcc, 0xc1, 0x1d, 0x0d, 0x31, 0x60, - 0xc1, 0x04, 0xe0, 0x00, 0x22, 0x00, 0x23, 0xc1, - 0x1d, 0x0d, 0x31, 0x0c, 0xc1, 0x01, 0x1c, 0x05, - 0x20, 0xd5, 0xf7, 0x82, 0xf9, 0x38, 0x1c, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x04, - 0x1c, 0xff, 0x30, 0xc1, 0x30, 0x0e, 0x1c, 0x81, - 0x69, 0x00, 0x27, 0x15, 0x1c, 0x00, 0x29, 0x11, - 0xd0, 0x00, 0x21, 0x81, 0x61, 0xd5, 0xf7, 0x01, - 0xf9, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, 0x09, - 0xe0, 0xc1, 0x21, 0x01, 0x60, 0xc6, 0x60, 0xe1, - 0x6a, 0x01, 0x61, 0x45, 0x61, 0x01, 0x1c, 0x05, - 0x20, 0xd5, 0xf7, 0xed, 0x09, 0x00, 0xbf, 0x02, - 0x62, 0xf9, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0x00, 0x27, 0x04, 0x1c, - 0xd5, 0xf7, 0xea, 0xf8, 0x00, 0x28, 0x01, 0xd1, - 0x07, 0x27, 0x0c, 0xe0, 0xbd, 0x21, 0x01, 0x60, - 0xe1, 0x6a, 0x0b, 0x23, 0x9b, 0x01, 0xc1, 0x60, - 0xe1, 0x18, 0x89, 0x68, 0x01, 0x61, 0x01, 0x1c, - 0x05, 0x20, 0xd5, 0xf7, 0x48, 0xf9, 0x38, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, - 0x06, 0x1c, 0xff, 0x30, 0xc1, 0x30, 0x01, 0x6a, - 0x00, 0x24, 0x15, 0x1c, 0x00, 0x29, 0x2e, 0xd0, - 0x00, 0x21, 0x01, 0x62, 0xd5, 0xf7, 0xc8, 0xf8, - 0x07, 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x26, 0xe0, - 0x16, 0xa1, 0xf9, 0x20, 0xfc, 0xf7, 0x47, 0xfb, - 0xb8, 0x61, 0x00, 0x28, 0x04, 0xd1, 0x38, 0x1c, - 0xd5, 0xf7, 0xf5, 0xf8, 0x07, 0x24, 0x1a, 0xe0, - 0xc4, 0x20, 0x38, 0x60, 0x01, 0x99, 0xf8, 0x1d, - 0xf9, 0x60, 0xf1, 0x1d, 0x9d, 0x31, 0x48, 0xc9, - 0x09, 0x30, 0x48, 0xc0, 0x00, 0x2d, 0x05, 0xd0, - 0xf9, 0x22, 0x29, 0x1c, 0xb8, 0x69, 0xd4, 0xf7, - 0x0e, 0xfd, 0x04, 0xe0, 0xf9, 0x22, 0x00, 0x21, - 0xb8, 0x69, 0xd4, 0xf7, 0x80, 0xfc, 0x05, 0x20, - 0x39, 0x1c, 0xd5, 0xf7, 0x0c, 0xf9, 0x20, 0x1c, - 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, - 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, - 0x20, 0x31, 0x33, 0x32, 0x36, 0x00, 0xff, 0xb5, - 0x81, 0xb0, 0x07, 0x1c, 0x00, 0x20, 0x00, 0x90, - 0xf8, 0x1d, 0xff, 0x30, 0xba, 0x30, 0x0c, 0x9c, - 0x0b, 0x9d, 0x0a, 0x9e, 0x81, 0x6a, 0x00, 0x29, - 0x16, 0xd0, 0x00, 0x21, 0x81, 0x62, 0xd5, 0xf7, - 0x7b, 0xf8, 0x00, 0x28, 0x10, 0xd0, 0xc2, 0x21, - 0x01, 0x60, 0x02, 0x99, 0xc1, 0x60, 0xed, 0x09, - 0x00, 0xc0, 0x02, 0xf9, 0x6a, 0x01, 0x61, 0x03, - 0x9a, 0x01, 0x1c, 0x42, 0x61, 0x04, 0x9b, 0x83, - 0x61, 0xc6, 0x61, 0x44, 0x62, 0x05, 0x62, 0x05, - 0x20, 0xd5, 0xf7, 0xd7, 0xf8, 0x00, 0x98, 0x05, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, - 0xb5, 0x04, 0x1c, 0xff, 0x30, 0xc1, 0x30, 0x0e, - 0x1c, 0x41, 0x6a, 0x00, 0x27, 0x15, 0x1c, 0x00, - 0x29, 0x11, 0xd0, 0x00, 0x21, 0x41, 0x62, 0xd5, - 0xf7, 0x55, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x07, - 0x27, 0x09, 0xe0, 0xbf, 0x21, 0x01, 0x60, 0x46, - 0x61, 0xe1, 0x6a, 0xc1, 0x60, 0x05, 0x61, 0x01, - 0x1c, 0x05, 0x20, 0xd5, 0xf7, 0xb6, 0xf8, 0x38, - 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb5, 0xc1, 0x1d, 0xff, 0x31, 0x06, 0x31, 0x07, - 0x1c, 0xff, 0xf7, 0x03, 0xfd, 0xf9, 0x1d, 0xff, - 0x31, 0x38, 0x1c, 0x0a, 0x31, 0xff, 0xf7, 0xfd, - 0xfc, 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x0e, - 0x31, 0xff, 0xf7, 0xf7, 0xfc, 0xf9, 0x1d, 0xff, - 0x31, 0x38, 0x1c, 0x12, 0x31, 0xff, 0xf7, 0xf1, - 0xfc, 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x16, - 0x31, 0xff, 0xf7, 0xeb, 0xfc, 0xf9, 0x1d, 0xff, - 0x31, 0x38, 0x1c, 0x1a, 0x31, 0xff, 0xf7, 0xe5, - 0xfc, 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x2a, - 0x31, 0xff, 0xf7, 0xdf, 0xfc, 0xf9, 0x1d, 0xff, - 0x31, 0x38, 0x1c, 0x1e, 0x31, 0xff, 0xf7, 0xd9, - 0xfc, 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x3a, - 0x31, 0xff, 0xf7, 0xd3, 0xfc, 0xf9, 0x1d, 0xff, - 0x31, 0x38, 0x1c, 0x22, 0x31, 0xff, 0xf7, 0xcd, - 0xfc, 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x26, - 0x31, 0xff, 0xf7, 0xc7, 0xfc, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x83, 0xb0, 0x0c, - 0x1c, 0x07, 0x1c, 0xff, 0xf7, 0xb4, 0xff, 0x00, - 0x22, 0xed, 0x09, 0x00, 0xc1, 0x02, 0x38, 0x1c, - 0x21, 0x1c, 0xff, 0xf7, 0xe3, 0xfe, 0x00, 0x22, - 0x00, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x00, 0x92, - 0xff, 0xf7, 0x8c, 0xfe, 0x00, 0x22, 0x38, 0x1c, - 0x21, 0x1c, 0xff, 0xf7, 0x11, 0xff, 0x05, 0x23, - 0xdb, 0x01, 0xfd, 0x18, 0x38, 0x1c, 0x21, 0x1c, - 0x6a, 0x6b, 0xff, 0xf7, 0x7b, 0xff, 0x0b, 0x23, - 0x9b, 0x01, 0xfb, 0x18, 0x10, 0x33, 0x07, 0xcb, - 0x00, 0x90, 0x1c, 0x3b, 0x01, 0x91, 0x02, 0x92, - 0xdb, 0x68, 0x38, 0x1c, 0x21, 0x1c, 0xea, 0x68, - 0xff, 0xf7, 0x42, 0xff, 0x00, 0x22, 0x38, 0x1c, - 0x21, 0x1c, 0xff, 0xf7, 0x90, 0xfe, 0x00, 0x22, - 0x38, 0x1c, 0x21, 0x1c, 0x08, 0xf0, 0x20, 0xf8, - 0x03, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x80, 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0x05, 0xf0, - 0x60, 0xfc, 0x09, 0x4a, 0x08, 0x21, 0x00, 0x91, - 0x01, 0x92, 0x02, 0x1c, 0x27, 0x21, 0x01, 0x23, - 0x38, 0x1c, 0x05, 0xf0, 0x6e, 0xfe, 0x38, 0x1c, - 0xff, 0xf7, 0x4a, 0xfc, 0x02, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, - 0x7c, 0xae, 0x03, 0x20, 0x00, 0xb5, 0x00, 0x21, - 0xff, 0xf7, 0x6c, 0xf8, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x00, 0xb5, 0x01, 0x21, 0xff, 0xf7, - 0x65, 0xf8, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0x80, 0xb5, 0x07, 0x1c, 0x05, 0xf0, 0x39, 0xfc, - 0x02, 0x1c, 0x00, 0x23, 0x31, 0x21, 0x38, 0x1c, - 0x05, 0xf0, 0x4b, 0xfe, 0x38, 0x1c, 0xff, 0xf7, - 0x27, 0xfc, 0x80, 0xbc, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0xb0, 0xb5, 0x00, 0x25, 0x07, 0x1c, - 0xff, 0xf7, 0x06, 0xfc, 0x38, 0x1c, 0x00, 0xf0, - 0x39, 0xff, 0x04, 0x1c, 0x18, 0x28, 0x20, 0xd0, - 0x28, 0x28, 0x19, 0xd0, 0x37, 0x28, 0x13, 0xd1, - 0x38, 0x1c, 0x05, 0xf0, 0xed, 0x09, 0x00, 0xc2, - 0x02, 0x1a, 0xfc, 0x02, 0x1c, 0x00, 0x23, 0x31, - 0x21, 0x38, 0x1c, 0x05, 0xf0, 0x2c, 0xfe, 0x05, - 0x1c, 0x38, 0x1c, 0x00, 0x22, 0x21, 0x1c, 0x00, - 0xf0, 0xf5, 0xff, 0x00, 0x28, 0x02, 0xd1, 0x38, - 0x1c, 0xff, 0xf7, 0x00, 0xfc, 0x28, 0x1c, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0x26, 0xf8, 0xf6, 0xe7, 0x00, - 0x21, 0x38, 0x1c, 0xff, 0xf7, 0x21, 0xf8, 0xf1, - 0xe7, 0xf0, 0xb5, 0x84, 0xb0, 0x00, 0x24, 0x07, - 0x1c, 0xff, 0xf7, 0xd4, 0xfb, 0x2e, 0x4e, 0xfd, - 0x23, 0x9b, 0x00, 0x70, 0x6a, 0xfd, 0x18, 0x00, - 0x28, 0x32, 0xd0, 0x68, 0x46, 0x10, 0x22, 0x29, - 0x1c, 0xd4, 0xf7, 0xac, 0xfb, 0x38, 0x1c, 0x03, - 0xf0, 0x6b, 0xfa, 0x00, 0x28, 0x27, 0xd1, 0x38, - 0x69, 0x01, 0x28, 0x05, 0xd1, 0x00, 0x22, 0x1f, - 0x21, 0x38, 0x1c, 0x00, 0xf0, 0x87, 0xff, 0x1e, - 0xe0, 0x69, 0x46, 0x10, 0x22, 0x28, 0x1c, 0xd4, - 0xf7, 0x99, 0xfb, 0x38, 0x1c, 0x05, 0xf0, 0xdb, - 0xfb, 0x09, 0x23, 0x9b, 0x01, 0xf9, 0x18, 0x08, - 0x63, 0xf9, 0x1d, 0xff, 0x31, 0xba, 0x31, 0x02, - 0x20, 0x48, 0x63, 0xf0, 0x6b, 0x01, 0x28, 0x05, - 0xd1, 0x00, 0x22, 0x30, 0x21, 0x38, 0x1c, 0x00, - 0xf0, 0x6d, 0xff, 0x04, 0xe0, 0x00, 0x22, 0x31, - 0x21, 0x38, 0x1c, 0x00, 0xf0, 0x67, 0xff, 0x1d, - 0xe0, 0x0d, 0x20, 0xb8, 0x61, 0x38, 0x1c, 0x05, - 0xf0, 0xbe, 0xfb, 0x01, 0x1c, 0x38, 0x1c, 0x2a, - 0x1c, 0x02, 0xf0, 0xd3, 0xf8, 0x38, 0x1c, 0x05, - 0xf0, 0xae, 0xfb, 0x02, 0x1c, 0x00, 0x23, 0x31, - 0x21, 0x38, 0x1c, 0x05, 0xf0, 0xc0, 0xfd, 0x04, - 0x1c, 0x00, 0x22, 0x37, 0x21, 0x38, 0x1c, 0x00, - 0xf0, 0x89, 0xff, 0x00, 0x28, 0x02, 0xd1, 0x38, - 0x1c, 0xff, 0xf7, 0x94, 0xfb, 0x20, 0x1c, 0xed, - 0x09, 0x00, 0xc3, 0x02, 0x04, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xf8, 0xad, - 0x03, 0x20, 0xb0, 0xb5, 0x87, 0xb0, 0x07, 0x1c, - 0xff, 0xf7, 0x6f, 0xfb, 0x38, 0x1c, 0x00, 0xf0, - 0xa2, 0xfe, 0xfd, 0x1d, 0x39, 0x4b, 0xff, 0x35, - 0x3a, 0x35, 0xfc, 0x18, 0x28, 0x28, 0x37, 0xd1, - 0x38, 0x69, 0x02, 0x28, 0x24, 0xd1, 0x01, 0xa8, - 0xfc, 0xf7, 0xf9, 0xf9, 0x02, 0x9a, 0x21, 0x1c, - 0x00, 0x92, 0xfa, 0x1d, 0xff, 0x32, 0x6e, 0x32, - 0x01, 0x9b, 0x03, 0xa8, 0xfd, 0xf7, 0x99, 0xfd, - 0x04, 0x21, 0x09, 0x23, 0x9b, 0x01, 0xf8, 0x18, - 0x00, 0x91, 0x03, 0xaa, 0x01, 0x92, 0x42, 0x6b, - 0x0c, 0x21, 0x01, 0x23, 0x38, 0x1c, 0x05, 0xf0, - 0x81, 0xfd, 0x00, 0x28, 0x03, 0xd1, 0x38, 0x1c, - 0x04, 0xa9, 0xfe, 0xf7, 0x3e, 0xfa, 0xe9, 0x6a, - 0x38, 0x1c, 0xfe, 0xf7, 0x84, 0xff, 0x0e, 0xe0, - 0xe9, 0x6a, 0x38, 0x1c, 0xfe, 0xf7, 0x7f, 0xff, - 0x38, 0x1c, 0x05, 0xf0, 0x5f, 0xfb, 0x1f, 0xa2, - 0x00, 0x92, 0x0b, 0x22, 0x01, 0x1c, 0x23, 0x23, - 0x38, 0x1c, 0x05, 0xf0, 0xeb, 0xfd, 0x2e, 0xe0, - 0x18, 0x28, 0x13, 0xd1, 0x10, 0x22, 0x21, 0x1c, - 0x03, 0xa8, 0xd4, 0xf7, 0x0a, 0xfb, 0xe9, 0x6a, - 0x38, 0x1c, 0xfe, 0xf7, 0x68, 0xff, 0x38, 0x69, - 0x02, 0x28, 0x04, 0xd1, 0x10, 0x22, 0x20, 0x1c, - 0x03, 0xa9, 0xd4, 0xf7, 0xfe, 0xfa, 0x1f, 0x20, - 0xb8, 0x61, 0x18, 0xe0, 0x1d, 0x20, 0xb8, 0x61, - 0x38, 0x1c, 0x21, 0x1c, 0xfe, 0xf7, 0x75, 0xfa, - 0x38, 0x1c, 0x05, 0xf0, 0x2f, 0xfb, 0x02, 0x1c, - 0x00, 0x23, 0x31, 0x21, 0x38, 0x1c, 0x05, 0xf0, - 0x41, 0xfd, 0x00, 0x22, 0x37, 0x21, 0x38, 0x1c, - 0x00, 0xf0, 0x0b, 0xff, 0x00, 0x28, 0x02, 0xd1, - 0x38, 0x1c, 0xff, 0xf7, 0x16, 0xfb, 0x07, 0xb0, - 0xb0, 0xbc, 0xed, 0x09, 0x00, 0xc4, 0x02, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, 0x04, - 0x04, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x6d, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, - 0x3a, 0x20, 0x31, 0x36, 0x32, 0x34, 0x00, 0x01, - 0x1c, 0x00, 0x20, 0xc0, 0x31, 0x8a, 0x68, 0x4a, - 0x60, 0x70, 0x47, 0x90, 0xb5, 0x82, 0xb0, 0x00, - 0x24, 0x07, 0x1c, 0xff, 0xf7, 0xe0, 0xfa, 0x38, - 0x69, 0x02, 0x28, 0x13, 0xd1, 0xf8, 0x1d, 0xb9, - 0x30, 0x81, 0x6b, 0x00, 0x29, 0x0e, 0xd1, 0x01, - 0x21, 0x41, 0x63, 0x38, 0x1c, 0x05, 0xf0, 0xf4, - 0xfa, 0x0b, 0x4a, 0x08, 0x21, 0x00, 0x91, 0x01, - 0x92, 0x02, 0x1c, 0x27, 0x21, 0x01, 0x23, 0x38, - 0x1c, 0x05, 0xf0, 0x02, 0xfd, 0x38, 0x1c, 0x01, - 0xf0, 0x58, 0xfb, 0x00, 0x22, 0x00, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0x91, 0xfc, 0x20, 0x1c, 0x02, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x7c, - 0xae, 0x03, 0x20, 0x00, 0xb5, 0xff, 0xf7, 0xb7, - 0xfa, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0xb5, 0x00, 0x22, 0xa1, 0x21, 0x00, 0xf0, 0x7b, - 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, - 0xf0, 0xcb, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x01, 0xf0, 0xc6, 0xff, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x01, 0xf0, 0xc1, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, 0xf0, 0xbc, - 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x01, - 0xf0, 0xb7, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0xc2, 0x1d, 0xff, 0x32, 0x7a, 0x32, 0x53, - 0x6b, 0x00, 0x2b, 0x02, 0xd0, 0x00, 0x23, 0x53, - 0x63, 0x01, 0xe0, 0x01, 0x23, 0x53, 0x63, 0x52, - 0x6b, 0x01, 0xf0, 0x8d, 0xff, 0x08, 0xbc, 0x18, - 0x47, 0x80, 0xb5, 0x07, 0x1c, 0xf9, 0x1d, 0xb9, - 0x31, 0x49, 0x68, 0x00, 0x20, 0xed, 0x09, 0x00, - 0xc5, 0x02, 0x00, 0x29, 0x08, 0xd1, 0xf8, 0x1d, - 0xff, 0x30, 0x7a, 0x30, 0x42, 0x6b, 0x38, 0x1c, - 0x01, 0xf0, 0x7c, 0xff, 0x0e, 0x21, 0x79, 0x61, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0xc2, 0x1d, 0xff, 0x32, 0x7a, 0x32, 0x53, 0x6b, - 0x00, 0x2b, 0x02, 0xd0, 0x00, 0x23, 0x53, 0x63, - 0x01, 0xe0, 0x01, 0x23, 0x53, 0x63, 0x52, 0x6b, - 0x01, 0xf0, 0x68, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x90, 0xb5, 0x0c, 0x1c, 0x68, 0x21, 0x00, 0x22, - 0x07, 0x1c, 0x00, 0xf0, 0x23, 0xfe, 0x38, 0x1c, - 0x21, 0x1c, 0x01, 0xf0, 0x74, 0xff, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x0c, 0x1c, - 0x68, 0x21, 0x00, 0x22, 0x07, 0x1c, 0x00, 0xf0, - 0x15, 0xfe, 0xf8, 0x1d, 0xff, 0x30, 0x7a, 0x30, - 0x41, 0x6b, 0x00, 0x29, 0x02, 0xd0, 0x00, 0x21, - 0x41, 0x63, 0x01, 0xe0, 0x01, 0x21, 0x41, 0x63, - 0x42, 0x6b, 0x38, 0x1c, 0x21, 0x1c, 0x01, 0xf0, - 0x41, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x80, 0xb5, 0xc1, 0x1d, 0xb9, 0x31, 0x49, 0x68, - 0x00, 0x27, 0x00, 0x29, 0x05, 0xd0, 0xc1, 0x1d, - 0xff, 0x31, 0x7a, 0x31, 0x49, 0x6b, 0x00, 0x29, - 0x06, 0xd1, 0x0e, 0x21, 0x41, 0x61, 0x00, 0x21, - 0x01, 0xf0, 0x45, 0xff, 0x07, 0x1c, 0x05, 0xe0, - 0x01, 0x69, 0x01, 0x29, 0x02, 0xd1, 0x00, 0x21, - 0x03, 0xf0, 0xa2, 0xfc, 0x38, 0x1c, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xc2, 0x1d, - 0xb9, 0x32, 0x52, 0x68, 0x00, 0x21, 0x00, 0x2a, - 0x09, 0xd1, 0x0e, 0x21, 0x41, 0x61, 0xc1, 0x1d, - 0xff, 0x31, 0x7a, 0x31, 0x4a, 0x6b, 0x00, 0x21, - 0x01, 0xf0, 0x10, 0xff, 0x01, 0x1c, 0x08, 0xbc, - 0x08, 0x1c, 0x18, 0x47, 0x00, 0xb5, 0x00, 0x21, - 0x01, 0xf0, 0x21, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0xed, 0x09, 0x00, 0xc6, 0x02, 0x00, 0xb5, 0xc1, - 0x1d, 0xff, 0x31, 0x7a, 0x31, 0x4a, 0x6b, 0x00, - 0x21, 0x01, 0xf0, 0xfe, 0xfe, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0x21, 0x01, 0xf0, 0x11, - 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xc1, - 0x1d, 0xff, 0x31, 0x7a, 0x31, 0x4a, 0x6b, 0x00, - 0x21, 0x01, 0xf0, 0xee, 0xfe, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x00, 0x21, 0x01, 0xf0, 0x01, - 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xc1, - 0x1d, 0xff, 0x31, 0x7a, 0x31, 0x4a, 0x6b, 0x00, - 0x21, 0x01, 0xf0, 0xde, 0xfe, 0x08, 0xbc, 0x18, - 0x47, 0x80, 0xb5, 0x01, 0x69, 0x00, 0x27, 0x01, - 0x29, 0x01, 0xd1, 0x03, 0xf0, 0x53, 0xfc, 0x38, - 0x1c, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x20, 0x70, 0x47, 0x80, 0xb5, 0x00, 0x22, 0xa1, - 0x21, 0x07, 0x1c, 0x00, 0xf0, 0x8d, 0xfd, 0x0e, - 0x20, 0x78, 0x61, 0x22, 0x21, 0x38, 0x1c, 0x01, - 0xf0, 0xdc, 0xfe, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x80, 0xb5, 0x00, 0x22, 0xa1, 0x21, 0x07, - 0x1c, 0x00, 0xf0, 0x7e, 0xfd, 0xf8, 0x1d, 0xff, - 0x30, 0x7a, 0x30, 0x41, 0x6b, 0x00, 0x29, 0x02, - 0xd0, 0x00, 0x21, 0x41, 0x63, 0x01, 0xe0, 0x01, - 0x21, 0x41, 0x63, 0x42, 0x6b, 0x22, 0x21, 0x38, - 0x1c, 0x01, 0xf0, 0xaa, 0xfe, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x82, 0xb0, 0x07, - 0x1c, 0x07, 0xf0, 0x56, 0xfc, 0xf9, 0x1d, 0x79, - 0x31, 0x22, 0x20, 0x08, 0x63, 0x38, 0x1c, 0x05, - 0xf0, 0xb4, 0xf9, 0xfa, 0x1d, 0xa9, 0x32, 0x01, - 0x21, 0x00, 0x91, 0x01, 0x92, 0x02, 0x1c, 0x07, - 0x21, 0x01, 0x23, 0x38, 0x1c, 0x05, 0xf0, 0xc1, - 0xfb, 0x04, 0x1c, 0x14, 0xd1, 0x0b, 0x23, 0x9b, - 0x01, 0xf8, 0x18, 0xc0, 0x69, 0x43, 0x00, 0x18, - 0x18, 0x09, 0x4b, 0xed, 0x09, 0x00, 0xc7, 0x02, - 0x40, 0x00, 0x58, 0x43, 0x40, 0x00, 0x5b, 0x03, - 0xc2, 0x18, 0x38, 0x69, 0x00, 0x23, 0x01, 0x21, - 0x01, 0x28, 0x00, 0xd0, 0x00, 0x21, 0x38, 0x1c, - 0xff, 0xf7, 0x0d, 0xfa, 0x20, 0x1c, 0x02, 0xb0, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x71, 0x02, - 0x00, 0x00, 0x90, 0xb5, 0x83, 0xb0, 0x07, 0x1c, - 0x22, 0x20, 0x02, 0x90, 0x38, 0x1c, 0x07, 0xf0, - 0x1e, 0xfc, 0x38, 0x1c, 0x05, 0xf0, 0x80, 0xf9, - 0x01, 0x21, 0x02, 0xaa, 0x01, 0x92, 0x00, 0x91, - 0x07, 0x21, 0x02, 0x1c, 0x01, 0x23, 0x38, 0x1c, - 0x05, 0xf0, 0x8e, 0xfb, 0x04, 0x1c, 0x14, 0xd1, - 0x0b, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0xc0, 0x69, - 0x43, 0x00, 0x18, 0x18, 0x0a, 0x4b, 0x40, 0x00, - 0x58, 0x43, 0x40, 0x00, 0x5b, 0x03, 0xc2, 0x18, - 0x38, 0x69, 0x00, 0x23, 0x01, 0x21, 0x01, 0x28, - 0x00, 0xd0, 0x00, 0x21, 0x38, 0x1c, 0xff, 0xf7, - 0xda, 0xf9, 0x20, 0x1c, 0x03, 0xb0, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x71, 0x02, - 0x00, 0x00, 0x00, 0xb5, 0x02, 0xa1, 0xff, 0xf7, - 0x93, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, - 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x50, - 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x00, - 0x00, 0x00, 0x00, 0xb5, 0x02, 0xa1, 0xff, 0xf7, - 0x77, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, - 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x00, 0x00, 0xb5, - 0x02, 0xa1, 0xff, 0xf7, 0x61, 0xff, 0xed, 0x09, - 0x00, 0xc8, 0x02, 0x08, 0xbc, 0x18, 0x47, 0x4c, - 0x6d, 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, - 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x00, 0x00, 0x00, - 0xb5, 0x02, 0xa1, 0xff, 0xf7, 0x47, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x43, 0x6e, 0x74, - 0x72, 0x6c, 0x53, 0x74, 0x53, 0x65, 0x74, 0x75, - 0x70, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x00, 0x00, 0x00, 0x90, 0xb5, 0x00, 0x27, 0x04, - 0x1c, 0xd4, 0xf7, 0x48, 0xfc, 0x00, 0x28, 0x01, - 0xd1, 0x07, 0x27, 0x07, 0xe0, 0x57, 0x21, 0x01, - 0x60, 0x21, 0x6b, 0xc1, 0x60, 0x01, 0x1c, 0x07, - 0x20, 0xd4, 0xf7, 0xab, 0xfc, 0x38, 0x1c, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x00, - 0x27, 0x04, 0x1c, 0xd4, 0xf7, 0x33, 0xfc, 0x00, - 0x28, 0x01, 0xd1, 0x07, 0x27, 0x07, 0xe0, 0x57, - 0x21, 0x01, 0x60, 0x21, 0x6b, 0xc1, 0x60, 0x01, - 0x1c, 0x07, 0x20, 0xd4, 0xf7, 0x96, 0xfc, 0x38, - 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, - 0xb5, 0x00, 0x24, 0x05, 0x1c, 0x80, 0x30, 0x01, - 0x63, 0xd4, 0xf7, 0x1c, 0xfc, 0x07, 0x1c, 0x01, - 0xd1, 0x07, 0x24, 0x0a, 0xe0, 0x28, 0x1c, 0x07, - 0xf0, 0x54, 0xfb, 0x57, 0x20, 0x38, 0x60, 0x28, - 0x6b, 0xf8, 0x60, 0x07, 0x20, 0x39, 0x1c, 0xd4, - 0xf7, 0x7c, 0xfc, 0x20, 0x1c, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x83, 0xb0, 0x1c, - 0x1c, 0x0d, 0x1c, 0x07, 0x1c, 0x07, 0xf0, 0x41, - 0xfb, 0x02, 0x95, 0x00, 0x2d, 0x01, 0xd1, 0x13, - 0x20, 0xed, 0x09, 0x00, 0xc9, 0x02, 0x02, 0x90, - 0x38, 0x1c, 0x05, 0xf0, 0x9e, 0xf8, 0x01, 0x21, - 0x02, 0xaa, 0x01, 0x92, 0x00, 0x91, 0x07, 0x21, - 0x02, 0x1c, 0x01, 0x23, 0x38, 0x1c, 0x05, 0xf0, - 0xac, 0xfa, 0x05, 0x1c, 0x14, 0xd1, 0x0b, 0x23, - 0x9b, 0x01, 0xf8, 0x18, 0xc0, 0x69, 0x43, 0x00, - 0x18, 0x18, 0x0f, 0x4b, 0x40, 0x00, 0x58, 0x43, - 0x40, 0x00, 0x5b, 0x03, 0xc2, 0x18, 0x38, 0x69, - 0x00, 0x23, 0x01, 0x21, 0x01, 0x28, 0x00, 0xd0, - 0x00, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0xf8, 0xf8, - 0x00, 0x2c, 0x08, 0xd0, 0x20, 0x68, 0x13, 0x28, - 0x03, 0xd0, 0x14, 0x28, 0x01, 0xd0, 0x15, 0x28, - 0x01, 0xd1, 0x16, 0x20, 0x20, 0x60, 0x28, 0x1c, - 0x03, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x71, 0x02, 0x00, 0x00, 0x90, 0xb5, 0x0c, 0x1c, - 0x07, 0x1c, 0xff, 0xf7, 0x45, 0xf8, 0xf8, 0x1d, - 0x79, 0x30, 0x04, 0x63, 0x38, 0x1c, 0x21, 0x1c, - 0xfb, 0x1d, 0xa9, 0x33, 0x02, 0xa2, 0xff, 0xf7, - 0xaf, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, - 0x74, 0x50, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, 0xff, 0xf7, - 0x1f, 0xf8, 0xf8, 0x1d, 0x79, 0x30, 0x04, 0x63, - 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0x1d, 0xa9, 0x33, - 0x02, 0xa2, 0xff, 0xf7, 0x89, 0xff, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x43, 0x6e, - 0x74, 0x72, 0x6c, 0x53, 0x74, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x00, - 0x00, 0xb5, 0xc2, 0x1d, 0xed, 0x09, 0x00, 0xca, - 0x02, 0x79, 0x32, 0x11, 0x63, 0xc3, 0x1d, 0xa9, - 0x33, 0x02, 0xa2, 0xff, 0xf7, 0x6f, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x43, - 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x64, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xc2, - 0x1d, 0x79, 0x32, 0x11, 0x63, 0xc3, 0x1d, 0xa9, - 0x33, 0x02, 0xa2, 0xff, 0xf7, 0x53, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x43, - 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x41, 0x6e, 0x73, - 0x77, 0x65, 0x72, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x00, 0x00, - 0x00, 0xb0, 0xb5, 0xc5, 0x1d, 0xf9, 0x35, 0x07, - 0x1c, 0x68, 0x68, 0x0c, 0x1c, 0x00, 0x28, 0x04, - 0xd0, 0x09, 0xa1, 0xfc, 0xf7, 0x53, 0xfd, 0x00, - 0x20, 0x68, 0x60, 0xf8, 0x1d, 0x79, 0x30, 0x04, - 0x63, 0xfb, 0x1d, 0xa9, 0x33, 0x38, 0x1c, 0x21, - 0x1c, 0x00, 0xa2, 0x50, 0x3a, 0xff, 0xf7, 0x26, - 0xff, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x32, 0x32, 0x33, 0x33, 0x00, 0x90, 0xb5, 0x0c, - 0x1c, 0x07, 0x1c, 0xfe, 0xf7, 0x9f, 0xff, 0xf8, - 0x1d, 0x79, 0x30, 0x04, 0x63, 0x38, 0x1c, 0x21, - 0x1c, 0xfb, 0x1d, 0xa9, 0x33, 0x02, 0xa2, 0xff, - 0xf7, 0x09, 0xff, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, 0x6c, - 0x53, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0xed, - 0x09, 0x00, 0xcb, 0x02, 0x65, 0x63, 0x74, 0x00, - 0x00, 0x00, 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, - 0xfe, 0xf7, 0x7b, 0xff, 0xf8, 0x1d, 0x79, 0x30, - 0x04, 0x63, 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0x1d, - 0xa9, 0x33, 0x02, 0xa2, 0xff, 0xf7, 0xe5, 0xfe, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, - 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x53, - 0x65, 0x74, 0x75, 0x70, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xb5, 0xc2, 0x1d, 0x79, 0x32, - 0x51, 0x63, 0xc3, 0x1d, 0xad, 0x33, 0x02, 0xa2, - 0xff, 0xf7, 0xc7, 0xfe, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, - 0x6c, 0x53, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xb5, 0xfe, 0xf7, 0x3d, 0xff, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0xb5, - 0xff, 0xf7, 0xb7, 0xfa, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x80, 0x30, 0x01, 0x63, 0x00, 0x20, - 0x70, 0x47, 0x80, 0x30, 0x01, 0x63, 0x00, 0x20, - 0x70, 0x47, 0x90, 0xb5, 0xc4, 0x1d, 0xf9, 0x34, - 0x60, 0x68, 0x00, 0x27, 0x00, 0x28, 0x03, 0xd0, - 0x04, 0xa1, 0xfc, 0xf7, 0xb6, 0xfc, 0x67, 0x60, - 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, - 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, - 0x20, 0x32, 0x33, 0x30, 0x37, 0x00, 0x00, 0xb5, - 0xc2, 0x1d, 0x79, 0x32, 0x11, 0x63, 0xfe, 0xf7, - 0x0c, 0xff, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0x00, 0xb5, 0xc2, 0x1d, 0x79, 0x32, 0x11, 0x63, - 0xfe, 0xf7, 0xed, 0x09, 0x00, 0xcc, 0x02, 0x03, - 0xff, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0xb5, 0xc2, 0x1d, 0x79, 0x32, 0x11, 0x63, 0xfe, - 0xf7, 0xfa, 0xfe, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, 0xff, - 0xf7, 0x72, 0xfa, 0xf9, 0x1d, 0x15, 0x31, 0x55, - 0x22, 0x38, 0x1c, 0x23, 0x1c, 0x00, 0xf0, 0x7d, - 0xfa, 0xf9, 0x1d, 0x19, 0x31, 0x55, 0x22, 0x38, - 0x1c, 0x23, 0x1c, 0x00, 0xf0, 0x76, 0xfa, 0xf9, - 0x1d, 0x1d, 0x31, 0x55, 0x22, 0x38, 0x1c, 0x23, - 0x1c, 0x00, 0xf0, 0x6f, 0xfa, 0xf9, 0x1d, 0x21, - 0x31, 0x55, 0x22, 0x38, 0x1c, 0x23, 0x1c, 0x00, - 0xf0, 0x68, 0xfa, 0x55, 0x21, 0x38, 0x1c, 0x22, - 0x1c, 0x00, 0xf0, 0x9d, 0xfa, 0xf8, 0x1d, 0x79, - 0x30, 0x44, 0x63, 0x90, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x02, 0xa1, 0x0c, 0xc9, 0xb8, - 0x30, 0x0c, 0xc0, 0x00, 0x20, 0x70, 0x47, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, - 0xb5, 0x09, 0x06, 0x09, 0x0e, 0x00, 0x22, 0x07, - 0x1c, 0xff, 0xf7, 0x89, 0xf8, 0x04, 0x1c, 0xf8, - 0x6a, 0x00, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x02, - 0x21, 0x38, 0x1c, 0x03, 0xa2, 0xfe, 0xf7, 0x49, - 0xfc, 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x6d, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, - 0x3a, 0x20, 0x32, 0x33, 0x37, 0x39, 0x00, 0x90, - 0xb5, 0x0a, 0x06, 0x12, 0x0e, 0x00, 0x23, 0x00, - 0x21, 0x04, 0x1c, 0xff, 0xf7, 0x92, 0xf8, 0x07, - 0x1c, 0x20, 0x1c, 0x00, 0x21, 0x03, 0xa2, 0xfe, - 0xf7, 0x2c, 0xfc, 0x38, 0x1c, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x6d, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, - 0x3a, 0x20, 0x32, 0x33, 0x39, 0xed, 0x09, 0x00, - 0xcd, 0x02, 0x32, 0x00, 0x00, 0xb5, 0x02, 0xa2, - 0xff, 0xf7, 0xc0, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, - 0x74, 0x42, 0x42, 0x50, 0x61, 0x67, 0x65, 0x42, - 0x42, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, 0x00, - 0x00, 0xb5, 0x03, 0xa2, 0x02, 0x21, 0xfe, 0xf7, - 0x07, 0xfc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, - 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, - 0x34, 0x30, 0x38, 0x00, 0x80, 0xb5, 0x07, 0x1c, - 0xff, 0xf7, 0xdc, 0xf9, 0x38, 0x1c, 0x02, 0x21, - 0x03, 0xa2, 0xfe, 0xf7, 0xf1, 0xfb, 0x80, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, - 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, - 0x34, 0x31, 0x37, 0x00, 0x00, 0xb5, 0x02, 0xa2, - 0xff, 0xf7, 0x84, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x42, 0x42, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, 0xa2, - 0xff, 0xf7, 0x70, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x64, 0x42, 0x42, 0x44, 0x65, 0x74, - 0x61, 0x63, 0x68, 0x00, 0x00, 0xb5, 0x02, 0xa2, - 0xff, 0xf7, 0x5c, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x4f, 0x6b, - 0x42, 0x42, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xc1, 0x1d, - 0xed, 0x09, 0x00, 0xce, 0x02, 0x79, 0x31, 0x09, - 0x6b, 0x02, 0xa2, 0xff, 0xf7, 0x41, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x43, - 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x41, 0x6e, 0x73, - 0x77, 0x65, 0x72, 0x52, 0x65, 0x6a, 0x65, 0x63, - 0x74, 0x42, 0x42, 0x44, 0x65, 0x74, 0x61, 0x63, - 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, - 0xa2, 0xff, 0xf7, 0x26, 0xff, 0x08, 0xbc, 0x18, - 0x47, 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, 0x6c, - 0x53, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x42, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, - 0x00, 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, 0xfe, - 0xf7, 0xcf, 0xfd, 0x38, 0x1c, 0x21, 0x1c, 0x03, - 0xa2, 0xff, 0xf7, 0x0a, 0xff, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x43, - 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x53, 0x65, - 0x74, 0x75, 0x70, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x42, 0x42, 0x44, 0x65, 0x74, - 0x61, 0x63, 0x68, 0x00, 0x00, 0x90, 0xb5, 0x0c, - 0x1c, 0x07, 0x1c, 0xff, 0xf7, 0x31, 0xf9, 0xf9, - 0x1d, 0x15, 0x31, 0x9a, 0x22, 0x38, 0x1c, 0x23, - 0x1c, 0x00, 0xf0, 0x3c, 0xf9, 0xf9, 0x1d, 0x19, - 0x31, 0x9a, 0x22, 0x38, 0x1c, 0x23, 0x1c, 0x00, - 0xf0, 0x35, 0xf9, 0xf9, 0x1d, 0x1d, 0x31, 0x9a, - 0x22, 0x38, 0x1c, 0x23, 0x1c, 0x00, 0xf0, 0x2e, - 0xf9, 0xf9, 0x1d, 0x21, 0x31, 0x9a, 0x22, 0x38, - 0x1c, 0x23, 0x1c, 0x00, 0xf0, 0x27, 0xf9, 0x9a, - 0x21, 0x38, 0x1c, 0x22, 0x1c, 0x00, 0xf0, 0x5c, - 0xf9, 0x38, 0x1c, 0x21, 0x1c, 0x02, 0xa2, 0xff, - 0xf7, 0xeb, 0xfe, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x4c, 0x6d, 0xed, 0x09, 0x00, 0xcf, 0x02, - 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x42, 0x42, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, - 0x00, 0x00, 0x00, 0xb5, 0xc2, 0x1d, 0x79, 0x32, - 0x52, 0x6b, 0x00, 0x2a, 0x04, 0xd0, 0x04, 0xa2, - 0xff, 0xf7, 0xd1, 0xfe, 0x08, 0xbc, 0x18, 0x47, - 0x02, 0xa2, 0xff, 0xf7, 0xac, 0xfe, 0xf9, 0xe7, - 0x00, 0x00, 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, - 0x6c, 0x53, 0x74, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, - 0x42, 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, 0x00, - 0x00, 0x00, 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, - 0xff, 0xf7, 0xd5, 0xf8, 0xf9, 0x1d, 0x15, 0x31, - 0x9a, 0x22, 0x38, 0x1c, 0x23, 0x1c, 0x00, 0xf0, - 0xe0, 0xf8, 0xf9, 0x1d, 0x19, 0x31, 0x9a, 0x22, - 0x38, 0x1c, 0x23, 0x1c, 0x00, 0xf0, 0xd9, 0xf8, - 0xf9, 0x1d, 0x1d, 0x31, 0x9a, 0x22, 0x38, 0x1c, - 0x23, 0x1c, 0x00, 0xf0, 0xd2, 0xf8, 0xf9, 0x1d, - 0x21, 0x31, 0x9a, 0x22, 0x38, 0x1c, 0x23, 0x1c, - 0x00, 0xf0, 0xcb, 0xf8, 0x9a, 0x21, 0x38, 0x1c, - 0x22, 0x1c, 0x00, 0xf0, 0x00, 0xf9, 0xf8, 0x1d, - 0x79, 0x30, 0x40, 0x6b, 0x00, 0x28, 0x07, 0xd0, - 0x38, 0x1c, 0x21, 0x1c, 0x06, 0xa2, 0xff, 0xf7, - 0x8a, 0xfe, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x38, 0x1c, 0x21, 0x1c, 0x02, 0xa2, 0xff, 0xf7, - 0x62, 0xfe, 0xf6, 0xe7, 0x00, 0x00, 0x4c, 0x6d, - 0x43, 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x74, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x42, 0x42, 0x44, 0x65, 0x74, 0x61, 0x63, - 0x68, 0x00, 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, - 0xff, 0xf7, 0x8d, 0xf8, 0xf9, 0x1d, 0x15, 0x31, - 0x9a, 0x22, 0x38, 0x1c, 0x23, 0x1c, 0xed, 0x09, - 0x00, 0xd0, 0x02, 0x00, 0xf0, 0x98, 0xf8, 0xf9, - 0x1d, 0x19, 0x31, 0x9a, 0x22, 0x38, 0x1c, 0x23, - 0x1c, 0x00, 0xf0, 0x91, 0xf8, 0xf9, 0x1d, 0x1d, - 0x31, 0x9a, 0x22, 0x38, 0x1c, 0x23, 0x1c, 0x00, - 0xf0, 0x8a, 0xf8, 0xf9, 0x1d, 0x21, 0x31, 0x9a, - 0x22, 0x38, 0x1c, 0x23, 0x1c, 0x00, 0xf0, 0x83, - 0xf8, 0x9a, 0x21, 0x38, 0x1c, 0x22, 0x1c, 0x00, - 0xf0, 0xb8, 0xf8, 0xf8, 0x1d, 0x79, 0x30, 0x40, - 0x6b, 0x00, 0x28, 0x07, 0xd0, 0x38, 0x1c, 0x21, - 0x1c, 0x06, 0xa2, 0xff, 0xf7, 0x42, 0xfe, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0x21, - 0x1c, 0x02, 0xa2, 0xff, 0xf7, 0x1a, 0xfe, 0xf6, - 0xe7, 0x00, 0x00, 0x4c, 0x6d, 0x43, 0x6e, 0x74, - 0x72, 0x6c, 0x53, 0x74, 0x42, 0x42, 0x44, 0x65, - 0x74, 0x61, 0x63, 0x68, 0x42, 0x42, 0x44, 0x65, - 0x74, 0x61, 0x63, 0x68, 0x00, 0x00, 0x00, 0x90, - 0xb5, 0x07, 0x1c, 0x79, 0x69, 0xa5, 0x20, 0x04, - 0x29, 0x05, 0xd0, 0x05, 0x29, 0x03, 0xd0, 0x07, - 0x29, 0x01, 0xd0, 0x09, 0x29, 0x24, 0xd1, 0xf8, - 0x1d, 0xb9, 0x30, 0x80, 0x6b, 0x00, 0x28, 0x02, - 0xd1, 0x38, 0x69, 0x02, 0x28, 0x23, 0xd1, 0x12, - 0x48, 0x40, 0x6a, 0x00, 0x28, 0x1d, 0xd0, 0xf9, - 0x1d, 0x9d, 0x31, 0xfc, 0x1d, 0xff, 0x34, 0x08, - 0x68, 0x49, 0x68, 0x3a, 0x34, 0xfe, 0xf7, 0xab, - 0xfd, 0x00, 0x28, 0x10, 0xd0, 0xc1, 0x6a, 0x00, - 0x29, 0x0d, 0xd0, 0xfa, 0x1d, 0xff, 0x32, 0xc1, - 0x1d, 0x29, 0x31, 0x6e, 0x32, 0x10, 0x1c, 0x8e, - 0xc9, 0x8e, 0xc0, 0x01, 0x20, 0xe0, 0x62, 0x28, - 0x20, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x18, - 0x20, 0xfa, 0xe7, 0x37, 0x20, 0xf8, 0xe7, 0x0b, - 0x20, 0xf6, 0xe7, 0xf8, 0xad, 0x03, 0x20, 0x08, - 0x68, 0x0d, 0x49, 0x80, 0x00, 0x08, 0x58, 0x0c, - 0x49, 0xed, 0x09, 0x00, 0xd1, 0x02, 0x43, 0x00, - 0x18, 0x18, 0x80, 0x00, 0x41, 0x18, 0x08, 0x68, - 0x00, 0x23, 0xa5, 0x28, 0x08, 0xd0, 0x08, 0x68, - 0x90, 0x42, 0x01, 0xd1, 0x01, 0x23, 0x03, 0xe0, - 0xc8, 0x68, 0x0c, 0x31, 0xa5, 0x28, 0xf6, 0xd1, - 0x00, 0x20, 0x00, 0x2b, 0x00, 0xd0, 0x08, 0x1c, - 0x70, 0x47, 0x00, 0x00, 0xb8, 0xa8, 0x03, 0x20, - 0x84, 0x94, 0x03, 0x20, 0xf0, 0xb5, 0x00, 0x27, - 0x0c, 0x1c, 0x05, 0x1c, 0x1e, 0x1c, 0xff, 0xf7, - 0xd9, 0xff, 0x00, 0x28, 0x0a, 0xd0, 0x41, 0x68, - 0x21, 0x60, 0x82, 0x68, 0x00, 0x2a, 0x07, 0xd0, - 0x28, 0x1c, 0x31, 0x1c, 0xd3, 0xf7, 0x20, 0xfc, - 0x07, 0x1c, 0x01, 0xe0, 0xff, 0x27, 0x0a, 0x37, - 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x80, 0x69, 0x0d, 0x4a, 0x80, 0x00, 0x10, 0x58, - 0x0c, 0x4a, 0x43, 0x00, 0x18, 0x18, 0x80, 0x00, - 0x82, 0x18, 0x10, 0x68, 0x00, 0x23, 0xa5, 0x28, - 0x08, 0xd0, 0x10, 0x68, 0x88, 0x42, 0x01, 0xd1, - 0x01, 0x23, 0x03, 0xe0, 0xd0, 0x68, 0x0c, 0x32, - 0xa5, 0x28, 0xf6, 0xd1, 0x00, 0x20, 0x00, 0x2b, - 0x00, 0xd0, 0x10, 0x1c, 0x70, 0x47, 0x00, 0x00, - 0xb8, 0xa8, 0x03, 0x20, 0x84, 0x94, 0x03, 0x20, - 0xb0, 0xb5, 0x00, 0x27, 0x04, 0x1c, 0x15, 0x1c, - 0xff, 0xf7, 0xda, 0xff, 0x00, 0x28, 0x0a, 0xd0, - 0x41, 0x68, 0xa1, 0x61, 0x82, 0x68, 0x00, 0x2a, - 0x07, 0xd0, 0x20, 0x1c, 0x29, 0x1c, 0xd3, 0xf7, - 0xe7, 0xfb, 0x07, 0x1c, 0x01, 0xe0, 0xff, 0x27, - 0x0a, 0x37, 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x40, 0x69, 0x0e, 0x4a, 0x80, 0x00, - 0x80, 0x18, 0xff, 0x30, 0x41, 0x30, 0x00, 0x68, - 0x0c, 0x4a, 0x43, 0x00, 0x18, 0x18, 0x80, 0x00, - 0x82, 0x18, 0x10, 0x68, 0x00, 0x23, 0xa5, 0x28, - 0x08, 0xd0, 0x10, 0x68, 0xed, 0x09, 0x00, 0xd2, - 0x02, 0x88, 0x42, 0x01, 0xd1, 0x01, 0x23, 0x03, - 0xe0, 0xd0, 0x68, 0x0c, 0x32, 0xa5, 0x28, 0xf6, - 0xd1, 0x00, 0x20, 0x00, 0x2b, 0x00, 0xd0, 0x10, - 0x1c, 0x70, 0x47, 0x00, 0x00, 0xb8, 0xa8, 0x03, - 0x20, 0x28, 0x7e, 0x03, 0x20, 0xb0, 0xb5, 0x00, - 0x27, 0x04, 0x1c, 0x15, 0x1c, 0xff, 0xf7, 0xd7, - 0xff, 0x00, 0x28, 0x0a, 0xd0, 0x41, 0x68, 0x61, - 0x61, 0x82, 0x68, 0x00, 0x2a, 0x07, 0xd0, 0x20, - 0x1c, 0x29, 0x1c, 0xd3, 0xf7, 0xab, 0xfb, 0x07, - 0x1c, 0x01, 0xe0, 0xff, 0x27, 0x0a, 0x37, 0x38, - 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb5, 0x07, 0x1c, 0xd3, 0xf7, 0x58, 0xff, 0x00, - 0x28, 0x07, 0xd0, 0xd1, 0x21, 0x01, 0x60, 0xf9, - 0x68, 0xc1, 0x60, 0x01, 0x1c, 0x05, 0x20, 0xd3, - 0xf7, 0xbd, 0xff, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf8, 0xb5, 0x05, 0x1c, 0xc0, 0x68, 0xfc, - 0xf7, 0x03, 0xf8, 0x04, 0x1c, 0x3d, 0xd0, 0x6e, - 0x69, 0x00, 0x2e, 0x02, 0xd1, 0x94, 0x21, 0x00, - 0x91, 0x01, 0xe0, 0x95, 0x21, 0x00, 0x91, 0xd3, - 0xf7, 0x3a, 0xff, 0x07, 0x1c, 0x2c, 0xd0, 0x00, - 0x22, 0x20, 0x1c, 0x00, 0x99, 0xff, 0xf7, 0xbe, - 0xff, 0x00, 0x28, 0x03, 0xd0, 0x38, 0x1c, 0xd3, - 0xf7, 0x69, 0xff, 0x21, 0xe0, 0x28, 0x69, 0x20, - 0x63, 0xe0, 0x1d, 0xb9, 0x30, 0xc0, 0x69, 0x00, - 0x28, 0x0c, 0xd0, 0xcf, 0x20, 0x38, 0x60, 0x19, - 0x21, 0x01, 0x20, 0xfb, 0xf7, 0xad, 0xff, 0xf8, - 0x60, 0x05, 0x20, 0x39, 0x1c, 0x3e, 0x61, 0xd3, - 0xf7, 0x89, 0xff, 0x0b, 0xe0, 0xd2, 0x20, 0x38, - 0x60, 0xbe, 0x61, 0xe0, 0x6a, 0xf8, 0x60, 0x3c, - 0x61, 0x00, 0x20, 0x78, 0x61, 0x05, 0x20, 0x39, - 0x1c, 0xd3, 0xf7, 0x7c, 0xff, 0x00, 0x2e, 0x04, - 0xd0, 0x20, 0x1c, 0x01, 0x21, 0x02, 0xa2, 0xed, - 0x09, 0x00, 0xd3, 0x02, 0xfe, 0xf7, 0x23, 0xf9, - 0xf8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, 0x74, 0x72, - 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x38, 0x30, - 0x37, 0x00, 0xf0, 0xb5, 0x82, 0xb0, 0x05, 0x69, - 0x04, 0x1c, 0x00, 0x2d, 0x01, 0xd1, 0x96, 0x26, - 0x00, 0xe0, 0x97, 0x26, 0xe0, 0x68, 0xfb, 0xf7, - 0xaa, 0xff, 0x07, 0x1c, 0x2f, 0xd0, 0x38, 0x1c, - 0x31, 0x1c, 0xff, 0xf7, 0x4f, 0xff, 0x00, 0x28, - 0x29, 0xd0, 0x97, 0x2e, 0x2b, 0xd1, 0xf8, 0x1d, - 0x79, 0x30, 0x00, 0x6b, 0x00, 0x24, 0x02, 0x28, - 0x00, 0xd1, 0x05, 0x1c, 0x00, 0x22, 0x38, 0x1c, - 0x31, 0x1c, 0xff, 0xf7, 0x62, 0xff, 0xf8, 0x1d, - 0xb9, 0x30, 0xc1, 0x69, 0x00, 0x29, 0x08, 0xd0, - 0x00, 0x21, 0xc1, 0x61, 0x38, 0x1c, 0x00, 0x22, - 0x29, 0x1c, 0xfe, 0xf7, 0xf6, 0xfd, 0x02, 0x24, - 0x08, 0xe0, 0x00, 0x22, 0x38, 0x1c, 0x29, 0x1c, - 0xfe, 0xf7, 0x17, 0xfd, 0xf8, 0x6a, 0x00, 0x28, - 0x00, 0xd1, 0x02, 0x24, 0x38, 0x1c, 0x21, 0x1c, - 0x26, 0xa2, 0xfe, 0xf7, 0xd8, 0xf8, 0x02, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x60, 0x69, - 0xf9, 0x68, 0x00, 0x22, 0x48, 0x62, 0xa0, 0x69, - 0xf9, 0x68, 0x88, 0x62, 0x38, 0x1c, 0x31, 0x1c, - 0xff, 0xf7, 0x37, 0xff, 0xf8, 0x1d, 0xb9, 0x30, - 0xc0, 0x69, 0x00, 0x28, 0x25, 0xd0, 0x00, 0x21, - 0x0b, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x5d, 0x23, - 0xdb, 0x00, 0x41, 0x62, 0xf8, 0x18, 0xf9, 0x22, - 0xd3, 0xf7, 0x7b, 0xfa, 0x38, 0x1c, 0x04, 0xf0, - 0x3d, 0xfb, 0xb9, 0x23, 0x9b, 0x00, 0xfa, 0x18, - 0x01, 0x92, 0x01, 0x21, 0x02, 0x1c, 0x01, 0x23, - 0x38, 0x1c, 0x00, 0x91, 0x04, 0xf0, 0x4a, 0xfd, - 0x00, 0x22, 0x0c, 0x21, 0x38, 0x1c, 0xff, 0xf7, - 0x14, 0xff, 0xed, 0x09, 0x00, 0xd4, 0x02, 0xf9, - 0x1d, 0xff, 0x31, 0x0e, 0x31, 0x38, 0x1c, 0x0e, - 0x4a, 0xfe, 0xf7, 0x61, 0xfb, 0x08, 0xe0, 0x00, - 0x23, 0x00, 0x22, 0x33, 0x21, 0x38, 0x1c, 0x04, - 0xf0, 0x37, 0xfd, 0x38, 0x1c, 0xfe, 0xf7, 0x13, - 0xfb, 0x38, 0x1c, 0x06, 0xf0, 0x8e, 0xfd, 0x38, - 0x1c, 0x06, 0xf0, 0xc9, 0xfd, 0xb5, 0xe7, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, 0x74, - 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, 0x38, - 0x35, 0x36, 0x00, 0x9b, 0xb2, 0x02, 0x20, 0xf0, - 0xb5, 0x88, 0xb0, 0x05, 0x1c, 0xe9, 0x1d, 0x0d, - 0x31, 0xc0, 0xc9, 0x06, 0xa8, 0xc0, 0xc0, 0x06, - 0x98, 0x07, 0x99, 0xfe, 0xf7, 0x44, 0xf9, 0x06, - 0x1c, 0xe8, 0x68, 0x00, 0x28, 0x75, 0xd0, 0xd3, - 0xf7, 0x53, 0xfe, 0x04, 0x1c, 0x71, 0xd0, 0x06, - 0x98, 0x01, 0x02, 0x09, 0x0a, 0x04, 0xa8, 0xfb, - 0xf7, 0x48, 0xfe, 0xe8, 0x69, 0x29, 0x6a, 0x37, - 0xa2, 0x03, 0x92, 0x05, 0x9a, 0x01, 0x90, 0x02, - 0x91, 0x00, 0x92, 0x02, 0x22, 0x07, 0x99, 0x06, - 0x98, 0x04, 0x9b, 0xfd, 0xf7, 0x88, 0xff, 0x07, - 0x1c, 0x08, 0xd1, 0x57, 0x20, 0x20, 0x60, 0xe8, - 0x68, 0xe0, 0x60, 0x07, 0x20, 0x21, 0x1c, 0xd3, - 0xf7, 0xa2, 0xfe, 0x53, 0xe0, 0xf9, 0x1d, 0x28, - 0x69, 0x79, 0x31, 0xc8, 0x62, 0xe8, 0x68, 0x98, - 0x21, 0x00, 0x22, 0x38, 0x63, 0x38, 0x1c, 0xff, - 0xf7, 0xb2, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x20, - 0x1c, 0xd3, 0xf7, 0x5d, 0xfe, 0x38, 0x1c, 0x28, - 0xa1, 0xfd, 0xf7, 0xf3, 0xff, 0x3e, 0xe0, 0x00, - 0x2e, 0x1f, 0xd0, 0x70, 0x69, 0x00, 0x28, 0x15, - 0xd0, 0x00, 0x22, 0x90, 0x21, 0x38, 0x1c, 0xff, - 0xf7, 0x9e, 0xfe, 0x00, 0x28, 0x03, 0xd0, 0x20, - 0x1c, 0xd3, 0xf7, 0x49, 0xfe, 0x2e, 0xe0, 0x38, - 0x6b, 0xc7, 0x60, 0x57, 0x20, 0xed, 0x09, 0x00, - 0xd5, 0x02, 0x20, 0x60, 0x38, 0x6b, 0xe0, 0x60, - 0x07, 0x20, 0x21, 0x1c, 0xd3, 0xf7, 0x72, 0xfe, - 0x23, 0xe0, 0xf0, 0x68, 0xf8, 0x60, 0x00, 0x28, - 0x02, 0xd0, 0x87, 0x61, 0x00, 0x20, 0xf0, 0x60, - 0x56, 0x20, 0x20, 0x60, 0x27, 0x61, 0x38, 0x6b, - 0xe0, 0x60, 0x07, 0x20, 0x21, 0x1c, 0xd3, 0xf7, - 0x61, 0xfe, 0xe8, 0x69, 0xf9, 0x68, 0x48, 0x62, - 0x28, 0x6a, 0xf9, 0x68, 0x88, 0x62, 0x38, 0x1c, - 0x06, 0xf0, 0x6a, 0xfd, 0x38, 0x1c, 0x06, 0xf0, - 0xff, 0xfc, 0x38, 0x1c, 0x06, 0xf0, 0x3a, 0xfd, - 0x38, 0x1c, 0xfe, 0xf7, 0x7b, 0xfa, 0x00, 0xe0, - 0xff, 0xe7, 0x08, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, - 0x6c, 0x6d, 0x63, 0x6e, 0x74, 0x72, 0x6c, 0x2e, - 0x63, 0x3a, 0x20, 0x32, 0x39, 0x31, 0x34, 0x00, - 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, 0x6e, - 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, 0x32, - 0x39, 0x33, 0x30, 0x00, 0xb0, 0xb5, 0xc0, 0x68, - 0xfb, 0xf7, 0x7e, 0xfe, 0x07, 0x1c, 0x1b, 0xd0, - 0x99, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0x23, 0xfe, - 0x00, 0x28, 0x15, 0xd0, 0xfc, 0x1d, 0x79, 0x34, - 0x21, 0x6b, 0x00, 0x25, 0x00, 0x29, 0x25, 0xd0, - 0xf8, 0x1d, 0xb9, 0x30, 0xc2, 0x69, 0x00, 0x2a, - 0x0d, 0xd0, 0xc5, 0x61, 0x00, 0x22, 0x38, 0x1c, - 0x21, 0x6b, 0xfe, 0xf7, 0xd3, 0xfc, 0x38, 0x1c, - 0x02, 0x21, 0x32, 0xa2, 0xfd, 0xf7, 0xc0, 0xff, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x22, - 0x38, 0x1c, 0xfe, 0xf7, 0xef, 0xfb, 0x00, 0x22, - 0x99, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0x22, 0xfe, - 0xf8, 0x6a, 0x29, 0x1c, 0x00, 0x28, 0x00, 0xd1, - 0x02, 0x21, 0x38, 0x1c, 0x2c, 0xa2, 0xfd, 0xf7, - 0xab, 0xff, 0xe9, 0xe7, 0x60, 0x6b, 0x00, 0x28, - 0xed, 0x09, 0x00, 0xd6, 0x02, 0x35, 0xd0, 0x01, - 0x1c, 0x38, 0x1c, 0xfe, 0xf7, 0x89, 0xfd, 0x9a, - 0x22, 0x38, 0x1c, 0xf9, 0x1d, 0x15, 0x31, 0x63, - 0x6b, 0xff, 0xf7, 0x94, 0xfd, 0x9a, 0x22, 0x38, - 0x1c, 0xf9, 0x1d, 0x19, 0x31, 0x63, 0x6b, 0xff, - 0xf7, 0x8d, 0xfd, 0x9a, 0x22, 0x38, 0x1c, 0xf9, - 0x1d, 0x1d, 0x31, 0x63, 0x6b, 0xff, 0xf7, 0x86, - 0xfd, 0x9a, 0x22, 0x38, 0x1c, 0xf9, 0x1d, 0x21, - 0x31, 0x63, 0x6b, 0xff, 0xf7, 0x7f, 0xfd, 0x9a, - 0x21, 0x38, 0x1c, 0x62, 0x6b, 0xff, 0xf7, 0xb4, - 0xfd, 0x00, 0x23, 0x00, 0x21, 0x38, 0x1c, 0x62, - 0x6b, 0xfe, 0xf7, 0xdc, 0xfb, 0x00, 0x22, 0x99, - 0x21, 0x38, 0x1c, 0xff, 0xf7, 0xe5, 0xfd, 0x38, - 0x1c, 0x00, 0x21, 0x15, 0xa2, 0xfd, 0xf7, 0x72, - 0xff, 0xb0, 0xe7, 0xf8, 0x1d, 0xb9, 0x30, 0xc1, - 0x69, 0x00, 0x29, 0x07, 0xd0, 0x5d, 0x23, 0xdb, - 0x00, 0xfa, 0x18, 0x00, 0x21, 0xc5, 0x61, 0x38, - 0x1c, 0xfe, 0xf7, 0x72, 0xfc, 0x38, 0x1c, 0x02, - 0x21, 0x10, 0xa2, 0xfd, 0xf7, 0x5f, 0xff, 0x9d, - 0xe7, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x32, 0x39, 0x39, 0x39, 0x00, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x6d, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x30, 0x30, 0x33, - 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x63, - 0x6e, 0x74, 0x72, 0x6c, 0x2e, 0x63, 0x3a, 0x20, - 0x33, 0x30, 0x32, 0x33, 0x00, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x6d, 0x63, 0x6e, 0x74, 0x72, 0x6c, - 0x2e, 0x63, 0x3a, 0x20, 0x33, 0x30, 0x33, 0x33, - 0x00, 0x80, 0xb5, 0x07, 0x1c, 0xd3, 0xf7, 0x15, - 0xfd, 0x00, 0x28, 0x0e, 0xd0, 0xff, 0x68, 0xdb, - 0x21, 0x01, 0x60, 0xc7, 0x60, 0x01, 0x1c, 0x05, - 0x20, 0xd3, 0xf7, 0xed, 0x09, 0x00, 0xd7, 0x02, - 0x7a, 0xfd, 0x00, 0x20, 0x00, 0x2f, 0x05, 0x49, - 0x05, 0xd1, 0x4a, 0x6b, 0x0a, 0x63, 0x88, 0x63, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x08, 0x63, - 0x48, 0x63, 0xf9, 0xe7, 0x00, 0x00, 0xf8, 0xad, - 0x03, 0x20, 0x80, 0xb5, 0x07, 0x1c, 0xd3, 0xf7, - 0xf7, 0xfc, 0x00, 0x28, 0x0b, 0xd0, 0xdc, 0x21, - 0x01, 0x60, 0xf9, 0x68, 0xc1, 0x60, 0x01, 0x1c, - 0x05, 0x20, 0xd3, 0xf7, 0x5c, 0xfd, 0x03, 0x49, - 0x00, 0x20, 0x08, 0x63, 0x48, 0x63, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xf8, 0xad, - 0x03, 0x20, 0x00, 0xb5, 0xd3, 0xf7, 0xe0, 0xfc, - 0x00, 0x28, 0x0a, 0xd0, 0xdd, 0x21, 0x01, 0x60, - 0x05, 0x49, 0x89, 0x6b, 0x01, 0x61, 0x00, 0x21, - 0xc1, 0x60, 0x01, 0x1c, 0x05, 0x20, 0xd3, 0xf7, - 0x42, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0xf8, 0xad, - 0x03, 0x20, 0xb0, 0xb5, 0x07, 0x1c, 0xd3, 0xf7, - 0xcb, 0xfc, 0x23, 0x4d, 0x00, 0x28, 0x20, 0xd0, - 0x29, 0x6b, 0x00, 0x29, 0x02, 0xd0, 0xaa, 0x6b, - 0x8a, 0x42, 0x18, 0xd2, 0xa9, 0x6b, 0x01, 0x31, - 0xa9, 0x63, 0xda, 0x21, 0x01, 0x60, 0x39, 0x6a, - 0x41, 0x61, 0x79, 0x6a, 0x81, 0x61, 0xb9, 0x6a, - 0xc1, 0x61, 0xf9, 0x6a, 0x01, 0x62, 0x39, 0x6b, - 0x10, 0x37, 0x41, 0x62, 0x0c, 0xcf, 0xc1, 0x1d, - 0x05, 0x31, 0x0c, 0xc1, 0x01, 0x1c, 0x05, 0x20, - 0xd3, 0xf7, 0x19, 0xfd, 0x01, 0xe0, 0x50, 0x1c, - 0xa8, 0x63, 0xa8, 0x6b, 0x29, 0x6b, 0x88, 0x42, - 0x0a, 0xd1, 0xd3, 0xf7, 0xa1, 0xfc, 0x07, 0x1c, - 0x06, 0xd0, 0xd3, 0xf7, 0x9d, 0xfc, 0x04, 0x1c, - 0x05, 0xd1, 0x38, 0x1c, 0xd3, 0xf7, 0xd3, 0xfc, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xdd, 0x20, - 0x38, 0x60, 0xa8, 0x6b, 0x00, 0x25, 0x38, 0x61, - 0x05, 0x20, 0x39, 0x1c, 0xfd, 0x60, 0xed, 0x09, - 0x00, 0xd8, 0x02, 0xd3, 0xf7, 0xfa, 0xfc, 0x51, - 0x20, 0x20, 0x60, 0x07, 0x20, 0x21, 0x1c, 0xe5, - 0x60, 0xd3, 0xf7, 0xf3, 0xfc, 0xea, 0xe7, 0xf8, - 0xad, 0x03, 0x20, 0xf0, 0xb5, 0x84, 0xb0, 0x07, - 0x1c, 0xc0, 0x68, 0xfb, 0xf7, 0x38, 0xfd, 0x04, - 0x1c, 0x6d, 0xd0, 0xd3, 0xf7, 0x77, 0xfc, 0x05, - 0x1c, 0x69, 0xd0, 0x14, 0x23, 0xf8, 0x56, 0x78, - 0x23, 0xd8, 0x42, 0x03, 0xd0, 0xe1, 0x1d, 0xff, - 0x31, 0x3a, 0x31, 0x48, 0x62, 0x11, 0x23, 0x9b, - 0x01, 0xe6, 0x18, 0x70, 0x6a, 0x41, 0x1c, 0x05, - 0x20, 0xd2, 0xf7, 0xe1, 0xff, 0x88, 0x00, 0x02, - 0x19, 0x71, 0x62, 0xbe, 0x69, 0x11, 0x23, 0x9b, - 0x01, 0xd0, 0x18, 0x03, 0x96, 0x81, 0x6a, 0x71, - 0x1a, 0x02, 0x91, 0xf9, 0x69, 0xc3, 0x6b, 0xc9, - 0x1a, 0x09, 0x23, 0xdb, 0x01, 0x01, 0x91, 0xd2, - 0x18, 0x13, 0x69, 0x79, 0x6a, 0xc9, 0x1a, 0xbb, - 0x6a, 0x56, 0x6a, 0x9b, 0x1b, 0x00, 0x93, 0x03, - 0x9b, 0x5f, 0x4e, 0x83, 0x62, 0xfb, 0x69, 0xc3, - 0x63, 0x78, 0x6a, 0x10, 0x61, 0xb8, 0x6a, 0x50, - 0x62, 0x02, 0x98, 0x01, 0x9a, 0x82, 0x18, 0x14, - 0x2a, 0x03, 0xd8, 0x00, 0x98, 0x08, 0x18, 0x14, - 0x28, 0x30, 0xd9, 0x00, 0x98, 0x08, 0x18, 0x90, - 0x42, 0x09, 0xd3, 0x64, 0x23, 0x59, 0x43, 0x01, - 0x22, 0x01, 0x28, 0x00, 0xd3, 0x02, 0x1c, 0x10, - 0x1c, 0xd2, 0xf7, 0xa9, 0xff, 0x08, 0xe0, 0x02, - 0x98, 0x64, 0x21, 0x41, 0x43, 0x01, 0x20, 0x01, - 0x2a, 0x00, 0xd3, 0x10, 0x1c, 0xd2, 0xf7, 0x9f, - 0xff, 0xe1, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x09, - 0x6a, 0x78, 0x23, 0xd9, 0x42, 0x01, 0xd1, 0x01, - 0x20, 0x3d, 0xe0, 0x3d, 0x22, 0xb3, 0x68, 0xd2, - 0x43, 0x01, 0x2b, 0x01, 0xd0, 0x4a, 0x22, 0xd2, - 0x43, 0x91, 0x42, 0x34, 0xda, 0x51, 0x1a, 0x81, - 0x42, 0xed, 0x09, 0x00, 0xd9, 0x02, 0x02, 0xd2, - 0x40, 0x1a, 0x2f, 0xe0, 0x7a, 0xe0, 0x01, 0x20, - 0x2c, 0xe0, 0xe1, 0x1d, 0xff, 0x31, 0x3a, 0x31, - 0x09, 0x6a, 0x64, 0x20, 0x78, 0x23, 0xd9, 0x42, - 0x01, 0xd1, 0x01, 0x20, 0x22, 0xe0, 0x3d, 0x22, - 0xb3, 0x68, 0xd2, 0x43, 0x01, 0x2b, 0x01, 0xd0, - 0x4a, 0x22, 0xd2, 0x43, 0x91, 0x42, 0x19, 0xda, - 0x51, 0x1a, 0x01, 0x2b, 0x0a, 0xd0, 0x02, 0x2b, - 0x14, 0xd1, 0x1a, 0x29, 0x00, 0xd3, 0x19, 0x21, - 0x31, 0x4a, 0x51, 0x56, 0x64, 0x29, 0x0c, 0xd2, - 0x40, 0x1a, 0x0b, 0xe0, 0x1a, 0x29, 0x00, 0xd3, - 0x19, 0x21, 0x2e, 0x4a, 0x51, 0x56, 0x64, 0x29, - 0x01, 0xd2, 0x40, 0x1a, 0x02, 0xe0, 0x01, 0x20, - 0x00, 0xe0, 0x01, 0x20, 0xe2, 0x1d, 0xff, 0x32, - 0x3a, 0x32, 0x13, 0x6a, 0x28, 0x4e, 0x6b, 0x76, - 0xe3, 0x68, 0xe9, 0x1d, 0x5b, 0x6a, 0x76, 0x6b, - 0x0d, 0x31, 0xb3, 0x42, 0x00, 0xd3, 0x33, 0x1c, - 0x24, 0x4e, 0xf3, 0x5c, 0x0b, 0x71, 0x16, 0x6a, - 0x78, 0x23, 0xde, 0x42, 0x02, 0xd0, 0x52, 0x6a, - 0xda, 0x42, 0x02, 0xd1, 0x00, 0x22, 0x8a, 0x71, - 0x07, 0xe0, 0xb2, 0x1a, 0x8a, 0x71, 0x06, 0x23, - 0xca, 0x56, 0x00, 0x2a, 0x01, 0xda, 0x00, 0x22, - 0x8a, 0x71, 0xc8, 0x71, 0xb8, 0x69, 0x09, 0x23, - 0x88, 0x61, 0x38, 0x6a, 0x9b, 0x01, 0xc8, 0x61, - 0xf8, 0x69, 0x48, 0x61, 0x78, 0x6a, 0xc8, 0x60, - 0xf8, 0x6a, 0x08, 0x61, 0xb8, 0x6a, 0x88, 0x60, - 0xe0, 0x18, 0xc2, 0x69, 0x00, 0x2a, 0x08, 0xd0, - 0x01, 0x3a, 0xc2, 0x61, 0x20, 0x1c, 0x06, 0xf0, - 0xb7, 0xfd, 0x28, 0x1c, 0xd3, 0xf7, 0xd8, 0xfb, - 0x0c, 0xe0, 0xdf, 0x20, 0x28, 0x60, 0xf8, 0x68, - 0x00, 0x22, 0xc0, 0x6a, 0xe8, 0x60, 0x38, 0x69, - 0x28, 0x61, 0x0a, 0x60, 0x05, 0x20, 0x29, 0x1c, - 0xd3, 0xf7, 0xfe, 0xfb, 0xed, 0x09, 0x00, 0xda, - 0x02, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x18, 0xec, 0x03, 0x20, 0xac, 0xb2, 0x03, - 0x20, 0x90, 0xb2, 0x03, 0x20, 0xd8, 0xeb, 0x03, - 0x20, 0x88, 0xb2, 0x03, 0x20, 0x90, 0xb5, 0x04, - 0x1c, 0xc0, 0x68, 0xfb, 0xf7, 0x39, 0xfc, 0x07, - 0x1c, 0x07, 0xd0, 0x38, 0x1c, 0x06, 0xf0, 0xb6, - 0xfa, 0x9a, 0x21, 0x38, 0x1c, 0x22, 0x69, 0xff, - 0xf7, 0xfd, 0xfb, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x80, 0xb5, 0x07, 0x1c, 0xfb, 0xf7, 0x04, - 0xfb, 0xd3, 0xf7, 0x69, 0xfb, 0x00, 0x28, 0x07, - 0xd0, 0xbe, 0x21, 0x01, 0x60, 0xf9, 0x68, 0xc1, - 0x60, 0x01, 0x1c, 0x05, 0x20, 0xd3, 0xf7, 0xce, - 0xfb, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, - 0xb5, 0x83, 0xb0, 0xc4, 0x68, 0x86, 0x6a, 0x07, - 0x1c, 0x20, 0x1c, 0x9d, 0x25, 0x29, 0x1c, 0xff, - 0xf7, 0xba, 0xfb, 0x00, 0x28, 0x1e, 0xd0, 0x00, - 0x21, 0x78, 0x69, 0xfb, 0xf7, 0x2c, 0xfc, 0x78, - 0x61, 0x47, 0x2e, 0x44, 0xd0, 0x1a, 0xdc, 0x15, - 0x2e, 0x23, 0xd0, 0x18, 0x2e, 0x21, 0xd0, 0x45, - 0x2e, 0x2f, 0xd0, 0x46, 0x2e, 0x0e, 0xd1, 0x38, - 0x6a, 0x7d, 0x6a, 0xfb, 0xf7, 0x23, 0xfc, 0x02, - 0x21, 0x00, 0x91, 0x02, 0x90, 0x02, 0xaa, 0x01, - 0x92, 0x20, 0x1c, 0x06, 0x21, 0x01, 0x23, 0x2a, - 0x1c, 0x04, 0xf0, 0xed, 0xf9, 0x03, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x48, 0x2e, 0x2b, - 0xd0, 0x4b, 0x2e, 0x1f, 0xd0, 0x4c, 0x2e, 0xf5, - 0xd1, 0x20, 0x1c, 0x39, 0x1c, 0x04, 0xf0, 0x77, - 0xff, 0xf0, 0xe7, 0xe1, 0x1d, 0x1d, 0x31, 0x20, - 0x1c, 0x2a, 0x1c, 0x0e, 0x1c, 0xff, 0xf7, 0x10, - 0xfb, 0x00, 0x28, 0xe7, 0xd0, 0x20, 0x1c, 0x31, - 0x1c, 0x2a, 0x1c, 0x3b, 0x1c, 0xff, 0xf7, 0x28, - 0xfb, 0xe0, 0xe7, 0x38, 0x6a, 0xfb, 0xf7, 0xed, - 0x09, 0x00, 0xdb, 0x02, 0xf6, 0xfb, 0x02, 0x1c, - 0x20, 0x1c, 0x39, 0x69, 0xfe, 0xf7, 0xfb, 0xf9, - 0xd7, 0xe7, 0x20, 0x1c, 0x39, 0x1c, 0x04, 0xf0, - 0x24, 0xff, 0xd2, 0xe7, 0x20, 0x1c, 0x39, 0x1c, - 0x04, 0xf0, 0x7d, 0xff, 0xcd, 0xe7, 0x20, 0x1c, - 0x39, 0x1c, 0x04, 0xf0, 0xad, 0xff, 0xc8, 0xe7, - 0x01, 0x1c, 0x18, 0x20, 0xc0, 0x31, 0xc9, 0x6b, - 0x4a, 0x08, 0x00, 0xd3, 0x03, 0x48, 0x89, 0x08, - 0x02, 0xd3, 0x03, 0x23, 0x9b, 0x03, 0x18, 0x43, - 0x70, 0x47, 0x18, 0x0c, 0x00, 0x00, 0xc0, 0x30, - 0x81, 0x6b, 0x00, 0x29, 0x0b, 0xd0, 0xc1, 0x6b, - 0xc9, 0x0a, 0x08, 0xd3, 0x05, 0x49, 0x49, 0x68, - 0xc9, 0x0a, 0x04, 0xd3, 0x01, 0x6a, 0x00, 0x29, - 0x01, 0xd1, 0x01, 0x21, 0x01, 0x62, 0x70, 0x47, - 0x00, 0x00, 0x78, 0xae, 0x03, 0x20, 0x80, 0xb5, - 0x83, 0xb0, 0x07, 0x1c, 0xc0, 0x30, 0x82, 0x6b, - 0x00, 0x2a, 0x30, 0xd0, 0xc0, 0x6b, 0xc0, 0x0a, - 0x2d, 0xd3, 0x88, 0x0b, 0x80, 0x07, 0x03, 0xd0, - 0x06, 0x20, 0x02, 0xab, 0x18, 0x70, 0x10, 0xe0, - 0x88, 0x0a, 0x80, 0x07, 0x03, 0xd0, 0x04, 0x20, - 0x02, 0xab, 0x18, 0x70, 0x09, 0xe0, 0xc8, 0x08, - 0x80, 0x07, 0x03, 0xd0, 0x02, 0x20, 0x02, 0xab, - 0x18, 0x70, 0x02, 0xe0, 0x00, 0x20, 0x02, 0xab, - 0x18, 0x70, 0x0c, 0x48, 0x08, 0x40, 0x05, 0xd0, - 0x02, 0xa8, 0x00, 0x78, 0x01, 0x23, 0x18, 0x43, - 0x02, 0xab, 0x18, 0x70, 0x38, 0x1c, 0x03, 0xf0, - 0x4d, 0xff, 0x01, 0x21, 0x02, 0xaa, 0x01, 0x92, - 0x00, 0x91, 0x24, 0x21, 0x02, 0x1c, 0x01, 0x23, - 0x38, 0x1c, 0x04, 0xf0, 0x5b, 0xf9, 0x03, 0xb0, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x10, 0x88, - 0x00, 0x00, 0xb0, 0xb5, 0x00, 0x27, 0x01, 0x23, - 0x9b, 0x02, 0x04, 0x1c, 0xc0, 0x18, 0xc0, 0x6b, - 0x0d, 0x1c, 0xed, 0x09, 0x00, 0xdc, 0x02, 0x00, - 0x28, 0x0e, 0xd0, 0xd3, 0xf7, 0x8d, 0xfa, 0x00, - 0x28, 0x01, 0xd1, 0x07, 0x27, 0x08, 0xe0, 0x65, - 0x21, 0x01, 0x60, 0x21, 0x6b, 0xc1, 0x60, 0x05, - 0x61, 0x01, 0x1c, 0x07, 0x20, 0xd3, 0xf7, 0xef, - 0xfa, 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0x00, 0x27, 0x0c, 0x1c, 0x15, - 0x1c, 0x06, 0x1c, 0xd3, 0xf7, 0x75, 0xfa, 0x00, - 0x28, 0x01, 0xd1, 0x07, 0x27, 0x0c, 0xe0, 0x04, - 0x2c, 0x00, 0xd2, 0x02, 0x24, 0x62, 0x21, 0x01, - 0x60, 0x31, 0x6b, 0x0c, 0x30, 0x32, 0xc0, 0x18, - 0x38, 0x01, 0x1c, 0x07, 0x20, 0xd3, 0xf7, 0xd3, - 0xfa, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0x00, 0x27, 0x14, 0x1c, 0x0d, - 0x1c, 0x06, 0x1c, 0xd3, 0xf7, 0x59, 0xfa, 0x00, - 0x28, 0x01, 0xd1, 0x07, 0x27, 0x09, 0xe0, 0x5d, - 0x21, 0x01, 0x60, 0x31, 0x6b, 0xc1, 0x60, 0x05, - 0x61, 0x44, 0x61, 0x01, 0x1c, 0x07, 0x20, 0xd3, - 0xf7, 0xba, 0xfa, 0x38, 0x1c, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x00, 0x27, 0x11, - 0x23, 0x9b, 0x01, 0xc6, 0x18, 0x04, 0x1c, 0x0d, - 0x1c, 0x00, 0x2a, 0x05, 0xd0, 0x30, 0x6a, 0x01, - 0x30, 0x30, 0x62, 0x01, 0x28, 0x23, 0xd1, 0x07, - 0xe0, 0x30, 0x6a, 0x00, 0x28, 0x01, 0xd0, 0x01, - 0x38, 0x30, 0x62, 0x30, 0x6a, 0x00, 0x28, 0x1a, - 0xd1, 0xd3, 0xf7, 0x2e, 0xfa, 0x00, 0x28, 0x01, - 0xd1, 0x07, 0x27, 0x14, 0xe0, 0x63, 0x21, 0x01, - 0x60, 0x21, 0x6b, 0xc1, 0x60, 0x05, 0x61, 0xf1, - 0x69, 0x41, 0x61, 0x71, 0x68, 0x81, 0x61, 0xb1, - 0x68, 0xc1, 0x61, 0xf1, 0x68, 0x01, 0x62, 0x71, - 0x69, 0x41, 0x62, 0x31, 0x69, 0x81, 0x62, 0x01, - 0x1c, 0x07, 0x20, 0xd3, 0xf7, 0x84, 0xfa, 0x38, - 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0xed, 0x09, 0x00, - 0xdd, 0x02, 0x18, 0x47, 0x07, 0x48, 0x00, 0x6b, - 0x00, 0x28, 0x09, 0xd0, 0x04, 0xe0, 0x00, 0x29, - 0x02, 0xd0, 0x02, 0x69, 0x8a, 0x42, 0x03, 0xd1, - 0x01, 0x69, 0x00, 0x68, 0x00, 0x28, 0xf6, 0xd1, - 0x70, 0x47, 0x00, 0x00, 0xb8, 0xad, 0x03, 0x20, - 0xb0, 0xb5, 0x00, 0x27, 0x04, 0x1c, 0x0d, 0x1c, - 0xd3, 0xf7, 0xf9, 0xf9, 0x00, 0x28, 0x01, 0xd1, - 0x07, 0x27, 0x18, 0xe0, 0x61, 0x21, 0x01, 0x60, - 0x21, 0x6b, 0x00, 0x2d, 0xc1, 0x60, 0x03, 0xd0, - 0x00, 0x21, 0x01, 0x61, 0x41, 0x61, 0x0a, 0xe0, - 0xe1, 0x1d, 0xb9, 0x31, 0xca, 0x68, 0x00, 0x2a, - 0x01, 0xd0, 0x02, 0x61, 0x01, 0xe0, 0x04, 0x22, - 0x02, 0x61, 0x09, 0x69, 0x41, 0x61, 0x01, 0x1c, - 0x07, 0x20, 0xd3, 0xf7, 0x4b, 0xfa, 0x38, 0x1c, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, - 0x07, 0x1c, 0x0d, 0x1c, 0xf9, 0x1d, 0xff, 0x31, - 0x00, 0x20, 0x00, 0x24, 0xba, 0x31, 0x08, 0x61, - 0xd3, 0xf7, 0xcd, 0xf9, 0x00, 0x28, 0x14, 0xd0, - 0xbb, 0x21, 0x01, 0x60, 0xfe, 0x1d, 0x9d, 0x36, - 0x0c, 0xce, 0xc1, 0x1d, 0x05, 0x31, 0x0c, 0xc1, - 0x45, 0x61, 0x39, 0x69, 0x01, 0x29, 0x02, 0xd1, - 0x00, 0x21, 0x81, 0x61, 0x01, 0xe0, 0x01, 0x21, - 0x81, 0x61, 0x01, 0x1c, 0x05, 0x20, 0xd3, 0xf7, - 0x25, 0xfa, 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xff, 0xb5, 0x87, 0xb0, 0x07, 0x1c, - 0xff, 0x20, 0x1c, 0x1c, 0x0b, 0x23, 0x9b, 0x01, - 0x0d, 0x1c, 0xf9, 0x18, 0xc9, 0x69, 0x49, 0x00, - 0x21, 0x30, 0x20, 0x29, 0x01, 0xd3, 0xc8, 0x1d, - 0xf9, 0x30, 0x46, 0x00, 0x04, 0xa8, 0xfa, 0xf7, - 0xbb, 0xfc, 0x28, 0x1c, 0x31, 0x1c, 0xfb, 0xf7, - 0x7a, 0xfa, 0xfd, 0x1d, 0xb9, 0x35, 0xe8, 0x60, - 0x00, 0x28, 0x01, 0xd1, 0x04, 0x20, 0xe8, 0x60, - 0xed, 0x09, 0x00, 0xde, 0x02, 0x01, 0x22, 0x21, - 0x1c, 0x09, 0x98, 0xe3, 0xf7, 0xe9, 0xfa, 0x21, - 0xa3, 0x1a, 0x68, 0x5b, 0x68, 0xe3, 0xf7, 0x38, - 0xfb, 0x10, 0x1c, 0x19, 0x1c, 0x00, 0x2a, 0x06, - 0x92, 0x03, 0xda, 0x1e, 0x49, 0x40, 0x42, 0x08, - 0x1a, 0x06, 0x90, 0x09, 0x23, 0x9b, 0x01, 0x38, - 0x69, 0xfe, 0x18, 0x02, 0x28, 0x0f, 0xd1, 0x04, - 0xaa, 0x03, 0x92, 0x06, 0x21, 0x02, 0x91, 0x02, - 0x22, 0x06, 0xa8, 0x01, 0x90, 0x00, 0x92, 0x34, - 0x21, 0x02, 0x23, 0x38, 0x1c, 0xf2, 0x6b, 0x04, - 0xf0, 0x28, 0xf8, 0x04, 0x1c, 0x11, 0xd1, 0xe8, - 0x68, 0x40, 0x08, 0x03, 0x90, 0x00, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0x64, 0xff, 0x04, 0x21, 0x00, - 0x91, 0x03, 0xaa, 0x01, 0x92, 0x13, 0x21, 0x01, - 0x23, 0x38, 0x1c, 0xf2, 0x6b, 0x04, 0xf0, 0x15, - 0xf8, 0x04, 0x1c, 0xf9, 0x1d, 0xff, 0x31, 0x1e, - 0x31, 0x38, 0x1c, 0x07, 0x4a, 0xfd, 0xf7, 0x30, - 0xfe, 0x20, 0x1c, 0x0b, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xe2, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x04, 0x00, - 0x00, 0x6d, 0xb3, 0x02, 0x20, 0x90, 0xb5, 0x83, - 0xb0, 0x07, 0x1c, 0x00, 0x69, 0x0c, 0x1c, 0x01, - 0x28, 0x1b, 0xd1, 0x00, 0x20, 0x02, 0x90, 0x01, - 0x90, 0xe0, 0x69, 0x41, 0x1c, 0x68, 0x46, 0x04, - 0x22, 0xd2, 0xf7, 0x9a, 0xfd, 0x00, 0xa8, 0x00, - 0x88, 0xf9, 0x1d, 0xb9, 0x31, 0x08, 0x61, 0xe0, - 0x69, 0x01, 0xab, 0x41, 0x79, 0x99, 0x70, 0x01, - 0x79, 0x59, 0x70, 0xc1, 0x78, 0x19, 0x70, 0xe0, - 0x69, 0x01, 0x7a, 0x59, 0x71, 0xc1, 0x79, 0x02, - 0xab, 0x19, 0x70, 0x03, 0xb0, 0x90, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x80, 0xb5, 0x07, - 0x1c, 0xc8, 0x69, 0x00, 0x78, 0xc0, 0x07, 0xc0, - 0x0f, 0x09, 0x23, 0xed, 0x09, 0x00, 0xdf, 0x02, - 0x9b, 0x01, 0xfa, 0x18, 0xd0, 0x63, 0xc8, 0x69, - 0x04, 0x22, 0x41, 0x1c, 0xf8, 0x1d, 0xc5, 0x30, - 0xd2, 0xf7, 0x71, 0xfd, 0xf8, 0x1d, 0xb9, 0x30, - 0xc1, 0x68, 0x49, 0x00, 0xc1, 0x60, 0x00, 0x21, - 0x38, 0x1c, 0x7a, 0x6a, 0xfb, 0xf7, 0xcb, 0xf9, - 0x80, 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0xb0, 0xb5, 0x87, 0xb0, 0x07, 0x1c, 0x48, 0x69, - 0x0c, 0x1c, 0xf9, 0x1d, 0xb9, 0x31, 0xc9, 0x68, - 0x08, 0x1a, 0x09, 0x23, 0x9b, 0x01, 0xfd, 0x18, - 0x20, 0x28, 0x44, 0xdd, 0x38, 0x69, 0x02, 0x28, - 0x27, 0xd1, 0x04, 0xa8, 0xfa, 0xf7, 0x05, 0xfc, - 0xa0, 0x69, 0xe1, 0x69, 0x01, 0x22, 0xe3, 0xf7, - 0x3e, 0xfa, 0x00, 0x90, 0x01, 0x91, 0x28, 0xa3, - 0x1a, 0x68, 0x5b, 0x68, 0xe3, 0xf7, 0x8b, 0xfa, - 0x10, 0x1c, 0x19, 0x1c, 0x00, 0x2a, 0x02, 0x92, - 0x03, 0x93, 0x06, 0x92, 0x03, 0xda, 0x24, 0x49, - 0x40, 0x42, 0x08, 0x1a, 0x06, 0x90, 0x04, 0xaa, - 0x03, 0x92, 0x06, 0x21, 0x02, 0x91, 0x02, 0x22, - 0x06, 0xa8, 0x01, 0x90, 0x00, 0x92, 0x34, 0x21, - 0x02, 0x23, 0x38, 0x1c, 0xea, 0x6b, 0x03, 0xf0, - 0x7f, 0xff, 0xf8, 0x1d, 0xff, 0x30, 0x3a, 0x30, - 0x40, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x14, 0x24, - 0x0a, 0xe0, 0x00, 0x21, 0x38, 0x1c, 0xff, 0xf7, - 0xb8, 0xfe, 0x38, 0x1c, 0x13, 0x22, 0xe9, 0x6b, - 0x15, 0xa3, 0x03, 0xf0, 0xe2, 0xff, 0x91, 0x24, - 0x05, 0x23, 0xdb, 0x01, 0xf8, 0x18, 0x81, 0x6a, - 0x01, 0x31, 0x81, 0x62, 0x08, 0xe0, 0x0f, 0xa2, - 0x00, 0x92, 0x13, 0x22, 0x28, 0x23, 0x38, 0x1c, - 0xe9, 0x6b, 0x03, 0xf0, 0xe1, 0xff, 0x1d, 0x24, - 0xf9, 0x1d, 0x1d, 0x31, 0x00, 0x23, 0x38, 0x1c, - 0x22, 0x1c, 0xff, 0xf7, 0xae, 0xf8, 0x00, 0x22, - 0x38, 0x1c, 0x21, 0x1c, 0xff, 0xf7, 0xed, 0x09, - 0x00, 0xe0, 0x02, 0x1f, 0xf9, 0x07, 0xb0, 0xb0, - 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0xe2, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, - 0x04, 0x00, 0x00, 0x4c, 0x6d, 0x52, 0x6f, 0x6c, - 0x65, 0x53, 0x75, 0x62, 0x53, 0x74, 0x49, 0x64, - 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x53, 0x77, 0x69, - 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x00, 0x90, - 0xb5, 0x00, 0x24, 0x07, 0x1c, 0x03, 0xf0, 0x1a, - 0xfd, 0x09, 0x23, 0x9b, 0x01, 0xf9, 0x18, 0x05, - 0x23, 0xdb, 0x01, 0xc8, 0x63, 0xf8, 0x18, 0x81, - 0x6a, 0x01, 0x31, 0x81, 0x62, 0xf8, 0x1d, 0xff, - 0x30, 0x3a, 0x30, 0x40, 0x68, 0x00, 0x28, 0x02, - 0xd0, 0x14, 0x20, 0x78, 0x62, 0x05, 0xe0, 0x15, - 0x22, 0x00, 0x21, 0x38, 0x1c, 0x7a, 0x62, 0xfb, - 0xf7, 0x28, 0xf9, 0x20, 0x1c, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xcb, 0x1d, 0x11, - 0x33, 0x1a, 0x68, 0x49, 0x69, 0x5b, 0x68, 0xff, - 0xf7, 0x9f, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x00, 0x21, 0x42, 0x6a, 0xfb, 0xf7, 0x15, - 0xf9, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x80, - 0xb5, 0x00, 0x21, 0x07, 0x1c, 0xff, 0xf7, 0x43, - 0xfe, 0x00, 0x23, 0x91, 0x22, 0x38, 0x1c, 0xf9, - 0x1d, 0x1d, 0x31, 0xff, 0xf7, 0x50, 0xf8, 0x80, - 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0xb5, 0xc1, 0x1d, 0xff, 0x31, 0x1e, 0x31, 0xfd, - 0xf7, 0xf8, 0xfc, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0x80, 0xb5, 0x00, 0x21, 0x07, 0x1c, 0xff, - 0xf7, 0x2a, 0xfe, 0x09, 0x23, 0x9b, 0x01, 0xf8, - 0x18, 0xc1, 0x6b, 0x38, 0x1c, 0x13, 0x22, 0x03, - 0xa3, 0x03, 0xf0, 0x51, 0xff, 0x80, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, 0x4c, - 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x75, 0x62, - 0x53, 0xed, 0x09, 0x00, 0xe1, 0x02, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x53, 0x77, 0x69, 0x74, 0x63, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x4c, 0x32, 0x43, - 0x41, 0x50, 0x57, 0x61, 0x69, 0x74, 0x52, 0x65, - 0x71, 0x4c, 0x32, 0x43, 0x41, 0x50, 0x47, 0x6f, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x69, 0x01, 0x29, - 0x02, 0xd1, 0x02, 0x21, 0x01, 0x61, 0x03, 0xe0, - 0x02, 0x29, 0x01, 0xd1, 0x01, 0x21, 0x01, 0x61, - 0x00, 0x20, 0x70, 0x47, 0x00, 0xb5, 0xc2, 0x1d, - 0xff, 0x32, 0xba, 0x32, 0x12, 0x69, 0x00, 0x2a, - 0x03, 0xd0, 0xff, 0xf7, 0x16, 0xfe, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0xf0, 0x19, 0xff, 0x00, 0x20, - 0xf9, 0xe7, 0x00, 0xb5, 0xff, 0xf7, 0xee, 0xff, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x82, 0xb0, - 0x04, 0x1c, 0xc0, 0x30, 0x01, 0x90, 0x40, 0x69, - 0x00, 0x27, 0x0d, 0x1c, 0x00, 0x28, 0x03, 0xd0, - 0x03, 0xf0, 0x2e, 0xff, 0x00, 0x28, 0x10, 0xd0, - 0x0a, 0xa2, 0x00, 0x92, 0x13, 0x22, 0x1d, 0x26, - 0x21, 0x27, 0x20, 0x1c, 0x29, 0x1c, 0x3b, 0x1c, - 0x03, 0xf0, 0x0b, 0xff, 0x01, 0x98, 0x00, 0x22, - 0x40, 0x69, 0x20, 0x1c, 0x31, 0x1c, 0xff, 0xf7, - 0x4f, 0xf8, 0x38, 0x1c, 0x02, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x52, 0x6f, - 0x6c, 0x65, 0x53, 0x74, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x53, 0x77, - 0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x00, - 0x90, 0xb5, 0x01, 0x21, 0x07, 0x1c, 0xff, 0xf7, - 0xad, 0xfd, 0x00, 0x23, 0xa1, 0x22, 0x38, 0x1c, - 0xf9, 0x1d, 0x1d, 0x31, 0xfe, 0xf7, 0xba, 0xff, - 0x04, 0x1c, 0x0e, 0xd1, 0x38, 0x1c, 0x33, 0x22, - 0x00, 0x21, 0x08, 0xa3, 0x03, 0xf0, 0xce, 0xfe, - 0x04, 0x1c, 0x38, 0x1c, 0xfe, 0xf7, 0x52, 0xff, - 0x01, 0x1c, 0x00, 0x22, 0xed, 0x09, 0x00, 0xe2, - 0x02, 0x38, 0x1c, 0xff, 0xf7, 0x1f, 0xf8, 0x20, - 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x4c, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x53, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x00, 0x00, 0x00, 0x90, 0xb5, 0x01, - 0x21, 0x07, 0x1c, 0xff, 0xf7, 0x79, 0xfd, 0x38, - 0x1c, 0x33, 0x22, 0x00, 0x21, 0x07, 0xa3, 0x03, - 0xf0, 0xa3, 0xfe, 0x04, 0x1c, 0x38, 0x1c, 0xfe, - 0xf7, 0x27, 0xff, 0x01, 0x1c, 0x00, 0x22, 0x38, - 0x1c, 0xfe, 0xf7, 0xf4, 0xff, 0x20, 0x1c, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x52, - 0x6f, 0x6c, 0x65, 0x53, 0x74, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x64, 0x49, - 0x6e, 0x64, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, - 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x77, 0x69, 0x74, - 0x63, 0x68, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, - 0x00, 0x90, 0xb5, 0x07, 0x1c, 0x33, 0x22, 0x00, - 0x21, 0x07, 0xa3, 0x03, 0xf0, 0x79, 0xfe, 0x04, - 0x1c, 0x38, 0x1c, 0xfe, 0xf7, 0xfd, 0xfe, 0x01, - 0x1c, 0x00, 0x22, 0x38, 0x1c, 0xfe, 0xf7, 0xca, - 0xff, 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x4c, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x53, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x64, 0x49, 0x6e, 0x64, 0x42, 0x42, - 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x77, 0x69, 0x74, - 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x4f, 0x6b, - 0x00, 0xf0, 0xb5, 0x82, 0xb0, 0x04, 0x1c, 0xc0, - 0x30, 0x01, 0x90, 0x80, 0x69, 0x00, 0x27, 0x0d, - 0x1c, 0x40, 0x08, 0x03, 0xd3, 0x03, 0xf0, 0x72, - 0xfe, 0x00, 0x28, 0x12, 0xd0, 0x0b, 0xa2, 0xed, - 0x09, 0x00, 0xe3, 0x02, 0x00, 0x92, 0x13, 0x22, - 0x1d, 0x26, 0x21, 0x27, 0x20, 0x1c, 0x29, 0x1c, - 0x3b, 0x1c, 0x03, 0xf0, 0x4f, 0xfe, 0x01, 0x98, - 0x80, 0x69, 0xc0, 0x07, 0xc0, 0x0f, 0x00, 0x22, - 0x20, 0x1c, 0x31, 0x1c, 0xfe, 0xf7, 0x91, 0xff, - 0x38, 0x1c, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x4c, 0x6d, 0x52, 0x6f, 0x6c, 0x65, - 0x53, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x49, 0x6e, 0x64, 0x53, 0x77, - 0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x00, - 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x21, - 0x00, 0x24, 0x07, 0x1c, 0xff, 0xf7, 0xeb, 0xfc, - 0xf8, 0x1d, 0xff, 0x30, 0xba, 0x30, 0x00, 0x69, - 0x00, 0x28, 0x04, 0xd0, 0x38, 0x1c, 0x29, 0x1c, - 0xff, 0xf7, 0x08, 0xfd, 0x04, 0x1c, 0x38, 0x1c, - 0x03, 0xf0, 0x5f, 0xfb, 0x00, 0x21, 0x38, 0x1c, - 0x01, 0xf0, 0x07, 0xfe, 0x20, 0x1c, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x00, 0x24, - 0x01, 0x21, 0x07, 0x1c, 0xff, 0xf7, 0xcf, 0xfc, - 0xf8, 0x1d, 0xff, 0x30, 0xba, 0x30, 0x00, 0x69, - 0x00, 0x28, 0x04, 0xd0, 0x22, 0x21, 0x38, 0x1c, - 0xff, 0xf7, 0xec, 0xfc, 0x04, 0x1c, 0x38, 0x1c, - 0x03, 0xf0, 0x43, 0xfb, 0x00, 0x21, 0x38, 0x1c, - 0x01, 0xf0, 0xeb, 0xfd, 0x20, 0x1c, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x04, 0x1c, - 0x00, 0x69, 0xfa, 0xf7, 0x70, 0xff, 0x07, 0x1c, - 0x2b, 0xd0, 0x65, 0x69, 0x00, 0x2d, 0x01, 0xd1, - 0x9b, 0x26, 0x00, 0xe0, 0x9c, 0x26, 0x00, 0x22, - 0x38, 0x1c, 0x31, 0x1c, 0xfe, 0xf7, 0x31, 0xff, - 0x00, 0x28, 0x1e, 0xd1, 0xf9, 0x1d, 0x1d, 0x31, - 0x00, 0x23, 0x38, 0x1c, 0x32, 0x1c, 0xfe, 0xf7, - 0xb2, 0xfe, 0x00, 0x28, 0x15, 0xd1, 0x00, 0x2d, - 0x02, 0xd1, 0xed, 0x09, 0x00, 0xe4, 0x02, 0xe0, - 0x68, 0x38, 0x63, 0x05, 0xe0, 0xf8, 0x1d, 0xff, - 0x30, 0xba, 0x30, 0x00, 0x69, 0x00, 0x28, 0x03, - 0xd0, 0x38, 0x1c, 0x29, 0x1c, 0xff, 0xf7, 0xb4, - 0xfc, 0x38, 0x1c, 0x03, 0xf0, 0x0c, 0xfb, 0x00, - 0x21, 0x38, 0x1c, 0x01, 0xf0, 0xb4, 0xfd, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x05, 0x48, 0x00, - 0x6b, 0x00, 0x28, 0x05, 0xd0, 0x41, 0x6a, 0x00, - 0x29, 0x02, 0xd1, 0x00, 0x68, 0x00, 0x28, 0xf9, - 0xd1, 0x70, 0x47, 0xb8, 0xad, 0x03, 0x20, 0xf0, - 0xb5, 0x00, 0x27, 0x14, 0x1c, 0x0d, 0x1c, 0x06, - 0x1c, 0xd2, 0xf7, 0x6e, 0xfe, 0x00, 0x28, 0x01, - 0xd1, 0x07, 0x27, 0x09, 0xe0, 0xba, 0x21, 0x01, - 0x60, 0xf1, 0x6a, 0x01, 0x61, 0x44, 0x61, 0xc5, - 0x60, 0x01, 0x1c, 0x05, 0x20, 0xd2, 0xf7, 0xcf, - 0xfe, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xb0, 0xb5, 0x04, 0x1c, 0xff, 0x30, 0xc1, - 0x30, 0x0d, 0x1c, 0x81, 0x68, 0x00, 0x27, 0x00, - 0x29, 0x10, 0xd0, 0x00, 0x21, 0x81, 0x60, 0xd2, - 0xf7, 0x4f, 0xfe, 0x00, 0x28, 0x01, 0xd1, 0x07, - 0x27, 0x08, 0xe0, 0xb9, 0x21, 0x01, 0x60, 0xc5, - 0x60, 0xe1, 0x6a, 0x01, 0x61, 0x01, 0x1c, 0x05, - 0x20, 0xd2, 0xf7, 0xb1, 0xfe, 0x20, 0x1c, 0x29, - 0x1c, 0xfc, 0xf7, 0x07, 0xfa, 0x38, 0x1c, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, 0x85, - 0xb0, 0x07, 0x1c, 0xf9, 0x1d, 0xff, 0x31, 0xba, - 0x31, 0x02, 0x20, 0x00, 0x24, 0x09, 0x23, 0x48, - 0x63, 0x06, 0x99, 0x9b, 0x01, 0xf8, 0x18, 0x01, - 0x63, 0xf9, 0x1d, 0x9d, 0x31, 0xfd, 0x23, 0x9b, - 0x00, 0x40, 0x48, 0xfe, 0x1d, 0xff, 0x36, 0xc0, - 0x6b, 0x7a, 0x36, 0xfd, 0x18, 0x01, 0x28, 0x04, - 0x91, 0x31, 0xd1, 0x10, 0x20, 0x29, 0x1c, 0xfa, - 0xf7, 0x80, 0xfe, 0x70, 0x68, 0xed, 0x09, 0x00, - 0xe5, 0x02, 0x00, 0x28, 0x15, 0xd0, 0x10, 0x21, - 0x00, 0x91, 0x08, 0x21, 0x01, 0x23, 0x38, 0x1c, - 0x01, 0x95, 0x06, 0x9a, 0x03, 0xf0, 0xcb, 0xfc, - 0x00, 0x22, 0x1e, 0x21, 0x38, 0x1c, 0xfe, 0xf7, - 0x59, 0xfe, 0x04, 0x1c, 0x01, 0xd0, 0x0c, 0x24, - 0x58, 0xe0, 0x38, 0x1c, 0xfd, 0xf7, 0x9e, 0xfa, - 0x54, 0xe0, 0xd2, 0xf7, 0x00, 0xfe, 0x05, 0x1c, - 0x50, 0xd0, 0x00, 0x22, 0x1b, 0x21, 0x38, 0x1c, - 0xfe, 0xf7, 0x48, 0xfe, 0xce, 0x20, 0x28, 0x60, - 0x04, 0x99, 0xe8, 0x1d, 0x88, 0xc9, 0x05, 0x30, - 0x88, 0xc0, 0x05, 0x20, 0x29, 0x1c, 0xd2, 0xf7, - 0x5d, 0xfe, 0x3f, 0xe0, 0x11, 0x1c, 0x10, 0x22, - 0x28, 0x1c, 0xd2, 0xf7, 0x4f, 0xfa, 0x70, 0x68, - 0x00, 0x28, 0x23, 0xd0, 0x38, 0x1c, 0x08, 0x22, - 0x06, 0x99, 0x1e, 0xa3, 0x03, 0xf0, 0x10, 0xfd, - 0x00, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x23, 0x21, - 0x38, 0x1c, 0xfe, 0xf7, 0x27, 0xfe, 0x02, 0xa8, - 0xfa, 0xf7, 0xf2, 0xf8, 0xb2, 0x69, 0xf9, 0x1d, - 0xff, 0x31, 0xf8, 0x1d, 0xff, 0x30, 0x82, 0x31, - 0x00, 0x91, 0x6e, 0x30, 0x01, 0x92, 0x02, 0x9a, - 0x29, 0x1c, 0x03, 0x9b, 0xfb, 0xf7, 0x51, 0xfc, - 0xf9, 0x1d, 0xff, 0x31, 0x01, 0x20, 0x3a, 0x31, - 0xc8, 0x62, 0x13, 0xe0, 0xd2, 0xf7, 0xbf, 0xfd, - 0x05, 0x1c, 0x0f, 0xd0, 0x00, 0x22, 0x1a, 0x21, - 0x38, 0x1c, 0xfe, 0xf7, 0x07, 0xfe, 0xce, 0x20, - 0x28, 0x60, 0x04, 0x99, 0xe8, 0x1d, 0x88, 0xc9, - 0x05, 0x30, 0x88, 0xc0, 0x05, 0x20, 0x29, 0x1c, - 0xd2, 0xf7, 0x1c, 0xfe, 0x20, 0x1c, 0x08, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0xf8, 0xad, 0x03, 0x20, 0x4c, 0x6d, 0x50, 0x61, - 0x69, 0x72, 0x49, 0x6e, 0x64, 0x49, 0x6e, 0x52, - 0x61, 0x6e, 0x64, 0x00, 0x88, 0xb5, 0x07, 0x1c, - 0xed, 0x09, 0x00, 0xe6, 0x02, 0xfa, 0x1d, 0xff, - 0x32, 0x3a, 0x32, 0xd2, 0x6a, 0x00, 0x20, 0x00, - 0x2a, 0x05, 0xd0, 0xfa, 0x1d, 0xff, 0x32, 0x7a, - 0x32, 0x53, 0x6b, 0x00, 0x2b, 0x0f, 0xd0, 0x10, - 0xa2, 0x00, 0x92, 0x09, 0x22, 0x24, 0x23, 0x38, - 0x1c, 0x03, 0xf0, 0xc7, 0xfc, 0x00, 0x22, 0x25, - 0x21, 0x38, 0x1c, 0xfe, 0xf7, 0xd1, 0xfd, 0x24, - 0x20, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xd2, - 0x69, 0x00, 0x2a, 0xf9, 0xd0, 0x06, 0xa2, 0x00, - 0x92, 0x09, 0x22, 0x26, 0x23, 0x38, 0x1c, 0x03, - 0xf0, 0xb4, 0xfc, 0x00, 0x22, 0x25, 0x21, 0x38, - 0x1c, 0xfe, 0xf7, 0xbe, 0xfd, 0x26, 0x20, 0xeb, - 0xe7, 0x4c, 0x6d, 0x50, 0x61, 0x69, 0x72, 0x49, - 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, - 0x65, 0x4b, 0x65, 0x79, 0x00, 0xf0, 0xb5, 0x88, - 0xb0, 0x07, 0x1c, 0x02, 0xa8, 0xfa, 0xf7, 0x7a, - 0xf8, 0xf8, 0x1d, 0xff, 0x30, 0x7a, 0x30, 0xf9, - 0x1d, 0xff, 0x31, 0x82, 0x69, 0x82, 0x31, 0xfd, - 0x23, 0x9b, 0x00, 0x00, 0x91, 0xf9, 0x18, 0xf8, - 0x1d, 0xff, 0x30, 0x01, 0x92, 0x02, 0x9a, 0x6e, - 0x30, 0x03, 0x9b, 0xfb, 0xf7, 0xd4, 0xfb, 0xf9, - 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x01, 0x20, 0x15, - 0x23, 0x9b, 0x01, 0xc8, 0x62, 0x22, 0x48, 0xfc, - 0x1d, 0xc5, 0x18, 0x29, 0x69, 0xff, 0x34, 0x9e, - 0x34, 0x00, 0x29, 0x0a, 0xd0, 0x1f, 0x4b, 0x04, - 0xae, 0xc1, 0x18, 0x08, 0x1c, 0x0c, 0xc9, 0x0c, - 0xc6, 0x0c, 0xc9, 0x0c, 0xc6, 0x4e, 0xc8, 0x4e, - 0xc4, 0x0c, 0xe0, 0x10, 0x20, 0x04, 0xa9, 0xfa, - 0xf7, 0x91, 0xfd, 0x02, 0xa8, 0xfa, 0xf7, 0x46, - 0xf8, 0x02, 0x9a, 0x03, 0x9b, 0x20, 0x1c, 0x04, - 0xa9, 0xfb, 0xf7, 0x84, 0xfb, 0x00, 0x20, 0x3a, - 0x18, 0xff, 0x32, 0x71, 0x32, 0x04, 0xa9, 0x09, - 0x5c, 0x12, 0x79, 0xed, 0x09, 0x00, 0xe7, 0x02, - 0x51, 0x40, 0x04, 0xaa, 0x11, 0x54, 0x01, 0x30, - 0x10, 0x28, 0xf3, 0xd3, 0x10, 0x21, 0x09, 0x23, - 0x9b, 0x01, 0xf8, 0x18, 0x00, 0x91, 0x01, 0x92, - 0x02, 0x6b, 0x28, 0x69, 0x0a, 0x21, 0x00, 0x28, - 0x00, 0xd1, 0x09, 0x21, 0x01, 0x23, 0x38, 0x1c, - 0x03, 0xf0, 0xc2, 0xfb, 0x04, 0x1c, 0x38, 0x1c, - 0xfd, 0xf7, 0x9d, 0xf9, 0x20, 0x1c, 0x08, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb8, 0xa8, - 0x03, 0x20, 0x54, 0x05, 0x00, 0x00, 0xf7, 0xb5, - 0x8e, 0xb0, 0x07, 0x1c, 0xfd, 0xf7, 0x77, 0xf9, - 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x4c, 0xba, 0x31, - 0x02, 0x20, 0x48, 0x63, 0xfd, 0x1d, 0xff, 0x35, - 0x20, 0x69, 0xe6, 0x1d, 0x0d, 0x36, 0x9e, 0x35, - 0x00, 0x28, 0x06, 0xd0, 0x30, 0x1c, 0x0c, 0xc8, - 0x02, 0xa9, 0x0c, 0xc1, 0x0c, 0xc8, 0x0c, 0xc1, - 0x0c, 0xe0, 0x10, 0x20, 0x02, 0xa9, 0xfa, 0xf7, - 0x40, 0xfd, 0x68, 0x46, 0xf9, 0xf7, 0xf5, 0xff, - 0x00, 0x9a, 0x01, 0x9b, 0x28, 0x1c, 0x02, 0xa9, - 0xfb, 0xf7, 0x33, 0xfb, 0x00, 0x20, 0x3a, 0x18, - 0xff, 0x32, 0x71, 0x32, 0x02, 0xa9, 0x09, 0x5c, - 0x12, 0x79, 0x51, 0x40, 0x02, 0xaa, 0x11, 0x54, - 0x01, 0x30, 0x10, 0x28, 0xf3, 0xd3, 0x10, 0x21, - 0x09, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x00, 0x91, - 0x01, 0x92, 0x02, 0x6b, 0x20, 0x69, 0x0a, 0x21, - 0x00, 0x28, 0x00, 0xd1, 0x09, 0x21, 0x01, 0x23, - 0x38, 0x1c, 0x03, 0xf0, 0x71, 0xfb, 0x38, 0x1c, - 0xfd, 0xf7, 0x4d, 0xf9, 0x20, 0x69, 0xfc, 0x1d, - 0xff, 0x34, 0x7a, 0x34, 0x00, 0x28, 0x04, 0xd0, - 0x4d, 0xce, 0x4d, 0xc5, 0x01, 0x20, 0xe0, 0x61, - 0x22, 0xe0, 0x00, 0x20, 0x3a, 0x18, 0xff, 0x32, - 0x0f, 0x99, 0x71, 0x32, 0x12, 0x79, 0x09, 0x5c, - 0x51, 0x40, 0x06, 0xaa, 0x11, 0x54, 0xed, 0x09, - 0x00, 0xe8, 0x02, 0x01, 0x30, 0x10, 0x28, 0xf3, - 0xd3, 0xfb, 0x1d, 0x9d, 0x33, 0x1a, 0x68, 0x5b, - 0x68, 0x0a, 0xa8, 0x06, 0xa9, 0xfb, 0xf7, 0xf3, - 0xfa, 0x00, 0x20, 0x39, 0x18, 0xff, 0x31, 0xa1, - 0x31, 0x0a, 0xaa, 0x12, 0x5c, 0x0b, 0x79, 0x5a, - 0x40, 0x01, 0x30, 0x10, 0x28, 0x0a, 0x71, 0xf4, - 0xd3, 0x00, 0x20, 0xe0, 0x61, 0x01, 0x20, 0x20, - 0x62, 0x11, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0xf8, 0xad, 0x03, 0x20, 0x80, - 0xb5, 0x0a, 0x1c, 0xc9, 0x69, 0x09, 0x78, 0xc9, - 0x07, 0xc9, 0x0f, 0xc7, 0x1d, 0xff, 0x37, 0x7a, - 0x37, 0x00, 0x23, 0x7b, 0x60, 0xd2, 0x69, 0x01, - 0x32, 0xff, 0xf7, 0x32, 0xfe, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x86, 0xb0, 0x07, - 0x1c, 0xf9, 0x1d, 0xff, 0x31, 0xba, 0x31, 0x01, - 0x20, 0x48, 0x63, 0x38, 0x1c, 0x03, 0xf0, 0x02, - 0xf9, 0x09, 0x23, 0x9b, 0x01, 0xfc, 0x18, 0x20, - 0x63, 0x10, 0x20, 0x02, 0xa9, 0xfa, 0xf7, 0xbb, - 0xfc, 0x68, 0x46, 0xf9, 0xf7, 0x70, 0xff, 0xf8, - 0x1d, 0xff, 0x30, 0x9e, 0x30, 0x00, 0x9a, 0x01, - 0x9b, 0x02, 0xa9, 0xfb, 0xf7, 0xac, 0xfa, 0x00, - 0x20, 0x3a, 0x18, 0xff, 0x32, 0x71, 0x32, 0x02, - 0xa9, 0x09, 0x5c, 0x12, 0x79, 0x51, 0x40, 0x02, - 0xaa, 0x11, 0x54, 0x01, 0x30, 0x10, 0x28, 0xf3, - 0xd3, 0x10, 0x21, 0x00, 0x91, 0x09, 0x21, 0x01, - 0x92, 0x01, 0x23, 0x38, 0x1c, 0x22, 0x6b, 0x03, - 0xf0, 0xf1, 0xfa, 0x38, 0x1c, 0xfd, 0xf7, 0xcd, - 0xf8, 0x06, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0xf0, 0xb5, 0x00, 0x24, 0x07, - 0x1c, 0xc8, 0x69, 0x00, 0x78, 0xc6, 0x07, 0xf6, - 0x0f, 0x0d, 0x1c, 0x38, 0x1c, 0x31, 0x1c, 0xff, - 0xf7, 0x84, 0xfe, 0x00, 0x28, 0x09, 0xd1, 0x09, - 0x23, 0xed, 0x09, 0x00, 0xe9, 0x02, 0x9b, 0x01, - 0xf8, 0x18, 0x06, 0x63, 0xe8, 0x69, 0x04, 0xa2, - 0x41, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x1c, 0xff, - 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x4c, 0x6d, 0x50, 0x61, 0x69, 0x72, 0x53, 0x75, - 0x62, 0x53, 0x74, 0x49, 0x64, 0x6c, 0x65, 0x49, - 0x6e, 0x64, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, - 0x65, 0x4b, 0x65, 0x79, 0x00, 0x00, 0x00, 0x00, - 0x80, 0xb5, 0x82, 0xb0, 0xfd, 0x23, 0x9b, 0x00, - 0xc2, 0x18, 0x07, 0x1c, 0xff, 0x30, 0x10, 0x21, - 0x00, 0x91, 0xff, 0x30, 0x42, 0x30, 0x01, 0x92, - 0x02, 0x6b, 0x08, 0x21, 0x01, 0x23, 0x38, 0x1c, - 0x03, 0xf0, 0xab, 0xfa, 0x38, 0x1c, 0xfd, 0xf7, - 0x87, 0xf8, 0x06, 0xa2, 0x00, 0x92, 0x08, 0x22, - 0x23, 0x23, 0x01, 0x21, 0x38, 0x1c, 0x03, 0xf0, - 0x24, 0xfb, 0x02, 0xb0, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x50, 0x61, - 0x69, 0x72, 0x53, 0x75, 0x62, 0x53, 0x74, 0x49, - 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x52, 0x61, - 0x6e, 0x64, 0x50, 0x69, 0x6e, 0x52, 0x65, 0x71, - 0x50, 0x69, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x00, 0x00, 0x00, 0x00, - 0x90, 0xb5, 0x82, 0xb0, 0xfd, 0x23, 0x9b, 0x00, - 0xc2, 0x18, 0x07, 0x1c, 0xff, 0x30, 0x10, 0x21, - 0x00, 0x91, 0xff, 0x30, 0x42, 0x30, 0x01, 0x92, - 0x02, 0x6b, 0x08, 0x21, 0x01, 0x23, 0x38, 0x1c, - 0x03, 0xf0, 0x6f, 0xfa, 0x04, 0x1c, 0x38, 0x1c, - 0xfd, 0xf7, 0x4a, 0xf8, 0x20, 0x1c, 0x02, 0xb0, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x00, 0x24, 0x07, 0x1c, 0xc8, 0x69, 0x00, 0x78, - 0x3a, 0x69, 0xc0, 0x07, 0xc0, 0x0f, 0x02, 0x2a, - 0x20, 0xd1, 0x09, 0x23, 0xed, 0x09, 0x00, 0xea, - 0x02, 0x9b, 0x01, 0xfa, 0x18, 0x10, 0x63, 0xfa, - 0x1d, 0xff, 0x32, 0xba, 0x32, 0x02, 0x20, 0x50, - 0x63, 0x10, 0x48, 0xc0, 0x6b, 0x01, 0x28, 0x05, - 0xd1, 0x00, 0x22, 0x30, 0x21, 0x38, 0x1c, 0xfe, - 0xf7, 0xdd, 0xfb, 0x12, 0xe0, 0xc8, 0x69, 0xfd, - 0x23, 0x9b, 0x00, 0x41, 0x1c, 0xf8, 0x18, 0x10, - 0x22, 0xd1, 0xf7, 0xec, 0xff, 0x00, 0x22, 0x31, - 0x21, 0x38, 0x1c, 0xfe, 0xf7, 0xcf, 0xfb, 0x04, - 0xe0, 0x00, 0x22, 0x1f, 0x21, 0x38, 0x1c, 0xfe, - 0xf7, 0xc9, 0xfb, 0x20, 0x1c, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xf8, 0xad, 0x03, - 0x20, 0x08, 0xb5, 0xc9, 0x69, 0x05, 0xa2, 0x09, - 0x78, 0x00, 0x92, 0xc9, 0x07, 0xc9, 0x0f, 0x06, - 0x23, 0x0b, 0x22, 0x03, 0xf0, 0xa8, 0xfa, 0x01, - 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x43, - 0x6e, 0x74, 0x72, 0x6c, 0x53, 0x75, 0x62, 0x53, - 0x74, 0x49, 0x6e, 0x69, 0x74, 0x50, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x49, 0x6e, 0x64, 0x41, 0x75, - 0x52, 0x61, 0x6e, 0x64, 0x00, 0xf8, 0xb5, 0x00, - 0x24, 0x07, 0x1c, 0xc8, 0x69, 0x00, 0x78, 0xc5, - 0x07, 0xed, 0x0f, 0x38, 0x69, 0x0e, 0x1c, 0x01, - 0x28, 0x0b, 0xd1, 0x01, 0x2d, 0x09, 0xd1, 0x29, - 0xa2, 0x00, 0x92, 0x08, 0x22, 0x23, 0x23, 0x38, - 0x1c, 0x29, 0x1c, 0x03, 0xf0, 0x80, 0xfa, 0x04, - 0x1c, 0x44, 0xe0, 0x02, 0x28, 0x0b, 0xd1, 0x00, - 0x2d, 0x09, 0xd1, 0x38, 0x1c, 0xfc, 0xf7, 0xba, - 0xff, 0xf0, 0x69, 0x42, 0x1c, 0x38, 0x1c, 0x29, - 0x1c, 0xff, 0xf7, 0xf7, 0xfc, 0x36, 0xe0, 0x25, - 0x48, 0xc0, 0x6b, 0x01, 0x28, 0x17, 0xd1, 0x18, - 0x24, 0x38, 0x1c, 0xfc, 0xf7, 0xab, 0xff, 0x19, - 0xa2, 0x00, 0x92, 0x08, 0x22, 0x38, 0x1c, 0x29, - 0x1c, 0x23, 0x1c, 0x03, 0xf0, 0x60, 0xfa, 0xed, - 0x09, 0x00, 0xeb, 0x02, 0x00, 0x22, 0x22, 0x21, - 0x38, 0x1c, 0xfe, 0xf7, 0x6a, 0xfb, 0x22, 0x21, - 0x38, 0x1c, 0x22, 0x1c, 0xfe, 0xf7, 0xa1, 0xfb, - 0x04, 0x1c, 0x1a, 0xe0, 0x38, 0x1c, 0xfc, 0xf7, - 0x94, 0xff, 0xf0, 0x69, 0xfd, 0x23, 0x9b, 0x00, - 0x41, 0x1c, 0xf8, 0x18, 0x10, 0x22, 0xd1, 0xf7, - 0x70, 0xff, 0x38, 0x1c, 0x29, 0x1c, 0x08, 0x22, - 0x08, 0xa3, 0x03, 0xf0, 0x34, 0xfa, 0x04, 0x1c, - 0x04, 0xd1, 0x00, 0x22, 0x21, 0x21, 0x38, 0x1c, - 0xfe, 0xf7, 0x4b, 0xfb, 0x38, 0x1c, 0xff, 0xf7, - 0x96, 0xfd, 0x20, 0x1c, 0xf8, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, - 0x6c, 0x53, 0x75, 0x62, 0x53, 0x74, 0x49, 0x6e, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x49, 0x6e, 0x64, - 0x49, 0x6e, 0x52, 0x61, 0x6e, 0x64, 0x00, 0x00, - 0x00, 0x00, 0xf8, 0xad, 0x03, 0x20, 0x08, 0xb5, - 0xc9, 0x69, 0x05, 0xa2, 0x09, 0x78, 0x00, 0x92, - 0xc9, 0x07, 0xc9, 0x0f, 0x06, 0x23, 0x0b, 0x22, - 0x03, 0xf0, 0x18, 0xfa, 0x01, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x4c, 0x6d, 0x43, 0x6e, 0x74, 0x72, - 0x6c, 0x53, 0x75, 0x62, 0x53, 0x74, 0x49, 0x6e, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x49, 0x6e, 0x64, - 0x41, 0x75, 0x52, 0x61, 0x6e, 0x64, 0x00, 0x00, - 0x00, 0x00, 0xf0, 0xb5, 0x87, 0xb0, 0x07, 0x1c, - 0xff, 0x30, 0xc1, 0x30, 0x40, 0x6b, 0x00, 0x24, - 0x01, 0x28, 0x5b, 0xd1, 0xf8, 0x1d, 0xff, 0x30, - 0x7a, 0x30, 0xf9, 0x1d, 0xff, 0x31, 0x82, 0x31, - 0xfd, 0x23, 0x82, 0x69, 0x9b, 0x00, 0xfd, 0x1d, - 0x00, 0x91, 0xf9, 0x18, 0x9d, 0x35, 0xf8, 0x1d, - 0x01, 0x92, 0x0c, 0xcd, 0xff, 0x30, 0x6e, 0x30, - 0xfb, 0xf7, 0x32, 0xf9, 0xf9, 0x1d, 0xff, 0x31, - 0x3a, 0x31, 0x01, 0x20, 0x15, 0x23, 0x9b, 0x01, - 0xc8, 0x62, 0xed, 0x09, 0x00, 0xec, 0x02, 0x22, - 0x48, 0xfd, 0x1d, 0xc6, 0x18, 0x31, 0x69, 0xff, - 0x35, 0x9e, 0x35, 0x00, 0x29, 0x0b, 0xd0, 0x1f, - 0x4b, 0x02, 0xa9, 0xc0, 0x18, 0x06, 0x90, 0x0c, - 0xc8, 0x0c, 0xc1, 0x0c, 0xc8, 0x0c, 0xc1, 0x06, - 0x98, 0x0f, 0xc8, 0x0f, 0xc5, 0x0c, 0xe0, 0x10, - 0x20, 0x02, 0xa9, 0xfa, 0xf7, 0xee, 0xfa, 0x68, - 0x46, 0xf9, 0xf7, 0xa3, 0xfd, 0x00, 0x9a, 0x01, - 0x9b, 0x28, 0x1c, 0x02, 0xa9, 0xfb, 0xf7, 0xe1, - 0xf8, 0x00, 0x20, 0x3a, 0x18, 0xff, 0x32, 0x71, - 0x32, 0x02, 0xa9, 0x09, 0x5c, 0x12, 0x79, 0x51, - 0x40, 0x02, 0xaa, 0x11, 0x54, 0x01, 0x30, 0x10, - 0x28, 0xf3, 0xd3, 0x10, 0x21, 0x09, 0x23, 0x9b, - 0x01, 0xf8, 0x18, 0x00, 0x91, 0x01, 0x92, 0x02, - 0x6b, 0x30, 0x69, 0x0a, 0x21, 0x00, 0x28, 0x00, - 0xd1, 0x09, 0x21, 0x01, 0x23, 0x38, 0x1c, 0x03, - 0xf0, 0x1f, 0xf9, 0x38, 0x1c, 0xfc, 0xf7, 0xfb, - 0xfe, 0x20, 0x1c, 0x07, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xb8, 0xa8, 0x03, 0x20, 0x54, - 0x05, 0x00, 0x00, 0x80, 0xb5, 0x07, 0x1c, 0x40, - 0x69, 0x0e, 0x28, 0x03, 0xd1, 0x22, 0x21, 0x38, - 0x1c, 0xfb, 0xf7, 0x17, 0xfe, 0x38, 0x1c, 0x03, - 0xa1, 0xfb, 0xf7, 0x07, 0xfe, 0x80, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, 0x00, 0x4c, - 0x6d, 0x50, 0x61, 0x69, 0x72, 0x53, 0x75, 0x62, - 0x53, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x00, 0x00, 0x00, 0xb5, 0x09, 0x23, 0x9b, - 0x01, 0xc2, 0x18, 0x13, 0x6b, 0x06, 0x22, 0xfb, - 0xf7, 0x94, 0xfe, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x09, 0x23, 0x9b, 0x01, 0xc2, 0x18, 0x13, - 0x6b, 0x12, 0x22, 0xfb, 0xf7, 0x8a, 0xfe, 0x08, - 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0xed, 0x09, 0x00, - 0xed, 0x02, 0x87, 0xb0, 0x07, 0x1c, 0xc8, 0x69, - 0x00, 0x78, 0xc4, 0x07, 0xe4, 0x0f, 0x09, 0x23, - 0x9b, 0x01, 0xf8, 0x18, 0x00, 0x6b, 0x0d, 0x1c, - 0xa0, 0x42, 0x08, 0xd1, 0x1d, 0xa2, 0x00, 0x92, - 0x0b, 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, - 0x03, 0xf0, 0x4d, 0xf9, 0x2c, 0xe0, 0xf8, 0x1d, - 0xff, 0x30, 0x3a, 0x30, 0xc0, 0x6a, 0x00, 0x28, - 0x08, 0xd1, 0x16, 0xa2, 0x00, 0x92, 0x0b, 0x22, - 0x06, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x03, 0xf0, - 0x3e, 0xf9, 0x1d, 0xe0, 0x01, 0xa8, 0xf9, 0xf7, - 0x17, 0xfd, 0x02, 0x9a, 0x00, 0x92, 0xe8, 0x69, - 0xfa, 0x1d, 0x41, 0x1c, 0xff, 0x32, 0x6e, 0x32, - 0x03, 0xa8, 0x01, 0x9b, 0xfb, 0xf7, 0xb6, 0xf8, - 0x04, 0x21, 0x00, 0x91, 0x03, 0xaa, 0x01, 0x92, - 0x0c, 0x21, 0x01, 0x23, 0x38, 0x1c, 0x22, 0x1c, - 0x03, 0xf0, 0xa1, 0xf8, 0x00, 0x28, 0x03, 0xd1, - 0x38, 0x1c, 0x04, 0xa9, 0xfb, 0xf7, 0x5e, 0xfd, - 0x07, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x50, 0x61, - 0x69, 0x72, 0x53, 0x75, 0x62, 0x53, 0x74, 0x49, - 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x62, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x71, 0x53, 0x52, 0x65, - 0x73, 0x00, 0x00, 0x00, 0xf0, 0xb5, 0x89, 0xb0, - 0x07, 0x1c, 0xc8, 0x69, 0x00, 0x78, 0xc0, 0x07, - 0xc0, 0x0f, 0x09, 0x23, 0x9b, 0x01, 0xfa, 0x18, - 0x12, 0x6b, 0x00, 0x26, 0x0d, 0x1c, 0x82, 0x42, - 0x13, 0xd0, 0x3a, 0x69, 0x01, 0x2a, 0x08, 0xd1, - 0x25, 0xa2, 0x00, 0x92, 0x09, 0x22, 0x23, 0x23, - 0x01, 0x1c, 0x38, 0x1c, 0x03, 0xf0, 0xef, 0xf8, - 0x3d, 0xe0, 0x38, 0x1c, 0xff, 0xf7, 0x7e, 0xfd, - 0x00, 0x28, 0x38, 0xd1, 0x13, 0x20, 0xb8, 0x61, - 0x35, 0xe0, 0x38, 0x1c, 0xfc, 0xf7, 0x26, 0xfe, - 0xed, 0x09, 0x00, 0xee, 0x02, 0x24, 0x48, 0xfc, - 0x1d, 0xff, 0x34, 0x00, 0x69, 0x7a, 0x34, 0x00, - 0x28, 0x02, 0xd0, 0x01, 0x20, 0xe0, 0x61, 0x21, - 0xe0, 0x00, 0x20, 0xe9, 0x69, 0x3a, 0x18, 0x09, - 0x18, 0xff, 0x32, 0x71, 0x32, 0x12, 0x79, 0x49, - 0x78, 0x4a, 0x40, 0x01, 0xa9, 0x0a, 0x54, 0x01, - 0x30, 0x10, 0x28, 0xf2, 0xd3, 0xfb, 0x1d, 0x9d, - 0x33, 0x1a, 0x68, 0x5b, 0x68, 0x05, 0xa8, 0xfa, - 0xf7, 0xe5, 0xff, 0x00, 0x20, 0x39, 0x18, 0xff, - 0x31, 0xa1, 0x31, 0x05, 0xaa, 0x12, 0x5c, 0x0b, - 0x79, 0x5a, 0x40, 0x01, 0x30, 0x10, 0x28, 0x0a, - 0x71, 0xf4, 0xd3, 0xe6, 0x61, 0x01, 0x20, 0x20, - 0x62, 0x00, 0x22, 0x27, 0x21, 0x38, 0x1c, 0xfe, - 0xf7, 0xbf, 0xf9, 0x30, 0x1c, 0x09, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x50, - 0x61, 0x69, 0x72, 0x53, 0x75, 0x62, 0x53, 0x74, - 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x62, - 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x64, 0x43, 0x6f, - 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4b, 0x65, 0x79, - 0x00, 0xf8, 0xad, 0x03, 0x20, 0xf0, 0xb5, 0x0c, - 0x1c, 0x07, 0x1c, 0xfc, 0xf7, 0xd5, 0xfd, 0x14, - 0x48, 0xf9, 0x1d, 0xff, 0x31, 0x00, 0x69, 0x7a, - 0x31, 0x01, 0x23, 0x00, 0x28, 0x02, 0xd0, 0x38, - 0x69, 0x02, 0x28, 0x12, 0xd1, 0x02, 0x20, 0xc8, - 0x61, 0x00, 0x20, 0xe2, 0x69, 0x12, 0x18, 0x55, - 0x78, 0x3a, 0x18, 0xd6, 0x1d, 0xff, 0x36, 0x6a, - 0x36, 0x36, 0x79, 0x75, 0x40, 0xff, 0x32, 0xa1, - 0x32, 0x01, 0x30, 0x10, 0x28, 0x15, 0x71, 0xf0, - 0xd3, 0x00, 0xe0, 0xcb, 0x61, 0x0b, 0x62, 0x27, - 0x21, 0x00, 0x22, 0x38, 0x1c, 0xfe, 0xf7, 0x7c, - 0xf9, 0xf0, 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0xf8, 0xad, 0x03, 0x20, 0xb0, 0xb5, 0x82, - 0xb0, 0x07, 0x1c, 0xed, 0x09, 0x00, 0xef, 0x02, - 0xff, 0x30, 0x81, 0x30, 0xf9, 0x1d, 0xff, 0x31, - 0x82, 0x31, 0x00, 0x24, 0xfd, 0x23, 0x82, 0x69, - 0x9b, 0x00, 0xfd, 0x1d, 0x00, 0x91, 0xf9, 0x18, - 0x9d, 0x35, 0xf8, 0x1d, 0x01, 0x92, 0x0c, 0xcd, - 0xff, 0x30, 0x6e, 0x30, 0xfa, 0xf7, 0x9a, 0xff, - 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x01, 0x20, - 0xc8, 0x62, 0x38, 0x1c, 0xfc, 0xf7, 0xa3, 0xfd, - 0x20, 0x1c, 0x02, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0xb5, 0xc9, 0x69, 0x02, 0xa2, - 0x01, 0x31, 0xff, 0xf7, 0x04, 0xfc, 0x08, 0xbc, - 0x18, 0x47, 0x4c, 0x6d, 0x50, 0x61, 0x69, 0x72, - 0x53, 0x75, 0x62, 0x53, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, - 0x57, 0x61, 0x69, 0x74, 0x49, 0x6e, 0x64, 0x43, - 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x4b, 0x65, - 0x79, 0x00, 0xf0, 0xb5, 0x87, 0xb0, 0x0d, 0x1c, - 0x07, 0x1c, 0xfc, 0xf7, 0x64, 0xfd, 0xf8, 0x1d, - 0xff, 0x30, 0xba, 0x30, 0x02, 0x21, 0x15, 0x23, - 0x9b, 0x01, 0x41, 0x63, 0x2e, 0x48, 0xfc, 0x1d, - 0xc6, 0x18, 0x32, 0x69, 0xff, 0x34, 0x7a, 0x34, - 0x00, 0x2a, 0x22, 0xd0, 0x3a, 0x69, 0x01, 0x2a, - 0x1f, 0xd1, 0x29, 0x4b, 0x02, 0xa9, 0xc0, 0x18, - 0x06, 0x90, 0x0c, 0xc8, 0x0c, 0xc1, 0x0c, 0xc8, - 0x0c, 0xc1, 0x06, 0x98, 0xf9, 0x1d, 0xff, 0x31, - 0x0c, 0xc8, 0x9e, 0x31, 0x0c, 0xc1, 0x0c, 0xc8, - 0x0c, 0xc1, 0x00, 0x20, 0x3a, 0x18, 0xff, 0x32, - 0x71, 0x32, 0x02, 0xa9, 0x09, 0x5c, 0x12, 0x79, - 0x51, 0x40, 0x02, 0xaa, 0x11, 0x54, 0x01, 0x30, - 0x10, 0x28, 0xf3, 0xd3, 0x01, 0x20, 0xe0, 0x61, - 0x00, 0xe0, 0xe1, 0x61, 0x10, 0x21, 0x09, 0x23, - 0x9b, 0x01, 0x02, 0xaa, 0x01, 0x92, 0xf8, 0x18, - 0x00, 0x91, 0x02, 0x6b, 0x30, 0x69, 0xed, 0x09, - 0x00, 0xf0, 0x02, 0x0a, 0x21, 0x00, 0x28, 0x00, - 0xd1, 0x09, 0x21, 0x01, 0x23, 0x38, 0x1c, 0x02, - 0xf0, 0x59, 0xff, 0x38, 0x1c, 0xfc, 0xf7, 0x35, - 0xfd, 0x30, 0x69, 0x00, 0x28, 0x02, 0xd0, 0x38, - 0x69, 0x02, 0x28, 0x0f, 0xd1, 0x00, 0x20, 0xe9, - 0x69, 0x09, 0x18, 0x4a, 0x78, 0x39, 0x18, 0xcb, - 0x1d, 0xff, 0x33, 0x6a, 0x33, 0x1b, 0x79, 0x5a, - 0x40, 0xff, 0x31, 0xa1, 0x31, 0x01, 0x30, 0x10, - 0x28, 0x0a, 0x71, 0xf0, 0xd3, 0x01, 0x20, 0x20, - 0x62, 0x07, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0xb8, 0xa8, 0x03, 0x20, 0x54, - 0x05, 0x00, 0x00, 0x90, 0xb5, 0x07, 0x1c, 0x00, - 0x69, 0x00, 0x24, 0x01, 0x28, 0x03, 0xd1, 0x38, - 0x1c, 0x00, 0xf0, 0x99, 0xfb, 0x14, 0xe0, 0x00, - 0x22, 0x20, 0x21, 0x38, 0x1c, 0xfe, 0xf7, 0xb9, - 0xf8, 0xf9, 0x1d, 0xff, 0x31, 0x7a, 0x31, 0x00, - 0x20, 0xfd, 0x23, 0x9b, 0x00, 0xfa, 0x18, 0x09, - 0x23, 0x9b, 0x01, 0x48, 0x60, 0xf8, 0x18, 0x01, - 0x6b, 0x38, 0x1c, 0xff, 0xf7, 0x21, 0xfa, 0x04, - 0x1c, 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x90, 0xb5, 0x07, 0x1c, 0x00, 0x69, 0x00, - 0x24, 0x01, 0x28, 0x03, 0xd1, 0x38, 0x1c, 0x00, - 0xf0, 0x76, 0xfb, 0x14, 0xe0, 0x00, 0x22, 0x20, - 0x21, 0x38, 0x1c, 0xfe, 0xf7, 0x96, 0xf8, 0xf9, - 0x1d, 0xff, 0x31, 0x7a, 0x31, 0x00, 0x20, 0xfd, - 0x23, 0x9b, 0x00, 0xfa, 0x18, 0x09, 0x23, 0x9b, - 0x01, 0x48, 0x60, 0xf8, 0x18, 0x01, 0x6b, 0x38, - 0x1c, 0xff, 0xf7, 0xfe, 0xf9, 0x04, 0x1c, 0x20, - 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, - 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0x08, 0x1c, 0xf9, - 0x1d, 0xff, 0x31, 0xba, 0x31, 0x49, 0x6b, 0x02, - 0x29, 0x2a, 0xd1, 0x09, 0x23, 0x9b, 0x01, 0xfd, - 0x18, 0xed, 0x09, 0x00, 0xf1, 0x02, 0x00, 0x28, - 0x1b, 0xd1, 0xfd, 0x23, 0x9b, 0x00, 0xf8, 0x18, - 0x04, 0x1c, 0x10, 0x22, 0x13, 0xa1, 0xf7, 0xf7, - 0x67, 0xf8, 0x00, 0x28, 0x03, 0xd1, 0x10, 0x20, - 0x21, 0x1c, 0xfa, 0xf7, 0x7b, 0xf8, 0x10, 0x21, - 0x00, 0x91, 0x08, 0x21, 0x01, 0x94, 0x01, 0x23, - 0x38, 0x1c, 0x2a, 0x6b, 0x02, 0xf0, 0xc9, 0xfe, - 0x04, 0x1c, 0x38, 0x1c, 0xfc, 0xf7, 0xa4, 0xfc, - 0x0a, 0xe0, 0x0d, 0xa2, 0x00, 0x92, 0x08, 0x22, - 0x03, 0x1c, 0x38, 0x1c, 0x29, 0x6b, 0x02, 0xf0, - 0x40, 0xff, 0x04, 0x1c, 0x00, 0xe0, 0x0c, 0x24, - 0x20, 0x1c, 0x02, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4c, 0x6d, 0x50, 0x61, 0x69, 0x72, 0x53, 0x75, - 0x62, 0x53, 0x74, 0x52, 0x65, 0x73, 0x70, 0x46, - 0x69, 0x78, 0x50, 0x69, 0x6e, 0x52, 0x65, 0x71, - 0x50, 0x69, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x00, 0x00, 0x00, 0x00, - 0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x08, 0x1c, - 0xf9, 0x1d, 0xff, 0x31, 0xba, 0x31, 0x49, 0x6b, - 0x02, 0x29, 0x34, 0xd1, 0x09, 0x23, 0x9b, 0x01, - 0xf9, 0x18, 0x00, 0x28, 0x25, 0xd1, 0x38, 0x1c, - 0x08, 0x22, 0x09, 0x6b, 0x19, 0xa3, 0x02, 0xf0, - 0xf5, 0xfe, 0x04, 0x1c, 0x02, 0xa8, 0xf9, 0xf7, - 0xdd, 0xfa, 0xf8, 0x1d, 0xff, 0x30, 0x7a, 0x30, - 0xf9, 0x1d, 0xff, 0x31, 0x82, 0x69, 0x82, 0x31, - 0xfd, 0x23, 0x9b, 0x00, 0x00, 0x91, 0xf9, 0x18, - 0xf8, 0x1d, 0xff, 0x30, 0x01, 0x92, 0x02, 0x9a, - 0x6e, 0x30, 0x03, 0x9b, 0xfa, 0xf7, 0x37, 0xfe, - 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x01, 0x20, - 0xc8, 0x62, 0x38, 0x1c, 0xed, 0x09, 0x00, 0xf2, - 0x02, 0xfc, 0xf7, 0x40, 0xfc, 0x0a, 0xe0, 0x08, - 0xa2, 0x00, 0x92, 0x08, 0x22, 0x03, 0x1c, 0x38, - 0x1c, 0x09, 0x6b, 0x02, 0xf0, 0xdc, 0xfe, 0x04, - 0x1c, 0x00, 0xe0, 0x0c, 0x24, 0x20, 0x1c, 0x04, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x4c, 0x6d, 0x50, 0x61, 0x69, 0x72, 0x53, - 0x75, 0x62, 0x53, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x56, 0x61, 0x72, 0x50, 0x69, 0x6e, 0x52, 0x65, - 0x71, 0x50, 0x69, 0x6e, 0x43, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0xb4, 0xc5, 0x1d, 0xff, 0x35, 0x6e, - 0x35, 0x6c, 0xcd, 0xc4, 0x1d, 0xff, 0x34, 0xb2, - 0x34, 0x6c, 0xc4, 0xc5, 0x1d, 0xff, 0x35, 0x7a, - 0x35, 0x01, 0x22, 0x6a, 0x63, 0x00, 0x27, 0x00, - 0x22, 0xcb, 0x69, 0x84, 0x18, 0x9b, 0x18, 0x5e, - 0x78, 0x1f, 0x23, 0x5b, 0x01, 0xe3, 0x18, 0x1b, - 0x79, 0x73, 0x40, 0xff, 0x34, 0xa1, 0x34, 0x01, - 0x32, 0x10, 0x2a, 0x23, 0x71, 0xf0, 0xd3, 0x01, - 0x22, 0x2a, 0x62, 0x38, 0x1c, 0xf0, 0xbc, 0x70, - 0x47, 0x00, 0xb5, 0xfc, 0xf7, 0xdb, 0xfb, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0xb0, 0xb5, 0x87, - 0xb0, 0x07, 0x1c, 0xff, 0x30, 0x81, 0x30, 0x00, - 0x6a, 0x00, 0x24, 0x0d, 0x1c, 0x00, 0x28, 0x2b, - 0xd0, 0x01, 0xa8, 0xf9, 0xf7, 0x65, 0xfa, 0x02, - 0x9a, 0x00, 0x92, 0xe8, 0x69, 0xfa, 0x1d, 0x41, - 0x1c, 0xff, 0x32, 0x9e, 0x32, 0x03, 0xa8, 0x01, - 0x9b, 0xfa, 0xf7, 0x04, 0xfe, 0x04, 0x21, 0x09, - 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x00, 0x91, 0x03, - 0xaa, 0x01, 0x92, 0x02, 0x6b, 0x0c, 0x21, 0x01, - 0x23, 0x38, 0x1c, 0x02, 0xf0, 0xec, 0xfd, 0x04, - 0x1c, 0x03, 0xd1, 0x38, 0x1c, 0x04, 0xa9, 0xfb, - 0xf7, 0xa9, 0xfa, 0xf8, 0x1d, 0xff, 0x30, 0xed, - 0x09, 0x00, 0xf3, 0x02, 0xba, 0x30, 0x40, 0x6b, - 0x02, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x27, 0x21, - 0x38, 0x1c, 0xfd, 0xf7, 0x6e, 0xff, 0x20, 0x1c, - 0x07, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x90, 0xb5, 0x07, 0x1c, 0xff, 0x30, 0xc1, 0x30, - 0x40, 0x6b, 0x00, 0x24, 0x02, 0x28, 0x07, 0xd1, - 0x38, 0x1c, 0xfc, 0xf7, 0x42, 0xfa, 0x00, 0x22, - 0x48, 0x21, 0x38, 0x1c, 0xfd, 0xf7, 0x95, 0xff, - 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x90, 0xb5, 0x0c, 0x1c, 0x0a, 0xa1, 0x07, 0x1c, - 0xfb, 0xf7, 0xbd, 0xfa, 0x38, 0x1c, 0x21, 0x1c, - 0xfa, 0xf7, 0x9d, 0xfe, 0x23, 0x2c, 0x06, 0xd1, - 0x78, 0x69, 0x0e, 0x28, 0x03, 0xd1, 0x38, 0x1c, - 0x21, 0x1c, 0xfb, 0xf7, 0xbc, 0xfa, 0x90, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x4c, 0x6d, - 0x50, 0x61, 0x69, 0x72, 0x53, 0x75, 0x62, 0x53, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x41, 0x75, 0x74, - 0x68, 0x52, 0x65, 0x71, 0x49, 0x6e, 0x64, 0x41, - 0x6e, 0x73, 0x77, 0x65, 0x72, 0x41, 0x75, 0x52, - 0x61, 0x6e, 0x64, 0x45, 0x72, 0x72, 0x00, 0x00, - 0x00, 0x00, 0x90, 0xb5, 0x0c, 0x1c, 0x05, 0xa1, - 0x07, 0x1c, 0xfb, 0xf7, 0x90, 0xfa, 0x38, 0x1c, - 0x21, 0x1c, 0xfa, 0xf7, 0x70, 0xfe, 0x90, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x4c, 0x6d, - 0x50, 0x61, 0x69, 0x72, 0x53, 0x75, 0x62, 0x53, - 0x74, 0x41, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x6c, - 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x64, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x41, - 0x75, 0x52, 0x61, 0x6e, 0x64, 0x45, 0x72, 0x72, - 0x00, 0x00, 0x90, 0xb5, 0x87, 0xb0, 0x07, 0x1c, - 0x01, 0xa8, 0x0c, 0x1c, 0xf9, 0xf7, 0xcb, 0xf9, - 0x02, 0x9a, 0x00, 0x92, 0xe0, 0x69, 0xfa, 0x1d, - 0x41, 0x1c, 0xed, 0x09, 0x00, 0xf4, 0x02, 0xff, - 0x32, 0x6e, 0x32, 0x03, 0xa8, 0x01, 0x9b, 0xfa, - 0xf7, 0x6a, 0xfd, 0x04, 0x21, 0x09, 0x23, 0x9b, - 0x01, 0xf8, 0x18, 0x00, 0x91, 0x03, 0xaa, 0x01, - 0x92, 0x02, 0x6b, 0x0c, 0x21, 0x01, 0x23, 0x38, - 0x1c, 0x02, 0xf0, 0x52, 0xfd, 0x00, 0x28, 0x03, - 0xd1, 0x38, 0x1c, 0x04, 0xa9, 0xfb, 0xf7, 0x0f, - 0xfa, 0x00, 0x22, 0x27, 0x21, 0x38, 0x1c, 0xfd, - 0xf7, 0xda, 0xfe, 0x07, 0xb0, 0x90, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0xf0, 0xb5, 0x88, - 0xb0, 0x07, 0x1c, 0x00, 0x24, 0x09, 0x23, 0x9b, - 0x01, 0x00, 0x69, 0xfd, 0x18, 0x01, 0x28, 0x09, - 0xd1, 0x22, 0xa2, 0x00, 0x92, 0x0b, 0x22, 0x23, - 0x23, 0x38, 0x1c, 0x29, 0x6b, 0x02, 0xf0, 0xb4, - 0xfd, 0x04, 0x1c, 0x34, 0xe0, 0x07, 0x91, 0xf9, - 0x1d, 0xff, 0x31, 0xba, 0x31, 0x02, 0x20, 0x48, - 0x63, 0xf8, 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x00, - 0x6a, 0x00, 0x28, 0x03, 0xd0, 0xfe, 0x1d, 0xff, - 0x36, 0x9e, 0x36, 0x02, 0xe0, 0xfe, 0x1d, 0xff, - 0x36, 0x6e, 0x36, 0x01, 0xa8, 0xf9, 0xf7, 0x79, - 0xf9, 0x02, 0x9a, 0x07, 0x99, 0x00, 0x92, 0xc8, - 0x69, 0x01, 0x9b, 0x41, 0x1c, 0x03, 0xa8, 0x32, - 0x1c, 0xfa, 0xf7, 0x19, 0xfd, 0x04, 0x21, 0x00, - 0x91, 0x03, 0xaa, 0x01, 0x92, 0x0c, 0x21, 0x01, - 0x23, 0x38, 0x1c, 0x2a, 0x6b, 0x02, 0xf0, 0x04, - 0xfd, 0x00, 0x28, 0x03, 0xd1, 0x38, 0x1c, 0x04, - 0xa9, 0xfb, 0xf7, 0xc1, 0xf9, 0x00, 0x22, 0x2f, - 0x21, 0x38, 0x1c, 0xfd, 0xf7, 0x8c, 0xfe, 0x20, - 0x1c, 0x08, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x50, 0x61, 0x69, - 0x72, 0x53, 0x75, 0x62, 0x53, 0x74, 0x49, 0x6e, - 0x69, 0x74, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, - 0x71, 0x52, 0x65, 0x71, 0x53, 0xed, 0x09, 0x00, - 0xf5, 0x02, 0x52, 0x65, 0x73, 0x00, 0x00, 0x00, - 0xff, 0x30, 0xc1, 0x30, 0x02, 0x21, 0x41, 0x63, - 0x00, 0x20, 0x70, 0x47, 0x00, 0xb5, 0x03, 0xa1, - 0xfb, 0xf7, 0xda, 0xf9, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x00, 0x00, 0x4c, 0x6d, 0x50, 0x61, - 0x69, 0x72, 0x53, 0x75, 0x62, 0x53, 0x74, 0x49, - 0x6e, 0x69, 0x74, 0x41, 0x75, 0x74, 0x68, 0x52, - 0x65, 0x71, 0x49, 0x6e, 0x64, 0x41, 0x6e, 0x73, - 0x77, 0x65, 0x72, 0x41, 0x75, 0x52, 0x61, 0x6e, - 0x64, 0x45, 0x72, 0x72, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb5, 0xfc, 0xf7, 0x9b, 0xfa, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x90, 0xb5, 0x87, 0xb0, - 0x07, 0x1c, 0x01, 0xa8, 0x0c, 0x1c, 0xf9, 0xf7, - 0x13, 0xf9, 0x02, 0x9a, 0x00, 0x92, 0xe0, 0x69, - 0xfa, 0x1d, 0x41, 0x1c, 0xff, 0x32, 0x6e, 0x32, - 0x03, 0xa8, 0x01, 0x9b, 0xfa, 0xf7, 0xb2, 0xfc, - 0x04, 0x21, 0x09, 0x23, 0x9b, 0x01, 0xf8, 0x18, - 0x00, 0x91, 0x03, 0xaa, 0x01, 0x92, 0x02, 0x6b, - 0x0c, 0x21, 0x01, 0x23, 0x38, 0x1c, 0x02, 0xf0, - 0x9a, 0xfc, 0x04, 0x1c, 0x03, 0xd1, 0x38, 0x1c, - 0x04, 0xa9, 0xfb, 0xf7, 0x57, 0xf9, 0xf8, 0x1d, - 0xff, 0x30, 0xba, 0x30, 0x40, 0x6b, 0x01, 0x28, - 0x07, 0xd1, 0x38, 0x1c, 0xfc, 0xf7, 0x02, 0xf9, - 0x00, 0x22, 0x49, 0x21, 0x38, 0x1c, 0xfd, 0xf7, - 0x55, 0xfe, 0x20, 0x1c, 0x07, 0xb0, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xfc, 0xf7, - 0x45, 0xfa, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, - 0x00, 0xb5, 0x42, 0x69, 0x0e, 0x2a, 0x01, 0xd1, - 0xfe, 0xf7, 0x5d, 0xff, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x90, 0xb5, 0x0c, 0x1c, 0x1f, 0x21, - 0x07, 0x1c, 0xfa, 0xf7, 0x51, 0xfd, 0x38, 0x1c, - 0x21, 0x1c, 0xff, 0xf7, 0xed, 0xff, 0x90, 0xbc, - 0xed, 0x09, 0x00, 0xf6, 0x02, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0xff, 0xf7, 0xe7, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x0c, 0x1c, 0x1f, - 0x21, 0x07, 0x1c, 0xfa, 0xf7, 0x3f, 0xfd, 0x38, - 0x1c, 0x21, 0x1c, 0xff, 0xf7, 0xf1, 0xff, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x07, - 0x1c, 0x15, 0x48, 0x81, 0x6a, 0xf8, 0x1d, 0xb9, - 0x30, 0x00, 0x29, 0x05, 0xd0, 0x82, 0x6b, 0x00, - 0x2a, 0x02, 0xd0, 0xc2, 0x6b, 0xd2, 0x08, 0x16, - 0xd2, 0x00, 0x29, 0x00, 0xd0, 0x80, 0x6b, 0x38, - 0x1c, 0x02, 0xf0, 0x27, 0xfa, 0x02, 0x1c, 0x00, - 0x23, 0x31, 0x21, 0x38, 0x1c, 0x02, 0xf0, 0x39, - 0xfc, 0x00, 0x22, 0x37, 0x21, 0x38, 0x1c, 0xfd, - 0xf7, 0x03, 0xfe, 0x04, 0x1c, 0x07, 0xd1, 0x38, - 0x1c, 0xfc, 0xf7, 0x0e, 0xfa, 0x03, 0xe0, 0x38, - 0x1c, 0x00, 0xf0, 0x78, 0xfc, 0x04, 0x1c, 0x20, - 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0xf8, 0xad, 0x03, 0x20, 0x00, 0xb5, 0xff, - 0xf7, 0xcd, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x80, - 0xb5, 0x82, 0x69, 0x00, 0x27, 0x00, 0x2a, 0x03, - 0xd1, 0x0a, 0x1c, 0x02, 0x21, 0xfd, 0xf7, 0xe4, - 0xfd, 0x38, 0x1c, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x02, 0xa1, 0xfd, 0xf7, 0x35, - 0xf8, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x50, - 0x61, 0x69, 0x72, 0x53, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x00, 0x90, 0xb5, 0x0c, - 0x1c, 0x07, 0x1c, 0xfc, 0xf7, 0xfb, 0xfc, 0x38, - 0x1c, 0xfc, 0xf7, 0xbe, 0xf9, 0xf8, 0x1d, 0x79, - 0x30, 0x04, 0x63, 0x38, 0x1c, 0x21, 0x1c, 0xfb, - 0x1d, 0xa9, 0x33, 0x03, 0xa2, 0xfd, 0xf7, 0x28, - 0xf9, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x4c, 0x6d, 0xed, 0x09, 0x00, 0xf7, 0x02, - 0x50, 0x61, 0x69, 0x72, 0x53, 0x74, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x00, 0x00, 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, - 0xfc, 0xf7, 0x21, 0xfd, 0xf8, 0x1d, 0x79, 0x30, - 0x04, 0x63, 0x38, 0x1c, 0xfc, 0xf7, 0x9b, 0xf9, - 0x55, 0x21, 0x38, 0x1c, 0x22, 0x1c, 0xfd, 0xf7, - 0x62, 0xfd, 0x90, 0xbc, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x00, 0xb5, 0xfd, 0x23, 0x9b, 0x00, - 0xc9, 0x69, 0xc0, 0x18, 0x10, 0x22, 0x01, 0x31, - 0xd1, 0xf7, 0x6d, 0xf9, 0x08, 0xbc, 0x00, 0x20, - 0x18, 0x47, 0x90, 0xb5, 0x0c, 0x1c, 0x07, 0x1c, - 0xfc, 0xf7, 0x01, 0xfd, 0x9a, 0x21, 0x38, 0x1c, - 0x22, 0x1c, 0xfd, 0xf7, 0x48, 0xfd, 0x38, 0x1c, - 0x21, 0x1c, 0x02, 0xa2, 0xfd, 0xf7, 0xb7, 0xfa, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, - 0x50, 0x61, 0x69, 0x72, 0x53, 0x74, 0x42, 0x42, - 0x44, 0x65, 0x74, 0x61, 0x63, 0x68, 0x00, 0x00, - 0x00, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0xff, 0x30, - 0x89, 0x30, 0x17, 0x1c, 0xd1, 0xf7, 0x47, 0xf9, - 0xe1, 0x1d, 0xff, 0x31, 0x01, 0x20, 0x7a, 0x31, - 0x48, 0x60, 0x8f, 0x61, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xb0, 0xb5, 0x00, 0x25, 0x07, 0x1c, - 0xd1, 0xf7, 0xd2, 0xfc, 0x04, 0x1c, 0x2b, 0xd0, - 0x00, 0x22, 0x19, 0x21, 0x38, 0x1c, 0xfd, 0xf7, - 0x56, 0xfd, 0x05, 0x1c, 0x24, 0xd1, 0x00, 0x22, - 0x19, 0x21, 0x38, 0x1c, 0xfd, 0xf7, 0x13, 0xfd, - 0x05, 0x1c, 0x1d, 0xd1, 0xf9, 0x1d, 0xff, 0x31, - 0xba, 0x31, 0x01, 0x20, 0x48, 0x63, 0x38, 0x1c, - 0x02, 0xf0, 0x5e, 0xf9, 0x09, 0x23, 0x9b, 0x01, - 0xf9, 0x18, 0xfd, 0x23, 0x9b, 0x00, 0x08, 0x63, - 0xf9, 0x18, 0x10, 0x20, 0xf9, 0xf7, 0x15, 0xfd, - 0xce, 0x20, 0x20, 0x60, 0xf9, 0x1d, 0xed, 0x09, - 0x00, 0xf8, 0x02, 0x9d, 0x31, 0x88, 0xc9, 0xe0, - 0x1d, 0x05, 0x30, 0x88, 0xc0, 0x05, 0x20, 0x21, - 0x1c, 0xd1, 0xf7, 0x13, 0xfd, 0x28, 0x1c, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x00, - 0x22, 0x11, 0x21, 0x07, 0x1c, 0xfd, 0xf7, 0x25, - 0xfd, 0x00, 0x28, 0x04, 0xd1, 0x00, 0x22, 0x11, - 0x21, 0x38, 0x1c, 0xfd, 0xf7, 0xe2, 0xfc, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xb0, - 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0xe1, 0x1d, 0xff, - 0x31, 0x00, 0x20, 0x00, 0x27, 0xba, 0x31, 0x48, - 0x61, 0xd1, 0xf7, 0x84, 0xfc, 0x00, 0x28, 0x01, - 0xd1, 0x07, 0x27, 0x10, 0xe0, 0xbc, 0x21, 0x01, - 0x60, 0xe1, 0x6a, 0xe2, 0x1d, 0xc1, 0x60, 0x05, - 0x61, 0xb9, 0x32, 0x52, 0x68, 0x01, 0x21, 0x00, - 0x2a, 0x00, 0xd1, 0x00, 0x21, 0x41, 0x61, 0x01, - 0x1c, 0x05, 0x20, 0xd1, 0xf7, 0xde, 0xfc, 0x38, - 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0xb5, 0x42, 0x69, 0x0e, 0x2a, 0x03, 0xd0, 0x0f, - 0x2a, 0x01, 0xd0, 0x10, 0x2a, 0x09, 0xd1, 0x00, - 0x29, 0x05, 0xd0, 0xc2, 0x1d, 0xff, 0x32, 0xba, - 0x32, 0x52, 0x69, 0x00, 0x2a, 0x01, 0xd0, 0xff, - 0xf7, 0xca, 0xff, 0x08, 0xbc, 0x18, 0x47, 0xb0, - 0xb5, 0x0c, 0x1c, 0xc1, 0x1d, 0xb9, 0x31, 0x07, - 0x1c, 0x88, 0x68, 0x00, 0x25, 0x00, 0x2a, 0x48, - 0x60, 0x06, 0xd0, 0x29, 0x1c, 0x00, 0x28, 0x00, - 0xd0, 0x03, 0x21, 0x38, 0x1c, 0x00, 0xf0, 0xfd, - 0xfa, 0x38, 0x1c, 0x21, 0x1c, 0xff, 0xf7, 0xd7, - 0xff, 0x38, 0x1c, 0x02, 0xf0, 0xc2, 0xf8, 0x28, - 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, - 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0xc0, 0x30, 0x09, - 0x23, 0x9b, 0x01, 0x40, 0x68, 0xfd, 0x18, 0x00, - 0x28, 0x0b, 0xd1, 0x36, 0x24, 0x02, 0x21, 0x38, - 0x1c, 0xed, 0x09, 0x00, 0xf9, 0x02, 0x00, 0xf0, - 0xe3, 0xfa, 0x00, 0x23, 0x12, 0x21, 0x38, 0x1c, - 0xaa, 0x6b, 0x02, 0xf0, 0xe2, 0xfa, 0x12, 0xe0, - 0x2d, 0x24, 0x05, 0x23, 0xdb, 0x01, 0xf9, 0x18, - 0x10, 0x48, 0x15, 0x23, 0x5b, 0x01, 0x40, 0x6a, - 0xfa, 0x18, 0x08, 0x62, 0x01, 0x21, 0x00, 0x91, - 0x10, 0x21, 0x01, 0x92, 0x01, 0x23, 0x38, 0x1c, - 0xaa, 0x6b, 0x02, 0xf0, 0xce, 0xfa, 0xf9, 0x1d, - 0xff, 0x31, 0x3a, 0x31, 0x38, 0x1c, 0x08, 0x4a, - 0xfc, 0xf7, 0xea, 0xf8, 0xf9, 0x1d, 0x21, 0x31, - 0x00, 0x23, 0x38, 0x1c, 0x22, 0x1c, 0xfd, 0xf7, - 0x19, 0xfc, 0x02, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, - 0x00, 0x20, 0x18, 0x47, 0x38, 0xae, 0x03, 0x20, - 0xa3, 0xb3, 0x02, 0x20, 0x90, 0xb5, 0x07, 0x1c, - 0xff, 0x30, 0xff, 0x30, 0x42, 0x30, 0x81, 0x6b, - 0x38, 0x1c, 0x0f, 0x22, 0x11, 0xa3, 0x02, 0xf0, - 0x21, 0xfb, 0x04, 0x1c, 0x38, 0x69, 0x02, 0x28, - 0x11, 0xd1, 0xf8, 0x1d, 0xb9, 0x30, 0x40, 0x68, - 0x00, 0x28, 0x02, 0xd1, 0x2d, 0x20, 0xb8, 0x62, - 0x01, 0xe0, 0x29, 0x20, 0xb8, 0x62, 0xf9, 0x1d, - 0xff, 0x31, 0x3a, 0x31, 0x38, 0x1c, 0x0e, 0x4a, - 0xfc, 0xf7, 0xba, 0xf8, 0x06, 0xe0, 0x01, 0x28, - 0x04, 0xd1, 0x27, 0x20, 0xb8, 0x62, 0x38, 0x1c, - 0xff, 0xf7, 0x98, 0xff, 0x20, 0x1c, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x43, 0x72, - 0x79, 0x70, 0x74, 0x41, 0x6e, 0x73, 0x77, 0x65, - 0x72, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x00, - 0xa3, 0xb3, 0x02, 0x20, 0x90, 0xb5, 0x00, 0x22, - 0x07, 0x1c, 0xff, 0xf7, 0x63, 0xff, 0x04, 0x1c, - 0x00, 0x21, 0x38, 0x1c, 0xfb, 0xf7, 0xbc, 0xfc, - 0x20, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x80, 0xb5, 0x82, 0xb0, 0xed, 0x09, 0x00, 0xfa, - 0x02, 0x07, 0x1c, 0x02, 0xf0, 0x50, 0xf8, 0x09, - 0x23, 0x9b, 0x01, 0xf9, 0x18, 0x88, 0x63, 0xfa, - 0x1d, 0xbd, 0x32, 0x01, 0x21, 0x00, 0x91, 0x01, - 0x92, 0x02, 0x1c, 0x0f, 0x21, 0x01, 0x23, 0x38, - 0x1c, 0x02, 0xf0, 0x59, 0xfa, 0xf9, 0x1d, 0xff, - 0x31, 0x3a, 0x31, 0x38, 0x1c, 0x03, 0x4a, 0xfc, - 0xf7, 0x75, 0xf8, 0x02, 0xb0, 0x80, 0xbc, 0x08, - 0xbc, 0x00, 0x20, 0x18, 0x47, 0xa3, 0xb3, 0x02, - 0x20, 0x00, 0xb5, 0x42, 0x6a, 0x00, 0x2a, 0x03, - 0xd0, 0x01, 0x21, 0xc0, 0x30, 0x81, 0x62, 0x01, - 0xe0, 0xff, 0xf7, 0xd4, 0xff, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x80, 0xb5, 0xc2, 0x1d, 0xb9, - 0x32, 0x53, 0x68, 0x51, 0x60, 0x93, 0x60, 0x00, - 0x27, 0x05, 0x23, 0xdb, 0x01, 0xc2, 0x18, 0x93, - 0x6a, 0x01, 0x33, 0x93, 0x62, 0xc2, 0x1d, 0xff, - 0x32, 0x3a, 0x32, 0x52, 0x68, 0x00, 0x2a, 0x02, - 0xd0, 0x25, 0x21, 0x81, 0x62, 0x01, 0xe0, 0xff, - 0xf7, 0xdb, 0xff, 0x38, 0x1c, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x90, 0xb5, 0x07, 0x1c, 0xff, - 0x30, 0xff, 0x30, 0x42, 0x30, 0x81, 0x63, 0xf8, - 0x1d, 0xff, 0x30, 0x3a, 0x30, 0x40, 0x68, 0x00, - 0x24, 0x00, 0x28, 0x02, 0xd0, 0x26, 0x20, 0xb8, - 0x62, 0x02, 0xe0, 0x38, 0x1c, 0xff, 0xf7, 0x58, - 0xff, 0x05, 0x23, 0xdb, 0x01, 0xf8, 0x18, 0x81, - 0x6a, 0x01, 0x31, 0x81, 0x62, 0x20, 0x1c, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0x30, 0xff, - 0x30, 0x42, 0x30, 0x81, 0x63, 0x00, 0x20, 0x70, - 0x47, 0x00, 0xb5, 0xff, 0xf7, 0x45, 0xff, 0x08, - 0xbc, 0x18, 0x47, 0x88, 0xb5, 0x07, 0x1c, 0x00, - 0x69, 0x02, 0x28, 0x15, 0xd1, 0x09, 0x23, 0x9b, - 0x01, 0xf8, 0x18, 0x81, 0x63, 0x38, 0x1c, 0x0f, - 0x22, 0x0b, 0xa3, 0x02, 0xf0, 0x61, 0xfa, 0xed, - 0x09, 0x00, 0xfb, 0x02, 0xf9, 0x1d, 0xb9, 0x31, - 0x49, 0x68, 0x00, 0x29, 0x04, 0xd1, 0x2d, 0x21, - 0xb9, 0x62, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x29, 0x21, 0xb9, 0x62, 0xf9, 0xe7, 0x03, 0xa2, - 0x00, 0x92, 0x0f, 0x22, 0x23, 0x23, 0x38, 0x1c, - 0x02, 0xf0, 0x5c, 0xfa, 0xf1, 0xe7, 0x4c, 0x6d, - 0x43, 0x72, 0x79, 0x70, 0x74, 0x53, 0x75, 0x62, - 0x53, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x49, 0x6e, 0x64, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, - 0x64, 0x65, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb5, - 0x00, 0x27, 0x09, 0x23, 0x9b, 0x01, 0xc1, 0x18, - 0x89, 0x6b, 0x00, 0xf0, 0xd6, 0xf9, 0x38, 0x1c, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0xc1, 0x1d, 0xff, 0x31, 0x3a, 0x31, 0x00, 0x24, - 0x07, 0x1c, 0xfb, 0xf7, 0xba, 0xff, 0x09, 0x23, - 0x9b, 0x01, 0xf8, 0x18, 0x81, 0x6b, 0x38, 0x1c, - 0x00, 0xf0, 0xc3, 0xf9, 0x20, 0x1c, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xc1, 0x1d, - 0xff, 0x31, 0x00, 0x27, 0x3a, 0x31, 0x03, 0x4a, - 0xfb, 0xf7, 0xbf, 0xff, 0x38, 0x1c, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xa3, 0xb3, - 0x02, 0x20, 0x80, 0xb5, 0xc1, 0x1d, 0xff, 0x31, - 0x00, 0x27, 0x3a, 0x31, 0x03, 0x4a, 0xfb, 0xf7, - 0xb0, 0xff, 0x38, 0x1c, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xa3, 0xb3, 0x02, 0x20, 0x80, 0xb5, - 0x07, 0x1c, 0x00, 0x29, 0x0f, 0xd1, 0xf8, 0x1d, - 0xb9, 0x30, 0x41, 0x68, 0x81, 0x60, 0x03, 0x21, - 0x38, 0x1c, 0x00, 0xf0, 0x76, 0xf9, 0x00, 0x21, - 0x38, 0x1c, 0xff, 0xf7, 0x50, 0xfe, 0x38, 0x1c, - 0x01, 0xf0, 0x3b, 0xff, 0x03, 0xe0, 0x01, 0x22, - 0x38, 0x1c, 0xff, 0xf7, 0x5c, 0xfe, 0x00, 0x21, - 0x38, 0x1c, 0xed, 0x09, 0x00, 0xfc, 0x02, 0xfb, - 0xf7, 0xb6, 0xfb, 0x80, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x80, 0xb5, 0x00, 0x21, 0x07, - 0x1c, 0xff, 0xf7, 0x3b, 0xfe, 0x38, 0x1c, 0x01, - 0xf0, 0x26, 0xff, 0x00, 0x21, 0x38, 0x1c, 0xfb, - 0xf7, 0xa6, 0xfb, 0x80, 0xbc, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x90, 0xb5, 0x01, 0x22, 0x22, - 0x21, 0x04, 0x1c, 0xff, 0xf7, 0x3e, 0xfe, 0x07, - 0x1c, 0x00, 0x21, 0x20, 0x1c, 0xfb, 0xf7, 0x97, - 0xfb, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x90, 0xb5, 0x01, 0x22, 0x22, 0x21, 0x04, - 0x1c, 0xff, 0xf7, 0x2f, 0xfe, 0x07, 0x1c, 0x00, - 0x21, 0x20, 0x1c, 0xfb, 0xf7, 0x88, 0xfb, 0x38, - 0x1c, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, - 0xb5, 0x07, 0x1c, 0xc0, 0x30, 0x0c, 0x1c, 0x41, - 0x68, 0x81, 0x60, 0x00, 0x21, 0x38, 0x1c, 0x00, - 0xf0, 0x2a, 0xf9, 0x38, 0x1c, 0x21, 0x1c, 0xff, - 0xf7, 0x04, 0xfe, 0x38, 0x1c, 0x01, 0xf0, 0xef, - 0xfe, 0x00, 0x21, 0x38, 0x1c, 0xfb, 0xf7, 0x6f, - 0xfb, 0x90, 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0x80, 0xb5, 0x00, 0x21, 0x07, 0x1c, 0xff, - 0xf7, 0xf4, 0xfd, 0x38, 0x1c, 0x01, 0xf0, 0xdf, - 0xfe, 0x00, 0x21, 0x38, 0x1c, 0xfb, 0xf7, 0x5f, - 0xfb, 0x80, 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, - 0x47, 0x00, 0xb5, 0xc2, 0x1d, 0xff, 0x32, 0xba, - 0x32, 0x52, 0x69, 0x00, 0x2a, 0x03, 0xd0, 0xff, - 0xf7, 0xbc, 0xfd, 0x08, 0xbc, 0x18, 0x47, 0xfb, - 0xf7, 0x4e, 0xfb, 0x00, 0x20, 0xf9, 0xe7, 0x00, - 0xb5, 0xff, 0xf7, 0xee, 0xff, 0x08, 0xbc, 0x18, - 0x47, 0x90, 0xb5, 0x07, 0x1c, 0xc0, 0x30, 0x81, - 0x68, 0x41, 0x60, 0x38, 0x1c, 0x01, 0xf0, 0xdc, - 0xfe, 0x02, 0x1c, 0x00, 0x23, 0x31, 0x21, 0x38, - 0x1c, 0x02, 0xf0, 0xee, 0xf8, 0xed, 0x09, 0x00, - 0xfd, 0x02, 0x00, 0x22, 0x37, 0x21, 0x38, 0x1c, - 0xfd, 0xf7, 0xb8, 0xfa, 0x04, 0x1c, 0x02, 0xd1, - 0x38, 0x1c, 0xfb, 0xf7, 0xc3, 0xfe, 0x20, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x07, 0x1c, 0xc0, 0x30, 0x81, 0x68, 0x41, 0x60, - 0x38, 0x1c, 0x01, 0xf0, 0xc0, 0xfe, 0x02, 0x1c, - 0x00, 0x23, 0x31, 0x21, 0x38, 0x1c, 0x02, 0xf0, - 0xd2, 0xf8, 0x00, 0x22, 0x37, 0x21, 0x38, 0x1c, - 0xfd, 0xf7, 0x9c, 0xfa, 0x04, 0x1c, 0x02, 0xd1, - 0x38, 0x1c, 0xfb, 0xf7, 0xa7, 0xfe, 0x20, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x07, 0x1c, 0xc0, 0x30, 0x81, 0x68, 0x41, 0x60, - 0x38, 0x1c, 0x01, 0xf0, 0xa4, 0xfe, 0x02, 0x1c, - 0x00, 0x23, 0x31, 0x21, 0x38, 0x1c, 0x02, 0xf0, - 0xb6, 0xf8, 0x00, 0x22, 0x37, 0x21, 0x38, 0x1c, - 0xfd, 0xf7, 0x80, 0xfa, 0x04, 0x1c, 0x02, 0xd1, - 0x38, 0x1c, 0xfb, 0xf7, 0x8b, 0xfe, 0x20, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x07, 0x1c, 0x01, 0xf0, 0x8c, 0xfe, 0x02, 0x1c, - 0x00, 0x23, 0x31, 0x21, 0x38, 0x1c, 0x02, 0xf0, - 0x9e, 0xf8, 0x00, 0x22, 0x37, 0x21, 0x38, 0x1c, - 0xfd, 0xf7, 0x68, 0xfa, 0x04, 0x1c, 0x02, 0xd1, - 0x38, 0x1c, 0xfb, 0xf7, 0x73, 0xfe, 0x20, 0x1c, - 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, - 0xff, 0xf7, 0xe5, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0xff, 0xf7, 0xe0, 0xff, 0x08, 0xbc, - 0x18, 0x47, 0x80, 0xb5, 0x07, 0x1c, 0x01, 0xf0, - 0x6a, 0xfe, 0x02, 0x1c, 0x00, 0x23, 0x31, 0x21, - 0x38, 0x1c, 0x02, 0xf0, 0x7c, 0xf8, 0x00, 0x22, - 0x37, 0x21, 0x38, 0x1c, 0xfd, 0xf7, 0x46, 0xfa, - 0x38, 0x1c, 0xfb, 0xf7, 0x53, 0xfe, 0x80, 0xbc, - 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x90, 0xb5, - 0xed, 0x09, 0x00, 0xfe, 0x02, 0x0c, 0x1c, 0x07, - 0x1c, 0xfc, 0xf7, 0x6c, 0xf9, 0x38, 0x1c, 0xfb, - 0xf7, 0x2f, 0xfe, 0xf8, 0x1d, 0x79, 0x30, 0x04, - 0x63, 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0x1d, 0xa9, - 0x33, 0x02, 0xa2, 0xfc, 0xf7, 0x99, 0xfd, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x43, - 0x72, 0x79, 0x70, 0x74, 0x53, 0x74, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x00, 0x00, 0xb5, 0xc2, 0x1d, 0x79, 0x32, 0x11, - 0x63, 0xfb, 0xf7, 0x12, 0xfe, 0x08, 0xbc, 0x00, - 0x20, 0x18, 0x47, 0x00, 0xb5, 0x02, 0xa2, 0xfc, - 0xf7, 0x4b, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x4c, 0x6d, 0x43, 0x72, 0x79, 0x70, 0x74, - 0x53, 0x74, 0x42, 0x42, 0x44, 0x65, 0x74, 0x61, - 0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x02, - 0xa1, 0xfc, 0xf7, 0x5b, 0xfc, 0x08, 0xbc, 0x18, - 0x47, 0x4c, 0x6d, 0x43, 0x72, 0x79, 0x70, 0x74, - 0x53, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb5, 0x43, - 0x23, 0x1b, 0x01, 0xc5, 0x18, 0x0b, 0x4b, 0xc2, - 0x1d, 0xc1, 0x18, 0x07, 0x1c, 0xff, 0x30, 0xff, - 0x30, 0xff, 0x32, 0x6e, 0x32, 0x92, 0x30, 0x2b, - 0x1c, 0x04, 0x1c, 0xfa, 0xf7, 0x4e, 0xf8, 0x05, - 0x23, 0xdb, 0x01, 0xf8, 0x18, 0x01, 0x6a, 0x20, - 0x1c, 0xfa, 0xf7, 0xd0, 0xfa, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x14, 0x04, 0x00, - 0x00, 0xb0, 0xb5, 0x00, 0x27, 0x04, 0x1c, 0x0d, - 0x1c, 0xd1, 0xf7, 0x43, 0xf9, 0x00, 0x28, 0x01, - 0xd1, 0x07, 0x27, 0x11, 0xe0, 0x5c, 0x21, 0x01, - 0x60, 0x21, 0x6b, 0xff, 0x34, 0xc1, 0x60, 0xff, - 0x34, 0x92, 0x34, 0x0c, 0xcc, 0xc1, 0x1d, 0x09, - 0x31, 0x0c, 0xc1, 0xed, 0x09, 0x00, 0xff, 0x02, - 0x0c, 0xcc, 0x0c, 0xc1, 0x05, 0x62, 0x01, 0x1c, - 0x07, 0x20, 0xd1, 0xf7, 0x9c, 0xf9, 0x38, 0x1c, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, - 0x82, 0xb0, 0x15, 0x4b, 0x0c, 0x1c, 0xc1, 0x18, - 0x07, 0x1c, 0x10, 0x20, 0x0d, 0x1c, 0xf9, 0xf7, - 0x84, 0xf9, 0x38, 0x1c, 0xff, 0xf7, 0xb5, 0xff, - 0x01, 0x21, 0x38, 0x1c, 0xff, 0xf7, 0xcf, 0xff, - 0x10, 0x21, 0x00, 0x91, 0x11, 0x21, 0x01, 0x23, - 0x38, 0x1c, 0x22, 0x1c, 0x01, 0x95, 0x01, 0xf0, - 0xcb, 0xff, 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x31, - 0x04, 0x1c, 0x38, 0x1c, 0x08, 0x4a, 0xfb, 0xf7, - 0xe6, 0xfd, 0x00, 0x23, 0x35, 0x22, 0x38, 0x1c, - 0xf9, 0x1d, 0x21, 0x31, 0xfd, 0xf7, 0x15, 0xf9, - 0x20, 0x1c, 0x02, 0xb0, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x14, 0x04, 0x00, 0x00, 0xa3, 0xb3, - 0x02, 0x20, 0xf3, 0xb5, 0x2c, 0x25, 0x29, 0x1c, - 0x00, 0x24, 0x07, 0x1c, 0xfd, 0xf7, 0x58, 0xf9, - 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x24, 0x15, 0xe0, - 0xf9, 0x1d, 0x21, 0x31, 0x38, 0x1c, 0x2a, 0x1c, - 0x0e, 0x1c, 0xfd, 0xf7, 0xda, 0xf8, 0x00, 0x28, - 0x01, 0xd1, 0x0c, 0x24, 0x0a, 0xe0, 0x00, 0x22, - 0x38, 0x1c, 0x29, 0x1c, 0xfd, 0xf7, 0x67, 0xf9, - 0x38, 0x1c, 0x31, 0x1c, 0x2a, 0x1c, 0x01, 0x9b, - 0xfd, 0xf7, 0xeb, 0xf8, 0x20, 0x1c, 0x02, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, - 0x00, 0x27, 0x00, 0x29, 0x0c, 0xd1, 0xc1, 0x1d, - 0xb9, 0x31, 0x8a, 0x6a, 0x00, 0x2a, 0x0f, 0xd0, - 0x8f, 0x62, 0xc1, 0x1d, 0x00, 0x23, 0x2b, 0x22, - 0x21, 0x31, 0xfd, 0xf7, 0xd6, 0xf8, 0x07, 0xe0, - 0xc2, 0x1d, 0xff, 0x32, 0xba, 0x32, 0x52, 0x69, - 0x00, 0x2a, 0x01, 0xd0, 0xff, 0xf7, 0x29, 0xfc, - 0x38, 0x1c, 0x80, 0xbc, 0x08, 0xbc, 0xed, 0x09, - 0x00, 0x00, 0x03, 0x18, 0x47, 0x80, 0xb4, 0x02, - 0x1c, 0xc0, 0x32, 0x53, 0x68, 0x00, 0x20, 0x00, - 0x29, 0x93, 0x60, 0x0e, 0xd0, 0x15, 0x4b, 0x01, - 0x29, 0x0e, 0xd0, 0x02, 0x29, 0x22, 0xd1, 0x9b, - 0x6a, 0x00, 0x2b, 0x19, 0xd0, 0x01, 0x2b, 0x19, - 0xd0, 0x02, 0x2b, 0x19, 0xd1, 0x51, 0x60, 0x80, - 0xbc, 0x70, 0x47, 0x00, 0x21, 0x51, 0x60, 0xfa, - 0xe7, 0x9b, 0x6a, 0x01, 0x21, 0x00, 0x2b, 0x05, - 0xd0, 0x01, 0x2b, 0x05, 0xd0, 0x02, 0x2b, 0x05, - 0xd1, 0x51, 0x60, 0xf0, 0xe7, 0x51, 0x60, 0xee, - 0xe7, 0x51, 0x60, 0xec, 0xe7, 0x1f, 0x20, 0xea, - 0xe7, 0x51, 0x60, 0xe8, 0xe7, 0x51, 0x60, 0xe6, - 0xe7, 0x1f, 0x20, 0xe4, 0xe7, 0x1e, 0x20, 0xe2, - 0xe7, 0x00, 0x00, 0xf8, 0xad, 0x03, 0x20, 0x90, - 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0x00, 0x29, 0x50, - 0xd1, 0x4f, 0x21, 0x38, 0x1c, 0xfd, 0xf7, 0xde, - 0xf8, 0x00, 0x28, 0x24, 0xd0, 0x38, 0x1c, 0xfd, - 0xf7, 0x2a, 0xf8, 0x04, 0x1c, 0x00, 0x20, 0xb8, - 0x61, 0x38, 0x1c, 0xfb, 0xf7, 0xee, 0xfc, 0x20, - 0x1c, 0x0b, 0x2c, 0x26, 0xd0, 0x18, 0x28, 0x1f, - 0xd0, 0x28, 0x28, 0x18, 0xd0, 0x37, 0x28, 0x12, - 0xd1, 0x38, 0x1c, 0x01, 0xf0, 0x03, 0xfd, 0x02, - 0x1c, 0x00, 0x23, 0x31, 0x21, 0x38, 0x1c, 0x01, - 0xf0, 0x15, 0xff, 0x00, 0x22, 0x38, 0x1c, 0x21, - 0x1c, 0xfd, 0xf7, 0xdf, 0xf8, 0x00, 0x28, 0x02, - 0xd1, 0x38, 0x1c, 0xfb, 0xf7, 0xea, 0xfc, 0x02, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, - 0x21, 0x38, 0x1c, 0xfb, 0xf7, 0x10, 0xf9, 0xf6, - 0xe7, 0x00, 0x21, 0x38, 0x1c, 0xfb, 0xf7, 0x0b, - 0xf9, 0xf1, 0xe7, 0x38, 0x1c, 0x01, 0xf0, 0xe2, - 0xfc, 0x0d, 0x4a, 0x08, 0x21, 0x00, 0x91, 0x01, - 0x92, 0x02, 0x1c, 0x27, 0x21, 0x01, 0x23, 0x38, - 0x1c, 0xed, 0x09, 0x00, 0x01, 0x03, 0x01, 0xf0, - 0xf0, 0xfe, 0x00, 0x22, 0x38, 0x1c, 0x21, 0x1c, - 0xfd, 0xf7, 0xba, 0xf8, 0x00, 0x28, 0xdd, 0xd1, - 0x38, 0x1c, 0xfb, 0xf7, 0xc5, 0xfc, 0xd9, 0xe7, - 0x0a, 0x1c, 0x02, 0x21, 0x38, 0x1c, 0xfd, 0xf7, - 0xaf, 0xf8, 0xd3, 0xe7, 0x7c, 0xae, 0x03, 0x20, - 0xb0, 0xb5, 0x07, 0x1c, 0x0c, 0x1c, 0x01, 0xd1, - 0x57, 0x25, 0x0f, 0xe0, 0x09, 0x23, 0x9b, 0x01, - 0xf8, 0x18, 0x00, 0x6b, 0x90, 0x42, 0x08, 0xd1, - 0x23, 0x2c, 0x04, 0xd1, 0x38, 0x69, 0x02, 0x28, - 0x01, 0xd1, 0x59, 0x25, 0x02, 0xe0, 0x58, 0x25, - 0x00, 0xe0, 0x59, 0x25, 0x38, 0x1c, 0x29, 0x1c, - 0xfd, 0xf7, 0x6f, 0xf8, 0x00, 0x28, 0x14, 0xd0, - 0x38, 0x1c, 0x29, 0x1c, 0xfd, 0xf7, 0x30, 0xf8, - 0x00, 0x28, 0x0e, 0xd0, 0x59, 0x2d, 0x02, 0xd0, - 0x38, 0x1c, 0xfb, 0xf7, 0x7d, 0xfc, 0x38, 0x1c, - 0x29, 0x1c, 0x22, 0x1c, 0xfd, 0xf7, 0x80, 0xf8, - 0x38, 0x1c, 0x29, 0x1c, 0x22, 0x1c, 0xfd, 0xf7, - 0x3f, 0xf8, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xb0, 0xb5, 0x64, 0x25, 0x0c, 0x1c, 0x29, 0x1c, - 0x07, 0x1c, 0xfd, 0xf7, 0x4e, 0xf8, 0x00, 0x28, - 0x16, 0xd0, 0x38, 0x1c, 0x29, 0x1c, 0xfd, 0xf7, - 0x0f, 0xf8, 0x00, 0x28, 0x10, 0xd0, 0x00, 0x2c, - 0x0e, 0xd0, 0x06, 0x2c, 0x1a, 0xd0, 0x23, 0x2c, - 0x32, 0xd1, 0x38, 0x1c, 0xfb, 0xf7, 0x58, 0xfc, - 0x38, 0x69, 0x02, 0x28, 0x07, 0xd1, 0x66, 0x21, - 0x38, 0x1c, 0x22, 0x1c, 0xfd, 0xf7, 0x1c, 0xf8, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x24, 0x22, - 0x65, 0x21, 0x38, 0x1c, 0xfd, 0xf7, 0x14, 0xf8, - 0x24, 0x22, 0x65, 0x21, 0x38, 0x1c, 0xfd, 0xf7, - 0x4b, 0xf8, 0xf1, 0xe7, 0x38, 0x1c, 0xfb, 0xf7, - 0x3f, 0xfc, 0x65, 0x21, 0x38, 0x1c, 0x22, 0x1c, - 0xfd, 0xf7, 0x06, 0xf8, 0xed, 0x09, 0x00, 0x02, - 0x03, 0x78, 0x69, 0x0b, 0x28, 0x08, 0xd1, 0xb8, - 0x69, 0x00, 0x28, 0x05, 0xd1, 0x0a, 0x20, 0x78, - 0x61, 0x38, 0x1c, 0xff, 0xf7, 0xd5, 0xfa, 0xdd, - 0xe7, 0x65, 0x21, 0x38, 0x1c, 0x22, 0x1c, 0xfd, - 0xf7, 0x31, 0xf8, 0xd7, 0xe7, 0x38, 0x1c, 0xfb, - 0xf7, 0x25, 0xfc, 0x65, 0x21, 0x38, 0x1c, 0x22, - 0x1c, 0xfc, 0xf7, 0xec, 0xff, 0x65, 0x21, 0x38, - 0x1c, 0x22, 0x1c, 0xfd, 0xf7, 0x23, 0xf8, 0xc9, - 0xe7, 0xf0, 0xb5, 0x6d, 0x26, 0x0c, 0x1c, 0x31, - 0x1c, 0x07, 0x1c, 0xfc, 0xf7, 0xf8, 0xff, 0x00, - 0x28, 0x23, 0xd0, 0xf9, 0x1d, 0x21, 0x31, 0x38, - 0x1c, 0x32, 0x1c, 0x0d, 0x1c, 0xfc, 0xf7, 0x7c, - 0xff, 0x00, 0x28, 0x1a, 0xd0, 0xf9, 0x1d, 0xff, - 0x31, 0x3a, 0x31, 0x38, 0x1c, 0x0e, 0x1c, 0xfb, - 0xf7, 0x45, 0xfc, 0x05, 0x23, 0xdb, 0x01, 0xf9, - 0x18, 0xf8, 0x1d, 0xb9, 0x30, 0x10, 0x23, 0x00, - 0x2c, 0x31, 0x4a, 0x0d, 0xd0, 0x23, 0x2c, 0x2c, - 0xd0, 0x2a, 0x2c, 0x01, 0xd0, 0x32, 0x2c, 0x4f, - 0xd1, 0x79, 0x6a, 0x00, 0x29, 0x40, 0xd0, 0x01, - 0x21, 0x81, 0x62, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x3c, 0x69, 0x01, 0x2c, 0x03, 0xd1, 0x38, - 0x1c, 0xff, 0xf7, 0x26, 0xfb, 0xf5, 0xe7, 0x40, - 0x68, 0x00, 0x28, 0x0a, 0xd1, 0x38, 0x1c, 0x31, - 0x1c, 0xfb, 0xf7, 0x38, 0xfc, 0x00, 0x23, 0x6f, - 0x22, 0x38, 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0x68, - 0xff, 0xe7, 0xe7, 0x0b, 0x62, 0x38, 0x1c, 0x31, - 0x1c, 0xfb, 0xf7, 0x2c, 0xfc, 0x00, 0x23, 0x6e, - 0x22, 0x38, 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0x5c, - 0xff, 0xdb, 0xe7, 0x38, 0x69, 0x02, 0x28, 0x0b, - 0xd1, 0x0b, 0x62, 0x38, 0x1c, 0x31, 0x1c, 0xfb, - 0xf7, 0x1d, 0xfc, 0x00, 0x23, 0x71, 0x22, 0x38, - 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0x4d, 0xff, 0xed, - 0x09, 0x00, 0x03, 0x03, 0xcc, 0xe7, 0x70, 0x21, - 0x38, 0x1c, 0x22, 0x1c, 0xfc, 0xf7, 0xbd, 0xff, - 0x70, 0x22, 0x38, 0x1c, 0x29, 0x1c, 0x23, 0x1c, - 0xfc, 0xf7, 0x41, 0xff, 0xc0, 0xe7, 0x70, 0x21, - 0x38, 0x1c, 0x22, 0x1c, 0xfc, 0xf7, 0xb1, 0xff, - 0x70, 0x22, 0x38, 0x1c, 0x29, 0x1c, 0x23, 0x1c, - 0xfc, 0xf7, 0x35, 0xff, 0xb4, 0xe7, 0x70, 0x22, - 0x38, 0x1c, 0x29, 0x1c, 0x23, 0x1c, 0xfc, 0xf7, - 0x2e, 0xff, 0x70, 0x21, 0x38, 0x1c, 0x22, 0x1c, - 0xfc, 0xf7, 0x9f, 0xff, 0xa8, 0xe7, 0xa3, 0xb3, - 0x02, 0x20, 0xf0, 0xb5, 0x07, 0x1c, 0x0c, 0x1c, - 0x01, 0xd1, 0x72, 0x25, 0x00, 0xe0, 0x73, 0x25, - 0x38, 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0x6e, 0xff, - 0x00, 0x28, 0x19, 0xd0, 0xf9, 0x1d, 0x21, 0x31, - 0x38, 0x1c, 0x2a, 0x1c, 0x0e, 0x1c, 0xfc, 0xf7, - 0xf2, 0xfe, 0x00, 0x28, 0x10, 0xd0, 0xf9, 0x1d, - 0xff, 0x31, 0x38, 0x1c, 0x3a, 0x31, 0xfb, 0xf7, - 0xbc, 0xfb, 0x38, 0x1c, 0x31, 0x1c, 0x2a, 0x1c, - 0x23, 0x1c, 0xfc, 0xf7, 0x04, 0xff, 0x38, 0x1c, - 0x29, 0x1c, 0x22, 0x1c, 0xfc, 0xf7, 0x75, 0xff, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, - 0x07, 0x1c, 0x0c, 0x1c, 0x01, 0xd1, 0x75, 0x25, - 0x00, 0xe0, 0x76, 0x25, 0x38, 0x1c, 0x29, 0x1c, - 0xfc, 0xf7, 0x44, 0xff, 0x00, 0x28, 0x19, 0xd0, - 0xf9, 0x1d, 0x21, 0x31, 0x38, 0x1c, 0x2a, 0x1c, - 0x0e, 0x1c, 0xfc, 0xf7, 0xc8, 0xfe, 0x00, 0x28, - 0x10, 0xd0, 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, - 0x3a, 0x31, 0xfb, 0xf7, 0x92, 0xfb, 0x38, 0x1c, - 0x31, 0x1c, 0x2a, 0x1c, 0x23, 0x1c, 0xfc, 0xf7, - 0xda, 0xfe, 0x38, 0x1c, 0x29, 0x1c, 0x22, 0x1c, - 0xfc, 0xf7, 0x4b, 0xff, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf0, 0xb5, 0x07, 0x1c, 0x0c, 0x1c, - 0x01, 0xd1, 0xed, 0x09, 0x00, 0x04, 0x03, 0x78, - 0x25, 0x00, 0xe0, 0x79, 0x25, 0x38, 0x1c, 0x29, - 0x1c, 0xfc, 0xf7, 0x1a, 0xff, 0x00, 0x28, 0x19, - 0xd0, 0xf9, 0x1d, 0x21, 0x31, 0x38, 0x1c, 0x2a, - 0x1c, 0x0e, 0x1c, 0xfc, 0xf7, 0x9e, 0xfe, 0x00, - 0x28, 0x10, 0xd0, 0xf9, 0x1d, 0xff, 0x31, 0x38, - 0x1c, 0x3a, 0x31, 0xfb, 0xf7, 0x68, 0xfb, 0x38, - 0x1c, 0x31, 0x1c, 0x2a, 0x1c, 0x23, 0x1c, 0xfc, - 0xf7, 0xb0, 0xfe, 0x38, 0x1c, 0x29, 0x1c, 0x22, - 0x1c, 0xfc, 0xf7, 0x21, 0xff, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x83, 0xb0, 0x0c, - 0x1c, 0x7f, 0x21, 0x07, 0x1c, 0xfc, 0xf7, 0xf4, - 0xfe, 0x00, 0x28, 0x26, 0xd0, 0xf8, 0x1d, 0xff, - 0x30, 0xba, 0x30, 0x80, 0x6a, 0x00, 0x28, 0x20, - 0xd0, 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x16, - 0x31, 0xfb, 0xf7, 0x45, 0xfb, 0x0b, 0x23, 0x9b, - 0x01, 0xfd, 0x18, 0x00, 0x2c, 0x05, 0xd1, 0x29, - 0x6a, 0x01, 0x22, 0x38, 0x1c, 0xe9, 0x61, 0xfd, - 0xf7, 0xf7, 0xfb, 0x10, 0x35, 0x07, 0xcd, 0x1c, - 0x3d, 0x05, 0x23, 0xdb, 0x01, 0x01, 0x91, 0x00, - 0x90, 0x02, 0x92, 0xed, 0x68, 0xf8, 0x18, 0xc2, - 0x68, 0x38, 0x1c, 0x21, 0x1c, 0x2b, 0x1c, 0xfb, - 0xf7, 0xd6, 0xfd, 0x03, 0xb0, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x83, 0xb0, 0x0c, - 0x1c, 0x80, 0x21, 0x07, 0x1c, 0xfc, 0xf7, 0xc0, - 0xfe, 0x00, 0x28, 0x53, 0xd0, 0xf8, 0x1d, 0xff, - 0x30, 0xba, 0x30, 0x40, 0x6a, 0x00, 0x28, 0x4d, - 0xd0, 0x05, 0x23, 0xdb, 0x01, 0xfe, 0x18, 0x70, - 0x6b, 0x01, 0xf0, 0x9b, 0xfc, 0x02, 0x90, 0xf9, - 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x12, 0x31, 0xfb, - 0xf7, 0x0a, 0xfb, 0x0b, 0x23, 0x9b, 0x01, 0xfd, - 0x18, 0x00, 0x2c, 0x2a, 0xd1, 0x68, 0x68, 0x02, - 0x99, 0x88, 0x42, 0x0e, 0xd2, 0xed, 0x09, 0x00, - 0x05, 0x03, 0x38, 0x1c, 0x01, 0xf0, 0xdb, 0xfa, - 0x01, 0x21, 0x02, 0xaa, 0x01, 0x92, 0x00, 0x91, - 0x2d, 0x21, 0x02, 0x1c, 0x01, 0x23, 0x38, 0x1c, - 0x01, 0xf0, 0xe9, 0xfc, 0x02, 0x98, 0x68, 0x60, - 0x70, 0x6b, 0xb0, 0x63, 0xa9, 0x68, 0x02, 0x98, - 0x81, 0x42, 0x03, 0xd0, 0xa8, 0x60, 0x38, 0x1c, - 0xfb, 0xf7, 0x32, 0xfd, 0x38, 0x1c, 0xfd, 0xf7, - 0x24, 0xfb, 0x02, 0x1c, 0x38, 0x1c, 0xb1, 0x6b, - 0xfd, 0xf7, 0xb9, 0xfb, 0x00, 0x21, 0x38, 0x1c, - 0x01, 0xf0, 0x72, 0xfc, 0xb2, 0x6b, 0x0c, 0xe0, - 0xb2, 0x6b, 0xa8, 0x68, 0x00, 0x24, 0x05, 0x28, - 0x02, 0xd2, 0x03, 0x23, 0x9b, 0x03, 0x9a, 0x43, - 0x03, 0x28, 0x02, 0xd2, 0x03, 0x23, 0x9b, 0x02, - 0x9a, 0x43, 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0xf7, - 0x9f, 0xfd, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf0, 0xb5, 0x07, 0x1c, 0x0c, 0x1c, - 0x01, 0xd1, 0x50, 0x25, 0x00, 0xe0, 0x51, 0x25, - 0x38, 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0x5b, 0xfe, - 0x00, 0x28, 0x19, 0xd0, 0xf9, 0x1d, 0x1d, 0x31, - 0x38, 0x1c, 0x2a, 0x1c, 0x0e, 0x1c, 0xfc, 0xf7, - 0xdf, 0xfd, 0x00, 0x28, 0x10, 0xd0, 0xf9, 0x1d, - 0xff, 0x31, 0x38, 0x1c, 0x1e, 0x31, 0xfb, 0xf7, - 0xa9, 0xfa, 0x00, 0x23, 0x38, 0x1c, 0x31, 0x1c, - 0x2a, 0x1c, 0xfc, 0xf7, 0xf1, 0xfd, 0x38, 0x1c, - 0x29, 0x1c, 0x22, 0x1c, 0xfc, 0xf7, 0x62, 0xfe, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x90, 0xb5, - 0x07, 0x1c, 0x00, 0x29, 0x01, 0xd1, 0x61, 0x24, - 0x00, 0xe0, 0x62, 0x24, 0x38, 0x1c, 0x21, 0x1c, - 0xfc, 0xf7, 0x31, 0xfe, 0x00, 0x28, 0x12, 0xd0, - 0x38, 0x1c, 0x21, 0x1c, 0xfc, 0xf7, 0xf2, 0xfd, - 0x00, 0x28, 0x0c, 0xd0, 0x38, 0x1c, 0xfb, 0xf7, - 0x41, 0xfa, 0x00, 0x22, 0x38, 0x1c, 0x21, 0x1c, - 0xed, 0x09, 0x00, 0x06, 0x03, 0xfc, 0xf7, 0x08, - 0xfe, 0x00, 0x22, 0x38, 0x1c, 0x21, 0x1c, 0xfc, - 0xf7, 0x3f, 0xfe, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xb0, 0xb5, 0x07, 0x1c, 0x0c, 0x1c, 0x1f, - 0xd0, 0x23, 0x2c, 0x01, 0xd1, 0x5d, 0x25, 0x00, - 0xe0, 0x5c, 0x25, 0x38, 0x1c, 0x29, 0x1c, 0xfc, - 0xf7, 0x0c, 0xfe, 0x00, 0x28, 0x14, 0xd0, 0x38, - 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0xcd, 0xfd, 0x00, - 0x28, 0x0e, 0xd0, 0x5d, 0x2d, 0x02, 0xd0, 0x38, - 0x1c, 0xfb, 0xf7, 0x1a, 0xfa, 0x38, 0x1c, 0x29, - 0x1c, 0x22, 0x1c, 0xfc, 0xf7, 0xe1, 0xfd, 0x38, - 0x1c, 0x29, 0x1c, 0x22, 0x1c, 0xfc, 0xf7, 0x18, - 0xfe, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x1a, - 0x29, 0x01, 0xd0, 0x00, 0x29, 0x03, 0xd0, 0x01, - 0x21, 0xff, 0x30, 0x41, 0x30, 0x81, 0x62, 0x70, - 0x47, 0x80, 0xb5, 0xcb, 0x69, 0x19, 0x78, 0x49, - 0x08, 0x04, 0x29, 0x01, 0xd1, 0x99, 0x78, 0x00, - 0xe0, 0x00, 0x21, 0x5b, 0x78, 0x1f, 0x2b, 0x4f, - 0xd0, 0x0e, 0xdc, 0xdf, 0x1f, 0x01, 0x3f, 0x0c, - 0x2f, 0x17, 0xd2, 0x02, 0xa3, 0xdb, 0x5d, 0x5b, - 0x00, 0x9f, 0x44, 0x00, 0x1c, 0x22, 0x40, 0x13, - 0x25, 0x13, 0x13, 0x13, 0x28, 0x2b, 0x2e, 0x31, - 0x3a, 0x2e, 0x2b, 0x2e, 0xd0, 0x0c, 0xdc, 0x20, - 0x2b, 0x3a, 0xd0, 0x2a, 0x2b, 0x26, 0xd0, 0x2b, - 0x2b, 0x33, 0xd0, 0x2c, 0x2b, 0x01, 0xd1, 0x02, - 0xf0, 0x21, 0xf8, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x32, 0x2b, 0x24, 0xd0, 0x33, 0x2b, 0x04, - 0xd0, 0x79, 0x2b, 0xf6, 0xd1, 0x03, 0xf0, 0x0a, - 0xff, 0xf3, 0xe7, 0xff, 0xf7, 0xcb, 0xfc, 0xf0, - 0xe7, 0xff, 0xf7, 0x26, 0xfd, 0xed, 0xe7, 0xff, - 0xf7, 0x57, 0xfd, 0xea, 0xe7, 0xff, 0xf7, 0xaa, - 0xfd, 0xe7, 0xe7, 0xff, 0xf7, 0x2d, 0xfe, 0xe4, - 0xe7, 0xff, 0xf7, 0xed, 0x09, 0x00, 0x07, 0x03, - 0x54, 0xfe, 0xe1, 0xe7, 0xff, 0xf7, 0x7b, 0xfe, - 0xde, 0xe7, 0xff, 0xf7, 0xa2, 0xfe, 0xdb, 0xe7, - 0xff, 0xf7, 0xd3, 0xfe, 0xd8, 0xe7, 0xff, 0xf7, - 0x31, 0xff, 0xd5, 0xe7, 0xff, 0xf7, 0x58, 0xff, - 0xd2, 0xe7, 0xff, 0xf7, 0x78, 0xff, 0xcf, 0xe7, - 0x01, 0xf0, 0xbb, 0xff, 0xcc, 0xe7, 0xff, 0xf7, - 0x99, 0xff, 0xc9, 0xe7, 0xf8, 0xb5, 0x15, 0x1c, - 0x07, 0x1c, 0xd0, 0xf7, 0x1d, 0xfd, 0x04, 0x1c, - 0x11, 0xd0, 0x00, 0x22, 0x4e, 0x21, 0x38, 0x1c, - 0xfc, 0xf7, 0xa1, 0xfd, 0x00, 0x28, 0x0d, 0xd0, - 0x1f, 0xa2, 0x00, 0x92, 0x33, 0x22, 0x24, 0x23, - 0x38, 0x1c, 0x29, 0x1c, 0x01, 0xf0, 0x4c, 0xfc, - 0x20, 0x1c, 0xd0, 0xf7, 0x44, 0xfd, 0xf8, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x38, 0x1c, 0xfb, 0xf7, - 0x86, 0xf9, 0x38, 0x1c, 0xf9, 0xf7, 0x27, 0xfc, - 0xfe, 0x1d, 0x79, 0x36, 0x00, 0x28, 0x14, 0xd0, - 0x19, 0x48, 0x40, 0x6a, 0x00, 0x28, 0x10, 0xd0, - 0x11, 0xa2, 0x00, 0x92, 0x33, 0x22, 0x17, 0x24, - 0x38, 0x1c, 0x29, 0x1c, 0x23, 0x1c, 0x01, 0xf0, - 0x2f, 0xfc, 0x02, 0x21, 0x38, 0x1c, 0x22, 0x1c, - 0xfc, 0xf7, 0x75, 0xfd, 0x00, 0x20, 0x30, 0x63, - 0xdd, 0xe7, 0xd5, 0x20, 0x20, 0x60, 0xf9, 0x1d, - 0x9d, 0x31, 0xe7, 0x60, 0x88, 0xc9, 0xe0, 0x1d, - 0x09, 0x30, 0x88, 0xc0, 0xf0, 0x6a, 0xa0, 0x61, - 0x00, 0x20, 0xe0, 0x61, 0x05, 0x20, 0x21, 0x1c, - 0xd0, 0xf7, 0x45, 0xfd, 0xcb, 0xe7, 0x4c, 0x6d, - 0x52, 0x63, 0x76, 0x48, 0x6f, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x00, 0x00, 0xf8, 0xad, - 0x03, 0x20, 0x80, 0xb5, 0x7a, 0x21, 0x07, 0x1c, - 0xfc, 0xf7, 0x2a, 0xfd, 0x00, 0x28, 0x09, 0xd0, - 0xf8, 0x1d, 0xb9, 0x30, 0xc1, 0x6a, 0xed, 0x09, - 0x00, 0x08, 0x03, 0x00, 0x29, 0x07, 0xd0, 0x00, - 0x22, 0x1c, 0x21, 0x38, 0x1c, 0xfc, 0xf7, 0x41, - 0xfd, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, - 0x21, 0x01, 0x63, 0xf9, 0xe7, 0xb8, 0xb5, 0x0d, - 0x1c, 0x54, 0x21, 0x14, 0x1c, 0x07, 0x1c, 0xfc, - 0xf7, 0x11, 0xfd, 0x00, 0x28, 0x0a, 0xd1, 0x12, - 0xa2, 0x00, 0x92, 0x08, 0x22, 0x24, 0x23, 0x38, - 0x1c, 0x21, 0x1c, 0x01, 0xf0, 0xdf, 0xfb, 0xb8, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x54, 0x21, 0x38, - 0x1c, 0xfc, 0xf7, 0xc7, 0xfc, 0x00, 0x28, 0x08, - 0xd1, 0x0a, 0xa2, 0x00, 0x92, 0x08, 0x22, 0x24, - 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, 0xf0, 0xce, - 0xfb, 0xed, 0xe7, 0x54, 0x21, 0x38, 0x1c, 0x2a, - 0x1c, 0xfc, 0xf7, 0x13, 0xfd, 0x54, 0x21, 0x38, - 0x1c, 0x2a, 0x1c, 0xfc, 0xf7, 0xd2, 0xfc, 0xe2, - 0xe7, 0x00, 0x00, 0x4c, 0x6d, 0x52, 0x63, 0x76, - 0x49, 0x6e, 0x52, 0x61, 0x6e, 0x64, 0x00, 0xb8, - 0xb5, 0x0d, 0x1c, 0x5b, 0x21, 0x14, 0x1c, 0x07, - 0x1c, 0xfc, 0xf7, 0xdc, 0xfc, 0x00, 0x28, 0x0a, - 0xd1, 0x12, 0xa2, 0x00, 0x92, 0x0a, 0x22, 0x24, - 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, 0xf0, 0xaa, - 0xfb, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x5b, - 0x21, 0x38, 0x1c, 0xfc, 0xf7, 0x92, 0xfc, 0x00, - 0x28, 0x08, 0xd1, 0x09, 0xa2, 0x00, 0x92, 0x0a, - 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, - 0xf0, 0x99, 0xfb, 0xed, 0xe7, 0x5b, 0x21, 0x38, - 0x1c, 0x22, 0x1c, 0xfc, 0xf7, 0xde, 0xfc, 0x5b, - 0x21, 0x38, 0x1c, 0x2a, 0x1c, 0xfc, 0xf7, 0x9d, - 0xfc, 0xe2, 0xe7, 0x4c, 0x6d, 0x52, 0x63, 0x76, - 0x55, 0x6e, 0x69, 0x74, 0x4b, 0x65, 0x79, 0x00, - 0x00, 0x00, 0x00, 0xb8, 0xb5, 0x0d, 0x1c, 0x5a, - 0x21, 0x14, 0x1c, 0x07, 0x1c, 0xfc, 0xf7, 0xa6, - 0xfc, 0xed, 0x09, 0x00, 0x09, 0x03, 0x00, 0x28, - 0x0a, 0xd1, 0x12, 0xa2, 0x00, 0x92, 0x09, 0x22, - 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, 0xf0, - 0x74, 0xfb, 0xb8, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x5a, 0x21, 0x38, 0x1c, 0xfc, 0xf7, 0x5c, 0xfc, - 0x00, 0x28, 0x08, 0xd1, 0x09, 0xa2, 0x00, 0x92, - 0x09, 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, - 0x01, 0xf0, 0x63, 0xfb, 0xed, 0xe7, 0x5a, 0x21, - 0x38, 0x1c, 0x22, 0x1c, 0xfc, 0xf7, 0xa8, 0xfc, - 0x5a, 0x21, 0x38, 0x1c, 0x2a, 0x1c, 0xfc, 0xf7, - 0x67, 0xfc, 0xe2, 0xe7, 0x4c, 0x6d, 0x52, 0x63, - 0x76, 0x43, 0x6f, 0x6d, 0x62, 0x4b, 0x65, 0x79, - 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb5, 0x5f, 0x25, - 0x0c, 0x1c, 0x29, 0x1c, 0x07, 0x1c, 0xfc, 0xf7, - 0x70, 0xfc, 0x00, 0x28, 0x0f, 0xd0, 0x38, 0x1c, - 0x29, 0x1c, 0xfc, 0xf7, 0x31, 0xfc, 0x00, 0x28, - 0x09, 0xd0, 0x00, 0x22, 0x38, 0x1c, 0x29, 0x1c, - 0xfc, 0xf7, 0x86, 0xfc, 0x38, 0x1c, 0x29, 0x1c, - 0x22, 0x1c, 0xfc, 0xf7, 0x45, 0xfc, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x82, 0xb0, - 0x5e, 0x26, 0x0d, 0x1c, 0x31, 0x1c, 0x14, 0x1c, - 0x07, 0x1c, 0xfc, 0xf7, 0x52, 0xfc, 0x00, 0x28, - 0x28, 0xd0, 0x38, 0x1c, 0x31, 0x1c, 0xfc, 0xf7, - 0x13, 0xfc, 0x00, 0x28, 0x22, 0xd0, 0xfa, 0x1d, - 0xff, 0x32, 0xba, 0x32, 0x02, 0x21, 0x09, 0x23, - 0x9b, 0x01, 0x51, 0x63, 0xf9, 0x18, 0x0c, 0x63, - 0xf9, 0x1d, 0xff, 0x31, 0x6e, 0x31, 0x10, 0x22, - 0xf9, 0x23, 0x9b, 0x00, 0x01, 0x92, 0xfc, 0x18, - 0x00, 0x91, 0xe9, 0x69, 0x03, 0x1c, 0x02, 0x1c, - 0x20, 0x1c, 0x01, 0x31, 0xf9, 0xf7, 0x53, 0xfa, - 0x00, 0x22, 0x38, 0x1c, 0x31, 0x1c, 0xfc, 0xf7, - 0x4f, 0xfc, 0x00, 0x22, 0x38, 0x1c, 0x31, 0x1c, - 0xfc, 0xf7, 0x0e, 0xfc, 0xed, 0x09, 0x00, 0x0a, - 0x03, 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xb8, 0xb5, 0x60, 0x25, 0x29, 0x1c, 0x14, - 0x1c, 0x07, 0x1c, 0xfc, 0xf7, 0x1c, 0xfc, 0x00, - 0x28, 0x0a, 0xd1, 0x25, 0xa2, 0x00, 0x92, 0x32, - 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, - 0xf0, 0xea, 0xfa, 0xb8, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x38, 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0xd2, - 0xfb, 0x00, 0x28, 0x08, 0xd1, 0x1c, 0xa2, 0x00, - 0x92, 0x32, 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, - 0x1c, 0x01, 0xf0, 0xd9, 0xfa, 0xed, 0xe7, 0xf8, - 0x1d, 0xff, 0x30, 0x7a, 0x30, 0x41, 0x6b, 0x00, - 0x29, 0x17, 0xd0, 0x00, 0x21, 0x41, 0x63, 0xf9, - 0x1d, 0xff, 0x31, 0xb2, 0x31, 0xf8, 0x1d, 0xff, - 0x30, 0x0c, 0xc9, 0x6e, 0x30, 0x0c, 0xc0, 0x0c, - 0xc9, 0x0c, 0xc0, 0x16, 0x4b, 0xf9, 0x18, 0x38, - 0x1c, 0xf9, 0xf7, 0x00, 0xff, 0x38, 0x1c, 0x21, - 0x1c, 0x32, 0x22, 0x0b, 0xa3, 0x01, 0xf0, 0xac, - 0xfa, 0x07, 0xe0, 0x09, 0xa2, 0x00, 0x92, 0x32, - 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, - 0xf0, 0xb2, 0xfa, 0x00, 0x22, 0x38, 0x1c, 0x29, - 0x1c, 0xfc, 0xf7, 0xf8, 0xfb, 0x00, 0x22, 0x38, - 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0xb7, 0xfb, 0xbc, - 0xe7, 0x4c, 0x6d, 0x52, 0x63, 0x76, 0x55, 0x73, - 0x65, 0x53, 0x65, 0x6d, 0x69, 0x50, 0x65, 0x72, - 0x6d, 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x4b, 0x65, - 0x79, 0x00, 0x00, 0x00, 0x00, 0x24, 0x04, 0x00, - 0x00, 0xb8, 0xb5, 0x0d, 0x1c, 0x63, 0x21, 0x14, - 0x1c, 0x07, 0x1c, 0xfc, 0xf7, 0xb8, 0xfb, 0x00, - 0x28, 0x0a, 0xd1, 0x2d, 0xa2, 0x00, 0x92, 0x0b, - 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, - 0xf0, 0x86, 0xfa, 0xb8, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x63, 0x21, 0x38, 0x1c, 0xfc, 0xf7, 0xed, - 0x09, 0x00, 0x0b, 0x03, 0x6e, 0xfb, 0x00, 0x28, - 0x08, 0xd1, 0x24, 0xa2, 0x00, 0x92, 0x0b, 0x22, - 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, 0xf0, - 0x75, 0xfa, 0xed, 0xe7, 0x63, 0x22, 0x38, 0x1c, - 0xf9, 0x1d, 0x21, 0x31, 0xfc, 0xf7, 0x23, 0xfb, - 0x00, 0x28, 0x0d, 0xd1, 0xf8, 0x1d, 0xb9, 0x30, - 0x40, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x19, 0xa2, - 0x00, 0x92, 0x0b, 0x22, 0x24, 0x23, 0x38, 0x1c, - 0x21, 0x1c, 0x01, 0xf0, 0x5f, 0xfa, 0xd7, 0xe7, - 0x63, 0x21, 0x38, 0x1c, 0x2a, 0x1c, 0xfc, 0xf7, - 0xa4, 0xfb, 0x63, 0x21, 0x38, 0x1c, 0x2a, 0x1c, - 0xfc, 0xf7, 0x63, 0xfb, 0x38, 0x1c, 0xf9, 0xf7, - 0x38, 0xfa, 0x00, 0x28, 0x15, 0xd0, 0x0d, 0xa2, - 0x00, 0x92, 0x0b, 0x22, 0x17, 0x25, 0x38, 0x1c, - 0x21, 0x1c, 0x2b, 0x1c, 0x01, 0xf0, 0x46, 0xfa, - 0x00, 0x28, 0xbd, 0xd1, 0x00, 0x22, 0x2e, 0x21, - 0x38, 0x1c, 0xfc, 0xf7, 0x4e, 0xfb, 0x2e, 0x21, - 0x38, 0x1c, 0x2a, 0x1c, 0xfc, 0xf7, 0x85, 0xfb, - 0xb2, 0xe7, 0x29, 0x21, 0x38, 0x1c, 0x2a, 0x1c, - 0xfc, 0xf7, 0x43, 0xfb, 0xac, 0xe7, 0x4c, 0x6d, - 0x52, 0x63, 0x76, 0x41, 0x75, 0x52, 0x61, 0x6e, - 0x64, 0x00, 0xf7, 0xb5, 0x86, 0xb0, 0x67, 0x21, - 0x07, 0x1c, 0xfc, 0xf7, 0x4f, 0xfb, 0x00, 0x28, - 0x4f, 0xd0, 0x67, 0x21, 0x38, 0x1c, 0xfc, 0xf7, - 0x10, 0xfb, 0x00, 0x28, 0x49, 0xd0, 0x38, 0x1c, - 0xfa, 0xf7, 0x5f, 0xff, 0xfe, 0x1d, 0xff, 0x36, - 0x7a, 0x36, 0xfc, 0x1d, 0xfd, 0x1d, 0xff, 0x35, - 0xff, 0x34, 0x30, 0x6a, 0x6e, 0x34, 0x9e, 0x35, - 0x00, 0x28, 0x01, 0xd0, 0x28, 0x1c, 0x00, 0xe0, - 0x20, 0x1c, 0xf9, 0x1d, 0x9d, 0x31, 0x0b, 0x68, - 0x01, 0x93, 0x4a, 0x68, 0x1b, 0x4b, 0x00, 0x92, - 0xf9, 0x18, 0x02, 0x1c, 0x02, 0xa8, 0x01, 0x9b, - 0xf9, 0xf7, 0xed, 0x09, 0x00, 0x0c, 0x03, 0x87, - 0xf9, 0x07, 0x99, 0xc8, 0x69, 0x41, 0x1c, 0x02, - 0xa8, 0x04, 0x22, 0xf5, 0xf7, 0x04, 0xfb, 0x00, - 0x28, 0x14, 0xd1, 0x00, 0x21, 0x38, 0x1c, 0xf9, - 0xf7, 0x54, 0xfa, 0x30, 0x6a, 0x00, 0x28, 0x03, - 0xd0, 0x00, 0x20, 0x30, 0x62, 0x4d, 0xcd, 0x4d, - 0xc4, 0x38, 0x1c, 0x03, 0xa9, 0xf9, 0xf7, 0x27, - 0xfe, 0x00, 0x22, 0x67, 0x21, 0x38, 0x1c, 0xfc, - 0xf7, 0xf2, 0xfa, 0x0c, 0xe0, 0x05, 0x21, 0x38, - 0x1c, 0xf9, 0xf7, 0x3f, 0xfa, 0x38, 0x1c, 0x06, - 0xa1, 0xf9, 0xf7, 0x57, 0xfe, 0x05, 0x22, 0x68, - 0x21, 0x38, 0x1c, 0xfc, 0xf7, 0x20, 0xfb, 0x09, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x04, - 0x04, 0x00, 0x00, 0x4c, 0x6d, 0x52, 0x63, 0x76, - 0x53, 0x52, 0x65, 0x73, 0x00, 0x00, 0x00, 0xf0, - 0xb5, 0x82, 0xb0, 0x14, 0x1c, 0x0e, 0x1c, 0x07, - 0x1c, 0x46, 0x48, 0x40, 0x68, 0xc0, 0x08, 0x08, - 0xd2, 0x45, 0xa2, 0x00, 0x92, 0x0f, 0x22, 0x1a, - 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, 0xf0, 0xb8, - 0xf9, 0x7a, 0xe0, 0x69, 0x21, 0x38, 0x1c, 0xfc, - 0xf7, 0xdb, 0xfa, 0x00, 0x28, 0x08, 0xd1, 0x3d, - 0xa2, 0x00, 0x92, 0x0f, 0x22, 0x24, 0x23, 0x38, - 0x1c, 0x21, 0x1c, 0x01, 0xf0, 0xa9, 0xf9, 0x6b, - 0xe0, 0xf9, 0x1d, 0x21, 0x31, 0x69, 0x22, 0x38, - 0x1c, 0x01, 0x91, 0xfc, 0xf7, 0x56, 0xfa, 0x00, - 0x28, 0x08, 0xd1, 0x34, 0xa2, 0x00, 0x92, 0x0f, - 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, - 0xf0, 0x97, 0xf9, 0x59, 0xe0, 0xb8, 0x6a, 0x00, - 0x28, 0x0e, 0xd1, 0xf8, 0x1d, 0xff, 0x30, 0x3a, - 0x30, 0xc0, 0x6a, 0x00, 0x28, 0x08, 0xd1, 0x2b, - 0xa2, 0x00, 0x92, 0x0f, 0x22, 0x06, 0x23, 0x38, - 0x1c, 0x21, 0x1c, 0x01, 0xf0, 0x85, 0xf9, 0x47, - 0xe0, 0x78, 0x6a, 0x00, 0x28, 0xed, 0x09, 0x00, - 0x0d, 0x03, 0x08, 0xd0, 0x25, 0xa2, 0x00, 0x92, - 0x0f, 0x22, 0x32, 0x23, 0x38, 0x1c, 0x21, 0x1c, - 0x01, 0xf0, 0x79, 0xf9, 0x3b, 0xe0, 0xf0, 0x69, - 0x25, 0x25, 0x41, 0x78, 0xf8, 0x1d, 0xb9, 0x30, - 0x00, 0x29, 0x04, 0xd1, 0x80, 0x68, 0x00, 0x28, - 0x0a, 0xd0, 0x69, 0x26, 0x03, 0xe0, 0x80, 0x68, - 0x00, 0x28, 0x05, 0xd1, 0x69, 0x26, 0x38, 0x1c, - 0xff, 0xf7, 0x71, 0xf9, 0x05, 0x1c, 0x16, 0xd0, - 0x16, 0xa2, 0x00, 0x92, 0x0f, 0x22, 0x32, 0x26, - 0x38, 0x1c, 0x21, 0x1c, 0x2b, 0x1c, 0x01, 0xf0, - 0x5a, 0xf9, 0x00, 0x28, 0x1b, 0xd1, 0x00, 0x23, - 0x38, 0x1c, 0x32, 0x1c, 0x01, 0x99, 0xfc, 0xf7, - 0x27, 0xfa, 0x38, 0x1c, 0x31, 0x1c, 0x2a, 0x1c, - 0xfc, 0xf7, 0x98, 0xfa, 0x0f, 0xe0, 0x10, 0x20, - 0x05, 0x23, 0xdb, 0x01, 0xf9, 0x18, 0x08, 0x62, - 0x38, 0x1c, 0x00, 0x22, 0x31, 0x1c, 0xfc, 0xf7, - 0x8d, 0xfa, 0x38, 0x1c, 0x32, 0x1c, 0x23, 0x1c, - 0x01, 0x99, 0xfc, 0xf7, 0x11, 0xfa, 0x02, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x78, 0xae, 0x03, 0x20, 0x4c, 0x6d, 0x52, 0x63, - 0x76, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x71, 0x00, 0x00, 0xf0, 0xb5, 0x84, 0xb0, - 0x0d, 0x1c, 0x6a, 0x21, 0x14, 0x1c, 0x07, 0x1c, - 0xfc, 0xf7, 0x49, 0xfa, 0x00, 0x28, 0x08, 0xd1, - 0x38, 0xa2, 0x00, 0x92, 0x10, 0x22, 0x24, 0x23, - 0x38, 0x1c, 0x21, 0x1c, 0x01, 0xf0, 0x17, 0xf9, - 0x63, 0xe0, 0xf9, 0x1d, 0x21, 0x31, 0x6a, 0x22, - 0x38, 0x1c, 0x0e, 0x1c, 0xfc, 0xf7, 0xc4, 0xf9, - 0x00, 0x28, 0x08, 0xd1, 0x2f, 0xa2, 0x00, 0x92, - 0x10, 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, - 0x01, 0xf0, 0x05, 0xf9, 0x51, 0xe0, 0xe8, 0x69, - 0xed, 0x09, 0x00, 0x0e, 0x03, 0xf9, 0x1d, 0x45, - 0x78, 0x38, 0x1c, 0xff, 0x31, 0x3a, 0x31, 0xfa, - 0xf7, 0x83, 0xfe, 0x2e, 0x48, 0x0b, 0x23, 0xdb, - 0x01, 0xc1, 0x18, 0x03, 0x91, 0x89, 0x6a, 0xa9, - 0x42, 0x06, 0xd8, 0x05, 0x23, 0xdb, 0x01, 0xf9, - 0x18, 0x02, 0x91, 0x09, 0x6a, 0xa9, 0x42, 0x16, - 0xd2, 0x1f, 0xa2, 0x00, 0x92, 0x10, 0x22, 0x20, - 0x25, 0x38, 0x1c, 0x21, 0x1c, 0x2b, 0x1c, 0x01, - 0xf0, 0xe4, 0xf8, 0x00, 0x28, 0x2f, 0xd1, 0x34, - 0x22, 0x38, 0x1c, 0x31, 0x1c, 0x2b, 0x1c, 0xfc, - 0xf7, 0xb1, 0xf9, 0x34, 0x21, 0x38, 0x1c, 0x2a, - 0x1c, 0xfc, 0xf7, 0x22, 0xfa, 0x23, 0xe0, 0x03, - 0x99, 0x49, 0x6a, 0xa9, 0x42, 0x0f, 0xd2, 0x1a, - 0x4b, 0x01, 0x21, 0xc2, 0x18, 0x00, 0x91, 0x10, - 0x21, 0x01, 0x92, 0x01, 0x23, 0x38, 0x1c, 0x22, - 0x1c, 0x01, 0xf0, 0x43, 0xf8, 0x03, 0x99, 0x48, - 0x6a, 0x02, 0x99, 0x08, 0x62, 0x0f, 0xe0, 0x38, - 0x1c, 0x21, 0x1c, 0x10, 0x22, 0x08, 0xa3, 0x01, - 0xf0, 0xad, 0xf8, 0x00, 0x28, 0x07, 0xd1, 0x02, - 0x99, 0x00, 0x23, 0x33, 0x22, 0x38, 0x1c, 0x0d, - 0x62, 0x31, 0x1c, 0xfc, 0xf7, 0x87, 0xf9, 0x04, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x4c, 0x6d, 0x52, 0x63, 0x76, 0x45, 0x6e, - 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x4b, 0x65, 0x79, 0x53, 0x69, 0x7a, 0x65, 0x52, - 0x65, 0x71, 0x00, 0x00, 0x00, 0xb8, 0xa8, 0x03, - 0x20, 0xa4, 0x05, 0x00, 0x00, 0xb8, 0xb5, 0x0d, - 0x1c, 0x6b, 0x21, 0x14, 0x1c, 0x07, 0x1c, 0xfc, - 0xf7, 0xbc, 0xf9, 0x00, 0x28, 0x0a, 0xd1, 0x1d, - 0xa2, 0x00, 0x92, 0x11, 0x22, 0x24, 0x23, 0x38, - 0x1c, 0x21, 0x1c, 0x01, 0xf0, 0x8a, 0xf8, 0xb8, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x6b, 0x22, 0x38, - 0x1c, 0xf9, 0x1d, 0xed, 0x09, 0x00, 0x0f, 0x03, - 0x21, 0x31, 0xfc, 0xf7, 0x36, 0xf9, 0x00, 0x28, - 0x08, 0xd1, 0x13, 0xa2, 0x00, 0x92, 0x11, 0x22, - 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x01, 0xf0, - 0x77, 0xf8, 0xeb, 0xe7, 0xf9, 0x1d, 0xff, 0x31, - 0x38, 0x1c, 0x3a, 0x31, 0xfa, 0xf7, 0xf7, 0xfd, - 0xe8, 0x69, 0x11, 0x4b, 0x41, 0x1c, 0xf8, 0x18, - 0x10, 0x22, 0xcf, 0xf7, 0x90, 0xfd, 0x38, 0x1c, - 0xfe, 0xf7, 0xbf, 0xff, 0xf8, 0x1d, 0xb9, 0x30, - 0x41, 0x68, 0x81, 0x60, 0x03, 0x21, 0x38, 0x1c, - 0xfe, 0xf7, 0xd5, 0xff, 0x38, 0x1c, 0x21, 0x1c, - 0x11, 0x22, 0x01, 0xa3, 0x01, 0xf0, 0x49, 0xf8, - 0xcc, 0xe7, 0x4c, 0x6d, 0x52, 0x63, 0x76, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x00, 0x14, 0x04, 0x00, 0x00, 0x98, 0xb5, - 0x6c, 0x21, 0x14, 0x1c, 0x07, 0x1c, 0xfc, 0xf7, - 0x6b, 0xf9, 0x00, 0x28, 0x0a, 0xd1, 0x18, 0xa2, - 0x00, 0x92, 0x12, 0x22, 0x24, 0x23, 0x38, 0x1c, - 0x21, 0x1c, 0x01, 0xf0, 0x39, 0xf8, 0x98, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x6c, 0x22, 0x38, 0x1c, - 0xf9, 0x1d, 0x21, 0x31, 0xfc, 0xf7, 0xe5, 0xf8, - 0x00, 0x28, 0x08, 0xd1, 0x0f, 0xa2, 0x00, 0x92, - 0x12, 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, - 0x01, 0xf0, 0x26, 0xf8, 0xeb, 0xe7, 0xf9, 0x1d, - 0xff, 0x31, 0x38, 0x1c, 0x3a, 0x31, 0xfa, 0xf7, - 0xa6, 0xfd, 0x00, 0x21, 0x38, 0x1c, 0xfe, 0xf7, - 0x92, 0xff, 0xf9, 0x1d, 0xb9, 0x31, 0x00, 0x20, - 0x48, 0x60, 0x88, 0x60, 0x38, 0x1c, 0x21, 0x1c, - 0x12, 0x22, 0x01, 0xa3, 0x01, 0xf0, 0x01, 0xf8, - 0xd5, 0xe7, 0x4c, 0x6d, 0x52, 0x63, 0x76, 0x53, - 0x74, 0x6f, 0x70, 0x45, 0x6e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0xed, 0x09, - 0x00, 0x10, 0x03, 0x65, 0x71, 0x00, 0x00, 0x90, - 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0xc8, 0x69, 0x41, - 0x1c, 0x14, 0x1c, 0x08, 0x22, 0x02, 0xa8, 0xcf, - 0xf7, 0x20, 0xfd, 0x38, 0x69, 0x02, 0x28, 0x0c, - 0xd1, 0xf9, 0x1d, 0xb9, 0x31, 0x01, 0x20, 0x88, - 0x63, 0x02, 0xa9, 0x0c, 0xc9, 0xf8, 0x1d, 0xf5, - 0x30, 0x0c, 0xc0, 0x00, 0x21, 0x38, 0x1c, 0x00, - 0xf0, 0x06, 0xff, 0x06, 0x4a, 0x08, 0x21, 0x00, - 0x91, 0x28, 0x21, 0x01, 0x23, 0x38, 0x1c, 0x01, - 0x92, 0x22, 0x1c, 0x00, 0xf0, 0x5b, 0xff, 0x04, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x7c, - 0xae, 0x03, 0x20, 0xf0, 0xb5, 0x56, 0x25, 0x0c, - 0x1c, 0x29, 0x1c, 0x07, 0x1c, 0xfc, 0xf7, 0xfa, - 0xf8, 0x00, 0x28, 0x2d, 0xd0, 0xf9, 0x1d, 0xff, - 0x31, 0x38, 0x1c, 0x1a, 0x31, 0xfa, 0xf7, 0x51, - 0xfd, 0xe0, 0x69, 0x08, 0x22, 0x41, 0x1c, 0xf8, - 0x1d, 0xf5, 0x30, 0x06, 0x1c, 0xcf, 0xf7, 0xe9, - 0xfc, 0xfc, 0x1d, 0xb9, 0x34, 0x01, 0x20, 0xa0, - 0x63, 0x00, 0x20, 0x60, 0x63, 0x00, 0x21, 0x38, - 0x1c, 0x00, 0xf0, 0xd5, 0xfe, 0xe0, 0x6b, 0x80, - 0x0a, 0x08, 0xd2, 0xf8, 0x68, 0x41, 0x6a, 0x02, - 0x29, 0x04, 0xd9, 0x02, 0x21, 0x41, 0x62, 0x38, - 0x1c, 0x02, 0xf0, 0xed, 0xff, 0x00, 0x21, 0x38, - 0x1c, 0x32, 0x1c, 0xfa, 0xf7, 0x2d, 0xff, 0x00, - 0x22, 0x38, 0x1c, 0x29, 0x1c, 0xfc, 0xf7, 0xed, - 0xf8, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, - 0xb5, 0x86, 0xb0, 0x07, 0x1c, 0x00, 0x20, 0x13, - 0x23, 0x5b, 0x01, 0x14, 0x1c, 0xfa, 0x18, 0x10, - 0x80, 0xc8, 0x69, 0x17, 0x23, 0xc1, 0x78, 0x9b, - 0x01, 0x0e, 0x4d, 0x51, 0x70, 0x81, 0x78, 0x11, - 0x70, 0xea, 0x18, 0x02, 0x3b, 0xe8, 0x18, 0x0b, - 0x4b, 0x02, 0x21, 0x04, 0x91, 0xe9, 0x18, 0x03, - 0x90, 0xed, 0x09, 0x00, 0x11, 0x03, 0x01, 0x20, - 0x05, 0x92, 0x02, 0x22, 0x00, 0x90, 0x01, 0x91, - 0x26, 0x21, 0x38, 0x1c, 0x02, 0x92, 0x03, 0x23, - 0x22, 0x1c, 0x00, 0xf0, 0xf6, 0xfe, 0x06, 0xb0, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0xb8, 0xa8, 0x03, 0x20, 0xbc, 0x05, 0x00, 0x00, - 0x90, 0xb5, 0x82, 0xb0, 0x0a, 0x1c, 0x0c, 0x1c, - 0x7b, 0x21, 0x07, 0x1c, 0xfc, 0xf7, 0xb4, 0xf8, - 0x00, 0x28, 0x27, 0xd1, 0xf8, 0x1d, 0xff, 0x30, - 0xba, 0x30, 0xc0, 0x69, 0x00, 0x28, 0x21, 0xd0, - 0x00, 0x20, 0x01, 0x90, 0xf9, 0x1d, 0xff, 0x31, - 0x38, 0x1c, 0x0a, 0x31, 0xfa, 0xf7, 0xe0, 0xfc, - 0xe0, 0x69, 0x00, 0x22, 0x13, 0x23, 0x5b, 0x01, - 0x41, 0x78, 0xf8, 0x18, 0x02, 0x80, 0xe2, 0x69, - 0xd3, 0x78, 0x43, 0x70, 0x93, 0x78, 0x03, 0x70, - 0xe2, 0x69, 0x01, 0xab, 0x54, 0x79, 0x5c, 0x70, - 0x14, 0x79, 0x1c, 0x70, 0x01, 0x9a, 0x00, 0x92, - 0x0a, 0x1c, 0x00, 0x21, 0x03, 0x88, 0x38, 0x1c, - 0xfa, 0xf7, 0xa0, 0xfe, 0x02, 0xb0, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x8c, 0xb0, - 0x05, 0x1c, 0x0c, 0x1c, 0x17, 0x1c, 0x1c, 0x48, - 0xf4, 0xf7, 0xa6, 0xff, 0x0b, 0x90, 0xe0, 0x69, - 0x40, 0x78, 0x0b, 0x9c, 0x21, 0x1a, 0x0e, 0x29, - 0x0a, 0x90, 0x05, 0xd3, 0x17, 0x4a, 0x10, 0x18, - 0x5d, 0x23, 0x1b, 0x01, 0xc2, 0x18, 0x11, 0xe0, - 0x00, 0x22, 0x00, 0x23, 0x06, 0xae, 0x0c, 0xc6, - 0x0c, 0xc6, 0x84, 0x42, 0x09, 0xd9, 0x11, 0x4a, - 0x10, 0x18, 0x5d, 0x23, 0x1b, 0x01, 0xc3, 0x18, - 0x0a, 0x1c, 0x19, 0x1c, 0x06, 0xa8, 0xcf, 0xf7, - 0x3b, 0xfc, 0x06, 0xaa, 0x0e, 0x21, 0x0b, 0xa8, - 0x03, 0x90, 0x04, 0x91, 0x0a, 0xa9, 0x01, 0x20, - 0x05, 0x92, 0x01, 0x22, 0x00, 0x90, 0x01, 0x91, - 0x02, 0x21, 0x28, 0x1c, 0xed, 0x09, 0x00, 0x12, - 0x03, 0x02, 0x92, 0x03, 0x23, 0x3a, 0x1c, 0x00, - 0xf0, 0x7e, 0xfe, 0x0c, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x88, 0xae, 0x03, - 0x20, 0xb8, 0xa8, 0x03, 0x20, 0xf7, 0xb5, 0x84, - 0xb0, 0x7c, 0x21, 0x07, 0x1c, 0xfc, 0xf7, 0x1b, - 0xf8, 0x00, 0x28, 0x60, 0xd0, 0xf8, 0x1d, 0xff, - 0x30, 0xba, 0x30, 0x00, 0x6a, 0x00, 0x28, 0x5a, - 0xd0, 0x05, 0x99, 0x00, 0x24, 0xc8, 0x69, 0xf9, - 0x1d, 0xff, 0x31, 0x46, 0x78, 0x85, 0x78, 0x0e, - 0x31, 0x03, 0x91, 0x38, 0x1c, 0xfa, 0xf7, 0x66, - 0xfc, 0x0b, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x02, - 0x90, 0x40, 0x6a, 0xb0, 0x42, 0x01, 0xd0, 0x1f, - 0x24, 0x1f, 0xe0, 0xf8, 0x2d, 0x19, 0xd8, 0xb5, - 0x42, 0x01, 0xd2, 0x1f, 0x24, 0x19, 0xe0, 0xaa, - 0x1b, 0x01, 0x92, 0x0e, 0x2a, 0x01, 0xd9, 0x0e, - 0x22, 0x01, 0x92, 0x05, 0x99, 0xc8, 0x69, 0x01, - 0x9a, 0xc1, 0x1c, 0xb8, 0x19, 0xff, 0x30, 0xff, - 0x30, 0xea, 0x30, 0xcf, 0xf7, 0xe7, 0xfb, 0x02, - 0x98, 0x40, 0x6a, 0x01, 0x9a, 0x02, 0x99, 0x80, - 0x18, 0x48, 0x62, 0x02, 0x98, 0x40, 0x6a, 0xa8, - 0x42, 0x12, 0xd1, 0xf8, 0x1d, 0xb9, 0x30, 0xc0, - 0x69, 0x00, 0x28, 0x05, 0xd0, 0x02, 0x21, 0x38, - 0x1c, 0x22, 0x1c, 0xfb, 0xf7, 0xf7, 0xff, 0x1a, - 0xe0, 0x5d, 0x23, 0xdb, 0x00, 0xfa, 0x18, 0x38, - 0x1c, 0x21, 0x1c, 0xfa, 0xf7, 0x8f, 0xfe, 0x12, - 0xe0, 0x38, 0x1c, 0x00, 0xf0, 0x04, 0xfc, 0xb9, - 0x23, 0x9b, 0x00, 0xfa, 0x18, 0x01, 0x92, 0x01, - 0x21, 0x02, 0x1c, 0x01, 0x23, 0x38, 0x1c, 0x00, - 0x91, 0x00, 0xf0, 0x11, 0xfe, 0x03, 0x99, 0x04, - 0x4a, 0x38, 0x1c, 0xfa, 0xf7, 0x2f, 0xfc, 0x07, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x9b, 0xb2, 0x02, 0x20, 0x70, 0x47, 0xed, - 0x09, 0x00, 0x13, 0x03, 0xb0, 0xb5, 0xc9, 0x69, - 0x4c, 0x78, 0xe2, 0x07, 0xd2, 0x0f, 0x0b, 0x23, - 0x9b, 0x01, 0xc7, 0x18, 0x00, 0x2a, 0x02, 0xd0, - 0x02, 0x21, 0x39, 0x60, 0x01, 0xe0, 0x01, 0x21, - 0x39, 0x60, 0x00, 0x25, 0x05, 0x23, 0xdb, 0x01, - 0xc1, 0x18, 0x06, 0x23, 0x23, 0x40, 0x02, 0x2b, - 0xcd, 0x63, 0x19, 0xd0, 0x04, 0x2b, 0x0a, 0xd0, - 0x06, 0x2b, 0x21, 0xd1, 0x00, 0x2a, 0x03, 0xd0, - 0x01, 0x23, 0xdb, 0x03, 0xcb, 0x63, 0x02, 0xe0, - 0x01, 0x23, 0x9b, 0x03, 0xcb, 0x63, 0x00, 0x2a, - 0x05, 0xd0, 0x01, 0x23, 0xcc, 0x6b, 0xdb, 0x02, - 0x23, 0x43, 0xcb, 0x63, 0x04, 0xe0, 0x01, 0x23, - 0xcc, 0x6b, 0x9b, 0x02, 0x23, 0x43, 0xcb, 0x63, - 0x00, 0x2a, 0x04, 0xd0, 0xca, 0x6b, 0x10, 0x23, - 0x1a, 0x43, 0xca, 0x63, 0x0b, 0xe0, 0xca, 0x6b, - 0x08, 0x23, 0x1a, 0x43, 0xca, 0x63, 0x06, 0xe0, - 0x00, 0x2a, 0x02, 0xd0, 0x05, 0x4a, 0xca, 0x63, - 0x01, 0xe0, 0x04, 0x4a, 0xca, 0x63, 0x39, 0x68, - 0x00, 0xf0, 0x5d, 0xfd, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x10, 0x88, 0x00, 0x00, 0x08, 0x44, - 0x00, 0x00, 0x90, 0xb5, 0x84, 0xb0, 0x07, 0x1c, - 0x08, 0x1c, 0x11, 0x1c, 0x00, 0x22, 0x03, 0x92, - 0xc2, 0x69, 0x03, 0xab, 0x94, 0x78, 0x5c, 0x70, - 0x54, 0x78, 0x1c, 0x70, 0xc0, 0x69, 0xc4, 0x78, - 0x03, 0x98, 0x04, 0x28, 0x07, 0xd2, 0x16, 0xa2, - 0x00, 0x92, 0x2a, 0x22, 0x20, 0x23, 0x38, 0x1c, - 0x00, 0xf0, 0x20, 0xfe, 0x20, 0xe0, 0x38, 0x1c, - 0x2a, 0x22, 0x11, 0xa3, 0x00, 0xf0, 0x0b, 0xfe, - 0x0b, 0x23, 0x9b, 0x01, 0x03, 0x98, 0xf9, 0x18, - 0xc8, 0x61, 0x38, 0x1c, 0x22, 0x1c, 0x03, 0x99, - 0xfc, 0xf7, 0x54, 0xfc, 0x00, 0x22, 0xd2, 0x43, - 0x03, 0x9c, 0x0e, 0x49, 0x02, 0x92, 0x61, 0x43, - 0x00, 0x20, 0xed, 0x09, 0x00, 0x14, 0x03, 0xc3, - 0x43, 0x04, 0x2c, 0x00, 0x90, 0x01, 0x91, 0x00, - 0xd9, 0x00, 0x23, 0x01, 0x22, 0x00, 0x21, 0x38, - 0x1c, 0xfa, 0xf7, 0x31, 0xfe, 0x04, 0xb0, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x4c, - 0x6d, 0x52, 0x63, 0x76, 0x51, 0x6f, 0x73, 0x53, - 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x00, - 0x00, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x90, - 0xb5, 0x84, 0xb0, 0x07, 0x1c, 0x00, 0x20, 0x03, - 0x90, 0xc8, 0x69, 0x03, 0xab, 0x82, 0x78, 0x5a, - 0x70, 0x42, 0x78, 0x1a, 0x70, 0xc8, 0x69, 0x0b, - 0x23, 0xc2, 0x78, 0x03, 0x98, 0x9b, 0x01, 0xf9, - 0x18, 0xc8, 0x61, 0x03, 0x99, 0x38, 0x1c, 0xfc, - 0xf7, 0x1b, 0xfc, 0x00, 0x22, 0xd2, 0x43, 0x03, - 0x9c, 0x09, 0x49, 0x02, 0x92, 0x61, 0x43, 0x00, - 0x20, 0xc3, 0x43, 0x04, 0x2c, 0x00, 0x90, 0x01, - 0x91, 0x00, 0xd9, 0x00, 0x23, 0x01, 0x22, 0x00, - 0x21, 0x38, 0x1c, 0xfa, 0xf7, 0xf8, 0xfd, 0x04, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x71, - 0x02, 0x00, 0x00, 0x98, 0xb5, 0x07, 0x1c, 0x08, - 0x1c, 0xc0, 0x69, 0x11, 0x1c, 0x44, 0x78, 0x01, - 0x2c, 0x01, 0xd3, 0x05, 0x2c, 0x09, 0xd9, 0x14, - 0xa2, 0x00, 0x92, 0x2e, 0x22, 0x20, 0x23, 0x38, - 0x1c, 0x00, 0xf0, 0xae, 0xfd, 0x98, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x13, 0x48, 0x03, 0x2c, 0x03, - 0xd9, 0x42, 0x68, 0x92, 0x08, 0x07, 0xd3, 0x01, - 0xe0, 0x01, 0x2c, 0x0c, 0xd9, 0x40, 0x68, 0x42, - 0x08, 0x09, 0xd2, 0x80, 0x08, 0x07, 0xd2, 0x08, - 0xa2, 0x00, 0x92, 0x2e, 0x22, 0x20, 0x23, 0x38, - 0x1c, 0x00, 0xf0, 0x96, 0xfd, 0xe6, 0xe7, 0x38, - 0x1c, 0x2e, 0x22, 0x03, 0xa3, 0x00, 0xf0, 0x81, - 0xfd, 0x0b, 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x44, - 0x60, 0xdc, 0xe7, 0x4c, 0x6d, 0xed, 0x09, 0x00, - 0x15, 0x03, 0x52, 0x63, 0x76, 0x4d, 0x61, 0x78, - 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x00, - 0x78, 0xae, 0x03, 0x20, 0x80, 0xb5, 0x07, 0x1c, - 0xc8, 0x69, 0x40, 0x78, 0x01, 0x28, 0x12, 0xd3, - 0x05, 0x28, 0x10, 0xd8, 0x0b, 0x23, 0x9b, 0x01, - 0xf9, 0x18, 0x8a, 0x68, 0x82, 0x42, 0x0a, 0xd0, - 0x88, 0x60, 0x00, 0x21, 0x38, 0x1c, 0x00, 0xf0, - 0x8b, 0xfc, 0x78, 0x69, 0x0e, 0x28, 0x02, 0xd1, - 0x38, 0x1c, 0xfa, 0xf7, 0x39, 0xfd, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0x83, 0xb0, - 0x01, 0x69, 0x13, 0x1c, 0x01, 0x29, 0x0d, 0xd1, - 0x00, 0x21, 0x02, 0xaa, 0x01, 0x92, 0x02, 0x91, - 0x02, 0x21, 0x1a, 0x1c, 0x01, 0x23, 0x00, 0x91, - 0x06, 0x21, 0x00, 0xf0, 0xd0, 0xfc, 0x03, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x46, 0x22, 0x19, 0x1c, - 0xf7, 0xf7, 0xd8, 0xfe, 0xf7, 0xe7, 0x98, 0xb5, - 0x0c, 0x1c, 0x81, 0x21, 0x07, 0x1c, 0xfb, 0xf7, - 0x6e, 0xfe, 0x00, 0x28, 0x18, 0xd0, 0xf8, 0x1d, - 0xff, 0x30, 0xba, 0x30, 0x80, 0x69, 0x00, 0x28, - 0x12, 0xd0, 0x00, 0x20, 0x00, 0x90, 0xf9, 0x1d, - 0xff, 0x31, 0x38, 0x1c, 0x06, 0x31, 0xfa, 0xf7, - 0xbd, 0xfa, 0xe0, 0x69, 0x00, 0xab, 0x81, 0x78, - 0x59, 0x70, 0x41, 0x78, 0x19, 0x70, 0x00, 0x21, - 0x38, 0x1c, 0x00, 0x9a, 0xfa, 0xf7, 0xdc, 0xfc, - 0x98, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, - 0x52, 0x25, 0x0c, 0x1c, 0x29, 0x1c, 0x07, 0x1c, - 0xfb, 0xf7, 0x49, 0xfe, 0x00, 0x28, 0x13, 0xd0, - 0xf9, 0x1d, 0x1d, 0x31, 0x38, 0x1c, 0x2a, 0x1c, - 0x0e, 0x1c, 0xfb, 0xf7, 0xcd, 0xfd, 0x00, 0x28, - 0x0a, 0xd0, 0x38, 0x1c, 0x29, 0x1c, 0x02, 0x9a, - 0xfb, 0xf7, 0x5c, 0xfe, 0x38, 0x1c, 0x31, 0x1c, - 0x2a, 0x1c, 0x23, 0x1c, 0xfb, 0xf7, 0xe0, 0xfd, - 0xed, 0x09, 0x00, 0x16, 0x03, 0x03, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf7, 0xb5, 0x81, - 0xb0, 0x53, 0x25, 0x29, 0x1c, 0x14, 0x1c, 0x07, - 0x1c, 0xfb, 0xf7, 0x27, 0xfe, 0x00, 0x28, 0x0b, - 0xd1, 0x15, 0xa2, 0x00, 0x92, 0x13, 0x22, 0x24, - 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x00, 0xf0, 0xf5, - 0xfc, 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf9, 0x1d, 0x1d, 0x31, 0x38, 0x1c, 0x2a, - 0x1c, 0x0e, 0x1c, 0xfb, 0xf7, 0x9f, 0xfd, 0x00, - 0x28, 0x08, 0xd1, 0x0b, 0xa2, 0x00, 0x92, 0x13, - 0x22, 0x24, 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x00, - 0xf0, 0xe0, 0xfc, 0xe9, 0xe7, 0x38, 0x1c, 0x29, - 0x1c, 0x22, 0x1c, 0xfb, 0xf7, 0x25, 0xfe, 0x00, - 0x28, 0xe2, 0xd1, 0x38, 0x1c, 0x31, 0x1c, 0x2a, - 0x1c, 0x02, 0x9b, 0xfb, 0xf7, 0xa7, 0xfd, 0xdb, - 0xe7, 0x4c, 0x6d, 0x52, 0x63, 0x76, 0x53, 0x77, - 0x69, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x00, - 0x00, 0x90, 0xb5, 0x14, 0x1c, 0x07, 0x1c, 0x04, - 0xf0, 0xef, 0xfb, 0xff, 0x23, 0x03, 0x33, 0x98, - 0x42, 0x01, 0xd3, 0x07, 0x21, 0x00, 0xe0, 0x05, - 0x21, 0xf8, 0x68, 0x42, 0x6a, 0x91, 0x42, 0x13, - 0xd8, 0x01, 0x23, 0x9b, 0x02, 0xf8, 0x18, 0xc0, - 0x6b, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x22, 0x00, - 0x21, 0x38, 0x1c, 0xfc, 0xf7, 0x27, 0xfb, 0x00, - 0x23, 0x21, 0x21, 0x38, 0x1c, 0x22, 0x1c, 0x00, - 0xf0, 0x24, 0xfc, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x41, 0x6a, 0x01, 0x31, 0x41, 0x62, 0x38, - 0x1c, 0x02, 0xf0, 0xe0, 0xfc, 0xf5, 0xe7, 0x90, - 0xb5, 0x07, 0x1c, 0xc0, 0x68, 0x14, 0x1c, 0x41, - 0x6a, 0x00, 0x29, 0x12, 0xd1, 0x01, 0x23, 0x9b, - 0x02, 0xf8, 0x18, 0xc0, 0x6b, 0x00, 0x28, 0x03, - 0xd0, 0x01, 0x22, 0x38, 0x1c, 0xfc, 0xf7, 0x06, - 0xfb, 0x00, 0x23, 0xed, 0x09, 0x00, 0x17, 0x03, - 0x22, 0x21, 0x38, 0x1c, 0x22, 0x1c, 0x00, 0xf0, - 0x03, 0xfc, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x41, 0x6a, 0x01, 0x39, 0x41, 0x62, 0x38, 0x1c, - 0x02, 0xf0, 0xbf, 0xfc, 0xf5, 0xe7, 0xff, 0x30, - 0x41, 0x30, 0x81, 0x68, 0x01, 0x61, 0x70, 0x47, - 0xff, 0x30, 0x41, 0x30, 0x81, 0x68, 0xc1, 0x60, - 0x70, 0x47, 0x08, 0xb5, 0x00, 0x22, 0x00, 0x92, - 0xc9, 0x69, 0x00, 0xab, 0x8a, 0x78, 0x5a, 0x70, - 0x4a, 0x78, 0x1a, 0x70, 0x00, 0x99, 0x01, 0xf0, - 0x4a, 0xfc, 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, - 0x08, 0xb5, 0x11, 0x1c, 0x06, 0x4a, 0x52, 0x68, - 0xd2, 0x09, 0x05, 0xd2, 0x05, 0xa2, 0x00, 0x92, - 0x1a, 0x23, 0x15, 0x22, 0x00, 0xf0, 0x58, 0xfc, - 0x01, 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x78, 0xae, - 0x03, 0x20, 0x4c, 0x6d, 0x52, 0x63, 0x76, 0x48, - 0x6f, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x47, 0x08, 0xb5, 0x11, 0x1c, - 0x06, 0x4a, 0x52, 0x68, 0x12, 0x0a, 0x05, 0xd2, - 0x05, 0xa2, 0x00, 0x92, 0x1a, 0x23, 0x17, 0x22, - 0x00, 0xf0, 0x3e, 0xfc, 0x01, 0xb0, 0x08, 0xbc, - 0x18, 0x47, 0x78, 0xae, 0x03, 0x20, 0x4c, 0x6d, - 0x52, 0x63, 0x76, 0x53, 0x6e, 0x69, 0x66, 0x66, - 0x52, 0x65, 0x71, 0x00, 0x00, 0x00, 0x08, 0xb5, - 0x11, 0x1c, 0x06, 0x4a, 0x52, 0x68, 0x12, 0x0a, - 0x05, 0xd2, 0x05, 0xa2, 0x00, 0x92, 0x1a, 0x23, - 0x18, 0x22, 0x00, 0xf0, 0x25, 0xfc, 0x01, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x78, 0xae, - 0x03, 0x20, 0x4c, 0x6d, 0x52, 0x63, 0x76, 0x55, - 0x6e, 0x73, 0x6e, 0x69, 0x66, 0x66, 0x52, 0x65, - 0x71, 0x00, 0x98, 0xb5, 0x07, 0x1c, 0x11, 0x48, - 0x14, 0x1c, 0x00, 0x6b, 0x00, 0x28, 0x15, 0xd0, - 0x01, 0x20, 0x83, 0x02, 0xf9, 0x18, 0xed, 0x09, - 0x00, 0x18, 0x03, 0xc8, 0x63, 0x00, 0x20, 0x11, - 0x23, 0x9b, 0x01, 0xf9, 0x18, 0x08, 0x60, 0x01, - 0x21, 0x38, 0x1c, 0xfc, 0xf7, 0x2a, 0xfa, 0x38, - 0x1c, 0x21, 0x1c, 0x38, 0x22, 0x08, 0xa3, 0x00, - 0xf0, 0xee, 0xfb, 0x98, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x05, 0xa2, 0x00, 0x92, 0x38, 0x22, 0x24, - 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x00, 0xf0, 0xf2, - 0xfb, 0xf3, 0xe7, 0x38, 0xae, 0x03, 0x20, 0x4c, - 0x6d, 0x52, 0x63, 0x76, 0x54, 0x65, 0x73, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x00, 0x00, 0x00, 0xb8, 0xb5, 0x01, 0x23, 0x9b, - 0x02, 0x07, 0x1c, 0xc0, 0x18, 0xc0, 0x6b, 0x14, - 0x1c, 0x00, 0x28, 0x3d, 0xd0, 0xc8, 0x69, 0x55, - 0x22, 0x40, 0x78, 0x42, 0x40, 0x11, 0x23, 0x9b, - 0x01, 0xf8, 0x18, 0x82, 0x61, 0xca, 0x69, 0x55, - 0x23, 0x92, 0x78, 0x5a, 0x40, 0xc2, 0x61, 0xca, - 0x69, 0xd2, 0x78, 0x5a, 0x40, 0x42, 0x60, 0xca, - 0x69, 0x12, 0x79, 0x5a, 0x40, 0x82, 0x60, 0xca, - 0x69, 0x92, 0x79, 0x5a, 0x40, 0xc2, 0x60, 0xca, - 0x69, 0xd2, 0x79, 0x5a, 0x40, 0x42, 0x61, 0x00, - 0x22, 0x02, 0x61, 0xca, 0x69, 0x45, 0x23, 0x55, - 0x7a, 0x1b, 0x01, 0xfb, 0x18, 0x5d, 0x70, 0x15, - 0x7a, 0x1d, 0x70, 0x02, 0x69, 0x0f, 0x4b, 0x5a, - 0x40, 0x02, 0x61, 0xc9, 0x69, 0x55, 0x23, 0x49, - 0x79, 0x59, 0x40, 0x01, 0x60, 0x00, 0x21, 0x01, - 0x22, 0x38, 0x1c, 0xfc, 0xf7, 0x20, 0xfa, 0x38, - 0x1c, 0x21, 0x1c, 0x39, 0x22, 0x08, 0xa3, 0x00, - 0xf0, 0x92, 0xfb, 0xb8, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x05, 0xa2, 0x00, 0x92, 0x39, 0x22, 0x24, - 0x23, 0x38, 0x1c, 0x21, 0x1c, 0x00, 0xf0, 0x96, - 0xfb, 0xf3, 0xe7, 0x55, 0x55, 0x00, 0x00, 0x4c, - 0x6d, 0x52, 0x63, 0x76, 0x54, 0x65, 0x73, 0x74, - 0x43, 0xed, 0x09, 0x00, 0x19, 0x03, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x00, 0x00, 0x00, 0x00, - 0x80, 0xb5, 0x07, 0x1c, 0xc8, 0x69, 0x42, 0x78, - 0x00, 0x2a, 0x00, 0xd1, 0x13, 0x22, 0x55, 0x21, - 0x38, 0x1c, 0xfb, 0xf7, 0xc9, 0xfc, 0x00, 0x28, - 0x19, 0xd1, 0x38, 0x1c, 0x02, 0xf0, 0x78, 0xfb, - 0x38, 0x1c, 0xfa, 0xf7, 0x3d, 0xf9, 0x0b, 0x23, - 0x9b, 0x01, 0x38, 0x69, 0xf9, 0x18, 0x01, 0x28, - 0x04, 0xd1, 0xc8, 0x69, 0x07, 0x4a, 0x42, 0x43, - 0x00, 0x21, 0x03, 0xe0, 0xc8, 0x69, 0x06, 0x4a, - 0x42, 0x43, 0x00, 0x21, 0x0b, 0x1c, 0x00, 0x21, - 0x38, 0x1c, 0xfa, 0xf7, 0x41, 0xf9, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x1d, 0x00, 0x00, - 0xa6, 0x0e, 0x00, 0x00, 0xf0, 0xb5, 0x82, 0xb0, - 0x8e, 0x69, 0x00, 0x2e, 0x4d, 0xd0, 0xca, 0x69, - 0x12, 0x78, 0xd4, 0x07, 0xe4, 0x0f, 0x57, 0x08, - 0x79, 0x2f, 0x03, 0xd1, 0x22, 0x1c, 0x02, 0xf0, - 0x83, 0xfd, 0x42, 0xe0, 0x00, 0x2f, 0x01, 0xd0, - 0x39, 0x2f, 0x07, 0xdd, 0x21, 0xa2, 0x00, 0x92, - 0x19, 0x23, 0x21, 0x1c, 0x3a, 0x1c, 0x00, 0xf0, - 0x40, 0xfb, 0x36, 0xe0, 0x21, 0x4b, 0x3a, 0x01, - 0xd2, 0x18, 0xff, 0x32, 0x81, 0x32, 0x93, 0x69, - 0x01, 0x93, 0x00, 0x2b, 0x07, 0xd1, 0x19, 0xa2, - 0x00, 0x92, 0x1a, 0x23, 0x21, 0x1c, 0x3a, 0x1c, - 0x00, 0xf0, 0x2f, 0xfb, 0x25, 0xe0, 0x15, 0x69, - 0x01, 0x23, 0xdd, 0x42, 0x09, 0xd0, 0xae, 0x42, - 0x07, 0xd2, 0x12, 0xa2, 0x00, 0x92, 0x1e, 0x23, - 0x21, 0x1c, 0x3a, 0x1c, 0x00, 0xf0, 0x21, 0xfb, - 0x17, 0xe0, 0x03, 0x69, 0x01, 0x2b, 0x03, 0xd1, - 0x52, 0x69, 0x01, 0x2a, 0x0d, 0xd1, 0x04, 0xe0, - 0x02, 0x2b, 0x0a, 0xd1, 0x52, 0x69, 0x02, 0x2a, - 0x07, 0xd1, 0x08, 0xa2, 0x00, 0x92, 0x24, 0x23, - 0x21, 0x1c, 0x3a, 0x1c, 0xed, 0x09, 0x00, 0x1a, - 0x03, 0x00, 0xf0, 0x0d, 0xfb, 0x03, 0xe0, 0x01, - 0x9b, 0x22, 0x1c, 0xcf, 0xf7, 0x10, 0xf8, 0x02, - 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x4c, 0x6d, 0x52, 0x63, 0x76, 0x4c, 0x4d, - 0x50, 0x46, 0x72, 0x6f, 0x6d, 0x4c, 0x43, 0x00, - 0x00, 0xb8, 0xa8, 0x03, 0x20, 0x80, 0xb5, 0x07, - 0x1c, 0xc0, 0x68, 0xf7, 0xf7, 0x71, 0xfc, 0x00, - 0x28, 0x0c, 0xd0, 0x3f, 0x69, 0x00, 0x2f, 0x09, - 0xd0, 0x79, 0x69, 0x03, 0x29, 0x06, 0xd1, 0x39, - 0x1c, 0xff, 0xf7, 0x8e, 0xff, 0x38, 0x1c, 0x03, - 0xa1, 0xf6, 0xf7, 0x37, 0xfe, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x73, 0x72, 0x63, - 0x5c, 0x6c, 0x6d, 0x72, 0x63, 0x76, 0x2e, 0x63, - 0x3a, 0x20, 0x32, 0x33, 0x36, 0x34, 0x00, 0x00, - 0x00, 0xff, 0x30, 0xff, 0x30, 0x00, 0x22, 0x4a, - 0x63, 0x82, 0x30, 0x02, 0x6b, 0x00, 0x2a, 0x02, - 0xd0, 0x51, 0x63, 0x01, 0x63, 0x70, 0x47, 0xc1, - 0x62, 0x01, 0x63, 0x70, 0x47, 0x05, 0x23, 0xdb, - 0x01, 0xc1, 0x18, 0xc8, 0x6a, 0x00, 0x28, 0x04, - 0xd0, 0x42, 0x6b, 0xca, 0x62, 0x00, 0x2a, 0x00, - 0xd1, 0x0a, 0x63, 0x70, 0x47, 0x88, 0xb5, 0x07, - 0x1c, 0xff, 0x30, 0xff, 0x30, 0x82, 0x30, 0x81, - 0x6a, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, 0x81, - 0x62, 0x80, 0x6a, 0x00, 0x28, 0x10, 0xd1, 0x38, - 0x1c, 0xff, 0xf7, 0xe4, 0xff, 0x00, 0x28, 0x0b, - 0xd0, 0x00, 0x90, 0x82, 0x6a, 0x01, 0x1c, 0x00, - 0x23, 0x38, 0x1c, 0x01, 0xf0, 0xd7, 0xf9, 0x38, - 0x1c, 0xff, 0xf7, 0xd8, 0xff, 0x00, 0x28, 0xf3, - 0xd1, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, - 0x69, 0x00, 0x20, 0x01, 0x29, 0x02, 0xd0, 0x02, - 0x29, 0x00, 0xd1, 0x01, 0x20, 0x70, 0x47, 0x01, - 0x69, 0x01, 0x20, 0x01, 0x29, 0x02, 0xd0, 0xed, - 0x09, 0x00, 0x1b, 0x03, 0x02, 0x29, 0x00, 0xd1, - 0x00, 0x20, 0x70, 0x47, 0xb0, 0xb5, 0x07, 0x1c, - 0x00, 0x29, 0x1c, 0xd1, 0x00, 0x2a, 0x1a, 0xd0, - 0x4a, 0x24, 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0xf7, - 0xa9, 0xfb, 0x00, 0x28, 0x13, 0xd0, 0xf9, 0x1d, - 0x21, 0x31, 0x38, 0x1c, 0x22, 0x1c, 0x0d, 0x1c, - 0xfb, 0xf7, 0x2d, 0xfb, 0x00, 0x28, 0x0a, 0xd0, - 0x00, 0x23, 0x38, 0x1c, 0x29, 0x1c, 0x22, 0x1c, - 0xfb, 0xf7, 0x45, 0xfb, 0x00, 0x22, 0x38, 0x1c, - 0x21, 0x1c, 0xfb, 0xf7, 0xb6, 0xfb, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x07, 0x1c, - 0x00, 0x2a, 0x1a, 0xd0, 0x4b, 0x24, 0x38, 0x1c, - 0x21, 0x1c, 0xfb, 0xf7, 0x87, 0xfb, 0x00, 0x28, - 0x13, 0xd0, 0xf9, 0x1d, 0x21, 0x31, 0x38, 0x1c, - 0x22, 0x1c, 0x0d, 0x1c, 0xfb, 0xf7, 0x0b, 0xfb, - 0x00, 0x28, 0x0a, 0xd0, 0x00, 0x23, 0x38, 0x1c, - 0x29, 0x1c, 0x22, 0x1c, 0xfb, 0xf7, 0x23, 0xfb, - 0x00, 0x22, 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0xf7, - 0x94, 0xfb, 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x90, 0xb5, 0x07, 0x1c, 0x00, 0x2a, 0x01, 0xd0, - 0x46, 0x24, 0x00, 0xe0, 0x47, 0x24, 0x38, 0x1c, - 0x21, 0x1c, 0xfb, 0xf7, 0x63, 0xfb, 0x00, 0x28, - 0x0f, 0xd0, 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0xf7, - 0x24, 0xfb, 0x00, 0x28, 0x09, 0xd0, 0x00, 0x22, - 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0xf7, 0x3d, 0xfb, - 0x00, 0x22, 0x38, 0x1c, 0x21, 0x1c, 0xfb, 0xf7, - 0x74, 0xfb, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xb0, 0xb5, 0x07, 0x1c, 0x00, 0x2a, 0x16, 0xd0, - 0x01, 0x23, 0x9b, 0x02, 0xfd, 0x18, 0xe8, 0x6b, - 0x00, 0x28, 0x10, 0xd0, 0x11, 0x23, 0x9b, 0x01, - 0xfc, 0x18, 0x00, 0x22, 0x38, 0x1c, 0xa1, 0x69, - 0xfc, 0xf7, 0x8d, 0xf8, 0xa0, 0x69, 0xff, 0x28, - 0x05, 0xd1, 0xed, 0x09, 0x00, 0x1c, 0x03, 0x00, - 0x21, 0x38, 0x1c, 0xfc, 0xf7, 0x34, 0xf8, 0x00, - 0x20, 0xe8, 0x63, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0xb5, 0x0b, 0x1c, 0x11, 0x1c, 0x1a, - 0x0a, 0x52, 0x06, 0x52, 0x0e, 0x11, 0x2a, 0x0a, - 0xd0, 0x12, 0x2a, 0x0c, 0xd0, 0x32, 0x2a, 0x0e, - 0xd0, 0x39, 0x2a, 0x02, 0xd1, 0x01, 0x22, 0xff, - 0xf7, 0xd1, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x01, - 0x22, 0xff, 0xf7, 0x66, 0xff, 0xf9, 0xe7, 0x01, - 0x22, 0xff, 0xf7, 0x86, 0xff, 0xf5, 0xe7, 0x01, - 0x22, 0xff, 0xf7, 0xa4, 0xff, 0xf1, 0xe7, 0x00, - 0xb5, 0x0b, 0x1c, 0x11, 0x1c, 0x1a, 0x0a, 0x52, - 0x06, 0x52, 0x0e, 0x11, 0x2a, 0x0a, 0xd0, 0x12, - 0x2a, 0x0c, 0xd0, 0x32, 0x2a, 0x0e, 0xd0, 0x39, - 0x2a, 0x02, 0xd1, 0x00, 0x22, 0xff, 0xf7, 0xb2, - 0xff, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x22, 0xff, - 0xf7, 0x47, 0xff, 0xf9, 0xe7, 0x00, 0x22, 0xff, - 0xf7, 0x67, 0xff, 0xf5, 0xe7, 0x00, 0x22, 0xff, - 0xf7, 0x85, 0xff, 0xf1, 0xe7, 0x80, 0xb5, 0x4c, - 0x21, 0x07, 0x1c, 0xfb, 0xf7, 0xed, 0xfa, 0x00, - 0x28, 0x09, 0xd0, 0xf8, 0x1d, 0xb9, 0x30, 0x01, - 0x6b, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x22, 0x1c, - 0x21, 0x38, 0x1c, 0xfb, 0xf7, 0x04, 0xfb, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x01, 0x21, 0xc1, - 0x62, 0xf9, 0xe7, 0x90, 0xb5, 0x04, 0x1c, 0xf9, - 0xf7, 0x76, 0xff, 0xcf, 0xf7, 0x6d, 0xfa, 0x07, - 0x1c, 0x09, 0xd0, 0x00, 0x22, 0x4d, 0x21, 0x20, - 0x1c, 0xfb, 0xf7, 0xf1, 0xfa, 0x00, 0x28, 0x05, - 0xd0, 0x38, 0x1c, 0xcf, 0xf7, 0x9c, 0xfa, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x07, 0xa1, 0x0c, - 0xc9, 0xe0, 0x1d, 0xb1, 0x30, 0x0c, 0xc0, 0x57, - 0x20, 0x38, 0x60, 0x20, 0x6b, 0xf8, 0x60, 0x07, - 0x20, 0x39, 0x1c, 0xcf, 0xf7, 0xed, 0x09, 0x00, - 0x1d, 0x03, 0xc0, 0xfa, 0xee, 0xe7, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0xb5, 0x00, 0x22, 0x45, 0x21, 0x07, 0x1c, - 0xfb, 0xf7, 0xd0, 0xfa, 0x00, 0x28, 0x04, 0xd1, - 0x00, 0x22, 0x45, 0x21, 0x38, 0x1c, 0xfb, 0xf7, - 0x8d, 0xfa, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x01, 0x23, 0x9b, 0x02, 0xc1, 0x18, - 0xc9, 0x6b, 0x00, 0x29, 0x06, 0xd0, 0x11, 0x23, - 0x9b, 0x01, 0xc1, 0x18, 0x89, 0x69, 0x00, 0x22, - 0xfb, 0xf7, 0xe6, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0xb5, 0x01, 0x23, 0x9b, 0x02, 0xc1, 0x18, - 0xc9, 0x6b, 0x00, 0x29, 0x06, 0xd0, 0x11, 0x23, - 0x9b, 0x01, 0xc1, 0x18, 0x89, 0x69, 0x00, 0x22, - 0xfb, 0xf7, 0xd6, 0xff, 0x08, 0xbc, 0x18, 0x47, - 0xf0, 0xb5, 0x04, 0x1c, 0x65, 0x69, 0xc0, 0x68, - 0x26, 0x69, 0xf7, 0xf7, 0xd1, 0xfa, 0x07, 0x1c, - 0x1c, 0xd0, 0xa0, 0x69, 0x03, 0x28, 0x1c, 0xd1, - 0x00, 0x2d, 0x17, 0xd0, 0xa9, 0x6a, 0x48, 0x06, - 0x40, 0x0e, 0x79, 0x28, 0x0f, 0xd0, 0x00, 0x28, - 0x0d, 0xd0, 0x39, 0x28, 0x0b, 0xdc, 0x29, 0x4a, - 0x00, 0x01, 0x80, 0x18, 0xff, 0x30, 0x81, 0x30, - 0xc3, 0x69, 0x00, 0x2b, 0x03, 0xd0, 0x38, 0x1c, - 0x32, 0x1c, 0xce, 0xf7, 0x40, 0xfe, 0x28, 0x1c, - 0xf6, 0xf7, 0xb6, 0xfe, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xcf, 0xf7, 0xf0, 0xf9, 0x00, 0x28, - 0x09, 0xd0, 0xd6, 0x21, 0x01, 0x60, 0xf9, 0x6a, - 0xc1, 0x60, 0x06, 0x61, 0x45, 0x61, 0x01, 0x1c, - 0x05, 0x20, 0xcf, 0xf7, 0x53, 0xfa, 0xf8, 0x1d, - 0xff, 0x30, 0x3a, 0x30, 0x41, 0x68, 0x00, 0x29, - 0xe8, 0xd0, 0x01, 0x39, 0x41, 0x60, 0xe5, 0xd1, - 0x78, 0x6a, 0x14, 0x28, 0x01, 0xd0, 0x19, 0x28, - 0x06, 0xd1, 0x00, 0x23, 0x15, 0x22, 0x38, 0x1c, - 0xed, 0x09, 0x00, 0x1e, 0x03, 0xf9, 0x1d, 0x1d, - 0x31, 0xfb, 0xf7, 0xe4, 0xf9, 0xb8, 0x6a, 0x25, - 0x28, 0x01, 0xd0, 0x26, 0x28, 0x06, 0xd1, 0x00, - 0x23, 0x15, 0x22, 0x38, 0x1c, 0xf9, 0x1d, 0x21, - 0x31, 0xfb, 0xf7, 0xd8, 0xf9, 0xf8, 0x69, 0x38, - 0x28, 0x05, 0xd0, 0x3e, 0x28, 0x03, 0xd0, 0x3b, - 0x28, 0x01, 0xd0, 0x41, 0x28, 0xc4, 0xd1, 0x00, - 0x23, 0x15, 0x22, 0x38, 0x1c, 0xf9, 0x1d, 0x15, - 0x31, 0xfb, 0xf7, 0xc8, 0xf9, 0xbc, 0xe7, 0x00, - 0x00, 0xb8, 0xa8, 0x03, 0x20, 0x81, 0x0b, 0x89, - 0x07, 0x01, 0xd0, 0x05, 0x20, 0x70, 0x47, 0x80, - 0x0a, 0x80, 0x07, 0x01, 0xd0, 0x03, 0x20, 0x70, - 0x47, 0x01, 0x20, 0x70, 0x47, 0xf3, 0xb5, 0x82, - 0xb0, 0x07, 0x1c, 0x00, 0x20, 0x00, 0x90, 0xcf, - 0xf7, 0x9c, 0xf9, 0x00, 0x28, 0x50, 0xd0, 0x0b, - 0x23, 0x9b, 0x01, 0xfd, 0x18, 0x2a, 0x68, 0x02, - 0x2a, 0x01, 0xd1, 0x10, 0x21, 0x04, 0xe0, 0x01, - 0x2a, 0x01, 0xd1, 0x08, 0x21, 0x00, 0xe0, 0x18, - 0x21, 0xfb, 0x1d, 0xb9, 0x33, 0x9c, 0x6b, 0x00, - 0x2c, 0x33, 0xd0, 0xde, 0x6b, 0x01, 0x96, 0xf6, - 0x07, 0xf6, 0x0f, 0x05, 0x23, 0xdb, 0x01, 0xfc, - 0x18, 0x00, 0x2e, 0x13, 0xd0, 0xab, 0x68, 0x03, - 0x2b, 0x10, 0xd3, 0xe6, 0x6b, 0xb3, 0x0a, 0x9b, - 0x07, 0x0c, 0xd0, 0x02, 0x2a, 0x02, 0xd1, 0x93, - 0x02, 0x19, 0x43, 0x07, 0xe0, 0x01, 0x2a, 0x02, - 0xd1, 0x93, 0x02, 0x19, 0x43, 0x02, 0xe0, 0x03, - 0x23, 0x9b, 0x02, 0x19, 0x43, 0x01, 0x9e, 0xb3, - 0x08, 0x13, 0xd3, 0xab, 0x68, 0x05, 0x2b, 0x10, - 0xd3, 0xe4, 0x6b, 0xa3, 0x0b, 0x9b, 0x07, 0x0c, - 0xd0, 0x02, 0x2a, 0x02, 0xd1, 0x93, 0x03, 0x19, - 0x43, 0x07, 0xe0, 0x01, 0x2a, 0x02, 0xd1, 0x93, - 0x03, 0x19, 0x43, 0x02, 0xe0, 0x03, 0x23, 0x9b, - 0x03, 0x19, 0x43, 0xed, 0x09, 0x00, 0x1f, 0x03, - 0x5e, 0x22, 0x02, 0x60, 0x3a, 0x6b, 0x01, 0x61, - 0xc2, 0x60, 0x03, 0x99, 0x41, 0x61, 0x01, 0x1c, - 0x07, 0x20, 0xcf, 0xf7, 0xb8, 0xf9, 0x00, 0x98, - 0x04, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x0f, 0xb4, 0xf0, 0xb5, 0x85, 0xb0, 0x00, 0x20, - 0x03, 0x90, 0x15, 0x1c, 0xf6, 0xf7, 0xdb, 0xfd, - 0x07, 0x1c, 0x02, 0xd1, 0x07, 0x20, 0x03, 0x90, - 0x5f, 0xe0, 0xcf, 0xf7, 0x35, 0xf9, 0x04, 0x1c, - 0x02, 0xd1, 0x07, 0x20, 0x03, 0x90, 0x58, 0xe0, - 0x01, 0x20, 0x02, 0x90, 0x0b, 0x98, 0x39, 0x1d, - 0x40, 0x00, 0x28, 0x43, 0x04, 0x91, 0x08, 0x70, - 0x48, 0x1c, 0x01, 0x90, 0x0e, 0xa8, 0x00, 0x90, - 0x0d, 0x98, 0x00, 0x25, 0x00, 0x28, 0x16, 0xd9, - 0x00, 0x98, 0x04, 0x30, 0xc1, 0x1f, 0x39, 0x39, - 0xce, 0x6b, 0x04, 0x30, 0x00, 0x90, 0x40, 0x38, - 0xc1, 0x6b, 0x01, 0x98, 0x32, 0x1c, 0xce, 0xf7, - 0x7a, 0xfd, 0x01, 0x98, 0x01, 0x35, 0x80, 0x19, - 0x01, 0x90, 0x02, 0x98, 0x80, 0x19, 0x02, 0x90, - 0x0d, 0x98, 0x85, 0x42, 0xe8, 0xd3, 0x04, 0x99, - 0xf9, 0x61, 0x02, 0x98, 0xb8, 0x61, 0x0b, 0x98, - 0x79, 0x28, 0x06, 0xd0, 0x0b, 0x98, 0x17, 0x49, - 0x00, 0x01, 0x40, 0x18, 0xff, 0x30, 0x81, 0x30, - 0x00, 0x69, 0x59, 0x20, 0x20, 0x60, 0x0a, 0x98, - 0x00, 0x6b, 0xe0, 0x60, 0x01, 0x20, 0x60, 0x61, - 0x27, 0x61, 0x03, 0x20, 0xa0, 0x61, 0x27, 0x62, - 0x00, 0x20, 0xe0, 0x61, 0x0b, 0x98, 0x03, 0x28, - 0x04, 0xd1, 0xf9, 0x69, 0x49, 0x78, 0x09, 0x02, - 0x08, 0x43, 0x09, 0xe0, 0x0b, 0x99, 0x04, 0x29, - 0x06, 0xd1, 0xf9, 0x69, 0x4a, 0x78, 0x89, 0x78, - 0x12, 0x02, 0x10, 0x43, 0x09, 0x04, 0x08, 0x43, - 0xb8, 0x62, 0x07, 0x20, 0x21, 0x1c, 0xcf, 0xf7, - 0x46, 0xf9, 0x03, 0x98, 0x05, 0xb0, 0xed, 0x09, - 0x00, 0x20, 0x03, 0xf0, 0xbc, 0x08, 0xbc, 0x04, - 0xb0, 0x18, 0x47, 0xb8, 0xa8, 0x03, 0x20, 0x0f, - 0xb5, 0x82, 0xb0, 0x0b, 0x1c, 0x04, 0xaa, 0x01, - 0x92, 0x1a, 0x1c, 0x01, 0x21, 0x00, 0x91, 0x01, - 0x23, 0x03, 0x21, 0xff, 0xf7, 0x7f, 0xff, 0x06, - 0xb0, 0x08, 0xbc, 0x18, 0x47, 0x8f, 0xb5, 0x84, - 0xb0, 0x03, 0x1c, 0x06, 0xa8, 0x0f, 0x1c, 0x07, - 0xaa, 0x03, 0x92, 0x01, 0x21, 0x01, 0x90, 0x18, - 0x1c, 0x02, 0x91, 0x01, 0x22, 0x00, 0x92, 0x04, - 0x21, 0x02, 0x23, 0x3a, 0x1c, 0xff, 0xf7, 0x6a, - 0xff, 0x08, 0xb0, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x09, 0x48, 0x00, 0x6b, 0x00, - 0x28, 0x0c, 0xd0, 0x00, 0x21, 0xc2, 0x1d, 0x2d, - 0x32, 0x93, 0x68, 0x00, 0x2b, 0x07, 0xd1, 0x01, - 0x31, 0x24, 0x32, 0x03, 0x29, 0xf8, 0xd3, 0x00, - 0x68, 0x00, 0x28, 0xf2, 0xd1, 0x00, 0x20, 0x70, - 0x47, 0x00, 0x00, 0xb8, 0xad, 0x03, 0x20, 0x80, - 0x30, 0x01, 0x6a, 0x03, 0x29, 0x01, 0xd2, 0x01, - 0x31, 0x01, 0x62, 0x70, 0x47, 0x80, 0x30, 0x01, - 0x6a, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, 0x01, - 0x62, 0x70, 0x47, 0x80, 0xb5, 0x83, 0xb0, 0x13, - 0x48, 0x07, 0x6b, 0x00, 0x2f, 0x1e, 0xd0, 0x78, - 0x69, 0x0e, 0x28, 0x03, 0xd0, 0x0f, 0x28, 0x01, - 0xd0, 0x10, 0x28, 0x14, 0xd1, 0x0b, 0x23, 0x9b, - 0x01, 0xf8, 0x18, 0x40, 0x68, 0x01, 0x28, 0x0e, - 0xd9, 0x01, 0x20, 0x02, 0x90, 0x38, 0x1c, 0xff, - 0xf7, 0x11, 0xfd, 0x01, 0x21, 0x02, 0xaa, 0x01, - 0x92, 0x00, 0x91, 0x2d, 0x21, 0x02, 0x1c, 0x01, - 0x23, 0x38, 0x1c, 0xff, 0xf7, 0x1f, 0xff, 0x3f, - 0x68, 0x00, 0x2f, 0xe0, 0xd1, 0x03, 0xb0, 0x80, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xb8, - 0xad, 0x03, 0x20, 0x80, 0xb5, 0x83, 0xb0, 0x13, - 0x48, 0xed, 0x09, 0x00, 0x21, 0x03, 0x07, 0x6b, - 0x00, 0x2f, 0x1f, 0xd0, 0x78, 0x69, 0x0e, 0x28, - 0x03, 0xd0, 0x0f, 0x28, 0x01, 0xd0, 0x10, 0x28, - 0x15, 0xd1, 0x01, 0x20, 0x0b, 0x23, 0x9b, 0x01, - 0x02, 0x90, 0xf8, 0x18, 0x40, 0x68, 0x02, 0x90, - 0x01, 0x28, 0x0c, 0xd9, 0x38, 0x1c, 0xff, 0xf7, - 0xe4, 0xfc, 0x01, 0x21, 0x02, 0xaa, 0x01, 0x92, - 0x00, 0x91, 0x2d, 0x21, 0x02, 0x1c, 0x01, 0x23, - 0x38, 0x1c, 0xff, 0xf7, 0xf2, 0xfe, 0x3f, 0x68, - 0x00, 0x2f, 0xdf, 0xd1, 0x03, 0xb0, 0x80, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xb8, 0xad, 0x03, 0x20, - 0x00, 0x29, 0x09, 0xd0, 0x01, 0x29, 0x0b, 0xd0, - 0x02, 0x29, 0x0d, 0xd0, 0x03, 0x29, 0x0f, 0xd1, - 0x10, 0x68, 0x00, 0x03, 0xc0, 0x0f, 0x70, 0x47, - 0x10, 0x68, 0x40, 0x04, 0xc0, 0x0f, 0x70, 0x47, - 0x10, 0x68, 0x00, 0x04, 0xc0, 0x0f, 0x70, 0x47, - 0x10, 0x68, 0xc0, 0x03, 0xc0, 0x0f, 0x70, 0x47, - 0x00, 0x20, 0x70, 0x47, 0xf7, 0xb5, 0x23, 0x48, - 0x00, 0x25, 0x00, 0x6b, 0x01, 0x27, 0x0c, 0x1c, - 0x00, 0x28, 0x17, 0xd0, 0x01, 0x69, 0x01, 0x29, - 0x11, 0xd1, 0x00, 0x22, 0xc1, 0x1d, 0x2d, 0x31, - 0xa1, 0x42, 0x08, 0xd0, 0x8b, 0x68, 0x00, 0x2b, - 0x05, 0xd0, 0x8e, 0x69, 0x01, 0x23, 0x00, 0x2e, - 0x00, 0xd0, 0x33, 0x1c, 0x5d, 0x19, 0x24, 0x31, - 0x01, 0x32, 0x03, 0x2a, 0xf0, 0xd3, 0x00, 0x68, - 0x00, 0x28, 0xe7, 0xd1, 0x02, 0x9a, 0x10, 0x0f, - 0x01, 0xd3, 0x02, 0x23, 0x1f, 0x43, 0x01, 0x23, - 0x02, 0x9a, 0xdb, 0x06, 0x9a, 0x43, 0x51, 0x08, - 0x60, 0x69, 0xce, 0xf7, 0x63, 0xfb, 0x00, 0x20, - 0x01, 0x22, 0x2b, 0x1c, 0x13, 0x40, 0x04, 0xd0, - 0x01, 0x30, 0x13, 0x1c, 0x83, 0x40, 0x2b, 0x40, - 0xfa, 0xd1, 0x82, 0x40, 0x50, 0x08, 0x40, 0x00, - 0xa0, 0x61, 0x40, 0x1a, 0xed, 0x09, 0x00, 0x22, - 0x03, 0x02, 0x9a, 0x40, 0x00, 0x80, 0x18, 0x00, - 0x01, 0x00, 0x09, 0xe0, 0x61, 0x03, 0xb0, 0x38, - 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0xb8, 0xad, 0x03, 0x20, 0xf0, 0xb4, 0x17, - 0x4b, 0x00, 0x27, 0x1c, 0x6b, 0x00, 0x22, 0x00, - 0x2c, 0x26, 0xd0, 0x00, 0x26, 0xe3, 0x1d, 0x2d, - 0x33, 0x98, 0x42, 0x1a, 0xd0, 0x9d, 0x68, 0x00, - 0x2d, 0x17, 0xd0, 0x1d, 0x69, 0x8d, 0x42, 0x02, - 0xd0, 0x1c, 0x20, 0xf0, 0xbc, 0x70, 0x47, 0x00, - 0x2d, 0x01, 0xd1, 0x0a, 0x20, 0xf9, 0xe7, 0x01, - 0x2d, 0x04, 0xd1, 0x01, 0x37, 0x01, 0x2f, 0x08, - 0xd3, 0x0a, 0x20, 0xf2, 0xe7, 0x02, 0x2d, 0x04, - 0xd1, 0x01, 0x32, 0x02, 0x2a, 0x01, 0xd3, 0x0a, - 0x20, 0xeb, 0xe7, 0x24, 0x33, 0x01, 0x36, 0x03, - 0x2e, 0xde, 0xd3, 0x24, 0x68, 0x00, 0x2c, 0xd8, - 0xd1, 0x00, 0x20, 0xe2, 0xe7, 0xb8, 0xad, 0x03, - 0x20, 0xf0, 0xb5, 0x0f, 0x1c, 0x00, 0x21, 0x80, - 0x23, 0x14, 0x1c, 0x1a, 0x40, 0xc5, 0x1d, 0xb9, - 0x35, 0x02, 0x26, 0x00, 0x2a, 0x0c, 0xd0, 0xe8, - 0x6b, 0x80, 0x0b, 0x09, 0xd3, 0x02, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0xbc, 0xff, 0x01, 0x1c, 0x03, - 0xd1, 0x06, 0x20, 0x78, 0x61, 0x3e, 0x61, 0x1e, - 0xe0, 0xe0, 0x09, 0x0d, 0xd3, 0xe8, 0x6b, 0x40, - 0x0b, 0x0a, 0xd3, 0x01, 0x21, 0x38, 0x1c, 0xff, - 0xf7, 0xad, 0xff, 0x01, 0x1c, 0x04, 0xd1, 0x01, - 0x20, 0x38, 0x61, 0x04, 0x20, 0x78, 0x61, 0x0e, - 0xe0, 0xa0, 0x09, 0x09, 0xd3, 0x00, 0x21, 0x38, - 0x1c, 0xff, 0xf7, 0xa0, 0xff, 0x01, 0x1c, 0x06, - 0xd1, 0x00, 0x20, 0x38, 0x61, 0x7e, 0x61, 0x02, - 0xe0, 0x00, 0x29, 0x00, 0xd1, 0x1a, 0x21, 0xf0, - 0xbc, 0x08, 0xbc, 0x08, 0x1c, 0x18, 0x47, 0xf0, - 0xb5, 0x00, 0x27, 0x04, 0x1c, 0x0d, 0x1c, 0xed, - 0x09, 0x00, 0x23, 0x03, 0xce, 0xf7, 0x56, 0xff, - 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, 0x11, 0xe0, - 0xd5, 0x21, 0x01, 0x60, 0xe6, 0x1d, 0x9d, 0x36, - 0xc4, 0x60, 0x0c, 0xce, 0xc1, 0x1d, 0x09, 0x31, - 0x0c, 0xc1, 0xe1, 0x1d, 0x79, 0x31, 0xc9, 0x6a, - 0x81, 0x61, 0xc5, 0x61, 0x01, 0x1c, 0x05, 0x20, - 0xce, 0xf7, 0xaf, 0xff, 0x38, 0x1c, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x00, 0x24, - 0x05, 0x1c, 0x0f, 0x1c, 0xce, 0xf7, 0x36, 0xff, - 0x00, 0x28, 0x01, 0xd1, 0x07, 0x24, 0x1c, 0xe0, - 0x66, 0x21, 0x01, 0x60, 0x29, 0x6b, 0xc1, 0x60, - 0xf9, 0x68, 0x41, 0x61, 0x39, 0x69, 0x00, 0x29, - 0x17, 0xd0, 0x01, 0x29, 0x18, 0xd0, 0x02, 0x29, - 0x01, 0xd1, 0x07, 0x21, 0x81, 0x61, 0x79, 0x69, - 0x49, 0x00, 0xc1, 0x61, 0x39, 0x68, 0x01, 0x61, - 0xf9, 0x69, 0x01, 0x62, 0xe9, 0x6a, 0x49, 0x69, - 0x41, 0x62, 0x01, 0x1c, 0x07, 0x20, 0xce, 0xf7, - 0x84, 0xff, 0x20, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x05, 0x21, 0x81, 0x61, 0xea, 0xe7, - 0x06, 0x21, 0x81, 0x61, 0xe7, 0xe7, 0xb0, 0xb5, - 0x00, 0x27, 0x0c, 0x1c, 0x05, 0x1c, 0xce, 0xf7, - 0x05, 0xff, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, - 0x09, 0xe0, 0x67, 0x21, 0x01, 0x60, 0x29, 0x6b, - 0xc1, 0x60, 0x21, 0x68, 0x01, 0x61, 0x01, 0x1c, - 0x07, 0x20, 0xce, 0xf7, 0x66, 0xff, 0x38, 0x1c, - 0xb0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb4, - 0x00, 0x27, 0xc2, 0x1d, 0x2d, 0x32, 0xfb, 0x00, - 0xdb, 0x19, 0x9b, 0x00, 0x1b, 0x18, 0xdb, 0x6b, - 0x8b, 0x42, 0x02, 0xd1, 0x10, 0x1c, 0x80, 0xbc, - 0x70, 0x47, 0x24, 0x32, 0x01, 0x37, 0x03, 0x2f, - 0xf1, 0xd3, 0x00, 0x20, 0xf7, 0xe7, 0x80, 0xb4, - 0x00, 0x29, 0x10, 0xd0, 0x00, 0x27, 0xc2, 0x1d, - 0x2d, 0x32, 0xed, 0x09, 0x00, 0x24, 0x03, 0xfb, - 0x00, 0xdb, 0x19, 0x9b, 0x00, 0x1b, 0x18, 0x9b, - 0x6b, 0x8b, 0x42, 0x02, 0xd1, 0x10, 0x1c, 0x80, - 0xbc, 0x70, 0x47, 0x24, 0x32, 0x01, 0x37, 0x03, - 0x2f, 0xf1, 0xd3, 0x00, 0x20, 0xf7, 0xe7, 0xf7, - 0xb5, 0xc5, 0x1d, 0xc6, 0x1d, 0x99, 0x36, 0x2d, - 0x35, 0x14, 0x1c, 0x07, 0x1c, 0xae, 0x42, 0x28, - 0xd9, 0xa8, 0x68, 0x4b, 0x28, 0x29, 0xd0, 0x0c, - 0xdc, 0x48, 0x28, 0x26, 0xd0, 0x04, 0xdc, 0x00, - 0x28, 0x19, 0xd0, 0x47, 0x28, 0x17, 0xd1, 0x20, - 0xe0, 0x49, 0x28, 0x1e, 0xd0, 0x4a, 0x28, 0x12, - 0xd1, 0x1b, 0xe0, 0x4c, 0x28, 0x19, 0xd0, 0x4d, - 0x28, 0x17, 0xd0, 0x4e, 0x28, 0x01, 0xd0, 0x4f, - 0x28, 0x09, 0xd1, 0x38, 0x1c, 0xff, 0xf7, 0x18, - 0xfe, 0x28, 0x68, 0x01, 0x99, 0x43, 0x1c, 0x38, - 0x1c, 0x22, 0x1c, 0xf9, 0xf7, 0x1a, 0xfd, 0x00, - 0x20, 0x68, 0x60, 0xa8, 0x60, 0x24, 0x35, 0xae, - 0x42, 0xd6, 0xd8, 0x03, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x38, 0x1c, 0xff, 0xf7, 0x04, - 0xfe, 0x28, 0x68, 0x42, 0x1c, 0x38, 0x1c, 0x21, - 0x1c, 0xf9, 0xf7, 0xdd, 0xfc, 0xeb, 0xe7, 0xf8, - 0xb5, 0x00, 0x26, 0x04, 0x1c, 0x15, 0x1c, 0x0f, - 0x1c, 0x00, 0x2a, 0x0d, 0xd1, 0x20, 0x69, 0x01, - 0x28, 0x02, 0xd1, 0x4b, 0x20, 0xb8, 0x60, 0x01, - 0xe0, 0x4c, 0x20, 0xb8, 0x60, 0x20, 0x1c, 0x39, - 0x1c, 0xba, 0x68, 0xf6, 0xf7, 0x40, 0xff, 0x17, - 0xe0, 0x20, 0x1c, 0xff, 0xf7, 0x1d, 0xfb, 0x0c, - 0xa2, 0x00, 0x92, 0x01, 0x1c, 0x20, 0x1c, 0x2b, - 0x22, 0x2b, 0x1c, 0xff, 0xf7, 0xa9, 0xfd, 0x06, - 0x1c, 0x00, 0x20, 0x78, 0x60, 0xb8, 0x60, 0x20, - 0x1c, 0xff, 0xf7, 0xd6, 0xfd, 0x38, 0x68, 0x42, - 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0xf9, 0xf7, 0xaf, - 0xfc, 0x30, 0x1c, 0xf8, 0xbc, 0xed, 0x09, 0x00, - 0x25, 0x03, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, - 0x4c, 0x6d, 0x53, 0x63, 0x6f, 0x48, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x00, 0x00, - 0xf0, 0xb5, 0x8d, 0xb0, 0x0d, 0x1c, 0xf6, 0xf7, - 0x03, 0xff, 0x07, 0x1c, 0x01, 0xd1, 0x02, 0x25, - 0x9c, 0xe0, 0x16, 0x21, 0x38, 0x1c, 0xfa, 0xf7, - 0xa6, 0xfe, 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x25, - 0x83, 0xe0, 0x49, 0x21, 0x38, 0x1c, 0xff, 0xf7, - 0x43, 0xff, 0x00, 0x28, 0x05, 0xd1, 0x47, 0x21, - 0x38, 0x1c, 0xff, 0xf7, 0x3d, 0xff, 0x00, 0x28, - 0x01, 0xd0, 0x0c, 0x25, 0x75, 0xe0, 0xfb, 0xf7, - 0xa8, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x0c, 0x25, - 0x6f, 0xe0, 0xfb, 0xf7, 0x13, 0xfc, 0x00, 0x28, - 0x01, 0xd0, 0x0c, 0x25, 0x69, 0xe0, 0xf8, 0x1d, - 0xb9, 0x30, 0x81, 0x6b, 0x00, 0x29, 0x02, 0xd0, - 0xc0, 0x6b, 0x00, 0x0b, 0x01, 0xd2, 0x1a, 0x25, - 0x5f, 0xe0, 0xfa, 0x1d, 0x3a, 0x4e, 0xf5, 0x32, - 0x38, 0x1c, 0xb1, 0x6b, 0xff, 0xf7, 0xe2, 0xfd, - 0x00, 0x28, 0x01, 0xd1, 0x1a, 0x25, 0x54, 0xe0, - 0xf8, 0x1d, 0x79, 0x30, 0x00, 0x6a, 0x01, 0x28, - 0x01, 0xd3, 0x0a, 0x25, 0x4d, 0xe0, 0x00, 0x21, - 0x38, 0x1c, 0xff, 0xf7, 0x0d, 0xff, 0x04, 0x1c, - 0x01, 0xd1, 0x0a, 0x25, 0x45, 0xe0, 0x38, 0x1c, - 0x21, 0x1c, 0x2a, 0x1c, 0xff, 0xf7, 0x60, 0xfe, - 0x05, 0x1c, 0x3e, 0xd1, 0xb0, 0x6b, 0xe0, 0x60, - 0x38, 0x69, 0x01, 0x28, 0x09, 0xd1, 0x20, 0x68, - 0x47, 0x22, 0x01, 0x30, 0x60, 0x60, 0x38, 0x1c, - 0x21, 0x1c, 0xa2, 0x60, 0xf6, 0xf7, 0xb2, 0xfe, - 0x2c, 0xe0, 0x00, 0x20, 0x0c, 0x90, 0x60, 0x60, - 0xa0, 0x61, 0x49, 0x20, 0xa0, 0x60, 0x38, 0x1c, - 0xff, 0xf7, 0x81, 0xfa, 0xe2, 0x1d, 0x05, 0x32, - 0xed, 0x09, 0x00, 0x26, 0x03, 0x03, 0x1c, 0x0b, - 0x92, 0x01, 0x21, 0x0a, 0x91, 0xe0, 0x1d, 0x09, - 0x30, 0x01, 0x22, 0x08, 0x92, 0x09, 0x90, 0xe1, - 0x1d, 0x0d, 0x31, 0xe2, 0x1d, 0x11, 0x32, 0x07, - 0x91, 0x01, 0x20, 0x06, 0x90, 0x01, 0x21, 0x05, - 0x92, 0x01, 0x22, 0x04, 0x91, 0x0c, 0xa8, 0x03, - 0x90, 0x21, 0x1d, 0x02, 0x92, 0x1a, 0x1c, 0x01, - 0x91, 0x01, 0x20, 0x00, 0x90, 0x2b, 0x21, 0x06, - 0x23, 0x38, 0x1c, 0xff, 0xf7, 0x76, 0xfc, 0x05, - 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x23, 0xfd, 0xce, - 0xf7, 0xb4, 0xfd, 0x00, 0x28, 0x0c, 0xd0, 0xd2, - 0x21, 0x01, 0x60, 0x85, 0x61, 0xf9, 0x6a, 0xc1, - 0x60, 0x00, 0x21, 0x01, 0x61, 0x01, 0x21, 0x41, - 0x61, 0x01, 0x1c, 0x05, 0x20, 0xce, 0xf7, 0x14, - 0xfe, 0x28, 0x1c, 0x0d, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x38, 0xae, 0x03, - 0x20, 0xb7, 0xb5, 0x84, 0xb0, 0x04, 0x1c, 0x03, - 0x29, 0x01, 0xd9, 0x1f, 0x27, 0x25, 0xe0, 0xc8, - 0x00, 0x40, 0x18, 0x80, 0x00, 0x05, 0x19, 0xa8, - 0x69, 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x27, 0x1c, - 0xe0, 0x20, 0x1c, 0xff, 0xf7, 0x2e, 0xfa, 0x03, - 0x1c, 0x06, 0xaa, 0x03, 0x92, 0x01, 0x22, 0x00, - 0x92, 0xe8, 0x1d, 0x01, 0x21, 0x02, 0x91, 0x0d, - 0x30, 0x1a, 0x1c, 0x02, 0x23, 0x01, 0x90, 0x2c, - 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x36, 0xfc, 0x07, - 0x1c, 0x4f, 0x20, 0xa8, 0x61, 0x20, 0x1c, 0xe9, - 0x1d, 0x09, 0x31, 0xff, 0xf7, 0x67, 0xfe, 0xff, - 0xf7, 0x17, 0xfd, 0x38, 0x1c, 0x07, 0xb0, 0xb0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x04, - 0x1c, 0x0d, 0x1c, 0x17, 0x1c, 0xff, 0xf7, 0x09, - 0xfa, 0xb8, 0x42, 0x0a, 0xd1, 0x20, 0x69, 0x02, - 0x28, 0x01, 0xd1, 0x00, 0x2d, 0x23, 0xd0, 0x49, - 0x21, 0x20, 0x1c, 0xed, 0x09, 0x00, 0x27, 0x03, - 0xff, 0xf7, 0x67, 0xfe, 0x07, 0x1c, 0x04, 0xe0, - 0x4d, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x61, 0xfe, - 0x07, 0x1c, 0x00, 0x2f, 0x16, 0xd0, 0x00, 0x2d, - 0x08, 0xd1, 0x4e, 0x20, 0xb8, 0x60, 0xff, 0xf7, - 0xc6, 0xfc, 0x20, 0x1c, 0x39, 0x1c, 0xff, 0xf7, - 0x0b, 0xfe, 0x05, 0xe0, 0x00, 0x20, 0x78, 0x60, - 0xb8, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0xb4, 0xfc, - 0x38, 0x68, 0x42, 0x1c, 0x20, 0x1c, 0x29, 0x1c, - 0xf9, 0xf7, 0x8d, 0xfb, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xb0, 0xb5, 0x0d, 0x1c, 0x4f, 0x21, - 0x04, 0x1c, 0xff, 0xf7, 0x3e, 0xfe, 0x07, 0x1c, - 0x0c, 0xd0, 0x00, 0x20, 0x78, 0x60, 0xb8, 0x60, - 0x20, 0x1c, 0xff, 0xf7, 0x9d, 0xfc, 0x38, 0x68, - 0x00, 0x21, 0x43, 0x1c, 0x20, 0x1c, 0x2a, 0x1c, - 0xf9, 0xf7, 0x9f, 0xfb, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf7, 0xb5, 0x82, 0xb0, 0x04, 0x1c, - 0xc8, 0x69, 0x0e, 0x1c, 0x41, 0x78, 0x6c, 0x48, - 0x00, 0x25, 0x01, 0x91, 0x40, 0x68, 0x00, 0x27, - 0x00, 0x0b, 0x08, 0xd2, 0x6a, 0xa2, 0x00, 0x92, - 0x2b, 0x22, 0x1a, 0x23, 0x20, 0x1c, 0x04, 0x99, - 0xff, 0xf7, 0x4a, 0xfc, 0xc5, 0xe0, 0x82, 0x21, - 0x20, 0x1c, 0xfa, 0xf7, 0x6d, 0xfd, 0x00, 0x28, - 0x01, 0xd1, 0x0c, 0x25, 0xa4, 0xe0, 0x01, 0x99, - 0x20, 0x1c, 0xff, 0xf7, 0x1e, 0xfe, 0x07, 0x1c, - 0x05, 0xd0, 0xb8, 0x68, 0x00, 0x28, 0x02, 0xd0, - 0x1e, 0x25, 0x00, 0x27, 0x98, 0xe0, 0x20, 0x1c, - 0xff, 0xf7, 0x96, 0xf9, 0x04, 0x99, 0x88, 0x42, - 0x07, 0xd1, 0x49, 0x21, 0x20, 0x1c, 0xff, 0xf7, - 0xf8, 0xfd, 0x07, 0x1c, 0x01, 0xd1, 0x0a, 0x25, - 0x8a, 0xe0, 0x20, 0x1c, 0xff, 0xf7, 0x90, 0xf9, - 0x04, 0x99, 0x88, 0x42, 0x21, 0xd1, 0xfb, 0xf7, - 0x5d, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xed, 0x09, - 0x00, 0x28, 0x03, 0x4f, 0xa2, 0x00, 0x92, 0x2b, - 0x22, 0x32, 0x25, 0x20, 0x1c, 0x2b, 0x1c, 0x04, - 0x99, 0xff, 0xf7, 0x14, 0xfc, 0x13, 0xe0, 0xfb, - 0xf7, 0xc0, 0xfa, 0x00, 0x28, 0x09, 0xd0, 0x48, - 0xa2, 0x00, 0x92, 0x2b, 0x22, 0x0d, 0x25, 0x20, - 0x1c, 0x2b, 0x1c, 0x04, 0x99, 0xff, 0xf7, 0x06, - 0xfc, 0x05, 0xe0, 0xe0, 0x1d, 0x79, 0x30, 0x00, - 0x6a, 0x01, 0x28, 0x1b, 0xd3, 0x0a, 0x25, 0x00, - 0x2f, 0x5e, 0xd0, 0xf0, 0x69, 0x00, 0x79, 0x78, - 0x61, 0xf1, 0x69, 0x49, 0x79, 0x39, 0x61, 0xf2, - 0x69, 0x92, 0x79, 0xfa, 0x60, 0x22, 0x69, 0x02, - 0x2a, 0x05, 0xd1, 0xf2, 0x69, 0x92, 0x78, 0x3a, - 0x62, 0xf2, 0x69, 0xd2, 0x78, 0xba, 0x61, 0x01, - 0x9a, 0x02, 0x29, 0x7a, 0x60, 0x13, 0xd1, 0x06, - 0x28, 0x1c, 0xd0, 0x19, 0xe0, 0x00, 0x21, 0x20, - 0x1c, 0xff, 0xf7, 0xad, 0xfd, 0x07, 0x1c, 0x01, - 0xd1, 0x0a, 0x25, 0x3f, 0xe0, 0x20, 0x69, 0x01, - 0x28, 0xdb, 0xd1, 0x38, 0x68, 0x41, 0x1c, 0x01, - 0x91, 0x00, 0x20, 0xb8, 0x61, 0xd5, 0xe7, 0x01, - 0x29, 0x02, 0xd1, 0x04, 0x28, 0x06, 0xd0, 0x03, - 0xe0, 0x00, 0x29, 0x03, 0xd1, 0x02, 0x28, 0x01, - 0xd0, 0x1c, 0x25, 0x2b, 0xe0, 0xba, 0x69, 0x82, - 0x42, 0x01, 0xd2, 0x50, 0x08, 0x01, 0xd3, 0x1b, - 0x25, 0x24, 0xe0, 0x38, 0x1c, 0xff, 0xf7, 0xb5, - 0xfc, 0x05, 0x1c, 0x1f, 0xd1, 0x24, 0x4a, 0xf9, - 0x68, 0x20, 0x1c, 0xff, 0xf7, 0x4a, 0xfc, 0x00, - 0x28, 0x01, 0xd1, 0x1d, 0x25, 0x16, 0xe0, 0xb8, - 0x68, 0x49, 0x28, 0x06, 0xd1, 0x48, 0x22, 0x20, - 0x1c, 0x39, 0x1c, 0xba, 0x60, 0xf6, 0xf7, 0x35, - 0xfd, 0x25, 0xe0, 0x4a, 0x20, 0xb8, 0x60, 0x20, - 0x1c, 0xff, 0xf7, 0xd1, 0xfb, 0x38, 0x68, 0x41, - 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0x03, 0xfd, 0x1a, - 0xe0, 0xed, 0x09, 0x00, 0x29, 0x03, 0x00, 0x2d, - 0x18, 0xd0, 0x0f, 0xa2, 0x00, 0x92, 0x2b, 0x22, - 0x20, 0x1c, 0x2b, 0x1c, 0x04, 0x99, 0xff, 0xf7, - 0x94, 0xfb, 0x00, 0x2f, 0x0e, 0xd0, 0xb8, 0x68, - 0x49, 0x28, 0x0b, 0xd1, 0x00, 0x20, 0x78, 0x60, - 0xb8, 0x60, 0x20, 0x1c, 0xff, 0xf7, 0xbd, 0xfb, - 0x38, 0x68, 0x42, 0x1c, 0x20, 0x1c, 0x29, 0x1c, - 0xf9, 0xf7, 0x96, 0xfa, 0x05, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x78, 0xae, 0x03, 0x20, - 0x4c, 0x6d, 0x53, 0x63, 0x6f, 0x52, 0x63, 0x76, - 0x53, 0x43, 0x4f, 0x4c, 0x69, 0x6e, 0x6b, 0x52, - 0x65, 0x71, 0x00, 0x00, 0x7c, 0xae, 0x03, 0x20, - 0xf0, 0xb5, 0x82, 0xb0, 0x07, 0x1c, 0xc8, 0x69, - 0x15, 0x1c, 0x46, 0x78, 0x82, 0x78, 0x1c, 0x48, - 0x01, 0x92, 0x40, 0x68, 0x00, 0x0b, 0x08, 0xd2, - 0x1a, 0xa2, 0x00, 0x92, 0x2b, 0x22, 0x1a, 0x23, - 0x38, 0x1c, 0x29, 0x1c, 0xff, 0xf7, 0x5d, 0xfb, - 0x26, 0xe0, 0x83, 0x21, 0x38, 0x1c, 0xfa, 0xf7, - 0x80, 0xfc, 0x00, 0x28, 0x1a, 0xd0, 0x38, 0x1c, - 0x31, 0x1c, 0xff, 0xf7, 0x33, 0xfd, 0x04, 0x1c, - 0x14, 0xd0, 0xa0, 0x68, 0x00, 0x28, 0x11, 0xd0, - 0x38, 0x1c, 0xff, 0xf7, 0x7e, 0xfb, 0x38, 0x1c, - 0x21, 0x1c, 0xff, 0xf7, 0xfb, 0xfc, 0xff, 0xf7, - 0xab, 0xfb, 0x00, 0x20, 0x60, 0x60, 0xa0, 0x60, - 0x38, 0x1c, 0x00, 0x21, 0x33, 0x1c, 0x01, 0x9a, - 0xf9, 0xf7, 0x78, 0xfa, 0x38, 0x1c, 0x29, 0x1c, - 0x2c, 0x22, 0x04, 0xa3, 0xff, 0xf7, 0x26, 0xfb, - 0x02, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x78, 0xae, 0x03, 0x20, 0x4c, 0x6d, 0x53, 0x63, - 0x6f, 0x52, 0x63, 0x76, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x53, 0x43, 0x4f, 0x4c, 0x69, 0x6e, - 0x6b, 0x52, 0x65, 0x71, 0x00, 0x00, 0x00, 0x00, - 0x90, 0xb5, 0x8d, 0xb0, 0xed, 0x09, 0x00, 0x2a, - 0x03, 0x4a, 0x69, 0x4c, 0x6a, 0x21, 0x1c, 0x07, - 0x1c, 0xff, 0xf7, 0xc6, 0xfb, 0x0c, 0x90, 0x4d, - 0x20, 0xa0, 0x60, 0x38, 0x1c, 0xff, 0xf7, 0x7f, - 0xf8, 0xe2, 0x1d, 0x05, 0x32, 0x03, 0x1c, 0x0b, - 0x92, 0x01, 0x21, 0x0a, 0x91, 0xe0, 0x1d, 0x09, - 0x30, 0x01, 0x22, 0x08, 0x92, 0x09, 0x90, 0xe1, - 0x1d, 0x0d, 0x31, 0xe2, 0x1d, 0x11, 0x32, 0x07, - 0x91, 0x01, 0x20, 0x06, 0x90, 0x01, 0x21, 0x05, - 0x92, 0x01, 0x22, 0x04, 0x91, 0x0c, 0xa8, 0x03, - 0x90, 0x21, 0x1d, 0x02, 0x92, 0x1a, 0x1c, 0x01, - 0x91, 0x01, 0x20, 0x00, 0x90, 0x2b, 0x21, 0x06, - 0x23, 0x38, 0x1c, 0xff, 0xf7, 0x6c, 0xfa, 0x0d, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x98, - 0xb5, 0x4a, 0x69, 0x4c, 0x6a, 0x00, 0x92, 0x21, - 0x6a, 0xa2, 0x69, 0x63, 0x69, 0x07, 0x1c, 0xf6, - 0xf7, 0x8d, 0xfc, 0x40, 0x00, 0xe0, 0x61, 0xff, - 0xf7, 0x19, 0xfb, 0x38, 0x1c, 0xff, 0xf7, 0x47, - 0xf8, 0x01, 0x1c, 0x38, 0x1c, 0x2b, 0x22, 0x09, - 0x4b, 0xff, 0xf7, 0xc6, 0xfa, 0x4e, 0x20, 0xa0, - 0x60, 0x38, 0x1c, 0x21, 0x1c, 0xff, 0xf7, 0x53, - 0xfc, 0x20, 0x68, 0x00, 0x21, 0x42, 0x1c, 0x38, - 0x1c, 0xf9, 0xf7, 0xdc, 0xf9, 0x98, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xa4, 0x1e, 0x03, - 0x20, 0x90, 0xb5, 0x8d, 0xb0, 0x4a, 0x69, 0x4c, - 0x6a, 0x21, 0x1c, 0x07, 0x1c, 0xff, 0xf7, 0x68, - 0xfb, 0x0c, 0x90, 0x49, 0x20, 0xa0, 0x60, 0x38, - 0x1c, 0xff, 0xf7, 0x19, 0xf8, 0xe2, 0x1d, 0x05, - 0x32, 0x03, 0x1c, 0x0b, 0x92, 0x01, 0x21, 0x0a, - 0x91, 0xe0, 0x1d, 0x09, 0x30, 0x01, 0x22, 0x08, - 0x92, 0x09, 0x90, 0xe1, 0x1d, 0x0d, 0x31, 0xe2, - 0x1d, 0x11, 0x32, 0x07, 0x91, 0x01, 0x20, 0x06, - 0x90, 0x01, 0x21, 0x05, 0x92, 0x01, 0x22, 0xed, - 0x09, 0x00, 0x2b, 0x03, 0x04, 0x91, 0x0c, 0xa8, - 0x03, 0x90, 0x21, 0x1d, 0x02, 0x92, 0x1a, 0x1c, - 0x01, 0x91, 0x01, 0x20, 0x00, 0x90, 0x2b, 0x21, - 0x06, 0x23, 0x38, 0x1c, 0xff, 0xf7, 0x0e, 0xfa, - 0x0d, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x98, 0xb5, 0x4a, 0x69, 0x4c, 0x6a, 0x00, 0x92, - 0x21, 0x6a, 0xa2, 0x69, 0x63, 0x69, 0x07, 0x1c, - 0xf6, 0xf7, 0x2f, 0xfc, 0x40, 0x00, 0xe0, 0x61, - 0x4e, 0x20, 0xa0, 0x60, 0xff, 0xf7, 0xb9, 0xfa, - 0x38, 0x1c, 0xfe, 0xf7, 0xdf, 0xff, 0x01, 0x1c, - 0x38, 0x1c, 0x2b, 0x22, 0x08, 0x4b, 0xff, 0xf7, - 0x66, 0xfa, 0x38, 0x1c, 0x21, 0x1c, 0xff, 0xf7, - 0xf5, 0xfb, 0x20, 0x68, 0x00, 0x21, 0x42, 0x1c, - 0x38, 0x1c, 0xf9, 0xf7, 0x7e, 0xf9, 0x98, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xd8, 0x22, - 0x03, 0x20, 0xf7, 0xb5, 0x00, 0x24, 0x0d, 0x1c, - 0x06, 0x1c, 0xce, 0xf7, 0x1f, 0xfb, 0x07, 0x1c, - 0x01, 0xd1, 0x07, 0x24, 0x0b, 0xe0, 0xff, 0xf7, - 0x70, 0xfa, 0x00, 0x28, 0x0c, 0xd0, 0xdb, 0x20, - 0x38, 0x60, 0x0c, 0x24, 0x05, 0x20, 0x39, 0x1c, - 0xfc, 0x60, 0xce, 0xf7, 0x7e, 0xfb, 0x20, 0x1c, - 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x08, 0x48, 0x02, 0x9a, 0x42, 0x63, 0x50, 0x20, - 0x38, 0x60, 0xf8, 0x1d, 0x05, 0x30, 0x31, 0x1c, - 0xf6, 0xf7, 0xfd, 0xfa, 0x07, 0x20, 0x39, 0x1c, - 0x3d, 0x75, 0xce, 0xf7, 0x6a, 0xfb, 0xea, 0xe7, - 0x00, 0x00, 0xf8, 0xad, 0x03, 0x20, 0x80, 0xb5, - 0x00, 0x27, 0xce, 0xf7, 0xf3, 0xfa, 0x00, 0x28, - 0x01, 0xd1, 0x07, 0x27, 0x07, 0xe0, 0x51, 0x21, - 0x01, 0x60, 0x01, 0x21, 0xc1, 0x60, 0x01, 0x1c, - 0x07, 0x20, 0xce, 0xf7, 0x56, 0xfb, 0x38, 0x1c, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0xb5, - 0x00, 0x27, 0xed, 0x09, 0x00, 0x2c, 0x03, 0x0c, - 0x1c, 0x05, 0x1c, 0x09, 0x9e, 0xce, 0xf7, 0xdc, - 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, 0x0c, - 0xe0, 0x52, 0x21, 0x01, 0x60, 0x04, 0x61, 0xc5, - 0x60, 0x02, 0x9a, 0x01, 0x1c, 0x42, 0x61, 0x03, - 0x9b, 0x83, 0x61, 0xc6, 0x61, 0x07, 0x20, 0xce, - 0xf7, 0x3a, 0xfb, 0x38, 0x1c, 0x04, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xff, 0xb5, 0x86, - 0xb0, 0x07, 0x1c, 0x08, 0x98, 0x0f, 0x9d, 0x01, - 0x02, 0x09, 0x0a, 0x04, 0xa8, 0x10, 0x9e, 0xf6, - 0xf7, 0xb8, 0xfa, 0x26, 0x48, 0x22, 0xa2, 0xc1, - 0x6b, 0x80, 0x6b, 0x03, 0x92, 0x05, 0x9a, 0x01, - 0x90, 0x00, 0x92, 0x02, 0x91, 0x09, 0x99, 0x08, - 0x98, 0x01, 0x22, 0x04, 0x9b, 0xf8, 0xf7, 0xf7, - 0xfb, 0x04, 0x1c, 0x2e, 0xd0, 0x07, 0x99, 0x00, - 0x22, 0xe1, 0x62, 0xe1, 0x1d, 0x14, 0x98, 0xb9, - 0x31, 0x48, 0x61, 0x01, 0x21, 0x20, 0x1c, 0xfa, - 0xf7, 0x2a, 0xfb, 0x05, 0x23, 0xdb, 0x01, 0xe0, - 0x18, 0x85, 0x63, 0x55, 0x20, 0x38, 0x60, 0xfc, - 0x60, 0x08, 0xa9, 0x0c, 0xc9, 0xf8, 0x1d, 0x09, - 0x30, 0x0c, 0xc0, 0x3e, 0x62, 0x11, 0x98, 0x78, - 0x62, 0xbd, 0x62, 0x12, 0x98, 0xf8, 0x85, 0x13, - 0x98, 0xb8, 0x85, 0xe1, 0x68, 0xf8, 0x1d, 0x1c, - 0x31, 0x60, 0xc9, 0x11, 0x30, 0x60, 0xc0, 0xe0, - 0x68, 0x40, 0x6a, 0x38, 0x63, 0xe0, 0x68, 0x80, - 0x6a, 0x78, 0x63, 0x07, 0x20, 0x39, 0x1c, 0xce, - 0xf7, 0xea, 0xfa, 0x20, 0x1c, 0x0a, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, - 0x63, 0x3a, 0x20, 0x33, 0x30, 0x35, 0x00, 0xd8, - 0xeb, 0x03, 0x20, 0xff, 0xb5, 0x86, 0xb0, 0x00, - 0x24, 0x15, 0x1c, 0x06, 0x1c, 0xce, 0xf7, 0x64, - 0xfa, 0x07, 0x1c, 0x01, 0xd1, 0xed, 0x09, 0x00, - 0x2d, 0x03, 0x07, 0x24, 0x2c, 0xe0, 0xff, 0xf7, - 0xb5, 0xf9, 0x00, 0x28, 0x01, 0xd0, 0x0c, 0x24, - 0x1b, 0xe0, 0x07, 0x98, 0x29, 0x1c, 0xf8, 0xf7, - 0xd9, 0xfc, 0x00, 0x28, 0x01, 0xd0, 0x0b, 0x24, - 0x13, 0xe0, 0x11, 0xaa, 0x07, 0xca, 0x03, 0x90, - 0x05, 0x92, 0x10, 0x9a, 0x09, 0x98, 0x04, 0x91, - 0x0f, 0x99, 0x00, 0x90, 0x01, 0x91, 0x31, 0x1c, - 0x38, 0x1c, 0x02, 0x92, 0x07, 0x9a, 0x2b, 0x1c, - 0xff, 0xf7, 0x7b, 0xff, 0x00, 0x28, 0x0b, 0xd1, - 0x07, 0x24, 0xd2, 0x20, 0x38, 0x60, 0xbc, 0x61, - 0xfe, 0x60, 0x00, 0x20, 0x38, 0x61, 0x78, 0x61, - 0x05, 0x20, 0x39, 0x1c, 0xce, 0xf7, 0xa2, 0xfa, - 0x20, 0x1c, 0x0a, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xff, 0xb5, 0x83, 0xb0, 0x00, 0x24, - 0x00, 0x26, 0x15, 0x1c, 0x00, 0x2a, 0x02, 0xd1, - 0x03, 0x21, 0x02, 0x91, 0x01, 0xe0, 0x04, 0x21, - 0x02, 0x91, 0xf6, 0xf7, 0xdd, 0xfa, 0x07, 0x1c, - 0x01, 0xd1, 0x02, 0x24, 0x10, 0xe0, 0x4a, 0x21, - 0x38, 0x1c, 0xff, 0xf7, 0x25, 0xfb, 0x06, 0x1c, - 0x0a, 0xd1, 0x02, 0x99, 0x38, 0x1c, 0xfa, 0xf7, - 0x7a, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x24, - 0x02, 0xe0, 0xf8, 0x1d, 0x79, 0x30, 0x05, 0x63, - 0xce, 0xf7, 0x09, 0xfa, 0x00, 0x28, 0x01, 0xd1, - 0x07, 0x24, 0x60, 0xe0, 0xd3, 0x21, 0x01, 0x60, - 0x04, 0x99, 0xc1, 0x60, 0x04, 0x61, 0x01, 0x1c, - 0x05, 0x20, 0xce, 0xf7, 0x6b, 0xfa, 0x00, 0x2c, - 0x55, 0xd1, 0x00, 0x2e, 0x05, 0xd0, 0x38, 0x1c, - 0x31, 0x1c, 0x2a, 0x1c, 0xff, 0xf7, 0x6a, 0xfb, - 0x4d, 0xe0, 0x04, 0x99, 0x00, 0x2d, 0xf9, 0x62, - 0x1c, 0xd0, 0x27, 0xa2, 0x00, 0x92, 0x33, 0x22, - 0x00, 0x21, 0x38, 0x1c, 0x2b, 0x1c, 0xff, 0xf7, - 0x26, 0xf9, 0xba, 0x68, 0x28, 0x49, 0x04, 0x1c, - 0xed, 0x09, 0x00, 0x2e, 0x03, 0x01, 0x92, 0x00, - 0x91, 0x27, 0xa1, 0x08, 0x68, 0x00, 0x23, 0x01, - 0x22, 0x49, 0x68, 0xf6, 0xf7, 0xda, 0xfb, 0xf9, - 0x1d, 0xf9, 0x31, 0x48, 0x60, 0x00, 0x22, 0x38, - 0x1c, 0x02, 0x99, 0xfa, 0xf7, 0x5d, 0xfa, 0x2c, - 0xe0, 0x06, 0x9b, 0x00, 0x2b, 0x17, 0xd1, 0x10, - 0x25, 0xf9, 0x1d, 0x1d, 0x31, 0x2a, 0x1c, 0x38, - 0x1c, 0x0e, 0x1c, 0xfa, 0xf7, 0xbb, 0xf9, 0x00, - 0x28, 0x01, 0xd1, 0x0c, 0x24, 0x1d, 0xe0, 0x00, - 0x22, 0x38, 0x1c, 0x29, 0x1c, 0xfa, 0xf7, 0x48, - 0xfa, 0x00, 0x23, 0x38, 0x1c, 0x31, 0x1c, 0x2a, - 0x1c, 0xfa, 0xf7, 0xcc, 0xf9, 0x11, 0xe0, 0x38, - 0x1c, 0x33, 0x22, 0x00, 0x21, 0x09, 0xa3, 0xff, - 0xf7, 0xe1, 0xf8, 0x04, 0x1c, 0x09, 0xd1, 0x00, - 0x20, 0xb8, 0x61, 0x38, 0x1c, 0xfa, 0xf7, 0x62, - 0xf9, 0x01, 0x1c, 0x00, 0x22, 0x38, 0x1c, 0xfa, - 0xf7, 0x2f, 0xfa, 0x20, 0x1c, 0x07, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x4c, 0x6d, 0x49, - 0x66, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x00, 0x00, 0x00, 0x00, 0x07, 0xb2, 0x02, - 0x20, 0x00, 0x24, 0xf4, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xb5, 0x00, 0x24, 0x0d, 0x1c, 0x09, - 0x9e, 0xf6, 0xf7, 0x44, 0xfa, 0x07, 0x1c, 0x01, - 0xd1, 0x02, 0x24, 0x21, 0xe0, 0x05, 0x21, 0x38, - 0x1c, 0xfa, 0xf7, 0xe7, 0xf9, 0x00, 0x28, 0x01, - 0xd1, 0x0c, 0x24, 0x19, 0xe0, 0x01, 0x23, 0x9b, - 0x02, 0xf8, 0x18, 0xc0, 0x6b, 0x00, 0x28, 0x01, - 0xd0, 0x0c, 0x24, 0x11, 0xe0, 0x05, 0x23, 0xdb, - 0x01, 0xf8, 0x18, 0x80, 0x6a, 0x00, 0x28, 0x06, - 0xd0, 0x02, 0x9a, 0x38, 0x1c, 0x29, 0x1c, 0xaa, - 0x62, 0xfe, 0xf7, 0xd0, 0xfd, 0x2b, 0xe0, 0xce, - 0xf7, 0x64, 0xf9, 0xed, 0x09, 0x00, 0x2f, 0x03, - 0x00, 0x28, 0x06, 0xd1, 0x07, 0x24, 0xce, 0xf7, - 0x5f, 0xf9, 0x00, 0x28, 0x18, 0xd1, 0x07, 0x24, - 0x20, 0xe0, 0xf9, 0x1d, 0xff, 0x31, 0x3a, 0x31, - 0x4a, 0x68, 0x01, 0x32, 0x4a, 0x60, 0x59, 0x21, - 0x01, 0x60, 0x39, 0x6b, 0xc1, 0x60, 0x05, 0x61, - 0x01, 0x21, 0x41, 0x61, 0x02, 0x9a, 0x01, 0x1c, - 0x82, 0x61, 0x03, 0x9b, 0xc3, 0x61, 0x06, 0x62, - 0x07, 0x20, 0xce, 0xf7, 0xb4, 0xf9, 0x09, 0xe0, - 0xd6, 0x21, 0x01, 0x60, 0xf9, 0x6a, 0x0c, 0x30, - 0x52, 0xc0, 0x18, 0x38, 0x01, 0x1c, 0x05, 0x20, - 0xce, 0xf7, 0xa9, 0xf9, 0x20, 0x1c, 0x04, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, - 0x1c, 0x1c, 0x0d, 0x1c, 0x16, 0x1c, 0xf6, 0xf7, - 0xec, 0xf9, 0x07, 0x1c, 0x01, 0xd1, 0x02, 0x25, - 0x1b, 0xe0, 0x00, 0x2d, 0x06, 0xd0, 0x38, 0x1c, - 0x29, 0x1c, 0x32, 0x1c, 0xff, 0xf7, 0x87, 0xfb, - 0x05, 0x1c, 0x12, 0xe0, 0x00, 0x2c, 0x08, 0xd0, - 0x78, 0x69, 0x0e, 0x28, 0x03, 0xd0, 0x0f, 0x28, - 0x01, 0xd0, 0x10, 0x28, 0x01, 0xd1, 0x0b, 0x25, - 0x07, 0xe0, 0x02, 0x21, 0x38, 0x1c, 0x32, 0x1c, - 0xfa, 0xf7, 0x9d, 0xf9, 0x05, 0x1c, 0x00, 0xd0, - 0x0c, 0x25, 0xce, 0xf7, 0x0d, 0xf9, 0x00, 0x28, - 0x01, 0xd1, 0x07, 0x25, 0x09, 0xe0, 0xd9, 0x21, - 0x01, 0x60, 0xf9, 0x6a, 0xc1, 0x60, 0x05, 0x61, - 0x44, 0x61, 0x01, 0x1c, 0x05, 0x20, 0xce, 0xf7, - 0x6e, 0xf9, 0x28, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x90, 0xb5, 0x00, 0x27, 0xf6, 0xf7, - 0xb4, 0xf9, 0x04, 0x1c, 0x01, 0xd1, 0x02, 0x27, - 0x11, 0xe0, 0xce, 0xf7, 0xf1, 0xf8, 0x00, 0x28, - 0x01, 0xd1, 0x07, 0x27, 0x0b, 0xe0, 0xc7, 0x21, - 0x01, 0x60, 0xe1, 0x6a, 0xc1, 0x60, 0xe1, 0x1d, - 0xb9, 0x31, 0x09, 0x68, 0x01, 0x61, 0xed, 0x09, - 0x00, 0x30, 0x03, 0x01, 0x1c, 0x05, 0x20, 0xce, - 0xf7, 0x50, 0xf9, 0x38, 0x1c, 0x90, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0xb0, 0xb5, 0x00, 0x27, 0x0d, - 0x1c, 0xf6, 0xf7, 0x95, 0xf9, 0x04, 0x1c, 0x01, - 0xd1, 0x02, 0x27, 0x11, 0xe0, 0xce, 0xf7, 0xd2, - 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x07, 0x27, 0x0b, - 0xe0, 0xe1, 0x1d, 0xb9, 0x31, 0x0d, 0x60, 0x5a, - 0x21, 0x01, 0x60, 0x21, 0x6b, 0xc1, 0x60, 0x05, - 0x61, 0x01, 0x1c, 0x07, 0x20, 0xce, 0xf7, 0x31, - 0xf9, 0x38, 0x1c, 0xb0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf7, 0xb5, 0x01, 0x99, 0x00, 0x27, 0x05, - 0x1c, 0x00, 0x29, 0x01, 0xd1, 0x06, 0x26, 0x00, - 0xe0, 0x07, 0x26, 0xce, 0xf7, 0xb3, 0xf8, 0x04, - 0x1c, 0x01, 0xd1, 0x07, 0x27, 0x3f, 0xe0, 0x28, - 0x1c, 0xf6, 0xf7, 0x69, 0xf9, 0x05, 0x1c, 0x01, - 0xd1, 0x02, 0x27, 0x0e, 0xe0, 0x28, 0x1c, 0x31, - 0x1c, 0xfa, 0xf7, 0x0c, 0xf9, 0x00, 0x28, 0x01, - 0xd1, 0x0c, 0x27, 0x06, 0xe0, 0x28, 0x1c, 0x31, - 0x1c, 0xfa, 0xf7, 0xcb, 0xf8, 0x00, 0x28, 0x00, - 0xd1, 0x0c, 0x27, 0xd0, 0x20, 0x20, 0x60, 0x01, - 0x99, 0x00, 0x29, 0x05, 0xd1, 0x0b, 0x21, 0x01, - 0x20, 0xf6, 0xf7, 0x1d, 0xf9, 0xe0, 0x60, 0x04, - 0xe0, 0x0c, 0x21, 0x01, 0x20, 0xf6, 0xf7, 0x17, - 0xf9, 0xe0, 0x60, 0xe9, 0x1d, 0x9d, 0x31, 0x27, - 0x61, 0x0c, 0xc9, 0xe0, 0x1d, 0x0d, 0x30, 0x0c, - 0xc0, 0x05, 0x20, 0x21, 0x1c, 0xce, 0xf7, 0xed, - 0xf8, 0x00, 0x2f, 0x0c, 0xd1, 0x00, 0x22, 0x28, - 0x1c, 0x31, 0x1c, 0xfa, 0xf7, 0x02, 0xf9, 0x07, - 0x1c, 0x05, 0xd1, 0x28, 0x1c, 0x31, 0x1c, 0x02, - 0x9a, 0xfa, 0xf7, 0xbf, 0xf8, 0x07, 0x1c, 0x38, - 0x1c, 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xff, 0xb5, 0x00, 0x25, 0x07, 0x1c, 0xce, - 0xf7, 0xed, 0x09, 0x00, 0x31, 0x03, 0x65, 0xf8, - 0x04, 0x1c, 0x01, 0xd1, 0x07, 0x25, 0x49, 0xe0, - 0x38, 0x1c, 0xf6, 0xf7, 0x1b, 0xf9, 0x07, 0x1c, - 0x01, 0xd1, 0x02, 0x25, 0x27, 0xe0, 0x01, 0x99, - 0x00, 0x29, 0x01, 0xd1, 0x08, 0x26, 0x00, 0xe0, - 0x09, 0x26, 0x38, 0x1c, 0x31, 0x1c, 0xfa, 0xf7, - 0xb8, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x25, - 0x19, 0xe0, 0x38, 0x1c, 0x31, 0x1c, 0xfa, 0xf7, - 0x77, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x25, - 0x11, 0xe0, 0x01, 0x99, 0x00, 0x29, 0x04, 0xd1, - 0x03, 0x99, 0x02, 0x9a, 0x38, 0x1c, 0xfc, 0xf7, - 0x55, 0xfb, 0x38, 0x1c, 0x31, 0x1c, 0x01, 0x9a, - 0xfa, 0xf7, 0x86, 0xf8, 0x38, 0x1c, 0x31, 0x1c, - 0x01, 0x9a, 0xfa, 0xf7, 0xbd, 0xf8, 0xd0, 0x20, - 0x20, 0x60, 0x01, 0x99, 0x00, 0x29, 0x05, 0xd1, - 0x0d, 0x21, 0x01, 0x20, 0xf6, 0xf7, 0xb6, 0xf8, - 0xe0, 0x60, 0x04, 0xe0, 0x0e, 0x21, 0x01, 0x20, - 0xf6, 0xf7, 0xb0, 0xf8, 0xe0, 0x60, 0xf9, 0x1d, - 0x9d, 0x31, 0x25, 0x61, 0x88, 0xc9, 0xe0, 0x1d, - 0x0d, 0x30, 0x88, 0xc0, 0x05, 0x20, 0x21, 0x1c, - 0xce, 0xf7, 0x86, 0xf8, 0x28, 0x1c, 0x04, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x02, 0x49, - 0xc8, 0x63, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, - 0xf8, 0xad, 0x03, 0x20, 0xf0, 0xb5, 0x85, 0xb0, - 0x00, 0x24, 0x0d, 0x1c, 0x16, 0x1c, 0x07, 0x1c, - 0xce, 0xf7, 0x03, 0xf8, 0x03, 0x90, 0x00, 0x28, - 0x01, 0xd1, 0x07, 0x24, 0xc2, 0xe0, 0x00, 0x20, - 0x63, 0x4b, 0x02, 0x90, 0x00, 0x2e, 0x04, 0x93, - 0x62, 0xd0, 0x04, 0x9b, 0x00, 0x26, 0x1d, 0x68, - 0x5b, 0xe0, 0xcd, 0xf7, 0xf2, 0xff, 0x07, 0x1c, - 0x55, 0xd0, 0x5e, 0xa1, 0x08, 0x20, 0xf5, 0xf7, - 0x73, 0xfa, 0x01, 0x90, 0x00, 0x28, 0x04, 0xd1, - 0x38, 0x1c, 0xce, 0xf7, 0xed, 0x09, 0x00, 0x32, - 0x03, 0x21, 0xf8, 0x07, 0x24, 0x4d, 0xe0, 0x5c, - 0xa1, 0x10, 0x20, 0xf5, 0xf7, 0x67, 0xfa, 0x00, - 0x90, 0x00, 0x28, 0x08, 0xd1, 0x38, 0x1c, 0xce, - 0xf7, 0x15, 0xf8, 0x01, 0x98, 0x5a, 0xa1, 0xf5, - 0xf7, 0x63, 0xfa, 0x07, 0x24, 0x3d, 0xe0, 0xc8, - 0x20, 0x38, 0x60, 0x01, 0x98, 0x38, 0x61, 0x00, - 0x98, 0x78, 0x61, 0x1a, 0xe0, 0xe8, 0x6a, 0x00, - 0x28, 0x16, 0xd0, 0x28, 0x6c, 0x00, 0x28, 0x13, - 0xd1, 0x38, 0x69, 0xf1, 0x00, 0x40, 0x18, 0xe9, - 0x1d, 0x01, 0x31, 0x0c, 0xc9, 0x0c, 0xc0, 0x78, - 0x69, 0x31, 0x01, 0x40, 0x18, 0xe9, 0x1d, 0x29, - 0x31, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, - 0xc0, 0x02, 0x98, 0x01, 0x30, 0x02, 0x90, 0x01, - 0x36, 0x2d, 0x68, 0x00, 0x2d, 0x01, 0xd0, 0x0b, - 0x2e, 0xe0, 0xd3, 0x00, 0x2e, 0x06, 0xd0, 0x05, - 0x20, 0x39, 0x1c, 0xfe, 0x60, 0xce, 0xf7, 0x16, - 0xf8, 0x00, 0x26, 0x0a, 0xe0, 0x38, 0x1c, 0xcd, - 0xf7, 0xdd, 0xff, 0x01, 0x98, 0x42, 0xa1, 0xf5, - 0xf7, 0x2b, 0xfa, 0x00, 0x98, 0x44, 0xa1, 0xf5, - 0xf7, 0x27, 0xfa, 0x00, 0x2c, 0x01, 0xd1, 0x00, - 0x2d, 0xa1, 0xd1, 0x3d, 0xe0, 0xff, 0xe7, 0x38, - 0x1c, 0x29, 0x1c, 0xf8, 0xf7, 0x15, 0xfd, 0x06, - 0x1c, 0x35, 0xd0, 0xcd, 0xf7, 0x8c, 0xff, 0x07, - 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x30, 0xe0, 0x3e, - 0xa1, 0x08, 0x20, 0xf5, 0xf7, 0x0b, 0xfa, 0x05, - 0x1c, 0x04, 0xd1, 0x38, 0x1c, 0xcd, 0xf7, 0xba, - 0xff, 0x07, 0x24, 0x25, 0xe0, 0x3c, 0xa1, 0x10, - 0x20, 0xf5, 0xf7, 0x00, 0xfa, 0x00, 0x28, 0x08, - 0xd1, 0x38, 0x1c, 0xcd, 0xf7, 0xaf, 0xff, 0x28, - 0x1c, 0x3b, 0xa1, 0xf5, 0xf7, 0xfd, 0xf9, 0x07, - 0x24, 0x16, 0xe0, 0x78, 0x61, 0xc8, 0x21, 0x39, - 0x60, 0xf0, 0x1d, 0x01, 0x30, 0x3d, 0x61, 0xed, - 0x09, 0x00, 0x33, 0x03, 0x0c, 0xc8, 0x0c, 0xc5, - 0xf1, 0x1d, 0x29, 0x31, 0x6c, 0xc9, 0x78, 0x69, - 0x6c, 0xc0, 0x01, 0x20, 0xf8, 0x60, 0x05, 0x20, - 0x39, 0x1c, 0xcd, 0xf7, 0xca, 0xff, 0x01, 0x20, - 0x02, 0x90, 0x00, 0xe0, 0x1f, 0x24, 0x03, 0x99, - 0xc9, 0x20, 0x08, 0x60, 0x04, 0x9b, 0x14, 0x22, - 0x9f, 0x68, 0x11, 0x1c, 0x14, 0x2f, 0x2d, 0x48, - 0x00, 0xd9, 0x39, 0x1c, 0x81, 0x42, 0x03, 0xd8, - 0x10, 0x1c, 0x14, 0x2f, 0x00, 0xd9, 0x38, 0x1c, - 0x03, 0x99, 0x08, 0x61, 0x02, 0x98, 0x03, 0x99, - 0x48, 0x61, 0x03, 0x98, 0xc4, 0x60, 0x03, 0x99, - 0x05, 0x20, 0xcd, 0xf7, 0xaa, 0xff, 0x20, 0x1c, - 0x05, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xf8, 0xad, 0x03, 0x20, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x37, 0x39, 0x34, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x37, 0x39, 0x39, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x38, 0x30, 0x33, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x38, 0x32, 0x38, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x38, 0x32, 0x39, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x38, 0x34, 0x32, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x38, 0x34, 0x37, 0x00, 0x73, 0x72, - 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, 0x63, - 0x3a, 0x20, 0x38, 0x35, 0x31, 0x00, 0xff, 0xff, - 0x00, 0x00, 0xf7, 0xb5, 0x8b, 0xb0, 0x00, 0x20, - 0x14, 0x1c, 0x0f, 0x1c, 0x09, 0x90, 0x07, 0x91, - 0x06, 0x92, 0xed, 0x09, 0x00, 0x34, 0x03, 0xcd, - 0xf7, 0xe7, 0xfe, 0x08, 0x90, 0x00, 0x28, 0x02, - 0xd1, 0x07, 0x20, 0x09, 0x90, 0x4b, 0xe0, 0x0b, - 0x98, 0x00, 0x25, 0x00, 0x28, 0x33, 0xd9, 0x26, - 0x48, 0x0a, 0x90, 0x03, 0xcf, 0x08, 0x3f, 0xf8, - 0xf7, 0x5c, 0xfc, 0x00, 0x28, 0x1a, 0xd1, 0x38, - 0x68, 0x01, 0x02, 0x09, 0x0a, 0x04, 0xa8, 0xf5, - 0xf7, 0xcc, 0xfe, 0x0a, 0x98, 0x00, 0x21, 0xc0, - 0x6b, 0x02, 0x91, 0x01, 0x90, 0x0a, 0x98, 0x1d, - 0xa2, 0x03, 0x92, 0x82, 0x6b, 0x00, 0x92, 0x03, - 0xcf, 0x08, 0x3f, 0x04, 0x9a, 0x05, 0x9b, 0xf8, - 0xf7, 0x64, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0x07, - 0x20, 0x09, 0x90, 0x10, 0xe0, 0x21, 0x1c, 0x0c, - 0xc9, 0xc6, 0x1d, 0x29, 0x36, 0x0c, 0xc6, 0x0c, - 0xc9, 0x0c, 0xc6, 0x01, 0x21, 0xc1, 0x62, 0x00, - 0x21, 0x01, 0x64, 0x0b, 0x98, 0x10, 0x34, 0x01, - 0x35, 0x08, 0x37, 0x85, 0x42, 0xcd, 0xd3, 0x07, - 0x98, 0x11, 0xa1, 0xf5, 0xf7, 0x32, 0xf9, 0x06, - 0x98, 0x13, 0xa1, 0xf5, 0xf7, 0x2e, 0xf9, 0x08, - 0x99, 0xca, 0x20, 0x08, 0x60, 0x08, 0x98, 0x05, - 0x61, 0x09, 0x98, 0x08, 0x99, 0xc8, 0x60, 0x08, - 0x99, 0x05, 0x20, 0xcd, 0xf7, 0x04, 0xff, 0x09, - 0x98, 0x0e, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0xd8, 0xeb, 0x03, 0x20, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, - 0x63, 0x3a, 0x20, 0x39, 0x30, 0x31, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, - 0x63, 0x3a, 0x20, 0x39, 0x31, 0x31, 0x00, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x69, 0x66, 0x2e, - 0x63, 0x3a, 0x20, 0x39, 0x31, 0x32, 0x00, 0xf7, - 0xb5, 0x00, 0x25, 0x00, 0x27, 0x0e, 0x1c, 0xcd, - 0xf7, 0x6f, 0xfe, 0x04, 0x1c, 0x01, 0xd1, 0x07, - 0x25, 0x20, 0xe0, 0x02, 0x9a, 0xed, 0x09, 0x00, - 0x35, 0x03, 0x00, 0x2a, 0x0a, 0xd0, 0x11, 0x48, - 0x00, 0x68, 0x00, 0x28, 0x11, 0xd0, 0x06, 0x68, - 0xf6, 0xf7, 0x84, 0xfe, 0xc7, 0x19, 0x30, 0x1c, - 0xf9, 0xd1, 0x0a, 0xe0, 0x00, 0x98, 0x31, 0x1c, - 0xf8, 0xf7, 0xde, 0xfb, 0x00, 0x28, 0x03, 0xd0, - 0xf6, 0xf7, 0x78, 0xfe, 0x07, 0x1c, 0x00, 0xe0, - 0x1f, 0x25, 0xcb, 0x20, 0x20, 0x60, 0xe5, 0x60, - 0x05, 0x20, 0x21, 0x1c, 0x27, 0x61, 0xcd, 0xf7, - 0xb9, 0xfe, 0x28, 0x1c, 0x03, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0xf8, 0xad, 0x03, 0x20, - 0xf0, 0xb5, 0x00, 0x27, 0x04, 0x1c, 0xcd, 0xf7, - 0x3e, 0xfe, 0x05, 0x1c, 0x01, 0xd1, 0x07, 0x27, - 0x50, 0xe0, 0x20, 0x1c, 0xf5, 0xf7, 0xf4, 0xfe, - 0x04, 0x1c, 0x01, 0xd1, 0x02, 0x27, 0x22, 0xe0, - 0xe0, 0x1d, 0xff, 0x30, 0x3a, 0x30, 0xc0, 0x6a, - 0x00, 0x28, 0x05, 0xd0, 0xe0, 0x1d, 0xff, 0x30, - 0x7a, 0x30, 0x41, 0x6b, 0x00, 0x29, 0x01, 0xd0, - 0x18, 0x27, 0x14, 0xe0, 0xc0, 0x69, 0x00, 0x28, - 0x01, 0xd1, 0x11, 0x26, 0x00, 0xe0, 0x19, 0x26, - 0x20, 0x1c, 0x31, 0x1c, 0xf9, 0xf7, 0x83, 0xfe, - 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x27, 0x06, 0xe0, - 0x20, 0x1c, 0x31, 0x1c, 0xf9, 0xf7, 0x42, 0xfe, - 0x00, 0x28, 0x00, 0xd1, 0x0c, 0x27, 0xcf, 0x20, - 0x28, 0x60, 0x15, 0x21, 0x01, 0x20, 0xf5, 0xf7, - 0x97, 0xfe, 0xe8, 0x60, 0x05, 0x20, 0x29, 0x1c, - 0x2f, 0x61, 0xcd, 0xf7, 0x73, 0xfe, 0x00, 0x2f, - 0x18, 0xd1, 0xe1, 0x1d, 0xff, 0x31, 0xba, 0x31, - 0x01, 0x20, 0x88, 0x60, 0xe0, 0x1d, 0xff, 0x30, - 0x7a, 0x30, 0xc0, 0x69, 0x00, 0x28, 0x04, 0xd1, - 0x20, 0x1c, 0xfc, 0xf7, 0x54, 0xf9, 0x07, 0x1c, - 0x08, 0xe0, 0x00, 0x22, 0x11, 0x21, 0x20, 0x1c, - 0xf9, 0xf7, 0x78, 0xfe, 0x20, 0x1c, 0xfc, 0xf7, - 0xed, 0x09, 0x00, 0x36, 0x03, 0x13, 0xf9, 0x07, - 0x1c, 0x38, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf0, 0xb5, 0x86, 0xb0, 0x07, 0x1c, 0xcd, - 0xf7, 0xe0, 0xfd, 0x05, 0x1c, 0x01, 0xd1, 0x07, - 0x27, 0x42, 0xe0, 0x38, 0x1c, 0xf5, 0xf7, 0x96, - 0xfe, 0x04, 0x1c, 0x01, 0xd1, 0x02, 0x27, 0x2f, - 0xe0, 0x0a, 0x21, 0x20, 0x1c, 0xf9, 0xf7, 0x39, - 0xfe, 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x27, 0x27, - 0xe0, 0xe6, 0x1d, 0xff, 0x36, 0xba, 0x36, 0xf0, - 0x69, 0x00, 0x28, 0x01, 0xd0, 0x0c, 0x27, 0x1f, - 0xe0, 0x20, 0x1c, 0xfe, 0xf7, 0x66, 0xfa, 0x17, - 0x4a, 0x07, 0x1c, 0x90, 0x1e, 0x02, 0x21, 0x04, - 0x91, 0x81, 0x1e, 0x03, 0x90, 0x01, 0x20, 0x05, - 0x92, 0x02, 0x22, 0x00, 0x90, 0x01, 0x91, 0x25, - 0x21, 0x20, 0x1c, 0x02, 0x92, 0x03, 0x23, 0x3a, - 0x1c, 0xfe, 0xf7, 0x6b, 0xfc, 0x07, 0x1c, 0xe1, - 0x1d, 0xff, 0x31, 0x01, 0x20, 0xf0, 0x61, 0x0a, - 0x31, 0x20, 0x1c, 0x0b, 0x4a, 0xf8, 0xf7, 0x84, - 0xfa, 0xcf, 0x20, 0x28, 0x60, 0x1d, 0x21, 0x01, - 0x20, 0xf5, 0xf7, 0x2c, 0xfe, 0xe8, 0x60, 0x05, - 0x20, 0x29, 0x1c, 0x2f, 0x61, 0xcd, 0xf7, 0x08, - 0xfe, 0x38, 0x1c, 0x06, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x78, 0xae, 0x03, - 0x20, 0x73, 0xb2, 0x02, 0x20, 0xf0, 0xb5, 0x82, - 0xb0, 0x00, 0x24, 0x07, 0x1c, 0xcd, 0xf7, 0x89, - 0xfd, 0x05, 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x41, - 0xe0, 0x38, 0x1c, 0xf5, 0xf7, 0x3f, 0xfe, 0x07, - 0x1c, 0x01, 0xd1, 0x02, 0x24, 0x2e, 0xe0, 0x0b, - 0x21, 0x38, 0x1c, 0xf9, 0xf7, 0xe2, 0xfd, 0x00, - 0x28, 0x01, 0xd1, 0x0c, 0x24, 0x26, 0xe0, 0xfe, - 0x1d, 0xff, 0x36, 0xba, 0x36, 0xf0, 0x6a, 0x00, - 0x28, 0x01, 0xd0, 0x0c, 0x24, 0x1e, 0xe0, 0xf8, - 0x1d, 0xb9, 0x30, 0xed, 0x09, 0x00, 0x37, 0x03, - 0x41, 0x6b, 0x00, 0x29, 0x02, 0xd0, 0x00, 0x21, - 0x41, 0x63, 0x0d, 0xe0, 0x38, 0x1c, 0xfe, 0xf7, - 0x07, 0xfa, 0x12, 0x4a, 0x08, 0x21, 0x00, 0x91, - 0x01, 0x92, 0x02, 0x1c, 0x27, 0x21, 0x01, 0x23, - 0x38, 0x1c, 0xfe, 0xf7, 0x15, 0xfc, 0x04, 0x1c, - 0xf9, 0x1d, 0xff, 0x31, 0x01, 0x20, 0xf0, 0x62, - 0x1a, 0x31, 0x38, 0x1c, 0x0b, 0x4a, 0xf8, 0xf7, - 0x2e, 0xfa, 0xcf, 0x20, 0x28, 0x60, 0x1b, 0x21, - 0x01, 0x20, 0xf5, 0xf7, 0xd6, 0xfd, 0xe8, 0x60, - 0x05, 0x20, 0x29, 0x1c, 0x2c, 0x61, 0xcd, 0xf7, - 0xb2, 0xfd, 0x20, 0x1c, 0x02, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x7c, 0xae, - 0x03, 0x20, 0x45, 0xb3, 0x02, 0x20, 0xff, 0xb5, - 0x86, 0xb0, 0x00, 0x24, 0x0e, 0x1c, 0xcd, 0xf7, - 0x33, 0xfd, 0x05, 0x1c, 0x01, 0xd1, 0x07, 0x24, - 0x69, 0xe0, 0x06, 0x98, 0x31, 0x1c, 0xf7, 0xf7, - 0xd6, 0xff, 0x07, 0x1c, 0x23, 0xd1, 0xfe, 0xf7, - 0x7e, 0xfc, 0x00, 0x28, 0x01, 0xd0, 0x0c, 0x24, - 0x51, 0xe0, 0x00, 0x22, 0x10, 0x99, 0x05, 0x92, - 0x04, 0x91, 0x09, 0x9a, 0x0f, 0x98, 0x08, 0x99, - 0x03, 0x90, 0x08, 0x20, 0x00, 0x90, 0x01, 0x91, - 0x00, 0x21, 0x28, 0x1c, 0x02, 0x92, 0x06, 0x9a, - 0x33, 0x1c, 0xff, 0xf7, 0x4b, 0xfa, 0x00, 0x28, - 0x01, 0xd1, 0x07, 0x24, 0x3b, 0xe0, 0xc2, 0x1d, - 0xff, 0x32, 0xba, 0x32, 0x01, 0x21, 0x11, 0x62, - 0xc0, 0x30, 0xc1, 0x61, 0x3f, 0xe0, 0x0c, 0x21, - 0x38, 0x1c, 0xf9, 0xf7, 0x69, 0xfd, 0x00, 0x28, - 0x01, 0xd1, 0x0c, 0x24, 0x2b, 0xe0, 0xfe, 0x1d, - 0xff, 0x36, 0xba, 0x36, 0x30, 0x6a, 0x00, 0x28, - 0x01, 0xd0, 0x0c, 0x24, 0x23, 0xe0, 0x00, 0x20, - 0x0b, 0x23, 0x9b, 0x01, 0xf9, 0x18, 0x5d, 0x23, - 0xdb, 0x00, 0x48, 0x62, 0xf8, 0x18, 0xed, 0x09, - 0x00, 0x38, 0x03, 0xf9, 0x22, 0x00, 0x21, 0xcd, - 0xf7, 0xc8, 0xf8, 0x38, 0x1c, 0xfe, 0xf7, 0x8a, - 0xf9, 0xb9, 0x23, 0x9b, 0x00, 0xfa, 0x18, 0x01, - 0x92, 0x01, 0x21, 0x02, 0x1c, 0x01, 0x23, 0x38, - 0x1c, 0x00, 0x91, 0xfe, 0xf7, 0x97, 0xfb, 0x04, - 0x1c, 0xf9, 0x1d, 0xff, 0x31, 0x01, 0x20, 0x30, - 0x62, 0x0e, 0x31, 0x38, 0x1c, 0x0a, 0x4a, 0xf8, - 0xf7, 0xb0, 0xf9, 0xcf, 0x20, 0x28, 0x60, 0x19, - 0x21, 0x01, 0x20, 0xf5, 0xf7, 0x58, 0xfd, 0xe8, - 0x60, 0x05, 0x20, 0x29, 0x1c, 0x2c, 0x61, 0xcd, - 0xf7, 0x34, 0xfd, 0x20, 0x1c, 0x0a, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x9b, - 0xb2, 0x02, 0x20, 0xff, 0xb5, 0x86, 0xb0, 0x0f, - 0x9e, 0x07, 0x1c, 0xcd, 0xf7, 0xb7, 0xfc, 0x05, - 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x71, 0xe0, 0x38, - 0x1c, 0xf5, 0xf7, 0x6d, 0xfd, 0x07, 0x1c, 0x01, - 0xd1, 0x02, 0x24, 0x5e, 0xe0, 0x0d, 0x21, 0x38, - 0x1c, 0xf9, 0xf7, 0x10, 0xfd, 0x00, 0x28, 0x01, - 0xd1, 0x0c, 0x24, 0x56, 0xe0, 0xf8, 0x1d, 0xff, - 0x30, 0xba, 0x30, 0x05, 0x90, 0x80, 0x6a, 0x00, - 0x28, 0x01, 0xd0, 0x0c, 0x24, 0x4d, 0xe0, 0x01, - 0x20, 0x04, 0x90, 0x08, 0x9a, 0x40, 0x42, 0x04, - 0x24, 0x82, 0x42, 0x04, 0xd1, 0x0b, 0x23, 0x9b, - 0x01, 0xf8, 0x18, 0x04, 0x62, 0x13, 0xe0, 0x86, - 0x42, 0x0c, 0xd0, 0x31, 0x1c, 0x28, 0x48, 0xcd, - 0xf7, 0x06, 0xf8, 0x0b, 0x23, 0x9b, 0x01, 0xf9, - 0x18, 0x40, 0x00, 0x08, 0x62, 0x04, 0x28, 0x06, - 0xd2, 0x0c, 0x62, 0x04, 0xe0, 0x28, 0x20, 0x0b, - 0x23, 0x9b, 0x01, 0xf9, 0x18, 0x08, 0x62, 0x38, - 0x1c, 0xfe, 0xf7, 0x1c, 0xf9, 0x01, 0x21, 0x17, - 0x23, 0x5b, 0x01, 0x04, 0x1c, 0xf8, 0x18, 0x04, - 0xaa, 0x03, 0x92, 0x02, 0x22, 0x01, 0x90, 0x02, - 0x91, 0xed, 0x09, 0x00, 0x39, 0x03, 0x2a, 0x21, - 0x38, 0x1c, 0x00, 0x92, 0x02, 0x23, 0x22, 0x1c, - 0xfe, 0xf7, 0x23, 0xfb, 0x05, 0x23, 0xdb, 0x01, - 0x04, 0x1c, 0xf8, 0x18, 0x07, 0x99, 0x0b, 0x23, - 0xc1, 0x60, 0x08, 0x9a, 0x9b, 0x01, 0xf8, 0x18, - 0xc2, 0x60, 0x09, 0x9b, 0x10, 0x4a, 0x03, 0x61, - 0x46, 0x61, 0x10, 0x99, 0x81, 0x61, 0x05, 0x99, - 0x01, 0x20, 0x88, 0x62, 0xf9, 0x1d, 0xff, 0x31, - 0x16, 0x31, 0x38, 0x1c, 0xf8, 0xf7, 0x2c, 0xf9, - 0xcf, 0x20, 0x28, 0x60, 0x07, 0x21, 0x02, 0x20, - 0xf5, 0xf7, 0xd4, 0xfc, 0xe8, 0x60, 0x05, 0x20, - 0x29, 0x1c, 0x2c, 0x61, 0xcd, 0xf7, 0xb0, 0xfc, - 0x20, 0x1c, 0x0a, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, - 0xfd, 0xb2, 0x02, 0x20, 0x90, 0xb5, 0x00, 0x27, - 0x0c, 0x1c, 0xf5, 0xf7, 0xef, 0xfc, 0x00, 0x28, - 0x01, 0xd1, 0x02, 0x27, 0x01, 0xe0, 0xc0, 0x30, - 0x84, 0x61, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf3, 0xb5, 0x81, 0xb0, 0x00, 0x24, - 0x00, 0x26, 0x07, 0x1c, 0xcd, 0xf7, 0x21, 0xfc, - 0x05, 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x62, 0xe0, - 0x38, 0x1c, 0xf5, 0xf7, 0xd7, 0xfc, 0x07, 0x1c, - 0x01, 0xd1, 0x02, 0x24, 0x49, 0xe0, 0x10, 0x21, - 0x38, 0x1c, 0xf9, 0xf7, 0x7a, 0xfc, 0x00, 0x28, - 0x01, 0xd1, 0x0c, 0x24, 0x41, 0xe0, 0xf9, 0x1d, - 0x1d, 0x31, 0x10, 0x22, 0x38, 0x1c, 0x00, 0x91, - 0xf9, 0xf7, 0xfc, 0xfb, 0x00, 0x28, 0x01, 0xd1, - 0x0c, 0x24, 0x36, 0xe0, 0x38, 0x69, 0x01, 0x28, - 0x03, 0xd1, 0x02, 0x99, 0x00, 0x29, 0x07, 0xd1, - 0x04, 0xe0, 0x02, 0x28, 0x04, 0xd1, 0x02, 0x99, - 0x01, 0x29, 0x01, 0xd1, 0x01, 0x26, 0x28, 0xe0, - 0xf8, 0x1d, 0xb9, 0x30, 0x81, 0x6b, 0x00, 0x29, - 0x04, 0xd0, 0xc1, 0x6b, 0xed, 0x09, 0x00, 0x3a, - 0x03, 0x89, 0x09, 0x01, 0xd2, 0x1a, 0x24, 0x1e, - 0xe0, 0x40, 0x68, 0x00, 0x28, 0x03, 0xd1, 0xb8, - 0x6a, 0x25, 0x38, 0x08, 0x28, 0x01, 0xd8, 0x0c, - 0x24, 0x15, 0xe0, 0xfe, 0xf7, 0x37, 0xfb, 0x00, - 0x28, 0x01, 0xd0, 0x0c, 0x24, 0x0f, 0xe0, 0xf9, - 0x1d, 0xff, 0x31, 0xba, 0x31, 0x01, 0x20, 0x08, - 0x61, 0x10, 0x21, 0x00, 0x22, 0x38, 0x1c, 0xf9, - 0xf7, 0x5d, 0xfc, 0x00, 0x23, 0x10, 0x22, 0x38, - 0x1c, 0x00, 0x99, 0xf9, 0xf7, 0xe1, 0xfb, 0xcf, - 0x20, 0x28, 0x60, 0x0b, 0x21, 0x02, 0x20, 0xf5, - 0xf7, 0x53, 0xfc, 0xe8, 0x60, 0x05, 0x20, 0x29, - 0x1c, 0x2c, 0x61, 0xcd, 0xf7, 0x2f, 0xfc, 0x00, - 0x2e, 0x03, 0xd0, 0x00, 0x21, 0x38, 0x1c, 0xfa, - 0xf7, 0xe2, 0xf9, 0x20, 0x1c, 0x03, 0xb0, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x00, - 0x24, 0x07, 0x1c, 0xcd, 0xf7, 0xb0, 0xfb, 0x05, - 0x1c, 0x01, 0xd1, 0x07, 0x24, 0x40, 0xe0, 0x38, - 0x1c, 0xf5, 0xf7, 0x66, 0xfc, 0x07, 0x1c, 0x01, - 0xd1, 0x02, 0x24, 0x2d, 0xe0, 0x0e, 0x21, 0x38, - 0x1c, 0xf9, 0xf7, 0x09, 0xfc, 0x00, 0x28, 0x01, - 0xd1, 0x0c, 0x24, 0x25, 0xe0, 0xfe, 0x1d, 0xff, - 0x36, 0xba, 0x36, 0xb0, 0x69, 0x00, 0x28, 0x01, - 0xd0, 0x0c, 0x24, 0x1d, 0xe0, 0x38, 0x69, 0x02, - 0x28, 0x07, 0xd1, 0x01, 0x20, 0xb0, 0x61, 0x45, - 0x22, 0x00, 0x21, 0x38, 0x1c, 0xf5, 0xf7, 0x56, - 0xfc, 0x12, 0xe0, 0x38, 0x1c, 0xfe, 0xf7, 0x2b, - 0xf8, 0x02, 0x1c, 0x00, 0x23, 0x05, 0x21, 0x38, - 0x1c, 0xfe, 0xf7, 0x3d, 0xfa, 0x04, 0x1c, 0xf9, - 0x1d, 0xff, 0x31, 0x01, 0x20, 0xb0, 0x61, 0x06, - 0x31, 0x38, 0x1c, 0x09, 0x4a, 0xf8, 0xf7, 0x56, - 0xf8, 0xcf, 0x20, 0x28, 0x60, 0x1f, 0x21, 0x01, - 0x20, 0xf5, 0xf7, 0xfe, 0xfb, 0xe8, 0x60, 0xed, - 0x09, 0x00, 0x3b, 0x03, 0x05, 0x20, 0x29, 0x1c, - 0x2c, 0x61, 0xcd, 0xf7, 0xda, 0xfb, 0x20, 0x1c, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x51, 0xb2, - 0x02, 0x20, 0x90, 0xb5, 0x00, 0x24, 0xf5, 0xf7, - 0x1e, 0xfc, 0x07, 0x1c, 0x01, 0xd1, 0x02, 0x24, - 0x28, 0xe0, 0xcd, 0xf7, 0x5b, 0xfb, 0x00, 0x28, - 0x24, 0xd0, 0xc0, 0x22, 0x02, 0x60, 0xfa, 0x6a, - 0x00, 0x21, 0xc2, 0x60, 0x00, 0x22, 0xfa, 0x1d, - 0xff, 0x32, 0x3a, 0x32, 0x01, 0x61, 0x13, 0x6a, - 0x0f, 0x4a, 0x30, 0x27, 0x92, 0x68, 0xff, 0x43, - 0x01, 0x2a, 0x01, 0xd0, 0x3b, 0x27, 0xff, 0x43, - 0xbb, 0x42, 0x01, 0xdd, 0xd9, 0x1b, 0x08, 0xe0, - 0x3d, 0x27, 0xff, 0x43, 0x01, 0x2a, 0x01, 0xd0, - 0x4a, 0x27, 0xff, 0x43, 0xbb, 0x42, 0x00, 0xda, - 0xd9, 0x1b, 0x41, 0x61, 0x01, 0x1c, 0x05, 0x20, - 0xcd, 0xf7, 0xa3, 0xfb, 0x20, 0x1c, 0x90, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0x18, 0xec, - 0x03, 0x20, 0xb0, 0xb5, 0x00, 0x27, 0x0d, 0x1c, - 0xf5, 0xf7, 0xe5, 0xfb, 0x04, 0x1c, 0x01, 0xd1, - 0x02, 0x27, 0x13, 0xe0, 0x00, 0x2d, 0x03, 0xd0, - 0x20, 0x1c, 0x00, 0xf0, 0xf4, 0xfc, 0x0d, 0xe0, - 0xcd, 0xf7, 0x1c, 0xfb, 0x00, 0x28, 0x01, 0xd1, - 0x07, 0x27, 0x07, 0xe0, 0x64, 0x21, 0x01, 0x60, - 0x21, 0x6b, 0xc1, 0x60, 0x01, 0x1c, 0x07, 0x20, - 0xcd, 0xf7, 0x7f, 0xfb, 0x38, 0x1c, 0xb0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x80, 0xb5, 0x00, 0x27, - 0xcd, 0xf7, 0x08, 0xfb, 0x00, 0x28, 0x01, 0xd1, - 0x07, 0x27, 0x08, 0xe0, 0x06, 0x4a, 0x01, 0x21, - 0xd1, 0x60, 0x5f, 0x21, 0x01, 0x60, 0x01, 0x1c, - 0x07, 0x20, 0xcd, 0xf7, 0x6a, 0xfb, 0x38, 0x1c, - 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x78, 0xae, - 0x03, 0x20, 0x02, 0x49, 0x01, 0x20, 0x08, 0x63, - 0x00, 0x20, 0xed, 0x09, 0x00, 0x3c, 0x03, 0x70, - 0x47, 0x00, 0x00, 0x38, 0xae, 0x03, 0x20, 0xf0, - 0xb5, 0x83, 0xb0, 0x00, 0x24, 0x0d, 0x1c, 0x07, - 0x1c, 0xcd, 0xf7, 0xe6, 0xfa, 0x06, 0x1c, 0x00, - 0xd1, 0x07, 0x24, 0x38, 0x1c, 0xf5, 0xf7, 0x9d, - 0xfb, 0x07, 0x1c, 0x01, 0xd1, 0x02, 0x24, 0x0e, - 0xe0, 0x0f, 0x21, 0x38, 0x1c, 0xf9, 0xf7, 0x40, - 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x24, 0x06, - 0xe0, 0xf8, 0x1d, 0xff, 0x30, 0xba, 0x30, 0x40, - 0x6a, 0x00, 0x28, 0x00, 0xd0, 0x0c, 0x24, 0x00, - 0x2e, 0x12, 0xd0, 0xcf, 0x20, 0x30, 0x60, 0x0f, - 0x21, 0x01, 0x20, 0xf5, 0xf7, 0x52, 0xfb, 0xf0, - 0x60, 0x34, 0x61, 0x00, 0x2f, 0x02, 0xd0, 0xf8, - 0x6a, 0x70, 0x61, 0x01, 0xe0, 0x00, 0x20, 0x70, - 0x61, 0x05, 0x20, 0x31, 0x1c, 0xcd, 0xf7, 0x27, - 0xfb, 0x00, 0x2c, 0x67, 0xd1, 0xf9, 0x1d, 0xff, - 0x31, 0xba, 0x31, 0x01, 0x20, 0x48, 0x62, 0xf8, - 0x1d, 0xb9, 0x30, 0x81, 0x6b, 0x00, 0x29, 0x03, - 0xd1, 0x33, 0x23, 0x9b, 0x02, 0x9d, 0x43, 0x0a, - 0xe0, 0xc0, 0x6b, 0x41, 0x08, 0x02, 0xd2, 0x03, - 0x23, 0x9b, 0x02, 0x9d, 0x43, 0x80, 0x08, 0x02, - 0xd2, 0x03, 0x23, 0x9b, 0x03, 0x9d, 0x43, 0x00, - 0x2d, 0x01, 0xd1, 0x1a, 0x24, 0x50, 0xe0, 0x28, - 0x1c, 0xfe, 0xf7, 0xe7, 0xf8, 0x0b, 0x23, 0x9b, - 0x01, 0xfc, 0x18, 0x02, 0x90, 0xa1, 0x68, 0x88, - 0x42, 0x25, 0xd8, 0x81, 0x42, 0x10, 0xd9, 0x38, - 0x1c, 0xfd, 0xf7, 0x2e, 0xff, 0x01, 0x21, 0x02, - 0xaa, 0x01, 0x92, 0x00, 0x91, 0x2d, 0x21, 0x02, - 0x1c, 0x01, 0x23, 0x38, 0x1c, 0xfe, 0xf7, 0x3c, - 0xf9, 0x02, 0x98, 0x60, 0x60, 0x02, 0x98, 0xa0, - 0x60, 0x05, 0x23, 0xdb, 0x01, 0xf8, 0x18, 0x85, - 0x63, 0x38, 0x1c, 0xf9, 0xf7, 0x7b, 0xff, 0x02, - 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0xed, 0x09, 0x00, - 0x3d, 0x03, 0xfa, 0xf7, 0x10, 0xf8, 0x01, 0x1c, - 0x04, 0x1c, 0x38, 0x1c, 0x2a, 0x1c, 0xf8, 0xf7, - 0x07, 0xfa, 0x20, 0xe0, 0x38, 0x1c, 0xfd, 0xf7, - 0x0a, 0xff, 0x01, 0x21, 0x02, 0xaa, 0x01, 0x92, - 0x00, 0x91, 0x2e, 0x21, 0x02, 0x1c, 0x01, 0x23, - 0x38, 0x1c, 0xfe, 0xf7, 0x18, 0xf9, 0x04, 0x1c, - 0x0c, 0xd1, 0x05, 0x23, 0xdb, 0x01, 0xf9, 0x1d, - 0xff, 0x31, 0xf8, 0x18, 0x45, 0x63, 0x12, 0x31, - 0x38, 0x1c, 0x07, 0x4a, 0xf7, 0xf7, 0x2e, 0xff, - 0x05, 0xe0, 0x04, 0xe0, 0x38, 0x1c, 0x21, 0x1c, - 0x2a, 0x1c, 0xf8, 0xf7, 0xe5, 0xf9, 0x20, 0x1c, - 0x03, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xd3, 0xb2, 0x02, 0x20, 0x90, 0xb5, 0x00, 0x27, - 0x0c, 0x1c, 0x00, 0x28, 0x06, 0xd1, 0x0e, 0x20, - 0xf7, 0xf7, 0x5c, 0xfd, 0x00, 0x28, 0x01, 0xd1, - 0x02, 0x27, 0x02, 0xe0, 0x21, 0x1c, 0xf9, 0xf7, - 0x5b, 0xff, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x01, 0x1c, 0x01, 0x4a, 0x00, 0x20, - 0x51, 0x62, 0x70, 0x47, 0xf8, 0xad, 0x03, 0x20, - 0x01, 0x1c, 0x02, 0x4a, 0x00, 0x20, 0x91, 0x62, - 0x70, 0x47, 0x00, 0x00, 0xf8, 0xad, 0x03, 0x20, - 0xf0, 0xb5, 0x00, 0x24, 0xf5, 0xf7, 0xd8, 0xfa, - 0x01, 0x26, 0x07, 0x1c, 0x00, 0x28, 0x01, 0xd1, - 0x02, 0x24, 0x2f, 0xe0, 0xfd, 0x1d, 0xff, 0x35, - 0x3a, 0x35, 0xe8, 0x6a, 0x00, 0x21, 0x00, 0x28, - 0x0a, 0xd1, 0xf9, 0x1d, 0x9d, 0x31, 0x08, 0x68, - 0x49, 0x68, 0xf7, 0xf7, 0x8d, 0xff, 0x01, 0x1c, - 0x10, 0xd0, 0xc8, 0x6a, 0x00, 0x28, 0x0d, 0xd0, - 0xe8, 0x6a, 0x00, 0x28, 0x08, 0xd1, 0x30, 0x31, - 0xf8, 0x1d, 0xff, 0x30, 0x0c, 0xc9, 0x6e, 0x30, - 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0xee, 0x62, - 0x28, 0x25, 0x00, 0xe0, 0x18, 0x25, 0x38, 0x1c, - 0xed, 0x09, 0x00, 0x3e, 0x03, 0x29, 0x1c, 0xf9, - 0xf7, 0x58, 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x0c, - 0x24, 0x06, 0xe0, 0x38, 0x1c, 0x29, 0x1c, 0xf9, - 0xf7, 0x17, 0xfa, 0x00, 0x28, 0x00, 0xd1, 0x0c, - 0x24, 0xcd, 0xf7, 0xe3, 0xf9, 0x05, 0x1c, 0x01, - 0xd1, 0x07, 0x24, 0x1f, 0xe0, 0xcf, 0x20, 0x28, - 0x60, 0x11, 0x21, 0x01, 0x20, 0xf5, 0xf7, 0x66, - 0xfa, 0xe8, 0x60, 0x2c, 0x61, 0x00, 0x2f, 0x02, - 0xd0, 0xf8, 0x6a, 0x68, 0x61, 0x01, 0xe0, 0x00, - 0x20, 0x68, 0x61, 0x05, 0x20, 0x29, 0x1c, 0xcd, - 0xf7, 0x3b, 0xfa, 0x00, 0x2c, 0x0a, 0xd1, 0xf8, - 0x1d, 0xff, 0x30, 0xba, 0x30, 0xc6, 0x60, 0xf8, - 0x1d, 0xff, 0x30, 0x3a, 0x30, 0xc1, 0x6a, 0x38, - 0x1c, 0xf7, 0xf7, 0x88, 0xfa, 0x20, 0x1c, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x00, - 0x24, 0x00, 0x26, 0x0d, 0x1c, 0xf5, 0xf7, 0x72, - 0xfa, 0x07, 0x1c, 0x01, 0xd1, 0x02, 0x24, 0x4c, - 0xe0, 0x2c, 0x21, 0x38, 0x1c, 0xf9, 0xf7, 0x15, - 0xfa, 0x00, 0x28, 0x01, 0xd1, 0x0c, 0x24, 0x44, - 0xe0, 0x2c, 0x22, 0x38, 0x1c, 0xf9, 0x1d, 0x21, - 0x31, 0xf9, 0xf7, 0x98, 0xf9, 0x00, 0x28, 0x01, - 0xd1, 0x0c, 0x24, 0x3a, 0xe0, 0x2f, 0x48, 0x81, - 0x6a, 0x00, 0x29, 0x09, 0xd0, 0xf9, 0x1d, 0xb9, - 0x31, 0x8a, 0x6b, 0x00, 0x2a, 0x02, 0xd0, 0xc9, - 0x6b, 0xc9, 0x08, 0x01, 0xd2, 0x1a, 0x24, 0x2c, - 0xe0, 0x01, 0x21, 0x00, 0x2d, 0x1a, 0xd0, 0xfa, - 0x1d, 0xb9, 0x32, 0x52, 0x68, 0x00, 0x2a, 0x13, - 0xd1, 0xfa, 0x1d, 0xff, 0x32, 0x3a, 0x32, 0x12, - 0x6b, 0x00, 0x2a, 0x01, 0xd1, 0x06, 0x24, 0x1c, - 0xe0, 0xfa, 0x1d, 0xff, 0x32, 0xba, 0x32, 0x51, - 0x61, 0x80, 0x6a, 0x00, 0x28, 0x00, 0xd0, 0x01, - 0x1c, 0x38, 0x1c, 0xfc, 0xf7, 0x7f, 0xf8, 0x10, - 0xe0, 0x01, 0x26, 0xed, 0x09, 0x00, 0x3f, 0x03, - 0x0e, 0xe0, 0xf8, 0x1d, 0xb9, 0x30, 0x40, 0x68, - 0x00, 0x28, 0x08, 0xd0, 0xf8, 0x1d, 0xff, 0x30, - 0xba, 0x30, 0x41, 0x61, 0x00, 0x21, 0x38, 0x1c, - 0xfc, 0xf7, 0x6f, 0xf8, 0x00, 0xe0, 0x01, 0x26, - 0xcd, 0xf7, 0x62, 0xf9, 0x05, 0x1c, 0x01, 0xd1, - 0x07, 0x24, 0x19, 0xe0, 0xcf, 0x20, 0x28, 0x60, - 0x13, 0x21, 0x01, 0x20, 0xf5, 0xf7, 0xe5, 0xf9, - 0xe8, 0x60, 0x2c, 0x61, 0x00, 0x2f, 0x02, 0xd0, - 0xf8, 0x6a, 0x68, 0x61, 0x01, 0xe0, 0x00, 0x20, - 0x68, 0x61, 0x05, 0x20, 0x29, 0x1c, 0xcd, 0xf7, - 0xba, 0xf9, 0x00, 0x2e, 0x04, 0xd0, 0x38, 0x1c, - 0x21, 0x1c, 0xfb, 0xf7, 0xb6, 0xfc, 0x04, 0x1c, - 0x20, 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0xf8, 0xad, 0x03, 0x20, 0xb0, 0xb5, - 0xf5, 0xf7, 0xf7, 0xf9, 0x07, 0x1c, 0x35, 0xd0, - 0xcd, 0xf7, 0x36, 0xf9, 0x04, 0x1c, 0x1a, 0xd0, - 0x58, 0x20, 0x20, 0x60, 0x38, 0x6b, 0xfd, 0x1d, - 0xe0, 0x60, 0xb1, 0x35, 0x03, 0xcd, 0x16, 0xa3, - 0x1a, 0x68, 0x5b, 0x68, 0x08, 0x3d, 0xcc, 0xf7, - 0xb6, 0xfe, 0x00, 0x28, 0x03, 0xd0, 0xd0, 0xf7, - 0x56, 0xfb, 0x03, 0xc5, 0x08, 0x3d, 0x0c, 0xcd, - 0xe0, 0x1d, 0x09, 0x30, 0x0c, 0xc0, 0x07, 0x20, - 0x21, 0x1c, 0xcd, 0xf7, 0x88, 0xf9, 0xf9, 0x1d, - 0x9d, 0x31, 0x08, 0x68, 0x49, 0x68, 0xf7, 0xf7, - 0x98, 0xfe, 0x04, 0x1c, 0x38, 0x1c, 0x0a, 0xa1, - 0xf7, 0xf7, 0xe3, 0xfa, 0x00, 0x2c, 0x09, 0xd0, - 0x20, 0x6c, 0x00, 0x28, 0x02, 0xd0, 0x00, 0x20, - 0xe0, 0x62, 0x20, 0x64, 0x20, 0x1c, 0x09, 0xa1, - 0xf7, 0xf7, 0xe7, 0xfe, 0xb0, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, 0x6d, - 0x69, 0x66, 0x2e, 0x63, 0x3a, 0x20, 0xed, 0x09, - 0x00, 0x40, 0x03, 0x31, 0x39, 0x30, 0x39, 0x00, - 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x5c, 0x6c, - 0x6d, 0x69, 0x66, 0x2e, 0x63, 0x3a, 0x20, 0x31, - 0x39, 0x31, 0x35, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xb5, 0x07, 0x1c, 0xcd, 0xf7, 0xe3, 0xf8, 0x00, - 0x28, 0x07, 0xd0, 0x5b, 0x21, 0x01, 0x60, 0x39, - 0x6b, 0xc1, 0x60, 0x01, 0x1c, 0x07, 0x20, 0xcd, - 0xf7, 0x48, 0xf9, 0x80, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x80, 0xb5, 0xf5, 0xf7, 0x90, 0xf9, 0x07, - 0x1c, 0x0c, 0xd0, 0xf8, 0x1d, 0xf9, 0x30, 0xc1, - 0x6b, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x21, 0xc1, - 0x63, 0x38, 0x1c, 0xff, 0xf7, 0xe0, 0xff, 0x38, - 0x1c, 0x00, 0xf0, 0x1b, 0xf8, 0x80, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x80, 0xb5, 0xc7, 0x1d, 0xf9, - 0x37, 0xf8, 0x6b, 0x00, 0x28, 0x04, 0xd0, 0x03, - 0xa1, 0xf5, 0xf7, 0xcf, 0xfa, 0x00, 0x20, 0xf8, - 0x63, 0x80, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x70, 0x6f, 0x77, - 0x65, 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x36, - 0x35, 0x00, 0x00, 0x90, 0xb5, 0x82, 0xb0, 0xc4, - 0x1d, 0xf9, 0x34, 0x07, 0x1c, 0xe0, 0x6b, 0x00, - 0x28, 0x02, 0xd0, 0x08, 0xa1, 0xf5, 0xf7, 0xb5, - 0xfa, 0x0c, 0x49, 0x01, 0x97, 0x00, 0x91, 0x0b, - 0xa1, 0x08, 0x68, 0x00, 0x23, 0x01, 0x22, 0x49, - 0x68, 0xf5, 0xf7, 0x94, 0xfa, 0xe0, 0x63, 0x02, - 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x73, - 0x72, 0x63, 0x5c, 0x6c, 0x6d, 0x70, 0x6f, 0x77, - 0x65, 0x72, 0x2e, 0x63, 0x3a, 0x20, 0x31, 0x37, - 0x37, 0x00, 0x00, 0xa7, 0x39, 0x03, 0x20, 0x80, - 0x84, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xb5, 0x07, 0x1c, 0xcd, 0xf7, 0x7b, 0xf8, 0x00, - 0x28, 0x0d, 0xd0, 0x60, 0x21, 0x01, 0x60, 0x39, - 0x6b, 0xed, 0x09, 0x00, 0x41, 0x03, 0xc1, 0x60, - 0xf9, 0x68, 0x89, 0x6a, 0x41, 0x61, 0xf9, 0x68, - 0x49, 0x6a, 0x01, 0x61, 0x01, 0x1c, 0x07, 0x20, - 0xcd, 0xf7, 0xda, 0xf8, 0x80, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf0, 0xb5, 0x83, 0xb0, 0x04, 0x1c, - 0xc0, 0x68, 0xf5, 0xf7, 0x1f, 0xf9, 0x07, 0x1c, - 0x0d, 0xd0, 0x20, 0x69, 0x00, 0x28, 0x0e, 0xd0, - 0xf8, 0x1d, 0xff, 0x30, 0x3a, 0x30, 0x41, 0x69, - 0x01, 0x31, 0x41, 0x61, 0x02, 0x29, 0x02, 0xd9, - 0x77, 0x21, 0xc9, 0x43, 0x01, 0x62, 0x03, 0xb0, - 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xfd, 0x1d, - 0xff, 0x35, 0x3a, 0x35, 0x00, 0x26, 0x6e, 0x61, - 0xe8, 0x69, 0x61, 0x69, 0x41, 0x18, 0xe9, 0x61, - 0xa8, 0x69, 0x01, 0x30, 0xa8, 0x61, 0x04, 0x28, - 0x03, 0xda, 0x38, 0x1c, 0xff, 0xf7, 0x56, 0xff, - 0xe9, 0xe7, 0xdd, 0xf7, 0x21, 0xf9, 0x28, 0x62, - 0xee, 0x61, 0x32, 0x23, 0xd8, 0x42, 0xae, 0x61, - 0x0a, 0xdc, 0xf8, 0x68, 0x81, 0x6a, 0x01, 0x29, - 0x13, 0xd2, 0x81, 0x6a, 0x01, 0x31, 0x81, 0x62, - 0x38, 0x1c, 0xff, 0xf7, 0xab, 0xff, 0x0c, 0xe0, - 0x28, 0x23, 0xd8, 0x42, 0x09, 0xdb, 0xf8, 0x68, - 0x81, 0x6a, 0x00, 0x29, 0x05, 0xd9, 0x81, 0x6a, - 0x01, 0x39, 0x81, 0x62, 0x38, 0x1c, 0xff, 0xf7, - 0x9d, 0xff, 0x01, 0x23, 0x9b, 0x02, 0xf8, 0x18, - 0xc0, 0x6b, 0x00, 0x28, 0x05, 0xd0, 0x11, 0x23, - 0x9b, 0x01, 0xf8, 0x18, 0x00, 0x68, 0x00, 0x28, - 0xbd, 0xd0, 0x78, 0x69, 0x12, 0x28, 0xba, 0xd0, - 0x11, 0x28, 0xb8, 0xd0, 0x13, 0x28, 0xb6, 0xd0, - 0xf8, 0x1d, 0xb9, 0x30, 0x81, 0x6b, 0x00, 0x29, - 0x02, 0xd1, 0xaa, 0x6a, 0x00, 0x2a, 0x04, 0xd0, - 0x00, 0x29, 0xac, 0xd0, 0xc0, 0x6b, 0xc0, 0x0c, - 0xa9, 0xd3, 0x02, 0xab, 0x1e, 0x70, 0x1d, 0x48, - 0x29, 0x6a, 0x80, 0x68, 0xed, 0x09, 0x00, 0x42, - 0x03, 0x30, 0x22, 0xd2, 0x43, 0x01, 0x28, 0x01, - 0xd0, 0x3b, 0x22, 0xd2, 0x43, 0x91, 0x42, 0x13, - 0xdd, 0xa8, 0x68, 0xe9, 0x68, 0x88, 0x42, 0x2a, - 0xdd, 0x01, 0x38, 0xa8, 0x60, 0x38, 0x1c, 0xfd, - 0xf7, 0x8a, 0xfc, 0x01, 0x21, 0x02, 0xaa, 0x01, - 0x92, 0x00, 0x91, 0x20, 0x21, 0x02, 0x1c, 0x01, - 0x23, 0x38, 0x1c, 0xfd, 0xf7, 0x98, 0xfe, 0x1a, - 0xe0, 0x3d, 0x22, 0xd2, 0x43, 0x01, 0x28, 0x01, - 0xd0, 0x4a, 0x22, 0xd2, 0x43, 0x91, 0x42, 0x12, - 0xda, 0xa8, 0x68, 0x29, 0x69, 0x88, 0x42, 0x0e, - 0xda, 0x01, 0x30, 0xa8, 0x60, 0x38, 0x1c, 0xfd, - 0xf7, 0x6e, 0xfc, 0x01, 0x21, 0x02, 0xaa, 0x01, - 0x92, 0x00, 0x91, 0x1f, 0x21, 0x02, 0x1c, 0x01, - 0x23, 0x38, 0x1c, 0xfd, 0xf7, 0x7c, 0xfe, 0x6c, - 0xe7, 0x18, 0xec, 0x03, 0x20, 0xf0, 0xb5, 0x14, - 0x1c, 0x0d, 0x1c, 0x06, 0x1c, 0x1f, 0x1c, 0xcc, - 0xf7, 0xb6, 0xff, 0x00, 0x28, 0x0a, 0xd0, 0xe0, - 0x21, 0x01, 0x60, 0xf1, 0x6a, 0xc1, 0x60, 0x05, - 0x61, 0x44, 0x61, 0x87, 0x61, 0x01, 0x1c, 0x05, - 0x20, 0xcd, 0xf7, 0x18, 0xf8, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0x04, - 0x1c, 0xff, 0x30, 0xc1, 0x30, 0x0d, 0x1c, 0x01, - 0x6b, 0x17, 0x1c, 0x00, 0x29, 0x24, 0xd0, 0x01, - 0x39, 0x01, 0x63, 0xcc, 0xf7, 0x98, 0xff, 0x00, - 0x28, 0x1e, 0xd0, 0xdf, 0x21, 0x01, 0x60, 0x00, - 0x2f, 0x08, 0xd0, 0x0e, 0xcf, 0xc6, 0x1d, 0x0d, - 0x36, 0x0e, 0xc6, 0x0e, 0xcf, 0x0e, 0xc6, 0x0c, - 0xcf, 0x0c, 0xc6, 0x08, 0xe0, 0x00, 0x21, 0x00, - 0x22, 0x00, 0x23, 0xc7, 0x1d, 0x05, 0x37, 0x0e, - 0xc7, 0x0e, 0xc7, 0x0e, 0xc7, 0x08, 0xc7, 0x01, - 0x21, 0x41, 0x61, 0xe1, 0x6a, 0xc1, 0x60, 0x05, - 0x61, 0x01, 0x1c, 0x05, 0x20, 0xcc, 0xf7, 0xed, - 0x09, 0x00, 0x43, 0x03, 0xe6, 0xff, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0xb5, 0xf7, 0xf7, - 0x4e, 0xfa, 0x00, 0x28, 0x09, 0xd0, 0xc1, 0x1d, - 0xf9, 0x31, 0x0a, 0x6b, 0x00, 0x2a, 0x04, 0xd0, - 0x00, 0x22, 0x0a, 0x63, 0x22, 0x21, 0xff, 0xf7, - 0xc0, 0xff, 0x08, 0xbc, 0x18, 0x47, 0x08, 0xb5, - 0x0b, 0x1c, 0x11, 0x1c, 0x9a, 0x69, 0x02, 0x2a, - 0x08, 0xd2, 0x0b, 0xa2, 0x00, 0x92, 0x19, 0x23, - 0x79, 0x22, 0xfd, 0xf7, 0x97, 0xfe, 0x01, 0xb0, - 0x08, 0xbc, 0x18, 0x47, 0x05, 0x23, 0xdb, 0x01, - 0xc2, 0x18, 0x09, 0x23, 0x9b, 0x01, 0x91, 0x60, - 0xc1, 0x18, 0xca, 0x69, 0x01, 0x32, 0xca, 0x61, - 0x00, 0x21, 0xff, 0xf7, 0x1a, 0xfc, 0xee, 0xe7, - 0x00, 0x00, 0x4c, 0x6d, 0x4d, 0x61, 0x6e, 0x75, - 0x52, 0x63, 0x76, 0x52, 0x65, 0x71, 0x53, 0x74, - 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x00, - 0x00, 0x00, 0x88, 0xb5, 0x13, 0x1c, 0x8a, 0x69, - 0x10, 0x2a, 0x09, 0xd2, 0x1c, 0xa2, 0x19, 0x1c, - 0x19, 0x23, 0x00, 0x92, 0x79, 0x22, 0xfd, 0xf7, - 0x6d, 0xfe, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xca, 0x69, 0x13, 0x23, 0x92, 0x78, 0x5b, 0x01, - 0xc3, 0x18, 0x9a, 0x70, 0xca, 0x69, 0xff, 0x30, - 0xd2, 0x78, 0xff, 0x30, 0x42, 0x30, 0xda, 0x70, - 0xca, 0x69, 0x00, 0xab, 0x17, 0x79, 0x1f, 0x70, - 0x57, 0x79, 0x5f, 0x70, 0x97, 0x79, 0x9f, 0x70, - 0xd2, 0x79, 0xda, 0x70, 0x00, 0x9a, 0x42, 0x62, - 0xca, 0x69, 0x17, 0x7a, 0x1f, 0x70, 0x57, 0x7a, - 0x5f, 0x70, 0x97, 0x7a, 0x9f, 0x70, 0xd2, 0x7a, - 0xda, 0x70, 0x00, 0x9a, 0x82, 0x62, 0xc9, 0x69, - 0x0a, 0x7b, 0x1a, 0x70, 0x4a, 0x7b, 0x5a, 0x70, - 0x8a, 0x7b, 0x9a, 0x70, 0xc9, 0x7b, 0xd9, 0x70, - 0x00, 0x99, 0xc1, 0x62, 0xcd, 0xe7, 0x4c, 0x6d, - 0x4d, 0x61, 0xed, 0x09, 0x00, 0x44, 0x03, 0x6e, - 0x75, 0x52, 0x63, 0x76, 0x52, 0x63, 0x76, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x00, 0x00, 0x00, 0x90, 0xb5, 0x89, 0xb0, 0x0c, - 0x1c, 0x07, 0x1c, 0xa0, 0x69, 0x11, 0x1c, 0x10, - 0x28, 0x0a, 0xd2, 0x28, 0xa2, 0x00, 0x92, 0x79, - 0x22, 0x19, 0x23, 0x38, 0x1c, 0xfd, 0xf7, 0x20, - 0xfe, 0x09, 0xb0, 0x90, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x2a, - 0x31, 0xf7, 0xf7, 0x9d, 0xfb, 0x13, 0x23, 0x5b, - 0x01, 0xf8, 0x18, 0x81, 0x78, 0x02, 0xab, 0x01, - 0xaa, 0x59, 0x70, 0xc0, 0x78, 0x98, 0x70, 0x09, - 0x23, 0x9b, 0x01, 0xf8, 0x18, 0x41, 0x6a, 0x02, - 0xab, 0x03, 0x91, 0x81, 0x6a, 0x04, 0x91, 0xc0, - 0x6a, 0x05, 0x90, 0xe0, 0x69, 0x80, 0x78, 0x18, - 0x70, 0xe0, 0x69, 0xc0, 0x78, 0xd8, 0x70, 0xe0, - 0x69, 0x08, 0x3b, 0x01, 0x79, 0x19, 0x70, 0x41, - 0x79, 0x00, 0xab, 0x59, 0x70, 0x81, 0x79, 0x99, - 0x70, 0xc0, 0x79, 0xd8, 0x70, 0x00, 0x98, 0x06, - 0x90, 0xe0, 0x69, 0x01, 0x7a, 0x19, 0x70, 0x41, - 0x7a, 0x59, 0x70, 0x81, 0x7a, 0x99, 0x70, 0xc0, - 0x7a, 0xd8, 0x70, 0x00, 0x98, 0x07, 0x90, 0xe0, - 0x69, 0x01, 0x7b, 0x19, 0x70, 0x41, 0x7b, 0x59, - 0x70, 0x81, 0x7b, 0x99, 0x70, 0xc0, 0x7b, 0x00, - 0x21, 0xd8, 0x70, 0x00, 0x98, 0x08, 0x90, 0x38, - 0x1c, 0xff, 0xf7, 0xf1, 0xfe, 0xb4, 0xe7, 0x4c, - 0x6d, 0x4d, 0x61, 0x6e, 0x75, 0x52, 0x63, 0x76, - 0x53, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x00, 0x00, 0x88, - 0xb5, 0x13, 0x23, 0x5b, 0x01, 0x17, 0x1c, 0xc2, - 0x18, 0x12, 0x88, 0x1f, 0x2a, 0x09, 0xd0, 0x18, - 0xa2, 0x00, 0x92, 0x79, 0x22, 0x19, 0x23, 0x39, - 0x1c, 0xfd, 0xf7, 0xba, 0xfd, 0xed, 0x09, 0x00, - 0x45, 0x03, 0x88, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x8a, 0x69, 0x01, 0x2a, 0x07, 0xd8, 0x12, 0xa2, - 0x00, 0x92, 0x79, 0x22, 0x19, 0x23, 0x39, 0x1c, - 0xfd, 0xf7, 0xad, 0xfd, 0xf1, 0xe7, 0xca, 0x69, - 0x52, 0x78, 0x41, 0x2a, 0x07, 0xd0, 0xc1, 0x2a, - 0x09, 0xd0, 0xc2, 0x2a, 0x0b, 0xd1, 0x3a, 0x1c, - 0xff, 0xf7, 0x72, 0xff, 0xe5, 0xe7, 0x3a, 0x1c, - 0xff, 0xf7, 0xfa, 0xfe, 0xe1, 0xe7, 0x3a, 0x1c, - 0xff, 0xf7, 0x20, 0xff, 0xdd, 0xe7, 0x04, 0xa2, - 0x00, 0x92, 0x79, 0x22, 0x19, 0x23, 0x39, 0x1c, - 0xfd, 0xf7, 0x91, 0xfd, 0xd5, 0xe7, 0x00, 0x00, - 0x4c, 0x6d, 0x4d, 0x61, 0x6e, 0x75, 0x52, 0x63, - 0x76, 0x4d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x72, 0x00, 0x00, 0x00, - 0x90, 0xb5, 0x07, 0x1c, 0xff, 0x30, 0xc1, 0x30, - 0x00, 0x6b, 0x0c, 0x1c, 0x00, 0x28, 0x0c, 0xd0, - 0xf9, 0x1d, 0xff, 0x31, 0x38, 0x1c, 0x2a, 0x31, - 0xf7, 0xf7, 0xfc, 0xfa, 0x00, 0x2c, 0x04, 0xd0, - 0x00, 0x22, 0x38, 0x1c, 0x21, 0x1c, 0xff, 0xf7, - 0x89, 0xfe, 0x90, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0xb0, 0xb5, 0x83, 0xb0, 0x07, 0x1c, 0x41, 0x20, - 0x02, 0x90, 0xcc, 0xf7, 0x24, 0xfe, 0x05, 0x1c, - 0x01, 0xd1, 0x07, 0x24, 0x2e, 0xe0, 0x13, 0x23, - 0x5b, 0x01, 0xf8, 0x18, 0x00, 0x88, 0x1f, 0x28, - 0x01, 0xd0, 0x1a, 0x24, 0x1a, 0xe0, 0x38, 0x1c, - 0xfd, 0xf7, 0xb9, 0xfa, 0x01, 0x21, 0x02, 0xaa, - 0x01, 0x92, 0x00, 0x91, 0x79, 0x21, 0x02, 0x1c, - 0x01, 0x23, 0x38, 0x1c, 0xfd, 0xf7, 0xc7, 0xfc, - 0x04, 0x1c, 0x0b, 0xd1, 0xf9, 0x1d, 0xff, 0x31, - 0xba, 0x31, 0x01, 0x20, 0x08, 0x63, 0xf9, 0x1d, - 0xff, 0x31, 0x2a, 0x31, 0x38, 0x1c, 0x0a, 0x4a, - 0xf7, 0xf7, 0xdc, 0xfa, 0xcf, 0x20, 0x28, 0x60, - 0xed, 0x09, 0x00, 0x46, 0x03, 0x12, 0x21, 0x3f, - 0x20, 0xf4, 0xf7, 0x84, 0xfe, 0xe8, 0x60, 0x05, - 0x20, 0x29, 0x1c, 0x2c, 0x61, 0xcc, 0xf7, 0x60, - 0xfe, 0x20, 0x1c, 0x03, 0xb0, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x6b, 0x3c, 0x03, - 0x20, 0xb0, 0xb5, 0x8d, 0xb0, 0x0f, 0x1c, 0xca, - 0x1d, 0x04, 0x1c, 0xc1, 0x20, 0x0c, 0x90, 0x09, - 0x32, 0x0b, 0x92, 0xf8, 0x1d, 0x04, 0x21, 0x0a, - 0x91, 0x05, 0x30, 0x09, 0x90, 0xf9, 0x1d, 0x04, - 0x22, 0x08, 0x92, 0x01, 0x31, 0x04, 0x20, 0x06, - 0x90, 0x07, 0x91, 0x01, 0x21, 0x78, 0x1d, 0xba, - 0x1d, 0x05, 0x92, 0x03, 0x90, 0x01, 0x20, 0x01, - 0x22, 0x05, 0x23, 0xdb, 0x01, 0x04, 0x91, 0x0c, - 0xa9, 0x01, 0x91, 0xe5, 0x18, 0x00, 0x90, 0x06, - 0x23, 0x79, 0x21, 0x02, 0x92, 0xaa, 0x68, 0x20, - 0x1c, 0xfd, 0xf7, 0x7b, 0xfc, 0xc2, 0x20, 0x0c, - 0x90, 0xfa, 0x1d, 0x15, 0x32, 0xf8, 0x1d, 0x04, - 0x21, 0x0a, 0x91, 0x11, 0x30, 0x0b, 0x92, 0x09, - 0x90, 0xf9, 0x1d, 0x0d, 0x31, 0x04, 0x22, 0x08, - 0x92, 0x07, 0x91, 0x04, 0x20, 0x06, 0x90, 0x01, - 0x21, 0x04, 0x91, 0x38, 0x18, 0xfa, 0x1d, 0x05, - 0x92, 0x03, 0x90, 0x0c, 0xa9, 0x01, 0x91, 0x01, - 0x20, 0x01, 0x22, 0x00, 0x90, 0x02, 0x92, 0x79, - 0x21, 0x06, 0x23, 0x20, 0x1c, 0xaa, 0x68, 0xfd, - 0xf7, 0x58, 0xfc, 0x0d, 0xb0, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x07, 0x49, 0x08, - 0x48, 0x08, 0x4a, 0x01, 0x60, 0x42, 0x60, 0xc9, - 0x61, 0x41, 0x68, 0x02, 0x68, 0x91, 0x61, 0x06, - 0xc8, 0x08, 0x38, 0xd1, 0x61, 0x40, 0x68, 0x80, - 0x61, 0x70, 0x47, 0x00, 0x00, 0xb4, 0x17, 0x04, - 0x20, 0xc8, 0xb2, 0x03, 0x20, 0xd4, 0x17, 0x04, - 0x20, 0x00, 0xb5, 0x07, 0x48, 0x41, 0x68, 0x02, - 0x68, 0x91, 0x61, 0xed, 0x09, 0x00, 0x47, 0x03, - 0x01, 0x68, 0x40, 0x68, 0x00, 0x22, 0xc1, 0x61, - 0x00, 0x21, 0x00, 0x20, 0xe1, 0xf7, 0x03, 0xfa, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xc8, 0xb2, - 0x03, 0x20, 0xff, 0xb5, 0x82, 0xb0, 0x0c, 0x1c, - 0x07, 0x1c, 0x01, 0xf0, 0xc4, 0xfb, 0xf8, 0x68, - 0x01, 0x28, 0x02, 0xd1, 0x38, 0x1c, 0x00, 0xf0, - 0x3e, 0xf8, 0x01, 0x20, 0xf8, 0x60, 0xe1, 0xf7, - 0x9f, 0xf9, 0x00, 0x23, 0x00, 0x19, 0x59, 0x41, - 0x03, 0xc7, 0x08, 0x3f, 0x01, 0x91, 0xbc, 0x60, - 0x05, 0x9b, 0x05, 0x1c, 0x7b, 0x61, 0x04, 0x9a, - 0x15, 0x48, 0x3a, 0x61, 0x01, 0x68, 0x8e, 0x69, - 0x40, 0x68, 0x00, 0x90, 0x86, 0x42, 0x0b, 0xd0, - 0x03, 0xce, 0x08, 0x3e, 0x2a, 0x1c, 0x01, 0x9b, - 0xdc, 0xf7, 0xc5, 0xfd, 0x00, 0x28, 0x03, 0xd1, - 0xb6, 0x69, 0x00, 0x98, 0x86, 0x42, 0xf3, 0xd1, - 0xbe, 0x61, 0xf0, 0x69, 0x0a, 0x49, 0xf8, 0x61, - 0xf0, 0x69, 0x87, 0x61, 0xf7, 0x61, 0xf8, 0x69, - 0x09, 0x68, 0x88, 0x42, 0x04, 0xd1, 0x00, 0x22, - 0x20, 0x1c, 0x05, 0x49, 0xe1, 0xf7, 0xbf, 0xf9, - 0x01, 0xf0, 0x85, 0xfb, 0x06, 0xb0, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xc8, 0xb2, - 0x03, 0x20, 0xbb, 0x41, 0x03, 0x20, 0xf8, 0xb5, - 0x07, 0x1c, 0x02, 0xd1, 0xf8, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0xf8, 0x68, 0x00, 0x28, 0x00, 0xd1, - 0xf8, 0xe7, 0x01, 0xf0, 0x74, 0xfb, 0x1b, 0x48, - 0x01, 0x68, 0x89, 0x69, 0xb9, 0x42, 0x26, 0xd1, - 0xb9, 0x69, 0x40, 0x68, 0x81, 0x42, 0x05, 0xd1, - 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0xe1, 0xf7, - 0x9a, 0xf9, 0x1c, 0xe0, 0xe1, 0xf7, 0x48, 0xf9, - 0x0c, 0x1c, 0xb9, 0x69, 0x05, 0x1c, 0x08, 0x68, - 0x2a, 0x1c, 0x00, 0x90, 0x4e, 0x68, 0x31, 0x1c, - 0x23, 0x1c, 0xdc, 0xf7, 0xd8, 0xfd, 0xed, 0x09, - 0x00, 0x48, 0x03, 0x00, 0x28, 0x05, 0xd0, 0x00, - 0x22, 0x00, 0x20, 0x0c, 0x49, 0xe1, 0xf7, 0x85, - 0xf9, 0x07, 0xe0, 0x00, 0x98, 0x31, 0x1c, 0x40, - 0x1b, 0xa1, 0x41, 0x08, 0x49, 0x00, 0x22, 0xe1, - 0xf7, 0x7c, 0xf9, 0xf8, 0x69, 0xb9, 0x69, 0xc8, - 0x61, 0xb8, 0x69, 0xf9, 0x69, 0x88, 0x61, 0x00, - 0x20, 0xf8, 0x60, 0x01, 0xf0, 0x3a, 0xfb, 0xbf, - 0xe7, 0x00, 0x00, 0xc8, 0xb2, 0x03, 0x20, 0xbb, - 0x41, 0x03, 0x20, 0x90, 0xb5, 0x0c, 0x1c, 0x07, - 0x1c, 0x00, 0x28, 0x08, 0xd0, 0x38, 0x1c, 0xff, - 0xf7, 0xb0, 0xff, 0x3a, 0x69, 0x38, 0x1c, 0x21, - 0x1c, 0x7b, 0x69, 0xff, 0xf7, 0x60, 0xff, 0x90, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0xf0, 0xb5, 0x01, - 0xf0, 0x24, 0xfb, 0xe1, 0xf7, 0x07, 0xf9, 0x04, - 0x1c, 0x21, 0x48, 0x0f, 0x1c, 0x01, 0x68, 0x00, - 0x26, 0x8d, 0x69, 0x41, 0x68, 0x8d, 0x42, 0x05, - 0xd1, 0x01, 0xf0, 0x13, 0xfb, 0x30, 0x1c, 0xf0, - 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x06, 0x1c, 0x03, - 0xcd, 0x08, 0x3d, 0x22, 0x1c, 0x3b, 0x1c, 0xdc, - 0xf7, 0x30, 0xfd, 0x00, 0x28, 0x19, 0xd1, 0xa8, - 0x69, 0x31, 0x68, 0x88, 0x61, 0x30, 0x68, 0xa9, - 0x69, 0xc8, 0x61, 0x00, 0x20, 0xe8, 0x60, 0x69, - 0x69, 0x2a, 0x69, 0x28, 0x1c, 0xcc, 0xf7, 0xe9, - 0xf8, 0x00, 0x28, 0x05, 0xd0, 0xa9, 0x68, 0x2a, - 0x69, 0x6b, 0x69, 0x28, 0x1c, 0xff, 0xf7, 0x2b, - 0xff, 0x30, 0x68, 0x85, 0x69, 0x70, 0x68, 0x85, - 0x42, 0xdd, 0xd1, 0x70, 0x68, 0x85, 0x42, 0x03, - 0xd1, 0x01, 0xf0, 0xe7, 0xfa, 0x00, 0x20, 0xd2, - 0xe7, 0x03, 0xcd, 0x00, 0x1b, 0xb9, 0x41, 0x04, - 0x49, 0x00, 0x22, 0xe1, 0xf7, 0x16, 0xf9, 0x01, - 0xf0, 0xdc, 0xfa, 0x00, 0x20, 0xc7, 0xe7, 0xc8, - 0xb2, 0x03, 0x20, 0xbb, 0x41, 0x03, 0x20, 0x00, - 0x28, 0xed, 0x09, 0x00, 0x49, 0x03, 0x01, 0xd1, - 0x1f, 0xa0, 0x70, 0x47, 0x01, 0x28, 0x01, 0xd1, - 0x22, 0xa0, 0x70, 0x47, 0x02, 0x28, 0x01, 0xd1, - 0x25, 0xa0, 0x70, 0x47, 0x03, 0x28, 0x01, 0xd1, - 0x28, 0xa0, 0x70, 0x47, 0x04, 0x28, 0x01, 0xd1, - 0x2b, 0xa0, 0x70, 0x47, 0x05, 0x28, 0x01, 0xd1, - 0x2e, 0xa0, 0x70, 0x47, 0x06, 0x28, 0x01, 0xd1, - 0x31, 0xa0, 0x70, 0x47, 0x07, 0x28, 0x01, 0xd1, - 0x34, 0xa0, 0x70, 0x47, 0x08, 0x28, 0x01, 0xd1, - 0x37, 0xa0, 0x70, 0x47, 0x09, 0x28, 0x01, 0xd1, - 0x3a, 0xa0, 0x70, 0x47, 0x0a, 0x28, 0x01, 0xd1, - 0x3d, 0xa0, 0x70, 0x47, 0x0b, 0x28, 0x01, 0xd1, - 0x40, 0xa0, 0x70, 0x47, 0x0c, 0x28, 0x01, 0xd1, - 0x43, 0xa0, 0x70, 0x47, 0x0d, 0x28, 0x01, 0xd1, - 0x46, 0xa0, 0x70, 0x47, 0x0e, 0x28, 0x01, 0xd1, - 0x4a, 0xa0, 0x70, 0x47, 0x0f, 0x28, 0x01, 0xd1, - 0x4d, 0xa0, 0x70, 0x47, 0x52, 0xa0, 0x70, 0x47, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x72, 0x6f, - 0x6d, 0x5f, 0x55, 0x50, 0x5f, 0x54, 0x6f, 0x5f, - 0x48, 0x43, 0x00, 0x00, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x5f, 0x48, 0x43, - 0x5f, 0x54, 0x6f, 0x5f, 0x48, 0x43, 0x00, 0x00, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x72, 0x6f, - 0x6d, 0x5f, 0x48, 0x43, 0x5f, 0x54, 0x6f, 0x5f, - 0x4c, 0x4d, 0x00, 0x00, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x5f, 0x48, 0x43, - 0x5f, 0x54, 0x6f, 0x5f, 0x4c, 0x43, 0x00, 0x00, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x72, 0x6f, - 0x6d, 0x5f, 0x48, 0x43, 0x5f, 0x54, 0x6f, 0x5f, - 0x49, 0x72, 0x71, 0x00, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x5f, 0x4c, 0x4d, - 0x5f, 0x54, 0x6f, 0x5f, 0x48, 0x43, 0x00, 0x00, - 0x45, 0x76, 0x65, 0x6e, 0xed, 0x09, 0x00, 0x4a, - 0x03, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x5f, 0x4c, - 0x4d, 0x5f, 0x54, 0x6f, 0x5f, 0x4c, 0x4d, 0x00, - 0x00, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x5f, 0x4c, 0x4d, 0x5f, 0x54, 0x6f, - 0x5f, 0x4c, 0x43, 0x00, 0x00, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x5f, 0x4c, - 0x43, 0x5f, 0x54, 0x6f, 0x5f, 0x48, 0x43, 0x00, - 0x00, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x5f, 0x4c, 0x43, 0x5f, 0x54, 0x6f, - 0x5f, 0x4c, 0x4d, 0x00, 0x00, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x5f, 0x4c, - 0x43, 0x5f, 0x54, 0x6f, 0x5f, 0x4c, 0x43, 0x00, - 0x00, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x5f, 0x4c, 0x43, 0x5f, 0x54, 0x6f, - 0x5f, 0x49, 0x72, 0x71, 0x00, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x5f, 0x44, - 0x50, 0x43, 0x5f, 0x54, 0x6f, 0x5f, 0x4c, 0x43, - 0x00, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x5f, 0x49, 0x72, 0x71, 0x5f, 0x54, - 0x6f, 0x5f, 0x44, 0x50, 0x43, 0x00, 0x00, 0x00, - 0x00, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x5f, 0x49, 0x72, 0x71, 0x5f, 0x54, - 0x6f, 0x5f, 0x4c, 0x43, 0x00, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x5f, 0x49, - 0x72, 0x71, 0x5f, 0x54, 0x6f, 0x5f, 0x49, 0x72, - 0x71, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x42, 0x54, - 0x5f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xa0, 0x70, - 0x47, 0x01, 0x28, 0x01, 0xd1, 0x3c, 0xa0, 0x70, - 0x47, 0x02, 0x28, 0x01, 0xd1, 0x40, 0xa0, 0xed, - 0x09, 0x00, 0x4b, 0x03, 0x70, 0x47, 0x03, 0x28, - 0x01, 0xd1, 0x45, 0xa0, 0x70, 0x47, 0x04, 0x28, - 0x01, 0xd1, 0x49, 0xa0, 0x70, 0x47, 0x05, 0x28, - 0x01, 0xd1, 0x4e, 0xa0, 0x70, 0x47, 0x06, 0x28, - 0x01, 0xd1, 0x53, 0xa0, 0x70, 0x47, 0x07, 0x28, - 0x01, 0xd1, 0x57, 0xa0, 0x70, 0x47, 0x08, 0x28, - 0x01, 0xd1, 0x5a, 0xa0, 0x70, 0x47, 0x09, 0x28, - 0x01, 0xd1, 0x5e, 0xa0, 0x70, 0x47, 0x0a, 0x28, - 0x01, 0xd1, 0x62, 0xa0, 0x70, 0x47, 0x0b, 0x28, - 0x01, 0xd1, 0x68, 0xa0, 0x70, 0x47, 0x0c, 0x28, - 0x01, 0xd1, 0x6f, 0xa0, 0x70, 0x47, 0x0d, 0x28, - 0x01, 0xd1, 0x74, 0xa0, 0x70, 0x47, 0x0e, 0x28, - 0x01, 0xd1, 0x79, 0xa0, 0x70, 0x47, 0x0f, 0x28, - 0x01, 0xd1, 0x7f, 0xa0, 0x70, 0x47, 0x10, 0x28, - 0x01, 0xd1, 0x83, 0xa0, 0x70, 0x47, 0x11, 0x28, - 0x01, 0xd1, 0x88, 0xa0, 0x70, 0x47, 0x12, 0x28, - 0x01, 0xd1, 0x8d, 0xa0, 0x70, 0x47, 0x13, 0x28, - 0x01, 0xd1, 0x93, 0xa0, 0x70, 0x47, 0x14, 0x28, - 0x01, 0xd1, 0x9a, 0xa0, 0x70, 0x47, 0x15, 0x28, - 0x01, 0xd1, 0x9f, 0xa0, 0x70, 0x47, 0x16, 0x28, - 0x01, 0xd1, 0xa4, 0xa0, 0x70, 0x47, 0x17, 0x28, - 0x01, 0xd1, 0xab, 0xa0, 0x70, 0x47, 0x18, 0x28, - 0x01, 0xd1, 0xaf, 0xa0, 0x70, 0x47, 0x19, 0x28, - 0x01, 0xd1, 0xb4, 0xa0, 0x70, 0x47, 0x1a, 0x28, - 0x01, 0xd1, 0xba, 0xa0, 0x70, 0x47, 0x1b, 0x28, - 0x01, 0xd1, 0xbd, 0xa0, 0x70, 0x47, 0x1c, 0x28, - 0x01, 0xd1, 0xc1, 0xa0, 0x70, 0x47, 0xc5, 0xa0, - 0x70, 0x47, 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, - 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, - 0x42, 0x59, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, - 0x5f, 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, - 0x5f, 0x52, 0xed, 0x09, 0x00, 0x4c, 0x03, 0x45, - 0x51, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, - 0x5f, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x51, 0x55, - 0x49, 0x52, 0x59, 0x5f, 0x53, 0x43, 0x41, 0x4e, - 0x5f, 0x52, 0x45, 0x51, 0x00, 0x00, 0x00, 0x42, - 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, - 0x49, 0x4e, 0x51, 0x55, 0x49, 0x52, 0x59, 0x5f, - 0x53, 0x43, 0x41, 0x4e, 0x00, 0x00, 0x00, 0x42, - 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, - 0x49, 0x4e, 0x51, 0x55, 0x49, 0x52, 0x59, 0x5f, - 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x57, 0x41, 0x49, - 0x54, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, - 0x5f, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x51, 0x55, - 0x49, 0x52, 0x59, 0x5f, 0x53, 0x43, 0x41, 0x4e, - 0x5f, 0x52, 0x53, 0x50, 0x00, 0x00, 0x00, 0x42, - 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, - 0x50, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x43, 0x41, - 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x00, 0x00, 0x42, - 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, - 0x50, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x43, 0x41, - 0x4e, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, - 0x5f, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x47, 0x45, - 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x52, 0x53, - 0x50, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, - 0x5f, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x47, 0x45, - 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x5f, 0x50, 0x4f, - 0x4c, 0x4c, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, - 0x5f, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x4e, - 0x44, 0x42, 0x59, 0x5f, 0x49, 0x4e, 0x51, 0x55, - 0x49, 0x52, 0x59, 0x5f, 0x52, 0x45, 0x51, 0x00, - 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, - 0x5f, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x4e, - 0x44, 0x42, 0x59, 0x5f, 0x49, 0xed, 0x09, 0x00, - 0x4d, 0x03, 0x4e, 0x51, 0x55, 0x49, 0x52, 0x59, - 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x52, 0x45, - 0x51, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x4e, 0x44, 0x42, 0x59, 0x5f, 0x49, 0x4e, 0x51, - 0x55, 0x49, 0x52, 0x59, 0x00, 0x00, 0x00, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, 0x54, - 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x42, 0x59, - 0x5f, 0x50, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, - 0x51, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x4e, 0x44, 0x42, 0x59, 0x5f, 0x50, 0x41, 0x47, - 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x52, - 0x45, 0x51, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x4e, 0x44, 0x42, 0x59, 0x5f, 0x50, 0x41, 0x47, - 0x45, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, - 0x4e, 0x44, 0x42, 0x59, 0x5f, 0x50, 0x41, 0x47, - 0x45, 0x5f, 0x52, 0x53, 0x50, 0x00, 0x00, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, 0x54, - 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x42, 0x59, - 0x5f, 0x50, 0x41, 0x47, 0x45, 0x5f, 0x50, 0x4f, - 0x4c, 0x4c, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, 0x4e, - 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x49, - 0x4e, 0x51, 0x55, 0x49, 0x52, 0x59, 0x5f, 0x52, - 0x45, 0x51, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, 0x4e, - 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, 0x49, - 0x4e, 0x51, 0x55, 0x49, 0x52, 0x59, 0x5f, 0x53, - 0x54, 0x4f, 0x50, 0x5f, 0x52, 0x45, 0x51, 0x00, - 0xed, 0x09, 0x00, 0x4e, 0x03, 0x42, 0x54, 0x5f, - 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, - 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, - 0x49, 0x4e, 0x51, 0x55, 0x49, 0x52, 0x59, 0x00, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, - 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x45, 0x44, 0x5f, 0x50, 0x41, 0x47, 0x45, - 0x5f, 0x52, 0x45, 0x51, 0x00, 0x42, 0x54, 0x5f, - 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, - 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, - 0x50, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x4f, - 0x50, 0x5f, 0x52, 0x45, 0x51, 0x00, 0x00, 0x00, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, - 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x45, 0x44, 0x5f, 0x50, 0x41, 0x47, 0x45, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, - 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x45, 0x44, 0x5f, 0x50, 0x41, 0x47, 0x45, - 0x5f, 0x52, 0x53, 0x50, 0x00, 0x42, 0x54, 0x5f, - 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, - 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x5f, - 0x50, 0x41, 0x47, 0x45, 0x5f, 0x50, 0x4f, 0x4c, - 0x4c, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, - 0x4c, 0x43, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, - 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x00, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, - 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x50, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x53, - 0x54, 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, - 0x4e, 0x47, 0x45, 0x00, 0x00, 0x5f, 0x42, 0x54, - 0x5f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x75, - 0x6e, 0x6b, 0x6e, 0xed, 0x09, 0x00, 0x4f, 0x03, - 0x6f, 0x77, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x01, 0xd1, 0x0b, 0xa0, 0x70, 0x47, 0x01, 0x28, - 0x01, 0xd1, 0x0d, 0xa0, 0x70, 0x47, 0x02, 0x28, - 0x01, 0xd1, 0x11, 0xa0, 0x70, 0x47, 0x03, 0x28, - 0x01, 0xd1, 0x14, 0xa0, 0x70, 0x47, 0x04, 0x28, - 0x01, 0xd1, 0x18, 0xa0, 0x70, 0x47, 0x05, 0x28, - 0x01, 0xd1, 0x1b, 0xa0, 0x70, 0x47, 0x20, 0xa0, - 0x70, 0x47, 0x42, 0x54, 0x5f, 0x4c, 0x49, 0x4e, - 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x49, 0x44, 0x4c, - 0x45, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x49, 0x4e, - 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x52, 0x4f, 0x4c, - 0x45, 0x5f, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, - 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x49, 0x4e, - 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x50, 0x41, 0x47, - 0x49, 0x4e, 0x47, 0x00, 0x00, 0x00, 0x42, 0x54, - 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, - 0x5f, 0x44, 0x45, 0x54, 0x41, 0x43, 0x48, 0x49, - 0x4e, 0x47, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, - 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, - 0x5f, 0x44, 0x45, 0x54, 0x41, 0x43, 0x48, 0x45, - 0x44, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x49, 0x4e, - 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, 0x4e, - 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x00, 0x00, - 0x00, 0x00, 0x5f, 0x42, 0x54, 0x5f, 0x4c, 0x63, - 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x00, 0x00, 0x28, 0x01, 0xd1, 0x0f, 0xa0, - 0x70, 0x47, 0x01, 0x28, 0x01, 0xd1, 0x12, 0xa0, - 0x70, 0x47, 0x02, 0x28, 0x01, 0xd1, 0x15, 0xa0, - 0x70, 0x47, 0x03, 0x28, 0x01, 0xd1, 0x1a, 0xa0, - 0x70, 0x47, 0x04, 0x28, 0x01, 0xd1, 0x1e, 0xa0, - 0x70, 0x47, 0x05, 0x28, 0x01, 0xd1, 0xed, 0x09, - 0x00, 0x50, 0x03, 0x21, 0xa0, 0x70, 0x47, 0x06, - 0x28, 0x01, 0xd1, 0x26, 0xa0, 0x70, 0x47, 0x07, - 0x28, 0x01, 0xd1, 0x2a, 0xa0, 0x70, 0x47, 0x2f, - 0xa0, 0x70, 0x47, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x72, 0x65, 0x65, 0x00, 0x00, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x6c, - 0x65, 0x00, 0x00, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x71, - 0x75, 0x69, 0x72, 0x79, 0x00, 0x00, 0x00, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x67, - 0x65, 0x00, 0x00, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x71, 0x75, 0x69, 0x72, 0x79, - 0x53, 0x63, 0x61, 0x6e, 0x00, 0x00, 0x00, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x67, - 0x65, 0x53, 0x63, 0x61, 0x6e, 0x00, 0x00, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x78, 0x54, - 0x65, 0x73, 0x74, 0x00, 0x00, 0x00, 0x00, 0x5f, - 0x42, 0x54, 0x5f, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd1, 0x05, - 0xa0, 0x70, 0x47, 0x01, 0x28, 0x01, 0xd1, 0x07, - 0xa0, 0xed, 0x09, 0x00, 0x51, 0x03, 0x70, 0x47, - 0x02, 0x28, 0x01, 0xd1, 0x0a, 0xa0, 0x70, 0x47, - 0x0e, 0xa0, 0x70, 0x47, 0x42, 0x54, 0x5f, 0x4c, - 0x43, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4e, - 0x4f, 0x4e, 0x45, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x43, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4d, - 0x41, 0x53, 0x54, 0x45, 0x52, 0x00, 0x00, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x43, 0x5f, 0x4d, 0x4f, - 0x44, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x56, 0x45, - 0x00, 0x00, 0x00, 0x00, 0x5f, 0x42, 0x54, 0x5f, - 0x4d, 0x6f, 0x64, 0x65, 0x5f, 0x75, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x01, 0xd1, 0x23, 0xa0, 0x70, 0x47, - 0x01, 0x28, 0x01, 0xd1, 0x26, 0xa0, 0x70, 0x47, - 0x02, 0x28, 0x01, 0xd1, 0x29, 0xa0, 0x70, 0x47, - 0x03, 0x28, 0x01, 0xd1, 0x2b, 0xa0, 0x70, 0x47, - 0x04, 0x28, 0x01, 0xd1, 0x2d, 0xa0, 0x70, 0x47, - 0x05, 0x28, 0x01, 0xd1, 0x2f, 0xa0, 0x70, 0x47, - 0x06, 0x28, 0x01, 0xd1, 0x31, 0xa0, 0x70, 0x47, - 0x07, 0x28, 0x01, 0xd1, 0x33, 0xa0, 0x70, 0x47, - 0x08, 0x28, 0x01, 0xd1, 0x35, 0xa0, 0x70, 0x47, - 0x09, 0x28, 0x01, 0xd1, 0x37, 0xa0, 0x70, 0x47, - 0x0a, 0x28, 0x01, 0xd1, 0x3a, 0xa0, 0x70, 0x47, - 0x0b, 0x28, 0x01, 0xd1, 0x3c, 0xa0, 0x70, 0x47, - 0x0c, 0x28, 0x01, 0xd1, 0x3e, 0xa0, 0x70, 0x47, - 0x0d, 0x28, 0x01, 0xd1, 0x42, 0xa0, 0x70, 0x47, - 0x0e, 0x28, 0x01, 0xd1, 0x46, 0xa0, 0x70, 0x47, - 0x0f, 0x28, 0x01, 0xd1, 0x48, 0xa0, 0x70, 0x47, - 0x10, 0x28, 0x01, 0xd1, 0x4a, 0xa0, 0x70, 0x47, - 0x11, 0x28, 0x01, 0xd1, 0x4c, 0xa0, 0x70, 0x47, - 0x52, 0xa0, 0x70, 0x47, 0x42, 0x54, 0x5f, 0x50, - 0x4b, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4e, 0x55, 0x4c, 0x4c, 0xed, 0x09, 0x00, 0x52, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, - 0x50, 0x4b, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x50, 0x4f, 0x4c, 0x4c, 0x00, 0x00, 0x00, - 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x48, 0x53, - 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4d, 0x31, - 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x48, 0x31, - 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x56, 0x31, - 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x56, 0x32, - 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x56, 0x33, - 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x56, 0x00, - 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x55, 0x58, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, - 0x50, 0x4b, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x44, 0x4d, 0x33, 0x00, 0x42, 0x54, 0x5f, - 0x50, 0x4b, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x44, 0x48, 0x33, 0x00, 0x42, 0x54, 0x5f, - 0x50, 0x4b, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x43, 0x00, 0x00, 0x42, 0x54, 0x5f, - 0x50, 0x4b, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x44, 0x00, 0x00, 0x42, 0x54, 0x5f, - 0x50, 0x4b, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x44, 0x4d, 0x35, 0x00, 0x42, 0x54, 0xed, - 0x09, 0x00, 0x53, 0x03, 0x5f, 0x50, 0x4b, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x48, - 0x35, 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x44, - 0x00, 0x00, 0x42, 0x54, 0x5f, 0x50, 0x4b, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, - 0x44, 0x5f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x53, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x42, - 0x54, 0x5f, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, - 0x5f, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x00, 0x00, 0x28, - 0x01, 0xd1, 0x09, 0xa0, 0x70, 0x47, 0x01, 0x28, - 0x01, 0xd1, 0x0d, 0xa0, 0x70, 0x47, 0x02, 0x28, - 0x01, 0xd1, 0x12, 0xa0, 0x70, 0x47, 0x03, 0x28, - 0x01, 0xd1, 0x17, 0xa0, 0x70, 0x47, 0x04, 0x28, - 0x01, 0xd1, 0x1e, 0xa0, 0x70, 0x47, 0x26, 0xa0, - 0x70, 0x47, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x49, 0x64, 0x6c, - 0x65, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x4d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x75, 0x62, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x5f, 0x53, 0x6c, 0x61, 0x76, 0x65, 0x00, 0x00, - 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x4d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x6f, 0x53, 0x6c, 0x61, - 0x76, 0x65, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x75, 0xed, 0x09, 0x00, 0x54, 0x03, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x53, 0x6c, - 0x61, 0x76, 0x65, 0x54, 0x6f, 0x4d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x5f, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x00, 0x00, 0x28, 0x01, 0xd1, 0x29, - 0xa0, 0x70, 0x47, 0x01, 0x28, 0x01, 0xd1, 0x2c, - 0xa0, 0x70, 0x47, 0x02, 0x28, 0x01, 0xd1, 0x30, - 0xa0, 0x70, 0x47, 0x03, 0x28, 0x01, 0xd1, 0x35, - 0xa0, 0x70, 0x47, 0x04, 0x28, 0x01, 0xd1, 0x3c, - 0xa0, 0x70, 0x47, 0x05, 0x28, 0x01, 0xd1, 0x40, - 0xa0, 0x70, 0x47, 0x06, 0x28, 0x01, 0xd1, 0x45, - 0xa0, 0x70, 0x47, 0x07, 0x28, 0x01, 0xd1, 0x4c, - 0xa0, 0x70, 0x47, 0x08, 0x28, 0x01, 0xd1, 0x52, - 0xa0, 0x70, 0x47, 0x09, 0x28, 0x01, 0xd1, 0x5c, - 0xa0, 0x70, 0x47, 0x0a, 0x28, 0x01, 0xd1, 0x66, - 0xa0, 0x70, 0x47, 0x0b, 0x28, 0x01, 0xd1, 0x6a, - 0xa0, 0x70, 0x47, 0x0c, 0x28, 0x01, 0xd1, 0x70, - 0xa0, 0x70, 0x47, 0x0d, 0x28, 0x01, 0xd1, 0x75, - 0xa0, 0x70, 0x47, 0x0e, 0x28, 0x01, 0xd1, 0x7b, - 0xa0, 0x70, 0x47, 0x0f, 0x28, 0x01, 0xd1, 0x7f, - 0xa0, 0x70, 0x47, 0x10, 0x28, 0x01, 0xd1, 0x87, - 0xa0, 0x70, 0x47, 0x11, 0x28, 0x01, 0xd1, 0x8f, - 0xa0, 0x70, 0x47, 0x12, 0x28, 0x01, 0xd1, 0x94, - 0xa0, 0x70, 0x47, 0x13, 0x28, 0x01, 0xd1, 0x99, - 0xa0, 0x70, 0x47, 0x14, 0x28, 0x01, 0xd1, 0x9d, - 0xa0, 0x70, 0x47, 0xa1, 0xa0, 0x70, 0x47, 0x42, - 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, 0x4e, - 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x49, 0x44, 0x4c, - 0x45, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x4d, - 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0xed, 0x09, 0x00, - 0x55, 0x03, 0x5f, 0x53, 0x54, 0x5f, 0x42, 0x42, - 0x5f, 0x50, 0x41, 0x47, 0x45, 0x00, 0x00, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, - 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x42, 0x42, - 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, - 0x45, 0x44, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x4d, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x53, - 0x54, 0x5f, 0x50, 0x52, 0x45, 0x5f, 0x43, 0x4f, - 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x00, 0x00, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, - 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, - 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x00, 0x00, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, - 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x43, 0x4f, - 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x5f, 0x49, 0x4e, - 0x44, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, - 0x4d, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x53, - 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x5f, 0x41, 0x4e, 0x53, 0x57, 0x45, 0x52, - 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, - 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x49, 0x4e, - 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x00, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, - 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x49, 0x4e, - 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, - 0x5f, 0x52, 0x41, 0x4e, 0x44, 0x5f, 0x43, 0x4f, - 0x4c, 0x4c, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x00, - 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, - 0xed, 0x09, 0x00, 0x56, 0x03, 0x4e, 0x4b, 0x5f, - 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x5f, - 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x41, 0x55, 0x5f, 0x52, 0x41, - 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4c, 0x4c, 0x49, - 0x53, 0x49, 0x4f, 0x4e, 0x00, 0x42, 0x54, 0x5f, - 0x4c, 0x4d, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, - 0x53, 0x54, 0x5f, 0x50, 0x41, 0x49, 0x52, 0x49, - 0x4e, 0x47, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, - 0x4c, 0x4d, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, - 0x53, 0x54, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x45, - 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, 0x5f, - 0x4c, 0x4d, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, - 0x53, 0x54, 0x5f, 0x45, 0x4e, 0x43, 0x52, 0x59, - 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x00, 0x00, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, - 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x53, - 0x45, 0x54, 0x55, 0x50, 0x5f, 0x43, 0x4f, 0x4d, - 0x50, 0x4c, 0x45, 0x54, 0x45, 0x00, 0x00, 0x00, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, - 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, - 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, - 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, - 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4b, 0x45, 0x59, - 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, - 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, - 0x5f, 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x5f, - 0x4c, 0x49, 0x4e, 0xed, 0x09, 0x00, 0x57, 0x03, - 0x4b, 0x5f, 0x4b, 0x45, 0x59, 0x00, 0x42, 0x54, - 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, - 0x5f, 0x53, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, - 0x00, 0x00, 0x42, 0x54, 0x5f, 0x4c, 0x4d, 0x5f, - 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x53, 0x54, 0x5f, - 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, - 0x43, 0x54, 0x00, 0x00, 0x00, 0x00, 0x42, 0x54, - 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, - 0x5f, 0x53, 0x54, 0x5f, 0x42, 0x42, 0x5f, 0x44, - 0x45, 0x54, 0x41, 0x43, 0x48, 0x00, 0x42, 0x54, - 0x5f, 0x4c, 0x4d, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, - 0x5f, 0x53, 0x54, 0x5f, 0x45, 0x4e, 0x44, 0x00, - 0x00, 0x00, 0x5f, 0x42, 0x54, 0x5f, 0x4c, 0x6d, - 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x00, 0x00, 0xb5, 0x03, 0x49, 0x06, 0x22, - 0xcb, 0xf7, 0xad, 0xf9, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x00, 0x30, 0x7c, 0x00, 0x00, 0xf0, 0xb5, - 0x00, 0x24, 0xc4, 0x60, 0x07, 0x1c, 0x00, 0x20, - 0x0d, 0x5c, 0x3e, 0x18, 0x01, 0x30, 0x08, 0x28, - 0x35, 0x74, 0xf9, 0xdb, 0xba, 0x61, 0x06, 0x2b, - 0x02, 0xd1, 0x01, 0x20, 0x38, 0x77, 0x00, 0xe0, - 0x3c, 0x77, 0x7c, 0x62, 0x3c, 0x62, 0x3c, 0x60, - 0x7c, 0x60, 0x0e, 0x48, 0x00, 0xf0, 0xef, 0xfb, - 0x0e, 0x48, 0xf8, 0x60, 0x0e, 0x48, 0x01, 0x68, - 0x00, 0x29, 0x06, 0xd0, 0x09, 0x68, 0x39, 0x60, - 0x4f, 0x60, 0x00, 0x68, 0x78, 0x60, 0x07, 0x60, - 0x02, 0xe0, 0x07, 0x60, 0x3f, 0x60, 0x7f, 0x60, - 0x08, 0x48, 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, - 0x00, 0xf0, 0xd5, 0xfb, 0x20, 0x1c, 0xf0, 0xbc, - 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x58, 0x03, 0x74, 0x67, 0x03, 0x20, 0x41, - 0x4d, 0x45, 0x53, 0x6c, 0x67, 0x03, 0x20, 0x70, - 0x67, 0x03, 0x20, 0xf0, 0xb5, 0x24, 0x4e, 0x07, - 0x1c, 0x30, 0x1c, 0x00, 0xf0, 0xc6, 0xfb, 0x00, - 0x21, 0xf9, 0x60, 0x00, 0xf0, 0xbe, 0xfb, 0x20, - 0x48, 0x00, 0xf0, 0xbf, 0xfb, 0x39, 0x68, 0x1f, - 0x48, 0xb9, 0x42, 0x02, 0xd1, 0x00, 0x21, 0x01, - 0x60, 0x09, 0xe0, 0x7a, 0x68, 0x4a, 0x60, 0x06, - 0xcf, 0x08, 0x3f, 0x11, 0x60, 0x01, 0x68, 0x8f, - 0x42, 0x01, 0xd1, 0x79, 0x68, 0x01, 0x60, 0x18, - 0x48, 0x00, 0x25, 0x01, 0x68, 0x01, 0x39, 0x01, - 0x60, 0x7c, 0x6a, 0x00, 0x2c, 0x1d, 0xd0, 0x11, - 0x48, 0x00, 0xf0, 0xa3, 0xfb, 0x2f, 0x20, 0xc0, - 0x43, 0x60, 0x61, 0x20, 0x69, 0x66, 0x68, 0x06, - 0x21, 0xdd, 0xf7, 0xb5, 0xfb, 0x05, 0x43, 0x78, - 0x6a, 0xb0, 0x42, 0x01, 0xd1, 0x00, 0x24, 0x00, - 0xe0, 0x34, 0x1c, 0x09, 0x48, 0x00, 0xf0, 0xa1, - 0xfb, 0x07, 0x48, 0x00, 0xf0, 0x9a, 0xfb, 0x00, - 0x2c, 0xe5, 0xd1, 0x00, 0x2d, 0x01, 0xd0, 0x00, - 0xf0, 0x90, 0xfb, 0x00, 0xf0, 0x82, 0xfb, 0xf0, - 0xbc, 0x08, 0xbc, 0x00, 0x20, 0x18, 0x47, 0x00, - 0x67, 0x03, 0x20, 0x74, 0x67, 0x03, 0x20, 0x6c, - 0x67, 0x03, 0x20, 0x70, 0x67, 0x03, 0x20, 0xf0, - 0xb5, 0x87, 0xb0, 0x04, 0x1c, 0x00, 0x25, 0x0f, - 0x1c, 0x20, 0x48, 0x00, 0xf0, 0x72, 0xfb, 0xa0, - 0x69, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x38, 0xa0, - 0x61, 0x30, 0xe0, 0x00, 0x2f, 0x2c, 0xd0, 0x20, - 0x6a, 0x01, 0xad, 0x01, 0x30, 0x20, 0x62, 0x00, - 0x20, 0x02, 0x90, 0x01, 0x90, 0x18, 0x48, 0x04, - 0x94, 0x06, 0x68, 0x05, 0x96, 0x20, 0x7f, 0x00, - 0x28, 0x0d, 0xd0, 0x60, 0x6a, 0x00, 0x28, 0x06, - 0xd0, 0x00, 0x68, 0x01, 0x90, 0x45, 0x60, 0x60, - 0x6a, 0xed, 0x09, 0x00, 0x59, 0x03, 0x02, 0x90, - 0x05, 0x60, 0x0b, 0xe0, 0x65, 0x62, 0x01, 0x95, - 0x02, 0x95, 0x07, 0xe0, 0xb0, 0x7e, 0x03, 0xab, - 0x18, 0x70, 0xe0, 0x1d, 0x1d, 0x30, 0x29, 0x1c, - 0xf2, 0xf7, 0x6a, 0xfb, 0x2b, 0x1c, 0x06, 0x21, - 0x30, 0x1c, 0x00, 0x97, 0x08, 0x4a, 0xdd, 0xf7, - 0xf9, 0xfb, 0x06, 0x9d, 0x01, 0xe0, 0x32, 0x25, - 0xed, 0x43, 0x00, 0xf0, 0x35, 0xfb, 0x28, 0x1c, - 0x07, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, - 0x00, 0x67, 0x03, 0x20, 0xe8, 0x66, 0x03, 0x20, - 0xe9, 0x52, 0x03, 0x20, 0x90, 0xb5, 0x00, 0x27, - 0x04, 0x1c, 0x16, 0x48, 0x00, 0xf0, 0x28, 0xfb, - 0x20, 0x6a, 0x00, 0x28, 0x1c, 0xd0, 0x01, 0x38, - 0x20, 0x62, 0x60, 0x6a, 0x00, 0x21, 0x02, 0x68, - 0x82, 0x42, 0x01, 0xd1, 0x61, 0x62, 0x09, 0xe0, - 0x43, 0x68, 0x53, 0x60, 0x0c, 0xc8, 0x08, 0x38, - 0x1a, 0x60, 0x62, 0x6a, 0x82, 0x42, 0x01, 0xd1, - 0x42, 0x68, 0x62, 0x62, 0x41, 0x61, 0x00, 0x69, - 0x06, 0x21, 0xdd, 0xf7, 0x27, 0xfb, 0x00, 0x28, - 0x05, 0xd0, 0x00, 0xf0, 0x11, 0xfb, 0x02, 0xe0, - 0xa0, 0x69, 0x01, 0x30, 0xa0, 0x61, 0x00, 0xf0, - 0xff, 0xfa, 0x38, 0x1c, 0x90, 0xbc, 0x08, 0xbc, - 0x18, 0x47, 0x00, 0x00, 0x00, 0x67, 0x03, 0x20, - 0x31, 0x21, 0xc9, 0x43, 0x41, 0x61, 0xc1, 0x68, - 0x0a, 0x6a, 0x01, 0x3a, 0x0a, 0x62, 0x01, 0x68, - 0x81, 0x42, 0x03, 0xd1, 0xc0, 0x68, 0x00, 0x21, - 0x41, 0x62, 0x70, 0x47, 0x42, 0x68, 0x4a, 0x60, - 0x06, 0xc8, 0x08, 0x38, 0x11, 0x60, 0xc1, 0x68, - 0x4a, 0x6a, 0x82, 0x42, 0xf5, 0xd1, 0x40, 0x68, - 0x48, 0x62, 0x70, 0x47, 0xf0, 0xb5, 0x07, 0x1c, - 0x1c, 0x48, 0x00, 0xf0, 0xdd, 0xfa, 0x00, 0x24, - 0x29, 0x26, 0x78, 0x6c, 0xf6, 0x43, 0x00, 0x28, - 0x0b, 0xd0, 0x06, 0x62, 0xed, 0x09, 0x00, 0x5a, - 0x03, 0x45, 0x68, 0x00, 0x69, 0x05, 0x21, 0xdd, - 0xf7, 0xeb, 0xfa, 0x04, 0x43, 0x78, 0x6c, 0xa8, - 0x42, 0x01, 0xd0, 0x28, 0x1c, 0xf3, 0xd1, 0x38, - 0x6c, 0x00, 0x28, 0x0b, 0xd0, 0x06, 0x62, 0x45, - 0x68, 0x00, 0x69, 0x05, 0x21, 0xdd, 0xf7, 0xdc, - 0xfa, 0x04, 0x43, 0x38, 0x6c, 0xa8, 0x42, 0x01, - 0xd0, 0x28, 0x1c, 0xf3, 0xd1, 0xf8, 0x6a, 0x39, - 0x6b, 0x00, 0x25, 0x09, 0x1a, 0xb9, 0x62, 0x3d, - 0x62, 0x78, 0x63, 0xb8, 0x63, 0xfd, 0x63, 0x3d, - 0x64, 0x7d, 0x64, 0x00, 0x2c, 0x01, 0xd0, 0x00, - 0xf0, 0xb5, 0xfa, 0x00, 0xf0, 0xa7, 0xfa, 0x28, - 0x1c, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, - 0x00, 0x00, 0x67, 0x03, 0x20, 0xff, 0xb5, 0x8c, - 0xb0, 0x04, 0x1c, 0x00, 0x20, 0x01, 0x90, 0x00, - 0x25, 0x0e, 0x1c, 0x17, 0x1c, 0x6c, 0x48, 0x00, - 0xf0, 0x99, 0xfa, 0x21, 0x7e, 0x00, 0x29, 0x01, - 0xd0, 0x00, 0x20, 0x19, 0xe0, 0xf8, 0x1c, 0x80, - 0x08, 0x80, 0x00, 0x62, 0x6c, 0xc5, 0x1b, 0x28, - 0x1d, 0x00, 0x2a, 0x0b, 0x92, 0x10, 0xd0, 0x22, - 0x6a, 0x00, 0x2a, 0x0d, 0xd0, 0x63, 0x4a, 0x12, - 0x68, 0x63, 0x7e, 0x00, 0x2b, 0x07, 0xd1, 0x0f, - 0x9b, 0x00, 0x2b, 0x04, 0xd0, 0x0b, 0x9b, 0x1b, - 0x7a, 0x92, 0x7e, 0x93, 0x42, 0x00, 0xdc, 0xa0, - 0x6a, 0xa2, 0x6a, 0x38, 0x18, 0x82, 0x42, 0x2c, - 0xd2, 0x0f, 0x9b, 0x00, 0x2b, 0x25, 0xd0, 0xe0, - 0x6b, 0x58, 0x4a, 0x01, 0x30, 0xe0, 0x63, 0x00, - 0x20, 0x03, 0x90, 0x02, 0x90, 0x05, 0x94, 0x07, - 0x96, 0x08, 0x97, 0x10, 0x68, 0x02, 0xab, 0x06, - 0x90, 0x21, 0x6c, 0x00, 0x29, 0x06, 0xd0, 0x09, - 0x68, 0x02, 0x91, 0x4b, 0x60, 0x21, 0x6c, 0x03, - 0x91, 0x0b, 0x60, 0x02, 0xe0, 0x23, 0x64, 0x02, - 0x93, 0x03, 0x93, 0x21, 0x6c, 0x09, 0x68, 0xed, - 0x09, 0x00, 0x5b, 0x03, 0x21, 0x64, 0x0f, 0x9a, - 0x05, 0x21, 0x00, 0x92, 0x4a, 0x4a, 0xdd, 0xf7, - 0x0a, 0xfb, 0x0a, 0x98, 0x01, 0x90, 0x82, 0xe0, - 0x28, 0x20, 0xc0, 0x43, 0x01, 0x90, 0x7e, 0xe0, - 0x62, 0x6c, 0x00, 0x2a, 0x2c, 0xd0, 0x22, 0x6a, - 0x00, 0x2a, 0x29, 0xd1, 0xe0, 0x6b, 0x01, 0x38, - 0xe0, 0x63, 0x60, 0x6c, 0x01, 0x68, 0x81, 0x42, - 0x02, 0xd1, 0x00, 0x21, 0x61, 0x64, 0x09, 0xe0, - 0x42, 0x68, 0x4a, 0x60, 0x06, 0xc8, 0x08, 0x38, - 0x11, 0x60, 0x61, 0x6c, 0x81, 0x42, 0x01, 0xd1, - 0x41, 0x68, 0x61, 0x64, 0x00, 0x23, 0x42, 0x69, - 0x03, 0x62, 0x31, 0x1c, 0x3b, 0x1c, 0x0c, 0x78, - 0x14, 0x70, 0x01, 0x32, 0x01, 0x3b, 0x01, 0xd0, - 0x01, 0x31, 0xf8, 0xe7, 0xc7, 0x61, 0x00, 0x69, - 0x05, 0x21, 0xdd, 0xf7, 0x38, 0xfa, 0x00, 0x28, - 0x51, 0xd0, 0x00, 0xf0, 0x22, 0xfa, 0x4e, 0xe0, - 0x32, 0x1c, 0x00, 0x29, 0x63, 0x6b, 0x0f, 0xd0, - 0xe0, 0x6a, 0x98, 0x42, 0x02, 0xd1, 0x20, 0x6b, - 0xc0, 0x1b, 0x00, 0xe0, 0xd8, 0x1b, 0x60, 0x63, - 0x39, 0x1c, 0x13, 0x78, 0x03, 0x70, 0x01, 0x30, - 0x01, 0x39, 0x36, 0xd0, 0x01, 0x32, 0xf8, 0xe7, - 0xe1, 0x6a, 0x59, 0x1a, 0x88, 0x42, 0x03, 0xd9, - 0x23, 0x6b, 0x40, 0x1a, 0x18, 0x1a, 0x00, 0xe0, - 0x18, 0x1a, 0x60, 0x63, 0x80, 0xc0, 0x21, 0x6b, - 0x81, 0x42, 0x00, 0xd8, 0xe0, 0x6a, 0xa1, 0x6a, - 0x7b, 0x19, 0x04, 0x39, 0xa1, 0x62, 0x21, 0x6b, - 0x09, 0x1a, 0x8b, 0x42, 0x07, 0xd8, 0x39, 0x1c, - 0x13, 0x78, 0x03, 0x70, 0x01, 0x30, 0x01, 0x39, - 0x14, 0xd0, 0x01, 0x32, 0xf8, 0xe7, 0x0b, 0x1c, - 0x16, 0x78, 0x01, 0x32, 0x01, 0x3b, 0x06, 0x70, - 0x01, 0xd0, 0x01, 0x30, 0xf8, 0xe7, 0xe0, 0x6a, - 0x8f, 0x42, 0x07, 0xd9, 0x79, 0x1a, 0x13, 0x78, - 0x03, 0x70, 0xed, 0x09, 0x00, 0x5c, 0x03, 0x01, - 0x30, 0x01, 0x39, 0x01, 0xd0, 0x01, 0x32, 0xf8, - 0xe7, 0xa0, 0x6a, 0x40, 0x1b, 0xa0, 0x62, 0xa0, - 0x6a, 0xc0, 0x1b, 0xa0, 0x62, 0x20, 0x6a, 0x01, - 0x30, 0x20, 0x62, 0x00, 0xf0, 0xc4, 0xf9, 0x01, - 0x98, 0x10, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, - 0x47, 0x00, 0x00, 0x00, 0x67, 0x03, 0x20, 0xe8, - 0x66, 0x03, 0x20, 0xe9, 0x62, 0x02, 0x20, 0xff, - 0xb5, 0x8b, 0xb0, 0x04, 0x1c, 0x00, 0x20, 0x01, - 0x90, 0x00, 0x25, 0x17, 0x1c, 0x71, 0x48, 0x00, - 0xf0, 0xb2, 0xf9, 0x21, 0x7e, 0x00, 0x29, 0x01, - 0xd0, 0x00, 0x20, 0x17, 0xe0, 0xf8, 0x1c, 0x80, - 0x08, 0x80, 0x00, 0xc5, 0x1b, 0x63, 0x6c, 0x28, - 0x1d, 0x00, 0x2b, 0x0f, 0xd0, 0x22, 0x6a, 0x00, - 0x2a, 0x0c, 0xd0, 0x68, 0x4a, 0x12, 0x68, 0x66, - 0x7e, 0x00, 0x2e, 0x06, 0xd1, 0x0e, 0x9e, 0x00, - 0x2e, 0x03, 0xd0, 0x1b, 0x7a, 0x92, 0x7e, 0x93, - 0x42, 0x00, 0xdc, 0xa0, 0x6a, 0x3b, 0x18, 0xa2, - 0x6a, 0x00, 0x20, 0x9a, 0x42, 0x37, 0xd2, 0x0e, - 0x9b, 0x00, 0x2b, 0x30, 0xd0, 0xe1, 0x6b, 0x5d, - 0x4a, 0x01, 0x31, 0xe1, 0x63, 0x0c, 0x99, 0x05, - 0x94, 0x03, 0x90, 0x02, 0x90, 0x08, 0x97, 0x07, - 0x91, 0x17, 0x68, 0x02, 0xad, 0x06, 0x97, 0x60, - 0x7e, 0x00, 0x28, 0x0d, 0xd0, 0x60, 0x6c, 0x00, - 0x28, 0x06, 0xd0, 0x00, 0x68, 0x02, 0x90, 0x45, - 0x60, 0x60, 0x6c, 0x03, 0x90, 0x05, 0x60, 0x0b, - 0xe0, 0x65, 0x64, 0x02, 0x95, 0x03, 0x95, 0x07, - 0xe0, 0xb8, 0x7e, 0x04, 0xab, 0x18, 0x70, 0xe0, - 0x1d, 0x3d, 0x30, 0x29, 0x1c, 0xf2, 0xf7, 0x8b, - 0xf9, 0x0e, 0x9a, 0x2b, 0x1c, 0x05, 0x21, 0x00, - 0x92, 0x4a, 0x4a, 0x38, 0x1c, 0xdd, 0xf7, 0x19, - 0xfa, 0x0a, 0x98, 0x01, 0x90, 0x81, 0xe0, 0x28, - 0x20, 0xc0, 0x43, 0x01, 0x90, 0xed, 0x09, 0x00, - 0x5d, 0x03, 0x7d, 0xe0, 0x62, 0x6c, 0x00, 0x2a, - 0x31, 0xd0, 0x22, 0x6a, 0x00, 0x2a, 0x2e, 0xd1, - 0x00, 0x25, 0xe0, 0x6b, 0x01, 0x38, 0xe0, 0x63, - 0x60, 0x6c, 0x01, 0x68, 0x81, 0x42, 0x02, 0xd1, - 0x00, 0x22, 0x62, 0x64, 0x09, 0xe0, 0x42, 0x68, - 0x4a, 0x60, 0x06, 0xc8, 0x08, 0x38, 0x11, 0x60, - 0x61, 0x6c, 0x81, 0x42, 0x01, 0xd1, 0x41, 0x68, - 0x61, 0x64, 0x0c, 0x99, 0x43, 0x69, 0x00, 0x22, - 0x02, 0x62, 0x3a, 0x1c, 0x0e, 0x78, 0x1e, 0x70, - 0x01, 0x33, 0x01, 0x3a, 0x01, 0xd0, 0x01, 0x31, - 0xf8, 0xe7, 0xc7, 0x61, 0x00, 0x69, 0x05, 0x21, - 0xdd, 0xf7, 0x46, 0xf9, 0x05, 0x43, 0x60, 0x6c, - 0x00, 0x28, 0xd6, 0xd1, 0x00, 0x2d, 0x4b, 0xd0, - 0x00, 0xf0, 0x2c, 0xf9, 0x48, 0xe0, 0x0c, 0x9a, - 0xa0, 0x6b, 0x00, 0x29, 0x07, 0xd0, 0x39, 0x1c, - 0x13, 0x78, 0x03, 0x70, 0x01, 0x30, 0x01, 0x39, - 0x26, 0xd0, 0x01, 0x32, 0xf8, 0xe7, 0x80, 0xc0, - 0x21, 0x6b, 0x81, 0x42, 0x00, 0xd8, 0xe0, 0x6a, - 0xa1, 0x6a, 0x04, 0x39, 0xa1, 0x62, 0x21, 0x6b, - 0x09, 0x1a, 0xb9, 0x42, 0x07, 0xd3, 0x39, 0x1c, - 0x13, 0x78, 0x03, 0x70, 0x01, 0x30, 0x01, 0x39, - 0x12, 0xd0, 0x01, 0x32, 0xf8, 0xe7, 0x0b, 0x1c, - 0x16, 0x78, 0x01, 0x32, 0x01, 0x3b, 0x06, 0x70, - 0x01, 0xd0, 0x01, 0x30, 0xf8, 0xe7, 0xe0, 0x6a, - 0x79, 0x1a, 0x13, 0x78, 0x03, 0x70, 0x01, 0x30, - 0x01, 0x39, 0x01, 0xd0, 0x01, 0x32, 0xf8, 0xe7, - 0x21, 0x6b, 0x81, 0x42, 0x00, 0xd8, 0xe0, 0x6a, - 0x00, 0x2d, 0x0a, 0xd0, 0x09, 0x1a, 0xa9, 0x42, - 0x03, 0xd8, 0xe0, 0x6a, 0x69, 0x1a, 0x40, 0x18, - 0x00, 0xe0, 0x40, 0x19, 0xa1, 0x6a, 0x49, 0x1b, - 0xa1, 0x62, 0xa0, 0x63, 0xa0, 0x6a, 0xc0, 0x1b, - 0xa0, 0x62, 0x20, 0x6a, 0x01, 0x30, 0x20, 0x62, - 0xed, 0x09, 0x00, 0x5e, 0x03, 0x00, 0xf0, 0xd4, - 0xf8, 0x01, 0x98, 0x0f, 0xb0, 0xf0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0x67, 0x03, - 0x20, 0xe8, 0x66, 0x03, 0x20, 0xe9, 0x62, 0x02, - 0x20, 0xb0, 0xb5, 0x00, 0x27, 0x07, 0x24, 0x01, - 0x25, 0x01, 0x21, 0x02, 0x20, 0xef, 0xf7, 0x42, - 0xfd, 0xef, 0xf7, 0x30, 0xfd, 0x00, 0x28, 0x02, - 0xd0, 0x28, 0x1c, 0xa0, 0x40, 0x00, 0xe0, 0x00, - 0x20, 0x38, 0x43, 0x07, 0x06, 0x3f, 0x0e, 0x00, - 0x21, 0x02, 0x20, 0xef, 0xf7, 0x33, 0xfd, 0x01, - 0x3c, 0xea, 0xd5, 0x01, 0x21, 0x01, 0x20, 0xef, - 0xf7, 0x2d, 0xfd, 0x38, 0x1c, 0xb0, 0xbc, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xb5, 0x00, - 0x21, 0x01, 0x20, 0xef, 0xf7, 0x23, 0xfd, 0x01, - 0x21, 0x02, 0x20, 0xef, 0xf7, 0x1f, 0xfd, 0x00, - 0x21, 0x02, 0x20, 0xef, 0xf7, 0x1b, 0xfd, 0x01, - 0x21, 0x01, 0x20, 0xef, 0xf7, 0x17, 0xfd, 0x08, - 0xbc, 0x18, 0x47, 0x00, 0x00, 0x00, 0xc0, 0x9f, - 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0x69, 0x18, 0x01, - 0x20, 0x00, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, 0x2f, - 0xe1, 0x81, 0x17, 0x01, 0x20, 0x00, 0xc0, 0x9f, - 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0x5d, 0x1b, 0x01, - 0x20, 0x00, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, 0x2f, - 0xe1, 0x95, 0x15, 0x01, 0x20, 0x00, 0xc0, 0x9f, - 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0x0d, 0x16, 0x01, - 0x20, 0x78, 0x47, 0x00, 0x00, 0x53, 0x2a, 0xff, - 0xea, 0x78, 0x47, 0x00, 0x00, 0xd5, 0xbf, 0xff, - 0xea, 0x78, 0x47, 0x00, 0x00, 0xc7, 0x70, 0xff, - 0xea, 0x78, 0x47, 0x00, 0x00, 0xbb, 0x70, 0xff, - 0xea, 0x78, 0x47, 0x00, 0x00, 0xab, 0x2b, 0xff, - 0xea, 0x78, 0x47, 0x00, 0x00, 0x87, 0x70, 0xff, - 0xea, 0x78, 0x47, 0x00, 0x00, 0xad, 0x70, 0xff, - 0xea, 0x78, 0x47, 0xed, 0x09, 0x00, 0x5f, 0x03, - 0x00, 0x00, 0xdb, 0xbf, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x87, 0xbf, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x91, 0x70, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x99, 0x70, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0xf8, 0x5f, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x70, 0x60, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0xed, 0x72, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x7c, 0x70, 0xff, 0xea, 0x00, 0xc0, - 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0xdd, 0xf5, - 0x00, 0x20, 0x78, 0x47, 0x00, 0x00, 0xf6, 0x75, - 0xff, 0xea, 0x00, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, - 0x2f, 0xe1, 0x09, 0x31, 0x01, 0x20, 0x00, 0xc0, - 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0x85, 0x32, - 0x01, 0x20, 0x00, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, - 0x2f, 0xe1, 0x25, 0x2d, 0x01, 0x20, 0x00, 0xc0, - 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0x71, 0x4f, - 0x01, 0x20, 0x00, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, - 0x2f, 0xe1, 0x99, 0x4d, 0x01, 0x20, 0x00, 0xc0, - 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0xe9, 0x4d, - 0x01, 0x20, 0x00, 0xc0, 0x9f, 0xe5, 0x1c, 0xff, - 0x2f, 0xe1, 0x41, 0x2d, 0x01, 0x20, 0x78, 0x47, - 0x00, 0x00, 0x54, 0x71, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0xe6, 0x71, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0xc1, 0x71, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x9f, 0x71, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x7e, 0x71, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0xf6, 0x71, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x1f, 0x72, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x22, 0x72, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0xd1, 0x70, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0xf7, 0x70, 0xff, 0xea, 0x78, 0x47, - 0x00, 0x00, 0x10, 0x71, 0xff, 0xea, 0xed, 0x09, - 0x00, 0x60, 0x03, 0x78, 0x47, 0x00, 0x00, 0xad, - 0x75, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0xc0, - 0x75, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0xc2, - 0x75, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0xad, - 0x75, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0xa2, - 0x75, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x25, - 0x70, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x0f, - 0x70, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0xa1, - 0x70, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0xe8, - 0x6f, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x5f, - 0x6f, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x63, - 0x6f, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x6e, - 0x6f, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x3a, - 0x70, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x62, - 0xbf, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x7a, - 0xbf, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x50, - 0xbf, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x37, - 0xbf, 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x11, - 0xbf, 0xff, 0xea, 0x00, 0xc0, 0x9f, 0xe5, 0x1c, - 0xff, 0x2f, 0xe1, 0x65, 0x51, 0x01, 0x20, 0x00, - 0xc0, 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0x69, - 0x51, 0x01, 0x20, 0x00, 0xc0, 0x9f, 0xe5, 0x1c, - 0xff, 0x2f, 0xe1, 0xcd, 0x51, 0x01, 0x20, 0x00, - 0xc0, 0x9f, 0xe5, 0x1c, 0xff, 0x2f, 0xe1, 0xdf, - 0x4e, 0x02, 0x20, 0x0c, 0xd0, 0x4d, 0xe2, 0xff, - 0x1f, 0x2d, 0xe9, 0x00, 0x10, 0x4f, 0xe1, 0x02, - 0x00, 0x2d, 0xe9, 0x20, 0x10, 0xc1, 0xe3, 0x01, - 0xf0, 0x21, 0xe1, 0x0d, 0x20, 0xa0, 0xe1, 0x0e, - 0x30, 0xa0, 0xe1, 0x1f, 0x10, 0xc1, 0xe3, 0x1b, - 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x21, 0xe1, 0x40, - 0xe0, 0x8d, 0xe5, 0x3c, 0x30, 0x8d, 0xe5, 0x38, - 0x20, 0x8d, 0xe5, 0x00, 0x00, 0x9d, 0xe5, 0x20, - 0x00, 0xed, 0x09, 0x00, 0x61, 0x03, 0x10, 0xe3, - 0x02, 0x00, 0x00, 0x0a, 0xb2, 0x10, 0x5e, 0xe1, - 0x3e, 0x1b, 0xc1, 0xe3, 0x02, 0x00, 0x00, 0xea, - 0x04, 0x10, 0x1e, 0xe5, 0xff, 0x14, 0xc1, 0xe3, - 0x21, 0x14, 0xa0, 0xe1, 0x0d, 0x20, 0xa0, 0xe1, - 0xda, 0xff, 0xff, 0xeb, 0x01, 0x00, 0x50, 0xe3, - 0x02, 0x00, 0xbd, 0xe8, 0x01, 0xf0, 0x6f, 0xe1, - 0x03, 0x00, 0x00, 0x0a, 0xff, 0x1f, 0xbd, 0xe8, - 0x08, 0xd0, 0x8d, 0xe2, 0x00, 0x40, 0xbd, 0xe8, - 0x0e, 0xf0, 0xb0, 0xe1, 0x20, 0x00, 0x11, 0xe3, - 0xff, 0x1f, 0xbd, 0xe8, 0x08, 0xd0, 0x8d, 0xe2, - 0x00, 0x40, 0xbd, 0xe8, 0x02, 0xe0, 0x4e, 0x02, - 0x04, 0xe0, 0x4e, 0x12, 0x0e, 0xf0, 0xb0, 0xe1, - 0x00, 0x40, 0x2d, 0xe9, 0xff, 0x7f, 0x0d, 0xe9, - 0x3c, 0xd0, 0x4d, 0xe2, 0x00, 0x10, 0x4f, 0xe1, - 0x02, 0x00, 0x2d, 0xe9, 0xb2, 0x10, 0x5e, 0xe1, - 0x0f, 0x10, 0x01, 0xe2, 0x0d, 0x20, 0xa0, 0xe1, - 0xc2, 0xff, 0xff, 0xeb, 0x00, 0x00, 0x10, 0xe3, - 0x02, 0x00, 0xbd, 0xe8, 0x01, 0xf0, 0x6f, 0xe1, - 0xff, 0x1f, 0xbd, 0xe8, 0x08, 0xd0, 0x8d, 0xe2, - 0x00, 0x40, 0xbd, 0xe8, 0x04, 0xe0, 0x4e, 0x12, - 0x0e, 0xf0, 0xb0, 0xe1, 0x0c, 0xd0, 0x4d, 0xe2, - 0xff, 0x1f, 0x2d, 0xe9, 0x00, 0x10, 0x4f, 0xe1, - 0x02, 0x00, 0x2d, 0xe9, 0x20, 0x10, 0xc1, 0xe3, - 0x01, 0xf0, 0x21, 0xe1, 0x0d, 0x20, 0xa0, 0xe1, - 0x0e, 0x30, 0xa0, 0xe1, 0x1f, 0x10, 0xc1, 0xe3, - 0x17, 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x21, 0xe1, - 0x40, 0xe0, 0x8d, 0xe5, 0x3c, 0x30, 0x8d, 0xe5, - 0x38, 0x20, 0x8d, 0xe5, 0x00, 0x00, 0x9d, 0xe5, - 0x20, 0x00, 0x10, 0xe3, 0x02, 0x00, 0x00, 0x0a, - 0xb8, 0x00, 0x5e, 0xe1, 0x04, 0x10, 0x4e, 0xe2, - 0x01, 0x00, 0x00, 0xea, 0x04, 0x00, 0x1e, 0xe5, - 0x04, 0x10, 0x4e, 0xe2, 0xed, 0x09, 0x00, 0x62, - 0x03, 0x10, 0x2f, 0x18, 0xee, 0x0d, 0x30, 0xa0, - 0xe1, 0xa4, 0xff, 0xff, 0xeb, 0x02, 0x00, 0xbd, - 0xe8, 0x01, 0xf0, 0x6f, 0xe1, 0xff, 0x1f, 0xbd, - 0xe8, 0x08, 0xd0, 0x8d, 0xe2, 0x00, 0x40, 0xbd, - 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x0c, 0xd0, 0x4d, - 0xe2, 0xff, 0x1f, 0x2d, 0xe9, 0x00, 0x10, 0x4f, - 0xe1, 0x02, 0x00, 0x2d, 0xe9, 0x20, 0x10, 0xc1, - 0xe3, 0x01, 0xf0, 0x21, 0xe1, 0x0d, 0x20, 0xa0, - 0xe1, 0x0e, 0x30, 0xa0, 0xe1, 0x1f, 0x10, 0xc1, - 0xe3, 0x17, 0x10, 0x81, 0xe3, 0x01, 0xf0, 0x21, - 0xe1, 0x40, 0xe0, 0x8d, 0xe5, 0x3c, 0x30, 0x8d, - 0xe5, 0x38, 0x20, 0x8d, 0xe5, 0x00, 0x00, 0x9d, - 0xe5, 0x20, 0x00, 0x10, 0xe3, 0x02, 0x00, 0x00, - 0x0a, 0xb8, 0x00, 0x5e, 0xe1, 0x04, 0x10, 0x4e, - 0xe2, 0x01, 0x00, 0x00, 0xea, 0x08, 0x00, 0x1e, - 0xe5, 0x04, 0x10, 0x4e, 0xe2, 0x10, 0x2f, 0x18, - 0xee, 0x0d, 0x30, 0xa0, 0xe1, 0x88, 0xff, 0xff, - 0xeb, 0x00, 0x00, 0x10, 0xe3, 0x02, 0x00, 0xbd, - 0xe8, 0x01, 0xf0, 0x6f, 0xe1, 0xff, 0x1f, 0xbd, - 0xe8, 0x08, 0xd0, 0x8d, 0xe2, 0x00, 0x40, 0xbd, - 0xe8, 0x04, 0xf0, 0x5e, 0x12, 0x08, 0xf0, 0x5e, - 0x02, 0x64, 0x00, 0xa0, 0xe3, 0x81, 0xff, 0xff, - 0xeb, 0xfc, 0xff, 0xff, 0xea, 0x01, 0x00, 0x00, - 0x00, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, - 0x39, 0x39, 0x33, 0x2d, 0x32, 0x30, 0x30, 0x31, - 0x20, 0x41, 0x54, 0x49, 0x20, 0x2d, 0x20, 0x4e, - 0x75, 0x63, 0x6c, 0x65, 0x75, 0x73, 0x20, 0x50, - 0x4c, 0x55, 0x53, 0x20, 0x2d, 0x20, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x52, - 0x4d, 0x20, 0x36, 0x2f, 0x37, 0x2f, 0x39, 0x20, - 0x31, 0x2e, 0x31, 0x33, 0x2e, 0x32, 0x31, 0xed, - 0x09, 0x00, 0x63, 0x03, 0x00, 0x00, 0x47, 0x2c, - 0x4d, 0x2c, 0x44, 0x2c, 0x47, 0x42, 0x2c, 0x47, - 0x4c, 0x2c, 0x41, 0x47, 0x2c, 0x4b, 0x4c, 0x2c, - 0x43, 0x52, 0x2c, 0x48, 0x52, 0x2c, 0x4e, 0x48, - 0x2c, 0x44, 0x4c, 0x2c, 0x42, 0x48, 0x2c, 0x4c, - 0x50, 0x2c, 0x41, 0x50, 0x2c, 0x48, 0x41, 0x2c, - 0x4d, 0x45, 0x2c, 0x4b, 0x43, 0x2c, 0x4b, 0x48, - 0x2c, 0x47, 0x46, 0x2c, 0x52, 0x47, 0x2c, 0x48, - 0x53, 0x2c, 0x44, 0x53, 0x2c, 0x4b, 0x59, 0x2c, - 0x42, 0x43, 0x2c, 0x4c, 0x43, 0x2c, 0x54, 0x44, - 0x00, 0x00, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x54, 0x65, - 0x63, 0x68, 0x6e, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x20, 0x55, 0x73, 0x65, 0x20, 0x4f, 0x6e, - 0x6c, 0x79, 0x20, 0x2d, 0x20, 0x53, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x20, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x3a, 0x20, 0x23, 0x32, 0x35, 0x35, - 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x30, 0x31, - 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, - 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x64, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x0a, 0x24, 0x54, 0x79, - 0x70, 0x65, 0x3a, 0x20, 0x42, 0x54, 0x5f, 0x43, - 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x20, 0x24, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x20, - 0x30, 0x33, 0x2e, 0x31, 0x37, 0x2e, 0x34, 0x36, - 0x20, 0x24, 0x44, 0x61, 0x74, 0x65, 0x3a, 0x20, - 0x41, 0x70, 0x72, 0x20, 0x32, 0x33, 0x20, 0x32, - 0x30, 0x30, 0x33, 0x20, 0x24, 0x54, 0x69, 0x6d, - 0x65, 0x3a, 0x20, 0x31, 0x36, 0x3a, 0x30, 0x35, - 0x3a, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x30, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x41, 0x42, 0x43, 0x44, 0xed, 0x09, 0x00, - 0x65, 0x03, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xdf, - 0xe5, 0x0a, 0x02, 0x20, 0x05, 0x00, 0x00, 0x00, - 0x00, 0xfc, 0x00, 0x40, 0x23, 0x0c, 0x02, 0x20, - 0x06, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x44, - 0x3d, 0x12, 0x02, 0x20, 0x02, 0x00, 0x00, 0x00, - 0x00, 0xfc, 0x00, 0x18, 0x01, 0x0b, 0x02, 0x20, - 0x03, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x1c, - 0x65, 0x0b, 0x02, 0x20, 0x12, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0x00, 0xe0, 0xbd, 0x0d, 0x02, 0x20, - 0x13, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xe8, - 0xed, 0x0d, 0x02, 0x20, 0x14, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0x00, 0xf0, 0x09, 0x0e, 0x02, 0x20, - 0x15, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0xf8, - 0x09, 0x0e, 0x02, 0x20, 0x07, 0x00, 0x00, 0x00, - 0x00, 0xf8, 0x00, 0x48, 0x6d, 0x0e, 0x02, 0x20, - 0x08, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x50, - 0xb5, 0x0e, 0x02, 0x20, 0x09, 0x00, 0x00, 0x00, - 0x00, 0xf2, 0x00, 0x52, 0xb5, 0x0e, 0x02, 0x20, - 0x0d, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0xb0, - 0xc9, 0x0f, 0x02, 0x20, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0xf4, 0x00, 0xb4, 0xed, 0x0f, 0x02, 0x20, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, - 0x29, 0x11, 0x02, 0x20, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0x00, 0x90, 0xe1, 0x10, 0x02, 0x20, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xa0, - 0x6d, 0x0f, 0x02, 0x20, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0x00, 0xc0, 0x45, 0x10, 0x02, 0x20, - 0x10, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xd0, - 0xa5, 0x10, 0x02, 0x20, 0x01, 0x00, 0x00, 0x00, - 0x00, 0xe0, 0x00, 0x00, 0xc1, 0x11, 0x02, 0x20, - 0x04, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x20, - 0xed, 0x09, 0x00, 0x66, 0x03, 0xb5, 0x0b, 0x02, - 0x20, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, - 0x60, 0x6d, 0x11, 0x02, 0x20, 0x17, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0x00, 0xf0, 0x0f, 0x10, 0x00, 0x20, - 0x01, 0xc5, 0x28, 0x02, 0x20, 0x04, 0x00, 0x00, - 0x00, 0xe8, 0x12, 0x02, 0x20, 0xf0, 0x00, 0xc0, - 0x0f, 0x90, 0x00, 0x00, 0x00, 0x21, 0x23, 0x02, - 0x20, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0x00, 0x80, 0x0f, 0x90, 0x00, 0x00, - 0x00, 0xe9, 0x23, 0x02, 0x20, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xb0, - 0x0f, 0x90, 0x00, 0x00, 0x01, 0x4d, 0x28, 0x02, - 0x20, 0x06, 0x00, 0x00, 0x00, 0xec, 0x12, 0x02, - 0x20, 0x00, 0x00, 0xb0, 0x0f, 0x00, 0x00, 0x00, - 0x01, 0xed, 0x1c, 0x02, 0x20, 0x08, 0x00, 0x00, - 0x00, 0xf0, 0x12, 0x02, 0x20, 0x10, 0x00, 0xb0, - 0x0f, 0x00, 0x00, 0x20, 0x01, 0x19, 0x1c, 0x02, - 0x20, 0x15, 0x00, 0x00, 0x00, 0xf4, 0x12, 0x02, - 0x20, 0x10, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00, - 0x06, 0x21, 0x2c, 0x02, 0x20, 0x0c, 0x00, 0x00, - 0x00, 0xfc, 0x12, 0x02, 0x20, 0x90, 0x00, 0x40, - 0x0e, 0x90, 0x00, 0x40, 0x00, 0xed, 0x24, 0x02, - 0x20, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x13, 0x02, - 0x20, 0x90, 0x00, 0x40, 0x0e, 0x90, 0x00, 0x00, - 0x00, 0xed, 0x24, 0x02, 0x20, 0x07, 0x00, 0x00, - 0x00, 0x04, 0x13, 0x02, 0x20, 0x00, 0x00, 0xb0, - 0x0f, 0x00, 0x00, 0x20, 0x03, 0x7d, 0x1c, 0x02, - 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x02, 0xfd, 0x1a, 0x02, 0x20, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x67, 0x03, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x18, 0x02, 0x20, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, - 0x00, 0x0e, 0x10, 0x00, 0x00, 0x00, 0xb5, 0x19, - 0x02, 0x20, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x04, 0x3d, 0x1d, 0x02, 0x20, 0x0b, 0x00, - 0x00, 0x00, 0x08, 0x13, 0x02, 0x20, 0x10, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x06, 0x65, 0x1f, - 0x02, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x08, 0xf1, 0x2a, 0x02, 0x20, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x59, 0x2c, - 0x02, 0x20, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0x10, 0x00, - 0x00, 0x0e, 0xd1, 0x2c, 0x02, 0x20, 0x12, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0c, 0x71, 0x17, - 0x02, 0x20, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x13, - 0x02, 0x20, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x0a, 0xb5, 0x17, 0x02, 0x20, 0x14, 0x00, - 0x00, 0x00, 0x10, 0x13, 0x02, 0x20, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xf5, 0x2b, - 0x02, 0x20, 0x16, 0x00, 0x00, 0x00, 0x14, 0x13, - 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x71, 0x17, 0x02, 0x20, 0x09, 0x04, - 0x00, 0x00, 0x41, 0x00, 0x56, 0x00, 0x4d, 0x00, - 0x20, 0x00, 0x42, 0x00, 0x65, 0x00, 0x72, 0x00, - 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x42, 0x6c, 0x75, 0x65, 0x74, 0x6f, - 0x6f, 0x74, 0x68, 0x20, 0x44, 0x65, 0xed, 0x09, - 0x00, 0x68, 0x03, 0x76, 0x69, 0x63, 0x65, 0x00, - 0x00, 0x00, 0x00, 0x43, 0x00, 0x41, 0x00, 0x50, - 0x00, 0x49, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, - 0x00, 0x6e, 0x00, 0x66, 0x00, 0x69, 0x00, 0x67, - 0x00, 0x75, 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, - 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x43, 0x00, 0x41, 0x00, 0x50, - 0x00, 0x49, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, - 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x66, - 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, - 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, - 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x30, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x48, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x84, 0x84, 0x84, 0x84, - 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x81, 0x81, 0x81, - 0x81, 0x81, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x82, 0x82, 0x82, - 0x82, 0x82, 0x82, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10, - 0x10, 0xed, 0x09, 0x00, 0x69, 0x03, 0x10, 0x10, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, - 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, - 0x09, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0d, 0x00, - 0x0f, 0x00, 0x10, 0x00, 0x12, 0x00, 0x14, 0x00, - 0x17, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x20, 0x00, - 0x24, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x33, 0x00, - 0x39, 0x00, 0x40, 0x00, 0x47, 0x00, 0x50, 0x00, - 0x5a, 0x00, 0x64, 0x00, 0x71, 0x00, 0x7e, 0x00, - 0x8e, 0x00, 0x9f, 0x00, 0xb2, 0x00, 0xc8, 0x00, - 0xe0, 0x00, 0xfc, 0x00, 0x1a, 0x01, 0x3d, 0x01, - 0x63, 0x01, 0x8f, 0x01, 0xbf, 0x01, 0xf6, 0x01, - 0x33, 0x02, 0x77, 0x02, 0xc4, 0x02, 0x1b, 0x03, - 0x7c, 0x03, 0xe8, 0x03, 0xed, 0x09, 0x00, 0x6a, - 0x03, 0x63, 0x04, 0xeb, 0x04, 0x85, 0x05, 0x31, - 0x06, 0xf3, 0x06, 0xcc, 0x07, 0xbf, 0x08, 0xd0, - 0x09, 0x03, 0x0b, 0x5b, 0x0c, 0xdd, 0x0d, 0x8e, - 0x0f, 0x73, 0x11, 0x94, 0x13, 0xf8, 0x15, 0xa6, - 0x18, 0xa8, 0x1b, 0x08, 0x1f, 0xd1, 0x22, 0x10, - 0x27, 0xd5, 0x2b, 0x2e, 0x31, 0x2e, 0x37, 0xe9, - 0x3d, 0x77, 0x45, 0xf1, 0x4d, 0x74, 0x57, 0x1f, - 0x62, 0x18, 0x6e, 0x87, 0x7b, 0x9a, 0x8a, 0x83, - 0x9b, 0x7d, 0xae, 0xc7, 0xc3, 0xab, 0xdb, 0x78, - 0xf6, 0xff, 0xff, 0x00, 0x00, 0xff, 0x83, 0xdf, - 0x17, 0x32, 0x09, 0x4e, 0xd1, 0xe7, 0xcd, 0x8a, - 0x91, 0xc6, 0xd5, 0xc4, 0xc4, 0x40, 0x21, 0x18, - 0x4e, 0x55, 0x86, 0xf4, 0xdc, 0x8a, 0x15, 0xa7, - 0xec, 0x92, 0xdf, 0x93, 0x53, 0x30, 0x18, 0xca, - 0x34, 0xbf, 0xa2, 0xc7, 0x59, 0x67, 0x8f, 0xba, - 0x0d, 0x6d, 0xd8, 0x2d, 0x7d, 0x54, 0x0a, 0x57, - 0x97, 0x70, 0x39, 0xd2, 0x7a, 0xea, 0x24, 0x33, - 0x85, 0xed, 0x9a, 0x1d, 0xe1, 0xff, 0x07, 0xbe, - 0x2e, 0x64, 0x12, 0x9d, 0xa3, 0xcf, 0x9b, 0x15, - 0x23, 0x8d, 0xab, 0x89, 0x88, 0x80, 0x42, 0x30, - 0x9c, 0xab, 0x0d, 0xe9, 0xb9, 0x14, 0x2b, 0x4f, - 0xd9, 0x25, 0xbf, 0x26, 0xa6, 0x60, 0x31, 0x94, - 0x69, 0x7f, 0x45, 0x8e, 0xb2, 0xcf, 0x1f, 0x74, - 0x1a, 0xdb, 0xb0, 0x5a, 0xfa, 0xa8, 0x14, 0xaf, - 0x2e, 0xe0, 0x73, 0xa4, 0xf5, 0xd4, 0x48, 0x67, - 0x0b, 0xdb, 0x34, 0x3b, 0xc3, 0xfe, 0x0f, 0x7c, - 0x5c, 0xc8, 0x25, 0x3b, 0x47, 0x9f, 0x36, 0x2a, - 0x47, 0x1b, 0x57, 0x13, 0x11, 0x00, 0x84, 0x61, - 0x39, 0x56, 0x1b, 0xd3, 0x72, 0x28, 0x56, 0x9f, - 0xb2, 0x4b, 0x7e, 0x4d, 0x4c, 0xc0, 0x63, 0x28, - 0xd2, 0xfe, 0x8b, 0x1d, 0x65, 0x9e, 0x3e, 0xe8, - 0x35, 0xb7, 0x60, 0xb5, 0xf5, 0x50, 0x29, 0xed, - 0x09, 0x00, 0x6b, 0x03, 0x5e, 0x5d, 0xc0, 0xe7, - 0x49, 0xeb, 0xa8, 0x90, 0xce, 0x17, 0xb6, 0x68, - 0x77, 0x87, 0xfc, 0x1e, 0xf8, 0xb9, 0x90, 0x4a, - 0x76, 0x8f, 0x3e, 0x6c, 0x54, 0x8e, 0x36, 0xae, - 0x26, 0x22, 0x01, 0x08, 0xc2, 0x72, 0xac, 0x37, - 0xa6, 0xe4, 0x50, 0xad, 0x3f, 0x64, 0x96, 0xfc, - 0x9a, 0x99, 0x80, 0xc6, 0x51, 0xa5, 0xfd, 0x16, - 0x3a, 0xcb, 0x3c, 0x7d, 0xd0, 0x6b, 0x6e, 0xc1, - 0x6b, 0xea, 0xa0, 0x52, 0xbc, 0xbb, 0x81, 0xce, - 0x93, 0xd7, 0x51, 0x21, 0x9c, 0x2f, 0x6c, 0xd0, - 0xef, 0x0f, 0xf8, 0x3d, 0xf1, 0x73, 0x20, 0x94, - 0xed, 0x1e, 0x7c, 0xd8, 0xa9, 0x1c, 0x6d, 0x5c, - 0x4c, 0x44, 0x02, 0x11, 0x84, 0xe5, 0x58, 0x6f, - 0x4d, 0xc8, 0xa1, 0x5a, 0x7e, 0xc9, 0x2d, 0xf9, - 0x35, 0x33, 0x01, 0x8c, 0xa3, 0x4b, 0xfa, 0x2c, - 0x75, 0x96, 0x78, 0xfb, 0xa0, 0xd6, 0xdd, 0x82, - 0xd7, 0xd5, 0x40, 0xa5, 0x79, 0x77, 0x03, 0x9d, - 0x27, 0xae, 0xa2, 0x43, 0x38, 0x5e, 0xd9, 0xa1, - 0xde, 0x1f, 0xf0, 0x7b, 0xe2, 0xe6, 0x41, 0x29, - 0xda, 0x3c, 0xf9, 0xb1, 0x52, 0x38, 0xda, 0xb8, - 0x98, 0x88, 0x04, 0x23, 0x09, 0xca, 0xb0, 0xde, - 0x9b, 0x91, 0x42, 0xb4, 0xfd, 0x92, 0x5b, 0xf2, - 0x6a, 0x66, 0x03, 0x19, 0x46, 0x97, 0xf4, 0x58, - 0xeb, 0x2c, 0xf1, 0xf7, 0x41, 0xad, 0xbb, 0x05, - 0xaf, 0xaa, 0x81, 0x4a, 0xf2, 0xee, 0x07, 0x3a, - 0x4f, 0x5d, 0x44, 0x86, 0x70, 0xbd, 0xb3, 0x43, - 0xbc, 0x3f, 0xe0, 0xf7, 0xc5, 0xcc, 0x82, 0x53, - 0xb4, 0x79, 0xf3, 0x62, 0xa4, 0x71, 0xb5, 0x71, - 0x31, 0x10, 0x08, 0x46, 0x13, 0x95, 0x61, 0xbd, - 0x37, 0x22, 0x85, 0x69, 0xfb, 0x24, 0xb7, 0xe4, - 0xd4, 0xcc, 0x06, 0x32, 0x8d, 0x2f, 0xe8, 0xb1, - 0xd6, 0x59, 0xe3, 0xee, 0x83, 0x5b, 0x76, 0x0b, - 0x5f, 0x55, 0xed, 0x09, 0x00, 0x6c, 0x03, 0x02, - 0x95, 0xe5, 0xdc, 0x0e, 0x74, 0x9e, 0xba, 0x89, - 0x0c, 0xe1, 0x7b, 0x66, 0x87, 0x78, 0x7f, 0xc1, - 0xef, 0x8b, 0x99, 0x04, 0xa7, 0x68, 0xf3, 0xe6, - 0xc5, 0x48, 0xe3, 0x6a, 0xe2, 0x62, 0x20, 0x10, - 0x8c, 0x27, 0x2a, 0xc3, 0x7a, 0x6e, 0x45, 0x0a, - 0xd3, 0xf6, 0x49, 0x6f, 0xc9, 0xa9, 0x98, 0x0c, - 0x65, 0x1a, 0x5f, 0xd1, 0x63, 0xac, 0xb3, 0xc7, - 0xdd, 0x06, 0xb6, 0xec, 0x16, 0xbe, 0xaa, 0x05, - 0x2b, 0xcb, 0xb8, 0x1c, 0xe9, 0x3d, 0x75, 0x12, - 0x19, 0xc2, 0xf6, 0xcd, 0x0e, 0xf0, 0xff, 0x01, - 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, - 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, - 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, - 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, - 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, - 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, - 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, - 0x00, 0x01, 0x00, 0x03, 0x00, 0xed, 0x09, 0x00, - 0x6d, 0x03, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x06, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x06, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x6e, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x7c, 0x00, - 0x00, 0x28, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x68, 0x7c, 0x00, 0x00, 0x30, 0x7c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xe8, 0x03, 0x00, 0x00, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x6f, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x70, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, - 0x38, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x12, 0x01, 0x10, 0x01, 0xff, - 0xff, 0xff, 0x40, 0x7c, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x09, - 0x02, 0x00, 0x00, 0x01, 0x01, 0x04, 0x00, 0x00, - 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, - 0x05, 0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, - 0x07, 0x05, 0x82, 0x02, 0x40, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x71, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x72, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x02, 0x01, - 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x03, - 0xe0, 0x01, 0x01, 0x00, 0x07, 0x05, 0x81, 0x03, - 0x10, 0x00, 0x00, 0x07, 0x05, 0x82, 0x02, 0x40, - 0x00, 0x00, 0x07, 0x05, 0x03, 0x02, 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, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x09, 0x00, 0x73, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x01, 0x00, - 0x02, 0xe0, 0x01, 0x01, 0x00, 0x07, 0x05, 0x84, - 0x01, 0x00, 0x00, 0x01, 0x07, 0x05, 0x04, 0x01, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x09, 0x04, 0x01, 0x01, 0x02, 0xe0, - 0x01, 0x01, 0x00, 0x07, 0x05, 0x84, 0x01, 0x09, - 0x00, 0x01, 0x07, 0x05, 0x04, 0x01, 0x09, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x04, 0x01, 0x02, 0x02, 0xe0, 0x01, 0x01, - 0x00, 0x07, 0x05, 0x84, 0x01, 0x11, 0x00, 0x01, - 0x07, 0x05, 0x04, 0x01, 0x11, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, - 0x01, 0x03, 0x02, 0xe0, 0x01, 0x01, 0x00, 0x07, - 0x05, 0x84, 0x01, 0x19, 0x00, 0x01, 0x07, 0x05, - 0x04, 0x01, 0x19, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x04, 0x01, 0x04, - 0x02, 0xe0, 0x01, 0x01, 0x00, 0x07, 0x05, 0x84, - 0x01, 0x21, 0x00, 0x01, 0x07, 0x05, 0x04, 0x01, - 0x21, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x09, 0x04, 0x01, 0x05, 0x02, 0xe0, - 0x01, 0x01, 0x00, 0x07, 0x05, 0x84, 0x01, 0x31, - 0x00, 0x01, 0x07, 0x05, 0x04, 0x01, 0x31, 0x00, - 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x74, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x44, 0x48, 0x31, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x11, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x12, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x15, - 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x19, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x22, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x23, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x24, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x25, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x26, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x27, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x28, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x30, - 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x31, - 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, - 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, - 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x36, - 0x00, 0x00, 0x00, 0x27, 0x00, 0xed, 0x09, 0x00, - 0x75, 0x03, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, - 0x3f, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, - 0x7f, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, - 0x82, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x3f, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0xcf, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, - 0xff, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x4c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0xf8, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0xcf, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, - 0x3f, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x76, 0x03, 0x0b, 0x00, 0x00, - 0x00, 0x24, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x26, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x27, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x31, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x33, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, - 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x35, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, - 0x00, 0x36, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, - 0x00, 0x37, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, - 0x00, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x39, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x3a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x3b, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x00, 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, - 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x00, 0xed, 0x09, 0x00, 0x77, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, - 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x0a, 0x00, - 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x0d, 0x00, - 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x0d, 0x00, - 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x1a, 0x00, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xff, 0x00, - 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0xff, 0x00, - 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, - 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0xff, 0x00, - 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, - 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x78, 0x03, 0x05, 0x00, 0x00, 0x00, 0x43, - 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xf8, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0xf8, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x7c, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x38, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x76, - 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x76, - 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, - 0x00, 0xed, 0x09, 0x00, 0x79, 0x03, 0x00, 0x00, - 0x1f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, - 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, - 0x26, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x27, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, - 0x29, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x29, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, - 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x31, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, - 0x31, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x34, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x7a, - 0x03, 0x03, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, - 0x00, 0x4c, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, - 0x00, 0x61, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, - 0x00, 0x3b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, - 0x00, 0x1f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, - 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, - 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x09, 0x00, 0x7b, 0x03, 0x00, 0x00, 0x19, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0xb4, 0x00, 0x20, 0x24, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0xa5, 0xb4, 0x00, 0x20, 0x03, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf5, 0xb4, - 0x00, 0x20, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x29, 0xb5, - 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x5d, 0xb5, 0x00, 0x20, 0x24, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x7c, 0x03, 0x24, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x3d, 0xb6, 0x00, 0x20, 0x03, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x41, 0xb6, 0x00, 0x20, 0x07, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x45, 0xb6, 0x00, 0x20, 0x0f, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x59, - 0xb6, 0x00, 0x20, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0xb1, 0xb6, 0x00, 0x20, 0x07, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x91, - 0xb5, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x1a, - 0x00, 0x00, 0x00, 0x91, 0xb5, 0x00, 0x20, 0x11, - 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x91, - 0xb5, 0x00, 0x20, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1d, 0x00, 0xed, 0x09, 0x00, - 0x7d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0x00, 0x20, - 0x0f, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0xe9, 0xb6, 0x00, 0x20, 0x24, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x47, 0xb4, 0x00, 0x20, 0x22, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x53, 0xb4, 0x00, 0x20, - 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x71, 0xb7, 0x00, 0x20, - 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x8f, 0xb7, 0x00, 0x20, - 0x16, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x8b, 0xb7, 0x00, 0x20, - 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x7e, 0x03, 0x0e, 0x00, 0x00, - 0x00, 0xf7, 0xb7, 0x00, 0x20, 0x16, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, - 0x00, 0xa5, 0xb7, 0x00, 0x20, 0x10, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0xa5, 0xb7, 0x00, - 0x20, 0x11, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, - 0x00, 0xa5, 0xb7, 0x00, 0x20, 0x24, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x13, 0x00, 0xed, 0x09, 0x00, 0x7f, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xb5, 0xb6, - 0x00, 0x20, 0x0f, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0xe9, 0xb6, 0x00, 0x20, 0x0a, 0x00, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x16, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, - 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x15, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x15, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x0d, 0xb8, - 0x00, 0x20, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x21, - 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x47, - 0xb4, 0x00, 0x20, 0x22, 0x00, 0x00, 0x00, 0x1a, - 0x00, 0x00, 0x00, 0x53, 0xb4, 0x00, 0x20, 0x10, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x0d, - 0xb8, 0x00, 0x20, 0x0a, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x71, - 0xb7, 0x00, 0x20, 0x0a, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0d, - 0xb8, 0x00, 0x20, 0x16, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x8f, 0xb7, 0x00, 0x20, 0x16, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x81, 0x03, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0x8b, 0xb7, 0x00, 0x20, 0x0a, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x0d, 0xb8, 0x00, 0x20, 0x24, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, - 0xf7, 0xb7, 0x00, 0x20, 0x16, 0x00, 0x00, 0x00, - 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0xa5, 0xb7, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0xa5, 0xb7, 0x00, 0x20, - 0x11, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0xa5, 0xb7, 0x00, 0x20, 0x14, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0xa5, 0xb7, 0x00, 0x20, - 0x0a, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0x0d, 0xb8, 0x00, 0x20, - 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x82, - 0x03, 0x0e, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0x0d, 0xb8, 0x00, - 0x20, 0x04, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xcc, 0x00, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x64, 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, - 0x09, 0x00, 0x83, 0x03, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc4, 0xff, - 0xff, 0xff, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0xe2, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, - 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x84, 0x03, 0x79, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd4, - 0xfe, 0xff, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x38, 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, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa8, - 0xfd, 0xff, 0xff, 0x53, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x70, 0xfe, 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, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x85, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x17, 0x2e, 0x45, 0x5d, 0x00, 0x00, 0x00, - 0x54, 0x6f, 0x53, 0x43, 0x4f, 0x5f, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x94, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x51, 0xc7, 0x02, 0x20, 0x02, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x0d, 0xc3, 0x02, 0x20, - 0xa5, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x90, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x55, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0xd9, 0xc5, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x75, 0xc7, 0x02, 0x20, - 0xed, 0x09, 0x00, 0x86, 0x03, 0xa1, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x85, 0xc1, 0x02, - 0x20, 0xa5, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0xc5, 0xc3, 0x02, 0x20, 0x7c, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x55, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0xe5, 0xc5, 0x02, 0x20, 0x9a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xc7, 0x02, - 0x20, 0xa1, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0xed, 0xc1, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x37, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0xc4, 0x02, - 0x20, 0x1d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x9d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x53, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x8d, 0xdb, 0x02, 0x20, 0x4f, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x9b, 0x00, 0xed, 0x09, 0x00, 0x87, 0x03, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x35, 0xc6, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc9, 0xc7, 0x02, 0x20, 0xa1, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x25, 0xc2, - 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xd1, 0xbb, - 0x02, 0x20, 0x28, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x13, 0xbc, 0x02, 0x20, 0x18, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0xbc, - 0x02, 0x20, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, - 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x21, 0xbc, - 0x02, 0x20, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, - 0x00, 0x00, 0x51, 0xc4, 0x02, 0x20, 0x9d, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x59, 0xdc, - 0x02, 0x20, 0x9b, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x00, 0xb5, 0xdc, 0x02, 0x20, 0x9c, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xb5, 0xdc, - 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0xf1, 0xc5, 0x02, 0x20, 0x9a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xc7, - 0x02, 0x20, 0xa0, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x88, 0x03, 0x05, 0x00, 0x00, 0x00, 0xf1, - 0xdb, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xc5, - 0xc4, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, 0x11, - 0x00, 0x00, 0x00, 0x01, 0xc6, 0x02, 0x20, 0x9a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, - 0xc8, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, - 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, - 0x00, 0x00, 0x00, 0x11, 0xc5, 0x02, 0x20, 0x9d, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x35, 0xf1, 0x02, 0x20, 0x63, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xb5, - 0xac, 0x02, 0x20, 0x56, 0x00, 0x00, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x43, 0xbc, 0x02, 0x20, 0x7a, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x11, - 0x00, 0x00, 0x00, 0x47, 0xc6, 0x02, 0x20, 0x9a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, - 0xc8, 0x02, 0x20, 0xa1, 0x00, 0x00, 0x00, 0x12, - 0x00, 0x00, 0x00, 0x51, 0xc2, 0x02, 0x20, 0xa5, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, - 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, - 0x00, 0xed, 0x09, 0x00, 0x89, 0x03, 0x00, 0x00, - 0x11, 0xc5, 0x02, 0x20, 0x9d, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x56, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0xa5, 0xbc, 0x02, 0x20, 0x7a, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x55, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x47, 0xc6, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x85, 0xc8, 0x02, 0x20, - 0xa1, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x51, 0xc2, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x37, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x11, 0xc5, 0x02, 0x20, - 0x9d, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x71, 0xbd, 0x02, 0x20, - 0x7a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x47, 0xc6, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x85, 0xc8, 0x02, 0x20, 0xa1, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x51, 0xc2, 0x02, 0x20, - 0xa5, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x8a, - 0x03, 0xcd, 0xf0, 0x02, 0x20, 0x06, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0xcd, 0xf0, 0x02, - 0x20, 0x2c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0xcd, 0xf0, 0x02, 0x20, 0x22, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0xcd, 0xf0, 0x02, - 0x20, 0xa1, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, - 0x00, 0xa9, 0xf0, 0x02, 0x20, 0x9d, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x57, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0xcd, 0xf0, 0x02, - 0x20, 0x59, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x64, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0x8f, 0xf0, 0x02, - 0x20, 0x67, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0xcd, 0xf0, 0xed, - 0x09, 0x00, 0x8b, 0x03, 0x02, 0x20, 0x48, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x25, 0xf0, - 0x02, 0x20, 0x49, 0x00, 0x00, 0x00, 0x0a, 0x00, - 0x00, 0x00, 0x85, 0xf0, 0x02, 0x20, 0x55, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0d, 0xf1, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x4d, 0xf1, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x15, 0xac, - 0x02, 0x20, 0x06, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x0d, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x12, 0x00, - 0x00, 0x00, 0x15, 0xac, 0x02, 0x20, 0xa1, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xf1, 0xab, - 0x02, 0x20, 0x9d, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, - 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x35, 0xab, - 0x02, 0x20, 0x69, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0xd9, 0xab, 0x02, 0x20, 0x64, 0x00, - 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x12, 0x00, - 0x00, 0x00, 0x15, 0xac, 0x02, 0x20, 0x54, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x41, 0xab, - 0x02, 0x20, 0x67, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x7b, 0xab, 0x02, 0x20, 0x68, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x15, 0xac, - 0x02, 0x20, 0xed, 0x09, 0x00, 0x8c, 0x03, 0x63, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x0b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x55, - 0xac, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7d, 0xac, 0x02, 0x20, 0xa5, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0xd3, 0xf6, 0x02, 0x20, 0x2d, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x0d, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xeb, - 0xf7, 0x02, 0x20, 0x33, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x43, - 0xf7, 0x02, 0x20, 0xa1, 0x00, 0x00, 0x00, 0x12, - 0x00, 0x00, 0x00, 0x5d, 0xf8, 0x02, 0x20, 0xa4, - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x5d, - 0xf8, 0x02, 0x20, 0x9d, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x00, 0xed, 0x09, 0x00, - 0x8d, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x0b, 0xf7, 0x02, 0x20, 0x72, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x73, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0xab, 0xf7, 0x02, 0x20, - 0x76, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0xb5, 0xf7, 0x02, 0x20, 0x4a, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0xbf, 0xf7, 0x02, 0x20, - 0x7a, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x29, 0xf8, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3b, 0xf8, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x33, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x81, 0xbe, 0x02, 0x20, - 0x1c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x8d, 0xbe, 0x02, 0x20, 0x02, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0x59, 0xc5, 0x02, 0x20, - 0x9d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x8e, 0x03, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0xe5, 0xbe, 0x02, - 0x20, 0x54, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x58, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x48, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6a, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x73, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x75, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, - 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x4c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, - 0x00, 0x12, 0x00, 0xed, 0x09, 0x00, 0x8f, 0x03, - 0x00, 0x00, 0x85, 0xc2, 0x02, 0x20, 0x55, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x59, 0xc6, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb1, 0xc8, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xa1, 0xc5, - 0x02, 0x20, 0x0c, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x90, 0x03, 0x00, 0x00, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x29, 0xab, 0x02, 0x20, 0x16, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x05, - 0xdd, 0x02, 0x20, 0x52, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x71, 0xdd, 0x02, 0x20, 0x9b, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0x91, 0x03, 0x00, 0x00, - 0x8e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x87, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x82, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x67, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0xd7, 0xaa, 0x02, 0x20, 0x68, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0xf3, 0xaa, 0x02, 0x20, - 0x63, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7b, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x81, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x92, - 0x03, 0x54, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x58, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x11, 0xab, 0x02, 0x20, 0x5a, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5b, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x65, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x1d, 0xab, 0x02, 0x20, 0x48, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x49, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0xe5, 0xaa, 0x02, 0x20, 0x69, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6a, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x71, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x73, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x75, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x4b, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0xed, - 0x09, 0x00, 0x93, 0x03, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0xf1, 0xbe, 0x02, 0x20, 0xa0, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xab, 0xdd, - 0x02, 0x20, 0xa4, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x6b, 0xc6, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0xc8, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xa1, 0xc5, - 0x02, 0x20, 0x2c, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x27, 0xbf, 0x02, 0x20, 0x32, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x94, 0x03, 0x0e, - 0x00, 0x00, 0x00, 0x51, 0xc0, 0x02, 0x20, 0x33, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x71, 0xc0, 0x02, 0x20, 0x28, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xff, - 0xbe, 0x02, 0x20, 0x22, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x09, 0xbf, 0x02, 0x20, 0x16, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x05, - 0xdd, 0x02, 0x20, 0x52, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x71, 0xdd, 0x02, 0x20, 0x9b, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0xed, 0x09, 0x00, - 0x95, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x85, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x87, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x82, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x56, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x57, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x13, 0xbf, 0x02, 0x20, - 0x5a, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x96, 0x03, 0x1d, 0xbf, 0x02, - 0x20, 0x5d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x64, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x27, 0xbf, 0x02, - 0x20, 0x49, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0xed, 0xbf, 0x02, 0x20, 0x48, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0xed, 0xbf, 0x02, - 0x20, 0x67, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x9d, 0xbf, 0x02, - 0x20, 0x69, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x71, 0xc0, 0x02, - 0x20, 0x71, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x73, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x71, 0xc0, 0x02, 0x20, 0x6b, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x75, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x91, 0xc0, 0x02, 0x20, 0x4a, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x91, 0xc0, 0x02, - 0x20, 0x6c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0xb1, 0xc0, 0x02, - 0x20, 0x4b, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0xc7, 0xc0, 0xed, 0x09, 0x00, 0x97, 0x03, - 0x02, 0x20, 0xa0, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0xab, 0xdd, 0x02, 0x20, 0xa4, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0xcb, 0xc0, 0x02, 0x20, 0x55, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x6b, 0xc6, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0xc8, 0x02, 0x20, 0x60, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xa1, 0xc5, - 0x02, 0x20, 0x2c, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0x98, 0x03, 0x2e, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x31, 0xbf, 0x02, 0x20, 0x32, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x5d, - 0xc0, 0x02, 0x20, 0x33, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x7d, - 0xc0, 0x02, 0x20, 0x16, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x05, 0xdd, 0x02, 0x20, 0x52, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x71, - 0xdd, 0x02, 0x20, 0x9b, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, - 0x00, 0xed, 0x09, 0x00, 0x99, 0x03, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x8f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x56, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x73, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x45, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x53, 0xbf, 0x02, 0x20, - 0x62, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x7b, 0xbf, 0x02, 0x20, 0x46, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x53, 0xbf, 0x02, 0x20, - 0x47, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x7b, 0xbf, 0x02, 0x20, 0x63, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x64, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0x9a, - 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x65, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x31, 0xbf, 0x02, 0x20, 0x49, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x29, 0xc0, 0x02, - 0x20, 0x48, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x29, 0xc0, 0x02, 0x20, 0x67, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x68, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0xb9, 0xbf, 0x02, 0x20, 0x69, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x7d, 0xc0, 0x02, 0x20, 0x71, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x72, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x7d, 0xc0, 0x02, - 0x20, 0x6b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, - 0x00, 0x0e, 0x00, 0x00, 0x00, 0x9d, 0xc0, 0x02, - 0x20, 0x4a, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, - 0x00, 0x9d, 0xc0, 0x02, 0x20, 0x6c, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x78, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0xab, 0xdd, 0x02, 0x20, 0xa4, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa1, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xed, - 0x09, 0x00, 0x9b, 0x03, 0x00, 0x00, 0xe9, 0xc0, - 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x6b, 0xc6, 0x02, 0x20, 0x9a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0xc8, - 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xc9, - 0x02, 0x20, 0xa2, 0x00, 0x00, 0x00, 0x13, 0x00, - 0x00, 0x00, 0xe3, 0xc2, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x12, 0x00, - 0x00, 0x00, 0xc5, 0xc6, 0x02, 0x20, 0x4d, 0x00, - 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0xc9, 0x02, 0x20, 0xa2, 0x00, - 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xb9, 0xc2, - 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x35, 0xca, 0x02, 0x20, 0x97, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xda, - 0x02, 0x20, 0x19, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x9d, 0xa5, - 0x02, 0x20, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0x9c, 0x03, 0x69, - 0xa4, 0x02, 0x20, 0x28, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x69, 0xa4, 0x02, 0x20, 0x2c, - 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x4f, - 0xf4, 0x02, 0x20, 0x32, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x81, - 0xe2, 0x02, 0x20, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xcd, 0xd8, 0x02, 0x20, 0x53, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1d, - 0xd9, 0x02, 0x20, 0x5a, 0x00, 0x00, 0x00, 0x13, - 0x00, 0x00, 0x00, 0xf9, 0xe2, 0x02, 0x20, 0x5e, - 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x2f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, - 0xf4, 0x02, 0x20, 0x6c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, - 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0xd7, - 0xa5, 0x02, 0x20, 0x54, 0x00, 0x00, 0x00, 0x0d, - 0x00, 0x00, 0x00, 0x5d, 0xe2, 0x02, 0x20, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x51, 0xe3, 0x02, 0x20, 0x09, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd5, 0xef, 0x02, 0x20, 0x9a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0x9d, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0xc9, 0xe3, 0x02, 0x20, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x29, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xff, 0xe3, 0x02, 0x20, - 0x63, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x6d, 0xe4, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd5, 0xef, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0xa9, 0xe4, 0x02, 0x20, - 0x63, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x8d, 0xe5, 0x02, 0x20, 0x57, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0xc9, 0xe5, 0x02, 0x20, - 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0x9e, 0x03, 0xa1, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe6, 0x02, - 0x20, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd5, 0xef, 0x02, 0x20, 0x9a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x02, - 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0xe5, 0xe6, 0x02, - 0x20, 0x29, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x0d, 0xe7, 0x02, 0x20, 0x5a, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0xc1, 0xe7, 0x02, - 0x20, 0x5b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0xa5, 0xe8, 0x02, 0x20, 0x5c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa5, 0xe6, 0x02, 0x20, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xef, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x47, 0xee, 0x02, - 0x20, 0x2f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x67, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x4d, 0xef, 0x02, 0x20, 0x68, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x64, 0x00, 0xed, 0x09, 0x00, 0x9f, 0x03, - 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x09, 0x00, - 0x00, 0x00, 0x05, 0xef, 0x02, 0x20, 0x65, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xef, - 0x02, 0x20, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0xe6, 0x02, 0x20, 0x55, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xef, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0xf0, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x59, 0xef, 0x02, 0x20, 0x63, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xc9, 0xef, - 0x02, 0x20, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0xe6, 0x02, 0x20, 0x55, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xef, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0xf0, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0xf9, 0xe6, 0x02, 0x20, 0x64, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x00, 0xf9, 0xe6, 0x02, 0x20, 0x65, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0xed, - 0x02, 0x20, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0xe6, 0x02, 0x20, 0x55, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0xef, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0b, 0xf0, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0xa0, 0x03, 0x09, 0x00, 0x00, 0x00, 0xf9, - 0xe6, 0x02, 0x20, 0x29, 0x00, 0x00, 0x00, 0x09, - 0x00, 0x00, 0x00, 0xe9, 0xed, 0x02, 0x20, 0xa1, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, - 0xe6, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd5, 0xef, 0x02, 0x20, 0x9a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x61, - 0xea, 0x02, 0x20, 0x07, 0x00, 0x00, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x61, 0xea, 0x02, 0x20, 0x19, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0d, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, - 0xef, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0xf0, 0x02, 0x20, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x0b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, - 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xa7, - 0xea, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd5, 0xef, 0x02, 0x20, 0x9a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0xed, 0x09, 0x00, 0xa1, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x59, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x05, 0xe9, 0x02, 0x20, - 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd5, 0xef, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1a, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xd5, 0xef, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x02, 0x20, - 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0xed, 0xea, 0x02, 0x20, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0xea, 0x02, 0x20, - 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xd5, 0xef, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0xa2, - 0x03, 0x01, 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0xa1, 0xeb, 0x02, - 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa1, 0xeb, 0x02, 0x20, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xef, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x4d, 0xe9, 0x02, 0x20, 0x5b, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x85, 0xe9, 0x02, - 0x20, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa5, 0xe6, 0x02, 0x20, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xef, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0xf0, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5f, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x55, 0xec, 0x02, 0x20, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xef, 0xed, - 0x09, 0x00, 0xa3, 0x03, 0x02, 0x20, 0x9a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, - 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x12, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1f, 0xed, 0x02, 0x20, 0x68, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x12, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xed, - 0x02, 0x20, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x47, 0xed, 0x02, 0x20, 0xa1, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xe6, - 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe7, 0xef, 0x02, 0x20, 0x9a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xf0, - 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, - 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xf9, 0xe6, - 0x02, 0x20, 0x28, 0x00, 0x00, 0x00, 0x13, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x13, 0x00, - 0x00, 0x00, 0xa9, 0xec, 0x02, 0x20, 0x25, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0xa4, 0x03, 0x63, - 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x9d, - 0xec, 0x02, 0x20, 0xa1, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa5, 0xe6, 0x02, 0x20, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, - 0xef, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0xf0, 0x02, 0x20, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x15, - 0x00, 0x00, 0x00, 0xb5, 0xda, 0x02, 0x20, 0x52, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xcd, - 0xd8, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x65, 0xdb, 0x02, 0x20, 0x9a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, - 0xdb, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xa1, - 0xda, 0x02, 0x20, 0x52, 0x00, 0x00, 0x00, 0x15, - 0x00, 0x00, 0x00, 0xcd, 0xd8, 0x02, 0x20, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, - 0xdb, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x83, 0xdb, 0x02, 0x20, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, - 0xdb, 0x02, 0x20, 0x9c, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xe5, 0xda, 0x02, 0x20, 0x52, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xcd, - 0xd8, 0x02, 0x20, 0x50, 0x00, 0x00, 0x00, 0x16, - 0x00, 0x00, 0x00, 0xc5, 0xda, 0x02, 0x20, 0x51, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa0, 0x00, 0xed, 0x09, 0x00, - 0xa5, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x65, 0xdb, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0xdb, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4d, 0xdb, 0x02, 0x20, 0x9c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x65, 0xdb, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x83, 0xdb, 0x02, 0x20, - 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, - 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, - 0x1a, 0x00, 0x00, 0x00, 0x5b, 0xd9, 0x02, 0x20, - 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x65, 0xdb, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x83, 0xdb, 0x02, 0x20, - 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, - 0xf7, 0xda, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x65, 0xdb, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x83, 0xdb, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0xa6, 0x03, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, - 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xdb, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x83, 0xdb, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0xdb, 0x02, - 0x20, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0xdb, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x83, 0xdb, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3d, 0xa7, 0x02, 0x20, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa9, 0xa7, 0x02, - 0x20, 0x18, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xaa, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xb3, 0xaa, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0xa7, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, - 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0xed, 0xa7, - 0x02, 0x20, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xaa, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xb3, 0xaa, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x1e, 0x00, - 0x00, 0x00, 0x8d, 0xa4, 0x02, 0x20, 0x1f, 0x00, - 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x1e, 0x00, - 0x00, 0x00, 0x91, 0xa9, 0x02, 0x20, 0x64, 0x00, - 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xfb, 0xa7, 0x02, 0x20, 0x65, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xa7, - 0x02, 0x20, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xd5, 0xa8, 0x02, 0x20, 0x68, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x53, 0xa9, 0x02, 0x20, 0x55, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0xaa, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xbd, 0xaa, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x1f, 0x00, - 0x00, 0x00, 0xa1, 0xa4, 0x02, 0x20, 0x2a, 0x00, - 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x8d, 0xa4, - 0x02, 0x20, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x00, - 0x00, 0x00, 0x59, 0xa6, 0x02, 0x20, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0xa8, 0x03, 0xe5, 0xa6, 0x02, 0x20, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, - 0xaa, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xb3, 0xaa, 0x02, 0x20, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x69, 0xa4, 0x02, 0x20, 0x06, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1d, - 0xa6, 0x02, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x49, 0xa6, 0x02, 0x20, 0x29, - 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x51, - 0xa8, 0x02, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0xeb, 0xa5, 0x02, 0x20, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, - 0xaa, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xb3, 0xaa, 0x02, 0x20, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x21, - 0x00, 0x00, 0x00, 0x71, 0xa8, 0x02, 0x20, 0x2f, - 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x0b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x21, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, - 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x91, - 0xa9, 0x02, 0x20, 0x5a, 0x00, 0x00, 0x00, 0x24, - 0x00, 0x00, 0x00, 0x19, 0xa9, 0x02, 0x20, 0x64, - 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0xa9, 0x03, 0x00, 0x00, - 0x66, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xe3, 0xa8, 0x02, 0x20, - 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xd5, 0xa8, 0x02, 0x20, 0x68, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x53, 0xa9, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x87, 0xaa, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb3, 0xaa, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x64, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0xcf, 0xa9, 0x02, 0x20, - 0x65, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, - 0xcf, 0xa9, 0x02, 0x20, 0xa1, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x53, 0xa9, 0x02, 0x20, - 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x87, 0xaa, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xb3, 0xaa, 0x02, 0x20, - 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x29, 0xaa, 0x02, 0x20, - 0x63, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x87, 0xaa, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb3, 0xaa, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x25, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0xaa, - 0x03, 0x64, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x09, 0xa5, 0x02, - 0x20, 0x65, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x09, 0xa5, 0x02, 0x20, 0x67, 0x00, 0x00, - 0x00, 0x13, 0x00, 0x00, 0x00, 0x09, 0xa5, 0x02, - 0x20, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x49, 0xa5, 0x02, 0x20, 0xa1, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0xa9, 0x02, - 0x20, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x87, 0xaa, 0x02, 0x20, 0x9a, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xb3, 0xaa, 0x02, - 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x27, 0x00, 0x00, 0x00, 0x35, 0xf4, 0x02, - 0x20, 0x28, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, - 0x00, 0x26, 0x00, 0x00, 0x00, 0xc1, 0xf4, 0x02, - 0x20, 0x63, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xf6, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc9, 0xf6, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x15, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, - 0x00, 0xcd, 0xf4, 0x02, 0x20, 0x18, 0x00, 0x00, - 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xf6, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc9, 0xf6, 0x02, 0x20, 0xa5, 0x00, 0xed, - 0x09, 0x00, 0xab, 0x03, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0xf1, 0xf3, - 0x02, 0x20, 0x32, 0x00, 0x00, 0x00, 0x27, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, - 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x2c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x27, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x29, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, - 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xd5, 0xf3, 0x02, 0x20, 0x69, 0x00, - 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0xd7, 0xf4, - 0x02, 0x20, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xd5, 0xf3, 0x02, 0x20, 0x55, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xf6, - 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc9, 0xf6, 0x02, 0x20, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, - 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x5d, 0xf5, 0x02, 0x20, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf3, - 0x02, 0x20, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0xac, 0x03, 0x28, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, - 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x45, - 0xf5, 0x02, 0x20, 0x73, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x02, 0x20, 0xa4, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, - 0xf3, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xab, 0xf6, 0x02, 0x20, 0x9a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, - 0xf6, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, - 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x2b, - 0x00, 0x00, 0x00, 0x83, 0xf5, 0x02, 0x20, 0x34, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, - 0xf3, 0x02, 0x20, 0x28, 0x00, 0x00, 0x00, 0x29, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, - 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x29, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, - 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x29, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, - 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x2b, - 0x00, 0x00, 0x00, 0xa1, 0xf5, 0x02, 0x20, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, - 0xf3, 0x02, 0x20, 0xa4, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xd5, 0xf3, 0x02, 0x20, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, - 0xf6, 0x02, 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xc9, 0xf6, 0x02, 0x20, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0xed, 0x09, 0x00, - 0xad, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, - 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xbd, 0xf5, 0x02, 0x20, 0x76, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xbd, 0xf5, 0x02, 0x20, - 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1d, 0xf6, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xab, 0xf6, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc9, 0xf6, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, - 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x6b, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xfd, 0xf5, 0x02, 0x20, - 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xd5, 0xf3, 0x02, 0x20, 0x55, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xab, 0xf6, 0x02, 0x20, - 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc9, 0xf6, 0x02, 0x20, 0xa5, 0x00, 0x00, 0x00, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x59, 0xf6, 0x02, 0x20, 0xa4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3b, 0xf6, 0x02, 0x20, - 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0xae, 0x03, 0xab, 0xf6, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc9, 0xf6, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, - 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x6c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0xf6, 0x02, - 0x20, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd5, 0xf3, 0x02, 0x20, 0x55, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xf6, 0x02, - 0x20, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xc9, 0xf6, 0x02, 0x20, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, - 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0xaf, 0x03, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, - 0x00, 0xb0, 0x03, 0xa5, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x50, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, - 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xed, 0x09, 0x00, 0xb1, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5d, 0x0b, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe1, 0x0b, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x51, 0x00, 0x03, 0x20, 0xed, 0x09, 0x00, 0xb2, - 0x03, 0xc3, 0x15, 0x03, 0x20, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x03, - 0x20, 0x01, 0x16, 0x03, 0x20, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x0f, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x3b, 0x0f, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x12, 0x03, - 0x20, 0x6d, 0x16, 0x03, 0x20, 0x11, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x01, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x02, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0x02, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x04, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x05, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x6d, 0x03, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x35, 0x03, 0x03, - 0x20, 0xbd, 0x16, 0x03, 0x20, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x06, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x07, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x9d, 0x08, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x41, 0x09, 0x03, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x0f, 0xed, - 0x09, 0x00, 0xb3, 0x03, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3d, 0x11, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0b, 0x11, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3f, 0x11, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x71, 0x11, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 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, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x41, 0x10, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x00, 0x97, 0x10, 0x03, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xd9, 0x10, 0x03, 0x20, 0xdd, 0x16, - 0x03, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xe3, 0x10, 0x03, 0x20, 0xfd, 0x16, - 0x03, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xed, 0x09, 0x00, 0xb4, 0x03, 0xc1, - 0x0c, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, - 0x0c, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, - 0x0a, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, - 0x0a, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x09, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, - 0x09, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x09, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, - 0x0a, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf9, - 0x0d, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, - 0x0d, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, - 0x21, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, - 0x22, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, - 0x0e, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, - 0x0e, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, - 0x01, 0x03, 0x20, 0x3f, 0x16, 0x03, 0x20, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xdd, - 0x03, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, - 0xb5, 0x03, 0x00, 0x00, 0x0f, 0x01, 0x03, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x83, 0x0f, 0x03, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0xed, 0x10, 0x03, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0xa5, 0x11, 0x03, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x09, 0x12, 0x03, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xed, 0x09, 0x00, 0xb6, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xed, 0x09, 0x00, 0xb7, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2d, - 0xe2, 0x93, 0xbe, 0x45, 0x15, 0xae, 0x78, 0x03, - 0x87, 0xa4, 0xb8, 0x38, 0xcf, 0x3f, 0x08, 0x67, - 0x09, 0x94, 0xeb, 0x26, 0xa8, 0x6b, 0xbd, 0x18, - 0x34, 0x1b, 0xbb, 0xbf, 0x72, 0xf7, 0x40, 0x35, - 0x48, 0x9c, 0x51, 0x2f, 0x3b, 0x55, 0xe3, 0xc0, - 0x9f, 0xd8, 0xd3, 0xf3, 0x8d, 0xb1, 0xff, 0xa7, - 0x3e, 0xdc, 0x86, 0x77, 0xd7, 0xa6, 0x11, 0xfb, - 0xf4, 0xba, 0x92, 0x91, 0x64, 0x83, 0xf1, 0x33, - 0xef, 0xda, 0x2c, 0xb5, 0xb2, 0x2b, 0x88, 0xd1, - 0x99, 0xcb, 0x8c, 0x84, 0x1d, 0x14, 0x81, 0x97, - 0x71, 0xca, 0x5f, 0xa3, 0x8b, 0x57, 0x3c, 0x82, - 0xc4, 0x52, 0x5c, 0x1c, 0xe8, 0xa0, 0x04, 0xb4, - 0x85, 0x4a, 0xf6, 0x13, 0x54, 0xb6, 0xdf, 0x0c, - 0x1a, 0x8e, 0xde, 0xe0, 0x39, 0xfc, 0x20, 0x9b, - 0x24, 0x4e, 0xa9, 0x98, 0x9e, 0xab, 0xf2, 0x60, - 0xd0, 0x6c, 0xea, 0xfa, 0xc7, 0xd9, 0x00, 0xd4, - 0x1f, 0x6e, 0x43, 0xbc, 0xec, 0x53, 0x89, 0xfe, - 0x7a, 0x5d, 0x49, 0xc9, 0x32, 0xc2, 0xf9, 0x9a, - 0xf8, 0x6d, 0x16, 0xdb, 0x59, 0x96, 0x44, 0xe9, - 0xcd, 0xe6, 0x46, 0x42, 0x8f, 0x0a, 0xc1, 0xcc, - 0xb9, 0x65, 0xb0, 0xd2, 0xc6, 0xac, 0x1e, 0x41, - 0x62, 0x29, 0x2e, 0x0e, 0x74, 0x50, 0x02, 0x5a, - 0xc3, 0x25, 0x7b, 0x8a, 0x2a, 0x5b, 0xf0, 0x06, - 0x0d, 0x47, 0x6f, 0x70, 0x9d, 0x7e, 0x10, 0xce, - 0x12, 0x27, 0xd5, 0x4c, 0x4f, 0xd6, 0x79, 0x30, - 0x68, 0x36, 0x75, 0x7d, 0xe4, 0xed, 0x80, 0x6a, - 0x90, 0x37, 0xa2, 0x5e, 0x76, 0xaa, 0xc5, 0x7f, - 0x3d, 0xaf, 0xa5, 0xe5, 0x19, 0x61, 0xfd, 0x4d, - 0x7c, 0xb7, 0x0b, 0xee, 0xad, 0x4b, 0x22, 0xf5, - 0xe7, 0x73, 0x23, 0x21, 0xc8, 0x05, 0xed, 0x09, - 0x00, 0xb8, 0x03, 0xe1, 0x66, 0xdd, 0xb3, 0x58, - 0x69, 0x63, 0x56, 0x0f, 0xa1, 0x31, 0x95, 0x17, - 0x07, 0x3a, 0x28, 0x80, 0x00, 0xb0, 0x09, 0x60, - 0xef, 0xb9, 0xfd, 0x10, 0x12, 0x9f, 0xe4, 0x69, - 0xba, 0xad, 0xf8, 0xc0, 0x38, 0xc2, 0x65, 0x4f, - 0x06, 0x94, 0xfc, 0x19, 0xde, 0x6a, 0x1b, 0x5d, - 0x4e, 0xa8, 0x82, 0x70, 0xed, 0xe8, 0xec, 0x72, - 0xb3, 0x15, 0xc3, 0xff, 0xab, 0xb6, 0x47, 0x44, - 0x01, 0xac, 0x25, 0xc9, 0xfa, 0x8e, 0x41, 0x1a, - 0x21, 0xcb, 0xd3, 0x0d, 0x6e, 0xfe, 0x26, 0x58, - 0xda, 0x32, 0x0f, 0x20, 0xa9, 0x9d, 0x84, 0x98, - 0x05, 0x9c, 0xbb, 0x22, 0x8c, 0x63, 0xe7, 0xc5, - 0xe1, 0x73, 0xc6, 0xaf, 0x24, 0x5b, 0x87, 0x66, - 0x27, 0xf7, 0x57, 0xf4, 0x96, 0xb1, 0xb7, 0x5c, - 0x8b, 0xd5, 0x54, 0x79, 0xdf, 0xaa, 0xf6, 0x3e, - 0xa3, 0xf1, 0x11, 0xca, 0xf5, 0xd1, 0x17, 0x7b, - 0x93, 0x83, 0xbc, 0xbd, 0x52, 0x1e, 0xeb, 0xae, - 0xcc, 0xd6, 0x35, 0x08, 0xc8, 0x8a, 0xb4, 0xe2, - 0xcd, 0xbf, 0xd9, 0xd0, 0x50, 0x59, 0x3f, 0x4d, - 0x62, 0x34, 0x0a, 0x48, 0x88, 0xb5, 0x56, 0x4c, - 0x2e, 0x6b, 0x9e, 0xd2, 0x3d, 0x3c, 0x03, 0x13, - 0xfb, 0x97, 0x51, 0x75, 0x4a, 0x91, 0x71, 0x23, - 0xbe, 0x76, 0x2a, 0x5f, 0xf9, 0xd4, 0x55, 0x0b, - 0xdc, 0x37, 0x31, 0x16, 0x74, 0xd7, 0x77, 0xa7, - 0xe6, 0x07, 0xdb, 0xa4, 0x2f, 0x46, 0xf3, 0x61, - 0x45, 0x67, 0xe3, 0x0c, 0xa2, 0x3b, 0x1c, 0x85, - 0x18, 0x04, 0x1d, 0x29, 0xa0, 0x8f, 0xb2, 0x5a, - 0xd8, 0xa6, 0x7e, 0xee, 0x8d, 0x53, 0x4b, 0xa1, - 0x9a, 0xc1, 0x0e, 0x7a, 0x49, 0xa5, 0x2c, 0x81, - 0xc4, 0xc7, 0x36, 0x2b, 0x7f, 0x43, 0x95, 0x33, - 0xf2, 0x6c, 0x68, 0x6d, 0xf0, 0x02, 0x28, 0xce, - 0xdd, 0x9b, 0xea, 0x5e, 0x99, 0x7c, 0x14, 0x86, - 0xcf, 0xed, 0x09, 0x00, 0xb9, 0x03, 0xe5, 0x42, - 0xb8, 0x40, 0x78, 0x2d, 0x3a, 0xe9, 0x64, 0x1f, - 0x92, 0x90, 0x7d, 0x39, 0x6f, 0xe0, 0x89, 0x30, - 0x80, 0x00, 0xb0, 0x09, 0x60, 0xef, 0xb9, 0xfd, - 0x10, 0x12, 0x9f, 0xe4, 0x69, 0xba, 0xad, 0xf8, - 0xc0, 0x38, 0xc2, 0x65, 0x4f, 0x06, 0x94, 0xfc, - 0x19, 0xde, 0x6a, 0x1b, 0x5d, 0x4e, 0xa8, 0x82, - 0x70, 0xed, 0xe8, 0xec, 0x72, 0xb3, 0x15, 0xc3, - 0xff, 0xab, 0xb6, 0x47, 0x44, 0x01, 0xac, 0x25, - 0xc9, 0xfa, 0x8e, 0x41, 0x1a, 0x21, 0xcb, 0xd3, - 0x0d, 0x6e, 0xfe, 0x26, 0x58, 0xda, 0x32, 0x0f, - 0x20, 0xa9, 0x9d, 0x84, 0x98, 0x05, 0x9c, 0xbb, - 0x22, 0x8c, 0x63, 0xe7, 0xc5, 0xe1, 0x73, 0xc6, - 0xaf, 0x24, 0x5b, 0x87, 0x66, 0x27, 0xf7, 0x57, - 0xf4, 0x96, 0xb1, 0xb7, 0x5c, 0x8b, 0xd5, 0x54, - 0x79, 0xdf, 0xaa, 0xf6, 0x3e, 0xa3, 0xf1, 0x11, - 0xca, 0xf5, 0xd1, 0x17, 0x7b, 0x93, 0x83, 0xbc, - 0xbd, 0x52, 0x1e, 0xeb, 0xae, 0xcc, 0xd6, 0x35, - 0x08, 0xc8, 0x8a, 0xb4, 0xe2, 0xcd, 0xbf, 0xd9, - 0xd0, 0x50, 0x59, 0x3f, 0x4d, 0x62, 0x34, 0x0a, - 0x48, 0x88, 0xb5, 0x56, 0x4c, 0x2e, 0x6b, 0x9e, - 0xd2, 0x3d, 0x3c, 0x03, 0x13, 0xfb, 0x97, 0x51, - 0x75, 0x4a, 0x91, 0x71, 0x23, 0xbe, 0x76, 0x2a, - 0x5f, 0xf9, 0xd4, 0x55, 0x0b, 0xdc, 0x37, 0x31, - 0x16, 0x74, 0xd7, 0x77, 0xa7, 0xe6, 0x07, 0xdb, - 0xa4, 0x2f, 0x46, 0xf3, 0x61, 0x45, 0x67, 0xe3, - 0x0c, 0xa2, 0x3b, 0x1c, 0x85, 0x18, 0x04, 0x1d, - 0x29, 0xa0, 0x8f, 0xb2, 0x5a, 0xd8, 0xa6, 0x7e, - 0xee, 0x8d, 0x53, 0x4b, 0xa1, 0x9a, 0xc1, 0x0e, - 0x7a, 0x49, 0xa5, 0x2c, 0x81, 0xc4, 0xc7, 0x36, - 0x2b, 0x7f, 0x43, 0x95, 0x33, 0xf2, 0x6c, 0x68, - 0x6d, 0xf0, 0x02, 0x28, 0xce, 0xdd, 0x9b, 0xea, - 0x5e, 0x99, 0x7c, 0x14, 0xed, 0x09, 0x5e, 0xba, - 0x03, 0x86, 0xcf, 0xe5, 0x42, 0xb8, 0x40, 0x78, - 0x2d, 0x3a, 0xe9, 0x64, 0x1f, 0x92, 0x90, 0x7d, - 0x39, 0x6f, 0xe0, 0x89, 0x30, 0xfc, 0x01, 0x06, - 0x09, 0x0c, 0x10, 0x13, 0x14, 0x00, 0x0a, 0x0f, - 0x14, 0x15, 0x16, 0x19, 0x1b, 0x1e, 0x20, 0x22, - 0x24, 0x27, 0x2a, 0x2d, 0x30, 0x34, 0x38, 0x3c, - 0x40, 0x44, 0x4a, 0x50, 0x55, 0x5a, 0x5f, 0x00, - 0x00, 0x00, 0x0a, 0x0f, 0x14, 0x15, 0x16, 0x19, - 0x1b, 0x1e, 0x20, 0x22, 0x24, 0x27, 0x2a, 0x2d, - 0x30, 0x34, 0x38, 0x3c, 0x40, 0x44, 0x4a, 0x50, - 0x55, 0x5a, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/cdrom/cdrom.c linux-2.4.23-pre8/drivers/cdrom/cdrom.c --- linux-2.4.22/drivers/cdrom/cdrom.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/cdrom/cdrom.c 2003-10-22 22:47:51.000000000 +0000 @@ -1882,20 +1882,26 @@ if (cgc->buflen < 0 || cgc->buflen >= 131072) return -EINVAL; - if ((ubuf = cgc->buffer)) { + usense = cgc->sense; + cgc->sense = &sense; + if (usense && !access_ok(VERIFY_WRITE, usense, sizeof(*usense))) { + return -EFAULT; + } + + ubuf = cgc->buffer; + if (cgc->data_direction == CGC_DATA_READ || + cgc->data_direction == CGC_DATA_WRITE) { cgc->buffer = kmalloc(cgc->buflen, GFP_KERNEL); if (cgc->buffer == NULL) return -ENOMEM; } - usense = cgc->sense; - cgc->sense = &sense; - if (usense && !access_ok(VERIFY_WRITE, usense, sizeof(*usense))) - return -EFAULT; if (cgc->data_direction == CGC_DATA_READ) { - if (!access_ok(VERIFY_READ, ubuf, cgc->buflen)) + if (!access_ok(VERIFY_READ, ubuf, cgc->buflen)) { + kfree(cgc->buffer); return -EFAULT; + } } else if (cgc->data_direction == CGC_DATA_WRITE) { if (copy_from_user(cgc->buffer, ubuf, cgc->buflen)) { kfree(cgc->buffer); @@ -1907,7 +1913,10 @@ __copy_to_user(usense, cgc->sense, sizeof(*usense)); if (!ret && cgc->data_direction == CGC_DATA_READ) __copy_to_user(ubuf, cgc->buffer, cgc->buflen); - kfree(cgc->buffer); + if (cgc->data_direction == CGC_DATA_READ || + cgc->data_direction == CGC_DATA_WRITE) { + kfree(cgc->buffer); + } return ret; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/Config.in linux-2.4.23-pre8/drivers/char/Config.in --- linux-2.4.22/drivers/char/Config.in 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/Config.in 2003-10-22 22:48:00.000000000 +0000 @@ -104,6 +104,15 @@ fi fi fi + if [ "$CONFIG_IA64" = "y" ]; then + bool ' SGI SN2 l1 serial port support' CONFIG_SGI_L1_SERIAL + if [ "$CONFIG_SGI_L1_SERIAL" = "y" ]; then + bool ' SGI SN2 l1 Console support' CONFIG_SGI_L1_SERIAL_CONSOLE + fi + if [ "$CONFIG_IA64_GENERIC" = "y" -o "$CONFIG_IA64_SGI_SN2" = "y" ]; then + bool ' SGI SN2 IOC4 serial port support' CONFIG_SGI_IOC4_SERIAL + fi + fi fi if [ "$CONFIG_EXPERIMENTAL" = "y" -a "$CONFIG_ZORRO" = "y" ]; then tristate 'Commodore A2232 serial support (EXPERIMENTAL)' CONFIG_A2232 @@ -158,7 +167,7 @@ dep_tristate 'Texas Instruments parallel link cable support' CONFIG_TIPAR $CONFIG_PARPORT fi -if [ "$CONFIG_PPC64" ] ; then +if [ "$CONFIG_PPC64" = "y" ] ; then bool 'pSeries Hypervisor Virtual Console support' CONFIG_HVC_CONSOLE fi if [ "$CONFIG_ALL_PPC" = "y" ]; then @@ -261,12 +270,20 @@ fi dep_tristate 'NatSemi SCx200 GPIO Support' CONFIG_SCx200_GPIO $CONFIG_SCx200 +if [ "$CONFIG_IA64_GENERIC" = "y" -o "$CONFIG_IA64_SGI_SN2" = "y" ] ; then + bool 'SGI SN2 fetchop support' CONFIG_FETCHOP +fi + if [ "$CONFIG_X86" = "y" -o "$CONFIG_X86_64" = "y" ]; then dep_tristate 'AMD 768/8111 Random Number Generator support' CONFIG_AMD_RNG $CONFIG_PCI fi if [ "$CONFIG_X86" = "y" -o "$CONFIG_IA64" = "y" ]; then dep_tristate 'Intel i8x0 Random Number Generator support' CONFIG_INTEL_RNG $CONFIG_PCI fi +if [ "$CONFIG_X86" = "y" -o "$CONFIG_IA64" = "y" -o \ + "$CONFIG_X86_64" = "y" ]; then + dep_tristate 'Intel/AMD/VIA HW Random Number Generator support' CONFIG_HW_RANDOM $CONFIG_PCI +fi dep_tristate 'AMD 76x native power management (Experimental)' CONFIG_AMD_PM768 $CONFIG_PCI tristate '/dev/nvram support' CONFIG_NVRAM tristate 'Enhanced Real Time Clock Support' CONFIG_RTC @@ -294,7 +311,7 @@ if [ "$CONFIG_GART_IOMMU" = "y" ]; then bool '/dev/agpgart (AGP Support)' CONFIG_AGP - define_bool CONFIG_AGP_AMD_8151 y + define_bool CONFIG_AGP_AMD_K8 y else tristate '/dev/agpgart (AGP Support)' CONFIG_AGP fi @@ -304,7 +321,7 @@ bool ' VIA chipset support' CONFIG_AGP_VIA bool ' AMD Irongate, 761, and 762 support' CONFIG_AGP_AMD if [ "$CONFIG_GART_IOMMU" != "y" ]; then - bool ' AMD 8151 support' CONFIG_AGP_AMD_8151 + bool ' AMD Opteron/Athlon64 on-CPU GART support' CONFIG_AGP_AMD_K8 fi bool ' Generic SiS support' CONFIG_AGP_SIS bool ' ALI chipset support' CONFIG_AGP_ALI @@ -313,10 +330,14 @@ bool ' NVIDIA chipset support' CONFIG_AGP_NVIDIA fi if [ "$CONFIG_IA64" = "y" ]; then + bool ' Intel 460GX support' CONFIG_AGP_I460 bool ' HP ZX1 AGP support' CONFIG_AGP_HP_ZX1 fi + bool ' ATI IGP chipset support' CONFIG_AGP_ATI fi +mainmenu_option next_comment +comment 'Direct Rendering Manager (XFree86 DRI support)' bool 'Direct Rendering Manager (XFree86 DRI support)' CONFIG_DRM if [ "$CONFIG_DRM" = "y" ]; then bool ' Build drivers for old (XFree 4.0) DRM' CONFIG_DRM_OLD @@ -329,6 +350,7 @@ source drivers/char/drm/Config.in fi fi +endmenu if [ "$CONFIG_HOTPLUG" = "y" -a "$CONFIG_PCMCIA" != "n" ]; then source drivers/char/pcmcia/Config.in diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/Makefile linux-2.4.23-pre8/drivers/char/Makefile --- linux-2.4.22/drivers/char/Makefile 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/Makefile 2003-10-22 22:49:43.000000000 +0000 @@ -24,7 +24,7 @@ export-objs := busmouse.o console.o keyboard.o sysrq.o \ misc.o pty.o random.o selection.o serial.o \ sonypi.o tty_io.o tty_ioctl.o generic_serial.o \ - au1000_gpio.o hp_psaux.o nvram.o scx200.o + au1000_gpio.o hp_psaux.o nvram.o scx200.o fetchop.o mod-subdirs := joystick ftape drm drm-4.0 pcmcia @@ -211,6 +211,7 @@ obj-$(CONFIG_HVC_CONSOLE) += hvc_console.o obj-$(CONFIG_SERIAL_TX3912) += generic_serial.o serial_tx3912.o obj-$(CONFIG_TXX927_SERIAL) += serial_txx927.o +obj-$(CONFIG_SGI_L1_SERIAL) += sn_serial.o subdir-$(CONFIG_RIO) += rio subdir-$(CONFIG_INPUT) += joystick @@ -224,6 +225,7 @@ obj-y += joystick/js.o endif +obj-$(CONFIG_FETCHOP) += fetchop.o obj-$(CONFIG_BUSMOUSE) += busmouse.o obj-$(CONFIG_DTLK) += dtlk.o obj-$(CONFIG_R3964) += n_r3964.o @@ -247,6 +249,7 @@ obj-$(CONFIG_DS1620) += ds1620.o obj-$(CONFIG_INTEL_RNG) += i810_rng.o obj-$(CONFIG_AMD_RNG) += amd768_rng.o +obj-$(CONFIG_HW_RANDOM) += hw_random.o obj-$(CONFIG_AMD_PM768) += amd76x_pm.o obj-$(CONFIG_BRIQ_PANEL) += briq_panel.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/agp/agp.h linux-2.4.23-pre8/drivers/char/agp/agp.h --- linux-2.4.22/drivers/char/agp/agp.h 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/agp/agp.h 2003-10-22 22:48:39.000000000 +0000 @@ -172,6 +172,12 @@ #ifndef PCI_DEVICE_ID_VIA_82C694X_0 #define PCI_DEVICE_ID_VIA_82C694X_0 0x0605 #endif +#ifndef PCI_DEVICE_ID_VIA_8380_0 +#define PCI_DEVICE_ID_VIA_8380_0 0x0204 +#endif +#ifndef PCI_DEVICE_ID_VIA_8385_0 +#define PCI_DEVICE_ID_VIA_8385_0 0x3188 +#endif #ifndef PCI_DEVICE_ID_INTEL_810_0 #define PCI_DEVICE_ID_INTEL_810_0 0x7120 #endif @@ -223,6 +229,12 @@ #ifndef PCI_DEVICE_ID_INTEL_860_0 #define PCI_DEVICE_ID_INTEL_860_0 0x2531 #endif +#ifndef PCI_DEVICE_ID_INTEL_7205_0 +#define PCI_DEVICE_ID_INTEL_7205_0 0x255d +#endif +#ifndef PCI_DEVICE_ID_INTEL_7505_0 +#define PCI_DEVICE_ID_INTEL_7505_0 0x2550 +#endif #ifndef PCI_DEVICE_ID_INTEL_810_DC100_0 #define PCI_DEVICE_ID_INTEL_810_DC100_0 0x7122 #endif @@ -250,6 +262,9 @@ #ifndef PCI_DEVICE_ID_INTEL_82443GX_1 #define PCI_DEVICE_ID_INTEL_82443GX_1 0x71a1 #endif +#ifndef PCI_DEVICE_ID_INTEL_460GX +#define PCI_DEVICE_ID_INTEL_460GX 0x84ea +#endif #ifndef PCI_DEVICE_ID_AMD_IRONGATE_0 #define PCI_DEVICE_ID_AMD_IRONGATE_0 0x7006 #endif @@ -292,6 +307,30 @@ #ifndef PCI_DEVICE_ID_AL_M1671_0 #define PCI_DEVICE_ID_AL_M1671_0 0x1671 #endif +#ifndef PCI_VENDOR_ID_ATI +#define PCI_VENDOR_ID_ATI 0x1002 +#endif +#ifndef PCI_DEVICE_ID_ATI_RS100 +#define PCI_DEVICE_ID_ATI_RS100 0xcab0 +#endif +#ifndef PCI_DEVICE_ID_ATI_RS200 +#define PCI_DEVICE_ID_ATI_RS200 0xcab2 +#endif +#ifndef PCI_DEVICE_ID_ATI_RS250 +#define PCI_DEVICE_ID_ATI_RS250 0xcab3 +#endif +#ifndef PCI_DEVICE_ID_ATI_RS300_100 +#define PCI_DEVICE_ID_ATI_RS300_100 0x5830 +#endif +#ifndef PCI_DEVICE_ID_ATI_RS300_133 +#define PCI_DEVICE_ID_ATI_RS300_133 0x5831 +#endif +#ifndef PCI_DEVICE_ID_ATI_RS300_166 +#define PCI_DEVICE_ID_ATI_RS300_166 0x5832 +#endif +#ifndef PCI_DEVICE_ID_ATI_RS300_200 +#define PCI_DEVICE_ID_ATI_RS300_200 0x5833 +#endif /* intel register */ #define INTEL_APBASE 0x10 @@ -301,6 +340,14 @@ #define INTEL_NBXCFG 0x50 #define INTEL_ERRSTS 0x91 +/* Intel 460GX Registers */ +#define INTEL_I460_APBASE 0x10 +#define INTEL_I460_BAPBASE 0x98 +#define INTEL_I460_GXBCTL 0xa0 +#define INTEL_I460_AGPSIZ 0xa2 +#define INTEL_I460_ATTBASE 0xfe200000 +#define INTEL_I460_GATT_VALID (1UL << 24) +#define INTEL_I460_GATT_COHERENT (1UL << 25) /* Intel 855GM/852GM registers */ #define I855_GMCH_CTRL 0x52 #define I855_GMCH_ENABLED 0x4 @@ -366,6 +413,10 @@ #define INTEL_I860_MCHCFG 0x50 #define INTEL_I860_ERRSTS 0xc8 +/* intel i7505 registers */ +#define INTEL_I7505_MCHCFG 0x50 +#define INTEL_I7505_ERRSTS 0x42 + /* intel i810 registers */ #define I810_GMADDR 0x10 #define I810_MMADDR 0x14 @@ -466,13 +517,37 @@ #define NVIDIA_3_APBASE 0x50 #define NVIDIA_3_APLIMIT 0x54 -/* HP ZX1 SBA registers */ -#define HP_ZX1_CTRL 0x200 +/* NVIDIA x86-64 registers */ +#define NVIDIA_X86_64_0_APBASE 0x10 +#define NVIDIA_X86_64_1_APBASE1 0x50 +#define NVIDIA_X86_64_1_APLIMIT1 0x54 +#define NVIDIA_X86_64_1_APSIZE 0xa8 +#define NVIDIA_X86_64_1_APBASE2 0xd8 +#define NVIDIA_X86_64_1_APLIMIT2 0xdc + +/* HP ZX1 IOC registers */ #define HP_ZX1_IBASE 0x300 #define HP_ZX1_IMASK 0x308 #define HP_ZX1_PCOM 0x310 #define HP_ZX1_TCNFG 0x318 #define HP_ZX1_PDIR_BASE 0x320 -#define HP_ZX1_CACHE_FLUSH 0x428 + +/* HP ZX1 LBA registers */ +#define HP_ZX1_AGP_STATUS 0x64 +#define HP_ZX1_AGP_COMMAND 0x68 + +/* ATI register */ +#define ATI_APBASE 0x10 +#define ATI_GART_MMBASE_ADDR 0x14 +#define ATI_RS100_APSIZE 0xac +#define ATI_RS300_APSIZE 0xf8 +#define ATI_RS100_IG_AGPMODE 0xb0 +#define ATI_RS300_IG_AGPMODE 0xfc + +#define ATI_GART_FEATURE_ID 0x00 +#define ATI_GART_BASE 0x04 +#define ATI_GART_CACHE_SZBASE 0x08 +#define ATI_GART_CACHE_CNTRL 0x0c +#define ATI_GART_CACHE_ENTRY_CNTRL 0x10 #endif /* _AGP_BACKEND_PRIV_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/agp/agpgart_be.c linux-2.4.23-pre8/drivers/char/agp/agpgart_be.c --- linux-2.4.22/drivers/char/agp/agpgart_be.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/agp/agpgart_be.c 2003-10-22 22:47:51.000000000 +0000 @@ -49,9 +49,6 @@ #include #include #include -#ifdef CONFIG_AGP_NVIDIA - #include -#endif #include #include "agp.h" @@ -1427,51 +1424,101 @@ #endif /* CONFIG_AGP_I810 */ - #ifdef CONFIG_AGP_INTEL +#ifdef CONFIG_AGP_I460 -#endif /* CONFIG_AGP_I810 */ +/* BIOS configures the chipset so that one of two apbase registers are used */ +static u8 intel_i460_dynamic_apbase = 0x10; -#ifdef CONFIG_AGP_INTEL +/* 460 supports multiple GART page sizes, so GART pageshift is dynamic */ +static u8 intel_i460_pageshift = 12; +static u32 intel_i460_pagesize; -static int intel_fetch_size(void) -{ - int i; - u16 temp; - aper_size_info_16 *values; +/* Keep track of which is larger, chipset or kernel page size. */ +static u32 intel_i460_cpk = 1; - pci_read_config_word(agp_bridge.dev, INTEL_APSIZE, &temp); - values = A_SIZE_16(agp_bridge.aperture_sizes); +/* Structure for tracking partial use of 4MB GART pages */ +static u32 **i460_pg_detail = NULL; +static u32 *i460_pg_count = NULL; - for (i = 0; i < agp_bridge.num_aperture_sizes; i++) { - if (temp == values[i].size_value) { - agp_bridge.previous_size = - agp_bridge.current_size = (void *) (values + i); - agp_bridge.aperture_size_idx = i; - return values[i].size; - } - } +#define I460_CPAGES_PER_KPAGE (PAGE_SIZE >> intel_i460_pageshift) +#define I460_KPAGES_PER_CPAGE ((1 << intel_i460_pageshift) >> PAGE_SHIFT) - return 0; +#define I460_SRAM_IO_DISABLE (1 << 4) +#define I460_BAPBASE_ENABLE (1 << 3) +#define I460_AGPSIZ_MASK 0x7 +#define I460_4M_PS (1 << 1) + +#define log2(x) ffz(~(x)) + +static gatt_mask intel_i460_masks[] = +{ + { INTEL_I460_GATT_VALID | INTEL_I460_GATT_COHERENT, 0 } +}; + +static unsigned long intel_i460_mask_memory(unsigned long addr, int type) +{ + /* Make sure the returned address is a valid GATT entry */ + return (agp_bridge.masks[0].mask | (((addr & + ~((1 << intel_i460_pageshift) - 1)) & 0xffffff000) >> 12)); } +static unsigned long intel_i460_unmask_memory(unsigned long addr) +{ + /* Turn a GATT entry into a physical address */ + return ((addr & 0xffffff) << 12); +} -static int intel_8xx_fetch_size(void) +static int intel_i460_fetch_size(void) { int i; u8 temp; aper_size_info_8 *values; - pci_read_config_byte(agp_bridge.dev, INTEL_APSIZE, &temp); + /* Determine the GART page size */ + pci_read_config_byte(agp_bridge.dev, INTEL_I460_GXBCTL, &temp); + intel_i460_pageshift = (temp & I460_4M_PS) ? 22 : 12; + intel_i460_pagesize = 1UL << intel_i460_pageshift; - /* Intel 815 chipsets have a _weird_ APSIZE register with only - * one non-reserved bit, so mask the others out ... */ - if (agp_bridge.type == INTEL_I815) - temp &= (1 << 3); - values = A_SIZE_8(agp_bridge.aperture_sizes); + pci_read_config_byte(agp_bridge.dev, INTEL_I460_AGPSIZ, &temp); + + /* Exit now if the IO drivers for the GART SRAMS are turned off */ + if (temp & I460_SRAM_IO_DISABLE) { + printk(KERN_WARNING PFX "GART SRAMS disabled on 460GX chipset\n"); + printk(KERN_WARNING PFX "AGPGART operation not possible\n"); + return 0; + } + + /* Make sure we don't try to create an 2 ^ 23 entry GATT */ + if ((intel_i460_pageshift == 0) && ((temp & I460_AGPSIZ_MASK) == 4)) { + printk(KERN_WARNING PFX "We can't have a 32GB aperture with 4KB" + " GART pages\n"); + return 0; + } + + /* Determine the proper APBASE register */ + if (temp & I460_BAPBASE_ENABLE) + intel_i460_dynamic_apbase = INTEL_I460_BAPBASE; + else + intel_i460_dynamic_apbase = INTEL_I460_APBASE; + for (i = 0; i < agp_bridge.num_aperture_sizes; i++) { - if (temp == values[i].size_value) { + + /* + * Dynamically calculate the proper num_entries and page_order + * values for the define aperture sizes. Take care not to + * shift off the end of values[i].size. + */ + values[i].num_entries = (values[i].size << 8) >> + (intel_i460_pageshift - 12); + values[i].page_order = log2((sizeof(u32)*values[i].num_entries) + >> PAGE_SHIFT); + } + + for (i = 0; i < agp_bridge.num_aperture_sizes; i++) { + /* Neglect control bits when matching up size_value */ + if ((temp & I460_AGPSIZ_MASK) == values[i].size_value) { agp_bridge.previous_size = agp_bridge.current_size = (void *) (values + i); agp_bridge.aperture_size_idx = i; @@ -1482,217 +1529,606 @@ return 0; } -static void intel_tlbflush(agp_memory * mem) -{ - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2200); - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2280); -} - - -static void intel_8xx_tlbflush(agp_memory * mem) +/* There isn't anything to do here since 460 has no GART TLB. */ +static void intel_i460_tlb_flush(agp_memory * mem) { - u32 temp; - pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp); - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp & ~(1 << 7)); - pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp); - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp | (1 << 7)); + return; } - -static void intel_cleanup(void) +/* + * This utility function is needed to prevent corruption of the control bits + * which are stored along with the aperture size in 460's AGPSIZ register + */ +static void intel_i460_write_agpsiz(u8 size_value) { - u16 temp; - aper_size_info_16 *previous_size; + u8 temp; - previous_size = A_SIZE_16(agp_bridge.previous_size); - pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp); - pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, temp & ~(1 << 9)); - pci_write_config_word(agp_bridge.dev, INTEL_APSIZE, - previous_size->size_value); + pci_read_config_byte(agp_bridge.dev, INTEL_I460_AGPSIZ, &temp); + pci_write_config_byte(agp_bridge.dev, INTEL_I460_AGPSIZ, + ((temp & ~I460_AGPSIZ_MASK) | size_value)); } - -static void intel_8xx_cleanup(void) +static void intel_i460_cleanup(void) { - u16 temp; aper_size_info_8 *previous_size; previous_size = A_SIZE_8(agp_bridge.previous_size); - pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp); - pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, temp & ~(1 << 9)); - pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, - previous_size->size_value); + intel_i460_write_agpsiz(previous_size->size_value); + + if (intel_i460_cpk == 0) { + vfree(i460_pg_detail); + vfree(i460_pg_count); + } } -static int intel_configure(void) +/* Control bits for Out-Of-GART coherency and Burst Write Combining */ +#define I460_GXBCTL_OOG (1UL << 0) +#define I460_GXBCTL_BWC (1UL << 2) + +static int intel_i460_configure(void) { - u32 temp; - u16 temp2; - aper_size_info_16 *current_size; + union { + u32 small[2]; + u64 large; + } temp; + u8 scratch; + int i; - current_size = A_SIZE_16(agp_bridge.current_size); + aper_size_info_8 *current_size; - /* aperture size */ - pci_write_config_word(agp_bridge.dev, INTEL_APSIZE, - current_size->size_value); + temp.large = 0; - /* address to map to */ - pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); - agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + current_size = A_SIZE_8(agp_bridge.current_size); + intel_i460_write_agpsiz(current_size->size_value); - /* attbase - aperture base */ - pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, - agp_bridge.gatt_bus_addr); + /* + * Do the necessary rigmarole to read all eight bytes of APBASE. + * This has to be done since the AGP aperture can be above 4GB on + * 460 based systems. + */ + pci_read_config_dword(agp_bridge.dev, intel_i460_dynamic_apbase, + &(temp.small[0])); + pci_read_config_dword(agp_bridge.dev, intel_i460_dynamic_apbase + 4, + &(temp.small[1])); + + /* Clear BAR control bits */ + agp_bridge.gart_bus_addr = temp.large & ~((1UL << 3) - 1); + + pci_read_config_byte(agp_bridge.dev, INTEL_I460_GXBCTL, &scratch); + pci_write_config_byte(agp_bridge.dev, INTEL_I460_GXBCTL, + (scratch & 0x02) | I460_GXBCTL_OOG | I460_GXBCTL_BWC); + + /* + * Initialize partial allocation trackers if a GART page is bigger than + * a kernel page. + */ + if (I460_CPAGES_PER_KPAGE >= 1) { + intel_i460_cpk = 1; + } else { + intel_i460_cpk = 0; - /* agpctrl */ - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2280); + i460_pg_detail = (void *) vmalloc(sizeof(*i460_pg_detail) * + current_size->num_entries); + i460_pg_count = (void *) vmalloc(sizeof(*i460_pg_count) * + current_size->num_entries); + + for (i = 0; i < current_size->num_entries; i++) { + i460_pg_count[i] = 0; + i460_pg_detail[i] = NULL; + } + } - /* paccfg/nbxcfg */ - pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp2); - pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, - (temp2 & ~(1 << 10)) | (1 << 9)); - /* clear any possible error conditions */ - pci_write_config_byte(agp_bridge.dev, INTEL_ERRSTS + 1, 7); return 0; } -static int intel_815_configure(void) -{ - u32 temp, addr; - u8 temp2; - aper_size_info_8 *current_size; +static int intel_i460_create_gatt_table(void) { - current_size = A_SIZE_8(agp_bridge.current_size); + char *table; + int i; + int page_order; + int num_entries; + void *temp; + unsigned int read_back; - /* aperture size */ - pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, - current_size->size_value); + /* + * Load up the fixed address of the GART SRAMS which hold our + * GATT table. + */ + table = (char *) __va(INTEL_I460_ATTBASE); - /* address to map to */ - pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); - agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + temp = agp_bridge.current_size; + page_order = A_SIZE_8(temp)->page_order; + num_entries = A_SIZE_8(temp)->num_entries; - /* attbase - aperture base */ - /* the Intel 815 chipset spec. says that bits 29-31 in the - * ATTBASE register are reserved -> try not to write them */ - if (agp_bridge.gatt_bus_addr & INTEL_815_ATTBASE_MASK) - panic("gatt bus addr too high"); - pci_read_config_dword(agp_bridge.dev, INTEL_ATTBASE, &addr); - addr &= INTEL_815_ATTBASE_MASK; - addr |= agp_bridge.gatt_bus_addr; - pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, addr); + agp_bridge.gatt_table_real = (u32 *) table; + agp_bridge.gatt_table = ioremap_nocache(virt_to_phys(table), + (PAGE_SIZE * (1 << page_order))); + agp_bridge.gatt_bus_addr = virt_to_phys(agp_bridge.gatt_table_real); - /* agpctrl */ - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); + for (i = 0; i < num_entries; i++) { + agp_bridge.gatt_table[i] = 0; + } + + /* + * The 460 spec says we have to read the last location written to + * make sure that all writes have taken effect + */ + read_back = agp_bridge.gatt_table[i - 1]; - /* apcont */ - pci_read_config_byte(agp_bridge.dev, INTEL_815_APCONT, &temp2); - pci_write_config_byte(agp_bridge.dev, INTEL_815_APCONT, - temp2 | (1 << 1)); - /* clear any possible error conditions */ - /* Oddness : this chipset seems to have no ERRSTS register ! */ return 0; } -static void intel_820_tlbflush(agp_memory * mem) +static int intel_i460_free_gatt_table(void) { - return; -} + int num_entries; + int i; + void *temp; + unsigned int read_back; -static void intel_820_cleanup(void) -{ - u8 temp; - aper_size_info_8 *previous_size; + temp = agp_bridge.current_size; - previous_size = A_SIZE_8(agp_bridge.previous_size); - pci_read_config_byte(agp_bridge.dev, INTEL_I820_RDCR, &temp); - pci_write_config_byte(agp_bridge.dev, INTEL_I820_RDCR, - temp & ~(1 << 1)); - pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, - previous_size->size_value); + num_entries = A_SIZE_8(temp)->num_entries; + + for (i = 0; i < num_entries; i++) { + agp_bridge.gatt_table[i] = 0; + } + + /* + * The 460 spec says we have to read the last location written to + * make sure that all writes have taken effect + */ + read_back = agp_bridge.gatt_table[i - 1]; + + iounmap(agp_bridge.gatt_table); + + return 0; } +/* These functions are called when PAGE_SIZE exceeds the GART page size */ -static int intel_820_configure(void) +static int intel_i460_insert_memory_cpk(agp_memory * mem, + off_t pg_start, int type) { - u32 temp; - u8 temp2; - aper_size_info_8 *current_size; + int i, j, k, num_entries; + void *temp; + unsigned long paddr; + unsigned int read_back; - current_size = A_SIZE_8(agp_bridge.current_size); + /* + * The rest of the kernel will compute page offsets in terms of + * PAGE_SIZE. + */ + pg_start = I460_CPAGES_PER_KPAGE * pg_start; - /* aperture size */ - pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, - current_size->size_value); + temp = agp_bridge.current_size; + num_entries = A_SIZE_8(temp)->num_entries; - /* address to map to */ - pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); - agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + if ((pg_start + I460_CPAGES_PER_KPAGE * mem->page_count) > num_entries) { + printk(KERN_WARNING PFX "Looks like we're out of AGP memory\n"); + return -EINVAL; + } - /* attbase - aperture base */ - pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, - agp_bridge.gatt_bus_addr); + j = pg_start; + while (j < (pg_start + I460_CPAGES_PER_KPAGE * mem->page_count)) { + if (!PGE_EMPTY(agp_bridge.gatt_table[j])) { + return -EBUSY; + } + j++; + } - /* agpctrl */ - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); + for (i = 0, j = pg_start; i < mem->page_count; i++) { + + paddr = mem->memory[i]; + + for (k = 0; k < I460_CPAGES_PER_KPAGE; k++, j++, paddr += intel_i460_pagesize) + agp_bridge.gatt_table[j] = (unsigned int) + agp_bridge.mask_memory(paddr, mem->type); + } + + /* + * The 460 spec says we have to read the last location written to + * make sure that all writes have taken effect + */ + read_back = agp_bridge.gatt_table[j - 1]; - /* global enable aperture access */ - /* This flag is not accessed through MCHCFG register as in */ - /* i850 chipset. */ - pci_read_config_byte(agp_bridge.dev, INTEL_I820_RDCR, &temp2); - pci_write_config_byte(agp_bridge.dev, INTEL_I820_RDCR, - temp2 | (1 << 1)); - /* clear any possible AGP-related error conditions */ - pci_write_config_word(agp_bridge.dev, INTEL_I820_ERRSTS, 0x001c); return 0; } -static int intel_830mp_configure(void) +static int intel_i460_remove_memory_cpk(agp_memory * mem, off_t pg_start, + int type) { - u32 temp; - u16 temp2; - aper_size_info_8 *current_size; + int i; + unsigned int read_back; - current_size = A_SIZE_8(agp_bridge.current_size); + pg_start = I460_CPAGES_PER_KPAGE * pg_start; - /* aperture size */ - pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, - current_size->size_value); + for (i = pg_start; i < (pg_start + I460_CPAGES_PER_KPAGE * + mem->page_count); i++) + agp_bridge.gatt_table[i] = 0; - /* address to map to */ - pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); - agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + /* + * The 460 spec says we have to read the last location written to + * make sure that all writes have taken effect + */ + read_back = agp_bridge.gatt_table[i - 1]; - /* attbase - aperture base */ - pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, - agp_bridge.gatt_bus_addr); + return 0; +} - /* agpctrl */ - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); +/* + * These functions are called when the GART page size exceeds PAGE_SIZE. + * + * This situation is interesting since AGP memory allocations that are + * smaller than a single GART page are possible. The structures i460_pg_count + * and i460_pg_detail track partial allocation of the large GART pages to + * work around this issue. + * + * i460_pg_count[pg_num] tracks the number of kernel pages in use within + * GART page pg_num. i460_pg_detail[pg_num] is an array containing a + * psuedo-GART entry for each of the aforementioned kernel pages. The whole + * of i460_pg_detail is equivalent to a giant GATT with page size equal to + * that of the kernel. + */ - /* gmch */ - pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp2); - pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, - temp2 | (1 << 9)); - /* clear any possible AGP-related error conditions */ - pci_write_config_word(agp_bridge.dev, INTEL_I830_ERRSTS, 0x1c); - return 0; +static void *intel_i460_alloc_large_page(int pg_num) +{ + int i; + void *bp, *bp_end; + struct page *page; + + i460_pg_detail[pg_num] = (void *) vmalloc(sizeof(u32) * + I460_KPAGES_PER_CPAGE); + if (i460_pg_detail[pg_num] == NULL) { + printk(KERN_WARNING PFX "Out of memory, we're in trouble...\n"); + return NULL; + } + + for (i = 0; i < I460_KPAGES_PER_CPAGE; i++) + i460_pg_detail[pg_num][i] = 0; + + bp = (void *) __get_free_pages(GFP_KERNEL, + intel_i460_pageshift - PAGE_SHIFT); + if (bp == NULL) { + printk(KERN_WARNING PFX "Couldn't alloc 4M GART page...\n"); + return NULL; + } + + bp_end = bp + ((PAGE_SIZE * + (1 << (intel_i460_pageshift - PAGE_SHIFT))) - 1); + + for (page = virt_to_page(bp); page <= virt_to_page(bp_end); page++) { + atomic_inc(&page->count); + set_bit(PG_locked, &page->flags); + atomic_inc(&agp_bridge.current_memory_agp); + } + + return bp; } - +static void intel_i460_free_large_page(int pg_num, unsigned long addr) +{ + struct page *page; + void *bp, *bp_end; + + bp = (void *) __va(addr); + bp_end = bp + (PAGE_SIZE * + (1 << (intel_i460_pageshift - PAGE_SHIFT))); -static int intel_840_configure(void) + vfree(i460_pg_detail[pg_num]); + i460_pg_detail[pg_num] = NULL; + + for (page = virt_to_page(bp); page < virt_to_page(bp_end); page++) { + put_page(page); + UnlockPage(page); + atomic_dec(&agp_bridge.current_memory_agp); + } + + free_pages((unsigned long) bp, intel_i460_pageshift - PAGE_SHIFT); +} + +static int intel_i460_insert_memory_kpc(agp_memory * mem, + off_t pg_start, int type) +{ + int i, pg, start_pg, end_pg, start_offset, end_offset, idx; + int num_entries; + void *temp; + unsigned int read_back; + unsigned long paddr; + + temp = agp_bridge.current_size; + num_entries = A_SIZE_8(temp)->num_entries; + + /* Figure out what pg_start means in terms of our large GART pages */ + start_pg = pg_start / I460_KPAGES_PER_CPAGE; + start_offset = pg_start % I460_KPAGES_PER_CPAGE; + end_pg = (pg_start + mem->page_count - 1) / + I460_KPAGES_PER_CPAGE; + end_offset = (pg_start + mem->page_count - 1) % + I460_KPAGES_PER_CPAGE; + + if (end_pg > num_entries) { + printk(KERN_WARNING PFX "Looks like we're out of AGP memory\n"); + return -EINVAL; + } + + /* Check if the requested region of the aperture is free */ + for (pg = start_pg; pg <= end_pg; pg++) { + /* Allocate new GART pages if necessary */ + if (i460_pg_detail[pg] == NULL) { + temp = intel_i460_alloc_large_page(pg); + if (temp == NULL) + return -ENOMEM; + agp_bridge.gatt_table[pg] = agp_bridge.mask_memory( + (unsigned long) temp, 0); + read_back = agp_bridge.gatt_table[pg]; + } + + for (idx = ((pg == start_pg) ? start_offset : 0); + idx < ((pg == end_pg) ? (end_offset + 1) + : I460_KPAGES_PER_CPAGE); + idx++) { + if(i460_pg_detail[pg][idx] != 0) + return -EBUSY; + } + } + + for (pg = start_pg, i = 0; pg <= end_pg; pg++) { + paddr = intel_i460_unmask_memory(agp_bridge.gatt_table[pg]); + for (idx = ((pg == start_pg) ? start_offset : 0); + idx < ((pg == end_pg) ? (end_offset + 1) + : I460_KPAGES_PER_CPAGE); + idx++, i++) { + mem->memory[i] = paddr + (idx * PAGE_SIZE); + i460_pg_detail[pg][idx] = + agp_bridge.mask_memory(mem->memory[i], mem->type); + + i460_pg_count[pg]++; + } + } + + return 0; +} + +static int intel_i460_remove_memory_kpc(agp_memory * mem, + off_t pg_start, int type) +{ + int i, pg, start_pg, end_pg, start_offset, end_offset, idx; + int num_entries; + void *temp; + unsigned int read_back; + unsigned long paddr; + + temp = agp_bridge.current_size; + num_entries = A_SIZE_8(temp)->num_entries; + + /* Figure out what pg_start means in terms of our large GART pages */ + start_pg = pg_start / I460_KPAGES_PER_CPAGE; + start_offset = pg_start % I460_KPAGES_PER_CPAGE; + end_pg = (pg_start + mem->page_count - 1) / + I460_KPAGES_PER_CPAGE; + end_offset = (pg_start + mem->page_count - 1) % + I460_KPAGES_PER_CPAGE; + + for (i = 0, pg = start_pg; pg <= end_pg; pg++) { + for (idx = ((pg == start_pg) ? start_offset : 0); + idx < ((pg == end_pg) ? (end_offset + 1) + : I460_KPAGES_PER_CPAGE); + idx++, i++) { + mem->memory[i] = 0; + i460_pg_detail[pg][idx] = 0; + i460_pg_count[pg]--; + } + + /* Free GART pages if they are unused */ + if (i460_pg_count[pg] == 0) { + paddr = intel_i460_unmask_memory(agp_bridge.gatt_table[pg]); + agp_bridge.gatt_table[pg] = agp_bridge.scratch_page; + read_back = agp_bridge.gatt_table[pg]; + + intel_i460_free_large_page(pg, paddr); + } + } + + return 0; +} + +/* Dummy routines to call the approriate {cpk,kpc} function */ + +static int intel_i460_insert_memory(agp_memory * mem, + off_t pg_start, int type) +{ + if (intel_i460_cpk) + return intel_i460_insert_memory_cpk(mem, pg_start, type); + else + return intel_i460_insert_memory_kpc(mem, pg_start, type); +} + +static int intel_i460_remove_memory(agp_memory * mem, + off_t pg_start, int type) +{ + if (intel_i460_cpk) + return intel_i460_remove_memory_cpk(mem, pg_start, type); + else + return intel_i460_remove_memory_kpc(mem, pg_start, type); +} + +/* + * If the kernel page size is smaller that the chipset page size, we don't + * want to allocate memory until we know where it is to be bound in the + * aperture (a multi-kernel-page alloc might fit inside of an already + * allocated GART page). Consequently, don't allocate or free anything + * if i460_cpk (meaning chipset pages per kernel page) isn't set. + * + * Let's just hope nobody counts on the allocated AGP memory being there + * before bind time (I don't think current drivers do)... + */ +static unsigned long intel_i460_alloc_page(void) +{ + if (intel_i460_cpk) + return agp_generic_alloc_page(); + + /* Returning NULL would cause problems */ + return ((unsigned long) ~0UL); +} + +static void intel_i460_destroy_page(unsigned long page) +{ + if (intel_i460_cpk) + agp_generic_destroy_page(page); +} + +static aper_size_info_8 intel_i460_sizes[3] = +{ + /* + * The 32GB aperture is only available with a 4M GART page size. + * Due to the dynamic GART page size, we can't figure out page_order + * or num_entries until runtime. + */ + {32768, 0, 0, 4}, + {1024, 0, 0, 2}, + {256, 0, 0, 1} +}; + +static int __init intel_i460_setup(struct pci_dev *pdev) +{ + agp_bridge.masks = intel_i460_masks; + agp_bridge.aperture_sizes = (void *) intel_i460_sizes; + agp_bridge.size_type = U8_APER_SIZE; + agp_bridge.num_aperture_sizes = 3; + agp_bridge.dev_private_data = NULL; + agp_bridge.needs_scratch_page = FALSE; + agp_bridge.configure = intel_i460_configure; + agp_bridge.fetch_size = intel_i460_fetch_size; + agp_bridge.cleanup = intel_i460_cleanup; + agp_bridge.tlb_flush = intel_i460_tlb_flush; + agp_bridge.mask_memory = intel_i460_mask_memory; + agp_bridge.agp_enable = agp_generic_agp_enable; + agp_bridge.cache_flush = global_cache_flush; + agp_bridge.create_gatt_table = intel_i460_create_gatt_table; + agp_bridge.free_gatt_table = intel_i460_free_gatt_table; + agp_bridge.insert_memory = intel_i460_insert_memory; + agp_bridge.remove_memory = intel_i460_remove_memory; + agp_bridge.alloc_by_type = agp_generic_alloc_by_type; + agp_bridge.free_by_type = agp_generic_free_by_type; + agp_bridge.agp_alloc_page = intel_i460_alloc_page; + agp_bridge.agp_destroy_page = intel_i460_destroy_page; + agp_bridge.suspend = agp_generic_suspend; + agp_bridge.resume = agp_generic_resume; + agp_bridge.cant_use_aperture = 1; + + return 0; + + (void) pdev; /* unused */ +} + +#endif /* CONFIG_AGP_I460 */ + +#ifdef CONFIG_AGP_INTEL + +static int intel_fetch_size(void) +{ + int i; + u16 temp; + aper_size_info_16 *values; + + pci_read_config_word(agp_bridge.dev, INTEL_APSIZE, &temp); + values = A_SIZE_16(agp_bridge.aperture_sizes); + + for (i = 0; i < agp_bridge.num_aperture_sizes; i++) { + if (temp == values[i].size_value) { + agp_bridge.previous_size = + agp_bridge.current_size = (void *) (values + i); + agp_bridge.aperture_size_idx = i; + return values[i].size; + } + } + + return 0; +} + + +static int intel_8xx_fetch_size(void) +{ + int i; + u8 temp; + aper_size_info_8 *values; + + pci_read_config_byte(agp_bridge.dev, INTEL_APSIZE, &temp); + + /* Intel 815 chipsets have a _weird_ APSIZE register with only + * one non-reserved bit, so mask the others out ... */ + if (agp_bridge.type == INTEL_I815) + temp &= (1 << 3); + + values = A_SIZE_8(agp_bridge.aperture_sizes); + + for (i = 0; i < agp_bridge.num_aperture_sizes; i++) { + if (temp == values[i].size_value) { + agp_bridge.previous_size = + agp_bridge.current_size = (void *) (values + i); + agp_bridge.aperture_size_idx = i; + return values[i].size; + } + } + + return 0; +} + +static void intel_tlbflush(agp_memory * mem) +{ + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2200); + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2280); +} + + +static void intel_8xx_tlbflush(agp_memory * mem) +{ + u32 temp; + pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp); + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp & ~(1 << 7)); + pci_read_config_dword(agp_bridge.dev, INTEL_AGPCTRL, &temp); + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, temp | (1 << 7)); +} + + +static void intel_cleanup(void) +{ + u16 temp; + aper_size_info_16 *previous_size; + + previous_size = A_SIZE_16(agp_bridge.previous_size); + pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp); + pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, temp & ~(1 << 9)); + pci_write_config_word(agp_bridge.dev, INTEL_APSIZE, + previous_size->size_value); +} + + +static void intel_8xx_cleanup(void) +{ + u16 temp; + aper_size_info_8 *previous_size; + + previous_size = A_SIZE_8(agp_bridge.previous_size); + pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp); + pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, temp & ~(1 << 9)); + pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, + previous_size->size_value); +} + + +static int intel_configure(void) { u32 temp; u16 temp2; - aper_size_info_8 *current_size; + aper_size_info_16 *current_size; - current_size = A_SIZE_8(agp_bridge.current_size); + current_size = A_SIZE_16(agp_bridge.current_size); /* aperture size */ - pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, - current_size->size_value); + pci_write_config_word(agp_bridge.dev, INTEL_APSIZE, + current_size->size_value); /* address to map to */ pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); @@ -1700,23 +2136,23 @@ /* attbase - aperture base */ pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, - agp_bridge.gatt_bus_addr); + agp_bridge.gatt_bus_addr); /* agpctrl */ - pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x2280); - /* mcgcfg */ - pci_read_config_word(agp_bridge.dev, INTEL_I840_MCHCFG, &temp2); - pci_write_config_word(agp_bridge.dev, INTEL_I840_MCHCFG, - temp2 | (1 << 9)); + /* paccfg/nbxcfg */ + pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp2); + pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, + (temp2 & ~(1 << 10)) | (1 << 9)); /* clear any possible error conditions */ - pci_write_config_word(agp_bridge.dev, INTEL_I840_ERRSTS, 0xc000); + pci_write_config_byte(agp_bridge.dev, INTEL_ERRSTS + 1, 7); return 0; } -static int intel_845_configure(void) +static int intel_815_configure(void) { - u32 temp; + u32 temp, addr; u8 temp2; aper_size_info_8 *current_size; @@ -1731,31 +2167,50 @@ agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); /* attbase - aperture base */ - pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, - agp_bridge.gatt_bus_addr); + /* the Intel 815 chipset spec. says that bits 29-31 in the + * ATTBASE register are reserved -> try not to write them */ + if (agp_bridge.gatt_bus_addr & INTEL_815_ATTBASE_MASK) + panic("gatt bus addr too high"); + pci_read_config_dword(agp_bridge.dev, INTEL_ATTBASE, &addr); + addr &= INTEL_815_ATTBASE_MASK; + addr |= agp_bridge.gatt_bus_addr; + pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, addr); /* agpctrl */ pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); - /* agpm */ - pci_read_config_byte(agp_bridge.dev, INTEL_I845_AGPM, &temp2); - pci_write_config_byte(agp_bridge.dev, INTEL_I845_AGPM, + /* apcont */ + pci_read_config_byte(agp_bridge.dev, INTEL_815_APCONT, &temp2); + pci_write_config_byte(agp_bridge.dev, INTEL_815_APCONT, temp2 | (1 << 1)); /* clear any possible error conditions */ - pci_write_config_word(agp_bridge.dev, INTEL_I845_ERRSTS, 0x001c); + /* Oddness : this chipset seems to have no ERRSTS register ! */ return 0; } -static void intel_845_resume(void) +static void intel_820_tlbflush(agp_memory * mem) { - intel_845_configure(); + return; } +static void intel_820_cleanup(void) +{ + u8 temp; + aper_size_info_8 *previous_size; -static int intel_850_configure(void) + previous_size = A_SIZE_8(agp_bridge.previous_size); + pci_read_config_byte(agp_bridge.dev, INTEL_I820_RDCR, &temp); + pci_write_config_byte(agp_bridge.dev, INTEL_I820_RDCR, + temp & ~(1 << 1)); + pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, + previous_size->size_value); +} + + +static int intel_820_configure(void) { u32 temp; - u16 temp2; + u8 temp2; aper_size_info_8 *current_size; current_size = A_SIZE_8(agp_bridge.current_size); @@ -1775,12 +2230,150 @@ /* agpctrl */ pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); - /* mcgcfg */ - pci_read_config_word(agp_bridge.dev, INTEL_I850_MCHCFG, &temp2); - pci_write_config_word(agp_bridge.dev, INTEL_I850_MCHCFG, - temp2 | (1 << 9)); - /* clear any possible AGP-related error conditions */ - pci_write_config_word(agp_bridge.dev, INTEL_I850_ERRSTS, 0x001c); + /* global enable aperture access */ + /* This flag is not accessed through MCHCFG register as in */ + /* i850 chipset. */ + pci_read_config_byte(agp_bridge.dev, INTEL_I820_RDCR, &temp2); + pci_write_config_byte(agp_bridge.dev, INTEL_I820_RDCR, + temp2 | (1 << 1)); + /* clear any possible AGP-related error conditions */ + pci_write_config_word(agp_bridge.dev, INTEL_I820_ERRSTS, 0x001c); + return 0; +} + +static int intel_830mp_configure(void) +{ + u32 temp; + u16 temp2; + aper_size_info_8 *current_size; + + current_size = A_SIZE_8(agp_bridge.current_size); + + /* aperture size */ + pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, + current_size->size_value); + + /* address to map to */ + pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); + agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + + /* attbase - aperture base */ + pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, + agp_bridge.gatt_bus_addr); + + /* agpctrl */ + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); + + /* gmch */ + pci_read_config_word(agp_bridge.dev, INTEL_NBXCFG, &temp2); + pci_write_config_word(agp_bridge.dev, INTEL_NBXCFG, + temp2 | (1 << 9)); + /* clear any possible AGP-related error conditions */ + pci_write_config_word(agp_bridge.dev, INTEL_I830_ERRSTS, 0x1c); + return 0; +} + + + +static int intel_840_configure(void) +{ + u32 temp; + u16 temp2; + aper_size_info_8 *current_size; + + current_size = A_SIZE_8(agp_bridge.current_size); + + /* aperture size */ + pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, + current_size->size_value); + + /* address to map to */ + pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); + agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + + /* attbase - aperture base */ + pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, + agp_bridge.gatt_bus_addr); + + /* agpctrl */ + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); + + /* mcgcfg */ + pci_read_config_word(agp_bridge.dev, INTEL_I840_MCHCFG, &temp2); + pci_write_config_word(agp_bridge.dev, INTEL_I840_MCHCFG, + temp2 | (1 << 9)); + /* clear any possible error conditions */ + pci_write_config_word(agp_bridge.dev, INTEL_I840_ERRSTS, 0xc000); + return 0; +} + +static int intel_845_configure(void) +{ + u32 temp; + u8 temp2; + aper_size_info_8 *current_size; + + current_size = A_SIZE_8(agp_bridge.current_size); + + /* aperture size */ + pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, + current_size->size_value); + + /* address to map to */ + pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); + agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + + /* attbase - aperture base */ + pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, + agp_bridge.gatt_bus_addr); + + /* agpctrl */ + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); + + /* agpm */ + pci_read_config_byte(agp_bridge.dev, INTEL_I845_AGPM, &temp2); + pci_write_config_byte(agp_bridge.dev, INTEL_I845_AGPM, + temp2 | (1 << 1)); + /* clear any possible error conditions */ + pci_write_config_word(agp_bridge.dev, INTEL_I845_ERRSTS, 0x001c); + return 0; +} + +static void intel_845_resume(void) +{ + intel_845_configure(); +} + + +static int intel_850_configure(void) +{ + u32 temp; + u16 temp2; + aper_size_info_8 *current_size; + + current_size = A_SIZE_8(agp_bridge.current_size); + + /* aperture size */ + pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, + current_size->size_value); + + /* address to map to */ + pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); + agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + + /* attbase - aperture base */ + pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, + agp_bridge.gatt_bus_addr); + + /* agpctrl */ + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); + + /* mcgcfg */ + pci_read_config_word(agp_bridge.dev, INTEL_I850_MCHCFG, &temp2); + pci_write_config_word(agp_bridge.dev, INTEL_I850_MCHCFG, + temp2 | (1 << 9)); + /* clear any possible AGP-related error conditions */ + pci_write_config_word(agp_bridge.dev, INTEL_I850_ERRSTS, 0x001c); return 0; } @@ -1817,6 +2410,37 @@ } +static int intel_7505_configure(void) +{ + u32 temp; + u16 temp2; + aper_size_info_8 *current_size; + + current_size = A_SIZE_8(agp_bridge.current_size); + + /* aperture size */ + pci_write_config_byte(agp_bridge.dev, INTEL_APSIZE, + current_size->size_value); + + /* address to map to */ + pci_read_config_dword(agp_bridge.dev, INTEL_APBASE, &temp); + agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + + /* attbase - aperture base */ + pci_write_config_dword(agp_bridge.dev, INTEL_ATTBASE, + agp_bridge.gatt_bus_addr); + + /* agpctrl */ + pci_write_config_dword(agp_bridge.dev, INTEL_AGPCTRL, 0x0000); + + /* mcgcfg */ + pci_read_config_word(agp_bridge.dev, INTEL_I7505_MCHCFG, &temp2); + pci_write_config_word(agp_bridge.dev, INTEL_I7505_MCHCFG, + temp2 | (1 << 9)); + return 0; +} + + static unsigned long intel_mask_memory(unsigned long addr, int type) { /* Memory type is ignored */ @@ -2126,6 +2750,38 @@ (void) pdev; /* unused */ } +static int __init intel_7505_setup (struct pci_dev *pdev) +{ + agp_bridge.masks = intel_generic_masks; + agp_bridge.aperture_sizes = (void *) intel_8xx_sizes; + agp_bridge.size_type = U8_APER_SIZE; + agp_bridge.num_aperture_sizes = 7; + agp_bridge.dev_private_data = NULL; + agp_bridge.needs_scratch_page = FALSE; + agp_bridge.configure = intel_7505_configure; + agp_bridge.fetch_size = intel_8xx_fetch_size; + agp_bridge.cleanup = intel_8xx_cleanup; + agp_bridge.tlb_flush = intel_8xx_tlbflush; + agp_bridge.mask_memory = intel_mask_memory; + agp_bridge.agp_enable = agp_generic_agp_enable; + agp_bridge.cache_flush = global_cache_flush; + agp_bridge.create_gatt_table = agp_generic_create_gatt_table; + agp_bridge.free_gatt_table = agp_generic_free_gatt_table; + agp_bridge.insert_memory = agp_generic_insert_memory; + agp_bridge.remove_memory = agp_generic_remove_memory; + agp_bridge.alloc_by_type = agp_generic_alloc_by_type; + agp_bridge.free_by_type = agp_generic_free_by_type; + agp_bridge.agp_alloc_page = agp_generic_alloc_page; + agp_bridge.agp_destroy_page = agp_generic_destroy_page; + agp_bridge.suspend = agp_generic_suspend; + agp_bridge.resume = agp_generic_resume; + agp_bridge.cant_use_aperture = 0; + + return 0; + + (void) pdev; /* unused */ +} + #endif /* CONFIG_AGP_INTEL */ #ifdef CONFIG_AGP_VIA @@ -2744,38 +3400,11 @@ #endif /* CONFIG_AGP_AMD */ -#ifdef CONFIG_AGP_AMD_8151 +#ifdef CONFIG_AGP_AMD_K8 /* Begin AMD-8151 support */ -static u_int64_t pci_read64 (struct pci_dev *dev, int reg) -{ - union { - u64 full; - struct { - u32 high; - u32 low; - } split; - } tmp; - pci_read_config_dword(dev, reg, &tmp.split.high); - pci_read_config_dword(dev, reg+4, &tmp.split.low); - return tmp.full; -} - -static void pci_write64 (struct pci_dev *dev, int reg, u64 value) -{ - union { - u64 full; - struct { - u32 high; - u32 low; - } split; - } tmp; - tmp.full = value; - pci_write_config_dword(dev, reg, tmp.split.high); - pci_write_config_dword(dev, reg+4, tmp.split.low); -} - +/* This is misnamed. It is really a generic AMD K8 Northbridge AMD driver. */ static int x86_64_insert_memory(agp_memory * mem, off_t pg_start, int type) { @@ -2783,7 +3412,6 @@ void *temp; long tmp; u32 pte; - u64 addr; temp = agp_bridge.current_size; @@ -2813,9 +3441,8 @@ } for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { - addr = agp_bridge.mask_memory(mem->memory[i], mem->type); + tmp = agp_bridge.mask_memory(mem->memory[i], mem->type); - tmp = addr; BUG_ON(tmp & 0xffffff0000000ffc); pte = (tmp & 0x000000ff00000000) >> 28; pte |=(tmp & 0x00000000fffff000); @@ -2953,10 +3580,7 @@ static int amd_8151_configure(void) { - struct pci_dev *dev, *hammer=NULL; - int current_size; - int tmp, tmp2, i; - u64 aperbar; + struct pci_dev *dev; unsigned long gatt_bus = virt_to_phys(agp_bridge.gatt_table_real); /* Configure AGP regs in each x86-64 host bridge. */ @@ -2965,54 +3589,8 @@ PCI_FUNC(dev->devfn)==3 && PCI_SLOT(dev->devfn)>=24 && PCI_SLOT(dev->devfn)<=31) { agp_bridge.gart_bus_addr = amd_x86_64_configure(dev,gatt_bus); - hammer = dev; - - /* - * TODO: Cache pci_dev's of x86-64's in private struct to save us - * having to scan the pci list each time. - */ - } - } - - if (hammer == NULL) { - return -ENODEV; } - - /* Shadow x86-64 registers into 8151 registers. */ - - dev = agp_bridge.dev; - if (!dev) - return -ENODEV; - - current_size = amd_x86_64_fetch_size(); - - pci_read_config_dword(dev, AMD_8151_APERTURESIZE, &tmp); - tmp &= ~(0xfff); - - /* translate x86-64 size bits to 8151 size bits*/ - for (i=0 ; i<7; i++) { - if (amd_8151_sizes[i].size == current_size) - tmp |= (amd_8151_sizes[i].size_value) << 3; } - pci_write_config_dword(dev, AMD_8151_APERTURESIZE, tmp); - - pci_read_config_dword (hammer, AMD_X86_64_GARTAPERTUREBASE, &tmp); - aperbar = pci_read64 (dev, AMD_8151_VMAPERTURE); - aperbar |= (tmp & 0x7fff) <<25; - aperbar &= 0x000000ffffffffff; - aperbar |= 1<<2; /* This address is a 64bit ptr FIXME: Make conditional in 32bit mode */ - pci_write64 (dev, AMD_8151_VMAPERTURE, aperbar); - - pci_read_config_dword(dev, AMD_8151_AGP_CTL , &tmp); - tmp &= ~(AMD_8151_GTLBEN | AMD_8151_APEREN); - - pci_read_config_dword(hammer, AMD_X86_64_GARTAPERTURECTL, &tmp2); - if (tmp2 & AMD_X86_64_GARTEN) - tmp |= AMD_8151_APEREN; - // FIXME: bit 7 of AMD_8151_AGP_CTL (GTLBEN) must be copied if set. - // But where is it set ? - pci_write_config_dword(dev, AMD_8151_AGP_CTL, tmp); - return 0; } @@ -3031,15 +3609,6 @@ tmp &= ~(AMD_X86_64_GARTEN); pci_write_config_dword (dev, AMD_X86_64_GARTAPERTURECTL, tmp); } - - /* Now shadow the disable in the 8151 */ - if (dev->vendor == PCI_VENDOR_ID_AMD && - dev->device == PCI_DEVICE_ID_AMD_8151_0) { - - pci_read_config_dword (dev, AMD_8151_AGP_CTL, &tmp); - tmp &= ~(AMD_8151_APEREN); - pci_write_config_dword (dev, AMD_8151_AGP_CTL, tmp); - } } } @@ -3053,7 +3622,7 @@ static gatt_mask amd_8151_masks[] = { - {0x00000001, 0} + {0, 0} }; @@ -3088,7 +3657,7 @@ printk (KERN_INFO "AGP: Found AGPv3 capable device at %d:%d:%d\n", device->bus->number, PCI_FUNC(device->devfn), PCI_SLOT(device->devfn)); } else { - printk (KERN_INFO "AGP: Meh. version %x AGP device found.\n", scratch); + printk (KERN_INFO "AGP: Version %x AGP device found.\n", scratch); } } } @@ -3207,28 +3776,186 @@ (void) pdev; /* unused */ } -#endif /* CONFIG_AGP_AMD_8151 */ +/* NVIDIA x86-64 chipset support */ + -#ifdef CONFIG_AGP_ALI +static struct _nvidia_x86_64_private { + struct pci_dev *dev_1; +} nvidia_x86_64_private; -static int ali_fetch_size(void) + +static aper_size_info_32 nvidia_x86_64_sizes[5] = { - int i; - u32 temp; - aper_size_info_32 *values; + {512, 131072, 7, 0x00000000 }, + {256, 65536, 6, 0x00000008 }, + {128, 32768, 5, 0x0000000C }, + {64, 16384, 4, 0x0000000E }, + {32, 8192, 3, 0x0000000F } +}; - pci_read_config_dword(agp_bridge.dev, ALI_ATTBASE, &temp); - temp &= ~(0xfffffff0); - values = A_SIZE_32(agp_bridge.aperture_sizes); - for (i = 0; i < agp_bridge.num_aperture_sizes; i++) { - if (temp == values[i].size_value) { - agp_bridge.previous_size = - agp_bridge.current_size = (void *) (values + i); - agp_bridge.aperture_size_idx = i; - return values[i].size; - } - } +static int nvidia_x86_64_configure(void) +{ + struct pci_dev *dev, *hammer=NULL; + int i, current_size; + u32 tmp, apbase, apbar, aplimit; + unsigned long gatt_bus = virt_to_phys(agp_bridge.gatt_table_real); + + if (!agp_bridge.dev) + return -ENODEV; + + /* configure AGP regs in each x86-64 host bridge */ + pci_for_each_dev(dev) { + if (dev->bus->number==0 && + PCI_FUNC(dev->devfn)==3 && + PCI_SLOT(dev->devfn)>=24 && PCI_SLOT(dev->devfn)<=31) { + agp_bridge.gart_bus_addr = amd_x86_64_configure(dev,gatt_bus); + hammer = dev; + } + } + if (hammer == NULL) + return -ENODEV; + + /* translate x86-64 aperture size to NVIDIA aperture size */ + current_size = amd_x86_64_fetch_size(); + for (i = 0 ; i < agp_bridge.num_aperture_sizes; i++) { + if (nvidia_x86_64_sizes[i].size == current_size) + break; + } + /* if x86-64 size does not match any NVIDIA size, exit here */ + if (i == agp_bridge.num_aperture_sizes) + return -ENODEV; + pci_read_config_dword(nvidia_x86_64_private.dev_1, NVIDIA_X86_64_1_APSIZE, &tmp); + tmp &= ~(0xf); + tmp |= nvidia_x86_64_sizes[i].size_value; + pci_write_config_dword(nvidia_x86_64_private.dev_1, NVIDIA_X86_64_1_APSIZE, tmp); + + /* shadow x86-64 registers into NVIDIA registers */ + pci_read_config_dword (hammer, AMD_X86_64_GARTAPERTUREBASE, &apbase); + /* if x86-64 aperture base is beyond 4G, exit here */ + if ( (apbase & 0x7fff) >> (32 - 25) ) + return -ENODEV; + apbase = (apbase & 0x7fff) << 25; + + /* AK: most likely the shadow into the primary device is not needed */ + + pci_read_config_dword(agp_bridge.dev, NVIDIA_X86_64_0_APBASE, &apbar); + apbar &= ~PCI_BASE_ADDRESS_MEM_MASK; + apbar |= apbase; + pci_write_config_dword(agp_bridge.dev, NVIDIA_X86_64_0_APBASE, apbar); + + /* Shadow into secondary device looks dubious, but we keep it for now. + If these two could be dropped then the NForce3 code path could + be just folded into the generic functions above. */ + + aplimit = apbase + (current_size * 1024 * 1024) - 1; + pci_write_config_dword(nvidia_x86_64_private.dev_1, NVIDIA_X86_64_1_APBASE1, apbase); + pci_write_config_dword(nvidia_x86_64_private.dev_1, NVIDIA_X86_64_1_APLIMIT1, aplimit); + pci_write_config_dword(nvidia_x86_64_private.dev_1, NVIDIA_X86_64_1_APBASE2, apbase); + pci_write_config_dword(nvidia_x86_64_private.dev_1, NVIDIA_X86_64_1_APLIMIT2, aplimit); + + /* Original driver updated the IORR here, but AMD documentation + explicitely discourages this for something already covered by the GART. */ + + return 0; +} + + +static void nvidia_x86_64_cleanup(void) +{ + struct pci_dev *dev; + u32 tmp; + + pci_for_each_dev(dev) { + /* disable gart translation */ + if (dev->bus->number==0 && PCI_FUNC(dev->devfn)==3 && + (PCI_SLOT(dev->devfn) >=24) && (PCI_SLOT(dev->devfn) <=31)) { + + pci_read_config_dword (dev, AMD_X86_64_GARTAPERTURECTL, &tmp); + tmp &= ~(AMD_X86_64_GARTEN); + pci_write_config_dword (dev, AMD_X86_64_GARTAPERTURECTL, tmp); + } + } +} + + +static unsigned long nvidia_x86_64_mask_memory(unsigned long addr, int type) +{ + return addr | agp_bridge.masks[0].mask; +} + + +static gatt_mask nvidia_x86_64_masks[] = +{ + {0x00000001, 0} +}; + + +static int __init nvidia_x86_64_setup (struct pci_dev *pdev) +{ + nvidia_x86_64_private.dev_1 = + pci_find_slot((unsigned int)pdev->bus->number, PCI_DEVFN(11, 0)); + + if (nvidia_x86_64_private.dev_1 == NULL) { + printk(KERN_INFO PFX "agpgart: Detected an NVIDIA " + "nForce3 chipset, but could not find " + "the secondary device.\n"); + agp_bridge.type = NOT_SUPPORTED; + return -ENODEV; + } + + agp_bridge.masks = nvidia_x86_64_masks; + agp_bridge.aperture_sizes = (void *) nvidia_x86_64_sizes; + agp_bridge.size_type = U32_APER_SIZE; + agp_bridge.num_aperture_sizes = 5; + agp_bridge.dev_private_data = NULL; + agp_bridge.needs_scratch_page = FALSE; + agp_bridge.configure = nvidia_x86_64_configure; + agp_bridge.fetch_size = amd_x86_64_fetch_size; + agp_bridge.cleanup = nvidia_x86_64_cleanup; + agp_bridge.tlb_flush = amd_x86_64_tlbflush; + agp_bridge.mask_memory = nvidia_x86_64_mask_memory; + agp_bridge.agp_enable = agp_x86_64_agp_enable; + agp_bridge.cache_flush = global_cache_flush; + agp_bridge.create_gatt_table = agp_generic_create_gatt_table; + agp_bridge.free_gatt_table = agp_generic_free_gatt_table; + agp_bridge.insert_memory = x86_64_insert_memory; + agp_bridge.remove_memory = agp_generic_remove_memory; + agp_bridge.alloc_by_type = agp_generic_alloc_by_type; + agp_bridge.free_by_type = agp_generic_free_by_type; + agp_bridge.agp_alloc_page = agp_generic_alloc_page; + agp_bridge.agp_destroy_page = agp_generic_destroy_page; + agp_bridge.suspend = agp_generic_suspend; + agp_bridge.resume = agp_generic_resume; + agp_bridge.cant_use_aperture = 0; + + return 0; + + (void) pdev; /* unused */ +} + +#endif /* CONFIG_AGP_AMD_K8 */ + +#ifdef CONFIG_AGP_ALI + +static int ali_fetch_size(void) +{ + int i; + u32 temp; + aper_size_info_32 *values; + + pci_read_config_dword(agp_bridge.dev, ALI_ATTBASE, &temp); + temp &= ~(0xfffffff0); + values = A_SIZE_32(agp_bridge.aperture_sizes); + + for (i = 0; i < agp_bridge.num_aperture_sizes; i++) { + if (temp == values[i].size_value) { + agp_bridge.previous_size = + agp_bridge.current_size = (void *) (values + i); + agp_bridge.aperture_size_idx = i; + return values[i].size; + } + } return 0; } @@ -4082,52 +4809,6 @@ return 0; } -#define SYSCFG 0xC0010010 -#define IORR_BASE0 0xC0010016 -#define IORR_MASK0 0xC0010017 -#define AMD_K7_NUM_IORR 2 - -static int nvidia_init_iorr(u32 base, u32 size) -{ - u32 base_hi, base_lo; - u32 mask_hi, mask_lo; - u32 sys_hi, sys_lo; - u32 iorr_addr, free_iorr_addr; - - /* Find the iorr that is already used for the base */ - /* If not found, determine the uppermost available iorr */ - free_iorr_addr = AMD_K7_NUM_IORR; - for(iorr_addr = 0; iorr_addr < AMD_K7_NUM_IORR; iorr_addr++) { - rdmsr(IORR_BASE0 + 2 * iorr_addr, base_lo, base_hi); - rdmsr(IORR_MASK0 + 2 * iorr_addr, mask_lo, mask_hi); - - if ((base_lo & 0xfffff000) == (base & 0xfffff000)) - break; - - if ((mask_lo & 0x00000800) == 0) - free_iorr_addr = iorr_addr; - } - - if (iorr_addr >= AMD_K7_NUM_IORR) { - iorr_addr = free_iorr_addr; - if (iorr_addr >= AMD_K7_NUM_IORR) - return -EINVAL; - } - - base_hi = 0x0; - base_lo = (base & ~0xfff) | 0x18; - mask_hi = 0xf; - mask_lo = ((~(size - 1)) & 0xfffff000) | 0x800; - wrmsr(IORR_BASE0 + 2 * iorr_addr, base_lo, base_hi); - wrmsr(IORR_MASK0 + 2 * iorr_addr, mask_lo, mask_hi); - - rdmsr(SYSCFG, sys_lo, sys_hi); - sys_lo |= 0x00100000; - wrmsr(SYSCFG, sys_lo, sys_hi); - - return 0; -} - static int nvidia_configure(void) { int i, rc, num_dirs; @@ -4141,7 +4822,7 @@ pci_write_config_byte(agp_bridge.dev, NVIDIA_0_APSIZE, current_size->size_value); - /* address to map to */ + /* address to map to */ pci_read_config_dword(agp_bridge.dev, NVIDIA_0_APBASE, &apbase); apbase &= PCI_BASE_ADDRESS_MEM_MASK; agp_bridge.gart_bus_addr = apbase; @@ -4150,8 +4831,9 @@ pci_write_config_dword(nvidia_private.dev_2, NVIDIA_2_APLIMIT, aplimit); pci_write_config_dword(nvidia_private.dev_3, NVIDIA_3_APBASE, apbase); pci_write_config_dword(nvidia_private.dev_3, NVIDIA_3_APLIMIT, aplimit); - if (0 != (rc = nvidia_init_iorr(apbase, current_size->size * 1024 * 1024))) - return rc; + + /* The original driver changed the IORR. We don't do that + because this should be handled by the BIOS. */ /* directory size is 64k */ num_dirs = current_size->size / 64; @@ -4209,10 +4891,6 @@ previous_size = A_SIZE_8(agp_bridge.previous_size); pci_write_config_byte(agp_bridge.dev, NVIDIA_0_APSIZE, previous_size->size_value); - - /* restore iorr for previous aperture size */ - nvidia_init_iorr(agp_bridge.gart_bus_addr, - previous_size->size * 1024 * 1024); } static void nvidia_tlbflush(agp_memory * mem) @@ -4379,6 +5057,8 @@ #define log2(x) ffz(~(x)) #endif +#define HP_ZX1_IOC_OFFSET 0x1000 /* ACPI reports SBA, we want IOC */ + #define HP_ZX1_IOVA_BASE GB(1UL) #define HP_ZX1_IOVA_SIZE GB(1UL) #define HP_ZX1_GART_SIZE (HP_ZX1_IOVA_SIZE / 2) @@ -4388,19 +5068,16 @@ #define HP_ZX1_IOVA_TO_PDIR(va) ((va - hp_private.iova_base) >> \ hp_private.io_tlb_shift) +static int hp_zx1_gart_found; + static aper_size_info_fixed hp_zx1_sizes[] = { {0, 0, 0}, /* filled in by hp_zx1_fetch_size() */ }; -static gatt_mask hp_zx1_masks[] = -{ - {HP_ZX1_PDIR_VALID_BIT, 0} -}; - static struct _hp_private { - struct pci_dev *ioc; - volatile u8 *registers; + volatile u8 *ioc_regs; + volatile u8 *lba_regs; u64 *io_pdir; // PDIR for entire IOVA u64 *gatt; // PDIR just for GART (subset of above) u64 gatt_entries; @@ -4427,7 +5104,7 @@ * - IOVA space is 1Gb in size * - first 512Mb is IOMMU, second 512Mb is GART */ - hp->io_tlb_ps = INREG64(hp->registers, HP_ZX1_TCNFG); + hp->io_tlb_ps = INREG64(hp->ioc_regs, HP_ZX1_TCNFG); switch (hp->io_tlb_ps) { case 0: hp->io_tlb_shift = 12; break; case 1: hp->io_tlb_shift = 13; break; @@ -4443,13 +5120,13 @@ hp->io_page_size = 1 << hp->io_tlb_shift; hp->io_pages_per_kpage = PAGE_SIZE / hp->io_page_size; - hp->iova_base = INREG64(hp->registers, HP_ZX1_IBASE) & ~0x1; + hp->iova_base = INREG64(hp->ioc_regs, HP_ZX1_IBASE) & ~0x1; hp->gart_base = hp->iova_base + HP_ZX1_IOVA_SIZE - HP_ZX1_GART_SIZE; hp->gart_size = HP_ZX1_GART_SIZE; hp->gatt_entries = hp->gart_size / hp->io_page_size; - hp->io_pdir = phys_to_virt(INREG64(hp->registers, HP_ZX1_PDIR_BASE)); + hp->io_pdir = phys_to_virt(INREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE)); hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)]; if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) { @@ -4463,7 +5140,7 @@ return 0; } -static int __init hp_zx1_ioc_owner(u8 ioc_rev) +static int __init hp_zx1_ioc_owner(void) { struct _hp_private *hp = &hp_private; @@ -4498,44 +5175,21 @@ return 0; } -static int __init hp_zx1_ioc_init(void) +static int __init hp_zx1_ioc_init(u64 ioc_hpa, u64 lba_hpa) { struct _hp_private *hp = &hp_private; - struct pci_dev *ioc; - int i; - u8 ioc_rev; - ioc = pci_find_device(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_ZX1_IOC, NULL); - if (!ioc) { - printk(KERN_ERR PFX "Detected HP ZX1 AGP bridge but no IOC\n"); - return -ENODEV; - } - hp->ioc = ioc; - - pci_read_config_byte(ioc, PCI_REVISION_ID, &ioc_rev); - - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - if (pci_resource_flags(ioc, i) == IORESOURCE_MEM) { - hp->registers = (u8 *) ioremap(pci_resource_start(ioc, - i), - pci_resource_len(ioc, i)); - break; - } - } - if (!hp->registers) { - printk(KERN_ERR PFX "Detected HP ZX1 AGP bridge but no CSRs\n"); - - return -ENODEV; - } + hp->ioc_regs = ioremap(ioc_hpa, 1024); + hp->lba_regs = ioremap(lba_hpa, 256); /* * If the IOTLB is currently disabled, we can take it over. * Otherwise, we have to share with sba_iommu. */ - hp->io_pdir_owner = (INREG64(hp->registers, HP_ZX1_IBASE) & 0x1) == 0; + hp->io_pdir_owner = (INREG64(hp->ioc_regs, HP_ZX1_IBASE) & 0x1) == 0; if (hp->io_pdir_owner) - return hp_zx1_ioc_owner(ioc_rev); + return hp_zx1_ioc_owner(); return hp_zx1_ioc_shared(); } @@ -4550,190 +5204,664 @@ return size; } -static int hp_zx1_configure(void) +static int hp_zx1_configure(void) +{ + struct _hp_private *hp = &hp_private; + + agp_bridge.gart_bus_addr = hp->gart_base; + agp_bridge.mode = INREG32(hp->lba_regs, HP_ZX1_AGP_STATUS); + + if (hp->io_pdir_owner) { + OUTREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE, + virt_to_phys(hp->io_pdir)); + OUTREG64(hp->ioc_regs, HP_ZX1_TCNFG, hp->io_tlb_ps); + OUTREG64(hp->ioc_regs, HP_ZX1_IMASK, ~(HP_ZX1_IOVA_SIZE - 1)); + OUTREG64(hp->ioc_regs, HP_ZX1_IBASE, hp->iova_base | 0x1); + OUTREG64(hp->ioc_regs, HP_ZX1_PCOM, + hp->iova_base | log2(HP_ZX1_IOVA_SIZE)); + INREG64(hp->ioc_regs, HP_ZX1_PCOM); + } + + return 0; +} + +static void hp_zx1_cleanup(void) +{ + struct _hp_private *hp = &hp_private; + + if (hp->io_pdir_owner) + OUTREG64(hp->ioc_regs, HP_ZX1_IBASE, 0); + iounmap((void *) hp->ioc_regs); + iounmap((void *) hp->lba_regs); +} + +static void hp_zx1_tlbflush(agp_memory * mem) +{ + struct _hp_private *hp = &hp_private; + + OUTREG64(hp->ioc_regs, HP_ZX1_PCOM, + hp->gart_base | log2(hp->gart_size)); + INREG64(hp->ioc_regs, HP_ZX1_PCOM); +} + +static int hp_zx1_create_gatt_table(void) +{ + struct _hp_private *hp = &hp_private; + int i; + + if (hp->io_pdir_owner) { + hp->io_pdir = (u64 *) __get_free_pages(GFP_KERNEL, + get_order(hp->io_pdir_size)); + if (!hp->io_pdir) { + printk(KERN_ERR PFX "Couldn't allocate contiguous " + "memory for I/O PDIR\n"); + hp->gatt = 0; + hp->gatt_entries = 0; + return -ENOMEM; + } + memset(hp->io_pdir, 0, hp->io_pdir_size); + + hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)]; + } + + for (i = 0; i < hp->gatt_entries; i++) { + hp->gatt[i] = (unsigned long) agp_bridge.scratch_page; + } + + return 0; +} + +static int hp_zx1_free_gatt_table(void) +{ + struct _hp_private *hp = &hp_private; + + if (hp->io_pdir_owner) + free_pages((unsigned long) hp->io_pdir, + get_order(hp->io_pdir_size)); + else + hp->gatt[0] = HP_ZX1_SBA_IOMMU_COOKIE; + return 0; +} + +static int hp_zx1_insert_memory(agp_memory * mem, off_t pg_start, int type) +{ + struct _hp_private *hp = &hp_private; + int i, k; + off_t j, io_pg_start; + int io_pg_count; + + if (type != 0 || mem->type != 0) { + return -EINVAL; + } + + io_pg_start = hp->io_pages_per_kpage * pg_start; + io_pg_count = hp->io_pages_per_kpage * mem->page_count; + if ((io_pg_start + io_pg_count) > hp->gatt_entries) { + return -EINVAL; + } + + j = io_pg_start; + while (j < (io_pg_start + io_pg_count)) { + if (hp->gatt[j]) { + return -EBUSY; + } + j++; + } + + for (i = 0, j = io_pg_start; i < mem->page_count; i++) { + unsigned long paddr; + + paddr = mem->memory[i]; + for (k = 0; + k < hp->io_pages_per_kpage; + k++, j++, paddr += hp->io_page_size) { + hp->gatt[j] = agp_bridge.mask_memory(paddr, type); + } + } + + agp_bridge.tlb_flush(mem); + return 0; +} + +static int hp_zx1_remove_memory(agp_memory * mem, off_t pg_start, int type) +{ + struct _hp_private *hp = &hp_private; + int i, io_pg_start, io_pg_count; + + if (type != 0 || mem->type != 0) { + return -EINVAL; + } + + io_pg_start = hp->io_pages_per_kpage * pg_start; + io_pg_count = hp->io_pages_per_kpage * mem->page_count; + for (i = io_pg_start; i < io_pg_count + io_pg_start; i++) { + hp->gatt[i] = agp_bridge.scratch_page; + } + + agp_bridge.tlb_flush(mem); + return 0; +} + +static unsigned long hp_zx1_mask_memory(unsigned long addr, int type) +{ + return HP_ZX1_PDIR_VALID_BIT | addr; +} + +static void hp_zx1_agp_enable(u32 mode) +{ + struct _hp_private *hp = &hp_private; + u32 command; + + command = INREG32(hp->lba_regs, HP_ZX1_AGP_STATUS); + + command = agp_collect_device_status(mode, command); + command |= 0x00000100; + + OUTREG32(hp->lba_regs, HP_ZX1_AGP_COMMAND, command); + + agp_device_command(command, 0); +} + +static int __init hp_zx1_setup(u64 ioc_hpa, u64 lba_hpa) +{ + agp_bridge.dev_private_data = NULL; + agp_bridge.size_type = FIXED_APER_SIZE; + agp_bridge.needs_scratch_page = FALSE; + agp_bridge.configure = hp_zx1_configure; + agp_bridge.fetch_size = hp_zx1_fetch_size; + agp_bridge.cleanup = hp_zx1_cleanup; + agp_bridge.tlb_flush = hp_zx1_tlbflush; + agp_bridge.mask_memory = hp_zx1_mask_memory; + agp_bridge.agp_enable = hp_zx1_agp_enable; + agp_bridge.cache_flush = global_cache_flush; + agp_bridge.create_gatt_table = hp_zx1_create_gatt_table; + agp_bridge.free_gatt_table = hp_zx1_free_gatt_table; + agp_bridge.insert_memory = hp_zx1_insert_memory; + agp_bridge.remove_memory = hp_zx1_remove_memory; + agp_bridge.alloc_by_type = agp_generic_alloc_by_type; + agp_bridge.free_by_type = agp_generic_free_by_type; + agp_bridge.agp_alloc_page = agp_generic_alloc_page; + agp_bridge.agp_destroy_page = agp_generic_destroy_page; + agp_bridge.cant_use_aperture = 1; + agp_bridge.type = HP_ZX1; + + fake_bridge_dev.vendor = PCI_VENDOR_ID_HP; + fake_bridge_dev.device = PCI_DEVICE_ID_HP_PCIX_LBA; + + return hp_zx1_ioc_init(ioc_hpa, lba_hpa); +} + +static acpi_status __init hp_zx1_gart_probe(acpi_handle obj, u32 depth, void *context, void **ret) +{ + acpi_handle handle, parent; + acpi_status status; + struct acpi_buffer buffer; + struct acpi_device_info *info; + u64 lba_hpa, sba_hpa, length; + int match; + + status = acpi_hp_csr_space(obj, &lba_hpa, &length); + if (ACPI_FAILURE(status)) + return AE_OK; + + /* Look for an enclosing IOC scope and find its CSR space */ + handle = obj; + do { + buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; + status = acpi_get_object_info(handle, &buffer); + if (ACPI_SUCCESS(status)) { + /* TBD check _CID also */ + info = buffer.pointer; + info->hardware_id.value[sizeof(info->hardware_id)-1] = '\0'; + match = (strcmp(info->hardware_id.value, "HWP0001") == 0); + ACPI_MEM_FREE(info); + if (match) { + status = acpi_hp_csr_space(handle, &sba_hpa, &length); + if (ACPI_SUCCESS(status)) + break; + else { + printk(KERN_ERR PFX "Detected HP ZX1 " + "AGP LBA but no IOC.\n"); + return AE_OK; + } + } + } + + status = acpi_get_parent(handle, &parent); + handle = parent; + } while (ACPI_SUCCESS(status)); + + if (hp_zx1_setup(sba_hpa + HP_ZX1_IOC_OFFSET, lba_hpa)) + return AE_OK; + + printk(KERN_INFO PFX "Detected HP ZX1 %s AGP chipset (ioc=%lx, lba=%lx)\n", + (char *) context, sba_hpa + HP_ZX1_IOC_OFFSET, lba_hpa); + + hp_zx1_gart_found = 1; + return AE_CTRL_TERMINATE; +} + +static int __init +hp_zx1_gart_init(void) +{ + acpi_get_devices("HWP0003", hp_zx1_gart_probe, "HWP0003", NULL); + if (hp_zx1_gart_found) + return 0; + + acpi_get_devices("HWP0007", hp_zx1_gart_probe, "HWP0007", NULL); + if (hp_zx1_gart_found) + return 0; + + return -ENODEV; +} + +#endif /* CONFIG_AGP_HP_ZX1 */ + +#ifdef CONFIG_AGP_ATI +static aper_size_info_lvl2 ati_generic_sizes[7] = +{ + {2048, 524288, 0x0000000c}, + {1024, 262144, 0x0000000a}, + {512, 131072, 0x00000008}, + {256, 65536, 0x00000006}, + {128, 32768, 0x00000004}, + {64, 16384, 0x00000002}, + {32, 8192, 0x00000000} +}; + +static gatt_mask ati_generic_masks[] = +{ + {0x00000001, 0} +}; + +typedef struct _ati_page_map { + unsigned long *real; + unsigned long *remapped; +} ati_page_map; + +static struct _ati_generic_private { + volatile u8 *registers; + ati_page_map **gatt_pages; + int num_tables; +} ati_generic_private; + +static int ati_create_page_map(ati_page_map *page_map) +{ + int i, err = 0; + + page_map->real = (unsigned long *) __get_free_page(GFP_KERNEL); + if (page_map->real == NULL) + return -ENOMEM; + + SetPageReserved(virt_to_page(page_map->real)); + /* + * fredi - WARNING: added looking at the changes during + * 2.4.20. I dont know if it's needed though. + */ +#ifdef CONFIG_X86 + err = change_page_attr(virt_to_page(page_map->real), 1, PAGE_KERNEL_NOCACHE); +#endif + CACHE_FLUSH(); + page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), + PAGE_SIZE); + if (page_map->remapped == NULL || err) { + ClearPageReserved(virt_to_page(page_map->real)); + free_page((unsigned long) page_map->real); + page_map->real = NULL; + return -ENOMEM; + } + CACHE_FLUSH(); + + for(i = 0; i < PAGE_SIZE / sizeof(unsigned long); i++) + page_map->remapped[i] = agp_bridge.scratch_page; + + return 0; +} + +static void ati_free_page_map(ati_page_map *page_map) +{ + /* + * fredi - WARNING: added looking at the changes during + * 2.4.20. I dont know if it's needed though. + */ +#ifdef CONFIG_X86 + change_page_attr(virt_to_page(page_map->real), 1, PAGE_KERNEL); +#endif + iounmap(page_map->remapped); + ClearPageReserved(virt_to_page(page_map->real)); + free_page((unsigned long) page_map->real); +} + +static void ati_free_gatt_pages(void) +{ + int i; + ati_page_map **tables; + ati_page_map *entry; + + tables = ati_generic_private.gatt_pages; + for(i = 0; i < ati_generic_private.num_tables; i++) { + entry = tables[i]; + if (entry != NULL) { + if (entry->real != NULL) + ati_free_page_map(entry); + kfree(entry); + } + } + kfree(tables); +} + +static int ati_create_gatt_pages(int nr_tables) +{ + ati_page_map **tables; + ati_page_map *entry; + int retval = 0; + int i; + + tables = kmalloc((nr_tables + 1) * sizeof(ati_page_map *), + GFP_KERNEL); + if (tables == NULL) + return -ENOMEM; + + memset(tables, 0, sizeof(ati_page_map *) * (nr_tables + 1)); + for (i = 0; i < nr_tables; i++) { + entry = kmalloc(sizeof(ati_page_map), GFP_KERNEL); + if (entry == NULL) { + retval = -ENOMEM; + break; + } + memset(entry, 0, sizeof(ati_page_map)); + tables[i] = entry; + retval = ati_create_page_map(entry); + if (retval != 0) break; + } + ati_generic_private.num_tables = nr_tables; + ati_generic_private.gatt_pages = tables; + + if (retval != 0) ati_free_gatt_pages(); + + return retval; +} + +/* + *Since we don't need contigious memory we just try + * to get the gatt table once + */ + +#define GET_PAGE_DIR_OFF(addr) (addr >> 22) +#define GET_PAGE_DIR_IDX(addr) (GET_PAGE_DIR_OFF(addr) - \ + GET_PAGE_DIR_OFF(agp_bridge.gart_bus_addr)) +#define GET_GATT_OFF(addr) ((addr & 0x003ff000) >> 12) +#undef GET_GATT(addr) +#define GET_GATT(addr) (ati_generic_private.gatt_pages[\ + GET_PAGE_DIR_IDX(addr)]->remapped) + +static int ati_insert_memory(agp_memory * mem, + off_t pg_start, int type) +{ + int i, j, num_entries; + unsigned long *cur_gatt; + unsigned long addr; + + num_entries = A_SIZE_LVL2(agp_bridge.current_size)->num_entries; + + if (type != 0 || mem->type != 0) + return -EINVAL; + + if ((pg_start + mem->page_count) > num_entries) + return -EINVAL; + + j = pg_start; + while (j < (pg_start + mem->page_count)) { + addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr; + cur_gatt = GET_GATT(addr); + if (!PGE_EMPTY(cur_gatt[GET_GATT_OFF(addr)])) + return -EBUSY; + j++; + } + + if (mem->is_flushed == FALSE) { + CACHE_FLUSH(); + mem->is_flushed = TRUE; + } + + for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { + addr = (j * PAGE_SIZE) + agp_bridge.gart_bus_addr; + cur_gatt = GET_GATT(addr); + cur_gatt[GET_GATT_OFF(addr)] = + agp_bridge.mask_memory(mem->memory[i], mem->type); + } + agp_bridge.tlb_flush(mem); + return 0; +} + +static int ati_remove_memory(agp_memory * mem, off_t pg_start, + int type) { - struct _hp_private *hp = &hp_private; - - agp_bridge.gart_bus_addr = hp->gart_base; - agp_bridge.capndx = pci_find_capability(agp_bridge.dev, PCI_CAP_ID_AGP); - pci_read_config_dword(agp_bridge.dev, - agp_bridge.capndx + PCI_AGP_STATUS, &agp_bridge.mode); + int i; + unsigned long *cur_gatt; + unsigned long addr; - if (hp->io_pdir_owner) { - OUTREG64(hp->registers, HP_ZX1_PDIR_BASE, - virt_to_phys(hp->io_pdir)); - OUTREG64(hp->registers, HP_ZX1_TCNFG, hp->io_tlb_ps); - OUTREG64(hp->registers, HP_ZX1_IMASK, ~(HP_ZX1_IOVA_SIZE - 1)); - OUTREG64(hp->registers, HP_ZX1_IBASE, hp->iova_base | 0x1); - OUTREG64(hp->registers, HP_ZX1_PCOM, - hp->iova_base | log2(HP_ZX1_IOVA_SIZE)); - INREG64(hp->registers, HP_ZX1_PCOM); + if (type != 0 || mem->type != 0) { + return -EINVAL; + } + for (i = pg_start; i < (mem->page_count + pg_start); i++) { + addr = (i * PAGE_SIZE) + agp_bridge.gart_bus_addr; + cur_gatt = GET_GATT(addr); + cur_gatt[GET_GATT_OFF(addr)] = + (unsigned long) agp_bridge.scratch_page; } + agp_bridge.tlb_flush(mem); return 0; } -static void hp_zx1_cleanup(void) +static int ati_create_gatt_table(void) { - struct _hp_private *hp = &hp_private; - - if (hp->io_pdir_owner) - OUTREG64(hp->registers, HP_ZX1_IBASE, 0); - iounmap((void *) hp->registers); -} + aper_size_info_lvl2 *value; + ati_page_map page_dir; + unsigned long addr; + int retval; + u32 temp; + int i; + aper_size_info_lvl2 *current_size; -static void hp_zx1_tlbflush(agp_memory * mem) -{ - struct _hp_private *hp = &hp_private; + value = A_SIZE_LVL2(agp_bridge.current_size); + retval = ati_create_page_map(&page_dir); + if (retval != 0) + return retval; - OUTREG64(hp->registers, HP_ZX1_PCOM, - hp->gart_base | log2(hp->gart_size)); - INREG64(hp->registers, HP_ZX1_PCOM); -} + retval = ati_create_gatt_pages(value->num_entries / 1024); + if (retval != 0) { + ati_free_page_map(&page_dir); + return retval; + } -static int hp_zx1_create_gatt_table(void) -{ - struct _hp_private *hp = &hp_private; - int i; + agp_bridge.gatt_table_real = (u32 *)page_dir.real; + agp_bridge.gatt_table = (u32 *)page_dir.remapped; + agp_bridge.gatt_bus_addr = virt_to_bus(page_dir.real); - if (hp->io_pdir_owner) { - hp->io_pdir = (u64 *) __get_free_pages(GFP_KERNEL, - get_order(hp->io_pdir_size)); - if (!hp->io_pdir) { - printk(KERN_ERR PFX "Couldn't allocate contiguous " - "memory for I/O PDIR\n"); - hp->gatt = 0; - hp->gatt_entries = 0; - return -ENOMEM; - } - memset(hp->io_pdir, 0, hp->io_pdir_size); + /* Write out the size register */ + current_size = A_SIZE_LVL2(agp_bridge.current_size); - hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)]; + if ((agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS100) || + (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200) || + (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS250)) { + pci_read_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, &temp); + temp = (((temp & ~(0x0000000e)) | current_size->size_value) + | 0x00000001); + pci_write_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, temp); + pci_read_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, &temp); + } else { + pci_read_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, &temp); + temp = (((temp & ~(0x0000000e)) | current_size->size_value) + | 0x00000001); + pci_write_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, temp); + pci_read_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, &temp); } - for (i = 0; i < hp->gatt_entries; i++) { - hp->gatt[i] = (unsigned long) agp_bridge.scratch_page; + /* + * Get the address for the gart region. + * This is a bus address even on the alpha, b/c its + * used to program the agp master not the cpu + */ + pci_read_config_dword(agp_bridge.dev, ATI_APBASE, &temp); + addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + agp_bridge.gart_bus_addr = addr; + + /* Calculate the agp offset */ + for(i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) { + page_dir.remapped[GET_PAGE_DIR_OFF(addr)] = + virt_to_bus(ati_generic_private.gatt_pages[i]->real); + page_dir.remapped[GET_PAGE_DIR_OFF(addr)] |= 0x00000001; } return 0; } -static int hp_zx1_free_gatt_table(void) +static int ati_free_gatt_table(void) { - struct _hp_private *hp = &hp_private; - - if (hp->io_pdir_owner) - free_pages((unsigned long) hp->io_pdir, - get_order(hp->io_pdir_size)); - else - hp->gatt[0] = HP_ZX1_SBA_IOMMU_COOKIE; + ati_page_map page_dir; + + page_dir.real = (unsigned long *)agp_bridge.gatt_table_real; + page_dir.remapped = (unsigned long *)agp_bridge.gatt_table; + + ati_free_gatt_pages(); + ati_free_page_map(&page_dir); return 0; } -static int hp_zx1_insert_memory(agp_memory * mem, off_t pg_start, int type) +static int ati_fetch_size(void) { - struct _hp_private *hp = &hp_private; - int i, k; - off_t j, io_pg_start; - int io_pg_count; + int i; + u32 temp; + aper_size_info_lvl2 *values; - if (type != 0 || mem->type != 0) { - return -EINVAL; + if ((agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS100) || + (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200) || + (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS250)) { + pci_read_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, &temp); + } else { + pci_read_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, &temp); } - io_pg_start = hp->io_pages_per_kpage * pg_start; - io_pg_count = hp->io_pages_per_kpage * mem->page_count; - if ((io_pg_start + io_pg_count) > hp->gatt_entries) { - return -EINVAL; - } + temp = (temp & 0x0000000e); + values = A_SIZE_LVL2(agp_bridge.aperture_sizes); + for (i = 0; i < agp_bridge.num_aperture_sizes; i++) { + if (temp == values[i].size_value) { + agp_bridge.previous_size = + agp_bridge.current_size = (void *) (values + i); - j = io_pg_start; - while (j < (io_pg_start + io_pg_count)) { - if (hp->gatt[j]) { - return -EBUSY; + agp_bridge.aperture_size_idx = i; + return values[i].size; } - j++; } - if (mem->is_flushed == FALSE) { - CACHE_FLUSH(); - mem->is_flushed = TRUE; - } + return 0; +} - for (i = 0, j = io_pg_start; i < mem->page_count; i++) { - unsigned long paddr; +static int ati_configure(void) +{ + u32 temp; - paddr = mem->memory[i]; - for (k = 0; - k < hp->io_pages_per_kpage; - k++, j++, paddr += hp->io_page_size) { - hp->gatt[j] = agp_bridge.mask_memory(paddr, type); - } + /* Get the memory mapped registers */ + pci_read_config_dword(agp_bridge.dev, ATI_GART_MMBASE_ADDR, &temp); + temp = (temp & 0xfffff000); + ati_generic_private.registers = (volatile u8 *) ioremap(temp, 4096); + + if ((agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS100) || + (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200) || + (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS250)) { + pci_write_config_dword(agp_bridge.dev, ATI_RS100_IG_AGPMODE, 0x20000); + } else { + pci_write_config_dword(agp_bridge.dev, ATI_RS300_IG_AGPMODE, 0x20000); } - agp_bridge.tlb_flush(mem); + /* address to map too */ + /* + pci_read_config_dword(agp_bridge.dev, ATI_APBASE, &temp); + agp_bridge.gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK); + printk(KERN_INFO "IGP320 gart_bus_addr: %x\n", agp_bridge.gart_bus_addr); + */ + OUTREG32(ati_generic_private.registers, ATI_GART_FEATURE_ID, 0x60000); + + /* SIGNALED_SYSTEM_ERROR @ NB_STATUS */ + pci_read_config_dword(agp_bridge.dev, 4, &temp); + pci_write_config_dword(agp_bridge.dev, 4, temp | (1<<14)); + + /* Write out the address of the gatt table */ + OUTREG32(ati_generic_private.registers, ATI_GART_BASE, + agp_bridge.gatt_bus_addr); + + /* Flush the tlb */ + OUTREG32(ati_generic_private.registers, ATI_GART_CACHE_CNTRL, 1); return 0; } -static int hp_zx1_remove_memory(agp_memory * mem, off_t pg_start, int type) +static void ati_cleanup(void) { - struct _hp_private *hp = &hp_private; - int i, io_pg_start, io_pg_count; + aper_size_info_lvl2 *previous_size; + u32 temp; - if (type != 0 || mem->type != 0) { - return -EINVAL; - } + previous_size = A_SIZE_LVL2(agp_bridge.previous_size); - io_pg_start = hp->io_pages_per_kpage * pg_start; - io_pg_count = hp->io_pages_per_kpage * mem->page_count; - for (i = io_pg_start; i < io_pg_count + io_pg_start; i++) { - hp->gatt[i] = agp_bridge.scratch_page; + /* Write back the previous size and disable gart translation */ + if ((agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS100) || + (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS200) || + (agp_bridge.dev->device == PCI_DEVICE_ID_ATI_RS250)) { + pci_read_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, &temp); + temp = ((temp & ~(0x0000000f)) | previous_size->size_value); + pci_write_config_dword(agp_bridge.dev, ATI_RS100_APSIZE, temp); + } else { + pci_read_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, &temp); + temp = ((temp & ~(0x0000000f)) | previous_size->size_value); + pci_write_config_dword(agp_bridge.dev, ATI_RS300_APSIZE, temp); } - - agp_bridge.tlb_flush(mem); - return 0; + iounmap((void *) ati_generic_private.registers); } -static unsigned long hp_zx1_mask_memory(unsigned long addr, int type) +static void ati_tlbflush(agp_memory * mem) { - return HP_ZX1_PDIR_VALID_BIT | addr; + OUTREG32(ati_generic_private.registers, ATI_GART_CACHE_CNTRL, 1); } -static unsigned long hp_zx1_unmask_memory(unsigned long addr) +static unsigned long ati_mask_memory(unsigned long addr, int type) { - return addr & ~(HP_ZX1_PDIR_VALID_BIT); + /* Memory type is ignored */ + return addr | agp_bridge.masks[0].mask; } -static int __init hp_zx1_setup (struct pci_dev *pdev) +static int __init ati_generic_setup (struct pci_dev *pdev) { - agp_bridge.masks = hp_zx1_masks; - agp_bridge.dev_private_data = NULL; - agp_bridge.size_type = FIXED_APER_SIZE; + agp_bridge.masks = ati_generic_masks; + agp_bridge.aperture_sizes = (void *) ati_generic_sizes; + agp_bridge.size_type = LVL2_APER_SIZE; + agp_bridge.num_aperture_sizes = 7; + agp_bridge.dev_private_data = (void *) &ati_generic_private; agp_bridge.needs_scratch_page = FALSE; - agp_bridge.configure = hp_zx1_configure; - agp_bridge.fetch_size = hp_zx1_fetch_size; - agp_bridge.cleanup = hp_zx1_cleanup; - agp_bridge.tlb_flush = hp_zx1_tlbflush; - agp_bridge.mask_memory = hp_zx1_mask_memory; - agp_bridge.unmask_memory = hp_zx1_unmask_memory; + agp_bridge.configure = ati_configure; + agp_bridge.fetch_size = ati_fetch_size; + agp_bridge.cleanup = ati_cleanup; + agp_bridge.tlb_flush = ati_tlbflush; + agp_bridge.mask_memory = ati_mask_memory; agp_bridge.agp_enable = agp_generic_agp_enable; agp_bridge.cache_flush = global_cache_flush; - agp_bridge.create_gatt_table = hp_zx1_create_gatt_table; - agp_bridge.free_gatt_table = hp_zx1_free_gatt_table; - agp_bridge.insert_memory = hp_zx1_insert_memory; - agp_bridge.remove_memory = hp_zx1_remove_memory; + agp_bridge.create_gatt_table = ati_create_gatt_table; + agp_bridge.free_gatt_table = ati_free_gatt_table; + agp_bridge.insert_memory = ati_insert_memory; + agp_bridge.remove_memory = ati_remove_memory; agp_bridge.alloc_by_type = agp_generic_alloc_by_type; agp_bridge.free_by_type = agp_generic_free_by_type; agp_bridge.agp_alloc_page = agp_generic_alloc_page; agp_bridge.agp_destroy_page = agp_generic_destroy_page; - agp_bridge.cant_use_aperture = 1; + agp_bridge.suspend = agp_generic_suspend; + agp_bridge.resume = agp_generic_resume; + agp_bridge.cant_use_aperture = 0; - return hp_zx1_ioc_init(); + return 0; (void) pdev; /* unused */ } - -#endif /* CONFIG_AGP_HP_ZX1 */ +#endif /* CONFIG_AGP_ATI */ /* per-chipset initialization data. * note -- all chipsets for a single vendor MUST be grouped together @@ -4829,6 +5957,20 @@ "AMD", "761", amd_irongate_setup }, +#endif +#ifdef CONFIG_AGP_AMD_K8 + { PCI_DEVICE_ID_AMD_8151_0, + PCI_VENDOR_ID_AMD, + AMD_8151, + "AMD", + "On-CPU GART", + amd_8151_setup }, + + /* Note: when adding more PCI-IDs for 8151 compatible bridges + add them to the end of their vendor lists, not here. + This list has to be ordered by vendor. */ +#endif /* CONFIG_AGP_AMD */ +#ifdef CONFIG_AGP_AMD { 0, PCI_VENDOR_ID_AMD, AMD_GENERIC, @@ -4837,15 +5979,6 @@ amd_irongate_setup }, #endif /* CONFIG_AGP_AMD */ -#ifdef CONFIG_AGP_AMD_8151 - { PCI_DEVICE_ID_AMD_8151_0, - PCI_VENDOR_ID_AMD, - AMD_8151, - "AMD", - "8151", - amd_8151_setup }, -#endif /* CONFIG_AGP_AMD */ - #ifdef CONFIG_AGP_INTEL { PCI_DEVICE_ID_INTEL_82443LX_0, PCI_VENDOR_ID_INTEL, @@ -4942,6 +6075,18 @@ "Intel", "i860", intel_860_setup }, + { PCI_DEVICE_ID_INTEL_7205_0, + PCI_VENDOR_ID_INTEL, + INTEL_I7205, + "Intel", + "i7205", + intel_7505_setup }, + { PCI_DEVICE_ID_INTEL_7505_0, + PCI_VENDOR_ID_INTEL, + INTEL_I7505, + "Intel", + "i7505", + intel_7505_setup }, { 0, PCI_VENDOR_ID_INTEL, INTEL_GENERIC, @@ -4951,6 +6096,15 @@ #endif /* CONFIG_AGP_INTEL */ +#ifdef CONFIG_AGP_I460 + { PCI_DEVICE_ID_INTEL_460GX, + PCI_VENDOR_ID_INTEL, + INTEL_460GX, + "Intel", + "460GX", + intel_i460_setup }, +#endif + #ifdef CONFIG_AGP_SIS { PCI_DEVICE_ID_SI_740, PCI_VENDOR_ID_SI, @@ -5048,6 +6202,16 @@ "SiS", "550", sis_generic_setup }, +#endif +#ifdef CONFIG_AGP_AMD_K8 + { PCI_DEVICE_ID_SI_755, + PCI_VENDOR_ID_SI, + AMD_8151, + "AMD", + "On-CPU GART", + amd_8151_setup }, +#endif +#ifdef CONFIG_AGP_SIS { 0, PCI_VENDOR_ID_SI, SIS_GENERIC, @@ -5123,12 +6287,36 @@ "Via", "Apollo Pro KT400", via_generic_setup }, + { PCI_DEVICE_ID_VIA_CLE266, + PCI_VENDOR_ID_VIA, + VIA_CLE266, + "Via", + "CLE266", + via_generic_setup }, { PCI_DEVICE_ID_VIA_P4M266, PCI_VENDOR_ID_VIA, VIA_APOLLO_P4M266, "Via", "Apollo P4M266", via_generic_setup }, +#endif +#ifdef CONFIG_AGP_AMD_K8 + { PCI_DEVICE_ID_VIA_8380_0, + PCI_VENDOR_ID_VIA, + AMD_8151, + "AMD", + "On-CPU GART", + amd_8151_setup }, + + /* VIA K8T800 */ + { PCI_DEVICE_ID_VIA_8385_0, + PCI_VENDOR_ID_VIA, + AMD_8151, + "AMD", + "On-CPU GART", + amd_8151_setup }, +#endif +#ifdef CONFIG_AGP_VIA { 0, PCI_VENDOR_ID_VIA, VIA_GENERIC, @@ -5150,6 +6338,16 @@ "NVIDIA", "nForce2", nvidia_generic_setup }, +#endif +#ifdef CONFIG_AGP_AMD_K8 + { PCI_DEVICE_ID_NVIDIA_NFORCE3, + PCI_VENDOR_ID_NVIDIA, + NVIDIA_NFORCE3, + "NVIDIA", + "nForce3/K8 On-CPU GART", + nvidia_x86_64_setup }, +#endif +#ifdef CONFIG_AGP_NVIDIA { 0, PCI_VENDOR_ID_NVIDIA, NVIDIA_GENERIC, @@ -5158,14 +6356,50 @@ nvidia_generic_setup }, #endif /* CONFIG_AGP_NVIDIA */ -#ifdef CONFIG_AGP_HP_ZX1 - { PCI_DEVICE_ID_HP_ZX1_LBA, - PCI_VENDOR_ID_HP, - HP_ZX1, - "HP", - "ZX1", - hp_zx1_setup }, -#endif +#ifdef CONFIG_AGP_ATI + { PCI_DEVICE_ID_ATI_RS100, + PCI_VENDOR_ID_ATI, + ATI_RS100, + "ATI", + "IGP320/M", + ati_generic_setup }, + { PCI_DEVICE_ID_ATI_RS200, + PCI_VENDOR_ID_ATI, + ATI_RS200, + "ATI", + "IGP330/340/345/350/M", + ati_generic_setup }, + { PCI_DEVICE_ID_ATI_RS250, + PCI_VENDOR_ID_ATI, + ATI_RS250, + "ATI", + "IGP7000/M", + ati_generic_setup }, + { PCI_DEVICE_ID_ATI_RS300_100, + PCI_VENDOR_ID_ATI, + ATI_RS300_100, + "ATI", + "IGP9100/M", + ati_generic_setup }, + { PCI_DEVICE_ID_ATI_RS300_133, + PCI_VENDOR_ID_ATI, + ATI_RS300_133, + "ATI", + "IGP9100/M", + ati_generic_setup }, + { PCI_DEVICE_ID_ATI_RS300_166, + PCI_VENDOR_ID_ATI, + ATI_RS300_166, + "ATI", + "IGP9100/M", + ati_generic_setup }, + { PCI_DEVICE_ID_ATI_RS300_200, + PCI_VENDOR_ID_ATI, + ATI_RS300_200, + "ATI", + "IGP9100/M", + ati_generic_setup }, +#endif /* CONFIG_AGP_ATI */ { 0, }, /* dummy final entry, always present */ }; @@ -5240,7 +6474,11 @@ } printk(KERN_ERR PFX "Unsupported %s chipset (device id: %04x)," +#ifdef MODULE " you might want to try agp_try_unsupported=1.\n", +#else + " you might want to boot with agp=try_unsupported\n", +#endif agp_bridge_info[i].vendor_name, pdev->device); return -ENODEV; } @@ -5253,11 +6491,41 @@ struct pci_dev *dev = NULL; u8 cap_ptr = 0x00; +#ifdef CONFIG_AGP_HP_ZX1 + if (hp_zx1_gart_init() == 0) + return 0; +#endif + if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) == NULL) return -ENODEV; agp_bridge.dev = dev; +#ifdef CONFIG_AGP_AMD_K8 + /* If there is any K8 northbridge in the system always use the K8 driver */ + if (agp_try_unsupported + && pci_find_device(PCI_VENDOR_ID_AMD, 0x1103, NULL) + && !pci_find_device(PCI_VENDOR_ID_NVIDIA, + PCI_DEVICE_ID_NVIDIA_NFORCE3, + NULL)) { + + /* find capndx */ + cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP); + if (cap_ptr == 0x00) + return -ENODEV; + agp_bridge.capndx = cap_ptr; + + /* Fill in the mode register */ + pci_read_config_dword(agp_bridge.dev, + agp_bridge.capndx + 4, + &agp_bridge.mode); + + printk(KERN_INFO PFX "Detected GART in AMD K8 Northbridge\n"); + agp_bridge.type = AMD_8151; + return amd_8151_setup(dev); + } +#endif + /* Need to test for I810 here */ #ifdef CONFIG_AGP_I810 if (dev->vendor == PCI_VENDOR_ID_INTEL) { @@ -5526,23 +6794,6 @@ #endif /* CONFIG_AGP_SWORKS */ -#ifdef CONFIG_AGP_HP_ZX1 - if (dev->vendor == PCI_VENDOR_ID_HP) { - do { - /* ZX1 LBAs can be either PCI or AGP bridges */ - if (pci_find_capability(dev, PCI_CAP_ID_AGP)) { - printk(KERN_INFO PFX "Detected HP ZX1 AGP " - "chipset at %s\n", dev->slot_name); - agp_bridge.type = HP_ZX1; - agp_bridge.dev = dev; - return hp_zx1_setup(dev); - } - dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, dev); - } while (dev); - return -ENODEV; - } -#endif /* CONFIG_AGP_HP_ZX1 */ - /* find capndx */ cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP); if (cap_ptr == 0x00) @@ -5732,10 +6983,26 @@ &agp_copy_info }; +static int __initdata agp_off = 0; +int __init agp_setup(char *s) +{ + if (!strcmp(s,"off")) + agp_off = 1; + if (!strcmp(s,"try_unsupported")) + agp_try_unsupported = 1; + return 0; +} +__setup("agp=", agp_setup); + int __init agp_init(void) { int ret_val; + if (agp_off) { + printk("AGP disabled\n"); + return -1; + } + printk(KERN_INFO "Linux agpgart interface v%d.%d (c) Jeff Hartmann\n", AGPGART_VERSION_MAJOR, AGPGART_VERSION_MINOR); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/amd76x_pm.c linux-2.4.23-pre8/drivers/char/amd76x_pm.c --- linux-2.4.22/drivers/char/amd76x_pm.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/amd76x_pm.c 2003-10-22 22:48:30.000000000 +0000 @@ -577,16 +577,18 @@ int found; /* Find northbridge */ - found = pci_module_init(&amd_nb_driver); - if (found < 0) { + found = pci_register_driver(&amd_nb_driver); + if (found <= 0) { printk(KERN_ERR "amd76x_pm: Could not find northbridge\n"); + pci_unregister_driver(&amd_nb_driver); return 1; } /* Find southbridge */ - found = pci_module_init(&amd_sb_driver); - if (found < 0) { + found = pci_register_driver(&amd_sb_driver); + if (found <= 0) { printk(KERN_ERR "amd76x_pm: Could not find southbridge\n"); + pci_unregister_driver(&amd_sb_driver); pci_unregister_driver(&amd_nb_driver); return 1; } @@ -620,6 +622,8 @@ #ifndef AMD76X_NTH if (!amd76x_pm_cfg.curr_idle) { printk(KERN_ERR "amd76x_pm: Idle function not changed\n"); + pci_unregister_driver(&amd_nb_driver); + pci_unregister_driver(&amd_sb_driver); return 1; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/amd7xx_tco.c linux-2.4.23-pre8/drivers/char/amd7xx_tco.c --- linux-2.4.22/drivers/char/amd7xx_tco.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/amd7xx_tco.c 2003-10-22 22:47:39.000000000 +0000 @@ -1,6 +1,6 @@ /* * AMD 766/768 TCO Timer Driver - * (c) Copyright 2002 Zwane Mwaikambo + * (c) Copyright 2002 Zwane Mwaikambo * All Rights Reserved. * * Parts from; @@ -34,35 +34,48 @@ #include #include -#define AMDTCO_MODULE_VER "build 20020601" +#define AMDTCO_MODULE_VER "build 20021116" #define AMDTCO_MODULE_NAME "amd7xx_tco" #define PFX AMDTCO_MODULE_NAME ": " -#define MAX_TIMEOUT 38 /* max of 38 seconds */ +#define MAX_TIMEOUT 38 /* max of 38 seconds, although the system will only + * reset itself after the second timeout */ /* pmbase registers */ -#define GLOBAL_SMI_REG 0x2a -#define TCO_EN (1 << 1) /* bit 1 in global SMI register */ #define TCO_RELOAD_REG 0x40 /* bits 0-5 are current count, 6-7 are reserved */ #define TCO_INITVAL_REG 0x41 /* bits 0-5 are value to load, 6-7 are reserved */ #define TCO_TIMEOUT_MASK 0x3f +#define TCO_STATUS1_REG 0x44 #define TCO_STATUS2_REG 0x46 #define NDTO_STS2 (1 << 1) /* we're interested in the second timeout */ #define BOOT_STS (1 << 2) /* will be set if NDTO_STS2 was set before reboot */ #define TCO_CTRL1_REG 0x48 #define TCO_HALT (1 << 11) +#define NO_REBOOT (1 << 10) /* in DevB:3x48 */ -static char banner[] __initdata = KERN_INFO PFX AMDTCO_MODULE_VER; +static char banner[] __initdata = KERN_INFO PFX AMDTCO_MODULE_VER "\n"; static int timeout = 38; static u32 pmbase; /* PMxx I/O base */ static struct pci_dev *dev; static struct semaphore open_sem; -spinlock_t amdtco_lock; /* only for device access */ +static spinlock_t amdtco_lock; /* only for device access */ static int expect_close = 0; MODULE_PARM(timeout, "i"); MODULE_PARM_DESC(timeout, "range is 0-38 seconds, default is 38"); +static inline u8 seconds_to_ticks(int seconds) +{ + /* the internal timer is stored as ticks which decrement + * every 0.6 seconds */ + return (seconds * 10) / 6; +} + +static inline int ticks_to_seconds(u8 ticks) +{ + return (ticks * 6) / 10; +} + static inline int amdtco_status(void) { u16 reg; @@ -81,28 +94,19 @@ static inline void amdtco_ping(void) { - u8 reg; - - spin_lock(&amdtco_lock); - reg = inb(pmbase+TCO_RELOAD_REG); - outb(1 | reg, pmbase+TCO_RELOAD_REG); - spin_unlock(&amdtco_lock); + outb(1, pmbase+TCO_RELOAD_REG); } static inline int amdtco_gettimeout(void) { - return inb(TCO_RELOAD_REG) & TCO_TIMEOUT_MASK; + u8 reg = inb(pmbase+TCO_RELOAD_REG) & TCO_TIMEOUT_MASK; + return ticks_to_seconds(reg); } static inline void amdtco_settimeout(unsigned int timeout) { - u8 reg; - - spin_lock(&amdtco_lock); - reg = inb(pmbase+TCO_INITVAL_REG); - reg |= timeout & TCO_TIMEOUT_MASK; + u8 reg = seconds_to_ticks(timeout) & TCO_TIMEOUT_MASK; outb(reg, pmbase+TCO_INITVAL_REG); - spin_unlock(&amdtco_lock); } static inline void amdtco_global_enable(void) @@ -110,9 +114,12 @@ u16 reg; spin_lock(&amdtco_lock); - reg = inw(pmbase+GLOBAL_SMI_REG); - reg |= TCO_EN; - outw(reg, pmbase+GLOBAL_SMI_REG); + + /* clear NO_REBOOT on DevB:3x48 p97 */ + pci_read_config_word(dev, 0x48, ®); + reg &= ~NO_REBOOT; + pci_write_config_word(dev, 0x48, reg); + spin_unlock(&amdtco_lock); } @@ -150,10 +157,12 @@ if (timeout > MAX_TIMEOUT) timeout = MAX_TIMEOUT; + amdtco_disable(); amdtco_settimeout(timeout); amdtco_global_enable(); + amdtco_enable(); amdtco_ping(); - printk(KERN_INFO PFX "Watchdog enabled, timeout = %d/%d seconds", + printk(KERN_INFO PFX "Watchdog enabled, timeout = %ds of %ds\n", amdtco_gettimeout(), timeout); return 0; @@ -202,7 +211,7 @@ case WDIOC_GETTIMEOUT: return put_user(amdtco_gettimeout(), (int *)arg); - + case WDIOC_SETOPTIONS: if (copy_from_user(&tmp, (int *)arg, sizeof tmp)) return -EFAULT; @@ -225,7 +234,7 @@ printk(KERN_INFO PFX "Watchdog disabled\n"); } else { amdtco_ping(); - printk(KERN_CRIT PFX "Unexpected close!, timeout in %d seconds)\n", timeout); + printk(KERN_CRIT PFX "Unexpected close!, timeout in %d seconds\n", timeout); } up(&open_sem); @@ -253,10 +262,9 @@ } #endif amdtco_ping(); - return len; } - return 0; + return len; } @@ -291,7 +299,6 @@ }; static struct pci_device_id amdtco_pci_tbl[] __initdata = { - /* AMD 766 PCI_IDs here */ { 0x1022, 0x7443, PCI_ANY_ID, PCI_ANY_ID, }, { 0, } }; @@ -361,6 +368,9 @@ if (ints[0] > 0) timeout = ints[1]; + if (!timeout || timeout > 38) + timeout = MAX_TIMEOUT; + return 1; } @@ -370,7 +380,7 @@ module_init(amdtco_init); module_exit(amdtco_exit); -MODULE_AUTHOR("Zwane Mwaikambo "); +MODULE_AUTHOR("Zwane Mwaikambo "); MODULE_DESCRIPTION("AMD 766/768 TCO Timer Driver"); MODULE_LICENSE("GPL"); EXPORT_NO_SYMBOLS; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/console.c linux-2.4.23-pre8/drivers/char/console.c --- linux-2.4.22/drivers/char/console.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/console.c 2003-10-22 22:49:21.000000000 +0000 @@ -112,6 +112,8 @@ const struct consw *conswitchp; +static void __console_callback(void); + /* A bitmap for codes <32. A bit of 1 indicates that the code * corresponding to that bit number invokes some special action * (such as cursor movement) and should not be displayed as a @@ -242,9 +244,16 @@ schedule_console_callback(); } +extern int machine_paniced; + void schedule_console_callback(void) { - schedule_task(&console_callback_tq); + /* Don't care about locking after panic - but I want to switch the console + NOW */ + if (machine_paniced) + __console_callback(); + else + schedule_task(&console_callback_tq); } static void scrup(int currcons, unsigned int t, unsigned int b, int nr) @@ -2039,10 +2048,15 @@ * with other console code and prevention of re-entrancy is * ensured with console_sem. */ -static void console_callback(void *ignored) +static void console_callback(void *unused) { acquire_console_sem(); + __console_callback(); + release_console_sem(); +} +static void __console_callback(void) +{ if (want_console >= 0) { if (want_console != fg_console && vc_cons_allocated(want_console)) { hide_cursor(fg_console); @@ -2064,8 +2078,6 @@ sw->con_scrolldelta(vc_cons[currcons].d, scrollback_delta); scrollback_delta = 0; } - - release_console_sem(); } void set_console(int nr) @@ -2765,6 +2777,12 @@ timer_do_blank_screen(0, 1); } +void disable_console_blank(void) +{ + del_timer_sync(&console_timer); + blankinterval = 0; +} + void poke_blanked_console(void) { del_timer(&console_timer); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/Config.in linux-2.4.23-pre8/drivers/char/drm/Config.in --- linux-2.4.22/drivers/char/drm/Config.in 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/Config.in 2003-10-22 22:49:37.000000000 +0000 @@ -6,11 +6,15 @@ # tristate ' 3dfx Banshee/Voodoo3+' CONFIG_DRM_TDFX -#tristate ' 3dlabs GMX 2000' CONFIG_DRM_GAMMA +tristate ' 3dlabs GMX 2000' CONFIG_DRM_GAMMA tristate ' ATI Rage 128' CONFIG_DRM_R128 -dep_tristate ' ATI Radeon' CONFIG_DRM_RADEON $CONFIG_AGP +tristate ' ATI Radeon' CONFIG_DRM_RADEON dep_tristate ' Intel I810' CONFIG_DRM_I810 $CONFIG_AGP dep_mbool ' Enabled XFree 4.1 ioctl interface by default' CONFIG_DRM_I810_XFREE_41 $CONFIG_DRM_I810 dep_tristate ' Intel 830M' CONFIG_DRM_I830 $CONFIG_AGP dep_tristate ' Matrox g200/g400' CONFIG_DRM_MGA $CONFIG_AGP dep_tristate ' SiS' CONFIG_DRM_SIS $CONFIG_AGP +# +# Not ready yet. XFree DRI folks have to fix this up. +# dep_tristate ' S3 Savage' CONFIG_DRM_SAVAGE $CONFIG_AGP +# dep_tristate ' VIA CLE266' CONFIG_DRM_VIA $CONFIG_AGP diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/Makefile linux-2.4.23-pre8/drivers/char/drm/Makefile --- linux-2.4.22/drivers/char/drm/Makefile 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/Makefile 2003-10-22 22:49:43.000000000 +0000 @@ -3,18 +3,20 @@ # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. O_TARGET := drm.o -list-multi := gamma.o tdfx.o r128.o mga.o i810.o i830.o radeon.o ffb.o sis.o +list-multi := gamma.o tdfx.o r128.o mga.o i810.o i830.o radeon.o ffb.o sis.o savage.o gamma-objs := gamma_drv.o gamma_dma.o tdfx-objs := tdfx_drv.o r128-objs := r128_drv.o r128_cce.o r128_state.o mga-objs := mga_drv.o mga_dma.o mga_state.o mga_warp.o i810-objs := i810_drv.o i810_dma.o -i830-objs := i830_drv.o i830_dma.o - -radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o +i830-objs := i830_drv.o i830_dma.o i830_irq.o +savage-objs := savage_dma.o savage_drv.o savage_state.o +radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o ffb-objs := ffb_drv.o ffb_context.o sis-objs := sis_drv.o sis_ds.o sis_mm.o +via-objs := via_drv.o via_ds.o via_map.o via_mm.o + obj-$(CONFIG_DRM_GAMMA) += gamma.o obj-$(CONFIG_DRM_TDFX) += tdfx.o @@ -25,6 +27,8 @@ obj-$(CONFIG_DRM_I830) += i830.o obj-$(CONFIG_DRM_FFB) += ffb.o obj-$(CONFIG_DRM_SIS) += sis.o +obj-$(CONFIG_DRM_SAVAGE) += savage.o +obj-$(CONFIG_DRM_VIA) += via.o include $(TOPDIR)/Rules.make @@ -54,3 +58,9 @@ sis.o: $(sis-objs) $(lib) $(LD) -r -o $@ $(sis-objs) $(lib) + +savage.o: $(savage-objs) $(lib) + $(LD) -r -o $@ $(savage-objs) $(lib) + +via.o: $(via-objs) $(lib) + $(LD) -r -o $@ $(via-objs) $(lib) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm.h linux-2.4.23-pre8/drivers/char/drm/drm.h --- linux-2.4.22/drivers/char/drm/drm.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm.h 2003-10-22 22:48:12.000000000 +0000 @@ -38,10 +38,27 @@ #if defined(__linux__) #include #include /* For _IO* macros */ -#define DRM_IOCTL_NR(n) _IOC_NR(n) -#elif defined(__FreeBSD__) +#define DRM_IOCTL_NR(n) _IOC_NR(n) +#define DRM_IOC_VOID _IOC_NONE +#define DRM_IOC_READ _IOC_READ +#define DRM_IOC_WRITE _IOC_WRITE +#define DRM_IOC_READWRITE _IOC_READ|_IOC_WRITE +#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size) +#elif defined(__FreeBSD__) || defined(__NetBSD__) +#if defined(__FreeBSD__) && defined(XFree86Server) +/* Prevent name collision when including sys/ioccom.h */ +#undef ioctl #include -#define DRM_IOCTL_NR(n) ((n) & 0xff) +#define ioctl(a,b,c) xf86ioctl(a,b,c) +#else +#include +#endif /* __FreeBSD__ && xf86ioctl */ +#define DRM_IOCTL_NR(n) ((n) & 0xff) +#define DRM_IOC_VOID IOC_VOID +#define DRM_IOC_READ IOC_OUT +#define DRM_IOC_WRITE IOC_IN +#define DRM_IOC_READWRITE IOC_INOUT +#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size) #endif #define XFREE86_VERSION(major,minor,patch,snap) \ @@ -84,6 +101,10 @@ /* Warning: If you change this structure, make sure you change * XF86DRIClipRectRec in the server as well */ +/* KW: Actually it's illegal to change either for + * backwards-compatibility reasons. + */ + typedef struct drm_clip_rect { unsigned short x1; unsigned short y1; @@ -106,6 +127,8 @@ #include "radeon_drm.h" #include "sis_drm.h" #include "i830_drm.h" +#include "savage_drm.h" +#include "via_drm.h" typedef struct drm_version { int version_major; /* Major version */ @@ -332,6 +355,32 @@ int funcnum; } drm_irq_busid_t; +typedef enum { + _DRM_VBLANK_ABSOLUTE = 0x0, /* Wait for specific vblank sequence number */ + _DRM_VBLANK_RELATIVE = 0x1, /* Wait for given number of vblanks */ + _DRM_VBLANK_SIGNAL = 0x40000000 /* Send signal instead of blocking */ +} drm_vblank_seq_type_t; + +#define _DRM_VBLANK_FLAGS_MASK _DRM_VBLANK_SIGNAL + +struct drm_wait_vblank_request { + drm_vblank_seq_type_t type; + unsigned int sequence; + unsigned long signal; +}; + +struct drm_wait_vblank_reply { + drm_vblank_seq_type_t type; + unsigned int sequence; + long tval_sec; + long tval_usec; +}; + +typedef union drm_wait_vblank { + struct drm_wait_vblank_request request; + struct drm_wait_vblank_reply reply; +} drm_wait_vblank_t; + typedef struct drm_agp_mode { unsigned long mode; } drm_agp_mode_t; @@ -371,10 +420,9 @@ #define DRM_IOCTL_BASE 'd' #define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr) -#define DRM_IOR(nr,size) _IOR(DRM_IOCTL_BASE,nr,size) -#define DRM_IOW(nr,size) _IOW(DRM_IOCTL_BASE,nr,size) -#define DRM_IOWR(nr,size) _IOWR(DRM_IOCTL_BASE,nr,size) - +#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE,nr,type) +#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE,nr,type) +#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE,nr,type) #define DRM_IOCTL_VERSION DRM_IOWR(0x00, drm_version_t) #define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm_unique_t) @@ -427,86 +475,10 @@ #define DRM_IOCTL_SG_ALLOC DRM_IOW( 0x38, drm_scatter_gather_t) #define DRM_IOCTL_SG_FREE DRM_IOW( 0x39, drm_scatter_gather_t) -/* MGA specific ioctls */ -#define DRM_IOCTL_MGA_INIT DRM_IOW( 0x40, drm_mga_init_t) -#define DRM_IOCTL_MGA_FLUSH DRM_IOW( 0x41, drm_lock_t) -#define DRM_IOCTL_MGA_RESET DRM_IO( 0x42) -#define DRM_IOCTL_MGA_SWAP DRM_IO( 0x43) -#define DRM_IOCTL_MGA_CLEAR DRM_IOW( 0x44, drm_mga_clear_t) -#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x45, drm_mga_vertex_t) -#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x46, drm_mga_indices_t) -#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x47, drm_mga_iload_t) -#define DRM_IOCTL_MGA_BLIT DRM_IOW( 0x48, drm_mga_blit_t) - -/* i810 specific ioctls */ -#define DRM_IOCTL_I810_INIT DRM_IOW( 0x40, drm_i810_init_t) -#define DRM_IOCTL_I810_VERTEX DRM_IOW( 0x41, drm_i810_vertex_t) -#define DRM_IOCTL_I810_CLEAR DRM_IOW( 0x42, drm_i810_clear_t) -#define DRM_IOCTL_I810_FLUSH DRM_IO( 0x43) -#define DRM_IOCTL_I810_GETAGE DRM_IO( 0x44) -#define DRM_IOCTL_I810_GETBUF DRM_IOWR(0x45, drm_i810_dma_t) -#define DRM_IOCTL_I810_SWAP DRM_IO( 0x46) -#define DRM_IOCTL_I810_COPY DRM_IOW( 0x47, drm_i810_copy_t) -#define DRM_IOCTL_I810_DOCOPY DRM_IO( 0x48) -#define DRM_IOCTL_I810_OV0INFO DRM_IOR( 0x49, drm_i810_overlay_t) -#define DRM_IOCTL_I810_FSTATUS DRM_IO ( 0x4a) -#define DRM_IOCTL_I810_OV0FLIP DRM_IO ( 0x4b) -#define DRM_IOCTL_I810_MC DRM_IOW( 0x4c, drm_i810_mc_t) -#define DRM_IOCTL_I810_RSTATUS DRM_IO ( 0x4d ) - - -/* Rage 128 specific ioctls */ -#define DRM_IOCTL_R128_INIT DRM_IOW( 0x40, drm_r128_init_t) -#define DRM_IOCTL_R128_CCE_START DRM_IO( 0x41) -#define DRM_IOCTL_R128_CCE_STOP DRM_IOW( 0x42, drm_r128_cce_stop_t) -#define DRM_IOCTL_R128_CCE_RESET DRM_IO( 0x43) -#define DRM_IOCTL_R128_CCE_IDLE DRM_IO( 0x44) -#define DRM_IOCTL_R128_RESET DRM_IO( 0x46) -#define DRM_IOCTL_R128_SWAP DRM_IO( 0x47) -#define DRM_IOCTL_R128_CLEAR DRM_IOW( 0x48, drm_r128_clear_t) -#define DRM_IOCTL_R128_VERTEX DRM_IOW( 0x49, drm_r128_vertex_t) -#define DRM_IOCTL_R128_INDICES DRM_IOW( 0x4a, drm_r128_indices_t) -#define DRM_IOCTL_R128_BLIT DRM_IOW( 0x4b, drm_r128_blit_t) -#define DRM_IOCTL_R128_DEPTH DRM_IOW( 0x4c, drm_r128_depth_t) -#define DRM_IOCTL_R128_STIPPLE DRM_IOW( 0x4d, drm_r128_stipple_t) -#define DRM_IOCTL_R128_INDIRECT DRM_IOWR(0x4f, drm_r128_indirect_t) -#define DRM_IOCTL_R128_FULLSCREEN DRM_IOW( 0x50, drm_r128_fullscreen_t) - -/* Radeon specific ioctls */ -#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( 0x40, drm_radeon_init_t) -#define DRM_IOCTL_RADEON_CP_START DRM_IO( 0x41) -#define DRM_IOCTL_RADEON_CP_STOP DRM_IOW( 0x42, drm_radeon_cp_stop_t) -#define DRM_IOCTL_RADEON_CP_RESET DRM_IO( 0x43) -#define DRM_IOCTL_RADEON_CP_IDLE DRM_IO( 0x44) -#define DRM_IOCTL_RADEON_RESET DRM_IO( 0x45) -#define DRM_IOCTL_RADEON_FULLSCREEN DRM_IOW( 0x46, drm_radeon_fullscreen_t) -#define DRM_IOCTL_RADEON_SWAP DRM_IO( 0x47) -#define DRM_IOCTL_RADEON_CLEAR DRM_IOW( 0x48, drm_radeon_clear_t) -#define DRM_IOCTL_RADEON_VERTEX DRM_IOW( 0x49, drm_radeon_vertex_t) -#define DRM_IOCTL_RADEON_INDICES DRM_IOW( 0x4a, drm_radeon_indices_t) -#define DRM_IOCTL_RADEON_STIPPLE DRM_IOW( 0x4c, drm_radeon_stipple_t) -#define DRM_IOCTL_RADEON_INDIRECT DRM_IOWR(0x4d, drm_radeon_indirect_t) -#define DRM_IOCTL_RADEON_TEXTURE DRM_IOWR(0x4e, drm_radeon_texture_t) - -/* SiS specific ioctls */ -#define SIS_IOCTL_FB_ALLOC DRM_IOWR(0x44, drm_sis_mem_t) -#define SIS_IOCTL_FB_FREE DRM_IOW( 0x45, drm_sis_mem_t) -#define SIS_IOCTL_AGP_INIT DRM_IOWR(0x53, drm_sis_agp_t) -#define SIS_IOCTL_AGP_ALLOC DRM_IOWR(0x54, drm_sis_mem_t) -#define SIS_IOCTL_AGP_FREE DRM_IOW( 0x55, drm_sis_mem_t) -#define SIS_IOCTL_FLIP DRM_IOW( 0x48, drm_sis_flip_t) -#define SIS_IOCTL_FLIP_INIT DRM_IO( 0x49) -#define SIS_IOCTL_FLIP_FINAL DRM_IO( 0x50) - -/* I830 specific ioctls */ -#define DRM_IOCTL_I830_INIT DRM_IOW( 0x40, drm_i830_init_t) -#define DRM_IOCTL_I830_VERTEX DRM_IOW( 0x41, drm_i830_vertex_t) -#define DRM_IOCTL_I830_CLEAR DRM_IOW( 0x42, drm_i830_clear_t) -#define DRM_IOCTL_I830_FLUSH DRM_IO ( 0x43) -#define DRM_IOCTL_I830_GETAGE DRM_IO ( 0x44) -#define DRM_IOCTL_I830_GETBUF DRM_IOWR(0x45, drm_i830_dma_t) -#define DRM_IOCTL_I830_SWAP DRM_IO ( 0x46) -#define DRM_IOCTL_I830_COPY DRM_IOW( 0x47, drm_i830_copy_t) -#define DRM_IOCTL_I830_DOCOPY DRM_IO ( 0x48) +#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, drm_wait_vblank_t) + +/* Device specfic ioctls should only be in their respective headers + * The device specific ioctl range is 0x40 to 0x79. */ +#define DRM_COMMAND_BASE 0x40 #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drmP.h linux-2.4.23-pre8/drivers/char/drm/drmP.h --- linux-2.4.22/drivers/char/drm/drmP.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drmP.h 2003-10-22 22:49:14.000000000 +0000 @@ -53,6 +53,7 @@ #include #include /* For (un)lock_kernel */ #include +#include #if defined(__alpha__) || defined(__powerpc__) #include /* For pte_wrprotect */ #endif @@ -71,10 +72,7 @@ #include #include "drm.h" -/* page_to_bus for earlier kernels, not optimal in all cases */ -#ifndef page_to_bus -#define page_to_bus(page) ((unsigned int)(virt_to_bus(page_address(page)))) -#endif +#include "drm_os_linux.h" /* DRM template customization defaults */ @@ -209,6 +207,7 @@ (unsigned long)(n),sizeof(*(ptr)))) #endif /* i386 & alpha */ #endif +#define __REALLY_HAVE_SG (__HAVE_SG) /* Begin the DRM... */ @@ -251,41 +250,58 @@ #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8) -#define VM_OFFSET(vma) ((vma)->vm_pgoff << PAGE_SHIFT) + /* Backward compatibility section */ +#ifndef minor +#define minor(x) MINOR((x)) +#endif -/* Macros to make printk easier */ +#ifndef MODULE_LICENSE +#define MODULE_LICENSE(x) +#endif -#if ( __GNUC__ > 2 ) -#define DRM_ERROR(fmt, arg...) \ - printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __FUNCTION__, ##arg) -#define DRM_MEM_ERROR(area, fmt, arg...) \ - printk(KERN_ERR "[" DRM_NAME ":%s:%s] *ERROR* " fmt , __FUNCTION__, \ - DRM(mem_stats)[area].name , ##arg) -#define DRM_INFO(fmt, arg...) printk(KERN_INFO "[" DRM_NAME "] " fmt , ##arg) +#ifndef pte_offset_map +#define pte_offset_map pte_offset +#define pte_unmap(pte) +#endif -#if DRM_DEBUG_CODE -#define DRM_DEBUG(fmt, arg...) \ - do { \ - if ( DRM(flags) & DRM_FLAG_DEBUG ) \ - printk(KERN_DEBUG \ - "[" DRM_NAME ":%s] " fmt , \ - __FUNCTION__, \ - ##arg); \ - } while (0) +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,19) +static inline struct page * vmalloc_to_page(void * vmalloc_addr) +{ + unsigned long addr = (unsigned long) vmalloc_addr; + struct page *page = NULL; + pgd_t *pgd = pgd_offset_k(addr); + pmd_t *pmd; + pte_t *ptep, pte; + + if (!pgd_none(*pgd)) { + pmd = pmd_offset(pgd, addr); + if (!pmd_none(*pmd)) { + ptep = pte_offset_map(pmd, addr); + pte = *ptep; + if (pte_present(pte)) + page = pte_page(pte); + pte_unmap(ptep); + } + } + return page; +} +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) +#define DRM_RPR_ARG(vma) #else -#define DRM_DEBUG(fmt, arg...) do { } while (0) +#define DRM_RPR_ARG(vma) vma, #endif -#else /* Gcc 2.x */ -/* Work around a C preprocessor bug */ +#define VM_OFFSET(vma) ((vma)->vm_pgoff << PAGE_SHIFT) /* Macros to make printk easier */ #define DRM_ERROR(fmt, arg...) \ - printk(KERN_ERR "[" DRM_NAME ":" __FUNCTION__ "] *ERROR* " fmt , ##arg) + printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __FUNCTION__ , ##arg) #define DRM_MEM_ERROR(area, fmt, arg...) \ - printk(KERN_ERR "[" DRM_NAME ":" __FUNCTION__ ":%s] *ERROR* " fmt , \ + printk(KERN_ERR "[" DRM_NAME ":%s:%s] *ERROR* " fmt , __FUNCTION__, \ DRM(mem_stats)[area].name , ##arg) #define DRM_INFO(fmt, arg...) printk(KERN_INFO "[" DRM_NAME "] " fmt , ##arg) @@ -294,16 +310,13 @@ do { \ if ( DRM(flags) & DRM_FLAG_DEBUG ) \ printk(KERN_DEBUG \ - "[" DRM_NAME ":" __FUNCTION__ "] " fmt , \ - ##arg); \ + "[" DRM_NAME ":%s] " fmt , \ + __FUNCTION__ , ##arg); \ } while (0) #else #define DRM_DEBUG(fmt, arg...) do { } while (0) #endif -#endif /* Gcc 2.x */ - - #define DRM_PROC_LIMIT (PAGE_SIZE-80) #define DRM_PROC_PRINT(fmt, arg...) \ @@ -318,6 +331,9 @@ #define DRM_IOREMAP(map) \ (map)->handle = DRM(ioremap)( (map)->offset, (map)->size ) +#define DRM_IOREMAP_NOCACHE(map) \ + (map)->handle = DRM(ioremap_nocache)((map)->offset, (map)->size) + #define DRM_IOREMAPFREE(map) \ do { \ if ( (map)->handle && (map)->size ) \ @@ -599,6 +615,17 @@ drm_map_t *map; } drm_map_list_t; +#if __HAVE_VBL_IRQ + +typedef struct drm_vbl_sig { + struct list_head head; + unsigned int sequence; + struct siginfo info; + struct task_struct *task; +} drm_vbl_sig_t; + +#endif + typedef struct drm_device { const char *name; /* Simple driver name */ char *unique; /* Unique identifier: e.g., busid */ @@ -658,6 +685,13 @@ int last_context; /* Last current context */ unsigned long last_switch; /* jiffies at last context switch */ struct tq_struct tq; +#if __HAVE_VBL_IRQ + wait_queue_head_t vbl_queue; + atomic_t vbl_received; + spinlock_t vbl_lock; + drm_vbl_sig_t vbl_sigs; + unsigned int vbl_pending; +#endif cycles_t ctx_start; cycles_t lck_start; #if __HAVE_DMA_HISTOGRAM @@ -725,16 +759,16 @@ /* Mapping support (drm_vm.h) */ extern struct page *DRM(vm_nopage)(struct vm_area_struct *vma, unsigned long address, - int unused); + int write_access); extern struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma, unsigned long address, - int unused); + int write_access); extern struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma, unsigned long address, - int unused); + int write_access); extern struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma, unsigned long address, - int unused); + int write_access); extern void DRM(vm_open)(struct vm_area_struct *vma); extern void DRM(vm_close)(struct vm_area_struct *vma); extern void DRM(vm_shm_close)(struct vm_area_struct *vma); @@ -756,6 +790,7 @@ extern void DRM(free_pages)(unsigned long address, int order, int area); extern void *DRM(ioremap)(unsigned long offset, unsigned long size); +extern void *DRM(ioremap_nocache)(unsigned long offset, unsigned long size); extern void DRM(ioremapfree)(void *pt, unsigned long size); #if __REALLY_HAVE_AGP @@ -885,6 +920,15 @@ extern int DRM(irq_uninstall)( drm_device_t *dev ); extern void DRM(dma_service)( int irq, void *device, struct pt_regs *regs ); +extern void DRM(driver_irq_preinstall)( drm_device_t *dev ); +extern void DRM(driver_irq_postinstall)( drm_device_t *dev ); +extern void DRM(driver_irq_uninstall)( drm_device_t *dev ); +#if __HAVE_VBL_IRQ +extern int DRM(wait_vblank)(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); +extern int DRM(vblank_wait)(drm_device_t *dev, unsigned int *vbl_seq); +extern void DRM(vbl_send_signals)( drm_device_t *dev ); +#endif #if __HAVE_DMA_IRQ_BH extern void DRM(dma_immediate_bh)( void *dev ); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_agpsupport.h linux-2.4.23-pre8/drivers/char/drm/drm_agpsupport.h --- linux-2.4.22/drivers/char/drm/drm_agpsupport.h 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_agpsupport.h 2003-10-22 22:47:28.000000000 +0000 @@ -73,9 +73,14 @@ drm_device_t *dev = priv->dev; int retcode; - if (!dev->agp || dev->agp->acquired || !drm_agp->acquire) + if (!dev->agp) + return -ENODEV; + if (dev->agp->acquired) + return -EBUSY; + if(!drm_agp->acquire) return -EINVAL; - if ((retcode = drm_agp->acquire())) return retcode; + if (retcode = drm_agp->acquire()) + return retcode; dev->agp->acquired = 1; return 0; } @@ -259,67 +264,13 @@ return NULL; } head->memory = NULL; - switch (head->agp_info.chipset) { - case INTEL_GENERIC: head->chipset = "Intel"; break; - case INTEL_LX: head->chipset = "Intel 440LX"; break; - case INTEL_BX: head->chipset = "Intel 440BX"; break; - case INTEL_GX: head->chipset = "Intel 440GX"; break; - case INTEL_I810: head->chipset = "Intel i810"; break; - case INTEL_I815: head->chipset = "Intel i815"; break; - case INTEL_I820: head->chipset = "Intel i820"; break; - case INTEL_I840: head->chipset = "Intel i840"; break; - case INTEL_I845: head->chipset = "Intel i845"; break; - case INTEL_I850: head->chipset = "Intel i850"; break; - - case VIA_GENERIC: head->chipset = "VIA"; break; - case VIA_VP3: head->chipset = "VIA VP3"; break; - case VIA_MVP3: head->chipset = "VIA MVP3"; break; - case VIA_MVP4: head->chipset = "VIA MVP4"; break; - case VIA_APOLLO_KX133: head->chipset = "VIA Apollo KX133"; - break; - case VIA_APOLLO_KT133: head->chipset = "VIA Apollo KT133"; - break; - case VIA_APOLLO_KT400: head->chipset = "VIA Apollo KT400"; - break; - case VIA_APOLLO_PRO: head->chipset = "VIA Apollo Pro"; - break; - case VIA_APOLLO_P4X400: head->chipset = "VIA Apollo P4X400"; - break; - - case SIS_GENERIC: head->chipset = "SiS"; break; - case AMD_GENERIC: head->chipset = "AMD"; break; - case AMD_IRONGATE: head->chipset = "AMD Irongate"; break; - case AMD_8151: head->chipset = "AMD 8151"; break; - case ALI_GENERIC: head->chipset = "ALi"; break; - case ALI_M1541: head->chipset = "ALi M1541"; break; - - case ALI_M1621: head->chipset = "ALi M1621"; break; - case ALI_M1631: head->chipset = "ALi M1631"; break; - case ALI_M1632: head->chipset = "ALi M1632"; break; - case ALI_M1641: head->chipset = "ALi M1641"; break; - case ALI_M1644: head->chipset = "ALi M1644"; break; - case ALI_M1647: head->chipset = "ALi M1647"; break; - case ALI_M1651: head->chipset = "ALi M1651"; break; - - case SVWRKS_HE: head->chipset = "Serverworks HE"; - break; - case SVWRKS_LE: head->chipset = "Serverworks LE"; - break; - case SVWRKS_GENERIC: head->chipset = "Serverworks Generic"; - break; - - case HP_ZX1: head->chipset = "HP ZX1"; break; - - default: head->chipset = "Unknown"; break; - } head->cant_use_aperture = head->agp_info.cant_use_aperture; head->page_mask = head->agp_info.page_mask; - DRM_INFO("AGP %d.%d on %s @ 0x%08lx %ZuMB\n", + DRM_INFO("AGP %d.%d Aperture @ 0x%08lx %ZuMB\n", head->agp_info.version.major, head->agp_info.version.minor, - head->chipset, head->agp_info.aper_base, head->agp_info.aper_size); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_bufs.h linux-2.4.23-pre8/drivers/char/drm/drm_bufs.h --- linux-2.4.22/drivers/char/drm/drm_bufs.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_bufs.h 2003-10-22 22:48:11.000000000 +0000 @@ -136,6 +136,7 @@ } map->offset = (unsigned long)map->handle; if ( map->flags & _DRM_CONTAINS_LOCK ) { + dev->sigdata.lock = dev->lock.hw_lock = map->handle; /* Pointer to lock */ } break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_context.h linux-2.4.23-pre8/drivers/char/drm/drm_context.h --- linux-2.4.22/drivers/char/drm/drm_context.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_context.h 2003-10-22 22:47:28.000000000 +0000 @@ -554,7 +554,7 @@ /* Allocate a new queue */ down(&dev->struct_sem); - queue = gamma_alloc(sizeof(*queue), DRM_MEM_QUEUES); + queue = DRM(alloc)(sizeof(*queue), DRM_MEM_QUEUES); memset(queue, 0, sizeof(*queue)); atomic_set(&queue->use_count, 1); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_dma.h linux-2.4.23-pre8/drivers/char/drm/drm_dma.h --- linux-2.4.22/drivers/char/drm/drm_dma.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_dma.h 2003-10-22 22:49:07.000000000 +0000 @@ -30,7 +30,7 @@ */ #include "drmP.h" - +#include "drm_os_linux.h" #include /* For task queue support */ #ifndef __HAVE_DMA_WAITQUEUE @@ -537,8 +537,18 @@ dev->tq.data = dev; #endif +#if __HAVE_VBL_IRQ + init_waitqueue_head(&dev->vbl_queue); + + spin_lock_init( &dev->vbl_lock ); + + INIT_LIST_HEAD( &dev->vbl_sigs.head ); + + dev->vbl_pending = 0; +#endif + /* Before installing handler */ - DRIVER_PREINSTALL(); + DRM(driver_irq_preinstall)(dev); /* Install handler */ ret = request_irq( dev->irq, DRM(dma_service), @@ -551,7 +561,7 @@ } /* After installing handler */ - DRIVER_POSTINSTALL(); + DRM(driver_irq_postinstall)(dev); return 0; } @@ -570,7 +580,7 @@ DRM_DEBUG( "%s: irq=%d\n", __FUNCTION__, irq ); - DRIVER_UNINSTALL(); + DRM(driver_irq_uninstall)( dev ); free_irq( irq, dev ); @@ -597,6 +607,142 @@ } } +#if __HAVE_VBL_IRQ + +int DRM(wait_vblank)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_wait_vblank_t vblwait; + struct timeval now; + int ret = 0; + unsigned int flags; + + if (!dev->irq) + return -EINVAL; + + DRM_COPY_FROM_USER_IOCTL( vblwait, (drm_wait_vblank_t *)data, + sizeof(vblwait) ); + + switch ( vblwait.request.type & ~_DRM_VBLANK_FLAGS_MASK ) { + case _DRM_VBLANK_RELATIVE: + vblwait.request.sequence += atomic_read( &dev->vbl_received ); + vblwait.request.type &= ~_DRM_VBLANK_RELATIVE; + case _DRM_VBLANK_ABSOLUTE: + break; + default: + return -EINVAL; + } + + flags = vblwait.request.type & _DRM_VBLANK_FLAGS_MASK; + + if ( flags & _DRM_VBLANK_SIGNAL ) { + unsigned long irqflags; + drm_vbl_sig_t *vbl_sig; + + vblwait.reply.sequence = atomic_read( &dev->vbl_received ); + + spin_lock_irqsave( &dev->vbl_lock, irqflags ); + + /* Check if this task has already scheduled the same signal + * for the same vblank sequence number; nothing to be done in + * that case + */ + list_for_each( ( (struct list_head *) vbl_sig ), &dev->vbl_sigs.head ) { + if (vbl_sig->sequence == vblwait.request.sequence + && vbl_sig->info.si_signo == vblwait.request.signal + && vbl_sig->task == current) + { + spin_unlock_irqrestore( &dev->vbl_lock, irqflags ); + goto done; + } + } + + if ( dev->vbl_pending >= 100 ) { + spin_unlock_irqrestore( &dev->vbl_lock, irqflags ); + return -EBUSY; + } + + dev->vbl_pending++; + + spin_unlock_irqrestore( &dev->vbl_lock, irqflags ); + + if ( !( vbl_sig = kmalloc(sizeof(drm_vbl_sig_t), GFP_KERNEL) ) ) + return -ENOMEM; + + + memset( (void *)vbl_sig, 0, sizeof(*vbl_sig) ); + + vbl_sig->sequence = vblwait.request.sequence; + vbl_sig->info.si_signo = vblwait.request.signal; + vbl_sig->task = current; + + spin_lock_irqsave( &dev->vbl_lock, irqflags ); + + list_add_tail( (struct list_head *) vbl_sig, &dev->vbl_sigs.head ); + + spin_unlock_irqrestore( &dev->vbl_lock, irqflags ); + } else { + ret = DRM(vblank_wait)( dev, &vblwait.request.sequence ); + + do_gettimeofday( &now ); + vblwait.reply.tval_sec = now.tv_sec; + vblwait.reply.tval_usec = now.tv_usec; + } + +done: + DRM_COPY_TO_USER_IOCTL( (drm_wait_vblank_t *)data, vblwait, + sizeof(vblwait) ); + + return ret; +} + +void DRM(vbl_send_signals)( drm_device_t *dev ) +{ + struct list_head *tmp; + drm_vbl_sig_t *vbl_sig; + unsigned int vbl_seq = atomic_read( &dev->vbl_received ); + unsigned long flags; + + spin_lock_irqsave( &dev->vbl_lock, flags ); + + list_for_each_safe( ( (struct list_head *) vbl_sig ), tmp, &dev->vbl_sigs.head ) { + if ( ( vbl_seq - vbl_sig->sequence ) <= (1<<23) ) { + vbl_sig->info.si_code = vbl_seq; + send_sig_info( vbl_sig->info.si_signo, &vbl_sig->info, vbl_sig->task ); + + list_del( (struct list_head *) vbl_sig ); + + + kfree( vbl_sig ); + dev->vbl_pending--; + } + } + + spin_unlock_irqrestore( &dev->vbl_lock, flags ); +} + +#endif /* __HAVE_VBL_IRQ */ + +#else + +int DRM(control)( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ) +{ + drm_control_t ctl; + + if ( copy_from_user( &ctl, (drm_control_t *)arg, sizeof(ctl) ) ) + return -EFAULT; + + switch ( ctl.func ) { + case DRM_INST_HANDLER: + case DRM_UNINST_HANDLER: + return 0; + default: + return -EINVAL; + } +} + #endif /* __HAVE_DMA_IRQ */ #endif /* __HAVE_DMA */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_drv.h linux-2.4.23-pre8/drivers/char/drm/drm_drv.h --- linux-2.4.22/drivers/char/drm/drm_drv.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_drv.h 2003-10-22 22:48:17.000000000 +0000 @@ -115,18 +115,34 @@ #ifndef DRIVER_FOPS #define DRIVER_FOPS \ static struct file_operations DRM(fops) = { \ - owner: THIS_MODULE, \ - open: DRM(open), \ - flush: DRM(flush), \ - release: DRM(release), \ - ioctl: DRM(ioctl), \ - mmap: DRM(mmap), \ - read: DRM(read), \ - fasync: DRM(fasync), \ - poll: DRM(poll), \ + .owner = THIS_MODULE, \ + .open = DRM(open), \ + .flush = DRM(flush), \ + .release = DRM(release), \ + .ioctl = DRM(ioctl), \ + .mmap = DRM(mmap), \ + .read = DRM(read), \ + .fasync = DRM(fasync), \ + .poll = DRM(poll), \ } #endif +#ifndef MODULE +/* DRM(options) is called by the kernel to parse command-line options + * passed via the boot-loader (e.g., LILO). It calls the insmod option + * routine, drm_parse_drm. + */ +/* Use an additional macro to avoid preprocessor troubles */ +#define DRM_OPTIONS_FUNC DRM(options) +static int __init DRM(options)( char *str ) +{ + DRM(parse_options)( str ); + return 1; +} + +__setup( DRIVER_NAME "=", DRM_OPTIONS_FUNC ); +#undef DRM_OPTIONS_FUNC +#endif /* * The default number of instances (minor numbers) to initialize. @@ -187,10 +203,8 @@ /* The DRM_IOCTL_DMA ioctl should be defined by the driver. */ -#if __HAVE_DMA_IRQ [DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = { DRM(control), 1, 1 }, #endif -#endif #if __REALLY_HAVE_AGP [DRM_IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE)] = { DRM(agp_acquire), 1, 1 }, @@ -208,6 +222,10 @@ [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)] = { DRM(sg_free), 1, 1 }, #endif +#if __HAVE_VBL_IRQ + [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK)] = { DRM(wait_vblank), 0, 0 }, +#endif + DRIVER_IOCTLS }; @@ -292,7 +310,7 @@ dev->map_count = 0; dev->vmalist = NULL; - dev->lock.hw_lock = NULL; + dev->sigdata.lock = dev->lock.hw_lock = NULL; init_waitqueue_head( &dev->lock.lock_queue ); dev->queue_count = 0; dev->queue_reserved = 0; @@ -477,7 +495,7 @@ DRM(dma_takedown)( dev ); #endif if ( dev->lock.hw_lock ) { - dev->lock.hw_lock = NULL; /* SHM removed */ + dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */ dev->lock.pid = 0; wake_up_interruptible( &dev->lock.lock_queue ); } @@ -705,7 +723,7 @@ int i; for (i = 0; i < DRM(numdevs); i++) { - if (MINOR(inode->i_rdev) == DRM(minor)[i]) { + if (minor(inode->i_rdev) == DRM(minor)[i]) { dev = &(DRM(device)[i]); break; } @@ -747,8 +765,8 @@ * Begin inline drm_release */ - DRM_DEBUG( "pid = %d, device = 0x%x, open_count = %d\n", - current->pid, dev->device, dev->open_count ); + DRM_DEBUG( "pid = %d, device = 0x%lx, open_count = %d\n", + current->pid, (long)dev->device, dev->open_count ); if ( dev->lock.hw_lock && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) && @@ -873,8 +891,9 @@ atomic_inc( &dev->counts[_DRM_STAT_IOCTLS] ); ++priv->ioctl_count; - DRM_DEBUG( "pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%x, auth=%d\n", - current->pid, cmd, nr, dev->device, priv->authenticated ); + DRM_DEBUG( "pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n", + current->pid, cmd, nr, (long)dev->device, + priv->authenticated ); if ( nr >= DRIVER_IOCTL_COUNT ) { retcode = -EINVAL; @@ -1027,6 +1046,25 @@ atomic_inc( &dev->counts[_DRM_STAT_UNLOCKS] ); +#if __HAVE_KERNEL_CTX_SWITCH + /* We no longer really hold it, but if we are the next + * agent to request it then we should just be able to + * take it immediately and not eat the ioctl. + */ + dev->lock.pid = 0; + { + __volatile__ unsigned int *plock = &dev->lock.hw_lock->lock; + unsigned int old, new, prev, ctx; + + ctx = lock.context; + do { + old = *plock; + new = ctx; + prev = cmpxchg(plock, old, new); + } while (prev != old); + } + wake_up_interruptible(&dev->lock.lock_queue); +#else DRM(lock_transfer)( dev, &dev->lock.hw_lock->lock, DRM_KERNEL_CONTEXT ); #if __HAVE_DMA_SCHEDULE @@ -1041,6 +1079,7 @@ DRM_ERROR( "\n" ); } } +#endif /* !__HAVE_KERNEL_CTX_SWITCH */ unblock_all_signals(); return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_fops.h linux-2.4.23-pre8/drivers/char/drm/drm_fops.h --- linux-2.4.22/drivers/char/drm/drm_fops.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_fops.h 2003-10-22 22:47:29.000000000 +0000 @@ -37,7 +37,7 @@ int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev) { - kdev_t minor = MINOR(inode->i_rdev); + int minor = minor(inode->i_rdev); drm_file_t *priv; if (filp->f_flags & O_EXCL) return -EBUSY; /* No exclusive opens */ @@ -94,25 +94,8 @@ drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->dev; - DRM_DEBUG("pid = %d, device = 0x%x, open_count = %d\n", - current->pid, dev->device, dev->open_count); - if ( dev->lock.hw_lock && - _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) && - dev->lock.pid == current->pid ) { - DRM_DEBUG( "Process %d closed fd, freeing lock for context %d\n", - current->pid, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) ); -#if __HAVE_RELEASE - DRIVER_RELEASE(); -#endif - DRM(lock_free)( dev, &dev->lock.hw_lock->lock, - _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) ); - - /* FIXME: may require heavy-handed reset of - hardware at this point, possibly - processed via a callback to the X - server. */ - } + DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n", + current->pid, (long)dev->device, dev->open_count); return 0; } @@ -122,7 +105,7 @@ drm_device_t *dev = priv->dev; int retcode; - DRM_DEBUG("fd = %d, device = 0x%x\n", fd, dev->device); + DRM_DEBUG("fd = %d, device = 0x%lx\n", fd, (long)dev->device); retcode = fasync_helper(fd, filp, on, &dev->buf_async); if (retcode < 0) return retcode; return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_ioctl.h linux-2.4.23-pre8/drivers/char/drm/drm_ioctl.h --- linux-2.4.22/drivers/char/drm/drm_ioctl.h 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_ioctl.h 2003-10-22 22:48:12.000000000 +0000 @@ -111,7 +111,7 @@ do { struct pci_dev *pci_dev; - int b, d, f; + int domain, b, d, f; char *p; for(p = dev->unique; p && *p && *p != ':'; p++); @@ -123,6 +123,27 @@ f = (int)simple_strtoul(p+1, &p, 10); if (*p) break; + domain = b >> 8; + b &= 0xff; + +#ifdef __alpha__ + /* + * Find the hose the device is on (the domain number is the + * hose index) and offset the bus by the root bus of that + * hose. + */ + for(pci_dev = pci_find_device(PCI_ANY_ID,PCI_ANY_ID,NULL); + pci_dev; + pci_dev = pci_find_device(PCI_ANY_ID,PCI_ANY_ID,pci_dev)) { + struct pci_controller *hose = pci_dev->sysdata; + + if (hose->index == domain) { + b += hose->bus->number; + break; + } + } +#endif + pci_dev = pci_find_slot(b, PCI_DEVFN(d,f)); if (pci_dev) { dev->pdev = pci_dev; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_lock.h linux-2.4.23-pre8/drivers/char/drm/drm_lock.h --- linux-2.4.22/drivers/char/drm/drm_lock.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_lock.h 2003-10-22 22:49:09.000000000 +0000 @@ -236,7 +236,7 @@ /* Allow signal delivery if lock isn't held */ - if (!_DRM_LOCK_IS_HELD(s->lock->lock) + if (!s->lock || !_DRM_LOCK_IS_HELD(s->lock->lock) || _DRM_LOCKING_CONTEXT(s->lock->lock) != s->context) return 1; /* Otherwise, set flag to force call to diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_memory.h linux-2.4.23-pre8/drivers/char/drm/drm_memory.h --- linux-2.4.22/drivers/char/drm/drm_memory.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_memory.h 2003-10-22 22:47:56.000000000 +0000 @@ -313,6 +313,29 @@ return pt; } +void *DRM(ioremap_nocache)(unsigned long offset, unsigned long size) +{ + void *pt; + + if (!size) { + DRM_MEM_ERROR(DRM_MEM_MAPPINGS, + "Mapping 0 bytes at 0x%08lx\n", offset); + return NULL; + } + + if (!(pt = ioremap_nocache(offset, size))) { + spin_lock(&DRM(mem_lock)); + ++DRM(mem_stats)[DRM_MEM_MAPPINGS].fail_count; + spin_unlock(&DRM(mem_lock)); + return NULL; + } + spin_lock(&DRM(mem_lock)); + ++DRM(mem_stats)[DRM_MEM_MAPPINGS].succeed_count; + DRM(mem_stats)[DRM_MEM_MAPPINGS].bytes_allocated += size; + spin_unlock(&DRM(mem_lock)); + return pt; +} + void DRM(ioremapfree)(void *pt, unsigned long size) { int alloc_count; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_os_linux.h linux-2.4.23-pre8/drivers/char/drm/drm_os_linux.h --- linux-2.4.22/drivers/char/drm/drm_os_linux.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_os_linux.h 2003-10-22 22:47:39.000000000 +0000 @@ -0,0 +1,56 @@ +#define __NO_VERSION__ + +#include /* For task queue support */ +#include + + +/* For data going from/to the kernel through the ioctl argument */ +#define DRM_COPY_FROM_USER_IOCTL(arg1, arg2, arg3) \ + if ( copy_from_user(&arg1, arg2, arg3) ) \ + return -EFAULT +#define DRM_COPY_TO_USER_IOCTL(arg1, arg2, arg3) \ + if ( copy_to_user(arg1, &arg2, arg3) ) \ + return -EFAULT + + +#warning the author of this code needs to read up on list_entry +#define DRM_GETSAREA() \ +do { \ + struct list_head *list; \ + list_for_each( list, &dev->maplist->head ) { \ + drm_map_list_t *entry = (drm_map_list_t *)list; \ + if ( entry->map && \ + entry->map->type == _DRM_SHM && \ + (entry->map->flags & _DRM_CONTAINS_LOCK) ) { \ + dev_priv->sarea = entry->map; \ + break; \ + } \ + } \ +} while (0) + +#define DRM_WAIT_ON( ret, queue, timeout, condition ) \ +do { \ + DECLARE_WAITQUEUE(entry, current); \ + unsigned long end = jiffies + (timeout); \ + add_wait_queue(&(queue), &entry); \ + \ + for (;;) { \ + set_current_state(TASK_INTERRUPTIBLE); \ + if (condition) \ + break; \ + if((signed)(end - jiffies) <= 0) { \ + ret = -EBUSY; \ + break; \ + } \ + schedule_timeout((HZ/100 > 1) ? HZ/100 : 1); \ + if (signal_pending(current)) { \ + ret = -EINTR; \ + break; \ + } \ + } \ + set_current_state(TASK_RUNNING); \ + remove_wait_queue(&(queue), &entry); \ +} while (0) + + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_proc.h linux-2.4.23-pre8/drivers/char/drm/drm_proc.h --- linux-2.4.22/drivers/char/drm/drm_proc.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_proc.h 2003-10-22 22:47:41.000000000 +0000 @@ -147,10 +147,10 @@ *eof = 0; if (dev->unique) { - DRM_PROC_PRINT("%s 0x%x %s\n", - dev->name, dev->device, dev->unique); + DRM_PROC_PRINT("%s 0x%lx %s\n", + dev->name, (long)dev->device, dev->unique); } else { - DRM_PROC_PRINT("%s 0x%x\n", dev->name, dev->device); + DRM_PROC_PRINT("%s 0x%lx\n", dev->name, (long)dev->device); } if (len > request + offset) return request; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_sarea.h linux-2.4.23-pre8/drivers/char/drm/drm_sarea.h --- linux-2.4.22/drivers/char/drm/drm_sarea.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_sarea.h 2003-10-22 22:49:05.000000000 +0000 @@ -0,0 +1,57 @@ +/* sarea.h -- SAREA definitions -*- linux-c -*- + * + * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. + * 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 + * 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 NONINFRINGEMENT. IN NO EVENT SHALL + * TUNGSTEN GRAPHICS AND/OR ITS 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. + * + * Authors: + * Michel Dänzer + */ + +#ifndef _DRM_SAREA_H_ +#define _DRM_SAREA_H_ + +#define SAREA_MAX_DRAWABLES 256 + +typedef struct _drm_sarea_drawable_t { + unsigned int stamp; + unsigned int flags; +} drm_sarea_drawable_t; + +typedef struct _dri_sarea_frame_t { + unsigned int x; + unsigned int y; + unsigned int width; + unsigned int height; + unsigned int fullscreen; +} drm_sarea_frame_t; + +typedef struct _drm_sarea_t { + /* first thing is always the drm locking structure */ + drm_hw_lock_t lock; + /* NOT_DONE: Use readers/writer lock for drawable_lock */ + drm_hw_lock_t drawable_lock; + drm_sarea_drawable_t drawableTable[SAREA_MAX_DRAWABLES]; + drm_sarea_frame_t frame; + drm_context_t dummy_context; +} drm_sarea_t; + +#endif /* _DRM_SAREA_H_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_stub.h linux-2.4.23-pre8/drivers/char/drm/drm_stub.h --- linux-2.4.22/drivers/char/drm/drm_stub.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_stub.h 2003-10-22 22:49:19.000000000 +0000 @@ -48,7 +48,7 @@ static int DRM(stub_open)(struct inode *inode, struct file *filp) { - int minor = MINOR(inode->i_rdev); + int minor = minor(inode->i_rdev); int err = -ENODEV; struct file_operations *old_fops; @@ -65,8 +65,8 @@ } static struct file_operations DRM(stub_fops) = { - owner: THIS_MODULE, - open: DRM(stub_open) + .owner = THIS_MODULE, + .open = DRM(stub_open) }; static int DRM(stub_getminor)(const char *name, struct file_operations *fops, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/drm_vm.h linux-2.4.23-pre8/drivers/char/drm/drm_vm.h --- linux-2.4.22/drivers/char/drm/drm_vm.h 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/drm_vm.h 2003-10-22 22:49:54.000000000 +0000 @@ -57,7 +57,7 @@ struct page *DRM(vm_nopage)(struct vm_area_struct *vma, unsigned long address, - int unused) + int write_access) { #if __REALLY_HAVE_AGP drm_file_t *priv = vma->vm_file->private_data; @@ -70,7 +70,7 @@ * Find the right map */ - if(!dev->agp->cant_use_aperture) goto vm_nopage_error; + if(!dev->agp || !dev->agp->cant_use_aperture) goto vm_nopage_error; list_for_each(list, &dev->maplist->head) { r_list = (drm_map_list_t *)list; @@ -141,9 +141,7 @@ return NOPAGE_OOM; get_page(page); -#if 0 /* XXX page_to_bus is not a portable interface available on all platforms. */ - DRM_DEBUG("0x%08lx => 0x%08llx\n", address, (u64)page_to_bus(page)); -#endif + DRM_DEBUG("shm_nopage 0x%lx\n", address); return page; } @@ -245,10 +243,7 @@ get_page(page); -#if 0 /* XXX page_to_bus is not a portable interface available on all platforms. */ - DRM_DEBUG("0x%08lx (page %lu) => 0x%08llx\n", address, page_nr, - (u64)page_to_bus(page)); -#endif + DRM_DEBUG("dma_nopage 0x%lx (page %lu)\n", address, page_nr); return page; } @@ -449,12 +444,12 @@ } offset = DRIVER_GET_REG_OFS(); #ifdef __sparc__ - if (io_remap_page_range(vma->vm_start, + if (io_remap_page_range(DRM_RPR_ARG(vma) vma->vm_start, VM_OFFSET(vma) + offset, vma->vm_end - vma->vm_start, vma->vm_page_prot, 0)) #else - if (remap_page_range(vma->vm_start, + if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start, VM_OFFSET(vma) + offset, vma->vm_end - vma->vm_start, vma->vm_page_prot)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/gamma.h linux-2.4.23-pre8/drivers/char/drm/gamma.h --- linux-2.4.22/drivers/char/drm/gamma.h 2001-08-08 16:42:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/gamma.h 2003-10-22 22:47:28.000000000 +0000 @@ -38,9 +38,36 @@ */ #define __HAVE_MTRR 1 +#define DRIVER_AUTHOR "VA Linux Systems Inc." + +#define DRIVER_NAME "gamma" +#define DRIVER_DESC "3DLabs gamma" +#define DRIVER_DATE "20010624" + +#define DRIVER_MAJOR 2 +#define DRIVER_MINOR 0 +#define DRIVER_PATCHLEVEL 0 + +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { gamma_dma, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_GAMMA_INIT)] = { gamma_dma_init, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_GAMMA_COPY)] = { gamma_dma_copy, 1, 1 } + +#define IOCTL_TABLE_NAME DRM(ioctls) +#define IOCTL_FUNC_NAME DRM(ioctl) + +#define __HAVE_COUNTERS 5 +#define __HAVE_COUNTER6 _DRM_STAT_IRQ +#define __HAVE_COUNTER7 _DRM_STAT_DMA +#define __HAVE_COUNTER8 _DRM_STAT_PRIMARY +#define __HAVE_COUNTER9 _DRM_STAT_SPECIAL +#define __HAVE_COUNTER10 _DRM_STAT_MISSED + /* DMA customization: */ #define __HAVE_DMA 1 +#define __HAVE_AGP 1 +#define __MUST_HAVE_AGP 0 #define __HAVE_OLD_DMA 1 #define __HAVE_PCI_DMA 1 @@ -61,33 +88,61 @@ #define __HAVE_DMA_QUIESCENT 1 #define DRIVER_DMA_QUIESCENT() do { \ /* FIXME ! */ \ - gamma_dma_quiescent_dual(dev); \ + gamma_dma_quiescent_single(dev); \ return 0; \ } while (0) #define __HAVE_DMA_IRQ 1 #define __HAVE_DMA_IRQ_BH 1 + +#if 1 #define DRIVER_PREINSTALL() do { \ drm_gamma_private_t *dev_priv = \ (drm_gamma_private_t *)dev->dev_private;\ - GAMMA_WRITE( GAMMA_GCOMMANDMODE, 0x00000000 ); \ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); \ + GAMMA_WRITE( GAMMA_GCOMMANDMODE, 0x00000004 ); \ GAMMA_WRITE( GAMMA_GDMACONTROL, 0x00000000 ); \ } while (0) - #define DRIVER_POSTINSTALL() do { \ drm_gamma_private_t *dev_priv = \ (drm_gamma_private_t *)dev->dev_private;\ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); \ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 3) cpu_relax(); \ GAMMA_WRITE( GAMMA_GINTENABLE, 0x00002001 ); \ GAMMA_WRITE( GAMMA_COMMANDINTENABLE, 0x00000008 ); \ GAMMA_WRITE( GAMMA_GDELAYTIMER, 0x00039090 ); \ } while (0) +#else +#define DRIVER_POSTINSTALL() do { \ + drm_gamma_private_t *dev_priv = \ + (drm_gamma_private_t *)dev->dev_private;\ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); \ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); \ + GAMMA_WRITE( GAMMA_GINTENABLE, 0x00002000 ); \ + GAMMA_WRITE( GAMMA_COMMANDINTENABLE, 0x00000004 ); \ +} while (0) + +#define DRIVER_PREINSTALL() do { \ + drm_gamma_private_t *dev_priv = \ + (drm_gamma_private_t *)dev->dev_private;\ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); \ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); \ + GAMMA_WRITE( GAMMA_GCOMMANDMODE, GAMMA_QUEUED_DMA_MODE );\ + GAMMA_WRITE( GAMMA_GDMACONTROL, 0x00000000 );\ +} while (0) +#endif #define DRIVER_UNINSTALL() do { \ drm_gamma_private_t *dev_priv = \ (drm_gamma_private_t *)dev->dev_private;\ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); \ + while(GAMMA_READ(GAMMA_INFIFOSPACE) < 3) cpu_relax(); \ GAMMA_WRITE( GAMMA_GDELAYTIMER, 0x00000000 ); \ GAMMA_WRITE( GAMMA_COMMANDINTENABLE, 0x00000000 ); \ GAMMA_WRITE( GAMMA_GINTENABLE, 0x00000000 ); \ } while (0) +#define DRIVER_AGP_BUFFERS_MAP( dev ) \ + ((drm_gamma_private_t *)((dev)->dev_private))->buffers + #endif /* __GAMMA_H__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/gamma_dma.c linux-2.4.23-pre8/drivers/char/drm/gamma_dma.c --- linux-2.4.22/drivers/char/drm/gamma_dma.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/gamma_dma.c 2003-10-22 22:49:38.000000000 +0000 @@ -31,33 +31,32 @@ #include "gamma.h" #include "drmP.h" +#include "drm.h" +#include "gamma_drm.h" #include "gamma_drv.h" #include /* For task queue support */ #include - static inline void gamma_dma_dispatch(drm_device_t *dev, unsigned long address, unsigned long length) { drm_gamma_private_t *dev_priv = - (drm_gamma_private_t *)dev->dev_private; - - GAMMA_WRITE(GAMMA_DMAADDRESS, virt_to_phys((void *)address)); - while (GAMMA_READ(GAMMA_GCOMMANDSTATUS) != 4) - ; + (drm_gamma_private_t *)dev->dev_private; + mb(); + while ( GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); + GAMMA_WRITE(GAMMA_DMAADDRESS, address); + while (GAMMA_READ(GAMMA_GCOMMANDSTATUS) != 4) cpu_relax(); GAMMA_WRITE(GAMMA_DMACOUNT, length / 4); } void gamma_dma_quiescent_single(drm_device_t *dev) { drm_gamma_private_t *dev_priv = - (drm_gamma_private_t *)dev->dev_private; + (drm_gamma_private_t *)dev->dev_private; + while (GAMMA_READ(GAMMA_DMACOUNT)) cpu_relax(); - while (GAMMA_READ(GAMMA_DMACOUNT)) - ; - while (GAMMA_READ(GAMMA_INFIFOSPACE) < 3) - ; + while (GAMMA_READ(GAMMA_INFIFOSPACE) < 2) cpu_relax(); GAMMA_WRITE(GAMMA_FILTERMODE, 1 << 10); GAMMA_WRITE(GAMMA_SYNC, 0); @@ -71,56 +70,50 @@ void gamma_dma_quiescent_dual(drm_device_t *dev) { drm_gamma_private_t *dev_priv = - (drm_gamma_private_t *)dev->dev_private; + (drm_gamma_private_t *)dev->dev_private; + while (GAMMA_READ(GAMMA_DMACOUNT)) cpu_relax(); - while (GAMMA_READ(GAMMA_DMACOUNT)) - ; - while (GAMMA_READ(GAMMA_INFIFOSPACE) < 3) - ; + while (GAMMA_READ(GAMMA_INFIFOSPACE) < 3) cpu_relax(); GAMMA_WRITE(GAMMA_BROADCASTMASK, 3); - GAMMA_WRITE(GAMMA_FILTERMODE, 1 << 10); GAMMA_WRITE(GAMMA_SYNC, 0); - /* Read from first MX */ + /* Read from first MX */ do { - while (!GAMMA_READ(GAMMA_OUTFIFOWORDS)) - ; + while (!GAMMA_READ(GAMMA_OUTFIFOWORDS)) cpu_relax(); } while (GAMMA_READ(GAMMA_OUTPUTFIFO) != GAMMA_SYNC_TAG); - /* Read from second MX */ + /* Read from second MX */ do { - while (!GAMMA_READ(GAMMA_OUTFIFOWORDS + 0x10000)) - ; + while (!GAMMA_READ(GAMMA_OUTFIFOWORDS + 0x10000)) cpu_relax(); } while (GAMMA_READ(GAMMA_OUTPUTFIFO + 0x10000) != GAMMA_SYNC_TAG); } void gamma_dma_ready(drm_device_t *dev) { drm_gamma_private_t *dev_priv = - (drm_gamma_private_t *)dev->dev_private; - - while (GAMMA_READ(GAMMA_DMACOUNT)) - ; + (drm_gamma_private_t *)dev->dev_private; + while (GAMMA_READ(GAMMA_DMACOUNT)) cpu_relax(); } static inline int gamma_dma_is_ready(drm_device_t *dev) { drm_gamma_private_t *dev_priv = - (drm_gamma_private_t *)dev->dev_private; - - return !GAMMA_READ(GAMMA_DMACOUNT); + (drm_gamma_private_t *)dev->dev_private; + return(!GAMMA_READ(GAMMA_DMACOUNT)); } void gamma_dma_service(int irq, void *device, struct pt_regs *regs) { - drm_device_t *dev = (drm_device_t *)device; - drm_device_dma_t *dma = dev->dma; + drm_device_t *dev = (drm_device_t *)device; + drm_device_dma_t *dma = dev->dma; drm_gamma_private_t *dev_priv = - (drm_gamma_private_t *)dev->dev_private; + (drm_gamma_private_t *)dev->dev_private; atomic_inc(&dev->counts[6]); /* _DRM_STAT_IRQ */ + + while (GAMMA_READ(GAMMA_INFIFOSPACE) < 3) cpu_relax(); GAMMA_WRITE(GAMMA_GDELAYTIMER, 0xc350/2); /* 0x05S */ GAMMA_WRITE(GAMMA_GCOMMANDINTFLAGS, 8); GAMMA_WRITE(GAMMA_GINTFLAGS, 0x2001); @@ -164,7 +157,9 @@ } buf = dma->next_buffer; - address = (unsigned long)buf->address; + /* WE NOW ARE ON LOGICAL PAGES!! - using page table setup in dma_init */ + /* So we pass the buffer index value into the physical page offset */ + address = buf->idx << 12; length = buf->used; DRM_DEBUG("context %d, buffer %d (%ld bytes)\n", @@ -231,6 +226,9 @@ buf->time_dispatched = get_cycles(); #endif + /* WE NOW ARE ON LOGICAL PAGES!!! - overriding address */ + address = buf->idx << 12; + gamma_dma_dispatch(dev, address, length); gamma_free_buffer(dev, dma->this_buffer); dma->this_buffer = buf; @@ -523,11 +521,11 @@ } } if (retcode) { - DRM_ERROR("ctx%d w%d p%d c%d i%d l%d %d/%d\n", + DRM_ERROR("ctx%d w%d p%d c%ld i%d l%d %d/%d\n", d->context, last_buf->waiting, last_buf->pending, - DRM_WAITCOUNT(dev, d->context), + (long)DRM_WAITCOUNT(dev, d->context), last_buf->idx, last_buf->list, last_buf->pid, @@ -581,3 +579,267 @@ return retcode; } + +/* ============================================================= + * DMA initialization, cleanup + */ + +static int gamma_do_init_dma( drm_device_t *dev, drm_gamma_init_t *init ) +{ + drm_gamma_private_t *dev_priv; + drm_device_dma_t *dma = dev->dma; + drm_buf_t *buf; + int i; + struct list_head *list; + unsigned long *pgt; + + DRM_DEBUG( "%s\n", __FUNCTION__ ); + + dev_priv = DRM(alloc)( sizeof(drm_gamma_private_t), + DRM_MEM_DRIVER ); + if ( !dev_priv ) + return -ENOMEM; + + dev->dev_private = (void *)dev_priv; + + memset( dev_priv, 0, sizeof(drm_gamma_private_t) ); + + list_for_each(list, &dev->maplist->head) { + #warning list_entry() is needed here + drm_map_list_t *r_list = (drm_map_list_t *)list; + if( r_list->map && + r_list->map->type == _DRM_SHM && + r_list->map->flags & _DRM_CONTAINS_LOCK ) { + dev_priv->sarea = r_list->map; + break; + } + } + + DRM_FIND_MAP( dev_priv->mmio0, init->mmio0 ); + DRM_FIND_MAP( dev_priv->mmio1, init->mmio1 ); + DRM_FIND_MAP( dev_priv->mmio2, init->mmio2 ); + DRM_FIND_MAP( dev_priv->mmio3, init->mmio3 ); + + dev_priv->sarea_priv = (drm_gamma_sarea_t *) + ((u8 *)dev_priv->sarea->handle + + init->sarea_priv_offset); + + if (init->pcimode) { + buf = dma->buflist[GLINT_DRI_BUF_COUNT]; + pgt = buf->address; + + for (i = 0; i < GLINT_DRI_BUF_COUNT; i++) { + buf = dma->buflist[i]; + *pgt = virt_to_phys((void*)buf->address) | 0x07; + pgt++; + } + + buf = dma->buflist[GLINT_DRI_BUF_COUNT]; + } else { + DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset ); + + DRM_IOREMAP( dev_priv->buffers ); + + buf = dma->buflist[GLINT_DRI_BUF_COUNT]; + pgt = buf->address; + + for (i = 0; i < GLINT_DRI_BUF_COUNT; i++) { + buf = dma->buflist[i]; + *pgt = (unsigned long)buf->address + 0x07; + pgt++; + } + + buf = dma->buflist[GLINT_DRI_BUF_COUNT]; + + while (GAMMA_READ(GAMMA_INFIFOSPACE) < 1) cpu_relax(); + GAMMA_WRITE( GAMMA_GDMACONTROL, 0xe) ; + } + while (GAMMA_READ(GAMMA_INFIFOSPACE) < 2); cpu_relax(); + GAMMA_WRITE( GAMMA_PAGETABLEADDR, virt_to_phys((void*)buf->address) ); + GAMMA_WRITE( GAMMA_PAGETABLELENGTH, 2 ); + + return 0; +} + +int gamma_do_cleanup_dma( drm_device_t *dev ) +{ + DRM_DEBUG( "%s\n", __FUNCTION__ ); + + if ( dev->dev_private ) { + drm_gamma_private_t *dev_priv = dev->dev_private; + + DRM_IOREMAPFREE( dev_priv->buffers ); + + DRM(free)( dev->dev_private, sizeof(drm_gamma_private_t), + DRM_MEM_DRIVER ); + dev->dev_private = NULL; + } + + return 0; +} + +int gamma_dma_init( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_gamma_init_t init; + + if ( copy_from_user( &init, (drm_gamma_init_t *)arg, sizeof(init) ) ) + return -EFAULT; + + switch ( init.func ) { + case GAMMA_INIT_DMA: + return gamma_do_init_dma( dev, &init ); + case GAMMA_CLEANUP_DMA: + return gamma_do_cleanup_dma( dev ); + } + + return -EINVAL; +} + +static int gamma_do_copy_dma( drm_device_t *dev, drm_gamma_copy_t *copy ) +{ + drm_device_dma_t *dma = dev->dma; + unsigned int *screenbuf; + + DRM_DEBUG( "%s\n", __FUNCTION__ ); + + /* We've DRM_RESTRICTED this DMA buffer */ + + screenbuf = dma->buflist[ GLINT_DRI_BUF_COUNT + 1 ]->address; + +#if 0 + *buffer++ = 0x180; /* Tag (FilterMode) */ + *buffer++ = 0x200; /* Allow FBColor through */ + *buffer++ = 0x53B; /* Tag */ + *buffer++ = copy->Pitch; + *buffer++ = 0x53A; /* Tag */ + *buffer++ = copy->SrcAddress; + *buffer++ = 0x539; /* Tag */ + *buffer++ = copy->WidthHeight; /* Initiates transfer */ + *buffer++ = 0x53C; /* Tag - DMAOutputAddress */ + *buffer++ = virt_to_phys((void*)screenbuf); + *buffer++ = 0x53D; /* Tag - DMAOutputCount */ + *buffer++ = copy->Count; /* Reads HostOutFifo BLOCKS until ..*/ + + /* Data now sitting in dma->buflist[ GLINT_DRI_BUF_COUNT + 1 ] */ + /* Now put it back to the screen */ + + *buffer++ = 0x180; /* Tag (FilterMode) */ + *buffer++ = 0x400; /* Allow Sync through */ + *buffer++ = 0x538; /* Tag - DMARectangleReadTarget */ + *buffer++ = 0x155; /* FBSourceData | count */ + *buffer++ = 0x537; /* Tag */ + *buffer++ = copy->Pitch; + *buffer++ = 0x536; /* Tag */ + *buffer++ = copy->DstAddress; + *buffer++ = 0x535; /* Tag */ + *buffer++ = copy->WidthHeight; /* Initiates transfer */ + *buffer++ = 0x530; /* Tag - DMAAddr */ + *buffer++ = virt_to_phys((void*)screenbuf); + *buffer++ = 0x531; + *buffer++ = copy->Count; /* initiates DMA transfer of color data */ +#endif + + /* need to dispatch it now */ + + return 0; +} + +int gamma_dma_copy( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_gamma_copy_t copy; + + if ( copy_from_user( ©, (drm_gamma_copy_t *)arg, sizeof(copy) ) ) + return -EFAULT; + + return gamma_do_copy_dma( dev, © ); +} + +/* ============================================================= + * Per Context SAREA Support + */ + +int gamma_getsareactx(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_ctx_priv_map_t request; + drm_map_t *map; + + if (copy_from_user(&request, + (drm_ctx_priv_map_t *)arg, + sizeof(request))) + return -EFAULT; + + down(&dev->struct_sem); + if ((int)request.ctx_id >= dev->max_context) { + up(&dev->struct_sem); + return -EINVAL; + } + + map = dev->context_sareas[request.ctx_id]; + up(&dev->struct_sem); + + request.handle = map->handle; + if (copy_to_user((drm_ctx_priv_map_t *)arg, &request, sizeof(request))) + return -EFAULT; + return 0; +} + +int gamma_setsareactx(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_ctx_priv_map_t request; + drm_map_t *map = NULL; + drm_map_list_t *r_list; + struct list_head *list; + + if (copy_from_user(&request, + (drm_ctx_priv_map_t *)arg, + sizeof(request))) + return -EFAULT; + + down(&dev->struct_sem); + r_list = NULL; + list_for_each(list, &dev->maplist->head) { + r_list = (drm_map_list_t *)list; + if(r_list->map && + r_list->map->handle == request.handle) break; + } + if (list == &(dev->maplist->head)) { + up(&dev->struct_sem); + return -EINVAL; + } + map = r_list->map; + up(&dev->struct_sem); + + if (!map) return -EINVAL; + + down(&dev->struct_sem); + if ((int)request.ctx_id >= dev->max_context) { + up(&dev->struct_sem); + return -EINVAL; + } + dev->context_sareas[request.ctx_id] = map; + up(&dev->struct_sem); + return 0; +} + +/* drm_dma.h hooks +*/ +void DRM(driver_irq_preinstall)( drm_device_t *dev ) { +} + +void DRM(driver_irq_postinstall)( drm_device_t *dev ) { +} + +void DRM(driver_irq_uninstall)( drm_device_t *dev ) { +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/gamma_drm.h linux-2.4.23-pre8/drivers/char/drm/gamma_drm.h --- linux-2.4.22/drivers/char/drm/gamma_drm.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/gamma_drm.h 2003-10-22 22:47:49.000000000 +0000 @@ -0,0 +1,89 @@ +#ifndef _GAMMA_DRM_H_ +#define _GAMMA_DRM_H_ + +typedef struct _drm_gamma_tex_region { + unsigned char next, prev; /* indices to form a circular LRU */ + unsigned char in_use; /* owned by a client, or free? */ + int age; /* tracked by clients to update local LRU's */ +} drm_gamma_tex_region_t; + +typedef struct { + unsigned int GDeltaMode; + unsigned int GDepthMode; + unsigned int GGeometryMode; + unsigned int GTransformMode; +} drm_gamma_context_regs_t; + +typedef struct _drm_gamma_sarea { + drm_gamma_context_regs_t context_state; + + unsigned int dirty; + + + /* Maintain an LRU of contiguous regions of texture space. If + * you think you own a region of texture memory, and it has an + * age different to the one you set, then you are mistaken and + * it has been stolen by another client. If global texAge + * hasn't changed, there is no need to walk the list. + * + * These regions can be used as a proxy for the fine-grained + * texture information of other clients - by maintaining them + * in the same lru which is used to age their own textures, + * clients have an approximate lru for the whole of global + * texture space, and can make informed decisions as to which + * areas to kick out. There is no need to choose whether to + * kick out your own texture or someone else's - simply eject + * them all in LRU order. + */ + +#define GAMMA_NR_TEX_REGIONS 64 + drm_gamma_tex_region_t texList[GAMMA_NR_TEX_REGIONS+1]; + /* Last elt is sentinal */ + int texAge; /* last time texture was uploaded */ + int last_enqueue; /* last time a buffer was enqueued */ + int last_dispatch; /* age of the most recently dispatched buffer */ + int last_quiescent; /* */ + int ctxOwner; /* last context to upload state */ + + int vertex_prim; +} drm_gamma_sarea_t; + +/* WARNING: If you change any of these defines, make sure to wear a bullet + * proof vest because these are part of the stable kernel<->userspace ABI + */ + +/* Gamma specific ioctls + * The device specific ioctl range is 0x40 to 0x79. + */ +#define DRM_IOCTL_GAMMA_INIT DRM_IOW( 0x40, drm_gamma_init_t) +#define DRM_IOCTL_GAMMA_COPY DRM_IOW( 0x41, drm_gamma_copy_t) + +typedef struct drm_gamma_copy { + unsigned int DMAOutputAddress; + unsigned int DMAOutputCount; + unsigned int DMAReadGLINTSource; + unsigned int DMARectangleWriteAddress; + unsigned int DMARectangleWriteLinePitch; + unsigned int DMARectangleWrite; + unsigned int DMARectangleReadAddress; + unsigned int DMARectangleReadLinePitch; + unsigned int DMARectangleRead; + unsigned int DMARectangleReadTarget; +} drm_gamma_copy_t; + +typedef struct drm_gamma_init { + enum { + GAMMA_INIT_DMA = 0x01, + GAMMA_CLEANUP_DMA = 0x02 + } func; + + int sarea_priv_offset; + int pcimode; + unsigned int mmio0; + unsigned int mmio1; + unsigned int mmio2; + unsigned int mmio3; + unsigned int buffers_offset; +} drm_gamma_init_t; + +#endif /* _GAMMA_DRM_H_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/gamma_drv.c linux-2.4.23-pre8/drivers/char/drm/gamma_drv.c --- linux-2.4.22/drivers/char/drm/gamma_drv.c 2001-08-08 16:42:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/gamma_drv.c 2003-10-22 22:49:34.000000000 +0000 @@ -32,57 +32,18 @@ #include #include "gamma.h" #include "drmP.h" +#include "drm.h" +#include "gamma_drm.h" #include "gamma_drv.h" -#define DRIVER_AUTHOR "VA Linux Systems Inc." - -#define DRIVER_NAME "gamma" -#define DRIVER_DESC "3DLabs gamma" -#define DRIVER_DATE "20010216" - -#define DRIVER_MAJOR 1 -#define DRIVER_MINOR 0 -#define DRIVER_PATCHLEVEL 0 - -#define DRIVER_IOCTLS \ - [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { gamma_dma, 1, 0 } - - -#define __HAVE_COUNTERS 5 -#define __HAVE_COUNTER6 _DRM_STAT_IRQ -#define __HAVE_COUNTER7 _DRM_STAT_DMA -#define __HAVE_COUNTER8 _DRM_STAT_PRIMARY -#define __HAVE_COUNTER9 _DRM_STAT_SPECIAL -#define __HAVE_COUNTER10 _DRM_STAT_MISSED - - #include "drm_auth.h" +#include "drm_agpsupport.h" #include "drm_bufs.h" #include "drm_context.h" #include "drm_dma.h" #include "drm_drawable.h" #include "drm_drv.h" -#ifndef MODULE -/* DRM(options) is called by the kernel to parse command-line options - * passed via the boot-loader (e.g., LILO). It calls the insmod option - * routine, drm_parse_drm. - */ - -/* JH- We have to hand expand the string ourselves because of the cpp. If - * anyone can think of a way that we can fit into the __setup macro without - * changing it, then please send the solution my way. - */ -static int __init gamma_options( char *str ) -{ - DRM(parse_options)( str ); - return 1; -} - -__setup( DRIVER_NAME "=", gamma_options ); -#endif - - #include "drm_fops.h" #include "drm_init.h" #include "drm_ioctl.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/gamma_drv.h linux-2.4.23-pre8/drivers/char/drm/gamma_drv.h --- linux-2.4.22/drivers/char/drm/gamma_drv.h 2001-08-08 16:42:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/gamma_drv.h 2003-10-22 22:48:38.000000000 +0000 @@ -32,8 +32,9 @@ #ifndef _GAMMA_DRV_H_ #define _GAMMA_DRV_H_ - typedef struct drm_gamma_private { + drm_gamma_sarea_t *sarea_priv; + drm_map_t *sarea; drm_map_t *buffers; drm_map_t *mmio0; drm_map_t *mmio1; @@ -51,6 +52,11 @@ } \ } while (0) + /* gamma_dma.c */ +extern int gamma_dma_init( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ); +extern int gamma_dma_copy( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ); extern void gamma_dma_ready(drm_device_t *dev); extern void gamma_dma_quiescent_single(drm_device_t *dev); @@ -63,6 +69,7 @@ extern int gamma_find_devices(void); extern int gamma_found(void); +#define GLINT_DRI_BUF_COUNT 256 #define GAMMA_OFF(reg) \ ((reg < 0x1000) \ @@ -78,7 +85,6 @@ ((reg < 0x10000) ? dev_priv->mmio1->handle : \ ((reg < 0x11000) ? dev_priv->mmio2->handle : \ dev_priv->mmio3->handle)))) - #define GAMMA_ADDR(reg) (GAMMA_BASE(reg) + GAMMA_OFF(reg)) #define GAMMA_DEREF(reg) *(__volatile__ int *)GAMMA_ADDR(reg) #define GAMMA_READ(reg) GAMMA_DEREF(reg) @@ -91,9 +97,11 @@ #define GAMMA_FILTERMODE 0x8c00 #define GAMMA_GCOMMANDINTFLAGS 0x0c50 #define GAMMA_GCOMMANDMODE 0x0c40 +#define GAMMA_QUEUED_DMA_MODE 1<<1 #define GAMMA_GCOMMANDSTATUS 0x0c60 #define GAMMA_GDELAYTIMER 0x0c38 #define GAMMA_GDMACONTROL 0x0060 +#define GAMMA_USE_AGP 1<<1 #define GAMMA_GINTENABLE 0x0808 #define GAMMA_GINTFLAGS 0x0810 #define GAMMA_INFIFOSPACE 0x0018 @@ -101,5 +109,12 @@ #define GAMMA_OUTPUTFIFO 0x2000 #define GAMMA_SYNC 0x8c40 #define GAMMA_SYNC_TAG 0x0188 +#define GAMMA_PAGETABLEADDR 0x0C00 +#define GAMMA_PAGETABLELENGTH 0x0C08 + +#define GAMMA_PASSTHROUGH 0x1FE +#define GAMMA_DMAADDRTAG 0x530 +#define GAMMA_DMACOUNTTAG 0x531 +#define GAMMA_COMMANDINTTAG 0x532 #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i810.h linux-2.4.23-pre8/drivers/char/drm/i810.h --- linux-2.4.22/drivers/char/drm/i810.h 2001-08-08 16:42:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i810.h 2003-10-22 22:48:26.000000000 +0000 @@ -41,6 +41,47 @@ #define __HAVE_MTRR 1 #define __HAVE_CTX_BITMAP 1 +#define DRIVER_AUTHOR "VA Linux Systems Inc." + +#define DRIVER_NAME "i810" +#define DRIVER_DESC "Intel i810" +#define DRIVER_DATE "20020211" + +/* Interface history + * + * 1.1 - XFree86 4.1 + * 1.2 - XvMC interfaces + * - XFree86 4.2 + * 1.2.1 - Disable copying code (leave stub ioctls for backwards compatibility) + * - Remove requirement for interrupt (leave stubs again) + */ +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 2 +#define DRIVER_PATCHLEVEL 1 + +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_INIT)] = { i810_dma_init, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_VERTEX)] = { i810_dma_vertex, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_CLEAR)] = { i810_clear_bufs, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_FLUSH)] = { i810_flush_ioctl, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_GETAGE)] = { i810_getage, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_GETBUF)] = { i810_getbuf, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_SWAP)] = { i810_swap_bufs, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_COPY)] = { i810_copybuf, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_DOCOPY)] = { i810_docopy, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_OV0INFO)] = { i810_ov0_info, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_FSTATUS)] = { i810_fstatus, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_OV0FLIP)] = { i810_ov0_flip, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_MC)] = { i810_dma_mc, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I810_RSTATUS)] = { i810_rstatus, 1, 0 } + + +#define __HAVE_COUNTERS 4 +#define __HAVE_COUNTER6 _DRM_STAT_IRQ +#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY +#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY +#define __HAVE_COUNTER9 _DRM_STAT_DMA + /* Driver customization: */ #define __HAVE_RELEASE 1 @@ -60,50 +101,10 @@ i810_dma_quiescent( dev ); \ } while (0) -#define __HAVE_DMA_IRQ 1 -#define __HAVE_DMA_IRQ_BH 1 -#define __HAVE_SHARED_IRQ 1 -#define DRIVER_PREINSTALL() do { \ - drm_i810_private_t *dev_priv = \ - (drm_i810_private_t *)dev->dev_private; \ - u16 tmp; \ - tmp = I810_READ16( I810REG_HWSTAM ); \ - tmp = tmp & 0x6000; \ - I810_WRITE16( I810REG_HWSTAM, tmp ); \ - \ - tmp = I810_READ16( I810REG_INT_MASK_R ); \ - tmp = tmp & 0x6000; /* Unmask interrupts */ \ - I810_WRITE16( I810REG_INT_MASK_R, tmp ); \ - tmp = I810_READ16( I810REG_INT_ENABLE_R ); \ - tmp = tmp & 0x6000; /* Disable all interrupts */ \ - I810_WRITE16( I810REG_INT_ENABLE_R, tmp ); \ -} while (0) - -#define DRIVER_POSTINSTALL() do { \ - drm_i810_private_t *dev_priv = \ - (drm_i810_private_t *)dev->dev_private; \ - u16 tmp; \ - tmp = I810_READ16( I810REG_INT_ENABLE_R ); \ - tmp = tmp & 0x6000; \ - tmp = tmp | 0x0003; /* Enable bp & user interrupts */ \ - I810_WRITE16( I810REG_INT_ENABLE_R, tmp ); \ -} while (0) - -#define DRIVER_UNINSTALL() do { \ - drm_i810_private_t *dev_priv = \ - (drm_i810_private_t *)dev->dev_private; \ - u16 tmp; \ - if ( dev_priv ) { \ - tmp = I810_READ16( I810REG_INT_IDENTITY_R ); \ - tmp = tmp & ~(0x6000); /* Clear all interrupts */ \ - if ( tmp != 0 ) \ - I810_WRITE16( I810REG_INT_IDENTITY_R, tmp ); \ - \ - tmp = I810_READ16( I810REG_INT_ENABLE_R ); \ - tmp = tmp & 0x6000; /* Disable all interrupts */ \ - I810_WRITE16( I810REG_INT_ENABLE_R, tmp ); \ - } \ -} while (0) +/* Don't need an irq any more. The template code will make sure that + * a noop stub is generated for compatibility. + */ +#define __HAVE_DMA_IRQ 0 /* Buffer customization: */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i810_dma.c linux-2.4.23-pre8/drivers/char/drm/i810_dma.c --- linux-2.4.22/drivers/char/drm/i810_dma.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i810_dma.c 2003-10-22 22:48:26.000000000 +0000 @@ -26,21 +26,20 @@ * * Authors: Rickard E. (Rik) Faith * Jeff Hartmann - * Keith Whitwell + * Keith Whitwell * */ #include #include "i810.h" #include "drmP.h" +#include "drm.h" +#include "i810_drm.h" #include "i810_drv.h" #include /* For task queue support */ -#include +#include -/* in case we don't have a 2.3.99-pre6 kernel or later: */ -#ifndef VM_DONTCOPY -#define VM_DONTCOPY 0 -#endif +#define DO_MUNMAP(m, a, l) do_munmap(m, a, l) #define I810_BUF_FREE 2 #define I810_BUF_CLIENT 1 @@ -51,29 +50,27 @@ #define RING_LOCALS unsigned int outring, ringmask; volatile char *virt; -#define BEGIN_LP_RING(n) do { \ - if (I810_VERBOSE) \ - DRM_DEBUG("BEGIN_LP_RING(%d) in %s\n", \ - n, __FUNCTION__); \ - if (dev_priv->ring.space < n*4) \ - i810_wait_ring(dev, n*4); \ - dev_priv->ring.space -= n*4; \ - outring = dev_priv->ring.tail; \ - ringmask = dev_priv->ring.tail_mask; \ - virt = dev_priv->ring.virtual_start; \ +#define BEGIN_LP_RING(n) do { \ + if (0) DRM_DEBUG("BEGIN_LP_RING(%d) in %s\n", n, __FUNCTION__); \ + if (dev_priv->ring.space < n*4) \ + i810_wait_ring(dev, n*4); \ + dev_priv->ring.space -= n*4; \ + outring = dev_priv->ring.tail; \ + ringmask = dev_priv->ring.tail_mask; \ + virt = dev_priv->ring.virtual_start; \ } while (0) -#define ADVANCE_LP_RING() do { \ - if (I810_VERBOSE) DRM_DEBUG("ADVANCE_LP_RING\n"); \ - dev_priv->ring.tail = outring; \ - I810_WRITE(LP_RING + RING_TAIL, outring); \ +#define ADVANCE_LP_RING() do { \ + if (0) DRM_DEBUG("ADVANCE_LP_RING\n"); \ + dev_priv->ring.tail = outring; \ + I810_WRITE(LP_RING + RING_TAIL, outring); \ } while(0) -#define OUT_RING(n) do { \ - if (I810_VERBOSE) DRM_DEBUG(" OUT_RING %x\n", (int)(n)); \ - *(volatile unsigned int *)(virt + outring) = n; \ - outring += 4; \ - outring &= ringmask; \ +#define OUT_RING(n) do { \ + if (0) DRM_DEBUG(" OUT_RING %x\n", (int)(n)); \ + *(volatile unsigned int *)(virt + outring) = n; \ + outring += 4; \ + outring &= ringmask; \ } while (0) static inline void i810_print_status_page(drm_device_t *dev) @@ -135,14 +132,14 @@ } static struct file_operations i810_buffer_fops = { - open: DRM(open), - flush: DRM(flush), - release: DRM(release), - ioctl: DRM(ioctl), - mmap: i810_mmap_buffers, - read: DRM(read), - fasync: DRM(fasync), - poll: DRM(poll), + .open = DRM(open), + .flush = DRM(flush), + .release = DRM(release), + .ioctl = DRM(ioctl), + .mmap = i810_mmap_buffers, + .read = DRM(read), + .fasync = DRM(fasync), + .poll = DRM(poll), }; int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma) @@ -165,7 +162,7 @@ buf_priv->currently_mapped = I810_BUF_MAPPED; unlock_kernel(); - if (remap_page_range(vma->vm_start, + if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start, VM_OFFSET(vma), vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; @@ -183,28 +180,31 @@ if(buf_priv->currently_mapped == I810_BUF_MAPPED) return -EINVAL; - if(VM_DONTCOPY != 0) { - down_write( ¤t->mm->mmap_sem ); - old_fops = filp->f_op; - filp->f_op = &i810_buffer_fops; - dev_priv->mmap_buffer = buf; - buf_priv->virtual = (void *)do_mmap(filp, 0, buf->total, - PROT_READ|PROT_WRITE, - MAP_SHARED, - buf->bus_address); - dev_priv->mmap_buffer = NULL; - filp->f_op = old_fops; - if ((unsigned long)buf_priv->virtual > -1024UL) { - /* Real error */ - DRM_DEBUG("mmap error\n"); - retcode = (signed int)buf_priv->virtual; - buf_priv->virtual = 0; - } - up_write( ¤t->mm->mmap_sem ); - } else { - buf_priv->virtual = buf_priv->kernel_virtual; - buf_priv->currently_mapped = I810_BUF_MAPPED; + + + + down_write( ¤t->mm->mmap_sem ); + + old_fops = filp->f_op; + filp->f_op = &i810_buffer_fops; + dev_priv->mmap_buffer = buf; + buf_priv->virtual = (void *)do_mmap(filp, 0, buf->total, + PROT_READ|PROT_WRITE, + MAP_SHARED, + buf->bus_address); + dev_priv->mmap_buffer = NULL; + filp->f_op = old_fops; + if ((unsigned long)buf_priv->virtual > -1024UL) { + /* Real error */ + DRM_DEBUG("mmap error\n"); + retcode = (signed int)buf_priv->virtual; + buf_priv->virtual = 0; } + + + + up_write( ¤t->mm->mmap_sem ); + return retcode; } @@ -213,15 +213,21 @@ drm_i810_buf_priv_t *buf_priv = buf->dev_private; int retcode = 0; - if(VM_DONTCOPY != 0) { - if(buf_priv->currently_mapped != I810_BUF_MAPPED) - return -EINVAL; - down_write( ¤t->mm->mmap_sem ); - retcode = do_munmap(current->mm, - (unsigned long)buf_priv->virtual, - (size_t) buf->total); - up_write( ¤t->mm->mmap_sem ); - } + if(buf_priv->currently_mapped != I810_BUF_MAPPED) + return -EINVAL; + + + + down_write( ¤t->mm->mmap_sem ); + + retcode = DO_MUNMAP(current->mm, + (unsigned long)buf_priv->virtual, + (size_t) buf->total); + + + + up_write( ¤t->mm->mmap_sem ); + buf_priv->currently_mapped = I810_BUF_UNMAPPED; buf_priv->virtual = 0; @@ -273,8 +279,9 @@ dev_priv->ring.Size); } if(dev_priv->hw_status_page != 0UL) { - pci_free_consistent(dev->pdev, PAGE_SIZE, (void *)dev_priv->hw_status_page, - dev_priv->dma_status_page); + pci_free_consistent(dev->pdev, PAGE_SIZE, + (void *)dev_priv->hw_status_page, + dev_priv->dma_status_page); /* Need to rewrite hardware status page */ I810_WRITE(0x02080, 0x1ffff000); } @@ -301,8 +308,6 @@ end = jiffies + (HZ*3); while (ring->space < n) { - int i; - ring->head = I810_READ(LP_RING + RING_HEAD) & HEAD_ADDR; ring->space = ring->head - (ring->tail+8); if (ring->space < 0) ring->space += ring->Size; @@ -311,13 +316,12 @@ end = jiffies + (HZ*3); iters++; - if((signed)(end - jiffies) <= 0) { + if(time_before(end, jiffies)) { DRM_ERROR("space: %d wanted %d\n", ring->space, n); DRM_ERROR("lockup\n"); goto out_wait_ring; } - - for (i = 0 ; i < 2000 ; i++) ; + udelay(1); } out_wait_ring: @@ -405,9 +409,6 @@ ((u8 *)dev_priv->sarea_map->handle + init->sarea_priv_offset); - atomic_set(&dev_priv->flush_done, 0); - init_waitqueue_head(&dev_priv->flush_queue); - dev_priv->ring.Start = init->ring_start; dev_priv->ring.End = init->ring_end; dev_priv->ring.Size = init->ring_size; @@ -440,8 +441,9 @@ dev_priv->zi1 = init->depth_offset | init->pitch_bits; /* Program Hardware Status Page */ - dev_priv->hw_status_page = (unsigned long)pci_alloc_consistent(dev->pdev, PAGE_SIZE, - &dev_priv->dma_status_page); + dev_priv->hw_status_page = + (unsigned long) pci_alloc_consistent(dev->pdev, PAGE_SIZE, + &dev_priv->dma_status_page); if(dev_priv->hw_status_page == 0UL) { dev->dev_private = (void *)dev_priv; i810_dma_cleanup(dev); @@ -451,7 +453,7 @@ memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE); DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page); - I810_WRITE(0x02080, dev_priv->dma_status_page); + I810_WRITE(0x02080, dev_priv->dma_status_page); DRM_DEBUG("Enabled hardware status page\n"); /* Now we need to init our freelist */ @@ -532,16 +534,12 @@ /* Most efficient way to verify state for the i810 is as it is * emitted. Non-conformant state is silently dropped. - * - * Use 'volatile' & local var tmp to force the emitted values to be - * identical to the verified ones. */ static void i810EmitContextVerified( drm_device_t *dev, - volatile unsigned int *code ) + unsigned int *code ) { drm_i810_private_t *dev_priv = dev->dev_private; int i, j = 0; - unsigned int tmp; RING_LOCALS; BEGIN_LP_RING( I810_CTX_SETUP_SIZE ); @@ -553,14 +551,13 @@ OUT_RING( code[I810_CTXREG_ST1] ); for ( i = 4 ; i < I810_CTX_SETUP_SIZE ; i++ ) { - tmp = code[i]; - - if ((tmp & (7<<29)) == (3<<29) && - (tmp & (0x1f<<24)) < (0x1d<<24)) + if ((code[i] & (7<<29)) == (3<<29) && + (code[i] & (0x1f<<24)) < (0x1d<<24)) { - OUT_RING( tmp ); + OUT_RING( code[i] ); j++; } + else printk("constext state dropped!!!\n"); } if (j & 1) @@ -574,7 +571,6 @@ { drm_i810_private_t *dev_priv = dev->dev_private; int i, j = 0; - unsigned int tmp; RING_LOCALS; BEGIN_LP_RING( I810_TEX_SETUP_SIZE ); @@ -585,14 +581,14 @@ OUT_RING( code[I810_TEXREG_MI3] ); for ( i = 4 ; i < I810_TEX_SETUP_SIZE ; i++ ) { - tmp = code[i]; - if ((tmp & (7<<29)) == (3<<29) && - (tmp & (0x1f<<24)) < (0x1d<<24)) + if ((code[i] & (7<<29)) == (3<<29) && + (code[i] & (0x1f<<24)) < (0x1d<<24)) { - OUT_RING( tmp ); + OUT_RING( code[i] ); j++; } + else printk("texture state dropped!!!\n"); } if (j & 1) @@ -617,9 +613,9 @@ if (tmp == dev_priv->front_di1 || tmp == dev_priv->back_di1) { OUT_RING( CMD_OP_DESTBUFFER_INFO ); OUT_RING( tmp ); - } else - DRM_DEBUG("bad di1 %x (allow %x or %x)\n", - tmp, dev_priv->front_di1, dev_priv->back_di1); + } + else + printk("buffer state dropped\n"); /* invarient: */ @@ -704,7 +700,6 @@ continue; if ( flags & I810_FRONT ) { - DRM_DEBUG("clear front\n"); BEGIN_LP_RING( 6 ); OUT_RING( BR00_BITBLT_CLIENT | BR00_OP_COLOR_BLT | 0x3 ); @@ -717,7 +712,6 @@ } if ( flags & I810_BACK ) { - DRM_DEBUG("clear back\n"); BEGIN_LP_RING( 6 ); OUT_RING( BR00_BITBLT_CLIENT | BR00_OP_COLOR_BLT | 0x3 ); @@ -730,7 +724,6 @@ } if ( flags & I810_DEPTH ) { - DRM_DEBUG("clear depth\n"); BEGIN_LP_RING( 6 ); OUT_RING( BR00_BITBLT_CLIENT | BR00_OP_COLOR_BLT | 0x3 ); @@ -756,8 +749,6 @@ int i; RING_LOCALS; - DRM_DEBUG("swapbuffers\n"); - i810_kernel_lost_context(dev); if (nbox > I810_NR_SAREA_CLIPRECTS) @@ -776,10 +767,6 @@ pbox->y2 > dev_priv->h) continue; - DRM_DEBUG("dispatch swap %d,%d-%d,%d!\n", - pbox[i].x1, pbox[i].y1, - pbox[i].x2, pbox[i].y2); - BEGIN_LP_RING( 6 ); OUT_RING( BR00_BITBLT_CLIENT | BR00_OP_SRC_COPY_BLT | 0x4 ); OUT_RING( pitch | (0xCC << 16)); @@ -804,7 +791,7 @@ int nbox = sarea_priv->nbox; unsigned long address = (unsigned long)buf->bus_address; unsigned long start = address - dev->agp->base; - int i = 0, u; + int i = 0; RING_LOCALS; i810_kernel_lost_context(dev); @@ -812,33 +799,16 @@ if (nbox > I810_NR_SAREA_CLIPRECTS) nbox = I810_NR_SAREA_CLIPRECTS; - if (discard) { - u = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT, - I810_BUF_HARDWARE); - if(u != I810_BUF_CLIENT) { - DRM_DEBUG("xxxx 2\n"); - } - } - if (used > 4*1024) used = 0; if (sarea_priv->dirty) i810EmitState( dev ); - DRM_DEBUG("dispatch vertex addr 0x%lx, used 0x%x nbox %d\n", - address, used, nbox); - - dev_priv->counter++; - DRM_DEBUG( "dispatch counter : %ld\n", dev_priv->counter); - DRM_DEBUG( "i810_dma_dispatch\n"); - DRM_DEBUG( "start : %lx\n", start); - DRM_DEBUG( "used : %d\n", used); - DRM_DEBUG( "start + used - 4 : %ld\n", start + used - 4); - if (buf_priv->currently_mapped == I810_BUF_MAPPED) { - *(u32 *)buf_priv->virtual = (GFX_OP_PRIMITIVE | - sarea_priv->vertex_prim | + unsigned int prim = (sarea_priv->vertex_prim & PR_MASK); + + *(u32 *)buf_priv->virtual = (GFX_OP_PRIMITIVE | prim | ((used/4)-2)); if (used & 4) { @@ -871,154 +841,62 @@ } while (++i < nbox); } - BEGIN_LP_RING(10); - OUT_RING( CMD_STORE_DWORD_IDX ); - OUT_RING( 20 ); - OUT_RING( dev_priv->counter ); - OUT_RING( 0 ); - if (discard) { + dev_priv->counter++; + + (void) cmpxchg(buf_priv->in_use, I810_BUF_CLIENT, + I810_BUF_HARDWARE); + + BEGIN_LP_RING(8); + OUT_RING( CMD_STORE_DWORD_IDX ); + OUT_RING( 20 ); + OUT_RING( dev_priv->counter ); OUT_RING( CMD_STORE_DWORD_IDX ); OUT_RING( buf_priv->my_use_idx ); OUT_RING( I810_BUF_FREE ); + OUT_RING( CMD_REPORT_HEAD ); OUT_RING( 0 ); + ADVANCE_LP_RING(); } - - OUT_RING( CMD_REPORT_HEAD ); - OUT_RING( 0 ); - ADVANCE_LP_RING(); -} - - -/* Interrupts are only for flushing */ -void i810_dma_service(int irq, void *device, struct pt_regs *regs) -{ - drm_device_t *dev = (drm_device_t *)device; - drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; - u16 temp; - - atomic_inc(&dev->counts[_DRM_STAT_IRQ]); - temp = I810_READ16(I810REG_INT_IDENTITY_R); - temp = temp & ~(0x6000); - if(temp != 0) I810_WRITE16(I810REG_INT_IDENTITY_R, - temp); /* Clear all interrupts */ - else - return; - - queue_task(&dev->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); } -void i810_dma_immediate_bh(void *device) -{ - drm_device_t *dev = (drm_device_t *) device; - drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; - - atomic_set(&dev_priv->flush_done, 1); - wake_up_interruptible(&dev_priv->flush_queue); -} - -static inline void i810_dma_emit_flush(drm_device_t *dev) -{ - drm_i810_private_t *dev_priv = dev->dev_private; - RING_LOCALS; - i810_kernel_lost_context(dev); - - BEGIN_LP_RING(2); - OUT_RING( CMD_REPORT_HEAD ); - OUT_RING( GFX_OP_USER_INTERRUPT ); - ADVANCE_LP_RING(); - -/* i810_wait_ring( dev, dev_priv->ring.Size - 8 ); */ -/* atomic_set(&dev_priv->flush_done, 1); */ -/* wake_up_interruptible(&dev_priv->flush_queue); */ -} - -static inline void i810_dma_quiescent_emit(drm_device_t *dev) +void i810_dma_quiescent(drm_device_t *dev) { drm_i810_private_t *dev_priv = dev->dev_private; RING_LOCALS; +/* printk("%s\n", __FUNCTION__); */ + i810_kernel_lost_context(dev); BEGIN_LP_RING(4); OUT_RING( INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE ); OUT_RING( CMD_REPORT_HEAD ); OUT_RING( 0 ); - OUT_RING( GFX_OP_USER_INTERRUPT ); + OUT_RING( 0 ); ADVANCE_LP_RING(); -/* i810_wait_ring( dev, dev_priv->ring.Size - 8 ); */ -/* atomic_set(&dev_priv->flush_done, 1); */ -/* wake_up_interruptible(&dev_priv->flush_queue); */ -} - -void i810_dma_quiescent(drm_device_t *dev) -{ - DECLARE_WAITQUEUE(entry, current); - drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; - unsigned long end; - - if(dev_priv == NULL) { - return; - } - atomic_set(&dev_priv->flush_done, 0); - add_wait_queue(&dev_priv->flush_queue, &entry); - end = jiffies + (HZ*3); - - for (;;) { - current->state = TASK_INTERRUPTIBLE; - i810_dma_quiescent_emit(dev); - if (atomic_read(&dev_priv->flush_done) == 1) break; - if((signed)(end - jiffies) <= 0) { - DRM_ERROR("lockup\n"); - break; - } - schedule_timeout(HZ*3); - if (signal_pending(current)) { - break; - } - } - - current->state = TASK_RUNNING; - remove_wait_queue(&dev_priv->flush_queue, &entry); - - return; + i810_wait_ring( dev, dev_priv->ring.Size - 8 ); } static int i810_flush_queue(drm_device_t *dev) { - DECLARE_WAITQUEUE(entry, current); - drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + drm_i810_private_t *dev_priv = dev->dev_private; drm_device_dma_t *dma = dev->dma; - unsigned long end; int i, ret = 0; + RING_LOCALS; + +/* printk("%s\n", __FUNCTION__); */ - if(dev_priv == NULL) { - return 0; - } - atomic_set(&dev_priv->flush_done, 0); - add_wait_queue(&dev_priv->flush_queue, &entry); - end = jiffies + (HZ*3); - for (;;) { - current->state = TASK_INTERRUPTIBLE; - i810_dma_emit_flush(dev); - if (atomic_read(&dev_priv->flush_done) == 1) break; - if((signed)(end - jiffies) <= 0) { - DRM_ERROR("lockup\n"); - break; - } - schedule_timeout(HZ*3); - if (signal_pending(current)) { - ret = -EINTR; /* Can't restart */ - break; - } - } + i810_kernel_lost_context(dev); - current->state = TASK_RUNNING; - remove_wait_queue(&dev_priv->flush_queue, &entry); + BEGIN_LP_RING(2); + OUT_RING( CMD_REPORT_HEAD ); + OUT_RING( 0 ); + ADVANCE_LP_RING(); + i810_wait_ring( dev, dev_priv->ring.Size - 8 ); for (i = 0; i < dma->buf_count; i++) { drm_buf_t *buf = dma->buflist[ i ]; @@ -1030,7 +908,7 @@ if (used == I810_BUF_HARDWARE) DRM_DEBUG("reclaimed from HARDWARE\n"); if (used == I810_BUF_CLIENT) - DRM_DEBUG("still on client HARDWARE\n"); + DRM_DEBUG("still on client\n"); } return ret; @@ -1070,7 +948,6 @@ drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->dev; - DRM_DEBUG("i810_flush_ioctl\n"); if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { DRM_ERROR("i810_flush_ioctl called without lock held\n"); return -EINVAL; @@ -1101,9 +978,6 @@ return -EINVAL; } - DRM_DEBUG("i810 dma vertex, idx %d used %d discard %d\n", - vertex.idx, vertex.used, vertex.discard); - if(vertex.idx < 0 || vertex.idx > dma->buf_count) return -EINVAL; i810_dma_dispatch_vertex( dev, @@ -1152,8 +1026,6 @@ drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->dev; - DRM_DEBUG("i810_swap_bufs\n"); - if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { DRM_ERROR("i810_swap_buf called without lock held\n"); return -EINVAL; @@ -1189,7 +1061,6 @@ drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) dev_priv->sarea_priv; - DRM_DEBUG("getbuf\n"); if (copy_from_user(&d, (drm_i810_dma_t *)arg, sizeof(d))) return -EFAULT; @@ -1202,9 +1073,6 @@ retcode = i810_dma_get_buffer(dev, &d, filp); - DRM_DEBUG("i810_dma: %d returning %d, granted = %d\n", - current->pid, retcode, d.granted); - if (copy_to_user((drm_dma_t *)arg, &d, sizeof(d))) return -EFAULT; sarea_priv->last_dispatch = (int) hw_status[5]; @@ -1212,47 +1080,19 @@ return retcode; } -int i810_copybuf(struct inode *inode, struct file *filp, unsigned int cmd, - unsigned long arg) +int i810_copybuf(struct inode *inode, + struct file *filp, + unsigned int cmd, + unsigned long arg) { - drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; - drm_i810_copy_t d; - drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; - u32 *hw_status = (u32 *)dev_priv->hw_status_page; - drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) - dev_priv->sarea_priv; - drm_buf_t *buf; - drm_i810_buf_priv_t *buf_priv; - drm_device_dma_t *dma = dev->dma; - - if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("i810_dma called without lock held\n"); - return -EINVAL; - } - - if (copy_from_user(&d, (drm_i810_copy_t *)arg, sizeof(d))) - return -EFAULT; - - if(d.idx < 0 || d.idx > dma->buf_count) return -EINVAL; - buf = dma->buflist[ d.idx ]; - buf_priv = buf->dev_private; - if (buf_priv->currently_mapped != I810_BUF_MAPPED) return -EPERM; - - if(d.used < 0 || d.used > buf->total) return -EINVAL; - - if (copy_from_user(buf_priv->virtual, d.address, d.used)) - return -EFAULT; - - sarea_priv->last_dispatch = (int) hw_status[5]; - + /* Never copy - 2.4.x doesn't need it */ return 0; } int i810_docopy(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { - if(VM_DONTCOPY == 0) return 1; + /* Never copy - 2.4.x doesn't need it */ return 0; } @@ -1371,7 +1211,8 @@ data.offset = dev_priv->overlay_offset; data.physical = dev_priv->overlay_physical; - copy_to_user((drm_i810_overlay_t *)arg,&data,sizeof(data)); + if (copy_to_user((drm_i810_overlay_t *)arg,&data,sizeof(data))) + return -EFAULT; return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i810_drm.h linux-2.4.23-pre8/drivers/char/drm/i810_drm.h --- linux-2.4.22/drivers/char/drm/i810_drm.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i810_drm.h 2003-10-22 22:47:28.000000000 +0000 @@ -88,6 +88,8 @@ #define I810_TEXREG_MCS 7 /* GFX_OP_MAP_COORD_SETS ??? */ #define I810_TEX_SETUP_SIZE 8 +/* Flags for clear ioctl + */ #define I810_FRONT 0x1 #define I810_BACK 0x2 #define I810_DEPTH 0x4 @@ -166,14 +168,34 @@ } drm_i810_sarea_t; +/* WARNING: If you change any of these defines, make sure to wear a bullet + * proof vest since these are part of the stable kernel<->userspace ABI + */ + +/* i810 specific ioctls + * The device specific ioctl range is 0x40 to 0x79. + */ +#define DRM_IOCTL_I810_INIT DRM_IOW( 0x40, drm_i810_init_t) +#define DRM_IOCTL_I810_VERTEX DRM_IOW( 0x41, drm_i810_vertex_t) +#define DRM_IOCTL_I810_CLEAR DRM_IOW( 0x42, drm_i810_clear_t) +#define DRM_IOCTL_I810_FLUSH DRM_IO( 0x43) +#define DRM_IOCTL_I810_GETAGE DRM_IO( 0x44) +#define DRM_IOCTL_I810_GETBUF DRM_IOWR(0x45, drm_i810_dma_t) +#define DRM_IOCTL_I810_SWAP DRM_IO( 0x46) +#define DRM_IOCTL_I810_COPY DRM_IOW( 0x47, drm_i810_copy_t) +#define DRM_IOCTL_I810_DOCOPY DRM_IO( 0x48) +#define DRM_IOCTL_I810_OV0INFO DRM_IOR( 0x49, drm_i810_overlay_t) +#define DRM_IOCTL_I810_FSTATUS DRM_IO ( 0x4a) +#define DRM_IOCTL_I810_OV0FLIP DRM_IO ( 0x4b) +#define DRM_IOCTL_I810_MC DRM_IOW( 0x4c, drm_i810_mc_t) +#define DRM_IOCTL_I810_RSTATUS DRM_IO ( 0x4d ) + typedef struct _drm_i810_clear { int clear_color; int clear_depth; int flags; } drm_i810_clear_t; - - /* These may be placeholders if we have more cliprects than * I810_NR_SAREA_CLIPRECTS. In that case, the client sets discard to * false, indicating that the buffer will be dispatched again with a @@ -191,6 +213,17 @@ void *address; /* Address to copy from */ } drm_i810_copy_t; +#define PR_TRIANGLES (0x0<<18) +#define PR_TRISTRIP_0 (0x1<<18) +#define PR_TRISTRIP_1 (0x2<<18) +#define PR_TRIFAN (0x3<<18) +#define PR_POLYGON (0x4<<18) +#define PR_LINES (0x5<<18) +#define PR_LINESTRIP (0x6<<18) +#define PR_RECTS (0x7<<18) +#define PR_MASK (0x7<<18) + + typedef struct drm_i810_dma { void *virtual; int request_idx; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i810_drv.c linux-2.4.23-pre8/drivers/char/drm/i810_drv.c --- linux-2.4.22/drivers/char/drm/i810_drv.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i810_drv.c 2003-10-22 22:49:45.000000000 +0000 @@ -33,42 +33,10 @@ #include #include "i810.h" #include "drmP.h" +#include "drm.h" +#include "i810_drm.h" #include "i810_drv.h" -#define DRIVER_AUTHOR "VA Linux Systems Inc." - -#define DRIVER_NAME "i810" -#define DRIVER_DESC "Intel i810" -#define DRIVER_DATE "20010920" - -#define DRIVER_MAJOR 1 -#define DRIVER_MINOR 2 -#define DRIVER_PATCHLEVEL 0 - -#define DRIVER_IOCTLS \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_INIT)] = { i810_dma_init, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_VERTEX)] = { i810_dma_vertex, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_CLEAR)] = { i810_clear_bufs, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_FLUSH)] = { i810_flush_ioctl, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_GETAGE)] = { i810_getage, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_GETBUF)] = { i810_getbuf, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_SWAP)] = { i810_swap_bufs, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_COPY)] = { i810_copybuf, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_DOCOPY)] = { i810_docopy, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_OV0INFO)] = { i810_ov0_info, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_FSTATUS)] = { i810_fstatus, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_OV0FLIP)] = { i810_ov0_flip, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_MC)] = { i810_dma_mc, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I810_RSTATUS)] = { i810_rstatus, 1, 0 } - - -#define __HAVE_COUNTERS 4 -#define __HAVE_COUNTER6 _DRM_STAT_IRQ -#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY -#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY -#define __HAVE_COUNTER9 _DRM_STAT_DMA - - #include "drm_agpsupport.h" #include "drm_auth.h" #include "drm_bufs.h" @@ -77,25 +45,6 @@ #include "drm_drawable.h" #include "drm_drv.h" -#ifndef MODULE -/* DRM(options) is called by the kernel to parse command-line options - * passed via the boot-loader (e.g., LILO). It calls the insmod option - * routine, drm_parse_drm. - */ - -/* JH- We have to hand expand the string ourselves because of the cpp. If - * anyone can think of a way that we can fit into the __setup macro without - * changing it, then please send the solution my way. - */ -static int __init i810_options( char *str ) -{ - DRM(parse_options)( str ); - return 1; -} - -__setup( DRIVER_NAME "=", i810_options ); -#endif - #include "drm_fops.h" #include "drm_init.h" #include "drm_ioctl.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i810_drv.h linux-2.4.23-pre8/drivers/char/drm/i810_drv.h --- linux-2.4.22/drivers/char/drm/i810_drv.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i810_drv.h 2003-10-22 22:49:40.000000000 +0000 @@ -63,10 +63,9 @@ unsigned long hw_status_page; unsigned long counter; - dma_addr_t dma_status_page; - atomic_t flush_done; - wait_queue_head_t flush_queue; /* Processes waiting until flush */ + dma_addr_t dma_status_page; + drm_buf_t *mmap_buffer; @@ -78,6 +77,7 @@ int overlay_physical; int w, h; int pitch; + } drm_i810_private_t; /* i810_dma.c */ @@ -92,8 +92,13 @@ extern int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); extern int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma); + +/* Obsolete: + */ extern int i810_copybuf(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); +/* Obsolete: + */ extern int i810_docopy(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); @@ -111,9 +116,6 @@ extern void i810_dma_quiescent(drm_device_t *dev); -#define I810_VERBOSE 0 - - int i810_dma_vertex(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); @@ -196,6 +198,7 @@ #define CMD_OP_Z_BUFFER_INFO ((0x0<<29)|(0x16<<23)) #define CMD_OP_DESTBUFFER_INFO ((0x0<<29)|(0x15<<23)) +#define CMD_OP_FRONTBUFFER_INFO ((0x0<<29)|(0x14<<23)) #define BR00_BITBLT_CLIENT 0x40000000 #define BR00_OP_COLOR_BLT 0x10000000 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i830.h linux-2.4.23-pre8/drivers/char/drm/i830.h --- linux-2.4.22/drivers/char/drm/i830.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i830.h 2003-10-22 22:49:15.000000000 +0000 @@ -41,6 +41,48 @@ #define __HAVE_MTRR 1 #define __HAVE_CTX_BITMAP 1 +#define DRIVER_AUTHOR "VA Linux Systems Inc." + +#define DRIVER_NAME "i830" +#define DRIVER_DESC "Intel 830M" +#define DRIVER_DATE "20021108" + +/* Interface history: + * + * 1.1: Original. + * 1.2: ? + * 1.3: New irq emit/wait ioctls. + * New pageflip ioctl. + * New getparam ioctl. + * State for texunits 3&4 in sarea. + * New (alternative) layout for texture state. + */ +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 3 +#define DRIVER_PATCHLEVEL 2 + +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_INIT)] = { i830_dma_init, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_VERTEX)] = { i830_dma_vertex, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_CLEAR)] = { i830_clear_bufs, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_FLUSH)] = { i830_flush_ioctl, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_GETAGE)] = { i830_getage, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_GETBUF)] = { i830_getbuf, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_SWAP)] = { i830_swap_bufs, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_COPY)] = { i830_copybuf, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_DOCOPY)] = { i830_docopy, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_FLIP)] = { i830_flip_bufs, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_IRQ_EMIT)] = { i830_irq_emit, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_IRQ_WAIT)] = { i830_irq_wait, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_GETPARAM)] = { i830_getparam, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_I830_SETPARAM)] = { i830_setparam, 1, 0 } + +#define __HAVE_COUNTERS 4 +#define __HAVE_COUNTER6 _DRM_STAT_IRQ +#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY +#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY +#define __HAVE_COUNTER9 _DRM_STAT_DMA + /* Driver customization: */ #define __HAVE_RELEASE 1 @@ -60,51 +102,50 @@ i830_dma_quiescent( dev ); \ } while (0) + +/* Driver will work either way: IRQ's save cpu time when waiting for + * the card, but are subject to subtle interactions between bios, + * hardware and the driver. + */ +#define USE_IRQS 0 + + +#if USE_IRQS #define __HAVE_DMA_IRQ 1 -#define __HAVE_DMA_IRQ_BH 1 -#define __HAVE_SHARED_IRQ 1 -#define DRIVER_PREINSTALL() do { \ - drm_i830_private_t *dev_priv = \ - (drm_i830_private_t *)dev->dev_private; \ - u16 tmp; \ - tmp = I830_READ16( I830REG_HWSTAM ); \ - tmp = tmp & 0x6000; \ - I830_WRITE16( I830REG_HWSTAM, tmp ); \ - \ - tmp = I830_READ16( I830REG_INT_MASK_R ); \ - tmp = tmp & 0x6000; /* Unmask interrupts */ \ - I830_WRITE16( I830REG_INT_MASK_R, tmp ); \ - tmp = I830_READ16( I830REG_INT_ENABLE_R ); \ - tmp = tmp & 0x6000; /* Disable all interrupts */ \ - I830_WRITE16( I830REG_INT_ENABLE_R, tmp ); \ -} while (0) +#define __HAVE_SHARED_IRQ 1 -#define DRIVER_POSTINSTALL() do { \ - drm_i830_private_t *dev_priv = \ +#define DRIVER_PREINSTALL() do { \ + drm_i830_private_t *dev_priv = \ (drm_i830_private_t *)dev->dev_private; \ - u16 tmp; \ - tmp = I830_READ16( I830REG_INT_ENABLE_R ); \ - tmp = tmp & 0x6000; \ - tmp = tmp | 0x0003; /* Enable bp & user interrupts */ \ - I830_WRITE16( I830REG_INT_ENABLE_R, tmp ); \ + \ + I830_WRITE16( I830REG_HWSTAM, 0xffff ); \ + I830_WRITE16( I830REG_INT_MASK_R, 0x0 ); \ + I830_WRITE16( I830REG_INT_ENABLE_R, 0x0 ); \ } while (0) -#define DRIVER_UNINSTALL() do { \ - drm_i830_private_t *dev_priv = \ - (drm_i830_private_t *)dev->dev_private; \ - u16 tmp; \ - if ( dev_priv ) { \ - tmp = I830_READ16( I830REG_INT_IDENTITY_R ); \ - tmp = tmp & ~(0x6000); /* Clear all interrupts */ \ - if ( tmp != 0 ) \ - I830_WRITE16( I830REG_INT_IDENTITY_R, tmp ); \ - \ - tmp = I830_READ16( I830REG_INT_ENABLE_R ); \ - tmp = tmp & 0x6000; /* Disable all interrupts */ \ - I830_WRITE16( I830REG_INT_ENABLE_R, tmp ); \ - } \ + +#define DRIVER_POSTINSTALL() do { \ + drm_i830_private_t *dev_priv = \ + (drm_i830_private_t *)dev->dev_private; \ + I830_WRITE16( I830REG_INT_ENABLE_R, 0x2 ); \ + atomic_set(&dev_priv->irq_received, 0); \ + atomic_set(&dev_priv->irq_emitted, 0); \ + init_waitqueue_head(&dev_priv->irq_queue); \ } while (0) + +/* This gets called too late to be useful: dev_priv has already been + * freed. + */ +#define DRIVER_UNINSTALL() do { \ +} while (0) + +#else +#define __HAVE_DMA_IRQ 0 +#endif + + + /* Buffer customization: */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i830_dma.c linux-2.4.23-pre8/drivers/char/drm/i830_dma.c --- linux-2.4.22/drivers/char/drm/i830_dma.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i830_dma.c 2003-10-22 22:48:28.000000000 +0000 @@ -26,20 +26,22 @@ * * Authors: Rickard E. (Rik) Faith * Jeff Hartmann - * Keith Whitwell - * Abraham vd Merwe + * Keith Whitwell + * Abraham vd Merwe * */ + #include "i830.h" #include "drmP.h" +#include "drm.h" +#include "i830_drm.h" #include "i830_drv.h" #include /* For task queue support */ +#include /* For FASTCALL on unlock_page() */ #include -/* in case we don't have a 2.3.99-pre6 kernel or later: */ -#ifndef VM_DONTCOPY -#define VM_DONTCOPY 0 -#endif + +#define DO_MUNMAP(m, a, l) do_munmap(m, a, l) #define I830_BUF_FREE 2 #define I830_BUF_CLIENT 1 @@ -48,54 +50,24 @@ #define I830_BUF_UNMAPPED 0 #define I830_BUF_MAPPED 1 -#define RING_LOCALS unsigned int outring, ringmask; volatile char *virt; -#define DO_IDLE_WORKAROUND() \ -do { \ - int _head; \ - int _tail; \ - do { \ - _head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR; \ - _tail = I830_READ(LP_RING + RING_TAIL) & TAIL_ADDR; \ - udelay(1); \ - } while(_head != _tail); \ -} while(0) - -#define I830_SYNC_WORKAROUND 0 - -#define BEGIN_LP_RING(n) do { \ - if (I830_VERBOSE) \ - DRM_DEBUG("BEGIN_LP_RING(%d) in %s\n", \ - n, __FUNCTION__); \ - if (I830_SYNC_WORKAROUND) \ - DO_IDLE_WORKAROUND(); \ - if (dev_priv->ring.space < n*4) \ - i830_wait_ring(dev, n*4); \ - dev_priv->ring.space -= n*4; \ - outring = dev_priv->ring.tail; \ - ringmask = dev_priv->ring.tail_mask; \ - virt = dev_priv->ring.virtual_start; \ -} while (0) - -#define ADVANCE_LP_RING() do { \ - if (I830_VERBOSE) DRM_DEBUG("ADVANCE_LP_RING\n"); \ - dev_priv->ring.tail = outring; \ - I830_WRITE(LP_RING + RING_TAIL, outring); \ -} while(0) - -#define OUT_RING(n) do { \ - if (I830_VERBOSE) DRM_DEBUG(" OUT_RING %x\n", (int)(n)); \ - *(volatile unsigned int *)(virt + outring) = n; \ - outring += 4; \ - outring &= ringmask; \ -} while (0); + + + + + + + + + + static inline void i830_print_status_page(drm_device_t *dev) { drm_device_dma_t *dma = dev->dma; drm_i830_private_t *dev_priv = dev->dev_private; - u8 *temp = dev_priv->hw_status_page; + u32 *temp = (u32 *)dev_priv->hw_status_page; int i; DRM_DEBUG( "hw_status: Interrupt Status : %x\n", temp[0]); @@ -149,14 +121,14 @@ } static struct file_operations i830_buffer_fops = { - open: DRM(open), - flush: DRM(flush), - release: DRM(release), - ioctl: DRM(ioctl), - mmap: i830_mmap_buffers, - read: DRM(read), - fasync: DRM(fasync), - poll: DRM(poll), + .open = DRM(open), + .flush = DRM(flush), + .release = DRM(release), + .ioctl = DRM(ioctl), + .mmap = i830_mmap_buffers, + .read = DRM(read), + .fasync = DRM(fasync), + .poll = DRM(poll), }; int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma) @@ -179,7 +151,7 @@ buf_priv->currently_mapped = I830_BUF_MAPPED; unlock_kernel(); - if (remap_page_range(vma->vm_start, + if (remap_page_range(DRM_RPR_ARG(vma) vma->vm_start, VM_OFFSET(vma), vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; @@ -197,28 +169,24 @@ if(buf_priv->currently_mapped == I830_BUF_MAPPED) return -EINVAL; - if(VM_DONTCOPY != 0) { - down_write( ¤t->mm->mmap_sem ); - old_fops = filp->f_op; - filp->f_op = &i830_buffer_fops; - dev_priv->mmap_buffer = buf; - buf_priv->virtual = (void *)do_mmap(filp, 0, buf->total, - PROT_READ|PROT_WRITE, - MAP_SHARED, - buf->bus_address); - dev_priv->mmap_buffer = NULL; - filp->f_op = old_fops; - if ((unsigned long)buf_priv->virtual > -1024UL) { - /* Real error */ - DRM_DEBUG("mmap error\n"); - retcode = (signed int)buf_priv->virtual; - buf_priv->virtual = 0; - } - up_write( ¤t->mm->mmap_sem ); - } else { - buf_priv->virtual = buf_priv->kernel_virtual; - buf_priv->currently_mapped = I830_BUF_MAPPED; + down_write( ¤t->mm->mmap_sem ); + old_fops = filp->f_op; + filp->f_op = &i830_buffer_fops; + dev_priv->mmap_buffer = buf; + buf_priv->virtual = (void *)do_mmap(filp, 0, buf->total, + PROT_READ|PROT_WRITE, + MAP_SHARED, + buf->bus_address); + dev_priv->mmap_buffer = NULL; + filp->f_op = old_fops; + if ((unsigned long)buf_priv->virtual > -1024UL) { + /* Real error */ + DRM_ERROR("mmap error\n"); + retcode = (signed int)buf_priv->virtual; + buf_priv->virtual = 0; } + up_write( ¤t->mm->mmap_sem ); + return retcode; } @@ -227,15 +195,15 @@ drm_i830_buf_priv_t *buf_priv = buf->dev_private; int retcode = 0; - if(VM_DONTCOPY != 0) { - if(buf_priv->currently_mapped != I830_BUF_MAPPED) - return -EINVAL; - down_write( ¤t->mm->mmap_sem ); - retcode = do_munmap(current->mm, - (unsigned long)buf_priv->virtual, - (size_t) buf->total); - up_write( ¤t->mm->mmap_sem ); - } + if(buf_priv->currently_mapped != I830_BUF_MAPPED) + return -EINVAL; + + down_write(¤t->mm->mmap_sem); + retcode = DO_MUNMAP(current->mm, + (unsigned long)buf_priv->virtual, + (size_t) buf->total); + up_write(¤t->mm->mmap_sem); + buf_priv->currently_mapped = I830_BUF_UNMAPPED; buf_priv->virtual = 0; @@ -260,7 +228,7 @@ retcode = i830_map_buffer(buf, filp); if(retcode) { i830_freelist_put(dev, buf); - DRM_DEBUG("mapbuf failed, retcode %d\n", retcode); + DRM_ERROR("mapbuf failed, retcode %d\n", retcode); return retcode; } buf->pid = priv->pid; @@ -286,12 +254,22 @@ DRM(ioremapfree)((void *) dev_priv->ring.virtual_start, dev_priv->ring.Size); } - if(dev_priv->hw_status_page != NULL) { - pci_free_consistent(dev->pdev, PAGE_SIZE, - dev_priv->hw_status_page, dev_priv->dma_status_page); + if(dev_priv->hw_status_page != 0UL) { + pci_free_consistent(dev->pdev, PAGE_SIZE, + (void *)dev_priv->hw_status_page, + dev_priv->dma_status_page); /* Need to rewrite hardware status page */ I830_WRITE(0x02080, 0x1ffff000); } + + /* Disable interrupts here because after dev_private + * is freed, it's too late. + */ + if (dev->irq) { + I830_WRITE16( I830REG_INT_MASK_R, 0xffff ); + I830_WRITE16( I830REG_INT_ENABLE_R, 0x0 ); + } + DRM(free)(dev->dev_private, sizeof(drm_i830_private_t), DRM_MEM_DRIVER); dev->dev_private = NULL; @@ -305,7 +283,7 @@ return 0; } -static int i830_wait_ring(drm_device_t *dev, int n) +int i830_wait_ring(drm_device_t *dev, int n, const char *caller) { drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_ring_buffer_t *ring = &(dev_priv->ring); @@ -314,7 +292,7 @@ unsigned int last_head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR; end = jiffies + (HZ*3); - while (ring->space < n) { + while (ring->space < n) { ring->head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR; ring->space = ring->head - (ring->tail+8); if (ring->space < 0) ring->space += ring->Size; @@ -325,13 +303,13 @@ } iters++; - if(time_before(end,jiffies)) { + if(time_before(end, jiffies)) { DRM_ERROR("space: %d wanted %d\n", ring->space, n); DRM_ERROR("lockup\n"); goto out_wait_ring; } - - udelay(1); + udelay(1); + dev_priv->sarea_priv->perf_boxes |= I830_BOX_WAIT; } out_wait_ring: @@ -344,9 +322,12 @@ drm_i830_ring_buffer_t *ring = &(dev_priv->ring); ring->head = I830_READ(LP_RING + RING_HEAD) & HEAD_ADDR; - ring->tail = I830_READ(LP_RING + RING_TAIL); + ring->tail = I830_READ(LP_RING + RING_TAIL) & TAIL_ADDR; ring->space = ring->head - (ring->tail+8); if (ring->space < 0) ring->space += ring->Size; + + if (ring->head == ring->tail) + dev_priv->sarea_priv->perf_boxes |= I830_BOX_RING_EMPTY; } static int i830_freelist_init(drm_device_t *dev, drm_i830_private_t *dev_priv) @@ -420,9 +401,6 @@ ((u8 *)dev_priv->sarea_map->handle + init->sarea_priv_offset); - atomic_set(&dev_priv->flush_done, 0); - init_waitqueue_head(&dev_priv->flush_queue); - dev_priv->ring.Start = init->ring_start; dev_priv->ring.End = init->ring_end; dev_priv->ring.Size = init->ring_size; @@ -446,11 +424,17 @@ dev_priv->pitch = init->pitch; dev_priv->back_offset = init->back_offset; dev_priv->depth_offset = init->depth_offset; + dev_priv->front_offset = init->front_offset; dev_priv->front_di1 = init->front_offset | init->pitch_bits; dev_priv->back_di1 = init->back_offset | init->pitch_bits; dev_priv->zi1 = init->depth_offset | init->pitch_bits; + DRM_DEBUG("front_di1 %x\n", dev_priv->front_di1); + DRM_DEBUG("back_offset %x\n", dev_priv->back_offset); + DRM_DEBUG("back_di1 %x\n", dev_priv->back_di1); + DRM_DEBUG("pitch_bits %x\n", init->pitch_bits); + dev_priv->cpp = init->cpp; /* We are using seperate values as placeholders for mechanisms for * private backbuffer/depthbuffer usage. @@ -458,20 +442,23 @@ dev_priv->back_pitch = init->back_pitch; dev_priv->depth_pitch = init->depth_pitch; + dev_priv->do_boxes = 0; + dev_priv->use_mi_batchbuffer_start = 0; /* Program Hardware Status Page */ - dev_priv->hw_status_page = pci_alloc_consistent(dev->pdev, PAGE_SIZE, + dev_priv->hw_status_page = + (unsigned long) pci_alloc_consistent(dev->pdev, PAGE_SIZE, &dev_priv->dma_status_page); - if(dev_priv->hw_status_page == NULL) { + if(dev_priv->hw_status_page == 0UL) { dev->dev_private = (void *)dev_priv; i830_dma_cleanup(dev); DRM_ERROR("Can not allocate hardware status page\n"); return -ENOMEM; } - memset(dev_priv->hw_status_page, 0, PAGE_SIZE); - DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page); + memset((void *) dev_priv->hw_status_page, 0, PAGE_SIZE); + DRM_DEBUG("hw status page @ %lx\n", dev_priv->hw_status_page); - I830_WRITE(0x02080, dev_priv->dma_status_page); + I830_WRITE(0x02080, dev_priv->dma_status_page); DRM_DEBUG("Enabled hardware status page\n"); /* Now we need to init our freelist */ @@ -517,83 +504,107 @@ return retcode; } +#define GFX_OP_STIPPLE ((0x3<<29)|(0x1d<<24)|(0x83<<16)) +#define ST1_ENABLE (1<<16) +#define ST1_MASK (0xffff) + /* Most efficient way to verify state for the i830 is as it is * emitted. Non-conformant state is silently dropped. - * - * Use 'volatile' & local var tmp to force the emitted values to be - * identical to the verified ones. */ -static void i830EmitContextVerified( drm_device_t *dev, - volatile unsigned int *code ) +static void i830EmitContextVerified( drm_device_t *dev, + unsigned int *code ) { drm_i830_private_t *dev_priv = dev->dev_private; int i, j = 0; unsigned int tmp; RING_LOCALS; - BEGIN_LP_RING( I830_CTX_SETUP_SIZE ); - for ( i = 0 ; i < I830_CTX_SETUP_SIZE ; i++ ) { + BEGIN_LP_RING( I830_CTX_SETUP_SIZE + 4 ); + + for ( i = 0 ; i < I830_CTXREG_BLENDCOLR0 ; i++ ) { tmp = code[i]; + if ((tmp & (7<<29)) == CMD_3D && + (tmp & (0x1f<<24)) < (0x1d<<24)) { + OUT_RING( tmp ); + j++; + } else { + DRM_ERROR("Skipping %d\n", i); + } + } -#if 0 - if ((tmp & (7<<29)) == (3<<29) && + OUT_RING( STATE3D_CONST_BLEND_COLOR_CMD ); + OUT_RING( code[I830_CTXREG_BLENDCOLR] ); + j += 2; + + for ( i = I830_CTXREG_VF ; i < I830_CTXREG_MCSB0 ; i++ ) { + tmp = code[i]; + if ((tmp & (7<<29)) == CMD_3D && (tmp & (0x1f<<24)) < (0x1d<<24)) { OUT_RING( tmp ); j++; } else { - printk("Skipping %d\n", i); + DRM_ERROR("Skipping %d\n", i); } -#else - OUT_RING( tmp ); - j++; -#endif } + OUT_RING( STATE3D_MAP_COORD_SETBIND_CMD ); + OUT_RING( code[I830_CTXREG_MCSB1] ); + j += 2; + if (j & 1) OUT_RING( 0 ); ADVANCE_LP_RING(); } -static void i830EmitTexVerified( drm_device_t *dev, - volatile unsigned int *code ) +static void i830EmitTexVerified( drm_device_t *dev, unsigned int *code ) { drm_i830_private_t *dev_priv = dev->dev_private; int i, j = 0; unsigned int tmp; RING_LOCALS; - BEGIN_LP_RING( I830_TEX_SETUP_SIZE ); - - OUT_RING( GFX_OP_MAP_INFO ); - OUT_RING( code[I830_TEXREG_MI1] ); - OUT_RING( code[I830_TEXREG_MI2] ); - OUT_RING( code[I830_TEXREG_MI3] ); - OUT_RING( code[I830_TEXREG_MI4] ); - OUT_RING( code[I830_TEXREG_MI5] ); - - for ( i = 6 ; i < I830_TEX_SETUP_SIZE ; i++ ) { - tmp = code[i]; - OUT_RING( tmp ); - j++; - } + if (code[I830_TEXREG_MI0] == GFX_OP_MAP_INFO || + (code[I830_TEXREG_MI0] & ~(0xf*LOAD_TEXTURE_MAP0)) == + (STATE3D_LOAD_STATE_IMMEDIATE_2|4)) { + + BEGIN_LP_RING( I830_TEX_SETUP_SIZE ); + + OUT_RING( code[I830_TEXREG_MI0] ); /* TM0LI */ + OUT_RING( code[I830_TEXREG_MI1] ); /* TM0S0 */ + OUT_RING( code[I830_TEXREG_MI2] ); /* TM0S1 */ + OUT_RING( code[I830_TEXREG_MI3] ); /* TM0S2 */ + OUT_RING( code[I830_TEXREG_MI4] ); /* TM0S3 */ + OUT_RING( code[I830_TEXREG_MI5] ); /* TM0S4 */ + + for ( i = 6 ; i < I830_TEX_SETUP_SIZE ; i++ ) { + tmp = code[i]; + OUT_RING( tmp ); + j++; + } - if (j & 1) - OUT_RING( 0 ); + if (j & 1) + OUT_RING( 0 ); - ADVANCE_LP_RING(); + ADVANCE_LP_RING(); + } + else + printk("rejected packet %x\n", code[0]); } static void i830EmitTexBlendVerified( drm_device_t *dev, - volatile unsigned int *code, - volatile unsigned int num) + unsigned int *code, + unsigned int num) { drm_i830_private_t *dev_priv = dev->dev_private; int i, j = 0; unsigned int tmp; RING_LOCALS; - BEGIN_LP_RING( num ); + if (!num) + return; + + BEGIN_LP_RING( num + 1 ); for ( i = 0 ; i < num ; i++ ) { tmp = code[i]; @@ -616,6 +627,8 @@ int i; RING_LOCALS; + return; /* Is this right ? -- Arjan */ + BEGIN_LP_RING( 258 ); if(is_shared == 1) { @@ -629,44 +642,43 @@ OUT_RING(palette[i]); } OUT_RING(0); + /* KW: WHERE IS THE ADVANCE_LP_RING? This is effectively a noop! + */ } /* Need to do some additional checking when setting the dest buffer. */ static void i830EmitDestVerified( drm_device_t *dev, - volatile unsigned int *code ) + unsigned int *code ) { drm_i830_private_t *dev_priv = dev->dev_private; unsigned int tmp; RING_LOCALS; - BEGIN_LP_RING( I830_DEST_SETUP_SIZE + 6 ); + BEGIN_LP_RING( I830_DEST_SETUP_SIZE + 10 ); + tmp = code[I830_DESTREG_CBUFADDR]; - if (tmp == dev_priv->front_di1) { - /* Don't use fence when front buffer rendering */ - OUT_RING( CMD_OP_DESTBUFFER_INFO ); - OUT_RING( BUF_3D_ID_COLOR_BACK | - BUF_3D_PITCH(dev_priv->back_pitch * dev_priv->cpp) ); - OUT_RING( tmp ); + if (tmp == dev_priv->front_di1 || tmp == dev_priv->back_di1) { + if (((int)outring) & 8) { + OUT_RING(0); + OUT_RING(0); + } OUT_RING( CMD_OP_DESTBUFFER_INFO ); - OUT_RING( BUF_3D_ID_DEPTH | - BUF_3D_PITCH(dev_priv->depth_pitch * dev_priv->cpp)); - OUT_RING( dev_priv->zi1 ); - } else if(tmp == dev_priv->back_di1) { - OUT_RING( CMD_OP_DESTBUFFER_INFO ); OUT_RING( BUF_3D_ID_COLOR_BACK | BUF_3D_PITCH(dev_priv->back_pitch * dev_priv->cpp) | BUF_3D_USE_FENCE); OUT_RING( tmp ); + OUT_RING( 0 ); OUT_RING( CMD_OP_DESTBUFFER_INFO ); OUT_RING( BUF_3D_ID_DEPTH | BUF_3D_USE_FENCE | BUF_3D_PITCH(dev_priv->depth_pitch * dev_priv->cpp)); OUT_RING( dev_priv->zi1 ); + OUT_RING( 0 ); } else { - DRM_DEBUG("bad di1 %x (allow %x or %x)\n", + DRM_ERROR("bad di1 %x (allow %x or %x)\n", tmp, dev_priv->front_di1, dev_priv->back_di1); } @@ -688,25 +700,39 @@ if((tmp & ~0x3) == GFX_OP_SCISSOR_ENABLE) { OUT_RING( tmp ); } else { - DRM_DEBUG("bad scissor enable\n"); + DRM_ERROR("bad scissor enable\n"); OUT_RING( 0 ); } - OUT_RING( code[I830_DESTREG_SENABLE] ); - OUT_RING( GFX_OP_SCISSOR_RECT ); OUT_RING( code[I830_DESTREG_SR1] ); OUT_RING( code[I830_DESTREG_SR2] ); + OUT_RING( 0 ); ADVANCE_LP_RING(); } +static void i830EmitStippleVerified( drm_device_t *dev, + unsigned int *code ) +{ + drm_i830_private_t *dev_priv = dev->dev_private; + RING_LOCALS; + + BEGIN_LP_RING( 2 ); + OUT_RING( GFX_OP_STIPPLE ); + OUT_RING( code[1] ); + ADVANCE_LP_RING(); +} + + static void i830EmitState( drm_device_t *dev ) { drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_sarea_t *sarea_priv = dev_priv->sarea_priv; unsigned int dirty = sarea_priv->dirty; + DRM_DEBUG("%s %x\n", __FUNCTION__, dirty); + if (dirty & I830_UPLOAD_BUFFERS) { i830EmitDestVerified( dev, sarea_priv->BufferState ); sarea_priv->dirty &= ~I830_UPLOAD_BUFFERS; @@ -740,17 +766,154 @@ } if (dirty & I830_UPLOAD_TEX_PALETTE_SHARED) { - i830EmitTexPalette(dev, sarea_priv->Palette[0], 0, 1); + i830EmitTexPalette(dev, sarea_priv->Palette[0], 0, 1); + } else { + if (dirty & I830_UPLOAD_TEX_PALETTE_N(0)) { + i830EmitTexPalette(dev, sarea_priv->Palette[0], 0, 0); + sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(0); + } + if (dirty & I830_UPLOAD_TEX_PALETTE_N(1)) { + i830EmitTexPalette(dev, sarea_priv->Palette[1], 1, 0); + sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(1); + } + + /* 1.3: + */ +#if 0 + if (dirty & I830_UPLOAD_TEX_PALETTE_N(2)) { + i830EmitTexPalette(dev, sarea_priv->Palette2[0], 0, 0); + sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(2); + } + if (dirty & I830_UPLOAD_TEX_PALETTE_N(3)) { + i830EmitTexPalette(dev, sarea_priv->Palette2[1], 1, 0); + sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(2); + } +#endif + } + + /* 1.3: + */ + if (dirty & I830_UPLOAD_STIPPLE) { + i830EmitStippleVerified( dev, + sarea_priv->StippleState); + sarea_priv->dirty &= ~I830_UPLOAD_STIPPLE; + } + + if (dirty & I830_UPLOAD_TEX2) { + i830EmitTexVerified( dev, sarea_priv->TexState2 ); + sarea_priv->dirty &= ~I830_UPLOAD_TEX2; + } + + if (dirty & I830_UPLOAD_TEX3) { + i830EmitTexVerified( dev, sarea_priv->TexState3 ); + sarea_priv->dirty &= ~I830_UPLOAD_TEX3; + } + + + if (dirty & I830_UPLOAD_TEXBLEND2) { + i830EmitTexBlendVerified( + dev, + sarea_priv->TexBlendState2, + sarea_priv->TexBlendStateWordsUsed2); + + sarea_priv->dirty &= ~I830_UPLOAD_TEXBLEND2; + } + + if (dirty & I830_UPLOAD_TEXBLEND3) { + i830EmitTexBlendVerified( + dev, + sarea_priv->TexBlendState3, + sarea_priv->TexBlendStateWordsUsed3); + sarea_priv->dirty &= ~I830_UPLOAD_TEXBLEND3; + } +} + +/* ================================================================ + * Performance monitoring functions + */ + +static void i830_fill_box( drm_device_t *dev, + int x, int y, int w, int h, + int r, int g, int b ) +{ + drm_i830_private_t *dev_priv = dev->dev_private; + u32 color; + unsigned int BR13, CMD; + RING_LOCALS; + + BR13 = (0xF0 << 16) | (dev_priv->pitch * dev_priv->cpp) | (1<<24); + CMD = XY_COLOR_BLT_CMD; + x += dev_priv->sarea_priv->boxes[0].x1; + y += dev_priv->sarea_priv->boxes[0].y1; + + if (dev_priv->cpp == 4) { + BR13 |= (1<<25); + CMD |= (XY_COLOR_BLT_WRITE_ALPHA | XY_COLOR_BLT_WRITE_RGB); + color = (((0xff) << 24) | (r << 16) | (g << 8) | b); } else { - if (dirty & I830_UPLOAD_TEX_PALETTE_N(0)) { - i830EmitTexPalette(dev, sarea_priv->Palette[0], 0, 0); - sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(0); - } - if (dirty & I830_UPLOAD_TEX_PALETTE_N(1)) { - i830EmitTexPalette(dev, sarea_priv->Palette[1], 1, 0); - sarea_priv->dirty &= ~I830_UPLOAD_TEX_PALETTE_N(1); - } + color = (((r & 0xf8) << 8) | + ((g & 0xfc) << 3) | + ((b & 0xf8) >> 3)); + } + + BEGIN_LP_RING( 6 ); + OUT_RING( CMD ); + OUT_RING( BR13 ); + OUT_RING( (y << 16) | x ); + OUT_RING( ((y+h) << 16) | (x+w) ); + + if ( dev_priv->current_page == 1 ) { + OUT_RING( dev_priv->front_offset ); + } else { + OUT_RING( dev_priv->back_offset ); + } + + OUT_RING( color ); + ADVANCE_LP_RING(); +} + +static void i830_cp_performance_boxes( drm_device_t *dev ) +{ + drm_i830_private_t *dev_priv = dev->dev_private; + + /* Purple box for page flipping + */ + if ( dev_priv->sarea_priv->perf_boxes & I830_BOX_FLIP ) + i830_fill_box( dev, 4, 4, 8, 8, 255, 0, 255 ); + + /* Red box if we have to wait for idle at any point + */ + if ( dev_priv->sarea_priv->perf_boxes & I830_BOX_WAIT ) + i830_fill_box( dev, 16, 4, 8, 8, 255, 0, 0 ); + + /* Blue box: lost context? + */ + if ( dev_priv->sarea_priv->perf_boxes & I830_BOX_LOST_CONTEXT ) + i830_fill_box( dev, 28, 4, 8, 8, 0, 0, 255 ); + + /* Yellow box for texture swaps + */ + if ( dev_priv->sarea_priv->perf_boxes & I830_BOX_TEXTURE_LOAD ) + i830_fill_box( dev, 40, 4, 8, 8, 255, 255, 0 ); + + /* Green box if hardware never idles (as far as we can tell) + */ + if ( !(dev_priv->sarea_priv->perf_boxes & I830_BOX_RING_EMPTY) ) + i830_fill_box( dev, 64, 4, 8, 8, 0, 255, 0 ); + + + /* Draw bars indicating number of buffers allocated + * (not a great measure, easily confused) + */ + if (dev_priv->dma_used) { + int bar = dev_priv->dma_used / 10240; + if (bar > 100) bar = 100; + if (bar < 1) bar = 1; + i830_fill_box( dev, 4, 16, bar, 4, 196, 128, 128 ); + dev_priv->dma_used = 0; } + + dev_priv->sarea_priv->perf_boxes = 0; } static void i830_dma_dispatch_clear( drm_device_t *dev, int flags, @@ -768,6 +931,15 @@ unsigned int BR13, CMD, D_CMD; RING_LOCALS; + + if ( dev_priv->current_page == 1 ) { + unsigned int tmp = flags; + + flags &= ~(I830_FRONT | I830_BACK); + if ( tmp & I830_FRONT ) flags |= I830_BACK; + if ( tmp & I830_BACK ) flags |= I830_FRONT; + } + i830_kernel_lost_context(dev); switch(cpp) { @@ -808,7 +980,7 @@ OUT_RING( BR13 ); OUT_RING( (pbox->y1 << 16) | pbox->x1 ); OUT_RING( (pbox->y2 << 16) | pbox->x2 ); - OUT_RING( 0 ); + OUT_RING( dev_priv->front_offset ); OUT_RING( clear_color ); ADVANCE_LP_RING(); } @@ -847,13 +1019,17 @@ drm_clip_rect_t *pbox = sarea_priv->boxes; int pitch = dev_priv->pitch; int cpp = dev_priv->cpp; - int ofs = dev_priv->back_offset; int i; unsigned int CMD, BR13; RING_LOCALS; DRM_DEBUG("swapbuffers\n"); + i830_kernel_lost_context(dev); + + if (dev_priv->do_boxes) + i830_cp_performance_boxes( dev ); + switch(cpp) { case 2: BR13 = (pitch * cpp) | (0xCC << 16) | (1<<24); @@ -870,7 +1046,6 @@ break; } - i830_kernel_lost_context(dev); if (nbox > I830_NR_SAREA_CLIPRECTS) nbox = I830_NR_SAREA_CLIPRECTS; @@ -890,23 +1065,72 @@ BEGIN_LP_RING( 8 ); OUT_RING( CMD ); OUT_RING( BR13 ); + OUT_RING( (pbox->y1 << 16) | pbox->x1 ); + OUT_RING( (pbox->y2 << 16) | pbox->x2 ); - OUT_RING( (pbox->y1 << 16) | - pbox->x1 ); - OUT_RING( (pbox->y2 << 16) | - pbox->x2 ); - - OUT_RING( 0 /* front ofs always zero */ ); - OUT_RING( (pbox->y1 << 16) | - pbox->x1 ); + if (dev_priv->current_page == 0) + OUT_RING( dev_priv->front_offset ); + else + OUT_RING( dev_priv->back_offset ); + OUT_RING( (pbox->y1 << 16) | pbox->x1 ); OUT_RING( BR13 & 0xffff ); - OUT_RING( ofs ); + + if (dev_priv->current_page == 0) + OUT_RING( dev_priv->back_offset ); + else + OUT_RING( dev_priv->front_offset ); ADVANCE_LP_RING(); } } +static void i830_dma_dispatch_flip( drm_device_t *dev ) +{ + drm_i830_private_t *dev_priv = dev->dev_private; + RING_LOCALS; + + DRM_DEBUG( "%s: page=%d pfCurrentPage=%d\n", + __FUNCTION__, + dev_priv->current_page, + dev_priv->sarea_priv->pf_current_page); + + i830_kernel_lost_context(dev); + + if (dev_priv->do_boxes) { + dev_priv->sarea_priv->perf_boxes |= I830_BOX_FLIP; + i830_cp_performance_boxes( dev ); + } + + + BEGIN_LP_RING( 2 ); + OUT_RING( INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE ); + OUT_RING( 0 ); + ADVANCE_LP_RING(); + + BEGIN_LP_RING( 6 ); + OUT_RING( CMD_OP_DISPLAYBUFFER_INFO | ASYNC_FLIP ); + OUT_RING( 0 ); + if ( dev_priv->current_page == 0 ) { + OUT_RING( dev_priv->back_offset ); + dev_priv->current_page = 1; + } else { + OUT_RING( dev_priv->front_offset ); + dev_priv->current_page = 0; + } + OUT_RING(0); + ADVANCE_LP_RING(); + + + BEGIN_LP_RING( 2 ); + OUT_RING( MI_WAIT_FOR_EVENT | + MI_WAIT_FOR_PLANE_A_FLIP ); + OUT_RING( 0 ); + ADVANCE_LP_RING(); + + + dev_priv->sarea_priv->pf_current_page = dev_priv->current_page; +} static void i830_dma_dispatch_vertex(drm_device_t *dev, drm_buf_t *buf, @@ -936,7 +1160,7 @@ } } - if (used > 4*1024) + if (used > 4*1023) used = 0; if (sarea_priv->dirty) @@ -953,12 +1177,19 @@ DRM_DEBUG( "start + used - 4 : %ld\n", start + used - 4); if (buf_priv->currently_mapped == I830_BUF_MAPPED) { - *(u32 *)buf_priv->virtual = (GFX_OP_PRIMITIVE | - sarea_priv->vertex_prim | - ((used/4)-2)); + u32 *vp = buf_priv->virtual; + + vp[0] = (GFX_OP_PRIMITIVE | + sarea_priv->vertex_prim | + ((used/4)-2)); + + if (dev_priv->use_mi_batchbuffer_start) { + vp[used/4] = MI_BATCH_BUFFER_END; + used += 4; + } if (used & 4) { - *(u32 *)((u32)buf_priv->virtual + used) = 0; + vp[used/4] = 0; used += 4; } @@ -978,80 +1209,45 @@ ADVANCE_LP_RING(); } - BEGIN_LP_RING(4); + if (dev_priv->use_mi_batchbuffer_start) { + BEGIN_LP_RING(2); + OUT_RING( MI_BATCH_BUFFER_START | (2<<6) ); + OUT_RING( start | MI_BATCH_NON_SECURE ); + ADVANCE_LP_RING(); + } + else { + BEGIN_LP_RING(4); + OUT_RING( MI_BATCH_BUFFER ); + OUT_RING( start | MI_BATCH_NON_SECURE ); + OUT_RING( start + used - 4 ); + OUT_RING( 0 ); + ADVANCE_LP_RING(); + } - OUT_RING( MI_BATCH_BUFFER ); - OUT_RING( start | MI_BATCH_NON_SECURE ); - OUT_RING( start + used - 4 ); - OUT_RING( 0 ); - ADVANCE_LP_RING(); - } while (++i < nbox); } - BEGIN_LP_RING(10); - OUT_RING( CMD_STORE_DWORD_IDX ); - OUT_RING( 20 ); - OUT_RING( dev_priv->counter ); - OUT_RING( 0 ); - if (discard) { + dev_priv->counter++; + + (void) cmpxchg(buf_priv->in_use, I830_BUF_CLIENT, + I830_BUF_HARDWARE); + + BEGIN_LP_RING(8); + OUT_RING( CMD_STORE_DWORD_IDX ); + OUT_RING( 20 ); + OUT_RING( dev_priv->counter ); OUT_RING( CMD_STORE_DWORD_IDX ); OUT_RING( buf_priv->my_use_idx ); OUT_RING( I830_BUF_FREE ); + OUT_RING( CMD_REPORT_HEAD ); OUT_RING( 0 ); + ADVANCE_LP_RING(); } - - OUT_RING( CMD_REPORT_HEAD ); - OUT_RING( 0 ); - ADVANCE_LP_RING(); -} - -/* Interrupts are only for flushing */ -void i830_dma_service(int irq, void *device, struct pt_regs *regs) -{ - drm_device_t *dev = (drm_device_t *)device; - drm_i830_private_t *dev_priv = (drm_i830_private_t *)dev->dev_private; - u16 temp; - - temp = I830_READ16(I830REG_INT_IDENTITY_R); - temp = temp & ~(0x6000); - if(temp != 0) I830_WRITE16(I830REG_INT_IDENTITY_R, - temp); /* Clear all interrupts */ - else - return; - - queue_task(&dev->tq, &tq_immediate); - mark_bh(IMMEDIATE_BH); -} - -void DRM(dma_immediate_bh)(void *device) -{ - drm_device_t *dev = (drm_device_t *) device; - drm_i830_private_t *dev_priv = (drm_i830_private_t *)dev->dev_private; - - atomic_set(&dev_priv->flush_done, 1); - wake_up_interruptible(&dev_priv->flush_queue); } -static inline void i830_dma_emit_flush(drm_device_t *dev) -{ - drm_i830_private_t *dev_priv = dev->dev_private; - RING_LOCALS; - - i830_kernel_lost_context(dev); - BEGIN_LP_RING(2); - OUT_RING( CMD_REPORT_HEAD ); - OUT_RING( GFX_OP_USER_INTERRUPT ); - ADVANCE_LP_RING(); - - i830_wait_ring( dev, dev_priv->ring.Size - 8 ); - atomic_set(&dev_priv->flush_done, 1); - wake_up_interruptible(&dev_priv->flush_queue); -} - -static inline void i830_dma_quiescent_emit(drm_device_t *dev) +void i830_dma_quiescent(drm_device_t *dev) { drm_i830_private_t *dev_priv = dev->dev_private; RING_LOCALS; @@ -1062,79 +1258,27 @@ OUT_RING( INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE ); OUT_RING( CMD_REPORT_HEAD ); OUT_RING( 0 ); - OUT_RING( GFX_OP_USER_INTERRUPT ); + OUT_RING( 0 ); ADVANCE_LP_RING(); - i830_wait_ring( dev, dev_priv->ring.Size - 8 ); - atomic_set(&dev_priv->flush_done, 1); - wake_up_interruptible(&dev_priv->flush_queue); -} - -void i830_dma_quiescent(drm_device_t *dev) -{ - DECLARE_WAITQUEUE(entry, current); - drm_i830_private_t *dev_priv = (drm_i830_private_t *)dev->dev_private; - unsigned long end; - - if(dev_priv == NULL) { - return; - } - atomic_set(&dev_priv->flush_done, 0); - add_wait_queue(&dev_priv->flush_queue, &entry); - end = jiffies + (HZ*3); - - for (;;) { - current->state = TASK_INTERRUPTIBLE; - i830_dma_quiescent_emit(dev); - if (atomic_read(&dev_priv->flush_done) == 1) break; - if(time_before(end, jiffies)) { - DRM_ERROR("lockup\n"); - break; - } - schedule_timeout(HZ*3); - if (signal_pending(current)) { - break; - } - } - - current->state = TASK_RUNNING; - remove_wait_queue(&dev_priv->flush_queue, &entry); - - return; + i830_wait_ring( dev, dev_priv->ring.Size - 8, __FUNCTION__ ); } static int i830_flush_queue(drm_device_t *dev) { - DECLARE_WAITQUEUE(entry, current); - drm_i830_private_t *dev_priv = (drm_i830_private_t *)dev->dev_private; + drm_i830_private_t *dev_priv = dev->dev_private; drm_device_dma_t *dma = dev->dma; - unsigned long end; - int i, ret = 0; + int i, ret = 0; + RING_LOCALS; + + i830_kernel_lost_context(dev); - if(dev_priv == NULL) { - return 0; - } - atomic_set(&dev_priv->flush_done, 0); - add_wait_queue(&dev_priv->flush_queue, &entry); - end = jiffies + (HZ*3); - for (;;) { - current->state = TASK_INTERRUPTIBLE; - i830_dma_emit_flush(dev); - if (atomic_read(&dev_priv->flush_done) == 1) break; - if(time_before(end, jiffies)) { - DRM_ERROR("lockup\n"); - break; - } - schedule_timeout(HZ*3); - if (signal_pending(current)) { - ret = -EINTR; /* Can't restart */ - break; - } - } - - current->state = TASK_RUNNING; - remove_wait_queue(&dev_priv->flush_queue, &entry); + BEGIN_LP_RING(2); + OUT_RING( CMD_REPORT_HEAD ); + OUT_RING( 0 ); + ADVANCE_LP_RING(); + i830_wait_ring( dev, dev_priv->ring.Size - 8, __FUNCTION__ ); for (i = 0; i < dma->buf_count; i++) { drm_buf_t *buf = dma->buflist[ i ]; @@ -1146,7 +1290,7 @@ if (used == I830_BUF_HARDWARE) DRM_DEBUG("reclaimed from HARDWARE\n"); if (used == I830_BUF_CLIENT) - DRM_DEBUG("still on client HARDWARE\n"); + DRM_DEBUG("still on client\n"); } return ret; @@ -1185,8 +1329,7 @@ { drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->dev; - - DRM_DEBUG("i830_flush_ioctl\n"); + if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { DRM_ERROR("i830_flush_ioctl called without lock held\n"); return -EINVAL; @@ -1275,6 +1418,53 @@ return 0; } + + +/* Not sure why this isn't set all the time: + */ +static void i830_do_init_pageflip( drm_device_t *dev ) +{ + drm_i830_private_t *dev_priv = dev->dev_private; + + DRM_DEBUG("%s\n", __FUNCTION__); + dev_priv->page_flipping = 1; + dev_priv->current_page = 0; + dev_priv->sarea_priv->pf_current_page = dev_priv->current_page; +} + +int i830_do_cleanup_pageflip( drm_device_t *dev ) +{ + drm_i830_private_t *dev_priv = dev->dev_private; + + DRM_DEBUG("%s\n", __FUNCTION__); + if (dev_priv->current_page != 0) + i830_dma_dispatch_flip( dev ); + + dev_priv->page_flipping = 0; + return 0; +} + +int i830_flip_bufs(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i830_private_t *dev_priv = dev->dev_private; + + DRM_DEBUG("%s\n", __FUNCTION__); + + if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { + DRM_ERROR("i830_flip_buf called without lock held\n"); + return -EINVAL; + } + + if (!dev_priv->page_flipping) + i830_do_init_pageflip( dev ); + + i830_dma_dispatch_flip( dev ); + return 0; +} + int i830_getage(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { @@ -1324,46 +1514,80 @@ return retcode; } -int i830_copybuf(struct inode *inode, struct file *filp, unsigned int cmd, +int i830_copybuf(struct inode *inode, + struct file *filp, + unsigned int cmd, + unsigned long arg) +{ + /* Never copy - 2.4.x doesn't need it */ + return 0; +} + +int i830_docopy(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { + return 0; +} + + + +int i830_getparam( struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg ) +{ drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->dev; - drm_i830_copy_t d; - drm_i830_private_t *dev_priv = (drm_i830_private_t *)dev->dev_private; - u32 *hw_status = (u32 *)dev_priv->hw_status_page; - drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *) - dev_priv->sarea_priv; - drm_buf_t *buf; - drm_i830_buf_priv_t *buf_priv; - drm_device_dma_t *dma = dev->dma; + drm_i830_private_t *dev_priv = dev->dev_private; + drm_i830_getparam_t param; + int value; - if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { - DRM_ERROR("i830_dma called without lock held\n"); + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); return -EINVAL; } - - if (copy_from_user(&d, (drm_i830_copy_t *)arg, sizeof(d))) - return -EFAULT; - - if(d.idx < 0 || d.idx > dma->buf_count) return -EINVAL; - buf = dma->buflist[ d.idx ]; - buf_priv = buf->dev_private; - if (buf_priv->currently_mapped != I830_BUF_MAPPED) return -EPERM; - - if(d.used < 0 || d.used > buf->total) return -EINVAL; - if (copy_from_user(buf_priv->virtual, d.address, d.used)) + if (copy_from_user(¶m, (drm_i830_getparam_t *)arg, sizeof(param) )) return -EFAULT; - sarea_priv->last_dispatch = (int) hw_status[5]; + switch( param.param ) { + case I830_PARAM_IRQ_ACTIVE: + value = dev->irq ? 1 : 0; + break; + default: + return -EINVAL; + } + if ( copy_to_user( param.value, &value, sizeof(int) ) ) { + DRM_ERROR( "copy_to_user\n" ); + return -EFAULT; + } + return 0; } -int i830_docopy(struct inode *inode, struct file *filp, unsigned int cmd, - unsigned long arg) + +int i830_setparam( struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg ) { - if(VM_DONTCOPY == 0) return 1; + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i830_private_t *dev_priv = dev->dev_private; + drm_i830_setparam_t param; + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + if (copy_from_user(¶m, (drm_i830_setparam_t *)arg, sizeof(param) )) + return -EFAULT; + + switch( param.param ) { + case I830_SETPARAM_USE_MI_BATCHBUFFER_START: + dev_priv->use_mi_batchbuffer_start = param.value; + break; + default: + return -EINVAL; + } + return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i830_drm.h linux-2.4.23-pre8/drivers/char/drm/i830_drm.h --- linux-2.4.22/drivers/char/drm/i830_drm.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i830_drm.h 2003-10-22 22:49:08.000000000 +0000 @@ -3,6 +3,9 @@ /* WARNING: These defines must be the same as what the Xserver uses. * if you change them, you must change the defines in the Xserver. + * + * KW: Actually, you can't ever change them because doing so would + * break backwards compatibility. */ #ifndef _I830_DEFINES_ @@ -18,14 +21,12 @@ #define I830_NR_TEX_REGIONS 64 #define I830_LOG_MIN_TEX_REGION_SIZE 16 -/* if defining I830_ENABLE_4_TEXTURES, do it in i830_3d_reg.h, too */ -#if !defined(I830_ENABLE_4_TEXTURES) +/* KW: These aren't correct but someone set them to two and then + * released the module. Now we can't change them as doing so would + * break backwards compatibility. + */ #define I830_TEXTURE_COUNT 2 -#define I830_TEXBLEND_COUNT 2 /* always same as TEXTURE_COUNT? */ -#else /* defined(I830_ENABLE_4_TEXTURES) */ -#define I830_TEXTURE_COUNT 4 -#define I830_TEXBLEND_COUNT 4 /* always same as TEXTURE_COUNT? */ -#endif /* I830_ENABLE_4_TEXTURES */ +#define I830_TEXBLEND_COUNT I830_TEXTURE_COUNT #define I830_TEXBLEND_SIZE 12 /* (4 args + op) * 2 + COLOR_FACTOR */ @@ -57,6 +58,7 @@ #define I830_UPLOAD_TEXBLEND_MASK 0xf00000 #define I830_UPLOAD_TEX_PALETTE_N(n) (0x1000000 << (n)) #define I830_UPLOAD_TEX_PALETTE_SHARED 0x4000000 +#define I830_UPLOAD_STIPPLE 0x8000000 /* Indices into buf.Setup where various bits of state are mirrored per * context and per buffer. These can be fired at the card as a unit, @@ -73,7 +75,6 @@ */ #define I830_DESTREG_CBUFADDR 0 -/* Invarient */ #define I830_DESTREG_DBUFADDR 1 #define I830_DESTREG_DV0 2 #define I830_DESTREG_DV1 3 @@ -109,6 +110,13 @@ #define I830_CTXREG_MCSB1 16 #define I830_CTX_SETUP_SIZE 17 +/* 1.3: Stipple state + */ +#define I830_STPREG_ST0 0 +#define I830_STPREG_ST1 1 +#define I830_STP_SETUP_SIZE 2 + + /* Texture state (per tex unit) */ @@ -124,6 +132,18 @@ #define I830_TEXREG_MCS 9 /* GFX_OP_MAP_COORD_SETS */ #define I830_TEX_SETUP_SIZE 10 +#define I830_TEXREG_TM0LI 0 /* load immediate 2 texture map n */ +#define I830_TEXREG_TM0S0 1 +#define I830_TEXREG_TM0S1 2 +#define I830_TEXREG_TM0S2 3 +#define I830_TEXREG_TM0S3 4 +#define I830_TEXREG_TM0S4 5 +#define I830_TEXREG_NOP0 6 /* noop */ +#define I830_TEXREG_NOP1 7 /* noop */ +#define I830_TEXREG_NOP2 8 /* noop */ +#define __I830_TEXREG_MCS 9 /* GFX_OP_MAP_COORD_SETS -- shared */ +#define __I830_TEX_SETUP_SIZE 10 + #define I830_FRONT 0x1 #define I830_BACK 0x2 #define I830_DEPTH 0x4 @@ -199,8 +219,53 @@ int ctxOwner; /* last context to upload state */ int vertex_prim; + + int pf_enabled; /* is pageflipping allowed? */ + int pf_active; + int pf_current_page; /* which buffer is being displayed? */ + + int perf_boxes; /* performance boxes to be displayed */ + + /* Here's the state for texunits 2,3: + */ + unsigned int TexState2[I830_TEX_SETUP_SIZE]; + unsigned int TexBlendState2[I830_TEXBLEND_SIZE]; + unsigned int TexBlendStateWordsUsed2; + + unsigned int TexState3[I830_TEX_SETUP_SIZE]; + unsigned int TexBlendState3[I830_TEXBLEND_SIZE]; + unsigned int TexBlendStateWordsUsed3; + + unsigned int StippleState[I830_STP_SETUP_SIZE]; } drm_i830_sarea_t; +/* Flags for perf_boxes + */ +#define I830_BOX_RING_EMPTY 0x1 /* populated by kernel */ +#define I830_BOX_FLIP 0x2 /* populated by kernel */ +#define I830_BOX_WAIT 0x4 /* populated by kernel & client */ +#define I830_BOX_TEXTURE_LOAD 0x8 /* populated by kernel */ +#define I830_BOX_LOST_CONTEXT 0x10 /* populated by client */ + + +/* I830 specific ioctls + * The device specific ioctl range is 0x40 to 0x79. + */ +#define DRM_IOCTL_I830_INIT DRM_IOW( 0x40, drm_i830_init_t) +#define DRM_IOCTL_I830_VERTEX DRM_IOW( 0x41, drm_i830_vertex_t) +#define DRM_IOCTL_I830_CLEAR DRM_IOW( 0x42, drm_i830_clear_t) +#define DRM_IOCTL_I830_FLUSH DRM_IO ( 0x43) +#define DRM_IOCTL_I830_GETAGE DRM_IO ( 0x44) +#define DRM_IOCTL_I830_GETBUF DRM_IOWR(0x45, drm_i830_dma_t) +#define DRM_IOCTL_I830_SWAP DRM_IO ( 0x46) +#define DRM_IOCTL_I830_COPY DRM_IOW( 0x47, drm_i830_copy_t) +#define DRM_IOCTL_I830_DOCOPY DRM_IO ( 0x48) +#define DRM_IOCTL_I830_FLIP DRM_IO ( 0x49) +#define DRM_IOCTL_I830_IRQ_EMIT DRM_IOWR(0x4a, drm_i830_irq_emit_t) +#define DRM_IOCTL_I830_IRQ_WAIT DRM_IOW( 0x4b, drm_i830_irq_wait_t) +#define DRM_IOCTL_I830_GETPARAM DRM_IOWR(0x4c, drm_i830_getparam_t) +#define DRM_IOCTL_I830_SETPARAM DRM_IOWR(0x4d, drm_i830_setparam_t) + typedef struct _drm_i830_clear { int clear_color; int clear_depth; @@ -235,4 +300,36 @@ int granted; } drm_i830_dma_t; + +/* 1.3: Userspace can request & wait on irq's: + */ +typedef struct drm_i830_irq_emit { + int *irq_seq; +} drm_i830_irq_emit_t; + +typedef struct drm_i830_irq_wait { + int irq_seq; +} drm_i830_irq_wait_t; + + +/* 1.3: New ioctl to query kernel params: + */ +#define I830_PARAM_IRQ_ACTIVE 1 + +typedef struct drm_i830_getparam { + int param; + int *value; +} drm_i830_getparam_t; + + +/* 1.3: New ioctl to set kernel params: + */ +#define I830_SETPARAM_USE_MI_BATCHBUFFER_START 1 + +typedef struct drm_i830_setparam { + int param; + int value; +} drm_i830_setparam_t; + + #endif /* _I830_DRM_H_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i830_drv.c linux-2.4.23-pre8/drivers/char/drm/i830_drv.c --- linux-2.4.22/drivers/char/drm/i830_drv.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i830_drv.c 2003-10-22 22:47:44.000000000 +0000 @@ -29,41 +29,16 @@ * Jeff Hartmann * Gareth Hughes * Abraham vd Merwe + * Keith Whitwell */ #include #include "i830.h" #include "drmP.h" +#include "drm.h" +#include "i830_drm.h" #include "i830_drv.h" -#define DRIVER_AUTHOR "VA Linux Systems Inc." - -#define DRIVER_NAME "i830" -#define DRIVER_DESC "Intel 830M" -#define DRIVER_DATE "20011004" - -#define DRIVER_MAJOR 1 -#define DRIVER_MINOR 2 -#define DRIVER_PATCHLEVEL 0 - -#define DRIVER_IOCTLS \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_INIT)] = { i830_dma_init, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_VERTEX)] = { i830_dma_vertex, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_CLEAR)] = { i830_clear_bufs, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_FLUSH)] = { i830_flush_ioctl, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_GETAGE)] = { i830_getage, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_GETBUF)] = { i830_getbuf, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_SWAP)] = { i830_swap_bufs, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_COPY)] = { i830_copybuf, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_I830_DOCOPY)] = { i830_docopy, 1, 0 }, - -#define __HAVE_COUNTERS 4 -#define __HAVE_COUNTER6 _DRM_STAT_IRQ -#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY -#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY -#define __HAVE_COUNTER9 _DRM_STAT_DMA - - #include "drm_agpsupport.h" #include "drm_auth.h" #include "drm_bufs.h" @@ -72,25 +47,6 @@ #include "drm_drawable.h" #include "drm_drv.h" -#ifndef MODULE -/* DRM(options) is called by the kernel to parse command-line options - * passed via the boot-loader (e.g., LILO). It calls the insmod option - * routine, drm_parse_drm. - */ - -/* JH- We have to hand expand the string ourselves because of the cpp. If - * anyone can think of a way that we can fit into the __setup macro without - * changing it, then please send the solution my way. - */ -static int __init i830_options( char *str ) -{ - DRM(parse_options)( str ); - return 1; -} - -__setup( DRIVER_NAME "=", i830_options ); -#endif - #include "drm_fops.h" #include "drm_init.h" #include "drm_ioctl.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i830_drv.h linux-2.4.23-pre8/drivers/char/drm/i830_drv.h --- linux-2.4.22/drivers/char/drm/i830_drv.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i830_drv.h 2003-10-22 22:48:59.000000000 +0000 @@ -61,24 +61,36 @@ drm_i830_sarea_t *sarea_priv; drm_i830_ring_buffer_t ring; - u8 *hw_status_page; + unsigned long hw_status_page; unsigned long counter; - - dma_addr_t dma_status_page; - atomic_t flush_done; - wait_queue_head_t flush_queue; /* Processes waiting until flush */ + dma_addr_t dma_status_page; + drm_buf_t *mmap_buffer; u32 front_di1, back_di1, zi1; int back_offset; int depth_offset; + int front_offset; int w, h; int pitch; int back_pitch; int depth_pitch; unsigned int cpp; + + int do_boxes; + int dma_used; + + int current_page; + int page_flipping; + + wait_queue_head_t irq_queue; + atomic_t irq_received; + atomic_t irq_emitted; + + int use_mi_batchbuffer_start; + } drm_i830_private_t; /* i830_dma.c */ @@ -109,24 +121,81 @@ extern int i830_clear_bufs(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); -#define I830_VERBOSE 0 +extern int i830_flip_bufs(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); + +extern int i830_getparam( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ); + +extern int i830_setparam( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ); + +/* i830_irq.c */ +extern int i830_irq_emit( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ); +extern int i830_irq_wait( struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg ); +extern int i830_wait_irq(drm_device_t *dev, int irq_nr); +extern int i830_emit_irq(drm_device_t *dev); + #define I830_BASE(reg) ((unsigned long) \ dev_priv->mmio_map->handle) #define I830_ADDR(reg) (I830_BASE(reg) + reg) -#define I830_DEREF(reg) *(__volatile__ int *)I830_ADDR(reg) -#define I830_READ(reg) I830_DEREF(reg) -#define I830_WRITE(reg,val) do { I830_DEREF(reg) = val; } while (0) +#define I830_DEREF(reg) *(__volatile__ unsigned int *)I830_ADDR(reg) +#define I830_READ(reg) readl((volatile u32 *)I830_ADDR(reg)) +#define I830_WRITE(reg,val) writel(val, (volatile u32 *)I830_ADDR(reg)) #define I830_DEREF16(reg) *(__volatile__ u16 *)I830_ADDR(reg) #define I830_READ16(reg) I830_DEREF16(reg) #define I830_WRITE16(reg,val) do { I830_DEREF16(reg) = val; } while (0) + + +#define I830_VERBOSE 0 + +#define RING_LOCALS unsigned int outring, ringmask, outcount; \ + volatile char *virt; + +#define BEGIN_LP_RING(n) do { \ + if (I830_VERBOSE) \ + printk("BEGIN_LP_RING(%d) in %s\n", \ + n, __FUNCTION__); \ + if (dev_priv->ring.space < n*4) \ + i830_wait_ring(dev, n*4, __FUNCTION__); \ + outcount = 0; \ + outring = dev_priv->ring.tail; \ + ringmask = dev_priv->ring.tail_mask; \ + virt = dev_priv->ring.virtual_start; \ +} while (0) + + +#define OUT_RING(n) do { \ + if (I830_VERBOSE) printk(" OUT_RING %x\n", (int)(n)); \ + *(volatile unsigned int *)(virt + outring) = n; \ + outcount++; \ + outring += 4; \ + outring &= ringmask; \ +} while (0) + +#define ADVANCE_LP_RING() do { \ + if (I830_VERBOSE) printk("ADVANCE_LP_RING %x\n", outring); \ + dev_priv->ring.tail = outring; \ + dev_priv->ring.space -= outcount * 4; \ + I830_WRITE(LP_RING + RING_TAIL, outring); \ +} while(0) + +extern int i830_wait_ring(drm_device_t *dev, int n, const char *caller); + + #define GFX_OP_USER_INTERRUPT ((0<<29)|(2<<23)) #define GFX_OP_BREAKPOINT_INTERRUPT ((0<<29)|(1<<23)) #define CMD_REPORT_HEAD (7<<23) #define CMD_STORE_DWORD_IDX ((0x21<<23) | 0x1) #define CMD_OP_BATCH_BUFFER ((0x0<<29)|(0x30<<23)|0x1) +#define STATE3D_LOAD_STATE_IMMEDIATE_2 ((0x3<<29)|(0x1d<<24)|(0x03<<16)) +#define LOAD_TEXTURE_MAP0 (1<<11) + #define INST_PARSER_CLIENT 0x00000000 #define INST_OP_FLUSH 0x02000000 #define INST_FLUSH_MAP_CACHE 0x00000001 @@ -142,18 +211,21 @@ #define I830REG_INT_MASK_R 0x020a8 #define I830REG_INT_ENABLE_R 0x020a0 +#define I830_IRQ_RESERVED ((1<<13)|(3<<2)) + + #define LP_RING 0x2030 #define HP_RING 0x2040 #define RING_TAIL 0x00 -#define TAIL_ADDR 0x000FFFF8 +#define TAIL_ADDR 0x001FFFF8 #define RING_HEAD 0x04 #define HEAD_WRAP_COUNT 0xFFE00000 #define HEAD_WRAP_ONE 0x00200000 #define HEAD_ADDR 0x001FFFFC #define RING_START 0x08 -#define START_ADDR 0x00FFFFF8 +#define START_ADDR 0x0xFFFFF000 #define RING_LEN 0x0C -#define RING_NR_PAGES 0x000FF000 +#define RING_NR_PAGES 0x001FF000 #define RING_REPORT_MASK 0x00000006 #define RING_REPORT_64K 0x00000002 #define RING_REPORT_128K 0x00000004 @@ -184,6 +256,12 @@ #define CMD_OP_DESTBUFFER_INFO ((0x3<<29)|(0x1d<<24)|(0x8e<<16)|1) +#define CMD_OP_DISPLAYBUFFER_INFO ((0x0<<29)|(0x14<<23)|2) +#define ASYNC_FLIP (1<<22) + +#define CMD_3D (0x3<<29) +#define STATE3D_CONST_BLEND_COLOR_CMD (CMD_3D|(0x1d<<24)|(0x88<<16)) +#define STATE3D_MAP_COORD_SETBIND_CMD (CMD_3D|(0x1d<<24)|(0x02<<16)) #define BR00_BITBLT_CLIENT 0x40000000 #define BR00_OP_COLOR_BLT 0x10000000 @@ -208,8 +286,15 @@ #define XY_SRC_COPY_BLT_WRITE_RGB (1<<20) #define MI_BATCH_BUFFER ((0x30<<23)|1) +#define MI_BATCH_BUFFER_START (0x31<<23) +#define MI_BATCH_BUFFER_END (0xA<<23) #define MI_BATCH_NON_SECURE (1) +#define MI_WAIT_FOR_EVENT ((0x3<<23)) +#define MI_WAIT_FOR_PLANE_A_FLIP (1<<2) +#define MI_WAIT_FOR_PLANE_A_SCANLINES (1<<1) + +#define MI_LOAD_SCAN_LINES_INCL ((0x12<<23)) #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/i830_irq.c linux-2.4.23-pre8/drivers/char/drm/i830_irq.c --- linux-2.4.22/drivers/char/drm/i830_irq.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/i830_irq.c 2003-10-22 22:48:29.000000000 +0000 @@ -0,0 +1,178 @@ +/* i830_dma.c -- DMA support for the I830 -*- linux-c -*- + * + * Copyright 2002 Tungsten Graphics, Inc. + * 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 + * 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 NONINFRINGEMENT. IN NO EVENT SHALL + * TUNGSTEN GRAPHICS AND/OR ITS 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. + * + * Authors: Keith Whitwell + * + */ + + +#include "i830.h" +#include "drmP.h" +#include "drm.h" +#include "i830_drm.h" +#include "i830_drv.h" +#include /* For task queue support */ +#include + + +void DRM(dma_service)(int irq, void *device, struct pt_regs *regs) +{ + drm_device_t *dev = (drm_device_t *)device; + drm_i830_private_t *dev_priv = (drm_i830_private_t *)dev->dev_private; + u16 temp; + + temp = I830_READ16(I830REG_INT_IDENTITY_R); + printk("%s: %x\n", __FUNCTION__, temp); + + if(temp == 0) + return; + + I830_WRITE16(I830REG_INT_IDENTITY_R, temp); + + if (temp & 2) { + atomic_inc(&dev_priv->irq_received); + wake_up_interruptible(&dev_priv->irq_queue); + } +} + + +int i830_emit_irq(drm_device_t *dev) +{ + drm_i830_private_t *dev_priv = dev->dev_private; + RING_LOCALS; + + DRM_DEBUG("%s\n", __FUNCTION__); + + atomic_inc(&dev_priv->irq_emitted); + + BEGIN_LP_RING(2); + OUT_RING( 0 ); + OUT_RING( GFX_OP_USER_INTERRUPT ); + ADVANCE_LP_RING(); + + return atomic_read(&dev_priv->irq_emitted); +} + + +int i830_wait_irq(drm_device_t *dev, int irq_nr) +{ + drm_i830_private_t *dev_priv = + (drm_i830_private_t *)dev->dev_private; + DECLARE_WAITQUEUE(entry, current); + unsigned long end = jiffies + HZ*3; + int ret = 0; + + DRM_DEBUG("%s\n", __FUNCTION__); + + if (atomic_read(&dev_priv->irq_received) >= irq_nr) + return 0; + + dev_priv->sarea_priv->perf_boxes |= I830_BOX_WAIT; + + add_wait_queue(&dev_priv->irq_queue, &entry); + + for (;;) { + current->state = TASK_INTERRUPTIBLE; + if (atomic_read(&dev_priv->irq_received) >= irq_nr) + break; + if (time_after(jiffies, end)) { + DRM_ERROR("timeout iir %x imr %x ier %x hwstam %x\n", + I830_READ16( I830REG_INT_IDENTITY_R ), + I830_READ16( I830REG_INT_MASK_R ), + I830_READ16( I830REG_INT_ENABLE_R ), + I830_READ16( I830REG_HWSTAM )); + + ret = -EBUSY; /* Lockup? Missed irq? */ + break; + } + schedule_timeout(HZ*3); + if (signal_pending(current)) { + ret = -EINTR; + break; + } + } + + current->state = TASK_RUNNING; + remove_wait_queue(&dev_priv->irq_queue, &entry); + return ret; +} + + +/* Needs the lock as it touches the ring. + */ +int i830_irq_emit( struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i830_private_t *dev_priv = dev->dev_private; + drm_i830_irq_emit_t emit; + int result; + + if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { + DRM_ERROR("i830_irq_emit called without lock held\n"); + return -EINVAL; + } + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + if (copy_from_user( &emit, (drm_i830_irq_emit_t *)arg, sizeof(emit) )) + return -EFAULT; + + result = i830_emit_irq( dev ); + + if ( copy_to_user( emit.irq_seq, &result, sizeof(int) ) ) { + DRM_ERROR( "copy_to_user\n" ); + return -EFAULT; + } + + return 0; +} + + +/* Doesn't need the hardware lock. + */ +int i830_irq_wait( struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_i830_private_t *dev_priv = dev->dev_private; + drm_i830_irq_wait_t irqwait; + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + if (copy_from_user( &irqwait, (drm_i830_irq_wait_t *)arg, + sizeof(irqwait) )) + return -EFAULT; + + return i830_wait_irq( dev, irqwait.irq_seq ); +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/mga.h linux-2.4.23-pre8/drivers/char/drm/mga.h --- linux-2.4.22/drivers/char/drm/mga.h 2001-08-08 16:42:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/mga.h 2003-10-22 22:47:28.000000000 +0000 @@ -41,6 +41,33 @@ #define __HAVE_MTRR 1 #define __HAVE_CTX_BITMAP 1 +#define DRIVER_AUTHOR "Gareth Hughes, VA Linux Systems Inc." + +#define DRIVER_NAME "mga" +#define DRIVER_DESC "Matrox G200/G400" +#define DRIVER_DATE "20010321" + +#define DRIVER_MAJOR 3 +#define DRIVER_MINOR 0 +#define DRIVER_PATCHLEVEL 2 + +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { mga_dma_buffers, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_INIT)] = { mga_dma_init, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_FLUSH)] = { mga_dma_flush, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_RESET)] = { mga_dma_reset, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_SWAP)] = { mga_dma_swap, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_CLEAR)] = { mga_dma_clear, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_VERTEX)] = { mga_dma_vertex, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_INDICES)] = { mga_dma_indices, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_ILOAD)] = { mga_dma_iload, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_MGA_BLIT)] = { mga_dma_blit, 1, 0 }, + +#define __HAVE_COUNTERS 3 +#define __HAVE_COUNTER6 _DRM_STAT_IRQ +#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY +#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY + /* Driver customization: */ #define DRIVER_PRETAKEDOWN() do { \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/mga_dma.c linux-2.4.23-pre8/drivers/char/drm/mga_dma.c --- linux-2.4.22/drivers/char/drm/mga_dma.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/mga_dma.c 2003-10-22 22:48:24.000000000 +0000 @@ -35,10 +35,11 @@ #include "mga.h" #include "drmP.h" +#include "drm.h" +#include "mga_drm.h" #include "mga_drv.h" - -#include /* For task queue support */ -#include +#include +#include "drm_os_linux.h" #define MGA_DEFAULT_USEC_TIMEOUT 10000 #define MGA_FREELIST_DEBUG 0 @@ -52,7 +53,7 @@ { u32 status = 0; int i; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { status = MGA_READ( MGA_STATUS ) & MGA_ENGINE_IDLE_MASK; @@ -74,7 +75,7 @@ { u32 status = 0; int i; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { status = MGA_READ( MGA_STATUS ) & MGA_DMA_IDLE_MASK; @@ -93,7 +94,7 @@ drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; drm_mga_primary_buffer_t *primary = &dev_priv->prim; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); /* The primary DMA stream should look like new right about now. */ @@ -114,7 +115,7 @@ int mga_do_engine_reset( drm_mga_private_t *dev_priv ) { - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); /* Okay, so we've completely screwed up and locked the engine. * How about we clean up after ourselves? @@ -160,8 +161,8 @@ u32 head, tail; u32 status = 0; int i; - DMA_LOCALS; - DRM_DEBUG( "%s:\n", __FUNCTION__ ); + DMA_LOCALS; + DRM_DEBUG( "\n" ); /* We need to wait so that we can do an safe flush */ for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { @@ -207,7 +208,7 @@ mga_flush_write_combine(); MGA_WRITE( MGA_PRIMEND, tail | MGA_PAGPXFER ); - DRM_DEBUG( "%s: done.\n", __FUNCTION__ ); + DRM_DEBUG( "done.\n" ); } void mga_do_dma_wrap_start( drm_mga_private_t *dev_priv ) @@ -215,7 +216,7 @@ drm_mga_primary_buffer_t *primary = &dev_priv->prim; u32 head, tail; DMA_LOCALS; - DRM_DEBUG( "%s:\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); BEGIN_DMA_WRAP(); @@ -250,7 +251,7 @@ MGA_WRITE( MGA_PRIMEND, tail | MGA_PAGPXFER ); set_bit( 0, &primary->wrapped ); - DRM_DEBUG( "%s: done.\n", __FUNCTION__ ); + DRM_DEBUG( "done.\n" ); } void mga_do_dma_wrap_end( drm_mga_private_t *dev_priv ) @@ -258,7 +259,7 @@ drm_mga_primary_buffer_t *primary = &dev_priv->prim; drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv; u32 head = dev_priv->primary->offset; - DRM_DEBUG( "%s:\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); sarea_priv->last_wrap++; DRM_DEBUG( " wrap = %d\n", sarea_priv->last_wrap ); @@ -267,7 +268,7 @@ MGA_WRITE( MGA_PRIMADDRESS, head | MGA_DMA_GENERAL ); clear_bit( 0, &primary->wrapped ); - DRM_DEBUG( "%s: done.\n", __FUNCTION__ ); + DRM_DEBUG( "done.\n" ); } @@ -307,8 +308,7 @@ drm_mga_buf_priv_t *buf_priv; drm_mga_freelist_t *entry; int i; - DRM_DEBUG( "%s: count=%d\n", - __FUNCTION__, dma->buf_count ); + DRM_DEBUG( "count=%d\n", dma->buf_count ); dev_priv->head = DRM(alloc)( sizeof(drm_mga_freelist_t), DRM_MEM_DRIVER ); @@ -354,7 +354,7 @@ drm_mga_private_t *dev_priv = dev->dev_private; drm_mga_freelist_t *entry; drm_mga_freelist_t *next; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); entry = dev_priv->head; while ( entry ) { @@ -392,7 +392,7 @@ drm_mga_freelist_t *prev; drm_mga_freelist_t *tail = dev_priv->tail; u32 head, wrap; - DRM_DEBUG( "%s:\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); head = MGA_READ( MGA_PRIMADDRESS ); wrap = dev_priv->sarea_priv->last_wrap; @@ -424,8 +424,7 @@ drm_mga_buf_priv_t *buf_priv = buf->dev_private; drm_mga_freelist_t *head, *entry, *prev; - DRM_DEBUG( "%s: age=0x%06lx wrap=%d\n", - __FUNCTION__, + DRM_DEBUG( "age=0x%06lx wrap=%d\n", buf_priv->list_entry->age.head - dev_priv->primary->offset, buf_priv->list_entry->age.wrap ); @@ -458,9 +457,8 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) { drm_mga_private_t *dev_priv; - struct list_head *list; int ret; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); dev_priv = DRM(alloc)( sizeof(drm_mga_private_t), DRM_MEM_DRIVER ); if ( !dev_priv ) @@ -494,15 +492,8 @@ dev_priv->texture_offset = init->texture_offset[0]; dev_priv->texture_size = init->texture_size[0]; - list_for_each( list, &dev->maplist->head ) { - drm_map_list_t *entry = (drm_map_list_t *)list; - if ( entry->map && - entry->map->type == _DRM_SHM && - (entry->map->flags & _DRM_CONTAINS_LOCK) ) { - dev_priv->sarea = entry->map; - break; - } - } + DRM_GETSAREA(); + if(!dev_priv->sarea) { DRM_ERROR( "failed to find sarea!\n" ); /* Assign dev_private so we can do cleanup. */ @@ -626,8 +617,6 @@ dev_priv->prim.high_mark = 256 * DMA_BLOCK_SIZE; - spin_lock_init( &dev_priv->prim.list_lock ); - dev_priv->prim.status[0] = dev_priv->primary->offset; dev_priv->prim.status[1] = 0; @@ -650,7 +639,7 @@ int mga_do_cleanup_dma( drm_device_t *dev ) { - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); if ( dev->dev_private ) { drm_mga_private_t *dev_priv = dev->dev_private; @@ -725,7 +714,7 @@ #if MGA_DMA_DEBUG int ret = mga_do_wait_for_idle( dev_priv ); if ( ret < 0 ) - DRM_INFO( __FUNCTION__": -EBUSY\n" ); + DRM_INFO( "%s: -EBUSY\n", __FUNCTION__ ); return ret; #else return mga_do_wait_for_idle( dev_priv ); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/mga_drm.h linux-2.4.23-pre8/drivers/char/drm/mga_drm.h --- linux-2.4.22/drivers/char/drm/mga_drm.h 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/mga_drm.h 2003-10-22 22:49:13.000000000 +0000 @@ -225,6 +225,20 @@ /* WARNING: If you change any of these defines, make sure to change the * defines in the Xserver file (xf86drmMga.h) */ + +/* MGA specific ioctls + * The device specific ioctl range is 0x40 to 0x79. + */ +#define DRM_IOCTL_MGA_INIT DRM_IOW( 0x40, drm_mga_init_t) +#define DRM_IOCTL_MGA_FLUSH DRM_IOW( 0x41, drm_lock_t) +#define DRM_IOCTL_MGA_RESET DRM_IO( 0x42) +#define DRM_IOCTL_MGA_SWAP DRM_IO( 0x43) +#define DRM_IOCTL_MGA_CLEAR DRM_IOW( 0x44, drm_mga_clear_t) +#define DRM_IOCTL_MGA_VERTEX DRM_IOW( 0x45, drm_mga_vertex_t) +#define DRM_IOCTL_MGA_INDICES DRM_IOW( 0x46, drm_mga_indices_t) +#define DRM_IOCTL_MGA_ILOAD DRM_IOW( 0x47, drm_mga_iload_t) +#define DRM_IOCTL_MGA_BLIT DRM_IOW( 0x48, drm_mga_blit_t) + typedef struct _drm_mga_warp_index { int installed; unsigned long phys_addr; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/mga_drv.c linux-2.4.23-pre8/drivers/char/drm/mga_drv.c --- linux-2.4.22/drivers/char/drm/mga_drv.c 2001-08-08 16:42:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/mga_drv.c 2003-10-22 22:48:41.000000000 +0000 @@ -32,37 +32,9 @@ #include #include "mga.h" #include "drmP.h" +#include "drm.h" +#include "mga_drm.h" #include "mga_drv.h" - -#define DRIVER_AUTHOR "Gareth Hughes, VA Linux Systems Inc." - -#define DRIVER_NAME "mga" -#define DRIVER_DESC "Matrox G200/G400" -#define DRIVER_DATE "20010321" - -#define DRIVER_MAJOR 3 -#define DRIVER_MINOR 0 -#define DRIVER_PATCHLEVEL 2 - -#define DRIVER_IOCTLS \ - [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { mga_dma_buffers, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_INIT)] = { mga_dma_init, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_FLUSH)] = { mga_dma_flush, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_RESET)] = { mga_dma_reset, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_SWAP)] = { mga_dma_swap, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_CLEAR)] = { mga_dma_clear, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_VERTEX)] = { mga_dma_vertex, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_INDICES)] = { mga_dma_indices, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_ILOAD)] = { mga_dma_iload, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_MGA_BLIT)] = { mga_dma_blit, 1, 0 }, - - -#define __HAVE_COUNTERS 3 -#define __HAVE_COUNTER6 _DRM_STAT_IRQ -#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY -#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY - - #include "drm_agpsupport.h" #include "drm_auth.h" #include "drm_bufs.h" @@ -70,27 +42,6 @@ #include "drm_dma.h" #include "drm_drawable.h" #include "drm_drv.h" - -#ifndef MODULE -/* DRM(options) is called by the kernel to parse command-line options - * passed via the boot-loader (e.g., LILO). It calls the insmod option - * routine, drm_parse_drm. - */ - -/* JH- We have to hand expand the string ourselves because of the cpp. If - * anyone can think of a way that we can fit into the __setup macro without - * changing it, then please send the solution my way. - */ -static int __init mga_options( char *str ) -{ - DRM(parse_options)( str ); - return 1; -} - -__setup( DRIVER_NAME "=", mga_options ); -#endif - - #include "drm_fops.h" #include "drm_init.h" #include "drm_ioctl.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/mga_drv.h linux-2.4.23-pre8/drivers/char/drm/mga_drv.h --- linux-2.4.22/drivers/char/drm/mga_drv.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/mga_drv.h 2003-10-22 22:49:32.000000000 +0000 @@ -46,8 +46,6 @@ u32 last_wrap; u32 high_mark; - - spinlock_t list_lock; } drm_mga_primary_buffer_t; typedef struct drm_mga_freelist { @@ -257,7 +255,7 @@ #define BEGIN_DMA_WRAP() \ do { \ if ( MGA_VERBOSE ) { \ - DRM_INFO( "BEGIN_DMA() in %s\n", __FUNCTION__ ); \ + DRM_INFO( "BEGIN_DMA() in %s\n", __FUNCTION__ ); \ DRM_INFO( " space=0x%x\n", dev_priv->prim.space ); \ } \ prim = dev_priv->prim.start; \ @@ -276,7 +274,7 @@ #define FLUSH_DMA() \ do { \ if ( 0 ) { \ - DRM_INFO( "%s:\n" , __FUNCTION__); \ + DRM_INFO( "%s:\n", __FUNCTION__ ); \ DRM_INFO( " tail=0x%06x head=0x%06lx\n", \ dev_priv->prim.tail, \ MGA_READ( MGA_PRIMADDRESS ) - \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/mga_state.c linux-2.4.23-pre8/drivers/char/drm/mga_state.c --- linux-2.4.22/drivers/char/drm/mga_state.c 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/mga_state.c 2003-10-22 22:48:34.000000000 +0000 @@ -34,8 +34,9 @@ #include "mga.h" #include "drmP.h" -#include "mga_drv.h" #include "drm.h" +#include "mga_drm.h" +#include "mga_drv.h" /* ================================================================ @@ -512,7 +513,7 @@ int nbox = sarea_priv->nbox; int i; DMA_LOCALS; - DRM_DEBUG("%s:\n" , __FUNCTION__); + DRM_DEBUG( "\n" ); BEGIN_DMA( 1 ); @@ -606,7 +607,7 @@ int nbox = sarea_priv->nbox; int i; DMA_LOCALS; - DRM_DEBUG( "%s:\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); sarea_priv->last_frame.head = dev_priv->prim.tail; sarea_priv->last_frame.wrap = dev_priv->prim.last_wrap; @@ -760,8 +761,7 @@ u32 srcorg = buf->bus_address | MGA_SRCACC_AGP | MGA_SRCMAP_SYSMEM; u32 y2; DMA_LOCALS; - DRM_DEBUG( "%s: buf=%d used=%d\n", - __FUNCTION__, buf->idx, buf->used ); + DRM_DEBUG( "buf=%d used=%d\n", buf->idx, buf->used ); y2 = length / 64; @@ -815,7 +815,7 @@ int nbox = sarea_priv->nbox; u32 scandir = 0, i; DMA_LOCALS; - DRM_DEBUG( "%s:\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); BEGIN_DMA( 4 + nbox ); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/mga_warp.c linux-2.4.23-pre8/drivers/char/drm/mga_warp.c --- linux-2.4.22/drivers/char/drm/mga_warp.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/mga_warp.c 2003-10-22 22:48:40.000000000 +0000 @@ -27,8 +27,11 @@ * Gareth Hughes */ + #include "mga.h" #include "drmP.h" +#include "drm.h" +#include "mga_drm.h" #include "mga_drv.h" #include "mga_ucode.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/r128.h linux-2.4.23-pre8/drivers/char/drm/r128.h --- linux-2.4.22/drivers/char/drm/r128.h 2001-08-08 16:42:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/r128.h 2003-10-22 22:48:28.000000000 +0000 @@ -43,6 +43,35 @@ #define __HAVE_SG 1 #define __HAVE_PCI_DMA 1 +#define DRIVER_AUTHOR "Gareth Hughes, VA Linux Systems Inc." + +#define DRIVER_NAME "r128" +#define DRIVER_DESC "ATI Rage 128" +#define DRIVER_DATE "20010917" + +#define DRIVER_MAJOR 2 +#define DRIVER_MINOR 2 +#define DRIVER_PATCHLEVEL 0 + + +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { r128_cce_buffers, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_INIT)] = { r128_cce_init, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_CCE_START)] = { r128_cce_start, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_CCE_STOP)] = { r128_cce_stop, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_CCE_RESET)] = { r128_cce_reset, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_CCE_IDLE)] = { r128_cce_idle, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_RESET)] = { r128_engine_reset, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_FULLSCREEN)] = { r128_fullscreen, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_SWAP)] = { r128_cce_swap, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_CLEAR)] = { r128_cce_clear, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_VERTEX)] = { r128_cce_vertex, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_INDICES)] = { r128_cce_indices, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_BLIT)] = { r128_cce_blit, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_DEPTH)] = { r128_cce_depth, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_STIPPLE)] = { r128_cce_stipple, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_R128_INDIRECT)] = { r128_cce_indirect, 1, 1 }, + /* Driver customization: */ #define DRIVER_PRERELEASE() do { \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/r128_cce.c linux-2.4.23-pre8/drivers/char/drm/r128_cce.c --- linux-2.4.22/drivers/char/drm/r128_cce.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/r128_cce.c 2003-10-22 22:47:51.000000000 +0000 @@ -30,14 +30,14 @@ #include "r128.h" #include "drmP.h" +#include "drm.h" +#include "r128_drm.h" #include "r128_drv.h" - -#include /* For task queue support */ -#include +#include "drm_os_linux.h" +#include #define R128_FIFO_DEBUG 0 - /* CCE microcode (from ATI) */ static u32 r128_cce_microcode[] = { 0, 276838400, 0, 268449792, 2, 142, 2, 145, 0, 1076765731, 0, @@ -83,6 +83,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +int r128_do_wait_for_idle( drm_r128_private_t *dev_priv ); int R128_READ_PLL(drm_device_t *dev, int addr) { @@ -131,7 +132,7 @@ } #if R128_FIFO_DEBUG - DRM_ERROR( "%s failed!\n", __FUNCTION__ ); + DRM_ERROR( "failed!\n" ); #endif return -EBUSY; } @@ -147,7 +148,7 @@ } #if R128_FIFO_DEBUG - DRM_ERROR( "%s failed!\n", __FUNCTION__ ); + DRM_ERROR( "failed!\n" ); #endif return -EBUSY; } @@ -157,7 +158,7 @@ int i, ret; ret = r128_do_wait_for_fifo( dev_priv, 64 ); - if ( ret < 0 ) return ret; + if ( ret ) return ret; for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { if ( !(R128_READ( R128_GUI_STAT ) & R128_GUI_ACTIVE) ) { @@ -168,7 +169,7 @@ } #if R128_FIFO_DEBUG - DRM_ERROR( "%s failed!\n", __FUNCTION__ ); + DRM_ERROR( "failed!\n" ); #endif return -EBUSY; } @@ -183,7 +184,7 @@ { int i; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); r128_do_wait_for_idle( dev_priv ); @@ -319,7 +320,7 @@ u32 ring_start; u32 tmp; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); /* The manual (p. 2) says this address is in "VM space". This * means it's an offset from the start of AGP space. @@ -351,8 +352,8 @@ R128_WRITE( R128_PM4_BUFFER_DL_RPTR_ADDR, entry->busaddr[page_ofs]); - DRM_DEBUG( "ring rptr: offset=0x%08llx handle=0x%08lx\n", - (u64)entry->busaddr[page_ofs], + DRM_DEBUG( "ring rptr: offset=0x%08x handle=0x%08lx\n", + entry->busaddr[page_ofs], entry->handle + tmp_ofs ); } @@ -374,9 +375,8 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init ) { drm_r128_private_t *dev_priv; - struct list_head *list; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); dev_priv = DRM(alloc)( sizeof(drm_r128_private_t), DRM_MEM_DRIVER ); if ( dev_priv == NULL ) @@ -481,15 +481,8 @@ dev_priv->span_pitch_offset_c = (((dev_priv->depth_pitch/8) << 21) | (dev_priv->span_offset >> 5)); - list_for_each(list, &dev->maplist->head) { - drm_map_list_t *r_list = (drm_map_list_t *)list; - if( r_list->map && - r_list->map->type == _DRM_SHM && - r_list->map->flags & _DRM_CONTAINS_LOCK ) { - dev_priv->sarea = r_list->map; - break; - } - } + DRM_GETSAREA(); + if(!dev_priv->sarea) { DRM_ERROR("could not find sarea!\n"); dev->dev_private = (void *)dev_priv; @@ -622,16 +615,20 @@ if ( dev->dev_private ) { drm_r128_private_t *dev_priv = dev->dev_private; +#if __REALLY_HAVE_SG if ( !dev_priv->is_pci ) { +#endif DRM_IOREMAPFREE( dev_priv->cce_ring ); DRM_IOREMAPFREE( dev_priv->ring_rptr ); DRM_IOREMAPFREE( dev_priv->buffers ); +#if __REALLY_HAVE_SG } else { if (!DRM(ati_pcigart_cleanup)( dev, dev_priv->phys_pci_gart, dev_priv->bus_pci_gart )) DRM_ERROR( "failed to cleanup PCI GART!\n" ); } +#endif DRM(free)( dev->dev_private, sizeof(drm_r128_private_t), DRM_MEM_DRIVER ); @@ -713,7 +710,7 @@ */ if ( stop.idle ) { ret = r128_do_cce_idle( dev_priv ); - if ( ret < 0 ) return ret; + if ( ret ) return ret; } /* Finally, we can turn off the CCE. If the engine isn't idle, @@ -790,7 +787,7 @@ static int r128_do_init_pageflip( drm_device_t *dev ) { drm_r128_private_t *dev_priv = dev->dev_private; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); dev_priv->crtc_offset = R128_READ( R128_CRTC_OFFSET ); dev_priv->crtc_offset_cntl = R128_READ( R128_CRTC_OFFSET_CNTL ); @@ -808,7 +805,7 @@ int r128_do_cleanup_pageflip( drm_device_t *dev ) { drm_r128_private_t *dev_priv = dev->dev_private; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); R128_WRITE( R128_CRTC_OFFSET, dev_priv->crtc_offset ); R128_WRITE( R128_CRTC_OFFSET_CNTL, dev_priv->crtc_offset_cntl ); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/r128_drm.h linux-2.4.23-pre8/drivers/char/drm/r128_drm.h --- linux-2.4.22/drivers/char/drm/r128_drm.h 2001-08-08 16:42:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/r128_drm.h 2003-10-22 22:49:07.000000000 +0000 @@ -170,6 +170,27 @@ /* WARNING: If you change any of these defines, make sure to change the * defines in the Xserver file (xf86drmR128.h) */ + +/* Rage 128 specific ioctls + * The device specific ioctl range is 0x40 to 0x79. + */ +#define DRM_IOCTL_R128_INIT DRM_IOW( 0x40, drm_r128_init_t) +#define DRM_IOCTL_R128_CCE_START DRM_IO( 0x41) +#define DRM_IOCTL_R128_CCE_STOP DRM_IOW( 0x42, drm_r128_cce_stop_t) +#define DRM_IOCTL_R128_CCE_RESET DRM_IO( 0x43) +#define DRM_IOCTL_R128_CCE_IDLE DRM_IO( 0x44) +#define DRM_IOCTL_R128_RESET DRM_IO( 0x46) +#define DRM_IOCTL_R128_SWAP DRM_IO( 0x47) +#define DRM_IOCTL_R128_CLEAR DRM_IOW( 0x48, drm_r128_clear_t) +#define DRM_IOCTL_R128_VERTEX DRM_IOW( 0x49, drm_r128_vertex_t) +#define DRM_IOCTL_R128_INDICES DRM_IOW( 0x4a, drm_r128_indices_t) +#define DRM_IOCTL_R128_BLIT DRM_IOW( 0x4b, drm_r128_blit_t) +#define DRM_IOCTL_R128_DEPTH DRM_IOW( 0x4c, drm_r128_depth_t) +#define DRM_IOCTL_R128_STIPPLE DRM_IOW( 0x4d, drm_r128_stipple_t) +#define DRM_IOCTL_R128_INDIRECT DRM_IOWR(0x4f, drm_r128_indirect_t) +#define DRM_IOCTL_R128_FULLSCREEN DRM_IOW( 0x50, drm_r128_fullscreen_t) +#define DRM_IOCTL_R128_CLEAR2 DRM_IOW( 0x51, drm_r128_clear2_t) + typedef struct drm_r128_init { enum { R128_INIT_CCE = 0x01, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/r128_drv.c linux-2.4.23-pre8/drivers/char/drm/r128_drv.c --- linux-2.4.22/drivers/char/drm/r128_drv.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/r128_drv.c 2003-10-22 22:48:16.000000000 +0000 @@ -32,48 +32,11 @@ #include #include "r128.h" #include "drmP.h" +#include "drm.h" +#include "r128_drm.h" #include "r128_drv.h" #include "ati_pcigart.h" -#define DRIVER_AUTHOR "Gareth Hughes, VA Linux Systems Inc." - -#define DRIVER_NAME "r128" -#define DRIVER_DESC "ATI Rage 128" -#define DRIVER_DATE "20010917" - -#define DRIVER_MAJOR 2 -#define DRIVER_MINOR 2 -#define DRIVER_PATCHLEVEL 0 - -#define DRIVER_IOCTLS \ - [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { r128_cce_buffers, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_INIT)] = { r128_cce_init, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_CCE_START)] = { r128_cce_start, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_CCE_STOP)] = { r128_cce_stop, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_CCE_RESET)] = { r128_cce_reset, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_CCE_IDLE)] = { r128_cce_idle, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_RESET)] = { r128_engine_reset, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_FULLSCREEN)] = { r128_fullscreen, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_SWAP)] = { r128_cce_swap, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_CLEAR)] = { r128_cce_clear, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_VERTEX)] = { r128_cce_vertex, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_INDICES)] = { r128_cce_indices, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_BLIT)] = { r128_cce_blit, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_DEPTH)] = { r128_cce_depth, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_STIPPLE)] = { r128_cce_stipple, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_R128_INDIRECT)] = { r128_cce_indirect, 1, 1 }, - - -#if 0 -/* GH: Count data sent to card via ring or vertex/indirect buffers. - */ -#define __HAVE_COUNTERS 3 -#define __HAVE_COUNTER6 _DRM_STAT_IRQ -#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY -#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY -#endif - - #include "drm_agpsupport.h" #include "drm_auth.h" #include "drm_bufs.h" @@ -81,26 +44,6 @@ #include "drm_dma.h" #include "drm_drawable.h" #include "drm_drv.h" - -#ifndef MODULE -/* DRM(options) is called by the kernel to parse command-line options - * passed via the boot-loader (e.g., LILO). It calls the insmod option - * routine, drm_parse_drm. - */ - -/* JH- We have to hand expand the string ourselves because of the cpp. If - * anyone can think of a way that we can fit into the __setup macro without - * changing it, then please send the solution my way. - */ -static int __init r128_options( char *str ) -{ - DRM(parse_options)( str ); - return 1; -} - -__setup( DRIVER_NAME "=", r128_options ); -#endif - #include "drm_fops.h" #include "drm_init.h" #include "drm_ioctl.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/r128_drv.h linux-2.4.23-pre8/drivers/char/drm/r128_drv.h --- linux-2.4.22/drivers/char/drm/r128_drv.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/r128_drv.h 2003-10-22 22:49:55.000000000 +0000 @@ -33,9 +33,10 @@ #ifndef __R128_DRV_H__ #define __R128_DRV_H__ +#include -#define GET_RING_HEAD( ring ) le32_to_cpu( *(ring)->head ) -#define SET_RING_HEAD( ring, val ) *(ring)->head = cpu_to_le32( val ) +#define GET_RING_HEAD(ring) readl( (volatile u32 *) (ring)->head ) +#define SET_RING_HEAD(ring,val) writel( (val), (volatile u32 *) (ring)->head ) typedef struct drm_r128_freelist { unsigned int age; @@ -384,44 +385,11 @@ #define R128_BASE(reg) ((unsigned long)(dev_priv->mmio->handle)) #define R128_ADDR(reg) (R128_BASE( reg ) + reg) -#define R128_DEREF(reg) *(volatile u32 *)R128_ADDR( reg ) -#ifdef __alpha__ -#define R128_READ(reg) (_R128_READ((u32 *)R128_ADDR(reg))) -static inline u32 _R128_READ(u32 *addr) -{ - mb(); - return *(volatile u32 *)addr; -} -#define R128_WRITE(reg,val) \ -do { \ - wmb(); \ - R128_DEREF(reg) = val; \ -} while (0) -#else -#define R128_READ(reg) le32_to_cpu( R128_DEREF( reg ) ) -#define R128_WRITE(reg,val) \ -do { \ - R128_DEREF( reg ) = cpu_to_le32( val ); \ -} while (0) -#endif +#define R128_READ(reg) readl( (volatile u32 *) R128_ADDR(reg) ) +#define R128_WRITE(reg,val) writel( (val) , (volatile u32 *) R128_ADDR(reg)) -#define R128_DEREF8(reg) *(volatile u8 *)R128_ADDR( reg ) -#ifdef __alpha__ -#define R128_READ8(reg) _R128_READ8((u8 *)R128_ADDR(reg)) -static inline u8 _R128_READ8(u8 *addr) -{ - mb(); - return *(volatile u8 *)addr; -} -#define R128_WRITE8(reg,val) \ -do { \ - wmb(); \ - R128_DEREF8(reg) = val; \ -} while (0) -#else -#define R128_READ8(reg) R128_DEREF8( reg ) -#define R128_WRITE8(reg,val) do { R128_DEREF8( reg ) = val; } while (0) -#endif +#define R128_READ8(reg) readb( (volatile u8 *) R128_ADDR(reg) ) +#define R128_WRITE8(reg,val) writeb( (val), (volatile u8 *) R128_ADDR(reg) ) #define R128_WRITE_PLL(addr,val) \ do { \ @@ -470,6 +438,7 @@ return -EBUSY; \ } \ __ring_space_done: ; \ + break; \ } while (0) #define VB_AGE_TEST_WITH_RETURN( dev_priv ) \ @@ -493,7 +462,11 @@ * Ring control */ +#if defined(__powerpc__) +#define r128_flush_write_combine() (void) GET_RING_HEAD( &dev_priv->ring ) +#else #define r128_flush_write_combine() mb() +#endif #define R128_VERBOSE 0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/r128_state.c linux-2.4.23-pre8/drivers/char/drm/r128_state.c --- linux-2.4.22/drivers/char/drm/r128_state.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/r128_state.c 2003-10-22 22:47:52.000000000 +0000 @@ -29,9 +29,9 @@ #include "r128.h" #include "drmP.h" -#include "r128_drv.h" #include "drm.h" -#include +#include "r128_drm.h" +#include "r128_drv.h" /* ================================================================ @@ -528,7 +528,7 @@ { drm_r128_private_t *dev_priv = dev->dev_private; RING_LOCALS; - DRM_DEBUG( "%s: page=%d\n", __FUNCTION__, dev_priv->current_page ); + DRM_DEBUG( "page=%d\n", dev_priv->current_page ); #if R128_PERFORMANCE_BOXES /* Do some trivial performance monitoring... @@ -577,8 +577,7 @@ int prim = buf_priv->prim; int i = 0; RING_LOCALS; - DRM_DEBUG( "%s: buf=%d nbox=%d\n", - __FUNCTION__, buf->idx, sarea_priv->nbox ); + DRM_DEBUG( "buf=%d nbox=%d\n", buf->idx, sarea_priv->nbox ); if ( 0 ) r128_print_dirty( "dispatch_vertex", sarea_priv->dirty ); @@ -789,7 +788,7 @@ u32 *data; int dword_shift, dwords; RING_LOCALS; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); /* The compiler won't optimize away a division by a variable, * even if the only legal values are powers of two. Thus, we'll diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/radeon.h linux-2.4.23-pre8/drivers/char/drm/radeon.h --- linux-2.4.22/drivers/char/drm/radeon.h 2003-06-13 14:51:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/radeon.h 2003-10-22 22:49:33.000000000 +0000 @@ -44,7 +44,78 @@ #define __HAVE_SG 1 #define __HAVE_PCI_DMA 1 -/* Driver customization: +#define DRIVER_AUTHOR "Gareth Hughes, Keith Whitwell, others." + +#define DRIVER_NAME "radeon" +#define DRIVER_DESC "ATI Radeon" +#define DRIVER_DATE "20020828" + +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 7 +#define DRIVER_PATCHLEVEL 0 + +/* Interface history: + * + * 1.1 - ?? + * 1.2 - Add vertex2 ioctl (keith) + * - Add stencil capability to clear ioctl (gareth, keith) + * - Increase MAX_TEXTURE_LEVELS (brian) + * 1.3 - Add cmdbuf ioctl (keith) + * - Add support for new radeon packets (keith) + * - Add getparam ioctl (keith) + * - Add flip-buffers ioctl, deprecate fullscreen foo (keith). + * 1.4 - Add scratch registers to get_param ioctl. + * 1.5 - Add r200 packets to cmdbuf ioctl + * - Add r200 function to init ioctl + * - Add 'scalar2' instruction to cmdbuf + * 1.6 - Add static agp memory manager + * Add irq handler (won't be turned on unless X server knows to) + * Add irq ioctls and irq_active getparam. + * Add wait command for cmdbuf ioctl + * Add agp offset query for getparam + * 1.7 - Add support for cube map registers: R200_PP_CUBIC_FACES_[0..5] + * and R200_PP_CUBIC_OFFSET_F1_[0..5]. + * Added packets R200_EMIT_PP_CUBIC_FACES_[0..5] and + * R200_EMIT_PP_CUBIC_OFFSETS_[0..5]. (brian) + */ +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { radeon_cp_buffers, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_INIT)] = { radeon_cp_init, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_START)] = { radeon_cp_start, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_STOP)] = { radeon_cp_stop, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_RESET)] = { radeon_cp_reset, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_IDLE)] = { radeon_cp_idle, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_RESET)] = { radeon_engine_reset, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_FULLSCREEN)] = { radeon_fullscreen, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_SWAP)] = { radeon_cp_swap, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CLEAR)] = { radeon_cp_clear, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_VERTEX)] = { radeon_cp_vertex, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_INDICES)] = { radeon_cp_indices, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_TEXTURE)] = { radeon_cp_texture, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_STIPPLE)] = { radeon_cp_stipple, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_INDIRECT)] = { radeon_cp_indirect, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_VERTEX2)] = { radeon_cp_vertex2, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CMDBUF)] = { radeon_cp_cmdbuf, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_GETPARAM)] = { radeon_cp_getparam, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_FLIP)] = { radeon_cp_flip, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_ALLOC)] = { radeon_mem_alloc, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_FREE)] = { radeon_mem_free, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_INIT_HEAP)] = { radeon_mem_init_heap, 1, 1 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_IRQ_EMIT)] = { radeon_irq_emit, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_RADEON_IRQ_WAIT)] = { radeon_irq_wait, 1, 0 }, + + +#define USE_IRQS 1 +#if USE_IRQS +#define __HAVE_DMA_IRQ 1 +#define __HAVE_VBL_IRQ 1 +#define __HAVE_SHARED_IRQ 1 + +/* When a client dies: + * - Check for and clean up flipped page state + * - Free any alloced agp memory. + * + * DRM infrastructure takes care of reclaiming dma buffers. */ #define DRIVER_PRERELEASE() do { \ if ( dev->dev_private ) { \ @@ -52,31 +123,36 @@ if ( dev_priv->page_flipping ) { \ radeon_do_cleanup_pageflip( dev ); \ } \ + radeon_mem_release( dev_priv->agp_heap ); \ } \ } while (0) +/* On unloading the module: + * - Free memory heap structure + * - Remove mappings made at startup and free dev_private. + */ #define DRIVER_PRETAKEDOWN() do { \ - if ( dev->dev_private ) radeon_do_cleanup_cp( dev ); \ + if ( dev->dev_private ) { \ + drm_radeon_private_t *dev_priv = dev->dev_private; \ + radeon_mem_takedown( &(dev_priv->agp_heap) ); \ + radeon_do_cleanup_cp( dev ); \ + } \ } while (0) +#else +#define __HAVE_DMA_IRQ 0 +#endif + /* DMA customization: */ #define __HAVE_DMA 1 -#if 0 -/* GH: Remove this for now... */ -#define __HAVE_DMA_QUIESCENT 1 -#define DRIVER_DMA_QUIESCENT() do { \ - drm_radeon_private_t *dev_priv = dev->dev_private; \ - return radeon_do_cp_idle( dev_priv ); \ -} while (0) -#endif /* Buffer customization: */ #define DRIVER_BUF_PRIV_T drm_radeon_buf_priv_t -#define DRIVER_AGP_BUFFERS_MAP( dev ) \ +#define DRIVER_AGP_BUFFERS_MAP( dev ) \ ((drm_radeon_private_t *)((dev)->dev_private))->buffers #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/radeon_cp.c linux-2.4.23-pre8/drivers/char/drm/radeon_cp.c --- linux-2.4.22/drivers/char/drm/radeon_cp.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/radeon_cp.c 2003-10-22 22:47:59.000000000 +0000 @@ -30,21 +30,278 @@ #include "radeon.h" #include "drmP.h" +#include "drm.h" +#include "radeon_drm.h" #include "radeon_drv.h" +#include "drm_os_linux.h" #include /* For task queue support */ #include - #define RADEON_FIFO_DEBUG 0 -#if defined(__alpha__) -# define PCIGART_ENABLED -#else -# undef PCIGART_ENABLED -#endif /* CP microcode (from ATI) */ +static u32 R200_cp_microcode[][2] = { + { 0x21007000, 0000000000 }, + { 0x20007000, 0000000000 }, + { 0x000000ab, 0x00000004 }, + { 0x000000af, 0x00000004 }, + { 0x66544a49, 0000000000 }, + { 0x49494174, 0000000000 }, + { 0x54517d83, 0000000000 }, + { 0x498d8b64, 0000000000 }, + { 0x49494949, 0000000000 }, + { 0x49da493c, 0000000000 }, + { 0x49989898, 0000000000 }, + { 0xd34949d5, 0000000000 }, + { 0x9dc90e11, 0000000000 }, + { 0xce9b9b9b, 0000000000 }, + { 0x000f0000, 0x00000016 }, + { 0x352e232c, 0000000000 }, + { 0x00000013, 0x00000004 }, + { 0x000f0000, 0x00000016 }, + { 0x352e272c, 0000000000 }, + { 0x000f0001, 0x00000016 }, + { 0x3239362f, 0000000000 }, + { 0x000077ef, 0x00000002 }, + { 0x00061000, 0x00000002 }, + { 0x00000020, 0x0000001a }, + { 0x00004000, 0x0000001e }, + { 0x00061000, 0x00000002 }, + { 0x00000020, 0x0000001a }, + { 0x00004000, 0x0000001e }, + { 0x00061000, 0x00000002 }, + { 0x00000020, 0x0000001a }, + { 0x00004000, 0x0000001e }, + { 0x00000016, 0x00000004 }, + { 0x0003802a, 0x00000002 }, + { 0x040067e0, 0x00000002 }, + { 0x00000016, 0x00000004 }, + { 0x000077e0, 0x00000002 }, + { 0x00065000, 0x00000002 }, + { 0x000037e1, 0x00000002 }, + { 0x040067e1, 0x00000006 }, + { 0x000077e0, 0x00000002 }, + { 0x000077e1, 0x00000002 }, + { 0x000077e1, 0x00000006 }, + { 0xffffffff, 0000000000 }, + { 0x10000000, 0000000000 }, + { 0x0003802a, 0x00000002 }, + { 0x040067e0, 0x00000006 }, + { 0x00007675, 0x00000002 }, + { 0x00007676, 0x00000002 }, + { 0x00007677, 0x00000002 }, + { 0x00007678, 0x00000006 }, + { 0x0003802b, 0x00000002 }, + { 0x04002676, 0x00000002 }, + { 0x00007677, 0x00000002 }, + { 0x00007678, 0x00000006 }, + { 0x0000002e, 0x00000018 }, + { 0x0000002e, 0x00000018 }, + { 0000000000, 0x00000006 }, + { 0x0000002f, 0x00000018 }, + { 0x0000002f, 0x00000018 }, + { 0000000000, 0x00000006 }, + { 0x01605000, 0x00000002 }, + { 0x00065000, 0x00000002 }, + { 0x00098000, 0x00000002 }, + { 0x00061000, 0x00000002 }, + { 0x64c0603d, 0x00000004 }, + { 0x00080000, 0x00000016 }, + { 0000000000, 0000000000 }, + { 0x0400251d, 0x00000002 }, + { 0x00007580, 0x00000002 }, + { 0x00067581, 0x00000002 }, + { 0x04002580, 0x00000002 }, + { 0x00067581, 0x00000002 }, + { 0x00000046, 0x00000004 }, + { 0x00005000, 0000000000 }, + { 0x00061000, 0x00000002 }, + { 0x0000750e, 0x00000002 }, + { 0x00019000, 0x00000002 }, + { 0x00011055, 0x00000014 }, + { 0x00000055, 0x00000012 }, + { 0x0400250f, 0x00000002 }, + { 0x0000504a, 0x00000004 }, + { 0x00007565, 0x00000002 }, + { 0x00007566, 0x00000002 }, + { 0x00000051, 0x00000004 }, + { 0x01e655b4, 0x00000002 }, + { 0x4401b0dc, 0x00000002 }, + { 0x01c110dc, 0x00000002 }, + { 0x2666705d, 0x00000018 }, + { 0x040c2565, 0x00000002 }, + { 0x0000005d, 0x00000018 }, + { 0x04002564, 0x00000002 }, + { 0x00007566, 0x00000002 }, + { 0x00000054, 0x00000004 }, + { 0x00401060, 0x00000008 }, + { 0x00101000, 0x00000002 }, + { 0x000d80ff, 0x00000002 }, + { 0x00800063, 0x00000008 }, + { 0x000f9000, 0x00000002 }, + { 0x000e00ff, 0x00000002 }, + { 0000000000, 0x00000006 }, + { 0x00000080, 0x00000018 }, + { 0x00000054, 0x00000004 }, + { 0x00007576, 0x00000002 }, + { 0x00065000, 0x00000002 }, + { 0x00009000, 0x00000002 }, + { 0x00041000, 0x00000002 }, + { 0x0c00350e, 0x00000002 }, + { 0x00049000, 0x00000002 }, + { 0x00051000, 0x00000002 }, + { 0x01e785f8, 0x00000002 }, + { 0x00200000, 0x00000002 }, + { 0x00600073, 0x0000000c }, + { 0x00007563, 0x00000002 }, + { 0x006075f0, 0x00000021 }, + { 0x20007068, 0x00000004 }, + { 0x00005068, 0x00000004 }, + { 0x00007576, 0x00000002 }, + { 0x00007577, 0x00000002 }, + { 0x0000750e, 0x00000002 }, + { 0x0000750f, 0x00000002 }, + { 0x00a05000, 0x00000002 }, + { 0x00600076, 0x0000000c }, + { 0x006075f0, 0x00000021 }, + { 0x000075f8, 0x00000002 }, + { 0x00000076, 0x00000004 }, + { 0x000a750e, 0x00000002 }, + { 0x0020750f, 0x00000002 }, + { 0x00600079, 0x00000004 }, + { 0x00007570, 0x00000002 }, + { 0x00007571, 0x00000002 }, + { 0x00007572, 0x00000006 }, + { 0x00005000, 0x00000002 }, + { 0x00a05000, 0x00000002 }, + { 0x00007568, 0x00000002 }, + { 0x00061000, 0x00000002 }, + { 0x00000084, 0x0000000c }, + { 0x00058000, 0x00000002 }, + { 0x0c607562, 0x00000002 }, + { 0x00000086, 0x00000004 }, + { 0x00600085, 0x00000004 }, + { 0x400070dd, 0000000000 }, + { 0x000380dd, 0x00000002 }, + { 0x00000093, 0x0000001c }, + { 0x00065095, 0x00000018 }, + { 0x040025bb, 0x00000002 }, + { 0x00061096, 0x00000018 }, + { 0x040075bc, 0000000000 }, + { 0x000075bb, 0x00000002 }, + { 0x000075bc, 0000000000 }, + { 0x00090000, 0x00000006 }, + { 0x00090000, 0x00000002 }, + { 0x000d8002, 0x00000006 }, + { 0x00005000, 0x00000002 }, + { 0x00007821, 0x00000002 }, + { 0x00007800, 0000000000 }, + { 0x00007821, 0x00000002 }, + { 0x00007800, 0000000000 }, + { 0x01665000, 0x00000002 }, + { 0x000a0000, 0x00000002 }, + { 0x000671cc, 0x00000002 }, + { 0x0286f1cd, 0x00000002 }, + { 0x000000a3, 0x00000010 }, + { 0x21007000, 0000000000 }, + { 0x000000aa, 0x0000001c }, + { 0x00065000, 0x00000002 }, + { 0x000a0000, 0x00000002 }, + { 0x00061000, 0x00000002 }, + { 0x000b0000, 0x00000002 }, + { 0x38067000, 0x00000002 }, + { 0x000a00a6, 0x00000004 }, + { 0x20007000, 0000000000 }, + { 0x01200000, 0x00000002 }, + { 0x20077000, 0x00000002 }, + { 0x01200000, 0x00000002 }, + { 0x20007000, 0000000000 }, + { 0x00061000, 0x00000002 }, + { 0x0120751b, 0x00000002 }, + { 0x8040750a, 0x00000002 }, + { 0x8040750b, 0x00000002 }, + { 0x00110000, 0x00000002 }, + { 0x000380dd, 0x00000002 }, + { 0x000000bd, 0x0000001c }, + { 0x00061096, 0x00000018 }, + { 0x844075bd, 0x00000002 }, + { 0x00061095, 0x00000018 }, + { 0x840075bb, 0x00000002 }, + { 0x00061096, 0x00000018 }, + { 0x844075bc, 0x00000002 }, + { 0x000000c0, 0x00000004 }, + { 0x804075bd, 0x00000002 }, + { 0x800075bb, 0x00000002 }, + { 0x804075bc, 0x00000002 }, + { 0x00108000, 0x00000002 }, + { 0x01400000, 0x00000002 }, + { 0x006000c4, 0x0000000c }, + { 0x20c07000, 0x00000020 }, + { 0x000000c6, 0x00000012 }, + { 0x00800000, 0x00000006 }, + { 0x0080751d, 0x00000006 }, + { 0x000025bb, 0x00000002 }, + { 0x000040c0, 0x00000004 }, + { 0x0000775c, 0x00000002 }, + { 0x00a05000, 0x00000002 }, + { 0x00661000, 0x00000002 }, + { 0x0460275d, 0x00000020 }, + { 0x00004000, 0000000000 }, + { 0x00007999, 0x00000002 }, + { 0x00a05000, 0x00000002 }, + { 0x00661000, 0x00000002 }, + { 0x0460299b, 0x00000020 }, + { 0x00004000, 0000000000 }, + { 0x01e00830, 0x00000002 }, + { 0x21007000, 0000000000 }, + { 0x00005000, 0x00000002 }, + { 0x00038042, 0x00000002 }, + { 0x040025e0, 0x00000002 }, + { 0x000075e1, 0000000000 }, + { 0x00000001, 0000000000 }, + { 0x000380d9, 0x00000002 }, + { 0x04007394, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, + { 0000000000, 0000000000 }, +}; + + static u32 radeon_cp_microcode[][2] = { { 0x21007000, 0000000000 }, { 0x20007000, 0000000000 }, @@ -346,6 +603,8 @@ u32 tmp; int i; + dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; + tmp = RADEON_READ( RADEON_RB2D_DSTCACHE_CTLSTAT ); tmp |= RADEON_RB2D_DC_FLUSH_ALL; RADEON_WRITE( RADEON_RB2D_DSTCACHE_CTLSTAT, tmp ); @@ -370,6 +629,8 @@ { int i; + dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; + for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { int slots = ( RADEON_READ( RADEON_RBBM_STATUS ) & RADEON_RBBM_FIFOCNT_MASK ); @@ -388,8 +649,10 @@ { int i, ret; + dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; + ret = radeon_do_wait_for_fifo( dev_priv, 64 ); - if ( ret < 0 ) return ret; + if ( ret ) return ret; for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { if ( !(RADEON_READ( RADEON_RBBM_STATUS ) @@ -416,16 +679,31 @@ static void radeon_cp_load_microcode( drm_radeon_private_t *dev_priv ) { int i; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); radeon_do_wait_for_idle( dev_priv ); RADEON_WRITE( RADEON_CP_ME_RAM_ADDR, 0 ); - for ( i = 0 ; i < 256 ; i++ ) { - RADEON_WRITE( RADEON_CP_ME_RAM_DATAH, - radeon_cp_microcode[i][1] ); - RADEON_WRITE( RADEON_CP_ME_RAM_DATAL, - radeon_cp_microcode[i][0] ); + + if (dev_priv->is_r200) + { + DRM_INFO("Loading R200 Microcode\n"); + for ( i = 0 ; i < 256 ; i++ ) + { + RADEON_WRITE( RADEON_CP_ME_RAM_DATAH, + R200_cp_microcode[i][1] ); + RADEON_WRITE( RADEON_CP_ME_RAM_DATAL, + R200_cp_microcode[i][0] ); + } + } + else + { + for ( i = 0 ; i < 256 ; i++ ) { + RADEON_WRITE( RADEON_CP_ME_RAM_DATAH, + radeon_cp_microcode[i][1] ); + RADEON_WRITE( RADEON_CP_ME_RAM_DATAL, + radeon_cp_microcode[i][0] ); + } } } @@ -435,7 +713,7 @@ */ static void radeon_do_cp_flush( drm_radeon_private_t *dev_priv ) { - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); #if 0 u32 tmp; @@ -449,7 +727,7 @@ int radeon_do_cp_idle( drm_radeon_private_t *dev_priv ) { RING_LOCALS; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); BEGIN_RING( 6 ); @@ -458,6 +736,7 @@ RADEON_WAIT_UNTIL_IDLE(); ADVANCE_RING(); + COMMIT_RING(); return radeon_do_wait_for_idle( dev_priv ); } @@ -467,7 +746,7 @@ static void radeon_do_cp_start( drm_radeon_private_t *dev_priv ) { RING_LOCALS; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); radeon_do_wait_for_idle( dev_priv ); @@ -482,6 +761,7 @@ RADEON_WAIT_UNTIL_IDLE(); ADVANCE_RING(); + COMMIT_RING(); } /* Reset the Command Processor. This will not flush any pending @@ -491,7 +771,7 @@ static void radeon_do_cp_reset( drm_radeon_private_t *dev_priv ) { u32 cur_read_ptr; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); cur_read_ptr = RADEON_READ( RADEON_CP_RB_RPTR ); RADEON_WRITE( RADEON_CP_RB_WPTR, cur_read_ptr ); @@ -505,7 +785,7 @@ */ static void radeon_do_cp_stop( drm_radeon_private_t *dev_priv ) { - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); RADEON_WRITE( RADEON_CP_CSQ_CNTL, RADEON_CSQ_PRIDIS_INDDIS ); @@ -518,7 +798,7 @@ { drm_radeon_private_t *dev_priv = dev->dev_private; u32 clock_cntl_index, mclk_cntl, rbbm_soft_reset; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); radeon_do_pixcache_flush( dev_priv ); @@ -603,6 +883,7 @@ /* Set the write pointer delay */ RADEON_WRITE( RADEON_CP_RB_WPTR_DELAY, 0 ); + RADEON_READ( RADEON_CP_RB_WPTR_DELAY ); /* read back to propagate */ /* Initialize the ring buffer's read and write pointers */ cur_read_ptr = RADEON_READ( RADEON_CP_RB_RPTR ); @@ -622,13 +903,63 @@ RADEON_WRITE( RADEON_CP_RB_RPTR_ADDR, entry->busaddr[page_ofs]); - DRM_DEBUG( "ring rptr: offset=0x%08llx handle=0x%08lx\n", - (u64)entry->busaddr[page_ofs], + DRM_DEBUG( "ring rptr: offset=0x%08x handle=0x%08lx\n", + entry->busaddr[page_ofs], entry->handle + tmp_ofs ); } + /* Initialize the scratch register pointer. This will cause + * the scratch register values to be written out to memory + * whenever they are updated. + * + * We simply put this behind the ring read pointer, this works + * with PCI GART as well as (whatever kind of) AGP GART + */ + RADEON_WRITE( RADEON_SCRATCH_ADDR, RADEON_READ( RADEON_CP_RB_RPTR_ADDR ) + + RADEON_SCRATCH_REG_OFFSET ); + + dev_priv->scratch = ((__volatile__ u32 *) + dev_priv->ring.head + + (RADEON_SCRATCH_REG_OFFSET / sizeof(u32))); + + RADEON_WRITE( RADEON_SCRATCH_UMSK, 0x7 ); + + /* Writeback doesn't seem to work everywhere, test it first */ + writel(0, &dev_priv->scratch[1]); + RADEON_WRITE( RADEON_SCRATCH_REG1, 0xdeadbeef ); + + for ( tmp = 0 ; tmp < dev_priv->usec_timeout ; tmp++ ) { + if ( readl( &dev_priv->scratch[1] ) == 0xdeadbeef ) + break; + udelay(1); + } + + if ( tmp < dev_priv->usec_timeout ) { + dev_priv->writeback_works = 1; + DRM_DEBUG( "writeback test succeeded, tmp=%d\n", tmp ); + } else { + dev_priv->writeback_works = 0; + DRM_DEBUG( "writeback test failed\n" ); + } + + dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0; + RADEON_WRITE( RADEON_LAST_FRAME_REG, + dev_priv->sarea_priv->last_frame ); + + dev_priv->sarea_priv->last_dispatch = dev_priv->scratch[1] = 0; + RADEON_WRITE( RADEON_LAST_DISPATCH_REG, + dev_priv->sarea_priv->last_dispatch ); + + dev_priv->sarea_priv->last_clear = dev_priv->scratch[2] = 0; + RADEON_WRITE( RADEON_LAST_CLEAR_REG, + dev_priv->sarea_priv->last_clear ); + /* Set ring buffer size */ +#ifdef __BIG_ENDIAN + RADEON_WRITE( RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw | RADEON_BUF_SWAP_32BIT ); +#else RADEON_WRITE( RADEON_CP_RB_CNTL, dev_priv->ring.size_l2qw ); +#endif radeon_do_wait_for_idle( dev_priv ); @@ -647,9 +978,8 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init ) { drm_radeon_private_t *dev_priv; - struct list_head *list; u32 tmp; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); dev_priv = DRM(alloc)( sizeof(drm_radeon_private_t), DRM_MEM_DRIVER ); if ( dev_priv == NULL ) @@ -659,17 +989,6 @@ dev_priv->is_pci = init->is_pci; -#if !defined(PCIGART_ENABLED) - /* PCI support is not 100% working, so we disable it here. - */ - if ( dev_priv->is_pci ) { - DRM_ERROR( "PCI GART not yet supported for Radeon!\n" ); - dev->dev_private = (void *)dev_priv; - radeon_do_cleanup_cp(dev); - return -EINVAL; - } -#endif - if ( dev_priv->is_pci && !dev->sg ) { DRM_ERROR( "PCI GART memory not allocated!\n" ); dev->dev_private = (void *)dev_priv; @@ -686,12 +1005,10 @@ return -EINVAL; } + dev_priv->is_r200 = (init->func == RADEON_INIT_R200_CP); + dev_priv->do_boxes = 0; dev_priv->cp_mode = init->cp_mode; - /* Simple idle check. - */ - atomic_set( &dev_priv->idle_count, 0 ); - /* We don't support anything other than bus-mastering ring mode, * but the ring can be in either AGP or PCI space for the ring * read pointer. @@ -743,17 +1060,17 @@ * and screwing with the clear operation. */ dev_priv->depth_clear.rb3d_cntl = (RADEON_PLANE_MASK_ENABLE | - RADEON_Z_ENABLE | (dev_priv->color_fmt << 10) | - RADEON_ZBLOCK16); + (1<<15)); - dev_priv->depth_clear.rb3d_zstencilcntl = (dev_priv->depth_fmt | - RADEON_Z_TEST_ALWAYS | - RADEON_STENCIL_TEST_ALWAYS | - RADEON_STENCIL_S_FAIL_KEEP | - RADEON_STENCIL_ZPASS_KEEP | - RADEON_STENCIL_ZFAIL_KEEP | - RADEON_Z_WRITE_ENABLE); + dev_priv->depth_clear.rb3d_zstencilcntl = + (dev_priv->depth_fmt | + RADEON_Z_TEST_ALWAYS | + RADEON_STENCIL_TEST_ALWAYS | + RADEON_STENCIL_S_FAIL_REPLACE | + RADEON_STENCIL_ZPASS_REPLACE | + RADEON_STENCIL_ZFAIL_REPLACE | + RADEON_Z_WRITE_ENABLE); dev_priv->depth_clear.se_cntl = (RADEON_FFACE_CULL_CW | RADEON_BFACE_SOLID | @@ -767,15 +1084,8 @@ RADEON_ROUND_MODE_TRUNC | RADEON_ROUND_PREC_8TH_PIX); - list_for_each(list, &dev->maplist->head) { - drm_map_list_t *r_list = (drm_map_list_t *)list; - if( r_list->map && - r_list->map->type == _DRM_SHM && - r_list->map->flags & _DRM_CONTAINS_LOCK ) { - dev_priv->sarea = r_list->map; - break; - } - } + DRM_GETSAREA(); + if(!dev_priv->sarea) { DRM_ERROR("could not find sarea!\n"); dev->dev_private = (void *)dev_priv; @@ -896,34 +1206,7 @@ dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK; -#if 0 - /* Initialize the scratch register pointer. This will cause - * the scratch register values to be written out to memory - * whenever they are updated. - * FIXME: This doesn't quite work yet, so we're disabling it - * for the release. - */ - RADEON_WRITE( RADEON_SCRATCH_ADDR, (dev_priv->ring_rptr->offset + - RADEON_SCRATCH_REG_OFFSET) ); - RADEON_WRITE( RADEON_SCRATCH_UMSK, 0x7 ); -#endif - - dev_priv->scratch = ((__volatile__ u32 *) - dev_priv->ring_rptr->handle + - (RADEON_SCRATCH_REG_OFFSET / sizeof(u32))); - - dev_priv->sarea_priv->last_frame = 0; - RADEON_WRITE( RADEON_LAST_FRAME_REG, - dev_priv->sarea_priv->last_frame ); - - dev_priv->sarea_priv->last_dispatch = 0; - RADEON_WRITE( RADEON_LAST_DISPATCH_REG, - dev_priv->sarea_priv->last_dispatch ); - - dev_priv->sarea_priv->last_clear = 0; - RADEON_WRITE( RADEON_LAST_CLEAR_REG, - dev_priv->sarea_priv->last_clear ); - +#if __REALLY_HAVE_SG if ( dev_priv->is_pci ) { if (!DRM(ati_pcigart_init)( dev, &dev_priv->phys_pci_gart, &dev_priv->bus_pci_gart)) { @@ -953,19 +1236,20 @@ RADEON_WRITE( RADEON_MC_AGP_LOCATION, 0xffffffc0 ); /* ?? */ RADEON_WRITE( RADEON_AGP_COMMAND, 0 ); /* clear AGP_COMMAND */ } else { +#endif /* __REALLY_HAVE_SG */ /* Turn off PCI GART */ tmp = RADEON_READ( RADEON_AIC_CNTL ) & ~RADEON_PCIGART_TRANSLATE_EN; RADEON_WRITE( RADEON_AIC_CNTL, tmp ); +#if __REALLY_HAVE_SG } +#endif /* __REALLY_HAVE_SG */ radeon_cp_load_microcode( dev_priv ); radeon_cp_init_ring_buffer( dev, dev_priv ); -#if ROTATE_BUFS dev_priv->last_buf = 0; -#endif dev->dev_private = (void *)dev_priv; @@ -976,7 +1260,7 @@ int radeon_do_cleanup_cp( drm_device_t *dev ) { - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); if ( dev->dev_private ) { drm_radeon_private_t *dev_priv = dev->dev_private; @@ -986,10 +1270,12 @@ DRM_IOREMAPFREE( dev_priv->ring_rptr ); DRM_IOREMAPFREE( dev_priv->buffers ); } else { +#if __REALLY_HAVE_SG if (!DRM(ati_pcigart_cleanup)( dev, dev_priv->phys_pci_gart, dev_priv->bus_pci_gart )) DRM_ERROR( "failed to cleanup PCI GART!\n" ); +#endif /* __REALLY_HAVE_SG */ } DRM(free)( dev->dev_private, sizeof(drm_radeon_private_t), @@ -1012,6 +1298,7 @@ switch ( init.func ) { case RADEON_INIT_CP: + case RADEON_INIT_R200_CP: return radeon_do_init_cp( dev, &init ); case RADEON_CLEANUP_CP: return radeon_do_cleanup_cp( dev ); @@ -1075,7 +1362,7 @@ */ if ( stop.idle ) { ret = radeon_do_cp_idle( dev_priv ); - if ( ret < 0 ) return ret; + if ( ret ) return ret; } /* Finally, we can turn off the CP. If the engine isn't idle, @@ -1145,117 +1432,74 @@ * Fullscreen mode */ -static int radeon_do_init_pageflip( drm_device_t *dev ) -{ - drm_radeon_private_t *dev_priv = dev->dev_private; - DRM_DEBUG( "%s\n", __FUNCTION__ ); - - dev_priv->crtc_offset = RADEON_READ( RADEON_CRTC_OFFSET ); - dev_priv->crtc_offset_cntl = RADEON_READ( RADEON_CRTC_OFFSET_CNTL ); - - RADEON_WRITE( RADEON_CRTC_OFFSET, dev_priv->front_offset ); - RADEON_WRITE( RADEON_CRTC_OFFSET_CNTL, - dev_priv->crtc_offset_cntl | - RADEON_CRTC_OFFSET_FLIP_CNTL ); - - dev_priv->page_flipping = 1; - dev_priv->current_page = 0; - - return 0; -} - -int radeon_do_cleanup_pageflip( drm_device_t *dev ) +/* KW: Deprecated to say the least: + */ +int radeon_fullscreen(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data) { - drm_radeon_private_t *dev_priv = dev->dev_private; - DRM_DEBUG( "%s\n", __FUNCTION__ ); - - RADEON_WRITE( RADEON_CRTC_OFFSET, dev_priv->crtc_offset ); - RADEON_WRITE( RADEON_CRTC_OFFSET_CNTL, dev_priv->crtc_offset_cntl ); - - dev_priv->page_flipping = 0; - dev_priv->current_page = 0; - return 0; } -int radeon_fullscreen( struct inode *inode, struct file *filp, - unsigned int cmd, unsigned long arg ) -{ - drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; - drm_radeon_fullscreen_t fs; - - LOCK_TEST_WITH_RETURN( dev ); - - if ( copy_from_user( &fs, (drm_radeon_fullscreen_t *)arg, - sizeof(fs) ) ) - return -EFAULT; - - switch ( fs.func ) { - case RADEON_INIT_FULLSCREEN: - return radeon_do_init_pageflip( dev ); - case RADEON_CLEANUP_FULLSCREEN: - return radeon_do_cleanup_pageflip( dev ); - } - - return -EINVAL; -} - /* ================================================================ * Freelist management */ -#define RADEON_BUFFER_USED 0xffffffff -#define RADEON_BUFFER_FREE 0 -#if 0 -static int radeon_freelist_init( drm_device_t *dev ) +/* Original comment: FIXME: ROTATE_BUFS is a hack to cycle through + * bufs until freelist code is used. Note this hides a problem with + * the scratch register * (used to keep track of last buffer + * completed) being written to before * the last buffer has actually + * completed rendering. + * + * KW: It's also a good way to find free buffers quickly. + * + * KW: Ideally this loop wouldn't exist, and freelist_get wouldn't + * sleep. However, bugs in older versions of radeon_accel.c mean that + * we essentially have to do this, else old clients will break. + * + * However, it does leave open a potential deadlock where all the + * buffers are held by other clients, which can't release them because + * they can't get the lock. + */ + +drm_buf_t *radeon_freelist_get( drm_device_t *dev ) { drm_device_dma_t *dma = dev->dma; drm_radeon_private_t *dev_priv = dev->dev_private; - drm_buf_t *buf; drm_radeon_buf_priv_t *buf_priv; - drm_radeon_freelist_t *entry; - int i; - - dev_priv->head = DRM(alloc)( sizeof(drm_radeon_freelist_t), - DRM_MEM_DRIVER ); - if ( dev_priv->head == NULL ) - return -ENOMEM; - - memset( dev_priv->head, 0, sizeof(drm_radeon_freelist_t) ); - dev_priv->head->age = RADEON_BUFFER_USED; + drm_buf_t *buf; + int i, t; + int start; - for ( i = 0 ; i < dma->buf_count ; i++ ) { - buf = dma->buflist[i]; - buf_priv = buf->dev_private; + if ( ++dev_priv->last_buf >= dma->buf_count ) + dev_priv->last_buf = 0; - entry = DRM(alloc)( sizeof(drm_radeon_freelist_t), - DRM_MEM_DRIVER ); - if ( !entry ) return -ENOMEM; - - entry->age = RADEON_BUFFER_FREE; - entry->buf = buf; - entry->prev = dev_priv->head; - entry->next = dev_priv->head->next; - if ( !entry->next ) - dev_priv->tail = entry; - - buf_priv->discard = 0; - buf_priv->dispatched = 0; - buf_priv->list_entry = entry; + start = dev_priv->last_buf; - dev_priv->head->next = entry; + for ( t = 0 ; t < dev_priv->usec_timeout ; t++ ) { + u32 done_age = GET_SCRATCH( 1 ); + DRM_DEBUG("done_age = %d\n",done_age); + for ( i = start ; i < dma->buf_count ; i++ ) { + buf = dma->buflist[i]; + buf_priv = buf->dev_private; + if ( buf->pid == 0 || (buf->pending && + buf_priv->age <= done_age) ) { + dev_priv->stats.requested_bufs++; + buf->pending = 0; + return buf; + } + start = 0; + } - if ( dev_priv->head->next ) - dev_priv->head->next->prev = entry; + if (t) { + udelay(1); + dev_priv->stats.freelist_loops++; + } } - return 0; - + DRM_DEBUG( "returning NULL!\n" ); + return NULL; } -#endif - +#if 0 drm_buf_t *radeon_freelist_get( drm_device_t *dev ) { drm_device_dma_t *dma = dev->dma; @@ -1263,76 +1507,40 @@ drm_radeon_buf_priv_t *buf_priv; drm_buf_t *buf; int i, t; -#if ROTATE_BUFS int start; -#endif - - /* FIXME: Optimize -- use freelist code */ + u32 done_age = readl(&dev_priv->scratch[1]); - for ( i = 0 ; i < dma->buf_count ; i++ ) { - buf = dma->buflist[i]; - buf_priv = buf->dev_private; - if ( buf->pid == 0 ) { - DRM_DEBUG( " ret buf=%d last=%d pid=0\n", - buf->idx, dev_priv->last_buf ); - return buf; - } - DRM_DEBUG( " skipping buf=%d pid=%d\n", - buf->idx, buf->pid ); - } - -#if ROTATE_BUFS if ( ++dev_priv->last_buf >= dma->buf_count ) dev_priv->last_buf = 0; + start = dev_priv->last_buf; -#endif - for ( t = 0 ; t < dev_priv->usec_timeout ; t++ ) { -#if 0 - /* FIXME: Disable this for now */ - u32 done_age = dev_priv->scratch[RADEON_LAST_DISPATCH]; -#else - u32 done_age = RADEON_READ( RADEON_LAST_DISPATCH_REG ); -#endif -#if ROTATE_BUFS + dev_priv->stats.freelist_loops++; + + for ( t = 0 ; t < 2 ; t++ ) { for ( i = start ; i < dma->buf_count ; i++ ) { -#else - for ( i = 0 ; i < dma->buf_count ; i++ ) { -#endif buf = dma->buflist[i]; buf_priv = buf->dev_private; - if ( buf->pending && buf_priv->age <= done_age ) { - /* The buffer has been processed, so it - * can now be used. - */ + if ( buf->pid == 0 || (buf->pending && + buf_priv->age <= done_age) ) { + dev_priv->stats.requested_bufs++; buf->pending = 0; - DRM_DEBUG( " ret buf=%d last=%d age=%d done=%d\n", buf->idx, dev_priv->last_buf, buf_priv->age, done_age ); return buf; } - DRM_DEBUG( " skipping buf=%d age=%d done=%d\n", - buf->idx, buf_priv->age, - done_age ); -#if ROTATE_BUFS - start = 0; -#endif } - udelay( 1 ); + start = 0; } - DRM_ERROR( "returning NULL!\n" ); return NULL; } +#endif void radeon_freelist_reset( drm_device_t *dev ) { drm_device_dma_t *dma = dev->dma; -#if ROTATE_BUFS drm_radeon_private_t *dev_priv = dev->dev_private; -#endif int i; -#if ROTATE_BUFS dev_priv->last_buf = 0; -#endif for ( i = 0 ; i < dma->buf_count ; i++ ) { drm_buf_t *buf = dma->buflist[i]; drm_radeon_buf_priv_t *buf_priv = buf->dev_private; @@ -1349,11 +1557,23 @@ { drm_radeon_ring_buffer_t *ring = &dev_priv->ring; int i; + u32 last_head = GET_RING_HEAD(ring); for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { - radeon_update_ring_snapshot( ring ); + u32 head = GET_RING_HEAD(ring); + + ring->space = (head - ring->tail) * sizeof(u32); + if ( ring->space <= 0 ) + ring->space += ring->size; if ( ring->space > n ) return 0; + + dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; + + if (head != last_head) + i = 0; + last_head = head; + udelay( 1 ); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/radeon_drm.h linux-2.4.23-pre8/drivers/char/drm/radeon_drm.h --- linux-2.4.22/drivers/char/drm/radeon_drm.h 2001-08-08 16:42:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/radeon_drm.h 2003-10-22 22:49:09.000000000 +0000 @@ -2,6 +2,7 @@ * * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. * Copyright 2000 VA Linux Systems, Inc., Fremont, California. + * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. * All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -26,6 +27,7 @@ * Authors: * Kevin E. Martin * Gareth Hughes + * Keith Whitwell */ #ifndef __RADEON_DRM_H__ @@ -37,7 +39,8 @@ #ifndef __RADEON_SAREA_DEFINES__ #define __RADEON_SAREA_DEFINES__ -/* What needs to be changed for the current vertex buffer? +/* Old style state flags, required for sarea interface (1.1 and 1.2 + * clears) and 1.2 drm_vertex2 ioctl. */ #define RADEON_UPLOAD_CONTEXT 0x00000001 #define RADEON_UPLOAD_VERTFMT 0x00000002 @@ -56,11 +59,136 @@ #define RADEON_UPLOAD_TEX2IMAGES 0x00004000 #define RADEON_UPLOAD_CLIPRECTS 0x00008000 /* handled client-side */ #define RADEON_REQUIRE_QUIESCENCE 0x00010000 -#define RADEON_UPLOAD_ALL 0x0001ffff +#define RADEON_UPLOAD_ZBIAS 0x00020000 /* version 1.2 and newer */ +#define RADEON_UPLOAD_ALL 0x003effff +#define RADEON_UPLOAD_CONTEXT_ALL 0x003e01ff + + +/* New style per-packet identifiers for use in cmd_buffer ioctl with + * the RADEON_EMIT_PACKET command. Comments relate new packets to old + * state bits and the packet size: + */ +#define RADEON_EMIT_PP_MISC 0 /* context/7 */ +#define RADEON_EMIT_PP_CNTL 1 /* context/3 */ +#define RADEON_EMIT_RB3D_COLORPITCH 2 /* context/1 */ +#define RADEON_EMIT_RE_LINE_PATTERN 3 /* line/2 */ +#define RADEON_EMIT_SE_LINE_WIDTH 4 /* line/1 */ +#define RADEON_EMIT_PP_LUM_MATRIX 5 /* bumpmap/1 */ +#define RADEON_EMIT_PP_ROT_MATRIX_0 6 /* bumpmap/2 */ +#define RADEON_EMIT_RB3D_STENCILREFMASK 7 /* masks/3 */ +#define RADEON_EMIT_SE_VPORT_XSCALE 8 /* viewport/6 */ +#define RADEON_EMIT_SE_CNTL 9 /* setup/2 */ +#define RADEON_EMIT_SE_CNTL_STATUS 10 /* setup/1 */ +#define RADEON_EMIT_RE_MISC 11 /* misc/1 */ +#define RADEON_EMIT_PP_TXFILTER_0 12 /* tex0/6 */ +#define RADEON_EMIT_PP_BORDER_COLOR_0 13 /* tex0/1 */ +#define RADEON_EMIT_PP_TXFILTER_1 14 /* tex1/6 */ +#define RADEON_EMIT_PP_BORDER_COLOR_1 15 /* tex1/1 */ +#define RADEON_EMIT_PP_TXFILTER_2 16 /* tex2/6 */ +#define RADEON_EMIT_PP_BORDER_COLOR_2 17 /* tex2/1 */ +#define RADEON_EMIT_SE_ZBIAS_FACTOR 18 /* zbias/2 */ +#define RADEON_EMIT_SE_TCL_OUTPUT_VTX_FMT 19 /* tcl/11 */ +#define RADEON_EMIT_SE_TCL_MATERIAL_EMMISSIVE_RED 20 /* material/17 */ +#define R200_EMIT_PP_TXCBLEND_0 21 /* tex0/4 */ +#define R200_EMIT_PP_TXCBLEND_1 22 /* tex1/4 */ +#define R200_EMIT_PP_TXCBLEND_2 23 /* tex2/4 */ +#define R200_EMIT_PP_TXCBLEND_3 24 /* tex3/4 */ +#define R200_EMIT_PP_TXCBLEND_4 25 /* tex4/4 */ +#define R200_EMIT_PP_TXCBLEND_5 26 /* tex5/4 */ +#define R200_EMIT_PP_TXCBLEND_6 27 /* /4 */ +#define R200_EMIT_PP_TXCBLEND_7 28 /* /4 */ +#define R200_EMIT_TCL_LIGHT_MODEL_CTL_0 29 /* tcl/7 */ +#define R200_EMIT_TFACTOR_0 30 /* tf/7 */ +#define R200_EMIT_VTX_FMT_0 31 /* vtx/5 */ +#define R200_EMIT_VAP_CTL 32 /* vap/1 */ +#define R200_EMIT_MATRIX_SELECT_0 33 /* msl/5 */ +#define R200_EMIT_TEX_PROC_CTL_2 34 /* tcg/5 */ +#define R200_EMIT_TCL_UCP_VERT_BLEND_CTL 35 /* tcl/1 */ +#define R200_EMIT_PP_TXFILTER_0 36 /* tex0/6 */ +#define R200_EMIT_PP_TXFILTER_1 37 /* tex1/6 */ +#define R200_EMIT_PP_TXFILTER_2 38 /* tex2/6 */ +#define R200_EMIT_PP_TXFILTER_3 39 /* tex3/6 */ +#define R200_EMIT_PP_TXFILTER_4 40 /* tex4/6 */ +#define R200_EMIT_PP_TXFILTER_5 41 /* tex5/6 */ +#define R200_EMIT_PP_TXOFFSET_0 42 /* tex0/1 */ +#define R200_EMIT_PP_TXOFFSET_1 43 /* tex1/1 */ +#define R200_EMIT_PP_TXOFFSET_2 44 /* tex2/1 */ +#define R200_EMIT_PP_TXOFFSET_3 45 /* tex3/1 */ +#define R200_EMIT_PP_TXOFFSET_4 46 /* tex4/1 */ +#define R200_EMIT_PP_TXOFFSET_5 47 /* tex5/1 */ +#define R200_EMIT_VTE_CNTL 48 /* vte/1 */ +#define R200_EMIT_OUTPUT_VTX_COMP_SEL 49 /* vtx/1 */ +#define R200_EMIT_PP_TAM_DEBUG3 50 /* tam/1 */ +#define R200_EMIT_PP_CNTL_X 51 /* cst/1 */ +#define R200_EMIT_RB3D_DEPTHXY_OFFSET 52 /* cst/1 */ +#define R200_EMIT_RE_AUX_SCISSOR_CNTL 53 /* cst/1 */ +#define R200_EMIT_RE_SCISSOR_TL_0 54 /* cst/2 */ +#define R200_EMIT_RE_SCISSOR_TL_1 55 /* cst/2 */ +#define R200_EMIT_RE_SCISSOR_TL_2 56 /* cst/2 */ +#define R200_EMIT_SE_VAP_CNTL_STATUS 57 /* cst/1 */ +#define R200_EMIT_SE_VTX_STATE_CNTL 58 /* cst/1 */ +#define R200_EMIT_RE_POINTSIZE 59 /* cst/1 */ +#define R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0 60 /* cst/4 */ +#define R200_EMIT_PP_CUBIC_FACES_0 61 +#define R200_EMIT_PP_CUBIC_OFFSETS_0 62 +#define R200_EMIT_PP_CUBIC_FACES_1 63 +#define R200_EMIT_PP_CUBIC_OFFSETS_1 64 +#define R200_EMIT_PP_CUBIC_FACES_2 65 +#define R200_EMIT_PP_CUBIC_OFFSETS_2 66 +#define R200_EMIT_PP_CUBIC_FACES_3 67 +#define R200_EMIT_PP_CUBIC_OFFSETS_3 68 +#define R200_EMIT_PP_CUBIC_FACES_4 69 +#define R200_EMIT_PP_CUBIC_OFFSETS_4 70 +#define R200_EMIT_PP_CUBIC_FACES_5 71 +#define R200_EMIT_PP_CUBIC_OFFSETS_5 72 +#define RADEON_MAX_STATE_PACKETS 73 + + +/* Commands understood by cmd_buffer ioctl. More can be added but + * obviously these can't be removed or changed: + */ +#define RADEON_CMD_PACKET 1 /* emit one of the register packets above */ +#define RADEON_CMD_SCALARS 2 /* emit scalar data */ +#define RADEON_CMD_VECTORS 3 /* emit vector data */ +#define RADEON_CMD_DMA_DISCARD 4 /* discard current dma buf */ +#define RADEON_CMD_PACKET3 5 /* emit hw packet */ +#define RADEON_CMD_PACKET3_CLIP 6 /* emit hw packet wrapped in cliprects */ +#define RADEON_CMD_SCALARS2 7 /* r200 stopgap */ +#define RADEON_CMD_WAIT 8 /* emit hw wait commands -- note: + * doesn't make the cpu wait, just + * the graphics hardware */ + + +typedef union { + int i; + struct { + unsigned char cmd_type, pad0, pad1, pad2; + } header; + struct { + unsigned char cmd_type, packet_id, pad0, pad1; + } packet; + struct { + unsigned char cmd_type, offset, stride, count; + } scalars; + struct { + unsigned char cmd_type, offset, stride, count; + } vectors; + struct { + unsigned char cmd_type, buf_idx, pad0, pad1; + } dma; + struct { + unsigned char cmd_type, flags, pad0, pad1; + } wait; +} drm_radeon_cmd_header_t; + +#define RADEON_WAIT_2D 0x1 +#define RADEON_WAIT_3D 0x2 + #define RADEON_FRONT 0x1 #define RADEON_BACK 0x2 #define RADEON_DEPTH 0x4 +#define RADEON_STENCIL 0x8 /* Primitive types */ @@ -78,12 +206,9 @@ /* Byte offsets for indirect buffer data */ #define RADEON_INDEX_PRIM_OFFSET 20 -#define RADEON_HOSTDATA_BLIT_OFFSET 32 #define RADEON_SCRATCH_REG_OFFSET 32 -/* Keep these small for testing - */ #define RADEON_NR_SAREA_CLIPRECTS 12 /* There are 2 heaps (local/AGP). Each region within a heap is a @@ -95,7 +220,7 @@ #define RADEON_NR_TEX_REGIONS 64 #define RADEON_LOG_TEX_GRANULARITY 16 -#define RADEON_MAX_TEXTURE_LEVELS 11 +#define RADEON_MAX_TEXTURE_LEVELS 12 #define RADEON_MAX_TEXTURE_UNITS 3 #endif /* __RADEON_SAREA_DEFINES__ */ @@ -155,28 +280,18 @@ /* Setup state */ unsigned int se_cntl_status; /* 0x2140 */ -#ifdef TCL_ENABLE - /* TCL state */ - radeon_color_regs_t se_tcl_material_emmissive; /* 0x2210 */ - radeon_color_regs_t se_tcl_material_ambient; - radeon_color_regs_t se_tcl_material_diffuse; - radeon_color_regs_t se_tcl_material_specular; - unsigned int se_tcl_shininess; - unsigned int se_tcl_output_vtx_fmt; - unsigned int se_tcl_output_vtx_sel; - unsigned int se_tcl_matrix_select_0; - unsigned int se_tcl_matrix_select_1; - unsigned int se_tcl_ucp_vert_blend_ctl; - unsigned int se_tcl_texture_proc_ctl; - unsigned int se_tcl_light_model_ctl; - unsigned int se_tcl_per_light_ctl[4]; -#endif - /* Misc state */ unsigned int re_top_left; /* 0x26c0 */ unsigned int re_misc; } drm_radeon_context_regs_t; +typedef struct { + /* Zbias state */ + unsigned int se_zbias_factor; /* 0x1dac */ + unsigned int se_zbias_constant; +} drm_radeon_context2_regs_t; + + /* Setup registers for each texture unit */ typedef struct { @@ -186,24 +301,37 @@ unsigned int pp_txcblend; unsigned int pp_txablend; unsigned int pp_tfactor; - unsigned int pp_border_color; - -#ifdef CUBIC_ENABLE - unsigned int pp_cubic_faces; - unsigned int pp_cubic_offset[5]; -#endif } drm_radeon_texture_regs_t; typedef struct { + unsigned int start; + unsigned int finish; + unsigned int prim:8; + unsigned int stateidx:8; + unsigned int numverts:16; /* overloaded as offset/64 for elt prims */ + unsigned int vc_format; /* vertex format */ +} drm_radeon_prim_t; + + +typedef struct { + drm_radeon_context_regs_t context; + drm_radeon_texture_regs_t tex[RADEON_MAX_TEXTURE_UNITS]; + drm_radeon_context2_regs_t context2; + unsigned int dirty; +} drm_radeon_state_t; + + +typedef struct { unsigned char next, prev; unsigned char in_use; int age; } drm_radeon_tex_region_t; typedef struct { - /* The channel for communication of state information to the kernel - * on firing a vertex buffer. + /* The channel for communication of state information to the + * kernel on firing a vertex buffer with either of the + * obsoleted vertex/index ioctls. */ drm_radeon_context_regs_t context_state; drm_radeon_texture_regs_t tex_state[RADEON_MAX_TEXTURE_UNITS]; @@ -225,16 +353,50 @@ drm_radeon_tex_region_t tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS+1]; int tex_age[RADEON_NR_TEX_HEAPS]; int ctx_owner; + int pfState; /* number of 3d windows (0,1,2ormore) */ + int pfCurrentPage; /* which buffer is being displayed? */ + int crtc2_base; /* CRTC2 frame offset */ } drm_radeon_sarea_t; /* WARNING: If you change any of these defines, make sure to change the * defines in the Xserver file (xf86drmRadeon.h) + * + * KW: actually it's illegal to change any of this (backwards compatibility). */ + +/* Radeon specific ioctls + * The device specific ioctl range is 0x40 to 0x79. + */ +#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( 0x40, drm_radeon_init_t) +#define DRM_IOCTL_RADEON_CP_START DRM_IO( 0x41) +#define DRM_IOCTL_RADEON_CP_STOP DRM_IOW( 0x42, drm_radeon_cp_stop_t) +#define DRM_IOCTL_RADEON_CP_RESET DRM_IO( 0x43) +#define DRM_IOCTL_RADEON_CP_IDLE DRM_IO( 0x44) +#define DRM_IOCTL_RADEON_RESET DRM_IO( 0x45) +#define DRM_IOCTL_RADEON_FULLSCREEN DRM_IOW( 0x46, drm_radeon_fullscreen_t) +#define DRM_IOCTL_RADEON_SWAP DRM_IO( 0x47) +#define DRM_IOCTL_RADEON_CLEAR DRM_IOW( 0x48, drm_radeon_clear_t) +#define DRM_IOCTL_RADEON_VERTEX DRM_IOW( 0x49, drm_radeon_vertex_t) +#define DRM_IOCTL_RADEON_INDICES DRM_IOW( 0x4a, drm_radeon_indices_t) +#define DRM_IOCTL_RADEON_STIPPLE DRM_IOW( 0x4c, drm_radeon_stipple_t) +#define DRM_IOCTL_RADEON_INDIRECT DRM_IOWR(0x4d, drm_radeon_indirect_t) +#define DRM_IOCTL_RADEON_TEXTURE DRM_IOWR(0x4e, drm_radeon_texture_t) +#define DRM_IOCTL_RADEON_VERTEX2 DRM_IOW( 0x4f, drm_radeon_vertex2_t) +#define DRM_IOCTL_RADEON_CMDBUF DRM_IOW( 0x50, drm_radeon_cmd_buffer_t) +#define DRM_IOCTL_RADEON_GETPARAM DRM_IOWR(0x51, drm_radeon_getparam_t) +#define DRM_IOCTL_RADEON_FLIP DRM_IO( 0x52) +#define DRM_IOCTL_RADEON_ALLOC DRM_IOWR( 0x53, drm_radeon_mem_alloc_t) +#define DRM_IOCTL_RADEON_FREE DRM_IOW( 0x54, drm_radeon_mem_free_t) +#define DRM_IOCTL_RADEON_INIT_HEAP DRM_IOW( 0x55, drm_radeon_mem_init_heap_t) +#define DRM_IOCTL_RADEON_IRQ_EMIT DRM_IOWR( 0x56, drm_radeon_irq_emit_t) +#define DRM_IOCTL_RADEON_IRQ_WAIT DRM_IOW( 0x57, drm_radeon_irq_wait_t) + typedef struct drm_radeon_init { enum { RADEON_INIT_CP = 0x01, - RADEON_CLEANUP_CP = 0x02 + RADEON_CLEANUP_CP = 0x02, + RADEON_INIT_R200_CP = 0x03, } func; unsigned long sarea_priv_offset; int is_pci; @@ -285,7 +447,7 @@ unsigned int clear_color; unsigned int clear_depth; unsigned int color_mask; - unsigned int depth_mask; + unsigned int depth_mask; /* misnamed field: should be stencil */ drm_radeon_clear_rect_t *depth_boxes; } drm_radeon_clear_t; @@ -304,6 +466,36 @@ int discard; /* Client finished with buffer? */ } drm_radeon_indices_t; +/* v1.2 - obsoletes drm_radeon_vertex and drm_radeon_indices + * - allows multiple primitives and state changes in a single ioctl + * - supports driver change to emit native primitives + */ +typedef struct drm_radeon_vertex2 { + int idx; /* Index of vertex buffer */ + int discard; /* Client finished with buffer? */ + int nr_states; + drm_radeon_state_t *state; + int nr_prims; + drm_radeon_prim_t *prim; +} drm_radeon_vertex2_t; + +/* v1.3 - obsoletes drm_radeon_vertex2 + * - allows arbitarily large cliprect list + * - allows updating of tcl packet, vector and scalar state + * - allows memory-efficient description of state updates + * - allows state to be emitted without a primitive + * (for clears, ctx switches) + * - allows more than one dma buffer to be referenced per ioctl + * - supports tcl driver + * - may be extended in future versions with new cmd types, packets + */ +typedef struct drm_radeon_cmd_buffer { + int bufsz; + char *buf; + int nbox; + drm_clip_rect_t *boxes; +} drm_radeon_cmd_buffer_t; + typedef struct drm_radeon_tex_image { unsigned int x, y; /* Blit coordinates */ unsigned int width, height; @@ -330,4 +522,55 @@ int discard; } drm_radeon_indirect_t; + +/* 1.3: An ioctl to get parameters that aren't available to the 3d + * client any other way. + */ +#define RADEON_PARAM_AGP_BUFFER_OFFSET 1 /* card offset of 1st agp buffer */ +#define RADEON_PARAM_LAST_FRAME 2 +#define RADEON_PARAM_LAST_DISPATCH 3 +#define RADEON_PARAM_LAST_CLEAR 4 +#define RADEON_PARAM_IRQ_NR 5 +#define RADEON_PARAM_AGP_BASE 6 /* card offset of agp base */ + +typedef struct drm_radeon_getparam { + int param; + int *value; +} drm_radeon_getparam_t; + +/* 1.6: Set up a memory manager for regions of shared memory: + */ +#define RADEON_MEM_REGION_AGP 1 +#define RADEON_MEM_REGION_FB 2 + +typedef struct drm_radeon_mem_alloc { + int region; + int alignment; + int size; + int *region_offset; /* offset from start of fb or agp */ +} drm_radeon_mem_alloc_t; + +typedef struct drm_radeon_mem_free { + int region; + int region_offset; +} drm_radeon_mem_free_t; + +typedef struct drm_radeon_mem_init_heap { + int region; + int size; + int start; +} drm_radeon_mem_init_heap_t; + + +/* 1.6: Userspace can request & wait on irq's: + */ +typedef struct drm_radeon_irq_emit { + int *irq_seq; +} drm_radeon_irq_emit_t; + +typedef struct drm_radeon_irq_wait { + int irq_seq; +} drm_radeon_irq_wait_t; + + #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/radeon_drv.c linux-2.4.23-pre8/drivers/char/drm/radeon_drv.c --- linux-2.4.22/drivers/char/drm/radeon_drv.c 2001-08-08 16:42:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/radeon_drv.c 2003-10-22 22:49:11.000000000 +0000 @@ -30,47 +30,11 @@ #include #include "radeon.h" #include "drmP.h" +#include "drm.h" +#include "radeon_drm.h" #include "radeon_drv.h" #include "ati_pcigart.h" -#define DRIVER_AUTHOR "Gareth Hughes, VA Linux Systems Inc." - -#define DRIVER_NAME "radeon" -#define DRIVER_DESC "ATI Radeon" -#define DRIVER_DATE "20010405" - -#define DRIVER_MAJOR 1 -#define DRIVER_MINOR 1 -#define DRIVER_PATCHLEVEL 1 - -#define DRIVER_IOCTLS \ - [DRM_IOCTL_NR(DRM_IOCTL_DMA)] = { radeon_cp_buffers, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_INIT)] = { radeon_cp_init, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_START)] = { radeon_cp_start, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_STOP)] = { radeon_cp_stop, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_RESET)] = { radeon_cp_reset, 1, 1 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CP_IDLE)] = { radeon_cp_idle, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_RESET)] = { radeon_engine_reset, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_FULLSCREEN)] = { radeon_fullscreen, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_SWAP)] = { radeon_cp_swap, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_CLEAR)] = { radeon_cp_clear, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_VERTEX)] = { radeon_cp_vertex, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_INDICES)] = { radeon_cp_indices, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_TEXTURE)] = { radeon_cp_texture, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_STIPPLE)] = { radeon_cp_stipple, 1, 0 }, \ - [DRM_IOCTL_NR(DRM_IOCTL_RADEON_INDIRECT)] = { radeon_cp_indirect, 1, 1 }, - - -#if 0 -/* GH: Count data sent to card via ring or vertex/indirect buffers. - */ -#define __HAVE_COUNTERS 3 -#define __HAVE_COUNTER6 _DRM_STAT_IRQ -#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY -#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY -#endif - - #include "drm_agpsupport.h" #include "drm_auth.h" #include "drm_bufs.h" @@ -78,26 +42,6 @@ #include "drm_dma.h" #include "drm_drawable.h" #include "drm_drv.h" - -#ifndef MODULE -/* DRM(options) is called by the kernel to parse command-line options - * passed via the boot-loader (e.g., LILO). It calls the insmod option - * routine, drm_parse_drm. - */ - -/* JH- We have to hand expand the string ourselves because of the cpp. If - * anyone can think of a way that we can fit into the __setup macro without - * changing it, then please send the solution my way. - */ -static int __init radeon_options( char *str ) -{ - DRM(parse_options)( str ); - return 1; -} - -__setup( DRIVER_NAME "=", radeon_options ); -#endif - #include "drm_fops.h" #include "drm_init.h" #include "drm_ioctl.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/radeon_drv.h linux-2.4.23-pre8/drivers/char/drm/radeon_drv.h --- linux-2.4.22/drivers/char/drm/radeon_drv.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/radeon_drv.h 2003-10-22 22:48:57.000000000 +0000 @@ -31,6 +31,9 @@ #ifndef __RADEON_DRV_H__ #define __RADEON_DRV_H__ +#define GET_RING_HEAD(ring) readl( (volatile u32 *) (ring)->head ) +#define SET_RING_HEAD(ring,val) writel( (val), (volatile u32 *) (ring)->head ) + typedef struct drm_radeon_freelist { unsigned int age; drm_buf_t *buf; @@ -58,6 +61,15 @@ u32 se_cntl; } drm_radeon_depth_clear_t; + +struct mem_block { + struct mem_block *next; + struct mem_block *prev; + int start; + int size; + int pid; /* 0: free, -1: heap, other: real pids */ +}; + typedef struct drm_radeon_private { drm_radeon_ring_buffer_t ring; drm_radeon_sarea_t *sarea_priv; @@ -71,27 +83,32 @@ drm_radeon_freelist_t *head; drm_radeon_freelist_t *tail; -/* FIXME: ROTATE_BUFS is a hask to cycle through bufs until freelist - code is used. Note this hides a problem with the scratch register - (used to keep track of last buffer completed) being written to before - the last buffer has actually completed rendering. */ -#define ROTATE_BUFS 1 -#if ROTATE_BUFS int last_buf; -#endif volatile u32 *scratch; + int writeback_works; int usec_timeout; + + int is_r200; + int is_pci; unsigned long phys_pci_gart; dma_addr_t bus_pci_gart; - atomic_t idle_count; + struct { + u32 boxes; + int freelist_timeouts; + int freelist_loops; + int requested_bufs; + int last_frame_reads; + int last_clear_reads; + int clears; + int texture_uploads; + } stats; + int do_boxes; int page_flipping; int current_page; - u32 crtc_offset; - u32 crtc_offset_cntl; u32 color_fmt; unsigned int front_offset; @@ -116,14 +133,18 @@ drm_map_t *ring_rptr; drm_map_t *buffers; drm_map_t *agp_textures; + + struct mem_block *agp_heap; + struct mem_block *fb_heap; + + /* SW interrupt */ + wait_queue_head_t swi_queue; + atomic_t swi_emitted; + } drm_radeon_private_t; typedef struct drm_radeon_buf_priv { u32 age; - int prim; - int discard; - int dispatched; - drm_radeon_freelist_t *list_entry; } drm_radeon_buf_priv_t; /* radeon_cp.c */ @@ -149,14 +170,6 @@ extern int radeon_wait_ring( drm_radeon_private_t *dev_priv, int n ); -static inline void -radeon_update_ring_snapshot( drm_radeon_ring_buffer_t *ring ) -{ - ring->space = (*(volatile int *)ring->head - ring->tail) * sizeof(u32); - if ( ring->space <= 0 ) - ring->space += ring->size; -} - extern int radeon_do_cp_idle( drm_radeon_private_t *dev_priv ); extern int radeon_do_cleanup_cp( drm_device_t *dev ); extern int radeon_do_cleanup_pageflip( drm_device_t *dev ); @@ -176,6 +189,34 @@ unsigned int cmd, unsigned long arg ); extern int radeon_cp_indirect( struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg ); +extern int radeon_cp_vertex2(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); +extern int radeon_cp_cmdbuf(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); +extern int radeon_cp_getparam(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); +extern int radeon_cp_flip(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); + +extern int radeon_mem_alloc(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); +extern int radeon_mem_free(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); +extern int radeon_mem_init_heap(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); +extern void radeon_mem_takedown( struct mem_block **heap ); +extern void radeon_mem_release( struct mem_block *heap ); + + /* radeon_irq.c */ +extern int radeon_irq_emit(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); +extern int radeon_irq_wait(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg ); + +extern int radeon_emit_and_wait_irq(drm_device_t *dev); +extern int radeon_wait_irq(drm_device_t *dev, int swi_nr); +extern int radeon_emit_irq(drm_device_t *dev); + + +/* Flags for stats.boxes + */ +#define RADEON_BOX_DMA_IDLE 0x1 +#define RADEON_BOX_RING_FULL 0x2 +#define RADEON_BOX_FLIP 0x4 +#define RADEON_BOX_WAIT_IDLE 0x8 +#define RADEON_BOX_TEXTURE_LOAD 0x10 + /* Register definitions, register access macros and drmAddMap constants @@ -202,10 +243,10 @@ #define RADEON_CRTC_OFFSET_CNTL 0x0228 # define RADEON_CRTC_TILE_EN (1 << 15) # define RADEON_CRTC_OFFSET_FLIP_CNTL (1 << 16) +#define RADEON_CRTC2_OFFSET 0x0324 +#define RADEON_CRTC2_OFFSET_CNTL 0x0328 #define RADEON_RB3D_COLORPITCH 0x1c48 -#define RADEON_RB3D_DEPTHCLEARVALUE 0x1c30 -#define RADEON_RB3D_DEPTHXY_OFFSET 0x1c60 #define RADEON_DP_GUI_MASTER_CNTL 0x146c # define RADEON_GMC_SRC_PITCH_OFFSET_CNTL (1 << 0) @@ -240,6 +281,24 @@ #define RADEON_SCRATCH_UMSK 0x0770 #define RADEON_SCRATCH_ADDR 0x0774 +#define GET_SCRATCH( x ) (dev_priv->writeback_works \ + ? readl( &dev_priv->scratch[(x)] ) \ + : RADEON_READ( RADEON_SCRATCH_REG0 + 4*(x) ) ) + + +#define RADEON_GEN_INT_CNTL 0x0040 +# define RADEON_CRTC_VBLANK_MASK (1 << 0) +# define RADEON_GUI_IDLE_INT_ENABLE (1 << 19) +# define RADEON_SW_INT_ENABLE (1 << 25) + +#define RADEON_GEN_INT_STATUS 0x0044 +# define RADEON_CRTC_VBLANK_STAT (1 << 0) +# define RADEON_CRTC_VBLANK_STAT_ACK (1 << 0) +# define RADEON_GUI_IDLE_INT_TEST_ACK (1 << 19) +# define RADEON_SW_INT_TEST (1 << 25) +# define RADEON_SW_INT_TEST_ACK (1 << 25) +# define RADEON_SW_INT_FIRE (1 << 26) + #define RADEON_HOST_PATH_CNTL 0x0130 # define RADEON_HDP_SOFT_RESET (1 << 26) # define RADEON_HDP_WC_TIMEOUT_MASK (7 << 28) @@ -253,6 +312,12 @@ # define RADEON_ISYNC_WAIT_IDLEGUI (1 << 4) # define RADEON_ISYNC_CPSCRATCH_IDLEGUI (1 << 5) +#define RADEON_RBBM_GUICNTL 0x172c +# define RADEON_HOST_DATA_SWAP_NONE (0 << 0) +# define RADEON_HOST_DATA_SWAP_16BIT (1 << 0) +# define RADEON_HOST_DATA_SWAP_32BIT (2 << 0) +# define RADEON_HOST_DATA_SWAP_HDW (3 << 0) + #define RADEON_MC_AGP_LOCATION 0x014c #define RADEON_MC_FB_LOCATION 0x0148 #define RADEON_MCLK_CNTL 0x0012 @@ -290,10 +355,8 @@ # define RADEON_ROP_ENABLE (1 << 6) # define RADEON_STENCIL_ENABLE (1 << 7) # define RADEON_Z_ENABLE (1 << 8) -# define RADEON_DEPTH_XZ_OFFEST_ENABLE (1 << 9) -# define RADEON_ZBLOCK8 (0 << 15) -# define RADEON_ZBLOCK16 (1 << 15) #define RADEON_RB3D_DEPTHOFFSET 0x1c24 +#define RADEON_RB3D_DEPTHPITCH 0x1c28 #define RADEON_RB3D_PLANEMASK 0x1d84 #define RADEON_RB3D_STENCILREFMASK 0x1d7c #define RADEON_RB3D_ZCACHE_MODE 0x3250 @@ -306,9 +369,9 @@ # define RADEON_Z_TEST_MASK (7 << 4) # define RADEON_Z_TEST_ALWAYS (7 << 4) # define RADEON_STENCIL_TEST_ALWAYS (7 << 12) -# define RADEON_STENCIL_S_FAIL_KEEP (0 << 16) -# define RADEON_STENCIL_ZPASS_KEEP (0 << 20) -# define RADEON_STENCIL_ZFAIL_KEEP (0 << 20) +# define RADEON_STENCIL_S_FAIL_REPLACE (2 << 16) +# define RADEON_STENCIL_ZPASS_REPLACE (2 << 20) +# define RADEON_STENCIL_ZFAIL_REPLACE (2 << 24) # define RADEON_Z_WRITE_ENABLE (1 << 30) #define RADEON_RBBM_SOFT_RESET 0x00f0 # define RADEON_SOFT_RESET_CP (1 << 0) @@ -357,6 +420,16 @@ #define RADEON_SE_CNTL_STATUS 0x2140 #define RADEON_SE_LINE_WIDTH 0x1db8 #define RADEON_SE_VPORT_XSCALE 0x1d98 +#define RADEON_SE_ZBIAS_FACTOR 0x1db0 +#define RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED 0x2210 +#define RADEON_SE_TCL_OUTPUT_VTX_FMT 0x2254 +#define RADEON_SE_TCL_VECTOR_INDX_REG 0x2200 +# define RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT 16 +# define RADEON_VEC_INDX_DWORD_COUNT_SHIFT 28 +#define RADEON_SE_TCL_VECTOR_DATA_REG 0x2204 +#define RADEON_SE_TCL_SCALAR_INDX_REG 0x2208 +# define RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT 16 +#define RADEON_SE_TCL_SCALAR_DATA_REG 0x220C #define RADEON_SURFACE_ACCESS_FLAGS 0x0bf8 #define RADEON_SURFACE_ACCESS_CLR 0x0bfc #define RADEON_SURFACE_CNTL 0x0b00 @@ -421,6 +494,7 @@ #define RADEON_CP_RB_BASE 0x0700 #define RADEON_CP_RB_CNTL 0x0704 +# define RADEON_BUF_SWAP_32BIT (2 << 16) #define RADEON_CP_RB_RPTR_ADDR 0x070c #define RADEON_CP_RB_RPTR 0x0710 #define RADEON_CP_RB_WPTR 0x0714 @@ -457,11 +531,14 @@ #define RADEON_CP_PACKET3 0xC0000000 # define RADEON_3D_RNDR_GEN_INDX_PRIM 0x00002300 # define RADEON_WAIT_FOR_IDLE 0x00002600 +# define RADEON_3D_DRAW_VBUF 0x00002800 # define RADEON_3D_DRAW_IMMD 0x00002900 -# define RADEON_3D_CLEAR_ZMASK 0x00003200 +# define RADEON_3D_DRAW_INDX 0x00002A00 +# define RADEON_3D_LOAD_VBPNTR 0x00002F00 # define RADEON_CNTL_HOSTDATA_BLT 0x00009400 # define RADEON_CNTL_PAINT_MULTI 0x00009A00 # define RADEON_CNTL_BITBLT_MULTI 0x00009B00 +# define RADEON_CNTL_SET_SCISSORS 0xC0001E00 #define RADEON_CP_PACKET_MASK 0xC0000000 #define RADEON_CP_PACKET_COUNT_MASK 0x3fff0000 @@ -470,6 +547,7 @@ #define RADEON_CP_PACKET1_REG1_MASK 0x003ff800 #define RADEON_VTX_Z_PRESENT (1 << 31) +#define RADEON_VTX_PKCOLOR_PRESENT (1 << 3) #define RADEON_PRIM_TYPE_NONE (0 << 0) #define RADEON_PRIM_TYPE_POINT (1 << 0) @@ -482,6 +560,7 @@ #define RADEON_PRIM_TYPE_RECT_LIST (8 << 0) #define RADEON_PRIM_TYPE_3VRT_POINT_LIST (9 << 0) #define RADEON_PRIM_TYPE_3VRT_LINE_LIST (10 << 0) +#define RADEON_PRIM_TYPE_MASK 0xf #define RADEON_PRIM_WALK_IND (1 << 4) #define RADEON_PRIM_WALK_LIST (2 << 4) #define RADEON_PRIM_WALK_RING (3 << 4) @@ -508,6 +587,105 @@ #define RADEON_TXFORMAT_ARGB4444 5 #define RADEON_TXFORMAT_ARGB8888 6 #define RADEON_TXFORMAT_RGBA8888 7 +#define RADEON_TXFORMAT_VYUY422 10 +#define RADEON_TXFORMAT_YVYU422 11 +#define RADEON_TXFORMAT_DXT1 12 +#define RADEON_TXFORMAT_DXT23 14 +#define RADEON_TXFORMAT_DXT45 15 + +#define R200_PP_TXCBLEND_0 0x2f00 +#define R200_PP_TXCBLEND_1 0x2f10 +#define R200_PP_TXCBLEND_2 0x2f20 +#define R200_PP_TXCBLEND_3 0x2f30 +#define R200_PP_TXCBLEND_4 0x2f40 +#define R200_PP_TXCBLEND_5 0x2f50 +#define R200_PP_TXCBLEND_6 0x2f60 +#define R200_PP_TXCBLEND_7 0x2f70 +#define R200_SE_TCL_LIGHT_MODEL_CTL_0 0x2268 +#define R200_PP_TFACTOR_0 0x2ee0 +#define R200_SE_VTX_FMT_0 0x2088 +#define R200_SE_VAP_CNTL 0x2080 +#define R200_SE_TCL_MATRIX_SEL_0 0x2230 +#define R200_SE_TCL_TEX_PROC_CTL_2 0x22a8 +#define R200_SE_TCL_UCP_VERT_BLEND_CTL 0x22c0 +#define R200_PP_TXFILTER_5 0x2ca0 +#define R200_PP_TXFILTER_4 0x2c80 +#define R200_PP_TXFILTER_3 0x2c60 +#define R200_PP_TXFILTER_2 0x2c40 +#define R200_PP_TXFILTER_1 0x2c20 +#define R200_PP_TXFILTER_0 0x2c00 +#define R200_PP_TXOFFSET_5 0x2d78 +#define R200_PP_TXOFFSET_4 0x2d60 +#define R200_PP_TXOFFSET_3 0x2d48 +#define R200_PP_TXOFFSET_2 0x2d30 +#define R200_PP_TXOFFSET_1 0x2d18 +#define R200_PP_TXOFFSET_0 0x2d00 + +#define R200_PP_CUBIC_FACES_0 0x2c18 +#define R200_PP_CUBIC_FACES_1 0x2c38 +#define R200_PP_CUBIC_FACES_2 0x2c58 +#define R200_PP_CUBIC_FACES_3 0x2c78 +#define R200_PP_CUBIC_FACES_4 0x2c98 +#define R200_PP_CUBIC_FACES_5 0x2cb8 +#define R200_PP_CUBIC_OFFSET_F1_0 0x2d04 +#define R200_PP_CUBIC_OFFSET_F2_0 0x2d08 +#define R200_PP_CUBIC_OFFSET_F3_0 0x2d0c +#define R200_PP_CUBIC_OFFSET_F4_0 0x2d10 +#define R200_PP_CUBIC_OFFSET_F5_0 0x2d14 +#define R200_PP_CUBIC_OFFSET_F1_1 0x2d1c +#define R200_PP_CUBIC_OFFSET_F2_1 0x2d20 +#define R200_PP_CUBIC_OFFSET_F3_1 0x2d24 +#define R200_PP_CUBIC_OFFSET_F4_1 0x2d28 +#define R200_PP_CUBIC_OFFSET_F5_1 0x2d2c +#define R200_PP_CUBIC_OFFSET_F1_2 0x2d34 +#define R200_PP_CUBIC_OFFSET_F2_2 0x2d38 +#define R200_PP_CUBIC_OFFSET_F3_2 0x2d3c +#define R200_PP_CUBIC_OFFSET_F4_2 0x2d40 +#define R200_PP_CUBIC_OFFSET_F5_2 0x2d44 +#define R200_PP_CUBIC_OFFSET_F1_3 0x2d4c +#define R200_PP_CUBIC_OFFSET_F2_3 0x2d50 +#define R200_PP_CUBIC_OFFSET_F3_3 0x2d54 +#define R200_PP_CUBIC_OFFSET_F4_3 0x2d58 +#define R200_PP_CUBIC_OFFSET_F5_3 0x2d5c +#define R200_PP_CUBIC_OFFSET_F1_4 0x2d64 +#define R200_PP_CUBIC_OFFSET_F2_4 0x2d68 +#define R200_PP_CUBIC_OFFSET_F3_4 0x2d6c +#define R200_PP_CUBIC_OFFSET_F4_4 0x2d70 +#define R200_PP_CUBIC_OFFSET_F5_4 0x2d74 +#define R200_PP_CUBIC_OFFSET_F1_5 0x2d7c +#define R200_PP_CUBIC_OFFSET_F2_5 0x2d80 +#define R200_PP_CUBIC_OFFSET_F3_5 0x2d84 +#define R200_PP_CUBIC_OFFSET_F4_5 0x2d88 +#define R200_PP_CUBIC_OFFSET_F5_5 0x2d8c + +#define R200_RE_AUX_SCISSOR_CNTL 0x26f0 +#define R200_SE_VTE_CNTL 0x20b0 +#define R200_SE_TCL_OUTPUT_VTX_COMP_SEL 0x2250 +#define R200_PP_TAM_DEBUG3 0x2d9c +#define R200_PP_CNTL_X 0x2cc4 +#define R200_SE_VAP_CNTL_STATUS 0x2140 +#define R200_RE_SCISSOR_TL_0 0x1cd8 +#define R200_RE_SCISSOR_TL_1 0x1ce0 +#define R200_RE_SCISSOR_TL_2 0x1ce8 +#define R200_RB3D_DEPTHXY_OFFSET 0x1d60 +#define R200_RE_AUX_SCISSOR_CNTL 0x26f0 +#define R200_SE_VTX_STATE_CNTL 0x2180 +#define R200_RE_POINTSIZE 0x2648 +#define R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0 0x2254 + + +#define SE_VAP_CNTL__TCL_ENA_MASK 0x00000001 +#define SE_VAP_CNTL__FORCE_W_TO_ONE_MASK 0x00010000 +#define SE_VAP_CNTL__VF_MAX_VTX_NUM__SHIFT 0x00000012 +#define SE_VTE_CNTL__VTX_XY_FMT_MASK 0x00000100 +#define SE_VTE_CNTL__VTX_Z_FMT_MASK 0x00000200 +#define SE_VTX_FMT_0__VTX_Z0_PRESENT_MASK 0x00000001 +#define SE_VTX_FMT_0__VTX_W0_PRESENT_MASK 0x00000002 +#define SE_VTX_FMT_0__VTX_COLOR_0_FMT__SHIFT 0x0000000b +#define R200_3D_DRAW_IMMD_2 0xC0003500 +#define R200_SE_VTX_FMT_1 0x208c +#define R200_RE_CNTL 0x1c50 + /* Constants */ #define RADEON_MAX_USEC_TIMEOUT 100000 /* 100 ms */ @@ -515,6 +693,7 @@ #define RADEON_LAST_FRAME_REG RADEON_SCRATCH_REG0 #define RADEON_LAST_DISPATCH_REG RADEON_SCRATCH_REG1 #define RADEON_LAST_CLEAR_REG RADEON_SCRATCH_REG2 +#define RADEON_LAST_SWI_REG RADEON_SCRATCH_REG3 #define RADEON_LAST_DISPATCH 1 #define RADEON_MAX_VB_AGE 0x7fffffff @@ -526,41 +705,11 @@ #define RADEON_BASE(reg) ((unsigned long)(dev_priv->mmio->handle)) #define RADEON_ADDR(reg) (RADEON_BASE( reg ) + reg) -#define RADEON_DEREF(reg) *(volatile u32 *)RADEON_ADDR( reg ) -#ifdef __alpha__ -#define RADEON_READ(reg) (_RADEON_READ((u32 *)RADEON_ADDR( reg ))) -static inline u32 _RADEON_READ(u32 *addr) -{ - mb(); - return *(volatile u32 *)addr; -} -#define RADEON_WRITE(reg,val) \ -do { \ - wmb(); \ - RADEON_DEREF(reg) = val; \ -} while (0) -#else -#define RADEON_READ(reg) RADEON_DEREF( reg ) -#define RADEON_WRITE(reg, val) do { RADEON_DEREF( reg ) = val; } while (0) -#endif +#define RADEON_READ(reg) readl( (volatile u32 *) RADEON_ADDR(reg) ) +#define RADEON_WRITE(reg,val) writel( (val), (volatile u32 *) RADEON_ADDR(reg)) -#define RADEON_DEREF8(reg) *(volatile u8 *)RADEON_ADDR( reg ) -#ifdef __alpha__ -#define RADEON_READ8(reg) _RADEON_READ8((u8 *)RADEON_ADDR( reg )) -static inline u8 _RADEON_READ8(u8 *addr) -{ - mb(); - return *(volatile u8 *)addr; -} -#define RADEON_WRITE8(reg,val) \ -do { \ - wmb(); \ - RADEON_DEREF8( reg ) = val; \ -} while (0) -#else -#define RADEON_READ8(reg) RADEON_DEREF8( reg ) -#define RADEON_WRITE8(reg, val) do { RADEON_DEREF8( reg ) = val; } while (0) -#endif +#define RADEON_READ8(reg) readb( (volatile u8 *) RADEON_ADDR(reg) ) +#define RADEON_WRITE8(reg,val) writeb( (val), (volatile u8 *) RADEON_ADDR(reg)) #define RADEON_WRITE_PLL( addr, val ) \ do { \ @@ -647,20 +796,16 @@ } \ } while (0) + +/* Perfbox functionality only. + */ #define RING_SPACE_TEST_WITH_RETURN( dev_priv ) \ do { \ - drm_radeon_ring_buffer_t *ring = &dev_priv->ring; int i; \ - if ( ring->space < ring->high_mark ) { \ - for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { \ - radeon_update_ring_snapshot( ring ); \ - if ( ring->space >= ring->high_mark ) \ - goto __ring_space_done; \ - udelay( 1 ); \ - } \ - DRM_ERROR( "ring space check failed!\n" ); \ - return -EBUSY; \ + if (!(dev_priv->stats.boxes & RADEON_BOX_DMA_IDLE)) { \ + u32 head = GET_RING_HEAD(&dev_priv->ring); \ + if (head == dev_priv->ring.tail) \ + dev_priv->stats.boxes |= RADEON_BOX_DMA_IDLE; \ } \ - __ring_space_done: ; \ } while (0) #define VB_AGE_TEST_WITH_RETURN( dev_priv ) \ @@ -668,7 +813,7 @@ drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; \ if ( sarea_priv->last_dispatch >= RADEON_MAX_VB_AGE ) { \ int __ret = radeon_do_cp_idle( dev_priv ); \ - if ( __ret < 0 ) return __ret; \ + if ( __ret ) return __ret; \ sarea_priv->last_dispatch = 0; \ radeon_freelist_reset( dev ); \ } \ @@ -694,12 +839,17 @@ * Ring control */ -#define radeon_flush_write_combine() mb() +#if defined(__powerpc__) +#define radeon_flush_write_combine() (void) GET_RING_HEAD( &dev_priv->ring ) +#else +#define radeon_flush_write_combine() wmb() +#warning PCI posting bug +#endif #define RADEON_VERBOSE 0 -#define RING_LOCALS int write; unsigned int mask; volatile u32 *ring; +#define RING_LOCALS int write, _nr; unsigned int mask; u32 *ring; #define BEGIN_RING( n ) do { \ if ( RADEON_VERBOSE ) { \ @@ -707,9 +857,10 @@ n, __FUNCTION__ ); \ } \ if ( dev_priv->ring.space <= (n) * sizeof(u32) ) { \ + COMMIT_RING(); \ radeon_wait_ring( dev_priv, (n) * sizeof(u32) ); \ } \ - dev_priv->ring.space -= (n) * sizeof(u32); \ + _nr = n; dev_priv->ring.space -= (n) * sizeof(u32); \ ring = dev_priv->ring.start; \ write = dev_priv->ring.tail; \ mask = dev_priv->ring.tail_mask; \ @@ -720,9 +871,22 @@ DRM_INFO( "ADVANCE_RING() wr=0x%06x tail=0x%06x\n", \ write, dev_priv->ring.tail ); \ } \ - radeon_flush_write_combine(); \ - dev_priv->ring.tail = write; \ - RADEON_WRITE( RADEON_CP_RB_WPTR, write ); \ + if (((dev_priv->ring.tail + _nr) & mask) != write) { \ + DRM_ERROR( \ + "ADVANCE_RING(): mismatch: nr: %x write: %x line: %d\n", \ + ((dev_priv->ring.tail + _nr) & mask), \ + write, __LINE__); \ + } else \ + dev_priv->ring.tail = write; \ +} while (0) + +#define COMMIT_RING() do { \ + /* Flush writes to ring */ \ + rmb(); \ + GET_RING_HEAD( &dev_priv->ring ); \ + RADEON_WRITE( RADEON_CP_RB_WPTR, dev_priv->ring.tail ); \ + /* read from PCI bus to ensure correct posting */ \ + RADEON_READ( RADEON_CP_RB_RPTR ); \ } while (0) #define OUT_RING( x ) do { \ @@ -734,6 +898,33 @@ write &= mask; \ } while (0) -#define RADEON_PERFORMANCE_BOXES 0 +#define OUT_RING_REG( reg, val ) do { \ + OUT_RING( CP_PACKET0( reg, 0 ) ); \ + OUT_RING( val ); \ +} while (0) + + +#define OUT_RING_USER_TABLE( tab, sz ) do { \ + int _size = (sz); \ + int *_tab = (tab); \ + \ + if (write + _size > mask) { \ + int i = (mask+1) - write; \ + if (__copy_from_user( (int *)(ring+write), \ + _tab, i*4 )) \ + return -EFAULT; \ + write = 0; \ + _size -= i; \ + _tab += i; \ + } \ + \ + if (_size && __copy_from_user( (int *)(ring+write), \ + _tab, _size*4 )) \ + return -EFAULT; \ + \ + write += _size; \ + write &= mask; \ +} while (0) + #endif /* __RADEON_DRV_H__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/radeon_irq.c linux-2.4.23-pre8/drivers/char/drm/radeon_irq.c --- linux-2.4.22/drivers/char/drm/radeon_irq.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/radeon_irq.c 2003-10-22 22:49:06.000000000 +0000 @@ -0,0 +1,258 @@ +/* radeon_irq.c -- IRQ handling for radeon -*- linux-c -*- + * + * Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. + * + * The Weather Channel (TM) funded Tungsten Graphics to develop the + * initial release of the Radeon 8500 driver under the XFree86 license. + * This notice must be preserved. + * + * 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 + * 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 NONINFRINGEMENT. IN NO EVENT SHALL + * PRECISION INSIGHT AND/OR ITS 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. + * + * Authors: + * Keith Whitwell + * Michel Dänzer + */ + +#include "radeon.h" +#include "drmP.h" +#include "drm.h" +#include "radeon_drm.h" +#include "radeon_drv.h" +#include "drm_os_linux.h" + +/* Interrupts - Used for device synchronization and flushing in the + * following circumstances: + * + * - Exclusive FB access with hw idle: + * - Wait for GUI Idle (?) interrupt, then do normal flush. + * + * - Frame throttling, NV_fence: + * - Drop marker irq's into command stream ahead of time. + * - Wait on irq's with lock *not held* + * - Check each for termination condition + * + * - Internally in cp_getbuffer, etc: + * - as above, but wait with lock held??? + * + * NOTE: These functions are misleadingly named -- the irq's aren't + * tied to dma at all, this is just a hangover from dri prehistory. + */ + +void DRM(dma_service)(int irq, void *arg, struct pt_regs *reg) +{ + drm_device_t *dev = (drm_device_t *) arg; + drm_radeon_private_t *dev_priv = + (drm_radeon_private_t *)dev->dev_private; + u32 stat; + + stat = RADEON_READ(RADEON_GEN_INT_STATUS) + & (RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT); + if (!stat) + return; + + /* SW interrupt */ + if (stat & RADEON_SW_INT_TEST) { + wake_up_interruptible( &dev_priv->swi_queue ); + } + + /* VBLANK interrupt */ + if (stat & RADEON_CRTC_VBLANK_STAT) { + atomic_inc(&dev->vbl_received); + wake_up_interruptible(&dev->vbl_queue); + DRM(vbl_send_signals)(dev); + } + + /* Acknowledge all the bits in GEN_INT_STATUS -- seem to get + * more than we asked for... + */ + RADEON_WRITE(RADEON_GEN_INT_STATUS, stat); +} + +static __inline__ void radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv) +{ + u32 tmp = RADEON_READ( RADEON_GEN_INT_STATUS ) + & (RADEON_SW_INT_TEST_ACK | RADEON_CRTC_VBLANK_STAT); + if (tmp) + RADEON_WRITE( RADEON_GEN_INT_STATUS, tmp ); +} + +int radeon_emit_irq(drm_device_t *dev) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + unsigned int ret; + RING_LOCALS; + + atomic_inc(&dev_priv->swi_emitted); + ret = atomic_read(&dev_priv->swi_emitted); + + BEGIN_RING( 4 ); + OUT_RING_REG( RADEON_LAST_SWI_REG, ret ); + OUT_RING_REG( RADEON_GEN_INT_STATUS, RADEON_SW_INT_FIRE ); + ADVANCE_RING(); + COMMIT_RING(); + + return ret; +} + + +int radeon_wait_irq(drm_device_t *dev, int swi_nr) +{ + drm_radeon_private_t *dev_priv = + (drm_radeon_private_t *)dev->dev_private; + int ret = 0; + + if (RADEON_READ( RADEON_LAST_SWI_REG ) >= swi_nr) + return 0; + + dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; + + /* This is a hack to work around mysterious freezes on certain + * systems: + */ + radeon_acknowledge_irqs( dev_priv ); + + DRM_WAIT_ON( ret, dev_priv->swi_queue, 3 * HZ, + RADEON_READ( RADEON_LAST_SWI_REG ) >= swi_nr ); + + return ret; +} + +int radeon_emit_and_wait_irq(drm_device_t *dev) +{ + return radeon_wait_irq( dev, radeon_emit_irq(dev) ); +} + + +int DRM(vblank_wait)(drm_device_t *dev, unsigned int *sequence) +{ + drm_radeon_private_t *dev_priv = + (drm_radeon_private_t *)dev->dev_private; + unsigned int cur_vblank; + int ret = 0; + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + radeon_acknowledge_irqs( dev_priv ); + + dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; + + /* Assume that the user has missed the current sequence number + * by about a day rather than she wants to wait for years + * using vertical blanks... + */ + DRM_WAIT_ON( ret, dev->vbl_queue, 3*HZ, + ( ( ( cur_vblank = atomic_read(&dev->vbl_received ) ) + - *sequence ) <= (1<<23) ) ); + + *sequence = cur_vblank; + + return ret; +} + + +/* Needs the lock as it touches the ring. + */ +int radeon_irq_emit(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_irq_emit_t emit; + int result; + + LOCK_TEST_WITH_RETURN( dev ); + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + DRM_COPY_FROM_USER_IOCTL( emit, (drm_radeon_irq_emit_t *)data, + sizeof(emit) ); + + result = radeon_emit_irq( dev ); + + if ( copy_to_user( emit.irq_seq, &result, sizeof(int) ) ) { + DRM_ERROR( "copy_to_user\n" ); + return -EFAULT; + } + + return 0; +} + + +/* Doesn't need the hardware lock. + */ +int radeon_irq_wait(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_irq_wait_t irqwait; + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + DRM_COPY_FROM_USER_IOCTL( irqwait, (drm_radeon_irq_wait_t *)data, + sizeof(irqwait) ); + + return radeon_wait_irq( dev, irqwait.irq_seq ); +} + + +/* drm_dma.h hooks +*/ +void DRM(driver_irq_preinstall)( drm_device_t *dev ) { + drm_radeon_private_t *dev_priv = + (drm_radeon_private_t *)dev->dev_private; + + /* Disable *all* interrupts */ + RADEON_WRITE( RADEON_GEN_INT_CNTL, 0 ); + + /* Clear bits if they're already high */ + radeon_acknowledge_irqs( dev_priv ); +} + +void DRM(driver_irq_postinstall)( drm_device_t *dev ) { + drm_radeon_private_t *dev_priv = + (drm_radeon_private_t *)dev->dev_private; + + atomic_set(&dev_priv->swi_emitted, 0); + init_waitqueue_head( &dev_priv->swi_queue ); + + /* Turn on SW and VBL ints */ + RADEON_WRITE( RADEON_GEN_INT_CNTL, + RADEON_CRTC_VBLANK_MASK | + RADEON_SW_INT_ENABLE ); +} + +void DRM(driver_irq_uninstall)( drm_device_t *dev ) { + drm_radeon_private_t *dev_priv = + (drm_radeon_private_t *)dev->dev_private; + if ( dev_priv ) { + /* Disable *all* interrupts */ + RADEON_WRITE( RADEON_GEN_INT_CNTL, 0 ); + } +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/radeon_mem.c linux-2.4.23-pre8/drivers/char/drm/radeon_mem.c --- linux-2.4.22/drivers/char/drm/radeon_mem.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/radeon_mem.c 2003-10-22 22:49:53.000000000 +0000 @@ -0,0 +1,338 @@ +/* radeon_mem.c -- Simple agp/fb memory manager for radeon -*- linux-c -*- + * + * Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. + * + * The Weather Channel (TM) funded Tungsten Graphics to develop the + * initial release of the Radeon 8500 driver under the XFree86 license. + * This notice must be preserved. + * + * 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 + * 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 NONINFRINGEMENT. IN NO EVENT SHALL + * PRECISION INSIGHT AND/OR ITS 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. + * + * Authors: + * Keith Whitwell + */ + +#include "radeon.h" +#include "drmP.h" +#include "drm.h" +#include "radeon_drm.h" +#include "radeon_drv.h" +#include "drm_os_linux.h" + +/* Very simple allocator for agp memory, working on a static range + * already mapped into each client's address space. + */ + +static struct mem_block *split_block(struct mem_block *p, int start, int size, + int pid ) +{ + /* Maybe cut off the start of an existing block */ + if (start > p->start) { + struct mem_block *newblock = kmalloc(sizeof(*newblock), GFP_KERNEL); + if (!newblock) + goto out; + newblock->start = start; + newblock->size = p->size - (start - p->start); + newblock->pid = 0; + newblock->next = p->next; + newblock->prev = p; + p->next->prev = newblock; + p->next = newblock; + p->size -= newblock->size; + p = newblock; + } + + /* Maybe cut off the end of an existing block */ + if (size < p->size) { + struct mem_block *newblock = kmalloc(sizeof(*newblock), GFP_KERNEL); + if (!newblock) + goto out; + newblock->start = start + size; + newblock->size = p->size - size; + newblock->pid = 0; + newblock->next = p->next; + newblock->prev = p; + p->next->prev = newblock; + p->next = newblock; + p->size = size; + } + + out: + /* Our block is in the middle */ + p->pid = pid; + return p; +} + +static struct mem_block *alloc_block( struct mem_block *heap, int size, + int align2, int pid ) +{ + struct mem_block *p; + int mask = (1 << align2)-1; + + for (p = heap->next ; p != heap ; p = p->next) { + int start = (p->start + mask) & ~mask; + if (p->pid == 0 && start + size <= p->start + p->size) + return split_block( p, start, size, pid ); + } + + return NULL; +} + +static struct mem_block *find_block( struct mem_block *heap, int start ) +{ + struct mem_block *p; + + for (p = heap->next ; p != heap ; p = p->next) + if (p->start == start) + return p; + + return NULL; +} + + +static void free_block( struct mem_block *p ) +{ + p->pid = 0; + + /* Assumes a single contiguous range. Needs a special pid in + * 'heap' to stop it being subsumed. + */ + if (p->next->pid == 0) { + struct mem_block *q = p->next; + p->size += q->size; + p->next = q->next; + p->next->prev = p; + kfree(q); + } + + if (p->prev->pid == 0) { + struct mem_block *q = p->prev; + q->size += p->size; + q->next = p->next; + q->next->prev = q; + kfree(p); + } +} + +static void print_heap( struct mem_block *heap ) +{ + struct mem_block *p; + + for (p = heap->next ; p != heap ; p = p->next) + DRM_DEBUG("0x%x..0x%x (0x%x) -- owner %d\n", + p->start, p->start + p->size, + p->size, p->pid); +} + +/* Initialize. How to check for an uninitialized heap? + */ +static int init_heap(struct mem_block **heap, int start, int size) +{ + struct mem_block *blocks = kmalloc(sizeof(*blocks), GFP_KERNEL); + + if (!blocks) + return -ENOMEM; + + *heap = kmalloc(sizeof(**heap), GFP_KERNEL); + if (!*heap) { + kfree( blocks ); + return -ENOMEM; + } + + blocks->start = start; + blocks->size = size; + blocks->pid = 0; + blocks->next = blocks->prev = *heap; + + memset( *heap, 0, sizeof(**heap) ); + (*heap)->pid = -1; + (*heap)->next = (*heap)->prev = blocks; + return 0; +} + + +/* Free all blocks associated with the releasing pid. + */ +void radeon_mem_release( struct mem_block *heap ) +{ + int pid = current->pid; + struct mem_block *p; + + if (!heap || !heap->next) + return; + + for (p = heap->next ; p != heap ; p = p->next) { + if (p->pid == pid) + p->pid = 0; + } + + /* Assumes a single contiguous range. Needs a special pid in + * 'heap' to stop it being subsumed. + */ + for (p = heap->next ; p != heap ; p = p->next) { + while (p->pid == 0 && p->next->pid == 0) { + struct mem_block *q = p->next; + p->size += q->size; + p->next = q->next; + p->next->prev = p; + kfree(q); + } + } +} + +/* Shutdown. + */ +void radeon_mem_takedown( struct mem_block **heap ) +{ + struct mem_block *p; + + if (!*heap) + return; + + for (p = (*heap)->next ; p != *heap ; ) { + struct mem_block *q = p; + p = p->next; + kfree(q); + } + + kfree( *heap ); + *heap = 0; +} + + + +/* IOCTL HANDLERS */ + +static struct mem_block **get_heap( drm_radeon_private_t *dev_priv, + int region ) +{ + switch( region ) { + case RADEON_MEM_REGION_AGP: + return &dev_priv->agp_heap; + case RADEON_MEM_REGION_FB: + return &dev_priv->fb_heap; + default: + return 0; + } +} + +int radeon_mem_alloc(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_mem_alloc_t alloc; + struct mem_block *block, **heap; + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + DRM_COPY_FROM_USER_IOCTL( alloc, (drm_radeon_mem_alloc_t *)data, + sizeof(alloc) ); + + heap = get_heap( dev_priv, alloc.region ); + if (!heap || !*heap) + return -EFAULT; + + /* Make things easier on ourselves: all allocations at least + * 4k aligned. + */ + if (alloc.alignment < 12) + alloc.alignment = 12; + + block = alloc_block( *heap, alloc.size, alloc.alignment, + current->pid ); + + if (!block) + return -ENOMEM; + + if ( copy_to_user( alloc.region_offset, &block->start, + sizeof(int) ) ) { + DRM_ERROR( "copy_to_user\n" ); + return -EFAULT; + } + + return 0; +} + + + +int radeon_mem_free(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_mem_free_t memfree; + struct mem_block *block, **heap; + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + DRM_COPY_FROM_USER_IOCTL( memfree, (drm_radeon_mem_free_t *)data, + sizeof(memfree) ); + + heap = get_heap( dev_priv, memfree.region ); + if (!heap || !*heap) + return -EFAULT; + + block = find_block( *heap, memfree.region_offset ); + if (!block) + return -EFAULT; + + if (block->pid != current->pid) + return -EPERM; + + free_block( block ); + return 0; +} + +int radeon_mem_init_heap(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_mem_init_heap_t initheap; + struct mem_block **heap; + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + DRM_COPY_FROM_USER_IOCTL( initheap, (drm_radeon_mem_init_heap_t *)data, + sizeof(initheap) ); + + heap = get_heap( dev_priv, initheap.region ); + if (!heap) + return -EFAULT; + + if (*heap) { + DRM_ERROR("heap already initialized?"); + return -EFAULT; + } + + return init_heap( heap, initheap.start, initheap.size ); +} + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/radeon_state.c linux-2.4.23-pre8/drivers/char/drm/radeon_state.c --- linux-2.4.22/drivers/char/drm/radeon_state.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/radeon_state.c 2003-10-22 22:49:20.000000000 +0000 @@ -29,10 +29,11 @@ #include "radeon.h" #include "drmP.h" -#include "radeon_drv.h" #include "drm.h" -#include - +#include "drm_sarea.h" +#include "radeon_drm.h" +#include "radeon_drv.h" +#include "drm_os_linux.h" /* ================================================================ * CP hardware state programming functions @@ -47,360 +48,254 @@ box->x1, box->y1, box->x2, box->y2 ); BEGIN_RING( 4 ); - OUT_RING( CP_PACKET0( RADEON_RE_TOP_LEFT, 0 ) ); OUT_RING( (box->y1 << 16) | box->x1 ); - OUT_RING( CP_PACKET0( RADEON_RE_WIDTH_HEIGHT, 0 ) ); OUT_RING( ((box->y2 - 1) << 16) | (box->x2 - 1) ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_context( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 14 ); - - OUT_RING( CP_PACKET0( RADEON_PP_MISC, 6 ) ); - OUT_RING( ctx->pp_misc ); - OUT_RING( ctx->pp_fog_color ); - OUT_RING( ctx->re_solid_color ); - OUT_RING( ctx->rb3d_blendcntl ); - OUT_RING( ctx->rb3d_depthoffset ); - OUT_RING( ctx->rb3d_depthpitch ); - OUT_RING( ctx->rb3d_zstencilcntl ); - - OUT_RING( CP_PACKET0( RADEON_PP_CNTL, 2 ) ); - OUT_RING( ctx->pp_cntl ); - OUT_RING( ctx->rb3d_cntl ); - OUT_RING( ctx->rb3d_coloroffset ); - - OUT_RING( CP_PACKET0( RADEON_RB3D_COLORPITCH, 0 ) ); - OUT_RING( ctx->rb3d_colorpitch ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_vertfmt( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 2 ); - - OUT_RING( CP_PACKET0( RADEON_SE_COORD_FMT, 0 ) ); - OUT_RING( ctx->se_coord_fmt ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_line( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 5 ); - - OUT_RING( CP_PACKET0( RADEON_RE_LINE_PATTERN, 1 ) ); - OUT_RING( ctx->re_line_pattern ); - OUT_RING( ctx->re_line_state ); - - OUT_RING( CP_PACKET0( RADEON_SE_LINE_WIDTH, 0 ) ); - OUT_RING( ctx->se_line_width ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_bumpmap( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 5 ); - - OUT_RING( CP_PACKET0( RADEON_PP_LUM_MATRIX, 0 ) ); - OUT_RING( ctx->pp_lum_matrix ); - - OUT_RING( CP_PACKET0( RADEON_PP_ROT_MATRIX_0, 1 ) ); - OUT_RING( ctx->pp_rot_matrix_0 ); - OUT_RING( ctx->pp_rot_matrix_1 ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_masks( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 4 ); - - OUT_RING( CP_PACKET0( RADEON_RB3D_STENCILREFMASK, 2 ) ); - OUT_RING( ctx->rb3d_stencilrefmask ); - OUT_RING( ctx->rb3d_ropcntl ); - OUT_RING( ctx->rb3d_planemask ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_viewport( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 7 ); - - OUT_RING( CP_PACKET0( RADEON_SE_VPORT_XSCALE, 5 ) ); - OUT_RING( ctx->se_vport_xscale ); - OUT_RING( ctx->se_vport_xoffset ); - OUT_RING( ctx->se_vport_yscale ); - OUT_RING( ctx->se_vport_yoffset ); - OUT_RING( ctx->se_vport_zscale ); - OUT_RING( ctx->se_vport_zoffset ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_setup( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 4 ); - - OUT_RING( CP_PACKET0( RADEON_SE_CNTL, 0 ) ); - OUT_RING( ctx->se_cntl ); - OUT_RING( CP_PACKET0( RADEON_SE_CNTL_STATUS, 0 ) ); - OUT_RING( ctx->se_cntl_status ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_tcl( drm_radeon_private_t *dev_priv ) -{ -#ifdef TCL_ENABLE - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 29 ); - - OUT_RING( CP_PACKET0( RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED, 27 ) ); - OUT_RING( ctx->se_tcl_material_emmissive.red ); - OUT_RING( ctx->se_tcl_material_emmissive.green ); - OUT_RING( ctx->se_tcl_material_emmissive.blue ); - OUT_RING( ctx->se_tcl_material_emmissive.alpha ); - OUT_RING( ctx->se_tcl_material_ambient.red ); - OUT_RING( ctx->se_tcl_material_ambient.green ); - OUT_RING( ctx->se_tcl_material_ambient.blue ); - OUT_RING( ctx->se_tcl_material_ambient.alpha ); - OUT_RING( ctx->se_tcl_material_diffuse.red ); - OUT_RING( ctx->se_tcl_material_diffuse.green ); - OUT_RING( ctx->se_tcl_material_diffuse.blue ); - OUT_RING( ctx->se_tcl_material_diffuse.alpha ); - OUT_RING( ctx->se_tcl_material_specular.red ); - OUT_RING( ctx->se_tcl_material_specular.green ); - OUT_RING( ctx->se_tcl_material_specular.blue ); - OUT_RING( ctx->se_tcl_material_specular.alpha ); - OUT_RING( ctx->se_tcl_shininess ); - OUT_RING( ctx->se_tcl_output_vtx_fmt ); - OUT_RING( ctx->se_tcl_output_vtx_sel ); - OUT_RING( ctx->se_tcl_matrix_select_0 ); - OUT_RING( ctx->se_tcl_matrix_select_1 ); - OUT_RING( ctx->se_tcl_ucp_vert_blend_ctl ); - OUT_RING( ctx->se_tcl_texture_proc_ctl ); - OUT_RING( ctx->se_tcl_light_model_ctl ); - for ( i = 0 ; i < 4 ; i++ ) { - OUT_RING( ctx->se_tcl_per_light_ctl[i] ); - } - ADVANCE_RING(); -#else - DRM_ERROR( "TCL not enabled!\n" ); -#endif } -static inline void radeon_emit_misc( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_context_regs_t *ctx = &sarea_priv->context_state; - RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 2 ); - - OUT_RING( CP_PACKET0( RADEON_RE_MISC, 0 ) ); - OUT_RING( ctx->re_misc ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_tex0( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_texture_regs_t *tex = &sarea_priv->tex_state[0]; - RING_LOCALS; - DRM_DEBUG( " %s: offset=0x%x\n", __FUNCTION__, tex->pp_txoffset ); - - BEGIN_RING( 9 ); - - OUT_RING( CP_PACKET0( RADEON_PP_TXFILTER_0, 5 ) ); - OUT_RING( tex->pp_txfilter ); - OUT_RING( tex->pp_txformat ); - OUT_RING( tex->pp_txoffset ); - OUT_RING( tex->pp_txcblend ); - OUT_RING( tex->pp_txablend ); - OUT_RING( tex->pp_tfactor ); - - OUT_RING( CP_PACKET0( RADEON_PP_BORDER_COLOR_0, 0 ) ); - OUT_RING( tex->pp_border_color ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_tex1( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_texture_regs_t *tex = &sarea_priv->tex_state[1]; - RING_LOCALS; - DRM_DEBUG( " %s: offset=0x%x\n", __FUNCTION__, tex->pp_txoffset ); - - BEGIN_RING( 9 ); - - OUT_RING( CP_PACKET0( RADEON_PP_TXFILTER_1, 5 ) ); - OUT_RING( tex->pp_txfilter ); - OUT_RING( tex->pp_txformat ); - OUT_RING( tex->pp_txoffset ); - OUT_RING( tex->pp_txcblend ); - OUT_RING( tex->pp_txablend ); - OUT_RING( tex->pp_tfactor ); - - OUT_RING( CP_PACKET0( RADEON_PP_BORDER_COLOR_1, 0 ) ); - OUT_RING( tex->pp_border_color ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_tex2( drm_radeon_private_t *dev_priv ) +/* Emit 1.1 state + */ +static void radeon_emit_state( drm_radeon_private_t *dev_priv, + drm_radeon_context_regs_t *ctx, + drm_radeon_texture_regs_t *tex, + unsigned int dirty ) { - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_texture_regs_t *tex = &sarea_priv->tex_state[2]; RING_LOCALS; - DRM_DEBUG( " %s\n", __FUNCTION__ ); - - BEGIN_RING( 9 ); - - OUT_RING( CP_PACKET0( RADEON_PP_TXFILTER_2, 5 ) ); - OUT_RING( tex->pp_txfilter ); - OUT_RING( tex->pp_txformat ); - OUT_RING( tex->pp_txoffset ); - OUT_RING( tex->pp_txcblend ); - OUT_RING( tex->pp_txablend ); - OUT_RING( tex->pp_tfactor ); - - OUT_RING( CP_PACKET0( RADEON_PP_BORDER_COLOR_2, 0 ) ); - OUT_RING( tex->pp_border_color ); - - ADVANCE_RING(); -} - -static inline void radeon_emit_state( drm_radeon_private_t *dev_priv ) -{ - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - unsigned int dirty = sarea_priv->dirty; - - DRM_DEBUG( "%s: dirty=0x%08x\n", __FUNCTION__, dirty ); + DRM_DEBUG( "dirty=0x%08x\n", dirty ); if ( dirty & RADEON_UPLOAD_CONTEXT ) { - radeon_emit_context( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_CONTEXT; + BEGIN_RING( 14 ); + OUT_RING( CP_PACKET0( RADEON_PP_MISC, 6 ) ); + OUT_RING( ctx->pp_misc ); + OUT_RING( ctx->pp_fog_color ); + OUT_RING( ctx->re_solid_color ); + OUT_RING( ctx->rb3d_blendcntl ); + OUT_RING( ctx->rb3d_depthoffset ); + OUT_RING( ctx->rb3d_depthpitch ); + OUT_RING( ctx->rb3d_zstencilcntl ); + OUT_RING( CP_PACKET0( RADEON_PP_CNTL, 2 ) ); + OUT_RING( ctx->pp_cntl ); + OUT_RING( ctx->rb3d_cntl ); + OUT_RING( ctx->rb3d_coloroffset ); + OUT_RING( CP_PACKET0( RADEON_RB3D_COLORPITCH, 0 ) ); + OUT_RING( ctx->rb3d_colorpitch ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_VERTFMT ) { - radeon_emit_vertfmt( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_VERTFMT; + BEGIN_RING( 2 ); + OUT_RING( CP_PACKET0( RADEON_SE_COORD_FMT, 0 ) ); + OUT_RING( ctx->se_coord_fmt ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_LINE ) { - radeon_emit_line( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_LINE; + BEGIN_RING( 5 ); + OUT_RING( CP_PACKET0( RADEON_RE_LINE_PATTERN, 1 ) ); + OUT_RING( ctx->re_line_pattern ); + OUT_RING( ctx->re_line_state ); + OUT_RING( CP_PACKET0( RADEON_SE_LINE_WIDTH, 0 ) ); + OUT_RING( ctx->se_line_width ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_BUMPMAP ) { - radeon_emit_bumpmap( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_BUMPMAP; + BEGIN_RING( 5 ); + OUT_RING( CP_PACKET0( RADEON_PP_LUM_MATRIX, 0 ) ); + OUT_RING( ctx->pp_lum_matrix ); + OUT_RING( CP_PACKET0( RADEON_PP_ROT_MATRIX_0, 1 ) ); + OUT_RING( ctx->pp_rot_matrix_0 ); + OUT_RING( ctx->pp_rot_matrix_1 ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_MASKS ) { - radeon_emit_masks( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_MASKS; + BEGIN_RING( 4 ); + OUT_RING( CP_PACKET0( RADEON_RB3D_STENCILREFMASK, 2 ) ); + OUT_RING( ctx->rb3d_stencilrefmask ); + OUT_RING( ctx->rb3d_ropcntl ); + OUT_RING( ctx->rb3d_planemask ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_VIEWPORT ) { - radeon_emit_viewport( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_VIEWPORT; + BEGIN_RING( 7 ); + OUT_RING( CP_PACKET0( RADEON_SE_VPORT_XSCALE, 5 ) ); + OUT_RING( ctx->se_vport_xscale ); + OUT_RING( ctx->se_vport_xoffset ); + OUT_RING( ctx->se_vport_yscale ); + OUT_RING( ctx->se_vport_yoffset ); + OUT_RING( ctx->se_vport_zscale ); + OUT_RING( ctx->se_vport_zoffset ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_SETUP ) { - radeon_emit_setup( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_SETUP; - } - - if ( dirty & RADEON_UPLOAD_TCL ) { -#ifdef TCL_ENABLE - radeon_emit_tcl( dev_priv ); -#endif - sarea_priv->dirty &= ~RADEON_UPLOAD_TCL; + BEGIN_RING( 4 ); + OUT_RING( CP_PACKET0( RADEON_SE_CNTL, 0 ) ); + OUT_RING( ctx->se_cntl ); + OUT_RING( CP_PACKET0( RADEON_SE_CNTL_STATUS, 0 ) ); + OUT_RING( ctx->se_cntl_status ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_MISC ) { - radeon_emit_misc( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_MISC; + BEGIN_RING( 2 ); + OUT_RING( CP_PACKET0( RADEON_RE_MISC, 0 ) ); + OUT_RING( ctx->re_misc ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_TEX0 ) { - radeon_emit_tex0( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_TEX0; + BEGIN_RING( 9 ); + OUT_RING( CP_PACKET0( RADEON_PP_TXFILTER_0, 5 ) ); + OUT_RING( tex[0].pp_txfilter ); + OUT_RING( tex[0].pp_txformat ); + OUT_RING( tex[0].pp_txoffset ); + OUT_RING( tex[0].pp_txcblend ); + OUT_RING( tex[0].pp_txablend ); + OUT_RING( tex[0].pp_tfactor ); + OUT_RING( CP_PACKET0( RADEON_PP_BORDER_COLOR_0, 0 ) ); + OUT_RING( tex[0].pp_border_color ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_TEX1 ) { - radeon_emit_tex1( dev_priv ); - sarea_priv->dirty &= ~RADEON_UPLOAD_TEX1; + BEGIN_RING( 9 ); + OUT_RING( CP_PACKET0( RADEON_PP_TXFILTER_1, 5 ) ); + OUT_RING( tex[1].pp_txfilter ); + OUT_RING( tex[1].pp_txformat ); + OUT_RING( tex[1].pp_txoffset ); + OUT_RING( tex[1].pp_txcblend ); + OUT_RING( tex[1].pp_txablend ); + OUT_RING( tex[1].pp_tfactor ); + OUT_RING( CP_PACKET0( RADEON_PP_BORDER_COLOR_1, 0 ) ); + OUT_RING( tex[1].pp_border_color ); + ADVANCE_RING(); } if ( dirty & RADEON_UPLOAD_TEX2 ) { -#if 0 - radeon_emit_tex2( dev_priv ); -#endif - sarea_priv->dirty &= ~RADEON_UPLOAD_TEX2; + BEGIN_RING( 9 ); + OUT_RING( CP_PACKET0( RADEON_PP_TXFILTER_2, 5 ) ); + OUT_RING( tex[2].pp_txfilter ); + OUT_RING( tex[2].pp_txformat ); + OUT_RING( tex[2].pp_txoffset ); + OUT_RING( tex[2].pp_txcblend ); + OUT_RING( tex[2].pp_txablend ); + OUT_RING( tex[2].pp_tfactor ); + OUT_RING( CP_PACKET0( RADEON_PP_BORDER_COLOR_2, 0 ) ); + OUT_RING( tex[2].pp_border_color ); + ADVANCE_RING(); } +} - sarea_priv->dirty &= ~(RADEON_UPLOAD_TEX0IMAGES | - RADEON_UPLOAD_TEX1IMAGES | - RADEON_UPLOAD_TEX2IMAGES | - RADEON_REQUIRE_QUIESCENCE); +/* Emit 1.2 state + */ +static void radeon_emit_state2( drm_radeon_private_t *dev_priv, + drm_radeon_state_t *state ) +{ + RING_LOCALS; + + if (state->dirty & RADEON_UPLOAD_ZBIAS) { + BEGIN_RING( 3 ); + OUT_RING( CP_PACKET0( RADEON_SE_ZBIAS_FACTOR, 1 ) ); + OUT_RING( state->context2.se_zbias_factor ); + OUT_RING( state->context2.se_zbias_constant ); + ADVANCE_RING(); + } + + radeon_emit_state( dev_priv, &state->context, + state->tex, state->dirty ); } +/* New (1.3) state mechanism. 3 commands (packet, scalar, vector) in + * 1.3 cmdbuffers allow all previous state to be updated as well as + * the tcl scalar and vector areas. + */ +static struct { + int start; + int len; + const char *name; +} packet[RADEON_MAX_STATE_PACKETS] = { + { RADEON_PP_MISC,7,"RADEON_PP_MISC" }, + { RADEON_PP_CNTL,3,"RADEON_PP_CNTL" }, + { RADEON_RB3D_COLORPITCH,1,"RADEON_RB3D_COLORPITCH" }, + { RADEON_RE_LINE_PATTERN,2,"RADEON_RE_LINE_PATTERN" }, + { RADEON_SE_LINE_WIDTH,1,"RADEON_SE_LINE_WIDTH" }, + { RADEON_PP_LUM_MATRIX,1,"RADEON_PP_LUM_MATRIX" }, + { RADEON_PP_ROT_MATRIX_0,2,"RADEON_PP_ROT_MATRIX_0" }, + { RADEON_RB3D_STENCILREFMASK,3,"RADEON_RB3D_STENCILREFMASK" }, + { RADEON_SE_VPORT_XSCALE,6,"RADEON_SE_VPORT_XSCALE" }, + { RADEON_SE_CNTL,2,"RADEON_SE_CNTL" }, + { RADEON_SE_CNTL_STATUS,1,"RADEON_SE_CNTL_STATUS" }, + { RADEON_RE_MISC,1,"RADEON_RE_MISC" }, + { RADEON_PP_TXFILTER_0,6,"RADEON_PP_TXFILTER_0" }, + { RADEON_PP_BORDER_COLOR_0,1,"RADEON_PP_BORDER_COLOR_0" }, + { RADEON_PP_TXFILTER_1,6,"RADEON_PP_TXFILTER_1" }, + { RADEON_PP_BORDER_COLOR_1,1,"RADEON_PP_BORDER_COLOR_1" }, + { RADEON_PP_TXFILTER_2,6,"RADEON_PP_TXFILTER_2" }, + { RADEON_PP_BORDER_COLOR_2,1,"RADEON_PP_BORDER_COLOR_2" }, + { RADEON_SE_ZBIAS_FACTOR,2,"RADEON_SE_ZBIAS_FACTOR" }, + { RADEON_SE_TCL_OUTPUT_VTX_FMT,11,"RADEON_SE_TCL_OUTPUT_VTX_FMT" }, + { RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED,17,"RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED" }, + { R200_PP_TXCBLEND_0, 4, "R200_PP_TXCBLEND_0" }, + { R200_PP_TXCBLEND_1, 4, "R200_PP_TXCBLEND_1" }, + { R200_PP_TXCBLEND_2, 4, "R200_PP_TXCBLEND_2" }, + { R200_PP_TXCBLEND_3, 4, "R200_PP_TXCBLEND_3" }, + { R200_PP_TXCBLEND_4, 4, "R200_PP_TXCBLEND_4" }, + { R200_PP_TXCBLEND_5, 4, "R200_PP_TXCBLEND_5" }, + { R200_PP_TXCBLEND_6, 4, "R200_PP_TXCBLEND_6" }, + { R200_PP_TXCBLEND_7, 4, "R200_PP_TXCBLEND_7" }, + { R200_SE_TCL_LIGHT_MODEL_CTL_0, 6, "R200_SE_TCL_LIGHT_MODEL_CTL_0" }, + { R200_PP_TFACTOR_0, 6, "R200_PP_TFACTOR_0" }, + { R200_SE_VTX_FMT_0, 4, "R200_SE_VTX_FMT_0" }, + { R200_SE_VAP_CNTL, 1, "R200_SE_VAP_CNTL" }, + { R200_SE_TCL_MATRIX_SEL_0, 5, "R200_SE_TCL_MATRIX_SEL_0" }, + { R200_SE_TCL_TEX_PROC_CTL_2, 5, "R200_SE_TCL_TEX_PROC_CTL_2" }, + { R200_SE_TCL_UCP_VERT_BLEND_CTL, 1, "R200_SE_TCL_UCP_VERT_BLEND_CTL" }, + { R200_PP_TXFILTER_0, 6, "R200_PP_TXFILTER_0" }, + { R200_PP_TXFILTER_1, 6, "R200_PP_TXFILTER_1" }, + { R200_PP_TXFILTER_2, 6, "R200_PP_TXFILTER_2" }, + { R200_PP_TXFILTER_3, 6, "R200_PP_TXFILTER_3" }, + { R200_PP_TXFILTER_4, 6, "R200_PP_TXFILTER_4" }, + { R200_PP_TXFILTER_5, 6, "R200_PP_TXFILTER_5" }, + { R200_PP_TXOFFSET_0, 1, "R200_PP_TXOFFSET_0" }, + { R200_PP_TXOFFSET_1, 1, "R200_PP_TXOFFSET_1" }, + { R200_PP_TXOFFSET_2, 1, "R200_PP_TXOFFSET_2" }, + { R200_PP_TXOFFSET_3, 1, "R200_PP_TXOFFSET_3" }, + { R200_PP_TXOFFSET_4, 1, "R200_PP_TXOFFSET_4" }, + { R200_PP_TXOFFSET_5, 1, "R200_PP_TXOFFSET_5" }, + { R200_SE_VTE_CNTL, 1, "R200_SE_VTE_CNTL" }, + { R200_SE_TCL_OUTPUT_VTX_COMP_SEL, 1, "R200_SE_TCL_OUTPUT_VTX_COMP_SEL" }, + { R200_PP_TAM_DEBUG3, 1, "R200_PP_TAM_DEBUG3" }, + { R200_PP_CNTL_X, 1, "R200_PP_CNTL_X" }, + { R200_RB3D_DEPTHXY_OFFSET, 1, "R200_RB3D_DEPTHXY_OFFSET" }, + { R200_RE_AUX_SCISSOR_CNTL, 1, "R200_RE_AUX_SCISSOR_CNTL" }, + { R200_RE_SCISSOR_TL_0, 2, "R200_RE_SCISSOR_TL_0" }, + { R200_RE_SCISSOR_TL_1, 2, "R200_RE_SCISSOR_TL_1" }, + { R200_RE_SCISSOR_TL_2, 2, "R200_RE_SCISSOR_TL_2" }, + { R200_SE_VAP_CNTL_STATUS, 1, "R200_SE_VAP_CNTL_STATUS" }, + { R200_SE_VTX_STATE_CNTL, 1, "R200_SE_VTX_STATE_CNTL" }, + { R200_RE_POINTSIZE, 1, "R200_RE_POINTSIZE" }, + { R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0, 4, "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0" }, + { R200_PP_CUBIC_FACES_0, 1, "R200_PP_CUBIC_FACES_0" }, /* 61 */ + { R200_PP_CUBIC_OFFSET_F1_0, 5, "R200_PP_CUBIC_OFFSET_F1_0" }, /* 62 */ + { R200_PP_CUBIC_FACES_1, 1, "R200_PP_CUBIC_FACES_1" }, + { R200_PP_CUBIC_OFFSET_F1_1, 5, "R200_PP_CUBIC_OFFSET_F1_1" }, + { R200_PP_CUBIC_FACES_2, 1, "R200_PP_CUBIC_FACES_2" }, + { R200_PP_CUBIC_OFFSET_F1_2, 5, "R200_PP_CUBIC_OFFSET_F1_2" }, + { R200_PP_CUBIC_FACES_3, 1, "R200_PP_CUBIC_FACES_3" }, + { R200_PP_CUBIC_OFFSET_F1_3, 5, "R200_PP_CUBIC_OFFSET_F1_3" }, + { R200_PP_CUBIC_FACES_4, 1, "R200_PP_CUBIC_FACES_4" }, + { R200_PP_CUBIC_OFFSET_F1_4, 5, "R200_PP_CUBIC_OFFSET_F1_4" }, + { R200_PP_CUBIC_FACES_5, 1, "R200_PP_CUBIC_FACES_5" }, + { R200_PP_CUBIC_OFFSET_F1_5, 5, "R200_PP_CUBIC_OFFSET_F1_5" }, +}; + + -#if RADEON_PERFORMANCE_BOXES /* ================================================================ * Performance monitoring functions */ @@ -409,10 +304,12 @@ int x, int y, int w, int h, int r, int g, int b ) { - u32 pitch, offset; u32 color; RING_LOCALS; + x += dev_priv->sarea_priv->boxes[0].x1; + y += dev_priv->sarea_priv->boxes[0].y1; + switch ( dev_priv->color_fmt ) { case RADEON_COLOR_FORMAT_RGB565: color = (((r & 0xf8) << 8) | @@ -425,8 +322,11 @@ break; } - offset = dev_priv->back_offset; - pitch = dev_priv->back_pitch >> 3; + BEGIN_RING( 4 ); + RADEON_WAIT_UNTIL_3D_IDLE(); + OUT_RING( CP_PACKET0( RADEON_DP_WRITE_MASK, 0 ) ); + OUT_RING( 0xffffffff ); + ADVANCE_RING(); BEGIN_RING( 6 ); @@ -438,7 +338,12 @@ RADEON_ROP3_P | RADEON_GMC_CLR_CMP_CNTL_DIS ); - OUT_RING( (pitch << 22) | (offset >> 5) ); + if ( dev_priv->page_flipping && dev_priv->current_page == 1 ) { + OUT_RING( dev_priv->front_pitch_offset ); + } else { + OUT_RING( dev_priv->back_pitch_offset ); + } + OUT_RING( color ); OUT_RING( (x << 16) | y ); @@ -449,53 +354,77 @@ static void radeon_cp_performance_boxes( drm_radeon_private_t *dev_priv ) { - if ( atomic_read( &dev_priv->idle_count ) == 0 ) { - radeon_clear_box( dev_priv, 64, 4, 8, 8, 0, 255, 0 ); - } else { - atomic_set( &dev_priv->idle_count, 0 ); + /* Collapse various things into a wait flag -- trying to + * guess if userspase slept -- better just to have them tell us. + */ + if (dev_priv->stats.last_frame_reads > 1 || + dev_priv->stats.last_clear_reads > dev_priv->stats.clears) { + dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; } -} -#endif + if (dev_priv->stats.freelist_loops) { + dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; + } + + /* Purple box for page flipping + */ + if ( dev_priv->stats.boxes & RADEON_BOX_FLIP ) + radeon_clear_box( dev_priv, 4, 4, 8, 8, 255, 0, 255 ); + /* Red box if we have to wait for idle at any point + */ + if ( dev_priv->stats.boxes & RADEON_BOX_WAIT_IDLE ) + radeon_clear_box( dev_priv, 16, 4, 8, 8, 255, 0, 0 ); + /* Blue box: lost context? + */ + + /* Yellow box for texture swaps + */ + if ( dev_priv->stats.boxes & RADEON_BOX_TEXTURE_LOAD ) + radeon_clear_box( dev_priv, 40, 4, 8, 8, 255, 255, 0 ); + + /* Green box if hardware never idles (as far as we can tell) + */ + if ( !(dev_priv->stats.boxes & RADEON_BOX_DMA_IDLE) ) + radeon_clear_box( dev_priv, 64, 4, 8, 8, 0, 255, 0 ); + + + /* Draw bars indicating number of buffers allocated + * (not a great measure, easily confused) + */ + if (dev_priv->stats.requested_bufs) { + if (dev_priv->stats.requested_bufs > 100) + dev_priv->stats.requested_bufs = 100; + + radeon_clear_box( dev_priv, 4, 16, + dev_priv->stats.requested_bufs, 4, + 196, 128, 128 ); + } + + memset( &dev_priv->stats, 0, sizeof(dev_priv->stats) ); + +} /* ================================================================ * CP command dispatch functions */ -static void radeon_print_dirty( const char *msg, unsigned int flags ) -{ - DRM_DEBUG( "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", - msg, - flags, - (flags & RADEON_UPLOAD_CONTEXT) ? "context, " : "", - (flags & RADEON_UPLOAD_VERTFMT) ? "vertfmt, " : "", - (flags & RADEON_UPLOAD_LINE) ? "line, " : "", - (flags & RADEON_UPLOAD_BUMPMAP) ? "bumpmap, " : "", - (flags & RADEON_UPLOAD_MASKS) ? "masks, " : "", - (flags & RADEON_UPLOAD_VIEWPORT) ? "viewport, " : "", - (flags & RADEON_UPLOAD_SETUP) ? "setup, " : "", - (flags & RADEON_UPLOAD_TCL) ? "tcl, " : "", - (flags & RADEON_UPLOAD_MISC) ? "misc, " : "", - (flags & RADEON_UPLOAD_TEX0) ? "tex0, " : "", - (flags & RADEON_UPLOAD_TEX1) ? "tex1, " : "", - (flags & RADEON_UPLOAD_TEX2) ? "tex2, " : "", - (flags & RADEON_UPLOAD_CLIPRECTS) ? "cliprects, " : "", - (flags & RADEON_REQUIRE_QUIESCENCE) ? "quiescence, " : "" ); -} - static void radeon_cp_dispatch_clear( drm_device_t *dev, drm_radeon_clear_t *clear, drm_radeon_clear_rect_t *depth_boxes ) { drm_radeon_private_t *dev_priv = dev->dev_private; drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_radeon_depth_clear_t *depth_clear = &dev_priv->depth_clear; int nbox = sarea_priv->nbox; drm_clip_rect_t *pbox = sarea_priv->boxes; unsigned int flags = clear->flags; + u32 rb3d_cntl = 0, rb3d_stencilrefmask= 0; int i; RING_LOCALS; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "flags = 0x%x\n", flags ); + + dev_priv->stats.clears++; if ( dev_priv->page_flipping && dev_priv->current_page == 1 ) { unsigned int tmp = flags; @@ -505,127 +434,277 @@ if ( tmp & RADEON_BACK ) flags |= RADEON_FRONT; } - for ( i = 0 ; i < nbox ; i++ ) { - int x = pbox[i].x1; - int y = pbox[i].y1; - int w = pbox[i].x2 - x; - int h = pbox[i].y2 - y; + if ( flags & (RADEON_FRONT | RADEON_BACK) ) { - DRM_DEBUG( "dispatch clear %d,%d-%d,%d flags 0x%x\n", - x, y, w, h, flags ); + BEGIN_RING( 4 ); - if ( flags & (RADEON_FRONT | RADEON_BACK) ) { - BEGIN_RING( 4 ); + /* Ensure the 3D stream is idle before doing a + * 2D fill to clear the front or back buffer. + */ + RADEON_WAIT_UNTIL_3D_IDLE(); + + OUT_RING( CP_PACKET0( RADEON_DP_WRITE_MASK, 0 ) ); + OUT_RING( clear->color_mask ); - /* Ensure the 3D stream is idle before doing a - * 2D fill to clear the front or back buffer. - */ - RADEON_WAIT_UNTIL_3D_IDLE(); + ADVANCE_RING(); - OUT_RING( CP_PACKET0( RADEON_DP_WRITE_MASK, 0 ) ); - OUT_RING( clear->color_mask ); + /* Make sure we restore the 3D state next time. + */ + dev_priv->sarea_priv->ctx_owner = 0; - ADVANCE_RING(); + for ( i = 0 ; i < nbox ; i++ ) { + int x = pbox[i].x1; + int y = pbox[i].y1; + int w = pbox[i].x2 - x; + int h = pbox[i].y2 - y; + + DRM_DEBUG( "dispatch clear %d,%d-%d,%d flags 0x%x\n", + x, y, w, h, flags ); + + if ( flags & RADEON_FRONT ) { + BEGIN_RING( 6 ); + + OUT_RING( CP_PACKET3( RADEON_CNTL_PAINT_MULTI, 4 ) ); + OUT_RING( RADEON_GMC_DST_PITCH_OFFSET_CNTL | + RADEON_GMC_BRUSH_SOLID_COLOR | + (dev_priv->color_fmt << 8) | + RADEON_GMC_SRC_DATATYPE_COLOR | + RADEON_ROP3_P | + RADEON_GMC_CLR_CMP_CNTL_DIS ); + + OUT_RING( dev_priv->front_pitch_offset ); + OUT_RING( clear->clear_color ); + + OUT_RING( (x << 16) | y ); + OUT_RING( (w << 16) | h ); + + ADVANCE_RING(); + } + + if ( flags & RADEON_BACK ) { + BEGIN_RING( 6 ); + + OUT_RING( CP_PACKET3( RADEON_CNTL_PAINT_MULTI, 4 ) ); + OUT_RING( RADEON_GMC_DST_PITCH_OFFSET_CNTL | + RADEON_GMC_BRUSH_SOLID_COLOR | + (dev_priv->color_fmt << 8) | + RADEON_GMC_SRC_DATATYPE_COLOR | + RADEON_ROP3_P | + RADEON_GMC_CLR_CMP_CNTL_DIS ); + + OUT_RING( dev_priv->back_pitch_offset ); + OUT_RING( clear->clear_color ); - /* Make sure we restore the 3D state next time. - */ - dev_priv->sarea_priv->dirty |= (RADEON_UPLOAD_CONTEXT | - RADEON_UPLOAD_MASKS); + OUT_RING( (x << 16) | y ); + OUT_RING( (w << 16) | h ); + + ADVANCE_RING(); + } } + } - if ( flags & RADEON_FRONT ) { - BEGIN_RING( 6 ); + /* We have to clear the depth and/or stencil buffers by + * rendering a quad into just those buffers. Thus, we have to + * make sure the 3D engine is configured correctly. + */ + if ( dev_priv->is_r200 && + (flags & (RADEON_DEPTH | RADEON_STENCIL)) ) { - OUT_RING( CP_PACKET3( RADEON_CNTL_PAINT_MULTI, 4 ) ); - OUT_RING( RADEON_GMC_DST_PITCH_OFFSET_CNTL | - RADEON_GMC_BRUSH_SOLID_COLOR | - (dev_priv->color_fmt << 8) | - RADEON_GMC_SRC_DATATYPE_COLOR | - RADEON_ROP3_P | - RADEON_GMC_CLR_CMP_CNTL_DIS ); + int tempPP_CNTL; + int tempRE_CNTL; + int tempRB3D_CNTL; + int tempRB3D_ZSTENCILCNTL; + int tempRB3D_STENCILREFMASK; + int tempRB3D_PLANEMASK; + int tempSE_CNTL; + int tempSE_VTE_CNTL; + int tempSE_VTX_FMT_0; + int tempSE_VTX_FMT_1; + int tempSE_VAP_CNTL; + int tempRE_AUX_SCISSOR_CNTL; - OUT_RING( dev_priv->front_pitch_offset ); - OUT_RING( clear->clear_color ); + tempPP_CNTL = 0; + tempRE_CNTL = 0; - OUT_RING( (x << 16) | y ); - OUT_RING( (w << 16) | h ); + tempRB3D_CNTL = depth_clear->rb3d_cntl; + tempRB3D_CNTL &= ~(1<<15); /* unset radeon magic flag */ - ADVANCE_RING(); + tempRB3D_ZSTENCILCNTL = depth_clear->rb3d_zstencilcntl; + tempRB3D_STENCILREFMASK = 0x0; + + tempSE_CNTL = depth_clear->se_cntl; + + + + /* Disable TCL */ + + tempSE_VAP_CNTL = (/* SE_VAP_CNTL__FORCE_W_TO_ONE_MASK | */ + (0x9 << SE_VAP_CNTL__VF_MAX_VTX_NUM__SHIFT)); + + tempRB3D_PLANEMASK = 0x0; + + tempRE_AUX_SCISSOR_CNTL = 0x0; + + tempSE_VTE_CNTL = + SE_VTE_CNTL__VTX_XY_FMT_MASK | + SE_VTE_CNTL__VTX_Z_FMT_MASK; + + /* Vertex format (X, Y, Z, W)*/ + tempSE_VTX_FMT_0 = + SE_VTX_FMT_0__VTX_Z0_PRESENT_MASK | + SE_VTX_FMT_0__VTX_W0_PRESENT_MASK; + tempSE_VTX_FMT_1 = 0x0; + + + /* + * Depth buffer specific enables + */ + if (flags & RADEON_DEPTH) { + /* Enable depth buffer */ + tempRB3D_CNTL |= RADEON_Z_ENABLE; + } else { + /* Disable depth buffer */ + tempRB3D_CNTL &= ~RADEON_Z_ENABLE; } - if ( flags & RADEON_BACK ) { - BEGIN_RING( 6 ); + /* + * Stencil buffer specific enables + */ + if ( flags & RADEON_STENCIL ) { + tempRB3D_CNTL |= RADEON_STENCIL_ENABLE; + tempRB3D_STENCILREFMASK = clear->depth_mask; + } else { + tempRB3D_CNTL &= ~RADEON_STENCIL_ENABLE; + tempRB3D_STENCILREFMASK = 0x00000000; + } - OUT_RING( CP_PACKET3( RADEON_CNTL_PAINT_MULTI, 4 ) ); - OUT_RING( RADEON_GMC_DST_PITCH_OFFSET_CNTL | - RADEON_GMC_BRUSH_SOLID_COLOR | - (dev_priv->color_fmt << 8) | - RADEON_GMC_SRC_DATATYPE_COLOR | - RADEON_ROP3_P | - RADEON_GMC_CLR_CMP_CNTL_DIS ); + BEGIN_RING( 26 ); + RADEON_WAIT_UNTIL_2D_IDLE(); - OUT_RING( dev_priv->back_pitch_offset ); - OUT_RING( clear->clear_color ); + OUT_RING_REG( RADEON_PP_CNTL, tempPP_CNTL ); + OUT_RING_REG( R200_RE_CNTL, tempRE_CNTL ); + OUT_RING_REG( RADEON_RB3D_CNTL, tempRB3D_CNTL ); + OUT_RING_REG( RADEON_RB3D_ZSTENCILCNTL, + tempRB3D_ZSTENCILCNTL ); + OUT_RING_REG( RADEON_RB3D_STENCILREFMASK, + tempRB3D_STENCILREFMASK ); + OUT_RING_REG( RADEON_RB3D_PLANEMASK, tempRB3D_PLANEMASK ); + OUT_RING_REG( RADEON_SE_CNTL, tempSE_CNTL ); + OUT_RING_REG( R200_SE_VTE_CNTL, tempSE_VTE_CNTL ); + OUT_RING_REG( R200_SE_VTX_FMT_0, tempSE_VTX_FMT_0 ); + OUT_RING_REG( R200_SE_VTX_FMT_1, tempSE_VTX_FMT_1 ); + OUT_RING_REG( R200_SE_VAP_CNTL, tempSE_VAP_CNTL ); + OUT_RING_REG( R200_RE_AUX_SCISSOR_CNTL, + tempRE_AUX_SCISSOR_CNTL ); + ADVANCE_RING(); - OUT_RING( (x << 16) | y ); - OUT_RING( (w << 16) | h ); + /* Make sure we restore the 3D state next time. + */ + dev_priv->sarea_priv->ctx_owner = 0; - ADVANCE_RING(); + for ( i = 0 ; i < nbox ; i++ ) { + + /* Funny that this should be required -- + * sets top-left? + */ + radeon_emit_clip_rect( dev_priv, + &sarea_priv->boxes[i] ); + BEGIN_RING( 14 ); + OUT_RING( CP_PACKET3( R200_3D_DRAW_IMMD_2, 12 ) ); + OUT_RING( (RADEON_PRIM_TYPE_RECT_LIST | + RADEON_PRIM_WALK_RING | + (3 << RADEON_NUM_VERTICES_SHIFT)) ); + OUT_RING( depth_boxes[i].ui[CLEAR_X1] ); + OUT_RING( depth_boxes[i].ui[CLEAR_Y1] ); + OUT_RING( depth_boxes[i].ui[CLEAR_DEPTH] ); + OUT_RING( 0x3f800000 ); + OUT_RING( depth_boxes[i].ui[CLEAR_X1] ); + OUT_RING( depth_boxes[i].ui[CLEAR_Y2] ); + OUT_RING( depth_boxes[i].ui[CLEAR_DEPTH] ); + OUT_RING( 0x3f800000 ); + OUT_RING( depth_boxes[i].ui[CLEAR_X2] ); + OUT_RING( depth_boxes[i].ui[CLEAR_Y2] ); + OUT_RING( depth_boxes[i].ui[CLEAR_DEPTH] ); + OUT_RING( 0x3f800000 ); + ADVANCE_RING(); } + } + else if ( (flags & (RADEON_DEPTH | RADEON_STENCIL)) ) { + + rb3d_cntl = depth_clear->rb3d_cntl; if ( flags & RADEON_DEPTH ) { - drm_radeon_depth_clear_t *depth_clear = - &dev_priv->depth_clear; + rb3d_cntl |= RADEON_Z_ENABLE; + } else { + rb3d_cntl &= ~RADEON_Z_ENABLE; + } - if ( sarea_priv->dirty & ~RADEON_UPLOAD_CLIPRECTS ) { - radeon_emit_state( dev_priv ); - } + if ( flags & RADEON_STENCIL ) { + rb3d_cntl |= RADEON_STENCIL_ENABLE; + rb3d_stencilrefmask = clear->depth_mask; /* misnamed field */ + } else { + rb3d_cntl &= ~RADEON_STENCIL_ENABLE; + rb3d_stencilrefmask = 0x00000000; + } - /* FIXME: Render a rectangle to clear the depth - * buffer. So much for those "fast Z clears"... - */ - BEGIN_RING( 23 ); + BEGIN_RING( 13 ); + RADEON_WAIT_UNTIL_2D_IDLE(); + + OUT_RING( CP_PACKET0( RADEON_PP_CNTL, 1 ) ); + OUT_RING( 0x00000000 ); + OUT_RING( rb3d_cntl ); + + OUT_RING_REG( RADEON_RB3D_ZSTENCILCNTL, + depth_clear->rb3d_zstencilcntl ); + OUT_RING_REG( RADEON_RB3D_STENCILREFMASK, + rb3d_stencilrefmask ); + OUT_RING_REG( RADEON_RB3D_PLANEMASK, + 0x00000000 ); + OUT_RING_REG( RADEON_SE_CNTL, + depth_clear->se_cntl ); + ADVANCE_RING(); + + /* Make sure we restore the 3D state next time. + */ + dev_priv->sarea_priv->ctx_owner = 0; - RADEON_WAIT_UNTIL_2D_IDLE(); + for ( i = 0 ; i < nbox ; i++ ) { + + /* Funny that this should be required -- + * sets top-left? + */ + radeon_emit_clip_rect( dev_priv, + &sarea_priv->boxes[i] ); - OUT_RING( CP_PACKET0( RADEON_PP_CNTL, 1 ) ); - OUT_RING( 0x00000000 ); - OUT_RING( depth_clear->rb3d_cntl ); - OUT_RING( CP_PACKET0( RADEON_RB3D_ZSTENCILCNTL, 0 ) ); - OUT_RING( depth_clear->rb3d_zstencilcntl ); - OUT_RING( CP_PACKET0( RADEON_RB3D_PLANEMASK, 0 ) ); - OUT_RING( 0x00000000 ); - OUT_RING( CP_PACKET0( RADEON_SE_CNTL, 0 ) ); - OUT_RING( depth_clear->se_cntl ); + BEGIN_RING( 15 ); - OUT_RING( CP_PACKET3( RADEON_3D_DRAW_IMMD, 10 ) ); - OUT_RING( RADEON_VTX_Z_PRESENT ); + OUT_RING( CP_PACKET3( RADEON_3D_DRAW_IMMD, 13 ) ); + OUT_RING( RADEON_VTX_Z_PRESENT | + RADEON_VTX_PKCOLOR_PRESENT); OUT_RING( (RADEON_PRIM_TYPE_RECT_LIST | RADEON_PRIM_WALK_RING | RADEON_MAOS_ENABLE | RADEON_VTX_FMT_RADEON_MODE | (3 << RADEON_NUM_VERTICES_SHIFT)) ); + OUT_RING( depth_boxes[i].ui[CLEAR_X1] ); OUT_RING( depth_boxes[i].ui[CLEAR_Y1] ); OUT_RING( depth_boxes[i].ui[CLEAR_DEPTH] ); + OUT_RING( 0x0 ); OUT_RING( depth_boxes[i].ui[CLEAR_X1] ); OUT_RING( depth_boxes[i].ui[CLEAR_Y2] ); OUT_RING( depth_boxes[i].ui[CLEAR_DEPTH] ); + OUT_RING( 0x0 ); OUT_RING( depth_boxes[i].ui[CLEAR_X2] ); OUT_RING( depth_boxes[i].ui[CLEAR_Y2] ); OUT_RING( depth_boxes[i].ui[CLEAR_DEPTH] ); + OUT_RING( 0x0 ); ADVANCE_RING(); - - /* Make sure we restore the 3D state next time. - */ - dev_priv->sarea_priv->dirty |= (RADEON_UPLOAD_CONTEXT | - RADEON_UPLOAD_SETUP | - RADEON_UPLOAD_MASKS); } } @@ -651,13 +730,13 @@ drm_clip_rect_t *pbox = sarea_priv->boxes; int i; RING_LOCALS; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); -#if RADEON_PERFORMANCE_BOXES /* Do some trivial performance monitoring... */ - radeon_cp_performance_boxes( dev_priv ); -#endif + if (dev_priv->do_boxes) + radeon_cp_performance_boxes( dev_priv ); + /* Wait for the 3D stream to idle before dispatching the bitblt. * This will prevent data corruption between the two streams. @@ -689,9 +768,17 @@ RADEON_DP_SRC_SOURCE_MEMORY | RADEON_GMC_CLR_CMP_CNTL_DIS | RADEON_GMC_WR_MSK_DIS ); - - OUT_RING( dev_priv->back_pitch_offset ); - OUT_RING( dev_priv->front_pitch_offset ); + + /* Make this work even if front & back are flipped: + */ + if (dev_priv->current_page == 0) { + OUT_RING( dev_priv->back_pitch_offset ); + OUT_RING( dev_priv->front_pitch_offset ); + } + else { + OUT_RING( dev_priv->front_pitch_offset ); + OUT_RING( dev_priv->back_pitch_offset ); + } OUT_RING( (x << 16) | y ); OUT_RING( (x << 16) | y ); @@ -717,29 +804,33 @@ static void radeon_cp_dispatch_flip( drm_device_t *dev ) { drm_radeon_private_t *dev_priv = dev->dev_private; - RING_LOCALS; - DRM_DEBUG( "%s: page=%d\n", __FUNCTION__, dev_priv->current_page ); + drm_sarea_t *sarea = (drm_sarea_t *)dev_priv->sarea->handle; + int offset = (dev_priv->current_page == 1) + ? dev_priv->front_offset : dev_priv->back_offset; + RING_LOCALS; + DRM_DEBUG( "%s: page=%d pfCurrentPage=%d\n", + __FUNCTION__, + dev_priv->current_page, + dev_priv->sarea_priv->pfCurrentPage); -#if RADEON_PERFORMANCE_BOXES /* Do some trivial performance monitoring... */ - radeon_cp_performance_boxes( dev_priv ); -#endif + if (dev_priv->do_boxes) { + dev_priv->stats.boxes |= RADEON_BOX_FLIP; + radeon_cp_performance_boxes( dev_priv ); + } + /* Update the frame offsets for both CRTCs + */ BEGIN_RING( 6 ); RADEON_WAIT_UNTIL_3D_IDLE(); - RADEON_WAIT_UNTIL_PAGE_FLIPPED(); - - OUT_RING( CP_PACKET0( RADEON_CRTC_OFFSET, 0 ) ); - - if ( dev_priv->current_page == 0 ) { - OUT_RING( dev_priv->back_offset ); - dev_priv->current_page = 1; - } else { - OUT_RING( dev_priv->front_offset ); - dev_priv->current_page = 0; - } + OUT_RING_REG( RADEON_CRTC_OFFSET, ( ( sarea->frame.y * dev_priv->front_pitch + + sarea->frame.x + * ( dev_priv->color_fmt - 2 ) ) & ~7 ) + + offset ); + OUT_RING_REG( RADEON_CRTC2_OFFSET, dev_priv->sarea_priv->crtc2_base + + offset ); ADVANCE_RING(); @@ -748,6 +839,8 @@ * performing the swapbuffer ioctl. */ dev_priv->sarea_priv->last_frame++; + dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page = + 1 - dev_priv->current_page; BEGIN_RING( 2 ); @@ -756,82 +849,118 @@ ADVANCE_RING(); } +static int bad_prim_vertex_nr( int primitive, int nr ) +{ + switch (primitive & RADEON_PRIM_TYPE_MASK) { + case RADEON_PRIM_TYPE_NONE: + case RADEON_PRIM_TYPE_POINT: + return nr < 1; + case RADEON_PRIM_TYPE_LINE: + return (nr & 1) || nr == 0; + case RADEON_PRIM_TYPE_LINE_STRIP: + return nr < 2; + case RADEON_PRIM_TYPE_TRI_LIST: + case RADEON_PRIM_TYPE_3VRT_POINT_LIST: + case RADEON_PRIM_TYPE_3VRT_LINE_LIST: + case RADEON_PRIM_TYPE_RECT_LIST: + return nr % 3 || nr == 0; + case RADEON_PRIM_TYPE_TRI_FAN: + case RADEON_PRIM_TYPE_TRI_STRIP: + return nr < 3; + default: + return 1; + } +} + + + +typedef struct { + unsigned int start; + unsigned int finish; + unsigned int prim; + unsigned int numverts; + unsigned int offset; + unsigned int vc_format; +} drm_radeon_tcl_prim_t; + static void radeon_cp_dispatch_vertex( drm_device_t *dev, - drm_buf_t *buf ) + drm_buf_t *buf, + drm_radeon_tcl_prim_t *prim, + drm_clip_rect_t *boxes, + int nbox ) + { drm_radeon_private_t *dev_priv = dev->dev_private; - drm_radeon_buf_priv_t *buf_priv = buf->dev_private; - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - int format = sarea_priv->vc_format; - int offset = dev_priv->agp_buffers_offset + buf->offset; - int size = buf->used; - int prim = buf_priv->prim; + drm_clip_rect_t box; + int offset = dev_priv->agp_buffers_offset + buf->offset + prim->start; + int numverts = (int)prim->numverts; int i = 0; RING_LOCALS; - DRM_DEBUG( "%s: nbox=%d\n", __FUNCTION__, sarea_priv->nbox ); - if ( 0 ) - radeon_print_dirty( "dispatch_vertex", sarea_priv->dirty ); + DRM_DEBUG("hwprim 0x%x vfmt 0x%x %d..%d %d verts\n", + prim->prim, + prim->vc_format, + prim->start, + prim->finish, + prim->numverts); + + if (bad_prim_vertex_nr( prim->prim, prim->numverts )) { + DRM_ERROR( "bad prim %x numverts %d\n", + prim->prim, prim->numverts ); + return; + } + + do { + /* Emit the next cliprect */ + if ( i < nbox ) { + if (__copy_from_user( &box, &boxes[i], sizeof(box) )) + return; - if ( buf->used ) { - buf_priv->dispatched = 1; - - if ( sarea_priv->dirty & ~RADEON_UPLOAD_CLIPRECTS ) { - radeon_emit_state( dev_priv ); + radeon_emit_clip_rect( dev_priv, &box ); } - do { - /* Emit the next set of up to three cliprects */ - if ( i < sarea_priv->nbox ) { - radeon_emit_clip_rect( dev_priv, - &sarea_priv->boxes[i] ); - } + /* Emit the vertex buffer rendering commands */ + BEGIN_RING( 5 ); - /* Emit the vertex buffer rendering commands */ - BEGIN_RING( 5 ); + OUT_RING( CP_PACKET3( RADEON_3D_RNDR_GEN_INDX_PRIM, 3 ) ); + OUT_RING( offset ); + OUT_RING( numverts ); + OUT_RING( prim->vc_format ); + OUT_RING( prim->prim | RADEON_PRIM_WALK_LIST | + RADEON_COLOR_ORDER_RGBA | + RADEON_VTX_FMT_RADEON_MODE | + (numverts << RADEON_NUM_VERTICES_SHIFT) ); - OUT_RING( CP_PACKET3( RADEON_3D_RNDR_GEN_INDX_PRIM, 3 ) ); - OUT_RING( offset ); - OUT_RING( size ); - OUT_RING( format ); - OUT_RING( prim | RADEON_PRIM_WALK_LIST | - RADEON_COLOR_ORDER_RGBA | - RADEON_VTX_FMT_RADEON_MODE | - (size << RADEON_NUM_VERTICES_SHIFT) ); + ADVANCE_RING(); - ADVANCE_RING(); + i++; + } while ( i < nbox ); +} - i++; - } while ( i < sarea_priv->nbox ); - } - if ( buf_priv->discard ) { - buf_priv->age = dev_priv->sarea_priv->last_dispatch; - /* Emit the vertex buffer age */ - BEGIN_RING( 2 ); - RADEON_DISPATCH_AGE( buf_priv->age ); - ADVANCE_RING(); +static void radeon_cp_discard_buffer( drm_device_t *dev, drm_buf_t *buf ) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_buf_priv_t *buf_priv = buf->dev_private; + RING_LOCALS; - buf->pending = 1; - buf->used = 0; - /* FIXME: Check dispatched field */ - buf_priv->dispatched = 0; - } + buf_priv->age = ++dev_priv->sarea_priv->last_dispatch; - dev_priv->sarea_priv->last_dispatch++; + /* Emit the vertex buffer age */ + BEGIN_RING( 2 ); + RADEON_DISPATCH_AGE( buf_priv->age ); + ADVANCE_RING(); - sarea_priv->dirty &= ~RADEON_UPLOAD_CLIPRECTS; - sarea_priv->nbox = 0; + buf->pending = 1; + buf->used = 0; } - static void radeon_cp_dispatch_indirect( drm_device_t *dev, drm_buf_t *buf, int start, int end ) { drm_radeon_private_t *dev_priv = dev->dev_private; - drm_radeon_buf_priv_t *buf_priv = buf->dev_private; RING_LOCALS; DRM_DEBUG( "indirect: buf=%d s=0x%x e=0x%x\n", buf->idx, start, end ); @@ -852,8 +981,6 @@ data[dwords++] = RADEON_CP_PACKET2; } - buf_priv->dispatched = 1; - /* Fire off the indirect buffer */ BEGIN_RING( 3 ); @@ -863,100 +990,75 @@ ADVANCE_RING(); } - - if ( buf_priv->discard ) { - buf_priv->age = dev_priv->sarea_priv->last_dispatch; - - /* Emit the indirect buffer age */ - BEGIN_RING( 2 ); - RADEON_DISPATCH_AGE( buf_priv->age ); - ADVANCE_RING(); - - buf->pending = 1; - buf->used = 0; - /* FIXME: Check dispatched field */ - buf_priv->dispatched = 0; - } - - dev_priv->sarea_priv->last_dispatch++; } + static void radeon_cp_dispatch_indices( drm_device_t *dev, - drm_buf_t *buf, - int start, int end, - int count ) + drm_buf_t *elt_buf, + drm_radeon_tcl_prim_t *prim, + drm_clip_rect_t *boxes, + int nbox ) { drm_radeon_private_t *dev_priv = dev->dev_private; - drm_radeon_buf_priv_t *buf_priv = buf->dev_private; - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - int format = sarea_priv->vc_format; - int offset = dev_priv->agp_buffers_offset; - int prim = buf_priv->prim; + drm_clip_rect_t box; + int offset = dev_priv->agp_buffers_offset + prim->offset; u32 *data; int dwords; int i = 0; - RING_LOCALS; - DRM_DEBUG( "indices: s=%d e=%d c=%d\n", start, end, count ); - - if ( 0 ) - radeon_print_dirty( "dispatch_indices", sarea_priv->dirty ); - - if ( start != end ) { - buf_priv->dispatched = 1; - - if ( sarea_priv->dirty & ~RADEON_UPLOAD_CLIPRECTS ) { - radeon_emit_state( dev_priv ); - } - - dwords = (end - start + 3) / sizeof(u32); - - data = (u32 *)((char *)dev_priv->buffers->handle - + buf->offset + start); + int start = prim->start + RADEON_INDEX_PRIM_OFFSET; + int count = (prim->finish - start) / sizeof(u16); - data[0] = CP_PACKET3( RADEON_3D_RNDR_GEN_INDX_PRIM, dwords-2 ); - - data[1] = offset; - data[2] = RADEON_MAX_VB_VERTS; - data[3] = format; - data[4] = (prim | RADEON_PRIM_WALK_IND | - RADEON_COLOR_ORDER_RGBA | - RADEON_VTX_FMT_RADEON_MODE | - (count << RADEON_NUM_VERTICES_SHIFT) ); - - if ( count & 0x1 ) { - data[dwords-1] &= 0x0000ffff; - } - - do { - /* Emit the next set of up to three cliprects */ - if ( i < sarea_priv->nbox ) { - radeon_emit_clip_rect( dev_priv, - &sarea_priv->boxes[i] ); - } - - radeon_cp_dispatch_indirect( dev, buf, start, end ); - - i++; - } while ( i < sarea_priv->nbox ); + DRM_DEBUG("hwprim 0x%x vfmt 0x%x %d..%d offset: %x nr %d\n", + prim->prim, + prim->vc_format, + prim->start, + prim->finish, + prim->offset, + prim->numverts); + + if (bad_prim_vertex_nr( prim->prim, count )) { + DRM_ERROR( "bad prim %x count %d\n", + prim->prim, count ); + return; } - if ( buf_priv->discard ) { - buf_priv->age = dev_priv->sarea_priv->last_dispatch; - /* Emit the vertex buffer age */ - BEGIN_RING( 2 ); - RADEON_DISPATCH_AGE( buf_priv->age ); - ADVANCE_RING(); + if ( start >= prim->finish || + (prim->start & 0x7) ) { + DRM_ERROR( "buffer prim %d\n", prim->prim ); + return; + } + + dwords = (prim->finish - prim->start + 3) / sizeof(u32); + + data = (u32 *)((char *)dev_priv->buffers->handle + + elt_buf->offset + prim->start); + + data[0] = CP_PACKET3( RADEON_3D_RNDR_GEN_INDX_PRIM, dwords-2 ); + data[1] = offset; + data[2] = prim->numverts; + data[3] = prim->vc_format; + data[4] = (prim->prim | + RADEON_PRIM_WALK_IND | + RADEON_COLOR_ORDER_RGBA | + RADEON_VTX_FMT_RADEON_MODE | + (count << RADEON_NUM_VERTICES_SHIFT) ); + + do { + if ( i < nbox ) { + if (__copy_from_user( &box, &boxes[i], sizeof(box) )) + return; + + radeon_emit_clip_rect( dev_priv, &box ); + } - buf->pending = 1; - /* FIXME: Check dispatched field */ - buf_priv->dispatched = 0; - } + radeon_cp_dispatch_indirect( dev, elt_buf, + prim->start, + prim->finish ); - dev_priv->sarea_priv->last_dispatch++; + i++; + } while ( i < nbox ); - sarea_priv->dirty &= ~RADEON_UPLOAD_CLIPRECTS; - sarea_priv->nbox = 0; } #define RADEON_MAX_TEXTURE_SIZE (RADEON_BUFFER_SIZE - 8 * sizeof(u32)) @@ -967,25 +1069,35 @@ { drm_radeon_private_t *dev_priv = dev->dev_private; drm_buf_t *buf; - drm_radeon_buf_priv_t *buf_priv; u32 format; u32 *buffer; - u8 *data; + const u8 *data; int size, dwords, tex_width, blit_width; - u32 y, height; - int ret = 0, i; + u32 height; + int i; RING_LOCALS; - /* FIXME: Be smarter about this... + dev_priv->stats.boxes |= RADEON_BOX_TEXTURE_LOAD; + + /* Flush the pixel cache. This ensures no pixel data gets mixed + * up with the texture data from the host data blit, otherwise + * part of the texture image may be corrupted. */ - buf = radeon_freelist_get( dev ); - if ( !buf ) return -EAGAIN; + BEGIN_RING( 4 ); + RADEON_FLUSH_CACHE(); + RADEON_WAIT_UNTIL_IDLE(); + ADVANCE_RING(); - DRM_DEBUG( "tex: ofs=0x%x p=%d f=%d x=%hd y=%hd w=%hd h=%hd\n", - tex->offset >> 10, tex->pitch, tex->format, - image->x, image->y, image->width, image->height ); +#ifdef __BIG_ENDIAN + /* The Mesa texture functions provide the data in little endian as the + * chip wants it, but we need to compensate for the fact that the CP + * ring gets byte-swapped + */ + BEGIN_RING( 2 ); + OUT_RING_REG( RADEON_RBBM_GUICNTL, RADEON_HOST_DATA_SWAP_32BIT ); + ADVANCE_RING(); +#endif - buf_priv = buf->dev_private; /* The compiler won't optimize away a division by a variable, * even if the only legal values are powers of two. Thus, we'll @@ -1002,6 +1114,8 @@ case RADEON_TXFORMAT_ARGB1555: case RADEON_TXFORMAT_RGB565: case RADEON_TXFORMAT_ARGB4444: + case RADEON_TXFORMAT_VYUY422: + case RADEON_TXFORMAT_YVYU422: format = RADEON_COLOR_FORMAT_RGB565; tex_width = tex->width * 2; blit_width = image->width * 2; @@ -1017,56 +1131,46 @@ return -EINVAL; } - DRM_DEBUG( " tex=%dx%d blit=%d\n", - tex_width, tex->height, blit_width ); - - /* Flush the pixel cache. This ensures no pixel data gets mixed - * up with the texture data from the host data blit, otherwise - * part of the texture image may be corrupted. - */ - BEGIN_RING( 4 ); - - RADEON_FLUSH_CACHE(); - RADEON_WAIT_UNTIL_IDLE(); + DRM_DEBUG("tex=%dx%d blit=%d\n", tex_width, tex->height, blit_width ); - ADVANCE_RING(); + do { + DRM_DEBUG( "tex: ofs=0x%x p=%d f=%d x=%hd y=%hd w=%hd h=%hd\n", + tex->offset >> 10, tex->pitch, tex->format, + image->x, image->y, image->width, image->height ); - /* Make a copy of the parameters in case we have to update them - * for a multi-pass texture blit. + /* Make a copy of some parameters in case we have to + * update them for a multi-pass texture blit. */ - y = image->y; height = image->height; - data = (u8 *)image->data; + data = (const u8 *)image->data; size = height * blit_width; if ( size > RADEON_MAX_TEXTURE_SIZE ) { - /* Texture image is too large, do a multipass upload */ - ret = -EAGAIN; - - /* Adjust the blit size to fit the indirect buffer */ height = RADEON_MAX_TEXTURE_SIZE / blit_width; size = height * blit_width; - - /* Update the input parameters for next time */ - image->y += height; - image->height -= height; - image->data = (char *)image->data + size; - - if ( copy_to_user( tex->image, image, sizeof(*image) ) ) { - DRM_ERROR( "EFAULT on tex->image\n" ); - return -EFAULT; - } } else if ( size < 4 && size > 0 ) { size = 4; + } else if ( size == 0 ) { + return 0; + } + + buf = radeon_freelist_get( dev ); + if ( 0 && !buf ) { + radeon_do_cp_idle( dev_priv ); + buf = radeon_freelist_get( dev ); + } + if ( !buf ) { + DRM_DEBUG("radeon_cp_dispatch_texture: EAGAIN\n"); + copy_to_user( tex->image, image, sizeof(*image) ); + return -EAGAIN; } - dwords = size / 4; /* Dispatch the indirect buffer. */ - buffer = (u32 *)((char *)dev_priv->buffers->handle + buf->offset); - + buffer = (u32*)((char*)dev_priv->buffers->handle + buf->offset); + dwords = size / 4; buffer[0] = CP_PACKET3( RADEON_CNTL_HOSTDATA_BLT, dwords + 6 ); buffer[1] = (RADEON_GMC_DST_PITCH_OFFSET_CNTL | RADEON_GMC_BRUSH_NONE | @@ -1080,7 +1184,7 @@ buffer[2] = (tex->pitch << 22) | (tex->offset >> 10); buffer[3] = 0xffffffff; buffer[4] = 0xffffffff; - buffer[5] = (y << 16) | image->x; + buffer[5] = (image->y << 16) | image->x; buffer[6] = (height << 16) | image->width; buffer[7] = dwords; @@ -1112,30 +1216,34 @@ buf->pid = current->pid; buf->used = (dwords + 8) * sizeof(u32); - buf_priv->discard = 1; radeon_cp_dispatch_indirect( dev, buf, 0, buf->used ); + radeon_cp_discard_buffer( dev, buf ); + + /* Update the input parameters for next time */ + image->y += height; + image->height -= height; + (const u8 *)image->data += size; + } while (image->height > 0); /* Flush the pixel cache after the blit completes. This ensures * the texture data is written out to memory before rendering * continues. */ BEGIN_RING( 4 ); - RADEON_FLUSH_CACHE(); RADEON_WAIT_UNTIL_2D_IDLE(); - ADVANCE_RING(); - - return ret; + return 0; } + static void radeon_cp_dispatch_stipple( drm_device_t *dev, u32 *stipple ) { drm_radeon_private_t *dev_priv = dev->dev_private; int i; RING_LOCALS; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); BEGIN_RING( 35 ); @@ -1158,31 +1266,95 @@ int radeon_cp_clear( struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg ) { - drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_radeon_clear_t clear; + drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS]; + DRM_DEBUG( "\n" ); + + LOCK_TEST_WITH_RETURN( dev ); + + if ( copy_from_user( &clear, (drm_radeon_clear_t *)arg, + sizeof(clear) ) ) + return -EFAULT; + + RING_SPACE_TEST_WITH_RETURN( dev_priv ); + + if ( sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS ) + sarea_priv->nbox = RADEON_NR_SAREA_CLIPRECTS; + + if ( copy_from_user( &depth_boxes, clear.depth_boxes, + sarea_priv->nbox * sizeof(depth_boxes[0]) ) ) + return -EFAULT; + + radeon_cp_dispatch_clear( dev, &clear, depth_boxes ); + + COMMIT_RING(); + return 0; +} + + +/* Not sure why this isn't set all the time: + */ +static int radeon_do_init_pageflip( drm_device_t *dev ) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + RING_LOCALS; + + DRM_DEBUG( "\n" ); + + BEGIN_RING( 6 ); + RADEON_WAIT_UNTIL_3D_IDLE(); + OUT_RING( CP_PACKET0( RADEON_CRTC_OFFSET_CNTL, 0 ) ); + OUT_RING( RADEON_READ( RADEON_CRTC_OFFSET_CNTL ) | RADEON_CRTC_OFFSET_FLIP_CNTL ); + OUT_RING( CP_PACKET0( RADEON_CRTC2_OFFSET_CNTL, 0 ) ); + OUT_RING( RADEON_READ( RADEON_CRTC2_OFFSET_CNTL ) | RADEON_CRTC_OFFSET_FLIP_CNTL ); + ADVANCE_RING(); + + dev_priv->page_flipping = 1; + dev_priv->current_page = 0; + dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page; + + return 0; +} + +/* Called whenever a client dies, from DRM(release). + * NOTE: Lock isn't necessarily held when this is called! + */ +int radeon_do_cleanup_pageflip( drm_device_t *dev ) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + DRM_DEBUG( "\n" ); + + if (dev_priv->current_page != 0) + radeon_cp_dispatch_flip( dev ); + + dev_priv->page_flipping = 0; + return 0; +} + +/* Swapping and flipping are different operations, need different ioctls. + * They can & should be intermixed to support multiple 3d windows. + */ +int radeon_cp_flip(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; drm_radeon_private_t *dev_priv = dev->dev_private; - drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - drm_radeon_clear_t clear; - drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS]; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); LOCK_TEST_WITH_RETURN( dev ); - if ( copy_from_user( &clear, (drm_radeon_clear_t *)arg, - sizeof(clear) ) ) - return -EFAULT; - RING_SPACE_TEST_WITH_RETURN( dev_priv ); - if ( sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS ) - sarea_priv->nbox = RADEON_NR_SAREA_CLIPRECTS; - - if ( copy_from_user( &depth_boxes, clear.depth_boxes, - sarea_priv->nbox * sizeof(depth_boxes[0]) ) ) - return -EFAULT; - - radeon_cp_dispatch_clear( dev, &clear, depth_boxes ); + if (!dev_priv->page_flipping) + radeon_do_init_pageflip( dev ); + + radeon_cp_dispatch_flip( dev ); + COMMIT_RING(); return 0; } @@ -1193,7 +1365,7 @@ drm_device_t *dev = priv->dev; drm_radeon_private_t *dev_priv = dev->dev_private; drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; - DRM_DEBUG( "%s\n", __FUNCTION__ ); + DRM_DEBUG( "\n" ); LOCK_TEST_WITH_RETURN( dev ); @@ -1202,14 +1374,10 @@ if ( sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS ) sarea_priv->nbox = RADEON_NR_SAREA_CLIPRECTS; - if ( !dev_priv->page_flipping ) { - radeon_cp_dispatch_swap( dev ); - dev_priv->sarea_priv->dirty |= (RADEON_UPLOAD_CONTEXT | - RADEON_UPLOAD_MASKS); - } else { - radeon_cp_dispatch_flip( dev ); - } + radeon_cp_dispatch_swap( dev ); + dev_priv->sarea_priv->ctx_owner = 0; + COMMIT_RING(); return 0; } @@ -1219,10 +1387,11 @@ drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->dev; drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; drm_device_dma_t *dma = dev->dma; drm_buf_t *buf; - drm_radeon_buf_priv_t *buf_priv; drm_radeon_vertex_t vertex; + drm_radeon_tcl_prim_t prim; LOCK_TEST_WITH_RETURN( dev ); @@ -1235,8 +1404,8 @@ sizeof(vertex) ) ) return -EFAULT; - DRM_DEBUG( "%s: pid=%d index=%d count=%d discard=%d\n", - __FUNCTION__, current->pid, + DRM_DEBUG( "pid=%d index=%d count=%d discard=%d\n", + current->pid, vertex.idx, vertex.count, vertex.discard ); if ( vertex.idx < 0 || vertex.idx >= dma->buf_count ) { @@ -1254,7 +1423,6 @@ VB_AGE_TEST_WITH_RETURN( dev_priv ); buf = dma->buflist[vertex.idx]; - buf_priv = buf->dev_private; if ( buf->pid != current->pid ) { DRM_ERROR( "process %d using buffer owned by %d\n", @@ -1266,12 +1434,39 @@ return -EINVAL; } - buf->used = vertex.count; - buf_priv->prim = vertex.prim; - buf_priv->discard = vertex.discard; + /* Build up a prim_t record: + */ + if (vertex.count) { + buf->used = vertex.count; /* not used? */ + + if ( sarea_priv->dirty & ~RADEON_UPLOAD_CLIPRECTS ) { + radeon_emit_state( dev_priv, + &sarea_priv->context_state, + sarea_priv->tex_state, + sarea_priv->dirty ); + + sarea_priv->dirty &= ~(RADEON_UPLOAD_TEX0IMAGES | + RADEON_UPLOAD_TEX1IMAGES | + RADEON_UPLOAD_TEX2IMAGES | + RADEON_REQUIRE_QUIESCENCE); + } + + prim.start = 0; + prim.finish = vertex.count; /* unused */ + prim.prim = vertex.prim; + prim.numverts = vertex.count; + prim.vc_format = dev_priv->sarea_priv->vc_format; + + radeon_cp_dispatch_vertex( dev, buf, &prim, + dev_priv->sarea_priv->boxes, + dev_priv->sarea_priv->nbox ); + } - radeon_cp_dispatch_vertex( dev, buf ); + if (vertex.discard) { + radeon_cp_discard_buffer( dev, buf ); + } + COMMIT_RING(); return 0; } @@ -1281,10 +1476,11 @@ drm_file_t *priv = filp->private_data; drm_device_t *dev = priv->dev; drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; drm_device_dma_t *dma = dev->dma; drm_buf_t *buf; - drm_radeon_buf_priv_t *buf_priv; drm_radeon_indices_t elts; + drm_radeon_tcl_prim_t prim; int count; LOCK_TEST_WITH_RETURN( dev ); @@ -1317,7 +1513,6 @@ VB_AGE_TEST_WITH_RETURN( dev_priv ); buf = dma->buflist[elts.idx]; - buf_priv = buf->dev_private; if ( buf->pid != current->pid ) { DRM_ERROR( "process %d using buffer owned by %d\n", @@ -1342,11 +1537,37 @@ } buf->used = elts.end; - buf_priv->prim = elts.prim; - buf_priv->discard = elts.discard; - radeon_cp_dispatch_indices( dev, buf, elts.start, elts.end, count ); + if ( sarea_priv->dirty & ~RADEON_UPLOAD_CLIPRECTS ) { + radeon_emit_state( dev_priv, + &sarea_priv->context_state, + sarea_priv->tex_state, + sarea_priv->dirty ); + + sarea_priv->dirty &= ~(RADEON_UPLOAD_TEX0IMAGES | + RADEON_UPLOAD_TEX1IMAGES | + RADEON_UPLOAD_TEX2IMAGES | + RADEON_REQUIRE_QUIESCENCE); + } + + + /* Build up a prim_t record: + */ + prim.start = elts.start; + prim.finish = elts.end; + prim.prim = elts.prim; + prim.offset = 0; /* offset from start of dma buffers */ + prim.numverts = RADEON_MAX_VB_VERTS; /* duh */ + prim.vc_format = dev_priv->sarea_priv->vc_format; + + radeon_cp_dispatch_indices( dev, buf, &prim, + dev_priv->sarea_priv->boxes, + dev_priv->sarea_priv->nbox ); + if (elts.discard) { + radeon_cp_discard_buffer( dev, buf ); + } + COMMIT_RING(); return 0; } @@ -1358,6 +1579,7 @@ drm_radeon_private_t *dev_priv = dev->dev_private; drm_radeon_texture_t tex; drm_radeon_tex_image_t image; + int ret; LOCK_TEST_WITH_RETURN( dev ); @@ -1377,7 +1599,10 @@ RING_SPACE_TEST_WITH_RETURN( dev_priv ); VB_AGE_TEST_WITH_RETURN( dev_priv ); - return radeon_cp_dispatch_texture( dev, &tex, &image ); + ret = radeon_cp_dispatch_texture( dev, &tex, &image ); + + COMMIT_RING(); + return ret; } int radeon_cp_stipple( struct inode *inode, struct file *filp, @@ -1402,6 +1627,7 @@ radeon_cp_dispatch_stipple( dev, mask ); + COMMIT_RING(); return 0; } @@ -1413,7 +1639,6 @@ drm_radeon_private_t *dev_priv = dev->dev_private; drm_device_dma_t *dma = dev->dma; drm_buf_t *buf; - drm_radeon_buf_priv_t *buf_priv; drm_radeon_indirect_t indirect; RING_LOCALS; @@ -1439,7 +1664,6 @@ } buf = dma->buflist[indirect.idx]; - buf_priv = buf->dev_private; if ( buf->pid != current->pid ) { DRM_ERROR( "process %d using buffer owned by %d\n", @@ -1461,7 +1685,6 @@ VB_AGE_TEST_WITH_RETURN( dev_priv ); buf->used = indirect.end; - buf_priv->discard = indirect.discard; /* Wait for the 3D stream to idle before the indirect buffer * containing 2D acceleration commands is processed. @@ -1477,6 +1700,526 @@ * privileged clients. */ radeon_cp_dispatch_indirect( dev, buf, indirect.start, indirect.end ); + if (indirect.discard) { + radeon_cp_discard_buffer( dev, buf ); + } + + + COMMIT_RING(); + return 0; +} + +int radeon_cp_vertex2(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv; + drm_device_dma_t *dma = dev->dma; + drm_buf_t *buf; + drm_radeon_vertex2_t vertex; + int i; + unsigned char laststate; + + LOCK_TEST_WITH_RETURN( dev ); + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + DRM_COPY_FROM_USER_IOCTL( vertex, (drm_radeon_vertex2_t *)data, + sizeof(vertex) ); + + DRM_DEBUG( "pid=%d index=%d discard=%d\n", + current->pid, + vertex.idx, vertex.discard ); + + if ( vertex.idx < 0 || vertex.idx >= dma->buf_count ) { + DRM_ERROR( "buffer index %d (of %d max)\n", + vertex.idx, dma->buf_count - 1 ); + return -EINVAL; + } + + RING_SPACE_TEST_WITH_RETURN( dev_priv ); + VB_AGE_TEST_WITH_RETURN( dev_priv ); + + buf = dma->buflist[vertex.idx]; + + if ( buf->pid != current->pid ) { + DRM_ERROR( "process %d using buffer owned by %d\n", + current->pid, buf->pid ); + return -EINVAL; + } + + if ( buf->pending ) { + DRM_ERROR( "sending pending buffer %d\n", vertex.idx ); + return -EINVAL; + } + + if (sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS) + return -EINVAL; + + for (laststate = 0xff, i = 0 ; i < vertex.nr_prims ; i++) { + drm_radeon_prim_t prim; + drm_radeon_tcl_prim_t tclprim; + + if ( copy_from_user( &prim, &vertex.prim[i], sizeof(prim) ) ) + return -EFAULT; + + if ( prim.stateidx != laststate ) { + drm_radeon_state_t state; + + if ( copy_from_user( &state, + &vertex.state[prim.stateidx], + sizeof(state) ) ) + return -EFAULT; + + radeon_emit_state2( dev_priv, &state ); + + laststate = prim.stateidx; + } + + tclprim.start = prim.start; + tclprim.finish = prim.finish; + tclprim.prim = prim.prim; + tclprim.vc_format = prim.vc_format; + + if ( prim.prim & RADEON_PRIM_WALK_IND ) { + tclprim.offset = prim.numverts * 64; + tclprim.numverts = RADEON_MAX_VB_VERTS; /* duh */ + + radeon_cp_dispatch_indices( dev, buf, &tclprim, + sarea_priv->boxes, + sarea_priv->nbox); + } else { + tclprim.numverts = prim.numverts; + tclprim.offset = 0; /* not used */ + + radeon_cp_dispatch_vertex( dev, buf, &tclprim, + sarea_priv->boxes, + sarea_priv->nbox); + } + + if (sarea_priv->nbox == 1) + sarea_priv->nbox = 0; + } + + if ( vertex.discard ) { + radeon_cp_discard_buffer( dev, buf ); + } + + COMMIT_RING(); + return 0; +} + + +static int radeon_emit_packets( + drm_radeon_private_t *dev_priv, + drm_radeon_cmd_header_t header, + drm_radeon_cmd_buffer_t *cmdbuf ) +{ + int id = (int)header.packet.packet_id; + int sz, reg; + int *data = (int *)cmdbuf->buf; + RING_LOCALS; + + if (id >= RADEON_MAX_STATE_PACKETS) + return -EINVAL; + + sz = packet[id].len; + reg = packet[id].start; + + if (sz * sizeof(int) > cmdbuf->bufsz) + return -EINVAL; + + BEGIN_RING(sz+1); + OUT_RING( CP_PACKET0( reg, (sz-1) ) ); + OUT_RING_USER_TABLE( data, sz ); + ADVANCE_RING(); + + cmdbuf->buf += sz * sizeof(int); + cmdbuf->bufsz -= sz * sizeof(int); + return 0; +} + +static __inline__ int radeon_emit_scalars( + drm_radeon_private_t *dev_priv, + drm_radeon_cmd_header_t header, + drm_radeon_cmd_buffer_t *cmdbuf ) +{ + int sz = header.scalars.count; + int *data = (int *)cmdbuf->buf; + int start = header.scalars.offset; + int stride = header.scalars.stride; + RING_LOCALS; + + BEGIN_RING( 3+sz ); + OUT_RING( CP_PACKET0( RADEON_SE_TCL_SCALAR_INDX_REG, 0 ) ); + OUT_RING( start | (stride << RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT)); + OUT_RING( CP_PACKET0_TABLE( RADEON_SE_TCL_SCALAR_DATA_REG, sz-1 ) ); + OUT_RING_USER_TABLE( data, sz ); + ADVANCE_RING(); + cmdbuf->buf += sz * sizeof(int); + cmdbuf->bufsz -= sz * sizeof(int); + return 0; +} + +/* God this is ugly + */ +static __inline__ int radeon_emit_scalars2( + drm_radeon_private_t *dev_priv, + drm_radeon_cmd_header_t header, + drm_radeon_cmd_buffer_t *cmdbuf ) +{ + int sz = header.scalars.count; + int *data = (int *)cmdbuf->buf; + int start = ((unsigned int)header.scalars.offset) + 0x100; + int stride = header.scalars.stride; + RING_LOCALS; + + BEGIN_RING( 3+sz ); + OUT_RING( CP_PACKET0( RADEON_SE_TCL_SCALAR_INDX_REG, 0 ) ); + OUT_RING( start | (stride << RADEON_SCAL_INDX_DWORD_STRIDE_SHIFT)); + OUT_RING( CP_PACKET0_TABLE( RADEON_SE_TCL_SCALAR_DATA_REG, sz-1 ) ); + OUT_RING_USER_TABLE( data, sz ); + ADVANCE_RING(); + cmdbuf->buf += sz * sizeof(int); + cmdbuf->bufsz -= sz * sizeof(int); + return 0; +} + +static __inline__ int radeon_emit_vectors( + drm_radeon_private_t *dev_priv, + drm_radeon_cmd_header_t header, + drm_radeon_cmd_buffer_t *cmdbuf ) +{ + int sz = header.vectors.count; + int *data = (int *)cmdbuf->buf; + int start = header.vectors.offset; + int stride = header.vectors.stride; + RING_LOCALS; + + BEGIN_RING( 3+sz ); + OUT_RING( CP_PACKET0( RADEON_SE_TCL_VECTOR_INDX_REG, 0 ) ); + OUT_RING( start | (stride << RADEON_VEC_INDX_OCTWORD_STRIDE_SHIFT)); + OUT_RING( CP_PACKET0_TABLE( RADEON_SE_TCL_VECTOR_DATA_REG, (sz-1) ) ); + OUT_RING_USER_TABLE( data, sz ); + ADVANCE_RING(); + + cmdbuf->buf += sz * sizeof(int); + cmdbuf->bufsz -= sz * sizeof(int); + return 0; +} + + +static int radeon_emit_packet3( drm_device_t *dev, + drm_radeon_cmd_buffer_t *cmdbuf ) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + int cmdsz, tmp; + int *cmd = (int *)cmdbuf->buf; + RING_LOCALS; + + DRM_DEBUG("\n"); + + if (__get_user( tmp, &cmd[0])) + return -EFAULT; + + cmdsz = 2 + ((tmp & RADEON_CP_PACKET_COUNT_MASK) >> 16); + + if ((tmp & 0xc0000000) != RADEON_CP_PACKET3 || + cmdsz * 4 > cmdbuf->bufsz) + return -EINVAL; + + BEGIN_RING( cmdsz ); + OUT_RING_USER_TABLE( cmd, cmdsz ); + ADVANCE_RING(); + + cmdbuf->buf += cmdsz * 4; + cmdbuf->bufsz -= cmdsz * 4; + return 0; +} + + +static int radeon_emit_packet3_cliprect( drm_device_t *dev, + drm_radeon_cmd_buffer_t *cmdbuf, + int orig_nbox ) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_clip_rect_t box; + int cmdsz, tmp; + int *cmd = (int *)cmdbuf->buf; + drm_clip_rect_t *boxes = cmdbuf->boxes; + int i = 0; + RING_LOCALS; + + DRM_DEBUG("\n"); + + if (__get_user( tmp, &cmd[0])) + return -EFAULT; + + cmdsz = 2 + ((tmp & RADEON_CP_PACKET_COUNT_MASK) >> 16); + + if ((tmp & 0xc0000000) != RADEON_CP_PACKET3 || + cmdsz * 4 > cmdbuf->bufsz) + return -EINVAL; + + if (!orig_nbox) + goto out; + + do { + if ( i < cmdbuf->nbox ) { + if (__copy_from_user( &box, &boxes[i], sizeof(box) )) + return -EFAULT; + /* FIXME The second and subsequent times round + * this loop, send a WAIT_UNTIL_3D_IDLE before + * calling emit_clip_rect(). This fixes a + * lockup on fast machines when sending + * several cliprects with a cmdbuf, as when + * waving a 2D window over a 3D + * window. Something in the commands from user + * space seems to hang the card when they're + * sent several times in a row. That would be + * the correct place to fix it but this works + * around it until I can figure that out - Tim + * Smith */ + if ( i ) { + BEGIN_RING( 2 ); + RADEON_WAIT_UNTIL_3D_IDLE(); + ADVANCE_RING(); + } + radeon_emit_clip_rect( dev_priv, &box ); + } + + BEGIN_RING( cmdsz ); + OUT_RING_USER_TABLE( cmd, cmdsz ); + ADVANCE_RING(); + + } while ( ++i < cmdbuf->nbox ); + if (cmdbuf->nbox == 1) + cmdbuf->nbox = 0; + + out: + cmdbuf->buf += cmdsz * 4; + cmdbuf->bufsz -= cmdsz * 4; + return 0; +} + + +static int radeon_emit_wait( drm_device_t *dev, int flags ) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + RING_LOCALS; + + DRM_DEBUG("%s: %x\n", __FUNCTION__, flags); + switch (flags) { + case RADEON_WAIT_2D: + BEGIN_RING( 2 ); + RADEON_WAIT_UNTIL_2D_IDLE(); + ADVANCE_RING(); + break; + case RADEON_WAIT_3D: + BEGIN_RING( 2 ); + RADEON_WAIT_UNTIL_3D_IDLE(); + ADVANCE_RING(); + break; + case RADEON_WAIT_2D|RADEON_WAIT_3D: + BEGIN_RING( 2 ); + RADEON_WAIT_UNTIL_IDLE(); + ADVANCE_RING(); + break; + default: + return -EINVAL; + } + + return 0; +} + +int radeon_cp_cmdbuf(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data ) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_device_dma_t *dma = dev->dma; + drm_buf_t *buf = 0; + int idx; + drm_radeon_cmd_buffer_t cmdbuf; + drm_radeon_cmd_header_t header; + int orig_nbox; + + LOCK_TEST_WITH_RETURN( dev ); + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + DRM_COPY_FROM_USER_IOCTL( cmdbuf, (drm_radeon_cmd_buffer_t *)data, + sizeof(cmdbuf) ); + + RING_SPACE_TEST_WITH_RETURN( dev_priv ); + VB_AGE_TEST_WITH_RETURN( dev_priv ); + + + if (verify_area( VERIFY_READ, cmdbuf.buf, cmdbuf.bufsz )) + return -EFAULT; + + if (cmdbuf.nbox && + verify_area( VERIFY_READ, cmdbuf.boxes, + cmdbuf.nbox * sizeof(drm_clip_rect_t))) + return -EFAULT; + + orig_nbox = cmdbuf.nbox; + + while ( cmdbuf.bufsz >= sizeof(header) ) { + + if (__get_user( header.i, (int *)cmdbuf.buf )) { + DRM_ERROR("__get_user %p\n", cmdbuf.buf); + return -EFAULT; + } + + cmdbuf.buf += sizeof(header); + cmdbuf.bufsz -= sizeof(header); + + switch (header.header.cmd_type) { + case RADEON_CMD_PACKET: + DRM_DEBUG("RADEON_CMD_PACKET\n"); + if (radeon_emit_packets( dev_priv, header, &cmdbuf )) { + DRM_ERROR("radeon_emit_packets failed\n"); + return -EINVAL; + } + break; + + case RADEON_CMD_SCALARS: + DRM_DEBUG("RADEON_CMD_SCALARS\n"); + if (radeon_emit_scalars( dev_priv, header, &cmdbuf )) { + DRM_ERROR("radeon_emit_scalars failed\n"); + return -EINVAL; + } + break; + + case RADEON_CMD_VECTORS: + DRM_DEBUG("RADEON_CMD_VECTORS\n"); + if (radeon_emit_vectors( dev_priv, header, &cmdbuf )) { + DRM_ERROR("radeon_emit_vectors failed\n"); + return -EINVAL; + } + break; + + case RADEON_CMD_DMA_DISCARD: + DRM_DEBUG("RADEON_CMD_DMA_DISCARD\n"); + idx = header.dma.buf_idx; + if ( idx < 0 || idx >= dma->buf_count ) { + DRM_ERROR( "buffer index %d (of %d max)\n", + idx, dma->buf_count - 1 ); + return -EINVAL; + } + + buf = dma->buflist[idx]; + if ( buf->pid != current->pid || buf->pending ) { + DRM_ERROR( "bad buffer\n" ); + return -EINVAL; + } + + radeon_cp_discard_buffer( dev, buf ); + break; + + case RADEON_CMD_PACKET3: + DRM_DEBUG("RADEON_CMD_PACKET3\n"); + if (radeon_emit_packet3( dev, &cmdbuf )) { + DRM_ERROR("radeon_emit_packet3 failed\n"); + return -EINVAL; + } + break; + + case RADEON_CMD_PACKET3_CLIP: + DRM_DEBUG("RADEON_CMD_PACKET3_CLIP\n"); + if (radeon_emit_packet3_cliprect( dev, &cmdbuf, orig_nbox )) { + DRM_ERROR("radeon_emit_packet3_clip failed\n"); + return -EINVAL; + } + break; + + case RADEON_CMD_SCALARS2: + DRM_DEBUG("RADEON_CMD_SCALARS2\n"); + if (radeon_emit_scalars2( dev_priv, header, &cmdbuf )) { + DRM_ERROR("radeon_emit_scalars2 failed\n"); + return -EINVAL; + } + break; + + case RADEON_CMD_WAIT: + DRM_DEBUG("RADEON_CMD_WAIT\n"); + if (radeon_emit_wait( dev, header.wait.flags )) { + DRM_ERROR("radeon_emit_wait failed\n"); + return -EINVAL; + } + break; + default: + DRM_ERROR("bad cmd_type %d at %p\n", + header.header.cmd_type, + cmdbuf.buf - sizeof(header)); + return -EINVAL; + } + } + + + DRM_DEBUG("DONE\n"); + COMMIT_RING(); + return 0; +} + + + +int radeon_cp_getparam(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_radeon_private_t *dev_priv = dev->dev_private; + drm_radeon_getparam_t param; + int value; + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); + return -EINVAL; + } + + DRM_COPY_FROM_USER_IOCTL( param, (drm_radeon_getparam_t *)data, + sizeof(param) ); + + DRM_DEBUG( "pid=%d\n", current->pid ); + + switch( param.param ) { + case RADEON_PARAM_AGP_BUFFER_OFFSET: + value = dev_priv->agp_buffers_offset; + break; + case RADEON_PARAM_LAST_FRAME: + dev_priv->stats.last_frame_reads++; + value = GET_SCRATCH( 0 ); + break; + case RADEON_PARAM_LAST_DISPATCH: + value = GET_SCRATCH( 1 ); + break; + case RADEON_PARAM_LAST_CLEAR: + dev_priv->stats.last_clear_reads++; + value = GET_SCRATCH( 2 ); + break; + case RADEON_PARAM_IRQ_NR: + value = dev->irq; + break; + case RADEON_PARAM_AGP_BASE: + value = dev_priv->agp_vm_start; + break; + default: + return -EINVAL; + } + + if ( copy_to_user( param.value, &value, sizeof(int) ) ) { + DRM_ERROR( "copy_to_user\n" ); + return -EFAULT; + } + return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/savage.h linux-2.4.23-pre8/drivers/char/drm/savage.h --- linux-2.4.22/drivers/char/drm/savage.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/savage.h 2003-10-22 22:49:14.000000000 +0000 @@ -0,0 +1,39 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ + +#ifndef __SAVAGE_H__ +#define __SAVAGE_H__ + +/* This remains constant for all DRM template files. + */ +#define DRM(x) savage_##x + +/* General customization: + */ +#define __HAVE_AGP 1 +#define __MUST_HAVE_AGP 1 +#define __HAVE_MTRR 1 +#define __HAVE_CTX_BITMAP 1 + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/savage_dma.c linux-2.4.23-pre8/drivers/char/drm/savage_dma.c --- linux-2.4.22/drivers/char/drm/savage_dma.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/savage_dma.c 2003-10-22 22:47:44.000000000 +0000 @@ -0,0 +1,38 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ + + +/*=========================================================*/ +#define __NO_VERSION__ +#include "savage.h" +#include "drmP.h" +#include "savage_drv.h" + +#include /* For task queue support */ +#include + +#define SAVAGE_DEFAULT_USEC_TIMEOUT 10000 +#define SAVAGE_FREELIST_DEBUG 0 + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/savage_drm.h linux-2.4.23-pre8/drivers/char/drm/savage_drm.h --- linux-2.4.22/drivers/char/drm/savage_drm.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/savage_drm.h 2003-10-22 22:48:30.000000000 +0000 @@ -0,0 +1,238 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ + +#ifndef __SAVAGE_DRM_H__ +#define __SAVAGE_DRM_H__ + +#ifndef __SAVAGE_SAREA_DEFINES__ +#define __SAVAGE_SAREA_DEFINES__ + +#define DRM_SAVAGE_MEM_PAGE (1UL<<12) +#define DRM_SAVAGE_MEM_WORK 32 +#define DRM_SAVAGE_MEM_LOCATION_PCI 1 +#define DRM_SAVAGE_MEM_LOCATION_AGP 2 +#define DRM_SAVAGE_DMA_AGP_SIZE (16*1024*1024) + +typedef struct drm_savage_alloc_cont_mem +{ + size_t size; /*size of buffer*/ + unsigned long type; /*4k page or word*/ + unsigned long alignment; + unsigned long location; /*agp or pci*/ + + unsigned long phyaddress; + unsigned long linear; +} drm_savage_alloc_cont_mem_t; + +typedef struct drm_savage_get_physcis_address +{ + unsigned long v_address; + unsigned long p_address; +} drm_savage_get_physcis_address_t; + +/*ioctl number*/ +#define DRM_IOCTL_SAVAGE_ALLOC_CONTINUOUS_MEM \ + DRM_IOWR(0x40,drm_savage_alloc_cont_mem_t) +#define DRM_IOCTL_SAVAGE_GET_PHYSICS_ADDRESS \ + DRM_IOWR(0x41, drm_savage_get_physcis_address_t) +#define DRM_IOCTL_SAVAGE_FREE_CONTINUOUS_MEM \ + DRM_IOWR(0x42, drm_savage_alloc_cont_mem_t) + +#define SAVAGE_FRONT 0x1 +#define SAVAGE_BACK 0x2 +#define SAVAGE_DEPTH 0x4 +#define SAVAGE_STENCIL 0x8 + +/* What needs to be changed for the current vertex dma buffer? + */ +#define SAVAGE_UPLOAD_CTX 0x1 +#define SAVAGE_UPLOAD_TEX0 0x2 +#define SAVAGE_UPLOAD_TEX1 0x4 +#define SAVAGE_UPLOAD_PIPE 0x8 /* <- seems should be removed, Jiayo Hsu */ +#define SAVAGE_UPLOAD_TEX0IMAGE 0x10 /* handled client-side */ +#define SAVAGE_UPLOAD_TEX1IMAGE 0x20 /* handled client-side */ +#define SAVAGE_UPLOAD_2D 0x40 +#define SAVAGE_WAIT_AGE 0x80 /* handled client-side */ +#define SAVAGE_UPLOAD_CLIPRECTS 0x100 /* handled client-side */ +/*frank:add Buffer state 2001/11/15*/ +#define SAVAGE_UPLOAD_BUFFERS 0x200 +/* original marked off in MGA drivers , Jiayo Hsu Oct.23,2001 */ + +/* Keep these small for testing. + */ +#define SAVAGE_NR_SAREA_CLIPRECTS 8 + +/* 2 heaps (1 for card, 1 for agp), each divided into upto 128 + * regions, subject to a minimum region size of (1<<16) == 64k. + * + * Clients may subdivide regions internally, but when sharing between + * clients, the region size is the minimum granularity. + */ + +#define SAVAGE_CARD_HEAP 0 +#define SAVAGE_AGP_HEAP 1 +#define SAVAGE_NR_TEX_HEAPS 2 +#define SAVAGE_NR_TEX_REGIONS 16 /* num. of global texture manage list element*/ +#define SAVAGE_LOG_MIN_TEX_REGION_SIZE 16 /* each region 64K, Jiayo Hsu */ + +#endif /* __SAVAGE_SAREA_DEFINES__ */ + +/* drm_tex_region_t define in drm.h */ + +typedef drm_tex_region_t drm_savage_tex_region_t; + +/* Setup registers for 2D, X server + */ +typedef struct { + unsigned int pitch; +} drm_savage_server_regs_t; + + +typedef struct _drm_savage_sarea { + /* The channel for communication of state information to the kernel + * on firing a vertex dma buffer. + */ + unsigned int setup[28]; /* 3D context registers */ + drm_savage_server_regs_t server_state; + + unsigned int dirty; + + unsigned int vertsize; /* vertext size */ + + /* The current cliprects, or a subset thereof. + */ + drm_clip_rect_t boxes[SAVAGE_NR_SAREA_CLIPRECTS]; + unsigned int nbox; + + /* Information about the most recently used 3d drawable. The + * client fills in the req_* fields, the server fills in the + * exported_ fields and puts the cliprects into boxes, above. + * + * The client clears the exported_drawable field before + * clobbering the boxes data. + */ + unsigned int req_drawable; /* the X drawable id */ + unsigned int req_draw_buffer; /* SAVAGE_FRONT or SAVAGE_BACK */ + + unsigned int exported_drawable; + unsigned int exported_index; + unsigned int exported_stamp; + unsigned int exported_buffers; + unsigned int exported_nfront; + unsigned int exported_nback; + int exported_back_x, exported_front_x, exported_w; + int exported_back_y, exported_front_y, exported_h; + drm_clip_rect_t exported_boxes[SAVAGE_NR_SAREA_CLIPRECTS]; + + /* Counters for aging textures and for client-side throttling. + */ + unsigned int status[4]; + + + /* LRU lists for texture memory in agp space and on the card. + */ + drm_tex_region_t texList[SAVAGE_NR_TEX_HEAPS][SAVAGE_NR_TEX_REGIONS+1]; + unsigned int texAge[SAVAGE_NR_TEX_HEAPS]; + + /* Mechanism to validate card state. + */ + int ctxOwner; + unsigned long shadow_status[64];/*too big?*/ + + /*agp offset*/ + unsigned long agp_offset; +} drm_savage_sarea_t,*drm_savage_sarea_ptr; + + + +typedef struct drm_savage_init { + + unsigned long sarea_priv_offset; + + int chipset; + int sgram; + + unsigned int maccess; + + unsigned int fb_cpp; + unsigned int front_offset, front_pitch; + unsigned int back_offset, back_pitch; + + unsigned int depth_cpp; + unsigned int depth_offset, depth_pitch; + + unsigned int texture_offset[SAVAGE_NR_TEX_HEAPS]; + unsigned int texture_size[SAVAGE_NR_TEX_HEAPS]; + + unsigned long fb_offset; + unsigned long mmio_offset; + unsigned long status_offset; +} drm_savage_init_t; + +typedef struct drm_savage_fullscreen { + enum { + SAVAGE_INIT_FULLSCREEN = 0x01, + SAVAGE_CLEANUP_FULLSCREEN = 0x02 + } func; +} drm_savage_fullscreen_t; + +typedef struct drm_savage_clear { + unsigned int flags; + unsigned int clear_color; + unsigned int clear_depth; + unsigned int color_mask; + unsigned int depth_mask; +} drm_savage_clear_t; + +typedef struct drm_savage_vertex { + int idx; /* buffer to queue */ + int used; /* bytes in use */ + int discard; /* client finished with buffer? */ +} drm_savage_vertex_t; + +typedef struct drm_savage_indices { + int idx; /* buffer to queue */ + unsigned int start; + unsigned int end; + int discard; /* client finished with buffer? */ +} drm_savage_indices_t; + +typedef struct drm_savage_iload { + int idx; + unsigned int dstorg; + unsigned int length; +} drm_savage_iload_t; + +typedef struct _drm_savage_blit { + unsigned int planemask; + unsigned int srcorg; + unsigned int dstorg; + int src_pitch, dst_pitch; + int delta_sx, delta_sy; + int delta_dx, delta_dy; + int height, ydir; /* flip image vertically */ + int source_pitch, dest_pitch; +} drm_savage_blit_t; + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/savage_drv.c linux-2.4.23-pre8/drivers/char/drm/savage_drv.c --- linux-2.4.22/drivers/char/drm/savage_drv.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/savage_drv.c 2003-10-22 22:47:37.000000000 +0000 @@ -0,0 +1,248 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ + +#include +#include "savage.h" +#include "drmP.h" +#include "savage_drv.h" + +#define DRIVER_AUTHOR "John Zhao, S3 Graphics Inc." + +#define DRIVER_NAME "savage" +#define DRIVER_DESC "Savage4 Family" +#define DRIVER_DATE "20011023" + +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 0 +#define DRIVER_PATCHLEVEL 0 + +/* Currently Savage4 not implement DMA */ +/* mark off by Jiayo Hsu, Oct. 23, 2001*/ + + +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_SAVAGE_ALLOC_CONTINUOUS_MEM)] \ + = {savage_alloc_continuous_mem,1,0},\ + [DRM_IOCTL_NR( DRM_IOCTL_SAVAGE_GET_PHYSICS_ADDRESS)] \ + = {savage_get_physics_address,1,0},\ + [DRM_IOCTL_NR(DRM_IOCTL_SAVAGE_FREE_CONTINUOUS_MEM)] \ + = {savage_free_cont_mem,1,0} + +int savage_alloc_continuous_mem(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_savage_alloc_cont_mem_t cont_mem; + unsigned long size, addr; + void *ret; + int i; + mem_map_t *p; + pgprot_t flags; + + /* add to list */ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_map_t *map; + drm_map_list_t *list; + + dma_addr_t pa; + + if (copy_from_user(&cont_mem, (drm_savage_alloc_cont_mem_t *) arg, sizeof(cont_mem))) + return -EFAULT; + + /*check the parameters */ + if (cont_mem.size <= 0) + return -EINVAL; + if( 0xFFFFFFFFUL / cont_mem.size < cont_mem.type ) + return -EINVAL; + + map = DRM(alloc) (sizeof(*map), DRM_MEM_MAPS); + if (!map) + return -ENOMEM; + + size = cont_mem.type * cont_mem.size; + + ret = pci_alloc_consistent(/*FIXME*/NULL, size, &pa); + if (ret == NULL) + return -ENOMEM; + + /* Set the reserverd flag so that the remap_page_range can map these page */ + for (i = 0, p = virt_to_page(ret); i < size / PAGE_SIZE; i++, p++) + SetPageReserved(p); + + cont_mem.phyaddress = pa; + cont_mem.location = DRM_SAVAGE_MEM_LOCATION_PCI; /* pci only at present */ + + /*Map the memory to user space */ + down_write(¤t->mm->mmap_sem); + addr = do_mmap(NULL, 0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, cont_mem.phyaddress); + if ((unsigned long)addr > -1024UL) + { + up_write(¤t->mm->mmap_sem); + return -EINVAL; + } + pgprot_val(flags) = _PAGE_PRESENT | _PAGE_RW | _PAGE_USER; + if (remap_page_range(addr, cont_mem.phyaddress, size, flags)) + { + up_write(¤t->mm->mmap_sem); + return -EINVAL; + } + up_write(¤t->mm->mmap_sem); + + for (i = 0, p = virt_to_page(ret); i < size / PAGE_SIZE; i++, p++) + ClearPageReserved(p); + + cont_mem.linear = addr; + + /*map list */ + map->handle = ret; /* to distinguish with other */ + map->offset = cont_mem.phyaddress; + map->size = size; + map->mtrr = -1; + /*map-flags,type?? */ + + list = DRM(alloc) (sizeof(*list), DRM_MEM_MAPS); + if (!list) { + DRM(free) (map, sizeof(*map), DRM_MEM_MAPS); + return -EINVAL; + } + memset(list, 0, sizeof(*list)); + list->map = map; + + down(&dev->struct_sem); + list_add(&list->head, &dev->maplist->head); + up(&dev->struct_sem); + + if (copy_to_user((drm_savage_alloc_cont_mem_t *) arg, &cont_mem, sizeof(cont_mem))) + return -EFAULT; + +#warning "Race at the very least" + for (i = 0, p = virt_to_page(ret); i < size / PAGE_SIZE; i++, p++) + atomic_set(&p->count, 1); + + return 1; /*success */ +} + +int savage_get_physics_address(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + + drm_savage_get_physcis_address_t req; + unsigned long buf; + pgd_t *pgd; + pmd_t *pmd; + pte_t *pte; + struct mm_struct *mm; + + if (copy_from_user(&req, (drm_savage_get_physcis_address_t *) arg, sizeof(req))) + return -EFAULT; + buf = req.v_address; + +#warning "FIXME: need to redo logic for this" + /*What kind of virtual address ? */ + if (buf >= (unsigned long) high_memory) + mm = &init_mm; + else + mm = current->mm; + + spin_lock(&mm->page_table_lock); + + pgd = pgd_offset(mm, buf); + pmd = pmd_offset(pgd, buf); + pte = pte_offset(pmd, buf); + + if (!pte_present(*pte)) + { + spin_unlock(&mm->page_table_lock); + return -EINVAL; + } + req.p_address = ((pte_val(*pte) & PAGE_MASK) | (buf & (PAGE_SIZE - 1))); + spin_unlock(&mm->page_table_lock); + + if (copy_to_user((drm_savage_get_physcis_address_t *) arg, &req, sizeof(req))) + return -EFAULT; + return 1; +} + +/*free the continuous memory*/ +int savage_free_cont_mem(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_savage_alloc_cont_mem_t cont_mem; + unsigned long size; + + /*map list */ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_map_t *map; + struct list_head *list; + drm_map_list_t *r_list = NULL; + + if (copy_from_user(&cont_mem, (drm_savage_alloc_cont_mem_t *) arg, sizeof(cont_mem))) + return -EFAULT; +#warning "fix size overflow check" + size = cont_mem.type * cont_mem.size; + if (size <= 0) + return -EINVAL; + + /* find the map in the list */ + list_for_each(list, &dev->maplist->head) { + r_list = (drm_map_list_t *) list; + + if (r_list->map && r_list->map->offset == cont_mem.phyaddress) + break; + } + /*find none */ + if (list == (&dev->maplist->head)) { + up(&dev->struct_sem); + return -EINVAL; + } + map = r_list->map; + list_del(list); + DRM(free) (list, sizeof(*list), DRM_MEM_MAPS); + + /*unmap the user space */ + if (do_munmap(current->mm, cont_mem.linear, size) != 0) + return -EFAULT; + /*free the page */ + pci_free_consistent(NULL, size, map->handle, cont_mem.phyaddress); + + return 1; +} + + +#include "drm_agpsupport.h" +#include "drm_auth.h" +#include "drm_bufs.h" +#include "drm_context.h" +#include "drm_dma.h" +#include "drm_drawable.h" +#include "drm_drv.h" +#include "drm_fops.h" +#include "drm_init.h" +#include "drm_ioctl.h" +#include "drm_lock.h" +#include "drm_memory.h" +#include "drm_proc.h" +#include "drm_vm.h" +#include "drm_stub.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/savage_drv.h linux-2.4.23-pre8/drivers/char/drm/savage_drv.h --- linux-2.4.22/drivers/char/drm/savage_drv.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/savage_drv.h 2003-10-22 22:49:52.000000000 +0000 @@ -0,0 +1,27 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ +#ifndef __SAVAGE_DRV_H__ +#define __SAVAGE_DRV_H__ + +#endif /* end #ifndef __SAVAGE_DRV_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/savage_state.c linux-2.4.23-pre8/drivers/char/drm/savage_state.c --- linux-2.4.22/drivers/char/drm/savage_state.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/savage_state.c 2003-10-22 22:47:30.000000000 +0000 @@ -0,0 +1,23 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/sis.h linux-2.4.23-pre8/drivers/char/drm/sis.h --- linux-2.4.22/drivers/char/drm/sis.h 2001-12-21 17:41:53.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/sis.h 2003-10-22 22:48:00.000000000 +0000 @@ -24,7 +24,7 @@ * DEALINGS IN THE SOFTWARE. * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis.h,v 1.1 2001/05/19 18:29:22 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/sis.h,v 1.2 2001/12/19 21:25:59 dawes Exp $ */ #ifndef __SIS_H__ #define __SIS_H__ @@ -42,6 +42,31 @@ #define __HAVE_MTRR 1 #define __HAVE_CTX_BITMAP 1 +#define DRIVER_AUTHOR "SIS" +#define DRIVER_NAME "sis" +#define DRIVER_DESC "SIS 300/630/540" +#define DRIVER_DATE "20010503" +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 0 +#define DRIVER_PATCHLEVEL 0 + +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(SIS_IOCTL_FB_ALLOC)] = { sis_fb_alloc, 1, 0 }, \ + [DRM_IOCTL_NR(SIS_IOCTL_FB_FREE)] = { sis_fb_free, 1, 0 }, \ + /* AGP Memory Management */ \ + [DRM_IOCTL_NR(SIS_IOCTL_AGP_INIT)] = { sisp_agp_init, 1, 0 }, \ + [DRM_IOCTL_NR(SIS_IOCTL_AGP_ALLOC)] = { sisp_agp_alloc, 1, 0 }, \ + [DRM_IOCTL_NR(SIS_IOCTL_AGP_FREE)] = { sisp_agp_free, 1, 0 } +#if 0 /* these don't appear to be defined */ + /* SIS Stereo */ + [DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = { sis_control, 1, 1 }, + [DRM_IOCTL_NR(SIS_IOCTL_FLIP)] = { sis_flip, 1, 1 }, + [DRM_IOCTL_NR(SIS_IOCTL_FLIP_INIT)] = { sis_flip_init, 1, 1 }, + [DRM_IOCTL_NR(SIS_IOCTL_FLIP_FINAL)] = { sis_flip_final, 1, 1 } +#endif + +#define __HAVE_COUNTERS 5 + /* Buffer customization: */ #define DRIVER_AGP_BUFFERS_MAP( dev ) \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/sis_drm.h linux-2.4.23-pre8/drivers/char/drm/sis_drm.h --- linux-2.4.22/drivers/char/drm/sis_drm.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/sis_drm.h 2003-10-22 22:49:55.000000000 +0000 @@ -2,6 +2,16 @@ #ifndef _sis_drm_public_h_ #define _sis_drm_public_h_ +/* SiS specific ioctls */ +#define SIS_IOCTL_FB_ALLOC DRM_IOWR(0x44, drm_sis_mem_t) +#define SIS_IOCTL_FB_FREE DRM_IOW( 0x45, drm_sis_mem_t) +#define SIS_IOCTL_AGP_INIT DRM_IOWR(0x53, drm_sis_agp_t) +#define SIS_IOCTL_AGP_ALLOC DRM_IOWR(0x54, drm_sis_mem_t) +#define SIS_IOCTL_AGP_FREE DRM_IOW( 0x55, drm_sis_mem_t) +#define SIS_IOCTL_FLIP DRM_IOW( 0x48, drm_sis_flip_t) +#define SIS_IOCTL_FLIP_INIT DRM_IO( 0x49) +#define SIS_IOCTL_FLIP_FINAL DRM_IO( 0x50) + typedef struct { int context; unsigned int offset; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/sis_drv.c linux-2.4.23-pre8/drivers/char/drm/sis_drv.c --- linux-2.4.22/drivers/char/drm/sis_drv.c 2002-02-25 19:37:57.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/sis_drv.c 2003-10-22 22:47:29.000000000 +0000 @@ -31,31 +31,6 @@ #include "sis_drm.h" #include "sis_drv.h" -#define DRIVER_AUTHOR "SIS" -#define DRIVER_NAME "sis" -#define DRIVER_DESC "SIS 300/630/540" -#define DRIVER_DATE "20010503" -#define DRIVER_MAJOR 1 -#define DRIVER_MINOR 0 -#define DRIVER_PATCHLEVEL 0 - -#define DRIVER_IOCTLS \ - [DRM_IOCTL_NR(SIS_IOCTL_FB_ALLOC)] = { sis_fb_alloc, 1, 0 }, \ - [DRM_IOCTL_NR(SIS_IOCTL_FB_FREE)] = { sis_fb_free, 1, 0 }, \ - /* AGP Memory Management */ \ - [DRM_IOCTL_NR(SIS_IOCTL_AGP_INIT)] = { sisp_agp_init, 1, 0 }, \ - [DRM_IOCTL_NR(SIS_IOCTL_AGP_ALLOC)] = { sisp_agp_alloc, 1, 0 }, \ - [DRM_IOCTL_NR(SIS_IOCTL_AGP_FREE)] = { sisp_agp_free, 1, 0 } -#if 0 /* these don't appear to be defined */ - /* SIS Stereo */ - [DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = { sis_control, 1, 1 }, - [DRM_IOCTL_NR(SIS_IOCTL_FLIP)] = { sis_flip, 1, 1 }, - [DRM_IOCTL_NR(SIS_IOCTL_FLIP_INIT)] = { sis_flip_init, 1, 1 }, - [DRM_IOCTL_NR(SIS_IOCTL_FLIP_FINAL)] = { sis_flip_final, 1, 1 } -#endif - -#define __HAVE_COUNTERS 5 - #include "drm_auth.h" #include "drm_agpsupport.h" #include "drm_bufs.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/sis_ds.c linux-2.4.23-pre8/drivers/char/drm/sis_ds.c --- linux-2.4.22/drivers/char/drm/sis_ds.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/sis_ds.c 2003-10-22 22:48:15.000000000 +0000 @@ -49,16 +49,19 @@ set_t *set; set = (set_t *)MALLOC(sizeof(set_t)); - if (set) { + if(set) + { for(i = 0; i < SET_SIZE; i++){ set->list[i].free_next = i+1; set->list[i].alloc_next = -1; - } + } + set->list[SET_SIZE-1].free_next = -1; set->free = 0; set->alloc = -1; set->trace = -1; } + return set; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/tdfx_drv.c linux-2.4.23-pre8/drivers/char/drm/tdfx_drv.c --- linux-2.4.22/drivers/char/drm/tdfx_drv.c 2001-08-27 14:40:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/tdfx_drv.c 2003-10-22 22:48:57.000000000 +0000 @@ -82,25 +82,6 @@ #include "drm_drawable.h" #include "drm_drv.h" -#ifndef MODULE -/* DRM(options) is called by the kernel to parse command-line options - * passed via the boot-loader (e.g., LILO). It calls the insmod option - * routine, drm_parse_drm. - */ - -/* JH- We have to hand expand the string ourselves because of the cpp. If - * anyone can think of a way that we can fit into the __setup macro without - * changing it, then please send the solution my way. - */ -static int __init tdfx_options( char *str ) -{ - DRM(parse_options)( str ); - return 1; -} - -__setup( DRIVER_NAME "=", tdfx_options ); -#endif - #include "drm_fops.h" #include "drm_init.h" #include "drm_ioctl.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via.h linux-2.4.23-pre8/drivers/char/drm/via.h --- linux-2.4.22/drivers/char/drm/via.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via.h 2003-10-22 22:47:59.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ +#ifndef __VIA_H__ +#define __VIA_H__ + + +#define DRM(x) viadrv_##x + + +#define __HAVE_AGP 1 +#define __MUST_HAVE_AGP 0 +#define __HAVE_MTRR 1 +#define __HAVE_CTX_BITMAP 1 + + +#define DRIVER_AGP_BUFFERS_MAP( dev ) \ + ((drm_via_private_t *)((dev)->dev_private))->buffers + +extern int via_init_context(int context); +extern int via_final_context(int context); + +#define DRIVER_CTX_CTOR via_init_context +#define DRIVER_CTX_DTOR via_final_context + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via_drm.h linux-2.4.23-pre8/drivers/char/drm/via_drm.h --- linux-2.4.22/drivers/char/drm/via_drm.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via_drm.h 2003-10-22 22:48:57.000000000 +0000 @@ -0,0 +1,156 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ +#ifndef _VIA_DRM_H_ +#define _VIA_DRM_H_ + +/* WARNING: These defines must be the same as what the Xserver uses. + * if you change them, you must change the defines in the Xserver. + */ + +#ifndef _VIA_DEFINES_ +#define _VIA_DEFINES_ + +#define VIA_DMA_BUF_ORDER 12 +#define VIA_DMA_BUF_SZ (1 << VIA_DMA_BUF_ORDER) +#define VIA_DMA_BUF_NR 256 +#define VIA_NR_SAREA_CLIPRECTS 8 + +/* Each region is a minimum of 64k, and there are at most 64 of them. + */ +#define VIA_NR_TEX_REGIONS 64 +#define VIA_LOG_MIN_TEX_REGION_SIZE 16 +#endif + +#define VIA_UPLOAD_TEX0IMAGE 0x1 /* handled clientside */ +#define VIA_UPLOAD_TEX1IMAGE 0x2 /* handled clientside */ +#define VIA_UPLOAD_CTX 0x4 +#define VIA_UPLOAD_BUFFERS 0x8 +#define VIA_UPLOAD_TEX0 0x10 +#define VIA_UPLOAD_TEX1 0x20 +#define VIA_UPLOAD_CLIPRECTS 0x40 +#define VIA_UPLOAD_ALL 0xff + +/* VIA specific ioctls */ +#define DRM_IOCTL_VIA_ALLOCMEM DRM_IOWR(0x40, drm_via_mem_t) +#define DRM_IOCTL_VIA_FREEMEM DRM_IOW(0x41, drm_via_mem_t) +#define DRM_IOCTL_VIA_AGP_INIT DRM_IOWR(0x42, drm_via_agp_t) +#define DRM_IOCTL_VIA_FB_INIT DRM_IOWR(0x43, drm_via_fb_t) +#define DRM_IOCTL_VIA_MAP_INIT DRM_IOWR(0x44, drm_via_init_t) + +/* Indices into buf.Setup where various bits of state are mirrored per + * context and per buffer. These can be fired at the card as a unit, + * or in a piecewise fashion as required. + */ + +#define VIA_TEX_SETUP_SIZE 8 + +/* Flags for clear ioctl + */ +#define VIA_FRONT 0x1 +#define VIA_BACK 0x2 +#define VIA_DEPTH 0x4 +#define VIA_STENCIL 0x8 +#define VIDEO 0 +#define AGP 1 + +typedef struct { + unsigned int offset; + unsigned int size; +} drm_via_agp_t; + +typedef struct { + unsigned int offset; + unsigned int size; +} drm_via_fb_t; + +typedef struct { + unsigned int context; + unsigned int type; + unsigned int size; + unsigned long index; + unsigned long offset; +} drm_via_mem_t; + +typedef struct _drm_via_init { + enum { + VIA_INIT_MAP = 0x01, + VIA_CLEANUP_MAP = 0x02 + } func; + + unsigned long sarea_priv_offset; + unsigned long fb_offset; + unsigned long mmio_offset; + unsigned long agpAddr; +} drm_via_init_t; + +/* Warning: If you change the SAREA structure you must change the Xserver + * structure as well */ + +typedef struct _drm_via_tex_region { + unsigned char next, prev; /* indices to form a circular LRU */ + unsigned char inUse; /* owned by a client, or free? */ + int age; /* tracked by clients to update local LRU's */ +} drm_via_tex_region_t; + +typedef struct _drm_via_sarea { + unsigned int dirty; + unsigned int nbox; + drm_clip_rect_t boxes[VIA_NR_SAREA_CLIPRECTS]; + drm_via_tex_region_t texList[VIA_NR_TEX_REGIONS + 1]; + int texAge; /* last time texture was uploaded */ + int ctxOwner; /* last context to upload state */ + int vertexPrim; +} drm_via_sarea_t; + +typedef struct _drm_via_flush_agp { + unsigned int offset; + unsigned int size; + unsigned int index; + int discard; /* client is finished with the buffer? */ +} drm_via_flush_agp_t; + +typedef struct _drm_via_flush_sys { + unsigned int offset; + unsigned int size; + unsigned long index; + int discard; /* client is finished with the buffer? */ +} drm_via_flush_sys_t; + +#ifdef __KERNEL__ +int via_fb_init(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); +int via_mem_alloc(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); +int via_mem_free(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); +int via_agp_init(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); +int via_dma_alloc(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); +int via_dma_free(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); +int via_map_init(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg); +#endif +#endif /* _VIA_DRM_H_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via_drv.c linux-2.4.23-pre8/drivers/char/drm/via_drv.c --- linux-2.4.22/drivers/char/drm/via_drv.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via_drv.c 2003-10-22 22:48:19.000000000 +0000 @@ -0,0 +1,66 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ +#include +#include "via.h" +#include "drmP.h" +#include "via_drm.h" +#include "via_drv.h" + +#define DRIVER_AUTHOR "VIA" + +#define DRIVER_NAME "via" +#define DRIVER_DESC "VIA CLE 266" +#define DRIVER_DATE "20020814" + +#define DRIVER_MAJOR 1 +#define DRIVER_MINOR 1 +#define DRIVER_PATCHLEVEL 0 + + +#define DRIVER_IOCTLS \ + [DRM_IOCTL_NR(DRM_IOCTL_VIA_ALLOCMEM)] = { via_mem_alloc, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_VIA_FREEMEM)] = { via_mem_free, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_VIA_AGP_INIT)] = { via_agp_init, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_VIA_FB_INIT)] = { via_fb_init, 1, 0 }, \ + [DRM_IOCTL_NR(DRM_IOCTL_VIA_MAP_INIT)] = { via_map_init, 1, 0 } + + +#define __HAVE_COUNTERS 0 + +#include "drm_auth.h" +#include "drm_agpsupport.h" +#include "drm_bufs.h" +#include "drm_context.h" +#include "drm_dma.h" +#include "drm_drawable.h" +#include "drm_drv.h" +#include "drm_fops.h" +#include "drm_init.h" +#include "drm_ioctl.h" +#include "drm_lists.h" +#include "drm_lock.h" +#include "drm_memory.h" +#include "drm_proc.h" +#include "drm_vm.h" +#include "drm_stub.h" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via_drv.h linux-2.4.23-pre8/drivers/char/drm/via_drv.h --- linux-2.4.22/drivers/char/drm/via_drv.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via_drv.h 2003-10-22 22:49:21.000000000 +0000 @@ -0,0 +1,149 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ +#ifndef _VIA_DRV_H_ +#define _VIA_DRV_H_ + +typedef struct drm_via_private { + drm_via_sarea_t *sarea_priv; + drm_map_t *sarea; + drm_map_t *fb; + drm_map_t *mmio; + unsigned long agpAddr; +} drm_via_private_t; + +extern int via_do_init_map(drm_device_t *dev, drm_via_init_t *init); +extern int via_do_cleanup_map(drm_device_t *dev); +extern int via_map_init(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); + +/*=* [DBG] For RedHat7.3 insert kernel module has unresolved symbol + cmpxchg() *=*/ + +/* Include this here so that driver can be used with older kernels. */ +#ifndef __HAVE_ARCH_CMPXCHG + +#ifdef CONFIG_SMP +#define LOCK_PREFIX "lock ; " +#else +#define LOCK_PREFIX "" +#endif + +#if defined(__alpha__) +static __inline__ unsigned long +__cmpxchg_u32(volatile int *m, int old, int new) +{ + unsigned long prev, cmp; + + __asm__ __volatile__( + "1: ldl_l %0,%2\n" + " cmpeq %0,%3,%1\n" + " beq %1,2f\n" + " mov %4,%1\n" + " stl_c %1,%2\n" + " beq %1,3f\n" + "2: mb\n" + ".subsection 2\n" + "3: br 1b\n" + ".previous" + : "=&r"(prev), "=&r"(cmp), "=m"(*m) + : "r"((long) old), "r"(new), "m"(*m)); + + return prev; +} + +static __inline__ unsigned long +__cmpxchg_u64(volatile long *m, unsigned long old, unsigned long new) +{ + unsigned long prev, cmp; + + __asm__ __volatile__( + "1: ldq_l %0,%2\n" + " cmpeq %0,%3,%1\n" + " beq %1,2f\n" + " mov %4,%1\n" + " stq_c %1,%2\n" + " beq %1,3f\n" + "2: mb\n" + ".subsection 2\n" + "3: br 1b\n" + ".previous" + : "=&r"(prev), "=&r"(cmp), "=m"(*m) + : "r"((long) old), "r"(new), "m"(*m)); + + return prev; +} + +static __inline__ unsigned long +__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) +{ + switch (size) { + case 4: + return __cmpxchg_u32(ptr, old, new); + case 8: + return __cmpxchg_u64(ptr, old, new); + } + return old; +} +#define cmpxchg(ptr,o,n) \ + ({ \ + __typeof__(*(ptr)) _o_ = (o); \ + __typeof__(*(ptr)) _n_ = (n); \ + (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \ + (unsigned long)_n_, sizeof(*(ptr))); \ + }) + +#elif __i386__ +static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, + unsigned long new, int size) +{ + unsigned long prev; + switch (size) { + case 1: + __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2" + : "=a"(prev) + : "q"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); + return prev; + case 2: + __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2" + : "=a"(prev) + : "q"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); + return prev; + case 4: + __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2" + : "=a"(prev) + : "q"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); + return prev; + } + return old; +} + +#define cmpxchg(ptr,o,n) \ + ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o), \ + (unsigned long)(n),sizeof(*(ptr)))) +#endif /* i386 & alpha */ +#endif +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via_ds.c linux-2.4.23-pre8/drivers/char/drm/via_ds.c --- linux-2.4.22/drivers/char/drm/via_ds.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via_ds.c 2003-10-22 22:49:41.000000000 +0000 @@ -0,0 +1,395 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + * + * Fixes: + * Changed to use via_ prefixes on globals + * Fixed malloc failure paths + * Reformatted to Linux style + * Removed ITEM_TYPE typedef, FREE/MALLOC and other macro bits + */ + +#define __NO_VERSION__ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "via_ds.h" + +#warning "Fix variable/global names to use via_" + +extern unsigned int VIA_DEBUG; + +set_t *via_set_init(void) +{ + int i; + set_t *set; + set = (set_t *)kmalloc(sizeof(set_t), GFP_KERNEL); + if(set == NULL) + return NULL; + for (i = 0; i < SET_SIZE; i++) { + set->list[i].free_next = i + 1; + set->list[i].alloc_next = -1; + } + set->list[SET_SIZE - 1].free_next = -1; + set->free = 0; + set->alloc = -1; + set->trace = -1; + return set; +} + +int via_set_add(set_t * set, unsigned int item) +{ + int free = set->free; + if (free != -1) { + set->list[free].val = item; + set->free = set->list[free].free_next; + } else { + return 0; + } + set->list[free].alloc_next = set->alloc; + set->alloc = free; + set->list[free].free_next = -1; + return 1; +} + +int via_set_del(set_t * set, unsigned int item) +{ + int alloc = set->alloc; + int prev = -1; + + while (alloc != -1) { + if (set->list[alloc].val == item) { + if (prev != -1) + set->list[prev].alloc_next = set->list[alloc].alloc_next; + else + set->alloc = set->list[alloc].alloc_next; + break; + } + prev = alloc; + alloc = set->list[alloc].alloc_next; + } + + if (alloc == -1) + return 0; + + set->list[alloc].free_next = set->free; + set->free = alloc; + set->list[alloc].alloc_next = -1; + + return 1; +} + +/* setFirst -> setAdd -> setNext is wrong */ + +int via_set_first(set_t * set, unsigned int * item) +{ + if (set->alloc == -1) + return 0; + + *item = set->list[set->alloc].val; + set->trace = set->list[set->alloc].alloc_next; + + + return 1; +} + +int via_set_next(set_t * set, unsigned int * item) +{ + if (set->trace == -1) + return 0; + + *item = set->list[set->trace].val; + set->trace = set->list[set->trace].alloc_next; + + return 1; +} + +int via_set_destroy(set_t * set) +{ + kfree(set); + return 1; +} + +#define ISFREE(bptr) ((bptr)->free) + +#define PRINTF(fmt, arg...) do{}while(0) + +void via_mmDumpMemInfo(memHeap_t * heap) +{ + TMemBlock *p; + + PRINTF("Memory heap %p:\n", heap); + + if (heap == 0) + PRINTF(" heap == 0\n"); + else { + p = (TMemBlock *) heap; + + while (p) { + PRINTF(" Offset:%08x, Size:%08x, %c%c\n", p->ofs, p->size, p->free ? '.' : 'U', p->reserved ? 'R' : '.'); + p = p->next; + } + } + + PRINTF("End of memory blocks\n"); +} + +memHeap_t *via_mmInit(int ofs, int size) +{ + PMemBlock blocks; + + if (size <= 0) + return 0; + + + blocks = (TMemBlock *) kmalloc(sizeof(TMemBlock), GFP_KERNEL); + + if (blocks) { + memset(blocks, 0, sizeof(TMemBlock)); + blocks->ofs = ofs; + blocks->size = size; + blocks->free = 1; + return (memHeap_t *) blocks; + } else + return NULL; +} + +memHeap_t *via_mmAddRange(memHeap_t * heap, int ofs, int size) +{ + PMemBlock blocks; + blocks = (TMemBlock *) kmalloc(2 * sizeof(TMemBlock), GFP_KERNEL); + + if (blocks) { + memset(blocks, 0, 2 * sizeof(TMemBlock)); + blocks[0].size = size; + blocks[0].free = 1; + blocks[0].ofs = ofs; + blocks[0].next = &blocks[1]; + + /* Discontinuity - stops JoinBlock from trying to join non-adjacent + * ranges. + */ + blocks[1].size = 0; + blocks[1].free = 0; + blocks[1].ofs = ofs + size; + blocks[1].next = (PMemBlock) heap; + return (memHeap_t *) blocks; + } else + return heap; +} + +static TMemBlock *SliceBlock(TMemBlock * p, int startofs, int size, int reserved, int alignment) +{ + TMemBlock *newblock; + + /* break left */ + if (startofs > p->ofs) { + newblock = (TMemBlock *) kmalloc(sizeof(TMemBlock), GFP_KERNEL); + if(newblock == NULL) + return NULL; + memset(newblock, 0, sizeof(TMemBlock)); + newblock->ofs = startofs; + newblock->size = p->size - (startofs - p->ofs); + newblock->free = 1; + newblock->next = p->next; + p->size -= newblock->size; + p->next = newblock; + p = newblock; + } + + /* break right */ + if (size < p->size) { + newblock = (TMemBlock *) kmalloc(sizeof(TMemBlock), GFP_KERNEL); + if(newblock == NULL) + return NULL; + memset(newblock, 0, sizeof(TMemBlock)); + newblock->ofs = startofs + size; + newblock->size = p->size - size; + newblock->free = 1; + newblock->next = p->next; + p->size = size; + p->next = newblock; + } + + /* p = middle block */ + p->align = alignment; + p->free = 0; + p->reserved = reserved; + return p; +} + +PMemBlock via_mmAllocMem(memHeap_t * heap, int size, int align2, int startSearch) +{ + int mask, startofs, endofs; + TMemBlock *p; + + if (!heap || align2 < 0 || size <= 0) + return NULL; + + mask = (1 << align2) - 1; + startofs = 0; + p = (TMemBlock *) heap; + + while (p) { + if (ISFREE(p)) { + startofs = (p->ofs + mask) & ~mask; + + if (startofs < startSearch) + startofs = startSearch; + + endofs = startofs + size; + + if (endofs <= (p->ofs + p->size)) + break; + } + + p = p->next; + } + + if (!p) + return NULL; + + p = SliceBlock(p, startofs, size, 0, mask + 1); + p->heap = heap; + + return p; +} + +static __inline__ int Join2Blocks(TMemBlock * p) +{ + if (p->free && p->next && p->next->free) { + TMemBlock *q = p->next; + p->size += q->size; + p->next = q->next; + kfree(q); + + return 1; + } + + return 0; +} + +int via_mmFreeMem(PMemBlock b) +{ + TMemBlock *p, *prev; + + if (!b) + return 0; + + if (!b->heap) { + return -1; + } + + p = b->heap; + prev = NULL; + + while (p && p != b) { + prev = p; + p = p->next; + } + + if (!p || p->free || p->reserved) { + if (!p) + BUG(); + else if (p->free) + BUG(); + else + BUG(); + return -1; + } + + p->free = 1; + Join2Blocks(p); + + if (prev) + Join2Blocks(prev); + + return 0; +} + +int via_mm_ReserveMem(memHeap_t * heap, int offset, int size) +{ + int endofs; + TMemBlock *p; + + if (!heap || size <= 0) + return -1; + endofs = offset + size; + p = (TMemBlock *) heap; + + while (p && p->ofs <= offset) { + if (ISFREE(p) && endofs <= (p->ofs + p->size)) { + SliceBlock(p, offset, size, 1, 1); + return 0; + } + p = p->next; + } + return -1; +} + +int via_mm_FreeReserved(memHeap_t * heap, int offset) +{ + TMemBlock *p, *prev; + + if (!heap) + return -1; + + p = (TMemBlock *) heap; + prev = NULL; + + while (p && p->ofs != offset) { + prev = p; + p = p->next; + } + + if (!p || !p->reserved) + return -1; + p->free = 1; + p->reserved = 0; + Join2Blocks(p); + + if (prev) + Join2Blocks(prev); + + return 0; +} + +void via_mm_Destroy(memHeap_t * heap) +{ + TMemBlock *p, *q; + + if (!heap) + return; + p = (TMemBlock *) heap; + + while (p) { + q = p->next; + kfree(p); + p = q; + } +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via_ds.h linux-2.4.23-pre8/drivers/char/drm/via_ds.h --- linux-2.4.22/drivers/char/drm/via_ds.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via_ds.h 2003-10-22 22:48:28.000000000 +0000 @@ -0,0 +1,134 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ + +#ifndef _via_ds_h_ +#define _via_ds_h_ + +/* Set Data Structure */ + +#define SET_SIZE 5000 + +typedef struct { + unsigned int val; + int alloc_next, free_next; +} list_item_t; + +typedef struct { + int alloc; + int free; + int trace; + list_item_t list[SET_SIZE]; +} set_t; + +set_t *via_set_init(void); +int via_set_add(set_t *set, unsigned int item); +int via_set_del(set_t *set, unsigned int item); +int via_set_first(set_t *set, unsigned int *item); +int via_set_next(set_t *set, unsigned int *item); +int via_set_destroy(set_t *set); + +#endif + + +#ifndef MM_INC +#define MM_INC + +struct mem_block_t { + struct mem_block_t *next; + struct mem_block_t *heap; + int ofs,size; + int align; + int free:1; + int reserved:1; +}; +typedef struct mem_block_t TMemBlock; +typedef struct mem_block_t *PMemBlock; + +/* a heap is just the first block in a chain */ +typedef struct mem_block_t memHeap_t; + +static __inline__ int mmBlockSize(PMemBlock b) +{ + return b->size; +} + +static __inline__ int mmOffset(PMemBlock b) +{ + return b->ofs; +} + +static __inline__ void mmMarkReserved(PMemBlock b) +{ + b->reserved = 1; +} + +/* + * input: total size in bytes + * return: a heap pointer if OK, NULL if error + */ + +memHeap_t *via_mmInit(int ofs, int size); + +memHeap_t *via_mmAddRange(memHeap_t *heap, int ofs, int size); + + +/* + * Allocate 'size' bytes with 2^align2 bytes alignment, + * restrict the search to free memory after 'startSearch' + * depth and back buffers should be in different 4mb banks + * to get better page hits if possible + * input: size = size of block + * align2 = 2^align2 bytes alignment + * startSearch = linear offset from start of heap to begin search + * return: pointer to the allocated block, 0 if error + */ + +PMemBlock via_mmAllocMem(memHeap_t *heap, int size, int align2, int startSearch); + +/* + * Free block starts at offset + * input: pointer to a block + * return: 0 if OK, -1 if error + */ +int via_mmFreeMem(PMemBlock b); + +/* + * Reserve 'size' bytes block start at offset + * This is used to prevent allocation of memory already used + * by the X server for the front buffer, pixmaps, and cursor + * input: size, offset + * output: 0 if OK, -1 if error + */ +int via_mmReserveMem(memHeap_t *heap, int offset,int size); +int via_mmFreeReserved(memHeap_t *heap, int offset); + +/* + * destroy MM + */ +void via_mmDestroy(memHeap_t *mmInit); + +/* For debuging purpose. */ +void via_mmDumpMemInfo(memHeap_t *mmInit); + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via_map.c linux-2.4.23-pre8/drivers/char/drm/via_map.c --- linux-2.4.22/drivers/char/drm/via_map.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via_map.c 2003-10-22 22:47:38.000000000 +0000 @@ -0,0 +1,118 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ +#define __NO_VERSION__ +#include "via.h" +#include "drmP.h" +#include "via_drv.h" + +int via_do_init_map(drm_device_t *dev, drm_via_init_t *init) +{ + drm_via_private_t *dev_priv; + struct list_head *list; + + DRM_DEBUG("%s\n", __FUNCTION__); + + dev_priv = DRM(alloc)(sizeof(drm_via_private_t), DRM_MEM_DRIVER); + if (dev_priv == NULL) + return -ENOMEM; + + memset(dev_priv, 0, sizeof(drm_via_private_t)); + + list_for_each(list, &dev->maplist->head) { + drm_map_list_t *r_list = (drm_map_list_t *)list; + if ( r_list->map && + r_list->map->type == _DRM_SHM && + r_list->map->flags & _DRM_CONTAINS_LOCK) { + dev_priv->sarea = r_list->map; + break; + } + } + if (!dev_priv->sarea) { + DRM_ERROR("could not find sarea!\n"); + dev->dev_private = (void *)dev_priv; + via_do_cleanup_map(dev); + return -EINVAL; + } + + DRM_FIND_MAP(dev_priv->fb, init->fb_offset); + if (!dev_priv->fb) { + DRM_ERROR("could not find framebuffer!\n"); + dev->dev_private = (void *)dev_priv; + via_do_cleanup_map(dev); + return -EINVAL; + } + DRM_FIND_MAP(dev_priv->mmio, init->mmio_offset); + if (!dev_priv->mmio) { + DRM_ERROR("could not find mmio region!\n"); + dev->dev_private = (void *)dev_priv; + via_do_cleanup_map(dev); + return -EINVAL; + } + + dev_priv->sarea_priv = (drm_via_sarea_t *)((u8 *)dev_priv->sarea->handle + + init->sarea_priv_offset); + + dev_priv->agpAddr = init->agpAddr; + + dev->dev_private = (void *)dev_priv; + + return 0; +} + +int via_do_cleanup_map(drm_device_t *dev) +{ + if (dev->dev_private) { + + drm_via_private_t *dev_priv = dev->dev_private; + + DRM(free)(dev_priv, sizeof(drm_via_private_t), + DRM_MEM_DRIVER); + dev->dev_private = NULL; + } + + return 0; +} + +int via_map_init(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + drm_via_init_t init; + + DRM_DEBUG("%s\n", __FUNCTION__); + + if (copy_from_user(&init, (drm_via_init_t *)arg, sizeof(init))) + return -EFAULT; + + switch (init.func) { + case VIA_INIT_MAP: + return via_do_init_map(dev, &init); + case VIA_CLEANUP_MAP: + return via_do_cleanup_map(dev); + } + + return -EINVAL; +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via_mm.c linux-2.4.23-pre8/drivers/char/drm/via_mm.c --- linux-2.4.22/drivers/char/drm/via_mm.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via_mm.c 2003-10-22 22:48:54.000000000 +0000 @@ -0,0 +1,338 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ + +#define __NO_VERSION__ +#include "via.h" +#include "drmP.h" +#include "via_drm.h" +#include "via_drv.h" +#include "via_ds.h" +#include "via_mm.h" + +#define MAX_CONTEXT 100 + +unsigned int VIA_DEBUG = 1; + +typedef struct { + int used; + int context; + set_t *sets[2]; /* 0 for frame buffer, 1 for AGP , 2 for System*/ +} via_context_t; + +static via_context_t global_ppriv[MAX_CONTEXT]; + +static int add_alloc_set(int context, int type, unsigned int val) +{ + int i, retval = 0; + + for (i = 0; i < MAX_CONTEXT; i++) + { + if (global_ppriv[i].used && global_ppriv[i].context == context) + { + retval = via_set_add(global_ppriv[i].sets[type], val); + break; + } + } + return retval; +} + +static int del_alloc_set(int context, int type, unsigned int val) +{ + int i, retval = 0; + + for (i = 0; i < MAX_CONTEXT; i++) + if (global_ppriv[i].used && global_ppriv[i].context == context) + { + retval = via_set_del(global_ppriv[i].sets[type], val); + break; + } + return retval; +} + +/* agp memory management */ + +static memHeap_t *AgpHeap = NULL; + +#warning "FIXME: heap re-init cases ?" +int via_agp_init(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg) +{ + drm_via_agp_t agp; + + if (copy_from_user(&agp, (drm_via_agp_t *)arg, sizeof(agp))) + return -EFAULT; + + AgpHeap = via_mmInit(agp.offset, agp.size); + + DRM_DEBUG("offset = %u, size = %u", agp.offset, agp.size); + return 0; +} + +/* fb memory management */ +static memHeap_t *FBHeap = NULL; + +int via_fb_init(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg) +{ + drm_via_fb_t fb; + + if (copy_from_user(&fb, (drm_via_fb_t *)arg, sizeof(fb))) + return -EFAULT; + + FBHeap = via_mmInit(fb.offset, fb.size); + DRM_DEBUG("offset = %u, size = %u", fb.offset, fb.size); + + return 0; +} + +int via_init_context(int context) +{ + int i; + + for (i = 0; i < MAX_CONTEXT ; i++) + if (global_ppriv[i].used && (global_ppriv[i].context == context)) + break; + + if (i >= MAX_CONTEXT) { + for (i = 0; i < MAX_CONTEXT ; i++) { + if (!global_ppriv[i].used) { + global_ppriv[i].context = context; + global_ppriv[i].used = 1; + global_ppriv[i].sets[0] = via_set_init(); + global_ppriv[i].sets[1] = via_set_init(); + DRM_DEBUG("init allocation set, socket=%d, context = %d\n", + i, context); + break; + } + } + + if ((i >= MAX_CONTEXT) || (global_ppriv[i].sets[0] == NULL) || + (global_ppriv[i].sets[1] == NULL)) { + return 0; + } + } + + return 1; +} + +int via_final_context(int context) +{ + int i; + for (i=0; isize; + fb.context = mem->context; + + block = via_mmAllocMem(FBHeap, fb.size, 5, 0); + if (block) { + fb.offset = block->ofs; + fb.free = (unsigned int)block; + if (!add_alloc_set(fb.context, VIDEO, fb.free)) { + DRM_DEBUG("adding to allocation set fails\n"); + via_mmFreeMem((PMemBlock)fb.free); + retval = -1; + } + } else { + fb.offset = 0; + fb.size = 0; + fb.free = 0; + } + + mem->offset = fb.offset; + mem->index = fb.free; + + DRM_DEBUG("alloc fb, size = %d, offset = %d\n", fb.size, (int)fb.offset); + + return retval; +} + +int via_agp_alloc(drm_via_mem_t* mem) +{ + drm_via_mm_t agp; + PMemBlock block; + int retval = 0; + + if (!AgpHeap) + return -1; + + agp.size = mem->size; + agp.context = mem->context; + + block = via_mmAllocMem(AgpHeap, agp.size, 5, 0); + if (block) { + agp.offset = block->ofs; + agp.free = (unsigned int)block; + if (!add_alloc_set(agp.context, AGP, agp.free)) { + DRM_DEBUG("adding to allocation set fails\n"); + via_mmFreeMem((PMemBlock)agp.free); + retval = -1; + } + } else { + agp.offset = 0; + agp.size = 0; + agp.free = 0; + } + + mem->offset = agp.offset; + mem->index = agp.free; + + DRM_DEBUG("alloc agp, size = %d, offset = %d\n", agp.size, (unsigned int)agp.offset); + return retval; +} + +int via_mem_free(struct inode *inode, struct file *filp, unsigned int cmd, + unsigned long arg) +{ + drm_via_mem_t mem; + + if (copy_from_user(&mem, (drm_via_mem_t *)arg, sizeof(mem))) + return -EFAULT; + + switch (mem.type) + { + case VIDEO : + if (via_fb_free(&mem) == 0) + return 0; + break; + case AGP : + if (via_agp_free(&mem) == 0) + return 0; + break; + } + return -EINVAL; +} + +int via_fb_free(drm_via_mem_t* mem) +{ + drm_via_mm_t fb; + int retval = 0; + + + if (!FBHeap) + return -1; + + fb.free = mem->index; + fb.context = mem->context; + + if (!fb.free) + return -1; + + via_mmFreeMem((PMemBlock)fb.free); + + if (!del_alloc_set(fb.context, VIDEO, fb.free)) + retval = -1; + + DRM_DEBUG("free fb, free = %d\n", fb.free); + + return retval; +} + +int via_agp_free(drm_via_mem_t* mem) +{ + drm_via_mm_t agp; + + int retval = 0; + + agp.free = mem->index; + agp.context = mem->context; + + if (!agp.free) + return -1; + + via_mmFreeMem((PMemBlock)agp.free); + + if (!del_alloc_set(agp.context, AGP, agp.free)) + retval = -1; + + DRM_DEBUG("free agp, free = %d\n", agp.free); + return retval; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm/via_mm.h linux-2.4.23-pre8/drivers/char/drm/via_mm.h --- linux-2.4.22/drivers/char/drm/via_mm.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm/via_mm.h 2003-10-22 22:47:56.000000000 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. 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 + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * 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 + * VIA, S3 GRAPHICS, AND/OR ITS 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. + */ + +#ifndef _via_drm_mm_h_ +#define _via_drm_mm_h_ + +typedef struct { + unsigned int context; + unsigned int size; + unsigned long offset; + unsigned int free; +} drm_via_mm_t; + +typedef struct { + unsigned int size; + unsigned long handle; + void *virtual; +} drm_via_dma_t; + +int via_fb_alloc(drm_via_mem_t *mem); +int via_fb_free(drm_via_mem_t *mem); +int via_agp_alloc(drm_via_mem_t *mem); +int via_agp_free(drm_via_mem_t *mem); + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/drm-4.0/agpsupport.c linux-2.4.23-pre8/drivers/char/drm-4.0/agpsupport.c --- linux-2.4.22/drivers/char/drm-4.0/agpsupport.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/drm-4.0/agpsupport.c 2003-10-22 22:49:19.000000000 +0000 @@ -264,6 +264,7 @@ #if LINUX_VERSION_CODE >= 0x020400 case INTEL_I840: head->chipset = "Intel i840"; break; #endif + case INTEL_460GX: head->chipset = "Intel 460GX"; break; case VIA_GENERIC: head->chipset = "VIA"; break; case VIA_VP3: head->chipset = "VIA VP3"; break; @@ -275,6 +276,8 @@ break; case VIA_APOLLO_KT133: head->chipset = "VIA Apollo KT133"; break; + case VIA_APOLLO_KM266: head->chipset = "VIA Apollo KM266 / KL266"; + break; case VIA_APOLLO_KT400: head->chipset = "VIA Apollo KT400"; break; case VIA_APOLLO_P4X400: head->chipset = "VIA Apollo P4X400"; @@ -298,6 +301,7 @@ break; case SVWRKS_HE: head->chipset = "Serverworks HE"; break; case SVWRKS_LE: head->chipset = "Serverworks LE"; break; + case HP_ZX1: head->chipset = "HP ZX1"; break; default: head->chipset = "Unknown"; break; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/fetchop.c linux-2.4.23-pre8/drivers/char/fetchop.c --- linux-2.4.22/drivers/char/fetchop.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/fetchop.c 2003-10-22 22:48:22.000000000 +0000 @@ -0,0 +1,516 @@ +/* + * SN Platform FetchOp Support + * + * This driver exports the SN fetchop facility to user processes. + * Fetchops are atomic memory operations that are implemented in the + * memory controller on SGI SN hardware. + */ + +/* + * Copyright (C) 1999,2001-2003 Silicon Graphics, Inc. All rights + * reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA + * 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/NoticeExplan + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define DRIVER_ID_STR "SGI Fetchop Device Driver" +#define REVISION "1.03" + + +#define MSPEC_TO_NID(maddr) nasid_to_cnodeid(NASID_GET(maddr)) + + +static int fetchop_mmap(struct file *file, struct vm_area_struct *vma); +static void fetchop_open(struct vm_area_struct *vma); +static void fetchop_close(struct vm_area_struct *vma); + +static struct file_operations fetchop_fops = { + owner: THIS_MODULE, + mmap: fetchop_mmap, +}; + +static struct miscdevice fetchop_miscdev = { + MISC_DYNAMIC_MINOR, + "fetchop", + &fetchop_fops +}; + +static struct vm_operations_struct fetchop_vm_ops = { + open: fetchop_open, + close: fetchop_close, +}; + +/* + * There is one of these structs per node. It is used to manage the fetchop + * space that is available on the node. Current assumption is that there is + * only 1 fetchop block of memory per node. + */ +struct node_fetchops { + long maddr; /* MSPEC address of start of fetchops. */ + int count; /* Total number of fetchop pages. */ + atomic_t free; /* Number of pages currently free. */ + unsigned long bits[1]; /* Bitmap for managing pages. */ +}; + + +/* + * One of these structures is allocated when a fetchop region is mmaped. The + * structure is pointed to by the vma->vm_private_data field in the vma struct. + * This structure is used to record the addresses of the fetchop pages. + */ +struct vma_data { + int count; /* Number of pages allocated. */ + atomic_t refcnt; /* Number of vmas sharing the data. */ + unsigned long maddr[1]; /* Array of MSPEC addresses. */ +}; + + +/* + * Fetchop statistics. + */ +struct fetchop_stats { + unsigned long map_count; /* Number of active mmap's */ + unsigned long pages_in_use; /* Number of fetchop pages in use */ + unsigned long pages_total; /* Total number of fetchop pages */ +}; + +static struct fetchop_stats fetchop_stats; +static struct node_fetchops *node_fetchops[MAX_COMPACT_NODES]; +static spinlock_t fetchop_lock = SPIN_LOCK_UNLOCKED; + +/* + * NOTE: This is included here simply because the kernel doesn't have + * a generally acceptable UC memory allocator. See PV: 896479 for + * more details. --cw + * + * efi_memmap_walk_uc + * + * This function walks the EFI memory map and calls 'callback' once + * for each EFI memory descriptor that has memory that marked as only + * EFI_MEMORY_UC. + */ +static void +efi_memmap_walk_uc (efi_freemem_callback_t callback, void *arg) +{ + void *efi_map_start, *efi_map_end, *p; + efi_memory_desc_t *md; + u64 efi_desc_size, start, end; + + efi_map_start = __va(ia64_boot_param->efi_memmap); + efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size; + efi_desc_size = ia64_boot_param->efi_memdesc_size; + + for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) { + md = p; + if (md->attribute == EFI_MEMORY_UC) { + start = PAGE_ALIGN(md->phys_addr); + end = PAGE_ALIGN((md->phys_addr+(md->num_pages << EFI_PAGE_SHIFT)) & PAGE_MASK); + if ((*callback)(start, end, arg) < 0) + return; + } + } +} + + +/* + * fetchop_initialize_page + * + * Initial a page that is about to be used for fetchops. + * All fetchop variables in the page are set to 0. + * + */ +static void +fetchop_initialize_page(unsigned long maddr) +{ + unsigned long p, pe; + + for (p=FETCHOP_KADDR_TO_MSPEC_ADDR(maddr), pe=p+PAGE_SIZE; p= numnodes) + nid = numa_node_id(); + for (i=0; ibits, fops->count)) < fops->count) { + if (test_and_set_bit(bit, fops->bits) == 0) { + atomic_dec(&node_fetchops[nid]->free); + maddr = fops->maddr + (bit<maddr) >> PAGE_SHIFT; + clear_bit(bit, node_fetchops[nid]->bits); + atomic_inc(&node_fetchops[nid]->free); +} + +static void +fetchop_free_pages(struct vma_data *vdata) +{ + int i; + + for (i=0; icount; i++) + fetchop_free_page(vdata->maddr[i]); +} + + +/* + * fetchop_update_stats + * + * Update statistics of the number of fetchop mappings & pages. + * If creating a new mapping, ensure that we don't exceed the maximum allowed + * number of fetchop pages. + */ +static int +fetchop_update_stats(int mmap, long count) +{ + int ret = 0; + + spin_lock(&fetchop_lock); + if (count > 0 && fetchop_stats.pages_in_use + count > fetchop_stats.pages_total) { + ret = -1; + } else { + fetchop_stats.map_count += mmap; + fetchop_stats.pages_in_use += count; + } + spin_unlock(&fetchop_lock); + + return ret; +} + + +/* + * fetchop_mmap + * + * Called when mmaping the device. Creates fetchop pages and map them + * to user space. + */ +static int +fetchop_mmap(struct file *file, struct vm_area_struct *vma) +{ + unsigned long vm_start; + unsigned long maddr; + int pages; + struct vma_data *vdata; + + if (vma->vm_pgoff != 0) + return -EINVAL; + + if ((vma->vm_flags&VM_WRITE) == 0) + return -EPERM; + + pages = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; + if (fetchop_update_stats(1, pages) < 0) + return -ENOSPC; + + if (!(vdata=vmalloc(sizeof(struct vma_data)+(pages-1)*sizeof(long)))) { + fetchop_update_stats(-1, -pages); + return -ENOMEM; + } + + vdata->count = 0; + vdata->refcnt = ATOMIC_INIT(1); + vma->vm_private_data = vdata; + + vma->vm_flags |= (VM_IO | VM_SHM | VM_LOCKED | VM_NONCACHED); + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); + vma->vm_ops = &fetchop_vm_ops; + vm_start = vma->vm_start; + + while (vm_start < vma->vm_end) { + maddr = fetchop_alloc_page(numa_node_id()); + if (maddr == 0) + BUG(); + vdata->maddr[vdata->count++] = maddr; + + + if (remap_page_range(vm_start, __pa(maddr), PAGE_SIZE, vma->vm_page_prot)) { + fetchop_free_pages(vma->vm_private_data); + vfree(vdata); + fetchop_update_stats(-1, -pages); + return -EAGAIN; + } + vm_start += PAGE_SIZE; + } + + return 0; +} + +/* + * fetchop_open + * + * Called when a device mapping is created by a means other than mmap + * (via fork, etc.). Increments the reference count on the underlying + * fetchop data so it is not freed prematurely. + */ +static void +fetchop_open(struct vm_area_struct *vma) +{ + struct vma_data *vdata; + + vdata = vma->vm_private_data; + if (vdata && vdata->count) { + atomic_inc(&vdata->refcnt); + } +} + +/* + * fetchop_close + * + * Called when unmapping a device mapping. Frees all fetchop pages + * belonging to the vma. + */ +static void +fetchop_close(struct vm_area_struct *vma) +{ + struct vma_data *vdata; + + vdata = vma->vm_private_data; + if (vdata && vdata->count && !atomic_dec(&vdata->refcnt)) { + fetchop_free_pages(vdata); + fetchop_update_stats(-1, -vdata->count); + vfree(vdata); + } +} + +#ifdef CONFIG_PROC_FS + +static struct proc_dir_entry *proc_fetchop; + +/* + * fetchop_read_proc + * + * Implements /proc/fetchop. Return statistics about fetchops. + */ +static int +fetchop_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + struct node_fetchops *fops; + int len = 0, nid; + + len += sprintf(page + len, "mappings : %lu\n", fetchop_stats.map_count); + len += sprintf(page + len, "current fetchop pages : %lu\n", fetchop_stats.pages_in_use); + len += sprintf(page + len, "maximum fetchop pages : %lu\n", fetchop_stats.pages_total); + + len += sprintf(page + len, "%4s %7s %7s\n", "node", "total", "free"); + for (nid = 0; nid < numnodes; nid++) { + fops = node_fetchops[nid]; + len += sprintf(page + len, "%4d %7d %7d\n", nid, fops ? fops->count : 0, fops ? atomic_read(&fops->free) : 0); + } + + if (len <= off+count) *eof = 1; + *start = page + off; + len -= off; + if (len>count) len = count; + if (len<0) len = 0; + return len; +} + +static int +fetchop_write_proc (struct file *file, const char *userbuf, unsigned long count, void *data) +{ + char buf[80]; + + if (copy_from_user(buf, userbuf, count < sizeof(buf) ? count : sizeof(buf))) + return -EFAULT; + + return count; +} +#endif /* CONFIG_PROC_FS */ + +/* + * fetchop_build_memmap, + * + * Called at boot time to build a map of pages that can be used for + * fetchops. + */ +static int __init +fetchop_build_memmap(unsigned long start, unsigned long end, void *arg) +{ + struct node_fetchops *fops; + long count, bytes; + + count = (end - start) >> PAGE_SHIFT; + bytes = sizeof(struct node_fetchops) + count/8; + fops = vmalloc(bytes); + memset(fops, 0, bytes); + fops->maddr = FETCHOP_KADDR_TO_MSPEC_ADDR(start); + fops->count = count; + atomic_add(count, &fops->free); + fetchop_stats.pages_total += count; + node_fetchops[MSPEC_TO_NID(start)] = fops; + + sn_flush_all_caches((long)__va(start), end - start); + + return 0; +} + + + +/* + * fetchop_init + * + * Called at boot time to initialize the fetchop facility. + */ +static int __init +fetchop_init(void) +{ + int ret; + devfs_handle_t hnd; + + if (!ia64_platform_is("sn2")) + return -ENODEV; + +#ifdef CONFIG_DEVFS_FS + if (!devfs_register(NULL, FETCHOP_BASENAME, DEVFS_FL_AUTO_DEVNUM, + 0, 0, S_IFCHR | S_IRUGO | S_IWUGO, &fetchop_fops, NULL)) { + printk(KERN_ERR "%s: failed to register device\n", DRIVER_ID_STR); + return -ENODEV; + } +#endif + + if ((ret = misc_register(&fetchop_miscdev))) { + printk(KERN_ERR "%s: failed to register device\n", DRIVER_ID_STR); + return ret; + } + printk(KERN_DEBUG "%s: registered misc-device with minor %d\n", DRIVER_ID_STR, fetchop_miscdev.minor); + + if ((proc_fetchop = create_proc_entry(FETCHOP_BASENAME, 0644, NULL)) == NULL) { + printk(KERN_ERR "%s: unable to create proc entry", DRIVER_ID_STR); + devfs_unregister(hnd); + return -EINVAL; + } + +#ifdef CONFIG_PROC_FS + if ((proc_fetchop = create_proc_entry(FETCHOP_BASENAME, 0644, NULL)) == NULL) { + printk(KERN_ERR "%s: unable to create proc entry", DRIVER_ID_STR); + devfs_unregister(hnd); + return -EINVAL; + } + proc_fetchop->read_proc = fetchop_read_proc; + proc_fetchop->write_proc = fetchop_write_proc; +#endif /* CONFIG_PROC_FS */ + + efi_memmap_walk_uc(fetchop_build_memmap, 0); + printk(KERN_INFO "%s: v%s\n", DRIVER_ID_STR, REVISION); + + return 0; +} + + + +/*----------------------------------------------------------------------------- + * KERNEL APIs + * Note: right now, these APIs return a full page of fetchops. If these + * interfaces are used often for tasks which do not require a full page of + * fetchops, new APIs should be added to suballocate out of a single page. + */ + +unsigned long +fetchop_kalloc_page(int nid) +{ + if (fetchop_update_stats(1, 1) < 0) + return 0; + return fetchop_alloc_page(nid); +} +EXPORT_SYMBOL(fetchop_kalloc_page); + + +void +fetchop_kfree_page(unsigned long maddr) +{ + fetchop_free_page(maddr); + fetchop_update_stats(-1, -1); +} +EXPORT_SYMBOL(fetchop_kfree_page); + +module_init(fetchop_init); + +MODULE_AUTHOR("Silicon Graphics Inc."); +MODULE_DESCRIPTION("Driver for SGI SN 'fetchop' atomic memory operations"); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/hcdp_serial.c linux-2.4.23-pre8/drivers/char/hcdp_serial.c --- linux-2.4.22/drivers/char/hcdp_serial.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/hcdp_serial.c 2003-10-22 22:49:54.000000000 +0000 @@ -219,3 +219,41 @@ printk("Leaving setup_serial_hcdp()\n"); #endif } + +#ifdef CONFIG_IA64_EARLY_PRINTK_UART +unsigned long hcdp_early_uart(void) +{ + efi_system_table_t *systab; + efi_config_table_t *config_tables; + hcdp_t *hcdp = 0; + hcdp_dev_t *dev; + int i; + + systab = (efi_system_table_t *) ia64_boot_param->efi_systab; + if (!systab) + return 0; + systab = __va(systab); + + config_tables = (efi_config_table_t *) systab->tables; + if (!config_tables) + return 0; + config_tables = __va(config_tables); + + for (i = 0; i < systab->nr_tables; i++) { + if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { + hcdp = (hcdp_t *) config_tables[i].table; + break; + } + } + if (!hcdp) + return 0; + hcdp = __va(hcdp); + + for (i = 0, dev = hcdp->hcdp_dev; i < hcdp->num_entries; i++, dev++) { + if (dev->type == HCDP_DEV_CONSOLE) + return (u64) dev->base_addr.addrhi << 32 + | dev->base_addr.addrlo; + } + return 0; +} +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/hw_random.c linux-2.4.23-pre8/drivers/char/hw_random.c --- linux-2.4.22/drivers/char/hw_random.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/hw_random.c 2003-10-22 22:47:58.000000000 +0000 @@ -0,0 +1,631 @@ +/* + Hardware driver for the Intel/AMD/VIA Random Number Generators (RNG) + (c) Copyright 2003 Red Hat Inc + + derived from + + Hardware driver for the AMD 768 Random Number Generator (RNG) + (c) Copyright 2001 Red Hat Inc + + derived from + + Hardware driver for Intel i810 Random Number Generator (RNG) + Copyright 2000,2001 Jeff Garzik + Copyright 2000,2001 Philipp Rumpf + + Please read Documentation/hw_random.txt for details on use. + + ---------------------------------------------------------- + This software may be used and distributed according to the terms + of the GNU General Public License, incorporated herein by reference. + + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __i386__ +#include +#include +#endif + +#include +#include + + +/* + * core module and version information + */ +#define RNG_VERSION "1.0.0" +#define RNG_MODULE_NAME "hw_random" +#define RNG_DRIVER_NAME RNG_MODULE_NAME " hardware driver " RNG_VERSION +#define PFX RNG_MODULE_NAME ": " + + +/* + * debugging macros + */ +#undef RNG_DEBUG /* define to enable copious debugging info */ + +#ifdef RNG_DEBUG +/* note: prints function name for you */ +#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args) +#else +#define DPRINTK(fmt, args...) +#endif + +#define RNG_NDEBUG /* define to disable lightweight runtime checks */ +#ifdef RNG_NDEBUG +#define assert(expr) +#else +#define assert(expr) \ + if(!(expr)) { \ + printk( "Assertion failed! %s,%s,%s,line=%d\n", \ + #expr,__FILE__,__FUNCTION__,__LINE__); \ + } +#endif + +#define RNG_MISCDEV_MINOR 183 /* official */ + +static int rng_dev_open (struct inode *inode, struct file *filp); +static ssize_t rng_dev_read (struct file *filp, char *buf, size_t size, + loff_t * offp); + +static int __init intel_init (struct pci_dev *dev); +static void intel_cleanup(void); +static unsigned int intel_data_present (void); +static u32 intel_data_read (void); + +static int __init amd_init (struct pci_dev *dev); +static void amd_cleanup(void); +static unsigned int amd_data_present (void); +static u32 amd_data_read (void); + +static int __init via_init(struct pci_dev *dev); +static void via_cleanup(void); +static unsigned int via_data_present (void); +static u32 via_data_read (void); + +struct rng_operations { + int (*init) (struct pci_dev *dev); + void (*cleanup) (void); + unsigned int (*data_present) (void); + u32 (*data_read) (void); + unsigned int n_bytes; /* number of bytes per ->data_read */ +}; +static struct rng_operations *rng_ops; + +static struct file_operations rng_chrdev_ops = { + .owner = THIS_MODULE, + .open = rng_dev_open, + .read = rng_dev_read, +}; + + +static struct miscdevice rng_miscdev = { + RNG_MISCDEV_MINOR, + RNG_MODULE_NAME, + &rng_chrdev_ops, +}; + +enum { + rng_hw_none, + rng_hw_intel, + rng_hw_amd, + rng_hw_via, +}; + +static struct rng_operations rng_vendor_ops[] = { + /* rng_hw_none */ + { }, + + /* rng_hw_intel */ + { intel_init, intel_cleanup, intel_data_present, + intel_data_read, 1 }, + + /* rng_hw_amd */ + { amd_init, amd_cleanup, amd_data_present, amd_data_read, 4 }, + + /* rng_hw_via */ + { via_init, via_cleanup, via_data_present, via_data_read, 1 }, +}; + +/* + * 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 rng_pci_tbl[] __initdata = { + { 0x1022, 0x7443, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rng_hw_amd }, + { 0x1022, 0x746b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rng_hw_amd }, + + { 0x8086, 0x2418, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rng_hw_intel }, + { 0x8086, 0x2428, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rng_hw_intel }, + { 0x8086, 0x2448, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rng_hw_intel }, + { 0x8086, 0x244e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rng_hw_intel }, + { 0x8086, 0x245e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, rng_hw_intel }, + + { 0, }, /* terminate list */ +}; +MODULE_DEVICE_TABLE (pci, rng_pci_tbl); + + +/*********************************************************************** + * + * Intel RNG operations + * + */ + +/* + * RNG registers (offsets from rng_mem) + */ +#define INTEL_RNG_HW_STATUS 0 +#define INTEL_RNG_PRESENT 0x40 +#define INTEL_RNG_ENABLED 0x01 +#define INTEL_RNG_STATUS 1 +#define INTEL_RNG_DATA_PRESENT 0x01 +#define INTEL_RNG_DATA 2 + +/* + * Magic address at which Intel PCI bridges locate the RNG + */ +#define INTEL_RNG_ADDR 0xFFBC015F +#define INTEL_RNG_ADDR_LEN 3 + +/* token to our ioremap'd RNG register area */ +static void *rng_mem; + +static inline u8 intel_hwstatus (void) +{ + assert (rng_mem != NULL); + return readb (rng_mem + INTEL_RNG_HW_STATUS); +} + +static inline u8 intel_hwstatus_set (u8 hw_status) +{ + assert (rng_mem != NULL); + writeb (hw_status, rng_mem + INTEL_RNG_HW_STATUS); + return intel_hwstatus (); +} + +static unsigned int intel_data_present(void) +{ + assert (rng_mem != NULL); + + return (readb (rng_mem + INTEL_RNG_STATUS) & INTEL_RNG_DATA_PRESENT) ? + 1 : 0; +} + +static u32 intel_data_read(void) +{ + assert (rng_mem != NULL); + + return readb (rng_mem + INTEL_RNG_DATA); +} + +static int __init intel_init (struct pci_dev *dev) +{ + int rc; + u8 hw_status; + + DPRINTK ("ENTER\n"); + + rng_mem = ioremap (INTEL_RNG_ADDR, INTEL_RNG_ADDR_LEN); + if (rng_mem == NULL) { + printk (KERN_ERR PFX "cannot ioremap RNG Memory\n"); + rc = -EBUSY; + goto err_out; + } + + /* Check for Intel 82802 */ + hw_status = intel_hwstatus (); + if ((hw_status & INTEL_RNG_PRESENT) == 0) { + printk (KERN_ERR PFX "RNG not detected\n"); + rc = -ENODEV; + goto err_out_free_map; + } + + /* turn RNG h/w on, if it's off */ + if ((hw_status & INTEL_RNG_ENABLED) == 0) + hw_status = intel_hwstatus_set (hw_status | INTEL_RNG_ENABLED); + if ((hw_status & INTEL_RNG_ENABLED) == 0) { + printk (KERN_ERR PFX "cannot enable RNG, aborting\n"); + rc = -EIO; + goto err_out_free_map; + } + + DPRINTK ("EXIT, returning 0\n"); + return 0; + +err_out_free_map: + iounmap (rng_mem); + rng_mem = NULL; +err_out: + DPRINTK ("EXIT, returning %d\n", rc); + return rc; +} + +static void intel_cleanup(void) +{ + u8 hw_status; + + hw_status = intel_hwstatus (); + if (hw_status & INTEL_RNG_ENABLED) + intel_hwstatus_set (hw_status & ~INTEL_RNG_ENABLED); + else + printk(KERN_WARNING PFX "unusual: RNG already disabled\n"); + iounmap(rng_mem); + rng_mem = NULL; +} + +/*********************************************************************** + * + * AMD RNG operations + * + */ + +static u32 pmbase; /* PMxx I/O base */ +static struct pci_dev *amd_dev; + +static unsigned int amd_data_present (void) +{ + return inl(pmbase + 0xF4) & 1; +} + + +static u32 amd_data_read (void) +{ + return inl(pmbase + 0xF0); +} + +static int __init amd_init (struct pci_dev *dev) +{ + int rc; + u8 rnen; + + DPRINTK ("ENTER\n"); + + pci_read_config_dword(dev, 0x58, &pmbase); + + pmbase &= 0x0000FF00; + + if (pmbase == 0) + { + printk (KERN_ERR PFX "power management base not set\n"); + rc = -EIO; + goto err_out; + } + + pci_read_config_byte(dev, 0x40, &rnen); + rnen |= (1 << 7); /* RNG on */ + pci_write_config_byte(dev, 0x40, rnen); + + pci_read_config_byte(dev, 0x41, &rnen); + rnen |= (1 << 7); /* PMIO enable */ + pci_write_config_byte(dev, 0x41, rnen); + + printk(KERN_INFO PFX "AMD768 system management I/O registers at 0x%X.\n", pmbase); + + amd_dev = dev; + + DPRINTK ("EXIT, returning 0\n"); + return 0; + +err_out: + DPRINTK ("EXIT, returning %d\n", rc); + return rc; +} + +static void amd_cleanup(void) +{ + u8 rnen; + + pci_read_config_byte(amd_dev, 0x40, &rnen); + rnen &= ~(1 << 7); /* RNG off */ + pci_write_config_byte(amd_dev, 0x40, rnen); + + /* FIXME: twiddle pmio, also? */ +} + +/*********************************************************************** + * + * VIA RNG operations + * + */ + +enum { + VIA_STRFILT_CNT_SHIFT = 16, + VIA_STRFILT_FAIL = (1 << 15), + VIA_STRFILT_ENABLE = (1 << 14), + VIA_RAWBITS_ENABLE = (1 << 13), + VIA_RNG_ENABLE = (1 << 6), + VIA_XSTORE_CNT_MASK = 0x0F, + + VIA_RNG_CHUNK_8 = 0x00, /* 64 rand bits, 64 stored bits */ + VIA_RNG_CHUNK_4 = 0x01, /* 32 rand bits, 32 stored bits */ + VIA_RNG_CHUNK_4_MASK = 0xFFFFFFFF, + VIA_RNG_CHUNK_2 = 0x02, /* 16 rand bits, 32 stored bits */ + VIA_RNG_CHUNK_2_MASK = 0xFFFF, + VIA_RNG_CHUNK_1 = 0x03, /* 8 rand bits, 32 stored bits */ + VIA_RNG_CHUNK_1_MASK = 0xFF, +}; + +u32 via_rng_datum; + +/* + * Investigate using the 'rep' prefix to obtain 32 bits of random data + * in one insn. The upside is potentially better performance. The + * downside is that the instruction becomes no longer atomic. Due to + * this, just like familiar issues with /dev/random itself, the worst + * case of a 'rep xstore' could potentially pause a cpu for an + * unreasonably long time. In practice, this condition would likely + * only occur when the hardware is failing. (or so we hope :)) + * + * Another possible performance boost may come from simply buffering + * until we have 4 bytes, thus returning a u32 at a time, + * instead of the current u8-at-a-time. + */ + +static inline u32 xstore(u32 *addr, u32 edx_in) +{ + u32 eax_out; + + asm(".byte 0x0F,0xA7,0xC0 /* xstore %%edi (addr=%0) */" + :"=m"(*addr), "=a"(eax_out) + :"D"(addr), "d"(edx_in)); + + return eax_out; +} + +static unsigned int via_data_present(void) +{ + u32 bytes_out; + + /* We choose the recommended 1-byte-per-instruction RNG rate, + * for greater randomness at the expense of speed. Larger + * values 2, 4, or 8 bytes-per-instruction yield greater + * speed at lesser randomness. + * + * If you change this to another VIA_CHUNK_n, you must also + * change the ->n_bytes values in rng_vendor_ops[] tables. + * VIA_CHUNK_8 requires further code changes. + * + * A copy of MSR_VIA_RNG is placed in eax_out when xstore + * completes. + */ + via_rng_datum = 0; /* paranoia, not really necessary */ + bytes_out = xstore(&via_rng_datum, VIA_RNG_CHUNK_1) & VIA_XSTORE_CNT_MASK; + if (bytes_out == 0) + return 0; + + return 1; +} + +static u32 via_data_read(void) +{ + return via_rng_datum; +} + +static int __init via_init(struct pci_dev *dev) +{ + u32 lo, hi, old_lo; + + /* Control the RNG via MSR. Tread lightly and pay very close + * close attention to values written, as the reserved fields + * are documented to be "undefined and unpredictable"; but it + * does not say to write them as zero, so I make a guess that + * we restore the values we find in the register. + */ + rdmsr(MSR_VIA_RNG, lo, hi); + + old_lo = lo; + lo &= ~(0x7f << VIA_STRFILT_CNT_SHIFT); + lo &= ~VIA_XSTORE_CNT_MASK; + lo &= ~(VIA_STRFILT_ENABLE | VIA_STRFILT_FAIL | VIA_RAWBITS_ENABLE); + lo |= VIA_RNG_ENABLE; + + if (lo != old_lo) + wrmsr(MSR_VIA_RNG, lo, hi); + + /* perhaps-unnecessary sanity check; remove after testing if + unneeded */ + rdmsr(MSR_VIA_RNG, lo, hi); + if ((lo & VIA_RNG_ENABLE) == 0) { + printk(KERN_ERR PFX "cannot enable VIA C3 RNG, aborting\n"); + return -ENODEV; + } + + return 0; +} + +static void via_cleanup(void) +{ + u32 lo, hi; + + rdmsr(MSR_VIA_RNG, lo, hi); + lo &= ~VIA_RNG_ENABLE; + wrmsr(MSR_VIA_RNG, lo, hi); +} + + +/*********************************************************************** + * + * /dev/hwrandom character device handling (major 10, minor 183) + * + */ + +static int rng_dev_open (struct inode *inode, struct file *filp) +{ + /* enforce read-only access to this chrdev */ + if ((filp->f_mode & FMODE_READ) == 0) + return -EINVAL; + if (filp->f_mode & FMODE_WRITE) + return -EINVAL; + + return 0; +} + + +static ssize_t rng_dev_read (struct file *filp, char *buf, size_t size, + loff_t * offp) +{ + static spinlock_t rng_lock = SPIN_LOCK_UNLOCKED; + unsigned int have_data; + u32 data = 0; + ssize_t ret = 0; + + while (size) { + spin_lock(&rng_lock); + + have_data = 0; + if (rng_ops->data_present()) { + data = rng_ops->data_read(); + have_data = rng_ops->n_bytes; + } + + spin_unlock (&rng_lock); + + while (have_data && size) { + if (put_user((u8)data, buf++)) { + ret = ret ? : -EFAULT; + break; + } + size--; + ret++; + have_data--; + data>>=8; + } + + if (filp->f_flags & O_NONBLOCK) + return ret ? : -EAGAIN; + + if(need_resched()) + { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(1); + } + else + udelay(200); /* FIXME: We could poll for 250uS ?? */ + + if (signal_pending (current)) + return ret ? : -ERESTARTSYS; + } + return ret; +} + + + +/* + * rng_init_one - look for and attempt to init a single RNG + */ +static int __init rng_init_one (struct pci_dev *dev) +{ + int rc; + + DPRINTK ("ENTER\n"); + + assert(rng_ops != NULL); + + rc = rng_ops->init(dev); + if (rc) + goto err_out; + + rc = misc_register (&rng_miscdev); + if (rc) { + printk (KERN_ERR PFX "misc device register failed\n"); + goto err_out_cleanup_hw; + } + + DPRINTK ("EXIT, returning 0\n"); + return 0; + +err_out_cleanup_hw: + rng_ops->cleanup(); +err_out: + DPRINTK ("EXIT, returning %d\n", rc); + return rc; +} + + + +MODULE_AUTHOR("The Linux Kernel team"); +MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver"); +MODULE_LICENSE("GPL"); + + +/* + * rng_init - initialize RNG module + */ +static int __init rng_init (void) +{ + int rc; + struct pci_dev *pdev = NULL; + const struct pci_device_id *ent; + + DPRINTK ("ENTER\n"); + + /* Probe for Intel, AMD RNGs */ + while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) { + ent = pci_match_device (rng_pci_tbl, pdev); + if (ent) { + rng_ops = &rng_vendor_ops[ent->driver_data]; + goto match; + } + } + +#ifdef __i386__ + /* Probe for VIA RNG */ + if (cpu_has_xstore) { + rng_ops = &rng_vendor_ops[rng_hw_via]; + pdev = NULL; + goto match; + } +#endif + + DPRINTK ("EXIT, returning -ENODEV\n"); + return -ENODEV; + +match: + rc = rng_init_one (pdev); + if (rc) + return rc; + + printk (KERN_INFO RNG_DRIVER_NAME " loaded\n"); + + DPRINTK ("EXIT, returning 0\n"); + return 0; +} + + +/* + * rng_init - shutdown RNG module + */ +static void __exit rng_cleanup (void) +{ + DPRINTK ("ENTER\n"); + + misc_deregister (&rng_miscdev); + + if (rng_ops->cleanup) + rng_ops->cleanup(); + + DPRINTK ("EXIT\n"); +} + + +module_init (rng_init); +module_exit (rng_cleanup); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/i810-tco.c linux-2.4.23-pre8/drivers/char/i810-tco.c --- linux-2.4.22/drivers/char/i810-tco.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/i810-tco.c 2003-10-22 22:47:30.000000000 +0000 @@ -25,7 +25,8 @@ * 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 + * 82801DB & 82801E chip : document number 290744-001, 273599-001, + * 82801EB & 82801ER chip : document number 252516-001 * * 20000710 Nils Faerber * Initial Version 0.01 @@ -42,9 +43,11 @@ * 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, general cleanup. + * added support for 82801DB and 82801E chipset, + * added support for 82801EB and 8280ER chipset, + * general cleanup. */ - + #include #include #include @@ -167,7 +170,7 @@ * Reload (trigger) the timer. Lock is needed so we dont reload it during * a reprogramming event */ - + static void tco_timer_reload (void) { spin_lock(&tco_lock); @@ -310,6 +313,7 @@ { 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); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/i810-tco.h linux-2.4.23-pre8/drivers/char/i810-tco.h --- linux-2.4.22/drivers/char/i810-tco.h 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/i810-tco.h 2003-10-22 22:47:50.000000000 +0000 @@ -1,5 +1,5 @@ /* - * i810-tco 0.05: TCO timer driver for i8xx chipsets + * i810-tco: TCO timer driver for i8xx chipsets * * (c) Copyright 2000 kernel concepts , All Rights Reserved. * http://www.kernelconcepts.de @@ -8,7 +8,7 @@ * 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. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/ip2main.c linux-2.4.23-pre8/drivers/char/ip2main.c --- linux-2.4.22/drivers/char/ip2main.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/ip2main.c 2003-10-22 22:49:56.000000000 +0000 @@ -988,7 +988,7 @@ static void __init ip2_init_board( int boardnum ) { - int i,rc; + int i; int nports = 0, nboxes = 0; i2ChanStrPtr pCh; i2eBordStrPtr pB = i2BoardPtrTable[boardnum]; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/keyboard.c linux-2.4.23-pre8/drivers/char/keyboard.c --- linux-2.4.22/drivers/char/keyboard.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/keyboard.c 2003-10-22 22:48:36.000000000 +0000 @@ -198,6 +198,7 @@ unsigned char keycode; char up_flag = down ? 0 : 0200; char raw_mode; + char have_keycode; pm_access(pm_kbd); add_keyboard_randomness(scancode | up_flag); @@ -214,16 +215,30 @@ tty = NULL; } kbd = kbd_table + fg_console; - if ((raw_mode = (kbd->kbdmode == VC_RAW))) { + /* + * Convert scancode to keycode + */ + raw_mode = (kbd->kbdmode == VC_RAW); + have_keycode = kbd_translate(scancode, &keycode, raw_mode); + if (raw_mode) { /* * The following is a workaround for hardware * which sometimes send the key release event twice */ unsigned char next_scancode = scancode|up_flag; - if (up_flag && next_scancode==prev_scancode) { + if (have_keycode && up_flag && next_scancode==prev_scancode) { /* unexpected 2nd release event */ } else { - prev_scancode=next_scancode; + /* + * Only save previous scancode if it was a key-up + * and had a single-byte scancode. + */ + if (!have_keycode) + prev_scancode = 1; + else if (!up_flag || prev_scancode == 1) + prev_scancode = 0; + else + prev_scancode = next_scancode; put_queue(next_scancode); } /* we do not return yet, because we want to maintain @@ -231,10 +246,7 @@ values when finishing RAW mode or when changing VT's */ } - /* - * Convert scancode to keycode - */ - if (!kbd_translate(scancode, &keycode, raw_mode)) + if (!have_keycode) goto out; /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/mem.c linux-2.4.23-pre8/drivers/char/mem.c --- linux-2.4.22/drivers/char/mem.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/mem.c 2003-10-22 22:48:57.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -503,16 +504,23 @@ */ static loff_t memory_lseek(struct file * file, loff_t offset, int orig) { + loff_t ret; + switch (orig) { case 0: file->f_pos = offset; - return file->f_pos; + ret = file->f_pos; + force_successful_syscall_return(); + break; case 1: file->f_pos += offset; - return file->f_pos; + ret = file->f_pos; + force_successful_syscall_return(); + break; default: - return -EINVAL; + ret = -EINVAL; } + return ret; } static int open_port(struct inode * inode, struct file * filp) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/n_hdlc.c linux-2.4.23-pre8/drivers/char/n_hdlc.c --- linux-2.4.22/drivers/char/n_hdlc.c 2002-02-25 19:37:57.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/n_hdlc.c 2003-10-22 22:48:17.000000000 +0000 @@ -9,7 +9,7 @@ * Al Longyear , Paul Mackerras * * Original release 01/11/99 - * $Id: n_hdlc.c,v 3.3 2001/11/08 16:16:03 paulkf Exp $ + * $Id: n_hdlc.c,v 3.7 2003/05/01 15:45:29 paulkf Exp $ * * This code is released under the GNU General Public License (GPL) * @@ -78,7 +78,7 @@ */ #define HDLC_MAGIC 0x239e -#define HDLC_VERSION "$Revision: 3.3 $" +#define HDLC_VERSION "$Revision: 3.7 $" #include #include @@ -172,9 +172,9 @@ /* * HDLC buffer list manipulation functions */ -void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list); -void n_hdlc_buf_put(N_HDLC_BUF_LIST *list,N_HDLC_BUF *buf); -N_HDLC_BUF* n_hdlc_buf_get(N_HDLC_BUF_LIST *list); +static void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list); +static void n_hdlc_buf_put(N_HDLC_BUF_LIST *list,N_HDLC_BUF *buf); +static N_HDLC_BUF* n_hdlc_buf_get(N_HDLC_BUF_LIST *list); /* Local functions */ @@ -183,13 +183,16 @@ MODULE_PARM(debuglevel, "i"); MODULE_PARM(maxframe, "i"); +#ifdef MODULE_LICENSE +MODULE_LICENSE("GPL"); +#endif /* debug level can be set by insmod for debugging purposes */ #define DEBUG_LEVEL_INFO 1 -int debuglevel=0; +static int debuglevel=0; /* max frame size for memory allocations */ -ssize_t maxframe=4096; +static ssize_t maxframe=4096; /* TTY callbacks */ @@ -265,7 +268,8 @@ } else break; } - + if (n_hdlc->tbuf) + kfree(n_hdlc->tbuf); kfree(n_hdlc); } /* end of n_hdlc_release() */ @@ -905,7 +909,7 @@ * Arguments: list pointer to buffer list * Return Value: None */ -void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list) +static void n_hdlc_buf_list_init(N_HDLC_BUF_LIST *list) { memset(list,0,sizeof(N_HDLC_BUF_LIST)); spin_lock_init(&list->spinlock); @@ -922,7 +926,7 @@ * * Return Value: None */ -void n_hdlc_buf_put(N_HDLC_BUF_LIST *list,N_HDLC_BUF *buf) +static void n_hdlc_buf_put(N_HDLC_BUF_LIST *list,N_HDLC_BUF *buf) { unsigned long flags; spin_lock_irqsave(&list->spinlock,flags); @@ -952,7 +956,7 @@ * * pointer to HDLC buffer if available, otherwise NULL */ -N_HDLC_BUF* n_hdlc_buf_get(N_HDLC_BUF_LIST *list) +static N_HDLC_BUF* n_hdlc_buf_get(N_HDLC_BUF_LIST *list) { unsigned long flags; N_HDLC_BUF *buf; @@ -1025,5 +1029,4 @@ module_init(n_hdlc_init); module_exit(n_hdlc_exit); -MODULE_LICENSE("GPL"); EXPORT_NO_SYMBOLS; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/pcmcia/synclink_cs.c linux-2.4.23-pre8/drivers/char/pcmcia/synclink_cs.c --- linux-2.4.22/drivers/char/pcmcia/synclink_cs.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/pcmcia/synclink_cs.c 2003-10-22 22:48:56.000000000 +0000 @@ -1,7 +1,7 @@ /* * linux/drivers/char/synclink_cs.c * - * $Id: synclink_cs.c,v 3.4 2002/04/22 14:36:41 paulkf Exp $ + * $Id: synclink_cs.c,v 3.10 2003/09/05 14:04:26 paulkf Exp $ * * Device driver for Microgate SyncLink PC Card * multiprotocol serial adapter. @@ -483,6 +483,7 @@ static int debug_level = 0; static int maxframe[MAX_DEVICE_COUNT] = {0,}; +static int dosyncppp[MAX_DEVICE_COUNT] = {1,1,1,1}; /* The old way: bit map of interrupts to choose from */ /* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4, and 3 */ @@ -499,9 +500,14 @@ MODULE_PARM(cuamajor,"i"); MODULE_PARM(debug_level,"i"); MODULE_PARM(maxframe,"1-" __MODULE_STRING(MAX_DEVICE_COUNT) "i"); +MODULE_PARM(dosyncppp,"1-" __MODULE_STRING(MAX_DEVICE_COUNT) "i"); + +#ifdef MODULE_LICENSE +MODULE_LICENSE("GPL"); +#endif static char *driver_name = "SyncLink PC Card driver"; -static char *driver_version = "$Revision: 3.4 $"; +static char *driver_version = "$Revision: 3.10 $"; static struct tty_driver serial_driver, callout_driver; static int serial_refcount; @@ -871,6 +877,9 @@ printk(badmagic, kdevname(device), routine); return 1; } +#else + if (!info) + return 1; #endif return 0; } @@ -2616,14 +2625,17 @@ { MGSLPC_INFO * info = (MGSLPC_INFO *)tty->driver_data; - if (!info || mgslpc_paranoia_check(info, tty->device, "mgslpc_close")) + if (mgslpc_paranoia_check(info, tty->device, "mgslpc_close")) return; if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgslpc_close(%s) entry, count=%d\n", __FILE__,__LINE__, info->device_name, info->count); - if (!info->count || tty_hung_up_p(filp)) + if (!info->count) + return; + + if (tty_hung_up_p(filp)) goto cleanup; if ((tty->count == 1) && (info->count != 1)) { @@ -2747,7 +2759,7 @@ schedule_timeout(char_time); if (signal_pending(current)) break; - if (timeout && ((orig_jiffies + timeout) < jiffies)) + if (timeout && time_after(jiffies, orig_jiffies + timeout)) break; } } else { @@ -2757,7 +2769,7 @@ schedule_timeout(char_time); if (signal_pending(current)) break; - if (timeout && ((orig_jiffies + timeout) < jiffies)) + if (timeout && time_after(jiffies, orig_jiffies + timeout)) break; } } @@ -2937,16 +2949,11 @@ info = mgslpc_device_list; while(info && info->line != line) info = info->next_device; - if ( !info ){ - printk("%s(%d):Can't find specified device on open (line=%d)\n", - __FILE__,__LINE__,line); + if (mgslpc_paranoia_check(info, tty->device, "mgslpc_open")) return -ENODEV; - } tty->driver_data = info; info->tty = tty; - if (mgslpc_paranoia_check(info, tty->device, "mgslpc_open")) - return -ENODEV; if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgslpc_open(%s), old ref count = %d\n", @@ -3008,6 +3015,8 @@ cleanup: if (retval) { + if (tty->count == 1) + info->tty = 0; /* tty layer will release tty struct */ if(MOD_IN_USE) MOD_DEC_USE_COUNT; if(info->count) @@ -3181,8 +3190,7 @@ if (info->line < MAX_DEVICE_COUNT) { if (maxframe[info->line]) info->max_frame_size = maxframe[info->line]; -// info->dosyncppp = dosyncppp[info->line]; - info->dosyncppp = 1; + info->dosyncppp = dosyncppp[info->line]; } mgslpc_device_count++; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/pcwd.c linux-2.4.23-pre8/drivers/char/pcwd.c --- linux-2.4.22/drivers/char/pcwd.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/pcwd.c 2003-10-22 22:47:39.000000000 +0000 @@ -933,8 +933,7 @@ release_region (pcwd_info.io_addr, pcwd_info.card_info->io_size); - if (pcwd_info.flags & PCWD_PCI_REG) - pci_unregister_driver (&pcwd_driver); + pci_unregister_driver (&pcwd_driver); return; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/rocket.c linux-2.4.23-pre8/drivers/char/rocket.c --- linux-2.4.22/drivers/char/rocket.c 2001-09-21 17:55:22.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/rocket.c 2003-10-22 22:47:50.000000000 +0000 @@ -1944,6 +1944,10 @@ str = "8J"; max_num_aiops = 1; break; + case PCI_DEVICE_ID_RP4J: + str = "4J"; + max_num_aiops = 1; + break; case PCI_DEVICE_ID_RP16INTF: str = "16"; max_num_aiops = 2; @@ -2006,6 +2010,10 @@ PCI_DEVICE_ID_RP8J, i, &bus, &device_fn)) if (register_PCI(count+boards_found, bus, device_fn)) count++; + if (!pcibios_find_device(PCI_VENDOR_ID_RP, + PCI_DEVICE_ID_RP4J, i, &bus, &device_fn)) + if (register_PCI(count+boards_found, bus, device_fn)) + count++; if(!pcibios_find_device(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RP8OCTA, i, &bus, &device_fn)) if(register_PCI(count+boards_found, bus, device_fn)) @@ -2031,6 +2039,10 @@ if(register_PCI(count+boards_found, bus, device_fn)) count++; if(!pcibios_find_device(PCI_VENDOR_ID_RP, + PCI_DEVICE_ID_RP4J, i, &bus, &device_fn)) + if(register_PCI(count+boards_found, bus, device_fn)) + count++; + if(!pcibios_find_device(PCI_VENDOR_ID_RP, PCI_DEVICE_ID_RPP4, i, &bus, &device_fn)) if(register_PCI(count+boards_found, bus, device_fn)) count++; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/rocket_int.h linux-2.4.23-pre8/drivers/char/rocket_int.h --- linux-2.4.22/drivers/char/rocket_int.h 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/rocket_int.h 2003-10-22 22:47:55.000000000 +0000 @@ -1200,6 +1200,9 @@ #ifndef PCI_DEVICE_ID_RP8J #define PCI_DEVICE_ID_RP8J 0x0006 #endif +#ifndef PCI_DEVICE_ID_RP4J +#define PCI_DEVICE_ID_RP4J 0x0007 +#endif #ifndef PCI_DEVICE_ID_RPP4 #define PCI_DEVICE_ID_RPP4 0x000A #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/rtc.c linux-2.4.23-pre8/drivers/char/rtc.c --- linux-2.4.22/drivers/char/rtc.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/rtc.c 2003-10-22 22:48:36.000000000 +0000 @@ -242,10 +242,10 @@ return -EINVAL; add_wait_queue(&rtc_wait, &wait); - - current->state = TASK_INTERRUPTIBLE; do { + __set_current_state(TASK_INTERRUPTIBLE); + /* First make it right. Then make it fast. Putting this whole * block within the parentheses of a while would be too * confusing. And no, xchg() is not the answer. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/sbc60xxwdt.c linux-2.4.23-pre8/drivers/char/sbc60xxwdt.c --- linux-2.4.22/drivers/char/sbc60xxwdt.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/sbc60xxwdt.c 2003-10-22 22:47:50.000000000 +0000 @@ -335,7 +335,7 @@ release_region(WDT_START,1); err_out_region1: release_region(WDT_STOP,1); -err_out: +/* err_out: */ return rc; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/ser_a2232.c linux-2.4.23-pre8/drivers/char/ser_a2232.c --- linux-2.4.22/drivers/char/ser_a2232.c 2001-09-13 22:21:32.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/ser_a2232.c 2003-10-22 22:48:18.000000000 +0000 @@ -776,7 +776,7 @@ volatile u_char *to; volatile struct a2232memory *mem; -#ifdef __SMP__ +#ifdef CONFIG_SMP return -ENODEV; /* This driver is not SMP aware. Is there an SMP ZorroII-bus-machine? */ #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/sh-sci.c linux-2.4.23-pre8/drivers/char/sh-sci.c --- linux-2.4.22/drivers/char/sh-sci.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/sh-sci.c 2003-10-22 22:49:44.000000000 +0000 @@ -1,4 +1,4 @@ -/* $Id: sh-sci.c,v 1.1.1.1.2.7 2003/07/16 18:45:31 yoshii Exp $ +/* $Id: sh-sci.c,v 1.1.1.1.2.10 2003/09/17 23:38:56 davidm-sf Exp $ * * linux/drivers/char/sh-sci.c * @@ -6,6 +6,7 @@ * Copyright (C) 1999, 2000 Niibe Yutaka * Copyright (C) 2000 Sugioka Toshinobu * Modified to support multiple serial ports. Stuart Menefy (May 2000). + * Modified to support SecureEdge. David McCullough (2002) * Modified to support SH7300 SCIF. Takashi Kusuda (Jun 2003). * * TTY code is based on sx.c (Specialix SX driver) by: @@ -239,6 +240,51 @@ #endif /* CONFIG_SERIAL_CONSOLE */ +#if defined(CONFIG_SH_SECUREEDGE5410) + +struct timer_list sci_timer_struct; +static unsigned char sci_dcdstatus[2]; + +/* + * This subroutine is called when the RS_TIMER goes off. It is used + * to monitor the state of the DCD lines - since they have no edge + * sensors and interrupt generators. + */ +static void sci_timer(unsigned long data) +{ + unsigned short s, i; + unsigned char dcdstatus[2]; + + s = SECUREEDGE_READ_IOPORT(); + dcdstatus[0] = !(s & 0x10); + dcdstatus[1] = !(s & 0x1); + + for (i = 0; i < 2; i++) { + if (dcdstatus[i] != sci_dcdstatus[i]) { + if (sci_ports[i].gs.count != 0) { + if (sci_ports[i].gs.flags & ASYNC_CHECK_CD) { + if (dcdstatus[i]) { /* DCD has gone high */ + wake_up_interruptible(&sci_ports[i].gs.open_wait); + } else if (!((sci_ports[i].gs.flags&ASYNC_CALLOUT_ACTIVE) && + (sci_ports[i].gs.flags & ASYNC_CALLOUT_NOHUP))) { + if (sci_ports[i].gs.tty) + tty_hangup(sci_ports[i].gs.tty); + } + } + } + } + sci_dcdstatus[i] = dcdstatus[i]; + } + + sci_timer_struct.expires = jiffies + HZ/25; + add_timer(&sci_timer_struct); +} + +#endif + + + + #ifdef CONFIG_SH_KGDB /* Is the SCI ready, ie is there a char waiting? */ @@ -359,7 +405,7 @@ /* We need to set SCPCR to enable RTS/CTS */ data = ctrl_inw(SCPCR); /* Clear out SCP7MD1,0, SCP6MD1,0, SCP4MD1,0*/ - ctrl_outw(data&0x0fcf, SCPCR); + ctrl_outw(data&0x0cff, SCPCR); } if (cflag & CRTSCTS) fcr_val |= SCFCR_MCE; @@ -370,7 +416,7 @@ data = ctrl_inw(SCPCR); /* Clear out SCP7MD1,0, SCP4MD1,0, Set SCP6MD1,0 = {01} (output) */ - ctrl_outw((data&0x0fcf)|0x1000, SCPCR); + ctrl_outw((data&0x0cff)|0x1000, SCPCR); data = ctrl_inb(SCPDR); /* Set /RTS2 (bit6) = 0 */ @@ -413,7 +459,29 @@ /* This routine is used for seting signals of: DTR, DCD, CTS/RTS */ /* We use SCIF's hardware for CTS/RTS, so don't need any for that. */ /* If you have signals for DTR and DCD, please implement here. */ - ; + +#if defined(CONFIG_SH_SECUREEDGE5410) + int flags; + + save_and_cli(flags); + if (port == &sci_ports[1]) { /* port 1 only */ + if (dtr == 0) + SECUREEDGE_WRITE_IOPORT(0x0080, 0x0080); + else if (dtr == 1) + SECUREEDGE_WRITE_IOPORT(0x0000, 0x0080); + } + if (port == &sci_ports[0]) { /* port 0 only */ + if (dtr == 0) + SECUREEDGE_WRITE_IOPORT(0x0200, 0x0200); + else if (dtr == 1) + SECUREEDGE_WRITE_IOPORT(0x0000, 0x0200); + if (rts == 0) + SECUREEDGE_WRITE_IOPORT(0x0100, 0x0100); + else if (rts == 1) + SECUREEDGE_WRITE_IOPORT(0x0000, 0x0100); + } + restore_flags(flags); +#endif } static int sci_getsignals(struct sci_port *port) @@ -421,15 +489,34 @@ /* This routine is used for geting signals of: DTR, DCD, DSR, RI, and CTS/RTS */ +#if defined(CONFIG_SH_SECUREEDGE5410) + if (port == &sci_ports[1]) { /* port 1 only */ + unsigned short s = SECUREEDGE_READ_IOPORT(); + int rc = TIOCM_RTS|TIOCM_DSR|TIOCM_CTS; + + if ((s & 0x0001) == 0) + rc |= TIOCM_CAR; + if ((SECUREEDGE_READ_IOPORT() & 0x0080) == 0) + rc |= TIOCM_DTR; + return(rc); + } + if (port == &sci_ports[0]) { /* port 0 only */ + unsigned short s = SECUREEDGE_READ_IOPORT(); + int rc = TIOCM_DSR; + + if ((s & 0x0010) == 0) + rc |= TIOCM_CAR; + if ((s & 0x0004) == 0) + rc |= TIOCM_CTS; + if ((SECUREEDGE_READ_IOPORT() & 0x0200) == 0) + rc |= TIOCM_DTR; + if ((SECUREEDGE_READ_IOPORT() & 0x0100) == 0) + rc |= TIOCM_RTS; + return(rc); + } +#endif + return TIOCM_DTR|TIOCM_RTS|TIOCM_DSR; -/* - (((o_stat & OP_DTR)?TIOCM_DTR:0) | - ((o_stat & OP_RTS)?TIOCM_RTS:0) | - ((i_stat & IP_CTS)?TIOCM_CTS:0) | - ((i_stat & IP_DCD)?TIOCM_CAR:0) | - ((i_stat & IP_DSR)?TIOCM_DSR:0) | - ((i_stat & IP_RI) ?TIOCM_RNG:0) -*/ } static void sci_set_baud(struct sci_port *port, int baud) @@ -458,6 +545,11 @@ case 57600: t = BPS_57600; break; + case 230400: + if (BPS_230400 != BPS_115200) { + t = BPS_230400; + break; + } default: printk(KERN_INFO "sci: unsupported baud rate: %d, using 115200 instead.\n", baud); case 115200: @@ -513,6 +605,11 @@ port->init_pins(port, cflag); sci_out(port, SCSCR, SCSCR_INIT(port)); + + if (cflag & CLOCAL) + port->gs.flags &= ~ASYNC_CHECK_CD; + else + port->gs.flags |= ASYNC_CHECK_CD; } static int sci_set_real_termios(void *ptr) @@ -525,22 +622,6 @@ sci_enable_rx_interrupts(port); } - /* Tell line discipline whether we will do input cooking */ - if (I_OTHER(port->gs.tty)) - clear_bit(TTY_HW_COOK_IN, &port->gs.tty->flags); - else - set_bit(TTY_HW_COOK_IN, &port->gs.tty->flags); - -/* Tell line discipline whether we will do output cooking. - * If OPOST is set and no other output flags are set then we can do output - * processing. Even if only *one* other flag in the O_OTHER group is set - * we do cooking in software. - */ - if (O_OPOST(port->gs.tty) && !O_OTHER(port->gs.tty)) - set_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags); - else - clear_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags); - return 0; } @@ -561,8 +642,8 @@ static void sci_transmit_chars(struct sci_port *port) { - int count, i; - int txroom; + unsigned int count, i; + unsigned int txroom; unsigned long flags; unsigned short status; unsigned short ctrl; @@ -645,7 +726,7 @@ static inline void sci_receive_chars(struct sci_port *port, struct pt_regs *regs) { - int i, count; + int count; struct tty_struct *tty; int copied=0; unsigned short status; @@ -655,6 +736,7 @@ return; tty = port->gs.tty; + while (1) { if (port->type == PORT_SCIF) { #if defined(CONFIG_CPU_SUBTYPE_SH7300) @@ -666,34 +748,41 @@ count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0; } - /* Don't copy more bytes than there is room for in the buffer */ - if (tty->flip.count + count > TTY_FLIPBUF_SIZE) - count = TTY_FLIPBUF_SIZE - tty->flip.count; + /* we must clear RDF or we get stuck in the interrupt for ever */ + sci_in(port, SCxSR); /* dummy read */ + sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port)); /* If for any reason we can't copy more data, we're done! */ if (count == 0) break; if (port->type == PORT_SCI) { - tty->flip.char_buf_ptr[0] = sci_in(port, SCxRDR); - tty->flip.flag_buf_ptr[0] = TTY_NORMAL; + if (tty->flip.count < TTY_FLIPBUF_SIZE) { + *tty->flip.char_buf_ptr++ = sci_in(port, SCxRDR); + *tty->flip.flag_buf_ptr++ = TTY_NORMAL; + tty->flip.count++; + port->icount.rx++; + copied++; + count--; + } } else { - for (i=0; i 0 && tty->flip.count < TTY_FLIPBUF_SIZE){ char c = sci_in(port, SCxRDR); status = sci_in(port, SCxSR); + #if defined(__SH3__) /* Skip "chars" during break */ if (port->break_flag) { if ((c == 0) && (status & SCxSR_FER(port))) { - count--; i--; + count--; continue; } /* Nonzero => end-of-break */ dprintk("scif: debounce<%02x>\n", c); port->break_flag = 0; if (STEPFN(c)) { - count--; i--; + count--; continue; } } @@ -706,7 +795,7 @@ handle_sysrq(c, regs, NULL, NULL); break_pressed = 0; - count--; i--; + count--; continue; } else if (c != 0) { break_pressed = 0; @@ -715,29 +804,31 @@ #endif /* CONFIG_SERIAL_CONSOLE && CONFIG_MAGIC_SYSRQ */ /* Store data and status */ - tty->flip.char_buf_ptr[i] = c; + *tty->flip.char_buf_ptr++ = c; + if (status&SCxSR_FER(port)) { - tty->flip.flag_buf_ptr[i] = TTY_FRAME; + *tty->flip.flag_buf_ptr++ = TTY_FRAME; dprintk("sci: frame error\n"); } else if (status&SCxSR_PER(port)) { - tty->flip.flag_buf_ptr[i] = TTY_PARITY; + *tty->flip.flag_buf_ptr++ = TTY_PARITY; dprintk("sci: parity error\n"); } else { - tty->flip.flag_buf_ptr[i] = TTY_NORMAL; + *tty->flip.flag_buf_ptr++ = TTY_NORMAL; } + tty->flip.count++; + port->icount.rx++; + copied++; + count--; } } - sci_in(port, SCxSR); /* dummy read */ - sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port)); - - /* Update the kernel buffer end */ - tty->flip.count += count; - tty->flip.char_buf_ptr += count; - tty->flip.flag_buf_ptr += count; - - copied += count; - port->icount.rx += count; + /* drop any remaining chars, we are full */ + if (count > 0) { + /* force an overrun error on last received char */ + tty->flip.flag_buf_ptr[TTY_FLIPBUF_SIZE - 1] = TTY_OVERRUN; + while (count-- > 0) + (void) sci_in(port, SCxRDR); + } } if (copied) @@ -821,9 +912,11 @@ *tty->flip.flag_buf_ptr++ = TTY_BREAK; dprintk("sci: BREAK detected\n"); } +#if defined(CONFIG_CPU_SH3) || defined(CONFIG_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) break_continue: +#endif -#if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_ST40) +#if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined (CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_ST40) /* XXX: Handle SCIF overrun error */ if (port->type == PORT_SCIF && (sci_in(port, SCLSR) & SCIF_ORER) != 0) { sci_out(port, SCLSR, 0); @@ -994,6 +1087,15 @@ static int sci_get_CD(void * ptr) { /* If you have signal for CD (Carrier Detect), please change here. */ + +#if defined(CONFIG_SH_SECUREEDGE5410) + struct sci_port *port = ptr; + + if (port == &sci_ports[0] || port == &sci_ports[1]) + if ((sci_getsignals(port) & TIOCM_CAR) == 0) + return 0; +#endif + return 1; } @@ -1409,6 +1511,18 @@ (port->type == PORT_SCI) ? "SCI" : "SCIF"); } +#if defined(CONFIG_SH_SECUREEDGE5410) + init_timer(&sci_timer_struct); + sci_timer_struct.function = sci_timer; + sci_timer_struct.data = 0; + sci_timer_struct.expires = jiffies + HZ/25; + add_timer(&sci_timer_struct); + + j = SECUREEDGE_READ_IOPORT(); + sci_dcdstatus[0] = !(j & 0x10); + sci_dcdstatus[1] = !(j & 0x1); +#endif + sci_init_drivers(); #ifdef CONFIG_SH_STANDARD_BIOS @@ -1425,6 +1539,9 @@ void cleanup_module(void) { +#if defined(CONFIG_SH_SECUREEDGE5410) + del_timer(&sci_timer_struct); +#endif tty_unregister_driver(&sci_driver); tty_unregister_driver(&sci_callout_driver); } @@ -1495,6 +1612,9 @@ case 115200: cflag |= B115200; break; + case 230400: + cflag |= B230400; + break; case 9600: default: cflag |= B9600; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/sh-sci.h linux-2.4.23-pre8/drivers/char/sh-sci.h --- linux-2.4.22/drivers/char/sh-sci.h 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/sh-sci.h 2003-10-22 22:49:09.000000000 +0000 @@ -1,4 +1,4 @@ -/* $Id: sh-sci.h,v 1.1.1.1.2.3 2003/07/16 18:46:06 yoshii Exp $ +/* $Id: sh-sci.h,v 1.1.1.1.2.5 2003/09/03 08:37:41 kkojima Exp $ * * linux/drivers/char/sh-sci.h * @@ -72,6 +72,15 @@ 0x30 /* TIE=0,RIE=0,TE=1,RE=1 */ : \ 0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ ) # define SCI_AND_SCIF +#elif defined(CONFIG_CPU_SUBTYPE_SH4_202) +# define SCI_NPORTS 1 +# define SCI_INIT { \ + { {}, PORT_SCIF, 0xFFE80000, SH4_SCIF_IRQS, sci_init_pins_scif } \ +} +# define SCSPTR2 0xFFE80020 /* 16 bit SCIF */ +# 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_CPU_SUBTYPE_ST40) # define SCI_NPORTS 2 # define SCI_INIT { \ @@ -210,29 +219,6 @@ /* Generic serial flags */ #define SCI_RX_THROTTLE 0x0000001 -/* generic serial tty */ -#define O_OTHER(tty) \ - ((O_OLCUC(tty)) ||\ - (O_ONLCR(tty)) ||\ - (O_OCRNL(tty)) ||\ - (O_ONOCR(tty)) ||\ - (O_ONLRET(tty)) ||\ - (O_OFILL(tty)) ||\ - (O_OFDEL(tty)) ||\ - (O_NLDLY(tty)) ||\ - (O_CRDLY(tty)) ||\ - (O_TABDLY(tty)) ||\ - (O_BSDLY(tty)) ||\ - (O_VTDLY(tty)) ||\ - (O_FFDLY(tty))) - -#define I_OTHER(tty) \ - ((I_INLCR(tty)) ||\ - (I_IGNCR(tty)) ||\ - (I_ICRNL(tty)) ||\ - (I_IUCLC(tty)) ||\ - (L_ISIG(tty))) - #define SCI_MAGIC 0xbabeface /* @@ -370,7 +356,7 @@ return ctrl_inb(SCPDR)&0x04 ? 1 : 0; /* IRDA */ return 1; } -#elif defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751) +#elif defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751) || defined(CONFIG_CPU_SUBTYPE_SH4_202) static inline int sci_rxd_in(struct sci_port *port) { #ifndef SCIF_ONLY @@ -446,4 +432,5 @@ #define BPS_38400 SCBRR_VALUE(38400) #define BPS_57600 SCBRR_VALUE(57600) #define BPS_115200 SCBRR_VALUE(115200) +#define BPS_230400 SCBRR_VALUE(230400) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/sn_serial.c linux-2.4.23-pre8/drivers/char/sn_serial.c --- linux-2.4.22/drivers/char/sn_serial.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/sn_serial.c 2003-10-22 22:48:10.000000000 +0000 @@ -0,0 +1,1078 @@ +/* + * C-Brick Serial Port (and console) driver for SGI Altix machines. + * + * This driver is NOT suitable for talking to the l1-controller for + * anything other than 'console activities' --- please use the l1 + * driver for that. + * + * + * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/NoticeExplan + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* this is needed for get_console_nasid */ +#include +#include + +#if defined(CONFIG_SGI_L1_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) +static char sysrq_serial_str[] = "\eSYS"; +static char *sysrq_serial_ptr = sysrq_serial_str; +static unsigned long sysrq_requested; +#endif /* CONFIG_SGI_L1_SERIAL_CONSOLE && CONFIG_MAGIC_SYSRQ */ + +/* minor device number */ +#define SN_SAL_MINOR 64 + +#define SN_SAL_SUBTYPE 1 + +/* number of characters left in xmit buffer before we ask for more */ +#define WAKEUP_CHARS 128 + +/* number of characters we can transmit to the SAL console at a time */ +#define SN_SAL_MAX_CHARS 120 + +#define SN_SAL_EVENT_WRITE_WAKEUP 0 + +#define CONSOLE_RESTART 1 + + +/* 64K, when we're asynch, it must be at least printk's LOG_BUF_LEN to + * avoid losing chars, (always has to be a power of 2) */ +#define SN_SAL_BUFFER_SIZE (64 * (1 << 10)) + +#define SN_SAL_UART_FIFO_DEPTH 16 +#define SN_SAL_UART_FIFO_SPEED_CPS 9600/10 + +/* we don't kmalloc/get_free_page these as we want them available + * before either of those are initialized */ +static char sn_xmit_buff_mem[SN_SAL_BUFFER_SIZE]; + +struct volatile_circ_buf { + char *cb_buf; + int cb_head; + int cb_tail; +}; + +static struct volatile_circ_buf xmit = { .cb_buf = sn_xmit_buff_mem }; +static char sn_tmp_buffer[SN_SAL_BUFFER_SIZE]; + +static struct tty_struct *sn_sal_tty; + +static struct timer_list sn_sal_timer; +static int sn_sal_event; /* event type for task queue */ +static int sn_sal_refcount; + +static int sn_sal_is_asynch; +static int sn_sal_irq; +static spinlock_t sn_sal_lock = SPIN_LOCK_UNLOCKED; +static int sn_total_tx_count; +static int sn_total_rx_count; + +static struct tty_struct *sn_sal_table; +static struct termios *sn_sal_termios; +static struct termios *sn_sal_termios_locked; + +static void sn_sal_tasklet_action(unsigned long data); +static DECLARE_TASKLET(sn_sal_tasklet, sn_sal_tasklet_action, 0); + +static unsigned long sn_interrupt_timeout; + +extern u64 master_node_bedrock_address; + +static int sn_debug_printf(const char *fmt, ...); + +#undef DEBUG +#ifdef DEBUG +#define DPRINTF(x...) sn_debug_printf(x) +#else +#define DPRINTF(x...) do { } while (0) +#endif + +struct sn_sal_ops { + int (*sal_puts)(const char *s, int len); + int (*sal_getc)(void); + int (*sal_input_pending)(void); + void (*sal_wakeup_transmit)(void); +}; + +/* This is the pointer used. It is assigned to point to one of + * the tables below. + */ +static struct sn_sal_ops *sn_func; + +/* Prototypes */ +static int snt_hw_puts(const char *, int); +static int snt_poll_getc(void); +static int snt_poll_input_pending(void); +static int snt_sim_puts(const char *, int); +static int snt_sim_getc(void); +static int snt_sim_input_pending(void); +static int snt_intr_getc(void); +static int snt_intr_input_pending(void); +static void sn_intr_transmit_chars(void); + +/* A table for polling */ +static struct sn_sal_ops poll_ops = { + .sal_puts = snt_hw_puts, + .sal_getc = snt_poll_getc, + .sal_input_pending = snt_poll_input_pending +}; + +/* A table for the simulator */ +static struct sn_sal_ops sim_ops = { + .sal_puts = snt_sim_puts, + .sal_getc = snt_sim_getc, + .sal_input_pending = snt_sim_input_pending +}; + +/* A table for interrupts enabled */ +static struct sn_sal_ops intr_ops = { + .sal_puts = snt_hw_puts, + .sal_getc = snt_intr_getc, + .sal_input_pending = snt_intr_input_pending, + .sal_wakeup_transmit = sn_intr_transmit_chars +}; + + +/* the console does output in two distinctly different ways: + * synchronous and asynchronous (buffered). initally, early_printk + * does synchronous output. any data written goes directly to the SAL + * to be output (incidentally, it is internally buffered by the SAL) + * after interrupts and timers are initialized and available for use, + * the console init code switches to asynchronous output. this is + * also the earliest opportunity to begin polling for console input. + * after console initialization, console output and tty (serial port) + * output is buffered and sent to the SAL asynchronously (either by + * timer callback or by UART interrupt) */ + + +/* routines for running the console in polling mode */ + +static int +snt_hw_puts(const char *s, int len) +{ + /* looking at the PROM source code, putb calls the flush + * routine, so if we send characters in FIFO sized chunks, it + * should go out by the next time the timer gets called */ + return ia64_sn_console_putb(s, len); +} + +static int +snt_poll_getc(void) +{ + int ch; + ia64_sn_console_getc(&ch); + return ch; +} + +static int +snt_poll_input_pending(void) +{ + int status, input; + + status = ia64_sn_console_check(&input); + return !status && input; +} + + +/* routines for running the console on the simulator */ + +static int +snt_sim_puts(const char *str, int count) +{ + int counter = count; + +#ifdef FLAG_DIRECT_CONSOLE_WRITES + /* This is an easy way to pre-pend the output to know whether the output + * was done via sal or directly */ + writeb('[', master_node_bedrock_address + (UART_TX << 3)); + writeb('+', master_node_bedrock_address + (UART_TX << 3)); + writeb(']', master_node_bedrock_address + (UART_TX << 3)); + writeb(' ', master_node_bedrock_address + (UART_TX << 3)); +#endif /* FLAG_DIRECT_CONSOLE_WRITES */ + while (counter > 0) { + writeb(*str, master_node_bedrock_address + (UART_TX << 3)); + counter--; + str++; + } + + return count; +} + +static int +snt_sim_getc(void) +{ + return readb(master_node_bedrock_address + (UART_RX << 3)); +} + +static int +snt_sim_input_pending(void) +{ + return readb(master_node_bedrock_address + (UART_LSR << 3)) & UART_LSR_DR; +} + + +/* routines for an interrupt driven console (normal) */ + +static int +snt_intr_getc(void) +{ + return ia64_sn_console_readc(); +} + +static int +snt_intr_input_pending(void) +{ + return ia64_sn_console_intr_status() & SAL_CONSOLE_INTR_RECV; +} + +/* The early printk (possible setup) and function call */ + +void +early_printk_sn_sal(const char *s, unsigned count) +{ +#if defined(CONFIG_IA64_EARLY_PRINTK_SGI_SN) || defined(CONFIG_IA64_SGI_SN_SIM) + extern void early_sn_setup(void); +#endif + + if (!sn_func) { + if (IS_RUNNING_ON_SIMULATOR()) + sn_func = &sim_ops; + else + sn_func = &poll_ops; + +#if defined(CONFIG_IA64_EARLY_PRINTK_SGI_SN) || defined(CONFIG_IA64_SGI_SN_SIM) + early_sn_setup(); +#endif + } + sn_func->sal_puts(s, count); +} + +/* this is as "close to the metal" as we can get, used when the driver + * itself may be broken */ +static int +sn_debug_printf(const char *fmt, ...) +{ + static char printk_buf[1024]; + int printed_len; + va_list args; + + va_start(args, fmt); + printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args); + early_printk_sn_sal(printk_buf, printed_len); + va_end(args); + return printed_len; +} + +/* + * Interrupt handling routines. + */ + +static void +sn_sal_sched_event(int event) +{ + sn_sal_event |= (1 << event); + tasklet_schedule(&sn_sal_tasklet); +} + +/* sn_receive_chars can be called before sn_sal_tty is initialized. in + * that case, its only use is to trigger sysrq and kdb */ +static void +sn_receive_chars(struct pt_regs *regs, unsigned long *flags) +{ + int ch; + + while (sn_func->sal_input_pending()) { + ch = sn_func->sal_getc(); + if (ch < 0) { + printk(KERN_ERR "sn_serial: An error occured while " + "obtaining data from the console (0x%0x)\n", ch); + break; + } +#if defined(CONFIG_SGI_L1_SERIAL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) + if (sysrq_requested) { + unsigned long sysrq_timeout = sysrq_requested + HZ*5; + + sysrq_requested = 0; + if (ch && time_before(jiffies, sysrq_timeout)) { + spin_unlock_irqrestore(&sn_sal_lock, *flags); + handle_sysrq(ch, regs, NULL, NULL); + spin_lock_irqsave(&sn_sal_lock, *flags); + /* don't record this char */ + continue; + } + } + if (ch == *sysrq_serial_ptr) { + if (!(*++sysrq_serial_ptr)) { + sysrq_requested = jiffies; + sysrq_serial_ptr = sysrq_serial_str; + } + } else + sysrq_serial_ptr = sysrq_serial_str; +#endif /* CONFIG_SGI_L1_SERIAL_CONSOLE && CONFIG_MAGIC_SYSRQ */ + + /* record the character to pass up to the tty layer */ + if (sn_sal_tty) { + *sn_sal_tty->flip.char_buf_ptr = ch; + sn_sal_tty->flip.char_buf_ptr++; + sn_sal_tty->flip.count++; + if (sn_sal_tty->flip.count == TTY_FLIPBUF_SIZE) + break; + } + sn_total_rx_count++; + } + + if (sn_sal_tty) + tty_flip_buffer_push((struct tty_struct *)sn_sal_tty); +} + + +/* synch_flush_xmit must be called with sn_sal_lock */ +static void +synch_flush_xmit(void) +{ + int xmit_count, tail, head, loops, ii; + int result; + char *start; + + if (xmit.cb_head == xmit.cb_tail) + return; /* Nothing to do. */ + + head = xmit.cb_head; + tail = xmit.cb_tail; + start = &xmit.cb_buf[tail]; + + /* twice around gets the tail to the end of the buffer and + * then to the head, if needed */ + loops = (head < tail) ? 2 : 1; + + for (ii = 0; ii < loops; ii++) { + xmit_count = (head < tail) ? (SN_SAL_BUFFER_SIZE - tail) : (head - tail); + + if (xmit_count > 0) { + result = sn_func->sal_puts((char *)start, xmit_count); + if (!result) + sn_debug_printf("\n*** synch_flush_xmit failed to flush\n"); + if (result > 0) { + xmit_count -= result; + sn_total_tx_count += result; + tail += result; + tail &= SN_SAL_BUFFER_SIZE - 1; + xmit.cb_tail = tail; + start = (char *)&xmit.cb_buf[tail]; + } + } + } +} + +/* must be called with a lock protecting the circular buffer and + * sn_sal_tty */ +static void +sn_poll_transmit_chars(void) +{ + int xmit_count, tail, head; + int result; + char *start; + + BUG_ON(!sn_sal_is_asynch); + + if (xmit.cb_head == xmit.cb_tail || + (sn_sal_tty && (sn_sal_tty->stopped || sn_sal_tty->hw_stopped))) { + /* Nothing to do. */ + return; + } + + head = xmit.cb_head; + tail = xmit.cb_tail; + start = &xmit.cb_buf[tail]; + + xmit_count = (head < tail) ? (SN_SAL_BUFFER_SIZE - tail) : (head - tail); + + if (xmit_count == 0) + sn_debug_printf("\n*** empty xmit_count\n"); + + /* use the ops, as we could be on the simulator */ + result = sn_func->sal_puts((char *)start, xmit_count); + if (!result) + sn_debug_printf("\n*** error in synchronous sal_puts\n"); + /* XXX chadt clean this up */ + if (result > 0) { + xmit_count -= result; + sn_total_tx_count += result; + tail += result; + tail &= SN_SAL_BUFFER_SIZE - 1; + xmit.cb_tail = tail; + start = &xmit.cb_buf[tail]; + } + + /* if there's few enough characters left in the xmit buffer + * that we could stand for the upper layer to send us some + * more, ask for it. */ + if (sn_sal_tty) + if (CIRC_CNT(xmit.cb_head, xmit.cb_tail, SN_SAL_BUFFER_SIZE) < WAKEUP_CHARS) + sn_sal_sched_event(SN_SAL_EVENT_WRITE_WAKEUP); +} + + +/* must be called with a lock protecting the circular buffer and + * sn_sal_tty */ +static void +sn_intr_transmit_chars(void) +{ + int xmit_count, tail, head, loops, ii; + int result; + char *start; + + BUG_ON(!sn_sal_is_asynch); + + if (xmit.cb_head == xmit.cb_tail || + (sn_sal_tty && (sn_sal_tty->stopped || sn_sal_tty->hw_stopped))) { + /* Nothing to do. */ + return; + } + + head = xmit.cb_head; + tail = xmit.cb_tail; + start = &xmit.cb_buf[tail]; + + /* twice around gets the tail to the end of the buffer and + * then to the head, if needed */ + loops = (head < tail) ? 2 : 1; + + for (ii = 0; ii < loops; ii++) { + xmit_count = (head < tail) ? + (SN_SAL_BUFFER_SIZE - tail) : (head - tail); + + if (xmit_count > 0) { + result = ia64_sn_console_xmit_chars((char *)start, xmit_count); +#ifdef DEBUG + if (!result) + sn_debug_printf("`"); +#endif + if (result > 0) { + xmit_count -= result; + sn_total_tx_count += result; + tail += result; + tail &= SN_SAL_BUFFER_SIZE - 1; + xmit.cb_tail = tail; + start = &xmit.cb_buf[tail]; + } + } + } + + /* if there's few enough characters left in the xmit buffer + * that we could stand for the upper layer to send us some + * more, ask for it. */ + if (sn_sal_tty) + if (CIRC_CNT(xmit.cb_head, xmit.cb_tail, SN_SAL_BUFFER_SIZE) < WAKEUP_CHARS) + sn_sal_sched_event(SN_SAL_EVENT_WRITE_WAKEUP); +} + + +static void +sn_sal_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + /* this call is necessary to pass the interrupt back to the + * SAL, since it doesn't intercept the UART interrupts + * itself */ + int status = ia64_sn_console_intr_status(); + unsigned long flags; + + spin_lock_irqsave(&sn_sal_lock, flags); + if (status & SAL_CONSOLE_INTR_RECV) + sn_receive_chars(regs, &flags); + if (status & SAL_CONSOLE_INTR_XMIT) + sn_intr_transmit_chars(); + spin_unlock_irqrestore(&sn_sal_lock, flags); +} + + +/* returns the console irq if interrupt is successfully registered, + * else 0 */ +static int +sn_sal_connect_interrupt(void) +{ + cpuid_t intr_cpuid; + unsigned int intr_cpuloc; + nasid_t console_nasid; + unsigned int console_irq; + int result; + + /* if it is an old prom, run in poll mode */ + if ((sn_sal_rev_major() <= 1) && (sn_sal_rev_minor() <= 3)) { + /* before version 1.06 doesn't work */ + printk(KERN_INFO "sn_serial: old prom version %x.%02x" + " - running in polled mode\n", + sn_sal_rev_major(), sn_sal_rev_minor()); + return 0; + } + + console_nasid = ia64_sn_get_console_nasid(); + intr_cpuid = NODEPDA(NASID_TO_COMPACT_NODEID(console_nasid))->node_first_cpu; + intr_cpuloc = cpu_physical_id(intr_cpuid); + console_irq = CPU_VECTOR_TO_IRQ(intr_cpuloc, SGI_UART_VECTOR); + + result = intr_connect_level(intr_cpuid, SGI_UART_VECTOR, 0 /*not used*/, 0 /*not used*/); + BUG_ON(result != SGI_UART_VECTOR); + + result = request_irq(console_irq, sn_sal_interrupt, SA_INTERRUPT, + "SAL console driver", &sn_sal_tty); + if (result >= 0) + return console_irq; + + printk(KERN_INFO "sn_serial: console proceeding in polled mode\n"); + return 0; +} + +static void +sn_sal_tasklet_action(unsigned long data) +{ + unsigned long flags; + + if (sn_sal_tty) { + spin_lock_irqsave(&sn_sal_lock, flags); + if (sn_sal_tty) { + if (test_and_clear_bit(SN_SAL_EVENT_WRITE_WAKEUP, &sn_sal_event)) { + if ((sn_sal_tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) + && sn_sal_tty->ldisc.write_wakeup) + (sn_sal_tty->ldisc.write_wakeup)((struct tty_struct *)sn_sal_tty); + wake_up_interruptible((wait_queue_head_t *)&sn_sal_tty->write_wait); + } + } + spin_unlock_irqrestore(&sn_sal_lock, flags); + } +} + + +/* + * This function handles polled mode. + */ +static void +sn_sal_timer_poll(unsigned long dummy) +{ + unsigned long flags; + + if (!sn_sal_irq) { + spin_lock_irqsave(&sn_sal_lock, flags); + sn_receive_chars(NULL, &flags); + sn_poll_transmit_chars(); + spin_unlock_irqrestore(&sn_sal_lock, flags); + mod_timer(&sn_sal_timer, jiffies + sn_interrupt_timeout); + } +} + +static void +sn_sal_timer_restart(unsigned long dummy) +{ + unsigned long flags; + + local_irq_save(flags); + sn_sal_interrupt(0, NULL, NULL); + local_irq_restore(flags); + mod_timer(&sn_sal_timer, jiffies + sn_interrupt_timeout); +} + +/* + * User-level console routines + */ + +static int +sn_sal_open(struct tty_struct *tty, struct file *filp) +{ + unsigned long flags; + + DPRINTF("sn_sal_open: sn_sal_tty = %p, tty = %p, filp = %p\n", + sn_sal_tty, tty, filp); + + spin_lock_irqsave(&sn_sal_lock, flags); + if (!sn_sal_tty) + sn_sal_tty = tty; + spin_unlock_irqrestore(&sn_sal_lock, flags); + + return 0; +} + + +/* We're keeping all our resources. We're keeping interrupts turned + * on. Maybe just let the tty layer finish its stuff...? GMSH + */ +static void +sn_sal_close(struct tty_struct *tty, struct file * filp) +{ + if (tty->count == 1) { + unsigned long flags; + tty->closing = 1; + if (tty->driver.flush_buffer) + tty->driver.flush_buffer(tty); + if (tty->ldisc.flush_buffer) + tty->ldisc.flush_buffer(tty); + tty->closing = 0; + spin_lock_irqsave(&sn_sal_lock, flags); + sn_sal_tty = NULL; + spin_unlock_irqrestore(&sn_sal_lock, flags); + } +} + + +static int +sn_sal_write(struct tty_struct *tty, int from_user, + const unsigned char *buf, int count) +{ + int c, ret = 0; + unsigned long flags; + + if (from_user) { + while (1) { + int c1; + c = CIRC_SPACE_TO_END(xmit.cb_head, xmit.cb_tail, + SN_SAL_BUFFER_SIZE); + + if (count < c) + c = count; + if (c <= 0) + break; + + c -= copy_from_user(sn_tmp_buffer, buf, c); + if (!c) { + if (!ret) + ret = -EFAULT; + break; + } + + /* Turn off interrupts and see if the xmit buffer has + * moved since the last time we looked. + */ + spin_lock_irqsave(&sn_sal_lock, flags); + c1 = CIRC_SPACE_TO_END(xmit.cb_head, xmit.cb_tail, SN_SAL_BUFFER_SIZE); + + if (c1 < c) + c = c1; + + memcpy(xmit.cb_buf + xmit.cb_head, sn_tmp_buffer, c); + xmit.cb_head = ((xmit.cb_head + c) & (SN_SAL_BUFFER_SIZE - 1)); + spin_unlock_irqrestore(&sn_sal_lock, flags); + + buf += c; + count -= c; + ret += c; + } + } else { + /* The buffer passed in isn't coming from userland, + * so cut out the middleman (sn_tmp_buffer). + */ + spin_lock_irqsave(&sn_sal_lock, flags); + while (1) { + c = CIRC_SPACE_TO_END(xmit.cb_head, xmit.cb_tail, SN_SAL_BUFFER_SIZE); + + if (count < c) + c = count; + if (c <= 0) { + break; + } + memcpy(xmit.cb_buf + xmit.cb_head, buf, c); + xmit.cb_head = ((xmit.cb_head + c) & (SN_SAL_BUFFER_SIZE - 1)); + buf += c; + count -= c; + ret += c; + } + spin_unlock_irqrestore(&sn_sal_lock, flags); + } + + spin_lock_irqsave(&sn_sal_lock, flags); + if (xmit.cb_head != xmit.cb_tail && !(tty && (tty->stopped || tty->hw_stopped))) + if (sn_func->sal_wakeup_transmit) + sn_func->sal_wakeup_transmit(); + spin_unlock_irqrestore(&sn_sal_lock, flags); + + return ret; +} + + +static void +sn_sal_put_char(struct tty_struct *tty, unsigned char ch) +{ + unsigned long flags; + + spin_lock_irqsave(&sn_sal_lock, flags); + if (CIRC_SPACE(xmit.cb_head, xmit.cb_tail, SN_SAL_BUFFER_SIZE) != 0) { + xmit.cb_buf[xmit.cb_head] = ch; + xmit.cb_head = (xmit.cb_head + 1) & (SN_SAL_BUFFER_SIZE-1); + if ( sn_func->sal_wakeup_transmit ) + sn_func->sal_wakeup_transmit(); + } + spin_unlock_irqrestore(&sn_sal_lock, flags); +} + + +static void +sn_sal_flush_chars(struct tty_struct *tty) +{ + unsigned long flags; + + spin_lock_irqsave(&sn_sal_lock, flags); + if (CIRC_CNT(xmit.cb_head, xmit.cb_tail, SN_SAL_BUFFER_SIZE)) + if (sn_func->sal_wakeup_transmit) + sn_func->sal_wakeup_transmit(); + spin_unlock_irqrestore(&sn_sal_lock, flags); +} + + +static int +sn_sal_write_room(struct tty_struct *tty) +{ + unsigned long flags; + int space; + + spin_lock_irqsave(&sn_sal_lock, flags); + space = CIRC_SPACE(xmit.cb_head, xmit.cb_tail, SN_SAL_BUFFER_SIZE); + spin_unlock_irqrestore(&sn_sal_lock, flags); + return space; +} + + +static int +sn_sal_chars_in_buffer(struct tty_struct *tty) +{ + unsigned long flags; + int space; + + spin_lock_irqsave(&sn_sal_lock, flags); + space = CIRC_CNT(xmit.cb_head, xmit.cb_tail, SN_SAL_BUFFER_SIZE); + DPRINTF("<%d>", space); + spin_unlock_irqrestore(&sn_sal_lock, flags); + return space; +} + + +static void +sn_sal_flush_buffer(struct tty_struct *tty) +{ + unsigned long flags; + + /* drop everything */ + spin_lock_irqsave(&sn_sal_lock, flags); + xmit.cb_head = xmit.cb_tail = 0; + spin_unlock_irqrestore(&sn_sal_lock, flags); + + /* wake up tty level */ + wake_up_interruptible(&tty->write_wait); + if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) + (tty->ldisc.write_wakeup)(tty); +} + + +static void +sn_sal_hangup(struct tty_struct *tty) +{ + sn_sal_flush_buffer(tty); +} + + +static void +sn_sal_wait_until_sent(struct tty_struct *tty, int timeout) +{ + /* this is SAL's problem */ + DPRINTF(""); +} + + +/* + * sn_sal_read_proc + * + * Console /proc interface + */ + +static int +sn_sal_read_proc(char *page, char **start, off_t off, int count, + int *eof, void *data) +{ + int len = 0; + off_t begin = 0; + + len += sprintf(page, "sn_serial: nasid:%d irq:%d tx:%d rx:%d\n", + snia_get_console_nasid(), sn_sal_irq, + sn_total_tx_count, sn_total_rx_count); + *eof = 1; + + if (off >= len+begin) + return 0; + *start = page + (off-begin); + + return count < begin+len-off ? count : begin+len-off; +} + + +static struct tty_driver sn_sal_driver = { + .magic = TTY_DRIVER_MAGIC, + .driver_name = "sn_serial", +#if defined(CONFIG_DEVFS_FS) + .name = "tts/%d", +#else + .name = "ttyS", +#endif + .major = TTY_MAJOR, + .minor_start = SN_SAL_MINOR, + .num = 1, + .type = TTY_DRIVER_TYPE_SERIAL, + .subtype = SN_SAL_SUBTYPE, + .flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS, + .refcount = &sn_sal_refcount, + .table = &sn_sal_table, + .termios = &sn_sal_termios, + .termios_locked = &sn_sal_termios_locked, + + .open = sn_sal_open, + .close = sn_sal_close, + .write = sn_sal_write, + .put_char = sn_sal_put_char, + .flush_chars = sn_sal_flush_chars, + .write_room = sn_sal_write_room, + .chars_in_buffer = sn_sal_chars_in_buffer, + .hangup = sn_sal_hangup, + .wait_until_sent = sn_sal_wait_until_sent, + .read_proc = sn_sal_read_proc, +}; + +/* sn_sal_init wishlist: + * - allocate sn_tmp_buffer + * - fix up the tty_driver struct + * - turn on receive interrupts + * - do any termios twiddling once and for all + */ + +/* + * Boot-time initialization code + */ + +static void __init +sn_sal_switch_to_asynch(void) +{ + unsigned long flags; + + sn_debug_printf("sn_serial: about to switch to asynchronous console\n"); + + /* without early_printk, we may be invoked late enough to race + * with other cpus doing console IO at this point, however + * console interrupts will never be enabled */ + spin_lock_irqsave(&sn_sal_lock, flags); + + /* early_printk invocation may have done this for us */ + if (!sn_func) { + if (IS_RUNNING_ON_SIMULATOR()) + sn_func = &sim_ops; + else + sn_func = &poll_ops; + } + + /* we can't turn on the console interrupt (as request_irq + * calls kmalloc, which isn't set up yet), so we rely on a + * timer to poll for input and push data from the console + * buffer. + */ + init_timer(&sn_sal_timer); + sn_sal_timer.function = sn_sal_timer_poll; + + if (IS_RUNNING_ON_SIMULATOR()) + sn_interrupt_timeout = 6; + else { + /* 960cps / 16 char FIFO = 60HZ + * HZ / (SN_SAL_FIFO_SPEED_CPS / SN_SAL_FIFO_DEPTH) */ + sn_interrupt_timeout = HZ * SN_SAL_UART_FIFO_DEPTH + / SN_SAL_UART_FIFO_SPEED_CPS; + } + mod_timer(&sn_sal_timer, jiffies + sn_interrupt_timeout); + + sn_sal_is_asynch = 1; + spin_unlock_irqrestore(&sn_sal_lock, flags); +} + +static void __init +sn_sal_switch_to_interrupts(void) +{ + int irq; + + sn_debug_printf("sn_serial: switching to interrupt driven console\n"); + + irq = sn_sal_connect_interrupt(); + if (irq) { + unsigned long flags; + spin_lock_irqsave(&sn_sal_lock, flags); + + /* sn_sal_irq is a global variable. When it's set to + * a non-zero value, we stop polling for input (since + * interrupts should now be enabled). */ + sn_sal_irq = irq; + sn_func = &intr_ops; + + /* turn on receive interrupts */ + ia64_sn_console_intr_enable(SAL_CONSOLE_INTR_RECV); + + /* the polling timer is already set up, we just change the + * frequency. if we've successfully enabled interrupts (and + * CONSOLE_RESTART isn't defined) the next timer expiration + * will be the last, otherwise we continue polling */ + if (CONSOLE_RESTART) { + /* kick the console every once in a while in + * case we miss an interrupt */ + sn_interrupt_timeout = 20*HZ; + sn_sal_timer.function = sn_sal_timer_restart; + mod_timer(&sn_sal_timer, jiffies + sn_interrupt_timeout); + } + spin_unlock_irqrestore(&sn_sal_lock, flags); + } +} + +static int __init +sn_sal_module_init(void) +{ + int retval; + + printk("sn_serial: sn_sal_module_init\n"); + + if (!ia64_platform_is("sn2")) + return -ENODEV; + + /* when this driver is compiled in, the console initialization + * will have already switched us into asynchronous operation + * before we get here through the module initcalls */ + if (!sn_sal_is_asynch) + sn_sal_switch_to_asynch(); + + /* at this point (module_init) we can try to turn on interrupts */ + if (!IS_RUNNING_ON_SIMULATOR()) + sn_sal_switch_to_interrupts(); + + sn_sal_driver.init_termios = tty_std_termios; + sn_sal_driver.init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; + + if ((retval = tty_register_driver(&sn_sal_driver))) { + printk(KERN_ERR "sn_serial: Unable to register tty driver\n"); + return retval; + } + + tty_register_devfs(&sn_sal_driver, 0, sn_sal_driver.minor_start); + + return 0; +} + + +static void __exit +sn_sal_module_exit(void) +{ + del_timer_sync(&sn_sal_timer); + tty_unregister_driver(&sn_sal_driver); +} + +module_init(sn_sal_module_init); +module_exit(sn_sal_module_exit); + +/* + * Kernel console definitions + */ + +#ifdef CONFIG_SGI_L1_SERIAL_CONSOLE +/* + * Print a string to the SAL console. The console_lock must be held + * when we get here. + */ +static void +sn_sal_console_write(struct console *co, const char *s, unsigned count) +{ + unsigned long flags; + + if (count > CIRC_SPACE_TO_END(xmit.cb_head, xmit.cb_tail, + SN_SAL_BUFFER_SIZE)) + sn_debug_printf("\n*** SN_SAL_BUFFER_SIZE too small, lost chars\n"); + + /* somebody really wants this output, might be an + * oops, kdb, panic, etc. make sure they get it. */ +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) + if (spin_is_locked(&sn_sal_lock)) { + synch_flush_xmit(); + sn_func->sal_puts(s, count); + } else +#endif + if (in_interrupt()) { + spin_lock_irqsave(&sn_sal_lock, flags); + synch_flush_xmit(); + spin_unlock_irqrestore(&sn_sal_lock, flags); + sn_func->sal_puts(s, count); + } else { +#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) + sn_sal_write(NULL, 0, s, count); +#else + synch_flush_xmit(); + sn_func->sal_puts(s, count); +#endif + } +} + +static kdev_t +sn_sal_console_device(struct console *c) +{ + return MKDEV(TTY_MAJOR, 64 + c->index); +} + +static int __init +sn_sal_console_setup(struct console *co, char *options) +{ + return 0; +} + + +static struct console sal_console = { + .name = "ttyS", + .write = sn_sal_console_write, + .device = sn_sal_console_device, + .setup = sn_sal_console_setup, + .index = -1 +}; + +void __init +sn_sal_serial_console_init(void) +{ + if (ia64_platform_is("sn2")) { + sn_sal_switch_to_asynch(); + register_console(&sal_console); + } +} + +#endif /* CONFIG_SGI_L1_SERIAL_CONSOLE */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/softdog.c linux-2.4.23-pre8/drivers/char/softdog.c --- linux-2.4.22/drivers/char/softdog.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/softdog.c 2003-10-22 22:48:39.000000000 +0000 @@ -124,7 +124,7 @@ * Shut off the timer. * Lock it in if it's a module and we set nowayout */ - if (expect_close) { + if (expect_close || nowayout == 0) { del_timer(&watchdog_ticktock); } else { printk(KERN_CRIT "SOFTDOG: WDT device closed unexpectedly. WDT will not stop!\n"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/sonypi.c linux-2.4.23-pre8/drivers/char/sonypi.c --- linux-2.4.22/drivers/char/sonypi.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/sonypi.c 2003-10-22 22:49:13.000000000 +0000 @@ -308,7 +308,7 @@ int i, j; v1 = inb_p(sonypi_device.ioport1); - v2 = inb_p(sonypi_device.ioport2); + v2 = inb_p(sonypi_device.ioport1 + sonypi_device.evtype_offset); for (i = 0; sonypi_eventtypes[i].model; i++) { if (sonypi_device.model != sonypi_eventtypes[i].model) @@ -665,11 +665,13 @@ if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2) { ioport_list = sonypi_type2_ioport_list; sonypi_device.region_size = SONYPI_TYPE2_REGION_SIZE; + sonypi_device.evtype_offset = SONYPI_TYPE2_EVTYPE_OFFSET; irq_list = sonypi_type2_irq_list; } else { ioport_list = sonypi_type1_ioport_list; sonypi_device.region_size = SONYPI_TYPE1_REGION_SIZE; + sonypi_device.evtype_offset = SONYPI_TYPE1_EVTYPE_OFFSET; irq_list = sonypi_type1_irq_list; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/sonypi.h linux-2.4.23-pre8/drivers/char/sonypi.h --- linux-2.4.22/drivers/char/sonypi.h 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/sonypi.h 2003-10-22 22:47:35.000000000 +0000 @@ -56,12 +56,14 @@ #define SONYPI_BASE 0x50 #define SONYPI_G10A (SONYPI_BASE+0x14) #define SONYPI_TYPE1_REGION_SIZE 0x08 +#define SONYPI_TYPE1_EVTYPE_OFFSET 0x04 /* type2 series specifics */ #define SONYPI_SIRQ 0x9b #define SONYPI_SLOB 0x9c #define SONYPI_SHIB 0x9d #define SONYPI_TYPE2_REGION_SIZE 0x20 +#define SONYPI_TYPE2_EVTYPE_OFFSET 0x12 /* battery / brightness addresses */ #define SONYPI_BAT_FLAGS 0x81 @@ -167,6 +169,7 @@ #define SONYPI_THUMBPHRASE_MASK 0x00000200 #define SONYPI_MEYE_MASK 0x00000400 #define SONYPI_MEMORYSTICK_MASK 0x00000800 +#define SONYPI_BATTERY_MASK 0x00001000 struct sonypi_event { u8 data; @@ -293,6 +296,13 @@ { 0, 0 } }; +/* The set of possible battery events */ +static struct sonypi_event sonypi_batteryev[] = { + { 0x20, SONYPI_EVENT_BATTERY_INSERT }, + { 0x30, SONYPI_EVENT_BATTERY_REMOVE }, + { 0, 0 } +}; + struct sonypi_eventtypes { int model; u8 data; @@ -307,19 +317,22 @@ { SONYPI_DEVICE_MODEL_TYPE1, 0x20, SONYPI_FNKEY_MASK, sonypi_fnkeyev }, { SONYPI_DEVICE_MODEL_TYPE1, 0x30, SONYPI_BLUETOOTH_MASK, sonypi_blueev }, { SONYPI_DEVICE_MODEL_TYPE1, 0x40, SONYPI_PKEY_MASK, sonypi_pkeyev }, + { SONYPI_DEVICE_MODEL_TYPE1, 0x30, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev }, + { SONYPI_DEVICE_MODEL_TYPE1, 0x40, SONYPI_BATTERY_MASK, sonypi_batteryev }, { SONYPI_DEVICE_MODEL_TYPE2, 0, 0xffffffff, sonypi_releaseev }, { SONYPI_DEVICE_MODEL_TYPE2, 0x38, SONYPI_LID_MASK, sonypi_lidev }, - { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_JOGGER_MASK, sonypi_joggerev }, - { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_CAPTURE_MASK, sonypi_captureev }, - { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_FNKEY_MASK, sonypi_fnkeyev }, - { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_BLUETOOTH_MASK, sonypi_blueev }, + { SONYPI_DEVICE_MODEL_TYPE2, 0x11, SONYPI_JOGGER_MASK, sonypi_joggerev }, + { SONYPI_DEVICE_MODEL_TYPE2, 0x61, SONYPI_CAPTURE_MASK, sonypi_captureev }, + { SONYPI_DEVICE_MODEL_TYPE2, 0x21, SONYPI_FNKEY_MASK, sonypi_fnkeyev }, + { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_BLUETOOTH_MASK, sonypi_blueev }, { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_PKEY_MASK, sonypi_pkeyev }, - { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_BACK_MASK, sonypi_backev }, + { SONYPI_DEVICE_MODEL_TYPE2, 0x11, SONYPI_BACK_MASK, sonypi_backev }, { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_HELP_MASK, sonypi_helpev }, { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_ZOOM_MASK, sonypi_zoomev }, { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_THUMBPHRASE_MASK, sonypi_thumbphraseev }, - { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev }, + { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev }, + { SONYPI_DEVICE_MODEL_TYPE2, 0x41, SONYPI_BATTERY_MASK, sonypi_batteryev }, { 0, 0, 0, 0 } }; @@ -354,6 +367,7 @@ u16 ioport1; u16 ioport2; u16 region_size; + u16 evtype_offset; int camera_power; int bluetooth_power; struct semaphore lock; @@ -380,30 +394,17 @@ } #ifdef CONFIG_ACPI -#include -#if (ACPI_CA_VERSION > 0x20021121) -#ifdef CONFIG_ACPI_EC -#define SONYPI_USE_ACPI -#endif -#endif -#endif /* CONFIG_ACPI */ - -#ifdef CONFIG_ACPI -#ifdef SONYPI_USE_ACPI extern int acpi_disabled; #define SONYPI_ACPI_ACTIVE (!acpi_disabled) #else -#define SONYPI_ACPI_ACTIVE 1 -#endif -#else /* CONFIG_ACPI */ #define SONYPI_ACPI_ACTIVE 0 #endif /* CONFIG_ACPI */ extern int verbose; static inline int sonypi_ec_write(u8 addr, u8 value) { -#ifdef SONYPI_USE_ACPI - if (!acpi_disabled) +#ifdef CONFIG_ACPI_EC + if (SONYPI_ACPI_ACTIVE) return ec_write(addr, value); #endif wait_on_command(1, inb_p(SONYPI_CST_IOPORT) & 3, ITERATIONS_LONG); @@ -417,8 +418,8 @@ } static inline int sonypi_ec_read(u8 addr, u8 *value) { -#ifdef SONYPI_USE_ACPI - if (!acpi_disabled) +#ifdef CONFIG_ACPI_EC + if (SONYPI_ACPI_ACTIVE) return ec_read(addr, value); #endif wait_on_command(1, inb_p(SONYPI_CST_IOPORT) & 3, ITERATIONS_LONG); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/synclink.c linux-2.4.23-pre8/drivers/char/synclink.c --- linux-2.4.22/drivers/char/synclink.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/synclink.c 2003-10-22 22:48:30.000000000 +0000 @@ -1,7 +1,7 @@ /* * linux/drivers/char/synclink.c * - * $Id: synclink.c,v 3.12 2001/07/18 19:14:21 paulkf Exp $ + * $Id: synclink.c,v 3.21 2003/09/05 14:04:24 paulkf Exp $ * * Device driver for Microgate SyncLink ISA and PCI * high speed multiprotocol serial adapters. @@ -198,6 +198,7 @@ int flags; int count; /* count of opens */ int line; + int hw_version; unsigned short close_delay; unsigned short closing_wait; /* time to wait before closing */ @@ -270,6 +271,7 @@ int rx_enabled; int rx_overflow; + int rx_rcc_underrun; int tx_enabled; int tx_active; @@ -922,7 +924,7 @@ MODULE_PARM(txholdbufs,"1-" __MODULE_STRING(MAX_TOTAL_DEVICES) "i"); static char *driver_name = "SyncLink serial driver"; -static char *driver_version = "$Revision: 3.12 $"; +static char *driver_version = "$Revision: 3.21 $"; static int __init synclink_init_one (struct pci_dev *dev, const struct pci_device_id *ent); @@ -930,17 +932,20 @@ static struct pci_device_id synclink_pci_tbl[] __devinitdata = { { PCI_VENDOR_ID_MICROGATE, PCI_DEVICE_ID_MICROGATE_USC, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_MICROGATE, 0x0210, PCI_ANY_ID, PCI_ANY_ID, }, { 0, }, /* terminate list */ }; MODULE_DEVICE_TABLE(pci, synclink_pci_tbl); +#ifdef MODULE_LICENSE MODULE_LICENSE("GPL"); +#endif static struct pci_driver synclink_pci_driver = { name: "synclink", id_table: synclink_pci_tbl, probe: synclink_init_one, - remove: __devexit_p(synclink_remove_one), + remove: synclink_remove_one, }; static struct tty_driver serial_driver, callout_driver; @@ -999,6 +1004,9 @@ printk(badmagic, kdevname(device), routine); return 1; } +#else + if (!info) + return 1; #endif return 0; } @@ -1140,8 +1148,16 @@ if ( debug_level >= DEBUG_LEVEL_BH ) printk( "%s(%d):mgsl_bh_receive(%s)\n", __FILE__,__LINE__,info->device_name); - - while( (get_rx_frame)(info) ); + do + { + if (info->rx_rcc_underrun) { + unsigned long flags; + spin_lock_irqsave(&info->irq_spinlock,flags); + usc_start_receiver(info); + spin_unlock_irqrestore(&info->irq_spinlock,flags); + return; + } + } while(get_rx_frame(info)); } void mgsl_bh_transmit(struct mgsl_struct *info) @@ -1583,6 +1599,21 @@ if ( debug_level >= DEBUG_LEVEL_ISR ) printk("%s(%d):mgsl_isr_misc status=%04X\n", __FILE__,__LINE__,status); + + if ((status & MISCSTATUS_RCC_UNDERRUN) && + (info->params.mode == MGSL_MODE_HDLC)) { + + /* turn off receiver and rx DMA */ + usc_EnableReceiver(info,DISABLE_UNCONDITIONAL); + usc_DmaCmd(info, DmaCmd_ResetRxChannel); + usc_UnlatchRxstatusBits(info, RXSTATUS_ALL); + usc_ClearIrqPendingBits(info, RECEIVE_DATA + RECEIVE_STATUS); + usc_DisableInterrupts(info, RECEIVE_DATA + RECEIVE_STATUS); + + /* schedule BH handler to restart receiver */ + info->pending_bh |= BH_RECEIVE; + info->rx_rcc_underrun = 1; + } usc_ClearIrqPendingBits( info, MISC ); usc_UnlatchMiscstatusBits( info, status ); @@ -3251,14 +3282,17 @@ { struct mgsl_struct * info = (struct mgsl_struct *)tty->driver_data; - if (!info || mgsl_paranoia_check(info, tty->device, "mgsl_close")) + if (mgsl_paranoia_check(info, tty->device, "mgsl_close")) return; if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgsl_close(%s) entry, count=%d\n", __FILE__,__LINE__, info->device_name, info->count); - if (!info->count || tty_hung_up_p(filp)) + if (!info->count) + return; + + if (tty_hung_up_p(filp)) goto cleanup; if ((tty->count == 1) && (info->count != 1)) { @@ -3393,7 +3427,7 @@ schedule_timeout(char_time); if (signal_pending(current)) break; - if (timeout && ((orig_jiffies + timeout) < jiffies)) + if (timeout && time_after(jiffies, orig_jiffies + timeout)) break; } } else { @@ -3403,7 +3437,7 @@ schedule_timeout(char_time); if (signal_pending(current)) break; - if (timeout && ((orig_jiffies + timeout) < jiffies)) + if (timeout && time_after(jiffies, orig_jiffies + timeout)) break; } } @@ -3612,16 +3646,11 @@ info = mgsl_device_list; while(info && info->line != line) info = info->next_device; - if ( !info ){ - printk("%s(%d):Can't find specified device on open (line=%d)\n", - __FILE__,__LINE__,line); + if (mgsl_paranoia_check(info, tty->device, "mgsl_open")) return -ENODEV; - } tty->driver_data = info; info->tty = tty; - if (mgsl_paranoia_check(info, tty->device, "mgsl_open")) - return -ENODEV; if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):mgsl_open(%s), old ref count = %d\n", @@ -3695,6 +3724,8 @@ cleanup: if (retval) { + if (tty->count == 1) + info->tty = 0; /* tty layer will release tty struct */ if(MOD_IN_USE) MOD_DEC_USE_COUNT; if(info->count) @@ -3760,7 +3791,7 @@ if (info->icount.rxover) ret += sprintf(buf+ret, " rxover:%d", info->icount.rxover); if (info->icount.rxcrc) - ret += sprintf(buf+ret, " rxlong:%d", info->icount.rxcrc); + ret += sprintf(buf+ret, " rxcrc:%d", info->icount.rxcrc); } else { ret += sprintf(buf+ret, " ASYNC tx:%d rx:%d", info->icount.tx, info->icount.rx); @@ -4291,9 +4322,7 @@ info->get_tx_holding_index=0; /* restart transmit timer */ - del_timer(&info->tx_timer); - info->tx_timer.expires = jiffies + jiffies_from_ms(5000); - add_timer(&info->tx_timer); + mod_timer(&info->tx_timer, jiffies + jiffies_from_ms(5000)); ret = 1; } @@ -4511,12 +4540,12 @@ info->max_frame_size = 65535; if ( info->bus_type == MGSL_BUS_TYPE_PCI ) { - printk( "SyncLink device %s added:PCI bus IO=%04X IRQ=%d Mem=%08X LCR=%08X MaxFrameSize=%u\n", - info->device_name, info->io_base, info->irq_level, + printk( "SyncLink PCI v%d %s: IO=%04X IRQ=%d Mem=%08X,%08X MaxFrameSize=%u\n", + info->hw_version + 1, info->device_name, info->io_base, info->irq_level, info->phys_memory_base, info->phys_lcr_base, info->max_frame_size ); } else { - printk( "SyncLink device %s added:ISA bus IO=%04X IRQ=%d DMA=%d MaxFrameSize=%u\n", + printk( "SyncLink ISA %s: IO=%04X IRQ=%d DMA=%d MaxFrameSize=%u\n", info->device_name, info->io_base, info->irq_level, info->dma_level, info->max_frame_size ); } @@ -5367,7 +5396,11 @@ usc_EnableMasterIrqBit( info ); usc_ClearIrqPendingBits( info, RECEIVE_STATUS + RECEIVE_DATA + - TRANSMIT_STATUS + TRANSMIT_DATA ); + TRANSMIT_STATUS + TRANSMIT_DATA + MISC); + + /* arm RCC underflow interrupt */ + usc_OutReg(info, SICR, (u16)(usc_InReg(info,SICR) | BIT3)); + usc_EnableInterrupts(info, MISC); info->mbre_bit = 0; outw( 0, info->io_base ); /* clear Master Bus Enable (DCAR) */ @@ -5375,10 +5408,11 @@ info->mbre_bit = BIT8; outw( BIT8, info->io_base ); /* set Master Bus Enable (DCAR) */ - /* Enable DMAEN (Port 7, Bit 14) */ - /* This connects the DMA request signal to the ISA bus */ - /* on the ISA adapter. This has no effect for the PCI adapter */ - usc_OutReg( info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) & ~BIT14) ); + if (info->bus_type == MGSL_BUS_TYPE_ISA) { + /* Enable DMAEN (Port 7, Bit 14) */ + /* This connects the DMA request signal to the ISA bus */ + usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) & ~BIT14)); + } /* DMA Control Register (DCR) * @@ -5804,6 +5838,7 @@ info->rx_enabled = 0; info->rx_overflow = 0; + info->rx_rcc_underrun = 0; } /* end of stop_receiver() */ @@ -6355,10 +6390,11 @@ usc_EnableMasterIrqBit( info ); - /* Enable INTEN (Port 6, Bit12) */ - /* This connects the IRQ request signal to the ISA bus */ - /* on the ISA adapter. This has no effect for the PCI adapter */ - usc_OutReg( info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) & ~BIT12) ); + if (info->bus_type == MGSL_BUS_TYPE_ISA) { + /* Enable INTEN (Port 6, Bit12) */ + /* This connects the IRQ request signal to the ISA bus */ + usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) & ~BIT12)); + } } /* end of usc_set_async_mode() */ @@ -6449,10 +6485,11 @@ usc_loopback_frame( info ); usc_set_sdlc_mode( info ); - /* Enable INTEN (Port 6, Bit12) */ - /* This connects the IRQ request signal to the ISA bus */ - /* on the ISA adapter. This has no effect for the PCI adapter */ - usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) & ~BIT12)); + if (info->bus_type == MGSL_BUS_TYPE_ISA) { + /* Enable INTEN (Port 6, Bit12) */ + /* This connects the IRQ request signal to the ISA bus */ + usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) & ~BIT12)); + } usc_enable_aux_clock(info, info->params.clock_speed); @@ -7496,7 +7533,7 @@ EndTime = jiffies + jiffies_from_ms(100); for(;;) { - if ( jiffies > EndTime ) { + if (time_after(jiffies, EndTime)) { rc = FALSE; break; } @@ -7552,7 +7589,7 @@ EndTime = jiffies + jiffies_from_ms(100); for(;;) { - if ( jiffies > EndTime ) { + if (time_after(jiffies, EndTime)) { rc = FALSE; break; } @@ -7600,7 +7637,7 @@ spin_unlock_irqrestore(&info->irq_spinlock,flags); while ( !(status & (BIT6+BIT5+BIT4+BIT2+BIT1)) ) { - if ( jiffies > EndTime ) { + if (time_after(jiffies, EndTime)) { rc = FALSE; break; } @@ -7627,8 +7664,7 @@ /* Wait for 16C32 to write receive status to buffer entry. */ status=info->rx_buffer_list[0].status; while ( status == 0 ) { - if ( jiffies > EndTime ) { - printk(KERN_ERR"mark 4\n"); + if (time_after(jiffies, EndTime)) { rc = FALSE; break; } @@ -8202,17 +8238,20 @@ info->bus_type = MGSL_BUS_TYPE_PCI; info->io_addr_size = 8; info->irq_flags = SA_SHIRQ; - - /* Store the PCI9050 misc control register value because a flaw - * in the PCI9050 prevents LCR registers from being read if - * BIOS assigns an LCR base address with bit 7 set. - * - * Only the misc control register is accessed for which only - * write access is needed, so set an initial value and change - * bits to the device instance data as we write the value - * to the actual misc control register. - */ - info->misc_ctrl_value = 0x087e4546; + + if (dev->device == 0x0210) { + /* Version 1 PCI9030 based universal PCI adapter */ + info->misc_ctrl_value = 0x007c4080; + info->hw_version = 1; + } else { + /* Version 0 PCI9050 based 5V PCI adapter + * A PCI9050 bug prevents reading LCR registers if + * LCR base address bit 7 is set. Maintain shadow + * value so we can write to LCR misc control reg. + */ + info->misc_ctrl_value = 0x087e4546; + info->hw_version = 0; + } mgsl_add_device(info); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/synclinkmp.c linux-2.4.23-pre8/drivers/char/synclinkmp.c --- linux-2.4.22/drivers/char/synclinkmp.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/synclinkmp.c 2003-10-22 22:48:53.000000000 +0000 @@ -1,5 +1,5 @@ /* - * $Id: synclinkmp.c,v 3.17 2002/04/22 16:05:39 paulkf Exp $ + * $Id: synclinkmp.c,v 3.22 2003/09/05 14:04:26 paulkf Exp $ * * Device driver for Microgate SyncLink Multiport * high speed multiprotocol serial adapter. @@ -504,7 +504,7 @@ MODULE_PARM(dosyncppp,"1-" __MODULE_STRING(MAX_DEVICES) "i"); static char *driver_name = "SyncLink MultiPort driver"; -static char *driver_version = "$Revision: 3.17 $"; +static char *driver_version = "$Revision: 3.22 $"; static int __devinit synclinkmp_init_one(struct pci_dev *dev,const struct pci_device_id *ent); static void __devexit synclinkmp_remove_one(struct pci_dev *dev); @@ -515,6 +515,10 @@ }; MODULE_DEVICE_TABLE(pci, synclinkmp_pci_tbl); +#ifdef MODULE_LICENSE +MODULE_LICENSE("GPL"); +#endif + static struct pci_driver synclinkmp_pci_driver = { name: "synclinkmp", id_table: synclinkmp_pci_tbl, @@ -724,6 +728,9 @@ printk(badmagic, kdevname(device), routine); return 1; } +#else + if (!info) + return 1; #endif return 0; } @@ -748,12 +755,8 @@ info = synclinkmp_device_list; while(info && info->line != line) info = info->next_device; - if ( !info ){ - printk("%s(%d):%s Can't find specified device on open (line=%d)\n", - __FILE__,__LINE__,info->device_name,line); + if (sanity_check(info, tty->device, "open")) return -ENODEV; - } - if ( info->init_error ) { printk("%s(%d):%s device is not allocated, init error=%d\n", __FILE__,__LINE__,info->device_name,info->init_error); @@ -762,8 +765,6 @@ tty->driver_data = info; info->tty = tty; - if (sanity_check(info, tty->device, "open")) - return -ENODEV; if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):%s open(), old ref count = %d\n", @@ -825,6 +826,8 @@ cleanup: if (retval) { + if (tty->count == 1) + info->tty = 0; /* tty layer will release tty struct */ if(MOD_IN_USE) MOD_DEC_USE_COUNT; if(info->count) @@ -841,14 +844,17 @@ { SLMP_INFO * info = (SLMP_INFO *)tty->driver_data; - if (!info || sanity_check(info, tty->device, "close")) + if (sanity_check(info, tty->device, "close")) return; if (debug_level >= DEBUG_LEVEL_INFO) printk("%s(%d):%s close() entry, count=%d\n", __FILE__,__LINE__, info->device_name, info->count); - if (!info->count || tty_hung_up_p(filp)) + if (!info->count) + return; + + if (tty_hung_up_p(filp)) goto cleanup; if ((tty->count == 1) && (info->count != 1)) { @@ -1203,7 +1209,7 @@ schedule_timeout(char_time); if (signal_pending(current)) break; - if (timeout && ((orig_jiffies + timeout) < jiffies)) + if (timeout && time_after(jiffies, orig_jiffies + timeout)) break; } } else { @@ -1214,7 +1220,7 @@ schedule_timeout(char_time); if (signal_pending(current)) break; - if (timeout && ((orig_jiffies + timeout) < jiffies)) + if (timeout && time_after(jiffies, orig_jiffies + timeout)) break; } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/char/tty_io.c linux-2.4.23-pre8/drivers/char/tty_io.c --- linux-2.4.22/drivers/char/tty_io.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/char/tty_io.c 2003-10-22 22:49:04.000000000 +0000 @@ -154,6 +154,7 @@ extern void rs285_console_init(void); extern void sa1100_rs_console_init(void); extern void sgi_serial_console_init(void); +extern void sn_sal_serial_console_init(void); extern void sci_console_init(void); extern void dec_serial_console_init(void); extern void tx3912_console_init(void); @@ -454,8 +455,6 @@ redirect = NULL; } spin_unlock(&redirect_lock); - if (f) - fput(f); check_tty_count(tty, "do_tty_hangup"); file_list_lock(); @@ -542,6 +541,8 @@ } else if (tty->driver.hangup) (tty->driver.hangup)(tty); unlock_kernel(); + if (f) + fput(f); } void tty_hangup(struct tty_struct * tty) @@ -1048,7 +1049,7 @@ } o_tty->magic = 0; (*o_tty->driver.refcount)--; - list_del(&o_tty->tty_files); + list_del_init(&o_tty->tty_files); free_tty_struct(o_tty); } @@ -1060,7 +1061,7 @@ } tty->magic = 0; (*tty->driver.refcount)--; - list_del(&tty->tty_files); + list_del_init(&tty->tty_files); free_tty_struct(tty); } @@ -2391,6 +2392,12 @@ kbd_init(); #endif +#ifdef CONFIG_SGI_L1_SERIAL_CONSOLE + if (ia64_platform_is("sn2")) { + sn_sal_serial_console_init(); + return; /* only one console right now for SN2 */ + } +#endif #ifdef CONFIG_ESPSERIAL /* init ESP before rs, so rs doesn't see the port */ espserial_init(); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/acpiphp.h linux-2.4.23-pre8/drivers/hotplug/acpiphp.h --- linux-2.4.22/drivers/hotplug/acpiphp.h 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/acpiphp.h 2003-10-22 22:47:30.000000000 +0000 @@ -1,12 +1,12 @@ /* * ACPI PCI Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. - * Copyright (c) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) - * Copyright (c) 2002,2003 Takayoshi Kochi (t-kochi@bq.jp.nec.com) - * Copyright (c) 2002,2003 NEC Corporation + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. + * Copyright (C) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) + * Copyright (C) 2002,2003 Takayoshi Kochi (t-kochi@bq.jp.nec.com) + * Copyright (C) 2002,2003 NEC Corporation * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/acpiphp_core.c linux-2.4.23-pre8/drivers/hotplug/acpiphp_core.c --- linux-2.4.22/drivers/hotplug/acpiphp_core.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/acpiphp_core.c 2003-10-22 22:49:21.000000000 +0000 @@ -1,12 +1,12 @@ /* * ACPI PCI Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. - * Copyright (c) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) - * Copyright (c) 2002,2003 Takayoshi Kochi (t-kochi@bq.jp.nec.com) - * Copyright (c) 2002,2003 NEC Corporation + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. + * Copyright (C) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) + * Copyright (C) 2002,2003 Takayoshi Kochi (t-kochi@bq.jp.nec.com) + * Copyright (C) 2002,2003 NEC Corporation * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/acpiphp_glue.c linux-2.4.23-pre8/drivers/hotplug/acpiphp_glue.c --- linux-2.4.22/drivers/hotplug/acpiphp_glue.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/acpiphp_glue.c 2003-10-22 22:49:21.000000000 +0000 @@ -1,9 +1,9 @@ /* * ACPI PCI HotPlug glue functions to ACPI CA subsystem * - * Copyright (c) 2002,2003 Takayoshi Kochi (t-kochi@bq.jp.nec.com) - * Copyright (c) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) - * Copyright (c) 2002,2003 NEC Corporation + * Copyright (C) 2002,2003 Takayoshi Kochi (t-kochi@bq.jp.nec.com) + * Copyright (C) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) + * Copyright (C) 2002,2003 NEC Corporation * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/acpiphp_pci.c linux-2.4.23-pre8/drivers/hotplug/acpiphp_pci.c --- linux-2.4.22/drivers/hotplug/acpiphp_pci.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/acpiphp_pci.c 2003-10-22 22:48:40.000000000 +0000 @@ -1,12 +1,12 @@ /* * ACPI PCI HotPlug PCI configuration space management * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001,2002 IBM Corp. - * Copyright (c) 2002 Takayoshi Kochi (t-kochi@bq.jp.nec.com) - * Copyright (c) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) - * Copyright (c) 2002 NEC Corporation + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001,2002 IBM Corp. + * Copyright (C) 2002 Takayoshi Kochi (t-kochi@bq.jp.nec.com) + * Copyright (C) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) + * Copyright (C) 2002 NEC Corporation * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/acpiphp_res.c linux-2.4.23-pre8/drivers/hotplug/acpiphp_res.c --- linux-2.4.22/drivers/hotplug/acpiphp_res.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/acpiphp_res.c 2003-10-22 22:48:53.000000000 +0000 @@ -1,12 +1,12 @@ /* * ACPI PCI HotPlug Utility functions * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. - * Copyright (c) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) - * Copyright (c) 2002 Takayoshi Kochi (t-kochi@bq.jp.nec.com) - * Copyright (c) 2002 NEC Corporation + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. + * Copyright (C) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com) + * Copyright (C) 2002 Takayoshi Kochi (t-kochi@bq.jp.nec.com) + * Copyright (C) 2002 NEC Corporation * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/cpqphp.h linux-2.4.23-pre8/drivers/hotplug/cpqphp.h --- linux-2.4.22/drivers/hotplug/cpqphp.h 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/cpqphp.h 2003-10-22 22:48:18.000000000 +0000 @@ -1,9 +1,9 @@ /* * Compaq Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM * * All rights reserved. * @@ -747,7 +747,7 @@ return 1; hp_slot = slot->device - ctrl->slot_device_offset; - dbg(__FUNCTION__": slot->device = %d, ctrl->slot_device_offset = %d \n", slot->device, ctrl->slot_device_offset); + dbg("%s: slot->device = %d, ctrl->slot_device_offset = %d \n", __FUNCTION__, slot->device, ctrl->slot_device_offset); status = (readl(ctrl->hpc_reg + INT_INPUT_CLEAR) & (0x01L << hp_slot)); @@ -785,7 +785,7 @@ DECLARE_WAITQUEUE(wait, current); int retval = 0; - dbg(__FUNCTION__" - start\n"); + dbg("%s - start\n", __FUNCTION__); add_wait_queue(&ctrl->queue, &wait); set_current_state(TASK_INTERRUPTIBLE); /* Sleep for up to 1 second to wait for the LED to change. */ @@ -795,7 +795,7 @@ if (signal_pending(current)) retval = -EINTR; - dbg(__FUNCTION__" - end\n"); + dbg("%s - end\n", __FUNCTION__); return retval; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/cpqphp_core.c linux-2.4.23-pre8/drivers/hotplug/cpqphp_core.c --- linux-2.4.22/drivers/hotplug/cpqphp_core.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/cpqphp_core.c 2003-10-22 22:47:27.000000000 +0000 @@ -1,9 +1,9 @@ /* * Compaq Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. * * All rights reserved. * @@ -320,7 +320,7 @@ void *slot_entry= NULL; int result; - dbg(__FUNCTION__"\n"); + dbg("%s\n", __FUNCTION__); tempdword = readl(ctrl->hpc_reg + INT_INPUT_CLEAR); @@ -482,7 +482,7 @@ u8 tbus, tdevice, tslot, bridgeSlot; - dbg(__FUNCTION__" %p, %d, %d, %p\n", ops, bus_num, dev_num, slot); + dbg("%s %p, %d, %d, %p\n", __FUNCTION__, ops, bus_num, dev_num, slot); bridgeSlot = 0xFF; @@ -598,7 +598,7 @@ if (slot == NULL) return -ENODEV; - dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name); + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); ctrl = slot->ctrl; if (ctrl == NULL) @@ -633,7 +633,7 @@ if (slot == NULL) return -ENODEV; - dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name); + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); ctrl = slot->ctrl; if (ctrl == NULL) @@ -673,7 +673,7 @@ if (slot == NULL) return -ENODEV; - dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name); + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); ctrl = slot->ctrl; if (ctrl == NULL) @@ -701,7 +701,7 @@ struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); struct controller *ctrl; - dbg(__FUNCTION__"\n"); + dbg("%s\n", __FUNCTION__); if (slot == NULL) return -ENODEV; @@ -722,7 +722,7 @@ if (slot == NULL) return -ENODEV; - dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name); + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); ctrl = slot->ctrl; if (ctrl == NULL) @@ -740,7 +740,7 @@ if (slot == NULL) return -ENODEV; - dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name); + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); ctrl = slot->ctrl; if (ctrl == NULL) @@ -758,7 +758,7 @@ if (slot == NULL) return -ENODEV; - dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name); + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); ctrl = slot->ctrl; if (ctrl == NULL) @@ -777,7 +777,7 @@ if (slot == NULL) return -ENODEV; - dbg(__FUNCTION__" - physical_slot = %s\n", hotplug_slot->name); + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); ctrl = slot->ctrl; if (ctrl == NULL) @@ -865,7 +865,7 @@ // TODO: This code can be made to support non-Compaq or Intel subsystem IDs rc = pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &subsystem_vid); if (rc) { - err(__FUNCTION__" : pci_read_config_word failed\n"); + err("%s : pci_read_config_word failed\n", __FUNCTION__); return rc; } dbg("Subsystem Vendor ID: %x\n", subsystem_vid); @@ -876,14 +876,14 @@ ctrl = (struct controller *) kmalloc(sizeof(struct controller), GFP_KERNEL); if (!ctrl) { - err(__FUNCTION__" : out of memory\n"); + err("%s : out of memory\n", __FUNCTION__); return -ENOMEM; } memset(ctrl, 0, sizeof(struct controller)); rc = pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subsystem_deviceid); if (rc) { - err(__FUNCTION__" : pci_read_config_word failed\n"); + err("%s : pci_read_config_word failed\n", __FUNCTION__); goto err_free_ctrl; } @@ -1139,7 +1139,7 @@ // Store PCI Config Space for all devices on this bus rc = cpqhp_save_config(ctrl, ctrl->bus, readb(ctrl->hpc_reg + SLOT_MASK)); if (rc) { - err(__FUNCTION__": unable to save PCI configuration data, error %d\n", rc); + err("%s: unable to save PCI configuration data, error %d\n", __FUNCTION__, rc); goto err_iounmap; } @@ -1169,7 +1169,7 @@ rc = ctrl_slot_setup(ctrl, smbios_start, smbios_table); if (rc) { err(msg_initialization_err, 6); - err(__FUNCTION__": unable to save PCI configuration data, error %d\n", rc); + err("%s: unable to save PCI configuration data, error %d\n", __FUNCTION__, rc); goto err_iounmap; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/cpqphp_ctrl.c linux-2.4.23-pre8/drivers/hotplug/cpqphp_ctrl.c --- linux-2.4.22/drivers/hotplug/cpqphp_ctrl.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/cpqphp_ctrl.c 2003-10-22 22:48:28.000000000 +0000 @@ -1,9 +1,9 @@ /* * Compaq Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. * * All rights reserved. * @@ -771,13 +771,13 @@ return(NULL); for (node = *head; node; node = node->next) { - dbg(__FUNCTION__": req_size =%x node=%p, base=%x, length=%x\n", - size, node, node->base, node->length); + dbg("%s: req_size =%x node=%p, base=%x, length=%x\n", + __FUNCTION__, size, node, node->base, node->length); if (node->length < size) continue; if (node->base & (size - 1)) { - dbg(__FUNCTION__": not aligned\n"); + dbg("%s: not aligned\n", __FUNCTION__); // this one isn't base aligned properly // so we'll make a new entry and split it up temp_dword = (node->base | (size-1)) + 1; @@ -803,7 +803,7 @@ // Don't need to check if too small since we already did if (node->length > size) { - dbg(__FUNCTION__": too big\n"); + dbg("%s: too big\n", __FUNCTION__); // this one is longer than we need // so we'll make a new entry and split it up split_node = (struct pci_resource*) kmalloc(sizeof(struct pci_resource), GFP_KERNEL); @@ -820,7 +820,7 @@ node->next = split_node; } // End of too big on top end - dbg(__FUNCTION__": got one!!!\n"); + dbg("%s: got one!!!\n", __FUNCTION__); // If we got here, then it is the right size // Now take it out of the list if (*head == node) { @@ -855,7 +855,7 @@ struct pci_resource *node2; int out_of_order = 1; - dbg(__FUNCTION__": head = %p, *head = %p\n", head, *head); + dbg("%s: head = %p, *head = %p\n",__FUNCTION__, head, *head); if (!(*head)) return(1); @@ -942,7 +942,7 @@ // Read to clear posted writes misc = readw(ctrl->hpc_reg + MISC); - dbg (__FUNCTION__" - waking up\n"); + dbg ("%s - waking up\n", __FUNCTION__); wake_up_interruptible(&ctrl->queue); } @@ -1394,8 +1394,8 @@ struct resource_lists res_lists; hp_slot = func->device - ctrl->slot_device_offset; - dbg(__FUNCTION__": func->device, slot_offset, hp_slot = %d, %d ,%d\n", - func->device, ctrl->slot_device_offset, hp_slot); + dbg("%s: func->device, slot_offset, hp_slot = %d, %d ,%d\n", + __FUNCTION__, func->device, ctrl->slot_device_offset, hp_slot); // Wait for exclusive access to hardware down(&ctrl->crit_sect); @@ -1444,55 +1444,55 @@ // turn on board and blink green LED // Wait for exclusive access to hardware - dbg(__FUNCTION__": before down\n"); + dbg("%s: before down\n", __FUNCTION__); down(&ctrl->crit_sect); - dbg(__FUNCTION__": after down\n"); + dbg("%s: after down\n", __FUNCTION__); - dbg(__FUNCTION__": before slot_enable\n"); + dbg("%s: before slot_enable\n", __FUNCTION__); slot_enable (ctrl, hp_slot); - dbg(__FUNCTION__": before green_LED_blink\n"); + dbg("%s: before green_LED_blink\n", __FUNCTION__); green_LED_blink (ctrl, hp_slot); - dbg(__FUNCTION__": before amber_LED_blink\n"); + dbg("%s: before amber_LED_blink\n", __FUNCTION__); amber_LED_off (ctrl, hp_slot); - dbg(__FUNCTION__": before set_SOGO\n"); + dbg("%s: before set_SOGO\n", __FUNCTION__); set_SOGO(ctrl); // Wait for SOBS to be unset - dbg(__FUNCTION__": before wait_for_ctrl_irq\n"); + dbg("%s: before wait_for_ctrl_irq\n", __FUNCTION__); wait_for_ctrl_irq (ctrl); - dbg(__FUNCTION__": after wait_for_ctrl_irq\n"); + dbg("%s: after wait_for_ctrl_irq\n", __FUNCTION__); // Done with exclusive hardware access - dbg(__FUNCTION__": before up\n"); + dbg("%s: before up\n", __FUNCTION__); up(&ctrl->crit_sect); - dbg(__FUNCTION__": after up\n"); + dbg("%s: after up\n", __FUNCTION__); // Wait for ~1 second because of hot plug spec - dbg(__FUNCTION__": before long_delay\n"); + dbg("%s: before long_delay\n", __FUNCTION__); long_delay(1*HZ); - dbg(__FUNCTION__": after long_delay\n"); + dbg("%s: after long_delay\n", __FUNCTION__); - dbg(__FUNCTION__": func status = %x\n", func->status); + dbg("%s: func status = %x\n", __FUNCTION__, func->status); // Check for a power fault if (func->status == 0xFF) { // power fault occurred, but it was benign temp_register = 0xFFFFFFFF; - dbg(__FUNCTION__": temp register set to %x by power fault\n", temp_register); + dbg("%s: temp register set to %x by power fault\n", __FUNCTION__, temp_register); rc = POWER_FAILURE; func->status = 0; } else { // Get vendor/device ID u32 rc = pci_read_config_dword_nodev (ctrl->pci_ops, func->bus, func->device, func->function, PCI_VENDOR_ID, &temp_register); - dbg(__FUNCTION__": pci_read_config_dword returns %d\n", rc); - dbg(__FUNCTION__": temp_register is %x\n", temp_register); + dbg("%s: pci_read_config_dword returns %d\n", __FUNCTION__, rc); + dbg("%s: temp_register is %x\n", __FUNCTION__, temp_register); if (rc != 0) { // Something's wrong here temp_register = 0xFFFFFFFF; - dbg(__FUNCTION__": temp register set to %x by error\n", temp_register); + dbg("%s: temp register set to %x by error\n", __FUNCTION__, temp_register); } // Preset return code. It will be changed later if things go okay. rc = NO_ADAPTER_PRESENT; @@ -1508,7 +1508,7 @@ rc = configure_new_device(ctrl, func, 0, &res_lists); - dbg(__FUNCTION__": back from configure_new_device\n"); + dbg("%s: back from configure_new_device\n", __FUNCTION__); ctrl->io_head = res_lists.io_head; ctrl->mem_head = res_lists.mem_head; ctrl->p_mem_head = res_lists.p_mem_head; @@ -1545,7 +1545,7 @@ func->is_a_board = 0x01; //next, we will instantiate the linux pci_dev structures (with appropriate driver notification, if already present) - dbg(__FUNCTION__": configure linux pci_dev structure\n"); + dbg("%s: configure linux pci_dev structure\n", __FUNCTION__); index = 0; do { new_slot = cpqhp_slot_find(ctrl->bus, func->device, index++); @@ -1612,7 +1612,7 @@ device = func->device; hp_slot = func->device - ctrl->slot_device_offset; - dbg("In "__FUNCTION__", hp_slot = %d\n", hp_slot); + dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot); // When we get here, it is safe to change base Address Registers. // We will attempt to save the base Address Register Lengths @@ -1942,7 +1942,7 @@ func = cpqhp_slot_find(p_slot->bus, p_slot->device, 0); dbg("In power_down_board, func = %p, ctrl = %p\n", func, ctrl); if (!func) { - dbg("Error! func NULL in "__FUNCTION__"\n"); + dbg("Error! func NULL in %s\n", __FUNCTION__); return ; } @@ -1966,7 +1966,7 @@ func = cpqhp_slot_find(p_slot->bus, p_slot->device, 0); dbg("In add_board, func = %p, ctrl = %p\n", func, ctrl); if (!func) { - dbg("Error! func NULL in "__FUNCTION__"\n"); + dbg("Error! func NULL in %s\n", __FUNCTION__); return ; } @@ -2081,7 +2081,7 @@ } if (rc) { - dbg(__FUNCTION__": rc = %d\n", rc); + dbg("%s: rc = %d\n", __FUNCTION__, rc); } if (p_slot) @@ -2347,11 +2347,11 @@ new_slot = func; - dbg(__FUNCTION__"\n"); + dbg("%s\n", __FUNCTION__); // Check for Multi-function device rc = pci_read_config_byte_nodev (ctrl->pci_ops, func->bus, func->device, func->function, 0x0E, &temp_byte); if (rc) { - dbg(__FUNCTION__": rc = %d\n", rc); + dbg("%s: rc = %d\n", __FUNCTION__, rc); return rc; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/cpqphp_nvram.c linux-2.4.23-pre8/drivers/hotplug/cpqphp_nvram.c --- linux-2.4.22/drivers/hotplug/cpqphp_nvram.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/cpqphp_nvram.c 2003-10-22 22:49:31.000000000 +0000 @@ -1,9 +1,9 @@ /* * Compaq Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. * * All rights reserved. * @@ -160,7 +160,7 @@ (temp6 == 'Q')) { result = 1; } - dbg (__FUNCTION__" - returned %d\n", result); + dbg ("%s - returned %d\n",__FUNCTION__, result); return result; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/cpqphp_nvram.h linux-2.4.23-pre8/drivers/hotplug/cpqphp_nvram.h --- linux-2.4.22/drivers/hotplug/cpqphp_nvram.h 2001-11-09 22:01:22.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/cpqphp_nvram.h 2003-10-22 22:49:04.000000000 +0000 @@ -1,8 +1,8 @@ /* * Compaq Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/cpqphp_pci.c linux-2.4.23-pre8/drivers/hotplug/cpqphp_pci.c --- linux-2.4.22/drivers/hotplug/cpqphp_pci.c 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/cpqphp_pci.c 2003-10-22 22:49:40.000000000 +0000 @@ -1,9 +1,9 @@ /* * Compaq Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. * * All rights reserved. * @@ -139,7 +139,7 @@ //We did not even find a hotplug rep of the function, create it //This code might be taken out if we can guarantee the creation of functions //in parallel (hotplug and Linux at the same time). - dbg("@@@@@@@@@@@ cpqhp_slot_create in "__FUNCTION__"\n"); + dbg("@@@@@@@@@@@ cpqhp_slot_create in %s\n", __FUNCTION__); temp_func = cpqhp_slot_create(bus->number); if (temp_func == NULL) return -ENOMEM; @@ -306,7 +306,7 @@ memset(&wrapped_dev, 0, sizeof(struct pci_dev_wrapped)); memset(&wrapped_bus, 0, sizeof(struct pci_bus_wrapped)); - dbg(__FUNCTION__": bus/dev/func = %x/%x/%x\n",func->bus, func->device, func->function); + 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); @@ -354,10 +354,10 @@ fakedev.devfn = dev_num << 3; fakedev.bus = &fakebus; fakebus.number = bus_num; - dbg(__FUNCTION__": dev %d, bus %d, pin %d, num %d\n", - dev_num, bus_num, int_pin, irq_num); + dbg("%s: dev %d, bus %d, pin %d, num %d\n", + __FUNCTION__, dev_num, bus_num, int_pin, irq_num); rc = pcibios_set_irq_routing(&fakedev, int_pin - 0x0a, irq_num); - dbg(__FUNCTION__":rc %d\n", rc); + dbg("%s:rc %d\n", __FUNCTION__, rc); if (!rc) return !rc; @@ -1585,7 +1585,7 @@ int rc = 0; struct pci_resource *node; struct pci_resource *t_node; - dbg(__FUNCTION__"\n"); + dbg("%s\n", __FUNCTION__); if (!func) return(1); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/cpqphp_proc.c linux-2.4.23-pre8/drivers/hotplug/cpqphp_proc.c --- linux-2.4.22/drivers/hotplug/cpqphp_proc.c 2002-08-03 00:39:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/cpqphp_proc.c 2003-10-22 22:49:41.000000000 +0000 @@ -1,9 +1,9 @@ /* * Compaq Hot Plug Controller Driver * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/ibmphp.h linux-2.4.23-pre8/drivers/hotplug/ibmphp.h --- linux-2.4.22/drivers/hotplug/ibmphp.h 2002-11-28 23:53:12.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/ibmphp.h 2003-10-22 22:49:05.000000000 +0000 @@ -6,8 +6,8 @@ * * Written By: Jyoti Shah, Tong Yu, Irene Zubarev, IBM Corporation * - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001,2002 IBM Corp. + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001,2002 IBM Corp. * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/ibmphp_core.c linux-2.4.23-pre8/drivers/hotplug/ibmphp_core.c --- linux-2.4.22/drivers/hotplug/ibmphp_core.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/ibmphp_core.c 2003-10-22 22:49:50.000000000 +0000 @@ -3,8 +3,8 @@ * * Written By: Chuck Cole, Jyoti Shah, Tong Yu, Irene Zubarev, IBM Corporation * - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001,2002 IBM Corp. + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001,2002 IBM Corp. * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/ibmphp_ebda.c linux-2.4.23-pre8/drivers/hotplug/ibmphp_ebda.c --- linux-2.4.22/drivers/hotplug/ibmphp_ebda.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/ibmphp_ebda.c 2003-10-22 22:48:21.000000000 +0000 @@ -3,8 +3,8 @@ * * Written By: Tong Yu, IBM Corporation * - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001,2002 IBM Corp. + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001,2002 IBM Corp. * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/ibmphp_hpc.c linux-2.4.23-pre8/drivers/hotplug/ibmphp_hpc.c --- linux-2.4.22/drivers/hotplug/ibmphp_hpc.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/ibmphp_hpc.c 2003-10-22 22:49:07.000000000 +0000 @@ -3,7 +3,7 @@ * * Written By: Jyoti Shah, IBM Corporation * - * Copyright (c) 2001-2002 IBM Corp. + * Copyright (C) 2001-2002 IBM Corp. * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/ibmphp_pci.c linux-2.4.23-pre8/drivers/hotplug/ibmphp_pci.c --- linux-2.4.22/drivers/hotplug/ibmphp_pci.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/ibmphp_pci.c 2003-10-22 22:48:41.000000000 +0000 @@ -3,8 +3,8 @@ * * Written By: Irene Zubarev, IBM Corporation * - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001,2002 IBM Corp. + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001,2002 IBM Corp. * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/ibmphp_res.c linux-2.4.23-pre8/drivers/hotplug/ibmphp_res.c --- linux-2.4.22/drivers/hotplug/ibmphp_res.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/ibmphp_res.c 2003-10-22 22:49:45.000000000 +0000 @@ -3,8 +3,8 @@ * * Written By: Irene Zubarev, IBM Corporation * - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001,2002 IBM Corp. + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001,2002 IBM Corp. * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/pci_hotplug.h linux-2.4.23-pre8/drivers/hotplug/pci_hotplug.h --- linux-2.4.22/drivers/hotplug/pci_hotplug.h 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/pci_hotplug.h 2003-10-22 22:48:30.000000000 +0000 @@ -1,9 +1,9 @@ /* * PCI HotPlug Core Functions * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. * * All rights reserved. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/pci_hotplug_core.c linux-2.4.23-pre8/drivers/hotplug/pci_hotplug_core.c --- linux-2.4.22/drivers/hotplug/pci_hotplug_core.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/pci_hotplug_core.c 2003-10-22 22:48:18.000000000 +0000 @@ -1,8 +1,8 @@ /* * PCI HotPlug Controller Core * - * Copyright (c) 2001-2002 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001-2002 IBM Corp. + * Copyright (C) 2001-2002 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001-2002 IBM Corp. * * All rights reserved. * @@ -49,7 +49,7 @@ #define MY_NAME THIS_MODULE->name #endif -#define dbg(fmt, arg...) do { if (debug) printk(KERN_DEBUG "%s: "__FUNCTION__": " fmt , MY_NAME , ## arg); } while (0) +#define dbg(fmt, arg...) do { if (debug) printk(KERN_DEBUG "%s: %s: " fmt , MY_NAME , __FUNCTION__ , ## arg); } while (0) #define err(format, arg...) printk(KERN_ERR "%s: " format , MY_NAME , ## arg) #define info(format, arg...) printk(KERN_INFO "%s: " format , MY_NAME , ## arg) #define warn(format, arg...) printk(KERN_WARNING "%s: " format , MY_NAME , ## arg) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/hotplug/pci_hotplug_util.c linux-2.4.23-pre8/drivers/hotplug/pci_hotplug_util.c --- linux-2.4.22/drivers/hotplug/pci_hotplug_util.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/hotplug/pci_hotplug_util.c 2003-10-22 22:49:10.000000000 +0000 @@ -1,9 +1,9 @@ /* * PCI HotPlug Utility functions * - * Copyright (c) 1995,2001 Compaq Computer Corporation - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2001 IBM Corp. + * Copyright (C) 1995,2001 Compaq Computer Corporation + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 IBM Corp. * * All rights reserved. * @@ -41,7 +41,7 @@ #define MY_NAME THIS_MODULE->name #endif -#define dbg(fmt, arg...) do { if (debug) printk(KERN_DEBUG "%s: "__FUNCTION__": " fmt , MY_NAME , ## arg); } while (0) +#define dbg(fmt, arg...) do { if (debug) printk(KERN_DEBUG "%s: %s: " fmt , MY_NAME , __FUNCTION__ , ## arg); } while (0) #define err(format, arg...) printk(KERN_ERR "%s: " format , MY_NAME , ## arg) #define info(format, arg...) printk(KERN_INFO "%s: " format , MY_NAME , ## arg) #define warn(format, arg...) printk(KERN_WARNING "%s: " format , MY_NAME , ## arg) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/Config.in linux-2.4.23-pre8/drivers/ide/Config.in --- linux-2.4.22/drivers/ide/Config.in 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/Config.in 2003-10-22 22:49:37.000000000 +0000 @@ -71,6 +71,9 @@ dep_tristate ' RZ1000 chipset bugfix/support' CONFIG_BLK_DEV_RZ1000 $CONFIG_X86 dep_tristate ' SCx200 chipset support' CONFIG_BLK_DEV_SC1200 $CONFIG_BLK_DEV_IDEDMA_PCI dep_tristate ' ServerWorks OSB4/CSB5/CSB6 chipsets support' CONFIG_BLK_DEV_SVWKS $CONFIG_BLK_DEV_IDEDMA_PCI + if [ "$CONFIG_IA64_GENERIC" = "y" -o "$CONFIG_IA64_SGI_SN2" = "y" ] ; then + dep_tristate ' SGI IOC4 chipset support' CONFIG_BLK_DEV_SGIIOC4 $CONFIG_BLK_DEV_IDEDMA_PCI + fi dep_tristate ' Silicon Image chipset support' CONFIG_BLK_DEV_SIIMAGE $CONFIG_BLK_DEV_IDEDMA_PCI dep_tristate ' SiS5513 chipset support' CONFIG_BLK_DEV_SIS5513 $CONFIG_BLK_DEV_IDEDMA_PCI $CONFIG_X86 dep_tristate ' SLC90E66 chipset support' CONFIG_BLK_DEV_SLC90E66 $CONFIG_BLK_DEV_IDEDMA_PCI diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/Makefile linux-2.4.23-pre8/drivers/ide/Makefile --- linux-2.4.22/drivers/ide/Makefile 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/Makefile 2003-10-22 22:49:08.000000000 +0000 @@ -48,8 +48,6 @@ obj-$(CONFIG_BLK_DEV_IDE) += ide-core.o -obj-$(CONFIG_BLK_DEV_IDE_SIBYTE) += ide-sibyte.o - ifeq ($(CONFIG_BLK_DEV_IDE),y) obj-y += legacy/idedriver-legacy.o obj-y += ppc/idedriver-ppc.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-cd.c linux-2.4.23-pre8/drivers/ide/ide-cd.c --- linux-2.4.22/drivers/ide/ide-cd.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-cd.c 2003-10-22 22:48:41.000000000 +0000 @@ -2231,7 +2231,7 @@ minor = (drive->select.b.unit) << PARTN_BITS; dev = MKDEV(HWIF(drive)->major, minor); stat = cdrom_get_last_written(dev, &toc->capacity); - if (stat) + if (stat || !toc->capacity) stat = cdrom_read_capacity(drive, &toc->capacity, sense); if (stat) toc->capacity = 0x1fffff; @@ -3262,7 +3262,7 @@ } if (ide_register_subdriver(drive, &ide_cdrom_driver, IDE_SUBDRIVER_VERSION)) { - printk("%s: Failed to register the driver with " + printk("ide-cd: %s: Failed to register the driver with " "ide.c\n", drive->name); kfree(info); continue; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-default.c linux-2.4.23-pre8/drivers/ide/ide-default.c --- linux-2.4.22/drivers/ide/ide-default.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-default.c 2003-10-22 22:48:11.000000000 +0000 @@ -40,6 +40,21 @@ { } +static int idedefault_open(struct inode *inode, struct file *filp, ide_drive_t *drive) +{ + MOD_INC_USE_COUNT; + if(filp->f_flags & O_NDELAY) + return 0; + MOD_DEC_USE_COUNT; + drive->usage--; + return -ENXIO; +} + +static void idedefault_release(struct inode *inode, struct file *filp, ide_drive_t *drive) +{ + MOD_DEC_USE_COUNT; +} + int idedefault_init (void); int idedefault_attach(ide_drive_t *drive); @@ -56,6 +71,8 @@ supports_dsc_overlap: 0, init: idedefault_init, attach: idedefault_attach, + open: idedefault_open, + release: idedefault_release }; static ide_module_t idedefault_module = { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-disk.c linux-2.4.23-pre8/drivers/ide/ide-disk.c --- linux-2.4.22/drivers/ide/ide-disk.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-disk.c 2003-10-22 22:47:29.000000000 +0000 @@ -1196,7 +1196,7 @@ drive->bios_cyl = drive->cyl; drive->capacity48 = capacity_2; drive->capacity = (unsigned long) capacity_2; - return; + goto check_capacity48; /* Determine capacity, and use LBA if the drive properly supports it */ } else if ((id->capability & 2) && lba_capacity_is_ok(id)) { capacity = id->lba_capacity; @@ -1228,6 +1228,15 @@ drive->sect = 63; drive->cyl = (unsigned long)(drive->capacity48) / (drive->head * drive->sect); } + +check_capacity48: + /* Limit disk size to 137GB if LBA48 addressing is not supported */ + if (drive->addressing == 0 && drive->capacity48 > (1ULL)<<28) { + printk("%s: cannot use LBA48 - capacity reset " + "from %llu to %llu\n", + drive->name, drive->capacity48, (1ULL)<<28); + drive->capacity48 = (1ULL)<<28; + } } static unsigned long idedisk_capacity (ide_drive_t *drive) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-geometry.c linux-2.4.23-pre8/drivers/ide/ide-geometry.c --- linux-2.4.22/drivers/ide/ide-geometry.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-geometry.c 2003-10-22 22:47:30.000000000 +0000 @@ -83,7 +83,6 @@ } -extern ide_drive_t * get_info_ptr(kdev_t); extern unsigned long current_capacity (ide_drive_t *); /* @@ -156,7 +155,7 @@ int transl = 1; /* try translation */ int ret = 0; - drive = get_info_ptr(i_rdev); + drive = ide_info_ptr(i_rdev, 0); if (!drive) return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-io.c linux-2.4.23-pre8/drivers/ide/ide-io.c --- linux-2.4.22/drivers/ide/ide-io.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-io.c 2003-10-22 22:47:51.000000000 +0000 @@ -56,38 +56,6 @@ #include "ide_modes.h" -#if (DISK_RECOVERY_TIME > 0) - -Error So the User Has To Fix the Compilation And Stop Hacking Port 0x43 -Does anyone ever use this anyway ?? - -/* - * For really screwy hardware (hey, at least it *can* be used with Linux) - * we can enforce a minimum delay time between successive operations. - */ -static unsigned long read_timer (ide_hwif_t *hwif) -{ - unsigned long t, flags; - int i; - - /* FIXME this is completely unsafe! */ - local_irq_save(flags); - t = jiffies * 11932; - outb_p(0, 0x43); - i = inb_p(0x40); - i |= inb_p(0x40) << 8; - local_irq_restore(flags); - return (t - i); -} -#endif /* DISK_RECOVERY_TIME */ - -static inline void set_recovery_timer (ide_hwif_t *hwif) -{ -#if (DISK_RECOVERY_TIME > 0) - hwif->last_time = read_timer(hwif); -#endif /* DISK_RECOVERY_TIME */ -} - /* * ide_end_request - complete an IDE I/O * @drive: IDE device for the I/O @@ -237,6 +205,7 @@ * by read a sector's worth of data from the drive. Of course, * this may not help if the drive is *waiting* for data from *us*. */ + void try_to_flush_leftover_data (ide_drive_t *drive) { int i = (drive->mult_count ? drive->mult_count : 1) * SECTOR_WORDS; @@ -573,9 +542,9 @@ EXPORT_SYMBOL(execute_drive_cmd); /** - * start_request - start of I/O and command issuing for IDE + * ide_start_request - start of I/O and command issuing for IDE * - * start_request() initiates handling of a new I/O request. It + * ide_start_request() initiates handling of a new I/O request. It * accepts commands and I/O (read/write) requests. It also does * the final remapping for weird stuff like EZDrive. Once * device mapper can work sector level the EZDrive stuff can go away @@ -583,7 +552,7 @@ * FIXME: this function needs a rename */ -ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) +static ide_startstop_t ide_start_request (ide_drive_t *drive, struct request *rq) { ide_startstop_t startstop; unsigned long block, blockend; @@ -591,12 +560,12 @@ ide_hwif_t *hwif = HWIF(drive); #ifdef DEBUG - printk("%s: start_request: current=0x%08lx\n", + printk("%s: ide_start_request: current=0x%08lx\n", hwif->name, (unsigned long) rq); #endif /* bail early if we've exceeded max_failures */ - if (drive->max_failures && (drive->failures > drive->max_failures)) { + if (!drive->present || (drive->max_failures && (drive->failures > drive->max_failures))) { goto kill_rq; } @@ -636,10 +605,6 @@ if (block == 0 && drive->remap_0_to_1 == 1) block = 1; /* redirect MBR access to EZ-Drive partn table */ -#if (DISK_RECOVERY_TIME > 0) - while ((read_timer() - hwif->last_time) < DISK_RECOVERY_TIME); -#endif - SELECT_DRIVE(drive); if (ide_wait_stat(&startstop, drive, drive->ready_stat, BUSY_STAT|DRQ_STAT, WAIT_READY)) { printk(KERN_ERR "%s: drive not ready for command\n", drive->name); @@ -663,16 +628,6 @@ return ide_stopped; } -EXPORT_SYMBOL(start_request); - -int restart_request (ide_drive_t *drive, struct request *rq) -{ - (void) start_request(drive, rq); - return 0; -} - -EXPORT_SYMBOL(restart_request); - /** * ide_stall_queue - pause an IDE device * @drive: drive to stall @@ -865,7 +820,7 @@ spin_unlock(&io_request_lock); local_irq_enable(); /* allow other IRQs while we start this request */ - startstop = start_request(drive, rq); + startstop = ide_start_request(drive, rq); spin_lock_irq(&io_request_lock); if (hwif->irq != masked_irq) enable_irq(hwif->irq); @@ -1043,7 +998,6 @@ startstop = DRIVER(drive)->error(drive, "irq timeout", hwif->INB(IDE_STATUS_REG)); } } - set_recovery_timer(hwif); drive->service_time = jiffies - drive->service_start; spin_lock_irq(&io_request_lock); enable_irq(hwif->irq); @@ -1236,7 +1190,6 @@ * same irq as is currently being serviced here, and Linux * won't allow another of the same (on any CPU) until we return. */ - set_recovery_timer(HWIF(drive)); drive->service_time = jiffies - drive->service_start; if (startstop == ide_stopped) { if (hwgroup->handler == NULL) { /* paranoia */ @@ -1256,7 +1209,7 @@ * get_info_ptr() returns the (ide_drive_t *) for a given device number. * It returns NULL if the given device number does not match any present drives. */ -ide_drive_t *get_info_ptr (kdev_t i_rdev) +ide_drive_t *ide_info_ptr (kdev_t i_rdev, int force) { int major = MAJOR(i_rdev); unsigned int h; @@ -1267,7 +1220,7 @@ unsigned unit = DEVICE_NR(i_rdev); if (unit < MAX_DRIVES) { ide_drive_t *drive = &hwif->drives[unit]; - if (drive->present) + if (drive->present || force) return drive; } break; @@ -1276,7 +1229,7 @@ return NULL; } -EXPORT_SYMBOL(get_info_ptr); +EXPORT_SYMBOL(ide_info_ptr); /** * ide_init_drive_cmd - initialize a drive command request diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-iops.c linux-2.4.23-pre8/drivers/ide/ide-iops.c --- linux-2.4.22/drivers/ide/ide-iops.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-iops.c 2003-10-22 22:49:02.000000000 +0000 @@ -741,6 +741,10 @@ int ide_ata66_check (ide_drive_t *drive, ide_task_t *args) { + /* SATA has no cable restrictions */ + if (HWIF(drive)->sata) + return 0; + if ((args->tfRegister[IDE_COMMAND_OFFSET] == WIN_SETFEATURES) && (args->tfRegister[IDE_SECTOR_OFFSET] > XFER_UDMA_2) && (args->tfRegister[IDE_FEATURE_OFFSET] == SETFEATURES_XFER)) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-probe.c linux-2.4.23-pre8/drivers/ide/ide-probe.c --- linux-2.4.22/drivers/ide/ide-probe.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-probe.c 2003-10-22 22:47:28.000000000 +0000 @@ -553,7 +553,7 @@ } /** - * probe_for_drives - upper level drive probe + * ide_probe_for_drives - upper level drive probe * @drive: drive to probe for * * probe_for_drive() tests for existence of a given drive using do_probe() @@ -564,7 +564,7 @@ * still be 0) */ -static inline u8 probe_for_drive (ide_drive_t *drive) +u8 ide_probe_for_drive (ide_drive_t *drive) { /* * In order to keep things simple we have an id @@ -687,9 +687,6 @@ //EXPORT_SYMBOL(hwif_register); -/* Enable code below on all archs later, for now, I want it on PPC - */ -#ifdef CONFIG_PPC /* * This function waits for the hwif to report a non-busy status * see comments in probe_hwif() @@ -716,7 +713,7 @@ return ((stat & BUSY_STAT) == 0) ? 0 : -EBUSY; } -static int wait_hwif_ready(ide_hwif_t *hwif) +int ide_wait_hwif_ready(ide_hwif_t *hwif) { int rc; @@ -751,7 +748,67 @@ return rc; } -#endif /* CONFIG_PPC */ + +void ide_probe_reset(ide_hwif_t *hwif) +{ + if (hwif->io_ports[IDE_CONTROL_OFFSET] && hwif->reset) { + unsigned long timeout = jiffies + WAIT_WORSTCASE; + u8 stat; + + printk(KERN_WARNING "%s: reset\n", hwif->name); + hwif->OUTB(12, hwif->io_ports[IDE_CONTROL_OFFSET]); + udelay(10); + hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]); + do { + ide_delay_50ms(); + stat = hwif->INB(hwif->io_ports[IDE_STATUS_OFFSET]); + } while ((stat & BUSY_STAT) && time_after(timeout, jiffies)); + } +} + +void ide_tune_drives(ide_hwif_t *hwif) +{ + int unit; + + for (unit = 0; unit < MAX_DRIVES; ++unit) { + ide_drive_t *drive = &hwif->drives[unit]; + int enable_dma = 1; + + if (drive->present) { + if (hwif->tuneproc != NULL && + drive->autotune == IDE_TUNE_AUTO) + /* auto-tune PIO mode */ + hwif->tuneproc(drive, 255); + +#ifdef CONFIG_IDEDMA_ONLYDISK + if (drive->media != ide_disk) + enable_dma = 0; +#endif + /* + * MAJOR HACK BARF :-/ + * + * FIXME: chipsets own this cruft! + */ + /* + * Move here to prevent module loading clashing. + */ + // drive->autodma = hwif->autodma; + if ((hwif->ide_dma_check) && + ((drive->autotune == IDE_TUNE_DEFAULT) || + (drive->autotune == IDE_TUNE_AUTO))) { + /* + * Force DMAing for the beginning of the check. + * Some chipsets appear to do interesting + * things, if not checked and cleared. + * PARANOIA!!! + */ + hwif->ide_dma_off_quietly(drive); + if (enable_dma) + hwif->ide_dma_check(drive); + } + } + } +} /* * This routine only knows how to look for drive units 0 and 1 @@ -822,7 +879,7 @@ * * BenH. */ - if (wait_hwif_ready(hwif)) + if (ide_wait_hwif_ready(hwif)) printk(KERN_WARNING "%s: Wait for ready failed before probe !\n", hwif->name); #endif /* CONFIG_PPC */ @@ -834,7 +891,7 @@ ide_drive_t *drive = &hwif->drives[unit]; drive->dn = ((hwif->channel ? 2 : 0) + unit); hwif->drives[unit].dn = ((hwif->channel ? 2 : 0) + unit); - (void) probe_for_drive(drive); + (void) ide_probe_for_drive(drive); if (drive->present && !hwif->present) { hwif->present = 1; if (hwif->chipset != ide_4drives || @@ -844,20 +901,8 @@ } } } - if (hwif->io_ports[IDE_CONTROL_OFFSET] && hwif->reset) { - unsigned long timeout = jiffies + WAIT_WORSTCASE; - u8 stat; - - printk(KERN_WARNING "%s: reset\n", hwif->name); - hwif->OUTB(12, hwif->io_ports[IDE_CONTROL_OFFSET]); - udelay(10); - hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]); - do { - ide_delay_50ms(); - stat = hwif->INB(hwif->io_ports[IDE_STATUS_OFFSET]); - } while ((stat & BUSY_STAT) && time_after(timeout, jiffies)); - - } + + ide_probe_reset(hwif); local_irq_restore(flags); /* * Use cached IRQ number. It might be (and is...) changed by probe @@ -865,45 +910,9 @@ */ if (irqd) enable_irq(irqd); + + ide_tune_drives(hwif); - for (unit = 0; unit < MAX_DRIVES; ++unit) { - ide_drive_t *drive = &hwif->drives[unit]; - int enable_dma = 1; - - if (drive->present) { - if (hwif->tuneproc != NULL && - drive->autotune == IDE_TUNE_AUTO) - /* auto-tune PIO mode */ - hwif->tuneproc(drive, 255); - -#ifdef CONFIG_IDEDMA_ONLYDISK - if (drive->media != ide_disk) - enable_dma = 0; -#endif - /* - * MAJOR HACK BARF :-/ - * - * FIXME: chipsets own this cruft! - */ - /* - * Move here to prevent module loading clashing. - */ - // drive->autodma = hwif->autodma; - if ((hwif->ide_dma_check) && - ((drive->autotune == IDE_TUNE_DEFAULT) || - (drive->autotune == IDE_TUNE_AUTO))) { - /* - * Force DMAing for the beginning of the check. - * Some chipsets appear to do interesting - * things, if not checked and cleared. - * PARANOIA!!! - */ - hwif->ide_dma_off_quietly(drive); - if (enable_dma) - hwif->ide_dma_check(drive); - } - } - } } EXPORT_SYMBOL(probe_hwif); @@ -1335,13 +1344,6 @@ EXPORT_SYMBOL(export_ide_init_queue); -u8 export_probe_for_drive (ide_drive_t *drive) -{ - return probe_for_drive(drive); -} - -EXPORT_SYMBOL(export_probe_for_drive); - #ifndef HWIF_PROBE_CLASSIC_METHOD int probe_hwif_init (ide_hwif_t *hwif) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-sibyte.c linux-2.4.23-pre8/drivers/ide/ide-sibyte.c --- linux-2.4.22/drivers/ide/ide-sibyte.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-sibyte.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2001, 2002, 2003 Broadcom 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 (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. - */ - -/* Derived loosely from ide-pmac.c, so: - * - * Copyright (C) 1998 Paul Mackerras. - * Copyright (C) 1995-1998 Mark Lord - */ -#include -#include - -#include - -#define SIBYTE_IDE_BASE (IO_SPACE_BASE + IDE_PHYS - mips_io_port_base) -#define SIBYTE_IDE_REG(pcaddr) (SIBYTE_IDE_BASE + ((pcaddr) << 5)) - -extern void sibyte_set_ideops(ide_hwif_t *hwif); - -void __init sibyte_ide_probe(void) -{ - int i; - ide_hwif_t *hwif = NULL; - - /* - * Find the first untaken slot in hwifs. Also set the io ops - * to the non-swapping SiByte versions. XXXKW It would be - * nice to find a safe place to do this outside of - * ide-sibyte.c so PCI-IDE would work without the SiByte - * driver. - */ - for (i = 0; i < MAX_HWIFS; i++) { - sibyte_set_ideops(&ide_hwifs[i]); - if (!ide_hwifs[i].io_ports[IDE_DATA_OFFSET] && (hwif == NULL)) { - hwif = &ide_hwifs[i]; - } - } - if (hwif == NULL) { - printk("No space for SiByte onboard IDE driver in ide_hwifs[]. Not enabled.\n"); - return; - } - - /* - * Set up our stuff; we're a little odd because our io_ports - * aren't in the usual place, and byte-swapping isn't - * necessary. - */ - hwif->hw.io_ports[IDE_DATA_OFFSET] = SIBYTE_IDE_REG(0x1f0); - hwif->hw.io_ports[IDE_ERROR_OFFSET] = SIBYTE_IDE_REG(0x1f1); - hwif->hw.io_ports[IDE_NSECTOR_OFFSET] = SIBYTE_IDE_REG(0x1f2); - hwif->hw.io_ports[IDE_SECTOR_OFFSET] = SIBYTE_IDE_REG(0x1f3); - hwif->hw.io_ports[IDE_LCYL_OFFSET] = SIBYTE_IDE_REG(0x1f4); - hwif->hw.io_ports[IDE_HCYL_OFFSET] = SIBYTE_IDE_REG(0x1f5); - hwif->hw.io_ports[IDE_SELECT_OFFSET] = SIBYTE_IDE_REG(0x1f6); - hwif->hw.io_ports[IDE_STATUS_OFFSET] = SIBYTE_IDE_REG(0x1f7); - hwif->hw.io_ports[IDE_CONTROL_OFFSET] = SIBYTE_IDE_REG(0x3f6); - hwif->hw.irq = K_INT_GB_IDE; - hwif->irq = hwif->hw.irq; - hwif->noprobe = 0; - hwif->hw.ack_intr = NULL; - hwif->mmio = 2; - - memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports)); - printk("SiByte onboard IDE configured as device %i\n", hwif-ide_hwifs); -} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide-tape.c linux-2.4.23-pre8/drivers/ide/ide-tape.c --- linux-2.4.22/drivers/ide/ide-tape.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide-tape.c 2003-10-22 22:47:55.000000000 +0000 @@ -1,5 +1,5 @@ /* - * linux/drivers/ide/ide-tape.c Version 1.17b Dec, 2002 + * linux/drivers/ide/ide-tape.c Version 1.17c Sep, 2003 * * Copyright (C) 1995 - 1999 Gadi Oxman * @@ -313,6 +313,9 @@ * Cosmetic fixes to miscellaneous debugging output messages. * Set the minimum /proc/ide/hd?/settings values for "pipeline", * "pipeline_min", and "pipeline_max" to 1. + * Ver 1.17c Sep 2003 Stuart Hayes + * Initialized "feature" in idetape_issue_packet_command + * (this was causing lockups on certain systems) * * Here are some words from the first releases of hd.c, which are quoted * in ide.c and apply here as well: @@ -422,7 +425,7 @@ * sharing a (fast) ATA-2 disk with any (slow) new ATAPI device. */ -#define IDETAPE_VERSION "1.17b-ac1" +#define IDETAPE_VERSION "1.17c" #include #include @@ -2367,6 +2370,8 @@ atapi_feature_t feature; atapi_bcount_t bcount; + feature.all = 0; + #if IDETAPE_DEBUG_BUGS if (tape->pc->c[0] == IDETAPE_REQUEST_SENSE_CMD && pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/ide.c linux-2.4.23-pre8/drivers/ide/ide.c --- linux-2.4.22/drivers/ide/ide.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/ide.c 2003-10-22 22:49:47.000000000 +0000 @@ -248,6 +248,7 @@ hwif->ultra_mask = 0x80; /* disable all ultra */ hwif->mwdma_mask = 0x80; /* disable all mwdma */ hwif->swdma_mask = 0x80; /* disable all swdma */ + hwif->sata = 0; /* assume PATA */ default_hwif_iops(hwif); default_hwif_transport(hwif); @@ -458,7 +459,7 @@ unsigned int p, major, minor; unsigned long flags; - if ((drive = get_info_ptr(i_rdev)) == NULL) + if ((drive = ide_info_ptr(i_rdev, 0)) == NULL) return -ENODEV; major = MAJOR(i_rdev); minor = drive->select.b.unit << PARTN_BITS; @@ -547,30 +548,48 @@ static int ide_open (struct inode * inode, struct file * filp) { ide_drive_t *drive; + int force = 1/*FIXME 0*/; + + if(capable(CAP_SYS_ADMIN) && (filp->f_flags & O_NDELAY)) + force = 1; - if ((drive = get_info_ptr(inode->i_rdev)) == NULL) + if ((drive = ide_info_ptr(inode->i_rdev, force)) == NULL) return -ENXIO; - if (drive->driver == &idedefault_driver) - ide_driver_module(1); - if (drive->driver == &idedefault_driver) { - if (drive->media == ide_disk) - (void) request_module("ide-disk"); - if (drive->scsi) - (void) request_module("ide-scsi"); - if (drive->media == ide_cdrom) - (void) request_module("ide-cd"); - if (drive->media == ide_tape) - (void) request_module("ide-tape"); - if (drive->media == ide_floppy) - (void) request_module("ide-floppy"); + + /* + * If the device is present make sure that we attach any + * needed driver + */ + + if (drive->present) + { + if (drive->driver == &idedefault_driver) + ide_driver_module(1); + if (drive->driver == &idedefault_driver) { + if (drive->media == ide_disk) + (void) request_module("ide-disk"); + if (drive->scsi) + (void) request_module("ide-scsi"); + if (drive->media == ide_cdrom) + (void) request_module("ide-cd"); + if (drive->media == ide_tape) + (void) request_module("ide-tape"); + if (drive->media == ide_floppy) + (void) request_module("ide-floppy"); + } + + /* The locking here isnt enough, but this is hard to fix + in the 2.4 cases */ + while (drive->busy) + sleep_on(&drive->wqueue); } - /* The locking here isnt enough, but this is hard to fix - in the 2.4 cases */ - while (drive->busy) - sleep_on(&drive->wqueue); + /* + * Now do the actual open + */ + drive->usage++; - if (!drive->dead) + if (!drive->dead || force) return DRIVER(drive)->open(inode, filp, drive); printk(KERN_WARNING "%s: driver not present\n", drive->name); drive->usage--; @@ -585,7 +604,7 @@ { ide_drive_t *drive; - if ((drive = get_info_ptr(inode->i_rdev)) != NULL) { + if ((drive = ide_info_ptr(inode->i_rdev, 1)) != NULL) { drive->usage--; DRIVER(drive)->release(inode, file, drive); } @@ -636,6 +655,179 @@ extern void init_hwif_data(unsigned int index); +/** + * ide_prepare_tristate - prepare interface for warm unplug + * @drive: drive on this hwif we are using + * + * Prepares a drive for shutdown after a bus tristate. The + * drives must be quiescent and the only user the calling ioctl + */ + +static int ide_prepare_tristate(ide_drive_t *our_drive) +{ + ide_drive_t *drive; + int unit; + unsigned long flags; + int minor; + int p; + int i; + ide_hwif_t *hwif = HWIF(our_drive); + + if(our_drive->busy) + printk("HUH? We are busy.\n"); + + if (!hwif->present) + BUG(); + spin_lock_irqsave(&io_request_lock, flags); + + /* Abort if anything is busy */ + for (unit = 0; unit < MAX_DRIVES; ++unit) { + drive = &hwif->drives[unit]; + if (!drive->present) + continue; + if (drive == our_drive && drive->usage != 1) + goto abort; + if (drive != our_drive && drive->usage) + goto abort; + if (drive->busy) + goto abort; + } + /* Commit to shutdown sequence */ + for (unit = 0; unit < MAX_DRIVES; ++unit) { + drive = &hwif->drives[unit]; + if (!drive->present) + continue; + if (drive != our_drive && DRIVER(drive)->shutdown(drive)) + goto abort; + } + /* We hold the lock here.. which is important as we need to play + with usage counts beyond the scenes */ + + our_drive->usage--; + i = DRIVER(our_drive)->shutdown(our_drive); + if(i) + goto abort_fix; + /* Drive shutdown sequence done */ + /* Prevent new opens ?? */ + spin_unlock_irqrestore(&io_request_lock, flags); + /* + * Flush kernel side caches, and dump the /proc files + */ + spin_unlock_irqrestore(&io_request_lock, flags); + for (unit = 0; unit < MAX_DRIVES; ++unit) { + drive = &hwif->drives[unit]; + if (!drive->present) + continue; + DRIVER(drive)->cleanup(drive); + minor = drive->select.b.unit << PARTN_BITS; + for (p = 0; p < (1<part[p].nr_sects > 0) { + kdev_t devp = MKDEV(hwif->major, minor+p); + invalidate_device(devp, 0); + } + } +#ifdef CONFIG_PROC_FS + destroy_proc_ide_drives(hwif); +#endif + } + spin_lock_irqsave(&io_request_lock, flags); + our_drive->usage++; + for (i = 0; i < MAX_DRIVES; ++i) { + drive = &hwif->drives[i]; + if (drive->de) { + devfs_unregister(drive->de); + drive->de = NULL; + } + if (!drive->present) + continue; + if (drive->id != NULL) { + kfree(drive->id); + drive->id = NULL; + } + drive->present = 0; + /* Safe to clear now */ + drive->dead = 0; + } + spin_unlock_irqrestore(&io_request_lock, flags); + return 0; + +abort_fix: + our_drive->usage++; +abort: + spin_unlock_irqrestore(&io_request_lock, flags); + return -EBUSY; +} + + +/** + * ide_resume_hwif - return a hwif to active mode + * @hwif: interface to resume + * + * Restore a dead interface from tristate back to normality. At this + * point the hardware driver busproc has reconnected the bus, but + * nothing else has happened + */ + +static int ide_resume_hwif(ide_drive_t *our_drive) +{ + ide_hwif_t *hwif = HWIF(our_drive); + int err = ide_wait_hwif_ready(hwif); + int irqd; + int present = 0; + int unit; + + if(err) + { + printk(KERN_ERR "%s: drives not ready.\n", our_drive->name); + return err; + } + + /* The drives are now taking commands */ + + irqd = hwif->irq; + if(irqd) + disable_irq(irqd); + + /* Identify and probe the drives */ + + for (unit = 0; unit < MAX_DRIVES; ++unit) { + ide_drive_t *drive = &hwif->drives[unit]; + drive->dn = ((hwif->channel ? 2 : 0) + unit); + drive->usage = 0; + drive->busy = 0; + hwif->drives[unit].dn = ((hwif->channel ? 2 : 0) + unit); + (void) ide_probe_for_drive(drive); + if (drive->present) + present = 1; + } + ide_probe_reset(hwif); + if(irqd) + enable_irq(irqd); + + if(present) + printk(KERN_INFO "ide: drives found on hot-added interface.\n"); + + /* + * Set up the drive modes (Even if we didnt swap drives + * we may have lost settings when we disconnected the bus) + */ + + ide_tune_drives(hwif); + if(present) + hwif->present = 1; + + /* + * Reattach the devices to drivers + */ + for (unit = 0; unit < MAX_DRIVES; ++unit) { + ide_drive_t *drive = &hwif->drives[unit]; + if(drive->present && !drive->dead) + ide_attach_drive(drive); + } + our_drive->usage++; + return 0; +} + int ide_unregister (unsigned int index) { struct gendisk *gd; @@ -798,7 +990,7 @@ hwif->swdma_mask = old_hwif.swdma_mask; hwif->chipset = old_hwif.chipset; - hwif->hold = old_hwif.hold; + hwif->hold = old_hwif.hold; #ifdef CONFIG_BLK_DEV_IDEPCI hwif->pci_dev = old_hwif.pci_dev; @@ -1534,11 +1726,22 @@ struct request rq; kdev_t dev; ide_settings_t *setting; - + int force = 0; + if (!inode || !(dev = inode->i_rdev)) return -EINVAL; + + switch(cmd) + { + case HDIO_GET_BUSSTATE: + case HDIO_SET_BUSSTATE: + case HDIO_SCAN_HWIF: + case HDIO_UNREGISTER_HWIF: + force = 1; + } + major = MAJOR(dev); minor = MINOR(dev); - if ((drive = get_info_ptr(inode->i_rdev)) == NULL) + if ((drive = ide_info_ptr(inode->i_rdev, force)) == NULL) return -ENODEV; down(&ide_setting_sem); @@ -1737,11 +1940,42 @@ return 0; case HDIO_SET_BUSSTATE: + { + ide_hwif_t *hwif = HWIF(drive); + if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if (HWIF(drive)->busproc) +#ifdef OLD_STUFF + if (hwif->busproc) return HWIF(drive)->busproc(drive, (int)arg); return -EOPNOTSUPP; +#else + if(hwif->bus_state == arg) + return 0; + + if(hwif->bus_state == BUSSTATE_ON) + { + /* "drive" may vanish beyond here */ + if((err = ide_prepare_tristate(drive)) != 0) + return err; + hwif->bus_state = arg; + } + if (hwif->busproc) + { + err = hwif->busproc(drive, (int)arg); + if(err) + return err; + } + if(arg != BUSSTATE_OFF) + { + err = ide_resume_hwif(drive); + hwif->bus_state = arg; + if(err) + return err; + } + return 0; +#endif + } default: return DRIVER(drive)->ioctl(drive, inode, file, cmd, arg); @@ -1753,7 +1987,7 @@ { ide_drive_t *drive; - if ((drive = get_info_ptr(i_rdev)) == NULL) + if ((drive = ide_info_ptr(i_rdev, 0)) == NULL) return -ENODEV; return DRIVER(drive)->media_change(drive); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/legacy/Makefile linux-2.4.23-pre8/drivers/ide/legacy/Makefile --- linux-2.4.22/drivers/ide/legacy/Makefile 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/legacy/Makefile 2003-10-22 22:48:21.000000000 +0000 @@ -17,8 +17,11 @@ obj-$(CONFIG_BLK_DEV_MAC_IDE) += macide.o obj-$(CONFIG_BLK_DEV_Q40IDE) += q40ide.o +obj-$(CONFIG_BLK_DEV_IDE_SIBYTE) += sibyte.o + obj-$(CONFIG_BLK_DEV_IDECS) += ide-cs.o + # Last of all obj-$(CONFIG_BLK_DEV_HD) += hd.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/legacy/sibyte.c linux-2.4.23-pre8/drivers/ide/legacy/sibyte.c --- linux-2.4.22/drivers/ide/legacy/sibyte.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/legacy/sibyte.c 2003-10-22 22:49:56.000000000 +0000 @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2001, 2002, 2003 Broadcom 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 (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. + */ + +/* Derived loosely from ide-pmac.c, so: + * + * Copyright (C) 1998 Paul Mackerras. + * Copyright (C) 1995-1998 Mark Lord + */ +#include +#include + +#include + +#define SIBYTE_IDE_BASE (IO_SPACE_BASE + IDE_PHYS - mips_io_port_base) +#define SIBYTE_IDE_REG(pcaddr) (SIBYTE_IDE_BASE + ((pcaddr) << 5)) + +extern void sibyte_set_ideops(ide_hwif_t *hwif); + +void __init sibyte_ide_probe(void) +{ + int i; + ide_hwif_t *hwif = NULL; + + /* + * Find the first untaken slot in hwifs. Also set the io ops + * to the non-swapping SiByte versions. XXXKW It would be + * nice to find a safe place to do this outside of + * ide-sibyte.c so PCI-IDE would work without the SiByte + * driver. + */ + for (i = 0; i < MAX_HWIFS; i++) { + sibyte_set_ideops(&ide_hwifs[i]); + if (!ide_hwifs[i].io_ports[IDE_DATA_OFFSET] && (hwif == NULL)) { + hwif = &ide_hwifs[i]; + } + } + if (hwif == NULL) { + printk("No space for SiByte onboard IDE driver in ide_hwifs[]. Not enabled.\n"); + return; + } + + /* + * Set up our stuff; we're a little odd because our io_ports + * aren't in the usual place, and byte-swapping isn't + * necessary. + */ + hwif->hw.io_ports[IDE_DATA_OFFSET] = SIBYTE_IDE_REG(0x1f0); + hwif->hw.io_ports[IDE_ERROR_OFFSET] = SIBYTE_IDE_REG(0x1f1); + hwif->hw.io_ports[IDE_NSECTOR_OFFSET] = SIBYTE_IDE_REG(0x1f2); + hwif->hw.io_ports[IDE_SECTOR_OFFSET] = SIBYTE_IDE_REG(0x1f3); + hwif->hw.io_ports[IDE_LCYL_OFFSET] = SIBYTE_IDE_REG(0x1f4); + hwif->hw.io_ports[IDE_HCYL_OFFSET] = SIBYTE_IDE_REG(0x1f5); + hwif->hw.io_ports[IDE_SELECT_OFFSET] = SIBYTE_IDE_REG(0x1f6); + hwif->hw.io_ports[IDE_STATUS_OFFSET] = SIBYTE_IDE_REG(0x1f7); + hwif->hw.io_ports[IDE_CONTROL_OFFSET] = SIBYTE_IDE_REG(0x3f6); + hwif->hw.irq = K_INT_GB_IDE; + hwif->irq = hwif->hw.irq; + hwif->noprobe = 0; + hwif->hw.ack_intr = NULL; + hwif->mmio = 2; + + memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports)); + printk(KERN_INFO "SiByte onboard IDE configured as device %i\n", hwif-ide_hwifs); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/pci/Makefile linux-2.4.23-pre8/drivers/ide/pci/Makefile --- linux-2.4.22/drivers/ide/pci/Makefile 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/pci/Makefile 2003-10-22 22:47:39.000000000 +0000 @@ -25,6 +25,7 @@ obj-$(CONFIG_BLK_DEV_RZ1000) += rz1000.o obj-$(CONFIG_BLK_DEV_SVWKS) += serverworks.o obj-$(CONFIG_BLK_DEV_SC1200) += sc1200.o +obj-$(CONFIG_BLK_DEV_SGIIOC4) += sgiioc4.o obj-$(CONFIG_BLK_DEV_SIIMAGE) += siimage.o obj-$(CONFIG_BLK_DEV_SIS5513) += sis5513.o obj-$(CONFIG_BLK_DEV_SL82C105) += sl82c105.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/pci/pdc202xx_old.c linux-2.4.23-pre8/drivers/ide/pci/pdc202xx_old.c --- linux-2.4.22/drivers/ide/pci/pdc202xx_old.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/pci/pdc202xx_old.c 2003-10-22 22:47:28.000000000 +0000 @@ -697,9 +697,6 @@ hwif->tuneproc = &config_chipset_for_pio; hwif->quirkproc = &pdc202xx_quirkproc; - if (hwif->pci_dev->device == PCI_DEVICE_ID_PROMISE_20265) - hwif->addressing = (hwif->channel) ? 0 : 1; - if (hwif->pci_dev->device != PCI_DEVICE_ID_PROMISE_20246) { hwif->busproc = &pdc202xx_tristate; hwif->resetproc = &pdc202xx_reset; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/pci/piix.c linux-2.4.23-pre8/drivers/ide/pci/piix.c --- linux-2.4.22/drivers/ide/pci/piix.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/pci/piix.c 2003-10-22 22:49:40.000000000 +0000 @@ -599,6 +599,65 @@ } /** + * ich3_busproc - bus isolation ioctl + * @drive: drive to isolate/restore + * @state: bus state to set + * + * Used by the ICH3 to handle bus isolation. We have to do + * a little bit of fixing to keep the hardware happy. + */ + +static int ich3_busproc (ide_drive_t * drive, int state) +{ + ide_hwif_t *hwif = HWIF(drive); + u32 sig_mode; + int shift; + int bits; + + if(hwif->channel == 0) + shift = 17; + else + shift = 19; + + switch (state) { + case BUSSTATE_ON: + bits = 0x00; + hwif->drives[0].failures = 0; + hwif->drives[1].failures = 0; + break; + case BUSSTATE_OFF: + bits = 0x01; + break; + case BUSSTATE_TRISTATE: + bits = 0x10; + break; + default: + return -EINVAL; + } + + if(bits) + { + int port = hwif->channel == 0 ? 0x40 : 0x42; + u16 reg; + hwif->drives[0].failures = hwif->drives[0].max_failures + 1; + hwif->drives[1].failures = hwif->drives[1].max_failures + 1; + /* Turn off IORDY checking to avoid hangs */ + pci_read_config_word(hwif->pci_dev, port, ®); + reg&=~(1<<5)|(1<<1); + pci_write_config_word(hwif->pci_dev, port, reg); + } + /* Todo: Check locking */ + pci_read_config_dword(hwif->pci_dev, 0x54, &sig_mode); + sig_mode&=~(3<pci_dev, 0x54, sig_mode); + + hwif->bus_state = state; + return 0; +} + + +/** * init_chipset_piix - set up the PIIX chipset * @dev: PCI device to set up * @name: Name of the device @@ -693,6 +752,10 @@ case PCI_DEVICE_ID_INTEL_82801AB_1: hwif->ultra_mask = 0x07; break; + case PCI_DEVICE_ID_INTEL_82801CA_10: + case PCI_DEVICE_ID_INTEL_82801CA_11: + hwif->busproc = ich3_busproc; + /* fall through */ default: pci_read_config_byte(hwif->pci_dev, 0x54, ®54h); pci_read_config_byte(hwif->pci_dev, 0x55, ®55h); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/pci/serverworks.c linux-2.4.23-pre8/drivers/ide/pci/serverworks.c --- linux-2.4.22/drivers/ide/pci/serverworks.c 2003-06-13 14:51:33.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/pci/serverworks.c 2003-10-22 22:49:00.000000000 +0000 @@ -273,7 +273,7 @@ ide_hwif_t *hwif = HWIF(drive); struct pci_dev *dev = hwif->pci_dev; - u8 speed = ide_rate_filter(svwks_ratemask(drive), xferspeed); + u8 speed; u8 pio = ide_get_best_pio_mode(drive, 255, 5, NULL); u8 unit = (drive->select.b.unit & 0x01); u8 csb5 = svwks_csb_check(dev); @@ -281,6 +281,11 @@ u8 dma_timing = 0, pio_timing = 0; u16 csb5_pio = 0; + if (xferspeed == 255) /* PIO auto-tuning */ + speed = XFER_PIO_0 + pio; + else + speed = ide_rate_filter(svwks_ratemask(drive), xferspeed); + /* If we are about to put a disk into UDMA mode we screwed up. Our code assumes we never _ever_ do this on an OSB4 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/pci/sgiioc4.c linux-2.4.23-pre8/drivers/ide/pci/sgiioc4.c --- linux-2.4.22/drivers/ide/pci/sgiioc4.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/pci/sgiioc4.c 2003-10-22 22:48:34.000000000 +0000 @@ -0,0 +1,891 @@ +/* + * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/NoticeExplan + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "sgiioc4.h" + +extern int dma_timer_expiry(ide_drive_t * drive); + +#ifdef CONFIG_PROC_FS +static u8 sgiioc4_proc; +#endif /* CONFIG_PROC_FS */ + +static int n_sgiioc4_devs ; + +static inline void +xide_delay(long ticks) +{ + if (!ticks) + return; + + current->state = TASK_UNINTERRUPTIBLE; + schedule_timeout(ticks); +} + +static void __init +sgiioc4_ide_setup_pci_device(struct pci_dev *dev, const char *name) +{ + unsigned long base = 0, ctl = 0, dma_base = 0, irqport = 0; + ide_hwif_t *hwif = NULL; + int h = 0; + + /* Get the CmdBlk and CtrlBlk Base Registers */ + base = pci_resource_start(dev, 0) + IOC4_CMD_OFFSET; + ctl = pci_resource_start(dev, 0) + IOC4_CTRL_OFFSET; + irqport = pci_resource_start(dev, 0) + IOC4_INTR_OFFSET; + dma_base = pci_resource_start(dev, 0) + IOC4_DMA_OFFSET; + + for (h = 0; h < MAX_HWIFS; ++h) { + hwif = &ide_hwifs[h]; + /* Find an empty HWIF */ + if (hwif->chipset == ide_unknown) + break; + } + + if (hwif->io_ports[IDE_DATA_OFFSET] != base) { + /* Initialize the IO registers */ + sgiioc4_init_hwif_ports(&hwif->hw, base, ctl, irqport); + memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof (hwif->io_ports)); + hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET]; + } + + hwif->chipset = ide_pci; + hwif->pci_dev = dev; + hwif->channel = 0; /* Single Channel chip */ + hwif->hw.ack_intr = &sgiioc4_checkirq; /* MultiFunction Chip */ + + /* Initializing chipset IRQ Registers */ + hwif->OUTL(0x03, irqport + IOC4_INTR_SET * 4); + + (void) ide_init_sgiioc4(hwif); + + if (dma_base) + ide_dma_sgiioc4(hwif, dma_base); + else + printk(KERN_INFO "%s: %s Bus-Master DMA disabled \n", hwif->name, name); +} + +/* XXX Hack to ensure we can build this for generic kernels without + * having all the SN2 code sync'd and merged. For now this is + * acceptable but this should be resolved ASAP. PV#: 896401 */ + +pciio_endian_t __attribute__((weak)) snia_pciio_endian_set(struct pci_dev *pci_dev, pciio_endian_t device_end, pciio_endian_t desired_end); + +static unsigned int __init +pci_init_sgiioc4(struct pci_dev *dev, const char *name) +{ + + if (pci_enable_device(dev)) { + printk(KERN_INFO "Failed to enable device %s at slot %s \n",name,dev->slot_name); + return 1; + } + pci_set_master(dev); + + /* Enable Byte Swapping in the PIC... */ + if (snia_pciio_endian_set) { + /* ... if the symbol exists (hack to get this to build + * for SuSE before we merge the SN2 code */ + snia_pciio_endian_set(dev, PCIDMA_ENDIAN_LITTLE, PCIDMA_ENDIAN_BIG); + } else { + printk(KERN_INFO "Failed to set endianness for device %s at slot %s \n", name, dev->slot_name); + return 1; + } + +#ifdef CONFIG_PROC_FS + sgiioc4_devs[n_sgiioc4_devs++] = dev; + if (!sgiioc4_proc) { + sgiioc4_proc = 1; + ide_pci_register_host_proc(&sgiioc4_procs[0]); + } +#endif + sgiioc4_ide_setup_pci_device(dev, name); + return 0; +} + +static void +sgiioc4_init_hwif_ports(hw_regs_t * hw, ide_ioreg_t data_port, + ide_ioreg_t ctrl_port, ide_ioreg_t irq_port) +{ + ide_ioreg_t reg = data_port; + int i; + + for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) + hw->io_ports[i] = reg + i * 4; /* Registers are word (32 bit) aligned */ + + if (ctrl_port) + hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port; + + if (irq_port) + hw->io_ports[IDE_IRQ_OFFSET] = irq_port; +} + +static void +sgiioc4_resetproc(ide_drive_t * drive) +{ + sgiioc4_ide_dma_end(drive); + sgiioc4_clearirq(drive); +} + +static void +sgiioc4_maskproc(ide_drive_t * drive, int mask) +{ + ide_hwif_t *hwif = HWIF(drive); + hwif->OUTB(mask ? (drive->ctl | 2) : (drive->ctl & ~2), IDE_CONTROL_REG); +} + +static void __init +ide_init_sgiioc4(ide_hwif_t * hwif) +{ + hwif->autodma = 1; + hwif->index = 0; /* Channel 0 */ + hwif->channel = 0; + hwif->atapi_dma = 1; + hwif->ultra_mask = 0x0; /* Disable Ultra DMA */ + hwif->mwdma_mask = 0x2; /* Multimode-2 DMA */ + hwif->swdma_mask = 0x2; + hwif->identify = NULL; + hwif->tuneproc = NULL; /* Sets timing for PIO mode */ + hwif->speedproc = NULL; /* Sets timing for DMA &/or PIO modes */ + hwif->selectproc = NULL; /* Use the default selection routine to select drive */ + hwif->reset_poll = NULL; /* No HBA specific reset_poll needed */ + hwif->pre_reset = NULL; /* No HBA specific pre_set needed */ + hwif->resetproc = &sgiioc4_resetproc; /* Reset the IOC4 DMA engine, clear interrupts etc */ + hwif->intrproc = NULL; /* Enable or Disable interrupt from drive */ + hwif->maskproc = &sgiioc4_maskproc; /* Mask on/off NIEN register */ + hwif->quirkproc = NULL; + hwif->busproc = NULL; + + hwif->ide_dma_read = &sgiioc4_ide_dma_read; + hwif->ide_dma_write = &sgiioc4_ide_dma_write; + hwif->ide_dma_begin = &sgiioc4_ide_dma_begin; + 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 = &sgiioc4_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 = &sgiioc4_ide_dma_timeout; + hwif->INB = &sgiioc4_INB; +} + +static int +sgiioc4_ide_dma_read(ide_drive_t * drive) +{ + struct request *rq = HWGROUP(drive)->rq; + unsigned int count = 0; + + if (!(count = sgiioc4_build_dma_table(drive, rq, PCI_DMA_FROMDEVICE))) { + /* try PIO instead of DMA */ + return 1; + } + /* Writes FROM the IOC4 TO Main Memory */ + sgiioc4_configure_for_dma(IOC4_DMA_WRITE, drive); + + return 0; +} + +static int +sgiioc4_ide_dma_write(ide_drive_t * drive) +{ + struct request *rq = HWGROUP(drive)->rq; + unsigned int count = 0; + + if (!(count = sgiioc4_build_dma_table(drive, rq, PCI_DMA_TODEVICE))) { + /* try PIO instead of DMA */ + return 1; + } + + sgiioc4_configure_for_dma(IOC4_DMA_READ, drive); + /* Writes TO the IOC4 FROM Main Memory */ + + return 0; +} + +static int +sgiioc4_ide_dma_begin(ide_drive_t * drive) +{ + ide_hwif_t *hwif = HWIF(drive); + unsigned int reg = hwif->INL(hwif->dma_base + IOC4_DMA_CTRL * 4); + unsigned int temp_reg = reg | IOC4_S_DMA_START; + + hwif->OUTL(temp_reg, hwif->dma_base + IOC4_DMA_CTRL * 4); + + return 0; +} + +/* Stops the IOC4 DMA Engine */ +static int +sgiioc4_ide_dma_end(ide_drive_t * drive) +{ + u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0; + ide_hwif_t *hwif = HWIF(drive); + uint64_t dma_base = hwif->dma_base; + int dma_stat = 0, count; + unsigned long *ending_dma = (unsigned long *) hwif->dma_base2; + + hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4); + + count = 0; + do { + xide_delay(count); + ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); + count += 10; + } while ((ioc4_dma & IOC4_S_DMA_STOP) && (count < 100)); + + if (ioc4_dma & IOC4_S_DMA_STOP) { + printk(KERN_ERR "sgiioc4_stopdma(%s): IOC4 DMA STOP bit is still 1 : ioc4_dma_reg 0x%x\n", drive->name, ioc4_dma); + dma_stat = 1; + } + + if (ending_dma) { + do { + for (num = 0; num < 16; num++) { + if (ending_dma[num] & (~0ul)) { + valid = 1; + break; + } + } + xide_delay(cnt); + } while ((cnt++ < 100) && (!valid)); + } + + if (!valid) + printk(KERN_INFO "sgiioc4_ide_dma_end(%s) : Stale DMA Data in Memory\n", drive->name); + + bc_dev = hwif->INL(dma_base + IOC4_BC_DEV * 4); + bc_mem = hwif->INL(dma_base + IOC4_BC_MEM * 4); + + if ((bc_dev & 0x01FF) || (bc_mem & 0x1FF)) { + if (bc_dev > bc_mem + 8) { + printk(KERN_ERR "sgiioc4_ide_dma_end(%s) : WARNING!!! byte_count_at_dev %d != byte_count_at_mem %d\n", + drive->name, bc_dev, bc_mem); + } + } + + drive->waiting_for_dma = 0; + ide_destroy_dmatable(drive); + + return dma_stat; +} + +static int +sgiioc4_ide_dma_check(ide_drive_t * drive) +{ + if (ide_config_drive_speed(drive,XFER_MW_DMA_2)!=0) { + printk(KERN_INFO "Couldnot set %s in Multimode-2 DMA mode | Drive %s using PIO instead\n", + drive->name, drive->name); + drive->using_dma = 0; + } else + drive->using_dma = 1; + + return 0; +} + +static int +sgiioc4_ide_dma_on(ide_drive_t * drive) +{ + drive->using_dma = 1; + + return HWIF(drive)->ide_dma_host_on(drive); +} + +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; + + return HWIF(drive)->ide_dma_host_off(drive); +} + +/* returns 1 if dma irq issued, 0 otherwise */ +static int +sgiioc4_ide_dma_test_irq(ide_drive_t * drive) +{ + return sgiioc4_checkirq(HWIF(drive)); +} + +static int +sgiioc4_ide_dma_host_on(ide_drive_t * drive) +{ + if (drive->using_dma) + return 0; + + return 1; +} + +static int +sgiioc4_ide_dma_host_off(ide_drive_t * drive) +{ + sgiioc4_clearirq(drive); + + return 0; +} + +static int +sgiioc4_ide_dma_count(ide_drive_t * drive) +{ + return HWIF(drive)->ide_dma_begin(drive); +} + +static int +sgiioc4_ide_dma_verbose(ide_drive_t * drive) +{ + if (drive->using_dma == 1) + printk(", UDMA(16)"); + else + printk(", PIO"); + + return 1; +} + +static int +sgiioc4_ide_dma_lostirq(ide_drive_t * drive) +{ + HWIF(drive)->resetproc(drive); + + return __ide_dma_lostirq(drive); +} + +static int +sgiioc4_ide_dma_timeout(ide_drive_t * drive) +{ + printk(KERN_ERR "%s: timeout waiting for DMA\n", drive->name); + if (HWIF(drive)->ide_dma_test_irq(drive)) + return 0; + + return HWIF(drive)->ide_dma_end(drive); +} + +static u8 +sgiioc4_INB(unsigned long port) +{ + u8 reg = (u8) inb(port); + + if ((port & 0xFFF) == 0x11C) { /* Status register of IOC4 */ + if (reg & 0x51) { /* Not busy...check for interrupt */ + unsigned long other_ir = port - 0x110; + unsigned int intr_reg = (u32) inl(other_ir); + + if (intr_reg & 0x03) { + /* Clear the Interrupt, Error bits on the IOC4 */ + outl(0x03, other_ir); + intr_reg = (u32) inl(other_ir); + } + } + } + + return reg; +} + +/* Creates a dma map for the scatter-gather list entries */ +static void __init +ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base) +{ + int num_ports = sizeof (ioc4_dma_regs_t); + + printk(KERN_INFO "%s: BM-DMA at 0x%04lx-0x%04lx\n", hwif->name, dma_base, dma_base + num_ports - 1); + + if (!request_region(dma_base, num_ports, hwif->name)) { + printk(KERN_ERR "ide_dma_sgiioc4(%s) -- Error, Port Addresses 0x%p to 0x%p ALREADY in use\n", + hwif->name, (void *)dma_base, (void *)dma_base + num_ports - 1); + return; + } + + hwif->dma_base = dma_base; + hwif->dmatable_cpu = pci_alloc_consistent(hwif->pci_dev, + IOC4_PRD_ENTRIES * IOC4_PRD_BYTES, /* 1 Page */ + &hwif->dmatable_dma); + + if (!hwif->dmatable_cpu) + goto dma_alloc_failure; + + hwif->sg_table = kmalloc(sizeof (struct scatterlist) * IOC4_PRD_ENTRIES, GFP_KERNEL); + + if (!hwif->sg_table) { + pci_free_consistent(hwif->pci_dev, IOC4_PRD_ENTRIES * IOC4_PRD_BYTES, hwif->dmatable_cpu, hwif->dmatable_dma); + goto dma_alloc_failure; + } + + hwif->dma_base2 = (unsigned long) pci_alloc_consistent(hwif->pci_dev, IOC4_IDE_CACHELINE_SIZE, + (dma_addr_t*)&(hwif->dma_status)); + + if (!hwif->dma_base2) { + pci_free_consistent(hwif->pci_dev, IOC4_PRD_ENTRIES * IOC4_PRD_BYTES, hwif->dmatable_cpu, hwif->dmatable_dma); + kfree(hwif->sg_table); + goto dma_alloc_failure; + } + + return; + + dma_alloc_failure: + printk(KERN_INFO "ide_dma_sgiioc4() -- Error! Unable to allocate DMA Maps for drive %s\n", hwif->name); + printk(KERN_INFO "Changing from DMA to PIO mode for Drive %s \n", hwif->name); + + /* Disable DMA because we couldnot allocate any DMA maps */ + hwif->autodma = 0; + hwif->atapi_dma = 0; +} + +/* Initializes the IOC4 DMA Engine */ +static void +sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive) +{ + u32 ioc4_dma; + int count; + ide_hwif_t *hwif = HWIF(drive); + uint64_t dma_base = hwif->dma_base; + uint32_t dma_addr, ending_dma_addr; + + ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); + + if (ioc4_dma & IOC4_S_DMA_ACTIVE) { + printk(KERN_WARNING "sgiioc4_configure_for_dma(%s):Warning!! IOC4 DMA from previous transfer was still active\n", + drive->name); + hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4); + count = 0; + do { + xide_delay(count); + ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); + count += 10; + } while ((ioc4_dma & IOC4_S_DMA_STOP) && (count < 100)); + + if (ioc4_dma & IOC4_S_DMA_STOP) + printk(KERN_ERR "sgiioc4_configure_for__dma(%s) : IOC4 Dma STOP bit is still 1\n", drive->name); + } + + ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); + if (ioc4_dma & IOC4_S_DMA_ERROR) { + printk(KERN_WARNING "sgiioc4_configure_for__dma(%s) : Warning!! - DMA Error during Previous transfer | status 0x%x \n", + drive->name, ioc4_dma); + hwif->OUTL(IOC4_S_DMA_STOP, dma_base + IOC4_DMA_CTRL * 4); + count = 0; + do { + ioc4_dma = hwif->INL(dma_base + IOC4_DMA_CTRL * 4); + xide_delay(count); + count += 10; + } while ((ioc4_dma & IOC4_S_DMA_STOP) && (count < 100)); + + if (ioc4_dma & IOC4_S_DMA_STOP) + printk(KERN_ERR "sgiioc4_configure_for__dma(%s) : IOC4 DMA STOP bit is still 1\n", drive->name); + } + + /* Address of the Scatter Gather List */ + dma_addr = cpu_to_le32(hwif->dmatable_dma); + hwif->OUTL(dma_addr, dma_base + IOC4_DMA_PTR_L * 4); + + /* Address of the Ending DMA */ + memset((unsigned int *) hwif->dma_base2, 0,IOC4_IDE_CACHELINE_SIZE); + ending_dma_addr = cpu_to_le32(hwif->dma_status); + hwif->OUTL(ending_dma_addr,dma_base + IOC4_DMA_END_ADDR * 4); + + hwif->OUTL(dma_direction, dma_base + IOC4_DMA_CTRL * 4); + drive->waiting_for_dma = 1; +} + +/* IOC4 Scatter Gather list Format */ +/* 128 Bit entries to support 64 bit addresses in the future */ +/* The Scatter Gather list Entry should be in the BIG-ENDIAN Format */ +/* --------------------------------------------------------------------------- */ +/* | Upper 32 bits - Zero | Lower 32 bits- address | */ +/* --------------------------------------------------------------------------- */ +/* | Upper 32 bits - Zero |EOL| 16 Bit Data Length | */ +/* --------------------------------------------------------------------------- */ + +/* Creates the scatter gather list, DMA Table */ +static unsigned int +sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, int ddir) +{ + ide_hwif_t *hwif = HWIF(drive); + unsigned int *table = hwif->dmatable_cpu; + unsigned int count = 0, i = 1; + struct scatterlist *sg; + + if (rq->cmd == IDE_DRIVE_TASKFILE) + hwif->sg_nents = i = sgiioc4_ide_raw_build_sglist(hwif, rq); + else + hwif->sg_nents = i = sgiioc4_ide_build_sglist(hwif, rq, ddir); + + if (!i) + return 0; /* sglist of length Zero */ + + sg = hwif->sg_table; + while (i && sg_dma_len(sg)) { + dma_addr_t cur_addr; + int cur_len; + cur_addr = sg_dma_address(sg); + cur_len = sg_dma_len(sg); + + while (cur_len) { + if (count++ >= IOC4_PRD_ENTRIES) { + printk(KERN_WARNING "%s: DMA table too small\n", drive->name); + goto use_pio_instead; + } else { + uint32_t xcount, bcount = 0x10000 - (cur_addr & 0xffff); + + if (bcount > cur_len) + bcount = cur_len; + + /* put the addr, length in the IOC4 dma-table format */ + *table = 0x0; + table++; + *table = cpu_to_be32(cur_addr); + table++; + *table = 0x0; + table++; + + xcount = bcount & 0xffff; + *table = cpu_to_be32(xcount); + table++; + + cur_addr += bcount; + cur_len -= bcount; + } + } + + sg++; + i--; + } + + if (count) { + table--; + *table |= cpu_to_be32(0x80000000); + return count; + } + + use_pio_instead: + pci_unmap_sg(hwif->pci_dev, hwif->sg_table, hwif->sg_nents, hwif->sg_dma_direction); + hwif->sg_dma_active = 0; + + return 0; /* revert to PIO for this request */ +} + +static int +sgiioc4_checkirq(ide_hwif_t * hwif) +{ + uint8_t intr_reg = hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + IOC4_INTR_REG * 4); + + if (intr_reg & 0x03) + return 1; + + return 0; +} + +static int +sgiioc4_clearirq(ide_drive_t * drive) +{ + u32 intr_reg; + ide_hwif_t *hwif = HWIF(drive); + ide_ioreg_t other_ir = hwif->io_ports[IDE_IRQ_OFFSET] + (IOC4_INTR_REG << 2); + + /* Code to check for PCI error conditions */ + intr_reg = hwif->INL(other_ir); + if (intr_reg & 0x03) { + /* Valid IOC4-IDE interrupt */ + u8 stat = hwif->INB(IDE_STATUS_REG); + int count = 0; + do { + xide_delay(count); + stat = hwif->INB(IDE_STATUS_REG); /* Removes Interrupt from IDE Device */ + } while ((stat & 0x80) && (count++ < 1024)); + + if (intr_reg & 0x02) { + /* Error when transferring DMA data on PCI bus */ + uint32_t pci_err_addr_low, pci_err_addr_high, pci_stat_cmd_reg; + + pci_err_addr_low = hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET]); + pci_err_addr_high = hwif->INL(hwif->io_ports[IDE_IRQ_OFFSET] + 4); + pci_read_config_dword(hwif->pci_dev, PCI_COMMAND, &pci_stat_cmd_reg); + printk(KERN_ERR "sgiioc4_clearirq(%s) : PCI Bus Error when doing DMA : status-cmd reg is 0x%x \n", drive->name, pci_stat_cmd_reg); + printk(KERN_ERR "sgiioc4_clearirq(%s) : PCI Error Address is 0x%x%x \n", drive->name, pci_err_addr_high, pci_err_addr_low); + /* Clear the PCI Error indicator */ + pci_write_config_dword(hwif->pci_dev, PCI_COMMAND, 0x00000146); + } + + hwif->OUTL(0x03, other_ir); /* Clear the Interrupt, Error bits on the IOC4 */ + + intr_reg = hwif->INL(other_ir); + } + + return intr_reg; +} + +/* XXX: duplicated code. See PV#: 896400 */ + +/** + * "Copied from drivers/ide/ide-dma.c" + * sgiioc4_ide_build_sglist - map IDE scatter gather for DMA I/O + * @hwif: the interface to build the DMA table for + * @rq: the request holding the sg list + * @ddir: data direction + * + * Perform the PCI mapping magic neccessary to access the source + * or target buffers of a request via PCI DMA. The lower layers + * of the kernel provide the neccessary cache management so that + * we can operate in a portable fashion. + * + * This code is identical to ide_build_sglist in ide-dma.c + * however that it not exported and even if it were would create + * dependancy problems for modular drivers. + */ +static int +sgiioc4_ide_build_sglist(ide_hwif_t * hwif, struct request *rq, int ddir) +{ + struct buffer_head *bh; + struct scatterlist *sg = hwif->sg_table; + unsigned long lastdataend = ~0UL; + int nents = 0; + + if (hwif->sg_dma_active) + BUG(); + + bh = rq->bh; + do { + int contig = 0; + + if (bh->b_page) { + if (bh_phys(bh) == lastdataend) + contig = 1; + } else { + if ((unsigned long) bh->b_data == lastdataend) + contig = 1; + } + + if (contig) { + sg[nents - 1].length += bh->b_size; + lastdataend += bh->b_size; + continue; + } + + if (nents >= PRD_ENTRIES) + return 0; + + memset(&sg[nents], 0, sizeof (*sg)); + + if (bh->b_page) { + sg[nents].page = bh->b_page; + sg[nents].offset = bh_offset(bh); + lastdataend = bh_phys(bh) + bh->b_size; + } else { + if ((unsigned long) bh->b_data < PAGE_SIZE) + BUG(); + + sg[nents].address = bh->b_data; + lastdataend = (unsigned long) bh->b_data + bh->b_size; + } + + sg[nents].length = bh->b_size; + nents++; + } while ((bh = bh->b_reqnext) != NULL); + + if (nents == 0) + BUG(); + + hwif->sg_dma_direction = ddir; + return pci_map_sg(hwif->pci_dev, sg, nents, ddir); +} + +/* XXX: duplicated code. See PV#: 896400 */ + +/** + * Copied from drivers/ide/ide-dma.c + * sgiioc4_ide_raw_build_sglist - map IDE scatter gather for DMA + * @hwif: the interface to build the DMA table for + * @rq: the request holding the sg list + * + * Perform the PCI mapping magic neccessary to access the source or + * target buffers of a taskfile request via PCI DMA. The lower layers + * of the kernel provide the neccessary cache management so that we can + * operate in a portable fashion + * + * This code is identical to ide_raw_build_sglist in ide-dma.c + * however that it not exported and even if it were would create + * dependancy problems for modular drivers. + */ +static int +sgiioc4_ide_raw_build_sglist(ide_hwif_t * hwif, struct request *rq) +{ + struct scatterlist *sg = hwif->sg_table; + int nents = 0; + ide_task_t *args = rq->special; + u8 *virt_addr = rq->buffer; + int sector_count = rq->nr_sectors; + + if (args->command_type == IDE_DRIVE_TASK_RAW_WRITE) + hwif->sg_dma_direction = PCI_DMA_TODEVICE; + else + hwif->sg_dma_direction = PCI_DMA_FROMDEVICE; +#if 1 + if (sector_count > 128) { + memset(&sg[nents], 0, sizeof (*sg)); + sg[nents].address = virt_addr; + sg[nents].length = 128 * SECTOR_SIZE; + nents++; + virt_addr = virt_addr + (128 * SECTOR_SIZE); + sector_count -= 128; + } + memset(&sg[nents], 0, sizeof (*sg)); + sg[nents].address = virt_addr; + sg[nents].length = sector_count * SECTOR_SIZE; + nents++; +#else + while (sector_count > 128) { + memset(&sg[nents], 0, sizeof (*sg)); + sg[nents].address = virt_addr; + sg[nents].length = 128 * SECTOR_SIZE; + nents++; + virt_addr = virt_addr + (128 * SECTOR_SIZE); + sector_count -= 128; + }; + memset(&sg[nents], 0, sizeof (*sg)); + sg[nents].address = virt_addr; + sg[nents].length = sector_count * SECTOR_SIZE; + nents++; +#endif + return pci_map_sg(hwif->pci_dev, sg, nents, hwif->sg_dma_direction); +} + +#ifdef CONFIG_PROC_FS + +static int +sgiioc4_get_info(char *buffer, char **addr, off_t offset, int count) +{ + char *p = buffer; + unsigned int class_rev; + int i = 0; + + while (i < n_sgiioc4_devs) { + pci_read_config_dword(sgiioc4_devs[i], PCI_CLASS_REVISION, + &class_rev); + class_rev &= 0xff; + + if (sgiioc4_devs[i]->device == PCI_DEVICE_ID_SGI_IOC4) { + p += sprintf(p, "\n SGI IOC4 Chipset rev %d. ", class_rev); + p += sprintf(p, "\n Chipset has 1 IDE channel and supports 2 devices on that channel."); + p += sprintf(p, "\n Chipset supports DMA in MultiMode-2 data transfer protocol.\n"); + /* Do we need more info. here? */ + } + i++; + } + + return p - buffer; +} + +#endif /* CONFIG_PROC_FS */ + +static int __devinit +sgiioc4_init_one(struct pci_dev *dev, const struct pci_device_id *id) +{ + unsigned int class_rev; + ide_pci_device_t *d = &sgiioc4_chipsets[id->driver_data]; + if (dev->device != d->device) { + printk(KERN_ERR "Error in sgiioc4_init_one(dev 0x%p | id 0x%p )\n", (void *) dev, (void *) id); + BUG(); + } + + pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev); + class_rev &= 0xff; + + if (class_rev < IOC4_SUPPORTED_FIRMWARE_REV) { + printk(KERN_INFO "Disabling the IOC4 IDE Part due to unsupported Firmware Rev (%d). \n",class_rev); + printk(KERN_INFO "Please upgrade to Firmware Rev 46 or higher \n"); + return 0; + } + + printk(KERN_INFO "%s: IDE controller at PCI slot %s\n", d->name, dev->slot_name); + + if (pci_init_sgiioc4(dev, d->name)) + return 0; + + MOD_INC_USE_COUNT; + + return 0; +} + +static struct pci_device_id sgiioc4_pci_tbl[] __devinitdata = { + { PCI_VENDOR_ID_SGI, PCI_DEVICE_ID_SGI_IOC4, PCI_ANY_ID, PCI_ANY_ID, 0x0b4000, 0xFFFFFF, 0 }, + { 0 } +}; + +static struct pci_driver driver = { + .name = "SGI-IOC4 IDE", + .id_table = sgiioc4_pci_tbl, + .probe = sgiioc4_init_one, +}; + +static int +sgiioc4_ide_init(void) +{ + 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"); +MODULE_LICENSE("GPL"); + +EXPORT_NO_SYMBOLS; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/pci/sgiioc4.h linux-2.4.23-pre8/drivers/ide/pci/sgiioc4.h --- linux-2.4.22/drivers/ide/pci/sgiioc4.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/pci/sgiioc4.h 2003-10-22 22:49:53.000000000 +0000 @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/NoticeExplan + */ + +#ifndef SGIIOC4_H +#define SGIIOC4_H + +#define IDE_ARCH_ACK_INTR 1 +#include + +/* IOC4 Specific Definitions */ +#define IOC4_CMD_OFFSET 0x100 +#define IOC4_CTRL_OFFSET 0x120 +#define IOC4_DMA_OFFSET 0x140 +#define IOC4_INTR_OFFSET 0x0 + +#define IOC4_TIMING 0x00 +#define IOC4_DMA_PTR_L 0x01 +#define IOC4_DMA_PTR_H 0x02 +#define IOC4_DMA_ADDR_L 0x03 +#define IOC4_DMA_ADDR_H 0x04 +#define IOC4_BC_DEV 0x05 +#define IOC4_BC_MEM 0x06 +#define IOC4_DMA_CTRL 0x07 +#define IOC4_DMA_END_ADDR 0x08 + +/* Bits in the IOC4 Control/Status Register */ +#define IOC4_S_DMA_START 0x01 +#define IOC4_S_DMA_STOP 0x02 +#define IOC4_S_DMA_DIR 0x04 +#define IOC4_S_DMA_ACTIVE 0x08 +#define IOC4_S_DMA_ERROR 0x10 +#define IOC4_ATA_MEMERR 0x02 + +/* Read/Write Directions */ +#define IOC4_DMA_WRITE 0x04 +#define IOC4_DMA_READ 0x00 + +/* Interrupt Register Offsets */ +#define IOC4_INTR_REG 0x03 +#define IOC4_INTR_SET 0x05 +#define IOC4_INTR_CLEAR 0x07 + +#define IOC4_IDE_CACHELINE_SIZE 128 +#define IOC4_SUPPORTED_FIRMWARE_REV 46 + + +/* Weeds out non-IDE interrupts to the IOC4 */ +#define ide_ack_intr(hwif) ((hwif)->hw.ack_intr ? (hwif)->hw.ack_intr(hwif) : 1) + +#define SGIIOC4_MAX_DEVS 32 + +#if defined(CONFIG_PROC_FS) +#include +#include + +static u8 sgiioc4_proc; + +static struct pci_dev *sgiioc4_devs[SGIIOC4_MAX_DEVS]; +static int sgiioc4_get_info(char *, char **, off_t, int); + +static ide_pci_host_proc_t sgiioc4_procs[] __initdata = { + { + .name = "sgiioc4", + .set = 1, + .get_info = sgiioc4_get_info, + .parent = NULL, + } +}; +#endif + +typedef volatile struct { + u32 timing_reg0; + u32 timing_reg1; + u32 low_mem_ptr; + u32 high_mem_ptr; + u32 low_mem_addr; + u32 high_mem_addr; + u32 dev_byte_count; + u32 mem_byte_count; + u32 status; +} ioc4_dma_regs_t; + +/* Each Physical Region Descriptor Entry size is 16 bytes (2 * 64 bits) */ +/* IOC4 has only 1 IDE channel */ +#define IOC4_PRD_BYTES 16 +#define IOC4_PRD_ENTRIES (PAGE_SIZE /IOC4_PRD_BYTES) + +typedef enum pciio_endian_e { + PCIDMA_ENDIAN_BIG, + PCIDMA_ENDIAN_LITTLE +} pciio_endian_t; + +static void sgiioc4_init_hwif_ports(hw_regs_t * hw, ide_ioreg_t data_port, + ide_ioreg_t ctrl_port, ide_ioreg_t irq_port); +static void sgiioc4_ide_setup_pci_device(struct pci_dev *dev, const char *name); +static void sgiioc4_resetproc(ide_drive_t * drive); +static void sgiioc4_maskproc(ide_drive_t * drive, int mask); +static void sgiioc4_configure_for_dma(int dma_direction, ide_drive_t * drive); +static void __init ide_init_sgiioc4(ide_hwif_t * hwif); +static void __init ide_dma_sgiioc4(ide_hwif_t * hwif, unsigned long dma_base); +static int sgiioc4_checkirq(ide_hwif_t * hwif); +static int sgiioc4_clearirq(ide_drive_t * drive); +static int sgiioc4_get_info(char *buffer, char **addr, off_t offset, int count); +static int sgiioc4_ide_dma_read(ide_drive_t * drive); +static int sgiioc4_ide_dma_write(ide_drive_t * drive); +static int sgiioc4_ide_dma_begin(ide_drive_t * drive); +static int sgiioc4_ide_dma_end(ide_drive_t * drive); +static int sgiioc4_ide_dma_check(ide_drive_t * drive); +static int sgiioc4_ide_dma_on(ide_drive_t * drive); +static int sgiioc4_ide_dma_off(ide_drive_t * drive); +static int sgiioc4_ide_dma_off_quietly(ide_drive_t * drive); +static int sgiioc4_ide_dma_test_irq(ide_drive_t * drive); +static int sgiioc4_ide_dma_host_on(ide_drive_t * drive); +static int sgiioc4_ide_dma_host_off(ide_drive_t * drive); +static int sgiioc4_ide_dma_count(ide_drive_t * drive); +static int sgiioc4_ide_dma_verbose(ide_drive_t * drive); +static int sgiioc4_ide_dma_lostirq(ide_drive_t * drive); +static int sgiioc4_ide_dma_timeout(ide_drive_t * drive); +static int sgiioc4_ide_build_sglist(ide_hwif_t * hwif, struct request *rq, + int ddir); +static int sgiioc4_ide_raw_build_sglist(ide_hwif_t * hwif, struct request *rq); + +static u8 sgiioc4_INB(unsigned long port); +static inline void xide_delay(long ticks); +extern int (*sgiioc4_display_info) (char *, char **, off_t, int); /* ide-proc.c */ +static unsigned int sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, + int ddir); +static unsigned int __init pci_init_sgiioc4(struct pci_dev *dev, const char *name); + +static ide_pci_device_t sgiioc4_chipsets[] __devinitdata = { + { + /* Channel 0 */ + .vendor = PCI_VENDOR_ID_SGI, + .device = PCI_DEVICE_ID_SGI_IOC4, + .name = "SGIIOC4", + .init_chipset = pci_init_sgiioc4, + .init_iops = NULL, + .init_hwif = ide_init_sgiioc4, + .init_dma = ide_dma_sgiioc4, + .channels = 1, + .autodma = AUTODMA, + .enablebits = { { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00 } }, + .bootable = ON_BOARD, + .extra = 0, + } +}; + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/pci/siimage.c linux-2.4.23-pre8/drivers/ide/pci/siimage.c --- linux-2.4.22/drivers/ide/pci/siimage.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/pci/siimage.c 2003-10-22 22:48:18.000000000 +0000 @@ -1113,7 +1113,10 @@ hwif->pre_reset = &siimage_pre_reset; if(is_sata(hwif)) + { hwif->busproc = &siimage_busproc; + hwif->sata = 1; + } if (!hwif->dma_base) { hwif->drives[0].autotune = 1; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/raid/hptraid.c linux-2.4.23-pre8/drivers/ide/raid/hptraid.c --- linux-2.4.22/drivers/ide/raid/hptraid.c 2003-08-25 11:44:41.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/raid/hptraid.c 2003-10-22 22:49:56.000000000 +0000 @@ -584,7 +584,7 @@ ide_drive_t *ideinfo; dev = MKDEV(major,minor); - ideinfo = get_info_ptr (dev); + ideinfo = ide_info_ptr (dev, 0); if (ideinfo==NULL) return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/raid/pdcraid.c linux-2.4.23-pre8/drivers/ide/raid/pdcraid.c --- linux-2.4.22/drivers/ide/raid/pdcraid.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/raid/pdcraid.c 2003-10-22 22:48:42.000000000 +0000 @@ -350,7 +350,7 @@ ide_drive_t *ideinfo; dev = MKDEV(major,minor); - ideinfo = get_info_ptr (dev); + ideinfo = ide_info_ptr (dev, 0); if (ideinfo==NULL) return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/ide/raid/silraid.c linux-2.4.23-pre8/drivers/ide/raid/silraid.c --- linux-2.4.22/drivers/ide/raid/silraid.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/ide/raid/silraid.c 2003-10-22 22:48:10.000000000 +0000 @@ -253,7 +253,7 @@ ide_drive_t *ideinfo; dev = MKDEV(major,minor); - ideinfo = get_info_ptr (dev); + ideinfo = ide_info_ptr (dev, 0); if (ideinfo==NULL) return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/isdn/Config.in linux-2.4.23-pre8/drivers/isdn/Config.in --- linux-2.4.22/drivers/isdn/Config.in 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/isdn/Config.in 2003-10-22 22:49:02.000000000 +0000 @@ -8,7 +8,7 @@ if [ "$CONFIG_INET" != "n" ]; then bool ' Support synchronous PPP' CONFIG_ISDN_PPP if [ "$CONFIG_ISDN_PPP" != "n" ]; then - bool ' PPP filtering for ISDN' CONFIG_IPPP_FILTER $CONFIG_FILTER + dep_bool ' PPP filtering for ISDN' CONFIG_IPPP_FILTER $CONFIG_FILTER bool ' Use VJ-compression with synchronous PPP' CONFIG_ISDN_PPP_VJ bool ' Support generic MP (RFC 1717)' CONFIG_ISDN_MPP dep_tristate ' Support BSD compression' CONFIG_ISDN_PPP_BSDCOMP $CONFIG_ISDN diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/md/lvm-fs.c linux-2.4.23-pre8/drivers/md/lvm-fs.c --- linux-2.4.22/drivers/md/lvm-fs.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/md/lvm-fs.c 2003-10-22 22:47:40.000000000 +0000 @@ -59,9 +59,9 @@ static int _proc_read_global(char *page, char **start, off_t off, int count, int *eof, void *data); -static int _vg_info(vg_t *vg_ptr, char *buf); -static int _lv_info(vg_t *vg_ptr, lv_t *lv_ptr, char *buf); -static int _pv_info(pv_t *pv_ptr, char *buf); +static int _vg_info(vg_t * vg_ptr, char *buf); +static int _lv_info(vg_t * vg_ptr, lv_t * lv_ptr, char *buf); +static int _pv_info(pv_t * pv_ptr, char *buf); static void _show_uuid(const char *src, char *b, char *e); @@ -78,65 +78,72 @@ /* inline functions */ /* public interface */ -void __init lvm_init_fs() { +void __init lvm_init_fs() +{ struct proc_dir_entry *pde; /* User-space has already registered this */ #if 0 - lvm_devfs_handle = devfs_register( - 0 , "lvm", 0, LVM_CHAR_MAJOR, 0, - S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, - &lvm_chr_fops, NULL); + lvm_devfs_handle = devfs_register(0, "lvm", 0, LVM_CHAR_MAJOR, 0, + S_IFCHR | S_IRUSR | S_IWUSR | + S_IRGRP, &lvm_chr_fops, NULL); #endif lvm_proc_dir = create_proc_entry(LVM_DIR, S_IFDIR, &proc_root); if (lvm_proc_dir) { - lvm_proc_vg_subdir = create_proc_entry(LVM_VG_SUBDIR, S_IFDIR, - lvm_proc_dir); + lvm_proc_vg_subdir = + create_proc_entry(LVM_VG_SUBDIR, S_IFDIR, + lvm_proc_dir); pde = create_proc_entry(LVM_GLOBAL, S_IFREG, lvm_proc_dir); - if ( pde != NULL) pde->read_proc = _proc_read_global; + if (pde != NULL) + pde->read_proc = _proc_read_global; } } -void lvm_fin_fs() { +void lvm_fin_fs() +{ #if 0 - devfs_unregister (lvm_devfs_handle); + devfs_unregister(lvm_devfs_handle); #endif remove_proc_entry(LVM_GLOBAL, lvm_proc_dir); remove_proc_entry(LVM_VG_SUBDIR, lvm_proc_dir); remove_proc_entry(LVM_DIR, &proc_root); } -void lvm_fs_create_vg(vg_t *vg_ptr) { +void lvm_fs_create_vg(vg_t * vg_ptr) +{ struct proc_dir_entry *pde; if (!vg_ptr) return; vg_devfs_handle[vg_ptr->vg_number] = - devfs_mk_dir(0, vg_ptr->vg_name, NULL); + devfs_mk_dir(0, vg_ptr->vg_name, NULL); - ch_devfs_handle[vg_ptr->vg_number] = devfs_register( - vg_devfs_handle[vg_ptr->vg_number] , "group", - DEVFS_FL_DEFAULT, LVM_CHAR_MAJOR, vg_ptr->vg_number, - S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, - &lvm_chr_fops, NULL); + ch_devfs_handle[vg_ptr->vg_number] = + devfs_register(vg_devfs_handle[vg_ptr->vg_number], "group", + DEVFS_FL_DEFAULT, LVM_CHAR_MAJOR, + vg_ptr->vg_number, + S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, + &lvm_chr_fops, NULL); vg_ptr->vg_dir_pde = create_proc_entry(vg_ptr->vg_name, S_IFDIR, lvm_proc_vg_subdir); - if((pde = create_proc_entry("group", S_IFREG, vg_ptr->vg_dir_pde))) { + if ((pde = + create_proc_entry("group", S_IFREG, vg_ptr->vg_dir_pde))) { pde->read_proc = _proc_read_vg; pde->data = vg_ptr; } vg_ptr->lv_subdir_pde = - create_proc_entry(LVM_LV_SUBDIR, S_IFDIR, vg_ptr->vg_dir_pde); + create_proc_entry(LVM_LV_SUBDIR, S_IFDIR, vg_ptr->vg_dir_pde); vg_ptr->pv_subdir_pde = - create_proc_entry(LVM_PV_SUBDIR, S_IFDIR, vg_ptr->vg_dir_pde); + create_proc_entry(LVM_PV_SUBDIR, S_IFDIR, vg_ptr->vg_dir_pde); } -void lvm_fs_remove_vg(vg_t *vg_ptr) { +void lvm_fs_remove_vg(vg_t * vg_ptr) +{ int i; if (!vg_ptr) @@ -146,18 +153,20 @@ ch_devfs_handle[vg_ptr->vg_number] = NULL; /* remove lv's */ - for(i = 0; i < vg_ptr->lv_max; i++) - if(vg_ptr->lv[i]) lvm_fs_remove_lv(vg_ptr, vg_ptr->lv[i]); + for (i = 0; i < vg_ptr->lv_max; i++) + if (vg_ptr->lv[i]) + lvm_fs_remove_lv(vg_ptr, vg_ptr->lv[i]); /* must not remove directory before leaf nodes */ devfs_unregister(vg_devfs_handle[vg_ptr->vg_number]); vg_devfs_handle[vg_ptr->vg_number] = NULL; /* remove pv's */ - for(i = 0; i < vg_ptr->pv_max; i++) - if(vg_ptr->pv[i]) lvm_fs_remove_pv(vg_ptr, vg_ptr->pv[i]); + for (i = 0; i < vg_ptr->pv_max; i++) + if (vg_ptr->pv[i]) + lvm_fs_remove_pv(vg_ptr, vg_ptr->pv[i]); - if(vg_ptr->vg_dir_pde) { + if (vg_ptr->vg_dir_pde) { remove_proc_entry(LVM_LV_SUBDIR, vg_ptr->vg_dir_pde); vg_ptr->lv_subdir_pde = NULL; @@ -172,13 +181,15 @@ } -static inline const char *_basename(const char *str) { +static inline const char *_basename(const char *str) +{ const char *name = strrchr(str, '/'); name = name ? name + 1 : str; return name; } -devfs_handle_t lvm_fs_create_lv(vg_t *vg_ptr, lv_t *lv) { +devfs_handle_t lvm_fs_create_lv(vg_t * vg_ptr, lv_t * lv) +{ struct proc_dir_entry *pde; const char *name; @@ -187,21 +198,24 @@ name = _basename(lv->lv_name); - lv_devfs_handle[MINOR(lv->lv_dev)] = devfs_register( - vg_devfs_handle[vg_ptr->vg_number], name, - DEVFS_FL_DEFAULT, LVM_BLK_MAJOR, MINOR(lv->lv_dev), - S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP, - &lvm_blk_dops, NULL); - - if(vg_ptr->lv_subdir_pde && - (pde = create_proc_entry(name, S_IFREG, vg_ptr->lv_subdir_pde))) { + lv_devfs_handle[MINOR(lv->lv_dev)] = + devfs_register(vg_devfs_handle[vg_ptr->vg_number], name, + DEVFS_FL_DEFAULT, LVM_BLK_MAJOR, + MINOR(lv->lv_dev), + S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP, + &lvm_blk_dops, NULL); + + if (vg_ptr->lv_subdir_pde && + (pde = + create_proc_entry(name, S_IFREG, vg_ptr->lv_subdir_pde))) { pde->read_proc = _proc_read_lv; pde->data = lv; } return lv_devfs_handle[MINOR(lv->lv_dev)]; } -void lvm_fs_remove_lv(vg_t *vg_ptr, lv_t *lv) { +void lvm_fs_remove_lv(vg_t * vg_ptr, lv_t * lv) +{ if (!vg_ptr || !lv) return; @@ -209,51 +223,55 @@ devfs_unregister(lv_devfs_handle[MINOR(lv->lv_dev)]); lv_devfs_handle[MINOR(lv->lv_dev)] = NULL; - if(vg_ptr->lv_subdir_pde) { + if (vg_ptr->lv_subdir_pde) { const char *name = _basename(lv->lv_name); remove_proc_entry(name, vg_ptr->lv_subdir_pde); } } -static inline void _make_pv_name(const char *src, char *b, char *e) { +static inline void _make_pv_name(const char *src, char *b, char *e) +{ int offset = strlen(LVM_DIR_PREFIX); - if(strncmp(src, LVM_DIR_PREFIX, offset)) + if (strncmp(src, LVM_DIR_PREFIX, offset)) offset = 0; e--; src += offset; - while(*src && (b != e)) { + while (*src && (b != e)) { *b++ = (*src == '/') ? '_' : *src; src++; } *b = '\0'; } -void lvm_fs_create_pv(vg_t *vg_ptr, pv_t *pv) { +void lvm_fs_create_pv(vg_t * vg_ptr, pv_t * pv) +{ struct proc_dir_entry *pde; char name[NAME_LEN]; if (!vg_ptr || !pv) return; - if(!vg_ptr->pv_subdir_pde) + if (!vg_ptr->pv_subdir_pde) return; _make_pv_name(pv->pv_name, name, name + sizeof(name)); - if((pde = create_proc_entry(name, S_IFREG, vg_ptr->pv_subdir_pde))) { + if ((pde = + create_proc_entry(name, S_IFREG, vg_ptr->pv_subdir_pde))) { pde->read_proc = _proc_read_pv; pde->data = pv; } } -void lvm_fs_remove_pv(vg_t *vg_ptr, pv_t *pv) { +void lvm_fs_remove_pv(vg_t * vg_ptr, pv_t * pv) +{ char name[NAME_LEN]; if (!vg_ptr || !pv) return; - if(!vg_ptr->pv_subdir_pde) + if (!vg_ptr->pv_subdir_pde) return; _make_pv_name(pv->pv_name, name, name + sizeof(name)); @@ -262,7 +280,8 @@ static int _proc_read_vg(char *page, char **start, off_t off, - int count, int *eof, void *data) { + int count, int *eof, void *data) +{ int sz = 0; vg_t *vg_ptr = data; char uuid[NAME_LEN]; @@ -279,9 +298,11 @@ sz += sprintf(page + sz, "PV max: %u\n", vg_ptr->pv_max); sz += sprintf(page + sz, "PV current: %u\n", vg_ptr->pv_cur); sz += sprintf(page + sz, "PV active: %u\n", vg_ptr->pv_act); - sz += sprintf(page + sz, "PE size: %u\n", vg_ptr->pe_size / 2); + sz += + sprintf(page + sz, "PE size: %u\n", vg_ptr->pe_size / 2); sz += sprintf(page + sz, "PE total: %u\n", vg_ptr->pe_total); - sz += sprintf(page + sz, "PE allocated: %u\n", vg_ptr->pe_allocated); + sz += + sprintf(page + sz, "PE allocated: %u\n", vg_ptr->pe_allocated); _show_uuid(vg_ptr->vg_uuid, uuid, uuid + sizeof(uuid)); sz += sprintf(page + sz, "uuid: %s\n", uuid); @@ -290,7 +311,8 @@ } static int _proc_read_lv(char *page, char **start, off_t off, - int count, int *eof, void *data) { + int count, int *eof, void *data) +{ int sz = 0; lv_t *lv = data; @@ -301,7 +323,7 @@ sz += sprintf(page + sz, "number: %u\n", lv->lv_number); sz += sprintf(page + sz, "open: %u\n", lv->lv_open); sz += sprintf(page + sz, "allocation: %u\n", lv->lv_allocation); - if(lv->lv_stripes > 1) { + if (lv->lv_stripes > 1) { sz += sprintf(page + sz, "stripes: %u\n", lv->lv_stripes); sz += sprintf(page + sz, "stripesize: %u\n", @@ -314,7 +336,8 @@ } static int _proc_read_pv(char *page, char **start, off_t off, - int count, int *eof, void *data) { + int count, int *eof, void *data) +{ int sz = 0; pv_t *pv = data; char uuid[NAME_LEN]; @@ -329,7 +352,7 @@ sz += sprintf(page + sz, "PE total: %u\n", pv->pe_total); sz += sprintf(page + sz, "PE allocated: %u\n", pv->pe_allocated); sz += sprintf(page + sz, "device: %02u:%02u\n", - MAJOR(pv->pv_dev), MINOR(pv->pv_dev)); + MAJOR(pv->pv_dev), MINOR(pv->pv_dev)); _show_uuid(pv->pv_uuid, uuid, uuid + sizeof(uuid)); sz += sprintf(page + sz, "uuid: %s\n", uuid); @@ -337,13 +360,15 @@ return sz; } -static int _proc_read_global(char *page, char **start, off_t pos, int count, - int *eof, void *data) { +static int _proc_read_global(char *page, char **start, off_t pos, + int count, int *eof, void *data) +{ #define LVM_PROC_BUF ( i == 0 ? dummy_buf : &buf[sz]) - int c, i, l, p, v, vg_counter, pv_counter, lv_counter, lv_open_counter, - lv_open_total, pe_t_bytes, hash_table_bytes, lv_block_exception_t_bytes, seconds; + int c, i, l, p, v, vg_counter, pv_counter, lv_counter, + lv_open_counter, lv_open_total, pe_t_bytes, hash_table_bytes, + lv_block_exception_t_bytes, seconds; static off_t sz; off_t sz_last; static char *buf = NULL; @@ -359,12 +384,12 @@ lvm_name, pos, count); #endif - if(pos != 0 && buf != NULL) + if (pos != 0 && buf != NULL) goto out; - sz_last = vg_counter = pv_counter = lv_counter = lv_open_counter = \ - lv_open_total = pe_t_bytes = hash_table_bytes = \ - lv_block_exception_t_bytes = 0; + sz_last = vg_counter = pv_counter = lv_counter = lv_open_counter = + lv_open_total = pe_t_bytes = hash_table_bytes = + lv_block_exception_t_bytes = 0; /* get some statistics */ for (v = 0; v < ABS_MAX_VG; v++) { @@ -374,14 +399,26 @@ lv_counter += vg_ptr->lv_cur; if (vg_ptr->lv_cur > 0) { for (l = 0; l < vg[v]->lv_max; l++) { - if ((lv_ptr = vg_ptr->lv[l]) != NULL) { - pe_t_bytes += lv_ptr->lv_allocated_le; - hash_table_bytes += lv_ptr->lv_snapshot_hash_table_size; - if (lv_ptr->lv_block_exception != NULL) - lv_block_exception_t_bytes += lv_ptr->lv_remap_end; + if ((lv_ptr = + vg_ptr->lv[l]) != NULL) { + pe_t_bytes += + lv_ptr-> + lv_allocated_le; + hash_table_bytes += + lv_ptr-> + lv_snapshot_hash_table_size; + if (lv_ptr-> + lv_block_exception != + NULL) + lv_block_exception_t_bytes + += + lv_ptr-> + lv_remap_end; if (lv_ptr->lv_open > 0) { lv_open_counter++; - lv_open_total += lv_ptr->lv_open; + lv_open_total += + lv_ptr-> + lv_open; } } } @@ -403,8 +440,7 @@ 2nd to fill the malloced buffer */ for (i = 0; i < 2; i++) { sz = 0; - sz += sprintf(LVM_PROC_BUF, - "LVM " + sz += sprintf(LVM_PROC_BUF, "LVM " #ifdef MODULE "module" #else @@ -422,8 +458,7 @@ lv_open_counter == 1 ? "" : "s"); if (lv_open_total > 0) sz += sprintf(LVM_PROC_BUF, - " %d times)\n", - lv_open_total); + " %d times)\n", lv_open_total); else sz += sprintf(LVM_PROC_BUF, ")"); sz += sprintf(LVM_PROC_BUF, @@ -431,7 +466,8 @@ vg_counter * sizeof(vg_t) + pv_counter * sizeof(pv_t) + lv_counter * sizeof(lv_t) + - pe_t_bytes + hash_table_bytes + lv_block_exception_t_bytes + sz_last, + pe_t_bytes + hash_table_bytes + + lv_block_exception_t_bytes + sz_last, lvm_iop_version); seconds = CURRENT_TIME - loadtime; @@ -445,46 +481,70 @@ } sz += sprintf(LVM_PROC_BUF, "%d:%02d:%02d active\n", (seconds % 86400) / 3600, - (seconds % 3600) / 60, - seconds % 60); + (seconds % 3600) / 60, seconds % 60); if (vg_counter > 0) { for (v = 0; v < ABS_MAX_VG; v++) { /* volume group */ if ((vg_ptr = vg[v]) != NULL) { - sz += _vg_info(vg_ptr, LVM_PROC_BUF); + sz += + _vg_info(vg_ptr, LVM_PROC_BUF); /* physical volumes */ sz += sprintf(LVM_PROC_BUF, "\n PV%s ", - vg_ptr->pv_cur == 1 ? ": " : "s:"); + vg_ptr->pv_cur == + 1 ? ": " : "s:"); c = 0; - for (p = 0; p < vg_ptr->pv_max; p++) { - if ((pv_ptr = vg_ptr->pv[p]) != NULL) { - sz += _pv_info(pv_ptr, LVM_PROC_BUF); + for (p = 0; p < vg_ptr->pv_max; + p++) { + if ((pv_ptr = + vg_ptr->pv[p]) != + NULL) { + sz += + _pv_info + (pv_ptr, + LVM_PROC_BUF); c++; - if (c < vg_ptr->pv_cur) - sz += sprintf(LVM_PROC_BUF, - "\n "); + if (c < + vg_ptr->pv_cur) + sz += + sprintf + (LVM_PROC_BUF, + "\n "); } } /* logical volumes */ sz += sprintf(LVM_PROC_BUF, "\n LV%s ", - vg_ptr->lv_cur == 1 ? ": " : "s:"); + vg_ptr->lv_cur == + 1 ? ": " : "s:"); c = 0; - for (l = 0; l < vg_ptr->lv_max; l++) { - if ((lv_ptr = vg_ptr->lv[l]) != NULL) { - sz += _lv_info(vg_ptr, lv_ptr, LVM_PROC_BUF); + for (l = 0; l < vg_ptr->lv_max; + l++) { + if ((lv_ptr = + vg_ptr->lv[l]) != + NULL) { + sz += + _lv_info + (vg_ptr, + lv_ptr, + LVM_PROC_BUF); c++; - if (c < vg_ptr->lv_cur) - sz += sprintf(LVM_PROC_BUF, - "\n "); + if (c < + vg_ptr->lv_cur) + sz += + sprintf + (LVM_PROC_BUF, + "\n "); } } - if (vg_ptr->lv_cur == 0) sz += sprintf(LVM_PROC_BUF, "none"); + if (vg_ptr->lv_cur == 0) + sz += + sprintf(LVM_PROC_BUF, + "none"); sz += sprintf(LVM_PROC_BUF, "\n"); } } @@ -495,14 +555,15 @@ unlock_kernel(); if (buf == NULL) { sz = 0; - return sprintf(page, "%s - vmalloc error at line %d\n", + return sprintf(page, + "%s - vmalloc error at line %d\n", lvm_name, __LINE__); } } sz_last = sz; } - out: + out: if (pos > sz - 1) { lock_kernel(); vfree(buf); @@ -522,11 +583,13 @@ /* * provide VG info for proc filesystem use (global) */ -static int _vg_info(vg_t *vg_ptr, char *buf) { +static int _vg_info(vg_t * vg_ptr, char *buf) +{ int sz = 0; char inactive_flag = ' '; - if (!(vg_ptr->vg_status & VG_ACTIVE)) inactive_flag = 'I'; + if (!(vg_ptr->vg_status & VG_ACTIVE)) + inactive_flag = 'I'; sz = sprintf(buf, "\nVG: %c%s [%d PV, %d LV/%d open] " " PE Size: %d KB\n" @@ -537,13 +600,13 @@ vg_ptr->pv_cur, vg_ptr->lv_cur, vg_ptr->lv_open, - vg_ptr->pe_size >> 1, + vg_ptr->pe_size >> 1, vg_ptr->pe_size * vg_ptr->pe_total >> 1, vg_ptr->pe_total, vg_ptr->pe_allocated * vg_ptr->pe_size >> 1, - vg_ptr->pe_allocated, + vg_ptr->pe_allocated, (vg_ptr->pe_total - vg_ptr->pe_allocated) * - vg_ptr->pe_size >> 1, + vg_ptr->pe_size >> 1, vg_ptr->pe_total - vg_ptr->pe_allocated); return sz; } @@ -552,10 +615,11 @@ /* * provide LV info for proc filesystem use (global) */ -static int _lv_info(vg_t *vg_ptr, lv_t *lv_ptr, char *buf) { +static int _lv_info(vg_t * vg_ptr, lv_t * lv_ptr, char *buf) +{ int sz = 0; char inactive_flag = 'A', allocation_flag = ' ', - stripes_flag = ' ', rw_flag = ' ', *basename; + stripes_flag = ' ', rw_flag = ' ', *basename; if (!(lv_ptr->lv_status & LV_ACTIVE)) inactive_flag = 'I'; @@ -568,35 +632,33 @@ stripes_flag = 'L'; if (lv_ptr->lv_stripes > 1) stripes_flag = 'S'; - sz += sprintf(buf+sz, + sz += sprintf(buf + sz, "[%c%c%c%c", inactive_flag, - rw_flag, - allocation_flag, - stripes_flag); + rw_flag, allocation_flag, stripes_flag); if (lv_ptr->lv_stripes > 1) - sz += sprintf(buf+sz, "%-2d", - lv_ptr->lv_stripes); + sz += sprintf(buf + sz, "%-2d", lv_ptr->lv_stripes); else - sz += sprintf(buf+sz, " "); + sz += sprintf(buf + sz, " "); /* FIXME: use _basename */ basename = strrchr(lv_ptr->lv_name, '/'); - if ( basename == 0) basename = lv_ptr->lv_name; - else basename++; - sz += sprintf(buf+sz, "] %-25s", basename); + if (basename == 0) + basename = lv_ptr->lv_name; + else + basename++; + sz += sprintf(buf + sz, "] %-25s", basename); if (strlen(basename) > 25) - sz += sprintf(buf+sz, + sz += sprintf(buf + sz, "\n "); - sz += sprintf(buf+sz, "%9d /%-6d ", + sz += sprintf(buf + sz, "%9d /%-6d ", lv_ptr->lv_size >> 1, lv_ptr->lv_size / vg_ptr->pe_size); if (lv_ptr->lv_open == 0) - sz += sprintf(buf+sz, "close"); + sz += sprintf(buf + sz, "close"); else - sz += sprintf(buf+sz, "%dx open", - lv_ptr->lv_open); + sz += sprintf(buf + sz, "%dx open", lv_ptr->lv_open); return sz; } @@ -605,7 +667,8 @@ /* * provide PV info for proc filesystem use (global) */ -static int _pv_info(pv_t *pv, char *buf) { +static int _pv_info(pv_t * pv, char *buf) +{ int sz = 0; char inactive_flag = 'A', allocation_flag = ' '; char *pv_name = NULL; @@ -615,9 +678,11 @@ allocation_flag = 'A'; if (!(pv->pv_allocatable & PV_ALLOCATABLE)) allocation_flag = 'N'; - pv_name = strchr(pv->pv_name+1,'/'); - if ( pv_name == 0) pv_name = pv->pv_name; - else pv_name++; + pv_name = strchr(pv->pv_name + 1, '/'); + if (pv_name == 0) + pv_name = pv->pv_name; + else + pv_name++; sz = sprintf(buf, "[%c%c] %-21s %8d /%-6d " "%8d /%-6d %8d /%-6d", @@ -629,17 +694,17 @@ pv->pe_allocated * pv->pe_size >> 1, pv->pe_allocated, (pv->pe_total - pv->pe_allocated) * - pv->pe_size >> 1, - pv->pe_total - pv->pe_allocated); + pv->pe_size >> 1, pv->pe_total - pv->pe_allocated); return sz; } -static void _show_uuid(const char *src, char *b, char *e) { +static void _show_uuid(const char *src, char *b, char *e) +{ int i; e--; - for(i = 0; *src && (b != e); i++) { - if(i && !(i & 0x3)) + for (i = 0; *src && (b != e); i++) { + if (i && !(i & 0x3)) *b++ = '-'; *b++ = *src++; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/md/lvm-internal.h linux-2.4.23-pre8/drivers/md/lvm-internal.h --- linux-2.4.22/drivers/md/lvm-internal.h 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/md/lvm-internal.h 2003-10-22 22:49:40.000000000 +0000 @@ -50,7 +50,7 @@ extern struct file_operations lvm_chr_fops; #ifndef uchar -typedef unsigned char uchar; +typedef unsigned char uchar; #endif extern struct block_device_operations lvm_blk_dops; @@ -89,24 +89,24 @@ int lvm_get_blksize(kdev_t); int lvm_snapshot_alloc(lv_t *); int lvm_snapshot_fill_COW_page(vg_t *, lv_t *); -int lvm_snapshot_COW(kdev_t, ulong, ulong, ulong, vg_t *vg, lv_t *); +int lvm_snapshot_COW(kdev_t, ulong, ulong, ulong, vg_t * vg, lv_t *); int lvm_snapshot_remap_block(kdev_t *, ulong *, ulong, lv_t *); void lvm_snapshot_release(lv_t *); int lvm_write_COW_table_block(vg_t *, lv_t *); void lvm_hash_link(lv_block_exception_t *, kdev_t, ulong, lv_t *); int lvm_snapshot_alloc_hash_table(lv_t *); -void lvm_drop_snapshot(vg_t *vg, lv_t *, const char *); +void lvm_drop_snapshot(vg_t * vg, lv_t *, const char *); /* lvm_fs.c */ void lvm_init_fs(void); void lvm_fin_fs(void); -void lvm_fs_create_vg(vg_t *vg_ptr); -void lvm_fs_remove_vg(vg_t *vg_ptr); -devfs_handle_t lvm_fs_create_lv(vg_t *vg_ptr, lv_t *lv); -void lvm_fs_remove_lv(vg_t *vg_ptr, lv_t *lv); -void lvm_fs_create_pv(vg_t *vg_ptr, pv_t *pv); -void lvm_fs_remove_pv(vg_t *vg_ptr, pv_t *pv); +void lvm_fs_create_vg(vg_t * vg_ptr); +void lvm_fs_remove_vg(vg_t * vg_ptr); +devfs_handle_t lvm_fs_create_lv(vg_t * vg_ptr, lv_t * lv); +void lvm_fs_remove_lv(vg_t * vg_ptr, lv_t * lv); +void lvm_fs_create_pv(vg_t * vg_ptr, pv_t * pv); +void lvm_fs_remove_pv(vg_t * vg_ptr, pv_t * pv); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/md/lvm-snap.c linux-2.4.23-pre8/drivers/md/lvm-snap.c --- linux-2.4.22/drivers/md/lvm-snap.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/md/lvm-snap.c 2003-10-22 22:49:14.000000000 +0000 @@ -42,6 +42,8 @@ * 15/10/2001 - fix snapshot alignment problem [CM] * - fix snapshot full oops (always check lv_block_exception) [CM] * 26/06/2002 - support for new list_move macro [patch@luckynet.dynu.com] + * 26/07/2002 - removed conditional list_move macro because we will + * discontinue LVM1 before 2.6 anyway * */ @@ -57,7 +59,8 @@ #include "lvm-internal.h" -static char *lvm_snap_version __attribute__ ((unused)) = "LVM "LVM_RELEASE_NAME" snapshot code ("LVM_RELEASE_DATE")\n"; +static char *lvm_snap_version __attribute__ ((unused)) = + "LVM " LVM_RELEASE_NAME " snapshot code (" LVM_RELEASE_DATE ")\n"; extern const char *const lvm_name; @@ -65,19 +68,20 @@ void lvm_snapshot_release(lv_t *); -static int _write_COW_table_block(vg_t *vg, lv_t *lv, int idx, +static int _write_COW_table_block(vg_t * vg, lv_t * lv, int idx, const char **reason); -static void _disable_snapshot(vg_t *vg, lv_t *lv); +static void _disable_snapshot(vg_t * vg, lv_t * lv); static inline int __brw_kiovec(int rw, int nr, struct kiobuf *iovec[], kdev_t dev, unsigned long b[], int size, - lv_t *lv) { + lv_t * lv) +{ return brw_kiovec(rw, nr, iovec, dev, b, size); } -static int _pv_get_number(vg_t * vg, kdev_t rdev, uint *pvn) +static int _pv_get_number(vg_t * vg, kdev_t rdev, uint * pvn) { uint p; for (p = 0; p < vg->pv_max; p++) { @@ -104,34 +108,32 @@ #define hashfn(dev,block,mask,chunk_size) \ ((HASHDEV(dev)^((block)/(chunk_size))) & (mask)) -static inline lv_block_exception_t * -lvm_find_exception_table(kdev_t org_dev, unsigned long org_start, lv_t * lv) +static inline lv_block_exception_t *lvm_find_exception_table(kdev_t + org_dev, + unsigned long + org_start, + lv_t * lv) { - struct list_head * hash_table = lv->lv_snapshot_hash_table, * next; + struct list_head *hash_table = lv->lv_snapshot_hash_table, *next; unsigned long mask = lv->lv_snapshot_hash_mask; int chunk_size = lv->lv_chunk_size; - lv_block_exception_t * ret; + lv_block_exception_t *ret; int i = 0; - hash_table = &hash_table[hashfn(org_dev, org_start, mask, chunk_size)]; + hash_table = + &hash_table[hashfn(org_dev, org_start, mask, chunk_size)]; ret = NULL; - for (next = hash_table->next; next != hash_table; next = next->next) - { - lv_block_exception_t * exception; + for (next = hash_table->next; next != hash_table; + next = next->next) { + lv_block_exception_t *exception; exception = list_entry(next, lv_block_exception_t, hash); if (exception->rsector_org == org_start && - exception->rdev_org == org_dev) - { - if (i) - { + exception->rdev_org == org_dev) { + if (i) { /* fun, isn't it? :) */ -#ifdef list_move - list_move(next, hash_table); -#else list_del(next); list_add(next, hash_table); -#endif } ret = exception; break; @@ -145,13 +147,14 @@ kdev_t org_dev, unsigned long org_start, lv_t * lv) { - struct list_head * hash_table = lv->lv_snapshot_hash_table; + struct list_head *hash_table = lv->lv_snapshot_hash_table; unsigned long mask = lv->lv_snapshot_hash_mask; int chunk_size = lv->lv_chunk_size; if (!hash_table) BUG(); - hash_table = &hash_table[hashfn(org_dev, org_start, mask, chunk_size)]; + hash_table = + &hash_table[hashfn(org_dev, org_start, mask, chunk_size)]; list_add(&exception->hash, hash_table); } @@ -163,26 +166,25 @@ * * We need to be holding at least a read lock on lv->lv_lock. */ -int lvm_snapshot_remap_block(kdev_t * org_dev, unsigned long * org_sector, +int lvm_snapshot_remap_block(kdev_t * org_dev, unsigned long *org_sector, unsigned long pe_start, lv_t * lv) { int ret; unsigned long pe_off, pe_adjustment, __org_start; kdev_t __org_dev; int chunk_size = lv->lv_chunk_size; - lv_block_exception_t * exception; + lv_block_exception_t *exception; if (!lv->lv_block_exception) return -1; pe_off = pe_start % chunk_size; - pe_adjustment = (*org_sector-pe_off) % chunk_size; + pe_adjustment = (*org_sector - pe_off) % chunk_size; __org_start = *org_sector - pe_adjustment; __org_dev = *org_dev; ret = 0; exception = lvm_find_exception_table(__org_dev, __org_start, lv); - if (exception) - { + if (exception) { *org_dev = exception->rdev_new; *org_sector = exception->rsector_new + pe_adjustment; ret = 1; @@ -190,7 +192,7 @@ return ret; } -void lvm_drop_snapshot(vg_t *vg, lv_t *lv_snap, const char *reason) +void lvm_drop_snapshot(vg_t * vg, lv_t * lv_snap, const char *reason) { kdev_t last_dev; int i; @@ -203,7 +205,7 @@ _disable_snapshot(vg, lv_snap); for (i = last_dev = 0; i < lv_snap->lv_remap_ptr; i++) { - if ( lv_snap->lv_block_exception[i].rdev_new != last_dev) { + if (lv_snap->lv_block_exception[i].rdev_new != last_dev) { last_dev = lv_snap->lv_block_exception[i].rdev_new; invalidate_buffers(last_dev); } @@ -214,14 +216,14 @@ printk(KERN_INFO "%s -- giving up to snapshot %s on %s: %s\n", - lvm_name, lv_snap->lv_snapshot_org->lv_name, lv_snap->lv_name, - reason); + lvm_name, lv_snap->lv_snapshot_org->lv_name, + lv_snap->lv_name, reason); } static inline int lvm_snapshot_prepare_blocks(unsigned long *blocks, - unsigned long start, - int nr_sectors, - int blocksize) + unsigned long start, + int nr_sectors, + int blocksize) { int i, sectors_per_block, nr_blocks; @@ -244,8 +246,7 @@ int correct_size = BLOCK_SIZE, i, major; major = MAJOR(dev); - if (blksize_size[major]) - { + if (blksize_size[major]) { i = blksize_size[major][MINOR(dev)]; if (i) correct_size = i; @@ -254,10 +255,10 @@ } #ifdef DEBUG_SNAPSHOT -static inline void invalidate_snap_cache(unsigned long start, unsigned long nr, - kdev_t dev) +static inline void invalidate_snap_cache(unsigned long start, + unsigned long nr, kdev_t dev) { - struct buffer_head * bh; + struct buffer_head *bh; int sectors_per_block, i, blksize, minor; minor = MINOR(dev); @@ -266,8 +267,7 @@ nr /= sectors_per_block; start /= sectors_per_block; - for (i = 0; i < nr; i++) - { + for (i = 0; i < nr; i++) { bh = get_hash_table(dev, start++, blksize); if (bh) bforget(bh); @@ -280,40 +280,44 @@ { int id = 0, is = lv_snap->lv_remap_ptr; ulong blksize_snap; - lv_COW_table_disk_t * lv_COW_table = (lv_COW_table_disk_t *) - page_address(lv_snap->lv_COW_table_iobuf->maplist[0]); + lv_COW_table_disk_t *lv_COW_table = (lv_COW_table_disk_t *) + page_address(lv_snap->lv_COW_table_iobuf->maplist[0]); if (is == 0) return 0; is--; blksize_snap = - lvm_get_blksize(lv_snap->lv_block_exception[is].rdev_new); + lvm_get_blksize(lv_snap->lv_block_exception[is].rdev_new); is -= is % (blksize_snap / sizeof(lv_COW_table_disk_t)); memset(lv_COW_table, 0, blksize_snap); - for ( ; is < lv_snap->lv_remap_ptr; is++, id++) { + for (; is < lv_snap->lv_remap_ptr; is++, id++) { /* store new COW_table entry */ - lv_block_exception_t *be = lv_snap->lv_block_exception + is; + lv_block_exception_t *be = + lv_snap->lv_block_exception + is; uint pvn; if (_pv_get_number(vg, be->rdev_org, &pvn)) goto bad; lv_COW_table[id].pv_org_number = cpu_to_le64(pvn); - lv_COW_table[id].pv_org_rsector = cpu_to_le64(be->rsector_org); + lv_COW_table[id].pv_org_rsector = + cpu_to_le64(be->rsector_org); if (_pv_get_number(vg, be->rdev_new, &pvn)) goto bad; lv_COW_table[id].pv_snap_number = cpu_to_le64(pvn); - lv_COW_table[id].pv_snap_rsector = cpu_to_le64(be->rsector_new); + lv_COW_table[id].pv_snap_rsector = + cpu_to_le64(be->rsector_new); } return 0; - bad: - printk(KERN_ERR "%s -- lvm_snapshot_fill_COW_page failed", lvm_name); + bad: + printk(KERN_ERR "%s -- lvm_snapshot_fill_COW_page failed", + lvm_name); return -1; } @@ -323,12 +327,12 @@ * * We need to hold a write lock on lv_snap->lv_lock. */ -int lvm_write_COW_table_block(vg_t * vg, lv_t *lv_snap) +int lvm_write_COW_table_block(vg_t * vg, lv_t * lv_snap) { int r; const char *err; - if((r = _write_COW_table_block(vg, lv_snap, - lv_snap->lv_remap_ptr - 1, &err))) + if ((r = _write_COW_table_block(vg, lv_snap, + lv_snap->lv_remap_ptr - 1, &err))) lvm_drop_snapshot(vg, lv_snap, err); return r; } @@ -349,13 +353,15 @@ unsigned long org_phys_sector, unsigned long org_pe_start, unsigned long org_virt_sector, - vg_t *vg, lv_t* lv_snap) + vg_t * vg, lv_t * lv_snap) { - const char * reason; - unsigned long org_start, snap_start, snap_phys_dev, virt_start, pe_off; + const char *reason; + unsigned long org_start, snap_start, snap_phys_dev, virt_start, + pe_off; unsigned long phys_start; - int idx = lv_snap->lv_remap_ptr, chunk_size = lv_snap->lv_chunk_size; - struct kiobuf * iobuf = lv_snap->lv_iobuf; + int idx = lv_snap->lv_remap_ptr, chunk_size = + lv_snap->lv_chunk_size; + struct kiobuf *iobuf = lv_snap->lv_iobuf; unsigned long *blocks = iobuf->blocks; int blksize_snap, blksize_org, min_blksize, max_blksize; int max_sectors, nr_sectors; @@ -366,7 +372,8 @@ /* calculate physical boundaries of source chunk */ pe_off = org_pe_start % chunk_size; - org_start = org_phys_sector - ((org_phys_sector-pe_off) % chunk_size); + org_start = + org_phys_sector - ((org_phys_sector - pe_off) % chunk_size); virt_start = org_virt_sector - (org_phys_sector - org_start); /* calculate physical boundaries of destination chunk */ @@ -381,25 +388,22 @@ lvm_name, kdevname(org_phys_dev), org_phys_sector, org_start, kdevname(snap_phys_dev), snap_start, - chunk_size, - org_pe_start, pe_off, - org_virt_sector); + chunk_size, org_pe_start, pe_off, org_virt_sector); #endif blksize_org = lvm_sectsize(org_phys_dev); blksize_snap = lvm_sectsize(snap_phys_dev); max_blksize = max(blksize_org, blksize_snap); min_blksize = min(blksize_org, blksize_snap); - max_sectors = KIO_MAX_SECTORS * (min_blksize>>9); + max_sectors = KIO_MAX_SECTORS * (min_blksize >> 9); - if (chunk_size % (max_blksize>>9)) + if (chunk_size % (max_blksize >> 9)) goto fail_blksize; /* Don't change org_start, we need it to fill in the exception table */ phys_start = org_start; - while (chunk_size) - { + while (chunk_size) { nr_sectors = min(chunk_size, max_sectors); chunk_size -= nr_sectors; @@ -410,7 +414,8 @@ goto fail_prepare; if (__brw_kiovec(READ, 1, &iobuf, org_phys_dev, blocks, - blksize_org, lv_snap) != (nr_sectors<<9)) + blksize_org, + lv_snap) != (nr_sectors << 9)) goto fail_raw_read; if (!lvm_snapshot_prepare_blocks(blocks, snap_start, @@ -418,7 +423,8 @@ goto fail_prepare; if (__brw_kiovec(WRITE, 1, &iobuf, snap_phys_dev, blocks, - blksize_snap, lv_snap) != (nr_sectors<<9)) + blksize_snap, + lv_snap) != (nr_sectors << 9)) goto fail_raw_write; phys_start += nr_sectors; @@ -440,53 +446,55 @@ org_phys_dev, org_start, lv_snap); lv_snap->lv_remap_ptr = idx + 1; if (lv_snap->lv_snapshot_use_rate > 0) { - if (lv_snap->lv_remap_ptr * 100 / lv_snap->lv_remap_end >= lv_snap->lv_snapshot_use_rate) + if (lv_snap->lv_remap_ptr * 100 / lv_snap->lv_remap_end >= + lv_snap->lv_snapshot_use_rate) wake_up_interruptible(&lv_snap->lv_snapshot_wait); } return 0; /* slow path */ -out: + out: lvm_drop_snapshot(vg, lv_snap, reason); return 1; -fail_out_of_space: + fail_out_of_space: reason = "out of space"; goto out; -fail_raw_read: + fail_raw_read: reason = "read error"; goto out; -fail_raw_write: + fail_raw_write: reason = "write error"; goto out; -fail_blksize: + fail_blksize: reason = "blocksize error"; goto out; -fail_prepare: + fail_prepare: reason = "couldn't prepare kiovec blocks " - "(start probably isn't block aligned)"; + "(start probably isn't block aligned)"; goto out; } -int lvm_snapshot_alloc_iobuf_pages(struct kiobuf * iobuf, int sectors) +int lvm_snapshot_alloc_iobuf_pages(struct kiobuf *iobuf, int sectors) { int bytes, nr_pages, err, i; bytes = sectors * SECTOR_SIZE; nr_pages = (bytes + ~PAGE_MASK) >> PAGE_SHIFT; err = expand_kiobuf(iobuf, nr_pages); - if (err) goto out; + if (err) + goto out; err = -ENOMEM; iobuf->locked = 1; iobuf->nr_pages = 0; - for (i = 0; i < nr_pages; i++) - { - struct page * page; + for (i = 0; i < nr_pages; i++) { + struct page *page; page = alloc_page(GFP_KERNEL); - if (!page) goto out; + if (!page) + goto out; iobuf->maplist[i] = page; LockPage(page); @@ -496,7 +504,7 @@ err = 0; -out: + out: return err; } @@ -516,13 +524,13 @@ { int err; unsigned long buckets, max_buckets, size; - struct list_head * hash; + struct list_head *hash; buckets = lv->lv_remap_end; max_buckets = calc_max_buckets(); buckets = min(buckets, max_buckets); - while (buckets & (buckets-1)) - buckets &= (buckets-1); + while (buckets & (buckets - 1)) + buckets &= (buckets - 1); size = buckets * sizeof(struct list_head); @@ -534,11 +542,11 @@ goto out; lv->lv_snapshot_hash_table_size = size; - lv->lv_snapshot_hash_mask = buckets-1; + lv->lv_snapshot_hash_mask = buckets - 1; while (buckets--) - INIT_LIST_HEAD(hash+buckets); + INIT_LIST_HEAD(hash + buckets); err = 0; -out: + out: return err; } @@ -548,33 +556,39 @@ /* allocate kiovec to do chunk io */ ret = alloc_kiovec(1, &lv_snap->lv_iobuf); - if (ret) goto out; + if (ret) + goto out; - max_sectors = KIO_MAX_SECTORS << (PAGE_SHIFT-9); + max_sectors = KIO_MAX_SECTORS << (PAGE_SHIFT - 9); - ret = lvm_snapshot_alloc_iobuf_pages(lv_snap->lv_iobuf, max_sectors); - if (ret) goto out_free_kiovec; + ret = + lvm_snapshot_alloc_iobuf_pages(lv_snap->lv_iobuf, max_sectors); + if (ret) + goto out_free_kiovec; /* allocate kiovec to do exception table io */ ret = alloc_kiovec(1, &lv_snap->lv_COW_table_iobuf); - if (ret) goto out_free_kiovec; + if (ret) + goto out_free_kiovec; ret = lvm_snapshot_alloc_iobuf_pages(lv_snap->lv_COW_table_iobuf, - PAGE_SIZE/SECTOR_SIZE); - if (ret) goto out_free_both_kiovecs; + PAGE_SIZE / SECTOR_SIZE); + if (ret) + goto out_free_both_kiovecs; ret = lvm_snapshot_alloc_hash_table(lv_snap); - if (ret) goto out_free_both_kiovecs; + if (ret) + goto out_free_both_kiovecs; -out: + out: return ret; -out_free_both_kiovecs: + out_free_both_kiovecs: unmap_kiobuf(lv_snap->lv_COW_table_iobuf); free_kiovec(1, &lv_snap->lv_COW_table_iobuf); lv_snap->lv_COW_table_iobuf = NULL; -out_free_kiovec: + out_free_kiovec: unmap_kiobuf(lv_snap->lv_iobuf); free_kiovec(1, &lv_snap->lv_iobuf); lv_snap->lv_iobuf = NULL; @@ -585,27 +599,23 @@ void lvm_snapshot_release(lv_t * lv) { - if (lv->lv_block_exception) - { + if (lv->lv_block_exception) { vfree(lv->lv_block_exception); lv->lv_block_exception = NULL; } - if (lv->lv_snapshot_hash_table) - { + if (lv->lv_snapshot_hash_table) { vfree(lv->lv_snapshot_hash_table); lv->lv_snapshot_hash_table = NULL; lv->lv_snapshot_hash_table_size = 0; } - if (lv->lv_iobuf) - { - kiobuf_wait_for_io(lv->lv_iobuf); + if (lv->lv_iobuf) { + kiobuf_wait_for_io(lv->lv_iobuf); unmap_kiobuf(lv->lv_iobuf); free_kiovec(1, &lv->lv_iobuf); lv->lv_iobuf = NULL; } - if (lv->lv_COW_table_iobuf) - { - kiobuf_wait_for_io(lv->lv_COW_table_iobuf); + if (lv->lv_COW_table_iobuf) { + kiobuf_wait_for_io(lv->lv_COW_table_iobuf); unmap_kiobuf(lv->lv_COW_table_iobuf); free_kiovec(1, &lv->lv_COW_table_iobuf); lv->lv_COW_table_iobuf = NULL; @@ -613,55 +623,67 @@ } -static int _write_COW_table_block(vg_t *vg, lv_t *lv_snap, - int idx, const char **reason) { +static int _write_COW_table_block(vg_t * vg, lv_t * lv_snap, + int idx, const char **reason) +{ int blksize_snap; int end_of_table; int idx_COW_table; uint pvn; ulong snap_pe_start, COW_table_sector_offset, - COW_entries_per_pe, COW_chunks_per_pe, COW_entries_per_block; + COW_entries_per_pe, COW_chunks_per_pe, COW_entries_per_block; ulong blocks[1]; kdev_t snap_phys_dev; lv_block_exception_t *be; struct kiobuf *COW_table_iobuf = lv_snap->lv_COW_table_iobuf; - lv_COW_table_disk_t * lv_COW_table = - ( lv_COW_table_disk_t *) page_address(lv_snap->lv_COW_table_iobuf->maplist[0]); + lv_COW_table_disk_t *lv_COW_table = + (lv_COW_table_disk_t *) page_address(lv_snap-> + lv_COW_table_iobuf-> + maplist[0]); COW_chunks_per_pe = LVM_GET_COW_TABLE_CHUNKS_PER_PE(vg, lv_snap); COW_entries_per_pe = LVM_GET_COW_TABLE_ENTRIES_PER_PE(vg, lv_snap); /* get physical addresse of destination chunk */ snap_phys_dev = lv_snap->lv_block_exception[idx].rdev_new; - snap_pe_start = lv_snap->lv_block_exception[idx - (idx % COW_entries_per_pe)].rsector_new - lv_snap->lv_chunk_size; + snap_pe_start = + lv_snap->lv_block_exception[idx - + (idx % + COW_entries_per_pe)].rsector_new - + lv_snap->lv_chunk_size; blksize_snap = lvm_sectsize(snap_phys_dev); - COW_entries_per_block = blksize_snap / sizeof(lv_COW_table_disk_t); - idx_COW_table = idx % COW_entries_per_pe % COW_entries_per_block; + COW_entries_per_block = blksize_snap / sizeof(lv_COW_table_disk_t); + idx_COW_table = idx % COW_entries_per_pe % COW_entries_per_block; - if ( idx_COW_table == 0) memset(lv_COW_table, 0, blksize_snap); + if (idx_COW_table == 0) + memset(lv_COW_table, 0, blksize_snap); /* sector offset into the on disk COW table */ - COW_table_sector_offset = (idx % COW_entries_per_pe) / (SECTOR_SIZE / sizeof(lv_COW_table_disk_t)); - - /* COW table block to write next */ - blocks[0] = (snap_pe_start + COW_table_sector_offset) >> (blksize_snap >> 10); + COW_table_sector_offset = + (idx % COW_entries_per_pe) / (SECTOR_SIZE / + sizeof(lv_COW_table_disk_t)); + + /* COW table block to write next */ + blocks[0] = + (snap_pe_start + + COW_table_sector_offset) >> (blksize_snap >> 10); /* store new COW_table entry */ be = lv_snap->lv_block_exception + idx; - if(_pv_get_number(vg, be->rdev_org, &pvn)) + if (_pv_get_number(vg, be->rdev_org, &pvn)) goto fail_pv_get_number; lv_COW_table[idx_COW_table].pv_org_number = cpu_to_le64(pvn); lv_COW_table[idx_COW_table].pv_org_rsector = - cpu_to_le64(be->rsector_org); - if(_pv_get_number(vg, snap_phys_dev, &pvn)) + cpu_to_le64(be->rsector_org); + if (_pv_get_number(vg, snap_phys_dev, &pvn)) goto fail_pv_get_number; lv_COW_table[idx_COW_table].pv_snap_number = cpu_to_le64(pvn); lv_COW_table[idx_COW_table].pv_snap_rsector = - cpu_to_le64(be->rsector_new); + cpu_to_le64(be->rsector_new); COW_table_iobuf->length = blksize_snap; /* COW_table_iobuf->nr_pages = 1; */ @@ -672,36 +694,42 @@ /* initialization of next COW exception table block with zeroes */ end_of_table = idx % COW_entries_per_pe == COW_entries_per_pe - 1; - if (idx_COW_table % COW_entries_per_block == COW_entries_per_block - 1 || end_of_table) - { + if (idx_COW_table % COW_entries_per_block == + COW_entries_per_block - 1 || end_of_table) { /* don't go beyond the end */ - if (idx + 1 >= lv_snap->lv_remap_end) goto out; + if (idx + 1 >= lv_snap->lv_remap_end) + goto out; memset(lv_COW_table, 0, blksize_snap); - if (end_of_table) - { + if (end_of_table) { idx++; - snap_phys_dev = lv_snap->lv_block_exception[idx].rdev_new; - snap_pe_start = lv_snap->lv_block_exception[idx - (idx % COW_entries_per_pe)].rsector_new - lv_snap->lv_chunk_size; + snap_phys_dev = + lv_snap->lv_block_exception[idx].rdev_new; + snap_pe_start = + lv_snap->lv_block_exception[idx - + (idx % + COW_entries_per_pe)]. + rsector_new - lv_snap->lv_chunk_size; blksize_snap = lvm_sectsize(snap_phys_dev); blocks[0] = snap_pe_start >> (blksize_snap >> 10); - } else blocks[0]++; + } else + blocks[0]++; if (__brw_kiovec(WRITE, 1, &COW_table_iobuf, snap_phys_dev, - blocks, blksize_snap, lv_snap) != - blksize_snap) + blocks, blksize_snap, lv_snap) != + blksize_snap) goto fail_raw_write; } -out: + out: return 0; -fail_raw_write: + fail_raw_write: *reason = "write error"; return 1; -fail_pv_get_number: + fail_pv_get_number: *reason = "_pv_get_number failed"; return 1; } @@ -717,10 +745,12 @@ * to activate the snapshot and prevent this from happening. */ -static void _disable_snapshot(vg_t *vg, lv_t *lv) { +static void _disable_snapshot(vg_t * vg, lv_t * lv) +{ const char *err; - lv->lv_block_exception[0].rsector_org = LVM_SNAPSHOT_DROPPED_SECTOR; - if(_write_COW_table_block(vg, lv, 0, &err) < 0) { + lv->lv_block_exception[0].rsector_org = + LVM_SNAPSHOT_DROPPED_SECTOR; + if (_write_COW_table_block(vg, lv, 0, &err) < 0) { printk(KERN_ERR "%s -- couldn't disable snapshot: %s\n", lvm_name, err); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/md/lvm.c linux-2.4.23-pre8/drivers/md/lvm.c --- linux-2.4.22/drivers/md/lvm.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/md/lvm.c 2003-10-22 22:49:05.000000000 +0000 @@ -8,7 +8,8 @@ * January-March,May,July,September,October 1999 * January,February,July,September-November 2000 * January-May,June,October 2001 - * May-July 2002 + * May-August 2002 + * February 2003 * * * LVM driver is free software; you can redistribute it and/or modify @@ -220,6 +221,12 @@ * - support HDIO_GETGEO_BIG ioctl * 05/07/2002 - fixed OBO error on vg array access [benh@kernel.crashing.org] * 22/07/2002 - streamlined blk_ioctl() call + * 14/08/2002 - stored fs handle in lvm_do_lv_rename + * [kaoru@bsd.tnes.nec.co.jp] + * 06/02/2003 - fix persistent snapshot extend/reduce bug in + * lvm_do_lv_extend_reduce() [dalestephenson@mac.com] + * 04/03/2003 - snapshot extend/reduce memory leak + * - VG PE counter wrong [dalestephenson@mac.com] * */ @@ -283,13 +290,14 @@ /* * External function prototypes */ -static int lvm_make_request_fn(request_queue_t*, int, struct buffer_head*); +static int lvm_make_request_fn(request_queue_t *, int, + struct buffer_head *); static int lvm_blk_ioctl(struct inode *, struct file *, uint, ulong); static int lvm_blk_open(struct inode *, struct file *); static int lvm_blk_close(struct inode *, struct file *); -static int lvm_get_snapshot_use_rate(lv_t *lv_ptr, void *arg); +static int lvm_get_snapshot_use_rate(lv_t * lv_ptr, void *arg); static int lvm_user_bmap(struct inode *, struct lv_bmap *); static int lvm_chr_open(struct inode *, struct file *); @@ -319,13 +327,13 @@ static int lvm_do_lv_extend_reduce(int, char *, lv_t *); static int lvm_do_lv_remove(int, char *, int); static int lvm_do_lv_rename(vg_t *, lv_req_t *, lv_t *); -static int lvm_do_lv_status_byname(vg_t *r, void *); +static int lvm_do_lv_status_byname(vg_t * r, void *); static int lvm_do_lv_status_byindex(vg_t *, void *); static int lvm_do_lv_status_bydev(vg_t *, void *); -static int lvm_do_pe_lock_unlock(vg_t *r, void *); +static int lvm_do_pe_lock_unlock(vg_t * r, void *); -static int lvm_do_pv_change(vg_t*, void*); +static int lvm_do_pv_change(vg_t *, void *); static int lvm_do_pv_status(vg_t *, void *); static int lvm_do_pv_flush(void *); @@ -335,15 +343,15 @@ static int lvm_do_vg_rename(vg_t *, void *); static int lvm_do_vg_remove(int); static void lvm_geninit(struct gendisk *); -static void __update_hardsectsize(lv_t *lv); +static void __update_hardsectsize(lv_t * lv); static void _queue_io(struct buffer_head *bh, int rw); static struct buffer_head *_dequeue_io(void); static void _flush_io(struct buffer_head *bh); -static int _open_pv(pv_t *pv); -static void _close_pv(pv_t *pv); +static int _open_pv(pv_t * pv); +static void _close_pv(pv_t * pv); static unsigned long _sectors_to_k(unsigned long sect); @@ -354,7 +362,8 @@ /* variables */ -char *lvm_version = "LVM version "LVM_RELEASE_NAME"("LVM_RELEASE_DATE")"; +char *lvm_version = + "LVM version " LVM_RELEASE_NAME "(" LVM_RELEASE_DATE ")"; ushort lvm_iop_version = LVM_DRIVER_IOP_VERSION; int loadtime = 0; const char *const lvm_name = LVM_NAME; @@ -397,19 +406,18 @@ struct file_operations lvm_chr_fops = { - owner: THIS_MODULE, - open: lvm_chr_open, - release: lvm_chr_close, - ioctl: lvm_chr_ioctl, + owner:THIS_MODULE, + open:lvm_chr_open, + release:lvm_chr_close, + ioctl:lvm_chr_ioctl, }; /* block device operations structure needed for 2.3.38? and above */ -struct block_device_operations lvm_blk_dops = -{ - owner: THIS_MODULE, - open: lvm_blk_open, - release: lvm_blk_close, - ioctl: lvm_blk_ioctl, +struct block_device_operations lvm_blk_dops = { + .owner = THIS_MODULE, + .open = lvm_blk_open, + .release = lvm_blk_close, + .ioctl = lvm_blk_ioctl, }; @@ -419,15 +427,14 @@ static int lvm_hardsectsizes[MAX_LV]; static int lvm_size[MAX_LV]; -static struct gendisk lvm_gendisk = -{ - major: MAJOR_NR, - major_name: LVM_NAME, - minor_shift: 0, - max_p: 1, - part: lvm_hd_struct, - sizes: lvm_size, - nr_real: MAX_LV, +static struct gendisk lvm_gendisk = { + .major = MAJOR_NR, + .major_name = LVM_NAME, + .minor_shift = 0, + .max_p = 1, + .part = lvm_hd_struct, + .sizes = lvm_size, + .nr_real = MAX_LV, }; @@ -464,7 +471,8 @@ lvm_hd_name_ptr = lvm_hd_name; #endif - blk_queue_make_request(BLK_DEFAULT_QUEUE(MAJOR_NR), lvm_make_request_fn); + blk_queue_make_request(BLK_DEFAULT_QUEUE(MAJOR_NR), + lvm_make_request_fn); /* initialise the pe lock */ @@ -482,7 +490,7 @@ #endif return 0; -} /* lvm_init() */ +} /* lvm_init() */ /* * cleanup... @@ -515,11 +523,12 @@ lvm_fin_fs(); #ifdef MODULE - printk(KERN_INFO "%s -- Module successfully deactivated\n", lvm_name); + printk(KERN_INFO "%s -- Module successfully deactivated\n", + lvm_name); #endif return; -} /* lvm_cleanup() */ +} /* lvm_cleanup() */ /* * support function to initialize lvm variables @@ -549,7 +558,7 @@ } return; -} /* lvm_init_vars() */ +} /* lvm_init_vars() */ /******************************************************************** @@ -572,13 +581,15 @@ minor, VG_CHR(minor), MODE_TO_STR(file->f_mode), lock); /* super user validation */ - if (!capable(CAP_SYS_ADMIN)) return -EACCES; + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; /* Group special file open */ - if (VG_CHR(minor) > MAX_VG) return -ENXIO; + if (VG_CHR(minor) > MAX_VG) + return -ENXIO; spin_lock(&lvm_lock); - if(lock == current->pid) + if (lock == current->pid) _lock_open_count++; spin_unlock(&lvm_lock); @@ -587,7 +598,7 @@ MOD_INC_USE_COUNT; return 0; -} /* lvm_chr_open() */ +} /* lvm_chr_open() */ /* @@ -604,16 +615,19 @@ uint extendable, l, v; void *arg = (void *) a; lv_t lv; - vg_t* vg_ptr = vg[VG_CHR(minor)]; + vg_t *vg_ptr = vg[VG_CHR(minor)]; /* otherwise cc will complain about unused variables */ (void) lvm_lock; - P_IOCTL("chr MINOR: %d command: 0x%X arg: %p VG#: %d mode: %s%s\n", - minor, command, arg, VG_CHR(minor), MODE_TO_STR(file->f_mode)); + P_IOCTL + ("chr MINOR: %d command: 0x%X arg: %p VG#: %d mode: %s%s\n", + minor, command, arg, VG_CHR(minor), + MODE_TO_STR(file->f_mode)); #ifdef LVM_TOTAL_RESET - if (lvm_reset_spindown > 0) return -EACCES; + if (lvm_reset_spindown > 0) + return -EACCES; #endif /* Main command switch */ @@ -625,7 +639,8 @@ case LVM_GET_IOP_VERSION: /* check lvm version to ensure driver/tools+lib interoperability */ - if (copy_to_user(arg, &lvm_iop_version, sizeof(ushort)) != 0) + if (copy_to_user(arg, &lvm_iop_version, sizeof(ushort)) != + 0) return -EFAULT; return 0; @@ -634,7 +649,8 @@ /* lock reset function */ lvm_reset_spindown = 1; for (v = 0; v < ABS_MAX_VG; v++) { - if (vg[v] != NULL) lvm_do_vg_remove(v); + if (vg[v] != NULL) + lvm_do_vg_remove(v); } #ifdef MODULE @@ -642,28 +658,28 @@ MOD_INC_USE_COUNT; while (GET_USE_COUNT(&__this_module) > 1) MOD_DEC_USE_COUNT; -#endif /* MODULE */ +#endif /* MODULE */ lock = 0; /* release lock */ wake_up_interruptible(&lvm_wait); return 0; -#endif /* LVM_TOTAL_RESET */ +#endif /* LVM_TOTAL_RESET */ case LE_REMAP: /* remap a logical extent (after moving the physical extent) */ - return lvm_do_le_remap(vg_ptr,arg); + return lvm_do_le_remap(vg_ptr, arg); case PE_LOCK_UNLOCK: /* lock/unlock i/o to a physical extent to move it to another physical volume (move's done in user space's pvmove) */ - return lvm_do_pe_lock_unlock(vg_ptr,arg); + return lvm_do_pe_lock_unlock(vg_ptr, arg); case VG_CREATE_OLD: /* create a VGDA */ return lvm_do_vg_create(arg, minor); case VG_CREATE: - /* create a VGDA, assume VG number is filled in */ + /* create a VGDA, assume VG number is filled in */ return lvm_do_vg_create(arg, -1); case VG_EXTEND: @@ -685,8 +701,10 @@ case VG_SET_EXTENDABLE: /* set/clear extendability flag of volume group */ - if (vg_ptr == NULL) return -ENXIO; - if (copy_from_user(&extendable, arg, sizeof(extendable)) != 0) + if (vg_ptr == NULL) + return -ENXIO; + if (copy_from_user(&extendable, arg, sizeof(extendable)) != + 0) return -EFAULT; if (extendable == VG_EXTENDABLE || @@ -695,13 +713,15 @@ vg_ptr->vg_status |= VG_EXTENDABLE; else vg_ptr->vg_status &= ~VG_EXTENDABLE; - } else return -EINVAL; + } else + return -EINVAL; return 0; case VG_STATUS: /* get volume group data (only the vg_t struct) */ - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_to_user(arg, vg_ptr, sizeof(vg_t)) != 0) return -EFAULT; return 0; @@ -734,21 +754,26 @@ case LV_REMOVE: case LV_RENAME: /* create, extend, reduce, remove or rename a logical volume */ - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(&lv_req, arg, sizeof(lv_req)) != 0) return -EFAULT; if (command != LV_REMOVE) { - if (copy_from_user(&lv, lv_req.lv, sizeof(lv_t)) != 0) + if (copy_from_user(&lv, lv_req.lv, sizeof(lv_t)) != + 0) return -EFAULT; } switch (command) { case LV_CREATE: - return lvm_do_lv_create(minor, lv_req.lv_name, &lv); + return lvm_do_lv_create(minor, lv_req.lv_name, + &lv); case LV_EXTEND: case LV_REDUCE: - return lvm_do_lv_extend_reduce(minor, lv_req.lv_name, &lv); + return lvm_do_lv_extend_reduce(minor, + lv_req.lv_name, + &lv); case LV_REMOVE: return lvm_do_lv_remove(minor, lv_req.lv_name, -1); @@ -776,12 +801,12 @@ case PV_CHANGE: /* change a physical volume */ - return lvm_do_pv_change(vg_ptr,arg); + return lvm_do_pv_change(vg_ptr, arg); case PV_STATUS: /* get physical volume data (pv_t structure only) */ - return lvm_do_pv_status(vg_ptr,arg); + return lvm_do_pv_status(vg_ptr, arg); case PV_FLUSH: @@ -797,7 +822,7 @@ } return 0; -} /* lvm_chr_ioctl */ +} /* lvm_chr_ioctl */ /* @@ -815,12 +840,14 @@ } #endif - if (lvm_chr_open_count > 0) lvm_chr_open_count--; + if (lvm_chr_open_count > 0) + lvm_chr_open_count--; spin_lock(&lvm_lock); - if(lock == current->pid) { - if(!_lock_open_count) { - P_DEV("chr_close: unlocking LVM for pid %d\n", lock); + if (lock == current->pid) { + if (!_lock_open_count) { + P_DEV("chr_close: unlocking LVM for pid %d\n", + lock); lock = 0; wake_up_interruptible(&lvm_wait); } else @@ -831,7 +858,7 @@ MOD_DEC_USE_COUNT; return 0; -} /* lvm_chr_close() */ +} /* lvm_chr_close() */ @@ -851,7 +878,8 @@ vg_t *vg_ptr = vg[VG_BLK(minor)]; P_DEV("blk_open MINOR: %d VG#: %d LV#: %d mode: %s%s\n", - minor, VG_BLK(minor), LV_BLK(minor), MODE_TO_STR(file->f_mode)); + minor, VG_BLK(minor), LV_BLK(minor), + MODE_TO_STR(file->f_mode)); #ifdef LVM_TOTAL_RESET if (lvm_reset_spindown > 0) @@ -861,26 +889,27 @@ if (vg_ptr != NULL && (vg_ptr->vg_status & VG_ACTIVE) && (lv_ptr = vg_ptr->lv[LV_BLK(minor)]) != NULL && - LV_BLK(minor) >= 0 && - LV_BLK(minor) < vg_ptr->lv_max) { + LV_BLK(minor) >= 0 && LV_BLK(minor) < vg_ptr->lv_max) { /* Check parallel LV spindown (LV remove) */ - if (lv_ptr->lv_status & LV_SPINDOWN) return -EPERM; + if (lv_ptr->lv_status & LV_SPINDOWN) + return -EPERM; /* Check inactive LV and open for read/write */ /* We need to be able to "read" an inactive LV to re-activate it again */ if ((file->f_mode & FMODE_WRITE) && (!(lv_ptr->lv_status & LV_ACTIVE))) - return -EPERM; + return -EPERM; if (!(lv_ptr->lv_access & LV_WRITE) && (file->f_mode & FMODE_WRITE)) return -EACCES; - /* be sure to increment VG counter */ - if (lv_ptr->lv_open == 0) vg_ptr->lv_open++; + /* be sure to increment VG counter */ + if (lv_ptr->lv_open == 0) + vg_ptr->lv_open++; lv_ptr->lv_open++; MOD_INC_USE_COUNT; @@ -890,10 +919,10 @@ return 0; } return -ENXIO; -} /* lvm_blk_open() */ +} /* lvm_blk_open() */ /* Deliver "hard disk geometry" */ -static int _hdio_getgeo(ulong a, lv_t *lv_ptr, int what) +static int _hdio_getgeo(ulong a, lv_t * lv_ptr, int what) { int ret = 0; uchar heads = 128; @@ -901,34 +930,34 @@ ulong start = 0; uint cylinders; - while ( heads * sectors > lv_ptr->lv_size) { + while (heads * sectors > lv_ptr->lv_size) { heads >>= 1; sectors >>= 1; } cylinders = lv_ptr->lv_size / heads / sectors; switch (what) { - case 0: + case 0: { struct hd_geometry *hd = (struct hd_geometry *) a; if (put_user(heads, &hd->heads) || - put_user(sectors, &hd->sectors) || - put_user((ushort) cylinders, &hd->cylinders) || + put_user(sectors, &hd->sectors) || + put_user((ushort) cylinders, &hd->cylinders) || put_user(start, &hd->start)) return -EFAULT; break; } #ifdef HDIO_GETGEO_BIG - case 1: + case 1: { struct hd_big_geometry *hd = - (struct hd_big_geometry *) a; + (struct hd_big_geometry *) a; if (put_user(heads, &hd->heads) || - put_user(sectors, &hd->sectors) || - put_user(cylinders, &hd->cylinders) || + put_user(sectors, &hd->sectors) || + put_user(cylinders, &hd->cylinders) || put_user(start, &hd->start)) return -EFAULT; break; @@ -960,91 +989,92 @@ LV_BLK(minor), MODE_TO_STR(file->f_mode)); switch (cmd) { - case BLKRASET: - /* set read ahead for block device */ - ret = blk_ioctl(dev, cmd, a); - if (ret) - return ret; - lv_ptr->lv_read_ahead = (long) a; - LVM_CORRECT_READ_AHEAD(lv_ptr->lv_read_ahead); - break; - - case HDIO_GETGEO: + case BLKRASET: + /* set read ahead for block device */ + ret = blk_ioctl(dev, cmd, a); + if (ret) + return ret; + lv_ptr->lv_read_ahead = (long) a; + LVM_CORRECT_READ_AHEAD(lv_ptr->lv_read_ahead); + break; + + case HDIO_GETGEO: #ifdef HDIO_GETGEO_BIG - case HDIO_GETGEO_BIG: + case HDIO_GETGEO_BIG: #endif - /* get disk geometry */ - P_IOCTL("%s -- lvm_blk_ioctl -- HDIO_GETGEO\n", - lvm_name); - if (!a) - return -EINVAL; - - switch (cmd) { - case HDIO_GETGEO: - return _hdio_getgeo(a, lv_ptr, 0); + /* get disk geometry */ + P_IOCTL("%s -- lvm_blk_ioctl -- HDIO_GETGEO\n", lvm_name); + if (!a) + return -EINVAL; + + switch (cmd) { + case HDIO_GETGEO: + return _hdio_getgeo(a, lv_ptr, 0); #ifdef HDIO_GETGEO_BIG - case HDIO_GETGEO_BIG: - return _hdio_getgeo(a, lv_ptr, 1); + case HDIO_GETGEO_BIG: + return _hdio_getgeo(a, lv_ptr, 1); #endif - } - - case LV_BMAP: - /* turn logical block into (dev_t, block). non privileged. */ - /* don't bmap a snapshot, since the mapping can change */ - if (lv_ptr->lv_access & LV_SNAPSHOT) - return -EPERM; - - return lvm_user_bmap(inode, (struct lv_bmap *) arg); - - case LV_SET_ACCESS: - /* set access flags of a logical volume */ - if (!capable(CAP_SYS_ADMIN)) return -EACCES; - - down_write(&lv_ptr->lv_lock); - lv_ptr->lv_access = (ulong) arg; - up_write(&lv_ptr->lv_lock); - - if ( lv_ptr->lv_access & LV_WRITE) - set_device_ro(lv_ptr->lv_dev, 0); - else - set_device_ro(lv_ptr->lv_dev, 1); - break; - - - case LV_SET_ALLOCATION: - /* set allocation flags of a logical volume */ - if (!capable(CAP_SYS_ADMIN)) return -EACCES; - down_write(&lv_ptr->lv_lock); - lv_ptr->lv_allocation = (ulong) arg; - up_write(&lv_ptr->lv_lock); - break; - - case LV_SET_STATUS: - /* set status flags of a logical volume */ - if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if (!((ulong) arg & LV_ACTIVE) && lv_ptr->lv_open > 1) - return -EPERM; - down_write(&lv_ptr->lv_lock); - lv_ptr->lv_status = (ulong) arg; - up_write(&lv_ptr->lv_lock); - break; - - case LV_SNAPSHOT_USE_RATE: - return lvm_get_snapshot_use_rate(lv_ptr, arg); - - default: - /* Handle rest here */ - ret = blk_ioctl(dev, cmd, a); - if (ret) - printk(KERN_WARNING - "%s -- lvm_blk_ioctl: unknown " - "cmd 0x%x\n", - lvm_name, cmd); - return ret; + } + + case LV_BMAP: + /* turn logical block into (dev_t, block). non privileged. */ + /* don't bmap a snapshot, since the mapping can change */ + if (lv_ptr->lv_access & LV_SNAPSHOT) + return -EPERM; + + return lvm_user_bmap(inode, (struct lv_bmap *) arg); + + case LV_SET_ACCESS: + /* set access flags of a logical volume */ + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + down_write(&lv_ptr->lv_lock); + lv_ptr->lv_access = (ulong) arg; + up_write(&lv_ptr->lv_lock); + + if (lv_ptr->lv_access & LV_WRITE) + set_device_ro(lv_ptr->lv_dev, 0); + else + set_device_ro(lv_ptr->lv_dev, 1); + break; + + + case LV_SET_ALLOCATION: + /* set allocation flags of a logical volume */ + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + down_write(&lv_ptr->lv_lock); + lv_ptr->lv_allocation = (ulong) arg; + up_write(&lv_ptr->lv_lock); + break; + + case LV_SET_STATUS: + /* set status flags of a logical volume */ + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + if (!((ulong) arg & LV_ACTIVE) && lv_ptr->lv_open > 1) + return -EPERM; + down_write(&lv_ptr->lv_lock); + lv_ptr->lv_status = (ulong) arg; + up_write(&lv_ptr->lv_lock); + break; + + case LV_SNAPSHOT_USE_RATE: + return lvm_get_snapshot_use_rate(lv_ptr, arg); + + default: + /* Handle rest here */ + ret = blk_ioctl(dev, cmd, a); + if (ret) + printk(KERN_WARNING + "%s -- lvm_blk_ioctl: unknown " + "cmd 0x%x\n", lvm_name, cmd); + return ret; } return 0; -} /* lvm_blk_ioctl() */ +} /* lvm_blk_ioctl() */ /* @@ -1059,15 +1089,16 @@ P_DEV("blk_close MINOR: %d VG#: %d LV#: %d\n", minor, VG_BLK(minor), LV_BLK(minor)); - if (lv_ptr->lv_open == 1) vg_ptr->lv_open--; + if (lv_ptr->lv_open == 1) + vg_ptr->lv_open--; lv_ptr->lv_open--; MOD_DEC_USE_COUNT; return 0; -} /* lvm_blk_close() */ +} /* lvm_blk_close() */ -static int lvm_get_snapshot_use_rate(lv_t *lv, void *arg) +static int lvm_get_snapshot_use_rate(lv_t * lv, void *arg) { lv_snapshot_use_rate_req_t lv_rate_req; @@ -1122,20 +1153,20 @@ if (get_user(block, &user_result->lv_block)) return -EFAULT; - memset(&bh,0,sizeof bh); + memset(&bh, 0, sizeof bh); bh.b_blocknr = block; bh.b_dev = bh.b_rdev = inode->i_rdev; bh.b_size = lvm_get_blksize(bh.b_dev); bh.b_rsector = block * (bh.b_size >> 9); bh.b_end_io = NULL; - if ((err = lvm_map(&bh, READ)) < 0) { + if ((err = lvm_map(&bh, READ)) < 0) { printk("lvm map failed: %d\n", err); return -EINVAL; } return put_user(kdev_t_to_nr(bh.b_rdev), &user_result->lv_dev) || - put_user(bh.b_rsector/(bh.b_size>>9), &user_result->lv_block) ? - -EFAULT : 0; + put_user(bh.b_rsector / (bh.b_size >> 9), + &user_result->lv_block) ? -EFAULT : 0; } @@ -1144,7 +1175,8 @@ * (see init_module/lvm_init) */ static void __remap_snapshot(kdev_t rdev, ulong rsector, - ulong pe_start, lv_t *lv, vg_t *vg) { + ulong pe_start, lv_t * lv, vg_t * vg) +{ /* copy a chunk from the origin to a snapshot device */ down_write(&lv->lv_lock); @@ -1159,7 +1191,8 @@ } static inline void _remap_snapshot(kdev_t rdev, ulong rsector, - ulong pe_start, lv_t *lv, vg_t *vg) { + ulong pe_start, lv_t * lv, vg_t * vg) +{ int r; /* check to see if this chunk is already in the snapshot */ @@ -1176,7 +1209,8 @@ /* * extents destined for a pe that is on the move should be deferred */ -static inline int _should_defer(kdev_t pv, ulong sector, uint32_t pe_size) { +static inline int _should_defer(kdev_t pv, ulong sector, uint32_t pe_size) +{ return ((pe_lock_req.lock == LOCK_PE) && (pv == pe_lock_req.data.pv_dev) && (sector >= pe_lock_req.data.pv_offset) && @@ -1223,34 +1257,32 @@ goto bad; } - if ((rw == WRITE || rw == WRITEA) && - !(lv->lv_access & LV_WRITE)) { + if ((rw == WRITE || rw == WRITEA) && !(lv->lv_access & LV_WRITE)) { printk(KERN_CRIT "%s - lvm_map: ll_rw_blk write for readonly LV %s\n", lvm_name, lv->lv_name); goto bad; } - P_MAP("%s - lvm_map minor: %d *rdev: %s *rsector: %lu size:%lu\n", - lvm_name, minor, - kdevname(bh->b_rdev), - rsector_org, size); + P_MAP + ("%s - lvm_map minor: %d *rdev: %s *rsector: %lu size:%lu\n", + lvm_name, minor, kdevname(bh->b_rdev), rsector_org, size); if (rsector_org + size > lv->lv_size) { printk(KERN_ALERT "%s - lvm_map access beyond end of device; *rsector: " - "%lu or size: %lu wrong for minor: %2d\n", - lvm_name, rsector_org, size, minor); + "%lu or size: %lu wrong for minor: %2d\n", + lvm_name, rsector_org, size, minor); goto bad; } - if (lv->lv_stripes < 2) { /* linear mapping */ + if (lv->lv_stripes < 2) { /* linear mapping */ /* get the index */ index = rsector_org / vg_this->pe_size; pe_start = lv->lv_current_pe[index].pe; rsector_map = lv->lv_current_pe[index].pe + - (rsector_org % vg_this->pe_size); + (rsector_org % vg_this->pe_size); rdev_map = lv->lv_current_pe[index].dev; P_MAP("lv_current_pe[%ld].pe: %d rdev: %s rsector:%ld\n", @@ -1263,22 +1295,23 @@ stripe_length = vg_this->pe_size * lv->lv_stripes; stripe_index = (rsector_org % stripe_length) / - lv->lv_stripesize; + lv->lv_stripesize; index = rsector_org / stripe_length + - (stripe_index % lv->lv_stripes) * - (lv->lv_allocated_le / lv->lv_stripes); + (stripe_index % lv->lv_stripes) * + (lv->lv_allocated_le / lv->lv_stripes); pe_start = lv->lv_current_pe[index].pe; rsector_map = lv->lv_current_pe[index].pe + - (rsector_org % stripe_length) - - (stripe_index % lv->lv_stripes) * lv->lv_stripesize - - stripe_index / lv->lv_stripes * - (lv->lv_stripes - 1) * lv->lv_stripesize; + (rsector_org % stripe_length) - + (stripe_index % lv->lv_stripes) * lv->lv_stripesize - + stripe_index / lv->lv_stripes * + (lv->lv_stripes - 1) * lv->lv_stripesize; rdev_map = lv->lv_current_pe[index].dev; P_MAP("lv_current_pe[%ld].pe: %d rdev: %s rsector:%ld\n" "stripe_length: %ld stripe_index: %ld\n", - index, lv->lv_current_pe[index].pe, kdevname(rdev_map), - rsector_map, stripe_length, stripe_index); + index, lv->lv_current_pe[index].pe, + kdevname(rdev_map), rsector_map, stripe_length, + stripe_index); } /* @@ -1287,8 +1320,8 @@ * we need to queue this request, because this is in the fast path. */ if (rw == WRITE || rw == WRITEA) { - if(_defer_extent(bh, rw, rdev_map, - rsector_map, vg_this->pe_size)) { + if (_defer_extent(bh, rw, rdev_map, + rsector_map, vg_this->pe_size)) { up_read(&lv->lv_lock); return 0; @@ -1299,15 +1332,15 @@ lv->lv_current_pe[index].reads++; /* statistic */ /* snapshot volume exception handling on physical device address base */ - if (!(lv->lv_access & (LV_SNAPSHOT|LV_SNAPSHOT_ORG))) + if (!(lv->lv_access & (LV_SNAPSHOT | LV_SNAPSHOT_ORG))) goto out; - if (lv->lv_access & LV_SNAPSHOT) { /* remap snapshot */ + if (lv->lv_access & LV_SNAPSHOT) { /* remap snapshot */ if (lvm_snapshot_remap_block(&rdev_map, &rsector_map, pe_start, lv) < 0) goto bad; - } else if (rw == WRITE || rw == WRITEA) { /* snapshot origin */ + } else if (rw == WRITE || rw == WRITEA) { /* snapshot origin */ lv_t *snap; /* start with first snapshot and loop through all of @@ -1321,22 +1354,22 @@ /* Serializes the COW with the accesses to the snapshot device */ _remap_snapshot(rdev_map, rsector_map, - pe_start, snap, vg_this); + pe_start, snap, vg_this); } } - out: + out: bh->b_rdev = rdev_map; bh->b_rsector = rsector_map; up_read(&lv->lv_lock); return 1; - bad: + bad: if (bh->b_end_io) - buffer_IO_error(bh); + buffer_IO_error(bh); up_read(&lv->lv_lock); return -1; -} /* lvm_map() */ +} /* lvm_map() */ /* @@ -1368,9 +1401,8 @@ /* * make request function */ -static int lvm_make_request_fn(request_queue_t *q, - int rw, - struct buffer_head *bh) +static int lvm_make_request_fn(request_queue_t * q, + int rw, struct buffer_head *bh) { return (lvm_map(bh, rw) <= 0) ? 0 : 1; } @@ -1386,7 +1418,7 @@ */ static int lvm_do_lock_lvm(void) { -lock_try_again: + lock_try_again: spin_lock(&lvm_lock); if (lock != 0 && lock != current->pid) { P_DEV("lvm_do_lock_lvm: locked by pid %d ...\n", lock); @@ -1404,19 +1436,20 @@ P_DEV("lvm_do_lock_lvm: locking LVM for pid %d\n", lock); spin_unlock(&lvm_lock); return 0; -} /* lvm_do_lock_lvm */ +} /* lvm_do_lock_lvm */ /* * character device support function lock/unlock physical extend */ -static int lvm_do_pe_lock_unlock(vg_t *vg_ptr, void *arg) +static int lvm_do_pe_lock_unlock(vg_t * vg_ptr, void *arg) { pe_lock_req_t new_lock; struct buffer_head *bh; uint p; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(&new_lock, arg, sizeof(new_lock)) != 0) return -EFAULT; @@ -1427,7 +1460,8 @@ new_lock.data.pv_dev == vg_ptr->pv[p]->pv_dev) break; } - if (p == vg_ptr->pv_max) return -ENXIO; + if (p == vg_ptr->pv_max) + return -ENXIO; /* * this sync releaves memory pressure to lessen the @@ -1478,12 +1512,13 @@ /* * character device support function logical extend remap */ -static int lvm_do_le_remap(vg_t *vg_ptr, void *arg) +static int lvm_do_le_remap(vg_t * vg_ptr, void *arg) { uint l, le; lv_t *lv_ptr; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(&le_remap_req, arg, sizeof(le_remap_req_t)) != 0) return -EFAULT; @@ -1515,7 +1550,7 @@ } } return -ENXIO; -} /* lvm_do_le_remap() */ +} /* lvm_do_le_remap() */ /* @@ -1529,7 +1564,7 @@ vg_t *vg_ptr; lv_t **snap_lv_ptr; - if ((vg_ptr = kmalloc(sizeof(vg_t),GFP_KERNEL)) == NULL) { + if ((vg_ptr = kmalloc(sizeof(vg_t), GFP_KERNEL)) == NULL) { printk(KERN_CRIT "%s -- VG_CREATE: kmalloc error VG at line %d\n", lvm_name, __LINE__); @@ -1537,8 +1572,9 @@ } /* get the volume group structure */ if (copy_from_user(vg_ptr, arg, sizeof(vg_t)) != 0) { - P_IOCTL("lvm_do_vg_create ERROR: copy VG ptr %p (%d bytes)\n", - arg, sizeof(vg_t)); + P_IOCTL + ("lvm_do_vg_create ERROR: copy VG ptr %p (%d bytes)\n", + arg, sizeof(vg_t)); kfree(vg_ptr); return -EFAULT; } @@ -1548,8 +1584,10 @@ minor = vg_ptr->vg_number; /* check limits */ - if (minor >= ABS_MAX_VG) + if (minor >= ABS_MAX_VG) { + kfree(vg_ptr); return -EFAULT; + } /* Validate it */ if (vg[VG_CHR(minor)] != NULL) { @@ -1572,7 +1610,7 @@ if (vg_ptr->lv_max > ABS_MAX_LV) { printk(KERN_WARNING - "%s -- Can't activate VG: ABS_MAX_LV too small for %u\n", + "%s -- Can't activate VG: ABS_MAX_LV too small for %u\n", lvm_name, vg_ptr->lv_max); kfree(vg_ptr); return -EPERM; @@ -1590,7 +1628,7 @@ /* user space address */ if ((pvp = vg_ptr->pv[p]) != NULL) { ret = lvm_do_pv_create(pvp, vg_ptr, p); - if ( ret != 0) { + if (ret != 0) { lvm_do_vg_remove(minor); return ret; } @@ -1598,7 +1636,7 @@ } size = vg_ptr->lv_max * sizeof(lv_t *); - if ((snap_lv_ptr = vmalloc ( size)) == NULL) { + if ((snap_lv_ptr = vmalloc(size)) == NULL) { printk(KERN_CRIT "%s -- VG_CREATE: vmalloc error snapshot LVs at line %d\n", lvm_name, __LINE__); @@ -1614,12 +1652,12 @@ /* user space address */ if ((lvp = vg_ptr->lv[l]) != NULL) { if (copy_from_user(&lv, lvp, sizeof(lv_t)) != 0) { - P_IOCTL("ERROR: copying LV ptr %p (%d bytes)\n", - lvp, sizeof(lv_t)); - lvm_do_vg_remove(minor); - return -EFAULT; + P_IOCTL + ("ERROR: copying LV ptr %p (%d bytes)\n", + lvp, sizeof(lv_t)); + goto copy_fault; } - if ( lv.lv_access & LV_SNAPSHOT) { + if (lv.lv_access & LV_SNAPSHOT) { snap_lv_ptr[ls] = lvp; vg_ptr->lv[l] = NULL; ls++; @@ -1628,8 +1666,7 @@ vg_ptr->lv[l] = NULL; /* only create original logical volumes for now */ if (lvm_do_lv_create(minor, lv.lv_name, &lv) != 0) { - lvm_do_vg_remove(minor); - return -EFAULT; + goto copy_fault; } } } @@ -1639,12 +1676,10 @@ for (l = 0; l < ls; l++) { lv_t *lvp = snap_lv_ptr[l]; if (copy_from_user(&lv, lvp, sizeof(lv_t)) != 0) { - lvm_do_vg_remove(minor); - return -EFAULT; + goto copy_fault; } if (lvm_do_lv_create(minor, lv.lv_name, &lv) != 0) { - lvm_do_vg_remove(minor); - return -EFAULT; + goto copy_fault; } } @@ -1659,24 +1694,30 @@ vg_ptr->vg_status |= VG_ACTIVE; return 0; -} /* lvm_do_vg_create() */ +copy_fault: + lvm_do_vg_remove(minor); + vfree(snap_lv_ptr); + return -EFAULT; +} /* lvm_do_vg_create() */ /* * character device support function VGDA extend */ -static int lvm_do_vg_extend(vg_t *vg_ptr, void *arg) +static int lvm_do_vg_extend(vg_t * vg_ptr, void *arg) { int ret = 0; uint p; pv_t *pv_ptr; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (vg_ptr->pv_cur < vg_ptr->pv_max) { for (p = 0; p < vg_ptr->pv_max; p++) { - if ( ( pv_ptr = vg_ptr->pv[p]) == NULL) { + if ((pv_ptr = vg_ptr->pv[p]) == NULL) { ret = lvm_do_pv_create(arg, vg_ptr, p); - if ( ret != 0) return ret; + if (ret != 0) + return ret; pv_ptr = vg_ptr->pv[p]; vg_ptr->pe_total += pv_ptr->pe_total; return 0; @@ -1684,26 +1725,28 @@ } } return -EPERM; -} /* lvm_do_vg_extend() */ +} /* lvm_do_vg_extend() */ /* * character device support function VGDA reduce */ -static int lvm_do_vg_reduce(vg_t *vg_ptr, void *arg) { +static int lvm_do_vg_reduce(vg_t * vg_ptr, void *arg) +{ uint p; pv_t *pv_ptr; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(pv_name, arg, sizeof(pv_name)) != 0) return -EFAULT; for (p = 0; p < vg_ptr->pv_max; p++) { pv_ptr = vg_ptr->pv[p]; if (pv_ptr != NULL && - strcmp(pv_ptr->pv_name, - pv_name) == 0) { - if (pv_ptr->lv_cur > 0) return -EPERM; + strcmp(pv_ptr->pv_name, pv_name) == 0) { + if (pv_ptr->lv_cur > 0) + return -EPERM; lvm_do_pv_remove(vg_ptr, p); /* Make PV pointer array contiguous */ for (; p < vg_ptr->pv_max - 1; p++) @@ -1713,55 +1756,56 @@ } } return -ENXIO; -} /* lvm_do_vg_reduce */ +} /* lvm_do_vg_reduce */ /* * character device support function VG rename */ -static int lvm_do_vg_rename(vg_t *vg_ptr, void *arg) +static int lvm_do_vg_rename(vg_t * vg_ptr, void *arg) { int l = 0, p = 0, len = 0; - char vg_name[NAME_LEN] = { 0,}; - char lv_name[NAME_LEN] = { 0,}; + char vg_name[NAME_LEN] = { 0, }; + char lv_name[NAME_LEN] = { 0, }; char *ptr = NULL; lv_t *lv_ptr = NULL; pv_t *pv_ptr = NULL; /* If the VG doesn't exist in the kernel then just exit */ - if (!vg_ptr) return 0; + if (!vg_ptr) + return 0; if (copy_from_user(vg_name, arg, sizeof(vg_name)) != 0) return -EFAULT; lvm_fs_remove_vg(vg_ptr); - strncpy ( vg_ptr->vg_name, vg_name, sizeof ( vg_name)-1); - for ( l = 0; l < vg_ptr->lv_max; l++) - { - if ((lv_ptr = vg_ptr->lv[l]) == NULL) continue; - memset (lv_ptr->vg_name, 0, sizeof (*vg_name)); - strncpy(lv_ptr->vg_name, vg_name, sizeof ( vg_name)); + strncpy(vg_ptr->vg_name, vg_name, sizeof(vg_name) - 1); + for (l = 0; l < vg_ptr->lv_max; l++) { + if ((lv_ptr = vg_ptr->lv[l]) == NULL) + continue; + memset(lv_ptr->vg_name, 0, sizeof(*vg_name)); + strncpy(lv_ptr->vg_name, vg_name, sizeof(vg_name)); ptr = strrchr(lv_ptr->lv_name, '/'); ptr = ptr ? ptr + 1 : lv_ptr->lv_name; - strncpy(lv_name, ptr, sizeof ( lv_name)); + strncpy(lv_name, ptr, sizeof(lv_name)); len = sizeof(LVM_DIR_PREFIX); strcpy(lv_ptr->lv_name, LVM_DIR_PREFIX); strncat(lv_ptr->lv_name, vg_name, NAME_LEN - len); - strcat (lv_ptr->lv_name, "/"); + strcat(lv_ptr->lv_name, "/"); len += strlen(vg_name) + 1; strncat(lv_ptr->lv_name, lv_name, NAME_LEN - len); } - for ( p = 0; p < vg_ptr->pv_max; p++) - { - if ( (pv_ptr = vg_ptr->pv[p]) == NULL) continue; + for (p = 0; p < vg_ptr->pv_max; p++) { + if ((pv_ptr = vg_ptr->pv[p]) == NULL) + continue; strncpy(pv_ptr->vg_name, vg_name, NAME_LEN); } lvm_fs_create_vg(vg_ptr); /* Need to add PV entries */ - for ( p = 0; p < vg_ptr->pv_act; p++) { + for (p = 0; p < vg_ptr->pv_act; p++) { pv_t *pv_ptr = vg_ptr->pv[p]; if (pv_ptr) @@ -1769,18 +1813,18 @@ } /* Need to add LV entries */ - for ( l = 0; l < vg_ptr->lv_max; l++) { + for (l = 0; l < vg_ptr->lv_max; l++) { lv_t *lv_ptr = vg_ptr->lv[l]; if (!lv_ptr) continue; lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].de = - lvm_fs_create_lv(vg_ptr, lv_ptr); + lvm_fs_create_lv(vg_ptr, lv_ptr); } return 0; -} /* lvm_do_vg_rename */ +} /* lvm_do_vg_rename */ /* @@ -1792,7 +1836,8 @@ vg_t *vg_ptr = vg[VG_CHR(minor)]; pv_t *pv_ptr; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; #ifdef LVM_TOTAL_RESET if (vg_ptr->lv_open > 0 && lvm_reset_spindown == 0) @@ -1843,20 +1888,21 @@ MOD_DEC_USE_COUNT; return 0; -} /* lvm_do_vg_remove() */ +} /* lvm_do_vg_remove() */ /* * character device support function physical volume create */ -static int lvm_do_pv_create(pv_t *pvp, vg_t *vg_ptr, ulong p) { +static int lvm_do_pv_create(pv_t * pvp, vg_t * vg_ptr, ulong p) +{ pv_t *pv; int err; if (!vg_ptr) return -ENXIO; - pv = kmalloc(sizeof(pv_t),GFP_KERNEL); + pv = kmalloc(sizeof(pv_t), GFP_KERNEL); if (pv == NULL) { printk(KERN_CRIT "%s -- PV_CREATE: kmalloc error PV at line %d\n", @@ -1867,8 +1913,9 @@ memset(pv, 0, sizeof(*pv)); if (copy_from_user(pv, pvp, sizeof(pv_t)) != 0) { - P_IOCTL("lvm_do_pv_create ERROR: copy PV ptr %p (%d bytes)\n", - pvp, sizeof(pv_t)); + P_IOCTL + ("lvm_do_pv_create ERROR: copy PV ptr %p (%d bytes)\n", + pvp, sizeof(pv_t)); kfree(pv); return -EFAULT; } @@ -1889,13 +1936,14 @@ vg_ptr->pv[p] = pv; return 0; -} /* lvm_do_pv_create() */ +} /* lvm_do_pv_create() */ /* * character device support function physical volume remove */ -static int lvm_do_pv_remove(vg_t *vg_ptr, ulong p) { +static int lvm_do_pv_remove(vg_t * vg_ptr, ulong p) +{ pv_t *pv = vg_ptr->pv[p]; lvm_fs_remove_pv(vg_ptr, pv); @@ -1913,7 +1961,7 @@ } -static void __update_hardsectsize(lv_t *lv) +static void __update_hardsectsize(lv_t * lv) { int max_hardsectsize = 0, hardsectsize = 0; int p; @@ -1925,9 +1973,10 @@ if (max_hardsectsize == 0) max_hardsectsize = hardsectsize; else if (hardsectsize != max_hardsectsize) { - P_DEV("%s PV[%d] (%s) sector size %d, not %d\n", - lv->lv_name, p, kdevname(pv->pv_dev), - hardsectsize, max_hardsectsize); + P_DEV + ("%s PV[%d] (%s) sector size %d, not %d\n", + lv->lv_name, p, kdevname(pv->pv_dev), + hardsectsize, max_hardsectsize); break; } } @@ -1937,12 +1986,14 @@ if (hardsectsize != max_hardsectsize) { int le; for (le = 0; le < lv->lv_allocated_le; le++) { - hardsectsize = lvm_sectsize(lv->lv_current_pe[le].dev); + hardsectsize = + lvm_sectsize(lv->lv_current_pe[le].dev); if (hardsectsize > max_hardsectsize) { - P_DEV("%s LE[%d] (%s) blocksize %d not %d\n", - lv->lv_name, le, - kdevname(lv->lv_current_pe[le].dev), - hardsectsize, max_hardsectsize); + P_DEV + ("%s LE[%d] (%s) blocksize %d not %d\n", + lv->lv_name, le, + kdevname(lv->lv_current_pe[le].dev), + hardsectsize, max_hardsectsize); max_hardsectsize = hardsectsize; } } @@ -1952,7 +2003,9 @@ (lv->lv_status & LV_ACTIVE)) { int e; for (e = 0; e < lv->lv_remap_end; e++) { - hardsectsize = lvm_sectsize(lv->lv_block_exception[e].rdev_new); + hardsectsize = + lvm_sectsize(lv->lv_block_exception[e]. + rdev_new); if (hardsectsize > max_hardsectsize) max_hardsectsize = hardsectsize; } @@ -1969,7 +2022,7 @@ /* * character device support function logical volume create */ -static int lvm_do_lv_create(int minor, char *lv_name, lv_t *lv) +static int lvm_do_lv_create(int minor, char *lv_name, lv_t * lv) { int e, ret, l, le, l_new, p, size, activate = 1; ulong lv_status_save; @@ -1997,14 +2050,18 @@ else { for (l = 0; l < vg_ptr->lv_max; l++) { if (vg_ptr->lv[l] == NULL) - if (l_new == -1) l_new = l; + if (l_new == -1) + l_new = l; } } - if (l_new == -1) return -EPERM; - else l = l_new; + if (l_new == -1) + return -EPERM; + else + l = l_new; - if ((lv_ptr = kmalloc(sizeof(lv_t),GFP_KERNEL)) == NULL) {; - printk(KERN_CRIT "%s -- LV_CREATE: kmalloc error LV at line %d\n", + if ((lv_ptr = kmalloc(sizeof(lv_t), GFP_KERNEL)) == NULL) {; + printk(KERN_CRIT + "%s -- LV_CREATE: kmalloc error LV at line %d\n", lvm_name, __LINE__); return -ENOMEM; } @@ -2036,8 +2093,7 @@ if ((lv_ptr->lv_current_pe = vmalloc(size)) == NULL) { printk(KERN_CRIT "%s -- LV_CREATE: vmalloc error LV_CURRENT_PE of %d Byte " - "at line %d\n", - lvm_name, size, __LINE__); + "at line %d\n", lvm_name, size, __LINE__); P_KFREE("%s -- kfree %d\n", lvm_name, __LINE__); kfree(lv_ptr); vg_ptr->lv[l] = NULL; @@ -2066,7 +2122,9 @@ lv_ptr->lv_snapshot_org = vg_ptr->lv[LV_BLK(lv_ptr->lv_snapshot_minor)]; if (lv_ptr->lv_snapshot_org != NULL) { - size = lv_ptr->lv_remap_end * sizeof(lv_block_exception_t); + size = + lv_ptr->lv_remap_end * + sizeof(lv_block_exception_t); if (!size) { printk(KERN_WARNING @@ -2076,29 +2134,32 @@ return -EINVAL; } - if ((lv_ptr->lv_block_exception = vmalloc(size)) == NULL) { + if ((lv_ptr->lv_block_exception = + vmalloc(size)) == NULL) { printk(KERN_CRIT "%s -- lvm_do_lv_create: vmalloc error LV_BLOCK_EXCEPTION " "of %d byte at line %d\n", lvm_name, size, __LINE__); - P_KFREE("%s -- kfree %d\n", lvm_name, - __LINE__); + P_KFREE("%s -- kfree %d\n", + lvm_name, __LINE__); kfree(lv_ptr); vg_ptr->lv[l] = NULL; return -ENOMEM; } - if (copy_from_user(lv_ptr->lv_block_exception, lvbe, size)) { + if (copy_from_user + (lv_ptr->lv_block_exception, lvbe, + size)) { vfree(lv_ptr->lv_block_exception); kfree(lv_ptr); vg_ptr->lv[l] = NULL; return -EFAULT; } - if(lv_ptr->lv_block_exception[0].rsector_org == - LVM_SNAPSHOT_DROPPED_SECTOR) - { + if (lv_ptr->lv_block_exception[0]. + rsector_org == + LVM_SNAPSHOT_DROPPED_SECTOR) { printk(KERN_WARNING - "%s -- lvm_do_lv_create: snapshot has been dropped and will not be activated\n", + "%s -- lvm_do_lv_create: snapshot has been dropped and will not be activated\n", lvm_name); activate = 0; } @@ -2112,36 +2173,54 @@ which can be the original logical volume */ lv_ptr = vg_ptr->lv[l]; /* now lv_ptr points to our new last snapshot logical volume */ - lv_ptr->lv_current_pe = lv_ptr->lv_snapshot_org->lv_current_pe; - lv_ptr->lv_allocated_snapshot_le = lv_ptr->lv_allocated_le; - lv_ptr->lv_allocated_le = lv_ptr->lv_snapshot_org->lv_allocated_le; - lv_ptr->lv_current_le = lv_ptr->lv_snapshot_org->lv_current_le; - lv_ptr->lv_size = lv_ptr->lv_snapshot_org->lv_size; - lv_ptr->lv_stripes = lv_ptr->lv_snapshot_org->lv_stripes; - lv_ptr->lv_stripesize = lv_ptr->lv_snapshot_org->lv_stripesize; + lv_ptr->lv_current_pe = + lv_ptr->lv_snapshot_org->lv_current_pe; + lv_ptr->lv_allocated_snapshot_le = + lv_ptr->lv_allocated_le; + lv_ptr->lv_allocated_le = + lv_ptr->lv_snapshot_org-> + lv_allocated_le; + lv_ptr->lv_current_le = + lv_ptr->lv_snapshot_org->lv_current_le; + lv_ptr->lv_size = + lv_ptr->lv_snapshot_org->lv_size; + lv_ptr->lv_stripes = + lv_ptr->lv_snapshot_org->lv_stripes; + lv_ptr->lv_stripesize = + lv_ptr->lv_snapshot_org->lv_stripesize; /* Update the VG PE(s) used by snapshot reserve space. */ - vg_ptr->pe_allocated += lv_ptr->lv_allocated_snapshot_le; + vg_ptr->pe_allocated += + lv_ptr->lv_allocated_snapshot_le; - if ((ret = lvm_snapshot_alloc(lv_ptr)) != 0) - { + if ((ret = + lvm_snapshot_alloc(lv_ptr)) != 0) { vfree(lv_ptr->lv_block_exception); kfree(lv_ptr); vg_ptr->lv[l] = NULL; return ret; } - for ( e = 0; e < lv_ptr->lv_remap_ptr; e++) - lvm_hash_link (lv_ptr->lv_block_exception + e, - lv_ptr->lv_block_exception[e].rdev_org, - lv_ptr->lv_block_exception[e].rsector_org, lv_ptr); + for (e = 0; e < lv_ptr->lv_remap_ptr; e++) + lvm_hash_link(lv_ptr-> + lv_block_exception + + e, + lv_ptr-> + lv_block_exception + [e].rdev_org, + lv_ptr-> + lv_block_exception + [e].rsector_org, + lv_ptr); /* need to fill the COW exception table data into the page for disk i/o */ - if(lvm_snapshot_fill_COW_page(vg_ptr, lv_ptr)) { + if (lvm_snapshot_fill_COW_page + (vg_ptr, lv_ptr)) { kfree(lv_ptr); vg_ptr->lv[l] = NULL; return -EINVAL; } - init_waitqueue_head(&lv_ptr->lv_snapshot_wait); + init_waitqueue_head(&lv_ptr-> + lv_snapshot_wait); } else { kfree(lv_ptr); vg_ptr->lv[l] = NULL; @@ -2152,7 +2231,7 @@ vg_ptr->lv[l] = NULL; return -EINVAL; } - } /* if ( vg[VG_CHR(minor)]->lv[l]->lv_access & LV_SNAPSHOT) */ + } /* if ( vg[VG_CHR(minor)]->lv[l]->lv_access & LV_SNAPSHOT) */ lv_ptr = vg_ptr->lv[l]; lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].start_sect = 0; @@ -2180,23 +2259,24 @@ down_write(&org->lv_lock); org->lv_access |= LV_SNAPSHOT_ORG; - lv_ptr->lv_access &= ~LV_SNAPSHOT_ORG; /* this can only hide an userspace bug */ + lv_ptr->lv_access &= ~LV_SNAPSHOT_ORG; /* this can only hide an userspace bug */ /* Link in the list of snapshot volumes */ - for (last = org; last->lv_snapshot_next; last = last->lv_snapshot_next); + for (last = org; last->lv_snapshot_next; + last = last->lv_snapshot_next); lv_ptr->lv_snapshot_prev = last; last->lv_snapshot_next = lv_ptr; up_write(&org->lv_lock); } /* activate the logical volume */ - if(activate) + if (activate) lv_ptr->lv_status |= LV_ACTIVE; else lv_ptr->lv_status &= ~LV_ACTIVE; - if ( lv_ptr->lv_access & LV_WRITE) + if (lv_ptr->lv_access & LV_WRITE) set_device_ro(lv_ptr->lv_dev, 0); else set_device_ro(lv_ptr->lv_dev, 1); @@ -2210,7 +2290,7 @@ lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].de = lvm_fs_create_lv(vg_ptr, lv_ptr); return 0; -} /* lvm_do_lv_create() */ +} /* lvm_do_lv_create() */ /* @@ -2233,7 +2313,8 @@ } } } - if (l == vg_ptr->lv_max) return -ENXIO; + if (l == vg_ptr->lv_max) + return -ENXIO; lv_ptr = vg_ptr->lv[l]; #ifdef LVM_TOTAL_RESET @@ -2253,14 +2334,15 @@ if (lv_ptr->lv_access & LV_SNAPSHOT) { /* - * Atomically make the snapshot invisible + * Atomically make the the snapshot invisible * to the original lv before playing with it. */ - lv_t * org = lv_ptr->lv_snapshot_org; + lv_t *org = lv_ptr->lv_snapshot_org; down_write(&org->lv_lock); /* remove this snapshot logical volume from the chain */ - lv_ptr->lv_snapshot_prev->lv_snapshot_next = lv_ptr->lv_snapshot_next; + lv_ptr->lv_snapshot_prev->lv_snapshot_next = + lv_ptr->lv_snapshot_next; if (lv_ptr->lv_snapshot_next != NULL) { lv_ptr->lv_snapshot_next->lv_snapshot_prev = lv_ptr->lv_snapshot_prev; @@ -2299,7 +2381,7 @@ vg_lv_map[MINOR(lv_ptr->lv_dev)].lv_number = -1; /* correct the PE count in PVs if this is not a snapshot - logical volume */ + logical volume */ if (!(lv_ptr->lv_access & LV_SNAPSHOT)) { /* only if this is no snapshot logical volume because we share the lv_current_pe[] structs with the @@ -2320,13 +2402,15 @@ vg_ptr->lv[l] = NULL; vg_ptr->lv_cur--; return 0; -} /* lvm_do_lv_remove() */ +} /* lvm_do_lv_remove() */ /* * logical volume extend / reduce */ -static int __extend_reduce_snapshot(vg_t *vg_ptr, lv_t *old_lv, lv_t *new_lv) { +static int __extend_reduce_snapshot(vg_t * vg_ptr, lv_t * old_lv, + lv_t * new_lv) +{ ulong size; lv_block_exception_t *lvbe; @@ -2357,7 +2441,8 @@ return 0; } -static int __extend_reduce(vg_t *vg_ptr, lv_t *old_lv, lv_t *new_lv) { +static int __extend_reduce(vg_t * vg_ptr, lv_t * old_lv, lv_t * new_lv) +{ ulong size, l, p, end; pe_t *pe; @@ -2373,7 +2458,7 @@ /* get the PE structures from user space */ if (copy_from_user(pe, new_lv->lv_current_pe, size)) { - if(old_lv->lv_access & LV_SNAPSHOT) + if (old_lv->lv_access & LV_SNAPSHOT) vfree(new_lv->lv_snapshot_hash_table); vfree(pe); return -EFAULT; @@ -2398,7 +2483,7 @@ vg_ptr->pe_allocated++; for (p = 0; p < vg_ptr->pv_cur; p++) { if (vg_ptr->pv[p]->pv_dev == - new_lv->lv_current_pe[l].dev) { + new_lv->lv_current_pe[l].dev) { vg_ptr->pv[p]->pe_allocated++; break; } @@ -2410,25 +2495,30 @@ end = min(old_lv->lv_current_le, new_lv->lv_current_le); for (l = 0; l < end; l++) { new_lv->lv_current_pe[l].reads += - old_lv->lv_current_pe[l].reads; + old_lv->lv_current_pe[l].reads; new_lv->lv_current_pe[l].writes += - old_lv->lv_current_pe[l].writes; + old_lv->lv_current_pe[l].writes; } } else { /* striped logical volume */ - uint i, j, source, dest, end, old_stripe_size, new_stripe_size; + uint i, j, source, dest, end, old_stripe_size, + new_stripe_size; - old_stripe_size = old_lv->lv_allocated_le / old_lv->lv_stripes; - new_stripe_size = new_lv->lv_allocated_le / new_lv->lv_stripes; + old_stripe_size = + old_lv->lv_allocated_le / old_lv->lv_stripes; + new_stripe_size = + new_lv->lv_allocated_le / new_lv->lv_stripes; end = min(old_stripe_size, new_stripe_size); for (i = source = dest = 0; i < new_lv->lv_stripes; i++) { for (j = 0; j < end; j++) { new_lv->lv_current_pe[dest + j].reads += - old_lv->lv_current_pe[source + j].reads; + old_lv->lv_current_pe[source + + j].reads; new_lv->lv_current_pe[dest + j].writes += - old_lv->lv_current_pe[source + j].writes; + old_lv->lv_current_pe[source + + j].writes; } source += old_stripe_size; dest += new_stripe_size; @@ -2438,7 +2528,7 @@ return 0; } -static int lvm_do_lv_extend_reduce(int minor, char *lv_name, lv_t *new_lv) +static int lvm_do_lv_extend_reduce(int minor, char *lv_name, lv_t * new_lv) { int r; ulong l, e, size; @@ -2453,7 +2543,8 @@ return -EINVAL; for (l = 0; l < vg_ptr->lv_max; l++) - if (vg_ptr->lv[l] && !strcmp(vg_ptr->lv[l]->lv_name, lv_name)) + if (vg_ptr->lv[l] + && !strcmp(vg_ptr->lv[l]->lv_name, lv_name)) break; if (l == vg_ptr->lv_max) @@ -2464,43 +2555,48 @@ if (old_lv->lv_access & LV_SNAPSHOT) { /* only perform this operation on active snapshots */ if (old_lv->lv_status & LV_ACTIVE) - r = __extend_reduce_snapshot(vg_ptr, old_lv, new_lv); + r = __extend_reduce_snapshot(vg_ptr, old_lv, + new_lv); else r = -EPERM; } else r = __extend_reduce(vg_ptr, old_lv, new_lv); - if(r) + if (r) return r; - /* copy relevent fields */ + /* copy relevant fields */ down_write(&old_lv->lv_lock); - if(new_lv->lv_access & LV_SNAPSHOT) { + if (new_lv->lv_access & LV_SNAPSHOT) { size = (new_lv->lv_remap_end > old_lv->lv_remap_end) ? - old_lv->lv_remap_ptr : new_lv->lv_remap_end; + old_lv->lv_remap_ptr : new_lv->lv_remap_end; size *= sizeof(lv_block_exception_t); memcpy(new_lv->lv_block_exception, old_lv->lv_block_exception, size); + vfree(old_lv->lv_block_exception); + vfree(old_lv->lv_snapshot_hash_table); old_lv->lv_remap_end = new_lv->lv_remap_end; old_lv->lv_block_exception = new_lv->lv_block_exception; old_lv->lv_snapshot_hash_table = - new_lv->lv_snapshot_hash_table; + new_lv->lv_snapshot_hash_table; old_lv->lv_snapshot_hash_table_size = - new_lv->lv_snapshot_hash_table_size; + new_lv->lv_snapshot_hash_table_size; old_lv->lv_snapshot_hash_mask = - new_lv->lv_snapshot_hash_mask; + new_lv->lv_snapshot_hash_mask; - for (e = 0; e < new_lv->lv_remap_ptr; e++) + for (e = 0; e < old_lv->lv_remap_ptr; e++) lvm_hash_link(new_lv->lv_block_exception + e, - new_lv->lv_block_exception[e].rdev_org, - new_lv->lv_block_exception[e].rsector_org, - new_lv); + new_lv->lv_block_exception[e]. + rdev_org, + new_lv->lv_block_exception[e]. + rsector_org, new_lv); + vg_ptr->pe_allocated -= old_lv->lv_allocated_le; + vg_ptr->pe_allocated += new_lv->lv_allocated_le; } else { - vfree(old_lv->lv_current_pe); vfree(old_lv->lv_snapshot_hash_table); @@ -2509,24 +2605,26 @@ old_lv->lv_current_le = new_lv->lv_current_le; old_lv->lv_current_pe = new_lv->lv_current_pe; lvm_gendisk.part[MINOR(old_lv->lv_dev)].nr_sects = - old_lv->lv_size; + old_lv->lv_size; lvm_size[MINOR(old_lv->lv_dev)] = old_lv->lv_size >> 1; if (old_lv->lv_access & LV_SNAPSHOT_ORG) { lv_t *snap; - for(snap = old_lv->lv_snapshot_next; snap; - snap = snap->lv_snapshot_next) { + for (snap = old_lv->lv_snapshot_next; snap; + snap = snap->lv_snapshot_next) { down_write(&snap->lv_lock); - snap->lv_current_pe = old_lv->lv_current_pe; + snap->lv_current_pe = + old_lv->lv_current_pe; snap->lv_allocated_le = - old_lv->lv_allocated_le; - snap->lv_current_le = old_lv->lv_current_le; + old_lv->lv_allocated_le; + snap->lv_current_le = + old_lv->lv_current_le; snap->lv_size = old_lv->lv_size; - lvm_gendisk.part[MINOR(snap->lv_dev)].nr_sects - = old_lv->lv_size; + lvm_gendisk.part[MINOR(snap->lv_dev)]. + nr_sects = old_lv->lv_size; lvm_size[MINOR(snap->lv_dev)] = - old_lv->lv_size >> 1; + old_lv->lv_size >> 1; __update_hardsectsize(snap); up_write(&snap->lv_lock); } @@ -2537,13 +2635,13 @@ up_write(&old_lv->lv_lock); return 0; -} /* lvm_do_lv_extend_reduce() */ +} /* lvm_do_lv_extend_reduce() */ /* * character device support function logical volume status by name */ -static int lvm_do_lv_status_byname(vg_t *vg_ptr, void *arg) +static int lvm_do_lv_status_byname(vg_t * vg_ptr, void *arg) { uint l; lv_status_byname_req_t lv_status_byname_req; @@ -2551,137 +2649,166 @@ void *saved_ptr2; lv_t *lv_ptr; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(&lv_status_byname_req, arg, sizeof(lv_status_byname_req_t)) != 0) return -EFAULT; - if (lv_status_byname_req.lv == NULL) return -EINVAL; + if (lv_status_byname_req.lv == NULL) + return -EINVAL; for (l = 0; l < vg_ptr->lv_max; l++) { if ((lv_ptr = vg_ptr->lv[l]) != NULL && strcmp(lv_ptr->lv_name, lv_status_byname_req.lv_name) == 0) { - /* Save usermode pointers */ - if (copy_from_user(&saved_ptr1, &lv_status_byname_req.lv->lv_current_pe, sizeof(void*)) != 0) + /* Save usermode pointers */ + if (copy_from_user + (&saved_ptr1, + &lv_status_byname_req.lv->lv_current_pe, + sizeof(void *)) != 0) + return -EFAULT; + if (copy_from_user + (&saved_ptr2, + &lv_status_byname_req.lv->lv_block_exception, + sizeof(void *)) != 0) return -EFAULT; - if (copy_from_user(&saved_ptr2, &lv_status_byname_req.lv->lv_block_exception, sizeof(void*)) != 0) - return -EFAULT; - if (copy_to_user(lv_status_byname_req.lv, - lv_ptr, - sizeof(lv_t)) != 0) + if (copy_to_user(lv_status_byname_req.lv, + lv_ptr, sizeof(lv_t)) != 0) return -EFAULT; if (saved_ptr1 != NULL) { if (copy_to_user(saved_ptr1, lv_ptr->lv_current_pe, lv_ptr->lv_allocated_le * - sizeof(pe_t)) != 0) + sizeof(pe_t)) != 0) return -EFAULT; } /* Restore usermode pointers */ - if (copy_to_user(&lv_status_byname_req.lv->lv_current_pe, &saved_ptr1, sizeof(void*)) != 0) - return -EFAULT; + if (copy_to_user + (&lv_status_byname_req.lv->lv_current_pe, + &saved_ptr1, sizeof(void *)) != 0) + return -EFAULT; return 0; } } return -ENXIO; -} /* lvm_do_lv_status_byname() */ +} /* lvm_do_lv_status_byname() */ /* * character device support function logical volume status by index */ -static int lvm_do_lv_status_byindex(vg_t *vg_ptr,void *arg) +static int lvm_do_lv_status_byindex(vg_t * vg_ptr, void *arg) { lv_status_byindex_req_t lv_status_byindex_req; void *saved_ptr1; void *saved_ptr2; lv_t *lv_ptr; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(&lv_status_byindex_req, arg, sizeof(lv_status_byindex_req)) != 0) return -EFAULT; if (lv_status_byindex_req.lv == NULL) return -EINVAL; - if ( ( lv_ptr = vg_ptr->lv[lv_status_byindex_req.lv_index]) == NULL) + if ((lv_ptr = vg_ptr->lv[lv_status_byindex_req.lv_index]) == NULL) return -ENXIO; /* Save usermode pointers */ - if (copy_from_user(&saved_ptr1, &lv_status_byindex_req.lv->lv_current_pe, sizeof(void*)) != 0) - return -EFAULT; - if (copy_from_user(&saved_ptr2, &lv_status_byindex_req.lv->lv_block_exception, sizeof(void*)) != 0) - return -EFAULT; + if (copy_from_user + (&saved_ptr1, &lv_status_byindex_req.lv->lv_current_pe, + sizeof(void *)) != 0) + return -EFAULT; + if (copy_from_user + (&saved_ptr2, &lv_status_byindex_req.lv->lv_block_exception, + sizeof(void *)) != 0) + return -EFAULT; - if (copy_to_user(lv_status_byindex_req.lv, lv_ptr, sizeof(lv_t)) != 0) + if (copy_to_user(lv_status_byindex_req.lv, lv_ptr, sizeof(lv_t)) != + 0) return -EFAULT; if (saved_ptr1 != NULL) { if (copy_to_user(saved_ptr1, lv_ptr->lv_current_pe, lv_ptr->lv_allocated_le * - sizeof(pe_t)) != 0) + sizeof(pe_t)) != 0) return -EFAULT; } /* Restore usermode pointers */ - if (copy_to_user(&lv_status_byindex_req.lv->lv_current_pe, &saved_ptr1, sizeof(void *)) != 0) - return -EFAULT; + if (copy_to_user + (&lv_status_byindex_req.lv->lv_current_pe, &saved_ptr1, + sizeof(void *)) != 0) + return -EFAULT; return 0; -} /* lvm_do_lv_status_byindex() */ +} /* lvm_do_lv_status_byindex() */ /* * character device support function logical volume status by device number */ -static int lvm_do_lv_status_bydev(vg_t * vg_ptr, void * arg) { +static int lvm_do_lv_status_bydev(vg_t * vg_ptr, void *arg) +{ int l; lv_status_bydev_req_t lv_status_bydev_req; void *saved_ptr1; void *saved_ptr2; lv_t *lv_ptr; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(&lv_status_bydev_req, arg, sizeof(lv_status_bydev_req)) != 0) return -EFAULT; - for ( l = 0; l < vg_ptr->lv_max; l++) { - if ( vg_ptr->lv[l] == NULL) continue; - if ( vg_ptr->lv[l]->lv_dev == lv_status_bydev_req.dev) break; + for (l = 0; l < vg_ptr->lv_max; l++) { + if (vg_ptr->lv[l] == NULL) + continue; + if (vg_ptr->lv[l]->lv_dev == lv_status_bydev_req.dev) + break; } - if ( l == vg_ptr->lv_max) return -ENXIO; + if (l == vg_ptr->lv_max) + return -ENXIO; lv_ptr = vg_ptr->lv[l]; /* Save usermode pointers */ - if (copy_from_user(&saved_ptr1, &lv_status_bydev_req.lv->lv_current_pe, sizeof(void*)) != 0) - return -EFAULT; - if (copy_from_user(&saved_ptr2, &lv_status_bydev_req.lv->lv_block_exception, sizeof(void*)) != 0) - return -EFAULT; + if (copy_from_user + (&saved_ptr1, &lv_status_bydev_req.lv->lv_current_pe, + sizeof(void *)) != 0) + return -EFAULT; + if (copy_from_user + (&saved_ptr2, &lv_status_bydev_req.lv->lv_block_exception, + sizeof(void *)) != 0) + return -EFAULT; - if (copy_to_user(lv_status_bydev_req.lv, lv_ptr, sizeof(lv_t)) != 0) + if (copy_to_user(lv_status_bydev_req.lv, lv_ptr, sizeof(lv_t)) != + 0) return -EFAULT; if (saved_ptr1 != NULL) { if (copy_to_user(saved_ptr1, lv_ptr->lv_current_pe, lv_ptr->lv_allocated_le * - sizeof(pe_t)) != 0) + sizeof(pe_t)) != 0) return -EFAULT; } /* Restore usermode pointers */ - if (copy_to_user(&lv_status_bydev_req.lv->lv_current_pe, &saved_ptr1, sizeof(void *)) != 0) - return -EFAULT; + if (copy_to_user + (&lv_status_bydev_req.lv->lv_current_pe, &saved_ptr1, + sizeof(void *)) != 0) + return -EFAULT; return 0; -} /* lvm_do_lv_status_bydev() */ +} /* lvm_do_lv_status_bydev() */ /* * character device support function rename a logical volume */ -static int lvm_do_lv_rename(vg_t *vg_ptr, lv_req_t *lv_req, lv_t *lv) +static int lvm_do_lv_rename(vg_t * vg_ptr, lv_req_t * lv_req, lv_t * lv) { int l = 0; int ret = 0; @@ -2690,33 +2817,36 @@ if (!vg_ptr) return -ENXIO; - for (l = 0; l < vg_ptr->lv_max; l++) - { - if ( (lv_ptr = vg_ptr->lv[l]) == NULL) continue; - if (lv_ptr->lv_dev == lv->lv_dev) - { + for (l = 0; l < vg_ptr->lv_max; l++) { + if ((lv_ptr = vg_ptr->lv[l]) == NULL) + continue; + if (lv_ptr->lv_dev == lv->lv_dev) { lvm_fs_remove_lv(vg_ptr, lv_ptr); - strncpy(lv_ptr->lv_name, lv_req->lv_name, NAME_LEN); - lvm_fs_create_lv(vg_ptr, lv_ptr); + strncpy(lv_ptr->lv_name, lv_req->lv_name, + NAME_LEN); + lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].de = + lvm_fs_create_lv(vg_ptr, lv_ptr); break; } } - if (l == vg_ptr->lv_max) ret = -ENODEV; + if (l == vg_ptr->lv_max) + ret = -ENODEV; return ret; -} /* lvm_do_lv_rename */ +} /* lvm_do_lv_rename */ /* * character device support function physical volume change */ -static int lvm_do_pv_change(vg_t *vg_ptr, void *arg) +static int lvm_do_pv_change(vg_t * vg_ptr, void *arg) { uint p; pv_t *pv_ptr; struct block_device *bd; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(&pv_change_req, arg, sizeof(pv_change_req)) != 0) return -EFAULT; @@ -2724,8 +2854,7 @@ for (p = 0; p < vg_ptr->pv_max; p++) { pv_ptr = vg_ptr->pv[p]; if (pv_ptr != NULL && - strcmp(pv_ptr->pv_name, - pv_change_req.pv_name) == 0) { + strcmp(pv_ptr->pv_name, pv_change_req.pv_name) == 0) { bd = pv_ptr->bd; if (copy_from_user(pv_ptr, @@ -2741,17 +2870,18 @@ } } return -ENXIO; -} /* lvm_do_pv_change() */ +} /* lvm_do_pv_change() */ /* * character device support function get physical volume status */ -static int lvm_do_pv_status(vg_t *vg_ptr, void *arg) +static int lvm_do_pv_status(vg_t * vg_ptr, void *arg) { uint p; pv_t *pv_ptr; - if (vg_ptr == NULL) return -ENXIO; + if (vg_ptr == NULL) + return -ENXIO; if (copy_from_user(&pv_status_req, arg, sizeof(pv_status_req)) != 0) return -EFAULT; @@ -2759,17 +2889,15 @@ for (p = 0; p < vg_ptr->pv_max; p++) { pv_ptr = vg_ptr->pv[p]; if (pv_ptr != NULL && - strcmp(pv_ptr->pv_name, - pv_status_req.pv_name) == 0) { + strcmp(pv_ptr->pv_name, pv_status_req.pv_name) == 0) { if (copy_to_user(pv_status_req.pv, - pv_ptr, - sizeof(pv_t)) != 0) + pv_ptr, sizeof(pv_t)) != 0) return -EFAULT; return 0; } } return -ENXIO; -} /* lvm_do_pv_status() */ +} /* lvm_do_pv_status() */ /* @@ -2811,13 +2939,15 @@ hardsect_size[MAJOR_NR] = lvm_hardsectsizes; return; -} /* lvm_gen_init() */ +} /* lvm_gen_init() */ /* Must have down_write(_pe_lock) when we enqueue buffers */ -static void _queue_io(struct buffer_head *bh, int rw) { - if (bh->b_reqnext) BUG(); +static void _queue_io(struct buffer_head *bh, int rw) +{ + if (bh->b_reqnext) + BUG(); bh->b_reqnext = _pe_requests; _pe_requests = bh; } @@ -2855,14 +2985,15 @@ /* * we must open the pv's before we use them */ -static int _open_pv(pv_t *pv) { +static int _open_pv(pv_t * pv) +{ int err; struct block_device *bd; if (!(bd = bdget(kdev_t_to_nr(pv->pv_dev)))) return -ENOMEM; - err = blkdev_get(bd, FMODE_READ|FMODE_WRITE, 0, BDEV_FILE); + err = blkdev_get(bd, FMODE_READ | FMODE_WRITE, 0, BDEV_FILE); if (err) return err; @@ -2870,7 +3001,8 @@ return 0; } -static void _close_pv(pv_t *pv) { +static void _close_pv(pv_t * pv) +{ if (pv) { struct block_device *bdev = pv->bd; pv->bd = NULL; @@ -2882,7 +3014,7 @@ static unsigned long _sectors_to_k(unsigned long sect) { - if(SECTOR_SIZE > 1024) { + if (SECTOR_SIZE > 1024) { return sect * (SECTOR_SIZE / 1024); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/bttv-cards.c linux-2.4.23-pre8/drivers/media/video/bttv-cards.c --- linux-2.4.22/drivers/media/video/bttv-cards.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/bttv-cards.c 2003-10-22 22:48:54.000000000 +0000 @@ -31,6 +31,9 @@ #include #include #include +#ifdef CONFIG_FW_LOADER +# include +#endif #include @@ -76,6 +79,7 @@ static unsigned int card[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET}; static unsigned int pll[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET}; static unsigned int tuner[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET}; +static unsigned int svhs[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET}; #ifdef MODULE static unsigned int autoload = 1; #else @@ -1212,7 +1216,7 @@ .tuner_type = -1, .pll = PLL_28, .muxsel = { 2 }, - gpiomask: 0 + .gpiomask = 0 },{ /* Tomasz Pyra */ .name = "Prolink Pixelview PV-BT878P+ (Rev.4C,8E)", @@ -1299,7 +1303,7 @@ },{ .name = "Powercolor MTV878/ MTV878R/ MTV878F", .video_inputs = 3, - audio_inputs: 2, + .audio_inputs = 2, .tuner = 0, .svhs = 2, .gpiomask = 0x1C800F, // Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset @@ -1339,7 +1343,7 @@ },{ .name = "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF", .video_inputs = 4, - audio_inputs: 3, + .audio_inputs = 3, .tuner = 0, .svhs = 2, .gpiomask = 7, @@ -1389,18 +1393,19 @@ .gpiomask = 7, .audiomux = {7}, },{ - .name = "GV-BCTV5/PCI", + .name = "IODATA GV-BCTV5/PCI", .video_inputs = 3, .audio_inputs = 1, .tuner = 0, .svhs = 2, - .gpiomask = 0x010f00, + .gpiomask = 0x0f0f80, .muxsel = {2, 3, 1, 0}, - .audiomux = {0x10000, 0, 0x10000, 0, 0, 0}, + .audiomux = {0x030000, 0x010000, 0x030000, 0, 0x020000, 0}, .no_msp34xx = 1, .pll = PLL_28, .tuner_type = TUNER_PHILIPS_NTSC_M, .audio_hook = gvbctv3pci_audio, + .has_radio = 1, },{ .name = "Osprey 100/150 (878)", /* 0x1(2|3)-45C6-C1 */ .video_inputs = 4, /* id-inputs-clock */ @@ -1854,12 +1859,8 @@ btv->type=card[btv->nr]; /* print which card config we are using */ - sprintf(btv->video_dev.name,"BT%d%s(%.23s)", - btv->id, - (btv->id==848 && btv->revision==0x12) ? "A" : "", - bttv_tvcards[btv->type].name); printk(KERN_INFO "bttv%d: using: %s [card=%d,%s]\n",btv->nr, - btv->video_dev.name,btv->type, + bttv_tvcards[btv->type].name, btv->type, card[btv->nr] < bttv_num_tvcards ? "insmod option" : "autodetected"); @@ -2270,6 +2271,9 @@ &btv->pinnacle_id); if (btv->tuner_type != UNSET) bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type); + btv->svhs = bttv_tvcards[btv->type].svhs; + if (svhs[btv->nr] != UNSET) + btv->svhs = svhs[btv->nr]; if (bttv_tvcards[btv->type].has_radio) btv->has_radio=1; @@ -2549,18 +2553,19 @@ int __devinit pvr_boot(struct bttv *btv) { const struct firmware *fw_entry; - struct device *dev = btv->dev->dev; - int result; + int rc; - result = request_firmware(&fw_entry, "hcwamc.rbf", dev); - if (result != 0) { + rc = request_firmware(&fw_entry, "hcwamc.rbf", pci_name(btv->dev)); + if (rc != 0) { printk(KERN_WARNING "bttv%d: no altera firmware [via hotplug]\n", btv->nr); return rc; } - result = pvr_altera_load(btv, fw_entry->data, fw_entry->size); + rc = pvr_altera_load(btv, fw_entry->data, fw_entry->size); + printk(KERN_INFO "bttv%d: altera firmware upload %s\n", + btv->nr, (rc < 0) ? "failed" : "ok"); release_firmware(fw_entry); - return result; + return rc; } #endif @@ -2695,12 +2700,12 @@ static void __devinit avermedia_eeprom(struct bttv *btv) { - int tuner_make,tuner_tv_fm,tuner_format,tuner=0,remote; + int tuner_make,tuner_tv_fm,tuner_format,tuner=0; - tuner_make = (eeprom_data[0x41] & 0x7); - tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3; - tuner_format = (eeprom_data[0x42] & 0xf0) >> 4; - remote = (eeprom_data[0x42] & 0x01); + tuner_make = (eeprom_data[0x41] & 0x7); + tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3; + tuner_format = (eeprom_data[0x42] & 0xf0) >> 4; + btv->has_remote = (eeprom_data[0x42] & 0x01); if (tuner_make == 0 || tuner_make == 2) if(tuner_format <=9) @@ -2717,8 +2722,8 @@ } else printk("Unknown type"); printk(" radio:%s remote control:%s\n", - tuner_tv_fm?"yes":"no", - remote?"yes":"no"); + tuner_tv_fm ? "yes" : "no", + btv->has_remote ? "yes" : "no"); } /* used on Voodoo TV/FM (Voodoo 200), S0 wired to 0x10000 */ @@ -3466,9 +3471,11 @@ latency = 0x0A; #endif +#if 0 /* print which chipset we have */ while ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8,dev))) - printk(KERN_INFO "bttv: Host bridge is %s\n",dev->name); + printk(KERN_INFO "bttv: Host bridge is %s\n",pci_name(dev)); +#endif /* print warnings about any quirks found */ if (triton1) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/bttv-driver.c linux-2.4.23-pre8/drivers/media/video/bttv-driver.c --- linux-2.4.22/drivers/media/video/bttv-driver.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/bttv-driver.c 2003-10-22 22:49:15.000000000 +0000 @@ -400,13 +400,10 @@ #endif input %= bttv_tvcards[btv->type].video_inputs; - if (input==bttv_tvcards[btv->type].svhs) - { + if (input == btv->svhs) { btor(BT848_CONTROL_COMP, BT848_E_CONTROL); btor(BT848_CONTROL_COMP, BT848_O_CONTROL); - } - else - { + } else { btand(~BT848_CONTROL_COMP, BT848_E_CONTROL); btand(~BT848_CONTROL_COMP, BT848_O_CONTROL); } @@ -1668,7 +1665,7 @@ v.type=VIDEO_TYPE_TV; v.tuners=1; } - else if (channel==bttv_tvcards[btv->type].svhs) + else if (channel == btv->svhs) strcpy(v.name,"S-Video"); else if (bttv_tvcards[btv->type].muxsel[v.channel] < 0) strcpy(v.name,"Digital Video"); @@ -2200,7 +2197,7 @@ static struct video_device bttv_template= { .owner = THIS_MODULE, - .name = "UNSET", + .name = "bttv video", .type = VID_TYPE_TUNER|VID_TYPE_CAPTURE|VID_TYPE_OVERLAY|VID_TYPE_TELETEXT, .hardware = VID_HARDWARE_BT848, .open = bttv_open, @@ -2369,7 +2366,6 @@ static int radio_open(struct video_device *dev, int flags) { struct bttv *btv = (struct bttv *)(dev-1); - unsigned long v; down(&btv->lock); if (btv->user) @@ -2377,8 +2373,6 @@ btv->user++; btv->radio = 1; - v = 400*16; - bttv_call_i2c_clients(btv,VIDIOCSFREQ,&v); bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type); bt848_muxsel(btv,0); up(&btv->lock); @@ -3153,7 +3147,7 @@ return result; } -static struct pci_device_id bttv_pci_tbl[] __devinitdata = { +static struct pci_device_id bttv_pci_tbl[] = { {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT848, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_BROOKTREE, PCI_DEVICE_ID_BT849, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/bttv-if.c linux-2.4.23-pre8/drivers/media/video/bttv-if.c --- linux-2.4.22/drivers/media/video/bttv-if.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/bttv-if.c 2003-10-22 22:47:45.000000000 +0000 @@ -190,6 +190,7 @@ return state; } +#ifndef I2C_PEC static void bttv_inc_use(struct i2c_adapter *adap) { MOD_INC_USE_COUNT; @@ -199,6 +200,7 @@ { MOD_DEC_USE_COUNT; } +#endif static int attach_inform(struct i2c_client *client) { @@ -241,8 +243,15 @@ }; static struct i2c_adapter bttv_i2c_adap_template = { +#ifdef I2C_PEC + .owner = THIS_MODULE, +#else .inc_use = bttv_inc_use, .dec_use = bttv_dec_use, +#endif +#ifdef I2C_ADAP_CLASS_TV_ANALOG + .class = I2C_ADAP_CLASS_TV_ANALOG, +#endif I2C_DEVNAME("bt848"), .id = I2C_HW_B_BT848, .client_register = attach_inform, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/bttvp.h linux-2.4.23-pre8/drivers/media/video/bttvp.h --- linux-2.4.22/drivers/media/video/bttvp.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/bttvp.h 2003-10-22 22:48:31.000000000 +0000 @@ -26,7 +26,7 @@ #define _BTTVP_H_ #include -#define BTTV_VERSION_CODE KERNEL_VERSION(0,7,107) +#define BTTV_VERSION_CODE KERNEL_VERSION(0,7,108) #include #include @@ -131,6 +131,7 @@ unsigned int tuner_type; unsigned int pinnacle_id; unsigned int channel; + unsigned int svhs; unsigned int nr; unsigned short id; @@ -150,6 +151,7 @@ int audio_chip; /* set to one of the chips supported by bttv.c */ int radio; int has_radio; + int has_remote; /* miro/pinnacle + Aimslab VHX philips matchbox (tea5757 radio tuner) support */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/cpia.c linux-2.4.23-pre8/drivers/media/video/cpia.c --- linux-2.4.22/drivers/media/video/cpia.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/cpia.c 2003-10-22 22:49:12.000000000 +0000 @@ -1683,13 +1683,9 @@ * values. - rich@annexia.org */ if (cam->params.exposure.redComp < 220 || - cam->params.exposure.redComp > 255 || cam->params.exposure.green1Comp < 214 || - cam->params.exposure.green1Comp > 255 || cam->params.exposure.green2Comp < 214 || - cam->params.exposure.green2Comp > 255 || - cam->params.exposure.blueComp < 230 || - cam->params.exposure.blueComp > 255) + cam->params.exposure.blueComp < 230) { printk (KERN_WARNING "*_comp parameters have gone AWOL (%d/%d/%d/%d) - reseting them\n", cam->params.exposure.redComp, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/cpia.h linux-2.4.23-pre8/drivers/media/video/cpia.h --- linux-2.4.22/drivers/media/video/cpia.h 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/cpia.h 2003-10-22 22:49:34.000000000 +0000 @@ -393,12 +393,14 @@ /* ErrorCode */ #define ERROR_FLICKER_BELOW_MIN_EXP 0x01 /*flicker exposure got below minimum exposure */ -#define ALOG(lineno,fmt,args...) printk(fmt,lineno,##args) -#define LOG(fmt,args...) ALOG((__LINE__),KERN_INFO __FILE__":"__FUNCTION__"(%d):"fmt,##args) +#define ALOG(function,lineno,fmt,args...) printk(fmt, function, lineno, ##args) +#define LOG(fmt,args...) ALOG((__FUNCTION__), (__LINE__), \ + KERN_INFO __FILE__":%s(%d):"fmt, ##args) #ifdef _CPIA_DEBUG_ -#define ADBG(lineno,fmt,args...) printk(fmt, jiffies, lineno, ##args) -#define DBG(fmt,args...) ADBG((__LINE__),KERN_DEBUG __FILE__"(%ld):"__FUNCTION__"(%d):"fmt,##args) +#define ADBG(function,lineno,fmt,args...) printk(fmt, jiffies, function, lineno, ##args) +#define DBG(fmt,args...) ADBG((__FUNCTION__), (__LINE__), \ + KERN_DEBUG __FILE__"(%ld):%s(%d):"fmt, ##args) #else #define DBG(fmn,args...) do {} while(0) #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/id.h linux-2.4.23-pre8/drivers/media/video/id.h --- linux-2.4.22/drivers/media/video/id.h 2002-08-03 00:39:44.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/id.h 2003-10-22 22:48:55.000000000 +0000 @@ -27,6 +27,9 @@ #ifndef I2C_DRIVERID_TDA9874 # define I2C_DRIVERID_TDA9874 I2C_DRIVERID_EXP0+7 #endif +#ifndef I2C_DRIVERID_SAA6752HS +# define I2C_DRIVERID_SAA6752HS I2C_DRIVERID_EXP0+8 +#endif /* algorithms */ #ifndef I2C_ALGO_SAA7134 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/meye.c linux-2.4.23-pre8/drivers/media/video/meye.c --- linux-2.4.22/drivers/media/video/meye.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/meye.c 2003-10-22 22:49:04.000000000 +0000 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -139,7 +138,7 @@ memset(mem, 0, size); /* Clear the ram out, no junk to the user */ adr = (unsigned long)mem; while (size > 0) { - mem_map_reserve(vmalloc_to_page((void *)adr)); + SetPageReserved(vmalloc_to_page((void *)adr)); adr += PAGE_SIZE; size -= PAGE_SIZE; } @@ -153,7 +152,7 @@ if (mem) { adr = (unsigned long) mem; while ((long) size > 0) { - mem_map_unreserve(vmalloc_to_page((void *)adr)); + ClearPageReserved(vmalloc_to_page((void *)adr)); adr += PAGE_SIZE; size -= PAGE_SIZE; } @@ -948,7 +947,7 @@ case VIDIOCGCAP: { struct video_capability *b = arg; - strcpy(b->name,meye.video_dev.name); + strcpy(b->name,meye.video_dev->name); b->type = VID_TYPE_CAPTURE; b->channels = 1; b->audios = 0; @@ -1253,6 +1252,7 @@ .type = VID_TYPE_CAPTURE, .hardware = VID_HARDWARE_MEYE, .fops = &meye_fops, + .minor = -1, }; #ifdef CONFIG_PM @@ -1303,10 +1303,16 @@ goto out1; } - sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 1); - meye.mchip_dev = pcidev; - memcpy(&meye.video_dev, &meye_template, sizeof(meye_template)); + meye.video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL); + if (!meye.video_dev) { + printk(KERN_ERR "meye: video_device_alloc() failed!\n"); + ret = -EBUSY; + goto out1; + } + memcpy(meye.video_dev, &meye_template, sizeof(meye_template)); + + sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 1); if ((ret = pci_enable_device(meye.mchip_dev))) { printk(KERN_ERR "meye: pci_enable_device failed\n"); @@ -1363,7 +1369,7 @@ wait_ms(1); mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK); - if (video_register_device(&meye.video_dev, VFL_TYPE_GRABBER, video_nr) < 0) { + if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER, video_nr) < 0) { printk(KERN_ERR "meye: video_register_device failed\n"); ret = -EIO; @@ -1411,6 +1417,9 @@ out3: pci_disable_device(meye.mchip_dev); out2: + kfree(meye.video_dev); + meye.video_dev = NULL; + sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0); out1: return ret; @@ -1418,7 +1427,7 @@ static void __devexit meye_remove(struct pci_dev *pcidev) { - video_unregister_device(&meye.video_dev); + video_unregister_device(meye.video_dev); mchip_hic_stop(); @@ -1444,7 +1453,7 @@ printk(KERN_INFO "meye: removed\n"); } -static struct pci_device_id meye_pci_tbl[] __devinitdata = { +static struct pci_device_id meye_pci_tbl[] = { { PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { } @@ -1504,8 +1513,6 @@ MODULE_DESCRIPTION("video4linux driver for the MotionEye camera"); MODULE_LICENSE("GPL"); -EXPORT_NO_SYMBOLS; - MODULE_PARM(gbuffers,"i"); MODULE_PARM_DESC(gbuffers,"number of capture buffers, default is 2 (32 max)"); MODULE_PARM(gbufsize,"i"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/meye.h linux-2.4.23-pre8/drivers/media/video/meye.h --- linux-2.4.22/drivers/media/video/meye.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/meye.h 2003-10-22 22:49:00.000000000 +0000 @@ -312,7 +312,7 @@ struct meye_queue grabq; /* queue for buffers to be grabbed */ - struct video_device video_dev; /* video device parameters */ + struct video_device *video_dev; /* video device parameters */ struct video_picture picture; /* video picture parameters */ struct meye_params params; /* additional parameters */ #ifdef CONFIG_PM diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/msp3400.c linux-2.4.23-pre8/drivers/media/video/msp3400.c --- linux-2.4.22/drivers/media/video/msp3400.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/msp3400.c 2003-10-22 22:49:06.000000000 +0000 @@ -1405,8 +1405,13 @@ static int msp_probe(struct i2c_adapter *adap) { +#ifdef I2C_ADAP_CLASS_TV_ANALOG + 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)) return i2c_probe(adap, &addr_data, msp_attach); +#endif return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/tda7432.c linux-2.4.23-pre8/drivers/media/video/tda7432.c --- linux-2.4.22/drivers/media/video/tda7432.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/tda7432.c 2003-10-22 22:49:12.000000000 +0000 @@ -341,8 +341,13 @@ static int tda7432_probe(struct i2c_adapter *adap) { +#ifdef I2C_ADAP_CLASS_TV_ANALOG + if (adap->class & I2C_ADAP_CLASS_TV_ANALOG) + return i2c_probe(adap, &addr_data, tda7432_attach); +#else if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848)) return i2c_probe(adap, &addr_data, tda7432_attach); +#endif return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/tda9875.c linux-2.4.23-pre8/drivers/media/video/tda9875.c --- linux-2.4.22/drivers/media/video/tda9875.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/tda9875.c 2003-10-22 22:48:40.000000000 +0000 @@ -275,8 +275,13 @@ static int tda9875_probe(struct i2c_adapter *adap) { +#ifdef I2C_ADAP_CLASS_TV_ANALOG + if (adap->class & I2C_ADAP_CLASS_TV_ANALOG) + return i2c_probe(adap, &addr_data, tda9875_attach); +#else if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848)) return i2c_probe(adap, &addr_data, tda9875_attach); +#endif return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/tda9887.c linux-2.4.23-pre8/drivers/media/video/tda9887.c --- linux-2.4.22/drivers/media/video/tda9887.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/tda9887.c 2003-10-22 22:49:42.000000000 +0000 @@ -369,6 +369,10 @@ static int tda9887_probe(struct i2c_adapter *adap) { +#ifdef I2C_ADAP_CLASS_TV_ANALOG + if (adap->class & I2C_ADAP_CLASS_TV_ANALOG) + return i2c_probe(adap, &addr_data, tda9887_attach); +#else switch (adap->id) { case I2C_ALGO_BIT | I2C_HW_B_BT848: case I2C_ALGO_BIT | I2C_HW_B_RIVA: @@ -376,6 +380,7 @@ return i2c_probe(adap, &addr_data, tda9887_attach); break; } +#endif return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/tuner.c linux-2.4.23-pre8/drivers/media/video/tuner.c --- linux-2.4.22/drivers/media/video/tuner.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/tuner.c 2003-10-22 22:49:20.000000000 +0000 @@ -847,6 +847,10 @@ } this_adap = 0; +#ifdef I2C_ADAP_CLASS_TV_ANALOG + if (adap->class & I2C_ADAP_CLASS_TV_ANALOG) + return i2c_probe(adap, &addr_data, tuner_attach); +#else switch (adap->id) { case I2C_ALGO_BIT | I2C_HW_B_BT848: case I2C_ALGO_BIT | I2C_HW_B_RIVA: @@ -855,6 +859,7 @@ return i2c_probe(adap, &addr_data, tuner_attach); break; } +#endif return 0; } @@ -893,7 +898,10 @@ mt2032_init(client); break; case AUDC_SET_RADIO: - t->radio = 1; + if (!t->radio) { + set_tv_freq(client,400 * 16); + t->radio = 1; + } break; case AUDC_CONFIG_PINNACLE: switch (*iarg) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/tvaudio.c linux-2.4.23-pre8/drivers/media/video/tvaudio.c --- linux-2.4.22/drivers/media/video/tvaudio.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/tvaudio.c 2003-10-22 22:48:25.000000000 +0000 @@ -1507,12 +1507,17 @@ static int chip_probe(struct i2c_adapter *adap) { +#ifdef I2C_ADAP_CLASS_TV_ANALOG + if (adap->class & I2C_ADAP_CLASS_TV_ANALOG) + return i2c_probe(adap, &addr_data, chip_attach); +#else switch (adap->id) { case I2C_ALGO_BIT | I2C_HW_B_BT848: case I2C_ALGO_BIT | I2C_HW_B_RIVA: case I2C_ALGO_SAA7134: return i2c_probe(adap, &addr_data, chip_attach); } +#endif return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/tvmixer.c linux-2.4.23-pre8/drivers/media/video/tvmixer.c --- linux-2.4.22/drivers/media/video/tvmixer.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/tvmixer.c 2003-10-22 22:49:33.000000000 +0000 @@ -18,6 +18,7 @@ # include "i2c-compat.h" # define strlcpy(dest,src,len) strncpy(dest,src,(len)-1) +# define iminor(inode) minor(inode->i_rdev) #define DEV_MAX 4 @@ -175,7 +176,7 @@ static int tvmixer_open(struct inode *inode, struct file *file) { - int i, minor = minor(inode->i_rdev); + int i, minor = iminor(inode); struct TVMIXER *mix = NULL; struct i2c_client *client = NULL; @@ -192,8 +193,10 @@ /* lock bttv in memory while the mixer is in use */ file->private_data = mix; +#ifndef I2C_PEC if (client->adapter->inc_use) client->adapter->inc_use(client->adapter); +#endif return 0; } @@ -207,15 +210,25 @@ return -ENODEV; } +#ifndef I2C_PEC if (client->adapter->dec_use) client->adapter->dec_use(client->adapter); +#endif return 0; } static struct i2c_driver driver = { +#ifdef I2C_PEC + .owner = THIS_MODULE, +#endif .name = "tv card mixer driver", .id = I2C_DRIVERID_TVMIXER, +#ifdef I2C_DF_DUMMY .flags = I2C_DF_DUMMY, +#else + .flags = I2C_DF_NOTIFY, + .detach_adapter = tvmixer_adapters, +#endif .attach_adapter = tvmixer_adapters, .detach_client = tvmixer_clients, }; @@ -247,6 +260,10 @@ struct video_audio va; int i,minor; +#ifdef I2C_ADAP_CLASS_TV_ANALOG + if (!(client->adapter->class & I2C_ADAP_CLASS_TV_ANALOG)) + return -1; +#else /* TV card ??? */ switch (client->adapter->id) { case I2C_ALGO_BIT | I2C_HW_B_BT848: @@ -257,6 +274,7 @@ /* ignore that one */ return -1; } +#endif /* unregister ?? */ for (i = 0; i < DEV_MAX; i++) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/media/video/videodev.c linux-2.4.23-pre8/drivers/media/video/videodev.c --- linux-2.4.22/drivers/media/video/videodev.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/media/video/videodev.c 2003-10-22 22:47:46.000000000 +0000 @@ -62,6 +62,20 @@ #endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS */ +struct video_device *video_device_alloc(void) +{ + struct video_device *vfd; + vfd = kmalloc(sizeof(*vfd),GFP_KERNEL); + if (NULL == vfd) + return NULL; + memset(vfd,0,sizeof(*vfd)); + return vfd; +} + +void video_device_release(struct video_device *vfd) +{ + kfree(vfd); +} /* * Read will do some smarts later on. Buffer pin etc. @@ -611,6 +625,8 @@ #endif devfs_unregister (vfd->devfs_handle); + if (vfd->release) + vfd->release(vfd); video_device[vfd->minor]=NULL; MOD_DEC_USE_COUNT; up(&videodev_lock); @@ -661,6 +677,8 @@ module_init(videodev_init) module_exit(videodev_exit) +EXPORT_SYMBOL(video_device_alloc); +EXPORT_SYMBOL(video_device_release); EXPORT_SYMBOL(video_register_device); EXPORT_SYMBOL(video_unregister_device); EXPORT_SYMBOL(video_devdata); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/message/fusion/linux_compat.h linux-2.4.23-pre8/drivers/message/fusion/linux_compat.h --- linux-2.4.22/drivers/message/fusion/linux_compat.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/message/fusion/linux_compat.h 2003-10-22 22:48:25.000000000 +0000 @@ -93,7 +93,7 @@ * Used prior to schedule_timeout calls.. */ #define __set_current_state(state_value) do { current->state = state_value; } while (0) -#ifdef __SMP__ +#ifdef CONFIG_SMP #define set_current_state(state_value) do { __set_current_state(state_value); mb(); } while (0) #else #define set_current_state(state_value) __set_current_state(state_value) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/3c501.c linux-2.4.23-pre8/drivers/net/3c501.c --- linux-2.4.22/drivers/net/3c501.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/3c501.c 2003-10-22 22:47:29.000000000 +0000 @@ -148,7 +148,7 @@ static int el1_close(struct net_device *dev); static struct net_device_stats *el1_get_stats(struct net_device *dev); static void set_multicast_list(struct net_device *dev); -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; #define EL1_IO_EXTENT 16 @@ -388,7 +388,7 @@ dev->stop = &el1_close; dev->get_stats = &el1_get_stats; dev->set_multicast_list = &set_multicast_list; - dev->do_ioctl = netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; /* * Setup the generic properties @@ -939,86 +939,31 @@ } } -/** - * netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls - * @dev: network interface on which out-of-band action is to be performed - * @useraddr: userspace address to which data is to be read and returned - * - * Process the various commands of the SIOCETHTOOL interface. - */ -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "ISA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - debug = edata.data; - return 0; - } - - default: - break; - } - - return -EOPNOTSUPP; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr); } -/** - * netdev_ioctl: Handle network interface ioctls - * @dev: network interface on which out-of-band action is to be performed - * @rq: user request data - * @cmd: command issued by user - * - * Process the various out-of-band ioctls passed to this driver. - */ - -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) +static u32 netdev_get_msglevel(struct net_device *dev) { - int rc = 0; + return debug; +} - switch (cmd) { - case SIOCETHTOOL: - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - break; +static void netdev_set_msglevel(struct net_device *dev, u32 level) +{ + debug = level; +} - default: - rc = -EOPNOTSUPP; - break; - } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +}; - return rc; -} - #ifdef MODULE static struct net_device dev_3c501 = { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/3c503.c linux-2.4.23-pre8/drivers/net/3c503.c --- linux-2.4.22/drivers/net/3c503.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/3c503.c 2003-10-22 22:49:12.000000000 +0000 @@ -82,7 +82,7 @@ int ring_offset); static void el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page); -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; /* This routine probes for a memory-mapped 3c503 board by looking for @@ -310,7 +310,7 @@ dev->open = &el2_open; dev->stop = &el2_close; - dev->do_ioctl = &netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; if (dev->mem_start) printk("%s: %s - %dkB RAM, 8kB shared mem window at %#6lx-%#6lx.\n", @@ -619,69 +619,18 @@ return; } -/** - * netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls - * @dev: network interface on which out-of-band action is to be performed - * @useraddr: userspace address to which data is to be read and returned - * - * Process the various commands of the SIOCETHTOOL interface. - */ -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "ISA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - default: - break; - } - - return -EOPNOTSUPP; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr); } -/** - * netdev_ioctl: Handle network interface ioctls - * @dev: network interface on which out-of-band action is to be performed - * @rq: user request data - * @cmd: command issued by user - * - * Process the various out-of-band ioctls passed to this driver. - */ - -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) -{ - int rc = 0; - - switch (cmd) { - case SIOCETHTOOL: - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - break; - - default: - rc = -EOPNOTSUPP; - break; - } - - return rc; -} - +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; #ifdef MODULE #define MAX_EL2_CARDS 4 /* Max number of EL2 cards per module */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/3c505.c linux-2.4.23-pre8/drivers/net/3c505.c --- linux-2.4.22/drivers/net/3c505.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/3c505.c 2003-10-22 22:49:54.000000000 +0000 @@ -1270,86 +1270,30 @@ } } -/** - * netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls - * @dev: network interface on which out-of-band action is to be performed - * @useraddr: userspace address to which data is to be read and returned - * - * Process the various commands of the SIOCETHTOOL interface. - */ -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "ISA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - debug = edata.data; - return 0; - } - - default: - break; - } - - return -EOPNOTSUPP; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr); } -/** - * netdev_ioctl: Handle network interface ioctls - * @dev: network interface on which out-of-band action is to be performed - * @rq: user request data - * @cmd: command issued by user - * - * Process the various out-of-band ioctls passed to this driver. - */ - -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) +static u32 netdev_get_msglevel(struct net_device *dev) { - int rc = 0; - - switch (cmd) { - case SIOCETHTOOL: - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - break; - - default: - rc = -EOPNOTSUPP; - break; - } + return debug; +} - return rc; +static void netdev_set_msglevel(struct net_device *dev, u32 level) +{ + debug = level; } - + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +}; /****************************************************** * @@ -1371,7 +1315,7 @@ dev->tx_timeout = elp_timeout; /* local */ dev->watchdog_timeo = 10*HZ; dev->set_multicast_list = elp_set_mc_list; /* local */ - dev->do_ioctl = netdev_ioctl; /* local */ + dev->ethtool_ops = &netdev_ethtool_ops; /* local */ /* Setup the generic properties */ ether_setup(dev); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/3c507.c linux-2.4.23-pre8/drivers/net/3c507.c --- linux-2.4.22/drivers/net/3c507.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/3c507.c 2003-10-22 22:49:16.000000000 +0000 @@ -305,7 +305,7 @@ static void hardware_send_packet(struct net_device *dev, void *buf, short length, short pad); static void init_82586_mem(struct net_device *dev); -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; /* Check for a network adaptor of this type, and return '0' iff one exists. @@ -437,7 +437,7 @@ dev->get_stats = el16_get_stats; dev->tx_timeout = el16_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; - dev->do_ioctl = netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; ether_setup(dev); /* Generic ethernet behaviour */ @@ -879,86 +879,29 @@ lp->rx_tail = rx_tail; } -/** - * netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls - * @dev: network interface on which out-of-band action is to be performed - * @useraddr: userspace address to which data is to be read and returned - * - * Process the various commands of the SIOCETHTOOL interface. - */ - -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "ISA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - debug = edata.data; - return 0; - } - - default: - break; - } - - return -EOPNOTSUPP; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr); } -/** - * netdev_ioctl: Handle network interface ioctls - * @dev: network interface on which out-of-band action is to be performed - * @rq: user request data - * @cmd: command issued by user - * - * Process the various out-of-band ioctls passed to this driver. - */ - -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) +static u32 netdev_get_msglevel(struct net_device *dev) { - int rc = 0; - - switch (cmd) { - case SIOCETHTOOL: - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - break; - - default: - rc = -EOPNOTSUPP; - break; - } + return debug; +} - return rc; +static void netdev_set_msglevel(struct net_device *dev, u32 level) +{ + debug = level; } - + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +}; #ifdef MODULE static struct net_device dev_3c507; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/3c515.c linux-2.4.23-pre8/drivers/net/3c515.c --- linux-2.4.22/drivers/net/3c515.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/3c515.c 2003-10-22 22:47:51.000000000 +0000 @@ -406,7 +406,7 @@ static void update_stats(int addr, struct net_device *dev); static struct net_device_stats *corkscrew_get_stats(struct net_device *dev); static void set_rx_mode(struct net_device *dev); -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; /* @@ -736,7 +736,7 @@ dev->stop = &corkscrew_close; dev->get_stats = &corkscrew_get_stats; dev->set_multicast_list = &set_rx_mode; - dev->do_ioctl = netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; return 0; } @@ -1608,86 +1608,30 @@ outw(new_mode, ioaddr + EL3_CMD); } -/** - * netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls - * @dev: network interface on which out-of-band action is to be performed - * @useraddr: userspace address to which data is to be read and returned - * - * Process the various commands of the SIOCETHTOOL interface. - */ - -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "ISA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = corkscrew_debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - corkscrew_debug = edata.data; - return 0; - } - - default: - break; - } - - return -EOPNOTSUPP; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr); } -/** - * netdev_ioctl: Handle network interface ioctls - * @dev: network interface on which out-of-band action is to be performed - * @rq: user request data - * @cmd: command issued by user - * - * Process the various out-of-band ioctls passed to this driver. - */ - -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) +static u32 netdev_get_msglevel(struct net_device *dev) { - int rc = 0; + return corkscrew_debug; +} - switch (cmd) { - case SIOCETHTOOL: - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - break; +static void netdev_set_msglevel(struct net_device *dev, u32 level) +{ + corkscrew_debug = level; +} - default: - rc = -EOPNOTSUPP; - break; - } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +}; - return rc; -} - #ifdef MODULE void cleanup_module(void) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/3c523.c linux-2.4.23-pre8/drivers/net/3c523.c --- linux-2.4.22/drivers/net/3c523.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/3c523.c 2003-10-22 22:48:55.000000000 +0000 @@ -190,7 +190,7 @@ #ifdef ELMC_MULTICAST static void set_multicast_list(struct net_device *dev); #endif -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; /* helper-functions */ static int init586(struct net_device *dev); @@ -573,7 +573,7 @@ #else dev->set_multicast_list = NULL; #endif - dev->do_ioctl = netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; ether_setup(dev); @@ -1228,70 +1228,17 @@ } #endif -/** - * netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls - * @dev: network interface on which out-of-band action is to be performed - * @useraddr: userspace address to which data is to be read and returned - * - * Process the various commands of the SIOCETHTOOL interface. - */ - -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "MCA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - default: - break; - } - - return -EOPNOTSUPP; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "MCA 0x%lx", dev->base_addr); } -/** - * netdev_ioctl: Handle network interface ioctls - * @dev: network interface on which out-of-band action is to be performed - * @rq: user request data - * @cmd: command issued by user - * - * Process the various out-of-band ioctls passed to this driver. - */ - -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) -{ - int rc = 0; - - switch (cmd) { - case SIOCETHTOOL: - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - break; - - default: - rc = -EOPNOTSUPP; - break; - } - - return rc; -} - -/*************************************************************************/ +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; #ifdef MODULE diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/3c527.c linux-2.4.23-pre8/drivers/net/3c527.c --- linux-2.4.22/drivers/net/3c527.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/3c527.c 2003-10-22 22:49:01.000000000 +0000 @@ -220,7 +220,7 @@ static struct net_device_stats *mc32_get_stats(struct net_device *dev); static void mc32_set_multicast_list(struct net_device *dev); static void mc32_reset_multicast_list(struct net_device *dev); -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; /** * mc32_probe - Search for supported boards @@ -510,7 +510,7 @@ dev->set_multicast_list = mc32_set_multicast_list; dev->tx_timeout = mc32_timeout; dev->watchdog_timeo = HZ*5; /* Board does all the work */ - dev->do_ioctl = netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; lp->xceiver_state = HALTED; @@ -1083,15 +1083,16 @@ /* NP is the buffer we will be loading */ np=lp->tx_ring[lp->tx_ring_head].p; - /* We will need this to flush the buffer out */ - lp->tx_ring[lp->tx_ring_head].skb=skb; - if(skb->len < ETH_ZLEN) { skb = skb_padto(skb, ETH_ZLEN); if(skb == NULL) goto out; } + + /* We will need this to flush the buffer out */ + lp->tx_ring[lp->tx_ring_head].skb=skb; + np->length = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len; np->data = virt_to_bus(skb->data); @@ -1658,86 +1659,30 @@ do_mc32_set_multicast_list(dev,1); } -/** - * netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls - * @dev: network interface on which out-of-band action is to be performed - * @useraddr: userspace address to which data is to be read and returned - * - * Process the various commands of the SIOCETHTOOL interface. - */ - -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "MCA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = mc32_debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - mc32_debug = edata.data; - return 0; - } - - default: - break; - } - - return -EOPNOTSUPP; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "MCA 0x%lx", dev->base_addr); } -/** - * netdev_ioctl: Handle network interface ioctls - * @dev: network interface on which out-of-band action is to be performed - * @rq: user request data - * @cmd: command issued by user - * - * Process the various out-of-band ioctls passed to this driver. - */ +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return mc32_debug; +} -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) +static void netdev_set_msglevel(struct net_device *dev, u32 level) { - int rc = 0; + mc32_debug = level; +} - switch (cmd) { - case SIOCETHTOOL: - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - break; +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +}; - default: - rc = -EOPNOTSUPP; - break; - } - - return rc; -} - #ifdef MODULE static struct net_device this_device; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/3c59x.c linux-2.4.23-pre8/drivers/net/3c59x.c --- linux-2.4.22/drivers/net/3c59x.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/3c59x.c 2003-10-22 22:47:28.000000000 +0000 @@ -429,7 +429,6 @@ CH_3C905B_2, CH_3C905B_FX, CH_3C905C, - CH_3C905C2, CH_3C980, CH_3C9805, @@ -450,6 +449,9 @@ CH_3C920, CH_3C982A, CH_3C982B, + + CH_905BT4, + CH_920B_EMB_WNM, }; @@ -503,8 +505,6 @@ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c905C Tornado", PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, - {"3c905C Tornado 2", - PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, {"3c980 Cyclone", PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, {"3c980C Python-T", @@ -550,6 +550,11 @@ {"3c982 Hydra Dual Port B", PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_HWCKSM|HAS_NWAY, 128, }, + {"3c905B-T4", + PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, + {"3c920B-EMB-WNM Tornado", + PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, + {0,}, /* 0 terminated list. */ }; @@ -576,7 +581,6 @@ { 0x10B7, 0x9058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_2 }, { 0x10B7, 0x905A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_FX }, { 0x10B7, 0x9200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905C }, - { 0x10B7, 0x9201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905C2 }, { 0x10B7, 0x9800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C980 }, { 0x10B7, 0x9805, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C9805 }, @@ -597,6 +601,10 @@ { 0x10B7, 0x9201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C920 }, { 0x10B7, 0x1201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C982A }, { 0x10B7, 0x1202, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C982B }, + + { 0x10B7, 0x9056, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_905BT4 }, + { 0x10B7, 0x9210, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_920B_EMB_WNM }, + {0,} /* 0 terminated list. */ }; MODULE_DEVICE_TABLE(pci, vortex_pci_tbl); @@ -866,6 +874,7 @@ static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static void vortex_tx_timeout(struct net_device *dev); static void acpi_set_WOL(struct net_device *dev); +static struct ethtool_ops vortex_ethtool_ops; /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */ /* Option count limit only -- unlimited interfaces are supported. */ @@ -1330,6 +1339,7 @@ dev->stop = vortex_close; dev->get_stats = vortex_get_stats; dev->do_ioctl = vortex_ioctl; + dev->ethtool_ops = &vortex_ethtool_ops; dev->set_multicast_list = set_rx_mode; dev->tx_timeout = vortex_tx_timeout; dev->watchdog_timeo = (watchdog * HZ) / 1000; @@ -2690,35 +2700,24 @@ return; } - -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void vortex_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { struct vortex_private *vp = dev->priv; - 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, DRV_NAME); - strcpy(info.version, DRV_VERSION); - if (vp->pdev) - strcpy(info.bus_info, vp->pdev->slot_name); - else - sprintf(info.bus_info, "EISA 0x%lx %d", - dev->base_addr, dev->irq); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - - } - - return -EOPNOTSUPP; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + if (vp->pdev) + strcpy(info->bus_info, pci_name(vp->pdev)); + else + sprintf(info->bus_info, "EISA 0x%lx %d", + dev->base_addr, dev->irq); } +static struct ethtool_ops vortex_ethtool_ops = { + .get_drvinfo = vortex_get_drvinfo, +}; + static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct vortex_private *vp = (struct vortex_private *)dev->priv; @@ -2728,9 +2727,6 @@ int retval; switch(cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - case SIOCGMIIPHY: /* Get address of MII PHY in use. */ case SIOCDEVPRIVATE: /* for binary compat, remove in 2.5 */ data->phy_id = phy; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/8139cp.c linux-2.4.23-pre8/drivers/net/8139cp.c --- linux-2.4.22/drivers/net/8139cp.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/8139cp.c 2003-10-22 22:48:53.000000000 +0000 @@ -24,15 +24,13 @@ PCI suspend/resume - Felipe Damasio LinkChg interrupt - Felipe Damasio - TODO, in rough priority order: + TODO: * Test Tx checksumming thoroughly - * dev->tx_timeout - * Constants (module parms?) for Rx work limit + * Implement dev->tx_timeout + + Low priority TODO: * Complete reset on PciErr * Consider Rx interrupt mitigation using TimerIntr - * Implement 8139C+ statistics dump; maybe not... - h/w stats can be reset only by software reset - * Handle netif_rx return value * Investigate using skb->priority with h/w VLAN priority * Investigate using High Priority Tx Queue with skb->priority * Adjust Rx FIFO threshold and Max Rx DMA burst on Rx FIFO error @@ -41,14 +39,17 @@ Tx descriptor bit * The real minimum of CP_MIN_MTU is 4 bytes. However, for this to be supported, one must(?) turn on packet padding. - * Support 8169 GMII - * Support external MII transceivers + * Support external MII transceivers (patch available) + + NOTES: + * TX checksumming is considered experimental. It is off by + default, use ethtool to turn it on. */ #define DRV_NAME "8139cp" -#define DRV_VERSION "0.3.0" -#define DRV_RELDATE "Sep 29, 2002" +#define DRV_VERSION "1.1" +#define DRV_RELDATE "Aug 30, 2003" #include @@ -71,9 +72,6 @@ #include #include -/* experimental TX checksumming feature enable/disable */ -#undef CP_TX_CHECKSUM - /* VLAN tagging feature enable/disable */ #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) #define CP_VLAN_TAG_USED 1 @@ -86,7 +84,7 @@ #endif /* These identify the driver base version and may not be removed. */ -static char version[] __devinitdata = +static char version[] = KERN_INFO DRV_NAME ": 10/100 PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE ")\n"; MODULE_AUTHOR("Jeff Garzik "); @@ -160,6 +158,7 @@ TxConfig = 0x40, /* Tx configuration */ ChipVersion = 0x43, /* 8-bit chip version, inside TxConfig */ RxConfig = 0x44, /* Rx configuration */ + RxMissed = 0x4C, /* 24 bits valid, write clears */ Cfg9346 = 0x50, /* EEPROM select/control; Cfg reg [un]lock */ Config1 = 0x52, /* Config1 */ Config3 = 0x59, /* Config3 */ @@ -292,12 +291,11 @@ UWF = (1 << 4), /* Accept Unicast wakeup frame */ LANWake = (1 << 1), /* Enable LANWake signal */ PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */ -}; -static const unsigned int cp_intr_mask = - PciErr | LinkChg | - RxOK | RxErr | RxEmpty | RxFIFOOvr | - TxOK | TxErr | TxEmpty; + cp_norx_intr_mask = PciErr | LinkChg | TxOK | TxErr | TxEmpty, + cp_rx_intr_mask = RxOK | RxErr | RxEmpty | RxFIFOOvr, + cp_intr_mask = cp_rx_intr_mask | cp_norx_intr_mask, +}; static const unsigned int cp_rx_config = (RX_FIFO_THRESH << RxCfgFIFOShift) | @@ -364,11 +362,7 @@ struct pci_dev *pdev; u32 rx_config; - - struct sk_buff *frag_skb; - unsigned dropping_frag : 1; - unsigned pci_using_dac : 1; - unsigned int board_type; + u16 cpcmd; unsigned int wol_enabled : 1; /* Is Wake-on-LAN enabled? */ u32 power_state[16]; @@ -400,28 +394,9 @@ static void cp_tx (struct cp_private *cp); static void cp_clean_rings (struct cp_private *cp); -enum board_type { - RTL8139Cp, - RTL8169, -}; - -static struct cp_board_info { - const char *name; -} cp_board_tbl[] __devinitdata = { - /* RTL8139Cp */ - { "RTL-8139C+" }, - - /* RTL8169 */ - { "RTL-8169" }, -}; - -static struct pci_device_id cp_pci_tbl[] __devinitdata = { +static struct pci_device_id cp_pci_tbl[] = { { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139Cp }, -#if 0 - { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8169, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8169 }, -#endif + PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, { }, }; MODULE_DEVICE_TABLE(pci, cp_pci_tbl); @@ -446,6 +421,31 @@ }; +#if CP_VLAN_TAG_USED +static void cp_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) +{ + struct cp_private *cp = dev->priv; + + spin_lock_irq(&cp->lock); + cp->vlgrp = grp; + cp->cpcmd |= RxVlanOn; + cpw16(CpCmd, cp->cpcmd); + spin_unlock_irq(&cp->lock); +} + +static void cp_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) +{ + struct cp_private *cp = dev->priv; + + spin_lock_irq(&cp->lock); + cp->cpcmd &= ~RxVlanOn; + cpw16(CpCmd, cp->cpcmd); + if (cp->vlgrp) + cp->vlgrp->vlan_devices[vid] = NULL; + spin_unlock_irq(&cp->lock); +} +#endif /* CP_VLAN_TAG_USED */ + static inline void cp_set_rxbufsize (struct cp_private *cp) { unsigned int mtu = cp->dev->mtu; @@ -468,10 +468,11 @@ #if CP_VLAN_TAG_USED if (cp->vlgrp && (desc->opts2 & RxVlanTagged)) { - vlan_hwaccel_rx(skb, cp->vlgrp, desc->opts2 & 0xffff); + vlan_hwaccel_receive_skb(skb, cp->vlgrp, + be16_to_cpu(desc->opts2 & 0xffff)); } else #endif - netif_rx(skb); + netif_receive_skb(skb); } static void cp_rx_err_acct (struct cp_private *cp, unsigned rx_tail, @@ -486,81 +487,14 @@ cp->net_stats.rx_frame_errors++; if (status & RxErrCRC) cp->net_stats.rx_crc_errors++; - if (status & RxErrRunt) + if ((status & RxErrRunt) || (status & RxErrLong)) cp->net_stats.rx_length_errors++; - if (status & RxErrLong) + if ((status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag)) cp->net_stats.rx_length_errors++; if (status & RxErrFIFO) cp->net_stats.rx_fifo_errors++; } -static void cp_rx_frag (struct cp_private *cp, unsigned rx_tail, - struct sk_buff *skb, u32 status, u32 len) -{ - struct sk_buff *copy_skb, *frag_skb = cp->frag_skb; - unsigned orig_len = frag_skb ? frag_skb->len : 0; - unsigned target_len = orig_len + len; - unsigned first_frag = status & FirstFrag; - unsigned last_frag = status & LastFrag; - - if (netif_msg_rx_status (cp)) - printk (KERN_DEBUG "%s: rx %s%sfrag, slot %d status 0x%x len %d\n", - cp->dev->name, - cp->dropping_frag ? "dropping " : "", - first_frag ? "first " : - last_frag ? "last " : "", - rx_tail, status, len); - - cp->cp_stats.rx_frags++; - - if (!frag_skb && !first_frag) - cp->dropping_frag = 1; - if (cp->dropping_frag) - goto drop_frag; - - copy_skb = dev_alloc_skb (target_len + RX_OFFSET); - if (!copy_skb) { - printk(KERN_WARNING "%s: rx slot %d alloc failed\n", - cp->dev->name, rx_tail); - - cp->dropping_frag = 1; -drop_frag: - if (frag_skb) { - dev_kfree_skb_irq(frag_skb); - cp->frag_skb = NULL; - } - if (last_frag) { - cp->net_stats.rx_dropped++; - cp->dropping_frag = 0; - } - return; - } - - copy_skb->dev = cp->dev; - skb_reserve(copy_skb, RX_OFFSET); - skb_put(copy_skb, target_len); - if (frag_skb) { - memcpy(copy_skb->data, frag_skb->data, orig_len); - dev_kfree_skb_irq(frag_skb); - } - pci_dma_sync_single(cp->pdev, cp->rx_skb[rx_tail].mapping, - len, PCI_DMA_FROMDEVICE); - memcpy(copy_skb->data + orig_len, skb->data, len); - - copy_skb->ip_summed = CHECKSUM_NONE; - - if (last_frag) { - if (status & (RxError | RxErrFIFO)) { - cp_rx_err_acct(cp, rx_tail, status, len); - dev_kfree_skb_irq(copy_skb); - } else - cp_rx_skb(cp, copy_skb, &cp->rx_ring[rx_tail]); - cp->frag_skb = NULL; - } else { - cp->frag_skb = copy_skb; - } -} - static inline unsigned int cp_rx_csum_ok (u32 status) { unsigned int protocol = (status >> 16) & 0x3; @@ -574,12 +508,18 @@ return 0; } -static void cp_rx (struct cp_private *cp) +static int cp_rx_poll (struct net_device *dev, int *budget) { + struct cp_private *cp = dev->priv; unsigned rx_tail = cp->rx_tail; - unsigned rx_work = 100; + unsigned rx_work = dev->quota; + unsigned rx; - while (rx_work--) { +rx_status_loop: + rx = 0; + cpw16(IntrStatus, cp_rx_intr_mask); + + while (1) { u32 status, len; dma_addr_t mapping; struct sk_buff *skb, *new_skb; @@ -599,7 +539,14 @@ mapping = cp->rx_skb[rx_tail].mapping; if ((status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag)) { - cp_rx_frag(cp, rx_tail, skb, status, len); + /* we don't support incoming fragmented frames. + * instead, we attempt to ensure that the + * pre-allocated RX skbs are properly sized such + * that RX fragments are never encountered + */ + cp_rx_err_acct(cp, rx_tail, status, len); + cp->net_stats.rx_dropped++; + cp->cp_stats.rx_frags++; goto rx_next; } @@ -640,6 +587,7 @@ cp->rx_skb[rx_tail].skb = new_skb; cp_rx_skb(cp, skb, desc); + rx++; rx_next: cp->rx_ring[rx_tail].opts2 = 0; @@ -650,15 +598,34 @@ else desc->opts1 = cpu_to_le32(DescOwn | cp->rx_buf_sz); rx_tail = NEXT_RX(rx_tail); - } - if (!rx_work) - printk(KERN_WARNING "%s: rx work limit reached\n", cp->dev->name); + if (!rx_work--) + break; + } cp->rx_tail = rx_tail; + + dev->quota -= rx; + *budget -= rx; + + /* if we did not reach work limit, then we're done with + * this round of polling + */ + if (rx_work) { + if (cpr16(IntrStatus) & cp_rx_intr_mask) + goto rx_status_loop; + + cpw16_f(IntrMask, cp_intr_mask); + netif_rx_complete(dev); + + return 0; /* done */ + } + + return 1; /* not done */ } -static void cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t +cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = dev_instance; struct cp_private *cp = dev->priv; @@ -666,18 +633,22 @@ status = cpr16(IntrStatus); if (!status || (status == 0xFFFF)) - return; + return IRQ_NONE; if (netif_msg_intr(cp)) printk(KERN_DEBUG "%s: intr, status %04x cmd %02x cpcmd %04x\n", dev->name, status, cpr8(Cmd), cpr16(CpCmd)); - cpw16_f(IntrStatus, status); + cpw16(IntrStatus, status & ~cp_rx_intr_mask); spin_lock(&cp->lock); - if (status & (RxOK | RxErr | RxEmpty | RxFIFOOvr)) - cp_rx(cp); + if (status & (RxOK | RxErr | RxEmpty | RxFIFOOvr)) { + if (netif_rx_schedule_prep(dev)) { + cpw16_f(IntrMask, cp_norx_intr_mask); + __netif_rx_schedule(dev); + } + } if (status & (TxOK | TxErr | TxEmpty | SWInt)) cp_tx(cp); if (status & LinkChg) @@ -690,9 +661,12 @@ pci_write_config_word(cp->pdev, PCI_STATUS, pci_status); printk(KERN_ERR "%s: PCI bus error, status=%04x, PCI status=%04x\n", dev->name, status, pci_status); + + /* TODO: reset hardware */ } spin_unlock(&cp->lock); + return IRQ_HANDLED; } static void cp_tx (struct cp_private *cp) @@ -748,7 +722,7 @@ cp->tx_tail = tx_tail; - if (netif_queue_stopped(cp->dev) && (TX_BUFFS_AVAIL(cp) > (MAX_SKB_FRAGS + 1))) + if (TX_BUFFS_AVAIL(cp) > (MAX_SKB_FRAGS + 1)) netif_wake_queue(cp->dev); } @@ -774,7 +748,7 @@ #if CP_VLAN_TAG_USED if (cp->vlgrp && vlan_tx_tag_present(skb)) - vlan_tag = TxVlanTag | vlan_tx_tag_get(skb); + vlan_tag = TxVlanTag | cpu_to_be16(vlan_tx_tag_get(skb)); #endif entry = cp->tx_head; @@ -790,7 +764,6 @@ txd->addr = cpu_to_le64(mapping); wmb(); -#ifdef CP_TX_CHECKSUM if (skb->ip_summed == CHECKSUM_HW) { const struct iphdr *ip = skb->nh.iph; if (ip->protocol == IPPROTO_TCP) @@ -804,7 +777,6 @@ else BUG(); } else -#endif txd->opts1 = cpu_to_le32(eor | len | DescOwn | FirstFrag | LastFrag); wmb(); @@ -818,15 +790,13 @@ u32 first_len, first_eor; dma_addr_t first_mapping; int frag, first_entry = entry; -#ifdef CP_TX_CHECKSUM const struct iphdr *ip = skb->nh.iph; -#endif /* We must give this initial chunk to the device last. * Otherwise we could race with the device. */ first_eor = eor; - first_len = skb->len - skb->data_len; + first_len = skb_headlen(skb); first_mapping = pci_map_single(cp->pdev, skb->data, first_len, PCI_DMA_TODEVICE); cp->tx_skb[entry].skb = skb; @@ -846,7 +816,7 @@ this_frag->page_offset), len, PCI_DMA_TODEVICE); eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; -#ifdef CP_TX_CHECKSUM + if (skb->ip_summed == CHECKSUM_HW) { ctrl = eor | len | DescOwn | IPCS; if (ip->protocol == IPPROTO_TCP) @@ -856,7 +826,6 @@ else BUG(); } else -#endif ctrl = eor | len | DescOwn; if (frag == skb_shinfo(skb)->nr_frags - 1) @@ -881,7 +850,6 @@ txd->addr = cpu_to_le64(first_mapping); wmb(); -#ifdef CP_TX_CHECKSUM if (skb->ip_summed == CHECKSUM_HW) { if (ip->protocol == IPPROTO_TCP) txd->opts1 = cpu_to_le32(first_eor | first_len | @@ -894,7 +862,6 @@ else BUG(); } else -#endif txd->opts1 = cpu_to_le32(first_eor | first_len | FirstFrag | DescOwn); wmb(); @@ -973,7 +940,9 @@ static void __cp_get_stats(struct cp_private *cp) { - /* XXX implement */ + /* only lower 24 bits valid; write any value to clear */ + cp->net_stats.rx_missed_errors += (cpr32 (RxMissed) & 0xffffff); + cpw32 (RxMissed, 0); } static struct net_device_stats *cp_get_stats(struct net_device *dev) @@ -991,17 +960,22 @@ static void cp_stop_hw (struct cp_private *cp) { - cpw16(IntrMask, 0); - cpr16(IntrMask); + struct net_device *dev = cp->dev; + + cpw16(IntrStatus, ~(cpr16(IntrStatus))); + cpw16_f(IntrMask, 0); cpw8(Cmd, 0); - cpw16(CpCmd, 0); - cpr16(CpCmd); + cpw16_f(CpCmd, 0); cpw16(IntrStatus, ~(cpr16(IntrStatus))); synchronize_irq(); udelay(10); cp->rx_tail = 0; cp->tx_head = cp->tx_tail = 0; + + (void) dev; /* avoid compiler warning when synchronize_irq() + * disappears during !CONFIG_SMP + */ } static void cp_reset_hw (struct cp_private *cp) @@ -1023,11 +997,7 @@ static inline void cp_start_hw (struct cp_private *cp) { - u16 pci_dac = cp->pci_using_dac ? PCIDAC : 0; - if (cp->board_type == RTL8169) - cpw16(CpCmd, pci_dac | PCIMulRW | RxChkSum); - else - cpw16(CpCmd, pci_dac | PCIMulRW | RxChkSum | CpRxOn | CpTxOn); + cpw16(CpCmd, cp->cpcmd); cpw8(Cmd, RxOn | TxOn); } @@ -1051,13 +1021,10 @@ cpw8(Config1, cpr8(Config1) | DriverLoaded | PMEnable); /* Disable Wake-on-LAN. Can be turned on with ETHTOOL_SWOL */ - if (cp->board_type == RTL8139Cp) { - cpw8(Config3, PARMEnable); - cp->wol_enabled = 0; - } + cpw8(Config3, PARMEnable); + cp->wol_enabled = 0; + cpw8(Config5, cpr8(Config5) & PMEStatus); - if (cp->board_type == RTL8169) - cpw16(RxMaxSize, cp->rx_buf_sz); cpw32_f(HiTxRingAddr, 0); cpw32_f(HiTxRingAddr + 4, 0); @@ -1250,8 +1217,6 @@ dev->mtu = new_mtu; cp_set_rxbufsize(cp); /* set new rx buf size */ - if (cp->board_type == RTL8169) - cpw16(RxMaxSize, cp->rx_buf_sz); rc = cp_init_rings(cp); /* realloc and restart h/w */ cp_start_hw(cp); @@ -1296,8 +1261,8 @@ } /* Set the ethtool Wake-on-LAN settings */ -static void netdev_set_wol (struct cp_private *cp, - const struct ethtool_wolinfo *wol) +static int netdev_set_wol (struct cp_private *cp, + const struct ethtool_wolinfo *wol) { u8 options; @@ -1324,6 +1289,8 @@ cpw8 (Config5, options); cp->wol_enabled = (wol->wolopts) ? 1 : 0; + + return 0; } /* Get the ethtool Wake-on-LAN settings */ @@ -1349,308 +1316,205 @@ if (options & MWF) wol->wolopts |= WAKE_MCAST; } -static int cp_ethtool_ioctl (struct cp_private *cp, void *useraddr) +static void cp_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info) { - u32 ethcmd; + struct cp_private *cp = dev->priv; - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ + strcpy (info->driver, DRV_NAME); + strcpy (info->version, DRV_VERSION); + strcpy (info->bus_info, pci_name(cp->pdev)); +} - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - strcpy (info.bus_info, cp->pdev->slot_name); - info.regdump_len = CP_REGS_SIZE; - info.n_stats = CP_NUM_STATS; - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } +static int cp_get_regs_len(struct net_device *dev) +{ + return CP_REGS_SIZE; +} - /* get settings */ - case ETHTOOL_GSET: { - struct ethtool_cmd ecmd = { ETHTOOL_GSET }; - spin_lock_irq(&cp->lock); - mii_ethtool_gset(&cp->mii_if, &ecmd); - spin_unlock_irq(&cp->lock); - if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) - return -EFAULT; - return 0; - } - /* set settings */ - case ETHTOOL_SSET: { - int r; - struct ethtool_cmd ecmd; - if (copy_from_user(&ecmd, useraddr, sizeof(ecmd))) - return -EFAULT; - spin_lock_irq(&cp->lock); - r = mii_ethtool_sset(&cp->mii_if, &ecmd); - spin_unlock_irq(&cp->lock); - return r; - } - /* restart autonegotiation */ - case ETHTOOL_NWAY_RST: { - return mii_nway_restart(&cp->mii_if); - } - /* get link status */ - case ETHTOOL_GLINK: { - struct ethtool_value edata = {ETHTOOL_GLINK}; - edata.data = mii_link_ok(&cp->mii_if); - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } +static int cp_get_stats_count (struct net_device *dev) +{ + return CP_NUM_STATS; +} - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = cp->msg_enable; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - cp->msg_enable = edata.data; - return 0; - } +static int cp_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct cp_private *cp = dev->priv; + int rc; - /* NIC register dump */ - case ETHTOOL_GREGS: { - struct ethtool_regs regs; - u8 *regbuf = kmalloc(CP_REGS_SIZE, GFP_KERNEL); - int rc; - - if (!regbuf) - return -ENOMEM; - memset(regbuf, 0, CP_REGS_SIZE); + spin_lock_irq(&cp->lock); + rc = mii_ethtool_gset(&cp->mii_if, cmd); + spin_unlock_irq(&cp->lock); - rc = copy_from_user(®s, useraddr, sizeof(regs)); - if (rc) { - rc = -EFAULT; - goto err_out_gregs; - } - - if (regs.len > CP_REGS_SIZE) - regs.len = CP_REGS_SIZE; - if (regs.len < CP_REGS_SIZE) { - rc = -EINVAL; - goto err_out_gregs; - } + return rc; +} - regs.version = CP_REGS_VER; - rc = copy_to_user(useraddr, ®s, sizeof(regs)); - if (rc) { - rc = -EFAULT; - goto err_out_gregs; - } +static int cp_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct cp_private *cp = dev->priv; + int rc; - useraddr += offsetof(struct ethtool_regs, data); + spin_lock_irq(&cp->lock); + rc = mii_ethtool_sset(&cp->mii_if, cmd); + spin_unlock_irq(&cp->lock); - spin_lock_irq(&cp->lock); - memcpy_fromio(regbuf, cp->regs, CP_REGS_SIZE); - spin_unlock_irq(&cp->lock); + return rc; +} - if (copy_to_user(useraddr, regbuf, regs.len)) - rc = -EFAULT; +static int cp_nway_reset(struct net_device *dev) +{ + struct cp_private *cp = dev->priv; + return mii_nway_restart(&cp->mii_if); +} -err_out_gregs: - kfree(regbuf); - return rc; - } +static u32 cp_get_msglevel(struct net_device *dev) +{ + struct cp_private *cp = dev->priv; + return cp->msg_enable; +} - /* get/set RX checksumming */ - case ETHTOOL_GRXCSUM: { - struct ethtool_value edata = { ETHTOOL_GRXCSUM }; - u16 cmd = cpr16(CpCmd) & RxChkSum; - - edata.data = cmd ? 1 : 0; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - case ETHTOOL_SRXCSUM: { - struct ethtool_value edata; - u16 cmd = cpr16(CpCmd), newcmd; +static void cp_set_msglevel(struct net_device *dev, u32 value) +{ + struct cp_private *cp = dev->priv; + cp->msg_enable = value; +} - newcmd = cmd; +static u32 cp_get_rx_csum(struct net_device *dev) +{ + struct cp_private *cp = dev->priv; + return (cpr16(CpCmd) & RxChkSum) ? 1 : 0; +} - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; +static int cp_set_rx_csum(struct net_device *dev, u32 data) +{ + struct cp_private *cp = dev->priv; + u16 cmd = cp->cpcmd, newcmd; - if (edata.data) - newcmd |= RxChkSum; - else - newcmd &= ~RxChkSum; + newcmd = cmd; - if (newcmd == cmd) - return 0; + if (data) + newcmd |= RxChkSum; + else + newcmd &= ~RxChkSum; + if (newcmd != cmd) { spin_lock_irq(&cp->lock); + cp->cpcmd = newcmd; cpw16_f(CpCmd, newcmd); spin_unlock_irq(&cp->lock); } - /* get/set TX checksumming */ - case ETHTOOL_GTXCSUM: { - struct ethtool_value edata = { ETHTOOL_GTXCSUM }; - - edata.data = (cp->dev->features & NETIF_F_IP_CSUM) != 0; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - case ETHTOOL_STXCSUM: { - struct ethtool_value edata; - - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - - if (edata.data) - cp->dev->features |= NETIF_F_IP_CSUM; - else - cp->dev->features &= ~NETIF_F_IP_CSUM; - - return 0; - } + return 0; +} - /* get/set scatter-gather */ - case ETHTOOL_GSG: { - struct ethtool_value edata = { ETHTOOL_GSG }; - - edata.data = (cp->dev->features & NETIF_F_SG) != 0; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - case ETHTOOL_SSG: { - struct ethtool_value edata; +static void cp_get_regs(struct net_device *dev, struct ethtool_regs *regs, + void *p) +{ + struct cp_private *cp = dev->priv; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; + if (regs->len < CP_REGS_SIZE) + return /* -EINVAL */; - if (edata.data) - cp->dev->features |= NETIF_F_SG; - else - cp->dev->features &= ~NETIF_F_SG; + regs->version = CP_REGS_VER; - return 0; - } + spin_lock_irq(&cp->lock); + memcpy_fromio(p, cp->regs, CP_REGS_SIZE); + spin_unlock_irq(&cp->lock); +} - /* get string list(s) */ - case ETHTOOL_GSTRINGS: { - struct ethtool_gstrings estr = { ETHTOOL_GSTRINGS }; - - if (copy_from_user(&estr, useraddr, sizeof(estr))) - return -EFAULT; - if (estr.string_set != ETH_SS_STATS) - return -EINVAL; - - estr.len = CP_NUM_STATS; - if (copy_to_user(useraddr, &estr, sizeof(estr))) - return -EFAULT; - if (copy_to_user(useraddr + sizeof(estr), - ðtool_stats_keys, - sizeof(ethtool_stats_keys))) - return -EFAULT; - return 0; - } +static void cp_get_wol (struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct cp_private *cp = dev->priv; - /* get NIC-specific statistics */ - case ETHTOOL_GSTATS: { - struct ethtool_stats estats = { ETHTOOL_GSTATS }; - u64 *tmp_stats; - unsigned int work = 100; - const unsigned int sz = sizeof(u64) * CP_NUM_STATS; - int i; - - /* begin NIC statistics dump */ - cpw32(StatsAddr + 4, 0); /* FIXME: 64-bit PCI */ - cpw32(StatsAddr, cp->nic_stats_dma | DumpStats); - cpr32(StatsAddr); - - estats.n_stats = CP_NUM_STATS; - if (copy_to_user(useraddr, &estats, sizeof(estats))) - return -EFAULT; - - while (work-- > 0) { - if ((cpr32(StatsAddr) & DumpStats) == 0) - break; - cpu_relax(); - } + spin_lock_irq (&cp->lock); + netdev_get_wol (cp, wol); + spin_unlock_irq (&cp->lock); +} - if (cpr32(StatsAddr) & DumpStats) - return -EIO; +static int cp_set_wol (struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct cp_private *cp = dev->priv; + int rc; - tmp_stats = kmalloc(sz, GFP_KERNEL); - if (!tmp_stats) - return -ENOMEM; - memset(tmp_stats, 0, sz); - - i = 0; - tmp_stats[i++] = le64_to_cpu(cp->nic_stats->tx_ok); - tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok); - tmp_stats[i++] = le64_to_cpu(cp->nic_stats->tx_err); - tmp_stats[i++] = le32_to_cpu(cp->nic_stats->rx_err); - tmp_stats[i++] = le16_to_cpu(cp->nic_stats->rx_fifo); - tmp_stats[i++] = le16_to_cpu(cp->nic_stats->frame_align); - tmp_stats[i++] = le32_to_cpu(cp->nic_stats->tx_ok_1col); - tmp_stats[i++] = le32_to_cpu(cp->nic_stats->tx_ok_mcol); - tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok_phys); - tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok_bcast); - tmp_stats[i++] = le32_to_cpu(cp->nic_stats->rx_ok_mcast); - tmp_stats[i++] = le16_to_cpu(cp->nic_stats->tx_abort); - tmp_stats[i++] = le16_to_cpu(cp->nic_stats->tx_underrun); - tmp_stats[i++] = cp->cp_stats.rx_frags; - if (i != CP_NUM_STATS) - BUG(); + spin_lock_irq (&cp->lock); + rc = netdev_set_wol (cp, wol); + spin_unlock_irq (&cp->lock); - i = copy_to_user(useraddr + sizeof(estats), - tmp_stats, sz); - kfree(tmp_stats); + return rc; +} - if (i) - return -EFAULT; - return 0; +static void cp_get_strings (struct net_device *dev, u32 stringset, u8 *buf) +{ + switch (stringset) { + case ETH_SS_STATS: + memcpy(buf, ðtool_stats_keys, sizeof(ethtool_stats_keys)); + break; + default: + BUG(); + break; } +} - /* get/set Wake-on-LAN settings */ - case ETHTOOL_GWOL: { - struct ethtool_wolinfo wol = { ETHTOOL_GWOL }; - - spin_lock_irq (&cp->lock); - netdev_get_wol (cp, &wol); - spin_unlock_irq (&cp->lock); - return ((copy_to_user (useraddr, &wol, sizeof (wol)))? -EFAULT : 0); - } - - case ETHTOOL_SWOL: { - struct ethtool_wolinfo wol; +static void cp_get_ethtool_stats (struct net_device *dev, + struct ethtool_stats *estats, u64 *tmp_stats) +{ + struct cp_private *cp = dev->priv; + unsigned int work = 100; + int i; - if (copy_from_user (&wol, useraddr, sizeof (wol))) - return -EFAULT; - spin_lock_irq (&cp->lock); - netdev_set_wol (cp, &wol); - spin_unlock_irq (&cp->lock); - return 0; - } + /* begin NIC statistics dump */ + cpw32(StatsAddr + 4, 0); /* FIXME: 64-bit PCI */ + cpw32(StatsAddr, cp->nic_stats_dma | DumpStats); + cpr32(StatsAddr); - default: - break; + while (work-- > 0) { + if ((cpr32(StatsAddr) & DumpStats) == 0) + break; + cpu_relax(); } - return -EOPNOTSUPP; + if (cpr32(StatsAddr) & DumpStats) + return /* -EIO */; + + i = 0; + tmp_stats[i++] = le64_to_cpu(cp->nic_stats->tx_ok); + tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok); + tmp_stats[i++] = le64_to_cpu(cp->nic_stats->tx_err); + tmp_stats[i++] = le32_to_cpu(cp->nic_stats->rx_err); + tmp_stats[i++] = le16_to_cpu(cp->nic_stats->rx_fifo); + tmp_stats[i++] = le16_to_cpu(cp->nic_stats->frame_align); + tmp_stats[i++] = le32_to_cpu(cp->nic_stats->tx_ok_1col); + tmp_stats[i++] = le32_to_cpu(cp->nic_stats->tx_ok_mcol); + tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok_phys); + tmp_stats[i++] = le64_to_cpu(cp->nic_stats->rx_ok_bcast); + tmp_stats[i++] = le32_to_cpu(cp->nic_stats->rx_ok_mcast); + tmp_stats[i++] = le16_to_cpu(cp->nic_stats->tx_abort); + tmp_stats[i++] = le16_to_cpu(cp->nic_stats->tx_underrun); + tmp_stats[i++] = cp->cp_stats.rx_frags; + if (i != CP_NUM_STATS) + BUG(); } +static struct ethtool_ops cp_ethtool_ops = { + .get_drvinfo = cp_get_drvinfo, + .get_regs_len = cp_get_regs_len, + .get_stats_count = cp_get_stats_count, + .get_settings = cp_get_settings, + .set_settings = cp_set_settings, + .nway_reset = cp_nway_reset, + .get_link = ethtool_op_get_link, + .get_msglevel = cp_get_msglevel, + .set_msglevel = cp_set_msglevel, + .get_rx_csum = cp_get_rx_csum, + .set_rx_csum = cp_set_rx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = ethtool_op_set_tx_csum, /* local! */ + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, + .get_regs = cp_get_regs, + .get_wol = cp_get_wol, + .set_wol = cp_set_wol, + .get_strings = cp_get_strings, + .get_ethtool_stats = cp_get_ethtool_stats, +}; static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) { @@ -1661,38 +1525,12 @@ if (!netif_running(dev)) return -EINVAL; - if (cmd == SIOCETHTOOL) - return cp_ethtool_ioctl(cp, (void *) rq->ifr_data); - spin_lock_irq(&cp->lock); rc = generic_mii_ioctl(&cp->mii_if, mii, cmd, NULL); spin_unlock_irq(&cp->lock); return rc; } -#if CP_VLAN_TAG_USED -static void cp_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) -{ - struct cp_private *cp = dev->priv; - - spin_lock_irq(&cp->lock); - cp->vlgrp = grp; - cpw16(CpCmd, cpr16(CpCmd) | RxVlanOn); - spin_unlock_irq(&cp->lock); -} - -static void cp_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) -{ - struct cp_private *cp = dev->priv; - - spin_lock_irq(&cp->lock); - cpw16(CpCmd, cpr16(CpCmd) & ~RxVlanOn); - if (cp->vlgrp) - cp->vlgrp->vlan_devices[vid] = NULL; - spin_unlock_irq(&cp->lock); -} -#endif - /* Serial EEPROM section. */ /* EEPROM_Ctrl bits. */ @@ -1715,7 +1553,7 @@ #define EE_READ_CMD (6) #define EE_ERASE_CMD (7) -static int __devinit read_eeprom (void *ioaddr, int location, int addr_len) +static int read_eeprom (void *ioaddr, int location, int addr_len) { int i; unsigned retval = 0; @@ -1761,17 +1599,15 @@ pci_set_power_state (cp->pdev, 3); } -static int __devinit cp_init_one (struct pci_dev *pdev, - const struct pci_device_id *ent) +static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) { struct net_device *dev; struct cp_private *cp; int rc; void *regs; long pciaddr; - unsigned int addr_len, i; - u8 pci_rev, cache_size; - unsigned int board_type = (unsigned int) ent->driver_data; + unsigned int addr_len, i, pci_using_dac; + u8 pci_rev; #ifndef MODULE static int version_printed; @@ -1784,7 +1620,7 @@ if (pdev->vendor == PCI_VENDOR_ID_REALTEK && pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev < 0x20) { printk(KERN_ERR PFX "pci dev %s (id %04x:%04x rev %02x) is not an 8139C+ compatible chip\n", - pdev->slot_name, pdev->vendor, pdev->device, pci_rev); + pci_name(pdev), pdev->vendor, pdev->device, pci_rev); printk(KERN_ERR PFX "Try the \"8139too\" driver instead.\n"); return -ENODEV; } @@ -1795,7 +1631,6 @@ SET_MODULE_OWNER(dev); cp = dev->priv; cp->pdev = pdev; - cp->board_type = board_type; cp->dev = dev; cp->msg_enable = (debug < 0 ? CP_DEF_MSG_ENABLE : debug); spin_lock_init (&cp->lock); @@ -1811,48 +1646,56 @@ if (rc) goto err_out_free; - rc = pci_request_regions(pdev, DRV_NAME); + rc = pci_set_mwi(pdev); if (rc) goto err_out_disable; + rc = pci_request_regions(pdev, DRV_NAME); + if (rc) + goto err_out_mwi; + if (pdev->irq < 2) { rc = -EIO; printk(KERN_ERR PFX "invalid irq (%d) for pci dev %s\n", - pdev->irq, pdev->slot_name); + pdev->irq, pci_name(pdev)); goto err_out_res; } pciaddr = pci_resource_start(pdev, 1); if (!pciaddr) { rc = -EIO; printk(KERN_ERR PFX "no MMIO resource for pci dev %s\n", - pdev->slot_name); + pci_name(pdev)); goto err_out_res; } if (pci_resource_len(pdev, 1) < CP_REGS_SIZE) { rc = -EIO; printk(KERN_ERR PFX "MMIO resource (%lx) too small on pci dev %s\n", - pci_resource_len(pdev, 1), pdev->slot_name); + pci_resource_len(pdev, 1), pci_name(pdev)); goto err_out_res; } /* Configure DMA attributes. */ - if (!pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL)) { - cp->pci_using_dac = 1; + if ((sizeof(dma_addr_t) > 32) && + !pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) { + pci_using_dac = 1; } else { - rc = pci_set_dma_mask(pdev, (u64) 0xffffffff); + rc = pci_set_dma_mask(pdev, 0xffffffffULL); if (rc) { printk(KERN_ERR PFX "No usable DMA configuration, " "aborting.\n"); goto err_out_res; } - cp->pci_using_dac = 0; + pci_using_dac = 0; } + cp->cpcmd = (pci_using_dac ? PCIDAC : 0) | + PCIMulRW | RxChkSum | CpRxOn | CpTxOn; + regs = ioremap_nocache(pciaddr, CP_REGS_SIZE); if (!regs) { rc = -EIO; printk(KERN_ERR PFX "Cannot map PCI MMIO (%lx@%lx) on pci dev %s\n", - pci_resource_len(pdev, 1), pciaddr, pdev->slot_name); + pci_resource_len(pdev, 1), pciaddr, pci_name(pdev)); goto err_out_res; } dev->base_addr = (unsigned long) regs; @@ -1872,16 +1715,17 @@ dev->hard_start_xmit = cp_start_xmit; dev->get_stats = cp_get_stats; dev->do_ioctl = cp_ioctl; + dev->poll = cp_rx_poll; + dev->weight = 16; /* arbitrary? from NAPI_HOWTO.txt. */ #ifdef BROKEN dev->change_mtu = cp_change_mtu; #endif + dev->ethtool_ops = &cp_ethtool_ops; #if 0 dev->tx_timeout = cp_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; #endif -#ifdef CP_TX_CHECKSUM - dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; -#endif + #if CP_VLAN_TAG_USED dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; dev->vlan_rx_register = cp_vlan_rx_register; @@ -1894,11 +1738,10 @@ if (rc) goto err_out_iomap; - printk (KERN_INFO "%s: %s at 0x%lx, " + printk (KERN_INFO "%s: RTL-8139C+ at 0x%lx, " "%02x:%02x:%02x:%02x:%02x:%02x, " "IRQ %d\n", dev->name, - cp_board_tbl[board_type].name, dev->base_addr, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], @@ -1907,29 +1750,8 @@ pci_set_drvdata(pdev, dev); - /* - * Looks like this is necessary to deal with on all architectures, - * even this %$#%$# N440BX Intel based thing doesn't get it right. - * Ie. having two NICs in the machine, one will have the cache - * line set at boot time, the other will not. - */ - pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cache_size); - cache_size <<= 2; - if (cache_size != SMP_CACHE_BYTES) { - printk(KERN_INFO "%s: PCI cache line size set incorrectly " - "(%i bytes) by BIOS/FW, ", dev->name, cache_size); - if (cache_size > SMP_CACHE_BYTES) - printk("expecting %i\n", SMP_CACHE_BYTES); - else { - printk("correcting to %i\n", SMP_CACHE_BYTES); - pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, - SMP_CACHE_BYTES >> 2); - } - } - /* enable busmastering and memory-write-invalidate */ pci_set_master(pdev); - pci_set_mwi(pdev); if (cp->wol_enabled) cp_set_d3_state (cp); @@ -1939,6 +1761,8 @@ iounmap(regs); err_out_res: pci_release_regions(pdev); +err_out_mwi: + pci_clear_mwi(pdev); err_out_disable: pci_disable_device(pdev); err_out_free: @@ -1946,7 +1770,7 @@ return rc; } -static void __devexit cp_remove_one (struct pci_dev *pdev) +static void cp_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); struct cp_private *cp = dev->priv; @@ -1957,6 +1781,7 @@ iounmap(cp->regs); if (cp->wol_enabled) pci_set_power_state (pdev, 0); pci_release_regions(pdev); + pci_clear_mwi(pdev); pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); kfree(dev); @@ -2019,7 +1844,7 @@ .name = DRV_NAME, .id_table = cp_pci_tbl, .probe = cp_init_one, - .remove = __devexit_p(cp_remove_one), + .remove = cp_remove_one, #ifdef CONFIG_PM .resume = cp_resume, .suspend = cp_suspend, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/8139too.c linux-2.4.23-pre8/drivers/net/8139too.c --- linux-2.4.22/drivers/net/8139too.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/8139too.c 2003-10-22 22:47:27.000000000 +0000 @@ -122,6 +122,11 @@ #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 @@ -164,7 +169,11 @@ 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) #define RX_BUF_PAD 16 #define RX_BUF_WRAP_PAD 2048 /* spare padding to handle lack of packet wrap */ @@ -211,18 +220,7 @@ typedef enum { RTL8139 = 0, - RTL8139_CB, - SMC1211TX, - /*MPX5030,*/ - DELTA8139, - ADDTRON8139, - DFE538TX, - DFE690TXD, - FE2000VX, - ALLIED8139, RTL8129, - FNW3603TX, - FNW3800TX, } board_t; @@ -231,36 +229,31 @@ const char *name; u32 hw_flags; } board_info[] __devinitdata = { - { "RealTek RTL8139 Fast Ethernet", RTL8139_CAPS }, - { "RealTek RTL8139B PCI/CardBus", RTL8139_CAPS }, - { "SMC1211TX EZCard 10/100 (RealTek RTL8139)", RTL8139_CAPS }, -/* { MPX5030, "Accton MPX5030 (RealTek RTL8139)", RTL8139_CAPS },*/ - { "Delta Electronics 8139 10/100BaseTX", RTL8139_CAPS }, - { "Addtron Technolgy 8139 10/100BaseTX", RTL8139_CAPS }, - { "D-Link DFE-538TX (RealTek RTL8139)", RTL8139_CAPS }, - { "D-Link DFE-690TXD (RealTek RTL8139)", RTL8139_CAPS }, - { "AboCom FE2000VX (RealTek RTL8139)", RTL8139_CAPS }, - { "Allied Telesyn 8139 CardBus", RTL8139_CAPS }, + { "RealTek RTL8139", RTL8139_CAPS }, { "RealTek RTL8129", RTL8129_CAPS }, - { "Planex FNW-3603-TX 10/100 CardBus", RTL8139_CAPS }, - { "Planex FNW-3800-TX 10/100 CardBus", RTL8139_CAPS }, }; -static struct pci_device_id rtl8139_pci_tbl[] __devinitdata = { +static struct pci_device_id rtl8139_pci_tbl[] = { {0x10ec, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, - {0x10ec, 0x8138, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139_CB }, - {0x1113, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SMC1211TX }, -/* {0x1113, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MPX5030 },*/ - {0x1500, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DELTA8139 }, - {0x4033, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ADDTRON8139 }, - {0x1186, 0x1300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DFE538TX }, - {0x1186, 0x1340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DFE690TXD }, - {0x13d1, 0xab06, PCI_ANY_ID, PCI_ANY_ID, 0, 0, FE2000VX }, - {0x1259, 0xa117, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALLIED8139 }, - {0x14ea, 0xab06, PCI_ANY_ID, PCI_ANY_ID, 0, 0, FNW3603TX }, - {0x14ea, 0xab07, PCI_ANY_ID, PCI_ANY_ID, 0, 0, FNW3800TX }, - + {0x10ec, 0x8138, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x1113, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x1500, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x4033, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x1186, 0x1300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x1186, 0x1340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x13d1, 0xab06, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x1259, 0xa117, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x14ea, 0xab06, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {0x14ea, 0xab07, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, + {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 }, + +#ifdef CONFIG_SH_SECUREEDGE5410 + /* Bogus 8139 silicon reports 8129 without external PROM :-( */ + {0x10ec, 0x8129, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, +#endif #ifdef CONFIG_8139TOO_8129 {0x10ec, 0x8129, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8129 }, #endif @@ -270,8 +263,8 @@ * so we simply don't match on the main vendor id. */ {PCI_ANY_ID, 0x8139, 0x10ec, 0x8139, 0, 0, RTL8139 }, - {PCI_ANY_ID, 0x8139, 0x1186, 0x1300, 0, 0, DFE538TX }, - {PCI_ANY_ID, 0x8139, 0x13d1, 0xab06, 0, 0, FE2000VX }, + {PCI_ANY_ID, 0x8139, 0x1186, 0x1300, 0, 0, RTL8139 }, + {PCI_ANY_ID, 0x8139, 0x13d1, 0xab06, 0, 0, RTL8139 }, {0,} }; @@ -301,7 +294,6 @@ IntrMask = 0x3C, IntrStatus = 0x3E, TxConfig = 0x40, - ChipVersion = 0x43, RxConfig = 0x44, Timer = 0x48, /* A general-purpose counter. */ RxMissed = 0x4C, /* 24 bits valid, write clears. */ @@ -460,7 +452,6 @@ RxNoWrap = (1 << 7), }; - /* Twister tuning parameters from RealTek. Completely undocumented, but required to tune bad links on some boards. */ enum CSCRBits { @@ -471,36 +462,22 @@ CSCR_LinkDownCmd = 0x0f3c0, }; - enum Cfg9346Bits { Cfg9346_Lock = 0x00, Cfg9346_Unlock = 0xC0, }; -#ifdef CONFIG_8139TOO_TUNE_TWISTER - -enum TwisterParamVals { - PARA78_default = 0x78fa8388, - PARA7c_default = 0xcb38de43, /* param[0][3] */ - PARA7c_xxx = 0xcb38de43, -}; - -static const unsigned long param[4][4] = { - {0xcb39de43, 0xcb39ce43, 0xfb38de03, 0xcb38de43}, - {0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83}, - {0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83}, - {0xbb39de43, 0xbb39ce43, 0xbb39ce83, 0xbb39ce83} -}; - -#endif /* CONFIG_8139TOO_TUNE_TWISTER */ - typedef enum { CH_8139 = 0, CH_8139_K, CH_8139A, + CH_8139A_G, CH_8139B, CH_8130, CH_8139C, + CH_8100, + CH_8100B_8139D, + CH_8101, } chip_t; enum chip_flags { @@ -508,50 +485,65 @@ HasLWake = (1 << 1), }; +#define HW_REVID(b30, b29, b28, b27, b26, b23, b22) \ + (b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22) +#define HW_REVID_MASK HW_REVID(1, 1, 1, 1, 1, 1, 1) /* directly indexed by chip_t, above */ const static struct { const char *name; - u8 version; /* from RTL8139C docs */ - u32 RxConfigMask; /* should clear the bits supported by this chip */ + u32 version; /* from RTL8139C/RTL8139D docs */ u32 flags; } rtl_chip_info[] = { { "RTL-8139", - 0x40, - 0xf0fe0040, /* XXX copied from RTL8139A, verify */ + HW_REVID(1, 0, 0, 0, 0, 0, 0), HasHltClk, }, { "RTL-8139 rev K", - 0x60, - 0xf0fe0040, + HW_REVID(1, 1, 0, 0, 0, 0, 0), HasHltClk, }, { "RTL-8139A", - 0x70, - 0xf0fe0040, + HW_REVID(1, 1, 1, 0, 0, 0, 0), + HasHltClk, /* XXX undocumented? */ + }, + + { "RTL-8139A rev G", + HW_REVID(1, 1, 1, 0, 0, 1, 0), HasHltClk, /* XXX undocumented? */ }, { "RTL-8139B", - 0x78, - 0xf0fc0040, + HW_REVID(1, 1, 1, 1, 0, 0, 0), HasLWake, }, { "RTL-8130", - 0x7C, - 0xf0fe0040, /* XXX copied from RTL8139A, verify */ + HW_REVID(1, 1, 1, 1, 1, 0, 0), HasLWake, }, { "RTL-8139C", - 0x74, - 0xf0fc0040, /* XXX copied from RTL8139B, verify */ + HW_REVID(1, 1, 1, 0, 1, 0, 0), + HasLWake, + }, + + { "RTL-8100", + HW_REVID(1, 1, 1, 1, 0, 1, 0), + HasLWake, + }, + + { "RTL-8100B/8139D", + HW_REVID(1, 1, 1, 0, 1, 0, 1), HasLWake, }, + { "RTL-8101", + HW_REVID(1, 1, 1, 0, 1, 1, 1), + HasLWake, + }, }; struct rtl_extra_stats { @@ -565,6 +557,7 @@ void *mmio_addr; int drv_flags; struct pci_dev *pci_dev; + u32 pci_state[16]; struct net_device_stats stats; unsigned char *rx_ring; unsigned int cur_rx; /* Index into the Rx buffer of next Rx pkt. */ @@ -610,12 +603,12 @@ static int mdio_read (struct net_device *dev, int phy_id, int location); static void mdio_write (struct net_device *dev, int phy_id, int location, int val); -static int rtl8139_thread (void *data); +static inline void rtl8139_start_thread(struct net_device *dev); static void rtl8139_tx_timeout (struct net_device *dev); static void rtl8139_init_ring (struct net_device *dev); static int rtl8139_start_xmit (struct sk_buff *skb, struct net_device *dev); -static void rtl8139_interrupt (int irq, void *dev_instance, +static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance, struct pt_regs *regs); static int rtl8139_close (struct net_device *dev); static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); @@ -623,6 +616,7 @@ static void rtl8139_set_rx_mode (struct net_device *dev); static void __set_rx_mode (struct net_device *dev); static void rtl8139_hw_start (struct net_device *dev); +static struct ethtool_ops rtl8139_ethtool_ops; #ifdef USE_IO_OPS @@ -686,10 +680,17 @@ PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK; +#ifdef USE_BUF16K +static const unsigned int rtl8139_rx_config = + RxCfgRcv16K | RxNoWrap | + (RX_FIFO_THRESH << RxCfgFIFOShift) | + (RX_DMA_BURST << RxCfgDMAShift); +#else static const unsigned int rtl8139_rx_config = RxCfgRcv32K | RxNoWrap | (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift); +#endif static const unsigned int rtl8139_tx_config = (TX_DMA_BURST << TxDMAShift) | (TX_RETRY << TxRetryShift); @@ -714,13 +715,6 @@ /* it's ok to call this even if we have no regions to free */ pci_release_regions (pdev); -#ifndef RTL8139_NDEBUG - /* poison memory before freeing */ - memset (dev, 0xBC, - sizeof (struct net_device) + - sizeof (struct rtl8139_private)); -#endif /* RTL8139_NDEBUG */ - kfree (dev); pci_set_drvdata (pdev, NULL); @@ -755,7 +749,7 @@ unsigned int i; u32 pio_start, pio_end, pio_flags, pio_len; unsigned long mmio_start, mmio_end, mmio_flags, mmio_len; - u32 tmp; + u32 version; assert (pdev != NULL); @@ -764,10 +758,11 @@ /* dev and dev->priv zeroed in alloc_etherdev */ dev = alloc_etherdev (sizeof (*tp)); if (dev == NULL) { - printk (KERN_ERR PFX "%s: Unable to alloc new net device\n", pdev->slot_name); + printk (KERN_ERR PFX "%s: Unable to alloc new net device\n", pci_name(pdev)); return -ENOMEM; } SET_MODULE_OWNER(dev); + tp = dev->priv; tp->pci_dev = pdev; @@ -794,25 +789,25 @@ #ifdef USE_IO_OPS /* make sure PCI base addr 0 is PIO */ if (!(pio_flags & IORESOURCE_IO)) { - printk (KERN_ERR PFX "%s: region #0 not a PIO resource, aborting\n", pdev->slot_name); + printk (KERN_ERR PFX "%s: region #0 not a PIO resource, aborting\n", pci_name(pdev)); rc = -ENODEV; goto err_out; } /* check for weird/broken PCI region reporting */ if (pio_len < RTL_MIN_IO_SIZE) { - printk (KERN_ERR PFX "%s: Invalid PCI I/O region size(s), aborting\n", pdev->slot_name); + printk (KERN_ERR PFX "%s: Invalid PCI I/O region size(s), aborting\n", pci_name(pdev)); rc = -ENODEV; goto err_out; } #else /* make sure PCI base addr 1 is MMIO */ if (!(mmio_flags & IORESOURCE_MEM)) { - printk (KERN_ERR PFX "%s: region #1 not an MMIO resource, aborting\n", pdev->slot_name); + printk (KERN_ERR PFX "%s: region #1 not an MMIO resource, aborting\n", pci_name(pdev)); rc = -ENODEV; goto err_out; } if (mmio_len < RTL_MIN_IO_SIZE) { - printk (KERN_ERR PFX "%s: Invalid PCI mem region size(s), aborting\n", pdev->slot_name); + printk (KERN_ERR PFX "%s: Invalid PCI mem region size(s), aborting\n", pci_name(pdev)); rc = -ENODEV; goto err_out; } @@ -834,7 +829,7 @@ /* ioremap MMIO region */ ioaddr = ioremap (mmio_start, mmio_len); if (ioaddr == NULL) { - printk (KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", pdev->slot_name); + printk (KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", pci_name(pdev)); rc = -EIO; goto err_out; } @@ -849,23 +844,23 @@ /* check for missing/broken hardware */ if (RTL_R32 (TxConfig) == 0xFFFFFFFF) { printk (KERN_ERR PFX "%s: Chip not responding, ignoring board\n", - pdev->slot_name); + pci_name(pdev)); rc = -EIO; goto err_out; } /* identify chip attached to board */ - tmp = RTL_R8 (ChipVersion); + version = RTL_R32 (TxConfig) & HW_REVID_MASK; for (i = 0; i < ARRAY_SIZE (rtl_chip_info); i++) - if (tmp == rtl_chip_info[i].version) { + if (version == rtl_chip_info[i].version) { tp->chipset = i; goto match; } /* if unknown chip, assume array element #0, original RTL-8139 in this case */ printk (KERN_DEBUG PFX "%s: unknown chip version, assuming RTL-8139\n", - pdev->slot_name); - printk (KERN_DEBUG PFX "%s: TxConfig = 0x%lx\n", pdev->slot_name, RTL_R32 (TxConfig)); + pci_name(pdev)); + printk (KERN_DEBUG PFX "%s: TxConfig = 0x%lx\n", pci_name(pdev), RTL_R32 (TxConfig)); tp->chipset = 0; match: @@ -888,8 +883,11 @@ } if (rtl_chip_info[tp->chipset].flags & HasLWake) { tmp8 = RTL_R8 (Config4); - if (tmp8 & LWPTN) + if (tmp8 & LWPTN) { + RTL_W8 (Cfg9346, Cfg9346_Unlock); RTL_W8 (Config4, tmp8 & ~LWPTN); + RTL_W8 (Cfg9346, Cfg9346_Lock); + } } } else { DPRINTK("Old chip wakeup\n"); @@ -940,7 +938,7 @@ if (pdev->vendor == PCI_VENDOR_ID_REALTEK && pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev >= 0x20) { printk(KERN_INFO PFX "pci dev %s (id %04x:%04x rev %02x) is an enhanced 8139C+ chip\n", - pdev->slot_name, pdev->vendor, pdev->device, pci_rev); + pci_name(pdev), pdev->vendor, pdev->device, pci_rev); printk(KERN_INFO PFX "Use the \"8139cp\" driver for improved performance and stability.\n"); } @@ -967,6 +965,7 @@ dev->get_stats = rtl8139_get_stats; dev->set_multicast_list = rtl8139_set_rx_mode; dev->do_ioctl = netdev_ioctl; + dev->ethtool_ops = &rtl8139_ethtool_ops; dev->tx_timeout = rtl8139_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; @@ -1314,8 +1313,6 @@ tp->mii.full_duplex = tp->mii.force_media; tp->tx_flag = (TX_FIFO_THRESH << 11) & 0x003f0000; - tp->twistie = (tp->chipset == CH_8139_K) ? 1 : 0; - tp->time_to_die = 0; rtl8139_init_ring (dev); rtl8139_hw_start (dev); @@ -1326,32 +1323,18 @@ dev->irq, RTL_R8 (MediaStatus), tp->mii.full_duplex ? "full" : "half"); - tp->thr_pid = kernel_thread (rtl8139_thread, dev, CLONE_FS | CLONE_FILES); - if (tp->thr_pid < 0) - printk (KERN_WARNING "%s: unable to start kernel thread\n", - dev->name); + rtl8139_start_thread(dev); return 0; } -static void rtl_check_media (struct net_device *dev) +static void rtl_check_media (struct net_device *dev, unsigned int init_media) { struct rtl8139_private *tp = dev->priv; if (tp->phys[0] >= 0) { - u16 mii_lpa = mdio_read(dev, tp->phys[0], MII_LPA); - if (mii_lpa == 0xffff) - ; /* Not there */ - else if ((mii_lpa & LPA_100FULL) == LPA_100FULL - || (mii_lpa & 0x00C0) == LPA_10FULL) - tp->mii.full_duplex = 1; - - printk (KERN_INFO"%s: Setting %s%s-duplex based on" - " auto-negotiated partner ability %4.4x.\n", - dev->name, mii_lpa == 0 ? "" : - (mii_lpa & 0x0180) ? "100mbps " : "10mbps ", - tp->mii.full_duplex ? "full" : "half", mii_lpa); + mii_check_media(&tp->mii, 1, init_media); } } @@ -1386,7 +1369,7 @@ tp->cur_rx = 0; - rtl_check_media (dev); + rtl_check_media (dev, 1); if (tp->chipset >= CH_8139B) { /* Disable magic packet scanning, which is enabled @@ -1448,6 +1431,19 @@ static inline void rtl8139_tune_twister (struct net_device *dev, struct rtl8139_private *tp) {} #else +enum TwisterParamVals { + PARA78_default = 0x78fa8388, + PARA7c_default = 0xcb38de43, /* param[0][3] */ + PARA7c_xxx = 0xcb38de43, +}; + +static const unsigned long param[4][4] = { + {0xcb39de43, 0xcb39ce43, 0xfb38de03, 0xcb38de43}, + {0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83}, + {0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83}, + {0xbb39de43, 0xbb39ce43, 0xbb39ce83, 0xbb39ce83} +}; + static void rtl8139_tune_twister (struct net_device *dev, struct rtl8139_private *tp) { @@ -1534,7 +1530,6 @@ } #endif /* CONFIG_8139TOO_TUNE_TWISTER */ - static inline void rtl8139_thread_iter (struct net_device *dev, struct rtl8139_private *tp, void *ioaddr) @@ -1581,7 +1576,6 @@ RTL_R8 (Config1)); } - static int rtl8139_thread (void *data) { struct net_device *dev = data; @@ -1621,6 +1615,24 @@ complete_and_exit (&tp->thr_exited, 0); } +static inline void rtl8139_start_thread(struct net_device *dev) +{ + struct rtl8139_private *tp = dev->priv; + + tp->thr_pid = -1; + tp->twistie = 0; + tp->time_to_die = 0; + if (tp->chipset == CH_8139_K) + tp->twistie = 1; + else if (tp->drv_flags & HAS_LNK_CHNG) + return; + + tp->thr_pid = kernel_thread(rtl8139_thread, dev, CLONE_FS|CLONE_FILES); + if (tp->thr_pid < 0) { + printk (KERN_WARNING "%s: unable to start kernel thread\n", + dev->name); + } +} static void rtl8139_tx_clear (struct rtl8139_private *tp) { @@ -2001,18 +2013,7 @@ if ((status & RxUnderrun) && link_changed && (tp->drv_flags & HAS_LNK_CHNG)) { - /* Really link-change on new chips. */ - int lpar = RTL_R16 (NWayLPAR); - int duplex = (lpar & LPA_100FULL) || (lpar & 0x01C0) == 0x0040 - || tp->mii.force_media; - if (tp->mii.full_duplex != duplex) { - tp->mii.full_duplex = duplex; -#if 0 - RTL_W8 (Cfg9346, Cfg9346_Unlock); - RTL_W8 (Config1, tp->mii.full_duplex ? 0x60 : 0x20); - RTL_W8 (Cfg9346, Cfg9346_Lock); -#endif - } + rtl_check_media(dev, 0); status &= ~RxUnderrun; } @@ -2038,7 +2039,7 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void rtl8139_interrupt (int irq, void *dev_instance, +static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_instance; @@ -2047,6 +2048,7 @@ void *ioaddr = tp->mmio_addr; int ackstat, status; int link_changed = 0; /* avoid bogus "uninit" warning */ + int handled = 0; spin_lock (&tp->lock); @@ -2062,6 +2064,8 @@ RxFIFOOver | TxErr | TxOK | RxErr | RxOK)) == 0) break; + handled = 1; + /* Acknowledge all of the current interrupt sources ASAP, but an first get an additional status bit from CSCR. */ if (status & RxUnderrun) @@ -2106,6 +2110,7 @@ DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n", dev->name, RTL_R16 (IntrStatus)); + return IRQ_RETVAL(handled); } @@ -2171,11 +2176,12 @@ /* Get the ethtool Wake-on-LAN settings. Assumes that wol points to kernel memory, *wol has been initialized as {ETHTOOL_GWOL}, and other threads or interrupts aren't messing with the 8139. */ -static void netdev_get_wol (struct net_device *dev, struct ethtool_wolinfo *wol) +static void rtl8139_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { struct rtl8139_private *np = dev->priv; void *ioaddr = np->mmio_addr; + spin_lock_irq(&np->lock); if (rtl_chip_info[np->chipset].flags & HasLWake) { u8 cfg3 = RTL_R8 (Config3); u8 cfg5 = RTL_R8 (Config5); @@ -2197,14 +2203,14 @@ if (cfg5 & Cfg5_BWF) wol->wolopts |= WAKE_BCAST; } + spin_unlock_irq(&np->lock); } /* Set the ethtool Wake-on-LAN settings. Return 0 or -errno. Assumes that wol points to kernel memory and other threads or interrupts aren't messing with the 8139. */ -static int netdev_set_wol (struct net_device *dev, - const struct ethtool_wolinfo *wol) +static int rtl8139_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { struct rtl8139_private *np = dev->priv; void *ioaddr = np->mmio_addr; @@ -2218,6 +2224,7 @@ if (wol->wolopts & ~support) return -EINVAL; + spin_lock_irq(&np->lock); cfg3 = RTL_R8 (Config3) & ~(Cfg3_LinkUp | Cfg3_Magic); if (wol->wolopts & WAKE_PHY) cfg3 |= Cfg3_LinkUp; @@ -2238,213 +2245,120 @@ if (wol->wolopts & WAKE_BCAST) cfg5 |= Cfg5_BWF; RTL_W8 (Config5, cfg5); /* need not unlock via Cfg9346 */ + spin_unlock_irq(&np->lock); return 0; } -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void rtl8139_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { struct rtl8139_private *np = dev->priv; - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + strcpy(info->bus_info, pci_name(np->pci_dev)); + info->regdump_len = np->regs_len; +} - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; +static int rtl8139_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct rtl8139_private *np = dev->priv; + spin_lock_irq(&np->lock); + mii_ethtool_gset(&np->mii, cmd); + spin_unlock_irq(&np->lock); + return 0; +} - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - strcpy (info.bus_info, np->pci_dev->slot_name); - info.regdump_len = np->regs_len; - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } +static int rtl8139_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct rtl8139_private *np = dev->priv; + int rc; + spin_lock_irq(&np->lock); + rc = mii_ethtool_sset(&np->mii, cmd); + spin_unlock_irq(&np->lock); + return rc; +} - /* get settings */ - case ETHTOOL_GSET: { - struct ethtool_cmd ecmd = { ETHTOOL_GSET }; - spin_lock_irq(&np->lock); - mii_ethtool_gset(&np->mii, &ecmd); - spin_unlock_irq(&np->lock); - if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) - return -EFAULT; - return 0; - } - /* set settings */ - case ETHTOOL_SSET: { - int r; - struct ethtool_cmd ecmd; - if (copy_from_user(&ecmd, useraddr, sizeof(ecmd))) - return -EFAULT; - spin_lock_irq(&np->lock); - r = mii_ethtool_sset(&np->mii, &ecmd); - spin_unlock_irq(&np->lock); - return r; - } - /* restart autonegotiation */ - case ETHTOOL_NWAY_RST: { - return mii_nway_restart(&np->mii); - } - /* get link status */ - case ETHTOOL_GLINK: { - struct ethtool_value edata = {ETHTOOL_GLINK}; - edata.data = mii_link_ok(&np->mii); - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } +static int rtl8139_nway_reset(struct net_device *dev) +{ + struct rtl8139_private *np = dev->priv; + return mii_nway_restart(&np->mii); +} - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - debug = edata.data; - return 0; - } +static u32 rtl8139_get_link(struct net_device *dev) +{ + struct rtl8139_private *np = dev->priv; + return mii_link_ok(&np->mii); +} - case ETHTOOL_GWOL: - { - struct ethtool_wolinfo wol = { ETHTOOL_GWOL }; - spin_lock_irq (&np->lock); - netdev_get_wol (dev, &wol); - spin_unlock_irq (&np->lock); - if (copy_to_user (useraddr, &wol, sizeof (wol))) - return -EFAULT; - return 0; - } +static u32 rtl8139_get_msglevel(struct net_device *dev) +{ + return debug; +} - case ETHTOOL_SWOL: - { - struct ethtool_wolinfo wol; - int rc; - if (copy_from_user (&wol, useraddr, sizeof (wol))) - return -EFAULT; - spin_lock_irq (&np->lock); - rc = netdev_set_wol (dev, &wol); - spin_unlock_irq (&np->lock); - return rc; - } +static void rtl8139_set_msglevel(struct net_device *dev, u32 datum) +{ + debug = datum; +} /* TODO: we are too slack to do reg dumping for pio, for now */ -#ifndef CONFIG_8139TOO_PIO - /* NIC register dump */ - case ETHTOOL_GREGS: { - struct ethtool_regs regs; - unsigned int regs_len = np->regs_len; - u8 *regbuf = kmalloc(regs_len, GFP_KERNEL); - int rc; - - if (!regbuf) - return -ENOMEM; - memset(regbuf, 0, regs_len); - - rc = copy_from_user(®s, useraddr, sizeof(regs)); - if (rc) { - rc = -EFAULT; - goto err_out_gregs; - } - - if (regs.len > regs_len) - regs.len = regs_len; - if (regs.len < regs_len) { - rc = -EINVAL; - goto err_out_gregs; - } - - regs.version = RTL_REGS_VER; - rc = copy_to_user(useraddr, ®s, sizeof(regs)); - if (rc) { - rc = -EFAULT; - goto err_out_gregs; - } - - useraddr += offsetof(struct ethtool_regs, data); - - spin_lock_irq(&np->lock); - memcpy_fromio(regbuf, np->mmio_addr, regs_len); - spin_unlock_irq(&np->lock); - - if (copy_to_user(useraddr, regbuf, regs_len)) - rc = -EFAULT; - -err_out_gregs: - kfree(regbuf); - return rc; - } -#endif /* CONFIG_8139TOO_PIO */ - - /* get string list(s) */ - case ETHTOOL_GSTRINGS: { - struct ethtool_gstrings estr = { ETHTOOL_GSTRINGS }; - - if (copy_from_user(&estr, useraddr, sizeof(estr))) - return -EFAULT; - if (estr.string_set != ETH_SS_STATS) - return -EINVAL; - - estr.len = RTL_NUM_STATS; - if (copy_to_user(useraddr, &estr, sizeof(estr))) - return -EFAULT; - if (copy_to_user(useraddr + sizeof(estr), - ðtool_stats_keys, - sizeof(ethtool_stats_keys))) - return -EFAULT; - return 0; - } +#ifdef CONFIG_8139TOO_PIO +#define rtl8139_get_regs_len NULL +#define rtl8139_get_regs NULL +#else +static int rtl8139_get_regs_len(struct net_device *dev) +{ + struct rtl8139_private *np = dev->priv; + return np->regs_len; +} - /* get NIC-specific statistics */ - case ETHTOOL_GSTATS: { - struct ethtool_stats estats = { ETHTOOL_GSTATS }; - u64 *tmp_stats; - const unsigned int sz = sizeof(u64) * RTL_NUM_STATS; - int i; - - estats.n_stats = RTL_NUM_STATS; - if (copy_to_user(useraddr, &estats, sizeof(estats))) - return -EFAULT; - - tmp_stats = kmalloc(sz, GFP_KERNEL); - if (!tmp_stats) - return -ENOMEM; - memset(tmp_stats, 0, sz); - - i = 0; - tmp_stats[i++] = np->xstats.early_rx; - tmp_stats[i++] = np->xstats.tx_buf_mapped; - tmp_stats[i++] = np->xstats.tx_timeouts; - tmp_stats[i++] = np->xstats.rx_lost_in_ring; - if (i != RTL_NUM_STATS) - BUG(); +static void rtl8139_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *regbuf) +{ + struct rtl8139_private *np = dev->priv; - i = copy_to_user(useraddr + sizeof(estats), tmp_stats, sz); - kfree(tmp_stats); + regs->version = RTL_REGS_VER; - if (i) - return -EFAULT; - return 0; - } - default: - break; - } + spin_lock_irq(&np->lock); + memcpy_fromio(regbuf, np->mmio_addr, regs->len); + spin_unlock_irq(&np->lock); +} +#endif /* CONFIG_8139TOO_MMIO */ - return -EOPNOTSUPP; +static int rtl8139_get_stats_count(struct net_device *dev) +{ + return RTL_NUM_STATS; } +static void rtl8139_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) +{ + struct rtl8139_private *np = dev->priv; + + data[0] = np->xstats.early_rx; + data[1] = np->xstats.tx_buf_mapped; + data[2] = np->xstats.tx_timeouts; + data[3] = np->xstats.rx_lost_in_ring; +} + +static void rtl8139_get_strings(struct net_device *dev, u32 stringset, u8 *data) +{ + memcpy(data, ethtool_stats_keys, sizeof(ethtool_stats_keys)); +} + +static struct ethtool_ops rtl8139_ethtool_ops = { + .get_drvinfo = rtl8139_get_drvinfo, + .get_settings = rtl8139_get_settings, + .set_settings = rtl8139_set_settings, + .get_regs_len = rtl8139_get_regs_len, + .get_regs = rtl8139_get_regs, + .nway_reset = rtl8139_nway_reset, + .get_link = rtl8139_get_link, + .get_msglevel = rtl8139_get_msglevel, + .set_msglevel = rtl8139_set_msglevel, + .get_wol = rtl8139_get_wol, + .set_wol = rtl8139_set_wol, + .get_strings = rtl8139_get_strings, + .get_stats_count = rtl8139_get_stats_count, + .get_ethtool_stats = rtl8139_get_ethtool_stats, +}; static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { @@ -2455,14 +2369,9 @@ if (!netif_running(dev)) return -EINVAL; - if (cmd == SIOCETHTOOL) - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - - else { - spin_lock_irq(&np->lock); - rc = generic_mii_ioctl(&np->mii, data, cmd, NULL); - spin_unlock_irq(&np->lock); - } + spin_lock_irq(&np->lock); + rc = generic_mii_ioctl(&np->mii, data, cmd, NULL); + spin_unlock_irq(&np->lock); return rc; } @@ -2569,6 +2478,9 @@ tp->stats.rx_missed_errors += RTL_R32 (RxMissed); RTL_W32 (RxMissed, 0); + pci_set_power_state (pdev, 3); + pci_save_state (pdev, tp->pci_state); + spin_unlock_irqrestore (&tp->lock, flags); return 0; } @@ -2577,11 +2489,15 @@ static int rtl8139_resume (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata (pdev); + struct rtl8139_private *tp = dev->priv; if (!netif_running (dev)) return 0; - netif_device_attach (dev); + pci_restore_state (pdev, tp->pci_state); + pci_set_power_state (pdev, 0); + rtl8139_init_ring (dev); rtl8139_hw_start (dev); + netif_device_attach (dev); return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/8390.c linux-2.4.23-pre8/drivers/net/8390.c --- linux-2.4.22/drivers/net/8390.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/8390.c 2003-10-22 22:47:45.000000000 +0000 @@ -1000,6 +1000,11 @@ 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 * @dev: network device structure to init @@ -1015,14 +1020,11 @@ 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_device_init(dev->priv); } dev->hard_start_xmit = &ei_start_xmit; @@ -1033,6 +1035,29 @@ return 0; } + +/* wrapper to make alloc_netdev happy; probably should just cast... */ +static void __ethdev_init(struct net_device *dev) +{ + ethdev_init(dev); +} + +/** + * alloc_ei_netdev - alloc_etherdev counterpart for 8390 + * + * Allocate 8390-specific net_device. + */ +struct net_device *alloc_ei_netdev(void) +{ + struct net_device *dev; + + dev = alloc_netdev(sizeof(struct ei_device), "eth%d", __ethdev_init); + if (dev) + ei_device_init(dev->priv); + + return dev; +} + @@ -1136,6 +1161,7 @@ EXPORT_SYMBOL(ei_tx_timeout); EXPORT_SYMBOL(ethdev_init); EXPORT_SYMBOL(NS8390_init); +EXPORT_SYMBOL(alloc_ei_netdev); #if defined(MODULE) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/8390.h linux-2.4.23-pre8/drivers/net/8390.h --- linux-2.4.22/drivers/net/8390.h 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/8390.h 2003-10-22 22:49:12.000000000 +0000 @@ -50,6 +50,7 @@ extern int ei_open(struct net_device *dev); extern int ei_close(struct net_device *dev); extern void ei_interrupt(int irq, void *dev_id, struct pt_regs *regs); +extern struct net_device *alloc_ei_netdev(void); /* Most of these entries should be in 'struct net_device' (or most of the things in there should be here!) */ @@ -116,7 +117,7 @@ */ #if defined(CONFIG_MAC) || \ - defined(CONFIG_ARIADNE2) || defined(CONFIG_ARIADNE2_MODULE) || \ + defined(CONFIG_ZORRO8390) || defined(CONFIG_ZORRO8390_MODULE) || \ defined(CONFIG_HYDRA) || defined(CONFIG_HYDRA_MODULE) #define EI_SHIFT(x) (ei_local->reg_offset[x]) #undef inb diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/Config.in linux-2.4.23-pre8/drivers/net/Config.in --- linux-2.4.22/drivers/net/Config.in 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/Config.in 2003-10-22 22:49:06.000000000 +0000 @@ -49,9 +49,9 @@ fi if [ "$CONFIG_ZORRO" = "y" ]; then tristate ' Ariadne support' CONFIG_ARIADNE - tristate ' Ariadne II and X-Surf support' CONFIG_NE2K_ZORRO tristate ' A2065 support' CONFIG_A2065 tristate ' Hydra support' CONFIG_HYDRA + tristate ' Zorro NS8390-based Ethernet support' CONFIG_ZORRO8390 fi if [ "$CONFIG_PARISC" = "y" ]; then dep_tristate ' Lasi ethernet' CONFIG_LASI_82596 $CONFIG_GSC_LASI @@ -268,9 +268,15 @@ dep_tristate 'Packet Engines Hamachi GNIC-II support' CONFIG_HAMACHI $CONFIG_PCI dep_tristate 'Packet Engines Yellowfin Gigabit-NIC support (EXPERIMENTAL)' CONFIG_YELLOWFIN $CONFIG_PCI $CONFIG_EXPERIMENTAL dep_tristate 'Realtek 8169 Gigabit Ethernet support' CONFIG_R8169 $CONFIG_PCI -dep_tristate 'SysKonnect SK-98xx and SK-95xx Gigabit Ethernet Adapter family support' CONFIG_SK98LIN $CONFIG_PCI +dep_tristate 'Marvell Yukon Chipset / SysKonnect SK-98xx Support' CONFIG_SK98LIN $CONFIG_PCI dep_tristate 'Broadcom Tigon3 support' CONFIG_TIGON3 $CONFIG_PCI +if [ "$CONFIG_MOMENCO_OCELOT_C" = "y" -o "$CONFIG_MOMENCO_JAGUAR_ATX" = "y" ]; then + bool ' MV-64340 Ethernet support' CONFIG_MV64340_ETH + dep_bool ' MV-64340 Port 0' CONFIG_MV64340_ETH_0 $CONFIG_MV64340_ETH + dep_bool ' MV-64340 Port 1' CONFIG_MV64340_ETH_1 $CONFIG_MV64340_ETH + dep_bool ' MV-64340 Port 2' CONFIG_MV64340_ETH_2 $CONFIG_MV64340_ETH +fi endmenu if [ "$CONFIG_PPC_ISERIES" = "y" ]; then diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/Makefile linux-2.4.23-pre8/drivers/net/Makefile --- linux-2.4.22/drivers/net/Makefile 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/Makefile 2003-10-22 22:48:20.000000000 +0000 @@ -115,6 +115,7 @@ # end link order section # +obj-$(CONFIG_MV64340_ETH) += mv64340_eth.o obj-$(CONFIG_AIRONET4500) += aironet4500_core.o obj-$(CONFIG_AIRONET4500_CS) += aironet4500_core.o obj-$(CONFIG_AIRONET4500_NONCS) += aironet4500_card.o @@ -212,7 +213,7 @@ obj-$(CONFIG_LP486E) += lp486e.o obj-$(CONFIG_ETH16I) += eth16i.o -obj-$(CONFIG_ARIADNE2) += ariadne2.o 8390.o +obj-$(CONFIG_ZORRO8390) += zorro8390.o 8390.o obj-$(CONFIG_HPLANCE) += hplance.o 7990.o obj-$(CONFIG_MVME147_NET) += mvme147.o 7990.o obj-$(CONFIG_EQUALIZER) += eql.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/ariadne2.c linux-2.4.23-pre8/drivers/net/ariadne2.c --- linux-2.4.22/drivers/net/ariadne2.c 2002-08-03 00:39:44.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/ariadne2.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,427 +0,0 @@ -/* - * Amiga Linux/m68k and Linux/PPC Ariadne II and X-Surf Ethernet Driver - * - * (C) Copyright 1998-2000 by some Elitist 680x0 Users(TM) - * - * --------------------------------------------------------------------------- - * - * This program is based on all the other NE2000 drivers for Linux - * - * --------------------------------------------------------------------------- - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of the Linux - * distribution for more details. - * - * --------------------------------------------------------------------------- - * - * The Ariadne II and X-Surf are Zorro-II boards containing Realtek RTL8019AS - * Ethernet Controllers. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include "8390.h" - - -#define NE_BASE (dev->base_addr) -#define NE_CMD (0x00*2) -#define NE_DATAPORT (0x10*2) /* NatSemi-defined port window offset. */ -#define NE_RESET (0x1f*2) /* Issue a read to reset, a write to clear. */ -#define NE_IO_EXTENT (0x20*2) - -#define NE_EN0_ISR (0x07*2) -#define NE_EN0_DCFG (0x0e*2) - -#define NE_EN0_RSARLO (0x08*2) -#define NE_EN0_RSARHI (0x09*2) -#define NE_EN0_RCNTLO (0x0a*2) -#define NE_EN0_RXCR (0x0c*2) -#define NE_EN0_TXCR (0x0d*2) -#define NE_EN0_RCNTHI (0x0b*2) -#define NE_EN0_IMR (0x0f*2) - -#define NESM_START_PG 0x40 /* First page of TX buffer */ -#define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */ - - -#define WORDSWAP(a) ((((a)>>8)&0xff) | ((a)<<8)) - -#ifdef MODULE -static struct net_device *root_ariadne2_dev; -#endif - -static const struct card_info { - zorro_id id; - const char *name; - unsigned int offset; -} cards[] __initdata = { - { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE2, "Ariadne II", 0x0600 }, - { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, "X-Surf", 0x8600 }, -}; - -static int __init ariadne2_probe(void); -static int __init ariadne2_init(struct net_device *dev, unsigned long board, - const char *name, unsigned long ioaddr); -static int ariadne2_open(struct net_device *dev); -static int ariadne2_close(struct net_device *dev); -static void ariadne2_reset_8390(struct net_device *dev); -static void ariadne2_get_8390_hdr(struct net_device *dev, - struct e8390_pkt_hdr *hdr, int ring_page); -static void ariadne2_block_input(struct net_device *dev, int count, - struct sk_buff *skb, int ring_offset); -static void ariadne2_block_output(struct net_device *dev, const int count, - const unsigned char *buf, - const int start_page); -static void __exit ariadne2_cleanup(void); - -static int __init ariadne2_probe(void) -{ - struct net_device *dev; - struct zorro_dev *z = NULL; - unsigned long board, ioaddr; - int err = -ENODEV; - int i; - - while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { - for (i = ARRAY_SIZE(cards)-1; i >= 0; i--) - if (z->id == cards[i].id) - break; - if (i < 0) - continue; - board = z->resource.start; - ioaddr = board+cards[i].offset; - dev = init_etherdev(0, 0); - SET_MODULE_OWNER(dev); - if (!dev) - return -ENOMEM; - if (!request_mem_region(ioaddr, NE_IO_EXTENT*2, dev->name)) { - kfree(dev); - continue; - } - if ((err = ariadne2_init(dev, board, cards[i].name, - ZTWO_VADDR(ioaddr)))) { - release_mem_region(ioaddr, NE_IO_EXTENT*2); - kfree(dev); - return err; - } - err = 0; - } - - if (err == -ENODEV) - printk("No Ariadne II or X-Surf ethernet card found.\n"); - return err; -} - -static int __init ariadne2_init(struct net_device *dev, unsigned long board, - const char *name, unsigned long ioaddr) -{ - int i; - unsigned char SA_prom[32]; - int start_page, stop_page; - static u32 ariadne2_offsets[16] = { - 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, - 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, - }; - - /* Reset card. Who knows what dain-bramaged state it was left in. */ - { - unsigned long reset_start_time = jiffies; - - z_writeb(z_readb(ioaddr + NE_RESET), ioaddr + NE_RESET); - - while ((z_readb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0) - if (jiffies - reset_start_time > 2*HZ/100) { - printk(" not found (no reset ack).\n"); - return -ENODEV; - } - - z_writeb(0xff, ioaddr + NE_EN0_ISR); /* Ack all intr. */ - } - - /* Read the 16 bytes of station address PROM. - We must first initialize registers, similar to NS8390_init(eifdev, 0). - We can't reliably read the SAPROM address without this. - (I learned the hard way!). */ - { - struct { - u32 value; - u32 offset; - } program_seq[] = { - {E8390_NODMA+E8390_PAGE0+E8390_STOP, NE_CMD}, /* Select page 0*/ - {0x48, NE_EN0_DCFG}, /* Set byte-wide (0x48) access. */ - {0x00, NE_EN0_RCNTLO}, /* Clear the count regs. */ - {0x00, NE_EN0_RCNTHI}, - {0x00, NE_EN0_IMR}, /* Mask completion irq. */ - {0xFF, NE_EN0_ISR}, - {E8390_RXOFF, NE_EN0_RXCR}, /* 0x20 Set to monitor */ - {E8390_TXOFF, NE_EN0_TXCR}, /* 0x02 and loopback mode. */ - {32, NE_EN0_RCNTLO}, - {0x00, NE_EN0_RCNTHI}, - {0x00, NE_EN0_RSARLO}, /* DMA starting at 0x0000. */ - {0x00, NE_EN0_RSARHI}, - {E8390_RREAD+E8390_START, NE_CMD}, - }; - for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++) { - z_writeb(program_seq[i].value, ioaddr + program_seq[i].offset); - } - } - for (i = 0; i < 16; i++) { - SA_prom[i] = z_readb(ioaddr + NE_DATAPORT); - (void)z_readb(ioaddr + NE_DATAPORT); - } - - /* We must set the 8390 for word mode. */ - z_writeb(0x49, ioaddr + NE_EN0_DCFG); - start_page = NESM_START_PG; - stop_page = NESM_STOP_PG; - - dev->base_addr = ioaddr; - dev->irq = IRQ_AMIGA_PORTS; - - /* Install the Interrupt handler */ - 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]); -#endif - dev->dev_addr[i] = SA_prom[i]; - } - - printk("%s: %s at 0x%08lx, Ethernet Address " - "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, name, board, - dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], - dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); - - ei_status.name = name; - ei_status.tx_start_page = start_page; - ei_status.stop_page = stop_page; - ei_status.word16 = 1; - - ei_status.rx_start_page = start_page + TX_PAGES; - - ei_status.reset_8390 = &ariadne2_reset_8390; - ei_status.block_input = &ariadne2_block_input; - ei_status.block_output = &ariadne2_block_output; - ei_status.get_8390_hdr = &ariadne2_get_8390_hdr; - ei_status.reg_offset = ariadne2_offsets; - dev->open = &ariadne2_open; - dev->stop = &ariadne2_close; -#ifdef MODULE - ei_status.priv = (unsigned long)root_ariadne2_dev; - root_ariadne2_dev = dev; -#endif - NS8390_init(dev, 0); - return 0; -} - -static int ariadne2_open(struct net_device *dev) -{ - ei_open(dev); - return 0; -} - -static int ariadne2_close(struct net_device *dev) -{ - if (ei_debug > 1) - printk("%s: Shutting down ethercard.\n", dev->name); - ei_close(dev); - return 0; -} - -/* Hard reset the card. This used to pause for the same period that a - 8390 reset command required, but that shouldn't be necessary. */ -static void ariadne2_reset_8390(struct net_device *dev) -{ - unsigned long reset_start_time = jiffies; - - if (ei_debug > 1) - printk("resetting the 8390 t=%ld...", jiffies); - - z_writeb(z_readb(NE_BASE + NE_RESET), NE_BASE + NE_RESET); - - ei_status.txing = 0; - ei_status.dmaing = 0; - - /* This check _should_not_ be necessary, omit eventually. */ - while ((z_readb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0) - if (jiffies - reset_start_time > 2*HZ/100) { - printk("%s: ne_reset_8390() did not complete.\n", dev->name); - break; - } - z_writeb(ENISR_RESET, NE_BASE + NE_EN0_ISR); /* Ack intr. */ -} - -/* Grab the 8390 specific header. Similar to the block_input routine, but - we don't need to be concerned with ring wrap as the header will be at - the start of a page, so we optimize accordingly. */ - -static void ariadne2_get_8390_hdr(struct net_device *dev, - struct e8390_pkt_hdr *hdr, int ring_page) -{ - int nic_base = dev->base_addr; - int cnt; - short *ptrs; - - /* This *shouldn't* happen. If it does, it's the last thing you'll see */ - if (ei_status.dmaing) { - printk("%s: DMAing conflict in ne_get_8390_hdr " - "[DMAstat:%d][irqlock:%d].\n", dev->name, ei_status.dmaing, - ei_status.irqlock); - return; - } - - ei_status.dmaing |= 0x01; - z_writeb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD); - z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); - z_writeb(sizeof(struct e8390_pkt_hdr), nic_base + NE_EN0_RCNTLO); - z_writeb(0, nic_base + NE_EN0_RCNTHI); - z_writeb(0, nic_base + NE_EN0_RSARLO); /* On page boundary */ - z_writeb(ring_page, nic_base + NE_EN0_RSARHI); - z_writeb(E8390_RREAD+E8390_START, nic_base + NE_CMD); - - ptrs = (short*)hdr; - for (cnt = 0; cnt < (sizeof(struct e8390_pkt_hdr)>>1); cnt++) - *ptrs++ = z_readw(NE_BASE + NE_DATAPORT); - - z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr. */ - - hdr->count = WORDSWAP(hdr->count); - - ei_status.dmaing &= ~0x01; -} - -/* Block input and output, similar to the Crynwr packet driver. If you - are porting to a new ethercard, look at the packet driver source for hints. - The NEx000 doesn't share the on-board packet memory -- you have to put - the packet out through the "remote DMA" dataport using z_writeb. */ - -static void ariadne2_block_input(struct net_device *dev, int count, - struct sk_buff *skb, int ring_offset) -{ - int nic_base = dev->base_addr; - char *buf = skb->data; - short *ptrs; - int cnt; - - /* This *shouldn't* happen. If it does, it's the last thing you'll see */ - if (ei_status.dmaing) { - printk("%s: DMAing conflict in ne_block_input " - "[DMAstat:%d][irqlock:%d].\n", - dev->name, ei_status.dmaing, ei_status.irqlock); - return; - } - ei_status.dmaing |= 0x01; - z_writeb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD); - z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); - z_writeb(count & 0xff, nic_base + NE_EN0_RCNTLO); - z_writeb(count >> 8, nic_base + NE_EN0_RCNTHI); - z_writeb(ring_offset & 0xff, nic_base + NE_EN0_RSARLO); - z_writeb(ring_offset >> 8, nic_base + NE_EN0_RSARHI); - z_writeb(E8390_RREAD+E8390_START, nic_base + NE_CMD); - ptrs = (short*)buf; - for (cnt = 0; cnt < (count>>1); cnt++) - *ptrs++ = z_readw(NE_BASE + NE_DATAPORT); - if (count & 0x01) - buf[count-1] = z_readb(NE_BASE + NE_DATAPORT); - - z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr. */ - ei_status.dmaing &= ~0x01; -} - -static void ariadne2_block_output(struct net_device *dev, int count, - const unsigned char *buf, - const int start_page) -{ - int nic_base = NE_BASE; - unsigned long dma_start; - short *ptrs; - int cnt; - - /* Round the count up for word writes. Do we need to do this? - What effect will an odd byte count have on the 8390? - I should check someday. */ - if (count & 0x01) - count++; - - /* This *shouldn't* happen. If it does, it's the last thing you'll see */ - if (ei_status.dmaing) { - printk("%s: DMAing conflict in ne_block_output." - "[DMAstat:%d][irqlock:%d]\n", dev->name, ei_status.dmaing, - ei_status.irqlock); - return; - } - ei_status.dmaing |= 0x01; - /* We should already be in page 0, but to be safe... */ - z_writeb(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD); - - z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); - - /* Now the normal output. */ - z_writeb(count & 0xff, nic_base + NE_EN0_RCNTLO); - z_writeb(count >> 8, nic_base + NE_EN0_RCNTHI); - z_writeb(0x00, nic_base + NE_EN0_RSARLO); - z_writeb(start_page, nic_base + NE_EN0_RSARHI); - - z_writeb(E8390_RWRITE+E8390_START, nic_base + NE_CMD); - ptrs = (short*)buf; - for (cnt = 0; cnt < count>>1; cnt++) - z_writew(*ptrs++, NE_BASE+NE_DATAPORT); - - dma_start = jiffies; - - while ((z_readb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0) - if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ - printk("%s: timeout waiting for Tx RDC.\n", dev->name); - ariadne2_reset_8390(dev); - NS8390_init(dev,1); - break; - } - - z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr. */ - ei_status.dmaing &= ~0x01; - return; -} - -static void __exit ariadne2_cleanup(void) -{ -#ifdef MODULE - struct net_device *dev, *next; - - while ((dev = root_ariadne2_dev)) { - next = (struct net_device *)(ei_status.priv); - unregister_netdev(dev); - free_irq(IRQ_AMIGA_PORTS, dev); - release_mem_region(ZTWO_PADDR(dev->base_addr), NE_IO_EXTENT*2); - kfree(dev); - root_ariadne2_dev = next; - } -#endif -} - -module_init(ariadne2_probe); -module_exit(ariadne2_cleanup); - -MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/b44.c linux-2.4.23-pre8/drivers/net/b44.c --- linux-2.4.22/drivers/net/b44.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/b44.c 2003-10-22 22:48:41.000000000 +0000 @@ -25,8 +25,8 @@ #define DRV_MODULE_NAME "b44" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "0.9" -#define DRV_MODULE_RELDATE "Jul 14, 2003" +#define DRV_MODULE_VERSION "0.91" +#define DRV_MODULE_RELDATE "Oct 3, 2003" #define B44_DEF_MSG_ENABLE \ (NETIF_MSG_DRV | \ @@ -80,16 +80,7 @@ static int b44_debug = -1; /* -1 == use B44_DEF_MSG_ENABLE as value */ -#ifndef PCI_DEVICE_ID_BCM4401 -#define PCI_DEVICE_ID_BCM4401 0x4401 -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -#define IRQ_RETVAL(x) -#define irqreturn_t void -#endif - -static struct pci_device_id b44_pci_tbl[] __devinitdata = { +static struct pci_device_id b44_pci_tbl[] = { { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM4401, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { } /* terminate list with empty entry */ @@ -870,6 +861,8 @@ spin_unlock_irq(&bp->lock); + b44_enable_ints(bp); + netif_wake_queue(dev); } @@ -1393,7 +1386,7 @@ strcpy (info.driver, DRV_MODULE_NAME); strcpy (info.version, DRV_MODULE_VERSION); memset(&info.fw_version, 0, sizeof(info.fw_version)); - strcpy (info.bus_info, pci_dev->slot_name); + strcpy (info.bus_info, pci_name(pci_dev)); info.eedump_len = 0; info.regdump_len = 0; if (copy_to_user (useraddr, &info, sizeof (info))) @@ -1834,7 +1827,7 @@ iounmap((void *) bp->regs); err_out_free_dev: - kfree(dev); + free_netdev(dev); err_out_free_res: pci_release_regions(pdev); @@ -1852,7 +1845,7 @@ if (dev) { unregister_netdev(dev); iounmap((void *) ((struct b44 *)(dev->priv))->regs); - kfree(dev); + free_netdev(dev); pci_release_regions(pdev); pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/bonding/bond_alb.c linux-2.4.23-pre8/drivers/net/bonding/bond_alb.c --- linux-2.4.22/drivers/net/bonding/bond_alb.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/bonding/bond_alb.c 2003-10-22 22:48:26.000000000 +0000 @@ -24,10 +24,15 @@ * 2003/06/25 - Shmulik Hen * - Fixed signed/unsigned calculation errors that caused load sharing * to collapse to one slave under very heavy UDP Tx stress. + * + * 2003/08/06 - Amir Noam + * - Add support for setting bond's MAC address with special + * handling required for ALB/TLB. */ #include #include +#include #include #include #include @@ -943,10 +948,11 @@ } /* hw is a boolean parameter that determines whether we should try and - * set the hw address of the hw as well as the hw address of the net_device + * set the hw address of the device as well as the hw address of the + * net_device */ static int -alb_set_mac_addr(struct slave *slave, u8 addr[], int hw) +alb_set_slave_mac_addr(struct slave *slave, u8 addr[], int hw) { struct net_device *dev = NULL; struct sockaddr s_addr; @@ -954,16 +960,16 @@ dev = slave->dev; if (!hw) { - memcpy(dev->dev_addr, addr, ETH_ALEN); + memcpy(dev->dev_addr, addr, dev->addr_len); return 0; } /* for rlb each slave must have a unique hw mac addresses so that */ /* each slave will receive packets destined to a different mac */ - memcpy(s_addr.sa_data, addr, ETH_ALEN); + 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_mac_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" @@ -987,8 +993,8 @@ slaves_state_differ = (SLAVE_IS_OK(slave1) != SLAVE_IS_OK(slave2)); memcpy(tmp_mac_addr, slave1->dev->dev_addr, ETH_ALEN); - alb_set_mac_addr(slave1, slave2->dev->dev_addr, bond->alb_info.rlb_enabled); - alb_set_mac_addr(slave2, tmp_mac_addr, bond->alb_info.rlb_enabled); + alb_set_slave_mac_addr(slave1, slave2->dev->dev_addr, bond->alb_info.rlb_enabled); + alb_set_slave_mac_addr(slave2, tmp_mac_addr, bond->alb_info.rlb_enabled); /* fasten the change in the switch */ if (SLAVE_IS_OK(slave1)) { @@ -1153,8 +1159,8 @@ } if (tmp_slave1) { - alb_set_mac_addr(slave, tmp_slave1->perm_hwaddr, - bond->alb_info.rlb_enabled); + alb_set_slave_mac_addr(slave, tmp_slave1->perm_hwaddr, + bond->alb_info.rlb_enabled); printk(KERN_WARNING "bonding: Warning: the hw address " "of slave %s is in use by the bond; " @@ -1172,6 +1178,67 @@ return 0; } +/** + * alb_set_mac_address + * @bond: + * @addr: + * + * In TLB mode all slaves are configured to the bond's hw address, but set + * their dev_addr field to different addresses (based on their permanent hw + * addresses). + * + * 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) +{ + struct sockaddr sa; + struct slave *slave; + char tmp_addr[ETH_ALEN]; + int error; + + if (bond->alb_info.rlb_enabled) { + return 0; + } + + slave = bond_get_first_slave(bond); + for (; slave; slave = bond_get_next_slave(bond, slave)) { + if (slave->dev->set_mac_address == NULL) { + error = -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); + + /* restore net_device's hw address */ + memcpy(slave->dev->dev_addr, tmp_addr, ETH_ALEN); + + if (error) { + goto unwind; + } + } + + 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(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; +} + /************************ exported alb funcions ************************/ int @@ -1442,8 +1509,8 @@ { int err = 0; - err = alb_set_mac_addr(slave, slave->perm_hwaddr, - bond->alb_info.rlb_enabled); + err = alb_set_slave_mac_addr(slave, slave->perm_hwaddr, + bond->alb_info.rlb_enabled); if (err) { return err; } @@ -1567,10 +1634,61 @@ alb_swap_mac_addr(bond, swap_slave, new_slave); } else { /* set the new_slave to the bond mac address */ - alb_set_mac_addr(new_slave, bond->device->dev_addr, - bond->alb_info.rlb_enabled); + alb_set_slave_mac_addr(new_slave, bond->device->dev_addr, + bond->alb_info.rlb_enabled); /* fasten bond mac on new current slave */ alb_send_learning_packets(new_slave, bond->device->dev_addr); } } +int +bond_alb_set_mac_address(struct net_device *dev, void *addr) +{ + struct bonding *bond = dev->priv; + struct sockaddr *sa = addr; + struct slave *swap_slave = NULL; + int error = 0; + + if (!is_valid_ether_addr(sa->sa_data)) { + return -EADDRNOTAVAIL; + } + + error = alb_set_mac_address(bond, addr); + if (error) { + return error; + } + + memcpy(dev->dev_addr, sa->sa_data, dev->addr_len); + + /* If there is no current_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) { + return 0; + } + + swap_slave = bond_get_first_slave(bond); + while (swap_slave) { + if (!memcmp(swap_slave->dev->dev_addr, dev->dev_addr, ETH_ALEN)) { + break; + } + swap_slave = bond_get_next_slave(bond, swap_slave); + } + + if (swap_slave) { + alb_swap_mac_addr(bond, swap_slave, bond->current_slave); + } else { + alb_set_slave_mac_addr(bond->current_slave, dev->dev_addr, + bond->alb_info.rlb_enabled); + + alb_send_learning_packets(bond->current_slave, dev->dev_addr); + if (bond->alb_info.rlb_enabled) { + /* inform clients mac address has changed */ + rlb_req_update_slave_clients(bond, bond->current_slave); + } + } + + return 0; +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/bonding/bond_alb.h linux-2.4.23-pre8/drivers/net/bonding/bond_alb.h --- linux-2.4.22/drivers/net/bonding/bond_alb.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/bonding/bond_alb.h 2003-10-22 22:49:04.000000000 +0000 @@ -17,6 +17,13 @@ * * The full GNU General Public License is included in this distribution in the * file called LICENSE. + * + * + * Changes: + * + * 2003/08/06 - Amir Noam + * - Add support for setting bond's MAC address with special + * handling required for ALB/TLB. */ #ifndef __BOND_ALB_H__ @@ -122,6 +129,7 @@ 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_monitor(struct bonding *bond); +int bond_alb_set_mac_address(struct net_device *dev, void *addr); #endif /* __BOND_ALB_H__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/bonding/bond_main.c linux-2.4.23-pre8/drivers/net/bonding/bond_main.c --- linux-2.4.22/drivers/net/bonding/bond_main.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/bonding/bond_main.c 2003-10-22 22:48:31.000000000 +0000 @@ -278,7 +278,7 @@ * bonding round-robin mode ignoring links after failover/recovery * * 2003/03/17 - Jay Vosburgh - * - kmalloc fix (GPF_KERNEL to GPF_ATOMIC) reported by + * - kmalloc fix (GFP_KERNEL to GFP_ATOMIC) reported by * Shmulik dot Hen at intel.com. * - Based on discussion on mailing list, changed use of * update_slave_cnt(), created wrapper functions for adding/removing @@ -323,22 +323,22 @@ * 2003/03/18 - Amir Noam , * Tsippy Mendelson and * Shmulik Hen - * - Added support for IEEE 802.3ad Dynamic link aggregation mode. + * - Added support for IEEE 802.3ad Dynamic link aggregation mode. * * 2003/05/01 - Amir Noam - * - Added ABI version control to restore compatibility between - * new/old ifenslave and new/old bonding. + * - Added ABI version control to restore compatibility between + * new/old ifenslave and new/old bonding. * * 2003/05/01 - Shmulik Hen - * - Fixed bug in bond_release_all(): save old value of current_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 - * fields X.Y.Z where: - * X - Major version - big behavior changes - * Y - Minor version - addition of features - * Z - Extra version - minor changes and bug fixes - * The current version is 1.0.0 as a base line. + * - Fixed bug in bond_release_all(): save old value of current_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 + * fields X.Y.Z where: + * X - Major version - big behavior changes + * Y - Minor version - addition of features + * Z - Extra version - minor changes and bug fixes + * The current version is 1.0.0 as a base line. * * 2003/05/01 - Tsippy Mendelson and * Amir Noam @@ -382,12 +382,50 @@ * ABI version if receiving unsupported ioctl commands. * * 2003/05/22 - Jay Vosburgh + * - Fix ifenslave -c causing bond to loose existing routes; + * added bond_set_mac_address() that doesn't require the + * bond to be down. * - In conjunction with fix for ifenslave -c, in * bond_change_active(), changing to the already active slave * is no longer an error (it successfully does nothing). * * 2003/06/30 - Amir Noam * - Fixed bond_change_active() for ALB/TLB modes. + * Version to 2.2.14. + * + * 2003/07/29 - Amir Noam + * - Fixed ARP monitoring bug. + * Version to 2.2.15. + * + * 2003/07/31 - Willy Tarreau + * - Fixed kernel panic when using ARP monitoring without + * setting bond's IP address. + * Version to 2.2.16. + * + * 2003/08/06 - Amir Noam + * - Back port from 2.6: use alloc_netdev(); fix /proc handling; + * made stats a part of bond struct so no need to allocate + * and free it separately; use standard list operations instead + * of pre-allocated array of bonds. + * Version to 2.3.0. + * + * 2003/08/07 - Jay Vosburgh , + * Amir Noam and + * Shmulik Hen + * - Propagating master's settings: Distinguish between modes that + * use a primary slave from those that don't, and propagate settings + * accordingly; Consolidate change_active opeartions and add + * reselect_active and find_best opeartions; Decouple promiscuous + * handling from the multicast mode setting; Add support for changing + * HW address and MTU with proper unwind; Consolidate procfs code, + * add CHANGENAME handler; Enhance netdev notification handling. + * Version to 2.4.0. + * + * 2003/09/15 - Stephen Hemminger , + * Amir Noam + * - Convert /proc to seq_file interface. + * Change /proc/net/bondX/info to /proc/net/bonding/bondX. + * Set version to 2.4.1. */ #include @@ -421,6 +459,8 @@ #include #include #include +#include +#include #include #include @@ -432,10 +472,10 @@ #include "bond_3ad.h" #include "bond_alb.h" -#define DRV_VERSION "2.2.14" -#define DRV_RELDATE "June 30, 2003" -#define DRV_NAME "bonding" -#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" +#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"; @@ -453,6 +493,11 @@ #define MAX_ARP_IP_TARGETS 16 #endif +#define USES_PRIMARY(mode) \ + (((mode) == BOND_MODE_ACTIVEBACKUP) || \ + ((mode) == BOND_MODE_TLB) || \ + ((mode) == BOND_MODE_ALB)) + struct bond_parm_tbl { char *modename; int mode; @@ -515,9 +560,10 @@ { NULL, -1}, }; -static int first_pass = 1; -static struct bonding *these_bonds = NULL; -static struct net_device *dev_bonds = NULL; +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"); @@ -549,7 +595,6 @@ 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 int bond_event(struct notifier_block *this, unsigned long event, void *ptr); 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); @@ -563,30 +608,17 @@ 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); -/* - * bond_get_info is the interface into the /proc filesystem. This is - * a different interface than the BOND_INFO_QUERY ioctl. That is done - * through the generic networking ioctl interface, and bond_info_query - * is the internal function which provides that information. - */ -static int bond_get_info(char *buf, char **start, off_t offset, int length); - -/* Caller must hold bond->ptrlock for write */ -static inline struct slave* -bond_assign_current_slave(struct bonding *bond,struct slave *newslave) -{ - if ((bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { - bond_alb_assign_current_slave(bond, newslave); - } else { - bond->current_slave = newslave; - } - - return bond->current_slave; -} /* #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 */ @@ -675,26 +707,13 @@ BUG(); } -/* - * Set MAC. Differs from eth_mac_addr in that we allow changes while - * netif_running(). - */ -static int -bond_set_mac_address(struct net_device *dev, void *p) -{ - struct sockaddr *addr = p; - - memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); - return 0; -} - /* * 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's replaced with bond->next, or NULL if not applicable. + * it should be changed by the calling function. * * bond->lock held for writing by caller. */ @@ -728,17 +747,6 @@ update_slave_cnt(bond, -1); - /* no need to hold ptrlock since bond lock is - * already held for writing - */ - if (slave == bond->current_slave) { - if ( bond->next != (slave_t *)bond) { /* found one slave */ - bond_assign_current_slave(bond, bond->next); - } else { - bond_assign_current_slave(bond, NULL); - } - } - return slave; } @@ -983,8 +991,6 @@ add_timer(alb_timer); } - MOD_INC_USE_COUNT; - if (miimon > 0) { /* link check interval, in milliseconds. */ init_timer(timer); timer->expires = jiffies + (miimon * HZ / 1000); @@ -1058,7 +1064,6 @@ bond_alb_deinitialize(bond); } - MOD_DEC_USE_COUNT; return 0; } @@ -1173,23 +1178,22 @@ } /* - * Push the promiscuity flag down to all slaves + * Push the promiscuity flag down to appropriate slaves */ static void bond_set_promiscuity(bonding_t *bond, int inc) { slave_t *slave; - switch (multicast_mode) { - case BOND_MULTICAST_ACTIVE : - /* write lock already acquired */ - if (bond->current_slave != NULL) + + if (USES_PRIMARY(bond_mode)) { + if (bond->current_slave) { dev_set_promiscuity(bond->current_slave->dev, inc); - break; - case BOND_MULTICAST_ALL : - for (slave = bond->prev; slave != (slave_t*)bond; slave = slave->prev) + } + + } else { + for (slave = bond->prev; slave != (slave_t*)bond; + slave = slave->prev) { dev_set_promiscuity(slave->dev, inc); - break; - case BOND_MULTICAST_DISABLED : - break; + } } } @@ -1235,20 +1239,23 @@ bonding_t *bond = master->priv; struct dev_mc_list *dmi; - if (multicast_mode == BOND_MULTICAST_DISABLED) - return; - /* - * Lock the private data for the master - */ write_lock_bh(&bond->lock); - /* set promiscuity flag to slaves */ + /* + * Do promisc before checking multicast_mode + */ if ( (master->flags & IFF_PROMISC) && !(bond->flags & IFF_PROMISC) ) bond_set_promiscuity(bond, 1); if ( !(master->flags & IFF_PROMISC) && (bond->flags & IFF_PROMISC) ) bond_set_promiscuity(bond, -1); + if (multicast_mode == BOND_MULTICAST_DISABLED) { + bond->flags = master->flags; + write_unlock_bh(&bond->lock); + return; + } + /* set allmulti flag to slaves */ if ( (master->flags & IFF_ALLMULTI) && !(bond->flags & IFF_ALLMULTI) ) bond_set_allmulti(bond, 1); @@ -1280,32 +1287,40 @@ /* * Update the mc list and multicast-related flags for the new and - * old active slaves (if any) according to the multicast mode + * old active slaves (if any) according to the multicast mode, and + * promiscuous flags unconditionally. */ static void bond_mc_update(bonding_t *bond, slave_t *new, slave_t *old) { struct dev_mc_list *dmi; - switch(multicast_mode) { - case BOND_MULTICAST_ACTIVE : + if (USES_PRIMARY(bond_mode)) { if (bond->device->flags & IFF_PROMISC) { - if (old != NULL && new != old) + if (old) dev_set_promiscuity(old->dev, -1); - dev_set_promiscuity(new->dev, 1); + if (new) + dev_set_promiscuity(new->dev, 1); } + } + + switch(multicast_mode) { + case BOND_MULTICAST_ACTIVE : if (bond->device->flags & IFF_ALLMULTI) { - if (old != NULL && new != old) + if (old) dev_set_allmulti(old->dev, -1); - dev_set_allmulti(new->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 != NULL && new != old) { + 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); } - for (dmi = bond->device->mc_list; dmi != NULL; dmi = dmi->next) - dev_mc_add(new->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); + } break; case BOND_MULTICAST_ALL : /* nothing to do: mc list is already up-to-date on all slaves */ @@ -1421,7 +1436,7 @@ * The application already set the master's * mac address to that of the first slave */ - memcpy(addr.sa_data, master_dev->dev_addr, ETH_ALEN); + 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) { @@ -1467,11 +1482,19 @@ } } - if (multicast_mode == BOND_MULTICAST_ALL) { - /* set promiscuity level to new slave */ - if (master_dev->flags & IFF_PROMISC) + /* 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 (multicast_mode == BOND_MULTICAST_ALL) { /* set allmulti level to new slave */ if (master_dev->flags & IFF_ALLMULTI) dev_set_allmulti(slave_dev, 1); @@ -1584,9 +1607,7 @@ #endif /* first slave or no active slave yet, and this link is OK, so make this interface the active one */ - bond_assign_current_slave(bond, new_slave); - bond_set_slave_active_flags(new_slave); - bond_mc_update(bond, new_slave, NULL); + change_active_interface(bond, new_slave); } else { #ifdef BONDING_DEBUG @@ -1636,7 +1657,7 @@ /* first slave or no active slave yet, and this link * is OK, so make this interface the active one */ - bond_assign_current_slave(bond, new_slave); + change_active_interface(bond, new_slave); } /* if there is a primary slave, remember it */ @@ -1651,8 +1672,13 @@ #endif /* always active in trunk mode */ new_slave->state = BOND_STATE_ACTIVE; + + /* In trunking mode there is little meaning to current_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_assign_current_slave(bond, new_slave); + bond->current_slave = new_slave; } write_unlock_bh(&bond->lock); @@ -1743,6 +1769,13 @@ return -ENODEV; } + /* Verify that master_dev is indeed the master of slave_dev */ + if (!(slave_dev->flags & IFF_SLAVE) || + (slave_dev->master != master_dev)) { + + return -EINVAL; + } + bond = (struct bonding *) master_dev->priv; write_lock_bh(&bond->lock); slave = (slave_t *)bond; @@ -1767,16 +1800,7 @@ (oldactive != NULL)&& (newactive->link == BOND_LINK_UP)&& IS_UP(newactive->dev)) { - if (bond_mode == BOND_MODE_ACTIVEBACKUP) { - bond_set_slave_inactive_flags(oldactive); - bond_set_slave_active_flags(newactive); - } - - bond_mc_update(bond, newactive, oldactive); - bond_assign_current_slave(bond, newactive); - printk("%s : activate %s(old : %s)\n", - master_dev->name, newactive->dev->name, - oldactive->dev->name); + change_active_interface(bond, newactive); } else { ret = -EINVAL; } @@ -1784,47 +1808,26 @@ return ret; } -/* Choose a new valid interface from the pool, set it active - * and make it the current slave. If no valid interface is - * found, the oldest slave in BACK state is choosen and - * activated. If none is found, it's considered as no - * interfaces left so the current slave is set to NULL. - * The result is a pointer to the current slave. - * - * Since this function sends messages tails through printk, the caller - * must have started something like `printk(KERN_INFO "xxxx ");'. +/** + * find_best_interface - select the best available slave to be the active one + * @bond: our bonding struct * * Warning: Caller must hold ptrlock for writing. */ -slave_t *change_active_interface(bonding_t *bond) +static struct slave *find_best_interface(struct bonding *bond) { - slave_t *newslave, *oldslave; - slave_t *bestslave = NULL; + 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_assign_current_slave(bond, bond->next); + newslave = bond->next; } else { - - printk (" but could not find any %s interface.\n", - (bond_mode == BOND_MODE_ACTIVEBACKUP) ? "backup":"other"); - bond_assign_current_slave(bond, NULL); return NULL; /* still no slave, return NULL */ } - } else if (bond_mode == BOND_MODE_ACTIVEBACKUP) { - /* make sure oldslave doesn't send arps - this could - * cause a ping-pong effect between interfaces since they - * would be able to tx arps - in active backup only one - * slave should be able to tx arps, and that should be - * the current_slave; the only exception is when all - * slaves have gone down, then only one non-current slave can - * send arps at a time; clearing oldslaves' mc list is handled - * later in this function. - */ - bond_set_slave_inactive_flags(oldslave); } mintime = updelay; @@ -1839,22 +1842,12 @@ newslave = bond->primary_slave; } + /* remember where to stop iterating over the slaves */ + oldslave = newslave; + do { if (IS_UP(newslave->dev)) { if (newslave->link == BOND_LINK_UP) { - /* this one is immediately usable */ - if (bond_mode == BOND_MODE_ACTIVEBACKUP) { - bond_set_slave_active_flags(newslave); - bond_mc_update(bond, newslave, oldslave); - printk (" and making interface %s the active one.\n", - newslave->dev->name); - } - else { - printk (" and setting pointer to interface %s.\n", - newslave->dev->name); - } - - bond_assign_current_slave(bond, newslave); return newslave; } else if (newslave->link == BOND_LINK_BACK) { @@ -1867,46 +1860,105 @@ } } while ((newslave = newslave->next) != oldslave); - /* no usable backup found, we'll see if we at least got a link that was - coming back for a long time, and could possibly already be usable. - */ - - if (bestslave != NULL) { - /* early take-over. */ - printk (" and making interface %s the active one %d ms earlier.\n", - bestslave->dev->name, - (updelay - bestslave->delay)*miimon); - - bestslave->delay = 0; - bestslave->link = BOND_LINK_UP; - bestslave->jiffies = jiffies; - bond_set_slave_active_flags(bestslave); - bond_mc_update(bond, bestslave, oldslave); - bond_assign_current_slave(bond, bestslave); - return bestslave; - } - - if ((bond_mode == BOND_MODE_ACTIVEBACKUP) && - (multicast_mode == BOND_MULTICAST_ACTIVE) && - (oldslave != NULL)) { - /* flush bonds (master's) mc_list from oldslave since it wasn't - * updated (and deleted) above - */ - bond_mc_list_flush(oldslave->dev, bond->device); - if (bond->device->flags & IFF_PROMISC) { - dev_set_promiscuity(oldslave->dev, -1); + 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; + } + + 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); + } + + new->delay = 0; + new->link = BOND_LINK_UP; + new->jiffies = jiffies; + + if (bond_mode == BOND_MODE_8023AD) { + bond_3ad_handle_link_change(new, BOND_LINK_UP); + } + + 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->device->flags & IFF_ALLMULTI) { - dev_set_allmulti(oldslave->dev, -1); + } + + if (bond_mode == BOND_MODE_ACTIVEBACKUP) { + if (old) { + bond_set_slave_inactive_flags(old); + } + + if (new) { + bond_set_slave_active_flags(new); } } - printk (" but could not find any %s interface.\n", - (bond_mode == BOND_MODE_ACTIVEBACKUP) ? "backup":"other"); - - /* absolutely nothing found. let's return NULL */ - bond_assign_current_slave(bond, NULL); - return NULL; + if (USES_PRIMARY(bond_mode)) { + bond_mc_update(bond, new, old); + } + + 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); + } } /* @@ -1955,12 +2007,12 @@ "of %s to a different address " "to avoid conflicts.\n", slave->name, - slave->dev_addr[0], - slave->dev_addr[1], - slave->dev_addr[2], - slave->dev_addr[3], - slave->dev_addr[4], - slave->dev_addr[5], + 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); } @@ -1973,6 +2025,11 @@ 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); @@ -1980,18 +2037,11 @@ bond->primary_slave = NULL; } - printk (KERN_INFO "%s: releasing %s interface %s", - master->name, - (our_slave->state == BOND_STATE_ACTIVE) ? "active" : "backup", - slave->name); - - if (our_slave == old_current) { - /* find a new interface and be verbose */ - change_active_interface(bond); - } else { - printk(".\n"); + 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", @@ -2019,16 +2069,22 @@ 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); + } + } + /* 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 promiscuity level from slave */ - if (master->flags & IFF_PROMISC) - dev_set_promiscuity(slave, -1); - /* unset allmulti level from slave */ if (master->flags & IFF_ALLMULTI) dev_set_allmulti(slave, -1); @@ -2095,7 +2151,7 @@ } old_current = bond->current_slave; - bond_assign_current_slave(bond, NULL); + change_active_interface(bond, NULL); bond->current_arp_slave = NULL; bond->primary_slave = NULL; @@ -2124,17 +2180,17 @@ */ write_unlock_bh(&bond->lock); - if (multicast_mode == BOND_MULTICAST_ALL - || (multicast_mode == BOND_MULTICAST_ACTIVE - && old_current == our_slave)) { + /* unset promiscuity level from slave */ + if (master->flags & IFF_PROMISC) { + if (!USES_PRIMARY(bond_mode)) { + 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 promiscuity level from slave */ - if (master->flags & IFF_PROMISC) - dev_set_promiscuity(slave_dev, -1); - /* unset allmulti level from slave */ if (master->flags & IFF_ALLMULTI) dev_set_allmulti(slave_dev, -1); @@ -2183,8 +2239,9 @@ static void bond_mii_monitor(struct net_device *master) { bonding_t *bond = (struct bonding *) master->priv; - slave_t *slave, *bestslave, *oldcurrent; + slave_t *slave, *oldcurrent; int slave_died = 0; + int do_failover = 0; read_lock(&bond->lock); @@ -2194,7 +2251,6 @@ * program could monitor the link itself if needed. */ - bestslave = NULL; slave = (slave_t *)bond; read_lock(&bond->ptrlock); @@ -2202,8 +2258,6 @@ read_unlock(&bond->ptrlock); while ((slave = slave->prev) != (slave_t *)bond) { - /* use updelay+1 to match an UP slave even when updelay is 0 */ - int mindelay = updelay + 1; struct net_device *dev = slave->dev; int link_state; u16 old_speed = slave->speed; @@ -2214,14 +2268,7 @@ switch (slave->link) { case BOND_LINK_UP: /* the link was up */ if (link_state == BMSR_LSTATUS) { - /* link stays up, tell that this one - is immediately available */ - if (IS_UP(dev) && (mindelay > -2)) { - /* -2 is the best case : - this slave was already up */ - mindelay = -2; - bestslave = slave; - } + /* link stays up, nothing more to do */ break; } else { /* link going down */ @@ -2261,6 +2308,7 @@ (bond_mode == BOND_MODE_8023AD)) { bond_set_slave_inactive_flags(slave); } + printk(KERN_INFO "%s: link status definitely down " "for interface %s, disabling it", @@ -2277,14 +2325,10 @@ bond_alb_handle_link_change(bond, slave, BOND_LINK_DOWN); } - write_lock(&bond->ptrlock); - if (slave == bond->current_slave) { - /* find a new interface and be verbose */ - change_active_interface(bond); - } else { - printk(".\n"); + if (slave == oldcurrent) { + do_failover = 1; } - write_unlock(&bond->ptrlock); + slave_died = 1; } else { slave->delay--; @@ -2299,13 +2343,6 @@ master->name, (downdelay - slave->delay) * miimon, dev->name); - - if (IS_UP(dev) && (mindelay > -1)) { - /* -1 is a good case : this slave went - down only for a short time */ - mindelay = -1; - bestslave = slave; - } } break; case BOND_LINK_DOWN: /* the link was down */ @@ -2375,26 +2412,12 @@ bond_alb_handle_link_change(bond, slave, BOND_LINK_UP); } - write_lock(&bond->ptrlock); - if ( (bond->primary_slave != NULL) - && (slave == bond->primary_slave) ) - change_active_interface(bond); - write_unlock(&bond->ptrlock); - } - else + if ((oldcurrent == NULL) || + (slave == bond->primary_slave)) { + do_failover = 1; + } + } else { slave->delay--; - - /* we'll also look for the mostly eligible slave */ - if (bond->primary_slave == NULL) { - if (IS_UP(dev) && (slave->delay < mindelay)) { - mindelay = slave->delay; - bestslave = slave; - } - } else if ( (IS_UP(bond->primary_slave->dev)) || - ( (!IS_UP(bond->primary_slave->dev)) && - (IS_UP(dev) && (slave->delay < mindelay)) ) ) { - mindelay = slave->delay; - bestslave = slave; } } break; @@ -2413,58 +2436,17 @@ } /* end of while */ - /* - * if there's no active interface and we discovered that one - * of the slaves could be activated earlier, so we do it. - */ - read_lock(&bond->ptrlock); - oldcurrent = bond->current_slave; - read_unlock(&bond->ptrlock); - - /* no active interface at the moment or need to bring up the primary */ - if (oldcurrent == NULL) { /* no active interface at the moment */ - if (bestslave != NULL) { /* last chance to find one ? */ - if (bestslave->link == BOND_LINK_UP) { - printk (KERN_INFO - "%s: making interface %s the new active one.\n", - master->name, bestslave->dev->name); - } else { - printk (KERN_INFO - "%s: making interface %s the new " - "active one %d ms earlier.\n", - master->name, bestslave->dev->name, - (updelay - bestslave->delay) * miimon); - - bestslave->delay = 0; - bestslave->link = BOND_LINK_UP; - bestslave->jiffies = jiffies; - - /* notify ad that the link status has changed */ - if (bond_mode == BOND_MODE_8023AD) { - bond_3ad_handle_link_change(bestslave, BOND_LINK_UP); - } - - if ((bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { - bond_alb_handle_link_change(bond, bestslave, BOND_LINK_UP); - } - } + if (do_failover) { + write_lock(&bond->ptrlock); - if (bond_mode == BOND_MODE_ACTIVEBACKUP) { - bond_set_slave_active_flags(bestslave); - bond_mc_update(bond, bestslave, NULL); - } else if (bond_mode != BOND_MODE_8023AD) { - bestslave->state = BOND_STATE_ACTIVE; - } - write_lock(&bond->ptrlock); - bond_assign_current_slave(bond, bestslave); - write_unlock(&bond->ptrlock); - } else if (slave_died) { - /* print this message only once a slave has just died */ + reselect_active_interface(bond); + if (oldcurrent && !bond->current_slave) { printk(KERN_INFO "%s: now running without any active interface !\n", master->name); } + + write_unlock(&bond->ptrlock); } read_unlock(&bond->lock); @@ -2482,9 +2464,10 @@ static void loadbalance_arp_monitor(struct net_device *master) { bonding_t *bond; - slave_t *slave; + slave_t *slave, *oldcurrent; int the_delta_in_ticks = arp_interval * HZ / 1000; int next_timer = jiffies + (arp_interval * HZ / 1000); + int do_failover = 0; bond = (struct bonding *) master->priv; if (master->priv == NULL) { @@ -2508,6 +2491,10 @@ read_lock(&bond->lock); + read_lock(&bond->ptrlock); + oldcurrent = bond->current_slave; + read_unlock(&bond->ptrlock); + /* 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 * the picture unless it is null. also, slave->jiffies is not needed @@ -2534,21 +2521,19 @@ * current_slave being null after enslaving * is closed. */ - write_lock(&bond->ptrlock); - if (bond->current_slave == NULL) { + if (oldcurrent == NULL) { printk(KERN_INFO "%s: link status definitely up " "for interface %s, ", master->name, slave->dev->name); - change_active_interface(bond); + do_failover = 1; } else { printk(KERN_INFO "%s: interface %s is now up\n", master->name, slave->dev->name); } - write_unlock(&bond->ptrlock); } } else { /* slave->link == BOND_LINK_UP */ @@ -2571,11 +2556,9 @@ master->name, slave->dev->name); - write_lock(&bond->ptrlock); - if (slave == bond->current_slave) { - change_active_interface(bond); + if (slave == oldcurrent) { + do_failover = 1; } - write_unlock(&bond->ptrlock); } } @@ -2591,6 +2574,19 @@ } } + if (do_failover) { + write_lock(&bond->ptrlock); + + reselect_active_interface(bond); + if (oldcurrent && !bond->current_slave) { + printk(KERN_INFO + "%s: now running without any active interface !\n", + master->name); + } + + write_unlock(&bond->ptrlock); + } + read_unlock(&bond->lock); rtnl_exunlock(); rtnl_shunlock(); @@ -2651,9 +2647,7 @@ if ((bond->current_slave == NULL) && ((jiffies - slave->dev->trans_start) <= the_delta_in_ticks)) { - bond_assign_current_slave(bond, slave); - bond_set_slave_active_flags(slave); - bond_mc_update(bond, slave, NULL); + change_active_interface(bond, slave); bond->current_arp_slave = NULL; } else if (bond->current_slave != slave) { /* this slave has just come up but we @@ -2743,7 +2737,8 @@ master->name, slave->dev->name); write_lock(&bond->ptrlock); - slave = change_active_interface(bond); + reselect_active_interface(bond); + slave = bond->current_slave; write_unlock(&bond->ptrlock); bond->current_arp_slave = slave; if (slave != NULL) { @@ -2762,13 +2757,10 @@ bond->primary_slave->dev->name); /* primary is up so switch to it */ - bond_set_slave_inactive_flags(slave); - bond_mc_update(bond, bond->primary_slave, slave); write_lock(&bond->ptrlock); - bond_assign_current_slave(bond, bond->primary_slave); + change_active_interface(bond, bond->primary_slave); write_unlock(&bond->ptrlock); slave = bond->primary_slave; - bond_set_slave_active_flags(slave); slave->jiffies = jiffies; } else { bond->current_arp_slave = NULL; @@ -2811,7 +2803,7 @@ /* if the link state is up at this point, we * mark it down - this can happen if we have * simultaneous link failures and - * change_active_interface doesn't make this + * reselect_active_interface doesn't make this * one the current slave so it is still marked * up when it is actually down */ @@ -3056,15 +3048,9 @@ 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 ((bond_mode == BOND_MODE_ACTIVEBACKUP) || - (bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { + if (USES_PRIMARY(bond_mode)) { ret = bond_change_active(master_dev, slave_dev); } else { @@ -3186,7 +3172,7 @@ dev_queue_xmit(skb); write_lock(&bond->ptrlock); - bond_assign_current_slave(bond, slave->next); + bond->current_slave = slave->next; write_unlock(&bond->ptrlock); read_unlock(&bond->lock); @@ -3330,10 +3316,10 @@ 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; + struct net_device_stats *stats = &(bond->stats), *sstats; slave_t *slave; - memset(bond->stats, 0, sizeof(struct net_device_stats)); + memset(stats, 0, sizeof(struct net_device_stats)); read_lock_bh(&bond->lock); @@ -3372,215 +3358,531 @@ return stats; } -static int bond_get_info(char *buf, char **start, off_t offset, int length) +#ifdef CONFIG_PROC_FS + +#define SEQ_START_TOKEN ((void *)1) + +static void *bond_info_seq_start(struct seq_file *seq, loff_t *pos) { - bonding_t *bond = these_bonds; - int len = 0; - off_t begin = 0; - u16 link; - slave_t *slave = NULL; + struct bonding *bond = seq->private; + loff_t off = 0; + struct slave *slave; - len += sprintf(buf + len, "%s\n", version); + /* make sure the bond won't be taken away */ + read_lock(&dev_base_lock); + read_lock_bh(&bond->lock); - while (bond != NULL) { - /* - * This function locks the mutex, so we can't lock it until - * afterwards - */ - link = bond_check_mii_link(bond); + if (*pos == 0) { + return SEQ_START_TOKEN; + } - len += sprintf(buf + len, "Bonding Mode: %s\n", - bond_mode_name()); + for (slave = bond->prev; slave != (slave_t *)bond; + slave = slave->prev) { - if ((bond_mode == BOND_MODE_ACTIVEBACKUP) || - (bond_mode == BOND_MODE_TLB) || - (bond_mode == BOND_MODE_ALB)) { - read_lock_bh(&bond->lock); - read_lock(&bond->ptrlock); - if (bond->current_slave != NULL) { - len += sprintf(buf + len, - "Currently Active Slave: %s\n", - bond->current_slave->dev->name); - } - read_unlock(&bond->ptrlock); - read_unlock_bh(&bond->lock); - } - - len += sprintf(buf + len, "MII Status: "); - len += sprintf(buf + len, - link == BMSR_LSTATUS ? "up\n" : "down\n"); - len += sprintf(buf + len, "MII Polling Interval (ms): %d\n", - miimon); - len += sprintf(buf + len, "Up Delay (ms): %d\n", - updelay * miimon); - len += sprintf(buf + len, "Down Delay (ms): %d\n", - downdelay * miimon); - len += sprintf(buf + len, "Multicast Mode: %s\n", - multicast_mode_name()); + if (++off == *pos) { + return slave; + } + } - read_lock_bh(&bond->lock); + return NULL; +} - if (bond_mode == BOND_MODE_8023AD) { - struct ad_info ad_info; +static void *bond_info_seq_next(struct seq_file *seq, void *v, loff_t *pos) +{ + struct bonding *bond = seq->private; + struct slave *slave = v; - len += sprintf(buf + len, "\n802.3ad info\n"); + ++*pos; + if (v == SEQ_START_TOKEN) { + slave = bond->prev; + } else { + slave = slave->prev; + } - if (bond_3ad_get_active_agg_info(bond, &ad_info)) { - len += sprintf(buf + len, "bond %s has no active aggregator\n", bond->device->name); - } else { - len += sprintf(buf + len, "Active Aggregator Info:\n"); + return (slave == (struct slave *) bond) ? NULL : slave; +} - len += sprintf(buf + len, "\tAggregator ID: %d\n", ad_info.aggregator_id); - len += sprintf(buf + len, "\tNumber of ports: %d\n", ad_info.ports); - len += sprintf(buf + len, "\tActor Key: %d\n", ad_info.actor_key); - len += sprintf(buf + len, "\tPartner Key: %d\n", ad_info.partner_key); - len += sprintf(buf + len, "\tPartner Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\n", - ad_info.partner_system[0], - ad_info.partner_system[1], - ad_info.partner_system[2], - ad_info.partner_system[3], - ad_info.partner_system[4], - ad_info.partner_system[5]); - } +static void bond_info_seq_stop(struct seq_file *seq, void *v) +{ + struct bonding *bond = seq->private; + + read_unlock_bh(&bond->lock); + read_unlock(&dev_base_lock); +} + +static void bond_info_show_master(struct seq_file *seq, struct bonding *bond) +{ + struct slave *curr; + + read_lock(&bond->ptrlock); + curr = bond->current_slave; + read_unlock(&bond->ptrlock); + + seq_printf(seq, "Bonding Mode: %s\n", bond_mode_name()); + + if (USES_PRIMARY(bond_mode)) { + if (curr) { + seq_printf(seq, + "Currently Active Slave: %s\n", + curr->dev->name); } + } - for (slave = bond->prev; slave != (slave_t *)bond; - slave = slave->prev) { - len += sprintf(buf + len, "\nSlave Interface: %s\n", slave->dev->name); + seq_printf(seq, "MII Status: %s\n", (curr) ? "up" : "down"); + 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()); - len += sprintf(buf + len, "MII Status: "); + if (bond_mode == BOND_MODE_8023AD) { + struct ad_info ad_info; - len += sprintf(buf + len, - slave->link == BOND_LINK_UP ? - "up\n" : "down\n"); - len += sprintf(buf + len, "Link Failure Count: %d\n", - slave->link_failure_count); - - if (app_abi_ver >= 1) { - len += sprintf(buf + len, - "Permanent HW addr: %02x:%02x:%02x:%02x:%02x:%02x\n", - slave->perm_hwaddr[0], - slave->perm_hwaddr[1], - slave->perm_hwaddr[2], - slave->perm_hwaddr[3], - slave->perm_hwaddr[4], - slave->perm_hwaddr[5]); - } + seq_puts(seq, "\n802.3ad info\n"); - if (bond_mode == BOND_MODE_8023AD) { - struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator; + if (bond_3ad_get_active_agg_info(bond, &ad_info)) { + seq_printf(seq, "bond %s has no active aggregator\n", + bond->device->name); + } else { + seq_printf(seq, "Active Aggregator Info:\n"); - if (agg) { - len += sprintf(buf + len, "Aggregator ID: %d\n", - agg->aggregator_identifier); - } else { - len += sprintf(buf + len, "Aggregator ID: N/A\n"); - } - } + seq_printf(seq, "\tAggregator ID: %d\n", + ad_info.aggregator_id); + seq_printf(seq, "\tNumber of ports: %d\n", + ad_info.ports); + seq_printf(seq, "\tActor Key: %d\n", + ad_info.actor_key); + seq_printf(seq, "\tPartner Key: %d\n", + ad_info.partner_key); + seq_printf(seq, "\tPartner Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\n", + ad_info.partner_system[0], + ad_info.partner_system[1], + ad_info.partner_system[2], + ad_info.partner_system[3], + ad_info.partner_system[4], + ad_info.partner_system[5]); } - read_unlock_bh(&bond->lock); + } +} - /* - * Figure out the calcs for the /proc/net interface - */ - *start = buf + (offset - begin); - len -= (offset - begin); - if (len > length) { - len = length; +static void bond_info_show_slave(struct seq_file *seq, const struct slave *slave) +{ + seq_printf(seq, "\nSlave Interface: %s\n", slave->dev->name); + seq_printf(seq, "MII Status: %s\n", + (slave->link == BOND_LINK_UP) ? "up" : "down"); + seq_printf(seq, "Link Failure Count: %d\n", + slave->link_failure_count); + + if (app_abi_ver >= 1) { + seq_printf(seq, + "Permanent HW addr: %02x:%02x:%02x:%02x:%02x:%02x\n", + slave->perm_hwaddr[0], + slave->perm_hwaddr[1], + slave->perm_hwaddr[2], + slave->perm_hwaddr[3], + slave->perm_hwaddr[4], + slave->perm_hwaddr[5]); + } + + if (bond_mode == BOND_MODE_8023AD) { + const struct aggregator *agg + = SLAVE_AD_INFO(slave).port.aggregator; + + if (agg) { + seq_printf(seq, "Aggregator ID: %d\n", + agg->aggregator_identifier); + } else { + seq_puts(seq, "Aggregator ID: N/A\n"); } - if (len < 0) { - len = 0; + } +} + +static int bond_info_seq_show(struct seq_file *seq, void *v) +{ + if (v == SEQ_START_TOKEN) { + seq_printf(seq, "%s\n", version); + bond_info_show_master(seq, seq->private); + } else { + bond_info_show_slave(seq, v); + } + + return 0; +} + +static struct seq_operations bond_info_seq_ops = { + .start = bond_info_seq_start, + .next = bond_info_seq_next, + .stop = bond_info_seq_stop, + .show = bond_info_seq_show, +}; + +static int bond_info_open(struct inode *inode, struct file *file) +{ + struct seq_file *seq; + struct proc_dir_entry *proc; + int rc; + + rc = seq_open(file, &bond_info_seq_ops); + if (!rc) { + /* recover the pointer buried in proc_dir_entry data */ + seq = file->private_data; + proc = PDE(inode); + seq->private = proc->data; + } + return rc; +} + +static struct file_operations bond_info_fops = { + .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) +{ + struct net_device *dev = bond->device; + + 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); + } 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); } + } + return 0; +} - bond = bond->next_bond; +static void bond_destroy_proc_info(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; } - return len; } +#endif /* CONFIG_PROC_FS */ -static int bond_event(struct notifier_block *this, unsigned long event, - void *ptr) +/* + * 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 *this_bond = (struct bonding *)these_bonds; - struct bonding *last_bond; - struct net_device *event_dev = (struct net_device *)ptr; + struct bonding *bond = dev->priv; + struct sockaddr *sa = addr, tmp_sa; + struct slave *slave; + int error; - /* while there are bonds configured */ - while (this_bond != NULL) { - if (this_bond == event_dev->priv ) { - switch (event) { - case NETDEV_UNREGISTER: - /* - * remove this bond from a linked list of - * bonds - */ - if (this_bond == these_bonds) { - these_bonds = this_bond->next_bond; - } else { - for (last_bond = these_bonds; - last_bond != NULL; - last_bond = last_bond->next_bond) { - if (last_bond->next_bond == - this_bond) { - last_bond->next_bond = - this_bond->next_bond; - } - } - } - return NOTIFY_DONE; + dprintk(KERN_INFO "bond_set_mac_address %p %s\n", dev, + dev->name); - default: - return NOTIFY_DONE; - } - } else if (this_bond->device == event_dev->master) { - switch (event) { - case NETDEV_UNREGISTER: - bond_release(this_bond->device, event_dev); - break; - } - return NOTIFY_DONE; + 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; +} + +/* + * Change device name + */ +static inline int bond_event_changename(struct bonding *bond) +{ +#ifdef CONFIG_PROC_FS + bond_destroy_proc_info(bond); + bond_create_proc_info(bond); +#endif + + return NOTIFY_DONE; +} + +static int bond_master_netdev_event(unsigned long event, struct net_device *event_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; } - this_bond = this_bond->next_bond; } + + if (event_bond == NULL) { + return NOTIFY_DONE; + } + + switch (event) { + case NETDEV_CHANGENAME: + return bond_event_changename(event_bond); + case NETDEV_UNREGISTER: + /* + * TODO: remove a bond from the list? + */ + break; + default: + break; + } + return NOTIFY_DONE; } +static int bond_slave_netdev_event(unsigned long event, struct net_device *event_dev) +{ + struct net_device *master = event_dev->master; + + switch (event) { + case NETDEV_UNREGISTER: + if (master != NULL) { + bond_release(master, event_dev); + } + break; + case NETDEV_CHANGE: + /* + * TODO: is this what we get if somebody + * sets up a hierarchical bond, then rmmod's + * one of the slave bonding devices? + */ + break; + case NETDEV_DOWN: + /* + * ... Or is it this? + */ + break; + case NETDEV_CHANGEMTU: + /* + * TODO: Should slaves be allowed to + * independently alter their MTU? For + * an active-backup bond, slaves need + * not be the same type of device, so + * MTUs may vary. For other modes, + * slaves arguably should have the + * same MTUs. To do this, we'd need to + * take over the slave's change_mtu + * function for the duration of their + * servitude. + */ + break; + case NETDEV_CHANGENAME: + /* + * TODO: handle changing the primary's name + */ + break; + default: + break; + } + + return NOTIFY_DONE; +} + +/* + * bond_netdev_event: handle netdev notifier chain events. + * + * This function receives events for the netdev chain. The caller (an + * ioctl handler calling notifier_call_chain) holds the necessary + * locks for us to safely manipulate the slave devices (RTNL lock, + * dev_probe_lock). + */ +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); + + flags = event_dev->flags & (IFF_MASTER | IFF_SLAVE); + switch (flags) { + case IFF_MASTER: + res = bond_master_netdev_event(event, event_dev); + break; + case IFF_SLAVE: + res = bond_slave_netdev_event(event, event_dev); + break; + default: + /* A master that is also a slave ? */ + break; + } + + return res; +} + static struct notifier_block bond_netdev_notifier = { - notifier_call: bond_event, + .notifier_call = bond_netdev_event, }; +static inline void bond_deinit(struct net_device *dev) +{ + struct bonding *bond = dev->priv; + + list_del(&bond->bond_list); + +#ifdef CONFIG_PROC_FS + bond_destroy_proc_info(bond); +#endif +} + +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 *dev = bond->device; + + unregister_netdev(dev); + bond_deinit(dev); + free_netdev(dev); + } + +#ifdef CONFIG_PROC_FS + if (bond_proc_dir) { + remove_proc_entry(DRV_NAME, proc_net); + bond_proc_dir = NULL; + } +#endif +} + +/* + * Does not allocate but creates a /proc entry. + * Allowed to fail. + */ static int __init bond_init(struct net_device *dev) { - bonding_t *bond, *this_bond, *last_bond; + struct bonding *bond; int count; #ifdef BONDING_DEBUG printk (KERN_INFO "Begin bond_init for %s\n", dev->name); #endif - bond = kmalloc(sizeof(struct bonding), GFP_KERNEL); - if (bond == NULL) { - return -ENOMEM; - } - memset(bond, 0, sizeof(struct bonding)); + bond = dev->priv; /* initialize rwlocks */ rwlock_init(&bond->lock); rwlock_init(&bond->ptrlock); - - bond->stats = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL); - if (bond->stats == NULL) { - kfree(bond); - return -ENOMEM; - } - memset(bond->stats, 0, sizeof(struct net_device_stats)); + /* Initialize pointers */ bond->next = bond->prev = (slave_t *)bond; bond->current_slave = NULL; bond->current_arp_slave = NULL; bond->device = dev; - dev->priv = bond; /* Initialize the device structure. */ + dev->set_mac_address = bond_set_mac_address; + switch (bond_mode) { case BOND_MODE_ACTIVEBACKUP: dev->hard_start_xmit = bond_xmit_activebackup; @@ -3600,11 +3902,10 @@ case BOND_MODE_TLB: case BOND_MODE_ALB: dev->hard_start_xmit = bond_alb_xmit; + dev->set_mac_address = bond_alb_set_mac_address; break; default: printk(KERN_ERR "Unknown bonding mode %d\n", bond_mode); - kfree(bond->stats); - kfree(bond); return -EINVAL; } @@ -3613,15 +3914,7 @@ dev->stop = bond_close; dev->set_multicast_list = set_multicast_list; dev->do_ioctl = bond_ioctl; - - /* - * Fill in the fields of the device structure with ethernet-generic - * values. - */ - - ether_setup(dev); - - dev->set_mac_address = bond_set_mac_address; + dev->change_mtu = bond_change_mtu; dev->tx_queue_len = 0; dev->flags |= IFF_MASTER|IFF_MULTICAST; #ifdef CONFIG_NET_FASTROUTE @@ -3648,42 +3941,12 @@ } else { printk("out ARP monitoring\n"); } - + #ifdef CONFIG_PROC_FS - bond->bond_proc_dir = proc_mkdir(dev->name, proc_net); - if (bond->bond_proc_dir == NULL) { - printk(KERN_ERR "%s: Cannot init /proc/net/%s/\n", - dev->name, dev->name); - kfree(bond->stats); - kfree(bond); - return -ENOMEM; - } - bond->bond_proc_info_file = - create_proc_info_entry("info", 0, bond->bond_proc_dir, - bond_get_info); - if (bond->bond_proc_info_file == NULL) { - printk(KERN_ERR "%s: Cannot init /proc/net/%s/info\n", - dev->name, dev->name); - remove_proc_entry(dev->name, proc_net); - kfree(bond->stats); - kfree(bond); - return -ENOMEM; - } -#endif /* CONFIG_PROC_FS */ + bond_create_proc_info(bond); +#endif - if (first_pass == 1) { - these_bonds = bond; - register_netdevice_notifier(&bond_netdev_notifier); - first_pass = 0; - } else { - last_bond = these_bonds; - this_bond = these_bonds->next_bond; - while (this_bond != NULL) { - last_bond = this_bond; - this_bond = this_bond->next_bond; - } - last_bond->next_bond = bond; - } + list_add_tail(&bond->bond_list, &bond_dev_list); return 0; } @@ -3723,9 +3986,6 @@ int no; int err; - /* Find a name for this unit */ - static struct net_device *dev_bond = NULL; - printk(KERN_INFO "%s", version); /* @@ -3741,6 +4001,12 @@ } } + 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) { @@ -3776,12 +4042,6 @@ max_bonds, 1, INT_MAX, BOND_DEFAULT_MAX_BONDS); max_bonds = BOND_DEFAULT_MAX_BONDS; } - dev_bond = dev_bonds = kmalloc(max_bonds*sizeof(struct net_device), - GFP_KERNEL); - if (dev_bond == NULL) { - return -ENOMEM; - } - memset(dev_bonds, 0, max_bonds*sizeof(struct net_device)); if (miimon < 0) { printk(KERN_WARNING @@ -3959,9 +4219,7 @@ "link failures! see bonding.txt for details.\n"); } - if ((primary != NULL) && (bond_mode != BOND_MODE_ACTIVEBACKUP) && - (bond_mode != BOND_MODE_TLB) && - (bond_mode != BOND_MODE_ALB)){ + if ((primary != NULL) && !USES_PRIMARY(bond_mode)) { /* currently, using a primary only makes sense * in active backup, TLB or ALB modes */ @@ -3972,48 +4230,72 @@ primary = NULL; } +#ifdef CONFIG_PROC_FS + bond_proc_dir = proc_mkdir(DRV_NAME, proc_net); + if (bond_proc_dir == NULL) { + printk(KERN_WARNING + "bonding_init(): can not create /proc/net/" DRV_NAME); + } else { + bond_proc_dir->owner = THIS_MODULE; + } +#endif + + rtnl_lock(); + err = 0; for (no = 0; no < max_bonds; no++) { - dev_bond->init = bond_init; - - err = dev_alloc_name(dev_bond,"bond%d"); + struct net_device *dev; + + dev = alloc_netdev(sizeof(struct bonding), "", ether_setup); + if (!dev) { + err = -ENOMEM; + goto out_err; + } + + err = dev_alloc_name(dev, "bond%d"); + if (err < 0) { + free_netdev(dev); + goto out_err; + } + + /* bond_init() must be called after dev_alloc_name() (for the + * /proc files), but before register_netdevice(), because we + * need to set function pointers. + */ + err = bond_init(dev); + if (err < 0) { + free_netdev(dev); + goto out_err; + } + + SET_MODULE_OWNER(dev); + + err = register_netdevice(dev); if (err < 0) { - kfree(dev_bonds); - return err; + bond_deinit(dev); + free_netdev(dev); + goto out_err; } - SET_MODULE_OWNER(dev_bond); - if (register_netdev(dev_bond) != 0) { - kfree(dev_bonds); - return -EIO; - } - dev_bond++; } + + rtnl_unlock(); + register_netdevice_notifier(&bond_netdev_notifier); + return 0; + +out_err: + rtnl_unlock(); + + /* free and unregister all bonds that were successfully added */ + bond_free_all(); + + return err; } static void __exit bonding_exit(void) { - struct net_device *dev_bond = dev_bonds; - struct bonding *bond; - int no; - unregister_netdevice_notifier(&bond_netdev_notifier); - - for (no = 0; no < max_bonds; no++) { - -#ifdef CONFIG_PROC_FS - bond = (struct bonding *) dev_bond->priv; - remove_proc_entry("info", bond->bond_proc_dir); - remove_proc_entry(dev_bond->name, proc_net); -#endif - unregister_netdev(dev_bond); - kfree(bond->stats); - kfree(dev_bond->priv); - - dev_bond->priv = NULL; - dev_bond++; - } - kfree(dev_bonds); + bond_free_all(); } module_init(bonding_init); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/bonding/bonding.h linux-2.4.23-pre8/drivers/net/bonding/bonding.h --- linux-2.4.22/drivers/net/bonding/bonding.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/bonding/bonding.h 2003-10-22 22:48:36.000000000 +0000 @@ -99,12 +99,12 @@ rwlock_t ptrlock; struct timer_list mii_timer; struct timer_list arp_timer; - struct net_device_stats *stats; + struct net_device_stats stats; #ifdef CONFIG_PROC_FS - struct proc_dir_entry *bond_proc_dir; - struct proc_dir_entry *bond_proc_info_file; + struct proc_dir_entry *bond_proc_file; + char procdir_name[IFNAMSIZ]; #endif /* CONFIG_PROC_FS */ - struct bonding *next_bond; + struct list_head bond_list; struct net_device *device; struct dev_mc_list *mc_list; unsigned short flags; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/dmfe.c linux-2.4.23-pre8/drivers/net/dmfe.c --- linux-2.4.22/drivers/net/dmfe.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/dmfe.c 2003-10-22 22:49:32.000000000 +0000 @@ -299,7 +299,7 @@ static int dmfe_stop(struct DEVICE *); static struct net_device_stats * dmfe_get_stats(struct DEVICE *); static void dmfe_set_filter_mode(struct DEVICE *); -static int dmfe_do_ioctl(struct DEVICE *, struct ifreq *, int); +static struct ethtool_ops netdev_ethtool_ops; static u16 read_srom_word(long ,int); static void dmfe_interrupt(int , void *, struct pt_regs *); static void dmfe_descriptor_init(struct dmfe_board_info *, unsigned long); @@ -419,7 +419,7 @@ dev->stop = &dmfe_stop; dev->get_stats = &dmfe_get_stats; dev->set_multicast_list = &dmfe_set_filter_mode; - dev->do_ioctl = &dmfe_do_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; spin_lock_init(&db->lock); pci_read_config_dword(pdev, 0x50, &pci_pmr); @@ -1002,54 +1002,23 @@ } -/* - * Process the ethtool ioctl command - */ - -static int dmfe_ethtool_ioctl(struct net_device *dev, void *useraddr) -{ - struct dmfe_board_info *db = dev->priv; - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: - strcpy(info.driver, DRV_NAME); - strcpy(info.version, DRV_VERSION); - if (db->pdev) - strcpy(info.bus_info, db->pdev->slot_name); - else - sprintf(info.bus_info, "EISA 0x%lx %d", - dev->base_addr, dev->irq); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - - return -EOPNOTSUPP; -} - - -/* - * Process the upper socket ioctl command - */ - -static int dmfe_do_ioctl(struct DEVICE *dev, struct ifreq *ifr, int cmd) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - int retval = -EOPNOTSUPP; - DMFE_DBUG(0, "dmfe_do_ioctl()", 0); - - switch(cmd) { - case SIOCETHTOOL: - return dmfe_ethtool_ioctl(dev, (void*)ifr->ifr_data); - } + struct dmfe_board_info *np = dev->priv; - return retval; + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + if (np->pdev) + strcpy(info->bus_info, pci_name(np->pdev)); + else + sprintf(info->bus_info, "EISA 0x%lx %d", + dev->base_addr, dev->irq); } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; /* * A periodic timer routine diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/dummy.c linux-2.4.23-pre8/drivers/net/dummy.c --- linux-2.4.22/drivers/net/dummy.c 2001-09-30 19:26:06.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/dummy.c 2003-10-22 22:48:41.000000000 +0000 @@ -28,8 +28,6 @@ Alan Cox, 30th May 1994 */ -/* To have statistics (just packets sent) define this */ - #include #include #include diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/e1000/e1000.h linux-2.4.23-pre8/drivers/net/e1000/e1000.h --- linux-2.4.22/drivers/net/e1000/e1000.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/e1000/e1000.h 2003-10-22 22:48:30.000000000 +0000 @@ -122,7 +122,12 @@ #define E1000_RX_BUFFER_WRITE 16 /* Must be power of 2 */ #define AUTO_ALL_MODES 0 -#define E1000_EEPROM_APME 4 +#define E1000_EEPROM_APME 0x0400 + +#ifndef E1000_MASTER_SLAVE +/* Switch to override PHY master/slave setting */ +#define E1000_MASTER_SLAVE e1000_ms_hw_default +#endif /* only works for sizes that are powers of 2 */ #define E1000_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1))) @@ -180,6 +185,7 @@ spinlock_t stats_lock; atomic_t irq_sem; struct tq_struct tx_timeout_task; + uint8_t fc_autoneg; struct timer_list blink_timer; unsigned long led_status; @@ -194,6 +200,7 @@ uint32_t tx_head_addr; uint32_t tx_fifo_size; atomic_t tx_fifo_stall; + boolean_t pcix_82544; /* RX */ struct e1000_desc_ring rx_ring; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/e1000/e1000_ethtool.c linux-2.4.23-pre8/drivers/net/e1000/e1000_ethtool.c --- linux-2.4.22/drivers/net/e1000/e1000_ethtool.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/e1000/e1000_ethtool.c 2003-10-22 22:49:10.000000000 +0000 @@ -190,6 +190,55 @@ return 0; } +static int +e1000_ethtool_gpause(struct e1000_adapter *adapter, + struct ethtool_pauseparam *epause) +{ + struct e1000_hw *hw = &adapter->hw; + + epause->autoneg = + (adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); + + if(hw->fc == e1000_fc_rx_pause) + epause->rx_pause = 1; + else if(hw->fc == e1000_fc_tx_pause) + epause->tx_pause = 1; + else if(hw->fc == e1000_fc_full) { + epause->rx_pause = 1; + epause->tx_pause = 1; + } + + return 0; +} + +static int +e1000_ethtool_spause(struct e1000_adapter *adapter, + struct ethtool_pauseparam *epause) +{ + struct e1000_hw *hw = &adapter->hw; + + adapter->fc_autoneg = epause->autoneg; + + if(epause->rx_pause && epause->tx_pause) + hw->fc = e1000_fc_full; + else if(epause->rx_pause && !epause->tx_pause) + hw->fc = e1000_fc_rx_pause; + else if(!epause->rx_pause && epause->tx_pause) + hw->fc = e1000_fc_tx_pause; + else if(!epause->rx_pause && !epause->tx_pause) + hw->fc = e1000_fc_none; + + hw->original_fc = hw->fc; + + if(netif_running(adapter->netdev)) { + e1000_down(adapter); + e1000_up(adapter); + } else + e1000_reset(adapter); + + return 0; +} + static void e1000_ethtool_gdrvinfo(struct e1000_adapter *adapter, struct ethtool_drvinfo *drvinfo) @@ -197,7 +246,7 @@ strncpy(drvinfo->driver, e1000_driver_name, 32); strncpy(drvinfo->version, e1000_driver_version, 32); strncpy(drvinfo->fw_version, "N/A", 32); - strncpy(drvinfo->bus_info, adapter->pdev->slot_name, 32); + strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); drvinfo->n_stats = E1000_STATS_LEN; drvinfo->testinfo_len = E1000_TEST_LEN; #define E1000_REGS_LEN 32 @@ -504,7 +553,7 @@ return *data; } -static void +static irqreturn_t e1000_test_intr(int irq, void *data, struct pt_regs *regs) @@ -514,7 +563,7 @@ adapter->test_icr |= E1000_READ_REG(&adapter->hw, ICR); - return; + return IRQ_HANDLED; } static int @@ -958,9 +1007,13 @@ case e1000_82544: case e1000_82540: case e1000_82545: + case e1000_82545_rev_3: case e1000_82546: + case e1000_82546_rev_3: case e1000_82541: + case e1000_82541_rev_2: case e1000_82547: + case e1000_82547_rev_2: return e1000_integrated_phy_loopback(adapter); break; @@ -983,9 +1036,12 @@ { uint32_t rctl; - if(adapter->hw.media_type == e1000_media_type_fiber) { + if(adapter->hw.media_type == e1000_media_type_fiber || + adapter->hw.media_type == e1000_media_type_internal_serdes) { if(adapter->hw.mac_type == e1000_82545 || - adapter->hw.mac_type == e1000_82546) + adapter->hw.mac_type == e1000_82546 || + adapter->hw.mac_type == e1000_82545_rev_3 || + adapter->hw.mac_type == e1000_82546_rev_3) return e1000_set_phy_loopback(adapter); else { rctl = E1000_READ_REG(&adapter->hw, RCTL); @@ -1010,9 +1066,12 @@ E1000_WRITE_REG(&adapter->hw, RCTL, rctl); if(adapter->hw.media_type == e1000_media_type_copper || - (adapter->hw.media_type == e1000_media_type_fiber && + ((adapter->hw.media_type == e1000_media_type_fiber || + adapter->hw.media_type == e1000_media_type_internal_serdes) && (adapter->hw.mac_type == e1000_82545 || - adapter->hw.mac_type == e1000_82546))) { + adapter->hw.mac_type == e1000_82546 || + adapter->hw.mac_type == e1000_82545_rev_3 || + adapter->hw.mac_type == e1000_82546_rev_3))) { adapter->hw.autoneg = TRUE; e1000_read_phy_reg(&adapter->hw, PHY_CTRL, &phy_reg); if(phy_reg & MII_CR_LOOPBACK) { @@ -1114,7 +1173,7 @@ e1000_down(adapter); else e1000_reset(adapter); - + if(e1000_reg_test(adapter, &data[0])) eth_test->flags |= ETH_TEST_FL_FAILED; @@ -1162,6 +1221,7 @@ return; case E1000_DEV_ID_82546EB_FIBER: + case E1000_DEV_ID_82546GB_FIBER: /* Wake events only supported on port A for dual fiber */ if(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) { wol->supported = 0; @@ -1200,6 +1260,7 @@ return wol->wolopts ? -EOPNOTSUPP : 0; case E1000_DEV_ID_82546EB_FIBER: + case E1000_DEV_ID_82546GB_FIBER: /* Wake events only supported on port A for dual fiber */ if(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) return wol->wolopts ? -EOPNOTSUPP : 0; @@ -1437,6 +1498,19 @@ addr += offsetof(struct ethtool_eeprom, data); return e1000_ethtool_seeprom(adapter, &eeprom, addr); } + case ETHTOOL_GPAUSEPARAM: { + struct ethtool_pauseparam epause = {ETHTOOL_GPAUSEPARAM}; + e1000_ethtool_gpause(adapter, &epause); + if(copy_to_user(addr, &epause, sizeof(epause))) + return -EFAULT; + return 0; + } + case ETHTOOL_SPAUSEPARAM: { + struct ethtool_pauseparam epause; + if(copy_from_user(&epause, addr, sizeof(epause))) + return -EFAULT; + return e1000_ethtool_spause(adapter, &epause); + } case ETHTOOL_GSTATS: { struct { struct ethtool_stats eth_stats; @@ -1475,6 +1549,107 @@ return -EFAULT; return 0; } + case ETHTOOL_GRXCSUM: { + struct ethtool_value edata = { ETHTOOL_GRXCSUM }; + + edata.data = adapter->rx_csum; + if (copy_to_user(addr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + case ETHTOOL_SRXCSUM: { + struct ethtool_value edata; + + if (copy_from_user(&edata, addr, sizeof(edata))) + return -EFAULT; + adapter->rx_csum = edata.data; + if(netif_running(netdev)) { + e1000_down(adapter); + e1000_up(adapter); + } else + e1000_reset(adapter); + return 0; + } + case ETHTOOL_GTXCSUM: { + struct ethtool_value edata = { ETHTOOL_GTXCSUM }; + + edata.data = + (netdev->features & NETIF_F_HW_CSUM) != 0; + if (copy_to_user(addr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + case ETHTOOL_STXCSUM: { + struct ethtool_value edata; + + if (copy_from_user(&edata, addr, sizeof(edata))) + return -EFAULT; + + if(adapter->hw.mac_type < e1000_82543) { + if (edata.data != 0) + return -EINVAL; + return 0; + } + + if (edata.data) + netdev->features |= NETIF_F_HW_CSUM; + else + netdev->features &= ~NETIF_F_HW_CSUM; + + return 0; + } + case ETHTOOL_GSG: { + struct ethtool_value edata = { ETHTOOL_GSG }; + + edata.data = + (netdev->features & NETIF_F_SG) != 0; + if (copy_to_user(addr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + case ETHTOOL_SSG: { + struct ethtool_value edata; + + if (copy_from_user(&edata, addr, sizeof(edata))) + return -EFAULT; + + if (edata.data) + netdev->features |= NETIF_F_SG; + else + netdev->features &= ~NETIF_F_SG; + + return 0; + } +#ifdef NETIF_F_TSO + case ETHTOOL_GTSO: { + struct ethtool_value edata = { ETHTOOL_GTSO }; + + edata.data = (netdev->features & NETIF_F_TSO) != 0; + if (copy_to_user(addr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + case ETHTOOL_STSO: { + struct ethtool_value edata; + + if (copy_from_user(&edata, addr, sizeof(edata))) + return -EFAULT; + + if ((adapter->hw.mac_type < e1000_82544) || + (adapter->hw.mac_type == e1000_82547)) { + if (edata.data != 0) + return -EINVAL; + return 0; + } + + if (edata.data) + netdev->features |= NETIF_F_TSO; + else + netdev->features &= ~NETIF_F_TSO; + + return 0; + } +#endif default: return -EOPNOTSUPP; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/e1000/e1000_hw.c linux-2.4.23-pre8/drivers/net/e1000/e1000_hw.c --- linux-2.4.22/drivers/net/e1000/e1000_hw.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/e1000/e1000_hw.c 2003-10-22 22:49:11.000000000 +0000 @@ -34,14 +34,15 @@ static int32_t e1000_set_phy_type(struct e1000_hw *hw); static void e1000_phy_init_script(struct e1000_hw *hw); -static int32_t e1000_setup_fiber_link(struct e1000_hw *hw); static int32_t e1000_setup_copper_link(struct e1000_hw *hw); +static int32_t e1000_setup_fiber_serdes_link(struct e1000_hw *hw); +static int32_t e1000_adjust_serdes_amplitude(struct e1000_hw *hw); static int32_t e1000_phy_force_speed_duplex(struct e1000_hw *hw); static int32_t e1000_config_mac_to_phy(struct e1000_hw *hw); -static int32_t e1000_force_mac_fc(struct e1000_hw *hw); static void e1000_raise_mdi_clk(struct e1000_hw *hw, uint32_t *ctrl); static void e1000_lower_mdi_clk(struct e1000_hw *hw, uint32_t *ctrl); -static void e1000_shift_out_mdi_bits(struct e1000_hw *hw, uint32_t data, uint16_t count); +static void e1000_shift_out_mdi_bits(struct e1000_hw *hw, uint32_t data, + uint16_t count); static uint16_t e1000_shift_in_mdi_bits(struct e1000_hw *hw); static int32_t e1000_phy_reset_dsp(struct e1000_hw *hw); static int32_t e1000_write_eeprom_spi(struct e1000_hw *hw, uint16_t offset, @@ -52,14 +53,31 @@ static int32_t e1000_spi_eeprom_ready(struct e1000_hw *hw); static void e1000_raise_ee_clk(struct e1000_hw *hw, uint32_t *eecd); static void e1000_lower_ee_clk(struct e1000_hw *hw, uint32_t *eecd); -static void e1000_shift_out_ee_bits(struct e1000_hw *hw, uint16_t data, uint16_t count); +static void e1000_shift_out_ee_bits(struct e1000_hw *hw, uint16_t data, + uint16_t count); +static int32_t e1000_write_phy_reg_ex(struct e1000_hw *hw, uint32_t reg_addr, + uint16_t phy_data); +static int32_t e1000_read_phy_reg_ex(struct e1000_hw *hw,uint32_t reg_addr, + uint16_t *phy_data); static uint16_t e1000_shift_in_ee_bits(struct e1000_hw *hw, uint16_t count); static int32_t e1000_acquire_eeprom(struct e1000_hw *hw); static void e1000_release_eeprom(struct e1000_hw *hw); static void e1000_standby_eeprom(struct e1000_hw *hw); static int32_t e1000_id_led_init(struct e1000_hw * hw); +static int32_t e1000_set_vco_speed(struct e1000_hw *hw); +/* IGP cable length table */ +static const +uint16_t e1000_igp_cable_length_table[IGP01E1000_AGC_LENGTH_TABLE_SIZE] = + { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 25, 25, 25, + 25, 25, 25, 25, 30, 30, 30, 30, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 50, 50, 50, 50, 50, 50, 50, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 70, 70, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120}; /****************************************************************************** * Set the phy type member in the hw struct. @@ -100,50 +118,41 @@ DEBUGFUNC("e1000_phy_init_script"); if(hw->phy_init_script) { - msec_delay(10); + msec_delay(20); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x0000); e1000_write_phy_reg(hw,0x0000,0x0140); msec_delay(5); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x1F95); - e1000_write_phy_reg(hw,0x0015,0x0001); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x1F71); - e1000_write_phy_reg(hw,0x0011,0xBD21); + if(hw->mac_type == e1000_82541 || hw->mac_type == e1000_82547) { + e1000_write_phy_reg(hw, 0x1F95, 0x0001); + + e1000_write_phy_reg(hw, 0x1F71, 0xBD21); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x1F79); - e1000_write_phy_reg(hw,0x0019,0x0018); + e1000_write_phy_reg(hw, 0x1F79, 0x0018); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x1F30); - e1000_write_phy_reg(hw,0x0010,0x1600); + e1000_write_phy_reg(hw, 0x1F30, 0x1600); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x1F31); - e1000_write_phy_reg(hw,0x0011,0x0014); + e1000_write_phy_reg(hw, 0x1F31, 0x0014); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x1F32); - e1000_write_phy_reg(hw,0x0012,0x161C); + e1000_write_phy_reg(hw, 0x1F32, 0x161C); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x1F94); - e1000_write_phy_reg(hw,0x0014,0x0003); + e1000_write_phy_reg(hw, 0x1F94, 0x0003); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x1F96); - e1000_write_phy_reg(hw,0x0016,0x003F); + e1000_write_phy_reg(hw, 0x1F96, 0x003F); - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x2010); - e1000_write_phy_reg(hw,0x0010,0x0008); + e1000_write_phy_reg(hw, 0x2010, 0x0008); + } else { + e1000_write_phy_reg(hw, 0x1F73, 0x0099); + } - e1000_write_phy_reg(hw,IGP01E1000_PHY_PAGE_SELECT,0x0000); - e1000_write_phy_reg(hw,0x0000,0x3300); + e1000_write_phy_reg(hw, 0x0000, 0x3300); if(hw->mac_type == e1000_82547) { uint16_t fused, fine, coarse; /* Move to analog registers page */ - e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, - IGP01E1000_ANALOG_REGS_PAGE); - e1000_read_phy_reg(hw, IGP01E1000_ANALOG_SPARE_FUSE_STATUS, &fused); if(!(fused & IGP01E1000_ANALOG_SPARE_FUSE_ENABLED)) { @@ -158,17 +167,14 @@ } else if(coarse == IGP01E1000_ANALOG_FUSE_COARSE_THRESH) fine -= IGP01E1000_ANALOG_FUSE_FINE_10; - fused = (fused & IGP01E1000_ANALOG_FUSE_POLY_MASK) | - (fine & IGP01E1000_ANALOG_FUSE_FINE_MASK) | + fused = (fused & IGP01E1000_ANALOG_FUSE_POLY_MASK) | + (fine & IGP01E1000_ANALOG_FUSE_FINE_MASK) | (coarse & IGP01E1000_ANALOG_FUSE_COARSE_MASK); e1000_write_phy_reg(hw, IGP01E1000_ANALOG_FUSE_CONTROL, fused); - e1000_write_phy_reg(hw, IGP01E1000_ANALOG_FUSE_BYPASS, + e1000_write_phy_reg(hw, IGP01E1000_ANALOG_FUSE_BYPASS, IGP01E1000_ANALOG_FUSE_ENABLE_SW_CONTROL); } - /* Return to first page of registers */ - e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, - IGP01E1000_IEEE_REGS_PAGE); } } } @@ -218,32 +224,89 @@ case E1000_DEV_ID_82545EM_FIBER: hw->mac_type = e1000_82545; break; + case E1000_DEV_ID_82545GM_COPPER: + case E1000_DEV_ID_82545GM_FIBER: + case E1000_DEV_ID_82545GM_SERDES: + hw->mac_type = e1000_82545_rev_3; + break; case E1000_DEV_ID_82546EB_COPPER: case E1000_DEV_ID_82546EB_FIBER: case E1000_DEV_ID_82546EB_QUAD_COPPER: hw->mac_type = e1000_82546; break; + case E1000_DEV_ID_82546GB_COPPER: + case E1000_DEV_ID_82546GB_FIBER: + case E1000_DEV_ID_82546GB_SERDES: + hw->mac_type = e1000_82546_rev_3; + break; case E1000_DEV_ID_82541EI: - case E1000_DEV_ID_82541EP: + case E1000_DEV_ID_82541EI_MOBILE: hw->mac_type = e1000_82541; break; + case E1000_DEV_ID_82541ER: + case E1000_DEV_ID_82541GI: + case E1000_DEV_ID_82541GI_MOBILE: + hw->mac_type = e1000_82541_rev_2; + break; case E1000_DEV_ID_82547EI: hw->mac_type = e1000_82547; break; + case E1000_DEV_ID_82547GI: + hw->mac_type = e1000_82547_rev_2; + break; default: /* Should never have loaded on this device */ return -E1000_ERR_MAC_TYPE; } - return E1000_SUCCESS; } + +/***************************************************************************** + * Set media type and TBI compatibility. + * + * hw - Struct containing variables accessed by shared code + * **************************************************************************/ +void +e1000_set_media_type(struct e1000_hw *hw) +{ + uint32_t status; + + DEBUGFUNC("e1000_set_media_type"); + + if(hw->mac_type != e1000_82543) { + /* tbi_compatibility is only valid on 82543 */ + hw->tbi_compatibility_en = FALSE; + } + + switch (hw->device_id) { + case E1000_DEV_ID_82545GM_SERDES: + case E1000_DEV_ID_82546GB_SERDES: + hw->media_type = e1000_media_type_internal_serdes; + break; + default: + if(hw->mac_type >= e1000_82543) { + status = E1000_READ_REG(hw, STATUS); + if(status & E1000_STATUS_TBIMODE) { + hw->media_type = e1000_media_type_fiber; + /* tbi_compatibility not valid on fiber */ + hw->tbi_compatibility_en = FALSE; + } else { + hw->media_type = e1000_media_type_copper; + } + } else { + /* This is an 82542 (fiber only) */ + hw->media_type = e1000_media_type_fiber; + } + } +} + /****************************************************************************** * Reset the transmit and receive units; mask and clear all interrupts. * * hw - Struct containing variables accessed by shared code *****************************************************************************/ -void +int32_t e1000_reset_hw(struct e1000_hw *hw) { uint32_t ctrl; @@ -280,49 +343,75 @@ */ msec_delay(10); - /* Issue a global reset to the MAC. This will reset the chip's - * transmit, receive, DMA, and link units. It will not effect - * the current PCI configuration. The global reset bit is self- - * clearing, and should clear within a microsecond. - */ - DEBUGOUT("Issuing a global reset to MAC\n"); ctrl = E1000_READ_REG(hw, CTRL); /* Must reset the PHY before resetting the MAC */ if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { E1000_WRITE_REG_IO(hw, CTRL, (ctrl | E1000_CTRL_PHY_RST)); - msec_delay(5); + msec_delay(5); } + /* Issue a global reset to the MAC. This will reset the chip's + * transmit, receive, DMA, and link units. It will not effect + * the current PCI configuration. The global reset bit is self- + * clearing, and should clear within a microsecond. + */ + DEBUGOUT("Issuing a global reset to MAC\n"); + switch(hw->mac_type) { case e1000_82544: case e1000_82540: case e1000_82545: case e1000_82546: case e1000_82541: + case e1000_82541_rev_2: /* These controllers can't ack the 64-bit write when issuing the * reset, so use IO-mapping as a workaround to issue the reset */ E1000_WRITE_REG_IO(hw, CTRL, (ctrl | E1000_CTRL_RST)); break; + case e1000_82545_rev_3: + case e1000_82546_rev_3: + /* Reset is performed on a shadow of the control register */ + E1000_WRITE_REG(hw, CTRL_DUP, (ctrl | E1000_CTRL_RST)); + break; default: E1000_WRITE_REG(hw, CTRL, (ctrl | E1000_CTRL_RST)); break; } - /* Force a reload from the EEPROM if necessary */ - if(hw->mac_type < e1000_82540) { - /* Wait for reset to complete */ - udelay(10); - ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); - ctrl_ext |= E1000_CTRL_EXT_EE_RST; - E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); - E1000_WRITE_FLUSH(hw); - /* Wait for EEPROM reload */ - msec_delay(2); - } else { - /* Wait for EEPROM reload (it happens automatically) */ - msec_delay(5); - /* Dissable HW ARPs on ASF enabled adapters */ + /* After MAC reset, force reload of EEPROM to restore power-on settings to + * device. Later controllers reload the EEPROM automatically, so just wait + * for reload to complete. + */ + switch(hw->mac_type) { + case e1000_82542_rev2_0: + case e1000_82542_rev2_1: + case e1000_82543: + case e1000_82544: + /* Wait for reset to complete */ + udelay(10); + ctrl_ext = E1000_READ_REG(hw, CTRL_EXT); + ctrl_ext |= E1000_CTRL_EXT_EE_RST; + E1000_WRITE_REG(hw, CTRL_EXT, ctrl_ext); + E1000_WRITE_FLUSH(hw); + /* Wait for EEPROM reload */ + msec_delay(2); + break; + case e1000_82541: + case e1000_82541_rev_2: + case e1000_82547: + case e1000_82547_rev_2: + /* Wait for EEPROM reload */ + msec_delay(20); + break; + default: + /* Wait for EEPROM reload (it happens automatically) */ + msec_delay(5); + break; + } + + /* Disable HW ARPs on ASF enabled adapters */ + if(hw->mac_type >= e1000_82540) { manc = E1000_READ_REG(hw, MANC); manc &= ~(E1000_MANC_ARP_EN); E1000_WRITE_REG(hw, MANC, manc); @@ -350,6 +439,8 @@ if(hw->pci_cmd_word & CMD_MEM_WRT_INVALIDATE) e1000_pci_set_mwi(hw); } + + return E1000_SUCCESS; } /****************************************************************************** @@ -366,7 +457,7 @@ int32_t e1000_init_hw(struct e1000_hw *hw) { - uint32_t ctrl, status; + uint32_t ctrl; uint32_t i; int32_t ret_val; uint16_t pcix_cmd_word; @@ -377,31 +468,13 @@ DEBUGFUNC("e1000_init_hw"); /* Initialize Identification LED */ - ret_val = e1000_id_led_init(hw); - if(ret_val < 0) { + if((ret_val = e1000_id_led_init(hw))) { DEBUGOUT("Error Initializing Identification LED\n"); return ret_val; } - /* Set the Media Type and exit with error if it is not valid. */ - if(hw->mac_type != e1000_82543) { - /* tbi_compatibility is only valid on 82543 */ - hw->tbi_compatibility_en = FALSE; - } - - if(hw->mac_type >= e1000_82543) { - status = E1000_READ_REG(hw, STATUS); - if(status & E1000_STATUS_TBIMODE) { - hw->media_type = e1000_media_type_fiber; - /* tbi_compatibility not valid on fiber */ - hw->tbi_compatibility_en = FALSE; - } else { - hw->media_type = e1000_media_type_copper; - } - } else { - /* This is an 82542 (fiber only) */ - hw->media_type = e1000_media_type_fiber; - } + /* Set the media type and TBI compatibility */ + e1000_set_media_type(hw); /* Disabling VLAN filtering. */ DEBUGOUT("Initializing the IEEE VLAN\n"); @@ -446,21 +519,30 @@ E1000_WRITE_REG(hw, CTRL, ctrl | E1000_CTRL_PRIOR); } - /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */ - if(hw->bus_type == e1000_bus_type_pcix) { - e1000_read_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd_word); - e1000_read_pci_cfg(hw, PCIX_STATUS_REGISTER_HI, &pcix_stat_hi_word); - cmd_mmrbc = (pcix_cmd_word & PCIX_COMMAND_MMRBC_MASK) >> - PCIX_COMMAND_MMRBC_SHIFT; - stat_mmrbc = (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >> - PCIX_STATUS_HI_MMRBC_SHIFT; - if(stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K) - stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K; - if(cmd_mmrbc > stat_mmrbc) { - pcix_cmd_word &= ~PCIX_COMMAND_MMRBC_MASK; - pcix_cmd_word |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT; - e1000_write_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd_word); + switch(hw->mac_type) { + case e1000_82545_rev_3: + case e1000_82546_rev_3: + break; + default: + /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */ + if(hw->bus_type == e1000_bus_type_pcix) { + e1000_read_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd_word); + e1000_read_pci_cfg(hw, PCIX_STATUS_REGISTER_HI, + &pcix_stat_hi_word); + cmd_mmrbc = (pcix_cmd_word & PCIX_COMMAND_MMRBC_MASK) >> + PCIX_COMMAND_MMRBC_SHIFT; + stat_mmrbc = (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >> + PCIX_STATUS_HI_MMRBC_SHIFT; + if(stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K) + stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K; + if(cmd_mmrbc > stat_mmrbc) { + pcix_cmd_word &= ~PCIX_COMMAND_MMRBC_MASK; + pcix_cmd_word |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT; + e1000_write_pci_cfg(hw, PCIX_COMMAND_REGISTER, + &pcix_cmd_word); + } } + break; } /* Call a subroutine to configure the link and setup flow control. */ @@ -484,6 +566,46 @@ } /****************************************************************************** + * Adjust SERDES output amplitude based on EEPROM setting. + * + * hw - Struct containing variables accessed by shared code. + *****************************************************************************/ +static int32_t +e1000_adjust_serdes_amplitude(struct e1000_hw *hw) +{ + uint16_t eeprom_data; + int32_t ret_val; + + DEBUGFUNC("e1000_adjust_serdes_amplitude"); + + if(hw->media_type != e1000_media_type_internal_serdes) + return E1000_SUCCESS; + + switch(hw->mac_type) { + case e1000_82545_rev_3: + case e1000_82546_rev_3: + break; + default: + return E1000_SUCCESS; + } + + if ((ret_val = e1000_read_eeprom(hw, EEPROM_SERDES_AMPLITUDE, 1, + &eeprom_data))) { + return ret_val; + } + + if(eeprom_data != EEPROM_RESERVED_WORD) { + /* Adjust SERDES output amplitude only. */ + eeprom_data &= EEPROM_SERDES_AMPLITUDE_MASK; + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_EXT_CTRL, + eeprom_data))) + return ret_val; + } + + return E1000_SUCCESS; +} + +/****************************************************************************** * Configures flow control and link settings. * * hw - Struct containing variables accessed by shared code @@ -554,9 +676,9 @@ } /* Call the necessary subroutine to configure the link. */ - ret_val = (hw->media_type == e1000_media_type_fiber) ? - e1000_setup_fiber_link(hw) : - e1000_setup_copper_link(hw); + ret_val = (hw->media_type == e1000_media_type_copper) ? + e1000_setup_copper_link(hw) : + e1000_setup_fiber_serdes_link(hw); /* Initialize the flow control address, type, and PAUSE timer * registers to their default values. This is done even if flow @@ -595,7 +717,7 @@ } /****************************************************************************** - * Sets up link for a fiber based adapter + * Sets up link for a fiber based or serdes based adapter * * hw - Struct containing variables accessed by shared code * @@ -604,28 +726,37 @@ * and receiver are not enabled. *****************************************************************************/ static int32_t -e1000_setup_fiber_link(struct e1000_hw *hw) +e1000_setup_fiber_serdes_link(struct e1000_hw *hw) { uint32_t ctrl; uint32_t status; uint32_t txcw = 0; uint32_t i; - uint32_t signal; + uint32_t signal = 0; int32_t ret_val; - DEBUGFUNC("e1000_setup_fiber_link"); + DEBUGFUNC("e1000_setup_fiber_serdes_link"); - /* On adapters with a MAC newer that 82544, SW Defineable pin 1 will be + /* On adapters with a MAC newer than 82544, SW Defineable pin 1 will be * set when the optics detect a signal. On older adapters, it will be - * cleared when there is a signal + * cleared when there is a signal. This applies to fiber media only. + * If we're on serdes media, adjust the output amplitude to value set in + * the EEPROM. */ ctrl = E1000_READ_REG(hw, CTRL); - if(hw->mac_type > e1000_82544) signal = E1000_CTRL_SWDPIN1; - else signal = 0; + if(hw->media_type == e1000_media_type_fiber) + signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0; + + if((ret_val = e1000_adjust_serdes_amplitude(hw))) + return ret_val; /* Take the link out of reset */ ctrl &= ~(E1000_CTRL_LRST); + /* Adjust VCO speed to improve BER performance */ + if((ret_val = e1000_set_vco_speed(hw))) + return ret_val; + e1000_config_collision_dist(hw); /* Check for a software override of the flow control settings, and setup @@ -692,8 +823,10 @@ * indication in the Device Status Register. Time-out if a link isn't * seen in 500 milliseconds seconds (Auto-negotiation should complete in * less than 500 milliseconds even if the other end is doing it in SW). + * For internal serdes, we just assume a signal is present, then poll. */ - if((E1000_READ_REG(hw, CTRL) & E1000_CTRL_SWDPIN1) == signal) { + if(hw->media_type == e1000_media_type_internal_serdes || + (E1000_READ_REG(hw, CTRL) & E1000_CTRL_SWDPIN1) == signal) { DEBUGOUT("Looking for Link\n"); for(i = 0; i < (LINK_UP_TIMEOUT / 10); i++) { msec_delay(10); @@ -701,19 +834,20 @@ if(status & E1000_STATUS_LU) break; } if(i == (LINK_UP_TIMEOUT / 10)) { - /* AutoNeg failed to achieve a link, so we'll call - * e1000_check_for_link. This routine will force the link up if we - * detect a signal. This will allow us to communicate with - * non-autonegotiating link partners. - */ DEBUGOUT("Never got a valid link from auto-neg!!!\n"); hw->autoneg_failed = 1; - ret_val = e1000_check_for_link(hw); - if(ret_val < 0) { - DEBUGOUT("Error while checking for link\n"); - return ret_val; + if(hw->media_type == e1000_media_type_fiber) { + /* AutoNeg failed to achieve a link, so we'll call + * e1000_check_for_link. This routine will force the link up if + * we detect a signal. This will allow us to communicate with + * non-autonegotiating link partners. + */ + if((ret_val = e1000_check_for_link(hw))) { + DEBUGOUT("Error while checking for link\n"); + return ret_val; + } + hw->autoneg_failed = 0; } - hw->autoneg_failed = 0; } else { hw->autoneg_failed = 0; DEBUGOUT("Valid Link Found\n"); @@ -721,7 +855,7 @@ } else { DEBUGOUT("No Signal Detected\n"); } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -756,233 +890,281 @@ } /* Make sure we have a valid PHY */ - ret_val = e1000_detect_gig_phy(hw); - if(ret_val < 0) { + if((ret_val = e1000_detect_gig_phy(hw))) { DEBUGOUT("Error, did not detect valid phy.\n"); return ret_val; } DEBUGOUT1("Phy ID = %x \n", hw->phy_id); - if (hw->phy_type == e1000_phy_igp) { - - ret_val = e1000_phy_reset(hw); - if(ret_val < 0) { - DEBUGOUT("Error Resetting the PHY\n"); - return ret_val; - } + if(hw->mac_type <= e1000_82543 || + hw->mac_type == e1000_82541 || hw->mac_type == e1000_82547 || + hw->mac_type == e1000_82541_rev_2 || hw->mac_type == e1000_82547_rev_2) + hw->phy_reset_disable = FALSE; - /* Wait 10ms for MAC to configure PHY from eeprom settings */ - msec_delay(15); + if(!hw->phy_reset_disable) { + if (hw->phy_type == e1000_phy_igp) { - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 0x0000) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_phy_reset(hw))) { + DEBUGOUT("Error Resetting the PHY\n"); + return ret_val; + } - /* Configure activity LED after PHY reset */ - led_ctrl = E1000_READ_REG(hw, LEDCTL); - led_ctrl &= IGP_ACTIVITY_LED_MASK; - led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); - E1000_WRITE_REG(hw, LEDCTL, led_ctrl); + /* Wait 10ms for MAC to configure PHY from eeprom settings */ + msec_delay(15); - if(hw->autoneg_advertised == ADVERTISE_1000_FULL) { - /* Disable SmartSpeed */ - if(e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, - &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, - phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } - /* Set auto Master/Slave resolution process */ - if(e1000_read_phy_reg(hw, PHY_1000T_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; + /* Configure activity LED after PHY reset */ + led_ctrl = E1000_READ_REG(hw, LEDCTL); + led_ctrl &= IGP_ACTIVITY_LED_MASK; + led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE); + E1000_WRITE_REG(hw, LEDCTL, led_ctrl); + + /* disable lplu d3 during driver init */ + if((ret_val = e1000_set_d3_lplu_state(hw, FALSE))) { + DEBUGOUT("Error Disabling LPLU D3\n"); + return ret_val; } - phy_data &= ~CR_1000T_MS_ENABLE; - if(e1000_write_phy_reg(hw, PHY_1000T_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; + + /* Configure mdi-mdix settings */ + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, + &phy_data))) + return ret_val; + + if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { + hw->dsp_config_state = e1000_dsp_config_disabled; + /* Force MDI for IGP B-0 PHY */ + phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX | + IGP01E1000_PSCR_FORCE_MDI_MDIX); + hw->mdix = 1; + + } else { + hw->dsp_config_state = e1000_dsp_config_enabled; + phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX; + + switch (hw->mdix) { + case 1: + phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; + break; + case 2: + phy_data |= IGP01E1000_PSCR_FORCE_MDI_MDIX; + break; + case 0: + default: + phy_data |= IGP01E1000_PSCR_AUTO_MDIX; + break; + } } - } + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, + phy_data))) + return ret_val; - if(e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + /* set auto-master slave resolution settings */ + if(hw->autoneg) { + e1000_ms_type phy_ms_setting = hw->master_slave; + + if(hw->ffe_config_state == e1000_ffe_config_active) + hw->ffe_config_state = e1000_ffe_config_enabled; + + if(hw->dsp_config_state == e1000_dsp_config_activated) + hw->dsp_config_state = e1000_dsp_config_enabled; + + /* when autonegotiation advertisment is only 1000Mbps then we + * should disable SmartSpeed and enable Auto MasterSlave + * resolution as hardware default. */ + if(hw->autoneg_advertised == ADVERTISE_1000_FULL) { + /* Disable SmartSpeed */ + if((ret_val = e1000_read_phy_reg(hw, + IGP01E1000_PHY_PORT_CONFIG, + &phy_data))) + return ret_val; + phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; + if((ret_val = e1000_write_phy_reg(hw, + IGP01E1000_PHY_PORT_CONFIG, + phy_data))) + return ret_val; + /* Set auto Master/Slave resolution process */ + if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, + &phy_data))) + return ret_val; + phy_data &= ~CR_1000T_MS_ENABLE; + if((ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, + phy_data))) + return ret_val; + } - /* Force MDI for IGP PHY */ - phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX | - IGP01E1000_PSCR_FORCE_MDI_MDIX); + if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, + &phy_data))) + return ret_val; - hw->mdix = 1; + /* load defaults for future use */ + hw->original_master_slave = (phy_data & CR_1000T_MS_ENABLE) ? + ((phy_data & CR_1000T_MS_VALUE) ? + e1000_ms_force_master : + e1000_ms_force_slave) : + e1000_ms_auto; + + switch (phy_ms_setting) { + case e1000_ms_force_master: + phy_data |= (CR_1000T_MS_ENABLE | CR_1000T_MS_VALUE); + break; + case e1000_ms_force_slave: + phy_data |= CR_1000T_MS_ENABLE; + phy_data &= ~(CR_1000T_MS_VALUE); + break; + case e1000_ms_auto: + phy_data &= ~CR_1000T_MS_ENABLE; + default: + break; + } + if((ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, + phy_data))) + return ret_val; + } + } else { + /* Enable CRS on TX. This must be set for half-duplex operation. */ + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, + &phy_data))) + return ret_val; - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; - } else { - /* Enable CRS on TX. This must be set for half-duplex operation. */ - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; + /* Options: + * MDI/MDI-X = 0 (default) + * 0 - Auto for all speeds + * 1 - MDI mode + * 2 - MDI-X mode + * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) + */ + phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; - /* Options: - * MDI/MDI-X = 0 (default) - * 0 - Auto for all speeds - * 1 - MDI mode - * 2 - MDI-X mode - * 3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes) - */ - phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; + switch (hw->mdix) { + case 1: + phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE; + break; + case 2: + phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE; + break; + case 3: + phy_data |= M88E1000_PSCR_AUTO_X_1000T; + break; + case 0: + default: + phy_data |= M88E1000_PSCR_AUTO_X_MODE; + break; + } - switch (hw->mdix) { - case 1: - phy_data |= M88E1000_PSCR_MDI_MANUAL_MODE; - break; - case 2: - phy_data |= M88E1000_PSCR_MDIX_MANUAL_MODE; - break; - case 3: - phy_data |= M88E1000_PSCR_AUTO_X_1000T; - break; - case 0: - default: - phy_data |= M88E1000_PSCR_AUTO_X_MODE; - break; - } + /* Options: + * disable_polarity_correction = 0 (default) + * Automatic Correction for Reversed Cable Polarity + * 0 - Disabled + * 1 - Enabled + */ + phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; + if(hw->disable_polarity_correction == 1) + phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, + phy_data))) + return ret_val; - /* Options: - * disable_polarity_correction = 0 (default) - * Automatic Correction for Reversed Cable Polarity - * 0 - Disabled - * 1 - Enabled - */ - phy_data &= ~M88E1000_PSCR_POLARITY_REVERSAL; - if(hw->disable_polarity_correction == 1) - phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; - if(e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + /* Force TX_CLK in the Extended PHY Specific Control Register + * to 25MHz clock. + */ + if((ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, + &phy_data))) + return ret_val; - /* Force TX_CLK in the Extended PHY Specific Control Register - * to 25MHz clock. - */ - if(e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - phy_data |= M88E1000_EPSCR_TX_CLK_25; + phy_data |= M88E1000_EPSCR_TX_CLK_25; - if (hw->phy_revision < M88E1011_I_REV_4) { - /* Configure Master and Slave downshift values */ - phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK | - M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); - phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X | - M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); - if(e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, - phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; + if (hw->phy_revision < M88E1011_I_REV_4) { + /* Configure Master and Slave downshift values */ + phy_data &= ~(M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK | + M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK); + phy_data |= (M88E1000_EPSCR_MASTER_DOWNSHIFT_1X | + M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X); + if((ret_val = e1000_write_phy_reg(hw, + M88E1000_EXT_PHY_SPEC_CTRL, + phy_data))) + return ret_val; } - } - /* SW Reset the PHY so all changes take effect */ - ret_val = e1000_phy_reset(hw); - if(ret_val < 0) { - DEBUGOUT("Error Resetting the PHY\n"); - return ret_val; + /* SW Reset the PHY so all changes take effect */ + if((ret_val = e1000_phy_reset(hw))) { + DEBUGOUT("Error Resetting the PHY\n"); + return ret_val; + } } - } - /* Options: - * autoneg = 1 (default) - * PHY will advertise value(s) parsed from - * autoneg_advertised and fc - * autoneg = 0 - * PHY will be set to 10H, 10F, 100H, or 100F - * depending on value parsed from forced_speed_duplex. - */ + /* Options: + * autoneg = 1 (default) + * PHY will advertise value(s) parsed from + * autoneg_advertised and fc + * autoneg = 0 + * PHY will be set to 10H, 10F, 100H, or 100F + * depending on value parsed from forced_speed_duplex. + */ + + /* Is autoneg enabled? This is enabled by default or by software + * override. If so, call e1000_phy_setup_autoneg routine to parse the + * autoneg_advertised and fc options. If autoneg is NOT enabled, then + * the user should have provided a speed/duplex override. If so, then + * call e1000_phy_force_speed_duplex to parse and set this up. + */ + if(hw->autoneg) { + /* Perform some bounds checking on the hw->autoneg_advertised + * parameter. If this variable is zero, then set it to the default. + */ + hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT; - /* Is autoneg enabled? This is enabled by default or by software override. - * If so, call e1000_phy_setup_autoneg routine to parse the - * autoneg_advertised and fc options. If autoneg is NOT enabled, then the - * user should have provided a speed/duplex override. If so, then call - * e1000_phy_force_speed_duplex to parse and set this up. - */ - if(hw->autoneg) { - /* Perform some bounds checking on the hw->autoneg_advertised - * parameter. If this variable is zero, then set it to the default. - */ - hw->autoneg_advertised &= AUTONEG_ADVERTISE_SPEED_DEFAULT; + /* If autoneg_advertised is zero, we assume it was not defaulted + * by the calling code so we set to advertise full capability. + */ + if(hw->autoneg_advertised == 0) + hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT; - /* If autoneg_advertised is zero, we assume it was not defaulted - * by the calling code so we set to advertise full capability. - */ - if(hw->autoneg_advertised == 0) - hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT; + DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); + if((ret_val = e1000_phy_setup_autoneg(hw))) { + DEBUGOUT("Error Setting up Auto-Negotiation\n"); + return ret_val; + } + DEBUGOUT("Restarting Auto-Neg\n"); - DEBUGOUT("Reconfiguring auto-neg advertisement params\n"); - ret_val = e1000_phy_setup_autoneg(hw); - if(ret_val < 0) { - DEBUGOUT("Error Setting up Auto-Negotiation\n"); - return ret_val; - } - DEBUGOUT("Restarting Auto-Neg\n"); + /* Restart auto-negotiation by setting the Auto Neg Enable bit and + * the Auto Neg Restart bit in the PHY control register. + */ + if((ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data))) + return ret_val; - /* Restart auto-negotiation by setting the Auto Neg Enable bit and - * the Auto Neg Restart bit in the PHY control register. - */ - if(e1000_read_phy_reg(hw, PHY_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); - if(e1000_write_phy_reg(hw, PHY_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + phy_data |= (MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG); + if((ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data))) + return ret_val; - /* Does the user want to wait for Auto-Neg to complete here, or - * check at a later time (for example, callback routine). - */ - if(hw->wait_autoneg_complete) { - ret_val = e1000_wait_autoneg(hw); - if(ret_val < 0) { - DEBUGOUT("Error while waiting for autoneg to complete\n"); + /* Does the user want to wait for Auto-Neg to complete here, or + * check at a later time (for example, callback routine). + */ + if(hw->wait_autoneg_complete) { + if((ret_val = e1000_wait_autoneg(hw))) { + DEBUGOUT("Error while waiting for autoneg to complete\n"); + return ret_val; + } + } + hw->get_link_status = TRUE; + } else { + DEBUGOUT("Forcing speed and duplex\n"); + if((ret_val = e1000_phy_force_speed_duplex(hw))) { + DEBUGOUT("Error Forcing Speed and Duplex\n"); return ret_val; } } - hw->get_link_status = TRUE; - } else { - DEBUGOUT("Forcing speed and duplex\n"); - ret_val = e1000_phy_force_speed_duplex(hw); - if(ret_val < 0) { - DEBUGOUT("Error Forcing Speed and Duplex\n"); - return ret_val; - } - } + } /* !hw->phy_reset_disable */ /* Check link status. Wait up to 100 microseconds for link to become * valid. */ for(i = 0; i < 10; i++) { - if(e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - if(e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data))) + return ret_val; + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data))) + return ret_val; + if(phy_data & MII_SR_LINK_STATUS) { /* We have link, so we need to finish the config process: * 1) Set up the MAC to the current PHY speed/duplex @@ -995,25 +1177,31 @@ if(hw->mac_type >= e1000_82544) { e1000_config_collision_dist(hw); } else { - ret_val = e1000_config_mac_to_phy(hw); - if(ret_val < 0) { + if((ret_val = e1000_config_mac_to_phy(hw))) { DEBUGOUT("Error configuring MAC to PHY settings\n"); return ret_val; - } + } } - ret_val = e1000_config_fc_after_link_up(hw); - if(ret_val < 0) { + if((ret_val = e1000_config_fc_after_link_up(hw))) { DEBUGOUT("Error Configuring Flow Control\n"); return ret_val; } DEBUGOUT("Valid link established!!!\n"); - return 0; + + if(hw->phy_type == e1000_phy_igp) { + if((ret_val = e1000_config_dsp_after_link_change(hw, TRUE))) { + DEBUGOUT("Error Configuring DSP after link up\n"); + return ret_val; + } + } + DEBUGOUT("Valid link established!!!\n"); + return E1000_SUCCESS; } udelay(10); } DEBUGOUT("Unable to establish link!!!\n"); - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -1024,22 +1212,20 @@ int32_t e1000_phy_setup_autoneg(struct e1000_hw *hw) { + int32_t ret_val; uint16_t mii_autoneg_adv_reg; uint16_t mii_1000t_ctrl_reg; DEBUGFUNC("e1000_phy_setup_autoneg"); /* Read the MII Auto-Neg Advertisement Register (Address 4). */ - if(e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_autoneg_adv_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, + &mii_autoneg_adv_reg))) + return ret_val; /* Read the MII 1000Base-T Control Register (Address 9). */ - if(e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg))) + return ret_val; /* Need to parse both autoneg_advertised and fc and set up * the appropriate PHY registers. First we will parse for @@ -1145,18 +1331,16 @@ return -E1000_ERR_CONFIG; } - if(e1000_write_phy_reg(hw, PHY_AUTONEG_ADV, mii_autoneg_adv_reg) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_write_phy_reg(hw, PHY_AUTONEG_ADV, + mii_autoneg_adv_reg))) + return ret_val; DEBUGOUT1("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); - if(e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } - return 0; + if((ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg))) + return ret_val; + + return E1000_SUCCESS; } /****************************************************************************** @@ -1192,10 +1376,8 @@ ctrl &= ~E1000_CTRL_ASDE; /* Read the MII Control Register. */ - if(e1000_read_phy_reg(hw, PHY_CTRL, &mii_ctrl_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &mii_ctrl_reg))) + return ret_val; /* We need to disable autoneg in order to force link and duplex. */ @@ -1241,19 +1423,18 @@ E1000_WRITE_REG(hw, CTRL, ctrl); if (hw->phy_type == e1000_phy_m88) { - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, + &phy_data))) + return ret_val; /* Clear Auto-Crossover to force MDI manually. M88E1000 requires MDI * forced whenever speed are duplex are forced. */ phy_data &= ~M88E1000_PSCR_AUTO_X_MODE; - if(e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, + phy_data))) + return ret_val; + DEBUGOUT1("M88E1000 PSCR: %x \n", phy_data); /* Need to reset the PHY or these changes will be ignored */ @@ -1262,26 +1443,23 @@ /* Clear Auto-Crossover to force MDI manually. IGP requires MDI * forced whenever speed or duplex are forced. */ - if(e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, + &phy_data))) + return ret_val; phy_data &= ~IGP01E1000_PSCR_AUTO_MDIX; phy_data &= ~IGP01E1000_PSCR_FORCE_MDI_MDIX; - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CTRL, + phy_data))) + return ret_val; } /* Write back the modified PHY MII control register. */ - if(e1000_write_phy_reg(hw, PHY_CTRL, mii_ctrl_reg) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } udelay(1); + if((ret_val = e1000_write_phy_reg(hw, PHY_CTRL, mii_ctrl_reg))) + return ret_val; + /* The wait_autoneg_complete flag may be a little misleading here. * Since we are forcing speed and duplex, Auto-Neg is not enabled. @@ -1300,22 +1478,18 @@ /* Read the MII Status Register and wait for Auto-Neg Complete bit * to be set. */ - if(e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - if(e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg))) + return ret_val; + + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg))) + return ret_val; + 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. */ - - ret_val = e1000_phy_reset_dsp(hw); - if(ret_val < 0) { + if((ret_val = e1000_phy_reset_dsp(hw))) { DEBUGOUT("Error Resetting PHY DSP\n"); return ret_val; } @@ -1327,14 +1501,11 @@ /* Read the MII Status Register and wait for Auto-Neg Complete bit * to be set. */ - if(e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - if(e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg))) + return ret_val; + + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg))) + return ret_val; } } @@ -1343,30 +1514,29 @@ * Extended PHY Specific Control Register to 25MHz clock. This value * defaults back to a 2.5MHz clock when the PHY is reset. */ - if(e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, + &phy_data))) + return ret_val; + phy_data |= M88E1000_EPSCR_TX_CLK_25; - if(e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_write_phy_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, + phy_data))) + return ret_val; /* In addition, because of the s/w reset above, we need to enable CRS on * TX. This must be set for both full and half duplex operation. */ - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, + &phy_data))) + return ret_val; + phy_data |= M88E1000_PSCR_ASSERT_CRS_ON_TX; - if(e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, + phy_data))) + return ret_val; + } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -1406,6 +1576,7 @@ e1000_config_mac_to_phy(struct e1000_hw *hw) { uint32_t ctrl; + int32_t ret_val; uint16_t phy_data; DEBUGFUNC("e1000_config_mac_to_phy"); @@ -1421,10 +1592,10 @@ * registers depending on negotiated values. */ if (hw->phy_type == e1000_phy_igp) { - if(e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, + &phy_data))) + return ret_val; + if(phy_data & IGP01E1000_PSSR_FULL_DUPLEX) ctrl |= E1000_CTRL_FD; else ctrl &= ~E1000_CTRL_FD; @@ -1440,10 +1611,10 @@ IGP01E1000_PSSR_SPEED_100MBPS) ctrl |= E1000_CTRL_SPD_100; } else { - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, + &phy_data))) + return ret_val; + if(phy_data & M88E1000_PSSR_DPLX) ctrl |= E1000_CTRL_FD; else ctrl &= ~E1000_CTRL_FD; @@ -1459,7 +1630,7 @@ } /* Write the configured values back to the Device Control Reg. */ E1000_WRITE_REG(hw, CTRL, ctrl); - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -1473,7 +1644,7 @@ * by the PHY rather than the MAC. Software must also configure these * bits when link is forced on a fiber connection. *****************************************************************************/ -static int32_t +int32_t e1000_force_mac_fc(struct e1000_hw *hw) { uint32_t ctrl; @@ -1526,7 +1697,7 @@ ctrl &= (~E1000_CTRL_TFCE); E1000_WRITE_REG(hw, CTRL, ctrl); - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -1557,9 +1728,9 @@ * configuration of the MAC to match the "fc" parameter. */ if(((hw->media_type == e1000_media_type_fiber) && (hw->autoneg_failed)) || + ((hw->media_type == e1000_media_type_internal_serdes) && (hw->autoneg_failed)) || ((hw->media_type == e1000_media_type_copper) && (!hw->autoneg))) { - ret_val = e1000_force_mac_fc(hw); - if(ret_val < 0) { + if((ret_val = e1000_force_mac_fc(hw))) { DEBUGOUT("Error forcing flow control settings\n"); return ret_val; } @@ -1575,14 +1746,10 @@ * has completed. We read this twice because this reg has * some "sticky" (latched) bits. */ - if(e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { - DEBUGOUT("PHY Read Error \n"); - return -E1000_ERR_PHY; - } - if(e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) { - DEBUGOUT("PHY Read Error \n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg))) + return ret_val; + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg))) + return ret_val; if(mii_status_reg & MII_SR_AUTONEG_COMPLETE) { /* The AutoNeg process has completed, so we now need to @@ -1591,14 +1758,12 @@ * Register (Address 5) to determine how flow control was * negotiated. */ - if(e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - if(e1000_read_phy_reg(hw, PHY_LP_ABILITY, &mii_nway_lp_ability_reg) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_ADV, + &mii_nway_adv_reg))) + return ret_val; + if((ret_val = e1000_read_phy_reg(hw, PHY_LP_ABILITY, + &mii_nway_lp_ability_reg))) + return ret_val; /* Two bits in the Auto Negotiation Advertisement Register * (Address 4) and two bits in the Auto Negotiation Base @@ -1704,7 +1869,7 @@ hw->original_fc == e1000_fc_tx_pause) { hw->fc = e1000_fc_none; DEBUGOUT("Flow Control = NONE.\r\n"); - } else { + } else if(!hw->fc_strict_ieee) { hw->fc = e1000_fc_rx_pause; DEBUGOUT("Flow Control = RX PAUSE frames only.\r\n"); } @@ -1713,7 +1878,10 @@ * negotiated to HALF DUPLEX, flow control should not be * enabled per IEEE 802.3 spec. */ - e1000_get_speed_and_duplex(hw, &speed, &duplex); + if((ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex))) { + DEBUGOUT("Error getting link speed and duplex\n"); + return ret_val; + } if(duplex == HALF_DUPLEX) hw->fc = e1000_fc_none; @@ -1721,16 +1889,15 @@ /* Now we call a subroutine to actually force the MAC * controller to use the correct flow control settings. */ - ret_val = e1000_force_mac_fc(hw); - if(ret_val < 0) { + if((ret_val = e1000_force_mac_fc(hw))) { DEBUGOUT("Error forcing flow control settings\n"); return ret_val; - } + } } else { DEBUGOUT("Copper PHY and Auto Neg has not completed.\r\n"); } } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -1747,19 +1914,19 @@ uint32_t ctrl; uint32_t status; uint32_t rctl; - uint32_t signal; + uint32_t signal = 0; int32_t ret_val; uint16_t phy_data; uint16_t lp_capability; DEBUGFUNC("e1000_check_for_link"); - /* On adapters with a MAC newer that 82544, SW Defineable pin 1 will be + /* On adapters with a MAC newer than 82544, SW Defineable pin 1 will be * set when the optics detect a signal. On older adapters, it will be - * cleared when there is a signal + * cleared when there is a signal. This applies to fiber media only. */ - if(hw->mac_type > e1000_82544) signal = E1000_CTRL_SWDPIN1; - else signal = 0; + if(hw->media_type == e1000_media_type_fiber) + signal = (hw->mac_type > e1000_82544) ? E1000_CTRL_SWDPIN1 : 0; ctrl = E1000_READ_REG(hw, CTRL); status = E1000_READ_REG(hw, STATUS); @@ -1777,14 +1944,10 @@ * of the PHY. * Read the register twice since the link bit is sticky. */ - if(e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - if(e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data))) + return ret_val; + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data))) + return ret_val; if(phy_data & MII_SR_LINK_STATUS) { hw->get_link_status = FALSE; @@ -1794,6 +1957,7 @@ } else { /* No link detected */ + e1000_config_dsp_after_link_change(hw, FALSE); return 0; } @@ -1802,6 +1966,9 @@ */ if(!hw->autoneg) return -E1000_ERR_CONFIG; + /* optimize the dsp settings for the igp phy */ + e1000_config_dsp_after_link_change(hw, TRUE); + /* We have a M88E1000 PHY and Auto-Neg is enabled. If we * have Si on board that is 82544 or newer, Auto * Speed Detection takes care of MAC speed/duplex @@ -1813,8 +1980,7 @@ if(hw->mac_type >= e1000_82544) e1000_config_collision_dist(hw); else { - ret_val = e1000_config_mac_to_phy(hw); - if(ret_val < 0) { + if((ret_val = e1000_config_mac_to_phy(hw))) { DEBUGOUT("Error configuring MAC to PHY settings\n"); return ret_val; } @@ -1824,8 +1990,7 @@ * need to restore the desired flow control settings because we may * have had to re-autoneg with a different link partner. */ - ret_val = e1000_config_fc_after_link_up(hw); - if(ret_val < 0) { + if((ret_val = e1000_config_fc_after_link_up(hw))) { DEBUGOUT("Error configuring flow control\n"); return ret_val; } @@ -1840,10 +2005,9 @@ * partner is TBI-based, and we turn on TBI Compatibility. */ if(hw->tbi_compatibility_en) { - if(e1000_read_phy_reg(hw, PHY_LP_ABILITY, &lp_capability) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + 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 | @@ -1900,8 +2064,7 @@ E1000_WRITE_REG(hw, CTRL, ctrl); /* Configure Flow Control after forcing link up. */ - ret_val = e1000_config_fc_after_link_up(hw); - if(ret_val < 0) { + if((ret_val = e1000_config_fc_after_link_up(hw))) { DEBUGOUT("Error configuring flow control\n"); return ret_val; } @@ -1918,7 +2081,7 @@ E1000_WRITE_REG(hw, TXCW, hw->txcw); E1000_WRITE_REG(hw, CTRL, (ctrl & ~E1000_CTRL_SLU)); } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -1928,12 +2091,14 @@ * speed - Speed of the connection * duplex - Duplex setting of the connection *****************************************************************************/ -void +int32_t e1000_get_speed_and_duplex(struct e1000_hw *hw, uint16_t *speed, uint16_t *duplex) { uint32_t status; + int32_t ret_val; + uint16_t phy_data; DEBUGFUNC("e1000_get_speed_and_duplex"); @@ -1962,6 +2127,27 @@ *speed = SPEED_1000; *duplex = FULL_DUPLEX; } + + /* IGP01 PHY may advertise full duplex operation after speed downgrade even + * if it is operating at half duplex. Here we set the duplex settings to + * match the duplex in the link partner's capabilities. + */ + if(hw->phy_type == e1000_phy_igp && hw->speed_downgraded) { + if((ret_val = e1000_read_phy_reg(hw, PHY_AUTONEG_EXP, &phy_data))) + return ret_val; + + if(!(phy_data & NWAY_ER_LP_NWAY_CAPS)) + *duplex = HALF_DUPLEX; + else { + if((ret_val == e1000_read_phy_reg(hw, PHY_LP_ABILITY, &phy_data))) + return ret_val; + if((*speed == SPEED_100 && !(phy_data & NWAY_LPAR_100TX_FD_CAPS)) || + (*speed == SPEED_10 && !(phy_data & NWAY_LPAR_10T_FD_CAPS))) + *duplex = HALF_DUPLEX; + } + } + + return E1000_SUCCESS; } /****************************************************************************** @@ -1972,6 +2158,7 @@ int32_t e1000_wait_autoneg(struct e1000_hw *hw) { + int32_t ret_val; uint16_t i; uint16_t phy_data; @@ -1983,20 +2170,16 @@ /* Read the MII Status Register and wait for Auto-Neg * Complete bit to be set. */ - if(e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - if(e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data))) + return ret_val; + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data))) + return ret_val; if(phy_data & MII_SR_AUTONEG_COMPLETE) { - return 0; + return E1000_SUCCESS; } msec_delay(100); } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -2010,11 +2193,11 @@ uint32_t *ctrl) { /* Raise the clock input to the Management Data Clock (by setting the MDC - * bit), and then delay 2 microseconds. + * bit), and then delay 10 microseconds. */ E1000_WRITE_REG(hw, CTRL, (*ctrl | E1000_CTRL_MDC)); E1000_WRITE_FLUSH(hw); - udelay(2); + udelay(10); } /****************************************************************************** @@ -2028,11 +2211,11 @@ uint32_t *ctrl) { /* Lower the clock input to the Management Data Clock (by clearing the MDC - * bit), and then delay 2 microseconds. + * bit), and then delay 10 microseconds. */ E1000_WRITE_REG(hw, CTRL, (*ctrl & ~E1000_CTRL_MDC)); E1000_WRITE_FLUSH(hw); - udelay(2); + udelay(10); } /****************************************************************************** @@ -2076,7 +2259,7 @@ E1000_WRITE_REG(hw, CTRL, ctrl); E1000_WRITE_FLUSH(hw); - udelay(2); + udelay(10); e1000_raise_mdi_clk(hw, &ctrl); e1000_lower_mdi_clk(hw, &ctrl); @@ -2138,8 +2321,8 @@ } /***************************************************************************** -* Reads the value from a PHY register -* +* Reads the value from a PHY register, if the value is on a specific non zero +* page, sets the page first. * hw - Struct containing variables accessed by shared code * reg_addr - address of the PHY register to read ******************************************************************************/ @@ -2148,11 +2331,33 @@ uint32_t reg_addr, uint16_t *phy_data) { + uint32_t ret_val; + + DEBUGFUNC("e1000_read_phy_reg"); + + if(hw->phy_type == e1000_phy_igp && + (reg_addr > MAX_PHY_MULTI_PAGE_REG)) { + if((ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT, + (uint16_t)reg_addr))) + return ret_val; + } + + ret_val = e1000_read_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT & reg_addr, + phy_data); + + return ret_val; +} + +int32_t +e1000_read_phy_reg_ex(struct e1000_hw *hw, + uint32_t reg_addr, + uint16_t *phy_data) +{ uint32_t i; uint32_t mdic = 0; const uint32_t phy_addr = 1; - DEBUGFUNC("e1000_read_phy_reg"); + DEBUGFUNC("e1000_read_phy_reg_ex"); if(reg_addr > MAX_PHY_REG_ADDRESS) { DEBUGOUT1("PHY Address %d is out of range\n", reg_addr); @@ -2172,7 +2377,7 @@ /* Poll the ready bit to see if the MDI read completed */ for(i = 0; i < 64; i++) { - udelay(10); + udelay(50); mdic = E1000_READ_REG(hw, MDIC); if(mdic & E1000_MDIC_READY) break; } @@ -2214,7 +2419,7 @@ */ *phy_data = e1000_shift_in_mdi_bits(hw); } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -2229,11 +2434,33 @@ uint32_t reg_addr, uint16_t phy_data) { + uint32_t ret_val; + + DEBUGFUNC("e1000_write_phy_reg"); + + if(hw->phy_type == e1000_phy_igp && + (reg_addr > MAX_PHY_MULTI_PAGE_REG)) { + if((ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT, + (uint16_t)reg_addr))) + return ret_val; + } + + ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT & reg_addr, + phy_data); + + return ret_val; +} + +int32_t +e1000_write_phy_reg_ex(struct e1000_hw *hw, + uint32_t reg_addr, + uint16_t phy_data) +{ uint32_t i; uint32_t mdic = 0; const uint32_t phy_addr = 1; - DEBUGFUNC("e1000_write_phy_reg"); + DEBUGFUNC("e1000_write_phy_reg_ex"); if(reg_addr > MAX_PHY_REG_ADDRESS) { DEBUGOUT1("PHY Address %d is out of range\n", reg_addr); @@ -2254,7 +2481,7 @@ /* Poll the ready bit to see if the MDI read completed */ for(i = 0; i < 64; i++) { - udelay(10); + udelay(50); mdic = E1000_READ_REG(hw, MDIC); if(mdic & E1000_MDIC_READY) break; } @@ -2284,7 +2511,7 @@ e1000_shift_out_mdi_bits(hw, mdic, 32); } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -2329,11 +2556,6 @@ udelay(150); if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 0x0000) < 0) { - DEBUGOUT("PHY Write Error\n"); - return; - } - /* Configure activity LED after PHY reset */ led_ctrl = E1000_READ_REG(hw, LEDCTL); led_ctrl &= IGP_ACTIVITY_LED_MASK; @@ -2352,24 +2574,26 @@ int32_t e1000_phy_reset(struct e1000_hw *hw) { + int32_t ret_val; uint16_t phy_data; DEBUGFUNC("e1000_phy_reset"); - if(e1000_read_phy_reg(hw, PHY_CTRL, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - phy_data |= MII_CR_RESET; - if(e1000_write_phy_reg(hw, PHY_CTRL, phy_data) < 0) { - DEBUGOUT("PHY Write Error\n"); - return -E1000_ERR_PHY; - } - udelay(1); - if (hw->phy_type == e1000_phy_igp) { + if(hw->mac_type != e1000_82541_rev_2) { + if((ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data))) + return ret_val; + + phy_data |= MII_CR_RESET; + if((ret_val = e1000_write_phy_reg(hw, PHY_CTRL, phy_data))) + return ret_val; + + udelay(1); + } else e1000_phy_hw_reset(hw); + + if(hw->phy_type == e1000_phy_igp) e1000_phy_init_script(hw); - } - return 0; + + return E1000_SUCCESS; } /****************************************************************************** @@ -2380,23 +2604,21 @@ int32_t e1000_detect_gig_phy(struct e1000_hw *hw) { + int32_t phy_init_status, ret_val; uint16_t phy_id_high, phy_id_low; boolean_t match = FALSE; - int32_t phy_init_status; DEBUGFUNC("e1000_detect_gig_phy"); /* Read the PHY ID Registers to identify which PHY is onboard. */ - if(e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_ID1, &phy_id_high))) + return ret_val; + hw->phy_id = (uint32_t) (phy_id_high << 16); udelay(20); - if(e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_ID2, &phy_id_low))) + return ret_val; + hw->phy_id |= (uint32_t) (phy_id_low & PHY_REVISION_MASK); hw->phy_revision = (uint32_t) phy_id_low & ~PHY_REVISION_MASK; @@ -2409,11 +2631,15 @@ break; case e1000_82540: case e1000_82545: + case e1000_82545_rev_3: case e1000_82546: + case e1000_82546_rev_3: if(hw->phy_id == M88E1011_I_PHY_ID) match = TRUE; break; case e1000_82541: + case e1000_82541_rev_2: case e1000_82547: + case e1000_82547_rev_2: if(hw->phy_id == IGP01E1000_I_PHY_ID) match = TRUE; break; default: @@ -2424,7 +2650,7 @@ if ((match) && (phy_init_status == E1000_SUCCESS)) { DEBUGOUT1("PHY ID 0x%X detected\n", hw->phy_id); - return 0; + return E1000_SUCCESS; } DEBUGOUT1("Invalid PHY ID 0x%X\n", hw->phy_id); return -E1000_ERR_PHY; @@ -2438,17 +2664,16 @@ static int32_t e1000_phy_reset_dsp(struct e1000_hw *hw) { - int32_t ret_val = -E1000_ERR_PHY; + int32_t ret_val; DEBUGFUNC("e1000_phy_reset_dsp"); do { - if(e1000_write_phy_reg(hw, 29, 0x001d) < 0) break; - if(e1000_write_phy_reg(hw, 30, 0x00c1) < 0) break; - if(e1000_write_phy_reg(hw, 30, 0x0000) < 0) break; - ret_val = 0; + if((ret_val = e1000_write_phy_reg(hw, 29, 0x001d))) break; + if((ret_val = e1000_write_phy_reg(hw, 30, 0x00c1))) break; + if((ret_val = e1000_write_phy_reg(hw, 30, 0x0000))) break; + ret_val = E1000_SUCCESS; } while(0); - if(ret_val < 0) DEBUGOUT("PHY Write Error\n"); return ret_val; } @@ -2459,8 +2684,10 @@ * phy_info - PHY information structure ******************************************************************************/ int32_t -e1000_phy_igp_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info) +e1000_phy_igp_get_info(struct e1000_hw *hw, + struct e1000_phy_info *phy_info) { + int32_t ret_val; uint16_t phy_data, polarity, min_length, max_length, average; DEBUGFUNC("e1000_phy_igp_get_info"); @@ -2476,13 +2703,14 @@ phy_info->polarity_correction = e1000_polarity_reversal_enabled; /* Check polarity status */ - if(e1000_check_polarity(hw, &polarity) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_check_polarity(hw, &polarity))) + return ret_val; phy_info->cable_polarity = polarity; - if(e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, &phy_data) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, + &phy_data))) + return ret_val; phy_info->mdix_mode = (phy_data & IGP01E1000_PSSR_MDIX) >> IGP01E1000_PSSR_MDIX_SHIFT; @@ -2490,8 +2718,8 @@ if((phy_data & IGP01E1000_PSSR_SPEED_MASK) == IGP01E1000_PSSR_SPEED_1000MBPS) { /* Local/Remote Receiver Information are only valid at 1000 Mbps */ - if(e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data))) + return ret_val; phy_info->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS) >> SR_1000T_LOCAL_RX_STATUS_SHIFT; @@ -2499,8 +2727,8 @@ SR_1000T_REMOTE_RX_STATUS_SHIFT; /* Get cable length */ - if(e1000_get_cable_length(hw, &min_length, &max_length) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_get_cable_length(hw, &min_length, &max_length))) + return ret_val; /* transalte to old method */ average = (max_length + min_length) / 2; @@ -2527,8 +2755,10 @@ * phy_info - PHY information structure ******************************************************************************/ int32_t -e1000_phy_m88_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info) +e1000_phy_m88_get_info(struct e1000_hw *hw, + struct e1000_phy_info *phy_info) { + int32_t ret_val; uint16_t phy_data, polarity; DEBUGFUNC("e1000_phy_m88_get_info"); @@ -2537,8 +2767,8 @@ * and it stored in the hw->speed_downgraded parameter. */ phy_info->downshift = hw->speed_downgraded; - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data))) + return ret_val; phy_info->extended_10bt_distance = (phy_data & M88E1000_PSCR_10BT_EXT_DIST_ENABLE) >> @@ -2548,13 +2778,13 @@ M88E1000_PSCR_POLARITY_REVERSAL_SHIFT; /* Check polarity status */ - if(e1000_check_polarity(hw, &polarity) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_check_polarity(hw, &polarity))) + return ret_val; phy_info->cable_polarity = polarity; - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data))) + return ret_val; phy_info->mdix_mode = (phy_data & M88E1000_PSSR_MDIX) >> M88E1000_PSSR_MDIX_SHIFT; @@ -2566,8 +2796,8 @@ phy_info->cable_length = ((phy_data & M88E1000_PSSR_CABLE_LENGTH) >> M88E1000_PSSR_CABLE_LENGTH_SHIFT); - if(e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, &phy_data))) + return ret_val; phy_info->local_rx = (phy_data & SR_1000T_LOCAL_RX_STATUS) >> SR_1000T_LOCAL_RX_STATUS_SHIFT; @@ -2589,6 +2819,7 @@ e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info) { + int32_t ret_val; uint16_t phy_data; DEBUGFUNC("e1000_phy_get_info"); @@ -2607,20 +2838,18 @@ return -E1000_ERR_CONFIG; } - if(e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } - if(e1000_read_phy_reg(hw, PHY_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data))) + return ret_val; + + if((ret_val = e1000_read_phy_reg(hw, PHY_STATUS, &phy_data))) + return ret_val; + if((phy_data & MII_SR_LINK_STATUS) != MII_SR_LINK_STATUS) { DEBUGOUT("PHY info is only valid if link is up\n"); return -E1000_ERR_CONFIG; } - if (hw->phy_type == e1000_phy_igp) + if(hw->phy_type == e1000_phy_igp) return e1000_phy_igp_get_info(hw, phy_info); else return e1000_phy_m88_get_info(hw, phy_info); @@ -2636,7 +2865,7 @@ hw->mdix = 1; return -E1000_ERR_CONFIG; } - return 0; + return E1000_SUCCESS; } @@ -2668,7 +2897,9 @@ break; case e1000_82540: case e1000_82545: + case e1000_82545_rev_3: case e1000_82546: + case e1000_82546_rev_3: eeprom->type = e1000_eeprom_microwire; eeprom->opcode_bits = 3; eeprom->delay_usec = 50; @@ -2681,8 +2912,9 @@ } break; case e1000_82541: + case e1000_82541_rev_2: case e1000_82547: - default: + case e1000_82547_rev_2: if (eecd & E1000_EECD_TYPE) { eeprom->type = e1000_eeprom_spi; eeprom->opcode_bits = 8; @@ -2707,6 +2939,18 @@ } } break; + default: + eeprom->type = e1000_eeprom_spi; + eeprom->opcode_bits = 8; + eeprom->delay_usec = 1; + if (eecd & E1000_EECD_ADDR_BITS) { + eeprom->page_size = 32; + eeprom->address_bits = 16; + } else { + eeprom->page_size = 8; + eeprom->address_bits = 8; + } + break; } if (eeprom->type == e1000_eeprom_spi) { @@ -2715,28 +2959,28 @@ eeprom_size &= EEPROM_SIZE_MASK; switch (eeprom_size) { - case EEPROM_SIZE_16KB: - eeprom->word_size = 8192; - break; - case EEPROM_SIZE_8KB: - eeprom->word_size = 4096; - break; - case EEPROM_SIZE_4KB: - eeprom->word_size = 2048; - break; - case EEPROM_SIZE_2KB: - eeprom->word_size = 1024; - break; - case EEPROM_SIZE_1KB: - eeprom->word_size = 512; - break; - case EEPROM_SIZE_512B: - eeprom->word_size = 256; - break; - case EEPROM_SIZE_128B: - default: - eeprom->word_size = 64; - break; + case EEPROM_SIZE_16KB: + eeprom->word_size = 8192; + break; + case EEPROM_SIZE_8KB: + eeprom->word_size = 4096; + break; + case EEPROM_SIZE_4KB: + eeprom->word_size = 2048; + break; + case EEPROM_SIZE_2KB: + eeprom->word_size = 1024; + break; + case EEPROM_SIZE_1KB: + eeprom->word_size = 512; + break; + case EEPROM_SIZE_512B: + eeprom->word_size = 256; + break; + case EEPROM_SIZE_128B: + default: + eeprom->word_size = 64; + break; } } } @@ -2841,7 +3085,8 @@ * hw - Struct containing variables accessed by shared code *****************************************************************************/ static uint16_t -e1000_shift_in_ee_bits(struct e1000_hw *hw, uint16_t count) +e1000_shift_in_ee_bits(struct e1000_hw *hw, + uint16_t count) { uint32_t eecd; uint32_t i; @@ -3101,13 +3346,17 @@ } /* Prepare the EEPROM for reading */ - if (e1000_acquire_eeprom(hw) != E1000_SUCCESS) + if(e1000_acquire_eeprom(hw) != E1000_SUCCESS) return -E1000_ERR_EEPROM; if(eeprom->type == e1000_eeprom_spi) { + uint16_t word_in; uint8_t read_opcode = EEPROM_READ_OPCODE_SPI; - if(e1000_spi_eeprom_ready(hw)) return -E1000_ERR_EEPROM; + if(e1000_spi_eeprom_ready(hw)) { + e1000_release_eeprom(hw); + return -E1000_ERR_EEPROM; + } e1000_standby_eeprom(hw); @@ -3118,30 +3367,35 @@ /* Send the READ command (opcode + addr) */ e1000_shift_out_ee_bits(hw, read_opcode, eeprom->opcode_bits); e1000_shift_out_ee_bits(hw, (uint16_t)(offset*2), eeprom->address_bits); - } - else if(eeprom->type == e1000_eeprom_microwire) { - /* Send the READ command (opcode + addr) */ - e1000_shift_out_ee_bits(hw, EEPROM_READ_OPCODE_MICROWIRE, - eeprom->opcode_bits); - e1000_shift_out_ee_bits(hw, offset, eeprom->address_bits); - } - /* Read the data. The address of the eeprom internally increments with - * each word (microwire) or byte (spi) being read, saving on the overhead - * of eeprom setup and tear-down. The address counter will roll over if - * reading beyond the size of the eeprom, thus allowing the entire memory - * to be read starting from any offset. */ - for (i = 0; i < words; i++) { - uint16_t word_in = e1000_shift_in_ee_bits(hw, 16); - if (eeprom->type == e1000_eeprom_spi) - word_in = (word_in >> 8) | (word_in << 8); - data[i] = word_in; + /* Read the data. The address of the eeprom internally increments with + * each byte (spi) being read, saving on the overhead of eeprom setup + * and tear-down. The address counter will roll over if reading beyond + * the size of the eeprom, thus allowing the entire memory to be read + * starting from any offset. */ + for (i = 0; i < words; i++) { + word_in = e1000_shift_in_ee_bits(hw, 16); + data[i] = (word_in >> 8) | (word_in << 8); + } + } else if(eeprom->type == e1000_eeprom_microwire) { + for (i = 0; i < words; i++) { + /* Send the READ command (opcode + addr) */ + e1000_shift_out_ee_bits(hw, EEPROM_READ_OPCODE_MICROWIRE, + eeprom->opcode_bits); + e1000_shift_out_ee_bits(hw, (uint16_t)(offset + i), + eeprom->address_bits); + + /* Read the data. For microwire, each word requires the overhead + * of eeprom setup and tear-down. */ + data[i] = e1000_shift_in_ee_bits(hw, 16); + e1000_standby_eeprom(hw); + } } /* End this read operation */ e1000_release_eeprom(hw); - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -3169,9 +3423,9 @@ checksum += eeprom_data; } - if(checksum == (uint16_t) EEPROM_SUM) { - return 0; - } else { + if(checksum == (uint16_t) EEPROM_SUM) + return E1000_SUCCESS; + else { DEBUGOUT("EEPROM Checksum Invalid\n"); return -E1000_ERR_EEPROM; } @@ -3205,7 +3459,7 @@ DEBUGOUT("EEPROM Write Error\n"); return -E1000_ERR_EEPROM; } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -3403,7 +3657,7 @@ e1000_shift_out_ee_bits(hw, 0, (uint16_t)(eeprom->address_bits - 2)); - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -3437,7 +3691,7 @@ /* Save word 1 in lower half of part_num */ *part_num |= eeprom_data; - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -3463,7 +3717,7 @@ hw->perm_mac_addr[i] = (uint8_t) (eeprom_data & 0x00FF); hw->perm_mac_addr[i+1] = (uint8_t) (eeprom_data >> 8); } - if((hw->mac_type == e1000_82546) && + 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); @@ -3472,7 +3726,7 @@ } for(i = 0; i < NODE_ADDRESS_SIZE; i++) hw->mac_addr[i] = hw->perm_mac_addr[i]; - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -3748,7 +4002,7 @@ if(hw->mac_type < e1000_82540) { /* Nothing to do */ - return 0; + return E1000_SUCCESS; } ledctl = E1000_READ_REG(hw, LEDCTL); @@ -3799,7 +4053,7 @@ break; } } - return 0; + return E1000_SUCCESS; } /****************************************************************************** @@ -3811,49 +4065,48 @@ e1000_setup_led(struct e1000_hw *hw) { uint32_t ledctl; + int32_t ret_val = E1000_SUCCESS; DEBUGFUNC("e1000_setup_led"); - switch(hw->device_id) { - case E1000_DEV_ID_82542: - case E1000_DEV_ID_82543GC_FIBER: - case E1000_DEV_ID_82543GC_COPPER: - case E1000_DEV_ID_82544EI_COPPER: - case E1000_DEV_ID_82544EI_FIBER: - case E1000_DEV_ID_82544GC_COPPER: - case E1000_DEV_ID_82544GC_LOM: + switch(hw->mac_type) { + case e1000_82542_rev2_0: + case e1000_82542_rev2_1: + case e1000_82543: + case e1000_82544: /* No setup necessary */ break; - case E1000_DEV_ID_82545EM_FIBER: - case E1000_DEV_ID_82546EB_FIBER: - ledctl = E1000_READ_REG(hw, LEDCTL); - /* Save current LEDCTL settings */ - hw->ledctl_default = ledctl; - /* Turn off LED0 */ - ledctl &= ~(E1000_LEDCTL_LED0_IVRT | - E1000_LEDCTL_LED0_BLINK | - E1000_LEDCTL_LED0_MODE_MASK); - ledctl |= (E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED0_MODE_SHIFT); - E1000_WRITE_REG(hw, LEDCTL, ledctl); - break; - case E1000_DEV_ID_82540EP: - case E1000_DEV_ID_82540EP_LOM: - case E1000_DEV_ID_82540EP_LP: - case E1000_DEV_ID_82540EM: - case E1000_DEV_ID_82540EM_LOM: - case E1000_DEV_ID_82545EM_COPPER: - case E1000_DEV_ID_82546EB_COPPER: - case E1000_DEV_ID_82546EB_QUAD_COPPER: - case E1000_DEV_ID_82541EI: - case E1000_DEV_ID_82541EP: - case E1000_DEV_ID_82547EI: - E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1); - break; + case e1000_82541: + case e1000_82547: + case e1000_82541_rev_2: + case e1000_82547_rev_2: + /* Turn off PHY Smart Power Down (if enabled) */ + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, + &hw->phy_spd_default))) + return ret_val; + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, + (uint16_t)(hw->phy_spd_default & + ~IGP01E1000_GMII_SPD)))) + return ret_val; + /* Fall Through */ default: - DEBUGOUT("Invalid device ID\n"); - return -E1000_ERR_CONFIG; + if(hw->media_type == e1000_media_type_fiber) { + ledctl = E1000_READ_REG(hw, LEDCTL); + /* Save current LEDCTL settings */ + hw->ledctl_default = ledctl; + /* Turn off LED0 */ + ledctl &= ~(E1000_LEDCTL_LED0_IVRT | + E1000_LEDCTL_LED0_BLINK | + E1000_LEDCTL_LED0_MODE_MASK); + ledctl |= (E1000_LEDCTL_MODE_LED_OFF << + E1000_LEDCTL_LED0_MODE_SHIFT); + E1000_WRITE_REG(hw, LEDCTL, ledctl); + } else if(hw->media_type == e1000_media_type_copper) + E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1); + break; } - return 0; + + return E1000_SUCCESS; } /****************************************************************************** @@ -3864,39 +4117,33 @@ int32_t e1000_cleanup_led(struct e1000_hw *hw) { + int32_t ret_val = E1000_SUCCESS; + DEBUGFUNC("e1000_cleanup_led"); - switch(hw->device_id) { - case E1000_DEV_ID_82542: - case E1000_DEV_ID_82543GC_FIBER: - case E1000_DEV_ID_82543GC_COPPER: - case E1000_DEV_ID_82544EI_COPPER: - case E1000_DEV_ID_82544EI_FIBER: - case E1000_DEV_ID_82544GC_COPPER: - case E1000_DEV_ID_82544GC_LOM: + switch(hw->mac_type) { + case e1000_82542_rev2_0: + case e1000_82542_rev2_1: + case e1000_82543: + case e1000_82544: /* No cleanup necessary */ break; - case E1000_DEV_ID_82540EP: - case E1000_DEV_ID_82540EP_LOM: - case E1000_DEV_ID_82540EP_LP: - case E1000_DEV_ID_82540EM: - case E1000_DEV_ID_82540EM_LOM: - case E1000_DEV_ID_82545EM_COPPER: - case E1000_DEV_ID_82545EM_FIBER: - case E1000_DEV_ID_82546EB_COPPER: - case E1000_DEV_ID_82546EB_FIBER: - case E1000_DEV_ID_82546EB_QUAD_COPPER: - case E1000_DEV_ID_82541EI: - case E1000_DEV_ID_82541EP: - case E1000_DEV_ID_82547EI: + case e1000_82541: + case e1000_82547: + case e1000_82541_rev_2: + case e1000_82547_rev_2: + /* Turn on PHY Smart Power Down (if previously enabled) */ + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, + hw->phy_spd_default))) + return ret_val; + /* Fall Through */ + default: /* Restore LEDCTL settings */ E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_default); break; - default: - DEBUGOUT("Invalid device ID\n"); - return -E1000_ERR_CONFIG; } - return 0; + + return E1000_SUCCESS; } /****************************************************************************** @@ -3907,50 +4154,44 @@ int32_t e1000_led_on(struct e1000_hw *hw) { - uint32_t ctrl; + uint32_t ctrl = E1000_READ_REG(hw, CTRL); DEBUGFUNC("e1000_led_on"); - switch(hw->device_id) { - case E1000_DEV_ID_82542: - case E1000_DEV_ID_82543GC_FIBER: - case E1000_DEV_ID_82543GC_COPPER: - case E1000_DEV_ID_82544EI_FIBER: - ctrl = E1000_READ_REG(hw, CTRL); + switch(hw->mac_type) { + case e1000_82542_rev2_0: + case e1000_82542_rev2_1: + case e1000_82543: /* Set SW Defineable Pin 0 to turn on the LED */ ctrl |= E1000_CTRL_SWDPIN0; ctrl |= E1000_CTRL_SWDPIO0; - E1000_WRITE_REG(hw, CTRL, ctrl); break; - case E1000_DEV_ID_82544EI_COPPER: - case E1000_DEV_ID_82544GC_COPPER: - case E1000_DEV_ID_82544GC_LOM: - case E1000_DEV_ID_82545EM_FIBER: - case E1000_DEV_ID_82546EB_FIBER: - ctrl = E1000_READ_REG(hw, CTRL); - /* Clear SW Defineable Pin 0 to turn on the LED */ - ctrl &= ~E1000_CTRL_SWDPIN0; - ctrl |= E1000_CTRL_SWDPIO0; - E1000_WRITE_REG(hw, CTRL, ctrl); - break; - case E1000_DEV_ID_82540EP: - case E1000_DEV_ID_82540EP_LOM: - case E1000_DEV_ID_82540EP_LP: - case E1000_DEV_ID_82540EM: - case E1000_DEV_ID_82540EM_LOM: - case E1000_DEV_ID_82545EM_COPPER: - case E1000_DEV_ID_82546EB_COPPER: - case E1000_DEV_ID_82546EB_QUAD_COPPER: - case E1000_DEV_ID_82541EI: - case E1000_DEV_ID_82541EP: - case E1000_DEV_ID_82547EI: - E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode2); + case e1000_82544: + if(hw->media_type == e1000_media_type_fiber) { + /* Set SW Defineable Pin 0 to turn on the LED */ + ctrl |= E1000_CTRL_SWDPIN0; + ctrl |= E1000_CTRL_SWDPIO0; + } else { + /* Clear SW Defineable Pin 0 to turn on the LED */ + ctrl &= ~E1000_CTRL_SWDPIN0; + ctrl |= E1000_CTRL_SWDPIO0; + } break; default: - DEBUGOUT("Invalid device ID\n"); - return -E1000_ERR_CONFIG; + if(hw->media_type == e1000_media_type_fiber) { + /* Clear SW Defineable Pin 0 to turn on the LED */ + ctrl &= ~E1000_CTRL_SWDPIN0; + ctrl |= E1000_CTRL_SWDPIO0; + } else if(hw->media_type == e1000_media_type_copper) { + E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode2); + return E1000_SUCCESS; + } + break; } - return 0; + + E1000_WRITE_REG(hw, CTRL, ctrl); + + return E1000_SUCCESS; } /****************************************************************************** @@ -3961,50 +4202,44 @@ int32_t e1000_led_off(struct e1000_hw *hw) { - uint32_t ctrl; + uint32_t ctrl = E1000_READ_REG(hw, CTRL); DEBUGFUNC("e1000_led_off"); - switch(hw->device_id) { - case E1000_DEV_ID_82542: - case E1000_DEV_ID_82543GC_FIBER: - case E1000_DEV_ID_82543GC_COPPER: - case E1000_DEV_ID_82544EI_FIBER: - ctrl = E1000_READ_REG(hw, CTRL); + switch(hw->mac_type) { + case e1000_82542_rev2_0: + case e1000_82542_rev2_1: + case e1000_82543: /* Clear SW Defineable Pin 0 to turn off the LED */ ctrl &= ~E1000_CTRL_SWDPIN0; ctrl |= E1000_CTRL_SWDPIO0; - E1000_WRITE_REG(hw, CTRL, ctrl); break; - case E1000_DEV_ID_82544EI_COPPER: - case E1000_DEV_ID_82544GC_COPPER: - case E1000_DEV_ID_82544GC_LOM: - case E1000_DEV_ID_82545EM_FIBER: - case E1000_DEV_ID_82546EB_FIBER: - ctrl = E1000_READ_REG(hw, CTRL); - /* Set SW Defineable Pin 0 to turn off the LED */ - ctrl |= E1000_CTRL_SWDPIN0; - ctrl |= E1000_CTRL_SWDPIO0; - E1000_WRITE_REG(hw, CTRL, ctrl); - break; - case E1000_DEV_ID_82540EP: - case E1000_DEV_ID_82540EP_LOM: - case E1000_DEV_ID_82540EP_LP: - case E1000_DEV_ID_82540EM: - case E1000_DEV_ID_82540EM_LOM: - case E1000_DEV_ID_82545EM_COPPER: - case E1000_DEV_ID_82546EB_COPPER: - case E1000_DEV_ID_82546EB_QUAD_COPPER: - case E1000_DEV_ID_82541EI: - case E1000_DEV_ID_82541EP: - case E1000_DEV_ID_82547EI: - E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1); + case e1000_82544: + if(hw->media_type == e1000_media_type_fiber) { + /* Clear SW Defineable Pin 0 to turn off the LED */ + ctrl &= ~E1000_CTRL_SWDPIN0; + ctrl |= E1000_CTRL_SWDPIO0; + } else { + /* Set SW Defineable Pin 0 to turn off the LED */ + ctrl |= E1000_CTRL_SWDPIN0; + ctrl |= E1000_CTRL_SWDPIO0; + } break; default: - DEBUGOUT("Invalid device ID\n"); - return -E1000_ERR_CONFIG; + if(hw->media_type == e1000_media_type_fiber) { + /* Set SW Defineable Pin 0 to turn off the LED */ + ctrl |= E1000_CTRL_SWDPIN0; + ctrl |= E1000_CTRL_SWDPIO0; + } else if(hw->media_type == e1000_media_type_copper) { + E1000_WRITE_REG(hw, LEDCTL, hw->ledctl_mode1); + return E1000_SUCCESS; + } + break; } - return 0; + + E1000_WRITE_REG(hw, CTRL, ctrl); + + return E1000_SUCCESS; } /****************************************************************************** @@ -4127,8 +4362,7 @@ DEBUGFUNC("e1000_update_adaptive"); if(hw->adaptive_ifs) { - if((hw->collision_delta * hw->ifs_ratio) > - hw->tx_packet_delta) { + if((hw->collision_delta * hw->ifs_ratio) > hw->tx_packet_delta) { if(hw->tx_packet_delta > MIN_NUM_XMITS) { hw->in_ifs_mode = TRUE; if(hw->current_ifs_val < hw->ifs_max_val) { @@ -4140,8 +4374,7 @@ } } } else { - if((hw->in_ifs_mode == TRUE) && - (hw->tx_packet_delta <= MIN_NUM_XMITS)) { + if(hw->in_ifs_mode && (hw->tx_packet_delta <= MIN_NUM_XMITS)) { hw->current_ifs_val = 0; hw->in_ifs_mode = FALSE; E1000_WRITE_REG(hw, AIT, 0); @@ -4324,7 +4557,8 @@ * min_length - The estimated minimum length * max_length - The estimated maximum length * - * returns: E1000_SUCCESS / -E1000_ERR_XXX + * returns: - E1000_ERR_XXX + * E1000_SUCCESS * * This function always returns a ranged length (minimum & maximum). * So for M88 phy's, this function interprets the one value returned from the @@ -4332,9 +4566,11 @@ * For IGP phy's, the function calculates the range by the AGC registers. *****************************************************************************/ int32_t -e1000_get_cable_length(struct e1000_hw *hw, uint16_t *min_length, +e1000_get_cable_length(struct e1000_hw *hw, + uint16_t *min_length, uint16_t *max_length) { + int32_t ret_val; uint16_t agc_value = 0; uint16_t cur_agc, min_agc = IGP01E1000_AGC_LENGTH_TABLE_SIZE; uint16_t i, phy_data; @@ -4345,8 +4581,9 @@ /* Use old method for Phy older than IGP */ if(hw->phy_type == e1000_phy_m88) { - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, + &phy_data))) + return ret_val; /* Convert the enum value to ranged values */ switch((phy_data & M88E1000_PSSR_CABLE_LENGTH) >> @@ -4376,19 +4613,16 @@ break; } } else if(hw->phy_type == e1000_phy_igp) { /* For IGP PHY */ - uint16_t agc_reg_array[IGP01E1000_PHY_AGC_NUM] = {IGP01E1000_PHY_AGC_A, + uint16_t agc_reg_array[IGP01E1000_PHY_CHANNEL_NUM] = + {IGP01E1000_PHY_AGC_A, IGP01E1000_PHY_AGC_B, IGP01E1000_PHY_AGC_C, IGP01E1000_PHY_AGC_D}; /* Read the AGC registers for all channels */ - for(i = 0; i < IGP01E1000_PHY_AGC_NUM; i++) { - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, - agc_reg_array[i]) != E1000_SUCCESS) - return -E1000_ERR_PHY; - if(e1000_read_phy_reg(hw, agc_reg_array[i] & - IGP01E1000_PHY_PAGE_SELECT, &phy_data) != - E1000_SUCCESS) - return -E1000_ERR_PHY; + for(i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) { + + if((ret_val = e1000_read_phy_reg(hw, agc_reg_array[i], &phy_data))) + return ret_val; cur_agc = phy_data >> IGP01E1000_AGC_LENGTH_SHIFT; @@ -4404,20 +4638,15 @@ min_agc = cur_agc; } - /* Return to page 0 */ - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 0x0) != - E1000_SUCCESS) - return -E1000_ERR_PHY; - /* Remove the minimal AGC result for length < 50m */ - if(agc_value < IGP01E1000_PHY_AGC_NUM * e1000_igp_cable_length_50) { + if(agc_value < IGP01E1000_PHY_CHANNEL_NUM * e1000_igp_cable_length_50) { agc_value -= min_agc; /* Get the average length of the remaining 3 channels */ - agc_value /= (IGP01E1000_PHY_AGC_NUM - 1); + agc_value /= (IGP01E1000_PHY_CHANNEL_NUM - 1); } else { /* Get the average length of all the 4 channels. */ - agc_value /= IGP01E1000_PHY_AGC_NUM; + agc_value /= IGP01E1000_PHY_CHANNEL_NUM; } /* Set the range of the calculated length. */ @@ -4439,7 +4668,8 @@ * polarity - output parameter : 0 - Polarity is not reversed * 1 - Polarity is reversed. * - * returns: E1000_SUCCESS / -E1000_ERR_XXX + * returns: - E1000_ERR_XXX + * E1000_SUCCESS * * For phy's older then IGP, this function simply reads the polarity bit in the * Phy Status register. For IGP phy's, this bit is valid only if link speed is @@ -4448,22 +4678,26 @@ * IGP01E1000_PHY_PCS_INIT_REG. *****************************************************************************/ int32_t -e1000_check_polarity(struct e1000_hw *hw, uint16_t *polarity) +e1000_check_polarity(struct e1000_hw *hw, + uint16_t *polarity) { + int32_t ret_val; uint16_t phy_data; DEBUGFUNC("e1000_check_polarity"); if(hw->phy_type == e1000_phy_m88) { /* return the Polarity bit in the Status register. */ - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, + &phy_data))) + return ret_val; *polarity = (phy_data & M88E1000_PSSR_REV_POLARITY) >> M88E1000_PSSR_REV_POLARITY_SHIFT; } else if(hw->phy_type == e1000_phy_igp) { /* Read the Status register to check the speed */ - if(e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, &phy_data) < 0) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_STATUS, + &phy_data))) + return ret_val; /* If speed is 1000 Mbps, must read the IGP01E1000_PHY_PCS_INIT_REG to * find the polarity status */ @@ -4471,18 +4705,9 @@ IGP01E1000_PSSR_SPEED_1000MBPS) { /* Read the GIG initialization PCS register (0x00B4) */ - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, - IGP01E1000_PHY_PCS_INIT_REG) < 0) - return -E1000_ERR_PHY; - - if(e1000_read_phy_reg(hw, IGP01E1000_PHY_PCS_INIT_REG & - IGP01E1000_PHY_PAGE_SELECT, &phy_data) < 0) - return -E1000_ERR_PHY; - - /* Return to page 0 */ - if(e1000_write_phy_reg(hw, IGP01E1000_PHY_PAGE_SELECT, 0x0) != - E1000_SUCCESS) - return -E1000_ERR_PHY; + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PCS_INIT_REG, + &phy_data))) + return ret_val; /* Check the polarity bits */ *polarity = (phy_data & IGP01E1000_PHY_POLARITY_MASK) ? 1 : 0; @@ -4502,7 +4727,8 @@ * downshift - output parameter : 0 - No Downshift ocured. * 1 - Downshift ocured. * - * returns: E1000_SUCCESS / -E1000_ERR_XXX + * returns: - E1000_ERR_XXX + * E1000_SUCCESS * * For phy's older then IGP, this function reads the Downshift bit in the Phy * Specific Status register. For IGP phy's, it reads the Downgrade bit in the @@ -4512,25 +4738,287 @@ int32_t e1000_check_downshift(struct e1000_hw *hw) { + int32_t ret_val; uint16_t phy_data; DEBUGFUNC("e1000_check_downshift"); if(hw->phy_type == e1000_phy_igp) { - if(e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_LINK_HEALTH, + &phy_data))) + return ret_val; + hw->speed_downgraded = (phy_data & IGP01E1000_PLHR_SS_DOWNGRADE) ? 1 : 0; } else if(hw->phy_type == e1000_phy_m88) { - if(e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data) < 0) { - DEBUGOUT("PHY Read Error\n"); - return -E1000_ERR_PHY; - } + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, + &phy_data))) + return ret_val; + hw->speed_downgraded = (phy_data & M88E1000_PSSR_DOWNSHIFT) >> - M88E1000_PSSR_DOWNSHIFT_SHIFT; + M88E1000_PSSR_DOWNSHIFT_SHIFT; } return E1000_SUCCESS; } +/***************************************************************************** + * + * 82541_rev_2 & 82547_rev_2 have the capability to configure the DSP when a + * gigabit link is achieved to improve link quality. + * + * hw: Struct containing variables accessed by shared code + * + * returns: - E1000_ERR_PHY if fail to read/write the PHY + * E1000_SUCCESS at any other case. + * + ****************************************************************************/ + +int32_t +e1000_config_dsp_after_link_change(struct e1000_hw *hw, + boolean_t link_up) +{ + int32_t ret_val; + uint16_t phy_data, speed, duplex, i; + uint16_t dsp_reg_array[IGP01E1000_PHY_CHANNEL_NUM] = + {IGP01E1000_PHY_AGC_PARAM_A, + IGP01E1000_PHY_AGC_PARAM_B, + IGP01E1000_PHY_AGC_PARAM_C, + IGP01E1000_PHY_AGC_PARAM_D}; + uint16_t min_length, max_length; + + DEBUGFUNC("e1000_config_dsp_after_link_change"); + + if(hw->phy_type != e1000_phy_igp) + return E1000_SUCCESS; + + if(link_up) { + if((ret_val = e1000_get_speed_and_duplex(hw, &speed, &duplex))) { + DEBUGOUT("Error getting link speed and duplex\n"); + return ret_val; + } + + if(speed == SPEED_1000) { + + e1000_get_cable_length(hw, &min_length, &max_length); + + if((hw->dsp_config_state == e1000_dsp_config_enabled) && + min_length >= e1000_igp_cable_length_50) { + + for(i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) { + if((ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i], + &phy_data))) + return ret_val; + + phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX; + + if((ret_val = e1000_write_phy_reg(hw, dsp_reg_array[i], + phy_data))) + return ret_val; + } + hw->dsp_config_state = e1000_dsp_config_activated; + } + + if((hw->ffe_config_state == e1000_ffe_config_enabled) && + (min_length < e1000_igp_cable_length_50)) { + + uint16_t ffe_idle_err_timeout = FFE_IDLE_ERR_COUNT_TIMEOUT_20; + uint32_t idle_errs = 0; + + /* clear previous idle error counts */ + if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, + &phy_data))) + return ret_val; + + for(i = 0; i < ffe_idle_err_timeout; i++) { + udelay(1000); + if((ret_val = e1000_read_phy_reg(hw, PHY_1000T_STATUS, + &phy_data))) + return ret_val; + + idle_errs += (phy_data & SR_1000T_IDLE_ERROR_CNT); + if(idle_errs > SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT) { + hw->ffe_config_state = e1000_ffe_config_active; + + if((ret_val = e1000_write_phy_reg(hw, + IGP01E1000_PHY_DSP_FFE, + IGP01E1000_PHY_DSP_FFE_CM_CP))) + return ret_val; + break; + } + + if(idle_errs) + ffe_idle_err_timeout = FFE_IDLE_ERR_COUNT_TIMEOUT_100; + } + } + } + } else { + if(hw->dsp_config_state == e1000_dsp_config_activated) { + if((ret_val = e1000_write_phy_reg(hw, 0x0000, + IGP01E1000_IEEE_FORCE_GIGA))) + return ret_val; + for(i = 0; i < IGP01E1000_PHY_CHANNEL_NUM; i++) { + if((ret_val = e1000_read_phy_reg(hw, dsp_reg_array[i], + &phy_data))) + return ret_val; + + phy_data &= ~IGP01E1000_PHY_EDAC_MU_INDEX; + phy_data |= IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS; + + if((ret_val = e1000_write_phy_reg(hw,dsp_reg_array[i], + phy_data))) + return ret_val; + } + + if((ret_val = e1000_write_phy_reg(hw, 0x0000, + IGP01E1000_IEEE_RESTART_AUTONEG))) + return ret_val; + + hw->dsp_config_state = e1000_dsp_config_enabled; + } + + if(hw->ffe_config_state == e1000_ffe_config_active) { + if((ret_val = e1000_write_phy_reg(hw, 0x0000, + IGP01E1000_IEEE_FORCE_GIGA))) + return ret_val; + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_DSP_FFE, + IGP01E1000_PHY_DSP_FFE_DEFAULT))) + return ret_val; + + if((ret_val = e1000_write_phy_reg(hw, 0x0000, + IGP01E1000_IEEE_RESTART_AUTONEG))) + return ret_val; + hw->ffe_config_state = e1000_ffe_config_enabled; + } + } + return E1000_SUCCESS; +} + +/***************************************************************************** + * + * This function sets the lplu state according to the active flag. When + * activating lplu this function also disables smart speed and vise versa. + * lplu will not be activated unless the device autonegotiation advertisment + * meets standards of either 10 or 10/100 or 10/100/1000 at all duplexes. + * hw: Struct containing variables accessed by shared code + * active - true to enable lplu false to disable lplu. + * + * returns: - E1000_ERR_PHY if fail to read/write the PHY + * E1000_SUCCESS at any other case. + * + ****************************************************************************/ + +int32_t +e1000_set_d3_lplu_state(struct e1000_hw *hw, + boolean_t active) +{ + int32_t ret_val; + uint16_t phy_data; + DEBUGFUNC("e1000_set_d3_lplu_state"); + + if(!((hw->mac_type == e1000_82541_rev_2) || + (hw->mac_type == e1000_82547_rev_2))) + return E1000_SUCCESS; + + /* During driver activity LPLU should not be used or it will attain link + * from the lowest speeds starting from 10Mbps. The capability is used for + * Dx transitions and states */ + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_GMII_FIFO, &phy_data))) + return ret_val; + + if(!active) { + phy_data &= ~IGP01E1000_GMII_FLEX_SPD; + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data))) + return ret_val; + + /* LPLU and SmartSpeed are mutually exclusive. LPLU is used during + * Dx states where the power conservation is most important. During + * driver activity we should enable SmartSpeed, so performance is + * maintained. */ + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, + &phy_data))) + return ret_val; + + phy_data |= IGP01E1000_PSCFR_SMART_SPEED; + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, + phy_data))) + return ret_val; + + } else if((hw->autoneg_advertised == AUTONEG_ADVERTISE_SPEED_DEFAULT) || + (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_ALL ) || + (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_100_ALL)) { + + phy_data |= IGP01E1000_GMII_FLEX_SPD; + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_GMII_FIFO, phy_data))) + return ret_val; + + /* When LPLU is enabled we should disable SmartSpeed */ + if((ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, + &phy_data))) + return ret_val; + + phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED; + if((ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, + phy_data))) + return ret_val; + + } + return E1000_SUCCESS; +} + +/****************************************************************************** + * Change VCO speed register to improve Bit Error Rate performance of SERDES. + * + * hw - Struct containing variables accessed by shared code + *****************************************************************************/ +static int32_t +e1000_set_vco_speed(struct e1000_hw *hw) +{ + int32_t ret_val; + uint16_t default_page = 0; + uint16_t phy_data; + + DEBUGFUNC("e1000_set_vco_speed"); + + switch(hw->mac_type) { + case e1000_82545_rev_3: + case e1000_82546_rev_3: + break; + default: + return E1000_SUCCESS; + } + + /* Set PHY register 30, page 5, bit 8 to 0 */ + + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, + &default_page))) + return ret_val; + + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005))) + return ret_val; + + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data))) + return ret_val; + + phy_data &= ~M88E1000_PHY_VCO_REG_BIT8; + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data))) + return ret_val; + + /* Set PHY register 30, page 4, bit 11 to 1 */ + + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0004))) + return ret_val; + + if((ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data))) + return ret_val; + + phy_data |= M88E1000_PHY_VCO_REG_BIT11; + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data))) + return ret_val; + + if((ret_val = e1000_write_phy_reg(hw, M88E1000_PHY_PAGE_SELECT, + default_page))) + return ret_val; + + return E1000_SUCCESS; +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/e1000/e1000_hw.h linux-2.4.23-pre8/drivers/net/e1000/e1000_hw.h --- linux-2.4.22/drivers/net/e1000/e1000_hw.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/e1000/e1000_hw.h 2003-10-22 22:47:54.000000000 +0000 @@ -33,9 +33,9 @@ #ifndef _E1000_HW_H_ #define _E1000_HW_H_ - #include "e1000_osdep.h" + /* Forward declarations of structures used by the shared code */ struct e1000_hw; struct e1000_hw_stats; @@ -50,9 +50,13 @@ e1000_82544, e1000_82540, e1000_82545, + e1000_82545_rev_3, e1000_82546, + e1000_82546_rev_3, e1000_82541, + e1000_82541_rev_2, e1000_82547, + e1000_82547_rev_2, e1000_num_macs } e1000_mac_type; @@ -67,6 +71,7 @@ typedef enum { e1000_media_type_copper = 0, e1000_media_type_fiber = 1, + e1000_media_type_internal_serdes = 2, e1000_num_media_types } e1000_media_type; @@ -90,7 +95,8 @@ typedef enum { e1000_bus_type_unknown = 0, e1000_bus_type_pci, - e1000_bus_type_pcix + e1000_bus_type_pcix, + e1000_bus_type_reserved } e1000_bus_type; /* PCI bus speeds */ @@ -108,7 +114,8 @@ typedef enum { e1000_bus_width_unknown = 0, e1000_bus_width_32, - e1000_bus_width_64 + e1000_bus_width_64, + e1000_bus_width_reserved } e1000_bus_width; /* PHY status info structure and supporting enums */ @@ -186,6 +193,26 @@ e1000_phy_undefined = 0xFF } e1000_phy_type; +typedef enum { + e1000_ms_hw_default = 0, + e1000_ms_force_master, + e1000_ms_force_slave, + e1000_ms_auto +} e1000_ms_type; + +typedef enum { + e1000_ffe_config_enabled = 0, + e1000_ffe_config_active, + e1000_ffe_config_blocked +} e1000_ffe_config; + +typedef enum { + e1000_dsp_config_disabled = 0, + e1000_dsp_config_enabled, + e1000_dsp_config_activated, + e1000_dsp_config_undefined = 0xFF +} e1000_dsp_config; + struct e1000_phy_info { e1000_cable_length cable_length; e1000_10bt_ext_dist_enable extended_10bt_distance; @@ -224,9 +251,10 @@ /* Function prototypes */ /* Initialization */ -void e1000_reset_hw(struct e1000_hw *hw); +int32_t e1000_reset_hw(struct e1000_hw *hw); int32_t e1000_init_hw(struct e1000_hw *hw); int32_t e1000_set_mac_type(struct e1000_hw *hw); +void e1000_set_media_type(struct e1000_hw *hw); /* Link Configuration */ int32_t e1000_setup_link(struct e1000_hw *hw); @@ -234,8 +262,9 @@ void e1000_config_collision_dist(struct e1000_hw *hw); int32_t e1000_config_fc_after_link_up(struct e1000_hw *hw); int32_t e1000_check_for_link(struct e1000_hw *hw); -void e1000_get_speed_and_duplex(struct e1000_hw *hw, uint16_t * speed, uint16_t * duplex); +int32_t e1000_get_speed_and_duplex(struct e1000_hw *hw, uint16_t * speed, uint16_t * duplex); int32_t e1000_wait_autoneg(struct e1000_hw *hw); +int32_t e1000_force_mac_fc(struct e1000_hw *hw); /* PHY */ int32_t e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *phy_data); @@ -292,6 +321,8 @@ 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_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); #define E1000_READ_REG_IO(a, reg) \ e1000_read_reg_io((a), E1000_##reg) @@ -313,13 +344,22 @@ #define E1000_DEV_ID_82540EP_LP 0x101E #define E1000_DEV_ID_82545EM_COPPER 0x100F #define E1000_DEV_ID_82545EM_FIBER 0x1011 +#define E1000_DEV_ID_82545GM_COPPER 0x1026 +#define E1000_DEV_ID_82545GM_FIBER 0x1027 +#define E1000_DEV_ID_82545GM_SERDES 0x1028 #define E1000_DEV_ID_82546EB_COPPER 0x1010 #define E1000_DEV_ID_82546EB_FIBER 0x1012 #define E1000_DEV_ID_82546EB_QUAD_COPPER 0x101D #define E1000_DEV_ID_82541EI 0x1013 -#define E1000_DEV_ID_82541EP 0x1018 +#define E1000_DEV_ID_82541EI_MOBILE 0x1018 +#define E1000_DEV_ID_82541ER 0x1078 +#define E1000_DEV_ID_82547GI 0x1075 +#define E1000_DEV_ID_82541GI 0x1076 +#define E1000_DEV_ID_82541GI_MOBILE 0x1077 +#define E1000_DEV_ID_82546GB_COPPER 0x1079 +#define E1000_DEV_ID_82546GB_FIBER 0x107A +#define E1000_DEV_ID_82546GB_SERDES 0x107B #define E1000_DEV_ID_82547EI 0x1019 -#define NUM_DEV_IDS 20 #define NODE_ADDRESS_SIZE 6 #define ETH_LENGTH_OF_ADDRESS 6 @@ -385,7 +425,7 @@ E1000_IMS_RXSEQ | \ E1000_IMS_LSC) -/* The number of high/low register pairs in the RAR. The RAR (Receive Address +/* Number of high/low register pairs in the RAR. The RAR (Receive Address * Registers) holds the directed and multicast addresses that we monitor. We * reserve one of these spots for our directed address, allowing us room for * E1000_RAR_ENTRIES - 1 multicast addresses. @@ -539,7 +579,7 @@ volatile uint32_t high; /* receive address high */ }; -/* The number of entries in the Multicast Table Array (MTA). */ +/* Number of entries in the Multicast Table Array (MTA). */ #define E1000_NUM_MTA_REGISTERS 128 /* IPv4 Address Table Entry */ @@ -599,6 +639,7 @@ * A - register array */ #define E1000_CTRL 0x00000 /* Device Control - RW */ +#define E1000_CTRL_DUP 0x00004 /* Device Control Duplicate (Shadow) - RW */ #define E1000_STATUS 0x00008 /* Device Status - RO */ #define E1000_EECD 0x00010 /* EEPROM/Flash Control - RW */ #define E1000_EERD 0x00014 /* EEPROM Read - RW */ @@ -934,6 +975,9 @@ e1000_bus_width bus_width; e1000_bus_type bus_type; struct e1000_eeprom_info eeprom; + e1000_ms_type master_slave; + e1000_ms_type original_master_slave; + e1000_ffe_config ffe_config_state; uint32_t io_base; uint32_t phy_id; uint32_t phy_revision; @@ -950,6 +994,8 @@ uint32_t ledctl_default; uint32_t ledctl_mode1; uint32_t ledctl_mode2; + uint16_t phy_spd_default; + uint16_t dsp_reset_counter; uint16_t autoneg_advertised; uint16_t pci_cmd_word; uint16_t fc_high_water; @@ -974,10 +1020,13 @@ uint8_t perm_mac_addr[NODE_ADDRESS_SIZE]; boolean_t disable_polarity_correction; boolean_t speed_downgraded; + e1000_dsp_config dsp_config_state; boolean_t get_link_status; boolean_t tbi_compatibility_en; boolean_t tbi_compatibility_on; + boolean_t phy_reset_disable; boolean_t fc_send_xon; + boolean_t fc_strict_ieee; boolean_t report_tx_early; boolean_t adaptive_ifs; boolean_t ifs_params_forced; @@ -1059,7 +1108,7 @@ #define E1000_EECD_PRES 0x00000100 /* EEPROM Present */ #define E1000_EECD_SIZE 0x00000200 /* EEPROM Size (0=64 word 1=256 word) */ #define E1000_EECD_ADDR_BITS 0x00000400 /* EEPROM Addressing bits based on type - * (0-small, 1-large) */ + * (0-small, 1-large) */ #define E1000_EECD_TYPE 0x00002000 /* EEPROM Type (1-SPI, 0-Microwire) */ #ifndef E1000_EEPROM_GRANT_ATTEMPTS #define E1000_EEPROM_GRANT_ATTEMPTS 1000 /* EEPROM # attempts to gain grant */ @@ -1121,22 +1170,22 @@ #define E1000_MDIC_ERROR 0x40000000 /* LED Control */ -#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F -#define E1000_LEDCTL_LED0_MODE_SHIFT 0 -#define E1000_LEDCTL_LED0_IVRT 0x00000040 -#define E1000_LEDCTL_LED0_BLINK 0x00000080 -#define E1000_LEDCTL_LED1_MODE_MASK 0x00000F00 -#define E1000_LEDCTL_LED1_MODE_SHIFT 8 -#define E1000_LEDCTL_LED1_IVRT 0x00004000 -#define E1000_LEDCTL_LED1_BLINK 0x00008000 -#define E1000_LEDCTL_LED2_MODE_MASK 0x000F0000 -#define E1000_LEDCTL_LED2_MODE_SHIFT 16 -#define E1000_LEDCTL_LED2_IVRT 0x00400000 -#define E1000_LEDCTL_LED2_BLINK 0x00800000 -#define E1000_LEDCTL_LED3_MODE_MASK 0x0F000000 -#define E1000_LEDCTL_LED3_MODE_SHIFT 24 -#define E1000_LEDCTL_LED3_IVRT 0x40000000 -#define E1000_LEDCTL_LED3_BLINK 0x80000000 +#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F +#define E1000_LEDCTL_LED0_MODE_SHIFT 0 +#define E1000_LEDCTL_LED0_IVRT 0x00000040 +#define E1000_LEDCTL_LED0_BLINK 0x00000080 +#define E1000_LEDCTL_LED1_MODE_MASK 0x00000F00 +#define E1000_LEDCTL_LED1_MODE_SHIFT 8 +#define E1000_LEDCTL_LED1_IVRT 0x00004000 +#define E1000_LEDCTL_LED1_BLINK 0x00008000 +#define E1000_LEDCTL_LED2_MODE_MASK 0x000F0000 +#define E1000_LEDCTL_LED2_MODE_SHIFT 16 +#define E1000_LEDCTL_LED2_IVRT 0x00400000 +#define E1000_LEDCTL_LED2_BLINK 0x00800000 +#define E1000_LEDCTL_LED3_MODE_MASK 0x0F000000 +#define E1000_LEDCTL_LED3_MODE_SHIFT 24 +#define E1000_LEDCTL_LED3_IVRT 0x40000000 +#define E1000_LEDCTL_LED3_BLINK 0x80000000 #define E1000_LEDCTL_MODE_LINK_10_1000 0x0 #define E1000_LEDCTL_MODE_LINK_100_1000 0x1 @@ -1159,109 +1208,109 @@ #define E1000_RAH_AV 0x80000000 /* Receive descriptor valid */ /* Interrupt Cause Read */ -#define E1000_ICR_TXDW 0x00000001 /* Transmit desc written back */ -#define E1000_ICR_TXQE 0x00000002 /* Transmit Queue empty */ -#define E1000_ICR_LSC 0x00000004 /* Link Status Change */ -#define E1000_ICR_RXSEQ 0x00000008 /* rx sequence error */ -#define E1000_ICR_RXDMT0 0x00000010 /* rx desc min. threshold (0) */ -#define E1000_ICR_RXO 0x00000040 /* rx overrun */ -#define E1000_ICR_RXT0 0x00000080 /* rx timer intr (ring 0) */ -#define E1000_ICR_MDAC 0x00000200 /* MDIO access complete */ -#define E1000_ICR_RXCFG 0x00000400 /* RX /c/ ordered set */ -#define E1000_ICR_GPI_EN0 0x00000800 /* GP Int 0 */ -#define E1000_ICR_GPI_EN1 0x00001000 /* GP Int 1 */ -#define E1000_ICR_GPI_EN2 0x00002000 /* GP Int 2 */ -#define E1000_ICR_GPI_EN3 0x00004000 /* GP Int 3 */ -#define E1000_ICR_TXD_LOW 0x00008000 -#define E1000_ICR_SRPD 0x00010000 +#define E1000_ICR_TXDW 0x00000001 /* Transmit desc written back */ +#define E1000_ICR_TXQE 0x00000002 /* Transmit Queue empty */ +#define E1000_ICR_LSC 0x00000004 /* Link Status Change */ +#define E1000_ICR_RXSEQ 0x00000008 /* rx sequence error */ +#define E1000_ICR_RXDMT0 0x00000010 /* rx desc min. threshold (0) */ +#define E1000_ICR_RXO 0x00000040 /* rx overrun */ +#define E1000_ICR_RXT0 0x00000080 /* rx timer intr (ring 0) */ +#define E1000_ICR_MDAC 0x00000200 /* MDIO access complete */ +#define E1000_ICR_RXCFG 0x00000400 /* RX /c/ ordered set */ +#define E1000_ICR_GPI_EN0 0x00000800 /* GP Int 0 */ +#define E1000_ICR_GPI_EN1 0x00001000 /* GP Int 1 */ +#define E1000_ICR_GPI_EN2 0x00002000 /* GP Int 2 */ +#define E1000_ICR_GPI_EN3 0x00004000 /* GP Int 3 */ +#define E1000_ICR_TXD_LOW 0x00008000 +#define E1000_ICR_SRPD 0x00010000 /* Interrupt Cause Set */ -#define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ -#define E1000_ICS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ -#define E1000_ICS_LSC E1000_ICR_LSC /* Link Status Change */ -#define E1000_ICS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ -#define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ -#define E1000_ICS_RXO E1000_ICR_RXO /* rx overrun */ -#define E1000_ICS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ -#define E1000_ICS_MDAC E1000_ICR_MDAC /* MDIO access complete */ -#define E1000_ICS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ -#define E1000_ICS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ -#define E1000_ICS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ -#define E1000_ICS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ -#define E1000_ICS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ -#define E1000_ICS_TXD_LOW E1000_ICR_TXD_LOW -#define E1000_ICS_SRPD E1000_ICR_SRPD +#define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ +#define E1000_ICS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ +#define E1000_ICS_LSC E1000_ICR_LSC /* Link Status Change */ +#define E1000_ICS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ +#define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ +#define E1000_ICS_RXO E1000_ICR_RXO /* rx overrun */ +#define E1000_ICS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ +#define E1000_ICS_MDAC E1000_ICR_MDAC /* MDIO access complete */ +#define E1000_ICS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ +#define E1000_ICS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ +#define E1000_ICS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ +#define E1000_ICS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ +#define E1000_ICS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ +#define E1000_ICS_TXD_LOW E1000_ICR_TXD_LOW +#define E1000_ICS_SRPD E1000_ICR_SRPD /* Interrupt Mask Set */ -#define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ -#define E1000_IMS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ -#define E1000_IMS_LSC E1000_ICR_LSC /* Link Status Change */ -#define E1000_IMS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ -#define E1000_IMS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ -#define E1000_IMS_RXO E1000_ICR_RXO /* rx overrun */ -#define E1000_IMS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ -#define E1000_IMS_MDAC E1000_ICR_MDAC /* MDIO access complete */ -#define E1000_IMS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ -#define E1000_IMS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ -#define E1000_IMS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ -#define E1000_IMS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ -#define E1000_IMS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ -#define E1000_IMS_TXD_LOW E1000_ICR_TXD_LOW -#define E1000_IMS_SRPD E1000_ICR_SRPD +#define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ +#define E1000_IMS_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ +#define E1000_IMS_LSC E1000_ICR_LSC /* Link Status Change */ +#define E1000_IMS_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ +#define E1000_IMS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ +#define E1000_IMS_RXO E1000_ICR_RXO /* rx overrun */ +#define E1000_IMS_RXT0 E1000_ICR_RXT0 /* rx timer intr */ +#define E1000_IMS_MDAC E1000_ICR_MDAC /* MDIO access complete */ +#define E1000_IMS_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ +#define E1000_IMS_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ +#define E1000_IMS_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ +#define E1000_IMS_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ +#define E1000_IMS_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ +#define E1000_IMS_TXD_LOW E1000_ICR_TXD_LOW +#define E1000_IMS_SRPD E1000_ICR_SRPD /* Interrupt Mask Clear */ -#define E1000_IMC_TXDW E1000_ICR_TXDW /* Transmit desc written back */ -#define E1000_IMC_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ -#define E1000_IMC_LSC E1000_ICR_LSC /* Link Status Change */ -#define E1000_IMC_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ -#define E1000_IMC_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ -#define E1000_IMC_RXO E1000_ICR_RXO /* rx overrun */ -#define E1000_IMC_RXT0 E1000_ICR_RXT0 /* rx timer intr */ -#define E1000_IMC_MDAC E1000_ICR_MDAC /* MDIO access complete */ -#define E1000_IMC_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ -#define E1000_IMC_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ -#define E1000_IMC_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ -#define E1000_IMC_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ -#define E1000_IMC_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ -#define E1000_IMC_TXD_LOW E1000_ICR_TXD_LOW -#define E1000_IMC_SRPD E1000_ICR_SRPD +#define E1000_IMC_TXDW E1000_ICR_TXDW /* Transmit desc written back */ +#define E1000_IMC_TXQE E1000_ICR_TXQE /* Transmit Queue empty */ +#define E1000_IMC_LSC E1000_ICR_LSC /* Link Status Change */ +#define E1000_IMC_RXSEQ E1000_ICR_RXSEQ /* rx sequence error */ +#define E1000_IMC_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ +#define E1000_IMC_RXO E1000_ICR_RXO /* rx overrun */ +#define E1000_IMC_RXT0 E1000_ICR_RXT0 /* rx timer intr */ +#define E1000_IMC_MDAC E1000_ICR_MDAC /* MDIO access complete */ +#define E1000_IMC_RXCFG E1000_ICR_RXCFG /* RX /c/ ordered set */ +#define E1000_IMC_GPI_EN0 E1000_ICR_GPI_EN0 /* GP Int 0 */ +#define E1000_IMC_GPI_EN1 E1000_ICR_GPI_EN1 /* GP Int 1 */ +#define E1000_IMC_GPI_EN2 E1000_ICR_GPI_EN2 /* GP Int 2 */ +#define E1000_IMC_GPI_EN3 E1000_ICR_GPI_EN3 /* GP Int 3 */ +#define E1000_IMC_TXD_LOW E1000_ICR_TXD_LOW +#define E1000_IMC_SRPD E1000_ICR_SRPD /* Receive Control */ -#define E1000_RCTL_RST 0x00000001 /* Software reset */ -#define E1000_RCTL_EN 0x00000002 /* enable */ -#define E1000_RCTL_SBP 0x00000004 /* store bad packet */ -#define E1000_RCTL_UPE 0x00000008 /* unicast promiscuous enable */ -#define E1000_RCTL_MPE 0x00000010 /* multicast promiscuous enab */ -#define E1000_RCTL_LPE 0x00000020 /* long packet enable */ -#define E1000_RCTL_LBM_NO 0x00000000 /* no loopback mode */ -#define E1000_RCTL_LBM_MAC 0x00000040 /* MAC loopback mode */ -#define E1000_RCTL_LBM_SLP 0x00000080 /* serial link loopback mode */ -#define E1000_RCTL_LBM_TCVR 0x000000C0 /* tcvr loopback mode */ -#define E1000_RCTL_RDMTS_HALF 0x00000000 /* rx desc min threshold size */ -#define E1000_RCTL_RDMTS_QUAT 0x00000100 /* rx desc min threshold size */ -#define E1000_RCTL_RDMTS_EIGTH 0x00000200 /* rx desc min threshold size */ -#define E1000_RCTL_MO_SHIFT 12 /* multicast offset shift */ -#define E1000_RCTL_MO_0 0x00000000 /* multicast offset 11:0 */ -#define E1000_RCTL_MO_1 0x00001000 /* multicast offset 12:1 */ -#define E1000_RCTL_MO_2 0x00002000 /* multicast offset 13:2 */ -#define E1000_RCTL_MO_3 0x00003000 /* multicast offset 15:4 */ -#define E1000_RCTL_MDR 0x00004000 /* multicast desc ring 0 */ -#define E1000_RCTL_BAM 0x00008000 /* broadcast enable */ +#define E1000_RCTL_RST 0x00000001 /* Software reset */ +#define E1000_RCTL_EN 0x00000002 /* enable */ +#define E1000_RCTL_SBP 0x00000004 /* store bad packet */ +#define E1000_RCTL_UPE 0x00000008 /* unicast promiscuous enable */ +#define E1000_RCTL_MPE 0x00000010 /* multicast promiscuous enab */ +#define E1000_RCTL_LPE 0x00000020 /* long packet enable */ +#define E1000_RCTL_LBM_NO 0x00000000 /* no loopback mode */ +#define E1000_RCTL_LBM_MAC 0x00000040 /* MAC loopback mode */ +#define E1000_RCTL_LBM_SLP 0x00000080 /* serial link loopback mode */ +#define E1000_RCTL_LBM_TCVR 0x000000C0 /* tcvr loopback mode */ +#define E1000_RCTL_RDMTS_HALF 0x00000000 /* rx desc min threshold size */ +#define E1000_RCTL_RDMTS_QUAT 0x00000100 /* rx desc min threshold size */ +#define E1000_RCTL_RDMTS_EIGTH 0x00000200 /* rx desc min threshold size */ +#define E1000_RCTL_MO_SHIFT 12 /* multicast offset shift */ +#define E1000_RCTL_MO_0 0x00000000 /* multicast offset 11:0 */ +#define E1000_RCTL_MO_1 0x00001000 /* multicast offset 12:1 */ +#define E1000_RCTL_MO_2 0x00002000 /* multicast offset 13:2 */ +#define E1000_RCTL_MO_3 0x00003000 /* multicast offset 15:4 */ +#define E1000_RCTL_MDR 0x00004000 /* multicast desc ring 0 */ +#define E1000_RCTL_BAM 0x00008000 /* broadcast enable */ /* these buffer sizes are valid if E1000_RCTL_BSEX is 0 */ -#define E1000_RCTL_SZ_2048 0x00000000 /* rx buffer size 2048 */ -#define E1000_RCTL_SZ_1024 0x00010000 /* rx buffer size 1024 */ -#define E1000_RCTL_SZ_512 0x00020000 /* rx buffer size 512 */ -#define E1000_RCTL_SZ_256 0x00030000 /* rx buffer size 256 */ +#define E1000_RCTL_SZ_2048 0x00000000 /* rx buffer size 2048 */ +#define E1000_RCTL_SZ_1024 0x00010000 /* rx buffer size 1024 */ +#define E1000_RCTL_SZ_512 0x00020000 /* rx buffer size 512 */ +#define E1000_RCTL_SZ_256 0x00030000 /* rx buffer size 256 */ /* these buffer sizes are valid if E1000_RCTL_BSEX is 1 */ -#define E1000_RCTL_SZ_16384 0x00010000 /* rx buffer size 16384 */ -#define E1000_RCTL_SZ_8192 0x00020000 /* rx buffer size 8192 */ -#define E1000_RCTL_SZ_4096 0x00030000 /* rx buffer size 4096 */ -#define E1000_RCTL_VFE 0x00040000 /* vlan filter enable */ -#define E1000_RCTL_CFIEN 0x00080000 /* canonical form enable */ -#define E1000_RCTL_CFI 0x00100000 /* canonical form indicator */ -#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_SZ_16384 0x00010000 /* rx buffer size 16384 */ +#define E1000_RCTL_SZ_8192 0x00020000 /* rx buffer size 8192 */ +#define E1000_RCTL_SZ_4096 0x00030000 /* rx buffer size 4096 */ +#define E1000_RCTL_VFE 0x00040000 /* vlan filter enable */ +#define E1000_RCTL_CFIEN 0x00080000 /* canonical form enable */ +#define E1000_RCTL_CFI 0x00100000 /* canonical form indicator */ +#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 */ /* Receive Descriptor */ #define E1000_RDT_DELAY 0x0000ffff /* Delay timer (1=1024us) */ @@ -1426,15 +1475,17 @@ #define EEPROM_SIZE_128B 0x0000 #define EEPROM_SIZE_MASK 0x1C00 - /* EEPROM Word Offsets */ -#define EEPROM_COMPAT 0x0003 -#define EEPROM_ID_LED_SETTINGS 0x0004 -#define EEPROM_INIT_CONTROL1_REG 0x000A -#define EEPROM_INIT_CONTROL2_REG 0x000F -#define EEPROM_CFG 0x0012 -#define EEPROM_FLASH_VERSION 0x0032 -#define EEPROM_CHECKSUM_REG 0x003F +#define EEPROM_COMPAT 0x0003 +#define EEPROM_ID_LED_SETTINGS 0x0004 +#define EEPROM_SERDES_AMPLITUDE 0x0006 /* For SERDES output amplitude adjustment. */ +#define EEPROM_INIT_CONTROL1_REG 0x000A +#define EEPROM_INIT_CONTROL2_REG 0x000F +#define EEPROM_INIT_CONTROL3_PORT_B 0x0014 +#define EEPROM_INIT_CONTROL3_PORT_A 0x0024 +#define EEPROM_CFG 0x0012 +#define EEPROM_FLASH_VERSION 0x0032 +#define EEPROM_CHECKSUM_REG 0x003F /* Word definitions for ID LED Settings */ #define ID_LED_RESERVED_0000 0x0000 @@ -1458,6 +1509,9 @@ #define IGP_LED3_MODE 0x07000000 +/* Mask bits for SERDES amplitude adjustment in Word 6 of the EEPROM */ +#define EEPROM_SERDES_AMPLITUDE_MASK 0x000F + /* Mask bits for fields in Word 0x0a of the EEPROM */ #define EEPROM_WORD0A_ILOS 0x0010 #define EEPROM_WORD0A_SWDPIO 0x01E0 @@ -1479,6 +1533,8 @@ #define EEPROM_NODE_ADDRESS_BYTE_0 0 #define EEPROM_PBA_BYTE_1 8 +#define EEPROM_RESERVED_WORD 0xFFFF + /* EEPROM Map Sizes (Byte Counts) */ #define PBA_SIZE 4 @@ -1490,7 +1546,7 @@ #define E1000_HDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE #define E1000_COLD_SHIFT 12 -/* The number of Transmit and Receive Descriptors must be a multiple of 8 */ +/* Number of Transmit and Receive Descriptors must be a multiple of 8 */ #define REQ_TX_DESCRIPTOR_MULTIPLE 8 #define REQ_RX_DESCRIPTOR_MULTIPLE 8 @@ -1557,35 +1613,30 @@ #define PCIX_STATUS_HI_MMRBC_2K 0x2 -/* The number of bits that we need to shift right to move the "pause" - * bits from the EEPROM (bits 13:12) to the "pause" (bits 8:7) field - * in the TXCW register +/* Number of bits required to shift right the "pause" bits from the + * EEPROM (bits 13:12) to the "pause" (bits 8:7) field in the TXCW register. */ #define PAUSE_SHIFT 5 -/* The number of bits that we need to shift left to move the "SWDPIO" - * bits from the EEPROM (bits 8:5) to the "SWDPIO" (bits 25:22) field - * in the CTRL register +/* Number of bits required to shift left the "SWDPIO" bits from the + * EEPROM (bits 8:5) to the "SWDPIO" (bits 25:22) field in the CTRL register. */ #define SWDPIO_SHIFT 17 -/* The number of bits that we need to shift left to move the "SWDPIO_EXT" - * bits from the EEPROM word F (bits 7:4) to the bits 11:8 of The - * Extended CTRL register. - * in the CTRL register +/* Number of bits required to shift left the "SWDPIO_EXT" bits from the + * EEPROM word F (bits 7:4) to the bits 11:8 of The Extended CTRL register. */ #define SWDPIO__EXT_SHIFT 4 -/* The number of bits that we need to shift left to move the "ILOS" - * bit from the EEPROM (bit 4) to the "ILOS" (bit 7) field - * in the CTRL register +/* Number of bits required to shift left the "ILOS" bit from the EEPROM + * (bit 4) to the "ILOS" (bit 7) field in the CTRL register. */ #define ILOS_SHIFT 3 #define RECEIVE_BUFFER_ALIGN_SIZE (256) -/* The number of milliseconds we wait for auto-negotiation to complete */ +/* Number of milliseconds we wait for auto-negotiation to complete */ #define LINK_UP_TIMEOUT 500 #define E1000_TX_BUFFER_SIZE ((uint32_t)1514) @@ -1668,7 +1719,16 @@ #define M88E1000_EXT_PHY_SPEC_CTRL 0x14 /* Extended PHY Specific Control */ #define M88E1000_RX_ERR_CNTR 0x15 /* Receive Error Counter */ +#define M88E1000_PHY_EXT_CTRL 0x1A /* PHY extend control register */ +#define M88E1000_PHY_PAGE_SELECT 0x1D /* Reg 29 for page number setting */ +#define M88E1000_PHY_GEN_CONTROL 0x1E /* Its meaning depends on reg 29 */ +#define M88E1000_PHY_VCO_REG_BIT8 0x100 /* Bits 8 & 11 are adjusted for */ +#define M88E1000_PHY_VCO_REG_BIT11 0x800 /* improved BER performance */ + #define IGP01E1000_IEEE_REGS_PAGE 0x0000 +#define IGP01E1000_IEEE_RESTART_AUTONEG 0x3300 +#define IGP01E1000_IEEE_FORCE_GIGA 0x0140 + /* IGP01E1000 Specific Registers */ #define IGP01E1000_PHY_PORT_CONFIG 0x10 /* PHY Specific Port Config Register */ #define IGP01E1000_PHY_PORT_STATUS 0x11 /* PHY Specific Status Register */ @@ -1684,17 +1744,35 @@ #define IGP01E1000_PHY_AGC_C 0x1472 #define IGP01E1000_PHY_AGC_D 0x1872 -/* Number of AGC registers */ -#define IGP01E1000_PHY_AGC_NUM 4 +/* IGP01E1000 DSP Reset Register */ +#define IGP01E1000_PHY_DSP_RESET 0x1F33 +#define IGP01E1000_PHY_DSP_SET 0x1F71 +#define IGP01E1000_PHY_DSP_FFE 0x1F35 + +#define IGP01E1000_PHY_CHANNEL_NUM 4 +#define IGP01E1000_PHY_AGC_PARAM_A 0x1171 +#define IGP01E1000_PHY_AGC_PARAM_B 0x1271 +#define IGP01E1000_PHY_AGC_PARAM_C 0x1471 +#define IGP01E1000_PHY_AGC_PARAM_D 0x1871 + +#define IGP01E1000_PHY_EDAC_MU_INDEX 0xC000 +#define IGP01E1000_PHY_EDAC_SIGN_EXT_9_BITS 0x8000 + +#define IGP01E1000_PHY_ANALOG_TX_STATE 0x2890 +#define IGP01E1000_PHY_ANALOG_CLASS_A 0x2000 +#define IGP01E1000_PHY_FORCE_ANALOG_ENABLE 0x0004 +#define IGP01E1000_PHY_DSP_FFE_CM_CP 0x0069 +#define IGP01E1000_PHY_DSP_FFE_DEFAULT 0x002A /* IGP01E1000 PCS Initialization register - stores the polarity status when * speed = 1000 Mbps. */ #define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 +#define IGP01E1000_PHY_PCS_CTRL_REG 0x00B5 #define IGP01E1000_ANALOG_REGS_PAGE 0x20C0 #define MAX_PHY_REG_ADDRESS 0x1F /* 5 bit address bus (0-0x1F) */ - +#define MAX_PHY_MULTI_PAGE_REG 0xF /*Registers that are equal on all pages*/ /* PHY Control Register */ #define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */ #define MII_CR_COLL_TEST_ENABLE 0x0080 /* Collision test enable */ @@ -1808,8 +1886,11 @@ #define SR_1000T_LOCAL_RX_STATUS 0x2000 /* Local receiver OK */ #define SR_1000T_MS_CONFIG_RES 0x4000 /* 1=Local TX is Master, 0=Slave */ #define SR_1000T_MS_CONFIG_FAULT 0x8000 /* Master/Slave config fault */ -#define SR_1000T_REMOTE_RX_STATUS_SHIFT 12 -#define SR_1000T_LOCAL_RX_STATUS_SHIFT 13 +#define SR_1000T_REMOTE_RX_STATUS_SHIFT 12 +#define SR_1000T_LOCAL_RX_STATUS_SHIFT 13 +#define SR_1000T_PHY_EXCESSIVE_IDLE_ERR_COUNT 5 +#define FFE_IDLE_ERR_COUNT_TIMEOUT_20 20 +#define FFE_IDLE_ERR_COUNT_TIMEOUT_100 100 /* Extended Status Register */ #define IEEE_ESR_1000T_HD_CAPS 0x1000 /* 1000T HD capable */ @@ -1901,7 +1982,6 @@ #define M88E1000_EPSCR_TX_CLK_25 0x0070 /* 25 MHz TX_CLK */ #define M88E1000_EPSCR_TX_CLK_0 0x0000 /* NO TX_CLK */ - /* IGP01E1000 Specific Port Config Register - R/W */ #define IGP01E1000_PSCFR_AUTO_MDIX_PAR_DETECT 0x0010 #define IGP01E1000_PSCFR_PRE_EN 0x0020 @@ -1952,6 +2032,11 @@ #define IGP01E1000_MSE_CHANNEL_B 0x0F00 #define IGP01E1000_MSE_CHANNEL_A 0xF000 +/* IGP01E1000 DSP reset macros */ +#define DSP_RESET_ENABLE 0x0 +#define DSP_RESET_DISABLE 0x2 +#define E1000_MAX_DSP_RESETS 10 + /* IGP01E1000 AGC Registers */ #define IGP01E1000_AGC_LENGTH_SHIFT 7 /* Coarse - 13:11, Fine - 10:7 */ @@ -1962,18 +2047,6 @@ /* The precision of the length is +/- 10 meters */ #define IGP01E1000_AGC_RANGE 10 -/* IGP cable length table */ -static const -uint16_t e1000_igp_cable_length_table[IGP01E1000_AGC_LENGTH_TABLE_SIZE] = - { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 25, 25, 25, - 25, 25, 25, 25, 30, 30, 30, 30, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 50, 50, 50, 50, 50, 50, 50, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 70, 70, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, 100, 100, 100, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120}; - /* IGP01E1000 PCS Initialization register */ /* bits 3:6 in the PCS registers stores the channels polarity */ #define IGP01E1000_PHY_POLARITY_MASK 0x0078 @@ -1982,11 +2055,12 @@ #define IGP01E1000_GMII_FLEX_SPD 0x10 /* Enable flexible speed * on Link-Up */ #define IGP01E1000_GMII_SPD 0x20 /* Enable SPD */ + /* IGP01E1000 Analog Register */ -#define IGP01E1000_ANALOG_SPARE_FUSE_STATUS 0x0011 -#define IGP01E1000_ANALOG_FUSE_STATUS 0x0010 -#define IGP01E1000_ANALOG_FUSE_CONTROL 0x001C -#define IGP01E1000_ANALOG_FUSE_BYPASS 0x001E +#define IGP01E1000_ANALOG_SPARE_FUSE_STATUS 0x20D1 +#define IGP01E1000_ANALOG_FUSE_STATUS 0x20D0 +#define IGP01E1000_ANALOG_FUSE_CONTROL 0x20DC +#define IGP01E1000_ANALOG_FUSE_BYPASS 0x20DE #define IGP01E1000_ANALOG_FUSE_POLY_MASK 0xF000 #define IGP01E1000_ANALOG_FUSE_FINE_MASK 0x0F80 @@ -2032,5 +2106,8 @@ #define ADVERTISE_1000_HALF 0x0010 #define ADVERTISE_1000_FULL 0x0020 #define AUTONEG_ADVERTISE_SPEED_DEFAULT 0x002F /* Everything but 1000-Half */ +#define AUTONEG_ADVERTISE_10_100_ALL 0x000F /* All 10/100 speeds*/ +#define AUTONEG_ADVERTISE_10_ALL 0x0003 /* 10Mbps Full & Half speeds*/ + #endif /* _E1000_HW_H_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/e1000/e1000_main.c linux-2.4.23-pre8/drivers/net/e1000/e1000_main.c --- linux-2.4.22/drivers/net/e1000/e1000_main.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/e1000/e1000_main.c 2003-10-22 22:48:39.000000000 +0000 @@ -30,6 +30,22 @@ /* Change Log * + * 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 * o Bug fix: request_irq() failure resulted in freeing resources twice! * [Don Fry (brazilnut@us.ibm.com)] @@ -39,18 +55,11 @@ * o Cleanup: s/int/unsigned int/ for descriptor ring indexes. * * 5.1.11 5/6/03 - * o Feature: Added support for 82546EB (Quad-port) hardware. - * o Feature: Added support for Diagnostics through Ethtool. - * o Cleanup: Removed /proc support. - * o Cleanup: Removed proprietary IDIAG interface. - * o Bug fix: TSO bug fixes. - * - * 5.0.42 3/5/03 */ char e1000_driver_name[] = "e1000"; char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; -char e1000_driver_version[] = "5.1.13-k1"; +char e1000_driver_version[] = "5.2.16-k2"; char e1000_copyright[] = "Copyright (c) 1999-2003 Intel Corporation."; /* e1000_pci_tbl - PCI Device ID Table @@ -61,7 +70,7 @@ * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, * Class, Class Mask, private data (not used) } */ -static struct pci_device_id e1000_pci_tbl[] __devinitdata = { +static struct pci_device_id e1000_pci_tbl[] = { {0x8086, 0x1000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, @@ -71,15 +80,28 @@ {0x8086, 0x100D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x100E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x100F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {0x8086, 0x1011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {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}, - {0x8086, 0x101E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {0x8086, 0x101D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {0x8086, 0x1013, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1018, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x8086, 0x1019, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x101D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x101E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1026, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1027, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1028, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1075, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1076, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1077, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1078, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x1079, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x107A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, + {0x8086, 0x107B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, /* required last entry */ {0,} }; @@ -120,7 +142,7 @@ 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 void e1000_intr(int irq, void *data, struct pt_regs *regs); +static irqreturn_t e1000_intr(int irq, void *data, struct pt_regs *regs); static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter); #ifdef CONFIG_E1000_NAPI static int e1000_clean(struct net_device *netdev, int *budget); @@ -425,6 +447,11 @@ if(pci_using_dac) netdev->features |= NETIF_F_HIGHDMA; + /* before reading the EEPROM, reset the controller to + * put the device in a known good starting state */ + + e1000_reset_hw(&adapter->hw); + /* make sure the EEPROM is good */ if(e1000_validate_eeprom_checksum(&adapter->hw) < 0) { @@ -475,12 +502,28 @@ * enable the ACPI Magic Packet filter */ - e1000_read_eeprom(&adapter->hw, EEPROM_INIT_CONTROL2_REG,1, &eeprom_data); - if((adapter->hw.mac_type >= e1000_82544) && - (eeprom_data & E1000_EEPROM_APME)) + switch(adapter->hw.mac_type) { + case e1000_82542_rev2_0: + case e1000_82542_rev2_1: + case e1000_82543: + break; + case e1000_82546: + case e1000_82546_rev_3: + if((E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_FUNC_1) + && (adapter->hw.media_type == e1000_media_type_copper)) { + e1000_read_eeprom(&adapter->hw, + EEPROM_INIT_CONTROL3_PORT_B, 1, &eeprom_data); + break; + } + /* Fall Through */ + default: + e1000_read_eeprom(&adapter->hw, + EEPROM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); + break; + } + if(eeprom_data & E1000_EEPROM_APME) adapter->wol |= E1000_WUFC_MAG; - /* reset the hardware with the new settings */ e1000_reset(adapter); @@ -515,7 +558,8 @@ struct e1000_adapter *adapter = netdev->priv; uint32_t manc; - if(adapter->hw.mac_type >= e1000_82540) { + if(adapter->hw.mac_type >= e1000_82540 && + adapter->hw.media_type == e1000_media_type_copper) { manc = E1000_READ_REG(&adapter->hw, MANC); if(manc & E1000_MANC_SMBUS_EN) { manc |= E1000_MANC_ARP_EN; @@ -583,21 +627,13 @@ hw->fc_pause_time = E1000_FC_PAUSE_TIME; hw->fc_send_xon = 1; - if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) + if((hw->mac_type == e1000_82541) || + (hw->mac_type == e1000_82547) || + (hw->mac_type == e1000_82541_rev_2) || + (hw->mac_type == e1000_82547_rev_2)) hw->phy_init_script = 1; - /* Media type - copper or fiber */ - - if(hw->mac_type >= e1000_82543) { - uint32_t status = E1000_READ_REG(hw, STATUS); - - if(status & E1000_STATUS_TBIMODE) - hw->media_type = e1000_media_type_fiber; - else - hw->media_type = e1000_media_type_copper; - } else { - hw->media_type = e1000_media_type_fiber; - } + e1000_set_media_type(hw); if(hw->mac_type < e1000_82543) hw->report_tx_early = 0; @@ -613,6 +649,7 @@ if(hw->media_type == e1000_media_type_copper) { hw->mdix = AUTO_ALL_MODES; hw->disable_polarity_correction = FALSE; + hw->master_slave = E1000_MASTER_SLAVE; } atomic_set(&adapter->irq_sem, 1); @@ -762,7 +799,8 @@ tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT; break; default: - if(adapter->hw.media_type == e1000_media_type_fiber) + if(adapter->hw.media_type == e1000_media_type_fiber || + adapter->hw.media_type == e1000_media_type_internal_serdes) tipg = DEFAULT_82543_TIPG_IPGT_FIBER; else tipg = DEFAULT_82543_TIPG_IPGT_COPPER; @@ -797,6 +835,12 @@ adapter->txd_cmd |= E1000_TXD_CMD_RS; else adapter->txd_cmd |= E1000_TXD_CMD_RPS; + + /* Cache if we're 82544 running in PCI-X because we'll + * need this to apply a workaround later in the send path. */ + if(adapter->hw.mac_type == e1000_82544 && + adapter->hw.bus_type == e1000_bus_type_pcix) + adapter->pcix_82544 = 1; } /** @@ -1488,12 +1532,20 @@ unsigned int first) { struct e1000_desc_ring *tx_ring = &adapter->tx_ring; + struct e1000_tx_desc *tx_desc; struct e1000_buffer *buffer_info; - int len = skb->len; + unsigned int len = skb->len, max_per_txd = E1000_MAX_DATA_PER_TXD; unsigned int offset = 0, size, count = 0, i; #ifdef NETIF_F_TSO - unsigned int tso = skb_shinfo(skb)->tso_size; + unsigned int mss = skb_shinfo(skb)->tso_size; + /* The controller does a simple calculation to + * make sure there is enough room in the FIFO before + * initiating the DMA for each buffer. The calc is: + * 4 = ceil(buffer len/mss). To make sure we don't + * overrun the FIFO, adjust the max buffer len if mss + * drops. */ + if(mss) max_per_txd = min(mss << 2, max_per_txd); #endif unsigned int nr_frags = skb_shinfo(skb)->nr_frags; unsigned int f; @@ -1503,13 +1555,20 @@ while(len) { buffer_info = &tx_ring->buffer_info[i]; - size = min(len, E1000_MAX_DATA_PER_TXD); + size = min(len, max_per_txd); #ifdef NETIF_F_TSO /* Workaround for premature desc write-backs * in TSO mode. Append 4-byte sentinel desc */ - if(tso && !nr_frags && size == len && size > 4) + if(mss && !nr_frags && size == len && size > 8) size -= 4; #endif + /* Workaround for potential 82544 hang in PCI-X. Avoid + * terminating buffers within evenly-aligned dwords. */ + if(adapter->pcix_82544 && + !((unsigned long)(skb->data + offset + size - 1) & 4) && + size > 4) + size -= 4; + buffer_info->length = size; buffer_info->dma = pci_map_single(adapter->pdev, @@ -1529,22 +1588,30 @@ frag = &skb_shinfo(skb)->frags[f]; len = frag->size; - offset = 0; + offset = frag->page_offset; while(len) { buffer_info = &tx_ring->buffer_info[i]; - size = min(len, E1000_MAX_DATA_PER_TXD); + size = min(len, max_per_txd); #ifdef NETIF_F_TSO /* Workaround for premature desc write-backs * in TSO mode. Append 4-byte sentinel desc */ - if(tso && f == (nr_frags-1) && size == len && size > 4) + if(mss && f == (nr_frags-1) && size == len && size > 8) size -= 4; #endif + /* Workaround for potential 82544 hang in PCI-X. + * Avoid terminating buffers within evenly-aligned + * dwords. */ + if(adapter->pcix_82544 && + !((unsigned long)(frag->page+offset+size-1) & 4) && + size > 4) + size -= 4; + buffer_info->length = size; buffer_info->dma = pci_map_page(adapter->pdev, frag->page, - frag->page_offset + offset, + offset, size, PCI_DMA_TODEVICE); buffer_info->time_stamp = jiffies; @@ -1555,6 +1622,46 @@ if(++i == tx_ring->count) i = 0; } } + + if(E1000_DESC_UNUSED(&adapter->tx_ring) < count + 2) { + + /* There aren't enough descriptors available to queue up + * this send (need: count + 1 context desc + 1 desc gap + * to keep tail from touching head), so undo the mapping + * and abort the send. We could have done the check before + * we mapped the skb, but because of all the workarounds + * (above), it's too difficult to predict how many we're + * going to need.*/ + i = adapter->tx_ring.next_to_use; + + if(i == first) { + /* Cleanup after e1000_tx_[csum|tso] scribbling + * on descriptors. */ + tx_desc = E1000_TX_DESC(*tx_ring, first); + tx_desc->buffer_addr = 0; + tx_desc->lower.data = 0; + tx_desc->upper.data = 0; + } + + while(count--) { + buffer_info = &tx_ring->buffer_info[i]; + + if(buffer_info->dma) { + pci_unmap_page(adapter->pdev, + buffer_info->dma, + buffer_info->length, + PCI_DMA_TODEVICE); + buffer_info->dma = 0; + } + + if(++i == tx_ring->count) i = 0; + } + + adapter->tx_ring.next_to_use = first; + + return 0; + } + i = (i == 0) ? tx_ring->count - 1 : i - 1; tx_ring->buffer_info[i].skb = skb; tx_ring->buffer_info[first].next_to_watch = i; @@ -1649,29 +1756,19 @@ return 0; } -/* Tx Descriptors needed, worst case */ -#define TXD_USE_COUNT(S) (((S) >> E1000_MAX_TXD_PWR) + \ - (((S) & (E1000_MAX_DATA_PER_TXD - 1)) ? 1 : 0)) -#define DESC_NEEDED TXD_USE_COUNT(MAX_JUMBO_FRAME_SIZE) + \ - MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE) + 1 - static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) { struct e1000_adapter *adapter = netdev->priv; unsigned int first; unsigned int tx_flags = 0; + int count; if(skb->len <= 0) { dev_kfree_skb_any(skb); return 0; } - if(E1000_DESC_UNUSED(&adapter->tx_ring) < DESC_NEEDED) { - netif_stop_queue(netdev); - return 1; - } - if(adapter->hw.mac_type == e1000_82547) { if(e1000_82547_fifo_workaround(adapter, skb)) { netif_stop_queue(netdev); @@ -1692,7 +1789,12 @@ else if(e1000_tx_csum(adapter, skb)) tx_flags |= E1000_TX_FLAGS_CSUM; - e1000_tx_queue(adapter, e1000_tx_map(adapter, skb, first), tx_flags); + if((count = e1000_tx_map(adapter, skb, first))) + e1000_tx_queue(adapter, count, tx_flags); + else { + netif_stop_queue(netdev); + return 1; + } netdev->trans_start = jiffies; @@ -1965,7 +2067,7 @@ * @pt_regs: CPU registers structure **/ -static void +static irqreturn_t e1000_intr(int irq, void *data, struct pt_regs *regs) { struct net_device *netdev = data; @@ -1976,7 +2078,7 @@ #endif if(!icr) - return; /* Not our interrupt */ + return IRQ_NONE; /* Not our interrupt */ if(icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { adapter->hw.get_link_status = 1; @@ -2000,6 +2102,8 @@ !e1000_clean_tx_irq(adapter)) break; #endif + + return IRQ_HANDLED; } #ifdef CONFIG_E1000_NAPI @@ -2385,7 +2489,7 @@ uint16_t mii_reg; uint16_t spddplx; - if(adapter->hw.media_type == e1000_media_type_fiber) + if(adapter->hw.media_type != e1000_media_type_copper) return -EOPNOTSUPP; switch (cmd) { @@ -2657,7 +2761,7 @@ case SYS_DOWN: case SYS_HALT: case SYS_POWER_OFF: - pci_for_each_dev(pdev) { + while((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev))) { if(pci_dev_driver(pdev) == &e1000_driver) e1000_suspend(pdev, 3); } @@ -2704,7 +2808,8 @@ E1000_WRITE_REG(&adapter->hw, CTRL, ctrl); } - if(adapter->hw.media_type == e1000_media_type_fiber) { + if(adapter->hw.media_type == e1000_media_type_fiber || + adapter->hw.media_type == e1000_media_type_internal_serdes) { /* keep the laser running in D3 */ ctrl_ext = E1000_READ_REG(&adapter->hw, CTRL_EXT); ctrl_ext |= E1000_CTRL_EXT_SDP7_DATA; @@ -2724,7 +2829,8 @@ pci_save_state(pdev, adapter->pci_state); - if(adapter->hw.mac_type >= e1000_82540) { + if(adapter->hw.mac_type >= e1000_82540 && + adapter->hw.media_type == e1000_media_type_copper) { manc = E1000_READ_REG(&adapter->hw, MANC); if(manc & E1000_MANC_SMBUS_EN) { manc |= E1000_MANC_ARP_EN; @@ -2762,7 +2868,8 @@ netif_device_attach(netdev); - if(adapter->hw.mac_type >= e1000_82540) { + if(adapter->hw.mac_type >= e1000_82540 && + adapter->hw.media_type == e1000_media_type_copper) { manc = E1000_READ_REG(&adapter->hw, MANC); manc &= ~(E1000_MANC_ARP_EN); E1000_WRITE_REG(&adapter->hw, MANC, manc); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/e1000/e1000_osdep.h linux-2.4.23-pre8/drivers/net/e1000/e1000_osdep.h --- linux-2.4.22/drivers/net/e1000/e1000_osdep.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/e1000/e1000_osdep.h 2003-10-22 22:48:17.000000000 +0000 @@ -55,10 +55,13 @@ #define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE typedef enum { +#undef FALSE FALSE = 0, +#undef TRUE TRUE = 1 } boolean_t; +#undef ASSERT #define ASSERT(x) if(!(x)) BUG() #define MSGOUT(S, A, B) printk(KERN_DEBUG S "\n", A, B) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/e1000/e1000_param.c linux-2.4.23-pre8/drivers/net/e1000/e1000_param.c --- linux-2.4.22/drivers/net/e1000/e1000_param.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/e1000/e1000_param.c 2003-10-22 22:47:49.000000000 +0000 @@ -140,7 +140,7 @@ * Valid Range: 0, 1 * - 0 - disables all checksum offload * - 1 - enables receive IP/TCP/UDP checksum offload - * on 82543 based NICs + * on 82543 and newer -based NICs * * Default Value: 1 */ @@ -458,6 +458,7 @@ switch(adapter->hw.media_type) { case e1000_media_type_fiber: + case e1000_media_type_internal_serdes: e1000_check_fiber_options(adapter); break; case e1000_media_type_copper: @@ -601,7 +602,7 @@ switch (speed + dplx) { case 0: - adapter->hw.autoneg = 1; + adapter->hw.autoneg = adapter->fc_autoneg = 1; if(Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET) printk(KERN_INFO "Speed and duplex autonegotiation enabled\n"); @@ -609,14 +610,14 @@ case HALF_DUPLEX: printk(KERN_INFO "Half Duplex specified without Speed\n"); printk(KERN_INFO "Using Autonegotiation at Half Duplex only\n"); - adapter->hw.autoneg = 1; + adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | ADVERTISE_100_HALF; break; case FULL_DUPLEX: printk(KERN_INFO "Full Duplex specified without Speed\n"); printk(KERN_INFO "Using Autonegotiation at Full Duplex only\n"); - adapter->hw.autoneg = 1; + adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_10_FULL | ADVERTISE_100_FULL | ADVERTISE_1000_FULL; @@ -624,38 +625,38 @@ case SPEED_10: printk(KERN_INFO "10 Mbps Speed specified without Duplex\n"); printk(KERN_INFO "Using Autonegotiation at 10 Mbps only\n"); - adapter->hw.autoneg = 1; + adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | ADVERTISE_10_FULL; break; case SPEED_10 + HALF_DUPLEX: printk(KERN_INFO "Forcing to 10 Mbps Half Duplex\n"); - adapter->hw.autoneg = 0; + adapter->hw.autoneg = adapter->fc_autoneg = 0; adapter->hw.forced_speed_duplex = e1000_10_half; adapter->hw.autoneg_advertised = 0; break; case SPEED_10 + FULL_DUPLEX: printk(KERN_INFO "Forcing to 10 Mbps Full Duplex\n"); - adapter->hw.autoneg = 0; + adapter->hw.autoneg = adapter->fc_autoneg = 0; adapter->hw.forced_speed_duplex = e1000_10_full; adapter->hw.autoneg_advertised = 0; break; case SPEED_100: printk(KERN_INFO "100 Mbps Speed specified without Duplex\n"); printk(KERN_INFO "Using Autonegotiation at 100 Mbps only\n"); - adapter->hw.autoneg = 1; + adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_100_HALF | ADVERTISE_100_FULL; break; case SPEED_100 + HALF_DUPLEX: printk(KERN_INFO "Forcing to 100 Mbps Half Duplex\n"); - adapter->hw.autoneg = 0; + adapter->hw.autoneg = adapter->fc_autoneg = 0; adapter->hw.forced_speed_duplex = e1000_100_half; adapter->hw.autoneg_advertised = 0; break; case SPEED_100 + FULL_DUPLEX: printk(KERN_INFO "Forcing to 100 Mbps Full Duplex\n"); - adapter->hw.autoneg = 0; + adapter->hw.autoneg = adapter->fc_autoneg = 0; adapter->hw.forced_speed_duplex = e1000_100_full; adapter->hw.autoneg_advertised = 0; break; @@ -663,20 +664,20 @@ printk(KERN_INFO "1000 Mbps Speed specified without Duplex\n"); printk(KERN_INFO "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); - adapter->hw.autoneg = 1; + adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; break; case SPEED_1000 + HALF_DUPLEX: printk(KERN_INFO "Half Duplex is not supported at 1000 Mbps\n"); printk(KERN_INFO "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); - adapter->hw.autoneg = 1; + adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; break; case SPEED_1000 + FULL_DUPLEX: printk(KERN_INFO "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); - adapter->hw.autoneg = 1; + adapter->hw.autoneg = adapter->fc_autoneg = 1; adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; break; default: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/epic100.c linux-2.4.23-pre8/drivers/net/epic100.c --- linux-2.4.22/drivers/net/epic100.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/epic100.c 2003-10-22 22:48:53.000000000 +0000 @@ -69,10 +69,9 @@ */ -#define DRV_NAME "epic100" -#define DRV_VERSION "1.11+LK1.1.14" -#define DRV_RELDATE "Aug 4, 2002" - +#define DRV_NAME "epic100" +#define DRV_VERSION "1.11+LK1.1.14" +#define DRV_RELDATE "Aug 4, 2002" /* The user-configurable values. These may be modified when a driver module is loaded.*/ @@ -243,7 +242,7 @@ }; -static struct pci_device_id epic_pci_tbl[] __devinitdata = { +static struct pci_device_id epic_pci_tbl[] = { { 0x10B8, 0x0005, 0x1092, 0x0AB4, 0, 0, SMSC_83C170_0 }, { 0x10B8, 0x0005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SMSC_83C170 }, { 0x10B8, 0x0006, PCI_ANY_ID, PCI_ANY_ID, @@ -361,8 +360,9 @@ static void epic_init_ring(struct net_device *dev); static int epic_start_xmit(struct sk_buff *skb, struct net_device *dev); static int epic_rx(struct net_device *dev); -static void epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; static int epic_close(struct net_device *dev); static struct net_device_stats *epic_get_stats(struct net_device *dev); static void set_rx_mode(struct net_device *dev); @@ -479,7 +479,7 @@ if (debug > 2) { printk(KERN_DEBUG DRV_NAME "(%s): EEPROM contents\n", - pdev->slot_name); + pci_name(pdev)); for (i = 0; i < 64; i++) printk(" %4.4x%s", read_eeprom(ioaddr, i), i % 16 == 15 ? "\n" : ""); @@ -500,7 +500,7 @@ ep->phys[phy_idx++] = phy; printk(KERN_INFO DRV_NAME "(%s): MII transceiver #%d control " "%4.4x status %4.4x.\n", - pdev->slot_name, phy, mdio_read(dev, phy, 0), mii_status); + pci_name(pdev), phy, mdio_read(dev, phy, 0), mii_status); } } ep->mii_phy_cnt = phy_idx; @@ -509,10 +509,10 @@ ep->mii.advertising = mdio_read(dev, phy, MII_ADVERTISE); printk(KERN_INFO DRV_NAME "(%s): Autonegotiation advertising %4.4x link " "partner %4.4x.\n", - pdev->slot_name, ep->mii.advertising, mdio_read(dev, phy, 5)); + pci_name(pdev), ep->mii.advertising, mdio_read(dev, phy, 5)); } else if ( ! (ep->chip_flags & NO_MII)) { printk(KERN_WARNING DRV_NAME "(%s): ***WARNING***: No MII transceiver found!\n", - pdev->slot_name); + pci_name(pdev)); /* Use the known PHY address of the EPII. */ ep->phys[0] = 3; } @@ -528,7 +528,7 @@ if (duplex) { ep->mii.force_media = ep->mii.full_duplex = 1; printk(KERN_INFO DRV_NAME "(%s): Forced full duplex operation requested.\n", - pdev->slot_name); + pci_name(pdev)); } dev->if_port = ep->default_port = option; @@ -539,6 +539,7 @@ dev->get_stats = &epic_get_stats; dev->set_multicast_list = &set_rx_mode; dev->do_ioctl = &netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; dev->watchdog_timeo = TX_TIMEOUT; dev->tx_timeout = &epic_tx_timeout; @@ -974,12 +975,11 @@ struct epic_private *ep = dev->priv; int entry, free_count; u32 ctrl_word; - long flags; + unsigned long flags; - if(skb->len < ETH_ZLEN) - { + if (skb->len < ETH_ZLEN) { skb = skb_padto(skb, ETH_ZLEN); - if(skb == NULL) + if (skb == NULL) return 0; } @@ -1030,12 +1030,13 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = dev_instance; struct epic_private *ep = dev->priv; long ioaddr = dev->base_addr; int status, boguscnt = max_interrupt_work; + unsigned int handled = 0; do { status = inl(ioaddr + INTSTAT); @@ -1049,6 +1050,7 @@ if ((status & IntrSummary) == 0) break; + handled = 1; if (status & (RxDone | RxStarted | RxEarlyWarn | RxOverflow)) epic_rx(dev); @@ -1158,7 +1160,7 @@ printk(KERN_DEBUG "%s: exiting interrupt, intr_status=%#4.4x.\n", dev->name, status); - return; + return IRQ_RETVAL(handled); } static int epic_rx(struct net_device *dev) @@ -1345,9 +1347,11 @@ memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; - i++, mclist = mclist->next) - set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f, - mc_filter); + i++, mclist = mclist->next) { + unsigned int bit_nr = + ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f; + mc_filter[bit_nr >> 3] |= (1 << bit_nr); + } } /* ToDo: perhaps we need to stop the Tx and Rx process here? */ if (memcmp(mc_filter, ep->mc_filter, sizeof(mc_filter))) { @@ -1358,82 +1362,73 @@ return; } -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info) { struct epic_private *np = dev->priv; - u32 ethcmd; - if (copy_from_user (ðcmd, useraddr, sizeof (ethcmd))) - return -EFAULT; + strcpy (info->driver, DRV_NAME); + strcpy (info->version, DRV_VERSION); + strcpy (info->bus_info, pci_name(np->pci_dev)); +} - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - strcpy (info.bus_info, np->pci_dev->slot_name); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } +static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct epic_private *np = dev->priv; + int rc; - /* get settings */ - case ETHTOOL_GSET: { - struct ethtool_cmd ecmd = { ETHTOOL_GSET }; - spin_lock_irq(&np->lock); - mii_ethtool_gset(&np->mii, &ecmd); - spin_unlock_irq(&np->lock); - if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) - return -EFAULT; - return 0; - } - /* set settings */ - case ETHTOOL_SSET: { - int r; - struct ethtool_cmd ecmd; - if (copy_from_user(&ecmd, useraddr, sizeof(ecmd))) - return -EFAULT; - spin_lock_irq(&np->lock); - r = mii_ethtool_sset(&np->mii, &ecmd); - spin_unlock_irq(&np->lock); - return r; - } - /* restart autonegotiation */ - case ETHTOOL_NWAY_RST: { - return mii_nway_restart(&np->mii); - } - /* get link status */ - case ETHTOOL_GLINK: { - struct ethtool_value edata = {ETHTOOL_GLINK}; - edata.data = mii_link_ok(&np->mii); - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } + spin_lock_irq(&np->lock); + rc = mii_ethtool_gset(&np->mii, cmd); + spin_unlock_irq(&np->lock); - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - debug = edata.data; - return 0; - } - default: - break; - } + return rc; +} - return -EOPNOTSUPP; +static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct epic_private *np = dev->priv; + int rc; + + spin_lock_irq(&np->lock); + rc = mii_ethtool_sset(&np->mii, cmd); + spin_unlock_irq(&np->lock); + + return rc; +} + +static int netdev_nway_reset(struct net_device *dev) +{ + struct epic_private *np = dev->priv; + return mii_nway_restart(&np->mii); +} + +static u32 netdev_get_link(struct net_device *dev) +{ + struct epic_private *np = dev->priv; + return mii_link_ok(&np->mii); +} + +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return debug; } +static void netdev_set_msglevel(struct net_device *dev, u32 value) +{ + debug = value; +} + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_settings = netdev_get_settings, + .set_settings = netdev_set_settings, + .nway_reset = netdev_nway_reset, + .get_link = netdev_get_link, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, + .get_sg = ethtool_op_get_sg, + .get_tx_csum = ethtool_op_get_tx_csum, +}; + static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct epic_private *np = dev->priv; @@ -1447,16 +1442,10 @@ outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL); } - /* ethtool commands */ - if (cmd == SIOCETHTOOL) - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - - /* all other ioctls (the SIOC[GS]MIIxxx ioctls) */ - else { - spin_lock_irq(&np->lock); - rc = generic_mii_ioctl(&np->mii, data, cmd, NULL); - spin_unlock_irq(&np->lock); - } + /* all non-ethtool ioctls (the SIOC[GS]MIIxxx ioctls) */ + spin_lock_irq(&np->lock); + rc = generic_mii_ioctl(&np->mii, data, cmd, NULL); + spin_unlock_irq(&np->lock); /* power-down, if interface is down */ if (! netif_running(dev)) { @@ -1517,13 +1506,13 @@ static struct pci_driver epic_driver = { - name: DRV_NAME, - id_table: epic_pci_tbl, - probe: epic_init_one, - remove: __devexit_p(epic_remove_one), + .name = DRV_NAME, + .id_table = epic_pci_tbl, + .probe = epic_init_one, + .remove = __devexit_p(epic_remove_one), #ifdef CONFIG_PM - suspend: epic_suspend, - resume: epic_resume, + .suspend = epic_suspend, + .resume = epic_resume, #endif /* CONFIG_PM */ }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/eth16i.c linux-2.4.23-pre8/drivers/net/eth16i.c --- linux-2.4.22/drivers/net/eth16i.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/eth16i.c 2003-10-22 22:48:20.000000000 +0000 @@ -1057,7 +1057,7 @@ int ioaddr = dev->base_addr; int status = 0; ushort length = skb->len; - unsigned char *buf = skb->data; + unsigned char *buf; unsigned long flags; if(length < ETH_ZLEN) @@ -1067,6 +1067,7 @@ return 0; length = ETH_ZLEN; } + buf = skb->data; netif_stop_queue(dev); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/fealnx.c linux-2.4.23-pre8/drivers/net/fealnx.c --- linux-2.4.22/drivers/net/fealnx.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/fealnx.c 2003-10-22 22:49:12.000000000 +0000 @@ -85,6 +85,7 @@ #include #include #include + #include /* Processor type for cache alignment. */ #include #include @@ -438,11 +439,12 @@ static void tx_timeout(struct net_device *dev); static void init_ring(struct net_device *dev); static int start_tx(struct sk_buff *skb, struct net_device *dev); -static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static int netdev_rx(struct net_device *dev); static void set_rx_mode(struct net_device *dev); static struct net_device_stats *get_stats(struct net_device *dev); static int mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; static int netdev_close(struct net_device *dev); static void reset_rx_descriptors(struct net_device *dev); @@ -666,6 +668,7 @@ dev->get_stats = &get_stats; dev->set_multicast_list = &set_rx_mode; dev->do_ioctl = &mii_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; dev->tx_timeout = tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; @@ -1412,12 +1415,13 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = (struct net_device *) dev_instance; struct netdev_private *np = dev->priv; long ioaddr, boguscnt = max_interrupt_work; unsigned int num_tx = 0; + int handled = 0; writel(0, dev->base_addr + IMR); @@ -1437,6 +1441,8 @@ if (!(intr_status & np->imrvalue)) break; + handled = 1; + // 90/1/16 delete, // // if (intr_status & FBE) @@ -1559,11 +1565,11 @@ writel(np->imrvalue, ioaddr + IMR); - return; + return IRQ_RETVAL(handled); } -/* This routine is logically part of the interrupt handler, but seperated +/* This routine is logically part of the interrupt handler, but separated for clarity and better register allocation. */ static int netdev_rx(struct net_device *dev) { @@ -1739,8 +1745,9 @@ memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next) { - set_bit((ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F, - mc_filter); + unsigned int bit; + bit = (ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F; + mc_filter[bit >> 5] |= (1 << bit); } rx_mode = AB | AM; } @@ -1755,82 +1762,72 @@ writel(np->crvalue, ioaddr + TCRRCR); } -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info) { struct netdev_private *np = dev->priv; - u32 ethcmd; - if (copy_from_user (ðcmd, useraddr, sizeof (ethcmd))) - return -EFAULT; + strcpy (info->driver, DRV_NAME); + strcpy (info->version, DRV_VERSION); + strcpy (info->bus_info, pci_name(np->pci_dev)); +} - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - strcpy (info.bus_info, np->pci_dev->slot_name); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - /* get settings */ - case ETHTOOL_GSET: { - struct ethtool_cmd ecmd = { ETHTOOL_GSET }; - spin_lock_irq(&np->lock); - mii_ethtool_gset(&np->mii, &ecmd); - spin_unlock_irq(&np->lock); - if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) - return -EFAULT; - return 0; - } - /* set settings */ - case ETHTOOL_SSET: { - int r; - struct ethtool_cmd ecmd; - if (copy_from_user(&ecmd, useraddr, sizeof(ecmd))) - return -EFAULT; - spin_lock_irq(&np->lock); - r = mii_ethtool_sset(&np->mii, &ecmd); - spin_unlock_irq(&np->lock); - return r; - } - /* restart autonegotiation */ - case ETHTOOL_NWAY_RST: { - return mii_nway_restart(&np->mii); - } - /* get link status */ - case ETHTOOL_GLINK: { - struct ethtool_value edata = {ETHTOOL_GLINK}; - edata.data = mii_link_ok(&np->mii); - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - debug = edata.data; - return 0; - } - default: - break; - } +static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct netdev_private *np = dev->priv; + int rc; + + spin_lock_irq(&np->lock); + rc = mii_ethtool_gset(&np->mii, cmd); + spin_unlock_irq(&np->lock); - return -EOPNOTSUPP; + return rc; } +static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct netdev_private *np = dev->priv; + int rc; + + spin_lock_irq(&np->lock); + rc = mii_ethtool_sset(&np->mii, cmd); + spin_unlock_irq(&np->lock); + + return rc; +} + +static int netdev_nway_reset(struct net_device *dev) +{ + struct netdev_private *np = dev->priv; + return mii_nway_restart(&np->mii); +} + +static u32 netdev_get_link(struct net_device *dev) +{ + struct netdev_private *np = dev->priv; + return mii_link_ok(&np->mii); +} + +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return debug; +} + +static void netdev_set_msglevel(struct net_device *dev, u32 value) +{ + debug = value; +} + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_settings = netdev_get_settings, + .set_settings = netdev_set_settings, + .nway_reset = netdev_nway_reset, + .get_link = netdev_get_link, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, + .get_sg = ethtool_op_get_sg, + .get_tx_csum = ethtool_op_get_tx_csum, +}; static int mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { @@ -1841,14 +1838,9 @@ if (!netif_running(dev)) return -EINVAL; - if (cmd == SIOCETHTOOL) - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - - else { - spin_lock_irq(&np->lock); - rc = generic_mii_ioctl(&np->mii, data, cmd, NULL); - spin_unlock_irq(&np->lock); - } + spin_lock_irq(&np->lock); + rc = generic_mii_ioctl(&np->mii, data, cmd, NULL); + spin_unlock_irq(&np->lock); return rc; } @@ -1900,7 +1892,7 @@ return 0; } -static struct pci_device_id fealnx_pci_tbl[] __devinitdata = { +static struct pci_device_id fealnx_pci_tbl[] = { {0x1516, 0x0800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0x1516, 0x0803, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, {0x1516, 0x0891, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2}, @@ -1910,10 +1902,10 @@ static struct pci_driver fealnx_driver = { - name: "fealnx", - id_table: fealnx_pci_tbl, - probe: fealnx_init_one, - remove: __devexit_p(fealnx_remove_one), + .name = "fealnx", + .id_table = fealnx_pci_tbl, + .probe = fealnx_init_one, + .remove = __devexit_p(fealnx_remove_one), }; static int __init fealnx_init(void) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/fmv18x.c linux-2.4.23-pre8/drivers/net/fmv18x.c --- linux-2.4.22/drivers/net/fmv18x.c 2003-06-13 14:51:34.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/fmv18x.c 2003-10-22 22:47:39.000000000 +0000 @@ -370,7 +370,7 @@ struct net_local *lp = dev->priv; int ioaddr = dev->base_addr; short length = skb->len; - unsigned char *buf = skb->data; + unsigned char *buf; unsigned long flags; /* Block a transmit from overlapping. */ @@ -389,6 +389,7 @@ return 0; length = ETH_ZLEN; } + buf = skb->data; if (net_debug > 4) printk("%s: Transmitting a packet of length %lu.\n", dev->name, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/ibm_emac/ibm_emac.h linux-2.4.23-pre8/drivers/net/ibm_emac/ibm_emac.h --- linux-2.4.22/drivers/net/ibm_emac/ibm_emac.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/ibm_emac/ibm_emac.h 2003-10-22 22:48:59.000000000 +0000 @@ -85,22 +85,52 @@ #define EMAC_M1_IST 0x01000000 #define EMAC_M1_MF_1000MBPS 0x00800000 /* 0's for 10MBPS */ #define EMAC_M1_MF_100MBPS 0x00400000 +#define EMAC_M1_TR 0x00008000 +#ifdef CONFIG_IBM_EMAC4 +#define EMAC_M1_RFS_16K 0x00280000 /* 000 for 512 byte */ +#define EMAC_M1_RFS_8K 0x00200000 +#define EMAC_M1_RFS_4K 0x00180000 +#define EMAC_M1_RFS_2K 0x00100000 +#define EMAC_M1_RFS_1K 0x00080000 +#define EMAC_M1_TX_FIFO_16K 0x00050000 /* 0's for 512 byte */ +#define EMAC_M1_TX_FIFO_8K 0x00040000 +#define EMAC_M1_TX_FIFO_4K 0x00030000 +#define EMAC_M1_TX_FIFO_2K 0x00020000 +#define EMAC_M1_TX_FIFO_1K 0x00010000 +#define EMAC_M1_TX_MWSW 0x00001000 /* 0 wait for status */ +#define EMAC_M1_JUMBO_ENABLE 0x00000800 /* Upt to 9Kr status */ +#define EMAC_M1_OPB_CLK_66 0x00000010 /* 66Mhz */ +#define EMAC_M1_OPB_CLK_83 0x00000008 /* 83hz */ +#define EMAC_M1_OPB_CLK_100 0x00000018 /* 100Mhz */ +#define EMAC_M1_OPB_CLK_100P 0x00000020 /* 100Mhz+ */ +#else /* CONFIG_IBM_EMAC4 */ #define EMAC_M1_RFS_4K 0x00300000 /* ~4k for 512 byte */ #define EMAC_M1_RFS_2K 0x00200000 #define EMAC_M1_RFS_1K 0x00100000 #define EMAC_M1_TX_FIFO_2K 0x00080000 /* 0's for 512 byte */ #define EMAC_M1_TX_FIFO_1K 0x00040000 #define EMAC_M1_TR0_DEPEND 0x00010000 /* 0'x for single packet */ -#define EMAC_M1_TR0_MULTI 0x00008000 #define EMAC_M1_TR1_DEPEND 0x00004000 #define EMAC_M1_TR1_MULTI 0x00002000 #define EMAC_M1_JUMBO_ENABLE 0x00001000 +#endif /* CONFIG_IBM_EMAC4 */ +#define EMAC_M1_BASE (EMAC_M1_RFS_4K | \ + EMAC_M1_TX_FIFO_2K | \ + EMAC_M1_APP | \ + EMAC_M1_TR) /* Transmit Mode Register 0 */ -#define EMAC_TXM0_GNP0 0x80000000 -#define EMAC_TXM0_GNP1 0x40000000 -#define EMAC_TXM0_GNPD 0x20000000 -#define EMAC_TXM0_FC 0x10000000 +#define EMAC_TMR0_GNP0 0x80000000 +#define EMAC_TMR0_GNP1 0x40000000 +#define EMAC_TMR0_GNPD 0x20000000 +#define EMAC_TMR0_FC 0x10000000 +#define EMAC_TMR0_TFAE_2_32 0x00000001 +#define EMAC_TMR0_TFAE_4_64 0x00000002 +#define EMAC_TMR0_TFAE_8_128 0x00000003 +#define EMAC_TMR0_TFAE_16_256 0x00000004 +#define EMAC_TMR0_TFAE_32_512 0x00000005 +#define EMAC_TMR0_TFAE_64_1024 0x00000006 +#define EMAC_TMR0_TFAE_128_2048 0x00000007 /* Receive Mode Register */ #define EMAC_RMR_SP 0x80000000 @@ -116,6 +146,14 @@ #define EMAC_RMR_MIAE 0x00200000 #define EMAC_RMR_BAE 0x00100000 #define EMAC_RMR_MAE 0x00080000 +#define EMAC_RMR_RFAF_2_32 0x00000001 +#define EMAC_RMR_RFAF_4_64 0x00000002 +#define EMAC_RMR_RFAF_8_128 0x00000003 +#define EMAC_RMR_RFAF_16_256 0x00000004 +#define EMAC_RMR_RFAF_32_512 0x00000005 +#define EMAC_RMR_RFAF_64_1024 0x00000006 +#define EMAC_RMR_RFAF_128_2048 0x00000007 +#define EMAC_RMR_BASE (EMAC_RMR_IAE | EMAC_RMR_BAE) /* Interrupt Status & enable Regs */ #define EMAC_ISR_OVR 0x02000000 @@ -148,11 +186,11 @@ #define EMAC_STACR_CLK_100MHZ 0x00000C00 /* Transmit Request Threshold Register */ -#define EMAC_TRTR_256 0x18000000 /* 0's for 64 Bytes */ +#define EMAC_TRTR_1600 0x18000000 /* 0's for 64 Bytes */ +#define EMAC_TRTR_256 0x03000000 #define EMAC_TRTR_192 0x10000000 #define EMAC_TRTR_128 0x01000000 - #define EMAC_TX_CTRL_GFCS 0x0200 #define EMAC_TX_CTRL_GP 0x0100 #define EMAC_TX_CTRL_ISA 0x0080 @@ -176,8 +214,6 @@ #define EMAC_TX_ST_UR 0x0002 #define EMAC_TX_ST_SQE 0x0001 -#define EMAC_TX_ST_DEFAULT 0x03F3 - /* madmal receive status / Control bits */ #define EMAC_RX_ST_OE 0x0200 #define EMAC_RX_ST_PP 0x0100 @@ -191,5 +227,36 @@ #define EMAC_RX_ST_IRE 0x0001 #define EMAC_BAD_RX_PACKET 0x02ff +/* Revision specific EMAC register defaults */ +#ifdef CONFIG_IBM_EMAC4 +#define EMAC_M1_DEFAULT (EMAC_M1_BASE | \ + EMAC_M1_OPB_CLK_66 | \ + EMAC_M1_TX_MWSW) +#define EMAC_RMR_DEFAULT (EMAC_RMR_BASE | \ + EMAC_RMR_RFAF_128_2048) +#define EMAC_TMR0_XMIT (EMAC_TMR0_GNP0 | \ + EMAC_TMR0_TFAE_128_2048) +#define EMAC_TRTR_DEFAULT EMAC_TRTR_256 +#else /* !CONFIG_IBM_EMAC4 */ +#define EMAC_M1_DEFAULT EMAC_M1_BASE +#define EMAC_RMR_DEFAULT EMAC_RMR_BASE +#define EMAC_TMR0_XMIT EMAC_TMR0_GNP0 +#define EMAC_TRTR_DEFAULT EMAC_TRTR_1600 +#endif /* CONFIG_IBM_EMAC4 */ + +/* SoC implementation specific EMAC register defaults */ +#if defined(CONFIG_440GP) +#define EMAC_RWMR_DEFAULT 0x80009000 +#define EMAC_TMR0_DEFAULT 0x00000000 +#define EMAC_TMR1_DEFAULT 0xf8640000 +#elif defined(CONFIG_440GX) +#define EMAC_RWMR_DEFAULT 0x1000a200 +#define EMAC_TMR0_DEFAULT EMAC_TMR0_TFAE_128_2048 +#define EMAC_TMR1_DEFAULT 0x88810000 +#else +#define EMAC_RWMR_DEFAULT 0x0f002000 +#define EMAC_TMR0_DEFAULT 0x00000000 +#define EMAC_TMR1_DEFAULT 0x380f0000 +#endif /* CONFIG_440GP */ #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/ibm_emac/ibm_ocp_enet.c linux-2.4.23-pre8/drivers/net/ibm_emac/ibm_ocp_enet.c --- linux-2.4.22/drivers/net/ibm_emac/ibm_ocp_enet.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/ibm_emac/ibm_ocp_enet.c 2003-10-22 22:47:38.000000000 +0000 @@ -674,7 +674,7 @@ fep->tx_desc[fep->tx_slot].ctrl = ctrl; /* Send the packet out. */ - out_be32(&emacp->em0tmr0, EMAC_TXM0_GNP0); + out_be32(&emacp->em0tmr0, EMAC_TMR0_XMIT); if (++fep->tx_slot == NUM_TX_BUFF) fep->tx_slot = 0; @@ -699,10 +699,9 @@ full_duplex = 0; speed = SPEED_10; - /* set receive fifo to 4k and tx fifo to 2k */ - mode_reg = EMAC_M1_RFS_4K | EMAC_M1_TX_FIFO_2K | EMAC_M1_APP | - EMAC_M1_TR0_MULTI; - + /* set mode register 1 defaults */ + mode_reg = EMAC_M1_DEFAULT; + /* Read link mode on PHY */ if (fep->phy_mii.def->ops->read_link(&fep->phy_mii) == 0) { /* If an error occurred, we don't deal with it yet */ @@ -871,26 +870,19 @@ if (netif_carrier_ok(fep->ndev)) emac_adjust_to_link(fep); - /* enable broadcast and individual address */ - out_be32(&emacp->em0rmr, EMAC_RMR_IAE | EMAC_RMR_BAE); + /* enable broadcast/individual address and RX FIFO defaults */ + out_be32(&emacp->em0rmr, EMAC_RMR_DEFAULT); + /* set transmit request threshold register */ + out_be32(&emacp->em0trtr, EMAC_TRTR_DEFAULT); /* Reconfigure multicast */ __emac_set_multicast_list(fep->ndev); - /* set transmit request threshold register */ - out_be32(&emacp->em0trtr, EMAC_TRTR_256); - - - /* set receive low/high water mark register */ -#ifdef CONFIG_440 - /* 440GP has a 64 byte burst length */ - out_be32(&emacp->em0rwmr, 0x80009000); - out_be32(&emacp->em0tmr1, 0xf8640000); -#else - /* 405s have a 16 byte burst length */ - out_be32(&emacp->em0rwmr, 0x0f002000); -#endif /* CONFIG_440 */ + /* Set receiver/transmitter defaults */ + out_be32(&emacp->em0rwmr, EMAC_RWMR_DEFAULT); + out_be32(&emacp->em0tmr0, EMAC_TMR0_DEFAULT); + out_be32(&emacp->em0tmr1, EMAC_TMR1_DEFAULT); /* set frame gap */ out_be32(&emacp->em0ipgvr, CONFIG_IBM_OCP_ENET_GAP); @@ -989,7 +981,8 @@ * latency peaks caused by this code */ emac_reset_configure(fep); - emac_kick(fep); + if (fep->opened) + emac_kick(fep); } else { fep->timer_ticks = 0; netif_carrier_off(fep->ndev); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/ibm_emac/ibm_ocp_mal.c linux-2.4.23-pre8/drivers/net/ibm_emac/ibm_ocp_mal.c --- linux-2.4.22/drivers/net/ibm_emac/ibm_ocp_mal.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/ibm_emac/ibm_ocp_mal.c 2003-10-22 22:48:36.000000000 +0000 @@ -103,17 +103,17 @@ case 0: set_mal_dcrn(mal, DCRN_MALRCBS0, size); break; -#ifdef DCRN_RCBS1 +#ifdef DCRN_MALRCBS1 case 1: set_mal_dcrn(mal, DCRN_MALRCBS1, size); break; #endif -#ifdef DCRN_RCBS2 +#ifdef DCRN_MALRCBS2 case 2: set_mal_dcrn(mal, DCRN_MALRCBS2, size); break; #endif -#ifdef DCRN_RCBS3 +#ifdef DCRN_MALRCBS3 case 3: set_mal_dcrn(mal, DCRN_MALRCBS3, size); break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/irda/act200l.c linux-2.4.23-pre8/drivers/net/irda/act200l.c --- linux-2.4.22/drivers/net/irda/act200l.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/irda/act200l.c 2003-10-22 22:47:56.000000000 +0000 @@ -106,7 +106,7 @@ static void act200l_open(dongle_t *self, struct qos_info *qos) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Power on the dongle */ self->set_dtr_rts(self->dev, TRUE, TRUE); @@ -120,7 +120,7 @@ static void act200l_close(dongle_t *self) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Power off the dongle */ self->set_dtr_rts(self->dev, FALSE, FALSE); @@ -141,7 +141,7 @@ __u8 control[3]; int ret = 0; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self->speed_task = task; @@ -158,7 +158,7 @@ } break; case IRDA_TASK_CHILD_WAIT: - WARNING(__FUNCTION__ "(), resetting dongle timed out!\n"); + WARNING("%s(), resetting dongle timed out!\n", __FUNCTION__); ret = -1; break; case IRDA_TASK_CHILD_DONE: @@ -203,7 +203,7 @@ self->speed_task = NULL; break; default: - ERROR(__FUNCTION__ "(), unknown state %d\n", task->state); + ERROR("%s(), unknown state %d\n", __FUNCTION__, task->state); irda_task_next_state(task, IRDA_TASK_DONE); self->speed_task = NULL; ret = -1; @@ -233,7 +233,7 @@ }; int ret = 0; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self->reset_task = task; @@ -269,7 +269,7 @@ self->reset_task = NULL; break; default: - ERROR(__FUNCTION__ "(), unknown state %d\n", task->state); + ERROR("%s(), unknown state %d\n", __FUNCTION__, task->state); irda_task_next_state(task, IRDA_TASK_DONE); self->reset_task = NULL; ret = -1; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/irda/irda-usb.c linux-2.4.23-pre8/drivers/net/irda/irda-usb.c --- linux-2.4.22/drivers/net/irda/irda-usb.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/irda/irda-usb.c 2003-10-22 22:48:57.000000000 +0000 @@ -339,7 +339,7 @@ int res, mtt; int err = 1; /* Failed */ - IRDA_DEBUG(4, __FUNCTION__ "() on %s\n", netdev->name); + IRDA_DEBUG(4, "%s() on %s\n", __FUNCTION__, netdev->name); netif_stop_queue(netdev); @@ -542,7 +542,7 @@ (self->new_xbofs != self->xbofs)) { /* We haven't changed speed yet (because of * IUC_SPEED_BUG), so do it now - Jean II */ - IRDA_DEBUG(1, __FUNCTION__ "(), Changing speed now...\n"); + IRDA_DEBUG(1, "%s(), Changing speed now...\n", __FUNCTION__); irda_usb_change_speed_xbofs(self); } else { /* New speed and xbof is now commited in hardware */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/irda/ma600.c linux-2.4.23-pre8/drivers/net/irda/ma600.c --- linux-2.4.22/drivers/net/irda/ma600.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/irda/ma600.c 2003-10-22 22:48:16.000000000 +0000 @@ -86,13 +86,13 @@ int __init ma600_init(void) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); return irda_device_register_dongle(&dongle); } void __exit ma600_cleanup(void) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); irda_device_unregister_dongle(&dongle); } @@ -105,7 +105,7 @@ */ static void ma600_open(dongle_t *self, struct qos_info *qos) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); qos->baud_rate.bits &= IR_2400|IR_9600|IR_19200|IR_38400 |IR_57600|IR_115200; @@ -123,7 +123,7 @@ static void ma600_close(dongle_t *self) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Power off dongle */ self->set_dtr_rts(self->dev, FALSE, FALSE); @@ -184,12 +184,12 @@ __u8 byte_echo; int ret = 0; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(task != NULL, return -1;); if (self->speed_task && self->speed_task != task) { - IRDA_DEBUG(0, __FUNCTION__ "(), busy!\n"); + IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__); return MSECS_TO_JIFFIES(10); } else { self->speed_task = task; @@ -215,7 +215,7 @@ break; case IRDA_TASK_CHILD_WAIT: - WARNING(__FUNCTION__ "(), resetting dongle timed out!\n"); + WARNING("%s(), resetting dongle timed out!\n", __FUNCTION__); ret = -1; break; @@ -246,7 +246,7 @@ if(byte != byte_echo) { /* if control byte != echo, I don't know what to do */ - printk(KERN_WARNING __FUNCTION__ "() control byte written != read!\n"); + printk(KERN_WARNING "%s() control byte written != read!\n", __FUNCTION__); printk(KERN_WARNING "control byte = 0x%c%c\n", hexTbl[(byte>>4)&0x0f], hexTbl[byte&0x0f]); printk(KERN_WARNING "byte echo = 0x%c%c\n", @@ -254,7 +254,7 @@ hexTbl[byte_echo & 0x0f]); #ifndef NDEBUG } else { - IRDA_DEBUG(2, __FUNCTION__ "() control byte write read OK\n"); + IRDA_DEBUG(2, "%s() control byte write read OK\n", __FUNCTION__); #endif } @@ -273,7 +273,7 @@ break; default: - ERROR(__FUNCTION__ "(), unknown state %d\n", task->state); + ERROR("%s(), unknown state %d\n", __FUNCTION__, task->state); irda_task_next_state(task, IRDA_TASK_DONE); self->speed_task = NULL; ret = -1; @@ -298,12 +298,12 @@ dongle_t *self = (dongle_t *) task->instance; int ret = 0; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(task != NULL, return -1;); if (self->reset_task && self->reset_task != task) { - IRDA_DEBUG(0, __FUNCTION__ "(), busy!\n"); + IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__); return MSECS_TO_JIFFIES(10); } else self->reset_task = task; @@ -326,7 +326,7 @@ self->reset_task = NULL; break; default: - ERROR(__FUNCTION__ "(), unknown state %d\n", task->state); + ERROR("%s(), unknown state %d\n", __FUNCTION__, task->state); irda_task_next_state(task, IRDA_TASK_DONE); self->reset_task = NULL; ret = -1; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/irda/mcp2120.c linux-2.4.23-pre8/drivers/net/irda/mcp2120.c --- linux-2.4.22/drivers/net/irda/mcp2120.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/irda/mcp2120.c 2003-10-22 22:48:12.000000000 +0000 @@ -110,7 +110,7 @@ } break; case IRDA_TASK_CHILD_WAIT: - WARNING(__FUNCTION__ "(), resetting dongle timed out!\n"); + WARNING("%s(), resetting dongle timed out!\n", __FUNCTION__); ret = -1; break; case IRDA_TASK_CHILD_DONE: @@ -158,7 +158,7 @@ //printk("mcp2120_change_speed irda_task_wait\n"); break; default: - ERROR(__FUNCTION__ "(), unknown state %d\n", task->state); + ERROR("%s(), unknown state %d\n", __FUNCTION__, task->state); irda_task_next_state(task, IRDA_TASK_DONE); self->speed_task = NULL; ret = -1; @@ -213,7 +213,7 @@ self->reset_task = NULL; break; default: - ERROR(__FUNCTION__ "(), unknown state %d\n", task->state); + ERROR("%s(), unknown state %d\n", __FUNCTION__ , task->state); irda_task_next_state(task, IRDA_TASK_DONE); self->reset_task = NULL; ret = -1; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/irda/nsc-ircc.c linux-2.4.23-pre8/drivers/net/irda/nsc-ircc.c --- linux-2.4.22/drivers/net/irda/nsc-ircc.c 2002-11-28 23:53:13.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/irda/nsc-ircc.c 2003-10-22 22:47:28.000000000 +0000 @@ -700,7 +700,7 @@ switch_bank(iobase, BANK3); version = inb(iobase+MID); - IRDA_DEBUG(2, __FUNCTION__ "() Driver %s Found chip version %02x\n", + IRDA_DEBUG(2, "%s() Driver %s Found chip version %02x\n", __FUNCTION__, driver_name, version); /* Should be 0x2? */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/mv64340_eth.c linux-2.4.23-pre8/drivers/net/mv64340_eth.c --- linux-2.4.22/drivers/net/mv64340_eth.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/mv64340_eth.c 2003-10-22 22:47:36.000000000 +0000 @@ -0,0 +1,2749 @@ +/* + * drivers/net/mv64340_eth.c - Driver for MV64340X ethernet ports + * Copyright (C) 2002 Matthew Dharm + * + * Based on the 64360 driver from: + * Copyright (C) 2002 rabeeh@galileo.co.il + * + * Copyright (C) 2003 Ralf Baechle + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef CONFIG_NET_FASTROUTE +#include +#include +#endif + +#include "mv64340_eth.h" + +/************************************************************************* +************************************************************************** +************************************************************************** +* The first part is the high level driver of the gigE ethernet ports. * +************************************************************************** +************************************************************************** +*************************************************************************/ + +/* Definition for configuring driver */ +#undef MV64340_RX_QUEUE_FILL_ON_TASK + +/* Constants */ +#define EXTRA_BYTES 32 +#define WRAP ETH_HLEN + 2 + 4 + 16 +#define BUFFER_MTU dev->mtu + WRAP +#define INT_CAUSE_UNMASK_ALL 0x0007ffff +#define INT_CAUSE_UNMASK_ALL_EXT 0x0011ffff +#ifdef MV64340_RX_FILL_ON_TASK +#define INT_CAUSE_MASK_ALL 0x00000000 +#define INT_CAUSE_CHECK_BITS INT_CAUSE_UNMASK_ALL +#define INT_CAUSE_CHECK_BITS_EXT INT_CAUSE_UNMASK_ALL_EXT +#endif + +/* Static function declarations */ +static int mv64340_eth_real_open(struct net_device *); +static int mv64340_eth_real_stop(struct net_device *); +static int mv64340_eth_change_mtu(struct net_device *, int); +static struct net_device_stats *mv64340_eth_get_stats(struct net_device *); +static void eth_port_init_mac_tables(ETH_PORT eth_port_num); + +static unsigned char prom_mac_addr_base[6]; + +/************************************************** + * Helper functions - used inside the driver only * + **************************************************/ + +static void *mv64340_eth_malloc_ring(unsigned int size) +{ + dma_addr_t dma_handle; + void *result; + /* Assumes allocated buffer is cache line alligned */ + result = pci_alloc_consistent(NULL, size, &dma_handle); + memset(result, 0, size); + return result; +} + +/********************************************************************** + * mv64340_eth_change_mtu + * + * Changes MTU (maximum transfer unit) of the gigabit ethenret port + * + * Input : pointer to ethernet interface network device structure + * new mtu size + * Output : 0 upon success, -EINVAL upon failure + **********************************************************************/ +static int mv64340_eth_change_mtu(struct net_device *dev, int new_mtu) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + unsigned long flags; + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + spin_lock_irqsave(&port_private->lock, flags); + + if ((new_mtu > 9500) || (new_mtu < 64)) { + spin_unlock_irqrestore(&port_private->lock, flags); + return -EINVAL; + } + + dev->mtu = new_mtu; + /* + * Stop then re-open the interface. This will allocate RX skb's with + * the new MTU. + * There is a possible danger that the open will not successed, due + * to memory is full, which might fail the open function. + */ + if (netif_running(dev)) { + if (mv64340_eth_real_stop(dev)) + printk(KERN_ERR + "%s: Fatal error on stopping device\n", + dev->name); + if (mv64340_eth_real_open(dev)) + printk(KERN_ERR + "%s: Fatal error on opening device\n", + dev->name); + } + + spin_unlock_irqrestore(&port_private->lock, flags); + return 0; +} + +/********************************************************************** + * mv64340_eth_rx_task + * + * Fills / refills RX queue on a certain gigabit ethernet port + * + * Input : pointer to ethernet interface network device structure + * Output : N/A + **********************************************************************/ +static void mv64340_eth_rx_task(void *data) +{ + struct net_device *dev = (struct net_device *) data; + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + PKT_INFO pkt_info; + struct sk_buff *skb; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + if (test_and_set_bit(0, &port_private->rx_task_busy)) { + panic("%s: Error in test_set_bit / clear_bit\n", dev->name); + } + + while (port_private->rx_ring_skbs < (port_private->rx_ring_size - 5)) { + /* The +8 for buffer allignment and another 32 byte extra */ + skb = dev_alloc_skb(BUFFER_MTU + 8 + EXTRA_BYTES); + if (!skb) + break; + port_private->rx_ring_skbs++; + pkt_info.cmd_sts = ETH_RX_ENABLE_INTERRUPT; + pkt_info.byte_cnt = dev->mtu + ETH_HLEN + 4 + 2 + EXTRA_BYTES; + /* Allign buffer to 8 bytes */ + if (pkt_info.byte_cnt & ~0x7) { + pkt_info.byte_cnt &= ~0x7; + pkt_info.byte_cnt += 8; + } + pkt_info.buf_ptr = + pci_map_single(0, skb->data, + dev->mtu + ETH_HLEN + 4 + 2 + EXTRA_BYTES, + PCI_DMA_FROMDEVICE); + pkt_info.return_info = skb; + if (eth_rx_return_buff(ethernet_private, &pkt_info) != ETH_OK) { + printk(KERN_ERR + "%s: Error allocating RX Ring\n", dev->name); + break; + } + skb_reserve(skb, 2); + } + clear_bit(0, &port_private->rx_task_busy); + /* + * If RX ring is empty of SKB, set a timer to try allocating + * again in a later time . + */ + if ((port_private->rx_ring_skbs == 0) && + (port_private->rx_timer_flag == 0)) { + printk(KERN_INFO "%s: Rx ring is empty\n", dev->name); + /* After 100mSec */ + port_private->timeout.expires = jiffies + (HZ / 10); + add_timer(&port_private->timeout); + port_private->rx_timer_flag = 1; + } +#if MV64340_RX_QUEUE_FILL_ON_TASK + else { + /* Return interrupts */ + MV_WRITE(MV64340_ETH_INTERRUPT_MASK_REG(port_num), + INT_CAUSE_UNMASK_ALL); + } +#endif +} + + +/********************************************************************** + * mv64340_eth_rx_task_timer_wrapper + * + * Timer routine to wake up RX queue filling task. This function is + * used only in case the RX queue is empty, and all alloc_skb has + * failed (due to out of memory event). + * + * Input : pointer to ethernet interface network device structure + * Output : N/A + **********************************************************************/ +static void mv64340_eth_rx_task_timer_wrapper(unsigned long data) +{ + struct net_device *dev = (struct net_device *) data; + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + + port_private->rx_timer_flag = 0; + mv64340_eth_rx_task((void *) data); +} + + +/********************************************************************** + * mv64340_eth_update_mac_address + * + * Update the MAC address of the port in the address table + * + * Input : pointer to ethernet interface network device structure + * Output : N/A + **********************************************************************/ +static void mv64340_eth_update_mac_address(struct net_device *dev) +{ + ETH_PORT_INFO *ethernet_private = dev->priv; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + eth_port_init_mac_tables(port_num); + memcpy(ethernet_private->port_mac_addr, dev->dev_addr, 6); + eth_port_uc_addr_set(port_num, ethernet_private->port_mac_addr); +} + +/********************************************************************** + * mv64340_eth_set_rx_mode + * + * Change from promiscuos to regular rx mode + * + * Input : pointer to ethernet interface network device structure + * Output : N/A + **********************************************************************/ +static void mv64340_eth_set_rx_mode(struct net_device *dev) +{ + ETH_PORT_INFO *ethernet_private = (ETH_PORT_INFO *) dev->priv; + + if (dev->flags & IFF_PROMISC) { + ethernet_set_config_reg + (ethernet_private->port_num, + ethernet_get_config_reg(ethernet_private->port_num) | + ETH_UNICAST_PROMISCUOUS_MODE); + } else { + ethernet_set_config_reg + (ethernet_private->port_num, + ethernet_get_config_reg(ethernet_private->port_num) & + ~(unsigned int) ETH_UNICAST_PROMISCUOUS_MODE); + } +} + + +/********************************************************************** + * mv64340_eth_accept_fastpath + * + * Used to authenticate to the kernel that a fast path entry can be + * added to device's routing table cache + * + * Input : pointer to ethernet interface network device structure and + * a pointer to the designated entry to be added to the cache. + * Output : zero upon success, negative upon failure + **********************************************************************/ +#ifdef CONFIG_NET_FASTROUTE +static int mv64340_eth_accept_fastpath(struct net_device *dev, + struct dst_entry *dst) +{ + struct net_device *odev = dst->dev; + + if (dst->ops->protocol != __constant_htons(ETH_P_IP)) { + return -1; + } + + if (odev->type != ARPHRD_ETHER || odev->accept_fastpath == NULL) { + return -1; + } + + printk(KERN_INFO + "Accepted fastpath (destination interface %s)\n", odev->name); + return 0; +} +#endif + + +/********************************************************************** + * mv64340_eth_set_mac_address + * + * Change the interface's mac address. + * No special hardware thing should be done because interface is always + * put in promiscuous mode. + * + * Input : pointer to ethernet interface network device structure and + * a pointer to the designated entry to be added to the cache. + * Output : zero upon success, negative upon failure + **********************************************************************/ +static int mv64340_eth_set_mac_address(struct net_device *dev, void *addr) +{ + int i; + + for (i = 0; i < 6; i++) + /* +2 is for the offset of the HW addr type */ + dev->dev_addr[i] = ((unsigned char *) addr)[i + 2]; + mv64340_eth_update_mac_address(dev); + return 0; +} + +/********************************************************************** + * mv64340_eth_tx_timeout + * + * Called upon a timeout on transmitting a packet + * + * Input : pointer to ethernet interface network device structure. + * Output : N/A + **********************************************************************/ +static void mv64340_eth_tx_timeout(struct net_device *dev) +{ + printk(KERN_INFO "%s: TX timeout\n", dev->name); +} + +/********************************************************************** + * mv64340_eth_free_tx_queue + * + * Input : dev - a pointer to the required interface + * + * Output : 0 if was able to release skb , nonzero otherwise + **********************************************************************/ + +static int mv64340_eth_free_tx_queue(struct net_device *dev, + unsigned int eth_int_cause_ext) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + PKT_INFO pkt_info; + int released = 1; + struct net_device_stats *stats; + + spin_lock(&(port_private->lock)); + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + stats = &port_private->stats; + + /* Check only queue 0 */ + if (eth_int_cause_ext & (BIT0 | BIT8)) + while (eth_tx_return_desc(ethernet_private, &pkt_info) == + ETH_OK) { + if (pkt_info.cmd_sts & BIT0) { + printk("%s: Error in TX\n", dev->name); + stats->tx_errors++; + } + /* + * If return_info is different than 0, release the skb. + * The case where return_info is not 0 is only in case + * when transmitted a scatter/gather packet, where only + * last skb releases the whole chain. + */ + if (pkt_info.return_info) { + dev_kfree_skb_irq((struct sk_buff *) + pkt_info.return_info); + released = 0; + } + + /* + * Decrement the number of outstanding skbs counter on the + * TX queue. + */ + if (port_private->tx_ring_skbs == 0) + panic + ("ERROR - TX outstanding SKBs counter is corrupted\n"); + port_private->tx_ring_skbs--; + + } + + spin_unlock(&(port_private->lock)); + return released; +} + +/********************************************************************** + * mv64340_eth_receive + * + * This function is forward packets that are received from the port's + * queues toward kernel core or FastRoute them to another interface. + * + * Input : dev - a pointer to the required interface + * max - maximum number to receive (0 means unlimted) + * + * Output : number of served packets + **********************************************************************/ + +static int mv64340_eth_receive_queue(struct net_device *dev, unsigned int max) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + PKT_INFO pkt_info; + struct sk_buff *skb; + unsigned int received_packets = 0; + struct net_device_stats *stats; + +#ifdef CONFIG_NET_FASTROUTE + register int fast_routed = 0; + struct ethhdr *eth; + struct iphdr *iph; + unsigned h, CPU_ID = smp_processor_id(); + struct rtable *rt; + struct net_device *odev; +#endif + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + stats = &port_private->stats; + + while ((--max) + && (eth_port_receive(ethernet_private, &pkt_info) == + ETH_OK)) { + port_private->rx_ring_skbs--; + received_packets++; + + /* Update statistics. Note byte count includes 4 byte CRC count */ + stats->rx_packets++; + stats->rx_bytes += pkt_info.byte_cnt; +#ifdef CONFIG_NET_FASTROUTE + fast_routed = 0; +#endif + skb = (struct sk_buff *) pkt_info.return_info; + /* + * In case received a packet without first / last bits on OR the error + * summary bit is on, the packets needs to be dropeed. + */ + if ( + ((pkt_info.cmd_sts + & (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) != + (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) + || (pkt_info.cmd_sts & ETH_ERROR_SUMMARY)) { + stats->rx_dropped++; + if ( + (pkt_info.cmd_sts & (ETH_RX_FIRST_DESC | + ETH_RX_LAST_DESC)) != + (ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) { + if (net_ratelimit()) + printk(KERN_ERR + "%s: Received packet spread on multiple" + " descriptors\n", + dev->name); + } + if (pkt_info.cmd_sts & ETH_ERROR_SUMMARY) { + stats->rx_errors++; + } + dev_kfree_skb_irq(skb); + } else { + /* The -4 is for the CRC in the trailer of the received packet */ + skb_put(skb, pkt_info.byte_cnt - 4); + skb->dev = dev; +#ifdef CONFIG_NET_FASTROUTE + eth = (struct ethhdr *) skb->data; + if (eth->h_proto == __constant_htons(ETH_P_IP)) { + iph = + (struct iphdr *) (skb->data + + ETH_HLEN); + h = + (*(u8 *) & iph->daddr ^ *(u8 *) & iph-> + saddr) & NETDEV_FASTROUTE_HMASK; + rt = (struct rtable *) (dev->fastpath[h]); + if (rt != NULL && + ((u16 *) & iph->daddr)[0] == + ((u16 *) & rt->key.dst)[0] + && ((u16 *) & iph->daddr)[1] == + ((u16 *) & rt->key.dst)[1] + && ((u16 *) & iph->saddr)[0] == + ((u16 *) & rt->key.src)[0] + && ((u16 *) & iph->saddr)[1] == + ((u16 *) & rt->key.src)[1] + && !rt->u.dst.obsolete) { + odev = rt->u.dst.dev; + netdev_rx_stat + [CPU_ID].fastroute_hit++; + if (*(u8 *) iph == 0x45 + && (!(eth->h_dest[0] & 0x80)) + && neigh_is_valid(rt->u.dst. + neighbour) + && iph->ttl > 1) { + /* Fast Route Path */ + fast_routed = 1; + if ( + (!netif_queue_stopped + (odev)) + && + (!spin_is_locked + (odev->xmit_lock)) + && (skb->len <= + (odev->mtu + + ETH_HLEN + 2 + + 4))) { + skb->pkt_type = + PACKET_FASTROUTE; + skb->protocol = + __constant_htons + (ETH_P_IP); + ip_decrease_ttl + (iph); + memcpy + (eth->h_source, + odev-> + dev_addr, 6); + memcpy(eth->h_dest, + rt->u.dst. + neighbour-> + ha, 6); + skb->dev = odev; + if + (odev-> + hard_start_xmit + (skb, odev) != 0) { + panic + ("%s: FastRoute path corrupted", + dev-> + name); + } + netdev_rx_stat + [CPU_ID]. + fastroute_success++; + } + /* Semi Fast Route Path */ + else { + skb->pkt_type = + PACKET_FASTROUTE; + skb->nh.raw = + skb->data + + ETH_HLEN; + skb->protocol = + __constant_htons + (ETH_P_IP); + netdev_rx_stat + [CPU_ID]. + fastroute_defer++; + netif_rx(skb); + } + } + } + } + if (fast_routed == 0) +#endif + { + struct ethhdr *eth_h; + struct iphdr *ip_h; + eth_h = (struct ethhdr *) skb->data; + ip_h = + (struct iphdr *) (skb->data + + ETH_HLEN); + skb->ip_summed = CHECKSUM_NONE; + skb->protocol = eth_type_trans(skb, dev); + netif_rx(skb); + } + } + } + return received_packets; +} + +/********************************************************************** + * mv64340_eth_int_handler + * + * Main interrupt handler for the gigbit ethernet ports + * + * Input : irq - irq number (not used) + * dev_id - a pointer to the required interface's data structure + * regs - not used + * Output : N/A + **********************************************************************/ + +static void mv64340_eth_int_handler(int irq, void *dev_id, struct pt_regs *regs) +{ + struct net_device *dev = (struct net_device *) dev_id; + u32 eth_int_cause = 0, eth_int_cause_ext = 0; + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + /* Read interrupt cause registers */ + eth_int_cause = + MV_READ_DATA(MV64340_ETH_INTERRUPT_CAUSE_REG(port_num)); + if (eth_int_cause & BIT1) + eth_int_cause_ext = + MV_READ_DATA(MV64340_ETH_INTERRUPT_CAUSE_EXTEND_REG + (port_num)); + else + eth_int_cause_ext = 0; + + /* Mask with shadowed mask registers */ +#ifdef MV64340_RX_QUEUE_FILL_ON_TASK + eth_int_cause &= INT_CAUSE_CHECK_BITS; + eth_int_cause_ext &= INT_CAUSE_CHECK_BITS_EXT; +#else + eth_int_cause &= INT_CAUSE_UNMASK_ALL; + eth_int_cause_ext &= INT_CAUSE_UNMASK_ALL_EXT; +#endif + + /* + * If no real interrupt occured, exit. + * This can happen when using gigE interrupt coalescing mechanism. + */ + if ((eth_int_cause == 0x0) && (eth_int_cause_ext == 0x0)) { + return; + } + + /* + * Clear specific ethernet port intrerrupt registers by acknowleding + * relevant bits. + */ + MV_WRITE(MV64340_ETH_INTERRUPT_CAUSE_REG(port_num), + ~eth_int_cause); + if (eth_int_cause_ext != 0x0) + MV_WRITE(MV64340_ETH_INTERRUPT_CAUSE_EXTEND_REG(port_num), + ~eth_int_cause_ext); + + if (eth_int_cause_ext & 0x0000ffff) { + /* + * Check if released more than one packet. + * Otherwise don't wake up queue + */ + if (mv64340_eth_free_tx_queue(dev, eth_int_cause_ext) == 0) { + /* + * If the interface was stopped before, and link is up, + * wakeup TX queue. Note that this might be a problematic + * issue since the multiple TX queues in the system controller, + * and in which few queues are stucked. + * If this is the case, then a TX packet to a stucked queue is + * forwarded to another TX queue of the interface ; BUT in the + * current implementation only one TX / RX queues are used. + */ + if (netif_queue_stopped(dev) + && (dev->flags & IFF_RUNNING) + && + (MV64340_TX_QUEUE_SIZE > port_private->tx_ring_skbs + 1)) { + netif_wake_queue(dev); + } + } + } + if (eth_int_cause & 0x0007fffd) { /*RxBuffer returned, RxResource Error */ + unsigned int total_received = 0; + /* Rx Return Buffer / Resource Error Priority queue 0 */ + if (eth_int_cause & (BIT2 | BIT11)) { + total_received += + mv64340_eth_receive_queue(dev, 0); + } + /* + * After forwarded received packets to upper layer, add a task in an + * interrupts enabled context that refills the RX ring with skb's. + */ +#if MV64340_RX_QUEUE_FILL_ON_TASK + /* Unmask all interrupts on ethernet port */ + MV_WRITE(MV64340_ETH_INTERRUPT_MASK_REG(port_num), + INT_CAUSE_MASK_ALL); + queue_task(&port_private->rx_task, &tq_immediate); + mark_bh(IMMEDIATE_BH); +#else + port_private->rx_task.routine(dev); +#endif + + } + /* PHY status changed */ + if (eth_int_cause_ext & (BIT16 | BIT20)) { + unsigned int phy_reg_data; + + /* Check Link status on ethernet port */ + eth_port_read_smi_reg(port_num, 1, &phy_reg_data); + if (!(phy_reg_data & 0x20)) { + netif_stop_queue(dev); + dev->flags &= ~(IFF_RUNNING); + } else { + netif_wake_queue(dev); + dev->flags |= (IFF_RUNNING); + + /* + * Start all TX queues on ethernet port. This is good in case of + * previous packets where not transmitted, due to link down and + * this command re-enables all TX queues. + * Note that it is possible to get a TX resource error interrupt + * after issuing this, since not all TX queues are enabled, + * or has anything to send. + */ + MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num), 1); + } + } + return; +} + +/********************************************************************** + * mv64340_eth_open + * + * This function is called when openning the network device. The function + * should initialize all the hardware, initialize cyclic Rx/Tx + * descriptors chain and buffers and allocate an IRQ to the network + * device. + * + * Input : a pointer to the network device structure + * + * Output : zero of success , nonzero if fails. + **********************************************************************/ + +static int mv64340_eth_open(struct net_device *dev) +{ + int retval; + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + spin_lock_irq(&(port_private->lock)); + + retval = + request_irq(ETH_PORT0_IRQ_NUM + port_num, mv64340_eth_int_handler, + (SA_INTERRUPT | SA_SAMPLE_RANDOM), dev->name, dev); + + if (retval != 0) { + printk(KERN_ERR "Can not assign IRQ number to MV64340_eth%d\n", + port_num); + return -1; + } else { + dev->irq = ETH_PORT0_IRQ_NUM + port_num; + } + + if (mv64340_eth_real_open(dev)) { + printk("%s: Error opening interface\n", dev->name); + free_irq(dev->irq, dev); + spin_unlock_irq(ðernet_priv->lock); + return -EBUSY; + } + MOD_INC_USE_COUNT; + spin_unlock_irq(ðernet_priv->lock); + return 0; +} + +/* Helper function for mv64340_eth_open */ +static int mv64340_eth_real_open(struct net_device *dev) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + u32 phy_reg_data; + unsigned int size; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + /* Stop RX Queues */ + MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), + 0x0000ff00); + + /* Clear the ethernet port interrupts */ + MV_WRITE(MV64340_ETH_INTERRUPT_CAUSE_REG(port_num), 0); + MV_WRITE(MV64340_ETH_INTERRUPT_CAUSE_EXTEND_REG(port_num), 0); + + /* Unmask RX buffer and TX end interrupt */ + MV_WRITE(MV64340_ETH_INTERRUPT_MASK_REG(port_num), + INT_CAUSE_UNMASK_ALL); + + /* Unmask phy and link status changes interrupts */ + MV_WRITE(MV64340_ETH_INTERRUPT_EXTEND_MASK_REG(port_num), + INT_CAUSE_UNMASK_ALL_EXT); + + /* Set the MAC Address */ + memcpy(ethernet_private->port_mac_addr, dev->dev_addr, 6); + eth_port_init(ethernet_private); + + /* Set rx_task pointers */ + port_private->rx_task.sync = 0; + port_private->rx_task.routine = mv64340_eth_rx_task; + port_private->rx_task.data = dev; + + memset(&port_private->timeout, 0, sizeof(struct timer_list)); + port_private->timeout.function = mv64340_eth_rx_task_timer_wrapper; + port_private->timeout.data = (unsigned long) dev; + + port_private->rx_task_busy = 0; + port_private->rx_timer_flag = 0; + + /* Allocate TX ring */ + port_private->tx_ring_skbs = 0; + port_private->tx_ring_size = MV64340_TX_QUEUE_SIZE; + size = port_private->tx_ring_size * sizeof(ETH_TX_DESC); + ethernet_private->tx_desc_area_size = size; + + /* Assumes allocated ring is 16 bytes alligned */ + ethernet_private->p_tx_desc_area = + (ETH_TX_DESC *) mv64340_eth_malloc_ring(size); + if (!ethernet_private->p_tx_desc_area) { + printk(KERN_ERR + "%s: Cannot allocate Tx Ring (size %d bytes)\n", + dev->name, size); + return -ENOMEM; + } + memset((void *) ethernet_private->p_tx_desc_area, 0, + ethernet_private->tx_desc_area_size); + + /* Dummy will be replaced upon real tx */ + ether_init_tx_desc_ring(ethernet_private, + port_private->tx_ring_size, + (unsigned long)ethernet_private->p_tx_desc_area); + + /* Allocate RX ring */ + /* Meantime RX Ring are fixed - but must be configurable by user */ + port_private->rx_ring_size = MV64340_RX_QUEUE_SIZE; + port_private->rx_ring_skbs = 0; + size = port_private->rx_ring_size * sizeof(ETH_RX_DESC); + ethernet_private->rx_desc_area_size = size; + + /* Assumes allocated ring is 16 bytes alligned */ + ethernet_private->p_rx_desc_area = + (ETH_RX_DESC *) mv64340_eth_malloc_ring(size); + if (!ethernet_private->p_rx_desc_area) { + printk(KERN_ERR + "%s: Cannot allocate Rx ring (size %d bytes)\n", + dev->name, size); + printk(KERN_ERR + "%s: Freeing previously allocated TX queues...", + dev->name); + pci_free_consistent(0, ethernet_private->tx_desc_area_size, + (void *) + ethernet_private->p_tx_desc_area, + virt_to_bus(ethernet_private-> + p_tx_desc_area)); + return -ENOMEM; + } + memset((void *) ethernet_private->p_rx_desc_area, 0, + ethernet_private->rx_desc_area_size); + if ( + (ether_init_rx_desc_ring(ethernet_private, port_private->rx_ring_size, 1536, /* Dummy, will be replaced later */ + (unsigned long) ethernet_private->p_rx_desc_area, + 0)) == false) + panic("%s: Error initializing RX Ring\n", dev->name); + + /* Fill RX ring with skb's */ + mv64340_eth_rx_task(dev); + + eth_port_start(ethernet_private); + + /* Check Link status on phy */ + eth_port_read_smi_reg(port_num, 1, &phy_reg_data); + if (!(phy_reg_data & 0x20)) { + netif_stop_queue(dev); + dev->flags &= ~(IFF_RUNNING); + } else { + netif_start_queue(dev); + dev->flags |= (IFF_RUNNING); + } + return 0; +} + + +static void mv64340_eth_free_tx_rings(struct net_device *dev) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num, curr; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + /* Stop Tx Queues */ + MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(port_num), + 0x0000ff00); + + /* Free TX rings */ + /* Free outstanding skb's on TX rings */ + for (curr = 0; + (port_private->tx_ring_skbs) && (curr < MV64340_TX_QUEUE_SIZE); + curr++) { + if (ethernet_private->tx_skb[curr]) { + dev_kfree_skb(ethernet_private->tx_skb[curr]); + port_private->tx_ring_skbs--; + } + } + if (port_private->tx_ring_skbs != 0) + printk + ("%s: Error on Tx descriptor free - could not free %d" + " descriptors\n", dev->name, + port_private->tx_ring_skbs); + pci_free_consistent(0, ethernet_private->tx_desc_area_size, + (void *) ethernet_private->p_tx_desc_area, + virt_to_bus(ethernet_private->p_tx_desc_area)); +} + +static void mv64340_eth_free_rx_rings(struct net_device *dev) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + int curr; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + + /* Stop RX Queues */ + MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), + 0x0000ff00); + + /* Free RX rings */ + /* Free preallocated skb's on RX rings */ + for (curr = 0; + port_private->rx_ring_skbs && (curr < MV64340_RX_QUEUE_SIZE); + curr++) { + if (ethernet_private->rx_skb[curr]) { + dev_kfree_skb(ethernet_private->rx_skb[curr]); + port_private->rx_ring_skbs--; + } + } + + if (port_private->rx_ring_skbs != 0) + printk(KERN_ERR + "%s: Error in freeing Rx Ring. %d skb's still" + " stuck in RX Ring - ignoring them\n", dev->name, + port_private->rx_ring_skbs); + pci_free_consistent(0, ethernet_private->rx_desc_area_size, + (void *) ethernet_private->p_rx_desc_area, + virt_to_bus(ethernet_private->p_rx_desc_area)); +} + +/********************************************************************** + * mv64340_eth_stop + * + * This function is used when closing the network device. + * It updates the hardware, + * release all memory that holds buffers and descriptors and release the IRQ. + * Input : a pointer to the device structure + * Output : zero if success , nonzero if fails + *********************************************************************/ + +static int mv64340_eth_stop(struct net_device *dev) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + spin_lock_irq(&(port_private->lock)); + + mv64340_eth_real_stop(dev); + + free_irq(dev->irq, dev); + MOD_DEC_USE_COUNT; + spin_unlock_irq(ðernet_priv->lock); + return 0; +}; + +/* Helper function for mv64340_eth_stop */ + +static int mv64340_eth_real_stop(struct net_device *dev) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + netif_stop_queue(dev); + + mv64340_eth_free_tx_rings(dev); + mv64340_eth_free_rx_rings(dev); + + eth_port_reset(ethernet_private->port_num); + + /* Disable ethernet port interrupts */ + MV_WRITE(MV64340_ETH_INTERRUPT_CAUSE_REG(port_num), 0); + MV_WRITE(MV64340_ETH_INTERRUPT_CAUSE_EXTEND_REG(port_num), 0); + + /* Mask RX buffer and TX end interrupt */ + MV_WRITE(MV64340_ETH_INTERRUPT_MASK_REG(port_num), 0); + + /* Mask phy and link status changes interrupts */ + MV_WRITE(MV64340_ETH_INTERRUPT_EXTEND_MASK_REG(port_num), 0); + + return 0; +} + + +/********************************************************************** + * mv64340_eth_start_xmit + * + * This function is queues a packet in the Tx descriptor for + * required port. + * + * Input : skb - a pointer to socket buffer + * dev - a pointer to the required port + * + * Output : zero upon success + **********************************************************************/ + +static int mv64340_eth_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + PKT_INFO pkt_info; + unsigned long flags; + ETH_FUNC_RET_STATUS status; + struct net_device_stats *stats; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + stats = &port_private->stats; + + if (netif_queue_stopped(dev)) { + printk(KERN_ERR + "%s: Tried sending packet when interface is stopped\n", + dev->name); + return 1; + } + + /* This is a hard error, log it. */ + if ((MV64340_TX_QUEUE_SIZE - port_private->tx_ring_skbs) <= + (skb_shinfo(skb)->nr_frags + 1)) { + netif_stop_queue(dev); + printk(KERN_ERR + "%s: Bug in mv64340_eth - Trying to transmit when" + " queue full !\n", dev->name); + return 1; + } + + /* Paranoid check - this shouldn't happen */ + if (skb == NULL) { + stats->tx_dropped++; + return 1; + } + + spin_lock_irqsave(&port_private->lock, flags); + + /* Update packet info data structure -- DMA owned, first last */ + pkt_info.cmd_sts = ETH_TX_ENABLE_INTERRUPT | + ETH_TX_FIRST_DESC | ETH_TX_LAST_DESC; + + pkt_info.byte_cnt = skb->len; + pkt_info.buf_ptr = pci_map_single + (0, skb->data, skb->len, PCI_DMA_TODEVICE); + + pkt_info.return_info = skb; + status = eth_port_send(ethernet_private, &pkt_info); + if ((status == ETH_ERROR) || (status == ETH_QUEUE_FULL)) + printk(KERN_ERR "%s: Error on transmitting packet\n", + dev->name); + port_private->tx_ring_skbs++; + + /* Check if TX queue can handle another skb. If not, then + * signal higher layers to stop requesting TX + */ + if (MV64340_TX_QUEUE_SIZE <= (port_private->tx_ring_skbs + 1)) + /* + * Stop getting skb's from upper layers. + * Getting skb's from upper layers will be enabled again after + * packets are released. + */ + netif_stop_queue(dev); + + + /* Update statistics and start of transmittion time */ + stats->tx_bytes += skb->len; + stats->tx_packets++; + dev->trans_start = jiffies; + + spin_unlock_irqrestore(ðernet_priv->lock, flags); + return 0; /* success */ +} + + +/********************************************************************** + * mv64340_eth_get_stats + * + * Returns a pointer to the interface statistics. + * + * Input : dev - a pointer to the required interface + * + * Output : a pointer to the interface's statistics + **********************************************************************/ + +static struct net_device_stats *mv64340_eth_get_stats(struct net_device + *dev) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + unsigned int port_num; + + ethernet_private = dev->priv; + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_num = port_private->port_num; + + return &port_private->stats; +} + +/********************************************************************** + * mv64340_eth_init + * + * First function called after registering the network device. + * It's purpose is to initialize the device as an ethernet device, + * fill the structure that was given in registration with pointers + * to functions, and setting the MAC address of the interface + * + * Input : number of port to initialize + * Output : -ENONMEM if failed , 0 if success + **********************************************************************/ +static int mv64340_eth_init(int port_num) +{ + ETH_PORT_INFO *ethernet_private; + struct mv64340_eth_priv *port_private; + struct net_device *dev; + int err; + + dev = alloc_etherdev(sizeof(ETH_PORT_INFO)); + if (!dev) + return -ENOMEM; + + dev->open = mv64340_eth_open; + dev->stop = mv64340_eth_stop; + dev->hard_start_xmit = mv64340_eth_start_xmit; + dev->get_stats = mv64340_eth_get_stats; + dev->set_mac_address = mv64340_eth_set_mac_address; + dev->set_multicast_list = mv64340_eth_set_rx_mode; + + /* No need to Tx Timeout */ + dev->tx_timeout = mv64340_eth_tx_timeout; + dev->watchdog_timeo = 2 * HZ; + dev->tx_queue_len = MV64340_TX_QUEUE_SIZE; + dev->flags &= ~(IFF_RUNNING); + dev->base_addr = 0; + dev->change_mtu = &mv64340_eth_change_mtu; +#ifdef CONFIG_NET_FASTROUTE + dev->accept_fastpath = mv64340_eth_accept_fastpath; +#endif + ethernet_private = dev->priv; + + /* Allocate memory for stats data structure and spinlock etc... */ + ethernet_private->port_private = (void *) + kmalloc(sizeof(struct mv64340_eth_priv), GFP_KERNEL); + if (!ethernet_private->port_private) { + err = -ENOMEM; + goto out_free_dev; + } + memset(ethernet_private->port_private, 0, + sizeof(struct mv64340_eth_priv)); + if (port_num == 0) + ethernet_private->port_num = ETH_0; + else if (port_num == 1) + ethernet_private->port_num = ETH_1; + else if (port_num == 2) + ethernet_private->port_num = ETH_2; + else { + printk(KERN_ERR "%s: Invalid port number\n", dev->name); + kfree(ethernet_private->port_private); + + err = -ENODEV; + goto out_free_dev; + } + + port_private = + (struct mv64340_eth_priv *) ethernet_private->port_private; + port_private->port_num = port_num; + + memset(&port_private->stats, 0, sizeof(struct net_device_stats)); + + /* Init spinlock */ + spin_lock_init(&port_private->lock); + + /* set MAC addresses */ + memcpy(dev->dev_addr, prom_mac_addr_base, 6); + dev->dev_addr[5] += port_num; + + err = register_netdev(dev); + if (err) + goto out_free_dev; + + printk(KERN_NOTICE "%s: port %d with MAC address %02x:%02x:%02x:%02x:%02x:%02x\n", + dev->name, port_num, + dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], + dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); + + return 0; + +out_free_dev: + kfree(dev->priv); /* free_netdev(dev) in 2.6 */ + kfree(dev); + + return err; +} + +/********************************************************************** + * mv64340_init_module + * + * Registers the network drivers into the Linux kernel + * + * Input : N/A + * + * Output : N/A + **********************************************************************/ +static int __init mv64340_init_module(void) +{ + printk(KERN_NOTICE "MV-64340 10/100/1000 Ethernet Driver\n"); +#ifdef CONFIG_MV64340_ETH_0 + if (mv64340_eth_init(0)) { + printk(KERN_ERR + "Error registering MV-64360 ethernet port 0\n"); + } +#endif +#ifdef CONFIG_MV64340_ETH_1 + if (mv64340_eth_init(1)) { + printk(KERN_ERR + "Error registering MV-64360 ethernet port 1\n"); + } +#endif +#ifdef CONFIG_MV64340_ETH_2 + if (mv64340_eth_init(2)) { + printk(KERN_ERR + "Error registering MV-64360 ethernet port 2\n"); + } +#endif + return 0; +} + +/********************************************************************** + * mv64340_cleanup_module + * + * Registers the network drivers into the Linux kernel + * + * Input : N/A + * + * Output : N/A + **********************************************************************/ +static void __init mv64340_cleanup_module(void) +{ + /* Nothing to do here ! it's not a removable module */ +} + +module_init(mv64340_init_module); +module_exit(mv64340_cleanup_module); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Rabeeh Khoury, Assaf Hoffman, and Matthew Dharm"); +MODULE_DESCRIPTION("Ethernet driver for Marvell MV64340"); + +/************************************************************************* +************************************************************************** +************************************************************************** +* The second part is the low level driver of the gigE ethernet ports. * +************************************************************************** +************************************************************************** +*************************************************************************/ + + + + +/******************************************************************************** + * Marvell's Gigabit Ethernet controller low level driver + * + * DESCRIPTION: + * This file introduce low level API to Marvell's Gigabit Ethernet + * controller. This Gigabit Ethernet Controller driver API controls + * 1) Operations (i.e. port init, start, reset etc'). + * 2) Data flow (i.e. port send, receive etc'). + * Each Gigabit Ethernet port is controlled via ETH_PORT_INFO + * struct. + * This struct includes user configuration information as well as + * driver internal data needed for its operations. + * + * Supported Features: + * - This low level driver is OS independent. Allocating memory for + * the descriptor rings and buffers are not within the scope of + * this driver. + * - The user is free from Rx/Tx queue managing. + * - This low level driver introduce functionality API that enable + * the to operate Marvell's Gigabit Ethernet Controller in a + * convenient way. + * - Simple Gigabit Ethernet port operation API. + * - Simple Gigabit Ethernet port data flow API. + * - Data flow and operation API support per queue functionality. + * - Support cached descriptors for better performance. + * - Enable access to all four DRAM banks and internal SRAM memory + * spaces. + * - PHY access and control API. + * - Port control register configuration API. + * - Full control over Unicast and Multicast MAC configurations. + * + * Operation flow: + * + * Initialization phase + * This phase complete the initialization of the ETH_PORT_INFO + * struct. + * User information regarding port configuration has to be set + * prior to calling the port initialization routine. + * + * In this phase any port Tx/Rx activity is halted, MIB counters + * are cleared, PHY address is set according to user parameter and + * access to DRAM and internal SRAM memory spaces. + * + * Driver ring initialization + * Allocating memory for the descriptor rings and buffers is not + * within the scope of this driver. Thus, the user is required to + * allocate memory for the descriptors ring and buffers. Those + * memory parameters are used by the Rx and Tx ring initialization + * routines in order to curve the descriptor linked list in a form + * of a ring. + * Note: Pay special attention to alignment issues when using + * cached descriptors/buffers. In this phase the driver store + * information in the ETH_PORT_INFO struct regarding each queue + * ring. + * + * Driver start + * This phase prepares the Ethernet port for Rx and Tx activity. + * It uses the information stored in the ETH_PORT_INFO struct to + * initialize the various port registers. + * + * Data flow: + * All packet references to/from the driver are done using PKT_INFO + * struct. + * This struct is a unified struct used with Rx and Tx operations. + * This way the user is not required to be familiar with neither + * Tx nor Rx descriptors structures. + * The driver's descriptors rings are management by indexes. + * Those indexes controls the ring resources and used to indicate + * a SW resource error: + * 'current' + * This index points to the current available resource for use. For + * example in Rx process this index will point to the descriptor + * that will be passed to the user upon calling the receive routine. + * In Tx process, this index will point to the descriptor + * that will be assigned with the user packet info and transmitted. + * 'used' + * This index points to the descriptor that need to restore its + * resources. For example in Rx process, using the Rx buffer return + * API will attach the buffer returned in packet info to the + * descriptor pointed by 'used'. In Tx process, using the Tx + * descriptor return will merely return the user packet info with + * the command status of the transmitted buffer pointed by the + * 'used' index. Nevertheless, it is essential to use this routine + * to update the 'used' index. + * 'first' + * This index supports Tx Scatter-Gather. It points to the first + * descriptor of a packet assembled of multiple buffers. For example + * when in middle of Such packet we have a Tx resource error the + * 'curr' index get the value of 'first' to indicate that the ring + * returned to its state before trying to transmit this packet. + * + * Receive operation: + * The eth_port_receive API set the packet information struct, + * passed by the caller, with received information from the + * 'current' SDMA descriptor. + * It is the user responsibility to return this resource back + * to the Rx descriptor ring to enable the reuse of this source. + * Return Rx resource is done using the eth_rx_return_buff API. + * + * Transmit operation: + * The eth_port_send API supports Scatter-Gather which enables to + * send a packet spanned over multiple buffers. This means that + * for each packet info structure given by the user and put into + * the Tx descriptors ring, will be transmitted only if the 'LAST' + * bit will be set in the packet info command status field. This + * API also consider restriction regarding buffer alignments and + * sizes. + * The user must return a Tx resource after ensuring the buffer + * has been transmitted to enable the Tx ring indexes to update. + * + * BOARD LAYOUT + * This device is on-board. No jumper diagram is necessary. + * + * EXTERNAL INTERFACE + * + * Prior to calling the initialization routine eth_port_init() the user + * must set the following fields under ETH_PORT_INFO struct: + * port_num User Ethernet port number. + * port_mac_addr[6] User defined port MAC address. + * port_config User port configuration value. + * port_config_extend User port config extend value. + * port_sdma_config User port SDMA config value. + * port_serial_control User port serial control value. + * *port_private User scratch pad for user specific data structures. + * + * This driver introduce a set of default values: + * PORT_CONFIG_VALUE Default port configuration value + * PORT_CONFIG_EXTEND_VALUE Default port extend configuration value + * PORT_SDMA_CONFIG_VALUE Default sdma control value + * PORT_SERIAL_CONTROL_VALUE Default port serial control value + * + * This driver data flow is done using the PKT_INFO struct which is + * a unified struct for Rx and Tx operations: + * byte_cnt Tx/Rx descriptor buffer byte count. + * l4i_chk CPU provided TCP Checksum. For Tx operation only. + * cmd_sts Tx/Rx descriptor command status. + * buf_ptr Tx/Rx descriptor buffer pointer. + * return_info Tx/Rx user resource return information. + * + *******************************************************************************/ +/* includes */ + +/* defines */ +/* SDMA command macros */ +#define ETH_ENABLE_TX_QUEUE(eth_port) \ + MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port), 1) + +#define ETH_DISABLE_TX_QUEUE(eth_port) \ + MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port), (1 << 8)) + +#define ETH_ENABLE_RX_QUEUE(rx_queue, eth_port) \ +MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port), (1 << rx_queue)) + +#define ETH_DISABLE_RX_QUEUE(rx_queue, eth_port) \ +MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port), (1 << (8 + rx_queue))) + +#if 0 +#define CURR_RFD_GET(p_curr_desc) \ + ((p_curr_desc) = p_eth_port_ctrl->p_rx_curr_desc_q) + +#define CURR_RFD_SET(p_curr_desc) \ + (p_eth_port_ctrl->p_rx_curr_desc_q = (p_curr_desc)) + +#define USED_RFD_GET(p_used_desc) \ + ((p_used_desc) = p_eth_port_ctrl->p_rx_used_desc_q) + +#define USED_RFD_SET(p_used_desc)\ +(p_eth_port_ctrl->p_rx_used_desc_q = (p_used_desc)) + + +#define CURR_TFD_GET(p_curr_desc) \ + ((p_curr_desc) = p_eth_port_ctrl->p_tx_curr_desc_q) + +#define CURR_TFD_SET(p_curr_desc) \ + (p_eth_port_ctrl->p_tx_curr_desc_q = (p_curr_desc)) + +#define USED_TFD_GET(p_used_desc) \ + ((p_used_desc) = p_eth_port_ctrl->p_tx_used_desc_q) + +#define USED_TFD_SET(p_used_desc) \ + (p_eth_port_ctrl->p_tx_used_desc_q = (p_used_desc)) +#endif + +#define LINK_UP_TIMEOUT 100000 +#define PHY_BUSY_TIMEOUT 10000000 + +/* locals */ + +/* PHY routines */ +#ifdef MDD_CUT +static void ethernet_phy_set(ETH_PORT eth_port_num, int phy_addr); +#endif +static int ethernet_phy_get(ETH_PORT eth_port_num); + +/* Ethernet Port routines */ +static bool eth_port_uc_addr(ETH_PORT eth_port_num, + unsigned char uc_nibble, int option); + +#ifdef MDD_CUT +static void eth_b_copy(unsigned int src_addr, unsigned int dst_addr, + int byte_count); +#endif + +/******************************************************************************* +* eth_port_init - Initialize the Ethernet port driver +* +* DESCRIPTION: +* This function prepares the ethernet port to start its activity: +* 1) Completes the ethernet port driver struct initialization toward port +* start routine. +* 2) Resets the device to a quiescent state in case of warm reboot. +* 3) Enable SDMA access to all four DRAM banks as well as internal SRAM. +* 4) Clean MAC tables. The reset status of those tables is unknown. +* 5) Set PHY address. +* Note: Call this routine prior to eth_port_start routine and after setting +* user values in the user fields of Ethernet port control struct. +* +* INPUT: +* ETH_PORT_INFO *p_eth_port_ctrl Ethernet port control struct +* +* OUTPUT: +* See description. +* +* RETURN: +* None. +* +*******************************************************************************/ +static void eth_port_init(ETH_PORT_INFO * p_eth_port_ctrl) +{ + p_eth_port_ctrl->port_config = PORT_CONFIG_VALUE; + p_eth_port_ctrl->port_config_extend = PORT_CONFIG_EXTEND_VALUE; +#if defined(__BIG_ENDIAN) + p_eth_port_ctrl->port_sdma_config = PORT_SDMA_CONFIG_VALUE; +#elif defined(__LITTLE_ENDIAN) + p_eth_port_ctrl->port_sdma_config = PORT_SDMA_CONFIG_VALUE | + ETH_BLM_RX_NO_SWAP | ETH_BLM_TX_NO_SWAP; +#else +#error One of __LITTLE_ENDIAN or __BIG_ENDIAN must be defined! +#endif + p_eth_port_ctrl->port_serial_control = PORT_SERIAL_CONTROL_VALUE; + + p_eth_port_ctrl->port_rx_queue_command = 0; + p_eth_port_ctrl->port_tx_queue_command = 0; + + p_eth_port_ctrl->rx_resource_err = false; + p_eth_port_ctrl->tx_resource_err = false; + + eth_port_reset(p_eth_port_ctrl->port_num); + + eth_port_init_mac_tables(p_eth_port_ctrl->port_num); + + ethernet_phy_reset(p_eth_port_ctrl->port_num); +} + +/******************************************************************************* +* eth_port_start - Start the Ethernet port activity. +* +* DESCRIPTION: +* This routine prepares the Ethernet port for Rx and Tx activity: +* 1. Initialize Tx and Rx Current Descriptor Pointer for each queue that +* has been initialized a descriptor's ring (using ether_init_tx_desc_ring +* for Tx and ether_init_rx_desc_ring for Rx) +* 2. Initialize and enable the Ethernet configuration port by writing to +* the port's configuration and command registers. +* 3. Initialize and enable the SDMA by writing to the SDMA's +* configuration and command registers. +* After completing these steps, the ethernet port SDMA can starts to +* perform Rx and Tx activities. +* +* Note: Each Rx and Tx queue descriptor's list must be initialized prior +* to calling this function (use ether_init_tx_desc_ring for Tx queues and +* ether_init_rx_desc_ring for Rx queues). +* +* INPUT: +* ETH_PORT_INFO *p_eth_port_ctrl Ethernet port control struct +* +* OUTPUT: +* Ethernet port is ready to receive and transmit. +* +* RETURN: +* false if the port PHY is not up. +* true otherwise. +* +*******************************************************************************/ +static bool eth_port_start(ETH_PORT_INFO * p_eth_port_ctrl) +{ + int tx_curr_desc; + int rx_curr_desc; + unsigned int phy_reg_data; + ETH_PORT eth_port_num = p_eth_port_ctrl->port_num; + + /* Assignment of Tx CTRP of given queue */ + tx_curr_desc = p_eth_port_ctrl->tx_curr_desc_q; + MV_WRITE(MV64340_ETH_TX_CURRENT_QUEUE_DESC_PTR_0(eth_port_num), + virt_to_bus(&(p_eth_port_ctrl->p_tx_desc_area[tx_curr_desc]))); + + /* Assignment of Rx CRDP of given queue */ + rx_curr_desc = p_eth_port_ctrl->rx_curr_desc_q; + MV_WRITE(MV64340_ETH_RX_CURRENT_QUEUE_DESC_PTR_0(eth_port_num), + virt_to_bus(&(p_eth_port_ctrl->p_rx_desc_area[rx_curr_desc]))); + + /* Add the assigned Ethernet address to the port's address table */ + eth_port_uc_addr_set(p_eth_port_ctrl->port_num, + p_eth_port_ctrl->port_mac_addr); + + /* Assign port configuration and command. */ + MV_WRITE(MV64340_ETH_PORT_CONFIG_REG(eth_port_num), + p_eth_port_ctrl->port_config); + + MV_WRITE(MV64340_ETH_PORT_CONFIG_EXTEND_REG(eth_port_num), + p_eth_port_ctrl->port_config_extend); + + MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(eth_port_num), + p_eth_port_ctrl->port_serial_control); + + MV_SET_REG_BITS(MV64340_ETH_PORT_SERIAL_CONTROL_REG(eth_port_num), + ETH_SERIAL_PORT_ENABLE); + + /* Assign port SDMA configuration */ + MV_WRITE(MV64340_ETH_SDMA_CONFIG_REG(eth_port_num), + p_eth_port_ctrl->port_sdma_config); + + /* Enable port Rx. */ + MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(eth_port_num), + p_eth_port_ctrl->port_rx_queue_command); + + /* Check if link is up */ + eth_port_read_smi_reg(eth_port_num, 1, &phy_reg_data); + + if (!(phy_reg_data & 0x20)) + return false; + + return true; +} + +/******************************************************************************* +* eth_port_uc_addr_set - This function Set the port Unicast address. +* +* DESCRIPTION: +* This function Set the port Ethernet MAC address. +* +* INPUT: +* ETH_PORT eth_port_num Port number. +* char * p_addr Address to be set +* +* OUTPUT: +* Set MAC address low and high registers. also calls eth_port_uc_addr() +* To set the unicast table with the proper information. +* +* RETURN: +* N/A. +* +*******************************************************************************/ +static void eth_port_uc_addr_set(ETH_PORT eth_port_num, + unsigned char *p_addr) +{ + unsigned int mac_h; + unsigned int mac_l; + + mac_l = (p_addr[4] << 8) | (p_addr[5]); + mac_h = (p_addr[0] << 24) | (p_addr[1] << 16) | + (p_addr[2] << 8) | (p_addr[3] << 0); + + MV_WRITE(MV64340_ETH_MAC_ADDR_LOW(eth_port_num), mac_l); + MV_WRITE(MV64340_ETH_MAC_ADDR_HIGH(eth_port_num), mac_h); + + /* Accept frames of this address */ + eth_port_uc_addr(eth_port_num, p_addr[5], ACCEPT_MAC_ADDR); + + return; +} + +/******************************************************************************* +* eth_port_uc_addr - This function Set the port unicast address table +* +* DESCRIPTION: +* This function locates the proper entry in the Unicast table for the +* specified MAC nibble and sets its properties according to function +* parameters. +* +* INPUT: +* ETH_PORT eth_port_num Port number. +* unsigned char uc_nibble Unicast MAC Address last nibble. +* int option 0 = Add, 1 = remove address. +* +* OUTPUT: +* This function add/removes MAC addresses from the port unicast address +* table. +* +* RETURN: +* true is output succeeded. +* false if option parameter is invalid. +* +*******************************************************************************/ +static bool eth_port_uc_addr(ETH_PORT eth_port_num, + unsigned char uc_nibble, int option) +{ + unsigned int unicast_reg; + unsigned int tbl_offset; + unsigned int reg_offset; + + /* Locate the Unicast table entry */ + uc_nibble = (0xf & uc_nibble); + tbl_offset = (uc_nibble / 4) * 4; /* Register offset from unicast table base */ + reg_offset = uc_nibble % 4; /* Entry offset within the above register */ + + switch (option) { + case REJECT_MAC_ADDR: + /* Clear accepts frame bit at specified unicast DA table entry */ + unicast_reg = + MV_READ_DATA( + (MV64340_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + tbl_offset)); + + unicast_reg &= (0x0E << (8 * reg_offset)); + + MV_WRITE( + (MV64340_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + tbl_offset), unicast_reg); + break; + + case ACCEPT_MAC_ADDR: + /* Set accepts frame bit at unicast DA filter table entry */ + unicast_reg = + MV_READ_DATA( + (MV64340_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + tbl_offset)); + + unicast_reg |= (0x01 << (8 * reg_offset)); + + MV_WRITE( + (MV64340_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + tbl_offset), unicast_reg); + + break; + + default: + return false; + } + return true; +} + +/******************************************************************************* +* eth_port_init_mac_tables - Clear all entrance in the UC, SMC and OMC tables +* +* DESCRIPTION: +* Go through all the DA filter tables (Unicast, Special Multicast & Other +* Multicast) and set each entry to 0. +* +* INPUT: +* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. +* +* OUTPUT: +* Multicast and Unicast packets are rejected. +* +* RETURN: +* None. +* +*******************************************************************************/ +static void eth_port_init_mac_tables(ETH_PORT eth_port_num) +{ + int table_index; + + /* Clear DA filter unicast table (Ex_dFUT) */ + for (table_index = 0; table_index <= 0xC; table_index += 4) + MV_WRITE( + (MV64340_ETH_DA_FILTER_UNICAST_TABLE_BASE + (eth_port_num) + table_index), 0); + + for (table_index = 0; table_index <= 0xFC; table_index += 4) { + /* Clear DA filter special multicast table (Ex_dFSMT) */ + MV_WRITE( + (MV64340_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE + (eth_port_num) + table_index), 0); + /* Clear DA filter other multicast table (Ex_dFOMT) */ + MV_WRITE((MV64340_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE + (eth_port_num) + table_index), 0); + } +} + +/******************************************************************************* +* eth_clear_mib_counters - Clear all MIB counters +* +* DESCRIPTION: +* This function clears all MIB counters of a specific ethernet port. +* A read from the MIB counter will reset the counter. +* +* INPUT: +* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. +* +* OUTPUT: +* After reading all MIB counters, the counters resets. +* +* RETURN: +* MIB counter value. +* +*******************************************************************************/ +static void eth_clear_mib_counters(ETH_PORT eth_port_num) +{ + int i; + unsigned int dummy; + + /* Perform dummy reads from MIB counters */ + for (i = ETH_MIB_GOOD_OCTETS_RECEIVED_LOW; + i < ETH_MIB_LATE_COLLISION; i += 4) + dummy = + MV_READ_DATA( + (MV64340_ETH_MIB_COUNTERS_BASE + (eth_port_num) + i)); + + return; +} + + +#ifdef MDD_CUT +/******************************************************************************* +* ethernet_phy_set - Set the ethernet port PHY address. +* +* DESCRIPTION: +* This routine set the ethernet port PHY address according to given +* parameter. +* +* INPUT: +* ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. +* +* OUTPUT: +* Set PHY Address Register with given PHY address parameter. +* +* RETURN: +* None. +* +*******************************************************************************/ +static void ethernet_phy_set(ETH_PORT eth_port_num, int phy_addr) +{ + unsigned int reg_data; + + reg_data = MV_READ_DATA(MV64340_ETH_PHY_ADDR_REG); + + reg_data &= ~(0x1F << (5 * eth_port_num)); + reg_data |= (phy_addr << (5 * eth_port_num)); + + MV_WRITE(MV64340_ETH_PHY_ADDR_REG, reg_data); + + return; +} +#endif + +/******************************************************************************* + * ethernet_phy_get - Get the ethernet port PHY address. + * + * DESCRIPTION: + * This routine returns the given ethernet port PHY address. + * + * INPUT: + * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. + * + * OUTPUT: + * None. + * + * RETURN: + * PHY address. + * + *******************************************************************************/ +static int ethernet_phy_get(ETH_PORT eth_port_num) +{ + unsigned int reg_data; + + reg_data = MV_READ_DATA(MV64340_ETH_PHY_ADDR_REG); + + return ((reg_data >> (5 * eth_port_num)) & 0x1f); +} + +/******************************************************************************* + * ethernet_phy_reset - Reset Ethernet port PHY. + * + * DESCRIPTION: + * This routine utilize the SMI interface to reset the ethernet port PHY. + * The routine waits until the link is up again or link up is timeout. + * + * INPUT: + * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. + * + * OUTPUT: + * The ethernet port PHY renew its link. + * + * RETURN: + * None. + * +*******************************************************************************/ +static bool ethernet_phy_reset(ETH_PORT eth_port_num) +{ + unsigned int time_out = 50; + unsigned int phy_reg_data; + + /* Reset the PHY */ + eth_port_read_smi_reg(eth_port_num, 0, &phy_reg_data); + phy_reg_data |= 0x8000; /* Set bit 15 to reset the PHY */ + eth_port_write_smi_reg(eth_port_num, 0, phy_reg_data); + + /* Poll on the PHY LINK */ + do { + eth_port_read_smi_reg(eth_port_num, 1, &phy_reg_data); + + if (time_out-- == 0) + return false; + } + while (!(phy_reg_data & 0x20)); + + return true; +} + +/******************************************************************************* + * eth_port_reset - Reset Ethernet port + * + * DESCRIPTION: + * This routine resets the chip by aborting any SDMA engine activity and + * clearing the MIB counters. The Receiver and the Transmit unit are in + * idle state after this command is performed and the port is disabled. + * + * INPUT: + * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. + * + * OUTPUT: + * Channel activity is halted. + * + * RETURN: + * None. + * + *******************************************************************************/ +static void eth_port_reset(ETH_PORT eth_port_num) +{ + unsigned int reg_data; + + /* Stop Tx port activity. Check port Tx activity. */ + reg_data = + MV_READ_DATA(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(eth_port_num)); + + if (reg_data & 0xFF) { + /* Issue stop command for active channels only */ + MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG + (eth_port_num), (reg_data << 8)); + + /* Wait for all Tx activity to terminate. */ + do { + /* Check port cause register that all Tx queues are stopped */ + reg_data = + MV_READ_DATA + (MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG + (eth_port_num)); + } + while (reg_data & 0xFF); + } + + /* Stop Rx port activity. Check port Rx activity. */ + reg_data = + MV_READ_DATA(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG + (eth_port_num)); + + if (reg_data & 0xFF) { + /* Issue stop command for active channels only */ + MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG + (eth_port_num), (reg_data << 8)); + + /* Wait for all Rx activity to terminate. */ + do { + /* Check port cause register that all Rx queues are stopped */ + reg_data = + MV_READ_DATA + (MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG + (eth_port_num)); + } + while (reg_data & 0xFF); + } + + + /* Clear all MIB counters */ + eth_clear_mib_counters(eth_port_num); + + /* Reset the Enable bit in the Configuration Register */ + reg_data = + MV_READ_DATA(MV64340_ETH_PORT_SERIAL_CONTROL_REG (eth_port_num)); + reg_data &= ~ETH_SERIAL_PORT_ENABLE; + MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(eth_port_num), reg_data); + + return; +} + +/******************************************************************************* + * ethernet_set_config_reg - Set specified bits in configuration register. + * + * DESCRIPTION: + * This function sets specified bits in the given ethernet + * configuration register. + * + * INPUT: + * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. + * unsigned int value 32 bit value. + * + * OUTPUT: + * The set bits in the value parameter are set in the configuration + * register. + * + * RETURN: + * None. + * + *******************************************************************************/ +static void ethernet_set_config_reg(ETH_PORT eth_port_num, + unsigned int value) +{ + unsigned int eth_config_reg; + + eth_config_reg = + MV_READ_DATA(MV64340_ETH_PORT_CONFIG_REG(eth_port_num)); + eth_config_reg |= value; + MV_WRITE(MV64340_ETH_PORT_CONFIG_REG(eth_port_num), + eth_config_reg); + + return; +} + +/******************************************************************************* + * ethernet_get_config_reg - Get the port configuration register + * + * DESCRIPTION: + * This function returns the configuration register value of the given + * ethernet port. + * + * INPUT: + * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. + * + * OUTPUT: + * None. + * + * RETURN: + * Port configuration register value. + * + *******************************************************************************/ +static unsigned int ethernet_get_config_reg(ETH_PORT eth_port_num) +{ + unsigned int eth_config_reg; + + eth_config_reg = MV_READ_DATA(MV64340_ETH_PORT_CONFIG_EXTEND_REG + (eth_port_num)); + return eth_config_reg; +} + + +/******************************************************************************* + * eth_port_read_smi_reg - Read PHY registers + * + * DESCRIPTION: + * This routine utilize the SMI interface to interact with the PHY in + * order to perform PHY register read. + * + * INPUT: + * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. + * unsigned int phy_reg PHY register address offset. + * unsigned int *value Register value buffer. + * + * OUTPUT: + * Write the value of a specified PHY register into given buffer. + * + * RETURN: + * false if the PHY is busy or read data is not in valid state. + * true otherwise. + * + *******************************************************************************/ +static bool eth_port_read_smi_reg(ETH_PORT eth_port_num, + unsigned int phy_reg, + unsigned int *value) +{ + unsigned int reg_value; + unsigned int time_out = PHY_BUSY_TIMEOUT; + int phy_addr; + + phy_addr = ethernet_phy_get(eth_port_num); + + /* first check that it is not busy */ + do { + reg_value = MV_READ_DATA(MV64340_ETH_SMI_REG); + if (time_out-- == 0) { + return false; + } + } + while (reg_value & ETH_SMI_BUSY); + + /* not busy */ + + MV_WRITE(MV64340_ETH_SMI_REG, + (phy_addr << 16) | (phy_reg << 21) | ETH_SMI_OPCODE_READ); + + time_out = PHY_BUSY_TIMEOUT; /* initialize the time out var again */ + + do { + reg_value = MV_READ_DATA(MV64340_ETH_SMI_REG); + if (time_out-- == 0) { + return false; + } + } + while (reg_value & ETH_SMI_READ_VALID); + + /* Wait for the data to update in the SMI register */ + for (time_out = 0; time_out < PHY_BUSY_TIMEOUT; time_out++); + + reg_value = MV_READ_DATA(MV64340_ETH_SMI_REG); + + *value = reg_value & 0xffff; + + return true; +} + +/******************************************************************************* + * eth_port_write_smi_reg - Write to PHY registers + * + * DESCRIPTION: + * This routine utilize the SMI interface to interact with the PHY in + * order to perform writes to PHY registers. + * + * INPUT: + * ETH_PORT eth_port_num Ethernet Port number. See ETH_PORT enum. + * unsigned int phy_reg PHY register address offset. + * unsigned int value Register value. + * + * OUTPUT: + * Write the given value to the specified PHY register. + * + * RETURN: + * false if the PHY is busy. + * true otherwise. + * + *******************************************************************************/ +static bool eth_port_write_smi_reg(ETH_PORT eth_port_num, + unsigned int phy_reg, + unsigned int value) +{ + unsigned int reg_value; + unsigned int time_out = PHY_BUSY_TIMEOUT; + int phy_addr; + + phy_addr = ethernet_phy_get(eth_port_num); + + /* first check that it is not busy */ + do { + reg_value = MV_READ_DATA(MV64340_ETH_SMI_REG); + if (time_out-- == 0) { + return false; + } + } + while (reg_value & ETH_SMI_BUSY); + + /* not busy */ + MV_WRITE(MV64340_ETH_SMI_REG, (phy_addr << 16) | (phy_reg << 21) | + ETH_SMI_OPCODE_WRITE | (value & 0xffff)); + return true; +} + +/******************************************************************************* + * ether_init_rx_desc_ring - Curve a Rx chain desc list and buffer in memory. + * + * DESCRIPTION: + * This function prepares a Rx chained list of descriptors and packet + * buffers in a form of a ring. The routine must be called after port + * initialization routine and before port start routine. + * The Ethernet SDMA engine uses CPU bus addresses to access the various + * devices in the system (i.e. DRAM). This function uses the ethernet + * struct 'virtual to physical' routine (set by the user) to set the ring + * with physical addresses. + * + * INPUT: + * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. + * int rx_desc_num Number of Rx descriptors + * int rx_buff_size Size of Rx buffer + * unsigned int rx_desc_base_addr Rx descriptors memory area base addr. + * unsigned int rx_buff_base_addr Rx buffer memory area base addr. + * + * OUTPUT: + * The routine updates the Ethernet port control struct with information + * regarding the Rx descriptors and buffers. + * + * RETURN: + * false if the given descriptors memory area is not aligned according to + * Ethernet SDMA specifications. + * true otherwise. + * + *******************************************************************************/ +static bool ether_init_rx_desc_ring(ETH_PORT_INFO * p_eth_port_ctrl, + int rx_desc_num, + int rx_buff_size, + unsigned long rx_desc_base_addr, + unsigned long rx_buff_base_addr) +{ + volatile ETH_RX_DESC* p_rx_desc; + unsigned long buffer_addr; + int ix; /* a counter */ + + buffer_addr = rx_buff_base_addr; + + p_rx_desc = (ETH_RX_DESC *) rx_desc_base_addr; + + /* Rx desc Must be 4LW aligned (i.e. Descriptor_Address[3:0]=0000). */ + if (rx_buff_base_addr & 0xF) + return false; + + /* Rx buffers are limited to 64K bytes and Minimum size is 8 bytes */ + if ((rx_buff_size < 8) || (rx_buff_size > RX_BUFFER_MAX_SIZE)) + return false; + + /* Rx buffers must be 64-bit aligned. */ + if ((rx_buff_base_addr + rx_buff_size) & 0x7) + return false; + + /* initialize the Rx descriptors ring */ + for (ix = 0; ix < rx_desc_num; ix++) { + p_rx_desc[ix].buf_size = rx_buff_size; + p_rx_desc[ix].byte_cnt = 0x0000; + p_rx_desc[ix].cmd_sts = + ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT; + p_rx_desc[ix].next_desc_ptr = virt_to_bus(&(p_rx_desc[ix+1])); + p_rx_desc[ix].buf_ptr = buffer_addr; + + dma_cache_wback_inv((unsigned long)p_rx_desc, sizeof(ETH_RX_DESC)); + p_eth_port_ctrl->rx_skb[ix] = NULL; + buffer_addr += rx_buff_size; + } + + /* Closing Rx descriptors ring */ + p_rx_desc[rx_desc_num-1].next_desc_ptr = virt_to_bus(&(p_rx_desc[0])); + dma_cache_wback_inv((unsigned long)p_rx_desc, sizeof(ETH_RX_DESC)); + + /* Save Rx desc pointer to driver struct. */ + p_eth_port_ctrl->rx_curr_desc_q = 0; + p_eth_port_ctrl->rx_used_desc_q = 0; + + p_eth_port_ctrl->p_rx_desc_area = (ETH_RX_DESC *) rx_desc_base_addr; + p_eth_port_ctrl->rx_desc_area_size = rx_desc_num * sizeof(ETH_RX_DESC); + + p_eth_port_ctrl->port_rx_queue_command |= 1; + + return true; +} + +/******************************************************************************* + * ether_init_tx_desc_ring - Curve a Tx chain desc list and buffer in memory. + * + * DESCRIPTION: + * This function prepares a Tx chained list of descriptors and packet + * buffers in a form of a ring. The routine must be called after port + * initialization routine and before port start routine. + * The Ethernet SDMA engine uses CPU bus addresses to access the various + * devices in the system (i.e. DRAM). This function uses the ethernet + * struct 'virtual to physical' routine (set by the user) to set the ring + * with physical addresses. + * + * INPUT: + * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. + * int tx_desc_num Number of Tx descriptors + * int tx_buff_size Size of Tx buffer + * unsigned int tx_desc_base_addr Tx descriptors memory area base addr. + * + * OUTPUT: + * The routine updates the Ethernet port control struct with information + * regarding the Tx descriptors and buffers. + * + * RETURN: + * false if the given descriptors memory area is not aligned according to + * Ethernet SDMA specifications. + * true otherwise. + * + *******************************************************************************/ +static bool ether_init_tx_desc_ring(ETH_PORT_INFO * p_eth_port_ctrl, + int tx_desc_num, + unsigned long tx_desc_base_addr) +{ + + ETH_TX_DESC *p_tx_desc; + int ix; /* a counter */ + + /* Tx desc Must be 4LW aligned (i.e. Descriptor_Address[3:0]=0000). */ + if (tx_desc_base_addr & 0xF) + return false; + + /* save the first desc pointer to link with the last descriptor */ + p_tx_desc = (ETH_TX_DESC *) tx_desc_base_addr; + + /* Initialize the Tx descriptors ring */ + for (ix = 0; ix < tx_desc_num; ix++) { + p_tx_desc[ix].byte_cnt = 0x0000; + p_tx_desc[ix].l4i_chk = 0x0000; + p_tx_desc[ix].cmd_sts = 0x00000000; + p_tx_desc[ix].next_desc_ptr = virt_to_bus(&(p_tx_desc[ix+1])); + p_tx_desc[ix].buf_ptr = 0x00000000; + dma_cache_wback_inv((unsigned long)&(p_tx_desc[ix]), sizeof(ETH_TX_DESC)); + p_eth_port_ctrl->tx_skb[ix] = NULL; + } + + /* Closing Tx descriptors ring */ + p_tx_desc[tx_desc_num-1].next_desc_ptr = virt_to_bus(&(p_tx_desc[0])); + dma_cache_wback_inv((unsigned long)&(p_tx_desc[tx_desc_num-1]), + sizeof(ETH_TX_DESC)); + + /* Set Tx desc pointer in driver struct. */ + p_eth_port_ctrl->tx_curr_desc_q = 0; + p_eth_port_ctrl->tx_used_desc_q = 0; + + /* Init Tx ring base and size parameters */ + p_eth_port_ctrl->p_tx_desc_area = (ETH_TX_DESC*) tx_desc_base_addr; + p_eth_port_ctrl->tx_desc_area_size = tx_desc_num * sizeof(ETH_TX_DESC); + + /* Add the queue to the list of Tx queues of this port */ + p_eth_port_ctrl->port_tx_queue_command |= 1; + + return true; +} + +/******************************************************************************* + * eth_port_send - Send an Ethernet packet + * + * DESCRIPTION: + * This routine send a given packet described by p_pktinfo parameter. It + * supports transmitting of a packet spaned over multiple buffers. The + * routine updates 'curr' and 'first' indexes according to the packet + * segment passed to the routine. In case the packet segment is first, + * the 'first' index is update. In any case, the 'curr' index is updated. + * If the routine get into Tx resource error it assigns 'curr' index as + * 'first'. This way the function can abort Tx process of multiple + * descriptors per packet. + * + * INPUT: + * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. + * PKT_INFO *p_pkt_info User packet buffer. + * + * OUTPUT: + * Tx ring 'curr' and 'first' indexes are updated. + * + * RETURN: + * ETH_QUEUE_FULL in case of Tx resource error. + * ETH_ERROR in case the routine can not access Tx desc ring. + * ETH_QUEUE_LAST_RESOURCE if the routine uses the last Tx resource. + * ETH_OK otherwise. + * + *******************************************************************************/ +static ETH_FUNC_RET_STATUS eth_port_send(ETH_PORT_INFO * p_eth_port_ctrl, + PKT_INFO * p_pkt_info) +{ + int tx_desc_curr; + int tx_desc_used; + volatile ETH_TX_DESC* current_descriptor; + unsigned int command_status; + + /* Do not process Tx ring in case of Tx ring resource error */ + if (p_eth_port_ctrl->tx_resource_err == true) + return ETH_QUEUE_FULL; + + /* Get the Tx Desc ring indexes */ + tx_desc_curr = p_eth_port_ctrl->tx_curr_desc_q; + tx_desc_used = p_eth_port_ctrl->tx_used_desc_q; + current_descriptor = &(p_eth_port_ctrl->p_tx_desc_area[tx_desc_curr]); + + if (current_descriptor == NULL) + return ETH_ERROR; + + command_status = p_pkt_info->cmd_sts | ETH_ZERO_PADDING | ETH_GEN_CRC; + +/* XXX Is this for real ?!?!? */ + /* Buffers with a payload smaller than 8 bytes must be aligned to a + * 64-bit boundary. We use the memory allocated for Tx descriptor. + * This memory is located in TX_BUF_OFFSET_IN_DESC offset within the + * Tx descriptor. */ + if (p_pkt_info->byte_cnt <= 8) { + printk(KERN_ERR + "You have failed in the < 8 bytes errata - fixme\n"); + return ETH_ERROR; + } + current_descriptor->buf_ptr = p_pkt_info->buf_ptr; + current_descriptor->byte_cnt = p_pkt_info->byte_cnt; + p_eth_port_ctrl->tx_skb[tx_desc_curr] = + (struct sk_buff*)p_pkt_info->return_info; + + mb(); + + /* Set last desc with DMA ownership and interrupt enable. */ + current_descriptor->cmd_sts = command_status | + ETH_BUFFER_OWNED_BY_DMA | ETH_TX_ENABLE_INTERRUPT; + +#if 0 + /* Flush CPU pipe */ + dma_cache_wback_inv(current_descriptor, sizeof(ETH_TX_DESC)); + mb(); +#endif + + /* Apply send command */ + ETH_ENABLE_TX_QUEUE(p_eth_port_ctrl->port_num); + + /* Finish Tx packet. Update first desc in case of Tx resource error */ + tx_desc_curr = (tx_desc_curr + 1) % MV64340_TX_QUEUE_SIZE; + + /* Update the current descriptor */ + p_eth_port_ctrl->tx_curr_desc_q = tx_desc_curr; + + /* Check for ring index overlap in the Tx desc ring */ + if (tx_desc_curr == tx_desc_used) { + p_eth_port_ctrl->tx_resource_err = true; + return ETH_QUEUE_LAST_RESOURCE; + } + + return ETH_OK; +} + +/******************************************************************************* + * eth_tx_return_desc - Free all used Tx descriptors + * + * DESCRIPTION: + * This routine returns the transmitted packet information to the caller. + * It uses the 'first' index to support Tx desc return in case a transmit + * of a packet spanned over multiple buffer still in process. + * In case the Tx queue was in "resource error" condition, where there are + * no available Tx resources, the function resets the resource error flag. + * + * INPUT: + * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. + * PKT_INFO *p_pkt_info User packet buffer. + * + * OUTPUT: + * Tx ring 'first' and 'used' indexes are updated. + * + * RETURN: + * ETH_ERROR in case the routine can not access Tx desc ring. + * ETH_RETRY in case there is transmission in process. + * ETH_END_OF_JOB if the routine has nothing to release. + * ETH_OK otherwise. + * + *******************************************************************************/ +static ETH_FUNC_RET_STATUS eth_tx_return_desc(ETH_PORT_INFO * p_eth_port_ctrl, + PKT_INFO * p_pkt_info) +{ + int tx_desc_used, tx_desc_curr; + volatile ETH_TX_DESC *p_tx_desc_used; + unsigned int command_status; + + /* Get the Tx Desc ring indexes */ + tx_desc_curr = p_eth_port_ctrl->tx_curr_desc_q; + tx_desc_used = p_eth_port_ctrl->tx_used_desc_q; + p_tx_desc_used = &(p_eth_port_ctrl->p_tx_desc_area[tx_desc_used]); + + /* XXX Sanity check */ + if (p_tx_desc_used == NULL) + return ETH_ERROR; + + command_status = p_tx_desc_used->cmd_sts; + + /* Still transmitting... */ + if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) { + dma_cache_wback_inv((unsigned long)p_tx_desc_used, + sizeof(ETH_TX_DESC)); + return ETH_RETRY; + } + + /* Stop release. About to overlap the current available Tx descriptor */ + if ((tx_desc_used == tx_desc_curr) && + (p_eth_port_ctrl->tx_resource_err == false)) { + dma_cache_wback_inv((unsigned long)p_tx_desc_used, + sizeof(ETH_TX_DESC)); + return ETH_END_OF_JOB; + } + + /* Pass the packet information to the caller */ + p_pkt_info->cmd_sts = command_status; + p_pkt_info->return_info = p_eth_port_ctrl->tx_skb[tx_desc_used]; + p_eth_port_ctrl->tx_skb[tx_desc_used] = NULL; + + /* Update the next descriptor to release. */ + p_eth_port_ctrl->tx_used_desc_q = + (tx_desc_used + 1) % MV64340_TX_QUEUE_SIZE; + + /* Any Tx return cancels the Tx resource error status */ + if (p_eth_port_ctrl->tx_resource_err == true) + p_eth_port_ctrl->tx_resource_err = false; + + dma_cache_wback_inv((unsigned long)p_tx_desc_used, sizeof(ETH_TX_DESC)); + + return ETH_OK; +} + +/******************************************************************************* + * eth_port_receive - Get received information from Rx ring. + * + * DESCRIPTION: + * This routine returns the received data to the caller. There is no + * data copying during routine operation. All information is returned + * using pointer to packet information struct passed from the caller. + * If the routine exhausts Rx ring resources then the resource error flag + * is set. + * + * INPUT: + * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. + * PKT_INFO *p_pkt_info User packet buffer. + * + * OUTPUT: + * Rx ring current and used indexes are updated. + * + * RETURN: + * ETH_ERROR in case the routine can not access Rx desc ring. + * ETH_QUEUE_FULL if Rx ring resources are exhausted. + * ETH_END_OF_JOB if there is no received data. + * ETH_OK otherwise. + * + *******************************************************************************/ +static ETH_FUNC_RET_STATUS eth_port_receive(ETH_PORT_INFO * + p_eth_port_ctrl, + PKT_INFO * p_pkt_info) +{ + int rx_curr_desc; + int rx_next_curr_desc; + int rx_used_desc; + unsigned int command_status; + volatile ETH_RX_DESC* p_rx_desc; + + /* Do not process Rx ring in case of Rx ring resource error */ + if (p_eth_port_ctrl->rx_resource_err == true) + return ETH_QUEUE_FULL; + + /* Get the Rx Desc ring 'curr and 'used' indexes */ + rx_curr_desc = p_eth_port_ctrl->rx_curr_desc_q; + rx_used_desc = p_eth_port_ctrl->rx_used_desc_q; + + p_rx_desc = &(p_eth_port_ctrl->p_rx_desc_area[rx_curr_desc]); + + /* The following parameters are used to save readings from memory */ + command_status = p_rx_desc->cmd_sts; + + /* Nothing to receive... */ + if (command_status & (ETH_BUFFER_OWNED_BY_DMA)) { + dma_cache_wback_inv((unsigned long)p_rx_desc, sizeof(ETH_RX_DESC)); + return ETH_END_OF_JOB; + } + + p_pkt_info->byte_cnt = (p_rx_desc->byte_cnt) - RX_BUF_OFFSET; + p_pkt_info->cmd_sts = command_status; + p_pkt_info->buf_ptr = (p_rx_desc->buf_ptr) + RX_BUF_OFFSET; + p_pkt_info->return_info = p_eth_port_ctrl->rx_skb[rx_curr_desc]; + p_pkt_info->l4i_chk = p_rx_desc->buf_size; + + /* Clean the return info field to indicate that the packet has been */ + /* moved to the upper layers */ + p_eth_port_ctrl->rx_skb[rx_curr_desc] = NULL; + + /* Update current index in data structure */ + rx_next_curr_desc = (rx_curr_desc + 1) % MV64340_RX_QUEUE_SIZE; + p_eth_port_ctrl->rx_curr_desc_q = rx_next_curr_desc; + + /* Rx descriptors exhausted. Set the Rx ring resource error flag */ + if (rx_next_curr_desc == rx_used_desc) + p_eth_port_ctrl->rx_resource_err = true; + + dma_cache_wback_inv((unsigned long)p_rx_desc, sizeof(ETH_RX_DESC)); + mb(); + return ETH_OK; +} + +/******************************************************************************* + * eth_rx_return_buff - Returns a Rx buffer back to the Rx ring. + * + * DESCRIPTION: + * This routine returns a Rx buffer back to the Rx ring. It retrieves the + * next 'used' descriptor and attached the returned buffer to it. + * In case the Rx ring was in "resource error" condition, where there are + * no available Rx resources, the function resets the resource error flag. + * + * INPUT: + * ETH_PORT_INFO *p_eth_port_ctrl Ethernet Port Control srtuct. + * PKT_INFO *p_pkt_info Information on the returned buffer. + * + * OUTPUT: + * New available Rx resource in Rx descriptor ring. + * + * RETURN: + * ETH_ERROR in case the routine can not access Rx desc ring. + * ETH_OK otherwise. + * + *******************************************************************************/ +static ETH_FUNC_RET_STATUS eth_rx_return_buff(ETH_PORT_INFO * p_eth_port_ctrl, + PKT_INFO * p_pkt_info) +{ + int used_rx_desc; /* Where to return Rx resource */ + volatile ETH_RX_DESC* p_used_rx_desc; + + /* Get 'used' Rx descriptor */ + used_rx_desc = p_eth_port_ctrl->rx_used_desc_q; + p_used_rx_desc = &(p_eth_port_ctrl->p_rx_desc_area[used_rx_desc]); + + p_used_rx_desc->buf_ptr = p_pkt_info->buf_ptr; + p_used_rx_desc->buf_size = p_pkt_info->byte_cnt; + p_eth_port_ctrl->rx_skb[used_rx_desc] = p_pkt_info->return_info; + + /* Flush the write pipe */ + mb(); + + /* Return the descriptor to DMA ownership */ + p_used_rx_desc->cmd_sts = + ETH_BUFFER_OWNED_BY_DMA | ETH_RX_ENABLE_INTERRUPT; + + /* Flush descriptor and CPU pipe */ + dma_cache_wback_inv((unsigned long)p_used_rx_desc, sizeof(ETH_RX_DESC)); + mb(); + + /* Move the used descriptor pointer to the next descriptor */ + p_eth_port_ctrl->rx_used_desc_q = + (used_rx_desc + 1) % MV64340_RX_QUEUE_SIZE; + + /* Any Rx return cancels the Rx resource error status */ + if (p_eth_port_ctrl->rx_resource_err == true) + p_eth_port_ctrl->rx_resource_err = false; + + return ETH_OK; +} + +#ifdef MDD_CUT +/******************************************************************************* + * eth_port_set_rx_coal - Sets coalescing interrupt mechanism on RX path + * + * DESCRIPTION: + * This routine sets the RX coalescing interrupt mechanism parameter. + * This parameter is a timeout counter, that counts in 64 t_clk + * chunks ; that when timeout event occurs a maskable interrupt + * occurs. + * The parameter is calculated using the tClk of the MV-643xx chip + * , and the required delay of the interrupt in usec. + * + * INPUT: + * ETH_PORT eth_port_num Ethernet port number + * unsigned int t_clk t_clk of the MV-643xx chip in HZ units + * unsigned int delay Delay in usec + * + * OUTPUT: + * Interrupt coalescing mechanism value is set in MV-643xx chip. + * + * RETURN: + * The interrupt coalescing value set in the gigE port. + * + *******************************************************************************/ +static unsigned int eth_port_set_rx_coal(ETH_PORT eth_port_num, + unsigned int t_clk, + unsigned int delay) +{ + unsigned int coal; + coal = ((t_clk / 1000000) * delay) / 64; + /* Set RX Coalescing mechanism */ + MV_WRITE(MV64340_ETH_SDMA_CONFIG_REG(eth_port_num), + ((coal & 0x3fff) << 8) | + (MV_READ_DATA(MV64340_ETH_SDMA_CONFIG_REG(eth_port_num)) + & 0xffc000ff)); + return coal; +} + +/******************************************************************************* + * eth_port_set_tx_coal - Sets coalescing interrupt mechanism on TX path + * + * DESCRIPTION: + * This routine sets the TX coalescing interrupt mechanism parameter. + * This parameter is a timeout counter, that counts in 64 t_clk + * chunks ; that when timeout event occurs a maskable interrupt + * occurs. + * The parameter is calculated using the t_cLK frequency of the + * MV-643xx chip and the required delay in the interrupt in uSec + * + * INPUT: + * ETH_PORT eth_port_num Ethernet port number + * unsigned int t_clk t_clk of the MV-643xx chip in HZ units + * unsigned int delay Delay in uSeconds + * + * OUTPUT: + * Interrupt coalescing mechanism value is set in MV-643xx chip. + * + * RETURN: + * The interrupt coalescing value set in the gigE port. + * + *******************************************************************************/ +static unsigned int eth_port_set_tx_coal(ETH_PORT eth_port_num, + unsigned int t_clk, + unsigned int delay) +{ + unsigned int coal; + coal = ((t_clk / 1000000) * delay) / 64; + /* Set TX Coalescing mechanism */ + MV_WRITE(MV64340_ETH_TX_FIFO_URGENT_THRESHOLD_REG(eth_port_num), + coal << 4); + return coal; +} + +/******************************************************************************* + * eth_b_copy - Copy bytes from source to destination + * + * DESCRIPTION: + * This function supports the eight bytes limitation on Tx buffer size. + * The routine will zero eight bytes starting from the destination address + * followed by copying bytes from the source address to the destination. + * + * INPUT: + * unsigned int src_addr 32 bit source address. + * unsigned int dst_addr 32 bit destination address. + * int byte_count Number of bytes to copy. + * + * OUTPUT: + * See description. + * + * RETURN: + * None. + * + *******************************************************************************/ +static void eth_b_copy(unsigned int src_addr, unsigned int dst_addr, + int byte_count) +{ + /* Zero the dst_addr area */ + *(unsigned int *) dst_addr = 0x0; + + while (byte_count != 0) { + *(char *) dst_addr = *(char *) src_addr; + dst_addr++; + src_addr++; + byte_count--; + } +} +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/mv64340_eth.h linux-2.4.23-pre8/drivers/net/mv64340_eth.h --- linux-2.4.22/drivers/net/mv64340_eth.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/mv64340_eth.h 2003-10-22 22:47:37.000000000 +0000 @@ -0,0 +1,630 @@ +#ifndef __MV64340_ETH_H__ +#define __MV64340_ETH_H__ + +#include +#include +#include +#include +#include +#include + +#include + +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +/************************************************************************* +************************************************************************** +************************************************************************** +* The first part is the high level driver of the gigE ethernet ports. * +************************************************************************** +************************************************************************** +*************************************************************************/ + +#define ETH_PORT0_IRQ_NUM 48 /* main high register, bit0 */ +#define ETH_PORT1_IRQ_NUM ETH_PORT0_IRQ_NUM+1 /* main high register, bit1 */ +#define ETH_PORT2_IRQ_NUM ETH_PORT0_IRQ_NUM+2 /* main high register, bit1 */ + +/* + * Number of RX / TX descriptors on RX / TX rings. + * Note that allocating RX descriptors is done by allocating the RX + * ring AND a preallocated RX buffers (skb's) for each descriptor. + * The TX descriptors only allocates the TX descriptors ring, + * with no pre allocated TX buffers (skb's are allocated by higher layers. + */ + +/* Default TX ring size is 1000 descriptors */ +#define MV64340_TX_QUEUE_SIZE 1000 + +/* Default RX ring size is 400 descriptors */ +#define MV64340_RX_QUEUE_SIZE 400 + +#define MV64340_TX_COAL 200 +#define MV64340_RX_COAL 200 + +/* Private data structure used for ethernet device */ +struct mv64340_eth_priv { + unsigned int port_num; + struct net_device_stats stats; + spinlock_t lock; + /* Size of Tx Ring per queue */ + unsigned int tx_ring_size; + /* Ammont of SKBs outstanding on Tx queue */ + unsigned int tx_ring_skbs; + /* Size of Rx Ring per queue */ + unsigned int rx_ring_size; + /* Ammount of SKBs allocated to Rx Ring per queue */ + unsigned int rx_ring_skbs; + + /* + * rx_task used to fill RX ring out of bottom half context + */ + struct tq_struct rx_task; + + /* + * Used in case RX Ring is empty, which can be caused when + * system does not have resources (skb's) + */ + struct timer_list timeout; + long rx_task_busy __attribute__ ((aligned(SMP_CACHE_BYTES))); + unsigned rx_timer_flag; + + u32 rx_int_coal; + u32 tx_int_coal; +}; + + +/************************************************************************* +************************************************************************** +************************************************************************** +* The second part is the low level driver of the gigE ethernet ports. * +************************************************************************** +************************************************************************** +*************************************************************************/ + + +/******************************************************************************** + * Header File for : MV-643xx network interface header + * + * DESCRIPTION: + * This header file contains macros typedefs and function declaration for + * the Marvell Gig Bit Ethernet Controller. + * + * DEPENDENCIES: + * None. + * + *******************************************************************************/ + +typedef enum _bool { false, true } bool; + +/* defines */ + +/* Default port configuration value */ +#define PORT_CONFIG_VALUE \ + ETH_UNICAST_NORMAL_MODE | \ + ETH_DEFAULT_RX_QUEUE_0 | \ + ETH_DEFAULT_RX_ARP_QUEUE_0 | \ + ETH_RECEIVE_BC_IF_NOT_IP_OR_ARP | \ + ETH_RECEIVE_BC_IF_IP | \ + ETH_RECEIVE_BC_IF_ARP | \ + ETH_CAPTURE_TCP_FRAMES_DIS | \ + ETH_CAPTURE_UDP_FRAMES_DIS | \ + ETH_DEFAULT_RX_TCP_QUEUE_0 | \ + ETH_DEFAULT_RX_UDP_QUEUE_0 | \ + ETH_DEFAULT_RX_BPDU_QUEUE_0 + +/* Default port extend configuration value */ +#define PORT_CONFIG_EXTEND_VALUE \ + ETH_SPAN_BPDU_PACKETS_AS_NORMAL | \ + ETH_PARTITION_DISABLE + + +/* Default sdma control value */ +#define PORT_SDMA_CONFIG_VALUE \ + ETH_RX_BURST_SIZE_4_64BIT | \ + GT_ETH_IPG_INT_RX(0) | \ + ETH_TX_BURST_SIZE_4_64BIT; + +#define GT_ETH_IPG_INT_RX(value) \ + ((value & 0x3fff) << 8) + +/* Default port serial control value */ +#define PORT_SERIAL_CONTROL_VALUE \ + ETH_FORCE_LINK_PASS | \ + ETH_ENABLE_AUTO_NEG_FOR_DUPLX | \ + ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL | \ + ETH_ADV_SYMMETRIC_FLOW_CTRL | \ + ETH_FORCE_FC_MODE_NO_PAUSE_DIS_TX | \ + ETH_FORCE_BP_MODE_NO_JAM | \ + BIT9 | \ + ETH_DO_NOT_FORCE_LINK_FAIL | \ + ETH_RETRANSMIT_16_ATTEMPTS | \ + ETH_ENABLE_AUTO_NEG_SPEED_GMII | \ + ETH_DTE_ADV_0 | \ + ETH_DISABLE_AUTO_NEG_BYPASS | \ + ETH_AUTO_NEG_NO_CHANGE | \ + ETH_MAX_RX_PACKET_1552BYTE | \ + ETH_CLR_EXT_LOOPBACK | \ + ETH_SET_FULL_DUPLEX_MODE | \ + ETH_ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX + +#define RX_BUFFER_MAX_SIZE 0x4000000 +#define TX_BUFFER_MAX_SIZE 0x4000000 + +/* MAC accepet/reject macros */ +#define ACCEPT_MAC_ADDR 0 +#define REJECT_MAC_ADDR 1 + +/* Buffer offset from buffer pointer */ +#define RX_BUF_OFFSET 0x2 + +/* Gigabit Ethernet Unit Global Registers */ + +/* MIB Counters register definitions */ +#define ETH_MIB_GOOD_OCTETS_RECEIVED_LOW 0x0 +#define ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH 0x4 +#define ETH_MIB_BAD_OCTETS_RECEIVED 0x8 +#define ETH_MIB_INTERNAL_MAC_TRANSMIT_ERR 0xc +#define ETH_MIB_GOOD_FRAMES_RECEIVED 0x10 +#define ETH_MIB_BAD_FRAMES_RECEIVED 0x14 +#define ETH_MIB_BROADCAST_FRAMES_RECEIVED 0x18 +#define ETH_MIB_MULTICAST_FRAMES_RECEIVED 0x1c +#define ETH_MIB_FRAMES_64_OCTETS 0x20 +#define ETH_MIB_FRAMES_65_TO_127_OCTETS 0x24 +#define ETH_MIB_FRAMES_128_TO_255_OCTETS 0x28 +#define ETH_MIB_FRAMES_256_TO_511_OCTETS 0x2c +#define ETH_MIB_FRAMES_512_TO_1023_OCTETS 0x30 +#define ETH_MIB_FRAMES_1024_TO_MAX_OCTETS 0x34 +#define ETH_MIB_GOOD_OCTETS_SENT_LOW 0x38 +#define ETH_MIB_GOOD_OCTETS_SENT_HIGH 0x3c +#define ETH_MIB_GOOD_FRAMES_SENT 0x40 +#define ETH_MIB_EXCESSIVE_COLLISION 0x44 +#define ETH_MIB_MULTICAST_FRAMES_SENT 0x48 +#define ETH_MIB_BROADCAST_FRAMES_SENT 0x4c +#define ETH_MIB_UNREC_MAC_CONTROL_RECEIVED 0x50 +#define ETH_MIB_FC_SENT 0x54 +#define ETH_MIB_GOOD_FC_RECEIVED 0x58 +#define ETH_MIB_BAD_FC_RECEIVED 0x5c +#define ETH_MIB_UNDERSIZE_RECEIVED 0x60 +#define ETH_MIB_FRAGMENTS_RECEIVED 0x64 +#define ETH_MIB_OVERSIZE_RECEIVED 0x68 +#define ETH_MIB_JABBER_RECEIVED 0x6c +#define ETH_MIB_MAC_RECEIVE_ERROR 0x70 +#define ETH_MIB_BAD_CRC_EVENT 0x74 +#define ETH_MIB_COLLISION 0x78 +#define ETH_MIB_LATE_COLLISION 0x7c + +/* Port serial status reg (PSR) */ +#define ETH_INTERFACE_GMII_MII 0 +#define ETH_INTERFACE_PCM BIT0 +#define ETH_LINK_IS_DOWN 0 +#define ETH_LINK_IS_UP BIT1 +#define ETH_PORT_AT_HALF_DUPLEX 0 +#define ETH_PORT_AT_FULL_DUPLEX BIT2 +#define ETH_RX_FLOW_CTRL_DISABLED 0 +#define ETH_RX_FLOW_CTRL_ENBALED BIT3 +#define ETH_GMII_SPEED_100_10 0 +#define ETH_GMII_SPEED_1000 BIT4 +#define ETH_MII_SPEED_10 0 +#define ETH_MII_SPEED_100 BIT5 +#define ETH_NO_TX 0 +#define ETH_TX_IN_PROGRESS BIT7 +#define ETH_BYPASS_NO_ACTIVE 0 +#define ETH_BYPASS_ACTIVE BIT8 +#define ETH_PORT_NOT_AT_PARTITION_STATE 0 +#define ETH_PORT_AT_PARTITION_STATE BIT9 +#define ETH_PORT_TX_FIFO_NOT_EMPTY 0 +#define ETH_PORT_TX_FIFO_EMPTY BIT10 + + +/* These macros describes the Port configuration reg (Px_cR) bits */ +#define ETH_UNICAST_NORMAL_MODE 0 +#define ETH_UNICAST_PROMISCUOUS_MODE BIT0 +#define ETH_DEFAULT_RX_QUEUE_0 0 +#define ETH_DEFAULT_RX_QUEUE_1 BIT1 +#define ETH_DEFAULT_RX_QUEUE_2 BIT2 +#define ETH_DEFAULT_RX_QUEUE_3 (BIT2 | BIT1) +#define ETH_DEFAULT_RX_QUEUE_4 BIT3 +#define ETH_DEFAULT_RX_QUEUE_5 (BIT3 | BIT1) +#define ETH_DEFAULT_RX_QUEUE_6 (BIT3 | BIT2) +#define ETH_DEFAULT_RX_QUEUE_7 (BIT3 | BIT2 | BIT1) +#define ETH_DEFAULT_RX_ARP_QUEUE_0 0 +#define ETH_DEFAULT_RX_ARP_QUEUE_1 BIT4 +#define ETH_DEFAULT_RX_ARP_QUEUE_2 BIT5 +#define ETH_DEFAULT_RX_ARP_QUEUE_3 (BIT5 | BIT4) +#define ETH_DEFAULT_RX_ARP_QUEUE_4 BIT6 +#define ETH_DEFAULT_RX_ARP_QUEUE_5 (BIT6 | BIT4) +#define ETH_DEFAULT_RX_ARP_QUEUE_6 (BIT6 | BIT5) +#define ETH_DEFAULT_RX_ARP_QUEUE_7 (BIT6 | BIT5 | BIT4) +#define ETH_RECEIVE_BC_IF_NOT_IP_OR_ARP 0 +#define ETH_REJECT_BC_IF_NOT_IP_OR_ARP BIT7 +#define ETH_RECEIVE_BC_IF_IP 0 +#define ETH_REJECT_BC_IF_IP BIT8 +#define ETH_RECEIVE_BC_IF_ARP 0 +#define ETH_REJECT_BC_IF_ARP BIT9 +#define ETH_TX_AM_NO_UPDATE_ERROR_SUMMARY BIT12 +#define ETH_CAPTURE_TCP_FRAMES_DIS 0 +#define ETH_CAPTURE_TCP_FRAMES_EN BIT14 +#define ETH_CAPTURE_UDP_FRAMES_DIS 0 +#define ETH_CAPTURE_UDP_FRAMES_EN BIT15 +#define ETH_DEFAULT_RX_TCP_QUEUE_0 0 +#define ETH_DEFAULT_RX_TCP_QUEUE_1 BIT16 +#define ETH_DEFAULT_RX_TCP_QUEUE_2 BIT17 +#define ETH_DEFAULT_RX_TCP_QUEUE_3 (BIT17 | BIT16) +#define ETH_DEFAULT_RX_TCP_QUEUE_4 BIT18 +#define ETH_DEFAULT_RX_TCP_QUEUE_5 (BIT18 | BIT16) +#define ETH_DEFAULT_RX_TCP_QUEUE_6 (BIT18 | BIT17) +#define ETH_DEFAULT_RX_TCP_QUEUE_7 (BIT18 | BIT17 | BIT16) +#define ETH_DEFAULT_RX_UDP_QUEUE_0 0 +#define ETH_DEFAULT_RX_UDP_QUEUE_1 BIT19 +#define ETH_DEFAULT_RX_UDP_QUEUE_2 BIT20 +#define ETH_DEFAULT_RX_UDP_QUEUE_3 (BIT20 | BIT19) +#define ETH_DEFAULT_RX_UDP_QUEUE_4 (BIT21 +#define ETH_DEFAULT_RX_UDP_QUEUE_5 (BIT21 | BIT19) +#define ETH_DEFAULT_RX_UDP_QUEUE_6 (BIT21 | BIT20) +#define ETH_DEFAULT_RX_UDP_QUEUE_7 (BIT21 | BIT20 | BIT19) +#define ETH_DEFAULT_RX_BPDU_QUEUE_0 0 +#define ETH_DEFAULT_RX_BPDU_QUEUE_1 BIT22 +#define ETH_DEFAULT_RX_BPDU_QUEUE_2 BIT23 +#define ETH_DEFAULT_RX_BPDU_QUEUE_3 (BIT23 | BIT22) +#define ETH_DEFAULT_RX_BPDU_QUEUE_4 BIT24 +#define ETH_DEFAULT_RX_BPDU_QUEUE_5 (BIT24 | BIT22) +#define ETH_DEFAULT_RX_BPDU_QUEUE_6 (BIT24 | BIT23) +#define ETH_DEFAULT_RX_BPDU_QUEUE_7 (BIT24 | BIT23 | BIT22) + + +/* These macros describes the Port configuration extend reg (Px_cXR) bits*/ +#define ETH_CLASSIFY_EN BIT0 +#define ETH_SPAN_BPDU_PACKETS_AS_NORMAL 0 +#define ETH_SPAN_BPDU_PACKETS_TO_RX_QUEUE_7 BIT1 +#define ETH_PARTITION_DISABLE 0 +#define ETH_PARTITION_ENABLE BIT2 + + +/* Tx/Rx queue command reg (RQCR/TQCR)*/ +#define ETH_QUEUE_0_ENABLE BIT0 +#define ETH_QUEUE_1_ENABLE BIT1 +#define ETH_QUEUE_2_ENABLE BIT2 +#define ETH_QUEUE_3_ENABLE BIT3 +#define ETH_QUEUE_4_ENABLE BIT4 +#define ETH_QUEUE_5_ENABLE BIT5 +#define ETH_QUEUE_6_ENABLE BIT6 +#define ETH_QUEUE_7_ENABLE BIT7 +#define ETH_QUEUE_0_DISABLE BIT8 +#define ETH_QUEUE_1_DISABLE BIT9 +#define ETH_QUEUE_2_DISABLE BIT10 +#define ETH_QUEUE_3_DISABLE BIT11 +#define ETH_QUEUE_4_DISABLE BIT12 +#define ETH_QUEUE_5_DISABLE BIT13 +#define ETH_QUEUE_6_DISABLE BIT14 +#define ETH_QUEUE_7_DISABLE BIT15 + + +/* These macros describes the Port Sdma configuration reg (SDCR) bits */ +#define ETH_RIFB BIT0 +#define ETH_RX_BURST_SIZE_1_64BIT 0 +#define ETH_RX_BURST_SIZE_2_64BIT BIT1 +#define ETH_RX_BURST_SIZE_4_64BIT BIT2 +#define ETH_RX_BURST_SIZE_8_64BIT (BIT2 | BIT1) +#define ETH_RX_BURST_SIZE_16_64BIT BIT3 +#define ETH_BLM_RX_NO_SWAP BIT4 +#define ETH_BLM_RX_BYTE_SWAP 0 +#define ETH_BLM_TX_NO_SWAP BIT5 +#define ETH_BLM_TX_BYTE_SWAP 0 +#define ETH_DESCRIPTORS_BYTE_SWAP BIT6 +#define ETH_DESCRIPTORS_NO_SWAP 0 +#define ETH_TX_BURST_SIZE_1_64BIT 0 +#define ETH_TX_BURST_SIZE_2_64BIT BIT22 +#define ETH_TX_BURST_SIZE_4_64BIT BIT23 +#define ETH_TX_BURST_SIZE_8_64BIT (BIT23 | BIT22) +#define ETH_TX_BURST_SIZE_16_64BIT BIT24 + + + +/* These macros describes the Port serial control reg (PSCR) bits */ +#define ETH_SERIAL_PORT_DISABLE 0 +#define ETH_SERIAL_PORT_ENABLE BIT0 +#define ETH_FORCE_LINK_PASS BIT1 +#define ETH_DO_NOT_FORCE_LINK_PASS 0 +#define ETH_ENABLE_AUTO_NEG_FOR_DUPLX 0 +#define ETH_DISABLE_AUTO_NEG_FOR_DUPLX BIT2 +#define ETH_ENABLE_AUTO_NEG_FOR_FLOW_CTRL 0 +#define ETH_DISABLE_AUTO_NEG_FOR_FLOW_CTRL BIT3 +#define ETH_ADV_NO_FLOW_CTRL 0 +#define ETH_ADV_SYMMETRIC_FLOW_CTRL BIT4 +#define ETH_FORCE_FC_MODE_NO_PAUSE_DIS_TX 0 +#define ETH_FORCE_FC_MODE_TX_PAUSE_DIS BIT5 +#define ETH_FORCE_BP_MODE_NO_JAM 0 +#define ETH_FORCE_BP_MODE_JAM_TX BIT7 +#define ETH_FORCE_BP_MODE_JAM_TX_ON_RX_ERR BIT8 +#define ETH_FORCE_LINK_FAIL 0 +#define ETH_DO_NOT_FORCE_LINK_FAIL BIT10 +#define ETH_RETRANSMIT_16_ATTEMPTS 0 +#define ETH_RETRANSMIT_FOREVER BIT11 +#define ETH_DISABLE_AUTO_NEG_SPEED_GMII BIT13 +#define ETH_ENABLE_AUTO_NEG_SPEED_GMII 0 +#define ETH_DTE_ADV_0 0 +#define ETH_DTE_ADV_1 BIT14 +#define ETH_DISABLE_AUTO_NEG_BYPASS 0 +#define ETH_ENABLE_AUTO_NEG_BYPASS BIT15 +#define ETH_AUTO_NEG_NO_CHANGE 0 +#define ETH_RESTART_AUTO_NEG BIT16 +#define ETH_MAX_RX_PACKET_1518BYTE 0 +#define ETH_MAX_RX_PACKET_1522BYTE BIT17 +#define ETH_MAX_RX_PACKET_1552BYTE BIT18 +#define ETH_MAX_RX_PACKET_9022BYTE (BIT18 | BIT17) +#define ETH_MAX_RX_PACKET_9192BYTE BIT19 +#define ETH_MAX_RX_PACKET_9700BYTE (BIT19 | BIT17) +#define ETH_SET_EXT_LOOPBACK BIT20 +#define ETH_CLR_EXT_LOOPBACK 0 +#define ETH_SET_FULL_DUPLEX_MODE BIT21 +#define ETH_SET_HALF_DUPLEX_MODE 0 +#define ETH_ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX BIT22 +#define ETH_DISABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX 0 +#define ETH_SET_GMII_SPEED_TO_10_100 0 +#define ETH_SET_GMII_SPEED_TO_1000 BIT23 +#define ETH_SET_MII_SPEED_TO_10 0 +#define ETH_SET_MII_SPEED_TO_100 BIT24 + + +/* SMI reg */ +#define ETH_SMI_BUSY BIT28 /* 0 - Write, 1 - Read */ +#define ETH_SMI_READ_VALID BIT27 /* 0 - Write, 1 - Read */ +#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read operation */ +#define ETH_SMI_OPCODE_READ BIT26 /* Operation is in progress */ + +/* SDMA command status fields macros */ + +/* Tx & Rx descriptors status */ +#define ETH_ERROR_SUMMARY (BIT0) + +/* Tx & Rx descriptors command */ +#define ETH_BUFFER_OWNED_BY_DMA (BIT31) + +/* Tx descriptors status */ +#define ETH_LC_ERROR (0 ) +#define ETH_UR_ERROR (BIT1 ) +#define ETH_RL_ERROR (BIT2 ) +#define ETH_LLC_SNAP_FORMAT (BIT9 ) + +/* Rx descriptors status */ +#define ETH_CRC_ERROR (0 ) +#define ETH_OVERRUN_ERROR (BIT1 ) +#define ETH_MAX_FRAME_LENGTH_ERROR (BIT2 ) +#define ETH_RESOURCE_ERROR ((BIT2 | BIT1)) +#define ETH_VLAN_TAGGED (BIT19) +#define ETH_BPDU_FRAME (BIT20) +#define ETH_TCP_FRAME_OVER_IP_V_4 (0 ) +#define ETH_UDP_FRAME_OVER_IP_V_4 (BIT21) +#define ETH_OTHER_FRAME_TYPE (BIT22) +#define ETH_LAYER_2_IS_ETH_V_2 (BIT23) +#define ETH_FRAME_TYPE_IP_V_4 (BIT24) +#define ETH_FRAME_HEADER_OK (BIT25) +#define ETH_RX_LAST_DESC (BIT26) +#define ETH_RX_FIRST_DESC (BIT27) +#define ETH_UNKNOWN_DESTINATION_ADDR (BIT28) +#define ETH_RX_ENABLE_INTERRUPT (BIT29) +#define ETH_LAYER_4_CHECKSUM_OK (BIT30) + +/* Rx descriptors byte count */ +#define ETH_FRAME_FRAGMENTED (BIT2) + +/* Tx descriptors command */ +#define ETH_LAYER_4_CHECKSUM_FIRST_DESC (BIT10) +#define ETH_FRAME_SET_TO_VLAN (BIT15) +#define ETH_TCP_FRAME (0 ) +#define ETH_UDP_FRAME (BIT16) +#define ETH_GEN_TCP_UDP_CHECKSUM (BIT17) +#define ETH_GEN_IP_V_4_CHECKSUM (BIT18) +#define ETH_ZERO_PADDING (BIT19) +#define ETH_TX_LAST_DESC (BIT20) +#define ETH_TX_FIRST_DESC (BIT21) +#define ETH_GEN_CRC (BIT22) +#define ETH_TX_ENABLE_INTERRUPT (BIT23) +#define ETH_AUTO_MODE (BIT30) + +/* typedefs */ + +typedef enum _eth_port { + ETH_0 = 0, + ETH_1 = 1, + ETH_2 = 2 +} ETH_PORT; + +typedef enum _eth_func_ret_status { + ETH_OK, /* Returned as expected. */ + ETH_ERROR, /* Fundamental error. */ + ETH_RETRY, /* Could not process request. Try later. */ + ETH_END_OF_JOB, /* Ring has nothing to process. */ + ETH_QUEUE_FULL, /* Ring resource error. */ + ETH_QUEUE_LAST_RESOURCE /* Ring resources about to exhaust. */ +} ETH_FUNC_RET_STATUS; + +typedef enum _eth_target { + ETH_TARGET_DRAM, + ETH_TARGET_DEVICE, + ETH_TARGET_CBS, + ETH_TARGET_PCI0, + ETH_TARGET_PCI1 +} ETH_TARGET; + +/* These are for big-endian machines. Little endian needs different + * definitions. + */ +#if defined(__BIG_ENDIAN) +typedef struct _eth_rx_desc { + u16 byte_cnt; /* Descriptor buffer byte count */ + u16 buf_size; /* Buffer size */ + u32 cmd_sts; /* Descriptor command status */ + u32 next_desc_ptr; /* Next descriptor pointer */ + u32 buf_ptr; /* Descriptor buffer pointer */ +} ETH_RX_DESC; + +typedef struct _eth_tx_desc { + u16 byte_cnt; /* buffer byte count */ + u16 l4i_chk; /* CPU provided TCP checksum */ + u32 cmd_sts; /* Command/status field */ + u32 next_desc_ptr; /* Pointer to next descriptor */ + u32 buf_ptr; /* pointer to buffer for this descriptor */ +} ETH_TX_DESC; + +#elif defined(__LITTLE_ENDIAN) +typedef struct _eth_rx_desc { + u32 cmd_sts; /* Descriptor command status */ + u16 buf_size; /* Buffer size */ + u16 byte_cnt; /* Descriptor buffer byte count */ + u32 buf_ptr; /* Descriptor buffer pointer */ + u32 next_desc_ptr; /* Next descriptor pointer */ +} ETH_RX_DESC; + +typedef struct _eth_tx_desc { + u32 cmd_sts; /* Command/status field */ + u16 l4i_chk; /* CPU provided TCP checksum */ + u16 byte_cnt; /* buffer byte count */ + u32 buf_ptr; /* pointer to buffer for this descriptor */ + u32 next_desc_ptr; /* Pointer to next descriptor */ +} ETH_TX_DESC; +#else +#error One of __BIG_ENDIAN or __LITTLE_ENDIAN must be defined +#endif + +/* Unified struct for Rx and Tx operations. The user is not required to */ +/* be familier with neither Tx nor Rx descriptors. */ +typedef struct _pkt_info { + unsigned short byte_cnt; /* Descriptor buffer byte count */ + unsigned short l4i_chk; /* Tx CPU provided TCP Checksum */ + unsigned int cmd_sts; /* Descriptor command status */ + unsigned int buf_ptr; /* Descriptor buffer pointer */ + struct sk_buff* return_info; /* User resource return information */ +} PKT_INFO; + + +/* Ethernet port specific infomation */ + +typedef struct _eth_port_ctrl { + ETH_PORT port_num; /* User Ethernet port number */ + u8 port_mac_addr[6]; /* User defined port MAC address. */ + u32 port_config; /* User port configuration value */ + u32 port_config_extend; /* User port config extend value */ + u32 port_sdma_config; /* User port SDMA config value */ + u32 port_serial_control; /* User port serial control value */ + u32 port_tx_queue_command; /* Port active Tx queues summary */ + u32 port_rx_queue_command; /* Port active Rx queues summary */ + + /* User scratch pad for user specific data structures */ + void* port_private; + + bool rx_resource_err; /* Rx ring resource error flag */ + bool tx_resource_err; /* Tx ring resource error flag */ + + /* Tx/Rx rings managment indexes fields. For driver use */ + + /* Next available and first returning Rx resource */ + int rx_curr_desc_q, rx_used_desc_q; + + /* Next available and first returning Tx resource */ + int tx_curr_desc_q, tx_used_desc_q; + + /* Tx/Rx rings size and base variables fields. For driver use */ + volatile ETH_RX_DESC *p_rx_desc_area; + unsigned int rx_desc_area_size; + struct sk_buff* rx_skb[MV64340_RX_QUEUE_SIZE]; + + volatile ETH_TX_DESC *p_tx_desc_area; + unsigned int tx_desc_area_size; + struct sk_buff* tx_skb[MV64340_TX_QUEUE_SIZE]; + +} ETH_PORT_INFO; + + +/* ethernet.h API list */ + +/* Port operation control routines */ +static void eth_port_init(ETH_PORT_INFO * p_eth_port_ctrl); +static void eth_port_reset(ETH_PORT eth_port_num); +static bool eth_port_start(ETH_PORT_INFO * p_eth_port_ctrl); + +static void ethernet_set_config_reg(ETH_PORT eth_port_num, + unsigned int value); +static unsigned int ethernet_get_config_reg(ETH_PORT eth_port_num); + +#ifdef MDD_CUT +/* Interrupt Coalesting functions */ +static unsigned int eth_port_set_rx_coal(ETH_PORT, unsigned int, + unsigned int); +static unsigned int eth_port_set_tx_coal(ETH_PORT, unsigned int, + unsigned int); +#endif + +/* Port MAC address routines */ +static void eth_port_uc_addr_set(ETH_PORT eth_port_num, + unsigned char *p_addr); + +/* PHY and MIB routines */ +static bool ethernet_phy_reset(ETH_PORT eth_port_num); + +static bool eth_port_write_smi_reg(ETH_PORT eth_port_num, + unsigned int phy_reg, + unsigned int value); + +static bool eth_port_read_smi_reg(ETH_PORT eth_port_num, + unsigned int phy_reg, + unsigned int *value); + +static void eth_clear_mib_counters(ETH_PORT eth_port_num); + +/* Port data flow control routines */ +static ETH_FUNC_RET_STATUS eth_port_send(ETH_PORT_INFO * p_eth_port_ctrl, + PKT_INFO * p_pkt_info); +static ETH_FUNC_RET_STATUS eth_tx_return_desc(ETH_PORT_INFO * + p_eth_port_ctrl, + PKT_INFO * p_pkt_info); +static ETH_FUNC_RET_STATUS eth_port_receive(ETH_PORT_INFO * + p_eth_port_ctrl, + PKT_INFO * p_pkt_info); +static ETH_FUNC_RET_STATUS eth_rx_return_buff(ETH_PORT_INFO * + p_eth_port_ctrl, + PKT_INFO * p_pkt_info); + + +static bool ether_init_tx_desc_ring(ETH_PORT_INFO * p_eth_port_ctrl, + int tx_desc_num, + unsigned long tx_desc_base_addr); + +static bool ether_init_rx_desc_ring(ETH_PORT_INFO * p_eth_port_ctrl, + int rx_desc_num, + int rx_buff_size, + unsigned long rx_desc_base_addr, + unsigned long rx_buff_base_addr); + +#endif /* MV64340_ETH_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/natsemi.c linux-2.4.23-pre8/drivers/net/natsemi.c --- linux-2.4.22/drivers/net/natsemi.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/natsemi.c 2003-10-22 22:47:38.000000000 +0000 @@ -1528,7 +1528,7 @@ for (i = 0; i < TX_RING_SIZE; i++) { if (np->tx_skbuff[i]) { pci_unmap_single(np->pci_dev, - np->rx_dma[i], np->rx_skbuff[i]->len, + np->tx_dma[i], np->tx_skbuff[i]->len, PCI_DMA_TODEVICE); dev_kfree_skb(np->tx_skbuff[i]); np->stats.tx_dropped++; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/ne2k-pci.c linux-2.4.23-pre8/drivers/net/ne2k-pci.c --- linux-2.4.22/drivers/net/ne2k-pci.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/ne2k-pci.c 2003-10-22 22:48:10.000000000 +0000 @@ -50,15 +50,16 @@ #include #include #include +#include #include +#include +#include #include #include #include #include -#include -#include #include "8390.h" /* These identify the driver base version and may not be removed. */ @@ -136,7 +137,7 @@ }; -static struct pci_device_id ne2k_pci_tbl[] __devinitdata = { +static struct pci_device_id ne2k_pci_tbl[] = { { 0x10ec, 0x8029, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_RealTek_RTL_8029 }, { 0x1050, 0x0940, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Winbond_89C940 }, { 0x11f6, 0x1401, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_Compex_RL2000 }, @@ -174,7 +175,7 @@ struct sk_buff *skb, int ring_offset); static void ne2k_pci_block_output(struct net_device *dev, const int count, const unsigned char *buf, const int start_page); -static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops ne2k_pci_ethtool_ops; @@ -259,7 +260,8 @@ } } - dev = alloc_etherdev(0); + /* Allocate net_device, dev->priv; fill in 8390 specific dev fields. */ + dev = alloc_ei_netdev(); if (!dev) { printk (KERN_ERR PFX "cannot allocate ethernet device\n"); goto err_out_free_res; @@ -330,13 +332,6 @@ dev->base_addr = ioaddr; pci_set_drvdata(pdev, dev); - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk (KERN_ERR "ne2kpci(%s): unable to get memory for dev->priv.\n", - pdev->slot_name); - goto err_out_free_netdev; - } - ei_status.name = pci_clone_list[chip_idx].name; ei_status.tx_start_page = start_page; ei_status.stop_page = stop_page; @@ -360,12 +355,12 @@ ei_status.priv = (unsigned long) pdev; dev->open = &ne2k_pci_open; dev->stop = &ne2k_pci_close; - dev->do_ioctl = &netdev_ioctl; + dev->ethtool_ops = &ne2k_pci_ethtool_ops; NS8390_init(dev, 0); i = register_netdev(dev); if (i) - goto err_out_free_8390; + goto err_out_free_netdev; printk("%s: %s found at %#lx, IRQ %d, ", dev->name, pci_clone_list[chip_idx].name, ioaddr, dev->irq); @@ -376,8 +371,6 @@ return 0; -err_out_free_8390: - kfree(dev->priv); err_out_free_netdev: kfree (dev); err_out_free_res: @@ -590,41 +583,23 @@ return; } -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void ne2k_pci_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { struct ei_device *ei = dev->priv; struct pci_dev *pci_dev = (struct pci_dev *) ei->priv; - 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, DRV_NAME); - strcpy(info.version, DRV_VERSION); - strcpy(info.bus_info, pci_dev->slot_name); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - - } - - return -EOPNOTSUPP; -} - -static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -{ - switch(cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - default: - return -EOPNOTSUPP; - } + + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + strcpy(info->bus_info, pci_name(pci_dev)); } +static struct ethtool_ops ne2k_pci_ethtool_ops = { + .get_drvinfo = ne2k_pci_get_drvinfo, + .get_tx_csum = ethtool_op_get_tx_csum, + .get_sg = ethtool_op_get_sg, +}; + static void __devexit ne2k_pci_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); @@ -634,17 +609,17 @@ unregister_netdev(dev); release_region(dev->base_addr, NE_IO_EXTENT); - kfree(dev->priv); kfree(dev); + pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); } static struct pci_driver ne2k_driver = { - name: DRV_NAME, - probe: ne2k_pci_init_one, - remove: __devexit_p(ne2k_pci_remove_one), - id_table: ne2k_pci_tbl, + .name = DRV_NAME, + .probe = ne2k_pci_init_one, + .remove = __devexit_p(ne2k_pci_remove_one), + .id_table = ne2k_pci_tbl, }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/net_init.c linux-2.4.23-pre8/drivers/net/net_init.c --- linux-2.4.22/drivers/net/net_init.c 2001-09-07 23:18:50.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/net_init.c 2003-10-22 22:47:37.000000000 +0000 @@ -71,7 +71,7 @@ */ -static struct net_device *alloc_netdev(int sizeof_priv, const char *mask, +struct net_device *alloc_netdev(int sizeof_priv, const char *mask, void (*setup)(struct net_device *)) { struct net_device *dev; @@ -97,6 +97,7 @@ return dev; } +EXPORT_SYMBOL(alloc_netdev); static struct net_device *init_alloc_dev(int sizeof_priv) { @@ -419,7 +420,7 @@ dev->hard_header_len = ETH_HLEN; dev->mtu = 1500; /* eth_mtu */ dev->addr_len = ETH_ALEN; - dev->tx_queue_len = 100; /* Ethernet wants good queues */ + dev->tx_queue_len = 1000; /* Ethernet wants good queues */ memset(dev->broadcast,0xFF, ETH_ALEN); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/3c574_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/3c574_cs.c --- linux-2.4.22/drivers/net/pcmcia/3c574_cs.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/3c574_cs.c 2003-10-22 22:48:12.000000000 +0000 @@ -253,6 +253,7 @@ static int el3_close(struct net_device *dev); static void el3_tx_timeout(struct net_device *dev); static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; static void set_rx_mode(struct net_device *dev); static dev_info_t dev_info = "3c574_cs"; @@ -328,6 +329,7 @@ dev->hard_start_xmit = &el3_start_xmit; dev->get_stats = &el3_get_stats; dev->do_ioctl = &el3_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); dev->set_multicast_list = &set_rx_mode; ether_setup(dev); dev->open = &el3_open; @@ -1191,26 +1193,16 @@ return worklimit; } -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "3c574_cs", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; + strcpy(info->driver, "3c574_cs"); } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; + /* Provide ioctl() calls to examine the MII xcvr state. */ static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { @@ -1224,11 +1216,11 @@ data[0], data[1], data[2], data[3]); switch(cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *)rq->ifr_data); - case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ + case SIOCGMIIPHY: /* Get the address of the PHY in use. */ + case SIOCDEVPRIVATE: data[0] = phy; - case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ + case SIOCGMIIREG: /* Read the specified MII register. */ + case SIOCDEVPRIVATE+1: { int saved_window; unsigned long flags; @@ -1242,7 +1234,8 @@ restore_flags(flags); return 0; } - case SIOCDEVPRIVATE+2: /* Write the specified MII register */ + case SIOCSMIIREG: /* Write the specified MII register */ + case SIOCDEVPRIVATE+2: { int saved_window; unsigned long flags; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/3c589_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/3c589_cs.c --- linux-2.4.22/drivers/net/pcmcia/3c589_cs.c 2002-02-25 19:37:59.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/3c589_cs.c 2003-10-22 22:49:41.000000000 +0000 @@ -165,7 +165,7 @@ static int el3_close(struct net_device *dev); static void el3_tx_timeout(struct net_device *dev); static void set_multicast_list(struct net_device *dev); -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; static dev_info_t dev_info = "3c589_cs"; @@ -256,7 +256,7 @@ dev->tx_timeout = el3_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; #endif - dev->do_ioctl = netdev_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); /* Register with Card Services */ link->next = dev_list; @@ -648,70 +648,33 @@ | AdapterFailure, ioaddr + EL3_CMD); } -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "PCMCIA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr); +} #ifdef PCMCIA_DEBUG - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = pc_debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - pc_debug = edata.data; - return 0; - } -#endif - - default: - break; - } - - return -EOPNOTSUPP; +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return pc_debug; } -static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) +static void netdev_set_msglevel(struct net_device *dev, u32 level) { - int rc; - - switch (cmd) { - case SIOCETHTOOL: - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - break; - - default: - rc = -EOPNOTSUPP; - break; - } - - return rc; + pc_debug = level; } +#endif /* PCMCIA_DEBUG */ + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +#ifdef PCMCIA_DEBUG + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +#endif /* PCMCIA_DEBUG */ +}; static int el3_config(struct net_device *dev, struct ifmap *map) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/aironet4500_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/aironet4500_cs.c --- linux-2.4.22/drivers/net/pcmcia/aironet4500_cs.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/aironet4500_cs.c 2003-10-22 22:47:39.000000000 +0000 @@ -165,65 +165,33 @@ return ret; } -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "PCMCIA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr); +} #ifdef PCMCIA_DEBUG - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = pc_debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - pc_debug = edata.data; - return 0; - } -#endif - - default: - break; - } - - return -EOPNOTSUPP; +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return pc_debug; } -static int awc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static void netdev_set_msglevel(struct net_device *dev, u32 level) { - switch (cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - - default: - return -EOPNOTSUPP; - } - return 0; + pc_debug = level; } +#endif /* PCMCIA_DEBUG */ + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +#ifdef PCMCIA_DEBUG + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +#endif /* PCMCIA_DEBUG */ +}; /* awc_attach() creates an "instance" of the driver, allocating @@ -296,7 +264,7 @@ // dev->set_config = &awc_config_misiganes,aga mitte awc_config; dev->get_stats = &awc_get_stats; // dev->set_multicast_list = &awc_set_multicast_list; - dev->do_ioctl = &awc_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); strcpy(dev->name, ((struct awc_private *)dev->priv)->node.dev_name); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/axnet_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/axnet_cs.c --- linux-2.4.22/drivers/net/pcmcia/axnet_cs.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/axnet_cs.c 2003-10-22 22:49:01.000000000 +0000 @@ -99,6 +99,8 @@ static int axnet_open(struct net_device *dev); static int axnet_close(struct net_device *dev); static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; + static void ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs); static void ei_watchdog(u_long arg); static void axnet_reset_8390(struct net_device *dev); @@ -221,6 +223,7 @@ dev->open = &axnet_open; dev->stop = &axnet_close; dev->do_ioctl = &axnet_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); /* Register with Card Services */ link->next = dev_list; @@ -822,26 +825,16 @@ add_timer(&info->watchdog); } -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "axnet_cs", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; + strcpy(info->driver, "axnet_cs"); } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; + /*====================================================================*/ static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) @@ -850,13 +843,14 @@ u16 *data = (u16 *)&rq->ifr_data; ioaddr_t mii_addr = dev->base_addr + AXNET_MII_EEP; switch (cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); + case SIOCGMIIPHY: case SIOCDEVPRIVATE: data[0] = info->phy_id; + case SIOCGMIIREG: /* Read MII PHY register. */ case SIOCDEVPRIVATE+1: data[3] = mdio_read(mii_addr, data[0], data[1] & 0x1f); return 0; + case SIOCSMIIREG: /* Write MII PHY register. */ case SIOCDEVPRIVATE+2: if (!capable(CAP_NET_ADMIN)) return -EPERM; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/fmvj18x_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/fmvj18x_cs.c --- linux-2.4.22/drivers/net/pcmcia/fmvj18x_cs.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/fmvj18x_cs.c 2003-10-22 22:49:10.000000000 +0000 @@ -115,7 +115,7 @@ static struct net_device_stats *fjn_get_stats(struct net_device *dev); static void set_rx_mode(struct net_device *dev); static void fjn_tx_timeout(struct net_device *dev); -static int fjn_ioctl(struct net_device *, struct ifreq *, int); +static struct ethtool_ops netdev_ethtool_ops; static dev_info_t dev_info = "fmvj18x_cs"; static dev_link_t *dev_list; @@ -326,7 +326,7 @@ dev->tx_timeout = fjn_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; #endif - dev->do_ioctl = fjn_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); /* Register with Card Services */ link->next = dev_list; @@ -1205,64 +1205,33 @@ /*====================================================================*/ -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "PCMCIA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr); +} #ifdef PCMCIA_DEBUG - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = pc_debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - pc_debug = edata.data; - return 0; - } -#endif - - default: - break; - } - - return -EOPNOTSUPP; +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return pc_debug; } -static int fjn_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static void netdev_set_msglevel(struct net_device *dev, u32 level) { - switch (cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - - default: - return -EOPNOTSUPP; - } + pc_debug = level; } +#endif /* PCMCIA_DEBUG */ + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +#ifdef PCMCIA_DEBUG + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +#endif /* PCMCIA_DEBUG */ +}; static int fjn_config(struct net_device *dev, struct ifmap *map){ return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/ibmtr_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/ibmtr_cs.c --- linux-2.4.22/drivers/net/pcmcia/ibmtr_cs.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/ibmtr_cs.c 2003-10-22 22:48:59.000000000 +0000 @@ -166,36 +166,15 @@ CardServices(ReportError, handle, &err); } -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "ibmtr_cs", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; + strcpy(info->driver, "ibmtr_cs"); } -static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -{ - - switch(cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - default: - return -EOPNOTSUPP; - } -} +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; /*====================================================================== @@ -249,7 +228,7 @@ link->irq.Instance = info->dev = dev; dev->init = &ibmtr_probe; - dev->do_ioctl = &private_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); /* Register with Card Services */ link->next = dev_list; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/netwave_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/netwave_cs.c --- linux-2.4.22/drivers/net/pcmcia/netwave_cs.c 2002-02-25 19:37:59.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/netwave_cs.c 2003-10-22 22:48:41.000000000 +0000 @@ -247,6 +247,8 @@ #endif static int netwave_ioctl(struct net_device *, struct ifreq *, int); +static struct ethtool_ops netdev_ethtool_ops; + static void set_multicast_list(struct net_device *dev); /* @@ -493,6 +495,7 @@ dev->get_wireless_stats = &netwave_get_wireless_stats; #endif dev->do_ioctl = &netwave_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); dev->tx_timeout = &netwave_watchdog; dev->watchdog_timeo = TX_TIMEOUT; @@ -603,53 +606,34 @@ } } /* netwave_flush_stale_links */ -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr); +} - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; +#ifdef PCMCIA_DEBUG +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return pc_debug; +} - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "PCMCIA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } +static void netdev_set_msglevel(struct net_device *dev, u32 level) +{ + pc_debug = level; +} +#endif /* PCMCIA_DEBUG */ +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, #ifdef PCMCIA_DEBUG - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = pc_debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - pc_debug = edata.data; - return 0; - } -#endif - - default: - break; - } + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +#endif /* PCMCIA_DEBUG */ +}; - return -EOPNOTSUPP; -} /* * Function netwave_ioctl (dev, rq, cmd) * @@ -672,9 +656,6 @@ DEBUG(0, "%s: ->netwave_ioctl(cmd=0x%X)\n", dev->name, cmd); - if (cmd == SIOCETHTOOL) - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - /* Disable interrupts & save flags */ save_flags(flags); cli(); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/nmclan_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/nmclan_cs.c --- linux-2.4.22/drivers/net/pcmcia/nmclan_cs.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/nmclan_cs.c 2003-10-22 22:47:41.000000000 +0000 @@ -438,7 +438,8 @@ static int mace_rx(struct net_device *dev, unsigned char RxCnt); static void restore_multicast_list(struct net_device *dev); static void set_multicast_list(struct net_device *dev); -static int mace_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; + static dev_link_t *nmclan_attach(void); static void nmclan_detach(dev_link_t *); @@ -520,7 +521,7 @@ dev->set_config = &mace_config; dev->get_stats = &mace_get_stats; dev->set_multicast_list = &set_multicast_list; - dev->do_ioctl = &mace_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); ether_setup(dev); dev->open = &mace_open; dev->stop = &mace_close; @@ -1010,65 +1011,33 @@ return 0; } /* mace_close */ -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - /* dev_ioctl() in ../../net/core/dev.c has already checked - capable(CAP_NET_ADMIN), so don't bother with that here. */ - - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; - - switch (ethcmd) { - - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - sprintf(info.bus_info, "PCMCIA 0x%lx", dev->base_addr); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr); +} #ifdef PCMCIA_DEBUG - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = pc_debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - pc_debug = edata.data; - return 0; - } -#endif - - default: - break; - } - - return -EOPNOTSUPP; +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return pc_debug; } -static int mace_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static void netdev_set_msglevel(struct net_device *dev, u32 level) { - switch (cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - - default: - return -EOPNOTSUPP; - } - return 0; + pc_debug = level; } +#endif /* PCMCIA_DEBUG */ + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +#ifdef PCMCIA_DEBUG + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, +#endif /* PCMCIA_DEBUG */ +}; /* ---------------------------------------------------------------------------- mace_start_xmit diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/pcnet_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/pcnet_cs.c --- linux-2.4.22/drivers/net/pcmcia/pcnet_cs.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/pcnet_cs.c 2003-10-22 22:49:20.000000000 +0000 @@ -117,7 +117,9 @@ static int pcnet_open(struct net_device *dev); static int pcnet_close(struct net_device *dev); static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); -static int do_ioctl_light(struct net_device *dev, struct ifreq *rq, int cmd); + +static struct ethtool_ops netdev_ethtool_ops; + static void ei_irq_wrapper(int irq, void *dev_id, struct pt_regs *regs); static void ei_watchdog(u_long arg); static void pcnet_reset_8390(struct net_device *dev); @@ -765,6 +767,7 @@ strcpy(info->node.dev_name, dev->name); link->dev = &info->node; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); if (info->flags & (IS_DL10019|IS_DL10022)) { u_char id = inb(dev->base_addr + 0x1a); @@ -778,7 +781,6 @@ printk("PNA, "); } else { printk(KERN_INFO "%s: NE2000 Compatible: ", dev->name); - dev->do_ioctl = &do_ioctl_light; } printk("io %#3lx, irq %d,", dev->base_addr, dev->irq); if (info->flags & USE_SHMEM) @@ -1215,26 +1217,16 @@ /*====================================================================*/ -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "pcnet_cs", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; + strcpy(info->driver, "pcnet_cs"); } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; + /*====================================================================*/ @@ -1244,13 +1236,14 @@ u16 *data = (u16 *)&rq->ifr_data; ioaddr_t mii_addr = dev->base_addr + DLINK_GPIO; switch (cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); + case SIOCGMIIPHY: case SIOCDEVPRIVATE: data[0] = info->phy_id; + case SIOCGMIIREG: /* Read MII PHY register. */ case SIOCDEVPRIVATE+1: data[3] = mdio_read(mii_addr, data[0], data[1] & 0x1f); return 0; + case SIOCSMIIREG: /* Write MII PHY register. */ case SIOCDEVPRIVATE+2: if (!capable(CAP_NET_ADMIN)) return -EPERM; @@ -1262,17 +1255,6 @@ /*====================================================================*/ -static int do_ioctl_light(struct net_device *dev, struct ifreq *rq, int cmd) -{ - switch (cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - } - return -EOPNOTSUPP; -} - -/*====================================================================*/ - static void dma_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/ray_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/ray_cs.c --- linux-2.4.22/drivers/net/pcmcia/ray_cs.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/ray_cs.c 2003-10-22 22:48:34.000000000 +0000 @@ -105,6 +105,9 @@ static struct net_device_stats *ray_get_stats(struct net_device *dev); static int ray_dev_init(struct net_device *dev); static int ray_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); + +static struct ethtool_ops netdev_ethtool_ops; + static int ray_open(struct net_device *dev); static int ray_dev_start_xmit(struct sk_buff *skb, struct net_device *dev); static void set_multicast_list(struct net_device *dev); @@ -417,6 +420,7 @@ dev->set_config = &ray_dev_config; dev->get_stats = &ray_get_stats; dev->do_ioctl = &ray_dev_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); #if WIRELESS_EXT > 7 /* If wireless extension exist in the kernel */ dev->get_wireless_stats = ray_get_wireless_stats; #endif @@ -1236,26 +1240,16 @@ /*===========================================================================*/ -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "ray_cs", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; + strcpy(info->driver, "ray_cs"); } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; + /*====================================================================*/ static int ray_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) @@ -1275,10 +1269,6 @@ /* Validate the command */ switch (cmd) { - case SIOCETHTOOL: - err = netdev_ethtool_ioctl(dev, (void *) ifr->ifr_data); - break; - #if WIRELESS_EXT > 7 /* --------------- WIRELESS EXTENSIONS --------------- */ /* Get name */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/wavelan_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/wavelan_cs.c --- linux-2.4.22/drivers/net/pcmcia/wavelan_cs.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/wavelan_cs.c 2003-10-22 22:49:02.000000000 +0000 @@ -1890,27 +1890,17 @@ } #endif /* HISTOGRAM */ -static inline int -wl_netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) + +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "wavelan_cs", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; + strcpy(info->driver, "wavelan_cs"); } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; + /*------------------------------------------------------------------*/ /* * Perform ioctl : config & info stuff @@ -1933,9 +1923,6 @@ printk(KERN_DEBUG "%s: ->wavelan_ioctl(cmd=0x%X)\n", dev->name, cmd); #endif - if (cmd == SIOCETHTOOL) - return wl_netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - /* Disable interrupts & save flags */ wv_splhi(lp, &flags); @@ -4568,6 +4555,7 @@ dev->do_ioctl = wavelan_ioctl; /* wireless extensions */ dev->get_wireless_stats = wavelan_get_wireless_stats; #endif + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); /* Other specific data */ dev->mtu = WAVELAN_MTU; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/xirc2ps_cs.c linux-2.4.23-pre8/drivers/net/pcmcia/xirc2ps_cs.c --- linux-2.4.22/drivers/net/pcmcia/xirc2ps_cs.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/xirc2ps_cs.c 2003-10-22 22:48:34.000000000 +0000 @@ -386,6 +386,7 @@ static int do_config(struct net_device *dev, struct ifmap *map); static int do_open(struct net_device *dev); static int do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; static void hardreset(struct net_device *dev); static void do_reset(struct net_device *dev, int full); static int init_mii(struct net_device *dev); @@ -650,6 +651,7 @@ dev->set_config = &do_config; dev->get_stats = &do_get_stats; dev->do_ioctl = &do_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); dev->set_multicast_list = &set_multicast_list; ether_setup(dev); dev->open = &do_open; @@ -1722,26 +1724,16 @@ return 0; } -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "xirc2ps_cs", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; + strcpy(info->driver, "xirc2ps_cs"); } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; + static int do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { @@ -1757,15 +1749,16 @@ return -EOPNOTSUPP; switch(cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */ + case SIOCGMIIPHY: /* Get the address of the PHY in use. */ + case SIOCDEVPRIVATE: data[0] = 0; /* we have only this address */ /* fall trough */ - case SIOCDEVPRIVATE+1: /* Read the specified MII register. */ + case SIOCGMIIREG: /* Read the specified MII register. */ + case SIOCDEVPRIVATE+1: data[3] = mii_rd(ioaddr, data[0] & 0x1f, data[1] & 0x1f); break; - case SIOCDEVPRIVATE+2: /* Write the specified MII register */ + case SIOCSMIIREG: /* Write the specified MII register */ + case SIOCDEVPRIVATE+2: if (!capable(CAP_NET_ADMIN)) return -EPERM; mii_wr(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2], 16); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pcmcia/xircom_cb.c linux-2.4.23-pre8/drivers/net/pcmcia/xircom_cb.c --- linux-2.4.22/drivers/net/pcmcia/xircom_cb.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pcmcia/xircom_cb.c 2003-10-22 22:49:16.000000000 +0000 @@ -14,10 +14,8 @@ * $Id: xircom_cb.c,v 1.33 2001/03/19 14:02:07 arjanv Exp $ */ - #include #include -#include #include #include #include @@ -30,12 +28,11 @@ #include #include #include + #include #include #include - - #ifdef DEBUG #define enter(x) printk("Enter: %s, %s line %i\n",x,__FILE__,__LINE__) #define leave(x) printk("Leave: %s, %s line %i\n",x,__FILE__,__LINE__) @@ -114,7 +111,7 @@ /* Function prototypes */ static int xircom_probe(struct pci_dev *pdev, const struct pci_device_id *id); static void xircom_remove(struct pci_dev *pdev); -static void xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev); static int xircom_open(struct net_device *dev); static int xircom_close(struct net_device *dev); @@ -124,7 +121,7 @@ static void investigate_read_descriptor(struct net_device *dev,struct xircom_private *card, int descnr, unsigned int bufferoffset); static void investigate_write_descriptor(struct net_device *dev, struct xircom_private *card, int descnr, unsigned int bufferoffset); static void read_mac_address(struct xircom_private *card); -static void tranceiver_voodoo(struct xircom_private *card); +static void transceiver_voodoo(struct xircom_private *card); static void initialize_card(struct xircom_private *card); static void trigger_transmit(struct xircom_private *card); static void trigger_receive(struct xircom_private *card); @@ -143,17 +140,19 @@ -static struct pci_device_id xircom_pci_table[] __devinitdata = { +static struct pci_device_id xircom_pci_table[] = { {0x115D, 0x0003, PCI_ANY_ID, PCI_ANY_ID,}, {0,}, }; MODULE_DEVICE_TABLE(pci, xircom_pci_table); static struct pci_driver xircom_ops = { - name: "xircom_cb", - id_table: xircom_pci_table, - probe: xircom_probe, - remove: __devexit_p(xircom_remove), + .name = "xircom_cb", + .id_table = xircom_pci_table, + .probe = xircom_probe, + .remove = xircom_remove, + .suspend =NULL, + .resume =NULL }; @@ -176,37 +175,19 @@ } #endif -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) -{ - u32 ethcmd; - - if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, "xircom_cb", sizeof(info.driver)-1); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - } - - return -EOPNOTSUPP; -} - -static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static void netdev_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) { + struct xircom_private *private = dev->priv; - switch(cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - default: - return -EOPNOTSUPP; - } + strcpy(info->driver, "xircom_cb"); + strcpy(info->bus_info, pci_name(private->pdev)); } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, +}; + /* xircom_probe is the code that gets called on device insertion. it sets up the hardware and registers the device to the networklayer. @@ -244,40 +225,32 @@ return -ENODEV; } - /* Before changing the hardware, allocate the memory. This way, we can fail gracefully if not enough memory is available. */ - private = kmalloc(sizeof(*private),GFP_KERNEL); - memset(private, 0, sizeof(struct xircom_private)); + dev = alloc_etherdev(sizeof(struct xircom_private)); + if (!dev) { + printk(KERN_ERR "xircom_probe: failed to allocate etherdev\n"); + goto device_fail; + } + private = dev->priv; /* Allocate the send/receive buffers */ private->rx_buffer = pci_alloc_consistent(pdev,8192,&private->rx_dma_handle); - if (private->rx_buffer == NULL) { printk(KERN_ERR "xircom_probe: no memory for rx buffer \n"); - kfree(private); - return -ENODEV; + goto rx_buf_fail; } private->tx_buffer = pci_alloc_consistent(pdev,8192,&private->tx_dma_handle); if (private->tx_buffer == NULL) { printk(KERN_ERR "xircom_probe: no memory for tx buffer \n"); - kfree(private->rx_buffer); - kfree(private); - return -ENODEV; - } - dev = init_etherdev(dev, 0); - if (dev == NULL) { - printk(KERN_ERR "xircom_probe: failed to allocate etherdev\n"); - kfree(private->rx_buffer); - kfree(private->tx_buffer); - kfree(private); - return -ENODEV; + goto tx_buf_fail; } + SET_MODULE_OWNER(dev); - printk(KERN_INFO "%s: Xircom cardbus revision %i at irq %i \n", dev->name, chip_rev, pdev->irq); + private->dev = dev; private->pdev = pdev; @@ -285,32 +258,47 @@ private->lock = SPIN_LOCK_UNLOCKED; dev->irq = pdev->irq; dev->base_addr = private->io_port; - + initialize_card(private); read_mac_address(private); setup_descriptors(private); - + dev->open = &xircom_open; dev->hard_start_xmit = &xircom_start_xmit; dev->stop = &xircom_close; dev->get_stats = &xircom_get_stats; dev->priv = private; - dev->do_ioctl = &private_ioctl; + SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); pci_set_drvdata(pdev, dev); + if (register_netdev(dev)) { + printk(KERN_ERR "xircom_probe: netdevice registration failed.\n"); + goto reg_fail; + } + + printk(KERN_INFO "%s: Xircom cardbus revision %i at irq %i \n", dev->name, chip_rev, pdev->irq); /* start the transmitter to get a heartbeat */ /* TODO: send 2 dummy packets here */ - tranceiver_voodoo(private); - + transceiver_voodoo(private); + spin_lock_irqsave(&private->lock,flags); - activate_transmitter(private); - activate_receiver(private); + activate_transmitter(private); + activate_receiver(private); spin_unlock_irqrestore(&private->lock,flags); - + trigger_receive(private); - + leave("xircom_probe"); return 0; + +reg_fail: + kfree(private->tx_buffer); +tx_buf_fail: + kfree(private->rx_buffer); +rx_buf_fail: + free_netdev(dev); +device_fail: + return -ENODEV; } @@ -323,27 +311,20 @@ static void __devexit xircom_remove(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); - struct xircom_private *card; + struct xircom_private *card = dev->priv; + enter("xircom_remove"); - if (dev!=NULL) { - card=dev->priv; - if (card!=NULL) { - if (card->rx_buffer!=NULL) - pci_free_consistent(pdev,8192,card->rx_buffer,card->rx_dma_handle); - card->rx_buffer = NULL; - if (card->tx_buffer!=NULL) - pci_free_consistent(pdev,8192,card->tx_buffer,card->tx_dma_handle); - card->tx_buffer = NULL; - } - kfree(card); - } + pci_free_consistent(pdev,8192,card->rx_buffer,card->rx_dma_handle); + pci_free_consistent(pdev,8192,card->tx_buffer,card->tx_dma_handle); + release_region(dev->base_addr, 128); unregister_netdev(dev); - kfree(dev); + free_netdev(dev); + pci_set_drvdata(pdev, NULL); leave("xircom_remove"); } -static void xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t xircom_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_instance; struct xircom_private *card = (struct xircom_private *) dev->priv; @@ -387,6 +368,7 @@ spin_unlock(&card->lock); leave("xircom_interrupt"); + return IRQ_HANDLED; } static int xircom_start_xmit(struct sk_buff *skb, struct net_device *dev) @@ -1040,7 +1022,7 @@ /* -link_status() checks the link's status and will return 0 for no link, 10 for 10mbit link and 100 for.. guess what. +link_status() checks the the links status and will return 0 for no link, 10 for 10mbit link and 100 for.. guess what. Must be called in locked state with interrupts disabled */ @@ -1115,15 +1097,15 @@ /* - tranceiver_voodoo() enables the external UTP plug thingy. + transceiver_voodoo() enables the external UTP plug thingy. it's called voodoo as I stole this code and cannot cross-reference it with the specification. */ -static void tranceiver_voodoo(struct xircom_private *card) +static void transceiver_voodoo(struct xircom_private *card) { unsigned long flags; - enter("tranceiver_voodoo"); + enter("transceiver_voodoo"); /* disable all powermanagement */ pci_write_config_dword(card->pdev, PCI_POWERMGMT, 0x0000); @@ -1142,7 +1124,7 @@ spin_unlock_irqrestore(&card->lock, flags); netif_start_queue(card->dev); - leave("tranceiver_voodoo"); + leave("transceiver_voodoo"); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/pppoe.c linux-2.4.23-pre8/drivers/net/pppoe.c --- linux-2.4.22/drivers/net/pppoe.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/pppoe.c 2003-10-22 22:49:07.000000000 +0000 @@ -654,8 +654,10 @@ release_sock(sk); return error; err_put: - dev_put(po->pppoe_dev); - po->pppoe_dev = NULL; + if (po->pppoe_dev) { + dev_put(po->pppoe_dev); + po->pppoe_dev = NULL; + } goto end; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/seeq8005.c linux-2.4.23-pre8/drivers/net/seeq8005.c --- linux-2.4.22/drivers/net/seeq8005.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/seeq8005.c 2003-10-22 22:49:15.000000000 +0000 @@ -379,7 +379,7 @@ { struct net_local *lp = (struct net_local *)dev->priv; short length = skb->len; - unsigned char *buf = skb->data; + unsigned char *buf; if(length < ETH_ZLEN) { @@ -388,6 +388,8 @@ return 0; length = ETH_ZLEN; } + buf = skb->data; + /* Block a timer-based transmit from overlapping */ netif_stop_queue(dev); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sis900.c linux-2.4.23-pre8/drivers/net/sis900.c --- linux-2.4.22/drivers/net/sis900.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sis900.c 2003-10-22 22:48:40.000000000 +0000 @@ -98,7 +98,7 @@ "SiS 900 PCI Fast Ethernet", "SiS 7016 PCI Fast Ethernet" }; -static struct pci_device_id sis900_pci_tbl [] __devinitdata = { +static struct pci_device_id sis900_pci_tbl [] = { {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SIS_900}, {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_7016, @@ -170,6 +170,7 @@ dma_addr_t rx_ring_dma; unsigned int tx_full; /* The Tx queue is full. */ + u8 host_bridge_rev; }; MODULE_AUTHOR("Jim Huang , Ollie Lho "); @@ -197,7 +198,7 @@ static int sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev); static int sis900_rx(struct net_device *net_dev); static void sis900_finish_xmit (struct net_device *net_dev); -static void sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static int sis900_close(struct net_device *net_dev); static int mii_ioctl(struct net_device *net_dev, struct ifreq *rq, int cmd); static struct net_device_stats *sis900_get_stats(struct net_device *net_dev); @@ -211,6 +212,7 @@ static u16 sis900_reset_phy(struct net_device *net_dev, int phy_addr); static void sis900_auto_negotiate(struct net_device *net_dev, int phy_addr); static void sis900_set_mode (long ioaddr, int speed, int duplex); +static struct ethtool_ops sis900_ethtool_ops; /** * sis900_get_mac_addr - Get MAC address for stand alone SiS900 model @@ -368,6 +370,7 @@ { struct sis900_private *sis_priv; struct net_device *net_dev; + struct pci_dev *dev; dma_addr_t ring_dma; void *ring_space; long ioaddr; @@ -440,6 +443,7 @@ net_dev->do_ioctl = &mii_ioctl; net_dev->tx_timeout = sis900_tx_timeout; net_dev->watchdog_timeo = TX_TIMEOUT; + net_dev->ethtool_ops = &sis900_ethtool_ops; ret = register_netdev(net_dev); if (ret) @@ -473,6 +477,11 @@ goto err_out_unregister; } + /* save our host bridge revision */ + dev = pci_find_device(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_630, NULL); + if (dev) + pci_read_config_byte(dev, PCI_CLASS_REVISION, &sis_priv->host_bridge_rev); + /* print some information about our NIC */ printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ", net_dev->name, card_name, ioaddr, net_dev->irq); @@ -1108,18 +1117,12 @@ { struct sis900_private *sis_priv = net_dev->priv; u16 reg14h, eq_value=0, max_value=0, min_value=0; - u8 host_bridge_rev; int i, maxcount=10; - struct pci_dev *dev=NULL; if ( !(revision == SIS630E_900_REV || revision == SIS630EA1_900_REV || revision == SIS630A_900_REV || revision == SIS630ET_900_REV) ) return; - dev = pci_find_device(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_630, dev); - if (dev) - pci_read_config_byte(dev, PCI_CLASS_REVISION, &host_bridge_rev); - if (netif_carrier_ok(net_dev)) { reg14h=mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, (0x2200 | reg14h) & 0xBFFF); @@ -1142,7 +1145,8 @@ } /* 630B0&B1 rule to determine the equalizer value */ if (revision == SIS630A_900_REV && - (host_bridge_rev == SIS630B0 || host_bridge_rev == SIS630B1)) { + (sis_priv->host_bridge_rev == SIS630B0 || + sis_priv->host_bridge_rev == SIS630B1)) { if (max_value == 0) eq_value=3; else @@ -1157,7 +1161,8 @@ else { reg14h=mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); if (revision == SIS630A_900_REV && - (host_bridge_rev == SIS630B0 || host_bridge_rev == SIS630B1)) + (sis_priv->host_bridge_rev == SIS630B0 || + sis_priv->host_bridge_rev == SIS630B1)) mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, (reg14h | 0x2200) & 0xBFFF); else mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, (reg14h | 0x2000) & 0xBFFF); @@ -1536,13 +1541,14 @@ * and cleans up after the Tx thread */ -static void sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +static irqreturn_t sis900_interrupt(int irq, void *dev_instance, struct pt_regs *regs) { struct net_device *net_dev = dev_instance; struct sis900_private *sis_priv = net_dev->priv; int boguscnt = max_interrupt_work; long ioaddr = net_dev->base_addr; u32 status; + unsigned int handled = 0; spin_lock (&sis_priv->lock); @@ -1552,6 +1558,7 @@ if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0) /* nothing intresting happened */ break; + handled = 1; /* why dow't we break after Tx/Rx case ?? keyword: full-duplex */ if (status & (RxORN | RxERR | RxOK)) @@ -1582,7 +1589,7 @@ net_dev->name, inl(ioaddr + isr)); spin_unlock (&sis_priv->lock); - return; + return IRQ_RETVAL(handled); } /** @@ -1851,39 +1858,27 @@ } /** - * netdev_ethtool_ioctl - For the basic support of ethtool - * @net_dev: the net device to command for - * @useraddr: start address of interface request + * sis900_get_drvinfo - Return information about driver + * @net_dev: the net device to probe + * @info: container for info returned * * Process ethtool command such as "ehtool -i" to show information */ - -static int netdev_ethtool_ioctl (struct net_device *net_dev, void *useraddr) + +static void sis900_get_drvinfo(struct net_device *net_dev, + struct ethtool_drvinfo *info) { struct sis900_private *sis_priv = net_dev->priv; - 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, SIS900_MODULE_NAME); - strcpy (info.version, SIS900_DRV_VERSION); - strcpy (info.bus_info, sis_priv->pci_dev->slot_name); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - default: - break; - } - - return -EOPNOTSUPP; + strcpy (info->driver, SIS900_MODULE_NAME); + strcpy (info->version, SIS900_DRV_VERSION); + strcpy (info->bus_info, pci_name(sis_priv->pci_dev)); } +static struct ethtool_ops sis900_ethtool_ops = { + .get_drvinfo = sis900_get_drvinfo, +}; + /** * mii_ioctl - process MII i/o control command * @net_dev: the net device to command for @@ -1899,9 +1894,6 @@ struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; switch(cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(net_dev, (void *) rq->ifr_data); - case SIOCGMIIPHY: /* Get address of MII PHY in use. */ case SIOCDEVPRIVATE: /* for binary compat, remove in 2.5 */ data->phy_id = sis_priv->mii->phy_addr; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/Makefile linux-2.4.23-pre8/drivers/net/sk98lin/Makefile --- linux-2.4.22/drivers/net/sk98lin/Makefile 2001-07-04 18:50:39.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/Makefile 2003-10-22 22:47:27.000000000 +0000 @@ -3,11 +3,32 @@ # Makefile for the SysKonnect SK-98xx device driver. # +# +# Standalone driver params +# SKPARAM += -DSK_KERNEL_24 +# SKPARAM += -DSK_KERNEL_24_26 +# SKPARAM += -DSK_KERNEL_26 +# SKPARAM += -DSK_KERNEL_22_24 + O_TARGET := sk98lin.o -obj-y := skge.o skaddr.o skgehwt.o skgeinit.o skgepnmi.o skgesirq.o \ - ski2c.o sklm80.o skqueue.o skrlmt.o sktimer.o skvpd.o \ - skxmac2.o skproc.o skcsum.o +obj-y := \ + skge.o \ + skdim.o \ + skaddr.o \ + skgehwt.o \ + skgeinit.o \ + skgepnmi.o \ + skgesirq.o \ + ski2c.o \ + sklm80.o \ + skqueue.o \ + skrlmt.o \ + sktimer.o \ + skvpd.o \ + skxmac2.o \ + skproc.o \ + skcsum.o obj-m := $(O_TARGET) # DBGDEF = \ @@ -57,7 +78,7 @@ # SK_DBGCAT_DRV_INT_SRC 0x04000000 interrupts sources # SK_DBGCAT_DRV_EVENT 0x08000000 driver events -EXTRA_CFLAGS += -I. -DSK_USE_CSUM $(DBGDEF) +EXTRA_CFLAGS += -I. -DSK_USE_CSUM -DGENESIS -DYUKON $(DBGDEF) $(SKPARAM) include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/lm80.h linux-2.4.23-pre8/drivers/net/sk98lin/h/lm80.h --- linux-2.4.22/drivers/net/sk98lin/h/lm80.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/lm80.h 2003-10-22 22:48:26.000000000 +0000 @@ -1,9 +1,9 @@ /****************************************************************************** * * Name: lm80.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.4 $ - * Date: $Date: 2002/04/25 11:04:10 $ + * 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). * @@ -11,7 +11,8 @@ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,13 @@ * * 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 * @@ -55,8 +63,8 @@ * * All registers are 8 bit wide */ -#define LM80_CFG 0x00 /* Configuration Register */ -#define LM80_ISRC_1 0x01 /* Interrupt Status Register 1 */ +#define LM80_CFG 0x00 /* Configuration Register */ +#define LM80_ISRC_1 0x01 /* Interrupt Status Register 1 */ #define LM80_ISRC_2 0x02 /* Interrupt Status Register 2 */ #define LM80_IMSK_1 0x03 /* Interrupt Mask Register 1 */ #define LM80_IMSK_2 0x04 /* Interrupt Mask Register 2 */ @@ -93,8 +101,8 @@ #define LM80_THOT_LIM_LO 0x39 /* hot temperature limit (low) */ #define LM80_TOS_LIM_UP 0x3a /* OS temperature limit (high) */ #define LM80_TOS_LIM_LO 0x3b /* OS temperature limit (low) */ -#define LM80_FAN1_COUNT_LIM 0x3c /* Fan 1 count limit (high) */ -#define LM80_FAN2_COUNT_LIM 0x3d /* Fan 2 count limit (low) */ +#define LM80_FAN1_COUNT_LIM 0x3c /* Fan 1 count limit (high) */ +#define LM80_FAN2_COUNT_LIM 0x3d /* Fan 2 count limit (low) */ /* 0x3e - 0x3f reserved */ /* @@ -124,7 +132,7 @@ /* LM80_ISRC_2 Interrupt Status Register 2 */ /* LM80_IMSK_2 Interrupt Mask Register 2 */ -#define LM80_IS_TEMP (1<<0) /* HOT temperature limit exceeded */ +#define LM80_IS_TEMP (1<<0) /* HOT temperature limit exceeded */ #define LM80_IS_BTI (1<<1) /* state of BTI# pin */ #define LM80_IS_FAN1 (1<<2) /* count limit exceeded for Fan 1 */ #define LM80_IS_FAN2 (1<<3) /* count limit exceeded for Fan 2 */ @@ -143,7 +151,7 @@ #define LM80_FAN_RST_ENA (1<<7) /* sets RST_OUT#/OS# pins in RST mode */ /* LM80_TEMP_CTRL OS# Config, Temp Res. Reg */ -#define LM80_TEMP_OS_STAT (1<<0) /* mirrors the state of RST_OUT#/OS# */ +#define LM80_TEMP_OS_STAT (1<<0) /* mirrors the state of RST_OUT#/OS# */ #define LM80_TEMP_OS_POL (1<<1) /* select OS# polarity */ #define LM80_TEMP_OS_MODE (1<<2) /* selects Interrupt mode */ #define LM80_TEMP_RES (1<<3) /* selects 9 or 11 bit temp resulution*/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skaddr.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skaddr.h --- linux-2.4.22/drivers/net/sk98lin/h/skaddr.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skaddr.h 2003-10-22 22:48:59.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skaddr.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.26 $ - * Date: $Date: 2002/11/15 07:24:42 $ + * 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). * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2001 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,16 @@ * 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. * @@ -140,7 +151,6 @@ #define __INC_SKADDR_H #ifdef __cplusplus -#error C++ is not yet supported. extern "C" { #endif /* cplusplus */ @@ -206,7 +216,7 @@ /* Macros */ -#if 0 +#ifdef OLD_STUFF #ifndef SK_ADDR_EQUAL /* * "&" instead of "&&" allows better optimization on IA-64. @@ -231,16 +241,18 @@ #ifndef SK_ADDR_EQUAL #ifndef SK_ADDR_DWORD_COMPARE #define SK_ADDR_EQUAL(A1,A2) ( \ - (((SK_U8 *)(A1))[5] == ((SK_U8 *)(A2))[5]) & \ - (((SK_U8 *)(A1))[4] == ((SK_U8 *)(A2))[4]) & \ - (((SK_U8 *)(A1))[3] == ((SK_U8 *)(A2))[3]) & \ - (((SK_U8 *)(A1))[2] == ((SK_U8 *)(A2))[2]) & \ - (((SK_U8 *)(A1))[1] == ((SK_U8 *)(A2))[1]) & \ - (((SK_U8 *)(A1))[0] == ((SK_U8 *)(A2))[0])) + (((SK_U8 SK_FAR *)(A1))[5] == ((SK_U8 SK_FAR *)(A2))[5]) & \ + (((SK_U8 SK_FAR *)(A1))[4] == ((SK_U8 SK_FAR *)(A2))[4]) & \ + (((SK_U8 SK_FAR *)(A1))[3] == ((SK_U8 SK_FAR *)(A2))[3]) & \ + (((SK_U8 SK_FAR *)(A1))[2] == ((SK_U8 SK_FAR *)(A2))[2]) & \ + (((SK_U8 SK_FAR *)(A1))[1] == ((SK_U8 SK_FAR *)(A2))[1]) & \ + (((SK_U8 SK_FAR *)(A1))[0] == ((SK_U8 SK_FAR *)(A2))[0])) #else /* SK_ADDR_DWORD_COMPARE */ #define SK_ADDR_EQUAL(A1,A2) ( \ - (*(SK_U16 *)&(((SK_U8 *)(A1))[4]) == *(SK_U16 *)&(((SK_U8 *)(A2))[4])) && \ - (*(SK_U32 *)&(((SK_U8 *)(A1))[0]) == *(SK_U32 *)&(((SK_U8 *)(A2))[0]))) + (*(SK_U16 SK_FAR *)&(((SK_U8 SK_FAR *)(A1))[4]) == \ + *(SK_U16 SK_FAR *)&(((SK_U8 SK_FAR *)(A2))[4])) && \ + (*(SK_U32 SK_FAR *)&(((SK_U8 SK_FAR *)(A1))[0]) == \ + *(SK_U32 SK_FAR *)&(((SK_U8 SK_FAR *)(A2))[0]))) #endif /* SK_ADDR_DWORD_COMPARE */ #endif /* SK_ADDR_EQUAL */ @@ -382,7 +394,7 @@ SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber, - SK_MAC_ADDR *pNewAddr, + SK_MAC_ADDR SK_FAR *pNewAddr, int Flags); extern int SkAddrPromiscuousChange( @@ -403,11 +415,13 @@ SK_U32 PortNumber, int NewPromMode); +#ifndef SK_SLIM extern int SkAddrSwap( SK_AC *pAC, SK_IOC IoC, SK_U32 FromPortNumber, SK_U32 ToPortNumber); +#endif #else /* defined(SK_KR_PROTO)) */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skdebug.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skdebug.h --- linux-2.4.22/drivers/net/sk98lin/h/skdebug.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skdebug.h 2003-10-22 22:48:58.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skdebug.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.12 $ - * Date: $Date: 2002/07/15 15:37:13 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.14 $ + * Date: $Date: 2003/05/13 17:26:00 $ * Purpose: SK specific DEBUG support * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -25,6 +26,12 @@ * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skdrv1st.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skdrv1st.h --- linux-2.4.22/drivers/net/sk98lin/h/skdrv1st.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skdrv1st.h 2003-10-22 22:47:30.000000000 +0000 @@ -2,16 +2,15 @@ * * Name: skdrv1st.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.9.2.2 $ - * Date: $Date: 2001/12/07 12:06:42 $ + * Version: $Revision: 1.1 $ + * Date: $Date: 2003/07/21 07:22:43 $ * Purpose: First header file for driver and all other modules * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2001 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -27,6 +26,30 @@ * History: * * $Log: skdrv1st.h,v $ + * 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 * @@ -89,19 +112,20 @@ /* Check kernel version */ #include -#if (LINUX_VERSION_CODE > 0x020300) -#endif typedef struct s_AC SK_AC; +/* Set card versions */ +#define SK_FAR + /* override some default functions with optimized linux functions */ #define SK_PNMI_STORE_U16(p,v) memcpy((char*)(p),(char*)&(v),2) #define SK_PNMI_STORE_U32(p,v) memcpy((char*)(p),(char*)&(v),4) #define SK_PNMI_STORE_U64(p,v) memcpy((char*)(p),(char*)&(v),8) #define SK_PNMI_READ_U16(p,v) memcpy((char*)&(v),(char*)(p),2) -#define SK_PNMI_READ_U32(p,v) memcpy((char*)&(v),(char*)(p),2) -#define SK_PNMI_READ_U64(p,v) memcpy((char*)&(v),(char*)(p),2) +#define SK_PNMI_READ_U32(p,v) memcpy((char*)&(v),(char*)(p),4) +#define SK_PNMI_READ_U64(p,v) memcpy((char*)&(v),(char*)(p),8) #define SkCsCalculateChecksum(p,l) ((~ip_compute_csum(p, l)) & 0xffff) @@ -150,7 +174,7 @@ /* we use gethrtime(), return unit: nanoseconds */ -#define SK_TICKS_PER_SEC HZ +#define SK_TICKS_PER_SEC 100 #define SK_MEM_MAPPED_IO diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skdrv2nd.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skdrv2nd.h --- linux-2.4.22/drivers/net/sk98lin/h/skdrv2nd.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skdrv2nd.h 2003-10-22 22:49:50.000000000 +0000 @@ -2,16 +2,15 @@ * * Name: skdrv2nd.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.12.2.2 $ - * Date: $Date: 2001/09/05 12:14:50 $ + * Version: $Revision: 1.3 $ + * Date: $Date: 2003/08/12 16:51:18 $ * Purpose: Second header file for driver and all other modules * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2001 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -27,6 +26,40 @@ * History: * * $Log: skdrv2nd.h,v $ + * 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 * @@ -114,7 +147,54 @@ #include "h/skrlmt.h" #include "h/skgedrv.h" -/* global function prototypes ******************************************/ +#define SK_PCI_ISCOMPLIANT(result, pdev) { \ + result = SK_FALSE; /* default */ \ + /* 3Com (0x10b7) */ \ + if (pdev->vendor == 0x10b7) { \ + /* Gigabit Ethernet Adapter (0x1700) */ \ + if ((pdev->device == 0x1700)) { \ + result = SK_TRUE; \ + } \ + /* SysKonnect (0x1148) */ \ + } else if (pdev->vendor == 0x1148) { \ + /* SK-98xx Gigabit Ethernet Server Adapter (0x4300) */ \ + /* SK-98xx V2.0 Gigabit Ethernet Adapter (0x4320) */ \ + if ((pdev->device == 0x4300) || \ + (pdev->device == 0x4320)) { \ + result = SK_TRUE; \ + } \ + /* D-Link (0x1186) */ \ + } else if (pdev->vendor == 0x1186) { \ + /* Gigabit Ethernet Adapter (0x4c00) */ \ + if ((pdev->device == 0x4c00)) { \ + result = SK_TRUE; \ + } \ + /* Marvell (0x11ab) */ \ + } else if (pdev->vendor == 0x11ab) { \ + /* Gigabit Ethernet Adapter (0x4320) */ \ + if ((pdev->device == 0x4320)) { \ + result = SK_TRUE; \ + } \ + /* CNet (0x1371) */ \ + } else if (pdev->vendor == 0x1371) { \ + /* GigaCard Network Adapter (0x434e) */ \ + if ((pdev->device == 0x434e)) { \ + result = SK_TRUE; \ + } \ + /* Linksys (0x1737) */ \ + } else if (pdev->vendor == 0x1737) { \ + /* Gigabit Network Adapter (0x1032) */ \ + /* Gigabit Network Adapter (0x1064) */ \ + if ((pdev->device == 0x1032) || \ + (pdev->device == 0x1064)) { \ + result = SK_TRUE; \ + } \ + } else { \ + result = SK_FALSE; \ + } \ +} + + extern SK_MBUF *SkDrvAllocRlmtMbuf(SK_AC*, SK_IOC, unsigned); extern void SkDrvFreeRlmtMbuf(SK_AC*, SK_IOC, SK_MBUF*); extern SK_U64 SkOsGetTime(SK_AC*); @@ -139,6 +219,25 @@ }; +/* + * Time macros + */ +#if SK_TICKS_PER_SEC == 100 +#define SK_PNMI_HUNDREDS_SEC(t) (t) +#else +#define SK_PNMI_HUNDREDS_SEC(t) ((((unsigned long)t) * 100) / \ + (SK_TICKS_PER_SEC)) +#endif + +/* + * New SkOsGetTime + */ +#define SkOsGetTimeCurrent(pAC, pUsec) {\ + struct timeval t;\ + do_gettimeofday(&t);\ + *pUsec = ((((t.tv_sec) * 1000000L)+t.tv_usec)/10000);\ +} + /* * ioctl definitions @@ -147,6 +246,7 @@ #define SK_IOCTL_GETMIB (SK_IOCTL_BASE + 0) #define SK_IOCTL_SETMIB (SK_IOCTL_BASE + 1) #define SK_IOCTL_PRESETMIB (SK_IOCTL_BASE + 2) +#define SK_IOCTL_GEN (SK_IOCTL_BASE + 3) typedef struct s_IOCTL SK_GE_IOCTL; @@ -181,7 +281,7 @@ /* * alignment of rx/tx descriptors */ -#define DESCR_ALIGN 8 +#define DESCR_ALIGN 64 /* * definitions for pnmi. TODO @@ -194,6 +294,44 @@ #define SK_DRIVER_SET_MTU(pAc,IoC,i,v) 0 #define SK_DRIVER_PRESET_MTU(pAc,IoC,i,v) 0 +/* +** Interim definition of SK_DRV_TIMER placed in this file until +** common modules have boon finallized +*/ +#define SK_DRV_TIMER 11 +#define SK_DRV_MODERATION_TIMER 1 +#define SK_DRV_MODERATION_TIMER_LENGTH 1000000 /* 1 second */ +#define SK_DRV_RX_CLEANUP_TIMER 2 +#define SK_DRV_RX_CLEANUP_TIMER_LENGTH 1000000 /* 100 millisecs */ + +/* +** Definitions regarding transmitting frames +** any calculating any checksum. +*/ +#define C_LEN_ETHERMAC_HEADER_DEST_ADDR 6 +#define C_LEN_ETHERMAC_HEADER_SRC_ADDR 6 +#define C_LEN_ETHERMAC_HEADER_LENTYPE 2 +#define C_LEN_ETHERMAC_HEADER ( (C_LEN_ETHERMAC_HEADER_DEST_ADDR) + \ + (C_LEN_ETHERMAC_HEADER_SRC_ADDR) + \ + (C_LEN_ETHERMAC_HEADER_LENTYPE) ) + +#define C_LEN_ETHERMTU_MINSIZE 46 +#define C_LEN_ETHERMTU_MAXSIZE_STD 1500 +#define C_LEN_ETHERMTU_MAXSIZE_JUMBO 9000 + +#define C_LEN_ETHERNET_MINSIZE ( (C_LEN_ETHERMAC_HEADER) + \ + (C_LEN_ETHERMTU_MINSIZE) ) + +#define C_OFFSET_IPHEADER C_LEN_ETHERMAC_HEADER +#define C_OFFSET_IPHEADER_IPPROTO 9 +#define C_OFFSET_TCPHEADER_TCPCS 16 +#define C_OFFSET_UDPHEADER_UDPCS 6 + +#define C_OFFSET_IPPROTO ( (C_LEN_ETHERMAC_HEADER) + \ + (C_OFFSET_IPHEADER_IPPROTO) ) + +#define C_PROTO_ID_UDP 17 /* refer to RFC 790 or Stevens' */ +#define C_PROTO_ID_TCP 6 /* TCP/IP illustrated for details */ /* TX and RX descriptors *****************************************************/ @@ -228,160 +366,42 @@ struct sk_buff *pMBuf; /* Pointer to Linux' socket buffer */ }; +/* Used interrupt bits in the interrupts source register *********************/ -/* definition of flags in descriptor control field */ -#define RX_CTRL_OWN_BMU UINT32_C(0x80000000) -#define RX_CTRL_STF UINT32_C(0x40000000) -#define RX_CTRL_EOF UINT32_C(0x20000000) -#define RX_CTRL_EOB_IRQ UINT32_C(0x10000000) -#define RX_CTRL_EOF_IRQ UINT32_C(0x08000000) -#define RX_CTRL_DEV_NULL UINT32_C(0x04000000) -#define RX_CTRL_STAT_VALID UINT32_C(0x02000000) -#define RX_CTRL_TIME_VALID UINT32_C(0x01000000) -#define RX_CTRL_CHECK_DEFAULT UINT32_C(0x00550000) -#define RX_CTRL_CHECK_CSUM UINT32_C(0x00560000) -#define RX_CTRL_LEN_MASK UINT32_C(0x0000FFFF) - -#define TX_CTRL_OWN_BMU UINT32_C(0x80000000) -#define TX_CTRL_STF UINT32_C(0x40000000) -#define TX_CTRL_EOF UINT32_C(0x20000000) -#define TX_CTRL_EOB_IRQ UINT32_C(0x10000000) -#define TX_CTRL_EOF_IRQ UINT32_C(0x08000000) -#define TX_CTRL_ST_FWD UINT32_C(0x04000000) -#define TX_CTRL_DISAB_CRC UINT32_C(0x02000000) -#define TX_CTRL_SOFTWARE UINT32_C(0x01000000) -#define TX_CTRL_CHECK_DEFAULT UINT32_C(0x00550000) -#define TX_CTRL_CHECK_CSUM UINT32_C(0x00560000) -#define TX_CTRL_LEN_MASK UINT32_C(0x0000FFFF) - - - -/* The offsets of registers in the TX and RX queue control io area ***********/ - -#define RX_Q_BUF_CTRL_CNT 0x00 -#define RX_Q_NEXT_DESCR_LOW 0x04 -#define RX_Q_BUF_ADDR_LOW 0x08 -#define RX_Q_BUF_ADDR_HIGH 0x0c -#define RX_Q_FRAME_STAT 0x10 -#define RX_Q_TIME_STAMP 0x14 -#define RX_Q_CSUM_1_2 0x18 -#define RX_Q_CSUM_START_1_2 0x1c -#define RX_Q_CUR_DESCR_LOW 0x20 -#define RX_Q_DESCR_HIGH 0x24 -#define RX_Q_CUR_ADDR_LOW 0x28 -#define RX_Q_CUR_ADDR_HIGH 0x2c -#define RX_Q_CUR_BYTE_CNT 0x30 -#define RX_Q_CTRL 0x34 -#define RX_Q_FLAG 0x38 -#define RX_Q_TEST1 0x3c -#define RX_Q_TEST2 0x40 -#define RX_Q_TEST3 0x44 - -#define TX_Q_BUF_CTRL_CNT 0x00 -#define TX_Q_NEXT_DESCR_LOW 0x04 -#define TX_Q_BUF_ADDR_LOW 0x08 -#define TX_Q_BUF_ADDR_HIGH 0x0c -#define TX_Q_FRAME_STAT 0x10 -#define TX_Q_CSUM_START 0x14 -#define TX_Q_CSUM_START_POS 0x18 -#define TX_Q_RESERVED 0x1c -#define TX_Q_CUR_DESCR_LOW 0x20 -#define TX_Q_DESCR_HIGH 0x24 -#define TX_Q_CUR_ADDR_LOW 0x28 -#define TX_Q_CUR_ADDR_HIGH 0x2c -#define TX_Q_CUR_BYTE_CNT 0x30 -#define TX_Q_CTRL 0x34 -#define TX_Q_FLAG 0x38 -#define TX_Q_TEST1 0x3c -#define TX_Q_TEST2 0x40 -#define TX_Q_TEST3 0x44 - -/* definition of flags in the queue control field */ -#define RX_Q_CTRL_POLL_ON 0x00000080 -#define RX_Q_CTRL_POLL_OFF 0x00000040 -#define RX_Q_CTRL_STOP 0x00000020 -#define RX_Q_CTRL_START 0x00000010 -#define RX_Q_CTRL_CLR_I_PAR 0x00000008 -#define RX_Q_CTRL_CLR_I_EOB 0x00000004 -#define RX_Q_CTRL_CLR_I_EOF 0x00000002 -#define RX_Q_CTRL_CLR_I_ERR 0x00000001 - -#define TX_Q_CTRL_POLL_ON 0x00000080 -#define TX_Q_CTRL_POLL_OFF 0x00000040 -#define TX_Q_CTRL_STOP 0x00000020 -#define TX_Q_CTRL_START 0x00000010 -#define TX_Q_CTRL_CLR_I_EOB 0x00000004 -#define TX_Q_CTRL_CLR_I_EOF 0x00000002 -#define TX_Q_CTRL_CLR_I_ERR 0x00000001 - - -/* Interrupt bits in the interrupts source register **************************/ -#define IRQ_HW_ERROR 0x80000000 -#define IRQ_RESERVED 0x40000000 -#define IRQ_PKT_TOUT_RX1 0x20000000 -#define IRQ_PKT_TOUT_RX2 0x10000000 -#define IRQ_PKT_TOUT_TX1 0x08000000 -#define IRQ_PKT_TOUT_TX2 0x04000000 -#define IRQ_I2C_READY 0x02000000 -#define IRQ_SW 0x01000000 -#define IRQ_EXTERNAL_REG 0x00800000 -#define IRQ_TIMER 0x00400000 -#define IRQ_MAC1 0x00200000 -#define IRQ_LINK_SYNC_C_M1 0x00100000 -#define IRQ_MAC2 0x00080000 -#define IRQ_LINK_SYNC_C_M2 0x00040000 -#define IRQ_EOB_RX1 0x00020000 -#define IRQ_EOF_RX1 0x00010000 -#define IRQ_CHK_RX1 0x00008000 -#define IRQ_EOB_RX2 0x00004000 -#define IRQ_EOF_RX2 0x00002000 -#define IRQ_CHK_RX2 0x00001000 -#define IRQ_EOB_SY_TX1 0x00000800 -#define IRQ_EOF_SY_TX1 0x00000400 -#define IRQ_CHK_SY_TX1 0x00000200 -#define IRQ_EOB_AS_TX1 0x00000100 -#define IRQ_EOF_AS_TX1 0x00000080 -#define IRQ_CHK_AS_TX1 0x00000040 -#define IRQ_EOB_SY_TX2 0x00000020 -#define IRQ_EOF_SY_TX2 0x00000010 -#define IRQ_CHK_SY_TX2 0x00000008 -#define IRQ_EOB_AS_TX2 0x00000004 -#define IRQ_EOF_AS_TX2 0x00000002 -#define IRQ_CHK_AS_TX2 0x00000001 - -#define DRIVER_IRQS (IRQ_SW | IRQ_EOF_RX1 | IRQ_EOF_RX2 | \ - IRQ_EOF_SY_TX1 | IRQ_EOF_AS_TX1 | \ - IRQ_EOF_SY_TX2 | IRQ_EOF_AS_TX2) - -#define SPECIAL_IRQS (IRQ_HW_ERROR | IRQ_PKT_TOUT_RX1 | IRQ_PKT_TOUT_RX2 | \ - IRQ_PKT_TOUT_TX1 | IRQ_PKT_TOUT_TX2 | \ - IRQ_I2C_READY | IRQ_EXTERNAL_REG | IRQ_TIMER | \ - IRQ_MAC1 | IRQ_LINK_SYNC_C_M1 | \ - IRQ_MAC2 | IRQ_LINK_SYNC_C_M2 | \ - IRQ_CHK_RX1 | IRQ_CHK_RX2 | \ - IRQ_CHK_SY_TX1 | IRQ_CHK_AS_TX1 | \ - IRQ_CHK_SY_TX2 | IRQ_CHK_AS_TX2) - -#define IRQ_MASK (IRQ_SW | IRQ_EOB_RX1 | IRQ_EOF_RX1 | \ - IRQ_EOB_RX2 | IRQ_EOF_RX2 | \ - IRQ_EOB_SY_TX1 | IRQ_EOF_SY_TX1 | \ - IRQ_EOB_AS_TX1 | IRQ_EOF_AS_TX1 | \ - IRQ_EOB_SY_TX2 | IRQ_EOF_SY_TX2 | \ - IRQ_EOB_AS_TX2 | IRQ_EOF_AS_TX2 | \ - IRQ_HW_ERROR | IRQ_PKT_TOUT_RX1 | IRQ_PKT_TOUT_RX2 | \ - IRQ_PKT_TOUT_TX1 | IRQ_PKT_TOUT_TX2 | \ - IRQ_I2C_READY | IRQ_EXTERNAL_REG | IRQ_TIMER | \ - IRQ_MAC1 | \ - IRQ_MAC2 | \ - IRQ_CHK_RX1 | IRQ_CHK_RX2 | \ - IRQ_CHK_SY_TX1 | IRQ_CHK_AS_TX1 | \ - IRQ_CHK_SY_TX2 | IRQ_CHK_AS_TX2) +#define DRIVER_IRQS ((IS_IRQ_SW) | \ + (IS_R1_F) |(IS_R2_F) | \ + (IS_XS1_F) |(IS_XA1_F) | \ + (IS_XS2_F) |(IS_XA2_F)) + +#define SPECIAL_IRQS ((IS_HW_ERR) |(IS_I2C_READY) | \ + (IS_EXT_REG) |(IS_TIMINT) | \ + (IS_PA_TO_RX1) |(IS_PA_TO_RX2) | \ + (IS_PA_TO_TX1) |(IS_PA_TO_TX2) | \ + (IS_MAC1) |(IS_LNK_SYNC_M1)| \ + (IS_MAC2) |(IS_LNK_SYNC_M2)| \ + (IS_R1_C) |(IS_R2_C) | \ + (IS_XS1_C) |(IS_XA1_C) | \ + (IS_XS2_C) |(IS_XA2_C)) + +#define IRQ_MASK ((IS_IRQ_SW) | \ + (IS_R1_B) |(IS_R1_F) |(IS_R2_B) |(IS_R2_F) | \ + (IS_XS1_B) |(IS_XS1_F) |(IS_XA1_B)|(IS_XA1_F)| \ + (IS_XS2_B) |(IS_XS2_F) |(IS_XA2_B)|(IS_XA2_F)| \ + (IS_HW_ERR) |(IS_I2C_READY)| \ + (IS_EXT_REG) |(IS_TIMINT) | \ + (IS_PA_TO_RX1) |(IS_PA_TO_RX2)| \ + (IS_PA_TO_TX1) |(IS_PA_TO_TX2)| \ + (IS_MAC1) |(IS_MAC2) | \ + (IS_R1_C) |(IS_R2_C) | \ + (IS_XS1_C) |(IS_XA1_C) | \ + (IS_XS2_C) |(IS_XA2_C)) -#define IRQ_HWE_MASK 0x00000FFF /* enable all HW irqs */ +#define IRQ_HWE_MASK (IS_ERR_MSK) /* enable all HW irqs */ typedef struct s_DevNet DEV_NET; struct s_DevNet { + struct proc_dir_entry *proc; int PortNr; int NetNr; int Mtu; @@ -420,6 +440,55 @@ int PortIndex; /* index number of port (0 or 1) */ }; +/* Definitions needed for interrupt moderation *******************************/ + +#define IRQ_EOF_AS_TX ((IS_XA1_F) | (IS_XA2_F)) +#define IRQ_EOF_SY_TX ((IS_XS1_F) | (IS_XS2_F)) +#define IRQ_MASK_TX_ONLY ((IRQ_EOF_AS_TX)| (IRQ_EOF_SY_TX)) +#define IRQ_MASK_RX_ONLY ((IS_R1_F) | (IS_R2_F)) +#define IRQ_MASK_SP_ONLY (SPECIAL_IRQS) +#define IRQ_MASK_TX_RX ((IRQ_MASK_TX_ONLY)| (IRQ_MASK_RX_ONLY)) +#define IRQ_MASK_SP_RX ((SPECIAL_IRQS) | (IRQ_MASK_RX_ONLY)) +#define IRQ_MASK_SP_TX ((SPECIAL_IRQS) | (IRQ_MASK_TX_ONLY)) +#define IRQ_MASK_RX_TX_SP ((SPECIAL_IRQS) | (IRQ_MASK_TX_RX)) + +#define C_INT_MOD_NONE 1 +#define C_INT_MOD_STATIC 2 +#define C_INT_MOD_DYNAMIC 4 + +#define C_CLK_FREQ_GENESIS 53215000 /* shorter: 53.125 MHz */ +#define C_CLK_FREQ_YUKON 78215000 /* shorter: 78.125 MHz */ + +#define C_INTS_PER_SEC_DEFAULT 2000 +#define C_INT_MOD_ENABLE_PERCENTAGE 50 /* if higher 50% enable */ +#define C_INT_MOD_DISABLE_PERCENTAGE 50 /* if lower 50% disable */ + +typedef struct s_DynIrqModInfo DIM_INFO; +struct s_DynIrqModInfo { + unsigned long PrevTimeVal; + unsigned int PrevSysLoad; + unsigned int PrevUsedTime; + unsigned int PrevTotalTime; + int PrevUsedDescrRatio; + int NbrProcessedDescr; + SK_U64 PrevPort0RxIntrCts; + SK_U64 PrevPort1RxIntrCts; + SK_U64 PrevPort0TxIntrCts; + SK_U64 PrevPort1TxIntrCts; + SK_BOOL ModJustEnabled; /* Moderation just enabled yes/no */ + + int MaxModIntsPerSec; /* Moderation Threshold */ + int MaxModIntsPerSecUpperLimit; /* Upper limit for DIM */ + int MaxModIntsPerSecLowerLimit; /* Lower limit for DIM */ + + long MaskIrqModeration; /* ModIrqType (eg. 'TxRx') */ + SK_BOOL DisplayStats; /* Stats yes/no */ + SK_BOOL AutoSizing; /* Resize DIM-timer on/off */ + int IntModTypeSelect; /* EnableIntMod (eg. 'dynamic') */ + + SK_TIMER ModTimer; /* just some timer */ +}; + typedef struct s_PerStrm PER_STRM; #define SK_ALLOC_IRQ 0x00000001 @@ -487,11 +556,16 @@ SK_U32 CsOfs; /* for checksum calculation */ SK_BOOL CheckQueue; /* check event queue soon */ + SK_TIMER DrvCleanupTimer;/* to check for pending descriptors */ + DIM_INFO DynIrqModInfo; /* all data related to DIM */ /* Only for tests */ int PortUp; int PortDown; - + int ChipsetType; /* Chipset family type + * 0 == Genesis family support + * 1 == Yukon family support + */ }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skerror.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skerror.h --- linux-2.4.22/drivers/net/sk98lin/h/skerror.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skerror.h 2003-10-22 22:48:55.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skerror.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.5 $ - * Date: $Date: 2002/04/25 11:05:10 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.7 $ + * Date: $Date: 2003/05/13 17:25:13 $ * Purpose: SK specific Error log support * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -25,6 +26,12 @@ * * 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 * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skgedrv.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skgedrv.h --- linux-2.4.22/drivers/net/sk98lin/h/skgedrv.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skgedrv.h 2003-10-22 22:49:08.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skgedrv.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.6 $ - * Date: $Date: 2002/07/15 15:38:01 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.10 $ + * Date: $Date: 2003/07/04 12:25:01 $ * Purpose: Interface with the driver * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,20 @@ * 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 @@ -68,5 +83,10 @@ #define SK_DRV_PORT_FAIL 8 /* One port fails */ #define SK_DRV_SWITCH_INTERN 9 /* Port switch by the driver itself */ #define SK_DRV_POWER_DOWN 10 /* Power down mode */ - -#endif /* __INC_SKGEDRV_H_ */ +#define SK_DRV_TIMER 11 /* Timer for free use */ +#ifdef SK_NO_RLMT +#define SK_DRV_LINK_UP 12 /* Link Up event for driver */ +#define SK_DRV_LINK_DOWN 13 /* Link Down event for driver */ +#endif +#define SK_DRV_DOWNSHIFT_DET 14 /* Downshift 4-Pair / 2-Pair (YUKON only) */ +#endif /* __INC_SKGEDRV_H_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skgehw.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skgehw.h --- linux-2.4.22/drivers/net/sk98lin/h/skgehw.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skgehw.h 2003-10-22 22:49:45.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skgehw.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.48 $ - * Date: $Date: 2002/12/05 10:25:11 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.53 $ + * Date: $Date: 2003/07/04 12:39:01 $ * Purpose: Defines and Macros for the Gigabit Ethernet Adapter Product Family * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -25,6 +26,27 @@ * * History: * $Log: skgehw.h,v $ + * 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 @@ -334,7 +356,7 @@ #define PCI_SUB_ID 0x2e /* 16 bit Subsystem ID */ #define PCI_BASE_ROM 0x30 /* 32 bit Expansion ROM Base Address */ #define PCI_CAP_PTR 0x34 /* 8 bit Capabilities Ptr */ - /* Byte 35..3b: reserved */ + /* Byte 0x35..0x3b: reserved */ #define PCI_IRQ_LINE 0x3c /* 8 bit Interrupt Line */ #define PCI_IRQ_PIN 0x3d /* 8 bit Interrupt Pin */ #define PCI_MIN_GNT 0x3e /* 8 bit Min_Gnt */ @@ -354,7 +376,9 @@ #define PCI_VPD_NITEM 0x51 /* 8 bit Next Item Ptr */ #define PCI_VPD_ADR_REG 0x52 /* 16 bit VPD Address Register */ #define PCI_VPD_DAT_REG 0x54 /* 32 bit VPD Data Register */ - /* Byte 0x58..0xff: reserved */ + /* Byte 0x58..0x59: reserved */ +#define PCI_SER_LD_CTRL 0x5a /* 16 bit SEEPROM Loader Ctrl (YUKON only) */ + /* Byte 0x5c..0xff: reserved */ /* * I2C Address (PCI Config) @@ -362,13 +386,14 @@ * Note: The temperature and voltage sensors are relocated on a different * I2C bus. */ -#define I2C_ADDR_VPD 0xA0 /* I2C address for the VPD EEPROM */ +#define I2C_ADDR_VPD 0xa0 /* I2C address for the VPD EEPROM */ /* * Define Bits and Values of the registers */ /* PCI_COMMAND 16 bit Command */ - /* Bit 15..10: reserved */ + /* Bit 15..11: reserved */ +#define PCI_INT_DIS BIT_10S /* Interrupt INTx# disable (PCI 2.3) */ #define PCI_FBTEN BIT_9S /* Fast Back-To-Back enable */ #define PCI_SERREN BIT_8S /* SERR enable */ #define PCI_ADSTEP BIT_7S /* Address Stepping */ @@ -398,7 +423,8 @@ #define PCI_UDF BIT_6S /* User Defined Features */ #define PCI_66MHZCAP BIT_5S /* 66 MHz PCI bus clock capable */ #define PCI_NEWCAP BIT_4S /* New cap. list implemented */ - /* Bit 3.. 0: reserved */ +#define PCI_INT_STAT BIT_3S /* Interrupt INTx# Status (PCI 2.3) */ + /* Bit 2.. 0: reserved */ #define PCI_ERRBITS (PCI_PERR | PCI_SERR | PCI_RMABORT | PCI_RTABORT |\ PCI_DATAPERR) @@ -427,7 +453,7 @@ #define PCI_MEM32BIT (0L<<1) /* Base addr anywhere in 32 Bit range */ #define PCI_MEM1M (1L<<1) /* Base addr below 1 MegaByte */ #define PCI_MEM64BIT (2L<<1) /* Base addr anywhere in 64 Bit range */ -#define PCI_MEMSPACE BIT_0 /* Memory Space Indic. */ +#define PCI_MEMSPACE BIT_0 /* Memory Space Indicator */ /* PCI_BASE_2ND 32 bit 2nd Base address */ #define PCI_IOBASE 0xffffff00L /* Bit 31.. 8: I/O Base address */ @@ -436,8 +462,8 @@ #define PCI_IOSPACE BIT_0 /* I/O Space Indicator */ /* PCI_BASE_ROM 32 bit Expansion ROM Base Address */ -#define PCI_ROMBASE 0xfffe0000L /* Bit 31..17: ROM BASE address (1st)*/ -#define PCI_ROMBASZ (0x1cL<<14) /* Bit 16..14: Treat as BASE or SIZE */ +#define PCI_ROMBASE_MSK 0xfffe0000L /* Bit 31..17: ROM Base address */ +#define PCI_ROMBASE_SIZ (0x1cL<<14) /* Bit 16..14: Treat as Base or Size */ #define PCI_ROMSIZE (0x38L<<11) /* Bit 13..11: ROM Size Requirements */ /* Bit 10.. 1: reserved */ #define PCI_ROMEN BIT_0 /* Address Decode enable */ @@ -445,15 +471,15 @@ /* Device Dependent Region */ /* PCI_OUR_REG_1 32 bit Our Register 1 */ /* Bit 31..29: reserved */ -#define PCI_PHY_COMA BIT_28 /* Set PHY to Coma Mode */ -#define PCI_EN_CAL BIT_27 /* Enable PCI buffer strength calibr. */ -#define PCI_DIS_CAL BIT_26 /* Disable PCI buffer strength calibr. */ +#define PCI_PHY_COMA BIT_28 /* Set PHY to Coma Mode (YUKON only) */ +#define PCI_TEST_CAL BIT_27 /* Test PCI buffer calib. (YUKON only) */ +#define PCI_EN_CAL BIT_26 /* Enable PCI buffer calib. (YUKON only) */ #define PCI_VIO BIT_25 /* PCI I/O Voltage, 0 = 3.3V, 1 = 5V */ -#define PCI_EN_BOOT BIT_24 /* Enable BOOT via ROM */ +#define PCI_DIS_BOOT BIT_24 /* Disable BOOT via ROM */ #define PCI_EN_IO BIT_23 /* Mapping to I/O space */ -#define PCI_EN_FPROM BIT_22 /* FLASH mapped to mem? */ - /* 1 = Map Flash to Mem */ - /* 0 = Disable addr. dec*/ +#define PCI_EN_FPROM BIT_22 /* Enable FLASH mapping to memory */ + /* 1 = Map Flash to memory */ + /* 0 = Disable addr. dec */ #define PCI_PAGESIZE (3L<<20) /* Bit 21..20: FLASH Page Size */ #define PCI_PAGE_16 (0L<<20) /* 16 k pages */ #define PCI_PAGE_32K (1L<<20) /* 32 k pages */ @@ -496,7 +522,7 @@ /* Power Management Region */ /* PCI_PM_CAP_REG 16 bit Power Management Capabilities */ -#define PCI_PME_SUP (0x1f<<11) /* Bit 15..11: PM Event Support */ +#define PCI_PME_SUP_MSK (0x1f<<11) /* Bit 15..11: PM Event Support Mask */ #define PCI_PME_D3C_SUP BIT_15S /* PME from D3cold Support (if Vaux) */ #define PCI_PME_D3H_SUP BIT_14S /* PME from D3hot Support */ #define PCI_PME_D2_SUP BIT_13S /* PME from D2 Support */ @@ -525,8 +551,8 @@ /* VPD Region */ /* PCI_VPD_ADR_REG 16 bit VPD Address Register */ -#define PCI_VPD_FLAG BIT_15S /* starts VPD rd/wd cycle*/ -#define PCI_VPD_ADDR 0x3fffL /* Bit 14.. 0: VPD address */ +#define PCI_VPD_FLAG BIT_15S /* starts VPD rd/wr cycle */ +#define PCI_VPD_ADR_MSK 0x7fffL /* Bit 14.. 0: VPD address mask */ /* Control Register File (Address Map) */ @@ -996,7 +1022,10 @@ #define RAP_RAP 0x3f /* Bit 6..0: 0 = block 0,..,6f = block 6f */ /* B0_CTST 16 bit Control/Status register */ - /* Bit 15..11: reserved */ + /* Bit 15..14: reserved */ +#define CS_CLK_RUN_HOT BIT_13S /* CLK_RUN hot m. (YUKON-Lite only) */ +#define CS_CLK_RUN_RST BIT_12S /* CLK_RUN reset (YUKON-Lite only) */ +#define CS_CLK_RUN_ENA BIT_11S /* CLK_RUN enable (YUKON-Lite only) */ #define CS_VAUX_AVAIL BIT_10S /* VAUX available (YUKON only) */ #define CS_BUS_CLOCK BIT_9S /* Bus Clock 0/1 = 33/66 MHz */ #define CS_BUS_SLOT_SZ BIT_8S /* Slot Size 0/1 = 32/64 bit slot */ @@ -1028,7 +1057,7 @@ /* B0_IMSK 32 bit Interrupt Mask Register */ /* B0_SP_ISRC 32 bit Special Interrupt Source Reg */ /* B2_IRQM_MSK 32 bit IRQ Moderation Mask */ -#define IS_ALL_MSK 0xbfffffffL /* All Interrupt bits */ +#define IS_ALL_MSK 0xbfffffffUL /* All Interrupt bits */ #define IS_HW_ERR BIT_31 /* Interrupt HW Error */ /* Bit 30: reserved */ #define IS_PA_TO_RX1 BIT_29 /* Packet Arb Timeout Rx1 */ @@ -1101,8 +1130,10 @@ #define CFG_SNG_MAC BIT_0S /* MAC Config: 0=2 MACs / 1=1 MAC*/ /* B2_CHIP_ID 8 bit Chip Identification Number */ -#define CHIP_ID_GENESIS 0x0a /* Chip ID for GENESIS */ -#define CHIP_ID_YUKON 0xb0 /* Chip ID for YUKON */ +#define CHIP_ID_GENESIS 0x0a /* Chip ID for GENESIS */ +#define CHIP_ID_YUKON 0xb0 /* Chip ID for YUKON */ +#define CHIP_ID_YUKON_LITE 0xb1 /* Chip ID for YUKON-Lite (Rev. A1) */ +#define CHIP_ID_YUKON_LP 0xb2 /* Chip ID for YUKON-LP */ /* B2_FAR 32 bit Flash-Prom Addr Reg/Cnt */ #define FAR_ADDR 0x1ffffL /* Bit 16.. 0: FPROM Address mask */ @@ -1168,16 +1199,16 @@ /* B2_GP_IO 32 bit General Purpose I/O Register */ /* Bit 31..26: reserved */ -#define GP_DIR_9 BIT_25 /* IO_9 direct, 0=I/1=O */ -#define GP_DIR_8 BIT_24 /* IO_8 direct, 0=I/1=O */ -#define GP_DIR_7 BIT_23 /* IO_7 direct, 0=I/1=O */ -#define GP_DIR_6 BIT_22 /* IO_6 direct, 0=I/1=O */ -#define GP_DIR_5 BIT_21 /* IO_5 direct, 0=I/1=O */ -#define GP_DIR_4 BIT_20 /* IO_4 direct, 0=I/1=O */ -#define GP_DIR_3 BIT_19 /* IO_3 direct, 0=I/1=O */ -#define GP_DIR_2 BIT_18 /* IO_2 direct, 0=I/1=O */ -#define GP_DIR_1 BIT_17 /* IO_1 direct, 0=I/1=O */ -#define GP_DIR_0 BIT_16 /* IO_0 direct, 0=I/1=O */ +#define GP_DIR_9 BIT_25 /* IO_9 direct, 0=In/1=Out */ +#define GP_DIR_8 BIT_24 /* IO_8 direct, 0=In/1=Out */ +#define GP_DIR_7 BIT_23 /* IO_7 direct, 0=In/1=Out */ +#define GP_DIR_6 BIT_22 /* IO_6 direct, 0=In/1=Out */ +#define GP_DIR_5 BIT_21 /* IO_5 direct, 0=In/1=Out */ +#define GP_DIR_4 BIT_20 /* IO_4 direct, 0=In/1=Out */ +#define GP_DIR_3 BIT_19 /* IO_3 direct, 0=In/1=Out */ +#define GP_DIR_2 BIT_18 /* IO_2 direct, 0=In/1=Out */ +#define GP_DIR_1 BIT_17 /* IO_1 direct, 0=In/1=Out */ +#define GP_DIR_0 BIT_16 /* IO_0 direct, 0=In/1=Out */ /* Bit 15..10: reserved */ #define GP_IO_9 BIT_9 /* IO_9 pin */ #define GP_IO_8 BIT_8 /* IO_8 pin */ @@ -1327,7 +1358,7 @@ /* TXA_LIM_INI 32 bit Tx Arb Limit Counter Init Val */ /* TXA_LIM_VAL 32 bit Tx Arb Limit Counter Value */ /* Bit 31..24: reserved */ -#define TXA_MAX_VAL 0x00ffffffL /* Bit 23.. 0: Max TXA Timer/Cnt Val */ +#define TXA_MAX_VAL 0x00ffffffUL/* Bit 23.. 0: Max TXA Timer/Cnt Val */ /* TXA_CTRL 8 bit Tx Arbiter Control Register */ #define TXA_ENA_FSYNC BIT_7S /* Enable force of sync Tx queue */ @@ -1646,9 +1677,11 @@ #define GMF_CLI_TX_PE BIT_4 /* Clear IRQ Tx Parity Error */ /* Bits 3..0: same as for RX_GMF_CTRL_T */ -#define GMF_RX_CTRL_DEF GMF_OPER_ON +#define GMF_RX_CTRL_DEF (GMF_OPER_ON | GMF_RX_F_FL_ON) #define GMF_TX_CTRL_DEF GMF_OPER_ON +#define RX_GMF_FL_THR_DEF 0x0a /* Rx GMAC FIFO Flush Threshold default */ + /* GMAC_TI_ST_CTRL 8 bit Time Stamp Timer Ctrl Reg (YUKON only) */ /* Bit 7.. 3: reserved */ #define GMT_ST_START BIT_2S /* Start Time Stamp Timer */ @@ -1767,7 +1800,7 @@ WOL_CTL_DIS_LINK_CHG_UNIT | \ WOL_CTL_DIS_PATTERN_UNIT | \ WOL_CTL_DIS_MAGIC_PKT_UNIT) - + /* WOL_MATCH_CTL 8 bit WOL Match Control Reg */ #define WOL_CTL_PATT_ENA(x) (BIT_0 << (x)) @@ -1811,7 +1844,7 @@ SK_U32 RxAdrHi; /* Physical Rx Buffer Address upper dword */ SK_U32 RxStat; /* Receive Frame Status Word */ SK_U32 RxTiSt; /* Receive Time Stamp (from XMAC on GENESIS) */ -#ifndef SK_USE_REV_DESC +#ifndef SK_USE_REV_DESC SK_U16 RxTcpSum1; /* TCP Checksum 1 */ SK_U16 RxTcpSum2; /* TCP Checksum 2 */ SK_U16 RxTcpSp1; /* TCP Checksum Calculation Start Position 1 */ @@ -1855,7 +1888,7 @@ #define BMU_CHECK (0x55L<<16) /* Default BMU check */ #define BMU_TCP_CHECK (0x56L<<16) /* Descr with TCP ext */ #define BMU_UDP_CHECK (0x57L<<16) /* Descr with UDP ext (YUKON only) */ -#define BMU_BBC 0xFFFFL /* Bit 15.. 0: Buffer Byte Counter */ +#define BMU_BBC 0xffffL /* Bit 15.. 0: Buffer Byte Counter */ /* TxStat Transmit Frame Status Word */ /* RxStat Receive Frame Status Word */ @@ -1866,20 +1899,9 @@ * (see XMR_FS bits) */ -/* other defines *************************************************************/ - -/* - * FlashProm specification - */ -#define MAX_PAGES 0x20000L /* Every byte has a single page */ -#define MAX_FADDR 1 /* 1 byte per page */ -#define SKFDDI_PSZ 8 /* address PROM size */ - /* macros ********************************************************************/ -/* - * Receive and Transmit Queues - */ +/* Receive and Transmit Queues */ #define Q_R1 0x0000 /* Receive Queue 1 */ #define Q_R2 0x0080 /* Receive Queue 2 */ #define Q_XS1 0x0200 /* Synchronous Transmit Queue 1 */ @@ -1892,7 +1914,7 @@ * * Use this macro to access the Receive and Transmit Queue Registers. * - * para: + * para: * Queue Queue to access. * Values: Q_R1, Q_R2, Q_XS1, Q_XA1, Q_XS2, and Q_XA2 * Offs Queue register offset. @@ -1907,7 +1929,7 @@ * * Use this macro to access the RAM Buffer Registers. * - * para: + * para: * Queue Queue to access. * Values: Q_R1, Q_R2, Q_XS1, Q_XA1, Q_XS2, and Q_XA2 * Offs Queue register offset. @@ -1918,9 +1940,7 @@ #define RB_ADDR(Queue, Offs) (B16_RAM_REGS + (Queue) + (Offs)) -/* - * MAC Related Registers - */ +/* MAC Related Registers */ #define MAC_1 0 /* belongs to the port near the slot */ #define MAC_2 1 /* belongs to the port far away from the slot */ @@ -1929,7 +1949,7 @@ * * Use this macro to access a MAC Related Registers inside the ASIC. * - * para: + * para: * Mac MAC to access. * Values: MAC_1, MAC_2 * Offs MAC register offset. @@ -1981,9 +2001,9 @@ #define XM_IN32(IoC, Mac, Reg, pVal) { \ SK_IN16((IoC), XMA((Mac), (Reg)), \ - (SK_U16 *)&((SK_U16 *)(pVal))[XM_WORD_LO]); \ + (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_LO]); \ SK_IN16((IoC), XMA((Mac), (Reg+2)), \ - (SK_U16 *)&((SK_U16 *)(pVal))[XM_WORD_HI]); \ + (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_HI]); \ } #define XM_OUT32(IoC, Mac, Reg, Val) { \ @@ -2009,8 +2029,8 @@ } #define XM_OUTADDR(IoC, Mac, Reg, pVal) { \ - SK_U8 *pByte; \ - pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \ + SK_U8 SK_FAR *pByte; \ + pByte = (SK_U8 SK_FAR *)&((SK_U8 SK_FAR *)(pVal))[0]; \ SK_OUT16((IoC), XMA((Mac), (Reg)), (SK_U16) \ (((SK_U16)(pByte[0]) & 0x00ff) | \ (((SK_U16)(pByte[1]) << 8) & 0xff00))); \ @@ -2024,8 +2044,8 @@ #define XM_INHASH(IoC, Mac, Reg, pVal) { \ SK_U16 Word; \ - SK_U8 *pByte; \ - pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \ + SK_U8 SK_FAR *pByte; \ + pByte = (SK_U8 SK_FAR *)&((SK_U8 SK_FAR *)(pVal))[0]; \ SK_IN16((IoC), XMA((Mac), (Reg)), &Word); \ pByte[0] = (SK_U8)(Word & 0x00ff); \ pByte[1] = (SK_U8)((Word >> 8) & 0x00ff); \ @@ -2041,8 +2061,8 @@ } #define XM_OUTHASH(IoC, Mac, Reg, pVal) { \ - SK_U8 *pByte; \ - pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \ + SK_U8 SK_FAR *pByte; \ + pByte = (SK_U8 SK_FAR *)&((SK_U8 SK_FAR *)(pVal))[0]; \ SK_OUT16((IoC), XMA((Mac), (Reg)), (SK_U16) \ (((SK_U16)(pByte[0]) & 0x00ff)| \ (((SK_U16)(pByte[1]) << 8) & 0xff00))); \ @@ -2089,9 +2109,9 @@ #define GM_IN32(IoC, Mac, Reg, pVal) { \ SK_IN16((IoC), GMA((Mac), (Reg)), \ - (SK_U16 *)&((SK_U16 *)(pVal))[XM_WORD_LO]); \ + (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_LO]); \ SK_IN16((IoC), GMA((Mac), (Reg+4)), \ - (SK_U16 *)&((SK_U16 *)(pVal))[XM_WORD_HI]); \ + (SK_U16 SK_FAR*)&((SK_U16 SK_FAR*)(pVal))[XM_WORD_HI]); \ } #define GM_OUT32(IoC, Mac, Reg, Val) { \ @@ -2115,8 +2135,8 @@ } #define GM_OUTADDR(IoC, Mac, Reg, pVal) { \ - SK_U8 *pByte; \ - pByte = (SK_U8 *)&((SK_U8 *)(pVal))[0]; \ + SK_U8 SK_FAR *pByte; \ + pByte = (SK_U8 SK_FAR *)&((SK_U8 SK_FAR *)(pVal))[0]; \ SK_OUT16((IoC), GMA((Mac), (Reg)), (SK_U16) \ (((SK_U16)(pByte[0]) & 0x00ff) | \ (((SK_U16)(pByte[1]) << 8) & 0xff00))); \ @@ -2186,7 +2206,7 @@ #define PHY_ADDR_BCOM (1<<8) #define PHY_ADDR_LONE (3<<8) #define PHY_ADDR_NAT (0<<8) - + /* GPHY address (bits 15..11 of SMI control reg) */ #define PHY_ADDR_MARV 0 @@ -2196,7 +2216,7 @@ * PHY_READ() read a 16 bit value from the PHY * PHY_WRITE() write a 16 bit value to the PHY * - * para: + * para: * IoC I/O context needed for SK I/O macros * pPort Pointer to port struct for PhyAddr * Mac XMAC to access values: MAC_1 or MAC_2 @@ -2268,7 +2288,7 @@ * * para: * Addr PCI configuration register to access. - * Values: PCI_VENDOR_ID ... PCI_VPD_ADDR, + * Values: PCI_VENDOR_ID ... PCI_VPD_ADR_REG, * * usage SK_IN16(pAC, PCI_C(PCI_VENDOR_ID), pVal); */ @@ -2287,12 +2307,12 @@ * #define SK_IN8(pAC, Addr, pVal) ...\ * *pVal = (SK_U8)inp(SK_HW_ADDR(pAC->Hw.Iop, Addr))) */ -#ifdef SK_MEM_MAPPED_IO +#ifdef SK_MEM_MAPPED_IO #define SK_HW_ADDR(Base, Addr) ((Base) + (Addr)) -#else /* SK_MEM_MAPPED_IO */ +#else /* SK_MEM_MAPPED_IO */ #define SK_HW_ADDR(Base, Addr) \ ((Base) + (((Addr) & 0x7f) | (((Addr) >> 7 > 0) ? 0x80 : 0))) -#endif /* SK_MEM_MAPPED_IO */ +#endif /* SK_MEM_MAPPED_IO */ #define SZ_LONG (sizeof(SK_U32)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skgehwt.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skgehwt.h --- linux-2.4.22/drivers/net/sk98lin/h/skgehwt.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skgehwt.h 2003-10-22 22:48:31.000000000 +0000 @@ -1,17 +1,17 @@ /****************************************************************************** * * Name: skhwt.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.5 $ - * Date: $Date: 1999/11/22 13:54:24 $ + * Project: Gigabit Ethernet Adapters, Schedule-Modul + * Version: $Revision: 1.6 $ + * Date: $Date: 2003/05/13 17:57:48 $ * Purpose: Defines for the hardware timer functions * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998,1999 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -27,6 +27,9 @@ * History: * * $Log: skgehwt.h,v $ + * 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. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skgeinit.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skgeinit.h --- linux-2.4.22/drivers/net/sk98lin/h/skgeinit.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skgeinit.h 2003-10-22 22:49:15.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skgeinit.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.73 $ - * Date: $Date: 2002/11/15 12:47:25 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.81 $ + * Date: $Date: 2003/07/04 12:30:38 $ * Purpose: Structures and prototypes for the GE Init Module * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,66 +27,98 @@ * History: * * $Log: skgeinit.h,v $ + * 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(), @@ -93,19 +126,19 @@ * 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 @@ -120,150 +153,150 @@ * 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 Autonegotiation - * + * add: Link partnet autoneg states : Unknown Manual and Auto-negotiation + * * Revision 1.30 1998/12/07 12:17:04 gklug - * add: Link Partner autonegotiation flag - * + * 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(). * @@ -328,9 +361,11 @@ /* defines ********************************************************************/ +#define SK_TEST_VAL 0x11335577UL + /* modifying Link LED behaviour (used with SkGeLinkLED()) */ #define SK_LNK_OFF LED_OFF -#define SK_LNK_ON (LED_ON | LED_BLK_OFF | LED_SYNC_OFF) +#define SK_LNK_ON (LED_ON | LED_BLK_OFF | LED_SYNC_OFF) #define SK_LNK_BLINK (LED_ON | LED_BLK_ON | LED_SYNC_ON) #define SK_LNK_PERM (LED_ON | LED_BLK_OFF | LED_SYNC_ON) #define SK_LNK_TST (LED_ON | LED_BLK_ON | LED_SYNC_OFF) @@ -352,14 +387,17 @@ #define SK_LED_TST 2 /* Counter and Timer constants, for a host clock of 62.5 MHz */ -#define SK_XMIT_DUR 0x002faf08L /* 50 ms */ -#define SK_BLK_DUR 0x01dcd650L /* 500 ms */ +#define SK_XMIT_DUR 0x002faf08UL /* 50 ms */ +#define SK_BLK_DUR 0x01dcd650UL /* 500 ms */ + +#define SK_DPOLL_DEF 0x00ee6b28UL /* 250 ms at 62.5 MHz */ -#define SK_DPOLL_DEF 0x00EE6B28L /* 250 ms */ -#define SK_DPOLL_MAX 0x00FFFFFFL /* ca. 268ms */ +#define SK_DPOLL_MAX 0x00ffffffUL /* 268 ms at 62.5 MHz */ + /* 215 ms at 78.12 MHz */ #define SK_FACT_62 100 /* is given in percent */ -#define SK_FACT_53 85 +#define SK_FACT_53 85 /* on GENESIS: 53.12 MHz */ +#define SK_FACT_78 125 /* on YUKON: 78.12 MHz */ /* Timeout values */ #define SK_MAC_TO_53 72 /* MAC arbiter timeout */ @@ -447,9 +485,7 @@ #define SK_LMODE_AUTOFULL 4 /* AutoFull Duplex Mode */ #define SK_LMODE_AUTOBOTH 5 /* AutoBoth Duplex Mode */ #define SK_LMODE_AUTOSENSE 6 /* configured mode auto sensing */ -#define SK_LMODE_INDETERMINATED 7 /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_LMODE_INDETERMINATED 7 /* indeterminated */ /* Auto-negotiation timeout in 100ms granularity */ #define SK_AND_MAX_TO 6 /* Wait 600 msec before link comes up */ @@ -465,27 +501,21 @@ #define SK_LSPEED_CAP_10MBPS (1<<1) /* 10 Mbps */ #define SK_LSPEED_CAP_100MBPS (1<<2) /* 100 Mbps */ #define SK_LSPEED_CAP_1000MBPS (1<<3) /* 1000 Mbps */ -#define SK_LSPEED_CAP_INDETERMINATED (1<<4) /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_LSPEED_CAP_INDETERMINATED (1<<4) /* indeterminated */ /* Link Speed Parameter */ #define SK_LSPEED_AUTO 1 /* Automatic resolution */ #define SK_LSPEED_10MBPS 2 /* 10 Mbps */ #define SK_LSPEED_100MBPS 3 /* 100 Mbps */ #define SK_LSPEED_1000MBPS 4 /* 1000 Mbps */ -#define SK_LSPEED_INDETERMINATED 5 /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_LSPEED_INDETERMINATED 5 /* indeterminated */ /* Link Speed Current State */ #define SK_LSPEED_STAT_UNKNOWN 1 #define SK_LSPEED_STAT_10MBPS 2 #define SK_LSPEED_STAT_100MBPS 3 #define SK_LSPEED_STAT_1000MBPS 4 -#define SK_LSPEED_STAT_INDETERMINATED 5 /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_LSPEED_STAT_INDETERMINATED 5 /* Link Capability Parameter */ @@ -493,62 +523,50 @@ #define SK_LMODE_CAP_FULL (1<<1) /* Full Duplex Mode */ #define SK_LMODE_CAP_AUTOHALF (1<<2) /* AutoHalf Duplex Mode */ #define SK_LMODE_CAP_AUTOFULL (1<<3) /* AutoFull Duplex Mode */ -#define SK_LMODE_CAP_INDETERMINATED (1<<4) /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_LMODE_CAP_INDETERMINATED (1<<4) /* indeterminated */ /* Link Mode Current State */ #define SK_LMODE_STAT_UNKNOWN 1 /* Unknown Duplex Mode */ #define SK_LMODE_STAT_HALF 2 /* Half Duplex Mode */ #define SK_LMODE_STAT_FULL 3 /* Full Duplex Mode */ -#define SK_LMODE_STAT_AUTOHALF 4 /* Half Duplex Mode obtained by AutoNeg */ -#define SK_LMODE_STAT_AUTOFULL 5 /* Full Duplex Mode obtained by AutoNeg */ -#define SK_LMODE_STAT_INDETERMINATED 6 /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_LMODE_STAT_AUTOHALF 4 /* Half Duplex Mode obtained by Auto-Neg */ +#define SK_LMODE_STAT_AUTOFULL 5 /* Full Duplex Mode obtained by Auto-Neg */ +#define SK_LMODE_STAT_INDETERMINATED 6 /* indeterminated */ + /* Flow Control Mode Parameter (and capabilities) */ -#define SK_FLOW_MODE_NONE 1 /* No Flow Control */ +#define SK_FLOW_MODE_NONE 1 /* No Flow-Control */ #define SK_FLOW_MODE_LOC_SEND 2 /* Local station sends PAUSE */ -#define SK_FLOW_MODE_SYMMETRIC 3 /* Both station may send PAUSE */ -#define SK_FLOW_MODE_SYM_OR_REM 4 /* Both station may send PAUSE or +#define SK_FLOW_MODE_SYMMETRIC 3 /* Both stations may send PAUSE */ +#define SK_FLOW_MODE_SYM_OR_REM 4 /* Both stations may send PAUSE or * just the remote station may send PAUSE */ -#define SK_FLOW_MODE_INDETERMINATED 5 /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_FLOW_MODE_INDETERMINATED 5 /* indeterminated */ /* Flow Control Status Parameter */ #define SK_FLOW_STAT_NONE 1 /* No Flow Control */ #define SK_FLOW_STAT_REM_SEND 2 /* Remote Station sends PAUSE */ #define SK_FLOW_STAT_LOC_SEND 3 /* Local station sends PAUSE */ #define SK_FLOW_STAT_SYMMETRIC 4 /* Both station may send PAUSE */ -#define SK_FLOW_STAT_INDETERMINATED 5 /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_FLOW_STAT_INDETERMINATED 5 /* indeterminated */ + /* Master/Slave Mode Capabilities */ #define SK_MS_CAP_AUTO (1<<0) /* Automatic resolution */ #define SK_MS_CAP_MASTER (1<<1) /* This station is master */ #define SK_MS_CAP_SLAVE (1<<2) /* This station is slave */ -#define SK_MS_CAP_INDETERMINATED (1<<3) /* Return value for virtual port if - * multiple ports are differently configured. - */ +#define SK_MS_CAP_INDETERMINATED (1<<3) /* indeterminated */ /* Set Master/Slave Mode Parameter (and capabilities) */ #define SK_MS_MODE_AUTO 1 /* Automatic resolution */ #define SK_MS_MODE_MASTER 2 /* This station is master */ #define SK_MS_MODE_SLAVE 3 /* This station is slave */ -#define SK_MS_MODE_INDETERMINATED 4 /* Return value for virtual port if - * multiple ports are differently - */ +#define SK_MS_MODE_INDETERMINATED 4 /* indeterminated */ /* Master/Slave Status Parameter */ -#define SK_MS_STAT_UNSET 1 /* The MS status is never been determ*/ +#define SK_MS_STAT_UNSET 1 /* The M/S status is not set */ #define SK_MS_STAT_MASTER 2 /* This station is master */ #define SK_MS_STAT_SLAVE 3 /* This station is slave */ -#define SK_MS_STAT_FAULT 4 /* MS resolution failed */ -#define SK_MS_STAT_INDETERMINATED 5 /* Return value for virtual port if - * multiple ports are differently - */ +#define SK_MS_STAT_FAULT 4 /* M/S resolution failed */ +#define SK_MS_STAT_INDETERMINATED 5 /* indeterminated */ /* parameter 'Mode' when calling SkXmSetRxCmd() */ #define SK_STRIP_FCS_ON (1<<0) /* Enable FCS stripping of Rx frames */ @@ -557,8 +575,8 @@ #define SK_STRIP_PAD_OFF (1<<3) /* Disable pad byte stripping of Rx fr */ #define SK_LENERR_OK_ON (1<<4) /* Don't chk fr for in range len error */ #define SK_LENERR_OK_OFF (1<<5) /* Check frames for in range len error */ -#define SK_BIG_PK_OK_ON (1<<6) /* Don't set rcvError bit for big fr */ -#define SK_BIG_PK_OK_OFF (1<<7) /* Set rcvError bit for big frames */ +#define SK_BIG_PK_OK_ON (1<<6) /* Don't set Rx Error bit for big frames */ +#define SK_BIG_PK_OK_OFF (1<<7) /* Set Rx Error bit for big frames */ #define SK_SELF_RX_ON (1<<8) /* Enable Rx of own packets */ #define SK_SELF_RX_OFF (1<<9) /* Disable Rx of own packets */ @@ -579,6 +597,11 @@ /* Default receive frame limit for Workaround of XMAC Errata */ #define SK_DEF_RX_WA_LIM SK_CONSTU64(100) +/* values for GILedBlinkCtrl (LED Blink Control) */ +#define SK_ACT_LED_BLINK (1<<0) /* Active LED blinking */ +#define SK_DUP_LED_NORMAL (1<<1) /* Duplex LED normal */ +#define SK_LED_LINK100_ON (1<<2) /* Link 100M LED on */ + /* Link Partner Status */ #define SK_LIPA_UNKNOWN 0 /* Link partner is in unknown state */ #define SK_LIPA_MANUAL 1 /* Link partner is in detected manual state */ @@ -598,10 +621,10 @@ typedef struct s_GeMacFunc { int (*pFnMacUpdateStats)(SK_AC *pAC, SK_IOC IoC, unsigned int Port); int (*pFnMacStatistic)(SK_AC *pAC, SK_IOC IoC, unsigned int Port, - SK_U16 StatAddr, SK_U32 *pVal); + SK_U16 StatAddr, SK_U32 SK_FAR *pVal); int (*pFnMacResetCounter)(SK_AC *pAC, SK_IOC IoC, unsigned int Port); int (*pFnMacOverflow)(SK_AC *pAC, SK_IOC IoC, unsigned int Port, - SK_U16 IStatus, SK_U64 *pVal); + SK_U16 IStatus, SK_U64 SK_FAR *pVal); } SK_GEMACFUNC; /* @@ -612,7 +635,7 @@ SK_TIMER PWaTimer; /* Workaround Timer */ SK_TIMER HalfDupChkTimer; #endif /* SK_DIAG */ - SK_U32 PPrevShorts; /* Previous short Counter checking */ + SK_U32 PPrevShorts; /* Previous Short Counter checking */ SK_U32 PPrevFcs; /* Previous FCS Error Counter checking */ SK_U64 PPrevRx; /* Previous RxOk Counter checking */ SK_U64 PRxLim; /* Previous RxOk Counter checking */ @@ -634,12 +657,13 @@ int PXsQOff; /* Synchronous Tx Queue Address Offset */ int PXaQOff; /* Asynchronous Tx Queue Address Offset */ int PhyType; /* PHY used on this port */ + int PState; /* Port status (reset, stop, init, run) */ SK_U16 PhyId1; /* PHY Id1 on this port */ SK_U16 PhyAddr; /* MDIO/MDC PHY address */ SK_U16 PIsave; /* Saved Interrupt status word */ SK_U16 PSsave; /* Saved PHY status word */ + SK_U16 PGmANegAdv; /* Saved GPhy AutoNegAdvertisment register */ SK_BOOL PHWLinkUp; /* The hardware Link is up (wiring) */ - SK_BOOL PState; /* Is port initialized ? */ SK_BOOL PLinkBroken; /* Is Link broken ? */ SK_BOOL PCheckPar; /* Do we check for parity errors ? */ SK_BOOL HalfDupTimerActive; @@ -656,7 +680,7 @@ SK_U8 PMSCap; /* Master/Slave Capabilities */ SK_U8 PMSMode; /* Master/Slave Mode */ SK_U8 PMSStatus; /* Master/Slave Status */ - SK_U8 PAutoNegFail; /* Auto-negotiation fail flag */ + SK_BOOL PAutoNegFail; /* Auto-negotiation fail flag */ SK_U8 PLipaAutoNeg; /* Auto-negotiation possible with Link Partner */ SK_U8 PCableLen; /* Cable Length */ SK_U8 PMdiPairLen[4]; /* MDI[0..3] Pair Length */ @@ -668,24 +692,29 @@ * (has to be included in the adapter context) */ typedef struct s_GeInit { + int GIChipId; /* Chip Identification Number */ + int GIChipRev; /* Chip Revision Number */ SK_U8 GIPciHwRev; /* PCI HW Revision Number */ - SK_U8 GIChipId; /* Chip Identification Number */ - SK_U8 GIChipRev; /* Chip Revision Number */ SK_BOOL GIGenesis; /* Genesis adapter ? */ + SK_BOOL GIYukon; /* YUKON-A1/Bx chip */ + SK_BOOL GIYukonLite; /* YUKON-Lite chip */ SK_BOOL GICopperType; /* Copper Type adapter ? */ SK_BOOL GIPciSlot64; /* 64-bit PCI Slot */ SK_BOOL GIPciClock66; /* 66 MHz PCI Clock */ SK_BOOL GIVauxAvail; /* VAUX available (YUKON) */ SK_BOOL GIYukon32Bit; /* 32-Bit YUKON adapter */ + SK_U16 GILedBlinkCtrl; /* LED Blink Control */ int GIMacsFound; /* Number of MACs found on this adapter */ int GIMacType; /* MAC Type used on this adapter */ int GIHstClkFact; /* Host Clock Factor (62.5 / HstClk * 100) */ - int GIPortUsage; /* Driver Port Usage: SK_RED_LINK/SK_MUL_LINK */ + int GIPortUsage; /* Driver Port Usage */ int GILevel; /* Initialization Level completed */ int GIRamSize; /* The RAM size of the adapter in kB */ - int GIWolOffs; /* WOL Register Offset (HW-Bug in 1st revision) */ + int GIWolOffs; /* WOL Register Offset (HW-Bug in Rev. A) */ SK_U32 GIRamOffs; /* RAM Address Offset for addr calculation */ - SK_U32 GIPollTimerVal; /* Descriptor Poll Timer Init Val in clk ticks*/ + SK_U32 GIPollTimerVal; /* Descr. Poll Timer Init Val (HstClk ticks) */ + SK_U32 GIValIrqMask; /* Value for Interrupt Mask */ + SK_U32 GITimeStampCnt; /* Time Stamp High Counter (YUKON only) */ SK_GEPORT GP[SK_MAX_MACS];/* Port Dependent Information */ SK_GEMACFUNC GIFunc; /* MAC depedent functions */ } SK_GEINIT; @@ -714,7 +743,7 @@ #define SKERR_HWI_E010 (SKERR_HWI_E009+1) #define SKERR_HWI_E010MSG "SkGeCfgSync() called with invalid parameters" #define SKERR_HWI_E011 (SKERR_HWI_E010+1) -#define SKERR_HWI_E011MSG "SkGeInitPort(): Receive Queue Size to small" +#define SKERR_HWI_E011MSG "SkGeInitPort(): Receive Queue Size too small" #define SKERR_HWI_E012 (SKERR_HWI_E011+1) #define SKERR_HWI_E012MSG "SkGeInitPort(): invalid Queue Size specified" #define SKERR_HWI_E013 (SKERR_HWI_E012+1) @@ -738,7 +767,7 @@ #define SKERR_HWI_E022 (SKERR_HWI_E021+1) #define SKERR_HWI_E022MSG "MacStatistic(): illegal statistic base address" #define SKERR_HWI_E023 (SKERR_HWI_E022+1) -#define SKERR_HWI_E023MSG "SkGeInitPort(): Transmit Queue Size to small" +#define SKERR_HWI_E023MSG "SkGeInitPort(): Transmit Queue Size too small" #define SKERR_HWI_E024 (SKERR_HWI_E023+1) #define SKERR_HWI_E024MSG "FATAL: SkGeStopPort() does not terminate (Rx)" #define SKERR_HWI_E025 (SKERR_HWI_E024+1) @@ -911,7 +940,7 @@ SK_IOC IoC, int Port, int Addr, - SK_U16 *pVal); + SK_U16 SK_FAR *pVal); extern void SkXmPhyWrite( SK_AC *pAC, @@ -925,7 +954,7 @@ SK_IOC IoC, int Port, int Addr, - SK_U16 *pVal); + SK_U16 SK_FAR *pVal); extern void SkGmPhyWrite( SK_AC *pAC, @@ -934,20 +963,6 @@ int Addr, SK_U16 Val); -extern void SkGePhyRead( - SK_AC *pAC, - SK_IOC IoC, - int Port, - int Addr, - SK_U16 *pVal); - -extern void SkGePhyWrite( - SK_AC *pAC, - SK_IOC IoC, - int Port, - int Addr, - SK_U16 Val); - extern void SkXmClrExactAddr( SK_AC *pAC, SK_IOC IoC, @@ -986,14 +1001,14 @@ SK_IOC IoC, unsigned int Port, SK_U16 StatAddr, - SK_U32 *pVal); + SK_U32 SK_FAR *pVal); extern int SkGmMacStatistic( SK_AC *pAC, SK_IOC IoC, unsigned int Port, SK_U16 StatAddr, - SK_U32 *pVal); + SK_U32 SK_FAR *pVal); extern int SkXmResetCounter( SK_AC *pAC, @@ -1010,14 +1025,14 @@ SK_IOC IoC, unsigned int Port, SK_U16 IStatus, - SK_U64 *pStatus); + SK_U64 SK_FAR *pStatus); extern int SkGmOverflowStatus( SK_AC *pAC, SK_IOC IoC, unsigned int Port, SK_U16 MacStatus, - SK_U64 *pStatus); + SK_U64 SK_FAR *pStatus); extern int SkGmCableDiagStatus( SK_AC *pAC, @@ -1026,6 +1041,20 @@ SK_BOOL StartTest); #ifdef SK_DIAG +extern void SkGePhyRead( + SK_AC *pAC, + SK_IOC IoC, + int Port, + int Addr, + SK_U16 *pVal); + +extern void SkGePhyWrite( + SK_AC *pAC, + SK_IOC IoC, + int Port, + int Addr, + SK_U16 Val); + extern void SkMacSetRxCmd( SK_AC *pAC, SK_IOC IoC, @@ -1083,8 +1112,6 @@ extern int SkMacAutoNegDone(); extern void SkMacAutoNegLipaPhy(); extern void SkMacSetRxTxEn(); -extern void SkGePhyRead(); -extern void SkGePhyWrite(); extern void SkXmInitMac(); extern void SkXmPhyRead(); extern void SkXmPhyWrite(); @@ -1106,6 +1133,8 @@ extern int SkGmCableDiagStatus(); #ifdef SK_DIAG +extern void SkGePhyRead(); +extern void SkGePhyWrite(); extern void SkMacSetRxCmd(); extern void SkMacCrcGener(); extern void SkMacTimeStamp(); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skgepnm2.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skgepnm2.h --- linux-2.4.22/drivers/net/sk98lin/h/skgepnm2.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skgepnm2.h 2003-10-22 22:49:10.000000000 +0000 @@ -2,15 +2,16 @@ * * Name: skgepnm2.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.34 $ - * Date: $Date: 2002/12/16 09:05:18 $ + * Version: $Revision: 1.36 $ + * Date: $Date: 2003/05/23 12:45:13 $ * Purpose: Defines for Private Network Management Interface * ****************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2001 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,13 @@ * 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. * @@ -359,11 +367,13 @@ /* * Time macros */ +#ifndef SK_PNMI_HUNDREDS_SEC #if SK_TICKS_PER_SEC == 100 #define SK_PNMI_HUNDREDS_SEC(t) (t) #else #define SK_PNMI_HUNDREDS_SEC(t) (((t) * 100) / (SK_TICKS_PER_SEC)) -#endif +#endif /* !SK_TICKS_PER_SEC */ +#endif /* !SK_PNMI_HUNDREDS_SEC */ /* * Macros to work around alignment problems diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skgepnmi.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skgepnmi.h --- linux-2.4.22/drivers/net/sk98lin/h/skgepnmi.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skgepnmi.h 2003-10-22 22:47:42.000000000 +0000 @@ -2,15 +2,16 @@ * * Name: skgepnmi.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.59 $ - * Date: $Date: 2002/12/16 14:03:50 $ + * Version: $Revision: 1.61 $ + * Date: $Date: 2003/05/23 12:53:52 $ * Purpose: Defines for Private Network Management Interface * ****************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2001 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,16 @@ * History: * * $Log: skgepnmi.h,v $ + * 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. * @@ -284,6 +295,7 @@ #define SK_PNMI_ERR_UNKNOWN_OID 5 #define SK_PNMI_ERR_UNKNOWN_INST 6 #define SK_PNMI_ERR_UNKNOWN_NET 7 +#define SK_PNMI_ERR_NOT_SUPPORTED 10 /* @@ -436,6 +448,8 @@ #define OID_SKGE_SPEED_MODE 0xFF010171 #define OID_SKGE_SPEED_STATUS 0xFF010172 +#define OID_SKGE_BOARDLEVEL 0xFF010180 + #define OID_SKGE_SENSOR_NUMBER 0xFF020100 #define OID_SKGE_SENSOR_INDEX 0xFF020101 #define OID_SKGE_SENSOR_DESCR 0xFF020102 @@ -558,6 +572,11 @@ #define OID_SKGE_VCT_SET 0xFF020201 #define OID_SKGE_VCT_STATUS 0xFF020202 +#ifdef SK_DIAG_SUPPORT +/* Defines for driver DIAG mode. */ +#define OID_SKGE_DIAG_MODE 0xFF020204 +#endif /* SK_DIAG_SUPPORT */ + /* VCT struct to store a backup copy of VCT data after a port reset. */ typedef struct s_PnmiVct { @@ -596,6 +615,17 @@ /* + * Generic PNMI IOCTL subcommand definitions. + */ +#define SK_GET_SINGLE_VAR 1 +#define SK_SET_SINGLE_VAR 2 +#define SK_PRESET_SINGLE_VAR 3 +#define SK_GET_FULL_MIB 4 +#define SK_SET_FULL_MIB 5 +#define SK_PRESET_FULL_MIB 6 + + +/* * Define error numbers and messages for syslog */ #define SK_PNMI_ERR001 (SK_ERRBASE_PNMI + 1) @@ -1095,20 +1125,22 @@ /* * Function prototypes */ -extern int SkPnmiInit(SK_AC *pAc, SK_IOC IoC, int level); -extern int SkPnmiGetVar(SK_AC *pAc, SK_IOC IoC, SK_U32 Id, void* pBuf, +extern int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int Level); +extern int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf, unsigned int* pLen, SK_U32 Instance, SK_U32 NetIndex); -extern int SkPnmiPreSetVar(SK_AC *pAc, SK_IOC IoC, SK_U32 Id, +extern int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); -extern int SkPnmiSetVar(SK_AC *pAc, SK_IOC IoC, SK_U32 Id, void* pBuf, +extern int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); -extern int SkPnmiGetStruct(SK_AC *pAc, SK_IOC IoC, void* pBuf, +extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf, unsigned int *pLen, SK_U32 NetIndex); -extern int SkPnmiPreSetStruct(SK_AC *pAc, SK_IOC IoC, void* pBuf, +extern int SkPnmiPreSetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf, unsigned int *pLen, SK_U32 NetIndex); -extern int SkPnmiSetStruct(SK_AC *pAc, SK_IOC IoC, void* pBuf, +extern int SkPnmiSetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf, unsigned int *pLen, SK_U32 NetIndex); -extern int SkPnmiEvent(SK_AC *pAc, SK_IOC IoC, SK_U32 Event, +extern int SkPnmiEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Param); +extern int SkPnmiGenIoctl(SK_AC *pAC, SK_IOC IoC, void * pBuf, + unsigned int * pLen, SK_U32 NetIndex); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skgesirq.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skgesirq.h --- linux-2.4.22/drivers/net/sk98lin/h/skgesirq.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skgesirq.h 2003-10-22 22:49:38.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skgesirq.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.26 $ - * Date: $Date: 2002/10/14 09:52:36 $ + * 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 * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -25,8 +26,22 @@ * * 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_E023 for GPHY (Yukon) + * Added SKERR_SIRQ_E023 and SKERR_SIRQ_E024 for GPHY (Yukon) * Editorial changes * * Revision 1.25 2002/07/15 18:15:52 rwahl @@ -115,10 +130,15 @@ #ifndef _INC_SKGESIRQ_H_ #define _INC_SKGESIRQ_H_ +/* Define return codes of SkGePortCheckUp and CheckShort */ +#define SK_HW_PS_NONE 0 /* No action needed */ +#define SK_HW_PS_RESTART 1 /* Restart needed */ +#define SK_HW_PS_LINK 2 /* Link Up actions needed */ + /* * Define the Event the special IRQ/INI module can handle */ -#define SK_HWEV_WATIM 1 /* Timeout for WA errata #2 XMAC */ +#define SK_HWEV_WATIM 1 /* Timeout for WA Errata #2 XMAC */ #define SK_HWEV_PORT_START 2 /* Port Start Event by RLMT */ #define SK_HWEV_PORT_STOP 3 /* Port Stop Event by RLMT */ #define SK_HWEV_CLEAR_STAT 4 /* Clear Statistics by PNMI */ @@ -129,10 +149,10 @@ #define SK_HWEV_SET_SPEED 9 /* Set Link Speed by PNMI */ #define SK_HWEV_HALFDUP_CHK 10 /* Half Duplex Hangup Workaround */ -#define SK_WA_ACT_TIME (5000000L) /* 5 sec */ -#define SK_WA_INA_TIME (100000L) /* 100 msec */ +#define SK_WA_ACT_TIME (5000000UL) /* 5 sec */ +#define SK_WA_INA_TIME (100000UL) /* 100 msec */ -#define SK_HALFDUP_CHK_TIME (10000L) /* 10 msec */ +#define SK_HALFDUP_CHK_TIME (10000UL) /* 10 msec */ /* * Define the error numbers and messages @@ -185,6 +205,8 @@ #define SKERR_SIRQ_E023MSG "Auto-negotiation error" #define SKERR_SIRQ_E024 (SKERR_SIRQ_E023+1) #define SKERR_SIRQ_E024MSG "FIFO overflow error" +#define SKERR_SIRQ_E025 (SKERR_SIRQ_E024+1) +#define SKERR_SIRQ_E025MSG "2 Pair Downshift detected" extern void SkGeSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus); extern int SkGeSirqEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/ski2c.h linux-2.4.23-pre8/drivers/net/sk98lin/h/ski2c.h --- linux-2.4.22/drivers/net/sk98lin/h/ski2c.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/ski2c.h 2003-10-22 22:48:21.000000000 +0000 @@ -2,17 +2,15 @@ * * Name: ski2c.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.33 $ - * Date: $Date: 2002/10/14 16:40:50 $ + * Version: $Revision: 1.34 $ + * Date: $Date: 2003/01/28 09:11:21 $ * Purpose: Defines to access Voltage and Temperature Sensor - * (taken from Monalisa (taken from Concentrator)) * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998,1999 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -28,6 +26,9 @@ * History: * * $Log: ski2c.h,v $ + * 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) * @@ -163,7 +164,7 @@ #define I2C_READ 0 #define I2C_WRITE 1 #define I2C_BURST 1 -#define I2C_SIGLE 0 +#define I2C_SINGLE 0 #define SKERR_I2C_E001 (SK_ERRBASE_I2C+0) #define SKERR_I2C_E001MSG "Sensor index unknown" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skqueue.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skqueue.h --- linux-2.4.22/drivers/net/sk98lin/h/skqueue.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skqueue.h 2003-10-22 22:49:50.000000000 +0000 @@ -1,17 +1,17 @@ /****************************************************************************** * * Name: skqueue.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.14 $ - * Date: $Date: 2002/03/15 10:52:13 $ + * Project: Gigabit Ethernet Adapters, Schedule-Modul + * Version: $Revision: 1.15 $ + * Date: $Date: 2003/05/13 17:54:57 $ * Purpose: Defines for the Event queue * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998,1999 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -27,6 +27,9 @@ * History: * * $Log: skqueue.h,v $ + * 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 * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skrlmt.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skrlmt.h --- linux-2.4.22/drivers/net/sk98lin/h/skrlmt.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skrlmt.h 2003-10-22 22:48:57.000000000 +0000 @@ -2,15 +2,16 @@ * * Name: skrlmt.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.33 $ - * Date: $Date: 2001/07/03 12:16:48 $ + * Version: $Revision: 1.37 $ + * Date: $Date: 2003/04/15 09:43:43 $ * Purpose: Header file for Redundant Link ManagemenT. * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2001 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,18 @@ * 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) * @@ -163,7 +176,6 @@ #define __INC_SKRLMT_H #ifdef __cplusplus -#error C++ is not yet supported. extern "C" { #endif /* cplusplus */ @@ -286,28 +298,33 @@ _PortNum = (SK_U32)(PortNum); \ /* _pAC->Rlmt.Port[_PortNum].PacketsRx++; */ \ _pAC->Rlmt.Port[_PortNum].PacketsPerTimeSlot++; \ - if ((_pAC->Rlmt.Port[_PortNum].Net->RlmtMode & SK_RLMT_TRANSPARENT) != 0) { \ + if (_pAC->Rlmt.RlmtOff) { \ *(pNumBytes) = 0; \ - } \ - else if (IsBc) { \ - if (_pAC->Rlmt.Port[_PortNum].Net->RlmtMode != SK_RLMT_MODE_CLS) { \ - *(pNumBytes) = 6; \ - *(pOffset) = 6; \ - } \ - else { \ - *(pNumBytes) = 0; \ - } \ - } \ - else { \ - if ((PktLen) > SK_RLMT_MAX_TX_BUF_SIZE) { \ - /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ - *(pNumBytes) = 0; \ - } \ - else { \ - *(pNumBytes) = 6; \ - *(pOffset) = 0; \ - } \ - } \ + } \ + else {\ + if ((_pAC->Rlmt.Port[_PortNum].Net->RlmtMode & SK_RLMT_TRANSPARENT) != 0) { \ + *(pNumBytes) = 0; \ + } \ + else if (IsBc) { \ + if (_pAC->Rlmt.Port[_PortNum].Net->RlmtMode != SK_RLMT_MODE_CLS) { \ + *(pNumBytes) = 6; \ + *(pOffset) = 6; \ + } \ + else { \ + *(pNumBytes) = 0; \ + } \ + } \ + else { \ + if ((PktLen) > SK_RLMT_MAX_TX_BUF_SIZE) { \ + /* _pAC->Rlmt.Port[_PortNum].DataPacketsPerTimeSlot++; */ \ + *(pNumBytes) = 0; \ + } \ + else { \ + *(pNumBytes) = 6; \ + *(pOffset) = 0; \ + } \ + } \ + } \ } #if 0 @@ -505,8 +522,10 @@ /* ----- Private part ----- */ SK_BOOL CheckSwitch; - SK_U8 Align01; - SK_U16 Align02; + SK_BOOL RlmtOff; /* set to zero if the Mac addresses + are equal or the second one + is zero */ + SK_U16 Align01; } SK_RLMT; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/sktimer.h linux-2.4.23-pre8/drivers/net/sk98lin/h/sktimer.h --- linux-2.4.22/drivers/net/sk98lin/h/sktimer.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/sktimer.h 2003-10-22 22:47:56.000000000 +0000 @@ -1,17 +1,17 @@ /****************************************************************************** * * Name: sktimer.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.9 $ - * Date: $Date: 1999/11/22 14:00:29 $ + * Project: Gigabit Ethernet Adapters, Schedule-Modul + * Version: $Revision: 1.10 $ + * Date: $Date: 2003/05/13 17:56:44 $ * Purpose: Defines for the timer functions * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998,1999 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -27,6 +27,9 @@ * History: * * $Log: sktimer.h,v $ + * 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. * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/sktypes.h linux-2.4.23-pre8/drivers/net/sk98lin/h/sktypes.h --- linux-2.4.22/drivers/net/sk98lin/h/sktypes.h 2000-09-15 21:34:19.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/sktypes.h 2003-10-22 22:49:53.000000000 +0000 @@ -2,16 +2,15 @@ * * Name: sktypes.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.2 $ - * Date: $Date: 1999/11/22 14:01:58 $ + * Version: $Revision: 1.1 $ + * Date: $Date: 2003/07/21 07:26:01 $ * Purpose: Define data types for Linux * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998,1999 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -27,6 +26,12 @@ * History: * * $Log: sktypes.h,v $ + * 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. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skversion.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skversion.h --- linux-2.4.22/drivers/net/sk98lin/h/skversion.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skversion.h 2003-10-22 22:49:02.000000000 +0000 @@ -2,16 +2,15 @@ * * Name: version.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.1.2.1 $ - * Date: $Date: 2001/09/05 13:38:30 $ + * Version: $Revision: 1.3 $ + * Date: $Date: 2003/08/25 13:34:48 $ * Purpose: SK specific Error log support * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -26,6 +25,21 @@ * * History: * $Log: skversion.h,v $ + * 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 * @@ -37,13 +51,15 @@ ******************************************************************************/ +#ifdef lint static const char SysKonnectFileId[] = "@(#) (C) SysKonnect GmbH."; static const char SysKonnectBuildNumber[] = - "@(#)SK-BUILD: 6.02 PL: 01"; + "@(#)SK-BUILD: 6.18 PL: 01"; +#endif /* !defined(lint) */ -#define BOOT_STRING "sk98lin: Network Device Driver v6.02\n" \ - "Copyright (C) 2000-2002 SysKonnect GmbH." +#define BOOT_STRING "sk98lin: Network Device Driver v6.18\n" \ + "(C)Copyright 1999-2003 Marvell(R)." -#define VER_STRING "6.02" +#define VER_STRING "6.18" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/skvpd.h linux-2.4.23-pre8/drivers/net/sk98lin/h/skvpd.h --- linux-2.4.22/drivers/net/sk98lin/h/skvpd.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/skvpd.h 2003-10-22 22:48:24.000000000 +0000 @@ -2,15 +2,15 @@ * * Name: skvpd.h * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.13 $ - * Date: $Date: 2002/10/14 15:58:18 $ + * Version: $Revision: 1.15 $ + * Date: $Date: 2003/01/13 10:39:38 $ * Purpose: Defines and Macros for VPD handling * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -26,6 +26,14 @@ * 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 @@ -63,7 +71,7 @@ * 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) + * 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 @@ -118,7 +126,7 @@ * Define READ and WRITE Constants. */ -#define VPD_PCI_ID_YUKON 0x4320 +#define VPD_DEV_ID_GENESIS 0x4300 #define VPD_SIZE_YUKON 256 #define VPD_SIZE_GENESIS 512 @@ -249,8 +257,8 @@ extern int VpdSetupPara( SK_AC *pAC, - char *key, - char *buf, + const char *key, + const char *buf, int len, int type, int op); @@ -269,7 +277,7 @@ extern int VpdRead( SK_AC *pAC, SK_IOC IoC, - char *key, + const char *key, char *buf, int *len); @@ -279,8 +287,8 @@ extern int VpdWrite( SK_AC *pAC, SK_IOC IoC, - char *key, - char *buf); + const char *key, + const char *buf); extern int VpdDelete( SK_AC *pAC, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/h/xmac_ii.h linux-2.4.23-pre8/drivers/net/sk98lin/h/xmac_ii.h --- linux-2.4.22/drivers/net/sk98lin/h/xmac_ii.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/h/xmac_ii.h 2003-10-22 22:49:20.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: xmac_ii.h - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.45 $ - * Date: $Date: 2002/12/10 14:35:13 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.48 $ + * Date: $Date: 2003/05/13 17:17:55 $ * Purpose: Defines and Macros for Gigabit Ethernet Controller * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,18 @@ * History: * * $Log: xmac_ii.h,v $ + * 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) @@ -925,9 +938,9 @@ /***** PHY_BCOM_NEPG_LP 16 bit r/o Next Page Link Partner *****/ /***** PHY_LONE_NEPG_LP 16 bit r/o Next Page Link Partner *****/ #define PHY_NP_MORE (1<<15) /* Bit 15: More, Next Pages to follow */ -#define PHY_NP_ACK1 (1<<14) /* Bit 14: (ro) Ack 1, for receiving a message*/ +#define PHY_NP_ACK1 (1<<14) /* Bit 14: (ro) Ack1, for receiving a message */ #define PHY_NP_MSG_VAL (1<<13) /* Bit 13: Message Page valid */ -#define PHY_NP_ACK2 (1<<12) /* Bit 12: Ack 2, comply with msg content*/ +#define PHY_NP_ACK2 (1<<12) /* Bit 12: Ack2, comply with msg content */ #define PHY_NP_TOG (1<<11) /* Bit 11: Toggle Bit, ensure sync */ #define PHY_NP_MSG 0x07ff /* Bit 10..0: Message from/to Link Partner */ @@ -1118,7 +1131,7 @@ #define PHY_L_1000S_MSF (1<<15) /* Bit 15: Master/Slave Fault */ #define PHY_L_1000S_MSR (1<<14) /* Bit 14: Master/Slave Result */ #define PHY_L_1000S_LRS (1<<13) /* Bit 13: Local Receiver Status */ -#define PHY_L_1000S_RRS (1<<12) /* Bit 12: Remote Receiver Status*/ +#define PHY_L_1000S_RRS (1<<12) /* Bit 12: Remote Receiver Status */ #define PHY_L_1000S_LP_FD (1<<11) /* Bit 11: Link Partner can FD */ #define PHY_L_1000S_LP_HD (1<<10) /* Bit 10: Link Partner can HD */ /* Bit 9..8: reserved */ @@ -1170,8 +1183,8 @@ #define PHY_L_IS_AN_F (1<<13) /* Bit 13: Auto-Negotiation fault */ /* Bit 12: not described */ #define PHY_L_IS_CROSS (1<<11) /* Bit 11: Crossover used */ -#define PHY_L_IS_POL (1<<10) /* Bit 10: Polarity correct. used*/ -#define PHY_L_IS_SS (1<<9) /* Bit 9: Smart Speed Downgrade*/ +#define PHY_L_IS_POL (1<<10) /* Bit 10: Polarity correct. used */ +#define PHY_L_IS_SS (1<<9) /* Bit 9: Smart Speed Downgrade */ #define PHY_L_IS_CFULL (1<<8) /* Bit 8: Counter Full */ #define PHY_L_IS_AN_C (1<<7) /* Bit 7: AutoNeg Complete */ #define PHY_L_IS_SPEED (1<<6) /* Bit 6: Speed Changed */ @@ -1262,8 +1275,9 @@ * Marvell-Specific */ /***** PHY_MARV_AUNE_ADV 16 bit r/w Auto-Negotiation Advertisement *****/ +/***** PHY_MARV_AUNE_LP 16 bit r/w Link Part Ability Reg *****/ #define PHY_M_AN_NXT_PG BIT_15 /* Request Next Page */ - /* Bit 14: reserved */ +#define PHY_M_AN_ACK BIT_14 /* (ro) Acknowledge Received */ #define PHY_M_AN_RF BIT_13 /* Remote Fault */ /* Bit 12: reserved */ #define PHY_M_AN_ASP BIT_11 /* Asymmetric Pause */ @@ -1309,6 +1323,10 @@ #define PHY_M_PC_POL_R_DIS (1<<1) /* Bit 1: Polarity Reversal Disabled */ #define PHY_M_PC_DIS_JABBER (1<<0) /* Bit 0: Disable Jabber */ +#define PHY_M_PC_MDI_XMODE(x) SHIFT5(x) +#define PHY_M_PC_MAN_MDI 0 /* 00 = Manual MDI configuration */ +#define PHY_M_PC_MAN_MDIX 1 /* 01 = Manual MDIX configuration */ +#define PHY_M_PC_ENA_AUTO 3 /* 11 = Enable Automatic Crossover */ /***** PHY_MARV_PHY_STAT 16 bit r/o PHY Specific Status Reg *****/ #define PHY_M_PS_SPEED_MSK (3<<14) /* Bit 15..14: Speed Mask */ @@ -1366,26 +1384,35 @@ /***** PHY_MARV_LED_CTRL 16 bit r/w LED Control Reg *****/ #define PHY_M_LEDC_DIS_LED (1<<15) /* Bit 15: Disable LED */ - -#define PHY_M_LED_BL_RATE(x) SHIFT12(x) /* Bit 12..14: Blink Rate */ - -/* values for PHY_M_LED_BL_RATE() */ -#define BL_DEFAULT 0 /* no pulse stretching */ -#define BL_21MS 1 /* 21 ms to 42ms */ -#define BL_42MS 2 /* 42 ms to 84ms */ -#define BL_84MS 3 /* 84 ms to 170ms */ -#define BL_170MS 4 /* 170 ms to340ms */ -#define BL_340MS 5 /* 340 ms to670ms */ -#define BL_670MS 6 /* 670 ms to 1.3s */ -#define BL_1300MS 7 /* 1.3s to 2.7s */ - +#define PHY_M_LEDC_PULS_MSK (7<<12) /* Bit 14..12: Pulse Stretch Mask */ #define PHY_M_LEDC_F_INT (1<<11) /* Bit 11: Force Interrupt */ - -#define PHY_M_LEDC_LINK_MSK (3<<3) /* Bit 4..3: Link Control */ +#define PHY_M_LEDC_BL_R_MSK (7<<8) /* Bit 10.. 8: Blink Rate Mask */ + /* Bit 7.. 5: reserved */ +#define PHY_M_LEDC_LINK_MSK (3<<3) /* Bit 4.. 3: Link Control Mask */ #define PHY_M_LEDC_DP_CTRL (1<<2) /* Bit 2: Duplex Control */ #define PHY_M_LEDC_RX_CTRL (1<<1) /* Bit 1: Rx activity / Link */ #define PHY_M_LEDC_TX_CTRL (1<<0) /* Bit 0: Tx activity / Link */ +#define PHY_M_LED_PULS_DUR(x) SHIFT12(x) /* Pulse Stretch Duration */ + +#define PULS_NO_STR 0 /* no pulse stretching */ +#define PULS_21MS 1 /* 21 ms to 42 ms */ +#define PULS_42MS 2 /* 42 ms to 84 ms */ +#define PULS_84MS 3 /* 84 ms to 170 ms */ +#define PULS_170MS 4 /* 170 ms to 340 ms */ +#define PULS_340MS 5 /* 340 ms to 670 ms */ +#define PULS_670MS 6 /* 670 ms to 1.3 s */ +#define PULS_1300MS 7 /* 1.3 s to 2.7 s */ + +#define PHY_M_LED_BLINK_RT(x) SHIFT8(x) /* Blink Rate */ + +#define BLINK_42MS 0 /* 42 ms */ +#define BLINK_84MS 1 /* 84 ms */ +#define BLINK_170MS 2 /* 170 ms */ +#define BLINK_340MS 3 /* 340 ms */ +#define BLINK_670MS 4 /* 670 ms */ + /* values 5 - 7: reserved */ + /***** PHY_MARV_LED_OVER 16 bit r/w Manual LED Override Reg *****/ #define PHY_M_LED_MO_DUP(x) SHIFT10(x) /* Bit 11..10: Duplex */ #define PHY_M_LED_MO_10(x) SHIFT8(x) /* Bit 9.. 8: Link 10 */ @@ -1441,7 +1468,7 @@ #define GM_GP_CTRL 0x0004 /* 16 bit r/w General Purpose Control */ #define GM_TX_CTRL 0x0008 /* 16 bit r/w Transmit Control Reg. */ #define GM_RX_CTRL 0x000c /* 16 bit r/w Receive Control Reg. */ -#define GM_TX_FLOW_CTRL 0x0010 /* 16 bit r/w Transmit Flow Control */ +#define GM_TX_FLOW_CTRL 0x0010 /* 16 bit r/w Transmit Flow-Control */ #define GM_TX_PARAM 0x0014 /* 16 bit r/w Transmit Parameter Reg. */ #define GM_SERIAL_MODE 0x0018 /* 16 bit r/w Serial Mode Register */ @@ -1582,7 +1609,7 @@ #define GM_GPSR_SPEED (1<<15) /* Bit 15: Port Speed (1 = 100 Mbps) */ #define GM_GPSR_DUPLEX (1<<14) /* Bit 14: Duplex Mode (1 = Full) */ -#define GM_GPSR_FC_TX_DIS (1<<13) /* Bit 13: Tx Flow Control Mode Disabled */ +#define GM_GPSR_FC_TX_DIS (1<<13) /* Bit 13: Tx Flow-Control Mode Disabled */ #define GM_GPSR_LINK_UP (1<<12) /* Bit 12: Link Up Status */ #define GM_GPSR_PAUSE (1<<11) /* Bit 11: Pause State */ #define GM_GPSR_TX_ACTIVE (1<<10) /* Bit 10: Tx in Progress */ @@ -1592,14 +1619,14 @@ #define GM_GPSR_PHY_ST_CH (1<<5) /* Bit 5: PHY Status Change */ #define GM_GPSR_GIG_SPEED (1<<4) /* Bit 4: Gigabit Speed (1 = 1000 Mbps) */ #define GM_GPSR_PART_MODE (1<<3) /* Bit 3: Partition mode */ -#define GM_GPSR_FC_RX_DIS (1<<2) /* Bit 2: Rx Flow Control Mode Disabled */ +#define GM_GPSR_FC_RX_DIS (1<<2) /* Bit 2: Rx Flow-Control Mode Disabled */ #define GM_GPSR_PROM_EN (1<<1) /* Bit 1: Promiscuous Mode Enabled */ /* Bit 0: reserved */ /* GM_GP_CTRL 16 bit r/w General Purpose Control Register */ /* Bit 15: reserved */ #define GM_GPCR_PROM_ENA (1<<14) /* Bit 14: Enable Promiscuous Mode */ -#define GM_GPCR_FC_TX_DIS (1<<13) /* Bit 13: Disable Tx Flow Control Mode */ +#define GM_GPCR_FC_TX_DIS (1<<13) /* Bit 13: Disable Tx Flow-Control Mode */ #define GM_GPCR_TX_ENA (1<<12) /* Bit 12: Enable Transmit */ #define GM_GPCR_RX_ENA (1<<11) /* Bit 11: Enable Receive */ #define GM_GPCR_BURST_ENA (1<<10) /* Bit 10: Enable Burst Mode */ @@ -1608,11 +1635,11 @@ #define GM_GPCR_GIGS_ENA (1<<7) /* Bit 7: Gigabit Speed (1000 Mbps) */ #define GM_GPCR_FL_PASS (1<<6) /* Bit 6: Force Link Pass */ #define GM_GPCR_DUP_FULL (1<<5) /* Bit 5: Full Duplex Mode */ -#define GM_GPCR_FC_RX_DIS (1<<4) /* Bit 4: Disable Rx Flow Control Mode */ +#define GM_GPCR_FC_RX_DIS (1<<4) /* Bit 4: Disable Rx Flow-Control Mode */ #define GM_GPCR_SPEED_100 (1<<3) /* Bit 3: Port Speed 100 Mbps */ -#define GM_GPCR_AU_DUP_DIS (1<<2) /* Bit 2: Disable Auto-Update for Duplex */ -#define GM_GPCR_AU_FCT_DIS (1<<1) /* Bit 1: Disable Auto-Update for Flow-c. */ -#define GM_GPCR_AU_SPD_DIS (1<<0) /* Bit 0: Disable Auto-Update for Speed */ +#define GM_GPCR_AU_DUP_DIS (1<<2) /* Bit 2: Disable Auto-Update Duplex */ +#define GM_GPCR_AU_FCT_DIS (1<<1) /* Bit 1: Disable Auto-Update Flow-C. */ +#define GM_GPCR_AU_SPD_DIS (1<<0) /* Bit 0: Disable Auto-Update Speed */ #define GM_GPCR_SPEED_1000 (GM_GPCR_GIGS_ENA | GM_GPCR_SPEED_100) #define GM_GPCR_AU_ALL_DIS (GM_GPCR_AU_DUP_DIS | GM_GPCR_AU_FCT_DIS |\ @@ -1642,9 +1669,9 @@ /* GM_SERIAL_MODE 16 bit r/w Serial Mode Register */ #define GM_SMOD_DATABL_MSK (0x1f<<11) /* Bit 15..11: Data Blinder */ -#define GM_SMOD_LIMIT_4 (1<<10) /* Bit 10: 4 consecutive transmit trials */ -#define GM_SMOD_VLAN_ENA (1<<9) /* Bit 9: Enable VLAN (Max. Frame Length) */ -#define GM_SMOD_JUMBO_ENA (1<<8) /* Bit 8: Enable Jumbo (Max. Frame Length) */ +#define GM_SMOD_LIMIT_4 (1<<10) /* Bit 10: 4 consecutive Tx trials */ +#define GM_SMOD_VLAN_ENA (1<<9) /* Bit 9: Enable VLAN (Max. Frame Len) */ +#define GM_SMOD_JUMBO_ENA (1<<8) /* Bit 8: Enable Jumbo (Max. Frame Len) */ /* Bit 7..5: reserved */ #define GM_SMOD_IPG_MSK 0x1f /* Bit 4..0: Inter-Packet Gap (IPG) */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skaddr.c linux-2.4.23-pre8/drivers/net/sk98lin/skaddr.c --- linux-2.4.22/drivers/net/sk98lin/skaddr.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skaddr.c 2003-10-22 22:49:04.000000000 +0000 @@ -1,9 +1,9 @@ /****************************************************************************** * * Name: skaddr.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.47 $ - * Date: $Date: 2002/09/17 06:31:10 $ + * 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. * ******************************************************************************/ @@ -11,6 +11,7 @@ /****************************************************************************** * * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,30 @@ * 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. @@ -214,15 +239,14 @@ * ******************************************************************************/ -#ifndef lint +#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) static const char SysKonnectFileId[] = - "@(#) $Id: skaddr.c,v 1.47 2002/09/17 06:31:10 tschilli Exp $ (C) SysKonnect."; -#endif /* !defined(lint) */ + "@(#) $Id: skaddr.c,v 1.52 2003/06/02 13:46:15 tschilli Exp $ (C) Marvell."; +#endif /* DEBUG ||!LINT || !SK_SLIM */ #define __SKADDR_C #ifdef __cplusplus -#error C++ is not yet supported. extern "C" { #endif /* cplusplus */ @@ -257,7 +281,7 @@ /* local variables ************************************************************/ #ifdef DEBUG -static int Next0[SK_MAX_MACS] = {0, 0}; +static int Next0[SK_MAX_MACS] = {0}; #endif /* DEBUG */ /* functions ******************************************************************/ @@ -309,7 +333,8 @@ switch (Level) { case SK_INIT_DATA: - SK_MEMSET((char *) &pAC->Addr, 0, sizeof(SK_ADDR)); + SK_MEMSET((char *) &pAC->Addr, (SK_U8) 0, + (SK_U16) sizeof(SK_ADDR)); for (i = 0; i < SK_MAX_MACS; i++) { pAPort = &pAC->Addr.Port[i]; @@ -331,10 +356,12 @@ /* pAC->Addr.InitDone = SK_INIT_DATA; */ break; - case SK_INIT_IO: + case SK_INIT_IO: +#ifndef SK_NO_RLMT for (i = 0; i < SK_MAX_NETS; i++) { pAC->Addr.Net[i].ActivePort = pAC->Rlmt.Net[i].ActivePort; } +#endif /* !SK_NO_RLMT */ #ifdef xDEBUG for (i = 0; i < SK_MAX_MACS; i++) { if (pAC->Addr.Port[i].NextExactMatchRlmt < @@ -418,13 +445,16 @@ /* Set port's current physical MAC address. */ OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0]; - - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { XM_OUTADDR(IoC, i, XM_SA, OutAddr); } - else { +#endif /* GENESIS */ +#ifdef YUKON + if (!pAC->GIni.GIGenesis) { GM_OUTADDR(IoC, i, GM_SRC_ADDR_1L, OutAddr); } +#endif /* YUKON */ #ifdef DEBUG SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_INIT, ("SkAddrInit: Permanent Physical MAC Address: %02X %02X %02X %02X %02X %02X\n", @@ -443,7 +473,7 @@ pAPort->CurrentMacAddress.a[3], pAPort->CurrentMacAddress.a[4], pAPort->CurrentMacAddress.a[5])) -#endif /* DEBUG */ +#endif /* DEBUG */ } /* pAC->Addr.InitDone = SK_INIT_IO; */ break; @@ -469,6 +499,7 @@ } /* SkAddrInit */ +#ifndef SK_SLIM /****************************************************************************** * @@ -504,7 +535,7 @@ return (SK_ADDR_ILLEGAL_PORT); } - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { + if (pAC->GIni.GIGenesis) { ReturnCode = SkAddrXmacMcClear(pAC, IoC, PortNumber, Flags); } else { @@ -515,6 +546,9 @@ } /* SkAddrMcClear */ +#endif /* !SK_SLIM */ + +#ifndef SK_SLIM /****************************************************************************** * @@ -568,6 +602,9 @@ } /* SkAddrXmacMcClear */ +#endif /* !SK_SLIM */ + +#ifndef SK_SLIM /****************************************************************************** * @@ -758,7 +795,7 @@ } /* SkGmacMcHash */ -#endif /* not SK_ADDR_CHEAT */ +#endif /* !SK_ADDR_CHEAT */ /****************************************************************************** * @@ -797,7 +834,7 @@ return (SK_ADDR_ILLEGAL_PORT); } - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { + if (pAC->GIni.GIGenesis) { ReturnCode = SkAddrXmacMcAdd(pAC, IoC, PortNumber, pMc, Flags); } else { @@ -888,7 +925,7 @@ } else { if (!(pMc->a[0] & SK_MC_BIT)) { - /* Hashing only possible with multicast addresses. */ + /* Hashing only possible with multicast addresses */ return (SK_MC_ILLEGAL_ADDRESS); } #ifndef SK_ADDR_CHEAT @@ -951,7 +988,7 @@ #endif /* !defined(SK_ADDR_CHEAT) */ if (!(pMc->a[0] & SK_MC_BIT)) { - /* Hashing only possible with multicast addresses. */ + /* Hashing only possible with multicast addresses */ return (SK_MC_ILLEGAL_ADDRESS); } @@ -1021,6 +1058,7 @@ } /* SkAddrGmacMcAdd */ +#endif /* !SK_SLIM */ /****************************************************************************** * @@ -1052,23 +1090,29 @@ SK_U32 PortNumber) /* Port Number */ { int ReturnCode; - +#if (!defined(SK_SLIM) || defined(DEBUG)) if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { return (SK_ADDR_ILLEGAL_PORT); } - - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { +#endif /* !SK_SLIM || DEBUG */ + +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { ReturnCode = SkAddrXmacMcUpdate(pAC, IoC, PortNumber); } - else { +#endif /* GENESIS */ +#ifdef YUKON + if (!pAC->GIni.GIGenesis) { ReturnCode = SkAddrGmacMcUpdate(pAC, IoC, PortNumber); } - +#endif /* YUKON */ return (ReturnCode); } /* SkAddrMcUpdate */ +#ifdef GENESIS + /****************************************************************************** * * SkAddrXmacMcUpdate - update the HW MC address table and set the MAC address @@ -1108,7 +1152,7 @@ #ifdef DEBUG SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber])) -#endif /* DEBUG */ +#endif /* DEBUG */ /* Start with 0 to also program the logical MAC address. */ for (i = 0; i < pAPort->NextExactMatchRlmt; i++) { @@ -1146,7 +1190,7 @@ XM_OUTHASH(IoC, PortNumber, XM_HSM, &OnesHash); /* Enable Hashing */ - SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); } else if (Inexact != 0) { @@ -1154,11 +1198,11 @@ XM_OUTHASH(IoC, PortNumber, XM_HSM, &pAPort->InexactFilter.Bytes[0]); /* Enable Hashing */ - SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); } else { /* Disable Hashing */ - SkMacHashing(pAC, IoC, PortNumber, SK_FALSE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_FALSE); } if (pAPort->PromMode != SK_PROM_MODE_NONE) { @@ -1198,7 +1242,7 @@ pAPort->Exact[i].a[4], pAPort->Exact[i].a[5])) } -#endif /* DEBUG */ +#endif /* DEBUG */ /* Determine return value. */ if (Inexact == 0 && pAPort->PromMode == 0) { @@ -1210,6 +1254,9 @@ } /* SkAddrXmacMcUpdate */ +#endif /* GENESIS */ + +#ifdef YUKON /****************************************************************************** * @@ -1237,8 +1284,10 @@ SK_IOC IoC, /* I/O context */ SK_U32 PortNumber) /* Port Number */ { +#ifndef SK_SLIM SK_U32 i; SK_U8 Inexact; +#endif /* not SK_SLIM */ SK_U16 *OutAddr; SK_ADDR_PORT *pAPort; @@ -1250,8 +1299,9 @@ #ifdef DEBUG SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL, ("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber])) -#endif /* DEBUG */ +#endif /* DEBUG */ +#ifndef SK_SLIM for (Inexact = 0, i = 0; i < 8; i++) { Inexact |= pAPort->InexactFilter.Bytes[i]; } @@ -1266,16 +1316,27 @@ GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash); /* Enable Hashing */ - SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); } else { /* Enable Hashing. */ - SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); } if (pAPort->PromMode != SK_PROM_MODE_NONE) { (void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode); } +#else /* SK_SLIM */ + + /* Set all bits in 64-bit hash register. */ + GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash); + + /* Enable Hashing */ + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); + + (void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode); + +#endif /* SK_SLIM */ /* Set port's current physical MAC address. */ OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0]; @@ -1303,8 +1364,9 @@ pAPort->CurrentMacAddress.a[3], pAPort->CurrentMacAddress.a[4], pAPort->CurrentMacAddress.a[5])) -#endif /* DEBUG */ +#endif /* DEBUG */ +#ifndef SK_SLIM /* Determine return value. */ if (Inexact == 0 && pAPort->PromMode == 0) { return (SK_MC_FILTERING_EXACT); @@ -1312,9 +1374,15 @@ else { return (SK_MC_FILTERING_INEXACT); } +#else /* SK_SLIM */ + return (SK_MC_FILTERING_INEXACT); +#endif /* SK_SLIM */ } /* SkAddrGmacMcUpdate */ +#endif /* YUKON */ + +#ifndef SK_NO_MAO /****************************************************************************** * @@ -1334,23 +1402,29 @@ * SK_ADDR_TOO_EARLY if SK_INIT_IO was not executed before. */ int SkAddrOverride( -SK_AC *pAC, /* adapter context */ -SK_IOC IoC, /* I/O context */ -SK_U32 PortNumber, /* Port Number */ -SK_MAC_ADDR *pNewAddr, /* new MAC address */ -int Flags) /* logical/physical MAC address */ +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* I/O context */ +SK_U32 PortNumber, /* Port Number */ +SK_MAC_ADDR SK_FAR *pNewAddr, /* new MAC address */ +int Flags) /* logical/physical MAC address */ { +#ifndef SK_NO_RLMT SK_EVPARA Para; +#endif /* !SK_NO_RLMT */ SK_U32 NetNumber; SK_U32 i; - SK_U16 *OutAddr; + SK_U16 SK_FAR *OutAddr; +#ifndef SK_NO_RLMT NetNumber = pAC->Rlmt.Port[PortNumber].Net->NetNumber; - +#else + NetNumber = 0; +#endif /* SK_NO_RLMT */ +#if (!defined(SK_SLIM) || defined(DEBUG)) if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { return (SK_ADDR_ILLEGAL_PORT); } - +#endif /* !SK_SLIM || DEBUG */ if (pNewAddr != NULL && (pNewAddr->a[0] & SK_MC_BIT) != 0) { return (SK_ADDR_MULTICAST_ADDRESS); } @@ -1366,11 +1440,11 @@ return (SK_ADDR_TOO_EARLY); } } - +#ifndef SK_NO_RLMT /* Set PortNumber to number of net's active port. */ PortNumber = pAC->Rlmt.Net[NetNumber]. Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber; - +#endif /* !SK_NO_RLMT */ pAC->Addr.Port[PortNumber].Exact[0] = pAC->Addr.Net[NetNumber].CurrentMacAddress; @@ -1385,11 +1459,11 @@ return (SK_ADDR_TOO_EARLY); } } - +#ifndef SK_NO_RLMT /* Set PortNumber to number of net's active port. */ PortNumber = pAC->Rlmt.Net[NetNumber]. Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber; - +#endif /* !SK_NO_RLMT */ for (i = 0; i < SK_MAC_ADDR_LEN; i++ ) { pAC->Addr.Port[PortNumber].Exact[0].a[i] = 0; } @@ -1424,19 +1498,24 @@ pAC->Addr.Port[PortNumber].CurrentMacAddress = *pNewAddr; /* Change port's physical MAC address. */ - OutAddr = (SK_U16 *) pNewAddr; - - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { + OutAddr = (SK_U16 SK_FAR *) pNewAddr; +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { XM_OUTADDR(IoC, PortNumber, XM_SA, OutAddr); } - else { +#endif /* GENESIS */ +#ifdef YUKON + if (!pAC->GIni.GIGenesis) { GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_1L, OutAddr); } +#endif /* YUKON */ +#ifndef SK_NO_RLMT /* Report address change to RLMT. */ Para.Para32[0] = PortNumber; Para.Para32[0] = -1; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_PORT_ADDR, Para); +#endif /* !SK_NO_RLMT */ } else { /* Logical MAC address. */ if (SK_ADDR_EQUAL(pNewAddr->a, @@ -1454,11 +1533,33 @@ return (SK_ADDR_DUPLICATE_ADDRESS); } } - + + /* + * In case that the physical and the logical MAC addresses are equal + * we must also change the physical MAC address here. + * In this case we have an adapter which initially was programmed with + * two identical MAC addresses. + */ + if (SK_ADDR_EQUAL(pAC->Addr.Port[PortNumber].CurrentMacAddress.a, + pAC->Addr.Port[PortNumber].Exact[0].a)) { + + pAC->Addr.Port[PortNumber].PreviousMacAddress = + pAC->Addr.Port[PortNumber].CurrentMacAddress; + pAC->Addr.Port[PortNumber].CurrentMacAddress = *pNewAddr; + +#ifndef SK_NO_RLMT + /* Report address change to RLMT. */ + Para.Para32[0] = PortNumber; + Para.Para32[0] = -1; + SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_PORT_ADDR, Para); +#endif /* !SK_NO_RLMT */ + } + +#ifndef SK_NO_RLMT /* Set PortNumber to number of net's active port. */ PortNumber = pAC->Rlmt.Net[NetNumber]. Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber; - +#endif /* !SK_NO_RLMT */ pAC->Addr.Net[NetNumber].CurrentMacAddress = *pNewAddr; pAC->Addr.Port[PortNumber].Exact[0] = *pNewAddr; #ifdef DEBUG @@ -1479,9 +1580,9 @@ pAC->Addr.Net[NetNumber].CurrentMacAddress.a[3], pAC->Addr.Net[NetNumber].CurrentMacAddress.a[4], pAC->Addr.Net[NetNumber].CurrentMacAddress.a[5])) -#endif /* DEBUG */ +#endif /* DEBUG */ - /* Write address to first exact match entry of active port. */ + /* Write address to first exact match entry of active port. */ (void) SkAddrMcUpdate(pAC, IoC, PortNumber); } @@ -1490,6 +1591,8 @@ } /* SkAddrOverride */ +#endif /* SK_NO_MAO */ + /****************************************************************************** * * SkAddrPromiscuousChange - set promiscuous mode for given port @@ -1519,22 +1622,30 @@ int NewPromMode) /* new promiscuous mode */ { int ReturnCode; - +#if (!defined(SK_SLIM) || defined(DEBUG)) if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) { return (SK_ADDR_ILLEGAL_PORT); } - - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { - ReturnCode = SkAddrXmacPromiscuousChange(pAC, IoC, PortNumber, NewPromMode); - } - else { - ReturnCode = SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, NewPromMode); +#endif /* !SK_SLIM || DEBUG */ + +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + ReturnCode = + SkAddrXmacPromiscuousChange(pAC, IoC, PortNumber, NewPromMode); + } +#endif /* GENESIS */ +#ifdef YUKON + if (!pAC->GIni.GIGenesis) { + ReturnCode = + SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, NewPromMode); } +#endif /* YUKON */ return (ReturnCode); } /* SkAddrPromiscuousChange */ +#ifdef GENESIS /****************************************************************************** * @@ -1613,7 +1724,7 @@ XM_OUTHASH(IoC, PortNumber, XM_HSM, &OnesHash); /* Enable Hashing */ - SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); } else if ((CurPromMode & SK_PROM_MODE_ALL_MC) && !(NewPromMode & SK_PROM_MODE_ALL_MC)) { /* Norm MC. */ @@ -1622,7 +1733,7 @@ } if (Inexact == 0) { /* Disable Hashing */ - SkMacHashing(pAC, IoC, PortNumber, SK_FALSE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_FALSE); } else { /* Set 64-bit hash register to InexactFilter. */ @@ -1630,25 +1741,28 @@ &pAC->Addr.Port[PortNumber].InexactFilter.Bytes[0]); /* Enable Hashing */ - SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); } } if ((NewPromMode & SK_PROM_MODE_LLC) && !(CurPromMode & SK_PROM_MODE_LLC)) { /* Prom. LLC */ /* Set the MAC in Promiscuous Mode */ - SkMacPromiscMode(pAC, IoC, PortNumber, SK_TRUE); + SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_TRUE); } else if ((CurPromMode & SK_PROM_MODE_LLC) && !(NewPromMode & SK_PROM_MODE_LLC)) { /* Norm. LLC. */ /* Clear Promiscuous Mode */ - SkMacPromiscMode(pAC, IoC, PortNumber, SK_FALSE); + SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_FALSE); } return (SK_ADDR_SUCCESS); } /* SkAddrXmacPromiscuousChange */ +#endif /* GENESIS */ + +#ifdef YUKON /****************************************************************************** * @@ -1703,7 +1817,7 @@ GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash); /* Enable Hashing */ - SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); } if ((CurPromMode & SK_PROM_MODE_ALL_MC) && @@ -1714,26 +1828,29 @@ &pAC->Addr.Port[PortNumber].InexactFilter.Bytes[0]); /* Enable Hashing. */ - SkMacHashing(pAC, IoC, PortNumber, SK_TRUE); + SkMacHashing(pAC, IoC, (int) PortNumber, SK_TRUE); } if ((NewPromMode & SK_PROM_MODE_LLC) && !(CurPromMode & SK_PROM_MODE_LLC)) { /* Prom. LLC */ /* Set the MAC to Promiscuous Mode. */ - SkMacPromiscMode(pAC, IoC, PortNumber, SK_TRUE); + SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_TRUE); } else if ((CurPromMode & SK_PROM_MODE_LLC) && !(NewPromMode & SK_PROM_MODE_LLC)) { /* Norm. LLC */ /* Clear Promiscuous Mode. */ - SkMacPromiscMode(pAC, IoC, PortNumber, SK_FALSE); + SkMacPromiscMode(pAC, IoC, (int) PortNumber, SK_FALSE); } return (SK_ADDR_SUCCESS); } /* SkAddrGmacPromiscuousChange */ +#endif /* YUKON */ + +#ifndef SK_SLIM /****************************************************************************** * @@ -1805,7 +1922,7 @@ pAC->Addr.Port[FromPortNumber].PromMode = pAC->Addr.Port[ToPortNumber].PromMode; pAC->Addr.Port[ToPortNumber].PromMode = i; - if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { + if (pAC->GIni.GIGenesis) { DWord = pAC->Addr.Port[FromPortNumber].FirstExactMatchRlmt; pAC->Addr.Port[FromPortNumber].FirstExactMatchRlmt = pAC->Addr.Port[ToPortNumber].FirstExactMatchRlmt; @@ -1845,6 +1962,8 @@ } /* SkAddrSwap */ +#endif /* !SK_SLIM */ + #ifdef __cplusplus } #endif /* __cplusplus */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skcsum.c linux-2.4.23-pre8/drivers/net/sk98lin/skcsum.c --- linux-2.4.22/drivers/net/sk98lin/skcsum.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skcsum.c 2003-10-22 22:47:33.000000000 +0000 @@ -2,15 +2,15 @@ * * Name: skcsum.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.10 $ - * Date: $Date: 2002/04/11 10:02:04 $ + * Version: $Revision: 1.11 $ + * Date: $Date: 2003/03/11 14:05:55 $ * Purpose: Store/verify Internet checksum in send/receive packets. * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2001 SysKonnect GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -26,6 +26,10 @@ * History: * * $Log: skcsum.c,v $ + * 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. @@ -73,9 +77,8 @@ #ifdef SK_USE_CSUM /* Check if CSUM is to be used. */ #ifndef lint -static const char SysKonnectFileId[] = "@(#)" - "$Id: skcsum.c,v 1.10 2002/04/11 10:02:04 rwahl Exp $" - " (C) SysKonnect."; +static const char SysKonnectFileId[] = + "@(#) $Id: skcsum.c,v 1.11 2003/03/11 14:05:55 rschmidt Exp $ (C) SysKonnect."; #endif /* !lint */ /****************************************************************************** @@ -107,8 +110,8 @@ * * "h/skdrv1st.h" * "h/skcsum.h" - * "h/sktypes.h" - * "h/skqueue.h" + * "h/sktypes.h" + * "h/skqueue.h" * "h/skdrv2nd.h" * ******************************************************************************/ @@ -173,7 +176,7 @@ * little/big endian conversion on little endian machines only. */ #ifdef SK_LITTLE_ENDIAN -#define SKCS_HTON16(Val16) (((unsigned) (Val16) >> 8) | (((Val16) & 0xFF) << 8)) +#define SKCS_HTON16(Val16) (((unsigned) (Val16) >> 8) | (((Val16) & 0xff) << 8)) #endif /* SK_LITTLE_ENDIAN */ #ifdef SK_BIG_ENDIAN #define SKCS_HTON16(Val16) (Val16) @@ -204,7 +207,7 @@ * zero.) * * Note: - * There is a bug in the ASIC which may lead to wrong checksums. + * There is a bug in the GENESIS ASIC which may lead to wrong checksums. * * Arguments: * pAc - A pointer to the adapter context struct. @@ -603,7 +606,7 @@ NextLevelProtocol = *(SK_U8 *) SKCS_IDX(pIpHeader, SKCS_OFS_IP_NEXT_LEVEL_PROTOCOL); - if (IpHeaderChecksum != 0xFFFF) { + if (IpHeaderChecksum != 0xffff) { pAc->Csum.ProtoStats[NetNumber][SKCS_PROTO_STATS_IP].RxErrCts++; /* the NDIS tester wants to know the upper level protocol too */ if (NextLevelProtocol == SKCS_PROTO_ID_TCP) { @@ -721,7 +724,7 @@ /* Check if the TCP/UDP checksum is ok. */ - if ((unsigned) NextLevelProtocolChecksum == 0xFFFF) { + if ((unsigned) NextLevelProtocolChecksum == 0xffff) { /* TCP/UDP checksum ok. */ @@ -903,12 +906,12 @@ NetNumber = (int)Param.Para32[0]; if (ProtoIndex < 0) { /* Clear for all protocols. */ if (NetNumber >= 0) { - memset(&pAc->Csum.ProtoStats[NetNumber][0], 0, + SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][0], 0, sizeof(pAc->Csum.ProtoStats[NetNumber])); } } else { /* Clear for individual protocol. */ - memset(&pAc->Csum.ProtoStats[NetNumber][ProtoIndex], 0, + SK_MEMSET(&pAc->Csum.ProtoStats[NetNumber][ProtoIndex], 0, sizeof(pAc->Csum.ProtoStats[NetNumber][ProtoIndex])); } break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skdim.c linux-2.4.23-pre8/drivers/net/sk98lin/skdim.c --- linux-2.4.22/drivers/net/sk98lin/skdim.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skdim.c 2003-10-22 22:49:35.000000000 +0000 @@ -0,0 +1,737 @@ +/****************************************************************************** + * + * Name: skdim.c + * Project: GEnesis, PCI Gigabit Ethernet Adapter + * Version: $Revision: 1.2 $ + * Date: $Date: 2003/08/21 12:35:05 $ + * Purpose: All functions to maintain interrupt moderation + * + ******************************************************************************/ + +/****************************************************************************** + * + * (C)Copyright 1998-2002 SysKonnect GmbH. + * + * 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. + * + * The information in this file is provided "AS IS" without warranty. + * + ******************************************************************************/ + +/****************************************************************************** + * + * History: + * + * $Log: skdim.c,v $ + * 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. + * + * + * + ******************************************************************************/ + +/****************************************************************************** + * + * Description: + * + * This module is intended to manage the dynamic interrupt moderation on both + * GEnesis and Yukon adapters. + * + * Include File Hierarchy: + * + * "skdrv1st.h" + * "skdrv2nd.h" + * + ******************************************************************************/ + +#ifndef lint +static const char SysKonnectFileId[] = + "@(#) $Id: skdim.c,v 1.2 2003/08/21 12:35:05 mlindner Exp $ (C) SysKonnect."; +#endif + +#define __SKADDR_C + +#ifdef __cplusplus +#error C++ is not yet supported. +extern "C" { +#endif + +/******************************************************************************* +** +** Includes +** +*******************************************************************************/ + +#ifndef __INC_SKDRV1ST_H +#include "h/skdrv1st.h" +#endif + +#ifndef __INC_SKDRV2ND_H +#include "h/skdrv2nd.h" +#endif + +#include + +/******************************************************************************* +** +** Defines +** +*******************************************************************************/ + +/******************************************************************************* +** +** Typedefs +** +*******************************************************************************/ + +/******************************************************************************* +** +** Local function prototypes +** +*******************************************************************************/ + +static unsigned int GetCurrentSystemLoad(SK_AC *pAC); +static SK_U64 GetIsrCalls(SK_AC *pAC); +static SK_BOOL IsIntModEnabled(SK_AC *pAC); +static void SetCurrIntCtr(SK_AC *pAC); +static void EnableIntMod(SK_AC *pAC); +static void DisableIntMod(SK_AC *pAC); +static void ResizeDimTimerDuration(SK_AC *pAC); +static void DisplaySelectedModerationType(SK_AC *pAC); +static void DisplaySelectedModerationMask(SK_AC *pAC); +static void DisplayDescrRatio(SK_AC *pAC); + +/******************************************************************************* +** +** Global variables +** +*******************************************************************************/ + +/******************************************************************************* +** +** Local variables +** +*******************************************************************************/ + +/******************************************************************************* +** +** Global functions +** +*******************************************************************************/ + +/******************************************************************************* +** Function : SkDimModerate +** Description : Called in every ISR to check if moderation is to be applied +** or not for the current number of interrupts +** Programmer : Ralph Roesler +** Last Modified: 22-mar-03 +** Returns : void (!) +** Notes : - +*******************************************************************************/ + +void +SkDimModerate(SK_AC *pAC) { + unsigned int CurrSysLoad = 0; /* expressed in percent */ + unsigned int LoadIncrease = 0; /* expressed in percent */ + SK_U64 ThresholdInts = 0; + SK_U64 IsrCallsPerSec = 0; + +#define M_DIMINFO pAC->DynIrqModInfo + + if (!IsIntModEnabled(pAC)) { + if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) { + CurrSysLoad = GetCurrentSystemLoad(pAC); + if (CurrSysLoad > 75) { + /* + ** More than 75% total system load! Enable the moderation + ** to shield the system against too many interrupts. + */ + EnableIntMod(pAC); + } else if (CurrSysLoad > M_DIMINFO.PrevSysLoad) { + LoadIncrease = (CurrSysLoad - M_DIMINFO.PrevSysLoad); + if (LoadIncrease > ((M_DIMINFO.PrevSysLoad * + C_INT_MOD_ENABLE_PERCENTAGE) / 100)) { + if (CurrSysLoad > 10) { + /* + ** More than 50% increase with respect to the + ** previous load of the system. Most likely this + ** is due to our ISR-proc... + */ + EnableIntMod(pAC); + } + } + } else { + /* + ** Neither too much system load at all nor too much increase + ** with respect to the previous system load. Hence, we can leave + ** the ISR-handling like it is without enabling moderation. + */ + } + M_DIMINFO.PrevSysLoad = CurrSysLoad; + } + } else { + if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) { + ThresholdInts = ((M_DIMINFO.MaxModIntsPerSec * + C_INT_MOD_DISABLE_PERCENTAGE) / 100); + IsrCallsPerSec = GetIsrCalls(pAC); + if (IsrCallsPerSec <= ThresholdInts) { + /* + ** The number of interrupts within the last second is + ** lower than the disable_percentage of the desried + ** maxrate. Therefore we can disable the moderation. + */ + DisableIntMod(pAC); + M_DIMINFO.MaxModIntsPerSec = + (M_DIMINFO.MaxModIntsPerSecUpperLimit + + M_DIMINFO.MaxModIntsPerSecLowerLimit) / 2; + } else { + /* + ** The number of interrupts per sec is the same as expected. + ** Evalulate the descriptor-ratio. If it has changed, a resize + ** in the moderation timer might be usefull + */ + if (M_DIMINFO.AutoSizing) { + ResizeDimTimerDuration(pAC); + } + } + } + } + + /* + ** Some information to the log... + */ + if (M_DIMINFO.DisplayStats) { + DisplaySelectedModerationType(pAC); + DisplaySelectedModerationMask(pAC); + DisplayDescrRatio(pAC); + } + + M_DIMINFO.NbrProcessedDescr = 0; + SetCurrIntCtr(pAC); +} + +/******************************************************************************* +** Function : SkDimStartModerationTimer +** Description : Starts the audit-timer for the dynamic interrupt moderation +** Programmer : Ralph Roesler +** Last Modified: 22-mar-03 +** Returns : void (!) +** Notes : - +*******************************************************************************/ + +void +SkDimStartModerationTimer(SK_AC *pAC) { + SK_EVPARA EventParam; /* Event struct for timer event */ + + SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam)); + EventParam.Para32[0] = SK_DRV_MODERATION_TIMER; + SkTimerStart(pAC, pAC->IoBase, &pAC->DynIrqModInfo.ModTimer, + SK_DRV_MODERATION_TIMER_LENGTH, + SKGE_DRV, SK_DRV_TIMER, EventParam); +} + +/******************************************************************************* +** Function : SkDimEnableModerationIfNeeded +** Description : Either enables or disables moderation +** Programmer : Ralph Roesler +** Last Modified: 22-mar-03 +** Returns : void (!) +** Notes : This function is called when a particular adapter is opened +** There is no Disable function, because when all interrupts +** might be disable, the moderation timer has no meaning at all +******************************************************************************/ + +void +SkDimEnableModerationIfNeeded(SK_AC *pAC) { + + if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_STATIC) { + EnableIntMod(pAC); /* notification print in this function */ + } else if (M_DIMINFO.IntModTypeSelect == C_INT_MOD_DYNAMIC) { + SkDimStartModerationTimer(pAC); + if (M_DIMINFO.DisplayStats) { + printk("Dynamic moderation has been enabled\n"); + } + } else { + if (M_DIMINFO.DisplayStats) { + printk("No moderation has been enabled\n"); + } + } +} + +/******************************************************************************* +** Function : SkDimDisplayModerationSettings +** Description : Displays the current settings regaring interrupt moderation +** Programmer : Ralph Roesler +** Last Modified: 22-mar-03 +** Returns : void (!) +** Notes : - +*******************************************************************************/ + +void +SkDimDisplayModerationSettings(SK_AC *pAC) { + DisplaySelectedModerationType(pAC); + DisplaySelectedModerationMask(pAC); +} + +/******************************************************************************* +** +** Local functions +** +*******************************************************************************/ + +/******************************************************************************* +** Function : GetCurrentSystemLoad +** Description : Retrieves the current system load of the system. This load +** is evaluated for all processors within the system. +** Programmer : Ralph Roesler +** Last Modified: 22-mar-03 +** Returns : unsigned int: load expressed in percentage +** Notes : The possible range being returned is from 0 up to 100. +** Whereas 0 means 'no load at all' and 100 'system fully loaded' +** It is impossible to determine what actually causes the system +** to be in 100%, but maybe that is due to too much interrupts. +*******************************************************************************/ + +static unsigned int +GetCurrentSystemLoad(SK_AC *pAC) { + unsigned long jif = jiffies; + unsigned int UserTime = 0; + unsigned int SystemTime = 0; + unsigned int NiceTime = 0; + unsigned int IdleTime = 0; + unsigned int TotalTime = 0; + unsigned int UsedTime = 0; + unsigned int SystemLoad = 0; +#ifdef CONFIG_SMP + unsigned int SKNumCpus = smp_num_cpus; +#else + unsigned int SKNumCpus = 1; +#endif + + unsigned int NbrCpu = 0; + + for (NbrCpu = 0; NbrCpu < SKNumCpus; NbrCpu++) { + UserTime = UserTime + kstat.per_cpu_user[NbrCpu]; + NiceTime = NiceTime + kstat.per_cpu_nice[NbrCpu]; + SystemTime = SystemTime + kstat.per_cpu_system[NbrCpu]; + } + + UsedTime = UserTime + NiceTime + SystemTime; + + IdleTime = jif * SKNumCpus - UsedTime; + TotalTime = UsedTime + IdleTime; + + SystemLoad = ( 100 * (UsedTime - M_DIMINFO.PrevUsedTime) ) / + (TotalTime - M_DIMINFO.PrevTotalTime); + + if (M_DIMINFO.DisplayStats) { + printk("Current system load is: %u\n", SystemLoad); + } + + M_DIMINFO.PrevTotalTime = TotalTime; + M_DIMINFO.PrevUsedTime = UsedTime; + + return (SystemLoad); +} + +/******************************************************************************* +** Function : GetIsrCalls +** Description : Depending on the selected moderation mask, this function will +** return the number of interrupts handled in the previous time- +** frame. This evaluated number is based on the current number +** of interrupts stored in PNMI-context and the previous stored +** interrupts. +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : int: the number of interrupts being executed in the last +** timeframe +** Notes : It makes only sense to call this function, when dynamic +** interrupt moderation is applied +*******************************************************************************/ + +static SK_U64 +GetIsrCalls(SK_AC *pAC) { + SK_U64 RxPort0IntDiff = 0; + SK_U64 RxPort1IntDiff = 0; + SK_U64 TxPort0IntDiff = 0; + SK_U64 TxPort1IntDiff = 0; + + if (pAC->DynIrqModInfo.MaskIrqModeration == IRQ_MASK_TX_ONLY) { + if (pAC->GIni.GIMacsFound == 2) { + TxPort1IntDiff = pAC->Pnmi.Port[1].TxIntrCts - + pAC->DynIrqModInfo.PrevPort1TxIntrCts; + } + TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts - + pAC->DynIrqModInfo.PrevPort0TxIntrCts; + } else if (pAC->DynIrqModInfo.MaskIrqModeration == IRQ_MASK_RX_ONLY) { + if (pAC->GIni.GIMacsFound == 2) { + RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts - + pAC->DynIrqModInfo.PrevPort1RxIntrCts; + } + RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts - + pAC->DynIrqModInfo.PrevPort0RxIntrCts; + } else { + if (pAC->GIni.GIMacsFound == 2) { + RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts - + pAC->DynIrqModInfo.PrevPort1RxIntrCts; + TxPort1IntDiff = pAC->Pnmi.Port[1].TxIntrCts - + pAC->DynIrqModInfo.PrevPort1TxIntrCts; + } + RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts - + pAC->DynIrqModInfo.PrevPort0RxIntrCts; + TxPort0IntDiff = pAC->Pnmi.Port[0].TxIntrCts - + pAC->DynIrqModInfo.PrevPort0TxIntrCts; + } + + return (RxPort0IntDiff + RxPort1IntDiff + TxPort0IntDiff + TxPort1IntDiff); +} + +/******************************************************************************* +** Function : GetRxCalls +** Description : This function will return the number of times a receive inter- +** rupt was processed. This is needed to evaluate any resizing +** factor. +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : SK_U64: the number of RX-ints being processed +** Notes : It makes only sense to call this function, when dynamic +** interrupt moderation is applied +*******************************************************************************/ + +static SK_U64 +GetRxCalls(SK_AC *pAC) { + SK_U64 RxPort0IntDiff = 0; + SK_U64 RxPort1IntDiff = 0; + + if (pAC->GIni.GIMacsFound == 2) { + RxPort1IntDiff = pAC->Pnmi.Port[1].RxIntrCts - + pAC->DynIrqModInfo.PrevPort1RxIntrCts; + } + RxPort0IntDiff = pAC->Pnmi.Port[0].RxIntrCts - + pAC->DynIrqModInfo.PrevPort0RxIntrCts; + + return (RxPort0IntDiff + RxPort1IntDiff); +} + +/******************************************************************************* +** Function : SetCurrIntCtr +** Description : Will store the current number orf occured interrupts in the +** adapter context. This is needed to evaluated the number of +** interrupts within a current timeframe. +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : void (!) +** Notes : - +*******************************************************************************/ + +static void +SetCurrIntCtr(SK_AC *pAC) { + if (pAC->GIni.GIMacsFound == 2) { + pAC->DynIrqModInfo.PrevPort1RxIntrCts = pAC->Pnmi.Port[1].RxIntrCts; + pAC->DynIrqModInfo.PrevPort1TxIntrCts = pAC->Pnmi.Port[1].TxIntrCts; + } + pAC->DynIrqModInfo.PrevPort0RxIntrCts = pAC->Pnmi.Port[0].RxIntrCts; + pAC->DynIrqModInfo.PrevPort0TxIntrCts = pAC->Pnmi.Port[0].TxIntrCts; +} + +/******************************************************************************* +** Function : IsIntModEnabled() +** Description : Retrieves the current value of the interrupts moderation +** command register. Its content determines whether any +** moderation is running or not. +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : SK_TRUE : if mod timer running +** SK_FALSE : if no moderation is being performed +** Notes : - +*******************************************************************************/ + +static SK_BOOL +IsIntModEnabled(SK_AC *pAC) { + unsigned long CtrCmd; + + SK_IN32(pAC->IoBase, B2_IRQM_CTRL, &CtrCmd); + if ((CtrCmd & TIM_START) == TIM_START) { + return SK_TRUE; + } else { + return SK_FALSE; + } +} + +/******************************************************************************* +** Function : EnableIntMod() +** Description : Enables the interrupt moderation using the values stored in +** in the pAC->DynIntMod data structure +** Programmer : Ralph Roesler +** Last Modified: 22-mar-03 +** Returns : - +** Notes : - +*******************************************************************************/ + +static void +EnableIntMod(SK_AC *pAC) { + unsigned long ModBase; + + if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { + ModBase = C_CLK_FREQ_GENESIS / pAC->DynIrqModInfo.MaxModIntsPerSec; + } else { + ModBase = C_CLK_FREQ_YUKON / pAC->DynIrqModInfo.MaxModIntsPerSec; + } + + SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase); + SK_OUT32(pAC->IoBase, B2_IRQM_MSK, pAC->DynIrqModInfo.MaskIrqModeration); + SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START); + if (M_DIMINFO.DisplayStats) { + printk("Enabled interrupt moderation (%i ints/sec)\n", + M_DIMINFO.MaxModIntsPerSec); + } +} + +/******************************************************************************* +** Function : DisableIntMod() +** Description : Disbles the interrupt moderation independent of what inter- +** rupts are running or not +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : - +** Notes : - +*******************************************************************************/ + +static void +DisableIntMod(SK_AC *pAC) { + + SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_STOP); + if (M_DIMINFO.DisplayStats) { + printk("Disabled interrupt moderation\n"); + } +} + +/******************************************************************************* +** Function : ResizeDimTimerDuration(); +** Description : Checks the current used descriptor ratio and resizes the +** duration timer (longer/smaller) if possible. +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : - +** Notes : There are both maximum and minimum timer duration value. +** This function assumes that interrupt moderation is already +** enabled! +*******************************************************************************/ + +static void +ResizeDimTimerDuration(SK_AC *pAC) { + SK_BOOL IncreaseTimerDuration; + int TotalMaxNbrDescr; + int UsedDescrRatio; + int RatioDiffAbs; + int RatioDiffRel; + int NewMaxModIntsPerSec; + int ModAdjValue; + long ModBase; + + /* + ** Check first if we are allowed to perform any modification + */ + if (IsIntModEnabled(pAC)) { + if (M_DIMINFO.IntModTypeSelect != C_INT_MOD_DYNAMIC) { + return; + } else { + if (M_DIMINFO.ModJustEnabled) { + M_DIMINFO.ModJustEnabled = SK_FALSE; + return; + } + } + } + + /* + ** If we got until here, we have to evaluate the amount of the + ** descriptor ratio change... + */ + TotalMaxNbrDescr = pAC->RxDescrPerRing * GetRxCalls(pAC); + UsedDescrRatio = (M_DIMINFO.NbrProcessedDescr * 100) / TotalMaxNbrDescr; + + if (UsedDescrRatio > M_DIMINFO.PrevUsedDescrRatio) { + RatioDiffAbs = (UsedDescrRatio - M_DIMINFO.PrevUsedDescrRatio); + RatioDiffRel = (RatioDiffAbs * 100) / UsedDescrRatio; + M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio; + IncreaseTimerDuration = SK_FALSE; /* in other words: DECREASE */ + } else if (UsedDescrRatio < M_DIMINFO.PrevUsedDescrRatio) { + RatioDiffAbs = (M_DIMINFO.PrevUsedDescrRatio - UsedDescrRatio); + RatioDiffRel = (RatioDiffAbs * 100) / M_DIMINFO.PrevUsedDescrRatio; + M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio; + IncreaseTimerDuration = SK_TRUE; /* in other words: INCREASE */ + } else { + RatioDiffAbs = (M_DIMINFO.PrevUsedDescrRatio - UsedDescrRatio); + RatioDiffRel = (RatioDiffAbs * 100) / M_DIMINFO.PrevUsedDescrRatio; + M_DIMINFO.PrevUsedDescrRatio = UsedDescrRatio; + IncreaseTimerDuration = SK_TRUE; /* in other words: INCREASE */ + } + + /* + ** Now we can determine the change in percent + */ + if ((RatioDiffRel >= 0) && (RatioDiffRel <= 5) ) { + ModAdjValue = 1; /* 1% change - maybe some other value in future */ + } else if ((RatioDiffRel > 5) && (RatioDiffRel <= 10) ) { + ModAdjValue = 1; /* 1% change - maybe some other value in future */ + } else if ((RatioDiffRel > 10) && (RatioDiffRel <= 15) ) { + ModAdjValue = 1; /* 1% change - maybe some other value in future */ + } else { + ModAdjValue = 1; /* 1% change - maybe some other value in future */ + } + + if (IncreaseTimerDuration) { + NewMaxModIntsPerSec = M_DIMINFO.MaxModIntsPerSec + + (M_DIMINFO.MaxModIntsPerSec * ModAdjValue) / 100; + } else { + NewMaxModIntsPerSec = M_DIMINFO.MaxModIntsPerSec - + (M_DIMINFO.MaxModIntsPerSec * ModAdjValue) / 100; + } + + /* + ** Check if we exceed boundaries... + */ + if ( (NewMaxModIntsPerSec > M_DIMINFO.MaxModIntsPerSecUpperLimit) || + (NewMaxModIntsPerSec < M_DIMINFO.MaxModIntsPerSecLowerLimit)) { + if (M_DIMINFO.DisplayStats) { + printk("Cannot change ModTim from %i to %i ints/sec\n", + M_DIMINFO.MaxModIntsPerSec, NewMaxModIntsPerSec); + } + return; + } else { + if (M_DIMINFO.DisplayStats) { + printk("Resized ModTim from %i to %i ints/sec\n", + M_DIMINFO.MaxModIntsPerSec, NewMaxModIntsPerSec); + } + } + + M_DIMINFO.MaxModIntsPerSec = NewMaxModIntsPerSec; + + if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { + ModBase = C_CLK_FREQ_GENESIS / pAC->DynIrqModInfo.MaxModIntsPerSec; + } else { + ModBase = C_CLK_FREQ_YUKON / pAC->DynIrqModInfo.MaxModIntsPerSec; + } + + /* + ** We do not need to touch any other registers + */ + SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase); +} + +/******************************************************************************* +** Function : DisplaySelectedModerationType() +** Description : Displays what type of moderation we have +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : void! +** Notes : - +*******************************************************************************/ + +static void +DisplaySelectedModerationType(SK_AC *pAC) { + + if (pAC->DynIrqModInfo.DisplayStats) { + if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) { + printk("Static int moderation runs with %i INTS/sec\n", + pAC->DynIrqModInfo.MaxModIntsPerSec); + } else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) { + if (IsIntModEnabled(pAC)) { + printk("Dynamic int moderation runs with %i INTS/sec\n", + pAC->DynIrqModInfo.MaxModIntsPerSec); + } else { + printk("Dynamic int moderation currently not applied\n"); + } + } else { + printk("No interrupt moderation selected!\n"); + } + } +} + +/******************************************************************************* +** Function : DisplaySelectedModerationMask() +** Description : Displays what interrupts are moderated +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : void! +** Notes : - +*******************************************************************************/ + +static void +DisplaySelectedModerationMask(SK_AC *pAC) { + + if (pAC->DynIrqModInfo.DisplayStats) { + if (pAC->DynIrqModInfo.IntModTypeSelect != C_INT_MOD_NONE) { + switch (pAC->DynIrqModInfo.MaskIrqModeration) { + case IRQ_MASK_TX_ONLY: + printk("Only Tx-interrupts are moderated\n"); + break; + case IRQ_MASK_RX_ONLY: + printk("Only Rx-interrupts are moderated\n"); + break; + case IRQ_MASK_SP_ONLY: + printk("Only special-interrupts are moderated\n"); + break; + case IRQ_MASK_TX_RX: + printk("Tx- and Rx-interrupts are moderated\n"); + break; + case IRQ_MASK_SP_RX: + printk("Special- and Rx-interrupts are moderated\n"); + break; + case IRQ_MASK_SP_TX: + printk("Special- and Tx-interrupts are moderated\n"); + break; + case IRQ_MASK_RX_TX_SP: + printk("All Rx-, Tx and special-interrupts are moderated\n"); + break; + default: + printk("Don't know what is moderated\n"); + break; + } + } else { + printk("No specific interrupts masked for moderation\n"); + } + } +} + +/******************************************************************************* +** Function : DisplayDescrRatio +** Description : Like the name states... +** Programmer : Ralph Roesler +** Last Modified: 23-mar-03 +** Returns : void! +** Notes : - +*******************************************************************************/ + +static void +DisplayDescrRatio(SK_AC *pAC) { + int TotalMaxNbrDescr = 0; + + if (pAC->DynIrqModInfo.DisplayStats) { + TotalMaxNbrDescr = pAC->RxDescrPerRing * GetRxCalls(pAC); + printk("Ratio descriptors: %i/%i\n", + M_DIMINFO.NbrProcessedDescr, TotalMaxNbrDescr); + } +} + +/******************************************************************************* +** +** End of file +** +*******************************************************************************/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skge.c linux-2.4.23-pre8/drivers/net/sk98lin/skge.c --- linux-2.4.22/drivers/net/sk98lin/skge.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skge.c 2003-10-22 22:47:51.000000000 +0000 @@ -2,15 +2,15 @@ * * Name: skge.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.43 $ - * Date: $Date: 2002/11/29 08:42:41 $ + * Version: $Revision: 1.11 $ + * Date: $Date: 2003/08/26 16:05:19 $ * Purpose: The main driver source module * ******************************************************************************/ - + /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * Driver for SysKonnect Gigabit Ethernet Server Adapters: * @@ -31,7 +31,7 @@ * SK-9843 (single link 1000Base-SX V2) * SK-9821 (single link 1000Base-T V2) * - * Created 10-Feb-1999, based on Linux' acenic.c, 3c59x.c and + * Created 10-Feb-1999, based on Linux' acenic.c, 3c59x.c and * SysKonnects GEnesis Solaris driver * Author: Christoph Goos (cgoos@syskonnect.de) * Mirko Lindner (mlindner@syskonnect.de) @@ -56,6 +56,126 @@ * History: * * $Log: skge.c,v $ + * 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.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 * @@ -253,7 +373,7 @@ * Printing "ethX:" before adapter type at adapter init. * * - * 10-Feb-1999 cg Created, based on Linux' acenic.c, 3c59x.c and + * 10-Feb-1999 cg Created, based on Linux' acenic.c, 3c59x.c and * SysKonnects GEnesis Solaris driver * ******************************************************************************/ @@ -262,11 +382,11 @@ * * Possible compiler options (#define xxx / -Dxxx): * - * debugging can be enable by changing SK_DEBUG_CHKMOD and + * debugging can be enable by changing SK_DEBUG_CHKMOD and * SK_DEBUG_CHKCAT in makefile (described there). * ******************************************************************************/ - + /****************************************************************************** * * Description: @@ -330,39 +450,51 @@ ******************************************************************************/ #include "h/skversion.h" + #include #include + +#ifdef CONFIG_PROC_FS #include +#endif + #include "h/skdrv1st.h" #include "h/skdrv2nd.h" +/******************************************************************************* + * + * Defines + * + ******************************************************************************/ -/* defines ******************************************************************/ /* for debuging on x86 only */ /* #define BREAKPOINT() asm(" int $3"); */ +/* use the transmit hw checksum driver functionality */ +#define USE_SK_TX_CHECKSUM + +/* use the receive hw checksum driver functionality */ +#define USE_SK_RX_CHECKSUM + /* use the scatter-gather functionality with sendfile() */ #define SK_ZEROCOPY /* use of a transmit complete interrupt */ #define USE_TX_COMPLETE -/* use interrupt moderation (for tx complete only) */ -#define USE_INT_MOD -#define INTS_PER_SEC 1800 - /* * threshold for copying small receive frames * set to 0 to avoid copying, set to 9001 to copy all frames */ -#define SK_COPY_THRESHOLD 200 +#define SK_COPY_THRESHOLD 50 /* number of adapters that can be configured via command line params */ #define SK_MAX_CARD_PARAM 16 + /* - * use those defines for a compile-in version of the driver instead + * use those defines for a compile-in version of the driver instead * of command line parameters */ // #define LINK_SPEED_A {"Auto", } @@ -376,23 +508,40 @@ // #define ROLE_A {"Auto", } // #define ROLE_B {"Auto", } // #define PREF_PORT {"A", } +// #define CON_TYPE {"Auto", } // #define RLMT_MODE {"CheckLinkState", } #define DEV_KFREE_SKB(skb) dev_kfree_skb(skb) #define DEV_KFREE_SKB_IRQ(skb) dev_kfree_skb_irq(skb) #define DEV_KFREE_SKB_ANY(skb) dev_kfree_skb_any(skb) -/* function prototypes ******************************************************/ + +/* Set blink mode*/ +#define OEM_CONFIG_VALUE ( SK_ACT_LED_BLINK | \ + SK_DUP_LED_NORMAL | \ + SK_LED_LINK100_ON) + + +/* Isr return value */ +#define SkIsrRetVar void +#define SkIsrRetNone NULL +#define SkIsrRetHandled NULL + + +/******************************************************************************* + * + * Local Function Prototypes + * + ******************************************************************************/ + static void FreeResources(struct SK_NET_DEVICE *dev); static int SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC); static SK_BOOL BoardAllocMem(SK_AC *pAC); static void BoardFreeMem(SK_AC *pAC); static void BoardInitMem(SK_AC *pAC); -static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, - int*, SK_BOOL); - -static void SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); -static void SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); +static void SetupRing(SK_AC*, void*, uintptr_t, RXD**, RXD**, RXD**, int*, SK_BOOL); +static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs); +static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs); static int SkGeOpen(struct SK_NET_DEVICE *dev); static int SkGeClose(struct SK_NET_DEVICE *dev); static int SkGeXmit(struct sk_buff *skb, struct SK_NET_DEVICE *dev); @@ -407,33 +556,46 @@ static void FillRxRing(SK_AC*, RX_PORT*); static SK_BOOL FillRxDescriptor(SK_AC*, RX_PORT*); static void ReceiveIrq(SK_AC*, RX_PORT*, SK_BOOL); -static void ClearAndStartRx(SK_AC*, int); +static void ClearAndStartRx(SK_AC*, int); static void ClearTxIrq(SK_AC*, int, int); static void ClearRxRing(SK_AC*, RX_PORT*); static void ClearTxRing(SK_AC*, TX_PORT*); -static void SetQueueSizes(SK_AC *pAC); static int SkGeChangeMtu(struct SK_NET_DEVICE *dev, int new_mtu); static void PortReInitBmu(SK_AC*, int); static int SkGeIocMib(DEV_NET*, unsigned int, int); +static int SkGeInitPCI(SK_AC *pAC); +static void StartDrvCleanupTimer(SK_AC *pAC); +static void StopDrvCleanupTimer(SK_AC *pAC); static int XmitFrameSG(SK_AC*, TX_PORT*, struct sk_buff*); -/*Extern */ +/******************************************************************************* + * + * Extern Function Prototypes + * + ******************************************************************************/ -/* external Proc function */ -extern int proc_read( - char *buffer, - char **buffer_location, - off_t offset, - int buffer_length, - int *eof, - void *data); +#ifdef CONFIG_PROC_FS +static const char SK_Root_Dir_entry[] = "sk98lin"; +static struct proc_dir_entry *pSkRootDir; + +extern int sk_proc_read( char *buffer, + char **buffer_location, + off_t offset, + int buffer_length, + int *eof, + void *data); +#endif + +extern void SkDimEnableModerationIfNeeded(SK_AC *pAC); +extern void SkDimDisplayModerationSettings(SK_AC *pAC); +extern void SkDimStartModerationTimer(SK_AC *pAC); +extern void SkDimModerate(SK_AC *pAC); #ifdef DEBUG static void DumpMsg(struct sk_buff*, char*); static void DumpData(char*, int); static void DumpLong(char*, int); #endif -void dump_frag( SK_U8 *data, int length); /* global variables *********************************************************/ static const char *BootString = BOOT_STRING; @@ -445,10 +607,9 @@ static uintptr_t RxQueueAddr[SK_MAX_MACS] = {0x400, 0x480}; -/* local variables **********************************************************/ -const char SK_Root_Dir_entry[8]; - +#ifdef CONFIG_PROC_FS static struct proc_dir_entry *pSkRootDir; +#endif @@ -467,35 +628,37 @@ */ static int __init skge_probe (void) { - int proc_root_initialized = 0; int boards_found = 0; + int vendor_flag = SK_FALSE; SK_AC *pAC; DEV_NET *pNet = NULL; - struct proc_dir_entry *pProcFile; struct pci_dev *pdev = NULL; - unsigned long base_address; struct SK_NET_DEVICE *dev = NULL; SK_BOOL DeviceFound = SK_FALSE; SK_BOOL BootStringCount = SK_FALSE; + int retval; +#ifdef CONFIG_PROC_FS + int proc_root_initialized = 0; + struct proc_dir_entry *pProcFile; +#endif if (probed) return -ENODEV; probed++; - if (!pci_present()) /* is PCI support present? */ + if (!pci_present()) { /* is PCI support present? */ return -ENODEV; + } - while((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pdev))) - { + while((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pdev))) { dev = NULL; pNet = NULL; - if ((pdev->vendor != PCI_VENDOR_ID_SYSKONNECT) && - ((pdev->device != PCI_DEVICE_ID_SYSKONNECT_GE) || - (pdev->device != PCI_DEVICE_ID_SYSKONNECT_YU))){ + + SK_PCI_ISCOMPLIANT(vendor_flag, pdev); + if (!vendor_flag) continue; - } /* Configure DMA attributes. */ if (pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL) && @@ -518,6 +681,8 @@ pNet = dev->priv; pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL); if (pNet->pAC == NULL){ + dev->get_stats = NULL; + unregister_netdev(dev); kfree(dev->priv); printk(KERN_ERR "Unable to allocate adapter " "structure!\n"); @@ -544,6 +709,14 @@ pNet->Mtu = 1500; pNet->Up = 0; dev->irq = pdev->irq; + retval = SkGeInitPCI(pAC); + if (retval) { + printk("SKGE: PCI setup failed: %i\n", retval); + dev->get_stats = NULL; + unregister_netdev(dev); + kfree(dev); + continue; + } dev->open = &SkGeOpen; dev->stop = &SkGeClose; @@ -556,48 +729,16 @@ dev->flags &= ~IFF_RUNNING; #ifdef SK_ZEROCOPY - if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { +#ifdef USE_SK_TX_CHECKSUM + + if (pAC->ChipsetType) { /* Use only if yukon hardware */ /* SK and ZEROCOPY - fly baby... */ dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; } #endif - - /* - * Dummy value. - */ - dev->base_addr = 42; - pci_set_master(pdev); - - pci_set_master(pdev); - base_address = pci_resource_start (pdev, 0); - -#ifdef SK_BIG_ENDIAN - /* - * On big endian machines, we use the adapter's aibility of - * reading the descriptors as big endian. - */ - { - SK_U32 our2; - SkPciReadCfgDWord(pAC, PCI_OUR_REG_2, &our2); - our2 |= PCI_REV_DESC; - SkPciWriteCfgDWord(pAC, PCI_OUR_REG_2, our2); - } #endif - /* - * Remap the regs into kernel space. - */ - pAC->IoBase = (char*)ioremap(base_address, 0x4000); - - if (!pAC->IoBase){ - printk(KERN_ERR "%s: Unable to map I/O register, " - "SK 98xx No. %i will be disabled.\n", - dev->name, boards_found); - kfree(dev); - break; - } - pAC->Index = boards_found; if (SkGeBoardInit(dev, pAC)) { FreeResources(dev); @@ -609,6 +750,7 @@ (caddr_t) &pAC->Addr.Net[0].CurrentMacAddress, 6); /* First adapter... Create proc and print message */ +#ifdef CONFIG_PROC_FS if (!DeviceFound) { DeviceFound = SK_TRUE; SK_MEMCPY(&SK_Root_Dir_entry, BootString, @@ -618,35 +760,37 @@ if(!proc_root_initialized) { pSkRootDir = create_proc_entry(SK_Root_Dir_entry, S_IFDIR | S_IWUSR | S_IRUGO | S_IXUGO, proc_net); + pSkRootDir->owner = THIS_MODULE; proc_root_initialized = 1; } - - pSkRootDir->owner = THIS_MODULE; } - - /* Create proc file */ pProcFile = create_proc_entry(dev->name, S_IFREG | S_IXUSR | S_IWGRP | S_IROTH, pSkRootDir); - pProcFile->read_proc = proc_read; + pProcFile->read_proc = sk_proc_read; pProcFile->write_proc = NULL; pProcFile->nlink = 1; pProcFile->size = sizeof(dev->name + 1); pProcFile->data = (void *)pProcFile; + pProcFile->owner = THIS_MODULE; +#endif pNet->PortNr = 0; pNet->NetNr = 0; + #ifdef SK_ZEROCOPY - if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { +#ifdef USE_SK_TX_CHECKSUM + if (pAC->ChipsetType) { /* SG and ZEROCOPY - fly baby... */ dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; } #endif +#endif boards_found++; @@ -677,22 +821,27 @@ dev->flags &= ~IFF_RUNNING; #ifdef SK_ZEROCOPY - if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { +#ifdef USE_SK_TX_CHECKSUM + if (pAC->ChipsetType) { /* SG and ZEROCOPY - fly baby... */ dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; } #endif +#endif +#ifdef CONFIG_PROC_FS pProcFile = create_proc_entry(dev->name, S_IFREG | S_IXUSR | S_IWGRP | S_IROTH, pSkRootDir); - pProcFile->read_proc = proc_read; + pProcFile->read_proc = sk_proc_read; pProcFile->write_proc = NULL; pProcFile->nlink = 1; pProcFile->size = sizeof(dev->name + 1); pProcFile->data = (void *)pProcFile; + pProcFile->owner = THIS_MODULE; +#endif memcpy((caddr_t) &dev->dev_addr, (caddr_t) &pAC->Addr.Net[1].CurrentMacAddress, 6); @@ -726,6 +875,68 @@ } /* skge_probe */ + +/***************************************************************************** + * + * SkGeInitPCI - Init the PCI resources + * + * Description: + * This function initialize the PCI resources and IO + * + * Returns: N/A + * + */ +int SkGeInitPCI(SK_AC *pAC) +{ + struct SK_NET_DEVICE *dev = pAC->dev[0]; + struct pci_dev *pdev = pAC->PciDev; + int retval; + + if (pci_enable_device(pdev) != 0) { + return 1; + } + + dev->mem_start = pci_resource_start (pdev, 0); + pci_set_master(pdev); + + if (pci_request_regions(pdev, pAC->Name) != 0) { + retval = 2; + goto out_disable; + } + +#ifdef SK_BIG_ENDIAN + /* + * On big endian machines, we use the adapter's aibility of + * reading the descriptors as big endian. + */ + { + SK_U32 our2; + SkPciReadCfgDWord(pAC, PCI_OUR_REG_2, &our2); + our2 |= PCI_REV_DESC; + SkPciWriteCfgDWord(pAC, PCI_OUR_REG_2, our2); + } +#endif + + /* + * Remap the regs into kernel space. + */ + pAC->IoBase = (char*)ioremap_nocache(dev->mem_start, 0x4000); + + if (!pAC->IoBase){ + retval = 3; + goto out_release; + } + + return 0; + + out_release: + pci_release_regions(pdev); + out_disable: + pci_disable_device(pdev); + return retval; +} + + /***************************************************************************** * * FreeResources - release resources allocated for adapter @@ -747,6 +958,9 @@ pNet = (DEV_NET*) dev->priv; pAC = pNet->pAC; AllocFlag = pAC->AllocFlag; + if (pAC->PciDev) { + pci_release_regions(pAC->PciDev); + } if (AllocFlag & SK_ALLOC_IRQ) { free_irq(dev->irq, dev); } @@ -771,13 +985,20 @@ MODULE_PARM(DupCap_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); MODULE_PARM(FlowCtrl_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); MODULE_PARM(FlowCtrl_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(Role_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); -MODULE_PARM(Role_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); +MODULE_PARM(Role_A, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); +MODULE_PARM(Role_B, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); +MODULE_PARM(ConType, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); MODULE_PARM(PrefPort, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); MODULE_PARM(RlmtMode, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); /* not used, just there because every driver should have them: */ MODULE_PARM(options, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i"); MODULE_PARM(debug, "i"); +/* used for interrupt moderation */ +MODULE_PARM(IntsPerSec, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "i"); +MODULE_PARM(Moderation, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); +MODULE_PARM(Stats, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); +MODULE_PARM(ModerationMask, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); +MODULE_PARM(AutoSizing, "1-" __MODULE_STRING(SK_MAX_CARD_PARAM) "s"); #ifdef LINK_SPEED_A @@ -840,6 +1061,12 @@ static char *Role_B[SK_MAX_CARD_PARAM] = {"", }; #endif +#ifdef CON_TYPE +static char *ConType[SK_MAX_CARD_PARAM] = CON_TYPE; +#else +static char *ConType[SK_MAX_CARD_PARAM] = {"", }; +#endif + #ifdef PREF_PORT static char *PrefPort[SK_MAX_CARD_PARAM] = PREF_PORT; #else @@ -855,6 +1082,12 @@ static int debug = 0; /* not used */ static int options[SK_MAX_CARD_PARAM] = {0, }; /* not used */ +static int IntsPerSec[SK_MAX_CARD_PARAM]; +static char *Moderation[SK_MAX_CARD_PARAM]; +static char *ModerationMask[SK_MAX_CARD_PARAM]; +static char *AutoSizing[SK_MAX_CARD_PARAM]; +static char *Stats[SK_MAX_CARD_PARAM]; + /***************************************************************************** * @@ -878,7 +1111,7 @@ cards = skge_probe(); if (cards == 0) { - printk("No adapter found.\n"); + printk("sk98lin: No adapter found.\n"); } return cards ? 0 : -ENODEV; } /* skge_init_module */ @@ -910,7 +1143,7 @@ netif_stop_queue(SkGeRootDev); SkGeYellowLED(pAC, pAC->IoBase, 0); - if(pAC->BoardLevel == 2) { + if(pAC->BoardLevel == SK_INIT_RUN) { /* board is still alive */ spin_lock_irqsave(&pAC->SlowPathLock, Flags); EvPara.Para32[0] = 0; @@ -922,16 +1155,16 @@ SkEventDispatcher(pAC, pAC->IoBase); /* disable interrupts */ SK_OUT32(pAC->IoBase, B0_IMSK, 0); - SkGeDeInit(pAC, pAC->IoBase); + SkGeDeInit(pAC, pAC->IoBase); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); - pAC->BoardLevel = 0; + pAC->BoardLevel = SK_INIT_DATA; /* We do NOT check here, if IRQ was pending, of course*/ } - if(pAC->BoardLevel == 1) { + if(pAC->BoardLevel == SK_INIT_IO) { /* board is still alive */ - SkGeDeInit(pAC, pAC->IoBase); - pAC->BoardLevel = 0; + SkGeDeInit(pAC, pAC->IoBase); + pAC->BoardLevel = SK_INIT_DATA; } if ((pAC->GIni.GIMacsFound == 2) && pAC->RlmtNets == 2){ @@ -942,7 +1175,7 @@ FreeResources(SkGeRootDev); SkGeRootDev->get_stats = NULL; - /* + /* * otherwise unregister_netdev calls get_stats with * invalid IO ... :-( */ @@ -952,14 +1185,17 @@ SkGeRootDev = next; } +#ifdef CONFIG_PROC_FS /* clear proc-dir */ remove_proc_entry(pSkRootDir->name, proc_net); +#endif } /* skge_cleanup_module */ module_init(skge_init_module); module_exit(skge_cleanup_module); + /***************************************************************************** * * SkGeBoardInit - do level 0 and 1 initialization @@ -1002,20 +1238,20 @@ spin_lock_irqsave(&pAC->SlowPathLock, Flags); /* Does a RESET on board ...*/ - if (SkGeInit(pAC, pAC->IoBase, 0) != 0) { + if (SkGeInit(pAC, pAC->IoBase, SK_INIT_DATA) != 0) { printk("HWInit (0) failed.\n"); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); return(-EAGAIN); } - SkI2cInit( pAC, pAC->IoBase, 0); - SkEventInit(pAC, pAC->IoBase, 0); - SkPnmiInit( pAC, pAC->IoBase, 0); - SkAddrInit( pAC, pAC->IoBase, 0); - SkRlmtInit( pAC, pAC->IoBase, 0); - SkTimerInit(pAC, pAC->IoBase, 0); + SkI2cInit( pAC, pAC->IoBase, SK_INIT_DATA); + SkEventInit(pAC, pAC->IoBase, SK_INIT_DATA); + SkPnmiInit( pAC, pAC->IoBase, SK_INIT_DATA); + SkAddrInit( pAC, pAC->IoBase, SK_INIT_DATA); + SkRlmtInit( pAC, pAC->IoBase, SK_INIT_DATA); + SkTimerInit(pAC, pAC->IoBase, SK_INIT_DATA); - pAC->BoardLevel = 0; - pAC->RxBufSize = ETH_BUF_SIZE; + pAC->BoardLevel = SK_INIT_DATA; + pAC->RxBufSize = ETH_BUF_SIZE; SK_PNMI_SET_DRIVER_DESCR(pAC, DescrString); SK_PNMI_SET_DRIVER_VER(pAC, VerStr); @@ -1024,24 +1260,31 @@ /* level 1 init common modules here (HW init) */ spin_lock_irqsave(&pAC->SlowPathLock, Flags); - if (SkGeInit(pAC, pAC->IoBase, 1) != 0) { + if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) { printk("HWInit (1) failed.\n"); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); return(-EAGAIN); } - SkI2cInit( pAC, pAC->IoBase, 1); - SkEventInit(pAC, pAC->IoBase, 1); - SkPnmiInit( pAC, pAC->IoBase, 1); - SkAddrInit( pAC, pAC->IoBase, 1); - SkRlmtInit( pAC, pAC->IoBase, 1); - SkTimerInit(pAC, pAC->IoBase, 1); + SkI2cInit( pAC, pAC->IoBase, SK_INIT_IO); + SkEventInit(pAC, pAC->IoBase, SK_INIT_IO); + SkPnmiInit( pAC, pAC->IoBase, SK_INIT_IO); + SkAddrInit( pAC, pAC->IoBase, SK_INIT_IO); + SkRlmtInit( pAC, pAC->IoBase, SK_INIT_IO); + SkTimerInit(pAC, pAC->IoBase, SK_INIT_IO); + + /* Set chipset type support */ + pAC->ChipsetType = 0; + if ((pAC->GIni.GIChipId == CHIP_ID_YUKON) || + (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE)) { + pAC->ChipsetType = 1; + } GetConfiguration(pAC); if (pAC->RlmtNets == 2) { pAC->GIni.GIPortUsage = SK_MUL_LINK; } - pAC->BoardLevel = 1; + pAC->BoardLevel = SK_INIT_IO; spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); if (pAC->GIni.GIMacsFound == 2) { @@ -1074,9 +1317,6 @@ pAC->CsOfs = (pAC->CsOfs2 << 16) | pAC->CsOfs1; BoardInitMem(pAC); -#if 0 - SetQueueSizes(pAC); -#else /* tschilling: New common function with minimum size check. */ DualNet = SK_FALSE; if (pAC->RlmtNets == 2) { @@ -1091,7 +1331,6 @@ printk("SkGeInitAssignRamToQueues failed.\n"); return(-EAGAIN); } -#endif /* Print adapter specific string from vpd */ ProductStr(pAC); @@ -1101,9 +1340,9 @@ printk(" PrefPort:%c RlmtMode:%s\n", 'A' + pAC->Rlmt.Net[0].Port[pAC->Rlmt.Net[0].PrefPort]->PortNumber, (pAC->RlmtMode==0) ? "Check Link State" : - ((pAC->RlmtMode==1) ? "Check Link State" : - ((pAC->RlmtMode==3) ? "Check Local Port" : - ((pAC->RlmtMode==7) ? "Check Segmentation" : + ((pAC->RlmtMode==1) ? "Check Link State" : + ((pAC->RlmtMode==3) ? "Check Local Port" : + ((pAC->RlmtMode==7) ? "Check Segmentation" : ((pAC->RlmtMode==17) ? "Dual Check Link State" :"Error"))))); SkGeYellowLED(pAC, pAC->IoBase, 1); @@ -1306,7 +1545,7 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("Descriptor size: %d Descriptor Number: %d\n", DescrSize,DescrNum)); - + pDescr = (RXD*) pMemArea; pPrevDescr = NULL; pNextDescr = (RXD*) (((char*)pDescr) + DescrSize); @@ -1353,24 +1592,22 @@ ("PortReInitBmu ")); /* set address of first descriptor of ring in BMU */ - SK_OUT32(pAC->IoBase, TxQueueAddr[PortIndex][TX_PRIO_LOW]+ - TX_Q_CUR_DESCR_LOW, + SK_OUT32(pAC->IoBase, TxQueueAddr[PortIndex][TX_PRIO_LOW]+ Q_DA_L, (uint32_t)(((caddr_t) (pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxdRingHead) - pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxDescrRing + pAC->TxPort[PortIndex][TX_PRIO_LOW].VTxDescrRing) & 0xFFFFFFFF)); - SK_OUT32(pAC->IoBase, TxQueueAddr[PortIndex][TX_PRIO_LOW]+ - TX_Q_DESCR_HIGH, + SK_OUT32(pAC->IoBase, TxQueueAddr[PortIndex][TX_PRIO_LOW]+ Q_DA_H, (uint32_t)(((caddr_t) (pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxdRingHead) - pAC->TxPort[PortIndex][TX_PRIO_LOW].pTxDescrRing + pAC->TxPort[PortIndex][TX_PRIO_LOW].VTxDescrRing) >> 32)); - SK_OUT32(pAC->IoBase, RxQueueAddr[PortIndex]+RX_Q_CUR_DESCR_LOW, + SK_OUT32(pAC->IoBase, RxQueueAddr[PortIndex]+Q_DA_L, (uint32_t)(((caddr_t)(pAC->RxPort[PortIndex].pRxdRingHead) - pAC->RxPort[PortIndex].pRxDescrRing + pAC->RxPort[PortIndex].VRxDescrRing) & 0xFFFFFFFF)); - SK_OUT32(pAC->IoBase, RxQueueAddr[PortIndex]+RX_Q_DESCR_HIGH, + SK_OUT32(pAC->IoBase, RxQueueAddr[PortIndex]+Q_DA_H, (uint32_t)(((caddr_t)(pAC->RxPort[PortIndex].pRxdRingHead) - pAC->RxPort[PortIndex].pRxDescrRing + pAC->RxPort[PortIndex].VRxDescrRing) >> 32)); @@ -1389,7 +1626,7 @@ * Returns: N/A * */ -static void SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) +static SkIsrRetVar SkGeIsr(int irq, void *dev_id, struct pt_regs *ptregs) { struct SK_NET_DEVICE *dev = (struct SK_NET_DEVICE *)dev_id; DEV_NET *pNet; @@ -1409,20 +1646,20 @@ while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { #if 0 /* software irq currently not used */ - if (IntSrc & IRQ_SW) { + if (IntSrc & IS_IRQ_SW) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("Software IRQ\n")); } #endif - if (IntSrc & IRQ_EOF_RX1) { + if (IntSrc & IS_R1_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF RX1 IRQ\n")); ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); SK_PNMI_CNT_RX_INTR(pAC, 0); } - if (IntSrc & IRQ_EOF_RX2) { + if (IntSrc & IS_R2_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF RX2 IRQ\n")); @@ -1430,7 +1667,7 @@ SK_PNMI_CNT_RX_INTR(pAC, 1); } #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ - if (IntSrc & IRQ_EOF_AS_TX1) { + if (IntSrc & IS_XA1_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF AS TX1 IRQ\n")); @@ -1439,7 +1676,7 @@ FreeTxDescriptors(pAC, &pAC->TxPort[0][TX_PRIO_LOW]); spin_unlock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock); } - if (IntSrc & IRQ_EOF_AS_TX2) { + if (IntSrc & IS_XA2_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF AS TX2 IRQ\n")); @@ -1449,7 +1686,7 @@ spin_unlock(&pAC->TxPort[1][TX_PRIO_LOW].TxDesRingLock); } #if 0 /* only if sync. queues used */ - if (IntSrc & IRQ_EOF_SY_TX1) { + if (IntSrc & IS_XS1_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF SY TX1 IRQ\n")); @@ -1459,7 +1696,7 @@ spin_unlock(&pAC->TxPort[0][TX_PRIO_HIGH].TxDesRingLock); ClearTxIrq(pAC, 0, TX_PRIO_HIGH); } - if (IntSrc & IRQ_EOF_SY_TX2) { + if (IntSrc & IS_XS2_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF SY TX2 IRQ\n")); @@ -1473,19 +1710,20 @@ #endif /* do all IO at once */ - if (IntSrc & IRQ_EOF_RX1) + if (IntSrc & IS_R1_F) ClearAndStartRx(pAC, 0); - if (IntSrc & IRQ_EOF_RX2) + if (IntSrc & IS_R2_F) ClearAndStartRx(pAC, 1); #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ - if (IntSrc & IRQ_EOF_AS_TX1) + if (IntSrc & IS_XA1_F) ClearTxIrq(pAC, 0, TX_PRIO_LOW); - if (IntSrc & IRQ_EOF_AS_TX2) + if (IntSrc & IS_XA2_F) ClearTxIrq(pAC, 1, TX_PRIO_LOW); #endif SK_IN32(pAC->IoBase, B0_ISRC, &IntSrc); } /* while (IntSrc & IRQ_MASK != 0) */ + IntSrc &= pAC->GIni.GIValIrqMask; if ((IntSrc & SPECIAL_IRQS) || pAC->CheckQueue) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("SPECIAL IRQ DP-Cards => %x\n", IntSrc)); @@ -1498,13 +1736,17 @@ spin_unlock(&pAC->SlowPathLock); } /* - * do it all again is case we cleared an interrupt that + * do it all again is case we cleared an interrupt that * came in after handling the ring (OUTs may be delayed * in hardware buffers, but are through after IN) - */ - + * + * rroesler: has been commented out and shifted to + * SkGeDrvEvent(), because it is timer + * guarded now + * ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); ReceiveIrq(pAC, &pAC->RxPort[1], SK_TRUE); + */ if (pAC->CheckQueue) { pAC->CheckQueue = SK_FALSE; @@ -1513,11 +1755,10 @@ spin_unlock(&pAC->SlowPathLock); } - /* IRQ is processed - Enable IRQs again*/ - SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK); + SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); - return; + return; } /* SkGeIsr */ @@ -1534,7 +1775,7 @@ * Returns: N/A * */ -static void SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) +static SkIsrRetVar SkGeIsrOnePort(int irq, void *dev_id, struct pt_regs *ptregs) { struct SK_NET_DEVICE *dev = (struct SK_NET_DEVICE *)dev_id; DEV_NET *pNet; @@ -1554,13 +1795,13 @@ while (((IntSrc & IRQ_MASK) & ~SPECIAL_IRQS) != 0) { #if 0 /* software irq currently not used */ - if (IntSrc & IRQ_SW) { + if (IntSrc & IS_IRQ_SW) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("Software IRQ\n")); } #endif - if (IntSrc & IRQ_EOF_RX1) { + if (IntSrc & IS_R1_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF RX1 IRQ\n")); @@ -1568,7 +1809,7 @@ SK_PNMI_CNT_RX_INTR(pAC, 0); } #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ - if (IntSrc & IRQ_EOF_AS_TX1) { + if (IntSrc & IS_XA1_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF AS TX1 IRQ\n")); @@ -1578,7 +1819,7 @@ spin_unlock(&pAC->TxPort[0][TX_PRIO_LOW].TxDesRingLock); } #if 0 /* only if sync. queues used */ - if (IntSrc & IRQ_EOF_SY_TX1) { + if (IntSrc & IS_XS1_F) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("EOF SY TX1 IRQ\n")); @@ -1592,15 +1833,16 @@ #endif /* do all IO at once */ - if (IntSrc & IRQ_EOF_RX1) + if (IntSrc & IS_R1_F) ClearAndStartRx(pAC, 0); #ifdef USE_TX_COMPLETE /* only if tx complete interrupt used */ - if (IntSrc & IRQ_EOF_AS_TX1) + if (IntSrc & IS_XA1_F) ClearTxIrq(pAC, 0, TX_PRIO_LOW); #endif SK_IN32(pAC->IoBase, B0_ISRC, &IntSrc); } /* while (IntSrc & IRQ_MASK != 0) */ + IntSrc &= pAC->GIni.GIValIrqMask; if ((IntSrc & SPECIAL_IRQS) || pAC->CheckQueue) { SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_INT_SRC, ("SPECIAL IRQ SP-Cards => %x\n", IntSrc)); @@ -1613,16 +1855,21 @@ spin_unlock(&pAC->SlowPathLock); } /* - * do it all again is case we cleared an interrupt that + * do it all again is case we cleared an interrupt that * came in after handling the ring (OUTs may be delayed * in hardware buffers, but are through after IN) - */ + * + * rroesler: has been commented out and shifted to + * SkGeDrvEvent(), because it is timer + * guarded now + * ReceiveIrq(pAC, &pAC->RxPort[0], SK_TRUE); + */ /* IRQ is processed - Enable IRQs again*/ - SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK); + SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); - return; + return; } /* SkGeIsrOnePort */ @@ -1657,34 +1904,39 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeOpen: pAC=0x%lX:\n", (unsigned long)pAC)); - if (pAC->BoardLevel == 0) { + + /* Set blink mode */ + if (pAC->PciDev->vendor == 0x1186) + pAC->GIni.GILedBlinkCtrl = OEM_CONFIG_VALUE; + + if (pAC->BoardLevel == SK_INIT_DATA) { /* level 1 init common modules here */ - if (SkGeInit(pAC, pAC->IoBase, 1) != 0) { + if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) { printk("%s: HWInit (1) failed.\n", pAC->dev[pNet->PortNr]->name); return (-1); } - SkI2cInit (pAC, pAC->IoBase, 1); - SkEventInit (pAC, pAC->IoBase, 1); - SkPnmiInit (pAC, pAC->IoBase, 1); - SkAddrInit (pAC, pAC->IoBase, 1); - SkRlmtInit (pAC, pAC->IoBase, 1); - SkTimerInit (pAC, pAC->IoBase, 1); - pAC->BoardLevel = 1; + SkI2cInit (pAC, pAC->IoBase, SK_INIT_IO); + SkEventInit (pAC, pAC->IoBase, SK_INIT_IO); + SkPnmiInit (pAC, pAC->IoBase, SK_INIT_IO); + SkAddrInit (pAC, pAC->IoBase, SK_INIT_IO); + SkRlmtInit (pAC, pAC->IoBase, SK_INIT_IO); + SkTimerInit (pAC, pAC->IoBase, SK_INIT_IO); + pAC->BoardLevel = SK_INIT_IO; } - if (pAC->BoardLevel != 2) { + if (pAC->BoardLevel != SK_INIT_RUN) { /* tschilling: Level 2 init modules here, check return value. */ - if (SkGeInit(pAC, pAC->IoBase, 2) != 0) { + if (SkGeInit(pAC, pAC->IoBase, SK_INIT_RUN) != 0) { printk("%s: HWInit (2) failed.\n", pAC->dev[pNet->PortNr]->name); return (-1); } - SkI2cInit (pAC, pAC->IoBase, 2); - SkEventInit (pAC, pAC->IoBase, 2); - SkPnmiInit (pAC, pAC->IoBase, 2); - SkAddrInit (pAC, pAC->IoBase, 2); - SkRlmtInit (pAC, pAC->IoBase, 2); - SkTimerInit (pAC, pAC->IoBase, 2); - pAC->BoardLevel = 2; + SkI2cInit (pAC, pAC->IoBase, SK_INIT_RUN); + SkEventInit (pAC, pAC->IoBase, SK_INIT_RUN); + SkPnmiInit (pAC, pAC->IoBase, SK_INIT_RUN); + SkAddrInit (pAC, pAC->IoBase, SK_INIT_RUN); + SkRlmtInit (pAC, pAC->IoBase, SK_INIT_RUN); + SkTimerInit (pAC, pAC->IoBase, SK_INIT_RUN); + pAC->BoardLevel = SK_INIT_RUN; } for (i=0; iGIni.GIMacsFound; i++) { @@ -1694,20 +1946,14 @@ } SkGeYellowLED(pAC, pAC->IoBase, 1); -#ifdef USE_INT_MOD -/* moderate only TX complete interrupts (these are not time critical) */ -#define IRQ_MOD_MASK (IRQ_EOF_AS_TX1 | IRQ_EOF_AS_TX2) - { - unsigned long ModBase; - ModBase = 53125000 / INTS_PER_SEC; - SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase); - SK_OUT32(pAC->IoBase, B2_IRQM_MSK, IRQ_MOD_MASK); - SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START); - } -#endif + StartDrvCleanupTimer(pAC); + SkDimEnableModerationIfNeeded(pAC); + SkDimDisplayModerationSettings(pAC); + + pAC->GIni.GIValIrqMask &= IRQ_MASK; /* enable Interrupts */ - SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK); + SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK); spin_lock_irqsave(&pAC->SlowPathLock, Flags); @@ -1775,7 +2021,9 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeClose: pAC=0x%lX ", (unsigned long)pAC)); - /* + StopDrvCleanupTimer(pAC); + + /* * Clear multicast table, promiscuous mode .... */ SkAddrMcClear(pAC, pAC->IoBase, PortIdx, 0); @@ -1793,7 +2041,7 @@ SK_OUT32(pAC->IoBase, B0_IMSK, 0); /* stop the hardware */ SkGeDeInit(pAC, pAC->IoBase); - pAC->BoardLevel = 0; + pAC->BoardLevel = SK_INIT_DATA; spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); } else { @@ -1807,7 +2055,7 @@ /* Stop port */ spin_lock_irqsave(&pAC->TxPort[pNet->PortNr] [TX_PRIO_LOW].TxDesRingLock, Flags); - SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr, + SkGeStopPort(pAC, pAC->IoBase, pNet->PortNr, SK_STOP_ALL, SK_HARD_RST); spin_unlock_irqrestore(&pAC->TxPort[pNet->PortNr] [TX_PRIO_LOW].TxDesRingLock, Flags); @@ -1832,8 +2080,8 @@ pAC->MaxPorts--; pNet->Up = 0; + MOD_DEC_USE_COUNT; - return (0); } /* SkGeClose */ @@ -1862,7 +2110,7 @@ pNet = (DEV_NET*) dev->priv; pAC = pNet->pAC; - if ((!skb_shinfo(skb)->nr_frags) || + if ((!skb_shinfo(skb)->nr_frags) || (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) { /* Don't activate scatter-gather and hardware checksum */ @@ -1929,24 +2177,29 @@ * < 0 - on failure: other problems ( -> return failure to upper layers) */ static int XmitFrame( -SK_AC *pAC, /* pointer to adapter context */ +SK_AC *pAC, /* pointer to adapter context */ TX_PORT *pTxPort, /* pointer to struct of port to send to */ -struct sk_buff *pMessage) /* pointer to send-message */ +struct sk_buff *pMessage) /* pointer to send-message */ { -TXD *pTxd; /* the rxd to fill */ -unsigned long Flags; -SK_U64 PhysAddr; -int BytesSend; + TXD *pTxd; /* the rxd to fill */ + TXD *pOldTxd; + unsigned long Flags; + SK_U64 PhysAddr; + int Protocol; + int IpHeaderLength; + int BytesSend = pMessage->len; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, - ("X")); + SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("X")); spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); #ifndef USE_TX_COMPLETE FreeTxDescriptors(pAC, pTxPort); #endif if (pTxPort->TxdRingFree == 0) { - /* no enough free descriptors in ring at the moment */ + /* + ** no enough free descriptors in ring at the moment. + ** Maybe free'ing some old one help? + */ FreeTxDescriptors(pAC, pTxPort); if (pTxPort->TxdRingFree == 0) { spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); @@ -1954,59 +2207,106 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, ("XmitFrame failed\n")); - /* this message can not be sent now */ - /* Because tbusy seems to be set, the message should not be freed here */ - /* It will be used by the scheduler of the ethernet handler */ + /* + ** the desired message can not be sent + ** Because tbusy seems to be set, the message + ** should not be freed here. It will be used + ** by the scheduler of the ethernet handler + */ return (-1); } } - /* advance head counter behind descriptor needed for this frame */ + + /* + ** If the passed socket buffer is of smaller MTU-size than 60, + ** copy everything into new buffer and fill all bytes between + ** the original packet end and the new packet end of 60 with 0x00. + ** This is to resolve faulty padding by the HW with 0xaa bytes. + */ + if (BytesSend < C_LEN_ETHERNET_MINSIZE) { + skb_put(pMessage, (C_LEN_ETHERNET_MINSIZE-BytesSend)); + SK_MEMSET( ((char *)(pMessage->data))+BytesSend, + 0, C_LEN_ETHERNET_MINSIZE-BytesSend); + } + + /* + ** advance head counter behind descriptor needed for this frame, + ** so that needed descriptor is reserved from that on. The next + ** action will be to add the passed buffer to the TX-descriptor + */ pTxd = pTxPort->pTxdRingHead; pTxPort->pTxdRingHead = pTxd->pNextTxd; pTxPort->TxdRingFree--; - /* the needed descriptor is reserved now */ - - /* - * everything allocated ok, so add buffer to descriptor - */ #ifdef SK_DUMP_TX DumpMsg(pMessage, "XmitFrame"); #endif - /* set up descriptor and CONTROL dword */ + /* + ** First step is to map the data to be sent via the adapter onto + ** the DMA memory. Kernel 2.2 uses virt_to_bus(), but kernels 2.4 + ** and 2.6 need to use pci_map_page() for that mapping. + */ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev, - virt_to_page(pMessage->data), - ((unsigned long) pMessage->data & - ~PAGE_MASK), - pMessage->len, - PCI_DMA_TODEVICE); - pTxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); + virt_to_page(pMessage->data), + ((unsigned long) pMessage->data & ~PAGE_MASK), + pMessage->len, + PCI_DMA_TODEVICE); + pTxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); - pTxd->pMBuf = pMessage; - pTxd->TBControl = TX_CTRL_OWN_BMU | TX_CTRL_STF | - TX_CTRL_CHECK_DEFAULT | TX_CTRL_SOFTWARE | + pTxd->pMBuf = pMessage; + + if (pMessage->ip_summed == CHECKSUM_HW) { + Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff); + if ((Protocol == C_PROTO_ID_UDP) && + (pAC->GIni.GIChipRev == 0) && + (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { + pTxd->TBControl = BMU_TCP_CHECK; + } else { + pTxd->TBControl = BMU_UDP_CHECK; + } + + IpHeaderLength = (SK_U8)pMessage->data[C_OFFSET_IPHEADER]; + IpHeaderLength = (IpHeaderLength & 0xf) * 4; + pTxd->TcpSumOfs = 0; /* PH-Checksum already calculated */ + pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength + + (Protocol == C_PROTO_ID_UDP ? + C_OFFSET_UDPHEADER_UDPCS : + C_OFFSET_TCPHEADER_TCPCS); + pTxd->TcpSumWr = C_LEN_ETHERMAC_HEADER + IpHeaderLength; + + pTxd->TBControl |= BMU_OWN | BMU_STF | + BMU_SW | BMU_EOF | #ifdef USE_TX_COMPLETE - TX_CTRL_EOF | TX_CTRL_EOF_IRQ | pMessage->len; -#else - TX_CTRL_EOF | pMessage->len; + BMU_IRQ_EOF | #endif - - if ((pTxPort->pTxdRingPrev->TBControl & TX_CTRL_OWN_BMU) == 0) { - /* previous descriptor already done, so give tx start cmd */ - /* StartTx(pAC, pTxPort->HwAddr); */ - SK_OUT8(pTxPort->HwAddr, TX_Q_CTRL, TX_Q_CTRL_START); + pMessage->len; + } else { + pTxd->TBControl = BMU_OWN | BMU_STF | BMU_CHECK | + BMU_SW | BMU_EOF | +#ifdef USE_TX_COMPLETE + BMU_IRQ_EOF | +#endif + pMessage->len; } - pTxPort->pTxdRingPrev = pTxd; - - - BytesSend = pMessage->len; + + /* + ** If previous descriptor already done, give TX start cmd + */ + pOldTxd = xchg(&pTxPort->pTxdRingPrev, pTxd); + if ((pOldTxd->TBControl & BMU_OWN) == 0) { + SK_OUT8(pTxPort->HwAddr, Q_CSR, CSR_START); + } + + /* + ** after releasing the lock, the skb may immediately be free'd + */ spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); - /* after releasing the lock, the skb may be immidiately freed */ - if (pTxPort->TxdRingFree != 0) + if (pTxPort->TxdRingFree != 0) { return (BytesSend); - else + } else { return (0); + } } /* XmitFrame */ @@ -2026,21 +2326,21 @@ * < 0 - on failure: other problems ( -> return failure to upper layers) */ static int XmitFrameSG( -SK_AC *pAC, /* pointer to adapter context */ -TX_PORT *pTxPort, /* pointer to struct of port to send to */ -struct sk_buff *pMessage) /* pointer to send-message */ +SK_AC *pAC, /* pointer to adapter context */ +TX_PORT *pTxPort, /* pointer to struct of port to send to */ +struct sk_buff *pMessage) /* pointer to send-message */ { - int i; - int BytesSend; - int hlength; - int protocol; - skb_frag_t *sk_frag; - TXD *pTxd; - TXD *pTxdFst; - TXD *pTxdLst; - SK_U64 PhysAddr; - unsigned long Flags; + TXD *pTxd; + TXD *pTxdFst; + TXD *pTxdLst; + int CurrFrag; + int BytesSend; + int IpHeaderLength; + int Protocol; + skb_frag_t *sk_frag; + SK_U64 PhysAddr; + unsigned long Flags; spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); #ifndef USE_TX_COMPLETE @@ -2059,114 +2359,123 @@ } } - - pTxd = pTxPort->pTxdRingHead; - pTxdFst = pTxd; - pTxdLst = pTxd; + pTxd = pTxPort->pTxdRingHead; + pTxdFst = pTxd; + pTxdLst = pTxd; BytesSend = 0; - protocol = 0; + Protocol = 0; - /* map first fragment (header) */ + /* + ** Map the first fragment (header) into the DMA-space + */ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev, virt_to_page(pMessage->data), ((unsigned long) pMessage->data & ~PAGE_MASK), skb_headlen(pMessage), PCI_DMA_TODEVICE); - pTxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); + pTxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); - /* HW checksum? */ + /* + ** Does the HW need to evaluate checksum for TCP or UDP packets? + */ if (pMessage->ip_summed == CHECKSUM_HW) { - pTxd->TBControl = TX_CTRL_STF | - TX_CTRL_ST_FWD | - skb_headlen(pMessage); - - /* We have to use the opcode for tcp here because the opcode for - udp is not working in the hardware yet (revision 2.0)*/ - protocol = ((SK_U8)pMessage->data[23] & 0xf); - if ((protocol == 17) && (pAC->GIni.GIChipRev != 0)) - pTxd->TBControl |= BMU_UDP_CHECK; - else - pTxd->TBControl |= BMU_TCP_CHECK ; + pTxd->TBControl = BMU_STF | BMU_STFWD | skb_headlen(pMessage); + /* + ** We have to use the opcode for tcp here, because the + ** opcode for udp is not working in the hardware yet + ** (Revision 2.0) + */ + Protocol = ((SK_U8)pMessage->data[C_OFFSET_IPPROTO] & 0xff); + if ((Protocol == C_PROTO_ID_UDP) && + (pAC->GIni.GIChipRev == 0) && + (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { + pTxd->TBControl |= BMU_TCP_CHECK; + } else { + pTxd->TBControl |= BMU_UDP_CHECK; + } - hlength = ((SK_U8)pMessage->data[14] & 0xf) * 4; + IpHeaderLength = ((SK_U8)pMessage->data[C_OFFSET_IPHEADER] & 0xf)*4; pTxd->TcpSumOfs = 0; /* PH-Checksum already claculated */ - pTxd->TcpSumSt = 14+hlength+16; - pTxd->TcpSumWr = 14+hlength; - + pTxd->TcpSumSt = C_LEN_ETHERMAC_HEADER + IpHeaderLength + + (Protocol == C_PROTO_ID_UDP ? + C_OFFSET_UDPHEADER_UDPCS : + C_OFFSET_TCPHEADER_TCPCS); + pTxd->TcpSumWr = C_LEN_ETHERMAC_HEADER + IpHeaderLength; } else { - pTxd->TBControl = TX_CTRL_CHECK_DEFAULT | - TX_CTRL_SOFTWARE | - TX_CTRL_STF | - skb_headlen(pMessage); + pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_STF | + skb_headlen(pMessage); } pTxd = pTxd->pNextTxd; pTxPort->TxdRingFree--; BytesSend += skb_headlen(pMessage); - - /* Map SG fragments */ - for (i = 0; i < skb_shinfo(pMessage)->nr_frags; i++) { - sk_frag = &skb_shinfo(pMessage)->frags[i]; - - /* we already have the proper value in entry */ + /* + ** Browse over all SG fragments and map each of them into the DMA space + */ + for (CurrFrag = 0; CurrFrag < skb_shinfo(pMessage)->nr_frags; CurrFrag++) { + sk_frag = &skb_shinfo(pMessage)->frags[CurrFrag]; + /* + ** we already have the proper value in entry + */ PhysAddr = (SK_U64) pci_map_page(pAC->PciDev, sk_frag->page, sk_frag->page_offset, sk_frag->size, PCI_DMA_TODEVICE); - pTxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); + pTxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); pTxd->VDataHigh = (SK_U32) (PhysAddr >> 32); - pTxd->pMBuf = pMessage; + pTxd->pMBuf = pMessage; - /* HW checksum */ + /* + ** Does the HW need to evaluate checksum for TCP or UDP packets? + */ if (pMessage->ip_summed == CHECKSUM_HW) { - pTxd->TBControl = TX_CTRL_OWN_BMU | - TX_CTRL_SOFTWARE | - TX_CTRL_ST_FWD; - - /* We have to use the opcode for tcp here because the opcode for - udp is not working in the hardware yet (revision 2.0)*/ - if ((protocol == 17) && (pAC->GIni.GIChipRev != 0)) - pTxd->TBControl |= BMU_UDP_CHECK ; - else - pTxd->TBControl |= BMU_TCP_CHECK ; - + pTxd->TBControl = BMU_OWN | BMU_SW | BMU_STFWD; + /* + ** We have to use the opcode for tcp here because the + ** opcode for udp is not working in the hardware yet + ** (revision 2.0) + */ + if ((Protocol == C_PROTO_ID_UDP) && + (pAC->GIni.GIChipRev == 0) && + (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { + pTxd->TBControl |= BMU_TCP_CHECK; + } else { + pTxd->TBControl |= BMU_UDP_CHECK; + } } else { - pTxd->TBControl = TX_CTRL_CHECK_DEFAULT | - TX_CTRL_SOFTWARE | - TX_CTRL_OWN_BMU; + pTxd->TBControl = BMU_CHECK | BMU_SW | BMU_OWN; } - /* Last fragment */ - if( (i+1) == skb_shinfo(pMessage)->nr_frags ) { + /* + ** Do we have the last fragment? + */ + if( (CurrFrag+1) == skb_shinfo(pMessage)->nr_frags ) { #ifdef USE_TX_COMPLETE - pTxd->TBControl |= TX_CTRL_EOF | - TX_CTRL_EOF_IRQ | - sk_frag->size; + pTxd->TBControl |= BMU_EOF | BMU_IRQ_EOF | sk_frag->size; #else - pTxd->TBControl |= TX_CTRL_EOF | - sk_frag->size; + pTxd->TBControl |= BMU_EOF | sk_frag->size; #endif - pTxdFst->TBControl |= TX_CTRL_OWN_BMU | - TX_CTRL_SOFTWARE; + pTxdFst->TBControl |= BMU_OWN | BMU_SW; } else { pTxd->TBControl |= sk_frag->size; } pTxdLst = pTxd; - pTxd = pTxd->pNextTxd; + pTxd = pTxd->pNextTxd; pTxPort->TxdRingFree--; BytesSend += sk_frag->size; } - if ((pTxPort->pTxdRingPrev->TBControl & TX_CTRL_OWN_BMU) == 0) { - /* previous descriptor already done, so give tx start cmd */ - /* StartTx(pAC, pTxPort->HwAddr); */ - SK_OUT8(pTxPort->HwAddr, TX_Q_CTRL, TX_Q_CTRL_START); + /* + ** If previous descriptor already done, give TX start cmd + */ + if ((pTxPort->pTxdRingPrev->TBControl & BMU_OWN) == 0) { + SK_OUT8(pTxPort->HwAddr, Q_CSR, CSR_START); } pTxPort->pTxdRingPrev = pTxdLst; @@ -2174,28 +2483,13 @@ spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); - if (pTxPort->TxdRingFree > 0) + if (pTxPort->TxdRingFree > 0) { return (BytesSend); - else + } else { return (0); + } } - -void dump_frag( SK_U8 *data, int length) -{ - int i; - - printk("Length: %d\n", length); - for( i=0; i < length; i++ ) { - printk(" %02x", (SK_U8)*(data + i) ); - if( !((i+1) % 20) ) - printk("\n"); - } - printk("\n\n"); - -} - - /***************************************************************************** * * FreeTxDescriptors - release descriptors from the descriptor ring @@ -2224,44 +2518,48 @@ SK_U64 PhysAddr; /* address of DMA mapping */ pNewTail = pTxPort->pTxdRingTail; - pTxd = pNewTail; - /* - * loop forever; exits if TX_CTRL_SOFTWARE bit not set in start frame - * or TX_CTRL_OWN_BMU bit set in any frame - */ + pTxd = pNewTail; + /* + ** loop forever; exits if BMU_SW bit not set in start frame + ** or BMU_OWN bit set in any frame + */ while (1) { Control = pTxd->TBControl; - if ((Control & TX_CTRL_SOFTWARE) == 0) { - /* - * software controllable bit is set in first - * fragment when given to BMU. Not set means that - * this fragment was never sent or is already - * freed ( -> ring completely free now). - */ + if ((Control & BMU_SW) == 0) { + /* + ** software controllable bit is set in first + ** fragment when given to BMU. Not set means that + ** this fragment was never sent or is already + ** freed ( -> ring completely free now). + */ pTxPort->pTxdRingTail = pTxd; - netif_start_queue(pAC->dev[pTxPort->PortIndex]); + netif_wake_queue(pAC->dev[pTxPort->PortIndex]); return; } - if (Control & TX_CTRL_OWN_BMU) { + if (Control & BMU_OWN) { pTxPort->pTxdRingTail = pTxd; if (pTxPort->TxdRingFree > 0) { - netif_start_queue(pAC->dev[pTxPort->PortIndex]); + netif_wake_queue(pAC->dev[pTxPort->PortIndex]); } return; } - /* release the DMA mapping */ + /* + ** release the DMA mapping, because until not unmapped + ** this buffer is considered being under control of the + ** adapter card! + */ PhysAddr = ((SK_U64) pTxd->VDataHigh) << (SK_U64) 32; PhysAddr |= (SK_U64) pTxd->VDataLow; pci_unmap_page(pAC->PciDev, PhysAddr, pTxd->pMBuf->len, PCI_DMA_TODEVICE); - if (Control & TX_CTRL_EOF) + if (Control & BMU_EOF) DEV_KFREE_SKB_ANY(pTxd->pMBuf); /* free message */ pTxPort->TxdRingFree++; - pTxd->TBControl &= ~TX_CTRL_SOFTWARE; + pTxd->TBControl &= ~BMU_SW; pTxd = pTxd->pNextTxd; /* point behind fragment with EOF */ } /* while(forever) */ } /* FreeTxDescriptors */ @@ -2340,11 +2638,15 @@ ~PAGE_MASK), pAC->RxBufSize - 2, PCI_DMA_FROMDEVICE); - pRxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); + + pRxd->VDataLow = (SK_U32) (PhysAddr & 0xffffffff); pRxd->VDataHigh = (SK_U32) (PhysAddr >> 32); - pRxd->pMBuf = pMsgBlock; - pRxd->RBControl = RX_CTRL_OWN_BMU | RX_CTRL_STF | - RX_CTRL_EOF_IRQ | RX_CTRL_CHECK_CSUM | Length; + pRxd->pMBuf = pMsgBlock; + pRxd->RBControl = BMU_OWN | + BMU_STF | + BMU_IRQ_EOF | + BMU_TCP_CHECK | + Length; return (SK_TRUE); } /* FillRxDescriptor */ @@ -2375,15 +2677,18 @@ pRxPort->pRxdRingTail = pRxd->pNextRxd; pRxPort->RxdRingFree--; Length = pAC->RxBufSize; - pRxd->VDataLow = PhysLow; + + pRxd->VDataLow = PhysLow; pRxd->VDataHigh = PhysHigh; - pRxd->pMBuf = pMsg; - pRxd->RBControl = RX_CTRL_OWN_BMU | RX_CTRL_STF | - RX_CTRL_EOF_IRQ | RX_CTRL_CHECK_CSUM | Length; + pRxd->pMBuf = pMsg; + pRxd->RBControl = BMU_OWN | + BMU_STF | + BMU_IRQ_EOF | + BMU_TCP_CHECK | + Length; return; } /* ReQueueRxBuffer */ - /***************************************************************************** * * ReceiveIrq - handle a receive IRQ @@ -2405,6 +2710,7 @@ struct sk_buff *pMsg; /* pointer to message holding frame */ struct sk_buff *pNewMsg; /* pointer to a new message for copying frame */ int FrameLength; /* total length of received frame */ +int IpFrameLength; SK_MBUF *pRlmtMbuf; /* ptr to a buffer for giving a frame to rlmt */ SK_EVPARA EvPara; /* an event parameter union */ unsigned long Flags; /* for spin lock */ @@ -2424,7 +2730,7 @@ SK_U64 PhysAddr; rx_start: - /* do forever; exit if RX_CTRL_OWN_BMU found */ + /* do forever; exit if BMU_OWN found */ for ( pRxd = pRxPort->pRxdRingHead ; pRxPort->RxdRingFree < pAC->RxDescrPerRing ; pRxd = pRxd->pNextRxd, @@ -2432,8 +2738,8 @@ pRxPort->RxdRingFree ++) { /* - * For a better understanding of this loop - * Go through every descriptor beginning at the head + * For a better understanding of this loop + * Go through every descriptor beginning at the head * Please note: the ring might be completely received so the OWN bit * set is not a good crirteria to leave that loop. * Therefore the RingFree counter is used. @@ -2444,23 +2750,23 @@ Control = pRxd->RBControl; /* check if this descriptor is ready */ - if ((Control & RX_CTRL_OWN_BMU) != 0) { + if ((Control & BMU_OWN) != 0) { /* this descriptor is not yet ready */ /* This is the usual end of the loop */ /* We don't need to start the ring again */ FillRxRing(pAC, pRxPort); return; } + pAC->DynIrqModInfo.NbrProcessedDescr++; /* get length of frame and check it */ - FrameLength = Control & RX_CTRL_LEN_MASK; + FrameLength = Control & BMU_BBC; if (FrameLength > pAC->RxBufSize) { goto rx_failed; } /* check for STF and EOF */ - if ((Control & (RX_CTRL_STF | RX_CTRL_EOF)) != - (RX_CTRL_STF | RX_CTRL_EOF)) { + if ((Control & (BMU_STF | BMU_EOF)) != (BMU_STF | BMU_EOF)) { goto rx_failed; } @@ -2497,7 +2803,7 @@ if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { IsBc = (FrameStat & XMR_FS_BC) != 0; IsMc = (FrameStat & XMR_FS_MC) != 0; - IsBadFrame = (FrameStat & + IsBadFrame = (FrameStat & (XMR_FS_ANY_ERR | XMR_FS_2L_VLAN)) != 0; } else { IsBc = (FrameStat & GMR_FS_BC) != 0; @@ -2514,8 +2820,7 @@ pRxPort->RxdRingFree)); /* DumpMsg(pMsg, "Rx"); */ - if ((Control & RX_CTRL_STAT_VALID) != RX_CTRL_STAT_VALID || - (IsBadFrame)) { + if ((Control & BMU_STAT_VAL) != BMU_STAT_VAL || (IsBadFrame)) { #if 0 (FrameStat & (XMR_FS_ANY_ERR | XMR_FS_2L_VLAN)) != 0) { #endif @@ -2560,6 +2865,7 @@ FrameLength, 0); ReQueueRxBuffer(pAC, pRxPort, pMsg, pRxd->VDataHigh, pRxd->VDataLow); + pMsg = pNewMsg; } @@ -2582,33 +2888,65 @@ skb_put(pMsg, FrameLength); /* hardware checksum */ Type = ntohs(*((short*)&pMsg->data[12])); + +#ifdef USE_SK_RX_CHECKSUM if (Type == 0x800) { Csum1=le16_to_cpu(pRxd->TcpSums & 0xffff); Csum2=le16_to_cpu((pRxd->TcpSums >> 16) & 0xffff); - if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) && - (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) || - (pAC->GIni.GIChipId == CHIP_ID_YUKON)) { - Result = SkCsGetReceiveInfo(pAC, - &pMsg->data[14], - Csum1, Csum2, pRxPort->PortIndex); - if (Result == - SKCS_STATUS_IP_FRAGMENT || - Result == - SKCS_STATUS_IP_CSUM_OK || - Result == - SKCS_STATUS_TCP_CSUM_OK || - Result == - SKCS_STATUS_UDP_CSUM_OK) { - pMsg->ip_summed = - CHECKSUM_UNNECESSARY; - } else { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, - SK_DBGCAT_DRV_RX_PROGRESS, - ("skge: CRC error. Frame dropped!\n")); - goto rx_failed; - } - }/* checksumControl calculation valid */ + IpFrameLength = (int) ntohs((unsigned short) + ((unsigned short *) pMsg->data)[8]); + + /* + * Test: If frame is padded, a check is not possible! + * Frame not padded? Length difference must be 14 (0xe)! + */ + if ((FrameLength - IpFrameLength) != 0xe) { + /* Frame padded => TCP offload not possible! */ + pMsg->ip_summed = CHECKSUM_NONE; + } else { + /* Frame not padded => TCP offload! */ + if ((((Csum1 & 0xfffe) && (Csum2 & 0xfffe)) && + (pAC->GIni.GIChipId == CHIP_ID_GENESIS)) || + (pAC->ChipsetType)) { + Result = SkCsGetReceiveInfo(pAC, + &pMsg->data[14], + Csum1, Csum2, pRxPort->PortIndex); + if (Result == + SKCS_STATUS_IP_FRAGMENT || + Result == + SKCS_STATUS_IP_CSUM_OK || + Result == + SKCS_STATUS_TCP_CSUM_OK || + Result == + SKCS_STATUS_UDP_CSUM_OK) { + pMsg->ip_summed = + CHECKSUM_UNNECESSARY; + } + else if (Result == + SKCS_STATUS_TCP_CSUM_ERROR || + Result == + SKCS_STATUS_UDP_CSUM_ERROR || + Result == + SKCS_STATUS_IP_CSUM_ERROR_UDP || + Result == + SKCS_STATUS_IP_CSUM_ERROR_TCP || + Result == + SKCS_STATUS_IP_CSUM_ERROR ) { + /* HW Checksum error */ + SK_DBG_MSG(NULL, SK_DBGMOD_DRV, + SK_DBGCAT_DRV_RX_PROGRESS, + ("skge: CRC error. Frame dropped!\n")); + goto rx_failed; + } else { + pMsg->ip_summed = + CHECKSUM_NONE; + } + }/* checksumControl calculation valid */ + } /* Frame length check */ } /* IP frame */ +#else + pMsg->ip_summed = CHECKSUM_NONE; +#endif } /* frame > SK_COPY_TRESHOLD */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, 1,("V")); @@ -2622,7 +2960,7 @@ #if 0 IsMc = (FrameStat & XMR_FS_MC)==XMR_FS_MC; #endif - SK_RLMT_LOOKAHEAD(pAC, PortIndex, + SK_RLMT_LOOKAHEAD(pAC, PortIndex, &pMsg->data[Offset], IsBc, IsMc, &ForRlmt); } @@ -2647,7 +2985,7 @@ } else { /* drop frame */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, + SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, ("D")); DEV_KFREE_SKB(pMsg); @@ -2656,7 +2994,7 @@ } /* if not for rlmt */ else { /* packet for rlmt */ - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, + SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, ("R")); pRlmtMbuf = SkDrvAllocRlmtMbuf(pAC, pAC->IoBase, FrameLength); @@ -2684,14 +3022,14 @@ pAC->CheckQueue = SK_TRUE; } - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, + SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_RX_PROGRESS, ("Q")); } - if ((pAC->dev[pRxPort->PortIndex]->flags & + if ((pAC->dev[pRxPort->PortIndex]->flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0 || - (ForRlmt & SK_RLMT_RX_PROTOCOL) == - SK_RLMT_RX_PROTOCOL) { + (ForRlmt & SK_RLMT_RX_PROTOCOL) == + SK_RLMT_RX_PROTOCOL) { pMsg->dev = pAC->dev[pRxPort->PortIndex]; pMsg->protocol = eth_type_trans(pMsg, pAC->dev[pRxPort->PortIndex]); @@ -2708,7 +3046,7 @@ /* RXD ring is empty -> fill and restart */ FillRxRing(pAC, pRxPort); /* do not start if called from Close */ - if (pAC->BoardLevel > 0) { + if (pAC->BoardLevel > SK_INIT_DATA) { ClearAndStartRx(pAC, PortIndex); } return; @@ -2750,8 +3088,9 @@ SK_AC *pAC, /* pointer to the adapter context */ int PortIndex) /* index of the receive port (XMAC) */ { - SK_OUT8(pAC->IoBase, RxQueueAddr[PortIndex]+RX_Q_CTRL, - RX_Q_CTRL_START | RX_Q_CTRL_CLR_I_EOF); + SK_OUT8(pAC->IoBase, + RxQueueAddr[PortIndex]+Q_CSR, + CSR_START | CSR_IRQ_CL_F); } /* ClearAndStartRx */ @@ -2770,8 +3109,9 @@ int PortIndex, /* index of the transmit port (XMAC) */ int Prio) /* priority or normal queue */ { - SK_OUT8(pAC->IoBase, TxQueueAddr[PortIndex][Prio]+TX_Q_CTRL, - TX_Q_CTRL_CLR_I_EOF); + SK_OUT8(pAC->IoBase, + TxQueueAddr[PortIndex][Prio]+Q_CSR, + CSR_IRQ_CL_F); } /* ClearTxIrq */ @@ -2810,7 +3150,7 @@ DEV_KFREE_SKB(pRxd->pMBuf); pRxd->pMBuf = NULL; } - pRxd->RBControl &= RX_CTRL_OWN_BMU; + pRxd->RBControl &= BMU_OWN; pRxd = pRxd->pNextRxd; pRxPort->RxdRingFree++; } while (pRxd != pRxPort->pRxdRingTail); @@ -2818,7 +3158,6 @@ spin_unlock_irqrestore(&pRxPort->RxDesRingLock, Flags); } /* ClearRxRing */ - /***************************************************************************** * * ClearTxRing - remove all buffers from the transmit ring @@ -2843,107 +3182,13 @@ spin_lock_irqsave(&pTxPort->TxDesRingLock, Flags); pTxd = pTxPort->pTxdRingHead; for (i=0; iTxDescrPerRing; i++) { - pTxd->TBControl &= ~TX_CTRL_OWN_BMU; + pTxd->TBControl &= ~BMU_OWN; pTxd = pTxd->pNextTxd; } FreeTxDescriptors(pAC, pTxPort); spin_unlock_irqrestore(&pTxPort->TxDesRingLock, Flags); } /* ClearTxRing */ - -/***************************************************************************** - * - * SetQueueSizes - configure the sizes of rx and tx queues - * - * Description: - * This function assigns the sizes for active and passive port - * to the appropriate HWinit structure variables. - * The passive port(s) get standard values, all remaining RAM - * is given to the active port. - * The queue sizes are in kbyte and must be multiple of 8. - * The limits for the number of buffers filled into the rx rings - * is also set in this routine. - * - * Returns: - * none - */ -static void SetQueueSizes( -SK_AC *pAC) /* pointer to the adapter context */ -{ -int StandbyRam; /* adapter RAM used for a standby port */ -int RemainingRam; /* adapter RAM available for the active port */ -int RxRam; /* RAM used for the active port receive queue */ -int i; /* loop counter */ - -if (pAC->RlmtNets == 1) { - StandbyRam = SK_RLMT_STANDBY_QRXSIZE + SK_RLMT_STANDBY_QXASIZE + - SK_RLMT_STANDBY_QXSSIZE; - RemainingRam = pAC->GIni.GIRamSize - - (pAC->GIni.GIMacsFound-1) * StandbyRam; - for (i=0; iGIni.GIMacsFound; i++) { - pAC->GIni.GP[i].PRxQSize = SK_RLMT_STANDBY_QRXSIZE; - pAC->GIni.GP[i].PXSQSize = SK_RLMT_STANDBY_QXSSIZE; - pAC->GIni.GP[i].PXAQSize = SK_RLMT_STANDBY_QXASIZE; - } - RxRam = (RemainingRam * 8 / 10) & ~7; - pAC->GIni.GP[pAC->ActivePort].PRxQSize = RxRam; - pAC->GIni.GP[pAC->ActivePort].PXSQSize = 0; - pAC->GIni.GP[pAC->ActivePort].PXAQSize = - (RemainingRam - RxRam) & ~7; - pAC->RxQueueSize = RxRam; - pAC->TxSQueueSize = 0; - pAC->TxAQueueSize = (RemainingRam - RxRam) & ~7; - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, - ("queue sizes settings - rx:%d txA:%d txS:%d\n", - pAC->RxQueueSize,pAC->TxAQueueSize, pAC->TxSQueueSize)); -} else { - RemainingRam = pAC->GIni.GIRamSize/pAC->GIni.GIMacsFound; - RxRam = (RemainingRam * 8 / 10) & ~7; - for (i=0; iGIni.GIMacsFound; i++) { - pAC->GIni.GP[i].PRxQSize = RxRam; - pAC->GIni.GP[i].PXSQSize = 0; - pAC->GIni.GP[i].PXAQSize = (RemainingRam - RxRam) & ~7; - } - - pAC->RxQueueSize = RxRam; - pAC->TxSQueueSize = 0; - pAC->TxAQueueSize = (RemainingRam - RxRam) & ~7; -} - for (i=0; iRxPort[i].RxFillLimit = pAC->RxDescrPerRing; - } - - if (pAC->RlmtNets == 2) { - for (i=0; iGIni.GIMacsFound; i++) { - pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - 100; - } - } else { - for (i=0; iGIni.GIMacsFound; i++) { - pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - 100; - } - /* - * Do not set the Limit to 0, because this could cause - * wrap around with ReQueue'ed buffers (a buffer could - * be requeued in the same position, made accessable to - * the hardware, and the hardware could change its - * contents! - */ - pAC->RxPort[pAC->ActivePort].RxFillLimit = 1; - } - -#ifdef DEBUG - for (i=0; iGIni.GIMacsFound; i++) { - SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_TX_PROGRESS, - ("i: %d, RxQSize: %d, PXSQsize: %d, PXAQSize: %d\n", - i, - pAC->GIni.GP[i].PRxQSize, - pAC->GIni.GP[i].PXSQSize, - pAC->GIni.GP[i].PXAQSize)); - } -#endif -} /* SetQueueSizes */ - - /***************************************************************************** * * SkGeSetMacAddr - Set the hardware MAC address @@ -3088,49 +3333,52 @@ ("SkGeChangeMtu starts now...\n")); pNet = (DEV_NET*) dev->priv; - pAC = pNet->pAC; + pAC = pNet->pAC; if ((NewMtu < 68) || (NewMtu > SK_JUMBO_MTU)) { return -EINVAL; } - if(pAC->BoardLevel != 2) { + if(pAC->BoardLevel != SK_INIT_RUN) { return -EINVAL; } pNet->Mtu = NewMtu; pOtherNet = (DEV_NET*)pAC->dev[1 - pNet->NetNr]->priv; - if ((pOtherNet->Mtu > 1500) && (NewMtu <= 1500) && (pOtherNet->Up==1)) { + if ((pOtherNet->Mtu>1500) && (NewMtu<=1500) && (pOtherNet->Up==1)) { return(0); } - EvPara.Para32[0] = pNet->NetNr; - EvPara.Para32[1] = -1; - pAC->RxBufSize = NewMtu + 32; dev->mtu = NewMtu; SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("New MTU: %d\n", NewMtu)); - /* prevent reconfiguration while changing the MTU */ - - /* disable interrupts */ + /* + ** Prevent any reconfiguration while changing the MTU + ** by disabling any interrupts + */ SK_OUT32(pAC->IoBase, B0_IMSK, 0); spin_lock_irqsave(&pAC->SlowPathLock, Flags); - /* Found more than one port */ - if ((pAC->GIni.GIMacsFound == 2 ) && - (pAC->RlmtNets == 2)) { - /* Stop both ports */ - EvPara.Para32[0] = 0; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); - EvPara.Para32[0] = 1; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); + /* + ** Notify RLMT that any ports are to be stopped + */ + EvPara.Para32[0] = 0; + EvPara.Para32[1] = -1; + if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { + SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); + EvPara.Para32[0] = 1; + SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); } else { SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_STOP, EvPara); } + /* + ** After calling the SkEventDispatcher(), RLMT is aware about + ** the stopped ports -> configuration can take place! + */ SkEventDispatcher(pAC, pAC->IoBase); for (i=0; iGIni.GIMacsFound; i++) { @@ -3140,140 +3388,132 @@ } - /* - * adjust number of rx buffers allocated - */ + /* + ** Depending on the desired MTU size change, a different number of + ** RX buffers need to be allocated + */ if (NewMtu > 1500) { - /* use less rx buffers */ - for (i=0; iGIni.GIMacsFound; i++) { - /* Found more than one port */ - if ((pAC->GIni.GIMacsFound == 2 ) && - (pAC->RlmtNets == 2)) { - pAC->RxPort[i].RxFillLimit = - pAC->RxDescrPerRing - 100; - } else { - if (i == pAC->ActivePort) - pAC->RxPort[i].RxFillLimit = - pAC->RxDescrPerRing - 100; - else - pAC->RxPort[i].RxFillLimit = - pAC->RxDescrPerRing - 10; - } + /* + ** Use less rx buffers + */ + for (i=0; iGIni.GIMacsFound; i++) { + if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { + pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - + (pAC->RxDescrPerRing / 4); + } else { + if (i == pAC->ActivePort) { + pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - + (pAC->RxDescrPerRing / 4); + } else { + pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - + (pAC->RxDescrPerRing / 10); + } } - } - else { - /* use normal amount of rx buffers */ - for (i=0; iGIni.GIMacsFound; i++) { - /* Found more than one port */ - if ((pAC->GIni.GIMacsFound == 2 ) && - (pAC->RlmtNets == 2)) { - pAC->RxPort[i].RxFillLimit = 1; - } else { - if (i == pAC->ActivePort) - pAC->RxPort[i].RxFillLimit = 1; - else - pAC->RxPort[i].RxFillLimit = - pAC->RxDescrPerRing - 100; - } + } + } else { + /* + ** Use the normal amount of rx buffers + */ + for (i=0; iGIni.GIMacsFound; i++) { + if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { + pAC->RxPort[i].RxFillLimit = 1; + } else { + if (i == pAC->ActivePort) { + pAC->RxPort[i].RxFillLimit = 1; + } else { + pAC->RxPort[i].RxFillLimit = pAC->RxDescrPerRing - + (pAC->RxDescrPerRing / 4); + } } + } } - - SkGeDeInit(pAC, pAC->IoBase); + + SkGeDeInit(pAC, pAC->IoBase); - /* - * enable/disable hardware support for long frames - */ + /* + ** enable/disable hardware support for long frames + */ if (NewMtu > 1500) { -// pAC->JumboActivated = SK_TRUE; /* is never set back !!! */ +// pAC->JumboActivated = SK_TRUE; /* is never set back !!! */ pAC->GIni.GIPortUsage = SK_JUMBO_LINK; - } - else { - if ((pAC->GIni.GIMacsFound == 2 ) && - (pAC->RlmtNets == 2)) { - pAC->GIni.GIPortUsage = SK_MUL_LINK; - } else { - pAC->GIni.GIPortUsage = SK_RED_LINK; - } + } else { + if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { + pAC->GIni.GIPortUsage = SK_MUL_LINK; + } else { + pAC->GIni.GIPortUsage = SK_RED_LINK; + } } - SkGeInit( pAC, pAC->IoBase, 1); - SkI2cInit( pAC, pAC->IoBase, 1); - SkEventInit(pAC, pAC->IoBase, 1); - SkPnmiInit( pAC, pAC->IoBase, 1); - SkAddrInit( pAC, pAC->IoBase, 1); - SkRlmtInit( pAC, pAC->IoBase, 1); - SkTimerInit(pAC, pAC->IoBase, 1); + SkGeInit( pAC, pAC->IoBase, SK_INIT_IO); + SkI2cInit( pAC, pAC->IoBase, SK_INIT_IO); + SkEventInit(pAC, pAC->IoBase, SK_INIT_IO); + SkPnmiInit( pAC, pAC->IoBase, SK_INIT_IO); + SkAddrInit( pAC, pAC->IoBase, SK_INIT_IO); + SkRlmtInit( pAC, pAC->IoBase, SK_INIT_IO); + SkTimerInit(pAC, pAC->IoBase, SK_INIT_IO); /* - * tschilling: - * Speed and others are set back to default in level 1 init! - */ + ** tschilling: + ** Speed and others are set back to default in level 1 init! + */ GetConfiguration(pAC); - SkGeInit( pAC, pAC->IoBase, 2); - SkI2cInit( pAC, pAC->IoBase, 2); - SkEventInit(pAC, pAC->IoBase, 2); - SkPnmiInit( pAC, pAC->IoBase, 2); - SkAddrInit( pAC, pAC->IoBase, 2); - SkRlmtInit( pAC, pAC->IoBase, 2); - SkTimerInit(pAC, pAC->IoBase, 2); + SkGeInit( pAC, pAC->IoBase, SK_INIT_RUN); + SkI2cInit( pAC, pAC->IoBase, SK_INIT_RUN); + SkEventInit(pAC, pAC->IoBase, SK_INIT_RUN); + SkPnmiInit( pAC, pAC->IoBase, SK_INIT_RUN); + SkAddrInit( pAC, pAC->IoBase, SK_INIT_RUN); + SkRlmtInit( pAC, pAC->IoBase, SK_INIT_RUN); + SkTimerInit(pAC, pAC->IoBase, SK_INIT_RUN); - /* - * clear and reinit the rx rings here - */ + /* + ** clear and reinit the rx rings here + */ for (i=0; iGIni.GIMacsFound; i++) { ReceiveIrq(pAC, &pAC->RxPort[i], SK_TRUE); ClearRxRing(pAC, &pAC->RxPort[i]); FillRxRing(pAC, &pAC->RxPort[i]); - /* Enable transmit descriptor polling. */ + /* + ** Enable transmit descriptor polling + */ SkGePollTxD(pAC, pAC->IoBase, i, SK_TRUE); FillRxRing(pAC, &pAC->RxPort[i]); }; SkGeYellowLED(pAC, pAC->IoBase, 1); - -#ifdef USE_INT_MOD - { - unsigned long ModBase; - ModBase = 53125000 / INTS_PER_SEC; - SK_OUT32(pAC->IoBase, B2_IRQM_INI, ModBase); - SK_OUT32(pAC->IoBase, B2_IRQM_MSK, IRQ_MOD_MASK); - SK_OUT32(pAC->IoBase, B2_IRQM_CTRL, TIM_START); - } -#endif + SkDimEnableModerationIfNeeded(pAC); + SkDimDisplayModerationSettings(pAC); netif_start_queue(pAC->dev[pNet->PortNr]); for (i=pAC->GIni.GIMacsFound-1; i>=0; i--) { spin_unlock(&pAC->TxPort[i][TX_PRIO_LOW].TxDesRingLock); } - /* enable Interrupts */ - SK_OUT32(pAC->IoBase, B0_IMSK, IRQ_MASK); + /* + ** Enable Interrupts again + */ + SK_OUT32(pAC->IoBase, B0_IMSK, pAC->GIni.GIValIrqMask); SK_OUT32(pAC->IoBase, B0_HWE_IMSK, IRQ_HWE_MASK); SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); SkEventDispatcher(pAC, pAC->IoBase); - /* Found more than one port */ - if ((pAC->GIni.GIMacsFound == 2 ) && - (pAC->RlmtNets == 2)) { - /* Start both ports */ - EvPara.Para32[0] = pAC->RlmtNets; - EvPara.Para32[1] = -1; - SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS, - EvPara); - + /* + ** Notify RLMT about the changing and restarting one (or more) ports + */ + if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { + EvPara.Para32[0] = pAC->RlmtNets; + EvPara.Para32[1] = -1; + SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_SET_NETS, EvPara); + EvPara.Para32[0] = pNet->PortNr; + EvPara.Para32[1] = -1; + SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); - EvPara.Para32[1] = -1; - EvPara.Para32[0] = pNet->PortNr; + if (pOtherNet->Up) { + EvPara.Para32[0] = pOtherNet->PortNr; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); - - if (pOtherNet->Up) { - EvPara.Para32[0] = pOtherNet->PortNr; - SkEventQueue(pAC, SKGE_RLMT, - SK_RLMT_START, EvPara); - } + } } else { SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_START, EvPara); } @@ -3281,7 +3521,20 @@ SkEventDispatcher(pAC, pAC->IoBase); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); + /* + ** While testing this driver with latest kernel 2.5 (2.5.70), it + ** seems as if upper layers have a problem to handle a successful + ** return value of '0'. If such a zero is returned, the complete + ** system hangs for several minutes (!), which is in acceptable. + ** + ** Currently it is not clear, what the exact reason for this problem + ** is. The implemented workaround for 2.5 is to return the desired + ** new MTU size if all needed changes for the new MTU size where + ** performed. In kernels 2.2 and 2.4, a zero value is returned, + ** which indicates the successful change of the mtu-size. + */ return 0; + } /* SkGeChangeMtu */ @@ -3375,10 +3628,14 @@ { DEV_NET *pNet; SK_AC *pAC; +void *pMemBuf; SK_GE_IOCTL Ioctl; unsigned int Err = 0; -int Size; +int Size = 0; +int Ret = 0; +unsigned int Length = 0; +int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32); SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeIoctl starts now...\n")); @@ -3395,7 +3652,7 @@ case SK_IOCTL_PRESETMIB: if (!capable(CAP_NET_ADMIN)) return -EPERM; case SK_IOCTL_GETMIB: - if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, + if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, Ioctl.LenPnmiStruct)? Ioctl.Len : sizeof(pAC->PnmiStruct))) { return -EFAULT; @@ -3410,10 +3667,41 @@ return -EFAULT; } break; + case SK_IOCTL_GEN: + if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { + Length = Ioctl.Len; + } else { + Length = sizeof(pAC->PnmiStruct) + HeaderLength; + } + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { + return -ENOMEM; + } + if(copy_from_user(pMemBuf, Ioctl.pData, Length)) { + Err = -EFAULT; + goto fault_gen; + } + if ((Ret = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { + Err = -EFAULT; + goto fault_gen; + } + if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) { + Err = -EFAULT; + goto fault_gen; + } + Ioctl.Len = Length; + if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + Err = -EFAULT; + goto fault_gen; + } +fault_gen: + kfree(pMemBuf); /* cleanup everything */ + break; default: Err = -EOPNOTSUPP; } + return(Err); + } /* SkGeIoctl */ @@ -3485,12 +3773,19 @@ SK_AC *pAC) /* pointer to the adapter context structure */ { SK_I32 Port; /* preferred port */ -int LinkSpeed; /* Link speed */ -int AutoNeg; /* auto negotiation off (0) or on (1) */ -int DuplexCap; /* duplex capabilities (0=both, 1=full, 2=half */ -int MSMode; /* master / slave mode selection */ SK_BOOL AutoSet; SK_BOOL DupSet; +int LinkSpeed = SK_LSPEED_AUTO; /* Link speed */ +int AutoNeg = 1; /* autoneg off (0) or on (1) */ +int DuplexCap = 0; /* 0=both,1=full,2=half */ +int FlowCtrl = SK_FLOW_MODE_SYM_OR_REM; /* FlowControl */ +int MSMode = SK_MS_MODE_AUTO; /* master/slave mode */ + +SK_BOOL IsConTypeDefined = SK_TRUE; +SK_BOOL IsLinkSpeedDefined = SK_TRUE; +SK_BOOL IsFlowCtrlDefined = SK_TRUE; +SK_BOOL IsRoleDefined = SK_TRUE; +SK_BOOL IsModeDefined = SK_TRUE; /* * The two parameters AutoNeg. and DuplexCap. map to one configuration * parameter. The mapping is described by this table: @@ -3503,109 +3798,227 @@ * ----------------------------------------------------------------- * Sense | AutoSense | AutoSense | AutoSense | */ -int Capabilities[3][3] = - { { -1, SK_LMODE_FULL, SK_LMODE_HALF}, - {SK_LMODE_AUTOBOTH, SK_LMODE_AUTOFULL, SK_LMODE_AUTOHALF}, +int Capabilities[3][3] = + { { -1, SK_LMODE_FULL , SK_LMODE_HALF }, + {SK_LMODE_AUTOBOTH , SK_LMODE_AUTOFULL , SK_LMODE_AUTOHALF }, {SK_LMODE_AUTOSENSE, SK_LMODE_AUTOSENSE, SK_LMODE_AUTOSENSE} }; + #define DC_BOTH 0 #define DC_FULL 1 #define DC_HALF 2 #define AN_OFF 0 #define AN_ON 1 #define AN_SENS 2 +#define M_CurrPort pAC->GIni.GP[Port] + + + /* + ** Set the default values first for both ports! + */ + for (Port = 0; Port < SK_MAX_MACS; Port++) { + M_CurrPort.PLinkModeConf = Capabilities[AN_ON][DC_BOTH]; + M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_SYM_OR_REM; + M_CurrPort.PMSMode = SK_MS_MODE_AUTO; + M_CurrPort.PLinkSpeed = SK_LSPEED_AUTO; + } + + /* + ** Check merged parameter ConType. If it has not been used, + ** verify any other parameter (e.g. AutoNeg) and use default values. + ** + ** Stating both ConType and other lowlevel link parameters is also + ** possible. If this is the case, the passed ConType-parameter is + ** overwritten by the lowlevel link parameter. + ** + ** The following settings are used for a merged ConType-parameter: + ** + ** ConType DupCap AutoNeg FlowCtrl Role Speed + ** ------- ------ ------- -------- ---------- ----- + ** Auto Both On SymOrRem Auto Auto + ** 100FD Full Off None 100 + ** 100HD Half Off None 100 + ** 10FD Full Off None 10 + ** 10HD Half Off None 10 + ** + ** This ConType parameter is used for all ports of the adapter! + */ + if ( (ConType != NULL) && + (pAC->Index < SK_MAX_CARD_PARAM) && + (ConType[pAC->Index] != NULL) ) { + + /* Check chipset family */ + if ((!pAC->ChipsetType) && + (strcmp(ConType[pAC->Index],"Auto")!=0) && + (strcmp(ConType[pAC->Index],"")!=0)) { + /* Set the speed parameter back */ + printk("%s: Illegal value \"%s\" " + "for ConType." + " Using Auto.\n", + pAC->dev[0]->name, + ConType[pAC->Index]); + + sprintf(ConType[pAC->Index], "Auto"); + } - /* settings for port A */ - /* settings link speed */ - LinkSpeed = SK_LSPEED_AUTO; /* default: do auto select */ + if (strcmp(ConType[pAC->Index],"")==0) { + IsConTypeDefined = SK_FALSE; /* No ConType defined */ + } else if (strcmp(ConType[pAC->Index],"Auto")==0) { + for (Port = 0; Port < SK_MAX_MACS; Port++) { + M_CurrPort.PLinkModeConf = Capabilities[AN_ON][DC_BOTH]; + M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_SYM_OR_REM; + M_CurrPort.PMSMode = SK_MS_MODE_AUTO; + M_CurrPort.PLinkSpeed = SK_LSPEED_AUTO; + } + } else if (strcmp(ConType[pAC->Index],"100FD")==0) { + for (Port = 0; Port < SK_MAX_MACS; Port++) { + M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_FULL]; + M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE; + M_CurrPort.PMSMode = SK_MS_MODE_AUTO; + M_CurrPort.PLinkSpeed = SK_LSPEED_100MBPS; + } + } else if (strcmp(ConType[pAC->Index],"100HD")==0) { + for (Port = 0; Port < SK_MAX_MACS; Port++) { + M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_HALF]; + M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE; + M_CurrPort.PMSMode = SK_MS_MODE_AUTO; + M_CurrPort.PLinkSpeed = SK_LSPEED_100MBPS; + } + } else if (strcmp(ConType[pAC->Index],"10FD")==0) { + for (Port = 0; Port < SK_MAX_MACS; Port++) { + M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_FULL]; + M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE; + M_CurrPort.PMSMode = SK_MS_MODE_AUTO; + M_CurrPort.PLinkSpeed = SK_LSPEED_10MBPS; + } + } else if (strcmp(ConType[pAC->Index],"10HD")==0) { + for (Port = 0; Port < SK_MAX_MACS; Port++) { + M_CurrPort.PLinkModeConf = Capabilities[AN_OFF][DC_HALF]; + M_CurrPort.PFlowCtrlMode = SK_FLOW_MODE_NONE; + M_CurrPort.PMSMode = SK_MS_MODE_AUTO; + M_CurrPort.PLinkSpeed = SK_LSPEED_10MBPS; + } + } else { + printk("%s: Illegal value \"%s\" for ConType\n", + pAC->dev[0]->name, ConType[pAC->Index]); + IsConTypeDefined = SK_FALSE; /* Wrong ConType defined */ + } + } else { + IsConTypeDefined = SK_FALSE; /* No ConType defined */ + } + + /* + ** Parse any parameter settings for port A: + ** a) any LinkSpeed stated? + */ if (Speed_A != NULL && pAC->IndexIndex] != NULL) { if (strcmp(Speed_A[pAC->Index],"")==0) { - LinkSpeed = SK_LSPEED_AUTO; - } - else if (strcmp(Speed_A[pAC->Index],"Auto")==0) { - LinkSpeed = SK_LSPEED_AUTO; - } - else if (strcmp(Speed_A[pAC->Index],"10")==0) { - LinkSpeed = SK_LSPEED_10MBPS; - } - else if (strcmp(Speed_A[pAC->Index],"100")==0) { - LinkSpeed = SK_LSPEED_100MBPS; - } - else if (strcmp(Speed_A[pAC->Index],"1000")==0) { - LinkSpeed = SK_LSPEED_1000MBPS; + IsLinkSpeedDefined = SK_FALSE; + } else if (strcmp(Speed_A[pAC->Index],"Auto")==0) { + LinkSpeed = SK_LSPEED_AUTO; + } else if (strcmp(Speed_A[pAC->Index],"10")==0) { + LinkSpeed = SK_LSPEED_10MBPS; + } else if (strcmp(Speed_A[pAC->Index],"100")==0) { + LinkSpeed = SK_LSPEED_100MBPS; + } else if (strcmp(Speed_A[pAC->Index],"1000")==0) { + LinkSpeed = SK_LSPEED_1000MBPS; + } else { + printk("%s: Illegal value \"%s\" for Speed_A\n", + pAC->dev[0]->name, Speed_A[pAC->Index]); + IsLinkSpeedDefined = SK_FALSE; } - else printk("%s: Illegal value for Speed_A\n", - pAC->dev[0]->name); + } else { + IsLinkSpeedDefined = SK_FALSE; } - /* Check speed parameter */ - /* Only copper type adapter and GE V2 cards */ - if (((pAC->GIni.GIChipId != CHIP_ID_YUKON) || - (pAC->GIni.GICopperType != SK_TRUE)) && - ((LinkSpeed != SK_LSPEED_AUTO) && + /* + ** Check speed parameter: + ** Only copper type adapter and GE V2 cards + */ + if (((!pAC->ChipsetType) || (pAC->GIni.GICopperType != SK_TRUE)) && + ((LinkSpeed != SK_LSPEED_AUTO) && (LinkSpeed != SK_LSPEED_1000MBPS))) { printk("%s: Illegal value for Speed_A. " "Not a copper card or GE V2 card\n Using " "speed 1000\n", pAC->dev[0]->name); LinkSpeed = SK_LSPEED_1000MBPS; } - pAC->GIni.GP[0].PLinkSpeed = LinkSpeed; + + /* + ** Decide whether to set new config value if somethig valid has + ** been received. + */ + if (IsLinkSpeedDefined) { + pAC->GIni.GP[0].PLinkSpeed = LinkSpeed; + } - /* Autonegotiation */ + /* + ** b) Any Autonegotiation and DuplexCapabilities set? + ** Please note that both belong together... + */ AutoNeg = AN_ON; /* tschilling: Default: Autonegotiation on! */ AutoSet = SK_FALSE; if (AutoNeg_A != NULL && pAC->IndexIndex] != NULL) { AutoSet = SK_TRUE; if (strcmp(AutoNeg_A[pAC->Index],"")==0) { - AutoSet = SK_FALSE; - } - else if (strcmp(AutoNeg_A[pAC->Index],"On")==0) { - AutoNeg = AN_ON; - } - else if (strcmp(AutoNeg_A[pAC->Index],"Off")==0) { - AutoNeg = AN_OFF; - } - else if (strcmp(AutoNeg_A[pAC->Index],"Sense")==0) { - AutoNeg = AN_SENS; + AutoSet = SK_FALSE; + } else if (strcmp(AutoNeg_A[pAC->Index],"On")==0) { + AutoNeg = AN_ON; + } else if (strcmp(AutoNeg_A[pAC->Index],"Off")==0) { + AutoNeg = AN_OFF; + } else if (strcmp(AutoNeg_A[pAC->Index],"Sense")==0) { + AutoNeg = AN_SENS; + } else { + printk("%s: Illegal value \"%s\" for AutoNeg_A\n", + pAC->dev[0]->name, AutoNeg_A[pAC->Index]); } - else printk("%s: Illegal value for AutoNeg_A\n", - pAC->dev[0]->name); } DuplexCap = DC_BOTH; - DupSet = SK_FALSE; + DupSet = SK_FALSE; if (DupCap_A != NULL && pAC->IndexIndex] != NULL) { DupSet = SK_TRUE; if (strcmp(DupCap_A[pAC->Index],"")==0) { - DupSet = SK_FALSE; - } - else if (strcmp(DupCap_A[pAC->Index],"Both")==0) { - DuplexCap = DC_BOTH; - } - else if (strcmp(DupCap_A[pAC->Index],"Full")==0) { - DuplexCap = DC_FULL; - } - else if (strcmp(DupCap_A[pAC->Index],"Half")==0) { - DuplexCap = DC_HALF; + DupSet = SK_FALSE; + } else if (strcmp(DupCap_A[pAC->Index],"Both")==0) { + DuplexCap = DC_BOTH; + } else if (strcmp(DupCap_A[pAC->Index],"Full")==0) { + DuplexCap = DC_FULL; + } else if (strcmp(DupCap_A[pAC->Index],"Half")==0) { + DuplexCap = DC_HALF; + } else { + printk("%s: Illegal value \"%s\" for DupCap_A\n", + pAC->dev[0]->name, DupCap_A[pAC->Index]); } - else printk("%s: Illegal value for DupCap_A\n", - pAC->dev[0]->name); } - /* check for illegal combinations */ - if (AutoSet && AutoNeg==AN_SENS && DupSet) { + /* + ** Check for illegal combinations + */ + if ((LinkSpeed = SK_LSPEED_1000MBPS) && + ((DuplexCap == SK_LMODE_STAT_AUTOHALF) || + (DuplexCap == SK_LMODE_STAT_HALF)) && + (pAC->ChipsetType)) { + printk("%s: Half Duplex not possible with Gigabit speed!\n" + " Using Full Duplex.\n", + pAC->dev[0]->name); + DuplexCap = DC_FULL; + } + + if ( AutoSet && AutoNeg==AN_SENS && DupSet) { printk("%s, Port A: DuplexCapabilities" " ignored using Sense mode\n", pAC->dev[0]->name); } + if (AutoSet && AutoNeg==AN_OFF && DupSet && DuplexCap==DC_BOTH){ printk("%s, Port A: Illegal combination" " of values AutoNeg. and DuplexCap.\n Using " "Full Duplex\n", pAC->dev[0]->name); - DuplexCap = DC_FULL; } + if (AutoSet && AutoNeg==AN_OFF && !DupSet) { DuplexCap = DC_FULL; } @@ -3618,151 +4031,194 @@ AutoNeg = AN_ON; } - /* set the desired mode */ - pAC->GIni.GP[0].PLinkModeConf = - Capabilities[AutoNeg][DuplexCap]; + /* + ** set the desired mode + */ + if (AutoSet || DupSet) { + pAC->GIni.GP[0].PLinkModeConf = Capabilities[AutoNeg][DuplexCap]; + } - pAC->GIni.GP[0].PFlowCtrlMode = SK_FLOW_MODE_SYM_OR_REM; + /* + ** c) Any Flowcontrol-parameter set? + */ if (FlowCtrl_A != NULL && pAC->IndexIndex] != NULL) { if (strcmp(FlowCtrl_A[pAC->Index],"") == 0) { + IsFlowCtrlDefined = SK_FALSE; + } else if (strcmp(FlowCtrl_A[pAC->Index],"SymOrRem") == 0) { + FlowCtrl = SK_FLOW_MODE_SYM_OR_REM; + } else if (strcmp(FlowCtrl_A[pAC->Index],"Sym")==0) { + FlowCtrl = SK_FLOW_MODE_SYMMETRIC; + } else if (strcmp(FlowCtrl_A[pAC->Index],"LocSend")==0) { + FlowCtrl = SK_FLOW_MODE_LOC_SEND; + } else if (strcmp(FlowCtrl_A[pAC->Index],"None")==0) { + FlowCtrl = SK_FLOW_MODE_NONE; + } else { + printk("%s: Illegal value \"%s\" for FlowCtrl_A\n", + pAC->dev[0]->name, FlowCtrl_A[pAC->Index]); + IsFlowCtrlDefined = SK_FALSE; } - else if (strcmp(FlowCtrl_A[pAC->Index],"SymOrRem") == 0) { - pAC->GIni.GP[0].PFlowCtrlMode = - SK_FLOW_MODE_SYM_OR_REM; - } - else if (strcmp(FlowCtrl_A[pAC->Index],"Sym")==0) { - pAC->GIni.GP[0].PFlowCtrlMode = - SK_FLOW_MODE_SYMMETRIC; - } - else if (strcmp(FlowCtrl_A[pAC->Index],"LocSend")==0) { - pAC->GIni.GP[0].PFlowCtrlMode = - SK_FLOW_MODE_LOC_SEND; - } - else if (strcmp(FlowCtrl_A[pAC->Index],"None")==0) { - pAC->GIni.GP[0].PFlowCtrlMode = - SK_FLOW_MODE_NONE; - } - else printk("Illegal value for FlowCtrl_A\n"); + } else { + IsFlowCtrlDefined = SK_FALSE; } - if (AutoNeg==AN_OFF && pAC->GIni.GP[0].PFlowCtrlMode!= - SK_FLOW_MODE_NONE) { + + if (IsFlowCtrlDefined) { + if ((AutoNeg == AN_OFF) && (FlowCtrl != SK_FLOW_MODE_NONE)) { printk("%s, Port A: FlowControl" " impossible without AutoNegotiation," " disabled\n", pAC->dev[0]->name); - pAC->GIni.GP[0].PFlowCtrlMode = SK_FLOW_MODE_NONE; + FlowCtrl = SK_FLOW_MODE_NONE; + } + pAC->GIni.GP[0].PFlowCtrlMode = FlowCtrl; } - MSMode = SK_MS_MODE_AUTO; /* default: do auto select */ + /* + ** d) What is with the RoleParameter? + */ if (Role_A != NULL && pAC->IndexIndex] != NULL) { if (strcmp(Role_A[pAC->Index],"")==0) { + IsRoleDefined = SK_FALSE; + } else if (strcmp(Role_A[pAC->Index],"Auto")==0) { + MSMode = SK_MS_MODE_AUTO; + } else if (strcmp(Role_A[pAC->Index],"Master")==0) { + MSMode = SK_MS_MODE_MASTER; + } else if (strcmp(Role_A[pAC->Index],"Slave")==0) { + MSMode = SK_MS_MODE_SLAVE; + } else { + printk("%s: Illegal value \"%s\" for Role_A\n", + pAC->dev[0]->name, Role_A[pAC->Index]); + IsRoleDefined = SK_FALSE; } - else if (strcmp(Role_A[pAC->Index],"Auto")==0) { - MSMode = SK_MS_MODE_AUTO; - } - else if (strcmp(Role_A[pAC->Index],"Master")==0) { - MSMode = SK_MS_MODE_MASTER; - } - else if (strcmp(Role_A[pAC->Index],"Slave")==0) { - MSMode = SK_MS_MODE_SLAVE; - } - else printk("%s: Illegal value for Role_A\n", - pAC->dev[0]->name); + } else { + IsRoleDefined = SK_FALSE; + } + + if (IsRoleDefined == SK_TRUE) { + pAC->GIni.GP[0].PMSMode = MSMode; } - pAC->GIni.GP[0].PMSMode = MSMode; + - /* settings for port B */ - /* settings link speed */ - LinkSpeed = SK_LSPEED_AUTO; /* default: do auto select */ + /* + ** Parse any parameter settings for port B: + ** a) any LinkSpeed stated? + */ + IsConTypeDefined = SK_TRUE; + IsLinkSpeedDefined = SK_TRUE; + IsFlowCtrlDefined = SK_TRUE; + IsModeDefined = SK_TRUE; + if (Speed_B != NULL && pAC->IndexIndex] != NULL) { if (strcmp(Speed_B[pAC->Index],"")==0) { - LinkSpeed = SK_LSPEED_AUTO; - } - else if (strcmp(Speed_B[pAC->Index],"Auto")==0) { - LinkSpeed = SK_LSPEED_AUTO; - } - else if (strcmp(Speed_B[pAC->Index],"10")==0) { - LinkSpeed = SK_LSPEED_10MBPS; - } - else if (strcmp(Speed_B[pAC->Index],"100")==0) { - LinkSpeed = SK_LSPEED_100MBPS; - } - else if (strcmp(Speed_B[pAC->Index],"1000")==0) { - LinkSpeed = SK_LSPEED_1000MBPS; + IsLinkSpeedDefined = SK_FALSE; + } else if (strcmp(Speed_B[pAC->Index],"Auto")==0) { + LinkSpeed = SK_LSPEED_AUTO; + } else if (strcmp(Speed_B[pAC->Index],"10")==0) { + LinkSpeed = SK_LSPEED_10MBPS; + } else if (strcmp(Speed_B[pAC->Index],"100")==0) { + LinkSpeed = SK_LSPEED_100MBPS; + } else if (strcmp(Speed_B[pAC->Index],"1000")==0) { + LinkSpeed = SK_LSPEED_1000MBPS; + } else { + printk("%s: Illegal value \"%s\" for Speed_B\n", + pAC->dev[1]->name, Speed_B[pAC->Index]); + IsLinkSpeedDefined = SK_FALSE; } - else printk("%s: Illegal value for Speed_B\n", - pAC->dev[1]->name); + } else { + IsLinkSpeedDefined = SK_FALSE; } - /* Check speed parameter */ - /* Only copper type adapter and GE V2 cards */ - if (((pAC->GIni.GIChipId != CHIP_ID_YUKON) || - (pAC->GIni.GICopperType != SK_TRUE)) && - ((LinkSpeed != SK_LSPEED_AUTO) && + /* + ** Check speed parameter: + ** Only copper type adapter and GE V2 cards + */ + if (((!pAC->ChipsetType) || (pAC->GIni.GICopperType != SK_TRUE)) && + ((LinkSpeed != SK_LSPEED_AUTO) && (LinkSpeed != SK_LSPEED_1000MBPS))) { printk("%s: Illegal value for Speed_B. " "Not a copper card or GE V2 card\n Using " "speed 1000\n", pAC->dev[1]->name); LinkSpeed = SK_LSPEED_1000MBPS; } - pAC->GIni.GP[1].PLinkSpeed = LinkSpeed; - /* Auto negotiation */ + /* + ** Decide whether to set new config value if somethig valid has + ** been received. + */ + if (IsLinkSpeedDefined) { + pAC->GIni.GP[1].PLinkSpeed = LinkSpeed; + } + + /* + ** b) Any Autonegotiation and DuplexCapabilities set? + ** Please note that both belong together... + */ AutoNeg = AN_SENS; /* default: do auto Sense */ AutoSet = SK_FALSE; if (AutoNeg_B != NULL && pAC->IndexIndex] != NULL) { AutoSet = SK_TRUE; if (strcmp(AutoNeg_B[pAC->Index],"")==0) { - AutoSet = SK_FALSE; - } - else if (strcmp(AutoNeg_B[pAC->Index],"On")==0) { - AutoNeg = AN_ON; - } - else if (strcmp(AutoNeg_B[pAC->Index],"Off")==0) { - AutoNeg = AN_OFF; - } - else if (strcmp(AutoNeg_B[pAC->Index],"Sense")==0) { - AutoNeg = AN_SENS; + AutoSet = SK_FALSE; + } else if (strcmp(AutoNeg_B[pAC->Index],"On")==0) { + AutoNeg = AN_ON; + } else if (strcmp(AutoNeg_B[pAC->Index],"Off")==0) { + AutoNeg = AN_OFF; + } else if (strcmp(AutoNeg_B[pAC->Index],"Sense")==0) { + AutoNeg = AN_SENS; + } else { + printk("%s: Illegal value \"%s\" for AutoNeg_B\n", + pAC->dev[0]->name, AutoNeg_B[pAC->Index]); } - else printk("Illegal value for AutoNeg_B\n"); } DuplexCap = DC_BOTH; - DupSet = SK_FALSE; + DupSet = SK_FALSE; if (DupCap_B != NULL && pAC->IndexIndex] != NULL) { DupSet = SK_TRUE; if (strcmp(DupCap_B[pAC->Index],"")==0) { - DupSet = SK_FALSE; - } - else if (strcmp(DupCap_B[pAC->Index],"Both")==0) { - DuplexCap = DC_BOTH; - } - else if (strcmp(DupCap_B[pAC->Index],"Full")==0) { - DuplexCap = DC_FULL; - } - else if (strcmp(DupCap_B[pAC->Index],"Half")==0) { - DuplexCap = DC_HALF; + DupSet = SK_FALSE; + } else if (strcmp(DupCap_B[pAC->Index],"Both")==0) { + DuplexCap = DC_BOTH; + } else if (strcmp(DupCap_B[pAC->Index],"Full")==0) { + DuplexCap = DC_FULL; + } else if (strcmp(DupCap_B[pAC->Index],"Half")==0) { + DuplexCap = DC_HALF; + } else { + printk("%s: Illegal value \"%s\" for DupCap_B\n", + pAC->dev[0]->name, DupCap_B[pAC->Index]); } - else printk("Illegal value for DupCap_B\n"); } + - /* check for illegal combinations */ + /* + ** Check for illegal combinations + */ + if ((LinkSpeed = SK_LSPEED_1000MBPS) && + ((DuplexCap == SK_LMODE_STAT_AUTOHALF) || + (DuplexCap == SK_LMODE_STAT_HALF)) && + (pAC->ChipsetType)) { + printk("%s: Half Duplex not possible with Gigabit speed!\n" + " Using Full Duplex.\n", + pAC->dev[1]->name); + DuplexCap = DC_FULL; + } + if (AutoSet && AutoNeg==AN_SENS && DupSet) { printk("%s, Port B: DuplexCapabilities" " ignored using Sense mode\n", pAC->dev[1]->name); } + if (AutoSet && AutoNeg==AN_OFF && DupSet && DuplexCap==DC_BOTH){ printk("%s, Port B: Illegal combination" " of values AutoNeg. and DuplexCap.\n Using " "Full Duplex\n", pAC->dev[1]->name); - DuplexCap = DC_FULL; } + if (AutoSet && AutoNeg==AN_OFF && !DupSet) { DuplexCap = DC_FULL; } @@ -3775,90 +4231,103 @@ AutoNeg = AN_ON; } - /* set the desired mode */ - pAC->GIni.GP[1].PLinkModeConf = - Capabilities[AutoNeg][DuplexCap]; + /* + ** set the desired mode + */ + if (AutoSet || DupSet) { + pAC->GIni.GP[1].PLinkModeConf = Capabilities[AutoNeg][DuplexCap]; + } - pAC->GIni.GP[1].PFlowCtrlMode = SK_FLOW_MODE_SYM_OR_REM; + /* + ** c) Any FlowCtrl parameter set? + */ if (FlowCtrl_B != NULL && pAC->IndexIndex] != NULL) { if (strcmp(FlowCtrl_B[pAC->Index],"") == 0) { + IsFlowCtrlDefined = SK_FALSE; + } else if (strcmp(FlowCtrl_B[pAC->Index],"SymOrRem") == 0) { + FlowCtrl = SK_FLOW_MODE_SYM_OR_REM; + } else if (strcmp(FlowCtrl_B[pAC->Index],"Sym")==0) { + FlowCtrl = SK_FLOW_MODE_SYMMETRIC; + } else if (strcmp(FlowCtrl_B[pAC->Index],"LocSend")==0) { + FlowCtrl = SK_FLOW_MODE_LOC_SEND; + } else if (strcmp(FlowCtrl_B[pAC->Index],"None")==0) { + FlowCtrl = SK_FLOW_MODE_NONE; + } else { + printk("%s: Illegal value \"%s\" for FlowCtrl_B\n", + pAC->dev[0]->name, FlowCtrl_B[pAC->Index]); + IsFlowCtrlDefined = SK_FALSE; } - else if (strcmp(FlowCtrl_B[pAC->Index],"SymOrRem") == 0) { - pAC->GIni.GP[1].PFlowCtrlMode = - SK_FLOW_MODE_SYM_OR_REM; - } - else if (strcmp(FlowCtrl_B[pAC->Index],"Sym")==0) { - pAC->GIni.GP[1].PFlowCtrlMode = - SK_FLOW_MODE_SYMMETRIC; - } - else if (strcmp(FlowCtrl_B[pAC->Index],"LocSend")==0) { - pAC->GIni.GP[1].PFlowCtrlMode = - SK_FLOW_MODE_LOC_SEND; - } - else if (strcmp(FlowCtrl_B[pAC->Index],"None")==0) { - pAC->GIni.GP[1].PFlowCtrlMode = - SK_FLOW_MODE_NONE; - } - else printk("Illegal value for FlowCtrl_B\n"); + } else { + IsFlowCtrlDefined = SK_FALSE; } - if (AutoNeg==AN_OFF && pAC->GIni.GP[1].PFlowCtrlMode!= - SK_FLOW_MODE_NONE) { + + if (IsFlowCtrlDefined) { + if ((AutoNeg == AN_OFF) && (FlowCtrl != SK_FLOW_MODE_NONE)) { printk("%s, Port B: FlowControl" " impossible without AutoNegotiation," " disabled\n", pAC->dev[1]->name); - pAC->GIni.GP[1].PFlowCtrlMode = SK_FLOW_MODE_NONE; + FlowCtrl = SK_FLOW_MODE_NONE; + } + pAC->GIni.GP[1].PFlowCtrlMode = FlowCtrl; } - MSMode = SK_MS_MODE_AUTO; /* default: do auto select */ + /* + ** d) What is the RoleParameter? + */ if (Role_B != NULL && pAC->IndexIndex] != NULL) { if (strcmp(Role_B[pAC->Index],"")==0) { + IsRoleDefined = SK_FALSE; + } else if (strcmp(Role_B[pAC->Index],"Auto")==0) { + MSMode = SK_MS_MODE_AUTO; + } else if (strcmp(Role_B[pAC->Index],"Master")==0) { + MSMode = SK_MS_MODE_MASTER; + } else if (strcmp(Role_B[pAC->Index],"Slave")==0) { + MSMode = SK_MS_MODE_SLAVE; + } else { + printk("%s: Illegal value \"%s\" for Role_B\n", + pAC->dev[1]->name, Role_B[pAC->Index]); + IsRoleDefined = SK_FALSE; } - else if (strcmp(Role_B[pAC->Index],"Auto")==0) { - MSMode = SK_MS_MODE_AUTO; - } - else if (strcmp(Role_B[pAC->Index],"Master")==0) { - MSMode = SK_MS_MODE_MASTER; - } - else if (strcmp(Role_B[pAC->Index],"Slave")==0) { - MSMode = SK_MS_MODE_SLAVE; - } - else printk("%s: Illegal value for Role_B\n", - pAC->dev[1]->name); + } else { + IsRoleDefined = SK_FALSE; + } + + if (IsRoleDefined) { + pAC->GIni.GP[1].PMSMode = MSMode; } - pAC->GIni.GP[1].PMSMode = MSMode; - - /* settings for both ports */ + /* + ** Evaluate settings for both ports + */ pAC->ActivePort = 0; if (PrefPort != NULL && pAC->IndexIndex] != NULL) { if (strcmp(PrefPort[pAC->Index],"") == 0) { /* Auto */ - pAC->ActivePort = 0; - pAC->Rlmt.Net[0].Preference = -1; /* auto */ - pAC->Rlmt.Net[0].PrefPort = 0; - } - else if (strcmp(PrefPort[pAC->Index],"A") == 0) { - /* - * do not set ActivePort here, thus a port - * switch is issued after net up. - */ - Port = 0; - pAC->Rlmt.Net[0].Preference = Port; - pAC->Rlmt.Net[0].PrefPort = Port; - } - else if (strcmp(PrefPort[pAC->Index],"B") == 0) { - /* - * do not set ActivePort here, thus a port - * switch is issued after net up. - */ - Port = 1; - pAC->Rlmt.Net[0].Preference = Port; - pAC->Rlmt.Net[0].PrefPort = Port; + pAC->ActivePort = 0; + pAC->Rlmt.Net[0].Preference = -1; /* auto */ + pAC->Rlmt.Net[0].PrefPort = 0; + } else if (strcmp(PrefPort[pAC->Index],"A") == 0) { + /* + ** do not set ActivePort here, thus a port + ** switch is issued after net up. + */ + Port = 0; + pAC->Rlmt.Net[0].Preference = Port; + pAC->Rlmt.Net[0].PrefPort = Port; + } else if (strcmp(PrefPort[pAC->Index],"B") == 0) { + /* + ** do not set ActivePort here, thus a port + ** switch is issued after net up. + */ + Port = 1; + pAC->Rlmt.Net[0].Preference = Port; + pAC->Rlmt.Net[0].PrefPort = Port; + } else { + printk("%s: Illegal value \"%s\" for PrefPort\n", + pAC->dev[0]->name, PrefPort[pAC->Index]); } - else printk("%s: Illegal value for PrefPort\n", - pAC->dev[0]->name); } pAC->RlmtNets = 1; @@ -3867,33 +4336,126 @@ RlmtMode[pAC->Index] != NULL) { if (strcmp(RlmtMode[pAC->Index], "") == 0) { pAC->RlmtMode = 0; - } - else if (strcmp(RlmtMode[pAC->Index], "CheckLinkState") == 0) { + } else if (strcmp(RlmtMode[pAC->Index], "CheckLinkState") == 0) { pAC->RlmtMode = SK_RLMT_CHECK_LINK; - } - else if (strcmp(RlmtMode[pAC->Index], "CheckLocalPort") == 0) { - pAC->RlmtMode = SK_RLMT_CHECK_LINK | - SK_RLMT_CHECK_LOC_LINK; - } - else if (strcmp(RlmtMode[pAC->Index], "CheckSeg") == 0) { + } else if (strcmp(RlmtMode[pAC->Index], "CheckLocalPort") == 0) { pAC->RlmtMode = SK_RLMT_CHECK_LINK | - SK_RLMT_CHECK_LOC_LINK | - SK_RLMT_CHECK_SEG; - } - else if ((strcmp(RlmtMode[pAC->Index], "DualNet") == 0) && + SK_RLMT_CHECK_LOC_LINK; + } else if (strcmp(RlmtMode[pAC->Index], "CheckSeg") == 0) { + pAC->RlmtMode = SK_RLMT_CHECK_LINK | + SK_RLMT_CHECK_LOC_LINK | + SK_RLMT_CHECK_SEG; + } else if ((strcmp(RlmtMode[pAC->Index], "DualNet") == 0) && (pAC->GIni.GIMacsFound == 2)) { - pAC->RlmtMode = SK_RLMT_CHECK_LINK; - pAC->RlmtNets = 2; - } - else { - printk("%s: Illegal value for" - " RlmtMode, using default\n", pAC->dev[0]->name); + pAC->RlmtMode = SK_RLMT_CHECK_LINK; + pAC->RlmtNets = 2; + } else { + printk("%s: Illegal value \"%s\" for" + " RlmtMode, using default\n", + pAC->dev[0]->name, RlmtMode[pAC->Index]); pAC->RlmtMode = 0; } - } - else { + } else { pAC->RlmtMode = 0; } + + /* + ** Check the interrupt moderation parameters + */ + if (Moderation[pAC->Index] != NULL) { + if (strcmp(Moderation[pAC->Index], "Static") == 0) { + pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_STATIC; + } else if (strcmp(Moderation[pAC->Index], "Dynamic") == 0) { + pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_DYNAMIC; + } else { + pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE; + } + } else { + pAC->DynIrqModInfo.IntModTypeSelect = C_INT_MOD_NONE; + } + + if (Stats[pAC->Index] != NULL) { + if (strcmp(Stats[pAC->Index], "Yes") == 0) { + pAC->DynIrqModInfo.DisplayStats = SK_TRUE; + } else { + pAC->DynIrqModInfo.DisplayStats = SK_FALSE; + } + } else { + pAC->DynIrqModInfo.DisplayStats = SK_FALSE; + } + + if (ModerationMask[pAC->Index] != NULL) { + if (strcmp(ModerationMask[pAC->Index], "Rx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY; + } else if (strcmp(ModerationMask[pAC->Index], "Tx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_ONLY; + } else if (strcmp(ModerationMask[pAC->Index], "Sp") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_ONLY; + } else if (strcmp(ModerationMask[pAC->Index], "RxSp") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX; + } else if (strcmp(ModerationMask[pAC->Index], "SpRx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_RX; + } else if (strcmp(ModerationMask[pAC->Index], "RxTx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX; + } else if (strcmp(ModerationMask[pAC->Index], "TxRx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX; + } else if (strcmp(ModerationMask[pAC->Index], "TxSp") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX; + } else if (strcmp(ModerationMask[pAC->Index], "SpTx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_SP_TX; + } else if (strcmp(ModerationMask[pAC->Index], "RxTxSp") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; + } else if (strcmp(ModerationMask[pAC->Index], "RxSpTx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; + } else if (strcmp(ModerationMask[pAC->Index], "TxRxSp") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; + } else if (strcmp(ModerationMask[pAC->Index], "TxSpRx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; + } else if (strcmp(ModerationMask[pAC->Index], "SpTxRx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; + } else if (strcmp(ModerationMask[pAC->Index], "SpRxTx") == 0) { + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_TX_SP; + } else { /* some rubbish */ + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_RX_ONLY; + } + } else { /* operator has stated nothing */ + pAC->DynIrqModInfo.MaskIrqModeration = IRQ_MASK_TX_RX; + } + + if (AutoSizing[pAC->Index] != NULL) { + if (strcmp(AutoSizing[pAC->Index], "On") == 0) { + pAC->DynIrqModInfo.AutoSizing = SK_FALSE; + } else { + pAC->DynIrqModInfo.AutoSizing = SK_FALSE; + } + } else { /* operator has stated nothing */ + pAC->DynIrqModInfo.AutoSizing = SK_FALSE; + } + + if (IntsPerSec[pAC->Index] != 0) { + if ((IntsPerSec[pAC->Index]< 30) || (IntsPerSec[pAC->Index]> 40000)) { + pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT; + } else { + pAC->DynIrqModInfo.MaxModIntsPerSec = IntsPerSec[pAC->Index]; + } + } else { + pAC->DynIrqModInfo.MaxModIntsPerSec = C_INTS_PER_SEC_DEFAULT; + } + + /* + ** Evaluate upper and lower moderation threshold + */ + pAC->DynIrqModInfo.MaxModIntsPerSecUpperLimit = + pAC->DynIrqModInfo.MaxModIntsPerSec + + (pAC->DynIrqModInfo.MaxModIntsPerSec / 2); + + pAC->DynIrqModInfo.MaxModIntsPerSecLowerLimit = + pAC->DynIrqModInfo.MaxModIntsPerSec - + (pAC->DynIrqModInfo.MaxModIntsPerSec / 2); + + pAC->DynIrqModInfo.PrevTimeVal = jiffies; /* initial value */ + + } /* GetConfiguration */ @@ -3928,8 +4490,44 @@ } } /* ProductStr */ +/***************************************************************************** + * + * StartDrvCleanupTimer - Start timer to check for descriptors which + * might be placed in descriptor ring, but + * havent been handled up to now + * + * Description: + * This function requests a HW-timer fo the Yukon card. The actions to + * perform when this timer expires, are located in the SkDrvEvent(). + * + * Returns: N/A + */ +static void +StartDrvCleanupTimer(SK_AC *pAC) { + SK_EVPARA EventParam; /* Event struct for timer event */ + + SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam)); + EventParam.Para32[0] = SK_DRV_RX_CLEANUP_TIMER; + SkTimerStart(pAC, pAC->IoBase, &pAC->DrvCleanupTimer, + SK_DRV_RX_CLEANUP_TIMER_LENGTH, + SKGE_DRV, SK_DRV_TIMER, EventParam); +} - +/***************************************************************************** + * + * StopDrvCleanupTimer - Stop timer to check for descriptors + * + * Description: + * This function requests a HW-timer fo the Yukon card. The actions to + * perform when this timer expires, are located in the SkDrvEvent(). + * + * Returns: N/A + */ +static void +StopDrvCleanupTimer(SK_AC *pAC) { + SkTimerStop(pAC, pAC->IoBase, &pAC->DrvCleanupTimer); + SK_MEMSET((char *) &pAC->DrvCleanupTimer, 0, sizeof(SK_TIMER)); +} /****************************************************************************/ /* functions for common modules *********************************************/ @@ -3988,8 +4586,8 @@ * Nothing */ void SkDrvFreeRlmtMbuf( -SK_AC *pAC, /* pointer to adapter context */ -SK_IOC IoC, /* the IO-context */ +SK_AC *pAC, /* pointer to adapter context */ +SK_IOC IoC, /* the IO-context */ SK_MBUF *pMbuf) /* size of the requested buffer */ { SK_MBUF *pFreeMbuf; @@ -4018,7 +4616,9 @@ */ SK_U64 SkOsGetTime(SK_AC *pAC) { - return jiffies; + SK_U64 PrivateJiffies; + SkOsGetTimeCurrent(pAC, &PrivateJiffies); + return PrivateJiffies; } /* SkOsGetTime */ @@ -4266,6 +4866,9 @@ printk(" speed: unknown\n"); } + /* Mac update */ + SkAddrMcUpdate(pAC,IoC, FromPort); + Stat = pAC->GIni.GP[FromPort].PLinkModeStatus; if (Stat == SK_LMODE_STAT_AUTOHALF || Stat == SK_LMODE_STAT_AUTOFULL) { @@ -4311,17 +4914,39 @@ } } + /* + Display dim (dynamic interrupt moderation) + informations + */ + if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_STATIC) + printk(" irq moderation: static (%d ints/sec)\n", + pAC->DynIrqModInfo.MaxModIntsPerSec); + else if (pAC->DynIrqModInfo.IntModTypeSelect == C_INT_MOD_DYNAMIC) + printk(" irq moderation: dynamic (%d ints/sec)\n", + pAC->DynIrqModInfo.MaxModIntsPerSec); + else + printk(" irq moderation: disabled\n"); + + #ifdef SK_ZEROCOPY - if (pAC->GIni.GIChipId == CHIP_ID_YUKON) + if (pAC->ChipsetType) +#ifdef USE_SK_TX_CHECKSUM printk(" scatter-gather: enabled\n"); +#else + printk(" tx-checksum: disabled\n"); +#endif else printk(" scatter-gather: disabled\n"); - #else printk(" scatter-gather: disabled\n"); #endif - - if ((Param.Para32[0] != pAC->ActivePort) && + +#ifndef USE_SK_RX_CHECKSUM + printk(" rx-checksum: disabled\n"); +#endif + + + if ((Param.Para32[0] != pAC->ActivePort) && (pAC->RlmtNets == 1)) { NewPara.Para32[0] = pAC->ActivePort; NewPara.Para32[1] = Param.Para32[0]; @@ -4376,7 +5001,7 @@ ClearTxRing(pAC, &pAC->TxPort[FromPort][TX_PRIO_LOW]); ClearTxRing(pAC, &pAC->TxPort[ToPort][TX_PRIO_LOW]); spin_lock_irqsave( - &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, + &pAC->TxPort[FromPort][TX_PRIO_LOW].TxDesRingLock, Flags); spin_lock_irqsave( &pAC->TxPort[ToPort][TX_PRIO_LOW].TxDesRingLock, Flags); @@ -4438,6 +5063,31 @@ DEV_KFREE_SKB_ANY(pMsg); break; + case SK_DRV_TIMER: + if (Param.Para32[0] == SK_DRV_MODERATION_TIMER) { + /* + ** expiration of the moderation timer implies that + ** dynamic moderation is to be applied + */ + SkDimStartModerationTimer(pAC); + SkDimModerate(pAC); + if (pAC->DynIrqModInfo.DisplayStats) { + SkDimDisplayModerationSettings(pAC); + } + } else if (Param.Para32[0] == SK_DRV_RX_CLEANUP_TIMER) { + /* + ** check if we need to check for descriptors which + ** haven't been handled the last millisecs + */ + StartDrvCleanupTimer(pAC); + if (pAC->GIni.GIMacsFound == 2) { + ReceiveIrq(pAC, &pAC->RxPort[1], SK_FALSE); + } + ReceiveIrq(pAC, &pAC->RxPort[0], SK_FALSE); + } else { + printk("Expiration of unknown timer\n"); + } + break; default: break; } @@ -4545,7 +5195,7 @@ * DumpData - print a data area * * Description: - * This function prints a area of data to the system logfile/to the + * This function prints a area of data to the system logfile/to the * console. * * Returns: N/A @@ -4593,7 +5243,7 @@ * DumpLong - print a data area as long values * * Description: - * This function prints a area of data to the system logfile/to the + * This function prints a area of data to the system logfile/to the * console. * * Returns: N/A @@ -4647,9 +5297,8 @@ #endif -/* - * Local variables: - * compile-command: "make" - * End: - */ - +/******************************************************************************* + * + * End of file + * + ******************************************************************************/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skgehwt.c linux-2.4.23-pre8/drivers/net/sk98lin/skgehwt.c --- linux-2.4.22/drivers/net/sk98lin/skgehwt.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skgehwt.c 2003-10-22 22:49:33.000000000 +0000 @@ -1,17 +1,17 @@ /****************************************************************************** * * Name: skgehwt.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.13 $ - * Date: $Date: 1999/11/22 13:31:12 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.14 $ + * Date: $Date: 2003/05/13 18:01:58 $ * Purpose: Hardware Timer. * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998,1999 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -27,6 +27,9 @@ * History: * * $Log: skgehwt.c,v $ + * 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. * @@ -76,8 +79,10 @@ /* Event queue and dispatcher */ +#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) static const char SysKonnectFileId[] = - "$Header: /usr56/projects/ge/schedule/skgehwt.c,v 1.13 1999/11/22 13:31:12 cgoos Exp $" ; + "$Header: /usr56/projects/ge/schedule/skgehwt.c,v 1.14 2003/05/13 18:01:58 mkarl Exp $" ; +#endif #include "h/skdrv1st.h" /* Driver Specific Definitions */ #include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skgeinit.c linux-2.4.23-pre8/drivers/net/sk98lin/skgeinit.c --- linux-2.4.22/drivers/net/sk98lin/skgeinit.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skgeinit.c 2003-10-22 22:48:59.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skgeinit.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.82 $ - * Date: $Date: 2002/12/05 13:40:21 $ - * Purpose: Contains functions to initialize the GE HW + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.93 $ + * Date: $Date: 2003/05/28 15:44:43 $ + * Purpose: Contains functions to initialize the adapter * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,66 @@ * History: * * $Log: skgeinit.c,v $ + * 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 @@ -383,8 +444,10 @@ /* local variables ************************************************************/ +#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) static const char SysKonnectFileId[] = - "@(#)$Id: skgeinit.c,v 1.82 2002/12/05 13:40:21 rschmidt Exp $ (C) SK "; + "@(#) $Id: skgeinit.c,v 1.93 2003/05/28 15:44:43 rschmidt Exp $ (C) Marvell."; +#endif struct s_QOffTab { int RxQOff; /* Receive Queue Address Offset */ @@ -395,14 +458,27 @@ {Q_R1, Q_XS1, Q_XA1}, {Q_R2, Q_XS2, Q_XA2} }; +struct s_Config { + char ScanString[8]; + SK_U32 Value; +}; + +static struct s_Config OemConfig = { + {'O','E','M','_','C','o','n','f'}, +#ifdef SK_OEM_CONFIG + OEM_CONFIG_VALUE, +#else + 0, +#endif +}; /****************************************************************************** * * SkGePollRxD() - Enable / Disable Descriptor Polling of RxD Ring * * Description: - * Enable or disable the descriptor polling the receive descriptor - * ring (RxD) of port 'Port'. + * Enable or disable the descriptor polling of the receive descriptor + * ring (RxD) for port 'Port'. * The new configuration is *not* saved over any SkGeStopPort() and * SkGeInitPort() calls. * @@ -429,8 +505,8 @@ * SkGePollTxD() - Enable / Disable Descriptor Polling of TxD Rings * * Description: - * Enable or disable the descriptor polling the transmit descriptor - * ring(s) (TxD) of port 'Port'. + * Enable or disable the descriptor polling of the transmit descriptor + * ring(s) (TxD) for port 'Port'. * The new configuration is *not* saved over any SkGeStopPort() and * SkGeInitPort() calls. * @@ -448,7 +524,7 @@ pPrt = &pAC->GIni.GP[Port]; - DWord = (PollTxD) ? CSR_ENA_POL : CSR_DIS_POL; + DWord = (SK_U32)(PollTxD ? CSR_ENA_POL : CSR_DIS_POL); if (pPrt->PXSQSize != 0) { SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), DWord); @@ -489,6 +565,7 @@ } /* SkGeYellowLED */ +#if (!defined(SK_SLIM) || defined(GENESIS)) /****************************************************************************** * * SkGeXmitLED() - Modify the Operational Mode of a transmission LED. @@ -544,6 +621,7 @@ * (In this case it has to be added here. But we will see. XXX) */ } /* SkGeXmitLED */ +#endif /* !SK_SLIM || GENESIS */ /****************************************************************************** @@ -564,12 +642,12 @@ * 1: configuration error */ static int DoCalcAddr( -SK_AC *pAC, /* adapter context */ -SK_GEPORT *pPrt, /* port index */ -int QuSize, /* size of the queue to configure in kB */ -SK_U32 *StartVal, /* start value for address calculation */ -SK_U32 *QuStartAddr, /* start addr to calculate */ -SK_U32 *QuEndAddr) /* end address to calculate */ +SK_AC *pAC, /* adapter context */ +SK_GEPORT SK_FAR *pPrt, /* port index */ +int QuSize, /* size of the queue to configure in kB */ +SK_U32 SK_FAR *StartVal, /* start value for address calculation */ +SK_U32 SK_FAR *QuStartAddr,/* start addr to calculate */ +SK_U32 SK_FAR *QuEndAddr) /* end address to calculate */ { SK_U32 EndVal; SK_U32 NextStart; @@ -644,7 +722,6 @@ return(2); } - if (DualNet) { /* every port gets the same amount of memory */ ActivePortKilobytes = pAC->GIni.GIRamSize / pAC->GIni.GIMacsFound; @@ -746,14 +823,19 @@ int Port) /* port index */ { SK_GEPORT *pPrt; - int UsedMem; /* total memory used (max. found ports) */ int i; int Rtv; int Rtv2; SK_U32 StartAddr; +#ifndef SK_SLIM + int UsedMem; /* total memory used (max. found ports) */ +#endif - UsedMem = 0; Rtv = 0; + +#ifndef SK_SLIM + + UsedMem = 0; for (i = 0; i < pAC->GIni.GIMacsFound; i++) { pPrt = &pAC->GIni.GP[i]; @@ -789,6 +871,7 @@ SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG); return(1); } +#endif /* !SK_SLIM */ /* Now start address calculation */ StartAddr = pAC->GIni.GIRamOffs; @@ -820,6 +903,7 @@ } /* SkGeCheckQSize */ +#ifdef GENESIS /****************************************************************************** * * SkGeInitMacArb() - Initialize the MAC Arbiter @@ -854,7 +938,7 @@ /* Fast Output Enable Mode was intended to use with Rev. B2, but now? */ /* - * There is not start or enable button to push, therefore + * There is no start or enable button to push, therefore * the MAC arbiter is configured and enabled now. */ } /* SkGeInitMacArb */ @@ -899,6 +983,7 @@ } } } /* SkGeInitPktArb */ +#endif /* GENESIS */ /****************************************************************************** @@ -916,6 +1001,7 @@ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ { + SK_U16 Word; #ifdef VCPU SK_U32 DWord; #endif /* VCPU */ @@ -927,6 +1013,9 @@ * - enable the FIFO */ + Word = (SK_U16)GMF_RX_CTRL_DEF; + +#ifdef GENESIS if (pAC->GIni.GIGenesis) { /* Configure Rx MAC FIFO */ SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_CLR); @@ -943,20 +1032,29 @@ SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_ENA_FLUSH); } } - else { - /* Configure Rx MAC FIFO */ - SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR); - SK_OUT32(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), GMF_RX_CTRL_DEF | - GMF_RX_F_FL_ON); /* enable Rx GMAC FIFO Flush */ +#endif /* GENESIS */ +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* set Rx GMAC FIFO Flush Mask */ SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), (SK_U16)RX_FF_FL_DEF_MSK); - /* use Rx GMAC FIFO Flush Threshold default value (0x0a == 56 bytes) */ + /* disable Rx GMAC FIFO Flush for YUKON-Lite Rev. A0 only */ + if (pAC->GIni.GIYukonLite && pAC->GIni.GIChipId == CHIP_ID_YUKON) { + + Word &= ~GMF_RX_F_FL_ON; + } + + /* Configure Rx MAC FIFO */ + SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR); + SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), Word); + + /* set Rx GMAC FIFO Flush Threshold (default: 0x0a -> 56 bytes) */ + SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), RX_GMF_FL_THR_DEF); /* Configure Tx MAC FIFO */ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR); - SK_OUT32(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), GMF_TX_CTRL_DEF); + SK_OUT16(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U16)GMF_TX_CTRL_DEF); #ifdef VCPU SK_IN32(IoC, MR_ADDR(Port, RX_GMF_AF_THR), &DWord); @@ -966,9 +1064,11 @@ /* set Tx GMAC FIFO Almost Empty Threshold */ /* SK_OUT32(IoC, MR_ADDR(Port, TX_GMF_AE_THR), 0); */ } -} /* SkGeInitMacFifo */ +#endif /* YUKON */ +} /* SkGeInitMacFifo */ +#ifdef SK_LNK_SYNC_CNT /****************************************************************************** * * SkGeLoadLnkSyncCnt() - Load the Link Sync Counter and starts counting @@ -1041,8 +1141,9 @@ SK_OUT32(IoC, B0_IMSK, OrgIMsk); } } /* SkGeLoadLnkSyncCnt*/ +#endif /* SK_LNK_SYNC_CNT */ - +#if defined(SK_DIAG) || defined(SK_CFG_SYNC) /****************************************************************************** * * SkGeCfgSync() - Configure synchronous bandwidth for this port. @@ -1131,6 +1232,7 @@ return(0); } /* SkGeCfgSync */ +#endif /* SK_DIAG || SK_CFG_SYNC*/ /****************************************************************************** @@ -1196,7 +1298,7 @@ * we NEED Store & Forward of the RAM buffer. */ if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK || - !pAC->GIni.GIGenesis) { + pAC->GIni.GIYukon) { /* enable Store & Forward Mode for the Tx Side */ SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_ENA_STFWD); } @@ -1401,7 +1503,7 @@ * Example: * 1) A Link Down event was signaled for a port. Therefore the activity * of this port should be stopped and a hardware reset should be issued - * to enable the workaround of XMAC errata #2. But the received frames + * to enable the workaround of XMAC Errata #2. But the received frames * should not be discarded. * ... * SkGeStopPort(pAC, IoC, Port, SK_STOP_TX, SK_HARD_RST); @@ -1468,8 +1570,8 @@ SK_U32 DWord; SK_U32 XsCsr; SK_U32 XaCsr; - int i; SK_U64 ToutStart; + int i; int ToutCnt; pPrt = &pAC->GIni.GP[Port]; @@ -1493,8 +1595,8 @@ * Clear packet arbiter timeout to make sure * this loop will terminate. */ - SK_OUT16(IoC, B3_PA_CTRL, (Port == MAC_1) ? PA_CLR_TO_TX1 : - PA_CLR_TO_TX2); + SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ? + PA_CLR_TO_TX1 : PA_CLR_TO_TX2)); /* * If the transfer stucks at the MAC the STOP command will not @@ -1574,6 +1676,7 @@ SK_OUT8(IoC, RB_ADDR(pPrt->PXsQOff, RB_CTRL), RB_RST_SET); /* Reset Tx MAC FIFO */ +#ifdef GENESIS if (pAC->GIni.GIGenesis) { /* Note: MFF_RST_SET does NOT reset the XMAC ! */ SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_RST_SET); @@ -1582,10 +1685,14 @@ /* Link LED is switched off by the RLMT and the Diag itself */ SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_DIS); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* Reset TX MAC FIFO */ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_SET); } +#endif /* YUKON */ } if ((Dir & SK_STOP_RX) != 0) { @@ -1604,9 +1711,9 @@ * Clear packet arbiter timeout to make sure * this loop will terminate */ - SK_OUT16(IoC, B3_PA_CTRL, (Port == MAC_1) ? PA_CLR_TO_RX1 : - PA_CLR_TO_RX2); - + SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ? + PA_CLR_TO_RX1 : PA_CLR_TO_RX2)); + DWord = TestStopBit(pAC, IoC, pPrt->PRxQOff); /* timeout if i==0 (bug fix for #10748) */ @@ -1632,6 +1739,7 @@ SK_OUT8(IoC, RB_ADDR(pPrt->PRxQOff, RB_CTRL), RB_RST_SET); /* Reset Rx MAC FIFO */ +#ifdef GENESIS if (pAC->GIni.GIGenesis) { SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_SET); @@ -1639,10 +1747,14 @@ /* switch Rx LED off, stop the LED counter */ SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_DIS); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* Reset Rx MAC FIFO */ SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_SET); } +#endif /* YUKON */ } } /* SkGeStopPort */ @@ -1679,27 +1791,29 @@ pPrt->PPrevRx = 0; pPrt->PPrevFcs = 0; pPrt->PRxLim = SK_DEF_RX_WA_LIM; - pPrt->PLinkMode = SK_LMODE_AUTOFULL; - pPrt->PLinkSpeedCap = SK_LSPEED_CAP_1000MBPS; - pPrt->PLinkSpeed = SK_LSPEED_1000MBPS; - pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_UNKNOWN; - pPrt->PLinkModeConf = SK_LMODE_AUTOSENSE; - pPrt->PFlowCtrlMode = SK_FLOW_MODE_SYM_OR_REM; - pPrt->PLinkBroken = SK_TRUE; /* See WA code */ - pPrt->PLinkCap = (SK_LMODE_CAP_HALF | SK_LMODE_CAP_FULL | - SK_LMODE_CAP_AUTOHALF | SK_LMODE_CAP_AUTOFULL); - pPrt->PLinkModeStatus = SK_LMODE_STAT_UNKNOWN; - pPrt->PFlowCtrlCap = SK_FLOW_MODE_SYM_OR_REM; - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE; + pPrt->PLinkMode = (SK_U8)SK_LMODE_AUTOFULL; + pPrt->PLinkSpeedCap = (SK_U8)SK_LSPEED_CAP_1000MBPS; + pPrt->PLinkSpeed = (SK_U8)SK_LSPEED_1000MBPS; + pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_UNKNOWN; + pPrt->PLinkModeConf = (SK_U8)SK_LMODE_AUTOSENSE; + pPrt->PFlowCtrlMode = (SK_U8)SK_FLOW_MODE_SYM_OR_REM; + pPrt->PLinkCap = (SK_U8)(SK_LMODE_CAP_HALF | SK_LMODE_CAP_FULL | + SK_LMODE_CAP_AUTOHALF | SK_LMODE_CAP_AUTOFULL); + pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN; + pPrt->PFlowCtrlCap = (SK_U8)SK_FLOW_MODE_SYM_OR_REM; + pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE; pPrt->PMSCap = 0; - pPrt->PMSMode = SK_MS_MODE_AUTO; - pPrt->PMSStatus = SK_MS_STAT_UNSET; + pPrt->PMSMode = (SK_U8)SK_MS_MODE_AUTO; + pPrt->PMSStatus = (SK_U8)SK_MS_STAT_UNSET; + pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_UNKNOWN; pPrt->PAutoNegFail = SK_FALSE; - pPrt->PLipaAutoNeg = SK_LIPA_UNKNOWN; pPrt->PHWLinkUp = SK_FALSE; + pPrt->PLinkBroken = SK_TRUE; /* See WA code */ } pAC->GIni.GIPortUsage = SK_RED_LINK; + pAC->GIni.GILedBlinkCtrl = (SK_U16)OemConfig.Value; + pAC->GIni.GIValIrqMask = IS_ALL_MSK; } /* SkGeInit0*/ @@ -1766,8 +1880,8 @@ SkPciReadCfgDWord(pAC, PCI_BASE_2ND, &Bp2); SkPciReadCfgByte(pAC, PCI_LAT_TIM, &Lat); - if (PciCmd != 0 || Cls != 0 || (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1 || - Lat != 0) { + if (PciCmd != 0 || Cls != (SK_U8)0 || Lat != (SK_U8)0 || + (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1) { return(1); } @@ -1779,7 +1893,7 @@ return(0); } /* SkGePciReset */ -#endif /* SK_PCI_RESET */ +#endif /* SK_PCI_RESET */ /****************************************************************************** * @@ -1808,22 +1922,27 @@ { SK_U8 Byte; SK_U16 Word; + SK_U16 CtrlStat; + SK_U32 DWord; int RetVal; int i; RetVal = 0; + /* save CLK_RUN bits (YUKON-Lite) */ + SK_IN16(IoC, B0_CTST, &CtrlStat); + #ifdef SK_PCI_RESET (void)SkGePciReset(pAC, IoC); -#endif /* SK_PCI_RESET */ +#endif /* SK_PCI_RESET */ - /* Do the SW-reset */ + /* do the SW-reset */ SK_OUT8(IoC, B0_CTST, CS_RST_SET); - /* Release the SW-reset */ + /* release the SW-reset */ SK_OUT8(IoC, B0_CTST, CS_RST_CLR); - /* Reset all error bits in the PCI STATUS register */ + /* reset all error bits in the PCI STATUS register */ /* * Note: PCI Cfg cycles cannot be used, because they are not * available on some platforms after 'boot time'. @@ -1831,31 +1950,47 @@ SK_IN16(IoC, PCI_C(PCI_STATUS), &Word); SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); - SK_OUT16(IoC, PCI_C(PCI_STATUS), Word | PCI_ERRBITS); + SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS)); SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); - /* Release Master Reset */ + /* release Master Reset */ SK_OUT8(IoC, B0_CTST, CS_MRST_CLR); - /* Read Chip Identification Number */ +#ifdef CLK_RUN + CtrlStat |= CS_CLK_RUN_ENA; +#endif /* CLK_RUN */ + + /* restore CLK_RUN bits */ + SK_OUT16(IoC, B0_CTST, (SK_U16)(CtrlStat & + (CS_CLK_RUN_HOT | CS_CLK_RUN_RST | CS_CLK_RUN_ENA))); + + /* read Chip Identification Number */ SK_IN8(IoC, B2_CHIP_ID, &Byte); pAC->GIni.GIChipId = Byte; - /* Read number of MACs */ + /* read number of MACs */ SK_IN8(IoC, B2_MAC_CFG, &Byte); pAC->GIni.GIMacsFound = (Byte & CFG_SNG_MAC) ? 1 : 2; - /* Get Chip Revision Number */ + /* get Chip Revision Number */ pAC->GIni.GIChipRev = (SK_U8)((Byte & CFG_CHIP_R_MSK) >> 4); - /* Read the adapters external SRAM size */ + /* get diff. PCI parameters */ + SK_IN16(IoC, B0_CTST, &CtrlStat); + + /* read the adapters RAM size */ SK_IN8(IoC, B2_E_0, &Byte); + pAC->GIni.GIGenesis = SK_FALSE; + pAC->GIni.GIYukon = SK_FALSE; + pAC->GIni.GIYukonLite = SK_FALSE; + +#ifdef GENESIS if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) { pAC->GIni.GIGenesis = SK_TRUE; - if (Byte == 3) { + if (Byte == (SK_U8)3) { /* special case: 4 x 64k x 36, offset = 0x80000 */ pAC->GIni.GIRamSize = 1024; pAC->GIni.GIRamOffs = (SK_U32)512 * 1024; @@ -1864,19 +1999,72 @@ pAC->GIni.GIRamSize = (int)Byte * 512; pAC->GIni.GIRamOffs = 0; } + /* all GE adapters work with 53.125 MHz host clock */ + pAC->GIni.GIHstClkFact = SK_FACT_53; + + /* set Descr. Poll Timer Init Value to 250 ms */ + pAC->GIni.GIPollTimerVal = + SK_DPOLL_DEF * (SK_U32)pAC->GIni.GIHstClkFact / 100; } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) { + + pAC->GIni.GIYukon = SK_TRUE; + + pAC->GIni.GIRamSize = (Byte == (SK_U8)0) ? 128 : (int)Byte * 4; - pAC->GIni.GIGenesis = SK_FALSE; - -#ifndef VCPU - pAC->GIni.GIRamSize = (Byte == 0) ? 128 : (int)Byte * 4; -#else - pAC->GIni.GIRamSize = 128; -#endif pAC->GIni.GIRamOffs = 0; - pAC->GIni.GIWolOffs = (pAC->GIni.GIChipRev == 0) ? WOL_REG_OFFS : 0; + /* WA for chip Rev. A */ + pAC->GIni.GIWolOffs = (pAC->GIni.GIChipId == CHIP_ID_YUKON && + pAC->GIni.GIChipRev == 0) ? WOL_REG_OFFS : 0; + + /* get PM Capabilities of PCI config space */ + SK_IN16(IoC, PCI_C(PCI_PM_CAP_REG), &Word); + + /* check if VAUX is available */ + if (((CtrlStat & CS_VAUX_AVAIL) != 0) && + /* check also if PME from D3cold is set */ + ((Word & PCI_PME_D3C_SUP) != 0)) { + /* set entry in GE init struct */ + pAC->GIni.GIVauxAvail = SK_TRUE; + } + + if (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) { + /* this is Rev. A1 */ + pAC->GIni.GIYukonLite = SK_TRUE; + } + else { + /* save Flash-Address Register */ + SK_IN32(IoC, B2_FAR, &DWord); + + /* test Flash-Address Register */ + SK_OUT8(IoC, B2_FAR + 3, 0xff); + SK_IN8(IoC, B2_FAR + 3, &Byte); + + if (Byte != 0) { + /* this is Rev. A0 */ + pAC->GIni.GIYukonLite = SK_TRUE; + + /* restore Flash-Address Register */ + SK_OUT32(IoC, B2_FAR, DWord); + } + } + + /* read the Interrupt source */ + SK_IN32(IoC, B0_ISRC, &DWord); + + if ((DWord & IS_HW_ERR) != 0) { + /* read the HW Error Interrupt source */ + SK_IN32(IoC, B0_HWE_ISRC, &DWord); + + if ((DWord & IS_IRQ_SENSOR) != 0) { + /* disable HW Error IRQ */ + pAC->GIni.GIValIrqMask &= ~IS_HW_ERR; + } + } for (i = 0; i < pAC->GIni.GIMacsFound; i++) { /* set GMAC Link Control reset */ @@ -1885,90 +2073,100 @@ /* clear GMAC Link Control reset */ SK_OUT16(IoC, MR_ADDR(i, GMAC_LINK_CTRL), GMLC_RST_CLR); } + /* all YU chips work with 78.125 MHz host clock */ + pAC->GIni.GIHstClkFact = SK_FACT_78; + + pAC->GIni.GIPollTimerVal = SK_DPOLL_MAX; /* 215 ms */ } +#endif /* YUKON */ - /* get diff. PCI parameters */ - SK_IN16(IoC, B0_CTST, &Word); - - /* Check if 64-bit PCI Slot is present */ - pAC->GIni.GIPciSlot64 = (SK_BOOL)((Word & CS_BUS_SLOT_SZ) != 0); + /* check if 64-bit PCI Slot is present */ + pAC->GIni.GIPciSlot64 = (SK_BOOL)((CtrlStat & CS_BUS_SLOT_SZ) != 0); - /* Check if 66 MHz PCI Clock is active */ - pAC->GIni.GIPciClock66 = (SK_BOOL)((Word & CS_BUS_CLOCK) != 0); - - /* Check if VAUX is available */ - pAC->GIni.GIVauxAvail = (SK_BOOL)((Word & CS_VAUX_AVAIL) != 0); + /* check if 66 MHz PCI Clock is active */ + pAC->GIni.GIPciClock66 = (SK_BOOL)((CtrlStat & CS_BUS_CLOCK) != 0); - /* Read PCI HW Revision Id. */ + /* read PCI HW Revision Id. */ SK_IN8(IoC, PCI_C(PCI_REV_ID), &Byte); pAC->GIni.GIPciHwRev = Byte; - /* All known GE Adapters work with 53.125 MHz host clock */ - pAC->GIni.GIHstClkFact = SK_FACT_53; - pAC->GIni.GIPollTimerVal = - SK_DPOLL_DEF * (SK_U32)pAC->GIni.GIHstClkFact / 100; - - /* Read the PMD type */ + /* read the PMD type */ SK_IN8(IoC, B2_PMD_TYP, &Byte); pAC->GIni.GICopperType = (SK_U8)(Byte == 'T'); - /* Read the PHY type */ + /* read the PHY type */ SK_IN8(IoC, B2_E_1, &Byte); -#ifdef VCPU - if (!pAC->GIni.GIGenesis) { - pAC->GIni.GICopperType = SK_TRUE; - Byte = SK_PHY_MARV_COPPER; /* this field is not initialized */ - } -#endif - Byte &= 0x0f; /* the PHY type is stored in the lower nibble */ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { - pAC->GIni.GP[i].PhyType = Byte; - switch (Byte) { - case SK_PHY_XMAC: - pAC->GIni.GP[i].PhyAddr = PHY_ADDR_XMAC; - break; - case SK_PHY_BCOM: - pAC->GIni.GP[i].PhyAddr = PHY_ADDR_BCOM; - pAC->GIni.GP[i].PMSCap = - SK_MS_CAP_AUTO | SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE; - break; - case SK_PHY_MARV_COPPER: + +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + switch (Byte) { + case SK_PHY_XMAC: + pAC->GIni.GP[i].PhyAddr = PHY_ADDR_XMAC; + break; + case SK_PHY_BCOM: + pAC->GIni.GP[i].PhyAddr = PHY_ADDR_BCOM; + pAC->GIni.GP[i].PMSCap = (SK_U8)(SK_MS_CAP_AUTO | + SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE); + break; +#ifdef OTHER_PHY + case SK_PHY_LONE: + pAC->GIni.GP[i].PhyAddr = PHY_ADDR_LONE; + break; + case SK_PHY_NAT: + pAC->GIni.GP[i].PhyAddr = PHY_ADDR_NAT; + break; +#endif /* OTHER_PHY */ + default: + /* ERROR: unexpected PHY type detected */ + RetVal = 5; + break; + } + } +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + + if (Byte < (SK_U8)SK_PHY_MARV_COPPER) { + /* if this field is not initialized */ + Byte = (SK_U8)SK_PHY_MARV_COPPER; + + pAC->GIni.GICopperType = SK_TRUE; + } + pAC->GIni.GP[i].PhyAddr = PHY_ADDR_MARV; + if (pAC->GIni.GICopperType) { - pAC->GIni.GP[i].PLinkSpeedCap = SK_LSPEED_CAP_AUTO | + + pAC->GIni.GP[i].PLinkSpeedCap = (SK_U8)(SK_LSPEED_CAP_AUTO | SK_LSPEED_CAP_10MBPS | SK_LSPEED_CAP_100MBPS | - SK_LSPEED_CAP_1000MBPS; - pAC->GIni.GP[i].PLinkSpeed = SK_LSPEED_AUTO; - pAC->GIni.GP[i].PMSCap = - SK_MS_CAP_AUTO | SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE; + SK_LSPEED_CAP_1000MBPS); + + pAC->GIni.GP[i].PLinkSpeed = (SK_U8)SK_LSPEED_AUTO; + + pAC->GIni.GP[i].PMSCap = (SK_U8)(SK_MS_CAP_AUTO | + SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE); } else { - pAC->GIni.GP[i].PhyType = SK_PHY_MARV_FIBER; + Byte = (SK_U8)SK_PHY_MARV_FIBER; } - break; -#ifdef OTHER_PHY - case SK_PHY_LONE: - pAC->GIni.GP[i].PhyAddr = PHY_ADDR_LONE; - break; - case SK_PHY_NAT: - pAC->GIni.GP[i].PhyAddr = PHY_ADDR_NAT; - break; -#endif /* OTHER_PHY */ - default: - /* ERROR: unexpected PHY type detected */ - RetVal = 5; - break; } +#endif /* YUKON */ + + pAC->GIni.GP[i].PhyType = (int)Byte; SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT, - ("PHY type: %d PHY addr: %04x\n", pAC->GIni.GP[i].PhyType, + ("PHY type: %d PHY addr: %04x\n", Byte, pAC->GIni.GP[i].PhyAddr)); } - /* Get Mac Type & set function pointers dependent on */ + /* get MAC Type & set function pointers dependent on */ +#ifdef GENESIS if (pAC->GIni.GIGenesis) { + pAC->GIni.GIMacType = SK_MAC_XMAC; pAC->GIni.GIFunc.pFnMacUpdateStats = SkXmUpdateStats; @@ -1976,24 +2174,30 @@ pAC->GIni.GIFunc.pFnMacResetCounter = SkXmResetCounter; pAC->GIni.GIFunc.pFnMacOverflow = SkXmOverflowStatus; } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + pAC->GIni.GIMacType = SK_MAC_GMAC; pAC->GIni.GIFunc.pFnMacUpdateStats = SkGmUpdateStats; pAC->GIni.GIFunc.pFnMacStatistic = SkGmMacStatistic; pAC->GIni.GIFunc.pFnMacResetCounter = SkGmResetCounter; pAC->GIni.GIFunc.pFnMacOverflow = SkGmOverflowStatus; - -#ifndef VCPU + +#ifdef SPECIAL_HANDLING if (pAC->GIni.GIChipId == CHIP_ID_YUKON) { /* check HW self test result */ SK_IN8(IoC, B2_E_3, &Byte); - if ((Byte & B2_E3_RES_MASK) != 0) { + if (Byte & B2_E3_RES_MASK) { RetVal = 6; } } #endif } +#endif /* YUKON */ + return(RetVal); } /* SkGeInit1 */ @@ -2017,7 +2221,9 @@ SK_AC *pAC, /* adapter context */ SK_IOC IoC) /* IO context */ { +#ifdef GENESIS SK_U32 DWord; +#endif /* GENESIS */ int i; /* start the Descriptor Poll Timer */ @@ -2031,6 +2237,7 @@ SK_OUT8(IoC, B28_DPT_CTRL, DPT_START); } +#ifdef GENESIS if (pAC->GIni.GIGenesis) { /* start the Blink Source Counter */ DWord = SK_BLK_DUR * (SK_U32)pAC->GIni.GIHstClkFact / 100; @@ -2046,10 +2253,14 @@ SkGeInitPktArb(pAC, IoC); } - else { - /* Start Time Stamp Timer */ +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + /* start Time Stamp Timer */ SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8)GMT_ST_START); } +#endif /* YUKON */ /* enable the Tx Arbiters */ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { @@ -2121,17 +2332,17 @@ break; } - /* Check if the adapter seems to be accessible */ - SK_OUT32(IoC, B2_IRQM_INI, 0x11335577L); + /* check if the adapter seems to be accessible */ + SK_OUT32(IoC, B2_IRQM_INI, SK_TEST_VAL); SK_IN32(IoC, B2_IRQM_INI, &DWord); SK_OUT32(IoC, B2_IRQM_INI, 0L); - if (DWord != 0x11335577L) { + if (DWord != SK_TEST_VAL) { RetVal = 2; break; } - /* Check if the number of GIMacsFound matches SK_MAX_MACS */ + /* check if the number of GIMacsFound matches SK_MAX_MACS */ if (pAC->GIni.GIMacsFound > SK_MAX_MACS) { RetVal = 1; break; @@ -2168,7 +2379,7 @@ /****************************************************************************** * - * SkGeDeInit() - Deinitialize the adapter. + * SkGeDeInit() - Deinitialize the adapter * * Description: * All ports of the adapter will be stopped if not already done. @@ -2184,12 +2395,12 @@ int i; SK_U16 Word; -#ifndef VCPU - /* Ensure I2C is ready */ +#if (!defined(SK_SLIM) && !defined(VCPU)) + /* ensure I2C is ready */ SkI2cWaitIrq(pAC, IoC); -#endif +#endif - /* Stop all current transfer activity */ + /* stop all current transfer activity */ for (i = 0; i < pAC->GIni.GIMacsFound; i++) { if (pAC->GIni.GP[i].PState != SK_PRT_STOP && pAC->GIni.GP[i].PState != SK_PRT_RESET) { @@ -2206,11 +2417,13 @@ SK_IN16(IoC, PCI_C(PCI_STATUS), &Word); SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); - SK_OUT16(IoC, PCI_C(PCI_STATUS), Word | PCI_ERRBITS); + SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS)); SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); - /* Do the reset, all LEDs are switched off now */ + /* do the reset, all LEDs are switched off now */ SK_OUT8(IoC, B0_CTST, CS_RST_SET); + + pAC->GIni.GILevel = SK_INIT_DATA; } /* SkGeDeInit */ @@ -2261,10 +2474,11 @@ return(2); } - /* Configuration ok, initialize the Port now */ + /* configuration ok, initialize the Port now */ +#ifdef GENESIS if (pAC->GIni.GIGenesis) { - /* Initialize Rx, Tx and Link LED */ + /* initialize Rx, Tx and Link LED */ /* * If 1000BT Phy needs LED initialization than swap * LED and XMAC initialization order @@ -2275,12 +2489,16 @@ SkXmInitMac(pAC, IoC, Port); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { SkGmInitMac(pAC, IoC, Port); } +#endif /* YUKON */ - /* Do NOT initialize the Link Sync Counter */ + /* do NOT initialize the Link Sync Counter */ SkGeInitMacFifo(pAC, IoC, Port); @@ -2293,7 +2511,7 @@ SkGeInitBmu(pAC, IoC, Port); - /* Mark port as initialized */ + /* mark port as initialized */ pPrt->PState = SK_PRT_INIT; return(0); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skgemib.c linux-2.4.23-pre8/drivers/net/sk98lin/skgemib.c --- linux-2.4.22/drivers/net/sk98lin/skgemib.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skgemib.c 2003-10-22 22:48:29.000000000 +0000 @@ -2,15 +2,16 @@ * * Name: skgemib.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.7 $ - * Date: $Date: 2002/12/16 09:04:34 $ + * Version: $Revision: 1.9 $ + * Date: $Date: 2003/05/23 12:55:20 $ * Purpose: Private Network Management Interface Management Database * ****************************************************************************/ /****************************************************************************** * - * (C)Copyright 2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,12 @@ * History: * * $Log: skgemib.c,v $ + * 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. * @@ -100,8 +107,13 @@ PNMI_STATIC int PowerManagement(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id, char *pBuf, unsigned int *pLen, SK_U32 Instance, unsigned int TableIndex, SK_U32 NetIndex); -#endif +#endif /* SK_POWER_MGMT */ +#ifdef SK_DIAG_SUPPORT +PNMI_STATIC int DiagActions(SK_AC *pAC, SK_IOC IoC, int action, SK_U32 Id, + char *pBuf, unsigned int *pLen, SK_U32 Instance, + unsigned int TableIndex, SK_U32 NetIndex); +#endif /* SK_DIAG_SUPPORT */ /* defines *******************************************************************/ @@ -267,6 +279,13 @@ 0, SK_PNMI_RW, PowerManagement, 0}, #endif /* SK_POWER_MGMT */ +#ifdef SK_DIAG_SUPPORT + {OID_SKGE_DIAG_MODE, + 0, + 0, + 0, + SK_PNMI_RW, DiagActions, 0}, +#endif /* SK_DIAG_SUPPORT */ {OID_SKGE_MDB_VERSION, 1, 0, @@ -1052,5 +1071,10 @@ 0, 0, SK_PNMI_RO, Vct, 0}, + {OID_SKGE_BOARDLEVEL, + 0, + 0, + 0, + SK_PNMI_RO, General, 0}, }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skgepnmi.c linux-2.4.23-pre8/drivers/net/sk98lin/skgepnmi.c --- linux-2.4.22/drivers/net/sk98lin/skgepnmi.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skgepnmi.c 2003-10-22 22:49:13.000000000 +0000 @@ -2,8 +2,8 @@ * * Name: skgepnmi.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.102 $ - * Date: $Date: 2002/12/16 14:03:24 $ + * Version: $Revision: 1.109 $ + * Date: $Date: 2003/07/17 14:15:24 $ * Purpose: Private Network Management Interface * ****************************************************************************/ @@ -11,6 +11,7 @@ /****************************************************************************** * * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,42 @@ * History: * * $Log: skgepnmi.c,v $ + * 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. * @@ -84,7 +121,7 @@ * - Extended SIRQ event handler for both mac types. * - Fixed rx short counter bug (#10620) * - Added handler for oids SKGE_SPEED_MODE & SKGE_SPEED_STATUS. - * - Extendet GetPhysStatVal() for GMAC. + * - Extended GetPhysStatVal() for GMAC. * - Editorial changes. * * Revision 1.90 2002/05/22 08:56:25 rwahl @@ -172,7 +209,7 @@ * 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). + * - 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. @@ -432,9 +469,10 @@ ****************************************************************************/ +#ifndef _lint static const char SysKonnectFileId[] = - "@(#) $Id: skgepnmi.c,v 1.102 2002/12/16 14:03:24 tschilli Exp $" - " (C) SysKonnect."; + "@(#) $Id: skgepnmi.c,v 1.109 2003/07/17 14:15:24 tschilli Exp $ (C) Marvell."; +#endif /* !_lint */ #include "h/skdrv1st.h" #include "h/sktypes.h" @@ -472,11 +510,13 @@ unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, unsigned int *pLen, SK_U32 NetIndex); -int SkPnmiPreSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, +int SkPnmiPreSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, unsigned int *pLen, SK_U32 NetIndex); -int SkPnmiSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, +int SkPnmiSetStruct(SK_AC *pAC, SK_IOC IoC, void *pBuf, unsigned int *pLen, SK_U32 NetIndex); int SkPnmiEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Param); +int SkPnmiGenIoctl(SK_AC *pAC, SK_IOC IoC, void * pBuf, + unsigned int * pLen, SK_U32 NetIndex); /* @@ -530,7 +570,7 @@ /* * Overflow status register bit table and corresponding counter * dependent on MAC type - the number relates to the size of overflow - * mask returned by the pFnMacOverflow function + * mask returned by the pFnMacOverflow function */ PNMI_STATIC const SK_U16 StatOvrflwBit[][SK_PNMI_MAC_TYPES] = { /* Bit0 */ { SK_PNMI_HTX, SK_PNMI_HTX_UNICAST}, @@ -694,7 +734,7 @@ /* SK_PNMI_HRX_FRAMING */ {{XM_RXF_FRA_ERR, SK_TRUE}, {0, SK_FALSE}}, /* SK_PNMI_HRX_UNDERSIZE */ - {{0, SK_FALSE},{GM_RXF_SHT, SK_TRUE}}, + {{0, SK_FALSE}, {GM_RXF_SHT, SK_TRUE}}, /* SK_PNMI_HRX_OVERFLOW */ {{XM_RXE_FIFO_OV, SK_TRUE}, {GM_RXE_FIFO_OV, SK_TRUE}}, /* SK_PNMI_HRX_JABBER */ @@ -768,7 +808,6 @@ SK_U16 Val16; /* Multiple purpose 16 bit variable */ SK_U8 Val8; /* Mulitple purpose 8 bit variable */ SK_EVPARA EventParam; /* Event struct for timer event */ - SK_GEPORT *pPrt; SK_PNMI_VCT *pVctBackupData; @@ -797,7 +836,6 @@ ("CounterOffset struct size (%d) differs from" "SK_PNMI_MAX_IDX (%d)\n", SK_PNMI_CNT_NO, SK_PNMI_MAX_IDX)); - BRK; } if (SK_PNMI_MAX_IDX != @@ -808,10 +846,9 @@ SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_INIT | SK_DBGCAT_FATAL, ("StatAddr table size (%d) differs from " "SK_PNMI_MAX_IDX (%d)\n", - (sizeof(StatAddr) / + (sizeof(StatAddr) / (sizeof(SK_PNMI_STATADDR) * SK_PNMI_MAC_TYPES)), SK_PNMI_MAX_IDX)); - BRK; } #endif /* SK_PNMI_CHECK */ break; @@ -829,8 +866,7 @@ /* Initialize DSP variables for Vct() to 0xff => Never written! */ for (PortIndex = 0; PortIndex < PortMax; PortIndex ++) { - pPrt = &pAC->GIni.GP[PortIndex]; - pPrt->PCableLen =0xff; + pAC->GIni.GP[PortIndex].PCableLen = 0xff; pVctBackupData = &pAC->Pnmi.VctBackup[PortIndex]; pVctBackupData->PCableLen = 0xff; } @@ -958,14 +994,14 @@ default: pAC->Pnmi.Connector = 1; break; - } + } break; - + case SK_INIT_RUN: /* * Start timer for RLMT change counter */ - SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam)); + SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer, 28125000, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER, EventParam); @@ -994,17 +1030,17 @@ * the data. * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ int SkPnmiGetVar( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ SK_U32 Id, /* Object ID that is to be processed */ -void *pBuf, /* Buffer to which to mgmt data will be retrieved */ +void *pBuf, /* Buffer to which the management data will be copied */ unsigned int *pLen, /* On call: buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiGetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n", @@ -1022,8 +1058,8 @@ * Calls a general sub-function for all this stuff. The preset does * the same as a set, but returns just before finally setting the * new value. This is usefull to check if a set might be successfull. - * If as instance a -1 is passed, an array of values is supposed and - * all instance of the OID will be set. + * If the instance -1 is passed, an array of values is supposed and + * all instances of the OID will be set. * * Returns: * SK_PNMI_ERR_OK The request was successfully performed. @@ -1036,17 +1072,17 @@ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ int SkPnmiPreSetVar( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ SK_U32 Id, /* Object ID that is to be processed */ -void *pBuf, /* Buffer which stores the mgmt data to be set */ -unsigned int *pLen, /* Total length of mgmt data */ +void *pBuf, /* Buffer to which the management data will be copied */ +unsigned int *pLen, /* Total length of management data */ SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiPreSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n", @@ -1065,8 +1101,8 @@ * Calls a general sub-function for all this stuff. The preset does * the same as a set, but returns just before finally setting the * new value. This is usefull to check if a set might be successfull. - * If as instance a -1 is passed, an array of values is supposed and - * all instance of the OID will be set. + * If the instance -1 is passed, an array of values is supposed and + * all instances of the OID will be set. * * Returns: * SK_PNMI_ERR_OK The request was successfully performed. @@ -1079,17 +1115,17 @@ * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ int SkPnmiSetVar( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ SK_U32 Id, /* Object ID that is to be processed */ -void *pBuf, /* Buffer which stores the mgmt data to be set */ -unsigned int *pLen, /* Total length of mgmt data */ +void *pBuf, /* Buffer to which the management data will be copied */ +unsigned int *pLen, /* Total length of management data */ SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiSetVar: Called, Id=0x%x, BufLen=%d, Instance=%d, NetIndex=%d\n", @@ -1116,14 +1152,14 @@ * SK_PNMI_ERR_GENERAL A general severe internal error occured * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take * the data. - * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist + * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist */ int SkPnmiGetStruct( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -void *pBuf, /* Buffer which will store the retrieved data */ +void *pBuf, /* Buffer to which the management data will be copied. */ unsigned int *pLen, /* Length of buffer */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { int Ret; unsigned int TableIndex; @@ -1301,13 +1337,13 @@ SK_IOC IoC, /* IO context handle */ void *pBuf, /* Buffer which contains the data to be set */ unsigned int *pLen, /* Length of buffer */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiPreSetStruct: Called, BufLen=%d, NetIndex=%d\n", *pLen, NetIndex)); - return (PnmiStruct(pAC, IoC, SK_PNMI_PRESET, (char *)pBuf, + return (PnmiStruct(pAC, IoC, SK_PNMI_PRESET, (char *)pBuf, pLen, NetIndex)); } @@ -1339,13 +1375,13 @@ SK_IOC IoC, /* IO context handle */ void *pBuf, /* Buffer which contains the data to be set */ unsigned int *pLen, /* Length of buffer */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, ("PNMI: SkPnmiSetStruct: Called, BufLen=%d, NetIndex=%d\n", *pLen, NetIndex)); - return (PnmiStruct(pAC, IoC, SK_PNMI_SET, (char *)pBuf, + return (PnmiStruct(pAC, IoC, SK_PNMI_SET, (char *)pBuf, pLen, NetIndex)); } @@ -1392,9 +1428,9 @@ * is now an active port. PNMI will now * add the statistic data of this port to * the virtual port. - * SK_PNMI_EVT_RLMT_SET_NETS Notifies PNMI about the net mode. The first Parameter + * SK_PNMI_EVT_RLMT_SET_NETS Notifies PNMI about the net mode. The first parameter * contains the number of nets. 1 means single net, 2 means - * dual net. The second Parameter is -1 + * dual net. The second parameter is -1 * * Returns: * Always 0 @@ -1406,7 +1442,7 @@ SK_EVPARA Param) /* Event dependent parameter */ { unsigned int PhysPortIndex; - unsigned int MaxNetNumber; + unsigned int MaxNetNumber; int CounterIndex; int Ret; SK_U16 MacStatus; @@ -1436,7 +1472,7 @@ ("PNMI: SkPnmiEvent: Called, Event=0x%x, Param=0x%x\n", (unsigned int)Event, (unsigned int)Param.Para64)); } -#endif +#endif /* DEBUG */ SK_PNMI_CHECKFLAGS("SkPnmiEvent: On call"); MacType = pAC->GIni.GIMacType; @@ -1455,18 +1491,18 @@ PhysPortIndex)); return (0); } -#endif +#endif /* DEBUG */ OverflowStatus = 0; /* * Check which source caused an overflow interrupt. */ - if ((pAC->GIni.GIFunc.pFnMacOverflow( - pAC, IoC, PhysPortIndex, MacStatus, &OverflowStatus) != 0) || + if ((pAC->GIni.GIFunc.pFnMacOverflow(pAC, IoC, PhysPortIndex, + MacStatus, &OverflowStatus) != 0) || (OverflowStatus == 0)) { SK_PNMI_CHECKFLAGS("SkPnmiEvent: On return"); - return (0); + return (0); } /* @@ -1486,20 +1522,20 @@ case SK_PNMI_HTX_UTILUNDER: case SK_PNMI_HTX_UTILOVER: - XM_IN16(IoC, PhysPortIndex, XM_TX_CMD, - &Register); - Register |= XM_TX_SAM_LINE; - XM_OUT16(IoC, PhysPortIndex, XM_TX_CMD, - Register); + if (MacType == SK_MAC_XMAC) { + XM_IN16(IoC, PhysPortIndex, XM_TX_CMD, &Register); + Register |= XM_TX_SAM_LINE; + XM_OUT16(IoC, PhysPortIndex, XM_TX_CMD, Register); + } break; case SK_PNMI_HRX_UTILUNDER: case SK_PNMI_HRX_UTILOVER: - XM_IN16(IoC, PhysPortIndex, XM_RX_CMD, - &Register); - Register |= XM_RX_SAM_LINE; - XM_OUT16(IoC, PhysPortIndex, XM_RX_CMD, - Register); + if (MacType == SK_MAC_XMAC) { + XM_IN16(IoC, PhysPortIndex, XM_RX_CMD, &Register); + Register |= XM_RX_SAM_LINE; + XM_OUT16(IoC, PhysPortIndex, XM_RX_CMD, Register); + } break; case SK_PNMI_HTX_OCTETHIGH: @@ -1540,7 +1576,8 @@ (unsigned int)Param.Para64)); return (0); } -#endif +#endif /* DEBUG */ + /* * Store a trap message in the trap buffer and generate * an event for user space applications with the @@ -1556,11 +1593,12 @@ if ((unsigned int)Param.Para64 >= (unsigned int)pAC->I2c.MaxSens) { SK_DBG_MSG(pAC, SK_DBGMOD_PNMI, SK_DBGCAT_CTRL, - ("PNMI: ERR:SkPnmiEvent: SK_PNMI_EVT_SEN_WAR_UPP parameter wrong, SensorIndex=%d\n", + ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_SEN_WAR_UPP parameter wrong, SensorIndex=%d\n", (unsigned int)Param.Para64)); return (0); } -#endif +#endif /* DEBUG */ + /* * Store a trap message in the trap buffer and generate * an event for user space applications with the @@ -1580,7 +1618,8 @@ (unsigned int)Param.Para64)); return (0); } -#endif +#endif /* DEBUG */ + /* * Store a trap message in the trap buffer and generate * an event for user space applications with the @@ -1600,7 +1639,8 @@ (unsigned int)Param.Para64)); return (0); } -#endif +#endif /* DEBUG */ + /* * Store a trap message in the trap buffer and generate * an event for user space applications with the @@ -1620,7 +1660,7 @@ * Be careful in changing these values, on change check * - typedef of SK_PNMI_ESTIMATE (Size of EstValue * array one less than value number) - * - Timer initilization SkTimerStart() in SkPnmiInit + * - Timer initialization SkTimerStart() in SkPnmiInit * - Delta value below must be multiplicated with * power of 2 * @@ -1671,7 +1711,7 @@ (void)SK_DRIVER_SENDEVENT(pAC, IoC); } - SK_MEMSET((char *) &EventParam, 0, sizeof(EventParam)); + SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); SkTimerStart(pAC, IoC, &pAC->Pnmi.RlmtChangeEstimate.EstTimer, 28125000, SKGE_PNMI, SK_PNMI_EVT_CHG_EST_TIMER, EventParam); @@ -1693,20 +1733,21 @@ return (0); } -#endif +#endif /* DEBUG */ /* - * Set all counters and timestamps to zero + * Set all counters and timestamps to zero. + * The according NetIndex is required as a + * parameter of the event. */ - ResetCounter(pAC, IoC, NetIndex); /* the according NetIndex is required - as a Parameter of the Event */ + ResetCounter(pAC, IoC, NetIndex); break; case SK_PNMI_EVT_XMAC_RESET: /* * To grant continuous counter values store the current * XMAC statistic values to the entries 1..n of the - * CounterOffset array. XMAC Errata #2 + * CounterOffset array. XMAC Errata #2 */ #ifdef DEBUG if ((unsigned int)Param.Para64 >= SK_MAX_MACS) { @@ -1742,11 +1783,10 @@ continue; } - pAC->Pnmi.Port[PhysPortIndex]. - CounterOffset[CounterIndex] = GetPhysStatVal( - pAC, IoC, PhysPortIndex, CounterIndex); - pAC->Pnmi.Port[PhysPortIndex]. - CounterHigh[CounterIndex] = 0; + pAC->Pnmi.Port[PhysPortIndex].CounterOffset[CounterIndex] = + GetPhysStatVal(pAC, IoC, PhysPortIndex, CounterIndex); + + pAC->Pnmi.Port[PhysPortIndex].CounterHigh[CounterIndex] = 0; } pAC->Pnmi.MacUpdatedFlag --; @@ -1763,7 +1803,8 @@ return (0); } -#endif +#endif /* DEBUG */ + /* * Store a trap message in the trap buffer and generate an event for * user space applications with the SK_DRIVER_SENDEVENT macro. @@ -1772,8 +1813,7 @@ (void)SK_DRIVER_SENDEVENT(pAC, IoC); /* Bugfix for XMAC errata (#10620)*/ - if (pAC->GIni.GIMacType == SK_MAC_XMAC){ - + if (MacType == SK_MAC_XMAC) { /* Add incremental difference to offset (#10620)*/ (void)pAC->GIni.GIFunc.pFnMacStatistic(pAC, IoC, PhysPortIndex, XM_RXE_SHT_ERR, &Val32); @@ -1800,20 +1840,22 @@ return (0); } -#endif +#endif /* DEBUG */ + /* * Store a trap message in the trap buffer and generate an event for * user space applications with the SK_DRIVER_SENDEVENT macro. */ QueueRlmtPortTrap(pAC, OID_SKGE_TRAP_RLMT_PORT_DOWN, PhysPortIndex); (void)SK_DRIVER_SENDEVENT(pAC, IoC); - + /* Bugfix #10620 - get zero level for incremental difference */ - if ((pAC->GIni.GIMacType == SK_MAC_XMAC)) { + if (MacType == SK_MAC_XMAC) { (void)pAC->GIni.GIFunc.pFnMacStatistic(pAC, IoC, PhysPortIndex, XM_RXE_SHT_ERR, &Val32); - pAC->Pnmi.Port[PhysPortIndex].RxShortZeroMark = + + pAC->Pnmi.Port[PhysPortIndex].RxShortZeroMark = (((SK_U64)pAC->Pnmi.Port[PhysPortIndex]. CounterHigh[SK_PNMI_HRX_SHORTS] << 32) | (SK_U64)Val32); } @@ -1837,7 +1879,8 @@ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_DOWN parameter too high, NetIndex=%d\n", NetIndex)); } -#endif +#endif /* DEBUG */ + /* * For now, ignore event if NetIndex != 0. */ @@ -1914,7 +1957,8 @@ ("PNMI: ERR: SkPnmiEvent: SK_PNMI_EVT_RLMT_ACTIVE_UP parameter too high, NetIndex=%d\n", NetIndex)); } -#endif +#endif /* DEBUG */ + /* * For now, ignore event if NetIndex != 0. */ @@ -1976,9 +2020,7 @@ pAC->Pnmi.VirtualCounterOffset[CounterIndex] -= Value; } - /* - * Set port to active - */ + /* Set port to active */ pAC->Pnmi.Port[PhysPortIndex].ActiveFlag = SK_TRUE; pAC->Pnmi.MacUpdatedFlag --; @@ -2020,47 +2062,56 @@ break; case SK_PNMI_EVT_VCT_RESET: - PhysPortIndex = Param.Para32[0]; - pPrt = &pAC->GIni.GP[PhysPortIndex]; - pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex]; - - if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING) { - RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE); - if (RetCode == 2) { - /* - * VCT test is still running. - * Start VCT timer counter again. - */ - SK_MEMSET((char *) &Param, 0, sizeof(Param)); - Param.Para32[0] = PhysPortIndex; - Param.Para32[1] = -1; - SkTimerStart(pAC, IoC, &pAC->Pnmi.VctTimeout[PhysPortIndex].VctTimer, - 4000000, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Param); - break; - } - pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_PENDING; - pAC->Pnmi.VctStatus[PhysPortIndex] |= - (SK_PNMI_VCT_NEW_VCT_DATA | SK_PNMI_VCT_TEST_DONE); + PhysPortIndex = Param.Para32[0]; + pPrt = &pAC->GIni.GP[PhysPortIndex]; + pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex]; - /* Copy results for later use to PNMI struct. */ - for (i = 0; i < 4; i++) { - if (pPrt->PMdiPairLen[i] > 35) { - CableLength = 1000 * (((175 * pPrt->PMdiPairLen[i]) / 210) - 28); + if (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING) { + RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE); + if (RetCode == 2) { + /* + * VCT test is still running. + * Start VCT timer counter again. + */ + SK_MEMSET((char *) &Param, 0, sizeof(Param)); + Param.Para32[0] = PhysPortIndex; + Param.Para32[1] = -1; + SkTimerStart(pAC, IoC, + &pAC->Pnmi.VctTimeout[PhysPortIndex].VctTimer, + 4000000, SKGE_PNMI, SK_PNMI_EVT_VCT_RESET, Param); + break; } - else { - CableLength = 0; + pAC->Pnmi.VctStatus[PhysPortIndex] &= ~SK_PNMI_VCT_PENDING; + pAC->Pnmi.VctStatus[PhysPortIndex] |= + (SK_PNMI_VCT_NEW_VCT_DATA | SK_PNMI_VCT_TEST_DONE); + + /* Copy results for later use to PNMI struct. */ + for (i = 0; i < 4; i++) { + if (pPrt->PMdiPairSts[i] == SK_PNMI_VCT_NORMAL_CABLE) { + if ((pPrt->PMdiPairLen[i] > 35) && + (pPrt->PMdiPairLen[i] < 0xff)) { + pPrt->PMdiPairSts[i] = SK_PNMI_VCT_IMPEDANCE_MISMATCH; + } + } + if ((pPrt->PMdiPairLen[i] > 35) && + (pPrt->PMdiPairLen[i] != 0xff)) { + CableLength = 1000 * + (((175 * pPrt->PMdiPairLen[i]) / 210) - 28); + } + else { + CableLength = 0; + } + pVctBackupData->PMdiPairLen[i] = CableLength; + pVctBackupData->PMdiPairSts[i] = pPrt->PMdiPairSts[i]; } - pVctBackupData->PMdiPairLen[i] = CableLength; - pVctBackupData->PMdiPairSts[i] = pPrt->PMdiPairSts[i]; + + Param.Para32[0] = PhysPortIndex; + Param.Para32[1] = -1; + SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Param); + SkEventDispatcher(pAC, IoC); } - Param.Para32[0] = PhysPortIndex; - Param.Para32[1] = -1; - SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Param); - SkEventDispatcher(pAC, IoC); - } - - break; + break; default: break; @@ -2088,19 +2139,19 @@ * SkGePnmiPreSetVar, or SkGePnmiSetVar. * * Returns: - * SK_PNMI_ERR_XXX. For details have a look to the description of the + * SK_PNMI_ERR_XXX. For details have a look at the description of the * calling functions. - * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist + * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist */ PNMI_STATIC int PnmiVar( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer which stores the mgmt data to be set */ -unsigned int *pLen, /* Total length of mgmt data */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* Total length of pBuf management data */ SK_U32 Instance, /* Instance (1..n) that is to be set or -1 */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { unsigned int TableIndex; int Ret; @@ -2112,9 +2163,7 @@ return (SK_PNMI_ERR_UNKNOWN_OID); } - /* - * Check NetIndex - */ + /* Check NetIndex */ if (NetIndex >= pAC->Rlmt.NumNets) { return (SK_PNMI_ERR_UNKNOWN_NET); } @@ -2145,15 +2194,15 @@ * * Returns: * SK_PNMI_ERR_XXX. The codes are described in the calling functions. - * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist + * SK_PNMI_ERR_UNKNOWN_NET The requested NetIndex doesn't exist */ PNMI_STATIC int PnmiStruct( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Set action to be performed */ -char *pBuf, /* Buffer which contains the data to be set */ -unsigned int *pLen, /* Length of buffer */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +int Action, /* PRESET/SET action to be performed */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* Length of pBuf management data buffer */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { int Ret; unsigned int TableIndex; @@ -2179,9 +2228,7 @@ return (SK_PNMI_ERR_TOO_SHORT); } - /* - * Check NetIndex - */ + /* Check NetIndex */ if (NetIndex >= pAC->Rlmt.NumNets) { return (SK_PNMI_ERR_UNKNOWN_NET); } @@ -2348,19 +2395,19 @@ * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int OidStruct( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { if (Id != OID_SKGE_ALL_DATA) { @@ -2415,19 +2462,19 @@ * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int Perform( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { int Ret; SK_U32 ActionOp; @@ -2546,19 +2593,19 @@ * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int Mac8023Stat( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { int Ret; SK_U64 StatVal; @@ -2583,9 +2630,7 @@ return (SK_PNMI_ERR_READ_ONLY); } - /* - * Check length - */ + /* Check length */ switch (Id) { case OID_802_3_PERMANENT_ADDRESS: @@ -2606,9 +2651,7 @@ #else /* SK_NDIS_64BIT_CTR */ - /* - * for compatibility, at least 32bit are required for oid - */ + /* for compatibility, at least 32bit are required for OID */ if (*pLen < sizeof(SK_U32)) { /* * but indicate handling for 64bit values, @@ -2654,9 +2697,7 @@ default: StatVal = GetStatVal(pAC, IoC, 0, IdTable[TableIndex].Param, NetIndex); - /* - * by default 32bit values are evaluated - */ + /* by default 32bit values are evaluated */ if (!Is64BitReq) { StatVal32 = (SK_U32)StatVal; SK_PNMI_STORE_U32(pBuf, StatVal32); @@ -2679,7 +2720,7 @@ * MacPrivateStat - OID handler function of OID_SKGE_STAT_XXX * * Description: - * Retrieves the XMAC statistic data. + * Retrieves the MAC statistic data. * * Returns: * SK_PNMI_ERR_OK The request was successfully performed. @@ -2688,35 +2729,36 @@ * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int MacPrivateStat( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { unsigned int LogPortMax; unsigned int LogPortIndex; unsigned int PhysPortMax; unsigned int Limit; unsigned int Offset; + int MacType; int Ret; SK_U64 StatVal; + + - - /* - * Calculate instance if wished. MAC index 0 is the virtual - * MAC. - */ + /* Calculate instance if wished. MAC index 0 is the virtual MAC */ PhysPortMax = pAC->GIni.GIMacsFound; LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax); + + MacType = pAC->GIni.GIMacType; if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */ LogPortMax--; @@ -2739,19 +2781,14 @@ Limit = LogPortMax; } - - /* - * Check action - */ + /* Check action */ if (Action != SK_PNMI_GET) { *pLen = 0; return (SK_PNMI_ERR_READ_ONLY); } - /* - * Check length - */ + /* Check length */ if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U64)) { *pLen = (Limit - LogPortIndex) * sizeof(SK_U64); @@ -2759,7 +2796,7 @@ } /* - * Update XMAC statistic and increment semaphore to indicate that + * Update MAC statistic and increment semaphore to indicate that * an update was already done. */ Ret = MacUpdate(pAC, IoC, 0, pAC->GIni.GIMacsFound - 1); @@ -2770,9 +2807,7 @@ } pAC->Pnmi.MacUpdatedFlag ++; - /* - * Get value - */ + /* Get value */ Offset = 0; for (; LogPortIndex < Limit; LogPortIndex ++) { @@ -2787,51 +2822,44 @@ return (SK_PNMI_ERR_GENERAL); */ case OID_SKGE_STAT_RX: - case OID_SKGE_STAT_TX: - switch (pAC->GIni.GIMacType) { - case SK_MAC_XMAC: + if (MacType == SK_MAC_GMAC) { + StatVal = + GetStatVal(pAC, IoC, LogPortIndex, + SK_PNMI_HRX_BROADCAST, NetIndex) + + GetStatVal(pAC, IoC, LogPortIndex, + SK_PNMI_HRX_MULTICAST, NetIndex) + + GetStatVal(pAC, IoC, LogPortIndex, + SK_PNMI_HRX_UNICAST, NetIndex) + + GetStatVal(pAC, IoC, LogPortIndex, + SK_PNMI_HRX_UNDERSIZE, NetIndex); + } + else { StatVal = GetStatVal(pAC, IoC, LogPortIndex, IdTable[TableIndex].Param, NetIndex); - break; - - case SK_MAC_GMAC: - if (Id == OID_SKGE_STAT_TX) { - - StatVal = - GetStatVal(pAC, IoC, LogPortIndex, - SK_PNMI_HTX_BROADCAST, NetIndex) + - GetStatVal(pAC, IoC, LogPortIndex, - SK_PNMI_HTX_MULTICAST, NetIndex) + - GetStatVal(pAC, IoC, LogPortIndex, - SK_PNMI_HTX_UNICAST, NetIndex); - } - else { - StatVal = - GetStatVal(pAC, IoC, LogPortIndex, - SK_PNMI_HRX_BROADCAST, NetIndex) + - GetStatVal(pAC, IoC, LogPortIndex, - SK_PNMI_HRX_MULTICAST, NetIndex) + - GetStatVal(pAC, IoC, LogPortIndex, - SK_PNMI_HRX_UNICAST, NetIndex) + - GetStatVal(pAC, IoC, LogPortIndex, - SK_PNMI_HRX_UNDERSIZE, NetIndex); - } - break; - - default: - StatVal = 0; - break; } + break; - SK_PNMI_STORE_U64(pBuf + Offset, StatVal); + case OID_SKGE_STAT_TX: + if (MacType == SK_MAC_GMAC) { + StatVal = + GetStatVal(pAC, IoC, LogPortIndex, + SK_PNMI_HTX_BROADCAST, NetIndex) + + GetStatVal(pAC, IoC, LogPortIndex, + SK_PNMI_HTX_MULTICAST, NetIndex) + + GetStatVal(pAC, IoC, LogPortIndex, + SK_PNMI_HTX_UNICAST, NetIndex); + } + else { + StatVal = GetStatVal(pAC, IoC, LogPortIndex, + IdTable[TableIndex].Param, NetIndex); + } break; default: StatVal = GetStatVal(pAC, IoC, LogPortIndex, IdTable[TableIndex].Param, NetIndex); - SK_PNMI_STORE_U64(pBuf + Offset, StatVal); - break; } + SK_PNMI_STORE_U64(pBuf + Offset, StatVal); Offset += sizeof(SK_U64); } @@ -2863,19 +2891,19 @@ * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int Addr( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { int Ret; unsigned int LogPortMax; @@ -2906,7 +2934,6 @@ LogPortIndex = SK_PNMI_PORT_INST2LOG(Instance); Limit = LogPortIndex + 1; } - else { /* Instance == (SK_U32)(-1), get all Instances of that OID */ LogPortIndex = 0; @@ -2918,9 +2945,7 @@ */ if (Action == SK_PNMI_GET) { - /* - * Check length - */ + /* Check length */ if (*pLen < (Limit - LogPortIndex) * 6) { *pLen = (Limit - LogPortIndex) * 6; @@ -2996,9 +3021,7 @@ return (SK_PNMI_ERR_GENERAL); } - /* - * Check length - */ + /* Check length */ if (*pLen < (Limit - LogPortIndex) * 6) { *pLen = (Limit - LogPortIndex) * 6; @@ -3069,19 +3092,19 @@ * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int CsumStat( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { unsigned int Index; unsigned int Limit; @@ -3116,9 +3139,7 @@ return (SK_PNMI_ERR_READ_ONLY); } - /* - * Check length - */ + /* Check length */ if (*pLen < (Limit - Index) * sizeof(SK_U64)) { *pLen = (Limit - Index) * sizeof(SK_U64); @@ -3187,19 +3208,19 @@ * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int SensorStat( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { unsigned int i; unsigned int Index; @@ -3238,9 +3259,7 @@ return (SK_PNMI_ERR_READ_ONLY); } - /* - * Check length - */ + /* Check length */ switch (Id) { case OID_SKGE_SENSOR_VALUE: @@ -3434,19 +3453,19 @@ * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int Vpd( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { SK_VPD_STATUS *pVpdStatus; unsigned int BufLen; @@ -3465,8 +3484,7 @@ /* * Get array of all currently stored VPD keys */ - Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), - &KeyNo); + Ret = GetVpdKeyArr(pAC, IoC, &KeyArr[0][0], sizeof(KeyArr), &KeyNo); if (Ret != SK_PNMI_ERR_OK) { *pLen = 0; return (Ret); @@ -3712,7 +3730,7 @@ *pLen = 0; return (SK_PNMI_ERR_GENERAL); } - } + } else { /* The only OID which can be set is VPD_ACTION */ if (Id != OID_SKGE_VPD_ACTION) { @@ -3909,19 +3927,19 @@ * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int General( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ +char *pBuf, /* Buffer used for the management data transfer */ unsigned int *pLen, /* On call: buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { int Ret; unsigned int Index; @@ -3939,7 +3957,7 @@ int MacType; /* - * Check instance. We only handle single instance variables + * Check instance. We only handle single instance variables. */ if (Instance != (SK_U32)(-1) && Instance != 1) { @@ -3990,6 +4008,14 @@ #endif /* SK_NDIS_64BIT_CTR */ break; + case OID_SKGE_BOARDLEVEL: + if (*pLen < sizeof(SK_U32)) { + + *pLen = sizeof(SK_U32); + return (SK_PNMI_ERR_TOO_SHORT); + } + break; + case OID_SKGE_PORT_NUMBER: case OID_SKGE_DEVICE_TYPE: case OID_SKGE_RESULT: @@ -4085,10 +4111,10 @@ Val64RxHwErrs = GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_MISSED, NetIndex) + GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_FRAMING, NetIndex) + - GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_OVERFLOW, NetIndex)+ + GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_OVERFLOW, NetIndex) + GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_JABBER, NetIndex) + GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_CARRIER, NetIndex) + - GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_IRLENGTH, NetIndex)+ + GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_IRLENGTH, NetIndex) + GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SYMBOL, NetIndex) + GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_SHORTS, NetIndex) + GetStatVal(pAC, IoC, 0, SK_PNMI_HRX_RUNT, NetIndex) + @@ -4102,8 +4128,8 @@ case OID_GEN_XMIT_ERROR: Val64TxHwErrs = GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_EXCESS_COL, NetIndex) + - GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_LATE_COL, NetIndex)+ - GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_UNDERRUN, NetIndex)+ + GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_LATE_COL, NetIndex) + + GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_UNDERRUN, NetIndex) + GetStatVal(pAC, IoC, 0, SK_PNMI_HTX_CARRIER, NetIndex); break; } @@ -4130,6 +4156,12 @@ *pLen = Len; break; + case OID_SKGE_BOARDLEVEL: + Val32 = (SK_U32)pAC->GIni.GILevel; + SK_PNMI_STORE_U32(pBuf, Val32); + *pLen = sizeof(SK_U32); + break; + case OID_SKGE_PORT_NUMBER: Val32 = (SK_U32)pAC->GIni.GIMacsFound; SK_PNMI_STORE_U32(pBuf, Val32); @@ -4316,7 +4348,7 @@ break; case OID_SKGE_TX_SW_QUEUE_LEN: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4345,7 +4377,7 @@ case OID_SKGE_TX_SW_QUEUE_MAX: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4373,7 +4405,7 @@ break; case OID_SKGE_TX_RETRY: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4401,7 +4433,7 @@ break; case OID_SKGE_RX_INTR_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4429,7 +4461,7 @@ break; case OID_SKGE_TX_INTR_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4457,7 +4489,7 @@ break; case OID_SKGE_RX_NO_BUF_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4485,7 +4517,7 @@ break; case OID_SKGE_TX_NO_BUF_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4513,7 +4545,7 @@ break; case OID_SKGE_TX_USED_DESCR_NO: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4541,7 +4573,7 @@ break; case OID_SKGE_RX_DELIVERED_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4569,7 +4601,7 @@ break; case OID_SKGE_RX_OCTETS_DELIV_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4607,7 +4639,7 @@ break; case OID_SKGE_IN_ERRORS_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4615,7 +4647,7 @@ } /* Single net mode */ else { - Val64 = Val64RxHwErrs + + Val64 = Val64RxHwErrs + pAC->Pnmi.BufPort[0].RxNoBufCts + pAC->Pnmi.BufPort[1].RxNoBufCts; } @@ -4627,7 +4659,7 @@ } /* Single net mode */ else { - Val64 = Val64RxHwErrs + + Val64 = Val64RxHwErrs + pAC->Pnmi.Port[0].RxNoBufCts + pAC->Pnmi.Port[1].RxNoBufCts; } @@ -4637,7 +4669,7 @@ break; case OID_SKGE_OUT_ERROR_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4645,7 +4677,7 @@ } /* Single net mode */ else { - Val64 = Val64TxHwErrs + + Val64 = Val64TxHwErrs + pAC->Pnmi.BufPort[0].TxNoBufCts + pAC->Pnmi.BufPort[1].TxNoBufCts; } @@ -4657,7 +4689,7 @@ } /* Single net mode */ else { - Val64 = Val64TxHwErrs + + Val64 = Val64TxHwErrs + pAC->Pnmi.Port[0].TxNoBufCts + pAC->Pnmi.Port[1].TxNoBufCts; } @@ -4667,7 +4699,7 @@ break; case OID_SKGE_ERR_RECOVERY_CTS: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { /* Dual net mode */ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { @@ -4708,7 +4740,7 @@ break; case OID_GEN_RCV_ERROR: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { Val64 = Val64RxHwErrs + pAC->Pnmi.BufPort[NetIndex].RxNoBufCts; } @@ -4731,7 +4763,7 @@ break; case OID_GEN_XMIT_ERROR: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { Val64 = Val64TxHwErrs + pAC->Pnmi.BufPort[NetIndex].TxNoBufCts; } @@ -4754,7 +4786,7 @@ break; case OID_GEN_RCV_NO_BUFFER: - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ if (MacType == SK_MAC_XMAC) { Val64 = pAC->Pnmi.BufPort[NetIndex].RxNoBufCts; } @@ -4820,19 +4852,19 @@ * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int Rlmt( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { int Ret; unsigned int PhysPortIndex; @@ -4852,7 +4884,7 @@ } /* - * Perform the requested action + * Perform the requested action. */ if (Action == SK_PNMI_GET) { @@ -5125,19 +5157,19 @@ * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int RlmtStat( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { unsigned int PhysPortMax; unsigned int PhysPortIndex; @@ -5148,7 +5180,7 @@ SK_U64 Val64; /* - * Calculate the port indexes from the instance + * Calculate the port indexes from the instance. */ PhysPortMax = pAC->GIni.GIMacsFound; @@ -5327,19 +5359,19 @@ * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int MacPrivateConf( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { unsigned int PhysPortMax; unsigned int PhysPortIndex; @@ -5348,14 +5380,13 @@ unsigned int Limit; unsigned int Offset; char Val8; - int Ret; + char *pBufPtr; + int Ret; SK_EVPARA EventParam; SK_U32 Val32; - /* - * Calculate instance if wished. MAC index 0 is the virtual - * MAC. + * Calculate instance if wished. MAC index 0 is the virtual MAC. */ PhysPortMax = pAC->GIni.GIMacsFound; LogPortMax = SK_PNMI_PORT_PHYS2LOG(PhysPortMax); @@ -5386,9 +5417,7 @@ */ if (Action == SK_PNMI_GET) { - /* - * Check length - */ + /* Check length */ switch (Id) { case OID_SKGE_PMD: @@ -5408,16 +5437,15 @@ case OID_SKGE_SPEED_STATUS: if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U8)) { - *pLen = (Limit - LogPortIndex) * - sizeof(SK_U8); + *pLen = (Limit - LogPortIndex) * sizeof(SK_U8); return (SK_PNMI_ERR_TOO_SHORT); } break; case OID_SKGE_MTU: - if (*pLen < sizeof(SK_U32)) { + if (*pLen < (Limit - LogPortIndex) * sizeof(SK_U32)) { - *pLen = sizeof(SK_U32); + *pLen = (Limit - LogPortIndex) * sizeof(SK_U32); return (SK_PNMI_ERR_TOO_SHORT); } break; @@ -5446,343 +5474,297 @@ Offset = 0; for (; LogPortIndex < Limit; LogPortIndex ++) { + pBufPtr = pBuf + Offset; + switch (Id) { case OID_SKGE_PMD: - *(pBuf + Offset) = pAC->Pnmi.PMD; + *pBufPtr = pAC->Pnmi.PMD; Offset += sizeof(char); break; case OID_SKGE_CONNECTOR: - *(pBuf + Offset) = pAC->Pnmi.Connector; + *pBufPtr = pAC->Pnmi.Connector; Offset += sizeof(char); break; case OID_SKGE_LINK_CAP: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical ports */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PLinkCap; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkCap; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PLinkCap; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PLinkCap; } + Offset += sizeof(char); break; case OID_SKGE_LINK_MODE: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical ports */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PLinkModeConf; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkModeConf; } - Offset += sizeof(char); } - else { /* DualNetMode */ + else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PLinkModeConf; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PLinkModeConf; } + Offset += sizeof(char); break; case OID_SKGE_LINK_MODE_STATUS: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical port */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = - CalculateLinkModeStatus(pAC, - IoC, PhysPortIndex); + *pBufPtr = + CalculateLinkModeStatus(pAC, IoC, PhysPortIndex); } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = CalculateLinkModeStatus(pAC, IoC, NetIndex); - Offset += sizeof(char); + + *pBufPtr = CalculateLinkModeStatus(pAC, IoC, NetIndex); } + Offset += sizeof(char); break; case OID_SKGE_LINK_STATUS: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical ports */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = - CalculateLinkStatus(pAC, - IoC, PhysPortIndex); + *pBufPtr = CalculateLinkStatus(pAC, IoC, PhysPortIndex); } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = CalculateLinkStatus(pAC, IoC, NetIndex); - Offset += sizeof(char); + *pBufPtr = CalculateLinkStatus(pAC, IoC, NetIndex); } + Offset += sizeof(char); break; case OID_SKGE_FLOWCTRL_CAP: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical ports */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PFlowCtrlCap; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlCap; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PFlowCtrlCap; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlCap; } + Offset += sizeof(char); break; case OID_SKGE_FLOWCTRL_MODE: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical port */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PFlowCtrlMode; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlMode; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PFlowCtrlMode; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlMode; } + Offset += sizeof(char); break; case OID_SKGE_FLOWCTRL_STATUS: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical port */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PFlowCtrlStatus; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PFlowCtrlStatus; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PFlowCtrlStatus; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PFlowCtrlStatus; } + Offset += sizeof(char); break; case OID_SKGE_PHY_OPERATION_CAP: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical ports */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PMSCap; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSCap; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PMSCap; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PMSCap; } + Offset += sizeof(char); break; case OID_SKGE_PHY_OPERATION_MODE: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical port */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PMSMode; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSMode; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PMSMode; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PMSMode; } + Offset += sizeof(char); break; case OID_SKGE_PHY_OPERATION_STATUS: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical port */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PMSStatus; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PMSStatus; } - Offset += sizeof(char); } else { - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PMSStatus; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PMSStatus; } + Offset += sizeof(char); break; case OID_SKGE_SPEED_CAP: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + - Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical ports */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PLinkSpeedCap; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeedCap; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PLinkSpeedCap; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeedCap; } + Offset += sizeof(char); break; case OID_SKGE_SPEED_MODE: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical port */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PLinkSpeed; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeed; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PLinkSpeed; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeed; } + Offset += sizeof(char); break; case OID_SKGE_SPEED_STATUS: if (!pAC->Pnmi.DualNetActiveFlag) { /* SingleNetMode */ if (LogPortIndex == 0) { - /* Get value for virtual port */ - VirtualConf(pAC, IoC, Id, pBuf + Offset); + VirtualConf(pAC, IoC, Id, pBufPtr); } else { /* Get value for physical port */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS( pAC, LogPortIndex); - *(pBuf + Offset) = pAC->GIni.GP[ - PhysPortIndex].PLinkSpeedUsed; + *pBufPtr = pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed; } - Offset += sizeof(char); } else { /* DualNetMode */ - *(pBuf + Offset) = pAC->GIni.GP[NetIndex].PLinkSpeedUsed; - Offset += sizeof(char); + *pBufPtr = pAC->GIni.GP[NetIndex].PLinkSpeedUsed; } + Offset += sizeof(char); break; case OID_SKGE_MTU: Val32 = SK_DRIVER_GET_MTU(pAC, IoC, NetIndex); - SK_PNMI_STORE_U32(pBuf + Offset, Val32); + SK_PNMI_STORE_U32(pBufPtr, Val32); Offset += sizeof(SK_U32); break; @@ -6209,19 +6191,19 @@ * value range. * SK_PNMI_ERR_READ_ONLY The OID is read-only and cannot be set. * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter. */ PNMI_STATIC int Monitor( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which to mgmt data will be retrieved */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ unsigned int TableIndex, /* Index to the Id table */ -SK_U32 NetIndex) /* NetIndex (0..n), in single net mode allways zero */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ { unsigned int Index; unsigned int Limit; @@ -6232,7 +6214,7 @@ /* * Calculate instance if wished. */ -/* XXX Not yet implemented. Return always an empty table. */ + /* XXX Not yet implemented. Return always an empty table. */ Entries = 0; if ((Instance != (SK_U32)(-1))) { @@ -6331,21 +6313,23 @@ SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf) /* Buffer to which to mgmt data will be retrieved */ +char *pBuf) /* Buffer used for the management data transfer */ { unsigned int PhysPortMax; unsigned int PhysPortIndex; SK_U8 Val8; SK_BOOL PortActiveFlag; - + SK_GEPORT *pPrt; *pBuf = 0; PortActiveFlag = SK_FALSE; PhysPortMax = pAC->GIni.GIMacsFound; - + for (PhysPortIndex = 0; PhysPortIndex < PhysPortMax; PhysPortIndex ++) { + pPrt = &pAC->GIni.GP[PhysPortIndex]; + /* Check if the physical port is active */ if (!pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { @@ -6364,14 +6348,14 @@ * From a curious point of view the virtual port * is capable of all found capabilities. */ - *pBuf |= pAC->GIni.GP[PhysPortIndex].PLinkCap; + *pBuf |= pPrt->PLinkCap; break; case OID_SKGE_LINK_MODE: /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PLinkModeConf; + *pBuf = pPrt->PLinkModeConf; continue; } @@ -6380,8 +6364,7 @@ * mode than the first one we return a value that * indicates that the link mode is indeterminated. */ - if (*pBuf != pAC->GIni.GP[PhysPortIndex].PLinkModeConf - ) { + if (*pBuf != pPrt->PLinkModeConf) { *pBuf = SK_LMODE_INDETERMINATED; } @@ -6437,7 +6420,7 @@ /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PFlowCtrlCap; + *pBuf = pPrt->PFlowCtrlCap; continue; } @@ -6445,14 +6428,14 @@ * From a curious point of view the virtual port * is capable of all found capabilities. */ - *pBuf |= pAC->GIni.GP[PhysPortIndex].PFlowCtrlCap; + *pBuf |= pPrt->PFlowCtrlCap; break; case OID_SKGE_FLOWCTRL_MODE: /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PFlowCtrlMode; + *pBuf = pPrt->PFlowCtrlMode; continue; } @@ -6461,7 +6444,7 @@ * control mode than the first one, we return a value * that indicates that the mode is indeterminated. */ - if (*pBuf != pAC->GIni.GP[PhysPortIndex].PFlowCtrlMode) { + if (*pBuf != pPrt->PFlowCtrlMode) { *pBuf = SK_FLOW_MODE_INDETERMINATED; } @@ -6471,7 +6454,7 @@ /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PFlowCtrlStatus; + *pBuf = pPrt->PFlowCtrlStatus; continue; } @@ -6481,7 +6464,7 @@ * value that indicates that the status is * indeterminated. */ - if (*pBuf != pAC->GIni.GP[PhysPortIndex].PFlowCtrlStatus) { + if (*pBuf != pPrt->PFlowCtrlStatus) { *pBuf = SK_FLOW_STAT_INDETERMINATED; } @@ -6491,7 +6474,7 @@ /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PMSCap; + *pBuf = pPrt->PMSCap; continue; } @@ -6499,14 +6482,14 @@ * From a curious point of view the virtual port * is capable of all found capabilities. */ - *pBuf |= pAC->GIni.GP[PhysPortIndex].PMSCap; + *pBuf |= pPrt->PMSCap; break; case OID_SKGE_PHY_OPERATION_MODE: /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PMSMode; + *pBuf = pPrt->PMSMode; continue; } @@ -6515,7 +6498,7 @@ * slave mode than the first one, we return a value * that indicates that the mode is indeterminated. */ - if (*pBuf != pAC->GIni.GP[PhysPortIndex].PMSMode) { + if (*pBuf != pPrt->PMSMode) { *pBuf = SK_MS_MODE_INDETERMINATED; } @@ -6525,7 +6508,7 @@ /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PMSStatus; + *pBuf = pPrt->PMSStatus; continue; } @@ -6535,7 +6518,7 @@ * value that indicates that the status is * indeterminated. */ - if (*pBuf != pAC->GIni.GP[PhysPortIndex].PMSStatus) { + if (*pBuf != pPrt->PMSStatus) { *pBuf = SK_MS_STAT_INDETERMINATED; } @@ -6545,7 +6528,7 @@ /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PLinkSpeed; + *pBuf = pPrt->PLinkSpeed; continue; } @@ -6554,7 +6537,7 @@ * control mode than the first one, we return a value * that indicates that the mode is indeterminated. */ - if (*pBuf != pAC->GIni.GP[PhysPortIndex].PLinkSpeed) { + if (*pBuf != pPrt->PLinkSpeed) { *pBuf = SK_LSPEED_INDETERMINATED; } @@ -6564,7 +6547,7 @@ /* Check if it is the first active port */ if (*pBuf == 0) { - *pBuf = pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed; + *pBuf = pPrt->PLinkSpeedUsed; continue; } @@ -6574,7 +6557,7 @@ * value that indicates that the status is * indeterminated. */ - if (*pBuf != pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed) { + if (*pBuf != pPrt->PLinkSpeedUsed) { *pBuf = SK_LSPEED_STAT_INDETERMINATED; } @@ -6662,7 +6645,6 @@ { SK_U8 Result; - if (!pAC->GIni.GP[PhysPortIndex].PHWLinkUp) { Result = SK_PNMI_RLMT_LSTAT_PHY_DOWN; @@ -6702,7 +6684,6 @@ { SK_U8 Result; - /* Get the current mode, which can be full or half duplex */ Result = pAC->GIni.GP[PhysPortIndex].PLinkModeStatus; @@ -6710,7 +6691,7 @@ if (Result < SK_LMODE_STAT_HALF) { Result = SK_LMODE_STAT_UNKNOWN; - } + } else if (pAC->GIni.GP[PhysPortIndex].PLinkMode >= SK_LMODE_AUTOHALF) { /* @@ -6913,8 +6894,8 @@ * * Description: * The XMAC holds its statistic internally. To obtain the current - * values we send a command so that the statistic data will - * be written to apredefined memory area on the adapter. + * values we must send a command so that the statistic data will + * be written to a predefined memory area on the adapter. * * Returns: * SK_PNMI_ERR_OK Task successfully performed. @@ -6941,16 +6922,16 @@ for (MacIndex = FirstMac; MacIndex <= LastMac; MacIndex ++) { /* - * 2002-09-13 pweber: Freeze the current sw counters. - * (That should be done as close as - * possible to the update of the - * hw counters) + * 2002-09-13 pweber: Freeze the current SW counters. + * (That should be done as close as + * possible to the update of the + * HW counters) */ if (pAC->GIni.GIMacType == SK_MAC_XMAC) { pAC->Pnmi.BufPort[MacIndex] = pAC->Pnmi.Port[MacIndex]; } - /* 2002-09-13 pweber: Update the hw counter */ + /* 2002-09-13 pweber: Update the HW counter */ if (pAC->GIni.GIFunc.pFnMacUpdateStats(pAC, IoC, MacIndex) != 0) { return (SK_PNMI_ERR_GENERAL); @@ -6991,6 +6972,7 @@ if (pAC->Pnmi.DualNetActiveFlag == SK_TRUE) { /* Dual net mode */ PhysPortIndex = NetIndex; + Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex); } else { /* Single Net mode */ @@ -7005,8 +6987,7 @@ if (pAC->Pnmi.Port[PhysPortIndex].ActiveFlag) { - Val += GetPhysStatVal(pAC, IoC, PhysPortIndex, - StatIndex); + Val += GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex); } } @@ -7016,6 +6997,7 @@ else { /* Get counter value of physical port */ PhysPortIndex = SK_PNMI_PORT_LOG2PHYS(pAC, LogPortIndex); + Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, StatIndex); } } @@ -7049,14 +7031,18 @@ SK_U32 HighVal = 0; SK_U16 Word; int MacType; + unsigned int HelpIndex; + SK_GEPORT *pPrt; SK_PNMI_PORT *pPnmiPrt; SK_GEMACFUNC *pFnMac; + pPrt = &pAC->GIni.GP[PhysPortIndex]; + MacType = pAC->GIni.GIMacType; - /* 2002-09-17 pweber: For XMAC, use the frozen sw counters (BufPort) */ - if (pAC->GIni.GIMacType == SK_MAC_XMAC) { + /* 2002-09-17 pweber: For XMAC, use the frozen SW counters (BufPort) */ + if (MacType == SK_MAC_XMAC) { pPnmiPrt = &pAC->Pnmi.BufPort[PhysPortIndex]; } else { @@ -7067,15 +7053,46 @@ switch (StatIndex) { case SK_PNMI_HTX: + if (MacType == SK_MAC_GMAC) { + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, + StatAddr[SK_PNMI_HTX_BROADCAST][MacType].Reg, + &LowVal); + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, + StatAddr[SK_PNMI_HTX_MULTICAST][MacType].Reg, + &HighVal); + LowVal += HighVal; + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, + StatAddr[SK_PNMI_HTX_UNICAST][MacType].Reg, + &HighVal); + LowVal += HighVal; + } + else { + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, + StatAddr[StatIndex][MacType].Reg, + &LowVal); + } + HighVal = pPnmiPrt->CounterHigh[StatIndex]; + break; + case SK_PNMI_HRX: - /* Not supported by GMAC */ if (MacType == SK_MAC_GMAC) { - return (Val); + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, + StatAddr[SK_PNMI_HRX_BROADCAST][MacType].Reg, + &LowVal); + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, + StatAddr[SK_PNMI_HRX_MULTICAST][MacType].Reg, + &HighVal); + LowVal += HighVal; + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, + StatAddr[SK_PNMI_HRX_UNICAST][MacType].Reg, + &HighVal); + LowVal += HighVal; + } + else { + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, + StatAddr[StatIndex][MacType].Reg, + &LowVal); } - - (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, - StatAddr[StatIndex][MacType].Reg, - &LowVal); HighVal = pPnmiPrt->CounterHigh[StatIndex]; break; @@ -7106,14 +7123,16 @@ case SK_PNMI_HTX_MACC: /* GMAC only supports PAUSE MAC control frames */ if (MacType == SK_MAC_GMAC) { - Val = GetPhysStatVal(pAC, IoC, PhysPortIndex, SK_PNMI_HTX_PMACC); - - return (Val); + HelpIndex = SK_PNMI_HTX_PMACC; } - + else { + HelpIndex = StatIndex; + } + (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, - StatAddr[StatIndex][MacType].Reg, - &LowVal); + StatAddr[HelpIndex][MacType].Reg, + &LowVal); + HighVal = pPnmiPrt->CounterHigh[StatIndex]; break; @@ -7130,12 +7149,10 @@ HighVal = pPnmiPrt->CounterHigh[StatIndex]; break; - - case SK_PNMI_HTX_DEFFERAL: /* Not supported by GMAC */ if (MacType == SK_MAC_GMAC) { - return (Val); + return (Val); } /* @@ -7144,16 +7161,16 @@ * * In full-duplex mode the counter remains constant! */ - if ((pAC->GIni.GP[PhysPortIndex].PLinkModeStatus == SK_LMODE_STAT_AUTOFULL) || - (pAC->GIni.GP[PhysPortIndex].PLinkModeStatus == SK_LMODE_STAT_FULL)) { + if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOFULL) || + (pPrt->PLinkModeStatus == SK_LMODE_STAT_FULL)) { LowVal = 0; HighVal = 0; } else { - /* Otherwise get contents of hardware register. */ + /* Otherwise get contents of hardware register */ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, - StatAddr[SK_PNMI_HTX_DEFFERAL][MacType].Reg, + StatAddr[StatIndex][MacType].Reg, &LowVal); HighVal = pPnmiPrt->CounterHigh[StatIndex]; } @@ -7181,7 +7198,7 @@ case SK_PNMI_HRX_LONGFRAMES: /* For XMAC the SW counter is managed by PNMI */ if (MacType == SK_MAC_XMAC) { - return (pPnmiPrt->StatRxLongFrameCts); + return (pPnmiPrt->StatRxLongFrameCts); } (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, @@ -7192,19 +7209,17 @@ case SK_PNMI_HRX_TOO_LONG: (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, - StatAddr[StatIndex][MacType].Reg, + StatAddr[StatIndex][MacType].Reg, &LowVal); HighVal = pPnmiPrt->CounterHigh[StatIndex]; Val = (((SK_U64)HighVal << 32) | (SK_U64)LowVal); - switch (MacType) { - case SK_MAC_GMAC: + if (MacType == SK_MAC_GMAC) { /* For GMAC the SW counter is additionally managed by PNMI */ Val += pPnmiPrt->StatRxFrameTooLongCts; - break; - - case SK_MAC_XMAC: + } + else { /* * Frames longer than IEEE 802.3 frame max size are counted * by XMAC in frame_too_long counter even reception of long @@ -7212,10 +7227,6 @@ * So correct the value by subtracting RxLongFrame counter. */ Val -= pPnmiPrt->StatRxLongFrameCts; - break; - - default: - break; } LowVal = (SK_U32)Val; @@ -7226,7 +7237,7 @@ /* Not supported by GMAC */ if (MacType == SK_MAC_GMAC) { /* GM_RXE_FRAG?? */ - return (Val); + return (Val); } /* @@ -7234,7 +7245,7 @@ * * If link-down the counter remains constant */ - if (pAC->GIni.GP[PhysPortIndex].PLinkModeStatus != SK_LMODE_STAT_UNKNOWN) { + if (pPrt->PLinkModeStatus != SK_LMODE_STAT_UNKNOWN) { /* Otherwise get incremental difference */ (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, @@ -7261,8 +7272,7 @@ case SK_PNMI_HRX_CEXT: /* Not supported by GMAC */ if (MacType == SK_MAC_GMAC) { - /* GM_RXE_FRAG?? */ - return (Val); + return (Val); } (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, @@ -7274,7 +7284,7 @@ case SK_PNMI_HRX_PMACC_ERR: /* For GMAC the SW counter is managed by PNMI */ if (MacType == SK_MAC_GMAC) { - return (pPnmiPrt->StatRxPMaccErr); + return (pPnmiPrt->StatRxPMaccErr); } (void)pFnMac->pFnMacStatistic(pAC, IoC, PhysPortIndex, @@ -7296,16 +7306,14 @@ break; case SK_PNMI_HRX_FCS: - /* - * Broadcom filters fcs errors and counts it in + /* + * Broadcom filters FCS errors and counts it in * Receive Error Counter register */ - if (pAC->GIni.GP[PhysPortIndex].PhyType == SK_PHY_BCOM) { + if (pPrt->PhyType == SK_PHY_BCOM) { /* do not read while not initialized (PHY_READ hangs!)*/ - if (pAC->GIni.GP[PhysPortIndex].PState) { - PHY_READ(IoC, &pAC->GIni.GP[PhysPortIndex], - PhysPortIndex, PHY_BCOM_RE_CTR, - &Word); + if (pPrt->PState != SK_PRT_RESET) { + SkXmPhyRead(pAC, IoC, PhysPortIndex, PHY_BCOM_RE_CTR, &Word); LowVal = Word; } @@ -7375,8 +7383,8 @@ EventParam.Para32[1] = (SK_U32)-1; SkEventQueue(pAC, SKGE_CSUM, SK_CSUM_EVENT_CLEAR_PROTO_STATS, EventParam); -#endif - +#endif /* SK_USE_CSUM */ + /* Clear XMAC statistic */ for (PhysPortIndex = 0; PhysPortIndex < (unsigned int)pAC->GIni.GIMacsFound; PhysPortIndex ++) { @@ -7492,18 +7500,18 @@ End -= EntrySize; #ifdef DEBUG SK_MEMSET(pBuf + End, (char)(-1), EntrySize); -#endif +#endif /* DEBUG */ if (End == BufPad) { #ifdef DEBUG SK_MEMSET(pBuf, (char)(-1), End); -#endif +#endif /* DEBUG */ BufFree += End; End = 0; BufPad = 0; } } - /* + /* * Insert new entry as first entry. Newest entries are * stored at the beginning of the queue. */ @@ -7772,7 +7780,6 @@ } } - #ifdef SK_POWER_MGMT /***************************************************************************** * @@ -7814,45 +7821,50 @@ *pLen = 0; return (SK_PNMI_ERR_UNKNOWN_INST); } + + + /* Check length */ + switch (Id) { - /* - * Perform action - */ - if (Action == SK_PNMI_GET) { + case OID_PNP_CAPABILITIES: + if (*pLen < sizeof(SK_PNP_CAPABILITIES)) { - /* - * Check length - */ - switch (Id) { + *pLen = sizeof(SK_PNP_CAPABILITIES); + return (SK_PNMI_ERR_TOO_SHORT); + } + break; - case OID_PNP_CAPABILITIES: - if (*pLen < sizeof(SK_PNP_CAPABILITIES)) { + case OID_PNP_SET_POWER: + case OID_PNP_QUERY_POWER: + if (*pLen < sizeof(SK_DEVICE_POWER_STATE)) + { + *pLen = sizeof(SK_DEVICE_POWER_STATE); + return (SK_PNMI_ERR_TOO_SHORT); + } + break; - *pLen = sizeof(SK_PNP_CAPABILITIES); - return (SK_PNMI_ERR_TOO_SHORT); - } - break; + case OID_PNP_ADD_WAKE_UP_PATTERN: + case OID_PNP_REMOVE_WAKE_UP_PATTERN: + if (*pLen < sizeof(SK_PM_PACKET_PATTERN)) { - case OID_PNP_QUERY_POWER: - case OID_PNP_ENABLE_WAKE_UP: - if (*pLen < sizeof(SK_U32)) { + *pLen = sizeof(SK_PM_PACKET_PATTERN); + return (SK_PNMI_ERR_TOO_SHORT); + } + break; - *pLen = sizeof(SK_U32); - return (SK_PNMI_ERR_TOO_SHORT); - } - break; + case OID_PNP_ENABLE_WAKE_UP: + if (*pLen < sizeof(SK_U32)) { - case OID_PNP_SET_POWER: - case OID_PNP_ADD_WAKE_UP_PATTERN: - case OID_PNP_REMOVE_WAKE_UP_PATTERN: - break; - - default: - SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR040, - SK_PNMI_ERR040MSG); - *pLen = 0; - return (SK_PNMI_ERR_GENERAL); - } + *pLen = sizeof(SK_U32); + return (SK_PNMI_ERR_TOO_SHORT); + } + break; + } + + /* + * Perform action + */ + if (Action == SK_PNMI_GET) { /* * Get value @@ -7865,11 +7877,12 @@ case OID_PNP_QUERY_POWER: /* The Windows DDK describes: An OID_PNP_QUERY_POWER requests - the miniport to indicate whether it can transition its NIC - to the low-power state. + the miniport to indicate whether it can transition its NIC + to the low-power state. A miniport driver must always return NDIS_STATUS_SUCCESS to a query of OID_PNP_QUERY_POWER. */ - RetCode = SK_PNMI_ERR_OK; + *pLen = sizeof(SK_DEVICE_POWER_STATE);; + RetCode = SK_PNMI_ERR_OK; break; /* NDIS handles these OIDs as write-only. @@ -7880,7 +7893,7 @@ case OID_PNP_ADD_WAKE_UP_PATTERN: case OID_PNP_REMOVE_WAKE_UP_PATTERN: *pLen = 0; - RetCode = SK_PNMI_ERR_OK; + RetCode = SK_PNMI_ERR_NOT_SUPPORTED; break; case OID_PNP_ENABLE_WAKE_UP: @@ -7892,41 +7905,9 @@ break; } - return (RetCode); + return (RetCode); } - /* - * From here SET or PRESET action. Check if the passed - * buffer length is plausible. - */ - switch (Id) { - case OID_PNP_SET_POWER: - case OID_PNP_ENABLE_WAKE_UP: - if (*pLen < sizeof(SK_U32)) { - - *pLen = sizeof(SK_U32); - return (SK_PNMI_ERR_TOO_SHORT); - } - if (*pLen != sizeof(SK_U32)) { - - *pLen = 0; - return (SK_PNMI_ERR_BAD_VALUE); - } - break; - - case OID_PNP_ADD_WAKE_UP_PATTERN: - case OID_PNP_REMOVE_WAKE_UP_PATTERN: - if (*pLen < sizeof(SK_PM_PACKET_PATTERN)) { - - *pLen = 0; - return (SK_PNMI_ERR_BAD_VALUE); - } - break; - - default: - *pLen = 0; - return (SK_PNMI_ERR_READ_ONLY); - } /* * Perform preset or set @@ -7934,7 +7915,7 @@ /* POWER module does not support PRESET action */ if (Action == SK_PNMI_PRESET) { - return (SK_PNMI_ERR_OK); + return (SK_PNMI_ERR_OK); } switch (Id) { @@ -7955,13 +7936,148 @@ break; default: - RetCode = SK_PNMI_ERR_GENERAL; + RetCode = SK_PNMI_ERR_READ_ONLY; } return (RetCode); } #endif /* SK_POWER_MGMT */ +#ifdef SK_DIAG_SUPPORT +/***************************************************************************** + * + * DiagActions - OID handler function of Diagnostic driver + * + * Description: + * The code is simple. No description necessary. + * + * Returns: + * SK_PNMI_ERR_OK The request was successfully performed. + * SK_PNMI_ERR_GENERAL A general severe internal error occured. + * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to contain + * the correct data (e.g. a 32bit value is + * needed, but a 16 bit value was passed). + * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't + * exist (e.g. port instance 3 on a two port + * adapter. + */ + +PNMI_STATIC int DiagActions( +SK_AC *pAC, /* Pointer to adapter context */ +SK_IOC IoC, /* IO context handle */ +int Action, /* GET/PRESET/SET action */ +SK_U32 Id, /* Object ID that is to be processed */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ +SK_U32 Instance, /* Instance (1..n) that is to be queried or -1 */ +unsigned int TableIndex, /* Index to the Id table */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ +{ + + SK_U32 RetCode = SK_PNMI_ERR_GENERAL; + + /* + * Check instance. We only handle single instance variables. + */ + if (Instance != (SK_U32)(-1) && Instance != 1) { + + *pLen = 0; + return (SK_PNMI_ERR_UNKNOWN_INST); + } + + /* + * Check length. + */ + switch (Id) { + + case OID_SKGE_DIAG_MODE: + if (*pLen < sizeof(SK_U32)) { + + *pLen = sizeof(SK_U32); + return (SK_PNMI_ERR_TOO_SHORT); + } + break; + + default: + SK_ERR_LOG(pAC, SK_ERRCL_SW, SK_PNMI_ERR040, SK_PNMI_ERR040MSG); + *pLen = 0; + return (SK_PNMI_ERR_GENERAL); + } + + /* Perform action. */ + + /* GET value. */ + if (Action == SK_PNMI_GET) { + + switch (Id) { + + case OID_SKGE_DIAG_MODE: + SK_PNMI_STORE_U32(pBuf, pAC->DiagModeActive); + *pLen = sizeof(SK_U32); + RetCode = SK_PNMI_ERR_OK; + break; + + default: + *pLen = 0; + RetCode = SK_PNMI_ERR_GENERAL; + break; + } + + return (RetCode); + } + + /* From here SET or PRESET value. */ + + /* PRESET value is not supported. */ + if (Action == SK_PNMI_PRESET) { + return (SK_PNMI_ERR_OK); + } + + /* SET value. */ + switch (Id) { + case OID_SKGE_DIAG_MODE: + + /* Handle the SET. */ + switch (*pBuf) { + + /* Enter the DIAG mode in the driver. */ + case 1: + /* If DiagMode is not active, we can enter it. */ + if (!pAC->DiagModeActive) { + + RetCode = SkDrvEnterDiagMode(pAC); + } + else { + + RetCode = SK_PNMI_ERR_GENERAL; + } + break; + + /* Leave the DIAG mode in the driver. */ + case 0: + RetCode = SkDrvLeaveDiagMode(pAC); + break; + + default: + RetCode = SK_PNMI_ERR_BAD_VALUE; + break; + } + break; + + default: + RetCode = SK_PNMI_ERR_GENERAL; + } + + if (RetCode == SK_PNMI_ERR_OK) { + *pLen = sizeof(SK_U32); + } + else { + + *pLen = 0; + } + return (RetCode); +} +#endif /* SK_DIAG_SUPPORT */ /***************************************************************************** * @@ -7977,7 +8093,7 @@ * the correct data (e.g. a 32bit value is * needed, but a 16 bit value was passed). * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't - * exist (e.g. port instance 3 on a two port + * exist (e.g. port instance 3 on a two port * adapter). * SK_PNMI_ERR_READ_ONLY Only the Get action is allowed. * @@ -7986,10 +8102,10 @@ PNMI_STATIC int Vct( SK_AC *pAC, /* Pointer to adapter context */ SK_IOC IoC, /* IO context handle */ -int Action, /* Get/PreSet/Set action */ +int Action, /* GET/PRESET/SET action */ SK_U32 Id, /* Object ID that is to be processed */ -char *pBuf, /* Buffer to which the mgmt data will be copied */ -unsigned int *pLen, /* On call: buffer length. On return: used buffer */ +char *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* On call: pBuf buffer length. On return: used buffer */ SK_U32 Instance, /* Instance (-1,2..n) that is to be queried */ unsigned int TableIndex, /* Index to the Id table */ SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ @@ -8001,7 +8117,6 @@ SK_U32 PhysPortIndex; SK_U32 Limit; SK_U32 Offset; - SK_BOOL Link; SK_U32 RetCode = SK_PNMI_ERR_GENERAL; int i; @@ -8034,7 +8149,8 @@ } Limit = PhysPortIndex + 1; } - else { /* + else { + /* * Instance == (SK_U32) (-1), get all Instances of that OID. * * Not implemented yet. May be used in future releases. @@ -8051,9 +8167,7 @@ Link = SK_FALSE; } - /* - * Check MAC type. - */ + /* Check MAC type */ if (pPrt->PhyType != SK_PHY_MARV_COPPER) { *pLen = 0; return (SK_PNMI_ERR_GENERAL); @@ -8062,13 +8176,9 @@ /* Initialize backup data pointer. */ pVctBackupData = &pAC->Pnmi.VctBackup[PhysPortIndex]; - /* - * Check action type. - */ + /* Check action type */ if (Action == SK_PNMI_GET) { - /* - * Check length. - */ + /* Check length */ switch (Id) { case OID_SKGE_VCT_GET: @@ -8090,14 +8200,12 @@ return (SK_PNMI_ERR_GENERAL); } - /* - * Get value. - */ + /* Get value */ Offset = 0; for (; PhysPortIndex < Limit; PhysPortIndex++) { switch (Id) { - case OID_SKGE_VCT_GET: + case OID_SKGE_VCT_GET: if ((Link == SK_FALSE) && (pAC->Pnmi.VctStatus[PhysPortIndex] & SK_PNMI_VCT_PENDING)) { RetCode = SkGmCableDiagStatus(pAC, IoC, PhysPortIndex, SK_FALSE); @@ -8171,9 +8279,7 @@ * buffer length is plausible. */ - /* - * Check length. - */ + /* Check length */ switch (Id) { case OID_SKGE_VCT_SET: if (*pLen < (Limit - PhysPortIndex) * sizeof(SK_U32)) { @@ -8254,7 +8360,6 @@ SK_GEPORT *pPrt; SK_PNMI_VCT *pVctData; SK_U32 RetCode; - SK_U8 LinkSpeedUsed; pPrt = &pAC->GIni.GP[PhysPortIndex]; @@ -8297,10 +8402,93 @@ } /* DSP only valid in 100/1000 modes. */ - LinkSpeedUsed = pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed; - if (LinkSpeedUsed != SK_LSPEED_STAT_10MBPS) { + if (pAC->GIni.GP[PhysPortIndex].PLinkSpeedUsed != + SK_LSPEED_STAT_10MBPS) { pVctData->VctStatus |= SK_PNMI_VCT_NEW_DSP_DATA; } } - } /* CheckVctStatus */ + + +/***************************************************************************** + * + * SkPnmiGenIoctl - Handles new generic PNMI IOCTL, calls the needed + * PNMI function depending on the subcommand and + * returns all data belonging to the complete database + * or OID request. + * + * Description: + * Looks up the requested subcommand, calls the corresponding handler + * function and passes all required parameters to it. + * The function is called by the driver. It is needed to handle the new + * generic PNMI IOCTL. This IOCTL is given to the driver and contains both + * the OID and a subcommand to decide what kind of request has to be done. + * + * Returns: + * SK_PNMI_ERR_OK The request was successfully performed + * SK_PNMI_ERR_GENERAL A general severe internal error occured + * SK_PNMI_ERR_TOO_SHORT The passed buffer is too short to take + * the data. + * SK_PNMI_ERR_UNKNOWN_OID The requested OID is unknown + * SK_PNMI_ERR_UNKNOWN_INST The requested instance of the OID doesn't + * exist (e.g. port instance 3 on a two port + * adapter. + */ +int SkPnmiGenIoctl( +SK_AC *pAC, /* Pointer to adapter context struct */ +SK_IOC IoC, /* I/O context */ +void *pBuf, /* Buffer used for the management data transfer */ +unsigned int *pLen, /* Length of buffer */ +SK_U32 NetIndex) /* NetIndex (0..n), in single net mode always zero */ +{ +SK_I32 Mode; /* Store value of subcommand. */ +SK_U32 Oid; /* Store value of OID. */ +int ReturnCode; /* Store return value to show status of PNMI action. */ +int HeaderLength; /* Length of desired action plus OID. */ + + ReturnCode = SK_PNMI_ERR_GENERAL; + + SK_MEMCPY(&Mode, pBuf, sizeof(SK_I32)); + SK_MEMCPY(&Oid, (char *) pBuf + sizeof(SK_I32), sizeof(SK_U32)); + HeaderLength = sizeof(SK_I32) + sizeof(SK_U32); + *pLen = *pLen - HeaderLength; + SK_MEMCPY((char *) pBuf + sizeof(SK_I32), (char *) pBuf + HeaderLength, *pLen); + + switch(Mode) { + case SK_GET_SINGLE_VAR: + ReturnCode = SkPnmiGetVar(pAC, IoC, Oid, + (char *) pBuf + sizeof(SK_I32), pLen, + ((SK_U32) (-1)), NetIndex); + SK_PNMI_STORE_U32(pBuf, ReturnCode); + *pLen = *pLen + sizeof(SK_I32); + break; + case SK_PRESET_SINGLE_VAR: + ReturnCode = SkPnmiPreSetVar(pAC, IoC, Oid, + (char *) pBuf + sizeof(SK_I32), pLen, + ((SK_U32) (-1)), NetIndex); + SK_PNMI_STORE_U32(pBuf, ReturnCode); + *pLen = *pLen + sizeof(SK_I32); + break; + case SK_SET_SINGLE_VAR: + ReturnCode = SkPnmiSetVar(pAC, IoC, Oid, + (char *) pBuf + sizeof(SK_I32), pLen, + ((SK_U32) (-1)), NetIndex); + SK_PNMI_STORE_U32(pBuf, ReturnCode); + *pLen = *pLen + sizeof(SK_I32); + break; + case SK_GET_FULL_MIB: + ReturnCode = SkPnmiGetStruct(pAC, IoC, pBuf, pLen, NetIndex); + break; + case SK_PRESET_FULL_MIB: + ReturnCode = SkPnmiPreSetStruct(pAC, IoC, pBuf, pLen, NetIndex); + break; + case SK_SET_FULL_MIB: + ReturnCode = SkPnmiSetStruct(pAC, IoC, pBuf, pLen, NetIndex); + break; + default: + break; + } + + return (ReturnCode); + +} /* SkGeIocGen */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skgesirq.c linux-2.4.23-pre8/drivers/net/sk98lin/skgesirq.c --- linux-2.4.22/drivers/net/sk98lin/skgesirq.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skgesirq.c 2003-10-22 22:47:29.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skgesirq.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.81 $ - * Date: $Date: 2002/12/05 10:49:51 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.91 $ + * Date: $Date: 2003/07/04 12:46:22 $ * Purpose: Special IRQ module * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,60 @@ * History: * * $Log: skgesirq.c,v $ + * 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 @@ -132,7 +187,7 @@ * 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 + * 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. @@ -353,26 +408,35 @@ * */ +#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) static const char SysKonnectFileId[] = - "$Id: skgesirq.c,v 1.81 2002/12/05 10:49:51 rschmidt Exp $" ; + "@(#) $Id: skgesirq.c,v 1.91 2003/07/04 12:46:22 rschmidt Exp $ (C) Marvell."; +#endif #include "h/skdrv1st.h" /* Driver Specific Definitions */ +#ifndef SK_SLIM #include "h/skgepnmi.h" /* PNMI Definitions */ #include "h/skrlmt.h" /* RLMT Definitions */ +#endif #include "h/skdrv2nd.h" /* Adapter Control and Driver specific Def. */ /* local function prototypes */ -static int SkGePortCheckUpXmac(SK_AC*, SK_IOC, int); -static int SkGePortCheckUpBcom(SK_AC*, SK_IOC, int); -static int SkGePortCheckUpGmac(SK_AC*, SK_IOC, int); +#ifdef GENESIS +static int SkGePortCheckUpXmac(SK_AC*, SK_IOC, int, SK_BOOL); +static int SkGePortCheckUpBcom(SK_AC*, SK_IOC, int, SK_BOOL); static void SkPhyIsrBcom(SK_AC*, SK_IOC, int, SK_U16); +#endif /* GENESIS */ +#ifdef YUKON +static int SkGePortCheckUpGmac(SK_AC*, SK_IOC, int, SK_BOOL); static void SkPhyIsrGmac(SK_AC*, SK_IOC, int, SK_U16); +#endif /* YUKON */ #ifdef OTHER_PHY -static int SkGePortCheckUpLone(SK_AC*, SK_IOC, int); -static int SkGePortCheckUpNat(SK_AC*, SK_IOC, int); +static int SkGePortCheckUpLone(SK_AC*, SK_IOC, int, SK_BOOL); +static int SkGePortCheckUpNat(SK_AC*, SK_IOC, int, SK_BOOL); static void SkPhyIsrLone(SK_AC*, SK_IOC, int, SK_U16); #endif /* OTHER_PHY */ +#ifdef GENESIS /* * array of Rx counter from XMAC which are checked * in AutoSense mode to check whether a link is not able to auto-negotiate. @@ -385,6 +449,7 @@ XM_RXF_1023B, XM_RXF_MAX_SZ } ; +#endif /* GENESIS */ #ifdef __C2MAN__ /* @@ -397,20 +462,13 @@ {} #endif -/* Define return codes of SkGePortCheckUp and CheckShort */ -#define SK_HW_PS_NONE 0 /* No action needed */ -#define SK_HW_PS_RESTART 1 /* Restart needed */ -#define SK_HW_PS_LINK 2 /* Link Up actions needed */ - /****************************************************************************** * * SkHWInitDefSense() - Default Autosensing mode initialization * - * Description: - * This function sets the PLinkMode for HWInit - * - * Note: + * Description: sets the PLinkMode for HWInit * + * Returns: N/A */ static void SkHWInitDefSense( SK_AC *pAC, /* adapter context */ @@ -438,17 +496,17 @@ } /* SkHWInitDefSense */ +#ifdef GENESIS /****************************************************************************** * - * SkHWSenseGetNext() - GetNextAutosensing Mode + * SkHWSenseGetNext() - Get Next Autosensing Mode * - * Description: - * This function handles the AutoSensing + * Description: gets the appropriate next mode * * Note: * */ -SK_U8 SkHWSenseGetNext( +static SK_U8 SkHWSenseGetNext( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ @@ -459,18 +517,18 @@ pPrt->PAutoNegTimeOut = 0; - if (pPrt->PLinkModeConf != SK_LMODE_AUTOSENSE) { + if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) { /* Leave all as configured */ return(pPrt->PLinkModeConf); } - if (pPrt->PLinkMode == SK_LMODE_AUTOFULL) { + if (pPrt->PLinkMode == (SK_U8)SK_LMODE_AUTOFULL) { /* Return next mode AUTOBOTH */ - return(SK_LMODE_AUTOBOTH); + return ((SK_U8)SK_LMODE_AUTOBOTH); } /* Return default autofull */ - return(SK_LMODE_AUTOFULL); + return ((SK_U8)SK_LMODE_AUTOFULL); } /* SkHWSenseGetNext */ @@ -478,13 +536,11 @@ * * SkHWSenseSetNext() - Autosensing Set next mode * - * Description: - * This function sets the appropriate next mode. - * - * Note: + * Description: sets the appropriate next mode * + * Returns: N/A */ -void SkHWSenseSetNext( +static void SkHWSenseSetNext( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ int Port, /* Port Index (MAC_1 + n) */ @@ -496,7 +552,7 @@ pPrt->PAutoNegTimeOut = 0; - if (pPrt->PLinkModeConf != SK_LMODE_AUTOSENSE) { + if (pPrt->PLinkModeConf != (SK_U8)SK_LMODE_AUTOSENSE) { return; } @@ -508,17 +564,16 @@ return; } /* SkHWSenseSetNext */ +#endif /* GENESIS */ /****************************************************************************** * * SkHWLinkDown() - Link Down handling * - * Description: - * This function handles the Hardware link down signal - * - * Note: + * Description: handles the hardware link down signal * + * Returns: N/A */ void SkHWLinkDown( SK_AC *pAC, /* adapter context */ @@ -538,7 +593,7 @@ /* Init default sense mode */ SkHWInitDefSense(pAC, IoC, Port); - if (!pPrt->PHWLinkUp) { + if (pPrt->PHWLinkUp == SK_FALSE) { return; } @@ -549,8 +604,8 @@ pPrt->PHWLinkUp = SK_FALSE; /* Reset Port stati */ - pPrt->PLinkModeStatus = SK_LMODE_STAT_UNKNOWN; - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE; + pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN; + pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE; pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_INDETERMINATED; /* Re-init Phy especially when the AutoSense default is set now */ @@ -568,11 +623,9 @@ * * SkHWLinkUp() - Link Up handling * - * Description: - * This function handles the Hardware link up signal - * - * Note: + * Description: handles the hardware link up signal * + * Returns: N/A */ void SkHWLinkUp( SK_AC *pAC, /* adapter context */ @@ -590,39 +643,52 @@ pPrt->PHWLinkUp = SK_TRUE; pPrt->PAutoNegFail = SK_FALSE; - pPrt->PLinkModeStatus = SK_LMODE_STAT_UNKNOWN; + pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN; - if (pPrt->PLinkMode != SK_LMODE_AUTOHALF && - pPrt->PLinkMode != SK_LMODE_AUTOFULL && - pPrt->PLinkMode != SK_LMODE_AUTOBOTH) { + if (pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOHALF && + pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOFULL && + pPrt->PLinkMode != (SK_U8)SK_LMODE_AUTOBOTH) { /* Link is up and no Auto-negotiation should be done */ - /* Configure Port */ - - /* link speed should be the configured one */ - pPrt->PLinkSpeedUsed = pPrt->PLinkSpeed; + /* Link speed should be the configured one */ + switch (pPrt->PLinkSpeed) { + case SK_LSPEED_AUTO: + /* default is 1000 Mbps */ + case SK_LSPEED_1000MBPS: + pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_1000MBPS; + break; + case SK_LSPEED_100MBPS: + pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_100MBPS; + break; + case SK_LSPEED_10MBPS: + pPrt->PLinkSpeedUsed = SK_LSPEED_STAT_10MBPS; + break; + } /* Set Link Mode Status */ if (pPrt->PLinkMode == SK_LMODE_FULL) { pPrt->PLinkModeStatus = SK_LMODE_STAT_FULL; } else { - pPrt->PLinkModeStatus = SK_LMODE_STAT_HALF; + pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_HALF; } /* No flow control without auto-negotiation */ - pPrt->PFlowCtrlStatus = SK_FLOW_STAT_NONE; + pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE; /* enable Rx/Tx */ - SkMacRxTxEnable(pAC, IoC, Port); + (void)SkMacRxTxEnable(pAC, IoC, Port); } } /* SkHWLinkUp */ /****************************************************************************** * - * SkMacParity - does everything to handle MAC parity errors correctly + * SkMacParity() - MAC parity workaround * + * Description: handles MAC parity errors correctly + * + * Returns: N/A */ static void SkMacParity( SK_AC *pAC, /* adapter context */ @@ -631,21 +697,29 @@ { SK_EVPARA Para; SK_GEPORT *pPrt; /* GIni Port struct pointer */ - SK_U32 TxMax; /* TxMax Counter */ + SK_U32 TxMax; /* Tx Max Size Counter */ pPrt = &pAC->GIni.GP[Port]; /* Clear IRQ Tx Parity Error */ +#ifdef GENESIS if (pAC->GIni.GIGenesis) { + SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_CLR_PERR); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* HW-Bug #8: cleared by GMF_CLI_TX_FC instead of GMF_CLI_TX_PE */ SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), - (SK_U8)((pAC->GIni.GIChipRev == 0) ? GMF_CLI_TX_FC : GMF_CLI_TX_PE)); + (SK_U8)((pAC->GIni.GIChipId == CHIP_ID_YUKON && + pAC->GIni.GIChipRev == 0) ? GMF_CLI_TX_FC : GMF_CLI_TX_PE)); } - +#endif /* YUKON */ + if (pPrt->PCheckPar) { + if (Port == MAC_1) { SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E016, SKERR_SIRQ_E016MSG); } @@ -654,6 +728,7 @@ } Para.Para64 = Port; SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); + Para.Para32[0] = Port; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); @@ -661,15 +736,21 @@ } /* Check whether frames with a size of 1k were sent */ +#ifdef GENESIS if (pAC->GIni.GIGenesis) { /* Snap statistic counters */ (void)SkXmUpdateStats(pAC, IoC, Port); (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXF_MAX_SZ, &TxMax); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + (void)SkGmMacStatistic(pAC, IoC, Port, GM_TXF_1518B, &TxMax); } +#endif /* YUKON */ if (TxMax > 0) { /* From now on check the parity */ @@ -680,11 +761,11 @@ /****************************************************************************** * - * Hardware Error service routine + * SkGeHwErr() - Hardware Error service routine * - * Description: + * Description: handles all HW Error interrupts * - * Notes: + * Returns: N/A */ static void SkGeHwErr( SK_AC *pAC, /* adapter context */ @@ -707,50 +788,62 @@ SK_IN16(IoC, PCI_C(PCI_STATUS), &Word); SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON); - SK_OUT16(IoC, PCI_C(PCI_STATUS), Word | PCI_ERRBITS); + SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS)); SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF); Para.Para64 = 0; SkEventQueue(pAC, SKGE_DRV, SK_DRV_ADAP_FAIL, Para); } +#ifdef GENESIS if (pAC->GIni.GIGenesis) { + if ((HwStatus & IS_NO_STAT_M1) != 0) { /* Ignore it */ /* This situation is also indicated in the descriptor */ SK_OUT16(IoC, MR_ADDR(MAC_1, RX_MFF_CTRL1), MFF_CLR_INSTAT); } - + if ((HwStatus & IS_NO_STAT_M2) != 0) { /* Ignore it */ /* This situation is also indicated in the descriptor */ SK_OUT16(IoC, MR_ADDR(MAC_2, RX_MFF_CTRL1), MFF_CLR_INSTAT); } - + if ((HwStatus & IS_NO_TIST_M1) != 0) { /* Ignore it */ /* This situation is also indicated in the descriptor */ SK_OUT16(IoC, MR_ADDR(MAC_1, RX_MFF_CTRL1), MFF_CLR_INTIST); } - + if ((HwStatus & IS_NO_TIST_M2) != 0) { /* Ignore it */ /* This situation is also indicated in the descriptor */ SK_OUT16(IoC, MR_ADDR(MAC_2, RX_MFF_CTRL1), MFF_CLR_INTIST); } } - else { /* YUKON */ +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* This is necessary only for Rx timing measurements */ if ((HwStatus & IS_IRQ_TIST_OV) != 0) { + /* increment Time Stamp Timer counter (high) */ + pAC->GIni.GITimeStampCnt++; + /* Clear Time Stamp Timer IRQ */ SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8)GMT_ST_CLR_IRQ); } if ((HwStatus & IS_IRQ_SENSOR) != 0) { - /* Clear I2C IRQ */ - SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); + /* no sensors on 32-bit Yukon */ + if (pAC->GIni.GIYukon32Bit) { + /* disable HW Error IRQ */ + pAC->GIni.GIValIrqMask &= ~IS_HW_ERR; + } } } +#endif /* YUKON */ if ((HwStatus & IS_RAM_RD_PAR) != 0) { SK_OUT16(IoC, B3_RI_CTRL, RI_CLR_RD_PERR); @@ -781,6 +874,7 @@ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E018, SKERR_SIRQ_E018MSG); Para.Para64 = MAC_1; SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); + Para.Para32[0] = MAC_1; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); } @@ -792,6 +886,7 @@ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E019, SKERR_SIRQ_E019MSG); Para.Para64 = MAC_2; SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para); + Para.Para32[0] = MAC_2; SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); } @@ -800,11 +895,11 @@ /****************************************************************************** * - * Interrupt service routine + * SkGeSirqIsr() - Special Interrupt Service Routine * - * Description: + * Description: handles all non data transfer specific interrupts (slow path) * - * Notes: + * Returns: N/A */ void SkGeSirqIsr( SK_AC *pAC, /* adapter context */ @@ -814,13 +909,10 @@ SK_EVPARA Para; SK_U32 RegVal32; /* Read register value */ SK_GEPORT *pPrt; /* GIni Port struct pointer */ - unsigned Len; - SK_U64 Octets; SK_U16 PhyInt; - SK_U16 PhyIMsk; int i; - if ((Istatus & IS_HW_ERR) != 0) { + if (((Istatus & IS_HW_ERR) & pAC->GIni.GIValIrqMask) != 0) { /* read the HW Error Interrupt source */ SK_IN32(IoC, B0_HWE_ISRC, &RegVal32); @@ -866,32 +958,47 @@ /* May be a normal situation in a server with a slow network */ SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_TX1); - /* - * workaround: if in half duplex mode, check for Tx hangup. - * Read number of TX'ed bytes, wait for 10 ms, then compare - * the number with current value. If nothing changed, we assume - * that Tx is hanging and do a FIFO flush (see event routine). - */ - if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || - pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) && - !pPrt->HalfDupTimerActive) { +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { /* - * many more pack. arb. timeouts may come in between, - * we ignore those + * workaround: if in half duplex mode, check for Tx hangup. + * Read number of TX'ed bytes, wait for 10 ms, then compare + * the number with current value. If nothing changed, we assume + * that Tx is hanging and do a FIFO flush (see event routine). */ - pPrt->HalfDupTimerActive = SK_TRUE; + if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || + pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) && + !pPrt->HalfDupTimerActive) { + /* + * many more pack. arb. timeouts may come in between, + * we ignore those + */ + pPrt->HalfDupTimerActive = SK_TRUE; +#ifdef XXX + Len = sizeof(SK_U64); + SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, + &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 0), + pAC->Rlmt.Port[0].Net->NetNumber); + + pPrt->LastOctets = Octets; +#endif /* XXX */ + /* Snap statistic counters */ + (void)SkXmUpdateStats(pAC, IoC, 0); - Len = sizeof(SK_U64); - SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, - &Len, (SK_U32) SK_PNMI_PORT_PHYS2INST(pAC, 0), - pAC->Rlmt.Port[0].Net->NetNumber); - - pPrt->LastOctets = Octets; - - Para.Para32[0] = 0; - SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME, - SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para); + (void)SkXmMacStatistic(pAC, IoC, 0, XM_TXO_OK_HI, &RegVal32); + + pPrt->LastOctets = (SK_U64)RegVal32 << 32; + + (void)SkXmMacStatistic(pAC, IoC, 0, XM_TXO_OK_LO, &RegVal32); + + pPrt->LastOctets += RegVal32; + + Para.Para32[0] = 0; + SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME, + SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para); + } } +#endif /* GENESIS */ } if ((Istatus & IS_PA_TO_TX2) != 0) { @@ -901,23 +1008,38 @@ /* May be a normal situation in a server with a slow network */ SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_TX2); - /* workaround: see above */ - if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || - pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) && - !pPrt->HalfDupTimerActive) { - pPrt->HalfDupTimerActive = SK_TRUE; - - Len = sizeof(SK_U64); - SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, - &Len, (SK_U32) SK_PNMI_PORT_PHYS2INST(pAC, 1), - pAC->Rlmt.Port[1].Net->NetNumber); - - pPrt->LastOctets = Octets; - - Para.Para32[0] = 1; - SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME, - SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para); +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + /* workaround: see above */ + if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || + pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) && + !pPrt->HalfDupTimerActive) { + pPrt->HalfDupTimerActive = SK_TRUE; +#ifdef XXX + Len = sizeof(SK_U64); + SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, + &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 1), + pAC->Rlmt.Port[1].Net->NetNumber); + + pPrt->LastOctets = Octets; +#endif /* XXX */ + /* Snap statistic counters */ + (void)SkXmUpdateStats(pAC, IoC, 1); + + (void)SkXmMacStatistic(pAC, IoC, 1, XM_TXO_OK_HI, &RegVal32); + + pPrt->LastOctets = (SK_U64)RegVal32 << 32; + + (void)SkXmMacStatistic(pAC, IoC, 1, XM_TXO_OK_LO, &RegVal32); + + pPrt->LastOctets += RegVal32; + + Para.Para32[0] = 1; + SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME, + SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para); + } } +#endif /* GENESIS */ } /* Check interrupts of the particular queues */ @@ -998,59 +1120,69 @@ continue; } - switch (pPrt->PhyType) { - - case SK_PHY_XMAC: - break; - - case SK_PHY_BCOM: - SkXmPhyRead(pAC, IoC, i, PHY_BCOM_INT_STAT, &PhyInt); - SkXmPhyRead(pAC, IoC, i, PHY_BCOM_INT_MASK, &PhyIMsk); - - if ((PhyInt & ~PhyIMsk) != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Port %d Bcom Int: 0x%04X Mask: 0x%04X\n", - i, PhyInt, PhyIMsk)); - SkPhyIsrBcom(pAC, IoC, i, PhyInt); +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + + switch (pPrt->PhyType) { + + case SK_PHY_XMAC: + break; + + case SK_PHY_BCOM: + SkXmPhyRead(pAC, IoC, i, PHY_BCOM_INT_STAT, &PhyInt); + + if ((PhyInt & ~PHY_B_DEF_MSK) != 0) { + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, + ("Port %d Bcom Int: 0x%04X\n", + i, PhyInt)); + SkPhyIsrBcom(pAC, IoC, i, PhyInt); + } + break; +#ifdef OTHER_PHY + case SK_PHY_LONE: + SkXmPhyRead(pAC, IoC, i, PHY_LONE_INT_STAT, &PhyInt); + + if ((PhyInt & PHY_L_DEF_MSK) != 0) { + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, + ("Port %d Lone Int: %x\n", + i, PhyInt)); + SkPhyIsrLone(pAC, IoC, i, PhyInt); + } + break; +#endif /* OTHER_PHY */ } - break; - - case SK_PHY_MARV_COPPER: - case SK_PHY_MARV_FIBER: + } +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + /* Read PHY Interrupt Status */ SkGmPhyRead(pAC, IoC, i, PHY_MARV_INT_STAT, &PhyInt); - SkGmPhyRead(pAC, IoC, i, PHY_MARV_INT_MASK, &PhyIMsk); - if ((PhyInt & PhyIMsk) != 0) { + if ((PhyInt & PHY_M_DEF_MSK) != 0) { SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Port %d Marv Int: 0x%04X Mask: 0x%04X\n", - i, PhyInt, PhyIMsk)); + ("Port %d Marv Int: 0x%04X\n", + i, PhyInt)); SkPhyIsrGmac(pAC, IoC, i, PhyInt); } - break; - -#ifdef OTHER_PHY - case SK_PHY_LONE: - SkXmPhyRead(pAC, IoC, i, PHY_LONE_INT_STAT, &PhyInt); - SkXmPhyRead(pAC, IoC, i, PHY_LONE_INT_ENAB, &PhyIMsk); - - if ((PhyInt & PhyIMsk) != 0) { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("Port %d Lone Int: %x Mask: %x\n", - i, PhyInt, PhyIMsk)); - SkPhyIsrLone(pAC, IoC, i, PhyInt); - } - break; - case SK_PHY_NAT: - /* todo: National */ - break; -#endif /* OTHER_PHY */ } +#endif /* YUKON */ } } /* I2C Ready interrupt */ if ((Istatus & IS_I2C_READY) != 0) { +#ifdef SK_SLIM + SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); +#else SkI2cIsr(pAC, IoC); +#endif + } + + /* SW forced interrupt */ + if ((Istatus & IS_IRQ_SW) != 0) { + /* clear the software IRQ */ + SK_OUT8(IoC, B0_CTST, CS_CL_SW_IRQ); } if ((Istatus & IS_LNK_SYNC_M1) != 0) { @@ -1085,20 +1217,30 @@ /* Timer interrupt (served last) */ if ((Istatus & IS_TIMINT) != 0) { + /* check for HW Errors */ + if (((Istatus & IS_HW_ERR) & ~pAC->GIni.GIValIrqMask) != 0) { + /* read the HW Error Interrupt source */ + SK_IN32(IoC, B0_HWE_ISRC, &RegVal32); + + SkGeHwErr(pAC, IoC, RegVal32); + } + SkHwtIsr(pAC, IoC); } + } /* SkGeSirqIsr */ +#ifdef GENESIS /****************************************************************************** * - * SkGePortCheckShorts - Implementing XMAC Workaround Errata # 2 + * SkGePortCheckShorts() - Implementing XMAC Workaround Errata # 2 * * return: * 0 o.k. nothing needed * 1 Restart needed on this port */ -static int SkGePortCheckShorts( +static int SkGePortCheckShorts( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* IO Context */ int Port) /* Which port should be checked */ @@ -1123,13 +1265,15 @@ (void)SkXmMacStatistic(pAC, IoC, Port, XM_RXE_SHT_ERR, &Shorts); /* - * Read Rx counter (packets seen on the network and not necessarily + * Read Rx counters (packets seen on the network and not necessarily * really received. */ RxCts = 0; for (i = 0; i < sizeof(SkGeRxRegs)/sizeof(SkGeRxRegs[0]); i++) { + (void)SkXmMacStatistic(pAC, IoC, Port, SkGeRxRegs[i], &RxTmp); + RxCts += (SK_U64)RxTmp; } @@ -1199,44 +1343,76 @@ return(Rtv); } /* SkGePortCheckShorts */ +#endif /* GENESIS */ /****************************************************************************** * - * SkGePortCheckUp - Implementation of the Workaround for Errata #2 + * SkGePortCheckUp() - Check if the link is up * * return: * 0 o.k. nothing needed * 1 Restart needed on this port * 2 Link came up */ -static int SkGePortCheckUp( +static int SkGePortCheckUp( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* IO Context */ int Port) /* Which port should be checked */ { - switch (pAC->GIni.GP[Port].PhyType) { - case SK_PHY_XMAC: - return(SkGePortCheckUpXmac(pAC, IoC, Port)); - case SK_PHY_BCOM: - return(SkGePortCheckUpBcom(pAC, IoC, Port)); - case SK_PHY_MARV_COPPER: - case SK_PHY_MARV_FIBER: - return(SkGePortCheckUpGmac(pAC, IoC, Port)); + SK_GEPORT *pPrt; /* GIni Port struct pointer */ + SK_BOOL AutoNeg; /* Is Auto-negotiation used ? */ + int Rtv; /* Return value */ + + Rtv = SK_HW_PS_NONE; + + pPrt = &pAC->GIni.GP[Port]; + + if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { + AutoNeg = SK_FALSE; + } + else { + AutoNeg = SK_TRUE; + } + +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + + switch (pPrt->PhyType) { + + case SK_PHY_XMAC: + Rtv = SkGePortCheckUpXmac(pAC, IoC, Port, AutoNeg); + break; + case SK_PHY_BCOM: + Rtv = SkGePortCheckUpBcom(pAC, IoC, Port, AutoNeg); + break; #ifdef OTHER_PHY - case SK_PHY_LONE: - return(SkGePortCheckUpLone(pAC, IoC, Port)); - case SK_PHY_NAT: - return(SkGePortCheckUpNat(pAC, IoC, Port)); + case SK_PHY_LONE: + Rtv = SkGePortCheckUpLone(pAC, IoC, Port, AutoNeg); + break; + case SK_PHY_NAT: + Rtv = SkGePortCheckUpNat(pAC, IoC, Port, AutoNeg); + break; #endif /* OTHER_PHY */ + } } - return(SK_HW_PS_NONE); +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + + Rtv = SkGePortCheckUpGmac(pAC, IoC, Port, AutoNeg); + } +#endif /* YUKON */ + + return(Rtv); } /* SkGePortCheckUp */ +#ifdef GENESIS /****************************************************************************** * - * SkGePortCheckUpXmac - Implementing of the Workaround Errata # 2 + * SkGePortCheckUpXmac() - Implementing of the Workaround Errata # 2 * * return: * 0 o.k. nothing needed @@ -1246,7 +1422,8 @@ static int SkGePortCheckUpXmac( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* IO Context */ -int Port) /* Which port should be checked */ +int Port, /* Which port should be checked */ +SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ { SK_U32 Shorts; /* Short Event Counter */ SK_GEPORT *pPrt; /* GIni Port struct pointer */ @@ -1257,7 +1434,6 @@ SK_U16 LpAb; /* Link Partner Ability */ SK_U16 ResAb; /* Resolved Ability */ SK_U16 ExtStat; /* Extended Status Register */ - SK_BOOL AutoNeg; /* Is Auto-negotiation used ? */ SK_U8 NextMode; /* Next AutoSensing Mode */ pPrt = &pAC->GIni.GP[Port]; @@ -1275,13 +1451,6 @@ pPrt->PIsave = 0; /* Now wait for each port's link */ - if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { - AutoNeg = SK_FALSE; - } - else { - AutoNeg = SK_TRUE; - } - if (pPrt->PLinkBroken) { /* Link was broken */ XM_IN32(IoC, Port, XM_GP_PORT, &GpReg); @@ -1291,6 +1460,7 @@ XM_IN16(IoC, Port, XM_ISRC, &Isrc); IsrcSum |= Isrc; SkXmAutoNegLipaXmac(pAC, IoC, Port, IsrcSum); + if ((Isrc & XM_IS_INP_ASS) == 0) { /* It has been in sync since last time */ /* Restart the PORT */ @@ -1329,7 +1499,7 @@ ("Do NOT restart on Port %d %x %x\n", Port, Isrc, IsrcSum)); } else { - pPrt->PIsave = IsrcSum & XM_IS_AND; + pPrt->PIsave = (SK_U16)(IsrcSum & XM_IS_AND); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, ("Save Sync/nosync Port %d %x %x\n", Port, Isrc, IsrcSum)); @@ -1370,6 +1540,7 @@ } else { SkXmAutoNegLipaXmac(pAC, IoC, Port, Isrc); + if (SkGePortCheckShorts(pAC, IoC, Port) == SK_HW_PS_RESTART) { return(SK_HW_PS_RESTART); } @@ -1389,7 +1560,7 @@ if ((GpReg & XM_GP_INP_ASS) != 0 || (IsrcSum & XM_IS_INP_ASS) != 0) { if ((GpReg & XM_GP_INP_ASS) == 0) { /* Save Auto-negotiation Done interrupt only if link is in sync */ - pPrt->PIsave = IsrcSum & XM_IS_AND; + pPrt->PIsave = (SK_U16)(IsrcSum & XM_IS_AND); } #ifdef DEBUG if ((pPrt->PIsave & XM_IS_AND) != 0) { @@ -1497,7 +1668,7 @@ /****************************************************************************** * - * SkGePortCheckUpBcom - Check, if the link is up + * SkGePortCheckUpBcom() - Check if the link is up on Bcom PHY * * return: * 0 o.k. nothing needed @@ -1505,9 +1676,10 @@ * 2 Link came up */ static int SkGePortCheckUpBcom( -SK_AC *pAC, /* Adapter Context */ -SK_IOC IoC, /* IO Context */ -int Port) /* Which port should be checked */ +SK_AC *pAC, /* Adapter Context */ +SK_IOC IoC, /* IO Context */ +int Port, /* Which port should be checked */ +SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ { SK_GEPORT *pPrt; /* GIni Port struct pointer */ int Done; @@ -1519,7 +1691,6 @@ SK_U16 LpAb; SK_U16 ExtStat; #endif /* DEBUG */ - SK_BOOL AutoNeg; /* Is Auto-negotiation used ? */ pPrt = &pAC->GIni.GP[Port]; @@ -1596,7 +1767,7 @@ if ((Isrc & (PHY_B_IS_NO_HDCL /* | PHY_B_IS_NO_HDC */)) != 0) { /* - * Workaround BCOM Errata: + * Workaround BCom Errata: * enable and disable loopback mode if "NO HCD" occurs. */ SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_CTRL, &Ctrl); @@ -1689,14 +1860,6 @@ } #endif /* DEBUG */ - /* Now wait for each port's link */ - if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { - AutoNeg = SK_FALSE; - } - else { - AutoNeg = SK_TRUE; - } - /* * Here we usually can check whether the link is in sync and * auto-negotiation is done. @@ -1707,7 +1870,7 @@ SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNeg: %d, PhyStat: 0x%04x\n", AutoNeg, PhyStat)); + ("AutoNeg: %d, PhyStat: 0x%04X\n", AutoNeg, PhyStat)); SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ResAb); @@ -1715,6 +1878,7 @@ /* Error */ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, ("Master/Slave Fault port %d\n", Port)); + pPrt->PAutoNegFail = SK_TRUE; pPrt->PMSStatus = SK_MS_STAT_FAULT; @@ -1729,7 +1893,7 @@ SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE; SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNeg: %d, PhyStat: 0x%04x\n", AutoNeg, PhyStat)); + ("Port %d, ResAb: 0x%04X\n", Port, ResAb)); if (AutoNeg) { if ((PhyStat & PHY_ST_AN_OVER) != 0) { @@ -1793,16 +1957,19 @@ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, ("Link sync(GP), Port %d\n", Port)); SkHWLinkUp(pAC, IoC, Port); + return(SK_HW_PS_LINK); } return(SK_HW_PS_NONE); } /* SkGePortCheckUpBcom */ +#endif /* GENESIS */ +#ifdef YUKON /****************************************************************************** * - * SkGePortCheckUpGmac - Check, if the link is up + * SkGePortCheckUpGmac() - Check if the link is up on Marvell PHY * * return: * 0 o.k. nothing needed @@ -1810,44 +1977,43 @@ * 2 Link came up */ static int SkGePortCheckUpGmac( -SK_AC *pAC, /* Adapter Context */ -SK_IOC IoC, /* IO Context */ -int Port) /* Which port should be checked */ +SK_AC *pAC, /* Adapter Context */ +SK_IOC IoC, /* IO Context */ +int Port, /* Which port should be checked */ +SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ { SK_GEPORT *pPrt; /* GIni Port struct pointer */ int Done; - SK_U16 Isrc; /* Interrupt source */ - SK_U16 PhyStat; /* Phy Status */ - SK_U16 PhySpecStat;/* Phy Specific Status */ + SK_U16 PhyIsrc; /* PHY Interrupt source */ + SK_U16 PhyStat; /* PPY Status */ + SK_U16 PhySpecStat;/* PHY Specific Status */ SK_U16 ResAb; /* Master/Slave resolution */ - SK_BOOL AutoNeg; /* Is Auto-negotiation used ? */ + SK_EVPARA Para; pPrt = &pAC->GIni.GP[Port]; /* Read PHY Interrupt Status */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &Isrc); + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_INT_STAT, &PhyIsrc); - if ((Isrc & PHY_M_IS_AN_COMPL) != 0) { - /* TBD */ + if ((PhyIsrc & PHY_M_IS_AN_COMPL) != 0) { + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("Auto-Negotiation Completed, PhyIsrc: 0x%04X\n", PhyIsrc)); } - if (pPrt->PHWLinkUp) { - return(SK_HW_PS_NONE); + if ((PhyIsrc & PHY_M_IS_LSP_CHANGE) != 0) { + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("Link Speed Changed, PhyIsrc: 0x%04X\n", PhyIsrc)); } - /* Now wait for each port's link */ - if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { - AutoNeg = SK_FALSE; - } - else { - AutoNeg = SK_TRUE; + if (pPrt->PHWLinkUp) { + return(SK_HW_PS_NONE); } /* Read PHY Status */ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_STAT, &PhyStat); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNeg: %d, PhyStat: 0x%04x\n", AutoNeg, PhyStat)); + ("AutoNeg: %d, PhyStat: 0x%04X\n", AutoNeg, PhyStat)); SkMacAutoNegLipaPhy(pAC, IoC, Port, PhyStat); @@ -1857,6 +2023,7 @@ /* Error */ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, ("Master/Slave Fault port %d\n", Port)); + pPrt->PAutoNegFail = SK_TRUE; pPrt->PMSStatus = SK_MS_STAT_FAULT; @@ -1867,12 +2034,24 @@ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &PhySpecStat); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNeg: %d, PhySpecStat: 0x%04x\n", AutoNeg, PhySpecStat)); + ("AutoNeg: %d, PhySpecStat: 0x%04X\n", AutoNeg, PhySpecStat)); if ((PhySpecStat & PHY_M_PS_LINK_UP) == 0) { return(SK_HW_PS_NONE); } + if ((PhySpecStat & PHY_M_PS_DOWNS_STAT) != 0 || + (PhyIsrc & PHY_M_IS_DOWNSH_DET) != 0) { + /* Downshift detected */ + SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E025, SKERR_SIRQ_E025MSG); + + Para.Para64 = Port; + SkEventQueue(pAC, SKGE_DRV, SK_DRV_DOWNSHIFT_DET, Para); + + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("Downshift detected, PhyIsrc: 0x%04X\n", PhyIsrc)); + } + pPrt->PMSStatus = ((ResAb & PHY_B_1000S_MSR) != 0) ? SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE; @@ -1913,12 +2092,13 @@ return(SK_HW_PS_NONE); } /* SkGePortCheckUpGmac */ +#endif /* YUKON */ #ifdef OTHER_PHY /****************************************************************************** * - * SkGePortCheckUpLone - Check if the link is up + * SkGePortCheckUpLone() - Check if the link is up on Level One PHY * * return: * 0 o.k. nothing needed @@ -1928,7 +2108,8 @@ static int SkGePortCheckUpLone( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* IO Context */ -int Port) /* Which port should be checked */ +int Port, /* Which port should be checked */ +SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ { SK_GEPORT *pPrt; /* GIni Port struct pointer */ int Done; @@ -1937,7 +2118,6 @@ SK_U16 ExtStat; /* Extended Status Register */ SK_U16 PhyStat; /* Phy Status Register */ SK_U16 StatSum; - SK_BOOL AutoNeg; /* Is Auto-negotiation used ? */ SK_U8 NextMode; /* Next AutoSensing Mode */ pPrt = &pAC->GIni.GP[Port]; @@ -1949,14 +2129,6 @@ StatSum = pPrt->PIsave; pPrt->PIsave = 0; - /* Now wait for each ports link */ - if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { - AutoNeg = SK_FALSE; - } - else { - AutoNeg = SK_TRUE; - } - /* * here we usually can check whether the link is in sync and * auto-negotiation is done. @@ -2049,6 +2221,7 @@ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, ("Link sync(GP), Port %d\n", Port)); SkHWLinkUp(pAC, IoC, Port); + return(SK_HW_PS_LINK); } @@ -2058,7 +2231,7 @@ /****************************************************************************** * - * SkGePortCheckUpNat - Check if the link is up + * SkGePortCheckUpNat() - Check if the link is up on National PHY * * return: * 0 o.k. nothing needed @@ -2068,7 +2241,8 @@ static int SkGePortCheckUpNat( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* IO Context */ -int Port) /* Which port should be checked */ +int Port, /* Which port should be checked */ +SK_BOOL AutoNeg) /* Is Auto-negotiation used ? */ { /* todo: National */ return(SK_HW_PS_NONE); @@ -2078,7 +2252,7 @@ /****************************************************************************** * - * Event service routine + * SkGeSirqEvent() - Event Service Routine * * Description: * @@ -2090,13 +2264,14 @@ SK_U32 Event, /* Module specific Event */ SK_EVPARA Para) /* Event specific Parameter */ { - SK_U64 Octets; SK_GEPORT *pPrt; /* GIni Port struct pointer */ SK_U32 Port; - SK_U32 Time; - unsigned Len; + SK_U32 Val32; int PortStat; SK_U8 Val8; +#ifdef GENESIS + SK_U64 Octets; +#endif /* GENESIS */ Port = Para.Para32[0]; pPrt = &pAC->GIni.GP[Port]; @@ -2104,15 +2279,13 @@ switch (Event) { case SK_HWEV_WATIM: /* Check whether port came up */ - PortStat = SkGePortCheckUp(pAC, IoC, Port); + PortStat = SkGePortCheckUp(pAC, IoC, (int)Port); switch (PortStat) { case SK_HW_PS_RESTART: if (pPrt->PHWLinkUp) { - /* - * Set Link to down. - */ - SkHWLinkDown(pAC, IoC, Port); + /* Set Link to down */ + SkHWLinkDown(pAC, IoC, (int)Port); /* * Signal directly to RLMT to ensure correct @@ -2129,20 +2302,19 @@ /* Signal to RLMT */ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_UP, Para); break; - } /* Start again the check Timer */ if (pPrt->PHWLinkUp) { - Time = SK_WA_ACT_TIME; + Val32 = SK_WA_ACT_TIME; } else { - Time = SK_WA_INA_TIME; + Val32 = SK_WA_INA_TIME; } /* Todo: still needed for non-XMAC PHYs??? */ /* Start workaround Errata #2 timer */ - SkTimerStart(pAC, IoC, &pPrt->PWaTimer, Time, + SkTimerStart(pAC, IoC, &pPrt->PWaTimer, Val32, SKGE_HWAC, SK_HWEV_WATIM, Para); break; @@ -2155,7 +2327,7 @@ SkRlmtEvent(pAC, IoC, SK_RLMT_LINK_DOWN, Para); } - SkHWLinkDown(pAC, IoC, Port); + SkHWLinkDown(pAC, IoC, (int)Port); /* Schedule Port RESET */ SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_RESET, Para); @@ -2177,7 +2349,7 @@ /* Stop Workaround Timer */ SkTimerStop(pAC, IoC, &pPrt->PWaTimer); - SkHWLinkDown(pAC, IoC, Port); + SkHWLinkDown(pAC, IoC, (int)Port); break; case SK_HWEV_UPDATE_STAT: @@ -2224,7 +2396,7 @@ } Val8 = (SK_U8)Para.Para32[1]; if (pPrt->PMSMode != Val8) { - /* Set New link mode */ + /* Set New Role (Master/Slave) mode */ pPrt->PMSMode = Val8; /* Restart Port */ @@ -2248,26 +2420,41 @@ } break; +#ifdef GENESIS case SK_HWEV_HALFDUP_CHK: - /* - * half duplex hangup workaround. - * See packet arbiter timeout interrupt for description - */ - pPrt->HalfDupTimerActive = SK_FALSE; - if (pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || - pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) { - - Len = sizeof(SK_U64); - SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, - &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, Port), - pAC->Rlmt.Port[Port].Net->NetNumber); - - if (pPrt->LastOctets == Octets) { - /* Tx hanging, a FIFO flush restarts it */ - SkMacFlushTxFifo(pAC, IoC, Port); + if (pAC->GIni.GIGenesis) { + /* + * half duplex hangup workaround. + * See packet arbiter timeout interrupt for description + */ + pPrt->HalfDupTimerActive = SK_FALSE; + if (pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF || + pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) { +#ifdef XXX + Len = sizeof(SK_U64); + SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets, + &Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, Port), + pAC->Rlmt.Port[Port].Net->NetNumber); +#endif /* XXX */ + /* Snap statistic counters */ + (void)SkXmUpdateStats(pAC, IoC, Port); + + (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXO_OK_HI, &Val32); + + Octets = (SK_U64)Val32 << 32; + + (void)SkXmMacStatistic(pAC, IoC, Port, XM_TXO_OK_LO, &Val32); + + Octets += Val32; + + if (pPrt->LastOctets == Octets) { + /* Tx hanging, a FIFO flush restarts it */ + SkMacFlushTxFifo(pAC, IoC, Port); + } } } break; +#endif /* GENESIS */ default: SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_SIRQ_E001, SKERR_SIRQ_E001MSG); @@ -2278,11 +2465,12 @@ } /* SkGeSirqEvent */ +#ifdef GENESIS /****************************************************************************** * - * SkPhyIsrBcom - PHY interrupt service routine + * SkPhyIsrBcom() - PHY interrupt service routine * - * Description: handle all interrupts from BCOM PHY + * Description: handles all interrupts from BCom PHY * * Returns: N/A */ @@ -2299,15 +2487,15 @@ if ((IStatus & PHY_B_IS_PSE) != 0) { /* Incorrectable pair swap error */ - SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E022, + SK_ERR_LOG(pAC, SK_ERRCL_HW | SK_ERRCL_INIT, SKERR_SIRQ_E022, SKERR_SIRQ_E022MSG); } if ((IStatus & (PHY_B_IS_AN_PR | PHY_B_IS_LST_CHANGE)) != 0) { - Para.Para32[0] = (SK_U32)Port; SkHWLinkDown(pAC, IoC, Port); + Para.Para32[0] = (SK_U32)Port; /* Signal to RLMT */ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); @@ -2317,13 +2505,15 @@ } } /* SkPhyIsrBcom */ +#endif /* GENESIS */ +#ifdef YUKON /****************************************************************************** * - * SkPhyIsrGmac - PHY interrupt service routine + * SkPhyIsrGmac() - PHY interrupt service routine * - * Description: handle all interrupts from Marvell PHY + * Description: handles all interrupts from Marvell PHY * * Returns: N/A */ @@ -2335,14 +2525,27 @@ { SK_GEPORT *pPrt; /* GIni Port struct pointer */ SK_EVPARA Para; + SK_U16 Word; pPrt = &pAC->GIni.GP[Port]; if ((IStatus & (PHY_M_IS_AN_PR | PHY_M_IS_LST_CHANGE)) != 0) { - Para.Para32[0] = (SK_U32)Port; SkHWLinkDown(pAC, IoC, Port); + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_ADV, &Word); + + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("AutoNeg.Adv: 0x%04X\n", Word)); + + /* Set Auto-negotiation advertisement */ + if (pPrt->PFlowCtrlMode == SK_FLOW_MODE_SYM_OR_REM) { + /* restore Asymmetric Pause bit */ + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_AUNE_ADV, + (SK_U16)(Word | PHY_M_AN_ASP)); + } + + Para.Para32[0] = (SK_U32)Port; /* Signal to RLMT */ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); } @@ -2352,23 +2555,21 @@ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E023, SKERR_SIRQ_E023MSG); } - if ((IStatus & PHY_M_IS_LSP_CHANGE) != 0) { - /* TBD */ - } - if ((IStatus & PHY_M_IS_FIFO_ERROR) != 0) { /* FIFO Overflow/Underrun Error */ SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_SIRQ_E024, SKERR_SIRQ_E024MSG); } + } /* SkPhyIsrGmac */ +#endif /* YUKON */ #ifdef OTHER_PHY /****************************************************************************** * - * SkPhyIsrLone - PHY interrupt service routine + * SkPhyIsrLone() - PHY interrupt service routine * - * Description: handle all interrupts from LONE PHY + * Description: handles all interrupts from LONE PHY * * Returns: N/A */ @@ -2381,10 +2582,11 @@ SK_EVPARA Para; if (IStatus & (PHY_L_IS_DUP | PHY_L_IS_ISOL)) { + SkHWLinkDown(pAC, IoC, Port); - /* Signal to RLMT */ Para.Para32[0] = (SK_U32)Port; + /* Signal to RLMT */ SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/ski2c.c linux-2.4.23-pre8/drivers/net/sk98lin/ski2c.c --- linux-2.4.22/drivers/net/sk98lin/ski2c.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/ski2c.c 2003-10-22 22:47:28.000000000 +0000 @@ -2,15 +2,15 @@ * * Name: ski2c.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.56 $ - * Date: $Date: 2002/12/19 14:20:41 $ + * Version: $Revision: 1.57 $ + * Date: $Date: 2003/01/28 09:17:38 $ * Purpose: Functions to access Voltage and Temperature Sensor * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -26,6 +26,10 @@ * History: * * $Log: ski2c.c,v $ + * 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(). @@ -228,7 +232,7 @@ * I2C Protocol */ static const char SysKonnectFileId[] = - "$Id: ski2c.c,v 1.56 2002/12/19 14:20:41 rschmidt Exp $"; + "$Id: ski2c.c,v 1.57 2003/01/28 09:17:38 rschmidt Exp $"; #include "h/skdrv1st.h" /* Driver Specific Definitions */ #include "h/lm80.h" @@ -249,7 +253,7 @@ The Genesis has 2 I2C buses. One for the EEPROM which holds the VPD Data and one for temperature and voltage sensor. The following picture shows the I2C buses, I2C devices and - there control registers. + their control registers. Note: The VPD functions are in skvpd.c . @@ -314,23 +318,23 @@ * If new devices are added to the I2C bus the timing values have to be checked. */ #ifndef I2C_SLOW_TIMING -#define T_CLK_LOW 1300L /* clock low time in ns */ -#define T_CLK_HIGH 600L /* clock high time in ns */ +#define T_CLK_LOW 1300L /* clock low time in ns */ +#define T_CLK_HIGH 600L /* clock high time in ns */ #define T_DATA_IN_SETUP 100L /* data in Set-up Time */ #define T_START_HOLD 600L /* start condition hold time */ #define T_START_SETUP 600L /* start condition Set-up time */ #define T_STOP_SETUP 600L /* stop condition Set-up time */ -#define T_BUS_IDLE 1300L /* time the bus must free after Tx */ +#define T_BUS_IDLE 1300L /* time the bus must free after Tx */ #define T_CLK_2_DATA_OUT 900L /* max. clock low to data output valid */ #else /* I2C_SLOW_TIMING */ /* I2C Standard Mode Timing */ -#define T_CLK_LOW 4700L /* clock low time in ns */ -#define T_CLK_HIGH 4000L /* clock high time in ns */ +#define T_CLK_LOW 4700L /* clock low time in ns */ +#define T_CLK_HIGH 4000L /* clock high time in ns */ #define T_DATA_IN_SETUP 250L /* data in Set-up Time */ #define T_START_HOLD 4000L /* start condition hold time */ #define T_START_SETUP 4700L /* start condition Set-up time */ #define T_STOP_SETUP 4000L /* stop condition Set-up time */ -#define T_BUS_IDLE 4700L /* time the bus must free after Tx */ +#define T_BUS_IDLE 4700L /* time the bus must free after Tx */ #endif /* !I2C_SLOW_TIMING */ #define NS2BCLK(x) (((x)*125)/10000) @@ -858,18 +862,18 @@ pPrt = &pAC->GIni.GP[0]; - switch (pPrt->PhyType) { - case SK_PHY_BCOM: - if (pAC->GIni.GIMacsFound == 1) { - pAC->I2c.MaxSens += 1; - } - else { - pAC->I2c.MaxSens += 3; + if (pAC->GIni.GIGenesis) { + if (pPrt->PhyType == SK_PHY_BCOM) { + if (pAC->GIni.GIMacsFound == 1) { + pAC->I2c.MaxSens += 1; + } + else { + pAC->I2c.MaxSens += 3; + } } - break; - case SK_PHY_MARV_COPPER: + } + else { pAC->I2c.MaxSens += 3; - break; } for (i = 0; i < pAC->I2c.MaxSens; i++) { @@ -912,14 +916,23 @@ pAC->I2c.SenTable[i].SenReg = LM80_VT2_IN; break; case 4: - if (pPrt->PhyType == SK_PHY_BCOM) { - pAC->I2c.SenTable[i].SenDesc = "Voltage PHY A PLL"; - pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; - pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; - pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; - pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; + if (pAC->GIni.GIGenesis) { + if (pPrt->PhyType == SK_PHY_BCOM) { + pAC->I2c.SenTable[i].SenDesc = "Voltage PHY A PLL"; + pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; + pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; + pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; + pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; + } + else { + pAC->I2c.SenTable[i].SenDesc = "Voltage PMA"; + pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; + pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; + pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; + pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; + } } - else if (pPrt->PhyType == SK_PHY_MARV_COPPER) { + else { pAC->I2c.SenTable[i].SenDesc = "Voltage VAUX"; pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_VAUX_3V3_HIGH_ERR; pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_VAUX_3V3_HIGH_WARN; @@ -932,40 +945,33 @@ pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VAUX_0V_WARN_ERR; } } - else { - pAC->I2c.SenTable[i].SenDesc = "Voltage PMA"; - pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; - pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; - pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; - pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; - } pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; pAC->I2c.SenTable[i].SenReg = LM80_VT3_IN; break; case 5: - if (pPrt->PhyType == SK_PHY_MARV_COPPER) { - pAC->I2c.SenTable[i].SenDesc = "Voltage ASIC-Co 1V5"; - pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR; - pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN; - pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN; - pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR; - } - else { + if (pAC->GIni.GIGenesis) { pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5"; pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR; pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN; pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN; pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR; } + else { + pAC->I2c.SenTable[i].SenDesc = "Voltage ASIC-Co 1V5"; + pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR; + pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN; + pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN; + pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR; + } pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; pAC->I2c.SenTable[i].SenReg = LM80_VT4_IN; break; case 6: - if (pPrt->PhyType == SK_PHY_MARV_COPPER) { - pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 3V3"; + if (pAC->GIni.GIGenesis) { + pAC->I2c.SenTable[i].SenDesc = "Voltage PHY B PLL"; } else { - pAC->I2c.SenTable[i].SenDesc = "Voltage PHY B PLL"; + pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 3V3"; } pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; @@ -975,16 +981,7 @@ pAC->I2c.SenTable[i].SenReg = LM80_VT5_IN; break; case 7: - if (pPrt->PhyType == SK_PHY_MARV_COPPER) { - pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5"; - pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; - pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR; - pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN; - pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN; - pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR; - pAC->I2c.SenTable[i].SenReg = LM80_VT6_IN; - } - else { + if (pAC->GIni.GIGenesis) { pAC->I2c.SenTable[i].SenDesc = "Speed Fan"; pAC->I2c.SenTable[i].SenType = SK_SEN_FAN; pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_FAN_HIGH_ERR; @@ -993,6 +990,15 @@ pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_FAN_LOW_ERR; pAC->I2c.SenTable[i].SenReg = LM80_FAN2_IN; } + else { + pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5"; + pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT; + pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR; + pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN; + pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN; + pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR; + pAC->I2c.SenTable[i].SenReg = LM80_VT6_IN; + } break; default: SK_ERR_LOG(pAC, SK_ERRCL_INIT | SK_ERRCL_SW, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skproc.c linux-2.4.23-pre8/drivers/net/sk98lin/skproc.c --- linux-2.4.22/drivers/net/sk98lin/skproc.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skproc.c 2003-10-22 22:47:39.000000000 +0000 @@ -2,15 +2,15 @@ * * Name: skproc.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.3 $ - * Date: $Date: 2002/10/02 12:59:51 $ + * Version: $Revision: 1.2 $ + * Date: $Date: 2003/08/12 16:45:29 $ * Purpose: Funktions to display statictic data * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -28,6 +28,28 @@ * History: * * $Log: skproc.c,v $ + * 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 @@ -71,29 +93,22 @@ #include "h/skdrv1st.h" #include "h/skdrv2nd.h" -#define ZEROPAD 1 /* pad with zero */ -#define SIGN 2 /* unsigned/signed long */ -#define PLUS 4 /* show plus */ -#define SPACE 8 /* space if plus */ -#define LEFT 16 /* left justified */ -#define SPECIALX 32 /* 0x */ -#define LARGE 64 - -extern SK_AC *pACList; -extern struct net_device *SkGeRootDev; - -extern char * SkNumber( - char * str, - long long num, - int base, - int size, - int precision, - int type); + + extern struct net_device *SkGeRootDev; + + +int sk_proc_read(char *buffer, + char **buffer_location, + off_t offset, + int buffer_length, + int *eof, + void *data); + /***************************************************************************** * - * proc_read - print "summaries" entry + * sk_proc_read - print "summaries" entry * * Description: * This function fills the proc entry with statistic data about @@ -103,7 +118,7 @@ * Returns: buffer with statistic data * */ -int proc_read(char *buffer, +int sk_proc_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, @@ -115,9 +130,8 @@ int i; DEV_NET *pNet; SK_AC *pAC; - char test_buf[100]; char sens_msg[50]; - unsigned long Flags; + unsigned long Flags; unsigned int Size; struct SK_NET_DEVICE *next; struct SK_NET_DEVICE *SkgeProcDev = SkGeRootDev; @@ -225,13 +239,11 @@ "\nReceive statistics\n\n"); len += sprintf(buffer + len, - "Received bytes %s\n", - SkNumber(test_buf, pPnmiStat->StatRxOctetsOkCts, - 10,0,-1,0)); - len += sprintf(buffer + len, - "Received packets %s\n", - SkNumber(test_buf, pPnmiStat->StatRxOkCts, - 10,0,-1,0)); + "Received bytes %Ld\n", + (unsigned long long) pPnmiStat->StatRxOctetsOkCts); + len += sprintf(buffer + len, + "Received packets %Ld\n", + (unsigned long long) pPnmiStat->StatRxOkCts); #if 0 if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && pAC->HWRevision < 12) { @@ -245,71 +257,56 @@ pPnmiStat->StatRxTooLongCts; len += sprintf(buffer + len, - "Receive errors %s\n", - SkNumber(test_buf, pPnmiStruct->InErrorsCts, - 10,0,-1,0)); - len += sprintf(buffer + len, - "Receive drops %s\n", - SkNumber(test_buf, pPnmiStruct->RxNoBufCts, - 10,0,-1,0)); - len += sprintf(buffer + len, - "Received multicast %s\n", - SkNumber(test_buf, pPnmiStat->StatRxMulticastOkCts, - 10,0,-1,0)); + "Receive errors %Ld\n", + (unsigned long long) pPnmiStruct->InErrorsCts); + len += sprintf(buffer + len, + "Receive dropped %Ld\n", + (unsigned long long) pPnmiStruct->RxNoBufCts); + len += sprintf(buffer + len, + "Received multicast %Ld\n", + (unsigned long long) pPnmiStat->StatRxMulticastOkCts); len += sprintf(buffer + len, "Receive error types\n"); len += sprintf(buffer + len, - " length %s\n", - SkNumber(test_buf, pPnmiStat->StatRxRuntCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " buffer overflow %s\n", - SkNumber(test_buf, pPnmiStat->StatRxFifoOverflowCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " bad crc %s\n", - SkNumber(test_buf, pPnmiStat->StatRxFcsCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " framing %s\n", - SkNumber(test_buf, pPnmiStat->StatRxFramingCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " missed frames %s\n", - SkNumber(test_buf, pPnmiStat->StatRxMissedCts, - 10, 0, -1, 0)); + " length %Ld\n", + (unsigned long long) pPnmiStat->StatRxRuntCts); + len += sprintf(buffer + len, + " buffer overflow %Ld\n", + (unsigned long long) pPnmiStat->StatRxFifoOverflowCts); + len += sprintf(buffer + len, + " bad crc %Ld\n", + (unsigned long long) pPnmiStat->StatRxFcsCts); + len += sprintf(buffer + len, + " framing %Ld\n", + (unsigned long long) pPnmiStat->StatRxFramingCts); + len += sprintf(buffer + len, + " missed frames %Ld\n", + (unsigned long long) pPnmiStat->StatRxMissedCts); if (pNet->Mtu > 1500) pPnmiStat->StatRxTooLongCts = 0; len += sprintf(buffer + len, - " too long %s\n", - SkNumber(test_buf, pPnmiStat->StatRxTooLongCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " carrier extension %s\n", - SkNumber(test_buf, pPnmiStat->StatRxCextCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " too short %s\n", - SkNumber(test_buf, pPnmiStat->StatRxShortsCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " symbol %s\n", - SkNumber(test_buf, pPnmiStat->StatRxSymbolCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " LLC MAC size %s\n", - SkNumber(test_buf, pPnmiStat->StatRxIRLengthCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " carrier event %s\n", - SkNumber(test_buf, pPnmiStat->StatRxCarrierCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " jabber %s\n", - SkNumber(test_buf, pPnmiStat->StatRxJabberCts, - 10, 0, -1, 0)); + " too long %Ld\n", + (unsigned long long) pPnmiStat->StatRxTooLongCts); + len += sprintf(buffer + len, + " carrier extension %Ld\n", + (unsigned long long) pPnmiStat->StatRxCextCts); + len += sprintf(buffer + len, + " too short %Ld\n", + (unsigned long long) pPnmiStat->StatRxShortsCts); + len += sprintf(buffer + len, + " symbol %Ld\n", + (unsigned long long) pPnmiStat->StatRxSymbolCts); + len += sprintf(buffer + len, + " LLC MAC size %Ld\n", + (unsigned long long) pPnmiStat->StatRxIRLengthCts); + len += sprintf(buffer + len, + " carrier event %Ld\n", + (unsigned long long) pPnmiStat->StatRxCarrierCts); + len += sprintf(buffer + len, + " jabber %Ld\n", + (unsigned long long) pPnmiStat->StatRxJabberCts); /*Transmit statistics */ @@ -317,42 +314,34 @@ "\nTransmit statistics\n\n"); len += sprintf(buffer + len, - "Transmited bytes %s\n", - SkNumber(test_buf, pPnmiStat->StatTxOctetsOkCts, - 10,0,-1,0)); - len += sprintf(buffer + len, - "Transmited packets %s\n", - SkNumber(test_buf, pPnmiStat->StatTxOkCts, - 10,0,-1,0)); - len += sprintf(buffer + len, - "Transmit errors %s\n", - SkNumber(test_buf, pPnmiStat->StatTxSingleCollisionCts, - 10,0,-1,0)); - len += sprintf(buffer + len, - "Transmit dropped %s\n", - SkNumber(test_buf, pPnmiStruct->TxNoBufCts, - 10,0,-1,0)); - len += sprintf(buffer + len, - "Transmit collisions %s\n", - SkNumber(test_buf, pPnmiStat->StatTxSingleCollisionCts, - 10,0,-1,0)); + "Transmited bytes %Ld\n", + (unsigned long long) pPnmiStat->StatTxOctetsOkCts); len += sprintf(buffer + len, - "Transmit errors types\n"); + "Transmited packets %Ld\n", + (unsigned long long) pPnmiStat->StatTxOkCts); + len += sprintf(buffer + len, + "Transmit errors %Ld\n", + (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); + len += sprintf(buffer + len, + "Transmit dropped %Ld\n", + (unsigned long long) pPnmiStruct->TxNoBufCts); + len += sprintf(buffer + len, + "Transmit collisions %Ld\n", + (unsigned long long) pPnmiStat->StatTxSingleCollisionCts); + len += sprintf(buffer + len, + "Transmit error types\n"); len += sprintf(buffer + len, " excessive collision %ld\n", pAC->stats.tx_aborted_errors); len += sprintf(buffer + len, - " carrier %s\n", - SkNumber(test_buf, pPnmiStat->StatTxCarrierCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " fifo underrun %s\n", - SkNumber(test_buf, pPnmiStat->StatTxFifoUnderrunCts, - 10, 0, -1, 0)); - len += sprintf(buffer + len, - " heartbeat %s\n", - SkNumber(test_buf, pPnmiStat->StatTxCarrierCts, - 10, 0, -1, 0)); + " carrier %Ld\n", + (unsigned long long) pPnmiStat->StatTxCarrierCts); + len += sprintf(buffer + len, + " fifo underrun %Ld\n", + (unsigned long long) pPnmiStat->StatTxFifoUnderrunCts); + len += sprintf(buffer + len, + " heartbeat %Ld\n", + (unsigned long long) pPnmiStat->StatTxCarrierCts); len += sprintf(buffer + len, " window %ld\n", pAC->stats.tx_window_errors); @@ -374,139 +363,3 @@ } - - - -/***************************************************************************** - * - * SkDoDiv - convert 64bit number - * - * Description: - * This function "converts" a long long number. - * - * Returns: - * remainder of division - */ -static long SkDoDiv (long long Dividend, int Divisor, long long *pErg) -{ - long Rest; - long long Ergebnis; - long Akku; - - - Akku = Dividend >> 32; - - Ergebnis = ((long long) (Akku / Divisor)) << 32; - Rest = Akku % Divisor ; - - Akku = Rest << 16; - Akku |= ((Dividend & 0xFFFF0000) >> 16); - - - Ergebnis += ((long long) (Akku / Divisor)) << 16; - Rest = Akku % Divisor ; - - Akku = Rest << 16; - Akku |= (Dividend & 0xFFFF); - - Ergebnis += (Akku / Divisor); - Rest = Akku % Divisor ; - - *pErg = Ergebnis; - return (Rest); -} - - -#if 0 -#define do_div(n,base) ({ \ -long long __res; \ -__res = ((unsigned long long) n) % (unsigned) base; \ -n = ((unsigned long long) n) / (unsigned) base; \ -__res; }) - -#endif - - -/***************************************************************************** - * - * SkNumber - Print results - * - * Description: - * This function converts a long long number into a string. - * - * Returns: - * number as string - */ -char * SkNumber(char * str, long long num, int base, int size, int precision - ,int type) -{ - char c,sign,tmp[66], *strorg = str; - const char *digits="0123456789abcdefghijklmnopqrstuvwxyz"; - int i; - - if (type & LARGE) - digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - if (type & LEFT) - type &= ~ZEROPAD; - if (base < 2 || base > 36) - return 0; - c = (type & ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & SIGN) { - if (num < 0) { - sign = '-'; - num = -num; - size--; - } else if (type & PLUS) { - sign = '+'; - size--; - } else if (type & SPACE) { - sign = ' '; - size--; - } - } - if (type & SPECIALX) { - if (base == 16) - size -= 2; - else if (base == 8) - size--; - } - i = 0; - if (num == 0) - tmp[i++]='0'; - else while (num != 0) - tmp[i++] = digits[SkDoDiv(num,base, &num)]; - - if (i > precision) - precision = i; - size -= precision; - if (!(type&(ZEROPAD+LEFT))) - while(size-->0) - *str++ = ' '; - if (sign) - *str++ = sign; - if (type & SPECIALX) { - if (base==8) - *str++ = '0'; - else if (base==16) { - *str++ = '0'; - *str++ = digits[33]; - } - } - if (!(type & LEFT)) - while (size-- > 0) - *str++ = c; - while (i < precision--) - *str++ = '0'; - while (i-- > 0) - *str++ = tmp[i]; - while (size-- > 0) - *str++ = ' '; - - str[0] = '\0'; - - return strorg; -} - - - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skqueue.c linux-2.4.23-pre8/drivers/net/sk98lin/skqueue.c --- linux-2.4.22/drivers/net/sk98lin/skqueue.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skqueue.c 2003-10-22 22:48:12.000000000 +0000 @@ -1,17 +1,17 @@ /****************************************************************************** * * Name: skqueue.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.18 $ - * Date: $Date: 2002/05/07 14:11:11 $ + * Project: Gigabit Ethernet Adapters, Schedule-Modul + * Version: $Revision: 1.19 $ + * Date: $Date: 2003/05/13 18:00:07 $ * Purpose: Management of an event queue. * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998,1999 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -27,6 +27,10 @@ * History: * * $Log: skqueue.c,v $ + * 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. * @@ -90,8 +94,10 @@ /* Event queue and dispatcher */ +#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) static const char SysKonnectFileId[] = - "$Header: /usr56/projects/ge/schedule/skqueue.c,v 1.18 2002/05/07 14:11:11 rwahl Exp $" ; + "$Header: /usr56/projects/ge/schedule/skqueue.c,v 1.19 2003/05/13 18:00:07 mkarl Exp $" ; +#endif #include "h/skdrv1st.h" /* Driver Specific Definitions */ #include "h/skqueue.h" /* Queue Definitions */ @@ -171,7 +177,8 @@ while (pEv != pAC->Event.EvPut) { PRINTF("dispatch Class %d Event %d\n",pEv->Class,pEv->Event) ; switch(Class = pEv->Class) { -#ifndef SK_USE_LAC_EV +#ifndef SK_USE_LAC_EV +#ifndef SK_SLIM case SKGE_RLMT : /* RLMT Event */ Rtv = SkRlmtEvent(pAC,Ioc,pEv->Event,pEv->Para); break ; @@ -181,7 +188,8 @@ case SKGE_PNMI : Rtv = SkPnmiEvent(pAC,Ioc,pEv->Event,pEv->Para); break ; -#endif /* SK_USE_LAC_EV */ +#endif /* not SK_SLIM */ +#endif /* not SK_USE_LAC_EV */ case SKGE_DRV : /* Driver Event */ Rtv = SkDrvEvent(pAC,Ioc,pEv->Event,pEv->Para); break ; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skrlmt.c linux-2.4.23-pre8/drivers/net/sk98lin/skrlmt.c --- linux-2.4.22/drivers/net/sk98lin/skrlmt.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skrlmt.c 2003-10-22 22:49:07.000000000 +0000 @@ -2,15 +2,16 @@ * * Name: skrlmt.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.65 $ - * Date: $Date: 2002/07/22 14:29:48 $ + * Version: $Revision: 1.69 $ + * Date: $Date: 2003/04/15 09:39:22 $ * Purpose: Manage links on SK-NET Adapters, esp. redundant ones. * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2001 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,20 @@ * 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. * @@ -272,13 +287,12 @@ #ifndef lint static const char SysKonnectFileId[] = - "@(#) $Id: skrlmt.c,v 1.65 2002/07/22 14:29:48 rwahl Exp $ (C) SysKonnect."; + "@(#) $Id: skrlmt.c,v 1.69 2003/04/15 09:39:22 tschilli Exp $ (C) Marvell."; #endif /* !defined(lint) */ #define __SKRLMT_C #ifdef __cplusplus -#error C++ is not yet supported. extern "C" { #endif /* cplusplus */ @@ -578,6 +592,10 @@ SK_U32 i, j; SK_U64 Random; SK_EVPARA Para; + SK_MAC_ADDR VirtualMacAddress; + SK_MAC_ADDR PhysicalAMacAddress; + SK_BOOL VirtualMacAddressSet; + SK_BOOL PhysicalAMacAddressSet; SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_INIT, ("RLMT Init level %d.\n", Level)) @@ -625,7 +643,7 @@ pAC->Rlmt.Net[0].NumPorts = pAC->GIni.GIMacsFound; /* Initialize HW registers? */ - if (pAC->GIni.GIMacsFound < 2) { + if (pAC->GIni.GIMacsFound == 1) { Para.Para32[0] = SK_RLMT_MODE_CLS; Para.Para32[1] = 0; (void)SkRlmtEvent(pAC, IoC, SK_RLMT_MODE_CHANGE, Para); @@ -661,6 +679,38 @@ (void)SkAddrMcUpdate(pAC, IoC, i); } + + VirtualMacAddressSet = SK_FALSE; + /* Read virtual MAC address from Control Register File. */ + for (j = 0; j < SK_MAC_ADDR_LEN; j++) { + + SK_IN8(IoC, B2_MAC_1 + j, &VirtualMacAddress.a[j]); + VirtualMacAddressSet |= VirtualMacAddress.a[j]; + } + + PhysicalAMacAddressSet = SK_FALSE; + /* Read physical MAC address for MAC A from Control Register File. */ + for (j = 0; j < SK_MAC_ADDR_LEN; j++) { + + SK_IN8(IoC, B2_MAC_2 + j, &PhysicalAMacAddress.a[j]); + PhysicalAMacAddressSet |= PhysicalAMacAddress.a[j]; + } + + /* check if the two mac addresses contain reasonable values */ + if (!VirtualMacAddressSet || !PhysicalAMacAddressSet) { + + pAC->Rlmt.RlmtOff = SK_TRUE; + } + + /* if the two mac addresses are equal switch off the RLMT_PRE_LOOKAHEAD + and the RLMT_LOOKAHEAD macros */ + else if (SK_ADDR_EQUAL(PhysicalAMacAddress.a, VirtualMacAddress.a)) { + + pAC->Rlmt.RlmtOff = SK_TRUE; + } + else { + pAC->Rlmt.RlmtOff = SK_FALSE; + } break; default: /* error */ @@ -760,7 +810,7 @@ } #endif /* DEBUG */ - return; + return; } /* SkRlmtBuildCheckChain */ @@ -847,7 +897,7 @@ } } - return (pMb); + return (pMb); } /* SkRlmtBuildPacket */ @@ -929,7 +979,7 @@ pAC->Rlmt.Port[PortNumber].TxSpHelloReqCts++; } - return (pMb); + return (pMb); } /* SkRlmtBuildSpanningTreePacket */ @@ -996,8 +1046,8 @@ SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_TX, ("SkRlmtSend: BPDU Packet on Port %u.\n", PortNumber)) } - } - return; + } + return; } /* SkRlmtSend */ @@ -1337,7 +1387,7 @@ pRPort->Root.Id[0], pRPort->Root.Id[1], pRPort->Root.Id[2], pRPort->Root.Id[3], pRPort->Root.Id[4], pRPort->Root.Id[5], - pRPort->Root.Id[6], pRPort->Root.Id[7])) + pRPort->Root.Id[6], pRPort->Root.Id[7])) } SkDrvFreeRlmtMbuf(pAC, IoC, pMb); @@ -1500,10 +1550,10 @@ SkRlmtCheckSwitch(pAC, IoC, pRPort->Net->NetNumber); } - NewTimeout = SK_RLMT_DEF_TO_VAL; + NewTimeout = SK_RLMT_DEF_TO_VAL; } - return (NewTimeout); + return (NewTimeout); } /* SkRlmtCheckPort */ @@ -1537,13 +1587,14 @@ /* Select port with the latest TimeStamp. */ for (i = 0; i < (SK_U32)pAC->GIni.GIMacsFound; i++) { -#ifdef DEBUG + SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("TimeStamp Port %d: %08x %08x.\n", + ("TimeStamp Port %d (Down: %d, NoRx: %d): %08x %08x.\n", i, + pAC->Rlmt.Port[i].PortDown, pAC->Rlmt.Port[i].PortNoRx, *((SK_U32*)(&pAC->Rlmt.Port[i].BcTimeStamp) + OFFS_HI32), *((SK_U32*)(&pAC->Rlmt.Port[i].BcTimeStamp) + OFFS_LO32))) -#endif /* DEBUG */ + if (!pAC->Rlmt.Port[i].PortDown && !pAC->Rlmt.Port[i].PortNoRx) { if (!PortFound || pAC->Rlmt.Port[i].BcTimeStamp > BcTimeStamp) { BcTimeStamp = pAC->Rlmt.Port[i].BcTimeStamp; @@ -1568,10 +1619,9 @@ pAC->Rlmt.Port[i].BcTimeStamp + SK_RLMT_BC_DELTA > BcTimeStamp)) { PortFound = SK_FALSE; -#ifdef DEBUG + SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, ("Port %d received a broadcast at a similar time.\n", i)) -#endif /* DEBUG */ break; } } @@ -1580,8 +1630,8 @@ #ifdef DEBUG if (PortFound) { SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SK_RLMT_CHECK_SWITCH found Port %d receiving the substantially " - "latest broadcast (%d).\n", + ("SK_RLMT_SELECT_BCRX found Port %d receiving the substantially " + "latest broadcast (%u).\n", *pSelect, BcTimeStamp - pAC->Rlmt.Port[1 - *pSelect].BcTimeStamp)) } @@ -1631,7 +1681,7 @@ } PortFound = SK_TRUE; SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SK_RLMT_CHECK_SWITCH found Port %d up and not check RX.\n", + ("SK_RLMT_SELECT_NOTSUSPECT found Port %d up and not check RX.\n", *pSelect)) break; } @@ -1681,7 +1731,7 @@ } PortFound = SK_TRUE; SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SK_RLMT_CHECK_SWITCH found Port %d up.\n", *pSelect)) + ("SK_RLMT_SELECT_UP found Port %d up.\n", *pSelect)) break; } } @@ -1742,7 +1792,7 @@ } SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SK_RLMT_CHECK_SWITCH found Port %d going up.\n", *pSelect)) + ("SK_RLMT_SELECT_GOINGUP found Port %d going up.\n", *pSelect)) return (SK_TRUE); } /* SkRlmtSelectGoingUp */ @@ -1788,7 +1838,7 @@ } PortFound = SK_TRUE; SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, - ("SK_RLMT_CHECK_SWITCH found Port %d down.\n", *pSelect)) + ("SK_RLMT_SELECT_DOWN found Port %d down.\n", *pSelect)) break; } } @@ -2426,6 +2476,7 @@ pRPort->PacketsPerTimeSlot = 0; /* pRPort->DataPacketsPerTimeSlot = 0; */ pRPort->BpduPacketsPerTimeSlot = 0; + pRPort->BcTimeStamp = 0; /* * RA;:;: To be checked: @@ -2696,7 +2747,7 @@ } /* Stop RLMT timers. */ - SkTimerStop(pAC, IoC, &pAC->Rlmt.Net[Para.Para32[0]].LocTimer); + SkTimerStop(pAC, IoC, &pAC->Rlmt.Net[Para.Para32[0]].LocTimer); SkTimerStop(pAC, IoC, &pAC->Rlmt.Net[Para.Para32[0]].SegTimer); /* Stop net. */ @@ -2896,7 +2947,7 @@ } } #endif /* xDEBUG */ - + SkRlmtCheckSeg(pAC, IoC, Para.Para32[0]); SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, @@ -3284,7 +3335,7 @@ Para.Para32[0] |= SK_RLMT_CHECK_LINK; - if (pAC->Rlmt.Net[Para.Para32[1]].NumPorts < 2 && + if ((pAC->Rlmt.Net[Para.Para32[1]].NumPorts == 1) && Para.Para32[0] != SK_RLMT_MODE_CLS) { pAC->Rlmt.Net[Para.Para32[1]].RlmtMode = SK_RLMT_MODE_CLS; SK_DBG_MSG(pAC, SK_DBGMOD_RLMT, SK_DBGCAT_CTRL, @@ -3447,7 +3498,7 @@ break; } /* switch() */ - return (0); + return (0); } /* SkRlmtEvent */ #ifdef __cplusplus diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/sktimer.c linux-2.4.23-pre8/drivers/net/sk98lin/sktimer.c --- linux-2.4.22/drivers/net/sk98lin/sktimer.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/sktimer.c 2003-10-22 22:47:42.000000000 +0000 @@ -1,17 +1,17 @@ /****************************************************************************** * * Name: sktimer.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.12 $ - * Date: $Date: 1999/11/22 13:38:51 $ + * Project: Gigabit Ethernet Adapters, Schedule-Modul + * Version: $Revision: 1.13 $ + * Date: $Date: 2003/05/13 18:01:01 $ * Purpose: High level timer functions. * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998,1999 SysKonnect, - * a business unit of Schneider & Koch & Co. Datensysteme GmbH. + * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -27,6 +27,9 @@ * History: * * $Log: sktimer.c,v $ + * 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. * @@ -75,8 +78,10 @@ /* Event queue and dispatcher */ +#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) static const char SysKonnectFileId[] = - "$Header: /usr56/projects/ge/schedule/sktimer.c,v 1.12 1999/11/22 13:38:51 cgoos Exp $" ; + "$Header: /usr56/projects/ge/schedule/sktimer.c,v 1.13 2003/05/13 18:01:01 mkarl Exp $" ; +#endif #include "h/skdrv1st.h" /* Driver Specific Definitions */ #include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skvpd.c linux-2.4.23-pre8/drivers/net/sk98lin/skvpd.c --- linux-2.4.22/drivers/net/sk98lin/skvpd.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skvpd.c 2003-10-22 22:49:04.000000000 +0000 @@ -2,15 +2,15 @@ * * Name: skvpd.c * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.32 $ - * Date: $Date: 2002/10/14 16:04:29 $ + * Version: $Revision: 1.37 $ + * Date: $Date: 2003/01/13 10:42:45 $ * Purpose: Shared software to read and write VPD data * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2003 SysKonnect GmbH. * * 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 @@ -26,6 +26,21 @@ * 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() @@ -95,7 +110,7 @@ * 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 illeagal + * fix: VpdTransferBlock swapped illegal * add: VpdMayWrite * * Revision 1.13 1998/10/22 10:02:37 gklug @@ -111,7 +126,7 @@ * Remove CvsId by SysKonnectFileId. * * Revision 1.9 1998/09/16 07:33:52 malthoff - * remove memcmp() by SK_MEMCMP and + * replace memcmp() by SK_MEMCMP and * memcpy() by SK_MEMCPY() to be * independent from the 'C' Standard Library. * @@ -119,7 +134,7 @@ * 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) + * 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 @@ -149,7 +164,7 @@ Please refer skvpd.txt for infomation how to include this module */ static const char SysKonnectFileId[] = - "@(#)$Id: skvpd.c,v 1.32 2002/10/14 16:04:29 rschmidt Exp $ (C) SK"; + "@(#)$Id: skvpd.c,v 1.37 2003/01/13 10:42:45 rschmidt Exp $ (C) SK"; #include "h/skdrv1st.h" #include "h/sktypes.h" @@ -162,7 +177,7 @@ #ifndef SK_KR_PROTO static SK_VPD_PARA *vpd_find_para( SK_AC *pAC, - char *key, + const char *key, SK_VPD_PARA *p); #else /* SK_KR_PROTO */ static SK_VPD_PARA *vpd_find_para(); @@ -175,7 +190,7 @@ * returns 0: success, transfer completes * error exit(9) with a error message */ -static int VpdWait( +static int VpdWait( SK_AC *pAC, /* Adapters context */ SK_IOC IoC, /* IO Context */ int event) /* event to wait for (VPD_READ / VPD_write) completion*/ @@ -187,7 +202,7 @@ ("VPD wait for %s\n", event?"Write":"Read")); start_time = SkOsGetTime(pAC); do { - if (SkOsGetTime(pAC) - start_time > SK_TICKS_PER_SEC/16) { + if (SkOsGetTime(pAC) - start_time > SK_TICKS_PER_SEC) { /* Bug fix AF: Thu Mar 28 2002 * Do not call: VPD_STOP(pAC, IoC); @@ -205,7 +220,9 @@ ("ERROR:VPD wait timeout\n")); return(1); } + VPD_IN16(pAC, IoC, PCI_VPD_ADR_REG, &state); + SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_CTRL, ("state = %x, event %x\n",state,event)); } while((int)(state & PCI_VPD_FLAG) == event); @@ -319,7 +336,7 @@ * * Returns number of bytes read / written. */ -static int VpdWriteStream( +static int VpdWriteStream( SK_AC *pAC, /* Adapters context */ SK_IOC IoC, /* IO Context */ char *buf, /* data buffer */ @@ -391,7 +408,9 @@ } for (j = 0; j <= (int)(i%sizeof(SK_U32)); j++, pComp++) { + VPD_IN8(pAC, IoC, PCI_VPD_DAT_REG + j, &Data); + if (Data != *pComp) { /* Verify Error */ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, @@ -412,7 +431,7 @@ * * Returns number of bytes read / written. */ -static int VpdReadStream( +static int VpdReadStream( SK_AC *pAC, /* Adapters context */ SK_IOC IoC, /* IO Context */ char *buf, /* data buffer */ @@ -451,7 +470,7 @@ * * Returns number of bytes read / written. */ -static int VpdTransferBlock( +static int VpdTransferBlock( SK_AC *pAC, /* Adapters context */ SK_IOC IoC, /* IO Context */ char *buf, /* data buffer */ @@ -501,7 +520,7 @@ * * Returns number of bytes read. */ -int VpdReadBlock( +int VpdReadBlock( SK_AC *pAC, /* pAC pointer */ SK_IOC IoC, /* IO Context */ char *buf, /* buffer were the data should be stored */ @@ -516,7 +535,7 @@ * * Returns number of bytes writes. */ -int VpdWriteBlock( +int VpdWriteBlock( SK_AC *pAC, /* pAC pointer */ SK_IOC IoC, /* IO Context */ char *buf, /* buffer, holds the data to write */ @@ -536,7 +555,7 @@ * return 0: success * 1: fatal VPD error */ -static int VpdInit( +static int VpdInit( SK_AC *pAC, /* Adapters context */ SK_IOC IoC) /* IO Context */ { @@ -544,12 +563,12 @@ int i; unsigned char x; int vpd_size; - SK_U16 word; + SK_U16 dev_id; SK_U32 our_reg2; SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_INIT, ("VpdInit .. ")); - VPD_IN16(pAC, IoC, PCI_DEVICE_ID, &word); + VPD_IN16(pAC, IoC, PCI_DEVICE_ID, &dev_id); VPD_IN32(pAC, IoC, PCI_OUR_REG_2, &our_reg2); @@ -560,9 +579,9 @@ * therefore we cannot always trust in GIChipId */ if (((pAC->vpd.v.vpd_status & VPD_VALID) == 0 && - word == VPD_PCI_ID_YUKON) || + dev_id != VPD_DEV_ID_GENESIS) || ((pAC->vpd.v.vpd_status & VPD_VALID) != 0 && - !(pAC->GIni.GIGenesis))) { + !pAC->GIni.GIGenesis)) { /* for Yukon the VPD size is always 256 */ vpd_size = VPD_SIZE_YUKON; @@ -603,7 +622,7 @@ pAC->vpd.v.vpd_free_ro = r->p_len - 1; /* test the checksum */ - for (i = 0, x = 0; (unsigned)i<=(unsigned)vpd_size/2 - r->p_len; i++) { + for (i = 0, x = 0; (unsigned)i <= (unsigned)vpd_size/2 - r->p_len; i++) { x += pAC->vpd.vpd_buf[i]; } @@ -648,9 +667,9 @@ * 0: parameter was not found or VPD encoding error */ static SK_VPD_PARA *vpd_find_para( -SK_AC *pAC, /* common data base */ -char *key, /* keyword to find (e.g. "MN") */ -SK_VPD_PARA *p) /* parameter description struct */ +SK_AC *pAC, /* common data base */ +const char *key, /* keyword to find (e.g. "MN") */ +SK_VPD_PARA *p) /* parameter description struct */ { char *v ; /* points to VPD buffer */ int max; /* Maximum Number of Iterations */ @@ -719,9 +738,9 @@ * returns nothing */ static void vpd_move_para( -char *start, /* start of memory block */ -char *end, /* end of memory block to move */ -int n) /* number of bytes the memory block has to be moved */ +char *start, /* start of memory block */ +char *end, /* end of memory block to move */ +int n) /* number of bytes the memory block has to be moved */ { char *p; int i; /* number of byte copied */ @@ -752,10 +771,10 @@ * returns nothing */ static void vpd_insert_key( -char *key, /* keyword to insert */ -char *buf, /* buffer with the keyword value */ -int len, /* length of the value string */ -char *ip) /* inseration point */ +const char *key, /* keyword to insert */ +const char *buf, /* buffer with the keyword value */ +int len, /* length of the value string */ +char *ip) /* inseration point */ { SK_VPD_KEY *p; @@ -774,8 +793,8 @@ * 1: encoding error */ static int vpd_mod_endtag( -SK_AC *pAC, /* common data base */ -char *etp) /* end pointer input position */ +SK_AC *pAC, /* common data base */ +char *etp) /* end pointer input position */ { SK_VPD_KEY *p; unsigned char x; @@ -839,11 +858,11 @@ */ int VpdSetupPara( SK_AC *pAC, /* common data base */ -char *key, /* keyword to insert */ -char *buf, /* buffer with the keyword value */ -int len, /* length of the keyword value */ -int type, /* VPD_RO_KEY or VPD_RW_KEY */ -int op) /* operation to do: ADD_KEY or OWR_KEY */ +const char *key, /* keyword to insert */ +const char *buf, /* buffer with the keyword value */ +int len, /* length of the keyword value */ +int type, /* VPD_RO_KEY or VPD_RW_KEY */ +int op) /* operation to do: ADD_KEY or OWR_KEY */ { SK_VPD_PARA vp; char *etp; /* end tag position */ @@ -930,12 +949,12 @@ * return: A pointer to the vpd_status structure. The structure contains * this fields. */ -SK_VPD_STATUS *VpdStat( -SK_AC *pAC, /* Adapters context */ -SK_IOC IoC) /* IO Context */ +SK_VPD_STATUS *VpdStat( +SK_AC *pAC, /* Adapters context */ +SK_IOC IoC) /* IO Context */ { - if (!(pAC->vpd.v.vpd_status & VPD_VALID)) { - (void)VpdInit(pAC,IoC); + if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) { + (void)VpdInit(pAC, IoC); } return(&pAC->vpd.v); } @@ -963,10 +982,10 @@ * *len = 30 * *elements = 9 */ -int VpdKeys( -SK_AC *pAC, /* common data base */ -SK_IOC IoC, /* IO Context */ -char *buf, /* buffer where to copy the keywords */ +int VpdKeys( +SK_AC *pAC, /* common data base */ +SK_IOC IoC, /* IO Context */ +char *buf, /* buffer where to copy the keywords */ int *len, /* buffer length */ int *elements) /* number of keywords returned */ { @@ -975,8 +994,8 @@ SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_RX, ("list VPD keys .. ")); *elements = 0; - if (!(pAC->vpd.v.vpd_status & VPD_VALID)) { - if (VpdInit(pAC,IoC) != 0 ) { + if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) { + if (VpdInit(pAC, IoC) != 0) { *len = 0; SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, ("VPD Init Error, terminated\n")); @@ -1049,18 +1068,18 @@ * 3: VPD transfer timeout * 6: fatal VPD error */ -int VpdRead( +int VpdRead( SK_AC *pAC, /* common data base */ SK_IOC IoC, /* IO Context */ -char *key, /* keyword to read (e.g. "MN") */ +const char *key, /* keyword to read (e.g. "MN") */ char *buf, /* buffer where to copy the keyword value */ -int *len) /* buffer length */ +int *len) /* buffer length */ { SK_VPD_PARA *p, vp; SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_RX, ("VPD read %s .. ", key)); - if (!(pAC->vpd.v.vpd_status & VPD_VALID)) { - if (VpdInit(pAC,IoC) != 0 ) { + if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) { + if (VpdInit(pAC, IoC) != 0) { *len = 0; SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, ("VPD init error\n")); @@ -1095,8 +1114,8 @@ * SK_TRUE Yes it may be written * SK_FALSE No it may be written */ -SK_BOOL VpdMayWrite( -char *key) /* keyword to write (allowed values "Yx", "Vx") */ +SK_BOOL VpdMayWrite( +char *key) /* keyword to write (allowed values "Yx", "Vx") */ { if ((*key != 'Y' && *key != 'V') || key[1] < '0' || key[1] > 'Z' || @@ -1120,14 +1139,14 @@ * 5: keyword cannot be written * 6: fatal VPD error */ -int VpdWrite( +int VpdWrite( SK_AC *pAC, /* common data base */ SK_IOC IoC, /* IO Context */ -char *key, /* keyword to write (allowed values "Yx", "Vx") */ -char *buf) /* buffer where the keyword value can be read from */ +const char *key, /* keyword to write (allowed values "Yx", "Vx") */ +const char *buf) /* buffer where the keyword value can be read from */ { - int len; /* length of the keyword to write */ - int rtv; /* return code */ + int len; /* length of the keyword to write */ + int rtv; /* return code */ int rtv2; SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, @@ -1142,8 +1161,8 @@ return(5); } - if (!(pAC->vpd.v.vpd_status & VPD_VALID)) { - if (VpdInit(pAC,IoC) != 0 ) { + if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) { + if (VpdInit(pAC, IoC) != 0) { SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, ("VPD init error\n")); return(6); @@ -1157,9 +1176,9 @@ len = VPD_MAX_LEN; rtv = 2; SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, - ("keyword to long, cut after %d bytes\n",VPD_MAX_LEN)); + ("keyword too long, cut after %d bytes\n",VPD_MAX_LEN)); } - if ((rtv2 = VpdSetupPara(pAC, key,buf, len, VPD_RW_KEY, OWR_KEY)) != 0) { + if ((rtv2 = VpdSetupPara(pAC, key, buf, len, VPD_RW_KEY, OWR_KEY)) != 0) { SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, ("VPD write error\n")); return(rtv2); @@ -1180,10 +1199,10 @@ * 5: keyword cannot be deleted * 6: fatal VPD error */ -int VpdDelete( -SK_AC *pAC, /* common data base */ -SK_IOC IoC, /* IO Context */ -char *key) /* keyword to read (e.g. "MN") */ +int VpdDelete( +SK_AC *pAC, /* common data base */ +SK_IOC IoC, /* IO Context */ +char *key) /* keyword to read (e.g. "MN") */ { SK_VPD_PARA *p, vp; char *etp; @@ -1192,8 +1211,8 @@ vpd_size = pAC->vpd.vpd_size; SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_TX,("VPD delete key %s\n",key)); - if (!(pAC->vpd.v.vpd_status & VPD_VALID)) { - if (VpdInit(pAC,IoC) != 0 ) { + if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) { + if (VpdInit(pAC, IoC) != 0) { SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, ("VPD init error\n")); return(6); @@ -1235,16 +1254,16 @@ * returns 0: success * 3: VPD transfer timeout */ -int VpdUpdate( -SK_AC *pAC, /* Adapters context */ -SK_IOC IoC) /* IO Context */ +int VpdUpdate( +SK_AC *pAC, /* Adapters context */ +SK_IOC IoC) /* IO Context */ { int vpd_size; vpd_size = pAC->vpd.vpd_size; SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, ("VPD update .. ")); - if (pAC->vpd.v.vpd_status & VPD_VALID) { + if ((pAC->vpd.v.vpd_status & VPD_VALID) != 0) { if (VpdTransferBlock(pAC, IoC, pAC->vpd.vpd_buf + vpd_size/2, vpd_size/2, vpd_size/2, VPD_WRITE) != vpd_size/2) { @@ -1269,18 +1288,18 @@ * * returns nothing, errors will be ignored. */ -void VpdErrLog( -SK_AC *pAC, /* common data base */ -SK_IOC IoC, /* IO Context */ -char *msg) /* error log message */ +void VpdErrLog( +SK_AC *pAC, /* common data base */ +SK_IOC IoC, /* IO Context */ +char *msg) /* error log message */ { SK_VPD_PARA *v, vf; /* VF */ int len; SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, - ("VPD error log msg %s\n",msg)); - if (!(pAC->vpd.v.vpd_status & VPD_VALID)) { - if (VpdInit(pAC,IoC) != 0 ) { + ("VPD error log msg %s\n", msg)); + if ((pAC->vpd.v.vpd_status & VPD_VALID) == 0) { + if (VpdInit(pAC, IoC) != 0) { SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_ERR, ("VPD init error\n")); return; @@ -1298,7 +1317,7 @@ } else { SK_DBG_MSG(pAC, SK_DBGMOD_VPD, SK_DBGCAT_TX, ("write VF\n")); - (void)VpdSetupPara(pAC, VPD_VF, msg,len, VPD_RW_KEY, ADD_KEY); + (void)VpdSetupPara(pAC, VPD_VF, msg, len, VPD_RW_KEY, ADD_KEY); } (void)VpdUpdate(pAC, IoC); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sk98lin/skxmac2.c linux-2.4.23-pre8/drivers/net/sk98lin/skxmac2.c --- linux-2.4.22/drivers/net/sk98lin/skxmac2.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sk98lin/skxmac2.c 2003-10-22 22:48:40.000000000 +0000 @@ -1,16 +1,17 @@ /****************************************************************************** * * Name: skxmac2.c - * Project: GEnesis, PCI Gigabit Ethernet Adapter - * Version: $Revision: 1.87 $ - * Date: $Date: 2002/12/10 14:39:05 $ + * Project: Gigabit Ethernet Adapters, Common Modules + * Version: $Revision: 1.99 $ + * Date: $Date: 2003/07/11 12:19:33 $ * Purpose: Contains functions to initialize the MACs and PHYs * ******************************************************************************/ /****************************************************************************** * - * (C)Copyright 1998-2002 SysKonnect GmbH. + * (C)Copyright 1998-2002 SysKonnect. + * (C)Copyright 2002-2003 Marvell. * * 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 @@ -26,6 +27,75 @@ * History: * * $Log: skxmac2.c,v $ + * 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. @@ -34,7 +104,7 @@ * 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 SkGmPhyWrite(), SkGmPhyWrite(). + * 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. @@ -402,9 +472,13 @@ } BCOM_HACK; /* local variables ************************************************************/ + +#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM)))) static const char SysKonnectFileId[] = - "@(#)$Id: skxmac2.c,v 1.87 2002/12/10 14:39:05 rschmidt Exp $ (C) SK "; + "@(#) $Id: skxmac2.c,v 1.99 2003/07/11 12:19:33 rschmidt Exp $ (C) Marvell."; +#endif +#ifdef GENESIS BCOM_HACK BcomRegA1Hack[] = { { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1104 }, { 0x17, 0x0013 }, { 0x15, 0x0404 }, { 0x17, 0x8006 }, { 0x15, 0x0132 }, { 0x17, 0x8006 }, @@ -416,14 +490,19 @@ { 0x15, 0x0A04 }, { 0x18, 0x0420 }, { 0, 0 } }; +#endif /* function prototypes ********************************************************/ +#ifdef GENESIS static void SkXmInitPhyXmac(SK_AC*, SK_IOC, int, SK_BOOL); static void SkXmInitPhyBcom(SK_AC*, SK_IOC, int, SK_BOOL); -static void SkGmInitPhyMarv(SK_AC*, SK_IOC, int, SK_BOOL); static int SkXmAutoNegDoneXmac(SK_AC*, SK_IOC, int); static int SkXmAutoNegDoneBcom(SK_AC*, SK_IOC, int); +#endif /* GENESIS */ +#ifdef YUKON +static void SkGmInitPhyMarv(SK_AC*, SK_IOC, int, SK_BOOL); static int SkGmAutoNegDoneMarv(SK_AC*, SK_IOC, int); +#endif /* YUKON */ #ifdef OTHER_PHY static void SkXmInitPhyLone(SK_AC*, SK_IOC, int, SK_BOOL); static void SkXmInitPhyNat (SK_AC*, SK_IOC, int, SK_BOOL); @@ -432,7 +511,7 @@ #endif /* OTHER_PHY */ - +#ifdef GENESIS /****************************************************************************** * * SkXmPhyRead() - Read from XMAC PHY register @@ -443,11 +522,11 @@ * nothing */ void SkXmPhyRead( -SK_AC *pAC, /* Adapter Context */ -SK_IOC IoC, /* I/O Context */ -int Port, /* Port Index (MAC_1 + n) */ -int PhyReg, /* Register Address (Offset) */ -SK_U16 *pVal) /* Pointer to Value */ +SK_AC *pAC, /* Adapter Context */ +SK_IOC IoC, /* I/O Context */ +int Port, /* Port Index (MAC_1 + n) */ +int PhyReg, /* Register Address (Offset) */ +SK_U16 SK_FAR *pVal) /* Pointer to Value */ { SK_U16 Mmu; SK_GEPORT *pPrt; @@ -513,8 +592,10 @@ } while ((Mmu & XM_MMU_PHY_BUSY) != 0); } } /* SkXmPhyWrite */ +#endif /* GENESIS */ +#ifdef YUKON /****************************************************************************** * * SkGmPhyRead() - Read from GPHY register @@ -525,11 +606,11 @@ * nothing */ void SkGmPhyRead( -SK_AC *pAC, /* Adapter Context */ -SK_IOC IoC, /* I/O Context */ -int Port, /* Port Index (MAC_1 + n) */ -int PhyReg, /* Register Address (Offset) */ -SK_U16 *pVal) /* Pointer to Value */ +SK_AC *pAC, /* Adapter Context */ +SK_IOC IoC, /* I/O Context */ +int Port, /* Port Index (MAC_1 + n) */ +int PhyReg, /* Register Address (Offset) */ +SK_U16 SK_FAR *pVal) /* Pointer to Value */ { SK_U16 Ctrl; SK_GEPORT *pPrt; @@ -545,8 +626,8 @@ pPrt = &pAC->GIni.GP[Port]; /* set PHY-Register offset and 'Read' OpCode (= 1) */ - *pVal = GM_SMI_CT_PHY_AD(pPrt->PhyAddr) | GM_SMI_CT_REG_AD(PhyReg) | - GM_SMI_CT_OP_RD; + *pVal = (SK_U16)(GM_SMI_CT_PHY_AD(pPrt->PhyAddr) | + GM_SMI_CT_REG_AD(PhyReg) | GM_SMI_CT_OP_RD); GM_OUT16(IoC, Port, GM_SMI_CTRL, *pVal); @@ -578,6 +659,7 @@ VCPUprintf(0, "VCPUgetTime(), SimCyle=%u, SimLowTime=%u\n", SimCyle, SimLowTime); #endif /* VCPU */ + } /* SkGmPhyRead */ @@ -646,9 +728,12 @@ VCPUprintf(0, "VCPUgetTime(), SimCyle=%u, SimLowTime=%u\n", SimCyle, SimLowTime); #endif /* VCPU */ + } /* SkGmPhyWrite */ +#endif /* YUKON */ +#ifdef SK_DIAG /****************************************************************************** * * SkGePhyRead() - Read from PHY register @@ -705,6 +790,7 @@ w_func(pAC, IoC, Port, PhyReg, Val); } /* SkGePhyWrite */ +#endif /* SK_DIAG */ /****************************************************************************** @@ -724,9 +810,14 @@ int Port, /* Port Index (MAC_1 + n) */ SK_BOOL Enable) /* Enable / Disable */ { +#ifdef YUKON SK_U16 RcReg; +#endif +#ifdef GENESIS SK_U32 MdReg; +#endif +#ifdef GENESIS if (pAC->GIni.GIGenesis) { XM_IN32(IoC, Port, XM_MODE, &MdReg); @@ -740,7 +831,10 @@ /* setup Mode Register */ XM_OUT32(IoC, Port, XM_MODE, MdReg); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { GM_IN16(IoC, Port, GM_RX_CTRL, &RcReg); @@ -754,6 +848,8 @@ /* setup Receive Control Register */ GM_OUT16(IoC, Port, GM_RX_CTRL, RcReg); } +#endif /* YUKON */ + } /* SkMacPromiscMode*/ @@ -774,9 +870,14 @@ int Port, /* Port Index (MAC_1 + n) */ SK_BOOL Enable) /* Enable / Disable */ { +#ifdef YUKON SK_U16 RcReg; +#endif +#ifdef GENESIS SK_U32 MdReg; +#endif +#ifdef GENESIS if (pAC->GIni.GIGenesis) { XM_IN32(IoC, Port, XM_MODE, &MdReg); @@ -790,7 +891,10 @@ /* setup Mode Register */ XM_OUT32(IoC, Port, XM_MODE, MdReg); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { GM_IN16(IoC, Port, GM_RX_CTRL, &RcReg); @@ -804,6 +908,8 @@ /* setup Receive Control Register */ GM_OUT16(IoC, Port, GM_RX_CTRL, RcReg); } +#endif /* YUKON */ + } /* SkMacHashing*/ @@ -903,7 +1009,7 @@ * Description: * The features * - FCS (CRC) stripping, SK_STRIP_FCS_ON/OFF - * - don't set XMR_FS_ERR in status SK_BIG_PK_OK_ON/OFF + * - don't set GMR_FS_LONG_ERR SK_BIG_PK_OK_ON/OFF * for frames > 1514 bytes * - enable Rx of own packets SK_SELF_RX_ON/OFF * @@ -986,6 +1092,7 @@ SkGmSetRxCmd(pAC, IoC, Port, Mode); } + } /* SkMacSetRxCmd */ @@ -1017,7 +1124,7 @@ Word |= XM_TX_NO_CRC; } /* setup Tx Command Register */ - XM_OUT16(pAC, Port, XM_TX_CMD, Word); + XM_OUT16(IoC, Port, XM_TX_CMD, Word); } else { @@ -1032,11 +1139,13 @@ /* setup Tx Control Register */ GM_OUT16(IoC, Port, GM_TX_CTRL, Word); } + } /* SkMacCrcGener*/ #endif /* SK_DIAG */ +#ifdef GENESIS /****************************************************************************** * * SkXmClrExactAddr() - Clear Exact Match Address Registers @@ -1070,6 +1179,7 @@ XM_OUTADDR(IoC, Port, XM_EXM(i), &ZeroAddr[0]); } } /* SkXmClrExactAddr */ +#endif /* GENESIS */ /****************************************************************************** @@ -1087,6 +1197,7 @@ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ { +#ifdef GENESIS SK_U32 MdReg; if (pAC->GIni.GIGenesis) { @@ -1095,10 +1206,15 @@ XM_OUT32(IoC, Port, XM_MODE, MdReg | XM_MD_FTF); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* no way to flush the FIFO we have to issue a reset */ /* TBD */ } +#endif /* YUKON */ + } /* SkMacFlushTxFifo */ @@ -1117,6 +1233,7 @@ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ { +#ifdef GENESIS SK_U32 MdReg; if (pAC->GIni.GIGenesis) { @@ -1125,13 +1242,19 @@ XM_OUT32(IoC, Port, XM_MODE, MdReg | XM_MD_FRF); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* no way to flush the FIFO we have to issue a reset */ /* TBD */ } +#endif /* YUKON */ + } /* SkMacFlushRxFifo */ +#ifdef GENESIS /****************************************************************************** * * SkXmSoftRst() - Do a XMAC software reset @@ -1280,8 +1403,10 @@ } } /* SkXmHardRst */ +#endif /* GENESIS */ +#ifdef YUKON /****************************************************************************** * * SkGmSoftRst() - Do a GMAC software reset @@ -1310,13 +1435,13 @@ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, 0); /* clear the Hash Register */ - GM_OUTHASH(IoC, Port, GM_MC_ADDR_H1, &EmptyHash); + GM_OUTHASH(IoC, Port, GM_MC_ADDR_H1, EmptyHash); /* Enable Unicast and Multicast filtering */ GM_IN16(IoC, Port, GM_RX_CTRL, &RxCtrl); GM_OUT16(IoC, Port, GM_RX_CTRL, - RxCtrl | GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA); + (SK_U16)(RxCtrl | GM_RXCR_UCF_ENA | GM_RXCR_MCF_ENA)); } /* SkGmSoftRst */ @@ -1346,6 +1471,7 @@ SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET); } /* SkGmHardRst */ +#endif /* YUKON */ /****************************************************************************** @@ -1369,14 +1495,19 @@ /* disable receiver and transmitter */ SkMacRxTxDisable(pAC, IoC, Port); +#ifdef GENESIS if (pAC->GIni.GIGenesis) { SkXmSoftRst(pAC, IoC, Port); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { SkGmSoftRst(pAC, IoC, Port); } +#endif /* YUKON */ /* flush the MAC's Rx and Tx FIFOs */ SkMacFlushTxFifo(pAC, IoC, Port); @@ -1403,21 +1534,26 @@ int Port) /* Port Index (MAC_1 + n) */ { +#ifdef GENESIS if (pAC->GIni.GIGenesis) { SkXmHardRst(pAC, IoC, Port); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { SkGmHardRst(pAC, IoC, Port); } +#endif /* YUKON */ pAC->GIni.GP[Port].PState = SK_PRT_RESET; } /* SkMacHardRst */ - +#ifdef GENESIS /****************************************************************************** * * SkXmInitMac() - Initialize the XMAC II @@ -1542,10 +1678,10 @@ */ SkMacInitPhy(pAC, IoC, Port, SK_FALSE); -#if 0 +#ifdef TEST_ONLY /* temp. code: enable signal detect */ /* WARNING: do not override GMII setting above */ - XM_OUT16(pAC, Port, XM_HW_CFG, XM_HW_COM4SIG); + XM_OUT16(IoC, Port, XM_HW_CFG, XM_HW_COM4SIG); #endif } @@ -1605,7 +1741,7 @@ SWord |= XM_RX_BIG_PK_OK; } - if (pPrt->PLinkModeConf == SK_LMODE_HALF) { + if (pPrt->PLinkMode == SK_LMODE_HALF) { /* * If in manual half duplex mode the other side might be in * full duplex mode, so ignore if a carrier extension is not seen @@ -1651,7 +1787,10 @@ * has been completed successfully. */ } /* SkXmInitMac */ +#endif /* GENESIS */ + +#ifdef YUKON /****************************************************************************** * * SkGmInitMac() - Initialize the GMAC @@ -1698,11 +1837,13 @@ /* set GMAC Control reset */ SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET); +#ifdef XXX /* clear GMAC Control reset */ SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_CLR); /* set GMAC Control reset */ SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_RST_SET); +#endif /* XXX */ /* set HWCFG_MODE */ DWord = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP | @@ -1716,10 +1857,76 @@ /* release GPHY Control reset */ SK_OUT32(IoC, MR_ADDR(Port, GPHY_CTRL), DWord | GPC_RST_CLR); +#ifdef VCPU + VCpuWait(9000); +#endif /* VCPU */ + /* clear GMAC Control reset */ SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_PAUSE_ON | GMC_RST_CLR); - /* Dummy read the Interrupt source register */ +#ifdef VCPU + VCpuWait(2000); +#endif /* VCPU */ + + /* Auto-negotiation ? */ + if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { + /* Auto-negotiation disabled */ + + /* get General Purpose Control */ + GM_IN16(IoC, Port, GM_GP_CTRL, &SWord); + + /* disable auto-update for speed, duplex and flow-control */ + SWord |= GM_GPCR_AU_ALL_DIS; + + /* setup General Purpose Control Register */ + GM_OUT16(IoC, Port, GM_GP_CTRL, SWord); + + SWord = GM_GPCR_AU_ALL_DIS; + } + else { + SWord = 0; + } + + /* speed settings */ + switch (pPrt->PLinkSpeed) { + case SK_LSPEED_AUTO: + case SK_LSPEED_1000MBPS: + SWord |= GM_GPCR_SPEED_1000 | GM_GPCR_SPEED_100; + break; + case SK_LSPEED_100MBPS: + SWord |= GM_GPCR_SPEED_100; + break; + case SK_LSPEED_10MBPS: + break; + } + + /* duplex settings */ + if (pPrt->PLinkMode != SK_LMODE_HALF) { + /* set full duplex */ + SWord |= GM_GPCR_DUP_FULL; + } + + switch (pPrt->PFlowCtrlMode) { + case SK_FLOW_MODE_NONE: + /* set Pause Off */ + SK_OUT32(IoC, MR_ADDR(Port, GMAC_CTRL), GMC_PAUSE_OFF); + /* disable Tx & Rx flow-control */ + SWord |= GM_GPCR_FC_TX_DIS | GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS; + break; + case SK_FLOW_MODE_LOC_SEND: + /* disable Rx flow-control */ + SWord |= GM_GPCR_FC_RX_DIS | GM_GPCR_AU_FCT_DIS; + break; + case SK_FLOW_MODE_SYMMETRIC: + case SK_FLOW_MODE_SYM_OR_REM: + /* enable Tx & Rx flow-control */ + break; + } + + /* setup General Purpose Control Register */ + GM_OUT16(IoC, Port, GM_GP_CTRL, SWord); + + /* dummy read the Interrupt Source Register */ SK_IN16(IoC, GMAC_IRQ_SRC, &SWord); #ifndef VCPU @@ -1732,50 +1939,6 @@ (void)SkGmResetCounter(pAC, IoC, Port); - SWord = 0; - - /* speed settings */ - switch (pPrt->PLinkSpeed) { - case SK_LSPEED_AUTO: - /* auto update for speed is already set */ - break; - case SK_LSPEED_1000MBPS: - SWord |= GM_GPCR_SPEED_1000; - break; - case SK_LSPEED_100MBPS: - SWord |= GM_GPCR_SPEED_100; - break; - case SK_LSPEED_10MBPS: - break; - } - - /* duplex settings */ - if (pPrt->PLinkModeConf == SK_LMODE_FULL || - pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE) { - - SWord |= GM_GPCR_DUP_FULL; - } - - /* flow control settings */ - switch (pPrt->PFlowCtrlMode) { - case SK_FLOW_MODE_NONE: - /* disable auto-neg of flow control */ - SWord |= GM_GPCR_FC_TX_DIS | GM_GPCR_FC_RX_DIS; - break; - case SK_FLOW_MODE_LOC_SEND: - SWord |= GM_GPCR_FC_RX_DIS; - break; - case SK_FLOW_MODE_SYMMETRIC: - /* TBD */ - case SK_FLOW_MODE_SYM_OR_REM: - /* do nothing means to enable autoneg for flowcontrol and */ - /* enable rx and tx of pause frames */ - break; - } - - /* setup General Purpose Control Register */ - GM_OUT16(IoC, Port, GM_GP_CTRL, SWord); - /* setup Transmit Control Register */ GM_OUT16(IoC, Port, GM_TX_CTRL, GM_TXCR_COL_THR); @@ -1791,7 +1954,7 @@ GM_IN16(IoC, Port, GM_TX_PARAM, &SWord); #endif /* VCPU */ - SWord = JAM_LEN_VAL(3) | JAM_IPG_VAL(11) | IPG_JAM_DATA(26); + SWord = (SK_U16)(JAM_LEN_VAL(3) | JAM_IPG_VAL(11) | IPG_JAM_DATA(26)); GM_OUT16(IoC, Port, GM_TX_PARAM, SWord); @@ -1827,7 +1990,7 @@ #ifdef WA_DEV_16 /* WA for deviation #16 */ - if (pAC->GIni.GIChipRev == 0) { + if (pAC->GIni.GIChipId == CHIP_ID_YUKON && pAC->GIni.GIChipRev == 0) { /* swap the address bytes */ SWord = ((SWord & 0xff00) >> 8) | ((SWord & 0x00ff) << 8); @@ -1845,12 +2008,12 @@ SK_IN16(IoC, (B2_MAC_1 + Port * 8 + i * 2), &SWord); GM_OUT16(IoC, Port, (GM_SRC_ADDR_2L + i * 4), SWord); + + /* reset Multicast filtering Hash registers 1-3 */ + GM_OUT16(IoC, Port, GM_MC_ADDR_H1 + 4*i, 0); } - /* reset all Multicast filtering Hash registers */ - GM_OUT16(IoC, Port, GM_MC_ADDR_H1, 0); - GM_OUT16(IoC, Port, GM_MC_ADDR_H2, 0); - GM_OUT16(IoC, Port, GM_MC_ADDR_H3, 0); + /* reset Multicast filtering Hash register 4 */ GM_OUT16(IoC, Port, GM_MC_ADDR_H4, 0); /* enable interrupt mask for counter overflows */ @@ -1858,13 +2021,21 @@ GM_OUT16(IoC, Port, GM_RX_IRQ_MSK, 0); GM_OUT16(IoC, Port, GM_TR_IRQ_MSK, 0); -#ifdef VCPU /* read General Purpose Status */ GM_IN16(IoC, Port, GM_GP_STAT, &SWord); -#endif /* VCPU */ + + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("MAC Stat Reg=0x%04X\n", SWord)); + +#ifdef SK_DIAG + c_print("MAC Stat Reg=0x%04X\n", SWord); +#endif /* SK_DIAG */ + } /* SkGmInitMac */ +#endif /* YUKON */ +#ifdef GENESIS /****************************************************************************** * * SkXmInitDupMd() - Initialize the XMACs Duplex Mode @@ -2209,7 +2380,7 @@ /* Write AutoNeg Advertisement Register */ SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, Ctrl3); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("Auto-Neg. Adv. Reg=0x%04X\n", Ctrl3)); + ("Auto-Neg.Adv.Reg=0x%04X\n", Ctrl3)); if (DoLoop) { /* Set the Phy Loopback bit, too */ @@ -2234,8 +2405,10 @@ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, ("PHY Control Reg=0x%04X\n", Ctrl1)); } /* SkXmInitPhyBcom */ +#endif /* GENESIS */ +#ifdef YUKON /****************************************************************************** * * SkGmInitPhyMarv() - Initialize the Marvell Phy registers @@ -2255,43 +2428,66 @@ { SK_GEPORT *pPrt; SK_U16 PhyCtrl; - SK_U16 PhyStat; - SK_U16 PhyStat1; - SK_U16 PhySpec; SK_U16 C1000BaseT; SK_U16 AutoNegAdv; SK_U16 ExtPhyCtrl; + SK_U16 LedCtrl; + SK_BOOL AutoNeg; +#if defined(SK_DIAG) || defined(DEBUG) + SK_U16 PhyStat; + SK_U16 PhyStat1; + SK_U16 PhySpecStat; +#endif /* SK_DIAG || DEBUG */ + + pPrt = &pAC->GIni.GP[Port]; + + /* Auto-negotiation ? */ + if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { + AutoNeg = SK_FALSE; + } + else { + AutoNeg = SK_TRUE; + } + + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("InitPhyMarv: Port %d, auto-negotiation %s\n", + Port, AutoNeg ? "ON" : "OFF")); #ifdef VCPU VCPUprintf(0, "SkGmInitPhyMarv(), Port=%u, DoLoop=%u\n", Port, DoLoop); #else /* VCPU */ - if (!DoLoop) { + if (DoLoop) { + /* Set 'MAC Power up'-bit, set Manual MDI configuration */ + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, + PHY_M_PC_MAC_POW_UP); + } + else if (AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_AUTO) { /* Read Ext. PHY Specific Control */ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl); ExtPhyCtrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK | PHY_M_EC_MAC_S_MSK); - ExtPhyCtrl |= PHY_M_EC_M_DSC(1) | PHY_M_EC_S_DSC(1) | - PHY_M_EC_MAC_S(MAC_TX_CLK_25_MHZ); + ExtPhyCtrl |= PHY_M_EC_MAC_S(MAC_TX_CLK_25_MHZ) | + PHY_M_EC_M_DSC(0) | PHY_M_EC_S_DSC(1); SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, ExtPhyCtrl); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("Ext.PHYCtrl=0x%04X\n", ExtPhyCtrl)); - - /* Read PHY Control */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &PhyCtrl); - - /* Assert software reset */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl | PHY_CT_RESET); + ("Ext. PHY Ctrl=0x%04X\n", ExtPhyCtrl)); } -#endif /* VCPU */ - pPrt = &pAC->GIni.GP[Port]; + /* Read PHY Control */ + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &PhyCtrl); + + PhyCtrl |= PHY_CT_RESET; + /* Assert software reset */ + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl); + +#endif /* VCPU */ - PhyCtrl = PHY_CT_COL_TST; + PhyCtrl = 0 /* PHY_CT_COL_TST */; C1000BaseT = 0; AutoNegAdv = PHY_SEL_TYPE; @@ -2306,9 +2502,7 @@ } /* Auto-negotiation ? */ - if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("InitPhyMarv: no auto-negotiation Port %d\n", Port)); + if (!AutoNeg) { if (pPrt->PLinkMode == SK_LMODE_FULL) { /* Set Full Duplex Mode */ @@ -2345,9 +2539,6 @@ */ } else { - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("InitPhyMarv: with auto-negotiation Port %d\n", Port)); - PhyCtrl |= PHY_CT_ANE; if (pAC->GIni.GICopperType) { @@ -2459,12 +2650,7 @@ */ /* Program PHY register 30 as 16'h0708 for simulation speed up */ - SkGmPhyWrite(pAC, IoC, Port, 30, 0x0708); - -#if 0 - /* Program PHY register 20 as 16'h2070 */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, 0x2070); -#endif /* 0 */ + SkGmPhyWrite(pAC, IoC, Port, 30, 0x0700 /* 0x0708 */); VCpuWait(2000); @@ -2485,38 +2671,63 @@ /* Set the PHY Loopback bit */ PhyCtrl |= PHY_CT_LOOP; +#ifdef XXX /* Program PHY register 16 as 16'h0400 to force link good */ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, PHY_M_PC_FL_GOOD); +#endif /* XXX */ -#if 0 +#ifndef VCPU if (pPrt->PLinkSpeed != SK_LSPEED_AUTO) { /* Write Ext. PHY Specific Control */ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_EXT_CTRL, (SK_U16)((pPrt->PLinkSpeed + 2) << 4)); } +#endif /* VCPU */ } +#ifdef TEST_ONLY else if (pPrt->PLinkSpeed == SK_LSPEED_10MBPS) { /* Write PHY Specific Control */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, PHY_M_PC_EN_DET_MSK); - } -#endif /* 0 */ + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_PHY_CTRL, + PHY_M_PC_EN_DET_MSK); } +#endif /* Write to the PHY Control register */ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CTRL, PhyCtrl); #ifdef VCPU VCpuWait(2000); -#endif /* VCPU */ +#else + + LedCtrl = PHY_M_LED_PULS_DUR(PULS_170MS) | PHY_M_LED_BLINK_RT(BLINK_84MS); + + if ((pAC->GIni.GILedBlinkCtrl & SK_ACT_LED_BLINK) != 0) { + LedCtrl |= PHY_M_LEDC_RX_CTRL | PHY_M_LEDC_TX_CTRL; + } + + if ((pAC->GIni.GILedBlinkCtrl & SK_DUP_LED_NORMAL) != 0) { + LedCtrl |= PHY_M_LEDC_DP_CTRL; + } + + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_CTRL, LedCtrl); + + if ((pAC->GIni.GILedBlinkCtrl & SK_LED_LINK100_ON) != 0) { + /* only in forced 100Mbps mode */ + if (!AutoNeg && pPrt->PLinkSpeed == SK_LSPEED_100MBPS) { + + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_LED_OVER, + PHY_M_LED_MO_100(MO_LED_ON)); + } + } #ifdef SK_DIAG - c_print("PHY Ctrl Val=0x%04X\n", PhyCtrl); - c_print("1000 B-T Val=0x%04X\n", C1000BaseT); - c_print("Auto-Neg Val=0x%04X\n", AutoNegAdv); - c_print("Ext Ctrl Val=0x%04X\n", ExtPhyCtrl); + c_print("Set PHY Ctrl=0x%04X\n", PhyCtrl); + c_print("Set 1000 B-T=0x%04X\n", C1000BaseT); + c_print("Set Auto-Neg=0x%04X\n", AutoNegAdv); + c_print("Set Ext Ctrl=0x%04X\n", ExtPhyCtrl); #endif /* SK_DIAG */ -#ifndef VCPU +#if defined(SK_DIAG) || defined(DEBUG) /* Read PHY Control */ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_CTRL, &PhyCtrl); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, @@ -2535,7 +2746,7 @@ /* Read Ext. PHY Specific Control */ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_EXT_CTRL, &ExtPhyCtrl); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("Ext PHY Ctrl=0x%04X\n", ExtPhyCtrl)); + ("Ext. PHY Ctrl=0x%04X\n", ExtPhyCtrl)); /* Read PHY Status */ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_STAT, &PhyStat); @@ -2546,10 +2757,10 @@ ("PHY Stat Reg.=0x%04X\n", PhyStat1)); /* Read PHY Specific Status */ - SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &PhySpec); + SkGmPhyRead(pAC, IoC, Port, PHY_MARV_PHY_STAT, &PhySpecStat); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("PHY Spec Stat=0x%04X\n", PhySpec)); -#endif /* VCPU */ + ("PHY Spec Stat=0x%04X\n", PhySpecStat)); +#endif /* SK_DIAG || DEBUG */ #ifdef SK_DIAG c_print("PHY Ctrl Reg=0x%04X\n", PhyCtrl); @@ -2558,10 +2769,13 @@ c_print("Ext Ctrl Reg=0x%04X\n", ExtPhyCtrl); c_print("PHY Stat Reg=0x%04X\n", PhyStat); c_print("PHY Stat Reg=0x%04X\n", PhyStat1); - c_print("PHY Spec Reg=0x%04X\n", PhySpec); + c_print("PHY Spec Reg=0x%04X\n", PhySpecStat); #endif /* SK_DIAG */ +#endif /* VCPU */ + } /* SkGmInitPhyMarv */ +#endif /* YUKON */ #ifdef OTHER_PHY @@ -2666,10 +2880,6 @@ } - /* Initialize LED register here ? */ - /* No. Please do it in SkDgXmitLed() (if required) and swap - init order of LEDs and XMAC. (MAl) */ - /* Write 1000Base-T Control Register */ SkXmPhyWrite(pAC, IoC, Port, PHY_LONE_1000T_CTRL, Ctrl2); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, @@ -2678,8 +2888,7 @@ /* Write AutoNeg Advertisement Register */ SkXmPhyWrite(pAC, IoC, Port, PHY_LONE_AUNE_ADV, Ctrl3); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("Auto-Neg. Adv. Reg=0x%04X\n", Ctrl3)); - + ("Auto-Neg.Adv.Reg=0x%04X\n", Ctrl3)); if (DoLoop) { /* Set the Phy Loopback bit, too */ @@ -2736,126 +2945,76 @@ pPrt = &pAC->GIni.GP[Port]; - switch (pPrt->PhyType) { - case SK_PHY_XMAC: - SkXmInitPhyXmac(pAC, IoC, Port, DoLoop); - break; - case SK_PHY_BCOM: - SkXmInitPhyBcom(pAC, IoC, Port, DoLoop); - break; - case SK_PHY_MARV_COPPER: - case SK_PHY_MARV_FIBER: - SkGmInitPhyMarv(pAC, IoC, Port, DoLoop); - break; +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + + switch (pPrt->PhyType) { + case SK_PHY_XMAC: + SkXmInitPhyXmac(pAC, IoC, Port, DoLoop); + break; + case SK_PHY_BCOM: + SkXmInitPhyBcom(pAC, IoC, Port, DoLoop); + break; #ifdef OTHER_PHY - case SK_PHY_LONE: - SkXmInitPhyLone(pAC, IoC, Port, DoLoop); - break; - case SK_PHY_NAT: - SkXmInitPhyNat(pAC, IoC, Port, DoLoop); - break; + case SK_PHY_LONE: + SkXmInitPhyLone(pAC, IoC, Port, DoLoop); + break; + case SK_PHY_NAT: + SkXmInitPhyNat(pAC, IoC, Port, DoLoop); + break; #endif /* OTHER_PHY */ + } + } +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + + SkGmInitPhyMarv(pAC, IoC, Port, DoLoop); } +#endif /* YUKON */ + } /* SkMacInitPhy */ -#ifndef SK_DIAG +#ifdef GENESIS /****************************************************************************** * - * SkXmAutoNegLipaXmac() - Decides whether Link Partner could do auto-neg + * SkXmAutoNegDoneXmac() - Auto-negotiation handling * - * This function analyses the Interrupt status word. If any of the - * Auto-negotiating interrupt bits are set, the PLipaAutoNeg variable - * is set true. + * Description: + * This function handles the auto-negotiation if the Done bit is set. + * + * Returns: + * SK_AND_OK o.k. + * SK_AND_DUP_CAP Duplex capability error happened + * SK_AND_OTHER Other error happened */ -void SkXmAutoNegLipaXmac( +static int SkXmAutoNegDoneXmac( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ -int Port, /* Port Index (MAC_1 + n) */ -SK_U16 IStatus) /* Interrupt Status word to analyse */ +int Port) /* Port Index (MAC_1 + n) */ { SK_GEPORT *pPrt; + SK_U16 ResAb; /* Resolved Ability */ + SK_U16 LPAb; /* Link Partner Ability */ + + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("AutoNegDoneXmac, Port %d\n", Port)); pPrt = &pAC->GIni.GP[Port]; - if (pPrt->PLipaAutoNeg != SK_LIPA_AUTO && - (IStatus & (XM_IS_LIPA_RC | XM_IS_RX_PAGE | XM_IS_AND)) != 0) { + /* Get PHY parameters */ + SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LPAb); + SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_RES_ABI, &ResAb); + if ((LPAb & PHY_X_AN_RFB) != 0) { + /* At least one of the remote fault bit is set */ + /* Error */ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegLipa: AutoNeg detected on Port %d, IStatus=0x%04x\n", - Port, IStatus)); - pPrt->PLipaAutoNeg = SK_LIPA_AUTO; - } -} /* SkXmAutoNegLipaXmac */ - - -/****************************************************************************** - * - * SkMacAutoNegLipaPhy() - Decides whether Link Partner could do auto-neg - * - * This function analyses the PHY status word. - * If any of the Auto-negotiating bits are set, the PLipaAutoNeg variable - * is set true. - */ -void SkMacAutoNegLipaPhy( -SK_AC *pAC, /* adapter context */ -SK_IOC IoC, /* IO context */ -int Port, /* Port Index (MAC_1 + n) */ -SK_U16 PhyStat) /* PHY Status word to analyse */ -{ - SK_GEPORT *pPrt; - - pPrt = &pAC->GIni.GP[Port]; - - if (pPrt->PLipaAutoNeg != SK_LIPA_AUTO && - (PhyStat & PHY_ST_AN_OVER) != 0) { - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegLipa: AutoNeg detected on Port %d, PhyStat=0x%04x\n", - Port, PhyStat)); - pPrt->PLipaAutoNeg = SK_LIPA_AUTO; - } -} /* SkMacAutoNegLipaPhy */ -#endif /* SK_DIAG */ - - -/****************************************************************************** - * - * SkXmAutoNegDoneXmac() - Auto-negotiation handling - * - * Description: - * This function handles the auto-negotiation if the Done bit is set. - * - * Returns: - * SK_AND_OK o.k. - * SK_AND_DUP_CAP Duplex capability error happened - * SK_AND_OTHER Other error happened - */ -static int SkXmAutoNegDoneXmac( -SK_AC *pAC, /* adapter context */ -SK_IOC IoC, /* IO context */ -int Port) /* Port Index (MAC_1 + n) */ -{ - SK_GEPORT *pPrt; - SK_U16 ResAb; /* Resolved Ability */ - SK_U16 LPAb; /* Link Partner Ability */ - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegDoneXmac, Port %d\n",Port)); - - pPrt = &pAC->GIni.GP[Port]; - - /* Get PHY parameters */ - SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LPAb); - SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_RES_ABI, &ResAb); - - if ((LPAb & PHY_X_AN_RFB) != 0) { - /* At least one of the remote fault bit is set */ - /* Error */ - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegFail: Remote fault bit set Port %d\n", Port)); - pPrt->PAutoNegFail = SK_TRUE; - return(SK_AND_OTHER); + ("AutoNegFail: Remote fault bit set Port %d\n", Port)); + pPrt->PAutoNegFail = SK_TRUE; + return(SK_AND_OTHER); } /* Check Duplex mismatch */ @@ -2923,7 +3082,7 @@ SK_U16 LPAb; /* Link Partner Ability */ SK_U16 AuxStat; /* Auxiliary Status */ -#if 0 +#ifdef TEST_ONLY 01-Sep-2000 RA;:;: SK_U16 ResAb; /* Resolved Ability */ #endif /* 0 */ @@ -2934,7 +3093,7 @@ /* Get PHY parameters */ SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &LPAb); -#if 0 +#ifdef TEST_ONLY 01-Sep-2000 RA;:;: SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &ResAb); #endif /* 0 */ @@ -2964,7 +3123,7 @@ return(SK_AND_DUP_CAP); } -#if 0 +#ifdef TEST_ONLY 01-Sep-2000 RA;:;: /* Check Master/Slave resolution */ if ((ResAb & PHY_B_1000S_MSF) != 0) { @@ -2979,7 +3138,7 @@ SK_MS_STAT_MASTER : SK_MS_STAT_SLAVE; #endif /* 0 */ - /* Check PAUSE mismatch */ + /* Check PAUSE mismatch ??? */ /* We are using IEEE 802.3z/D5.0 Table 37-4 */ if ((AuxStat & PHY_B_AS_PAUSE_MSK) == PHY_B_AS_PAUSE_MSK) { /* Symmetric PAUSE */ @@ -3001,8 +3160,10 @@ return(SK_AND_OK); } /* SkXmAutoNegDoneBcom */ +#endif /* GENESIS */ +#ifdef YUKON /****************************************************************************** * * SkGmAutoNegDoneMarv() - Auto-negotiation handling @@ -3032,7 +3193,7 @@ /* Get PHY parameters */ SkGmPhyRead(pAC, IoC, Port, PHY_MARV_AUNE_LP, &LPAb); - if ((LPAb & PHY_B_AN_RF) != 0) { + if ((LPAb & PHY_M_AN_RF) != 0) { SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, ("AutoNegFail: Remote fault bit set Port %d\n", Port)); pPrt->PAutoNegFail = SK_TRUE; @@ -3059,7 +3220,7 @@ /* Check Speed & Duplex resolved */ if ((AuxStat & PHY_M_PS_SPDUP_RES) == 0) { SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegFail: Speed & Duplex not resolved Port %d\n", Port)); + ("AutoNegFail: Speed & Duplex not resolved, Port %d\n", Port)); pPrt->PAutoNegFail = SK_TRUE; pPrt->PLinkModeStatus = SK_LMODE_STAT_UNKNOWN; return(SK_AND_DUP_CAP); @@ -3072,7 +3233,7 @@ pPrt->PLinkModeStatus = SK_LMODE_STAT_AUTOHALF; } - /* Check PAUSE mismatch */ + /* Check PAUSE mismatch ??? */ /* We are using IEEE 802.3z/D5.0 Table 37-4 */ if ((AuxStat & PHY_M_PS_PAUSE_MSK) == PHY_M_PS_PAUSE_MSK) { /* Symmetric PAUSE */ @@ -3105,6 +3266,7 @@ return(SK_AND_OK); } /* SkGmAutoNegDoneMarv */ +#endif /* YUKON */ #ifdef OTHER_PHY @@ -3131,7 +3293,7 @@ SK_U16 QuickStat; /* Auxiliary Status */ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("AutoNegDoneLone, Port %d\n",Port)); + ("AutoNegDoneLone, Port %d\n", Port)); pPrt = &pAC->GIni.GP[Port]; /* Get PHY parameters */ @@ -3255,30 +3417,41 @@ SK_GEPORT *pPrt; int Rtv; + Rtv = SK_AND_OK; + pPrt = &pAC->GIni.GP[Port]; - switch (pPrt->PhyType) { - case SK_PHY_XMAC: - Rtv = SkXmAutoNegDoneXmac(pAC, IoC, Port); - break; - case SK_PHY_BCOM: - Rtv = SkXmAutoNegDoneBcom(pAC, IoC, Port); - break; - case SK_PHY_MARV_COPPER: - case SK_PHY_MARV_FIBER: - Rtv = SkGmAutoNegDoneMarv(pAC, IoC, Port); - break; +#ifdef GENESIS + if (pAC->GIni.GIGenesis) { + + switch (pPrt->PhyType) { + + case SK_PHY_XMAC: + Rtv = SkXmAutoNegDoneXmac(pAC, IoC, Port); + break; + case SK_PHY_BCOM: + Rtv = SkXmAutoNegDoneBcom(pAC, IoC, Port); + break; #ifdef OTHER_PHY - case SK_PHY_LONE: - Rtv = SkXmAutoNegDoneLone(pAC, IoC, Port); - break; - case SK_PHY_NAT: - Rtv = SkXmAutoNegDoneNat(pAC, IoC, Port); - break; + case SK_PHY_LONE: + Rtv = SkXmAutoNegDoneLone(pAC, IoC, Port); + break; + case SK_PHY_NAT: + Rtv = SkXmAutoNegDoneNat(pAC, IoC, Port); + break; #endif /* OTHER_PHY */ - default: - return(SK_AND_OTHER); + default: + return(SK_AND_OTHER); + } + } +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { + + Rtv = SkGmAutoNegDoneMarv(pAC, IoC, Port); } +#endif /* YUKON */ if (Rtv != SK_AND_OK) { return(Rtv); @@ -3293,6 +3466,7 @@ } /* SkMacAutoNegDone */ +#ifdef GENESIS /****************************************************************************** * * SkXmSetRxTxEn() - Special Set Rx/Tx Enable and some features in XMAC @@ -3346,8 +3520,10 @@ XM_IN16(IoC, Port, XM_MMU_CMD, &Word); } /* SkXmSetRxTxEn */ +#endif /* GENESIS */ +#ifdef YUKON /****************************************************************************** * * SkGmSetRxTxEn() - Special Set Rx/Tx Enable and some features in GMAC @@ -3386,14 +3562,17 @@ break; } - GM_OUT16(IoC, Port, GM_GP_CTRL, Ctrl | GM_GPCR_RX_ENA | GM_GPCR_TX_ENA); + GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Ctrl | GM_GPCR_RX_ENA | + GM_GPCR_TX_ENA)); /* dummy read to ensure writing */ GM_IN16(IoC, Port, GM_GP_CTRL, &Ctrl); } /* SkGmSetRxTxEn */ +#endif /* YUKON */ +#ifndef SK_SLIM /****************************************************************************** * * SkMacSetRxTxEn() - Special Set Rx/Tx Enable and parameters @@ -3408,16 +3587,22 @@ int Port, /* Port Index (MAC_1 + n) */ int Para) { +#ifdef GENESIS if (pAC->GIni.GIGenesis) { SkXmSetRxTxEn(pAC, IoC, Port, Para); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { SkGmSetRxTxEn(pAC, IoC, Port, Para); } +#endif /* YUKON */ } /* SkMacSetRxTxEn */ +#endif /* !SK_SLIM */ /****************************************************************************** @@ -3438,7 +3623,9 @@ SK_GEPORT *pPrt; SK_U16 Reg; /* 16-bit register value */ SK_U16 IntMask; /* MAC interrupt mask */ +#ifdef GENESIS SK_U16 SWord; +#endif pPrt = &pAC->GIni.GP[Port]; @@ -3455,6 +3642,7 @@ return(0); } +#ifdef GENESIS if (pAC->GIni.GIGenesis) { /* set Duplex Mode and Pause Mode */ SkXmInitDupMd(pAC, IoC, Port); @@ -3502,7 +3690,8 @@ SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &SWord); SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, (SK_U16)(SWord & ~PHY_B_AC_DIS_PM)); - SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_INT_MASK, PHY_B_DEF_MSK); + SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_INT_MASK, + (SK_U16)PHY_B_DEF_MSK); break; #ifdef OTHER_PHY case SK_PHY_LONE: @@ -3519,7 +3708,10 @@ /* enable Rx/Tx */ XM_OUT16(IoC, Port, XM_MMU_CMD, Reg | XM_MMU_ENA_RX | XM_MMU_ENA_TX); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* * Initialize the Interrupt Mask Register. Default IRQs are... * - Rx Counter Event Overflow @@ -3545,13 +3737,16 @@ } /* enable Rx/Tx */ - GM_OUT16(IoC, Port, GM_GP_CTRL, Reg | GM_GPCR_RX_ENA | GM_GPCR_TX_ENA); + GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Reg | GM_GPCR_RX_ENA | + GM_GPCR_TX_ENA)); #ifndef VCPU /* Enable all PHY interrupts */ - SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK); + SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, + (SK_U16)PHY_M_DEF_MSK); #endif /* VCPU */ } +#endif /* YUKON */ return(0); @@ -3573,6 +3768,7 @@ { SK_U16 Word; +#ifdef GENESIS if (pAC->GIni.GIGenesis) { XM_IN16(IoC, Port, XM_MMU_CMD, &Word); @@ -3582,15 +3778,21 @@ /* dummy read to ensure writing */ XM_IN16(IoC, Port, XM_MMU_CMD, &Word); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { GM_IN16(IoC, Port, GM_GP_CTRL, &Word); - GM_OUT16(IoC, Port, GM_GP_CTRL, Word & ~(GM_GPCR_RX_ENA | GM_GPCR_TX_ENA)); + GM_OUT16(IoC, Port, GM_GP_CTRL, (SK_U16)(Word & ~(GM_GPCR_RX_ENA | + GM_GPCR_TX_ENA))); /* dummy read to ensure writing */ GM_IN16(IoC, Port, GM_GP_CTRL, &Word); } +#endif /* YUKON */ + } /* SkMacRxTxDisable */ @@ -3608,10 +3810,13 @@ int Port) /* Port Index (MAC_1 + n) */ { SK_GEPORT *pPrt; +#ifdef GENESIS SK_U16 Word; +#endif pPrt = &pAC->GIni.GP[Port]; +#ifdef GENESIS if (pAC->GIni.GIGenesis) { /* disable all XMAC IRQs */ @@ -3642,7 +3847,10 @@ #endif /* OTHER_PHY */ } } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* disable all GMAC IRQs */ SK_OUT8(IoC, GMAC_IRQ_MSK, 0); @@ -3651,6 +3859,8 @@ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_INT_MASK, 0); #endif /* VCPU */ } +#endif /* YUKON */ + } /* SkMacIrqDisable */ @@ -3683,7 +3893,8 @@ /* setup Mode Register */ XM_OUT32(IoC, Port, XM_MODE, MdReg); -} /* SkXmSendCont*/ +} /* SkXmSendCont */ + /****************************************************************************** * @@ -3724,12 +3935,74 @@ TimeCtrl = GMT_ST_STOP | GMT_ST_CLR_IRQ; } /* Start/Stop Time Stamp Timer */ - SK_OUT8(pAC, GMAC_TI_ST_CTRL, TimeCtrl); + SK_OUT8(IoC, GMAC_TI_ST_CTRL, TimeCtrl); } + } /* SkMacTimeStamp*/ -#else /* SK_DIAG */ +#else /* !SK_DIAG */ + +#ifdef GENESIS +/****************************************************************************** + * + * SkXmAutoNegLipaXmac() - Decides whether Link Partner could do auto-neg + * + * This function analyses the Interrupt status word. If any of the + * Auto-negotiating interrupt bits are set, the PLipaAutoNeg variable + * is set true. + */ +void SkXmAutoNegLipaXmac( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +int Port, /* Port Index (MAC_1 + n) */ +SK_U16 IStatus) /* Interrupt Status word to analyse */ +{ + SK_GEPORT *pPrt; + + pPrt = &pAC->GIni.GP[Port]; + + if (pPrt->PLipaAutoNeg != SK_LIPA_AUTO && + (IStatus & (XM_IS_LIPA_RC | XM_IS_RX_PAGE | XM_IS_AND)) != 0) { + + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("AutoNegLipa: AutoNeg detected on Port %d, IStatus=0x%04X\n", + Port, IStatus)); + pPrt->PLipaAutoNeg = SK_LIPA_AUTO; + } +} /* SkXmAutoNegLipaXmac */ +#endif /* GENESIS */ + + +/****************************************************************************** + * + * SkMacAutoNegLipaPhy() - Decides whether Link Partner could do auto-neg + * + * This function analyses the PHY status word. + * If any of the Auto-negotiating bits are set, the PLipaAutoNeg variable + * is set true. + */ +void SkMacAutoNegLipaPhy( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +int Port, /* Port Index (MAC_1 + n) */ +SK_U16 PhyStat) /* PHY Status word to analyse */ +{ + SK_GEPORT *pPrt; + + pPrt = &pAC->GIni.GP[Port]; + if (pPrt->PLipaAutoNeg != SK_LIPA_AUTO && + (PhyStat & PHY_ST_AN_OVER) != 0) { + + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("AutoNegLipa: AutoNeg detected on Port %d, PhyStat=0x%04X\n", + Port, PhyStat)); + pPrt->PLipaAutoNeg = SK_LIPA_AUTO; + } +} /* SkMacAutoNegLipaPhy */ + + +#ifdef GENESIS /****************************************************************************** * * SkXmIrq() - Interrupt Service Routine @@ -3758,6 +4031,9 @@ SK_EVPARA Para; SK_U16 IStatus; /* Interrupt status read from the XMAC */ SK_U16 IStatus2; +#ifdef SK_SLIM + SK_U64 OverflowStatus; +#endif pPrt = &pAC->GIni.GP[Port]; @@ -3775,7 +4051,7 @@ } SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("XmacIrq Port %d Isr 0x%04x\n", Port, IStatus)); + ("XmacIrq Port %d Isr 0x%04X\n", Port, IStatus)); if (!pPrt->PHWLinkUp) { /* Spurious XMAC interrupt */ @@ -3789,7 +4065,7 @@ XM_IN16(IoC, Port, XM_ISRC, &IStatus2); SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("SkXmIrq: Link async. Double check Port %d 0x%04x 0x%04x\n", + ("SkXmIrq: Link async. Double check Port %d 0x%04X 0x%04X\n", Port, IStatus, IStatus2)); IStatus &= ~XM_IS_INP_ASS; IStatus |= IStatus2; @@ -3838,14 +4114,20 @@ /* Combined Tx & Rx Counter Overflow SIRQ Event */ if ((IStatus & (XM_IS_RXC_OV | XM_IS_TXC_OV)) != 0) { +#ifdef SK_SLIM + SkXmOverflowStatus(pAC, IoC, Port, IStatus, &OverflowStatus); +#else Para.Para32[0] = (SK_U32)Port; Para.Para32[1] = (SK_U32)IStatus; SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_SIRQ_OVERFLOW, Para); +#endif /* SK_SLIM */ } if ((IStatus & XM_IS_RXF_OV) != 0) { /* normal situation -> no effect */ +#ifdef DEBUG pPrt->PRxOverCnt++; +#endif /* DEBUG */ } if ((IStatus & XM_IS_TXF_UR) != 0) { @@ -3861,8 +4143,10 @@ /* not served here */ } } /* SkXmIrq */ +#endif /* GENESIS */ +#ifdef YUKON /****************************************************************************** * * SkGmIrq() - Interrupt Service Routine @@ -3880,32 +4164,43 @@ int Port) /* Port Index (MAC_1 + n) */ { SK_GEPORT *pPrt; - SK_EVPARA Para; SK_U8 IStatus; /* Interrupt status */ +#ifdef SK_SLIM + SK_U64 OverflowStatus; +#else + SK_EVPARA Para; +#endif pPrt = &pAC->GIni.GP[Port]; SK_IN8(IoC, GMAC_IRQ_SRC, &IStatus); +#ifdef XXX /* LinkPartner Auto-negable? */ SkMacAutoNegLipaPhy(pAC, IoC, Port, IStatus); +#endif /* XXX */ SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ, - ("GmacIrq Port %d Isr 0x%04x\n", Port, IStatus)); + ("GmacIrq Port %d Isr 0x%04X\n", Port, IStatus)); /* Combined Tx & Rx Counter Overflow SIRQ Event */ if (IStatus & (GM_IS_RX_CO_OV | GM_IS_TX_CO_OV)) { /* these IRQs will be cleared by reading GMACs register */ +#ifdef SK_SLIM + SkGmOverflowStatus(pAC, IoC, Port, IStatus, &OverflowStatus); +#else Para.Para32[0] = (SK_U32)Port; Para.Para32[1] = (SK_U32)IStatus; SkPnmiEvent(pAC, IoC, SK_PNMI_EVT_SIRQ_OVERFLOW, Para); +#endif } if (IStatus & GM_IS_RX_FF_OR) { /* clear GMAC Rx FIFO Overrun IRQ */ SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_CLI_RX_FO); - +#ifdef DEBUG pPrt->PRxOverCnt++; +#endif /* DEBUG */ } if (IStatus & GM_IS_TX_FF_UR) { @@ -3923,6 +4218,8 @@ /* not served here */ } } /* SkGmIrq */ +#endif /* YUKON */ + /****************************************************************************** * @@ -3938,19 +4235,25 @@ SK_IOC IoC, /* IO context */ int Port) /* Port Index (MAC_1 + n) */ { - +#ifdef GENESIS if (pAC->GIni.GIGenesis) { /* IRQ from XMAC */ SkXmIrq(pAC, IoC, Port); } - else { +#endif /* GENESIS */ + +#ifdef YUKON + if (pAC->GIni.GIYukon) { /* IRQ from GMAC */ SkGmIrq(pAC, IoC, Port); } +#endif /* YUKON */ + } /* SkMacIrq */ #endif /* !SK_DIAG */ +#ifdef GENESIS /****************************************************************************** * * SkXmUpdateStats() - Force the XMAC to output the current statistic @@ -4000,24 +4303,6 @@ return(0); } /* SkXmUpdateStats */ -/****************************************************************************** - * - * SkGmUpdateStats() - Force the GMAC to output the current statistic - * - * Description: - * Empty function for GMAC. Statistic data is accessible in direct way. - * - * Returns: - * 0: success - * 1: something went wrong - */ -int SkGmUpdateStats( -SK_AC *pAC, /* adapter context */ -SK_IOC IoC, /* IO context */ -unsigned int Port) /* Port Index (MAC_1 + n) */ -{ - return(0); -} /****************************************************************************** * @@ -4033,11 +4318,11 @@ * 1: something went wrong */ int SkXmMacStatistic( -SK_AC *pAC, /* adapter context */ -SK_IOC IoC, /* IO context */ -unsigned int Port, /* Port Index (MAC_1 + n) */ -SK_U16 StatAddr, /* MIB counter base address */ -SK_U32 *pVal) /* ptr to return statistic value */ +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +unsigned int Port, /* Port Index (MAC_1 + n) */ +SK_U16 StatAddr, /* MIB counter base address */ +SK_U32 SK_FAR *pVal) /* ptr to return statistic value */ { if ((StatAddr < XM_TXF_OK) || (StatAddr > XM_RXF_MAX_SZ)) { @@ -4051,63 +4336,137 @@ return(0); } /* SkXmMacStatistic */ + /****************************************************************************** * - * SkGmMacStatistic() - Get GMAC counter value + * SkXmResetCounter() - Clear MAC statistic counter * * Description: - * Gets the 32bit counter value. Except for the octet counters - * the lower 32bit are counted in hardware and the upper 32bit - * must be counted in software by monitoring counter overflow interrupts. + * Force the XMAC to clear its statistic counter. * * Returns: * 0: success * 1: something went wrong */ -int SkGmMacStatistic( +int SkXmResetCounter( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ -unsigned int Port, /* Port Index (MAC_1 + n) */ -SK_U16 StatAddr, /* MIB counter base address */ -SK_U32 *pVal) /* ptr to return statistic value */ +unsigned int Port) /* Port Index (MAC_1 + n) */ { + XM_OUT16(IoC, Port, XM_STAT_CMD, XM_SC_CLR_RXC | XM_SC_CLR_TXC); + /* Clear two times according to Errata #3 */ + XM_OUT16(IoC, Port, XM_STAT_CMD, XM_SC_CLR_RXC | XM_SC_CLR_TXC); - if ((StatAddr < GM_RXF_UC_OK) || (StatAddr > GM_TXE_FIFO_UR)) { - - SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E022, SKERR_HWI_E022MSG); - - SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, - ("SkGmMacStat: wrong MIB counter 0x%04X\n", StatAddr)); - return(1); + return(0); +} /* SkXmResetCounter */ + + +/****************************************************************************** + * + * SkXmOverflowStatus() - Gets the status of counter overflow interrupt + * + * Description: + * Checks the source causing an counter overflow interrupt. On success the + * resulting counter overflow status is written to , whereas the + * upper dword stores the XMAC ReceiveCounterEvent register and the lower + * dword the XMAC TransmitCounterEvent register. + * + * Note: + * For XMAC the interrupt source is a self-clearing register, so the source + * must be checked only once. SIRQ module does another check to be sure + * that no interrupt get lost during process time. + * + * Returns: + * 0: success + * 1: something went wrong + */ +int SkXmOverflowStatus( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +unsigned int Port, /* Port Index (MAC_1 + n) */ +SK_U16 IStatus, /* Interupt Status from MAC */ +SK_U64 SK_FAR *pStatus) /* ptr for return overflow status value */ +{ + SK_U64 Status; /* Overflow status */ + SK_U32 RegVal; + + Status = 0; + + if ((IStatus & XM_IS_RXC_OV) != 0) { + + XM_IN32(IoC, Port, XM_RX_CNT_EV, &RegVal); + Status |= (SK_U64)RegVal << 32; + } + + if ((IStatus & XM_IS_TXC_OV) != 0) { + + XM_IN32(IoC, Port, XM_TX_CNT_EV, &RegVal); + Status |= (SK_U64)RegVal; } - - GM_IN32(IoC, Port, StatAddr, pVal); + + *pStatus = Status; return(0); -} /* SkGmMacStatistic */ +} /* SkXmOverflowStatus */ +#endif /* GENESIS */ + +#ifdef YUKON /****************************************************************************** * - * SkXmResetCounter() - Clear MAC statistic counter + * SkGmUpdateStats() - Force the GMAC to output the current statistic * * Description: - * Force the XMAC to clear its statistic counter. + * Empty function for GMAC. Statistic data is accessible in direct way. * * Returns: * 0: success * 1: something went wrong */ -int SkXmResetCounter( +int SkGmUpdateStats( SK_AC *pAC, /* adapter context */ SK_IOC IoC, /* IO context */ unsigned int Port) /* Port Index (MAC_1 + n) */ { - XM_OUT16(IoC, Port, XM_STAT_CMD, XM_SC_CLR_RXC | XM_SC_CLR_TXC); - /* Clear two times according to Errata #3 */ - XM_OUT16(IoC, Port, XM_STAT_CMD, XM_SC_CLR_RXC | XM_SC_CLR_TXC); + return(0); +} + + +/****************************************************************************** + * + * SkGmMacStatistic() - Get GMAC counter value + * + * Description: + * Gets the 32bit counter value. Except for the octet counters + * the lower 32bit are counted in hardware and the upper 32bit + * must be counted in software by monitoring counter overflow interrupts. + * + * Returns: + * 0: success + * 1: something went wrong + */ +int SkGmMacStatistic( +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +unsigned int Port, /* Port Index (MAC_1 + n) */ +SK_U16 StatAddr, /* MIB counter base address */ +SK_U32 SK_FAR *pVal) /* ptr to return statistic value */ +{ + + if ((StatAddr < GM_RXF_UC_OK) || (StatAddr > GM_TXE_FIFO_UR)) { + + SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E022, SKERR_HWI_E022MSG); + + SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL, + ("SkGmMacStat: wrong MIB counter 0x%04X\n", StatAddr)); + return(1); + } + + GM_IN32(IoC, Port, StatAddr, pVal); return(0); -} /* SkXmResetCounter */ +} /* SkGmMacStatistic */ + /****************************************************************************** * @@ -4131,7 +4490,6 @@ GM_IN16(IoC, Port, GM_PHY_ADDR, &Reg); -#ifndef VCPU /* set MIB Clear Counter Mode */ GM_OUT16(IoC, Port, GM_PHY_ADDR, Reg | GM_PAR_MIB_CLR); @@ -4143,59 +4501,10 @@ /* clear MIB Clear Counter Mode */ GM_OUT16(IoC, Port, GM_PHY_ADDR, Reg); -#endif /* !VCPU */ return(0); } /* SkGmResetCounter */ -/****************************************************************************** - * - * SkXmOverflowStatus() - Gets the status of counter overflow interrupt - * - * Description: - * Checks the source causing an counter overflow interrupt. On success the - * resulting counter overflow status is written to , whereas the - * upper dword stores the XMAC ReceiveCounterEvent register and the lower - * dword the XMAC TransmitCounterEvent register. - * - * Note: - * For XMAC the interrupt source is a self-clearing register, so the source - * must be checked only once. SIRQ module does another check to be sure - * that no interrupt get lost during process time. - * - * Returns: - * 0: success - * 1: something went wrong - */ -int SkXmOverflowStatus( -SK_AC *pAC, /* adapter context */ -SK_IOC IoC, /* IO context */ -unsigned int Port, /* Port Index (MAC_1 + n) */ -SK_U16 IStatus, /* Interupt Status from MAC */ -SK_U64 *pStatus) /* ptr for return overflow status value */ -{ - SK_U64 Status; /* Overflow status */ - SK_U32 RegVal; - - Status = 0; - - if ((IStatus & XM_IS_RXC_OV) != 0) { - - XM_IN32(IoC, Port, XM_RX_CNT_EV, &RegVal); - Status |= (SK_U64)RegVal << 32; - } - - if ((IStatus & XM_IS_TXC_OV) != 0) { - - XM_IN32(IoC, Port, XM_TX_CNT_EV, &RegVal); - Status |= (SK_U64)RegVal; - } - - *pStatus = Status; - - return(0); -} /* SkXmOverflowStatus */ - /****************************************************************************** * @@ -4217,11 +4526,11 @@ * 1: something went wrong */ int SkGmOverflowStatus( -SK_AC *pAC, /* adapter context */ -SK_IOC IoC, /* IO context */ -unsigned int Port, /* Port Index (MAC_1 + n) */ -SK_U16 IStatus, /* Interupt Status from MAC */ -SK_U64 *pStatus) /* ptr for return overflow status value */ +SK_AC *pAC, /* adapter context */ +SK_IOC IoC, /* IO context */ +unsigned int Port, /* Port Index (MAC_1 + n) */ +SK_U16 IStatus, /* Interupt Status from MAC */ +SK_U64 SK_FAR *pStatus) /* ptr for return overflow status value */ { SK_U64 Status; /* Overflow status */ SK_U16 RegVal; @@ -4252,6 +4561,8 @@ return(0); } /* SkGmOverflowStatus */ + +#ifndef SK_SLIM /****************************************************************************** * * SkGmCableDiagStatus() - Starts / Gets status of cable diagnostic test @@ -4305,7 +4616,7 @@ /* start Cable Diagnostic Test */ SkGmPhyWrite(pAC, IoC, Port, PHY_MARV_CABLE_DIAG, - RegVal | PHY_M_CABD_ENA_TEST); + (SK_U16)(RegVal | PHY_M_CABD_ENA_TEST)); return(0); } @@ -4336,5 +4647,7 @@ return(0); } /* SkGmCableDiagStatus */ +#endif /* !SK_SLIM */ +#endif /* YUKON */ /* End of file */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sonic.c linux-2.4.23-pre8/drivers/net/sonic.c --- linux-2.4.22/drivers/net/sonic.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sonic.c 2003-10-22 22:49:45.000000000 +0000 @@ -223,7 +223,7 @@ /* We must free the original skb */ if (lp->tx_skb[entry]) { - dev_kfree_skb(lp->tx_skb[entry]); + dev_kfree_skb_irq(lp->tx_skb[entry]); lp->tx_skb[entry] = 0; } /* and the VDMA address */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sungem.c linux-2.4.23-pre8/drivers/net/sungem.c --- linux-2.4.22/drivers/net/sungem.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sungem.c 2003-10-22 22:49:45.000000000 +0000 @@ -2330,17 +2330,14 @@ gp->hw_running = 1; } - spin_lock_irq(&gp->lock); - /* We can now request the interrupt as we know it's masked * on the controller */ if (request_irq(gp->pdev->irq, gem_interrupt, SA_SHIRQ, dev->name, (void *)dev)) { - spin_unlock_irq(&gp->lock); - printk(KERN_ERR "%s: failed to request irq !\n", gp->dev->name); + spin_lock_irq(&gp->lock); #ifdef CONFIG_ALL_PPC if (!hw_was_up && gp->pdev->vendor == PCI_VENDOR_ID_APPLE) gem_apple_powerdown(gp); @@ -2349,10 +2346,13 @@ gp->pm_timer.expires = jiffies + 10*HZ; add_timer(&gp->pm_timer); up(&gp->pm_sem); + spin_unlock_irq(&gp->lock); return -EAGAIN; } + spin_lock_irq(&gp->lock); + /* Allocate & setup ring buffers */ gem_init_rings(gp); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/sunhme.c linux-2.4.23-pre8/drivers/net/sunhme.c --- linux-2.4.22/drivers/net/sunhme.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/sunhme.c 2003-10-22 22:48:26.000000000 +0000 @@ -2968,7 +2968,7 @@ dev_addr[0] = 0x08; dev_addr[1] = 0x00; dev_addr[2] = 0x20; - get_random_bytes(dev_addr, 3); + get_random_bytes(&dev_addr[3], 3); return; } #endif /* !(__sparc__) */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/tg3.c linux-2.4.23-pre8/drivers/net/tg3.c --- linux-2.4.22/drivers/net/tg3.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/tg3.c 2003-10-22 22:48:39.000000000 +0000 @@ -1,8 +1,8 @@ /* * tg3.c: Broadcom Tigon3 ethernet driver. * - * Copyright (C) 2001, 2002 David S. Miller (davem@redhat.com) - * Copyright (C) 2001, 2002 Jeff Garzik (jgarzik@pobox.com) + * Copyright (C) 2001, 2002, 2003 David S. Miller (davem@redhat.com) + * Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com) */ #include @@ -23,12 +23,22 @@ #include #include #include +#include +#include + +#include #include #include #include #include +#ifdef CONFIG_SPARC64 +#include +#include +#include +#endif + #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) #define TG3_VLAN_TAG_USED 1 #else @@ -36,18 +46,17 @@ #endif #ifdef NETIF_F_TSO -/* XXX some bug in tso firmware hangs tx cpu, disabled until fixed */ -#define TG3_DO_TSO 0 +#define TG3_TSO_SUPPORT 1 #else -#define TG3_DO_TSO 0 +#define TG3_TSO_SUPPORT 0 #endif #include "tg3.h" #define DRV_MODULE_NAME "tg3" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "1.6" -#define DRV_MODULE_RELDATE "June 11, 2003" +#define DRV_MODULE_VERSION "2.2" +#define DRV_MODULE_RELDATE "August 24, 2003" #define TG3_DEF_MAC_MODE 0 #define TG3_DEF_RX_MODE 0 @@ -69,7 +78,8 @@ /* hardware minimum and maximum for a single frame's data payload */ #define TG3_MIN_MTU 60 -#define TG3_MAX_MTU 9000 +#define TG3_MAX_MTU(tp) \ + (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 ? 9000 : 1500) /* These numbers seem to be hard coded in the NIC firmware somehow. * You can't change the ring sizes, but you can change where you place @@ -79,7 +89,17 @@ #define TG3_DEF_RX_RING_PENDING 200 #define TG3_RX_JUMBO_RING_SIZE 256 #define TG3_DEF_RX_JUMBO_RING_PENDING 100 -#define TG3_RX_RCB_RING_SIZE 1024 + +/* Do not place this n-ring entries value into the tp struct itself, + * we really want to expose these constants to GCC so that modulo et + * al. operations are done with shifts and masks instead of with + * hw multiply/modulo instructions. Another solution would be to + * replace things like '% foo' with '& (foo - 1)'. + */ +#define TG3_RX_RCB_RING_SIZE(tp) \ + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ? \ + 512 : 1024) + #define TG3_TX_RING_SIZE 512 #define TG3_DEF_TX_RING_PENDING (TG3_TX_RING_SIZE - 1) @@ -87,8 +107,8 @@ TG3_RX_RING_SIZE) #define TG3_RX_JUMBO_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \ TG3_RX_JUMBO_RING_SIZE) -#define TG3_RX_RCB_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \ - TG3_RX_RCB_RING_SIZE) +#define TG3_RX_RCB_RING_BYTES(tp) (sizeof(struct tg3_rx_buffer_desc) * \ + TG3_RX_RCB_RING_SIZE(tp)) #define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \ TG3_TX_RING_SIZE) #define TX_RING_GAP(TP) \ @@ -116,7 +136,7 @@ static int tg3_debug = -1; /* -1 == use TG3_DEF_MSG_ENABLE as value */ -static struct pci_device_id tg3_pci_tbl[] __devinitdata = { +static struct pci_device_id tg3_pci_tbl[] = { { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5700, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5701, @@ -129,6 +149,14 @@ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702FE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705_2, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M_2, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702X, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703X, @@ -139,10 +167,24 @@ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, - { PCI_VENDOR_ID_SYSKONNECT, 0x4400, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5782, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5788, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5901_2, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1001, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, + { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1003, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC9100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, { 0, } @@ -224,37 +266,6 @@ tg3_cond_int(tp); } -/* these netif_xxx funcs should be moved into generic net layer */ -static void netif_poll_disable(struct net_device *dev) -{ - while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) { - current->state = TASK_INTERRUPTIBLE; - schedule_timeout(1); - } -} - -static inline void netif_poll_enable(struct net_device *dev) -{ - clear_bit(__LINK_STATE_RX_SCHED, &dev->state); -} - -/* same as netif_rx_complete, except that local_irq_save(flags) - * has already been issued - */ -static inline void __netif_rx_complete(struct net_device *dev) -{ - if (!test_bit(__LINK_STATE_RX_SCHED, &dev->state)) BUG(); - list_del(&dev->poll_list); - clear_bit(__LINK_STATE_RX_SCHED, &dev->state); -} - -static inline void netif_tx_disable(struct net_device *dev) -{ - spin_lock_bh(&dev->xmit_lock); - netif_stop_queue(dev); - spin_unlock_bh(&dev->xmit_lock); -} - static inline void tg3_netif_stop(struct tg3 *tp) { netif_poll_disable(tp->dev); @@ -274,17 +285,28 @@ static void tg3_switch_clocks(struct tg3 *tp) { - if (tr32(TG3PCI_CLOCK_CTRL) & CLOCK_CTRL_44MHZ_CORE) { + u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL); + u32 orig_clock_ctrl; + + orig_clock_ctrl = clock_ctrl; + clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN | + CLOCK_CTRL_CLKRUN_OENABLE | + 0x1f); + tp->pci_clock_ctrl = clock_ctrl; + + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 && + (orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) { tw32(TG3PCI_CLOCK_CTRL, + clock_ctrl | (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK)); tr32(TG3PCI_CLOCK_CTRL); udelay(40); tw32(TG3PCI_CLOCK_CTRL, - (CLOCK_CTRL_ALTCLK)); + clock_ctrl | (CLOCK_CTRL_ALTCLK)); tr32(TG3PCI_CLOCK_CTRL); udelay(40); } - tw32(TG3PCI_CLOCK_CTRL, 0); + tw32(TG3PCI_CLOCK_CTRL, clock_ctrl); tr32(TG3PCI_CLOCK_CTRL); udelay(40); } @@ -387,24 +409,22 @@ return ret; } -/* This will reset the tigon3 PHY if there is no valid - * link unless the FORCE argument is non-zero. - */ -static int tg3_phy_reset(struct tg3 *tp, int force) +static void tg3_phy_set_wirespeed(struct tg3 *tp) { - u32 phy_status, phy_control; - int err, limit; + u32 val; - err = tg3_readphy(tp, MII_BMSR, &phy_status); - err |= tg3_readphy(tp, MII_BMSR, &phy_status); - if (err != 0) - return -EBUSY; + if (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) + return; - /* If we have link, and not forcing a reset, then nothing - * to do. - */ - if ((phy_status & BMSR_LSTATUS) != 0 && (force == 0)) - return 0; + tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x7007); + tg3_readphy(tp, MII_TG3_AUX_CTRL, &val); + tg3_writephy(tp, MII_TG3_AUX_CTRL, (val | (1 << 15) | (1 << 4))); +} + +static int tg3_bmcr_reset(struct tg3 *tp) +{ + u32 phy_control; + int limit, err; /* OK, reset it, and poll the BMCR_RESET bit until it * clears or we time out. @@ -422,12 +442,303 @@ if ((phy_control & BMCR_RESET) == 0) { udelay(40); - return 0; + break; } udelay(10); } + if (limit <= 0) + return -EBUSY; + + return 0; +} + +static int tg3_wait_macro_done(struct tg3 *tp) +{ + int limit = 100; + + while (limit--) { + u32 tmp32; + + tg3_readphy(tp, 0x16, &tmp32); + if ((tmp32 & 0x1000) == 0) + break; + } + if (limit <= 0) + return -EBUSY; + + return 0; +} + +static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp) +{ + static const u32 test_pat[4][6] = { + { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 }, + { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 }, + { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 }, + { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 } + }; + int chan; + + for (chan = 0; chan < 4; chan++) { + int i; + + tg3_writephy(tp, MII_TG3_DSP_ADDRESS, + (chan * 0x2000) | 0x0200); + tg3_writephy(tp, 0x16, 0x0002); + + for (i = 0; i < 6; i++) + tg3_writephy(tp, MII_TG3_DSP_RW_PORT, + test_pat[chan][i]); + + tg3_writephy(tp, 0x16, 0x0202); + if (tg3_wait_macro_done(tp)) { + *resetp = 1; + return -EBUSY; + } + + tg3_writephy(tp, MII_TG3_DSP_ADDRESS, + (chan * 0x2000) | 0x0200); + tg3_writephy(tp, 0x16, 0x0082); + if (tg3_wait_macro_done(tp)) { + *resetp = 1; + return -EBUSY; + } + + tg3_writephy(tp, 0x16, 0x0802); + if (tg3_wait_macro_done(tp)) { + *resetp = 1; + return -EBUSY; + } + + for (i = 0; i < 6; i += 2) { + u32 low, high; + + tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low); + tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high); + if (tg3_wait_macro_done(tp)) { + *resetp = 1; + return -EBUSY; + } + low &= 0x7fff; + high &= 0x000f; + if (low != test_pat[chan][i] || + high != test_pat[chan][i+1]) { + tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b); + tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001); + tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005); + + return -EBUSY; + } + } + } + + return 0; +} + +static int tg3_phy_reset_chanpat(struct tg3 *tp) +{ + int chan; + + for (chan = 0; chan < 4; chan++) { + int i; + + tg3_writephy(tp, MII_TG3_DSP_ADDRESS, + (chan * 0x2000) | 0x0200); + tg3_writephy(tp, 0x16, 0x0002); + for (i = 0; i < 6; i++) + tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000); + tg3_writephy(tp, 0x16, 0x0202); + if (tg3_wait_macro_done(tp)) + return -EBUSY; + } + + return 0; +} + +static int tg3_phy_reset_5703_4_5(struct tg3 *tp) +{ + u32 reg32, phy9_orig; + int retries, do_phy_reset, err; + + retries = 10; + do_phy_reset = 1; + do { + if (do_phy_reset) { + err = tg3_bmcr_reset(tp); + if (err) + return err; + do_phy_reset = 0; + } + + /* Disable transmitter and interrupt. */ + tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32); + reg32 |= 0x3000; + tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32); + + /* Set full-duplex, 1000 mbps. */ + tg3_writephy(tp, MII_BMCR, + BMCR_FULLDPLX | TG3_BMCR_SPEED1000); + + /* Set to master mode. */ + tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig); + tg3_writephy(tp, MII_TG3_CTRL, + (MII_TG3_CTRL_AS_MASTER | + MII_TG3_CTRL_ENABLE_AS_MASTER)); + + /* Enable SM_DSP_CLOCK and 6dB. */ + tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00); + + /* Block the PHY control access. */ + tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005); + tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0800); + + err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset); + if (!err) + break; + } while (--retries); + + err = tg3_phy_reset_chanpat(tp); + if (err) + return err; + + tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8005); + tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x0000); + + tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200); + tg3_writephy(tp, 0x16, 0x0000); + + tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400); + + tg3_writephy(tp, MII_TG3_CTRL, phy9_orig); + + tg3_readphy(tp, MII_TG3_EXT_CTRL, ®32); + reg32 &= ~0x3000; + tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32); + + return err; +} + +/* This will reset the tigon3 PHY if there is no valid + * link unless the FORCE argument is non-zero. + */ +static int tg3_phy_reset(struct tg3 *tp, int force) +{ + u32 phy_status; + int err; + + err = tg3_readphy(tp, MII_BMSR, &phy_status); + err |= tg3_readphy(tp, MII_BMSR, &phy_status); + if (err != 0) + return -EBUSY; + + /* If we have link, and not forcing a reset, then nothing + * to do. + */ + if ((phy_status & BMSR_LSTATUS) != 0 && (force == 0)) + return 0; + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + err = tg3_phy_reset_5703_4_5(tp); + if (err) + return err; + goto out; + } - return -EBUSY; + err = tg3_bmcr_reset(tp); + if (err) + return err; + +out: + tg3_phy_set_wirespeed(tp); + return 0; +} + +static void tg3_frob_aux_power(struct tg3 *tp) +{ + struct tg3 *tp_peer = tp; + + if ((tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) != 0) + return; + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) { + tp_peer = pci_get_drvdata(tp->pdev_peer); + if (!tp_peer) + BUG(); + } + + + if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 || + (tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0) { + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) { + tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | + (GRC_LCLCTRL_GPIO_OE0 | + GRC_LCLCTRL_GPIO_OE1 | + GRC_LCLCTRL_GPIO_OE2 | + GRC_LCLCTRL_GPIO_OUTPUT0 | + GRC_LCLCTRL_GPIO_OUTPUT1)); + tr32(GRC_LOCAL_CTRL); + udelay(100); + } else { + if (tp_peer != tp && + (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0) + return; + + tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | + (GRC_LCLCTRL_GPIO_OE0 | + GRC_LCLCTRL_GPIO_OE1 | + GRC_LCLCTRL_GPIO_OE2 | + GRC_LCLCTRL_GPIO_OUTPUT1 | + GRC_LCLCTRL_GPIO_OUTPUT2)); + tr32(GRC_LOCAL_CTRL); + udelay(100); + + tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | + (GRC_LCLCTRL_GPIO_OE0 | + GRC_LCLCTRL_GPIO_OE1 | + GRC_LCLCTRL_GPIO_OE2 | + GRC_LCLCTRL_GPIO_OUTPUT0 | + GRC_LCLCTRL_GPIO_OUTPUT1 | + GRC_LCLCTRL_GPIO_OUTPUT2)); + tr32(GRC_LOCAL_CTRL); + udelay(100); + + tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | + (GRC_LCLCTRL_GPIO_OE0 | + GRC_LCLCTRL_GPIO_OE1 | + GRC_LCLCTRL_GPIO_OE2 | + GRC_LCLCTRL_GPIO_OUTPUT0 | + GRC_LCLCTRL_GPIO_OUTPUT1)); + tr32(GRC_LOCAL_CTRL); + udelay(100); + } + } else { + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 && + GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) { + if (tp_peer != tp && + (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0) + return; + + tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | + (GRC_LCLCTRL_GPIO_OE1 | + GRC_LCLCTRL_GPIO_OUTPUT1)); + tr32(GRC_LOCAL_CTRL); + udelay(100); + + tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | + (GRC_LCLCTRL_GPIO_OE1)); + tr32(GRC_LOCAL_CTRL); + udelay(100); + + tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | + (GRC_LCLCTRL_GPIO_OE1 | + GRC_LCLCTRL_GPIO_OUTPUT1)); + tr32(GRC_LOCAL_CTRL); + udelay(100); + } + } } static int tg3_setup_phy(struct tg3 *); @@ -533,89 +844,65 @@ udelay(10); } - if (tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB) { + if (!(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB) && + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) { u32 base_val; - base_val = 0; - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) - base_val |= (CLOCK_CTRL_RXCLK_DISABLE | - CLOCK_CTRL_TXCLK_DISABLE); - - tw32(TG3PCI_CLOCK_CTRL, base_val | - CLOCK_CTRL_ALTCLK); - tr32(TG3PCI_CLOCK_CTRL); - udelay(40); + base_val = tp->pci_clock_ctrl; + base_val |= (CLOCK_CTRL_RXCLK_DISABLE | + CLOCK_CTRL_TXCLK_DISABLE); tw32(TG3PCI_CLOCK_CTRL, base_val | CLOCK_CTRL_ALTCLK | - CLOCK_CTRL_44MHZ_CORE); - tr32(TG3PCI_CLOCK_CTRL); - udelay(40); - - tw32(TG3PCI_CLOCK_CTRL, base_val | - CLOCK_CTRL_44MHZ_CORE); + CLOCK_CTRL_PWRDOWN_PLL133); tr32(TG3PCI_CLOCK_CTRL); udelay(40); } else { - u32 base_val; + u32 newbits1, newbits2; - base_val = 0; if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) - base_val |= (CLOCK_CTRL_RXCLK_DISABLE | - CLOCK_CTRL_TXCLK_DISABLE); + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) { + newbits1 = (CLOCK_CTRL_RXCLK_DISABLE | + CLOCK_CTRL_TXCLK_DISABLE | + CLOCK_CTRL_ALTCLK); + newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE; + } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + newbits1 = CLOCK_CTRL_625_CORE; + newbits2 = newbits1 | CLOCK_CTRL_ALTCLK; + } else { + newbits1 = CLOCK_CTRL_ALTCLK; + newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE; + } - tw32(TG3PCI_CLOCK_CTRL, base_val | - CLOCK_CTRL_ALTCLK | - CLOCK_CTRL_PWRDOWN_PLL133); + tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1); tr32(TG3PCI_CLOCK_CTRL); udelay(40); - } - if (!(tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) && - (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)) { - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) { - tw32(GRC_LOCAL_CTRL, - (GRC_LCLCTRL_GPIO_OE0 | - GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OE2 | - GRC_LCLCTRL_GPIO_OUTPUT0 | - GRC_LCLCTRL_GPIO_OUTPUT1)); - tr32(GRC_LOCAL_CTRL); - udelay(100); - } else { - tw32(GRC_LOCAL_CTRL, - (GRC_LCLCTRL_GPIO_OE0 | - GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OE2 | - GRC_LCLCTRL_GPIO_OUTPUT1 | - GRC_LCLCTRL_GPIO_OUTPUT2)); - tr32(GRC_LOCAL_CTRL); - udelay(100); + tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2); + tr32(TG3PCI_CLOCK_CTRL); + udelay(40); - tw32(GRC_LOCAL_CTRL, - (GRC_LCLCTRL_GPIO_OE0 | - GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OE2 | - GRC_LCLCTRL_GPIO_OUTPUT0 | - GRC_LCLCTRL_GPIO_OUTPUT1 | - GRC_LCLCTRL_GPIO_OUTPUT2)); - tr32(GRC_LOCAL_CTRL); - udelay(100); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) { + u32 newbits3; - tw32(GRC_LOCAL_CTRL, - (GRC_LCLCTRL_GPIO_OE0 | - GRC_LCLCTRL_GPIO_OE1 | - GRC_LCLCTRL_GPIO_OE2 | - GRC_LCLCTRL_GPIO_OUTPUT0 | - GRC_LCLCTRL_GPIO_OUTPUT1)); - tr32(GRC_LOCAL_CTRL); - udelay(100); + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) { + newbits3 = (CLOCK_CTRL_RXCLK_DISABLE | + CLOCK_CTRL_TXCLK_DISABLE | + CLOCK_CTRL_44MHZ_CORE); + } else { + newbits3 = CLOCK_CTRL_44MHZ_CORE; + } + + tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits3); + tr32(TG3PCI_CLOCK_CTRL); + udelay(40); } } + tg3_frob_aux_power(tp); + /* Finally, set the new power state. */ pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control); @@ -934,11 +1221,10 @@ /* Some third-party PHYs need to be reset on link going * down. - * - * XXX 5705 note: This workaround also applies to 5705_a0 */ if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 || - GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) && + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 || + tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) && netif_carrier_ok(tp->dev)) { tg3_readphy(tp, MII_BMSR, &bmsr); tg3_readphy(tp, MII_BMSR, &bmsr); @@ -1742,7 +2028,7 @@ pci_unmap_single(tp->pdev, pci_unmap_addr(ri, mapping), - (skb->len - skb->data_len), + skb_headlen(skb), PCI_DMA_TODEVICE); ri->skb = NULL; @@ -1913,7 +2199,7 @@ * Each TG3_BDINFO specifies a MAXLEN field and the first TG3_BDINFO * which is within the range of the new packet's length is chosen. * - * The "seperate ring for rx status" scheme may sound queer, but it makes + * The "separate ring for rx status" scheme may sound queer, but it makes * sense from a cache coherency perspective. If only the host writes * to the buffer post rings, and only the chip writes to the rx status * rings, then cache lines never move beyond shared-modified state. @@ -1928,7 +2214,7 @@ int received; hw_idx = tp->hw_status->idx[0].rx_producer; - sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE; + sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp); work_mask = 0; received = 0; while (sw_idx != hw_idx && budget > 0) { @@ -2029,13 +2315,13 @@ (*post_ptr)++; next_pkt_nopost: rx_rcb_ptr++; - sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE; + sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp); } /* ACK the status ring. */ tp->rx_rcb_ptr = rx_rcb_ptr; tw32_mailbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, - (rx_rcb_ptr % TG3_RX_RCB_RING_SIZE)); + (rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp))); if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) tr32(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW); @@ -2139,12 +2425,13 @@ return work_exists; } -static void tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = dev_id; struct tg3 *tp = dev->priv; struct tg3_hw_status *sblk = tp->hw_status; unsigned long flags; + unsigned int handled = 1; spin_lock_irqsave(&tp->lock, flags); @@ -2175,12 +2462,15 @@ 0x00000000); tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW); } + } else { /* shared interrupt */ + handled = 0; } spin_unlock_irqrestore(&tp->lock, flags); + + return IRQ_RETVAL(handled); } -static void tg3_init_rings(struct tg3 *); static int tg3_init_hw(struct tg3 *); static int tg3_halt(struct tg3 *); @@ -2198,7 +2488,6 @@ tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER; tg3_halt(tp); - tg3_init_rings(tp); tg3_init_hw(tp); spin_unlock(&tp->tx_lock); @@ -2236,7 +2525,7 @@ return -1; } - /* New SKB is guarenteed to be linear. */ + /* New SKB is guaranteed to be linear. */ entry = *start; new_addr = pci_map_single(tp->pdev, new_skb->data, new_skb->len, PCI_DMA_TODEVICE); @@ -2251,7 +2540,7 @@ int len; if (i == 0) - len = skb->len - skb->data_len; + len = skb_headlen(skb); else len = skb_shinfo(skb)->frags[i-1].size; pci_unmap_single(tp->pdev, @@ -2335,7 +2624,7 @@ int would_hit_hwbug; unsigned long flags; - len = (skb->len - skb->data_len); + len = skb_headlen(skb); /* No BH disabling for tx_lock here. We are running in BH disabled * context and TX reclaim runs via tp->poll inside of a software @@ -2371,10 +2660,36 @@ base_flags = 0; if (skb->ip_summed == CHECKSUM_HW) base_flags |= TXD_FLAG_TCPUDP_CSUM; -#if TG3_DO_TSO != 0 - if ((mss = skb_shinfo(skb)->tso_size) != 0) +#if TG3_TSO_SUPPORT != 0 + mss = 0; + if (skb->len > (tp->dev->mtu + ETH_HLEN) && + (mss = skb_shinfo(skb)->tso_size) != 0) { + int tcp_opt_len, ip_tcp_len; + + tcp_opt_len = ((skb->h.th->doff - 5) * 4); + ip_tcp_len = (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr); + base_flags |= (TXD_FLAG_CPU_PRE_DMA | TXD_FLAG_CPU_POST_DMA); + + skb->nh.iph->check = 0; + skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len); + skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr, + skb->nh.iph->daddr, + 0, IPPROTO_TCP, 0); + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + if (tcp_opt_len || skb->nh.iph->ihl > 5) { + int tsflags; + + tsflags = ((skb->nh.iph->ihl - 5) + + (tcp_opt_len >> 2)); + mss |= (tsflags << 11); + } + } else { + mss += tcp_opt_len; + } + } #else mss = 0; #endif @@ -2425,7 +2740,7 @@ } tg3_set_txd(tp, entry, mapping, len, - base_flags, (i == last) | (mss << 1)); + base_flags, (i == last)); entry = NEXT_TX(entry); } @@ -2443,7 +2758,7 @@ i = 0; while (entry != last_plus_one) { if (i == 0) - len = skb->len - skb->data_len; + len = skb_headlen(skb); else len = skb_shinfo(skb)->frags[i-1].size; @@ -2516,7 +2831,7 @@ u32 len, entry, base_flags, mss; unsigned long flags; - len = (skb->len - skb->data_len); + len = skb_headlen(skb); /* No BH disabling for tx_lock here. We are running in BH disabled * context and TX reclaim runs via tp->poll inside of a software @@ -2552,10 +2867,36 @@ base_flags = 0; if (skb->ip_summed == CHECKSUM_HW) base_flags |= TXD_FLAG_TCPUDP_CSUM; -#if TG3_DO_TSO != 0 - if ((mss = skb_shinfo(skb)->tso_size) != 0) +#if TG3_TSO_SUPPORT != 0 + mss = 0; + if (skb->len > (tp->dev->mtu + ETH_HLEN) && + (mss = skb_shinfo(skb)->tso_size) != 0) { + int tcp_opt_len, ip_tcp_len; + + tcp_opt_len = ((skb->h.th->doff - 5) * 4); + ip_tcp_len = (skb->nh.iph->ihl * 4) + sizeof(struct tcphdr); + base_flags |= (TXD_FLAG_CPU_PRE_DMA | TXD_FLAG_CPU_POST_DMA); + + skb->nh.iph->check = 0; + skb->nh.iph->tot_len = ntohs(mss + ip_tcp_len + tcp_opt_len); + skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr, + skb->nh.iph->daddr, + 0, IPPROTO_TCP, 0); + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + if (tcp_opt_len || skb->nh.iph->ihl > 5) { + int tsflags; + + tsflags = ((skb->nh.iph->ihl - 5) + + (tcp_opt_len >> 2)); + mss |= (tsflags << 11); + } + } else { + mss += tcp_opt_len; + } + } #else mss = 0; #endif @@ -2595,7 +2936,7 @@ pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); tg3_set_txd(tp, entry, mapping, len, - base_flags, (i == last) | (mss << 1)); + base_flags, (i == last)); entry = NEXT_TX(entry); } @@ -2655,7 +2996,7 @@ { struct tg3 *tp = dev->priv; - if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU) + if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp)) return -EINVAL; if (!netif_running(dev)) { @@ -2674,7 +3015,6 @@ tg3_set_mtu(dev, tp, new_mtu); - tg3_init_rings(tp); tg3_init_hw(tp); spin_unlock(&tp->tx_lock); @@ -2737,7 +3077,7 @@ pci_unmap_single(tp->pdev, pci_unmap_addr(txp, mapping), - (skb->len - skb->data_len), + skb_headlen(skb), PCI_DMA_TODEVICE); txp->skb = NULL; @@ -2760,8 +3100,8 @@ * * The chip has been shut down and the driver detached from * the networking, so no interrupts or new tx packets will - * end up in the driver. tp->{tx,}lock is not held and we are not - * in an interrupt context and thus may sleep. + * end up in the driver. tp->{tx,}lock are held and thus + * we may not sleep. */ static void tg3_init_rings(struct tg3 *tp) { @@ -2774,7 +3114,7 @@ /* Zero out all descriptors. */ memset(tp->rx_std, 0, TG3_RX_RING_BYTES); memset(tp->rx_jumbo, 0, TG3_RX_JUMBO_RING_BYTES); - memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES); + memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); if (tp->tg3_flags & TG3_FLAG_HOST_TXDS) { memset(tp->tx_ring, 0, TG3_TX_RING_BYTES); @@ -2857,7 +3197,7 @@ tp->rx_jumbo = NULL; } if (tp->rx_rcb) { - pci_free_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES, + pci_free_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp), tp->rx_rcb, tp->rx_rcb_mapping); tp->rx_rcb = NULL; } @@ -2915,7 +3255,7 @@ if (!tp->rx_jumbo) goto err_out; - tp->rx_rcb = pci_alloc_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES, + tp->rx_rcb = pci_alloc_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp), &tp->rx_rcb_mapping); if (!tp->rx_rcb) goto err_out; @@ -2962,6 +3302,23 @@ unsigned int i; u32 val; + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + switch (ofs) { + case RCVLSC_MODE: + case DMAC_MODE: + case MBFREE_MODE: + case BUFMGR_MODE: + case MEMARB_MODE: + /* We can't enable/disable these bits of the + * 5705, just say success. + */ + return 0; + + default: + break; + }; + } + val = tr32(ofs); val &= ~enable_bit; tw32(ofs, val); @@ -3058,18 +3415,20 @@ u32 val; u32 flags_save; - /* Force NVRAM to settle. - * This deals with a chip bug which can result in EEPROM - * corruption. - */ - if (tp->tg3_flags & TG3_FLAG_NVRAM) { - int i; + if (!(tp->tg3_flags2 & TG3_FLG2_SUN_5704)) { + /* Force NVRAM to settle. + * This deals with a chip bug which can result in EEPROM + * corruption. + */ + if (tp->tg3_flags & TG3_FLAG_NVRAM) { + int i; - tw32(NVRAM_SWARB, SWARB_REQ_SET1); - for (i = 0; i < 100000; i++) { - if (tr32(NVRAM_SWARB) & SWARB_GNT1) - break; - udelay(10); + tw32(NVRAM_SWARB, SWARB_REQ_SET1); + for (i = 0; i < 100000; i++) { + if (tr32(NVRAM_SWARB) & SWARB_GNT1) + break; + udelay(10); + } } } @@ -3083,7 +3442,10 @@ tp->tg3_flags &= ~TG3_FLAG_5701_REG_WRITE_BUG; /* do the reset */ - tw32(GRC_MISC_CFG, GRC_MISC_CFG_CORECLK_RESET); + val = GRC_MISC_CFG_CORECLK_RESET; + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) + val |= GRC_MISC_CFG_KEEP_GPHY_POWER; + tw32(GRC_MISC_CFG, val); /* restore 5701 hardware bug workaround flag */ tp->tg3_flags = flags_save; @@ -3119,6 +3481,13 @@ tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); + if ((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0 && + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + tp->pci_clock_ctrl |= + (CLOCK_CTRL_FORCE_CLKRUN | CLOCK_CTRL_CLKRUN_OENABLE); + tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl); + } + tw32(TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl); } @@ -3162,7 +3531,8 @@ udelay(10); } - if (i >= 100000) { + if (i >= 100000 && + !(tp->tg3_flags2 & TG3_FLG2_SUN_5704)) { printk(KERN_ERR PFX "tg3_halt timed out for %s, " "firmware will not restart magic=%08x\n", tp->dev->name, val); @@ -3300,7 +3670,7 @@ 0x00000000 }; -#if 0 /* All zeros, dont eat up space with it. */ +#if 0 /* All zeros, don't eat up space with it. */ u32 tg3FwData[(TG3_FW_DATA_LEN / sizeof(u32)) + 1] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 @@ -3313,28 +3683,32 @@ #define TX_CPU_SCRATCH_SIZE 0x04000 /* tp->lock is held. */ -static int tg3_reset_cpu(struct tg3 *tp, u32 offset) +static int tg3_halt_cpu(struct tg3 *tp, u32 offset) { int i; - tw32(offset + CPU_STATE, 0xffffffff); - tw32(offset + CPU_MODE, CPU_MODE_RESET); + if (offset == TX_CPU_BASE && + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) + BUG(); + if (offset == RX_CPU_BASE) { - for (i = 0; i < 10000; i++) - if (!(tr32(offset + CPU_MODE) & CPU_MODE_RESET)) + for (i = 0; i < 10000; i++) { + tw32(offset + CPU_STATE, 0xffffffff); + tw32(offset + CPU_MODE, CPU_MODE_HALT); + if (tr32(offset + CPU_MODE) & CPU_MODE_HALT) break; + } + tw32(offset + CPU_STATE, 0xffffffff); - tw32(offset + CPU_MODE, CPU_MODE_RESET); + tw32(offset + CPU_MODE, CPU_MODE_HALT); tr32(offset + CPU_MODE); udelay(10); } else { for (i = 0; i < 10000; i++) { - if (!(tr32(offset + CPU_MODE) & CPU_MODE_RESET)) - break; tw32(offset + CPU_STATE, 0xffffffff); - tw32(offset + CPU_MODE, CPU_MODE_RESET); - tr32(offset + CPU_MODE); - udelay(10); + tw32(offset + CPU_MODE, CPU_MODE_HALT); + if (tr32(offset + CPU_MODE) & CPU_MODE_HALT) + break; } } @@ -3366,38 +3740,52 @@ { int err, i; u32 orig_tg3_flags = tp->tg3_flags; + void (*write_op)(struct tg3 *, u32, u32); + + if (cpu_base == TX_CPU_BASE && + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + printk(KERN_ERR PFX "tg3_load_firmware_cpu: Trying to load " + "TX cpu firmware on %s which is 5705.\n", + tp->dev->name); + return -EINVAL; + } + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) + write_op = tg3_write_mem; + else + write_op = tg3_write_indirect_reg32; /* Force use of PCI config space for indirect register * write calls. */ tp->tg3_flags |= TG3_FLAG_PCIX_TARGET_HWBUG; - err = tg3_reset_cpu(tp, cpu_base); + err = tg3_halt_cpu(tp, cpu_base); if (err) goto out; for (i = 0; i < cpu_scratch_size; i += sizeof(u32)) - tg3_write_indirect_reg32(tp, cpu_scratch_base + i, 0); + write_op(tp, cpu_scratch_base + i, 0); tw32(cpu_base + CPU_STATE, 0xffffffff); tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT); for (i = 0; i < (info->text_len / sizeof(u32)); i++) - tg3_write_indirect_reg32(tp, (cpu_scratch_base + - (info->text_base & 0xffff) + - (i * sizeof(u32))), - (info->text_data ? - info->text_data[i] : 0)); + write_op(tp, (cpu_scratch_base + + (info->text_base & 0xffff) + + (i * sizeof(u32))), + (info->text_data ? + info->text_data[i] : 0)); for (i = 0; i < (info->rodata_len / sizeof(u32)); i++) - tg3_write_indirect_reg32(tp, (cpu_scratch_base + - (info->rodata_base & 0xffff) + - (i * sizeof(u32))), - (info->rodata_data ? - info->rodata_data[i] : 0)); + write_op(tp, (cpu_scratch_base + + (info->rodata_base & 0xffff) + + (i * sizeof(u32))), + (info->rodata_data ? + info->rodata_data[i] : 0)); for (i = 0; i < (info->data_len / sizeof(u32)); i++) - tg3_write_indirect_reg32(tp, (cpu_scratch_base + - (info->data_base & 0xffff) + - (i * sizeof(u32))), - (info->data_data ? - info->data_data[i] : 0)); + write_op(tp, (cpu_scratch_base + + (info->data_base & 0xffff) + + (i * sizeof(u32))), + (info->data_data ? + info->data_data[i] : 0)); err = 0; @@ -3468,335 +3856,595 @@ return 0; } -#if TG3_DO_TSO != 0 +#if TG3_TSO_SUPPORT != 0 #define TG3_TSO_FW_RELEASE_MAJOR 0x1 -#define TG3_TSO_FW_RELASE_MINOR 0x8 +#define TG3_TSO_FW_RELASE_MINOR 0x3 #define TG3_TSO_FW_RELEASE_FIX 0x0 #define TG3_TSO_FW_START_ADDR 0x08000000 #define TG3_TSO_FW_TEXT_ADDR 0x08000000 -#define TG3_TSO_FW_TEXT_LEN 0x1650 +#define TG3_TSO_FW_TEXT_LEN 0x1ac0 #define TG3_TSO_FW_RODATA_ADDR 0x08001650 -#define TG3_TSO_FW_RODATA_LEN 0x30 +#define TG3_TSO_FW_RODATA_LEN 0x60 #define TG3_TSO_FW_DATA_ADDR 0x080016a0 #define TG3_TSO_FW_DATA_LEN 0x20 #define TG3_TSO_FW_SBSS_ADDR 0x080016c0 -#define TG3_TSO_FW_SBSS_LEN 0x14 +#define TG3_TSO_FW_SBSS_LEN 0x2c #define TG3_TSO_FW_BSS_ADDR 0x080016e0 -#define TG3_TSO_FW_BSS_LEN 0x8fc +#define TG3_TSO_FW_BSS_LEN 0x890 static u32 tg3TsoFwText[] = { 0x00000000, 0x10000003, 0x00000000, 0x0000000d, 0x0000000d, 0x3c1d0800, 0x37bd4000, 0x03a0f021, 0x3c100800, 0x26100000, 0x0e000010, 0x00000000, - 0x0000000d, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0x3c1bc000, - 0xafbf0018, 0x0e000058, 0xaf60680c, 0x3c040800, 0x24841650, 0x03602821, - 0x24060001, 0x24070004, 0xafa00010, 0x0e00006c, 0xafa00014, 0x8f625c50, - 0x34420001, 0xaf625c50, 0x8f625c90, 0x34420001, 0xaf625c90, 0x2402ffff, - 0x0e000098, 0xaf625404, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x00000000, - 0x00000000, 0x00000000, 0x24030b60, 0x24050fff, 0xac000b50, 0x00002021, - 0xac640000, 0x24630004, 0x0065102b, 0x1440fffc, 0x24840001, 0x24030b60, - 0x0065102b, 0x10400011, 0x00002021, 0x24090b54, 0x3c06dead, 0x34c6beef, - 0x24080b58, 0x24070b5c, 0x8c620000, 0x50440006, 0x24630004, 0xad260000, - 0x8c620000, 0xace40000, 0xad020000, 0x24630004, 0x0065102b, 0x1440fff6, - 0x24840001, 0x03e00008, 0x00000000, 0x27bdfff8, 0x18800009, 0x00002821, - 0x8f63680c, 0x8f62680c, 0x1043fffe, 0x00000000, 0x24a50001, 0x00a4102a, - 0x1440fff9, 0x00000000, 0x03e00008, 0x27bd0008, 0x3c020800, 0x34423000, - 0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac2216c4, - 0x24020040, 0x3c010800, 0xac2216c8, 0x3c010800, 0xac2016c0, 0xac600000, - 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, - 0x00804821, 0x8faa0010, 0x3c020800, 0x8c4216c0, 0x3c040800, 0x8c8416c8, - 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac2316c0, 0x14400003, - 0x00004021, 0x3c010800, 0xac2016c0, 0x3c020800, 0x8c4216c0, 0x3c030800, - 0x8c6316c4, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001, - 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c4216c0, - 0x3c030800, 0x8c6316c4, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008, - 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c, - 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf0018, 0xafb10014, 0x0e0000b6, - 0xafb00010, 0x24110001, 0x8f706820, 0x32020100, 0x10400003, 0x00000000, - 0x0e000127, 0x00000000, 0x8f706820, 0x32022000, 0x10400004, 0x32020001, - 0x0e00025a, 0x24040001, 0x32020001, 0x10400003, 0x00000000, 0x0e0000e6, - 0x00000000, 0x0a00009e, 0xaf715028, 0x8fbf0018, 0x8fb10014, 0x8fb00010, - 0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x24841660, 0x00002821, - 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00006c, 0xafa00014, - 0x3c010800, 0xa4201fb8, 0x3c010800, 0xa02016f8, 0x3c010800, 0xac2016fc, - 0x3c010800, 0xac201700, 0x3c010800, 0xac201704, 0x3c010800, 0xac20170c, - 0x3c010800, 0xac201718, 0x3c010800, 0xac20171c, 0x8f624434, 0x3c010800, - 0xac2216e8, 0x8f624438, 0x3c010800, 0xac2216ec, 0x8f624410, 0x3c010800, - 0xac2016e0, 0x3c010800, 0xac2016e4, 0x3c010800, 0xac201fc0, 0x3c010800, - 0xac201f68, 0x3c010800, 0xac201f6c, 0x3c010800, 0xac2216f0, 0x8fbf0018, - 0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040800, 0x2484166c, 0x00002821, - 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, 0x0e00006c, 0xafa00014, - 0x3c040800, 0x24841660, 0x00002821, 0x00003021, 0x00003821, 0xafa00010, - 0x0e00006c, 0xafa00014, 0x3c010800, 0xa4201fb8, 0x3c010800, 0xa02016f8, - 0x3c010800, 0xac2016fc, 0x3c010800, 0xac201700, 0x3c010800, 0xac201704, - 0x3c010800, 0xac20170c, 0x3c010800, 0xac201718, 0x3c010800, 0xac20171c, - 0x8f624434, 0x3c010800, 0xac2216e8, 0x8f624438, 0x3c010800, 0xac2216ec, - 0x8f624410, 0x3c010800, 0xac2016e0, 0x3c010800, 0xac2016e4, 0x3c010800, - 0xac201fc0, 0x3c010800, 0xac201f68, 0x3c010800, 0xac201f6c, 0x3c010800, - 0xac2216f0, 0x0e000120, 0x00002021, 0x8fbf0018, 0x03e00008, 0x27bd0020, - 0x24020001, 0x8f636820, 0x00821004, 0x00021027, 0x00621824, 0x03e00008, - 0xaf636820, 0x27bdffd0, 0x3c0300ff, 0xafbf002c, 0xafb60028, 0xafb50024, - 0xafb40020, 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x8f665c5c, - 0x3c040800, 0x2484171c, 0x8c820000, 0x3463fff8, 0x14460005, 0x00c38824, - 0x3c020800, 0x904216f8, 0x14400115, 0x00000000, 0x00111902, 0x306300ff, - 0x30c20003, 0x000211c0, 0x00623825, 0x00e02821, 0x00061602, 0xac860000, - 0x3c030800, 0x906316f8, 0x3044000f, 0x1460002b, 0x00804021, 0x24020001, - 0x3c010800, 0xa02216f8, 0x00071100, 0x00821025, 0x3c010800, 0xac2016fc, - 0x3c010800, 0xac201700, 0x3c010800, 0xac201704, 0x3c010800, 0xac20170c, - 0x3c010800, 0xac201718, 0x3c010800, 0xac201710, 0x3c010800, 0xac201714, - 0x3c010800, 0xa4221fb8, 0x9623000c, 0x30628000, 0x10400008, 0x30627fff, - 0x2442003e, 0x3c010800, 0xa42216f6, 0x24020001, 0x3c010800, 0x0a00016e, - 0xac221fd4, 0x24620036, 0x3c010800, 0xa42216f6, 0x3c010800, 0xac201fd4, - 0x3c010800, 0xac201fd0, 0x3c010800, 0x0a000176, 0xac201fd8, 0x9622000c, - 0x3c010800, 0xa4221fcc, 0x3c040800, 0x248416fc, 0x8c820000, 0x00021100, - 0x3c010800, 0x00220821, 0xac311728, 0x8c820000, 0x00021100, 0x3c010800, - 0x00220821, 0xac26172c, 0x8c820000, 0x24a30001, 0x306701ff, 0x00021100, - 0x3c010800, 0x00220821, 0xac271730, 0x8c820000, 0x00021100, 0x3c010800, - 0x00220821, 0xac281734, 0x96230008, 0x3c020800, 0x8c42170c, 0x00432821, - 0x3c010800, 0xac25170c, 0x9622000a, 0x30420004, 0x14400019, 0x00071100, - 0x3c02c000, 0x00c21825, 0xaf635c5c, 0x8f625c50, 0x30420002, 0x1440fffc, - 0x00000000, 0x8f630c14, 0x3063000f, 0x2c620002, 0x1440001e, 0x00000000, - 0x8f630c14, 0x3c020800, 0x8c4216b4, 0x3063000f, 0x24420001, 0x3c010800, - 0xac2216b4, 0x2c620002, 0x1040fff7, 0x00000000, 0x0a0001c1, 0x00000000, - 0x3c030800, 0x8c6316e0, 0x3c040800, 0x948416f4, 0x01021025, 0x3c010800, - 0xa4221fba, 0x24020001, 0x3c010800, 0xac221718, 0x24630001, 0x0085202a, - 0x3c010800, 0x10800003, 0xac2316e0, 0x3c010800, 0xa42516f4, 0x3c030800, - 0x246316fc, 0x8c620000, 0x24420001, 0xac620000, 0x28420080, 0x14400005, - 0x24020001, 0x0e0002df, 0x24040002, 0x0a000250, 0x00000000, 0x3c030800, - 0x906316f8, 0x1462007c, 0x24020003, 0x3c160800, 0x96d616f6, 0x3c050800, - 0x8ca5170c, 0x32c4ffff, 0x00a4102a, 0x14400078, 0x00000000, 0x3c020800, - 0x8c421718, 0x10400005, 0x32c2ffff, 0x14a40003, 0x00000000, 0x3c010800, - 0xac231fd0, 0x10400062, 0x00009021, 0x0040a021, 0x3c150800, 0x26b51700, - 0x26b30010, 0x8ea20000, 0x00028100, 0x3c110800, 0x02308821, 0x0e0002e1, - 0x8e311728, 0x00403021, 0x10c00059, 0x00000000, 0x9628000a, 0x31020040, - 0x10400004, 0x2407180c, 0x8e22000c, 0x2407188c, 0xacc20018, 0x31021000, - 0x10400004, 0x34e32000, 0x00081040, 0x3042c000, 0x00623825, 0x3c030800, - 0x00701821, 0x8c631730, 0x3c020800, 0x00501021, 0x8c421734, 0x00031d00, - 0x00021400, 0x00621825, 0xacc30014, 0x8ea30004, 0x96220008, 0x00432023, - 0x3242ffff, 0x3083ffff, 0x00431021, 0x0282102a, 0x14400002, 0x02d22823, - 0x00802821, 0x8e620000, 0x30a4ffff, 0x00441021, 0xae620000, 0x8e220000, - 0xacc20000, 0x8e220004, 0x8e63fff4, 0x00431021, 0xacc20004, 0xa4c5000e, - 0x8e62fff4, 0x00441021, 0xae62fff4, 0x96230008, 0x0043102a, 0x14400005, - 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, 0xae62fff0, 0xacc00008, - 0x3242ffff, 0x14540008, 0x24020305, 0x31020080, 0x54400001, 0x34e70010, - 0x24020905, 0xa4c2000c, 0x0a000233, 0x34e70020, 0xa4c2000c, 0x30e2ffff, - 0xacc20010, 0x3c020800, 0x8c421fd0, 0x10400003, 0x3c024b65, 0x0a00023d, - 0x34427654, 0x3c02b49a, 0x344289ab, 0xacc2001c, 0x0e000560, 0x00c02021, - 0x3242ffff, 0x0054102b, 0x1440ffa4, 0x00000000, 0x24020002, 0x3c010800, - 0x0a000250, 0xa02216f8, 0x8ea208bc, 0x24420001, 0x0a000250, 0xaea208bc, - 0x14620003, 0x00000000, 0x0e000450, 0x00000000, 0x8fbf002c, 0x8fb60028, - 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, - 0x03e00008, 0x27bd0030, 0x27bdffd8, 0xafb3001c, 0x00809821, 0xafbf0020, - 0xafb20018, 0xafb10014, 0xafb00010, 0x8f725c9c, 0x3c0200ff, 0x3442fff8, - 0x3c040800, 0x24841714, 0x02428824, 0x9623000e, 0x8c820000, 0x00431021, - 0xac820000, 0x8e220010, 0x30420020, 0x14400011, 0x00000000, 0x0e0002f7, + 0x0000000d, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0x3c04fefe, + 0xafbf0018, 0x0e0005e0, 0x34840002, 0x0e000670, 0x00000000, 0x3c030800, + 0x90631b78, 0x24020002, 0x3c040800, 0x24841acc, 0x14620003, 0x24050001, + 0x3c040800, 0x24841ac0, 0x24060002, 0x00003821, 0xafa00010, 0x0e000684, + 0xafa00014, 0x8f625c50, 0x34420001, 0xaf625c50, 0x8f625c90, 0x34420001, + 0xaf625c90, 0x2402ffff, 0x0e000034, 0xaf625404, 0x8fbf0018, 0x03e00008, + 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf0018, + 0xafb10014, 0x0e000052, 0xafb00010, 0x24110001, 0x8f706820, 0x32020100, + 0x10400003, 0x00000000, 0x0e0000b2, 0x00000000, 0x8f706820, 0x32022000, + 0x10400004, 0x32020001, 0x0e0001e3, 0x24040001, 0x32020001, 0x10400003, + 0x00000000, 0x0e00009a, 0x00000000, 0x0a00003a, 0xaf715028, 0x8fbf0018, + 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040800, + 0x24841ae0, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, + 0x0e000684, 0xafa00014, 0x3c040800, 0x248423e8, 0xa4800000, 0x3c010800, + 0xa0201ba8, 0x3c010800, 0xac201bac, 0x3c010800, 0xac201bb0, 0x3c010800, + 0xac201bb4, 0x3c010800, 0xac201bbc, 0x3c010800, 0xac201bc8, 0x3c010800, + 0xac201bcc, 0x8f624434, 0x3c010800, 0xac221b98, 0x8f624438, 0x3c010800, + 0xac221b9c, 0x8f624410, 0xac80f7a8, 0x3c010800, 0xac201b94, 0x3c010800, + 0xac2023f0, 0x3c010800, 0xac2023d8, 0x3c010800, 0xac2023dc, 0x3c010800, + 0xac202410, 0x3c010800, 0xac221ba0, 0x8f620068, 0x24030007, 0x00021702, + 0x10430005, 0x00000000, 0x8f620068, 0x00021702, 0x14400004, 0x24020001, + 0x3c010800, 0x0a00008e, 0xac20241c, 0xac820034, 0x3c040800, 0x24841aec, + 0x3c050800, 0x8ca5241c, 0x00003021, 0x00003821, 0xafa00010, 0x0e000684, + 0xafa00014, 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x27bdffe0, 0x3c040800, + 0x24841af8, 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, + 0x0e000684, 0xafa00014, 0x0e000052, 0x00000000, 0x0e0000ab, 0x00002021, + 0x8fbf0018, 0x03e00008, 0x27bd0020, 0x24020001, 0x8f636820, 0x00821004, + 0x00021027, 0x00621824, 0x03e00008, 0xaf636820, 0x27bdffd0, 0xafbf002c, + 0xafb60028, 0xafb50024, 0xafb40020, 0xafb3001c, 0xafb20018, 0xafb10014, + 0xafb00010, 0x8f665c5c, 0x3c030800, 0x24631bcc, 0x8c620000, 0x14460005, + 0x3c0200ff, 0x3c020800, 0x90421ba8, 0x14400115, 0x3c0200ff, 0x3442fff8, + 0x00c28824, 0xac660000, 0x00111902, 0x306300ff, 0x30c20003, 0x000211c0, + 0x00623825, 0x00e02821, 0x00061602, 0x3c030800, 0x90631ba8, 0x3044000f, + 0x1460002b, 0x00804021, 0x24020001, 0x3c010800, 0xa0221ba8, 0x00071100, + 0x00821025, 0x3c010800, 0xac201bac, 0x3c010800, 0xac201bb0, 0x3c010800, + 0xac201bb4, 0x3c010800, 0xac201bbc, 0x3c010800, 0xac201bc8, 0x3c010800, + 0xac201bc0, 0x3c010800, 0xac201bc4, 0x3c010800, 0xa42223e8, 0x9623000c, + 0x30628000, 0x10400008, 0x30627fff, 0x2442003e, 0x3c010800, 0xa4221ba6, + 0x24020001, 0x3c010800, 0x0a0000f9, 0xac222404, 0x24620036, 0x3c010800, + 0xa4221ba6, 0x3c010800, 0xac202404, 0x3c010800, 0xac202400, 0x3c010800, + 0x0a000101, 0xac202408, 0x9622000c, 0x3c010800, 0xa42223fc, 0x3c040800, + 0x24841bac, 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac311bd8, + 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac261bdc, 0x8c820000, + 0x24a30001, 0x306701ff, 0x00021100, 0x3c010800, 0x00220821, 0xac271be0, + 0x8c820000, 0x00021100, 0x3c010800, 0x00220821, 0xac281be4, 0x96230008, + 0x3c020800, 0x8c421bbc, 0x00432821, 0x3c010800, 0xac251bbc, 0x9622000a, + 0x30420004, 0x14400018, 0x00071100, 0x8f630c14, 0x3063000f, 0x2c620002, + 0x1440000b, 0x3c02c000, 0x8f630c14, 0x3c020800, 0x8c421b50, 0x3063000f, + 0x24420001, 0x3c010800, 0xac221b50, 0x2c620002, 0x1040fff7, 0x3c02c000, + 0x00c21825, 0xaf635c5c, 0x8f625c50, 0x30420002, 0x10400014, 0x00000000, + 0x0a000133, 0x00000000, 0x3c030800, 0x8c631b90, 0x3c040800, 0x94841ba4, + 0x01021025, 0x3c010800, 0xa42223ea, 0x24020001, 0x3c010800, 0xac221bc8, + 0x24630001, 0x0085202a, 0x3c010800, 0x10800003, 0xac231b90, 0x3c010800, + 0xa4251ba4, 0x3c060800, 0x24c61bac, 0x8cc20000, 0x24420001, 0xacc20000, + 0x28420080, 0x14400005, 0x00000000, 0x0e00065e, 0x24040002, 0x0a0001d9, + 0x00000000, 0x3c020800, 0x8c421bc8, 0x1040007f, 0x24020001, 0x3c040800, + 0x90841ba8, 0x14820077, 0x24020003, 0x3c150800, 0x96b51ba6, 0x3c050800, + 0x8ca51bbc, 0x32a3ffff, 0x00a3102a, 0x14400073, 0x00000000, 0x14a30003, + 0x00000000, 0x3c010800, 0xac242400, 0x10600061, 0x00009021, 0x24d60004, + 0x0060a021, 0x24d30014, 0x8ec20000, 0x00028100, 0x3c110800, 0x02308821, + 0x0e00062d, 0x8e311bd8, 0x00403021, 0x10c00059, 0x00000000, 0x9628000a, + 0x31020040, 0x10400004, 0x2407180c, 0x8e22000c, 0x2407188c, 0xacc20018, + 0x31021000, 0x10400004, 0x34e32000, 0x00081040, 0x3042c000, 0x00623825, + 0x3c030800, 0x00701821, 0x8c631be0, 0x3c020800, 0x00501021, 0x8c421be4, + 0x00031d00, 0x00021400, 0x00621825, 0xacc30014, 0x8ec30004, 0x96220008, + 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021, 0x0282102a, 0x14400002, + 0x02b22823, 0x00802821, 0x8e620000, 0x30a4ffff, 0x00441021, 0xae620000, + 0x8e220000, 0xacc20000, 0x8e220004, 0x8e63fff4, 0x00431021, 0xacc20004, + 0xa4c5000e, 0x8e62fff4, 0x00441021, 0xae62fff4, 0x96230008, 0x0043102a, + 0x14400005, 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, 0xae62fff0, + 0xacc00008, 0x3242ffff, 0x14540008, 0x24020305, 0x31020080, 0x54400001, + 0x34e70010, 0x24020905, 0xa4c2000c, 0x0a0001bc, 0x34e70020, 0xa4c2000c, + 0x3c020800, 0x8c422400, 0x10400003, 0x3c024b65, 0x0a0001c4, 0x34427654, + 0x3c02b49a, 0x344289ab, 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005aa, + 0x00c02021, 0x3242ffff, 0x0054102b, 0x1440ffa4, 0x00000000, 0x24020002, + 0x3c010800, 0x0a0001d9, 0xa0221ba8, 0x8ec2083c, 0x24420001, 0x0a0001d9, + 0xaec2083c, 0x14820003, 0x00000000, 0x0e0004b9, 0x00000000, 0x8fbf002c, + 0x8fb60028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, + 0x8fb00010, 0x03e00008, 0x27bd0030, 0x27bdffd0, 0xafbf0028, 0xafb30024, + 0xafb20020, 0xafb1001c, 0xafb00018, 0x8f725c9c, 0x3c0200ff, 0x3442fff8, + 0x3c060800, 0x24c61bc4, 0x02428824, 0x9623000e, 0x8cc20000, 0x00431021, + 0xacc20000, 0x8e220010, 0x30420020, 0x14400011, 0x00809821, 0x0e000643, 0x02202021, 0x3c02c000, 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, - 0x10400061, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x1040005c, - 0x00000000, 0x0a000278, 0x00000000, 0x8e220008, 0x00021c02, 0x000321c0, - 0x3042ffff, 0x3c030800, 0x906316f8, 0x000229c0, 0x24020002, 0x14620003, - 0x3c034b65, 0x0a000290, 0x00008021, 0x8e22001c, 0x34637654, 0x10430002, - 0x24100002, 0x24100001, 0x0e000300, 0x02003021, 0x24020003, 0x3c010800, - 0xa02216f8, 0x24020002, 0x1202000a, 0x24020001, 0x3c030800, 0x8c631fd0, - 0x10620006, 0x00000000, 0x3c020800, 0x94421fb8, 0x00021400, 0x0a0002cd, - 0xae220014, 0x3c040800, 0x24841fba, 0x94820000, 0x00021400, 0xae220014, - 0x3c020800, 0x8c42171c, 0x3c03c000, 0x3c010800, 0xa02016f8, 0x00431025, - 0xaf625c5c, 0x8f625c50, 0x30420002, 0x10400009, 0x00000000, 0x2484f762, + 0x10400121, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x1040011c, + 0x00000000, 0x0a000200, 0x00000000, 0x8e240008, 0x8e230014, 0x00041402, + 0x000241c0, 0x00031502, 0x304201ff, 0x2442ffff, 0x3042007f, 0x00031942, + 0x30637800, 0x00021100, 0x24424000, 0x00625021, 0x9542000a, 0x3084ffff, + 0x30420008, 0x104000b3, 0x000429c0, 0x3c020800, 0x8c422410, 0x1440002d, + 0x25050008, 0x95020014, 0x3c010800, 0xa42223e0, 0x8d070010, 0x00071402, + 0x3c010800, 0xa42223e2, 0x3c010800, 0xa42723e4, 0x9502000e, 0x30e3ffff, + 0x00431023, 0x3c010800, 0xac222418, 0x8f626800, 0x3c030010, 0x00431024, + 0x10400005, 0x00000000, 0x9503001a, 0x9502001c, 0x0a000235, 0x00431021, + 0x9502001a, 0x3c010800, 0xac22240c, 0x3c02c000, 0x02421825, 0x3c010800, + 0xac282410, 0x3c010800, 0xac322414, 0xaf635c9c, 0x8f625c90, 0x30420002, + 0x104000df, 0x00000000, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x104000da, + 0x00000000, 0x0a000242, 0x00000000, 0x9502000e, 0x3c030800, 0x946323e4, + 0x00434823, 0x3123ffff, 0x2c620008, 0x1040001c, 0x00000000, 0x95020014, + 0x24420028, 0x00a22821, 0x00031042, 0x1840000b, 0x00002021, 0x24c60848, + 0x00403821, 0x94a30000, 0x8cc20000, 0x24840001, 0x00431021, 0xacc20000, + 0x0087102a, 0x1440fff9, 0x24a50002, 0x31220001, 0x1040001f, 0x3c024000, + 0x3c040800, 0x2484240c, 0xa0a00001, 0x94a30000, 0x8c820000, 0x00431021, + 0x0a000281, 0xac820000, 0x8f626800, 0x3c030010, 0x00431024, 0x10400009, + 0x00000000, 0x9502001a, 0x3c030800, 0x8c63240c, 0x00431021, 0x3c010800, + 0xac22240c, 0x0a000282, 0x3c024000, 0x9502001a, 0x9504001c, 0x3c030800, + 0x8c63240c, 0x00441023, 0x00621821, 0x3c010800, 0xac23240c, 0x3c024000, + 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, + 0x9542000a, 0x30420010, 0x10400095, 0x00000000, 0x3c060800, 0x24c62410, + 0x3c020800, 0x944223e4, 0x8cc50000, 0x3c040800, 0x8c842418, 0x24420030, + 0x00a22821, 0x94a20004, 0x3c030800, 0x8c63240c, 0x00441023, 0x00621821, + 0x00603821, 0x00032402, 0x30e2ffff, 0x00823821, 0x00071402, 0x00e23821, + 0x00071027, 0x3c010800, 0xac23240c, 0xa4a20006, 0x3c030800, 0x8c632414, + 0x3c0200ff, 0x3442fff8, 0x00628824, 0x96220008, 0x24040001, 0x24034000, + 0x000241c0, 0x00e01021, 0xa502001a, 0xa500001c, 0xacc00000, 0x3c010800, + 0xac241b70, 0xaf635cb8, 0x8f625cb0, 0x30420002, 0x10400003, 0x00000000, + 0x3c010800, 0xac201b70, 0x8e220008, 0xaf625cb8, 0x8f625cb0, 0x30420002, + 0x10400003, 0x00000000, 0x3c010800, 0xac201b70, 0x3c020800, 0x8c421b70, + 0x1040ffec, 0x00000000, 0x3c040800, 0x0e000643, 0x8c842414, 0x0a000320, + 0x00000000, 0x3c030800, 0x90631ba8, 0x24020002, 0x14620003, 0x3c034b65, + 0x0a0002d7, 0x00008021, 0x8e22001c, 0x34637654, 0x10430002, 0x24100002, + 0x24100001, 0x01002021, 0x0e000346, 0x02003021, 0x24020003, 0x3c010800, + 0xa0221ba8, 0x24020002, 0x1202000a, 0x24020001, 0x3c030800, 0x8c632400, + 0x10620006, 0x00000000, 0x3c020800, 0x944223e8, 0x00021400, 0x0a000315, + 0xae220014, 0x3c040800, 0x248423ea, 0x94820000, 0x00021400, 0xae220014, + 0x3c020800, 0x8c421bcc, 0x3c03c000, 0x3c010800, 0xa0201ba8, 0x00431025, + 0xaf625c5c, 0x8f625c50, 0x30420002, 0x10400009, 0x00000000, 0x2484f7e2, 0x8c820000, 0x00431025, 0xaf625c5c, 0x8f625c50, 0x30420002, 0x1440fffa, - 0x00000000, 0x3c020800, 0x244216e4, 0x8c430000, 0x24630001, 0xac430000, - 0x8f630c14, 0x3063000f, 0x2c620002, 0x1440000b, 0x00009821, 0x8f630c14, - 0x3c020800, 0x8c4216b4, 0x3063000f, 0x24420001, 0x3c010800, 0xac2216b4, - 0x2c620002, 0x1040fff7, 0x00009821, 0x3c024000, 0x02421825, 0xaf635c9c, + 0x00000000, 0x3c020800, 0x24421b94, 0x8c430000, 0x24630001, 0xac430000, + 0x8f630c14, 0x3063000f, 0x2c620002, 0x1440000c, 0x3c024000, 0x8f630c14, + 0x3c020800, 0x8c421b50, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b50, + 0x2c620002, 0x1040fff7, 0x00000000, 0x3c024000, 0x02421825, 0xaf635c9c, 0x8f625c90, 0x30420002, 0x1440fffc, 0x00000000, 0x12600003, 0x00000000, - 0x0e000450, 0x00000000, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, - 0x8fb00010, 0x03e00008, 0x27bd0028, 0x0a0002df, 0x00000000, 0x8f634450, - 0x3c040800, 0x248416e8, 0x8c820000, 0x00031c02, 0x0043102b, 0x14400007, - 0x3c038000, 0x8c840004, 0x8f624450, 0x00021c02, 0x0083102b, 0x1040fffc, - 0x3c038000, 0xaf634444, 0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, - 0x8f624448, 0x03e00008, 0x3042ffff, 0x3c024000, 0x00822025, 0xaf645c38, - 0x8f625c30, 0x30420002, 0x1440fffc, 0x00000000, 0x03e00008, 0x00000000, - 0x27bdffe0, 0x00805021, 0x14c00017, 0x254c0008, 0x3c020800, 0x8c421fd4, - 0x1040000a, 0x2402003e, 0x3c010800, 0xa4221fb0, 0x24020016, 0x3c010800, - 0xa4221fb2, 0x2402002a, 0x3c010800, 0x0a00031a, 0xa4221fb4, 0x95420014, - 0x3c010800, 0xa4221fb0, 0x8d430010, 0x00031402, 0x3c010800, 0xa4221fb2, - 0x3c010800, 0xa4231fb4, 0x3c040800, 0x94841fb4, 0x3c030800, 0x94631fb2, - 0x958d0006, 0x3c020800, 0x94421fb0, 0x00832023, 0x01a27023, 0x3065ffff, - 0x24a20028, 0x01824021, 0x3082ffff, 0x14c0001a, 0x01025821, 0x9562000c, - 0x3042003f, 0x3c010800, 0xa4221fb6, 0x95620004, 0x95630006, 0x3c010800, - 0xac201fc4, 0x3c010800, 0xac201fc8, 0x00021400, 0x00431025, 0x3c010800, - 0xac221720, 0x95020004, 0x3c010800, 0xa4221724, 0x95030002, 0x01a51023, - 0x0043102a, 0x10400010, 0x24020001, 0x3c010800, 0x0a00034e, 0xac221fd8, - 0x3c030800, 0x8c631fc8, 0x3c020800, 0x94421724, 0x00431021, 0xa5020004, - 0x3c020800, 0x94421720, 0xa5620004, 0x3c020800, 0x8c421720, 0xa5620006, - 0x3c020800, 0x8c421fd0, 0x3c070800, 0x8ce71fc4, 0x3c050800, 0x144000c7, - 0x8ca51fc8, 0x3c020800, 0x94421724, 0x00451821, 0x3063ffff, 0x0062182b, - 0x24020002, 0x10c2000d, 0x00a32823, 0x3c020800, 0x94421fb6, 0x30420009, - 0x10400008, 0x00000000, 0x9562000c, 0x3042fff6, 0xa562000c, 0x3c020800, - 0x94421fb6, 0x30420009, 0x00e23823, 0x3c020800, 0x8c421fd8, 0x1040004b, - 0x24020002, 0x01003021, 0x3c020800, 0x94421fb2, 0x00003821, 0xa500000a, - 0x01a21023, 0xa5020002, 0x3082ffff, 0x00021042, 0x18400008, 0x00002821, - 0x00401821, 0x94c20000, 0x24e70001, 0x00a22821, 0x00e3102a, 0x1440fffb, - 0x24c60002, 0x00051c02, 0x30a2ffff, 0x00622821, 0x00051402, 0x00a22821, - 0x00a04821, 0x00051027, 0xa502000a, 0x00002821, 0x2506000c, 0x00003821, - 0x94c20000, 0x24e70001, 0x00a22821, 0x2ce20004, 0x1440fffb, 0x24c60002, - 0x95020002, 0x00003821, 0x91030009, 0x00442023, 0x01603021, 0x3082ffff, - 0xa4c00010, 0x00621821, 0x00021042, 0x18400010, 0x00a32821, 0x00404021, - 0x94c20000, 0x24c60002, 0x00a22821, 0x30c2007f, 0x14400006, 0x24e70001, - 0x8d430000, 0x3c02007f, 0x3442ff80, 0x00625024, 0x25460008, 0x00e8102a, - 0x1440fff3, 0x00000000, 0x30820001, 0x10400005, 0x00051c02, 0xa0c00001, - 0x94c20000, 0x00a22821, 0x00051c02, 0x30a2ffff, 0x00622821, 0x00051402, - 0x00a22821, 0x0a000415, 0x30a5ffff, 0x14c20063, 0x00000000, 0x3c090800, - 0x95291fb2, 0x95030002, 0x01a91023, 0x1062005d, 0x01003021, 0x00003821, - 0x00002821, 0x01a91023, 0xa5020002, 0x3082ffff, 0x00021042, 0x18400008, - 0xa500000a, 0x00401821, 0x94c20000, 0x24e70001, 0x00a22821, 0x00e3102a, - 0x1440fffb, 0x24c60002, 0x00051c02, 0x30a2ffff, 0x00622821, 0x00051402, - 0x00a22821, 0x00a04821, 0x00051027, 0xa502000a, 0x00002821, 0x2506000c, - 0x00003821, 0x94c20000, 0x24e70001, 0x00a22821, 0x2ce20004, 0x1440fffb, - 0x24c60002, 0x95020002, 0x00003821, 0x91030009, 0x00442023, 0x01603021, - 0x3082ffff, 0xa4c00010, 0x3c040800, 0x94841fb4, 0x00621821, 0x00a32821, - 0x00051c02, 0x30a2ffff, 0x00622821, 0x00051c02, 0x3c020800, 0x94421fb0, - 0x00a34021, 0x00441023, 0x00021fc2, 0x00431021, 0x00021043, 0x18400010, - 0x00002821, 0x00402021, 0x94c20000, 0x24c60002, 0x00a22821, 0x30c2007f, - 0x14400006, 0x24e70001, 0x8d430000, 0x3c02007f, 0x3442ff80, 0x00625024, - 0x25460008, 0x00e4102a, 0x1440fff3, 0x00000000, 0x3c020800, 0x94421fcc, - 0x00a22821, 0x00051c02, 0x30a2ffff, 0x00622821, 0x00051402, 0x00a22821, - 0x3102ffff, 0x00a22821, 0x00051c02, 0x30a2ffff, 0x00622821, 0x00051402, - 0x00a22821, 0x00a02021, 0x00051027, 0xa5620010, 0xad800014, 0x0a000435, - 0xad800000, 0x8d830010, 0x00602021, 0x10a00007, 0x00034c02, 0x01252821, - 0x00051402, 0x30a3ffff, 0x00432821, 0x00051402, 0x00a24821, 0x00091027, - 0xa502000a, 0x3c030800, 0x94631fb4, 0x3082ffff, 0x01a21021, 0x00432823, - 0x00a72821, 0x00051c02, 0x30a2ffff, 0x00622821, 0x00051402, 0x00a22821, - 0x00a02021, 0x00051027, 0xa5620010, 0x3082ffff, 0x00091c00, 0x00431025, - 0xad820010, 0x3c020800, 0x8c421fd4, 0x10400002, 0x25a2fff2, 0xa5820034, - 0x3c020800, 0x8c421fc8, 0x3c030800, 0x8c631720, 0x24420001, 0x3c010800, - 0xac221fc8, 0x3c020800, 0x8c421fc4, 0x31c4ffff, 0x00641821, 0x3c010800, - 0xac231720, 0x00441021, 0x3c010800, 0xac221fc4, 0x03e00008, 0x27bd0020, - 0x27bdffc8, 0x3c040800, 0x248416f8, 0xafbf0034, 0xafbe0030, 0xafb7002c, - 0xafb60028, 0xafb50024, 0xafb40020, 0xafb3001c, 0xafb20018, 0xafb10014, - 0xafb00010, 0x90830000, 0x24020003, 0x146200f4, 0x00000000, 0x3c020800, - 0x8c421710, 0x3c030800, 0x8c63170c, 0x3c1e0800, 0x97de16f6, 0x0043102a, - 0x104000eb, 0x3c168000, 0x249708c4, 0x33d5ffff, 0x24920018, 0x3c020800, - 0x8c421718, 0x104000e4, 0x00000000, 0x3c140800, 0x96941fb0, 0x3282ffff, - 0x104000d6, 0x00008021, 0x00409821, 0x00008821, 0x8f634450, 0x3c020800, - 0x8c4216e8, 0x00031c02, 0x0043102b, 0x14400008, 0x00000000, 0x3c040800, - 0x8c8416ec, 0x8f624450, 0x00021c02, 0x0083102b, 0x1040fffc, 0x00000000, - 0xaf764444, 0x8f624444, 0x00561024, 0x10400006, 0x00000000, 0x3c038000, - 0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, 0x3046ffff, - 0x10c0005f, 0x00000000, 0x3c090800, 0x01314821, 0x8d291728, 0x9528000a, - 0x31020040, 0x10400004, 0x2407180c, 0x8d22000c, 0x2407188c, 0xacc20018, - 0x31021000, 0x10400004, 0x34e32000, 0x00081040, 0x3042c000, 0x00623825, - 0x31020080, 0x54400001, 0x34e70010, 0x3c020800, 0x00511021, 0x8c421730, - 0x3c030800, 0x00711821, 0x8c631734, 0x00021500, 0x00031c00, 0x00431025, - 0xacc20014, 0x95240008, 0x3202ffff, 0x00821021, 0x0262102a, 0x14400002, - 0x02902823, 0x00802821, 0x8d220000, 0x02058021, 0xacc20000, 0x8d220004, - 0x00c02021, 0x26310010, 0xac820004, 0x30e2ffff, 0xac800008, 0xa485000e, - 0xac820010, 0x24020305, 0x0e000560, 0xa482000c, 0x3202ffff, 0x0053102b, - 0x1440ffaf, 0x3202ffff, 0x0a00054c, 0x00000000, 0x8e420000, 0x8e43fffc, - 0x0043102a, 0x10400084, 0x00000000, 0x8e45fff0, 0x8f644450, 0x3c030800, - 0x8c6316e8, 0x00051100, 0x3c090800, 0x01224821, 0x8d291728, 0x00041402, - 0x0062182b, 0x14600008, 0x00000000, 0x3c030800, 0x8c6316ec, 0x8f624450, - 0x00021402, 0x0062102b, 0x1040fffc, 0x00000000, 0xaf764444, 0x8f624444, - 0x00561024, 0x10400006, 0x00000000, 0x3c038000, 0x8f624444, 0x00431024, - 0x1440fffd, 0x00000000, 0x8f624448, 0x3046ffff, 0x14c00005, 0x00000000, - 0x8ee20000, 0x24420001, 0x0a000554, 0xaee20000, 0x9528000a, 0x31020040, - 0x10400004, 0x2407180c, 0x8d22000c, 0x2407188c, 0xacc20018, 0x31021000, - 0x10400004, 0x34e32000, 0x00081040, 0x3042c000, 0x00623825, 0x00051900, - 0x3c020800, 0x00431021, 0x8c421730, 0x3c010800, 0x00230821, 0x8c231734, - 0x00021500, 0x00031c00, 0x00431025, 0xacc20014, 0x3c030800, 0x8c631704, - 0x95220008, 0x00432023, 0x3202ffff, 0x3083ffff, 0x00431021, 0x02a2102a, - 0x14400002, 0x03d02823, 0x00802821, 0x8e420000, 0x30a4ffff, 0x00441021, - 0xae420000, 0xa4c5000e, 0x8d220000, 0xacc20000, 0x8d220004, 0x8e43fff4, - 0x00431021, 0xacc20004, 0x8e43fff4, 0x95220008, 0x00641821, 0x0062102a, - 0x14400006, 0x02058021, 0x8e42fff0, 0xae40fff4, 0x24420001, 0x0a000530, - 0xae42fff0, 0xae43fff4, 0xacc00008, 0x3202ffff, 0x10550003, 0x31020004, - 0x10400006, 0x24020305, 0x31020080, 0x54400001, 0x34e70010, 0x34e70020, - 0x24020905, 0xa4c2000c, 0x30e2ffff, 0xacc20010, 0x3c030800, 0x8c63170c, - 0x3c020800, 0x8c421710, 0x54620004, 0x3c02b49a, 0x3c024b65, 0x0a000548, - 0x34427654, 0x344289ab, 0xacc2001c, 0x0e000560, 0x00c02021, 0x3202ffff, - 0x0055102b, 0x1440ff7e, 0x00000000, 0x8e420000, 0x8e43fffc, 0x0043102a, - 0x1440ff1a, 0x00000000, 0x8fbf0034, 0x8fbe0030, 0x8fb7002c, 0x8fb60028, - 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, - 0x03e00008, 0x27bd0038, 0x27bdffe8, 0xafbf0014, 0xafb00010, 0x8f624450, - 0x8f634410, 0x0a00056f, 0x00808021, 0x8f626820, 0x30422000, 0x10400003, - 0x00000000, 0x0e00025a, 0x00002021, 0x8f624450, 0x8f634410, 0x3042ffff, - 0x0043102b, 0x1440fff5, 0x00000000, 0x8f630c14, 0x3063000f, 0x2c620002, - 0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800, 0x8c4216b4, 0x3063000f, - 0x24420001, 0x3c010800, 0xac2216b4, 0x2c620002, 0x1040fff7, 0x00000000, - 0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009, 0x00000000, 0x8f626820, - 0x30422000, 0x1040fff8, 0x00000000, 0x0e00025a, 0x00002021, 0x0a000582, - 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x00000000, - 0x00000000 + 0x0e0004b9, 0x00000000, 0x8fbf0028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, + 0x8fb00018, 0x03e00008, 0x27bd0030, 0x8f634450, 0x3c040800, 0x24841b98, + 0x8c820000, 0x00031c02, 0x0043102b, 0x14400007, 0x3c038000, 0x8c840004, + 0x8f624450, 0x00021c02, 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, + 0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, + 0x3042ffff, 0x3c024000, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, + 0x1440fffc, 0x00000000, 0x03e00008, 0x00000000, 0x27bdffe0, 0x00805821, + 0x14c00017, 0x256e0008, 0x3c020800, 0x8c422404, 0x1040000a, 0x2402003e, + 0x3c010800, 0xa42223e0, 0x24020016, 0x3c010800, 0xa42223e2, 0x2402002a, + 0x3c010800, 0x0a000360, 0xa42223e4, 0x95620014, 0x3c010800, 0xa42223e0, + 0x8d670010, 0x00071402, 0x3c010800, 0xa42223e2, 0x3c010800, 0xa42723e4, + 0x3c040800, 0x948423e4, 0x3c030800, 0x946323e2, 0x95cf0006, 0x3c020800, + 0x944223e0, 0x00832023, 0x01e2c023, 0x3065ffff, 0x24a20028, 0x01c24821, + 0x3082ffff, 0x14c0001a, 0x01226021, 0x9582000c, 0x3042003f, 0x3c010800, + 0xa42223e6, 0x95820004, 0x95830006, 0x3c010800, 0xac2023f4, 0x3c010800, + 0xac2023f8, 0x00021400, 0x00431025, 0x3c010800, 0xac221bd0, 0x95220004, + 0x3c010800, 0xa4221bd4, 0x95230002, 0x01e51023, 0x0043102a, 0x10400010, + 0x24020001, 0x3c010800, 0x0a000394, 0xac222408, 0x3c030800, 0x8c6323f8, + 0x3c020800, 0x94421bd4, 0x00431021, 0xa5220004, 0x3c020800, 0x94421bd0, + 0xa5820004, 0x3c020800, 0x8c421bd0, 0xa5820006, 0x3c020800, 0x8c422400, + 0x3c0d0800, 0x8dad23f4, 0x3c0a0800, 0x144000e5, 0x8d4a23f8, 0x3c020800, + 0x94421bd4, 0x004a1821, 0x3063ffff, 0x0062182b, 0x24020002, 0x10c2000d, + 0x01435023, 0x3c020800, 0x944223e6, 0x30420009, 0x10400008, 0x00000000, + 0x9582000c, 0x3042fff6, 0xa582000c, 0x3c020800, 0x944223e6, 0x30420009, + 0x01a26823, 0x3c020800, 0x8c422408, 0x1040004a, 0x01203821, 0x3c020800, + 0x944223e2, 0x00004021, 0xa520000a, 0x01e21023, 0xa5220002, 0x3082ffff, + 0x00021042, 0x18400008, 0x00003021, 0x00401821, 0x94e20000, 0x25080001, + 0x00c23021, 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, 0x30c2ffff, + 0x00623021, 0x00061402, 0x00c23021, 0x00c02821, 0x00061027, 0xa522000a, + 0x00003021, 0x2527000c, 0x00004021, 0x94e20000, 0x25080001, 0x00c23021, + 0x2d020004, 0x1440fffb, 0x24e70002, 0x95220002, 0x00004021, 0x91230009, + 0x00442023, 0x01803821, 0x3082ffff, 0xa4e00010, 0x00621821, 0x00021042, + 0x18400010, 0x00c33021, 0x00404821, 0x94e20000, 0x24e70002, 0x00c23021, + 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, 0x3c02007f, 0x3442ff80, + 0x00625824, 0x25670008, 0x0109102a, 0x1440fff3, 0x00000000, 0x30820001, + 0x10400005, 0x00061c02, 0xa0e00001, 0x94e20000, 0x00c23021, 0x00061c02, + 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x0a000479, 0x30c6ffff, + 0x24020002, 0x14c20081, 0x00000000, 0x3c020800, 0x8c42241c, 0x14400007, + 0x00000000, 0x3c020800, 0x944223e2, 0x95230002, 0x01e21023, 0x10620077, + 0x00000000, 0x3c020800, 0x944223e2, 0x01e21023, 0xa5220002, 0x3c020800, + 0x8c42241c, 0x1040001a, 0x31e3ffff, 0x8dc70010, 0x3c020800, 0x94421ba6, + 0x00e04021, 0x00072c02, 0x00aa2021, 0x00431023, 0x00823823, 0x00072402, + 0x30e2ffff, 0x00823821, 0x00071027, 0xa522000a, 0x3102ffff, 0x3c040800, + 0x948423e4, 0x00453023, 0x00e02821, 0x00641823, 0x006d1821, 0x00c33021, + 0x00061c02, 0x30c2ffff, 0x0a000479, 0x00623021, 0x01203821, 0x00004021, + 0x3082ffff, 0x00021042, 0x18400008, 0x00003021, 0x00401821, 0x94e20000, + 0x25080001, 0x00c23021, 0x0103102a, 0x1440fffb, 0x24e70002, 0x00061c02, + 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c02821, 0x00061027, + 0xa522000a, 0x00003021, 0x2527000c, 0x00004021, 0x94e20000, 0x25080001, + 0x00c23021, 0x2d020004, 0x1440fffb, 0x24e70002, 0x95220002, 0x00004021, + 0x91230009, 0x00442023, 0x01803821, 0x3082ffff, 0xa4e00010, 0x3c040800, + 0x948423e4, 0x00621821, 0x00c33021, 0x00061c02, 0x30c2ffff, 0x00623021, + 0x00061c02, 0x3c020800, 0x944223e0, 0x00c34821, 0x00441023, 0x00021fc2, + 0x00431021, 0x00021043, 0x18400010, 0x00003021, 0x00402021, 0x94e20000, + 0x24e70002, 0x00c23021, 0x30e2007f, 0x14400006, 0x25080001, 0x8d630000, + 0x3c02007f, 0x3442ff80, 0x00625824, 0x25670008, 0x0104102a, 0x1440fff3, + 0x00000000, 0x3c020800, 0x944223fc, 0x00c23021, 0x3122ffff, 0x00c23021, + 0x00061c02, 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c04021, + 0x00061027, 0xa5820010, 0xadc00014, 0x0a000499, 0xadc00000, 0x8dc70010, + 0x00e04021, 0x11400007, 0x00072c02, 0x00aa3021, 0x00061402, 0x30c3ffff, + 0x00433021, 0x00061402, 0x00c22821, 0x00051027, 0xa522000a, 0x3c030800, + 0x946323e4, 0x3102ffff, 0x01e21021, 0x00433023, 0x00cd3021, 0x00061c02, + 0x30c2ffff, 0x00623021, 0x00061402, 0x00c23021, 0x00c04021, 0x00061027, + 0xa5820010, 0x3102ffff, 0x00051c00, 0x00431025, 0xadc20010, 0x3c020800, + 0x8c422404, 0x10400002, 0x25e2fff2, 0xa5c20034, 0x3c020800, 0x8c4223f8, + 0x3c040800, 0x8c8423f4, 0x24420001, 0x3c010800, 0xac2223f8, 0x3c020800, + 0x8c421bd0, 0x3303ffff, 0x00832021, 0x3c010800, 0xac2423f4, 0x00431821, + 0x0062102b, 0x10400003, 0x2482ffff, 0x3c010800, 0xac2223f4, 0x3c010800, + 0xac231bd0, 0x03e00008, 0x27bd0020, 0x27bdffb8, 0x3c050800, 0x24a51ba8, + 0xafbf0044, 0xafbe0040, 0xafb7003c, 0xafb60038, 0xafb50034, 0xafb40030, + 0xafb3002c, 0xafb20028, 0xafb10024, 0xafb00020, 0x90a30000, 0x24020003, + 0x146200d5, 0x00000000, 0x3c090800, 0x95291ba6, 0x3c020800, 0x944223e0, + 0x3c030800, 0x8c631bc0, 0x3c040800, 0x8c841bbc, 0x01221023, 0x0064182a, + 0xa7a9001e, 0x106000c8, 0xa7a20016, 0x24be0020, 0x97b6001e, 0x24b30018, + 0x24b70014, 0x8fc20000, 0x14400008, 0x00000000, 0x8fc2fff8, 0x97a30016, + 0x8fc4fff4, 0x00431021, 0x0082202a, 0x148000ba, 0x00000000, 0x97d50818, + 0x32a2ffff, 0x104000ad, 0x00009021, 0x0040a021, 0x00008821, 0x0e00062d, + 0x00000000, 0x00403021, 0x14c00007, 0x00000000, 0x3c020800, 0x8c4223ec, + 0x24420001, 0x3c010800, 0x0a00059e, 0xac2223ec, 0x3c100800, 0x02118021, + 0x8e101bd8, 0x9608000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e02000c, + 0x2407188c, 0xacc20018, 0x31021000, 0x10400004, 0x34e32000, 0x00081040, + 0x3042c000, 0x00623825, 0x31020080, 0x54400001, 0x34e70010, 0x3c020800, + 0x00511021, 0x8c421be0, 0x3c030800, 0x00711821, 0x8c631be4, 0x00021500, + 0x00031c00, 0x00431025, 0xacc20014, 0x96040008, 0x3242ffff, 0x00821021, + 0x0282102a, 0x14400002, 0x02b22823, 0x00802821, 0x8e020000, 0x02459021, + 0xacc20000, 0x8e020004, 0x00c02021, 0x26310010, 0xac820004, 0x30e2ffff, + 0xac800008, 0xa485000e, 0xac820010, 0x24020305, 0x0e0005aa, 0xa482000c, + 0x3242ffff, 0x0054102b, 0x1440ffc0, 0x3242ffff, 0x0a000596, 0x00000000, + 0x8e620000, 0x8e63fffc, 0x0043102a, 0x1040006c, 0x00000000, 0x8e62fff0, + 0x00028900, 0x3c100800, 0x02118021, 0x0e00062d, 0x8e101bd8, 0x00403021, + 0x14c00005, 0x00000000, 0x8e62082c, 0x24420001, 0x0a00059e, 0xae62082c, + 0x9608000a, 0x31020040, 0x10400004, 0x2407180c, 0x8e02000c, 0x2407188c, + 0xacc20018, 0x31021000, 0x10400004, 0x34e32000, 0x00081040, 0x3042c000, + 0x00623825, 0x3c020800, 0x00511021, 0x8c421be0, 0x3c030800, 0x00711821, + 0x8c631be4, 0x00021500, 0x00031c00, 0x00431025, 0xacc20014, 0x8e63fff4, + 0x96020008, 0x00432023, 0x3242ffff, 0x3083ffff, 0x00431021, 0x02c2102a, + 0x10400003, 0x00802821, 0x97a9001e, 0x01322823, 0x8e620000, 0x30a4ffff, + 0x00441021, 0xae620000, 0xa4c5000e, 0x8e020000, 0xacc20000, 0x8e020004, + 0x8e63fff4, 0x00431021, 0xacc20004, 0x8e63fff4, 0x96020008, 0x00641821, + 0x0062102a, 0x14400006, 0x02459021, 0x8e62fff0, 0xae60fff4, 0x24420001, + 0x0a000579, 0xae62fff0, 0xae63fff4, 0xacc00008, 0x3242ffff, 0x10560003, + 0x31020004, 0x10400006, 0x24020305, 0x31020080, 0x54400001, 0x34e70010, + 0x34e70020, 0x24020905, 0xa4c2000c, 0x8ee30000, 0x8ee20004, 0x14620007, + 0x3c02b49a, 0x8ee20860, 0x54400001, 0x34e70400, 0x3c024b65, 0x0a000590, + 0x34427654, 0x344289ab, 0xacc2001c, 0x30e2ffff, 0xacc20010, 0x0e0005aa, + 0x00c02021, 0x3242ffff, 0x0056102b, 0x1440ff96, 0x00000000, 0x8e620000, + 0x8e63fffc, 0x0043102a, 0x1440ff3e, 0x00000000, 0x8fbf0044, 0x8fbe0040, + 0x8fb7003c, 0x8fb60038, 0x8fb50034, 0x8fb40030, 0x8fb3002c, 0x8fb20028, + 0x8fb10024, 0x8fb00020, 0x03e00008, 0x27bd0048, 0x27bdffe8, 0xafbf0014, + 0xafb00010, 0x8f624450, 0x8f634410, 0x0a0005b9, 0x00808021, 0x8f626820, + 0x30422000, 0x10400003, 0x00000000, 0x0e0001e3, 0x00002021, 0x8f624450, + 0x8f634410, 0x3042ffff, 0x0043102b, 0x1440fff5, 0x00000000, 0x8f630c14, + 0x3063000f, 0x2c620002, 0x1440000b, 0x00000000, 0x8f630c14, 0x3c020800, + 0x8c421b50, 0x3063000f, 0x24420001, 0x3c010800, 0xac221b50, 0x2c620002, + 0x1040fff7, 0x00000000, 0xaf705c18, 0x8f625c10, 0x30420002, 0x10400009, + 0x00000000, 0x8f626820, 0x30422000, 0x1040fff8, 0x00000000, 0x0e0001e3, + 0x00002021, 0x0a0005cc, 0x00000000, 0x8fbf0014, 0x8fb00010, 0x03e00008, + 0x27bd0018, 0x00000000, 0x00000000, 0x00000000, 0x27bdffe8, 0x3c1bc000, + 0xafbf0014, 0xafb00010, 0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804, + 0x8f634000, 0x24020b50, 0x3c010800, 0xac221b64, 0x24020b78, 0x3c010800, + 0xac221b74, 0x34630002, 0xaf634000, 0x0e00060d, 0x00808021, 0x3c010800, + 0xa0221b78, 0x304200ff, 0x24030002, 0x14430005, 0x00000000, 0x3c020800, + 0x8c421b64, 0x0a000600, 0xac5000c0, 0x3c020800, 0x8c421b64, 0xac5000bc, + 0x8f624434, 0x8f634438, 0x8f644410, 0x3c010800, 0xac221b6c, 0x3c010800, + 0xac231b7c, 0x3c010800, 0xac241b68, 0x8fbf0014, 0x8fb00010, 0x03e00008, + 0x27bd0018, 0x3c040800, 0x8c870000, 0x3c03aa55, 0x3463aa55, 0x3c06c003, + 0xac830000, 0x8cc20000, 0x14430007, 0x24050002, 0x3c0355aa, 0x346355aa, + 0xac830000, 0x8cc20000, 0x50430001, 0x24050001, 0x3c020800, 0xac470000, + 0x03e00008, 0x00a01021, 0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c, + 0x8f62680c, 0x1043fffe, 0x00000000, 0x24a50001, 0x00a4102a, 0x1440fff9, + 0x00000000, 0x03e00008, 0x27bd0008, 0x8f634450, 0x3c020800, 0x8c421b6c, + 0x00031c02, 0x0043102b, 0x14400008, 0x3c038000, 0x3c040800, 0x8c841b7c, + 0x8f624450, 0x00021c02, 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, + 0x8f624444, 0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, + 0x3042ffff, 0x3082ffff, 0x2442e000, 0x2c422001, 0x14400003, 0x3c024000, + 0x0a000650, 0x2402ffff, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, + 0x1440fffc, 0x00001021, 0x03e00008, 0x00000000, 0x8f624450, 0x3c030800, + 0x8c631b68, 0x0a000659, 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b, + 0x1440fffc, 0x00000000, 0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821, + 0x3c040800, 0x24841b10, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, + 0x0e000684, 0xafa00014, 0x0a000668, 0x00000000, 0x8fbf0018, 0x03e00008, + 0x27bd0020, 0x00000000, 0x00000000, 0x00000000, 0x3c020800, 0x34423000, + 0x3c030800, 0x34633000, 0x3c040800, 0x348437ff, 0x3c010800, 0xac221b84, + 0x24020040, 0x3c010800, 0xac221b88, 0x3c010800, 0xac201b80, 0xac600000, + 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, 0x03e00008, 0x00000000, + 0x00804821, 0x8faa0010, 0x3c020800, 0x8c421b80, 0x3c040800, 0x8c841b88, + 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010800, 0xac231b80, 0x14400003, + 0x00004021, 0x3c010800, 0xac201b80, 0x3c020800, 0x8c421b80, 0x3c030800, + 0x8c631b84, 0x91240000, 0x00021140, 0x00431021, 0x00481021, 0x25080001, + 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, 0x3c020800, 0x8c421b80, + 0x3c030800, 0x8c631b84, 0x8f64680c, 0x00021140, 0x00431021, 0xac440008, + 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, 0x03e00008, 0xac4b001c, + 0x00000000, 0x00000000, }; u32 tg3TsoFwRodata[] = { - 0x4d61696e, 0x43707542, 0x00000000, 0x00000000, 0x74637073, 0x6567496e, - 0x00000000, 0x53774576, 0x656e7430, 0x00000000, 0x00000000, 0x00000000, - 0x00000000 + 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, + 0x00000000, 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, + 0x496e0000, 0x73746b6f, 0x66662a2a, 0x00000000, 0x53774576, + 0x656e7430, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x66617461, 0x6c457272, 0x00000000, 0x00000000, 0x00000000 }; -#if 0 /* All zeros, dont eat up space with it. */ +#if 0 /* All zeros, don't eat up space with it. */ u32 tg3TsoFwData[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }; #endif +/* 5705 needs a special version of the TSO firmware. */ +#define TG3_TSO5_FW_RELEASE_MAJOR 0x1 +#define TG3_TSO5_FW_RELASE_MINOR 0x1 +#define TG3_TSO5_FW_RELEASE_FIX 0x0 +#define TG3_TSO5_FW_START_ADDR 0x00010000 +#define TG3_TSO5_FW_TEXT_ADDR 0x00010000 +#define TG3_TSO5_FW_TEXT_LEN 0xeb0 +#define TG3_TSO5_FW_RODATA_ADDR 0x00010eb0 +#define TG3_TSO5_FW_RODATA_LEN 0x50 +#define TG3_TSO5_FW_DATA_ADDR 0x00010f20 +#define TG3_TSO5_FW_DATA_LEN 0x20 +#define TG3_TSO5_FW_SBSS_ADDR 0x00010f40 +#define TG3_TSO5_FW_SBSS_LEN 0x28 +#define TG3_TSO5_FW_BSS_ADDR 0x00010f70 +#define TG3_TSO5_FW_BSS_LEN 0x88 + +static u32 tg3Tso5FwText[] = { + 0x0c004003, 0x00000000, 0x00010f30, 0x00000000, 0x10000003, 0x00000000, + 0x0000000d, 0x0000000d, 0x3c1d0001, 0x37bde000, 0x03a0f021, 0x3c100001, + 0x26100000, 0x0c004010, 0x00000000, 0x0000000d, 0x27bdffe0, 0x3c04fefe, + 0xafbf0018, 0x0c0042f0, 0x34840002, 0x0c00436c, 0x00000000, 0x3c030001, + 0x90630f54, 0x24020002, 0x3c040001, 0x24840ebc, 0x14620003, 0x24050001, + 0x3c040001, 0x24840eb0, 0x24060001, 0x00003821, 0xafa00010, 0x0c004380, + 0xafa00014, 0x0c00402c, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, + 0x00000000, 0x00000000, 0x27bdffe0, 0xafbf001c, 0xafb20018, 0xafb10014, + 0x0c0042d3, 0xafb00010, 0x3c128000, 0x24110001, 0x8f706810, 0x32020400, + 0x10400007, 0x00000000, 0x8f641008, 0x00921024, 0x14400003, 0x00000000, + 0x0c004064, 0x00000000, 0x3c020001, 0x90420f76, 0x10510003, 0x32020200, + 0x1040fff1, 0x00000000, 0x0c0041b4, 0x00000000, 0x08004034, 0x00000000, + 0x8fbf001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x03e00008, 0x27bd0020, + 0x27bdffe0, 0x3c040001, 0x24840ed0, 0x00002821, 0x00003021, 0x00003821, + 0xafbf0018, 0xafa00010, 0x0c004380, 0xafa00014, 0x0000d021, 0x24020130, + 0xaf625000, 0x3c010001, 0xa4200f70, 0x3c010001, 0xa0200f77, 0x8fbf0018, + 0x03e00008, 0x27bd0020, 0x00000000, 0x00000000, 0x3c030001, 0x24630f80, + 0x90620000, 0x27bdfff0, 0x14400003, 0x0080c021, 0x08004073, 0x00004821, + 0x3c022000, 0x03021024, 0x10400003, 0x24090002, 0x08004073, 0xa0600000, + 0x24090001, 0x00181040, 0x30431f80, 0x346f8008, 0x1520004b, 0x25eb0028, + 0x3c040001, 0x00832021, 0x8c848010, 0x3c050001, 0x24a50f9a, 0x00041402, + 0xa0a20000, 0x3c010001, 0xa0240f9b, 0x3c020001, 0x00431021, 0x94428014, + 0x3c010001, 0xa0220f9c, 0x3c0c0001, 0x01836021, 0x8d8c8018, 0x304200ff, + 0x24420008, 0x000220c3, 0x24020001, 0x3c010001, 0xa0220f80, 0x0124102b, + 0x1040000c, 0x00003821, 0x24a6000e, 0x01602821, 0x8ca20000, 0x8ca30004, + 0x24a50008, 0x24e70001, 0xacc20000, 0xacc30004, 0x00e4102b, 0x1440fff8, + 0x24c60008, 0x00003821, 0x3c080001, 0x25080f9b, 0x91060000, 0x3c020001, + 0x90420f9c, 0x2503000d, 0x00c32821, 0x00461023, 0x00021fc2, 0x00431021, + 0x00021043, 0x1840000c, 0x00002021, 0x91020001, 0x00461023, 0x00021fc2, + 0x00431021, 0x00021843, 0x94a20000, 0x24e70001, 0x00822021, 0x00e3102a, + 0x1440fffb, 0x24a50002, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402, + 0x00822021, 0x3c02ffff, 0x01821024, 0x3083ffff, 0x00431025, 0x3c010001, + 0x080040fa, 0xac220fa0, 0x3c050001, 0x24a50f9c, 0x90a20000, 0x3c0c0001, + 0x01836021, 0x8d8c8018, 0x000220c2, 0x1080000e, 0x00003821, 0x01603021, + 0x24a5000c, 0x8ca20000, 0x8ca30004, 0x24a50008, 0x24e70001, 0xacc20000, + 0xacc30004, 0x00e4102b, 0x1440fff8, 0x24c60008, 0x3c050001, 0x24a50f9c, + 0x90a20000, 0x30430007, 0x24020004, 0x10620011, 0x28620005, 0x10400005, + 0x24020002, 0x10620008, 0x000710c0, 0x080040fa, 0x00000000, 0x24020006, + 0x1062000e, 0x000710c0, 0x080040fa, 0x00000000, 0x00a21821, 0x9463000c, + 0x004b1021, 0x080040fa, 0xa4430000, 0x000710c0, 0x00a21821, 0x8c63000c, + 0x004b1021, 0x080040fa, 0xac430000, 0x00a21821, 0x8c63000c, 0x004b2021, + 0x00a21021, 0xac830000, 0x94420010, 0xa4820004, 0x95e70006, 0x3c020001, + 0x90420f9c, 0x3c030001, 0x90630f9a, 0x00e2c823, 0x3c020001, 0x90420f9b, + 0x24630028, 0x01e34021, 0x24420028, 0x15200012, 0x01e23021, 0x94c2000c, + 0x3c010001, 0xa4220f98, 0x94c20004, 0x94c30006, 0x3c010001, 0xa4200f96, + 0x3c010001, 0xa4200f92, 0x00021400, 0x00431025, 0x3c010001, 0xac220f8c, + 0x95020004, 0x3c010001, 0x08004124, 0xa4220f90, 0x3c020001, 0x94420f90, + 0x3c030001, 0x94630f92, 0x00431021, 0xa5020004, 0x3c020001, 0x94420f8c, + 0xa4c20004, 0x3c020001, 0x8c420f8c, 0xa4c20006, 0x3c040001, 0x94840f92, + 0x3c020001, 0x94420f90, 0x3c0a0001, 0x954a0f96, 0x00441821, 0x3063ffff, + 0x0062182a, 0x24020002, 0x1122000b, 0x00832023, 0x3c030001, 0x94630f98, + 0x30620009, 0x10400006, 0x3062fff6, 0xa4c2000c, 0x3c020001, 0x94420f98, + 0x30420009, 0x01425023, 0x24020001, 0x1122001b, 0x29220002, 0x50400005, + 0x24020002, 0x11200007, 0x31a2ffff, 0x08004197, 0x00000000, 0x1122001d, + 0x24020016, 0x08004197, 0x31a2ffff, 0x3c0e0001, 0x95ce0fa0, 0x10800005, + 0x01806821, 0x01c42021, 0x00041c02, 0x3082ffff, 0x00627021, 0x000e1027, + 0xa502000a, 0x3c030001, 0x90630f9b, 0x31a2ffff, 0x00e21021, 0x0800418d, + 0x00432023, 0x3c020001, 0x94420fa0, 0x00442021, 0x00041c02, 0x3082ffff, + 0x00622021, 0x00807021, 0x00041027, 0x08004185, 0xa502000a, 0x3c050001, + 0x24a50f9a, 0x90a30000, 0x14620002, 0x24e2fff2, 0xa5e20034, 0x90a20000, + 0x00e21023, 0xa5020002, 0x3c030001, 0x94630fa0, 0x3c020001, 0x94420f7a, + 0x30e5ffff, 0x00641821, 0x00451023, 0x00622023, 0x00041c02, 0x3082ffff, + 0x00622021, 0x00041027, 0xa502000a, 0x3c030001, 0x90630f9c, 0x24620001, + 0x14a20005, 0x00807021, 0x01631021, 0x90420000, 0x08004185, 0x00026200, + 0x24620002, 0x14a20003, 0x306200fe, 0x004b1021, 0x944c0000, 0x3c020001, + 0x94420fa2, 0x3183ffff, 0x3c040001, 0x90840f9b, 0x00431021, 0x00e21021, + 0x00442023, 0x008a2021, 0x00041c02, 0x3082ffff, 0x00622021, 0x00041402, + 0x00822021, 0x00806821, 0x00041027, 0xa4c20010, 0x31a2ffff, 0x000e1c00, + 0x00431025, 0x3c040001, 0x24840f92, 0xade20010, 0x94820000, 0x3c050001, + 0x94a50f96, 0x3c030001, 0x8c630f8c, 0x24420001, 0x00b92821, 0xa4820000, + 0x3322ffff, 0x00622021, 0x0083182b, 0x3c010001, 0xa4250f96, 0x10600003, + 0x24a2ffff, 0x3c010001, 0xa4220f96, 0x3c024000, 0x03021025, 0x3c010001, + 0xac240f8c, 0xaf621008, 0x03e00008, 0x27bd0010, 0x3c030001, 0x90630f76, + 0x27bdffe8, 0x24020001, 0xafbf0014, 0x10620026, 0xafb00010, 0x8f620cf4, + 0x2442ffff, 0x3042007f, 0x00021100, 0x8c434000, 0x3c010001, 0xac230f84, + 0x8c434008, 0x24444000, 0x8c5c4004, 0x30620040, 0x14400002, 0x24020088, + 0x24020008, 0x3c010001, 0xa4220f88, 0x30620004, 0x10400005, 0x24020001, + 0x3c010001, 0xa0220f77, 0x080041d5, 0x00031402, 0x3c010001, 0xa0200f77, + 0x00031402, 0x3c010001, 0xa4220f74, 0x9483000c, 0x24020001, 0x3c010001, + 0xa4200f70, 0x3c010001, 0xa0220f76, 0x3c010001, 0xa4230f82, 0x24020001, + 0x1342001e, 0x00000000, 0x13400005, 0x24020003, 0x13420067, 0x00000000, + 0x080042cf, 0x00000000, 0x3c020001, 0x94420f82, 0x241a0001, 0x3c010001, + 0xa4200f7e, 0x3c010001, 0xa4200f72, 0x304407ff, 0x00021bc2, 0x00031823, + 0x3063003e, 0x34630036, 0x00021242, 0x3042003c, 0x00621821, 0x3c010001, + 0xa4240f78, 0x00832021, 0x24630030, 0x3c010001, 0xa4240f7a, 0x3c010001, + 0xa4230f7c, 0x3c060001, 0x24c60f72, 0x94c50000, 0x94c30002, 0x3c040001, + 0x94840f7a, 0x00651021, 0x0044102a, 0x10400013, 0x3c108000, 0x00a31021, + 0xa4c20000, 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f76, 0x8f641008, + 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, + 0x00501024, 0x104000b7, 0x00000000, 0x0800420f, 0x00000000, 0x3c030001, + 0x94630f70, 0x00851023, 0xa4c40000, 0x00621821, 0x3042ffff, 0x3c010001, + 0xa4230f70, 0xaf620ce8, 0x3c020001, 0x94420f88, 0x34420024, 0xaf620cec, + 0x94c30002, 0x3c020001, 0x94420f70, 0x14620012, 0x3c028000, 0x3c108000, + 0x3c02a000, 0xaf620cf4, 0x3c010001, 0xa0200f76, 0x8f641008, 0x00901024, + 0x14400003, 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024, + 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003, 0xaf620cf4, 0x3c108000, + 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, 0x00000000, + 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x080042cf, 0x241a0003, + 0x3c070001, 0x24e70f70, 0x94e20000, 0x03821021, 0xaf620ce0, 0x3c020001, + 0x8c420f84, 0xaf620ce4, 0x3c050001, 0x94a50f74, 0x94e30000, 0x3c040001, + 0x94840f78, 0x3c020001, 0x94420f7e, 0x00a32823, 0x00822023, 0x30a6ffff, + 0x3083ffff, 0x00c3102b, 0x14400043, 0x00000000, 0x3c020001, 0x94420f7c, + 0x00021400, 0x00621025, 0xaf620ce8, 0x94e20000, 0x3c030001, 0x94630f74, + 0x00441021, 0xa4e20000, 0x3042ffff, 0x14430021, 0x3c020008, 0x3c020001, + 0x90420f77, 0x10400006, 0x3c03000c, 0x3c020001, 0x94420f88, 0x34630624, + 0x0800427c, 0x0000d021, 0x3c020001, 0x94420f88, 0x3c030008, 0x34630624, + 0x00431025, 0xaf620cec, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001, + 0xa0200f76, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, + 0x00000000, 0x8f620cf4, 0x00501024, 0x10400015, 0x00000000, 0x08004283, + 0x00000000, 0x3c030001, 0x94630f88, 0x34420624, 0x3c108000, 0x00621825, + 0x3c028000, 0xaf630cec, 0xaf620cf4, 0x8f641008, 0x00901024, 0x14400003, + 0x00000000, 0x0c004064, 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7, + 0x00000000, 0x3c010001, 0x080042cf, 0xa4200f7e, 0x3c020001, 0x94420f7c, + 0x00021400, 0x00c21025, 0xaf620ce8, 0x3c020001, 0x90420f77, 0x10400009, + 0x3c03000c, 0x3c020001, 0x94420f88, 0x34630624, 0x0000d021, 0x00431025, + 0xaf620cec, 0x080042c1, 0x3c108000, 0x3c020001, 0x94420f88, 0x3c030008, + 0x34630604, 0x00431025, 0xaf620cec, 0x3c020001, 0x94420f7e, 0x00451021, + 0x3c010001, 0xa4220f7e, 0x3c108000, 0x3c02a000, 0xaf620cf4, 0x3c010001, + 0xa0200f76, 0x8f641008, 0x00901024, 0x14400003, 0x00000000, 0x0c004064, + 0x00000000, 0x8f620cf4, 0x00501024, 0x1440fff7, 0x00000000, 0x8fbf0014, + 0x8fb00010, 0x03e00008, 0x27bd0018, 0x27bdffe0, 0x3c040001, 0x24840ee0, + 0x00002821, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, 0x0c004380, + 0xafa00014, 0x0000d021, 0x24020130, 0xaf625000, 0x3c010001, 0xa4200f70, + 0x3c010001, 0xa0200f77, 0x8f636804, 0x3c020001, 0x3442e000, 0x00621824, + 0x3c020001, 0x14620003, 0x00000000, 0x080042eb, 0x00000000, 0x8fbf0018, + 0x03e00008, 0x27bd0020, 0x27bdffe8, 0x3c1bc000, 0xafbf0014, 0xafb00010, + 0xaf60680c, 0x8f626804, 0x34420082, 0xaf626804, 0x8f634000, 0x24020b50, + 0x3c010001, 0xac220f40, 0x24020b78, 0x3c010001, 0xac220f50, 0x34630002, + 0xaf634000, 0x0c00431d, 0x00808021, 0x3c010001, 0xa0220f54, 0x304200ff, + 0x24030002, 0x14430005, 0x00000000, 0x3c020001, 0x8c420f40, 0x08004310, + 0xac5000c0, 0x3c020001, 0x8c420f40, 0xac5000bc, 0x8f624434, 0x8f634438, + 0x8f644410, 0x3c010001, 0xac220f48, 0x3c010001, 0xac230f58, 0x3c010001, + 0xac240f44, 0x8fbf0014, 0x8fb00010, 0x03e00008, 0x27bd0018, 0x03e00008, + 0x24020001, 0x27bdfff8, 0x18800009, 0x00002821, 0x8f63680c, 0x8f62680c, + 0x1043fffe, 0x00000000, 0x24a50001, 0x00a4102a, 0x1440fff9, 0x00000000, + 0x03e00008, 0x27bd0008, 0x8f634450, 0x3c020001, 0x8c420f48, 0x00031c02, + 0x0043102b, 0x14400008, 0x3c038000, 0x3c040001, 0x8c840f58, 0x8f624450, + 0x00021c02, 0x0083102b, 0x1040fffc, 0x3c038000, 0xaf634444, 0x8f624444, + 0x00431024, 0x1440fffd, 0x00000000, 0x8f624448, 0x03e00008, 0x3042ffff, + 0x3082ffff, 0x2442e000, 0x2c422001, 0x14400003, 0x3c024000, 0x0800434f, + 0x2402ffff, 0x00822025, 0xaf645c38, 0x8f625c30, 0x30420002, 0x1440fffc, + 0x00001021, 0x03e00008, 0x00000000, 0x8f624450, 0x3c030001, 0x8c630f44, + 0x08004358, 0x3042ffff, 0x8f624450, 0x3042ffff, 0x0043102b, 0x1440fffc, + 0x00000000, 0x03e00008, 0x00000000, 0x27bdffe0, 0x00802821, 0x3c040001, + 0x24840ef0, 0x00003021, 0x00003821, 0xafbf0018, 0xafa00010, 0x0c004380, + 0xafa00014, 0x08004367, 0x00000000, 0x8fbf0018, 0x03e00008, 0x27bd0020, + 0x3c020001, 0x3442d600, 0x3c030001, 0x3463d600, 0x3c040001, 0x3484ddff, + 0x3c010001, 0xac220f60, 0x24020040, 0x3c010001, 0xac220f64, 0x3c010001, + 0xac200f5c, 0xac600000, 0x24630004, 0x0083102b, 0x5040fffd, 0xac600000, + 0x03e00008, 0x00000000, 0x00804821, 0x8faa0010, 0x3c020001, 0x8c420f5c, + 0x3c040001, 0x8c840f64, 0x8fab0014, 0x24430001, 0x0044102b, 0x3c010001, + 0xac230f5c, 0x14400003, 0x00004021, 0x3c010001, 0xac200f5c, 0x3c020001, + 0x8c420f5c, 0x3c030001, 0x8c630f60, 0x91240000, 0x00021140, 0x00431021, + 0x00481021, 0x25080001, 0xa0440000, 0x29020008, 0x1440fff4, 0x25290001, + 0x3c020001, 0x8c420f5c, 0x3c030001, 0x8c630f60, 0x8f64680c, 0x00021140, + 0x00431021, 0xac440008, 0xac45000c, 0xac460010, 0xac470014, 0xac4a0018, + 0x03e00008, 0xac4b001c, 0x00000000, 0x00000000, +}; + +u32 tg3Tso5FwRodata[] = { + 0x4d61696e, 0x43707542, 0x00000000, 0x4d61696e, 0x43707541, 0x00000000, + 0x00000000, 0x00000000, 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, + 0x73746b6f, 0x66666c64, 0x00000000, 0x00000000, 0x66617461, 0x6c457272, + 0x00000000, 0x00000000, 0x00000000 +}; + +u32 tg3Tso5FwData[] = { + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x73746b6f, + 0x66666c64, 0x5f76312e, 0x312e3000, 0x00000000 +}; + /* tp->lock is held. */ static int tg3_load_tso_firmware(struct tg3 *tp) { struct fw_info info; + unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; int err, i; - info.text_base = TG3_TSO_FW_TEXT_ADDR; - info.text_len = TG3_TSO_FW_TEXT_LEN; - info.text_data = &tg3TsoFwText[0]; - info.rodata_base = TG3_TSO_FW_RODATA_ADDR; - info.rodata_len = TG3_TSO_FW_RODATA_LEN; - info.rodata_data = &tg3TsoFwRodata[0]; - info.data_base = TG3_TSO_FW_DATA_ADDR; - info.data_len = TG3_TSO_FW_DATA_LEN; - info.data_data = NULL; - - err = tg3_load_firmware_cpu(tp, TX_CPU_BASE, - TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE, + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + info.text_base = TG3_TSO5_FW_TEXT_ADDR; + info.text_len = TG3_TSO5_FW_TEXT_LEN; + info.text_data = &tg3Tso5FwText[0]; + info.rodata_base = TG3_TSO5_FW_RODATA_ADDR; + info.rodata_len = TG3_TSO5_FW_RODATA_LEN; + info.rodata_data = &tg3Tso5FwRodata[0]; + info.data_base = TG3_TSO5_FW_DATA_ADDR; + info.data_len = TG3_TSO5_FW_DATA_LEN; + info.data_data = &tg3Tso5FwData[0]; + cpu_base = RX_CPU_BASE; + cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705; + cpu_scratch_size = (info.text_len + + info.rodata_len + + info.data_len + + TG3_TSO5_FW_SBSS_LEN + + TG3_TSO5_FW_BSS_LEN); + } else { + info.text_base = TG3_TSO_FW_TEXT_ADDR; + info.text_len = TG3_TSO_FW_TEXT_LEN; + info.text_data = &tg3TsoFwText[0]; + info.rodata_base = TG3_TSO_FW_RODATA_ADDR; + info.rodata_len = TG3_TSO_FW_RODATA_LEN; + info.rodata_data = &tg3TsoFwRodata[0]; + info.data_base = TG3_TSO_FW_DATA_ADDR; + info.data_len = TG3_TSO_FW_DATA_LEN; + info.data_data = NULL; + cpu_base = TX_CPU_BASE; + cpu_scratch_base = TX_CPU_SCRATCH_BASE; + cpu_scratch_size = TX_CPU_SCRATCH_SIZE; + } + + err = tg3_load_firmware_cpu(tp, cpu_base, + cpu_scratch_base, cpu_scratch_size, &info); if (err) return err; - /* Now startup only the TX cpu. */ - tw32(TX_CPU_BASE + CPU_STATE, 0xffffffff); - tw32(TX_CPU_BASE + CPU_PC, TG3_TSO_FW_TEXT_ADDR); + /* Now startup the cpu. */ + tw32(cpu_base + CPU_STATE, 0xffffffff); + tw32(cpu_base + CPU_PC, info.text_base); /* Flush posted writes. */ - tr32(TX_CPU_BASE + CPU_PC); + tr32(cpu_base + CPU_PC); for (i = 0; i < 5; i++) { - if (tr32(TX_CPU_BASE + CPU_PC) == TG3_TSO_FW_TEXT_ADDR) + if (tr32(cpu_base + CPU_PC) == info.text_base) break; - tw32(TX_CPU_BASE + CPU_STATE, 0xffffffff); - tw32(TX_CPU_BASE + CPU_MODE, CPU_MODE_HALT); - tw32(TX_CPU_BASE + CPU_PC, TG3_TSO_FW_TEXT_ADDR); + tw32(cpu_base + CPU_STATE, 0xffffffff); + tw32(cpu_base + CPU_MODE, CPU_MODE_HALT); + tw32(cpu_base + CPU_PC, info.text_base); /* Flush posted writes. */ - tr32(TX_CPU_BASE + CPU_PC); + tr32(cpu_base + CPU_PC); udelay(1000); } if (i >= 5) { printk(KERN_ERR PFX "tg3_load_tso_firmware fails for %s " - "to set TX CPU PC, is %08x should be %08x\n", - tp->dev->name, tr32(TX_CPU_BASE + CPU_PC), - TG3_TSO_FW_TEXT_ADDR); + "to set CPU PC, is %08x should be %08x\n", + tp->dev->name, tr32(cpu_base + CPU_PC), + info.text_base); return -ENODEV; } - tw32(TX_CPU_BASE + CPU_STATE, 0xffffffff); - tw32(TX_CPU_BASE + CPU_MODE, 0x00000000); + tw32(cpu_base + CPU_STATE, 0xffffffff); + tw32(cpu_base + CPU_MODE, 0x00000000); /* Flush posted writes. */ - tr32(TX_CPU_BASE + CPU_MODE); + tr32(cpu_base + CPU_MODE); return 0; } -#endif /* TG3_DO_TSO != 0 */ +#endif /* TG3_TSO_SUPPORT != 0 */ /* tp->lock is held. */ static void __tg3_set_mac_addr(struct tg3 *tp) @@ -3815,6 +4463,15 @@ tw32(MAC_ADDR_0_LOW + (i * 8), addr_low); } + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 && + GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701 && + GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) { + for (i = 0; i < 12; i++) { + tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high); + tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low); + } + } + addr_high = (tp->dev->dev_addr[0] + tp->dev->dev_addr[1] + tp->dev->dev_addr[2] + @@ -3848,23 +4505,19 @@ u32 nic_addr) { tg3_write_mem(tp, - (bdinfo_addr + - TG3_BDINFO_HOST_ADDR + - TG3_64BIT_REG_HIGH), + (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH), ((u64) mapping >> 32)); tg3_write_mem(tp, - (bdinfo_addr + - TG3_BDINFO_HOST_ADDR + - TG3_64BIT_REG_LOW), + (bdinfo_addr + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW), ((u64) mapping & 0xffffffff)); tg3_write_mem(tp, - (bdinfo_addr + - TG3_BDINFO_MAXLEN_FLAGS), + (bdinfo_addr + TG3_BDINFO_MAXLEN_FLAGS), maxlen_flags); - tg3_write_mem(tp, - (bdinfo_addr + - TG3_BDINFO_NIC_ADDR), - nic_addr); + + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) + tg3_write_mem(tp, + (bdinfo_addr + TG3_BDINFO_NIC_ADDR), + nic_addr); } static void __tg3_set_rx_mode(struct net_device *); @@ -3872,8 +4525,8 @@ /* tp->lock is held. */ static int tg3_reset_hw(struct tg3 *tp) { - u32 val; - int i, err; + u32 val, rdmac_mode; + int i, err, limit; tg3_disable_ints(tp); @@ -3906,7 +4559,8 @@ break; udelay(10); } - if (i >= 100000) { + if (i >= 100000 && + !(tp->tg3_flags2 & TG3_FLG2_SUN_5704)) { printk(KERN_ERR PFX "tg3_reset_hw timed out for %s, " "firmware will not restart magic=%08x\n", tp->dev->name, val); @@ -3924,9 +4578,8 @@ * B3 tigon3 silicon. This bit has no effect on any * other revision. */ - val = tr32(TG3PCI_CLOCK_CTRL); - val |= CLOCK_CTRL_DELAY_PCI_GRANT; - tw32(TG3PCI_CLOCK_CTRL, val); + tp->pci_clock_ctrl |= CLOCK_CTRL_DELAY_PCI_GRANT; + tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl); tr32(TG3PCI_CLOCK_CTRL); if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 && @@ -3936,12 +4589,21 @@ tw32(TG3PCI_PCISTATE, val); } + /* Descriptor ring init may make accesses to the + * NIC SRAM area to setup the TX descriptors, so we + * can only do this after the hardware has been + * successfully reset. + */ + tg3_init_rings(tp); + /* Clear statistics/status block in chip, and status block in ram. */ - for (i = NIC_SRAM_STATS_BLK; - i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE; - i += sizeof(u32)) { - tg3_write_mem(tp, i, 0); - udelay(40); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) { + for (i = NIC_SRAM_STATS_BLK; + i < NIC_SRAM_STATUS_BLK + TG3_HW_STATUS_SIZE; + i += sizeof(u32)) { + tg3_write_mem(tp, i, 0); + udelay(40); + } } memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); @@ -3972,13 +4634,31 @@ (65 << GRC_MISC_CFG_PRESCALAR_SHIFT)); /* Initialize MBUF/DESC pool. */ - tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE); - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) - tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64); - else - tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96); - tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE); - tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) { + tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE); + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) + tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64); + else + tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96); + tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE); + tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE); + } +#if TG3_TSO_SUPPORT != 0 + else if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) { + int fw_len; + + fw_len = (TG3_TSO5_FW_TEXT_LEN + + TG3_TSO5_FW_RODATA_LEN + + TG3_TSO5_FW_DATA_LEN + + TG3_TSO5_FW_SBSS_LEN + + TG3_TSO5_FW_BSS_LEN); + fw_len = (fw_len + (0x80 - 1)) & ~(0x80 - 1); + tw32(BUFMGR_MB_POOL_ADDR, + NIC_SRAM_MBUF_POOL_BASE5705 + fw_len); + tw32(BUFMGR_MB_POOL_SIZE, + NIC_SRAM_MBUF_POOL_SIZE5705 - fw_len - 0xa00); + } +#endif if (!(tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE)) { tw32(BUFMGR_MB_RDMA_LOW_WATER, @@ -4025,6 +4705,9 @@ return -ENODEV; } + /* Setup replenish threshold. */ + tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8); + /* Initialize TG3_BDINFO's at: * RCVDBDI_STD_BD: standard eth size rx ring * RCVDBDI_JUMBO_BD: jumbo frame rx ring @@ -4046,35 +4729,50 @@ ((u64) tp->rx_std_mapping >> 32)); tw32(RCVDBDI_STD_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, ((u64) tp->rx_std_mapping & 0xffffffff)); - tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, - RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT); tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR, NIC_SRAM_RX_BUFFER_DESC); - tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS, - BDINFO_FLAGS_DISABLED); - - if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) { - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tp->rx_jumbo_mapping >> 32)); - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tp->rx_jumbo_mapping & 0xffffffff)); - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS, - RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT); - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR, - NIC_SRAM_RX_JUMBO_BUFFER_DESC); + /* Don't even try to program the JUMBO/MINI buffer descriptor + * configs on 5705. + */ + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, + RX_STD_MAX_SIZE_5705 << BDINFO_FLAGS_MAXLEN_SHIFT); } else { - tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS, + tw32(RCVDBDI_STD_BD + TG3_BDINFO_MAXLEN_FLAGS, + RX_STD_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT); + + tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS, BDINFO_FLAGS_DISABLED); - } - /* Setup replenish thresholds. */ - tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8); - tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8); + /* Setup replenish threshold. */ + tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8); - /* Clear out send RCB ring in SRAM. */ - for (i = NIC_SRAM_SEND_RCB; i < NIC_SRAM_RCV_RET_RCB; i += TG3_BDINFO_SIZE) - tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS, BDINFO_FLAGS_DISABLED); + if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) { + tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, + ((u64) tp->rx_jumbo_mapping >> 32)); + tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, + ((u64) tp->rx_jumbo_mapping & 0xffffffff)); + tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS, + RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT); + tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR, + NIC_SRAM_RX_JUMBO_BUFFER_DESC); + } else { + tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS, + BDINFO_FLAGS_DISABLED); + } + + } + + /* There is only one send ring on 5705, no need to explicitly + * disable the others. + */ + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) { + /* Clear out send RCB ring in SRAM. */ + for (i = NIC_SRAM_SEND_RCB; i < NIC_SRAM_RCV_RET_RCB; i += TG3_BDINFO_SIZE) + tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS, + BDINFO_FLAGS_DISABLED); + } tp->tx_prod = 0; tp->tx_cons = 0; @@ -4096,9 +4794,15 @@ NIC_SRAM_TX_BUFFER_DESC); } - for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK; i += TG3_BDINFO_SIZE) { - tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS, - BDINFO_FLAGS_DISABLED); + /* There is only one receive return ring on 5705, no need to explicitly + * disable the others. + */ + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) { + for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK; + i += TG3_BDINFO_SIZE) { + tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS, + BDINFO_FLAGS_DISABLED); + } } tp->rx_rcb_ptr = 0; @@ -4108,7 +4812,7 @@ tg3_set_bdinfo(tp, NIC_SRAM_RCV_RET_RCB, tp->rx_rcb_mapping, - (TG3_RX_RCB_RING_SIZE << + (TG3_RX_RCB_RING_SIZE(tp) << BDINFO_FLAGS_MAXLEN_SHIFT), 0); @@ -4145,8 +4849,36 @@ tw32(MAC_RCV_RULE_CFG, RCV_RULE_CFG_DEFAULT_CLASS); tw32(RCVLPC_CONFIG, 0x0181); + /* Calculate RDMAC_MODE setting early, we need it to determine + * the RCVLPC_STATE_ENABLE mask. + */ + rdmac_mode = (RDMAC_MODE_ENABLE | RDMAC_MODE_TGTABORT_ENAB | + RDMAC_MODE_MSTABORT_ENAB | RDMAC_MODE_PARITYERR_ENAB | + RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB | + RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB | + RDMAC_MODE_LNGREAD_ENAB); + if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) + rdmac_mode |= RDMAC_MODE_SPLIT_ENABLE; + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + if (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) { + if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) { + rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128; + } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) && + !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) { + rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST; + } + } + } + /* Receive/send statistics. */ - tw32(RCVLPC_STATS_ENABLE, 0xffffff); + if ((rdmac_mode & RDMAC_MODE_FIFO_SIZE_128) && + (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) { + val = tr32(RCVLPC_STATS_ENABLE); + val &= ~RCVLPC_STATSENAB_LNGBRST_RFIX; + tw32(RCVLPC_STATS_ENABLE, val); + } else { + tw32(RCVLPC_STATS_ENABLE, 0xffffff); + } tw32(RCVLPC_STATSCTRL, RCVLPC_STATSCTRL_ENABLE); tw32(SNDDATAI_STATSENAB, 0xffffff); tw32(SNDDATAI_STATSCTRL, @@ -4162,33 +4894,43 @@ } tw32(HOSTCC_RXCOL_TICKS, 0); - tw32(HOSTCC_RXMAX_FRAMES, 1); - tw32(HOSTCC_RXCOAL_TICK_INT, 0); - tw32(HOSTCC_RXCOAL_MAXF_INT, 1); tw32(HOSTCC_TXCOL_TICKS, LOW_TXCOL_TICKS); + tw32(HOSTCC_RXMAX_FRAMES, 1); tw32(HOSTCC_TXMAX_FRAMES, LOW_RXMAX_FRAMES); - tw32(HOSTCC_TXCOAL_TICK_INT, 0); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) + tw32(HOSTCC_RXCOAL_TICK_INT, 0); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) + tw32(HOSTCC_TXCOAL_TICK_INT, 0); + tw32(HOSTCC_RXCOAL_MAXF_INT, 1); tw32(HOSTCC_TXCOAL_MAXF_INT, 0); - tw32(HOSTCC_STAT_COAL_TICKS, - DEFAULT_STAT_COAL_TICKS); - /* Status/statistics block address. */ - tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, - ((u64) tp->stats_mapping >> 32)); - tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, - ((u64) tp->stats_mapping & 0xffffffff)); + /* set status block DMA address */ tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, ((u64) tp->status_mapping >> 32)); tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, ((u64) tp->status_mapping & 0xffffffff)); - tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK); - tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK); + + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) { + /* Status/statistics block address. See tg3_timer, + * the tg3_periodic_fetch_stats call there, and + * tg3_get_stats to see how this works for 5705 chips. + */ + tw32(HOSTCC_STAT_COAL_TICKS, + DEFAULT_STAT_COAL_TICKS); + tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, + ((u64) tp->stats_mapping >> 32)); + tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, + ((u64) tp->stats_mapping & 0xffffffff)); + tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK); + tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK); + } tw32(HOSTCC_MODE, HOSTCC_MODE_ENABLE | tp->coalesce_mode); tw32(RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE); tw32(RCVLPC_MODE, RCVLPC_MODE_ENABLE); - tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) + tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE); tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; @@ -4207,42 +4949,47 @@ tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0); tr32(MAILBOX_INTERRUPT_0); - tw32(DMAC_MODE, DMAC_MODE_ENABLE); - tr32(DMAC_MODE); - udelay(40); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) { + tw32(DMAC_MODE, DMAC_MODE_ENABLE); + tr32(DMAC_MODE); + udelay(40); + } - tw32(WDMAC_MODE, (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB | - WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB | - WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB | - WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB | - WDMAC_MODE_LNGREAD_ENAB)); + val = (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB | + WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB | + WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB | + WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB | + WDMAC_MODE_LNGREAD_ENAB); + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && + (tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) != 0 && + !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) + val |= WDMAC_MODE_RX_ACCEL; + tw32(WDMAC_MODE, val); tr32(WDMAC_MODE); udelay(40); - if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 && - (tp->tg3_flags & TG3_FLAG_PCIX_MODE)) { + if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) { val = tr32(TG3PCI_X_CAPS); - val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK); - val |= (PCIX_CAPS_MAX_BURST_5704 << PCIX_CAPS_BURST_SHIFT); - if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) - val |= (tp->split_mode_max_reqs << - PCIX_CAPS_SPLIT_SHIFT); + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) { + val &= ~PCIX_CAPS_BURST_MASK; + val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT); + } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) { + val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK); + val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT); + if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) + val |= (tp->split_mode_max_reqs << + PCIX_CAPS_SPLIT_SHIFT); + } tw32(TG3PCI_X_CAPS, val); } - val = (RDMAC_MODE_ENABLE | RDMAC_MODE_TGTABORT_ENAB | - RDMAC_MODE_MSTABORT_ENAB | RDMAC_MODE_PARITYERR_ENAB | - RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB | - RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB | - RDMAC_MODE_LNGREAD_ENAB); - if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) - val |= RDMAC_MODE_SPLIT_ENABLE; - tw32(RDMAC_MODE, val); + tw32(RDMAC_MODE, rdmac_mode); tr32(RDMAC_MODE); udelay(40); tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE); - tw32(MBFREE_MODE, MBFREE_MODE_ENABLE); + if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) + tw32(MBFREE_MODE, MBFREE_MODE_ENABLE); tw32(SNDDATAC_MODE, SNDDATAC_MODE_ENABLE); tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE); tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB); @@ -4257,10 +5004,12 @@ return err; } -#if TG3_DO_TSO != 0 - err = tg3_load_tso_firmware(tp); - if (err) - return err; +#if TG3_TSO_SUPPORT != 0 + if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) { + err = tg3_load_tso_firmware(tp); + if (err) + return err; + } #endif tp->tx_mode = TX_MODE_ENABLE; @@ -4287,9 +5036,11 @@ tw32(MAC_LED_CTRL, 0); tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); - tw32(MAC_RX_MODE, RX_MODE_RESET); - tr32(MAC_RX_MODE); - udelay(10); + if (tp->phy_id == PHY_ID_SERDES) { + tw32(MAC_RX_MODE, RX_MODE_RESET); + tr32(MAC_RX_MODE); + udelay(10); + } tw32(MAC_RX_MODE, tp->rx_mode); tr32(MAC_RX_MODE); udelay(10); @@ -4323,22 +5074,48 @@ tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK); tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK); tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK); -#if 0 - tw32(MAC_RCV_RULE_2, 0); tw32(MAC_RCV_VALUE_2, 0); - tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); -#endif - tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0); - tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0); - tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0); - tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0); - tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0); - tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0); - tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0); - tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0); - tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0); - tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0); - tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0); - tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0); + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) + limit = 8; + else + limit = 16; + if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) + limit -= 4; + switch (limit) { + case 16: + tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0); + case 15: + tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0); + case 14: + tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0); + case 13: + tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0); + case 12: + tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0); + case 11: + tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0); + case 10: + tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0); + case 9: + tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0); + case 8: + tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0); + case 7: + tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0); + case 6: + tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0); + case 5: + tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0); + case 4: + /* tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); */ + case 3: + /* tw32(MAC_RCV_RULE_2, 0); tw32(MAC_RCV_VALUE_2, 0); */ + case 2: + case 1: + + default: + break; + }; if (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) tg3_enable_ints(tp); @@ -4368,6 +5145,50 @@ return err; } +#define TG3_STAT_ADD32(PSTAT, REG) \ +do { u32 __val = tr32(REG); \ + (PSTAT)->low += __val; \ + if ((PSTAT)->low < __val) \ + (PSTAT)->high += 1; \ +} while (0) + +static void tg3_periodic_fetch_stats(struct tg3 *tp) +{ + struct tg3_hw_stats *sp = tp->hw_stats; + + if (!netif_carrier_ok(tp->dev)) + return; + + TG3_STAT_ADD32(&sp->tx_octets, MAC_TX_STATS_OCTETS); + TG3_STAT_ADD32(&sp->tx_collisions, MAC_TX_STATS_COLLISIONS); + TG3_STAT_ADD32(&sp->tx_xon_sent, MAC_TX_STATS_XON_SENT); + TG3_STAT_ADD32(&sp->tx_xoff_sent, MAC_TX_STATS_XOFF_SENT); + TG3_STAT_ADD32(&sp->tx_mac_errors, MAC_TX_STATS_MAC_ERRORS); + TG3_STAT_ADD32(&sp->tx_single_collisions, MAC_TX_STATS_SINGLE_COLLISIONS); + TG3_STAT_ADD32(&sp->tx_mult_collisions, MAC_TX_STATS_MULT_COLLISIONS); + TG3_STAT_ADD32(&sp->tx_deferred, MAC_TX_STATS_DEFERRED); + TG3_STAT_ADD32(&sp->tx_excessive_collisions, MAC_TX_STATS_EXCESSIVE_COL); + TG3_STAT_ADD32(&sp->tx_late_collisions, MAC_TX_STATS_LATE_COL); + TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST); + TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST); + TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST); + + TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS); + TG3_STAT_ADD32(&sp->rx_fragments, MAC_RX_STATS_FRAGMENTS); + TG3_STAT_ADD32(&sp->rx_ucast_packets, MAC_RX_STATS_UCAST); + TG3_STAT_ADD32(&sp->rx_mcast_packets, MAC_RX_STATS_MCAST); + TG3_STAT_ADD32(&sp->rx_bcast_packets, MAC_RX_STATS_BCAST); + TG3_STAT_ADD32(&sp->rx_fcs_errors, MAC_RX_STATS_FCS_ERRORS); + TG3_STAT_ADD32(&sp->rx_align_errors, MAC_RX_STATS_ALIGN_ERRORS); + TG3_STAT_ADD32(&sp->rx_xon_pause_rcvd, MAC_RX_STATS_XON_PAUSE_RECVD); + TG3_STAT_ADD32(&sp->rx_xoff_pause_rcvd, MAC_RX_STATS_XOFF_PAUSE_RECVD); + TG3_STAT_ADD32(&sp->rx_mac_ctrl_rcvd, MAC_RX_STATS_MAC_CTRL_RECVD); + TG3_STAT_ADD32(&sp->rx_xoff_entered, MAC_RX_STATS_XOFF_ENTERED); + TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG); + TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS); + TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE); +} + static void tg3_timer(unsigned long __opaque) { struct tg3 *tp = (struct tg3 *) __opaque; @@ -4396,6 +5217,9 @@ return; } + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) + tg3_periodic_fetch_stats(tp); + /* This part only runs once per second. */ if (!--tp->timer_counter) { if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) { @@ -4495,8 +5319,6 @@ spin_lock_irq(&tp->lock); spin_lock(&tp->tx_lock); - tg3_init_rings(tp); - err = tg3_init_hw(tp); if (err) { tg3_halt(tp); @@ -4855,7 +5677,9 @@ get_stat64(&hw_stats->rx_bcast_packets); stats->tx_packets = old_stats->tx_packets + - get_stat64(&hw_stats->COS_out_packets[0]); + get_stat64(&hw_stats->tx_ucast_packets) + + get_stat64(&hw_stats->tx_mcast_packets) + + get_stat64(&hw_stats->tx_bcast_packets); stats->rx_bytes = old_stats->rx_bytes + get_stat64(&hw_stats->rx_octets); @@ -4998,453 +5822,346 @@ #define TG3_REGDUMP_LEN (32 * 1024) -static u8 *tg3_get_regs(struct tg3 *tp) +static int tg3_get_regs_len(struct net_device *dev) { - u8 *orig_p = kmalloc(TG3_REGDUMP_LEN, GFP_KERNEL); - u8 *p; - int i; - - if (orig_p == NULL) - return NULL; - - memset(orig_p, 0, TG3_REGDUMP_LEN); - - spin_lock_irq(&tp->lock); - spin_lock(&tp->tx_lock); - -#define __GET_REG32(reg) (*((u32 *)(p))++ = tr32(reg)) -#define GET_REG32_LOOP(base,len) \ -do { p = 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)); \ -} while (0) - - GET_REG32_LOOP(TG3PCI_VENDOR, 0xb0); - GET_REG32_LOOP(MAILBOX_INTERRUPT_0, 0x200); - GET_REG32_LOOP(MAC_MODE, 0x4f0); - GET_REG32_LOOP(SNDDATAI_MODE, 0xe0); - GET_REG32_1(SNDDATAC_MODE); - GET_REG32_LOOP(SNDBDS_MODE, 0x80); - GET_REG32_LOOP(SNDBDI_MODE, 0x48); - GET_REG32_1(SNDBDC_MODE); - GET_REG32_LOOP(RCVLPC_MODE, 0x20); - GET_REG32_LOOP(RCVLPC_SELLST_BASE, 0x15c); - GET_REG32_LOOP(RCVDBDI_MODE, 0x0c); - GET_REG32_LOOP(RCVDBDI_JUMBO_BD, 0x3c); - GET_REG32_LOOP(RCVDBDI_BD_PROD_IDX_0, 0x44); - GET_REG32_1(RCVDCC_MODE); - GET_REG32_LOOP(RCVBDI_MODE, 0x20); - GET_REG32_LOOP(RCVCC_MODE, 0x14); - GET_REG32_LOOP(RCVLSC_MODE, 0x08); - GET_REG32_1(MBFREE_MODE); - GET_REG32_LOOP(HOSTCC_MODE, 0x100); - GET_REG32_LOOP(MEMARB_MODE, 0x10); - GET_REG32_LOOP(BUFMGR_MODE, 0x58); - GET_REG32_LOOP(RDMAC_MODE, 0x08); - GET_REG32_LOOP(WDMAC_MODE, 0x08); - GET_REG32_LOOP(RX_CPU_BASE, 0x280); - GET_REG32_LOOP(TX_CPU_BASE, 0x280); - GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110); - GET_REG32_LOOP(FTQ_RESET, 0x120); - GET_REG32_LOOP(MSGINT_MODE, 0x0c); - GET_REG32_1(DMAC_MODE); - GET_REG32_LOOP(GRC_MODE, 0x4c); - GET_REG32_LOOP(NVRAM_CMD, 0x24); - -#undef __GET_REG32 -#undef GET_REG32_LOOP -#undef GET_REG32_1 - - spin_unlock(&tp->tx_lock); - spin_unlock_irq(&tp->lock); - - return orig_p; + return TG3_REGDUMP_LEN; } -static int tg3_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void tg3_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) { - struct tg3 *tp = dev->priv; - struct pci_dev *pci_dev = tp->pdev; - 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, DRV_MODULE_NAME); - strcpy (info.version, DRV_MODULE_VERSION); - memset(&info.fw_version, 0, sizeof(info.fw_version)); - strcpy (info.bus_info, pci_dev->slot_name); - info.eedump_len = 0; - info.regdump_len = TG3_REGDUMP_LEN; - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } - - case ETHTOOL_GSET: { - struct ethtool_cmd cmd = { ETHTOOL_GSET }; - - if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) || - tp->link_config.phy_is_low_power) - return -EAGAIN; - cmd.supported = (SUPPORTED_Autoneg); - - if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) - cmd.supported |= (SUPPORTED_1000baseT_Half | - SUPPORTED_1000baseT_Full); - - if (tp->phy_id != PHY_ID_SERDES) - cmd.supported |= (SUPPORTED_100baseT_Half | - SUPPORTED_100baseT_Full | - SUPPORTED_10baseT_Half | - SUPPORTED_10baseT_Full | - SUPPORTED_MII); - else - cmd.supported |= SUPPORTED_FIBRE; - - cmd.advertising = tp->link_config.advertising; - cmd.speed = tp->link_config.active_speed; - cmd.duplex = tp->link_config.active_duplex; - cmd.port = 0; - cmd.phy_address = PHY_ADDR; - cmd.transceiver = 0; - cmd.autoneg = tp->link_config.autoneg; - cmd.maxtxpkt = 0; - cmd.maxrxpkt = 0; - if (copy_to_user(useraddr, &cmd, sizeof(cmd))) - return -EFAULT; - return 0; - } - case ETHTOOL_SSET: { - struct ethtool_cmd cmd; - - if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) || - tp->link_config.phy_is_low_power) - return -EAGAIN; - - if (copy_from_user(&cmd, useraddr, sizeof(cmd))) - return -EFAULT; - - /* Fiber PHY only supports 1000 full/half */ - if (cmd.autoneg == AUTONEG_ENABLE) { - if (tp->phy_id == PHY_ID_SERDES && - (cmd.advertising & - (ADVERTISED_10baseT_Half | - ADVERTISED_10baseT_Full | - ADVERTISED_100baseT_Half | - ADVERTISED_100baseT_Full))) - return -EINVAL; - if ((tp->tg3_flags & TG3_FLAG_10_100_ONLY) && - (cmd.advertising & - (ADVERTISED_1000baseT_Half | - ADVERTISED_1000baseT_Full))) - return -EINVAL; - } else { - if (tp->phy_id == PHY_ID_SERDES && - (cmd.speed == SPEED_10 || - cmd.speed == SPEED_100)) - return -EINVAL; - if ((tp->tg3_flags & TG3_FLAG_10_100_ONLY) && - (cmd.speed == SPEED_10 || - cmd.speed == SPEED_100)) - return -EINVAL; - } - - spin_lock_irq(&tp->lock); - spin_lock(&tp->tx_lock); - - tp->link_config.autoneg = cmd.autoneg; - if (cmd.autoneg == AUTONEG_ENABLE) { - tp->link_config.advertising = cmd.advertising; - tp->link_config.speed = SPEED_INVALID; - tp->link_config.duplex = DUPLEX_INVALID; - } else { - tp->link_config.speed = cmd.speed; - tp->link_config.duplex = cmd.duplex; - } - - tg3_setup_phy(tp); - spin_unlock(&tp->tx_lock); - spin_unlock_irq(&tp->lock); - - return 0; - } - - case ETHTOOL_GREGS: { - struct ethtool_regs regs; - u8 *regbuf; - int ret; - - if (copy_from_user(®s, useraddr, sizeof(regs))) - return -EFAULT; - if (regs.len > TG3_REGDUMP_LEN) - regs.len = TG3_REGDUMP_LEN; - regs.version = 0; - if (copy_to_user(useraddr, ®s, sizeof(regs))) - return -EFAULT; - - regbuf = tg3_get_regs(tp); - if (!regbuf) - return -ENOMEM; - - useraddr += offsetof(struct ethtool_regs, data); - ret = 0; - if (copy_to_user(useraddr, regbuf, regs.len)) - ret = -EFAULT; - kfree(regbuf); - return ret; - } - case ETHTOOL_GWOL: { - struct ethtool_wolinfo wol = { ETHTOOL_GWOL }; - - wol.supported = WAKE_MAGIC; - wol.wolopts = 0; - if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) - wol.wolopts = WAKE_MAGIC; - memset(&wol.sopass, 0, sizeof(wol.sopass)); - if (copy_to_user(useraddr, &wol, sizeof(wol))) - return -EFAULT; - return 0; - } - case ETHTOOL_SWOL: { - struct ethtool_wolinfo wol; - - if (copy_from_user(&wol, useraddr, sizeof(wol))) - return -EFAULT; - if (wol.wolopts & ~WAKE_MAGIC) - return -EINVAL; - if ((wol.wolopts & WAKE_MAGIC) && - tp->phy_id == PHY_ID_SERDES && - !(tp->tg3_flags & TG3_FLAG_SERDES_WOL_CAP)) - return -EINVAL; - - spin_lock_irq(&tp->lock); - if (wol.wolopts & WAKE_MAGIC) - tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; - else - tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE; - spin_unlock_irq(&tp->lock); - - return 0; - } - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = { ETHTOOL_GMSGLVL }; - edata.data = tp->msg_enable; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - tp->msg_enable = edata.data; - return 0; - } - case ETHTOOL_NWAY_RST: { - u32 bmcr; - int r; - - spin_lock_irq(&tp->lock); - tg3_readphy(tp, MII_BMCR, &bmcr); - tg3_readphy(tp, MII_BMCR, &bmcr); - r = -EINVAL; - if (bmcr & BMCR_ANENABLE) { - tg3_writephy(tp, MII_BMCR, - bmcr | BMCR_ANRESTART); - r = 0; - } - spin_unlock_irq(&tp->lock); - - return r; - } - case ETHTOOL_GLINK: { - struct ethtool_value edata = { ETHTOOL_GLINK }; - edata.data = netif_carrier_ok(tp->dev) ? 1 : 0; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - case ETHTOOL_GRINGPARAM: { - struct ethtool_ringparam ering = { ETHTOOL_GRINGPARAM }; - - ering.rx_max_pending = TG3_RX_RING_SIZE - 1; - ering.rx_mini_max_pending = 0; - ering.rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1; - - ering.rx_pending = tp->rx_pending; - ering.rx_mini_pending = 0; - ering.rx_jumbo_pending = tp->rx_jumbo_pending; - ering.tx_pending = tp->tx_pending; - - if (copy_to_user(useraddr, &ering, sizeof(ering))) - return -EFAULT; - return 0; - } - case ETHTOOL_SRINGPARAM: { - struct ethtool_ringparam ering; - - if (copy_from_user(&ering, useraddr, sizeof(ering))) - return -EFAULT; - - if ((ering.rx_pending > TG3_RX_RING_SIZE - 1) || - (ering.rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) || - (ering.tx_pending > TG3_TX_RING_SIZE - 1)) - return -EINVAL; - - tg3_netif_stop(tp); - spin_lock_irq(&tp->lock); - spin_lock(&tp->tx_lock); - - tp->rx_pending = ering.rx_pending; - tp->rx_jumbo_pending = ering.rx_jumbo_pending; - tp->tx_pending = ering.tx_pending; - - tg3_halt(tp); - tg3_init_rings(tp); - tg3_init_hw(tp); - netif_wake_queue(tp->dev); - spin_unlock(&tp->tx_lock); - spin_unlock_irq(&tp->lock); - tg3_netif_start(tp); - - return 0; - } - case ETHTOOL_GPAUSEPARAM: { - struct ethtool_pauseparam epause = { ETHTOOL_GPAUSEPARAM }; - - epause.autoneg = - (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) != 0; - epause.rx_pause = - (tp->tg3_flags & TG3_FLAG_PAUSE_RX) != 0; - epause.tx_pause = - (tp->tg3_flags & TG3_FLAG_PAUSE_TX) != 0; - if (copy_to_user(useraddr, &epause, sizeof(epause))) - return -EFAULT; - return 0; - } - case ETHTOOL_SPAUSEPARAM: { - struct ethtool_pauseparam epause; - - if (copy_from_user(&epause, useraddr, sizeof(epause))) - return -EFAULT; - - tg3_netif_stop(tp); - spin_lock_irq(&tp->lock); - spin_lock(&tp->tx_lock); - if (epause.autoneg) - tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG; - else - tp->tg3_flags &= ~TG3_FLAG_PAUSE_AUTONEG; - if (epause.rx_pause) - tp->tg3_flags |= TG3_FLAG_PAUSE_RX; - else - tp->tg3_flags &= ~TG3_FLAG_PAUSE_RX; - if (epause.tx_pause) - tp->tg3_flags |= TG3_FLAG_PAUSE_TX; - else - tp->tg3_flags &= ~TG3_FLAG_PAUSE_TX; - tg3_halt(tp); - tg3_init_rings(tp); - tg3_init_hw(tp); - spin_unlock(&tp->tx_lock); - spin_unlock_irq(&tp->lock); - tg3_netif_start(tp); - - return 0; - } - case ETHTOOL_GRXCSUM: { - struct ethtool_value edata = { ETHTOOL_GRXCSUM }; - - edata.data = - (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - case ETHTOOL_SRXCSUM: { - struct ethtool_value edata; - - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; + struct tg3 *tp = dev->priv; + u8 *orig_p = p; + int i; - if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) { - if (edata.data != 0) - return -EINVAL; - return 0; - } + regs->version = 0; - spin_lock_irq(&tp->lock); - if (edata.data) - tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS; - else - tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS; - spin_unlock_irq(&tp->lock); + memset(p, 0, TG3_REGDUMP_LEN); - return 0; - } - case ETHTOOL_GTXCSUM: { - struct ethtool_value edata = { ETHTOOL_GTXCSUM }; + spin_lock_irq(&tp->lock); + spin_lock(&tp->tx_lock); - edata.data = - (tp->dev->features & NETIF_F_IP_CSUM) != 0; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - case ETHTOOL_STXCSUM: { - struct ethtool_value edata; +#define __GET_REG32(reg) (*((u32 *)(p))++ = tr32(reg)) +#define GET_REG32_LOOP(base,len) \ +do { p = 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)); \ +} while (0) - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; + GET_REG32_LOOP(TG3PCI_VENDOR, 0xb0); + GET_REG32_LOOP(MAILBOX_INTERRUPT_0, 0x200); + GET_REG32_LOOP(MAC_MODE, 0x4f0); + GET_REG32_LOOP(SNDDATAI_MODE, 0xe0); + GET_REG32_1(SNDDATAC_MODE); + GET_REG32_LOOP(SNDBDS_MODE, 0x80); + GET_REG32_LOOP(SNDBDI_MODE, 0x48); + GET_REG32_1(SNDBDC_MODE); + GET_REG32_LOOP(RCVLPC_MODE, 0x20); + GET_REG32_LOOP(RCVLPC_SELLST_BASE, 0x15c); + GET_REG32_LOOP(RCVDBDI_MODE, 0x0c); + GET_REG32_LOOP(RCVDBDI_JUMBO_BD, 0x3c); + GET_REG32_LOOP(RCVDBDI_BD_PROD_IDX_0, 0x44); + GET_REG32_1(RCVDCC_MODE); + GET_REG32_LOOP(RCVBDI_MODE, 0x20); + GET_REG32_LOOP(RCVCC_MODE, 0x14); + GET_REG32_LOOP(RCVLSC_MODE, 0x08); + GET_REG32_1(MBFREE_MODE); + GET_REG32_LOOP(HOSTCC_MODE, 0x100); + GET_REG32_LOOP(MEMARB_MODE, 0x10); + GET_REG32_LOOP(BUFMGR_MODE, 0x58); + GET_REG32_LOOP(RDMAC_MODE, 0x08); + GET_REG32_LOOP(WDMAC_MODE, 0x08); + GET_REG32_LOOP(RX_CPU_BASE, 0x280); + GET_REG32_LOOP(TX_CPU_BASE, 0x280); + GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110); + GET_REG32_LOOP(FTQ_RESET, 0x120); + GET_REG32_LOOP(MSGINT_MODE, 0x0c); + GET_REG32_1(DMAC_MODE); + GET_REG32_LOOP(GRC_MODE, 0x4c); + GET_REG32_LOOP(NVRAM_CMD, 0x24); - if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) { - if (edata.data != 0) - return -EINVAL; - return 0; - } +#undef __GET_REG32 +#undef GET_REG32_LOOP +#undef GET_REG32_1 - if (edata.data) - tp->dev->features |= NETIF_F_IP_CSUM; - else - tp->dev->features &= ~NETIF_F_IP_CSUM; + spin_unlock(&tp->tx_lock); + spin_unlock_irq(&tp->lock); +} - return 0; - } - case ETHTOOL_GSG: { - struct ethtool_value edata = { ETHTOOL_GSG }; +static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct tg3 *tp = dev->priv; + + if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) || + tp->link_config.phy_is_low_power) + return -EAGAIN; - edata.data = - (tp->dev->features & NETIF_F_SG) != 0; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - case ETHTOOL_SSG: { - struct ethtool_value edata; + cmd->supported = (SUPPORTED_Autoneg); - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; + if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) + cmd->supported |= (SUPPORTED_1000baseT_Half | + SUPPORTED_1000baseT_Full); + + if (tp->phy_id != PHY_ID_SERDES) + cmd->supported |= (SUPPORTED_100baseT_Half | + SUPPORTED_100baseT_Full | + SUPPORTED_10baseT_Half | + SUPPORTED_10baseT_Full | + SUPPORTED_MII); + else + cmd->supported |= SUPPORTED_FIBRE; + + cmd->advertising = tp->link_config.advertising; + cmd->speed = tp->link_config.active_speed; + cmd->duplex = tp->link_config.active_duplex; + cmd->port = 0; + cmd->phy_address = PHY_ADDR; + cmd->transceiver = 0; + cmd->autoneg = tp->link_config.autoneg; + cmd->maxtxpkt = 0; + cmd->maxrxpkt = 0; + return 0; +} + +static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct tg3 *tp = dev->priv; + + if (!(tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) || + tp->link_config.phy_is_low_power) + return -EAGAIN; - if (edata.data) - tp->dev->features |= NETIF_F_SG; - else - tp->dev->features &= ~NETIF_F_SG; + if (cmd->autoneg == AUTONEG_ENABLE) { + tp->link_config.advertising = cmd->advertising; + tp->link_config.speed = SPEED_INVALID; + tp->link_config.duplex = DUPLEX_INVALID; + } else { + tp->link_config.speed = cmd->speed; + tp->link_config.duplex = cmd->duplex; + } + + tg3_setup_phy(tp); + spin_unlock(&tp->tx_lock); + spin_unlock_irq(&tp->lock); + + return 0; +} + +static void tg3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) +{ + struct tg3 *tp = dev->priv; + + strcpy(info->driver, DRV_MODULE_NAME); + strcpy(info->version, DRV_MODULE_VERSION); + strcpy(info->bus_info, pci_name(tp->pdev)); +} + +static void tg3_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct tg3 *tp = dev->priv; + + wol->supported = WAKE_MAGIC; + wol->wolopts = 0; + if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) + wol->wolopts = WAKE_MAGIC; + memset(&wol->sopass, 0, sizeof(wol->sopass)); +} + +static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct tg3 *tp = dev->priv; + + if (wol->wolopts & ~WAKE_MAGIC) + return -EINVAL; + if ((wol->wolopts & WAKE_MAGIC) && + tp->phy_id == PHY_ID_SERDES && + !(tp->tg3_flags & TG3_FLAG_SERDES_WOL_CAP)) + return -EINVAL; + + spin_lock_irq(&tp->lock); + if (wol->wolopts & WAKE_MAGIC) + tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; + else + tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE; + spin_unlock_irq(&tp->lock); + + return 0; +} + +static u32 tg3_get_msglevel(struct net_device *dev) +{ + struct tg3 *tp = dev->priv; + return tp->msg_enable; +} + +static void tg3_set_msglevel(struct net_device *dev, u32 value) +{ + struct tg3 *tp = dev->priv; + tp->msg_enable = value; +} + +#if TG3_TSO_SUPPORT != 0 +static int tg3_set_tso(struct net_device *dev, u32 value) +{ + struct tg3 *tp = dev->priv; + if (!(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE)) { + if (value) + return -EINVAL; return 0; } - }; + return ethtool_op_set_tso(dev, value); +} +#endif + +static int tg3_nway_reset(struct net_device *dev) +{ + struct tg3 *tp = dev->priv; + u32 bmcr; + int r; + + spin_lock_irq(&tp->lock); + tg3_readphy(tp, MII_BMCR, &bmcr); + tg3_readphy(tp, MII_BMCR, &bmcr); + r = -EINVAL; + if (bmcr & BMCR_ANENABLE) { + tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART); + r = 0; + } + spin_unlock_irq(&tp->lock); + + return r; +} + +static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) +{ + struct tg3 *tp = dev->priv; + + ering->rx_max_pending = TG3_RX_RING_SIZE - 1; + ering->rx_mini_max_pending = 0; + ering->rx_jumbo_max_pending = TG3_RX_JUMBO_RING_SIZE - 1; + + ering->rx_pending = tp->rx_pending; + ering->rx_mini_pending = 0; + ering->rx_jumbo_pending = tp->rx_jumbo_pending; + ering->tx_pending = tp->tx_pending; +} + +static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) +{ + struct tg3 *tp = dev->priv; + + if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) || + (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) || + (ering->tx_pending > TG3_TX_RING_SIZE - 1)) + return -EINVAL; + + tg3_netif_stop(tp); + spin_lock_irq(&tp->lock); + spin_lock(&tp->tx_lock); + + tp->rx_pending = ering->rx_pending; - return -EOPNOTSUPP; + if ((tp->tg3_flags2 & TG3_FLG2_MAX_RXPEND_64) && + tp->rx_pending > 64) + tp->rx_pending = 64; + tp->rx_jumbo_pending = ering->rx_jumbo_pending; + tp->tx_pending = ering->tx_pending; + + tg3_halt(tp); + tg3_init_hw(tp); + netif_wake_queue(tp->dev); + spin_unlock(&tp->tx_lock); + spin_unlock_irq(&tp->lock); + tg3_netif_start(tp); + + return 0; +} + +static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) +{ + struct tg3 *tp = dev->priv; + + epause->autoneg = (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) != 0; + epause->rx_pause = (tp->tg3_flags & TG3_FLAG_PAUSE_RX) != 0; + epause->tx_pause = (tp->tg3_flags & TG3_FLAG_PAUSE_TX) != 0; +} + +static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) +{ + struct tg3 *tp = dev->priv; + + tg3_netif_stop(tp); + spin_lock_irq(&tp->lock); + spin_lock(&tp->tx_lock); + if (epause->autoneg) + tp->tg3_flags |= TG3_FLAG_PAUSE_AUTONEG; + else + tp->tg3_flags &= ~TG3_FLAG_PAUSE_AUTONEG; + if (epause->rx_pause) + tp->tg3_flags |= TG3_FLAG_PAUSE_RX; + else + tp->tg3_flags &= ~TG3_FLAG_PAUSE_RX; + if (epause->tx_pause) + tp->tg3_flags |= TG3_FLAG_PAUSE_TX; + else + tp->tg3_flags &= ~TG3_FLAG_PAUSE_TX; + tg3_halt(tp); + tg3_init_hw(tp); + spin_unlock(&tp->tx_lock); + spin_unlock_irq(&tp->lock); + tg3_netif_start(tp); + + return 0; +} + +static u32 tg3_get_rx_csum(struct net_device *dev) +{ + struct tg3 *tp = dev->priv; + return (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0; +} + +static int tg3_set_rx_csum(struct net_device *dev, u32 data) +{ + struct tg3 *tp = dev->priv; + + if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) { + if (data != 0) + return -EINVAL; + return 0; + } + + spin_lock_irq(&tp->lock); + if (data) + tp->tg3_flags |= TG3_FLAG_RX_CHECKSUMS; + else + tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS; + spin_unlock_irq(&tp->lock); + + return 0; } + +static int tg3_set_tx_csum(struct net_device *dev, u32 data) +{ + struct tg3 *tp = dev->priv; + + if (tp->tg3_flags & TG3_FLAG_BROKEN_CHECKSUMS) { + if (data != 0) + return -EINVAL; + return 0; + } + + if (data) + dev->features |= NETIF_F_IP_CSUM; + else + dev->features &= ~NETIF_F_IP_CSUM; + return 0; +} + static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data; @@ -5452,8 +6169,6 @@ int err; switch(cmd) { - case SIOCETHTOOL: - return tg3_ethtool_ioctl(dev, (void *) ifr->ifr_data); case SIOCGMIIPHY: data->phy_id = PHY_ADDR; @@ -5517,11 +6232,42 @@ } #endif +static struct ethtool_ops tg3_ethtool_ops = { + .get_settings = tg3_get_settings, + .set_settings = tg3_set_settings, + .get_drvinfo = tg3_get_drvinfo, + .get_regs_len = tg3_get_regs_len, + .get_regs = tg3_get_regs, + .get_wol = tg3_get_wol, + .set_wol = tg3_set_wol, + .get_msglevel = tg3_get_msglevel, + .set_msglevel = tg3_set_msglevel, + .nway_reset = tg3_nway_reset, + .get_link = ethtool_op_get_link, + .get_ringparam = tg3_get_ringparam, + .set_ringparam = tg3_set_ringparam, + .get_pauseparam = tg3_get_pauseparam, + .set_pauseparam = tg3_set_pauseparam, + .get_rx_csum = tg3_get_rx_csum, + .set_rx_csum = tg3_set_rx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = tg3_set_tx_csum, + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, +#if TG3_TSO_SUPPORT != 0 + .get_tso = ethtool_op_get_tso, + .set_tso = tg3_set_tso, +#endif +}; + /* Chips other than 5700/5701 use the NVRAM for fetching info. */ static void __devinit tg3_nvram_init(struct tg3 *tp) { int j; + if (tp->tg3_flags2 & TG3_FLG2_SUN_5704) + return; + tw32(GRC_EEPROM_ADDR, (EEPROM_ADDR_FSM_RESET | (EEPROM_DEFAULT_CLOCK_PERIOD << @@ -5594,6 +6340,11 @@ { int i, saw_done_clear; + if (tp->tg3_flags2 & TG3_FLG2_SUN_5704) { + printk(KERN_ERR PFX "Attempt to do nvram_read on Sun 5704\n"); + return -EINVAL; + } + if (!(tp->tg3_flags & TG3_FLAG_NVRAM)) return tg3_nvram_read_using_eeprom(tp, offset, val); @@ -5709,6 +6460,7 @@ u32 nic_cfg; tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg); + tp->nic_sram_data_cfg = nic_cfg; eeprom_signature_found = 1; @@ -5742,8 +6494,10 @@ eeprom_led_mode = led_mode_auto; break; }; - if ((tp->pci_chip_rev_id == CHIPREV_ID_5703_A1 || - tp->pci_chip_rev_id == CHIPREV_ID_5703_A2) && + + if (((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) || + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) || + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)) && (nic_cfg & NIC_SRAM_DATA_CFG_EEPROM_WP)) tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; @@ -5825,9 +6579,7 @@ } /* Enable Ethernet@WireSpeed */ - tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x7007); - tg3_readphy(tp, MII_TG3_AUX_CTRL, &val); - tg3_writephy(tp, MII_TG3_AUX_CTRL, (val | (1 << 15) | (1 << 4))); + tg3_phy_set_wirespeed(tp); if (!err && ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401)) { err = tg3_init_5401phy_dsp(tp); @@ -5862,6 +6614,14 @@ unsigned char vpd_data[256]; int i; + if (tp->tg3_flags2 & TG3_FLG2_SUN_5704) { + /* Sun decided not to put the necessary bits in the + * NVRAM of their onboard tg3 parts :( + */ + strcpy(tp->board_part_number, "Sun 5704"); + return; + } + for (i = 0; i < 256; i += 4) { u32 tmp; @@ -5918,6 +6678,34 @@ strcpy(tp->board_part_number, "none"); } +#ifdef CONFIG_SPARC64 +static int __devinit tg3_is_sun_5704(struct tg3 *tp) +{ + struct pci_dev *pdev = tp->pdev; + struct pcidev_cookie *pcp = pdev->sysdata; + + if (pcp != NULL) { + int node = pcp->prom_node; + u32 venid, devid; + int err; + + err = prom_getproperty(node, "subsystem-vendor-id", + (char *) &venid, sizeof(venid)); + if (err == 0 || err == -1) + return 0; + err = prom_getproperty(node, "subsystem-id", + (char *) &devid, sizeof(devid)); + if (err == 0 || err == -1) + return 0; + + if (venid == PCI_VENDOR_ID_SUN && + devid == PCI_DEVICE_ID_TIGON3_5704) + return 1; + } + return 0; +} +#endif + static int __devinit tg3_get_invariants(struct tg3 *tp) { u32 misc_ctrl_reg; @@ -5926,7 +6714,12 @@ u16 pci_cmd; int err; - /* If we have an AMD 762 or Intel ICH/ICH0 chipset, write +#ifdef CONFIG_SPARC64 + if (tg3_is_sun_5704(tp)) + tp->tg3_flags2 |= TG3_FLG2_SUN_5704; +#endif + + /* If we have an AMD 762 or Intel ICH/ICH0/ICH2 chipset, write * reordering to the mailbox registers done by the host * controller can cause major troubles. We read back from * every mailbox register write to force the writes to be @@ -5936,13 +6729,17 @@ PCI_DEVICE_ID_INTEL_82801AA_8, NULL) || pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_8, NULL) || + pci_find_device(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_82801BA_11, NULL) || + pci_find_device(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_82801BA_6, NULL) || pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C, NULL)) tp->tg3_flags |= TG3_FLAG_MBOX_WRITE_REORDER; /* Force memory write invalidate off. If we leave it on, * then on 5700_BX chips we have to enable a workaround. - * The workaround is to set the TG3PCI_DMA_RW_CTRL boundry + * The workaround is to set the TG3PCI_DMA_RW_CTRL boundary * to match the cacheline size. The Broadcom driver have this * workaround but turns MWI off all the times so never uses * it. This seems to suggest that the workaround is insufficient. @@ -6084,7 +6881,15 @@ tp->tg3_flags |= TG3_FLAG_WOL_SPEED_100MB; } + /* A few boards don't want Ethernet@WireSpeed phy feature */ + if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) || + ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) && + (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) && + (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1))) + tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED; + /* Only 5701 and later support tagged irq status mode. + * Also, 5788 chips cannot use tagged irq status. * * However, since we are using NAPI avoid tagged irq status * because the interrupt condition is more difficult to @@ -6141,7 +6946,8 @@ /* Determine if TX descriptors will reside in * main memory or in the chip SRAM. */ - if (tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) + if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) != 0 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) tp->tg3_flags |= TG3_FLAG_HOST_TXDS; grc_misc_cfg = tr32(GRC_MISC_CFG); @@ -6153,8 +6959,18 @@ tp->split_mode_max_reqs = SPLIT_MODE_5704_MAX_REQ; } - /* this one is limited to 10/100 only */ - if (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5702FE) + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && + (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 || + grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M)) + tp->tg3_flags2 |= TG3_FLG2_IS_5788; + + /* these are limited to 10/100 only */ + if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 && + (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) || + (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && + tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM && + (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901 || + tp->pdev->device == PCI_DEVICE_ID_TIGON3_5901_2))) tp->tg3_flags |= TG3_FLAG_10_100_ONLY; err = tg3_phy_probe(tp); @@ -6234,11 +7050,44 @@ return err; } +#ifdef CONFIG_SPARC64 +static int __devinit tg3_get_macaddr_sparc(struct tg3 *tp) +{ + struct net_device *dev = tp->dev; + struct pci_dev *pdev = tp->pdev; + struct pcidev_cookie *pcp = pdev->sysdata; + + if (pcp != NULL) { + int node = pcp->prom_node; + + if (prom_getproplen(node, "local-mac-address") == 6) { + prom_getproperty(node, "local-mac-address", + dev->dev_addr, 6); + return 0; + } + } + return -ENODEV; +} + +static int __devinit tg3_get_default_macaddr_sparc(struct tg3 *tp) +{ + struct net_device *dev = tp->dev; + + memcpy(dev->dev_addr, idprom->id_ethaddr, 6); + return 0; +} +#endif + static int __devinit tg3_get_device_address(struct tg3 *tp) { struct net_device *dev = tp->dev; u32 hi, lo, mac_offset; +#ifdef CONFIG_SPARC64 + if (!tg3_get_macaddr_sparc(tp)) + return 0; +#endif + if (PCI_FUNC(tp->pdev->devfn) == 0) mac_offset = 0x7c; else @@ -6257,7 +7106,8 @@ dev->dev_addr[5] = (lo >> 0) & 0xff; } /* Next, try NVRAM. */ - else if (!tg3_nvram_read(tp, mac_offset + 0, &hi) && + else if (!(tp->tg3_flags & TG3_FLG2_SUN_5704) && + !tg3_nvram_read(tp, mac_offset + 0, &hi) && !tg3_nvram_read(tp, mac_offset + 4, &lo)) { dev->dev_addr[0] = ((hi >> 16) & 0xff); dev->dev_addr[1] = ((hi >> 24) & 0xff); @@ -6279,9 +7129,13 @@ dev->dev_addr[0] = (hi >> 8) & 0xff; } - if (!is_valid_ether_addr(&dev->dev_addr[0])) + if (!is_valid_ether_addr(&dev->dev_addr[0])) { +#ifdef CONFIG_SPARC64 + if (!tg3_get_default_macaddr_sparc(tp)) + return 0; +#endif return -EINVAL; - + } return 0; } @@ -6376,8 +7230,6 @@ goto out_nofree; } - tw32(TG3PCI_CLOCK_CTRL, 0); - if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) == 0) { tp->dma_rwctrl = (0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) | @@ -6385,7 +7237,9 @@ (0x7 << DMA_RWCTRL_WRITE_WATER_SHIFT) | (0x7 << DMA_RWCTRL_READ_WATER_SHIFT) | (0x0f << DMA_RWCTRL_MIN_DMA_SHIFT); - /* XXX 5705 note: set MIN_DMA to zero here */ + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) + tp->dma_rwctrl &= ~(DMA_RWCTRL_MIN_DMA + << DMA_RWCTRL_MIN_DMA_SHIFT); } else { if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) tp->dma_rwctrl = @@ -6486,8 +7340,15 @@ tp->dma_rwctrl |= DMA_RWCTRL_USE_MEM_READ_MULT; } + tp->dma_rwctrl |= DMA_RWCTRL_ASSERT_ALL_BE; + tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); +#if 0 + /* Unneeded, already done by tg3_get_invariants. */ + tg3_switch_clocks(tp); +#endif + ret = 0; if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 && GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) @@ -6592,12 +7453,35 @@ case PHY_ID_BCM5701: return "5701"; case PHY_ID_BCM5703: return "5703"; case PHY_ID_BCM5704: return "5704"; + case PHY_ID_BCM5705: return "5705"; case PHY_ID_BCM8002: return "8002"; case PHY_ID_SERDES: return "serdes"; default: return "unknown"; }; } +static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp) +{ + struct pci_dev *peer = NULL; + unsigned int func; + + for (func = 0; func < 7; func++) { + unsigned int devfn = tp->pdev->devfn; + + devfn &= ~7; + devfn |= func; + + if (devfn == tp->pdev->devfn) + continue; + peer = pci_find_slot(tp->pdev->bus->number, devfn); + if (peer) + break; + } + if (!peer || peer == tp->pdev) + BUG(); + return peer; +} + static int __devinit tg3_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -6642,10 +7526,10 @@ } /* Configure DMA attributes. */ - if (!pci_set_dma_mask(pdev, (u64) 0xffffffffffffffffULL)) { + if (!pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) { pci_using_dac = 1; } else { - err = pci_set_dma_mask(pdev, (u64) 0xffffffff); + err = pci_set_dma_mask(pdev, 0xffffffffULL); if (err) { printk(KERN_ERR PFX "No usable DMA configuration, " "aborting.\n"); @@ -6673,9 +7557,6 @@ dev->vlan_rx_register = tg3_vlan_rx_register; dev->vlan_rx_kill_vid = tg3_vlan_rx_kill_vid; #endif -#if TG3_DO_TSO != 0 - dev->features |= NETIF_F_TSO; -#endif tp = dev->priv; tp->pdev = pdev; @@ -6740,6 +7621,7 @@ dev->do_ioctl = tg3_ioctl; dev->tx_timeout = tg3_tx_timeout; dev->poll = tg3_poll; + dev->ethtool_ops = &tg3_ethtool_ops; dev->weight = 64; dev->watchdog_timeo = TG3_TX_TIMEOUT; dev->change_mtu = tg3_change_mtu; @@ -6752,6 +7634,44 @@ goto err_out_iounmap; } + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { + tp->bufmgr_config.mbuf_read_dma_low_water = + DEFAULT_MB_RDMA_LOW_WATER_5705; + tp->bufmgr_config.mbuf_mac_rx_low_water = + DEFAULT_MB_MACRX_LOW_WATER_5705; + tp->bufmgr_config.mbuf_high_water = + DEFAULT_MB_HIGH_WATER_5705; + } + +#if TG3_TSO_SUPPORT != 0 + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || + GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 || + tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 || + (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0 || + (tp->tg3_flags2 & TG3_FLG2_IS_5788)) { + tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; + } else { + tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; + } + + /* TSO is off by default, user can enable using ethtool. */ +#if 0 + if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) + dev->features |= NETIF_F_TSO; +#endif + +#endif + + if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 && + !(tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) && + !(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) { + tp->tg3_flags2 |= TG3_FLG2_MAX_RXPEND_64; + tp->rx_pending = 64; + } + + if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) + tp->pdev_peer = tg3_find_5704_peer(tp); + err = tg3_get_device_address(tp); if (err) { printk(KERN_ERR PFX "Could not obtain valid ethernet address, " @@ -6774,6 +7694,9 @@ } else tp->tg3_flags &= ~TG3_FLAG_RX_CHECKSUMS; + if (tp->tg3_flags2 & TG3_FLG2_IS_5788) + dev->features &= ~NETIF_F_HIGHDMA; + err = register_netdev(dev); if (err) { printk(KERN_ERR PFX "Cannot register net device, " @@ -6866,7 +7789,6 @@ spin_lock_irq(&tp->lock); spin_lock(&tp->tx_lock); - tg3_init_rings(tp); tg3_init_hw(tp); spin_unlock(&tp->tx_lock); @@ -6897,7 +7819,6 @@ spin_lock_irq(&tp->lock); spin_lock(&tp->tx_lock); - tg3_init_rings(tp); tg3_init_hw(tp); tg3_enable_ints(tp); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/tg3.h linux-2.4.23-pre8/drivers/net/tg3.h --- linux-2.4.22/drivers/net/tg3.h 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/tg3.h 2003-10-22 22:49:05.000000000 +0000 @@ -24,6 +24,7 @@ #define RX_COPY_THRESHOLD 256 #define RX_STD_MAX_SIZE 1536 +#define RX_STD_MAX_SIZE_5705 512 #define RX_JUMBO_MAX_SIZE 0xdeadbeef /* XXX */ /* First 256 bytes are a mirror of PCI config space. */ @@ -59,7 +60,7 @@ #define PCIX_CAPS_SPLIT_SHIFT 20 #define PCIX_CAPS_BURST_MASK 0x000c0000 #define PCIX_CAPS_BURST_SHIFT 18 -#define PCIX_CAPS_MAX_BURST_5704 2 +#define PCIX_CAPS_MAX_BURST_CPIOB 2 #define TG3PCI_PM_CAP_PTR 0x00000041 #define TG3PCI_X_COMMAND 0x00000042 #define TG3PCI_X_STATUS 0x00000044 @@ -115,11 +116,14 @@ #define CHIPREV_ID_5704_A0 0x2000 #define CHIPREV_ID_5704_A1 0x2001 #define CHIPREV_ID_5704_A2 0x2002 +#define CHIPREV_ID_5705_A0 0x3000 +#define CHIPREV_ID_5705_A1 0x3001 #define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12) #define ASIC_REV_5700 0x07 #define ASIC_REV_5701 0x00 #define ASIC_REV_5703 0x01 #define ASIC_REV_5704 0x02 +#define ASIC_REV_5705 0x03 #define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8) #define CHIPREV_5700_AX 0x70 #define CHIPREV_5700_BX 0x71 @@ -180,6 +184,9 @@ #define CLOCK_CTRL_ALTCLK 0x00001000 #define CLOCK_CTRL_PWRDOWN_PLL133 0x00008000 #define CLOCK_CTRL_44MHZ_CORE 0x00040000 +#define CLOCK_CTRL_625_CORE 0x00100000 +#define CLOCK_CTRL_FORCE_CLKRUN 0x00200000 +#define CLOCK_CTRL_CLKRUN_OENABLE 0x00400000 #define CLOCK_CTRL_DELAY_PCI_GRANT 0x80000000 #define TG3PCI_REG_BASE_ADDR 0x00000078 #define TG3PCI_MEM_WIN_BASE_ADDR 0x0000007c @@ -457,17 +464,89 @@ #define MAC_RCV_RULE_CFG 0x00000500 #define RCV_RULE_CFG_DEFAULT_CLASS 0x00000008 #define MAC_LOW_WMARK_MAX_RX_FRAME 0x00000504 -/* 0x504 --> 0x590 unused */ +/* 0x508 --> 0x520 unused */ +#define MAC_HASHREGU_0 0x00000520 +#define MAC_HASHREGU_1 0x00000524 +#define MAC_HASHREGU_2 0x00000528 +#define MAC_HASHREGU_3 0x0000052c +#define MAC_EXTADDR_0_HIGH 0x00000530 +#define MAC_EXTADDR_0_LOW 0x00000534 +#define MAC_EXTADDR_1_HIGH 0x00000538 +#define MAC_EXTADDR_1_LOW 0x0000053c +#define MAC_EXTADDR_2_HIGH 0x00000540 +#define MAC_EXTADDR_2_LOW 0x00000544 +#define MAC_EXTADDR_3_HIGH 0x00000548 +#define MAC_EXTADDR_3_LOW 0x0000054c +#define MAC_EXTADDR_4_HIGH 0x00000550 +#define MAC_EXTADDR_4_LOW 0x00000554 +#define MAC_EXTADDR_5_HIGH 0x00000558 +#define MAC_EXTADDR_5_LOW 0x0000055c +#define MAC_EXTADDR_6_HIGH 0x00000560 +#define MAC_EXTADDR_6_LOW 0x00000564 +#define MAC_EXTADDR_7_HIGH 0x00000568 +#define MAC_EXTADDR_7_LOW 0x0000056c +#define MAC_EXTADDR_8_HIGH 0x00000570 +#define MAC_EXTADDR_8_LOW 0x00000574 +#define MAC_EXTADDR_9_HIGH 0x00000578 +#define MAC_EXTADDR_9_LOW 0x0000057c +#define MAC_EXTADDR_10_HIGH 0x00000580 +#define MAC_EXTADDR_10_LOW 0x00000584 +#define MAC_EXTADDR_11_HIGH 0x00000588 +#define MAC_EXTADDR_11_LOW 0x0000058c #define MAC_SERDES_CFG 0x00000590 #define MAC_SERDES_STAT 0x00000594 /* 0x598 --> 0x600 unused */ #define MAC_TX_MAC_STATE_BASE 0x00000600 /* 16 bytes */ #define MAC_RX_MAC_STATE_BASE 0x00000610 /* 20 bytes */ /* 0x624 --> 0x800 unused */ -#define MAC_RX_STATS_BASE 0x00000800 /* 26 32-bit words */ -/* 0x868 --> 0x880 unused */ -#define MAC_TX_STATS_BASE 0x00000880 /* 28 32-bit words */ -/* 0x8f0 --> 0xc00 unused */ +#define MAC_TX_STATS_OCTETS 0x00000800 +#define MAC_TX_STATS_RESV1 0x00000804 +#define MAC_TX_STATS_COLLISIONS 0x00000808 +#define MAC_TX_STATS_XON_SENT 0x0000080c +#define MAC_TX_STATS_XOFF_SENT 0x00000810 +#define MAC_TX_STATS_RESV2 0x00000814 +#define MAC_TX_STATS_MAC_ERRORS 0x00000818 +#define MAC_TX_STATS_SINGLE_COLLISIONS 0x0000081c +#define MAC_TX_STATS_MULT_COLLISIONS 0x00000820 +#define MAC_TX_STATS_DEFERRED 0x00000824 +#define MAC_TX_STATS_RESV3 0x00000828 +#define MAC_TX_STATS_EXCESSIVE_COL 0x0000082c +#define MAC_TX_STATS_LATE_COL 0x00000830 +#define MAC_TX_STATS_RESV4_1 0x00000834 +#define MAC_TX_STATS_RESV4_2 0x00000838 +#define MAC_TX_STATS_RESV4_3 0x0000083c +#define MAC_TX_STATS_RESV4_4 0x00000840 +#define MAC_TX_STATS_RESV4_5 0x00000844 +#define MAC_TX_STATS_RESV4_6 0x00000848 +#define MAC_TX_STATS_RESV4_7 0x0000084c +#define MAC_TX_STATS_RESV4_8 0x00000850 +#define MAC_TX_STATS_RESV4_9 0x00000854 +#define MAC_TX_STATS_RESV4_10 0x00000858 +#define MAC_TX_STATS_RESV4_11 0x0000085c +#define MAC_TX_STATS_RESV4_12 0x00000860 +#define MAC_TX_STATS_RESV4_13 0x00000864 +#define MAC_TX_STATS_RESV4_14 0x00000868 +#define MAC_TX_STATS_UCAST 0x0000086c +#define MAC_TX_STATS_MCAST 0x00000870 +#define MAC_TX_STATS_BCAST 0x00000874 +#define MAC_TX_STATS_RESV5_1 0x00000878 +#define MAC_TX_STATS_RESV5_2 0x0000087c +#define MAC_RX_STATS_OCTETS 0x00000880 +#define MAC_RX_STATS_RESV1 0x00000884 +#define MAC_RX_STATS_FRAGMENTS 0x00000888 +#define MAC_RX_STATS_UCAST 0x0000088c +#define MAC_RX_STATS_MCAST 0x00000890 +#define MAC_RX_STATS_BCAST 0x00000894 +#define MAC_RX_STATS_FCS_ERRORS 0x00000898 +#define MAC_RX_STATS_ALIGN_ERRORS 0x0000089c +#define MAC_RX_STATS_XON_PAUSE_RECVD 0x000008a0 +#define MAC_RX_STATS_XOFF_PAUSE_RECVD 0x000008a4 +#define MAC_RX_STATS_MAC_CTRL_RECVD 0x000008a8 +#define MAC_RX_STATS_XOFF_ENTERED 0x000008ac +#define MAC_RX_STATS_FRAME_TOO_LONG 0x000008b0 +#define MAC_RX_STATS_JABBERS 0x000008b4 +#define MAC_RX_STATS_UNDERSIZE 0x000008b8 +/* 0x8bc --> 0xc00 unused */ /* Send data initiator control registers */ #define SNDDATAI_MODE 0x00000c00 @@ -599,6 +678,7 @@ #define RCVLPC_STATSCTRL_ENABLE 0x00000001 #define RCVLPC_STATSCTRL_FASTUPD 0x00000002 #define RCVLPC_STATS_ENABLE 0x00002018 +#define RCVLPC_STATSENAB_LNGBRST_RFIX 0x00400000 #define RCVLPC_STATS_INCMASK 0x0000201c /* 0x2020 --> 0x2100 unused */ #define RCVLPC_SELLST_BASE 0x00002100 /* 16 16-byte entries */ @@ -812,13 +892,16 @@ #define BUFMGR_MB_POOL_ADDR 0x00004408 #define BUFMGR_MB_POOL_SIZE 0x0000440c #define BUFMGR_MB_RDMA_LOW_WATER 0x00004410 -#define DEFAULT_MB_RDMA_LOW_WATER 0x00000040 +#define DEFAULT_MB_RDMA_LOW_WATER 0x00000050 +#define DEFAULT_MB_RDMA_LOW_WATER_5705 0x00000000 #define DEFAULT_MB_RDMA_LOW_WATER_JUMBO 0x00000130 #define BUFMGR_MB_MACRX_LOW_WATER 0x00004414 #define DEFAULT_MB_MACRX_LOW_WATER 0x00000020 +#define DEFAULT_MB_MACRX_LOW_WATER_5705 0x00000010 #define DEFAULT_MB_MACRX_LOW_WATER_JUMBO 0x00000098 #define BUFMGR_MB_HIGH_WATER 0x00004418 #define DEFAULT_MB_HIGH_WATER 0x00000060 +#define DEFAULT_MB_HIGH_WATER_5705 0x00000060 #define DEFAULT_MB_HIGH_WATER_JUMBO 0x0000017c #define BUFMGR_RX_MB_ALLOC_REQ 0x0000441c #define BUFMGR_MB_ALLOC_BIT 0x10000000 @@ -854,6 +937,8 @@ #define RDMAC_MODE_LNGREAD_ENAB 0x00000200 #define RDMAC_MODE_SPLIT_ENABLE 0x00000800 #define RDMAC_MODE_SPLIT_RESET 0x00001000 +#define RDMAC_MODE_FIFO_SIZE_128 0x00020000 +#define RDMAC_MODE_FIFO_LONG_BURST 0x00030000 #define RDMAC_STATUS 0x00004804 #define RDMAC_STATUS_TGTABORT 0x00000004 #define RDMAC_STATUS_MSTABORT 0x00000008 @@ -877,6 +962,7 @@ #define WDMAC_MODE_FIFOURUN_ENAB 0x00000080 #define WDMAC_MODE_FIFOOREAD_ENAB 0x00000100 #define WDMAC_MODE_LNGREAD_ENAB 0x00000200 +#define WDMAC_MODE_RX_ACCEL 0x00000400 #define WDMAC_STATUS 0x00004c04 #define WDMAC_STATUS_TGTABORT 0x00000004 #define WDMAC_STATUS_MSTABORT 0x00000008 @@ -1140,7 +1226,10 @@ #define GRC_MISC_CFG_BOARD_ID_5704 0x00000000 #define GRC_MISC_CFG_BOARD_ID_5704CIOBE 0x00004000 #define GRC_MISC_CFG_BOARD_ID_5704_A2 0x00008000 +#define GRC_MISC_CFG_BOARD_ID_5788 0x00010000 +#define GRC_MISC_CFG_BOARD_ID_5788M 0x00018000 #define GRC_MISC_CFG_BOARD_ID_AC91002A1 0x00018000 +#define GRC_MISC_CFG_KEEP_GPHY_POWER 0x04000000 #define GRC_LOCAL_CTRL 0x00006808 #define GRC_LCLCTRL_INT_ACTIVE 0x00000001 #define GRC_LCLCTRL_CLEARINT 0x00000002 @@ -1275,6 +1364,7 @@ #define NIC_SRAM_DATA_CFG_WOL_ENABLE 0x00000040 #define NIC_SRAM_DATA_CFG_ASF_ENABLE 0x00000080 #define NIC_SRAM_DATA_CFG_EEPROM_WP 0x00000100 +#define NIC_SRAM_DATA_CFG_MINI_PCI 0x00001000 #define NIC_SRAM_DATA_CFG_FIBER_WOL 0x00004000 #define NIC_SRAM_DATA_PHY_ID 0x00000b74 @@ -1312,6 +1402,8 @@ #define NIC_SRAM_MBUF_POOL_BASE 0x00008000 #define NIC_SRAM_MBUF_POOL_SIZE96 0x00018000 #define NIC_SRAM_MBUF_POOL_SIZE64 0x00010000 +#define NIC_SRAM_MBUF_POOL_BASE5705 0x00010000 +#define NIC_SRAM_MBUF_POOL_SIZE5705 0x0000e000 /* Currently this is fixed. */ #define PHY_ADDR 0x01 @@ -1823,6 +1915,11 @@ #define TG3_FLAG_INIT_COMPLETE 0x80000000 u32 tg3_flags2; #define TG3_FLG2_RESTART_TIMER 0x00000001 +#define TG3_FLG2_SUN_5704 0x00000002 +#define TG3_FLG2_NO_ETH_WIRE_SPEED 0x00000004 +#define TG3_FLG2_IS_5788 0x00000008 +#define TG3_FLG2_MAX_RXPEND_64 0x00000010 +#define TG3_FLG2_TSO_CAPABLE 0x00000020 u32 split_mode_max_reqs; #define SPLIT_MODE_5704_MAX_REQ 3 @@ -1867,6 +1964,7 @@ #define PHY_ID_BCM5701 0x60008110 #define PHY_ID_BCM5703 0x60008160 #define PHY_ID_BCM5704 0x60008190 +#define PHY_ID_BCM5705 0x600081a0 #define PHY_ID_BCM8002 0x60010140 #define PHY_ID_SERDES 0xfeedbee0 #define PHY_ID_INVALID 0xffffffff @@ -1879,6 +1977,9 @@ enum phy_led_mode led_mode; char board_part_number[24]; + u32 nic_sram_data_cfg; + u32 pci_clock_ctrl; + struct pci_dev *pdev_peer; /* This macro assumes the passed PHY ID is already masked * with PHY_ID_MASK. @@ -1887,6 +1988,7 @@ ((X) == PHY_ID_BCM5400 || (X) == PHY_ID_BCM5401 || \ (X) == PHY_ID_BCM5411 || (X) == PHY_ID_BCM5701 || \ (X) == PHY_ID_BCM5703 || (X) == PHY_ID_BCM5704 || \ + (X) == PHY_ID_BCM5705 || \ (X) == PHY_ID_BCM8002 || (X) == PHY_ID_SERDES) struct tg3_hw_stats *hw_stats; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/tlan.c linux-2.4.23-pre8/drivers/net/tlan.c --- linux-2.4.22/drivers/net/tlan.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/tlan.c 2003-10-22 22:47:47.000000000 +0000 @@ -881,7 +881,9 @@ err ); } dev->addr_len = 6; - + + netif_carrier_off(dev); + /* Device methods */ dev->open = &TLan_Open; dev->hard_start_xmit = &TLan_StartTx; @@ -2205,6 +2207,8 @@ priv->tlanFullDuplex = FALSE; priv->phyOnline=0; + netif_carrier_off(dev); + /* 1. Assert reset bit. */ data = inl(dev->base_addr + TLAN_HOST_CMD); @@ -2368,6 +2372,7 @@ } outl( priv->rxListDMA, dev->base_addr + TLAN_CH_PARM ); outl( TLAN_HC_GO | TLAN_HC_RT, dev->base_addr + TLAN_HOST_CMD ); + netif_carrier_on(dev); } else { printk( "TLAN: %s: Link inactive, will retry in 10 secs...\n", dev->name ); TLan_SetTimer( dev, (10*HZ), TLAN_TIMER_FINISH_RESET ); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/tulip/tulip_core.c linux-2.4.23-pre8/drivers/net/tulip/tulip_core.c --- linux-2.4.22/drivers/net/tulip/tulip_core.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/tulip/tulip_core.c 2003-10-22 22:49:04.000000000 +0000 @@ -229,9 +229,11 @@ { 0x1186, 0x1561, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x1626, 0x8410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x1737, 0xAB09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, + { 0x1737, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x17B3, 0xAB08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, { 0x14f1, 0x1803, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CONEXANT }, { 0x10b9, 0x5261, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DM910X }, /* ALi 1563 integrated ethernet */ + { 0x10b7, 0x9300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, COMET }, /* 3Com 3CSOHO100B-TX */ { } /* terminate list */ }; MODULE_DEVICE_TABLE(pci, tulip_pci_tbl); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/via-rhine.c linux-2.4.23-pre8/drivers/net/via-rhine.c --- linux-2.4.22/drivers/net/via-rhine.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/via-rhine.c 2003-10-22 22:48:41.000000000 +0000 @@ -401,7 +401,7 @@ CanHaveMII | HasWOL }, }; -static struct pci_device_id via_rhine_pci_tbl[] __devinitdata = +static struct pci_device_id via_rhine_pci_tbl[] = { {0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VT86C100A}, {0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VT6102}, @@ -540,13 +540,14 @@ static void via_rhine_timer(unsigned long data); static void via_rhine_tx_timeout(struct net_device *dev); static int via_rhine_start_tx(struct sk_buff *skb, struct net_device *dev); -static void via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static void via_rhine_tx(struct net_device *dev); static void via_rhine_rx(struct net_device *dev); static void via_rhine_error(struct net_device *dev, int intr_status); static void via_rhine_set_rx_mode(struct net_device *dev); static struct net_device_stats *via_rhine_get_stats(struct net_device *dev); static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; static int via_rhine_close(struct net_device *dev); static inline u32 get_intr_status(struct net_device *dev) @@ -681,7 +682,7 @@ ioaddr = (long) ioremap (memaddr, io_size); if (!ioaddr) { printk (KERN_ERR "ioremap failed for device %s, region 0x%X @ 0x%lX\n", - pdev->slot_name, io_size, memaddr); + pci_name(pdev), io_size, memaddr); goto err_out_free_res; } @@ -779,6 +780,7 @@ dev->get_stats = via_rhine_get_stats; dev->set_multicast_list = via_rhine_set_rx_mode; dev->do_ioctl = netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; dev->tx_timeout = via_rhine_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; if (np->drv_flags & ReqTxAlign) @@ -1154,7 +1156,7 @@ /* Set the timer to check for link beat. */ init_timer(&np->timer); - np->timer.expires = jiffies + 2; + np->timer.expires = jiffies + 2 * HZ/100; np->timer.data = (unsigned long)dev; np->timer.function = &via_rhine_timer; /* timer handler */ add_timer(&np->timer); @@ -1340,16 +1342,19 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; long ioaddr; u32 intr_status; int boguscnt = max_interrupt_work; + int handled = 0; ioaddr = dev->base_addr; while ((intr_status = get_intr_status(dev))) { + handled = 1; + /* Acknowledge all of the current interrupt sources ASAP. */ if (intr_status & IntrTxDescRace) writeb(0x08, ioaddr + IntrStatus2); @@ -1395,6 +1400,7 @@ if (debug > 3) printk(KERN_DEBUG "%s: exiting interrupt, status=%8.8x.\n", dev->name, readw(ioaddr + IntrStatus)); + return IRQ_RETVAL(handled); } /* This routine is logically part of the interrupt handler, but isolated @@ -1736,90 +1742,87 @@ writeb(np->rx_thresh | rx_mode, ioaddr + RxConfig); } -static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info) { struct netdev_private *np = dev->priv; - u32 ethcmd; - if (get_user(ethcmd, (u32 *)useraddr)) - return -EFAULT; + strcpy (info->driver, DRV_NAME); + strcpy (info->version, DRV_VERSION); + strcpy (info->bus_info, pci_name(np->pdev)); +} - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; - strcpy (info.driver, DRV_NAME); - strcpy (info.version, DRV_VERSION); - strcpy (info.bus_info, np->pdev->slot_name); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } +static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct netdev_private *np = dev->priv; + int rc; - /* get settings */ - case ETHTOOL_GSET: { - struct ethtool_cmd ecmd = { ETHTOOL_GSET }; - if (!(np->drv_flags & CanHaveMII)) - break; - spin_lock_irq(&np->lock); - mii_ethtool_gset(&np->mii_if, &ecmd); - spin_unlock_irq(&np->lock); - if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) - return -EFAULT; - return 0; - } - /* set settings */ - case ETHTOOL_SSET: { - int r; - struct ethtool_cmd ecmd; - if (!(np->drv_flags & CanHaveMII)) - break; - if (copy_from_user(&ecmd, useraddr, sizeof(ecmd))) - return -EFAULT; - spin_lock_irq(&np->lock); - r = mii_ethtool_sset(&np->mii_if, &ecmd); - spin_unlock_irq(&np->lock); - return r; - } - /* restart autonegotiation */ - case ETHTOOL_NWAY_RST: { - if (!(np->drv_flags & CanHaveMII)) - break; - return mii_nway_restart(&np->mii_if); - } - /* get link status */ - case ETHTOOL_GLINK: { - struct ethtool_value edata = {ETHTOOL_GLINK}; - if (!(np->drv_flags & CanHaveMII)) - break; - edata.data = mii_link_ok(&np->mii_if); - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - debug = edata.data; - return 0; - } - default: - break; - } + if (!(np->drv_flags & CanHaveMII)) + return -EINVAL; + + spin_lock_irq(&np->lock); + rc = mii_ethtool_gset(&np->mii_if, cmd); + spin_unlock_irq(&np->lock); + + return rc; +} + +static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct netdev_private *np = dev->priv; + int rc; + + if (!(np->drv_flags & CanHaveMII)) + return -EINVAL; + + spin_lock_irq(&np->lock); + rc = mii_ethtool_sset(&np->mii_if, cmd); + spin_unlock_irq(&np->lock); + + return rc; +} + +static int netdev_nway_reset(struct net_device *dev) +{ + struct netdev_private *np = dev->priv; + + if (!(np->drv_flags & CanHaveMII)) + return -EINVAL; + + return mii_nway_restart(&np->mii_if); +} + +static u32 netdev_get_link(struct net_device *dev) +{ + struct netdev_private *np = dev->priv; - return -EOPNOTSUPP; + if (!(np->drv_flags & CanHaveMII)) + return 0; /* -EINVAL */ + + return mii_link_ok(&np->mii_if); +} + +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return debug; +} + +static void netdev_set_msglevel(struct net_device *dev, u32 value) +{ + debug = value; } +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_settings = netdev_get_settings, + .set_settings = netdev_set_settings, + .nway_reset = netdev_nway_reset, + .get_link = netdev_get_link, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, + .get_sg = ethtool_op_get_sg, + .get_tx_csum = ethtool_op_get_tx_csum, +}; + static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct netdev_private *np = dev->priv; @@ -1829,14 +1832,9 @@ if (!netif_running(dev)) return -EINVAL; - if (cmd == SIOCETHTOOL) - rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); - - else { - spin_lock_irq(&np->lock); - rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL); - spin_unlock_irq(&np->lock); - } + spin_lock_irq(&np->lock); + rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL); + spin_unlock_irq(&np->lock); return rc; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/Config.in linux-2.4.23-pre8/drivers/net/wan/Config.in --- linux-2.4.22/drivers/net/wan/Config.in 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/Config.in 2003-10-22 22:47:44.000000000 +0000 @@ -38,12 +38,12 @@ fi dep_tristate ' Support for Frame Relay on MultiGate boards' CONFIG_COMX_PROTO_FR $CONFIG_COMX fi -# -# The Etinc driver has not been tested as non-modular yet. -# - - dep_tristate ' Etinc PCISYNC serial board support (EXPERIMENTAL)' CONFIG_DSCC4 m + dep_tristate ' DSCC4 support' CONFIG_DSCC4 m + if [ "$CONFIG_DSCC4" = "m" ]; then + bool ' Etinc PCISYNC features' CONFIG_DSCC4_PCISYNC + bool ' GPIO and PCI #RST pins wired together' CONFIG_DSCC4_PCI_RST + fi # # Lan Media's board. Currently 1000, 1200, 5200, 5245 @@ -68,6 +68,7 @@ tristate ' Generic HDLC layer' CONFIG_HDLC if [ "$CONFIG_HDLC" != "n" ]; then bool ' Raw HDLC support' CONFIG_HDLC_RAW + bool ' Raw HDLC Ethernet device support' CONFIG_HDLC_RAW_ETH bool ' Cisco HDLC support' CONFIG_HDLC_CISCO bool ' Frame Relay support' CONFIG_HDLC_FR bool ' Synchronous Point-to-Point Protocol (PPP) support' CONFIG_HDLC_PPP diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/Makefile linux-2.4.23-pre8/drivers/net/wan/Makefile --- linux-2.4.22/drivers/net/wan/Makefile 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/Makefile 2003-10-22 22:49:02.000000000 +0000 @@ -24,6 +24,7 @@ hdlc-y := hdlc_generic.o hdlc-$(CONFIG_HDLC_RAW) += hdlc_raw.o +hdlc-$(CONFIG_HDLC_RAW_ETH) += hdlc_raw_eth.o hdlc-$(CONFIG_HDLC_CISCO) += hdlc_cisco.o hdlc-$(CONFIG_HDLC_FR) += hdlc_fr.o hdlc-$(CONFIG_HDLC_PPP) += hdlc_ppp.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/c101.c linux-2.4.23-pre8/drivers/net/wan/c101.c --- linux-2.4.22/drivers/net/wan/c101.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/c101.c 2003-10-22 22:48:00.000000000 +0000 @@ -1,12 +1,11 @@ /* * Moxa C101 synchronous serial card driver for Linux * - * Copyright (C) 2000-2002 Krzysztof Halasa + * Copyright (C) 2000-2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. * * For information see http://hq.pm.waw.pl/hdlc/ * @@ -31,7 +30,7 @@ #include "hd64570.h" -static const char* version = "Moxa C101 driver version: 1.10"; +static const char* version = "Moxa C101 driver version: 1.14"; static const char* devname = "C101"; #define C101_PAGE 0x1D00 @@ -41,6 +40,10 @@ #define C101_MAPPED_RAM_SIZE 0x4000 #define RAM_SIZE (256 * 1024) +#define TX_RING_BUFFERS 10 +#define RX_RING_BUFFERS ((RAM_SIZE - C101_WINDOW_SIZE) / \ + (sizeof(pkt_desc) + HDLC_MAX_MRU) - TX_RING_BUFFERS) + #define CLOCK_BASE 9830400 /* 9.8304 MHz */ #define PAGE0_ALWAYS_MAPPED @@ -52,20 +55,20 @@ spinlock_t lock; /* TX lock */ u8 *win0base; /* ISA window base address */ u32 phy_winbase; /* ISA physical base address */ - u16 buff_offset; /* offset of first buffer of first channel */ sync_serial_settings settings; + int rxpart; /* partial frame received, next frame invalid*/ unsigned short encoding; unsigned short parity; + u16 rx_ring_buffers; /* number of buffers in a ring */ + u16 tx_ring_buffers; + u16 buff_offset; /* offset of first buffer of first channel */ + u16 rxin; /* rx ring buffer 'in' pointer */ + u16 txin; /* tx ring buffer 'in' and 'last' pointers */ + u16 txlast; u8 rxs, txs, tmc; /* SCA registers */ u8 irq; /* IRQ (3-15) */ - u8 ring_buffers; /* number of buffers in a ring */ u8 page; - u8 rxin; /* rx ring buffer 'in' pointer */ - u8 txin; /* tx ring buffer 'in' and 'last' pointers */ - u8 txlast; - u8 rxpart; /* partial frame received, next frame invalid*/ - struct card_s *next_card; }card_t; @@ -78,7 +81,12 @@ #define sca_in(reg, card) readb((card)->win0base + C101_SCA + (reg)) #define sca_out(value, reg, card) writeb(value, (card)->win0base + C101_SCA + (reg)) #define sca_inw(reg, card) readw((card)->win0base + C101_SCA + (reg)) -#define sca_outw(value, reg, card) writew(value, (card)->win0base + C101_SCA + (reg)) + +/* EDA address register must be set in EDAL, EDAH order - 8 bit ISA bus */ +#define sca_outw(value, reg, card) do { \ + writeb(value & 0xFF, (card)->win0base + C101_SCA + (reg)); \ + writeb((value >> 8 ) & 0xFF, (card)->win0base + C101_SCA + (reg+1));\ +} while(0) #define port_to_card(port) (port) #define log_node(port) (0) @@ -229,6 +237,8 @@ static void c101_destroy_card(card_t *card) { + readb(card->win0base + C101_PAGE); /* Resets SCA? */ + if (card->irq) free_irq(card->irq, card); @@ -242,7 +252,7 @@ -static int c101_run(unsigned long irq, unsigned long winbase) +static int __init c101_run(unsigned long irq, unsigned long winbase) { struct net_device *dev; card_t *card; @@ -285,9 +295,10 @@ return -EBUSY; } - /* 2 rings required for 1 port */ - card->ring_buffers = (RAM_SIZE -C101_WINDOW_SIZE) / (2 * HDLC_MAX_MRU); - printk(KERN_DEBUG "c101: using %u packets rings\n",card->ring_buffers); + card->tx_ring_buffers = TX_RING_BUFFERS; + card->rx_ring_buffers = RX_RING_BUFFERS; + printk(KERN_DEBUG "c101: using %u TX + %u RX packets rings\n", + card->tx_ring_buffers, card->rx_ring_buffers); card->buff_offset = C101_WINDOW_SIZE; /* Bytes 1D00-1FFF reserved */ @@ -337,7 +348,7 @@ return -ENOSYS; /* no parameters specified, abort */ } - printk(KERN_INFO "%s (SCA-%s)\n", version, sca_version); + printk(KERN_INFO "%s\n", version); do { unsigned long irq, ram; @@ -352,7 +363,7 @@ c101_run(irq, ram); if (*hw == '\x0') - return 0; + return first_card ? 0 : -ENOSYS; }while(*hw++ == ':'); printk(KERN_ERR "c101: invalid hardware parameters\n"); @@ -389,6 +400,6 @@ MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("Moxa C101 serial port driver"); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL v2"); MODULE_PARM(hw, "s"); /* hw=irq,ram:irq,... */ EXPORT_NO_SYMBOLS; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/dscc4.c linux-2.4.23-pre8/drivers/net/wan/dscc4.c --- linux-2.4.22/drivers/net/wan/dscc4.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/dscc4.c 2003-10-22 22:48:14.000000000 +0000 @@ -47,7 +47,7 @@ * Tx direction * When the tx ring is full, the xmit routine issues a call to netdev_stop. * The device is supposed to be enabled again during an ALLS irq (we could - * use HI but as it's easy to loose events, it's fscked). + * use HI but as it's easy to lose events, it's fscked). * * Rx direction * The received frames aren't supposed to span over multiple receiving areas. @@ -80,7 +80,6 @@ * - misc crapectomy. */ -#include #include #include #include @@ -108,10 +107,15 @@ #include /* Version */ -static const char version[] = "$Id: dscc4.c,v 1.159 2002/04/10 22:05:17 romieu Exp $ for Linux\n"; +static const char version[] = "$Id: dscc4.c,v 1.173 2003/09/20 23:55:34 romieu Exp $ for Linux\n"; static int debug; static int quartz; +#ifdef CONFIG_DSCC4_PCI_RST +static DECLARE_MUTEX(dscc4_sem); +static u32 dscc4_pci_config_store[16]; +#endif + #define DRV_NAME "dscc4" #undef DSCC4_POLLING @@ -164,8 +168,15 @@ #define SOURCE_ID(flags) (((flags) >> 28) & 0x03) #define TO_SIZE(state) (((state) >> 16) & 0x1fff) -#define TO_STATE(len) cpu_to_le32(((len) & TxSizeMax) << 16) -#define RX_MAX(len) ((((len) >> 5) + 1) << 5) + +/* + * Given the operating range of Linux HDLC, the 2 defines below could be + * made simpler. However they are a fine reminder for the limitations of + * the driver: it's better to stay < TxSizeMax and < RxSizeMax. + */ +#define TO_STATE_TX(len) cpu_to_le32(((len) & TxSizeMax) << 16) +#define TO_STATE_RX(len) cpu_to_le32((RX_MAX(len) % RxSizeMax) << 16) +#define RX_MAX(len) ((((len) >> 5) + 1) << 5) /* Cf RLCR */ #define SCC_REG_START(dpriv) (SCC_START+(dpriv->dev_id)*SCC_OFFSET) struct dscc4_pci_priv { @@ -256,6 +267,10 @@ #define IMR 0x54 #define ISR 0x58 +#define GPDIR 0x0400 +#define GPDATA 0x0404 +#define GPIM 0x0408 + /* Bit masks */ #define EncodingMask 0x00700000 #define CrcMask 0x00000003 @@ -272,7 +287,8 @@ #define Idt 0x00080000 #define TxSccRes 0x01000000 #define RxSccRes 0x00010000 -#define TxSizeMax 0x1fff +#define TxSizeMax 0x1fff /* Datasheet DS1 - 11.1.1.1 */ +#define RxSizeMax 0x1ffc /* Datasheet DS1 - 11.1.2.1 */ #define Ccr0ClockMask 0x0000003f #define Ccr1LoopMask 0x00000200 @@ -283,6 +299,7 @@ #define Hold 0x40000000 #define SccBusy 0x10000000 #define PowerUp 0x80000000 +#define Vis 0x00001000 #define FrameOk (FrameVfr | FrameCrc) #define FrameVfr 0x80 #define FrameRdo 0x40 @@ -319,10 +336,19 @@ #define Arf 0x00000002 #define ArAck 0x00000001 -/* Misc */ +/* State flags */ +#define Ready 0x00000000 #define NeedIDR 0x00000001 #define NeedIDT 0x00000002 #define RdoSet 0x00000004 +#define FakeReset 0x00000008 + +/* Don't mask RDO. Ever. */ +#ifdef DSCC4_POLLING +#define EventsMask 0xfffeef7f +#else +#define EventsMask 0xfffa8f7a +#endif /* Functions prototypes */ static inline void dscc4_rx_irq(struct dscc4_pci_priv *, struct dscc4_dev_priv *); @@ -487,9 +513,9 @@ skb = dev_alloc_skb(len); dpriv->rx_skbuff[dirty] = skb; if (skb) { - skb->dev = dev; - skb->protocol = htons(ETH_P_HDLC); - skb->mac.raw = skb->data; + skb->dev = dev; + skb->protocol = hdlc_type_trans(skb, dev); + skb->mac.raw = skb->data; rx_fd->data = pci_map_single(dpriv->pci_priv->pdev, skb->data, len, PCI_DMA_FROMDEVICE); } else { @@ -566,15 +592,19 @@ return (i >= 0 ) ? i : -EAGAIN; } -/* Requires protection against interrupt */ +#if 0 /* dscc4_{rx/tx}_reset are both unreliable - more tweak needed */ static void dscc4_rx_reset(struct dscc4_dev_priv *dpriv, struct net_device *dev) { + unsigned long flags; + + spin_lock_irqsave(&dpriv->pci_priv->lock, flags); /* Cf errata DS5 p.6 */ writel(0x00000000, dev->base_addr + CH0LRDA + dpriv->dev_id*4); - scc_writel(~PowerUp & scc_readl(dpriv, CCR0), dpriv, dev, CCR0); + scc_patchl(PowerUp, 0, dpriv, dev, CCR0); readl(dev->base_addr + CH0LRDA + dpriv->dev_id*4); writel(MTFi|Rdr, dev->base_addr + dpriv->dev_id*0x0c + CH0CFG); writel(Action, dev->base_addr + GCMDR); + spin_unlock_irqrestore(&dpriv->pci_priv->lock, flags); } static void dscc4_tx_reset(struct dscc4_dev_priv *dpriv, struct net_device *dev) @@ -582,7 +612,7 @@ u16 i = 0; /* Cf errata DS5 p.7 */ - scc_writel(~PowerUp & scc_readl(dpriv, CCR0), dpriv, dev, CCR0); + scc_patchl(PowerUp, 0, dpriv, dev, CCR0); scc_writel(0x00050000, dpriv, dev, CCR2); /* * Must be longer than the time required to fill the fifo. @@ -596,6 +626,7 @@ if (dscc4_do_action(dev, "Rdt") < 0) printk(KERN_ERR "%s: Tx reset failed\n", dev->name); } +#endif /* TODO: (ab)use this function to refill a completely depleted RX ring. */ static inline void dscc4_rx_skb(struct dscc4_dev_priv *dpriv, @@ -619,6 +650,8 @@ stats->rx_packets++; stats->rx_bytes += pkt_len; skb_put(skb, pkt_len); + if (netif_running(dev)) + skb->protocol = hdlc_type_trans(skb, dev); skb->dev->last_rx = jiffies; netif_rx(skb); } else { @@ -661,8 +694,8 @@ kfree(ppriv); } -static int __init dscc4_init_one(struct pci_dev *pdev, - const struct pci_device_id *ent) +static int __devinit dscc4_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) { struct dscc4_pci_priv *priv; struct dscc4_dev_priv *dpriv; @@ -805,7 +838,8 @@ static void dscc4_init_registers(struct dscc4_dev_priv *dpriv, struct net_device *dev) { - scc_writel(0x80001000, dpriv, dev, CCR0); + /* No interrupts, SCC core disabled. Let's relax */ + scc_writel(0x00000000, dpriv, dev, CCR0); scc_writel(LengthCheck | (HDLC_MAX_MRU >> 5), dpriv, dev, RLCR); @@ -813,29 +847,21 @@ * No address recognition/crc-CCITT/cts enabled * Shared flags transmission disabled - cf errata DS5 p.11 * Carrier detect disabled - cf errata p.14 + * FIXME: carrier detection/polarity may be handled more gracefully. */ - scc_writel(0x021c8000, dpriv, dev, CCR1); + scc_writel(0x02408000, dpriv, dev, CCR1); /* crc not forwarded - Cf errata DS5 p.11 */ scc_writel(0x00050008 & ~RxActivate, dpriv, dev, CCR2); // crc forwarded //scc_writel(0x00250008 & ~RxActivate, dpriv, dev, CCR2); - - /* Don't mask RDO. Ever. */ -#ifdef DSCC4_POLLING - scc_writel(0xfffeef7f, dpriv, dev, IMR); /* Interrupt mask */ -#else - //scc_writel(0xfffaef7f, dpriv, dev, IMR); /* Interrupt mask */ - //scc_writel(0xfffaef7e, dpriv, dev, IMR); /* Interrupt mask */ - scc_writel(0xfffa8f7a, dpriv, dev, IMR); /* Interrupt mask */ -#endif } static int dscc4_found1(struct pci_dev *pdev, unsigned long ioaddr) { struct dscc4_pci_priv *ppriv; struct dscc4_dev_priv *root; - int i = 0; + int i, ret = -ENOMEM; root = (struct dscc4_dev_priv *) kmalloc(dev_per_card*sizeof(*root), GFP_KERNEL); @@ -867,6 +893,8 @@ d->tx_timeout = dscc4_tx_timeout; d->watchdog_timeo = TX_TIMEOUT; + SET_MODULE_OWNER(d); + dpriv->dev_id = i; dpriv->pci_priv = ppriv; spin_lock_init(&dpriv->lock); @@ -874,31 +902,40 @@ hdlc->xmit = dscc4_start_xmit; hdlc->attach = dscc4_hdlc_attach; - if (register_hdlc_device(hdlc)) { + ret = register_hdlc_device(hdlc); + if (ret < 0) { printk(KERN_ERR "%s: unable to register\n", DRV_NAME); goto err_unregister; } - hdlc->proto = IF_PROTO_HDLC; - SET_MODULE_OWNER(d); + dscc4_init_registers(dpriv, d); dpriv->parity = PARITY_CRC16_PR0_CCITT; dpriv->encoding = ENCODING_NRZ; + + ret = dscc4_init_ring(d); + if (ret < 0) { + unregister_hdlc_device(hdlc); + goto err_unregister; + } } - if (dscc4_set_quartz(root, quartz) < 0) + ret = dscc4_set_quartz(root, quartz); + if (ret < 0) goto err_unregister; ppriv->root = root; spin_lock_init(&ppriv->lock); pci_set_drvdata(pdev, ppriv); - return 0; + return ret; err_unregister: - while (--i >= 0) + while (--i >= 0) { + dscc4_release_ring(root + i); unregister_hdlc_device(&root[i].hdlc); + } kfree(ppriv); err_free_dev: kfree(root); err_out: - return -1; + return ret; }; /* FIXME: get rid of the unneeded code */ @@ -932,6 +969,46 @@ return 0; } +#ifdef CONFIG_DSCC4_PCI_RST +/* + * Some DSCC4-based cards wires the GPIO port and the PCI #RST pin together + * so as to provide a safe way to reset the asic while not the whole machine + * rebooting. + * + * This code doesn't need to be efficient. Keep It Simple + */ +static void dscc4_pci_reset(struct pci_dev *pdev, u32 ioaddr) +{ + int i; + + down(&dscc4_sem); + for (i = 0; i < 16; i++) + pci_read_config_dword(pdev, i << 2, dscc4_pci_config_store + i); + + /* Maximal LBI clock divider (who cares ?) and whole GPIO range. */ + writel(0x001c0000, ioaddr + GMODE); + /* Configure GPIO port as output */ + writel(0x0000ffff, ioaddr + GPDIR); + /* Disable interruption */ + writel(0x0000ffff, ioaddr + GPIM); + + writel(0x0000ffff, ioaddr + GPDATA); + writel(0x00000000, ioaddr + GPDATA); + + /* Flush posted writes */ + readl(ioaddr + GSTAR); + + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(10); + + for (i = 0; i < 16; i++) + pci_write_config_dword(pdev, i << 2, dscc4_pci_config_store[i]); + up(&dscc4_sem); +} +#else +#define dscc4_pci_reset(pdev,ioaddr) do {} while (0) +#endif /* CONFIG_DSCC4_PCI_RST */ + static int dscc4_open(struct net_device *dev) { struct dscc4_dev_priv *dpriv = dscc4_priv(dev); @@ -949,12 +1026,29 @@ ppriv = dpriv->pci_priv; - if ((ret = dscc4_init_ring(dev))) - goto err_out; + /* + * Due to various bugs, there is no way to reliably reset a + * specific port (manufacturer's dependant special PCI #RST wiring + * apart: it affects all ports). Thus the device goes in the best + * silent mode possible at dscc4_close() time and simply claims to + * be up if it's opened again. It still isn't possible to change + * the HDLC configuration without rebooting but at least the ports + * can be up/down ifconfig'ed without killing the host. + */ + if (dpriv->flags & FakeReset) { + dpriv->flags &= ~FakeReset; + scc_patchl(0, PowerUp, dpriv, dev, CCR0); + scc_patchl(0, 0x00050000, dpriv, dev, CCR2); + scc_writel(EventsMask, dpriv, dev, IMR); + printk(KERN_INFO "%s: up again.\n", dev->name); + goto done; + } /* IDT+IDR during XPR */ dpriv->flags = NeedIDR | NeedIDT; + scc_patchl(0, PowerUp | Vis, dpriv, dev, CCR0); + /* * The following is a bit paranoid... * @@ -965,15 +1059,17 @@ if (scc_readl_star(dpriv, dev) & SccBusy) { printk(KERN_ERR "%s busy. Try later\n", dev->name); ret = -EAGAIN; - goto err_free_ring; + goto err_out; } else printk(KERN_INFO "%s: available. Good\n", dev->name); + scc_writel(EventsMask, dpriv, dev, IMR); + /* Posted write is flushed in the wait_ack loop */ scc_writel(TxSccRes | RxSccRes, dpriv, dev, CMDR); if ((ret = dscc4_wait_ack_cec(dpriv, dev, "Cec")) < 0) - goto err_free_ring; + goto err_disable_scc_events; /* * I would expect XPR near CE completion (before ? after ?). @@ -984,12 +1080,13 @@ */ if ((ret = dscc4_xpr_ack(dpriv)) < 0) { printk(KERN_ERR "%s: %s timeout\n", DRV_NAME, "XPR"); - goto err_free_ring; + goto err_disable_scc_events; } if (debug > 2) dscc4_tx_print(dev, dpriv, "Open"); +done: netif_start_queue(dev); init_timer(&dpriv->timer); @@ -1001,8 +1098,9 @@ return 0; -err_free_ring: - dscc4_release_ring(dpriv); +err_disable_scc_events: + scc_writel(0xffffffff, dpriv, dev, IMR); + scc_patchl(PowerUp | Vis, 0, dpriv, dev, CCR0); err_out: hdlc_close(hdlc); MOD_DEC_USE_COUNT; @@ -1027,7 +1125,7 @@ next = dpriv->tx_current%TX_RING_SIZE; dpriv->tx_skbuff[next] = skb; tx_fd = dpriv->tx_fd + next; - tx_fd->state = FrameEnd | TO_STATE(skb->len); + tx_fd->state = FrameEnd | TO_STATE_TX(skb->len); tx_fd->data = pci_map_single(ppriv->pdev, skb->data, skb->len, PCI_DMA_TODEVICE); tx_fd->complete = 0x00000000; @@ -1058,19 +1156,17 @@ { struct dscc4_dev_priv *dpriv = dscc4_priv(dev); hdlc_device *hdlc = dev_to_hdlc(dev); - unsigned long flags; del_timer_sync(&dpriv->timer); netif_stop_queue(dev); - spin_lock_irqsave(&dpriv->pci_priv->lock, flags); - dscc4_rx_reset(dpriv, dev); - spin_unlock_irqrestore(&dpriv->pci_priv->lock, flags); + scc_patchl(PowerUp | Vis, 0, dpriv, dev, CCR0); + scc_patchl(0x00050000, 0, dpriv, dev, CCR2); + scc_writel(0xffffffff, dpriv, dev, IMR); - dscc4_tx_reset(dpriv, dev); + dpriv->flags |= FakeReset; hdlc_close(hdlc); - dscc4_release_ring(dpriv); MOD_DEC_USE_COUNT; return 0; @@ -1080,13 +1176,56 @@ { int ret = 0; -#ifdef CONFIG_DSCC4_CLOCK_ON_TWO_PORTS_ONLY +#ifdef CONFIG_DSCC4_PCISYNC if (port >= 2) ret = -1; #endif return ret; } +/* + * DS1 p.137: "There are a total of 13 different clocking modes..." + * ^^ + * Design choices: + * - by default, assume a clock is provided on pin RxClk/TxClk (clock mode 0a). + * Clock mode 3b _should_ work but the testing seems to make this point + * dubious (DIY testing requires setting CCR0 at 0x00000033). + * This is supposed to provide least surprise "DTE like" behavior. + * - if line rate is specified, clocks are assumed to be locally generated. + * A quartz must be available (on pin XTAL1). Modes 6b/7b are used. Choosing + * between these it automagically done according on the required frequency + * scaling. Of course some rounding may take place. + * - no high speed mode (40Mb/s). May be trivial to do but I don't have an + * appropriate external clocking device for testing. + * - no time-slot/clock mode 5: shameless lazyness. + * + * The clock signals wiring can be (is ?) manufacturer dependant. Good luck. + * + * BIG FAT WARNING: if the device isn't provided enough clocking signal, it + * won't pass the init sequence. For example, straight back-to-back DTE without + * external clock will fail when dscc4_open() (<- 'ifconfig hdlcx xxx') is + * called. + * + * Typos lurk in datasheet (missing divier in clock mode 7a figure 51 p.153 + * DS0 for example) + * + * Clock mode related bits of CCR0: + * +------------ TOE: output TxClk (0b/2b/3a/3b/6b/7a/7b only) + * | +---------- SSEL: sub-mode select 0 -> a, 1 -> b + * | | +-------- High Speed: say 0 + * | | | +-+-+-- Clock Mode: 0..7 + * | | | | | | + * -+-+-+-+-+-+-+-+ + * x|x|5|4|3|2|1|0| lower bits + * + * Division factor of BRR: k = (N+1)x2^M (total divider = 16xk in mode 6b) + * +-+-+-+------------------ M (0..15) + * | | | | +-+-+-+-+-+-- N (0..63) + * 0 0 0 0 | | | | 0 0 | | | | | | + * ...-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * f|e|d|c|b|a|9|8|7|6|5|4|3|2|1|0| lower bits + * + */ static int dscc4_set_clock(struct net_device *dev, u32 *bps, u32 *state) { struct dscc4_dev_priv *dpriv = dscc4_priv(dev); @@ -1123,13 +1262,13 @@ } brr = (m << 8) | n; divider = n << m; - if (!(*state & 0x00000001)) /* Clock mode 6b */ + if (!(*state & 0x00000001)) /* ?b mode mask => clock mode 6b */ divider <<= 4; *bps = xtal / divider; } else { /* * External clock - DTE - * "state" already reflects Clock mode 0a. + * "state" already reflects Clock mode 0a (CCR0 = 0xzzzzzz00). * Nothing more to be done */ brr = 0; @@ -1168,6 +1307,11 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; + if (dpriv->flags & FakeReset) { + printk(KERN_INFO "%s: please reset the device" + " before this command\n", dev->name); + return -EPERM; + } if (copy_from_user(&dpriv->settings, line, size)) return -EFAULT; ret = dscc4_set_iface(dpriv, dev); @@ -1221,12 +1365,12 @@ if (bps) { /* DCE */ printk(KERN_DEBUG "%s: generated RxClk (DCE)\n", dev->name); if (settings->clock_rate != bps) { - settings->clock_rate = bps; printk(KERN_DEBUG "%s: clock adjusted (%08d -> %08d)\n", - dev->name, dpriv->settings.clock_rate, bps); + dev->name, settings->clock_rate, bps); + settings->clock_rate = bps; } } else { /* DTE */ - state = 0x80001000; + state |= PowerUp | Vis; printk(KERN_DEBUG "%s: external RxClk (DTE)\n", dev->name); } scc_writel(state, dpriv, dev, CCR0); @@ -1332,6 +1476,8 @@ state = readl(ioaddr + GSTAR); if (!state) goto out; + if (debug > 3) + printk(KERN_DEBUG "%s: GSTAR = 0x%08x\n", DRV_NAME, state); writel(state, ioaddr + GSTAR); if (state & Arf) { @@ -1377,6 +1523,9 @@ cur = dpriv->iqtx_current%IRQ_RING_SIZE; state = dpriv->iqtx[cur]; if (!state) { + if (debug > 4) + printk(KERN_DEBUG "%s: Tx ISR = 0x%08x\n", dev->name, + state); if ((debug > 1) && (loop > 1)) printk(KERN_DEBUG "%s: Tx irq loop=%d\n", dev->name, loop); if (loop && netif_queue_stopped(dev)) @@ -1431,7 +1580,7 @@ * random freeze induced by null sized tx frames. */ tx_fd->data = tx_fd->next; - tx_fd->state = FrameEnd | TO_STATE(2*DUMMY_SKB_SIZE); + tx_fd->state = FrameEnd | TO_STATE_TX(2*DUMMY_SKB_SIZE); tx_fd->complete = 0x00000000; tx_fd->jiffies = 0; @@ -1463,9 +1612,19 @@ } if (state & Xpr) { u32 scc_addr, ring; + int i; + + /* + * - the busy condition happens (sometimes); + * - it doesn't seem to make the handler unreliable. + */ + for (i = 1; i; i <<= 1) { + if (!(scc_readl_star(dpriv, dev) & SccBusy)) + break; + } + if (!i) + printk(KERN_INFO "%s busy in irq\n", dev->name); - if (scc_readl_star(dpriv, dev) & SccBusy) - printk(KERN_ERR "%s busy. Fatal\n", dev->name); scc_addr = dev->base_addr + 0x0c*dpriv->dev_id; /* Keep this order: IDT before IDR */ if (dpriv->flags & NeedIDT) { @@ -1500,7 +1659,8 @@ goto try; } if (state & Cd) { - printk(KERN_INFO "%s: CD transition\n", dev->name); + if (debug > 0) + printk(KERN_INFO "%s: CD transition\n", dev->name); if (!(state &= ~Cd)) /* DEBUG */ goto try; } @@ -1542,6 +1702,9 @@ if (!(state & SccEvt)){ struct RxFD *rx_fd; + if (debug > 4) + printk(KERN_DEBUG "%s: Rx ISR = 0x%08x\n", dev->name, + state); state &= 0x00ffffff; if (state & Err) { /* Hold or reset */ printk(KERN_DEBUG "%s: Rx ERR\n", dev->name); @@ -1718,7 +1881,7 @@ skb->len = DUMMY_SKB_SIZE; memcpy(skb->data, version, strlen(version)%DUMMY_SKB_SIZE); - tx_fd->state = FrameEnd | TO_STATE(DUMMY_SKB_SIZE); + tx_fd->state = FrameEnd | TO_STATE_TX(DUMMY_SKB_SIZE); tx_fd->data = pci_map_single(dpriv->pci_priv->pdev, skb->data, DUMMY_SKB_SIZE, PCI_DMA_TODEVICE); dpriv->tx_skbuff[last] = skb; @@ -1749,7 +1912,7 @@ dpriv->tx_dirty = 0xffffffff; i = dpriv->tx_current = 0; do { - tx_fd->state = FrameEnd | TO_STATE(2*DUMMY_SKB_SIZE); + tx_fd->state = FrameEnd | TO_STATE_TX(2*DUMMY_SKB_SIZE); tx_fd->complete = 0x00000000; /* FIXME: NULL should be ok - to be tried */ tx_fd->data = dpriv->tx_fd_dma; @@ -1757,7 +1920,7 @@ (++i%TX_RING_SIZE)*sizeof(*tx_fd)); } while (i < TX_RING_SIZE); - if (dscc4_init_dummy_skb(dpriv) < 0) + if (dscc4_init_dummy_skb(dpriv) == NULL) goto err_free_dma_tx; memset(dpriv->rx_skbuff, 0, sizeof(struct sk_buff *)*RX_RING_SIZE); @@ -1767,7 +1930,7 @@ rx_fd->state1 = HiDesc; rx_fd->state2 = 0x00000000; rx_fd->end = 0xbabeface; - rx_fd->state1 |= TO_STATE(RX_MAX(HDLC_MAX_MRU)); + rx_fd->state1 |= TO_STATE_RX(HDLC_MAX_MRU); // FIXME: return value verifiee mais traitement suspect if (try_get_rx_skb(dpriv, dev) >= 0) dpriv->rx_dirty++; @@ -1785,7 +1948,7 @@ return -ENOMEM; } -static void __exit dscc4_remove_one(struct pci_dev *pdev) +static void __devexit dscc4_remove_one(struct pci_dev *pdev) { struct dscc4_pci_priv *ppriv; struct dscc4_dev_priv *root; @@ -1796,12 +1959,16 @@ root = ppriv->root; ioaddr = hdlc_to_dev(&root->hdlc)->base_addr; + + dscc4_pci_reset(pdev, ioaddr); + free_irq(pdev->irq, root); pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), ppriv->iqcfg, ppriv->iqcfg_dma); for (i = 0; i < dev_per_card; i++) { struct dscc4_dev_priv *dpriv = root + i; + dscc4_release_ring(dpriv); pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), dpriv->iqrx, dpriv->iqrx_dma); pci_free_consistent(pdev, IRQ_RING_SIZE*sizeof(u32), @@ -1843,6 +2010,7 @@ return 0; } +#ifndef MODULE static int __init dscc4_setup(char *str) { int *args[] = { &debug, &quartz, NULL }, **p = args; @@ -1853,8 +2021,9 @@ } __setup("dscc4.setup=", dscc4_setup); +#endif /* MODULE */ -static struct pci_device_id dscc4_pci_tbl[] __devinitdata = { +static struct pci_device_id dscc4_pci_tbl[] = { { PCI_VENDOR_ID_SIEMENS, PCI_DEVICE_ID_SIEMENS_DSCC4, PCI_ANY_ID, PCI_ANY_ID, }, { 0,} @@ -1865,7 +2034,7 @@ .name = DRV_NAME, .id_table = dscc4_pci_tbl, .probe = dscc4_init_one, - .remove = dscc4_remove_one, + .remove = __devexit_p(dscc4_remove_one), }; static int __init dscc4_init_module(void) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/farsync.c linux-2.4.23-pre8/drivers/net/wan/farsync.c --- linux-2.4.22/drivers/net/wan/farsync.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/farsync.c 2003-10-22 22:49:11.000000000 +0000 @@ -764,7 +764,7 @@ /* Push upstream */ skb->mac.raw = skb->data; skb->dev = hdlc_to_dev ( &port->hdlc ); - skb->protocol = htons ( ETH_P_HDLC ); + skb->protocol = hdlc_type_trans(skb, skb->dev); netif_rx ( skb ); port_to_dev ( port )->last_rx = jiffies; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/hd6457x.c linux-2.4.23-pre8/drivers/net/wan/hd6457x.c --- linux-2.4.22/drivers/net/wan/hd6457x.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/hd6457x.c 2003-10-22 22:48:00.000000000 +0000 @@ -1,16 +1,29 @@ /* * Hitachi SCA HD64570 and HD64572 common driver for Linux * - * Copyright (C) 1998-2000 Krzysztof Halasa + * Copyright (C) 1998-2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. * * Sources of information: * Hitachi HD64570 SCA User's Manual * Hitachi HD64572 SCA-II User's Manual + * + * We use the following SCA memory map: + * + * Packet buffer descriptor rings - starting from winbase or win0base: + * rx_ring_buffers * sizeof(pkt_desc) = logical channel #0 RX ring + * tx_ring_buffers * sizeof(pkt_desc) = logical channel #0 TX ring + * rx_ring_buffers * sizeof(pkt_desc) = logical channel #1 RX ring (if used) + * tx_ring_buffers * sizeof(pkt_desc) = logical channel #1 TX ring (if used) + * + * Packet data buffers - starting from winbase + buff_offset: + * rx_ring_buffers * HDLC_MAX_MRU = logical channel #0 RX buffers + * tx_ring_buffers * HDLC_MAX_MRU = logical channel #0 TX buffers + * rx_ring_buffers * HDLC_MAX_MRU = logical channel #0 RX buffers (if used) + * tx_ring_buffers * HDLC_MAX_MRU = logical channel #0 TX buffers (if used) */ #include @@ -42,8 +55,6 @@ #error Either hd64570.h or hd64572.h must be included #endif -static char sca_version[]="1.09"; - #define get_msci(port) (phy_node(port) ? MSCI1_OFFSET : MSCI0_OFFSET) #define get_dmac_rx(port) (phy_node(port) ? DMAC1RX_OFFSET : DMAC0RX_OFFSET) #define get_dmac_tx(port) (phy_node(port) ? DMAC1TX_OFFSET : DMAC0TX_OFFSET) @@ -116,24 +127,35 @@ -static inline u8 next_desc(port_t *port, u8 desc) +static inline u16 next_desc(port_t *port, u16 desc, int transmit) +{ + return (desc + 1) % (transmit ? port_to_card(port)->tx_ring_buffers + : port_to_card(port)->rx_ring_buffers); +} + + + +static inline u16 desc_abs_number(port_t *port, u16 desc, int transmit) { - return (desc + 1) % port_to_card(port)->ring_buffers; + u16 rx_buffs = port_to_card(port)->rx_ring_buffers; + u16 tx_buffs = port_to_card(port)->tx_ring_buffers; + + desc %= (transmit ? tx_buffs : rx_buffs); // called with "X + 1" etc. + return log_node(port) * (rx_buffs + tx_buffs) + + transmit * rx_buffs + desc; } -static inline u16 desc_offset(port_t *port, u8 desc, u8 transmit) +static inline u16 desc_offset(port_t *port, u16 desc, int transmit) { /* Descriptor offset always fits in 16 bytes */ - u8 buffs = port_to_card(port)->ring_buffers; - return ((log_node(port) * 2 + transmit) * buffs + (desc % buffs)) * - sizeof(pkt_desc); + return desc_abs_number(port, desc, transmit) * sizeof(pkt_desc); } -static inline pkt_desc* desc_address(port_t *port, u8 desc, u8 transmit) +static inline pkt_desc* desc_address(port_t *port, u16 desc, int transmit) { #ifdef PAGE0_ALWAYS_MAPPED return (pkt_desc*)(win0base(port_to_card(port)) @@ -146,12 +168,10 @@ -static inline u32 buffer_offset(port_t *port, u8 desc, u8 transmit) +static inline u32 buffer_offset(port_t *port, u16 desc, int transmit) { - u8 buffs = port_to_card(port)->ring_buffers; return port_to_card(port)->buff_offset + - ((log_node(port) * 2 + transmit) * buffs + (desc % buffs)) * - (u32)HDLC_MAX_MRU; + desc_abs_number(port, desc, transmit) * (u32)HDLC_MAX_MRU; } @@ -159,8 +179,7 @@ static void sca_init_sync_port(port_t *port) { card_t *card = port_to_card(port); - u8 transmit, i; - u16 dmac, buffs = card->ring_buffers; + int transmit, i; port->rxin = 0; port->txin = 0; @@ -171,6 +190,10 @@ #endif for (transmit = 0; transmit < 2; transmit++) { + u16 dmac = transmit ? get_dmac_tx(port) : get_dmac_rx(port); + u16 buffs = transmit ? card->tx_ring_buffers + : card->rx_ring_buffers; + for (i = 0; i < buffs; i++) { pkt_desc* desc = desc_address(port, i, transmit); u16 chain_off = desc_offset(port, i + 1, transmit); @@ -182,7 +205,6 @@ writeb(0, &desc->stat); } - dmac = transmit ? get_dmac_tx(port) : get_dmac_rx(port); /* DMA disable - to halt state */ sca_out(0, transmit ? DSR_TX(phy_node(port)) : DSR_RX(phy_node(port)), card); @@ -247,7 +269,7 @@ -static inline void sca_rx(card_t *card, port_t *port, pkt_desc *desc, u8 rxin) +static inline void sca_rx(card_t *card, port_t *port, pkt_desc *desc, u16 rxin) { struct sk_buff *skb; u16 len; @@ -294,7 +316,7 @@ skb->mac.raw = skb->data; skb->dev = hdlc_to_dev(&port->hdlc); skb->dev->last_rx = jiffies; - skb->protocol = htons(ETH_P_HDLC); + skb->protocol = hdlc_type_trans(skb, hdlc_to_dev(&port->hdlc)); netif_rx(skb); } @@ -341,7 +363,7 @@ /* Set new error descriptor address */ sca_outa(desc_off, dmac + EDAL, card); - port->rxin = next_desc(port, port->rxin); + port->rxin = next_desc(port, port->rxin, 0); } /* make sure RX DMA is enabled */ @@ -377,8 +399,7 @@ port->hdlc.stats.tx_packets++; port->hdlc.stats.tx_bytes += readw(&desc->len); writeb(0, &desc->stat); /* Free descriptor */ - port->txlast = (port->txlast + 1) % - port_to_card(port)->ring_buffers; + port->txlast = next_desc(port, port->txlast, 1); } netif_wake_queue(hdlc_to_dev(&port->hdlc)); @@ -390,8 +411,6 @@ static void sca_intr(int irq, void* dev_id, struct pt_regs *regs) { card_t *card = dev_id; -/* Maximum events to handle at each interrupt - should I increase it? */ - int boguscnt = 4; int i; u8 stat; @@ -412,23 +431,12 @@ if (stat & SCA_INTR_DMAC_TX(i)) sca_tx_intr(port); } - - if (--boguscnt < 0) { -#if 0 - printk(KERN_ERR "%s: too much work at " - "interrupt\n", - hdlc_to_name(&port->hdlc)); -#endif - goto exit; - } } } - exit: #ifndef ALL_PAGES_ALWAYS_MAPPED openwin(card, page); /* Restore original page */ #endif - return; } @@ -436,7 +444,7 @@ static void sca_set_port(port_t *port) { card_t* card = port_to_card(port); - u8 msci = get_msci(port); + u16 msci = get_msci(port); u8 md2 = sca_in(msci + MD2, card); unsigned int tmc, br = 10, brv = 1024; @@ -496,7 +504,7 @@ { port_t *port = hdlc_to_port(hdlc); card_t* card = port_to_card(port); - u8 msci = get_msci(port); + u16 msci = get_msci(port); u8 md0, md2; switch(port->encoding) { @@ -517,7 +525,7 @@ case PARITY_CRC16_PR0_CCITT: md0 = MD0_HDLC | MD0_CRC_ITU_0; break; #else case PARITY_CRC32_PR1_CCITT: md0 = MD0_HDLC | MD0_CRC_ITU32; break; -#endif +#endif case PARITY_CRC16_PR1_CCITT: md0 = MD0_HDLC | MD0_CRC_ITU; break; default: md0 = MD0_HDLC | MD0_CRC_NONE; } @@ -566,7 +574,7 @@ /* MSCI TX INT IRQ enable */ sca_outl(IE0_TXINT | IE0_UDRN, msci + IE0, card); /* DMA & MSCI IRQ enable */ - sca_outl(sca_in(IER0, card) | + sca_outl(sca_inl(IER0, card) | (phy_node(port) ? 0x02006600 : 0x00020066), IER0, card); #endif @@ -614,7 +622,7 @@ parity != PARITY_CRC16_PR0_CCITT && #else parity != PARITY_CRC32_PR1_CCITT && -#endif +#endif parity != PARITY_CRC16_PR1_CCITT) return -EINVAL; @@ -640,14 +648,13 @@ openwin(card, 0); #endif - printk(KERN_ERR "RX ring: CDA=%u EDA=%u DSR=%02X in=%u " - "%sactive", + printk(KERN_ERR "RX ring: CDA=%u EDA=%u DSR=%02X in=%u %sactive", sca_ina(get_dmac_rx(port) + CDAL, card), sca_ina(get_dmac_rx(port) + EDAL, card), sca_in(DSR_RX(phy_node(port)), card), port->rxin, sca_in(DSR_RX(phy_node(port)), card) & DSR_DE?"":"in"); - for (cnt = 0; cntring_buffers; cnt++) + for (cnt = 0; cnt < port_to_card(port)->rx_ring_buffers; cnt++) printk(" %02X", readb(&(desc_address(port, cnt, 0)->stat))); @@ -659,7 +666,7 @@ port->txlast, sca_in(DSR_TX(phy_node(port)), card) & DSR_DE ? "" : "in"); - for (cnt = 0; cntring_buffers; cnt++) + for (cnt = 0; cnt < port_to_card(port)->tx_ring_buffers; cnt++) printk(" %02X", readb(&(desc_address(port, cnt, 1)->stat))); printk("\n"); @@ -751,7 +758,7 @@ writeb(ST_TX_EOM, &desc->stat); dev->trans_start = jiffies; - port->txin = next_desc(port, port->txin); + port->txin = next_desc(port, port->txin, 1); sca_outa(desc_offset(port, port->txin, 1), get_dmac_tx(port) + EDAL, card); @@ -768,7 +775,49 @@ } -static void sca_init(card_t *card, int wait_states) + +#ifdef NEED_DETECT_RAM +static u32 __devinit sca_detect_ram(card_t *card, u8 *rambase, u32 ramsize) +{ + /* Round RAM size to 32 bits, fill from end to start */ + u32 i = ramsize &= ~3; + +#ifndef ALL_PAGES_ALWAYS_MAPPED + u32 size = winsize(card); + + openwin(card, (i - 4) / size); /* select last window */ +#endif + do { + i -= 4; +#ifndef ALL_PAGES_ALWAYS_MAPPED + if ((i + 4) % size == 0) + openwin(card, i / size); + writel(i ^ 0x12345678, rambase + i % size); +#else + writel(i ^ 0x12345678, rambase + i); +#endif + }while (i > 0); + + for (i = 0; i < ramsize ; i += 4) { +#ifndef ALL_PAGES_ALWAYS_MAPPED + if (i % size == 0) + openwin(card, i / size); + + if (readl(rambase + i % size) != (i ^ 0x12345678)) + break; +#else + if (readl(rambase + i) != (i ^ 0x12345678)) + break; +#endif + } + + return i; +} +#endif /* NEED_DETECT_RAM */ + + + +static void __devinit sca_init(card_t *card, int wait_states) { sca_out(wait_states, WCRL, card); /* Wait Control */ sca_out(wait_states, WCRM, card); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/hdlc_cisco.c linux-2.4.23-pre8/drivers/net/wan/hdlc_cisco.c --- linux-2.4.22/drivers/net/wan/hdlc_cisco.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/hdlc_cisco.c 2003-10-22 22:47:51.000000000 +0000 @@ -2,12 +2,11 @@ * Generic HDLC support routines for Linux * Cisco HDLC support * - * Copyright (C) 2000 - 2001 Krzysztof Halasa + * Copyright (C) 2000 - 2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. */ #include @@ -80,17 +79,43 @@ data->par1 = htonl(par1); data->par2 = htonl(par2); data->rel = 0xFFFF; - data->time = htonl(jiffies * 1000 / HZ); + /* we will need do_div here if 1000 % HZ != 0 */ + data->time = htonl(jiffies * (1000 / HZ)); skb_put(skb, sizeof(cisco_packet)); skb->priority = TC_PRIO_CONTROL; skb->dev = hdlc_to_dev(hdlc); + skb->nh.raw = skb->data; dev_queue_xmit(skb); } +static unsigned short cisco_type_trans(struct sk_buff *skb, + struct net_device *dev) +{ + hdlc_header *data = (hdlc_header*)skb->data; + + if (skb->len < sizeof(hdlc_header)) + return __constant_htons(ETH_P_HDLC); + + if (data->address != CISCO_MULTICAST && + data->address != CISCO_UNICAST) + return __constant_htons(ETH_P_HDLC); + + switch(data->protocol) { + case __constant_htons(ETH_P_IP): + case __constant_htons(ETH_P_IPX): + case __constant_htons(ETH_P_IPV6): + skb_pull(skb, sizeof(hdlc_header)); + return data->protocol; + default: + return __constant_htons(ETH_P_HDLC); + } +} + + static void cisco_rx(struct sk_buff *skb) { hdlc_device *hdlc = dev_to_hdlc(skb->dev); @@ -109,14 +134,6 @@ skb_pull(skb, sizeof(hdlc_header)); switch(ntohs(data->protocol)) { - case ETH_P_IP: - case ETH_P_IPX: - case ETH_P_IPV6: - skb->protocol = data->protocol; - skb->dev = hdlc_to_dev(hdlc); - netif_rx(skb); - return; - case CISCO_SYS_INFO: /* Packet is not needed, drop it. */ dev_kfree_skb_any(skb); @@ -288,6 +305,7 @@ hdlc->open = cisco_open; hdlc->stop = cisco_close; hdlc->netif_rx = cisco_rx; + hdlc->type_trans = cisco_type_trans; hdlc->proto = IF_PROTO_CISCO; dev->hard_start_xmit = hdlc->xmit; dev->hard_header = cisco_hard_header; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/hdlc_fr.c linux-2.4.23-pre8/drivers/net/wan/hdlc_fr.c --- linux-2.4.22/drivers/net/wan/hdlc_fr.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/hdlc_fr.c 2003-10-22 22:47:38.000000000 +0000 @@ -2,13 +2,22 @@ * Generic HDLC support routines for Linux * Frame Relay support * - * Copyright (C) 1999 - 2001 Krzysztof Halasa + * Copyright (C) 1999 - 2003 Krzysztof Halasa * * 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. - */ + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + + Theory of PVC state in DCE mode: + + (exist,new) -> 0,0 when "PVC create" or if "link unreliable" + 0,x -> 1,1 if "link reliable" when sending FULL STATUS + 1,1 -> 1,0 if received FULL STATUS ACK + + (active) -> 0 when "ifconfig PVC down" or "link unreliable" or "PVC create" + -> 1 when "PVC up" and (exist,new) = 1,0 +*/ #include #include @@ -20,19 +29,23 @@ #include #include #include +#include #include #include #include +#include #include __inline__ pvc_device* find_pvc(hdlc_device *hdlc, u16 dlci) { - pvc_device *pvc=hdlc->state.fr.first_pvc; - - while (pvc) { - if (netdev_dlci(&pvc->netdev) == dlci) + pvc_device *pvc = hdlc->state.fr.first_pvc; + + while(pvc) { + if (pvc->dlci == dlci) return pvc; + if (pvc->dlci > dlci) + return NULL; /* the listed is sorted */ pvc = pvc->next; } @@ -40,18 +53,72 @@ } +__inline__ pvc_device* add_pvc(hdlc_device *hdlc, u16 dlci) +{ + pvc_device *pvc, **pvc_p = &hdlc->state.fr.first_pvc; + + while(*pvc_p) { + if ((*pvc_p)->dlci == dlci) + return *pvc_p; + if ((*pvc_p)->dlci > dlci) + break; /* the listed is sorted */ + pvc_p = &(*pvc_p)->next; + } + + pvc = kmalloc(sizeof(pvc_device), GFP_ATOMIC); + if (!pvc) + return NULL; + + memset(pvc, 0, sizeof(pvc_device)); + pvc->dlci = dlci; + pvc->master = hdlc; + pvc->next = *pvc_p; /* Put it in the chain */ + *pvc_p = pvc; + return pvc; +} + + +__inline__ int pvc_is_used(pvc_device *pvc) +{ + return pvc->main != NULL || pvc->ether != NULL; +} + + +__inline__ void delete_unused_pvcs(hdlc_device *hdlc) +{ + pvc_device **pvc_p = &hdlc->state.fr.first_pvc; + + while(*pvc_p) { + if (!pvc_is_used(*pvc_p)) { + pvc_device *pvc = *pvc_p; + *pvc_p = pvc->next; + kfree(pvc); + continue; + } + pvc_p = &(*pvc_p)->next; + } +} -__inline__ u16 status_to_dlci(hdlc_device *hdlc, u8 *status, - int *active, int *new) + +__inline__ struct net_device** get_dev_p(pvc_device *pvc, int type) { - *new = (status[2] & 0x08); - *active = (!*new && (status[2] & 0x02)); + if (type == ARPHRD_ETHER) + return &pvc->ether; + else + return &pvc->main; +} + + +__inline__ u16 status_to_dlci(u8 *status, int *active, int *new) +{ + *new = (status[2] & 0x08) ? 1 : 0; + *active = (status[2] & 0x02) ? 1 : 0; return ((status[0] & 0x3F)<<4) | ((status[1] & 0x78)>>3); } -__inline__ void dlci_to_status(hdlc_device *hdlc, u16 dlci, u8 *status, +__inline__ void dlci_to_status(u16 dlci, u8 *status, int active, int new) { status[0] = (dlci>>4) & 0x3F; @@ -66,37 +133,50 @@ -static int fr_hard_header(struct sk_buff *skb, struct net_device *dev, - u16 type, void *daddr, void *saddr, unsigned int len) +static int fr_hard_header(struct sk_buff **skb_p, u16 dlci) { u16 head_len; + struct sk_buff *skb = *skb_p; - if (!daddr) - daddr = dev->broadcast; - -#ifdef CONFIG_HDLC_DEBUG_HARD_HEADER - printk(KERN_DEBUG "%s: fr_hard_header called\n", dev->name); -#endif - - switch(type) { - case ETH_P_IP: + switch(skb->protocol) { + case __constant_ntohs(ETH_P_IP): head_len = 4; skb_push(skb, head_len); skb->data[3] = NLPID_IP; break; - case ETH_P_IPV6: + case __constant_ntohs(ETH_P_IPV6): head_len = 4; skb_push(skb, head_len); skb->data[3] = NLPID_IPV6; break; - case LMI_PROTO: + case __constant_ntohs(LMI_PROTO): head_len = 4; skb_push(skb, head_len); skb->data[3] = LMI_PROTO; break; + case __constant_ntohs(ETH_P_802_3): + head_len = 10; + if (skb_headroom(skb) < head_len) { + struct sk_buff *skb2 = skb_realloc_headroom(skb, + head_len); + if (!skb2) + return -ENOBUFS; + dev_kfree_skb(skb); + skb = *skb_p = skb2; + } + skb_push(skb, head_len); + skb->data[3] = FR_PAD; + skb->data[4] = NLPID_SNAP; + skb->data[5] = FR_PAD; + skb->data[6] = 0x80; + skb->data[7] = 0xC2; + skb->data[8] = 0x00; + skb->data[9] = 0x07; /* bridged Ethernet frame w/out FCS */ + break; + default: head_len = 10; skb_push(skb, head_len); @@ -105,14 +185,12 @@ skb->data[5] = FR_PAD; skb->data[6] = FR_PAD; skb->data[7] = FR_PAD; - skb->data[8] = type>>8; - skb->data[9] = (u8)type; + *(u16*)(skb->data + 8) = skb->protocol; } - memcpy(skb->data, daddr, 2); + dlci_to_q922(skb->data, dlci); skb->data[2] = FR_UI; - - return head_len; + return 0; } @@ -124,13 +202,12 @@ if ((hdlc_to_dev(pvc->master)->flags & IFF_UP) == 0) return -EIO; /* Master must be UP in order to activate PVC */ - if (pvc->master->state.fr.settings.lmi != LMI_NONE) - pvc->state.active = 0; - else - pvc->state.active = 1; + if (pvc->open_count++ == 0) { + if (pvc->master->state.fr.settings.lmi == LMI_NONE) + pvc->state.active = 1; - pvc->state.new = 0; - pvc->master->state.fr.changed = 1; + pvc->master->state.fr.dce_changed = 1; + } return 0; } @@ -139,38 +216,94 @@ static int pvc_close(struct net_device *dev) { pvc_device *pvc = dev_to_pvc(dev); - pvc->state.active = pvc->state.new = 0; - pvc->master->state.fr.changed = 1; + + if (--pvc->open_count == 0) { + if (pvc->master->state.fr.settings.lmi == LMI_NONE) + pvc->state.active = 0; + + if (pvc->master->state.fr.settings.dce) { + pvc->master->state.fr.dce_changed = 1; + pvc->state.active = 0; + } + } return 0; } -static int pvc_xmit(struct sk_buff *skb, struct net_device *dev) +int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { pvc_device *pvc = dev_to_pvc(dev); + fr_proto_pvc_info info; - if (pvc->state.active) { - skb->dev = hdlc_to_dev(pvc->master); - pvc->stats.tx_bytes += skb->len; - pvc->stats.tx_packets++; - if (pvc->state.fecn) - pvc->stats.tx_compressed++; /* TX Congestion counter */ - dev_queue_xmit(skb); - } else { - pvc->stats.tx_dropped++; - dev_kfree_skb(skb); + if (ifr->ifr_settings.type == IF_GET_PROTO) { + if (dev->type == ARPHRD_ETHER) + ifr->ifr_settings.type = IF_PROTO_FR_ETH_PVC; + else + ifr->ifr_settings.type = IF_PROTO_FR_PVC; + + if (ifr->ifr_settings.size < sizeof(info)) { + /* data size wanted */ + ifr->ifr_settings.size = sizeof(info); + return -ENOBUFS; + } + + info.dlci = pvc->dlci; + memcpy(info.master, hdlc_to_name(pvc->master), IFNAMSIZ); + if (copy_to_user(ifr->ifr_settings.ifs_ifsu.fr_pvc_info, + &info, sizeof(info))) + return -EFAULT; + return 0; } - return 0; + return -EINVAL; +} + + +__inline__ struct net_device_stats *pvc_get_stats(struct net_device *dev) +{ + return (struct net_device_stats *) + ((char *)dev + sizeof(struct net_device)); } -static struct net_device_stats *pvc_get_stats(struct net_device *dev) +static int pvc_xmit(struct sk_buff *skb, struct net_device *dev) { pvc_device *pvc = dev_to_pvc(dev); - return &pvc->stats; + struct net_device_stats *stats = pvc_get_stats(dev); + + if (pvc->state.active) { + if (dev->type == ARPHRD_ETHER) { + int pad = ETH_ZLEN - skb->len; + if (pad > 0) { /* Pad the frame with zeros */ + int len = skb->len; + if (skb_tailroom(skb) < pad) + if (pskb_expand_head(skb, 0, pad, + GFP_ATOMIC)) { + stats->tx_dropped++; + dev_kfree_skb(skb); + return 0; + } + skb_put(skb, pad); + memset(skb->data + len, 0, pad); + } + skb->protocol = __constant_htons(ETH_P_802_3); + } + if (!fr_hard_header(&skb, pvc->dlci)) { + stats->tx_bytes += skb->len; + stats->tx_packets++; + if (pvc->state.fecn) /* TX Congestion counter */ + stats->tx_compressed++; + skb->dev = hdlc_to_dev(pvc->master); + dev_queue_xmit(skb); + return 0; + } + } + + stats->tx_dropped++; + dev_kfree_skb(skb); + return 0; } @@ -187,9 +320,15 @@ static inline void fr_log_dlci_active(pvc_device *pvc) { - printk(KERN_INFO "%s: %sactive%s\n", pvc_to_name(pvc), - pvc->state.active ? "" : "in", - pvc->state.new ? " new" : ""); + printk(KERN_INFO "%s: DLCI %d [%s%s%s]%s %s\n", + hdlc_to_name(pvc->master), + pvc->dlci, + pvc->main ? pvc->main->name : "", + pvc->main && pvc->ether ? " " : "", + pvc->ether ? pvc->ether->name : "", + pvc->state.new ? " new" : "", + !pvc->state.exist ? "deleted" : + pvc->state.active ? "active" : "inactive"); } @@ -213,8 +352,8 @@ int i = 0; if (hdlc->state.fr.settings.dce && fullrep) { - len += hdlc->state.fr.pvc_count * (2 + stat_len); - if (len > HDLC_MAX_MTU) { + len += hdlc->state.fr.dce_pvc_count * (2 + stat_len); + if (len > HDLC_MAX_MRU) { printk(KERN_WARNING "%s: Too many PVCs while sending " "LMI full report\n", hdlc_to_name(hdlc)); return; @@ -224,12 +363,13 @@ skb = dev_alloc_skb(len); if (!skb) { printk(KERN_WARNING "%s: Memory squeeze on fr_lmi_send()\n", - hdlc_to_name(hdlc)); + hdlc_to_name(hdlc)); return; } memset(skb->data, 0, len); skb_reserve(skb, 4); - fr_hard_header(skb, hdlc_to_dev(hdlc), LMI_PROTO, NULL, NULL, 0); + skb->protocol = __constant_htons(LMI_PROTO); + fr_hard_header(&skb, LMI_DLCI); data = skb->tail; data[i++] = LMI_CALLREF; data[i++] = hdlc->state.fr.settings.dce @@ -253,16 +393,20 @@ ? LMI_CCITT_PVCSTAT : LMI_PVCSTAT; data[i++] = stat_len; - if (hdlc->state.fr.reliable && - (pvc->netdev.flags & IFF_UP) && - !pvc->state.active && - !pvc->state.new) { - pvc->state.new = 1; + /* LMI start/restart */ + if (hdlc->state.fr.reliable && !pvc->state.exist) { + pvc->state.exist = pvc->state.new = 1; + fr_log_dlci_active(pvc); + } + + /* ifconfig PVC up */ + if (pvc->open_count && !pvc->state.active && + pvc->state.exist && !pvc->state.new) { + pvc->state.active = 1; fr_log_dlci_active(pvc); } - dlci_to_status(hdlc, netdev_dlci(&pvc->netdev), - data + i, + dlci_to_status(pvc->dlci, data + i, pvc->state.active, pvc->state.new); i += stat_len; pvc = pvc->next; @@ -272,6 +416,7 @@ skb_put(skb, i); skb->priority = TC_PRIO_CONTROL; skb->dev = hdlc_to_dev(hdlc); + skb->nh.raw = skb->data; dev_queue_xmit(skb); } @@ -312,10 +457,11 @@ if (reliable) { hdlc->state.fr.n391cnt = 0; /* Request full status */ - hdlc->state.fr.changed = 1; + hdlc->state.fr.dce_changed = 1; } else { while (pvc) { /* Deactivate all PVCs */ - pvc->state.new = pvc->state.active = 0; + pvc->state.exist = 0; + pvc->state.active = pvc->state.new = 0; pvc = pvc->next; } } @@ -346,7 +492,7 @@ { int stat_len; pvc_device *pvc; - int reptype = -1, error; + int reptype = -1, error, no_ram; u8 rxseq, txseq; int i; @@ -420,20 +566,18 @@ while (pvc) { if (pvc->state.new) { pvc->state.new = 0; - pvc->state.active = 1; - fr_log_dlci_active(pvc); /* Tell DTE that new PVC is now active */ - hdlc->state.fr.changed = 1; + hdlc->state.fr.dce_changed = 1; } pvc = pvc->next; } } - if (hdlc->state.fr.changed) { + if (hdlc->state.fr.dce_changed) { reptype = LMI_FULLREP; hdlc->state.fr.fullrep_sent = 1; - hdlc->state.fr.changed = 0; + hdlc->state.fr.dce_changed = 0; } fr_lmi_send(hdlc, reptype == LMI_FULLREP ? 1 : 0); @@ -449,13 +593,14 @@ pvc = hdlc->state.fr.first_pvc; while (pvc) { - pvc->state.deleted = pvc->state.active; /* mark active PVCs */ + pvc->state.deleted = 1; pvc = pvc->next; } + no_ram = 0; while (skb->len >= i + 2 + stat_len) { u16 dlci; - int active, new; + unsigned int active, new; if (skb->data[i] != ((hdlc->state.fr.settings.lmi == LMI_CCITT) ? LMI_CCITT_PVCSTAT : LMI_PVCSTAT)) { @@ -472,21 +617,28 @@ } i++; - dlci = status_to_dlci(hdlc, skb->data + i, &active, &new); - pvc = find_pvc(hdlc, dlci); + dlci = status_to_dlci(skb->data + i, &active, &new); + + pvc = add_pvc(hdlc, dlci); + + if (!pvc && !no_ram) { + printk(KERN_WARNING + "%s: Memory squeeze on fr_lmi_recv()\n", + hdlc_to_name(hdlc)); + no_ram = 1; + } - active |= new; if (pvc) { - if (active && !pvc->state.active && - (pvc->netdev.flags & IFF_UP)) { + pvc->state.exist = 1; + pvc->state.deleted = 0; + if (active != pvc->state.active || + new != pvc->state.new || + !pvc->state.exist) { + pvc->state.new = new; pvc->state.active = active; fr_log_dlci_active(pvc); } - pvc->state.deleted = 0; } - else if (new) - printk(KERN_INFO "%s: new PVC available, DLCI=%u\n", - hdlc_to_name(hdlc), dlci); i += stat_len; } @@ -494,10 +646,10 @@ pvc = hdlc->state.fr.first_pvc; while (pvc) { - if (pvc->state.deleted) { + if (pvc->state.deleted && pvc->state.exist) { pvc->state.active = pvc->state.new = 0; + pvc->state.exist = 0; fr_log_dlci_active(pvc); - pvc->state.deleted = 0; } pvc = pvc->next; } @@ -517,8 +669,9 @@ u8 *data = skb->data; u16 dlci; pvc_device *pvc; + struct net_device *dev = NULL; - if (skb->len<4 || fh->ea1 || data[2] != FR_UI) + if (skb->len <= 4 || fh->ea1 || data[2] != FR_UI) goto rx_error; dlci = q922_to_dlci(skb->data); @@ -550,57 +703,39 @@ printk(KERN_INFO "%s: No PVC for received frame's DLCI %d\n", hdlc_to_name(hdlc), dlci); #endif - goto rx_error; - } - - if ((pvc->netdev.flags & IFF_UP) == 0) { -#ifdef CONFIG_HDLC_DEBUG_PKT - printk(KERN_INFO "%s: PVC for received frame's DLCI %d is down\n", - hdlc_to_name(hdlc), dlci); -#endif - goto rx_error; + dev_kfree_skb_any(skb); + return; } - pvc->stats.rx_packets++; /* PVC traffic */ - pvc->stats.rx_bytes += skb->len; - - if (pvc->state.fecn != (fh->fecn ? PVC_STATE_FECN : 0)) { + if (pvc->state.fecn != fh->fecn) { #ifdef CONFIG_HDLC_DEBUG_ECN - printk(KERN_DEBUG "%s: FECN O%s\n", pvc_to_name(pvc), - fh->fecn ? "N" : "FF"); + printk(KERN_DEBUG "%s: DLCI %d FECN O%s\n", hdlc_to_name(pvc), + dlci, fh->fecn ? "N" : "FF"); #endif pvc->state.fecn ^= 1; } - if (pvc->state.becn != (fh->becn ? PVC_STATE_BECN : 0)) { + if (pvc->state.becn != fh->becn) { #ifdef CONFIG_HDLC_DEBUG_ECN - printk(KERN_DEBUG "%s: BECN O%s\n", pvc_to_name(pvc), - fh->becn ? "N" : "FF"); + printk(KERN_DEBUG "%s: DLCI %d BECN O%s\n", hdlc_to_name(pvc), + dlci, fh->becn ? "N" : "FF"); #endif pvc->state.becn ^= 1; } - if (pvc->state.becn) - pvc->stats.rx_compressed++; - - skb->dev = &pvc->netdev; if (data[3] == NLPID_IP) { skb_pull(skb, 4); /* Remove 4-byte header (hdr, UI, NLPID) */ + dev = pvc->main; skb->protocol = htons(ETH_P_IP); - netif_rx(skb); - return; - } - - if (data[3] == NLPID_IPV6) { + } else if (data[3] == NLPID_IPV6) { skb_pull(skb, 4); /* Remove 4-byte header (hdr, UI, NLPID) */ + dev = pvc->main; skb->protocol = htons(ETH_P_IPV6); - netif_rx(skb); - return; - } - if (data[3] == FR_PAD && data[4] == NLPID_SNAP && data[5] == FR_PAD) { + } else if (skb->len > 10 && data[3] == FR_PAD && + data[4] == NLPID_SNAP && data[5] == FR_PAD) { u16 oui = ntohs(*(u16*)(data + 6)); u16 pid = ntohs(*(u16*)(data + 8)); skb_pull(skb, 10); @@ -610,23 +745,39 @@ case ETH_P_IPX: case ETH_P_IP: /* a long variant */ case ETH_P_IPV6: + dev = pvc->main; skb->protocol = htons(pid); break; + case 0x80C20007: /* bridged Ethernet frame */ + if ((dev = pvc->ether) != NULL) + skb->protocol = eth_type_trans(skb, dev); + break; + default: printk(KERN_INFO "%s: Unsupported protocol, OUI=%x " "PID=%x\n", hdlc_to_name(hdlc), oui, pid); dev_kfree_skb_any(skb); return; } - - netif_rx(skb); + } else { + printk(KERN_INFO "%s: Unsupported protocol, NLPID=%x " + "length = %i\n", hdlc_to_name(hdlc), data[3], skb->len); + dev_kfree_skb_any(skb); return; } - printk(KERN_INFO "%s: Unsupported protocol, NLPID=%x\n", - hdlc_to_name(hdlc), data[3]); - dev_kfree_skb_any(skb); + if (dev) { + struct net_device_stats *stats = pvc_get_stats(dev); + stats->rx_packets++; /* PVC traffic */ + stats->rx_bytes += skb->len; + if (pvc->state.becn) + stats->rx_compressed++; + skb->dev = dev; + netif_rx(skb); + } else + dev_kfree_skb_any(skb); + return; rx_error: @@ -641,7 +792,7 @@ if (hdlc->state.fr.settings.lmi != LMI_NONE) { hdlc->state.fr.last_poll = 0; hdlc->state.fr.reliable = 0; - hdlc->state.fr.changed = 1; + hdlc->state.fr.dce_changed = 1; hdlc->state.fr.request = 0; hdlc->state.fr.fullrep_sent = 0; hdlc->state.fr.last_errors = 0xFFFFFFFF; @@ -669,90 +820,119 @@ if (hdlc->state.fr.settings.lmi != LMI_NONE) del_timer_sync(&hdlc->state.fr.timer); - while(pvc) { - dev_close(&pvc->netdev); /* Shutdown all PVCs for this FRAD */ + while(pvc) { /* Shutdown all PVCs for this FRAD */ + if (pvc->main) + dev_close(pvc->main); + if (pvc->ether) + dev_close(pvc->ether); + pvc->state.active = pvc->state.new = pvc->state.fecn = + pvc->state.becn = 0; + pvc->state.exist = 0; pvc = pvc->next; } } - -static int fr_pvc(hdlc_device *hdlc, unsigned int dlci, int create) +static int fr_add_pvc(hdlc_device *hdlc, unsigned int dlci, int type) { - pvc_device **pvc_p = &hdlc->state.fr.first_pvc; - pvc_device *pvc; - int result; + pvc_device *pvc = NULL; + struct net_device *dev; + int result, used; + char * prefix = "pvc%d"; - if(dlci <= 0 || dlci >= 1024) - return -EINVAL; /* Only 10 bits for DLCI, DLCI 0 reserved */ + if (type == ARPHRD_ETHER) + prefix = "pvceth%d"; - while(*pvc_p) { - if (netdev_dlci(&(*pvc_p)->netdev) == dlci) - break; - pvc_p = &(*pvc_p)->next; + if ((pvc = add_pvc(hdlc, dlci)) == NULL) { + printk(KERN_WARNING "%s: Memory squeeze on fr_add_pvc()\n", + hdlc_to_name(hdlc)); + return -ENOBUFS; } - if (create) { /* Create PVC */ - if (*pvc_p != NULL) - return -EEXIST; - - pvc = *pvc_p = kmalloc(sizeof(pvc_device), GFP_KERNEL); - if (!pvc) { - printk(KERN_WARNING "%s: Memory squeeze on fr_pvc()\n", - hdlc_to_name(hdlc)); - return -ENOBUFS; - } - memset(pvc, 0, sizeof(pvc_device)); + if (*get_dev_p(pvc, type)) + return -EEXIST; - pvc->netdev.hard_start_xmit = pvc_xmit; - pvc->netdev.get_stats = pvc_get_stats; - pvc->netdev.open = pvc_open; - pvc->netdev.stop = pvc_close; - pvc->netdev.change_mtu = pvc_change_mtu; - pvc->netdev.mtu = HDLC_MAX_MTU; - - pvc->netdev.type = ARPHRD_DLCI; - pvc->netdev.hard_header_len = 16; - pvc->netdev.hard_header = fr_hard_header; - pvc->netdev.tx_queue_len = 0; - pvc->netdev.flags = IFF_POINTOPOINT; - - pvc->master = hdlc; - *(u16*)pvc->netdev.dev_addr = htons(dlci); - dlci_to_q922(pvc->netdev.broadcast, dlci); - pvc->netdev.addr_len = 2; + used = pvc_is_used(pvc); - result = dev_alloc_name(&pvc->netdev, "pvc%d"); - if (result < 0) { - kfree(pvc); - *pvc_p = NULL; - return result; - } - - if (register_netdevice(&pvc->netdev) != 0) { - kfree(pvc); - *pvc_p = NULL; - return -EIO; - } + dev = kmalloc(sizeof(struct net_device) + + sizeof(struct net_device_stats), GFP_KERNEL); + if (!dev) { + printk(KERN_WARNING "%s: Memory squeeze on fr_pvc()\n", + hdlc_to_name(hdlc)); + delete_unused_pvcs(hdlc); + return -ENOBUFS; + } + memset(dev, 0, sizeof(struct net_device) + + sizeof(struct net_device_stats)); - hdlc->state.fr.changed = 1; - hdlc->state.fr.pvc_count++; - return 0; + if (type == ARPHRD_ETHER) { + ether_setup(dev); + memcpy(dev->dev_addr, "\x00\x01", 2); + get_random_bytes(dev->dev_addr + 2, ETH_ALEN - 2); + } else { + dev->type = ARPHRD_DLCI; + dev->flags = IFF_POINTOPOINT; + dev->hard_header_len = 10; + dev->addr_len = 2; + *(u16*)dev->dev_addr = htons(dlci); + dlci_to_q922(dev->broadcast, dlci); + } + dev->hard_start_xmit = pvc_xmit; + dev->get_stats = pvc_get_stats; + dev->open = pvc_open; + dev->stop = pvc_close; + dev->do_ioctl = pvc_ioctl; + dev->change_mtu = pvc_change_mtu; + dev->mtu = HDLC_MAX_MTU; + dev->tx_queue_len = 0; + dev->priv = pvc; + + result = dev_alloc_name(dev, prefix); + if (result < 0) { + kfree(dev); + delete_unused_pvcs(hdlc); + return result; + } + + if (register_netdevice(dev) != 0) { + kfree(dev); + delete_unused_pvcs(hdlc); + return -EIO; + } + + *get_dev_p(pvc, type) = dev; + if (!used) { + hdlc->state.fr.dce_changed = 1; + hdlc->state.fr.dce_pvc_count++; } + return 0; +} + + - if (*pvc_p == NULL) /* Delete PVC */ +static int fr_del_pvc(hdlc_device *hdlc, unsigned int dlci, int type) +{ + pvc_device *pvc; + struct net_device *dev; + + if ((pvc = find_pvc(hdlc, dlci)) == NULL) return -ENOENT; - pvc = *pvc_p; + if ((dev = *get_dev_p(pvc, type)) == NULL) + return -ENOENT; - if (pvc->netdev.flags & IFF_UP) + if (dev->flags & IFF_UP) return -EBUSY; /* PVC in use */ - hdlc->state.fr.changed = 1; - hdlc->state.fr.pvc_count--; - *pvc_p = pvc->next; - unregister_netdevice(&pvc->netdev); - kfree(pvc); + unregister_netdevice(dev); + kfree(dev); + *get_dev_p(pvc, type) = NULL; + + if (!pvc_is_used(pvc)) { + hdlc->state.fr.dce_pvc_count--; + hdlc->state.fr.dce_changed = 1; + } + delete_unused_pvcs(hdlc); return 0; } @@ -763,14 +943,21 @@ pvc_device *pvc = hdlc->state.fr.first_pvc; while(pvc) { pvc_device *next = pvc->next; - unregister_netdev(&pvc->netdev); + if (pvc->main) { + unregister_netdevice(pvc->main); + kfree(pvc->main); + } + if (pvc->ether) { + unregister_netdevice(pvc->ether); + kfree(pvc->ether); + } kfree(pvc); pvc = next; } hdlc->state.fr.first_pvc = NULL; /* All PVCs destroyed */ - hdlc->state.fr.pvc_count = 0; - hdlc->state.fr.changed = 1; + hdlc->state.fr.dce_pvc_count = 0; + hdlc->state.fr.dce_changed = 1; } @@ -828,25 +1015,27 @@ if (hdlc->proto != IF_PROTO_FR) { hdlc_proto_detach(hdlc); hdlc->state.fr.first_pvc = NULL; - hdlc->state.fr.pvc_count = 0; + hdlc->state.fr.dce_pvc_count = 0; } memcpy(&hdlc->state.fr.settings, &new_settings, size); hdlc->open = fr_open; hdlc->stop = fr_close; hdlc->netif_rx = fr_rx; + hdlc->type_trans = NULL; hdlc->proto_detach = fr_destroy; hdlc->proto = IF_PROTO_FR; dev->hard_start_xmit = hdlc->xmit; - dev->hard_header = fr_hard_header; + dev->hard_header = NULL; dev->type = ARPHRD_FRAD; - dev->addr_len = 2; - *(u16*)dev->dev_addr = htons(LMI_DLCI); - dlci_to_q922(dev->broadcast, LMI_DLCI); + dev->flags = IFF_POINTOPOINT | IFF_NOARP; + dev->addr_len = 0; return 0; case IF_PROTO_FR_ADD_PVC: case IF_PROTO_FR_DEL_PVC: + case IF_PROTO_FR_ADD_ETH_PVC: + case IF_PROTO_FR_DEL_ETH_PVC: if(!capable(CAP_NET_ADMIN)) return -EPERM; @@ -854,8 +1043,20 @@ sizeof(fr_proto_pvc))) return -EFAULT; - return fr_pvc(hdlc, pvc.dlci, - ifr->ifr_settings.type == IF_PROTO_FR_ADD_PVC); + if (pvc.dlci <= 0 || pvc.dlci >= 1024) + return -EINVAL; /* Only 10 bits, DLCI 0 reserved */ + + if (ifr->ifr_settings.type == IF_PROTO_FR_ADD_ETH_PVC || + ifr->ifr_settings.type == IF_PROTO_FR_DEL_ETH_PVC) + result = ARPHRD_ETHER; /* bridged Ethernet device */ + else + result = ARPHRD_DLCI; + + if (ifr->ifr_settings.type == IF_PROTO_FR_ADD_PVC || + ifr->ifr_settings.type == IF_PROTO_FR_ADD_ETH_PVC) + return fr_add_pvc(hdlc, pvc.dlci, result); + else + return fr_del_pvc(hdlc, pvc.dlci, result); } return -EINVAL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/hdlc_generic.c linux-2.4.23-pre8/drivers/net/wan/hdlc_generic.c --- linux-2.4.22/drivers/net/wan/hdlc_generic.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/hdlc_generic.c 2003-10-22 22:48:19.000000000 +0000 @@ -1,17 +1,13 @@ /* * Generic HDLC support routines for Linux * - * Copyright (C) 1999 - 2001 Krzysztof Halasa + * Copyright (C) 1999 - 2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. * - * Current status: - * - this is work in progress - * - not heavily tested on SMP - * - currently supported: + * Currently supported: * * raw IP-in-HDLC * * Cisco HDLC * * Frame Relay with ANSI or CCITT LMI (both user and network side) @@ -37,7 +33,7 @@ #include -static const char* version = "HDLC support module revision 1.11"; +static const char* version = "HDLC support module revision 1.14"; static int hdlc_change_mtu(struct net_device *dev, int new_mtu) @@ -60,7 +56,13 @@ static int hdlc_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *p) { - dev_to_hdlc(dev)->netif_rx(skb); + hdlc_device *hdlc = dev_to_hdlc(dev); + if (hdlc->netif_rx) + hdlc->netif_rx(skb); + else { + hdlc->stats.rx_dropped++; /* Shouldn't happen */ + dev_kfree_skb(skb); + } return 0; } @@ -69,6 +71,10 @@ #define hdlc_raw_ioctl(hdlc, ifr) -ENOSYS #endif +#ifndef CONFIG_HDLC_RAW_ETH +#define hdlc_raw_eth_ioctl(hdlc, ifr) -ENOSYS +#endif + #ifndef CONFIG_HDLC_PPP #define hdlc_ppp_ioctl(hdlc, ifr) -ENOSYS #endif @@ -96,6 +102,7 @@ switch(ifr->ifr_settings.type) { case IF_PROTO_HDLC: + case IF_PROTO_HDLC_ETH: case IF_PROTO_PPP: case IF_PROTO_CISCO: case IF_PROTO_FR: @@ -109,6 +116,7 @@ switch(proto) { case IF_PROTO_HDLC: return hdlc_raw_ioctl(hdlc, ifr); + case IF_PROTO_HDLC_ETH: return hdlc_raw_eth_ioctl(hdlc, ifr); case IF_PROTO_PPP: return hdlc_ppp_ioctl(hdlc, ifr); case IF_PROTO_CISCO: return hdlc_cisco_ioctl(hdlc, ifr); case IF_PROTO_FR: return hdlc_fr_ioctl(hdlc, ifr); @@ -152,9 +160,10 @@ void unregister_hdlc_device(hdlc_device *hdlc) { + rtnl_lock(); hdlc_proto_detach(hdlc); - - unregister_netdev(hdlc_to_dev(hdlc)); + unregister_netdevice(hdlc_to_dev(hdlc)); + rtnl_unlock(); MOD_DEC_USE_COUNT; } @@ -162,7 +171,7 @@ MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("HDLC support module"); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL v2"); EXPORT_SYMBOL(hdlc_ioctl); EXPORT_SYMBOL(register_hdlc_device); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/hdlc_ppp.c linux-2.4.23-pre8/drivers/net/wan/hdlc_ppp.c --- linux-2.4.22/drivers/net/wan/hdlc_ppp.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/hdlc_ppp.c 2003-10-22 22:47:51.000000000 +0000 @@ -2,12 +2,11 @@ * Generic HDLC support routines for Linux * Point-to-point protocol support * - * Copyright (C) 1999 - 2001 Krzysztof Halasa + * Copyright (C) 1999 - 2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. */ #include @@ -68,10 +67,10 @@ -static void ppp_rx(struct sk_buff *skb) +static unsigned short ppp_type_trans(struct sk_buff *skb, + struct net_device *dev) { - skb->protocol = htons(ETH_P_WAN_PPP); - netif_rx(skb); + return __constant_htons(ETH_P_WAN_PPP); } @@ -103,7 +102,8 @@ hdlc->open = ppp_open; hdlc->stop = ppp_close; - hdlc->netif_rx = ppp_rx; + hdlc->netif_rx = NULL; + hdlc->type_trans = ppp_type_trans; hdlc->proto = IF_PROTO_PPP; dev->hard_start_xmit = hdlc->xmit; dev->hard_header = NULL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/hdlc_raw.c linux-2.4.23-pre8/drivers/net/wan/hdlc_raw.c --- linux-2.4.22/drivers/net/wan/hdlc_raw.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/hdlc_raw.c 2003-10-22 22:47:41.000000000 +0000 @@ -2,12 +2,11 @@ * Generic HDLC support routines for Linux * HDLC support * - * Copyright (C) 1999 - 2001 Krzysztof Halasa + * Copyright (C) 1999 - 2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. */ #include @@ -26,10 +25,10 @@ #include -static void raw_rx(struct sk_buff *skb) +static unsigned short raw_type_trans(struct sk_buff *skb, + struct net_device *dev) { - skb->protocol = htons(ETH_P_IP); - netif_rx(skb); + return __constant_htons(ETH_P_IP); } @@ -67,7 +66,7 @@ new_settings.encoding = ENCODING_NRZ; if (new_settings.parity == PARITY_DEFAULT) - new_settings.parity = PARITY_NONE; + new_settings.parity = PARITY_CRC16_PR1_CCITT; result = hdlc->attach(hdlc, new_settings.encoding, new_settings.parity); @@ -79,11 +78,13 @@ hdlc->open = NULL; hdlc->stop = NULL; - hdlc->netif_rx = raw_rx; + hdlc->netif_rx = NULL; + hdlc->type_trans = raw_type_trans; hdlc->proto = IF_PROTO_HDLC; dev->hard_start_xmit = hdlc->xmit; dev->hard_header = NULL; dev->type = ARPHRD_RAWHDLC; + dev->flags = IFF_POINTOPOINT | IFF_NOARP; dev->addr_len = 0; return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/hdlc_raw_eth.c linux-2.4.23-pre8/drivers/net/wan/hdlc_raw_eth.c --- linux-2.4.22/drivers/net/wan/hdlc_raw_eth.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/hdlc_raw_eth.c 2003-10-22 22:49:15.000000000 +0000 @@ -0,0 +1,110 @@ +/* + * Generic HDLC support routines for Linux + * HDLC Ethernet emulation support + * + * Copyright (C) 2002-2003 Krzysztof Halasa + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 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 + + +static int eth_tx(struct sk_buff *skb, struct net_device *dev) +{ + int pad = ETH_ZLEN - skb->len; + if (pad > 0) { /* Pad the frame with zeros */ + int len = skb->len; + if (skb_tailroom(skb) < pad) + if (pskb_expand_head(skb, 0, pad, GFP_ATOMIC)) { + dev_to_hdlc(dev)->stats.tx_dropped++; + dev_kfree_skb(skb); + return 0; + } + skb_put(skb, pad); + memset(skb->data + len, 0, pad); + } + return dev_to_hdlc(dev)->xmit(skb, dev); +} + + +int hdlc_raw_eth_ioctl(hdlc_device *hdlc, struct ifreq *ifr) +{ + raw_hdlc_proto *raw_s = ifr->ifr_settings.ifs_ifsu.raw_hdlc; + const size_t size = sizeof(raw_hdlc_proto); + raw_hdlc_proto new_settings; + struct net_device *dev = hdlc_to_dev(hdlc); + int result; + void *old_ch_mtu; + int old_qlen; + + switch (ifr->ifr_settings.type) { + case IF_GET_PROTO: + ifr->ifr_settings.type = IF_PROTO_HDLC_ETH; + if (ifr->ifr_settings.size < size) { + ifr->ifr_settings.size = size; /* data size wanted */ + return -ENOBUFS; + } + if (copy_to_user(raw_s, &hdlc->state.raw_hdlc.settings, size)) + return -EFAULT; + return 0; + + case IF_PROTO_HDLC_ETH: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (dev->flags & IFF_UP) + return -EBUSY; + + if (copy_from_user(&new_settings, raw_s, size)) + return -EFAULT; + + if (new_settings.encoding == ENCODING_DEFAULT) + new_settings.encoding = ENCODING_NRZ; + + if (new_settings.parity == PARITY_DEFAULT) + new_settings.parity = PARITY_CRC16_PR1_CCITT; + + result = hdlc->attach(hdlc, new_settings.encoding, + new_settings.parity); + if (result) + return result; + + hdlc_proto_detach(hdlc); + memcpy(&hdlc->state.raw_hdlc.settings, &new_settings, size); + + hdlc->open = NULL; + hdlc->stop = NULL; + hdlc->netif_rx = NULL; + hdlc->type_trans = eth_type_trans; + hdlc->proto = IF_PROTO_HDLC_ETH; + dev->hard_start_xmit = eth_tx; + old_ch_mtu = dev->change_mtu; + old_qlen = dev->tx_queue_len; + ether_setup(dev); + dev->change_mtu = old_ch_mtu; + dev->tx_queue_len = old_qlen; + memcpy(dev->dev_addr, "\x00\x01", 2); + get_random_bytes(dev->dev_addr + 2, ETH_ALEN - 2); + return 0; + } + + return -EINVAL; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/hdlc_x25.c linux-2.4.23-pre8/drivers/net/wan/hdlc_x25.c --- linux-2.4.22/drivers/net/wan/hdlc_x25.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/hdlc_x25.c 2003-10-22 22:49:22.000000000 +0000 @@ -2,12 +2,11 @@ * Generic HDLC support routines for Linux * X.25 support * - * Copyright (C) 1999 - 2001 Krzysztof Halasa + * Copyright (C) 1999 - 2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. */ #include @@ -204,6 +203,7 @@ hdlc->open = x25_open; hdlc->stop = x25_close; hdlc->netif_rx = x25_rx; + hdlc->type_trans = NULL; hdlc->proto = IF_PROTO_X25; dev->hard_start_xmit = x25_xmit; dev->hard_header = NULL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/lmc/lmc_proto.c linux-2.4.23-pre8/drivers/net/wan/lmc/lmc_proto.c --- linux-2.4.22/drivers/net/wan/lmc/lmc_proto.c 2001-03-07 03:44:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/lmc/lmc_proto.c 2003-10-22 22:49:01.000000000 +0000 @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/n2.c linux-2.4.23-pre8/drivers/net/wan/n2.c --- linux-2.4.22/drivers/net/wan/n2.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/n2.c 2003-10-22 22:48:11.000000000 +0000 @@ -1,12 +1,11 @@ /* * SDL Inc. RISCom/N2 synchronous serial card driver for Linux * - * Copyright (C) 1998-2002 Krzysztof Halasa + * Copyright (C) 1998-2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. * * For information see http://hq.pm.waw.pl/hdlc/ * @@ -34,14 +33,21 @@ #include "hd64570.h" -static const char* version = "SDL RISCom/N2 driver version: 1.10"; +static const char* version = "SDL RISCom/N2 driver version: 1.14"; static const char* devname = "RISCom/N2"; #define USE_WINDOWSIZE 16384 #define USE_BUS16BITS 1 #define CLOCK_BASE 9830400 /* 9.8304 MHz */ - +#define MAX_PAGES 16 /* 16 RAM pages at max */ +#define MAX_RAM_SIZE 0x80000 /* 512 KB */ +#if MAX_RAM_SIZE > MAX_PAGES * USE_WINDOWSIZE +#undef MAX_RAM_SIZE +#define MAX_RAM_SIZE (MAX_PAGES * USE_WINDOWSIZE) +#endif #define N2_IOPORTS 0x10 +#define NEED_DETECT_RAM +#define MAX_TX_BUFFERS 10 static char *hw = NULL; /* pointer to hw=xxx command line string */ @@ -86,16 +92,16 @@ struct card_s *card; spinlock_t lock; /* TX lock */ sync_serial_settings settings; + int valid; /* port enabled */ + int rxpart; /* partial frame received, next frame invalid*/ unsigned short encoding; unsigned short parity; + u16 rxin; /* rx ring buffer 'in' pointer */ + u16 txin; /* tx ring buffer 'in' and 'last' pointers */ + u16 txlast; u8 rxs, txs, tmc; /* SCA registers */ - u8 valid; /* port enabled */ u8 phy_node; /* physical port # - 0 or 1 */ u8 log_node; /* logical port # */ - u8 rxin; /* rx ring buffer 'in' pointer */ - u8 txin; /* tx ring buffer 'in' and 'last' pointers */ - u8 txlast; - u8 rxpart; /* partial frame received, next frame invalid*/ }port_t; @@ -106,8 +112,9 @@ u32 ram_size; /* number of bytes */ u16 io; /* IO Base address */ u16 buff_offset; /* offset of first buffer of first channel */ + u16 rx_ring_buffers; /* number of buffers in a ring */ + u16 tx_ring_buffers; u8 irq; /* IRQ (3-15) */ - u8 ring_buffers; /* number of buffers in a ring */ port_t ports[2]; struct card_s *next_card; @@ -216,7 +223,7 @@ MOD_INC_USE_COUNT; mcr &= port->phy_node ? ~DTR_PORT1 : ~DTR_PORT0; /* set DTR ON */ outb(mcr, io + N2_MCR); - + outb(inb(io + N2_PCR) | PCR_ENWIN, io + N2_PCR); /* open window */ outb(inb(io + N2_PSR) | PSR_DMAEN, io + N2_PSR); /* enable dma */ sca_open(hdlc); @@ -297,62 +304,6 @@ -static u8 n2_count_page(card_t *card) -{ - u8 page; - int i, bcount = USE_WINDOWSIZE, wcount = USE_WINDOWSIZE/2; - u16 *dp = (u16*)card->winbase; - u8 *bp = (u8*)card->winbase; - u8 psr = inb(card->io + N2_PSR) & PSR_WINBITS; - - - for (page = 0; page < 16; page++) { - outb(psr | page, card->io + N2_PSR); /* select a page */ - writeb(page, dp); - if (readb(dp) != page) - break; /* If can't read back, no good memory */ - - outb(psr, card->io + N2_PSR); /* goto page 0 */ - if (readb(dp)) - break; /* If page 0 changed, then wrapped around */ - - outb(psr | page, card->io + N2_PSR); /* select page again */ - - /* first do byte tests */ - for (i = 0; i < bcount; i++) - writeb(i, bp + i); - for (i = 0; i < bcount; i++) - if (readb(bp + i) != (i & 0xff)) - return 0; - - for (i = 0; i < bcount; i++) - writeb(~i, bp + i); - for (i = 0; i < bcount; i++) - if (readb(bp + i) != (~i & 0xff)) - return 0; - - /* next do 16-bit tests */ - for (i = 0; i < wcount; i++) - writew(0x55AA, dp + i); - for (i = 0; i < wcount; i++) - if (readw(dp + i) != 0x55AA) - return 0; - - for (i = 0; i < wcount; i++) - writew(0xAA55, dp + i); - for (i = 0; i < wcount; i++) - if (readw(dp + i) != 0xAA55) - return 0; - - for (i = 0; i < wcount; i++) - writew(page, dp + i); - } - - return page; -} - - - static void n2_destroy_card(card_t *card) { int cnt; @@ -376,11 +327,12 @@ -static int n2_run(unsigned long io, unsigned long irq, unsigned long winbase, - long valid0, long valid1) +static int __init n2_run(unsigned long io, unsigned long irq, + unsigned long winbase, long valid0, long valid1) { card_t *card; u8 cnt, pcr; + int i; if (io < 0x200 || io > 0x3FF || (io % N2_IOPORTS) != 0) { printk(KERN_ERR "n2: invalid I/O port value\n"); @@ -391,7 +343,7 @@ printk(KERN_ERR "n2: invalid IRQ value\n"); return -ENODEV; } - + if (winbase < 0xA0000 || winbase > 0xFFFFF || (winbase & 0xFFF) != 0) { printk(KERN_ERR "n2: invalid RAM value\n"); return -ENODEV; @@ -451,25 +403,27 @@ pcr = PCR_ENWIN | PCR_VPM | (USE_BUS16BITS ? PCR_BUS16 : 0); outb(pcr, io + N2_PCR); - cnt = n2_count_page(card); - if (!cnt) { - printk(KERN_ERR "n2: memory test failed.\n"); - n2_destroy_card(card); - return -EIO; - } + card->ram_size = sca_detect_ram(card, card->winbase, MAX_RAM_SIZE); - card->ram_size = cnt * USE_WINDOWSIZE; + /* number of TX + RX buffers for one port */ + i = card->ram_size / ((valid0 + valid1) * (sizeof(pkt_desc) + + HDLC_MAX_MRU)); - /* 4 rings required for 2 ports, 2 rings for one port */ - card->ring_buffers = card->ram_size / - ((valid0 + valid1) * 2 * (sizeof(pkt_desc) + HDLC_MAX_MRU)); + card->tx_ring_buffers = min(i / 2, MAX_TX_BUFFERS); + card->rx_ring_buffers = i - card->tx_ring_buffers; - card->buff_offset = (valid0 + valid1) * 2 * (sizeof(pkt_desc)) - * card->ring_buffers; + card->buff_offset = (valid0 + valid1) * sizeof(pkt_desc) * + (card->tx_ring_buffers + card->rx_ring_buffers); printk(KERN_DEBUG "n2: RISCom/N2 %u KB RAM, IRQ%u, " - "using %u packets rings\n", card->ram_size / 1024, card->irq, - card->ring_buffers); + "using %u TX + %u RX packets rings\n", card->ram_size / 1024, + card->irq, card->tx_ring_buffers, card->rx_ring_buffers); + + if (card->tx_ring_buffers < 1) { + printk(KERN_ERR "n2: RAM test failed\n"); + n2_destroy_card(card); + return -EIO; + } pcr |= PCR_RUNSCA; /* run SCA */ outb(pcr, io + N2_PCR); @@ -531,7 +485,7 @@ return -ENOSYS; /* no parameters specified, abort */ } - printk(KERN_INFO "%s (SCA-%s)\n", version, sca_version); + printk(KERN_INFO "%s\n", version); do { unsigned long io, irq, ram; @@ -558,7 +512,7 @@ break; hw++; } - + if (!valid[0] && !valid[1]) break; /* at least one port must be used */ @@ -566,7 +520,7 @@ n2_run(io, irq, ram, valid[0], valid[1]); if (*hw == '\x0') - return 0; + return first_card ? 0 : -ENOSYS; }while(*hw++ == ':'); printk(KERN_ERR "n2: invalid hardware parameters\n"); @@ -602,6 +556,6 @@ MODULE_AUTHOR("Krzysztof Halasa "); MODULE_DESCRIPTION("RISCom/N2 serial port driver"); -MODULE_LICENSE("GPL"); +MODULE_LICENSE("GPL v2"); MODULE_PARM(hw, "s"); /* hw=io,irq,ram,ports:io,irq,... */ EXPORT_NO_SYMBOLS; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/sdla_chdlc.c linux-2.4.23-pre8/drivers/net/wan/sdla_chdlc.c --- linux-2.4.22/drivers/net/wan/sdla_chdlc.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/sdla_chdlc.c 2003-10-22 22:48:56.000000000 +0000 @@ -3819,7 +3819,7 @@ void s508_lock (sdla_t *card, unsigned long *smp_flags) { -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) spin_lock_irqsave(&card->wandev.lock, *smp_flags); if (card->next){ spin_lock(&card->next->wandev.lock); @@ -3831,7 +3831,7 @@ void s508_unlock (sdla_t *card, unsigned long *smp_flags) { -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) if (card->next){ spin_unlock(&card->next->wandev.lock); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/sdla_fr.c linux-2.4.23-pre8/drivers/net/wan/sdla_fr.c --- linux-2.4.22/drivers/net/wan/sdla_fr.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/sdla_fr.c 2003-10-22 22:49:48.000000000 +0000 @@ -4707,13 +4707,13 @@ { if (card->hw.type != SDLA_S514){ -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) spin_lock_irqsave(&card->wandev.lock, *smp_flags); #else disable_irq(card->hw.irq); #endif }else{ -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) spin_lock(&card->u.f.if_send_lock); #endif } @@ -4725,13 +4725,13 @@ { if (card->hw.type != SDLA_S514){ -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) spin_unlock_irqrestore (&card->wandev.lock, *smp_flags); #else enable_irq(card->hw.irq); #endif }else{ -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) spin_unlock(&card->u.f.if_send_lock); #endif } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/sdla_ppp.c linux-2.4.23-pre8/drivers/net/wan/sdla_ppp.c --- linux-2.4.22/drivers/net/wan/sdla_ppp.c 2002-08-03 00:39:44.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/sdla_ppp.c 2003-10-22 22:47:59.000000000 +0000 @@ -3331,7 +3331,7 @@ void s508_lock (sdla_t *card, unsigned long *smp_flags) { -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) spin_lock_irqsave(&card->wandev.lock, *smp_flags); #else disable_irq(card->hw.irq); @@ -3340,7 +3340,7 @@ void s508_unlock (sdla_t *card, unsigned long *smp_flags) { -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) spin_unlock_irqrestore(&card->wandev.lock, *smp_flags); #else enable_irq(card->hw.irq); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/sdlamain.c linux-2.4.23-pre8/drivers/net/wan/sdlamain.c --- linux-2.4.22/drivers/net/wan/sdlamain.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/sdlamain.c 2003-10-22 22:49:14.000000000 +0000 @@ -511,7 +511,7 @@ if (!card->configured){ /* Initialize the Spin lock */ -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) printk(KERN_INFO "%s: Initializing for SMP\n",wandev->name); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wan/wanpipe_multppp.c linux-2.4.23-pre8/drivers/net/wan/wanpipe_multppp.c --- linux-2.4.22/drivers/net/wan/wanpipe_multppp.c 2001-09-13 23:04:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wan/wanpipe_multppp.c 2003-10-22 22:49:54.000000000 +0000 @@ -2358,7 +2358,7 @@ void s508_lock (sdla_t *card, unsigned long *smp_flags) { -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) spin_lock_irqsave(&card->wandev.lock, *smp_flags); if (card->next){ /* It is ok to use spin_lock here, since we @@ -2372,7 +2372,7 @@ void s508_unlock (sdla_t *card, unsigned long *smp_flags) { -#if defined(__SMP__) || defined(LINUX_2_4) +#if defined(CONFIG_SMP) || defined(LINUX_2_4) if (card->next){ spin_unlock(&card->next->wandev.lock); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/winbond-840.c linux-2.4.23-pre8/drivers/net/winbond-840.c --- linux-2.4.22/drivers/net/winbond-840.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/winbond-840.c 2003-10-22 22:47:59.000000000 +0000 @@ -17,7 +17,7 @@ Support and updates available at http://www.scyld.com/network/drivers.html - Do not remove the copyright infomation. + Do not remove the copyright information. Do not change the version information unless an improvement has been made. Merely removing my name, as Compex has done in the past, does not count as an improvement. @@ -234,7 +234,7 @@ #define W840_FLAGS (PCI_USES_MEM | PCI_ADDR1 | PCI_USES_MASTER) #endif -static struct pci_device_id w840_pci_tbl[] __devinitdata = { +static struct pci_device_id w840_pci_tbl[] = { { 0x1050, 0x0840, PCI_ANY_ID, 0x8153, 0, 0, 0 }, { 0x1050, 0x0840, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, { 0x11f6, 0x2011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 }, @@ -341,7 +341,6 @@ DescIntr=0x80000000, }; -#define PRIV_ALIGN 15 /* Required alignment mask */ #define MII_CNT 1 /* winbond only supports one MII */ struct netdev_private { struct w840_rx_desc *rx_ring; @@ -386,13 +385,14 @@ static int alloc_ringdesc(struct net_device *dev); static void free_ringdesc(struct netdev_private *np); static int start_tx(struct sk_buff *skb, struct net_device *dev); -static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static void netdev_error(struct net_device *dev, int intr_status); static int netdev_rx(struct net_device *dev); static u32 __set_rx_mode(struct net_device *dev); static void set_rx_mode(struct net_device *dev); static struct net_device_stats *get_stats(struct net_device *dev); static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +static struct ethtool_ops netdev_ethtool_ops; static int netdev_close(struct net_device *dev); @@ -417,7 +417,7 @@ if (pci_set_dma_mask(pdev,0xFFFFffff)) { printk(KERN_WARNING "Winbond-840: Device %s disabled due to DMA limitations.\n", - pdev->slot_name); + pci_name(pdev)); return -EIO; } dev = alloc_etherdev(sizeof(*np)); @@ -482,6 +482,7 @@ dev->get_stats = &get_stats; dev->set_multicast_list = &set_rx_mode; dev->do_ioctl = &netdev_ioctl; + dev->ethtool_ops = &netdev_ethtool_ops; dev->tx_timeout = &tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; @@ -598,7 +599,7 @@ #define mdio_delay(mdio_addr) readl(mdio_addr) /* Set iff a MII transceiver on any interface requires mdio preamble. - This only set with older tranceivers, so the extra + This only set with older transceivers, so the extra code size of a per-interface flag is not worthwhile. */ static char mii_preamble_required = 1; @@ -1078,7 +1079,7 @@ np->tx_ring[entry].length |= DescEndRing; /* Now acquire the irq spinlock. - * The difficult race is the ordering between + * The difficult race is the the ordering between * increasing np->cur_tx and setting DescOwn: * - if np->cur_tx is increased first the interrupt * handler could consider the packet as transmitted @@ -1166,15 +1167,16 @@ /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = (struct net_device *)dev_instance; struct netdev_private *np = dev->priv; long ioaddr = dev->base_addr; int work_limit = max_interrupt_work; + int handled = 0; if (!netif_device_present(dev)) - return; + return IRQ_NONE; do { u32 intr_status = readl(ioaddr + IntrStatus); @@ -1188,6 +1190,8 @@ if ((intr_status & (NormalIntr|AbnormalIntr)) == 0) break; + handled = 1; + if (intr_status & (IntrRxDone | RxNoBuf)) netdev_rx(dev); if (intr_status & RxNoBuf) @@ -1223,6 +1227,7 @@ if (debug > 3) printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n", dev->name, (int)readl(ioaddr + IntrStatus)); + return IRQ_RETVAL(handled); } /* This routine is logically part of the interrupt handler, but separated @@ -1428,8 +1433,9 @@ memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next) { - set_bit((ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F, - mc_filter); + int filterbit = (ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26) ^ 0x3F; + filterbit &= 0x3f; + mc_filter[filterbit >> 5] |= cpu_to_le32(1 << (filterbit & 31)); } rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys; } @@ -1447,88 +1453,79 @@ spin_unlock_irq(&np->lock); } -static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr) +static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info) { struct netdev_private *np = dev->priv; - 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, DRV_NAME); - strcpy(info.version, DRV_VERSION); - strcpy(info.bus_info, np->pci_dev->slot_name); - if (copy_to_user(useraddr, &info, sizeof(info))) - return -EFAULT; - return 0; - } - /* get settings */ - case ETHTOOL_GSET: { - struct ethtool_cmd ecmd = { ETHTOOL_GSET }; - spin_lock_irq(&np->lock); - mii_ethtool_gset(&np->mii_if, &ecmd); - spin_unlock_irq(&np->lock); - if (copy_to_user(useraddr, &ecmd, sizeof(ecmd))) - return -EFAULT; - return 0; - } - /* set settings */ - case ETHTOOL_SSET: { - int r; - struct ethtool_cmd ecmd; - if (copy_from_user(&ecmd, useraddr, sizeof(ecmd))) - return -EFAULT; - spin_lock_irq(&np->lock); - r = mii_ethtool_sset(&np->mii_if, &ecmd); - spin_unlock_irq(&np->lock); - return r; - } - /* restart autonegotiation */ - case ETHTOOL_NWAY_RST: { - return mii_nway_restart(&np->mii_if); - } - /* get link status */ - case ETHTOOL_GLINK: { - struct ethtool_value edata = {ETHTOOL_GLINK}; - edata.data = mii_link_ok(&np->mii_if); - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } + strcpy (info->driver, DRV_NAME); + strcpy (info->version, DRV_VERSION); + strcpy (info->bus_info, pci_name(np->pci_dev)); +} - /* get message-level */ - case ETHTOOL_GMSGLVL: { - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; - edata.data = debug; - if (copy_to_user(useraddr, &edata, sizeof(edata))) - return -EFAULT; - return 0; - } - /* set message-level */ - case ETHTOOL_SMSGLVL: { - struct ethtool_value edata; - if (copy_from_user(&edata, useraddr, sizeof(edata))) - return -EFAULT; - debug = edata.data; - return 0; - } - } - - return -EOPNOTSUPP; +static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct netdev_private *np = dev->priv; + int rc; + + spin_lock_irq(&np->lock); + rc = mii_ethtool_gset(&np->mii_if, cmd); + spin_unlock_irq(&np->lock); + + return rc; } +static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct netdev_private *np = dev->priv; + int rc; + + spin_lock_irq(&np->lock); + rc = mii_ethtool_sset(&np->mii_if, cmd); + spin_unlock_irq(&np->lock); + + return rc; +} + +static int netdev_nway_reset(struct net_device *dev) +{ + struct netdev_private *np = dev->priv; + return mii_nway_restart(&np->mii_if); +} + +static u32 netdev_get_link(struct net_device *dev) +{ + struct netdev_private *np = dev->priv; + return mii_link_ok(&np->mii_if); +} + +static u32 netdev_get_msglevel(struct net_device *dev) +{ + return debug; +} + +static void netdev_set_msglevel(struct net_device *dev, u32 value) +{ + debug = value; +} + +static struct ethtool_ops netdev_ethtool_ops = { + .get_drvinfo = netdev_get_drvinfo, + .get_settings = netdev_get_settings, + .set_settings = netdev_set_settings, + .nway_reset = netdev_nway_reset, + .get_link = netdev_get_link, + .get_msglevel = netdev_get_msglevel, + .set_msglevel = netdev_set_msglevel, + .get_sg = ethtool_op_get_sg, + .get_tx_csum = ethtool_op_get_tx_csum, +}; + static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; struct netdev_private *np = dev->priv; switch(cmd) { - case SIOCETHTOOL: - return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); case SIOCGMIIPHY: /* Get address of MII PHY in use. */ case SIOCDEVPRIVATE: /* for binary compat, remove in 2.5 */ data->phy_id = ((struct netdev_private *)dev->priv)->phys[0] & 0x1f; @@ -1587,10 +1584,10 @@ if (debug > 2) { int i; - printk("\n"KERN_DEBUG" Tx ring at %8.8x:\n", + printk(KERN_DEBUG" Tx ring at %8.8x:\n", (int)np->tx_ring); for (i = 0; i < TX_RING_SIZE; i++) - printk(" #%d desc. %4.4x %4.4x %8.8x.\n", + printk(KERN_DEBUG " #%d desc. %4.4x %4.4x %8.8x.\n", i, np->tx_ring[i].length, np->tx_ring[i].status, np->tx_ring[i].buffer1); printk("\n"KERN_DEBUG " Rx ring %8.8x:\n", @@ -1690,7 +1687,6 @@ return 0; } - static int w840_resume (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata (pdev); @@ -1714,8 +1710,7 @@ netif_wake_queue(dev); - np->timer.expires = jiffies + 1*HZ; - add_timer(&np->timer); + mod_timer(&np->timer, jiffies + 1*HZ); } else { netif_device_attach(dev); } @@ -1726,13 +1721,13 @@ #endif static struct pci_driver w840_driver = { - name: DRV_NAME, - id_table: w840_pci_tbl, - probe: w840_probe1, - remove: __devexit_p(w840_remove1), + .name = DRV_NAME, + .id_table = w840_pci_tbl, + .probe = w840_probe1, + .remove = __devexit_p(w840_remove1), #ifdef CONFIG_PM - suspend: w840_suspend, - resume: w840_resume, + .suspend = w840_suspend, + .resume = w840_resume, #endif }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wireless/Config.in linux-2.4.23-pre8/drivers/net/wireless/Config.in --- linux-2.4.22/drivers/net/wireless/Config.in 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wireless/Config.in 2003-10-22 22:48:21.000000000 +0000 @@ -14,6 +14,7 @@ if [ "$CONFIG_PCI" = "y" ]; then dep_tristate ' Hermes in PLX9052 based PCI adaptor support (Netgear MA301 etc.) (EXPERIMENTAL)' CONFIG_PLX_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL + dep_tristate ' Hermes in TMD7160/NCP130 based PCI adaptor support (Pheecom WL-PCI etc.) (EXPERIMENTAL)' CONFIG_TMD_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL dep_tristate ' Prism 2.5 PCI 802.11b adaptor support (EXPERIMENTAL)' CONFIG_PCI_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL fi diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wireless/Makefile linux-2.4.23-pre8/drivers/net/wireless/Makefile --- linux-2.4.22/drivers/net/wireless/Makefile 2002-08-03 00:39:44.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wireless/Makefile 2003-10-22 22:49:58.000000000 +0000 @@ -18,6 +18,7 @@ obj-$(CONFIG_PCMCIA_HERMES) += orinoco_cs.o obj-$(CONFIG_APPLE_AIRPORT) += airport.o obj-$(CONFIG_PLX_HERMES) += orinoco_plx.o +obj-$(CONFIG_TMD_HERMES) += orinoco_tmd.o obj-$(CONFIG_PCI_HERMES) += orinoco_pci.o obj-$(CONFIG_AIRO) += airo.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/wireless/airo.c linux-2.4.23-pre8/drivers/net/wireless/airo.c --- linux-2.4.22/drivers/net/wireless/airo.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/wireless/airo.c 2003-10-22 22:47:44.000000000 +0000 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -81,12 +80,12 @@ #endif /* Support Cisco MIC feature */ -/* As this feature requires the AES encryption algorithm, it is not included - in the kernel tree. If you want to enable it, you need to download the - aes.h, aestab.h and mic.h files from the CVS at - http://sf.net/projects/airo-linux/ Put the files in the same directory - as airo.c and compile normally */ +#define MICSUPPORT + +#if defined(MICSUPPORT) && !defined(CONFIG_CRYPTO) +#warning MIC support requires Crypto API #undef MICSUPPORT +#endif /* Hack to do some power saving */ #define POWER_ON_DOWN @@ -203,7 +202,7 @@ #ifndef RUN_AT #define RUN_AT(x) (jiffies+(x)) #endif -#if LINUX_VERSION_CODE < 0x020500 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) static inline struct proc_dir_entry *PDE(const struct inode *inode) { return inode->u.generic_ip; @@ -305,6 +304,7 @@ #define CMD_DEALLOCATETX 0x000c #define NOP 0x0010 #define CMD_WORKAROUND 0x0011 +#define CMD_ALLOCATEAUX 0x0020 #define CMD_ACCESS 0x0021 #define CMD_PCIBAP 0x0022 #define CMD_PCIAUX 0x0023 @@ -409,6 +409,7 @@ #define EV_ALLOC 0x08 #define EV_LINK 0x80 #define EV_AWAKE 0x100 +#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 ) @@ -619,14 +620,14 @@ u16 arlDelay; u16 _reserved4[1]; /*---------- Aironet Extensions ----------*/ - u16 magicAction; + u8 magicAction; #define MAGIC_ACTION_STSCHG 1 #define MACIC_ACTION_RESUME 2 #define MAGIC_IGNORE_MCAST (1<<8) #define MAGIC_IGNORE_BCAST (1<<9) #define MAGIC_SWITCH_TO_PSP (0<<10) #define MAGIC_STAY_IN_CAM (1<<10) - u16 magicControl; + u8 magicControl; u16 autoWake; } ConfigRid; @@ -639,7 +640,7 @@ u16 SSIDlen; char SSID[32]; char apName[16]; - char bssid[4][ETH_ALEN]; + u8 bssid[4][ETH_ALEN]; u16 beaconPeriod; u16 dimPeriod; u16 atimDuration; @@ -847,6 +848,7 @@ #define AIROGMICRID 11 #define AIROGMICSTATS 12 #define AIROGFLAGS 13 +#define AIRORRID 15 /* Leave gap of 40 commands after AIROGSTATSD32 for future */ @@ -963,8 +965,6 @@ static void enable_interrupts(struct airo_info*); static void disable_interrupts(struct airo_info*); static u16 issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp); -static u16 sendcommand(struct airo_info *ai, Cmd *pCmd); -static void completecommand(struct airo_info *ai, Resp *pRsp); static int bap_setup(struct airo_info*, u16 rid, u16 offset, int whichbap); static int aux_bap_read(struct airo_info*, u16 *pu16Dst, int bytelen, int whichbap); @@ -984,6 +984,8 @@ static void airo_interrupt( int irq, void* dev_id, struct pt_regs *regs); +static int airo_thread(void *data); +static void timer_func( struct net_device *dev ); static int airo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); #ifdef WIRELESS_EXT struct iw_statistics *airo_get_wireless_stats (struct net_device *dev); @@ -994,10 +996,12 @@ int flashcard(struct net_device *dev, aironet_ioctl *comp); #endif /* CISCO_EXT */ #ifdef MICSUPPORT -static void micinit(struct airo_info *ai, MICRid *micr); -static void micsetup(struct airo_info *ai); +static void micinit(struct airo_info *ai); +static int micsetup(struct airo_info *ai); static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len); static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket, u16 payLen); + +#include #endif struct airo_info { @@ -1013,50 +1017,66 @@ int need_commit; // Need to set config char keyindex; // Used with auto wep char defindex; // Used with auto wep - struct timer_list timer; struct proc_dir_entry *proc_entry; struct airo_info *next; spinlock_t aux_lock; unsigned long flags; -#define FLAG_PROMISC IFF_PROMISC /* 0x100 - include/linux/if.h */ -#define FLAG_RADIO_OFF 0x02 /* User disabling of MAC */ -#define FLAG_RADIO_DOWN 0x08 /* ifup/ifdown disabling of MAC */ -#define FLAG_FLASHING 0x10 -#define FLAG_ADHOC 0x01 /* Needed by MIC */ -#define FLAG_MIC_CAPABLE 0x20 -#define FLAG_UPDATE_MULTI 0x40 -#define FLAG_UPDATE_UNI 0x80 -#define FLAG_802_11 0x200 -#define FLAG_PENDING_XMIT 0x400 -#define FLAG_PENDING_XMIT11 0x800 +#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_ADHOC 3 /* Needed by MIC */ +#define FLAG_MIC_CAPABLE 4 +#define FLAG_UPDATE_MULTI 5 +#define FLAG_UPDATE_UNI 6 +#define FLAG_802_11 7 +#define FLAG_PENDING_XMIT 9 +#define FLAG_PENDING_XMIT11 10 +#define FLAG_PCI 11 +#define JOB_MASK 0xff0000 +#define JOB_DIE 16 +#define JOB_XMIT 17 +#define JOB_XMIT11 18 +#define JOB_STATS 19 +#define JOB_PROMISC 20 +#define JOB_MIC 21 +#define JOB_EVENT 22 +#define JOB_AUTOWEP 23 int (*bap_read)(struct airo_info*, u16 *pu16Dst, int bytelen, int whichbap); unsigned short *flash; tdsRssiEntry *rssi; - struct semaphore sem; struct task_struct *task; - struct tq_struct stats_task; - struct tq_struct promisc_task; + struct semaphore sem; + pid_t thr_pid; + wait_queue_head_t thr_wait; + struct completion thr_exited; + unsigned long expires; struct { struct sk_buff *skb; int fid; - struct tq_struct task; } xmit, xmit11; struct net_device *wifidev; #ifdef WIRELESS_EXT struct iw_statistics wstats; // wireless stats unsigned long scan_timestamp; /* Time started to scan */ - struct tq_struct event_task; +#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 */ + struct crypto_tfm *tfm; mic_module mod[2]; mic_statistics micstats; - struct tq_struct mic_task; +#endif }; static inline int bap_read(struct airo_info *ai, u16 *pu16Dst, int bytelen, @@ -1070,7 +1090,463 @@ struct airo_info *apriv ); #ifdef MICSUPPORT -#include "mic.h" +/*********************************************************************** + * MIC ROUTINES * + *********************************************************************** + */ + +static int RxSeqValid (struct airo_info *ai,miccntx *context,int mcast,u32 micSeq); +static void MoveWindow(miccntx *context, u32 micSeq); +void emmh32_setseed(emmh32_context *context, u8 *pkey, int keylen, struct crypto_tfm *); +void emmh32_init(emmh32_context *context); +void emmh32_update(emmh32_context *context, u8 *pOctets, int len); +void emmh32_final(emmh32_context *context, u8 digest[4]); + +/* micinit - Initialize mic seed */ + +static void micinit(struct airo_info *ai) +{ + MICRid mic_rid; + + clear_bit(JOB_MIC, &ai->flags); + PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid), 0); + up(&ai->sem); + + ai->micstats.enabled = (mic_rid.state & 0x00FF) ? 1 : 0; + + if (ai->micstats.enabled) { + /* Key must be valid and different */ + if (mic_rid.multicastValid && (!ai->mod[0].mCtx.valid || + (memcmp (ai->mod[0].mCtx.key, mic_rid.multicast, + sizeof(ai->mod[0].mCtx.key)) != 0))) { + /* Age current mic Context */ + memcpy(&ai->mod[1].mCtx,&ai->mod[0].mCtx,sizeof(miccntx)); + /* Initialize new context */ + memcpy(&ai->mod[0].mCtx.key,mic_rid.multicast,sizeof(mic_rid.multicast)); + ai->mod[0].mCtx.window = 33; //Window always points to the middle + ai->mod[0].mCtx.rx = 0; //Rx Sequence numbers + ai->mod[0].mCtx.tx = 0; //Tx sequence numbers + ai->mod[0].mCtx.valid = 1; //Key is now valid + + /* Give key to mic seed */ + emmh32_setseed(&ai->mod[0].mCtx.seed,mic_rid.multicast,sizeof(mic_rid.multicast), ai->tfm); + } + + /* Key must be valid and different */ + if (mic_rid.unicastValid && (!ai->mod[0].uCtx.valid || + (memcmp(ai->mod[0].uCtx.key, mic_rid.unicast, + sizeof(ai->mod[0].uCtx.key)) != 0))) { + /* Age current mic Context */ + memcpy(&ai->mod[1].uCtx,&ai->mod[0].uCtx,sizeof(miccntx)); + /* Initialize new context */ + memcpy(&ai->mod[0].uCtx.key,mic_rid.unicast,sizeof(mic_rid.unicast)); + + ai->mod[0].uCtx.window = 33; //Window always points to the middle + ai->mod[0].uCtx.rx = 0; //Rx Sequence numbers + ai->mod[0].uCtx.tx = 0; //Tx sequence numbers + ai->mod[0].uCtx.valid = 1; //Key is now valid + + //Give key to mic seed + emmh32_setseed(&ai->mod[0].uCtx.seed, mic_rid.unicast, sizeof(mic_rid.unicast), ai->tfm); + } + } else { + /* So next time we have a valid key and mic is enabled, we will update + * the sequence number if the key is the same as before. + */ + ai->mod[0].uCtx.valid = 0; + ai->mod[0].mCtx.valid = 0; + } +} + +/* micsetup - Get ready for business */ + +static int micsetup(struct airo_info *ai) { + int i; + + if (ai->tfm == NULL) + ai->tfm = crypto_alloc_tfm("aes", 0); + + if (ai->tfm == NULL) { + printk(KERN_ERR "airo: failed to load transform for AES\n"); + return ERROR; + } + + for (i=0; i < NUM_MODULES; i++) { + memset(&ai->mod[i].mCtx,0,sizeof(miccntx)); + memset(&ai->mod[i].uCtx,0,sizeof(miccntx)); + } + return SUCCESS; +} + +char micsnap[]= {0xAA,0xAA,0x03,0x00,0x40,0x96,0x00,0x02}; + +/*=========================================================================== + * Description: Mic a packet + * + * Inputs: etherHead * pointer to an 802.3 frame + * + * Returns: BOOLEAN if successful, otherwise false. + * PacketTxLen will be updated with the mic'd packets size. + * + * Caveats: It is assumed that the frame buffer will already + * be big enough to hold the largets mic message possible. + * (No memory allocation is done here). + * + * Author: sbraneky (10/15/01) + * Merciless hacks by rwilcher (1/14/02) + */ + +static int encapsulate(struct airo_info *ai ,etherHead *frame, MICBuffer *mic, int payLen) +{ + miccntx *context; + + // Determine correct context + // If not adhoc, always use unicast key + + if (test_bit(FLAG_ADHOC, &ai->flags) && (frame->da[0] & 0x1)) + context = &ai->mod[0].mCtx; + else + context = &ai->mod[0].uCtx; + + if (!context->valid) + return ERROR; + + mic->typelen = htons(payLen + 16); //Length of Mic'd packet + + memcpy(&mic->u.snap, micsnap, sizeof(micsnap)); // Add Snap + + // Add Tx sequence + mic->seq = htonl(context->tx); + context->tx += 2; + + emmh32_init(&context->seed); // Mic the packet + emmh32_update(&context->seed,frame->da,ETH_ALEN * 2); // DA,SA + emmh32_update(&context->seed,(u8*)&mic->typelen,10); // Type/Length and Snap + emmh32_update(&context->seed,(u8*)&mic->seq,sizeof(mic->seq)); //SEQ + emmh32_update(&context->seed,frame->da + ETH_ALEN * 2,payLen); //payload + emmh32_final(&context->seed, (u8*)&mic->mic); + + /* New Type/length ?????????? */ + mic->typelen = 0; //Let NIC know it could be an oversized packet + return SUCCESS; +} + +typedef enum { + NONE, + NOMIC, + NOMICPLUMMED, + SEQUENCE, + INCORRECTMIC, +} mic_error; + +/*=========================================================================== + * Description: Decapsulates a MIC'd packet and returns the 802.3 packet + * (removes the MIC stuff) if packet is a valid packet. + * + * Inputs: etherHead pointer to the 802.3 packet + * + * Returns: BOOLEAN - TRUE if packet should be dropped otherwise FALSE + * + * Author: sbraneky (10/15/01) + * Merciless hacks by rwilcher (1/14/02) + *--------------------------------------------------------------------------- + */ + +static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *eth, u16 payLen) +{ + int i; + u32 micSEQ; + miccntx *context; + u8 digest[4]; + mic_error micError = NONE; + + // Check if the packet is a Mic'd packet + + if (!ai->micstats.enabled) { + //No Mic set or Mic OFF but we received a MIC'd packet. + if (memcmp ((u8*)eth + 14, micsnap, sizeof(micsnap)) == 0) { + ai->micstats.rxMICPlummed++; + return ERROR; + } + return SUCCESS; + } + + if (ntohs(mic->typelen) == 0x888E) + return SUCCESS; + + if (memcmp (mic->u.snap, micsnap, sizeof(micsnap)) != 0) { + // Mic enabled but packet isn't Mic'd + ai->micstats.rxMICPlummed++; + return ERROR; + } + + micSEQ = ntohl(mic->seq); //store SEQ as CPU order + + //At this point we a have a mic'd packet and mic is enabled + //Now do the mic error checking. + + //Receive seq must be odd + if ( (micSEQ & 1) == 0 ) { + ai->micstats.rxWrongSequence++; + return ERROR; + } + + for (i = 0; i < NUM_MODULES; i++) { + int mcast = eth->da[0] & 1; + //Determine proper context + context = mcast ? &ai->mod[i].mCtx : &ai->mod[i].uCtx; + + //Make sure context is valid + if (!context->valid) { + if (i == 0) + micError = NOMICPLUMMED; + continue; + } + //DeMic it + + if (!mic->typelen) + mic->typelen = htons(payLen + sizeof(MICBuffer) - 2); + + emmh32_init(&context->seed); + emmh32_update(&context->seed, eth->da, ETH_ALEN*2); + emmh32_update(&context->seed, (u8 *)&mic->typelen, sizeof(mic->typelen)+sizeof(mic->u.snap)); + emmh32_update(&context->seed, (u8 *)&mic->seq,sizeof(mic->seq)); + emmh32_update(&context->seed, eth->da + ETH_ALEN*2,payLen); + //Calculate MIC + emmh32_final(&context->seed, digest); + + if (memcmp(digest, &mic->mic, 4)) { //Make sure the mics match + //Invalid Mic + if (i == 0) + micError = INCORRECTMIC; + continue; + } + + //Check Sequence number if mics pass + if (RxSeqValid(ai, context, mcast, micSEQ) == SUCCESS) { + ai->micstats.rxSuccess++; + return SUCCESS; + } + if (i == 0) + micError = SEQUENCE; + } + + // Update statistics + switch (micError) { + case NOMICPLUMMED: ai->micstats.rxMICPlummed++; break; + case SEQUENCE: ai->micstats.rxWrongSequence++; break; + case INCORRECTMIC: ai->micstats.rxIncorrectMIC++; break; + case NONE: break; + case NOMIC: break; + } + return ERROR; +} + +/*=========================================================================== + * Description: Checks the Rx Seq number to make sure it is valid + * and hasn't already been received + * + * Inputs: miccntx - mic context to check seq against + * micSeq - the Mic seq number + * + * Returns: TRUE if valid otherwise FALSE. + * + * Author: sbraneky (10/15/01) + * Merciless hacks by rwilcher (1/14/02) + *--------------------------------------------------------------------------- + */ + +static int RxSeqValid (struct airo_info *ai,miccntx *context,int mcast,u32 micSeq) +{ + u32 seq,index; + + //Allow for the ap being rebooted - if it is then use the next + //sequence number of the current sequence number - might go backwards + + if (mcast) { + if (test_bit(FLAG_UPDATE_MULTI, &ai->flags)) { + clear_bit (FLAG_UPDATE_MULTI, &ai->flags); + context->window = (micSeq > 33) ? micSeq : 33; + context->rx = 0; // Reset rx + } + } else if (test_bit(FLAG_UPDATE_UNI, &ai->flags)) { + clear_bit (FLAG_UPDATE_UNI, &ai->flags); + context->window = (micSeq > 33) ? micSeq : 33; // Move window + context->rx = 0; // Reset rx + } + + //Make sequence number relative to START of window + seq = micSeq - (context->window - 33); + + //Too old of a SEQ number to check. + if ((u32)seq < 0) + return ERROR; + + if ( seq > 64 ) { + //Window is infinite forward + MoveWindow(context,micSeq); + return SUCCESS; + } + + // We are in the window. Now check the context rx bit to see if it was already sent + seq >>= 1; //divide by 2 because we only have odd numbers + index = 1 << seq; //Get an index number + + if (!(context->rx & index)) { + //micSEQ falls inside the window. + //Add seqence number to the list of received numbers. + context->rx |= index; + + MoveWindow(context,micSeq); + + return SUCCESS; + } + return ERROR; +} + +static void MoveWindow(miccntx *context, u32 micSeq) +{ + u32 shift; + + //Move window if seq greater than the middle of the window + if (micSeq > context->window) { + shift = (micSeq - context->window) >> 1; + + //Shift out old + if (shift < 32) + context->rx >>= shift; + else + context->rx = 0; + + context->window = micSeq; //Move window + } +} + +/*==============================================*/ +/*========== EMMH ROUTINES ====================*/ +/*==============================================*/ + +/* mic accumulate */ +#define MIC_ACCUM(val) \ + context->accum += (u64)(val) * context->coeff[coeff_position++]; + +static unsigned char aes_counter[16]; + +/* expand the key to fill the MMH coefficient array */ +void emmh32_setseed(emmh32_context *context, u8 *pkey, int keylen, struct crypto_tfm *tfm) +{ + /* take the keying material, expand if necessary, truncate at 16-bytes */ + /* run through AES counter mode to generate context->coeff[] */ + + int i,j; + u32 counter; + u8 *cipher, plain[16]; + struct scatterlist sg[1]; + + crypto_cipher_setkey(tfm, pkey, 16); + counter = 0; + for (i = 0; i < (sizeof(context->coeff)/sizeof(context->coeff[0])); ) { + aes_counter[15] = (u8)(counter >> 0); + aes_counter[14] = (u8)(counter >> 8); + aes_counter[13] = (u8)(counter >> 16); + aes_counter[12] = (u8)(counter >> 24); + counter++; + memcpy (plain, aes_counter, 16); + sg[0].page = virt_to_page(plain); + sg[0].offset = ((long) plain & ~PAGE_MASK); + sg[0].length = 16; + crypto_cipher_encrypt(tfm, sg, sg, 16); + cipher = kmap(sg[0].page) + sg[0].offset; + for (j=0; (j<16) && (i< (sizeof(context->coeff)/sizeof(context->coeff[0]))); ) { + context->coeff[i++] = ntohl(*(u32 *)&cipher[j]); + j += 4; + } + } +} + +/* prepare for calculation of a new mic */ +void emmh32_init(emmh32_context *context) +{ + /* prepare for new mic calculation */ + context->accum = 0; + context->position = 0; +} + +/* add some bytes to the mic calculation */ +void emmh32_update(emmh32_context *context, u8 *pOctets, int len) +{ + int coeff_position, byte_position; + + if (len == 0) return; + + coeff_position = context->position >> 2; + + /* deal with partial 32-bit word left over from last update */ + byte_position = context->position & 3; + if (byte_position) { + /* have a partial word in part to deal with */ + do { + if (len == 0) return; + context->part.d8[byte_position++] = *pOctets++; + context->position++; + len--; + } while (byte_position < 4); + MIC_ACCUM(htonl(context->part.d32)); + } + + /* deal with full 32-bit words */ + while (len >= 4) { + MIC_ACCUM(htonl(*(u32 *)pOctets)); + context->position += 4; + pOctets += 4; + len -= 4; + } + + /* deal with partial 32-bit word that will be left over from this update */ + byte_position = 0; + while (len > 0) { + context->part.d8[byte_position++] = *pOctets++; + context->position++; + len--; + } +} + +/* mask used to zero empty bytes for final partial word */ +static u32 mask32[4] = { 0x00000000L, 0xFF000000L, 0xFFFF0000L, 0xFFFFFF00L }; + +/* calculate the mic */ +void emmh32_final(emmh32_context *context, u8 digest[4]) +{ + int coeff_position, byte_position; + u32 val; + + u64 sum, utmp; + s64 stmp; + + coeff_position = context->position >> 2; + + /* deal with partial 32-bit word left over from last update */ + byte_position = context->position & 3; + if (byte_position) { + /* have a partial word in part to deal with */ + val = htonl(context->part.d32); + MIC_ACCUM(val & mask32[byte_position]); /* zero empty bytes */ + } + + /* reduce the accumulated u64 to a 32-bit MIC */ + sum = context->accum; + stmp = (sum & 0xffffffffLL) - ((sum >> 32) * 15); + utmp = (stmp & 0xffffffffLL) - ((stmp >> 32) * 15); + sum = utmp & 0xffffffffLL; + if (utmp > 0x10000000fLL) + sum -= 15; + + val = (u32)sum; + digest[0] = (val>>24) & 0xFF; + digest[1] = (val>>16) & 0xFF; + digest[2] = (val>>8) & 0xFF; + digest[3] = val & 0xFF; +} #endif static int readBSSListRid(struct airo_info *ai, int first, @@ -1203,12 +1679,12 @@ ai->need_commit = 0; checkThrottle(ai); + cfgr = ai->config; + if ((cfgr.opmode & 0xFF) == MODE_STA_IBSS) - ai->flags |= FLAG_ADHOC; + set_bit(FLAG_ADHOC, &ai->flags); else - ai->flags &= ~FLAG_ADHOC; - - cfgr = ai->config; + clear_bit(FLAG_ADHOC, &ai->flags); for(s = &cfgr.len; s <= &cfgr.rtsThres; s++) *s = cpu_to_le16(*s); @@ -1272,7 +1748,7 @@ struct airo_info *info = dev->priv; Resp rsp; - if (info->flags & FLAG_FLASHING) + if (test_bit(FLAG_FLASHING, &info->flags)) return -EIO; /* Make sure the card is configured. @@ -1286,7 +1762,7 @@ if (info->wifidev != dev) { /* Power on the MAC controller (which may have been disabled) */ - info->flags &= ~FLAG_RADIO_DOWN; + clear_bit(FLAG_RADIO_DOWN, &info->flags); enable_interrupts(info); } enable_MAC(info, &rsp, 1); @@ -1344,7 +1820,7 @@ } } -static void airo_do_xmit(struct net_device *dev) { +static void airo_end_xmit(struct net_device *dev) { u16 status; int i; struct airo_info *priv = dev->priv; @@ -1352,17 +1828,10 @@ int fid = priv->xmit.fid; u32 *fids = priv->fids; - if (down_trylock(&priv->sem) != 0) { - priv->flags |= FLAG_PENDING_XMIT; - netif_stop_queue(dev); - priv->xmit.task.routine = (void (*)(void *))airo_do_xmit; - priv->xmit.task.data = (void *)dev; - schedule_task(&priv->xmit.task); - return; - } + clear_bit(JOB_XMIT, &priv->flags); + clear_bit(FLAG_PENDING_XMIT, &priv->flags); status = transmit_802_3_packet (priv, fids[fid], skb->data); up(&priv->sem); - priv->flags &= ~FLAG_PENDING_XMIT; i = 0; if ( status == SUCCESS ) { @@ -1406,11 +1875,17 @@ fids[i] |= (len << 16); priv->xmit.skb = skb; priv->xmit.fid = i; - airo_do_xmit(dev); + if (down_trylock(&priv->sem) != 0) { + set_bit(FLAG_PENDING_XMIT, &priv->flags); + netif_stop_queue(dev); + set_bit(JOB_XMIT, &priv->flags); + wake_up_interruptible(&priv->thr_wait); + } else + airo_end_xmit(dev); return 0; } -static void airo_do_xmit11(struct net_device *dev) { +static void airo_end_xmit11(struct net_device *dev) { u16 status; int i; struct airo_info *priv = dev->priv; @@ -1418,17 +1893,10 @@ int fid = priv->xmit11.fid; u32 *fids = priv->fids; - if (down_trylock(&priv->sem) != 0) { - priv->flags |= FLAG_PENDING_XMIT11; - netif_stop_queue(dev); - priv->xmit11.task.routine = (void (*)(void *))airo_do_xmit11; - priv->xmit11.task.data = (void *)dev; - schedule_task(&priv->xmit11.task); - return; - } + clear_bit(JOB_XMIT11, &priv->flags); + clear_bit(FLAG_PENDING_XMIT11, &priv->flags); status = transmit_802_11_packet (priv, fids[fid], skb->data); up(&priv->sem); - priv->flags &= ~FLAG_PENDING_XMIT11; i = MAX_FIDS / 2; if ( status == SUCCESS ) { @@ -1472,7 +1940,13 @@ fids[i] |= (len << 16); priv->xmit11.skb = skb; priv->xmit11.fid = i; - airo_do_xmit11(dev); + if (down_trylock(&priv->sem) != 0) { + set_bit(FLAG_PENDING_XMIT11, &priv->flags); + netif_stop_queue(dev); + set_bit(JOB_XMIT11, &priv->flags); + wake_up_interruptible(&priv->thr_wait); + } else + airo_end_xmit11(dev); return 0; } @@ -1480,29 +1954,24 @@ StatsRid stats_rid; u32 *vals = stats_rid.vals; - if (down_trylock(&ai->sem) == 0) { - readStatsRid(ai, &stats_rid, RID_STATS, 0); - up(&ai->sem); + clear_bit(JOB_STATS, &ai->flags); + readStatsRid(ai, &stats_rid, RID_STATS, 0); + up(&ai->sem); - ai->stats.rx_packets = vals[43] + vals[44] + vals[45]; - ai->stats.tx_packets = vals[39] + vals[40] + vals[41]; - ai->stats.rx_bytes = vals[92]; - ai->stats.tx_bytes = vals[91]; - ai->stats.rx_errors = vals[0] + vals[2] + vals[3] + vals[4]; - ai->stats.tx_errors = vals[42] + ai->stats.tx_fifo_errors; - ai->stats.multicast = vals[43]; - ai->stats.collisions = vals[89]; - - /* detailed rx_errors: */ - ai->stats.rx_length_errors = vals[3]; - ai->stats.rx_crc_errors = vals[4]; - ai->stats.rx_frame_errors = vals[2]; - ai->stats.rx_fifo_errors = vals[0]; - } else { - ai->stats_task.routine = (void (*)(void *))airo_read_stats; - ai->stats_task.data = (void *)ai; - schedule_task(&ai->stats_task); - } + ai->stats.rx_packets = vals[43] + vals[44] + vals[45]; + ai->stats.tx_packets = vals[39] + vals[40] + vals[41]; + ai->stats.rx_bytes = vals[92]; + ai->stats.tx_bytes = vals[91]; + ai->stats.rx_errors = vals[0] + vals[2] + vals[3] + vals[4]; + ai->stats.tx_errors = vals[42] + ai->stats.tx_fifo_errors; + ai->stats.multicast = vals[43]; + ai->stats.collisions = vals[89]; + + /* detailed rx_errors: */ + ai->stats.rx_length_errors = vals[3]; + ai->stats.rx_crc_errors = vals[4]; + ai->stats.rx_frame_errors = vals[2]; + ai->stats.rx_fifo_errors = vals[0]; } struct net_device_stats *airo_get_stats(struct net_device *dev) @@ -1510,46 +1979,37 @@ struct airo_info *local = dev->priv; /* Get stats out of the card if available */ - airo_read_stats(local); + if (down_trylock(&local->sem) != 0) { + set_bit(JOB_STATS, &local->flags); + wake_up_interruptible(&local->thr_wait); + } else + airo_read_stats(local); return &local->stats; } -static void airo_end_promisc(struct airo_info *ai) { - Resp rsp; - - if ((IN4500(ai, EVSTAT) & EV_CMD) != 0) { - completecommand(ai, &rsp); - up(&ai->sem); - } else { - ai->promisc_task.routine = (void (*)(void *))airo_end_promisc; - ai->promisc_task.data = (void *)ai; - schedule_task(&ai->promisc_task); - } -} - static void airo_set_promisc(struct airo_info *ai) { Cmd cmd; + Resp rsp; - if (down_trylock(&ai->sem) == 0) { - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd=CMD_SETMODE; - cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC; - sendcommand(ai, &cmd); - airo_end_promisc(ai); - } else { - ai->promisc_task.routine = (void (*)(void *))airo_set_promisc; - ai->promisc_task.data = (void *)ai; - schedule_task(&ai->promisc_task); - } + memset(&cmd, 0, sizeof(cmd)); + cmd.cmd=CMD_SETMODE; + clear_bit(JOB_PROMISC, &ai->flags); + cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC; + issuecommand(ai, &cmd, &rsp); + up(&ai->sem); } static void airo_set_multicast_list(struct net_device *dev) { struct airo_info *ai = dev->priv; if ((dev->flags ^ ai->flags) & IFF_PROMISC) { - ai->flags ^= IFF_PROMISC; - airo_set_promisc(ai); + change_bit(FLAG_PROMISC, &ai->flags); + if (down_trylock(&ai->sem) != 0) { + set_bit(JOB_PROMISC, &ai->flags); + wake_up_interruptible(&ai->thr_wait); + } else + airo_set_promisc(ai); } if ((dev->flags&IFF_ALLMULTI)||dev->mc_count>0) { @@ -1563,6 +2023,7 @@ struct sockaddr *addr = p; Resp rsp; + readConfigRid(ai, 1); memcpy (ai->config.macAddr, addr->sa_data, dev->addr_len); ai->need_commit = 1; disable_MAC(ai, 1); @@ -1595,7 +2056,7 @@ * That's the method that is most friendly towards the network * stack (i.e. the network stack won't try to broadcast * anything on the interface and routes are gone. Jean II */ - ai->flags |= FLAG_RADIO_DOWN; + set_bit(FLAG_RADIO_DOWN, &ai->flags); disable_MAC(ai, 1); #endif disable_interrupts( ai ); @@ -1608,13 +2069,8 @@ void stop_airo_card( struct net_device *dev, int freeres ) { struct airo_info *ai = dev->priv; - flush_scheduled_tasks(); disable_interrupts(ai); free_irq( dev->irq, dev ); - if (ai->flash) - kfree(ai->flash); - if (ai->rssi) - kfree(ai->rssi); takedown_proc_entry( dev, ai ); if (ai->registered) { unregister_netdev( dev ); @@ -1625,11 +2081,21 @@ } ai->registered = 0; } - if (auto_wep) del_timer_sync(&ai->timer); + set_bit(JOB_DIE, &ai->flags); + kill_proc(ai->thr_pid, SIGTERM, 1); + wait_for_completion(&ai->thr_exited); + if (ai->flash) + kfree(ai->flash); + if (ai->rssi) + kfree(ai->rssi); if (freeres) { /* PCMCIA frees this stuff, so only for PCI and ISA */ release_region( dev->base_addr, 64 ); } +#ifdef MICSUPPORT + if (ai->tfm) + crypto_free_tfm(ai->tfm); +#endif del_airo_dev( dev ); kfree( dev ); } @@ -1726,9 +2192,17 @@ sema_init(&ai->sem, 1); ai->need_commit = 0; ai->config.len = 0; + init_waitqueue_head (&ai->thr_wait); + init_completion (&ai->thr_exited); + ai->thr_pid = kernel_thread(airo_thread, dev, CLONE_FS | CLONE_FILES); + if (ai->thr_pid < 0) + goto err_out_free; +#ifdef MICSUPPORT + ai->tfm = NULL; +#endif rc = add_airo_dev( dev ); if (rc) - goto err_out_free; + goto err_out_thr; /* The Airo-specific entries in the device structure. */ dev->hard_start_xmit = &airo_start_xmit; @@ -1768,7 +2242,7 @@ } } else { ai->bap_read = fast_bap_read; - ai->flags |= FLAG_FLASHING; + set_bit(FLAG_FLASHING, &ai->flags); } rc = register_netdev(dev); @@ -1799,6 +2273,10 @@ free_irq(dev->irq, dev); err_out_unlink: del_airo_dev(dev); +err_out_thr: + set_bit(JOB_DIE, &ai->flags); + kill_proc(ai->thr_pid, SIGTERM, 1); + wait_for_completion(&ai->thr_exited); err_out_free: kfree(dev); return NULL; @@ -1862,38 +2340,108 @@ union iwreq_data wrqu; StatusRid status_rid; - if (down_trylock(&ai->sem) == 0) { - PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid), 0); - up(&ai->sem); - wrqu.data.length = 0; - wrqu.data.flags = 0; - memcpy(wrqu.ap_addr.sa_data, status_rid.bssid[0], ETH_ALEN); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; + clear_bit(JOB_EVENT, &ai->flags); + PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid), 0); + up(&ai->sem); + wrqu.data.length = 0; + wrqu.data.flags = 0; + memcpy(wrqu.ap_addr.sa_data, status_rid.bssid[0], ETH_ALEN); + wrqu.ap_addr.sa_family = ARPHRD_ETHER; - /* Send event to user space */ - wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); - } else { - ai->event_task.routine = (void (*)(void *))airo_send_event; - ai->event_task.data = (void *)dev; - schedule_task(&ai->event_task); - } + /* Send event to user space */ + wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL); } #endif -static void airo_read_mic(struct airo_info *ai) { - MICRid mic_rid; +static int airo_thread(void *data) { + struct net_device *dev = data; + struct airo_info *ai = dev->priv; + int locked; + + daemonize(); + reparent_to_init(); + spin_lock_irq(¤t->sigmask_lock); + sigemptyset(¤t->blocked); + recalc_sigpending(current); + spin_unlock_irq(¤t->sigmask_lock); + + strncpy (current->comm, dev->name, sizeof(current->comm) - 1); + current->comm[sizeof(current->comm) - 1] = '\0'; + + while(1) { + if (signal_pending(current)) { + spin_lock_irq(¤t->sigmask_lock); + flush_signals(current); + spin_unlock_irq(¤t->sigmask_lock); + } - if (down_trylock(&ai->sem) == 0) { - PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid), 0); - up(&ai->sem); + if (test_bit(JOB_DIE, &ai->flags)) + break; + + if (ai->flags & JOB_MASK) { + locked = down_interruptible(&ai->sem); + } else { + wait_queue_t wait; + + init_waitqueue_entry(&wait, current); + add_wait_queue(&ai->thr_wait, &wait); + for (;;) { + set_current_state(TASK_INTERRUPTIBLE); + if (ai->flags & JOB_MASK) + break; + if (ai->expires) { + if (time_after_eq(jiffies,ai->expires)){ + set_bit(JOB_AUTOWEP,&ai->flags); + break; + } + if (!signal_pending(current)) { + schedule_timeout(ai->expires - jiffies); + continue; + } + } else if (!signal_pending(current)) { + schedule(); + continue; + } + break; + } + current->state = TASK_RUNNING; + remove_wait_queue(&ai->thr_wait, &wait); + locked = 1; + } + + if (locked) + continue; + + if (test_bit(JOB_DIE, &ai->flags)) { + up(&ai->sem); + break; + } + + if (test_bit(FLAG_FLASHING, &ai->flags)) { + up(&ai->sem); + continue; + } + + if (test_bit(JOB_XMIT, &ai->flags)) + airo_end_xmit(dev); + else if (test_bit(JOB_XMIT11, &ai->flags)) + airo_end_xmit11(dev); + else if (test_bit(JOB_STATS, &ai->flags)) + airo_read_stats(ai); + else if (test_bit(JOB_PROMISC, &ai->flags)) + airo_set_promisc(ai); #ifdef MICSUPPORT - micinit (ai, &mic_rid); + else if (test_bit(JOB_MIC, &ai->flags)) + micinit(ai); #endif - } else { - ai->mic_task.routine = (void (*)(void *))airo_read_mic; - ai->mic_task.data = (void *)ai; - schedule_task(&ai->mic_task); +#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); } + complete_and_exit (&ai->thr_exited, 0); } static void airo_interrupt ( int irq, void* dev_id, struct pt_regs *regs) { @@ -1922,8 +2470,15 @@ if ( status & EV_MIC ) { OUT4500( apriv, EVACK, EV_MIC ); - if (apriv->flags & FLAG_MIC_CAPABLE) - airo_read_mic( apriv ); +#ifdef MICSUPPORT + if (test_bit(FLAG_MIC_CAPABLE, &apriv->flags)) { + if (down_trylock(&apriv->sem) != 0) { + set_bit(JOB_MIC, &apriv->flags); + wake_up_interruptible(&apriv->thr_wait); + } else + micinit (apriv); + } +#endif } if ( status & EV_LINK ) { #if WIRELESS_EXT > 13 @@ -1965,15 +2520,18 @@ #define RC_NOAUTH 9 /* Station requesting (Re)Association is not Authenticated with the responding station */ if (newStatus != ASSOCIATED) { - if (auto_wep && !timer_pending(&apriv->timer)) { - apriv->timer.expires = RUN_AT(HZ*3); - add_timer(&apriv->timer); + if (auto_wep && !apriv->expires) { + apriv->expires = RUN_AT(3*HZ); + wake_up_interruptible(&apriv->thr_wait); } } else { struct task_struct *task = apriv->task; + if (auto_wep) + apriv->expires = 0; if (task) wake_up_process (task); - apriv->flags|=FLAG_UPDATE_UNI|FLAG_UPDATE_MULTI; + set_bit(FLAG_UPDATE_UNI, &apriv->flags); + set_bit(FLAG_UPDATE_MULTI, &apriv->flags); } #if WIRELESS_EXT > 13 /* Question : is ASSOCIATED the only status @@ -1994,7 +2552,11 @@ wireless_send_event(dev, SIOCGIWSCAN, &wrqu, NULL); apriv->scan_timestamp = 0; } - airo_send_event(dev); + if (down_trylock(&apriv->sem) != 0) { + set_bit(JOB_EVENT, &apriv->flags); + wake_up_interruptible(&apriv->thr_wait); + } else + airo_send_event(dev); } else { memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN); wrqu.ap_addr.sa_family = ARPHRD_ETHER; @@ -2025,7 +2587,7 @@ fid = IN4500( apriv, RXFID ); /* Get the packet length */ - if (apriv->flags & FLAG_802_11) { + if (test_bit(FLAG_802_11, &apriv->flags)) { bap_setup (apriv, fid, 4, BAP0); bap_read (apriv, (u16*)&hdr, sizeof(hdr), BAP0); /* Bad CRC. Ignore packet */ @@ -2041,145 +2603,151 @@ if (len > 2312) { printk( KERN_ERR "airo: Bad size %d\n", len ); - len = 0; + goto badrx; } - if (len) { - if (apriv->flags & FLAG_802_11) { - bap_read (apriv, (u16*)&fc, sizeof(fc), BAP0); - fc = le16_to_cpu(fc); - switch (fc & 0xc) { - case 4: - if ((fc & 0xe0) == 0xc0) - hdrlen = 10; - else - hdrlen = 16; - break; - case 8: - if ((fc&0x300)==0x300){ - hdrlen = 30; - break; - } - default: - hdrlen = 24; - } - } else - hdrlen = ETH_ALEN * 2; + if (len == 0) + goto badrx; - skb = dev_alloc_skb( len + hdrlen + 2 ); - if ( !skb ) { - apriv->stats.rx_dropped++; - len = 0; - } - } - if (len) { - buffer = (u16*)skb_put (skb, len + hdrlen); - if (apriv->flags & FLAG_802_11) { - buffer[0] = fc; - bap_read (apriv, buffer + 1, hdrlen - 2, BAP0); - if (hdrlen == 24) - bap_read (apriv, tmpbuf, 6, BAP0); - - bap_read (apriv, &gap, sizeof(gap), BAP0); - gap = le16_to_cpu(gap); - if (gap) { - if (gap <= 8) - bap_read (apriv, tmpbuf, gap, BAP0); + if (test_bit(FLAG_802_11, &apriv->flags)) { + bap_read (apriv, (u16*)&fc, sizeof(fc), BAP0); + fc = le16_to_cpu(fc); + switch (fc & 0xc) { + case 4: + if ((fc & 0xe0) == 0xc0) + hdrlen = 10; else - printk(KERN_ERR "airo: gaplen too big. Problems will follow...\n"); - } + hdrlen = 16; + break; + case 8: + if ((fc&0x300)==0x300){ + hdrlen = 30; + break; + } + default: + hdrlen = 24; + } + } else + hdrlen = ETH_ALEN * 2; + skb = dev_alloc_skb( len + hdrlen + 2 ); + if ( !skb ) { + apriv->stats.rx_dropped++; + goto badrx; + } + buffer = (u16*)skb_put (skb, len + hdrlen); + if (test_bit(FLAG_802_11, &apriv->flags)) { + buffer[0] = fc; + bap_read (apriv, buffer + 1, hdrlen - 2, BAP0); + if (hdrlen == 24) + bap_read (apriv, tmpbuf, 6, BAP0); + + bap_read (apriv, &gap, sizeof(gap), BAP0); + gap = le16_to_cpu(gap); + if (gap) { + if (gap <= 8) + bap_read (apriv, tmpbuf, gap, BAP0); + else + printk(KERN_ERR "airo: gaplen too big. Problems will follow...\n"); + } + bap_read (apriv, buffer + hdrlen/2, len, BAP0); + } else { +#ifdef MICSUPPORT + MICBuffer micbuf; +#endif + bap_read (apriv, buffer, ETH_ALEN*2, BAP0); +#ifdef MICSUPPORT + if (apriv->micstats.enabled) { + bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0); + if (ntohs(micbuf.typelen) > 0x05DC) + bap_setup (apriv, fid, 0x44, BAP0); + else { + if (len <= sizeof(micbuf)) + goto badmic; - bap_read (apriv, buffer + hdrlen/2, len, BAP0); - } else { - MICBuffer micbuf; - bap_read (apriv, buffer, ETH_ALEN*2, BAP0); - if (apriv->micstats.enabled) { - bap_read (apriv,(u16*)&micbuf,sizeof(micbuf),BAP0); - if (ntohs(micbuf.typelen) > 0x05DC) - bap_setup (apriv, fid, 0x44, BAP0); - else { - len -= sizeof(micbuf); - if (len < 48) - len = 48; - skb_trim (skb, len + hdrlen); - } + len -= sizeof(micbuf); + skb_trim (skb, len + hdrlen); } - bap_read(apriv,buffer+ETH_ALEN,len,BAP0); + } +#endif + bap_read(apriv,buffer+ETH_ALEN,len,BAP0); #ifdef MICSUPPORT - if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) { - dev_kfree_skb_irq (skb); - len = 0; - } + if (decapsulate(apriv,&micbuf,(etherHead*)buffer,len)) { +badmic: + dev_kfree_skb_irq (skb); +#else + if (0) { #endif +badrx: + OUT4500( apriv, EVACK, EV_RX); + goto exitrx; } } - if (len) { #if WIRELESS_EXT > 15 #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ - if (apriv->spy_data.spy_number > 0) { - char *sa; - struct iw_quality wstats; - /* Prepare spy data : addr + qual */ - sa = (char*)buffer + ((apriv->flags & FLAG_802_11) ? 10 : 6); - if (!(apriv->flags & FLAG_802_11)) { - bap_setup (apriv, fid, 8, BAP0); - bap_read (apriv, (u16*)hdr.rssi, 2, BAP0); - } - wstats.qual = hdr.rssi[0]; - if (apriv->rssi) - wstats.level = 0x100 - apriv->rssi[hdr.rssi[1]].rssidBm; - else - wstats.level = (hdr.rssi[1] + 321) / 2; - wstats.updated = 3; - /* Update spy records */ - wireless_spy_update(dev, sa, &wstats); - } + if (apriv->spy_data.spy_number > 0) { + char *sa; + struct iw_quality wstats; + /* Prepare spy data : addr + qual */ + if (!test_bit(FLAG_802_11, &apriv->flags)) { + sa = (char*)buffer + 6; + bap_setup (apriv, fid, 8, BAP0); + bap_read (apriv, (u16*)hdr.rssi, 2, BAP0); + } else + sa = (char*)buffer + 10; + wstats.qual = hdr.rssi[0]; + if (apriv->rssi) + wstats.level = 0x100 - apriv->rssi[hdr.rssi[1]].rssidBm; + else + wstats.level = (hdr.rssi[1] + 321) / 2; + wstats.updated = 3; + /* Update spy records */ + 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 + ((apriv->flags & FLAG_802_11) ? 10 : 6); - - for (i=0; ispy_number; i++) - if (!memcmp(sa,apriv->spy_address[i],ETH_ALEN)) - { - if (!(apriv->flags & FLAG_802_11)) { - 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; + 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); + OUT4500( apriv, EVACK, EV_RX); - if (apriv->flags & FLAG_802_11) { - skb->mac.raw = skb->data; - skb->pkt_type = PACKET_OTHERHOST; - skb->dev = apriv->wifidev; - skb->protocol = htons(ETH_P_802_2); - } else { - skb->dev = dev; - skb->protocol = eth_type_trans(skb,dev); - } - skb->dev->last_rx = jiffies; - skb->ip_summed = CHECKSUM_NONE; + if (test_bit(FLAG_802_11, &apriv->flags)) { + skb->mac.raw = skb->data; + skb->pkt_type = PACKET_OTHERHOST; + skb->dev = apriv->wifidev; + skb->protocol = htons(ETH_P_802_2); + } else { + skb->dev = dev; + skb->protocol = eth_type_trans(skb,dev); + } + skb->dev->last_rx = jiffies; + skb->ip_summed = CHECKSUM_NONE; - netif_rx( skb ); - } else - OUT4500( apriv, EVACK, EV_RX); + netif_rx( skb ); } +exitrx: /* Check to see if a packet has been transmitted */ if ( status & ( EV_TX|EV_TXEXC ) ) { @@ -2202,10 +2770,10 @@ /* Set up to be used again */ apriv->fids[index] &= 0xffff; if (index < MAX_FIDS / 2) { - if (!(apriv->flags & FLAG_PENDING_XMIT)) + if (!test_bit(FLAG_PENDING_XMIT, &apriv->flags)) netif_wake_queue(dev); } else { - if (!(apriv->flags & FLAG_PENDING_XMIT11)) + if (!test_bit(FLAG_PENDING_XMIT11, &apriv->flags)) netif_wake_queue(apriv->wifidev); } } else { @@ -2265,7 +2833,7 @@ * instead of this flag, but I don't trust it *within* the * open/close functions, and testing both flags together is * "cheaper" - Jean II */ - if (ai->flags & (FLAG_RADIO_OFF|FLAG_RADIO_DOWN)) return SUCCESS; + if (ai->flags & FLAG_RADIO_MASK) return SUCCESS; memset(&cmd, 0, sizeof(cmd)); cmd.cmd = MAC_ENABLE; if (!lock) @@ -2384,12 +2952,15 @@ printk(KERN_WARNING "airo: unknown received signal level scale\n"); } ai->config.opmode = adhoc ? MODE_STA_IBSS : MODE_STA_ESS; + ai->config.authType = AUTH_OPEN; + ai->config.modulation = MOD_CCK; + ai->config._reserved1a[0] = 2; /* ??? */ #ifdef MICSUPPORT - if ((cap_rid.len==sizeof(cap_rid)) && (cap_rid.extSoftCap&1)) { + if ((cap_rid.len>=sizeof(cap_rid)) && (cap_rid.extSoftCap&1) && + (micsetup(ai) == SUCCESS)) { ai->config.opmode |= MODE_MIC; - ai->flags |= FLAG_MIC_CAPABLE; - micsetup(ai); + set_bit(FLAG_MIC_CAPABLE, &ai->flags); } #endif @@ -2430,6 +3001,7 @@ memcpy(mySsid.ssids[i].ssid, ssids[i], mySsid.ssids[i].len); } + mySsid.len = sizeof(mySsid); } status = writeConfigRid(ai, 1); @@ -2455,34 +3027,15 @@ rc = readWepKeyRid(ai, &wkr, 0); } while(lastindex != wkr.kindex); - if (auto_wep && !timer_pending(&ai->timer)) { - ai->timer.expires = RUN_AT(HZ*3); - add_timer(&ai->timer); + if (auto_wep) { + ai->expires = RUN_AT(3*HZ); + wake_up_interruptible(&ai->thr_wait); } - return SUCCESS; -} -static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) { - // Im really paranoid about letting it run forever! - int max_tries = 600000; - - if (sendcommand(ai, pCmd) == (u16)ERROR) - return ERROR; - - while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) { - if (!in_interrupt() && (max_tries & 255) == 0) - schedule(); - } - if ( max_tries == -1 ) { - printk( KERN_ERR - "airo: Max tries exceeded waiting for command\n" ); - return ERROR; - } - completecommand(ai, pRsp); return SUCCESS; } -static u16 sendcommand(struct airo_info *ai, Cmd *pCmd) { +static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) { // Im really paranoid about letting it run forever! int max_tries = 600000; u16 cmd; @@ -2501,10 +3054,16 @@ "airo: Max tries exceeded when issueing command\n" ); return ERROR; } - return SUCCESS; -} -static void completecommand(struct airo_info *ai, Resp *pRsp) { + while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) { + if (!in_interrupt() && (max_tries & 255) == 0) + schedule(); + } + if ( max_tries == -1 ) { + printk( KERN_ERR + "airo: Max tries exceeded waiting for command\n" ); + return ERROR; + } // command completed pRsp->status = IN4500(ai, STATUS); pRsp->rsp0 = IN4500(ai, RESP0); @@ -2517,6 +3076,8 @@ } // acknowledge processing the status/response OUT4500(ai, EVACK, EV_CMD); + + return SUCCESS; } /* Sets up the bap to start exchange data. whichbap should @@ -2803,7 +3364,7 @@ len -= ETH_ALEN * 2; #ifdef MICSUPPORT - if ((ai->flags & FLAG_MIC_CAPABLE) && ai->micstats.enabled && + if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled && (ntohs(((u16 *)pPacket)[6]) != 0x888E)) { if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS) return ERROR; @@ -3306,7 +3867,7 @@ if ((ai->config.rmode & 0xff) >= RXMODE_RFMON) ai->need_commit = 2; ai->config.rmode &= 0xfe00; - ai->flags &= ~FLAG_802_11; + clear_bit (FLAG_802_11, &ai->flags); ai->config.opmode &= 0xFF00; ai->config.scanMode = SCANMODE_ACTIVE; if ( line[0] == 'a' ) { @@ -3316,11 +3877,11 @@ if ( line[0] == 'r' ) { ai->config.rmode |= RXMODE_RFMON | RXMODE_DISABLE_802_3_HEADER; ai->config.scanMode = SCANMODE_PASSIVE; - ai->flags |= FLAG_802_11; + set_bit (FLAG_802_11, &ai->flags); } else if ( line[0] == 'y' ) { ai->config.rmode |= RXMODE_RFMON_ANYBSS | RXMODE_DISABLE_802_3_HEADER; ai->config.scanMode = SCANMODE_PASSIVE; - ai->flags |= FLAG_802_11; + set_bit (FLAG_802_11, &ai->flags); } else if ( line[0] == 'l' ) ai->config.rmode |= RXMODE_LANMON; } @@ -3331,9 +3892,9 @@ else if (!strncmp(line,"Radio: ", 7)) { line += 7; if (!strncmp(line,"off",3)) { - ai->flags |= FLAG_RADIO_OFF; + set_bit (FLAG_RADIO_OFF, &ai->flags); } else { - ai->flags &= ~FLAG_RADIO_OFF; + clear_bit (FLAG_RADIO_OFF, &ai->flags); } } /*** NodeName processing */ @@ -3537,7 +4098,7 @@ (ai->config.opmode & 0xFF) == 1 ? get_rmode(ai->config.rmode): (ai->config.opmode & 0xFF) == 2 ? "AP" : (ai->config.opmode & 0xFF) == 3 ? "AP RPTR" : "Error", - ai->flags&FLAG_RADIO_OFF ? "off" : "on", + test_bit(FLAG_RADIO_OFF, &ai->flags) ? "off" : "on", ai->config.nodeName, ai->config.powerSaveMode == 0 ? "CAM" : ai->config.powerSaveMode == 1 ? "PSP" : @@ -3615,6 +4176,8 @@ offset < data->writelen ) offset++; offset++; } + if (i) + SSID_rid.len = sizeof(SSID_rid); disable_MAC(ai, 1); writeSsidRid(ai, &SSID_rid); enable_MAC(ai, &rsp, 1); @@ -4004,23 +4567,14 @@ will switch WEP modes to see if that will help. If the card is associated we will check every minute to see if anything has changed. */ -static void timer_func( u_long data ) { - struct net_device *dev = (struct net_device*)data; +static void timer_func( struct net_device *dev ) { struct airo_info *apriv = dev->priv; - u16 linkstat = IN4500(apriv, LINKSTAT); Resp rsp; - if (!(apriv->flags & FLAG_FLASHING) && (linkstat != 0x400)) { /* We don't have a link so try changing the authtype */ - if (down_trylock(&apriv->sem) != 0) { - apriv->timer.expires = RUN_AT(1); - add_timer(&apriv->timer); - return; - } - - readConfigRid(apriv, 0); - disable_MAC(apriv, 0); - switch(apriv->config.authType) { + readConfigRid(apriv, 0); + disable_MAC(apriv, 0); + switch(apriv->config.authType) { case AUTH_ENCRYPT: /* So drop to OPEN */ apriv->config.authType = AUTH_OPEN; @@ -4039,16 +4593,15 @@ break; default: /* We'll escalate to SHAREDKEY */ apriv->config.authType = AUTH_SHAREDKEY; - } - apriv->need_commit = 1; - writeConfigRid(apriv, 0); - enable_MAC(apriv, &rsp, 0); - up(&apriv->sem); + } + apriv->need_commit = 1; + writeConfigRid(apriv, 0); + enable_MAC(apriv, &rsp, 0); + up(&apriv->sem); /* Schedule check to see if the change worked */ - apriv->timer.expires = RUN_AT(HZ*3); - add_timer(&apriv->timer); - } + clear_bit(JOB_AUTOWEP, &apriv->flags); + apriv->expires = RUN_AT(HZ*3); } static int add_airo_dev( struct net_device *dev ) { @@ -4056,15 +4609,6 @@ if ( !node ) return -ENOMEM; - if ( auto_wep ) { - struct airo_info *apriv=dev->priv; - struct timer_list *timer = &apriv->timer; - - timer->function = timer_func; - timer->data = (u_long)dev; - init_timer(timer); - } - node->dev = dev; node->next = airo_devices; airo_devices = node; @@ -4095,6 +4639,7 @@ return -ENODEV; pci_set_drvdata(pdev, dev); + set_bit (FLAG_PCI, &((struct airo_info *)dev->priv)->flags); return 0; } @@ -4106,7 +4651,7 @@ static int __init airo_init_module( void ) { - int i, rc = 0, have_isa_dev = 0; + int i, have_isa_dev = 0; airo_entry = create_proc_entry("aironet", S_IFDIR | airo_perm, @@ -4124,7 +4669,7 @@ #ifdef CONFIG_PCI printk( KERN_INFO "airo: Probing for PCI adapters\n" ); - rc = pci_module_init(&airo_driver); + pci_module_init(&airo_driver); printk( KERN_INFO "airo: Finished probing for PCI adapters\n" ); #endif @@ -4136,11 +4681,22 @@ static void __exit airo_cleanup_module( void ) { + int is_pci = 0; while( airo_devices ) { printk( KERN_INFO "airo: Unregistering %s\n", airo_devices->dev->name ); +#ifdef CONFIG_PCI + if (test_bit(FLAG_PCI, &((struct airo_info *)airo_devices->dev->priv)->flags)) + is_pci = 1; +#endif stop_airo_card( airo_devices->dev, 1 ); } remove_proc_entry("aironet", proc_root_driver); + + if (is_pci) { +#ifdef CONFIG_PCI + pci_unregister_driver(&airo_driver); +#endif + } } #ifdef WIRELESS_EXT @@ -4202,6 +4758,7 @@ printk(KERN_DEBUG "%s: New channel value of %d is invalid!\n", dev->name, fwrq->m); rc = -EINVAL; } else { + readConfigRid(local, 1); /* Yes ! We can set it !!! */ local->config.channelSet = (u16)(channel - 1); local->need_commit = 1; @@ -4222,6 +4779,7 @@ struct airo_info *local = dev->priv; StatusRid status_rid; /* Card status info */ + readConfigRid(local, 1); if ((local->config.opmode & 0xFF) == MODE_STA_ESS) status_rid.channel = local->config.channelSet; else @@ -4278,6 +4836,7 @@ 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); } /* Write it to the card */ disable_MAC(local, 1); @@ -4387,6 +4946,7 @@ if(dwrq->length > 16 + 1) { return -E2BIG; } + readConfigRid(local, 1); memset(local->config.nodeName, 0, sizeof(local->config.nodeName)); memcpy(local->config.nodeName, extra, dwrq->length); local->need_commit = 1; @@ -4405,6 +4965,7 @@ { struct airo_info *local = dev->priv; + readConfigRid(local, 1); strncpy(extra, local->config.nodeName, 16); extra[16] = '\0'; dwrq->length = strlen(extra) + 1; @@ -4461,6 +5022,7 @@ return -EINVAL; } + readConfigRid(local, 1); /* Now, check if we want a fixed or auto value */ if(vwrq->fixed == 0) { /* Fill all the rates up to this max rate */ @@ -4497,6 +5059,7 @@ vwrq->value = status_rid.currentXmitRate * 500000; /* If more than one rate, set auto */ + readConfigRid(local, 1); vwrq->fixed = (local->config.rates[1] == 0); return 0; @@ -4519,6 +5082,7 @@ if((rthr < 0) || (rthr > 2312)) { return -EINVAL; } + readConfigRid(local, 1); local->config.rtsThres = rthr; local->need_commit = 1; @@ -4536,6 +5100,7 @@ { struct airo_info *local = dev->priv; + readConfigRid(local, 1); vwrq->value = local->config.rtsThres; vwrq->disabled = (vwrq->value >= 2312); vwrq->fixed = 1; @@ -4561,6 +5126,7 @@ return -EINVAL; } fthr &= ~0x1; /* Get an even value - is it really needed ??? */ + readConfigRid(local, 1); local->config.fragThresh = (u16)fthr; local->need_commit = 1; @@ -4578,6 +5144,7 @@ { struct airo_info *local = dev->priv; + readConfigRid(local, 1); vwrq->value = local->config.fragThresh; vwrq->disabled = (vwrq->value >= 2312); vwrq->fixed = 1; @@ -4597,6 +5164,7 @@ struct airo_info *local = dev->priv; int commit = 1; + readConfigRid(local, 1); if ((local->config.rmode & 0xff) >= RXMODE_RFMON) commit = 2; @@ -4606,28 +5174,28 @@ local->config.opmode |= MODE_STA_IBSS; local->config.rmode &= 0xfe00; local->config.scanMode = SCANMODE_ACTIVE; - local->flags &= ~FLAG_802_11; + clear_bit (FLAG_802_11, &local->flags); break; case IW_MODE_INFRA: local->config.opmode &= 0xFF00; local->config.opmode |= MODE_STA_ESS; local->config.rmode &= 0xfe00; local->config.scanMode = SCANMODE_ACTIVE; - local->flags &= ~FLAG_802_11; + clear_bit (FLAG_802_11, &local->flags); break; case IW_MODE_MASTER: local->config.opmode &= 0xFF00; local->config.opmode |= MODE_AP; local->config.rmode &= 0xfe00; local->config.scanMode = SCANMODE_ACTIVE; - local->flags &= ~FLAG_802_11; + clear_bit (FLAG_802_11, &local->flags); break; case IW_MODE_REPEAT: local->config.opmode &= 0xFF00; local->config.opmode |= MODE_AP_RPTR; local->config.rmode &= 0xfe00; local->config.scanMode = SCANMODE_ACTIVE; - local->flags &= ~FLAG_802_11; + clear_bit (FLAG_802_11, &local->flags); break; case IW_MODE_MONITOR: local->config.opmode &= 0xFF00; @@ -4635,7 +5203,7 @@ local->config.rmode &= 0xfe00; local->config.rmode |= RXMODE_RFMON | RXMODE_DISABLE_802_3_HEADER; local->config.scanMode = SCANMODE_PASSIVE; - local->flags |= FLAG_802_11; + set_bit (FLAG_802_11, &local->flags); break; default: return -EINVAL; @@ -4656,6 +5224,7 @@ { struct airo_info *local = dev->priv; + readConfigRid(local, 1); /* If not managed, assume it's ad-hoc */ switch (local->config.opmode & 0xFF) { case MODE_STA_ESS: @@ -4692,6 +5261,7 @@ if(!(cap_rid.softCap & 2)) { return -EOPNOTSUPP; } */ + readConfigRid(local, 1); /* Basic checking: do we have a key to set ? * Note : with the new API, it's impossible to get a NULL pointer. @@ -4778,6 +5348,7 @@ if(!(cap_rid.softCap & 2)) { return -EOPNOTSUPP; } + readConfigRid(local, 1); /* Check encryption mode */ switch(local->config.authType) { case AUTH_ENCRYPT: @@ -4824,16 +5395,17 @@ readCapabilityRid(local, &cap_rid); if (vwrq->disabled) { - local->flags |= FLAG_RADIO_OFF; + set_bit (FLAG_RADIO_OFF, &local->flags); local->need_commit = 1; return -EINPROGRESS; /* Call commit handler */ } if (vwrq->flags != IW_TXPOW_MWATT) { return -EINVAL; } - local->flags &= ~FLAG_RADIO_OFF; + clear_bit (FLAG_RADIO_OFF, &local->flags); for (i = 0; cap_rid.txPowerLevels[i] && (i < 8); i++) if ((vwrq->value==cap_rid.txPowerLevels[i])) { + readConfigRid(local, 1); local->config.txPower = vwrq->value; local->need_commit = 1; rc = -EINPROGRESS; /* Call commit handler */ @@ -4853,9 +5425,10 @@ { struct airo_info *local = dev->priv; + readConfigRid(local, 1); vwrq->value = local->config.txPower; vwrq->fixed = 1; /* No power control */ - vwrq->disabled = (local->flags & FLAG_RADIO_OFF); + vwrq->disabled = test_bit(FLAG_RADIO_OFF, &local->flags); vwrq->flags = IW_TXPOW_MWATT; return 0; @@ -4876,6 +5449,7 @@ if(vwrq->disabled) { return -EINVAL; } + readConfigRid(local, 1); if(vwrq->flags & IW_RETRY_LIMIT) { if(vwrq->flags & IW_RETRY_MAX) local->config.longRetryLimit = vwrq->value; @@ -4910,6 +5484,7 @@ vwrq->disabled = 0; /* Can't be disabled */ + readConfigRid(local, 1); /* Note : by default, display the min retry number */ if((vwrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) { vwrq->flags = IW_RETRY_LIFETIME; @@ -5048,6 +5623,7 @@ { struct airo_info *local = dev->priv; + readConfigRid(local, 1); if (vwrq->disabled) { if ((local->config.rmode & 0xFF) >= RXMODE_RFMON) { return -EINVAL; @@ -5103,8 +5679,10 @@ char *extra) { struct airo_info *local = dev->priv; + int mode; - int mode = local->config.powerSaveMode; + readConfigRid(local, 1); + mode = local->config.powerSaveMode; if ((vwrq->disabled = (mode == POWERSAVE_CAM))) return 0; if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { @@ -5133,6 +5711,7 @@ { struct airo_info *local = dev->priv; + readConfigRid(local, 1); local->config.rssiThreshold = vwrq->disabled ? RSSI_DEFAULT : vwrq->value; local->need_commit = 1; @@ -5150,6 +5729,7 @@ { struct airo_info *local = dev->priv; + readConfigRid(local, 1); vwrq->value = local->config.rssiThreshold; vwrq->disabled = (vwrq->value == 0); vwrq->fixed = 1; @@ -5199,7 +5779,7 @@ & status_rid.bssid[i][2] & status_rid.bssid[i][3] & status_rid.bssid[i][4] - & status_rid.bssid[i][5])!=-1 && + & status_rid.bssid[i][5])!=0xff && (status_rid.bssid[i][0] | status_rid.bssid[i][1] | status_rid.bssid[i][2] @@ -5293,7 +5873,7 @@ capabilities = le16_to_cpu(list->cap); if(capabilities & (CAP_ESS | CAP_IBSS)) { if(capabilities & CAP_ESS) - iwe.u.mode = IW_MODE_INFRA; + iwe.u.mode = IW_MODE_MASTER; else iwe.u.mode = IW_MODE_ADHOC; current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_UINT_LEN); @@ -5505,10 +6085,14 @@ writeSsidRid(local, &SSID_rid); writeAPListRid(local, &APList_rid); } - writeConfigRid(local, 1); - enable_MAC(local, &rsp, 1); + if (down_interruptible(&local->sem)) + return -ERESTARTSYS; + writeConfigRid(local, 0); + enable_MAC(local, &rsp, 0); if (local->need_commit > 1) airo_set_promisc(local); + else + up(&local->sem); return 0; } @@ -5954,7 +6538,7 @@ /* Separate R/W functions bracket legality here */ - if ( com.command <= AIROGMICSTATS ) + if ( com.command <= AIRORRID ) rc = readrids(dev,&com); else if ( com.command >= AIROPCAP && com.command <= AIROPLEAPUSR ) rc = writerids(dev,&com); @@ -6044,9 +6628,10 @@ static int readrids(struct net_device *dev, aironet_ioctl *comp) { unsigned short ridcode; unsigned char *iobuf; + int len; struct airo_info *ai = dev->priv; - if (ai->flags & FLAG_FLASHING) + if (test_bit(FLAG_FLASHING, &ai->flags)) return -EIO; switch(comp->command) @@ -6071,11 +6656,14 @@ case AIROGSTAT: ridcode = RID_STATUS; break; case AIROGSTATSD32: ridcode = RID_STATSDELTA; break; case AIROGSTATSC32: ridcode = RID_STATS; break; +#ifdef MICSUPPORT case AIROGMICSTATS: if (copy_to_user(comp->data, &ai->micstats, min((int)comp->len,(int)sizeof(ai->micstats)))) return -EFAULT; return 0; +#endif + case AIRORRID: ridcode = comp->len; break; default: return -EINVAL; break; @@ -6089,9 +6677,12 @@ * then return it to the user * 9/22/2000 Honor user given length */ + if (comp->command == AIRORRID) + len = le16_to_cpu(*(unsigned short *)iobuf); /* Yuck! */ + else + len = comp->len; - if (copy_to_user(comp->data, iobuf, - min((int)comp->len, (int)RIDS_SIZE))) { + if (copy_to_user(comp->data, iobuf, min(len, (int)RIDS_SIZE))) { kfree (iobuf); return -EFAULT; } @@ -6114,7 +6705,7 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (ai->flags & FLAG_FLASHING) + if (test_bit(FLAG_FLASHING, &ai->flags)) return -EIO; ridcode = 0; @@ -6159,9 +6750,11 @@ PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDS_SIZE, 1); +#ifdef MICSUPPORT enabled = ai->micstats.enabled; memset(&ai->micstats,0,sizeof(ai->micstats)); ai->micstats.enabled = enabled; +#endif if (copy_to_user(comp->data, iobuf, min((int)comp->len, (int)RIDS_SIZE))) { @@ -6188,13 +6781,13 @@ if (comp->command == AIROPCFG) { ConfigRid *cfg = (ConfigRid *)iobuf; - if (ai->flags & FLAG_MIC_CAPABLE) + if (test_bit(FLAG_MIC_CAPABLE, &ai->flags)) cfg->opmode |= MODE_MIC; if ((cfg->opmode & 0xFF) == MODE_STA_IBSS) - ai->flags |= FLAG_ADHOC; + set_bit (FLAG_ADHOC, &ai->flags); else - ai->flags &= ~FLAG_ADHOC; + clear_bit (FLAG_ADHOC, &ai->flags); } if((*writer)(ai, ridcode, iobuf,comp->len,1)) { @@ -6305,7 +6898,7 @@ */ int setflashmode (struct airo_info *ai) { - ai->flags |= FLAG_FLASHING; + set_bit (FLAG_FLASHING, &ai->flags); OUT4500(ai, SWS0, FLASH_COMMAND); OUT4500(ai, SWS1, FLASH_COMMAND); @@ -6321,7 +6914,7 @@ schedule_timeout (HZ/2); /* 500ms delay */ if(!waitbusy(ai)) { - ai->flags &= ~FLAG_FLASHING; + clear_bit (FLAG_FLASHING, &ai->flags); printk(KERN_INFO "Waitbusy hang after setflash mode\n"); return -EIO; } @@ -6427,7 +7020,7 @@ set_current_state (TASK_UNINTERRUPTIBLE); schedule_timeout (HZ); /* Added 12/7/00 */ - ai->flags &= ~FLAG_FLASHING; + clear_bit (FLAG_FLASHING, &ai->flags); status = setup_card(ai, dev->dev_addr); for( i = 0; i < MAX_FIDS; i++ ) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/yellowfin.c linux-2.4.23-pre8/drivers/net/yellowfin.c --- linux-2.4.22/drivers/net/yellowfin.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/yellowfin.c 2003-10-22 22:48:31.000000000 +0000 @@ -867,8 +867,6 @@ /* Calculate the next Tx descriptor entry. */ entry = yp->cur_tx % TX_RING_SIZE; - yp->tx_skbuff[entry] = skb; - if (gx_fix) { /* Note: only works for paddable protocols e.g. IP. */ int cacheline_end = ((unsigned long)skb->data + skb->len) % 32; /* Fix GX chipset errata. */ @@ -885,6 +883,8 @@ return 0; } } + yp->tx_skbuff[entry] = skb; + #ifdef NO_TXSTATS yp->tx_ring[entry].addr = cpu_to_le32(pci_map_single(yp->pci_dev, skb->data, len, PCI_DMA_TODEVICE)); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/net/zorro8390.c linux-2.4.23-pre8/drivers/net/zorro8390.c --- linux-2.4.22/drivers/net/zorro8390.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/net/zorro8390.c 2003-10-22 22:49:05.000000000 +0000 @@ -0,0 +1,427 @@ +/* + * Amiga Linux/m68k and Linux/PPC Zorro NS8390 Ethernet Driver + * + * (C) Copyright 1998-2000 by some Elitist 680x0 Users(TM) + * + * --------------------------------------------------------------------------- + * + * This program is based on all the other NE2000 drivers for Linux + * + * --------------------------------------------------------------------------- + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of the Linux + * distribution for more details. + * + * --------------------------------------------------------------------------- + * + * The Ariadne II and X-Surf are Zorro-II boards containing Realtek RTL8019AS + * Ethernet Controllers. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "8390.h" + + +#define NE_BASE (dev->base_addr) +#define NE_CMD (0x00*2) +#define NE_DATAPORT (0x10*2) /* NatSemi-defined port window offset. */ +#define NE_RESET (0x1f*2) /* Issue a read to reset, a write to clear. */ +#define NE_IO_EXTENT (0x20*2) + +#define NE_EN0_ISR (0x07*2) +#define NE_EN0_DCFG (0x0e*2) + +#define NE_EN0_RSARLO (0x08*2) +#define NE_EN0_RSARHI (0x09*2) +#define NE_EN0_RCNTLO (0x0a*2) +#define NE_EN0_RXCR (0x0c*2) +#define NE_EN0_TXCR (0x0d*2) +#define NE_EN0_RCNTHI (0x0b*2) +#define NE_EN0_IMR (0x0f*2) + +#define NESM_START_PG 0x40 /* First page of TX buffer */ +#define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */ + + +#define WORDSWAP(a) ((((a)>>8)&0xff) | ((a)<<8)) + +#ifdef MODULE +static struct net_device *root_zorro8390_dev; +#endif + +static const struct card_info { + zorro_id id; + const char *name; + unsigned int offset; +} cards[] __initdata = { + { ZORRO_PROD_VILLAGE_TRONIC_ARIADNE2, "Ariadne II", 0x0600 }, + { ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF, "X-Surf", 0x8600 }, +}; + +static int __init zorro8390_probe(void); +static int __init zorro8390_init(struct net_device *dev, unsigned long board, + const char *name, unsigned long ioaddr); +static int zorro8390_open(struct net_device *dev); +static int zorro8390_close(struct net_device *dev); +static void zorro8390_reset_8390(struct net_device *dev); +static void zorro8390_get_8390_hdr(struct net_device *dev, + struct e8390_pkt_hdr *hdr, int ring_page); +static void zorro8390_block_input(struct net_device *dev, int count, + struct sk_buff *skb, int ring_offset); +static void zorro8390_block_output(struct net_device *dev, const int count, + const unsigned char *buf, + const int start_page); +static void __exit zorro8390_cleanup(void); + +static int __init zorro8390_probe(void) +{ + struct net_device *dev; + struct zorro_dev *z = NULL; + unsigned long board, ioaddr; + int err = -ENODEV; + int i; + + while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { + for (i = ARRAY_SIZE(cards)-1; i >= 0; i--) + if (z->id == cards[i].id) + break; + if (i < 0) + continue; + board = z->resource.start; + ioaddr = board+cards[i].offset; + dev = init_etherdev(0, 0); + SET_MODULE_OWNER(dev); + if (!dev) + return -ENOMEM; + if (!request_mem_region(ioaddr, NE_IO_EXTENT*2, dev->name)) { + kfree(dev); + continue; + } + if ((err = zorro8390_init(dev, board, cards[i].name, + ZTWO_VADDR(ioaddr)))) { + release_mem_region(ioaddr, NE_IO_EXTENT*2); + kfree(dev); + return err; + } + err = 0; + } + + if (err == -ENODEV) + printk("No Ariadne II or X-Surf ethernet card found.\n"); + return err; +} + +static int __init zorro8390_init(struct net_device *dev, unsigned long board, + const char *name, unsigned long ioaddr) +{ + int i; + unsigned char SA_prom[32]; + int start_page, stop_page; + static u32 zorro8390_offsets[16] = { + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, + 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, + }; + + /* Reset card. Who knows what dain-bramaged state it was left in. */ + { + unsigned long reset_start_time = jiffies; + + z_writeb(z_readb(ioaddr + NE_RESET), ioaddr + NE_RESET); + + while ((z_readb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0) + if (jiffies - reset_start_time > 2*HZ/100) { + printk(" not found (no reset ack).\n"); + return -ENODEV; + } + + z_writeb(0xff, ioaddr + NE_EN0_ISR); /* Ack all intr. */ + } + + /* Read the 16 bytes of station address PROM. + We must first initialize registers, similar to NS8390_init(eifdev, 0). + We can't reliably read the SAPROM address without this. + (I learned the hard way!). */ + { + struct { + u32 value; + u32 offset; + } program_seq[] = { + {E8390_NODMA+E8390_PAGE0+E8390_STOP, NE_CMD}, /* Select page 0*/ + {0x48, NE_EN0_DCFG}, /* Set byte-wide (0x48) access. */ + {0x00, NE_EN0_RCNTLO}, /* Clear the count regs. */ + {0x00, NE_EN0_RCNTHI}, + {0x00, NE_EN0_IMR}, /* Mask completion irq. */ + {0xFF, NE_EN0_ISR}, + {E8390_RXOFF, NE_EN0_RXCR}, /* 0x20 Set to monitor */ + {E8390_TXOFF, NE_EN0_TXCR}, /* 0x02 and loopback mode. */ + {32, NE_EN0_RCNTLO}, + {0x00, NE_EN0_RCNTHI}, + {0x00, NE_EN0_RSARLO}, /* DMA starting at 0x0000. */ + {0x00, NE_EN0_RSARHI}, + {E8390_RREAD+E8390_START, NE_CMD}, + }; + for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++) { + z_writeb(program_seq[i].value, ioaddr + program_seq[i].offset); + } + } + for (i = 0; i < 16; i++) { + SA_prom[i] = z_readb(ioaddr + NE_DATAPORT); + (void)z_readb(ioaddr + NE_DATAPORT); + } + + /* We must set the 8390 for word mode. */ + z_writeb(0x49, ioaddr + NE_EN0_DCFG); + start_page = NESM_START_PG; + stop_page = NESM_STOP_PG; + + dev->base_addr = ioaddr; + dev->irq = IRQ_AMIGA_PORTS; + + /* Install the Interrupt handler */ + 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]); +#endif + dev->dev_addr[i] = SA_prom[i]; + } + + printk("%s: %s at 0x%08lx, Ethernet Address " + "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, name, board, + dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], + dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); + + ei_status.name = name; + ei_status.tx_start_page = start_page; + ei_status.stop_page = stop_page; + ei_status.word16 = 1; + + ei_status.rx_start_page = start_page + TX_PAGES; + + ei_status.reset_8390 = &zorro8390_reset_8390; + ei_status.block_input = &zorro8390_block_input; + ei_status.block_output = &zorro8390_block_output; + ei_status.get_8390_hdr = &zorro8390_get_8390_hdr; + ei_status.reg_offset = zorro8390_offsets; + dev->open = &zorro8390_open; + dev->stop = &zorro8390_close; +#ifdef MODULE + ei_status.priv = (unsigned long)root_zorro8390_dev; + root_zorro8390_dev = dev; +#endif + NS8390_init(dev, 0); + return 0; +} + +static int zorro8390_open(struct net_device *dev) +{ + ei_open(dev); + return 0; +} + +static int zorro8390_close(struct net_device *dev) +{ + if (ei_debug > 1) + printk("%s: Shutting down ethercard.\n", dev->name); + ei_close(dev); + return 0; +} + +/* Hard reset the card. This used to pause for the same period that a + 8390 reset command required, but that shouldn't be necessary. */ +static void zorro8390_reset_8390(struct net_device *dev) +{ + unsigned long reset_start_time = jiffies; + + if (ei_debug > 1) + printk("resetting the 8390 t=%ld...", jiffies); + + z_writeb(z_readb(NE_BASE + NE_RESET), NE_BASE + NE_RESET); + + ei_status.txing = 0; + ei_status.dmaing = 0; + + /* This check _should_not_ be necessary, omit eventually. */ + while ((z_readb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0) + if (jiffies - reset_start_time > 2*HZ/100) { + printk("%s: ne_reset_8390() did not complete.\n", dev->name); + break; + } + z_writeb(ENISR_RESET, NE_BASE + NE_EN0_ISR); /* Ack intr. */ +} + +/* Grab the 8390 specific header. Similar to the block_input routine, but + we don't need to be concerned with ring wrap as the header will be at + the start of a page, so we optimize accordingly. */ + +static void zorro8390_get_8390_hdr(struct net_device *dev, + struct e8390_pkt_hdr *hdr, int ring_page) +{ + int nic_base = dev->base_addr; + int cnt; + short *ptrs; + + /* This *shouldn't* happen. If it does, it's the last thing you'll see */ + if (ei_status.dmaing) { + printk("%s: DMAing conflict in ne_get_8390_hdr " + "[DMAstat:%d][irqlock:%d].\n", dev->name, ei_status.dmaing, + ei_status.irqlock); + return; + } + + ei_status.dmaing |= 0x01; + z_writeb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD); + z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); + z_writeb(sizeof(struct e8390_pkt_hdr), nic_base + NE_EN0_RCNTLO); + z_writeb(0, nic_base + NE_EN0_RCNTHI); + z_writeb(0, nic_base + NE_EN0_RSARLO); /* On page boundary */ + z_writeb(ring_page, nic_base + NE_EN0_RSARHI); + z_writeb(E8390_RREAD+E8390_START, nic_base + NE_CMD); + + ptrs = (short*)hdr; + for (cnt = 0; cnt < (sizeof(struct e8390_pkt_hdr)>>1); cnt++) + *ptrs++ = z_readw(NE_BASE + NE_DATAPORT); + + z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr. */ + + hdr->count = WORDSWAP(hdr->count); + + ei_status.dmaing &= ~0x01; +} + +/* Block input and output, similar to the Crynwr packet driver. If you + are porting to a new ethercard, look at the packet driver source for hints. + The NEx000 doesn't share the on-board packet memory -- you have to put + the packet out through the "remote DMA" dataport using z_writeb. */ + +static void zorro8390_block_input(struct net_device *dev, int count, + struct sk_buff *skb, int ring_offset) +{ + int nic_base = dev->base_addr; + char *buf = skb->data; + short *ptrs; + int cnt; + + /* This *shouldn't* happen. If it does, it's the last thing you'll see */ + if (ei_status.dmaing) { + printk("%s: DMAing conflict in ne_block_input " + "[DMAstat:%d][irqlock:%d].\n", + dev->name, ei_status.dmaing, ei_status.irqlock); + return; + } + ei_status.dmaing |= 0x01; + z_writeb(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD); + z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); + z_writeb(count & 0xff, nic_base + NE_EN0_RCNTLO); + z_writeb(count >> 8, nic_base + NE_EN0_RCNTHI); + z_writeb(ring_offset & 0xff, nic_base + NE_EN0_RSARLO); + z_writeb(ring_offset >> 8, nic_base + NE_EN0_RSARHI); + z_writeb(E8390_RREAD+E8390_START, nic_base + NE_CMD); + ptrs = (short*)buf; + for (cnt = 0; cnt < (count>>1); cnt++) + *ptrs++ = z_readw(NE_BASE + NE_DATAPORT); + if (count & 0x01) + buf[count-1] = z_readb(NE_BASE + NE_DATAPORT); + + z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr. */ + ei_status.dmaing &= ~0x01; +} + +static void zorro8390_block_output(struct net_device *dev, int count, + const unsigned char *buf, + const int start_page) +{ + int nic_base = NE_BASE; + unsigned long dma_start; + short *ptrs; + int cnt; + + /* Round the count up for word writes. Do we need to do this? + What effect will an odd byte count have on the 8390? + I should check someday. */ + if (count & 0x01) + count++; + + /* This *shouldn't* happen. If it does, it's the last thing you'll see */ + if (ei_status.dmaing) { + printk("%s: DMAing conflict in ne_block_output." + "[DMAstat:%d][irqlock:%d]\n", dev->name, ei_status.dmaing, + ei_status.irqlock); + return; + } + ei_status.dmaing |= 0x01; + /* We should already be in page 0, but to be safe... */ + z_writeb(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD); + + z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); + + /* Now the normal output. */ + z_writeb(count & 0xff, nic_base + NE_EN0_RCNTLO); + z_writeb(count >> 8, nic_base + NE_EN0_RCNTHI); + z_writeb(0x00, nic_base + NE_EN0_RSARLO); + z_writeb(start_page, nic_base + NE_EN0_RSARHI); + + z_writeb(E8390_RWRITE+E8390_START, nic_base + NE_CMD); + ptrs = (short*)buf; + for (cnt = 0; cnt < count>>1; cnt++) + z_writew(*ptrs++, NE_BASE+NE_DATAPORT); + + dma_start = jiffies; + + while ((z_readb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0) + if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ + printk("%s: timeout waiting for Tx RDC.\n", dev->name); + zorro8390_reset_8390(dev); + NS8390_init(dev,1); + break; + } + + z_writeb(ENISR_RDC, nic_base + NE_EN0_ISR); /* Ack intr. */ + ei_status.dmaing &= ~0x01; + return; +} + +static void __exit zorro8390_cleanup(void) +{ +#ifdef MODULE + struct net_device *dev, *next; + + while ((dev = root_zorro8390_dev)) { + next = (struct net_device *)(ei_status.priv); + unregister_netdev(dev); + free_irq(IRQ_AMIGA_PORTS, dev); + release_mem_region(ZTWO_PADDR(dev->base_addr), NE_IO_EXTENT*2); + kfree(dev); + root_zorro8390_dev = next; + } +#endif +} + +module_init(zorro8390_probe); +module_exit(zorro8390_cleanup); + +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/pci/pci.c linux-2.4.23-pre8/drivers/pci/pci.c --- linux-2.4.22/drivers/pci/pci.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/pci/pci.c 2003-10-22 22:48:19.000000000 +0000 @@ -907,8 +907,12 @@ pcibios_set_master(dev); } +#ifndef HAVE_ARCH_PCI_MWI +/* This can be overridden by arch code. */ +u8 pci_cache_line_size = L1_CACHE_BYTES >> 2; + /** - * pdev_set_mwi - arch helper function for pcibios_set_mwi + * pci_generic_prep_mwi - helper function for pci_set_mwi * @dev: the PCI device for which MWI is enabled * * Helper function for implementation the arch-specific pcibios_set_mwi @@ -917,35 +921,34 @@ * * RETURNS: An appriopriate -ERRNO error value on eror, or zero for success. */ -int -pdev_set_mwi(struct pci_dev *dev) +static int +pci_generic_prep_mwi(struct pci_dev *dev) { - int rc = 0; - u8 cache_size; + u8 cacheline_size; - /* - * Looks like this is necessary to deal with on all architectures, - * even this %$#%$# N440BX Intel based thing doesn't get it right. - * Ie. having two NICs in the machine, one will have the cache - * line set at boot time, the other will not. - */ - pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &cache_size); - cache_size <<= 2; - if (cache_size != SMP_CACHE_BYTES) { - printk(KERN_WARNING "PCI: %s PCI cache line size set incorrectly (%i bytes) by BIOS/FW.\n", - dev->slot_name, cache_size); - if (cache_size > SMP_CACHE_BYTES) { - printk("PCI: %s cache line size too large - expecting %i.\n", dev->slot_name, SMP_CACHE_BYTES); - rc = -EINVAL; - } else { - printk("PCI: %s PCI cache line size corrected to %i.\n", dev->slot_name, SMP_CACHE_BYTES); - pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, - SMP_CACHE_BYTES >> 2); - } - } + if (!pci_cache_line_size) + return -EINVAL; /* The system doesn't support MWI. */ + + /* Validate current setting: the PCI_CACHE_LINE_SIZE must be + equal to or multiple of the right value. */ + pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &cacheline_size); + if (cacheline_size >= pci_cache_line_size && + (cacheline_size % pci_cache_line_size) == 0) + return 0; + + /* Write the correct value. */ + pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, pci_cache_line_size); + /* Read it back. */ + pci_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &cacheline_size); + if (cacheline_size == pci_cache_line_size) + return 0; - return rc; + printk(KERN_WARNING "PCI: cache line size of %d is not supported " + "by device %s\n", pci_cache_line_size << 2, dev->slot_name); + + return -EINVAL; } +#endif /* !HAVE_ARCH_PCI_MWI */ /** * pci_set_mwi - enables memory-write-invalidate PCI transaction @@ -966,7 +969,7 @@ #ifdef HAVE_ARCH_PCI_MWI rc = pcibios_set_mwi(dev); #else - rc = pdev_set_mwi(dev); + rc = pci_generic_prep_mwi(dev); #endif if (rc) @@ -1472,17 +1475,22 @@ u8 hdr_type; for (func = 0; func < 8; func++, temp->devfn++) { - if (func && !is_multi) /* not a multi-function device */ - continue; if (pci_read_config_byte(temp, PCI_HEADER_TYPE, &hdr_type)) continue; temp->hdr_type = hdr_type & 0x7f; dev = pci_scan_device(temp); - if (!dev) - continue; + if (!pcibios_scan_all_fns() && func == 0) { + if (!dev) + break; + } else { + if (!dev) + continue; + is_multi = 1; + } + pci_name_device(dev); - if (!func) { + if (!first_dev) { is_multi = hdr_type & 0x80; first_dev = dev; } @@ -1496,6 +1504,14 @@ /* Fix up broken headers */ pci_fixup_device(PCI_FIXUP_HEADER, dev); + + /* + * If this is a single function device + * don't scan past the first function. + */ + if (!is_multi) + break; + } return first_dev; } @@ -2148,7 +2164,6 @@ EXPORT_SYMBOL(pci_set_master); EXPORT_SYMBOL(pci_set_mwi); EXPORT_SYMBOL(pci_clear_mwi); -EXPORT_SYMBOL(pdev_set_mwi); EXPORT_SYMBOL(pci_set_dma_mask); EXPORT_SYMBOL(pci_dac_set_dma_mask); EXPORT_SYMBOL(pci_assign_resource); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/pci/pci.ids linux-2.4.23-pre8/drivers/pci/pci.ids --- linux-2.4.22/drivers/pci/pci.ids 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/pci/pci.ids 2003-10-22 22:48:59.000000000 +0000 @@ -1934,6 +1934,7 @@ 8001 Schizo PCI Bus Module a000 Ultra IIi a001 Ultra IIe + a801 Tomatillo PCI Bus Module 108f Systemsoft 1090 Encore Computer Corporation 1091 Intergraph Corporation @@ -2280,6 +2281,9 @@ 1006 MINI PCI type 3B Data Fax Modem 1007 Mini PCI 56k Winmodem 10b7 615c Mini PCI 56K Modem + 1700 Gigabit Ethernet Adapter + 10b7 0010 3Com 3C940 Gigabit LOM Ethernet Adapter + 10b7 0020 3Com 3C941 Gigabit LOM Ethernet Adapter 3390 3c339 TokenLink Velocity 3590 3c359 TokenLink Velocity XL 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B) @@ -3384,24 +3388,39 @@ 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64) 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS) 4200 Token Ring adapter - 4300 Gigabit Ethernet - 1148 9821 SK-9821 (1000Base-T single link) - 1148 9822 SK-9822 (1000Base-T dual link) - 1148 9841 SK-9841 (1000Base-LX single link) - 1148 9842 SK-9842 (1000Base-LX dual link) - 1148 9843 SK-9843 (1000Base-SX single link) - 1148 9844 SK-9844 (1000Base-SX dual link) - 1148 9861 SK-9861 (1000Base-SX VF45 single link) - 1148 9862 SK-9862 (1000Base-SX VF45 dual link) + 4300 SK-98xx Gigabit Ethernet Server Adapter + 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T) + 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link) + 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX) + 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link) + 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX) + 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link) + 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition) + 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link) # Information got from SysKonnekt - 1148 9871 SK-9871 (1000Base-ZX single link) + 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX) # Information got from SysKonnekt - 1148 9872 SK-9872 (1000Base-ZX dual link) - 1259 2970 AT-2970SX [Allied Telesyn] - 1259 2972 AT-2970T [Allied Telesyn] - 1259 2975 AT-2970SX [Allied Telesyn] - 1259 2977 AT-2970T [Allied Telesyn] - 4320 SK-98xx Gigabit Ethernet Server Adapter + 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) + 1259 2970 Allied Telesyn AT-2970SX Gigabit Ethernet Adapter + 1259 2971 Allied Telesyn AT-2970LX Gigabit Ethernet Adapter + 1259 2972 Allied Telesyn AT-2970TX Gigabit Ethernet Adapter + 1259 2973 Allied Telesyn AT-2971SX Gigabit Ethernet Adapter + 1259 2974 Allied Telesyn AT-2971T Gigabit Ethernet Adapter + 1259 2975 Allied Telesyn AT-2970SX/2SC Gigabit Ethernet Adapter + 1259 2976 Allied Telesyn AT-2970LX/2SC Gigabit Ethernet Adapter + 1259 2977 Allied Telesyn AT-2970TX/2TX Gigabit Ethernet Adapter + 4320 SK-98xx V2.0 Gigabit Ethernet Adapter + 1148 0121 Marvell RDK-8001 Adapter + 1148 0221 Marvell RDK-8002 Adapter + 1148 0321 Marvell RDK-8003 Adapter + 1148 0421 Marvell RDK-8004 Adapter + 1148 0621 Marvell RDK-8006 Adapter + 1148 0721 Marvell RDK-8007 Adapter + 1148 0821 Marvell RDK-8008 Adapter + 1148 0921 Marvell RDK-8009 Adapter + 1148 1121 Marvell RDK-8011 Adapter + 1148 1221 Marvell RDK-8012 Adapter + 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter @@ -3409,7 +3428,8 @@ 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter 1148 9521 SK-9521 10/100/1000Base-T Adapter - 4400 Gigabit Ethernet + 4400 SK-9Dxx Gigabit Ethernet Adapter + 4500 SK-9Mxx Gigabit Ethernet Adapter 1149 Win System Corporation 114a VMIC 5579 VMIPCI-5579 (Reflective Memory Card) @@ -3626,6 +3646,8 @@ 1340 DFE-690TXD CardBus PC Card 1561 DRP-32TXD Cardbus PC Card 4000 DL2K Ethernet + 4c00 Gigabit Ethernet Adapter + 1186 4c00 DGE-530T Gigabit Ethernet Adapter 1187 Advanced Technology Laboratories, Inc. 1188 Shima Seiki Manufacturing Ltd. 1189 Matsushita Electronics Co Ltd @@ -3703,6 +3725,8 @@ 11aa Actel 11ab Galileo Technology Ltd. 0146 GT-64010/64010A System Controller + 4320 Gigabit Ethernet Adapter + 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Adapter 4611 GT-64115 System Controller 4620 GT-64120/64120A/64121A System Controller 4801 GT-48001 @@ -4933,6 +4957,8 @@ 136f Applied Magic Inc 1370 ATL Products 1371 CNet Technology Inc + 434e GigaCard Network Adapter + 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L) 1373 Silicon Vision Inc 1374 Silicom Ltd 1375 Argosystems Inc @@ -5500,7 +5526,9 @@ 1166 1648 NetXtreme CIOB-E 1000Base-T 164d NetXtreme BCM5702FE Gigabit Ethernet 1653 NetXtreme BCM5705 Gigabit Ethernet + 1654 NetXtreme BCM5705 Gigabit Ethernet 165d NetXtreme BCM5705M Gigabit Ethernet + 165e NetXtreme BCM5705M Gigabit Ethernet 1696 NetXtreme BCM5782 Gigabit Ethernet 14e4 000d NetXtreme BCM5782 1000Base-T 169c NetXtreme BCM5788 Gigabit Ethernet @@ -5525,6 +5553,8 @@ 16c7 NetXtreme BCM5703 Gigabit Ethernet 14e4 0009 NetXtreme BCM5703 1000Base-T 14e4 000a NetXtreme BCM5703 1000Base-SX + 170d NetXtreme BCM5901 Gigabit Ethernet + 170e NetXtreme BCM5901 Gigabit Ethernet 4210 BCM4210 iLine10 HomePNA 2.0 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem 4212 BCM4212 v.90 56k modem @@ -6064,10 +6094,16 @@ 170c YottaYotta Inc. 172a Accelerated Encryption 1737 Linksys + 1032 Gigabit Network Adapter + 1737 0015 EG1032 v2 Instant Gigabit Network Adapter + 1064 Gigabit Network Adapter + 1737 0016 EG1064 v2 Instant Gigabit Network Adapter 173b Altima (nee Broadcom) 03e8 AC1000 Gigabit Ethernet + 03e9 AC1001 Gigabit Ethernet 03ea AC9100 Gigabit Ethernet 173b 0001 AC1002 + 03eb AC1003 Gigabit Ethernet 1743 Peppercon AG 8139 ROL/F-100 Fast Ethernet Adapter with ROL 174b PC Partner Limited diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/pci/quirks.c linux-2.4.23-pre8/drivers/pci/quirks.c --- linux-2.4.22/drivers/pci/quirks.c 2003-06-13 14:51:35.000000000 +0000 +++ linux-2.4.23-pre8/drivers/pci/quirks.c 2003-10-22 22:47:31.000000000 +0000 @@ -648,6 +648,62 @@ } /* + * On ASUS P4B boards, the SMBus PCI Device within the ICH2/4 southbridge + * is not activated. The myth is that Asus said that they do not want the + * users to be irritated by just another PCI Device in the Win98 device + * manager. (see the file prog/hotplug/README.p4b in the lm_sensors + * package 2.7.0 for details) + * + * The SMBus PCI Device can be activated by setting a bit in the ICH LPC + * bridge. Unfortunately, this device has no subvendor/subdevice ID. So it + * becomes necessary to do this tweak in two steps -- I've chosen the Host + * bridge as trigger. + */ + +static int __initdata asus_hides_smbus = 0; + +static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) +{ + if (likely(dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK)) + return; + + if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB) + switch(dev->subsystem_device) { + case 0x8070: /* P4B */ + case 0x8088: /* P4B533 */ + asus_hides_smbus = 1; + } + if ((dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) && + (dev->subsystem_device == 0x80b2)) /* P4PE */ + asus_hides_smbus = 1; + if ((dev->device == PCI_DEVICE_ID_INTEL_82850_HB) && + (dev->subsystem_device == 0x8030)) /* P4T533 */ + asus_hides_smbus = 1; + if ((dev->device == PCI_DEVICE_ID_INTEL_7205_0) && + (dev->subsystem_device == 0x8070)) /* P4G8X Deluxe */ + asus_hides_smbus = 1; + return; +} + +static void __init asus_hides_smbus_lpc(struct pci_dev *dev) +{ + u16 val; + + if (likely(!asus_hides_smbus)) + return; + + pci_read_config_word(dev, 0xF2, &val); + if (val & 0x8) { + pci_write_config_word(dev, 0xF2, val & (~0x8)); + pci_read_config_word(dev, 0xF2, &val); + if(val & 0x8) + printk(KERN_INFO "PCI: i801 SMBus device continues to play 'hide and seek'! 0x%x\n", val); + else + printk(KERN_INFO "PCI: Enabled i801 SMBus device\n"); + } +} + +/* * The main table of quirks. */ @@ -725,6 +781,16 @@ quirk_amd_8131_ioapic }, #endif + /* + * on Asus P4B boards, the i801SMBus device is disabled at startup. + */ + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845_HB, asus_hides_smbus_hostbridge }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_HB, asus_hides_smbus_hostbridge }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc }, + { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc }, + { 0 } }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/pcmcia/i82092.c linux-2.4.23-pre8/drivers/pcmcia/i82092.c --- linux-2.4.22/drivers/pcmcia/i82092.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/pcmcia/i82092.c 2003-10-22 22:49:55.000000000 +0000 @@ -26,7 +26,6 @@ #include "i82092aa.h" #include "i82365.h" -#include "cirrus.h" MODULE_LICENSE("GPL"); MODULE_AUTHOR("Red Hat, Inc. - Arjan Van De Ven "); @@ -44,15 +43,8 @@ subdevice:PCI_ANY_ID, class: 0, class_mask:0, - }, - { - vendor:PCI_VENDOR_ID_CIRRUS, - device:PCI_DEVICE_ID_CIRRUS_6729, - subvendor:PCI_ANY_ID, - subdevice:PCI_ANY_ID, - class: 0, class_mask:0, - }, - {} + }, + {} }; static struct pci_driver i82092aa_pci_drv = { @@ -98,18 +90,14 @@ void *info; /* to be passed to the handler */ struct pci_dev *dev; /* The PCI device for the socket */ - - int type; /* Type of socket */ -#define IS_I82092 0x0001 -#define IS_PD6729 0x0002 }; #define MAX_SOCKETS 4 static struct socket_info sockets[MAX_SOCKETS]; static int socket_count; /* shortcut */ -static int membase = -1; -static int isa_setup; +int membase = -1; +int isa_setup; MODULE_PARM(membase, "i"); MODULE_PARM(isa_setup, "i"); @@ -119,7 +107,6 @@ unsigned char configbyte; struct pci_dev *parent; int i; - int type; enter("i82092aa_pci_probe"); @@ -129,18 +116,7 @@ /* Since we have no memory BARs some firmware we may not have had PCI_COMMAND_MEM enabled, yet the device needs it. */ - - // pci_read_config_byte(dev, PCI_COMMAND, &configbyte); - if (dev->vendor == PCI_VENDOR_ID_CIRRUS) { - type = IS_PD6729; - configbyte = 0; /* always 2 sockets */ - printk(KERN_INFO "Cirrus PD6729 PCI to PCMCIA Bridge \n"); - } else { - type = IS_I82092; - pci_read_config_byte(dev, 0x40, &configbyte); /* PCI Configuration Control */ - printk(KERN_INFO "Intel I82092AA PCI to PCMCIA Bridge \n"); - } - + pci_read_config_byte(dev, PCI_COMMAND, &configbyte); if (!(configbyte | PCI_COMMAND_MEMORY)) { dprintk(KERN_DEBUG "Enabling PCI_COMMAND_MEMORY\n"); configbyte |= PCI_COMMAND_MEMORY; @@ -227,7 +203,6 @@ sockets[i].cap.map_size = 0x1000; sockets[i].cap.irq_mask = 0; sockets[i].cap.pci_irq = dev->irq; - sockets[i].type = type; /* Trick the resource code into doing the right thing... */ sockets[i].cap.cb_dev = dev; @@ -240,11 +215,10 @@ } } - if (type == IS_I82092) { - /* Now, specifiy that all interrupts are to be done as PCI interrupts */ - configbyte = 0xFF; /* bitmask, one bit per event, 1 = PCI interrupt, 0 = ISA interrupt */ - pci_write_config_byte(dev, 0x50, configbyte); /* PCI Interrupt Routing Register */ - } + /* Now, specifiy that all interrupts are to be done as PCI interrupts */ + configbyte = 0xFF; /* bitmask, one bit per event, 1 = PCI interrupt, 0 = ISA interrupt */ + pci_write_config_byte(dev, 0x50, configbyte); /* PCI Interrupt Routing Register */ + /* Register the interrupt handler */ dprintk(KERN_DEBUG "Requesting interrupt %i \n",dev->irq); @@ -266,7 +240,6 @@ enter("i82092aa_pci_remove"); free_irq(dev->irq, i82092aa_interrupt); - flush_scheduled_tasks(); leave("i82092aa_pci_remove"); } @@ -681,7 +654,6 @@ static int i82092aa_set_socket(unsigned int sock, socket_state_t *state) { unsigned char reg; - unsigned long flags; enter("i82092aa_set_socket"); @@ -768,26 +740,9 @@ /* now write the value and clear the (probably bogus) pending stuff by doing a dummy read*/ - spin_lock_irqsave(&port_lock,flags); - indirect_write(sock,I365_CSCINT,reg); (void)indirect_read(sock,I365_CSC); - if (sockets[sock].type == IS_PD6729) { - /* Configure PD6729 bridge for PCI interrupts */ - reg |= 0x30; /* management IRQ: PCI INTA = "irq 3" */ - indirect_write(sock,I365_CSCINT,reg); - (void)indirect_read(sock,I365_CSC); - - reg = indirect_read(sock,I365_INTCTL); - reg |= 0x03; /* card IRQ: PCI INTA = "irq 3" */ - indirect_write(sock,I365_INTCTL,reg); - - indirect_write(sock, PD67_EXT_INDEX, PD67_EXT_CTL_1); - indirect_write(sock, PD67_EXT_DATA, PD67_EC1_INV_MGMT_IRQ | PD67_EC1_INV_CARD_IRQ); - } - spin_unlock_irqrestore(&port_lock,flags); - leave("i82092aa_set_socket"); return 0; } @@ -813,10 +768,9 @@ io->speed = to_ns(ioctl & I365_IOCTL_WAIT(map)) ? 1 : 0; /* check this out later */ io->flags = 0; - io->flags |= (ioctl & I365_IOCTL_0WS(map)) ? MAP_0WS : 0; - io->flags |= (ioctl & I365_IOCTL_16BIT(map)) ? MAP_16BIT : 0; - io->flags |= (ioctl & I365_IOCTL_IOCS16(map)) ? MAP_AUTOSZ : 0; - + if (addr & I365_IOCTL_16BIT(map)) + io->flags |= MAP_AUTOSZ; + leave("i82092aa_get_io_map"); return 0; } @@ -834,7 +788,7 @@ leave("i82092aa_set_io_map with invalid map"); return -EINVAL; } - if (io->start > 0xffff || io->stop > 0xffff || io->stop < io->start){ + if ((io->start > 0xffff) || (io->stop > 0xffff) || (io->stop < io->start)){ leave("i82092aa_set_io_map with invalid io"); return -EINVAL; } @@ -851,10 +805,9 @@ ioctl = indirect_read(sock,I365_IOCTL) & ~I365_IOCTL_MASK(map); - if (io->flags & MAP_0WS) ioctl |= I365_IOCTL_0WS(map); - if (io->flags & MAP_16BIT) ioctl |= I365_IOCTL_16BIT(map); - if (io->flags & MAP_AUTOSZ) ioctl |= I365_IOCTL_IOCS16(map); - + if (io->flags & (MAP_16BIT|MAP_AUTOSZ)) + ioctl |= I365_IOCTL_16BIT(map); + indirect_write(sock,I365_IOCTL,ioctl); /* Turn the window back on if needed */ @@ -913,19 +866,11 @@ mem->flags |= MAP_WRPROT; if (i & I365_MEM_REG) mem->flags |= MAP_ATTRIB; + mem->card_start = ( (unsigned long)(i & 0x3fff)<12) + mem->sys_start; + mem->card_start &= 0x3ffffff; - if (sockets[sock].type == IS_PD6729) { - /* Take care of high byte */ - indirect_write(sock,PD67_EXT_INDEX, PD67_MEM_PAGE(map)); - addr = indirect_read16(sock, PD67_EXT_DATA) << 24; - mem->sys_stop += addr; mem->sys_start += addr; - mem->card_start = (unsigned long)(i) + mem->sys_start; - } else { - mem->card_start = ((unsigned long)(i & 0x3fff)<12) + mem->sys_start; - mem->card_start &= 0x3ffffff; - } - dprintk("Card %i is from %lx to %lx \n",sock,mem->sys_start,mem->sys_stop); + leave("i82092aa_get_mem_map"); return 0; @@ -952,9 +897,7 @@ if (!(mem->flags & MAP_ACTIVE)) return 0; - if (sockets[sock].type == IS_PD6729) { - ; /* PD6729 accepts high byte */ - } else if ( (mem->card_start > 0x3ffffff) || (mem->sys_start > mem->sys_stop) || + if ( (mem->card_start > 0x3ffffff) || (mem->sys_start > mem->sys_stop) || ((mem->sys_start >> 24) != membase) || ((mem->sys_stop >> 24) != membase) || (mem->speed > 1000) ) { leave("i82092aa_set_mem_map: invalid address / speed"); @@ -963,6 +906,7 @@ } + /* printk("set_mem_map: Setting map %i range to %x - %x on socket %i, speed is %i, active = %i \n",map, mem->sys_start,mem->sys_stop,sock,mem->speed,mem->flags & MAP_ACTIVE); */ /* write the start address */ @@ -993,12 +937,6 @@ indirect_write16(sock,base+I365_W_STOP,i); - if (sockets[sock].type == IS_PD6729) { - /* Take care of high byte */ - indirect_write(sock, PD67_EXT_INDEX, PD67_MEM_PAGE(map)); - indirect_write16(sock, PD67_EXT_DATA, mem->sys_start >> 24); - } - /* card start */ i = (((mem->card_start - mem->sys_start) >> 12) - (membase << 12)) & 0x3fff; @@ -1011,9 +949,7 @@ /* printk("requesting normal memory for socket %i\n",sock);*/ } indirect_write16(sock,base+I365_W_OFF,i); - if (sockets[sock].type == IS_I82092) { - indirect_write(sock, I365_CPAGE, membase); - } + indirect_write(sock, I365_CPAGE, membase); /* Enable the window if necessary */ indirect_setbit(sock, I365_ADDRWIN, I365_ENA_MEM(map)); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/pcmcia/i82365.c linux-2.4.23-pre8/drivers/pcmcia/i82365.c --- linux-2.4.22/drivers/pcmcia/i82365.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/pcmcia/i82365.c 2003-10-22 22:49:32.000000000 +0000 @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -89,7 +88,6 @@ /* Parameters that can be set with 'insmod' */ -#ifdef CONFIG_ISA /* Default base address for i82365sl and other ISA chips */ static int i365_base = 0x3e0; /* Should we probe at 0x3e2 for an extra ISA controller? */ @@ -101,7 +99,6 @@ static int irq_list[16] = { -1 }; /* The card status change interrupt -- 0 means autoselect */ static int cs_irq = 0; -#endif /* Probe for safe interrupts? */ static int do_scan = 1; @@ -120,14 +117,11 @@ static int cmd_time = -1; static int recov_time = -1; -#ifdef CONFIG_ISA /* Vadem options */ static int async_clock = -1; static int cable_mode = -1; static int wakeup = 0; -#endif -#ifdef CONFIG_ISA MODULE_PARM(i365_base, "i"); MODULE_PARM(ignore, "i"); MODULE_PARM(extra_sockets, "i"); @@ -137,7 +131,6 @@ MODULE_PARM(async_clock, "i"); MODULE_PARM(cable_mode, "i"); MODULE_PARM(wakeup, "i"); -#endif MODULE_PARM(do_scan, "i"); MODULE_PARM(poll_interval, "i"); @@ -188,45 +181,29 @@ /* Default ISA interrupt mask */ #define I365_MASK 0xdeb8 /* irq 15,14,12,11,10,9,7,5,4,3 */ -#ifdef CONFIG_ISA static int grab_irq; static spinlock_t isa_lock = SPIN_LOCK_UNLOCKED; #define ISA_LOCK(n, f) spin_lock_irqsave(&isa_lock, f) #define ISA_UNLOCK(n, f) spin_unlock_irqrestore(&isa_lock, f) -#else -#define ISA_LOCK(n, f) do { } while (0) -#define ISA_UNLOCK(n, f) do { } while (0) -#endif static struct timer_list poll_timer; /*====================================================================*/ -/* Default settings for PCI command configuration register */ -#define CMD_DFLT (PCI_COMMAND_IO|PCI_COMMAND_MEMORY| \ - PCI_COMMAND_MASTER|PCI_COMMAND_WAIT) - /* These definitions must match the pcic table! */ -#ifdef CONFIG_ISA typedef enum pcic_id { IS_I82365A, IS_I82365B, IS_I82365DF, IS_IBM, IS_RF5Cx96, IS_VLSI, IS_VG468, IS_VG469, IS_PD6710, IS_PD672X, IS_VT83C469, } pcic_id; -#endif /* Flags for classifying groups of controllers */ #define IS_VADEM 0x0001 #define IS_CIRRUS 0x0002 -#define IS_TI 0x0004 -#define IS_O2MICRO 0x0008 #define IS_VIA 0x0010 -#define IS_TOPIC 0x0020 -#define IS_RICOH 0x0040 #define IS_UNKNOWN 0x0400 #define IS_VG_PWR 0x0800 #define IS_DF_PWR 0x1000 -#define IS_PCI 0x2000 #define IS_ALIVE 0x8000 typedef struct pcic_t { @@ -235,7 +212,6 @@ } pcic_t; static pcic_t pcic[] = { -#ifdef CONFIG_ISA { "Intel i82365sl A step", 0 }, { "Intel i82365sl B step", 0 }, { "Intel i82365sl DF", IS_DF_PWR }, @@ -247,7 +223,6 @@ { "Cirrus PD6710", IS_CIRRUS }, { "Cirrus PD672x", IS_CIRRUS }, { "VIA VT83C469", IS_CIRRUS|IS_VIA }, -#endif }; #define PCIC_COUNT (sizeof(pcic)/sizeof(pcic_t)) @@ -369,26 +344,24 @@ if (has_ring == -1) has_ring = 1; flip(p->misc2, PD67_MC2_IRQ15_RI, has_ring); flip(p->misc2, PD67_MC2_DYNAMIC_MODE, dynamic_mode); + flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass); if (p->misc2 & PD67_MC2_IRQ15_RI) strcat(buf, " [ring]"); if (p->misc2 & PD67_MC2_DYNAMIC_MODE) strcat(buf, " [dyn mode]"); + if (p->misc2 & PD67_MC2_FREQ_BYPASS) + strcat(buf, " [freq bypass]"); if (p->misc1 & PD67_MC1_INPACK_ENA) strcat(buf, " [inpack]"); - if (!(t->flags & IS_PCI)) { - if (p->misc2 & PD67_MC2_IRQ15_RI) - mask &= ~0x8000; - if (has_led > 0) { - strcat(buf, " [led]"); - mask &= ~0x1000; - } - if (has_dma > 0) { - strcat(buf, " [dma]"); - mask &= ~0x0600; - flip(p->misc2, PD67_MC2_FREQ_BYPASS, freq_bypass); - if (p->misc2 & PD67_MC2_FREQ_BYPASS) - strcat(buf, " [freq bypass]"); - } + if (p->misc2 & PD67_MC2_IRQ15_RI) + mask &= ~0x8000; + if (has_led > 0) { + strcat(buf, " [led]"); + mask &= ~0x1000; + } + if (has_dma > 0) { + strcat(buf, " [dma]"); + mask &= ~0x0600; } if (!(t->flags & IS_VIA)) { if (setup_time >= 0) @@ -419,8 +392,6 @@ ======================================================================*/ -#ifdef CONFIG_ISA - static void vg46x_get_state(u_short s) { vg46x_state_t *p = &socket[s].state.vg46x; @@ -462,9 +433,6 @@ return 0xffff; } -#endif - - /*====================================================================== Generic routines to get and set controller options @@ -476,10 +444,8 @@ socket_info_t *t = &socket[s]; if (t->flags & IS_CIRRUS) cirrus_get_state(s); -#ifdef CONFIG_ISA else if (t->flags & IS_VADEM) vg46x_get_state(s); -#endif } static void set_bridge_state(u_short s) @@ -492,10 +458,8 @@ i365_set(s, I365_GENCTL, 0x00); } i365_bflip(s, I365_INTCTL, I365_INTR_ENA, t->intr); -#ifdef CONFIG_ISA if (t->flags & IS_VADEM) vg46x_set_state(s); -#endif } static u_int __init set_bridge_opts(u_short s, u_short ns) @@ -513,10 +477,8 @@ get_bridge_state(i); if (socket[i].flags & IS_CIRRUS) m = cirrus_set_opts(i, buf); -#ifdef CONFIG_ISA else if (socket[i].flags & IS_VADEM) m = vg46x_set_opts(i, buf); -#endif set_bridge_state(i); printk(KERN_INFO " host opts [%d]:%s\n", i, (*buf) ? buf : " none"); @@ -568,8 +530,6 @@ return (irq_hits != 1); } -#ifdef CONFIG_ISA - static u_int __init isa_scan(u_short sock, u_int mask0) { u_int mask1 = 0; @@ -614,8 +574,6 @@ return mask1; } -#endif /* CONFIG_ISA */ - /*====================================================================*/ /* Time conversion functions */ @@ -632,8 +590,6 @@ /*====================================================================*/ -#ifdef CONFIG_ISA - static int __init identify(u_short port, u_short sock) { u_char val; @@ -693,8 +649,6 @@ return type; } /* identify */ -#endif - /*====================================================================== See if a card is present, powered up, in IO mode, and already @@ -738,7 +692,7 @@ static void __init add_pcic(int ns, int type) { u_int mask = 0, i, base; - int use_pci = 0, isa_irq = 0; + int isa_irq = 0; socket_info_t *t = &socket[sockets-ns]; base = sockets-ns; @@ -750,32 +704,25 @@ t->ioaddr, t->psock*0x40); printk(", %d socket%s\n", ns, ((ns > 1) ? "s" : "")); -#ifdef CONFIG_ISA /* Set host options, build basic interrupt mask */ if (irq_list[0] == -1) mask = irq_mask; else for (i = mask = 0; i < 16; i++) mask |= (1< 0; cs_irq--) @@ -788,9 +735,8 @@ printk(" status change on irq %d\n", cs_irq); } } -#endif - if (!use_pci && !isa_irq) { + if (!isa_irq) { if (poll_interval == 0) poll_interval = HZ; printk(" polling interval = %d ms\n", @@ -808,11 +754,8 @@ } /* add_pcic */ - /*====================================================================*/ -#ifdef CONFIG_ISA - #if defined(CONFIG_ISAPNP) || (defined(CONFIG_ISAPNP_MODULE) && defined(MODULE)) #define I82365_ISAPNP #endif @@ -882,7 +825,9 @@ } } } else { - for (i = 0; i < (extra_sockets ? 8 : 4); i += 2) { + for (i = 0; i < 8; i += 2) { + if (sockets && !extra_sockets && (i == 4)) + break; port = i365_base + 2*(i>>2); sock = (i & 3); id = identify(port, sock); @@ -906,8 +851,6 @@ } } -#endif - /*====================================================================*/ static u_int pending_events[8]; @@ -946,17 +889,14 @@ { int i, j, csc; u_int events, active; -#ifdef CONFIG_ISA u_long flags = 0; -#endif DEBUG(4, "i82365: pcic_interrupt(%d)\n", irq); for (j = 0; j < 20; j++) { active = 0; for (i = 0; i < sockets; i++) { - if ((socket[i].cs_irq != irq) && - (socket[i].cap.pci_irq != irq)) + if (socket[i].cs_irq != irq) continue; ISA_LOCK(i, flags); csc = i365_get(i, I365_CSC); @@ -1055,7 +995,6 @@ *value |= (status & I365_CS_READY) ? SS_READY : 0; *value |= (status & I365_CS_POWERON) ? SS_POWERON : 0; -#ifdef CONFIG_ISA if (socket[sock].type == IS_VG469) { status = i365_get(sock, VG469_VSENSE); if (socket[sock].psock & 1) { @@ -1066,7 +1005,6 @@ *value |= (status & VG469_VSENSE_A_VS2) ? 0 : SS_XVCARD; } } -#endif DEBUG(1, "i82365: GetStatus(%d) = %#4.4x\n", sock, *value); return 0; @@ -1160,7 +1098,7 @@ /* IO card, RESET flag, IO interrupt */ reg = t->intr; - if (state->io_irq != t->cap.pci_irq) reg |= state->io_irq; + reg |= state->io_irq; reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET; reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0; i365_set(sock, I365_INTCTL, reg); @@ -1357,8 +1295,7 @@ if ((map > 4) || (mem->card_start > 0x3ffffff) || (mem->sys_start > mem->sys_stop) || (mem->speed > 1000)) return -EINVAL; - if (!(socket[sock].flags & IS_PCI) && - ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff))) + if ((mem->sys_start > 0xffffff) || (mem->sys_stop > 0xffffff)) return -EINVAL; /* Turn off the window before changing anything */ @@ -1417,9 +1354,7 @@ char *p = buf; int i, top; -#ifdef CONFIG_ISA u_long flags = 0; -#endif ISA_LOCK(sock, flags); top = 0x40; for (i = 0; i < top; i += 4) { @@ -1464,15 +1399,8 @@ /*====================================================================*/ -/* - * The locking is rather broken. Why do we only lock for ISA, not for - * all other cases? If there are reasons to lock, we should lock. Not - * this silly conditional. - * - * Plan: make it bug-for-bug compatible with the old stuff, and clean - * it up when the infrastructure is done. - */ -#ifdef CONFIG_ISA +/* this is horribly ugly... proper locking needs to be done here at + * some time... */ #define LOCKED(x) do { \ int retval; \ unsigned long flags; \ @@ -1481,10 +1409,6 @@ spin_unlock_irqrestore(&isa_lock, flags); \ return retval; \ } while (0) -#else -#define LOCKED(x) return x -#endif - static int pcic_get_status(unsigned int sock, u_int *value) { @@ -1595,12 +1519,10 @@ return -1; } DEBUG(0, "%s\n", version); - printk(KERN_INFO "Intel PCIC probe: "); + printk(KERN_INFO "Intel ISA PCIC probe: "); sockets = 0; -#ifdef CONFIG_ISA isa_probe(); -#endif if (sockets == 0) { printk("not found.\n"); @@ -1608,10 +1530,8 @@ } /* Set up interrupt handler(s) */ -#ifdef CONFIG_ISA if (grab_irq != 0) request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt); -#endif if (register_ss_entry(sockets, &pcic_operations) != 0) printk(KERN_NOTICE "i82365: register_ss_entry() failed\n"); @@ -1638,16 +1558,14 @@ unregister_ss_entry(&pcic_operations); if (poll_interval != 0) del_timer(&poll_timer); -#ifdef CONFIG_ISA if (grab_irq != 0) free_irq(cs_irq, pcic_interrupt); -#endif for (i = 0; i < sockets; i++) { /* Turn off all interrupt sources! */ i365_set(i, I365_CSCINT, 0); release_region(socket[i].ioaddr, 2); } -#if defined(CONFIG_ISA) && defined(I82365_ISAPNP) +#if defined(I82365_ISAPNP) if (i82365_pnpdev && i82365_pnpdev->deactivate) i82365_pnpdev->deactivate(i82365_pnpdev); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/pnp/isapnp.c linux-2.4.23-pre8/drivers/pnp/isapnp.c --- linux-2.4.22/drivers/pnp/isapnp.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/pnp/isapnp.c 2003-10-22 22:49:01.000000000 +0000 @@ -510,7 +510,6 @@ int dependent, int size) { unsigned char tmp[3]; - int i; struct isapnp_irq *irq, *ptr; isapnp_peek(tmp, size); @@ -538,9 +537,13 @@ else (*res)->irq = irq; #ifdef CONFIG_PCI - for (i=0; i<16; i++) - if (irq->map & (1<map & (1<state = state_value; } while (0) -#ifdef __SMP__ +#ifdef CONFIG_SMP #define set_current_state(state_value) \ do { __set_current_state(state_value); mb(); } while (0) #else diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sbus/char/bbc_envctrl.c linux-2.4.23-pre8/drivers/sbus/char/bbc_envctrl.c --- linux-2.4.22/drivers/sbus/char/bbc_envctrl.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sbus/char/bbc_envctrl.c 2003-10-22 22:48:38.000000000 +0000 @@ -59,7 +59,7 @@ * before the hardware based power-off event is triggered. */ -/* These settings are in celcius. We use these defaults only +/* These settings are in Celsius. We use these defaults only * if we cannot interrogate the cpu-fru SEEPROM. */ struct temp_limits { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sbus/char/cpwatchdog.c linux-2.4.23-pre8/drivers/sbus/char/cpwatchdog.c --- linux-2.4.22/drivers/sbus/char/cpwatchdog.c 2001-10-11 06:42:47.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sbus/char/cpwatchdog.c 2003-10-22 22:49:38.000000000 +0000 @@ -544,7 +544,7 @@ static void wd_pingtimer(struct wd_timer* pTimer) { if(wd_readb(&pTimer->regs->status) & WD_S_RUNNING) { - wd_readb(&pTimer->regs->dcntr); + wd_readw(&pTimer->regs->dcntr); } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sbus/char/envctrl.c linux-2.4.23-pre8/drivers/sbus/char/envctrl.c --- linux-2.4.22/drivers/sbus/char/envctrl.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sbus/char/envctrl.c 2003-10-22 22:47:54.000000000 +0000 @@ -1125,7 +1125,7 @@ } err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES); - if (err) + if (err < 0) goto out_deregister; return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/3w-xxxx.c linux-2.4.23-pre8/drivers/scsi/3w-xxxx.c --- linux-2.4.22/drivers/scsi/3w-xxxx.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/3w-xxxx.c 2003-10-22 22:49:40.000000000 +0000 @@ -178,7 +178,7 @@ #include MODULE_AUTHOR ("3ware Inc."); -#ifdef __SMP__ +#ifdef CONFIG_SMP MODULE_DESCRIPTION ("3ware Storage Controller Linux Driver (SMP)"); #else MODULE_DESCRIPTION ("3ware Storage Controller Linux Driver"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/53c7,8xx.c linux-2.4.23-pre8/drivers/scsi/53c7,8xx.c --- linux-2.4.22/drivers/scsi/53c7,8xx.c 2002-02-25 19:38:04.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/53c7,8xx.c 2003-10-22 22:47:36.000000000 +0000 @@ -6397,7 +6397,7 @@ (struct NCR53c7x0_hostdata *) host->hostdata; struct NCR53c7x0_cmd *cmd, *tmp; shutdown (host); - if (host->irq != IRQ_NONE) + if (host->irq != SCSI_IRQ_NONE) { int irq_count; struct Scsi_Host *tmp; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/53c7,8xx.h linux-2.4.23-pre8/drivers/scsi/53c7,8xx.h --- linux-2.4.22/drivers/scsi/53c7,8xx.h 2001-07-20 04:08:38.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/53c7,8xx.h 2003-10-22 22:49:15.000000000 +0000 @@ -1428,7 +1428,7 @@ }; -#define IRQ_NONE 255 +#define SCSI_IRQ_NONE 255 #define DMA_NONE 255 #define IRQ_AUTO 254 #define DMA_AUTO 254 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/53c7xx.c linux-2.4.23-pre8/drivers/scsi/53c7xx.c --- linux-2.4.22/drivers/scsi/53c7xx.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/53c7xx.c 2003-10-22 22:48:57.000000000 +0000 @@ -6081,7 +6081,7 @@ (struct NCR53c7x0_hostdata *) host->hostdata[0]; struct NCR53c7x0_cmd *cmd, *tmp; shutdown (host); - if (host->irq != IRQ_NONE) + if (host->irq != SCSI_IRQ_NONE) { int irq_count; struct Scsi_Host *tmp; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/53c7xx.h linux-2.4.23-pre8/drivers/scsi/53c7xx.h --- linux-2.4.22/drivers/scsi/53c7xx.h 2001-10-25 20:53:48.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/53c7xx.h 2003-10-22 22:47:29.000000000 +0000 @@ -1450,7 +1450,7 @@ }; -#define IRQ_NONE 255 +#define SCSI_IRQ_NONE 255 #define DMA_NONE 255 #define IRQ_AUTO 254 #define DMA_AUTO 254 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/Config.in linux-2.4.23-pre8/drivers/scsi/Config.in --- linux-2.4.22/drivers/scsi/Config.in 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/Config.in 2003-10-22 22:48:39.000000000 +0000 @@ -67,6 +67,7 @@ dep_tristate 'Always IN2000 SCSI support' CONFIG_SCSI_IN2000 $CONFIG_SCSI dep_tristate 'AM53/79C974 PCI SCSI support' CONFIG_SCSI_AM53C974 $CONFIG_SCSI $CONFIG_PCI dep_tristate 'AMI MegaRAID support' CONFIG_SCSI_MEGARAID $CONFIG_SCSI +dep_tristate 'AMI MegaRAID2 support' CONFIG_SCSI_MEGARAID2 $CONFIG_SCSI dep_tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC $CONFIG_SCSI if [ "$CONFIG_SCSI_BUSLOGIC" != "n" ]; then diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/Makefile linux-2.4.23-pre8/drivers/scsi/Makefile --- linux-2.4.22/drivers/scsi/Makefile 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/Makefile 2003-10-22 22:48:15.000000000 +0000 @@ -97,7 +97,7 @@ obj-$(CONFIG_SCSI_NCR53C7xx) += 53c7,8xx.o subdir-$(CONFIG_SCSI_SYM53C8XX_2) += sym53c8xx_2 ifeq ($(CONFIG_SCSI_SYM53C8XX_2),y) - obj-$(CONFIG_SCSI_SYM53C8XX_2) += sym53c8xx_2/sym53c8xx.o + obj-$(CONFIG_SCSI_SYM53C8XX_2) += sym53c8xx_2/sym53c8xx_2.o endif obj-$(CONFIG_SCSI_SYM53C8XX) += sym53c8xx.o obj-$(CONFIG_SCSI_NCR53C8XX) += ncr53c8xx.o @@ -110,6 +110,7 @@ obj-$(CONFIG_SCSI_DC390T) += tmscsim.o obj-$(CONFIG_SCSI_AM53C974) += AM53C974.o obj-$(CONFIG_SCSI_MEGARAID) += megaraid.o +obj-$(CONFIG_SCSI_MEGARAID2) += megaraid2.o obj-$(CONFIG_SCSI_ACARD) += atp870u.o obj-$(CONFIG_SCSI_SUNESP) += esp.o obj-$(CONFIG_SCSI_GDTH) += gdth.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/NCR5380.c linux-2.4.23-pre8/drivers/scsi/NCR5380.c --- linux-2.4.22/drivers/scsi/NCR5380.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/NCR5380.c 2003-10-22 22:48:13.000000000 +0000 @@ -693,7 +693,7 @@ trying_irqs |= mask; timeout = jiffies + (250 * HZ / 1000); - probe_irq = IRQ_NONE; + probe_irq = SCSI_IRQ_NONE; /* * A interrupt is triggered whenever BSY = false, SEL = true @@ -710,7 +710,7 @@ NCR5380_write(OUTPUT_DATA_REG, hostdata->id_mask); NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_DATA | ICR_ASSERT_SEL); - while (probe_irq == IRQ_NONE && time_before(jiffies, timeout)) + while (probe_irq == SCSI_IRQ_NONE && time_before(jiffies, timeout)) barrier(); NCR5380_write(SELECT_ENABLE_REG, 0); @@ -860,7 +860,7 @@ SPRINTF("\nBase Addr: 0x%05lX ", (long) instance->base); SPRINTF("io_port: %04x ", (int) instance->io_port); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) SPRINTF("IRQ: None.\n"); else SPRINTF("IRQ: %d.\n", instance->irq); @@ -1706,7 +1706,7 @@ #endif /* def NCR_TIMEOUT */ dprintk(NDEBUG_SELECTION, ("scsi%d : target %d selected, going into MESSAGE OUT phase.\n", instance->host_no, cmd->target)); - tmp[0] = IDENTIFY(((instance->irq == IRQ_NONE) ? 0 : 1), cmd->lun); + tmp[0] = IDENTIFY(((instance->irq == SCSI_IRQ_NONE) ? 0 : 1), cmd->lun); len = 1; cmd->tag = 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/NCR5380.h linux-2.4.23-pre8/drivers/scsi/NCR5380.h --- linux-2.4.22/drivers/scsi/NCR5380.h 2001-12-21 17:41:55.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/NCR5380.h 2003-10-22 22:48:59.000000000 +0000 @@ -233,7 +233,7 @@ * Scsi_Host structure */ -#define IRQ_NONE 255 +#define SCSI_IRQ_NONE 255 #define DMA_NONE 255 #define IRQ_AUTO 254 #define DMA_AUTO 254 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/aacraid/aachba.c linux-2.4.23-pre8/drivers/scsi/aacraid/aachba.c --- linux-2.4.22/drivers/scsi/aacraid/aachba.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/aacraid/aachba.c 2003-10-22 22:49:43.000000000 +0000 @@ -221,9 +221,7 @@ static unsigned long aac_build_sg(Scsi_Cmnd* scsicmd, struct sgmap* sgmap); static unsigned long aac_build_sg64(Scsi_Cmnd* scsicmd, struct sgmap64* psg); static int aac_send_srb_fib(Scsi_Cmnd* scsicmd); -#ifdef AAC_DETAILED_STATUS_INFO static char *aac_get_status_string(u32 status); -#endif /* * Non dasd selection is handled entirely in aachba now @@ -231,8 +229,11 @@ MODULE_PARM(nondasd, "i"); MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); +MODULE_PARM(paemode, "i"); +MODULE_PARM_DESC(paemode, "Control whether dma addressing is using PAE. 0=off, 1=on"); static int nondasd = -1; +static int paemode = -1; /** * aac_get_containers - list containers @@ -298,6 +299,64 @@ } /** + * aac_get_container_name - get container name + */ +static int aac_get_container_name(struct aac_dev *dev, int cid, char * pid) +{ + struct fsa_scsi_hba *fsa_dev_ptr; + int status = 0; + struct aac_get_name *dinfo; + struct aac_get_name_resp *dresp; + struct fib * fibptr; + unsigned instance; + + fsa_dev_ptr = &(dev->fsa_dev); + instance = dev->scsi_host_ptr->unique_id; + + if (!(fibptr = fib_alloc(dev))) + return -ENOMEM; + + fib_init(fibptr); + dinfo = (struct aac_get_name *) fib_data(fibptr); + + dinfo->command = cpu_to_le32(VM_ContainerConfig); + dinfo->type = cpu_to_le32(CT_READ_NAME); + dinfo->cid = cpu_to_le32(cid); + dinfo->count = cpu_to_le32(sizeof(((struct aac_get_name_resp *)NULL)->data)); + + status = fib_send(ContainerCommand, + fibptr, + sizeof (struct aac_get_name), + FsaNormal, + 1, 1, + NULL, NULL); + if (status < 0 ) { + printk(KERN_WARNING "aac_get_container_name: SendFIB failed.\n"); + } else { + dresp = (struct aac_get_name_resp *)fib_data(fibptr); + + status = (le32_to_cpu(dresp->status) != CT_OK) + || (dresp->data[0] == '\0'); + if (status == 0) { + char * sp = dresp->data; + char * dp = pid; + do { + if ((*sp == '\0') + || ((dp - pid) >= sizeof(((struct aac_get_name_resp *)NULL)->data))) { + *dp = ' '; + } else { + *dp = *sp++; + } + } while (++dp < &pid[sizeof(((struct inquiry_data *)NULL)->inqd_pid)]); + } + } + fib_complete(fibptr); + fib_free(fibptr); + fsa_dev[instance] = fsa_dev_ptr; + return status; +} + +/** * probe_container - query a logical volume * @dev: device to query * @cid: container identifier @@ -569,8 +628,10 @@ if( (sizeof(dma_addr_t) > 4) && (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)){ dev->pae_support = 1; } - /* TODO - dmb temporary until fw can set this bit */ - dev->pae_support = (BITS_PER_LONG >= 64); + + if(paemode != -1) + dev->pae_support = (paemode != 0); + if(dev->pae_support != 0) { printk(KERN_INFO "%s%d: 64 Bit PAE enabled\n", dev->name, dev->id); @@ -997,7 +1058,6 @@ memset(inq_data_ptr, 0, sizeof (struct inquiry_data)); inq_data_ptr->inqd_ver = 2; /* claim compliance to SCSI-2 */ - inq_data_ptr->inqd_dtq = 0x80; /* set RMB bit to one indicating that the medium is removable */ inq_data_ptr->inqd_rdf = 2; /* A response data format value of two indicates that the data shall be in the format specified in SCSI-2 */ inq_data_ptr->inqd_len = 31; /*Format for "pad2" is RelAdr | WBus32 | WBus16 | Sync | Linked |Reserved| CmdQue | SftRe */ @@ -1006,11 +1066,14 @@ * Set the Vendor, Product, and Revision Level * see: .c i.e. aac.c */ - setinqstr(cardtype, (void *) (inq_data_ptr->inqd_vid), fsa_dev_ptr->type[cid]); - if (scsicmd->target == scsicmd->host->this_id) + if (scsicmd->target == scsicmd->host->this_id) { + setinqstr(cardtype, (void *) (inq_data_ptr->inqd_vid), (sizeof(container_types)/sizeof(char *))); inq_data_ptr->inqd_pdt = INQD_PDT_PROC; /* Processor device */ - else + } else { + setinqstr(cardtype, (void *) (inq_data_ptr->inqd_vid), fsa_dev_ptr->type[cid]); + aac_get_container_name(dev, cid, inq_data_ptr->inqd_pid); inq_data_ptr->inqd_pdt = INQD_PDT_DA; /* Direct/random access device */ + } scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | GOOD; __aac_io_done(scsicmd); return 0; @@ -1123,7 +1186,7 @@ SENKEY_ILLEGAL, SENCODE_INVALID_COMMAND, ASENCODE_INVALID_COMMAND, 0, 0, 0, 0); __aac_io_done(scsicmd); - return -1; + return 0; } } @@ -1425,9 +1488,7 @@ case SRB_STATUS_FORCE_ABORT: case SRB_STATUS_DOMAIN_VALIDATION_FAIL: default: -#ifdef AAC_DETAILED_STATUS_INFO printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",le32_to_cpu(srbreply->srb_status&0x3f),aac_get_status_string(le32_to_cpu(srbreply->srb_status)), scsicmd->cmnd[0], le32_to_cpu(srbreply->scsi_status) ); -#endif scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8; break; } @@ -1525,7 +1586,7 @@ /* * Build Scatter/Gather list */ - fibsize = sizeof (struct aac_srb) + (((srbcmd->sg.count & 0xff) - 1) * sizeof (struct sgentry64)); + fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) + ((srbcmd->sg.count & 0xff) * sizeof (struct sgentry64)); /* * Now send the Fib to the adapter @@ -1686,8 +1747,6 @@ return byte_count; } -#ifdef AAC_DETAILED_STATUS_INFO - struct aac_srb_status_info { u32 status; char *str; @@ -1742,4 +1801,3 @@ return "Bad Status Code"; } -#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/aacraid/aacraid.h linux-2.4.23-pre8/drivers/scsi/aacraid/aacraid.h --- linux-2.4.22/drivers/scsi/aacraid/aacraid.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/aacraid/aacraid.h 2003-10-22 22:49:43.000000000 +0000 @@ -1,3 +1,6 @@ +#define AAC_DRIVER_VERSION 0x01010300 +#define AAC_DRIVER_BUILD_DATE __DATE__ " " __TIME__ + //#define dprintk(x) printk x #if (!defined(dprintk)) # define dprintk(x) @@ -759,7 +762,7 @@ */ dma_addr_t hw_fib_pa; struct hw_fib *hw_fib_va; - ulong fib_base_va; + struct hw_fib *aif_base_va; /* * Fib Headers */ @@ -1178,6 +1181,31 @@ struct aac_mntent mnt[1]; }; +#define CT_READ_NAME 130 +struct aac_get_name { + u32 command; + u32 type; // CT_READ_NAME + u32 cid; + u32 parm1; + u32 parm2; + u32 parm3; + u32 parm4; + u32 count; // sizeof(((struct aac_get_name_resp *)NULL)->data) +}; + +#define CT_OK 218 +struct aac_get_name_resp { + u32 dummy0; + u32 dummy1; + u32 status; // CT_OK + u32 parm1; + u32 parm2; + u32 parm3; + u32 parm4; + u32 parm5; + u8 data[16]; +}; + /* * The following command is sent to shut down each container. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/aacraid/commctrl.c linux-2.4.23-pre8/drivers/scsi/aacraid/commctrl.c --- linux-2.4.22/drivers/scsi/aacraid/commctrl.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/aacraid/commctrl.c 2003-10-22 22:49:11.000000000 +0000 @@ -362,7 +362,7 @@ * @dev: adapter * @arg: ioctl arguments * - * This routine returns the firmware version. + * This routine returns the driver version. * Under Linux, there have been no version incompatibilities, so this is simple! */ @@ -371,14 +371,223 @@ struct revision response; response.compat = 1; - response.version = dev->adapter_info.kernelrev; - response.build = dev->adapter_info.kernelbuild; + response.version = AAC_DRIVER_VERSION; + response.build = 9999; if (copy_to_user(arg, &response, sizeof(response))) return -EFAULT; return 0; } +/** + * + * aac_send_raw_scb + * + */ + +int aac_send_raw_srb(struct aac_dev* dev, void* arg) +{ + struct fib* srbfib; + int status; + struct aac_srb *srbcmd; + struct aac_srb *user_srb = arg; + struct aac_srb_reply* user_reply; + struct aac_srb_reply* reply; + u32 fibsize = 0; + u32 flags = 0; + s32 rcode = 0; + u32 data_dir; + ulong sg_user[32]; + ulong sg_list[32]; + u32 sg_indx = 0; + u32 byte_count = 0; + u32 actual_fibsize = 0; + int i; + + + if (!capable(CAP_SYS_ADMIN)){ + printk(KERN_DEBUG"aacraid: No permission to send raw srb\n"); + return -EPERM; + } + /* + * Allocate and initialize a Fib then setup a BlockWrite command + */ + if (!(srbfib = fib_alloc(dev))) { + return -1; + } + fib_init(srbfib); + + srbcmd = (struct aac_srb*) fib_data(srbfib); + + if(copy_from_user((void*)&fibsize, (void*)&user_srb->count,sizeof(u32))){ + printk(KERN_DEBUG"aacraid: Could not copy data size from user\n"); + rcode = -EFAULT; + goto cleanup; + } + + if(copy_from_user(srbcmd, user_srb,fibsize)){ + printk(KERN_DEBUG"aacraid: Could not copy srb from user\n"); + rcode = -EFAULT; + goto cleanup; + } + + user_reply = arg+fibsize; + + flags = srbcmd->flags; + // Fix up srb for endian and force some values + srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); // Force this + srbcmd->channel = cpu_to_le32(srbcmd->channel); + srbcmd->target = cpu_to_le32(srbcmd->target); + srbcmd->lun = cpu_to_le32(srbcmd->lun); + srbcmd->flags = cpu_to_le32(srbcmd->flags); + srbcmd->timeout = cpu_to_le32(srbcmd->timeout); + srbcmd->retry_limit =cpu_to_le32(0); // Obsolete parameter + srbcmd->cdb_size = cpu_to_le32(srbcmd->cdb_size); + + switch(srbcmd->flags & (SRB_DataIn | SRB_DataOut)){ + case SRB_DataOut: + data_dir = SCSI_DATA_WRITE; + break; + case (SRB_DataIn | SRB_DataOut): + data_dir = SCSI_DATA_UNKNOWN; + break; + case SRB_DataIn: + data_dir = SCSI_DATA_READ; + break; + default: + data_dir = SCSI_DATA_NONE; + } + + if( dev->pae_support ==1 ) { + struct sgmap64* psg = (struct sgmap64*)&srbcmd->sg; + byte_count = 0; + + // This should also catch if user used the 32 bit sgmap + actual_fibsize = sizeof (struct aac_srb) + (((srbcmd->sg.count & 0xff) - 1) * sizeof (struct sgentry64)); + if(actual_fibsize != fibsize){ // User made a mistake - should not continue + printk(KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n"); + rcode = -EINVAL; + goto cleanup; + } + if ((data_dir == SCSI_DATA_NONE) && psg->count) { // Dogs and cats sleeping with eachother - should not continue + printk(KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"); + rcode = -EINVAL; + goto cleanup; + } + + for (i = 0; i < psg->count; i++) { + dma_addr_t addr; + u64 le_addr; + void* p; + p = kmalloc(psg->sg[i].count,GFP_KERNEL|__GFP_DMA); + if(p == 0) { + printk(KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n", + psg->sg[i].count,i,psg->count); + rcode = -ENOMEM; + goto cleanup; + } + sg_user[i] = (ulong)psg->sg[i].addr; + sg_list[i] = (ulong)p; // save so we can clean up later + sg_indx = i + 1; + + if( flags & SRB_DataOut ){ + if(copy_from_user(p,psg->sg[i].addr,psg->sg[i].count)){ + printk(KERN_DEBUG"aacraid: Could not copy sg data from user\n"); + rcode = -EFAULT; + goto cleanup; + } + } + addr = pci_map_single(dev->pdev, p, psg->sg[i].count, scsi_to_pci_dma_dir(data_dir)); + + le_addr = cpu_to_le64(addr); + psg->sg[i].addr[1] = (u32)(le_addr>>32); + psg->sg[i].addr[0] = (u32)(le_addr & 0xffffffff); + psg->sg[i].count = cpu_to_le32(psg->sg[i].count); + byte_count += psg->sg[i].count; + } + + srbcmd->count = cpu_to_le32(byte_count); + status = fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,0,0); + } else { + struct sgmap* psg = &srbcmd->sg; + byte_count = 0; + + actual_fibsize = sizeof (struct aac_srb) + (((srbcmd->sg.count & 0xff) - 1) * sizeof (struct sgentry)); + if(actual_fibsize != fibsize){ // User made a mistake - should not continue + printk(KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n"); + rcode = -EINVAL; + goto cleanup; + } + if ((data_dir == SCSI_DATA_NONE) && psg->count) { // Dogs and cats sleeping with eachother - should not continue + printk(KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"); + rcode = -EINVAL; + goto cleanup; + } + for (i = 0; i < psg->count; i++) { + dma_addr_t addr; + void* p; + p = kmalloc(psg->sg[i].count,GFP_KERNEL); + if(p == 0) { + printk(KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n", + psg->sg[i].count,i,psg->count); + rcode = -ENOMEM; + goto cleanup; + } + sg_user[i] = (ulong)(psg->sg[i].addr); + sg_list[i] = (ulong)p; // save so we can clean up later + sg_indx = i + 1; + + if( flags & SRB_DataOut ){ + if(copy_from_user((void*)p,(void*)(ulong)(psg->sg[i].addr),psg->sg[i].count)){ + printk(KERN_DEBUG"aacraid: Could not copy sg data from user\n"); + rcode = -EFAULT; + goto cleanup; + } + } + addr = pci_map_single(dev->pdev, p, psg->sg[i].count, scsi_to_pci_dma_dir(data_dir)); + + psg->sg[i].addr = cpu_to_le32(addr); + psg->sg[i].count = cpu_to_le32(psg->sg[i].count); + byte_count += psg->sg[i].count; + } + srbcmd->count = cpu_to_le32(byte_count); + status = fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, 0, 0); + } + + if (status != 0){ + printk(KERN_DEBUG"aacraid: Could not send raw srb fib to hba\n"); + rcode = -1; + goto cleanup; + } + + if( flags & SRB_DataIn ) { + for(i = 0 ; i < sg_indx; i++){ + if(copy_to_user((void*)(sg_user[i]),(void*)(sg_list[i]),le32_to_cpu(srbcmd->sg.sg[i].count))){ + printk(KERN_DEBUG"aacraid: Could not copy sg data to user\n"); + rcode = -EFAULT; + goto cleanup; + + } + } + } + + reply = (struct aac_srb_reply *) fib_data(srbfib); + if(copy_to_user(user_reply,reply,sizeof(struct aac_srb_reply))){ + printk(KERN_DEBUG"aacraid: Could not copy reply to user\n"); + rcode = -EFAULT; + goto cleanup; + } + +cleanup: + for(i=0; i < sg_indx; i++){ + kfree((void*)sg_list[i]); + } + fib_complete(srbfib); + fib_free(srbfib); + + return rcode; +} + struct aac_pci_info { u32 bus; @@ -427,6 +636,9 @@ case FSACTL_CLOSE_GET_ADAPTER_FIB: status = close_getadapter_fib(dev, arg); break; + case FSACTL_SEND_RAW_SRB: + status = aac_send_raw_srb(dev,arg); + break; case FSACTL_GET_PCI_INFO: status = aac_get_pci_info(dev,arg); break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/aacraid/comminit.c linux-2.4.23-pre8/drivers/scsi/aacraid/comminit.c --- linux-2.4.22/drivers/scsi/aacraid/comminit.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/aacraid/comminit.c 2003-10-22 22:49:02.000000000 +0000 @@ -84,14 +84,14 @@ * Adapter Fibs are the first thing allocated so that they * start page aligned */ - dev->fib_base_va = (ulong)base; + dev->aif_base_va = (struct hw_fib *)base; /* We submit the physical address for AIF tags to limit to 32 bits */ - init->AdapterFibsVirtualAddress = cpu_to_le32((u32)phys); + init->AdapterFibsVirtualAddress = cpu_to_le32(0); init->AdapterFibsPhysicalAddress = cpu_to_le32((u32)phys); init->AdapterFibsSize = cpu_to_le32(fibsize); init->AdapterFibAlign = cpu_to_le32(sizeof(struct hw_fib)); - init->HostPhysMemPages = cpu_to_le32(num_physpages); // number of 4k pages of host physical memory + init->HostPhysMemPages = cpu_to_le32((num_physpages << PAGE_SHIFT) / 4096); // number of 4k pages of host physical memory /* * Increment the base address by the amount already used diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/aacraid/commsup.c linux-2.4.23-pre8/drivers/scsi/aacraid/commsup.c --- linux-2.4.22/drivers/scsi/aacraid/commsup.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/aacraid/commsup.c 2003-10-22 22:47:44.000000000 +0000 @@ -203,7 +203,7 @@ hw_fib->header.StructType = FIB_MAGIC; hw_fib->header.Size = cpu_to_le16(sizeof(struct hw_fib)); hw_fib->header.XferState = cpu_to_le32(HostOwned | FibInitialized | FibEmpty | FastResponseCapable); - hw_fib->header.SenderFibAddress = cpu_to_le32(fibptr->hw_fib_pa); + hw_fib->header.SenderFibAddress = 0; /* Filled in later if needed */ hw_fib->header.ReceiverFibAddress = cpu_to_le32(fibptr->hw_fib_pa); hw_fib->header.SenderSize = cpu_to_le16(sizeof(struct hw_fib)); } @@ -450,8 +450,7 @@ * Map the fib into 32bits by using the fib number */ -// hw_fib->header.SenderFibAddress = ((u32)(fibptr-dev->fibs)) << 1; - hw_fib->header.SenderFibAddress = cpu_to_le32((u32)(ulong)fibptr->hw_fib_pa); + hw_fib->header.SenderFibAddress = cpu_to_le32(((u32)(fibptr - dev->fibs)) << 1); hw_fib->header.SenderData = (u32)(fibptr - dev->fibs); /* * Set FIB state to indicate where it came from and if we want a @@ -792,7 +791,6 @@ struct aac_aifcmd * aifcmd = (struct aac_aifcmd *)hw_fib->data; int busy; u32 container; - mm_segment_t fs; /* Sniff for container changes */ dprintk ((KERN_INFO "AifCmdDriverNotify=%x\n", le32_to_cpu(*(u32 *)aifcmd->data))); @@ -859,18 +857,24 @@ * go away. We need to check the access_count for the * device since we are not wanting the devices to go away. */ - if (busy == 0 && proc_scsi != NULL) { + if ((busy == 0) + && (proc_scsi != (struct proc_dir_entry *)NULL)) { struct proc_dir_entry * entry; dprintk((KERN_INFO "proc_scsi=%p ", proc_scsi)); - for (entry = proc_scsi->subdir; entry != (struct proc_dir_entry *)NULL; entry = entry->next) { + for (entry = proc_scsi->subdir; + entry != (struct proc_dir_entry *)NULL; + entry = entry->next) { dprintk(("\"%.*s\"[%d]=%x ", entry->namelen, entry->name, entry->namelen, entry->low_ino)); - if ((entry->low_ino != 0) && (entry->namelen == 4) && (memcmp ("scsi", entry->name, 4) == 0)) { + if ((entry->low_ino != 0) + && (entry->namelen == 4) + && (memcmp ("scsi", entry->name, 4) == 0)) { dprintk(("%p->write_proc=%p ", entry, entry->write_proc)); if (entry->write_proc != (int (*)(struct file *, const char *, unsigned long, void *))NULL) { char buffer[80]; int length; + mm_segment_t fs; sprintf (buffer, "scsi add-single-device %d %d %d %d\n", @@ -879,12 +883,17 @@ CONTAINER_TO_TARGET(container), CONTAINER_TO_LUN(container)); length = strlen (buffer); - dprintk((KERN_INFO "echo %.*s > /proc/scsi/scsi\n", length-1, buffer)); + dprintk((KERN_INFO + "echo %.*s > /proc/scsi/scsi\n", + length-1, + buffer)); fs = get_fs(); set_fs(get_ds()); - length = entry->write_proc(NULL, buffer, length, NULL); + length = entry->write_proc( + NULL, buffer, length, NULL); set_fs(fs); - dprintk((KERN_INFO "returns %d\n", length)); + dprintk((KERN_INFO + "returns %d\n", length)); } break; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/aacraid/dpcsup.c linux-2.4.23-pre8/drivers/scsi/aacraid/dpcsup.c --- linux-2.4.22/drivers/scsi/aacraid/dpcsup.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/aacraid/dpcsup.c 2003-10-22 22:48:55.000000000 +0000 @@ -74,12 +74,12 @@ */ while(aac_consumer_get(dev, q, &entry)) { - u32 fast ; - fast = (entry->addr & cpu_to_le32(0x01)); -// fib = &dev->fibs[(entry->addr >> 1)]; -// hwfib = fib->hw_fib; - hwfib = bus_to_virt(le32_to_cpu(entry->addr & cpu_to_le32(~0x01))); - fib = &dev->fibs[hwfib->header.SenderData]; + int fast; + u32 index; + index = le32_to_cpu(entry->addr); + fast = index & 0x01; + fib = &dev->fibs[index >> 1]; + hwfib = fib->hw_fib; aac_consumer_free(dev, q, HostNormRespQueue); /* @@ -178,13 +178,12 @@ while(aac_consumer_get(dev, q, &entry)) { struct fib fibctx; + struct hw_fib * hw_fib; + u32 index; struct fib *fib = &fibctx; - u32 hw_fib_pa = le32_to_cpu(entry->addr & cpu_to_le32(~0x01)); - struct hw_fib * hw_fib_va = ((dev->comm_phys <= hw_fib_pa) - && (hw_fib_pa < (dev->comm_phys + dev->comm_size))) - ? dev->comm_addr + (hw_fib_pa - dev->comm_phys) - : /* inconceivable */ bus_to_virt(hw_fib_pa); - dprintk((KERN_INFO "hw_fib_pa=%x hw_fib_va=%p\n", hw_fib_pa, hw_fib_va)); + + index = le32_to_cpu(entry->addr / sizeof(struct hw_fib)); + hw_fib = &dev->aif_base_va[index]; /* * Allocate a FIB at all costs. For non queued stuff @@ -199,8 +198,8 @@ INIT_LIST_HEAD(&fib->fiblink); fib->type = FSAFS_NTC_FIB_CONTEXT; fib->size = sizeof(struct fib); - fib->hw_fib = hw_fib_va; - fib->data = hw_fib_va->data; + fib->hw_fib = hw_fib; + fib->data = hw_fib->data; fib->dev = dev; if (dev->aif_thread && fib != &fibctx) @@ -214,7 +213,7 @@ /* * Set the status of this FIB */ - *(u32 *)hw_fib_va->data = cpu_to_le32(ST_OK); + *(u32 *)hw_fib->data = cpu_to_le32(ST_OK); fib_adapter_complete(fib, sizeof(u32)); spin_lock_irqsave(q->lock, flags); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/aacraid/linit.c linux-2.4.23-pre8/drivers/scsi/aacraid/linit.c --- linux-2.4.22/drivers/scsi/aacraid/linit.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/aacraid/linit.c 2003-10-22 22:47:37.000000000 +0000 @@ -35,9 +35,6 @@ * */ -#define AAC_DRIVER_VERSION "1.1.2" -#define AAC_DRIVER_BUILD_DATE __DATE__ " " __TIME__ - #include #include #include @@ -56,15 +53,11 @@ #include "aacraid.h" #include "sd.h" -#define AAC_DRIVERNAME "aacraid" +#define AAC_DRIVER_NAME "aacraid" MODULE_AUTHOR("Red Hat Inc and Adaptec"); MODULE_DESCRIPTION("Supports Dell PERC2, 2/Si, 3/Si, 3/Di, Adaptec Advanced Raid Products, and HP NetRAID-4M devices. http://domsch.com/linux/ or http://linux.adaptec.com"); MODULE_LICENSE("GPL"); -MODULE_PARM(paemode, "i"); -MODULE_PARM_DESC(paemode, "Control whether dma addressing is using PAE. 0=off, 1=on"); - -static int paemode = -1; struct aac_dev *aac_devices[MAXIMUM_NUM_ADAPTERS]; @@ -107,15 +100,19 @@ { 0x9005, 0x0285, 0x9005, 0x0292, aac_rx_init, "aacraid", "ADAPTEC ", "AAR-2810SA SATA ", 2 }, /* AAR-2810SA PCI SATA 8ch (Corsair-8) */ { 0x9005, 0x0285, 0x9005, 0x0293, aac_rx_init, "aacraid", "ADAPTEC ", "AAR-21610SA SATA ", 2 }, /* AAR-21610SA PCI SATA 16ch (Corsair-16) */ { 0x9005, 0x0285, 0x9005, 0x0294, aac_rx_init, "aacraid", "ADAPTEC ", "SO-DIMM SATA ZCR ", 2 }, /* ESD SO-DIMM PCI-X SATA ZCR (Prowler) */ - /* ServeRAID */ -/* { 0x9005, 0x0250, 0x1014, 0x0279, aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec ", 2 }, */ /* (Marco) */ -/* { 0x9005, 0x0250, 0x1014, 0x028c, aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec ", 2 }, */ /* (Sebring)*/ + { 0x9005, 0x0285, 0x0E11, 0x0295, aac_rx_init, "aacraid", "ADAPTEC ", "SATA 6Channel ", 1 }, /* SATA 6Ch (Bearcat) */ { 0x9005, 0x0285, 0x1028, 0x0287, aac_rx_init, "percraid", "DELL ", "PERC 320/DC ", 2 }, /* Perc 320/DC*/ { 0x1011, 0x0046, 0x9005, 0x0365, aac_sa_init, "aacraid", "ADAPTEC ", "Adaptec 5400S ", 4 }, /* Adaptec 5400S (Mustang)*/ { 0x1011, 0x0046, 0x9005, 0x0364, aac_sa_init, "aacraid", "ADAPTEC ", "AAC-364 ", 4 }, /* Adaptec 5400S (Mustang)*/ { 0x1011, 0x0046, 0x9005, 0x1364, aac_sa_init, "percraid", "DELL ", "PERCRAID ", 4 }, /* Dell PERC2 "Quad Channel" */ - { 0x1011, 0x0046, 0x103c, 0x10c2, aac_sa_init, "hpnraid", "HP ", "NetRAID ", 4 } /* HP NetRAID-4M */ + { 0x1011, 0x0046, 0x103c, 0x10c2, aac_sa_init, "hpnraid", "HP ", "NetRAID ", 4 }, /* HP NetRAID-4M */ + { 0x9005, 0x0285, 0x1028, PCI_ANY_ID, + aac_rx_init, "aacraid", "DELL ", "RAID ", 2, AAC_QUIRK_31BIT },/* Dell Catchall */ + { 0x9005, 0x0285, 0x17aa, PCI_ANY_ID, + aac_rx_init, "aacraid", "Legend ", "RAID ", 2, AAC_QUIRK_31BIT },/* Legend Catchall */ + { 0x9005, 0x0285, PCI_ANY_ID, PCI_ANY_ID, + aac_rx_init, "aacraid", "ADAPTEC ", "RAID ", 2, AAC_QUIRK_31BIT } /* Adaptec Catch All */ }; #define NUM_AACTYPES (sizeof(aac_drivers) / sizeof(struct aac_driver_ident)) @@ -175,9 +172,15 @@ struct fsa_scsi_hba *fsa_dev_ptr; char *name = NULL; - printk(KERN_INFO "Red Hat/Adaptec aacraid driver (%s %s)\n", AAC_DRIVER_VERSION, AAC_DRIVER_BUILD_DATE); - + printk(KERN_INFO "Red Hat/Adaptec %s driver (%d.%d-%d %s)\n", + AAC_DRIVER_NAME, + AAC_DRIVER_VERSION >> 24, + (AAC_DRIVER_VERSION >> 16) & 0xFF, + (AAC_DRIVER_VERSION >> 8) & 0xFF, + AAC_DRIVER_BUILD_DATE); + /* setting up the proc directory structure */ + template->proc_name = "aacraid"; spin_unlock_irq(&io_request_lock); @@ -607,7 +610,7 @@ static int aac_eh_reset(Scsi_Cmnd* cmd) { - printk(KERN_ERR "aacraid: Host adapter reset request. SCSI hang ?\n"); + printk(KERN_ERR "%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVER_NAME); return FAILED; } @@ -741,13 +744,41 @@ static int aac_procinfo(char *proc_buffer, char **start_ptr,off_t offset, int bytes_available, int host_no, int write) { + struct aac_dev * dev; + int index, ret, tmp; + if(write || offset > 0) return 0; *start_ptr = proc_buffer; - return sprintf(proc_buffer, - "Adaptec Raid Controller %s %s, scsi hba number %d\n", - AAC_DRIVER_VERSION, AAC_DRIVER_BUILD_DATE, - host_no); + ret = sprintf(proc_buffer, + "Adaptec Raid Controller %d.%d-%d %s, scsi hba number %d\n", + AAC_DRIVER_VERSION >> 24, + (AAC_DRIVER_VERSION >> 16) & 0xFF, + (AAC_DRIVER_VERSION >> 8) & 0xFF, + AAC_DRIVER_BUILD_DATE, + host_no); + for (index = 0; index < aac_count; ++index) { + if (((dev = aac_devices[index]) != NULL) && dev->scsi_host_ptr->host_no == host_no) + break; + } + if (index >= aac_count || dev == NULL) + return ret; + tmp = dev->adapter_info.kernelrev; + ret += sprintf(proc_buffer + ret, "kernel: %d.%d-%d[%d]\n", + tmp >> 24, (tmp >> 16) & 0xff, (tmp >> 8) & 0xff, + dev->adapter_info.kernelbuild); + tmp = dev->adapter_info.monitorrev; + ret += sprintf(proc_buffer + ret, "monitor: %d.%d-%d[%d]\n", + tmp >> 24, (tmp >> 16) & 0xff, (tmp >> 8) & 0xff, + dev->adapter_info.monitorbuild); + tmp = dev->adapter_info.biosrev; + ret += sprintf(proc_buffer + ret, "bios: %d.%d-%d[%d]\n", + tmp >> 24, (tmp >> 16) & 0xff, (tmp >> 8) & 0xff, + dev->adapter_info.biosbuild); + ret += sprintf(proc_buffer + ret, "serial: %x%x\n", + dev->adapter_info.serial[0], + dev->adapter_info.serial[1]); + return ret; } EXPORT_NO_SYMBOLS; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/changelog.megaraid2 linux-2.4.23-pre8/drivers/scsi/changelog.megaraid2 --- linux-2.4.22/drivers/scsi/changelog.megaraid2 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/changelog.megaraid2 2003-10-22 22:47:31.000000000 +0000 @@ -0,0 +1,124 @@ +### Version 2.00.9 +Thu Sep 4 17:49:42 EDT 2003 - Atul Mukker +i. For extended passthru commands, 64-bit scatter-gather list and 64-bit + mailbox address must only be used if the controller supports extended + CDBs and 64-bit addressing and the kernel is configured to support + memory beyond 4GB. + With 2.00.8 and previous drivers, if the controllers supports extended + CDBs but the kernel does not support high memory - the driver prepares + a 32-bit sg list but the mailbox address is chosen to be 64-bit. This + causes FW to incorrectly read 32-bit (8 bytes) sg list as 64-bit + (12 bytes) sglist. This would cause IO from non-disk devices to fail + +### Version 2.00.8 +Wed Aug 27 16:40:05 EDT 2003 - Atul Mukker +i. Make sure the value of number of statuses, completed command id array, + and the mailbox status fields are updated in host memory before we + read and interpret them. For this to happen - mailbox numstatus and + command id array's first element are invalidated. The ISR busy waits + till valid values are obtained in these two fields. Now since the + status field is between these two fields it is assumed that status + values is sane when write to numstatus and completed id array is + complete +ii. while returning from the ioctl handler for the SCSI passthru commands + a direct access was made to the user address. Now the user structure + is copied in before the required field is accessed. +iii. Remove redundant volatile casts from pending command counter pend_cmds. + +### Version 2.00.7 +Fri Aug 1 11:01:11 EDT 2003 - Atul Mukker +i. Adapter lock re-definition so that patch for kernels w/o per host lock + is less intrusive - Jens Axboe + +ii. While in abort and reset handling, check for non-empty pending list is + invalid. The intent is to wait for pending commands in FW to complete, + not the pending commands with the driver - Atul Mukker + +### Version 2.00.6 +Wed Jul 30 11:35:31 EDT 2003 - Sreenivas Bagalkote +i. Declare the function prototypes used for "/proc" within the compiler + directives #ifdef CONFIG_PROC_FS. Similary, move global/local variable + declarations and code fragments related to /proc within the directives. + - Mark Haverkamp + +ii. Initialize host->lock with adapter->lock. + +iii. Wait for mailbox status to become valid + - Haruo Tomita + +iv. Right structure is passed to FW for 4-span read configuration command. + - Sreenivas Bagalkote + +### Version 2.00.5 +Thu Apr 24 14:06:55 EDT 2003 - Atul Mukker +i. Do not use repeated allocations for "pci_dev" for internal + allocations. Allocate the handle at load time and set the DMA mask for + allocations below 4GB. + +ii. Remove superfluous definitions, mid-layer /proc entry and synchronous + commands + +iii. Logical drive numbers were incremented in passthru structure after + random-deletion operation! Also, the logical drive deletion command is + issued in polled mode because of the racy nature of interrupt based + operation. + +iv. Add support for Intel's subsystem vendor id + +### Version 2.00.4 +Thu Apr 17 15:58:58 EDT 2003 +i. Do not put the completed SCSI commands in a list. Complete them to + mid-layer as soon as we have completed them and reclaimed our + associated resources + +ii. Break ISR functionality in two portions. The lower half serves as + interrupt acknowledgment sequence for the firmware. This half can also + be called from other places in the driver, e.g., the abort and reset + handlers. + +iii. New abort and reset handling. In these situations, driver allows more + time for the firmware to complete outstanding requests instead of + failing handlers right-away. + +### Version 2.00.3 +Wed Jan 29 09:13:44 EST 200 - Atul Mukker +i. Change the handshake in ISR while acknowledging interrupts. Write the + valid interrupt pattern 0x10001234 as soon as it is read from the + outdoor register. In existing driver and on certain platform, invalid + command ids were being returned. + + Also, do not wait on status be become 0xFF, since FW can return this + status in certain circumstances. + + Initialize the numstatus field of mailbox to 0xFF so that we can wait + on this wait in next interrupt. Firmware does not change its value + unless there are some status to be posted + +ii. Specify the logical drive number while issuing the RESERVATION_STATUS + +iii. Reduce the default mailbox busy wait time from 300us to 10us. This is + done to avoid a possible deadlock in FW because of longer bust waits. + +iv. The max outstanding commands are reduced to 126 because that's the + safest value on all FW. + +v. Number of sectors per IO are reduced to 128 (64kb), because FW needs + resources in special circumstances like check consistency, rebuilds + etc. + +vi. max_commands is no longer a module parameter because of iv. + +### Version: 2.00.2 +i. Intermediate release with kernel specific code + + +### Version: 2.00.1i +Wed Dec 4 14:34:51 EST 2002 - Atul Mukker +i. Making the older IO based controllers to work with this driver + + +### Version 2.00.1 +Fri Nov 15 10:59:44 EST 2002 - Atul Mukker +i. Release host lock before issuing internal command to reset + reservations in megaraid_reset() and reacquire after internal command + is completed. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/dmx3191d.c linux-2.4.23-pre8/drivers/scsi/dmx3191d.c --- linux-2.4.22/drivers/scsi/dmx3191d.c 2001-09-30 19:26:07.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/dmx3191d.c 2003-10-22 22:49:03.000000000 +0000 @@ -96,7 +96,7 @@ printk(KERN_WARNING "dmx3191: IRQ %d not available - switching to polled mode.\n", pdev->irq); /* Steam powered scsi controllers run without an IRQ anyway */ - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; } boards++; @@ -113,7 +113,7 @@ int dmx3191d_release_resources(struct Scsi_Host *instance) { release_region(instance->io_port, DMX3191D_REGION); - if(instance->irq!=IRQ_NONE) + if(instance->irq != SCSI_IRQ_NONE) free_irq(instance->irq, instance); return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/dtc.c linux-2.4.23-pre8/drivers/scsi/dtc.c --- linux-2.4.22/drivers/scsi/dtc.c 2001-12-21 17:41:55.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/dtc.c 2003-10-22 22:49:13.000000000 +0000 @@ -261,24 +261,24 @@ #ifndef DONT_USE_INTR /* With interrupts enabled, it will sometimes hang when doing heavy * reads. So better not enable them until I figure it out. */ - if (instance->irq != IRQ_NONE) + if (instance->irq != SCSI_IRQ_NONE) if (request_irq(instance->irq, do_dtc_intr, SA_INTERRUPT, "dtc")) { printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; } - if (instance->irq == IRQ_NONE) { + if (instance->irq == SCSI_IRQ_NONE) { printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no); printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no); } #else - if (instance->irq != IRQ_NONE) + if (instance->irq != SCSI_IRQ_NONE) printk(KERN_INFO "scsi%d : interrupts not used. Might as well not jumper it.\n", instance->host_no); - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; #endif printk(KERN_INFO "scsi%d : at 0x%05X", instance->host_no, (int) instance->base); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) printk(" interrupts disabled"); else printk(" irq %d", instance->irq); @@ -336,7 +336,7 @@ i = 0; NCR5380_read(RESET_PARITY_INTERRUPT_REG); NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ); else NCR5380_write(DTC_CONTROL_REG, CSR_DIR_READ | CSR_INT_BASE); @@ -384,7 +384,7 @@ NCR5380_read(RESET_PARITY_INTERRUPT_REG); NCR5380_write(MODE_REG, MR_ENABLE_EOP_INTR | MR_DMA_MODE); /* set direction (write) */ - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) NCR5380_write(DTC_CONTROL_REG, 0); else NCR5380_write(DTC_CONTROL_REG, CSR_5380_INTR); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/g_NCR5380.c linux-2.4.23-pre8/drivers/scsi/g_NCR5380.c --- linux-2.4.22/drivers/scsi/g_NCR5380.c 2001-12-21 17:41:55.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/g_NCR5380.c 2003-10-22 22:47:56.000000000 +0000 @@ -333,7 +333,7 @@ if (dev->irq_resource[0].flags & IORESOURCE_IRQ) overrides[count].irq = dev->irq_resource[0].start; else - overrides[count].irq = IRQ_NONE; + overrides[count].irq = SCSI_IRQ_NONE; if (dev->dma_resource[0].flags & IORESOURCE_DMA) overrides[count].dma = dev->dma_resource[0].start; else @@ -430,19 +430,19 @@ else instance->irq = NCR5380_probe_irq(instance, 0xffff); - if (instance->irq != IRQ_NONE) + if (instance->irq != SCSI_IRQ_NONE) if (request_irq(instance->irq, do_generic_NCR5380_intr, SA_INTERRUPT, "NCR5380", NULL)) { printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; } - if (instance->irq == IRQ_NONE) { + if (instance->irq == SCSI_IRQ_NONE) { printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no); printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no); } printk(KERN_INFO "scsi%d : at " STRVAL(NCR5380_map_name) " 0x%x", instance->host_no, (unsigned int) instance->NCR5380_instance_name); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) printk(" interrupts disabled"); else printk(" irq %d", instance->irq); @@ -489,7 +489,7 @@ release_mem_region(instance->NCR5380_instance_name, NCR5380_region_size); #endif - if (instance->irq != IRQ_NONE) + if (instance->irq != SCSI_IRQ_NONE) free_irq(instance->irq, NULL); return 0; @@ -802,7 +802,7 @@ PRINTP("NO NCR53C400 driver extensions\n"); #endif PRINTP("Using %s mapping at %s 0x%lx, " ANDP STRVAL(NCR5380_map_config) ANDP STRVAL(NCR5380_map_name) ANDP scsi_ptr->NCR5380_instance_name); - if (scsi_ptr->irq == IRQ_NONE) + if (scsi_ptr->irq == SCSI_IRQ_NONE) PRINTP("no interrupt\n"); else PRINTP("on interrupt %d\n" ANDP scsi_ptr->irq); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/ide-scsi.c linux-2.4.23-pre8/drivers/scsi/ide-scsi.c --- linux-2.4.22/drivers/scsi/ide-scsi.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/ide-scsi.c 2003-10-22 22:47:32.000000000 +0000 @@ -531,6 +531,8 @@ atapi_bcount_t bcount; struct request *rq = pc->rq; + feature.all = 0; + /* Set the current packet command */ scsi->pc = pc; /* We haven't transferred any data yet */ @@ -539,6 +541,7 @@ /* Request to transfer the entire buffer at once */ bcount.all = IDE_MIN(pc->request_transfer, 63 * 1024); + if (drive->using_dma && rq->bh) { if (test_bit(PC_WRITING, &pc->flags)) feature.b.dma = !HWIF(drive)->ide_dma_write(drive); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/ips.c linux-2.4.23-pre8/drivers/scsi/ips.c --- linux-2.4.22/drivers/scsi/ips.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/ips.c 2003-10-22 22:47:29.000000000 +0000 @@ -5,8 +5,8 @@ /* Jack Hammer, Adaptec, Inc. */ /* David Jeffery, Adaptec, Inc. */ /* */ -/* Copyright (C) 2000 IBM Corporation */ -/* Copyright (C) 2003 Adaptec, Inc. */ +/* Copyright (C) 2000 IBM Corporation */ +/* Copyright (C) 2002,2003 Adaptec, Inc. */ /* */ /* 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 */ @@ -83,7 +83,7 @@ /* 2.3.18 and later */ /* - Sync with other changes from the 2.3 kernels */ /* 4.00.06 - Fix timeout with initial FFDC command */ -/* 4.00.06a - Port to 2.4 (trivial) -- Christoph Hellwig */ +/* 4.00.06a - Port to 2.4 (trivial) -- Christoph Hellwig */ /* 4.10.00 - Add support for ServeRAID 4M/4L */ /* 4.10.13 - Fix for dynamic unload and proc file system */ /* 4.20.03 - Rename version to coincide with new release schedules */ @@ -130,6 +130,7 @@ /* 5.10.15 - remove unused code (sem, macros, etc.) */ /* 5.30.00 - use __devexit_p() */ /* 6.00.00 - Add 6x Adapters and Battery Flash */ +/* 6.10.00 - Remove 1G Addressing Limitations */ /*****************************************************************************/ /* @@ -150,7 +151,7 @@ * nommap - Don't use memory mapped I/O * ioctlsize - Initial size of the IOCTL buffer */ - + #include #include #include @@ -182,75 +183,35 @@ #include #include -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) - #include - #include -#else - #include -#endif +#include +#include #include #ifdef MODULE - static char *ips = NULL; - MODULE_PARM(ips, "s"); +static char *ips = NULL; +MODULE_PARM(ips, "s"); #endif /* * DRIVER_VER */ -#define IPS_VERSION_HIGH "6.00" -#define IPS_VERSION_LOW ".26 " - - -#if LINUX_VERSION_CODE < LinuxVersionCode(2,4,0) -struct proc_dir_entry proc_scsi_ips = { - 0, - 3, "ips", - S_IFDIR | S_IRUGO | S_IXUGO, 2 -}; -#endif +#define IPS_VERSION_HIGH "6.10" +#define IPS_VERSION_LOW ".24 " #if !defined(__i386__) && !defined(__ia64__) - #error "This driver has only been tested on the x86/ia64 platforms" -#endif - -#if LINUX_VERSION_CODE < LinuxVersionCode(2,2,0) - #error "This driver only works with kernel 2.2.0 and later" -#elif LINUX_VERSION_CODE <= LinuxVersionCode(2,3,18) - #define dma_addr_t uint32_t - - static inline void *pci_alloc_consistent(struct pci_dev *dev,int size, - dma_addr_t *dmahandle) { - void * ptr = kmalloc(size, GFP_ATOMIC); - if(ptr){ - *dmahandle = (uint32_t)virt_to_bus(ptr); - } - return ptr; - } - - #define pci_free_consistent(a,size,address,dmahandle) kfree(address) - - #define pci_map_sg(a,b,n,z) (n) - #define pci_unmap_sg(a,b,c,d) - #define pci_map_single(a,b,c,d) ((uint32_t)virt_to_bus(b)) - #define pci_unmap_single(a,b,c,d) - #ifndef sg_dma_address - #define sg_dma_address(x) ((uint32_t)virt_to_bus((x)->address)) - #define sg_dma_len(x) ((x)->length) - #endif - #define pci_unregister_driver(x) +#error "This driver has only been tested on the x86/ia64 platforms" #endif #if LINUX_VERSION_CODE <= LinuxVersionCode(2,5,0) - #define IPS_SG_ADDRESS(sg) ((sg)->address) - #define IPS_LOCK_SAVE(lock,flags) spin_lock_irqsave(&io_request_lock,flags) - #define IPS_UNLOCK_RESTORE(lock,flags) spin_unlock_irqrestore(&io_request_lock,flags) +#define IPS_SG_ADDRESS(sg) ((sg)->address) +#define IPS_LOCK_SAVE(lock,flags) spin_lock_irqsave(&io_request_lock,flags) +#define IPS_UNLOCK_RESTORE(lock,flags) spin_unlock_irqrestore(&io_request_lock,flags) #else - #define IPS_SG_ADDRESS(sg) (page_address((sg)->page) ? \ +#define IPS_SG_ADDRESS(sg) (page_address((sg)->page) ? \ page_address((sg)->page)+(sg)->offset : 0) - #define IPS_LOCK_SAVE(lock,flags) spin_lock(lock) - #define IPS_UNLOCK_RESTORE(lock,flags) spin_unlock(lock) +#define IPS_LOCK_SAVE(lock,flags) do{spin_lock(lock);(void)flags;}while(0) +#define IPS_UNLOCK_RESTORE(lock,flags) do{spin_unlock(lock);(void)flags;}while(0) #endif #define IPS_DMA_DIR(scb) ((!scb->scsi_cmd || ips_is_passthru(scb->scsi_cmd) || \ @@ -259,218 +220,144 @@ scsi_to_pci_dma_dir(scb->scsi_cmd->sc_data_direction)) #ifdef IPS_DEBUG - #define METHOD_TRACE(s, i) if (ips_debug >= (i+10)) printk(KERN_NOTICE s "\n"); - #define DEBUG(i, s) if (ips_debug >= i) printk(KERN_NOTICE s "\n"); - #define DEBUG_VAR(i, s, v...) if (ips_debug >= i) printk(KERN_NOTICE s "\n", v); +#define METHOD_TRACE(s, i) if (ips_debug >= (i+10)) printk(KERN_NOTICE s "\n"); +#define DEBUG(i, s) if (ips_debug >= i) printk(KERN_NOTICE s "\n"); +#define DEBUG_VAR(i, s, v...) if (ips_debug >= i) printk(KERN_NOTICE s "\n", v); #else - #define METHOD_TRACE(s, i) - #define DEBUG(i, s) - #define DEBUG_VAR(i, s, v...) +#define METHOD_TRACE(s, i) +#define DEBUG(i, s) +#define DEBUG_VAR(i, s, v...) #endif /* * global variables */ -static const char ips_name[] = "ips"; -static struct Scsi_Host *ips_sh[IPS_MAX_ADAPTERS]; /* Array of host controller structures */ -static ips_ha_t *ips_ha[IPS_MAX_ADAPTERS]; /* Array of HA structures */ -static unsigned int ips_next_controller = 0; -static unsigned int ips_num_controllers = 0; -static unsigned int ips_released_controllers = 0; -static int ips_cmd_timeout = 60; -static int ips_reset_timeout = 60 * 5; -static int ips_force_memio = 1; /* Always use Memory Mapped I/O */ -static int ips_force_i2o = 1; /* Always use I2O command delivery */ -static int ips_ioctlsize = IPS_IOCTL_SIZE; /* Size of the ioctl buffer */ -static int ips_cd_boot = 0; /* Booting from Manager CD */ -static char *ips_FlashData = NULL; /* CD Boot - Flash Data Buffer */ -static long ips_FlashDataInUse = 0; /* CD Boot - Flash Data In Use Flag */ -static uint32_t MaxLiteCmds = 32; /* Max Active Cmds for a Lite Adapter */ +static const char ips_name[] = "ips"; +static struct Scsi_Host *ips_sh[IPS_MAX_ADAPTERS]; /* Array of host controller structures */ +static ips_ha_t *ips_ha[IPS_MAX_ADAPTERS]; /* Array of HA structures */ +static unsigned int ips_next_controller; +static unsigned int ips_num_controllers; +static unsigned int ips_released_controllers; +static int ips_cmd_timeout = 60; +static int ips_reset_timeout = 60 * 5; +static int ips_force_memio = 1; /* Always use Memory Mapped I/O */ +static int ips_force_i2o = 1; /* Always use I2O command delivery */ +static int ips_ioctlsize = IPS_IOCTL_SIZE; /* Size of the ioctl buffer */ +static int ips_cd_boot; /* Booting from Manager CD */ +static char *ips_FlashData = NULL; /* CD Boot - Flash Data Buffer */ +static long ips_FlashDataInUse; /* CD Boot - Flash Data In Use Flag */ +static uint32_t MaxLiteCmds = 32; /* Max Active Cmds for a Lite Adapter */ +static Scsi_Host_Template ips_driver_template = IPS; -IPS_DEFINE_COMPAT_TABLE( Compatable ); /* Version Compatability Table */ +IPS_DEFINE_COMPAT_TABLE(Compatable); /* Version Compatability Table */ - -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) /* This table describes all ServeRAID Adapters */ - static struct pci_device_id ips_pci_table[] __devinitdata = { - { 0x1014, 0x002E, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, - { 0x1014, 0x01BD, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, - { 0x9005, 0x0250, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, - { 0, } - }; - - /* This table describes only Anaconda Family Adapters */ - static struct pci_device_id ips_pci_table_anaconda[] __devinitdata = { - { 0x1014, 0x002E, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, - { 0, } - }; - - /* This table describes only Sarasota ( ServeRAID 5i ) Adapters */ - static struct pci_device_id ips_pci_table_5i[] __devinitdata = { - { 0x1014, 0x01BD, PCI_ANY_ID, 0x259, 0, 0 }, - { 0x1014, 0x01BD, PCI_ANY_ID, 0x258, 0, 0 }, - { 0, } - }; - - /* This table describes only Sebring ( ServeRAID 6i ) Adapters */ - static struct pci_device_id ips_pci_table_6i[] __devinitdata = { - { 0x9005, 0x0250, PCI_ANY_ID, 0x28C, 0, 0 }, - { 0, } - }; - - /* This table describes all i960 ( 4M, 4Mx, 4L, 4Lx ) Adapters */ - static struct pci_device_id ips_pci_table_i960[] __devinitdata = { - { 0x1014, 0x01BD, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, - { 0, } - }; - - /* This table describes all Adaptec ( 6M ) Adapters */ - static struct pci_device_id ips_pci_table_adaptec[] __devinitdata = { - { 0x9005, 0x0250, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, - { 0, } - }; - - MODULE_DEVICE_TABLE( pci, ips_pci_table ); - - static char ips_hot_plug_name[] = "ips"; - - static int __devinit ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent); - static void ips_remove_device(struct pci_dev *pci_dev); - - struct pci_driver ips_pci_driver = { - name: ips_hot_plug_name, - id_table: ips_pci_table, - probe: ips_insert_device, - remove: ips_remove_device, - }; - - struct pci_driver ips_pci_driver_anaconda = { - name: ips_hot_plug_name, - id_table: ips_pci_table_anaconda, - probe: ips_insert_device, - remove: ips_remove_device, - }; - - struct pci_driver ips_pci_driver_5i = { - name: ips_hot_plug_name, - id_table: ips_pci_table_5i, - probe: ips_insert_device, - remove: ips_remove_device, - }; - - struct pci_driver ips_pci_driver_6i = { - name: ips_hot_plug_name, - id_table: ips_pci_table_6i, - probe: ips_insert_device, - remove: ips_remove_device, - }; - - struct pci_driver ips_pci_driver_i960 = { - name: ips_hot_plug_name, - id_table: ips_pci_table_i960, - probe: ips_insert_device, - remove: ips_remove_device, - }; - - struct pci_driver ips_pci_driver_adaptec = { - name: ips_hot_plug_name, - id_table: ips_pci_table_adaptec, - probe: ips_insert_device, - remove: ips_remove_device, - }; +static struct pci_device_id ips_pci_table[] __devinitdata = { + {0x1014, 0x002E, PCI_ANY_ID, PCI_ANY_ID, 0, 0}, + {0x1014, 0x01BD, PCI_ANY_ID, PCI_ANY_ID, 0, 0}, + {0x9005, 0x0250, PCI_ANY_ID, PCI_ANY_ID, 0, 0}, + {0,} +}; -#endif +MODULE_DEVICE_TABLE(pci, ips_pci_table); + +static char ips_hot_plug_name[] = "ips"; + +static int __devinit ips_insert_device(struct pci_dev *pci_dev, + const struct pci_device_id *ent); +static void ips_remove_device(struct pci_dev *pci_dev); + +struct pci_driver ips_pci_driver = { + .name = ips_hot_plug_name, + .id_table = ips_pci_table, + .probe = ips_insert_device, + .remove = ips_remove_device, +}; /* * Necessary forward function protoypes */ static int ips_halt(struct notifier_block *nb, ulong event, void *buf); -#define MAX_ADAPTER_NAME 11 +#define MAX_ADAPTER_NAME 15 static char ips_adapter_name[][30] = { - "ServeRAID", - "ServeRAID II", - "ServeRAID on motherboard", - "ServeRAID on motherboard", - "ServeRAID 3H", - "ServeRAID 3L", - "ServeRAID 4H", - "ServeRAID 4M", - "ServeRAID 4L", - "ServeRAID 4Mx", - "ServeRAID 4Lx", - "ServeRAID 5i", - "ServeRAID 5i", - "ServeRAID 6M", - "ServeRAID 6i" + "ServeRAID", + "ServeRAID II", + "ServeRAID on motherboard", + "ServeRAID on motherboard", + "ServeRAID 3H", + "ServeRAID 3L", + "ServeRAID 4H", + "ServeRAID 4M", + "ServeRAID 4L", + "ServeRAID 4Mx", + "ServeRAID 4Lx", + "ServeRAID 5i", + "ServeRAID 5i", + "ServeRAID 6M", + "ServeRAID 6i" }; -/* Init State 0 means we're only looking for a device to provide us the BIOS Adapter Ordering Table */ -/* Init State 1 is when we are actually enumerating the devices. */ -static int InitState; -/* IF BIOS wants to tell us the enumeration order, it puts a table in NVRAM Page 5 */ -static uint8_t AdapterOrder[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - static struct notifier_block ips_notifier = { - ips_halt, NULL, 0 + ips_halt, NULL, 0 }; /* * Direction table */ static char ips_command_direction[] = { -IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, -IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, -IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT, -IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_OUT, -IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT, -IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_IN, -IPS_DATA_UNK, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_UNK, -IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, -IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, -IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, -IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, -IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_NONE, -IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, -IPS_DATA_NONE, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_NONE, -IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_OUT, -IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_NONE, -IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_OUT, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, -IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK + IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, + IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, + IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT, + IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_OUT, + IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_OUT, + IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_IN, + IPS_DATA_UNK, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_UNK, + IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, + IPS_DATA_OUT, IPS_DATA_NONE, IPS_DATA_IN, IPS_DATA_NONE, IPS_DATA_NONE, + IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, + IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_OUT, + IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_IN, IPS_DATA_NONE, + IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, + IPS_DATA_NONE, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_IN, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_NONE, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_NONE, + IPS_DATA_OUT, IPS_DATA_UNK, IPS_DATA_NONE, IPS_DATA_UNK, IPS_DATA_OUT, + IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_OUT, IPS_DATA_NONE, + IPS_DATA_UNK, IPS_DATA_IN, IPS_DATA_OUT, IPS_DATA_IN, IPS_DATA_IN, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_OUT, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, + IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK, IPS_DATA_UNK }; /* @@ -480,9 +367,9 @@ int ips_release(struct Scsi_Host *); int ips_eh_abort(Scsi_Cmnd *); int ips_eh_reset(Scsi_Cmnd *); -int ips_queue(Scsi_Cmnd *, void (*) (Scsi_Cmnd *)); +int ips_queue(Scsi_Cmnd *, void (*)(Scsi_Cmnd *)); int ips_biosparam(Disk *, kdev_t, int *); -const char * ips_info(struct Scsi_Host *); +const char *ips_info(struct Scsi_Host *); void do_ipsintr(int, void *, struct pt_regs *); static int ips_hainit(ips_ha_t *); static int ips_map_status(ips_ha_t *, ips_scb_t *, ips_stat_t *); @@ -527,10 +414,9 @@ static int ips_flash_copperhead(ips_ha_t *, ips_passthru_t *, ips_scb_t *); static int ips_flash_bios(ips_ha_t *, ips_passthru_t *, ips_scb_t *); static int ips_flash_firmware(ips_ha_t *, ips_passthru_t *, ips_scb_t *); -static void ips_free_flash_copperhead(ips_ha_t *ha); +static void ips_free_flash_copperhead(ips_ha_t * ha); static void ips_get_bios_version(ips_ha_t *, int); static void ips_identify_controller(ips_ha_t *); -static void ips_select_queue_depth(struct Scsi_Host *, Scsi_Device *); static void ips_chkstatus(ips_ha_t *, IPS_STATUS *); static void ips_enable_int_copperhead(ips_ha_t *); static void ips_enable_int_copperhead_memio(ips_ha_t *); @@ -553,40 +439,43 @@ static uint32_t ips_statupd_copperhead(ips_ha_t *); static uint32_t ips_statupd_copperhead_memio(ips_ha_t *); static uint32_t ips_statupd_morpheus(ips_ha_t *); -static ips_scb_t * ips_getscb(ips_ha_t *); +static ips_scb_t *ips_getscb(ips_ha_t *); static inline void ips_putq_scb_head(ips_scb_queue_t *, ips_scb_t *); static inline void ips_putq_scb_tail(ips_scb_queue_t *, ips_scb_t *); static inline void ips_putq_wait_head(ips_wait_queue_t *, Scsi_Cmnd *); static inline void ips_putq_wait_tail(ips_wait_queue_t *, Scsi_Cmnd *); -static inline void ips_putq_copp_head(ips_copp_queue_t *, ips_copp_wait_item_t *); -static inline void ips_putq_copp_tail(ips_copp_queue_t *, ips_copp_wait_item_t *); -static inline ips_scb_t * ips_removeq_scb_head(ips_scb_queue_t *); -static inline ips_scb_t * ips_removeq_scb(ips_scb_queue_t *, ips_scb_t *); -static inline Scsi_Cmnd * ips_removeq_wait_head(ips_wait_queue_t *); -static inline Scsi_Cmnd * ips_removeq_wait(ips_wait_queue_t *, Scsi_Cmnd *); -static inline ips_copp_wait_item_t * ips_removeq_copp(ips_copp_queue_t *, ips_copp_wait_item_t *); -static inline ips_copp_wait_item_t * ips_removeq_copp_head(ips_copp_queue_t *); +static inline void ips_putq_copp_head(ips_copp_queue_t *, + ips_copp_wait_item_t *); +static inline void ips_putq_copp_tail(ips_copp_queue_t *, + ips_copp_wait_item_t *); +static inline ips_scb_t *ips_removeq_scb_head(ips_scb_queue_t *); +static inline ips_scb_t *ips_removeq_scb(ips_scb_queue_t *, ips_scb_t *); +static inline Scsi_Cmnd *ips_removeq_wait_head(ips_wait_queue_t *); +static inline Scsi_Cmnd *ips_removeq_wait(ips_wait_queue_t *, Scsi_Cmnd *); +static inline ips_copp_wait_item_t *ips_removeq_copp(ips_copp_queue_t *, + ips_copp_wait_item_t *); +static inline ips_copp_wait_item_t *ips_removeq_copp_head(ips_copp_queue_t *); static int ips_is_passthru(Scsi_Cmnd *); static int ips_make_passthru(ips_ha_t *, Scsi_Cmnd *, ips_scb_t *, int); static int ips_usrcmd(ips_ha_t *, ips_passthru_t *, ips_scb_t *); static void ips_cleanup_passthru(ips_ha_t *, ips_scb_t *); +static void ips_scmd_buf_write(Scsi_Cmnd * scmd, void *data, + unsigned int count); +static void ips_scmd_buf_read(Scsi_Cmnd * scmd, void *data, unsigned int count); -int ips_proc_info(char *, char **, off_t, int, int, int); +int ips_proc_info(char *, char **, off_t, int, int, int); static int ips_host_info(ips_ha_t *, char *, off_t, int); static void copy_mem_info(IPS_INFOSTR *, char *, int); static int copy_info(IPS_INFOSTR *, char *, ...); -static int ips_get_version_info(ips_ha_t *ha, IPS_VERSION_DATA *Buffer, int intr ); -static void ips_version_check(ips_ha_t *ha, int intr); -static int ips_abort_init(ips_ha_t *ha, struct Scsi_Host *sh, int index); -static int ips_init_phase2( int index ); - -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) -static int ips_init_phase1( struct pci_dev *pci_dev, int *indexPtr ); -#else -static int ips_init_oldphase1(Scsi_Host_Template *SHT); -#endif +static int ips_get_version_info(ips_ha_t * ha, IPS_VERSION_DATA * Buffer, + int intr); +static void ips_version_check(ips_ha_t * ha, int intr); +static int ips_abort_init(ips_ha_t * ha, int index); +static int ips_init_phase2(int index); +static int ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr); +static int ips_register_scsi(int index); /*--------------------------------------------------------------------------*/ /* Exported Functions */ /*--------------------------------------------------------------------------*/ @@ -600,92 +489,52 @@ /* setup parameters to the driver */ /* */ /****************************************************************************/ -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) static int -ips_setup(char *ips_str) { -#else -void -ips_setup(char *ips_str, int *dummy) { -#endif - - int i; - char *key; - char *value; - IPS_OPTION options[] = { - {"noi2o", &ips_force_i2o, 0}, - {"nommap", &ips_force_memio, 0}, - {"ioctlsize", &ips_ioctlsize, IPS_IOCTL_SIZE}, - {"cdboot", &ips_cd_boot, 0}, - {"maxcmds", &MaxLiteCmds, 32}, - }; - - /* Don't use strtok() anymore ( if 2.4 Kernel or beyond ) */ -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) - /* Search for value */ - while ((key = strsep(&ips_str, ",."))) { - if (!*key) - continue; - value = strchr(key, ':'); - if (value) - *value++ = '\0'; - /* - * We now have key/value pairs. - * Update the variables - */ - for (i = 0; i < (sizeof(options) / sizeof(options[0])); i++) { - if (strnicmp(key, options[i].option_name, strlen(options[i].option_name)) == 0) { - if (value) - *options[i].option_flag = simple_strtoul(value, NULL, 0); - else - *options[i].option_flag = options[i].option_value; - break; - } - } - } - - return (1); - -#else - - char *p; - char tokens[3] = {',', '.', 0}; - - for (key = strtok(ips_str, tokens); key; key = strtok(NULL, tokens)) { - p = key; - - /* Search for value */ - while ((p) && (*p != ':')) - p++; - - if (p) { - *p = '\0'; - value = p+1; - } else - value = NULL; - - /* - * We now have key/value pairs. - * Update the variables - */ - for (i = 0; i < (sizeof(options) / sizeof(options[0])); i++) { - if (strnicmp(key, options[i].option_name, strlen(ips_str)) == 0) { - if (value) - *options[i].option_flag = simple_strtoul(value, NULL, 0); - else - *options[i].option_flag = options[i].option_value; - - break; - } - } - } +ips_setup(char *ips_str) +{ -#endif + int i; + char *key; + char *value; + IPS_OPTION options[] = { + {"noi2o", &ips_force_i2o, 0}, + {"nommap", &ips_force_memio, 0}, + {"ioctlsize", &ips_ioctlsize, IPS_IOCTL_SIZE}, + {"cdboot", &ips_cd_boot, 0}, + {"maxcmds", &MaxLiteCmds, 32}, + }; + + /* Don't use strtok() anymore ( if 2.4 Kernel or beyond ) */ + /* Search for value */ + while ((key = strsep(&ips_str, ",."))) { + if (!*key) + continue; + value = strchr(key, ':'); + if (value) + *value++ = '\0'; + /* + * We now have key/value pairs. + * Update the variables + */ + for (i = 0; i < (sizeof (options) / sizeof (options[0])); i++) { + if (strnicmp + (key, options[i].option_name, + strlen(options[i].option_name)) == 0) { + if (value) + *options[i].option_flag = + simple_strtoul(value, NULL, 0); + else + *options[i].option_flag = + options[i].option_value; + break; + } + } + } + return (1); } -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) __setup("ips=", ips_setup); -#endif /****************************************************************************/ /* */ @@ -699,682 +548,97 @@ /* */ /****************************************************************************/ int -ips_detect(Scsi_Host_Template *SHT) { -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) - int i; -#endif +ips_detect(Scsi_Host_Template * SHT) +{ + int i; - METHOD_TRACE("ips_detect", 1); + METHOD_TRACE("ips_detect", 1); #ifdef MODULE - if (ips) -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) - ips_setup(ips); -#else - ips_setup(ips, NULL); -#endif -#endif - - /* If Booting from the Manager CD, Allocate a large Flash */ - /* Buffer ( so we won't need to allocate one for each adapter ). */ - if ( ips_cd_boot ) { - ips_FlashData = ( char * ) __get_free_pages( GFP_KERNEL, 7 ); - if (ips_FlashData == NULL) { - /* The validity of this pointer is checked in ips_make_passthru() before it is used */ - printk( KERN_WARNING "ERROR: Can't Allocate Large Buffer for Flashing\n" ); - } - } - /* initalize number of controllers */ - ips_num_controllers = 0; - ips_next_controller = 0; - ips_released_controllers = 0; - - if (!pci_present()) - return (0); - -/**********************************************************************************/ -/* For Kernel Versions 2.4 or greater, use new PCI ( Hot Pluggable ) architecture */ -/**********************************************************************************/ - -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) - #if LINUX_VERSION_CODE < LinuxVersionCode(2,5,0) - spin_unlock_irq(&io_request_lock); - #endif - SHT->proc_info = ips_proc_info; - SHT->proc_name = "ips"; - - /* There are several special cases ( which are too complicated to enumerate here ) where, due */ - /* to System BIOS rules, the adapters must be enumerated in a certain order. If ServeRAID */ - /* BIOS tells us the order, then we will follow it. The first pass at init is simply to be */ - /* able to communicate with the first adapter to see if BIOS is telling us the order. */ - /* This does not apply to ia64 EFI BIOS. */ - -#if !defined(__ia64__) - InitState = 0; - pci_module_init(&ips_pci_driver); /* Look for Any Adapter, to fill in the Adapter Order Table */ + if (ips) + ips_setup(ips); #endif - InitState = 1; - - if ( AdapterOrder[0] ) { - /* BIOS has dictated the order that we should enumerate Adapters */ - for ( i = 1; i <= AdapterOrder[0]; i++ ) { - switch (AdapterOrder[i]) { - case 'M': - pci_module_init(&ips_pci_driver_adaptec); /* Ask for Adaptec Adapters */ - break; - case 'S': - pci_module_init(&ips_pci_driver_5i); /* Ask for 5i Adapters */ - pci_module_init(&ips_pci_driver_6i); /* Ask for 6i Adapters */ - break; - case 'N': - pci_module_init(&ips_pci_driver_i960); /* Ask for i960 Adapters */ - break; - case 'A': - pci_module_init(&ips_pci_driver_anaconda); /* Ask for Anaconda Family Adapters */ - break; - default: - i = AdapterOrder[0] + 1; /* Premature End of List - Ensure Loop Ends */ - break; - } - } - } - else { - /* No Adapter Order Table from BIOS, so sort things the old-fashioned way */ - - /* By definition, an Internal ( 5i or 6i ) Adapter MUST be enumerated first */ - /* or the server may not boot properly. The adapters must be enumerated in */ - /* exactly the same order as BIOS for the machine to come up properly. */ - /* NOTE: There will never be both a 5i and a 6i in the same machine. */ - - pci_module_init(&ips_pci_driver_5i); /* Ask for 5i Adapters First */ - if (ips_num_controllers) { /* If there is a 5i Adapter */ - pci_module_init(&ips_pci_driver_i960); /* Get all i960's next */ - } - else { - pci_module_init(&ips_pci_driver_6i); /* Ask if any 6i Adapters */ - if (ips_num_controllers) /* If there is a 6i Adapter */ - pci_module_init(&ips_pci_driver_adaptec); /* Get all Adaptecs next */ - } - - pci_module_init(&ips_pci_driver); /* Get all remaining Adapters */ - /* ( in normal BUS order ) */ - } - - #if LINUX_VERSION_CODE < LinuxVersionCode(2,5,0) - spin_lock_irq(&io_request_lock); - #endif - if (ips_num_controllers > 0) - register_reboot_notifier(&ips_notifier); - - return (ips_num_controllers); -#else - InitState = 1; - SHT->proc_info = ips_proc_info; - SHT->proc_dir = &proc_scsi_ips; - return ips_init_oldphase1(SHT); -#endif /* LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) */ - -} - -#if LINUX_VERSION_CODE < LinuxVersionCode(2,4,0) - -/***********************************************************************************/ -/* Sort the Device Structures */ -/* Devices are sorted by groups ( type ) and then PCI address within each group */ -/* This also results in the same ordering that results when using the 2.4 kernel */ -/* architecture for initialization. */ -/***********************************************************************************/ - -static void -ips_sort_controllers(struct pci_dev *dev[]) { - struct pci_dev *tempdev[IPS_MAX_ADAPTERS]; - struct pci_dev *lowestdev; - int i, j; - int temp_index = 0; /* Index into tempdev[] array */ - int lowIndex = 0; - int newlowflag = 0; /* Flag to indicate when a new low address has been found */ - uint16_t subdevice_id; - unsigned char BusNumber; - - /* Clear the Temporary Dev Structure */ - for (i = 0; i < IPS_MAX_ADAPTERS; i++) - tempdev[i] = NULL; - - /* The Outer Loop goes thru each Adapter Type Supported */ - for (j = 0; j < IPS_MAX_ADAPTER_TYPES; j++) { - lowestdev = NULL; - /* The Inner Loop Checks each Device still in the List and */ - /* Finds the lowset adapter left ( by PCI boot order ) */ - for (i = 0; i < IPS_MAX_ADAPTERS; i++) { - if (dev[i]) { - if (lowestdev == NULL) { /* If this is the first one found, it must be the lowest ! */ - lowestdev = dev[i]; - lowIndex = i; - } - - /* If you find a Sarasota ( 5i ), it must always be treated as the first adapter */ - if (dev[i]->device == IPS_DEVICEID_MORPHEUS) { - pci_read_config_word(dev[i], PCI_SUBSYSTEM_ID, &subdevice_id); - if ((subdevice_id == IPS_SUBDEVICEID_5I1) || - (subdevice_id == IPS_SUBDEVICEID_5I2)) { - lowestdev = dev[i]; - lowIndex = i; - break; - } - } - - /* If you find a Sebring ( 6i ), it must always be treated as the first adapter */ - if (dev[i]->device == IPS_DEVICEID_MARCO) { - pci_read_config_word(dev[i], PCI_SUBSYSTEM_ID, &subdevice_id); - if (subdevice_id == IPS_SUBDEVICEID_6I) { - lowestdev = dev[i]; - lowIndex = i; - break; - } - } - - /* Determine if this device is at a lower PCI address than the current lowest device */ - newlowflag = 0; - - if (dev[i]->device == IPS_DEVICEID_MARCO) /* System BIOS adds 1 to Marco Bus Number */ - BusNumber = ( dev[i]->bus->number ) - 1; /* because of Bridge Chip */ - else - BusNumber = dev[i]->bus->number; - - if (BusNumber < lowestdev->bus->number) /* IF a lower BUS # */ - newlowflag = i; - - if ((BusNumber == lowestdev->bus->number) && /* If Same Bus #, but a lower device # */ - (dev[i]->devfn < lowestdev->devfn)) - newlowflag = i; - - if ( newlowflag ) { - lowestdev = dev[i]; - lowIndex = i; - } - } - } - - if (lowestdev) { /* If we found another adapter */ - tempdev[temp_index] = lowestdev; /* Add it in the list */ - dev[lowIndex] = NULL; /* Null it out so we don't find it again */ - temp_index++; - /* Now get all the adapters that are the same type as the low one . */ - /* They will already be in order, so they don't need any further sorting.*/ - for (i = 0; i < IPS_MAX_ADAPTERS; i++) { - if (dev[i]) { - if (dev[i]->device == lowestdev->device) { - tempdev[temp_index] = dev[i]; /* Add the same type adapter to the list */ - temp_index++; - dev[i] = NULL; /* Null it out so we don't find it again */ - } - } - } - } - } - - /* Copy the Sorted Adapter Pointers ( tempdev[] ) to the Original Structure */ - for (i = 0; i < IPS_MAX_ADAPTERS; i++) - dev[i] = tempdev[i]; + /* If Booting from the Manager CD, Allocate a large Flash */ + /* Buffer ( so we won't need to allocate one for each adapter ). */ + if (ips_cd_boot) { + ips_FlashData = (char *) __get_free_pages(IPS_INIT_GFP, 7); + if (ips_FlashData == NULL) { + /* The validity of this pointer is checked in ips_make_passthru() before it is used */ + printk(KERN_WARNING + "ERROR: Can't Allocate Large Buffer for Flashing\n"); + } + } + + SHT->proc_info = ips_proc_info; + SHT->proc_name = "ips"; + + for (i = 0; i < ips_num_controllers; i++) { + if (ips_register_scsi(i)) + ips_free(ips_ha[i]); + ips_released_controllers++; + } + return (ips_num_controllers); } /****************************************************************************/ -/* Detect and initialize the driver for 2.2 kernels */ -/* */ -/* NOTE: this routine is called under the io_request_lock spinlock */ -/****************************************************************************/ -static int ips_init_oldphase1(Scsi_Host_Template *SHT){ - struct Scsi_Host *sh; - ips_ha_t *ha; - uint32_t io_addr; - uint32_t mem_addr; - uint32_t io_len; - uint32_t mem_len; - uint16_t planer; - uint8_t revision_id; - uint8_t bus; - uint8_t func; - uint8_t irq; - uint16_t subdevice_id; - int i; - int j; - uint32_t count; - char *ioremap_ptr; - char *mem_ptr; - struct pci_dev *dev[IPS_MAX_ADAPTERS]; - dma_addr_t dma_address; - uint32_t currbar; - uint32_t maskbar; - uint8_t barnum; - uint32_t IsDead; - - METHOD_TRACE("ips_init_oldphase1", 1); - - for ( i = 0; i < IPS_MAX_ADAPTERS; i++ ) - dev[i] = NULL; - - /* Find all the adapters that we support and save them in the dev[] structure */ - i = 0; - dev[i] = pci_find_device(IPS_VENDORID_IBM, IPS_DEVICEID_MORPHEUS, NULL); - while ( dev[i] ) { - i++; - dev[i] = pci_find_device(IPS_VENDORID_IBM, IPS_DEVICEID_MORPHEUS, dev[i-1]); - } - - dev[i] = pci_find_device(IPS_VENDORID_IBM, IPS_DEVICEID_COPPERHEAD, NULL); - while ( dev[i] ) { - i++; - dev[i] = pci_find_device(IPS_VENDORID_IBM, IPS_DEVICEID_COPPERHEAD, dev[i-1]); - } - - dev[i] = pci_find_device(IPS_VENDORID_ADAPTEC, IPS_DEVICEID_MARCO, NULL); - while ( dev[i] ) { - i++; - dev[i] = pci_find_device(IPS_VENDORID_IBM, IPS_DEVICEID_MARCO, dev[i-1]); - } - - /* Sort the Adapters */ - if ( dev[0] ) - ips_sort_controllers( dev ); - else - return (0); - - /* Now scan and Initialize the controllers */ - for ( i = 0; i < IPS_MAX_ADAPTERS; i++ ) { - if (!dev[i]) - break; - - if (ips_next_controller >= IPS_MAX_ADAPTERS) - break; - - /* stuff that we get in dev */ - irq = dev[i]->irq; - bus = dev[i]->bus->number; - func = dev[i]->devfn; - - /* Init MEM/IO addresses to 0 */ - mem_addr = 0; - io_addr = 0; - mem_len = 0; - io_len = 0; - - for (j = 0; j < 2; j++) { - if (!dev[i]->base_address[j]) - break; - - if ((dev[i]->base_address[j] & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) { - barnum = PCI_BASE_ADDRESS_0 + (j * 4); - io_addr = dev[i]->base_address[j] & PCI_BASE_ADDRESS_IO_MASK; - - /* Get Size */ - pci_read_config_dword(dev[i], barnum, &currbar); - pci_write_config_dword(dev[i], barnum, ~0); - pci_read_config_dword(dev[i], barnum, &maskbar); - pci_write_config_dword(dev[i], barnum, currbar); - - io_len = ~(maskbar & PCI_BASE_ADDRESS_IO_MASK) + 1; - } else { - barnum = PCI_BASE_ADDRESS_0 + (j * 4); - mem_addr = dev[i]->base_address[j] & PCI_BASE_ADDRESS_MEM_MASK; - - /* Get Size */ - pci_read_config_dword(dev[i], barnum, &currbar); - pci_write_config_dword(dev[i], barnum, ~0); - pci_read_config_dword(dev[i], barnum, &maskbar); - pci_write_config_dword(dev[i], barnum, currbar); - - mem_len = ~(maskbar & PCI_BASE_ADDRESS_MEM_MASK) + 1; - } - } - - /* setup memory mapped area (if applicable) */ - if (mem_addr) { - uint32_t base; - uint32_t offs; - - DEBUG_VAR(1, "(%s%d) detect, Memory region %x, size: %d", - ips_name, ips_next_controller, mem_addr, mem_len); - - base = mem_addr & PAGE_MASK; - offs = mem_addr - base; - - ioremap_ptr = ioremap(base, PAGE_SIZE); - mem_ptr = ioremap_ptr + offs; - } else { - ioremap_ptr = NULL; - mem_ptr = NULL; - } - - /* setup I/O mapped area (if applicable) */ - if (io_addr) { - DEBUG_VAR(1, "(%s%d) detect, IO region %x, size: %d", - ips_name, ips_next_controller, io_addr, io_len); - - if (check_region(io_addr, io_len)) { - /* Couldn't allocate io space */ - printk(KERN_WARNING "(%s%d) couldn't allocate IO space %x len %d.\n", - ips_name, ips_next_controller, io_addr, io_len); - - ips_next_controller++; - - continue; - } - - request_region(io_addr, io_len, "ips"); - } - - /* get planer status */ - if (pci_read_config_word(dev[i], 0x04, &planer)) { - printk(KERN_WARNING "(%s%d) can't get planer status.\n", - ips_name, ips_next_controller); - - ips_next_controller++; - - continue; - } - - /* check to see if an onboard planer controller is disabled */ - if (!(planer & 0x000C)) { - - DEBUG_VAR(1, "(%s%d) detect, Onboard controller disabled by BIOS", - ips_name, ips_next_controller); - - ips_next_controller++; - - continue; - } - - DEBUG_VAR(1, "(%s%d) detect bus %d, func %x, irq %d, io %x, mem: %x, ptr: %p", - ips_name, ips_next_controller, bus, func, irq, io_addr, mem_addr, mem_ptr); - - /* get the revision ID */ - if (pci_read_config_byte(dev[i], PCI_REVISION_ID, &revision_id)) { - printk(KERN_WARNING "(%s%d) can't get revision id.\n", - ips_name, ips_next_controller); - - ips_next_controller++; - continue; - } - - /* get the subdevice id */ - if (pci_read_config_word(dev[i], PCI_SUBSYSTEM_ID, &subdevice_id)) { - printk(KERN_WARNING "(%s%d) can't get subdevice id.\n", - ips_name, ips_next_controller); - - ips_next_controller++; - - continue; - } - - /* found a controller */ - sh = scsi_register(SHT, sizeof(ips_ha_t)); - - if (sh == NULL) { - printk(KERN_WARNING "(%s%d) Unable to register controller with SCSI subsystem - skipping controller\n", - ips_name, ips_next_controller); - - ips_next_controller++; - - continue; - } - - ha = IPS_HA(sh); - memset(ha, 0, sizeof(ips_ha_t)); - - ips_sh[ips_next_controller] = sh; - ips_ha[ips_next_controller] = ha; - ips_num_controllers++; - ha->active = 1; - - ha->enq = kmalloc(sizeof(IPS_ENQ), GFP_KERNEL); - - if (!ha->enq) { - printk(KERN_WARNING "(%s%d) Unable to allocate host inquiry structure - skipping contoller\n", - ips_name, ips_next_controller); - ips_abort_init(ha, sh, ips_next_controller); - ips_next_controller++; - ips_num_controllers--; - - continue; - } - - ha->adapt = pci_alloc_consistent(dev[i], sizeof(IPS_ADAPTER) + sizeof(IPS_IO_CMD), &dma_address); - - if (!ha->adapt) { - printk(KERN_WARNING "(%s%d) Unable to allocate host adapt and dummy structure - skipping controller\n", - ips_name, ips_next_controller); - ips_abort_init(ha, sh, ips_next_controller); - ips_next_controller++; - ips_num_controllers--; - - continue; - } - ha->adapt->hw_status_start = dma_address; - ha->dummy = (void *)ha->adapt + 1; - - ha->conf = kmalloc(sizeof(IPS_CONF), GFP_KERNEL); - - if (!ha->conf) { - printk(KERN_WARNING "(%s%d) Unable to allocate host conf structure - skipping controller\n", - ips_name, ips_next_controller); - ips_abort_init(ha, sh, ips_next_controller); - ips_next_controller++; - ips_num_controllers--; - - continue; - } - - ha->nvram = kmalloc(sizeof(IPS_NVRAM_P5), GFP_KERNEL); - - if (!ha->nvram) { - printk(KERN_WARNING "(%s%d) Unable to allocate host nvram structure - skipping controller\n", - ips_name, ips_next_controller); - ips_abort_init(ha, sh, ips_next_controller); - ips_next_controller++; - ips_num_controllers--; - - continue; - } - - ha->subsys = kmalloc(sizeof(IPS_SUBSYS), GFP_KERNEL); - - if (!ha->subsys) { - printk(KERN_WARNING "(%s%d) Unable to allocate host subsystem structure - skipping controller\n", - ips_name, ips_next_controller); - ips_abort_init(ha, sh, ips_next_controller); - ips_next_controller++; - ips_num_controllers--; - - continue; - } - - for (count = PAGE_SIZE, ha->ioctl_order = 0; - count < ips_ioctlsize; - ha->ioctl_order++, count <<= 1); - - ha->ioctl_data = (char *) __get_free_pages(GFP_KERNEL, ha->ioctl_order); - ha->ioctl_datasize = count; - - if (!ha->ioctl_data) { - printk(KERN_WARNING "(%s%d) Unable to allocate ioctl data\n", - ips_name, ips_next_controller); - - ha->ioctl_data = NULL; - ha->ioctl_order = 0; - ha->ioctl_datasize = 0; - } - - /* Store away needed values for later use */ - sh->io_port = io_addr; - sh->n_io_port = io_addr ? 255 : 0; - sh->unique_id = (io_addr) ? io_addr : mem_addr; - sh->irq = irq; - sh->select_queue_depths = ips_select_queue_depth; - sh->sg_tablesize = sh->hostt->sg_tablesize; - sh->can_queue = sh->hostt->can_queue; - sh->cmd_per_lun = sh->hostt->cmd_per_lun; - sh->unchecked_isa_dma = sh->hostt->unchecked_isa_dma; - sh->use_clustering = sh->hostt->use_clustering; - - sh->wish_block = FALSE; - - /* Store info in HA structure */ - ha->irq = irq; - ha->io_addr = io_addr; - ha->io_len = io_len; - ha->mem_addr = mem_addr; - ha->mem_len = mem_len; - ha->mem_ptr = mem_ptr; - ha->ioremap_ptr = ioremap_ptr; - ha->host_num = ips_next_controller; - ha->revision_id = revision_id; - ha->slot_num = PCI_SLOT(dev[i]->devfn); - ha->device_id = dev[i]->device; - ha->subdevice_id = subdevice_id; - ha->pcidev = dev[i]; - - /* - * Setup Functions - */ - ips_setup_funclist(ha); - - /* If Morpheus appears dead, reset it */ - if ( ( IPS_IS_MORPHEUS( ha ) ) || ( IPS_IS_MARCO( ha ) ) ) { - IsDead = readl( ha->mem_ptr + IPS_REG_I960_MSG1 ); - if ( IsDead == 0xDEADBEEF ) { - ips_reset_morpheus( ha ); - } - } - - /* - * Initialize the card if it isn't already - */ - - if (!(*ha->func.isinit)(ha)) { - if (!(*ha->func.init)(ha)) { - /* - * Initialization failed - */ - printk(KERN_WARNING "(%s%d) unable to initialize controller - skipping controller\n", - ips_name, ips_next_controller); - ips_abort_init(ha, sh, ips_next_controller); - ips_next_controller++; - ips_num_controllers--; - - continue; - } - } - - /* install the interrupt handler */ - if (request_irq(irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) { - printk(KERN_WARNING "(%s%d) unable to install interrupt handler - skipping controller\n", - ips_name, ips_next_controller); - ips_abort_init(ha, sh, ips_next_controller); - ips_next_controller++; - ips_num_controllers--; - - continue; - } - - /* - * Allocate a temporary SCB for initialization - */ - ha->max_cmds = 1; - if (!ips_allocatescbs(ha)) { - /* couldn't allocate a temp SCB */ - printk(KERN_WARNING "(%s%d) unable to allocate CCBs - skipping contoller\n", - ips_name, ips_next_controller); - free_irq(ha->irq, ha); - ips_abort_init(ha, sh, ips_next_controller); - ips_next_controller++; - ips_num_controllers--; - - continue; - } - - ips_next_controller++; - } - - /* - * Do Phase 2 Initialization - * Controller init - */ - for (i = 0; i < ips_next_controller; i++) { - - if (ips_ha[i] == 0) { - printk(KERN_WARNING "(%s%d) ignoring bad controller\n", ips_name, i); - continue; - } - - if (ips_init_phase2(i) != SUCCESS) - ips_num_controllers--; - - } - - if (ips_num_controllers > 0) - register_reboot_notifier(&ips_notifier); - - return (ips_num_controllers); -} -#endif - -/****************************************************************************/ /* configure the function pointers to use the functions that will work */ /* with the found version of the adapter */ /****************************************************************************/ -static void ips_setup_funclist(ips_ha_t *ha){ +static void +ips_setup_funclist(ips_ha_t * ha) +{ - /* - * Setup Functions - */ - if (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) { - /* morpheus / marco / sebring */ - ha->func.isintr = ips_isintr_morpheus; - ha->func.isinit = ips_isinit_morpheus; - ha->func.issue = ips_issue_i2o_memio; - ha->func.init = ips_init_morpheus; - ha->func.statupd = ips_statupd_morpheus; - ha->func.reset = ips_reset_morpheus; - ha->func.intr = ips_intr_morpheus; - ha->func.enableint = ips_enable_int_morpheus; - } else if (IPS_USE_MEMIO(ha)) { - /* copperhead w/MEMIO */ - ha->func.isintr = ips_isintr_copperhead_memio; - ha->func.isinit = ips_isinit_copperhead_memio; - ha->func.init = ips_init_copperhead_memio; - ha->func.statupd = ips_statupd_copperhead_memio; - ha->func.statinit = ips_statinit_memio; - ha->func.reset = ips_reset_copperhead_memio; - ha->func.intr = ips_intr_copperhead; - ha->func.erasebios = ips_erase_bios_memio; - ha->func.programbios = ips_program_bios_memio; - ha->func.verifybios = ips_verify_bios_memio; - ha->func.enableint = ips_enable_int_copperhead_memio; - if (IPS_USE_I2O_DELIVER(ha)) - ha->func.issue = ips_issue_i2o_memio; - else - ha->func.issue = ips_issue_copperhead_memio; - } else { - /* copperhead */ - ha->func.isintr = ips_isintr_copperhead; - ha->func.isinit = ips_isinit_copperhead; - ha->func.init = ips_init_copperhead; - ha->func.statupd = ips_statupd_copperhead; - ha->func.statinit = ips_statinit; - ha->func.reset = ips_reset_copperhead; - ha->func.intr = ips_intr_copperhead; - ha->func.erasebios = ips_erase_bios; - ha->func.programbios = ips_program_bios; - ha->func.verifybios = ips_verify_bios; - ha->func.enableint = ips_enable_int_copperhead; - - if (IPS_USE_I2O_DELIVER(ha)) - ha->func.issue = ips_issue_i2o; - else - ha->func.issue = ips_issue_copperhead; - } + /* + * Setup Functions + */ + if (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) { + /* morpheus / marco / sebring */ + ha->func.isintr = ips_isintr_morpheus; + ha->func.isinit = ips_isinit_morpheus; + ha->func.issue = ips_issue_i2o_memio; + ha->func.init = ips_init_morpheus; + ha->func.statupd = ips_statupd_morpheus; + ha->func.reset = ips_reset_morpheus; + ha->func.intr = ips_intr_morpheus; + ha->func.enableint = ips_enable_int_morpheus; + } else if (IPS_USE_MEMIO(ha)) { + /* copperhead w/MEMIO */ + ha->func.isintr = ips_isintr_copperhead_memio; + ha->func.isinit = ips_isinit_copperhead_memio; + ha->func.init = ips_init_copperhead_memio; + ha->func.statupd = ips_statupd_copperhead_memio; + ha->func.statinit = ips_statinit_memio; + ha->func.reset = ips_reset_copperhead_memio; + ha->func.intr = ips_intr_copperhead; + ha->func.erasebios = ips_erase_bios_memio; + ha->func.programbios = ips_program_bios_memio; + ha->func.verifybios = ips_verify_bios_memio; + ha->func.enableint = ips_enable_int_copperhead_memio; + if (IPS_USE_I2O_DELIVER(ha)) + ha->func.issue = ips_issue_i2o_memio; + else + ha->func.issue = ips_issue_copperhead_memio; + } else { + /* copperhead */ + ha->func.isintr = ips_isintr_copperhead; + ha->func.isinit = ips_isinit_copperhead; + ha->func.init = ips_init_copperhead; + ha->func.statupd = ips_statupd_copperhead; + ha->func.statinit = ips_statinit; + ha->func.reset = ips_reset_copperhead; + ha->func.intr = ips_intr_copperhead; + ha->func.erasebios = ips_erase_bios; + ha->func.programbios = ips_program_bios; + ha->func.verifybios = ips_verify_bios; + ha->func.enableint = ips_enable_int_copperhead; + + if (IPS_USE_I2O_DELIVER(ha)) + ha->func.issue = ips_issue_i2o; + else + ha->func.issue = ips_issue_copperhead; + } } /****************************************************************************/ @@ -1387,79 +651,72 @@ /* */ /****************************************************************************/ int -ips_release(struct Scsi_Host *sh) { - ips_scb_t *scb; - ips_ha_t *ha; - int i; - - METHOD_TRACE("ips_release", 1); - - for (i = 0; i < IPS_MAX_ADAPTERS && ips_sh[i] != sh; i++); - - if (i == IPS_MAX_ADAPTERS) { - printk(KERN_WARNING "(%s) release, invalid Scsi_Host pointer.\n", - ips_name); -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) - BUG(); -#endif - return (FALSE); - } +ips_release(struct Scsi_Host *sh) +{ + ips_scb_t *scb; + ips_ha_t *ha; + int i; - ha = IPS_HA(sh); + METHOD_TRACE("ips_release", 1); - if (!ha) - return (FALSE); + for (i = 0; i < IPS_MAX_ADAPTERS && ips_sh[i] != sh; i++) ; - /* flush the cache on the controller */ - scb = &ha->scbs[ha->max_cmds-1]; + if (i == IPS_MAX_ADAPTERS) { + printk(KERN_WARNING + "(%s) release, invalid Scsi_Host pointer.\n", ips_name); + BUG(); + return (FALSE); + } - ips_init_scb(ha, scb); + ha = IPS_HA(sh); - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_FLUSH; + if (!ha) + return (FALSE); - scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH; - scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.flush_cache.state = IPS_NORM_STATE; - scb->cmd.flush_cache.reserved = 0; - scb->cmd.flush_cache.reserved2 = 0; - scb->cmd.flush_cache.reserved3 = 0; - scb->cmd.flush_cache.reserved4 = 0; + /* flush the cache on the controller */ + scb = &ha->scbs[ha->max_cmds - 1]; - if (InitState != 0) /* If Not just Searching for the Adapter Order Table */ - printk(KERN_NOTICE "(%s%d) Flushing Cache.\n", ips_name, ha->host_num); + ips_init_scb(ha, scb); - /* send command */ - if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == IPS_FAILURE) - printk(KERN_NOTICE "(%s%d) Incomplete Flush.\n", ips_name, ha->host_num); + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_FLUSH; - if (InitState != 0) /* If Not just Searching for the Adapter Order Table */ - printk(KERN_NOTICE "(%s%d) Flushing Complete.\n", ips_name, ha->host_num); + scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH; + scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.flush_cache.state = IPS_NORM_STATE; + scb->cmd.flush_cache.reserved = 0; + scb->cmd.flush_cache.reserved2 = 0; + scb->cmd.flush_cache.reserved3 = 0; + scb->cmd.flush_cache.reserved4 = 0; - ips_sh[i] = NULL; - ips_ha[i] = NULL; + printk(KERN_NOTICE "(%s%d) Flushing Cache.\n", ips_name, ha->host_num); - /* free extra memory */ - ips_free(ha); + /* send command */ + if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == IPS_FAILURE) + printk(KERN_NOTICE "(%s%d) Incomplete Flush.\n", ips_name, + ha->host_num); - /* Free I/O Region */ - if (ha->io_addr) - release_region(ha->io_addr, ha->io_len); + printk(KERN_NOTICE "(%s%d) Flushing Complete.\n", ips_name, + ha->host_num); - /* free IRQ */ - free_irq(ha->irq, ha); + ips_sh[i] = NULL; + ips_ha[i] = NULL; - scsi_unregister(sh); + /* free extra memory */ + ips_free(ha); - if (InitState != 0) { - ips_released_controllers++; - if (ips_num_controllers == ips_released_controllers){ - unregister_reboot_notifier(&ips_notifier); - pci_unregister_driver(ha->pcidev->driver); - } - } + /* Free I/O Region */ + if (ha->io_addr) + release_region(ha->io_addr, ha->io_len); - return (FALSE); + /* free IRQ */ + free_irq(ha->irq, ha); + + scsi_unregister(sh); + + ips_released_controllers++; + + return (FALSE); } /****************************************************************************/ @@ -1472,50 +729,54 @@ /* */ /****************************************************************************/ static int -ips_halt(struct notifier_block *nb, ulong event, void *buf) { - ips_scb_t *scb; - ips_ha_t *ha; - int i; - - if ((event != SYS_RESTART) && (event != SYS_HALT) && - (event != SYS_POWER_OFF)) - return (NOTIFY_DONE); - - for (i = 0; i < ips_next_controller; i++) { - ha = (ips_ha_t *) ips_ha[i]; - - if (!ha) - continue; - - if (!ha->active) - continue; - - /* flush the cache on the controller */ - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_FLUSH; - - scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH; - scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.flush_cache.state = IPS_NORM_STATE; - scb->cmd.flush_cache.reserved = 0; - scb->cmd.flush_cache.reserved2 = 0; - scb->cmd.flush_cache.reserved3 = 0; - scb->cmd.flush_cache.reserved4 = 0; - - printk(KERN_NOTICE "(%s%d) Flushing Cache.\n", ips_name, ha->host_num); - - /* send command */ - if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == IPS_FAILURE) - printk(KERN_NOTICE "(%s%d) Incomplete Flush.\n", ips_name, ha->host_num); - else - printk(KERN_NOTICE "(%s%d) Flushing Complete.\n", ips_name, ha->host_num); - } +ips_halt(struct notifier_block *nb, ulong event, void *buf) +{ + ips_scb_t *scb; + ips_ha_t *ha; + int i; + + if ((event != SYS_RESTART) && (event != SYS_HALT) && + (event != SYS_POWER_OFF)) return (NOTIFY_DONE); + + for (i = 0; i < ips_next_controller; i++) { + ha = (ips_ha_t *) ips_ha[i]; + + if (!ha) + continue; + + if (!ha->active) + continue; + + /* flush the cache on the controller */ + scb = &ha->scbs[ha->max_cmds - 1]; + + ips_init_scb(ha, scb); + + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_FLUSH; + + scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH; + scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.flush_cache.state = IPS_NORM_STATE; + scb->cmd.flush_cache.reserved = 0; + scb->cmd.flush_cache.reserved2 = 0; + scb->cmd.flush_cache.reserved3 = 0; + scb->cmd.flush_cache.reserved4 = 0; + + printk(KERN_NOTICE "(%s%d) Flushing Cache.\n", ips_name, + ha->host_num); + + /* send command */ + if (ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_ON) == + IPS_FAILURE) printk(KERN_NOTICE + "(%s%d) Incomplete Flush.\n", ips_name, + ha->host_num); + else + printk(KERN_NOTICE "(%s%d) Flushing Complete.\n", + ips_name, ha->host_num); + } - return (NOTIFY_OK); + return (NOTIFY_OK); } /****************************************************************************/ @@ -1528,50 +789,51 @@ /* Note: this routine is called under the io_request_lock */ /****************************************************************************/ int -ips_eh_abort(Scsi_Cmnd *SC) { - ips_ha_t *ha; - ips_copp_wait_item_t *item; - int ret; - - METHOD_TRACE("ips_eh_abort", 1); - - if (!SC) - return (FAILED); - - ha = (ips_ha_t *) SC->host->hostdata; - - if (!ha) - return (FAILED); - - if (!ha->active) - return (FAILED); - - if (SC->serial_number != SC->serial_number_at_timeout) { - /* HMM, looks like a bogus command */ - DEBUG(1, "Abort called with bogus scsi command"); - - return (FAILED); - } - - /* See if the command is on the copp queue */ - item = ha->copp_waitlist.head; - while ((item) && (item->scsi_cmd != SC)) - item = item->next; - - if (item) { - /* Found it */ - ips_removeq_copp(&ha->copp_waitlist, item); - ret = (SUCCESS); - - /* See if the command is on the wait queue */ - } else if (ips_removeq_wait(&ha->scb_waitlist, SC)) { - /* command not sent yet */ - ret = (SUCCESS); - } else { - /* command must have already been sent */ - ret = (FAILED); - } - return ret; +ips_eh_abort(Scsi_Cmnd * SC) +{ + ips_ha_t *ha; + ips_copp_wait_item_t *item; + int ret; + + METHOD_TRACE("ips_eh_abort", 1); + + if (!SC) + return (FAILED); + + ha = (ips_ha_t *) SC->host->hostdata; + + if (!ha) + return (FAILED); + + if (!ha->active) + return (FAILED); + + if (SC->serial_number != SC->serial_number_at_timeout) { + /* HMM, looks like a bogus command */ + DEBUG(1, "Abort called with bogus scsi command"); + + return (FAILED); + } + + /* See if the command is on the copp queue */ + item = ha->copp_waitlist.head; + while ((item) && (item->scsi_cmd != SC)) + item = item->next; + + if (item) { + /* Found it */ + ips_removeq_copp(&ha->copp_waitlist, item); + ret = (SUCCESS); + + /* See if the command is on the wait queue */ + } else if (ips_removeq_wait(&ha->scb_waitlist, SC)) { + /* command not sent yet */ + ret = (SUCCESS); + } else { + /* command must have already been sent */ + ret = (FAILED); + } + return ret; } /****************************************************************************/ @@ -1586,191 +848,194 @@ /* */ /****************************************************************************/ int -ips_eh_reset(Scsi_Cmnd *SC) { - int ret; - int i; - ips_ha_t *ha; - ips_scb_t *scb; - ips_copp_wait_item_t *item; +ips_eh_reset(Scsi_Cmnd * SC) +{ + int ret; + int i; + ips_ha_t *ha; + ips_scb_t *scb; + ips_copp_wait_item_t *item; - METHOD_TRACE("ips_eh_reset", 1); + METHOD_TRACE("ips_eh_reset", 1); #ifdef NO_IPS_RESET - return (FAILED); + return (FAILED); #else - if (!SC) { - DEBUG(1, "Reset called with NULL scsi command"); + if (!SC) { + DEBUG(1, "Reset called with NULL scsi command"); - return (FAILED); - } + return (FAILED); + } - ha = (ips_ha_t *) SC->host->hostdata; + ha = (ips_ha_t *) SC->host->hostdata; - if (!ha) { - DEBUG(1, "Reset called with NULL ha struct"); - - return (FAILED); - } - - if (!ha->active) - return (FAILED); - - /* See if the command is on the copp queue */ - item = ha->copp_waitlist.head; - while ((item) && (item->scsi_cmd != SC)) - item = item->next; - - if (item) { - /* Found it */ - ips_removeq_copp(&ha->copp_waitlist, item); - return (SUCCESS); - } - - /* See if the command is on the wait queue */ - if (ips_removeq_wait(&ha->scb_waitlist, SC)) { - /* command not sent yet */ - return (SUCCESS); - } - - /* An explanation for the casual observer: */ - /* Part of the function of a RAID controller is automatic error */ - /* detection and recovery. As such, the only problem that physically */ - /* resetting an adapter will ever fix is when, for some reason, */ - /* the driver is not successfully communicating with the adapter. */ - /* Therefore, we will attempt to flush this adapter. If that succeeds, */ - /* then there's no real purpose in a physical reset. This will complete */ - /* much faster and avoids any problems that might be caused by a */ - /* physical reset ( such as having to fail all the outstanding I/O's ). */ - - if (ha->ioctl_reset == 0) { /* IF Not an IOCTL Requested Reset */ - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_FLUSH; - - scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH; - scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.flush_cache.state = IPS_NORM_STATE; - scb->cmd.flush_cache.reserved = 0; - scb->cmd.flush_cache.reserved2 = 0; - scb->cmd.flush_cache.reserved3 = 0; - scb->cmd.flush_cache.reserved4 = 0; - - /* Attempt the flush command */ - ret = ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_IORL); - if (ret == IPS_SUCCESS) { - printk(KERN_NOTICE "(%s%d) Reset Request - Flushed Cache\n", ips_name, ha->host_num); - return (SUCCESS); - } - } - - /* Either we can't communicate with the adapter or it's an IOCTL request */ - /* from a utility. A physical reset is needed at this point. */ - - ha->ioctl_reset = 0; /* Reset the IOCTL Requested Reset Flag */ - - /* - * command must have already been sent - * reset the controller - */ - printk(KERN_NOTICE "(%s%d) Resetting controller.\n", - ips_name, ha->host_num); - ret = (*ha->func.reset)(ha); - - if (!ret) { - Scsi_Cmnd *scsi_cmd; - - printk(KERN_NOTICE - "(%s%d) Controller reset failed - controller now offline.\n", - ips_name, ha->host_num); - - /* Now fail all of the active commands */ - DEBUG_VAR(1, "(%s%d) Failing active commands", - ips_name, ha->host_num); - - while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) { - scb->scsi_cmd->result = DID_ERROR << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - ips_freescb(ha, scb); - } - - /* Now fail all of the pending commands */ - DEBUG_VAR(1, "(%s%d) Failing pending commands", - ips_name, ha->host_num); - - while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) { - scsi_cmd->result = DID_ERROR; - scsi_cmd->scsi_done(scsi_cmd); - } - - ha->active = FALSE; - return (FAILED); - } - - if (!ips_clear_adapter(ha, IPS_INTR_IORL)) { - Scsi_Cmnd *scsi_cmd; - - printk(KERN_NOTICE - "(%s%d) Controller reset failed - controller now offline.\n", - ips_name, ha->host_num); - - /* Now fail all of the active commands */ - DEBUG_VAR(1, "(%s%d) Failing active commands", - ips_name, ha->host_num); - - while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) { - scb->scsi_cmd->result = DID_ERROR << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - ips_freescb(ha, scb); - } - - /* Now fail all of the pending commands */ - DEBUG_VAR(1, "(%s%d) Failing pending commands", - ips_name, ha->host_num); - - while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) { - scsi_cmd->result = DID_ERROR << 16; - scsi_cmd->scsi_done(scsi_cmd); - } - - ha->active = FALSE; - return (FAILED); - } - - /* FFDC */ - if (le32_to_cpu(ha->subsys->param[3]) & 0x300000) { - struct timeval tv; - - do_gettimeofday(&tv); - ha->last_ffdc = tv.tv_sec; - ha->reset_count++; - ips_ffdc_reset(ha, IPS_INTR_IORL); - } - - /* Now fail all of the active commands */ - DEBUG_VAR(1, "(%s%d) Failing active commands", - ips_name, ha->host_num); - - while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) { - scb->scsi_cmd->result = (DID_RESET << 16) | (SUGGEST_RETRY << 24); - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - ips_freescb(ha, scb); - } - - /* Reset DCDB active command bits */ - for (i = 1; i < ha->nbus; i++) - ha->dcdb_active[i-1] = 0; + if (!ha) { + DEBUG(1, "Reset called with NULL ha struct"); + + return (FAILED); + } + + if (!ha->active) + return (FAILED); + + /* See if the command is on the copp queue */ + item = ha->copp_waitlist.head; + while ((item) && (item->scsi_cmd != SC)) + item = item->next; + + if (item) { + /* Found it */ + ips_removeq_copp(&ha->copp_waitlist, item); + return (SUCCESS); + } + + /* See if the command is on the wait queue */ + if (ips_removeq_wait(&ha->scb_waitlist, SC)) { + /* command not sent yet */ + return (SUCCESS); + } + + /* An explanation for the casual observer: */ + /* Part of the function of a RAID controller is automatic error */ + /* detection and recovery. As such, the only problem that physically */ + /* resetting an adapter will ever fix is when, for some reason, */ + /* the driver is not successfully communicating with the adapter. */ + /* Therefore, we will attempt to flush this adapter. If that succeeds, */ + /* then there's no real purpose in a physical reset. This will complete */ + /* much faster and avoids any problems that might be caused by a */ + /* physical reset ( such as having to fail all the outstanding I/O's ). */ + + if (ha->ioctl_reset == 0) { /* IF Not an IOCTL Requested Reset */ + scb = &ha->scbs[ha->max_cmds - 1]; + + ips_init_scb(ha, scb); + + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_FLUSH; + + scb->cmd.flush_cache.op_code = IPS_CMD_FLUSH; + scb->cmd.flush_cache.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.flush_cache.state = IPS_NORM_STATE; + scb->cmd.flush_cache.reserved = 0; + scb->cmd.flush_cache.reserved2 = 0; + scb->cmd.flush_cache.reserved3 = 0; + scb->cmd.flush_cache.reserved4 = 0; + + /* Attempt the flush command */ + ret = ips_send_wait(ha, scb, ips_cmd_timeout, IPS_INTR_IORL); + if (ret == IPS_SUCCESS) { + printk(KERN_NOTICE + "(%s%d) Reset Request - Flushed Cache\n", + ips_name, ha->host_num); + return (SUCCESS); + } + } + + /* Either we can't communicate with the adapter or it's an IOCTL request */ + /* from a utility. A physical reset is needed at this point. */ + + ha->ioctl_reset = 0; /* Reset the IOCTL Requested Reset Flag */ + + /* + * command must have already been sent + * reset the controller + */ + printk(KERN_NOTICE "(%s%d) Resetting controller.\n", + ips_name, ha->host_num); + ret = (*ha->func.reset) (ha); + + if (!ret) { + Scsi_Cmnd *scsi_cmd; + + printk(KERN_NOTICE + "(%s%d) Controller reset failed - controller now offline.\n", + ips_name, ha->host_num); + + /* Now fail all of the active commands */ + DEBUG_VAR(1, "(%s%d) Failing active commands", + ips_name, ha->host_num); + + while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) { + scb->scsi_cmd->result = DID_ERROR << 16; + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + ips_freescb(ha, scb); + } + + /* Now fail all of the pending commands */ + DEBUG_VAR(1, "(%s%d) Failing pending commands", + ips_name, ha->host_num); + + while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) { + scsi_cmd->result = DID_ERROR; + scsi_cmd->scsi_done(scsi_cmd); + } + + ha->active = FALSE; + return (FAILED); + } + + if (!ips_clear_adapter(ha, IPS_INTR_IORL)) { + Scsi_Cmnd *scsi_cmd; + + printk(KERN_NOTICE + "(%s%d) Controller reset failed - controller now offline.\n", + ips_name, ha->host_num); + + /* Now fail all of the active commands */ + DEBUG_VAR(1, "(%s%d) Failing active commands", + ips_name, ha->host_num); + + while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) { + scb->scsi_cmd->result = DID_ERROR << 16; + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + ips_freescb(ha, scb); + } + + /* Now fail all of the pending commands */ + DEBUG_VAR(1, "(%s%d) Failing pending commands", + ips_name, ha->host_num); + + while ((scsi_cmd = ips_removeq_wait_head(&ha->scb_waitlist))) { + scsi_cmd->result = DID_ERROR << 16; + scsi_cmd->scsi_done(scsi_cmd); + } + + ha->active = FALSE; + return (FAILED); + } + + /* FFDC */ + if (le32_to_cpu(ha->subsys->param[3]) & 0x300000) { + struct timeval tv; + + do_gettimeofday(&tv); + ha->last_ffdc = tv.tv_sec; + ha->reset_count++; + ips_ffdc_reset(ha, IPS_INTR_IORL); + } + + /* Now fail all of the active commands */ + DEBUG_VAR(1, "(%s%d) Failing active commands", ips_name, ha->host_num); + + while ((scb = ips_removeq_scb_head(&ha->scb_activelist))) { + scb->scsi_cmd->result = + (DID_RESET << 16) | (SUGGEST_RETRY << 24); + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + ips_freescb(ha, scb); + } + + /* Reset DCDB active command bits */ + for (i = 1; i < ha->nbus; i++) + ha->dcdb_active[i - 1] = 0; - /* Reset the number of active IOCTLs */ - ha->num_ioctl = 0; + /* Reset the number of active IOCTLs */ + ha->num_ioctl = 0; - ips_next(ha, IPS_INTR_IORL); + ips_next(ha, IPS_INTR_IORL); - return (SUCCESS); -#endif /* NO_IPS_RESET */ + return (SUCCESS); +#endif /* NO_IPS_RESET */ } @@ -1787,103 +1052,92 @@ /* */ /****************************************************************************/ int -ips_queue(Scsi_Cmnd *SC, void (*done) (Scsi_Cmnd *)) { - ips_ha_t *ha; - ips_passthru_t *pt; - - METHOD_TRACE("ips_queue", 1); - - ha = (ips_ha_t *) SC->host->hostdata; - - if (!ha) - return (1); - - if (!ha->active) - return (DID_ERROR); - - if (ips_is_passthru(SC)) { - if (ha->copp_waitlist.count == IPS_MAX_IOCTL_QUEUE) { - SC->result = DID_BUS_BUSY << 16; - done(SC); - - return (0); - } - } else if (ha->scb_waitlist.count == IPS_MAX_QUEUE) { - SC->result = DID_BUS_BUSY << 16; - done(SC); - - return (0); - } - - SC->scsi_done = done; - - DEBUG_VAR(2, "(%s%d): ips_queue: cmd 0x%X (%d %d %d)", - ips_name, - ha->host_num, - SC->cmnd[0], - SC->channel, - SC->target, - SC->lun); - - /* Check for command to initiator IDs */ - if ((SC->channel > 0) && (SC->target == ha->ha_id[SC->channel])) { - SC->result = DID_NO_CONNECT << 16; - done(SC); - - return (0); - } - - if (ips_is_passthru(SC)) { - - ips_copp_wait_item_t *scratch; - - /* A Reset IOCTL is only sent by the boot CD in extreme cases. */ - /* There can never be any system activity ( network or disk ), but check */ - /* anyway just as a good practice. */ - pt = (ips_passthru_t *) SC->request_buffer; - if ((pt->CoppCP.cmd.reset.op_code == IPS_CMD_RESET_CHANNEL) && - (pt->CoppCP.cmd.reset.adapter_flag == 1)) { - if (ha->scb_activelist.count != 0) { - SC->result = DID_BUS_BUSY << 16; - done(SC); - return (0); - } - ha->ioctl_reset = 1; /* This reset request is from an IOCTL */ - ips_eh_reset(SC); - SC->result = DID_OK << 16; - SC->scsi_done(SC); - return (0); - } - - /* allocate space for the scribble */ - scratch = kmalloc(sizeof(ips_copp_wait_item_t), GFP_ATOMIC); - - if (!scratch) { - SC->result = DID_ERROR << 16; - done(SC); - - return (0); - } - - scratch->scsi_cmd = SC; - scratch->next = NULL; - - ips_putq_copp_tail(&ha->copp_waitlist, scratch); - } - else { - ips_putq_wait_tail(&ha->scb_waitlist, SC); - } - - ips_next(ha, IPS_INTR_IORL); - - /* If We were using the CD Boot Flash Buffer, Restore the Old Values */ - if ( ips_FlashData == ha->ioctl_data ) { - ha->ioctl_data = ha->flash_data; - ha->ioctl_order = ha->flash_order; - ha->ioctl_datasize = ha->flash_datasize; - ips_FlashDataInUse = 0; - } - return (0); +ips_queue(Scsi_Cmnd * SC, void (*done) (Scsi_Cmnd *)) +{ + ips_ha_t *ha; + ips_passthru_t *pt; + + METHOD_TRACE("ips_queue", 1); + + ha = (ips_ha_t *) SC->host->hostdata; + + if (!ha) + return (1); + + if (!ha->active) + return (DID_ERROR); + + if (ips_is_passthru(SC)) { + if (ha->copp_waitlist.count == IPS_MAX_IOCTL_QUEUE) { + SC->result = DID_BUS_BUSY << 16; + done(SC); + + return (0); + } + } else if (ha->scb_waitlist.count == IPS_MAX_QUEUE) { + SC->result = DID_BUS_BUSY << 16; + done(SC); + + return (0); + } + + SC->scsi_done = done; + + DEBUG_VAR(2, "(%s%d): ips_queue: cmd 0x%X (%d %d %d)", + ips_name, + ha->host_num, SC->cmnd[0], SC->channel, SC->target, SC->lun); + + /* Check for command to initiator IDs */ + if ((SC->channel > 0) && (SC->target == ha->ha_id[SC->channel])) { + SC->result = DID_NO_CONNECT << 16; + done(SC); + + return (0); + } + + if (ips_is_passthru(SC)) { + + ips_copp_wait_item_t *scratch; + + /* A Reset IOCTL is only sent by the boot CD in extreme cases. */ + /* There can never be any system activity ( network or disk ), but check */ + /* anyway just as a good practice. */ + pt = (ips_passthru_t *) SC->request_buffer; + if ((pt->CoppCP.cmd.reset.op_code == IPS_CMD_RESET_CHANNEL) && + (pt->CoppCP.cmd.reset.adapter_flag == 1)) { + if (ha->scb_activelist.count != 0) { + SC->result = DID_BUS_BUSY << 16; + done(SC); + return (0); + } + ha->ioctl_reset = 1; /* This reset request is from an IOCTL */ + ips_eh_reset(SC); + SC->result = DID_OK << 16; + SC->scsi_done(SC); + return (0); + } + + /* allocate space for the scribble */ + scratch = kmalloc(sizeof (ips_copp_wait_item_t), GFP_ATOMIC); + + if (!scratch) { + SC->result = DID_ERROR << 16; + done(SC); + + return (0); + } + + scratch->scsi_cmd = SC; + scratch->next = NULL; + + ips_putq_copp_tail(&ha->copp_waitlist, scratch); + } else { + ips_putq_wait_tail(&ha->scb_waitlist, SC); + } + + ips_next(ha, IPS_INTR_IORL); + + return (0); } /****************************************************************************/ @@ -1896,48 +1150,49 @@ /* */ /****************************************************************************/ int -ips_biosparam(Disk *disk, kdev_t dev, int geom[]) { - ips_ha_t *ha; - int heads; - int sectors; - int cylinders; - - METHOD_TRACE("ips_biosparam", 1); - - ha = (ips_ha_t *) disk->device->host->hostdata; - - if (!ha) - /* ?!?! host adater info invalid */ - return (0); - - if (!ha->active) - return (0); - - if (!ips_read_adapter_status(ha, IPS_INTR_ON)) - /* ?!?! Enquiry command failed */ - return (0); - - if ((disk->capacity > 0x400000) && - ((ha->enq->ucMiscFlag & 0x8) == 0)) { - heads = IPS_NORM_HEADS; - sectors = IPS_NORM_SECTORS; - } else { - heads = IPS_COMP_HEADS; - sectors = IPS_COMP_SECTORS; - } - - cylinders = disk->capacity / (heads * sectors); - - DEBUG_VAR(2, "Geometry: heads: %d, sectors: %d, cylinders: %d", - heads, sectors, cylinders); - - geom[0] = heads; - geom[1] = sectors; - geom[2] = cylinders; +ips_biosparam(Disk * disk, kdev_t dev, int geom[]) +{ + ips_ha_t *ha; + int heads; + int sectors; + int cylinders; + + METHOD_TRACE("ips_biosparam", 1); - return (0); + ha = (ips_ha_t *) disk->device->host->hostdata; + + if (!ha) + /* ?!?! host adater info invalid */ + return (0); + + if (!ha->active) + return (0); + + if (!ips_read_adapter_status(ha, IPS_INTR_ON)) + /* ?!?! Enquiry command failed */ + return (0); + + if ((disk->capacity > 0x400000) && ((ha->enq->ucMiscFlag & 0x8) == 0)) { + heads = IPS_NORM_HEADS; + sectors = IPS_NORM_SECTORS; + } else { + heads = IPS_COMP_HEADS; + sectors = IPS_COMP_SECTORS; + } + + cylinders = disk->capacity / (heads * sectors); + + DEBUG_VAR(2, "Geometry: heads: %d, sectors: %d, cylinders: %d", + heads, sectors, cylinders); + + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; + + return (0); } +#if LINUX_VERSION_CODE < LinuxVersionCode(2,5,0) /****************************************************************************/ /* */ /* Routine Name: ips_select_queue_depth */ @@ -1948,39 +1203,67 @@ /* */ /****************************************************************************/ static void -ips_select_queue_depth(struct Scsi_Host *host, Scsi_Device *scsi_devs) { - Scsi_Device *device; - ips_ha_t *ha; - int count = 0; - int min; - - ha = IPS_HA(host); - min = ha->max_cmds / 4; - - for (device = scsi_devs; device; device = device->next) { - if (device->host == host) { - if ((device->channel == 0) && (device->type == 0)) - count++; - } - } - - for (device = scsi_devs; device; device = device->next) { - if (device->host == host) { - if ((device->channel == 0) && (device->type == 0)) { - device->queue_depth = ( ha->max_cmds - 1 ) / count; - if (device->queue_depth < min) - device->queue_depth = min; - } - else { - device->queue_depth = 2; - } - - if (device->queue_depth < 2) - device->queue_depth = 2; - } - } +ips_select_queue_depth(struct Scsi_Host *host, Scsi_Device * scsi_devs) +{ + Scsi_Device *device; + ips_ha_t *ha; + int count = 0; + int min; + + ha = IPS_HA(host); + min = ha->max_cmds / 4; + + for (device = scsi_devs; device; device = device->next) { + if (device->host == host) { + if ((device->channel == 0) && (device->type == 0)) + count++; + } + } + + for (device = scsi_devs; device; device = device->next) { + if (device->host == host) { + if ((device->channel == 0) && (device->type == 0)) { + device->queue_depth = + (ha->max_cmds - 1) / count; + if (device->queue_depth < min) + device->queue_depth = min; + } else { + device->queue_depth = 2; + } + + if (device->queue_depth < 2) + device->queue_depth = 2; + } + } } +#else +/****************************************************************************/ +/* */ +/* Routine Name: ips_slave_configure */ +/* */ +/* Routine Description: */ +/* */ +/* Set queue depths on devices once scan is complete */ +/* */ +/****************************************************************************/ +int +ips_slave_configure(Scsi_Device * SDptr) +{ + ips_ha_t *ha; + int min; + + ha = IPS_HA(SDptr->host); + if (SDptr->tagged_supported && SDptr->type == TYPE_DISK) { + min = ha->max_cmds / 2; + if (ha->enq->ucLogDriveCount <= 2) + min = ha->max_cmds - 1; + scsi_adjust_queue_depth(SDptr, MSG_ORDERED_TAG, min); + } + return 0; +} +#endif + /****************************************************************************/ /* */ /* Routine Name: do_ipsintr */ @@ -1991,30 +1274,37 @@ /* */ /****************************************************************************/ void -do_ipsintr(int irq, void *dev_id, struct pt_regs *regs) { - ips_ha_t *ha; - unsigned long cpu_flags; - struct Scsi_Host *host; - - METHOD_TRACE("do_ipsintr", 2); - - ha = (ips_ha_t *) dev_id; - if (!ha) - return; - host = ips_sh[ha->host_num]; - IPS_LOCK_SAVE(host->host_lock, cpu_flags); - - if (!ha->active) { - IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); - return; - } +do_ipsintr(int irq, void *dev_id, struct pt_regs *regs) +{ + ips_ha_t *ha; + unsigned long cpu_flags; + struct Scsi_Host *host; + + METHOD_TRACE("do_ipsintr", 2); + + ha = (ips_ha_t *) dev_id; + if (!ha) + return; + host = ips_sh[ha->host_num]; + /* interrupt during initialization */ + if (!host) { + (*ha->func.intr) (ha); + return; + } + + IPS_LOCK_SAVE(host->host_lock, cpu_flags); + + if (!ha->active) { + IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); + return; + } - (*ha->func.intr)(ha); + (*ha->func.intr) (ha); - IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); + IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); - /* start the next command */ - ips_next(ha, IPS_INTR_ON); + /* start the next command */ + ips_next(ha, IPS_INTR_ON); } /****************************************************************************/ @@ -2029,54 +1319,55 @@ /* */ /****************************************************************************/ void -ips_intr_copperhead(ips_ha_t *ha) { - ips_stat_t *sp; - ips_scb_t *scb; - IPS_STATUS cstatus; - int intrstatus; - - METHOD_TRACE("ips_intr", 2); - - if (!ha) - return; - - if (!ha->active) - return; - - intrstatus = (*ha->func.isintr)(ha); - - if (!intrstatus) { - /* - * Unexpected/Shared interrupt - */ - - return; - } - - while (TRUE) { - sp = &ha->sp; - - intrstatus = (*ha->func.isintr)(ha); - - if (!intrstatus) - break; - else - cstatus.value = (*ha->func.statupd)(ha); - - if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) { - /* Spurious Interupt ? */ - continue; - } - - ips_chkstatus(ha, &cstatus); - scb = (ips_scb_t *) sp->scb_addr; - - /* - * use the callback function to finish things up - * NOTE: interrupts are OFF for this - */ - (*scb->callback) (ha, scb); - } /* end while */ +ips_intr_copperhead(ips_ha_t * ha) +{ + ips_stat_t *sp; + ips_scb_t *scb; + IPS_STATUS cstatus; + int intrstatus; + + METHOD_TRACE("ips_intr", 2); + + if (!ha) + return; + + if (!ha->active) + return; + + intrstatus = (*ha->func.isintr) (ha); + + if (!intrstatus) { + /* + * Unexpected/Shared interrupt + */ + + return; + } + + while (TRUE) { + sp = &ha->sp; + + intrstatus = (*ha->func.isintr) (ha); + + if (!intrstatus) + break; + else + cstatus.value = (*ha->func.statupd) (ha); + + if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) { + /* Spurious Interupt ? */ + continue; + } + + ips_chkstatus(ha, &cstatus); + scb = (ips_scb_t *) sp->scb_addr; + + /* + * use the callback function to finish things up + * NOTE: interrupts are OFF for this + */ + (*scb->callback) (ha, scb); + } /* end while */ } /****************************************************************************/ @@ -2091,60 +1382,62 @@ /* */ /****************************************************************************/ void -ips_intr_morpheus(ips_ha_t *ha) { - ips_stat_t *sp; - ips_scb_t *scb; - IPS_STATUS cstatus; - int intrstatus; +ips_intr_morpheus(ips_ha_t * ha) +{ + ips_stat_t *sp; + ips_scb_t *scb; + IPS_STATUS cstatus; + int intrstatus; - METHOD_TRACE("ips_intr_morpheus", 2); + METHOD_TRACE("ips_intr_morpheus", 2); - if (!ha) - return; + if (!ha) + return; - if (!ha->active) - return; + if (!ha->active) + return; - intrstatus = (*ha->func.isintr)(ha); + intrstatus = (*ha->func.isintr) (ha); - if (!intrstatus) { - /* - * Unexpected/Shared interrupt - */ + if (!intrstatus) { + /* + * Unexpected/Shared interrupt + */ - return; - } + return; + } - while (TRUE) { - sp = &ha->sp; + while (TRUE) { + sp = &ha->sp; - intrstatus = (*ha->func.isintr)(ha); + intrstatus = (*ha->func.isintr) (ha); - if (!intrstatus) - break; - else - cstatus.value = (*ha->func.statupd)(ha); + if (!intrstatus) + break; + else + cstatus.value = (*ha->func.statupd) (ha); - if (cstatus.value == 0xffffffff) - /* No more to process */ - break; + if (cstatus.value == 0xffffffff) + /* No more to process */ + break; - if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) { - printk(KERN_WARNING "(%s%d) Spurious interrupt; no ccb.\n", - ips_name, ha->host_num); + if (cstatus.fields.command_id > (IPS_MAX_CMDS - 1)) { + printk(KERN_WARNING + "(%s%d) Spurious interrupt; no ccb.\n", ips_name, + ha->host_num); - continue; - } + continue; + } - ips_chkstatus(ha, &cstatus); - scb = (ips_scb_t *) sp->scb_addr; + ips_chkstatus(ha, &cstatus); + scb = (ips_scb_t *) sp->scb_addr; - /* - * use the callback function to finish things up - * NOTE: interrupts are OFF for this - */ - (*scb->callback) (ha, scb); - } /* end while */ + /* + * use the callback function to finish things up + * NOTE: interrupts are OFF for this + */ + (*scb->callback) (ha, scb); + } /* end while */ } /****************************************************************************/ @@ -2157,31 +1450,32 @@ /* */ /****************************************************************************/ const char * -ips_info(struct Scsi_Host *SH) { - static char buffer[256]; - char *bp; - ips_ha_t *ha; +ips_info(struct Scsi_Host *SH) +{ + static char buffer[256]; + char *bp; + ips_ha_t *ha; - METHOD_TRACE("ips_info", 1); + METHOD_TRACE("ips_info", 1); - ha = IPS_HA(SH); + ha = IPS_HA(SH); - if (!ha) - return (NULL); + if (!ha) + return (NULL); - bp = &buffer[0]; - memset(bp, 0, sizeof(buffer)); + bp = &buffer[0]; + memset(bp, 0, sizeof (buffer)); - sprintf(bp, "%s%s%s", "IBM PCI ServeRAID ", IPS_VERSION_HIGH, IPS_VERSION_LOW ); + sprintf(bp, "%s%s%s Build %d", "IBM PCI ServeRAID ", + IPS_VERSION_HIGH, IPS_VERSION_LOW, IPS_BUILD_IDENT); - if (ha->ad_type > 0 && - ha->ad_type <= MAX_ADAPTER_NAME) { - strcat(bp, " <"); - strcat(bp, ips_adapter_name[ha->ad_type-1]); - strcat(bp, ">"); - } + if (ha->ad_type > 0 && ha->ad_type <= MAX_ADAPTER_NAME) { + strcat(bp, " <"); + strcat(bp, ips_adapter_name[ha->ad_type - 1]); + strcat(bp, ">"); + } - return (bp); + return (bp); } /****************************************************************************/ @@ -2195,38 +1489,39 @@ /****************************************************************************/ int ips_proc_info(char *buffer, char **start, off_t offset, - int length, int hostno, int func) { - int i; - int ret; - ips_ha_t *ha = NULL; - - METHOD_TRACE("ips_proc_info", 1); - - /* Find our host structure */ - for (i = 0; i < ips_next_controller; i++) { - if (ips_sh[i]) { - if (ips_sh[i]->host_no == hostno) { - ha = (ips_ha_t *) ips_sh[i]->hostdata; - break; - } - } - } - - if (!ha) - return (-EINVAL); - - if (func) { - /* write */ - return (0); - } else { - /* read */ - if (start) - *start = buffer; + int length, int hostno, int func) +{ + int i; + int ret; + ips_ha_t *ha = NULL; + + METHOD_TRACE("ips_proc_info", 1); + + /* Find our host structure */ + for (i = 0; i < ips_next_controller; i++) { + if (ips_sh[i]) { + if (ips_sh[i]->host_no == hostno) { + ha = (ips_ha_t *) ips_sh[i]->hostdata; + break; + } + } + } + + if (!ha) + return (-EINVAL); + + if (func) { + /* write */ + return (0); + } else { + /* read */ + if (start) + *start = buffer; - ret = ips_host_info(ha, buffer, offset, length); + ret = ips_host_info(ha, buffer, offset, length); - return (ret); - } + return (ret); + } } /*--------------------------------------------------------------------------*/ @@ -2243,32 +1538,65 @@ /* */ /****************************************************************************/ static int -ips_is_passthru(Scsi_Cmnd *SC) { - METHOD_TRACE("ips_is_passthru", 1); +ips_is_passthru(Scsi_Cmnd * SC) +{ + METHOD_TRACE("ips_is_passthru", 1); - if (!SC) - return (0); + if (!SC) + return (0); + + if ((SC->cmnd[0] == IPS_IOCTL_COMMAND) && + (SC->channel == 0) && + (SC->target == IPS_ADAPTER_ID) && + (SC->lun == 0) && SC->request_buffer) { + if ((!SC->use_sg) && SC->request_bufflen && + (((char *) SC->request_buffer)[0] == 'C') && + (((char *) SC->request_buffer)[1] == 'O') && + (((char *) SC->request_buffer)[2] == 'P') && + (((char *) SC->request_buffer)[3] == 'P')) + return 1; + else if (SC->use_sg) { + struct scatterlist *sg = SC->request_buffer; + char *buffer = IPS_SG_ADDRESS(sg); + if (buffer && buffer[0] == 'C' && buffer[1] == 'O' && + buffer[2] == 'P' && buffer[3] == 'P') + return 1; + } + } + return 0; +} - if ((SC->cmnd[0] == IPS_IOCTL_COMMAND) && - (SC->channel == 0) && - (SC->target == IPS_ADAPTER_ID) && - (SC->lun == 0) && - SC->request_buffer){ - if((!SC->use_sg) && SC->request_bufflen && - (((char *) SC->request_buffer)[0] == 'C') && - (((char *) SC->request_buffer)[1] == 'O') && - (((char *) SC->request_buffer)[2] == 'P') && - (((char *) SC->request_buffer)[3] == 'P')) - return 1; - else if(SC->use_sg){ - struct scatterlist *sg = SC->request_buffer; - char *buffer = IPS_SG_ADDRESS(sg); - if(buffer && buffer[0] == 'C' && buffer[1] == 'O' && - buffer[2] == 'P' && buffer[3] == 'P') - return 1; - } - } - return 0; +/****************************************************************************/ +/* */ +/* Routine Name: ips_alloc_passthru_buffer */ +/* */ +/* Routine Description: */ +/* allocate a buffer large enough for the ioctl data if the ioctl buffer */ +/* is too small or doesn't exist */ +/****************************************************************************/ +static int +ips_alloc_passthru_buffer(ips_ha_t * ha, int length) +{ + void *bigger_buf; + int count; + int order; + + if (ha->ioctl_data && length <= (PAGE_SIZE << ha->ioctl_order)) + return 0; + /* there is no buffer or it's not big enough, allocate a new one */ + for (count = PAGE_SIZE, order = 0; + count < length; order++, count <<= 1) ; + bigger_buf = (void *) __get_free_pages(IPS_ATOMIC_GFP, order); + if (bigger_buf) { + /* free the old memory */ + free_pages((unsigned long) ha->ioctl_data, ha->ioctl_order); + /* use the new memory */ + ha->ioctl_data = (char *) bigger_buf; + ha->ioctl_order = order; + } else { + return -1; + } + return 0; } /****************************************************************************/ @@ -2281,127 +1609,96 @@ /* */ /****************************************************************************/ static int -ips_make_passthru(ips_ha_t *ha, Scsi_Cmnd *SC, ips_scb_t *scb, int intr) { - ips_passthru_t *pt; - char *buffer; - int length = 0; - - METHOD_TRACE("ips_make_passthru", 1); - - if(!SC->use_sg){ - buffer = SC->request_buffer; - length = SC->request_bufflen; - }else{ - struct scatterlist *sg = SC->request_buffer; - int i; - for(i = 0; i < SC->use_sg; i++) - length += sg[i].length; - - if (length < sizeof(ips_passthru_t)) { - /* wrong size */ - DEBUG_VAR(1, "(%s%d) Passthru structure wrong size", - ips_name, ha->host_num); - return (IPS_FAILURE); - }else if(!ha->ioctl_data || length > (PAGE_SIZE << ha->ioctl_order)){ - void *bigger_buf; - int count; - int order; - /* try to allocate a bigger buffer */ - for (count = PAGE_SIZE, order = 0; - count < length; - order++, count <<= 1); - bigger_buf = (void *) __get_free_pages(GFP_ATOMIC, order); - if (bigger_buf) { - /* free the old memory */ - free_pages((unsigned long) ha->ioctl_data, ha->ioctl_order); - /* use the new memory */ - ha->ioctl_data = (char *) bigger_buf; - ha->ioctl_order = order; - ha->ioctl_datasize = count; - } else { - pt = (ips_passthru_t*)IPS_SG_ADDRESS(sg); - pt->BasicStatus = 0x0B; - pt->ExtendedStatus = 0x00; - SC->result = DID_ERROR << 16; - return (IPS_FAILURE); - } - } - ha->ioctl_datasize = length; - length = 0; - for(i = 0; i < SC->use_sg; i++){ - memcpy(&ha->ioctl_data[length], IPS_SG_ADDRESS(&sg[i]), sg[i].length); - length += sg[i].length; - } - pt = (ips_passthru_t *)ha->ioctl_data; - buffer = ha->ioctl_data; - } - if (!length || !buffer) { - /* no data */ - DEBUG_VAR(1, "(%s%d) No passthru structure", - ips_name, ha->host_num); - - return (IPS_FAILURE); - } - if (length < sizeof(ips_passthru_t)) { - /* wrong size */ - DEBUG_VAR(1, "(%s%d) Passthru structure wrong size", - ips_name, ha->host_num); - - return (IPS_FAILURE); - } - pt = (ips_passthru_t*) buffer; - /* - * Some notes about the passthru interface used - * - * IF the scsi op_code == 0x0d then we assume - * that the data came along with/goes with the - * packet we received from the sg driver. In this - * case the CmdBSize field of the pt structure is - * used for the size of the buffer. - */ - - switch (pt->CoppCmd) { - case IPS_NUMCTRLS: - memcpy(buffer + sizeof(ips_passthru_t), - &ips_num_controllers, sizeof(int)); - SC->result = DID_OK << 16; - - return (IPS_SUCCESS_IMM); - - case IPS_CTRLINFO: - memcpy(buffer + sizeof(ips_passthru_t), - ha, sizeof(ips_ha_t)); - SC->result = DID_OK << 16; - - return (IPS_SUCCESS_IMM); - - case IPS_COPPUSRCMD: - case IPS_COPPIOCCMD: - if (SC->cmnd[0] == IPS_IOCTL_COMMAND) { - if (length < (sizeof(ips_passthru_t) + pt->CmdBSize)) { - /* wrong size */ - DEBUG_VAR(1, "(%s%d) Passthru structure wrong size", - ips_name, ha->host_num); - - return (IPS_FAILURE); - } - - if(ha->device_id == IPS_DEVICEID_COPPERHEAD && - pt->CoppCP.cmd.flashfw.op_code == IPS_CMD_RW_BIOSFW) - return ips_flash_copperhead(ha, pt, scb); - - if (ips_usrcmd(ha, pt, scb)) - return (IPS_SUCCESS); - else - return (IPS_FAILURE); - } - - break; +ips_make_passthru(ips_ha_t * ha, Scsi_Cmnd * SC, ips_scb_t * scb, int intr) +{ + ips_passthru_t *pt; + int length = 0; + int ret; + + METHOD_TRACE("ips_make_passthru", 1); + + if (!SC->use_sg) { + length = SC->request_bufflen; + } else { + struct scatterlist *sg = SC->request_buffer; + int i; + for (i = 0; i < SC->use_sg; i++) + length += sg[i].length; + } + if (length < sizeof (ips_passthru_t)) { + /* wrong size */ + DEBUG_VAR(1, "(%s%d) Passthru structure wrong size", + ips_name, ha->host_num); + return (IPS_FAILURE); + } + if (ips_alloc_passthru_buffer(ha, length)) { + /* allocation failure! If ha->ioctl_data exists, use it to return + some error codes. Return a failed command to the scsi layer. */ + if (ha->ioctl_data) { + pt = (ips_passthru_t *) ha->ioctl_data; + ips_scmd_buf_read(SC, pt, sizeof (ips_passthru_t)); + pt->BasicStatus = 0x0B; + pt->ExtendedStatus = 0x00; + ips_scmd_buf_write(SC, pt, sizeof (ips_passthru_t)); + } + return IPS_FAILURE; + } + ha->ioctl_datasize = length; + + ips_scmd_buf_read(SC, ha->ioctl_data, ha->ioctl_datasize); + pt = (ips_passthru_t *) ha->ioctl_data; + + /* + * Some notes about the passthru interface used + * + * IF the scsi op_code == 0x0d then we assume + * that the data came along with/goes with the + * packet we received from the sg driver. In this + * case the CmdBSize field of the pt structure is + * used for the size of the buffer. + */ + + switch (pt->CoppCmd) { + case IPS_NUMCTRLS: + memcpy(ha->ioctl_data + sizeof (ips_passthru_t), + &ips_num_controllers, sizeof (int)); + ips_scmd_buf_write(SC, ha->ioctl_data, + sizeof (ips_passthru_t) + sizeof (int)); + SC->result = DID_OK << 16; + + return (IPS_SUCCESS_IMM); + + case IPS_COPPUSRCMD: + case IPS_COPPIOCCMD: + if (SC->cmnd[0] == IPS_IOCTL_COMMAND) { + if (length < (sizeof (ips_passthru_t) + pt->CmdBSize)) { + /* wrong size */ + DEBUG_VAR(1, + "(%s%d) Passthru structure wrong size", + ips_name, ha->host_num); + + return (IPS_FAILURE); + } + + if (ha->device_id == IPS_DEVICEID_COPPERHEAD && + pt->CoppCP.cmd.flashfw.op_code == IPS_CMD_RW_BIOSFW) { + ret = ips_flash_copperhead(ha, pt, scb); + ips_scmd_buf_write(SC, ha->ioctl_data, + sizeof (ips_passthru_t)); + return ret; + } + if (ips_usrcmd(ha, pt, scb)) + return (IPS_SUCCESS); + else + return (IPS_FAILURE); + } - } /* end switch */ + break; - return (IPS_FAILURE); - } + } /* end switch */ + + return (IPS_FAILURE); +} /****************************************************************************/ /* Routine Name: ips_flash_copperhead */ @@ -2409,62 +1706,65 @@ /* Flash the BIOS/FW on a Copperhead style controller */ /****************************************************************************/ static int -ips_flash_copperhead(ips_ha_t *ha, ips_passthru_t *pt, ips_scb_t *scb){ - int datasize, count; +ips_flash_copperhead(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb) +{ + int datasize, count; - /* Trombone is the only copperhead that can do packet flash, but only - * for firmware. No one said it had to make sence. */ - if(IPS_IS_TROMBONE(ha) && pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE){ - if(ips_usrcmd(ha, pt, scb)) - return IPS_SUCCESS; - else - return IPS_FAILURE; - } - pt->BasicStatus = 0x0B; - pt->ExtendedStatus = 0; - scb->scsi_cmd->result = DID_OK <<16; - /* IF it's OK to Use the "CD BOOT" Flash Buffer, then you can */ - /* avoid allocating a huge buffer per adapter ( which can fail ). */ - if(pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE && - pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS){ - pt->BasicStatus = 0; - return ips_flash_bios(ha, pt, scb); - }else if(pt->CoppCP.cmd.flashfw.packet_num == 0){ - if(ips_FlashData && !test_and_set_bit(0, &ips_FlashDataInUse)){ - ha->flash_data = ips_FlashData; - ha->flash_order = 7; - ha->flash_datasize = 0; - }else if(!ha->flash_data){ - datasize = pt->CoppCP.cmd.flashfw.total_packets * - pt->CoppCP.cmd.flashfw.count; - for (count = PAGE_SIZE, ha->flash_order = 0; count < datasize; - ha->flash_order++, count <<= 1); - ha->flash_data = (char *)__get_free_pages(GFP_ATOMIC, ha->flash_order); - ha->flash_datasize = 0; - }else - return IPS_FAILURE; - }else{ - if(pt->CoppCP.cmd.flashfw.count + ha->flash_datasize > - (PAGE_SIZE << ha->flash_order)){ - ips_free_flash_copperhead(ha); - printk(KERN_WARNING "failed size sanity check\n"); - return IPS_FAILURE; - } - } - if(!ha->flash_data) - return IPS_FAILURE; - pt->BasicStatus = 0; - memcpy(&ha->flash_data[ha->flash_datasize], pt + 1, - pt->CoppCP.cmd.flashfw.count); - ha->flash_datasize += pt->CoppCP.cmd.flashfw.count; - if(pt->CoppCP.cmd.flashfw.packet_num == - pt->CoppCP.cmd.flashfw.total_packets - 1){ - if(pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE) - return ips_flash_bios(ha, pt, scb); - else if(pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) - return ips_flash_firmware(ha, pt, scb); - } - return IPS_SUCCESS_IMM; + /* Trombone is the only copperhead that can do packet flash, but only + * for firmware. No one said it had to make sence. */ + if (IPS_IS_TROMBONE(ha) && pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) { + if (ips_usrcmd(ha, pt, scb)) + return IPS_SUCCESS; + else + return IPS_FAILURE; + } + pt->BasicStatus = 0x0B; + pt->ExtendedStatus = 0; + scb->scsi_cmd->result = DID_OK << 16; + /* IF it's OK to Use the "CD BOOT" Flash Buffer, then you can */ + /* avoid allocating a huge buffer per adapter ( which can fail ). */ + if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE && + pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) { + pt->BasicStatus = 0; + return ips_flash_bios(ha, pt, scb); + } else if (pt->CoppCP.cmd.flashfw.packet_num == 0) { + if (ips_FlashData && !test_and_set_bit(0, &ips_FlashDataInUse)) { + ha->flash_data = ips_FlashData; + ha->flash_order = 7; + ha->flash_datasize = 0; + } else if (!ha->flash_data) { + datasize = pt->CoppCP.cmd.flashfw.total_packets * + pt->CoppCP.cmd.flashfw.count; + for (count = PAGE_SIZE, ha->flash_order = 0; + count < datasize; ha->flash_order++, count <<= 1) ; + ha->flash_data = + (char *) __get_free_pages(IPS_ATOMIC_GFP, + ha->flash_order); + ha->flash_datasize = 0; + } else + return IPS_FAILURE; + } else { + if (pt->CoppCP.cmd.flashfw.count + ha->flash_datasize > + (PAGE_SIZE << ha->flash_order)) { + ips_free_flash_copperhead(ha); + printk(KERN_WARNING "failed size sanity check\n"); + return IPS_FAILURE; + } + } + if (!ha->flash_data) + return IPS_FAILURE; + pt->BasicStatus = 0; + memcpy(&ha->flash_data[ha->flash_datasize], pt + 1, + pt->CoppCP.cmd.flashfw.count); + ha->flash_datasize += pt->CoppCP.cmd.flashfw.count; + if (pt->CoppCP.cmd.flashfw.packet_num == + pt->CoppCP.cmd.flashfw.total_packets - 1) { + if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE) + return ips_flash_bios(ha, pt, scb); + else if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) + return ips_flash_firmware(ha, pt, scb); + } + return IPS_SUCCESS_IMM; } /****************************************************************************/ @@ -2473,46 +1773,95 @@ /* flashes the bios of a copperhead adapter */ /****************************************************************************/ static int -ips_flash_bios(ips_ha_t * ha, ips_passthru_t *pt, ips_scb_t *scb){ +ips_flash_bios(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb) +{ - if(pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE && - pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_BIOS){ - if ((!ha->func.programbios) || (!ha->func.erasebios) || - (!ha->func.verifybios)) - goto error; - if((*ha->func.erasebios)(ha)){ - DEBUG_VAR(1, "(%s%d) flash bios failed - unable to erase flash", - ips_name, ha->host_num); - goto error; - }else if ((*ha->func.programbios)(ha, ha->flash_data + IPS_BIOS_HEADER, - ha->flash_datasize - IPS_BIOS_HEADER, 0 )) { - DEBUG_VAR(1, "(%s%d) flash bios failed - unable to flash", - ips_name, ha->host_num); - goto error; - }else if ((*ha->func.verifybios)(ha, ha->flash_data + IPS_BIOS_HEADER, - ha->flash_datasize - IPS_BIOS_HEADER, 0 )) { - DEBUG_VAR(1, "(%s%d) flash bios failed - unable to verify flash", - ips_name, ha->host_num); - goto error; - } - ips_free_flash_copperhead(ha); - return IPS_SUCCESS_IMM; - }else if(pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE && - pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS){ - if(!ha->func.erasebios) - goto error; - if((*ha->func.erasebios)(ha)){ - DEBUG_VAR(1, "(%s%d) flash bios failed - unable to erase flash", - ips_name, ha->host_num); - goto error; - } - return IPS_SUCCESS_IMM; - } -error: - pt->BasicStatus = 0x0B; - pt->ExtendedStatus = 0x00; - ips_free_flash_copperhead(ha); - return IPS_FAILURE; + if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE && + pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_BIOS) { + if ((!ha->func.programbios) || (!ha->func.erasebios) || + (!ha->func.verifybios)) goto error; + if ((*ha->func.erasebios) (ha)) { + DEBUG_VAR(1, + "(%s%d) flash bios failed - unable to erase flash", + ips_name, ha->host_num); + goto error; + } else + if ((*ha->func.programbios) + (ha, ha->flash_data + IPS_BIOS_HEADER, + ha->flash_datasize - IPS_BIOS_HEADER, 0)) { + DEBUG_VAR(1, + "(%s%d) flash bios failed - unable to flash", + ips_name, ha->host_num); + goto error; + } else + if ((*ha->func.verifybios) + (ha, ha->flash_data + IPS_BIOS_HEADER, + ha->flash_datasize - IPS_BIOS_HEADER, 0)) { + DEBUG_VAR(1, + "(%s%d) flash bios failed - unable to verify flash", + ips_name, ha->host_num); + goto error; + } + ips_free_flash_copperhead(ha); + return IPS_SUCCESS_IMM; + } else if (pt->CoppCP.cmd.flashfw.type == IPS_BIOS_IMAGE && + pt->CoppCP.cmd.flashfw.direction == IPS_ERASE_BIOS) { + if (!ha->func.erasebios) + goto error; + if ((*ha->func.erasebios) (ha)) { + DEBUG_VAR(1, + "(%s%d) flash bios failed - unable to erase flash", + ips_name, ha->host_num); + goto error; + } + return IPS_SUCCESS_IMM; + } + error: + pt->BasicStatus = 0x0B; + pt->ExtendedStatus = 0x00; + ips_free_flash_copperhead(ha); + return IPS_FAILURE; +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_fill_scb_sg_single */ +/* */ +/* Routine Description: */ +/* Fill in a single scb sg_list element from an address */ +/* return a -1 if a breakup occured */ +/****************************************************************************/ +static inline int +ips_fill_scb_sg_single(ips_ha_t * ha, dma_addr_t busaddr, + ips_scb_t * scb, int indx, unsigned int e_len) +{ + + int ret_val = 0; + + if ((scb->data_len + e_len) > ha->max_xfer) { + e_len = ha->max_xfer - scb->data_len; + scb->breakup = indx; + ++scb->sg_break; + ret_val = -1; + } else { + scb->breakup = 0; + scb->sg_break = 0; + } + if (IPS_USE_ENH_SGLIST(ha)) { + scb->sg_list.enh_list[indx].address_lo = + cpu_to_le32(pci_dma_lo32(busaddr)); + scb->sg_list.enh_list[indx].address_hi = + cpu_to_le32(pci_dma_hi32(busaddr)); + scb->sg_list.enh_list[indx].length = cpu_to_le32(e_len); + } else { + scb->sg_list.std_list[indx].address = + cpu_to_le32(pci_dma_lo32(busaddr)); + scb->sg_list.std_list[indx].length = cpu_to_le32(e_len); + } + + ++scb->sg_len; + scb->data_len += e_len; + return ret_val; } /****************************************************************************/ @@ -2521,49 +1870,51 @@ /* flashes the firmware of a copperhead adapter */ /****************************************************************************/ static int -ips_flash_firmware(ips_ha_t * ha, ips_passthru_t *pt, ips_scb_t *scb){ - IPS_SG_LIST *sg_list; - uint32_t cmd_busaddr; - - if(pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE && - pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_FW ){ - memset(&pt->CoppCP.cmd, 0, sizeof(IPS_HOST_COMMAND)); - pt->CoppCP.cmd.flashfw.op_code = IPS_CMD_DOWNLOAD; - pt->CoppCP.cmd.flashfw.count = cpu_to_le32(ha->flash_datasize); - }else{ - pt->BasicStatus = 0x0B; - pt->ExtendedStatus = 0x00; - ips_free_flash_copperhead(ha); - return IPS_FAILURE; - } - /* Save the S/G list pointer so it doesn't get clobbered */ - sg_list = scb->sg_list; - cmd_busaddr = scb->scb_busaddr; - /* copy in the CP */ - memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof(IPS_IOCTL_CMD)); - /* FIX stuff that might be wrong */ - scb->sg_list = sg_list; - scb->scb_busaddr = cmd_busaddr; - scb->bus = scb->scsi_cmd->channel; - scb->target_id = scb->scsi_cmd->target; - scb->lun = scb->scsi_cmd->lun; - scb->sg_len = 0; - scb->data_len = 0; - scb->flags = 0; - scb->op_code = 0; - scb->callback = ipsintr_done; - scb->timeout = ips_cmd_timeout; - - scb->data_len = ha->flash_datasize; - scb->data_busaddr = pci_map_single(ha->pcidev, ha->flash_data, scb->data_len, - IPS_DMA_DIR(scb)); - scb->flags |= IPS_SCB_MAP_SINGLE; - scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.flashfw.buffer_addr = scb->data_busaddr; - if (pt->TimeOut) - scb->timeout = pt->TimeOut; - scb->scsi_cmd->result = DID_OK <<16; - return IPS_SUCCESS; +ips_flash_firmware(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb) +{ + IPS_SG_LIST sg_list; + uint32_t cmd_busaddr; + + if (pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE && + pt->CoppCP.cmd.flashfw.direction == IPS_WRITE_FW) { + memset(&pt->CoppCP.cmd, 0, sizeof (IPS_HOST_COMMAND)); + pt->CoppCP.cmd.flashfw.op_code = IPS_CMD_DOWNLOAD; + pt->CoppCP.cmd.flashfw.count = cpu_to_le32(ha->flash_datasize); + } else { + pt->BasicStatus = 0x0B; + pt->ExtendedStatus = 0x00; + ips_free_flash_copperhead(ha); + return IPS_FAILURE; + } + /* Save the S/G list pointer so it doesn't get clobbered */ + sg_list.list = scb->sg_list.list; + cmd_busaddr = scb->scb_busaddr; + /* copy in the CP */ + memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD)); + /* FIX stuff that might be wrong */ + scb->sg_list.list = sg_list.list; + scb->scb_busaddr = cmd_busaddr; + scb->bus = scb->scsi_cmd->channel; + scb->target_id = scb->scsi_cmd->target; + scb->lun = scb->scsi_cmd->lun; + scb->sg_len = 0; + scb->data_len = 0; + scb->flags = 0; + scb->op_code = 0; + scb->callback = ipsintr_done; + scb->timeout = ips_cmd_timeout; + + scb->data_len = ha->flash_datasize; + scb->data_busaddr = + pci_map_single(ha->pcidev, ha->flash_data, scb->data_len, + IPS_DMA_DIR(scb)); + scb->flags |= IPS_SCB_MAP_SINGLE; + scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.flashfw.buffer_addr = cpu_to_le32(scb->data_busaddr); + if (pt->TimeOut) + scb->timeout = pt->TimeOut; + scb->scsi_cmd->result = DID_OK << 16; + return IPS_SUCCESS; } /****************************************************************************/ @@ -2572,12 +1923,13 @@ /* release the memory resources used to hold the flash image */ /****************************************************************************/ static void -ips_free_flash_copperhead(ips_ha_t *ha){ - if(ha->flash_data == ips_FlashData) - test_and_clear_bit(0, &ips_FlashDataInUse); - else if(ha->flash_data) - free_pages((unsigned long)ha->flash_data, ha->flash_order); - ha->flash_data = NULL; +ips_free_flash_copperhead(ips_ha_t * ha) +{ + if (ha->flash_data == ips_FlashData) + test_and_clear_bit(0, &ips_FlashDataInUse); + else if (ha->flash_data) + free_pages((unsigned long) ha->flash_data, ha->flash_order); + ha->flash_data = NULL; } /****************************************************************************/ @@ -2590,93 +1942,87 @@ /* */ /****************************************************************************/ static int -ips_usrcmd(ips_ha_t *ha, ips_passthru_t *pt, ips_scb_t *scb) { - IPS_SG_LIST *sg_list; - uint32_t cmd_busaddr; - - METHOD_TRACE("ips_usrcmd", 1); - - if ((!scb) || (!pt) || (!ha)) - return (0); - - /* Save the S/G list pointer so it doesn't get clobbered */ - sg_list = scb->sg_list; - cmd_busaddr = scb->scb_busaddr; - /* copy in the CP */ - memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof(IPS_IOCTL_CMD)); - memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof(IPS_DCDB_TABLE)); - - /* FIX stuff that might be wrong */ - scb->sg_list = sg_list; - scb->scb_busaddr = cmd_busaddr; - scb->bus = scb->scsi_cmd->channel; - scb->target_id = scb->scsi_cmd->target; - scb->lun = scb->scsi_cmd->lun; - scb->sg_len = 0; - scb->data_len = 0; - scb->flags = 0; - scb->op_code = 0; - scb->callback = ipsintr_done; - scb->timeout = ips_cmd_timeout; - scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); - - /* we don't support DCDB/READ/WRITE Scatter Gather */ - if ((scb->cmd.basic_io.op_code == IPS_CMD_READ_SG) || - (scb->cmd.basic_io.op_code == IPS_CMD_WRITE_SG) || - (scb->cmd.basic_io.op_code == IPS_CMD_DCDB_SG)) - return (0); - - if (pt->CmdBSize) { - if(!scb->scsi_cmd->use_sg){ - scb->data_len = pt->CmdBSize; - scb->data_busaddr = pci_map_single(ha->pcidev, - scb->scsi_cmd->request_buffer + - sizeof(ips_passthru_t), - pt->CmdBSize, - IPS_DMA_DIR(scb)); - scb->flags |= IPS_SCB_MAP_SINGLE; - } else { - scb->data_len = pt->CmdBSize; - scb->data_busaddr = pci_map_single(ha->pcidev, - ha->ioctl_data + - sizeof(ips_passthru_t), - pt->CmdBSize, - IPS_DMA_DIR(scb)); - scb->flags |= IPS_SCB_MAP_SINGLE; - } - } else { - scb->data_busaddr = 0L; - } - - if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) - scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr + - (unsigned long)&scb->dcdb - - (unsigned long)scb); - - if (pt->CmdBSize) { - if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) - scb->dcdb.buffer_pointer = cpu_to_le32(scb->data_busaddr); - else - scb->cmd.basic_io.sg_addr = cpu_to_le32(scb->data_busaddr); - } - - /* set timeouts */ - if (pt->TimeOut) { - scb->timeout = pt->TimeOut; - - if (pt->TimeOut <= 10) - scb->dcdb.cmd_attribute |= IPS_TIMEOUT10; - else if (pt->TimeOut <= 60) - scb->dcdb.cmd_attribute |= IPS_TIMEOUT60; - else - scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; - } +ips_usrcmd(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb) +{ + IPS_SG_LIST sg_list; + uint32_t cmd_busaddr; + + METHOD_TRACE("ips_usrcmd", 1); + + if ((!scb) || (!pt) || (!ha)) + return (0); + + /* Save the S/G list pointer so it doesn't get clobbered */ + sg_list.list = scb->sg_list.list; + cmd_busaddr = scb->scb_busaddr; + /* copy in the CP */ + memcpy(&scb->cmd, &pt->CoppCP.cmd, sizeof (IPS_IOCTL_CMD)); + memcpy(&scb->dcdb, &pt->CoppCP.dcdb, sizeof (IPS_DCDB_TABLE)); + + /* FIX stuff that might be wrong */ + scb->sg_list.list = sg_list.list; + scb->scb_busaddr = cmd_busaddr; + scb->bus = scb->scsi_cmd->channel; + scb->target_id = scb->scsi_cmd->target; + scb->lun = scb->scsi_cmd->lun; + scb->sg_len = 0; + scb->data_len = 0; + scb->flags = 0; + scb->op_code = 0; + scb->callback = ipsintr_done; + scb->timeout = ips_cmd_timeout; + scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); + + /* we don't support DCDB/READ/WRITE Scatter Gather */ + if ((scb->cmd.basic_io.op_code == IPS_CMD_READ_SG) || + (scb->cmd.basic_io.op_code == IPS_CMD_WRITE_SG) || + (scb->cmd.basic_io.op_code == IPS_CMD_DCDB_SG)) + return (0); + + if (pt->CmdBSize) { + scb->data_len = pt->CmdBSize; + scb->data_busaddr = pci_map_single(ha->pcidev, + ha->ioctl_data + + sizeof (ips_passthru_t), + pt->CmdBSize, + IPS_DMA_DIR(scb)); + scb->flags |= IPS_SCB_MAP_SINGLE; + } else { + scb->data_busaddr = 0L; + } + + if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) + scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr + + (unsigned long) &scb-> + dcdb - + (unsigned long) scb); + + if (pt->CmdBSize) { + if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) + scb->dcdb.buffer_pointer = + cpu_to_le32(scb->data_busaddr); + else + scb->cmd.basic_io.sg_addr = + cpu_to_le32(scb->data_busaddr); + } + + /* set timeouts */ + if (pt->TimeOut) { + scb->timeout = pt->TimeOut; + + if (pt->TimeOut <= 10) + scb->dcdb.cmd_attribute |= IPS_TIMEOUT10; + else if (pt->TimeOut <= 60) + scb->dcdb.cmd_attribute |= IPS_TIMEOUT60; + else + scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; + } - /* assume success */ - scb->scsi_cmd->result = DID_OK << 16; + /* assume success */ + scb->scsi_cmd->result = DID_OK << 16; - /* success */ - return (1); + /* success */ + return (1); } /****************************************************************************/ @@ -2689,43 +2035,34 @@ /* */ /****************************************************************************/ static void -ips_cleanup_passthru(ips_ha_t *ha, ips_scb_t *scb) { - ips_passthru_t *pt; +ips_cleanup_passthru(ips_ha_t * ha, ips_scb_t * scb) +{ + ips_passthru_t *pt; + + METHOD_TRACE("ips_cleanup_passthru", 1); + + if ((!scb) || (!scb->scsi_cmd) || (!scb->scsi_cmd->request_buffer)) { + DEBUG_VAR(1, "(%s%d) couldn't cleanup after passthru", + ips_name, ha->host_num); - METHOD_TRACE("ips_cleanup_passthru", 1); + return; + } + pt = (ips_passthru_t *) ha->ioctl_data; - if ((!scb) || (!scb->scsi_cmd) || (!scb->scsi_cmd->request_buffer)) { - DEBUG_VAR(1, "(%s%d) couldn't cleanup after passthru", - ips_name, ha->host_num); - - return ; - } - if(!scb->scsi_cmd->use_sg) - pt = (ips_passthru_t *) scb->scsi_cmd->request_buffer; - else - pt = (ips_passthru_t *) ha->ioctl_data; - - /* Copy data back to the user */ - if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) /* Copy DCDB Back to Caller's Area */ - memcpy(&pt->CoppCP.dcdb, &scb->dcdb, sizeof(IPS_DCDB_TABLE)); - - pt->BasicStatus = scb->basic_status; - pt->ExtendedStatus = scb->extended_status; - pt->AdapterType = ha->ad_type; - - if(ha->device_id == IPS_DEVICEID_COPPERHEAD && - (scb->cmd.flashfw.op_code == IPS_CMD_DOWNLOAD || - scb->cmd.flashfw.op_code == IPS_CMD_RW_BIOSFW)) - ips_free_flash_copperhead(ha); - - if(scb->scsi_cmd->use_sg){ - int i, length = 0; - struct scatterlist *sg = scb->scsi_cmd->request_buffer; - for(i = 0; i < scb->scsi_cmd->use_sg; i++){ - memcpy(IPS_SG_ADDRESS(&sg[i]), &ha->ioctl_data[length], sg[i].length); - length += sg[i].length; - } - } + /* Copy data back to the user */ + if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB) /* Copy DCDB Back to Caller's Area */ + memcpy(&pt->CoppCP.dcdb, &scb->dcdb, sizeof (IPS_DCDB_TABLE)); + + pt->BasicStatus = scb->basic_status; + pt->ExtendedStatus = scb->extended_status; + pt->AdapterType = ha->ad_type; + + if (ha->device_id == IPS_DEVICEID_COPPERHEAD && + (scb->cmd.flashfw.op_code == IPS_CMD_DOWNLOAD || + scb->cmd.flashfw.op_code == IPS_CMD_RW_BIOSFW)) + ips_free_flash_copperhead(ha); + + ips_scmd_buf_write(scb->scsi_cmd, ha->ioctl_data, ha->ioctl_datasize); } /****************************************************************************/ @@ -2738,75 +2075,88 @@ /* */ /****************************************************************************/ static int -ips_host_info(ips_ha_t *ha, char *ptr, off_t offset, int len) { - IPS_INFOSTR info; +ips_host_info(ips_ha_t * ha, char *ptr, off_t offset, int len) +{ + IPS_INFOSTR info; - METHOD_TRACE("ips_host_info", 1); + METHOD_TRACE("ips_host_info", 1); - info.buffer = ptr; - info.length = len; - info.offset = offset; - info.pos = 0; - info.localpos = 0; - - copy_info(&info, "\nIBM ServeRAID General Information:\n\n"); - - if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) && - (le16_to_cpu(ha->nvram->adapter_type) != 0)) - copy_info(&info, "\tController Type : %s\n", ips_adapter_name[ha->ad_type-1]); - else - copy_info(&info, "\tController Type : Unknown\n"); - - if (ha->io_addr) - copy_info(&info, "\tIO region : 0x%lx (%d bytes)\n", - ha->io_addr, ha->io_len); - - if (ha->mem_addr) { - copy_info(&info, "\tMemory region : 0x%lx (%d bytes)\n", - ha->mem_addr, ha->mem_len); - copy_info(&info, "\tShared memory address : 0x%lx\n", ha->mem_ptr); - } - - copy_info(&info, "\tIRQ number : %d\n", ha->irq); - - if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) - copy_info(&info, "\tBIOS Version : %c%c%c%c%c%c%c%c\n", - ha->nvram->bios_high[0], ha->nvram->bios_high[1], - ha->nvram->bios_high[2], ha->nvram->bios_high[3], - ha->nvram->bios_low[0], ha->nvram->bios_low[1], - ha->nvram->bios_low[2], ha->nvram->bios_low[3]); - - copy_info(&info, "\tFirmware Version : %c%c%c%c%c%c%c%c\n", - ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1], - ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3], - ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5], - ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]); - - copy_info(&info, "\tBoot Block Version : %c%c%c%c%c%c%c%c\n", - ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1], - ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3], - ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5], - ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]); - - copy_info(&info, "\tDriver Version : %s%s\n", - IPS_VERSION_HIGH, IPS_VERSION_LOW); - - copy_info(&info, "\tMax Physical Devices : %d\n", - ha->enq->ucMaxPhysicalDevices); - copy_info(&info, "\tMax Active Commands : %d\n", - ha->max_cmds); - copy_info(&info, "\tCurrent Queued Commands : %d\n", - ha->scb_waitlist.count); - copy_info(&info, "\tCurrent Active Commands : %d\n", - ha->scb_activelist.count - ha->num_ioctl); - copy_info(&info, "\tCurrent Queued PT Commands : %d\n", - ha->copp_waitlist.count); - copy_info(&info, "\tCurrent Active PT Commands : %d\n", - ha->num_ioctl); + info.buffer = ptr; + info.length = len; + info.offset = offset; + info.pos = 0; + info.localpos = 0; + + copy_info(&info, "\nIBM ServeRAID General Information:\n\n"); + + if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) && + (le16_to_cpu(ha->nvram->adapter_type) != 0)) + copy_info(&info, "\tController Type : %s\n", + ips_adapter_name[ha->ad_type - 1]); + else + copy_info(&info, + "\tController Type : Unknown\n"); + + if (ha->io_addr) + copy_info(&info, + "\tIO region : 0x%lx (%d bytes)\n", + ha->io_addr, ha->io_len); + + if (ha->mem_addr) { + copy_info(&info, + "\tMemory region : 0x%lx (%d bytes)\n", + ha->mem_addr, ha->mem_len); + copy_info(&info, + "\tShared memory address : 0x%lx\n", + ha->mem_ptr); + } + + copy_info(&info, "\tIRQ number : %d\n", ha->irq); + + if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) + copy_info(&info, + "\tBIOS Version : %c%c%c%c%c%c%c%c\n", + ha->nvram->bios_high[0], ha->nvram->bios_high[1], + ha->nvram->bios_high[2], ha->nvram->bios_high[3], + ha->nvram->bios_low[0], ha->nvram->bios_low[1], + ha->nvram->bios_low[2], ha->nvram->bios_low[3]); + + copy_info(&info, + "\tFirmware Version : %c%c%c%c%c%c%c%c\n", + ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1], + ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3], + ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5], + ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]); + + copy_info(&info, + "\tBoot Block Version : %c%c%c%c%c%c%c%c\n", + ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1], + ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3], + ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5], + ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]); + + copy_info(&info, "\tDriver Version : %s%s\n", + IPS_VERSION_HIGH, IPS_VERSION_LOW); + + copy_info(&info, "\tDriver Build : %d\n", + IPS_BUILD_IDENT); + + copy_info(&info, "\tMax Physical Devices : %d\n", + ha->enq->ucMaxPhysicalDevices); + copy_info(&info, "\tMax Active Commands : %d\n", + ha->max_cmds); + copy_info(&info, "\tCurrent Queued Commands : %d\n", + ha->scb_waitlist.count); + copy_info(&info, "\tCurrent Active Commands : %d\n", + ha->scb_activelist.count - ha->num_ioctl); + copy_info(&info, "\tCurrent Queued PT Commands : %d\n", + ha->copp_waitlist.count); + copy_info(&info, "\tCurrent Active PT Commands : %d\n", + ha->num_ioctl); - copy_info(&info, "\n"); + copy_info(&info, "\n"); - return (info.localpos); + return (info.localpos); } /****************************************************************************/ @@ -2819,28 +2169,29 @@ /* */ /****************************************************************************/ static void -copy_mem_info(IPS_INFOSTR *info, char *data, int len) { - METHOD_TRACE("copy_mem_info", 1); +copy_mem_info(IPS_INFOSTR * info, char *data, int len) +{ + METHOD_TRACE("copy_mem_info", 1); - if (info->pos + len < info->offset) { - info->pos += len; - return; - } - - if (info->pos < info->offset) { - data += (info->offset - info->pos); - len -= (info->offset - info->pos); - info->pos += (info->offset - info->pos); - } - - if (info->localpos + len > info->length) - len = info->length - info->localpos; - - if (len > 0) { - memcpy(info->buffer + info->localpos, data, len); - info->pos += len; - info->localpos += len; - } + if (info->pos + len < info->offset) { + info->pos += len; + return; + } + + if (info->pos < info->offset) { + data += (info->offset - info->pos); + len -= (info->offset - info->pos); + info->pos += (info->offset - info->pos); + } + + if (info->localpos + len > info->length) + len = info->length - info->localpos; + + if (len > 0) { + memcpy(info->buffer + info->localpos, data, len); + info->pos += len; + info->localpos += len; + } } /****************************************************************************/ @@ -2853,20 +2204,21 @@ /* */ /****************************************************************************/ static int -copy_info(IPS_INFOSTR *info, char *fmt, ...) { - va_list args; - char buf[128]; - int len; +copy_info(IPS_INFOSTR * info, char *fmt, ...) +{ + va_list args; + char buf[128]; + int len; - METHOD_TRACE("copy_info", 1); + METHOD_TRACE("copy_info", 1); - va_start(args, fmt); - len = vsprintf(buf, fmt, args); - va_end(args); + va_start(args, fmt); + len = vsprintf(buf, fmt, args); + va_end(args); - copy_mem_info(info, buf, len); + copy_mem_info(info, buf, len); - return (len); + return (len); } /****************************************************************************/ @@ -2879,71 +2231,73 @@ /* */ /****************************************************************************/ static void -ips_identify_controller(ips_ha_t *ha) { - METHOD_TRACE("ips_identify_controller", 1); +ips_identify_controller(ips_ha_t * ha) +{ + METHOD_TRACE("ips_identify_controller", 1); - switch (ha->device_id) { - case IPS_DEVICEID_COPPERHEAD: - if (ha->revision_id <= IPS_REVID_SERVERAID) { - ha->ad_type = IPS_ADTYPE_SERVERAID; - } else if (ha->revision_id == IPS_REVID_SERVERAID2) { - ha->ad_type = IPS_ADTYPE_SERVERAID2; - } else if (ha->revision_id == IPS_REVID_NAVAJO) { - ha->ad_type = IPS_ADTYPE_NAVAJO; - } else if ((ha->revision_id == IPS_REVID_SERVERAID2) && (ha->slot_num == 0)) { - ha->ad_type = IPS_ADTYPE_KIOWA; - } else if ((ha->revision_id >= IPS_REVID_CLARINETP1) && - (ha->revision_id <= IPS_REVID_CLARINETP3)) { - if (ha->enq->ucMaxPhysicalDevices == 15) - ha->ad_type = IPS_ADTYPE_SERVERAID3L; - else - ha->ad_type = IPS_ADTYPE_SERVERAID3; - } else if ((ha->revision_id >= IPS_REVID_TROMBONE32) && - (ha->revision_id <= IPS_REVID_TROMBONE64)) { - ha->ad_type = IPS_ADTYPE_SERVERAID4H; - } - break; - - case IPS_DEVICEID_MORPHEUS: - switch (ha->subdevice_id) { - case IPS_SUBDEVICEID_4L: - ha->ad_type = IPS_ADTYPE_SERVERAID4L; - break; - - case IPS_SUBDEVICEID_4M: - ha->ad_type = IPS_ADTYPE_SERVERAID4M; - break; - - case IPS_SUBDEVICEID_4MX: - ha->ad_type = IPS_ADTYPE_SERVERAID4MX; - break; - - case IPS_SUBDEVICEID_4LX: - ha->ad_type = IPS_ADTYPE_SERVERAID4LX; - break; - - case IPS_SUBDEVICEID_5I2: - ha->ad_type = IPS_ADTYPE_SERVERAID5I2; - break; - - case IPS_SUBDEVICEID_5I1: - ha->ad_type = IPS_ADTYPE_SERVERAID5I1; - break; - } - - break; - - case IPS_DEVICEID_MARCO: - switch (ha->subdevice_id) { - case IPS_SUBDEVICEID_6M: - ha->ad_type = IPS_ADTYPE_SERVERAID6M; - break; - case IPS_SUBDEVICEID_6I: - ha->ad_type = IPS_ADTYPE_SERVERAID6I; - break; - } - break; - } + switch (ha->device_id) { + case IPS_DEVICEID_COPPERHEAD: + if (ha->revision_id <= IPS_REVID_SERVERAID) { + ha->ad_type = IPS_ADTYPE_SERVERAID; + } else if (ha->revision_id == IPS_REVID_SERVERAID2) { + ha->ad_type = IPS_ADTYPE_SERVERAID2; + } else if (ha->revision_id == IPS_REVID_NAVAJO) { + ha->ad_type = IPS_ADTYPE_NAVAJO; + } else if ((ha->revision_id == IPS_REVID_SERVERAID2) + && (ha->slot_num == 0)) { + ha->ad_type = IPS_ADTYPE_KIOWA; + } else if ((ha->revision_id >= IPS_REVID_CLARINETP1) && + (ha->revision_id <= IPS_REVID_CLARINETP3)) { + if (ha->enq->ucMaxPhysicalDevices == 15) + ha->ad_type = IPS_ADTYPE_SERVERAID3L; + else + ha->ad_type = IPS_ADTYPE_SERVERAID3; + } else if ((ha->revision_id >= IPS_REVID_TROMBONE32) && + (ha->revision_id <= IPS_REVID_TROMBONE64)) { + ha->ad_type = IPS_ADTYPE_SERVERAID4H; + } + break; + + case IPS_DEVICEID_MORPHEUS: + switch (ha->subdevice_id) { + case IPS_SUBDEVICEID_4L: + ha->ad_type = IPS_ADTYPE_SERVERAID4L; + break; + + case IPS_SUBDEVICEID_4M: + ha->ad_type = IPS_ADTYPE_SERVERAID4M; + break; + + case IPS_SUBDEVICEID_4MX: + ha->ad_type = IPS_ADTYPE_SERVERAID4MX; + break; + + case IPS_SUBDEVICEID_4LX: + ha->ad_type = IPS_ADTYPE_SERVERAID4LX; + break; + + case IPS_SUBDEVICEID_5I2: + ha->ad_type = IPS_ADTYPE_SERVERAID5I2; + break; + + case IPS_SUBDEVICEID_5I1: + ha->ad_type = IPS_ADTYPE_SERVERAID5I1; + break; + } + + break; + + case IPS_DEVICEID_MARCO: + switch (ha->subdevice_id) { + case IPS_SUBDEVICEID_6M: + ha->ad_type = IPS_ADTYPE_SERVERAID6M; + break; + case IPS_SUBDEVICEID_6I: + ha->ad_type = IPS_ADTYPE_SERVERAID6I; + break; + } + break; + } } /****************************************************************************/ @@ -2956,158 +2310,164 @@ /* */ /****************************************************************************/ static void -ips_get_bios_version(ips_ha_t *ha, int intr) { - ips_scb_t *scb; - int ret; - uint8_t major; - uint8_t minor; - uint8_t subminor; - uint8_t *buffer; - char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; - - METHOD_TRACE("ips_get_bios_version", 1); - - major = 0; - minor = 0; - - strncpy(ha->bios_version, " ?", 8); - - if (ha->device_id == IPS_DEVICEID_COPPERHEAD) { - if (IPS_USE_MEMIO(ha)) { - /* Memory Mapped I/O */ - - /* test 1st byte */ - writel(0, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55) - return; - - writel(1, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA) - return; - - /* Get Major version */ - writel(0x1FF, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - major = readb(ha->mem_ptr + IPS_REG_FLDP); - - /* Get Minor version */ - writel(0x1FE, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - minor = readb(ha->mem_ptr + IPS_REG_FLDP); - - /* Get SubMinor version */ - writel(0x1FD, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - subminor = readb(ha->mem_ptr + IPS_REG_FLDP); - - } else { - /* Programmed I/O */ - - /* test 1st byte */ - outl(0, ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55) - return ; - - outl(cpu_to_le32(1), ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA) - return ; - - /* Get Major version */ - outl(cpu_to_le32(0x1FF), ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - major = inb(ha->io_addr + IPS_REG_FLDP); - - /* Get Minor version */ - outl(cpu_to_le32(0x1FE), ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - minor = inb(ha->io_addr + IPS_REG_FLDP); - - /* Get SubMinor version */ - outl(cpu_to_le32(0x1FD), ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - subminor = inb(ha->io_addr + IPS_REG_FLDP); - - } - } else { - /* Morpheus Family - Send Command to the card */ - - buffer = kmalloc(0x1000, GFP_ATOMIC); - if (!buffer) - return; - - memset(buffer, 0, 0x1000); - - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_RW_BIOSFW; - - scb->cmd.flashfw.op_code = IPS_CMD_RW_BIOSFW; - scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.flashfw.type = 1; - scb->cmd.flashfw.direction = 0; - scb->cmd.flashfw.count = cpu_to_le32(0x800); - scb->cmd.flashfw.total_packets = 1; - scb->cmd.flashfw.packet_num = 0; - scb->data_len = 0x1000; - scb->data_busaddr = pci_map_single(ha->pcidev, buffer, scb->data_len, - IPS_DMA_DIR(scb)); - scb->cmd.flashfw.buffer_addr = scb->data_busaddr; - scb->flags |= IPS_SCB_MAP_SINGLE; - - /* issue the command */ - if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) || - (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) { - /* Error occurred */ - kfree(buffer); - - return; - } - - if ((buffer[0xC0] == 0x55) && (buffer[0xC1] == 0xAA)) { - major = buffer[0x1ff + 0xC0]; /* Offset 0x1ff after the header (0xc0) */ - minor = buffer[0x1fe + 0xC0]; /* Offset 0x1fe after the header (0xc0) */ - subminor = buffer[0x1fd + 0xC0]; /* Offset 0x1fd after the header (0xc0) */ - } else { - return; - } - - kfree(buffer); - } - - ha->bios_version[0] = hexDigits[(major & 0xF0) >> 4]; - ha->bios_version[1] = '.'; - ha->bios_version[2] = hexDigits[major & 0x0F]; - ha->bios_version[3] = hexDigits[subminor]; - ha->bios_version[4] = '.'; - ha->bios_version[5] = hexDigits[(minor & 0xF0) >> 4]; - ha->bios_version[6] = hexDigits[minor & 0x0F]; - ha->bios_version[7] = 0; +ips_get_bios_version(ips_ha_t * ha, int intr) +{ + ips_scb_t *scb; + int ret; + uint8_t major; + uint8_t minor; + uint8_t subminor; + uint8_t *buffer; + char hexDigits[] = + { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', + 'D', 'E', 'F' }; + + METHOD_TRACE("ips_get_bios_version", 1); + + major = 0; + minor = 0; + + strncpy(ha->bios_version, " ?", 8); + + if (ha->device_id == IPS_DEVICEID_COPPERHEAD) { + if (IPS_USE_MEMIO(ha)) { + /* Memory Mapped I/O */ + + /* test 1st byte */ + writel(0, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55) + return; + + writel(1, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA) + return; + + /* Get Major version */ + writel(0x1FF, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + major = readb(ha->mem_ptr + IPS_REG_FLDP); + + /* Get Minor version */ + writel(0x1FE, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + minor = readb(ha->mem_ptr + IPS_REG_FLDP); + + /* Get SubMinor version */ + writel(0x1FD, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + subminor = readb(ha->mem_ptr + IPS_REG_FLDP); + + } else { + /* Programmed I/O */ + + /* test 1st byte */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55) + return; + + outl(cpu_to_le32(1), ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA) + return; + + /* Get Major version */ + outl(cpu_to_le32(0x1FF), ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + major = inb(ha->io_addr + IPS_REG_FLDP); + + /* Get Minor version */ + outl(cpu_to_le32(0x1FE), ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + minor = inb(ha->io_addr + IPS_REG_FLDP); + + /* Get SubMinor version */ + outl(cpu_to_le32(0x1FD), ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + subminor = inb(ha->io_addr + IPS_REG_FLDP); + + } + } else { + /* Morpheus Family - Send Command to the card */ + + buffer = kmalloc(0x1000, IPS_ATOMIC_GFP); + if (!buffer) + return; + + memset(buffer, 0, 0x1000); + + scb = &ha->scbs[ha->max_cmds - 1]; + + ips_init_scb(ha, scb); + + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_RW_BIOSFW; + + scb->cmd.flashfw.op_code = IPS_CMD_RW_BIOSFW; + scb->cmd.flashfw.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.flashfw.type = 1; + scb->cmd.flashfw.direction = 0; + scb->cmd.flashfw.count = cpu_to_le32(0x800); + scb->cmd.flashfw.total_packets = 1; + scb->cmd.flashfw.packet_num = 0; + scb->data_len = 0x1000; + scb->data_busaddr = + pci_map_single(ha->pcidev, buffer, scb->data_len, + IPS_DMA_DIR(scb)); + scb->cmd.flashfw.buffer_addr = scb->data_busaddr; + scb->flags |= IPS_SCB_MAP_SINGLE; + + /* issue the command */ + if ( + ((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == + IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) + || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) { + /* Error occurred */ + kfree(buffer); + + return; + } + + if ((buffer[0xC0] == 0x55) && (buffer[0xC1] == 0xAA)) { + major = buffer[0x1ff + 0xC0]; /* Offset 0x1ff after the header (0xc0) */ + minor = buffer[0x1fe + 0xC0]; /* Offset 0x1fe after the header (0xc0) */ + subminor = buffer[0x1fd + 0xC0]; /* Offset 0x1fd after the header (0xc0) */ + } else { + kfree(buffer); + return; + } + + kfree(buffer); + } + + ha->bios_version[0] = hexDigits[(major & 0xF0) >> 4]; + ha->bios_version[1] = '.'; + ha->bios_version[2] = hexDigits[major & 0x0F]; + ha->bios_version[3] = hexDigits[subminor]; + ha->bios_version[4] = '.'; + ha->bios_version[5] = hexDigits[(minor & 0xF0) >> 4]; + ha->bios_version[6] = hexDigits[minor & 0x0F]; + ha->bios_version[7] = 0; } /****************************************************************************/ @@ -3122,129 +2482,134 @@ /* */ /****************************************************************************/ static int -ips_hainit(ips_ha_t *ha) { - int i; - struct timeval tv; - - METHOD_TRACE("ips_hainit", 1); - - if (!ha) - return (0); - - if (ha->func.statinit) - (*ha->func.statinit)(ha); - - if (ha->func.enableint) - (*ha->func.enableint)(ha); - - /* Send FFDC */ - ha->reset_count = 1; - do_gettimeofday(&tv); - ha->last_ffdc = tv.tv_sec; - ips_ffdc_reset(ha, IPS_INTR_IORL); - - if (!ips_read_config(ha, IPS_INTR_IORL)) { - printk(KERN_WARNING "(%s%d) unable to read config from controller.\n", - ips_name, ha->host_num); - - return (0); - } /* end if */ - - if (!ips_read_adapter_status(ha, IPS_INTR_IORL)) { - printk(KERN_WARNING "(%s%d) unable to read controller status.\n", - ips_name, ha->host_num); - - return (0); - } - - /* Identify this controller */ - ips_identify_controller(ha); - - if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) { - printk(KERN_WARNING "(%s%d) unable to read subsystem parameters.\n", - ips_name, ha->host_num); - - return (0); - } - - /* write nvram user page 5 */ - if (!ips_write_driver_status(ha, IPS_INTR_IORL)) { - printk(KERN_WARNING "(%s%d) unable to write driver info to controller.\n", - ips_name, ha->host_num); - - return (0); - } - - /* If there are Logical Drives and a Reset Occurred, then an EraseStripeLock is Needed */ - if ( (ha->conf->ucLogDriveCount > 0) && (ha->requires_esl == 1) ) - ips_clear_adapter(ha, IPS_INTR_IORL); - - /* set limits on SID, LUN, BUS */ - ha->ntargets = IPS_MAX_TARGETS + 1; - ha->nlun = 1; - ha->nbus = (ha->enq->ucMaxPhysicalDevices / IPS_MAX_TARGETS) + 1; - - switch (ha->conf->logical_drive[0].ucStripeSize) { - case 4: - ha->max_xfer = 0x10000; - break; - - case 5: - ha->max_xfer = 0x20000; - break; - - case 6: - ha->max_xfer = 0x40000; - break; - - case 7: - default: - ha->max_xfer = 0x80000; - break; - } - - /* setup max concurrent commands */ - if (le32_to_cpu(ha->subsys->param[4]) & 0x1) { - /* Use the new method */ - ha->max_cmds = ha->enq->ucConcurrentCmdCount; - } else { - /* use the old method */ - switch (ha->conf->logical_drive[0].ucStripeSize) { - case 4: - ha->max_cmds = 32; - break; - - case 5: - ha->max_cmds = 16; - break; - - case 6: - ha->max_cmds = 8; - break; - - case 7: - default: - ha->max_cmds = 4; - break; - } - } - - /* Limit the Active Commands on a Lite Adapter */ - if ((ha->ad_type == IPS_ADTYPE_SERVERAID3L) || - (ha->ad_type == IPS_ADTYPE_SERVERAID4L) || - (ha->ad_type == IPS_ADTYPE_SERVERAID4LX)) { - if ((ha->max_cmds > MaxLiteCmds) && (MaxLiteCmds)) - ha->max_cmds = MaxLiteCmds; - } - - /* set controller IDs */ - ha->ha_id[0] = IPS_ADAPTER_ID; - for (i = 1; i < ha->nbus; i++) { - ha->ha_id[i] = ha->conf->init_id[i-1] & 0x1f; - ha->dcdb_active[i-1] = 0; - } +ips_hainit(ips_ha_t * ha) +{ + int i; + struct timeval tv; + + METHOD_TRACE("ips_hainit", 1); - return (1); + if (!ha) + return (0); + + if (ha->func.statinit) + (*ha->func.statinit) (ha); + + if (ha->func.enableint) + (*ha->func.enableint) (ha); + + /* Send FFDC */ + ha->reset_count = 1; + do_gettimeofday(&tv); + ha->last_ffdc = tv.tv_sec; + ips_ffdc_reset(ha, IPS_INTR_IORL); + + if (!ips_read_config(ha, IPS_INTR_IORL)) { + printk(KERN_WARNING + "(%s%d) unable to read config from controller.\n", + ips_name, ha->host_num); + + return (0); + } + /* end if */ + if (!ips_read_adapter_status(ha, IPS_INTR_IORL)) { + printk(KERN_WARNING + "(%s%d) unable to read controller status.\n", ips_name, + ha->host_num); + + return (0); + } + + /* Identify this controller */ + ips_identify_controller(ha); + + if (!ips_read_subsystem_parameters(ha, IPS_INTR_IORL)) { + printk(KERN_WARNING + "(%s%d) unable to read subsystem parameters.\n", + ips_name, ha->host_num); + + return (0); + } + + /* write nvram user page 5 */ + if (!ips_write_driver_status(ha, IPS_INTR_IORL)) { + printk(KERN_WARNING + "(%s%d) unable to write driver info to controller.\n", + ips_name, ha->host_num); + + return (0); + } + + /* If there are Logical Drives and a Reset Occurred, then an EraseStripeLock is Needed */ + if ((ha->conf->ucLogDriveCount > 0) && (ha->requires_esl == 1)) + ips_clear_adapter(ha, IPS_INTR_IORL); + + /* set limits on SID, LUN, BUS */ + ha->ntargets = IPS_MAX_TARGETS + 1; + ha->nlun = 1; + ha->nbus = (ha->enq->ucMaxPhysicalDevices / IPS_MAX_TARGETS) + 1; + + switch (ha->conf->logical_drive[0].ucStripeSize) { + case 4: + ha->max_xfer = 0x10000; + break; + + case 5: + ha->max_xfer = 0x20000; + break; + + case 6: + ha->max_xfer = 0x40000; + break; + + case 7: + default: + ha->max_xfer = 0x80000; + break; + } + + /* setup max concurrent commands */ + if (le32_to_cpu(ha->subsys->param[4]) & 0x1) { + /* Use the new method */ + ha->max_cmds = ha->enq->ucConcurrentCmdCount; + } else { + /* use the old method */ + switch (ha->conf->logical_drive[0].ucStripeSize) { + case 4: + ha->max_cmds = 32; + break; + + case 5: + ha->max_cmds = 16; + break; + + case 6: + ha->max_cmds = 8; + break; + + case 7: + default: + ha->max_cmds = 4; + break; + } + } + + /* Limit the Active Commands on a Lite Adapter */ + if ((ha->ad_type == IPS_ADTYPE_SERVERAID3L) || + (ha->ad_type == IPS_ADTYPE_SERVERAID4L) || + (ha->ad_type == IPS_ADTYPE_SERVERAID4LX)) { + if ((ha->max_cmds > MaxLiteCmds) && (MaxLiteCmds)) + ha->max_cmds = MaxLiteCmds; + } + + /* set controller IDs */ + ha->ha_id[0] = IPS_ADAPTER_ID; + for (i = 1; i < ha->nbus; i++) { + ha->ha_id[i] = ha->conf->init_id[i - 1] & 0x1f; + ha->dcdb_active[i - 1] = 0; + } + + return (1); } /****************************************************************************/ @@ -3257,275 +2622,238 @@ /* */ /****************************************************************************/ static void -ips_next(ips_ha_t *ha, int intr) { - ips_scb_t *scb; - Scsi_Cmnd *SC; - Scsi_Cmnd *p; - Scsi_Cmnd *q; - ips_copp_wait_item_t *item; - int ret; - unsigned long cpu_flags = 0; - struct Scsi_Host *host; - METHOD_TRACE("ips_next", 1); - - if (!ha) - return ; - host = ips_sh[ha->host_num]; - /* - * Block access to the queue function so - * this command won't time out - */ - if(intr == IPS_INTR_ON) - IPS_LOCK_SAVE(host->host_lock, cpu_flags); - - if ((ha->subsys->param[3] & 0x300000) && ( ha->scb_activelist.count == 0 )) { - struct timeval tv; - - do_gettimeofday(&tv); - - if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) { - ha->last_ffdc = tv.tv_sec; - ips_ffdc_time(ha); - } - } - - /* - * Send passthru commands - * These have priority over normal I/O - * but shouldn't affect performance too much - * since we limit the number that can be active - * on the card at any one time - */ - while ((ha->num_ioctl < IPS_MAX_IOCTL) && - (ha->copp_waitlist.head) && - (scb = ips_getscb(ha))) { - - item = ips_removeq_copp_head(&ha->copp_waitlist); - ha->num_ioctl++; - if(intr == IPS_INTR_ON) - IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); - scb->scsi_cmd = item->scsi_cmd; - kfree(item); - - ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr); - - if(intr == IPS_INTR_ON) - IPS_LOCK_SAVE(host->host_lock, cpu_flags); - switch (ret) { - case IPS_FAILURE: - if (scb->scsi_cmd) { - scb->scsi_cmd->result = DID_ERROR << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - } - - ips_freescb(ha, scb); - break; - case IPS_SUCCESS_IMM: - if (scb->scsi_cmd) { - scb->scsi_cmd->result = DID_OK << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - } - - ips_freescb(ha, scb); - break; - default: - break; - } /* end case */ - - if (ret != IPS_SUCCESS) { - ha->num_ioctl--; - continue; - } - - ret = ips_send_cmd(ha, scb); - - if (ret == IPS_SUCCESS) - ips_putq_scb_head(&ha->scb_activelist, scb); - else - ha->num_ioctl--; - - switch(ret) { - case IPS_FAILURE: - if (scb->scsi_cmd) { - scb->scsi_cmd->result = DID_ERROR << 16; - } - - ips_freescb(ha, scb); - break; - case IPS_SUCCESS_IMM: - ips_freescb(ha, scb); - break; - default: - break; - } /* end case */ - - } - - - /* - * Send "Normal" I/O commands - */ - - p = ha->scb_waitlist.head; - while ((p) && (scb = ips_getscb(ha))) { - if ((p->channel > 0) && (ha->dcdb_active[p->channel-1] & (1 << p->target))) { - ips_freescb(ha, scb); - p = (Scsi_Cmnd *) p->host_scribble; - continue; - } - - q = p; - SC = ips_removeq_wait(&ha->scb_waitlist, q); - - if(intr == IPS_INTR_ON) - IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); /* Unlock HA after command is taken off queue */ - - SC->result = DID_OK; - SC->host_scribble = NULL; - - memset(SC->sense_buffer, 0, sizeof(SC->sense_buffer)); - - scb->target_id = SC->target; - scb->lun = SC->lun; - scb->bus = SC->channel; - scb->scsi_cmd = SC; - scb->breakup = 0; - scb->data_len = 0; - scb->callback = ipsintr_done; - scb->timeout = ips_cmd_timeout; - memset(&scb->cmd, 0, 16); - - /* copy in the CDB */ - memcpy(scb->cdb, SC->cmnd, SC->cmd_len); - - /* Now handle the data buffer */ - if (SC->use_sg) { - struct scatterlist *sg; - int i; - - sg = SC->request_buffer; - scb->sg_count = pci_map_sg(ha->pcidev, sg, SC->use_sg, - scsi_to_pci_dma_dir(SC->sc_data_direction)); - scb->flags |= IPS_SCB_MAP_SG; - if (scb->sg_count == 1) { - if (sg_dma_len(sg) > ha->max_xfer) { - scb->breakup = 1; - scb->data_len = ha->max_xfer; - } else - scb->data_len = sg_dma_len(sg); - - scb->dcdb.transfer_length = scb->data_len; - scb->data_busaddr = sg_dma_address(sg); - scb->sg_len = 0; - } else { - /* Check for the first Element being bigger than MAX_XFER */ - if (sg_dma_len(&sg[0]) > ha->max_xfer) { - scb->sg_list[0].address = cpu_to_le32(sg_dma_address(&sg[0])); - scb->sg_list[0].length = ha->max_xfer; - scb->data_len = ha->max_xfer; - scb->breakup = 0; - scb->sg_break=1; - scb->sg_len = 1; - } else { - for (i = 0; i < scb->sg_count; i++) { - scb->sg_list[i].address = cpu_to_le32(sg_dma_address(&sg[i])); - scb->sg_list[i].length = cpu_to_le32(sg_dma_len(&sg[i])); - - if (scb->data_len + sg_dma_len(&sg[i]) > ha->max_xfer) { - /* - * Data Breakup required - */ - scb->breakup = i; - break; - } - - scb->data_len += sg_dma_len(&sg[i]); - } - - if (!scb->breakup) - scb->sg_len = scb->sg_count; - else - scb->sg_len = scb->breakup; - } - - scb->dcdb.transfer_length = scb->data_len; - scb->data_busaddr = scb->sg_busaddr; - } - } else { - if (SC->request_bufflen) { - if (SC->request_bufflen > ha->max_xfer) { - /* - * Data breakup required - */ - scb->breakup = 1; - scb->data_len = ha->max_xfer; - } else { - scb->data_len = SC->request_bufflen; - } - - scb->dcdb.transfer_length = scb->data_len; - scb->data_busaddr = pci_map_single(ha->pcidev, SC->request_buffer, - scb->data_len, - scsi_to_pci_dma_dir(SC->sc_data_direction)); - scb->flags |= IPS_SCB_MAP_SINGLE; - scb->sg_len = 0; - } else { - scb->data_busaddr = 0L; - scb->sg_len = 0; - scb->data_len = 0; - scb->dcdb.transfer_length = 0; - } - - } - - scb->dcdb.cmd_attribute = ips_command_direction[scb->scsi_cmd->cmnd[0]]; - - if (!scb->dcdb.cmd_attribute & 0x3) - scb->dcdb.transfer_length = 0; - - if (scb->data_len >= IPS_MAX_XFER) { - scb->dcdb.cmd_attribute |= IPS_TRANSFER64K; - scb->dcdb.transfer_length = 0; - } - if(intr == IPS_INTR_ON) - IPS_LOCK_SAVE(host->host_lock, cpu_flags); - - ret = ips_send_cmd(ha, scb); - - switch(ret) { - case IPS_SUCCESS: - ips_putq_scb_head(&ha->scb_activelist, scb); - break; - case IPS_FAILURE: - if (scb->scsi_cmd) { - scb->scsi_cmd->result = DID_ERROR << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - } - - if (scb->bus) - ha->dcdb_active[scb->bus-1] &= ~(1 << scb->target_id); - - ips_freescb(ha, scb); - break; - case IPS_SUCCESS_IMM: - if (scb->scsi_cmd) - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - - if (scb->bus) - ha->dcdb_active[scb->bus-1] &= ~(1 << scb->target_id); - - ips_freescb(ha, scb); - break; - default: - break; - } /* end case */ +ips_next(ips_ha_t * ha, int intr) +{ + ips_scb_t *scb; + Scsi_Cmnd *SC; + Scsi_Cmnd *p; + Scsi_Cmnd *q; + ips_copp_wait_item_t *item; + int ret; + unsigned long cpu_flags = 0; + struct Scsi_Host *host; + METHOD_TRACE("ips_next", 1); + + if (!ha) + return; + host = ips_sh[ha->host_num]; + /* + * Block access to the queue function so + * this command won't time out + */ + if (intr == IPS_INTR_ON) + IPS_LOCK_SAVE(host->host_lock, cpu_flags); + + if ((ha->subsys->param[3] & 0x300000) + && (ha->scb_activelist.count == 0)) { + struct timeval tv; + + do_gettimeofday(&tv); + + if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) { + ha->last_ffdc = tv.tv_sec; + ips_ffdc_time(ha); + } + } + + /* + * Send passthru commands + * These have priority over normal I/O + * but shouldn't affect performance too much + * since we limit the number that can be active + * on the card at any one time + */ + while ((ha->num_ioctl < IPS_MAX_IOCTL) && + (ha->copp_waitlist.head) && (scb = ips_getscb(ha))) { + + item = ips_removeq_copp_head(&ha->copp_waitlist); + ha->num_ioctl++; + if (intr == IPS_INTR_ON) + IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); + scb->scsi_cmd = item->scsi_cmd; + kfree(item); + + ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr); + + if (intr == IPS_INTR_ON) + IPS_LOCK_SAVE(host->host_lock, cpu_flags); + switch (ret) { + case IPS_FAILURE: + if (scb->scsi_cmd) { + scb->scsi_cmd->result = DID_ERROR << 16; + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + } + + ips_freescb(ha, scb); + break; + case IPS_SUCCESS_IMM: + if (scb->scsi_cmd) { + scb->scsi_cmd->result = DID_OK << 16; + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + } + + ips_freescb(ha, scb); + break; + default: + break; + } /* end case */ + + if (ret != IPS_SUCCESS) { + ha->num_ioctl--; + continue; + } + + ret = ips_send_cmd(ha, scb); + + if (ret == IPS_SUCCESS) + ips_putq_scb_head(&ha->scb_activelist, scb); + else + ha->num_ioctl--; + + switch (ret) { + case IPS_FAILURE: + if (scb->scsi_cmd) { + scb->scsi_cmd->result = DID_ERROR << 16; + } + + ips_freescb(ha, scb); + break; + case IPS_SUCCESS_IMM: + ips_freescb(ha, scb); + break; + default: + break; + } /* end case */ + + } + + /* + * Send "Normal" I/O commands + */ + + p = ha->scb_waitlist.head; + while ((p) && (scb = ips_getscb(ha))) { + if ((p->channel > 0) + && (ha->dcdb_active[p->channel - 1] & (1 << p->target))) { + ips_freescb(ha, scb); + p = (Scsi_Cmnd *) p->host_scribble; + continue; + } + + q = p; + SC = ips_removeq_wait(&ha->scb_waitlist, q); + + if (intr == IPS_INTR_ON) + IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); /* Unlock HA after command is taken off queue */ + + SC->result = DID_OK; + SC->host_scribble = NULL; + + memset(SC->sense_buffer, 0, sizeof (SC->sense_buffer)); + + scb->target_id = SC->target; + scb->lun = SC->lun; + scb->bus = SC->channel; + scb->scsi_cmd = SC; + scb->breakup = 0; + scb->data_len = 0; + scb->callback = ipsintr_done; + scb->timeout = ips_cmd_timeout; + memset(&scb->cmd, 0, 16); + + /* copy in the CDB */ + memcpy(scb->cdb, SC->cmnd, SC->cmd_len); + + /* Now handle the data buffer */ + if (SC->use_sg) { + struct scatterlist *sg; + int i; + + sg = SC->request_buffer; + scb->sg_count = pci_map_sg(ha->pcidev, sg, SC->use_sg, + scsi_to_pci_dma_dir(SC-> + sc_data_direction)); + scb->flags |= IPS_SCB_MAP_SG; + for (i = 0; i < scb->sg_count; i++) { + if (ips_fill_scb_sg_single + (ha, sg_dma_address(&sg[i]), scb, i, + sg_dma_len(&sg[i])) < 0) + break; + } + scb->dcdb.transfer_length = scb->data_len; + } else { + if (SC->request_bufflen) { + scb->data_busaddr = + pci_map_single(ha->pcidev, + SC->request_buffer, + SC->request_bufflen, + scsi_to_pci_dma_dir(SC-> + sc_data_direction)); + scb->flags |= IPS_SCB_MAP_SINGLE; + ips_fill_scb_sg_single(ha, scb->data_busaddr, + scb, 0, + SC->request_bufflen); + scb->dcdb.transfer_length = scb->data_len; + } else { + scb->data_busaddr = 0L; + scb->sg_len = 0; + scb->data_len = 0; + scb->dcdb.transfer_length = 0; + } + + } + + scb->dcdb.cmd_attribute = + ips_command_direction[scb->scsi_cmd->cmnd[0]]; + + if (!(scb->dcdb.cmd_attribute & 0x3)) + scb->dcdb.transfer_length = 0; + + if (scb->data_len >= IPS_MAX_XFER) { + scb->dcdb.cmd_attribute |= IPS_TRANSFER64K; + scb->dcdb.transfer_length = 0; + } + if (intr == IPS_INTR_ON) + IPS_LOCK_SAVE(host->host_lock, cpu_flags); + + ret = ips_send_cmd(ha, scb); + + switch (ret) { + case IPS_SUCCESS: + ips_putq_scb_head(&ha->scb_activelist, scb); + break; + case IPS_FAILURE: + if (scb->scsi_cmd) { + scb->scsi_cmd->result = DID_ERROR << 16; + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + } + + if (scb->bus) + ha->dcdb_active[scb->bus - 1] &= + ~(1 << scb->target_id); + + ips_freescb(ha, scb); + break; + case IPS_SUCCESS_IMM: + if (scb->scsi_cmd) + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + + if (scb->bus) + ha->dcdb_active[scb->bus - 1] &= + ~(1 << scb->target_id); + + ips_freescb(ha, scb); + break; + default: + break; + } /* end case */ - p = (Scsi_Cmnd *) p->host_scribble; + p = (Scsi_Cmnd *) p->host_scribble; - } /* end while */ + } /* end while */ - if(intr == IPS_INTR_ON) - IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); + if (intr == IPS_INTR_ON) + IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags); } /****************************************************************************/ @@ -3540,19 +2868,20 @@ /* */ /****************************************************************************/ static inline void -ips_putq_scb_head(ips_scb_queue_t *queue, ips_scb_t *item) { - METHOD_TRACE("ips_putq_scb_head", 1); +ips_putq_scb_head(ips_scb_queue_t * queue, ips_scb_t * item) +{ + METHOD_TRACE("ips_putq_scb_head", 1); - if (!item) - return ; + if (!item) + return; - item->q_next = queue->head; - queue->head = item; + item->q_next = queue->head; + queue->head = item; - if (!queue->tail) - queue->tail = item; + if (!queue->tail) + queue->tail = item; - queue->count++; + queue->count++; } /****************************************************************************/ @@ -3567,23 +2896,24 @@ /* */ /****************************************************************************/ static inline void -ips_putq_scb_tail(ips_scb_queue_t *queue, ips_scb_t *item) { - METHOD_TRACE("ips_putq_scb_tail", 1); +ips_putq_scb_tail(ips_scb_queue_t * queue, ips_scb_t * item) +{ + METHOD_TRACE("ips_putq_scb_tail", 1); - if (!item) - return ; + if (!item) + return; - item->q_next = NULL; + item->q_next = NULL; - if (queue->tail) - queue->tail->q_next = item; + if (queue->tail) + queue->tail->q_next = item; - queue->tail = item; + queue->tail = item; - if (!queue->head) - queue->head = item; + if (!queue->head) + queue->head = item; - queue->count++; + queue->count++; } /****************************************************************************/ @@ -3598,26 +2928,27 @@ /* */ /****************************************************************************/ static inline ips_scb_t * -ips_removeq_scb_head(ips_scb_queue_t *queue) { - ips_scb_t *item; +ips_removeq_scb_head(ips_scb_queue_t * queue) +{ + ips_scb_t *item; - METHOD_TRACE("ips_removeq_scb_head", 1); + METHOD_TRACE("ips_removeq_scb_head", 1); - item = queue->head; + item = queue->head; - if (!item) { - return (NULL); - } + if (!item) { + return (NULL); + } - queue->head = item->q_next; - item->q_next = NULL; + queue->head = item->q_next; + item->q_next = NULL; - if (queue->tail == item) - queue->tail = NULL; + if (queue->tail == item) + queue->tail = NULL; - queue->count--; + queue->count--; - return (item); + return (item); } /****************************************************************************/ @@ -3632,37 +2963,38 @@ /* */ /****************************************************************************/ static inline ips_scb_t * -ips_removeq_scb(ips_scb_queue_t *queue, ips_scb_t *item) { - ips_scb_t *p; +ips_removeq_scb(ips_scb_queue_t * queue, ips_scb_t * item) +{ + ips_scb_t *p; - METHOD_TRACE("ips_removeq_scb", 1); + METHOD_TRACE("ips_removeq_scb", 1); - if (!item) - return (NULL); + if (!item) + return (NULL); - if (item == queue->head) { - return (ips_removeq_scb_head(queue)); - } + if (item == queue->head) { + return (ips_removeq_scb_head(queue)); + } - p = queue->head; + p = queue->head; - while ((p) && (item != p->q_next)) - p = p->q_next; + while ((p) && (item != p->q_next)) + p = p->q_next; - if (p) { - /* found a match */ - p->q_next = item->q_next; + if (p) { + /* found a match */ + p->q_next = item->q_next; - if (!item->q_next) - queue->tail = p; + if (!item->q_next) + queue->tail = p; - item->q_next = NULL; - queue->count--; + item->q_next = NULL; + queue->count--; - return (item); - } + return (item); + } - return (NULL); + return (NULL); } /****************************************************************************/ @@ -3677,19 +3009,20 @@ /* */ /****************************************************************************/ static inline void -ips_putq_wait_head(ips_wait_queue_t *queue, Scsi_Cmnd *item) { - METHOD_TRACE("ips_putq_wait_head", 1); +ips_putq_wait_head(ips_wait_queue_t * queue, Scsi_Cmnd * item) +{ + METHOD_TRACE("ips_putq_wait_head", 1); - if (!item) - return ; + if (!item) + return; - item->host_scribble = (char *) queue->head; - queue->head = item; + item->host_scribble = (char *) queue->head; + queue->head = item; - if (!queue->tail) - queue->tail = item; + if (!queue->tail) + queue->tail = item; - queue->count++; + queue->count++; } /****************************************************************************/ @@ -3704,23 +3037,24 @@ /* */ /****************************************************************************/ static inline void -ips_putq_wait_tail(ips_wait_queue_t *queue, Scsi_Cmnd *item) { - METHOD_TRACE("ips_putq_wait_tail", 1); +ips_putq_wait_tail(ips_wait_queue_t * queue, Scsi_Cmnd * item) +{ + METHOD_TRACE("ips_putq_wait_tail", 1); - if (!item) - return ; + if (!item) + return; - item->host_scribble = NULL; + item->host_scribble = NULL; - if (queue->tail) - queue->tail->host_scribble = (char *)item; + if (queue->tail) + queue->tail->host_scribble = (char *) item; - queue->tail = item; + queue->tail = item; - if (!queue->head) - queue->head = item; + if (!queue->head) + queue->head = item; - queue->count++; + queue->count++; } /****************************************************************************/ @@ -3735,26 +3069,27 @@ /* */ /****************************************************************************/ static inline Scsi_Cmnd * -ips_removeq_wait_head(ips_wait_queue_t *queue) { - Scsi_Cmnd *item; +ips_removeq_wait_head(ips_wait_queue_t * queue) +{ + Scsi_Cmnd *item; - METHOD_TRACE("ips_removeq_wait_head", 1); + METHOD_TRACE("ips_removeq_wait_head", 1); - item = queue->head; + item = queue->head; - if (!item) { - return (NULL); - } + if (!item) { + return (NULL); + } - queue->head = (Scsi_Cmnd *) item->host_scribble; - item->host_scribble = NULL; + queue->head = (Scsi_Cmnd *) item->host_scribble; + item->host_scribble = NULL; - if (queue->tail == item) - queue->tail = NULL; + if (queue->tail == item) + queue->tail = NULL; - queue->count--; + queue->count--; - return (item); + return (item); } /****************************************************************************/ @@ -3769,37 +3104,38 @@ /* */ /****************************************************************************/ static inline Scsi_Cmnd * -ips_removeq_wait(ips_wait_queue_t *queue, Scsi_Cmnd *item) { - Scsi_Cmnd *p; +ips_removeq_wait(ips_wait_queue_t * queue, Scsi_Cmnd * item) +{ + Scsi_Cmnd *p; - METHOD_TRACE("ips_removeq_wait", 1); + METHOD_TRACE("ips_removeq_wait", 1); - if (!item) - return (NULL); + if (!item) + return (NULL); - if (item == queue->head) { - return (ips_removeq_wait_head(queue)); - } + if (item == queue->head) { + return (ips_removeq_wait_head(queue)); + } - p = queue->head; + p = queue->head; - while ((p) && (item != (Scsi_Cmnd *) p->host_scribble)) - p = (Scsi_Cmnd *) p->host_scribble; + while ((p) && (item != (Scsi_Cmnd *) p->host_scribble)) + p = (Scsi_Cmnd *) p->host_scribble; - if (p) { - /* found a match */ - p->host_scribble = item->host_scribble; + if (p) { + /* found a match */ + p->host_scribble = item->host_scribble; - if (!item->host_scribble) - queue->tail = p; + if (!item->host_scribble) + queue->tail = p; - item->host_scribble = NULL; - queue->count--; + item->host_scribble = NULL; + queue->count--; - return (item); - } + return (item); + } - return (NULL); + return (NULL); } /****************************************************************************/ @@ -3814,19 +3150,20 @@ /* */ /****************************************************************************/ static inline void -ips_putq_copp_head(ips_copp_queue_t *queue, ips_copp_wait_item_t *item) { - METHOD_TRACE("ips_putq_copp_head", 1); +ips_putq_copp_head(ips_copp_queue_t * queue, ips_copp_wait_item_t * item) +{ + METHOD_TRACE("ips_putq_copp_head", 1); - if (!item) - return ; + if (!item) + return; - item->next = queue->head; - queue->head = item; + item->next = queue->head; + queue->head = item; - if (!queue->tail) - queue->tail = item; + if (!queue->tail) + queue->tail = item; - queue->count++; + queue->count++; } /****************************************************************************/ @@ -3841,23 +3178,24 @@ /* */ /****************************************************************************/ static inline void -ips_putq_copp_tail(ips_copp_queue_t *queue, ips_copp_wait_item_t *item) { - METHOD_TRACE("ips_putq_copp_tail", 1); +ips_putq_copp_tail(ips_copp_queue_t * queue, ips_copp_wait_item_t * item) +{ + METHOD_TRACE("ips_putq_copp_tail", 1); - if (!item) - return ; + if (!item) + return; - item->next = NULL; + item->next = NULL; - if (queue->tail) - queue->tail->next = item; + if (queue->tail) + queue->tail->next = item; - queue->tail = item; + queue->tail = item; - if (!queue->head) - queue->head = item; + if (!queue->head) + queue->head = item; - queue->count++; + queue->count++; } /****************************************************************************/ @@ -3872,26 +3210,27 @@ /* */ /****************************************************************************/ static inline ips_copp_wait_item_t * -ips_removeq_copp_head(ips_copp_queue_t *queue) { - ips_copp_wait_item_t *item; +ips_removeq_copp_head(ips_copp_queue_t * queue) +{ + ips_copp_wait_item_t *item; - METHOD_TRACE("ips_removeq_copp_head", 1); + METHOD_TRACE("ips_removeq_copp_head", 1); - item = queue->head; + item = queue->head; - if (!item) { - return (NULL); - } + if (!item) { + return (NULL); + } - queue->head = item->next; - item->next = NULL; + queue->head = item->next; + item->next = NULL; - if (queue->tail == item) - queue->tail = NULL; + if (queue->tail == item) + queue->tail = NULL; - queue->count--; + queue->count--; - return (item); + return (item); } /****************************************************************************/ @@ -3906,37 +3245,38 @@ /* */ /****************************************************************************/ static inline ips_copp_wait_item_t * -ips_removeq_copp(ips_copp_queue_t *queue, ips_copp_wait_item_t *item) { - ips_copp_wait_item_t *p; +ips_removeq_copp(ips_copp_queue_t * queue, ips_copp_wait_item_t * item) +{ + ips_copp_wait_item_t *p; - METHOD_TRACE("ips_removeq_copp", 1); + METHOD_TRACE("ips_removeq_copp", 1); - if (!item) - return (NULL); + if (!item) + return (NULL); - if (item == queue->head) { - return (ips_removeq_copp_head(queue)); - } + if (item == queue->head) { + return (ips_removeq_copp_head(queue)); + } - p = queue->head; + p = queue->head; - while ((p) && (item != p->next)) - p = p->next; + while ((p) && (item != p->next)) + p = p->next; - if (p) { - /* found a match */ - p->next = item->next; + if (p) { + /* found a match */ + p->next = item->next; - if (!item->next) - queue->tail = p; + if (!item->next) + queue->tail = p; - item->next = NULL; - queue->count--; + item->next = NULL; + queue->count--; - return (item); - } + return (item); + } - return (NULL); + return (NULL); } /****************************************************************************/ @@ -3949,16 +3289,16 @@ /* */ /****************************************************************************/ static void -ipsintr_blocking(ips_ha_t *ha, ips_scb_t *scb) { - METHOD_TRACE("ipsintr_blocking", 2); +ipsintr_blocking(ips_ha_t * ha, ips_scb_t * scb) +{ + METHOD_TRACE("ipsintr_blocking", 2); - ips_freescb(ha, scb); - if ((ha->waitflag == TRUE) && - (ha->cmd_in_progress == scb->cdb[0])) { - ha->waitflag = FALSE; + ips_freescb(ha, scb); + if ((ha->waitflag == TRUE) && (ha->cmd_in_progress == scb->cdb[0])) { + ha->waitflag = FALSE; - return ; - } + return; + } } /****************************************************************************/ @@ -3971,25 +3311,27 @@ /* */ /****************************************************************************/ static void -ipsintr_done(ips_ha_t *ha, ips_scb_t *scb) { - METHOD_TRACE("ipsintr_done", 2); +ipsintr_done(ips_ha_t * ha, ips_scb_t * scb) +{ + METHOD_TRACE("ipsintr_done", 2); - if (!scb) { - printk(KERN_WARNING "(%s%d) Spurious interrupt; scb NULL.\n", - ips_name, ha->host_num); + if (!scb) { + printk(KERN_WARNING "(%s%d) Spurious interrupt; scb NULL.\n", + ips_name, ha->host_num); - return ; - } + return; + } - if (scb->scsi_cmd == NULL) { - /* unexpected interrupt */ - printk(KERN_WARNING "(%s%d) Spurious interrupt; scsi_cmd not set.\n", - ips_name, ha->host_num); + if (scb->scsi_cmd == NULL) { + /* unexpected interrupt */ + printk(KERN_WARNING + "(%s%d) Spurious interrupt; scsi_cmd not set.\n", + ips_name, ha->host_num); - return; - } + return; + } - ips_done(ha, scb); + ips_done(ha, scb); } /****************************************************************************/ @@ -4002,180 +3344,118 @@ /* ASSUMED to be called form within the request lock */ /****************************************************************************/ static void -ips_done(ips_ha_t *ha, ips_scb_t *scb) { - int ret; +ips_done(ips_ha_t * ha, ips_scb_t * scb) +{ + int ret; - METHOD_TRACE("ips_done", 1); + METHOD_TRACE("ips_done", 1); - if (!scb) - return ; + if (!scb) + return; - if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) { - ips_cleanup_passthru(ha, scb); - ha->num_ioctl--; - } else { - /* - * Check to see if this command had too much - * data and had to be broke up. If so, queue - * the rest of the data and continue. - */ - if ((scb->breakup) || (scb->sg_break)) { - /* we had a data breakup */ - uint8_t bk_save; - - bk_save = scb->breakup; - scb->breakup = 0; - - if (scb->sg_count) { - /* S/G request */ - struct scatterlist *sg; - int i; - - sg = scb->scsi_cmd->request_buffer; - - if (scb->sg_count == 1) { - if (sg_dma_len(sg) - (bk_save * ha->max_xfer) > ha->max_xfer) { - /* Further breakup required */ - scb->data_len = ha->max_xfer; - scb->data_busaddr = sg_dma_address(sg) + (bk_save * ha->max_xfer); - scb->breakup = bk_save + 1; - } else { - scb->data_len = sg_dma_len(sg) - (bk_save * ha->max_xfer); - scb->data_busaddr = sg_dma_address(sg) + (bk_save * ha->max_xfer); - } - - scb->dcdb.transfer_length = scb->data_len; - scb->sg_len = 0; - } else { - /* We're here because there was MORE than one s/g unit. */ - /* bk_save points to which sg unit to look at */ - /* sg_break points to how far through this unit we are */ - /* NOTE: We will not move from one sg to another here, */ - /* just finish the one we are in. Not the most */ - /* efficient, but it keeps it from getting too hacky */ - - /* IF sg_break is non-zero, then just work on this current sg piece, */ - /* pointed to by bk_save */ - if (scb->sg_break) { - scb->sg_len = 1; - scb->sg_list[0].address = sg_dma_address(&sg[bk_save]) - + ha->max_xfer*scb->sg_break; - if (ha->max_xfer > sg_dma_len(&sg[bk_save]) - ha->max_xfer * scb->sg_break) - scb->sg_list[0].length = sg_dma_len(&sg[bk_save]) - ha->max_xfer * scb->sg_break; - else - scb->sg_list[0].length = ha->max_xfer; - scb->sg_break++; /* MUST GO HERE for math below to work */ - scb->data_len = scb->sg_list[0].length;; - - if (sg_dma_len(&sg[bk_save]) <= ha->max_xfer * scb->sg_break ) { - scb->sg_break = 0; /* No more work in this unit */ - if (( bk_save + 1 ) >= scb->sg_count) - scb->breakup = 0; - else - scb->breakup = bk_save + 1; - } - } else { - /* ( sg_break == 0 ), so this is our first look at a new sg piece */ - if (sg_dma_len(&sg[bk_save]) > ha->max_xfer) { - scb->sg_list[0].address = sg_dma_address(&sg[bk_save]); - scb->sg_list[0].length = ha->max_xfer; - scb->breakup = bk_save; - scb->sg_break = 1; - scb->data_len = ha->max_xfer; - scb->sg_len = 1; - } else { - /* OK, the next sg is a short one, so loop until full */ - scb->data_len = 0; - scb->sg_len = 0; - scb->sg_break = 0; - /* We're only doing full units here */ - for (i = bk_save; i < scb->sg_count; i++) { - scb->sg_list[i - bk_save].address = sg_dma_address(&sg[i]); - scb->sg_list[i - bk_save].length = cpu_to_le32(sg_dma_len(&sg[i])); - if (scb->data_len + sg_dma_len(&sg[i]) > ha->max_xfer) { - scb->breakup = i; /* sneaky, if not more work, than breakup is 0 */ - break; - } - scb->data_len += sg_dma_len(&sg[i]); - scb->sg_len++; /* only if we didn't get too big */ - } - } - } - - /* Also, we need to be sure we don't queue work ( breakup != 0 ) - if no more sg units for next time */ - scb->dcdb.transfer_length = scb->data_len; - scb->data_busaddr = scb->sg_busaddr; - } - - } else { - /* Non S/G Request */ - pci_unmap_single(ha->pcidev, scb->data_busaddr, scb->data_len, - IPS_DMA_DIR(scb)); - if ((scb->scsi_cmd->request_bufflen - (bk_save * ha->max_xfer)) > ha->max_xfer) { - /* Further breakup required */ - scb->data_len = ha->max_xfer; - scb->data_busaddr = pci_map_single(ha->pcidev, - scb->scsi_cmd->request_buffer + - (bk_save * ha->max_xfer), - scb->data_len, IPS_DMA_DIR(scb)); - scb->breakup = bk_save + 1; - } else { - scb->data_len = scb->scsi_cmd->request_bufflen - (bk_save * ha->max_xfer); - scb->data_busaddr = pci_map_single(ha->pcidev, - scb->scsi_cmd->request_buffer + - (bk_save * ha->max_xfer), - scb->data_len, IPS_DMA_DIR(scb)); - } - - scb->dcdb.transfer_length = scb->data_len; - scb->sg_len = 0; - } - - scb->dcdb.cmd_attribute |= ips_command_direction[scb->scsi_cmd->cmnd[0]]; - - if (!scb->dcdb.cmd_attribute & 0x3) - scb->dcdb.transfer_length = 0; - - if (scb->data_len >= IPS_MAX_XFER) { - scb->dcdb.cmd_attribute |= IPS_TRANSFER64K; - scb->dcdb.transfer_length = 0; - } - - ret = ips_send_cmd(ha, scb); - - switch(ret) { - case IPS_FAILURE: - if (scb->scsi_cmd) { - scb->scsi_cmd->result = DID_ERROR << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - } - - ips_freescb(ha, scb); - break; - case IPS_SUCCESS_IMM: - if (scb->scsi_cmd) { - scb->scsi_cmd->result = DID_ERROR << 16; - scb->scsi_cmd->scsi_done(scb->scsi_cmd); - } - - ips_freescb(ha, scb); - break; - default: - break; - } /* end case */ - - return ; - } - } /* end if passthru */ - - if (scb->bus) { - ha->dcdb_active[scb->bus-1] &= ~(1 << scb->target_id); - } + if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) { + ips_cleanup_passthru(ha, scb); + ha->num_ioctl--; + } else { + /* + * Check to see if this command had too much + * data and had to be broke up. If so, queue + * the rest of the data and continue. + */ + if ((scb->breakup) || (scb->sg_break)) { + /* we had a data breakup */ + scb->data_len = 0; + + if (scb->sg_count) { + /* S/G request */ + struct scatterlist *sg; + int ips_sg_index = 0; + int sg_dma_index; + + sg = scb->scsi_cmd->request_buffer; + + /* Spin forward to last dma chunk */ + sg_dma_index = scb->breakup; + + /* Take care of possible partial on last chunk */ + ips_fill_scb_sg_single(ha, + sg_dma_address(&sg + [sg_dma_index]), + scb, ips_sg_index++, + sg_dma_len(&sg + [sg_dma_index])); + + for (; sg_dma_index < scb->sg_count; + sg_dma_index++) { + if (ips_fill_scb_sg_single + (ha, + sg_dma_address(&sg[sg_dma_index]), + scb, ips_sg_index++, + sg_dma_len(&sg[sg_dma_index])) < 0) + break; + + } + + } else { + /* Non S/G Request */ + (void) ips_fill_scb_sg_single(ha, + scb-> + data_busaddr + + (scb->sg_break * + ha->max_xfer), + scb, 0, + scb->scsi_cmd-> + request_bufflen - + (scb->sg_break * + ha->max_xfer)); + } + + scb->dcdb.transfer_length = scb->data_len; + scb->dcdb.cmd_attribute |= + ips_command_direction[scb->scsi_cmd->cmnd[0]]; + + if (!(scb->dcdb.cmd_attribute & 0x3)) + scb->dcdb.transfer_length = 0; + + if (scb->data_len >= IPS_MAX_XFER) { + scb->dcdb.cmd_attribute |= IPS_TRANSFER64K; + scb->dcdb.transfer_length = 0; + } + + ret = ips_send_cmd(ha, scb); + + switch (ret) { + case IPS_FAILURE: + if (scb->scsi_cmd) { + scb->scsi_cmd->result = DID_ERROR << 16; + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + } + + ips_freescb(ha, scb); + break; + case IPS_SUCCESS_IMM: + if (scb->scsi_cmd) { + scb->scsi_cmd->result = DID_ERROR << 16; + scb->scsi_cmd->scsi_done(scb->scsi_cmd); + } + + ips_freescb(ha, scb); + break; + default: + break; + } /* end case */ + + return; + } + } /* end if passthru */ + + if (scb->bus) { + ha->dcdb_active[scb->bus - 1] &= ~(1 << scb->target_id); + } - scb->scsi_cmd->scsi_done(scb->scsi_cmd); + scb->scsi_cmd->scsi_done(scb->scsi_cmd); - ips_freescb(ha, scb); + ips_freescb(ha, scb); } /****************************************************************************/ @@ -4188,118 +3468,130 @@ /* */ /****************************************************************************/ static int -ips_map_status(ips_ha_t *ha, ips_scb_t *scb, ips_stat_t *sp) { - int errcode; - int device_error; - uint32_t transfer_len; - IPS_DCDB_TABLE_TAPE *tapeDCDB; - - METHOD_TRACE("ips_map_status", 1); - - if (scb->bus) { - DEBUG_VAR(2, "(%s%d) Physical device error (%d %d %d): %x %x, Sense Key: %x, ASC: %x, ASCQ: %x", - ips_name, - ha->host_num, - scb->scsi_cmd->channel, - scb->scsi_cmd->target, - scb->scsi_cmd->lun, - scb->basic_status, - scb->extended_status, - scb->extended_status == IPS_ERR_CKCOND ? scb->dcdb.sense_info[2] & 0xf : 0, - scb->extended_status == IPS_ERR_CKCOND ? scb->dcdb.sense_info[12] : 0, - scb->extended_status == IPS_ERR_CKCOND ? scb->dcdb.sense_info[13] : 0); - } - - /* default driver error */ - errcode = DID_ERROR; - device_error = 0; - - switch (scb->basic_status & IPS_GSC_STATUS_MASK) { - case IPS_CMD_TIMEOUT: - errcode = DID_TIME_OUT; - break; - - case IPS_INVAL_OPCO: - case IPS_INVAL_CMD_BLK: - case IPS_INVAL_PARM_BLK: - case IPS_LD_ERROR: - case IPS_CMD_CMPLT_WERROR: - break; - - case IPS_PHYS_DRV_ERROR: - switch (scb->extended_status) { - case IPS_ERR_SEL_TO: - if (scb->bus) - errcode = DID_NO_CONNECT; - - break; - - case IPS_ERR_OU_RUN: - if ( ( scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB ) || - ( scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG ) ) { - tapeDCDB = ( IPS_DCDB_TABLE_TAPE * ) &scb->dcdb; - transfer_len = tapeDCDB->transfer_length; - } else { - transfer_len = ( uint32_t ) scb->dcdb.transfer_length; - } - - if ((scb->bus) && (transfer_len < scb->data_len)) { - /* Underrun - set default to no error */ - errcode = DID_OK; - - /* Restrict access to physical DASD */ - if ((scb->scsi_cmd->cmnd[0] == INQUIRY) && - ((((char *) scb->scsi_cmd->buffer)[0] & 0x1f) == TYPE_DISK)) { - /* underflow -- no error */ - /* restrict access to physical DASD */ - errcode = DID_TIME_OUT; - break; - } - } else - errcode = DID_ERROR; - - break; - - case IPS_ERR_RECOVERY: - /* don't fail recovered errors */ - if (scb->bus) - errcode = DID_OK; - - break; - - case IPS_ERR_HOST_RESET: - case IPS_ERR_DEV_RESET: - errcode = DID_RESET; - break; - - case IPS_ERR_CKCOND: - if (scb->bus) { - if ((scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB) || - (scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG)) { - tapeDCDB = (IPS_DCDB_TABLE_TAPE *) &scb->dcdb; - memcpy(scb->scsi_cmd->sense_buffer, tapeDCDB->sense_info, - sizeof(scb->scsi_cmd->sense_buffer)); - } else { - memcpy(scb->scsi_cmd->sense_buffer, scb->dcdb.sense_info, - sizeof(scb->scsi_cmd->sense_buffer)); - } - device_error = 2; /* check condition */ - } - - errcode = DID_OK; - - break; - - default: - errcode = DID_ERROR; - break; +ips_map_status(ips_ha_t * ha, ips_scb_t * scb, ips_stat_t * sp) +{ + int errcode; + int device_error; + uint32_t transfer_len; + IPS_DCDB_TABLE_TAPE *tapeDCDB; + + METHOD_TRACE("ips_map_status", 1); + + if (scb->bus) { + DEBUG_VAR(2, + "(%s%d) Physical device error (%d %d %d): %x %x, Sense Key: %x, ASC: %x, ASCQ: %x", + ips_name, ha->host_num, scb->scsi_cmd->channel, + scb->scsi_cmd->target, scb->scsi_cmd->lun, + scb->basic_status, scb->extended_status, + scb->extended_status == + IPS_ERR_CKCOND ? scb->dcdb.sense_info[2] & 0xf : 0, + scb->extended_status == + IPS_ERR_CKCOND ? scb->dcdb.sense_info[12] : 0, + scb->extended_status == + IPS_ERR_CKCOND ? scb->dcdb.sense_info[13] : 0); + } + + /* default driver error */ + errcode = DID_ERROR; + device_error = 0; + + switch (scb->basic_status & IPS_GSC_STATUS_MASK) { + case IPS_CMD_TIMEOUT: + errcode = DID_TIME_OUT; + break; + + case IPS_INVAL_OPCO: + case IPS_INVAL_CMD_BLK: + case IPS_INVAL_PARM_BLK: + case IPS_LD_ERROR: + case IPS_CMD_CMPLT_WERROR: + break; + + case IPS_PHYS_DRV_ERROR: + switch (scb->extended_status) { + case IPS_ERR_SEL_TO: + if (scb->bus) + errcode = DID_NO_CONNECT; + + break; + + case IPS_ERR_OU_RUN: + if ((scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB) || + (scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG)) { + tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb; + transfer_len = tapeDCDB->transfer_length; + } else { + transfer_len = + (uint32_t) scb->dcdb.transfer_length; + } + + if ((scb->bus) && (transfer_len < scb->data_len)) { + /* Underrun - set default to no error */ + errcode = DID_OK; + + /* Restrict access to physical DASD */ + if ((scb->scsi_cmd->cmnd[0] == INQUIRY) && + ((((char + *) scb->scsi_cmd->buffer)[0] & 0x1f) == + TYPE_DISK)) { + /* underflow -- no error */ + /* restrict access to physical DASD */ + errcode = DID_TIME_OUT; + break; + } + } else + errcode = DID_ERROR; + + break; + + case IPS_ERR_RECOVERY: + /* don't fail recovered errors */ + if (scb->bus) + errcode = DID_OK; + + break; + + case IPS_ERR_HOST_RESET: + case IPS_ERR_DEV_RESET: + errcode = DID_RESET; + break; + + case IPS_ERR_CKCOND: + if (scb->bus) { + if ( + (scb->cmd.dcdb.op_code == + IPS_CMD_EXTENDED_DCDB) + || (scb->cmd.dcdb.op_code == + IPS_CMD_EXTENDED_DCDB_SG)) { + tapeDCDB = + (IPS_DCDB_TABLE_TAPE *) & scb->dcdb; + memcpy(scb->scsi_cmd->sense_buffer, + tapeDCDB->sense_info, + sizeof (scb->scsi_cmd-> + sense_buffer)); + } else { + memcpy(scb->scsi_cmd->sense_buffer, + scb->dcdb.sense_info, + sizeof (scb->scsi_cmd-> + sense_buffer)); + } + device_error = 2; /* check condition */ + } + + errcode = DID_OK; + + break; + + default: + errcode = DID_ERROR; + break; - } /* end switch */ - } /* end switch */ + } /* end switch */ + } /* end switch */ - scb->scsi_cmd->result = device_error | (errcode << 16); + scb->scsi_cmd->result = device_error | (errcode << 16); - return (1); + return (1); } /****************************************************************************/ @@ -4314,25 +3606,90 @@ /* actually need to wait. */ /****************************************************************************/ static int -ips_send_wait(ips_ha_t *ha, ips_scb_t *scb, int timeout, int intr) { - int ret; +ips_send_wait(ips_ha_t * ha, ips_scb_t * scb, int timeout, int intr) +{ + int ret; - METHOD_TRACE("ips_send_wait", 1); + METHOD_TRACE("ips_send_wait", 1); - if (intr != IPS_FFDC) { /* Won't be Waiting if this is a Time Stamp */ - ha->waitflag = TRUE; - ha->cmd_in_progress = scb->cdb[0]; - } - scb->callback = ipsintr_blocking; - ret = ips_send_cmd(ha, scb); + if (intr != IPS_FFDC) { /* Won't be Waiting if this is a Time Stamp */ + ha->waitflag = TRUE; + ha->cmd_in_progress = scb->cdb[0]; + } + scb->callback = ipsintr_blocking; + ret = ips_send_cmd(ha, scb); - if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM)) - return (ret); + if ((ret == IPS_FAILURE) || (ret == IPS_SUCCESS_IMM)) + return (ret); - if (intr != IPS_FFDC) /* Don't Wait around if this is a Time Stamp */ - ret = ips_wait(ha, timeout, intr); + if (intr != IPS_FFDC) /* Don't Wait around if this is a Time Stamp */ + ret = ips_wait(ha, timeout, intr); - return (ret); + return (ret); +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_scmd_buf_write */ +/* */ +/* Routine Description: */ +/* Write data to Scsi_Cmnd request_buffer at proper offsets */ +/****************************************************************************/ +static void +ips_scmd_buf_write(Scsi_Cmnd * scmd, void *data, unsigned + int count) +{ + if (scmd->use_sg) { + int i; + unsigned int min_cnt, xfer_cnt; + char *cdata = (char *) data; + struct scatterlist *sg = scmd->request_buffer; + for (i = 0, xfer_cnt = 0; + (i < scmd->use_sg) && (xfer_cnt < count); i++) { + if (!IPS_SG_ADDRESS(&sg[i])) + return; + min_cnt = min(count - xfer_cnt, sg[i].length); + memcpy(IPS_SG_ADDRESS(&sg[i]), &cdata[xfer_cnt], + min_cnt); + xfer_cnt += min_cnt; + } + + } else { + unsigned int min_cnt = min(count, scmd->request_bufflen); + memcpy(scmd->request_buffer, data, min_cnt); + } +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_scmd_buf_read */ +/* */ +/* Routine Description: */ +/* Copy data from a Scsi_Cmnd to a new, linear buffer */ +/****************************************************************************/ +static void +ips_scmd_buf_read(Scsi_Cmnd * scmd, void *data, unsigned + int count) +{ + if (scmd->use_sg) { + int i; + unsigned int min_cnt, xfer_cnt; + char *cdata = (char *) data; + struct scatterlist *sg = scmd->request_buffer; + for (i = 0, xfer_cnt = 0; + (i < scmd->use_sg) && (xfer_cnt < count); i++) { + if (!IPS_SG_ADDRESS(&sg[i])) + return; + min_cnt = min(count - xfer_cnt, sg[i].length); + memcpy(&cdata[xfer_cnt], IPS_SG_ADDRESS(&sg[i]), + min_cnt); + xfer_cnt += min_cnt; + } + + } else { + unsigned int min_cnt = min(count, scmd->request_bufflen); + memcpy(data, scmd->request_buffer, min_cnt); + } } /****************************************************************************/ @@ -4345,288 +3702,402 @@ /* */ /****************************************************************************/ static int -ips_send_cmd(ips_ha_t *ha, ips_scb_t *scb) { - int ret; - char *sp; - int device_error; - IPS_DCDB_TABLE_TAPE *tapeDCDB; - int TimeOut; - - METHOD_TRACE("ips_send_cmd", 1); - - ret = IPS_SUCCESS; - - if (!scb->scsi_cmd) { - /* internal command */ - - if (scb->bus > 0) { - /* Controller commands can't be issued */ - /* to real devices -- fail them */ - if ((ha->waitflag == TRUE) && - (ha->cmd_in_progress == scb->cdb[0])) { - ha->waitflag = FALSE; - } - - return (1); - } - } else if ((scb->bus == 0) && (!ips_is_passthru(scb->scsi_cmd))) { - /* command to logical bus -- interpret */ - if(ha->scb_waitlist.count + ha->scb_activelist.count > 32) - mod_timer(&scb->scsi_cmd->eh_timeout, jiffies + 120 * HZ); - ret = IPS_SUCCESS_IMM; - - switch (scb->scsi_cmd->cmnd[0]) { - case ALLOW_MEDIUM_REMOVAL: - case REZERO_UNIT: - case ERASE: - case WRITE_FILEMARKS: - case SPACE: - scb->scsi_cmd->result = DID_ERROR << 16; - break; - - case START_STOP: - scb->scsi_cmd->result = DID_OK << 16; - - case TEST_UNIT_READY: - case INQUIRY: - scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO; - scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.logical_info.reserved = 0; - scb->cmd.logical_info.reserved2 = 0; - scb->data_len = sizeof(ha->adapt->logical_drive_info); - scb->data_busaddr = pci_map_single(ha->pcidev, - &ha->adapt->logical_drive_info, - scb->data_len, IPS_DMA_DIR(scb)); - scb->flags |= IPS_SCB_MAP_SINGLE; - scb->cmd.logical_info.buffer_addr = scb->data_busaddr; - ret = IPS_SUCCESS; - break; - - case REQUEST_SENSE: - ips_reqsen(ha, scb); - scb->scsi_cmd->result = DID_OK << 16; - break; - - case READ_6: - case WRITE_6: - if (!scb->sg_len) { - scb->cmd.basic_io.op_code = - (scb->scsi_cmd->cmnd[0] == READ_6) ? IPS_CMD_READ : IPS_CMD_WRITE; - } else { - scb->cmd.basic_io.op_code = - (scb->scsi_cmd->cmnd[0] == READ_6) ? IPS_CMD_READ_SG : IPS_CMD_WRITE_SG; - } - - scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.basic_io.log_drv = scb->target_id; - scb->cmd.basic_io.sg_count = scb->sg_len; - scb->cmd.basic_io.sg_addr = cpu_to_le32(scb->data_busaddr); - - if (scb->cmd.basic_io.lba) - scb->cmd.basic_io.lba = cpu_to_le32(le32_to_cpu(scb->cmd.basic_io.lba) + - le16_to_cpu(scb->cmd.basic_io.sector_count)); - else - scb->cmd.basic_io.lba = (((scb->scsi_cmd->cmnd[1] & 0x1f) << 16) | - (scb->scsi_cmd->cmnd[2] << 8) | - (scb->scsi_cmd->cmnd[3])); - - scb->cmd.basic_io.sector_count = cpu_to_le16(scb->data_len / IPS_BLKSIZE); - - if (le16_to_cpu(scb->cmd.basic_io.sector_count) == 0) - scb->cmd.basic_io.sector_count = cpu_to_le16(256); - - scb->cmd.basic_io.reserved = 0; - ret = IPS_SUCCESS; - break; - - case READ_10: - case WRITE_10: - if (!scb->sg_len) { - scb->cmd.basic_io.op_code = - (scb->scsi_cmd->cmnd[0] == READ_10) ? IPS_CMD_READ : IPS_CMD_WRITE; - } else { - scb->cmd.basic_io.op_code = - (scb->scsi_cmd->cmnd[0] == READ_10) ? IPS_CMD_READ_SG : IPS_CMD_WRITE_SG; - } - - scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.basic_io.log_drv = scb->target_id; - scb->cmd.basic_io.sg_count = scb->sg_len; - scb->cmd.basic_io.sg_addr = cpu_to_le32(scb->data_busaddr); - - if (scb->cmd.basic_io.lba) - scb->cmd.basic_io.lba = cpu_to_le32(le32_to_cpu(scb->cmd.basic_io.lba) + - le16_to_cpu(scb->cmd.basic_io.sector_count)); - else - scb->cmd.basic_io.lba = ((scb->scsi_cmd->cmnd[2] << 24) | - (scb->scsi_cmd->cmnd[3] << 16) | - (scb->scsi_cmd->cmnd[4] << 8) | - scb->scsi_cmd->cmnd[5]); - - scb->cmd.basic_io.sector_count = cpu_to_le16(scb->data_len / IPS_BLKSIZE); - - scb->cmd.basic_io.reserved = 0; - - if (cpu_to_le16(scb->cmd.basic_io.sector_count) == 0) { - /* - * This is a null condition - * we don't have to do anything - * so just return - */ - scb->scsi_cmd->result = DID_OK << 16; - } else - ret = IPS_SUCCESS; - - break; - - case RESERVE: - case RELEASE: - scb->scsi_cmd->result = DID_OK << 16; - break; - - case MODE_SENSE: - scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY; - scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); - scb->data_len = sizeof(*ha->enq); - scb->data_busaddr = pci_map_single(ha->pcidev, ha->enq, - scb->data_len, IPS_DMA_DIR(scb)); - scb->cmd.basic_io.sg_addr = scb->data_busaddr; - scb->flags |= IPS_SCB_MAP_SINGLE; - ret = IPS_SUCCESS; - break; - - case READ_CAPACITY: - scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO; - scb->cmd.logical_info.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.logical_info.reserved = 0; - scb->cmd.logical_info.reserved2 = 0; - scb->cmd.logical_info.reserved3 = 0; - scb->data_len = sizeof(ha->adapt->logical_drive_info); - scb->data_busaddr = pci_map_single(ha->pcidev, - &ha->adapt->logical_drive_info, - scb->data_len, IPS_DMA_DIR(scb)); - scb->flags |= IPS_SCB_MAP_SINGLE; - scb->cmd.logical_info.buffer_addr = scb->data_busaddr; - ret = IPS_SUCCESS; - break; - - case SEND_DIAGNOSTIC: - case REASSIGN_BLOCKS: - case FORMAT_UNIT: - case SEEK_10: - case VERIFY: - case READ_DEFECT_DATA: - case READ_BUFFER: - case WRITE_BUFFER: - scb->scsi_cmd->result = DID_OK << 16; - break; - - default: - /* Set the Return Info to appear like the Command was */ - /* attempted, a Check Condition occurred, and Sense */ - /* Data indicating an Invalid CDB OpCode is returned. */ - sp = (char *) scb->scsi_cmd->sense_buffer; - memset(sp, 0, sizeof(scb->scsi_cmd->sense_buffer)); - - sp[0] = 0x70; /* Error Code */ - sp[2] = ILLEGAL_REQUEST; /* Sense Key 5 Illegal Req. */ - sp[7] = 0x0A; /* Additional Sense Length */ - sp[12] = 0x20; /* ASC = Invalid OpCode */ - sp[13] = 0x00; /* ASCQ */ - - device_error = 2; /* Indicate Check Condition */ - scb->scsi_cmd->result = device_error | (DID_OK << 16); - break; - } /* end switch */ - } /* end if */ - - if (ret == IPS_SUCCESS_IMM) - return (ret); - - /* setup DCDB */ - if (scb->bus > 0) { - if (!scb->sg_len) - scb->cmd.dcdb.op_code = IPS_CMD_DCDB; - else - scb->cmd.dcdb.op_code = IPS_CMD_DCDB_SG; - - /* If we already know the Device is Not there, no need to attempt a Command */ - /* This also protects an NT FailOver Controller from getting CDB's sent to it */ - if ( ha->conf->dev[scb->bus-1][scb->target_id].ucState == 0 ) { - scb->scsi_cmd->result = DID_NO_CONNECT << 16; - return (IPS_SUCCESS_IMM); - } - - ha->dcdb_active[scb->bus-1] |= (1 << scb->target_id); - scb->cmd.dcdb.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr + - (unsigned long)&scb->dcdb - - (unsigned long)scb); - scb->cmd.dcdb.reserved = 0; - scb->cmd.dcdb.reserved2 = 0; - scb->cmd.dcdb.reserved3 = 0; - - TimeOut = scb->scsi_cmd->timeout_per_command; - - if (ha->subsys->param[4] & 0x00100000) { /* If NEW Tape DCDB is Supported */ - if (!scb->sg_len) - scb->cmd.dcdb.op_code = IPS_CMD_EXTENDED_DCDB; - else - scb->cmd.dcdb.op_code = IPS_CMD_EXTENDED_DCDB_SG; - - tapeDCDB = (IPS_DCDB_TABLE_TAPE *) &scb->dcdb; /* Use Same Data Area as Old DCDB Struct */ - tapeDCDB->device_address = ((scb->bus - 1) << 4) | scb->target_id; - tapeDCDB->cmd_attribute |= IPS_DISCONNECT_ALLOWED; - tapeDCDB->cmd_attribute &= ~IPS_TRANSFER64K; /* Always Turn OFF 64K Size Flag */ - - if (TimeOut) { - if (TimeOut < ( 10 * HZ )) - tapeDCDB->cmd_attribute |= IPS_TIMEOUT10; /* TimeOut is 10 Seconds */ - else if (TimeOut < (60 * HZ)) - tapeDCDB->cmd_attribute |= IPS_TIMEOUT60; /* TimeOut is 60 Seconds */ - else if (TimeOut < (1200 * HZ)) - tapeDCDB->cmd_attribute |= IPS_TIMEOUT20M; /* TimeOut is 20 Minutes */ - } - - tapeDCDB->cdb_length = scb->scsi_cmd->cmd_len; - tapeDCDB->reserved_for_LUN = 0; - tapeDCDB->transfer_length = scb->data_len; - tapeDCDB->buffer_pointer = cpu_to_le32(scb->data_busaddr); - tapeDCDB->sg_count = scb->sg_len; - tapeDCDB->sense_length = sizeof(tapeDCDB->sense_info); - tapeDCDB->scsi_status = 0; - tapeDCDB->reserved = 0; - memcpy(tapeDCDB->scsi_cdb, scb->scsi_cmd->cmnd, scb->scsi_cmd->cmd_len); - } else { - scb->dcdb.device_address = ((scb->bus - 1) << 4) | scb->target_id; - scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED; - - if (TimeOut) { - if (TimeOut < (10 * HZ)) - scb->dcdb.cmd_attribute |= IPS_TIMEOUT10; /* TimeOut is 10 Seconds */ - else if (TimeOut < (60 * HZ)) - scb->dcdb.cmd_attribute |= IPS_TIMEOUT60; /* TimeOut is 60 Seconds */ - else if (TimeOut < (1200 * HZ)) - scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; /* TimeOut is 20 Minutes */ - } - - scb->dcdb.transfer_length = scb->data_len; - if ( scb->dcdb.cmd_attribute & IPS_TRANSFER64K ) - scb->dcdb.transfer_length = 0; - scb->dcdb.buffer_pointer = cpu_to_le32(scb->data_busaddr); - scb->dcdb.cdb_length = scb->scsi_cmd->cmd_len; - scb->dcdb.sense_length = sizeof(scb->dcdb.sense_info); - scb->dcdb.sg_count = scb->sg_len; - scb->dcdb.reserved = 0; - memcpy(scb->dcdb.scsi_cdb, scb->scsi_cmd->cmnd, scb->scsi_cmd->cmd_len); - scb->dcdb.scsi_status = 0; - scb->dcdb.reserved2[0] = 0; - scb->dcdb.reserved2[1] = 0; - scb->dcdb.reserved2[2] = 0; - } - } +ips_send_cmd(ips_ha_t * ha, ips_scb_t * scb) +{ + int ret; + char *sp; + int device_error; + IPS_DCDB_TABLE_TAPE *tapeDCDB; + int TimeOut; + + METHOD_TRACE("ips_send_cmd", 1); + + ret = IPS_SUCCESS; + + if (!scb->scsi_cmd) { + /* internal command */ + + if (scb->bus > 0) { + /* Controller commands can't be issued */ + /* to real devices -- fail them */ + if ((ha->waitflag == TRUE) && + (ha->cmd_in_progress == scb->cdb[0])) { + ha->waitflag = FALSE; + } + + return (1); + } + } else if ((scb->bus == 0) && (!ips_is_passthru(scb->scsi_cmd))) { + /* command to logical bus -- interpret */ + ret = IPS_SUCCESS_IMM; + + switch (scb->scsi_cmd->cmnd[0]) { + case ALLOW_MEDIUM_REMOVAL: + case REZERO_UNIT: + case ERASE: + case WRITE_FILEMARKS: + case SPACE: + scb->scsi_cmd->result = DID_ERROR << 16; + break; + + case START_STOP: + scb->scsi_cmd->result = DID_OK << 16; + + case TEST_UNIT_READY: + case INQUIRY: + if (scb->target_id == IPS_ADAPTER_ID) { + /* + * Either we have a TUR + * or we have a SCSI inquiry + */ + if (scb->scsi_cmd->cmnd[0] == TEST_UNIT_READY) + scb->scsi_cmd->result = DID_OK << 16; + + if (scb->scsi_cmd->cmnd[0] == INQUIRY) { + IPS_SCSI_INQ_DATA inquiry; + + memset(&inquiry, 0, + sizeof (IPS_SCSI_INQ_DATA)); + + inquiry.DeviceType = + IPS_SCSI_INQ_TYPE_PROCESSOR; + inquiry.DeviceTypeQualifier = + IPS_SCSI_INQ_LU_CONNECTED; + inquiry.Version = IPS_SCSI_INQ_REV2; + inquiry.ResponseDataFormat = + IPS_SCSI_INQ_RD_REV2; + inquiry.AdditionalLength = 31; + inquiry.Flags[0] = + IPS_SCSI_INQ_Address16; + inquiry.Flags[1] = + IPS_SCSI_INQ_WBus16 | + IPS_SCSI_INQ_Sync; + strncpy(inquiry.VendorId, "IBM ", + 8); + strncpy(inquiry.ProductId, + "SERVERAID ", 16); + strncpy(inquiry.ProductRevisionLevel, + "1.00", 4); + + ips_scmd_buf_write(scb->scsi_cmd, + &inquiry, + sizeof (inquiry)); + + scb->scsi_cmd->result = DID_OK << 16; + } + } else { + scb->cmd.logical_info.op_code = + IPS_CMD_GET_LD_INFO; + scb->cmd.logical_info.command_id = + IPS_COMMAND_ID(ha, scb); + scb->cmd.logical_info.reserved = 0; + scb->cmd.logical_info.reserved2 = 0; + scb->data_len = + sizeof (ha->adapt->logical_drive_info); + scb->data_busaddr = + pci_map_single(ha->pcidev, + &ha->adapt-> + logical_drive_info, + scb->data_len, + IPS_DMA_DIR(scb)); + scb->flags |= IPS_SCB_MAP_SINGLE; + scb->cmd.logical_info.buffer_addr = + scb->data_busaddr; + ret = IPS_SUCCESS; + } + + break; + + case REQUEST_SENSE: + ips_reqsen(ha, scb); + scb->scsi_cmd->result = DID_OK << 16; + break; + + case READ_6: + case WRITE_6: + if (!scb->sg_len) { + scb->cmd.basic_io.op_code = + (scb->scsi_cmd->cmnd[0] == + READ_6) ? IPS_CMD_READ : IPS_CMD_WRITE; + scb->cmd.basic_io.enhanced_sg = 0; + scb->cmd.basic_io.sg_addr = + cpu_to_le32(scb->data_busaddr); + } else { + scb->cmd.basic_io.op_code = + (scb->scsi_cmd->cmnd[0] == + READ_6) ? IPS_CMD_READ_SG : + IPS_CMD_WRITE_SG; + scb->cmd.basic_io.enhanced_sg = + IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0; + scb->cmd.basic_io.sg_addr = + cpu_to_le32(scb->sg_busaddr); + } + + scb->cmd.basic_io.segment_4G = 0; + scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.basic_io.log_drv = scb->target_id; + scb->cmd.basic_io.sg_count = scb->sg_len; + + if (scb->cmd.basic_io.lba) + scb->cmd.basic_io.lba = + cpu_to_le32(le32_to_cpu + (scb->cmd.basic_io.lba) + + le16_to_cpu(scb->cmd.basic_io. + sector_count)); + else + scb->cmd.basic_io.lba = + (((scb-> + scsi_cmd->cmnd[1] & 0x1f) << 16) | (scb-> + scsi_cmd-> + cmnd + [2] + << 8) + | (scb->scsi_cmd->cmnd[3])); + + scb->cmd.basic_io.sector_count = + cpu_to_le16(scb->data_len / IPS_BLKSIZE); + + if (le16_to_cpu(scb->cmd.basic_io.sector_count) == 0) + scb->cmd.basic_io.sector_count = + cpu_to_le16(256); + + ret = IPS_SUCCESS; + break; + + case READ_10: + case WRITE_10: + if (!scb->sg_len) { + scb->cmd.basic_io.op_code = + (scb->scsi_cmd->cmnd[0] == + READ_10) ? IPS_CMD_READ : IPS_CMD_WRITE; + scb->cmd.basic_io.enhanced_sg = 0; + scb->cmd.basic_io.sg_addr = + cpu_to_le32(scb->data_busaddr); + } else { + scb->cmd.basic_io.op_code = + (scb->scsi_cmd->cmnd[0] == + READ_10) ? IPS_CMD_READ_SG : + IPS_CMD_WRITE_SG; + scb->cmd.basic_io.enhanced_sg = + IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0; + scb->cmd.basic_io.sg_addr = + cpu_to_le32(scb->sg_busaddr); + } + + scb->cmd.basic_io.segment_4G = 0; + scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.basic_io.log_drv = scb->target_id; + scb->cmd.basic_io.sg_count = scb->sg_len; + + if (scb->cmd.basic_io.lba) + scb->cmd.basic_io.lba = + cpu_to_le32(le32_to_cpu + (scb->cmd.basic_io.lba) + + le16_to_cpu(scb->cmd.basic_io. + sector_count)); + else + scb->cmd.basic_io.lba = + ((scb-> + scsi_cmd->cmnd[2] << 24) | (scb-> + scsi_cmd-> + cmnd[3] << 16) + | (scb->scsi_cmd->cmnd[4] << 8) | scb-> + scsi_cmd->cmnd[5]); + + scb->cmd.basic_io.sector_count = + cpu_to_le16(scb->data_len / IPS_BLKSIZE); + + if (cpu_to_le16(scb->cmd.basic_io.sector_count) == 0) { + /* + * This is a null condition + * we don't have to do anything + * so just return + */ + scb->scsi_cmd->result = DID_OK << 16; + } else + ret = IPS_SUCCESS; + + break; + + case RESERVE: + case RELEASE: + scb->scsi_cmd->result = DID_OK << 16; + break; + + case MODE_SENSE: + scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY; + scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.basic_io.segment_4G = 0; + scb->cmd.basic_io.enhanced_sg = 0; + scb->data_len = sizeof (*ha->enq); + scb->data_busaddr = pci_map_single(ha->pcidev, ha->enq, + scb->data_len, + IPS_DMA_DIR(scb)); + scb->cmd.basic_io.sg_addr = scb->data_busaddr; + scb->flags |= IPS_SCB_MAP_SINGLE; + ret = IPS_SUCCESS; + break; + + case READ_CAPACITY: + scb->cmd.logical_info.op_code = IPS_CMD_GET_LD_INFO; + scb->cmd.logical_info.command_id = + IPS_COMMAND_ID(ha, scb); + scb->cmd.logical_info.reserved = 0; + scb->cmd.logical_info.reserved2 = 0; + scb->cmd.logical_info.reserved3 = 0; + scb->data_len = sizeof (ha->adapt->logical_drive_info); + scb->data_busaddr = pci_map_single(ha->pcidev, + &ha->adapt-> + logical_drive_info, + scb->data_len, + IPS_DMA_DIR(scb)); + scb->flags |= IPS_SCB_MAP_SINGLE; + scb->cmd.logical_info.buffer_addr = scb->data_busaddr; + ret = IPS_SUCCESS; + break; + + case SEND_DIAGNOSTIC: + case REASSIGN_BLOCKS: + case FORMAT_UNIT: + case SEEK_10: + case VERIFY: + case READ_DEFECT_DATA: + case READ_BUFFER: + case WRITE_BUFFER: + scb->scsi_cmd->result = DID_OK << 16; + break; + + default: + /* Set the Return Info to appear like the Command was */ + /* attempted, a Check Condition occurred, and Sense */ + /* Data indicating an Invalid CDB OpCode is returned. */ + sp = (char *) scb->scsi_cmd->sense_buffer; + memset(sp, 0, sizeof (scb->scsi_cmd->sense_buffer)); + + sp[0] = 0x70; /* Error Code */ + sp[2] = ILLEGAL_REQUEST; /* Sense Key 5 Illegal Req. */ + sp[7] = 0x0A; /* Additional Sense Length */ + sp[12] = 0x20; /* ASC = Invalid OpCode */ + sp[13] = 0x00; /* ASCQ */ + + device_error = 2; /* Indicate Check Condition */ + scb->scsi_cmd->result = device_error | (DID_OK << 16); + break; + } /* end switch */ + } + /* end if */ + if (ret == IPS_SUCCESS_IMM) + return (ret); + + /* setup DCDB */ + if (scb->bus > 0) { + + /* If we already know the Device is Not there, no need to attempt a Command */ + /* This also protects an NT FailOver Controller from getting CDB's sent to it */ + if (ha->conf->dev[scb->bus - 1][scb->target_id].ucState == 0) { + scb->scsi_cmd->result = DID_NO_CONNECT << 16; + return (IPS_SUCCESS_IMM); + } + + ha->dcdb_active[scb->bus - 1] |= (1 << scb->target_id); + scb->cmd.dcdb.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.dcdb.dcdb_address = cpu_to_le32(scb->scb_busaddr + + (unsigned long) &scb-> + dcdb - + (unsigned long) scb); + scb->cmd.dcdb.reserved = 0; + scb->cmd.dcdb.reserved2 = 0; + scb->cmd.dcdb.reserved3 = 0; + scb->cmd.dcdb.segment_4G = 0; + scb->cmd.dcdb.enhanced_sg = 0; + + TimeOut = scb->scsi_cmd->timeout_per_command; + + if (ha->subsys->param[4] & 0x00100000) { /* If NEW Tape DCDB is Supported */ + if (!scb->sg_len) { + scb->cmd.dcdb.op_code = IPS_CMD_EXTENDED_DCDB; + } else { + scb->cmd.dcdb.op_code = + IPS_CMD_EXTENDED_DCDB_SG; + scb->cmd.dcdb.enhanced_sg = + IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0; + } + + tapeDCDB = (IPS_DCDB_TABLE_TAPE *) & scb->dcdb; /* Use Same Data Area as Old DCDB Struct */ + tapeDCDB->device_address = + ((scb->bus - 1) << 4) | scb->target_id; + tapeDCDB->cmd_attribute |= IPS_DISCONNECT_ALLOWED; + tapeDCDB->cmd_attribute &= ~IPS_TRANSFER64K; /* Always Turn OFF 64K Size Flag */ + + if (TimeOut) { + if (TimeOut < (10 * HZ)) + tapeDCDB->cmd_attribute |= IPS_TIMEOUT10; /* TimeOut is 10 Seconds */ + else if (TimeOut < (60 * HZ)) + tapeDCDB->cmd_attribute |= IPS_TIMEOUT60; /* TimeOut is 60 Seconds */ + else if (TimeOut < (1200 * HZ)) + tapeDCDB->cmd_attribute |= IPS_TIMEOUT20M; /* TimeOut is 20 Minutes */ + } + + tapeDCDB->cdb_length = scb->scsi_cmd->cmd_len; + tapeDCDB->reserved_for_LUN = 0; + tapeDCDB->transfer_length = scb->data_len; + if (scb->cmd.dcdb.op_code == IPS_CMD_EXTENDED_DCDB_SG) + tapeDCDB->buffer_pointer = + cpu_to_le32(scb->sg_busaddr); + else + tapeDCDB->buffer_pointer = + cpu_to_le32(scb->data_busaddr); + tapeDCDB->sg_count = scb->sg_len; + tapeDCDB->sense_length = sizeof (tapeDCDB->sense_info); + tapeDCDB->scsi_status = 0; + tapeDCDB->reserved = 0; + memcpy(tapeDCDB->scsi_cdb, scb->scsi_cmd->cmnd, + scb->scsi_cmd->cmd_len); + } else { + if (!scb->sg_len) { + scb->cmd.dcdb.op_code = IPS_CMD_DCDB; + } else { + scb->cmd.dcdb.op_code = IPS_CMD_DCDB_SG; + scb->cmd.dcdb.enhanced_sg = + IPS_USE_ENH_SGLIST(ha) ? 0xFF : 0; + } + + scb->dcdb.device_address = + ((scb->bus - 1) << 4) | scb->target_id; + scb->dcdb.cmd_attribute |= IPS_DISCONNECT_ALLOWED; + + if (TimeOut) { + if (TimeOut < (10 * HZ)) + scb->dcdb.cmd_attribute |= IPS_TIMEOUT10; /* TimeOut is 10 Seconds */ + else if (TimeOut < (60 * HZ)) + scb->dcdb.cmd_attribute |= IPS_TIMEOUT60; /* TimeOut is 60 Seconds */ + else if (TimeOut < (1200 * HZ)) + scb->dcdb.cmd_attribute |= IPS_TIMEOUT20M; /* TimeOut is 20 Minutes */ + } + + scb->dcdb.transfer_length = scb->data_len; + if (scb->dcdb.cmd_attribute & IPS_TRANSFER64K) + scb->dcdb.transfer_length = 0; + if (scb->cmd.dcdb.op_code == IPS_CMD_DCDB_SG) + scb->dcdb.buffer_pointer = + cpu_to_le32(scb->sg_busaddr); + else + scb->dcdb.buffer_pointer = + cpu_to_le32(scb->data_busaddr); + scb->dcdb.cdb_length = scb->scsi_cmd->cmd_len; + scb->dcdb.sense_length = sizeof (scb->dcdb.sense_info); + scb->dcdb.sg_count = scb->sg_len; + scb->dcdb.reserved = 0; + memcpy(scb->dcdb.scsi_cdb, scb->scsi_cmd->cmnd, + scb->scsi_cmd->cmd_len); + scb->dcdb.scsi_status = 0; + scb->dcdb.reserved2[0] = 0; + scb->dcdb.reserved2[1] = 0; + scb->dcdb.reserved2[2] = 0; + } + } - return ((*ha->func.issue)(ha, scb)); + return ((*ha->func.issue) (ha, scb)); } /****************************************************************************/ @@ -4639,169 +4110,151 @@ /* Assumed to be called with the HA lock */ /****************************************************************************/ static void -ips_chkstatus(ips_ha_t *ha, IPS_STATUS *pstatus) { - ips_scb_t *scb; - ips_stat_t *sp; - uint8_t basic_status; - uint8_t ext_status; - int errcode; - - METHOD_TRACE("ips_chkstatus", 1); - - scb = &ha->scbs[pstatus->fields.command_id]; - scb->basic_status = basic_status = pstatus->fields.basic_status & IPS_BASIC_STATUS_MASK; - scb->extended_status = ext_status = pstatus->fields.extended_status; - - sp = &ha->sp; - sp->residue_len = 0; - sp->scb_addr = (void *) scb; - - /* Remove the item from the active queue */ - ips_removeq_scb(&ha->scb_activelist, scb); - - if (!scb->scsi_cmd) - /* internal commands are handled in do_ipsintr */ - return ; - - DEBUG_VAR(2, "(%s%d) ips_chkstatus: cmd 0x%X id %d (%d %d %d)", - ips_name, - ha->host_num, - scb->cdb[0], - scb->cmd.basic_io.command_id, - scb->bus, - scb->target_id, - scb->lun); - - if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) - /* passthru - just returns the raw result */ - return ; - - errcode = DID_OK; - - if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) || - ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) { - - if (scb->bus == 0) { - if ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR) { - DEBUG_VAR(1, "(%s%d) Recovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x", - ips_name, ha->host_num, - scb->cmd.basic_io.op_code, basic_status, ext_status); - } - - switch (scb->scsi_cmd->cmnd[0]) { - case ALLOW_MEDIUM_REMOVAL: - case REZERO_UNIT: - case ERASE: - case WRITE_FILEMARKS: - case SPACE: - errcode = DID_ERROR; - break; - - case START_STOP: - break; - - case TEST_UNIT_READY: - if (scb->target_id == IPS_ADAPTER_ID) - break; - - if (!ips_online(ha, scb)) { - errcode = DID_TIME_OUT; - } - break; - - case INQUIRY: - if (scb->target_id == IPS_ADAPTER_ID) { - IPS_SCSI_INQ_DATA inquiry; - - memset(&inquiry, 0, sizeof(IPS_SCSI_INQ_DATA)); - - inquiry.DeviceType = IPS_SCSI_INQ_TYPE_PROCESSOR; - inquiry.DeviceTypeQualifier = IPS_SCSI_INQ_LU_CONNECTED; - inquiry.Version = IPS_SCSI_INQ_REV2; - inquiry.ResponseDataFormat = IPS_SCSI_INQ_RD_REV2; - inquiry.AdditionalLength = 31; - inquiry.Flags[0] = IPS_SCSI_INQ_Address16; - inquiry.Flags[1] = IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync; - strncpy(inquiry.VendorId, "IBM ", 8); - strncpy(inquiry.ProductId, "SERVERAID ", 16); - strncpy(inquiry.ProductRevisionLevel, "1.00", 4); - - memcpy(scb->scsi_cmd->request_buffer, &inquiry, scb->scsi_cmd->request_bufflen); - - scb->scsi_cmd->result = DID_OK << 16; - break; - } - - if (ips_online(ha, scb)) { - ips_inquiry(ha, scb); - } else { - errcode = DID_TIME_OUT; - } - break; - - case REQUEST_SENSE: - ips_reqsen(ha, scb); - break; - - case READ_6: - case WRITE_6: - case READ_10: - case WRITE_10: - case RESERVE: - case RELEASE: - break; - - case MODE_SENSE: - if (!ips_online(ha, scb) || !ips_msense(ha, scb)) { - errcode = DID_ERROR; - } - break; - - case READ_CAPACITY: - if (ips_online(ha, scb)) - ips_rdcap(ha, scb); - else { - errcode = DID_TIME_OUT; - } - break; - - case SEND_DIAGNOSTIC: - case REASSIGN_BLOCKS: - break; - - case FORMAT_UNIT: - errcode = DID_ERROR; - break; - - case SEEK_10: - case VERIFY: - case READ_DEFECT_DATA: - case READ_BUFFER: - case WRITE_BUFFER: - break; - - default: - errcode = DID_ERROR; - } /* end switch */ - - scb->scsi_cmd->result = errcode << 16; - } else { /* bus == 0 */ - /* restrict access to physical drives */ - if ((scb->scsi_cmd->cmnd[0] == INQUIRY) && - ((((char *) scb->scsi_cmd->buffer)[0] & 0x1f) == TYPE_DISK)) { - - scb->scsi_cmd->result = DID_TIME_OUT << 16; - } - } /* else */ - } else { /* recovered error / success */ - if (scb->bus == 0) { - DEBUG_VAR(1, "(%s%d) Unrecovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x", - ips_name, ha->host_num, - scb->cmd.basic_io.op_code, basic_status, ext_status); - } +ips_chkstatus(ips_ha_t * ha, IPS_STATUS * pstatus) +{ + ips_scb_t *scb; + ips_stat_t *sp; + uint8_t basic_status; + uint8_t ext_status; + int errcode; + + METHOD_TRACE("ips_chkstatus", 1); + + scb = &ha->scbs[pstatus->fields.command_id]; + scb->basic_status = basic_status = + pstatus->fields.basic_status & IPS_BASIC_STATUS_MASK; + scb->extended_status = ext_status = pstatus->fields.extended_status; + + sp = &ha->sp; + sp->residue_len = 0; + sp->scb_addr = (void *) scb; + + /* Remove the item from the active queue */ + ips_removeq_scb(&ha->scb_activelist, scb); + + if (!scb->scsi_cmd) + /* internal commands are handled in do_ipsintr */ + return; + + DEBUG_VAR(2, "(%s%d) ips_chkstatus: cmd 0x%X id %d (%d %d %d)", + ips_name, + ha->host_num, + scb->cdb[0], + scb->cmd.basic_io.command_id, + scb->bus, scb->target_id, scb->lun); + + if ((scb->scsi_cmd) && (ips_is_passthru(scb->scsi_cmd))) + /* passthru - just returns the raw result */ + return; + + errcode = DID_OK; + + if (((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_SUCCESS) || + ((basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_RECOVERED_ERROR)) { + + if (scb->bus == 0) { + if ((basic_status & IPS_GSC_STATUS_MASK) == + IPS_CMD_RECOVERED_ERROR) { + DEBUG_VAR(1, + "(%s%d) Recovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x", + ips_name, ha->host_num, + scb->cmd.basic_io.op_code, + basic_status, ext_status); + } + + switch (scb->scsi_cmd->cmnd[0]) { + case ALLOW_MEDIUM_REMOVAL: + case REZERO_UNIT: + case ERASE: + case WRITE_FILEMARKS: + case SPACE: + errcode = DID_ERROR; + break; + + case START_STOP: + break; + + case TEST_UNIT_READY: + if (!ips_online(ha, scb)) { + errcode = DID_TIME_OUT; + } + break; + + case INQUIRY: + if (ips_online(ha, scb)) { + ips_inquiry(ha, scb); + } else { + errcode = DID_TIME_OUT; + } + break; + + case REQUEST_SENSE: + ips_reqsen(ha, scb); + break; + + case READ_6: + case WRITE_6: + case READ_10: + case WRITE_10: + case RESERVE: + case RELEASE: + break; + + case MODE_SENSE: + if (!ips_online(ha, scb) + || !ips_msense(ha, scb)) { + errcode = DID_ERROR; + } + break; + + case READ_CAPACITY: + if (ips_online(ha, scb)) + ips_rdcap(ha, scb); + else { + errcode = DID_TIME_OUT; + } + break; + + case SEND_DIAGNOSTIC: + case REASSIGN_BLOCKS: + break; + + case FORMAT_UNIT: + errcode = DID_ERROR; + break; + + case SEEK_10: + case VERIFY: + case READ_DEFECT_DATA: + case READ_BUFFER: + case WRITE_BUFFER: + break; + + default: + errcode = DID_ERROR; + } /* end switch */ + + scb->scsi_cmd->result = errcode << 16; + } else { /* bus == 0 */ + /* restrict access to physical drives */ + if ((scb->scsi_cmd->cmnd[0] == INQUIRY) && + ((((char *) scb->scsi_cmd->buffer)[0] & 0x1f) == + TYPE_DISK)) { + + scb->scsi_cmd->result = DID_TIME_OUT << 16; + } + } /* else */ + } else { /* recovered error / success */ + if (scb->bus == 0) { + DEBUG_VAR(1, + "(%s%d) Unrecovered Logical Drive Error OpCode: %x, BSB: %x, ESB: %x", + ips_name, ha->host_num, + scb->cmd.basic_io.op_code, basic_status, + ext_status); + } - ips_map_status(ha, scb, sp); - } /* else */ + ips_map_status(ha, scb, sp); + } /* else */ } /****************************************************************************/ @@ -4814,25 +4267,30 @@ /* */ /****************************************************************************/ static int -ips_online(ips_ha_t *ha, ips_scb_t *scb) { - METHOD_TRACE("ips_online", 1); - - if (scb->target_id >= IPS_MAX_LD) - return (0); +ips_online(ips_ha_t * ha, ips_scb_t * scb) +{ + METHOD_TRACE("ips_online", 1); - if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) { - memset(&ha->adapt->logical_drive_info, 0, sizeof(ha->adapt->logical_drive_info)); + if (scb->target_id >= IPS_MAX_LD) + return (0); - return (0); - } - - if (ha->adapt->logical_drive_info.drive_info[scb->target_id].state != IPS_LD_OFFLINE && - ha->adapt->logical_drive_info.drive_info[scb->target_id].state != IPS_LD_FREE && - ha->adapt->logical_drive_info.drive_info[scb->target_id].state != IPS_LD_CRS && - ha->adapt->logical_drive_info.drive_info[scb->target_id].state != IPS_LD_SYS) - return (1); - else - return (0); + if ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1) { + memset(&ha->adapt->logical_drive_info, 0, + sizeof (ha->adapt->logical_drive_info)); + + return (0); + } + + if (ha->adapt->logical_drive_info.drive_info[scb->target_id].state != + IPS_LD_OFFLINE + && ha->adapt->logical_drive_info.drive_info[scb->target_id].state != + IPS_LD_FREE + && ha->adapt->logical_drive_info.drive_info[scb->target_id].state != + IPS_LD_CRS + && ha->adapt->logical_drive_info.drive_info[scb->target_id].state != + IPS_LD_SYS) return (1); + else + return (0); } /****************************************************************************/ @@ -4845,27 +4303,29 @@ /* */ /****************************************************************************/ static int -ips_inquiry(ips_ha_t *ha, ips_scb_t *scb) { - IPS_SCSI_INQ_DATA inquiry; +ips_inquiry(ips_ha_t * ha, ips_scb_t * scb) +{ + IPS_SCSI_INQ_DATA inquiry; - METHOD_TRACE("ips_inquiry", 1); + METHOD_TRACE("ips_inquiry", 1); - memset(&inquiry, 0, sizeof(IPS_SCSI_INQ_DATA)); + memset(&inquiry, 0, sizeof (IPS_SCSI_INQ_DATA)); - inquiry.DeviceType = IPS_SCSI_INQ_TYPE_DASD; - inquiry.DeviceTypeQualifier = IPS_SCSI_INQ_LU_CONNECTED; - inquiry.Version = IPS_SCSI_INQ_REV2; - inquiry.ResponseDataFormat = IPS_SCSI_INQ_RD_REV2; - inquiry.AdditionalLength = 31; - inquiry.Flags[0] = IPS_SCSI_INQ_Address16; - inquiry.Flags[1] = IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync; - strncpy(inquiry.VendorId, "IBM ", 8); - strncpy(inquiry.ProductId, "SERVERAID ", 16); - strncpy(inquiry.ProductRevisionLevel, "1.00", 4); + inquiry.DeviceType = IPS_SCSI_INQ_TYPE_DASD; + inquiry.DeviceTypeQualifier = IPS_SCSI_INQ_LU_CONNECTED; + inquiry.Version = IPS_SCSI_INQ_REV2; + inquiry.ResponseDataFormat = IPS_SCSI_INQ_RD_REV2; + inquiry.AdditionalLength = 31; + inquiry.Flags[0] = IPS_SCSI_INQ_Address16; + inquiry.Flags[1] = + IPS_SCSI_INQ_WBus16 | IPS_SCSI_INQ_Sync | IPS_SCSI_INQ_CmdQue; + strncpy(inquiry.VendorId, "IBM ", 8); + strncpy(inquiry.ProductId, "SERVERAID ", 16); + strncpy(inquiry.ProductRevisionLevel, "1.00", 4); - memcpy(scb->scsi_cmd->request_buffer, &inquiry, scb->scsi_cmd->request_bufflen); + ips_scmd_buf_write(scb->scsi_cmd, &inquiry, sizeof (inquiry)); - return (1); + return (1); } /****************************************************************************/ @@ -4878,20 +4338,24 @@ /* */ /****************************************************************************/ static int -ips_rdcap(ips_ha_t *ha, ips_scb_t *scb) { - IPS_SCSI_CAPACITY *cap; +ips_rdcap(ips_ha_t * ha, ips_scb_t * scb) +{ + IPS_SCSI_CAPACITY cap; - METHOD_TRACE("ips_rdcap", 1); + METHOD_TRACE("ips_rdcap", 1); - if (scb->scsi_cmd->bufflen < 8) - return (0); + if (scb->scsi_cmd->bufflen < 8) + return (0); - cap = (IPS_SCSI_CAPACITY *) scb->scsi_cmd->request_buffer; + cap.lba = + cpu_to_be32(le32_to_cpu + (ha->adapt->logical_drive_info. + drive_info[scb->target_id].sector_count) - 1); + cap.len = cpu_to_be32((uint32_t) IPS_BLKSIZE); - cap->lba = cpu_to_be32(le32_to_cpu(ha->adapt->logical_drive_info.drive_info[scb->target_id].sector_count) - 1); - cap->len = cpu_to_be32((uint32_t) IPS_BLKSIZE); + ips_scmd_buf_write(scb->scsi_cmd, &cap, sizeof (cap)); - return (1); + return (1); } /****************************************************************************/ @@ -4904,72 +4368,78 @@ /* */ /****************************************************************************/ static int -ips_msense(ips_ha_t *ha, ips_scb_t *scb) { - uint16_t heads; - uint16_t sectors; - uint32_t cylinders; - IPS_SCSI_MODE_PAGE_DATA mdata; - - METHOD_TRACE("ips_msense", 1); - - if (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) > 0x400000 && - (ha->enq->ucMiscFlag & 0x8) == 0) { - heads = IPS_NORM_HEADS; - sectors = IPS_NORM_SECTORS; - } else { - heads = IPS_COMP_HEADS; - sectors = IPS_COMP_SECTORS; - } - - cylinders = (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) - 1) / (heads * sectors); - - memset(&mdata, 0, sizeof(IPS_SCSI_MODE_PAGE_DATA)); - - mdata.hdr.BlockDescLength = 8; - - switch (scb->scsi_cmd->cmnd[2] & 0x3f) { - case 0x03: /* page 3 */ - mdata.pdata.pg3.PageCode = 3; - mdata.pdata.pg3.PageLength = sizeof(IPS_SCSI_MODE_PAGE3); - mdata.hdr.DataLength = 3 + mdata.hdr.BlockDescLength + mdata.pdata.pg3.PageLength; - mdata.pdata.pg3.TracksPerZone = 0; - mdata.pdata.pg3.AltSectorsPerZone = 0; - mdata.pdata.pg3.AltTracksPerZone = 0; - mdata.pdata.pg3.AltTracksPerVolume = 0; - mdata.pdata.pg3.SectorsPerTrack = cpu_to_be16(sectors); - mdata.pdata.pg3.BytesPerSector = cpu_to_be16(IPS_BLKSIZE); - mdata.pdata.pg3.Interleave = cpu_to_be16(1); - mdata.pdata.pg3.TrackSkew = 0; - mdata.pdata.pg3.CylinderSkew = 0; - mdata.pdata.pg3.flags = IPS_SCSI_MP3_SoftSector; - break; - - case 0x4: - mdata.pdata.pg4.PageCode = 4; - mdata.pdata.pg4.PageLength = sizeof(IPS_SCSI_MODE_PAGE4); - mdata.hdr.DataLength = 3 + mdata.hdr.BlockDescLength + mdata.pdata.pg4.PageLength; - mdata.pdata.pg4.CylindersHigh = cpu_to_be16((cylinders >> 8) & 0xFFFF); - mdata.pdata.pg4.CylindersLow = (cylinders & 0xFF); - mdata.pdata.pg4.Heads = heads; - mdata.pdata.pg4.WritePrecompHigh = 0; - mdata.pdata.pg4.WritePrecompLow = 0; - mdata.pdata.pg4.ReducedWriteCurrentHigh = 0; - mdata.pdata.pg4.ReducedWriteCurrentLow = 0; - mdata.pdata.pg4.StepRate = cpu_to_be16(1); - mdata.pdata.pg4.LandingZoneHigh = 0; - mdata.pdata.pg4.LandingZoneLow = 0; - mdata.pdata.pg4.flags = 0; - mdata.pdata.pg4.RotationalOffset = 0; - mdata.pdata.pg4.MediumRotationRate = 0; - break; - - default: - return (0); - } /* end switch */ +ips_msense(ips_ha_t * ha, ips_scb_t * scb) +{ + uint16_t heads; + uint16_t sectors; + uint32_t cylinders; + IPS_SCSI_MODE_PAGE_DATA mdata; + + METHOD_TRACE("ips_msense", 1); + + if (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) > 0x400000 && + (ha->enq->ucMiscFlag & 0x8) == 0) { + heads = IPS_NORM_HEADS; + sectors = IPS_NORM_SECTORS; + } else { + heads = IPS_COMP_HEADS; + sectors = IPS_COMP_SECTORS; + } + + cylinders = + (le32_to_cpu(ha->enq->ulDriveSize[scb->target_id]) - + 1) / (heads * sectors); + + memset(&mdata, 0, sizeof (IPS_SCSI_MODE_PAGE_DATA)); + + mdata.hdr.BlockDescLength = 8; + + switch (scb->scsi_cmd->cmnd[2] & 0x3f) { + case 0x03: /* page 3 */ + mdata.pdata.pg3.PageCode = 3; + mdata.pdata.pg3.PageLength = sizeof (IPS_SCSI_MODE_PAGE3); + mdata.hdr.DataLength = + 3 + mdata.hdr.BlockDescLength + mdata.pdata.pg3.PageLength; + mdata.pdata.pg3.TracksPerZone = 0; + mdata.pdata.pg3.AltSectorsPerZone = 0; + mdata.pdata.pg3.AltTracksPerZone = 0; + mdata.pdata.pg3.AltTracksPerVolume = 0; + mdata.pdata.pg3.SectorsPerTrack = cpu_to_be16(sectors); + mdata.pdata.pg3.BytesPerSector = cpu_to_be16(IPS_BLKSIZE); + mdata.pdata.pg3.Interleave = cpu_to_be16(1); + mdata.pdata.pg3.TrackSkew = 0; + mdata.pdata.pg3.CylinderSkew = 0; + mdata.pdata.pg3.flags = IPS_SCSI_MP3_SoftSector; + break; + + case 0x4: + mdata.pdata.pg4.PageCode = 4; + mdata.pdata.pg4.PageLength = sizeof (IPS_SCSI_MODE_PAGE4); + mdata.hdr.DataLength = + 3 + mdata.hdr.BlockDescLength + mdata.pdata.pg4.PageLength; + mdata.pdata.pg4.CylindersHigh = + cpu_to_be16((cylinders >> 8) & 0xFFFF); + mdata.pdata.pg4.CylindersLow = (cylinders & 0xFF); + mdata.pdata.pg4.Heads = heads; + mdata.pdata.pg4.WritePrecompHigh = 0; + mdata.pdata.pg4.WritePrecompLow = 0; + mdata.pdata.pg4.ReducedWriteCurrentHigh = 0; + mdata.pdata.pg4.ReducedWriteCurrentLow = 0; + mdata.pdata.pg4.StepRate = cpu_to_be16(1); + mdata.pdata.pg4.LandingZoneHigh = 0; + mdata.pdata.pg4.LandingZoneLow = 0; + mdata.pdata.pg4.flags = 0; + mdata.pdata.pg4.RotationalOffset = 0; + mdata.pdata.pg4.MediumRotationRate = 0; + break; + + default: + return (0); + } /* end switch */ - memcpy(scb->scsi_cmd->request_buffer, &mdata, scb->scsi_cmd->request_bufflen); + ips_scmd_buf_write(scb->scsi_cmd, &mdata, sizeof (mdata)); - return (1); + return (1); } /****************************************************************************/ @@ -4982,21 +4452,23 @@ /* */ /****************************************************************************/ static int -ips_reqsen(ips_ha_t *ha, ips_scb_t *scb) { - IPS_SCSI_REQSEN reqsen; +ips_reqsen(ips_ha_t * ha, ips_scb_t * scb) +{ + IPS_SCSI_REQSEN reqsen; - METHOD_TRACE("ips_reqsen", 1); + METHOD_TRACE("ips_reqsen", 1); - memset(&reqsen, 0, sizeof(IPS_SCSI_REQSEN)); + memset(&reqsen, 0, sizeof (IPS_SCSI_REQSEN)); - reqsen.ResponseCode = IPS_SCSI_REQSEN_VALID | IPS_SCSI_REQSEN_CURRENT_ERR; - reqsen.AdditionalLength = 10; - reqsen.AdditionalSenseCode = IPS_SCSI_REQSEN_NO_SENSE; - reqsen.AdditionalSenseCodeQual = IPS_SCSI_REQSEN_NO_SENSE; + reqsen.ResponseCode = + IPS_SCSI_REQSEN_VALID | IPS_SCSI_REQSEN_CURRENT_ERR; + reqsen.AdditionalLength = 10; + reqsen.AdditionalSenseCode = IPS_SCSI_REQSEN_NO_SENSE; + reqsen.AdditionalSenseCodeQual = IPS_SCSI_REQSEN_NO_SENSE; - memcpy(scb->scsi_cmd->request_buffer, &reqsen, scb->scsi_cmd->request_bufflen); + ips_scmd_buf_write(scb->scsi_cmd, &reqsen, sizeof (reqsen)); - return (1); + return (1); } /****************************************************************************/ @@ -5009,60 +4481,63 @@ /* */ /****************************************************************************/ static void -ips_free(ips_ha_t *ha) { +ips_free(ips_ha_t * ha) +{ - METHOD_TRACE("ips_free", 1); + METHOD_TRACE("ips_free", 1); - if (ha) { - if (ha->enq) { - kfree(ha->enq); - ha->enq = NULL; - } - - if (ha->conf) { - kfree(ha->conf); - ha->conf = NULL; - } - - if (ha->adapt) { - pci_free_consistent(ha->pcidev,sizeof(IPS_ADAPTER)+ sizeof(IPS_IO_CMD), - ha->adapt, ha->adapt->hw_status_start); - ha->adapt = NULL; - } - - if (ha->nvram) { - kfree(ha->nvram); - ha->nvram = NULL; - } - - if (ha->subsys) { - kfree(ha->subsys); - ha->subsys = NULL; - } - - if (ha->ioctl_data) { - free_pages((unsigned long) ha->ioctl_data, ha->ioctl_order); - ha->ioctl_data = NULL; - ha->ioctl_datasize = 0; - ha->ioctl_order = 0; - } - ips_deallocatescbs(ha, ha->max_cmds); - - /* free memory mapped (if applicable) */ - if (ha->mem_ptr) { - iounmap(ha->ioremap_ptr); - ha->ioremap_ptr = NULL; - ha->mem_ptr = NULL; - } - -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) - if (ha->mem_addr) - release_mem_region(ha->mem_addr, ha->mem_len); -#endif - ha->mem_addr = 0; + if (ha) { + if (ha->enq) { + kfree(ha->enq); + ha->enq = NULL; + } + + if (ha->conf) { + kfree(ha->conf); + ha->conf = NULL; + } + + if (ha->adapt) { + pci_free_consistent(ha->pcidev, + sizeof (IPS_ADAPTER) + + sizeof (IPS_IO_CMD), ha->adapt, + ha->adapt->hw_status_start); + ha->adapt = NULL; + } + + if (ha->nvram) { + kfree(ha->nvram); + ha->nvram = NULL; + } + + if (ha->subsys) { + kfree(ha->subsys); + ha->subsys = NULL; + } + + if (ha->ioctl_data) { + free_pages((unsigned long) ha->ioctl_data, + ha->ioctl_order); + ha->ioctl_data = NULL; + ha->ioctl_datasize = 0; + ha->ioctl_order = 0; + } + ips_deallocatescbs(ha, ha->max_cmds); + + /* free memory mapped (if applicable) */ + if (ha->mem_ptr) { + iounmap(ha->ioremap_ptr); + ha->ioremap_ptr = NULL; + ha->mem_ptr = NULL; + } + + if (ha->mem_addr) + release_mem_region(ha->mem_addr, ha->mem_len); + ha->mem_addr = 0; - } + } } + /****************************************************************************/ /* */ /* Routine Name: ips_deallocatescbs */ @@ -5073,15 +4548,18 @@ /* */ /****************************************************************************/ static int -ips_deallocatescbs(ips_ha_t *ha, int cmds) { - if (ha->scbs) { - pci_free_consistent(ha->pcidev,sizeof(IPS_SG_LIST) * IPS_MAX_SG * - cmds, ha->scbs->sg_list, ha->scbs->sg_busaddr); - pci_free_consistent(ha->pcidev, sizeof(ips_scb_t) * cmds, - ha->scbs, ha->scbs->scb_busaddr); - ha->scbs = NULL; - } /* end if */ -return 1; +ips_deallocatescbs(ips_ha_t * ha, int cmds) +{ + if (ha->scbs) { + pci_free_consistent(ha->pcidev, + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * cmds, + ha->scbs->sg_list.list, + ha->scbs->sg_busaddr); + pci_free_consistent(ha->pcidev, sizeof (ips_scb_t) * cmds, + ha->scbs, ha->scbs->scb_busaddr); + ha->scbs = NULL; + } /* end if */ + return 1; } /****************************************************************************/ @@ -5094,44 +4572,59 @@ /* */ /****************************************************************************/ static int -ips_allocatescbs(ips_ha_t *ha) { - ips_scb_t *scb_p; - IPS_SG_LIST* ips_sg; - int i; - dma_addr_t command_dma, sg_dma; - - METHOD_TRACE("ips_allocatescbs", 1); - - /* Allocate memory for the SCBs */ - ha->scbs = pci_alloc_consistent(ha->pcidev, ha->max_cmds * sizeof(ips_scb_t), - &command_dma); - if (ha->scbs == NULL) - return 0; - ips_sg = pci_alloc_consistent(ha->pcidev, sizeof(IPS_SG_LIST) * IPS_MAX_SG * - ha->max_cmds, &sg_dma); - if(ips_sg == NULL){ - pci_free_consistent(ha->pcidev,ha->max_cmds * sizeof(ips_scb_t),ha->scbs, command_dma); - return 0; - } - - memset(ha->scbs, 0, ha->max_cmds * sizeof(ips_scb_t)); - - for (i = 0; i < ha->max_cmds; i++) { - scb_p = &ha->scbs[i]; - scb_p->scb_busaddr = command_dma + sizeof(ips_scb_t) * i; - /* set up S/G list */ - scb_p->sg_list = ips_sg + i * IPS_MAX_SG; - scb_p->sg_busaddr = sg_dma + sizeof(IPS_SG_LIST) * IPS_MAX_SG * i; - - /* add to the free list */ - if (i < ha->max_cmds - 1) { - scb_p->q_next = ha->scb_freelist; - ha->scb_freelist = scb_p; - } - } +ips_allocatescbs(ips_ha_t * ha) +{ + ips_scb_t *scb_p; + IPS_SG_LIST ips_sg; + int i; + dma_addr_t command_dma, sg_dma; + + METHOD_TRACE("ips_allocatescbs", 1); + + /* Allocate memory for the SCBs */ + ha->scbs = + pci_alloc_consistent(ha->pcidev, ha->max_cmds * sizeof (ips_scb_t), + &command_dma); + if (ha->scbs == NULL) + return 0; + ips_sg.list = + pci_alloc_consistent(ha->pcidev, + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * + ha->max_cmds, &sg_dma); + if (ips_sg.list == NULL) { + pci_free_consistent(ha->pcidev, + ha->max_cmds * sizeof (ips_scb_t), ha->scbs, + command_dma); + return 0; + } + + memset(ha->scbs, 0, ha->max_cmds * sizeof (ips_scb_t)); + + for (i = 0; i < ha->max_cmds; i++) { + scb_p = &ha->scbs[i]; + scb_p->scb_busaddr = command_dma + sizeof (ips_scb_t) * i; + /* set up S/G list */ + if (IPS_USE_ENH_SGLIST(ha)) { + scb_p->sg_list.enh_list = + ips_sg.enh_list + i * IPS_MAX_SG; + scb_p->sg_busaddr = + sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i; + } else { + scb_p->sg_list.std_list = + ips_sg.std_list + i * IPS_MAX_SG; + scb_p->sg_busaddr = + sg_dma + IPS_SGLIST_SIZE(ha) * IPS_MAX_SG * i; + } + + /* add to the free list */ + if (i < ha->max_cmds - 1) { + scb_p->q_next = ha->scb_freelist; + ha->scb_freelist = scb_p; + } + } - /* success */ - return (1); + /* success */ + return (1); } /****************************************************************************/ @@ -5144,36 +4637,37 @@ /* */ /****************************************************************************/ static void -ips_init_scb(ips_ha_t *ha, ips_scb_t *scb) { - IPS_SG_LIST *sg_list; - uint32_t cmd_busaddr, sg_busaddr; - METHOD_TRACE("ips_init_scb", 1); - - if (scb == NULL) - return ; - - sg_list = scb->sg_list; - cmd_busaddr = scb->scb_busaddr; - sg_busaddr = scb->sg_busaddr; - /* zero fill */ - memset(scb, 0, sizeof(ips_scb_t)); - memset(ha->dummy, 0, sizeof(IPS_IO_CMD)); - - /* Initialize dummy command bucket */ - ha->dummy->op_code = 0xFF; - ha->dummy->ccsar = cpu_to_le32(ha->adapt->hw_status_start - + sizeof(IPS_ADAPTER)); - ha->dummy->command_id = IPS_MAX_CMDS; - - /* set bus address of scb */ - scb->scb_busaddr = cmd_busaddr; - scb->sg_busaddr = sg_busaddr; - scb->sg_list = sg_list; - - /* Neptune Fix */ - scb->cmd.basic_io.cccr = cpu_to_le32((uint32_t) IPS_BIT_ILE); - scb->cmd.basic_io.ccsar = cpu_to_le32(ha->adapt->hw_status_start - + sizeof(IPS_ADAPTER)); +ips_init_scb(ips_ha_t * ha, ips_scb_t * scb) +{ + IPS_SG_LIST sg_list; + uint32_t cmd_busaddr, sg_busaddr; + METHOD_TRACE("ips_init_scb", 1); + + if (scb == NULL) + return; + + sg_list.list = scb->sg_list.list; + cmd_busaddr = scb->scb_busaddr; + sg_busaddr = scb->sg_busaddr; + /* zero fill */ + memset(scb, 0, sizeof (ips_scb_t)); + memset(ha->dummy, 0, sizeof (IPS_IO_CMD)); + + /* Initialize dummy command bucket */ + ha->dummy->op_code = 0xFF; + ha->dummy->ccsar = cpu_to_le32(ha->adapt->hw_status_start + + sizeof (IPS_ADAPTER)); + ha->dummy->command_id = IPS_MAX_CMDS; + + /* set bus address of scb */ + scb->scb_busaddr = cmd_busaddr; + scb->sg_busaddr = sg_busaddr; + scb->sg_list.list = sg_list.list; + + /* Neptune Fix */ + scb->cmd.basic_io.cccr = cpu_to_le32((uint32_t) IPS_BIT_ILE); + scb->cmd.basic_io.ccsar = cpu_to_le32(ha->adapt->hw_status_start + + sizeof (IPS_ADAPTER)); } /****************************************************************************/ @@ -5188,22 +4682,23 @@ /* */ /****************************************************************************/ static ips_scb_t * -ips_getscb(ips_ha_t *ha) { - ips_scb_t *scb; +ips_getscb(ips_ha_t * ha) +{ + ips_scb_t *scb; - METHOD_TRACE("ips_getscb", 1); + METHOD_TRACE("ips_getscb", 1); - if ((scb = ha->scb_freelist) == NULL) { + if ((scb = ha->scb_freelist) == NULL) { - return (NULL); - } + return (NULL); + } - ha->scb_freelist = scb->q_next; - scb->q_next = NULL; + ha->scb_freelist = scb->q_next; + scb->q_next = NULL; - ips_init_scb(ha, scb); + ips_init_scb(ha, scb); - return (scb); + return (scb); } /****************************************************************************/ @@ -5218,22 +4713,22 @@ /* */ /****************************************************************************/ static void -ips_freescb(ips_ha_t *ha, ips_scb_t *scb) { +ips_freescb(ips_ha_t * ha, ips_scb_t * scb) +{ - METHOD_TRACE("ips_freescb", 1); - if(scb->flags & IPS_SCB_MAP_SG) - pci_unmap_sg(ha->pcidev, scb->scsi_cmd->request_buffer, - scb->scsi_cmd->use_sg, - IPS_DMA_DIR(scb)); - else if(scb->flags & IPS_SCB_MAP_SINGLE) - pci_unmap_single(ha->pcidev, scb->data_busaddr, scb->data_len, - IPS_DMA_DIR(scb)); - - /* check to make sure this is not our "special" scb */ - if (IPS_COMMAND_ID(ha, scb) < (ha->max_cmds - 1)) { - scb->q_next = ha->scb_freelist; - ha->scb_freelist = scb; - } + METHOD_TRACE("ips_freescb", 1); + if (scb->flags & IPS_SCB_MAP_SG) + pci_unmap_sg(ha->pcidev, scb->scsi_cmd->request_buffer, + scb->scsi_cmd->use_sg, IPS_DMA_DIR(scb)); + else if (scb->flags & IPS_SCB_MAP_SINGLE) + pci_unmap_single(ha->pcidev, scb->data_busaddr, scb->data_len, + IPS_DMA_DIR(scb)); + + /* check to make sure this is not our "special" scb */ + if (IPS_COMMAND_ID(ha, scb) < (ha->max_cmds - 1)) { + scb->q_next = ha->scb_freelist; + ha->scb_freelist = scb; + } } /****************************************************************************/ @@ -5246,19 +4741,20 @@ /* */ /****************************************************************************/ static int -ips_isinit_copperhead(ips_ha_t *ha) { - uint8_t scpr; - uint8_t isr; - - METHOD_TRACE("ips_isinit_copperhead", 1); - - isr = inb(ha->io_addr + IPS_REG_HISR); - scpr = inb(ha->io_addr + IPS_REG_SCPR); - - if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0)) - return (0); - else - return (1); +ips_isinit_copperhead(ips_ha_t * ha) +{ + uint8_t scpr; + uint8_t isr; + + METHOD_TRACE("ips_isinit_copperhead", 1); + + isr = inb(ha->io_addr + IPS_REG_HISR); + scpr = inb(ha->io_addr + IPS_REG_SCPR); + + if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0)) + return (0); + else + return (1); } /****************************************************************************/ @@ -5271,19 +4767,20 @@ /* */ /****************************************************************************/ static int -ips_isinit_copperhead_memio(ips_ha_t *ha) { - uint8_t isr=0; - uint8_t scpr; - - METHOD_TRACE("ips_is_init_copperhead_memio", 1); - - isr = readb(ha->mem_ptr + IPS_REG_HISR); - scpr = readb(ha->mem_ptr + IPS_REG_SCPR); - - if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0)) - return (0); - else - return (1); +ips_isinit_copperhead_memio(ips_ha_t * ha) +{ + uint8_t isr = 0; + uint8_t scpr; + + METHOD_TRACE("ips_is_init_copperhead_memio", 1); + + isr = readb(ha->mem_ptr + IPS_REG_HISR); + scpr = readb(ha->mem_ptr + IPS_REG_SCPR); + + if (((isr & IPS_BIT_EI) == 0) && ((scpr & IPS_BIT_EBM) == 0)) + return (0); + else + return (1); } /****************************************************************************/ @@ -5296,21 +4793,22 @@ /* */ /****************************************************************************/ static int -ips_isinit_morpheus(ips_ha_t *ha) { - uint32_t post; - uint32_t bits; - - METHOD_TRACE("ips_is_init_morpheus", 1); - - post = readl(ha->mem_ptr + IPS_REG_I960_MSG0); - bits = readl(ha->mem_ptr + IPS_REG_I2O_HIR); - - if (post == 0) - return (0); - else if (bits & 0x3) - return (0); - else - return (1); +ips_isinit_morpheus(ips_ha_t * ha) +{ + uint32_t post; + uint32_t bits; + + METHOD_TRACE("ips_is_init_morpheus", 1); + + post = readl(ha->mem_ptr + IPS_REG_I960_MSG0); + bits = readl(ha->mem_ptr + IPS_REG_I2O_HIR); + + if (post == 0) + return (0); + else if (bits & 0x3) + return (0); + else + return (1); } /****************************************************************************/ @@ -5322,10 +4820,12 @@ /* */ /****************************************************************************/ static void -ips_enable_int_copperhead(ips_ha_t *ha) { - METHOD_TRACE("ips_enable_int_copperhead", 1); +ips_enable_int_copperhead(ips_ha_t * ha) +{ + METHOD_TRACE("ips_enable_int_copperhead", 1); - outb(ha->io_addr + IPS_REG_HISR, IPS_BIT_EI); + outb(ha->io_addr + IPS_REG_HISR, IPS_BIT_EI); + inb(ha->io_addr + IPS_REG_HISR); // Ensure PCI Posting Completes } /****************************************************************************/ @@ -5337,10 +4837,12 @@ /* */ /****************************************************************************/ static void -ips_enable_int_copperhead_memio(ips_ha_t *ha) { - METHOD_TRACE("ips_enable_int_copperhead_memio", 1); +ips_enable_int_copperhead_memio(ips_ha_t * ha) +{ + METHOD_TRACE("ips_enable_int_copperhead_memio", 1); - writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR); + writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR); + readb(ha->mem_ptr + IPS_REG_HISR); // Ensure PCI Posting Completes } /****************************************************************************/ @@ -5352,14 +4854,16 @@ /* */ /****************************************************************************/ static void -ips_enable_int_morpheus(ips_ha_t *ha) { - uint32_t Oimr; +ips_enable_int_morpheus(ips_ha_t * ha) +{ + uint32_t Oimr; - METHOD_TRACE("ips_enable_int_morpheus", 1); + METHOD_TRACE("ips_enable_int_morpheus", 1); - Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR); - Oimr &= ~0x08; - writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR); + Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR); + Oimr &= ~0x08; + writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR); + readl(ha->mem_ptr + IPS_REG_I960_OIMR); // Ensure PCI Posting Completes } /****************************************************************************/ @@ -5372,86 +4876,88 @@ /* */ /****************************************************************************/ static int -ips_init_copperhead(ips_ha_t *ha) { - uint8_t Isr; - uint8_t Cbsp; - uint8_t PostByte[IPS_MAX_POST_BYTES]; - uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES]; - int i, j; - - METHOD_TRACE("ips_init_copperhead", 1); - - for (i = 0; i < IPS_MAX_POST_BYTES; i++) { - for (j = 0; j < 45; j++) { - Isr = inb(ha->io_addr + IPS_REG_HISR); - if (Isr & IPS_BIT_GHI) - break; - - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (j >= 45) - /* error occurred */ - return (0); - - PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR); - outb(Isr, ha->io_addr + IPS_REG_HISR); - } - - if (PostByte[0] < IPS_GOOD_POST_STATUS) { - printk(KERN_WARNING "(%s%d) reset controller fails (post status %x %x).\n", - ips_name, ha->host_num, PostByte[0], PostByte[1]); - - return (0); - } - - for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) { - for (j = 0; j < 240; j++) { - Isr = inb(ha->io_addr + IPS_REG_HISR); - if (Isr & IPS_BIT_GHI) - break; - - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (j >= 240) - /* error occurred */ - return (0); - - ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR); - outb(Isr, ha->io_addr + IPS_REG_HISR); - } - - for (i = 0; i < 240; i++) { - Cbsp = inb(ha->io_addr + IPS_REG_CBSP); - - if ((Cbsp & IPS_BIT_OP) == 0) - break; - - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (i >= 240) - /* reset failed */ - return (0); - - /* setup CCCR */ - outl(cpu_to_le32(0x1010), ha->io_addr + IPS_REG_CCCR); - - /* Enable busmastering */ - outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR); - - if (ha->revision_id == IPS_REVID_TROMBONE64) - /* fix for anaconda64 */ - outl(0, ha->io_addr + IPS_REG_NDAE); +ips_init_copperhead(ips_ha_t * ha) +{ + uint8_t Isr; + uint8_t Cbsp; + uint8_t PostByte[IPS_MAX_POST_BYTES]; + uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES]; + int i, j; + + METHOD_TRACE("ips_init_copperhead", 1); + + for (i = 0; i < IPS_MAX_POST_BYTES; i++) { + for (j = 0; j < 45; j++) { + Isr = inb(ha->io_addr + IPS_REG_HISR); + if (Isr & IPS_BIT_GHI) + break; + + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (j >= 45) + /* error occurred */ + return (0); + + PostByte[i] = inb(ha->io_addr + IPS_REG_ISPR); + outb(Isr, ha->io_addr + IPS_REG_HISR); + } + + if (PostByte[0] < IPS_GOOD_POST_STATUS) { + printk(KERN_WARNING + "(%s%d) reset controller fails (post status %x %x).\n", + ips_name, ha->host_num, PostByte[0], PostByte[1]); + + return (0); + } + + for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) { + for (j = 0; j < 240; j++) { + Isr = inb(ha->io_addr + IPS_REG_HISR); + if (Isr & IPS_BIT_GHI) + break; + + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (j >= 240) + /* error occurred */ + return (0); + + ConfigByte[i] = inb(ha->io_addr + IPS_REG_ISPR); + outb(Isr, ha->io_addr + IPS_REG_HISR); + } + + for (i = 0; i < 240; i++) { + Cbsp = inb(ha->io_addr + IPS_REG_CBSP); + + if ((Cbsp & IPS_BIT_OP) == 0) + break; + + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (i >= 240) + /* reset failed */ + return (0); + + /* setup CCCR */ + outl(cpu_to_le32(0x1010), ha->io_addr + IPS_REG_CCCR); + + /* Enable busmastering */ + outb(IPS_BIT_EBM, ha->io_addr + IPS_REG_SCPR); + + if (ha->revision_id == IPS_REVID_TROMBONE64) + /* fix for anaconda64 */ + outl(0, ha->io_addr + IPS_REG_NDAE); - /* Enable interrupts */ - outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR); + /* Enable interrupts */ + outb(IPS_BIT_EI, ha->io_addr + IPS_REG_HISR); - return (1); + return (1); } /****************************************************************************/ @@ -5464,87 +4970,89 @@ /* */ /****************************************************************************/ static int -ips_init_copperhead_memio(ips_ha_t *ha) { - uint8_t Isr=0; - uint8_t Cbsp; - uint8_t PostByte[IPS_MAX_POST_BYTES]; - uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES]; - int i, j; - - METHOD_TRACE("ips_init_copperhead_memio", 1); - - for (i = 0; i < IPS_MAX_POST_BYTES; i++) { - for (j = 0; j < 45; j++) { - Isr = readb(ha->mem_ptr + IPS_REG_HISR); - if (Isr & IPS_BIT_GHI) - break; - - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (j >= 45) - /* error occurred */ - return (0); - - PostByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR); - writeb(Isr, ha->mem_ptr + IPS_REG_HISR); - } - - if (PostByte[0] < IPS_GOOD_POST_STATUS) { - printk(KERN_WARNING "(%s%d) reset controller fails (post status %x %x).\n", - ips_name, ha->host_num, PostByte[0], PostByte[1]); - - return (0); - } - - for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) { - for (j = 0; j < 240; j++) { - Isr = readb(ha->mem_ptr + IPS_REG_HISR); - if (Isr & IPS_BIT_GHI) - break; - - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (j >= 240) - /* error occurred */ - return (0); - - ConfigByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR); - writeb(Isr, ha->mem_ptr + IPS_REG_HISR); - } - - for (i = 0; i < 240; i++) { - Cbsp = readb(ha->mem_ptr + IPS_REG_CBSP); - - if ((Cbsp & IPS_BIT_OP) == 0) - break; - - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (i >= 240) - /* error occurred */ - return (0); - - /* setup CCCR */ - writel(0x1010, ha->mem_ptr + IPS_REG_CCCR); - - /* Enable busmastering */ - writeb(IPS_BIT_EBM, ha->mem_ptr + IPS_REG_SCPR); - - if (ha->revision_id == IPS_REVID_TROMBONE64) - /* fix for anaconda64 */ - writel(0, ha->mem_ptr + IPS_REG_NDAE); +ips_init_copperhead_memio(ips_ha_t * ha) +{ + uint8_t Isr = 0; + uint8_t Cbsp; + uint8_t PostByte[IPS_MAX_POST_BYTES]; + uint8_t ConfigByte[IPS_MAX_CONFIG_BYTES]; + int i, j; + + METHOD_TRACE("ips_init_copperhead_memio", 1); + + for (i = 0; i < IPS_MAX_POST_BYTES; i++) { + for (j = 0; j < 45; j++) { + Isr = readb(ha->mem_ptr + IPS_REG_HISR); + if (Isr & IPS_BIT_GHI) + break; + + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (j >= 45) + /* error occurred */ + return (0); + + PostByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR); + writeb(Isr, ha->mem_ptr + IPS_REG_HISR); + } + + if (PostByte[0] < IPS_GOOD_POST_STATUS) { + printk(KERN_WARNING + "(%s%d) reset controller fails (post status %x %x).\n", + ips_name, ha->host_num, PostByte[0], PostByte[1]); + + return (0); + } + + for (i = 0; i < IPS_MAX_CONFIG_BYTES; i++) { + for (j = 0; j < 240; j++) { + Isr = readb(ha->mem_ptr + IPS_REG_HISR); + if (Isr & IPS_BIT_GHI) + break; + + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (j >= 240) + /* error occurred */ + return (0); + + ConfigByte[i] = readb(ha->mem_ptr + IPS_REG_ISPR); + writeb(Isr, ha->mem_ptr + IPS_REG_HISR); + } + + for (i = 0; i < 240; i++) { + Cbsp = readb(ha->mem_ptr + IPS_REG_CBSP); + + if ((Cbsp & IPS_BIT_OP) == 0) + break; + + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (i >= 240) + /* error occurred */ + return (0); + + /* setup CCCR */ + writel(0x1010, ha->mem_ptr + IPS_REG_CCCR); + + /* Enable busmastering */ + writeb(IPS_BIT_EBM, ha->mem_ptr + IPS_REG_SCPR); + + if (ha->revision_id == IPS_REVID_TROMBONE64) + /* fix for anaconda64 */ + writel(0, ha->mem_ptr + IPS_REG_NDAE); - /* Enable interrupts */ - writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR); + /* Enable interrupts */ + writeb(IPS_BIT_EI, ha->mem_ptr + IPS_REG_HISR); - /* if we get here then everything went OK */ - return (1); + /* if we get here then everything went OK */ + return (1); } /****************************************************************************/ @@ -5557,109 +5065,112 @@ /* */ /****************************************************************************/ static int -ips_init_morpheus(ips_ha_t *ha) { - uint32_t Post; - uint32_t Config; - uint32_t Isr; - uint32_t Oimr; - int i; - - METHOD_TRACE("ips_init_morpheus", 1); - - /* Wait up to 45 secs for Post */ - for (i = 0; i < 45; i++) { - Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR); - - if (Isr & IPS_BIT_I960_MSG0I) - break; - - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (i >= 45) { - /* error occurred */ - printk(KERN_WARNING "(%s%d) timeout waiting for post.\n", - ips_name, ha->host_num); - - return (0); - } - - Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0); - - if (Post == 0x4F00) { /* If Flashing the Battery PIC */ - printk(KERN_WARNING "Flashing Battery PIC, Please wait ...\n" ); - - /* Clear the interrupt bit */ - Isr = (uint32_t) IPS_BIT_I960_MSG0I; - writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR); - - for (i = 0; i < 120; i++) { /* Wait Up to 2 Min. for Completion */ - Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0); - if (Post != 0x4F00) - break; - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (i >= 120) { - printk(KERN_WARNING "(%s%d) timeout waiting for Battery PIC Flash\n", - ips_name, ha->host_num); - return (0); - } - - } - - /* Clear the interrupt bit */ - Isr = (uint32_t) IPS_BIT_I960_MSG0I; - writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR); - - if (Post < (IPS_GOOD_POST_STATUS << 8)) { - printk(KERN_WARNING "(%s%d) reset controller fails (post status %x).\n", - ips_name, ha->host_num, Post); - - return (0); - } - - /* Wait up to 240 secs for config bytes */ - for (i = 0; i < 240; i++) { - Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR); - - if (Isr & IPS_BIT_I960_MSG1I) - break; - - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - } - - if (i >= 240) { - /* error occurred */ - printk(KERN_WARNING "(%s%d) timeout waiting for config.\n", - ips_name, ha->host_num); - - return (0); - } - - Config = readl(ha->mem_ptr + IPS_REG_I960_MSG1); - - /* Clear interrupt bit */ - Isr = (uint32_t) IPS_BIT_I960_MSG1I; - writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR); - - /* Turn on the interrupts */ - Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR); - Oimr &= ~0x8; - writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR); - - /* if we get here then everything went OK */ - - /* Since we did a RESET, an EraseStripeLock may be needed */ - if (Post == 0xEF10) { - if ( (Config == 0x000F) || (Config == 0x0009) ) - ha->requires_esl = 1; - } +ips_init_morpheus(ips_ha_t * ha) +{ + uint32_t Post; + uint32_t Config; + uint32_t Isr; + uint32_t Oimr; + int i; + + METHOD_TRACE("ips_init_morpheus", 1); + + /* Wait up to 45 secs for Post */ + for (i = 0; i < 45; i++) { + Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR); + + if (Isr & IPS_BIT_I960_MSG0I) + break; + + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (i >= 45) { + /* error occurred */ + printk(KERN_WARNING "(%s%d) timeout waiting for post.\n", + ips_name, ha->host_num); + + return (0); + } + + Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0); + + if (Post == 0x4F00) { /* If Flashing the Battery PIC */ + printk(KERN_WARNING "Flashing Battery PIC, Please wait ...\n"); + + /* Clear the interrupt bit */ + Isr = (uint32_t) IPS_BIT_I960_MSG0I; + writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR); + + for (i = 0; i < 120; i++) { /* Wait Up to 2 Min. for Completion */ + Post = readl(ha->mem_ptr + IPS_REG_I960_MSG0); + if (Post != 0x4F00) + break; + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (i >= 120) { + printk(KERN_WARNING + "(%s%d) timeout waiting for Battery PIC Flash\n", + ips_name, ha->host_num); + return (0); + } + + } + + /* Clear the interrupt bit */ + Isr = (uint32_t) IPS_BIT_I960_MSG0I; + writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR); + + if (Post < (IPS_GOOD_POST_STATUS << 8)) { + printk(KERN_WARNING + "(%s%d) reset controller fails (post status %x).\n", + ips_name, ha->host_num, Post); + + return (0); + } + + /* Wait up to 240 secs for config bytes */ + for (i = 0; i < 240; i++) { + Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR); + + if (Isr & IPS_BIT_I960_MSG1I) + break; + + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); + } + + if (i >= 240) { + /* error occurred */ + printk(KERN_WARNING "(%s%d) timeout waiting for config.\n", + ips_name, ha->host_num); + + return (0); + } + + Config = readl(ha->mem_ptr + IPS_REG_I960_MSG1); + + /* Clear interrupt bit */ + Isr = (uint32_t) IPS_BIT_I960_MSG1I; + writel(Isr, ha->mem_ptr + IPS_REG_I2O_HIR); + + /* Turn on the interrupts */ + Oimr = readl(ha->mem_ptr + IPS_REG_I960_OIMR); + Oimr &= ~0x8; + writel(Oimr, ha->mem_ptr + IPS_REG_I960_OIMR); + + /* if we get here then everything went OK */ + + /* Since we did a RESET, an EraseStripeLock may be needed */ + if (Post == 0xEF10) { + if ((Config == 0x000F) || (Config == 0x0009)) + ha->requires_esl = 1; + } - return (1); + return (1); } /****************************************************************************/ @@ -5672,38 +5183,39 @@ /* */ /****************************************************************************/ static int -ips_reset_copperhead(ips_ha_t *ha) { - int reset_counter; +ips_reset_copperhead(ips_ha_t * ha) +{ + int reset_counter; - METHOD_TRACE("ips_reset_copperhead", 1); + METHOD_TRACE("ips_reset_copperhead", 1); - DEBUG_VAR(1, "(%s%d) ips_reset_copperhead: io addr: %x, irq: %d", - ips_name, ha->host_num, ha->io_addr, ha->irq); + DEBUG_VAR(1, "(%s%d) ips_reset_copperhead: io addr: %x, irq: %d", + ips_name, ha->host_num, ha->io_addr, ha->irq); - reset_counter = 0; + reset_counter = 0; - while (reset_counter < 2) { - reset_counter++; + while (reset_counter < 2) { + reset_counter++; - outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR); + outb(IPS_BIT_RST, ha->io_addr + IPS_REG_SCPR); - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - - outb(0, ha->io_addr + IPS_REG_SCPR); + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - - if ((*ha->func.init)(ha)) - break; - else if (reset_counter >= 2) { + outb(0, ha->io_addr + IPS_REG_SCPR); - return (0); - } - } + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); - return (1); + if ((*ha->func.init) (ha)) + break; + else if (reset_counter >= 2) { + + return (0); + } + } + + return (1); } /****************************************************************************/ @@ -5716,38 +5228,39 @@ /* */ /****************************************************************************/ static int -ips_reset_copperhead_memio(ips_ha_t *ha) { - int reset_counter; +ips_reset_copperhead_memio(ips_ha_t * ha) +{ + int reset_counter; - METHOD_TRACE("ips_reset_copperhead_memio", 1); + METHOD_TRACE("ips_reset_copperhead_memio", 1); - DEBUG_VAR(1, "(%s%d) ips_reset_copperhead_memio: mem addr: %x, irq: %d", - ips_name, ha->host_num, ha->mem_addr, ha->irq); + DEBUG_VAR(1, "(%s%d) ips_reset_copperhead_memio: mem addr: %x, irq: %d", + ips_name, ha->host_num, ha->mem_addr, ha->irq); - reset_counter = 0; + reset_counter = 0; - while (reset_counter < 2) { - reset_counter++; + while (reset_counter < 2) { + reset_counter++; - writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR); + writeb(IPS_BIT_RST, ha->mem_ptr + IPS_REG_SCPR); - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - - writeb(0, ha->mem_ptr + IPS_REG_SCPR); + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); - /* Delay for 1 Second */ - MDELAY(IPS_ONE_SEC); - - if ((*ha->func.init)(ha)) - break; - else if (reset_counter >= 2) { + writeb(0, ha->mem_ptr + IPS_REG_SCPR); - return (0); - } - } + /* Delay for 1 Second */ + MDELAY(IPS_ONE_SEC); - return (1); + if ((*ha->func.init) (ha)) + break; + else if (reset_counter >= 2) { + + return (0); + } + } + + return (1); } /****************************************************************************/ @@ -5760,37 +5273,38 @@ /* */ /****************************************************************************/ static int -ips_reset_morpheus(ips_ha_t *ha) { - int reset_counter; - uint8_t junk; +ips_reset_morpheus(ips_ha_t * ha) +{ + int reset_counter; + uint8_t junk; + + METHOD_TRACE("ips_reset_morpheus", 1); - METHOD_TRACE("ips_reset_morpheus", 1); + DEBUG_VAR(1, "(%s%d) ips_reset_morpheus: mem addr: %x, irq: %d", + ips_name, ha->host_num, ha->mem_addr, ha->irq); - DEBUG_VAR(1, "(%s%d) ips_reset_morpheus: mem addr: %x, irq: %d", - ips_name, ha->host_num, ha->mem_addr, ha->irq); + reset_counter = 0; - reset_counter = 0; + while (reset_counter < 2) { + reset_counter++; - while (reset_counter < 2) { - reset_counter++; + writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR); - writel(0x80000000, ha->mem_ptr + IPS_REG_I960_IDR); + /* Delay for 5 Seconds */ + MDELAY(5 * IPS_ONE_SEC); - /* Delay for 5 Seconds */ - MDELAY(5 * IPS_ONE_SEC); - - /* Do a PCI config read to wait for adapter */ - pci_read_config_byte(ha->pcidev, 4, &junk); + /* Do a PCI config read to wait for adapter */ + pci_read_config_byte(ha->pcidev, 4, &junk); - if ((*ha->func.init)(ha)) - break; - else if (reset_counter >= 2) { + if ((*ha->func.init) (ha)) + break; + else if (reset_counter >= 2) { - return (0); - } - } + return (0); + } + } - return (1); + return (1); } /****************************************************************************/ @@ -5803,22 +5317,25 @@ /* */ /****************************************************************************/ static void -ips_statinit(ips_ha_t *ha) { - uint32_t phys_status_start; +ips_statinit(ips_ha_t * ha) +{ + uint32_t phys_status_start; - METHOD_TRACE("ips_statinit", 1); + METHOD_TRACE("ips_statinit", 1); - ha->adapt->p_status_start = ha->adapt->status; - ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS; - ha->adapt->p_status_tail = ha->adapt->status; - - phys_status_start = ha->adapt->hw_status_start; - outl(cpu_to_le32(phys_status_start), ha->io_addr + IPS_REG_SQSR); - outl(cpu_to_le32(phys_status_start + IPS_STATUS_Q_SIZE), ha->io_addr + IPS_REG_SQER); - outl(cpu_to_le32(phys_status_start + IPS_STATUS_SIZE), ha->io_addr + IPS_REG_SQHR); - outl(cpu_to_le32(phys_status_start), ha->io_addr + IPS_REG_SQTR); + ha->adapt->p_status_start = ha->adapt->status; + ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS; + ha->adapt->p_status_tail = ha->adapt->status; + + phys_status_start = ha->adapt->hw_status_start; + outl(cpu_to_le32(phys_status_start), ha->io_addr + IPS_REG_SQSR); + outl(cpu_to_le32(phys_status_start + IPS_STATUS_Q_SIZE), + ha->io_addr + IPS_REG_SQER); + outl(cpu_to_le32(phys_status_start + IPS_STATUS_SIZE), + ha->io_addr + IPS_REG_SQHR); + outl(cpu_to_le32(phys_status_start), ha->io_addr + IPS_REG_SQTR); - ha->adapt->hw_status_tail = phys_status_start; + ha->adapt->hw_status_tail = phys_status_start; } /****************************************************************************/ @@ -5831,22 +5348,24 @@ /* */ /****************************************************************************/ static void -ips_statinit_memio(ips_ha_t *ha) { - uint32_t phys_status_start; +ips_statinit_memio(ips_ha_t * ha) +{ + uint32_t phys_status_start; - METHOD_TRACE("ips_statinit_memio", 1); + METHOD_TRACE("ips_statinit_memio", 1); - ha->adapt->p_status_start = ha->adapt->status; - ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS; - ha->adapt->p_status_tail = ha->adapt->status; - - phys_status_start = ha->adapt->hw_status_start; - writel(phys_status_start, ha->mem_ptr + IPS_REG_SQSR); - writel(phys_status_start + IPS_STATUS_Q_SIZE, ha->mem_ptr + IPS_REG_SQER); - writel(phys_status_start + IPS_STATUS_SIZE, ha->mem_ptr + IPS_REG_SQHR); - writel(phys_status_start, ha->mem_ptr + IPS_REG_SQTR); + ha->adapt->p_status_start = ha->adapt->status; + ha->adapt->p_status_end = ha->adapt->status + IPS_MAX_CMDS; + ha->adapt->p_status_tail = ha->adapt->status; + + phys_status_start = ha->adapt->hw_status_start; + writel(phys_status_start, ha->mem_ptr + IPS_REG_SQSR); + writel(phys_status_start + IPS_STATUS_Q_SIZE, + ha->mem_ptr + IPS_REG_SQER); + writel(phys_status_start + IPS_STATUS_SIZE, ha->mem_ptr + IPS_REG_SQHR); + writel(phys_status_start, ha->mem_ptr + IPS_REG_SQTR); - ha->adapt->hw_status_tail = phys_status_start; + ha->adapt->hw_status_tail = phys_status_start; } /****************************************************************************/ @@ -5859,20 +5378,22 @@ /* */ /****************************************************************************/ static uint32_t -ips_statupd_copperhead(ips_ha_t *ha) { - METHOD_TRACE("ips_statupd_copperhead", 1); +ips_statupd_copperhead(ips_ha_t * ha) +{ + METHOD_TRACE("ips_statupd_copperhead", 1); - if (ha->adapt->p_status_tail != ha->adapt->p_status_end) { - ha->adapt->p_status_tail++; - ha->adapt->hw_status_tail += sizeof(IPS_STATUS); - } else { - ha->adapt->p_status_tail = ha->adapt->p_status_start; - ha->adapt->hw_status_tail = ha->adapt->hw_status_start; - } + if (ha->adapt->p_status_tail != ha->adapt->p_status_end) { + ha->adapt->p_status_tail++; + ha->adapt->hw_status_tail += sizeof (IPS_STATUS); + } else { + ha->adapt->p_status_tail = ha->adapt->p_status_start; + ha->adapt->hw_status_tail = ha->adapt->hw_status_start; + } - outl(cpu_to_le32(ha->adapt->hw_status_tail), ha->io_addr + IPS_REG_SQTR); + outl(cpu_to_le32(ha->adapt->hw_status_tail), + ha->io_addr + IPS_REG_SQTR); - return (ha->adapt->p_status_tail->value); + return (ha->adapt->p_status_tail->value); } /****************************************************************************/ @@ -5885,20 +5406,21 @@ /* */ /****************************************************************************/ static uint32_t -ips_statupd_copperhead_memio(ips_ha_t *ha) { - METHOD_TRACE("ips_statupd_copperhead_memio", 1); +ips_statupd_copperhead_memio(ips_ha_t * ha) +{ + METHOD_TRACE("ips_statupd_copperhead_memio", 1); - if (ha->adapt->p_status_tail != ha->adapt->p_status_end) { - ha->adapt->p_status_tail++; - ha->adapt->hw_status_tail += sizeof(IPS_STATUS); - } else { - ha->adapt->p_status_tail = ha->adapt->p_status_start; - ha->adapt->hw_status_tail = ha->adapt->hw_status_start; - } + if (ha->adapt->p_status_tail != ha->adapt->p_status_end) { + ha->adapt->p_status_tail++; + ha->adapt->hw_status_tail += sizeof (IPS_STATUS); + } else { + ha->adapt->p_status_tail = ha->adapt->p_status_start; + ha->adapt->hw_status_tail = ha->adapt->hw_status_start; + } - writel(ha->adapt->hw_status_tail, ha->mem_ptr + IPS_REG_SQTR); + writel(ha->adapt->hw_status_tail, ha->mem_ptr + IPS_REG_SQTR); - return (ha->adapt->p_status_tail->value); + return (ha->adapt->p_status_tail->value); } /****************************************************************************/ @@ -5911,14 +5433,15 @@ /* */ /****************************************************************************/ static uint32_t -ips_statupd_morpheus(ips_ha_t *ha) { - uint32_t val; +ips_statupd_morpheus(ips_ha_t * ha) +{ + uint32_t val; - METHOD_TRACE("ips_statupd_morpheus", 1); + METHOD_TRACE("ips_statupd_morpheus", 1); - val = readl(ha->mem_ptr + IPS_REG_I2O_OUTMSGQ); + val = readl(ha->mem_ptr + IPS_REG_I2O_OUTMSGQ); - return (val); + return (val); } /****************************************************************************/ @@ -5931,50 +5454,49 @@ /* */ /****************************************************************************/ static int -ips_issue_copperhead(ips_ha_t *ha, ips_scb_t *scb) { - uint32_t TimeOut; - uint32_t val; - - METHOD_TRACE("ips_issue_copperhead", 1); - - if (scb->scsi_cmd) { - DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)", - ips_name, - ha->host_num, - scb->cdb[0], - scb->cmd.basic_io.command_id, - scb->bus, - scb->target_id, - scb->lun); - } else { - DEBUG_VAR(2, KERN_NOTICE "(%s%d) ips_issue: logical cmd id %d", - ips_name, - ha->host_num, - scb->cmd.basic_io.command_id); - } - - TimeOut = 0; - - while ((val = le32_to_cpu(inl(ha->io_addr + IPS_REG_CCCR))) & IPS_BIT_SEM) { - udelay(1000); - - if (++TimeOut >= IPS_SEM_TIMEOUT) { - if (!(val & IPS_BIT_START_STOP)) - break; - - printk(KERN_WARNING "(%s%d) ips_issue val [0x%x].\n", - ips_name, ha->host_num, val); - printk(KERN_WARNING "(%s%d) ips_issue semaphore chk timeout.\n", - ips_name, ha->host_num); - - return (IPS_FAILURE); - } /* end if */ - } /* end while */ +ips_issue_copperhead(ips_ha_t * ha, ips_scb_t * scb) +{ + uint32_t TimeOut; + uint32_t val; - outl(cpu_to_le32(scb->scb_busaddr), ha->io_addr + IPS_REG_CCSAR); - outw(cpu_to_le32(IPS_BIT_START_CMD), ha->io_addr + IPS_REG_CCCR); + METHOD_TRACE("ips_issue_copperhead", 1); - return (IPS_SUCCESS); + if (scb->scsi_cmd) { + DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)", + ips_name, + ha->host_num, + scb->cdb[0], + scb->cmd.basic_io.command_id, + scb->bus, scb->target_id, scb->lun); + } else { + DEBUG_VAR(2, KERN_NOTICE "(%s%d) ips_issue: logical cmd id %d", + ips_name, ha->host_num, scb->cmd.basic_io.command_id); + } + + TimeOut = 0; + + while ((val = le32_to_cpu(inl(ha->io_addr + IPS_REG_CCCR))) & + IPS_BIT_SEM) { + udelay(1000); + + if (++TimeOut >= IPS_SEM_TIMEOUT) { + if (!(val & IPS_BIT_START_STOP)) + break; + + printk(KERN_WARNING "(%s%d) ips_issue val [0x%x].\n", + ips_name, ha->host_num, val); + printk(KERN_WARNING + "(%s%d) ips_issue semaphore chk timeout.\n", + ips_name, ha->host_num); + + return (IPS_FAILURE); + } /* end if */ + } /* end while */ + + outl(cpu_to_le32(scb->scb_busaddr), ha->io_addr + IPS_REG_CCSAR); + outw(cpu_to_le32(IPS_BIT_START_CMD), ha->io_addr + IPS_REG_CCCR); + + return (IPS_SUCCESS); } /****************************************************************************/ @@ -5987,50 +5509,48 @@ /* */ /****************************************************************************/ static int -ips_issue_copperhead_memio(ips_ha_t *ha, ips_scb_t *scb) { - uint32_t TimeOut; - uint32_t val; - - METHOD_TRACE("ips_issue_copperhead_memio", 1); - - if (scb->scsi_cmd) { - DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)", - ips_name, - ha->host_num, - scb->cdb[0], - scb->cmd.basic_io.command_id, - scb->bus, - scb->target_id, - scb->lun); - } else { - DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d", - ips_name, - ha->host_num, - scb->cmd.basic_io.command_id); - } - - TimeOut = 0; - - while ((val = readl(ha->mem_ptr + IPS_REG_CCCR)) & IPS_BIT_SEM) { - udelay(1000); - - if (++TimeOut >= IPS_SEM_TIMEOUT) { - if (!(val & IPS_BIT_START_STOP)) - break; - - printk(KERN_WARNING "(%s%d) ips_issue val [0x%x].\n", - ips_name, ha->host_num, val); - printk(KERN_WARNING "(%s%d) ips_issue semaphore chk timeout.\n", - ips_name, ha->host_num); - - return (IPS_FAILURE); - } /* end if */ - } /* end while */ +ips_issue_copperhead_memio(ips_ha_t * ha, ips_scb_t * scb) +{ + uint32_t TimeOut; + uint32_t val; - writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_CCSAR); - writel(IPS_BIT_START_CMD, ha->mem_ptr + IPS_REG_CCCR); + METHOD_TRACE("ips_issue_copperhead_memio", 1); - return (IPS_SUCCESS); + if (scb->scsi_cmd) { + DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)", + ips_name, + ha->host_num, + scb->cdb[0], + scb->cmd.basic_io.command_id, + scb->bus, scb->target_id, scb->lun); + } else { + DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d", + ips_name, ha->host_num, scb->cmd.basic_io.command_id); + } + + TimeOut = 0; + + while ((val = readl(ha->mem_ptr + IPS_REG_CCCR)) & IPS_BIT_SEM) { + udelay(1000); + + if (++TimeOut >= IPS_SEM_TIMEOUT) { + if (!(val & IPS_BIT_START_STOP)) + break; + + printk(KERN_WARNING "(%s%d) ips_issue val [0x%x].\n", + ips_name, ha->host_num, val); + printk(KERN_WARNING + "(%s%d) ips_issue semaphore chk timeout.\n", + ips_name, ha->host_num); + + return (IPS_FAILURE); + } /* end if */ + } /* end while */ + + writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_CCSAR); + writel(IPS_BIT_START_CMD, ha->mem_ptr + IPS_REG_CCCR); + + return (IPS_SUCCESS); } /****************************************************************************/ @@ -6043,29 +5563,26 @@ /* */ /****************************************************************************/ static int -ips_issue_i2o(ips_ha_t *ha, ips_scb_t *scb) { +ips_issue_i2o(ips_ha_t * ha, ips_scb_t * scb) +{ - METHOD_TRACE("ips_issue_i2o", 1); + METHOD_TRACE("ips_issue_i2o", 1); - if (scb->scsi_cmd) { - DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)", - ips_name, - ha->host_num, - scb->cdb[0], - scb->cmd.basic_io.command_id, - scb->bus, - scb->target_id, - scb->lun); - } else { - DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d", - ips_name, - ha->host_num, - scb->cmd.basic_io.command_id); - } + if (scb->scsi_cmd) { + DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)", + ips_name, + ha->host_num, + scb->cdb[0], + scb->cmd.basic_io.command_id, + scb->bus, scb->target_id, scb->lun); + } else { + DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d", + ips_name, ha->host_num, scb->cmd.basic_io.command_id); + } - outl(cpu_to_le32(scb->scb_busaddr), ha->io_addr + IPS_REG_I2O_INMSGQ); + outl(cpu_to_le32(scb->scb_busaddr), ha->io_addr + IPS_REG_I2O_INMSGQ); - return (IPS_SUCCESS); + return (IPS_SUCCESS); } /****************************************************************************/ @@ -6078,29 +5595,26 @@ /* */ /****************************************************************************/ static int -ips_issue_i2o_memio(ips_ha_t *ha, ips_scb_t *scb) { +ips_issue_i2o_memio(ips_ha_t * ha, ips_scb_t * scb) +{ - METHOD_TRACE("ips_issue_i2o_memio", 1); + METHOD_TRACE("ips_issue_i2o_memio", 1); - if (scb->scsi_cmd) { - DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)", - ips_name, - ha->host_num, - scb->cdb[0], - scb->cmd.basic_io.command_id, - scb->bus, - scb->target_id, - scb->lun); - } else { - DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d", - ips_name, - ha->host_num, - scb->cmd.basic_io.command_id); - } + if (scb->scsi_cmd) { + DEBUG_VAR(2, "(%s%d) ips_issue: cmd 0x%X id %d (%d %d %d)", + ips_name, + ha->host_num, + scb->cdb[0], + scb->cmd.basic_io.command_id, + scb->bus, scb->target_id, scb->lun); + } else { + DEBUG_VAR(2, "(%s%d) ips_issue: logical cmd id %d", + ips_name, ha->host_num, scb->cmd.basic_io.command_id); + } - writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_I2O_INMSGQ); + writel(scb->scb_busaddr, ha->mem_ptr + IPS_REG_I2O_INMSGQ); - return (IPS_SUCCESS); + return (IPS_SUCCESS); } /****************************************************************************/ @@ -6113,26 +5627,27 @@ /* */ /****************************************************************************/ static int -ips_isintr_copperhead(ips_ha_t *ha) { - uint8_t Isr; +ips_isintr_copperhead(ips_ha_t * ha) +{ + uint8_t Isr; + + METHOD_TRACE("ips_isintr_copperhead", 2); - METHOD_TRACE("ips_isintr_copperhead", 2); + Isr = inb(ha->io_addr + IPS_REG_HISR); - Isr = inb(ha->io_addr + IPS_REG_HISR); + if (Isr == 0xFF) + /* ?!?! Nothing really there */ + return (0); - if (Isr == 0xFF) - /* ?!?! Nothing really there */ - return (0); - - if (Isr & IPS_BIT_SCE) - return (1); - else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) { - /* status queue overflow or GHI */ - /* just clear the interrupt */ - outb(Isr, ha->io_addr + IPS_REG_HISR); - } + if (Isr & IPS_BIT_SCE) + return (1); + else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) { + /* status queue overflow or GHI */ + /* just clear the interrupt */ + outb(Isr, ha->io_addr + IPS_REG_HISR); + } - return (0); + return (0); } /****************************************************************************/ @@ -6145,26 +5660,27 @@ /* */ /****************************************************************************/ static int -ips_isintr_copperhead_memio(ips_ha_t *ha) { - uint8_t Isr; +ips_isintr_copperhead_memio(ips_ha_t * ha) +{ + uint8_t Isr; - METHOD_TRACE("ips_isintr_memio", 2); + METHOD_TRACE("ips_isintr_memio", 2); - Isr = readb(ha->mem_ptr + IPS_REG_HISR); + Isr = readb(ha->mem_ptr + IPS_REG_HISR); - if (Isr == 0xFF) - /* ?!?! Nothing really there */ - return (0); - - if (Isr & IPS_BIT_SCE) - return (1); - else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) { - /* status queue overflow or GHI */ - /* just clear the interrupt */ - writeb(Isr, ha->mem_ptr + IPS_REG_HISR); - } + if (Isr == 0xFF) + /* ?!?! Nothing really there */ + return (0); - return (0); + if (Isr & IPS_BIT_SCE) + return (1); + else if (Isr & (IPS_BIT_SQO | IPS_BIT_GHI)) { + /* status queue overflow or GHI */ + /* just clear the interrupt */ + writeb(Isr, ha->mem_ptr + IPS_REG_HISR); + } + + return (0); } /****************************************************************************/ @@ -6177,17 +5693,18 @@ /* */ /****************************************************************************/ static int -ips_isintr_morpheus(ips_ha_t *ha) { - uint32_t Isr; +ips_isintr_morpheus(ips_ha_t * ha) +{ + uint32_t Isr; - METHOD_TRACE("ips_isintr_morpheus", 2); + METHOD_TRACE("ips_isintr_morpheus", 2); - Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR); + Isr = readl(ha->mem_ptr + IPS_REG_I2O_HIR); - if (Isr & IPS_BIT_I2O_OPQI) - return (1); - else - return (0); + if (Isr & IPS_BIT_I2O_OPQI) + return (1); + else + return (0); } /****************************************************************************/ @@ -6200,51 +5717,52 @@ /* */ /****************************************************************************/ static int -ips_wait(ips_ha_t *ha, int time, int intr) { - int ret; - int done; - - METHOD_TRACE("ips_wait", 1); - - ret = IPS_FAILURE; - done = FALSE; - - time *= IPS_ONE_SEC; /* convert seconds */ - - while ((time > 0) && (!done)) { - if (intr == IPS_INTR_ON) { - if (ha->waitflag == FALSE) { - ret = IPS_SUCCESS; - done = TRUE; - break; - } - } else if (intr == IPS_INTR_IORL) { - if (ha->waitflag == FALSE) { - /* - * controller generated an interrupt to - * acknowledge completion of the command - * and ips_intr() has serviced the interrupt. - */ - ret = IPS_SUCCESS; - done = TRUE; - break; - } - - /* - * NOTE: we already have the io_request_lock so - * even if we get an interrupt it won't get serviced - * until after we finish. - */ - - (*ha->func.intr)(ha); - } - - /* This looks like a very evil loop, but it only does this during start-up */ - udelay(1000); - time--; - } +ips_wait(ips_ha_t * ha, int time, int intr) +{ + int ret; + int done; + + METHOD_TRACE("ips_wait", 1); - return (ret); + ret = IPS_FAILURE; + done = FALSE; + + time *= IPS_ONE_SEC; /* convert seconds */ + + while ((time > 0) && (!done)) { + if (intr == IPS_INTR_ON) { + if (ha->waitflag == FALSE) { + ret = IPS_SUCCESS; + done = TRUE; + break; + } + } else if (intr == IPS_INTR_IORL) { + if (ha->waitflag == FALSE) { + /* + * controller generated an interrupt to + * acknowledge completion of the command + * and ips_intr() has serviced the interrupt. + */ + ret = IPS_SUCCESS; + done = TRUE; + break; + } + + /* + * NOTE: we already have the io_request_lock so + * even if we get an interrupt it won't get serviced + * until after we finish. + */ + + (*ha->func.intr) (ha); + } + + /* This looks like a very evil loop, but it only does this during start-up */ + udelay(1000); + time--; + } + + return (ret); } /****************************************************************************/ @@ -6257,61 +5775,59 @@ /* */ /****************************************************************************/ static int -ips_write_driver_status(ips_ha_t *ha, int intr) { - METHOD_TRACE("ips_write_driver_status", 1); - - if (!ips_readwrite_page5(ha, FALSE, intr)) { - printk(KERN_WARNING "(%s%d) unable to read NVRAM page 5.\n", - ips_name, ha->host_num); - - return (0); - } - - /* check to make sure the page has a valid */ - /* signature */ - if (le32_to_cpu(ha->nvram->signature) != IPS_NVRAM_P5_SIG) { - DEBUG_VAR(1, "(%s%d) NVRAM page 5 has an invalid signature: %X.", - ips_name, ha->host_num, ha->nvram->signature); - ha->nvram->signature = IPS_NVRAM_P5_SIG; - } - - DEBUG_VAR(2, "(%s%d) Ad Type: %d, Ad Slot: %d, BIOS: %c%c%c%c %c%c%c%c.", - ips_name, ha->host_num, le16_to_cpu(ha->nvram->adapter_type), - ha->nvram->adapter_slot, - ha->nvram->bios_high[0], ha->nvram->bios_high[1], - ha->nvram->bios_high[2], ha->nvram->bios_high[3], - ha->nvram->bios_low[0], ha->nvram->bios_low[1], - ha->nvram->bios_low[2], ha->nvram->bios_low[3]); - - ips_get_bios_version(ha, intr); - - /* change values (as needed) */ - ha->nvram->operating_system = IPS_OS_LINUX; - ha->nvram->adapter_type = ha->ad_type; - strncpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4); - strncpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4); - strncpy((char *) ha->nvram->bios_high, ha->bios_version, 4); - strncpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4); - - ips_version_check(ha, intr); /* Check BIOS/FW/Driver Versions */ - - /* Save the First Copy of the Adapter Order that BIOS put in Page 5 */ - if ( (InitState == 0) && (AdapterOrder[0] == 0) ) - strncpy((char *) AdapterOrder, (char *) ha->nvram->adapter_order, sizeof(AdapterOrder) ); - - /* now update the page */ - if (!ips_readwrite_page5(ha, TRUE, intr)) { - printk(KERN_WARNING "(%s%d) unable to write NVRAM page 5.\n", - ips_name, ha->host_num); +ips_write_driver_status(ips_ha_t * ha, int intr) +{ + METHOD_TRACE("ips_write_driver_status", 1); - return (0); - } + if (!ips_readwrite_page5(ha, FALSE, intr)) { + printk(KERN_WARNING "(%s%d) unable to read NVRAM page 5.\n", + ips_name, ha->host_num); + + return (0); + } + + /* check to make sure the page has a valid */ + /* signature */ + if (le32_to_cpu(ha->nvram->signature) != IPS_NVRAM_P5_SIG) { + DEBUG_VAR(1, + "(%s%d) NVRAM page 5 has an invalid signature: %X.", + ips_name, ha->host_num, ha->nvram->signature); + ha->nvram->signature = IPS_NVRAM_P5_SIG; + } + + DEBUG_VAR(2, + "(%s%d) Ad Type: %d, Ad Slot: %d, BIOS: %c%c%c%c %c%c%c%c.", + ips_name, ha->host_num, le16_to_cpu(ha->nvram->adapter_type), + ha->nvram->adapter_slot, ha->nvram->bios_high[0], + ha->nvram->bios_high[1], ha->nvram->bios_high[2], + ha->nvram->bios_high[3], ha->nvram->bios_low[0], + ha->nvram->bios_low[1], ha->nvram->bios_low[2], + ha->nvram->bios_low[3]); + + ips_get_bios_version(ha, intr); + + /* change values (as needed) */ + ha->nvram->operating_system = IPS_OS_LINUX; + ha->nvram->adapter_type = ha->ad_type; + strncpy((char *) ha->nvram->driver_high, IPS_VERSION_HIGH, 4); + strncpy((char *) ha->nvram->driver_low, IPS_VERSION_LOW, 4); + strncpy((char *) ha->nvram->bios_high, ha->bios_version, 4); + strncpy((char *) ha->nvram->bios_low, ha->bios_version + 4, 4); + + ips_version_check(ha, intr); /* Check BIOS/FW/Driver Versions */ + + /* now update the page */ + if (!ips_readwrite_page5(ha, TRUE, intr)) { + printk(KERN_WARNING "(%s%d) unable to write NVRAM page 5.\n", + ips_name, ha->host_num); - /* IF NVRAM Page 5 is OK, Use it for Slot Number Info Because Linux Doesn't Do Slots */ - ha->slot_num = ha->nvram->adapter_slot; + return (0); + } + /* IF NVRAM Page 5 is OK, Use it for Slot Number Info Because Linux Doesn't Do Slots */ + ha->slot_num = ha->nvram->adapter_slot; - return (1); + return (1); } /****************************************************************************/ @@ -6324,39 +5840,40 @@ /* */ /****************************************************************************/ static int -ips_read_adapter_status(ips_ha_t *ha, int intr) { - ips_scb_t *scb; - int ret; - - METHOD_TRACE("ips_read_adapter_status", 1); - - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_ENQUIRY; - - scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY; - scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.basic_io.sg_count = 0; - scb->cmd.basic_io.lba = 0; - scb->cmd.basic_io.sector_count = 0; - scb->cmd.basic_io.log_drv = 0; - scb->cmd.basic_io.reserved = 0; - scb->data_len = sizeof(*ha->enq); - scb->data_busaddr = pci_map_single(ha->pcidev, ha->enq, scb->data_len, - IPS_DMA_DIR(scb)); - scb->cmd.basic_io.sg_addr = scb->data_busaddr; - scb->flags |= IPS_SCB_MAP_SINGLE; - - /* send command */ - if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) || - (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) - return (0); +ips_read_adapter_status(ips_ha_t * ha, int intr) +{ + ips_scb_t *scb; + int ret; + + METHOD_TRACE("ips_read_adapter_status", 1); + + scb = &ha->scbs[ha->max_cmds - 1]; - return (1); + ips_init_scb(ha, scb); + + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_ENQUIRY; + + scb->cmd.basic_io.op_code = IPS_CMD_ENQUIRY; + scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.basic_io.sg_count = 0; + scb->cmd.basic_io.lba = 0; + scb->cmd.basic_io.sector_count = 0; + scb->cmd.basic_io.log_drv = 0; + scb->data_len = sizeof (*ha->enq); + scb->data_busaddr = pci_map_single(ha->pcidev, ha->enq, scb->data_len, + IPS_DMA_DIR(scb)); + scb->cmd.basic_io.sg_addr = scb->data_busaddr; + scb->flags |= IPS_SCB_MAP_SINGLE; + + /* send command */ + if ( + ((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == + IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) + || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) + return (0); + + return (1); } /****************************************************************************/ @@ -6369,39 +5886,40 @@ /* */ /****************************************************************************/ static int -ips_read_subsystem_parameters(ips_ha_t *ha, int intr) { - ips_scb_t *scb; - int ret; - - METHOD_TRACE("ips_read_subsystem_parameters", 1); - - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_GET_SUBSYS; - - scb->cmd.basic_io.op_code = IPS_CMD_GET_SUBSYS; - scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.basic_io.sg_count = 0; - scb->cmd.basic_io.lba = 0; - scb->cmd.basic_io.sector_count = 0; - scb->cmd.basic_io.log_drv = 0; - scb->cmd.basic_io.reserved = 0; - scb->data_len = sizeof(*ha->subsys); - scb->data_busaddr = pci_map_single(ha->pcidev, ha->subsys, - scb->data_len, IPS_DMA_DIR(scb)); - scb->cmd.basic_io.sg_addr = scb->data_busaddr; - scb->flags |= IPS_SCB_MAP_SINGLE; - - /* send command */ - if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) || - (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) - return (0); +ips_read_subsystem_parameters(ips_ha_t * ha, int intr) +{ + ips_scb_t *scb; + int ret; - return (1); + METHOD_TRACE("ips_read_subsystem_parameters", 1); + + scb = &ha->scbs[ha->max_cmds - 1]; + + ips_init_scb(ha, scb); + + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_GET_SUBSYS; + + scb->cmd.basic_io.op_code = IPS_CMD_GET_SUBSYS; + scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.basic_io.sg_count = 0; + scb->cmd.basic_io.lba = 0; + scb->cmd.basic_io.sector_count = 0; + scb->cmd.basic_io.log_drv = 0; + scb->data_len = sizeof (*ha->subsys); + scb->data_busaddr = pci_map_single(ha->pcidev, ha->subsys, + scb->data_len, IPS_DMA_DIR(scb)); + scb->cmd.basic_io.sg_addr = scb->data_busaddr; + scb->flags |= IPS_SCB_MAP_SINGLE; + + /* send command */ + if ( + ((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == + IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) + || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) + return (0); + + return (1); } /****************************************************************************/ @@ -6414,51 +5932,53 @@ /* */ /****************************************************************************/ static int -ips_read_config(ips_ha_t *ha, int intr) { - ips_scb_t *scb; - int i; - int ret; - - METHOD_TRACE("ips_read_config", 1); - - /* set defaults for initiator IDs */ - for (i = 0; i < 4; i++) - ha->conf->init_id[i] = 7; - - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_READ_CONF; - - scb->cmd.basic_io.op_code = IPS_CMD_READ_CONF; - scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); - scb->data_len = sizeof(*ha->conf); - scb->data_busaddr = pci_map_single(ha->pcidev, ha->conf, - scb->data_len, IPS_DMA_DIR(scb)); - scb->cmd.basic_io.sg_addr = scb->data_busaddr; - scb->flags |= IPS_SCB_MAP_SINGLE; - - /* send command */ - if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) || - (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) { - - memset(ha->conf, 0, sizeof(IPS_CONF)); - - /* reset initiator IDs */ - for (i = 0; i < 4; i++) - ha->conf->init_id[i] = 7; - - /* Allow Completed with Errors, so JCRM can access the Adapter to fix the problems */ - if ((scb->basic_status & IPS_GSC_STATUS_MASK) == IPS_CMD_CMPLT_WERROR) - return (1); - - return (0); - } +ips_read_config(ips_ha_t * ha, int intr) +{ + ips_scb_t *scb; + int i; + int ret; + + METHOD_TRACE("ips_read_config", 1); - return (1); + /* set defaults for initiator IDs */ + for (i = 0; i < 4; i++) + ha->conf->init_id[i] = 7; + + scb = &ha->scbs[ha->max_cmds - 1]; + + ips_init_scb(ha, scb); + + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_READ_CONF; + + scb->cmd.basic_io.op_code = IPS_CMD_READ_CONF; + scb->cmd.basic_io.command_id = IPS_COMMAND_ID(ha, scb); + scb->data_len = sizeof (*ha->conf); + scb->data_busaddr = pci_map_single(ha->pcidev, ha->conf, + scb->data_len, IPS_DMA_DIR(scb)); + scb->cmd.basic_io.sg_addr = scb->data_busaddr; + scb->flags |= IPS_SCB_MAP_SINGLE; + + /* send command */ + if ( + ((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == + IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) + || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) { + + memset(ha->conf, 0, sizeof (IPS_CONF)); + + /* reset initiator IDs */ + for (i = 0; i < 4; i++) + ha->conf->init_id[i] = 7; + + /* Allow Completed with Errors, so JCRM can access the Adapter to fix the problems */ + if ((scb->basic_status & IPS_GSC_STATUS_MASK) == + IPS_CMD_CMPLT_WERROR) return (1); + + return (0); + } + + return (1); } /****************************************************************************/ @@ -6471,42 +5991,44 @@ /* */ /****************************************************************************/ static int -ips_readwrite_page5(ips_ha_t *ha, int write, int intr) { - ips_scb_t *scb; - int ret; - - METHOD_TRACE("ips_readwrite_page5", 1); - - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE; - - scb->cmd.nvram.op_code = IPS_CMD_RW_NVRAM_PAGE; - scb->cmd.nvram.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.nvram.page = 5; - scb->cmd.nvram.write = write; - scb->cmd.nvram.reserved = 0; - scb->cmd.nvram.reserved2 = 0; - scb->data_len = sizeof(*ha->nvram); - scb->data_busaddr = pci_map_single(ha->pcidev, ha->nvram, - scb->data_len, IPS_DMA_DIR(scb)); - scb->cmd.nvram.buffer_addr = scb->data_busaddr; - scb->flags |= IPS_SCB_MAP_SINGLE; - - /* issue the command */ - if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) || - (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) { +ips_readwrite_page5(ips_ha_t * ha, int write, int intr) +{ + ips_scb_t *scb; + int ret; + + METHOD_TRACE("ips_readwrite_page5", 1); + + scb = &ha->scbs[ha->max_cmds - 1]; - memset(ha->nvram, 0, sizeof(IPS_NVRAM_P5)); + ips_init_scb(ha, scb); - return (0); - } + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_RW_NVRAM_PAGE; + + scb->cmd.nvram.op_code = IPS_CMD_RW_NVRAM_PAGE; + scb->cmd.nvram.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.nvram.page = 5; + scb->cmd.nvram.write = write; + scb->cmd.nvram.reserved = 0; + scb->cmd.nvram.reserved2 = 0; + scb->data_len = sizeof (*ha->nvram); + scb->data_busaddr = pci_map_single(ha->pcidev, ha->nvram, + scb->data_len, IPS_DMA_DIR(scb)); + scb->cmd.nvram.buffer_addr = scb->data_busaddr; + scb->flags |= IPS_SCB_MAP_SINGLE; + + /* issue the command */ + if ( + ((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == + IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) + || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) { - return (1); + memset(ha->nvram, 0, sizeof (IPS_NVRAM_P5)); + + return (0); + } + + return (1); } /****************************************************************************/ @@ -6519,54 +6041,57 @@ /* */ /****************************************************************************/ static int -ips_clear_adapter(ips_ha_t *ha, int intr) { - ips_scb_t *scb; - int ret; - - METHOD_TRACE("ips_clear_adapter", 1); - - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_reset_timeout; - scb->cdb[0] = IPS_CMD_CONFIG_SYNC; - - scb->cmd.config_sync.op_code = IPS_CMD_CONFIG_SYNC; - scb->cmd.config_sync.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.config_sync.channel = 0; - scb->cmd.config_sync.source_target = IPS_POCL; - scb->cmd.config_sync.reserved = 0; - scb->cmd.config_sync.reserved2 = 0; - scb->cmd.config_sync.reserved3 = 0; - - /* issue command */ - if (((ret = ips_send_wait(ha, scb, ips_reset_timeout, intr)) == IPS_FAILURE) || - (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) - return (0); - - /* send unlock stripe command */ - ips_init_scb(ha, scb); - - scb->cdb[0] = IPS_CMD_ERROR_TABLE; - scb->timeout = ips_reset_timeout; - - scb->cmd.unlock_stripe.op_code = IPS_CMD_ERROR_TABLE; - scb->cmd.unlock_stripe.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.unlock_stripe.log_drv = 0; - scb->cmd.unlock_stripe.control = IPS_CSL; - scb->cmd.unlock_stripe.reserved = 0; - scb->cmd.unlock_stripe.reserved2 = 0; - scb->cmd.unlock_stripe.reserved3 = 0; - - /* issue command */ - if (((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == IPS_FAILURE) || - (ret == IPS_SUCCESS_IMM) || - ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) - return (0); +ips_clear_adapter(ips_ha_t * ha, int intr) +{ + ips_scb_t *scb; + int ret; + + METHOD_TRACE("ips_clear_adapter", 1); + + scb = &ha->scbs[ha->max_cmds - 1]; + + ips_init_scb(ha, scb); + + scb->timeout = ips_reset_timeout; + scb->cdb[0] = IPS_CMD_CONFIG_SYNC; + + scb->cmd.config_sync.op_code = IPS_CMD_CONFIG_SYNC; + scb->cmd.config_sync.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.config_sync.channel = 0; + scb->cmd.config_sync.source_target = IPS_POCL; + scb->cmd.config_sync.reserved = 0; + scb->cmd.config_sync.reserved2 = 0; + scb->cmd.config_sync.reserved3 = 0; + + /* issue command */ + if ( + ((ret = ips_send_wait(ha, scb, ips_reset_timeout, intr)) == + IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) + || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) + return (0); + + /* send unlock stripe command */ + ips_init_scb(ha, scb); + + scb->cdb[0] = IPS_CMD_ERROR_TABLE; + scb->timeout = ips_reset_timeout; + + scb->cmd.unlock_stripe.op_code = IPS_CMD_ERROR_TABLE; + scb->cmd.unlock_stripe.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.unlock_stripe.log_drv = 0; + scb->cmd.unlock_stripe.control = IPS_CSL; + scb->cmd.unlock_stripe.reserved = 0; + scb->cmd.unlock_stripe.reserved2 = 0; + scb->cmd.unlock_stripe.reserved3 = 0; + + /* issue command */ + if ( + ((ret = ips_send_wait(ha, scb, ips_cmd_timeout, intr)) == + IPS_FAILURE) || (ret == IPS_SUCCESS_IMM) + || ((scb->basic_status & IPS_GSC_STATUS_MASK) > 1)) + return (0); - return (1); + return (1); } /****************************************************************************/ @@ -6579,27 +6104,28 @@ /* */ /****************************************************************************/ static void -ips_ffdc_reset(ips_ha_t *ha, int intr) { - ips_scb_t *scb; +ips_ffdc_reset(ips_ha_t * ha, int intr) +{ + ips_scb_t *scb; - METHOD_TRACE("ips_ffdc_reset", 1); + METHOD_TRACE("ips_ffdc_reset", 1); - scb = &ha->scbs[ha->max_cmds-1]; + scb = &ha->scbs[ha->max_cmds - 1]; - ips_init_scb(ha, scb); + ips_init_scb(ha, scb); - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_FFDC; - scb->cmd.ffdc.op_code = IPS_CMD_FFDC; - scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.ffdc.reset_count = ha->reset_count; - scb->cmd.ffdc.reset_type = 0x80; + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_FFDC; + scb->cmd.ffdc.op_code = IPS_CMD_FFDC; + scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.ffdc.reset_count = ha->reset_count; + scb->cmd.ffdc.reset_type = 0x80; - /* convert time to what the card wants */ - ips_fix_ffdc_time(ha, scb, ha->last_ffdc); + /* convert time to what the card wants */ + ips_fix_ffdc_time(ha, scb, ha->last_ffdc); - /* issue command */ - ips_send_wait(ha, scb, ips_cmd_timeout, intr); + /* issue command */ + ips_send_wait(ha, scb, ips_cmd_timeout, intr); } /****************************************************************************/ @@ -6612,30 +6138,30 @@ /* */ /****************************************************************************/ static void -ips_ffdc_time(ips_ha_t *ha) { - ips_scb_t *scb; +ips_ffdc_time(ips_ha_t * ha) +{ + ips_scb_t *scb; - METHOD_TRACE("ips_ffdc_time", 1); + METHOD_TRACE("ips_ffdc_time", 1); - DEBUG_VAR(1, "(%s%d) Sending time update.", - ips_name, ha->host_num); + DEBUG_VAR(1, "(%s%d) Sending time update.", ips_name, ha->host_num); - scb = &ha->scbs[ha->max_cmds-1]; + scb = &ha->scbs[ha->max_cmds - 1]; - ips_init_scb(ha, scb); + ips_init_scb(ha, scb); - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_FFDC; - scb->cmd.ffdc.op_code = IPS_CMD_FFDC; - scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.ffdc.reset_count = 0; - scb->cmd.ffdc.reset_type = 0x80; + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_FFDC; + scb->cmd.ffdc.op_code = IPS_CMD_FFDC; + scb->cmd.ffdc.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.ffdc.reset_count = 0; + scb->cmd.ffdc.reset_type = 0x80; - /* convert time to what the card wants */ - ips_fix_ffdc_time(ha, scb, ha->last_ffdc); + /* convert time to what the card wants */ + ips_fix_ffdc_time(ha, scb, ha->last_ffdc); - /* issue command */ - ips_send_wait(ha, scb, ips_cmd_timeout, IPS_FFDC); + /* issue command */ + ips_send_wait(ha, scb, ips_cmd_timeout, IPS_FFDC); } /****************************************************************************/ @@ -6647,57 +6173,59 @@ /* */ /****************************************************************************/ static void -ips_fix_ffdc_time(ips_ha_t *ha, ips_scb_t *scb, time_t current_time) { - long days; - long rem; - int i; - int year; - int yleap; - int year_lengths[2] = { IPS_DAYS_NORMAL_YEAR, IPS_DAYS_LEAP_YEAR }; - int month_lengths[12][2] = { {31, 31}, - {28, 29}, - {31, 31}, - {30, 30}, - {31, 31}, - {30, 30}, - {31, 31}, - {31, 31}, - {30, 30}, - {31, 31}, - {30, 30}, - {31, 31} }; - - METHOD_TRACE("ips_fix_ffdc_time", 1); - - days = current_time / IPS_SECS_DAY; - rem = current_time % IPS_SECS_DAY; - - scb->cmd.ffdc.hour = (rem / IPS_SECS_HOUR); - rem = rem % IPS_SECS_HOUR; - scb->cmd.ffdc.minute = (rem / IPS_SECS_MIN); - scb->cmd.ffdc.second = (rem % IPS_SECS_MIN); - - year = IPS_EPOCH_YEAR; - while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) { - int newy; - - newy = year + (days / IPS_DAYS_NORMAL_YEAR); - if (days < 0) - --newy; - days -= (newy - year) * IPS_DAYS_NORMAL_YEAR + - IPS_NUM_LEAP_YEARS_THROUGH(newy - 1) - - IPS_NUM_LEAP_YEARS_THROUGH(year - 1); - year = newy; - } +ips_fix_ffdc_time(ips_ha_t * ha, ips_scb_t * scb, time_t current_time) +{ + long days; + long rem; + int i; + int year; + int yleap; + int year_lengths[2] = { IPS_DAYS_NORMAL_YEAR, IPS_DAYS_LEAP_YEAR }; + int month_lengths[12][2] = { {31, 31}, + {28, 29}, + {31, 31}, + {30, 30}, + {31, 31}, + {30, 30}, + {31, 31}, + {31, 31}, + {30, 30}, + {31, 31}, + {30, 30}, + {31, 31} + }; + + METHOD_TRACE("ips_fix_ffdc_time", 1); + + days = current_time / IPS_SECS_DAY; + rem = current_time % IPS_SECS_DAY; + + scb->cmd.ffdc.hour = (rem / IPS_SECS_HOUR); + rem = rem % IPS_SECS_HOUR; + scb->cmd.ffdc.minute = (rem / IPS_SECS_MIN); + scb->cmd.ffdc.second = (rem % IPS_SECS_MIN); + + year = IPS_EPOCH_YEAR; + while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) { + int newy; + + newy = year + (days / IPS_DAYS_NORMAL_YEAR); + if (days < 0) + --newy; + days -= (newy - year) * IPS_DAYS_NORMAL_YEAR + + IPS_NUM_LEAP_YEARS_THROUGH(newy - 1) - + IPS_NUM_LEAP_YEARS_THROUGH(year - 1); + year = newy; + } - scb->cmd.ffdc.yearH = year / 100; - scb->cmd.ffdc.yearL = year % 100; + scb->cmd.ffdc.yearH = year / 100; + scb->cmd.ffdc.yearL = year % 100; - for (i = 0; days >= month_lengths[i][yleap]; ++i) - days -= month_lengths[i][yleap]; + for (i = 0; days >= month_lengths[i][yleap]; ++i) + days -= month_lengths[i][yleap]; - scb->cmd.ffdc.month = i + 1; - scb->cmd.ffdc.day = days + 1; + scb->cmd.ffdc.month = i + 1; + scb->cmd.ffdc.day = days + 1; } /**************************************************************************** @@ -6713,106 +6241,107 @@ /* */ /****************************************************************************/ static int -ips_erase_bios(ips_ha_t *ha) { - int timeout; - uint8_t status=0; - - METHOD_TRACE("ips_erase_bios", 1); - - status = 0; - - /* Clear the status register */ - outl(0, ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - outb(0x50, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* Erase Setup */ - outb(0x20, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* Erase Confirm */ - outb(0xD0, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* Erase Status */ - outb(0x70, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - timeout = 80000; /* 80 seconds */ - - while (timeout > 0) { - if (ha->revision_id == IPS_REVID_TROMBONE64) { - outl(0, ha->io_addr + IPS_REG_FLAP); - udelay(25); /* 25 us */ - } - - status = inb(ha->io_addr + IPS_REG_FLDP); - - if (status & 0x80) - break; - - MDELAY(1); - timeout--; - } - - /* check for timeout */ - if (timeout <= 0) { - /* timeout */ - - /* try to suspend the erase */ - outb(0xB0, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* wait for 10 seconds */ - timeout = 10000; - while (timeout > 0) { - if (ha->revision_id == IPS_REVID_TROMBONE64) { - outl(0, ha->io_addr + IPS_REG_FLAP); - udelay(25); /* 25 us */ - } - - status = inb(ha->io_addr + IPS_REG_FLDP); - - if (status & 0xC0) - break; - - MDELAY(1); - timeout--; - } - - return (1); - } - - /* check for valid VPP */ - if (status & 0x08) - /* VPP failure */ - return (1); - - /* check for succesful flash */ - if (status & 0x30) - /* sequence error */ - return (1); - - /* Otherwise, we were successful */ - /* clear status */ - outb(0x50, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* enable reads */ - outb(0xFF, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ +ips_erase_bios(ips_ha_t * ha) +{ + int timeout; + uint8_t status = 0; + + METHOD_TRACE("ips_erase_bios", 1); + + status = 0; - return (0); + /* Clear the status register */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + outb(0x50, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* Erase Setup */ + outb(0x20, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* Erase Confirm */ + outb(0xD0, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* Erase Status */ + outb(0x70, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + timeout = 80000; /* 80 seconds */ + + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + outl(0, ha->io_addr + IPS_REG_FLAP); + udelay(25); /* 25 us */ + } + + status = inb(ha->io_addr + IPS_REG_FLDP); + + if (status & 0x80) + break; + + MDELAY(1); + timeout--; + } + + /* check for timeout */ + if (timeout <= 0) { + /* timeout */ + + /* try to suspend the erase */ + outb(0xB0, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* wait for 10 seconds */ + timeout = 10000; + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + outl(0, ha->io_addr + IPS_REG_FLAP); + udelay(25); /* 25 us */ + } + + status = inb(ha->io_addr + IPS_REG_FLDP); + + if (status & 0xC0) + break; + + MDELAY(1); + timeout--; + } + + return (1); + } + + /* check for valid VPP */ + if (status & 0x08) + /* VPP failure */ + return (1); + + /* check for succesful flash */ + if (status & 0x30) + /* sequence error */ + return (1); + + /* Otherwise, we were successful */ + /* clear status */ + outb(0x50, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* enable reads */ + outb(0xFF, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + return (0); } /****************************************************************************/ @@ -6824,106 +6353,107 @@ /* */ /****************************************************************************/ static int -ips_erase_bios_memio(ips_ha_t *ha) { - int timeout; - uint8_t status; - - METHOD_TRACE("ips_erase_bios_memio", 1); - - status = 0; - - /* Clear the status register */ - writel(0, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - writeb(0x50, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* Erase Setup */ - writeb(0x20, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* Erase Confirm */ - writeb(0xD0, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* Erase Status */ - writeb(0x70, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - timeout = 80000; /* 80 seconds */ - - while (timeout > 0) { - if (ha->revision_id == IPS_REVID_TROMBONE64) { - writel(0, ha->mem_ptr + IPS_REG_FLAP); - udelay(25); /* 25 us */ - } - - status = readb(ha->mem_ptr + IPS_REG_FLDP); - - if (status & 0x80) - break; - - MDELAY(1); - timeout--; - } - - /* check for timeout */ - if (timeout <= 0) { - /* timeout */ - - /* try to suspend the erase */ - writeb(0xB0, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* wait for 10 seconds */ - timeout = 10000; - while (timeout > 0) { - if (ha->revision_id == IPS_REVID_TROMBONE64) { - writel(0, ha->mem_ptr + IPS_REG_FLAP); - udelay(25); /* 25 us */ - } - - status = readb(ha->mem_ptr + IPS_REG_FLDP); - - if (status & 0xC0) - break; - - MDELAY(1); - timeout--; - } - - return (1); - } - - /* check for valid VPP */ - if (status & 0x08) - /* VPP failure */ - return (1); - - /* check for succesful flash */ - if (status & 0x30) - /* sequence error */ - return (1); - - /* Otherwise, we were successful */ - /* clear status */ - writeb(0x50, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* enable reads */ - writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ +ips_erase_bios_memio(ips_ha_t * ha) +{ + int timeout; + uint8_t status; + + METHOD_TRACE("ips_erase_bios_memio", 1); + + status = 0; - return (0); + /* Clear the status register */ + writel(0, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + writeb(0x50, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* Erase Setup */ + writeb(0x20, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* Erase Confirm */ + writeb(0xD0, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* Erase Status */ + writeb(0x70, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + timeout = 80000; /* 80 seconds */ + + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + writel(0, ha->mem_ptr + IPS_REG_FLAP); + udelay(25); /* 25 us */ + } + + status = readb(ha->mem_ptr + IPS_REG_FLDP); + + if (status & 0x80) + break; + + MDELAY(1); + timeout--; + } + + /* check for timeout */ + if (timeout <= 0) { + /* timeout */ + + /* try to suspend the erase */ + writeb(0xB0, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* wait for 10 seconds */ + timeout = 10000; + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + writel(0, ha->mem_ptr + IPS_REG_FLAP); + udelay(25); /* 25 us */ + } + + status = readb(ha->mem_ptr + IPS_REG_FLDP); + + if (status & 0xC0) + break; + + MDELAY(1); + timeout--; + } + + return (1); + } + + /* check for valid VPP */ + if (status & 0x08) + /* VPP failure */ + return (1); + + /* check for succesful flash */ + if (status & 0x30) + /* sequence error */ + return (1); + + /* Otherwise, we were successful */ + /* clear status */ + writeb(0x50, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* enable reads */ + writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + return (0); } /****************************************************************************/ @@ -6935,84 +6465,86 @@ /* */ /****************************************************************************/ static int -ips_program_bios(ips_ha_t *ha, char *buffer, uint32_t buffersize, uint32_t offset) { - int i; - int timeout; - uint8_t status=0; - - METHOD_TRACE("ips_program_bios", 1); - - status = 0; - - for (i = 0; i < buffersize; i++) { - /* write a byte */ - outl(cpu_to_le32(i + offset), ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - outb(0x40, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - outb(buffer[i], ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* wait up to one second */ - timeout = 1000; - while (timeout > 0) { - if (ha->revision_id == IPS_REVID_TROMBONE64) { - outl(0, ha->io_addr + IPS_REG_FLAP); - udelay(25); /* 25 us */ - } - - status = inb(ha->io_addr + IPS_REG_FLDP); - - if (status & 0x80) - break; - - MDELAY(1); - timeout--; - } - - if (timeout == 0) { - /* timeout error */ - outl(0, ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - outb(0xFF, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - return (1); - } - - /* check the status */ - if (status & 0x18) { - /* programming error */ - outl(0, ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - outb(0xFF, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - return (1); - } - } /* end for */ - - /* Enable reading */ - outl(0, ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - outb(0xFF, ha->io_addr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ +ips_program_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize, + uint32_t offset) +{ + int i; + int timeout; + uint8_t status = 0; + + METHOD_TRACE("ips_program_bios", 1); + + status = 0; + + for (i = 0; i < buffersize; i++) { + /* write a byte */ + outl(cpu_to_le32(i + offset), ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + outb(0x40, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + outb(buffer[i], ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* wait up to one second */ + timeout = 1000; + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + outl(0, ha->io_addr + IPS_REG_FLAP); + udelay(25); /* 25 us */ + } + + status = inb(ha->io_addr + IPS_REG_FLDP); + + if (status & 0x80) + break; + + MDELAY(1); + timeout--; + } + + if (timeout == 0) { + /* timeout error */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + outb(0xFF, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + return (1); + } + + /* check the status */ + if (status & 0x18) { + /* programming error */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + outb(0xFF, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + return (1); + } + } /* end for */ + + /* Enable reading */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + outb(0xFF, ha->io_addr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ - return (0); + return (0); } /****************************************************************************/ @@ -7024,84 +6556,86 @@ /* */ /****************************************************************************/ static int -ips_program_bios_memio(ips_ha_t *ha, char *buffer, uint32_t buffersize, uint32_t offset) { - int i; - int timeout; - uint8_t status=0; - - METHOD_TRACE("ips_program_bios_memio", 1); - - status = 0; - - for (i = 0; i < buffersize; i++) { - /* write a byte */ - writel(i + offset, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - writeb(0x40, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - writeb(buffer[i], ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - /* wait up to one second */ - timeout = 1000; - while (timeout > 0) { - if (ha->revision_id == IPS_REVID_TROMBONE64) { - writel(0, ha->mem_ptr + IPS_REG_FLAP); - udelay(25); /* 25 us */ - } - - status = readb(ha->mem_ptr + IPS_REG_FLDP); - - if (status & 0x80) - break; - - MDELAY(1); - timeout--; - } - - if (timeout == 0) { - /* timeout error */ - writel(0, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - return (1); - } - - /* check the status */ - if (status & 0x18) { - /* programming error */ - writel(0, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - return (1); - } - } /* end for */ - - /* Enable reading */ - writel(0, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ +ips_program_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize, + uint32_t offset) +{ + int i; + int timeout; + uint8_t status = 0; + + METHOD_TRACE("ips_program_bios_memio", 1); + + status = 0; + + for (i = 0; i < buffersize; i++) { + /* write a byte */ + writel(i + offset, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + writeb(0x40, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + writeb(buffer[i], ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + /* wait up to one second */ + timeout = 1000; + while (timeout > 0) { + if (ha->revision_id == IPS_REVID_TROMBONE64) { + writel(0, ha->mem_ptr + IPS_REG_FLAP); + udelay(25); /* 25 us */ + } + + status = readb(ha->mem_ptr + IPS_REG_FLDP); + + if (status & 0x80) + break; + + MDELAY(1); + timeout--; + } + + if (timeout == 0) { + /* timeout error */ + writel(0, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + return (1); + } + + /* check the status */ + if (status & 0x18) { + /* programming error */ + writel(0, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + return (1); + } + } /* end for */ + + /* Enable reading */ + writel(0, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + writeb(0xFF, ha->mem_ptr + IPS_REG_FLDP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ - return (0); + return (0); } /****************************************************************************/ @@ -7113,42 +6647,44 @@ /* */ /****************************************************************************/ static int -ips_verify_bios(ips_ha_t *ha, char *buffer, uint32_t buffersize, uint32_t offset) { - uint8_t checksum; - int i; - - METHOD_TRACE("ips_verify_bios", 1); - - /* test 1st byte */ - outl(0, ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55) - return (1); - - outl(cpu_to_le32(1), ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA) - return (1); - - checksum = 0xff; - for (i = 2; i < buffersize; i++) { - - outl(cpu_to_le32(i + offset), ha->io_addr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - checksum = (uint8_t) checksum + inb(ha->io_addr + IPS_REG_FLDP); - } - - if (checksum != 0) - /* failure */ - return (1); - else - /* success */ - return (0); +ips_verify_bios(ips_ha_t * ha, char *buffer, uint32_t buffersize, + uint32_t offset) +{ + uint8_t checksum; + int i; + + METHOD_TRACE("ips_verify_bios", 1); + + /* test 1st byte */ + outl(0, ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + if (inb(ha->io_addr + IPS_REG_FLDP) != 0x55) + return (1); + + outl(cpu_to_le32(1), ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + if (inb(ha->io_addr + IPS_REG_FLDP) != 0xAA) + return (1); + + checksum = 0xff; + for (i = 2; i < buffersize; i++) { + + outl(cpu_to_le32(i + offset), ha->io_addr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + checksum = (uint8_t) checksum + inb(ha->io_addr + IPS_REG_FLDP); + } + + if (checksum != 0) + /* failure */ + return (1); + else + /* success */ + return (0); } /****************************************************************************/ @@ -7160,42 +6696,45 @@ /* */ /****************************************************************************/ static int -ips_verify_bios_memio(ips_ha_t *ha, char *buffer, uint32_t buffersize, uint32_t offset) { - uint8_t checksum; - int i; - - METHOD_TRACE("ips_verify_bios_memio", 1); - - /* test 1st byte */ - writel(0, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55) - return (1); - - writel(1, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA) - return (1); - - checksum = 0xff; - for (i = 2; i < buffersize; i++) { - - writel(i + offset, ha->mem_ptr + IPS_REG_FLAP); - if (ha->revision_id == IPS_REVID_TROMBONE64) - udelay(25); /* 25 us */ - - checksum = (uint8_t) checksum + readb(ha->mem_ptr + IPS_REG_FLDP); - } - - if (checksum != 0) - /* failure */ - return (1); - else - /* success */ - return (0); +ips_verify_bios_memio(ips_ha_t * ha, char *buffer, uint32_t buffersize, + uint32_t offset) +{ + uint8_t checksum; + int i; + + METHOD_TRACE("ips_verify_bios_memio", 1); + + /* test 1st byte */ + writel(0, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0x55) + return (1); + + writel(1, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + if (readb(ha->mem_ptr + IPS_REG_FLDP) != 0xAA) + return (1); + + checksum = 0xff; + for (i = 2; i < buffersize; i++) { + + writel(i + offset, ha->mem_ptr + IPS_REG_FLAP); + if (ha->revision_id == IPS_REVID_TROMBONE64) + udelay(25); /* 25 us */ + + checksum = + (uint8_t) checksum + readb(ha->mem_ptr + IPS_REG_FLDP); + } + + if (checksum != 0) + /* failure */ + return (1); + else + /* success */ + return (0); } /*---------------------------------------------------------------------------*/ @@ -7208,77 +6747,82 @@ /* Data is available. */ /* */ /*---------------------------------------------------------------------------*/ -static void ips_version_check(ips_ha_t *ha, int intr) { - IPS_VERSION_DATA VersionInfo; - uint8_t FirmwareVersion[ IPS_COMPAT_ID_LENGTH + 1 ]; - uint8_t BiosVersion[ IPS_COMPAT_ID_LENGTH + 1]; - int MatchError; - int rc; - char BiosString[10]; - char FirmwareString[10]; - - METHOD_TRACE("ips_version_check", 1); - - memset(FirmwareVersion, 0, IPS_COMPAT_ID_LENGTH + 1); - memset(BiosVersion, 0, IPS_COMPAT_ID_LENGTH + 1); - - /* Get the Compatible BIOS Version from NVRAM Page 5 */ - memcpy(BiosVersion, ha->nvram->BiosCompatibilityID, IPS_COMPAT_ID_LENGTH); - - rc = IPS_FAILURE; - if (ha->subsys->param[4] & IPS_GET_VERSION_SUPPORT) /* If Versioning is Supported */ - { - /* Get the Version Info with a Get Version Command */ - rc = ips_get_version_info(ha, &VersionInfo, intr); - if (rc == IPS_SUCCESS) - memcpy(FirmwareVersion, VersionInfo.compatibilityId, IPS_COMPAT_ID_LENGTH); - } - - if (rc != IPS_SUCCESS) /* If Data Not Obtainable from a GetVersion Command */ - { - /* Get the Firmware Version from Enquiry Data */ - memcpy(FirmwareVersion, ha->enq->CodeBlkVersion, IPS_COMPAT_ID_LENGTH); - } - - /* printk(KERN_WARNING "Adapter's BIOS Version = %s\n", BiosVersion); */ - /* printk(KERN_WARNING "BIOS Compatible Version = %s\n", IPS_COMPAT_BIOS); */ - /* printk(KERN_WARNING "Adapter's Firmware Version = %s\n", FirmwareVersion); */ - /* printk(KERN_WARNING "Firmware Compatible Version = %s \n", Compatable[ ha->nvram->adapter_type ]); */ - - MatchError = 0; - - if (strncmp(FirmwareVersion, Compatable[ ha->nvram->adapter_type ], IPS_COMPAT_ID_LENGTH) != 0) - MatchError = 1; - - if (strncmp(BiosVersion, IPS_COMPAT_BIOS, IPS_COMPAT_ID_LENGTH) != 0) - MatchError = 1; - - ha->nvram->versioning = 1; /* Indicate the Driver Supports Versioning */ - - if (MatchError) - { - ha->nvram->version_mismatch = 1; - if (ips_cd_boot == 0) - { - strncpy(&BiosString[0], ha->nvram->bios_high, 4); - strncpy(&BiosString[4], ha->nvram->bios_low, 4); - BiosString[8] = 0; - - strncpy(&FirmwareString[0], ha->enq->CodeBlkVersion, 8); - FirmwareString[8] = 0; - - printk(KERN_WARNING "Warning ! ! ! ServeRAID Version Mismatch\n"); - printk(KERN_WARNING "Bios = %s, Firmware = %s, Device Driver = %s%s\n", - BiosString, FirmwareString, IPS_VERSION_HIGH, IPS_VERSION_LOW ); - printk(KERN_WARNING "These levels should match to avoid possible compatibility problems.\n" ); - } - } - else - { - ha->nvram->version_mismatch = 0; - } +static void +ips_version_check(ips_ha_t * ha, int intr) +{ + IPS_VERSION_DATA VersionInfo; + uint8_t FirmwareVersion[IPS_COMPAT_ID_LENGTH + 1]; + uint8_t BiosVersion[IPS_COMPAT_ID_LENGTH + 1]; + int MatchError; + int rc; + char BiosString[10]; + char FirmwareString[10]; + + METHOD_TRACE("ips_version_check", 1); + + memset(FirmwareVersion, 0, IPS_COMPAT_ID_LENGTH + 1); + memset(BiosVersion, 0, IPS_COMPAT_ID_LENGTH + 1); + + /* Get the Compatible BIOS Version from NVRAM Page 5 */ + memcpy(BiosVersion, ha->nvram->BiosCompatibilityID, + IPS_COMPAT_ID_LENGTH); + + rc = IPS_FAILURE; + if (ha->subsys->param[4] & IPS_GET_VERSION_SUPPORT) { /* If Versioning is Supported */ + /* Get the Version Info with a Get Version Command */ + rc = ips_get_version_info(ha, &VersionInfo, intr); + if (rc == IPS_SUCCESS) + memcpy(FirmwareVersion, VersionInfo.compatibilityId, + IPS_COMPAT_ID_LENGTH); + } + + if (rc != IPS_SUCCESS) { /* If Data Not Obtainable from a GetVersion Command */ + /* Get the Firmware Version from Enquiry Data */ + memcpy(FirmwareVersion, ha->enq->CodeBlkVersion, + IPS_COMPAT_ID_LENGTH); + } + + /* printk(KERN_WARNING "Adapter's BIOS Version = %s\n", BiosVersion); */ + /* printk(KERN_WARNING "BIOS Compatible Version = %s\n", IPS_COMPAT_BIOS); */ + /* printk(KERN_WARNING "Adapter's Firmware Version = %s\n", FirmwareVersion); */ + /* printk(KERN_WARNING "Firmware Compatible Version = %s \n", Compatable[ ha->nvram->adapter_type ]); */ + + MatchError = 0; + + if (strncmp + (FirmwareVersion, Compatable[ha->nvram->adapter_type], + IPS_COMPAT_ID_LENGTH) != 0) + MatchError = 1; + + if (strncmp(BiosVersion, IPS_COMPAT_BIOS, IPS_COMPAT_ID_LENGTH) != 0) + MatchError = 1; + + ha->nvram->versioning = 1; /* Indicate the Driver Supports Versioning */ + + if (MatchError) { + ha->nvram->version_mismatch = 1; + if (ips_cd_boot == 0) { + strncpy(&BiosString[0], ha->nvram->bios_high, 4); + strncpy(&BiosString[4], ha->nvram->bios_low, 4); + BiosString[8] = 0; + + strncpy(&FirmwareString[0], ha->enq->CodeBlkVersion, 8); + FirmwareString[8] = 0; + + printk(KERN_WARNING + "Warning ! ! ! ServeRAID Version Mismatch\n"); + printk(KERN_WARNING + "Bios = %s, Firmware = %s, Device Driver = %s%s\n", + BiosString, FirmwareString, IPS_VERSION_HIGH, + IPS_VERSION_LOW); + printk(KERN_WARNING + "These levels should match to avoid possible compatibility problems.\n"); + } + } else { + ha->nvram->version_mismatch = 0; + } - return; + return; } /*---------------------------------------------------------------------------*/ @@ -7290,52 +6834,227 @@ /* Return Value: */ /* 0 if Successful, else non-zero */ /*---------------------------------------------------------------------------*/ -static int ips_get_version_info(ips_ha_t *ha, IPS_VERSION_DATA *Buffer, int intr ) { - ips_scb_t *scb; - int rc; - - METHOD_TRACE("ips_get_version_info", 1); - - memset(Buffer, 0, sizeof(IPS_VERSION_DATA)); - scb = &ha->scbs[ha->max_cmds-1]; - - ips_init_scb(ha, scb); - - scb->timeout = ips_cmd_timeout; - scb->cdb[0] = IPS_CMD_GET_VERSION_INFO; - scb->cmd.version_info.op_code = IPS_CMD_GET_VERSION_INFO; - scb->cmd.version_info.command_id = IPS_COMMAND_ID(ha, scb); - scb->cmd.version_info.reserved = 0; - scb->cmd.version_info.count = sizeof( IPS_VERSION_DATA); - scb->cmd.version_info.reserved2 = 0; - scb->data_len = sizeof(*Buffer); - scb->data_busaddr = pci_map_single(ha->pcidev, Buffer, - scb->data_len, IPS_DMA_DIR(scb)); - scb->cmd.version_info.buffer_addr = scb->data_busaddr; - scb->flags |= IPS_SCB_MAP_SINGLE; - - /* issue command */ - rc = ips_send_wait(ha, scb, ips_cmd_timeout, intr); - return( rc ); -} - - - -#if defined (MODULE) || (LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0)) -static Scsi_Host_Template driver_template = IPS; -#include "scsi_module.c" -#endif +static int +ips_get_version_info(ips_ha_t * ha, IPS_VERSION_DATA * Buffer, int intr) +{ + ips_scb_t *scb; + int rc; + + METHOD_TRACE("ips_get_version_info", 1); + + memset(Buffer, 0, sizeof (IPS_VERSION_DATA)); + scb = &ha->scbs[ha->max_cmds - 1]; + + ips_init_scb(ha, scb); -static int ips_abort_init(ips_ha_t *ha, struct Scsi_Host *sh, int index){ - ha->active = 0; - ips_free(ha); - scsi_unregister(sh); - ips_ha[index] = 0; - ips_sh[index] = 0; - return -1; + scb->timeout = ips_cmd_timeout; + scb->cdb[0] = IPS_CMD_GET_VERSION_INFO; + scb->cmd.version_info.op_code = IPS_CMD_GET_VERSION_INFO; + scb->cmd.version_info.command_id = IPS_COMMAND_ID(ha, scb); + scb->cmd.version_info.reserved = 0; + scb->cmd.version_info.count = sizeof (IPS_VERSION_DATA); + scb->cmd.version_info.reserved2 = 0; + scb->data_len = sizeof (*Buffer); + scb->data_busaddr = pci_map_single(ha->pcidev, Buffer, + scb->data_len, IPS_DMA_DIR(scb)); + scb->cmd.version_info.buffer_addr = scb->data_busaddr; + scb->flags |= IPS_SCB_MAP_SINGLE; + + /* issue command */ + rc = ips_send_wait(ha, scb, ips_cmd_timeout, intr); + return (rc); } -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,0) +/****************************************************************************/ +/* */ +/* Routine Name: ips_abort_init */ +/* */ +/* Routine Description: */ +/* cleanup routine for a failed adapter initialization */ +/****************************************************************************/ +static int +ips_abort_init(ips_ha_t * ha, int index) +{ + ha->active = 0; + ips_free(ha); + ips_ha[index] = 0; + ips_sh[index] = 0; + return -1; +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_shift_controllers */ +/* */ +/* Routine Description: */ +/* helper function for ordering adapters */ +/****************************************************************************/ +static void +ips_shift_controllers(int lowindex, int highindex) +{ + ips_ha_t *ha_sav = ips_ha[highindex]; + struct Scsi_Host *sh_sav = ips_sh[highindex]; + int i; + + for (i = highindex; i > lowindex; i--) { + ips_ha[i] = ips_ha[i - 1]; + ips_sh[i] = ips_sh[i - 1]; + ips_ha[i]->host_num = i; + } + ha_sav->host_num = lowindex; + ips_ha[lowindex] = ha_sav; + ips_sh[lowindex] = sh_sav; +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_order_controllers */ +/* */ +/* Routine Description: */ +/* place controllers is the "proper" boot order */ +/****************************************************************************/ +static void +ips_order_controllers(void) +{ + int i, j, tmp, position = 0; + IPS_NVRAM_P5 *nvram; + if (!ips_ha[0]) + return; + nvram = ips_ha[0]->nvram; + + if (nvram->adapter_order[0]) { + for (i = 1; i <= nvram->adapter_order[0]; i++) { + for (j = position; j < ips_num_controllers; j++) { + switch (ips_ha[j]->ad_type) { + case IPS_ADTYPE_SERVERAID6M: + if (nvram->adapter_order[i] == 'M') { + ips_shift_controllers(position, + j); + position++; + } + break; + case IPS_ADTYPE_SERVERAID4L: + case IPS_ADTYPE_SERVERAID4M: + case IPS_ADTYPE_SERVERAID4MX: + case IPS_ADTYPE_SERVERAID4LX: + if (nvram->adapter_order[i] == 'N') { + ips_shift_controllers(position, + j); + position++; + } + break; + case IPS_ADTYPE_SERVERAID6I: + case IPS_ADTYPE_SERVERAID5I2: + case IPS_ADTYPE_SERVERAID5I1: + if (nvram->adapter_order[i] == 'S') { + ips_shift_controllers(position, + j); + position++; + } + break; + case IPS_ADTYPE_SERVERAID: + case IPS_ADTYPE_SERVERAID2: + case IPS_ADTYPE_NAVAJO: + case IPS_ADTYPE_KIOWA: + case IPS_ADTYPE_SERVERAID3L: + case IPS_ADTYPE_SERVERAID3: + case IPS_ADTYPE_SERVERAID4H: + if (nvram->adapter_order[i] == 'A') { + ips_shift_controllers(position, + j); + position++; + } + break; + default: + break; + } + } + } + /* if adapter_order[0], then ordering is complete */ + return; + } + /* old bios, use older ordering */ + tmp = 0; + for (i = position; i < ips_num_controllers; i++) { + if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I2 || + ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID5I1) { + ips_shift_controllers(position, i); + position++; + tmp = 1; + } + } + /* if there were no 5I cards, then don't do any extra ordering */ + if (!tmp) + return; + for (i = position; i < ips_num_controllers; i++) { + if (ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4L || + ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4M || + ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4LX || + ips_ha[i]->ad_type == IPS_ADTYPE_SERVERAID4MX) { + ips_shift_controllers(position, i); + position++; + } + } + + return; +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_register_scsi */ +/* */ +/* Routine Description: */ +/* perform any registration and setup with the scsi layer */ +/****************************************************************************/ +static int +ips_register_scsi(int index) +{ + struct Scsi_Host *sh; + ips_ha_t *ha, *oldha; + sh = scsi_register(&ips_driver_template, sizeof (ips_ha_t)); + if (!sh) { + printk(KERN_WARNING + "Unable to register controller with SCSI subsystem\n"); + return -1; + } + oldha = ips_ha[index]; + ha = IPS_HA(sh); + memcpy(ha, oldha, sizeof (ips_ha_t)); + free_irq(oldha->irq, oldha); + /* Install the interrupt handler with the new ha */ + if (request_irq(ha->irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) { + printk(KERN_WARNING "Unable to install interrupt handler\n"); + scsi_unregister(sh); + return -1; + } + + kfree(oldha); + ips_sh[index] = sh; + ips_ha[index] = ha; + scsi_set_pci_device(sh, ha->pcidev); + + /* Store away needed values for later use */ + sh->io_port = ha->io_addr; + sh->n_io_port = ha->io_addr ? 255 : 0; + sh->unique_id = (ha->io_addr) ? ha->io_addr : ha->mem_addr; + sh->irq = ha->irq; + sh->sg_tablesize = sh->hostt->sg_tablesize; + sh->can_queue = sh->hostt->can_queue; + sh->cmd_per_lun = sh->hostt->cmd_per_lun; + sh->unchecked_isa_dma = sh->hostt->unchecked_isa_dma; + sh->use_clustering = sh->hostt->use_clustering; + +#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,7) + sh->max_sectors = 128; +#endif + + sh->max_id = ha->ntargets; + sh->max_lun = ha->nlun; + sh->max_channel = ha->nbus - 1; + sh->can_queue = ha->max_cmds - 1; + + return 0; +} /*---------------------------------------------------------------------------*/ /* Routine Name: ips_remove_device */ @@ -7343,24 +7062,64 @@ /* Routine Description: */ /* Remove one Adapter ( Hot Plugging ) */ /*---------------------------------------------------------------------------*/ -static void ips_remove_device(struct pci_dev *pci_dev) +static void +ips_remove_device(struct pci_dev *pci_dev) { - int i; - struct Scsi_Host *sh; - ips_ha_t *ha; - - for (i = 0; i < IPS_MAX_ADAPTERS; i++) { - ha = ips_ha[i]; - if (ha) { - if ( (pci_dev->bus->number == ha->pcidev->bus->number) && - (pci_dev->devfn == ha->pcidev->devfn)) { - sh = ips_sh[i]; - ips_release(sh); - } - } - } + int i; + struct Scsi_Host *sh; + ips_ha_t *ha; + + for (i = 0; i < IPS_MAX_ADAPTERS; i++) { + ha = ips_ha[i]; + if (ha) { + if ((pci_dev->bus->number == ha->pcidev->bus->number) && + (pci_dev->devfn == ha->pcidev->devfn)) { + sh = ips_sh[i]; + ips_release(sh); + } + } + } } +/****************************************************************************/ +/* */ +/* Routine Name: ips_module_init */ +/* */ +/* Routine Description: */ +/* function called on module load */ +/****************************************************************************/ +static int __init +ips_module_init(void) +{ + if (pci_module_init(&ips_pci_driver) < 0) + return -ENODEV; + ips_driver_template.module = THIS_MODULE; + ips_order_controllers(); + if (scsi_register_module(MODULE_SCSI_HA, &ips_driver_template)) { + pci_unregister_driver(&ips_pci_driver); + return -ENODEV; + } + register_reboot_notifier(&ips_notifier); + return 0; +} + +/****************************************************************************/ +/* */ +/* Routine Name: ips_module_exit */ +/* */ +/* Routine Description: */ +/* function called on module unload */ +/****************************************************************************/ +static void __exit +ips_module_exit(void) +{ + scsi_unregister_module(MODULE_SCSI_HA, &ips_driver_template); + pci_unregister_driver(&ips_pci_driver); + unregister_reboot_notifier(&ips_notifier); +} + +module_init(ips_module_init); +module_exit(ips_module_exit); /*---------------------------------------------------------------------------*/ /* Routine Name: ips_insert_device */ @@ -7371,40 +7130,28 @@ /* Return Value: */ /* 0 if Successful, else non-zero */ /*---------------------------------------------------------------------------*/ -static int __devinit ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent) +static int __devinit +ips_insert_device(struct pci_dev *pci_dev, const struct pci_device_id *ent) { - int index; - int rc; + int index; + int rc; - METHOD_TRACE("ips_insert_device", 1); + METHOD_TRACE("ips_insert_device", 1); - /* If we're still in Init State 0, and we've already found the Adapter */ - /* Ordering Table, there is no reason to continue. */ - if ( (InitState == 0) && (AdapterOrder[0]) ) - return -1; - - if (pci_enable_device(pci_dev)) + if (pci_enable_device(pci_dev)) return -1; - rc = ips_init_phase1(pci_dev, &index); - if (rc == SUCCESS) - rc = ips_init_phase2(index); - - /* If we're in Init State 0, we're done with the device for now. */ - /* Release the device and don't count it. */ - if ( InitState == 0 ) { - ips_remove_device(pci_dev); - return -1; - } + rc = ips_init_phase1(pci_dev, &index); + if (rc == SUCCESS) + rc = ips_init_phase2(index); - if (rc == SUCCESS) - ips_num_controllers++; + if (rc == SUCCESS) + ips_num_controllers++; - ips_next_controller = ips_num_controllers; - return rc; + ips_next_controller = ips_num_controllers; + return rc; } - /*---------------------------------------------------------------------------*/ /* Routine Name: ips_init_phase1 */ /* */ @@ -7414,248 +7161,232 @@ /* Return Value: */ /* 0 if Successful, else non-zero */ /*---------------------------------------------------------------------------*/ -static int ips_init_phase1( struct pci_dev *pci_dev, int *indexPtr ) -{ - struct Scsi_Host *sh; - ips_ha_t *ha; - uint32_t io_addr; - uint32_t mem_addr; - uint32_t io_len; - uint32_t mem_len; - uint8_t revision_id; - uint8_t bus; - uint8_t func; - uint8_t irq; - uint16_t subdevice_id; - int j; - int index; - uint32_t count; - dma_addr_t dma_address; - char *ioremap_ptr; - char *mem_ptr; - uint32_t IsDead - - METHOD_TRACE("ips_init_phase1", 1); - index = IPS_MAX_ADAPTERS; - for (j = 0; j < IPS_MAX_ADAPTERS; j++) { - if (ips_ha[j] ==0) { - index = j; - break; - } - } - - if (index >= IPS_MAX_ADAPTERS) - return -1; - - /* stuff that we get in dev */ - irq = pci_dev->irq; - bus = pci_dev->bus->number; - func = pci_dev->devfn; - - /* Init MEM/IO addresses to 0 */ - mem_addr = 0; - io_addr = 0; - mem_len = 0; - io_len = 0; - - for (j = 0; j < 2; j++) { - if (!pci_resource_start(pci_dev, j)) - break; - - if (pci_resource_flags(pci_dev, j) & IORESOURCE_IO) { - io_addr = pci_resource_start(pci_dev, j); - io_len = pci_resource_len(pci_dev, j); - } else { - mem_addr = pci_resource_start(pci_dev, j); - mem_len = pci_resource_len(pci_dev, j); - } - } - - /* setup memory mapped area (if applicable) */ - if (mem_addr) { - uint32_t base; - uint32_t offs; - - if (check_mem_region(mem_addr, mem_len)) { - printk(KERN_WARNING "Couldn't allocate IO Memory space %x len %d.\n", mem_addr, mem_len); - return -1; - } - - request_mem_region(mem_addr, mem_len, "ips"); - base = mem_addr & PAGE_MASK; - offs = mem_addr - base; - ioremap_ptr = ioremap(base, PAGE_SIZE); - mem_ptr = ioremap_ptr + offs; - } else { - ioremap_ptr = NULL; - mem_ptr = NULL; - } - - /* setup I/O mapped area (if applicable) */ - if (io_addr) { - if (check_region(io_addr, io_len)) { - printk(KERN_WARNING "Couldn't allocate IO space %x len %d.\n", io_addr, io_len); - return -1; - } - request_region(io_addr, io_len, "ips"); - } - - /* get the revision ID */ - if (pci_read_config_byte(pci_dev, PCI_REVISION_ID, &revision_id)) { - printk(KERN_WARNING "Can't get revision id.\n" ); - return -1; - } - - subdevice_id = pci_dev->subsystem_device; - - /* found a controller */ - sh = scsi_register(&driver_template, sizeof(ips_ha_t)); -#if LINUX_VERSION_CODE > LinuxVersionCode(2,5,0) - pci_set_dma_mask(pci_dev, (u64)0xffffffff); - scsi_set_pci_device(sh, pci_dev); -#endif - if (sh == NULL) { - printk(KERN_WARNING "Unable to register controller with SCSI subsystem\n" ); - return -1; - } - - ha = IPS_HA(sh); - memset(ha, 0, sizeof(ips_ha_t)); - - ips_sh[index] = sh; - ips_ha[index] = ha; - ha->active = 1; - - ha->enq = kmalloc(sizeof(IPS_ENQ), GFP_KERNEL); - - if (!ha->enq) { - printk(KERN_WARNING "Unable to allocate host inquiry structure\n" ); - return ips_abort_init(ha, sh, index); - } - - ha->adapt = pci_alloc_consistent(pci_dev, sizeof(IPS_ADAPTER) + - sizeof(IPS_IO_CMD), &dma_address); - if (!ha->adapt) { - printk(KERN_WARNING "Unable to allocate host adapt & dummy structures\n"); - return ips_abort_init(ha, sh, index); - } - ha->adapt->hw_status_start = dma_address; - ha->dummy = (void *)(ha->adapt + 1); - - ha->conf = kmalloc(sizeof(IPS_CONF), GFP_KERNEL); - - if (!ha->conf) { - printk(KERN_WARNING "Unable to allocate host conf structure\n" ); - return ips_abort_init(ha, sh, index); - } - - ha->nvram = kmalloc(sizeof(IPS_NVRAM_P5), GFP_KERNEL); - - if (!ha->nvram) { - printk(KERN_WARNING "Unable to allocate host NVRAM structure\n" ); - return ips_abort_init(ha, sh, index); - } - - ha->subsys = kmalloc(sizeof(IPS_SUBSYS), GFP_KERNEL); - - if (!ha->subsys) { - printk(KERN_WARNING "Unable to allocate host subsystem structure\n" ); - return ips_abort_init(ha, sh, index); - } - - for (count = PAGE_SIZE, ha->ioctl_order = 0; - count < ips_ioctlsize; - ha->ioctl_order++, count <<= 1); - - ha->ioctl_data = (char *) __get_free_pages(GFP_KERNEL, ha->ioctl_order); - ha->ioctl_datasize = count; - - if (!ha->ioctl_data) { - printk(KERN_WARNING "Unable to allocate IOCTL data\n" ); - ha->ioctl_data = NULL; - ha->ioctl_order = 0; - ha->ioctl_datasize = 0; - } - - /* Store away needed values for later use */ - sh->io_port = io_addr; - sh->n_io_port = io_addr ? 255 : 0; - sh->unique_id = (io_addr) ? io_addr : mem_addr; - sh->irq = irq; - sh->select_queue_depths = ips_select_queue_depth; - sh->sg_tablesize = sh->hostt->sg_tablesize; - sh->can_queue = sh->hostt->can_queue; - sh->cmd_per_lun = sh->hostt->cmd_per_lun; - sh->unchecked_isa_dma = sh->hostt->unchecked_isa_dma; - sh->use_clustering = sh->hostt->use_clustering; +static int +ips_init_phase1(struct pci_dev *pci_dev, int *indexPtr) +{ + ips_ha_t *ha; + uint32_t io_addr; + uint32_t mem_addr; + uint32_t io_len; + uint32_t mem_len; + uint8_t revision_id; + uint8_t bus; + uint8_t func; + uint8_t irq; + uint16_t subdevice_id; + int j; + int index; + uint32_t count; + dma_addr_t dma_address; + char *ioremap_ptr; + char *mem_ptr; + uint32_t IsDead; + + METHOD_TRACE("ips_init_phase1", 1); + index = IPS_MAX_ADAPTERS; + for (j = 0; j < IPS_MAX_ADAPTERS; j++) { + if (ips_ha[j] == 0) { + index = j; + break; + } + } -#if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,7) - sh->max_sectors = 128; -#endif + if (index >= IPS_MAX_ADAPTERS) + return -1; - /* Store info in HA structure */ - ha->irq = irq; - ha->io_addr = io_addr; - ha->io_len = io_len; - ha->mem_addr = mem_addr; - ha->mem_len = mem_len; - ha->mem_ptr = mem_ptr; - ha->ioremap_ptr = ioremap_ptr; - ha->host_num = ( uint32_t) index; - ha->revision_id = revision_id; - ha->slot_num = PCI_SLOT(pci_dev->devfn); - ha->device_id = pci_dev->device; - ha->subdevice_id = subdevice_id; - ha->pcidev = pci_dev; - - /* - * Setup Functions - */ - ips_setup_funclist(ha); - - if ( ( IPS_IS_MORPHEUS( ha ) ) || ( IPS_IS_MARCO( ha ) ) ) { - /* If Morpheus appears dead, reset it */ - IsDead = readl( ha->mem_ptr + IPS_REG_I960_MSG1 ); - if ( IsDead == 0xDEADBEEF ) { - ips_reset_morpheus( ha ); - } - } - - /* - * Initialize the card if it isn't already - */ - - if (!(*ha->func.isinit)(ha)) { - if (!(*ha->func.init)(ha)) { - /* - * Initialization failed - */ - printk(KERN_WARNING "Unable to initialize controller\n" ); - return ips_abort_init(ha, sh, index); - } - } - - /* Install the interrupt handler */ - if (request_irq(irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) { - printk(KERN_WARNING "Unable to install interrupt handler\n" ); - return ips_abort_init(ha, sh, index); - } - - /* - * Allocate a temporary SCB for initialization - */ - ha->max_cmds = 1; - if (!ips_allocatescbs(ha)) { - printk(KERN_WARNING "Unable to allocate a CCB\n" ); - free_irq(ha->irq, ha); - return ips_abort_init(ha, sh, index); - } + /* stuff that we get in dev */ + irq = pci_dev->irq; + bus = pci_dev->bus->number; + func = pci_dev->devfn; + + /* Init MEM/IO addresses to 0 */ + mem_addr = 0; + io_addr = 0; + mem_len = 0; + io_len = 0; + + for (j = 0; j < 2; j++) { + if (!pci_resource_start(pci_dev, j)) + break; + + if (pci_resource_flags(pci_dev, j) & IORESOURCE_IO) { + io_addr = pci_resource_start(pci_dev, j); + io_len = pci_resource_len(pci_dev, j); + } else { + mem_addr = pci_resource_start(pci_dev, j); + mem_len = pci_resource_len(pci_dev, j); + } + } + + /* setup memory mapped area (if applicable) */ + if (mem_addr) { + uint32_t base; + uint32_t offs; + + if (!request_mem_region(mem_addr, mem_len, "ips")) { + printk(KERN_WARNING + "Couldn't allocate IO Memory space %x len %d.\n", + mem_addr, mem_len); + return -1; + } + + base = mem_addr & PAGE_MASK; + offs = mem_addr - base; + ioremap_ptr = ioremap(base, PAGE_SIZE); + mem_ptr = ioremap_ptr + offs; + } else { + ioremap_ptr = NULL; + mem_ptr = NULL; + } + + /* setup I/O mapped area (if applicable) */ + if (io_addr) { + if (!request_region(io_addr, io_len, "ips")) { + printk(KERN_WARNING + "Couldn't allocate IO space %x len %d.\n", + io_addr, io_len); + return -1; + } + } + + /* get the revision ID */ + if (pci_read_config_byte(pci_dev, PCI_REVISION_ID, &revision_id)) { + printk(KERN_WARNING "Can't get revision id.\n"); + return -1; + } - *indexPtr = index; - return SUCCESS; -} + subdevice_id = pci_dev->subsystem_device; -#endif + /* found a controller */ + ha = kmalloc(sizeof (ips_ha_t), GFP_KERNEL); + if (ha == NULL) { + printk(KERN_WARNING "Unable to allocate temporary ha struct\n"); + return -1; + } + + memset(ha, 0, sizeof (ips_ha_t)); + + ips_sh[index] = NULL; + ips_ha[index] = ha; + ha->active = 1; + + /* Store info in HA structure */ + ha->irq = irq; + ha->io_addr = io_addr; + ha->io_len = io_len; + ha->mem_addr = mem_addr; + ha->mem_len = mem_len; + ha->mem_ptr = mem_ptr; + ha->ioremap_ptr = ioremap_ptr; + ha->host_num = (uint32_t) index; + ha->revision_id = revision_id; + ha->slot_num = PCI_SLOT(pci_dev->devfn); + ha->device_id = pci_dev->device; + ha->subdevice_id = subdevice_id; + ha->pcidev = pci_dev; + + /* + * Set the pci_dev's dma_mask. Not all adapters support 64bit + * addressing so don't enable it if the adapter can't support + * it! Also, don't use 64bit addressing if dma addresses + * are guaranteed to be < 4G. + */ + if (IPS_ENABLE_DMA64 && IPS_HAS_ENH_SGLIST(ha) && + !pci_set_dma_mask(ha->pcidev, (u64) 0xffffffffffffffff)) { + (ha)->flags |= IPS_HA_ENH_SG; + } else { + if (pci_set_dma_mask(ha->pcidev, (u64) 0xffffffff) != 0) { + printk(KERN_WARNING "Unable to set DMA Mask\n"); + return ips_abort_init(ha, index); + } + } + + ha->enq = kmalloc(sizeof (IPS_ENQ), IPS_INIT_GFP); + + if (!ha->enq) { + printk(KERN_WARNING + "Unable to allocate host inquiry structure\n"); + return ips_abort_init(ha, index); + } + + ha->adapt = pci_alloc_consistent(pci_dev, sizeof (IPS_ADAPTER) + + sizeof (IPS_IO_CMD), &dma_address); + if (!ha->adapt) { + printk(KERN_WARNING + "Unable to allocate host adapt & dummy structures\n"); + return ips_abort_init(ha, index); + } + ha->adapt->hw_status_start = dma_address; + ha->dummy = (void *) (ha->adapt + 1); + + ha->conf = kmalloc(sizeof (IPS_CONF), IPS_INIT_GFP); + + if (!ha->conf) { + printk(KERN_WARNING "Unable to allocate host conf structure\n"); + return ips_abort_init(ha, index); + } + + ha->nvram = kmalloc(sizeof (IPS_NVRAM_P5), IPS_INIT_GFP); + + if (!ha->nvram) { + printk(KERN_WARNING + "Unable to allocate host NVRAM structure\n"); + return ips_abort_init(ha, index); + } + + ha->subsys = kmalloc(sizeof (IPS_SUBSYS), IPS_INIT_GFP); + + if (!ha->subsys) { + printk(KERN_WARNING + "Unable to allocate host subsystem structure\n"); + return ips_abort_init(ha, index); + } + + for (count = PAGE_SIZE, ha->ioctl_order = 0; + count < ips_ioctlsize; ha->ioctl_order++, count <<= 1) ; + + ha->ioctl_data = + (char *) __get_free_pages(IPS_INIT_GFP, ha->ioctl_order); + ha->ioctl_datasize = count; + + if (!ha->ioctl_data) { + printk(KERN_WARNING "Unable to allocate IOCTL data\n"); + ha->ioctl_data = NULL; + ha->ioctl_order = 0; + ha->ioctl_datasize = 0; + } + + /* + * Setup Functions + */ + ips_setup_funclist(ha); + + if ((IPS_IS_MORPHEUS(ha)) || (IPS_IS_MARCO(ha))) { + /* If Morpheus appears dead, reset it */ + IsDead = readl(ha->mem_ptr + IPS_REG_I960_MSG1); + if (IsDead == 0xDEADBEEF) { + ips_reset_morpheus(ha); + } + } + + /* + * Initialize the card if it isn't already + */ + + if (!(*ha->func.isinit) (ha)) { + if (!(*ha->func.init) (ha)) { + /* + * Initialization failed + */ + printk(KERN_WARNING + "Unable to initialize controller\n"); + return ips_abort_init(ha, index); + } + } + + *indexPtr = index; + return SUCCESS; +} /*---------------------------------------------------------------------------*/ /* Routine Name: ips_init_phase2 */ @@ -7666,46 +7397,52 @@ /* Return Value: */ /* 0 if Successful, else non-zero */ /*---------------------------------------------------------------------------*/ -static int ips_init_phase2( int index ) -{ - struct Scsi_Host *sh; - ips_ha_t *ha; - - ha = ips_ha[index]; - sh = ips_sh[index]; - - METHOD_TRACE("ips_init_phase2", 1); - if (!ha->active) { - scsi_unregister(sh); - ips_ha[index] = NULL; - ips_sh[index] = NULL; - return -1;; - } - - if (!ips_hainit(ha)) { - printk(KERN_WARNING "Unable to initialize controller\n" ); - free_irq(ha->irq, ha); - return ips_abort_init(ha, sh, index); - } - /* Free the temporary SCB */ - ips_deallocatescbs(ha, 1); - - /* allocate CCBs */ - if (!ips_allocatescbs(ha)) { - printk(KERN_WARNING "Unable to allocate CCBs\n" ); - free_irq(ha->irq, ha); - return ips_abort_init(ha, sh, index); - } - - /* finish setting values */ - sh->max_id = ha->ntargets; - sh->max_lun = ha->nlun; - sh->max_channel = ha->nbus - 1; - sh->can_queue = ha->max_cmds-1; +static int +ips_init_phase2(int index) +{ + ips_ha_t *ha; - return SUCCESS; -} + ha = ips_ha[index]; + + METHOD_TRACE("ips_init_phase2", 1); + if (!ha->active) { + ips_ha[index] = NULL; + return -1; + } + + /* Install the interrupt handler */ + if (request_irq(ha->irq, do_ipsintr, SA_SHIRQ, ips_name, ha)) { + printk(KERN_WARNING "Unable to install interrupt handler\n"); + return ips_abort_init(ha, index); + } + + /* + * Allocate a temporary SCB for initialization + */ + ha->max_cmds = 1; + if (!ips_allocatescbs(ha)) { + printk(KERN_WARNING "Unable to allocate a CCB\n"); + free_irq(ha->irq, ha); + return ips_abort_init(ha, index); + } + + if (!ips_hainit(ha)) { + printk(KERN_WARNING "Unable to initialize controller\n"); + free_irq(ha->irq, ha); + return ips_abort_init(ha, index); + } + /* Free the temporary SCB */ + ips_deallocatescbs(ha, 1); + + /* allocate CCBs */ + if (!ips_allocatescbs(ha)) { + printk(KERN_WARNING "Unable to allocate CCBs\n"); + free_irq(ha->irq, ha); + return ips_abort_init(ha, index); + } + return SUCCESS; +} #if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,9) MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/ips.h linux-2.4.23-pre8/drivers/scsi/ips.h --- linux-2.4.22/drivers/scsi/ips.h 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/ips.h 2003-10-22 22:48:12.000000000 +0000 @@ -69,6 +69,13 @@ #define LinuxVersionCode(x,y,z) (((x)<<16)+((y)<<8)+(z)) #endif + #if LINUX_VERSION_CODE >= LinuxVersionCode(2,4,20) || defined CONFIG_HIGHIO + #define IPS_HIGHIO + #define IPS_HIGHMEM_IO .highmem_io = 1, + #else + #define IPS_HIGHMEM_IO + #endif + #define IPS_HA(x) ((ips_ha_t *) x->hostdata) #define IPS_COMMAND_ID(ha, scb) (int) (scb - ha->scbs) #define IPS_IS_TROMBONE(ha) (((ha->device_id == IPS_DEVICEID_COPPERHEAD) && \ @@ -86,10 +93,42 @@ ((IPS_IS_TROMBONE(ha) || IPS_IS_CLARINET(ha)) && \ (ips_force_memio))) ? 1 : 0) + #define IPS_HAS_ENH_SGLIST(ha) (IPS_IS_MORPHEUS(ha) || IPS_IS_MARCO(ha)) + #define IPS_USE_ENH_SGLIST(ha) ((ha)->flags & IPS_HA_ENH_SG) + #define IPS_SGLIST_SIZE(ha) (IPS_USE_ENH_SGLIST(ha) ? \ + sizeof(IPS_ENH_SG_LIST) : sizeof(IPS_STD_SG_LIST)) + + #if LINUX_VERSION_CODE < LinuxVersionCode(2,4,4) + #define pci_set_dma_mask(dev,mask) ( mask > 0xffffffff ? 1:0 ) + #define scsi_set_pci_device(sh,dev) (0) + #endif + #ifndef MDELAY #define MDELAY mdelay #endif - + + #ifndef min + #define min(x,y) ((x) < (y) ? x : y) + #endif + + #define pci_dma_lo32(a) (a & 0xffffffff) + + #if (BITS_PER_LONG > 32) || (defined CONFIG_HIGHMEM64G && defined IPS_HIGHIO) + #define IPS_ENABLE_DMA64 (1) + #define pci_dma_hi32(a) (a >> 32) + #else + #define IPS_ENABLE_DMA64 (0) + #define pci_dma_hi32(a) (0) + #endif + + #if defined(__ia64__) + #define IPS_ATOMIC_GFP (GFP_DMA | GFP_ATOMIC) + #define IPS_INIT_GFP GFP_DMA + #else + #define IPS_ATOMIC_GFP GFP_ATOMIC + #define IPS_INIT_GFP GFP_KERNEL + #endif + /* * Adapter address map equates */ @@ -354,6 +393,12 @@ #define IPS_SCSI_MP3_AllocateSurface 0x08 /* + * HA Flags + */ + + #define IPS_HA_ENH_SG 0x1 + + /* * SCB Flags */ #define IPS_SCB_MAP_SG 0x00008 @@ -390,93 +435,45 @@ /* * Scsi_Host Template */ -#if LINUX_VERSION_CODE < LinuxVersionCode(2,4,0) - #define IPS { \ - next : NULL, \ - module : NULL, \ - proc_info : NULL, \ - proc_dir : NULL, \ - name : NULL, \ - detect : ips_detect, \ - release : ips_release, \ - info : ips_info, \ - command : NULL, \ - queuecommand : ips_queue, \ - eh_strategy_handler : NULL, \ - eh_abort_handler : ips_eh_abort, \ - eh_device_reset_handler : NULL, \ - eh_bus_reset_handler : NULL, \ - eh_host_reset_handler : ips_eh_reset, \ - abort : NULL, \ - reset : NULL, \ - slave_attach : NULL, \ - bios_param : ips_biosparam, \ - can_queue : 0, \ - this_id: -1, \ - sg_tablesize : IPS_MAX_SG, \ - cmd_per_lun: 16, \ - present : 0, \ - unchecked_isa_dma : 0, \ - use_clustering : ENABLE_CLUSTERING, \ - use_new_eh_code : 1 \ -} -#elif LINUX_VERSION_CODE < LinuxVersionCode(2,5,0) - #define IPS { \ - next : NULL, \ - module : NULL, \ - proc_info : NULL, \ - name : NULL, \ - detect : ips_detect, \ - release : ips_release, \ - info : ips_info, \ - command : NULL, \ - queuecommand : ips_queue, \ - eh_strategy_handler : NULL, \ - eh_abort_handler : ips_eh_abort, \ - eh_device_reset_handler : NULL, \ - eh_bus_reset_handler : NULL, \ - eh_host_reset_handler : ips_eh_reset, \ - abort : NULL, \ - reset : NULL, \ - slave_attach : NULL, \ - bios_param : ips_biosparam, \ - can_queue : 0, \ - this_id: -1, \ - sg_tablesize : IPS_MAX_SG, \ - cmd_per_lun: 16, \ - present : 0, \ - unchecked_isa_dma : 0, \ - use_clustering : ENABLE_CLUSTERING, \ - use_new_eh_code : 1 \ +#if LINUX_VERSION_CODE < LinuxVersionCode(2,5,0) + static void ips_select_queue_depth(struct Scsi_Host *, Scsi_Device *); +#define IPS { \ + .detect = ips_detect, \ + .release = ips_release, \ + .info = ips_info, \ + .queuecommand = ips_queue, \ + .eh_abort_handler = ips_eh_abort, \ + .eh_host_reset_handler = ips_eh_reset, \ + .bios_param = ips_biosparam,\ + .select_queue_depths = ips_select_queue_depth, \ + .can_queue = 0, \ + .this_id = -1, \ + .sg_tablesize = IPS_MAX_SG, \ + .cmd_per_lun = 16, \ + .present = 0, \ + .unchecked_isa_dma = 0, \ + .use_clustering = ENABLE_CLUSTERING,\ + .use_new_eh_code = 1, \ + IPS_HIGHMEM_IO \ } #else - #define IPS { \ - next : NULL, \ - module : NULL, \ - proc_info : NULL, \ - name : NULL, \ - detect : ips_detect, \ - release : ips_release, \ - info : ips_info, \ - command : NULL, \ - queuecommand : ips_queue, \ - eh_strategy_handler : NULL, \ - eh_abort_handler : ips_eh_abort, \ - eh_device_reset_handler : NULL, \ - eh_bus_reset_handler : NULL, \ - eh_host_reset_handler : ips_eh_reset, \ - abort : NULL, \ - reset : NULL, \ - slave_attach : NULL, \ - bios_param : ips_biosparam, \ - can_queue : 0, \ - this_id: -1, \ - sg_tablesize : IPS_MAX_SG, \ - cmd_per_lun: 16, \ - present : 0, \ - unchecked_isa_dma : 0, \ - use_clustering : ENABLE_CLUSTERING, \ - highmem_io : 1 \ +#define IPS { \ + .detect = ips_detect, \ + .release = ips_release, \ + .info = ips_info, \ + .queuecommand = ips_queue, \ + .eh_abort_handler = ips_eh_abort, \ + .eh_host_reset_handler = ips_eh_reset, \ + .slave_configure = ips_slave_configure, \ + .bios_param = ips_biosparam, \ + .can_queue = 0, \ + .this_id = -1, \ + .sg_tablesize = IPS_MAX_SG, \ + .cmd_per_lun = 3, \ + .present = 0, \ + .unchecked_isa_dma = 0, \ + .use_clustering = ENABLE_CLUSTERING, \ + .highmem_io = 1 \ } #endif @@ -491,7 +488,8 @@ uint32_t lba; uint32_t sg_addr; uint16_t sector_count; - uint16_t reserved; + uint8_t segment_4G; + uint8_t enhanced_sg; uint32_t ccsar; uint32_t cccr; } IPS_IO_CMD, *PIPS_IO_CMD; @@ -542,7 +540,9 @@ uint16_t reserved; uint32_t reserved2; uint32_t dcdb_address; - uint32_t reserved3; + uint16_t reserved3; + uint8_t segment_4G; + uint8_t enhanced_sg; uint32_t ccsar; uint32_t cccr; } IPS_DCDB_CMD, *PIPS_DCDB_CMD; @@ -986,7 +986,20 @@ typedef struct ips_sglist { uint32_t address; uint32_t length; -} IPS_SG_LIST, *PIPS_SG_LIST; +} IPS_STD_SG_LIST; + +typedef struct ips_enh_sglist { + uint32_t address_lo; + uint32_t address_hi; + uint32_t length; + uint32_t reserved; +} IPS_ENH_SG_LIST; + +typedef union { + void *list; + IPS_STD_SG_LIST *std_list; + IPS_ENH_SG_LIST *enh_list; +} IPS_SG_LIST; typedef struct _IPS_INFOSTR { char *buffer; @@ -1086,6 +1099,7 @@ char *ioctl_data; /* IOCTL data area */ uint32_t ioctl_datasize; /* IOCTL data size */ uint32_t cmd_in_progress; /* Current command in progress*/ + int flags; /* */ uint8_t waitflag; /* are we waiting for cmd */ uint8_t active; int ioctl_reset; /* IOCTL Requested Reset Flag */ @@ -1133,7 +1147,7 @@ uint32_t sg_len; uint32_t flags; uint32_t op_code; - IPS_SG_LIST *sg_list; + IPS_SG_LIST sg_list; Scsi_Cmnd *scsi_cmd; struct ips_scb *q_next; ips_scb_callback callback; @@ -1194,11 +1208,13 @@ #define IPS_VER_MAJOR 6 #define IPS_VER_MAJOR_STRING "6" -#define IPS_VER_MINOR 00 -#define IPS_VER_MINOR_STRING "00" -#define IPS_VER_BUILD 26 -#define IPS_VER_BUILD_STRING "26" -#define IPS_VER_STRING "6.00.26" +#define IPS_VER_MINOR 10 +#define IPS_VER_MINOR_STRING "10" +#define IPS_VER_BUILD 24 +#define IPS_VER_BUILD_STRING "24" +#define IPS_VER_STRING "6.10.24" +#define IPS_RELEASE_ID 0x00010000 +#define IPS_BUILD_IDENT 1250 #define IPS_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2003. All Rights Reserved." #define IPS_ADAPTECCOPYRIGHT_STRING "(c) Copyright Adaptec, Inc. 2002 to present. All Rights Reserved." #define IPS_NT_LEGALCOPYRIGHT_STRING "(C) Copyright IBM Corp. 1994, 2003." @@ -1207,31 +1223,33 @@ #define IPS_VER_SERVERAID1 "2.25.01" #define IPS_VER_SERVERAID2 "2.88.13" #define IPS_VER_NAVAJO "2.88.13" -#define IPS_VER_SERVERAID3 "6.00.26" -#define IPS_VER_SERVERAID4H "6.00.26" -#define IPS_VER_SERVERAID4MLx "6.00.26" -#define IPS_VER_SARASOTA "6.00.26" -#define IPS_VER_MARCO "6.00.26" +#define IPS_VER_SERVERAID3 "6.10.24" +#define IPS_VER_SERVERAID4H "6.10.24" +#define IPS_VER_SERVERAID4MLx "6.10.24" +#define IPS_VER_SARASOTA "6.10.24" +#define IPS_VER_MARCO "6.10.24" +#define IPS_VER_SEBRING "6.10.24" /* Compatability IDs for various adapters */ #define IPS_COMPAT_UNKNOWN "" -#define IPS_COMPAT_CURRENT "MR600" +#define IPS_COMPAT_CURRENT "SB610" #define IPS_COMPAT_SERVERAID1 "2.25.01" #define IPS_COMPAT_SERVERAID2 "2.88.13" #define IPS_COMPAT_NAVAJO "2.88.13" #define IPS_COMPAT_KIOWA "2.88.13" -#define IPS_COMPAT_SERVERAID3H "MR600" -#define IPS_COMPAT_SERVERAID3L "MR600" -#define IPS_COMPAT_SERVERAID4H "MR600" -#define IPS_COMPAT_SERVERAID4M "MR600" -#define IPS_COMPAT_SERVERAID4L "MR600" -#define IPS_COMPAT_SERVERAID4Mx "MR600" -#define IPS_COMPAT_SERVERAID4Lx "MR600" -#define IPS_COMPAT_SARASOTA "MR600" -#define IPS_COMPAT_MARCO "MR600" -#define IPS_COMPAT_BIOS "MR600" +#define IPS_COMPAT_SERVERAID3H "SB610" +#define IPS_COMPAT_SERVERAID3L "SB610" +#define IPS_COMPAT_SERVERAID4H "SB610" +#define IPS_COMPAT_SERVERAID4M "SB610" +#define IPS_COMPAT_SERVERAID4L "SB610" +#define IPS_COMPAT_SERVERAID4Mx "SB610" +#define IPS_COMPAT_SERVERAID4Lx "SB610" +#define IPS_COMPAT_SARASOTA "SB610" +#define IPS_COMPAT_MARCO "SB610" +#define IPS_COMPAT_SEBRING "SB610" +#define IPS_COMPAT_BIOS "SB610" -#define IPS_COMPAT_MAX_ADAPTER_TYPE 15 +#define IPS_COMPAT_MAX_ADAPTER_TYPE 16 #define IPS_COMPAT_ID_LENGTH 8 #define IPS_DEFINE_COMPAT_TABLE(tablename) \ @@ -1250,7 +1268,8 @@ IPS_COMPAT_SERVERAID4Lx, \ IPS_COMPAT_SARASOTA, /* one-channel variety of SARASOTA */ \ IPS_COMPAT_SARASOTA, /* two-channel variety of SARASOTA */ \ - IPS_COMPAT_MARCO \ + IPS_COMPAT_MARCO, \ + IPS_COMPAT_SEBRING \ } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/mac_scsi.c linux-2.4.23-pre8/drivers/scsi/mac_scsi.c --- linux-2.4.22/drivers/scsi/mac_scsi.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/mac_scsi.c 2003-10-22 22:47:40.000000000 +0000 @@ -253,16 +253,16 @@ ((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0; - if (instance->irq != IRQ_NONE) + if (instance->irq != SCSI_IRQ_NONE) if (request_irq(instance->irq, NCR5380_intr, IRQ_FLG_SLOW, "ncr5380", NCR5380_intr)) { printk(KERN_WARNING "scsi%d: IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; } printk(KERN_INFO "scsi%d: generic 5380 at port %lX irq", instance->host_no, instance->io_port); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) printk (KERN_INFO "s disabled"); else printk (KERN_INFO " %d", instance->irq); @@ -277,7 +277,7 @@ int macscsi_release (struct Scsi_Host *shpnt) { - if (shpnt->irq != IRQ_NONE) + if (shpnt->irq != SCSI_IRQ_NONE) free_irq (shpnt->irq, NCR5380_intr); return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/megaraid.c linux-2.4.23-pre8/drivers/scsi/megaraid.c --- linux-2.4.22/drivers/scsi/megaraid.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/megaraid.c 2003-10-22 22:47:28.000000000 +0000 @@ -9,7 +9,7 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Version : v1.18f (Dec 10, 2002) + * Version : v1.18k (Aug 28, 2003) * * Description: Linux device driver for LSI Logic MegaRAID controller * @@ -512,6 +512,54 @@ * * remove GFP_DMA flag for ioctl. This was causing overrun of DMA buffers. * + * Version 1.18g + * Fri Jan 31 18:29:25 EST 2003 - Atul Mukker + * + * Write the interrupt valid signature 0x10001234 as soon as reading it to + * flush memory caches. + * + * While sending back the inquiry information, check if the original request + * had an associated scatter-gather list and tranfer data from bounce buffer + * accordingly. + * + * Version 1.18h + * Thu Feb 6 17:18:48 EST 2003 - Atul Mukker + * + * Reduce the number of sectors per command to 128 from original value of + * 1024. Big IO sizes along with certain other operation going on in parallel, + * e.g., check consistency and rebuild put a heavy constraint on fW resources + * resulting in aborted commands. + * + * Version 1.18i + * Fri Jun 20 07:39:05 EDT 2003 - Atul Mukker + * + * Request and reserve memory/IO regions. Otherwise a panic occurs if 2.00.x + * driver is loaded on top of 1.18x driver + * + * Prevent memory leak in cases when data transfer from/to application fails + * and ioctl is failing. + * + * Set the PCI dma_mask to default value of 0xFFFFFFFF when we get a handle to + * it. The previous value of 64-bit might be sticky and would cause the memory + * for mailbox and scatter lists to be allocated beyond 4GB. This was observed + * on an Itenium + * + * Version 1.18j + * Mon Jul 7 14:39:55 EDT 2003 - Atul Mukker + * + * Disable /proc/megaraid/stat file to prevent buffer overflow error during + * read of this file. + * + * Add support for ioctls on AMD-64 bit platforms + * - Sreenivas Bagalkote + * + * Version 1.18k + * Thu Aug 28 10:05:11 EDT 2003 - Atul Mukker + * + * Make sure to read the correct status and command ids while in ISR. The + * numstatus and command id array is invalidated before issuing the commands. + * The ISR busy-waits till the correct values are updated in host memory. + * * BUGS: * Some older 2.1 kernels (eg. 2.1.90) have a bug in pci.c that * fails to detect the controller as a pci device on the system. @@ -575,12 +623,27 @@ #include #include +#ifdef __x86_64__ +#include +#endif + #include "sd.h" #include "scsi.h" #include "hosts.h" #include "megaraid.h" +#ifdef __x86_64__ +/* + * The IOCTL cmd received from 32 bit compiled applications + */ + +extern int register_ioctl32_conversion( unsigned int cmd, + int(*handler)(unsigned int, unsigned int, unsigned long, + struct file* )); +extern int unregister_ioctl32_conversion( unsigned int cmd ); +#endif + /* *================================================================ * #Defines @@ -1141,8 +1204,14 @@ switch (SCpnt->cmnd[0]) { case INQUIRY: case READ_CAPACITY: - memcpy (SCpnt->request_buffer, - pScb->bounce_buffer, SCpnt->request_bufflen); + if ( SCpnt->use_sg ) { + sgList = (struct scatterlist *)SCpnt->request_buffer; + memcpy(sgList[0].address, pScb->bounce_buffer, + SCpnt->request_bufflen); + } else { + memcpy (SCpnt->request_buffer, pScb->bounce_buffer, + SCpnt->request_bufflen); + } break; } #endif @@ -2202,30 +2271,22 @@ megaCfg = (mega_host_config *) devp; mbox = (mega_mailbox *) tmpBox; - if (megaCfg->host->irq == irq) { - if (megaCfg->flag & IN_ISR) { - TRACE (("ISR called reentrantly!!\n")); - printk ("ISR called reentrantly!!\n"); - } - megaCfg->flag |= IN_ISR; - - if (mega_busyWaitMbox (megaCfg)) { - printk (KERN_WARNING "Error: mailbox busy in isr!\n"); - } + IO_LOCK; /* Check if a valid interrupt is pending */ if (megaCfg->flag & BOARD_QUARTZ) { dword = RDOUTDOOR (megaCfg); if (dword != 0x10001234) { /* Spurious interrupt */ - megaCfg->flag &= ~IN_ISR; + IO_UNLOCK; return; } + WROUTDOOR (megaCfg, 0x10001234); } else { byte = READ_PORT (megaCfg->host->io_port, INTR_PORT); if ((byte & VALID_INTR_BYTE) == 0) { /* Spurious interrupt */ - megaCfg->flag &= ~IN_ISR; + IO_UNLOCK; return; } WRITE_PORT (megaCfg->host->io_port, INTR_PORT, byte); @@ -2234,58 +2295,27 @@ for (idx = 0; idx < MAX_FIRMWARE_STATUS; idx++) completed[idx] = 0; - IO_LOCK; megaCfg->nInterrupts++; - qCnt = 0xff; while ((qCnt = megaCfg->mbox->numstatus) == 0xFF) ; - - qStatus = 0xff; - while ((qStatus = megaCfg->mbox->status) == 0xFF) ; + megaCfg->mbox->numstatus = 0xFF; /* Get list of completed requests */ for (idx = 0; idx < qCnt; idx++) { - while ((sIdx = megaCfg->mbox->completed[idx]) == 0xFF) { - printk ("p"); - } - completed[idx] = sIdx; - sIdx = 0xFF; + while ((completed[idx] = megaCfg->mbox->completed[idx]) == 0xFF); + megaCfg->mbox->completed[idx] = 0xFF; } + qStatus = megaCfg->mbox->status; + if (megaCfg->flag & BOARD_QUARTZ) { - WROUTDOOR (megaCfg, dword); /* Acknowledge interrupt */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) - /* In this case mbox contains physical address */ -#if 0 - WRINDOOR (megaCfg, megaCfg->adjdmahandle64 | 0x2); -#else - WRINDOOR (megaCfg, 0x2); -#endif - -#else - -#if 0 - WRINDOOR (megaCfg, virt_to_bus (megaCfg->mbox) | 0x2); -#else WRINDOOR (megaCfg, 0x2); -#endif - -#endif - -#if 0 while (RDINDOOR (megaCfg) & 0x02) ; -#endif } else { CLEAR_INTR (megaCfg->host->io_port); } -#if DEBUG - if (qCnt >= MAX_FIRMWARE_STATUS) { - printk ("megaraid_isr: cmplt=%d ", qCnt); - } -#endif - for (idx = 0; idx < qCnt; idx++) { sIdx = completed[idx]; if ((sIdx > 0) && (sIdx <= MAX_COMMANDS)) { @@ -2355,26 +2385,24 @@ mega_runpendq (megaCfg); IO_UNLOCK; - } - } /*==================================================*/ /* Wait until the controller's mailbox is available */ /*==================================================*/ -static int mega_busyWaitMbox (mega_host_config * megaCfg) +static inline int mega_busyWaitMbox (mega_host_config * megaCfg) { mega_mailbox *mbox = (mega_mailbox *) megaCfg->mbox; long counter; - for (counter = 0; counter < 10000; counter++) { + for (counter = 0; counter < 10; counter++) { if (!mbox->busy) { return 0; } - udelay (100); + udelay (1); } - return -1; /* give up after 1 second */ + return -1; /* give up after 10 usecs */ } /*===================================================== @@ -2409,6 +2437,7 @@ u32 phys_mbox; #endif u8 retval = -1; + int i; mboxData[0x1] = (pScb ? pScb->idx + 1 : 0xFE); /* Set cmdid */ mboxData[0xF] = 1; /* Set busy */ @@ -2420,25 +2449,8 @@ phys_mbox = virt_to_bus (megaCfg->mbox); #endif -#if DEBUG - ShowMbox (pScb); -#endif - /* Wait until mailbox is free */ if (mega_busyWaitMbox (megaCfg)) { - printk ("Blocked mailbox......!!\n"); - udelay (1000); - -#if DEBUG - showMbox (pLastScb); -#endif - - /* Abort command */ - if (pScb == NULL) { - TRACE (("NULL pScb in megaIssue\n")); - printk ("NULL pScb in megaIssue\n"); - } - mega_cmd_done (megaCfg, pScb, 0x08); return -1; } @@ -2486,13 +2498,10 @@ WRINDOOR (megaCfg, phys_mbox | 0x1); while (mbox->numstatus == 0xFF) ; - while (mbox->status == 0xFF) ; while (mbox->mraid_poll != 0x77) ; mbox->mraid_poll = 0; mbox->mraid_ack = 0x77; - - /* while ((cmdDone = RDOUTDOOR (megaCfg)) != 0x10001234); - WROUTDOOR (megaCfg, cmdDone); */ + mbox->numstatus = 0xFF; if (pScb) { mega_cmd_done (megaCfg, pScb, mbox->status); @@ -2520,15 +2529,14 @@ TRACE (("Error: NULL pScb!\n")); } } + + for (i = 0; i < MAX_FIRMWARE_STATUS; i++) { + mbox->completed[i] = 0xFF; + } + enable_irq (megaCfg->host->irq); retval = mbox->status; } -#if DEBUG - while (mega_busyWaitMbox (megaCfg)) { - printk(KERN_ERR "Blocked mailbox on exit......!\n"); - udelay (1000); - } -#endif return retval; } @@ -2964,15 +2972,15 @@ int i, j; -#if BITS_PER_LONG==64 - u64 megaBase; -#else - u32 megaBase; -#endif + unsigned long megaBase; + unsigned long tbase; u16 pciIdx = 0; u16 numFound = 0; u16 subsysid, subsysvid; + u8 did_mem_map_f = 0; + u8 did_io_map_f = 0; + u8 did_scsi_register_f = 0; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) /* 0x20100 */ while (!pcibios_find_device @@ -2991,6 +2999,17 @@ pciBus = pdev->bus->number; pciDevFun = pdev->devfn; #endif + + /* + * Set the dma_mask to default value. It might be sticky from previous + * insmod-rmmod sequence + */ + pdev->dma_mask = 0xFFFFFFFF; + + did_mem_map_f = 0; + did_io_map_f = 0; + did_scsi_register_f = 0; + if ((flag & BOARD_QUARTZ) && (skip_id == -1)) { if( (pciVendor == PCI_VENDOR_ID_PERC4_DI_YSTONE && pciDev == PCI_DEVICE_ID_PERC4_DI_YSTONE) || @@ -3041,6 +3060,7 @@ if( (subsysvid != AMI_SUBSYS_ID) && (subsysvid != DELL_SUBSYS_ID) && (subsysvid != LSI_SUBSYS_ID) && + (subsysvid != INTEL_SUBSYS_ID) && (subsysvid != HP_SUBSYS_ID) ) continue; } @@ -3065,22 +3085,55 @@ megaIrq = pdev->irq; #endif + tbase = megaBase; + pciIdx++; if (flag & BOARD_QUARTZ) { + megaBase &= PCI_BASE_ADDRESS_MEM_MASK; + + if( ! request_mem_region(megaBase, 128, + "MegaRAID: LSI Logic Corporation" ) ) { + + printk(KERN_WARNING "megaraid: mem region busy!\n"); + + continue; + } + megaBase = (long) ioremap (megaBase, 128); - if (!megaBase) + + if (!megaBase) { + + printk(KERN_WARNING "megaraid: could not map hba memory!\n"); + + release_mem_region(tbase, 128); + continue; + } + did_mem_map_f = 1; + } else { megaBase &= PCI_BASE_ADDRESS_IO_MASK; megaBase += 0x10; + + if( ! request_region(megaBase, 16, + "MegaRAID: LSI Logic Corporation") ) { + + printk(KERN_WARNING "megaraid: region busy.\n"); + + continue; + } + did_io_map_f = 1; + } /* Initialize SCSI Host structure */ host = scsi_register (pHostTmpl, sizeof (mega_host_config)); if (!host) - goto err_unmap; + goto fail_attach; + + did_scsi_register_f = 1; /* * Comment the following initialization if you know 'max_sectors' is @@ -3088,7 +3141,7 @@ * This field was introduced in Linus's kernel 2.4.7pre3 and it * greatly increases the IO performance - AM */ - host->max_sectors = 1024; + host->max_sectors = 128; scsi_set_pci_device(host, pdev); megaCfg = (mega_host_config *) host->hostdata; @@ -3130,11 +3183,8 @@ megaCfg->host->unique_id = (pciBus << 8) | pciDevFun; megaCtlrs[numCtlrs] = megaCfg; - if (!(flag & BOARD_QUARTZ)) { - - /* Request our IO Range */ - if( !request_region(megaBase, 16, "megaraid") ) - goto err_unregister; + if (flag & BOARD_QUARTZ) { + megaCfg->host->base = tbase; } /* Request our IRQ */ @@ -3143,7 +3193,7 @@ printk (KERN_WARNING "megaraid: Couldn't register IRQ %d!\n", megaIrq); - goto err_release; + goto fail_attach; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) @@ -3265,8 +3315,7 @@ sizeof (mega_mailbox64), (void *) megaCfg->mailbox64ptr, megaCfg->dma_handle64); - scsi_unregister (host); - continue; + goto fail_attach; } /* @@ -3301,14 +3350,17 @@ #endif #endif continue; - err_release: - if (flag & BOARD_QUARTZ) - release_region (megaBase, 16); - err_unregister: - scsi_unregister (host); - err_unmap: - if (flag & BOARD_QUARTZ) - iounmap ((void *) megaBase); +fail_attach: + if( did_mem_map_f ) { + iounmap((void *)megaBase); + release_mem_region(tbase, 128); + } + if( did_io_map_f ) { + release_region(megaBase, 16); + } + if( did_scsi_register_f ) { + scsi_unregister (host); + } } return numFound; } @@ -3408,6 +3460,12 @@ } init_MUTEX (&mimd_entry_mtx); +#ifdef __x86_64__ + /* + * Register the 32-bit ioctl conversion + */ + register_ioctl32_conversion( MEGAIOCCMD, sys_ioctl ); +#endif } return count; @@ -3439,6 +3497,7 @@ /* Free our resources */ if (megaCfg->flag & BOARD_QUARTZ) { iounmap ((void *) megaCfg->base); + release_mem_region(megaCfg->host->base, 128); } else { release_region (megaCfg->host->io_port, 16); } @@ -3485,6 +3544,9 @@ unregister_chrdev (major, "megadev"); unregister_reboot_notifier (&mega_notifier); +#ifdef __x86_64__ + unregister_ioctl32_conversion( MEGAIOCCMD ); +#endif return 0; } @@ -4235,7 +4297,6 @@ static int proc_read_stat (char *page, char **start, off_t offset, int count, int *eof, void *data) { - int i; mega_host_config *megaCfg = (mega_host_config *) data; *start = page; @@ -4244,6 +4305,11 @@ proc_printf (megaCfg, "Interrupts Collected = %lu\n", megaCfg->nInterrupts); + proc_printf (megaCfg, "INTERFACE DISABLED\n"); + COPY_BACK; + return count; + +#if 0 // can cause buffer overrun with 40 logical drives and IO information for (i = 0; i < megaCfg->numldrv; i++) { proc_printf (megaCfg, "Logical Drive %d:\n", i); @@ -4259,6 +4325,7 @@ COPY_BACK; return count; +#endif } static int proc_read_status (char *page, char **start, off_t offset, @@ -4896,16 +4963,16 @@ if( kvaddr == NULL ) { printk(KERN_WARNING "megaraid:allocation failed\n"); ret = -ENOMEM; - goto out; + goto out_ioctl_cmd_new; } ioc.ui.fcs.buffer = kvaddr; if (inlen) { /* copyin the user data */ - if (copy_from_user(kvaddr, (char *)uaddr, length )) { - ret = -EFAULT; - goto out; + if( copy_from_user(kvaddr, (char *)uaddr, length ) ) { + ret = -EFAULT; + goto out_ioctl_cmd_new; } } } @@ -4923,10 +4990,9 @@ down(&mimd_ioctl_sem); if( !scsicmd->result && outlen ) { - if (copy_to_user(uaddr, kvaddr, length)) - { - ret = -EFAULT; - goto out; + if (copy_to_user(uaddr, kvaddr, length)) { + return -EFAULT; + goto out_ioctl_cmd_new; } } @@ -4946,7 +5012,8 @@ put_user (scsicmd->result, &uioc->mbox[17]); } -out: +out_ioctl_cmd_new: + if (kvaddr) { dma_free_consistent(pdevp, length, kvaddr, dma_addr); } @@ -5047,12 +5114,8 @@ if( kvaddr == NULL ) { printk (KERN_WARNING "megaraid:allocation failed\n"); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) /*0x20400 */ - kfree(scsicmd); -#else - scsi_init_free((char *)scsicmd, sizeof(Scsi_Cmnd)); -#endif - return -ENOMEM; + ret = -ENOMEM; + goto out_ioctl_cmd; } ioc.data = kvaddr; @@ -5060,9 +5123,15 @@ if (inlen) { if (ioc.mbox[0] == MEGA_MBOXCMD_PASSTHRU) { /* copyin the user data */ - copy_from_user (kvaddr, uaddr, ioc.pthru.dataxferlen); + if( copy_from_user (kvaddr, uaddr, ioc.pthru.dataxferlen)){ + ret = -EFAULT; + goto out_ioctl_cmd; + } } else { - copy_from_user (kvaddr, uaddr, inlen); + if( copy_from_user (kvaddr, uaddr, inlen) ) { + ret = -EFAULT; + goto out_ioctl_cmd; + } } } } @@ -5080,11 +5149,15 @@ if (!scsicmd->result && outlen) { if (ioc.mbox[0] == MEGA_MBOXCMD_PASSTHRU) { - if (copy_to_user (uaddr, kvaddr, ioc.pthru.dataxferlen)) + if (copy_to_user (uaddr, kvaddr, ioc.pthru.dataxferlen)) { ret = -EFAULT; + goto out_ioctl_cmd; + } } else { - if (copy_to_user (uaddr, kvaddr, outlen)) + if (copy_to_user (uaddr, kvaddr, outlen)) { ret = -EFAULT; + goto out_ioctl_cmd; + } } } @@ -5109,6 +5182,8 @@ put_user (scsicmd->result, &uioc->mbox[17]); /* status */ } +out_ioctl_cmd: + if (kvaddr) { dma_free_consistent(pdevp, PAGE_SIZE, kvaddr, dma_addr ); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/megaraid.h linux-2.4.23-pre8/drivers/scsi/megaraid.h --- linux-2.4.22/drivers/scsi/megaraid.h 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/megaraid.h 2003-10-22 22:48:59.000000000 +0000 @@ -30,7 +30,8 @@ #define M_RD_IOCTL_CMD_NEW 0x81 #define M_RD_DRIVER_IOCTL_INTERFACE 0x82 -#define MEGARAID_VERSION "v1.18f (Release Date: Tue Dec 10 09:54:39 EST 2002)\n" +#define MEGARAID_VERSION "v1.18k (Release Date: Thu Aug 28 10:05:11 EDT 2003)\n" + #define MEGARAID_IOCTL_VERSION 114 @@ -190,6 +191,7 @@ #define AMI_SUBSYS_ID 0x101E #define DELL_SUBSYS_ID 0x1028 #define HP_SUBSYS_ID 0x103C +#define INTEL_SUBSYS_ID 0x8086 #define AMI_SIGNATURE 0x3344 #define AMI_SIGNATURE_471 0xCCCC @@ -899,7 +901,9 @@ * Defines for Driver IOCTL interface, Op-code:M_RD_DRIVER_IOCTL_INTERFACE */ #define MEGAIOC_MAGIC 'm' -#define MEGAIOCCMD _IOWR(MEGAIOC_MAGIC, 0) /* Mega IOCTL command */ + +/* Mega IOCTL command */ +#define MEGAIOCCMD _IOWR(MEGAIOC_MAGIC, 0, struct uioctl_t) #define MEGAIOC_QNADAP 'm' /* Query # of adapters */ #define MEGAIOC_QDRVRVER 'e' /* Query driver version */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/megaraid2.c linux-2.4.23-pre8/drivers/scsi/megaraid2.c --- linux-2.4.22/drivers/scsi/megaraid2.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/megaraid2.c 2003-10-22 22:48:11.000000000 +0000 @@ -0,0 +1,5662 @@ +/* + * + * Linux MegaRAID device driver + * + * Copyright (c) 2002 LSI Logic 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 (at your option) any later version. + * + * Copyright (c) 2002 Red Hat, Inc. All rights reserved. + * - fixes + * - speed-ups (list handling fixes, issued_list, optimizations.) + * - lots of cleanups. + * + * Version : v2.00.9 (Sep 04, 2003) - Atul Mukker + * + * Description: Linux device driver for LSI Logic MegaRAID controller + * + * Supported controllers: MegaRAID 418, 428, 438, 466, 762, 467, 471, 490, 493 + * 518, 520, 531, 532 + * + * This driver is supported by LSI Logic, with assistance from Red Hat, Dell, + * and others. Please send updates to the public mailing list + * linux-megaraid-devel@dell.com, and subscribe to and read archives of this + * list at http://lists.us.dell.com/. + * + * For history of changes, see ChangeLog.megaraid. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sd.h" +#include "scsi.h" +#include "hosts.h" + +#include "megaraid2.h" + +MODULE_AUTHOR ("LSI Logic Corporation"); +MODULE_DESCRIPTION ("LSI Logic MegaRAID driver"); +MODULE_LICENSE ("GPL"); + +static unsigned int max_cmd_per_lun = DEF_CMD_PER_LUN; +MODULE_PARM(max_cmd_per_lun, "i"); +MODULE_PARM_DESC(max_cmd_per_lun, "Maximum number of commands which can be issued to a single LUN (default=DEF_CMD_PER_LUN=63)"); + +static unsigned short int max_sectors_per_io = MAX_SECTORS_PER_IO; +MODULE_PARM(max_sectors_per_io, "h"); +MODULE_PARM_DESC(max_sectors_per_io, "Maximum number of sectors per I/O request (default=MAX_SECTORS_PER_IO=128)"); + + +static unsigned short int max_mbox_busy_wait = MBOX_BUSY_WAIT; +MODULE_PARM(max_mbox_busy_wait, "h"); +MODULE_PARM_DESC(max_mbox_busy_wait, "Maximum wait for mailbox in microseconds if busy (default=MBOX_BUSY_WAIT=10)"); + +#define RDINDOOR(adapter) readl((adapter)->base + 0x20) +#define RDOUTDOOR(adapter) readl((adapter)->base + 0x2C) +#define WRINDOOR(adapter,value) writel(value, (adapter)->base + 0x20) +#define WROUTDOOR(adapter,value) writel(value, (adapter)->base + 0x2C) + +/* + * Global variables + */ + +static int hba_count; +static adapter_t *hba_soft_state[MAX_CONTROLLERS]; +#ifdef CONFIG_PROC_FS +static struct proc_dir_entry *mega_proc_dir_entry; +#endif + +static struct notifier_block mega_notifier = { + .notifier_call = megaraid_reboot_notify +}; + +/* For controller re-ordering */ +static struct mega_hbas mega_hbas[MAX_CONTROLLERS]; + +/* + * The File Operations structure for the serial/ioctl interface of the driver + */ +static struct file_operations megadev_fops = { + .ioctl = megadev_ioctl, + .open = megadev_open, + .release = megadev_close, + .owner = THIS_MODULE, +}; + +/* + * Array to structures for storing the information about the controllers. This + * information is sent to the user level applications, when they do an ioctl + * for this information. + */ +static struct mcontroller mcontroller[MAX_CONTROLLERS]; + +/* The current driver version */ +static u32 driver_ver = 0x02000000; + +/* major number used by the device for character interface */ +static int major; + +#define IS_RAID_CH(hba, ch) (((hba)->mega_ch_class >> (ch)) & 0x01) + + +/* + * Debug variable to print some diagnostic messages + */ +static int trace_level; + +/* + * megaraid_validate_parms() + * + * Validate that any module parms passed in + * have proper values. + */ +static void +megaraid_validate_parms(void) +{ + if( (max_cmd_per_lun <= 0) || (max_cmd_per_lun > MAX_CMD_PER_LUN) ) + max_cmd_per_lun = MAX_CMD_PER_LUN; + if( max_mbox_busy_wait > MBOX_BUSY_WAIT ) + max_mbox_busy_wait = MBOX_BUSY_WAIT; +} + + +/** + * megaraid_detect() + * @host_template - Our soft state maintained by mid-layer + * + * the detect entry point for the mid-layer. + * We scan the PCI bus for our controllers and start them. + * + * Note: PCI_DEVICE_ID_PERC4_DI below represents the PERC4/Di class of + * products. All of them share the same vendor id, device id, and subsystem + * vendor id but different subsystem ids. As of now, driver does not use the + * subsystem id. + */ +static int +megaraid_detect(Scsi_Host_Template *host_template) +{ + int i; + u16 dev_sw_table[] = { /* Table of all supported + vendor/device ids */ + + PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DISCOVERY, + PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_PERC4_DI, + PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_PERC4_QC_VERDE, + PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID, + PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID2, + PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3, + PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_AMI_MEGARAID3, + PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_AMI_MEGARAID3 }; + + + printk(KERN_NOTICE "megaraid: " MEGARAID_VERSION); + + megaraid_validate_parms(); + + /* + * Scan PCI bus for our all devices. + */ + for( i = 0; i < sizeof(dev_sw_table)/sizeof(u16); i += 2 ) { + + mega_find_card(host_template, dev_sw_table[i], + dev_sw_table[i+1]); + } + + if(hba_count) { + /* + * re-order hosts so that one with bootable logical drive + * comes first + */ + mega_reorder_hosts(); + +#ifdef CONFIG_PROC_FS + mega_proc_dir_entry = proc_mkdir("megaraid", &proc_root); + + if(!mega_proc_dir_entry) { + printk(KERN_WARNING + "megaraid: failed to create megaraid root\n"); + } + else { + for(i = 0; i < hba_count; i++) { + mega_create_proc_entry(i, mega_proc_dir_entry); + } + } +#endif + + /* + * Register the driver as a character device, for applications + * to access it for ioctls. + * First argument (major) to register_chrdev implies a dynamic + * major number allocation. + */ + major = register_chrdev(0, "megadev", &megadev_fops); + + /* + * Register the Shutdown Notification hook in kernel + */ + if(register_reboot_notifier(&mega_notifier)) { + printk(KERN_WARNING + "MegaRAID Shutdown routine not registered!!\n"); + } + + } + + return hba_count; +} + + + +/** + * mega_find_card() - find and start this controller + * @host_template - Our soft state maintained by mid-layer + * @pci_vendor - pci vendor id for this controller + * @pci_device - pci device id for this controller + * + * Scans the PCI bus for this vendor and device id combination, setup the + * resources, and register ourselves as a SCSI HBA driver, and setup all + * parameters for our soft state. + * + * This routine also checks for some buggy firmware and ajust the flags + * accordingly. + */ +static void +mega_find_card(Scsi_Host_Template *host_template, u16 pci_vendor, + u16 pci_device) +{ + struct Scsi_Host *host = NULL; + adapter_t *adapter = NULL; + u32 magic64; + unsigned long mega_baseport; + u16 subsysid, subsysvid; + u8 pci_bus; + u8 pci_dev_func; + u8 irq; + struct pci_dev *pdev = NULL; + u8 did_ioremap_f = 0; + u8 did_req_region_f = 0; + u8 did_scsi_reg_f = 0; + u8 got_ipdev_f = 0; + u8 alloc_int_buf_f = 0; + u8 alloc_scb_f = 0; + u8 got_irq_f = 0; + u8 did_setup_mbox_f = 0; + unsigned long tbase; + unsigned long flag = 0; + int i, j; + + while((pdev = pci_find_device(pci_vendor, pci_device, pdev))) { + + // reset flags for all controllers in this class + did_ioremap_f = 0; + did_req_region_f = 0; + did_scsi_reg_f = 0; + got_ipdev_f = 0; + alloc_int_buf_f = 0; + alloc_scb_f = 0; + got_irq_f = 0; + did_setup_mbox_f = 0; + + if(pci_enable_device (pdev)) continue; + + pci_bus = pdev->bus->number; + pci_dev_func = pdev->devfn; + + /* + * For these vendor and device ids, signature offsets are not + * valid and 64 bit is implicit + */ + if( (pci_vendor == PCI_VENDOR_ID_DELL && + pci_device == PCI_DEVICE_ID_PERC4_DI) || + (pci_vendor == PCI_VENDOR_ID_LSI_LOGIC && + pci_device == PCI_DEVICE_ID_PERC4_QC_VERDE) ) { + + flag |= BOARD_64BIT; + } + else { + pci_read_config_dword(pdev, PCI_CONF_AMISIG64, + &magic64); + + if (magic64 == HBA_SIGNATURE_64BIT) + flag |= BOARD_64BIT; + } + + subsysvid = pdev->subsystem_vendor; + subsysid = pdev->subsystem_device; + + /* + * If we do not find the valid subsys vendor id, refuse to + * load the driver. This is part of PCI200X compliance + * We load the driver if subsysvid is 0. + */ + if( subsysvid && (subsysvid != AMI_SUBSYS_VID) && + (subsysvid != DELL_SUBSYS_VID) && + (subsysvid != HP_SUBSYS_VID) && + (subsysvid != INTEL_SUBSYS_VID) && + (subsysvid != LSI_SUBSYS_VID) ) continue; + + + printk(KERN_NOTICE "megaraid: found 0x%4.04x:0x%4.04x:bus %d:", + pci_vendor, pci_device, pci_bus); + + printk("slot %d:func %d\n", + PCI_SLOT(pci_dev_func), PCI_FUNC(pci_dev_func)); + + /* Read the base port and IRQ from PCI */ + mega_baseport = pci_resource_start(pdev, 0); + irq = pdev->irq; + + tbase = mega_baseport; + + if( pci_resource_flags(pdev, 0) & IORESOURCE_MEM ) { + + if( check_mem_region(mega_baseport, 128) ) { + printk(KERN_WARNING + "megaraid: mem region busy!\n"); + continue; + } + request_mem_region(mega_baseport, 128, + "MegaRAID: LSI Logic Corporation."); + + mega_baseport = + (unsigned long)ioremap(mega_baseport, 128); + + if( !mega_baseport ) { + printk(KERN_WARNING + "megaraid: could not map hba memory\n"); + + release_mem_region(tbase, 128); + + continue; + } + + flag |= BOARD_MEMMAP; + + did_ioremap_f = 1; + } + else { + mega_baseport += 0x10; + + if( !request_region(mega_baseport, 16, "megaraid") ) + goto fail_attach; + + flag |= BOARD_IOMAP; + + did_req_region_f = 1; + } + + /* Initialize SCSI Host structure */ + host = scsi_register(host_template, sizeof(adapter_t)); + + if(!host) goto fail_attach; + + did_scsi_reg_f = 1; + + scsi_set_pci_device(host, pdev); + + adapter = (adapter_t *)host->hostdata; + memset(adapter, 0, sizeof(adapter_t)); + + /* + * Allocate a pci device structure for allocations done + * internally - all of which would be in memory <4GB + */ + adapter->ipdev = kmalloc(sizeof(struct pci_dev), GFP_KERNEL); + + if( adapter->ipdev == NULL ) goto fail_attach; + + got_ipdev_f = 1; + + memcpy(adapter->ipdev, pdev, sizeof(struct pci_dev)); + + if( pci_set_dma_mask(adapter->ipdev, 0xffffffff) != 0 ) + goto fail_attach; + + printk(KERN_NOTICE + "scsi%d:Found MegaRAID controller at 0x%lx, IRQ:%d\n", + host->host_no, mega_baseport, irq); + + adapter->base = mega_baseport; + + /* Copy resource info into structure */ + INIT_LIST_HEAD(&adapter->free_list); + INIT_LIST_HEAD(&adapter->pending_list); + + adapter->flag = flag; + spin_lock_init(&adapter->lock); + + // replace adapter->lock with io_request_lock for kernels w/o + // per host lock and delete the line which tries to initialize + // the lock in host structure. + adapter->host_lock = &io_request_lock; + + host->cmd_per_lun = max_cmd_per_lun; + host->max_sectors = max_sectors_per_io; + + adapter->dev = pdev; + adapter->host = host; + + adapter->host->irq = irq; + + if( flag & BOARD_MEMMAP ) { + adapter->host->base = tbase; + } + else { + adapter->host->io_port = tbase; + adapter->host->n_io_port = 16; + } + + adapter->host->unique_id = (pci_bus << 8) | pci_dev_func; + + /* + * Allocate buffer to issue internal commands. + */ + adapter->mega_buffer = pci_alloc_consistent(adapter->dev, + MEGA_BUFFER_SIZE, &adapter->buf_dma_handle); + + if( !adapter->mega_buffer ) { + printk(KERN_WARNING "megaraid: out of RAM.\n"); + goto fail_attach; + } + alloc_int_buf_f = 1; + + adapter->scb_list = kmalloc(sizeof(scb_t)*MAX_COMMANDS, + GFP_KERNEL); + + if(!adapter->scb_list) { + printk(KERN_WARNING "megaraid: out of RAM.\n"); + goto fail_attach; + } + + alloc_scb_f = 1; + + /* Request our IRQ */ + if( adapter->flag & BOARD_MEMMAP ) { + if(request_irq(irq, megaraid_isr_memmapped, SA_SHIRQ, + "megaraid", adapter)) { + printk(KERN_WARNING + "megaraid: Couldn't register IRQ %d!\n", + irq); + goto fail_attach; + } + } + else { + if(request_irq(irq, megaraid_isr_iomapped, SA_SHIRQ, + "megaraid", adapter)) { + printk(KERN_WARNING + "megaraid: Couldn't register IRQ %d!\n", + irq); + goto fail_attach; + } + } + got_irq_f = 1; + + if( mega_setup_mailbox(adapter) != 0 ) + goto fail_attach; + + did_setup_mbox_f = 1; + + if( mega_query_adapter(adapter) != 0 ) + goto fail_attach; + + /* + * Have checks for some buggy f/w + */ + if((subsysid == 0x1111) && (subsysvid == 0x1111)) { + /* + * Which firmware + */ + if (!strcmp(adapter->fw_version, "3.00") || + !strcmp(adapter->fw_version, "3.01")) { + + printk( KERN_WARNING + "megaraid: Your card is a Dell PERC " + "2/SC RAID controller with " + "firmware\nmegaraid: 3.00 or 3.01. " + "This driver is known to have " + "corruption issues\nmegaraid: with " + "those firmware versions on this " + "specific card. In order\nmegaraid: " + "to protect your data, please upgrade " + "your firmware to version\nmegaraid: " + "3.10 or later, available from the " + "Dell Technical Support web\n" + "megaraid: site at\nhttp://support." + "dell.com/us/en/filelib/download/" + "index.asp?fileid=2940\n" + ); + } + } + + /* + * If we have a HP 1M(0x60E7)/2M(0x60E8) controller with + * firmware H.01.07, H.01.08, and H.01.09 disable 64 bit + * support, since this firmware cannot handle 64 bit + * addressing + */ + + if((subsysvid == HP_SUBSYS_VID) && + ((subsysid == 0x60E7)||(subsysid == 0x60E8))) { + + /* + * which firmware + */ + if( !strcmp(adapter->fw_version, "H01.07") || + !strcmp(adapter->fw_version, "H01.08") || + !strcmp(adapter->fw_version, "H01.09") ) { + + printk(KERN_WARNING + "megaraid: Firmware H.01.07, " + "H.01.08, and H.01.09 on 1M/2M " + "controllers\n" + "megaraid: do not support 64 bit " + "addressing.\nmegaraid: DISABLING " + "64 bit support.\n"); + adapter->flag &= ~BOARD_64BIT; + } + } + + + if(mega_is_bios_enabled(adapter)) { + mega_hbas[hba_count].is_bios_enabled = 1; + } + mega_hbas[hba_count].hostdata_addr = adapter; + + /* + * Find out which channel is raid and which is scsi. This is + * for ROMB support. + */ + mega_enum_raid_scsi(adapter); + + /* + * Find out if a logical drive is set as the boot drive. If + * there is one, will make that as the first logical drive. + * ROMB: Do we have to boot from a physical drive. Then all + * the physical drives would appear before the logical disks. + * Else, all the physical drives would be exported to the mid + * layer after logical drives. + */ + mega_get_boot_drv(adapter); + + if( ! adapter->boot_pdrv_enabled ) { + for( i = 0; i < NVIRT_CHAN; i++ ) + adapter->logdrv_chan[i] = 1; + + for( i = NVIRT_CHAN; ilogdrv_chan[i] = 0; + + adapter->mega_ch_class <<= NVIRT_CHAN; + } + else { + j = adapter->product_info.nchannels; + for( i = 0; i < j; i++ ) + adapter->logdrv_chan[i] = 0; + + for( i = j; i < NVIRT_CHAN + j; i++ ) + adapter->logdrv_chan[i] = 1; + } + + + /* + * Do we support random deletion and addition of logical + * drives + */ + adapter->read_ldidmap = 0; /* set it after first logdrv + delete cmd */ + adapter->support_random_del = mega_support_random_del(adapter); + + /* Initialize SCBs */ + if(mega_init_scb(adapter)) { + goto fail_attach; + } + + /* + * Reset the pending commands counter + */ + atomic_set(&adapter->pend_cmds, 0); + + /* + * Reset the adapter quiescent flag + */ + atomic_set(&adapter->quiescent, 0); + + hba_soft_state[hba_count] = adapter; + + /* + * Fill in the structure which needs to be passed back to the + * application when it does an ioctl() for controller related + * information. + */ + i = hba_count; + + mcontroller[i].base = mega_baseport; + mcontroller[i].irq = irq; + mcontroller[i].numldrv = adapter->numldrv; + mcontroller[i].pcibus = pci_bus; + mcontroller[i].pcidev = pci_device; + mcontroller[i].pcifun = PCI_FUNC (pci_dev_func); + mcontroller[i].pciid = -1; + mcontroller[i].pcivendor = pci_vendor; + mcontroller[i].pcislot = PCI_SLOT (pci_dev_func); + mcontroller[i].uid = (pci_bus << 8) | pci_dev_func; + + + /* Set the Mode of addressing to 64 bit if we can */ + if((adapter->flag & BOARD_64BIT)&&(sizeof(dma_addr_t) == 8)) { + pci_set_dma_mask(pdev, 0xffffffffffffffff); + adapter->has_64bit_addr = 1; + } + else { + pci_set_dma_mask(pdev, 0xffffffff); + adapter->has_64bit_addr = 0; + } + + init_MUTEX(&adapter->int_mtx); + init_waitqueue_head(&adapter->int_waitq); + + adapter->this_id = DEFAULT_INITIATOR_ID; + adapter->host->this_id = DEFAULT_INITIATOR_ID; + +#if MEGA_HAVE_CLUSTERING + /* + * Is cluster support enabled on this controller + * Note: In a cluster the HBAs ( the initiators ) will have + * different target IDs and we cannot assume it to be 7. Call + * to mega_support_cluster() will get the target ids also if + * the cluster support is available + */ + adapter->has_cluster = mega_support_cluster(adapter); + + if( adapter->has_cluster ) { + printk(KERN_NOTICE + "megaraid: Cluster driver, initiator id:%d\n", + adapter->this_id); + } +#endif + + hba_count++; + continue; + +fail_attach: + if( did_setup_mbox_f ) { + pci_free_consistent(adapter->dev, sizeof(mbox64_t), + (void *)adapter->una_mbox64, + adapter->una_mbox64_dma); + } + + if( got_irq_f ) { + irq_disable(adapter); + free_irq(adapter->host->irq, adapter); + } + + if( alloc_scb_f ) { + kfree(adapter->scb_list); + } + + if( alloc_int_buf_f ) { + pci_free_consistent(adapter->dev, MEGA_BUFFER_SIZE, + (void *)adapter->mega_buffer, + adapter->buf_dma_handle); + } + + if( got_ipdev_f ) kfree(adapter->ipdev); + + if( did_scsi_reg_f ) scsi_unregister(host); + + if( did_ioremap_f ) { + iounmap((void *)mega_baseport); + release_mem_region(tbase, 128); + } + + if( did_req_region_f ) + release_region(mega_baseport, 16); + } + + return; +} + + +/** + * mega_setup_mailbox() + * @adapter - pointer to our soft state + * + * Allocates a 8 byte aligned memory for the handshake mailbox. + */ +static int +mega_setup_mailbox(adapter_t *adapter) +{ + unsigned long align; + + adapter->una_mbox64 = pci_alloc_consistent(adapter->dev, + sizeof(mbox64_t), &adapter->una_mbox64_dma); + + if( !adapter->una_mbox64 ) return -1; + + adapter->mbox = &adapter->una_mbox64->mbox; + + adapter->mbox = (mbox_t *)((((unsigned long) adapter->mbox) + 15) & + (~0UL ^ 0xFUL)); + + adapter->mbox64 = (mbox64_t *)(((unsigned long)adapter->mbox) - 8); + + align = ((void *)adapter->mbox) - ((void *)&adapter->una_mbox64->mbox); + + adapter->mbox_dma = adapter->una_mbox64_dma + 8 + align; + + /* + * Register the mailbox if the controller is an io-mapped controller + */ + if( adapter->flag & BOARD_IOMAP ) { + + outb_p(adapter->mbox_dma & 0xFF, + adapter->host->io_port + MBOX_PORT0); + + outb_p((adapter->mbox_dma >> 8) & 0xFF, + adapter->host->io_port + MBOX_PORT1); + + outb_p((adapter->mbox_dma >> 16) & 0xFF, + adapter->host->io_port + MBOX_PORT2); + + outb_p((adapter->mbox_dma >> 24) & 0xFF, + adapter->host->io_port + MBOX_PORT3); + + outb_p(ENABLE_MBOX_BYTE, + adapter->host->io_port + ENABLE_MBOX_REGION); + + irq_ack(adapter); + + irq_enable(adapter); + } + + return 0; +} + + +/* + * mega_query_adapter() + * @adapter - pointer to our soft state + * + * Issue the adapter inquiry commands to the controller and find out + * information and parameter about the devices attached + */ +static int +mega_query_adapter(adapter_t *adapter) +{ + dma_addr_t prod_info_dma_handle; + mega_inquiry3 *inquiry3; + u8 raw_mbox[16]; + mbox_t *mbox; + int retval; + + /* Initialize adapter inquiry mailbox */ + + mbox = (mbox_t *)raw_mbox; + + memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); + memset(mbox, 0, 16); + + /* + * Try to issue Inquiry3 command + * if not succeeded, then issue MEGA_MBOXCMD_ADAPTERINQ command and + * update enquiry3 structure + */ + mbox->xferaddr = (u32)adapter->buf_dma_handle; + + inquiry3 = (mega_inquiry3 *)adapter->mega_buffer; + + raw_mbox[0] = FC_NEW_CONFIG; /* i.e. mbox->cmd=0xA1 */ + raw_mbox[2] = NC_SUBOP_ENQUIRY3; /* i.e. 0x0F */ + raw_mbox[3] = ENQ3_GET_SOLICITED_FULL; /* i.e. 0x02 */ + + /* Issue a blocking command to the card */ + if ((retval = issue_scb_block(adapter, raw_mbox))) { + /* the adapter does not support 40ld */ + + mraid_ext_inquiry *ext_inq; + mraid_inquiry *inq; + dma_addr_t dma_handle; + + ext_inq = pci_alloc_consistent(adapter->dev, + sizeof(mraid_ext_inquiry), &dma_handle); + + if( ext_inq == NULL ) return -1; + + inq = &ext_inq->raid_inq; + + mbox->xferaddr = (u32)dma_handle; + + /*issue old 0x04 command to adapter */ + mbox->cmd = MEGA_MBOXCMD_ADPEXTINQ; + + issue_scb_block(adapter, raw_mbox); + + /* + * update Enquiry3 and ProductInfo structures with + * mraid_inquiry structure + */ + mega_8_to_40ld(inq, inquiry3, + (mega_product_info *)&adapter->product_info); + + pci_free_consistent(adapter->dev, sizeof(mraid_ext_inquiry), + ext_inq, dma_handle); + + } else { /*adapter supports 40ld */ + adapter->flag |= BOARD_40LD; + + /* + * get product_info, which is static information and will be + * unchanged + */ + prod_info_dma_handle = pci_map_single(adapter->dev, (void *) + &adapter->product_info, + sizeof(mega_product_info), PCI_DMA_FROMDEVICE); + + mbox->xferaddr = prod_info_dma_handle; + + raw_mbox[0] = FC_NEW_CONFIG; /* i.e. mbox->cmd=0xA1 */ + raw_mbox[2] = NC_SUBOP_PRODUCT_INFO; /* i.e. 0x0E */ + + if ((retval = issue_scb_block(adapter, raw_mbox))) + printk(KERN_WARNING + "megaraid: Product_info cmd failed with error: %d\n", + retval); + + pci_dma_sync_single(adapter->dev, prod_info_dma_handle, + sizeof(mega_product_info), + PCI_DMA_FROMDEVICE); + + pci_unmap_single(adapter->dev, prod_info_dma_handle, + sizeof(mega_product_info), PCI_DMA_FROMDEVICE); + } + + + /* + * kernel scans the channels from 0 to <= max_channel + */ + adapter->host->max_channel = + adapter->product_info.nchannels + NVIRT_CHAN -1; + + adapter->host->max_id = 16; /* max targets per channel */ + + adapter->host->max_lun = 7; /* Upto 7 luns for non disk devices */ + + adapter->host->cmd_per_lun = max_cmd_per_lun; + + adapter->numldrv = inquiry3->num_ldrv; + + adapter->max_cmds = adapter->product_info.max_commands; + + if(adapter->max_cmds > MAX_COMMANDS) + adapter->max_cmds = MAX_COMMANDS; + + adapter->host->can_queue = adapter->max_cmds - 1; + + /* + * Get the maximum number of scatter-gather elements supported by this + * firmware + */ + mega_get_max_sgl(adapter); + + adapter->host->sg_tablesize = adapter->sglen; + + + /* use HP firmware and bios version encoding */ + if (adapter->product_info.subsysvid == HP_SUBSYS_VID) { + sprintf (adapter->fw_version, "%c%d%d.%d%d", + adapter->product_info.fw_version[2], + adapter->product_info.fw_version[1] >> 8, + adapter->product_info.fw_version[1] & 0x0f, + adapter->product_info.fw_version[0] >> 8, + adapter->product_info.fw_version[0] & 0x0f); + sprintf (adapter->bios_version, "%c%d%d.%d%d", + adapter->product_info.bios_version[2], + adapter->product_info.bios_version[1] >> 8, + adapter->product_info.bios_version[1] & 0x0f, + adapter->product_info.bios_version[0] >> 8, + adapter->product_info.bios_version[0] & 0x0f); + } else { + memcpy(adapter->fw_version, + (char *)adapter->product_info.fw_version, 4); + adapter->fw_version[4] = 0; + + memcpy(adapter->bios_version, + (char *)adapter->product_info.bios_version, 4); + + adapter->bios_version[4] = 0; + } + + printk(KERN_NOTICE "megaraid: [%s:%s] detected %d logical drives.\n", + adapter->fw_version, adapter->bios_version, adapter->numldrv); + + /* + * Do we support extended (>10 bytes) cdbs + */ + adapter->support_ext_cdb = mega_support_ext_cdb(adapter); + if (adapter->support_ext_cdb) + printk(KERN_NOTICE "megaraid: supports extended CDBs.\n"); + + + return 0; +} + + +/* + * megaraid_queue() + * @scmd - Issue this scsi command + * @done - the callback hook into the scsi mid-layer + * + * The command queuing entry point for the mid-layer. + */ +static int +megaraid_queue(Scsi_Cmnd *scmd, void (*done)(Scsi_Cmnd *)) +{ + adapter_t *adapter; + scb_t *scb; + int busy=0; + + adapter = (adapter_t *)scmd->host->hostdata; + + scmd->scsi_done = done; + + + /* + * Allocate and build a SCB request + * busy flag will be set if mega_build_cmd() command could not + * allocate scb. We will return non-zero status in that case. + * NOTE: scb can be null even though certain commands completed + * successfully, e.g., MODE_SENSE and TEST_UNIT_READY, we would + * return 0 in that case. + */ + + scb = mega_build_cmd(adapter, scmd, &busy); + + if(scb) { + scb->state |= SCB_PENDQ; + list_add_tail(&scb->list, &adapter->pending_list); + + /* + * Check if the HBA is in quiescent state, e.g., during a + * delete logical drive opertion. If it is, don't run + * the pending_list. + */ + if(atomic_read(&adapter->quiescent) == 0) { + mega_runpendq(adapter); + } + return 0; + } + + return busy; +} + + +/** + * mega_build_cmd() + * @adapter - pointer to our soft state + * @cmd - Prepare using this scsi command + * @busy - busy flag if no resources + * + * Prepares a command and scatter gather list for the controller. This routine + * also finds out if the commands is intended for a logical drive or a + * physical device and prepares the controller command accordingly. + * + * We also re-order the logical drives and physical devices based on their + * boot settings. + */ +static scb_t * +mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) +{ + mega_ext_passthru *epthru; + mega_passthru *pthru; + scb_t *scb; + mbox_t *mbox; + long seg; + char islogical; + int max_ldrv_num; + int channel = 0; + int target = 0; + int ldrv_num = 0; /* logical drive number */ + + + /* + * filter the internal and ioctl commands + */ + if((cmd->cmnd[0] == MEGA_INTERNAL_CMD)) { + return cmd->buffer; + } + + + /* + * We know what channels our logical drives are on - mega_find_card() + */ + islogical = adapter->logdrv_chan[cmd->channel]; + + /* + * The theory: If physical drive is chosen for boot, all the physical + * devices are exported before the logical drives, otherwise physical + * devices are pushed after logical drives, in which case - Kernel sees + * the physical devices on virtual channel which is obviously converted + * to actual channel on the HBA. + */ + if( adapter->boot_pdrv_enabled ) { + if( islogical ) { + /* logical channel */ + channel = cmd->channel - + adapter->product_info.nchannels; + } + else { + channel = cmd->channel; /* this is physical channel */ + target = cmd->target; + + /* + * boot from a physical disk, that disk needs to be + * exposed first IF both the channels are SCSI, then + * booting from the second channel is not allowed. + */ + if( target == 0 ) { + target = adapter->boot_pdrv_tgt; + } + else if( target == adapter->boot_pdrv_tgt ) { + target = 0; + } + } + } + else { + if( islogical ) { + channel = cmd->channel; /* this is the logical channel + */ + } + else { + channel = cmd->channel - NVIRT_CHAN; /* physical + channel */ + target = cmd->target; + } + } + + + if(islogical) { + + /* have just LUN 0 for each target on virtual channels */ + if (cmd->lun) { + cmd->result = (DID_BAD_TARGET << 16); + cmd->scsi_done(cmd); + return NULL; + } + + ldrv_num = mega_get_ldrv_num(adapter, cmd, channel); + + + max_ldrv_num = (adapter->flag & BOARD_40LD) ? + MAX_LOGICAL_DRIVES_40LD : MAX_LOGICAL_DRIVES_8LD; + + /* + * max_ldrv_num increases by 0x80 if some logical drive was + * deleted. + */ + if(adapter->read_ldidmap) + max_ldrv_num += 0x80; + + if(ldrv_num > max_ldrv_num ) { + cmd->result = (DID_BAD_TARGET << 16); + cmd->scsi_done(cmd); + return NULL; + } + + } + else { + if( cmd->lun > 7) { + /* + * Do not support lun >7 for physically accessed + * devices + */ + cmd->result = (DID_BAD_TARGET << 16); + cmd->scsi_done(cmd); + return NULL; + } + } + + /* + * + * Logical drive commands + * + */ + if(islogical) { + switch (cmd->cmnd[0]) { + case TEST_UNIT_READY: + memset(cmd->request_buffer, 0, cmd->request_bufflen); + +#if MEGA_HAVE_CLUSTERING + /* + * Do we support clustering and is the support enabled + * If no, return success always + */ + if( !adapter->has_cluster ) { + cmd->result = (DID_OK << 16); + cmd->scsi_done(cmd); + return NULL; + } + + if(!(scb = mega_allocate_scb(adapter, cmd))) { + + cmd->result = (DID_ERROR << 16); + cmd->scsi_done(cmd); + *busy = 1; + + return NULL; + } + + scb->raw_mbox[0] = MEGA_CLUSTER_CMD; + scb->raw_mbox[2] = MEGA_RESERVATION_STATUS; + scb->raw_mbox[3] = ldrv_num; + + scb->dma_direction = PCI_DMA_NONE; + + return scb; +#else + cmd->result = (DID_OK << 16); + cmd->scsi_done(cmd); + return NULL; +#endif + + case MODE_SENSE: + memset(cmd->request_buffer, 0, cmd->cmnd[4]); + cmd->result = (DID_OK << 16); + cmd->scsi_done(cmd); + return NULL; + + case READ_CAPACITY: + case INQUIRY: + + if(!(adapter->flag & (1L << cmd->channel))) { + + printk(KERN_NOTICE + "scsi%d: scanning scsi channel %d ", + adapter->host->host_no, + cmd->channel); + printk("for logical drives.\n"); + + adapter->flag |= (1L << cmd->channel); + } + + /* Allocate a SCB and initialize passthru */ + if(!(scb = mega_allocate_scb(adapter, cmd))) { + + cmd->result = (DID_ERROR << 16); + cmd->scsi_done(cmd); + *busy = 1; + + return NULL; + } + pthru = scb->pthru; + + mbox = (mbox_t *)scb->raw_mbox; + memset(mbox, 0, sizeof(scb->raw_mbox)); + memset(pthru, 0, sizeof(mega_passthru)); + + pthru->timeout = 0; + pthru->ars = 1; + pthru->reqsenselen = 14; + pthru->islogical = 1; + pthru->logdrv = ldrv_num; + pthru->cdblen = cmd->cmd_len; + memcpy(pthru->cdb, cmd->cmnd, cmd->cmd_len); + + if( adapter->has_64bit_addr ) { + mbox->cmd = MEGA_MBOXCMD_PASSTHRU64; + } + else { + mbox->cmd = MEGA_MBOXCMD_PASSTHRU; + } + + scb->dma_direction = PCI_DMA_FROMDEVICE; + + pthru->numsgelements = mega_build_sglist(adapter, scb, + &pthru->dataxferaddr, &pthru->dataxferlen); + + mbox->xferaddr = scb->pthru_dma_addr; + + return scb; + + case READ_6: + case WRITE_6: + case READ_10: + case WRITE_10: + case READ_12: + case WRITE_12: + + /* Allocate a SCB and initialize mailbox */ + if(!(scb = mega_allocate_scb(adapter, cmd))) { + + cmd->result = (DID_ERROR << 16); + cmd->scsi_done(cmd); + *busy = 1; + + return NULL; + } + mbox = (mbox_t *)scb->raw_mbox; + + memset(mbox, 0, sizeof(scb->raw_mbox)); + mbox->logdrv = ldrv_num; + + /* + * A little hack: 2nd bit is zero for all scsi read + * commands and is set for all scsi write commands + */ + if( adapter->has_64bit_addr ) { + mbox->cmd = (*cmd->cmnd & 0x02) ? + MEGA_MBOXCMD_LWRITE64: + MEGA_MBOXCMD_LREAD64 ; + } + else { + mbox->cmd = (*cmd->cmnd & 0x02) ? + MEGA_MBOXCMD_LWRITE: + MEGA_MBOXCMD_LREAD ; + } + + /* + * 6-byte READ(0x08) or WRITE(0x0A) cdb + */ + if( cmd->cmd_len == 6 ) { + mbox->numsectors = (u32) cmd->cmnd[4]; + mbox->lba = + ((u32)cmd->cmnd[1] << 16) | + ((u32)cmd->cmnd[2] << 8) | + (u32)cmd->cmnd[3]; + + mbox->lba &= 0x1FFFFF; + +#if MEGA_HAVE_STATS + /* + * Take modulo 0x80, since the logical drive + * number increases by 0x80 when a logical + * drive was deleted + */ + if (*cmd->cmnd == READ_6) { + adapter->nreads[ldrv_num%0x80]++; + adapter->nreadblocks[ldrv_num%0x80] += + mbox->numsectors; + } else { + adapter->nwrites[ldrv_num%0x80]++; + adapter->nwriteblocks[ldrv_num%0x80] += + mbox->numsectors; + } +#endif + } + + /* + * 10-byte READ(0x28) or WRITE(0x2A) cdb + */ + if( cmd->cmd_len == 10 ) { + mbox->numsectors = + (u32)cmd->cmnd[8] | + ((u32)cmd->cmnd[7] << 8); + mbox->lba = + ((u32)cmd->cmnd[2] << 24) | + ((u32)cmd->cmnd[3] << 16) | + ((u32)cmd->cmnd[4] << 8) | + (u32)cmd->cmnd[5]; + +#if MEGA_HAVE_STATS + if (*cmd->cmnd == READ_10) { + adapter->nreads[ldrv_num%0x80]++; + adapter->nreadblocks[ldrv_num%0x80] += + mbox->numsectors; + } else { + adapter->nwrites[ldrv_num%0x80]++; + adapter->nwriteblocks[ldrv_num%0x80] += + mbox->numsectors; + } +#endif + } + + /* + * 12-byte READ(0xA8) or WRITE(0xAA) cdb + */ + if( cmd->cmd_len == 12 ) { + mbox->lba = + ((u32)cmd->cmnd[2] << 24) | + ((u32)cmd->cmnd[3] << 16) | + ((u32)cmd->cmnd[4] << 8) | + (u32)cmd->cmnd[5]; + + mbox->numsectors = + ((u32)cmd->cmnd[6] << 24) | + ((u32)cmd->cmnd[7] << 16) | + ((u32)cmd->cmnd[8] << 8) | + (u32)cmd->cmnd[9]; + +#if MEGA_HAVE_STATS + if (*cmd->cmnd == READ_12) { + adapter->nreads[ldrv_num%0x80]++; + adapter->nreadblocks[ldrv_num%0x80] += + mbox->numsectors; + } else { + adapter->nwrites[ldrv_num%0x80]++; + adapter->nwriteblocks[ldrv_num%0x80] += + mbox->numsectors; + } +#endif + } + + /* + * If it is a read command + */ + if( (*cmd->cmnd & 0x0F) == 0x08 ) { + scb->dma_direction = PCI_DMA_FROMDEVICE; + } + else { + scb->dma_direction = PCI_DMA_TODEVICE; + } + + /* Calculate Scatter-Gather info */ + mbox->numsgelements = mega_build_sglist(adapter, scb, + (u32 *)&mbox->xferaddr, (u32 *)&seg); + + return scb; + +#if MEGA_HAVE_CLUSTERING + case RESERVE: /* Fall through */ + case RELEASE: + + /* + * Do we support clustering and is the support enabled + */ + if( ! adapter->has_cluster ) { + + cmd->result = (DID_BAD_TARGET << 16); + cmd->scsi_done(cmd); + return NULL; + } + + /* Allocate a SCB and initialize mailbox */ + if(!(scb = mega_allocate_scb(adapter, cmd))) { + + cmd->result = (DID_ERROR << 16); + cmd->scsi_done(cmd); + *busy = 1; + + return NULL; + } + + scb->raw_mbox[0] = MEGA_CLUSTER_CMD; + scb->raw_mbox[2] = ( *cmd->cmnd == RESERVE ) ? + MEGA_RESERVE_LD : MEGA_RELEASE_LD; + + scb->raw_mbox[3] = ldrv_num; + + scb->dma_direction = PCI_DMA_NONE; + + return scb; +#endif + + default: + cmd->result = (DID_BAD_TARGET << 16); + cmd->scsi_done(cmd); + return NULL; + } + } + + /* + * Passthru drive commands + */ + else { + /* Allocate a SCB and initialize passthru */ + if(!(scb = mega_allocate_scb(adapter, cmd))) { + + cmd->result = (DID_ERROR << 16); + cmd->scsi_done(cmd); + *busy = 1; + + return NULL; + } + + mbox = (mbox_t *)scb->raw_mbox; + memset(mbox, 0, sizeof(scb->raw_mbox)); + + if( adapter->support_ext_cdb ) { + + epthru = mega_prepare_extpassthru(adapter, scb, cmd, + channel, target); + + mbox->cmd = MEGA_MBOXCMD_EXTPTHRU; + + mbox->xferaddr = scb->epthru_dma_addr; + + } + else { + + pthru = mega_prepare_passthru(adapter, scb, cmd, + channel, target); + + /* Initialize mailbox */ + if( adapter->has_64bit_addr ) { + mbox->cmd = MEGA_MBOXCMD_PASSTHRU64; + } + else { + mbox->cmd = MEGA_MBOXCMD_PASSTHRU; + } + + mbox->xferaddr = scb->pthru_dma_addr; + + } + return scb; + } + return NULL; +} + + +/** + * mega_prepare_passthru() + * @adapter - pointer to our soft state + * @scb - our scsi control block + * @cmd - scsi command from the mid-layer + * @channel - actual channel on the controller + * @target - actual id on the controller. + * + * prepare a command for the scsi physical devices. + */ +static mega_passthru * +mega_prepare_passthru(adapter_t *adapter, scb_t *scb, Scsi_Cmnd *cmd, + int channel, int target) +{ + mega_passthru *pthru; + + pthru = scb->pthru; + memset(pthru, 0, sizeof (mega_passthru)); + + /* 0=6sec/1=60sec/2=10min/3=3hrs */ + pthru->timeout = 2; + + pthru->ars = 1; + pthru->reqsenselen = 14; + pthru->islogical = 0; + + pthru->channel = (adapter->flag & BOARD_40LD) ? 0 : channel; + + pthru->target = (adapter->flag & BOARD_40LD) ? + (channel << 4) | target : target; + + pthru->cdblen = cmd->cmd_len; + pthru->logdrv = cmd->lun; + + memcpy(pthru->cdb, cmd->cmnd, cmd->cmd_len); + + /* Not sure about the direction */ + scb->dma_direction = PCI_DMA_BIDIRECTIONAL; + + /* Special Code for Handling READ_CAPA/ INQ using bounce buffers */ + switch (cmd->cmnd[0]) { + case INQUIRY: + case READ_CAPACITY: + if(!(adapter->flag & (1L << cmd->channel))) { + + printk(KERN_NOTICE + "scsi%d: scanning scsi channel %d [P%d] ", + adapter->host->host_no, + cmd->channel, channel); + printk("for physical devices.\n"); + + adapter->flag |= (1L << cmd->channel); + } + /* Fall through */ + default: + pthru->numsgelements = mega_build_sglist(adapter, scb, + &pthru->dataxferaddr, &pthru->dataxferlen); + break; + } + return pthru; +} + + +/** + * mega_prepare_extpassthru() + * @adapter - pointer to our soft state + * @scb - our scsi control block + * @cmd - scsi command from the mid-layer + * @channel - actual channel on the controller + * @target - actual id on the controller. + * + * prepare a command for the scsi physical devices. This rountine prepares + * commands for devices which can take extended CDBs (>10 bytes) + */ +static mega_ext_passthru * +mega_prepare_extpassthru(adapter_t *adapter, scb_t *scb, Scsi_Cmnd *cmd, + int channel, int target) +{ + mega_ext_passthru *epthru; + + epthru = scb->epthru; + memset(epthru, 0, sizeof(mega_ext_passthru)); + + /* 0=6sec/1=60sec/2=10min/3=3hrs */ + epthru->timeout = 2; + + epthru->ars = 1; + epthru->reqsenselen = 14; + epthru->islogical = 0; + + epthru->channel = (adapter->flag & BOARD_40LD) ? 0 : channel; + epthru->target = (adapter->flag & BOARD_40LD) ? + (channel << 4) | target : target; + + epthru->cdblen = cmd->cmd_len; + epthru->logdrv = cmd->lun; + + memcpy(epthru->cdb, cmd->cmnd, cmd->cmd_len); + + /* Not sure about the direction */ + scb->dma_direction = PCI_DMA_BIDIRECTIONAL; + + switch(cmd->cmnd[0]) { + case INQUIRY: + case READ_CAPACITY: + if(!(adapter->flag & (1L << cmd->channel))) { + + printk(KERN_NOTICE + "scsi%d: scanning scsi channel %d [P%d] ", + adapter->host->host_no, + cmd->channel, channel); + printk("for physical devices.\n"); + + adapter->flag |= (1L << cmd->channel); + } + /* Fall through */ + default: + epthru->numsgelements = mega_build_sglist(adapter, scb, + &epthru->dataxferaddr, &epthru->dataxferlen); + break; + } + + return epthru; +} + + +/** + * mega_allocate_scb() + * @adapter - pointer to our soft state + * @cmd - scsi command from the mid-layer + * + * Allocate a SCB structure. This is the central structure for controller + * commands. + */ +static inline scb_t * +mega_allocate_scb(adapter_t *adapter, Scsi_Cmnd *cmd) +{ + struct list_head *head = &adapter->free_list; + scb_t *scb; + + /* Unlink command from Free List */ + if( !list_empty(head) ) { + + scb = list_entry(head->next, scb_t, list); + + list_del_init(head->next); + + scb->state = SCB_ACTIVE; + scb->cmd = cmd; + scb->dma_type = MEGA_DMA_TYPE_NONE; + + return scb; + } + + return NULL; +} + + +/** + * mega_runpendq() + * @adapter - pointer to our soft state + * + * Runs through the list of pending requests. + */ +static inline void +mega_runpendq(adapter_t *adapter) +{ + if(!list_empty(&adapter->pending_list)) + __mega_runpendq(adapter); +} + +static void +__mega_runpendq(adapter_t *adapter) +{ + scb_t *scb; + struct list_head *pos, *next; + + /* Issue any pending commands to the card */ + list_for_each_safe(pos, next, &adapter->pending_list) { + + scb = list_entry(pos, scb_t, list); + + if( !(scb->state & SCB_ISSUED) ) { + + if( issue_scb(adapter, scb) != 0 ) + return; + } + } + + return; +} + + +/** + * issue_scb() + * @adapter - pointer to our soft state + * @scb - scsi control block + * + * Post a command to the card if the mailbox is available, otherwise return + * busy. We also take the scb from the pending list if the mailbox is + * available. + */ +static inline int +issue_scb(adapter_t *adapter, scb_t *scb) +{ + volatile mbox64_t *mbox64 = adapter->mbox64; + volatile mbox_t *mbox = adapter->mbox; + unsigned int i = 0; + + if(unlikely(mbox->busy)) { + do { + udelay(1); + i++; + } while( mbox->busy && (i < max_mbox_busy_wait) ); + + if(mbox->busy) return -1; + } + + /* Copy mailbox data into host structure */ + memcpy((char *)mbox, (char *)scb->raw_mbox, 16); + + mbox->cmdid = scb->idx; /* Set cmdid */ + mbox->busy = 1; /* Set busy */ + + + /* + * Increment the pending queue counter + */ + atomic_inc(&adapter->pend_cmds); + + switch (mbox->cmd) { + case MEGA_MBOXCMD_EXTPTHRU: + if( !adapter->has_64bit_addr ) break; + // else fall through + case MEGA_MBOXCMD_LREAD64: + case MEGA_MBOXCMD_LWRITE64: + case MEGA_MBOXCMD_PASSTHRU64: + mbox64->xfer_segment_lo = mbox->xferaddr; + mbox64->xfer_segment_hi = 0; + mbox->xferaddr = 0xFFFFFFFF; + break; + default: + mbox64->xfer_segment_lo = 0; + mbox64->xfer_segment_hi = 0; + } + + /* + * post the command + */ + scb->state |= SCB_ISSUED; + + if( likely(adapter->flag & BOARD_MEMMAP) ) { + mbox->poll = 0; + mbox->ack = 0; + WRINDOOR(adapter, adapter->mbox_dma | 0x1); + } + else { + irq_enable(adapter); + issue_command(adapter); + } + + return 0; +} + + +/** + * issue_scb_block() + * @adapter - pointer to our soft state + * @raw_mbox - the mailbox + * + * Issue a scb in synchronous and non-interrupt mode + */ +static int +issue_scb_block(adapter_t *adapter, u_char *raw_mbox) +{ + volatile mbox64_t *mbox64 = adapter->mbox64; + volatile mbox_t *mbox = adapter->mbox; + u8 byte; + u8 status; + int i; + + raw_mbox[0x1] = 0xFE; /* Set cmdid */ + raw_mbox[0xF] = 1; /* Set busy */ + + /* Wait until mailbox is free */ + if(mega_busywait_mbox (adapter)) + goto bug_blocked_mailbox; + + /* Copy mailbox data into host structure */ + memcpy((char *) mbox, raw_mbox, 16); + + switch (raw_mbox[0]) { + case MEGA_MBOXCMD_LREAD64: + case MEGA_MBOXCMD_LWRITE64: + case MEGA_MBOXCMD_PASSTHRU64: + case MEGA_MBOXCMD_EXTPTHRU: + mbox64->xfer_segment_lo = mbox->xferaddr; + mbox64->xfer_segment_hi = 0; + mbox->xferaddr = 0xFFFFFFFF; + break; + default: + mbox64->xfer_segment_lo = 0; + mbox64->xfer_segment_hi = 0; + } + + if( likely(adapter->flag & BOARD_MEMMAP) ) { + mbox->poll = 0; + mbox->ack = 0; + mbox->numstatus = 0xFF; + mbox->status = 0xFF; + WRINDOOR(adapter, adapter->mbox_dma | 0x1); + + while((volatile u8)mbox->numstatus == 0xFF) + cpu_relax(); + + mbox->numstatus = 0xFF; + + while((volatile u8)mbox->status == 0xFF) + cpu_relax(); + + status = mbox->status; + mbox->status = 0xFF; + + while( (volatile u8)mbox->poll != 0x77 ) + cpu_relax(); + + mbox->poll = 0; + mbox->ack = 0x77; + + WRINDOOR(adapter, adapter->mbox_dma | 0x2); + + while(RDINDOOR(adapter) & 0x2) + cpu_relax(); + } + else { + irq_disable(adapter); + issue_command(adapter); + + while (!((byte = irq_state(adapter)) & INTR_VALID)) + cpu_relax(); + + status = mbox->status; + mbox->numstatus = 0xFF; + mbox->status = 0xFF; + + set_irq_state(adapter, byte); + irq_enable(adapter); + irq_ack(adapter); + } + + // invalidate the completed command id array. After command + // completion, firmware would write the valid id. + for (i = 0; i < MAX_FIRMWARE_STATUS; i++) { + mbox->completed[i] = 0xFF; + } + + return status; + +bug_blocked_mailbox: + printk(KERN_WARNING "megaraid: Blocked mailbox......!!\n"); + udelay (1000); + return -1; +} + + +/** + * megaraid_isr_iomapped() + * @irq - irq + * @devp - pointer to our soft state + * @regs - unused + * + * Interrupt service routine for io-mapped controllers. + * Find out if our device is interrupting. If yes, acknowledge the interrupt + * and service the completed commands. + */ +static void +megaraid_isr_iomapped(int irq, void *devp, struct pt_regs *regs) +{ + adapter_t *adapter = devp; + unsigned long flags; + + + spin_lock_irqsave(adapter->host_lock, flags); + + megaraid_iombox_ack_sequence(adapter); + + /* Loop through any pending requests */ + if( atomic_read(&adapter->quiescent ) == 0) { + mega_runpendq(adapter); + } + + spin_unlock_irqrestore(adapter->host_lock, flags); + + return; +} + + +/** + * megaraid_iombox_ack_sequence - interrupt ack sequence for IO mapped HBAs + * @adapter - controller's soft state + * + * Interrupt ackrowledgement sequence for IO mapped HBAs + */ +static inline void +megaraid_iombox_ack_sequence(adapter_t *adapter) +{ + u8 status; + u8 nstatus; + u8 completed[MAX_FIRMWARE_STATUS]; + u8 byte; + int i; + + + /* + * loop till F/W has more commands for us to complete. + */ + do { + /* Check if a valid interrupt is pending */ + byte = irq_state(adapter); + if( (byte & VALID_INTR_BYTE) == 0 ) { + return; + } + set_irq_state(adapter, byte); + + while ((nstatus = adapter->mbox->numstatus) == 0xFF) { + cpu_relax(); + } + adapter->mbox->numstatus = 0xFF; + + for (i = 0; i < nstatus; i++) { + while ((completed[i] = adapter->mbox->completed[i]) + == 0xFF) { + cpu_relax(); + } + + adapter->mbox->completed[i] = 0xFF; + } + + // we must read the valid status now + if ((status = adapter->mbox->status) == 0xFF) { + printk(KERN_WARNING + "megaraid critical: status 0xFF from firmware.\n"); + } + adapter->mbox->status = 0xFF; + + /* + * decrement the pending queue counter + */ + atomic_sub(nstatus, &adapter->pend_cmds); + + /* Acknowledge interrupt */ + irq_ack(adapter); + + mega_cmd_done(adapter, completed, nstatus, status); + + } while(1); +} + + +/** + * megaraid_isr_memmapped() + * @irq - irq + * @devp - pointer to our soft state + * @regs - unused + * + * Interrupt service routine for memory-mapped controllers. + * Find out if our device is interrupting. If yes, acknowledge the interrupt + * and service the completed commands. + */ +static void +megaraid_isr_memmapped(int irq, void *devp, struct pt_regs *regs) +{ + adapter_t *adapter = devp; + unsigned long flags; + + + spin_lock_irqsave(adapter->host_lock, flags); + + megaraid_memmbox_ack_sequence(adapter); + + /* Loop through any pending requests */ + if(atomic_read(&adapter->quiescent) == 0) { + mega_runpendq(adapter); + } + + spin_unlock_irqrestore(adapter->host_lock, flags); + + return; +} + + +/** + * megaraid_memmbox_ack_sequence - interrupt ack sequence for memory mapped HBAs + * @adapter - controller's soft state + * + * Interrupt ackrowledgement sequence for memory mapped HBAs + */ +static inline void +megaraid_memmbox_ack_sequence(adapter_t *adapter) +{ + u8 status; + u32 dword = 0; + u8 nstatus; + u8 completed[MAX_FIRMWARE_STATUS]; + int i; + + + /* + * loop till F/W has more commands for us to complete. + */ + do { + /* Check if a valid interrupt is pending */ + dword = RDOUTDOOR(adapter); + if( dword != 0x10001234 ) { + /* + * No more pending commands + */ + return; + } + WROUTDOOR(adapter, 0x10001234); + + while ((nstatus = adapter->mbox->numstatus) == 0xFF) { + cpu_relax(); + } + adapter->mbox->numstatus = 0xFF; + + for (i = 0; i < nstatus; i++ ) { + while ((completed[i] = adapter->mbox->completed[i]) + == 0xFF) { + cpu_relax(); + } + + adapter->mbox->completed[i] = 0xFF; + } + + // we must read the valid status now + if ((status = adapter->mbox->status) == 0xFF) { + printk(KERN_WARNING + "megaraid critical: status 0xFF from firmware.\n"); + } + adapter->mbox->status = 0xFF; + + /* + * decrement the pending queue counter + */ + atomic_sub(nstatus, &adapter->pend_cmds); + + /* Acknowledge interrupt */ + WRINDOOR(adapter, 0x2); + + while( RDINDOOR(adapter) & 0x02 ) cpu_relax(); + + mega_cmd_done(adapter, completed, nstatus, status); + + } while(1); +} + + +/** + * mega_cmd_done() + * @adapter - pointer to our soft state + * @completed - array of ids of completed commands + * @nstatus - number of completed commands + * @status - status of the last command completed + * + * Complete the comamnds and call the scsi mid-layer callback hooks. + */ +static inline void +mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status) +{ + mega_ext_passthru *epthru = NULL; + struct scatterlist *sgl; + Scsi_Cmnd *cmd = NULL; + mega_passthru *pthru = NULL; + mbox_t *mbox = NULL; + u8 c; + scb_t *scb; + int cmdid; + int i; + + /* + * for all the commands completed, call the mid-layer callback routine + * and free the scb. + */ + for( i = 0; i < nstatus; i++ ) { + + cmdid = completed[i]; + + if( cmdid == CMDID_INT_CMDS ) { /* internal command */ + scb = &adapter->int_scb; + cmd = scb->cmd; + mbox = (mbox_t *)scb->raw_mbox; + + /* + * Internal command interface do not fire the extended + * passthru or 64-bit passthru + */ + pthru = scb->pthru; + + } + else { + scb = &adapter->scb_list[cmdid]; + cmd = scb->cmd; + pthru = scb->pthru; + epthru = scb->epthru; + mbox = (mbox_t *)scb->raw_mbox; + + /* + * Make sure f/w has completed a valid command + */ + if( !(scb->state & SCB_ISSUED) || scb->cmd == NULL ) { + printk(KERN_CRIT + "megaraid: invalid command "); + printk("Id %d, scb->state:%x, scsi cmd:%p\n", + cmdid, scb->state, scb->cmd); + + continue; + } + + /* + * Was an abort issued for this command + */ + if( scb->state & SCB_ABORT ) { + + printk(KERN_NOTICE + "megaraid: aborted cmd %lx[%x] complete.\n", + scb->cmd->serial_number, scb->idx); + + cmd->result = (DID_ABORT << 16); + + mega_free_scb(adapter, scb); + + cmd->scsi_done(cmd); + + continue; + } + + /* + * Was a reset issued for this command + */ + if( scb->state & SCB_RESET ) { + + printk(KERN_WARNING + "megaraid: reset cmd %lx[%x] complete.\n", + scb->cmd->serial_number, scb->idx); + + scb->cmd->result = (DID_RESET << 16); + + mega_free_scb (adapter, scb); + + cmd->scsi_done(cmd); + + continue; + } + +#if MEGA_HAVE_STATS + { + + int islogical = adapter->logdrv_chan[cmd->channel]; + int logdrv = mbox->logdrv; + + /* + * Maintain an error counter for the logical drive. + * Some application like SNMP agent need such + * statistics + */ + if( status && islogical && (cmd->cmnd[0] == READ_6 || + cmd->cmnd[0] == READ_10 || + cmd->cmnd[0] == READ_12)) { + /* + * Logical drive number increases by 0x80 when + * a logical drive is deleted + */ + adapter->rd_errors[logdrv%0x80]++; + } + + if( status && islogical && (cmd->cmnd[0] == WRITE_6 || + cmd->cmnd[0] == WRITE_10 || + cmd->cmnd[0] == WRITE_12)) { + /* + * Logical drive number increases by 0x80 when + * a logical drive is deleted + */ + adapter->wr_errors[logdrv%0x80]++; + } + + } +#endif + } + + /* + * Do not return the presence of hard disk on the channel so, + * inquiry sent, and returned data==hard disk or removable + * hard disk and not logical, request should return failure! - + * PJ + */ + if(cmd->cmnd[0] == INQUIRY) { + int islogical = adapter->logdrv_chan[cmd->channel]; + + if(!islogical) { + if( cmd->use_sg ) { + sgl = (struct scatterlist *) + cmd->request_buffer; + c = *(u8 *)sgl[0].address; + } + else { + c = *(u8 *)cmd->request_buffer; + } + + if(IS_RAID_CH(adapter, cmd->channel) && + ((c & 0x1F ) == TYPE_DISK)) { + status = 0xF0; + } + } + } + + /* clear result; otherwise, success returns corrupt value */ + cmd->result = 0; + + /* Convert MegaRAID status to Linux error code */ + switch (status) { + case 0x00: /* SUCCESS , i.e. SCSI_STATUS_GOOD */ + cmd->result |= (DID_OK << 16); + break; + + case 0x02: /* ERROR_ABORTED, i.e. + SCSI_STATUS_CHECK_CONDITION */ + + /* set sense_buffer and result fields */ + if( mbox->cmd == MEGA_MBOXCMD_PASSTHRU || + mbox->cmd == MEGA_MBOXCMD_PASSTHRU64 ) { + + memcpy(cmd->sense_buffer, pthru->reqsensearea, + 14); + + cmd->result = (DRIVER_SENSE << 24) | + (DID_OK << 16) | + (CHECK_CONDITION << 1); + } + else { + if (mbox->cmd == MEGA_MBOXCMD_EXTPTHRU) { + + memcpy(cmd->sense_buffer, + epthru->reqsensearea, 14); + + cmd->result = (DRIVER_SENSE << 24) | + (DID_OK << 16) | + (CHECK_CONDITION << 1); + } else { + cmd->sense_buffer[0] = 0x70; + cmd->sense_buffer[2] = ABORTED_COMMAND; + cmd->result |= (CHECK_CONDITION << 1); + } + } + break; + + case 0x08: /* ERR_DEST_DRIVE_FAILED, i.e. + SCSI_STATUS_BUSY */ + cmd->result |= (DID_BUS_BUSY << 16) | status; + break; + + default: +#if MEGA_HAVE_CLUSTERING + /* + * If TEST_UNIT_READY fails, we know + * MEGA_RESERVATION_STATUS failed + */ + if( cmd->cmnd[0] == TEST_UNIT_READY ) { + cmd->result |= (DID_ERROR << 16) | + (RESERVATION_CONFLICT << 1); + } + else + /* + * Error code returned is 1 if Reserve or Release + * failed or the input parameter is invalid + */ + if( status == 1 && + (cmd->cmnd[0] == RESERVE || + cmd->cmnd[0] == RELEASE) ) { + + cmd->result |= (DID_ERROR << 16) | + (RESERVATION_CONFLICT << 1); + } + else +#endif + cmd->result |= (DID_BAD_TARGET << 16)|status; + } + + /* + * Only free SCBs for the commands coming down from the + * mid-layer, not for which were issued internally + * + * For internal command, restore the status returned by the + * firmware so that user can interpret it. + */ + if( cmdid == CMDID_INT_CMDS ) { /* internal command */ + cmd->result = status; + + /* + * Remove the internal command from the pending list + */ + list_del_init(&scb->list); + scb->state = SCB_FREE; + } + else { + mega_free_scb(adapter, scb); + } + + /* + * Call the mid-layer callback for this command + */ + cmd->scsi_done(cmd); + } +} + + +/* + * Free a SCB structure + * Note: We assume the scsi commands associated with this scb is not free yet. + */ +static void +mega_free_scb(adapter_t *adapter, scb_t *scb) +{ + switch( scb->dma_type ) { + + case MEGA_DMA_TYPE_NONE: + break; + + case MEGA_BULK_DATA: + pci_unmap_page(adapter->host->pci_dev, scb->dma_h_bulkdata, + scb->cmd->request_bufflen, scb->dma_direction); + + if( scb->dma_direction == PCI_DMA_FROMDEVICE ) { + pci_dma_sync_single(adapter->host->pci_dev, + scb->dma_h_bulkdata, + scb->cmd->request_bufflen, + PCI_DMA_FROMDEVICE); + } + + break; + + case MEGA_SGLIST: + pci_unmap_sg(adapter->host->pci_dev, scb->cmd->request_buffer, + scb->cmd->use_sg, scb->dma_direction); + + if( scb->dma_direction == PCI_DMA_FROMDEVICE ) { + pci_dma_sync_sg(adapter->host->pci_dev, + scb->cmd->request_buffer, + scb->cmd->use_sg, PCI_DMA_FROMDEVICE); + } + + break; + + default: + break; + } + + /* + * Remove from the pending list + */ + list_del_init(&scb->list); + + /* Link the scb back into free list */ + scb->state = SCB_FREE; + scb->cmd = NULL; + + list_add(&scb->list, &adapter->free_list); +} + + +/* + * Wait until the controller's mailbox is available + */ +static inline int +mega_busywait_mbox (adapter_t *adapter) +{ + if (adapter->mbox->busy) + return __mega_busywait_mbox(adapter); + return 0; +} + +static int +__mega_busywait_mbox (adapter_t *adapter) +{ + volatile mbox_t *mbox = adapter->mbox; + long counter; + + for (counter = 0; counter < 10000; counter++) { + if (!mbox->busy) + return 0; + udelay(100); yield(); + } + return -1; /* give up after 1 second */ +} + +/* + * Copies data to SGLIST + * Note: For 64 bit cards, we need a minimum of one SG element for read/write + */ +static int +mega_build_sglist(adapter_t *adapter, scb_t *scb, u32 *buf, u32 *len) +{ + struct scatterlist *sgl; + struct page *page; + unsigned long offset; + Scsi_Cmnd *cmd; + int sgcnt; + int idx; + + cmd = scb->cmd; + + /* Scatter-gather not used */ + if( !cmd->use_sg ) { + + page = virt_to_page(cmd->request_buffer); + + offset = ((unsigned long)cmd->request_buffer & ~PAGE_MASK); + + scb->dma_h_bulkdata = pci_map_page(adapter->host->pci_dev, + page, offset, + cmd->request_bufflen, + scb->dma_direction); + scb->dma_type = MEGA_BULK_DATA; + + /* + * We need to handle special 64-bit commands that need a + * minimum of 1 SG + */ + if( adapter->has_64bit_addr ) { + scb->sgl64[0].address = scb->dma_h_bulkdata; + scb->sgl64[0].length = cmd->request_bufflen; + *buf = (u32)scb->sgl_dma_addr; + *len = (u32)cmd->request_bufflen; + return 1; + } + else { + *buf = (u32)scb->dma_h_bulkdata; + *len = (u32)cmd->request_bufflen; + } + + if( scb->dma_direction == PCI_DMA_TODEVICE ) { + pci_dma_sync_single(adapter->host->pci_dev, + scb->dma_h_bulkdata, + cmd->request_bufflen, + PCI_DMA_TODEVICE); + } + + return 0; + } + + sgl = (struct scatterlist *)cmd->request_buffer; + + /* + * Copy Scatter-Gather list info into controller structure. + * + * The number of sg elements returned must not exceed our limit + */ + sgcnt = pci_map_sg(adapter->host->pci_dev, sgl, cmd->use_sg, + scb->dma_direction); + + scb->dma_type = MEGA_SGLIST; + + if( sgcnt > adapter->sglen ) BUG(); + + for( idx = 0; idx < sgcnt; idx++, sgl++ ) { + + if( adapter->has_64bit_addr ) { + scb->sgl64[idx].address = sg_dma_address(sgl); + scb->sgl64[idx].length = sg_dma_len(sgl); + } + else { + scb->sgl[idx].address = sg_dma_address(sgl); + scb->sgl[idx].length = sg_dma_len(sgl); + } + } + + /* Reset pointer and length fields */ + *buf = scb->sgl_dma_addr; + + /* + * For passthru command, dataxferlen must be set, even for commands + * with a sg list + */ + *len = (u32)cmd->request_bufflen; + + if( scb->dma_direction == PCI_DMA_TODEVICE ) { + pci_dma_sync_sg(adapter->host->pci_dev, sgl, cmd->use_sg, + PCI_DMA_TODEVICE); + } + + /* Return count of SG requests */ + return sgcnt; +} + + +/* + * mega_8_to_40ld() + * + * takes all info in AdapterInquiry structure and puts it into ProductInfo and + * Enquiry3 structures for later use + */ +static void +mega_8_to_40ld(mraid_inquiry *inquiry, mega_inquiry3 *enquiry3, + mega_product_info *product_info) +{ + int i; + + product_info->max_commands = inquiry->adapter_info.max_commands; + enquiry3->rebuild_rate = inquiry->adapter_info.rebuild_rate; + product_info->nchannels = inquiry->adapter_info.nchannels; + + for (i = 0; i < 4; i++) { + product_info->fw_version[i] = + inquiry->adapter_info.fw_version[i]; + + product_info->bios_version[i] = + inquiry->adapter_info.bios_version[i]; + } + enquiry3->cache_flush_interval = + inquiry->adapter_info.cache_flush_interval; + + product_info->dram_size = inquiry->adapter_info.dram_size; + + enquiry3->num_ldrv = inquiry->logdrv_info.num_ldrv; + + for (i = 0; i < MAX_LOGICAL_DRIVES_8LD; i++) { + enquiry3->ldrv_size[i] = inquiry->logdrv_info.ldrv_size[i]; + enquiry3->ldrv_prop[i] = inquiry->logdrv_info.ldrv_prop[i]; + enquiry3->ldrv_state[i] = inquiry->logdrv_info.ldrv_state[i]; + } + + for (i = 0; i < (MAX_PHYSICAL_DRIVES); i++) + enquiry3->pdrv_state[i] = inquiry->pdrv_info.pdrv_state[i]; +} + + +/* + * Release the controller's resources + */ +static int +megaraid_release(struct Scsi_Host *host) +{ + adapter_t *adapter; + mbox_t *mbox; + u_char raw_mbox[16]; +#ifdef CONFIG_PROC_FS + char buf[12] = { 0 }; +#endif + + adapter = (adapter_t *)host->hostdata; + mbox = (mbox_t *)raw_mbox; + + printk(KERN_NOTICE "megaraid: being unloaded..."); + + /* Flush adapter cache */ + memset(mbox, 0, 16); + raw_mbox[0] = FLUSH_ADAPTER; + + irq_disable(adapter); + free_irq(adapter->host->irq, adapter); + + /* Issue a blocking (interrupts disabled) command to the card */ + issue_scb_block(adapter, raw_mbox); + + /* Flush disks cache */ + memset(mbox, 0, 16); + raw_mbox[0] = FLUSH_SYSTEM; + + /* Issue a blocking (interrupts disabled) command to the card */ + issue_scb_block(adapter, raw_mbox); + + + /* Free our resources */ + if( adapter->flag & BOARD_MEMMAP ) { + iounmap((void *)adapter->base); + release_mem_region(adapter->host->base, 128); + } + else { + release_region(adapter->base, 16); + } + + mega_free_sgl(adapter); + +#ifdef CONFIG_PROC_FS + if( adapter->controller_proc_dir_entry ) { + remove_proc_entry("stat", adapter->controller_proc_dir_entry); + remove_proc_entry("config", + adapter->controller_proc_dir_entry); + remove_proc_entry("mailbox", + adapter->controller_proc_dir_entry); +#if MEGA_HAVE_ENH_PROC + remove_proc_entry("rebuild-rate", + adapter->controller_proc_dir_entry); + remove_proc_entry("battery-status", + adapter->controller_proc_dir_entry); + + remove_proc_entry("diskdrives-ch0", + adapter->controller_proc_dir_entry); + remove_proc_entry("diskdrives-ch1", + adapter->controller_proc_dir_entry); + remove_proc_entry("diskdrives-ch2", + adapter->controller_proc_dir_entry); + remove_proc_entry("diskdrives-ch3", + adapter->controller_proc_dir_entry); + + remove_proc_entry("raiddrives-0-9", + adapter->controller_proc_dir_entry); + remove_proc_entry("raiddrives-10-19", + adapter->controller_proc_dir_entry); + remove_proc_entry("raiddrives-20-29", + adapter->controller_proc_dir_entry); + remove_proc_entry("raiddrives-30-39", + adapter->controller_proc_dir_entry); +#endif + + sprintf(buf, "hba%d", adapter->host->host_no); + remove_proc_entry(buf, mega_proc_dir_entry); + } +#endif + + pci_free_consistent(adapter->dev, MEGA_BUFFER_SIZE, + adapter->mega_buffer, adapter->buf_dma_handle); + kfree(adapter->scb_list); + pci_free_consistent(adapter->dev, sizeof(mbox64_t), + (void *)adapter->una_mbox64, adapter->una_mbox64_dma); + + kfree(adapter->ipdev); + + hba_count--; + + if( hba_count == 0 ) { + + /* + * Unregister the character device interface to the driver. + */ + unregister_chrdev(major, "megadev"); + + unregister_reboot_notifier(&mega_notifier); + +#ifdef CONFIG_PROC_FS + if( adapter->controller_proc_dir_entry ) { + remove_proc_entry ("megaraid", &proc_root); + } +#endif + + } + + /* + * Release the controller memory. A word of warning this frees + * hostdata and that includes adapter-> so be careful what you + * dereference beyond this point + */ + scsi_unregister(host); + + + printk("ok.\n"); + + return 0; +} + +static inline void +mega_free_sgl(adapter_t *adapter) +{ + scb_t *scb; + int i; + + for(i = 0; i < adapter->max_cmds; i++) { + + scb = &adapter->scb_list[i]; + + if( scb->sgl64 ) { + pci_free_consistent(adapter->dev, + sizeof(mega_sgl64) * adapter->sglen, + scb->sgl64, + scb->sgl_dma_addr); + + scb->sgl64 = NULL; + } + + if( scb->pthru ) { + pci_free_consistent(adapter->dev, sizeof(mega_passthru), + scb->pthru, scb->pthru_dma_addr); + + scb->pthru = NULL; + } + + if( scb->epthru ) { + pci_free_consistent(adapter->dev, + sizeof(mega_ext_passthru), + scb->epthru, scb->epthru_dma_addr); + + scb->epthru = NULL; + } + + } +} + + +/* + * Get information about the card/driver + */ +const char * +megaraid_info(struct Scsi_Host *host) +{ + static char buffer[512]; + adapter_t *adapter; + + adapter = (adapter_t *)host->hostdata; + + sprintf (buffer, + "LSI Logic MegaRAID %s %d commands %d targs %d chans %d luns", + adapter->fw_version, adapter->product_info.max_commands, + adapter->host->max_id, adapter->host->max_channel, + adapter->host->max_lun); + return buffer; +} + +/* shouldn't be used, but included for completeness */ +static int +megaraid_command (Scsi_Cmnd *cmd) +{ + printk(KERN_WARNING + "megaraid critcal error: synchronous interface is not implemented.\n"); + + cmd->result = (DID_ERROR << 16); + cmd->scsi_done(cmd); + + return 1; +} + + +/** + * megaraid_abort - abort the scsi command + * @scp - command to be aborted + * + * Abort a previous SCSI request. Only commands on the pending list can be + * aborted. All the commands issued to the F/W must complete. + */ +static int +megaraid_abort(Scsi_Cmnd *scp) +{ + adapter_t *adapter; + struct list_head *pos, *next; + scb_t *scb; + long iter; + int rval = SUCCESS; + + adapter = (adapter_t *)scp->host->hostdata; + + ASSERT( spin_is_locked(adapter->host_lock) ); + + printk("megaraid: aborting-%ld cmd=%x \n", + scp->serial_number, scp->cmnd[0], scp->channel, scp->target, + scp->lun); + + + list_for_each_safe( pos, next, &adapter->pending_list ) { + + scb = list_entry(pos, scb_t, list); + + if( scb->cmd == scp ) { /* Found command */ + + scb->state |= SCB_ABORT; + + /* + * Check if this command was never issued. If this is + * the case, take it off from the pending list and + * complete. + */ + if( !(scb->state & SCB_ISSUED) ) { + + printk(KERN_WARNING + "megaraid: %ld:%d, driver owner.\n", + scp->serial_number, scb->idx); + + scp->result = (DID_ABORT << 16); + + mega_free_scb(adapter, scb); + + scp->scsi_done(scp); + + break; + } + } + } + + /* + * By this time, either all commands are completed or aborted by + * mid-layer. Do not return until all the commands are actually + * completed by the firmware + */ + iter = 0; + while( atomic_read(&adapter->pend_cmds) > 0 ) { + /* + * Perform the ack sequence, since interrupts are not + * available right now! + */ + if( adapter->flag & BOARD_MEMMAP ) { + megaraid_memmbox_ack_sequence(adapter); + } + else { + megaraid_iombox_ack_sequence(adapter); + } + + /* + * print a message once every second only + */ + if( !(iter % 1000) ) { + printk( + "megarid: Waiting for %d commands to flush: iter:%ld\n", + atomic_read(&adapter->pend_cmds), iter); + } + + if( iter++ < MBOX_ABORT_SLEEP*1000 ) { + mdelay(1); + } + else { + printk(KERN_WARNING + "megaraid: critical hardware error!\n"); + + rval = FAILED; + + break; + } + } + + if( rval == SUCCESS ) { + printk(KERN_INFO + "megaraid: abort sequence successfully complete.\n"); + } + + return rval; +} + + +static int +megaraid_reset(Scsi_Cmnd *cmd) +{ + adapter_t *adapter; + megacmd_t mc; + long iter; + int rval = SUCCESS; + + adapter = (adapter_t *)cmd->host->hostdata; + + ASSERT( spin_is_locked(adapter->host_lock) ); + + printk("megaraid: reset-%ld cmd=%x \n", + cmd->serial_number, cmd->cmnd[0], cmd->channel, cmd->target, + cmd->lun); + + +#if MEGA_HAVE_CLUSTERING + mc.cmd = MEGA_CLUSTER_CMD; + mc.opcode = MEGA_RESET_RESERVATIONS; + + spin_unlock_irq(adapter->host_lock); + if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) { + printk(KERN_WARNING + "megaraid: reservation reset failed.\n"); + } + else { + printk(KERN_INFO "megaraid: reservation reset.\n"); + } + spin_lock_irq(adapter->host_lock); +#endif + + /* + * Do not return until all the commands are actually completed by the + * firmware + */ + iter = 0; + while( atomic_read(&adapter->pend_cmds) > 0 ) { + /* + * Perform the ack sequence, since interrupts are not + * available right now! + */ + if( adapter->flag & BOARD_MEMMAP ) { + megaraid_memmbox_ack_sequence(adapter); + } + else { + megaraid_iombox_ack_sequence(adapter); + } + + /* + * print a message once every second only + */ + if( !(iter % 1000) ) { + printk( + "megarid: Waiting for %d commands to flush: iter:%ld\n", + atomic_read(&adapter->pend_cmds), iter); + } + + if( iter++ < MBOX_RESET_SLEEP*1000 ) { + mdelay(1); + } + else { + printk(KERN_WARNING + "megaraid: critical hardware error!\n"); + + rval = FAILED; + + break; + } + } + + if( rval == SUCCESS ) { + printk(KERN_INFO + "megaraid: reset sequence successfully complete.\n"); + } + + return rval; +} + + +#ifdef CONFIG_PROC_FS +/* Following code handles /proc fs */ + +#define CREATE_READ_PROC(string, func) create_proc_read_entry(string, \ + S_IRUSR | S_IFREG, \ + controller_proc_dir_entry, \ + func, adapter) + +/** + * mega_create_proc_entry() + * @index - index in soft state array + * @parent - parent node for this /proc entry + * + * Creates /proc entries for our controllers. + */ +static void +mega_create_proc_entry(int index, struct proc_dir_entry *parent) +{ + struct proc_dir_entry *controller_proc_dir_entry = NULL; + u8 string[64] = { 0 }; + adapter_t *adapter = hba_soft_state[index]; + + sprintf(string, "hba%d", adapter->host->host_no); + + controller_proc_dir_entry = + adapter->controller_proc_dir_entry = proc_mkdir(string, parent); + + if(!controller_proc_dir_entry) { + printk(KERN_WARNING "\nmegaraid: proc_mkdir failed\n"); + return; + } + adapter->proc_read = CREATE_READ_PROC("config", proc_read_config); + adapter->proc_stat = CREATE_READ_PROC("stat", proc_read_stat); + adapter->proc_mbox = CREATE_READ_PROC("mailbox", proc_read_mbox); +#if MEGA_HAVE_ENH_PROC + adapter->proc_rr = CREATE_READ_PROC("rebuild-rate", proc_rebuild_rate); + adapter->proc_battery = CREATE_READ_PROC("battery-status", + proc_battery); + + /* + * Display each physical drive on its channel + */ + adapter->proc_pdrvstat[0] = CREATE_READ_PROC("diskdrives-ch0", + proc_pdrv_ch0); + adapter->proc_pdrvstat[1] = CREATE_READ_PROC("diskdrives-ch1", + proc_pdrv_ch1); + adapter->proc_pdrvstat[2] = CREATE_READ_PROC("diskdrives-ch2", + proc_pdrv_ch2); + adapter->proc_pdrvstat[3] = CREATE_READ_PROC("diskdrives-ch3", + proc_pdrv_ch3); + + /* + * Display a set of up to 10 logical drive through each of following + * /proc entries + */ + adapter->proc_rdrvstat[0] = CREATE_READ_PROC("raiddrives-0-9", + proc_rdrv_10); + adapter->proc_rdrvstat[1] = CREATE_READ_PROC("raiddrives-10-19", + proc_rdrv_20); + adapter->proc_rdrvstat[2] = CREATE_READ_PROC("raiddrives-20-29", + proc_rdrv_30); + adapter->proc_rdrvstat[3] = CREATE_READ_PROC("raiddrives-30-39", + proc_rdrv_40); +#endif +} + + +/** + * proc_read_config() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display configuration information about the controller. + */ +static int +proc_read_config(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + + adapter_t *adapter = (adapter_t *)data; + int len = 0; + + len += sprintf(page+len, "%s", MEGARAID_VERSION); + + if(adapter->product_info.product_name[0]) + len += sprintf(page+len, "%s\n", + adapter->product_info.product_name); + + len += sprintf(page+len, "Controller Type: "); + + if( adapter->flag & BOARD_MEMMAP ) { + len += sprintf(page+len, + "438/466/467/471/493/518/520/531/532\n"); + } + else { + len += sprintf(page+len, + "418/428/434\n"); + } + + if(adapter->flag & BOARD_40LD) { + len += sprintf(page+len, + "Controller Supports 40 Logical Drives\n"); + } + + if(adapter->flag & BOARD_64BIT) { + len += sprintf(page+len, + "Controller capable of 64-bit memory addressing\n"); + } + if( adapter->has_64bit_addr ) { + len += sprintf(page+len, + "Controller using 64-bit memory addressing\n"); + } + else { + len += sprintf(page+len, + "Controller is not using 64-bit memory addressing\n"); + } + + len += sprintf(page+len, "Base = %08lx, Irq = %d, ", adapter->base, + adapter->host->irq); + + len += sprintf(page+len, "Logical Drives = %d, Channels = %d\n", + adapter->numldrv, adapter->product_info.nchannels); + + len += sprintf(page+len, "Version =%s:%s, DRAM = %dMb\n", + adapter->fw_version, adapter->bios_version, + adapter->product_info.dram_size); + + len += sprintf(page+len, + "Controller Queue Depth = %d, Driver Queue Depth = %d\n", + adapter->product_info.max_commands, adapter->max_cmds); + + len += sprintf(page+len, "support_ext_cdb = %d\n", + adapter->support_ext_cdb); + len += sprintf(page+len, "support_random_del = %d\n", + adapter->support_random_del); + len += sprintf(page+len, "boot_ldrv_enabled = %d\n", + adapter->boot_ldrv_enabled); + len += sprintf(page+len, "boot_ldrv = %d\n", + adapter->boot_ldrv); + len += sprintf(page+len, "boot_pdrv_enabled = %d\n", + adapter->boot_pdrv_enabled); + len += sprintf(page+len, "boot_pdrv_ch = %d\n", + adapter->boot_pdrv_ch); + len += sprintf(page+len, "boot_pdrv_tgt = %d\n", + adapter->boot_pdrv_tgt); + len += sprintf(page+len, "quiescent = %d\n", + atomic_read(&adapter->quiescent)); + len += sprintf(page+len, "has_cluster = %d\n", + adapter->has_cluster); + + len += sprintf(page+len, "\nModule Parameters:\n"); + len += sprintf(page+len, "max_cmd_per_lun = %d\n", + max_cmd_per_lun); + len += sprintf(page+len, "max_sectors_per_io = %d\n", + max_sectors_per_io); + + *eof = 1; + + return len; +} + + + +/** + * proc_read_stat() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Diaplay statistical information about the I/O activity. + */ +static int +proc_read_stat(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter; + int len; + int i; + + i = 0; /* avoid compilation warnings */ + len = 0; + adapter = (adapter_t *)data; + + len = sprintf(page, "Statistical Information for this controller\n"); + len += sprintf(page+len, "pend_cmds = %d\n", + atomic_read(&adapter->pend_cmds)); +#if MEGA_HAVE_STATS + for(i = 0; i < adapter->numldrv; i++) { + len += sprintf(page+len, "Logical Drive %d:\n", i); + + len += sprintf(page+len, + "\tReads Issued = %lu, Writes Issued = %lu\n", + adapter->nreads[i], adapter->nwrites[i]); + + len += sprintf(page+len, + "\tSectors Read = %lu, Sectors Written = %lu\n", + adapter->nreadblocks[i], adapter->nwriteblocks[i]); + + len += sprintf(page+len, + "\tRead errors = %lu, Write errors = %lu\n\n", + adapter->rd_errors[i], adapter->wr_errors[i]); + } +#else + len += sprintf(page+len, + "IO and error counters not compiled in driver.\n"); +#endif + + *eof = 1; + + return len; +} + + +/** + * proc_read_mbox() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display mailbox information for the last command issued. This information + * is good for debugging. + */ +static int +proc_read_mbox(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + + adapter_t *adapter = (adapter_t *)data; + volatile mbox_t *mbox = adapter->mbox; + int len = 0; + + len = sprintf(page, "Contents of Mail Box Structure\n"); + len += sprintf(page+len, " Fw Command = 0x%02x\n", mbox->cmd); + len += sprintf(page+len, " Cmd Sequence = 0x%02x\n", mbox->cmdid); + len += sprintf(page+len, " No of Sectors= %04d\n", mbox->numsectors); + len += sprintf(page+len, " LBA = 0x%02x\n", mbox->lba); + len += sprintf(page+len, " DTA = 0x%08x\n", mbox->xferaddr); + len += sprintf(page+len, " Logical Drive= 0x%02x\n", mbox->logdrv); + len += sprintf(page+len, " No of SG Elmt= 0x%02x\n", + mbox->numsgelements); + len += sprintf(page+len, " Busy = %01x\n", mbox->busy); + len += sprintf(page+len, " Status = 0x%02x\n", mbox->status); + + *eof = 1; + + return len; +} + + +/** + * proc_rebuild_rate() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display current rebuild rate + */ +static int +proc_rebuild_rate(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + dma_addr_t dma_handle; + caddr_t inquiry; + struct pci_dev *pdev; + int len = 0; + + pdev = adapter->ipdev; + + if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { + *eof = 1; + return len; + } + + if( mega_adapinq(adapter, dma_handle) != 0 ) { + + len = sprintf(page, "Adapter inquiry failed.\n"); + + printk(KERN_WARNING "megaraid: inquiry failed.\n"); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + *eof = 1; + + return len; + } + + if( adapter->flag & BOARD_40LD ) { + len = sprintf(page, "Rebuild Rate: [%d%%]\n", + ((mega_inquiry3 *)inquiry)->rebuild_rate); + } + else { + len = sprintf(page, "Rebuild Rate: [%d%%]\n", + ((mraid_ext_inquiry *) + inquiry)->raid_inq.adapter_info.rebuild_rate); + } + + + mega_free_inquiry(inquiry, dma_handle, pdev); + + *eof = 1; + + return len; +} + + +/** + * proc_battery() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display information about the battery module on the controller. + */ +static int +proc_battery(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + dma_addr_t dma_handle; + caddr_t inquiry; + struct pci_dev *pdev; + u8 battery_status = 0; + char str[256]; + int len = 0; + + pdev = adapter->ipdev; + + if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { + *eof = 1; + return len; + } + + if( mega_adapinq(adapter, dma_handle) != 0 ) { + + len = sprintf(page, "Adapter inquiry failed.\n"); + + printk(KERN_WARNING "megaraid: inquiry failed.\n"); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + *eof = 1; + + return len; + } + + if( adapter->flag & BOARD_40LD ) { + battery_status = ((mega_inquiry3 *)inquiry)->battery_status; + } + else { + battery_status = ((mraid_ext_inquiry *)inquiry)-> + raid_inq.adapter_info.battery_status; + } + + /* + * Decode the battery status + */ + sprintf(str, "Battery Status:[%d]", battery_status); + + if(battery_status == MEGA_BATT_CHARGE_DONE) + strcat(str, " Charge Done"); + + if(battery_status & MEGA_BATT_MODULE_MISSING) + strcat(str, " Module Missing"); + + if(battery_status & MEGA_BATT_LOW_VOLTAGE) + strcat(str, " Low Voltage"); + + if(battery_status & MEGA_BATT_TEMP_HIGH) + strcat(str, " Temperature High"); + + if(battery_status & MEGA_BATT_PACK_MISSING) + strcat(str, " Pack Missing"); + + if(battery_status & MEGA_BATT_CHARGE_INPROG) + strcat(str, " Charge In-progress"); + + if(battery_status & MEGA_BATT_CHARGE_FAIL) + strcat(str, " Charge Fail"); + + if(battery_status & MEGA_BATT_CYCLES_EXCEEDED) + strcat(str, " Cycles Exceeded"); + + len = sprintf(page, "%s\n", str); + + + mega_free_inquiry(inquiry, dma_handle, pdev); + + *eof = 1; + + return len; +} + + +/** + * proc_pdrv_ch0() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display information about the physical drives on physical channel 0. + */ +static int +proc_pdrv_ch0(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + + *eof = 1; + + return (proc_pdrv(adapter, page, 0)); +} + + +/** + * proc_pdrv_ch1() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display information about the physical drives on physical channel 1. + */ +static int +proc_pdrv_ch1(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + + *eof = 1; + + return (proc_pdrv(adapter, page, 1)); +} + + +/** + * proc_pdrv_ch2() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display information about the physical drives on physical channel 2. + */ +static int +proc_pdrv_ch2(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + + *eof = 1; + + return (proc_pdrv(adapter, page, 2)); +} + + +/** + * proc_pdrv_ch3() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display information about the physical drives on physical channel 3. + */ +static int +proc_pdrv_ch3(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + + *eof = 1; + + return (proc_pdrv(adapter, page, 3)); +} + + +/** + * proc_pdrv() + * @page - buffer to write the data in + * @adapter - pointer to our soft state + * + * Display information about the physical drives. + */ +static int +proc_pdrv(adapter_t *adapter, char *page, int channel) +{ + dma_addr_t dma_handle; + char *scsi_inq; + dma_addr_t scsi_inq_dma_handle; + caddr_t inquiry; + struct pci_dev *pdev; + u8 *pdrv_state; + u8 state; + int tgt; + int max_channels; + int len = 0; + char str[80]; + int i; + + pdev = adapter->ipdev; + + if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { + return len; + } + + if( mega_adapinq(adapter, dma_handle) != 0 ) { + + len = sprintf(page, "Adapter inquiry failed.\n"); + + printk(KERN_WARNING "megaraid: inquiry failed.\n"); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + return len; + } + + + scsi_inq = pci_alloc_consistent(pdev, 256, &scsi_inq_dma_handle); + + if( scsi_inq == NULL ) { + len = sprintf(page, "memory not available for scsi inq.\n"); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + return len; + } + + if( adapter->flag & BOARD_40LD ) { + pdrv_state = ((mega_inquiry3 *)inquiry)->pdrv_state; + } + else { + pdrv_state = ((mraid_ext_inquiry *)inquiry)-> + raid_inq.pdrv_info.pdrv_state; + } + + max_channels = adapter->product_info.nchannels; + + if( channel >= max_channels ) return 0; + + for( tgt = 0; tgt <= MAX_TARGET; tgt++ ) { + + i = channel*16 + tgt; + + state = *(pdrv_state + i); + + switch( state & 0x0F ) { + + case PDRV_ONLINE: + sprintf(str, + "Channel:%2d Id:%2d State: Online", + channel, tgt); + break; + + case PDRV_FAILED: + sprintf(str, + "Channel:%2d Id:%2d State: Failed", + channel, tgt); + break; + + case PDRV_RBLD: + sprintf(str, + "Channel:%2d Id:%2d State: Rebuild", + channel, tgt); + break; + + case PDRV_HOTSPARE: + sprintf(str, + "Channel:%2d Id:%2d State: Hot spare", + channel, tgt); + break; + + default: + sprintf(str, + "Channel:%2d Id:%2d State: Un-configured", + channel, tgt); + break; + + } + + /* + * This interface displays inquiries for disk drives + * only. Inquries for logical drives and non-disk + * devices are available through /proc/scsi/scsi + */ + memset(scsi_inq, 0, 256); + if( mega_internal_dev_inquiry(adapter, channel, tgt, + scsi_inq_dma_handle) || + (scsi_inq[0] & 0x1F) != TYPE_DISK ) { + continue; + } + + /* + * Check for overflow. We print less than 240 + * characters for inquiry + */ + if( (len + 240) >= PAGE_SIZE ) break; + + len += sprintf(page+len, "%s.\n", str); + + len += mega_print_inquiry(page+len, scsi_inq); + } + + pci_free_consistent(pdev, 256, scsi_inq, scsi_inq_dma_handle); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + return len; +} + + +/* + * Display scsi inquiry + */ +static int +mega_print_inquiry(char *page, char *scsi_inq) +{ + int len = 0; + int i; + + len = sprintf(page, " Vendor: "); + for( i = 8; i < 16; i++ ) { + len += sprintf(page+len, "%c", scsi_inq[i]); + } + + len += sprintf(page+len, " Model: "); + + for( i = 16; i < 32; i++ ) { + len += sprintf(page+len, "%c", scsi_inq[i]); + } + + len += sprintf(page+len, " Rev: "); + + for( i = 32; i < 36; i++ ) { + len += sprintf(page+len, "%c", scsi_inq[i]); + } + + len += sprintf(page+len, "\n"); + + i = scsi_inq[0] & 0x1f; + + len += sprintf(page+len, " Type: %s ", + i < MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] : + "Unknown "); + + len += sprintf(page+len, + " ANSI SCSI revision: %02x", scsi_inq[2] & 0x07); + + if( (scsi_inq[2] & 0x07) == 1 && (scsi_inq[3] & 0x0f) == 1 ) + len += sprintf(page+len, " CCS\n"); + else + len += sprintf(page+len, "\n"); + + return len; +} + + +/** + * proc_rdrv_10() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display real time information about the logical drives 0 through 9. + */ +static int +proc_rdrv_10(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + + *eof = 1; + + return (proc_rdrv(adapter, page, 0, 9)); +} + + +/** + * proc_rdrv_20() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display real time information about the logical drives 0 through 9. + */ +static int +proc_rdrv_20(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + + *eof = 1; + + return (proc_rdrv(adapter, page, 10, 19)); +} + + +/** + * proc_rdrv_30() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display real time information about the logical drives 0 through 9. + */ +static int +proc_rdrv_30(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + + *eof = 1; + + return (proc_rdrv(adapter, page, 20, 29)); +} + + +/** + * proc_rdrv_40() + * @page - buffer to write the data in + * @start - where the actual data has been written in page + * @offset - same meaning as the read system call + * @count - same meaning as the read system call + * @eof - set if no more data needs to be returned + * @data - pointer to our soft state + * + * Display real time information about the logical drives 0 through 9. + */ +static int +proc_rdrv_40(char *page, char **start, off_t offset, int count, int *eof, + void *data) +{ + adapter_t *adapter = (adapter_t *)data; + + *eof = 1; + + return (proc_rdrv(adapter, page, 30, 39)); +} + + +/** + * proc_rdrv() + * @page - buffer to write the data in + * @adapter - pointer to our soft state + * @start - starting logical drive to display + * @end - ending logical drive to display + * + * We do not print the inquiry information since its already available through + * /proc/scsi/scsi interface + */ +static int +proc_rdrv(adapter_t *adapter, char *page, int start, int end ) +{ + dma_addr_t dma_handle; + logdrv_param *lparam; + megacmd_t mc; + char *disk_array; + dma_addr_t disk_array_dma_handle; + caddr_t inquiry; + struct pci_dev *pdev; + u8 *rdrv_state; + int num_ldrv; + u32 array_sz; + int len = 0; + int i; + u8 span8_flag = 1; + + pdev = adapter->ipdev; + + if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { + return len; + } + + if( mega_adapinq(adapter, dma_handle) != 0 ) { + + len = sprintf(page, "Adapter inquiry failed.\n"); + + printk(KERN_WARNING "megaraid: inquiry failed.\n"); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + return len; + } + + memset(&mc, 0, sizeof(megacmd_t)); + + if( adapter->flag & BOARD_40LD ) { + + array_sz = sizeof(disk_array_40ld); + + rdrv_state = ((mega_inquiry3 *)inquiry)->ldrv_state; + + num_ldrv = ((mega_inquiry3 *)inquiry)->num_ldrv; + } + else { + /* + * 'array_sz' is either the size of diskarray_span4_t or the + * size of disk_array_span8_t. We use span8_t's size because + * it is bigger of the two. + */ + array_sz = sizeof( diskarray_span8_t ); + + rdrv_state = ((mraid_ext_inquiry *)inquiry)-> + raid_inq.logdrv_info.ldrv_state; + + num_ldrv = ((mraid_ext_inquiry *)inquiry)-> + raid_inq.logdrv_info.num_ldrv; + } + + disk_array = pci_alloc_consistent(pdev, array_sz, + &disk_array_dma_handle); + + if( disk_array == NULL ) { + len = sprintf(page, "memory not available.\n"); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + return len; + } + + mc.xferaddr = (u32)disk_array_dma_handle; + + if( adapter->flag & BOARD_40LD ) { + mc.cmd = FC_NEW_CONFIG; + mc.opcode = OP_DCMD_READ_CONFIG; + + if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) ) { + + len = sprintf(page, "40LD read config failed.\n"); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + pci_free_consistent(pdev, array_sz, disk_array, + disk_array_dma_handle); + + return len; + } + + } + else { + /* + * Try 8-Span "read config" command + */ + mc.cmd = NEW_READ_CONFIG_8LD; + + if( mega_internal_command(adapter, LOCK_INT, &mc, NULL) ) { + + /* + * 8-Span command failed; try 4-Span command + */ + span8_flag = 0; + mc.cmd = READ_CONFIG_8LD; + + if( mega_internal_command(adapter, LOCK_INT, &mc, + NULL) ){ + + len = sprintf(page, + "8LD read config failed.\n"); + + mega_free_inquiry(inquiry, dma_handle, pdev); + + pci_free_consistent(pdev, array_sz, + disk_array, + disk_array_dma_handle); + + return len; + } + } + } + + for( i = start; i < ( (end+1 < num_ldrv) ? end+1 : num_ldrv ); i++ ) { + + if( adapter->flag & BOARD_40LD ) { + lparam = + &((disk_array_40ld *)disk_array)->ldrv[i].lparam; + } + else { + if( span8_flag ) { + lparam = (logdrv_param*) &((diskarray_span8_t*) + (disk_array))->log_drv[i]; + } + else { + lparam = (logdrv_param*) &((diskarray_span4_t*) + (disk_array))->log_drv[i]; + } + } + + /* + * Check for overflow. We print less than 240 characters for + * information about each logical drive. + */ + if( (len + 240) >= PAGE_SIZE ) break; + + len += sprintf(page+len, "Logical drive:%2d:, ", i); + + switch( rdrv_state[i] & 0x0F ) { + case RDRV_OFFLINE: + len += sprintf(page+len, "state: offline"); + break; + + case RDRV_DEGRADED: + len += sprintf(page+len, "state: degraded"); + break; + + case RDRV_OPTIMAL: + len += sprintf(page+len, "state: optimal"); + break; + + case RDRV_DELETED: + len += sprintf(page+len, "state: deleted"); + break; + + default: + len += sprintf(page+len, "state: unknown"); + break; + } + + /* + * Check if check consistency or initialization is going on + * for this logical drive. + */ + if( (rdrv_state[i] & 0xF0) == 0x20 ) { + len += sprintf(page+len, + ", check-consistency in progress"); + } + else if( (rdrv_state[i] & 0xF0) == 0x10 ) { + len += sprintf(page+len, + ", initialization in progress"); + } + + len += sprintf(page+len, "\n"); + + len += sprintf(page+len, "Span depth:%3d, ", + lparam->span_depth); + + len += sprintf(page+len, "RAID level:%3d, ", + lparam->level); + + len += sprintf(page+len, "Stripe size:%3d, ", + lparam->stripe_sz ? lparam->stripe_sz/2: 128); + + len += sprintf(page+len, "Row size:%3d\n", + lparam->row_size); + + + len += sprintf(page+len, "Read Policy: "); + + switch(lparam->read_ahead) { + + case NO_READ_AHEAD: + len += sprintf(page+len, "No read ahead, "); + break; + + case READ_AHEAD: + len += sprintf(page+len, "Read ahead, "); + break; + + case ADAP_READ_AHEAD: + len += sprintf(page+len, "Adaptive, "); + break; + + } + + len += sprintf(page+len, "Write Policy: "); + + switch(lparam->write_mode) { + + case WRMODE_WRITE_THRU: + len += sprintf(page+len, "Write thru, "); + break; + + case WRMODE_WRITE_BACK: + len += sprintf(page+len, "Write back, "); + break; + } + + len += sprintf(page+len, "Cache Policy: "); + + switch(lparam->direct_io) { + + case CACHED_IO: + len += sprintf(page+len, "Cached IO\n\n"); + break; + + case DIRECT_IO: + len += sprintf(page+len, "Direct IO\n\n"); + break; + } + } + + mega_free_inquiry(inquiry, dma_handle, pdev); + + pci_free_consistent(pdev, array_sz, disk_array, + disk_array_dma_handle); + + return len; +} + +#endif + + +/** + * megaraid_biosparam() + * @disk + * @dev + * @geom + * + * Return the disk geometry for a particular disk + * Input: + * Disk *disk - Disk geometry + * kdev_t dev - Device node + * int *geom - Returns geometry fields + * geom[0] = heads + * geom[1] = sectors + * geom[2] = cylinders + */ +static int +megaraid_biosparam(Disk *disk, kdev_t dev, int *geom) +{ + int heads, sectors, cylinders; + adapter_t *adapter; + + /* Get pointer to host config structure */ + adapter = (adapter_t *)disk->device->host->hostdata; + + if (IS_RAID_CH(adapter, disk->device->channel)) { + /* Default heads (64) & sectors (32) */ + heads = 64; + sectors = 32; + cylinders = disk->capacity / (heads * sectors); + + /* + * Handle extended translation size for logical drives + * > 1Gb + */ + if (disk->capacity >= 0x200000) { + heads = 255; + sectors = 63; + cylinders = disk->capacity / (heads * sectors); + } + + /* return result */ + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; + } + else { + if( !mega_partsize(disk, dev, geom) ) + return 0; + + printk(KERN_WARNING + "megaraid: invalid partition on this disk on channel %d\n", + disk->device->channel); + + /* Default heads (64) & sectors (32) */ + heads = 64; + sectors = 32; + cylinders = disk->capacity / (heads * sectors); + + /* Handle extended translation size for logical drives > 1Gb */ + if (disk->capacity >= 0x200000) { + heads = 255; + sectors = 63; + cylinders = disk->capacity / (heads * sectors); + } + + /* return result */ + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; + } + + return 0; +} + +/* + * mega_partsize() + * @disk + * @geom + * + * Purpose : to determine the BIOS mapping used to create the partition + * table, storing the results (cyls, hds, and secs) in geom + * + * Note: Code is picked from scsicam.h + * + * Returns : -1 on failure, 0 on success. + */ +static int +mega_partsize(Disk *disk, kdev_t dev, int *geom) +{ + struct buffer_head *bh; + struct partition *p, *largest = NULL; + int i, largest_cyl; + int heads, cyls, sectors; + int capacity = disk->capacity; + + int ma = MAJOR(dev); + int mi = (MINOR(dev) & ~0xf); + + int block = 1024; + + if (blksize_size[ma]) + block = blksize_size[ma][mi]; + + if (!(bh = bread(MKDEV(ma,mi), 0, block))) + return -1; + + if (*(unsigned short *)(bh->b_data + 510) == 0xAA55 ) { + + for (largest_cyl = -1, + p = (struct partition *)(0x1BE + bh->b_data), i = 0; + i < 4; ++i, ++p) { + + if (!p->sys_ind) continue; + + cyls = p->end_cyl + ((p->end_sector & 0xc0) << 2); + + if (cyls >= largest_cyl) { + largest_cyl = cyls; + largest = p; + } + } + } + + if (largest) { + heads = largest->end_head + 1; + sectors = largest->end_sector & 0x3f; + + if (!heads || !sectors) { + brelse(bh); + return -1; + } + + cyls = capacity/(heads * sectors); + + geom[0] = heads; + geom[1] = sectors; + geom[2] = cyls; + + brelse(bh); + return 0; + } + + brelse(bh); + return -1; +} + + +/** + * megaraid_reboot_notify() + * @this - unused + * @code - shutdown code + * @unused - unused + * + * This routine will be called when the use has done a forced shutdown on the + * system. Flush the Adapter and disks cache. + */ +static int +megaraid_reboot_notify (struct notifier_block *this, unsigned long code, + void *unused) +{ + adapter_t *adapter; + struct Scsi_Host *host; + u8 raw_mbox[16]; + mbox_t *mbox; + int i; + + /* + * Flush the controller's cache irrespective of the codes coming down. + * SYS_DOWN, SYS_HALT, SYS_RESTART, SYS_POWER_OFF + */ + for( i = 0; i < hba_count; i++ ) { + printk(KERN_INFO "megaraid: flushing adapter %d..", i); + host = hba_soft_state[i]->host; + + adapter = (adapter_t *)host->hostdata; + mbox = (mbox_t *)raw_mbox; + + /* Flush adapter cache */ + memset(mbox, 0, 16); + raw_mbox[0] = FLUSH_ADAPTER; + + irq_disable(adapter); + free_irq(adapter->host->irq, adapter); + + /* + * Issue a blocking (interrupts disabled) command to + * the card + */ + issue_scb_block(adapter, raw_mbox); + + /* Flush disks cache */ + memset(mbox, 0, 16); + raw_mbox[0] = FLUSH_SYSTEM; + + issue_scb_block(adapter, raw_mbox); + + printk("Done.\n"); + + if( atomic_read(&adapter->pend_cmds) > 0 ) { + printk(KERN_WARNING "megaraid: pending commands!!\n"); + } + } + + /* + * Have a delibrate delay to make sure all the caches are + * actually flushed. + */ + printk(KERN_INFO "megaraid: cache flush delay: "); + for( i = 9; i >= 0; i-- ) { + printk("\b\b\b[%d]", i); + mdelay(1000); + } + printk("\b\b\b[done]\n"); + mdelay(1000); + + return NOTIFY_DONE; +} + +/** + * mega_init_scb() + * @adapter - pointer to our soft state + * + * Allocate memory for the various pointers in the scb structures: + * scatter-gather list pointer, passthru and extended passthru structure + * pointers. + */ +static int +mega_init_scb(adapter_t *adapter) +{ + scb_t *scb; + int i; + + for( i = 0; i < adapter->max_cmds; i++ ) { + + scb = &adapter->scb_list[i]; + + scb->sgl64 = NULL; + scb->sgl = NULL; + scb->pthru = NULL; + scb->epthru = NULL; + } + + for( i = 0; i < adapter->max_cmds; i++ ) { + + scb = &adapter->scb_list[i]; + + scb->idx = i; + + scb->sgl64 = pci_alloc_consistent(adapter->dev, + sizeof(mega_sgl64) * adapter->sglen, + &scb->sgl_dma_addr); + + scb->sgl = (mega_sglist *)scb->sgl64; + + if( !scb->sgl ) { + printk(KERN_WARNING "RAID: Can't allocate sglist.\n"); + mega_free_sgl(adapter); + return -1; + } + + scb->pthru = pci_alloc_consistent(adapter->dev, + sizeof(mega_passthru), + &scb->pthru_dma_addr); + + if( !scb->pthru ) { + printk(KERN_WARNING "RAID: Can't allocate passthru.\n"); + mega_free_sgl(adapter); + return -1; + } + + scb->epthru = pci_alloc_consistent(adapter->dev, + sizeof(mega_ext_passthru), + &scb->epthru_dma_addr); + + if( !scb->epthru ) { + printk(KERN_WARNING + "Can't allocate extended passthru.\n"); + mega_free_sgl(adapter); + return -1; + } + + + scb->dma_type = MEGA_DMA_TYPE_NONE; + + /* + * Link to free list + * lock not required since we are loading the driver, so no + * commands possible right now. + */ + scb->state = SCB_FREE; + scb->cmd = NULL; + list_add(&scb->list, &adapter->free_list); + } + + return 0; +} + + +/** + * megadev_open() + * @inode - unused + * @filep - unused + * + * Routines for the character/ioctl interface to the driver. Find out if this + * is a valid open. If yes, increment the module use count so that it cannot + * be unloaded. + */ +static int +megadev_open (struct inode *inode, struct file *filep) +{ + /* + * Only allow superuser to access private ioctl interface + */ + if( !capable(CAP_SYS_ADMIN) ) return -EACCES; + + MOD_INC_USE_COUNT; + return 0; +} + + +/** + * megadev_ioctl() + * @inode - Our device inode + * @filep - unused + * @cmd - ioctl command + * @arg - user buffer + * + * ioctl entry point for our private ioctl interface. We move the data in from + * the user space, prepare the command (if necessary, convert the old MIMD + * ioctl to new ioctl command), and issue a synchronous command to the + * controller. + */ +static int +megadev_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, + unsigned long arg) +{ + adapter_t *adapter; + nitioctl_t uioc; + int adapno; + int rval; + mega_passthru *upthru; /* user address for passthru */ + mega_passthru *pthru; /* copy user passthru here */ + dma_addr_t pthru_dma_hndl; + void *data = NULL; /* data to be transferred */ + dma_addr_t data_dma_hndl; /* dma handle for data xfer area */ + megacmd_t mc; + megastat_t *ustats; + int num_ldrv; + u32 uxferaddr = 0; + struct pci_dev *pdev; + + ustats = NULL; /* avoid compilation warnings */ + num_ldrv = 0; + + /* + * Make sure only USCSICMD are issued through this interface. + * MIMD application would still fire different command. + */ + if( (_IOC_TYPE(cmd) != MEGAIOC_MAGIC) && (cmd != USCSICMD) ) { + return -EINVAL; + } + + /* + * Check and convert a possible MIMD command to NIT command. + * mega_m_to_n() copies the data from the user space, so we do not + * have to do it here. + * NOTE: We will need some user address to copyout the data, therefore + * the inteface layer will also provide us with the required user + * addresses. + */ + memset(&uioc, 0, sizeof(nitioctl_t)); + if( (rval = mega_m_to_n( (void *)arg, &uioc)) != 0 ) + return rval; + + + switch( uioc.opcode ) { + + case GET_DRIVER_VER: + if( put_user(driver_ver, (u32 *)uioc.uioc_uaddr) ) + return (-EFAULT); + + break; + + case GET_N_ADAP: + if( put_user(hba_count, (u32 *)uioc.uioc_uaddr) ) + return (-EFAULT); + + /* + * Shucks. MIMD interface returns a positive value for number + * of adapters. TODO: Change it to return 0 when there is no + * applicatio using mimd interface. + */ + return hba_count; + + case GET_ADAP_INFO: + + /* + * Which adapter + */ + if( (adapno = GETADAP(uioc.adapno)) >= hba_count ) + return (-ENODEV); + + if( copy_to_user(uioc.uioc_uaddr, mcontroller+adapno, + sizeof(struct mcontroller)) ) + return (-EFAULT); + break; + +#if MEGA_HAVE_STATS + + case GET_STATS: + /* + * Which adapter + */ + if( (adapno = GETADAP(uioc.adapno)) >= hba_count ) + return (-ENODEV); + + adapter = hba_soft_state[adapno]; + + ustats = (megastat_t *)uioc.uioc_uaddr; + + if( copy_from_user(&num_ldrv, &ustats->num_ldrv, sizeof(int)) ) + return (-EFAULT); + + /* + * Check for the validity of the logical drive number + */ + if( num_ldrv >= MAX_LOGICAL_DRIVES_40LD ) return -EINVAL; + + if( copy_to_user(ustats->nreads, adapter->nreads, + num_ldrv*sizeof(u32)) ) + return -EFAULT; + + if( copy_to_user(ustats->nreadblocks, adapter->nreadblocks, + num_ldrv*sizeof(u32)) ) + return -EFAULT; + + if( copy_to_user(ustats->nwrites, adapter->nwrites, + num_ldrv*sizeof(u32)) ) + return -EFAULT; + + if( copy_to_user(ustats->nwriteblocks, adapter->nwriteblocks, + num_ldrv*sizeof(u32)) ) + return -EFAULT; + + if( copy_to_user(ustats->rd_errors, adapter->rd_errors, + num_ldrv*sizeof(u32)) ) + return -EFAULT; + + if( copy_to_user(ustats->wr_errors, adapter->wr_errors, + num_ldrv*sizeof(u32)) ) + return -EFAULT; + + return 0; + +#endif + case MBOX_CMD: + + /* + * Which adapter + */ + if( (adapno = GETADAP(uioc.adapno)) >= hba_count ) + return (-ENODEV); + + adapter = hba_soft_state[adapno]; + + /* + * Deletion of logical drive is a special case. The adapter + * should be quiescent before this command is issued. + */ + if( uioc.uioc_rmbox[0] == FC_DEL_LOGDRV && + uioc.uioc_rmbox[2] == OP_DEL_LOGDRV ) { + + /* + * Do we support this feature + */ + if( !adapter->support_random_del ) { + printk(KERN_WARNING "megaraid: logdrv "); + printk("delete on non-supporting F/W.\n"); + + return (-EINVAL); + } + + rval = mega_del_logdrv( adapter, uioc.uioc_rmbox[3] ); + + if( rval == 0 ) { + memset(&mc, 0, sizeof(megacmd_t)); + + mc.status = rval; + + rval = mega_n_to_m((void *)arg, &mc); + } + + return rval; + } + /* + * This interface only support the regular passthru commands. + * Reject extended passthru and 64-bit passthru + */ + if( uioc.uioc_rmbox[0] == MEGA_MBOXCMD_PASSTHRU64 || + uioc.uioc_rmbox[0] == MEGA_MBOXCMD_EXTPTHRU ) { + + printk(KERN_WARNING "megaraid: rejected passthru.\n"); + + return (-EINVAL); + } + + /* + * For all internal commands, the buffer must be allocated in + * <4GB address range + */ + pdev = adapter->ipdev; + + /* Is it a passthru command or a DCMD */ + if( uioc.uioc_rmbox[0] == MEGA_MBOXCMD_PASSTHRU ) { + /* Passthru commands */ + + pthru = pci_alloc_consistent(pdev, + sizeof(mega_passthru), + &pthru_dma_hndl); + + if( pthru == NULL ) { + return (-ENOMEM); + } + + /* + * The user passthru structure + */ + upthru = (mega_passthru *)MBOX(uioc)->xferaddr; + + /* + * Copy in the user passthru here. + */ + if( copy_from_user(pthru, (char *)upthru, + sizeof(mega_passthru)) ) { + + pci_free_consistent(pdev, + sizeof(mega_passthru), pthru, + pthru_dma_hndl); + + return (-EFAULT); + } + + /* + * Is there a data transfer + */ + if( pthru->dataxferlen ) { + data = pci_alloc_consistent(pdev, + pthru->dataxferlen, + &data_dma_hndl); + + if( data == NULL ) { + pci_free_consistent(pdev, + sizeof(mega_passthru), + pthru, + pthru_dma_hndl); + + return (-ENOMEM); + } + + /* + * Save the user address and point the kernel + * address at just allocated memory + */ + uxferaddr = pthru->dataxferaddr; + pthru->dataxferaddr = data_dma_hndl; + } + + + /* + * Is data coming down-stream + */ + if( pthru->dataxferlen && (uioc.flags & UIOC_WR) ) { + /* + * Get the user data + */ + if( copy_from_user(data, (char *)uxferaddr, + pthru->dataxferlen) ) { + rval = (-EFAULT); + goto freemem_and_return; + } + } + + memset(&mc, 0, sizeof(megacmd_t)); + + mc.cmd = MEGA_MBOXCMD_PASSTHRU; + mc.xferaddr = (u32)pthru_dma_hndl; + + /* + * Issue the command + */ + mega_internal_command(adapter, LOCK_INT, &mc, pthru); + + rval = mega_n_to_m((void *)arg, &mc); + + if( rval ) goto freemem_and_return; + + + /* + * Is data going up-stream + */ + if( pthru->dataxferlen && (uioc.flags & UIOC_RD) ) { + if( copy_to_user((char *)uxferaddr, data, + pthru->dataxferlen) ) { + rval = (-EFAULT); + } + } + + /* + * Send the request sense data also, irrespective of + * whether the user has asked for it or not. + */ + copy_to_user(upthru->reqsensearea, + pthru->reqsensearea, 14); + +freemem_and_return: + if( pthru->dataxferlen ) { + pci_free_consistent(pdev, + pthru->dataxferlen, data, + data_dma_hndl); + } + + pci_free_consistent(pdev, sizeof(mega_passthru), + pthru, pthru_dma_hndl); + + return rval; + } + else { + /* DCMD commands */ + + /* + * Is there a data transfer + */ + if( uioc.xferlen ) { + data = pci_alloc_consistent(pdev, + uioc.xferlen, &data_dma_hndl); + + if( data == NULL ) { + return (-ENOMEM); + } + + uxferaddr = MBOX(uioc)->xferaddr; + } + + /* + * Is data coming down-stream + */ + if( uioc.xferlen && (uioc.flags & UIOC_WR) ) { + /* + * Get the user data + */ + if( copy_from_user(data, (char *)uxferaddr, + uioc.xferlen) ) { + + pci_free_consistent(pdev, + uioc.xferlen, + data, data_dma_hndl); + + return (-EFAULT); + } + } + + memcpy(&mc, MBOX(uioc), sizeof(megacmd_t)); + + mc.xferaddr = (u32)data_dma_hndl; + + /* + * Issue the command + */ + mega_internal_command(adapter, LOCK_INT, &mc, NULL); + + rval = mega_n_to_m((void *)arg, &mc); + + if( rval ) { + if( uioc.xferlen ) { + pci_free_consistent(pdev, + uioc.xferlen, data, + data_dma_hndl); + } + + return rval; + } + + /* + * Is data going up-stream + */ + if( uioc.xferlen && (uioc.flags & UIOC_RD) ) { + if( copy_to_user((char *)uxferaddr, data, + uioc.xferlen) ) { + + rval = (-EFAULT); + } + } + + if( uioc.xferlen ) { + pci_free_consistent(pdev, + uioc.xferlen, data, + data_dma_hndl); + } + + return rval; + } + + default: + return (-EINVAL); + } + + return 0; +} + +/** + * mega_m_to_n() + * @arg - user address + * @uioc - new ioctl structure + * + * A thin layer to convert older mimd interface ioctl structure to NIT ioctl + * structure + * + * Converts the older mimd ioctl structure to newer NIT structure + */ +static int +mega_m_to_n(void *arg, nitioctl_t *uioc) +{ + struct uioctl_t uioc_mimd; + char signature[8] = {0}; + u8 opcode; + u8 subopcode; + + + /* + * check is the application conforms to NIT. We do not have to do much + * in that case. + * We exploit the fact that the signature is stored in the very + * begining of the structure. + */ + + if( copy_from_user(signature, (char *)arg, 7) ) + return (-EFAULT); + + if( memcmp(signature, "MEGANIT", 7) == 0 ) { + + /* + * NOTE NOTE: The nit ioctl is still under flux because of + * change of mailbox definition, in HPE. No applications yet + * use this interface and let's not have applications use this + * interface till the new specifitions are in place. + */ + return -EINVAL; +#if 0 + if( copy_from_user(uioc, (char *)arg, sizeof(nitioctl_t)) ) + return (-EFAULT); + return 0; +#endif + } + + /* + * Else assume we have mimd uioctl_t as arg. Convert to nitioctl_t + * + * Get the user ioctl structure + */ + if( copy_from_user(&uioc_mimd, (char *)arg, sizeof(struct uioctl_t)) ) + return (-EFAULT); + + + /* + * Get the opcode and subopcode for the commands + */ + opcode = uioc_mimd.ui.fcs.opcode; + subopcode = uioc_mimd.ui.fcs.subopcode; + + switch (opcode) { + case 0x82: + + switch (subopcode) { + + case MEGAIOC_QDRVRVER: /* Query driver version */ + uioc->opcode = GET_DRIVER_VER; + uioc->uioc_uaddr = uioc_mimd.data; + break; + + case MEGAIOC_QNADAP: /* Get # of adapters */ + uioc->opcode = GET_N_ADAP; + uioc->uioc_uaddr = uioc_mimd.data; + break; + + case MEGAIOC_QADAPINFO: /* Get adapter information */ + uioc->opcode = GET_ADAP_INFO; + uioc->adapno = uioc_mimd.ui.fcs.adapno; + uioc->uioc_uaddr = uioc_mimd.data; + break; + + default: + return(-EINVAL); + } + + break; + + + case 0x81: + + uioc->opcode = MBOX_CMD; + uioc->adapno = uioc_mimd.ui.fcs.adapno; + + memcpy(uioc->uioc_rmbox, uioc_mimd.mbox, 18); + + uioc->xferlen = uioc_mimd.ui.fcs.length; + + if( uioc_mimd.outlen ) uioc->flags = UIOC_RD; + if( uioc_mimd.inlen ) uioc->flags |= UIOC_WR; + + break; + + case 0x80: + + uioc->opcode = MBOX_CMD; + uioc->adapno = uioc_mimd.ui.fcs.adapno; + + memcpy(uioc->uioc_rmbox, uioc_mimd.mbox, 18); + + /* + * Choose the xferlen bigger of input and output data + */ + uioc->xferlen = uioc_mimd.outlen > uioc_mimd.inlen ? + uioc_mimd.outlen : uioc_mimd.inlen; + + if( uioc_mimd.outlen ) uioc->flags = UIOC_RD; + if( uioc_mimd.inlen ) uioc->flags |= UIOC_WR; + + break; + + default: + return (-EINVAL); + + } + + return 0; +} + +/* + * mega_n_to_m() + * @arg - user address + * @mc - mailbox command + * + * Updates the status information to the application, depending on application + * conforms to older mimd ioctl interface or newer NIT ioctl interface + */ +static int +mega_n_to_m(void *arg, megacmd_t *mc) +{ + nitioctl_t *uiocp; + megacmd_t *umc; + megacmd_t kmc; + mega_passthru *upthru; + struct uioctl_t *uioc_mimd; + char signature[8] = {0}; + + /* + * check is the application conforms to NIT. + */ + if( copy_from_user(signature, (char *)arg, 7) ) + return -EFAULT; + + if( memcmp(signature, "MEGANIT", 7) == 0 ) { + + uiocp = (nitioctl_t *)arg; + + if( put_user(mc->status, (u8 *)&MBOX_P(uiocp)->status) ) + return (-EFAULT); + + if( mc->cmd == MEGA_MBOXCMD_PASSTHRU ) { + + umc = MBOX_P(uiocp); + + upthru = (mega_passthru *)umc->xferaddr; + + if( put_user(mc->status, (u8 *)&upthru->scsistatus) ) + return (-EFAULT); + } + } + else { + uioc_mimd = (struct uioctl_t *)arg; + + if( put_user(mc->status, (u8 *)&uioc_mimd->mbox[17]) ) + return (-EFAULT); + + if( mc->cmd == MEGA_MBOXCMD_PASSTHRU ) { + + umc = (megacmd_t *)uioc_mimd->mbox; + if (copy_from_user(&kmc, umc, sizeof(megacmd_t))) + return -EFAULT; + + upthru = (mega_passthru *)kmc.xferaddr; + + if( put_user(mc->status, (u8 *)&upthru->scsistatus) ) + return (-EFAULT); + } + } + + return 0; +} + + +static int +megadev_close (struct inode *inode, struct file *filep) +{ + MOD_DEC_USE_COUNT; + return 0; +} + + +/* + * MEGARAID 'FW' commands. + */ + +/** + * mega_is_bios_enabled() + * @adapter - pointer to our soft state + * + * issue command to find out if the BIOS is enabled for this controller + */ +static int +mega_is_bios_enabled(adapter_t *adapter) +{ + unsigned char raw_mbox[16]; + mbox_t *mbox; + int ret; + + mbox = (mbox_t *)raw_mbox; + + memset(mbox, 0, 16); + + memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); + + mbox->xferaddr = (u32)adapter->buf_dma_handle; + + raw_mbox[0] = IS_BIOS_ENABLED; + raw_mbox[2] = GET_BIOS; + + + ret = issue_scb_block(adapter, raw_mbox); + + return *(char *)adapter->mega_buffer; +} + + +/** + * mega_enum_raid_scsi() + * @adapter - pointer to our soft state + * + * Find out what channels are RAID/SCSI. This information is used to + * differentiate the virtual channels and physical channels and to support + * ROMB feature and non-disk devices. + */ +static void +mega_enum_raid_scsi(adapter_t *adapter) +{ + unsigned char raw_mbox[16]; + mbox_t *mbox; + int i; + + mbox = (mbox_t *)raw_mbox; + + memset(mbox, 0, 16); + + /* + * issue command to find out what channels are raid/scsi + */ + raw_mbox[0] = CHNL_CLASS; + raw_mbox[2] = GET_CHNL_CLASS; + + memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); + + mbox->xferaddr = (u32)adapter->buf_dma_handle; + + /* + * Non-ROMB firware fail this command, so all channels + * must be shown RAID + */ + adapter->mega_ch_class = 0xFF; + + if(!issue_scb_block(adapter, raw_mbox)) { + adapter->mega_ch_class = *((char *)adapter->mega_buffer); + + } + + for( i = 0; i < adapter->product_info.nchannels; i++ ) { + if( (adapter->mega_ch_class >> i) & 0x01 ) { + printk(KERN_INFO "megaraid: channel[%d] is raid.\n", + i); + } + else { + printk(KERN_INFO "megaraid: channel[%d] is scsi.\n", + i); + } + } + + return; +} + + +/** + * mega_get_boot_drv() + * @adapter - pointer to our soft state + * + * Find out which device is the boot device. Note, any logical drive or any + * phyical device (e.g., a CDROM) can be designated as a boot device. + */ +static void +mega_get_boot_drv(adapter_t *adapter) +{ + struct private_bios_data *prv_bios_data; + unsigned char raw_mbox[16]; + mbox_t *mbox; + u16 cksum = 0; + u8 *cksum_p; + u8 boot_pdrv; + int i; + + mbox = (mbox_t *)raw_mbox; + + memset(mbox, 0, sizeof(raw_mbox)); + + raw_mbox[0] = BIOS_PVT_DATA; + raw_mbox[2] = GET_BIOS_PVT_DATA; + + memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); + + mbox->xferaddr = (u32)adapter->buf_dma_handle; + + adapter->boot_ldrv_enabled = 0; + adapter->boot_ldrv = 0; + + adapter->boot_pdrv_enabled = 0; + adapter->boot_pdrv_ch = 0; + adapter->boot_pdrv_tgt = 0; + + if(issue_scb_block(adapter, raw_mbox) == 0) { + prv_bios_data = + (struct private_bios_data *)adapter->mega_buffer; + + cksum = 0; + cksum_p = (char *)prv_bios_data; + for (i = 0; i < 14; i++ ) { + cksum += (u16)(*cksum_p++); + } + + if (prv_bios_data->cksum == (u16)(0-cksum) ) { + + /* + * If MSB is set, a physical drive is set as boot + * device + */ + if( prv_bios_data->boot_drv & 0x80 ) { + adapter->boot_pdrv_enabled = 1; + boot_pdrv = prv_bios_data->boot_drv & 0x7F; + adapter->boot_pdrv_ch = boot_pdrv / 16; + adapter->boot_pdrv_tgt = boot_pdrv % 16; + } + else { + adapter->boot_ldrv_enabled = 1; + adapter->boot_ldrv = prv_bios_data->boot_drv; + } + } + } + +} + +/** + * mega_support_random_del() + * @adapter - pointer to our soft state + * + * Find out if this controller supports random deletion and addition of + * logical drives + */ +static int +mega_support_random_del(adapter_t *adapter) +{ + unsigned char raw_mbox[16]; + mbox_t *mbox; + int rval; + + mbox = (mbox_t *)raw_mbox; + + memset(mbox, 0, 16); + + /* + * issue command + */ + raw_mbox[0] = FC_DEL_LOGDRV; + raw_mbox[2] = OP_SUP_DEL_LOGDRV; + + rval = issue_scb_block(adapter, raw_mbox); + + return !rval; +} + + +/** + * mega_support_ext_cdb() + * @adapter - pointer to our soft state + * + * Find out if this firmware support cdblen > 10 + */ +static int +mega_support_ext_cdb(adapter_t *adapter) +{ + unsigned char raw_mbox[16]; + mbox_t *mbox; + int rval; + + mbox = (mbox_t *)raw_mbox; + + memset(mbox, 0, 16); + /* + * issue command to find out if controller supports extended CDBs. + */ + raw_mbox[0] = 0xA4; + raw_mbox[2] = 0x16; + + rval = issue_scb_block(adapter, raw_mbox); + + return !rval; +} + + +/** + * mega_del_logdrv() + * @adapter - pointer to our soft state + * @logdrv - logical drive to be deleted + * + * Delete the specified logical drive. It is the responsibility of the user + * app to let the OS know about this operation. + */ +static int +mega_del_logdrv(adapter_t *adapter, int logdrv) +{ + DECLARE_WAIT_QUEUE_HEAD(wq); + unsigned long flags; + scb_t *scb; + int rval; + + ASSERT( !spin_is_locked(adapter->host_lock) ); + + /* + * Stop sending commands to the controller, queue them internally. + * When deletion is complete, ISR will flush the queue. + */ + atomic_set(&adapter->quiescent, 1); + + /* + * Wait till all the issued commands are complete and there are no + * commands in the pending queue + */ + while( atomic_read(&adapter->pend_cmds) > 0 ) { + + sleep_on_timeout( &wq, 1*HZ ); /* sleep for 1s */ + } + + rval = mega_do_del_logdrv(adapter, logdrv); + + + spin_lock_irqsave(adapter->host_lock, flags); + + /* + * If delete operation was successful, add 0x80 to the logical drive + * ids for commands in the pending queue. + */ + if (adapter->read_ldidmap) { + struct list_head *pos; + list_for_each(pos, &adapter->pending_list) { + scb = list_entry(pos, scb_t, list); + if (((mbox_t *)scb->raw_mbox)->logdrv < 0x80 ) + ((mbox_t *)scb->raw_mbox)->logdrv += 0x80 ; + } + } + + atomic_set(&adapter->quiescent, 0); + + mega_runpendq(adapter); + + spin_unlock_irqrestore(adapter->host_lock, flags); + + return rval; +} + + +static int +mega_do_del_logdrv(adapter_t *adapter, int logdrv) +{ + int rval; + u8 raw_mbox[16]; + + raw_mbox[0] = FC_DEL_LOGDRV; + raw_mbox[2] = OP_DEL_LOGDRV; + raw_mbox[3] = logdrv; + + /* Issue a blocking command to the card */ + rval = issue_scb_block(adapter, raw_mbox); + + /* log this event */ + if(rval) { + printk(KERN_WARNING "megaraid: Delete LD-%d failed.", logdrv); + return rval; + } + + /* + * After deleting first logical drive, the logical drives must be + * addressed by adding 0x80 to the logical drive id. + */ + adapter->read_ldidmap = 1; + + return rval; +} + + +/** + * mega_get_max_sgl() + * @adapter - pointer to our soft state + * + * Find out the maximum number of scatter-gather elements supported by this + * version of the firmware + */ +static void +mega_get_max_sgl(adapter_t *adapter) +{ + unsigned char raw_mbox[16]; + mbox_t *mbox; + + mbox = (mbox_t *)raw_mbox; + + memset(mbox, 0, sizeof(raw_mbox)); + + memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); + + mbox->xferaddr = (u32)adapter->buf_dma_handle; + + raw_mbox[0] = MAIN_MISC_OPCODE; + raw_mbox[2] = GET_MAX_SG_SUPPORT; + + + if( issue_scb_block(adapter, raw_mbox) ) { + /* + * f/w does not support this command. Choose the default value + */ + adapter->sglen = MIN_SGLIST; + } + else { + adapter->sglen = *((char *)adapter->mega_buffer); + + /* + * Make sure this is not more than the resources we are + * planning to allocate + */ + if ( adapter->sglen > MAX_SGLIST ) + adapter->sglen = MAX_SGLIST; + } + + return; +} + + +/** + * mega_support_cluster() + * @adapter - pointer to our soft state + * + * Find out if this firmware support cluster calls. + */ +static int +mega_support_cluster(adapter_t *adapter) +{ + unsigned char raw_mbox[16]; + mbox_t *mbox; + + mbox = (mbox_t *)raw_mbox; + + memset(mbox, 0, sizeof(raw_mbox)); + + memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); + + mbox->xferaddr = (u32)adapter->buf_dma_handle; + + /* + * Try to get the initiator id. This command will succeed iff the + * clustering is available on this HBA. + */ + raw_mbox[0] = MEGA_GET_TARGET_ID; + + if( issue_scb_block(adapter, raw_mbox) == 0 ) { + + /* + * Cluster support available. Get the initiator target id. + * Tell our id to mid-layer too. + */ + adapter->this_id = *(u32 *)adapter->mega_buffer; + adapter->host->this_id = adapter->this_id; + + return 1; + } + + return 0; +} + + + +/** + * mega_get_ldrv_num() + * @adapter - pointer to our soft state + * @cmd - scsi mid layer command + * @channel - channel on the controller + * + * Calculate the logical drive number based on the information in scsi command + * and the channel number. + */ +static inline int +mega_get_ldrv_num(adapter_t *adapter, Scsi_Cmnd *cmd, int channel) +{ + int tgt; + int ldrv_num; + + tgt = cmd->target; + + if ( tgt > adapter->this_id ) + tgt--; /* we do not get inquires for initiator id */ + + ldrv_num = (channel * 15) + tgt; + + + /* + * If we have a logical drive with boot enabled, project it first + */ + if( adapter->boot_ldrv_enabled ) { + if( ldrv_num == 0 ) { + ldrv_num = adapter->boot_ldrv; + } + else { + if( ldrv_num <= adapter->boot_ldrv ) { + ldrv_num--; + } + } + } + + /* + * If "delete logical drive" feature is enabled on this controller. + * Do only if at least one delete logical drive operation was done. + * + * Also, after logical drive deletion, instead of logical drive number, + * the value returned should be 0x80+logical drive id. + * + * These is valid only for IO commands. + */ + + if (adapter->support_random_del && adapter->read_ldidmap ) + switch (cmd->cmnd[0]) { + case READ_6: /* fall through */ + case WRITE_6: /* fall through */ + case READ_10: /* fall through */ + case WRITE_10: + ldrv_num += 0x80; + } + + return ldrv_num; +} + + +/** + * mega_reorder_hosts() + * + * Hack: reorder the scsi hosts in mid-layer so that the controller with the + * boot device on it appears first in the list. + */ +static void +mega_reorder_hosts(void) +{ + struct Scsi_Host *shpnt; + struct Scsi_Host *shone; + struct Scsi_Host *shtwo; + adapter_t *boot_host; + int i; + + /* + * Find the (first) host which has it's BIOS enabled + */ + boot_host = NULL; + for (i = 0; i < MAX_CONTROLLERS; i++) { + if (mega_hbas[i].is_bios_enabled) { + boot_host = mega_hbas[i].hostdata_addr; + break; + } + } + + if (!boot_host) { + printk(KERN_NOTICE "megaraid: no BIOS enabled.\n"); + return; + } + + /* + * Traverse through the list of SCSI hosts for our HBA locations + */ + shone = shtwo = NULL; + for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) { + /* Is it one of ours? */ + for (i = 0; i < MAX_CONTROLLERS; i++) { + if ((adapter_t *) shpnt->hostdata == + mega_hbas[i].hostdata_addr) { + /* Does this one has BIOS enabled */ + if (mega_hbas[i].hostdata_addr == boot_host) { + + /* Are we first */ + if (!shtwo) /* Yes! */ + return; + else /* :-( */ + shone = shpnt; + } else { + if (!shtwo) { + /* were we here before? xchng + * first */ + shtwo = shpnt; + } + } + break; + } + } + /* + * Have we got the boot host and one which does not have the + * bios enabled. + */ + if (shone && shtwo) + break; + } + if (shone && shtwo) { + mega_swap_hosts (shone, shtwo); + } + + return; +} + + +static void +mega_swap_hosts (struct Scsi_Host *shone, struct Scsi_Host *shtwo) +{ + struct Scsi_Host *prevtoshtwo; + struct Scsi_Host *prevtoshone; + struct Scsi_Host *save = NULL; + + /* Are these two nodes adjacent */ + if (shtwo->next == shone) { + + if (shtwo == scsi_hostlist && !shone->next) { + + /* just two nodes */ + scsi_hostlist = shone; + shone->next = shtwo; + shtwo->next = NULL; + } else if (shtwo == scsi_hostlist) { + /* first two nodes of the list */ + + scsi_hostlist = shone; + shtwo->next = shone->next; + scsi_hostlist->next = shtwo; + } else if (!shone->next) { + /* last two nodes of the list */ + + prevtoshtwo = scsi_hostlist; + + while (prevtoshtwo->next != shtwo) + prevtoshtwo = prevtoshtwo->next; + + prevtoshtwo->next = shone; + shone->next = shtwo; + shtwo->next = NULL; + } else { + prevtoshtwo = scsi_hostlist; + + while (prevtoshtwo->next != shtwo) + prevtoshtwo = prevtoshtwo->next; + + prevtoshtwo->next = shone; + shtwo->next = shone->next; + shone->next = shtwo; + } + + } else if (shtwo == scsi_hostlist && !shone->next) { + /* shtwo at head, shone at tail, not adjacent */ + + prevtoshone = scsi_hostlist; + + while (prevtoshone->next != shone) + prevtoshone = prevtoshone->next; + + scsi_hostlist = shone; + shone->next = shtwo->next; + prevtoshone->next = shtwo; + shtwo->next = NULL; + } else if (shtwo == scsi_hostlist && shone->next) { + /* shtwo at head, shone is not at tail */ + + prevtoshone = scsi_hostlist; + while (prevtoshone->next != shone) + prevtoshone = prevtoshone->next; + + scsi_hostlist = shone; + prevtoshone->next = shtwo; + save = shtwo->next; + shtwo->next = shone->next; + shone->next = save; + } else if (!shone->next) { + /* shtwo not at head, shone at tail */ + + prevtoshtwo = scsi_hostlist; + prevtoshone = scsi_hostlist; + + while (prevtoshtwo->next != shtwo) + prevtoshtwo = prevtoshtwo->next; + while (prevtoshone->next != shone) + prevtoshone = prevtoshone->next; + + prevtoshtwo->next = shone; + shone->next = shtwo->next; + prevtoshone->next = shtwo; + shtwo->next = NULL; + + } else { + prevtoshtwo = scsi_hostlist; + prevtoshone = scsi_hostlist; + save = NULL; + + while (prevtoshtwo->next != shtwo) + prevtoshtwo = prevtoshtwo->next; + while (prevtoshone->next != shone) + prevtoshone = prevtoshone->next; + + prevtoshtwo->next = shone; + save = shone->next; + shone->next = shtwo->next; + prevtoshone->next = shtwo; + shtwo->next = save; + } + return; +} + + + +#ifdef CONFIG_PROC_FS +/** + * mega_adapinq() + * @adapter - pointer to our soft state + * @dma_handle - DMA address of the buffer + * + * Issue internal comamnds while interrupts are available. + * We only issue direct mailbox commands from within the driver. ioctl() + * interface using these routines can issue passthru commands. + */ +static int +mega_adapinq(adapter_t *adapter, dma_addr_t dma_handle) +{ + megacmd_t mc; + + memset(&mc, 0, sizeof(megacmd_t)); + + if( adapter->flag & BOARD_40LD ) { + mc.cmd = FC_NEW_CONFIG; + mc.opcode = NC_SUBOP_ENQUIRY3; + mc.subopcode = ENQ3_GET_SOLICITED_FULL; + } + else { + mc.cmd = MEGA_MBOXCMD_ADPEXTINQ; + } + + mc.xferaddr = (u32)dma_handle; + + if ( mega_internal_command(adapter, LOCK_INT, &mc, NULL) != 0 ) { + return -1; + } + + return 0; +} + + +/** + * mega_allocate_inquiry() + * @dma_handle - handle returned for dma address + * @pdev - handle to pci device + * + * allocates memory for inquiry structure + */ +static inline caddr_t +mega_allocate_inquiry(dma_addr_t *dma_handle, struct pci_dev *pdev) +{ + return pci_alloc_consistent(pdev, sizeof(mega_inquiry3), dma_handle); +} + + +static inline void +mega_free_inquiry(caddr_t inquiry, dma_addr_t dma_handle, struct pci_dev *pdev) +{ + pci_free_consistent(pdev, sizeof(mega_inquiry3), inquiry, dma_handle); +} + + +/** mega_internal_dev_inquiry() + * @adapter - pointer to our soft state + * @ch - channel for this device + * @tgt - ID of this device + * @buf_dma_handle - DMA address of the buffer + * + * Issue the scsi inquiry for the specified device. + */ +static int +mega_internal_dev_inquiry(adapter_t *adapter, u8 ch, u8 tgt, + dma_addr_t buf_dma_handle) +{ + mega_passthru *pthru; + dma_addr_t pthru_dma_handle; + megacmd_t mc; + int rval; + struct pci_dev *pdev; + + + /* + * For all internal commands, the buffer must be allocated in <4GB + * address range + */ + pdev = adapter->ipdev; + + pthru = pci_alloc_consistent(pdev, sizeof(mega_passthru), + &pthru_dma_handle); + + if( pthru == NULL ) { + return -1; + } + + pthru->timeout = 2; + pthru->ars = 1; + pthru->reqsenselen = 14; + pthru->islogical = 0; + + pthru->channel = (adapter->flag & BOARD_40LD) ? 0 : ch; + + pthru->target = (adapter->flag & BOARD_40LD) ? (ch << 4)|tgt : tgt; + + pthru->cdblen = 6; + + pthru->cdb[0] = INQUIRY; + pthru->cdb[1] = 0; + pthru->cdb[2] = 0; + pthru->cdb[3] = 0; + pthru->cdb[4] = 255; + pthru->cdb[5] = 0; + + + pthru->dataxferaddr = (u32)buf_dma_handle; + pthru->dataxferlen = 256; + + memset(&mc, 0, sizeof(megacmd_t)); + + mc.cmd = MEGA_MBOXCMD_PASSTHRU; + mc.xferaddr = (u32)pthru_dma_handle; + + rval = mega_internal_command(adapter, LOCK_INT, &mc, pthru); + + pci_free_consistent(pdev, sizeof(mega_passthru), pthru, + pthru_dma_handle); + + return rval; +} +#endif // #ifdef CONFIG_PROC_FS + + +/** + * mega_internal_command() + * @adapter - pointer to our soft state + * @ls - the scope of the exclusion lock. + * @mc - the mailbox command + * @pthru - Passthru structure for DCDB commands + * + * Issue the internal commands in interrupt mode. + * The last argument is the address of the passthru structure if the command + * to be fired is a passthru command + * + * lockscope specifies whether the caller has already acquired the lock. Of + * course, the caller must know which lock we are talking about. + * + * Note: parameter 'pthru' is null for non-passthru commands. + */ +static int +mega_internal_command(adapter_t *adapter, lockscope_t ls, megacmd_t *mc, + mega_passthru *pthru ) +{ + Scsi_Cmnd *scmd; + unsigned long flags = 0; + scb_t *scb; + int rval; + + /* + * The internal commands share one command id and hence are + * serialized. This is so because we want to reserve maximum number of + * available command ids for the I/O commands. + */ + down(&adapter->int_mtx); + + scb = &adapter->int_scb; + memset(scb, 0, sizeof(scb_t)); + + scmd = &adapter->int_scmd; + memset(scmd, 0, sizeof(Scsi_Cmnd)); + + scmd->host = adapter->host; + scmd->buffer = (void *)scb; + scmd->cmnd[0] = MEGA_INTERNAL_CMD; + + scb->state |= SCB_ACTIVE; + scb->cmd = scmd; + + memcpy(scb->raw_mbox, mc, sizeof(megacmd_t)); + + /* + * Is it a passthru command + */ + if( mc->cmd == MEGA_MBOXCMD_PASSTHRU ) { + + scb->pthru = pthru; + } + + scb->idx = CMDID_INT_CMDS; + + scmd->state = 0; + + /* + * Get the lock only if the caller has not acquired it already + */ + if( ls == LOCK_INT ) spin_lock_irqsave(adapter->host_lock, flags); + + megaraid_queue(scmd, mega_internal_done); + + if( ls == LOCK_INT ) spin_unlock_irqrestore(adapter->host_lock, flags); + + /* + * Wait till this command finishes. Do not use + * wait_event_interruptible(). It causes panic if CTRL-C is hit when + * dumping e.g., physical disk information through /proc interface. + * Catching the return value should solve the issue but for now keep + * the call non-interruptible. + */ +#if 0 + wait_event_interruptible(adapter->int_waitq, scmd->state); +#endif + wait_event(adapter->int_waitq, scmd->state); + + rval = scmd->result; + mc->status = scmd->result; + + /* + * Print a debug message for all failed commands. Applications can use + * this information. + */ + if( scmd->result && trace_level ) { + printk("megaraid: cmd [%x, %x, %x] status:[%x]\n", + mc->cmd, mc->opcode, mc->subopcode, scmd->result); + } + + up(&adapter->int_mtx); + + return rval; +} + + +/** + * mega_internal_done() + * @scmd - internal scsi command + * + * Callback routine for internal commands. + */ +static void +mega_internal_done(Scsi_Cmnd *scmd) +{ + adapter_t *adapter; + + adapter = (adapter_t *)scmd->host->hostdata; + + scmd->state = 1; /* thread waiting for its command to complete */ + + /* + * See comment in mega_internal_command() routine for + * wait_event_interruptible() + */ +#if 0 + wake_up_interruptible(&adapter->int_waitq); +#endif + wake_up(&adapter->int_waitq); + +} + +static Scsi_Host_Template driver_template = MEGARAID; + +#include "scsi_module.c" + +/* vi: set ts=8 sw=8 tw=78: */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/megaraid2.h linux-2.4.23-pre8/drivers/scsi/megaraid2.h --- linux-2.4.22/drivers/scsi/megaraid2.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/megaraid2.h 2003-10-22 22:47:29.000000000 +0000 @@ -0,0 +1,1187 @@ +#ifndef __MEGARAID_H__ +#define __MEGARAID_H__ + +#include +#include + + +#define MEGARAID_VERSION \ + "v2.00.9 (Release Date: Thu Sep 4 17:49:42 EDT 2003)\n" + +/* + * Driver features - change the values to enable or disable features in the + * driver. + */ + +/* + * Comand coalescing - This feature allows the driver to be able to combine + * two or more commands and issue as one command in order to boost I/O + * performance. Useful if the nature of the I/O is sequential. It is not very + * useful for random natured I/Os. + */ +#define MEGA_HAVE_COALESCING 0 + +/* + * Clustering support - Set this flag if you are planning to use the + * clustering services provided by the megaraid controllers and planning to + * setup a cluster + */ +#define MEGA_HAVE_CLUSTERING 1 + +/* + * Driver statistics - Set this flag if you are interested in statics about + * number of I/O completed on each logical drive and how many interrupts + * generated. If enabled, this information is available through /proc + * interface and through the private ioctl. Setting this flag has a + * performance penalty. + */ +#define MEGA_HAVE_STATS 0 + +/* + * Enhanced /proc interface - This feature will allow you to have a more + * detailed /proc interface for megaraid driver. E.g., a real time update of + * the status of the logical drives, battery status, physical drives etc. + */ +#define MEGA_HAVE_ENH_PROC 1 + +#define MAX_DEV_TYPE 32 + +#ifndef PCI_VENDOR_ID_LSI_LOGIC +#define PCI_VENDOR_ID_LSI_LOGIC 0x1000 +#endif + +#ifndef PCI_VENDOR_ID_AMI +#define PCI_VENDOR_ID_AMI 0x101E +#endif + +#ifndef PCI_VENDOR_ID_DELL +#define PCI_VENDOR_ID_DELL 0x1028 +#endif + +#ifndef PCI_VENDOR_ID_INTEL +#define PCI_VENDOR_ID_INTEL 0x8086 +#endif + +#ifndef PCI_DEVICE_ID_AMI_MEGARAID +#define PCI_DEVICE_ID_AMI_MEGARAID 0x9010 +#endif + +#ifndef PCI_DEVICE_ID_AMI_MEGARAID2 +#define PCI_DEVICE_ID_AMI_MEGARAID2 0x9060 +#endif + +#ifndef PCI_DEVICE_ID_AMI_MEGARAID3 +#define PCI_DEVICE_ID_AMI_MEGARAID3 0x1960 +#endif + +#define PCI_DEVICE_ID_DISCOVERY 0x000E +#define PCI_DEVICE_ID_PERC4_DI 0x000F +#define PCI_DEVICE_ID_PERC4_QC_VERDE 0x0407 + +/* Sub-System Vendor IDs */ +#define AMI_SUBSYS_VID 0x101E +#define DELL_SUBSYS_VID 0x1028 +#define HP_SUBSYS_VID 0x103C +#define LSI_SUBSYS_VID 0x1000 +#define INTEL_SUBSYS_VID 0x8086 + +#define HBA_SIGNATURE 0x3344 +#define HBA_SIGNATURE_471 0xCCCC +#define HBA_SIGNATURE_64BIT 0x0299 + +#define MBOX_BUSY_WAIT 10 /* wait for up to 10 usec for + mailbox to be free */ +#define DEFAULT_INITIATOR_ID 7 + +#define MAX_SGLIST 64 /* max supported in f/w */ +#define MIN_SGLIST 26 /* guaranteed to support these many */ +#define MAX_COMMANDS 126 +#define CMDID_INT_CMDS MAX_COMMANDS+1 /* make sure CMDID_INT_CMDS + is less than max commands + supported by any f/w */ + +#define MAX_CDB_LEN 10 +#define MAX_EXT_CDB_LEN 16 /* we support cdb length up to 16 */ + +#define DEF_CMD_PER_LUN 63 +#define MAX_CMD_PER_LUN MAX_COMMANDS +#define MAX_FIRMWARE_STATUS 46 +#define MAX_XFER_PER_CMD (64*1024) +#define MAX_SECTORS_PER_IO 128 + +#define MAX_LOGICAL_DRIVES_40LD 40 +#define FC_MAX_PHYSICAL_DEVICES 256 +#define MAX_LOGICAL_DRIVES_8LD 8 +#define MAX_CHANNELS 5 +#define MAX_TARGET 15 +#define MAX_PHYSICAL_DRIVES MAX_CHANNELS*MAX_TARGET +#define MAX_ROW_SIZE_40LD 32 +#define MAX_ROW_SIZE_8LD 8 +#define MAX_SPAN_DEPTH 8 + +#define NVIRT_CHAN 4 /* # of virtual channels to represent + up to 60 logical drives */ + +#define MEGARAID \ +{ \ + .name = "MegaRAID", \ + .proc_name = "megaraid", \ + .detect = megaraid_detect, \ + .release = megaraid_release, \ + .info = megaraid_info, \ + .command = megaraid_command, \ + .queuecommand = megaraid_queue, \ + .bios_param = megaraid_biosparam, \ + .max_sectors = MAX_SECTORS_PER_IO, \ + .can_queue = MAX_COMMANDS, \ + .this_id = DEFAULT_INITIATOR_ID, \ + .sg_tablesize = MAX_SGLIST, \ + .cmd_per_lun = DEF_CMD_PER_LUN, \ + .present = 0, \ + .unchecked_isa_dma = 0, \ + .use_clustering = ENABLE_CLUSTERING, \ + .use_new_eh_code = 1, \ + .eh_abort_handler = megaraid_abort, \ + .eh_device_reset_handler = megaraid_reset, \ + .eh_bus_reset_handler = megaraid_reset, \ + .eh_host_reset_handler = megaraid_reset, \ + .highmem_io = 1 \ +} + + + +typedef struct { + /* 0x0 */ u8 cmd; + /* 0x1 */ u8 cmdid; + /* 0x2 */ u16 numsectors; + /* 0x4 */ u32 lba; + /* 0x8 */ u32 xferaddr; + /* 0xC */ u8 logdrv; + /* 0xD */ u8 numsgelements; + /* 0xE */ u8 resvd; + /* 0xF */ volatile u8 busy; + /* 0x10 */ volatile u8 numstatus; + /* 0x11 */ volatile u8 status; + /* 0x12 */ volatile u8 completed[MAX_FIRMWARE_STATUS]; + volatile u8 poll; + volatile u8 ack; +} __attribute__ ((packed)) mbox_t; + +typedef struct { + u32 xfer_segment_lo; + u32 xfer_segment_hi; + mbox_t mbox; +} __attribute__ ((packed)) mbox64_t; + + +/* + * Passthru definitions + */ +#define MAX_REQ_SENSE_LEN 0x20 + +typedef struct { + u8 timeout:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */ + u8 ars:1; + u8 reserved:3; + u8 islogical:1; + u8 logdrv; /* if islogical == 1 */ + u8 channel; /* if islogical == 0 */ + u8 target; /* if islogical == 0 */ + u8 queuetag; /* unused */ + u8 queueaction; /* unused */ + u8 cdb[MAX_CDB_LEN]; + u8 cdblen; + u8 reqsenselen; + u8 reqsensearea[MAX_REQ_SENSE_LEN]; + u8 numsgelements; + u8 scsistatus; + u32 dataxferaddr; + u32 dataxferlen; +} __attribute__ ((packed)) mega_passthru; + + +/* + * Extended passthru: support CDB > 10 bytes + */ +typedef struct { + u8 timeout:3; /* 0=6sec/1=60sec/2=10min/3=3hrs */ + u8 ars:1; + u8 rsvd1:1; + u8 cd_rom:1; + u8 rsvd2:1; + u8 islogical:1; + u8 logdrv; /* if islogical == 1 */ + u8 channel; /* if islogical == 0 */ + u8 target; /* if islogical == 0 */ + u8 queuetag; /* unused */ + u8 queueaction; /* unused */ + u8 cdblen; + u8 rsvd3; + u8 cdb[MAX_EXT_CDB_LEN]; + u8 numsgelements; + u8 status; + u8 reqsenselen; + u8 reqsensearea[MAX_REQ_SENSE_LEN]; + u8 rsvd4; + u32 dataxferaddr; + u32 dataxferlen; +} __attribute__ ((packed)) mega_ext_passthru; + +typedef struct { + u64 address; + u32 length; +} __attribute__ ((packed)) mega_sgl64; + +typedef struct { + u32 address; + u32 length; +} __attribute__ ((packed)) mega_sglist; + + +/* Queued command data */ +typedef struct { + int idx; + u32 state; + struct list_head list; + u8 raw_mbox[66]; + u32 dma_type; + u32 dma_direction; + + Scsi_Cmnd *cmd; + dma_addr_t dma_h_bulkdata; + dma_addr_t dma_h_sgdata; + + mega_sglist *sgl; + mega_sgl64 *sgl64; + dma_addr_t sgl_dma_addr; + + mega_passthru *pthru; + dma_addr_t pthru_dma_addr; + mega_ext_passthru *epthru; + dma_addr_t epthru_dma_addr; +} scb_t; + +/* + * Flags to follow the scb as it transitions between various stages + */ +#define SCB_FREE 0x0000 /* on the free list */ +#define SCB_ACTIVE 0x0001 /* off the free list */ +#define SCB_PENDQ 0x0002 /* on the pending queue */ +#define SCB_ISSUED 0x0004 /* issued - owner f/w */ +#define SCB_ABORT 0x0008 /* Got an abort for this one */ +#define SCB_RESET 0x0010 /* Got a reset for this one */ + +/* + * Utilities declare this strcture size as 1024 bytes. So more fields can + * be added in future. + */ +typedef struct { + u32 data_size; /* current size in bytes (not including resvd) */ + + u32 config_signature; + /* Current value is 0x00282008 + * 0x28=MAX_LOGICAL_DRIVES, + * 0x20=Number of stripes and + * 0x08=Number of spans */ + + u8 fw_version[16]; /* printable ASCI string */ + u8 bios_version[16]; /* printable ASCI string */ + u8 product_name[80]; /* printable ASCI string */ + + u8 max_commands; /* Max. concurrent commands supported */ + u8 nchannels; /* Number of SCSI Channels detected */ + u8 fc_loop_present; /* Number of Fibre Loops detected */ + u8 mem_type; /* EDO, FPM, SDRAM etc */ + + u32 signature; + u16 dram_size; /* In terms of MB */ + u16 subsysid; + + u16 subsysvid; + u8 notify_counters; + u8 pad1k[889]; /* 135 + 889 resvd = 1024 total size */ +} __attribute__ ((packed)) mega_product_info; + +struct notify { + u32 global_counter; /* Any change increments this counter */ + + u8 param_counter; /* Indicates any params changed */ + u8 param_id; /* Param modified - defined below */ + u16 param_val; /* New val of last param modified */ + + u8 write_config_counter; /* write config occurred */ + u8 write_config_rsvd[3]; + + u8 ldrv_op_counter; /* Indicates ldrv op started/completed */ + u8 ldrv_opid; /* ldrv num */ + u8 ldrv_opcmd; /* ldrv operation - defined below */ + u8 ldrv_opstatus; /* status of the operation */ + + u8 ldrv_state_counter; /* Indicates change of ldrv state */ + u8 ldrv_state_id; /* ldrv num */ + u8 ldrv_state_new; /* New state */ + u8 ldrv_state_old; /* old state */ + + u8 pdrv_state_counter; /* Indicates change of ldrv state */ + u8 pdrv_state_id; /* pdrv id */ + u8 pdrv_state_new; /* New state */ + u8 pdrv_state_old; /* old state */ + + u8 pdrv_fmt_counter; /* Indicates pdrv format started/over */ + u8 pdrv_fmt_id; /* pdrv id */ + u8 pdrv_fmt_val; /* format started/over */ + u8 pdrv_fmt_rsvd; + + u8 targ_xfer_counter; /* Indicates SCSI-2 Xfer rate change */ + u8 targ_xfer_id; /* pdrv Id */ + u8 targ_xfer_val; /* new Xfer params of last pdrv */ + u8 targ_xfer_rsvd; + + u8 fcloop_id_chg_counter; /* Indicates loopid changed */ + u8 fcloopid_pdrvid; /* pdrv id */ + u8 fcloop_id0; /* loopid on fc loop 0 */ + u8 fcloop_id1; /* loopid on fc loop 1 */ + + u8 fcloop_state_counter; /* Indicates loop state changed */ + u8 fcloop_state0; /* state of fc loop 0 */ + u8 fcloop_state1; /* state of fc loop 1 */ + u8 fcloop_state_rsvd; +} __attribute__ ((packed)); + +#define MAX_NOTIFY_SIZE 0x80 +#define CUR_NOTIFY_SIZE sizeof(struct notify) + +typedef struct { + u32 data_size; /* current size in bytes (not including resvd) */ + + struct notify notify; + + u8 notify_rsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE]; + + u8 rebuild_rate; /* Rebuild rate (0% - 100%) */ + u8 cache_flush_interval; /* In terms of Seconds */ + u8 sense_alert; + u8 drive_insert_count; /* drive insertion count */ + + u8 battery_status; + u8 num_ldrv; /* No. of Log Drives configured */ + u8 recon_state[MAX_LOGICAL_DRIVES_40LD / 8]; /* State of + reconstruct */ + u16 ldrv_op_status[MAX_LOGICAL_DRIVES_40LD / 8]; /* logdrv + Status */ + + u32 ldrv_size[MAX_LOGICAL_DRIVES_40LD];/* Size of each log drv */ + u8 ldrv_prop[MAX_LOGICAL_DRIVES_40LD]; + u8 ldrv_state[MAX_LOGICAL_DRIVES_40LD];/* State of log drives */ + u8 pdrv_state[FC_MAX_PHYSICAL_DEVICES];/* State of phys drvs. */ + u16 pdrv_format[FC_MAX_PHYSICAL_DEVICES / 16]; + + u8 targ_xfer[80]; /* phys device transfer rate */ + u8 pad1k[263]; /* 761 + 263reserved = 1024 bytes total size */ +} __attribute__ ((packed)) mega_inquiry3; + + +/* Structures */ +typedef struct { + u8 max_commands; /* Max concurrent commands supported */ + u8 rebuild_rate; /* Rebuild rate - 0% thru 100% */ + u8 max_targ_per_chan; /* Max targ per channel */ + u8 nchannels; /* Number of channels on HBA */ + u8 fw_version[4]; /* Firmware version */ + u16 age_of_flash; /* Number of times FW has been flashed */ + u8 chip_set_value; /* Contents of 0xC0000832 */ + u8 dram_size; /* In MB */ + u8 cache_flush_interval; /* in seconds */ + u8 bios_version[4]; + u8 board_type; + u8 sense_alert; + u8 write_config_count; /* Increase with every configuration + change */ + u8 drive_inserted_count; /* Increase with every drive inserted + */ + u8 inserted_drive; /* Channel:Id of inserted drive */ + u8 battery_status; /* + * BIT 0: battery module missing + * BIT 1: VBAD + * BIT 2: temprature high + * BIT 3: battery pack missing + * BIT 4,5: + * 00 - charge complete + * 01 - fast charge in progress + * 10 - fast charge fail + * 11 - undefined + * Bit 6: counter > 1000 + * Bit 7: Undefined + */ + u8 dec_fault_bus_info; +} __attribute__ ((packed)) mega_adp_info; + + +typedef struct { + u8 num_ldrv; /* Number of logical drives configured */ + u8 rsvd[3]; + u32 ldrv_size[MAX_LOGICAL_DRIVES_8LD]; + u8 ldrv_prop[MAX_LOGICAL_DRIVES_8LD]; + u8 ldrv_state[MAX_LOGICAL_DRIVES_8LD]; +} __attribute__ ((packed)) mega_ldrv_info; + +typedef struct { + u8 pdrv_state[MAX_PHYSICAL_DRIVES]; + u8 rsvd; +} __attribute__ ((packed)) mega_pdrv_info; + +/* RAID inquiry: Mailbox command 0x05*/ +typedef struct { + mega_adp_info adapter_info; + mega_ldrv_info logdrv_info; + mega_pdrv_info pdrv_info; +} __attribute__ ((packed)) mraid_inquiry; + + +/* RAID extended inquiry: Mailbox command 0x04*/ +typedef struct { + mraid_inquiry raid_inq; + u16 phys_drv_format[MAX_CHANNELS]; + u8 stack_attn; + u8 modem_status; + u8 rsvd[2]; +} __attribute__ ((packed)) mraid_ext_inquiry; + + +typedef struct { + u8 channel; + u8 target; +}__attribute__ ((packed)) adp_device; + +typedef struct { + u32 start_blk; /* starting block */ + u32 num_blks; /* # of blocks */ + adp_device device[MAX_ROW_SIZE_40LD]; +}__attribute__ ((packed)) adp_span_40ld; + +typedef struct { + u32 start_blk; /* starting block */ + u32 num_blks; /* # of blocks */ + adp_device device[MAX_ROW_SIZE_8LD]; +}__attribute__ ((packed)) adp_span_8ld; + +typedef struct { + u8 span_depth; /* Total # of spans */ + u8 level; /* RAID level */ + u8 read_ahead; /* read ahead, no read ahead, adaptive read + ahead */ + u8 stripe_sz; /* Encoded stripe size */ + u8 status; /* Status of the logical drive */ + u8 write_mode; /* write mode, write_through/write_back */ + u8 direct_io; /* direct io or through cache */ + u8 row_size; /* Number of stripes in a row */ +} __attribute__ ((packed)) logdrv_param; + +typedef struct { + logdrv_param lparam; + adp_span_40ld span[MAX_SPAN_DEPTH]; +}__attribute__ ((packed)) logdrv_40ld; + +typedef struct { + logdrv_param lparam; + adp_span_8ld span[MAX_SPAN_DEPTH]; +}__attribute__ ((packed)) logdrv_8ld; + +typedef struct { + u8 type; /* Type of the device */ + u8 cur_status; /* current status of the device */ + u8 tag_depth; /* Level of tagging */ + u8 sync_neg; /* sync negotiation - ENABLE or DISBALE */ + u32 size; /* configurable size in terms of 512 byte + blocks */ +}__attribute__ ((packed)) phys_drv; + +typedef struct { + u8 nlog_drives; /* number of logical drives */ + u8 resvd[3]; + logdrv_40ld ldrv[MAX_LOGICAL_DRIVES_40LD]; + phys_drv pdrv[MAX_PHYSICAL_DRIVES]; +}__attribute__ ((packed)) disk_array_40ld; + +typedef struct { + u8 nlog_drives; /* number of logical drives */ + u8 resvd[3]; + logdrv_8ld ldrv[MAX_LOGICAL_DRIVES_8LD]; + phys_drv pdrv[MAX_PHYSICAL_DRIVES]; +}__attribute__ ((packed)) disk_array_8ld; + +/* + * FW Definitions & Data Structures for 8LD 4-Span and 8-Span Controllers + */ +#define MAX_STRIPES 8 +#define SPAN4_DEPTH 4 +#define SPAN8_DEPTH 8 +#define MAX_PHYDRVS 5 * 16 /* 5 Channels * 16 Targets */ + +typedef struct { + unsigned char channel; + unsigned char target; +}__attribute__ ((packed)) device_t; + +typedef struct { + unsigned long start_blk; + unsigned long total_blks; + device_t device[ MAX_STRIPES ]; +}__attribute__ ((packed)) span_t; + +typedef struct { + unsigned char type; + unsigned char curr_status; + unsigned char tag_depth; + unsigned char resvd1; + unsigned long size; +}__attribute__ ((packed)) phydrv_t; + +typedef struct { + unsigned char span_depth; + unsigned char raid; + unsigned char read_ahead; /* 0=No rdahead,1=RDAHEAD,2=adaptive */ + unsigned char stripe_sz; + unsigned char status; + unsigned char write_policy; /* 0=wrthru,1=wrbak */ + unsigned char direct_io; /* 1=directio,0=cached */ + unsigned char no_stripes; + span_t span[ SPAN4_DEPTH ]; +}__attribute__ ((packed)) ld_span4_t; + +typedef struct { + unsigned char span_depth; + unsigned char raid; + unsigned char read_ahead; /* 0=No rdahead,1=RDAHEAD,2=adaptive */ + unsigned char stripe_sz; + unsigned char status; + unsigned char write_policy; /* 0=wrthru,1=wrbak */ + unsigned char direct_io; /* 1=directio,0=cached */ + unsigned char no_stripes; + span_t span[ SPAN8_DEPTH ]; +}__attribute__ ((packed)) ld_span8_t; + +typedef struct { + unsigned char no_log_drives; + unsigned char pad[3]; + ld_span4_t log_drv[ MAX_LOGICAL_DRIVES_8LD ]; + phydrv_t phys_drv[ MAX_PHYDRVS ]; +}__attribute__ ((packed)) diskarray_span4_t; + +typedef struct { + unsigned char no_log_drives; + unsigned char pad[3]; + ld_span8_t log_drv[ MAX_LOGICAL_DRIVES_8LD ]; + phydrv_t phys_drv[ MAX_PHYDRVS ]; +}__attribute__ ((packed)) diskarray_span8_t; + +/* + * User ioctl structure. + * This structure will be used for Traditional Method ioctl interface + * commands (0x80),Alternate Buffer Method (0x81) ioctl commands and the + * Driver ioctls. + * The Driver ioctl interface handles the commands at the driver level, + * without being sent to the card. + */ +/* system call imposed limit. Change accordingly */ +#define IOCTL_MAX_DATALEN 4096 + +struct uioctl_t { + u32 inlen; + u32 outlen; + union { + u8 fca[16]; + struct { + u8 opcode; + u8 subopcode; + u16 adapno; +#if BITS_PER_LONG == 32 + u8 *buffer; + u8 pad[4]; +#endif +#if BITS_PER_LONG == 64 + u8 *buffer; +#endif + u32 length; + } __attribute__ ((packed)) fcs; + } __attribute__ ((packed)) ui; + u8 mbox[18]; /* 16 bytes + 2 status bytes */ + mega_passthru pthru; +#if BITS_PER_LONG == 32 + char *data; /* buffer <= 4096 for 0x80 commands */ + char pad[4]; +#endif +#if BITS_PER_LONG == 64 + char *data; +#endif +} __attribute__ ((packed)); + +/* + * struct mcontroller is used to pass information about the controllers in the + * system. Its upto the application how to use the information. We are passing + * as much info about the cards as possible and useful. Before issuing the + * call to find information about the cards, the applicaiton needs to issue a + * ioctl first to find out the number of controllers in the system. + */ +#define MAX_CONTROLLERS 32 + +struct mcontroller { + u64 base; + u8 irq; + u8 numldrv; + u8 pcibus; + u16 pcidev; + u8 pcifun; + u16 pciid; + u16 pcivendor; + u8 pcislot; + u32 uid; +}; + +/* + * mailbox structure used for internal commands + */ +typedef struct { + u8 cmd; + u8 cmdid; + u8 opcode; + u8 subopcode; + u32 lba; + u32 xferaddr; + u8 logdrv; + u8 rsvd[3]; + u8 numstatus; + u8 status; +} __attribute__ ((packed)) megacmd_t; + +/* + * Defines for Driver IOCTL interface + */ +#define MEGAIOC_MAGIC 'm' + +#define MEGAIOC_QNADAP 'm' /* Query # of adapters */ +#define MEGAIOC_QDRVRVER 'e' /* Query driver version */ +#define MEGAIOC_QADAPINFO 'g' /* Query adapter information */ +#define MKADAP(adapno) (MEGAIOC_MAGIC << 8 | (adapno) ) +#define GETADAP(mkadap) ( (mkadap) ^ MEGAIOC_MAGIC << 8 ) + +/* + * Definition for the new ioctl interface (NIT) + */ + +/* + * Vendor specific Group-7 commands + */ +#define VENDOR_SPECIFIC_COMMANDS 0xE0 +#define MEGA_INTERNAL_CMD VENDOR_SPECIFIC_COMMANDS + 0x01 + +/* + * The ioctl command. No other command shall be used for this interface + */ +#define USCSICMD VENDOR_SPECIFIC_COMMANDS + +/* + * Data direction flags + */ +#define UIOC_RD 0x00001 +#define UIOC_WR 0x00002 + +/* + * ioctl opcodes + */ +#define MBOX_CMD 0x00000 /* DCMD or passthru command */ +#define GET_DRIVER_VER 0x10000 /* Get driver version */ +#define GET_N_ADAP 0x20000 /* Get number of adapters */ +#define GET_ADAP_INFO 0x30000 /* Get information about a adapter */ +#define GET_CAP 0x40000 /* Get ioctl capabilities */ +#define GET_STATS 0x50000 /* Get statistics, including error info */ + + +/* + * The ioctl structure. + * MBOX macro converts a nitioctl_t structure to megacmd_t pointer and + * MBOX_P macro converts a nitioctl_t pointer to megacmd_t pointer. + */ +typedef struct { + char signature[8]; /* Must contain "MEGANIT" */ + u32 opcode; /* opcode for the command */ + u32 adapno; /* adapter number */ + union { + u8 __raw_mbox[18]; + caddr_t __uaddr; /* xferaddr for non-mbox cmds */ + }__ua; + +#define uioc_rmbox __ua.__raw_mbox +#define MBOX(uioc) ((megacmd_t *)&((uioc).__ua.__raw_mbox[0])) +#define MBOX_P(uioc) ((megacmd_t *)&((uioc)->__ua.__raw_mbox[0])) +#define uioc_uaddr __ua.__uaddr + + u32 xferlen; /* xferlen for DCMD and non-mbox + commands */ + u32 flags; /* data direction flags */ +}nitioctl_t; + + +/* + * I/O statistics for some applications like SNMP agent. The caller must + * provide the number of logical drives for which status should be reported. + */ +typedef struct { + int num_ldrv; /* Number for logical drives for which the + status should be reported. */ + u32 nreads[MAX_LOGICAL_DRIVES_40LD]; /* number of reads for + each logical drive */ + u32 nreadblocks[MAX_LOGICAL_DRIVES_40LD]; /* number of blocks + read for each logical + drive */ + u32 nwrites[MAX_LOGICAL_DRIVES_40LD]; /* number of writes + for each logical + drive */ + u32 nwriteblocks[MAX_LOGICAL_DRIVES_40LD]; /* number of blocks + writes for each + logical drive */ + u32 rd_errors[MAX_LOGICAL_DRIVES_40LD]; /* number of read + errors for each + logical drive */ + u32 wr_errors[MAX_LOGICAL_DRIVES_40LD]; /* number of write + errors for each + logical drive */ +}megastat_t; + + +struct private_bios_data { + u8 geometry:4; /* + * bits 0-3 - BIOS geometry + * 0x0001 - 1GB + * 0x0010 - 2GB + * 0x1000 - 8GB + * Others values are invalid + */ + u8 unused:4; /* bits 4-7 are unused */ + u8 boot_drv; /* + * logical drive set as boot drive + * 0..7 - for 8LD cards + * 0..39 - for 40LD cards + */ + u8 rsvd[12]; + u16 cksum; /* 0-(sum of first 13 bytes of this structure) */ +} __attribute__ ((packed)); + + + + +/* + * Mailbox and firmware commands and subopcodes used in this driver. + */ + +#define MEGA_MBOXCMD_LREAD 0x01 +#define MEGA_MBOXCMD_LWRITE 0x02 +#define MEGA_MBOXCMD_PASSTHRU 0x03 +#define MEGA_MBOXCMD_ADPEXTINQ 0x04 +#define MEGA_MBOXCMD_ADAPTERINQ 0x05 +#define MEGA_MBOXCMD_LREAD64 0xA7 +#define MEGA_MBOXCMD_LWRITE64 0xA8 +#define MEGA_MBOXCMD_PASSTHRU64 0xC3 +#define MEGA_MBOXCMD_EXTPTHRU 0xE3 + +#define MAIN_MISC_OPCODE 0xA4 /* f/w misc opcode */ +#define GET_MAX_SG_SUPPORT 0x01 /* get max sg len supported by f/w */ + +#define FC_NEW_CONFIG 0xA1 +#define NC_SUBOP_PRODUCT_INFO 0x0E +#define NC_SUBOP_ENQUIRY3 0x0F +#define ENQ3_GET_SOLICITED_FULL 0x02 +#define OP_DCMD_READ_CONFIG 0x04 +#define NEW_READ_CONFIG_8LD 0x67 +#define READ_CONFIG_8LD 0x07 +#define FLUSH_ADAPTER 0x0A +#define FLUSH_SYSTEM 0xFE + +/* + * Command for random deletion of logical drives + */ +#define FC_DEL_LOGDRV 0xA4 /* f/w command */ +#define OP_SUP_DEL_LOGDRV 0x2A /* is feature supported */ +#define OP_GET_LDID_MAP 0x18 /* get ldid and logdrv number map */ +#define OP_DEL_LOGDRV 0x1C /* delete logical drive */ + +/* + * BIOS commands + */ +#define IS_BIOS_ENABLED 0x62 +#define GET_BIOS 0x01 +#define CHNL_CLASS 0xA9 +#define GET_CHNL_CLASS 0x00 +#define SET_CHNL_CLASS 0x01 +#define CH_RAID 0x01 +#define CH_SCSI 0x00 +#define BIOS_PVT_DATA 0x40 +#define GET_BIOS_PVT_DATA 0x00 + + +/* + * Commands to support clustering + */ +#define MEGA_GET_TARGET_ID 0x7D +#define MEGA_CLUSTER_OP 0x70 +#define MEGA_GET_CLUSTER_MODE 0x02 +#define MEGA_CLUSTER_CMD 0x6E +#define MEGA_RESERVE_LD 0x01 +#define MEGA_RELEASE_LD 0x02 +#define MEGA_RESET_RESERVATIONS 0x03 +#define MEGA_RESERVATION_STATUS 0x04 +#define MEGA_RESERVE_PD 0x05 +#define MEGA_RELEASE_PD 0x06 + + +/* + * Module battery status + */ +#define MEGA_BATT_MODULE_MISSING 0x01 +#define MEGA_BATT_LOW_VOLTAGE 0x02 +#define MEGA_BATT_TEMP_HIGH 0x04 +#define MEGA_BATT_PACK_MISSING 0x08 +#define MEGA_BATT_CHARGE_MASK 0x30 +#define MEGA_BATT_CHARGE_DONE 0x00 +#define MEGA_BATT_CHARGE_INPROG 0x10 +#define MEGA_BATT_CHARGE_FAIL 0x20 +#define MEGA_BATT_CYCLES_EXCEEDED 0x40 + +/* + * Physical drive states. + */ +#define PDRV_UNCNF 0 +#define PDRV_ONLINE 3 +#define PDRV_FAILED 4 +#define PDRV_RBLD 5 +#define PDRV_HOTSPARE 6 + + +/* + * Raid logical drive states. + */ +#define RDRV_OFFLINE 0 +#define RDRV_DEGRADED 1 +#define RDRV_OPTIMAL 2 +#define RDRV_DELETED 3 + +/* + * Read, write and cache policies + */ +#define NO_READ_AHEAD 0 +#define READ_AHEAD 1 +#define ADAP_READ_AHEAD 2 +#define WRMODE_WRITE_THRU 0 +#define WRMODE_WRITE_BACK 1 +#define CACHED_IO 0 +#define DIRECT_IO 1 + + +/* + * Each controller's soft state + */ +typedef struct { + int this_id; /* our id, may set to different than 7 if + clustering is available */ + u32 flag; + + unsigned long base; + + /* mbox64 with mbox not aligned on 16-byte boundry */ + mbox64_t *una_mbox64; + dma_addr_t una_mbox64_dma; + + volatile mbox64_t *mbox64;/* ptr to 64-bit mailbox */ + volatile mbox_t *mbox; /* ptr to standard mailbox */ + dma_addr_t mbox_dma; + + struct pci_dev *dev; + struct pci_dev *ipdev; /* for internal allocation */ + + struct list_head free_list; + struct list_head pending_list; + + struct Scsi_Host *host; + +#define MEGA_BUFFER_SIZE (2*1024) + u8 *mega_buffer; + dma_addr_t buf_dma_handle; + + mega_product_info product_info; + + u8 max_cmds; + scb_t *scb_list; + + atomic_t pend_cmds; /* maintain a counter for + pending commands in firmware */ + +#if MEGA_HAVE_STATS + u32 nreads[MAX_LOGICAL_DRIVES_40LD]; + u32 nreadblocks[MAX_LOGICAL_DRIVES_40LD]; + u32 nwrites[MAX_LOGICAL_DRIVES_40LD]; + u32 nwriteblocks[MAX_LOGICAL_DRIVES_40LD]; + u32 rd_errors[MAX_LOGICAL_DRIVES_40LD]; + u32 wr_errors[MAX_LOGICAL_DRIVES_40LD]; +#endif + + /* Host adapter parameters */ + u8 numldrv; + u8 fw_version[7]; + u8 bios_version[7]; + +#ifdef CONFIG_PROC_FS + struct proc_dir_entry *controller_proc_dir_entry; + struct proc_dir_entry *proc_read; + struct proc_dir_entry *proc_stat; + struct proc_dir_entry *proc_mbox; + +#if MEGA_HAVE_ENH_PROC + struct proc_dir_entry *proc_rr; + struct proc_dir_entry *proc_battery; +#define MAX_PROC_CHANNELS 4 + struct proc_dir_entry *proc_pdrvstat[MAX_PROC_CHANNELS]; + struct proc_dir_entry *proc_rdrvstat[MAX_PROC_CHANNELS]; +#endif + +#endif + + int has_64bit_addr; /* are we using 64-bit addressing */ + int support_ext_cdb; + int boot_ldrv_enabled; + int boot_ldrv; + int boot_pdrv_enabled; /* boot from physical drive */ + int boot_pdrv_ch; /* boot physical drive channel */ + int boot_pdrv_tgt; /* boot physical drive target */ + + + int support_random_del; /* Do we support random deletion of + logdrvs */ + int read_ldidmap; /* set after logical drive deltion. The + logical drive number must be read from the + map */ + atomic_t quiescent; /* a stage reached when delete logical + drive needs to be done. Stop + sending requests to the hba till + delete operation is completed */ + spinlock_t lock; + spinlock_t *host_lock; // pointer to appropriate lock + + u8 logdrv_chan[MAX_CHANNELS+NVIRT_CHAN]; /* logical drive are on + what channels. */ + int mega_ch_class; + + u8 sglen; /* f/w supported scatter-gather list length */ + + scb_t int_scb; + Scsi_Cmnd int_scmd; + struct semaphore int_mtx; /* To synchronize the internal + commands */ + wait_queue_head_t int_waitq; /* wait queue for internal + cmds */ + + int has_cluster; /* cluster support on this HBA */ +}adapter_t; + + +struct mega_hbas { + int is_bios_enabled; + adapter_t *hostdata_addr; +}; + + +/* + * For state flag. Do not use LSB(8 bits) which are + * reserved for storing info about channels. + */ +#define IN_ABORT 0x80000000L +#define IN_RESET 0x40000000L +#define BOARD_MEMMAP 0x20000000L +#define BOARD_IOMAP 0x10000000L +#define BOARD_40LD 0x08000000L +#define BOARD_64BIT 0x04000000L + +#define INTR_VALID 0x40 + +#define PCI_CONF_AMISIG 0xa0 +#define PCI_CONF_AMISIG64 0xa4 + + +#define MEGA_DMA_TYPE_NONE 0xFFFF +#define MEGA_BULK_DATA 0x0001 +#define MEGA_SGLIST 0x0002 + +/* + * lockscope definitions, callers can specify the lock scope with this data + * type. LOCK_INT would mean the caller has not acquired the lock before + * making the call and LOCK_EXT would mean otherwise. + */ +typedef enum { LOCK_INT, LOCK_EXT } lockscope_t; + +/* + * Parameters for the io-mapped controllers + */ + +/* I/O Port offsets */ +#define CMD_PORT 0x00 +#define ACK_PORT 0x00 +#define TOGGLE_PORT 0x01 +#define INTR_PORT 0x0a + +#define MBOX_BUSY_PORT 0x00 +#define MBOX_PORT0 0x04 +#define MBOX_PORT1 0x05 +#define MBOX_PORT2 0x06 +#define MBOX_PORT3 0x07 +#define ENABLE_MBOX_REGION 0x0B + +/* I/O Port Values */ +#define ISSUE_BYTE 0x10 +#define ACK_BYTE 0x08 +#define ENABLE_INTR_BYTE 0xc0 +#define DISABLE_INTR_BYTE 0x00 +#define VALID_INTR_BYTE 0x40 +#define MBOX_BUSY_BYTE 0x10 +#define ENABLE_MBOX_BYTE 0x00 + + +/* Setup some port macros here */ +#define issue_command(adapter) \ + outb_p(ISSUE_BYTE, (adapter)->base + CMD_PORT) + +#define irq_state(adapter) inb_p((adapter)->base + INTR_PORT) + +#define set_irq_state(adapter, value) \ + outb_p((value), (adapter)->base + INTR_PORT) + +#define irq_ack(adapter) \ + outb_p(ACK_BYTE, (adapter)->base + ACK_PORT) + +#define irq_enable(adapter) \ + outb_p(ENABLE_INTR_BYTE, (adapter)->base + TOGGLE_PORT) + +#define irq_disable(adapter) \ + outb_p(DISABLE_INTR_BYTE, (adapter)->base + TOGGLE_PORT) + + +/* + * This is our SYSDEP area. All kernel specific detail should be placed here - + * as much as possible + */ + +/* + * End of SYSDEP area + */ + +/* + * ASSERT macro for megaraid. This should panic but printk should do for now + */ +#ifdef DEBUG +#define ASSERT( expression ) \ + if( !(expression) ) { \ + panic("assertion failed: %s, file: %s, line: %d\n", \ + #expression, __FILE__, __LINE__); \ + } +#else +#define ASSERT(expression) +#endif + +#define MBOX_ABORT_SLEEP 60 +#define MBOX_RESET_SLEEP 30 + +const char *megaraid_info (struct Scsi_Host *); + +static int megaraid_detect(Scsi_Host_Template *); +static void mega_find_card(Scsi_Host_Template *, u16, u16); +static int mega_query_adapter(adapter_t *); +static inline int issue_scb(adapter_t *, scb_t *); +static int mega_setup_mailbox(adapter_t *); + +static int megaraid_queue (Scsi_Cmnd *, void (*)(Scsi_Cmnd *)); +static scb_t * mega_build_cmd(adapter_t *, Scsi_Cmnd *, int *); +static inline scb_t *mega_allocate_scb(adapter_t *, Scsi_Cmnd *); +static void __mega_runpendq(adapter_t *); +static inline void mega_runpendq(adapter_t *); +static int issue_scb_block(adapter_t *, u_char *); + +static void megaraid_isr_memmapped(int, void *, struct pt_regs *); +static inline void megaraid_memmbox_ack_sequence(adapter_t *); +static void megaraid_isr_iomapped(int, void *, struct pt_regs *); +static inline void megaraid_iombox_ack_sequence(adapter_t *); + +static void mega_free_scb(adapter_t *, scb_t *); + +static int megaraid_release (struct Scsi_Host *); +static int megaraid_command (Scsi_Cmnd *); +static int megaraid_abort(Scsi_Cmnd *); +static int megaraid_reset(Scsi_Cmnd *); +static int megaraid_biosparam (Disk *, kdev_t, int *); + +static int mega_build_sglist (adapter_t *adapter, scb_t *scb, + u32 *buffer, u32 *length); +static inline int mega_busywait_mbox (adapter_t *); +static int __mega_busywait_mbox (adapter_t *); +static inline void mega_cmd_done(adapter_t *, u8 [], int, int); +static inline void mega_free_sgl (adapter_t *adapter); +static void mega_8_to_40ld (mraid_inquiry *inquiry, + mega_inquiry3 *enquiry3, mega_product_info *); + +static int megaraid_reboot_notify (struct notifier_block *, + unsigned long, void *); +static int megadev_open (struct inode *, struct file *); +static int megadev_ioctl (struct inode *, struct file *, unsigned int, + unsigned long); +static int mega_m_to_n(void *, nitioctl_t *); +static int mega_n_to_m(void *, megacmd_t *); +static int megadev_close (struct inode *, struct file *); + +static int mega_init_scb (adapter_t *); + +static int mega_is_bios_enabled (adapter_t *); +static void mega_reorder_hosts (void); +static void mega_swap_hosts (struct Scsi_Host *, struct Scsi_Host *); + +#ifdef CONFIG_PROC_FS +static void mega_create_proc_entry(int, struct proc_dir_entry *); +static int proc_read_config(char *, char **, off_t, int, int *, void *); +static int proc_read_stat(char *, char **, off_t, int, int *, void *); +static int proc_read_mbox(char *, char **, off_t, int, int *, void *); +static int proc_rebuild_rate(char *, char **, off_t, int, int *, void *); +static int proc_battery(char *, char **, off_t, int, int *, void *); +static int proc_pdrv_ch0(char *, char **, off_t, int, int *, void *); +static int proc_pdrv_ch1(char *, char **, off_t, int, int *, void *); +static int proc_pdrv_ch2(char *, char **, off_t, int, int *, void *); +static int proc_pdrv_ch3(char *, char **, off_t, int, int *, void *); +static int proc_pdrv(adapter_t *, char *, int); +static int proc_rdrv_10(char *, char **, off_t, int, int *, void *); +static int proc_rdrv_20(char *, char **, off_t, int, int *, void *); +static int proc_rdrv_30(char *, char **, off_t, int, int *, void *); +static int proc_rdrv_40(char *, char **, off_t, int, int *, void *); +static int proc_rdrv(adapter_t *, char *, int, int); + +static int mega_adapinq(adapter_t *, dma_addr_t); +static int mega_internal_dev_inquiry(adapter_t *, u8, u8, dma_addr_t); +static inline caddr_t mega_allocate_inquiry(dma_addr_t *, struct pci_dev *); +static inline void mega_free_inquiry(caddr_t, dma_addr_t, struct pci_dev *); +static int mega_print_inquiry(char *, char *); +#endif + +static int mega_support_ext_cdb(adapter_t *); +static mega_passthru* mega_prepare_passthru(adapter_t *, scb_t *, + Scsi_Cmnd *, int, int); +static mega_ext_passthru* mega_prepare_extpassthru(adapter_t *, + scb_t *, Scsi_Cmnd *, int, int); +static void mega_enum_raid_scsi(adapter_t *); +static int mega_partsize(Disk *, kdev_t, int *); +static void mega_get_boot_drv(adapter_t *); +static inline int mega_get_ldrv_num(adapter_t *, Scsi_Cmnd *, int); +static int mega_support_random_del(adapter_t *); +static int mega_del_logdrv(adapter_t *, int); +static int mega_do_del_logdrv(adapter_t *, int); +static void mega_get_max_sgl(adapter_t *); +static int mega_internal_command(adapter_t *, lockscope_t, megacmd_t *, + mega_passthru *); +static void mega_internal_done(Scsi_Cmnd *); +static int mega_support_cluster(adapter_t *); +#endif + +/* vi: set ts=8 sw=8 tw=78: */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/nsp32.c linux-2.4.23-pre8/drivers/scsi/nsp32.c --- linux-2.4.22/drivers/scsi/nsp32.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/nsp32.c 2003-10-22 22:49:02.000000000 +0000 @@ -1,8 +1,8 @@ /* * NinjaSCSI-32Bi Cardbus, NinjaSCSI-32UDE PCI/CardBus SCSI driver - * Copyright (C) 2001, 2002 + * Copyright (C) 2001, 2002, 2003 * YOKOTA Hiroshi - * GOTO Masanori + * GOTO Masanori , * * 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 @@ -13,6 +13,14 @@ * 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. + * + * + * Revision History: + * 1.0: Initial Release. + * 1.1: Add /proc SDTR status. + * Remove obsolete error handler nsp32_reset. + * Some clean up. + * 1.2: PowerPC (big endian) support. */ #include @@ -25,10 +33,12 @@ #include #include #include -#include +#include +#include #include #include #include +#include #include #include @@ -39,373 +49,327 @@ #include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) +# include +#endif + #include "nsp32.h" -static int trans_mode = 0; /* default: BIOS */ -static int auto_param = 0; /* default: ON */ -MODULE_PARM(trans_mode, "i"); -MODULE_PARM(auto_param, "i"); -MODULE_PARM_DESC(trans_mode, "transfer mode (0: BIOS 1: Async 2: Ultra20M"); -MODULE_PARM_DESC(auto_param, "AutoParameter mode (0: ON 1: OFF)"); +/*********************************************************************** + * Module parameters + */ +static int trans_mode = 0; /* default: BIOS */ +MODULE_PARM (trans_mode, "i"); +MODULE_PARM_DESC(trans_mode, "transfer mode (0: BIOS(default) 1: Async 2: Ultra20M"); #define ASYNC_MODE 1 #define ULTRA20M_MODE 2 +static int auto_param = 0; /* default: ON */ +MODULE_PARM (auto_param, "i"); +MODULE_PARM_DESC(auto_param, "AutoParameter mode (0: ON(default) 1: OFF)"); + +static int disc_priv = 1; /* default: OFF */ +MODULE_PARM (disc_priv, "i"); +MODULE_PARM_DESC(disc_priv, "disconnection privilege mode (0: ON 1: OFF(default))"); + MODULE_AUTHOR("YOKOTA Hiroshi , GOTO Masanori "); -MODULE_DESCRIPTION("Workbit NinjaSCSI-32Bi/UDE PCI/CardBus SCSI host bus adapter module"); +MODULE_DESCRIPTION("Workbit NinjaSCSI-32Bi/UDE CardBus/PCI SCSI host bus adapter module"); MODULE_LICENSE("GPL"); -static const char *nsp32_release_version = "1.0"; - - -/* - * structure for DMA/Scatter Gather list - */ -#define AUTOPARAM_SIZE (sizeof(int)*0x15) /* 4x15H = 0x60 */ -#define NSP_SG_SIZE SG_ALL -#define NSP32_SG_END_SGT 0x80000000 /* Last SGT marker */ -#define NSP32_SG_CNT_MASK 0x1FFFF - -struct nsp32_sgtable { - unsigned long addr; /* transfer address */ - unsigned long len; /* transfer length. - Bit (24-32) is for SGT_END */ -}; - -struct nsp32_sglun { - struct nsp32_sgtable sgt[NSP_SG_SIZE+1]; /* SG table */ -}; - - -/* - * host data structure - */ -/* message in/out buffer */ -#define MSGOUTBUF_MAX 13 /* 13 is ok ? */ -#define MSGINBUF_MAX 13 - -/* flag for trans_method */ -#define NSP32_TRANSFER_BUSMASTER BIT(0) -#define NSP32_TRANSFER_MMIO BIT(1) /* Not supported yet */ -#define NSP32_TRANSFER_PIO BIT(2) /* Not supported yet */ - - -/* - * SCSI TARGET/LUN definition - */ -#define NSP32_HOST_SCSIID 7 /* SCSI initiator is everytime defined as 7 */ -#define MAX_TARGET 8 -#define MAX_LUN 8 /* XXX: In SPI3, max number of LUN is 64. */ - +static const char *nsp32_release_version = "1.2"; -/* - * structure for synchronous transfer negotiation data - */ -#define SYNC_NOT_YET 0 -#define SYNC_OK 1 -#define SYNC_NG 2 - -struct nsp32_sync_table { - unsigned char period_num; /* period number */ - unsigned char ackwidth; /* ack width designated by period */ - unsigned char start_period; /* search range - start period */ - unsigned char end_period; /* search range - end period */ -}; - -/* - * structure for target device static data +/**************************************************************************** + * Supported hardware */ -/* flag for nsp32_target.sync_flag */ -#define SDTR_INITIATOR BIT(0) /* sending SDTR from initiator */ -#define SDTR_TARGET BIT(1) /* sending SDTR from target */ -#define SDTR_DONE BIT(2) /* exchanging SDTR has been processed */ - -/* syncronous period value for nsp32_target.config_max */ -#define FAST5M 0x32 -#define FAST10M 0x19 -#define ULTRA20M 0x0c - -/* flag for nsp32_target.{sync_offset}, period */ -#define ASYNC_OFFSET 0 /* asynchronous transfer */ -#define SYNC_OFFSET 0xf /* synchronous transfer max offset */ - -/* syncreg: - 07 06 05 04 03 02 01 00 - ---PERIOD-- ---OFFSET-- */ -#define TO_SYNCREG(period, offset) (period << 4 | offset) - -struct nsp32_target { - unsigned char syncreg; /* value for SYNCREG */ - unsigned char ackwidth; /* value for ACKWIDTH */ - unsigned char offset; /* sync offset (0-15) */ - int sync_flag; /* SDTR_*, 0 */ - int limit_entry; /* max speed limit entry designated - by EEPROM configuration */ +static struct pci_device_id nsp32_pci_table[] __devinitdata = { + { + .vendor = PCI_VENDOR_ID_IODATA, + .device = PCI_DEVICE_ID_NINJASCSI_32BI_CBSC_II, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = MODEL_IODATA, + }, + { + .vendor = PCI_VENDOR_ID_WORKBIT, + .device = PCI_DEVICE_ID_NINJASCSI_32BI_KME, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = MODEL_KME, + }, + { + .vendor = PCI_VENDOR_ID_WORKBIT, + .device = PCI_DEVICE_ID_NINJASCSI_32BI_WBT, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = MODEL_WORKBIT, + }, + { + .vendor = PCI_VENDOR_ID_WORKBIT, + .device = PCI_DEVICE_ID_WORKBIT_STANDARD, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = MODEL_PCI_WORKBIT, + }, + { + .vendor = PCI_VENDOR_ID_WORKBIT, + .device = PCI_DEVICE_ID_NINJASCSI_32BI_LOGITEC, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = MODEL_LOGITEC, + }, + { + .vendor = PCI_VENDOR_ID_WORKBIT, + .device = PCI_DEVICE_ID_NINJASCSI_32BIB_LOGITEC, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = MODEL_PCI_LOGITEC, + }, + { + .vendor = PCI_VENDOR_ID_WORKBIT, + .device = PCI_DEVICE_ID_NINJASCSI_32UDE_MELCO, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = MODEL_PCI_MELCO, + }, + { + .vendor = PCI_VENDOR_ID_WORKBIT, + .device = PCI_DEVICE_ID_NINJASCSI_32UDE_MELCO_II, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = MODEL_PCI_MELCO, + }, + {0,0,}, }; +MODULE_DEVICE_TABLE(pci, nsp32_pci_table); -typedef struct _nsp32_hw_data { - int IrqNumber; - int BaseAddress; - int NumAddress; -#define NSP32_MMIO_OFFSET 0x0800 - unsigned long MmioAddress; - unsigned long length; - - Scsi_Cmnd *CurrentSC; - - struct pci_dev *Pci; - const struct pci_device_id *pci_devid; - struct Scsi_Host *Host; - spinlock_t Lock; - - char info_str[100]; - - /* allocated memory region */ - struct nsp32_lunt *lunt_list; /* kmalloc region for lunt */ - struct nsp32_sglun *sg_list; /* sglist virtual address */ - dma_addr_t sgaddr; /* physical address of hw_sg_table */ - unsigned char *autoparam; /* auto parameter transfer region */ - dma_addr_t apaddr; /* physical address of autoparam */ - int cur_entry; /* current sgt entry */ - - /* target/LUN */ - struct nsp32_lunt *curlunt; /* Current connected LUN table */ - struct nsp32_lunt *lunt[MAX_TARGET][MAX_LUN]; /* All LUN table */ - struct nsp32_target *curtarget; /* Current connected SCSI ID */ - struct nsp32_target target[MAX_TARGET]; /* SCSI ID */ - int pid; /* Current connected target ID */ - int plun; /* Current connected target LUN */ - - /* behavior setting parameters */ - int trans_method; /* transfer method flag */ - int resettime; /* Reset time */ - int clock; /* clock dividing flag */ - struct nsp32_sync_table *synct; /* sync_table determined by clock */ - int syncnum; /* the max number of synct element */ - - /* message buffer */ - unsigned char msgoutbuf[MSGOUTBUF_MAX]; /* msgout buffer */ - char msgoutlen; /* msgoutbuf length */ - unsigned char msginbuf[MSGINBUF_MAX]; /* megin buffer */ - char msginlen; /* msginbuf length */ - - -} nsp32_hw_data; static nsp32_hw_data nsp32_data_base; /* probe <-> detect glue */ /* - * TIME definition - */ -#define RESET_HOLD_TIME 10000 /* reset time in us (SCSI-2 says the - minimum is 25us) */ -#define SEL_TIMEOUT_TIME 10000 /* 250ms defined in SCSI specification - (25.6us/1unit) */ -#define ARBIT_TIMEOUT_TIME 100 /* 100us */ -#define REQSACK_TIMEOUT_TIME 10000 /* max wait time for REQ/SACK assertion - or negation, 10000us == 10ms */ - -/* - * structure for connected LUN dynamic data - * - * Note: Currently tagged queuing is disabled, each nsp32_lunt holds - * one SCSI command and one state. - */ -#define DISCPRIV_OK BIT(0) /* DISCPRIV Enable mode */ -#define MSGIN03 BIT(1) /* Auto Msg In 03 Flag */ - -struct nsp32_lunt { - Scsi_Cmnd *SCpnt; /* Current Handling Scsi_Cmnd */ - unsigned long save_datp; /* Save Data Pointer - saved position from initial address */ - int msgin03; /* auto msg in 03 flag */ - unsigned int sg_num; /* Total number of SG entries */ - int cur_entry; /* Current SG entry number */ - struct nsp32_sglun *sglun; /* sg table per lun */ - long sglun_paddr; /* sglun physical address */ -}; - - -/* * Period/AckWidth speed conversion table * * Note: This period/ackwidth speed table must be in descending order. */ -static struct nsp32_sync_table nsp32_sync_table_40M[] = { - /* {PNo, AW, SP, EP} Speed(MB/s) Period AckWidth */ - {0x1, 0, 0x0c, 0x0c}, /* 20.0 : 50ns, 25ns */ - {0x2, 0, 0x0d, 0x18}, /* 13.3 : 75ns, 25ns */ - {0x3, 1, 0x19, 0x19}, /* 10.0 : 100ns, 50ns */ - {0x4, 1, 0x1a, 0x1f}, /* 8.0 : 125ns, 50ns */ - {0x5, 2, 0x20, 0x25}, /* 6.7 : 150ns, 75ns */ - {0x6, 2, 0x26, 0x31}, /* 5.7 : 175ns, 75ns */ - {0x7, 3, 0x32, 0x32}, /* 5.0 : 200ns, 100ns */ - {0x8, 3, 0x33, 0x38}, /* 4.4 : 225ns, 100ns */ - {0x9, 3, 0x39, 0x3e}, /* 4.0 : 250ns, 100ns */ +static nsp32_sync_table nsp32_sync_table_40M[] = { + /* {PNo, AW, SP, EP, SREQ smpl} Speed(MB/s) Period AckWidth */ + {0x1, 0, 0x0c, 0x0c, SMPL_40M}, /* 20.0 : 50ns, 25ns */ + {0x2, 0, 0x0d, 0x18, SMPL_40M}, /* 13.3 : 75ns, 25ns */ + {0x3, 1, 0x19, 0x19, SMPL_40M}, /* 10.0 : 100ns, 50ns */ + {0x4, 1, 0x1a, 0x1f, SMPL_20M}, /* 8.0 : 125ns, 50ns */ + {0x5, 2, 0x20, 0x25, SMPL_20M}, /* 6.7 : 150ns, 75ns */ + {0x6, 2, 0x26, 0x31, SMPL_20M}, /* 5.7 : 175ns, 75ns */ + {0x7, 3, 0x32, 0x32, SMPL_20M}, /* 5.0 : 200ns, 100ns */ + {0x8, 3, 0x33, 0x38, SMPL_10M}, /* 4.4 : 225ns, 100ns */ + {0x9, 3, 0x39, 0x3e, SMPL_10M}, /* 4.0 : 250ns, 100ns */ + {0xa, 3, 0x3f, 0x44, SMPL_10M}, /* 3.64: 275ns, 100ns */ + {0xb, 3, 0x45, 0x4b, SMPL_10M}, /* 3.33: 300ns, 100ns */ + {0xc, 3, 0x4c, 0x53, SMPL_10M}, /* 3.01: 325ns, 100ns */ + {0xd, 3, 0x54, 0x57, SMPL_10M}, /* 2.86: 350ns, 100ns */ + {0xe, 3, 0x58, 0x5d, SMPL_10M}, /* 2.67: 375ns, 100ns */ + {0xf, 3, 0x5e, 0x64, SMPL_10M}, /* 2.5 : 400ns, 100ns */ }; -static const int nsp32_table_40M_num = - sizeof(nsp32_sync_table_40M)/sizeof(struct nsp32_sync_table); -static struct nsp32_sync_table nsp32_sync_table_20M[] = { - {0x1, 0, 0x19, 0x19}, /* 10.0 : 100ns, 50ns */ - {0x2, 0, 0x1a, 0x25}, /* 6.7 : 150ns, 50ns */ - {0x3, 1, 0x26, 0x32}, /* 5.0 : 200ns, 100ns */ - {0x4, 1, 0x33, 0x3e}, /* 4.0 : 250ns, 100ns */ - {0x5, 2, 0x3f, 0x4b}, /* 3.3 : 300ns, 150ns */ - {0x6, 2, 0x4c, 0x57}, /* 2.8 : 350ns, 150ns */ - {0x7, 3, 0x58, 0x64}, /* 2.5 : 400ns, 200ns */ - {0x8, 3, 0x65, 0x70}, /* 2.2 : 450ns, 200ns */ - {0x9, 3, 0x71, 0x7d}, /* 2.0 : 500ns, 200ns */ +static nsp32_sync_table nsp32_sync_table_20M[] = { + {0x1, 0, 0x19, 0x19, SMPL_40M}, /* 10.0 : 100ns, 50ns */ + {0x2, 0, 0x1a, 0x25, SMPL_20M}, /* 6.7 : 150ns, 50ns */ + {0x3, 1, 0x26, 0x32, SMPL_20M}, /* 5.0 : 200ns, 100ns */ + {0x4, 1, 0x33, 0x3e, SMPL_10M}, /* 4.0 : 250ns, 100ns */ + {0x5, 2, 0x3f, 0x4b, SMPL_10M}, /* 3.3 : 300ns, 150ns */ + {0x6, 2, 0x4c, 0x57, SMPL_10M}, /* 2.8 : 350ns, 150ns */ + {0x7, 3, 0x58, 0x64, SMPL_10M}, /* 2.5 : 400ns, 200ns */ + {0x8, 3, 0x65, 0x70, SMPL_10M}, /* 2.2 : 450ns, 200ns */ + {0x9, 3, 0x71, 0x7d, SMPL_10M}, /* 2.0 : 500ns, 200ns */ + {0xa, 3, 0x7e, 0x89, SMPL_10M}, /* 1.82: 550ns, 200ns */ + {0xb, 3, 0x8a, 0x95, SMPL_10M}, /* 1.67: 550ns, 200ns */ + {0xc, 3, 0x96, 0xa2, SMPL_10M}, /* 1.54: 550ns, 200ns */ + {0xd, 3, 0xa3, 0xae, SMPL_10M}, /* 1.43: 550ns, 200ns */ + {0xe, 3, 0xaf, 0xbb, SMPL_10M}, /* 1.33: 550ns, 200ns */ + {0xf, 3, 0xbc, 0xc8, SMPL_10M}, /* 1.25: 550ns, 200ns */ }; -static const int nsp32_table_20M_num = - sizeof(nsp32_sync_table_20M)/sizeof(struct nsp32_sync_table); -static struct nsp32_sync_table nsp32_sync_table_pci[] = { - {0x1, 0, 0x0c, 0x0f}, /* 16.6 : 60ns, 30ns */ - {0x2, 0, 0x10, 0x16}, /* 11.1 : 90ns, 30ns */ - {0x3, 1, 0x17, 0x1e}, /* 8.3 : 120ns, 60ns */ - {0x4, 1, 0x1f, 0x25}, /* 6.7 : 150ns, 60ns */ - {0x5, 2, 0x26, 0x2d}, /* 5.6 : 180ns, 90ns */ - {0x6, 2, 0x2e, 0x34}, /* 4.8 : 210ns, 90ns */ - {0x7, 3, 0x35, 0x3c}, /* 4.2 : 240ns, 120ns */ - {0x8, 3, 0x3d, 0x43}, /* 3.7 : 270ns, 120ns */ - {0x9, 3, 0x44, 0x4b}, /* 3.3 : 300ns, 120ns */ +static nsp32_sync_table nsp32_sync_table_pci[] = { + {0x1, 0, 0x0c, 0x0f, SMPL_40M}, /* 16.6 : 60ns, 30ns */ + {0x2, 0, 0x10, 0x16, SMPL_40M}, /* 11.1 : 90ns, 30ns */ + {0x3, 1, 0x17, 0x1e, SMPL_20M}, /* 8.3 : 120ns, 60ns */ + {0x4, 1, 0x1f, 0x25, SMPL_20M}, /* 6.7 : 150ns, 60ns */ + {0x5, 2, 0x26, 0x2d, SMPL_20M}, /* 5.6 : 180ns, 90ns */ + {0x6, 2, 0x2e, 0x34, SMPL_10M}, /* 4.8 : 210ns, 90ns */ + {0x7, 3, 0x35, 0x3c, SMPL_10M}, /* 4.2 : 240ns, 120ns */ + {0x8, 3, 0x3d, 0x43, SMPL_10M}, /* 3.7 : 270ns, 120ns */ + {0x9, 3, 0x44, 0x4b, SMPL_10M}, /* 3.3 : 300ns, 120ns */ + {0xa, 3, 0x4c, 0x53, SMPL_10M}, /* 3.0 : 330ns, 120ns */ + {0xb, 3, 0x54, 0x59, SMPL_10M}, /* 2.8 : 360ns, 120ns */ + {0xc, 3, 0x5a, 0x60, SMPL_10M}, /* 2.6 : 390ns, 120ns */ + {0xd, 3, 0x61, 0x68, SMPL_10M}, /* 2.4 : 420ns, 120ns */ + {0xe, 3, 0x69, 0x71, SMPL_10M}, /* 2.2 : 450ns, 120ns */ + {0xf, 3, 0x72, 0x77, SMPL_10M}, /* 2.1 : 480ns, 120ns */ }; -static const int nsp32_table_pci_num = - sizeof(nsp32_sync_table_pci)/sizeof(struct nsp32_sync_table); /* * function declaration */ -static int nsp32_detect(Scsi_Host_Template *); -static int nsp32_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -static const char *nsp32_info(struct Scsi_Host *); -static int nsp32_eh_abort(Scsi_Cmnd *); -static int nsp32_eh_bus_reset(Scsi_Cmnd *); -static int nsp32_eh_host_reset(Scsi_Cmnd *); -static int nsp32_reset(Scsi_Cmnd *, unsigned int); -static int nsp32_release(struct Scsi_Host *); -static int nsp32_proc_info(char *, char **, off_t, int, int, int); -static int __devinit nsp32_probe(struct pci_dev *, const struct pci_device_id *); +/* module entry point */ +static int __devinit nsp32_probe (struct pci_dev *, const struct pci_device_id *); static void __devexit nsp32_remove(struct pci_dev *); -static int __init init_nsp32(void); -static void __exit exit_nsp32(void); +static int __init init_nsp32 (void); +static void __exit exit_nsp32 (void); + +/* struct Scsi_Host_Template */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) +static int nsp32_proc_info (struct Scsi_Host *, char *, char **, off_t, int, int); +#else +static int nsp32_proc_info (char *, char **, off_t, int, int, int); +#endif -static void nsp32_message(char *, int, char *, char *, ...); -static void nsp32_dmessage(char *, int, int, char *, ...); -static void nsp32_build_identify(nsp32_hw_data *, Scsi_Cmnd *); -static void nsp32_build_sdtr(nsp32_hw_data *, unsigned char, unsigned char); -static void nsp32_build_nop(nsp32_hw_data *); -static void nsp32_build_reject(nsp32_hw_data *); -static int nsp32hw_start_selection(Scsi_Cmnd *, nsp32_hw_data *); -static int nsp32_selection_autoscsi(Scsi_Cmnd *, nsp32_hw_data *); -static int nsp32_reselection(nsp32_hw_data *, unsigned char); -static int nsp32hw_setup_sg_table(Scsi_Cmnd *, nsp32_hw_data *); -static int nsp32hw_init(struct Scsi_Host *); -static void nsp32_scsi_done(nsp32_hw_data *, Scsi_Cmnd *); -static int nsp32_busfree_occur(nsp32_hw_data *, unsigned short); -static void nsp32_adjust_busfree(nsp32_hw_data *, unsigned int); -static void nsp32_msgout_occur(nsp32_hw_data *); -static void nsp32_restart_autoscsi(nsp32_hw_data *, unsigned short); -static void nsp32_msgin_occur(nsp32_hw_data *, unsigned long, unsigned short); -static void nsp32_analyze_sdtr(nsp32_hw_data *); -static int nsp32_search_period_entry(nsp32_hw_data *,struct nsp32_target *, unsigned char); -static void nsp32_set_async(nsp32_hw_data *, struct nsp32_target *); -static void nsp32_set_max_sync(nsp32_hw_data *, struct nsp32_target *, unsigned char *, unsigned char *); -static void nsp32_set_sync_entry(nsp32_hw_data *, struct nsp32_target *, int, unsigned char); -static void nsp32_wait_req(nsp32_hw_data *, int); -static void nsp32_wait_sack(nsp32_hw_data *, int); -static void nsp32_sack_assert(nsp32_hw_data *); -static void nsp32_sack_negate(nsp32_hw_data *); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) +static int nsp32_detect (struct pci_dev *pdev); +#else +static int nsp32_detect (Scsi_Host_Template *); +#endif +static int nsp32_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); +static const char *nsp32_info (struct Scsi_Host *); +static int nsp32_release (struct Scsi_Host *); + +/* SCSI error handler */ +static int nsp32_eh_abort (Scsi_Cmnd *); +static int nsp32_eh_bus_reset (Scsi_Cmnd *); +static int nsp32_eh_host_reset(Scsi_Cmnd *); + +/* generate SCSI message */ +static void nsp32_build_identify(Scsi_Cmnd *); +static void nsp32_build_nop (Scsi_Cmnd *); +static void nsp32_build_reject (Scsi_Cmnd *); +static void nsp32_build_sdtr (Scsi_Cmnd *, unsigned char, unsigned char); + +/* SCSI message handler */ +static int nsp32_busfree_occur(Scsi_Cmnd *, unsigned short); +static void nsp32_msgout_occur (Scsi_Cmnd *); +static void nsp32_msgin_occur (Scsi_Cmnd *, unsigned long, unsigned short); + +static int nsp32_setup_sg_table (Scsi_Cmnd *); +static unsigned long nsp32_msgout_register (Scsi_Cmnd *); +static int nsp32_selection_autopara(Scsi_Cmnd *); +static int nsp32_selection_autoscsi(Scsi_Cmnd *); +static void nsp32_scsi_done (Scsi_Cmnd *); +static int nsp32_arbitration (Scsi_Cmnd *, unsigned int); +static int nsp32_reselection (Scsi_Cmnd *, unsigned char); +static void nsp32_adjust_busfree (Scsi_Cmnd *, unsigned int); +static void nsp32_restart_autoscsi (Scsi_Cmnd *, unsigned short); + +/* SCSI SDTR */ +static void nsp32_analyze_sdtr (Scsi_Cmnd *); +static int nsp32_search_period_entry(nsp32_hw_data *, nsp32_target *, unsigned char); +static void nsp32_set_async (nsp32_hw_data *, nsp32_target *); +static void nsp32_set_max_sync (nsp32_hw_data *, nsp32_target *, unsigned char *, unsigned char *); +static void nsp32_set_sync_entry (nsp32_hw_data *, nsp32_target *, int, unsigned char); + +/* SCSI bus status handler */ +static void nsp32_wait_req (nsp32_hw_data *, int); +static void nsp32_wait_sack (nsp32_hw_data *, int); +static void nsp32_sack_assert (nsp32_hw_data *); +static void nsp32_sack_negate (nsp32_hw_data *); static void nsp32_do_bus_reset(nsp32_hw_data *); -static void do_nsp32_isr(int, void *, struct pt_regs *); -static int nsp32_getprom_param(nsp32_hw_data *); -static int nsp32_getprom_new(nsp32_hw_data *); -static int nsp32_getprom_standard(nsp32_hw_data *); -static int nsp32_prom_read(nsp32_hw_data *, int); -static void nsp32_prom_start(nsp32_hw_data *); -static void nsp32_prom_stop(nsp32_hw_data *); -static void nsp32_prom_write(nsp32_hw_data *, int); -static int nsp32_prom_fetch(nsp32_hw_data *); -static inline void nsp32_prom_set(nsp32_hw_data *, int, int); -static inline int nsp32_prom_get(nsp32_hw_data *, int); +/* hardware interrupt handler */ +static irqreturn_t do_nsp32_isr(int, void *, struct pt_regs *); + +/* initialize hardware */ +static int nsp32hw_init(nsp32_hw_data *); + +/* EEPROM handler */ +static int nsp32_getprom_param (nsp32_hw_data *); +static int nsp32_getprom_at24 (nsp32_hw_data *); +static int nsp32_getprom_c16 (nsp32_hw_data *); +static void nsp32_prom_start (nsp32_hw_data *); +static void nsp32_prom_stop (nsp32_hw_data *); +static int nsp32_prom_read (nsp32_hw_data *, int); +static int nsp32_prom_read_bit (nsp32_hw_data *); +static void nsp32_prom_write_bit(nsp32_hw_data *, int); +static inline void nsp32_prom_set (nsp32_hw_data *, int, int); +static inline int nsp32_prom_get (nsp32_hw_data *, int); +/* debug/warning/info message */ +static void nsp32_message (const char *, int, char *, char *, ...); +#ifdef NSP32_DEBUG +static void nsp32_dmessage(const char *, int, int, char *, ...); +#endif /* * max_sectors is currently limited up to 128. */ -static Scsi_Host_Template driver_template = { - .proc_name = "nsp32", - .name = "Workbit NinjaSCSI-32Bi/UDE", - .proc_info = nsp32_proc_info, - .detect = nsp32_detect, - .info = nsp32_info, - .queuecommand = nsp32_queuecommand, - .can_queue = 1, - .sg_tablesize = NSP_SG_SIZE, - .max_sectors = 128, - .cmd_per_lun = 1, - .this_id = 7, - .use_clustering = DISABLE_CLUSTERING, - .eh_abort_handler = nsp32_eh_abort, - .eh_device_reset_handler = NULL, - .eh_bus_reset_handler = nsp32_eh_bus_reset, - .eh_host_reset_handler = nsp32_eh_host_reset, - .reset = nsp32_reset, - .release = nsp32_release, -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2)) - .use_new_eh_code = 1, +static Scsi_Host_Template nsp32_template = { + .proc_name = "nsp32", + .name = "Workbit NinjaSCSI-32Bi/UDE", + .proc_info = nsp32_proc_info, + .info = nsp32_info, + .queuecommand = nsp32_queuecommand, + .can_queue = 1, + .sg_tablesize = NSP32_SG_SIZE, + .max_sectors = 128, + .cmd_per_lun = 1, + .this_id = NSP32_HOST_SCSIID, + .use_clustering = DISABLE_CLUSTERING, + .eh_abort_handler = nsp32_eh_abort, +/* .eh_device_reset_handler = NULL, */ + .eh_bus_reset_handler = nsp32_eh_bus_reset, + .eh_host_reset_handler = nsp32_eh_host_reset, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74)) + .detect = nsp32_detect, + .release = nsp32_release, + .use_new_eh_code = 1, #else - /* .highmem_io = 1, */ +/* .highmem_io = 1, */ #endif }; #include "nsp32_io.h" -/* +/*********************************************************************** * debug, error print */ -#define nsp32_msg(type, args...) \ - nsp32_message(__FUNCTION__, __LINE__, (type), ## args) -#define nsp32_dbg(mask, args...) \ - nsp32_dmessage(__FUNCTION__, __LINE__, (mask), ## args) - #ifndef NSP32_DEBUG -# define NSP32_DEBUG_MASK 0x000000 +# define NSP32_DEBUG_MASK 0x000000 +# define nsp32_msg(type, args...) nsp32_message ("", 0, (type), args) +# define nsp32_dbg(mask, args...) /* */ #else -# define NSP32_DEBUG_MASK 0xffffff +# define NSP32_DEBUG_MASK 0xffffff +# define nsp32_msg(type, args...) \ + nsp32_message (__FUNCTION__, __LINE__, (type), args) +# define nsp32_dbg(mask, args...) \ + nsp32_dmessage(__FUNCTION__, __LINE__, (mask), args) #endif -#define NSP32_DEBUG_QUEUECOMMAND 0x000001 -#define NSP32_DEBUG_REGISTER 0x000002 -#define NSP32_DEBUG_AUTOSCSI 0x000004 -#define NSP32_DEBUG_INTR 0x000008 -#define NSP32_DEBUG_SGLIST 0x000010 -#define NSP32_DEBUG_BUSFREE 0x000020 -#define NSP32_DEBUG_CDB_CONTENTS 0x000040 -#define NSP32_DEBUG_RESELECTION 0x000080 -#define NSP32_DEBUG_MSGINOCCUR 0x000100 -#define NSP32_DEBUG_EEPROM 0x000200 -#define NSP32_DEBUG_MSGOUTOCCUR 0x000400 -#define NSP32_DEBUG_BUSRESET 0x000800 -#define NSP32_DEBUG_RESTART 0x001000 -#define NSP32_DEBUG_SYNC 0x002000 -#define NSP32_DEBUG_WAIT 0x004000 -#define NSP32_DEBUG_TARGETFLAG 0x008000 -#define NSP32_DEBUG_PROC 0x010000 -#define NSP32_DEBUG_INIT 0x020000 -#define NSP32_SPECIAL_PRINT_REGISTER 0x100000 +#define NSP32_DEBUG_QUEUECOMMAND BIT(0) +#define NSP32_DEBUG_REGISTER BIT(1) +#define NSP32_DEBUG_AUTOSCSI BIT(2) +#define NSP32_DEBUG_INTR BIT(3) +#define NSP32_DEBUG_SGLIST BIT(4) +#define NSP32_DEBUG_BUSFREE BIT(5) +#define NSP32_DEBUG_CDB_CONTENTS BIT(6) +#define NSP32_DEBUG_RESELECTION BIT(7) +#define NSP32_DEBUG_MSGINOCCUR BIT(8) +#define NSP32_DEBUG_EEPROM BIT(9) +#define NSP32_DEBUG_MSGOUTOCCUR BIT(10) +#define NSP32_DEBUG_BUSRESET BIT(11) +#define NSP32_DEBUG_RESTART BIT(12) +#define NSP32_DEBUG_SYNC BIT(13) +#define NSP32_DEBUG_WAIT BIT(14) +#define NSP32_DEBUG_TARGETFLAG BIT(15) +#define NSP32_DEBUG_PROC BIT(16) +#define NSP32_DEBUG_INIT BIT(17) +#define NSP32_SPECIAL_PRINT_REGISTER BIT(20) #define NSP32_DEBUG_BUF_LEN 100 -static void nsp32_message(char *func, int line, char *type, char *fmt, ...) +static void nsp32_message(const char *func, int line, char *type, char *fmt, ...) { va_list args; char buf[NSP32_DEBUG_BUF_LEN]; va_start(args, fmt); - vsprintf(buf, fmt, args); + vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); #ifndef NSP32_DEBUG @@ -415,19 +379,21 @@ #endif } -static void nsp32_dmessage(char *func, int line, int mask, char *fmt, ...) +#ifdef NSP32_DEBUG +static void nsp32_dmessage(const char *func, int line, int mask, char *fmt, ...) { va_list args; char buf[NSP32_DEBUG_BUF_LEN]; va_start(args, fmt); - vsprintf(buf, fmt, args); + vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); if (mask & NSP32_DEBUG_MASK) { - printk("Ninja: %d %s (%d): %s\n", mask, func, line, buf); + printk("nsp32-debug: 0x%x %s (%d): %s\n", mask, func, line, buf); } } +#endif #ifdef NSP32_DEBUG # include "nsp32_debug.c" @@ -437,56 +403,51 @@ # define show_autophase(arg) /* */ #endif -#ifdef NSP32_DEBUG -static int pc_debug = NSP32_DEBUG; -MODULE_PARM(pc_debug, "i"); -#define DEBUG(n, args...) if (pc_debug>(n)) printk(/*KERN_DEBUG*/ args) -#else -#define DEBUG(n, args...) -#endif - - /* * IDENTIFY Message */ -static void nsp32_build_identify(nsp32_hw_data *data, Scsi_Cmnd *SCpnt) +static void nsp32_build_identify(Scsi_Cmnd *SCpnt) { - int pos = data->msgoutlen; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + int pos = data->msgout_len; + int mode = FALSE; - data->msgoutbuf[pos++] = - 0x80 | /* Identify */ -#if 0 - /* XXX: Auto DiscPriv detection is progressing... */ - 0x40 | /* DiscPriv */ -#endif - SCpnt->lun; /* LUNTRN */ + /* XXX: Auto DiscPriv detection is progressing... */ + if (disc_priv == 0) { + /* mode = TRUE; */ + } - data->msgoutlen = pos; + data->msgoutbuf[pos] = IDENTIFY(mode, SCpnt->device->lun); pos++; + + data->msgout_len = pos; } /* * SDTR Message Routine */ -static void nsp32_build_sdtr(nsp32_hw_data *data, - unsigned char period, unsigned char offset) -{ - int pos = data->msgoutlen; +static void nsp32_build_sdtr(Scsi_Cmnd *SCpnt, + unsigned char period, + unsigned char offset) +{ + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + int pos = data->msgout_len; + + data->msgoutbuf[pos] = EXTENDED_MESSAGE; pos++; + data->msgoutbuf[pos] = EXTENDED_SDTR_LEN; pos++; + data->msgoutbuf[pos] = EXTENDED_SDTR; pos++; + data->msgoutbuf[pos] = period; pos++; + data->msgoutbuf[pos] = offset; pos++; - data->msgoutbuf[pos++] = EXTENDED_MESSAGE; - data->msgoutbuf[pos++] = EXTENDED_SDTR_LEN; - data->msgoutbuf[pos++] = EXTENDED_SDTR; - data->msgoutbuf[pos++] = period; - data->msgoutbuf[pos++] = offset; - - data->msgoutlen = pos; + data->msgout_len = pos; } /* * No Operation Message */ -static void nsp32_build_nop(nsp32_hw_data *data) +static void nsp32_build_nop(Scsi_Cmnd *SCpnt) { - int pos = data->msgoutlen; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + int pos = data->msgout_len; if (pos != 0) { nsp32_msg(KERN_WARNING, @@ -494,54 +455,97 @@ return; } - data->msgoutbuf[pos++] = NOP; - data->msgoutlen = pos; + data->msgoutbuf[pos] = NOP; pos++; + data->msgout_len = pos; } /* * Reject Message */ -static void nsp32_build_reject(nsp32_hw_data *data) +static void nsp32_build_reject(Scsi_Cmnd *SCpnt) { - int pos = data->msgoutlen; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + int pos = data->msgout_len; - data->msgoutbuf[pos++] = MESSAGE_REJECT; - data->msgoutlen = pos; + data->msgoutbuf[pos] = MESSAGE_REJECT; pos++; + data->msgout_len = pos; } /* - * timer + * Start hardware timer */ #if 0 static void nsp32_start_timer(Scsi_Cmnd *SCpnt, int time) { unsigned int base = SCpnt->host->io_port; - DEBUG(0, __func__ " time=%d\n", time); + nsp32_dbg(NSP32_DEBUG_INTR, "timer=%d", time); if (time & (~TIMER_CNT_MASK)) { - printk("timer set overflow\n"); + nsp32_dbg(NSP32_DEBUG_INTR, "timer set overflow"); } nsp32_write2(base, TIMER_SET, time & TIMER_CNT_MASK); } #endif +/* + * Generate msgout register value based on the number of messages. + */ +static unsigned long nsp32_msgout_register(Scsi_Cmnd *SCpnt) +{ + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned long msgout; + int i; + + /* + * message out + * + * Note: If the range of msgout_len is 1 - 3, fill scsi_msgout. + * over 3 messages needs another routine. + */ + if (data->msgout_len > 0 && data->msgout_len <= 3) { + msgout = 0; + for (i = 0; i < data->msgout_len; i++) { + /* + * msgout register layout: + * bit: 31-24 23-16 15-08 07 06-02 01-00 + * MSG#2 MSG#1 MSG#0 MV len + * + * the sending order of the message is: + * len = 3: MSG#0 -> MSG#1 -> MSG#2 + * len = 2: MSG#1 -> MSG#2 + * len = 1: MSG#2 + */ + msgout >>= 8; + msgout |= ((unsigned int)(data->msgoutbuf[i]) << 24); + } + msgout |= MSGOUT_VALID; /* Message out Valid */ + msgout |= data->msgout_len; /* len */ + } else { + /* data->msgout_len > 3 || data->msgout_len <= 0*/ + msgout = 0; + } + + return msgout; +} /* * set SCSI command and other parameter to asic, and start selection phase */ -static int nsp32hw_start_selection(Scsi_Cmnd *SCpnt, nsp32_hw_data *data) +static int nsp32_selection_autopara(Scsi_Cmnd *SCpnt) { - unsigned int host_id = SCpnt->host->this_id; - unsigned int base = SCpnt->host->io_port; - unsigned char target = SCpnt->target; - unsigned char *param = data->autoparam; - unsigned char phase, arbit; - int i, time; - unsigned int msgout; - unsigned long l; - unsigned short s; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = SCpnt->device->host->io_port; + unsigned int host_id = SCpnt->device->host->this_id; + unsigned char target = SCpnt->device->id; + nsp32_autoparam *param = data->autoparam; + unsigned char phase; + int i, ret; + unsigned long msgout_reg; + unsigned short transfer_reg; + + nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "in"); /* * check bus free @@ -556,155 +560,106 @@ /* * message out - * - * Note: If the range of msgoutlen is 1 - 3, fill scsi_msgout. - * over 3 messages needs another routine. */ - if (data->msgoutlen == 0) { + if (data->msgout_len == 0) { nsp32_msg(KERN_ERR, "SCSI MsgOut without any message!"); SCpnt->result = DID_ERROR << 16; return FALSE; - } else if (data->msgoutlen > 0 && data->msgoutlen <= 3) { - msgout = 0; - for (i=0; imsgoutlen; i++) { - /* - * the sending order of the message is: - * MCNT 3: MSG#0 -> MSG#1 -> MSG#2 - * MCNT 2: MSG#1 -> MSG#2 - * MCNT 1: MSG#2 - */ - msgout >>= 8; - msgout |= (unsigned int)(data->msgoutbuf[i] << 24); - } - msgout |= MV_VALID; /* MV valid */ - msgout |= (unsigned int)data->msgoutlen; /* len */ } else { - /* data->msgoutlen > 3 */ - msgout = 0; + msgout_reg = nsp32_msgout_register(SCpnt); } + // nsp_dbg(NSP32_DEBUG_AUTOSCSI, "sel time out=0x%x\n", nsp32_read2(base, SEL_TIME_OUT)); + // nsp32_write2(base, SEL_TIME_OUT, SEL_TIMEOUT_TIME); + /* * setup asic parameter */ - memset(param, 0, AUTOPARAM_SIZE); + memset(param, 0, sizeof(nsp32_autoparam)); /* cdb */ - for (i=0; icmd_len; i++) { - param[4*i] = SCpnt->cmnd[i]; + for (i = 0; i < SCpnt->cmd_len; i++) { + param->cdb[4 * i] = SCpnt->cmnd[i]; } - /* message out */ - param[4*0x10 +0] = (msgout & 0x000000ff) >> 0; - param[4*0x10 +1] = (msgout & 0x0000ff00) >> 8; - param[4*0x10 +2] = (msgout & 0x00ff0000) >> 16; - param[4*0x10 +3] = (msgout & 0xff000000) >> 24; - - /* syncreg, ackwidth, target id, sampleing rate */ - param[4*0x11 +0] = data->curtarget->syncreg; - param[4*0x11 +1] = data->curtarget->ackwidth; - param[4*0x11 +2] = BIT(host_id) | BIT(target); - param[4*0x11 +3] = 0; + /* outgoing messages */ + param->msgout = cpu_to_le32(msgout_reg); + + /* syncreg, ackwidth, target id, SREQ sampling rate */ + param->syncreg = data->cur_target->syncreg; + param->ackwidth = data->cur_target->ackwidth; + param->target_id = BIT(host_id) | BIT(target); + param->sample_reg = data->cur_target->sample_reg; + + // nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "sample rate=0x%x\n", data->cur_target->sample_reg); /* command control */ - s = (CLEAR_CDB_FIFO_POINTER | AUTOSCSI_START | - AUTO_MSGIN_00_OR_04 | AUTO_MSGIN_02 | AUTO_ATN); - param[4*0x12 +0] = (s & 0x00ff) >> 0; - param[4*0x12 +1] = (s & 0xff00) >> 8; + param->command_control = cpu_to_le16(CLEAR_CDB_FIFO_POINTER | + AUTOSCSI_START | + AUTO_MSGIN_00_OR_04 | + AUTO_MSGIN_02 | + AUTO_ATN ); + /* transfer control */ - s = 0; + transfer_reg = 0; switch (data->trans_method) { case NSP32_TRANSFER_BUSMASTER: - s |= BM_START; + transfer_reg |= BM_START; break; case NSP32_TRANSFER_MMIO: - s |= CB_MMIO_MODE; + transfer_reg |= CB_MMIO_MODE; break; case NSP32_TRANSFER_PIO: - s |= CB_IO_MODE; + transfer_reg |= CB_IO_MODE; break; default: nsp32_msg(KERN_ERR, "unknown trans_method"); + break; } /* - * ORed BLIEND_MODE, FIFO intr is decreased, instead of PCI bus waits. + * OR-ed BLIEND_MODE, FIFO intr is decreased, instead of PCI bus waits. * For bus master transfer, it's taken off. */ - s |= (TRANSFER_GO | ALL_COUNTER_CLR); - param[4*0x12 +2] = (s & 0x00ff) >> 0; - param[4*0x12 +3] = (s & 0xff00) >> 8; + transfer_reg |= (TRANSFER_GO | ALL_COUNTER_CLR); + param->transfer_control = cpu_to_le16(transfer_reg); /* sg table addr */ - l = data->curlunt->sglun_paddr; - param[4*0x13 +0] = (l & 0x000000ff) >> 0; - param[4*0x13 +1] = (l & 0x0000ff00) >> 8; - param[4*0x13 +2] = (l & 0x00ff0000) >> 16; - param[4*0x13 +3] = (l & 0xff000000) >> 24; + param->sgt_pointer = cpu_to_le32(data->cur_lunt->sglun_paddr); /* - * transfer parameter to asic + * transfer parameter to ASIC */ - nsp32_write4(base, SGT_ADR, virt_to_bus(param)); + nsp32_write4(base, SGT_ADR, data->auto_paddr); nsp32_write2(base, COMMAND_CONTROL, CLEAR_CDB_FIFO_POINTER | AUTO_PARAMETER ); /* - * Arbitration Status Check - * - * Note: Arbitration counter is wait during ARBIT_GO is not lifting. - * Using udelay(1) consumes CPU time and system time, but - * arbitration delay time is defined minimal 2.4us in SCSI - * specification, thus udelay works as coarse grained wait timer. - */ - time = 0; - do { - arbit = nsp32_read1(base, ARBIT_STATUS); - nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "arbit=0x%x", arbit); - } while ((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 && - (time++ <= 1000)); - - nsp32_dbg(NSP32_DEBUG_AUTOSCSI, - "arbit: 0x%x, delay time: %d", arbit, time); - - if (arbit & ARBIT_WIN) { - SCpnt->result = DID_OK << 16; - /* PCI LED on! */ - nsp32_index_write1(base, EXT_PORT, LED_ON); - } else if (arbit & ARBIT_FAIL) { - SCpnt->result = DID_BUS_BUSY << 16; - nsp32_write1(base, SET_ARBIT, ARBIT_CLEAR); - return FALSE; - } else { - /* unknown error or ARBIT_GO timeout */ - nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "arbit fail"); - SCpnt->result = DID_NO_CONNECT << 16; - nsp32_write1(base, SET_ARBIT, ARBIT_CLEAR); - return FALSE; - } - - /* - * clear Arbit + * Check arbitration */ - nsp32_write1(base, SET_ARBIT, ARBIT_CLEAR); + ret = nsp32_arbitration(SCpnt, base); - return TRUE; + return ret; } /* * Selection with AUTO SCSI (without AUTO PARAMETER) */ -static int nsp32_selection_autoscsi(Scsi_Cmnd *SCpnt, nsp32_hw_data *data) +static int nsp32_selection_autoscsi(Scsi_Cmnd *SCpnt) { + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = SCpnt->device->host->io_port; + unsigned int host_id = SCpnt->device->host->this_id; + unsigned char target = SCpnt->device->id; unsigned char phase; - unsigned char arbit; int status; - int i; unsigned short command = 0; - int time = 0; - unsigned int msgout = 0; + unsigned long msgout = 0; unsigned short execph; - unsigned int base = data->BaseAddress; + int i; + + nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "in"); /* * IRQ disable @@ -715,8 +670,7 @@ * check bus line */ phase = nsp32_read1(base, SCSI_BUS_MONITOR); - if(((phase & BUSMON_BSY) == 1) || - (phase & BUSMON_SEL) == 1) { + if(((phase & BUSMON_BSY) == 1) || (phase & BUSMON_SEL) == 1) { nsp32_msg(KERN_WARNING, "bus busy"); SCpnt->result = DID_BUS_BUSY << 16; status = 1; @@ -736,95 +690,75 @@ /* * set CDB0 - CDB15 */ - for (i=0; icmd_len; i++) { + for (i = 0; i < SCpnt->cmd_len; i++) { nsp32_write1(base, COMMAND_DATA, SCpnt->cmnd[i]); } - nsp32_dbg(NSP32_DEBUG_CDB_CONTENTS, "CDB[0]=[0x%x]", SCpnt->cmnd[i]); + nsp32_dbg(NSP32_DEBUG_CDB_CONTENTS, "CDB[0]=[0x%x]", SCpnt->cmnd[0]); /* - * set SCSIOUT LATCH(initiator)/TARGET(target) (ORed) ID + * set SCSIOUT LATCH(initiator)/TARGET(target) (OR-ed) ID */ - nsp32_write1(base, SCSI_OUT_LATCH_TARGET_ID, - ((1 << NSP32_HOST_SCSIID) | (1 << SCpnt->target))); + nsp32_write1(base, SCSI_OUT_LATCH_TARGET_ID, BIT(host_id) | BIT(target)); /* * set SCSI MSGOUT REG - * - * Note: If the range of msgoutlen is 1 - 3, fill scsi_msgout. - * over 3 messages needs another routine. */ - if (data->msgoutlen == 0) { - nsp32_msg(KERN_ERR, - "SCSI MsgOut without any message!"); + if (data->msgout_len == 0) { + nsp32_msg(KERN_ERR, "SCSI MsgOut without any message!"); SCpnt->result = DID_ERROR << 16; status = 1; goto out; - } else if (data->msgoutlen > 0 && data->msgoutlen <= 3) { - msgout = 0; - for (i=0; imsgoutlen; i++) { - /* - * the sending order of the message is: - * MCNT 3: MSG#0 -> MSG#1 -> MSG#2 - * MCNT 2: MSG#1 -> MSG#2 - * MCNT 1: MSG#2 - */ - msgout >>= 8; - msgout |= (unsigned int)(data->msgoutbuf[i] << 24); - } - msgout |= MV_VALID; /* MV valid */ - msgout |= (unsigned int)data->msgoutlen; /* len */ - nsp32_write4(base, SCSI_MSG_OUT, msgout); } else { - /* data->msgoutlen > 3 */ - nsp32_write4(base, SCSI_MSG_OUT, 0); + msgout = nsp32_msgout_register(SCpnt); + nsp32_write4(base, SCSI_MSG_OUT, msgout); } /* * set selection timeout(= 250ms) */ - nsp32_write2(base, SEL_TIME_OUT, SEL_TIMEOUT_TIME); + nsp32_write2(base, SEL_TIME_OUT, SEL_TIMEOUT_TIME); /* - * set smpl rate + * set SREQ hazard killer sampling rate * - * TODO: smpl_rate (BASE+0F) is 0 when internal clock = 40MHz. + * TODO: sample_rate (BASE+0F) is 0 when internal clock = 40MHz. * check other internal clock! */ - nsp32_write1(base, SREQ_SMPL_RATE, 0); + nsp32_write1(base, SREQ_SMPL_RATE, data->cur_target->sample_reg); /* * clear Arbit */ - nsp32_write1(base, SET_ARBIT, ARBIT_CLEAR); + nsp32_write1(base, SET_ARBIT, ARBIT_CLEAR); /* * set SYNCREG * Don't set BM_START_ADR before setting this register. */ - nsp32_write1(base, SYNC_REG, data->curtarget->syncreg); + nsp32_write1(base, SYNC_REG, data->cur_target->syncreg); /* * set ACKWIDTH */ - nsp32_write1(base, ACK_WIDTH, data->curtarget->ackwidth); + nsp32_write1(base, ACK_WIDTH, data->cur_target->ackwidth); nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "syncreg=0x%x, ackwidth=0x%x, sgtpaddr=0x%x, id=0x%x", nsp32_read1(base, SYNC_REG), nsp32_read1(base, ACK_WIDTH), nsp32_read4(base, SGT_ADR), nsp32_read1(base, SCSI_OUT_LATCH_TARGET_ID)); - nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "msgoutlen=%d, msgout=0x%x", - data->msgoutlen, msgout); + nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "msgout_len=%d, msgout=0x%x", + data->msgout_len, msgout); /* * set SGT ADDR (physical address) */ - nsp32_write4(base, SGT_ADR, data->curlunt->sglun_paddr); + nsp32_write4(base, SGT_ADR, data->cur_lunt->sglun_paddr); /* * set TRANSFER CONTROL REG */ command = 0; - command |= ( TRANSFER_GO | ALL_COUNTER_CLR); + command |= (TRANSFER_GO | ALL_COUNTER_CLR); if (data->trans_method & NSP32_TRANSFER_BUSMASTER) { if (SCpnt->request_bufflen > 0) { command |= BM_START; @@ -839,73 +773,75 @@ /* * start AUTO SCSI, kick off arbitration */ - command = 0; - command |= (CLEAR_CDB_FIFO_POINTER - | AUTOSCSI_START - | AUTO_MSGIN_00_OR_04 - | AUTO_MSGIN_02 - | AUTO_ATN); + command = (CLEAR_CDB_FIFO_POINTER | + AUTOSCSI_START | + AUTO_MSGIN_00_OR_04 | + AUTO_MSGIN_02 | + AUTO_ATN ); nsp32_write2(base, COMMAND_CONTROL, command); /* - * Arbitration Status Check - * - * Note: Arbitration counter is wait during ARBIT_GO is not lifting. - * Using udelay(1) consumes CPU time and system time, but - * arbitration delay time is defined minimal 2.4us in SCSI - * specification, thus udelay works as coarse grained wait timer. + * Check arbitration */ - time = 0; - while(1) { - arbit = nsp32_read1(base, ARBIT_STATUS); - if(arbit & ARBIT_GO) { - udelay(1); - time++; - if ( time > ARBIT_TIMEOUT_TIME ) { - /* something lock up! guess no connection */ - SCpnt->result = DID_NO_CONNECT << 16; - status = FALSE; - goto out; - } - } else { - break; - } - }; - - nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "arbit: 0x%x, delay time: %d", arbit, time); + status = nsp32_arbitration(SCpnt, base); + out: /* - * check Arbitration Status Result + * IRQ enable */ - if(arbit & ARBIT_WIN) { + nsp32_write2(base, IRQ_CONTROL, 0); + + return status; +} + + +/* + * Arbitration Status Check + * + * Note: Arbitration counter is waited during ARBIT_GO is not lifting. + * Using udelay(1) consumes CPU time and system time, but + * arbitration delay time is defined minimal 2.4us in SCSI + * specification, thus udelay works as coarse grained wait timer. + */ +static int nsp32_arbitration(Scsi_Cmnd *SCpnt, unsigned int base) +{ + unsigned char arbit; + int status = TRUE; + int time = 0; + + do { + arbit = nsp32_read1(base, ARBIT_STATUS); + time++; + } while ((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 && + (time <= ARBIT_TIMEOUT_TIME)); + + nsp32_dbg(NSP32_DEBUG_AUTOSCSI, + "arbit: 0x%x, delay time: %d", arbit, time); + + if (arbit & ARBIT_WIN) { /* Arbitration succeeded */ - status = TRUE; SCpnt->result = DID_OK << 16; - /* PCI LED on! */ - nsp32_index_write1(base, EXT_PORT, LED_ON); - } else if(arbit & ARBIT_FAIL) { + nsp32_index_write1(base, EXT_PORT, LED_ON); /* PCI LED on */ + } else if (arbit & ARBIT_FAIL) { /* Arbitration failed */ - status = FALSE; SCpnt->result = DID_BUS_BUSY << 16; - } else { - /* unknown error? */ status = FALSE; - SCpnt->result = DID_ERROR << 16; + } else { + /* + * unknown error or ARBIT_GO timeout, + * something lock up! guess no connection. + */ + nsp32_dbg(NSP32_DEBUG_AUTOSCSI, "arbit timeout"); SCpnt->result = DID_NO_CONNECT << 16; - } + status = FALSE; + } /* * clear Arbit */ nsp32_write1(base, SET_ARBIT, ARBIT_CLEAR); - out: - /* - * IRQ enable - */ - nsp32_write2(base, IRQ_CONTROL, 0); - - return(status); + return status; } @@ -916,10 +852,12 @@ * reselection target id&lun must be already set. * SCSI-2 says IDENTIFY implies RESTORE_POINTER operation. */ -static int nsp32_reselection(nsp32_hw_data *data, unsigned char newlun) +static int nsp32_reselection(Scsi_Cmnd *SCpnt, unsigned char newlun) { - unsigned int base = data->BaseAddress; - unsigned char tmpid, newid; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int host_id = SCpnt->device->host->this_id; + unsigned int base = SCpnt->device->host->io_port; + unsigned char tmpid, newid; nsp32_dbg(NSP32_DEBUG_RESELECTION, "enter"); @@ -927,7 +865,7 @@ * calculate reselected SCSI ID */ tmpid = nsp32_read1(base, RESELECT_ID); - tmpid &= 0x7f; + tmpid &= (~BIT(host_id)); newid = 0; while (tmpid) { if (tmpid & 1) { @@ -940,20 +878,20 @@ /* * If reselected New ID:LUN is not existed * or current nexus is not existed, unexpected - * reselection is occured. Send reject message. + * reselection is occurred. Send reject message. */ - if (newid >= MAX_TARGET || newlun >= MAX_LUN) { + if (newid >= NUMBER(data->lunt) || newlun >= NUMBER(data->lunt[0])) { nsp32_msg(KERN_WARNING, "unknown id/lun"); return FALSE; - } else if(data->lunt[newid][newlun]->SCpnt == NULL) { + } else if(data->lunt[newid][newlun].SCpnt == NULL) { nsp32_msg(KERN_WARNING, "no SCSI command is processing"); return FALSE; } - data->pid = newid; - data->plun = newlun; - data->curtarget = &data->target[newid]; - data->curlunt = data->lunt[newid][newlun]; + data->cur_id = newid; + data->cur_lun = newlun; + data->cur_target = &(data->target[newid]); + data->cur_lunt = &(data->lunt[newid][newlun]); /* reset SACK/SavedACK counter (or ALL clear?) */ nsp32_write4(base, CLR_COUNTER, CLRCOUNTER_ALLMASK); @@ -963,16 +901,18 @@ /* - * nsp32hw_setup_sg_table - build scatter gather list for transfer data + * nsp32_setup_sg_table - build scatter gather list for transfer data * with bus master. * * Note: NinjaSCSI-32Bi/UDE bus master can not transfer over 64KB at a time. */ -static int nsp32hw_setup_sg_table(Scsi_Cmnd *SCpnt, nsp32_hw_data *data) +static int nsp32_setup_sg_table(Scsi_Cmnd *SCpnt) { - struct scatterlist *sgl; - struct nsp32_sgtable *sgt = data->curlunt->sglun->sgt; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + struct scatterlist *sgl; + nsp32_sgtable *sgt = data->cur_lunt->sglun->sgt; int num, i; + u32 l; if (SCpnt->request_bufflen == 0) { return TRUE; @@ -987,7 +927,7 @@ sgl = (struct scatterlist *)SCpnt->request_buffer; num = pci_map_sg(data->Pci, sgl, SCpnt->use_sg, scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); - for (i=0; i 65536) { + if (le32_to_cpu(sgt[i].len) > 0x10000) { nsp32_msg(KERN_ERR, - "can't transfer over 64KB at a time"); + "can't transfer over 64KB at a time, size=0x%lx", le32_to_cpu(sgt[i].len)); return FALSE; } nsp32_dbg(NSP32_DEBUG_SGLIST, - "num 0x%x : addr 0x%lx len 0x%x", - i, sgt[i].addr, sgt[i].len); + "num 0x%x : addr 0x%lx len 0x%lx", + i, + le32_to_cpu(sgt[i].addr), + le32_to_cpu(sgt[i].len )); } - sgt[num-1].len |= NSP32_SG_END_SGT; /* set end mark */ + + /* set end mark */ + l = le32_to_cpu(sgt[num-1].len); + sgt[num-1].len = cpu_to_le32(l | SGTEND); + } else { SCpnt->SCp.have_data_in = pci_map_single(data->Pci, SCpnt->request_buffer, SCpnt->request_bufflen, scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + sgt[0].addr = cpu_to_le32(SCpnt->SCp.have_data_in); - sgt[0].len = cpu_to_le32(SCpnt->request_bufflen); - sgt[0].len |= NSP32_SG_END_SGT; /* set end mark */ + sgt[0].len = cpu_to_le32(SCpnt->request_bufflen | SGTEND); /* set end mark */ - nsp32_dbg(NSP32_DEBUG_SGLIST, "single : addr 0x%lx len=0x%x", - sgt[0].addr, sgt[0].len); + if (SCpnt->request_bufflen > 0x10000) { + nsp32_msg(KERN_ERR, + "can't transfer over 64KB at a time, size=0x%lx", SCpnt->request_bufflen); + return FALSE; + } + nsp32_dbg(NSP32_DEBUG_SGLIST, "single : addr 0x%lx len=0x%lx", + le32_to_cpu(sgt[0].addr), + le32_to_cpu(sgt[0].len )); } return TRUE; @@ -1022,38 +974,40 @@ static int nsp32_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) { - nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->host->hostdata; - struct nsp32_target *target; - struct nsp32_lunt *curlunt; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + nsp32_target *target; + nsp32_lunt *cur_lunt; int ret; nsp32_dbg(NSP32_DEBUG_QUEUECOMMAND, "enter. target: 0x%x LUN: 0x%x cmnd: 0x%x cmndlen: 0x%x " "use_sg: 0x%x reqbuf: 0x%lx reqlen: 0x%x", - SCpnt->target, SCpnt->lun, SCpnt->cmnd[0], SCpnt->cmd_len, + SCpnt->device->id, SCpnt->device->lun, SCpnt->cmnd[0], SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_buffer, SCpnt->request_bufflen); - if (data->CurrentSC != NULL ) { + if (data->CurrentSC != NULL) { nsp32_msg(KERN_ERR, "Currentsc != NULL. Cancel this command request"); data->CurrentSC = NULL; SCpnt->result = DID_NO_CONNECT << 16; done(SCpnt); - return 1; + return SCSI_MLQUEUE_HOST_BUSY; } /* check target ID is not same as this initiator ID */ - if (SCpnt->target == NSP32_HOST_SCSIID) { + if (SCpnt->device->id == SCpnt->device->host->this_id) { + nsp32_dbg(NSP32_DEBUG_QUEUECOMMAND, "terget==host???"); SCpnt->result = DID_BAD_TARGET << 16; done(SCpnt); - return 1; + return SCSI_MLQUEUE_DEVICE_BUSY; } /* check target LUN is allowable value */ - if (SCpnt->lun >= MAX_LUN) { + if (SCpnt->device->lun >= MAX_LUN) { + nsp32_dbg(NSP32_DEBUG_QUEUECOMMAND, "no more lun"); SCpnt->result = DID_BAD_TARGET << 16; done(SCpnt); - return 1; + return SCSI_MLQUEUE_DEVICE_BUSY; } show_command(SCpnt); @@ -1062,7 +1016,7 @@ data->CurrentSC = SCpnt; SCpnt->SCp.Status = CHECK_CONDITION; SCpnt->SCp.Message = 0; - SCpnt->resid = 0; //SCpnt->request_bufflen; + SCpnt->resid = SCpnt->request_bufflen; SCpnt->SCp.ptr = (char *) SCpnt->request_buffer; SCpnt->SCp.this_residual = SCpnt->request_bufflen; @@ -1070,39 +1024,41 @@ SCpnt->SCp.buffers_residual = 0; /* initialize data */ - data->msgoutlen = 0; - data->msginlen = 0; - curlunt = data->lunt[SCpnt->target][SCpnt->lun]; - curlunt->SCpnt = SCpnt; - curlunt->save_datp = 0; - curlunt->msgin03 = FALSE; - data->curlunt = curlunt; - data->pid = SCpnt->target; - data->plun = SCpnt->lun; + data->msgout_len = 0; + data->msgin_len = 0; + cur_lunt = &(data->lunt[SCpnt->device->id][SCpnt->device->lun]); + cur_lunt->SCpnt = SCpnt; + cur_lunt->save_datp = 0; + cur_lunt->msgin03 = FALSE; + data->cur_lunt = cur_lunt; + data->cur_id = SCpnt->device->id; + data->cur_lun = SCpnt->device->lun; - ret = nsp32hw_setup_sg_table(SCpnt, data); + ret = nsp32_setup_sg_table(SCpnt); if (ret == FALSE) { + nsp32_msg(KERN_ERR, "SGT fail"); SCpnt->result = DID_ERROR << 16; - nsp32_scsi_done(data, SCpnt); + nsp32_scsi_done(SCpnt); + return SCSI_MLQUEUE_HOST_BUSY; } /* Build IDENTIFY */ - nsp32_build_identify(data, SCpnt); + nsp32_build_identify(SCpnt); /* * If target is the first time to transfer after the reset * (target don't have SDTR_DONE and SDTR_INITIATOR), sync * message SDTR is needed to do synchronous transfer. */ - target = &data->target[SCpnt->target]; - data->curtarget = target; + target = &data->target[SCpnt->device->id]; + data->cur_target = target; if (!(target->sync_flag & (SDTR_DONE | SDTR_INITIATOR | SDTR_TARGET))) { unsigned char period, offset; if (trans_mode != ASYNC_MODE) { nsp32_set_max_sync(data, target, &period, &offset); - nsp32_build_sdtr(data, period, offset); + nsp32_build_sdtr(SCpnt, period, offset); target->sync_flag |= SDTR_INITIATOR; } else { nsp32_set_async(data, target); @@ -1140,32 +1096,32 @@ nsp32_dbg(NSP32_DEBUG_TARGETFLAG, "target: %d sync_flag: 0x%x syncreg: 0x%x ackwidth: 0x%x", - SCpnt->target, target->sync_flag, target->syncreg, + SCpnt->device->id, target->sync_flag, target->syncreg, target->ackwidth); /* Selection */ if (auto_param == 0) { - ret = nsp32hw_start_selection(SCpnt, data); + ret = nsp32_selection_autopara(SCpnt); } else { - ret = nsp32_selection_autoscsi(SCpnt, data); + ret = nsp32_selection_autoscsi(SCpnt); } if (ret != TRUE) { - nsp32_scsi_done(data, SCpnt); - return 1; + nsp32_dbg(NSP32_DEBUG_QUEUECOMMAND, "selection fail"); + nsp32_scsi_done(SCpnt); + return SCSI_MLQUEUE_DEVICE_BUSY; } return 0; } /* initialize asic */ -static int nsp32hw_init(struct Scsi_Host *host) +static int nsp32hw_init(nsp32_hw_data *data) { - unsigned int base = host->io_port; + unsigned int base = data->BaseAddress; unsigned short irq_stat; - unsigned long lc_reg; - unsigned char power; - nsp32_hw_data *data = (nsp32_hw_data *)host->hostdata; + unsigned long lc_reg; + unsigned char power; lc_reg = nsp32_index_read4(base, CFG_LATE_CACHE); if ((lc_reg & 0xff00) == 0) { @@ -1173,15 +1129,15 @@ nsp32_index_write2(base, CFG_LATE_CACHE, lc_reg & 0xffff); } - nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK); - nsp32_write2(base, TRANSFER_CONTROL, 0); - nsp32_write4(base, BM_CNT, 0); + nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK); + nsp32_write2(base, TRANSFER_CONTROL, 0); + nsp32_write4(base, BM_CNT, 0); nsp32_write2(base, SCSI_EXECUTE_PHASE, 0); do { irq_stat = nsp32_read2(base, IRQ_STATUS); + nsp32_dbg(NSP32_DEBUG_INIT, "irq_stat 0x%x", irq_stat); } while (irq_stat & IRQSTATUS_ANY_IRQ); - nsp32_dbg(NSP32_DEBUG_INIT, "irq_stat 0x%x", irq_stat); /* * Fill FIFO_FULL_SHLD, FIFO_EMPTY_SHLD. Below parameter is @@ -1189,22 +1145,25 @@ */ if ((data->trans_method & NSP32_TRANSFER_PIO) || (data->trans_method & NSP32_TRANSFER_MMIO)) { - nsp32_index_write1(base, FIFO_FULL_SHLD_COUNT, 0x40); + nsp32_index_write1(base, FIFO_FULL_SHLD_COUNT, 0x40); + nsp32_index_write1(base, FIFO_EMPTY_SHLD_COUNT, 0x40); } else if (data->trans_method & NSP32_TRANSFER_BUSMASTER) { - nsp32_index_write1(base, FIFO_FULL_SHLD_COUNT, 0x10); + nsp32_index_write1(base, FIFO_FULL_SHLD_COUNT, 0x10); + nsp32_index_write1(base, FIFO_EMPTY_SHLD_COUNT, 0x60); + } else { + nsp32_dbg(NSP32_DEBUG_INIT, "unknown transfer mode"); } - nsp32_index_write1(base, FIFO_EMPTY_SHLD_COUNT, 0x60); nsp32_dbg(NSP32_DEBUG_INIT, "full 0x%x emp 0x%x", nsp32_index_read1(base, FIFO_FULL_SHLD_COUNT), nsp32_index_read1(base, FIFO_EMPTY_SHLD_COUNT)); nsp32_index_write1(base, CLOCK_DIV, data->clock); - nsp32_index_write1(base, BM_CYCLE, MEMRD_CMD1 | SGT_AUTO_PARA_MEMED_CMD); + nsp32_index_write1(base, BM_CYCLE, MEMRD_CMD1 | SGT_AUTO_PARA_MEMED_CMD); nsp32_write1(base, PARITY_CONTROL, 0); /* parity check is disable */ /* - * initialize I_MISC_WRRD register + * initialize MISC_WRRD register * * Note: Designated parameters is obeyed as following: * MISC_SCSI_DIRECTION_DETECTOR_SELECT: It must be set. @@ -1220,10 +1179,10 @@ */ nsp32_index_write2(base, MISC_WR, (SCSI_DIRECTION_DETECTOR_SELECT | - DELAYED_BMSTART | - MASTER_TERMINATION_SELECT | - BMREQ_NEGATE_TIMING_SEL | - AUTOSEL_TIMING_SEL | + DELAYED_BMSTART | + MASTER_TERMINATION_SELECT | + BMREQ_NEGATE_TIMING_SEL | + AUTOSEL_TIMING_SEL | BMSTOP_CHANGE2_NONDATA_PHASE)); nsp32_index_write1(base, TERM_PWR_CONTROL, 0); @@ -1234,11 +1193,11 @@ } nsp32_write2(base, TIMER_SET, TIMER_STOP); - nsp32_write2(base, TIMER_SET, TIMER_STOP); + nsp32_write2(base, TIMER_SET, TIMER_STOP); /* Required 2 times */ - nsp32_write1(base, SYNC_REG, 0); - nsp32_write1(base, ACK_WIDTH, 0); - nsp32_write2(base, SEL_TIME_OUT, 10000); /* 25us x10000 = 250ms defined in SCSI */ + nsp32_write1(base, SYNC_REG, 0); + nsp32_write1(base, ACK_WIDTH, 0); + nsp32_write2(base, SEL_TIME_OUT, SEL_TIMEOUT_TIME); /* * enable to select designated IRQ (except for @@ -1250,21 +1209,21 @@ IRQSELECT_RESELECT_IRQ | IRQSELECT_PHASE_CHANGE_IRQ | IRQSELECT_AUTO_SCSI_SEQ_IRQ | - //IRQSELECT_BMCNTERR_IRQ | + // IRQSELECT_BMCNTERR_IRQ | IRQSELECT_TARGET_ABORT_IRQ | IRQSELECT_MASTER_ABORT_IRQ ); nsp32_write2(base, IRQ_CONTROL, 0); /* PCI LED off */ nsp32_index_write1(base, EXT_PORT_DDR, LED_OFF); - nsp32_index_write1(base, EXT_PORT, LED_OFF); + nsp32_index_write1(base, EXT_PORT, LED_OFF); return TRUE; } /* interrupt routine */ -static void do_nsp32_isr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t do_nsp32_isr(int irq, void *dev_id, struct pt_regs *regs) { nsp32_hw_data *data = dev_id; unsigned int base = data->BaseAddress; @@ -1273,13 +1232,9 @@ unsigned char busmon, busphase; unsigned long flags; int ret; + int handled = 0; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) - struct Scsi_Host *host = data->Host; - spin_lock_irqsave(host->host_lock, flags); -#else - spin_lock_irqsave(&io_request_lock, flags); -#endif + spin_lock_irqsave(HOST_LOCK, flags); /* * IRQ check, then enable IRQ mask @@ -1289,9 +1244,10 @@ "enter IRQ: %d, IRQstatus: 0x%x", irq, irq_stat); /* is this interrupt comes from Ninja asic? */ if ((irq_stat & IRQSTATUS_ANY_IRQ) == 0) { - nsp32_msg(KERN_INFO, "spurious interrupt: irq other 0x%x", irq_stat); + nsp32_dbg(NSP32_DEBUG_INTR, "shared interrupt: irq other 0x%x", irq_stat); goto out2; } + handled = 1; nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK); busmon = nsp32_read1(base, SCSI_BUS_MONITOR); @@ -1303,14 +1259,14 @@ if (data->CurrentSC != NULL) { nsp32_msg(KERN_INFO, "clean up current SCSI command"); SCpnt->result = DID_BAD_TARGET << 16; - nsp32_scsi_done(data, SCpnt); + nsp32_scsi_done(SCpnt); } goto out; } /* Timer IRQ */ if (irq_stat & IRQSTATUS_TIMER_IRQ) { - DEBUG(0, "timer stop\n"); + nsp32_dbg(NSP32_DEBUG_INTR, "timer stop"); nsp32_write2(base, TIMER_SET, TIMER_STOP); goto out; } @@ -1321,20 +1277,20 @@ nsp32_do_bus_reset(data); if (SCpnt != NULL) { SCpnt->result = DID_RESET << 16; - nsp32_scsi_done(data, SCpnt); + nsp32_scsi_done(SCpnt); } goto out; } - + if (SCpnt == NULL) { - nsp32_msg(KERN_WARNING, "SCpnt==NULL this can't be happen\n"); - nsp32_msg(KERN_WARNING, "irq_stat=0x%x trans_stat=0x%x\n", irq_stat, trans_stat); + nsp32_msg(KERN_WARNING, "SCpnt==NULL this can't be happened"); + nsp32_msg(KERN_WARNING, "irq_stat=0x%x trans_stat=0x%x", irq_stat, trans_stat); goto out; } /* * AutoSCSI Interrupt. - * Note: This interrupt is occured when AutoSCSI is finished. Then + * Note: This interrupt is occurred when AutoSCSI is finished. Then * check SCSIEXECUTEPHASE, and do appropriate action. Each phases are * recorded when AutoSCSI sequencer has been processed. */ @@ -1346,10 +1302,10 @@ /* Selection Timeout, go busfree phase. */ if (auto_stat & SELECTION_TIMEOUT) { nsp32_dbg(NSP32_DEBUG_INTR, - "selection timeout occured"); + "selection timeout occurred"); SCpnt->result = DID_TIME_OUT << 16; - nsp32_scsi_done(data, SCpnt); + nsp32_scsi_done(SCpnt); goto out; } @@ -1357,17 +1313,17 @@ /* * MsgOut phase was processed. * If MSG_IN_OCCUER is not set, then MsgOut phase is - * completed. Thus, msgoutlen must reset. Otherwise, - * nothing to do here. If MSG_OUT_OCCUER is occured, + * completed. Thus, msgout_len must reset. Otherwise, + * nothing to do here. If MSG_OUT_OCCUER is occurred, * then we will encounter the condition and check. */ if (!(auto_stat & MSG_IN_OCCUER) && - (data->msgoutlen <= 3)) { + (data->msgout_len <= 3)) { /* - * !MSG_IN_OCCUER && msgoutlen <=3 + * !MSG_IN_OCCUER && msgout_len <=3 * ---> AutoSCSI with MSGOUTreg is processed. */ - data->msgoutlen = 0; + data->msgout_len = 0; }; nsp32_dbg(NSP32_DEBUG_INTR, "MsgOut phase processed"); @@ -1394,28 +1350,29 @@ nsp32_read4(base, SACK_CNT)); nsp32_dbg(NSP32_DEBUG_INTR, "SSACK=0x%lx", nsp32_read4(base, SAVED_SACK_CNT)); - + + SCpnt->resid = 0; /* all data transfered! */ } /* * MsgIn Occur */ if (auto_stat & MSG_IN_OCCUER) { - nsp32_msgin_occur(data, irq_stat, auto_stat); + nsp32_msgin_occur(SCpnt, irq_stat, auto_stat); } /* * MsgOut Occur */ if (auto_stat & MSG_OUT_OCCUER) { - nsp32_msgout_occur(data); + nsp32_msgout_occur(SCpnt); } /* * Bus Free Occur */ if (auto_stat & BUS_FREE_OCCUER) { - ret = nsp32_busfree_occur(data, auto_stat); + ret = nsp32_busfree_occur(SCpnt, auto_stat); if (ret == TRUE) { goto out; } @@ -1466,28 +1423,28 @@ switch(busphase) { case BUSPHASE_DATA_OUT: - printk( "write\n"); + nsp32_dbg(NSP32_DEBUG_INTR, "fifo/write"); //nsp32_pio_write(SCpnt); break; case BUSPHASE_DATA_IN: - printk( "read\n"); + nsp32_dbg(NSP32_DEBUG_INTR, "fifo/read"); //nsp32_pio_read(SCpnt); break; case BUSPHASE_STATUS: - //DEBUG(0, "fifo/status\n"); + nsp32_dbg(NSP32_DEBUG_INTR, "fifo/status"); SCpnt->SCp.Status = nsp32_read1(base, SCSI_CSB_IN); break; default: - printk("fifo/other phase?\n"); - printk("irq_stat=0x%x trans_stat=0x%x\n", irq_stat, trans_stat); + nsp32_dbg(NSP32_DEBUG_INTR, "fifo/other phase"); + nsp32_dbg(NSP32_DEBUG_INTR, "irq_stat=0x%x trans_stat=0x%x", irq_stat, trans_stat); show_busphase(busphase); break; } @@ -1502,7 +1459,7 @@ switch(busphase) { case BUSPHASE_MESSAGE_IN: nsp32_dbg(NSP32_DEBUG_INTR, "phase chg/msg in"); - nsp32_msgin_occur(data, irq_stat, 0); + nsp32_msgin_occur(SCpnt, irq_stat, 0); break; default: nsp32_msg(KERN_WARNING, "phase chg/other phase?"); @@ -1516,7 +1473,7 @@ /* PCI_IRQ */ if (irq_stat & IRQSTATUS_PCI_IRQ) { - nsp32_dbg(NSP32_DEBUG_INTR, "PCI IRQ occured"); + nsp32_dbg(NSP32_DEBUG_INTR, "PCI IRQ occurred"); /* Do nothing */ } @@ -1525,13 +1482,14 @@ nsp32_msg(KERN_ERR, "Received unexpected BMCNTERR IRQ! "); /* * TODO: To be implemented improving bus master - * transfer reliablity when BMCNTERR is occured in + * transfer reliablity when BMCNTERR is occurred in * AutoSCSI phase described in specification. */ } #if 0 - printk("irq_stat=0x%x trans_stat=0x%x\n", irq_stat, trans_stat); + nsp32_dbg(NSP32_DEBUG_INTR, + "irq_stat=0x%x trans_stat=0x%x", irq_stat, trans_stat); show_busphase(busphase); #endif @@ -1540,72 +1498,122 @@ nsp32_write2(base, IRQ_CONTROL, 0); out2: -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - spin_unlock_irqrestore(&io_request_lock, flags); -#else - spin_unlock_irqrestore(host->host_lock, flags); -#endif + spin_unlock_irqrestore(HOST_LOCK, flags); nsp32_dbg(NSP32_DEBUG_INTR, "exit"); - return; + return IRQ_RETVAL(handled); } #undef SPRINTF #define SPRINTF(args...) \ - do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0) -static int nsp32_proc_info(char *buffer, - char **start, - off_t offset, - int length, - int hostno, - int inout) + do { \ + if(length > (pos - buffer)) { \ + pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \ + nsp32_dbg(NSP32_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\ + } \ + } while(0) +static int nsp32_proc_info( +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + struct Scsi_Host *host, +#endif + char *buffer, + char **start, + off_t offset, + int length, +#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + int hostno, +#endif + int inout) { - char *pos = buffer; - int thislength; - unsigned long flags; - nsp32_hw_data *data; - struct Scsi_Host *host = NULL; - unsigned int base; - unsigned char mode_reg; + char *pos = buffer; + int thislength; + unsigned long flags; + nsp32_hw_data *data; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + int hostno; +#else + struct Scsi_Host *host; +#endif + unsigned int base; + unsigned char mode_reg; + int id, speed; + long model; /* Write is not supported, just return. */ if (inout == TRUE) { return -EINVAL; } +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + hostno = host->host_no; +#else /* search this HBA host */ - for (host=scsi_hostlist; host; host=host->next) { - if (host->host_no == hostno) { - break; - } - } + host = scsi_host_hn_get(hostno); if (host == NULL) { return -ESRCH; } +#endif data = (nsp32_hw_data *)host->hostdata; base = host->io_port; SPRINTF("NinjaSCSI-32 status\n\n"); - SPRINTF("Driver version: %s\n", nsp32_release_version); + SPRINTF("Driver version: %s, $Revision: 1.34 $\n", nsp32_release_version); SPRINTF("SCSI host No.: %d\n", hostno); SPRINTF("IRQ: %d\n", host->irq); SPRINTF("IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1); - SPRINTF("MMIO(virtual address): 0x%lx\n", host->base); + SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1); SPRINTF("sg_tablesize: %d\n", host->sg_tablesize); - SPRINTF("Chip revision: %d\n", (nsp32_read2(base, INDEX_REG) >> 8) - 0x4f); + SPRINTF("Chip revision: 0x%x\n", (nsp32_read2(base, INDEX_REG) >> 8) & 0xff); mode_reg = nsp32_index_read1(base, CHIP_MODE); + model = data->pci_devid->driver_data; #ifdef CONFIG_PM - //SPRINTF("Power Management: %s\n", (mode_reg & OPTF) ? "yes" : "no"); + SPRINTF("Power Management: %s\n", (mode_reg & OPTF) ? "yes" : "no"); #endif - SPRINTF("OEM: %s\n", nsp32_model[mode_reg & (OEM0|OEM1)]); + SPRINTF("OEM: %ld, %s\n", (mode_reg & (OEM0|OEM1)), nsp32_model[model]); spin_lock_irqsave(&(data->Lock), flags); SPRINTF("CurrentSC: 0x%p\n\n", data->CurrentSC); spin_unlock_irqrestore(&(data->Lock), flags); + + SPRINTF("SDTR status\n"); + for(id = 0; id < NUMBER(data->target); id++) { + + SPRINTF("id %d: ", id); + + if (id == host->this_id) { + SPRINTF("----- NinjaSCSI-32 host adapter\n"); + continue; + } + + if (data->target[id].sync_flag == SDTR_DONE) { + if (data->target[id].period == 0 && + data->target[id].offset == ASYNC_OFFSET ) { + SPRINTF("async"); + } else { + SPRINTF(" sync"); + } + } else { + SPRINTF(" none"); + } + + if (data->target[id].period != 0) { + + speed = 1000000 / (data->target[id].period * 4); + + SPRINTF(" transfer %d.%dMB/s, offset %d", + speed / 1000, + speed % 1000, + data->target[id].offset + ); + } + SPRINTF("\n"); + } + + thislength = pos - (buffer + offset); if(thislength < 0) { @@ -1621,1542 +1629,1452 @@ } #undef SPRINTF + + /* - * Note: n_io_port is defined as 0x7f because I/O register port is - * assigned as: - * 0x800-0x8ff: memory mapped I/O port - * 0x900-0xbff: (map same 0x800-0x8ff I/O port image repeatedly) - * 0xc00-0xfff: CardBus status registers + * Reset parameters and call scsi_done for data->cur_lunt. + * Be careful setting SCpnt->result = DID_* before calling this function. */ -static int nsp32_detect(Scsi_Host_Template *sht) +static void nsp32_scsi_done(Scsi_Cmnd *SCpnt) { - struct Scsi_Host *host; /* registered host structure */ - int ret; - nsp32_hw_data *data; - int i, j; - - nsp32_dbg(NSP32_DEBUG_REGISTER, "enter"); + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = SCpnt->device->host->io_port; /* - * register this HBA as SCSI device + * unmap pci */ - host = scsi_register(sht, sizeof(nsp32_hw_data)); - if (host == NULL) { - nsp32_msg (KERN_ERR, "failed to scsi register"); - goto err; + if (SCpnt->request_bufflen == 0) { + goto skip; } - /* - * set nsp32_hw_data - */ - data = (nsp32_hw_data *)host->hostdata; - memset(data, 0, sizeof(nsp32_hw_data)); - - data->IrqNumber = nsp32_data_base.IrqNumber; - data->BaseAddress = nsp32_data_base.BaseAddress; - data->NumAddress = nsp32_data_base.NumAddress; - data->MmioAddress = nsp32_data_base.MmioAddress; - data->Pci = nsp32_data_base.Pci; - data->pci_devid = nsp32_data_base.pci_devid; - - host->irq = data->IrqNumber; - host->io_port = data->BaseAddress; - host->unique_id = data->BaseAddress; - host->n_io_port = data->NumAddress; - host->base = data->MmioAddress; - scsi_set_pci_device(host, data->Pci); - - data->Host = host; - spin_lock_init(&(data->Lock)); - - data->curlunt = NULL; - data->curtarget = NULL; + if (SCpnt->use_sg) { + pci_unmap_sg(data->Pci, + (struct scatterlist *)SCpnt->buffer, + SCpnt->use_sg, + scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + } else { + pci_unmap_single(data->Pci, + (u32)SCpnt->SCp.have_data_in, + SCpnt->request_bufflen, + scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + } + skip: /* - * Bus master transfer mode is supported currently. + * clear TRANSFERCONTROL_BM_START */ - data->trans_method = NSP32_TRANSFER_BUSMASTER; + nsp32_write2(base, TRANSFER_CONTROL, 0); + nsp32_write4(base, BM_CNT, 0); /* - * Set clock div, CLOCK_4 (HBA has external clock, and - * dividing * 100ns/4). - * Currently CLOCK_4 has only tested, not for CLOCK_2/PCICLK yet. + * call scsi_done */ - data->clock = CLOCK_4; + (*SCpnt->scsi_done)(SCpnt); /* - * Select appropriate nsp32_sync_table and set I_CLOCKDIV. + * reset parameters */ - switch (data->clock) { - case CLOCK_4: - /* If data->clock is CLOCK_4, then select 40M sync table. */ - data->synct = nsp32_sync_table_40M; - data->syncnum = nsp32_table_40M_num; - break; - case CLOCK_2: - /* If data->clock is CLOCK_2, then select 20M sync table. */ - data->synct = nsp32_sync_table_20M; - data->syncnum = nsp32_table_20M_num; - break; - case PCICLK: - /* If data->clock is PCICLK, then select pci sync table. */ - data->synct = nsp32_sync_table_pci; - data->syncnum = nsp32_table_pci_num; - break; - default: - nsp32_msg(KERN_WARNING, - "Invalid clock div is selected, set CLOCK_4."); - /* Use default value CLOCK_4 */ - data->clock = CLOCK_4; - data->synct = nsp32_sync_table_40M; - data->syncnum = nsp32_table_40M_num; - } + data->cur_lunt->SCpnt = NULL; + data->cur_lunt = NULL; + data->cur_target = NULL; + data->CurrentSC = NULL; +} - /* - * setup nsp32_lunt - */ - data->lunt_list = (struct nsp32_lunt *) - kmalloc(sizeof(struct nsp32_lunt) * MAX_TARGET * MAX_LUN, - GFP_KERNEL); - if (data->lunt_list == NULL) { - nsp32_msg(KERN_ERR, "cannot allocate LUN memory"); - goto scsi_unregister; - } - nsp32_dbg(NSP32_DEBUG_REGISTER, "0x%x 0x%x", - data->lunt_list, sizeof(struct nsp32_lunt)*MAX_TARGET*MAX_LUN); - /* - * setup DMA - */ - if (pci_set_dma_mask(data->Pci, 0xffffffffUL)) { - nsp32_msg (KERN_ERR, "failed to set PCI DMA mask"); - goto kfree_lunt; - } +/* + * Bus Free Occur + * + * Current Phase is BUSFREE. AutoSCSI is automatically execute BUSFREE phase + * with ACK reply when below condition is matched: + * MsgIn 00: Command Complete. + * MsgIn 02: Save Data Pointer. + * MsgIn 04: Diconnect. + * In other case, unexpected BUSFREE is detected. + */ +static int nsp32_busfree_occur(Scsi_Cmnd *SCpnt, unsigned short execph) +{ + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = SCpnt->device->host->io_port; - /* - * allocate autoparam DMA resource. - */ - data->autoparam = pci_alloc_consistent(data->Pci, AUTOPARAM_SIZE, &data->apaddr); - if (data->autoparam == NULL) { - nsp32_msg(KERN_ERR, "failed to allocate DMA memory"); - goto kfree_lunt; - } + nsp32_dbg(NSP32_DEBUG_BUSFREE, "enter execph=0x%x", execph); + show_autophase(execph); + + nsp32_write4(base, BM_CNT, 0); + nsp32_write2(base, TRANSFER_CONTROL, 0); /* - * allocate scatter-gather DMA resource. + * MsgIn 02: Save Data Pointer + * + * VALID: + * Save Data Pointer is received. Adjust pointer. + * + * NO-VALID: + * SCSI-3 says if Save Data Pointer is not received, then we restart + * processing and we can't adjust any SCSI data pointer in next data + * phase. */ - data->sg_list = pci_alloc_consistent(data->Pci, - (sizeof(struct nsp32_sgtable) * NSP_SG_SIZE * MAX_TARGET * MAX_LUN), - &data->sgaddr); - if (data->sg_list == NULL) { - nsp32_msg(KERN_ERR, "failed to allocate DMA memory"); - goto free_autoparam; - } + if (execph & MSGIN_02_VALID) { + nsp32_dbg(NSP32_DEBUG_BUSFREE, "MsgIn02_Valid"); - for (i=0; ilunt[i][j] = data->lunt_list + (i * MAX_LUN + j); - } - } + /* + * Check sack_cnt/saved_sack_cnt, then adjust sg table if + * needed. + */ + if (!(execph & MSGIN_00_VALID) && + ((execph & DATA_IN_PHASE) || (execph & DATA_OUT_PHASE))) { + unsigned int sacklen, s_sacklen; + + /* + * Read SACK count and SAVEDSACK count, then compare. + */ + sacklen = nsp32_read4(base, SACK_CNT ); + s_sacklen = nsp32_read4(base, SAVED_SACK_CNT); + + /* + * If SAVEDSACKCNT == 0, it means SavedDataPointer is + * come after data transfering. + */ + if (s_sacklen > 0) { + /* + * Comparing between sack and savedsack to + * check the condition of AutoMsgIn03. + * + * If they are same, set msgin03 == TRUE, + * COMMANDCONTROL_AUTO_MSGIN_03 is enabled at + * reselection. On the other hand, if they + * aren't same, set msgin03 == FALSE, and + * COMMANDCONTROL_AUTO_MSGIN_03 is disabled at + * reselection. + */ + if (sacklen != s_sacklen) { + data->cur_lunt->msgin03 = FALSE; + } else { + data->cur_lunt->msgin03 = TRUE; + } - for (i=0; ilunt[i][j]; - lp->sglun = (struct nsp32_sglun *) - (data->sg_list + (i * MAX_LUN + j)); - lp->sglun_paddr = data->sgaddr + - (long)((i * MAX_LUN + j) - * sizeof(struct nsp32_sglun)); - lp->SCpnt = NULL; - lp->save_datp = 0; - lp->msgin03 = FALSE; - lp->sg_num = 0; - lp->cur_entry = 0; + nsp32_adjust_busfree(SCpnt, s_sacklen); + } } + + /* This value has not substitude with valid value yet... */ + //data->cur_lunt->save_datp = data->cur_datp; + } else { + /* + * no processing. + */ + } + + if (execph & MSGIN_03_VALID) { + /* MsgIn03 was valid to be processed. No need processing. */ } /* - * setup target + * target SDTR check */ - for (i=0; itarget[i]; - - target->limit_entry = 0; - target->sync_flag = 0; - nsp32_set_async(data, target); + if (data->cur_target->sync_flag & SDTR_INITIATOR) { + /* + * SDTR negotiation pulled by the initiator has not + * finished yet. Fall back to ASYNC mode. + */ + nsp32_set_async(data, data->cur_target); + data->cur_target->sync_flag &= ~SDTR_INITIATOR; + data->cur_target->sync_flag |= SDTR_DONE; + } else if (data->cur_target->sync_flag & SDTR_TARGET) { + /* + * SDTR negotiation pulled by the target has been + * negotiating. + */ + if (execph & (MSGIN_00_VALID | MSGIN_04_VALID)) { + /* + * If valid message is received, then + * negotiation is succeeded. + */ + } else { + /* + * On the contrary, if unexpected bus free is + * occurred, then negotiation is failed. Fall + * back to ASYNC mode. + */ + nsp32_set_async(data, data->cur_target); + } + data->cur_target->sync_flag &= ~SDTR_TARGET; + data->cur_target->sync_flag |= SDTR_DONE; } /* - * EEPROM check + * It is always ensured by SCSI standard that initiator + * switches into Bus Free Phase after + * receiving message 00 (Command Complete), 04 (Disconnect). + * It's the reason that processing here is valid. */ - ret = nsp32_getprom_param(data); - if (ret == FALSE) { - data->resettime = 3; /* default 3 */ + if (execph & MSGIN_00_VALID) { + /* MsgIn 00: Command Complete */ + nsp32_dbg(NSP32_DEBUG_BUSFREE, "command complete"); + + SCpnt->SCp.Status = nsp32_read1(base, SCSI_CSB_IN); + SCpnt->SCp.Message = 0; + nsp32_dbg(NSP32_DEBUG_BUSFREE, + "normal end stat=0x%x resid=0x%x\n", + SCpnt->SCp.Status, SCpnt->resid); + SCpnt->result = (DID_OK << 16) | + (SCpnt->SCp.Message << 8) | + (SCpnt->SCp.Status << 0); + nsp32_scsi_done(SCpnt); + /* All operation is done */ + return TRUE; + } else if (execph & MSGIN_04_VALID) { + /* MsgIn 04: Disconnect */ + SCpnt->SCp.Status = nsp32_read1(base, SCSI_CSB_IN); + SCpnt->SCp.Message = 4; + + nsp32_dbg(NSP32_DEBUG_BUSFREE, "disconnect"); + return TRUE; + } else { + /* Unexpected bus free */ + nsp32_msg(KERN_WARNING, "unexpected bus free occurred"); + + /* DID_ERROR? */ + //SCpnt->result = (DID_OK << 16) | (SCpnt->SCp.Message << 8) | (SCpnt->SCp.Status << 0); + SCpnt->result = DID_ERROR << 16; + nsp32_scsi_done(SCpnt); + return TRUE; } + return FALSE; +} - /* - * setup HBA - */ - nsp32hw_init(host); - snprintf(data->info_str, sizeof(data->info_str), - "NinjaSCSI-32Bi/UDE: irq %d, io 0x%lx+0x%x", - host->irq, host->io_port, host->n_io_port); +/* + * nsp32_adjust_busfree - adjusting SG table + * + * Note: This driver adjust the SG table using SCSI ACK + * counter instead of BMCNT counter! + */ +static void nsp32_adjust_busfree(Scsi_Cmnd *SCpnt, unsigned int s_sacklen) +{ + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + int old_entry = data->cur_entry; + int new_entry; + int sg_num = data->cur_lunt->sg_num; + nsp32_sgtable *sgt = data->cur_lunt->sglun->sgt; + unsigned int restlen, sentlen; + u32 len, addr; - sht->name = data->info_str; + nsp32_dbg(NSP32_DEBUG_SGLIST, "old resid=0x%x", SCpnt->resid); + + /* adjust saved SACK count with 4 byte start address boundary */ + s_sacklen -= le32_to_cpu(sgt[old_entry].addr) & 3; /* - * SCSI bus reset - * - * Note: It's important to reset SCSI bus in initialization phase. - * NinjaSCSI-32Bi/UDE HBA EEPROM seems to exchange SDTR when system is - * coming up, so SCSI devices connected to HBA is set as - * un-asynchronous mode. It brings the merit that this HBA is - * ready to start synchronous transfer without any preparation, - * but we are difficult to control transfer speed. In addition, - * it prevents device transfer speed from effecting EEPROM start-up - * SDTR. NinjaSCSI-32Bi/UDE has the feature if EEPROM is set as Auto - * Mode, then FAST-10M is selected when SCSI devices are connected - * same or more than 4 devices. It should be avoided depending on - * this specification Thus, resetting the SCSI bus restores all - * connected SCSI devices to asynchronous mode, then this driver - * put SDTR safely later, and we can control all SCSI device - * transfer mode. + * calculate new_entry from sack count and each sgt[].len + * calculate the byte which is intent to send */ - nsp32_do_bus_reset(data); + sentlen = 0; + for (new_entry = old_entry; new_entry < sg_num; new_entry++) { + sentlen += (le32_to_cpu(sgt[new_entry].len) & ~SGTEND); + if (sentlen > s_sacklen) { + break; + } + } - ret = request_irq(host->irq, do_nsp32_isr, SA_SHIRQ, "nsp32", data); - if (ret < 0) { - nsp32_msg(KERN_ERR, "Unable to allocate IRQ for NSP32 " - "SCSI PCI controller. Interrupt: %d\n", host->irq); - goto free_sg_list; + /* all sgt is processed */ + if (new_entry == sg_num) { + goto last; } - /* - * PCI IO register - */ - if(!request_region(host->io_port, host->n_io_port, "nsp32")) { - nsp32_msg(KERN_ERR, - "I/O region 0x%lx+0x%lx is already used", - data->BaseAddress, data->length); - goto free_irq; - } + if (sentlen == s_sacklen) { + /* XXX: confirm it's ok or not */ + /* In this case, it's ok because we are at + the head element of the sg. restlen is correctly calculated. */ + } - return 1; + /* calculate the rest length for transfering */ + restlen = sentlen - s_sacklen; - free_irq: - free_irq(host->irq, data); - - free_autoparam: - pci_free_consistent(data->Pci, AUTOPARAM_SIZE, data->autoparam, data->apaddr); - - free_sg_list: - pci_free_consistent(data->Pci, - (sizeof(struct nsp32_sgtable) * NSP_SG_SIZE * MAX_TARGET * MAX_LUN), - data->sg_list, data->sgaddr); - - kfree_lunt: - kfree(data->lunt_list); - - scsi_unregister: - scsi_unregister(host); - - err: - return 0; -} - -static int nsp32_release(struct Scsi_Host *shpnt) -{ - nsp32_hw_data *data = (nsp32_hw_data *)shpnt->hostdata; - - if (data->lunt_list) { - kfree(data->lunt_list); - } - - if (data->autoparam) { - pci_free_consistent(data->Pci, AUTOPARAM_SIZE, - data->autoparam, data->apaddr); - } - - if (data->sg_list) { - pci_free_consistent(data->Pci, - (sizeof(struct nsp32_sgtable) * NSP_SG_SIZE * MAX_TARGET * MAX_LUN), - data->sg_list, data->sgaddr); - } - - DEBUG(0, "free irq\n"); - if (shpnt->irq) { - free_irq(shpnt->irq, data); - } + /* update adjusting current SG table entry */ + len = le32_to_cpu(sgt[new_entry].len); + addr = le32_to_cpu(sgt[new_entry].addr); + addr += (len - restlen); + sgt[new_entry].addr = cpu_to_le32(addr); + sgt[new_entry].len = cpu_to_le32(restlen); - DEBUG(0, "free io\n"); - if (shpnt->io_port && shpnt->n_io_port) { - release_region(shpnt->io_port, shpnt->n_io_port); - } + /* set cur_entry with new_entry */ + data->cur_entry = new_entry; + + return; - if (data->MmioAddress != 0) { - iounmap((void *)(data->MmioAddress)); + last: + if (SCpnt->resid < sentlen) { + nsp32_msg(KERN_ERR, "resid underflow"); } - return 0; -} + SCpnt->resid -= sentlen; + nsp32_dbg(NSP32_DEBUG_SGLIST, "new resid=0x%x", SCpnt->resid); -static const char *nsp32_info(struct Scsi_Host *shpnt) -{ - nsp32_hw_data *data = (nsp32_hw_data *)shpnt->hostdata; + /* update hostdata and lun */ - return data->info_str; + return; } /* - * error handler + * It's called MsgOut phase occur. + * NinjaSCSI-32Bi/UDE automatically processes up to 3 messages in + * message out phase. It, however, has more than 3 messages, + * HBA creates the interrupt and we have to process by hand. */ -static int nsp32_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags) +static void nsp32_msgout_occur(Scsi_Cmnd *SCpnt) { - nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%p why=%d\n", SCpnt, reset_flags); + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = SCpnt->device->host->io_port; + //unsigned short command; + long new_sgtp; + int i; + + nsp32_dbg(NSP32_DEBUG_MSGOUTOCCUR, + "enter: msgout_len: 0x%x", data->msgout_len); - nsp32_eh_bus_reset(SCpnt); + /* + * If MsgOut phase is occurred without having any + * message, then No_Operation is sent (SCSI-2). + */ + if (data->msgout_len == 0) { + nsp32_build_nop(SCpnt); + } - return SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET; -} + /* + * Set SGTP ADDR current entry for restarting AUTOSCSI, + * because SGTP is incremented next point. + * There is few statement in the specification... + */ + new_sgtp = data->cur_lunt->sglun_paddr + + (data->cur_lunt->cur_entry * sizeof(nsp32_sgtable)); -static int nsp32_eh_abort(Scsi_Cmnd *SCpnt) -{ - nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->host->hostdata; - unsigned int base = data->BaseAddress; + /* + * send messages + */ + for (i = 0; i < data->msgout_len; i++) { + nsp32_dbg(NSP32_DEBUG_MSGOUTOCCUR, + "%d : 0x%x", i, data->msgoutbuf[i]); - nsp32_msg(KERN_WARNING, "abort"); + /* + * Check REQ is asserted. + */ + nsp32_wait_req(data, ASSERT); - if (data->curlunt->SCpnt == NULL) { - return (FAILED); - } + if (i == (data->msgout_len - 1)) { + /* + * If the last message, set the AutoSCSI restart + * before send back the ack message. AutoSCSI + * restart automatically negate ATN signal. + */ + //command = (AUTO_MSGIN_00_OR_04 | AUTO_MSGIN_02); + //nsp32_restart_autoscsi(SCpnt, command); + nsp32_write2(base, COMMAND_CONTROL, + (CLEAR_CDB_FIFO_POINTER | + AUTO_COMMAND_PHASE | + AUTOSCSI_RESTART | + AUTO_MSGIN_00_OR_04 | + AUTO_MSGIN_02 )); + } + /* + * Write data with SACK, then wait sack is + * automatically negated. + */ + nsp32_write1(base, SCSI_DATA_WITH_ACK, data->msgoutbuf[i]); + nsp32_wait_sack(data, NEGATE); - if (data->curtarget->sync_flag & (SDTR_INITIATOR | SDTR_TARGET)) { - /* reset SDTR negotiation */ - data->curtarget->sync_flag = 0; - } + nsp32_dbg(NSP32_DEBUG_MSGOUTOCCUR, "bus: 0x%x\n", + nsp32_read1(base, SCSI_BUS_MONITOR)); + }; - nsp32_write2(base, TRANSFER_CONTROL, 0); - nsp32_write2(base, BM_CNT, 0); + data->msgout_len = 0; - return (FAILED); + nsp32_dbg(NSP32_DEBUG_MSGOUTOCCUR, "exit"); } -static int nsp32_eh_bus_reset(Scsi_Cmnd *SCpnt) +/* + * Restart AutoSCSI + * + * Note: Restarting AutoSCSI needs set: + * SYNC_REG, ACK_WIDTH, SGT_ADR, TRANSFER_CONTROL + */ +static void nsp32_restart_autoscsi(Scsi_Cmnd *SCpnt, unsigned short command) { - nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->host->hostdata; - unsigned int base = data->BaseAddress; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = data->BaseAddress; + unsigned short transfer = 0; - nsp32_msg(KERN_INFO, "Bus Reset"); - nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%x", SCpnt); + nsp32_dbg(NSP32_DEBUG_RESTART, "enter"); - nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK); - nsp32_do_bus_reset(data); - nsp32_write2(base, IRQ_CONTROL, 0); + if (data->cur_target == NULL || data->cur_lunt == NULL) { + nsp32_msg(KERN_ERR, "Target or Lun is invalid"); + } - return SUCCESS; /* SCSI bus reset is succeeded at any time. */ -} + /* + * set SYNC_REG + * Don't set BM_START_ADR before setting this register. + */ + nsp32_write1(base, SYNC_REG, data->cur_target->syncreg); -static void nsp32_do_bus_reset(nsp32_hw_data *data) -{ - unsigned int base = data->BaseAddress; - unsigned short intrdat; - int i; + /* + * set ACKWIDTH + */ + nsp32_write1(base, ACK_WIDTH, data->cur_target->ackwidth); /* - * stop all transfer - * clear TRANSFERCONTROL_BM_START - * clear counter + * set SREQ hazard killer sampling rate */ - nsp32_write2(base, TRANSFER_CONTROL, 0); - nsp32_write4(base, BM_CNT, 0); - nsp32_write4(base, CLR_COUNTER, CLRCOUNTER_ALLMASK); + nsp32_write1(base, SREQ_SMPL_RATE, data->cur_target->sample_reg); /* - * fall back to asynchronous transfer mode - * initialize SDTR negotiation flag + * set SGT ADDR (physical address) */ - for (i=0; itarget[i]; + nsp32_write4(base, SGT_ADR, data->cur_lunt->sglun_paddr); - target->sync_flag = 0; - nsp32_set_async(data, target); + /* + * set TRANSFER CONTROL REG + */ + transfer = 0; + transfer |= (TRANSFER_GO | ALL_COUNTER_CLR); + if (data->trans_method & NSP32_TRANSFER_BUSMASTER) { + if (SCpnt->request_bufflen > 0) { + transfer |= BM_START; + } + } else if (data->trans_method & NSP32_TRANSFER_MMIO) { + transfer |= CB_MMIO_MODE; + } else if (data->trans_method & NSP32_TRANSFER_PIO) { + transfer |= CB_IO_MODE; } + nsp32_write2(base, TRANSFER_CONTROL, transfer); /* - * reset SCSI bus + * restart AutoSCSI + * + * TODO: COMMANDCONTROL_AUTO_COMMAND_PHASE is needed ? */ - nsp32_write1(base, SCSI_BUS_CONTROL, BUSCTL_RST); - udelay(RESET_HOLD_TIME); - nsp32_write1(base, SCSI_BUS_CONTROL, 0); - for(i = 0; i < 5; i++) { - intrdat = nsp32_read2(base, IRQ_STATUS); /* dummy read */ - nsp32_dbg(NSP32_DEBUG_BUSRESET, "irq:1: 0x%x", intrdat); - } + command |= (CLEAR_CDB_FIFO_POINTER | + AUTO_COMMAND_PHASE | + AUTOSCSI_RESTART ); + nsp32_write2(base, COMMAND_CONTROL, command); - data->CurrentSC = NULL; + nsp32_dbg(NSP32_DEBUG_RESTART, "exit"); } -static int nsp32_eh_host_reset(Scsi_Cmnd *SCpnt) -{ - struct Scsi_Host *host = SCpnt->host; - nsp32_hw_data *data = (nsp32_hw_data *)host->hostdata; - unsigned int base = data->BaseAddress; - - nsp32_msg(KERN_INFO, "Host Reset"); - nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%x", SCpnt); - - nsp32hw_init(host); - nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK); - nsp32_do_bus_reset(data); - nsp32_write2(base, IRQ_CONTROL, 0); - - return SUCCESS; /* Host reset is succeeded at any time. */ -} /* - * PCI/Cardbus probe/remove routine + * cannot run automatically message in occur */ -static int __devinit nsp32_probe(struct pci_dev *pdev, const struct pci_device_id *id) -{ - int ret; - nsp32_hw_data *data = &nsp32_data_base; - - nsp32_dbg(NSP32_DEBUG_REGISTER, "enter"); +static void nsp32_msgin_occur(Scsi_Cmnd *SCpnt, + unsigned long irq_status, + unsigned short execph) +{ + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = SCpnt->device->host->io_port; + unsigned char msg; + unsigned char msgtype; + unsigned char newlun; + unsigned short command = 0; + int msgclear = TRUE; + long new_sgtp; + int ret; - ret = pci_enable_device(pdev); - if (ret) { - nsp32_msg(KERN_ERR, "failed to enable pci device"); - return ret; - } + /* + * read first message + * Use SCSIDATA_W_ACK instead of SCSIDATAIN, because the procedure + * of Message-In have to be processed before sending back SCSI ACK. + */ + msg = nsp32_read1(base, SCSI_DATA_IN); + data->msginbuf[(unsigned char)data->msgin_len] = msg; + msgtype = data->msginbuf[0]; + nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, + "enter: msglen: 0x%x msgin: 0x%x msgtype: 0x%x", + data->msgin_len, msg, msgtype); - data->Pci = pdev; - data->pci_devid = id; - data->IrqNumber = pdev->irq; - data->BaseAddress = pci_resource_start(pdev, 0); - data->NumAddress = pci_resource_len(pdev, 0); - data->MmioAddress = (unsigned long)ioremap_nocache( - pci_resource_start(pdev, 1), pci_resource_len(pdev, 1)); + /* + * TODO: We need checking whether bus phase is message in? + */ - pci_set_master(pdev); + /* + * assert SCSI ACK + */ + nsp32_sack_assert(data); -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) - scsi_register_host(&driver_template); -#else - scsi_register_module(MODULE_SCSI_HA, &driver_template); -#endif + /* + * processing IDENTIFY + */ + if (msgtype & 0x80) { + if (!(irq_status & IRQSTATUS_RESELECT_OCCUER)) { + /* Invalid (non reselect) phase */ + goto reject; + } - nsp32_msg(KERN_INFO, "nsp32 irq: %i mmio: 0x%lx slot: %s model: %s", - pdev->irq, data->MmioAddress, pdev->slot_name, - nsp32_model[id->driver_data]); + newlun = msgtype & 0x1f; /* TODO: SPI-3 compliant? */ + ret = nsp32_reselection(SCpnt, newlun); + if (ret == TRUE) { + goto restart; + } else { + goto reject; + } + } + + /* + * processing messages except for IDENTIFY + * + * TODO: Messages are all SCSI-2 terminology. SCSI-3 compliance is TODO. + */ + switch (msgtype) { + /* + * 1-byte message + */ + case COMMAND_COMPLETE: + case DISCONNECT: + /* + * These messages should not be occurred. + * They should be processed on AutoSCSI sequencer. + */ + nsp32_msg(KERN_WARNING, + "unexpected message of AutoSCSI MsgIn: 0x%x", msg); + break; + + case RESTORE_POINTERS: + /* + * AutoMsgIn03 is disabled, and HBA gets this message. + */ - nsp32_dbg(NSP32_DEBUG_REGISTER, "exit"); + if ((execph & DATA_IN_PHASE) || (execph & DATA_OUT_PHASE)) { + unsigned int s_sacklen; - return 0; -} + s_sacklen = nsp32_read4(base, SAVED_SACK_CNT); + if ((execph & MSGIN_02_VALID) && (s_sacklen > 0)) { + nsp32_adjust_busfree(SCpnt, s_sacklen); + } else { + /* No need to rewrite SGT */ + } + } + data->cur_lunt->msgin03 = FALSE; -static void __devexit nsp32_remove(struct pci_dev *pdev) -{ - nsp32_dbg(NSP32_DEBUG_REGISTER, "enter"); - -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) - scsi_unregister_host(&driver_template); -#else - scsi_unregister_module(MODULE_SCSI_HA, &driver_template); -#endif -} + /* Update with the new value */ -static struct pci_device_id nsp32_pci_table[] __devinitdata = { - { - vendor: PCI_VENDOR_ID_IODATA, - device: PCI_DEVICE_ID_NINJASCSI_32BI_CBSC_II, - subvendor: PCI_ANY_ID, - subdevice: PCI_ANY_ID, - driver_data: MODEL_IODATA, - }, - { - vendor: PCI_VENDOR_ID_WORKBIT, - device: PCI_DEVICE_ID_NINJASCSI_32BI_KME, - subvendor: PCI_ANY_ID, - subdevice: PCI_ANY_ID, - driver_data: MODEL_KME, - }, - { - vendor: PCI_VENDOR_ID_WORKBIT, - device: PCI_DEVICE_ID_NINJASCSI_32BI_WBT, - subvendor: PCI_ANY_ID, - subdevice: PCI_ANY_ID, - driver_data: MODEL_WORKBIT, - }, - { - vendor: PCI_VENDOR_ID_WORKBIT, - device: PCI_DEVICE_ID_WORKBIT_STANDARD, - subvendor: PCI_ANY_ID, - subdevice: PCI_ANY_ID, - driver_data: MODEL_PCI_WORKBIT, - }, - { - vendor: PCI_VENDOR_ID_WORKBIT, - device: PCI_DEVICE_ID_NINJASCSI_32BI_LOGITEC, - subvendor: PCI_ANY_ID, - subdevice: PCI_ANY_ID, - driver_data: MODEL_EXT_ROM, - }, - { - vendor: PCI_VENDOR_ID_WORKBIT, - device: PCI_DEVICE_ID_NINJASCSI_32BIB_LOGITEC, - subvendor: PCI_ANY_ID, - subdevice: PCI_ANY_ID, - driver_data: MODEL_PCI_LOGITEC, - }, - { - vendor: PCI_VENDOR_ID_WORKBIT, - device: PCI_DEVICE_ID_NINJASCSI_32UDE_MELCO, - subvendor: PCI_ANY_ID, - subdevice: PCI_ANY_ID, - driver_data: MODEL_PCI_MELCO, - }, - {0,0,}, -}; -MODULE_DEVICE_TABLE(pci, nsp32_pci_table); + /* reset SACK/SavedACK counter (or ALL clear?) */ + nsp32_write4(base, CLR_COUNTER, CLRCOUNTER_ALLMASK); -static struct pci_driver nsp32_driver = { - .name = "nsp32", - .id_table = nsp32_pci_table, - .probe = nsp32_probe, - .remove = __devexit_p(nsp32_remove), -#ifdef CONFIG_PM -/* .suspend = nsp32_suspend,*/ -/* .resume = nsp32_resume,*/ -#endif -}; + /* + * set new sg pointer + */ + new_sgtp = data->cur_lunt->sglun_paddr + + (data->cur_lunt->cur_entry * sizeof(nsp32_sgtable)); + nsp32_write4(base, SGT_ADR, new_sgtp); -static int __init init_nsp32(void) { - return pci_module_init(&nsp32_driver); -} + break; -static void __exit exit_nsp32(void) { - pci_unregister_driver(&nsp32_driver); -} + case SAVE_POINTERS: + /* + * These messages should not be occurred. + * They should be processed on AutoSCSI sequencer. + */ + nsp32_msg (KERN_WARNING, + "unexpected message of AutoSCSI MsgIn: SAVE_POINTERS"); + + break; + + case MESSAGE_REJECT: + /* If previous message_out is sending SDTR, and get + message_reject from target, SDTR negotiation is failed */ + if (data->cur_target->sync_flag & + (SDTR_INITIATOR | SDTR_TARGET)) { + /* + * Current target is negotiating SDTR, but it's + * failed. Fall back to async transfer mode, and set + * SDTR_DONE. + */ + nsp32_set_async(data, data->cur_target); + data->cur_target->sync_flag &= ~SDTR_INITIATOR; + data->cur_target->sync_flag |= SDTR_DONE; -module_init(init_nsp32); -module_exit(exit_nsp32); + } + break; + case LINKED_CMD_COMPLETE: + case LINKED_FLG_CMD_COMPLETE: + /* queue tag is not supported currently */ + nsp32_msg (KERN_WARNING, + "unsupported message: 0x%x", msgtype); + break; -/* - * Reset parameters and call scsi_done for data->curlunt. - * Be careful setting SCpnt->result = DID_* before calling this function. - */ -static void nsp32_scsi_done(nsp32_hw_data *data, Scsi_Cmnd *SCpnt) -{ - unsigned int base = data->BaseAddress; + case INITIATE_RECOVERY: + /* staring ECA (Extended Contingent Allegiance) state. */ + /* This message is declined in SPI2 or later. */ + + goto reject; /* - * unmap pci + * 2-byte message */ - if (SCpnt->request_bufflen == 0) { - goto skip; + case SIMPLE_QUEUE_TAG: + case 0x23: + /* + * 0x23: Ignore_Wide_Residue is not declared in scsi.h. + * No support is needed. + */ + if (data->msgin_len >= 1) { + goto reject; + } + + /* current position is 1-byte of 2 byte */ + msgclear = FALSE; + + break; + + /* + * extended message + */ + case EXTENDED_MESSAGE: + if (data->msgin_len < 1) { + /* + * Current position does not reach 2-byte + * (2-byte is extended message length). + */ + msgclear = FALSE; + break; + } + + if ((data->msginbuf[1] + 1) > data->msgin_len) { + /* + * Current extended message has msginbuf[1] + 2 + * (msgin_len starts counting from 0, so buf[1] + 1). + * If current message position is not finished, + * continue receiving message. + */ + msgclear = FALSE; + break; + } + + /* + * Reach here means regular length of each type of + * extended messages. + */ + switch (data->msginbuf[2]) { + case EXTENDED_MODIFY_DATA_POINTER: + /* TODO */ + goto reject; /* not implemented yet */ + break; + + case EXTENDED_SDTR: + /* + * Exchange this message between initiator and target. + */ + if (data->msgin_len != EXTENDED_SDTR_LEN + 1) { + /* + * received inappropriate message. + */ + goto reject; + break; + } + + nsp32_analyze_sdtr(SCpnt); + + break; + + case EXTENDED_EXTENDED_IDENTIFY: + /* SCSI-I only, not supported. */ + goto reject; /* not implemented yet */ + + break; + + case EXTENDED_WDTR: + goto reject; /* not implemented yet */ + + break; + + default: + goto reject; + } + break; + + default: + goto reject; } - if (SCpnt->use_sg) { - pci_unmap_sg(data->Pci, - (struct scatterlist *)SCpnt->buffer, - SCpnt->use_sg, - scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + restart: + if (msgclear == TRUE) { + data->msgin_len = 0; + + /* + * If restarting AutoSCSI, but there are some message to out + * (msgout_len > 0), set AutoATN, and set SCSIMSGOUT as 0 + * (MSGOUT_VALID = 0). When commandcontrol is written with + * AutoSCSI restart, at the same time MsgOutOccur should be + * happened (however, such situation is really possible...?). + */ + if (data->msgout_len > 0) { + nsp32_write4(base, SCSI_MSG_OUT, 0); + command |= AUTO_ATN; + } + + /* + * restart AutoSCSI + * If it's failed, COMMANDCONTROL_AUTO_COMMAND_PHASE is needed. + */ + command |= (AUTO_MSGIN_00_OR_04 | AUTO_MSGIN_02); + + /* + * If current msgin03 is TRUE, then flag on. + */ + if (data->cur_lunt->msgin03 == TRUE) { + command |= AUTO_MSGIN_03; + } + data->cur_lunt->msgin03 = FALSE; } else { - pci_unmap_single(data->Pci, - (u32)SCpnt->SCp.have_data_in, - SCpnt->request_bufflen, - scsi_to_pci_dma_dir(SCpnt->sc_data_direction)); + data->msgin_len++; } - skip: /* - * clear TRANSFERCONTROL_BM_START + * restart AutoSCSI */ - nsp32_write2(base, TRANSFER_CONTROL, 0); - nsp32_write4(base, BM_CNT, 0); + nsp32_restart_autoscsi(SCpnt, command); /* - * call scsi_done + * wait SCSI REQ negate for REQ-ACK handshake */ - (*SCpnt->scsi_done)(SCpnt); + nsp32_wait_req(data, NEGATE); /* - * reset parameters + * negate SCSI ACK */ - data->curlunt->SCpnt = NULL; - data->curlunt = NULL; - data->curtarget = NULL; - data->CurrentSC = NULL; -} + nsp32_sack_negate(data); + + nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "exit"); + + return; + + reject: + nsp32_msg(KERN_WARNING, + "invalid or unsupported MessageIn, rejected. " + "current msg: 0x%x (len: 0x%x), processing msg: 0x%x", + msg, data->msgin_len, msgtype); + nsp32_build_reject(SCpnt); + data->msgin_len = 0; + goto restart; +} /* - * Bus Free Occur - * - * Current Phase is BUSFREE. AutoSCSI is automatically execute BUSFREE phase - * with ACK reply when below condition is matched: - * MsgIn 00: Command Complete. - * MsgIn 02: Save Data Pointer. - * MsgIn 04: Diconnect. - * In other case, unexpected BUSFREE is detected. + * */ -static int nsp32_busfree_occur(nsp32_hw_data *data, unsigned short execph) +static void nsp32_analyze_sdtr(Scsi_Cmnd *SCpnt) { - Scsi_Cmnd *SCpnt = data->curlunt->SCpnt; - unsigned int base = data->BaseAddress; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + nsp32_target *target = data->cur_target; + nsp32_sync_table *synct; + unsigned char get_period = data->msginbuf[3]; + unsigned char get_offset = data->msginbuf[4]; + int entry; + int syncnum; - nsp32_dbg(NSP32_DEBUG_BUSFREE, "enter"); + nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "enter"); - nsp32_write4(base, BM_CNT, 0); - nsp32_write2(base, TRANSFER_CONTROL, 0); + synct = data->synct; + syncnum = data->syncnum; /* - * MsgIn 02: Save Data Pointer - * - * VALID: - * Save Data Pointer is received. Adjust pointer. - * - * NO-VALID: - * SCSI-3 says if Save Data Pointer is not received, then we restart - * processing and we can't adjust any SCSI data pointer in next data - * phase. - */ - if (execph & MSGIN_02_VALID) { - nsp32_dbg(NSP32_DEBUG_BUSFREE, "MsgIn02_Valid"); - + * If this inititor sent the SDTR message, then target responds SDTR, + * initiator SYNCREG, ACKWIDTH from SDTR parameter. + * Messages are not appropriate, then send back reject message. + * If initiator did not send the SDTR, but target sends SDTR, + * initiator calculator the appropriate parameter and send back SDTR. + */ + if (target->sync_flag & SDTR_INITIATOR) { /* - * Check sack_cnt/saved_sack_cnt, then adjust sg table if - * needed. + * Initiator sent SDTR, the target responds and + * send back negotiation SDTR. */ - if (!(execph & MSGIN_00_VALID) && - ((execph & DATA_IN_PHASE) || (execph & DATA_OUT_PHASE))) { - unsigned int sacklen, s_sacklen; + nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "target responds SDTR"); + + target->sync_flag &= ~SDTR_INITIATOR; + target->sync_flag |= SDTR_DONE; + /* + * offset: + */ + if (get_offset > MAX_OFFSET) { /* - * Read SACK count and SAVEDSACK count, then compare. + * Negotiation is failed, the target send back + * unexpected offset value. */ - sacklen = nsp32_read4(base, SACK_CNT); - s_sacklen = nsp32_read4(base, SAVED_SACK_CNT); + goto reject; + } + + if (get_offset == ASYNC_OFFSET) { + /* + * Negotiation is succeeded, the target want + * to fall back into asynchronous transfer mode. + */ + goto async; + } + /* + * period: + * Check whether sync period is too short. If too short, + * fall back to async mode. If it's ok, then investigate + * the received sync period. If sync period is acceptable + * between sync table start_period and end_period, then + * set this I_T nexus as sent offset and period. + * If it's not acceptable, send back reject and fall back + * to async mode. + */ + if (get_period < data->synct[0].period_num) { /* - * If SAVEDSACKCNT == 0, it means SavedDataPointer is - * come after data transfering. + * Negotiation is failed, the target send back + * unexpected period value. */ - if (s_sacklen > 0) { - /* - * Comparing between sack and savedsack to - * check the condition of AutoMsgIn03. - * - * If they are same, set msgin03 == TRUE, - * COMMANDCONTROL_AUTO_MSGIN_03 is enabled at - * reselection. On the other hand, if they - * aren't same, set msgin03 == FALSE, and - * COMMANDCONTROL_AUTO_MSGIN_03 is disabled at - * reselection. - */ - if (sacklen != s_sacklen) { - data->curlunt->msgin03 = FALSE; - } else { - data->curlunt->msgin03 = TRUE; - } + goto reject; + } - nsp32_adjust_busfree(data, s_sacklen); - } + entry = nsp32_search_period_entry(data, target, get_period); + + if (entry < 0) { + /* + * Target want to use long period which is not + * acceptable NinjaSCSI-32Bi/UDE. + */ + goto reject; } - /* This value has not substitude with valid value yet... */ - //data->curlunt->save_datp = data->cur_datp; - } else { /* - * no processing. + * Set new sync table and offset in this I_T nexus. */ - } + nsp32_set_sync_entry(data, target, entry, get_offset); + } else { + /* Target send SDTR to initiator. */ + nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "target send SDTR"); - if (execph & MSGIN_03_VALID) { - /* MsgIn03 was valid to be processed. No need processing. */ - } + target->sync_flag |= SDTR_INITIATOR; - /* - * target SDTR check - */ - if (data->curtarget->sync_flag & SDTR_INITIATOR) { - /* - * SDTR negotiation pulled by the initiator has not - * finished yet. Fall back to ASYNC mode. - */ - nsp32_set_async(data, data->curtarget); - data->curtarget->sync_flag &= ~SDTR_INITIATOR; - data->curtarget->sync_flag |= SDTR_DONE; - } else if (data->curtarget->sync_flag & SDTR_TARGET) { - /* - * SDTR negotiation pulled by the target has been - * negotiating. - */ - if (execph & (MSGIN_00_VALID | MSGIN_04_VALID)) { - /* - * If valid message is received, then - * negotiation is succeeded. - */ + /* offset: */ + if (get_offset > MAX_OFFSET) { + /* send back as MAX_OFFSET */ + get_offset = MAX_OFFSET; + } + + /* period: */ + if (get_period < data->synct[0].period_num) { + get_period = data->synct[0].period_num; + } + + entry = nsp32_search_period_entry(data, target, get_period); + + if (get_offset == ASYNC_OFFSET || entry < 0) { + nsp32_set_async(data, target); + nsp32_build_sdtr(SCpnt, 0, ASYNC_OFFSET); } else { - /* - * On the contrary, if unexpected bus free is - * occured, then negotiation is failed. Fall - * back to ASYNC mode. - */ - nsp32_set_async(data, data->curtarget); + nsp32_set_sync_entry(data, target, entry, get_offset); + nsp32_build_sdtr(SCpnt, get_period, get_offset); } - data->curtarget->sync_flag &= ~SDTR_TARGET; - data->curtarget->sync_flag |= SDTR_DONE; } - + + target->period = get_period; + nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "exit"); + return; + + reject: /* - * It is always ensured by SCSI standard that initiator - * switches into Bus Free Phase after - * receiving message 00 (Command Complete), 04 (Disconnect). - * It's the reason that processing here is valid. + * If the current message is unacceptable, send back to the target + * with reject message. */ - if (execph & MSGIN_00_VALID) { - /* MsgIn 00: Command Complete */ - nsp32_dbg(NSP32_DEBUG_BUSFREE, "command complete"); + nsp32_build_reject(SCpnt); - SCpnt->SCp.Status = nsp32_read1(base, SCSI_CSB_IN); - SCpnt->SCp.Message = 0; - nsp32_dbg(NSP32_DEBUG_BUSFREE, - "normal end stat=0x%x resid=0x%x\n", - SCpnt->SCp.Status, SCpnt->resid); - SCpnt->result = - (DID_OK << 16) | (SCpnt->SCp.Message << 8) | (SCpnt->SCp.Status << 0); - nsp32_scsi_done(data, SCpnt); - /* All operation is done */ - return (TRUE); - } else if (execph & MSGIN_04_VALID) { - /* MsgIn 04: Disconnect */ - SCpnt->SCp.Status = nsp32_read1(base, SCSI_CSB_IN); - SCpnt->SCp.Message = 4; - - nsp32_dbg(NSP32_DEBUG_BUSFREE, "disconnect"); - return (TRUE); - } else { - /* Unexpected bus free */ - nsp32_msg(KERN_WARNING, "unexpected bus free occured"); + async: + nsp32_set_async(data, target); /* set as ASYNC transfer mode */ - /* DID_ERROR? */ - //SCpnt->result = (DID_OK << 16) | (SCpnt->SCp.Message << 8) | (SCpnt->SCp.Status << 0); - SCpnt->result = DID_ERROR << 16; - nsp32_scsi_done(data, SCpnt); - return (TRUE); - } - return (FALSE); + target->period = 0; + nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "exit: set async"); + return; } /* - * nsp32_adjust_busfree - adjusting SG table - * - * Note: This driver adjust the SG table using SCSI ACK - * counter instead of BMCNT counter! + * Search config entry number matched in sync_table from given + * target and speed period value. If failed to search, return negative value. */ -static void nsp32_adjust_busfree(nsp32_hw_data *data, unsigned int s_sacklen) +static int nsp32_search_period_entry(nsp32_hw_data *data, + nsp32_target *target, + unsigned char period) { - int old_entry = data->cur_entry; - int new_entry; - struct nsp32_sgtable *sgt = data->curlunt->sglun->sgt; - unsigned int restlen, sentlen; - int sg_num = data->curlunt->sg_num; + int i; - /* adjust saved SACK count with 4 byte start address boundary */ - s_sacklen -= sgt[old_entry].addr & 3; + if (target->limit_entry >= data->syncnum) { + nsp32_msg(KERN_ERR, "limit_entry exceeds syncnum!"); + target->limit_entry = 0; + } - /* - * calculate new_entry from sack count and each sgt[].len - * calculate the byte which is intent to send - */ - sentlen = 0; - for (new_entry = old_entry; new_entry < sg_num; new_entry++) { - sentlen += (sgt[new_entry].len & ~NSP32_SG_END_SGT); - if (sentlen > s_sacklen) { - break; + for (i = target->limit_entry; i < data->syncnum; i++) { + if (period >= data->synct[i].start_period && + period <= data->synct[i].end_period) { + break; } } - /* all sgt is processed */ - if (new_entry == sg_num) { - goto last; + /* + * Check given period value is over the sync_table value. + * If so, return max value. + */ + if (i == data->syncnum) { + i = -1; } - if (sentlen == s_sacklen) { - /* XXX: confirm it's ok or not */ - /* In this case, it's ok because we are at - the head element of the sg. restlen is correctly calculated. */ - } + return i; +} - /* calculate the rest length for transfering */ - restlen = sentlen - s_sacklen; - - /* update adjusting current SG table entry */ - sgt[new_entry].addr += (sgt[new_entry].len - restlen); - sgt[new_entry].len = restlen; - /* set cur_entry with new_entry */ - data->cur_entry = new_entry; - - return; +/* + * target <-> initiator use ASYNC transfer + */ +static void nsp32_set_async(nsp32_hw_data *data, nsp32_target *target) +{ + unsigned char period = data->synct[target->limit_entry].period_num; - last: - /* update hostdata and lun */ + target->offset = ASYNC_OFFSET; + target->period = 0; + target->syncreg = TO_SYNCREG(period, ASYNC_OFFSET); + target->ackwidth = 0; + target->sample_reg = 0; - return; + nsp32_dbg(NSP32_DEBUG_SYNC, "set async"); } /* - * It's called MsgOut phase occur. - * NinjaSCSI-32Bi/UDE automatically processes up to 3 messages in - * message out phase. It, however, has more than 3 messages, - * HBA creates the interrupt and we have to process by hand. + * target <-> initiator use maximum SYNC transfer */ -static void nsp32_msgout_occur(nsp32_hw_data *data) +static void nsp32_set_max_sync(nsp32_hw_data *data, + nsp32_target *target, + unsigned char *period, + unsigned char *offset) { - unsigned int base = data->BaseAddress; - //unsigned short command; - long new_sgtp; - int i; - - nsp32_dbg(NSP32_DEBUG_MSGOUTOCCUR, - "enter: msgoutlen: 0x%x", data->msgoutlen); + unsigned char period_num, ackwidth; - /* - * If MsgOut phase is occured without having any - * message, then No_Operation is sent (SCSI-2). - */ - if (data->msgoutlen == 0) { - nsp32_build_nop(data); - } + period_num = data->synct[target->limit_entry].period_num; + *period = data->synct[target->limit_entry].start_period; + ackwidth = data->synct[target->limit_entry].ackwidth; + *offset = MAX_OFFSET; - /* - * Set SGTP ADDR current entry for restarting AUTOSCSI, - * because SGTP is incremented next point. - * There is few statement in the specification... - */ - new_sgtp = data->curlunt->sglun_paddr - + data->curlunt->cur_entry * sizeof(struct nsp32_sgtable); + target->syncreg = TO_SYNCREG(period_num, *offset); + target->ackwidth = ackwidth; + target->offset = *offset; + target->sample_reg = 0; /* disable SREQ sampling */ +} - /* - * send messages - */ - for (i=0; imsgoutlen; i++) { - nsp32_dbg(NSP32_DEBUG_MSGOUTOCCUR, - "%d : 0x%x", i, data->msgoutbuf[i]); - /* - * Check REQ is asserted. - */ - nsp32_wait_req(data, ASSERT); +/* + * target <-> initiator use entry number speed + */ +static void nsp32_set_sync_entry(nsp32_hw_data *data, + nsp32_target *target, + int entry, + unsigned char offset) +{ + unsigned char period, ackwidth, sample_rate; + + period = data->synct[entry].period_num; + ackwidth = data->synct[entry].ackwidth; + offset = offset; + sample_rate = data->synct[entry].sample_rate; + + target->syncreg = TO_SYNCREG(period, offset); + target->ackwidth = ackwidth; + target->offset = offset; + target->sample_reg = sample_rate | SAMPLING_ENABLE; - if (i == (data->msgoutlen - 1)) { - /* - * If the last message, set the AutoSCSI restart - * before send back the ack message. AutoSCSI - * restart automatically negate ATN signal. - */ - //command = (AUTO_MSGIN_00_OR_04 | AUTO_MSGIN_02); - //nsp32_restart_autoscsi(data, command); - nsp32_write2(base, COMMAND_CONTROL, - (CLEAR_CDB_FIFO_POINTER | - AUTO_COMMAND_PHASE | - AUTOSCSI_RESTART | - AUTO_MSGIN_00_OR_04 | - AUTO_MSGIN_02 )); - } - /* - * Write data with SACK, then wait sack is - * automatically negated. - */ - nsp32_write1(base, SCSI_DATA_WITH_ACK, data->msgoutbuf[i]); - nsp32_wait_sack(data, NEGATE); - - nsp32_dbg(NSP32_DEBUG_MSGOUTOCCUR, "bus: 0x%x\n", - nsp32_read1(base, SCSI_BUS_MONITOR)); - }; - - data->msgoutlen = 0; - - nsp32_dbg(NSP32_DEBUG_MSGOUTOCCUR, "exit"); + nsp32_dbg(NSP32_DEBUG_SYNC, "set sync"); } + /* - * Restart AutoSCSI + * It waits until SCSI REQ becomes assertion or negation state. * - * Note: Restarting AutoSCSI needs set: - * SYNC_REG, ACK_WIDTH, SGT_ADR, TRANSFER_CONTROL + * Note: If nsp32_msgin_occur is called, we asserts SCSI ACK. Then + * connected target responds SCSI REQ negation. We have to wait + * SCSI REQ becomes negation in order to negate SCSI ACK signal for + * REQ-ACK handshake. */ -static void nsp32_restart_autoscsi(nsp32_hw_data *data, unsigned short command) +static void nsp32_wait_req(nsp32_hw_data *data, int state) { - unsigned int base = data->BaseAddress; - unsigned short transfer = 0; - Scsi_Cmnd *SCpnt = data->curlunt->SCpnt; + unsigned int base = data->BaseAddress; + int wait_time = 0; + unsigned char bus, req_bit; - nsp32_dbg(NSP32_DEBUG_RESTART, "enter"); - - if (data->curtarget == NULL || data->curlunt == NULL) { - nsp32_msg(KERN_ERR, "Target or Lun is invalid"); + if (!((state == ASSERT) || (state == NEGATE))) { + nsp32_msg(KERN_ERR, "unknown state designation"); } + /* REQ is BIT(5) */ + req_bit = (state == ASSERT ? BUSMON_REQ : 0); - /* - * set SYNC_REG - * Don't set BM_START_ADR before setting this register. - */ - nsp32_write1(base, SYNC_REG, data->curtarget->syncreg); - - /* - * set ACKWIDTH - */ - nsp32_write1(base, ACK_WIDTH, data->curtarget->ackwidth); - - /* - * set SGT ADDR (physical address) - */ - nsp32_write4(base, SGT_ADR, data->curlunt->sglun_paddr); - - /* - * set TRANSFER CONTROL REG - */ - transfer = 0; - transfer |= (TRANSFER_GO | ALL_COUNTER_CLR); - if (data->trans_method & NSP32_TRANSFER_BUSMASTER) { - if (SCpnt->request_bufflen > 0) { - transfer |= BM_START; + do { + bus = nsp32_read1(base, SCSI_BUS_MONITOR); + if ((bus & BUSMON_REQ) == req_bit) { + nsp32_dbg(NSP32_DEBUG_WAIT, + "wait_time: %d", wait_time); + return; } - } else if (data->trans_method & NSP32_TRANSFER_MMIO) { - transfer |= CB_MMIO_MODE; - } else if (data->trans_method & NSP32_TRANSFER_PIO) { - transfer |= CB_IO_MODE; - } - nsp32_write2(base, TRANSFER_CONTROL, transfer); - - /* - * restart AutoSCSI - * - * TODO: COMMANDCONTROL_AUTO_COMMAND_PHASE is needed ? - */ - command |= (CLEAR_CDB_FIFO_POINTER | - AUTO_COMMAND_PHASE | - AUTOSCSI_RESTART); - nsp32_write2(base, COMMAND_CONTROL, command); + udelay(1); + wait_time++; + } while (wait_time < REQSACK_TIMEOUT_TIME); - nsp32_dbg(NSP32_DEBUG_RESTART, "exit"); + nsp32_msg(KERN_WARNING, "wait REQ timeout, req_bit: 0x%x", req_bit); } - /* - * cannot run automatically message in occur + * It waits until SCSI SACK becomes assertion or negation state. */ -static void nsp32_msgin_occur(nsp32_hw_data *data, unsigned long irq_status, - unsigned short execph) +static void nsp32_wait_sack(nsp32_hw_data *data, int state) { - unsigned int base = data->BaseAddress; - unsigned char msg; - unsigned char msgtype; - unsigned char newlun; - unsigned short command = 0; - int msgclear = TRUE; - long new_sgtp; - int ret; + unsigned int base = data->BaseAddress; + int wait_time = 0; + unsigned char bus, ack_bit; - /* - * read first message - * Use SCSIDATA_W_ACK instead of SCSIDATAIN, because the procedure - * of Message-In have to be processed before sending back SCSI ACK. - */ - msg = nsp32_read1(base, SCSI_DATA_IN); - data->msginbuf[(unsigned char)data->msginlen] = msg; - msgtype = data->msginbuf[0]; - nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, - "enter: msglen: 0x%x msgin: 0x%x msgtype: 0x%x", - data->msginlen, msg, msgtype); - - /* - * TODO: We need checking whether bus phase is message in? - */ - - /* - * assert SCSI ACK - */ - nsp32_sack_assert(data); - - /* - * processing IDENTIFY - */ - if (msgtype & 0x80) { - if (!(irq_status & IRQSTATUS_RESELECT_OCCUER)) { - /* Invalid (non reselect) phase */ - goto reject; - } - - newlun = msgtype & 0x1f; /* TODO: SPI-3 compliant? */ - ret = nsp32_reselection(data, newlun); - if (ret == TRUE) { - goto restart; - } else { - goto reject; - } + if (!((state == ASSERT) || (state == NEGATE))) { + nsp32_msg(KERN_ERR, "unknown state designation"); } - - /* - * processing messages except for IDENTIFY - * - * TODO: Messages are all SCSI-2 terminology. SCSI-3 compliance is TODO. - */ - switch (msgtype) { - /* - * 1-byte message - */ - case COMMAND_COMPLETE: - case DISCONNECT: - /* - * These messages should not be occured. - * They should be processed on AutoSCSI sequencer. - */ - nsp32_msg(KERN_WARNING, - "unexpected message of AutoSCSI MsgIn: 0x%x", msg); - break; - - case RESTORE_POINTERS: - /* - * AutoMsgIn03 is disabled, and HBA gets this message. - */ + /* ACK is BIT(4) */ + ack_bit = (state == ASSERT ? BUSMON_ACK : 0); - if ((execph & DATA_IN_PHASE) || (execph & DATA_OUT_PHASE)) { - unsigned int s_sacklen; - - s_sacklen = nsp32_read4(base, SAVED_SACK_CNT); - if ((execph & MSGIN_02_VALID) && (s_sacklen > 0)) { - nsp32_adjust_busfree(data, s_sacklen); - } else { - /* No need to rewrite SGT */ - } + do { + bus = nsp32_read1(base, SCSI_BUS_MONITOR); + if ((bus & BUSMON_ACK) == ack_bit) { + nsp32_dbg(NSP32_DEBUG_WAIT, + "wait_time: %d", wait_time); + return; } - data->curlunt->msgin03 = FALSE; + udelay(1); + wait_time++; + } while (wait_time < REQSACK_TIMEOUT_TIME); - /* Update with the new value */ + nsp32_msg(KERN_WARNING, "wait SACK timeout, ack_bit: 0x%x", ack_bit); +} - /* reset SACK/SavedACK counter (or ALL clear?) */ - nsp32_write4(base, CLR_COUNTER, CLRCOUNTER_ALLMASK); +/* + * assert SCSI ACK + * + * Note: SCSI ACK assertion needs with ACKENB=1, AUTODIRECTION=1. + */ +static void nsp32_sack_assert(nsp32_hw_data *data) +{ + unsigned int base = data->BaseAddress; + unsigned char busctrl; - /* - * set new sg pointer - */ - new_sgtp = data->curlunt->sglun_paddr + - data->curlunt->cur_entry * sizeof(struct nsp32_sgtable); - nsp32_write4(base, SGT_ADR, new_sgtp); + busctrl = nsp32_read1(base, SCSI_BUS_CONTROL); + busctrl |= (BUSCTL_ACK | AUTODIRECTION | ACKENB); + nsp32_write1(base, SCSI_BUS_CONTROL, busctrl); +} - break; +/* + * negate SCSI ACK + */ +static void nsp32_sack_negate(nsp32_hw_data *data) +{ + unsigned int base = data->BaseAddress; + unsigned char busctrl; - case SAVE_POINTERS: - /* - * These messages should not be occured. - * They should be processed on AutoSCSI sequencer. - */ - nsp32_msg (KERN_WARNING, - "unexpected message of AutoSCSI MsgIn: SAVE_POINTERS"); - - break; - - case MESSAGE_REJECT: - /* If previous message_out is sending SDTR, and get - message_reject from target, SDTR negotiation is failed */ - if (data->curtarget->sync_flag & - (SDTR_INITIATOR | SDTR_TARGET)) { - /* - * Current target is negotiating SDTR, but it's - * failed. Fall back to async transfer mode, and set - * SDTR_DONE. - */ - nsp32_set_async(data, data->curtarget); - data->curtarget->sync_flag &= ~SDTR_INITIATOR; - data->curtarget->sync_flag |= SDTR_DONE; + busctrl = nsp32_read1(base, SCSI_BUS_CONTROL); + busctrl &= ~BUSCTL_ACK; + nsp32_write1(base, SCSI_BUS_CONTROL, busctrl); +} - } - break; - case LINKED_CMD_COMPLETE: - case LINKED_FLG_CMD_COMPLETE: - /* queue tag is not supported currently */ - nsp32_msg (KERN_WARNING, - "unsupported message: 0x%x", msgtype); - break; - case INITIATE_RECOVERY: - /* staring ECA (Extended Contingent Allegiance) state. */ - /* This message is declined in SPI2 or later. */ +/* + * Note: n_io_port is defined as 0x7f because I/O register port is + * assigned as: + * 0x800-0x8ff: memory mapped I/O port + * 0x900-0xbff: (map same 0x800-0x8ff I/O port image repeatedly) + * 0xc00-0xfff: CardBus status registers + */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) +#define DETECT_OK 0 +#define DETECT_NG 1 +#define PCIDEV pdev +static int nsp32_detect(struct pci_dev *pdev) +#else +#define DETECT_OK 1 +#define DETECT_NG 0 +#define PCIDEV (data->Pci) +static int nsp32_detect(Scsi_Host_Template *sht) +#endif +{ + struct Scsi_Host *host; /* registered host structure */ + struct resource *res; + nsp32_hw_data *data; + int ret; + int n_target, n_lun, i; - goto reject; + nsp32_dbg(NSP32_DEBUG_REGISTER, "enter"); /* - * 2-byte message + * register this HBA as SCSI device */ - case SIMPLE_QUEUE_TAG: - case 0x23: - /* - * 0x23: Ignore_Wide_Residue is not declared in scsi.h. - * No support is needed. - */ - if (data->msginlen >= 1) { - goto reject; - } - - /* current position is 1-byte of 2 byte */ - msgclear = FALSE; - - break; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + host = scsi_host_alloc(&nsp32_template, sizeof(nsp32_hw_data)); +#else + host = scsi_register(sht, sizeof(nsp32_hw_data)); +#endif + if (host == NULL) { + nsp32_msg (KERN_ERR, "failed to scsi register"); + goto err; + } /* - * extended message + * set nsp32_hw_data */ - case EXTENDED_MESSAGE: - if (data->msginlen < 1) { - /* - * Current position does not reach 2-byte - * (2-byte is extended message length). - */ - msgclear = FALSE; - break; - } - - if ((data->msginbuf[1] + 1) > data->msginlen) { - /* - * Current extended message has msginbuf[1] + 2 - * (msginlen starts counting from 0, so buf[1] + 1). - * If current message position is not finished, - * continue receiving message. - */ - msgclear = FALSE; - break; - } - - /* - * Reach here means regular length of each type of - * extended messages. - */ - switch (data->msginbuf[2]) { - case EXTENDED_MODIFY_DATA_POINTER: - /* TODO */ - goto reject; /* not implemented yet */ - break; - - case EXTENDED_SDTR: - /* - * Exchange this message between initiator and target. - */ - if (data->msginlen != EXTENDED_SDTR_LEN + 1) { - /* - * received inappropriate message. - */ - goto reject; - break; - } - - nsp32_analyze_sdtr(data); - - break; - - case EXTENDED_EXTENDED_IDENTIFY: - /* SCSI-I only, not supported. */ - goto reject; /* not implemented yet */ - - break; - - case EXTENDED_WDTR: - goto reject; /* not implemented yet */ - - break; - - default: - goto reject; - } - break; - - default: - goto reject; - } - - restart: - if (msgclear == TRUE) { - data->msginlen = 0; - - /* - * If restarting AutoSCSI, but there are some message to out - * (msgoutlen > 0), set AutoATN, and set SCSIMSGOUT as 0 - * (MV_VALID = 0). When commandcontrol is written with - * AutoSCSI restart, at the same time MsgOutOccur should be - * happened (however, such situation is really possible...?). - */ - if (data->msgoutlen > 0) { - nsp32_write4(base, SCSI_MSG_OUT, 0); - command |= AUTO_ATN; - } + data = (nsp32_hw_data *)host->hostdata; - /* - * restart AutoSCSI - * If it's failed, COMMANDCONTROL_AUTO_COMMAND_PHASE is needed. - */ - command |= (AUTO_MSGIN_00_OR_04 | AUTO_MSGIN_02); + *data = nsp32_data_base; - /* - * If current msgin03 is TRUE, then flag on. - */ - if (data->curlunt->msgin03 == TRUE) { - command |= AUTO_MSGIN_03; - } - data->curlunt->msgin03 = FALSE; - } else { - data->msginlen++; - } + host->irq = data->IrqNumber; + host->io_port = data->BaseAddress; + host->unique_id = data->BaseAddress; + host->n_io_port = data->NumAddress; + host->base = data->MmioAddress; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,63)) + scsi_set_device(host, &PCIDEV->dev); +#else + scsi_set_pci_device(host, PCIDEV); +#endif + + data->Host = host; + spin_lock_init(&(data->Lock)); + + data->cur_lunt = NULL; + data->cur_target = NULL; /* - * restart AutoSCSI + * Bus master transfer mode is supported currently. */ - nsp32_restart_autoscsi(data, command); + data->trans_method = NSP32_TRANSFER_BUSMASTER; /* - * wait SCSI REQ negate for REQ-ACK handshake + * Set clock div, CLOCK_4 (HBA has own external clock, and + * dividing * 100ns/4). + * Currently CLOCK_4 has only tested, not for CLOCK_2/PCICLK yet. */ - nsp32_wait_req(data, NEGATE); + data->clock = CLOCK_4; /* - * negate SCSI ACK + * Select appropriate nsp32_sync_table and set I_CLOCKDIV. */ - nsp32_sack_negate(data); - - nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "exit"); + switch (data->clock) { + case CLOCK_4: + /* If data->clock is CLOCK_4, then select 40M sync table. */ + data->synct = nsp32_sync_table_40M; + data->syncnum = NUMBER(nsp32_sync_table_40M); + break; + case CLOCK_2: + /* If data->clock is CLOCK_2, then select 20M sync table. */ + data->synct = nsp32_sync_table_20M; + data->syncnum = NUMBER(nsp32_sync_table_20M); + break; + case PCICLK: + /* If data->clock is PCICLK, then select pci sync table. */ + data->synct = nsp32_sync_table_pci; + data->syncnum = NUMBER(nsp32_sync_table_pci); + break; + default: + nsp32_msg(KERN_WARNING, + "Invalid clock div is selected, set CLOCK_4."); + /* Use default value CLOCK_4 */ + data->clock = CLOCK_4; + data->synct = nsp32_sync_table_40M; + data->syncnum = NUMBER(nsp32_sync_table_40M); + } - return; + /* + * setup nsp32_lunt + */ - reject: - nsp32_msg(KERN_WARNING, - "invalid or unsupported MessageIn, rejected. " - "current msg: 0x%x (len: 0x%x), processing msg: 0x%x", - msg, data->msginlen, msgtype); - nsp32_build_reject(data); - data->msginlen = 0; + /* + * setup DMA + */ + if (pci_set_dma_mask(PCIDEV, 0xffffffffUL) != 0) { + nsp32_msg (KERN_ERR, "failed to set PCI DMA mask"); + goto scsi_unregister; + } - goto restart; -} + /* + * allocate autoparam DMA resource. + */ + data->autoparam = pci_alloc_consistent(PCIDEV, sizeof(nsp32_autoparam), &(data->auto_paddr)); + if (data->autoparam == NULL) { + nsp32_msg(KERN_ERR, "failed to allocate DMA memory"); + goto scsi_unregister; + } -/* - * - */ -static void nsp32_analyze_sdtr(nsp32_hw_data *data) -{ - struct nsp32_target *target = data->curtarget; - struct nsp32_sync_table *synct; - unsigned char get_period = data->msginbuf[3]; - unsigned char get_offset = data->msginbuf[4]; - int entry; - int syncnum; + /* + * allocate scatter-gather DMA resource. + */ + data->sg_list = pci_alloc_consistent(PCIDEV, NSP32_SG_TABLE_SIZE, + &(data->sg_paddr)); + if (data->sg_list == NULL) { + nsp32_msg(KERN_ERR, "failed to allocate DMA memory"); + goto free_autoparam; + } - nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "enter"); + for (n_target = 0; n_target < NUMBER(data->lunt); n_target++) { + for (n_lun = 0; n_lun < NUMBER(data->lunt[0]); n_lun++) { + int offset = n_target * NUMBER(data->lunt[0]) + n_lun; + nsp32_lunt tmp = { + SCpnt: NULL, + save_datp: 0, + msgin03: FALSE, + sg_num: 0, + cur_entry: 0, + sglun: &(data->sg_list[offset]), + sglun_paddr: data->sg_paddr + ARRAY_OFFSET(nsp32_sglun, offset), + }; - synct = data->synct; - syncnum = data->syncnum; + data->lunt[n_target][n_lun] = tmp; + } + } /* - * If this inititor sent the SDTR message, then target responds SDTR, - * initiator SYNCREG, ACKWIDTH from SDTR parameter. - * Messages are not appropriate, then send back reject message. - * If initiator did not send the SDTR, but target sends SDTR, - * initiator calculator the appropriate parameter and send back SDTR. - */ - if (target->sync_flag & SDTR_INITIATOR) { - /* - * Initiator sent SDTR, the target responds and - * send back negotiation SDTR. - */ - nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "target responds SDTR"); - - target->sync_flag &= ~SDTR_INITIATOR; - target->sync_flag |= SDTR_DONE; + * setup target + */ + for (i = 0; i < NUMBER(data->target); i++) { + nsp32_target *target = &(data->target[i]); - /* - * offset: - */ - if (get_offset > SYNC_OFFSET) { - /* - * Negotiation is failed, the target send back - * unexpected offset value. - */ - goto reject; - } - - if (get_offset == ASYNC_OFFSET) { - /* - * Negotiation is succeeded, the target want - * to fall back into asynchronous transfer mode. - */ - goto async; - } + target->limit_entry = 0; + target->sync_flag = SDTR_NONE; + nsp32_set_async(data, target); + } - /* - * period: - * Check whether sync period is too short. If too short, - * fall back to async mode. If it's ok, then investigate - * the received sync period. If sync period is acceptable - * between sync table start_period and end_period, then - * set this I_T nexus as sent offset and period. - * If it's not acceptable, send back reject and fall back - * to async mode. - */ - if (get_period < data->synct[0].period_num) { - /* - * Negotiation is failed, the target send back - * unexpected period value. - */ - goto reject; - } + /* + * EEPROM check + */ + ret = nsp32_getprom_param(data); + if (ret == FALSE) { + data->resettime = 3; /* default 3 */ + } - entry = nsp32_search_period_entry(data, target, get_period); + /* + * setup HBA + */ + nsp32hw_init(data); - if (entry < 0) { - /* - * Target want to use long period which is not - * acceptable NinjaSCSI-32Bi/UDE. - */ - goto reject; - } + snprintf(data->info_str, sizeof(data->info_str), + "NinjaSCSI-32Bi/UDE: irq %d, io 0x%lx+0x%x", + host->irq, host->io_port, host->n_io_port); - /* - * Set new sync table and offset in this I_T nexus. - */ - nsp32_set_sync_entry(data, target, entry, get_offset); - } else { - /* Target send SDTR to initiator. */ - nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "target send SDTR"); - - target->sync_flag |= SDTR_INITIATOR; + /* + * SCSI bus reset + * + * Note: It's important to reset SCSI bus in initialization phase. + * NinjaSCSI-32Bi/UDE HBA EEPROM seems to exchange SDTR when + * system is coming up, so SCSI devices connected to HBA is set as + * un-asynchronous mode. It brings the merit that this HBA is + * ready to start synchronous transfer without any preparation, + * but we are difficult to control transfer speed. In addition, + * it prevents device transfer speed from effecting EEPROM start-up + * SDTR. NinjaSCSI-32Bi/UDE has the feature if EEPROM is set as + * Auto Mode, then FAST-10M is selected when SCSI devices are + * connected same or more than 4 devices. It should be avoided + * depending on this specification. Thus, resetting the SCSI bus + * restores all connected SCSI devices to asynchronous mode, then + * this driver set SDTR safely later, and we can control all SCSI + * device transfer mode. + */ + nsp32_do_bus_reset(data); - /* offset: */ - if (get_offset > SYNC_OFFSET) { - /* send back as SYNC_OFFSET */ - get_offset = SYNC_OFFSET; - } + ret = request_irq(host->irq, do_nsp32_isr, + SA_SHIRQ | SA_SAMPLE_RANDOM, "nsp32", data); + if (ret < 0) { + nsp32_msg(KERN_ERR, "Unable to allocate IRQ for NinjaSCSI32 " + "SCSI PCI controller. Interrupt: %d", host->irq); + goto free_sg_list; + } - /* period: */ - if (get_period < data->synct[0].period_num) { - get_period = data->synct[0].period_num; - } + /* + * PCI IO register + */ + res = request_region(host->io_port, host->n_io_port, "nsp32"); + if (res == NULL) { + nsp32_msg(KERN_ERR, + "I/O region 0x%lx+0x%lx is already used", + data->BaseAddress, data->NumAddress); + goto free_irq; + } - entry = nsp32_search_period_entry(data, target, get_period); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + scsi_add_host (host, &PCIDEV->dev); + scsi_scan_host(host); +#endif + pci_set_drvdata(PCIDEV, host); + return DETECT_OK; - if (get_offset == ASYNC_OFFSET || entry < 0) { - nsp32_set_async(data, target); - nsp32_build_sdtr(data, 0, ASYNC_OFFSET); - } else { - nsp32_set_sync_entry(data, target, entry, get_offset); - nsp32_build_sdtr(data, get_period, get_offset); - } - } - - nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "exit"); - return; + free_irq: + free_irq(host->irq, data); - reject: - /* - * If the current message is unacceptable, send back to the target - * with reject message. - */ - nsp32_build_reject(data); + free_sg_list: + pci_free_consistent(PCIDEV, NSP32_SG_TABLE_SIZE, + data->sg_list, data->sg_paddr); - async: - nsp32_set_async(data, target); /* set as ASYNC transfer mode */ + free_autoparam: + pci_free_consistent(PCIDEV, sizeof(nsp32_autoparam), + data->autoparam, data->auto_paddr); + + scsi_unregister: + scsi_host_put(host); - nsp32_dbg(NSP32_DEBUG_MSGINOCCUR, "exit: set async"); - return; + err: + return DETECT_NG; } +#undef DETECT_OK +#undef DETECT_NG +#undef PCIDEV - -/* - * Search config entry number matched in sync_table from given - * target and speed period value. If failed to search, return negative value. - */ -static int nsp32_search_period_entry(nsp32_hw_data *data, - struct nsp32_target *target, - unsigned char period) +static int nsp32_release(struct Scsi_Host *host) { - int i; + nsp32_hw_data *data = (nsp32_hw_data *)host->hostdata; - if (target->limit_entry >= data->syncnum) { - nsp32_msg(KERN_ERR, "limit_entry exceeds syncnum!"); - target->limit_entry = 0; + if (data->autoparam) { + pci_free_consistent(data->Pci, sizeof(nsp32_autoparam), + data->autoparam, data->auto_paddr); } - for (i=target->limit_entry; isyncnum; i++) { - if (period >= data->synct[i].start_period && - period <= data->synct[i].end_period) { - break; - } + if (data->sg_list) { + pci_free_consistent(data->Pci, NSP32_SG_TABLE_SIZE, + data->sg_list, data->sg_paddr); } - /* - * Check given period value is over the sync_table value. - * If so, return max value. - */ - if (i == data->syncnum) { - i = -1; + if (host->irq) { + free_irq(host->irq, data); } - return i; -} - - -/* - * target <-> initiator use ASYNC transfer - */ -static void nsp32_set_async(nsp32_hw_data *data, struct nsp32_target *target) -{ - unsigned char period = data->synct[target->limit_entry].period_num; + if (host->io_port && host->n_io_port) { + release_region(host->io_port, host->n_io_port); + } - target->offset = ASYNC_OFFSET; - target->syncreg = TO_SYNCREG(period, ASYNC_OFFSET); - target->ackwidth = 0; + if (data->MmioAddress != 0) { + iounmap((void *)(data->MmioAddress)); + } - nsp32_dbg(NSP32_DEBUG_SYNC, "set async"); + return 0; } +static const char *nsp32_info(struct Scsi_Host *shpnt) +{ + nsp32_hw_data *data = (nsp32_hw_data *)shpnt->hostdata; -/* - * target <-> initiator use maximum SYNC transfer - */ -static void nsp32_set_max_sync(nsp32_hw_data *data, - struct nsp32_target *target, - unsigned char *period, unsigned char *offset) -{ - unsigned char period_num, ackwidth; - - period_num = data->synct[target->limit_entry].period_num; - *period = data->synct[target->limit_entry].start_period; - ackwidth = data->synct[target->limit_entry].ackwidth; - *offset = SYNC_OFFSET; - - target->syncreg = TO_SYNCREG(period_num, *offset); - target->ackwidth = ackwidth; - target->offset = *offset; + return data->info_str; } -/* - * target <-> initiator use entry number speed +/**************************************************************************** + * error handler */ -static void nsp32_set_sync_entry(nsp32_hw_data *data, - struct nsp32_target *target, - int entry, unsigned char offset) +static int nsp32_eh_abort(Scsi_Cmnd *SCpnt) { - unsigned char period, ackwidth; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = SCpnt->device->host->io_port; - period = data->synct[entry].period_num; - ackwidth = data->synct[entry].ackwidth; - offset = offset; - - target->syncreg = TO_SYNCREG(period, offset); - target->ackwidth = ackwidth; - target->offset = offset; + nsp32_msg(KERN_WARNING, "abort"); - nsp32_dbg(NSP32_DEBUG_SYNC, "set sync"); -} + if (data->cur_lunt->SCpnt == NULL) { + nsp32_dbg(NSP32_DEBUG_BUSRESET, "abort failed"); + return FAILED; + } + if (data->cur_target->sync_flag & (SDTR_INITIATOR | SDTR_TARGET)) { + /* reset SDTR negotiation */ + data->cur_target->sync_flag = SDTR_NONE; + nsp32_set_async(data, data->cur_target); + } -/* - * It waits until SCSI REQ becomes assertion or negation state. - * - * Note: If nsp32_msgin_occur is called, we asserts SCSI ACK. Then - * connected target responds SCSI REQ negation. We have to wait - * SCSI REQ becomes negation in order to negate SCSI ACK signal for - * REQ-ACK handshake. - */ -static void nsp32_wait_req(nsp32_hw_data *data, int state) + nsp32_write2(base, TRANSFER_CONTROL, 0); + nsp32_write2(base, BM_CNT, 0); + + SCpnt->result = DID_ABORT << 16; + nsp32_scsi_done(SCpnt); + + nsp32_dbg(NSP32_DEBUG_BUSRESET, "abort success"); + return SUCCESS; +} + +static int nsp32_eh_bus_reset(Scsi_Cmnd *SCpnt) { - unsigned int base = data->BaseAddress; - int wait_time = 0; - unsigned char bus; + nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata; + unsigned int base = SCpnt->device->host->io_port; - if (!((state == ASSERT) || (state == NEGATE))) { - nsp32_msg(KERN_ERR, "unknown state designation"); - } - state <<= 5; /* REQ is BIT(5) */ + nsp32_msg(KERN_INFO, "Bus Reset"); + nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%x", SCpnt); - do { - bus = nsp32_read1(base, SCSI_BUS_MONITOR); - if ((bus & BUSMON_REQ) == state) { - nsp32_dbg(NSP32_DEBUG_WAIT, - "wait_time: %d", wait_time); - return; - } - udelay(1); - wait_time++; - } while (wait_time < REQSACK_TIMEOUT_TIME); + nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK); + nsp32_do_bus_reset(data); + nsp32_write2(base, IRQ_CONTROL, 0); - nsp32_msg(KERN_WARNING, "wait REQ timeout, state: %d", state); + return SUCCESS; /* SCSI bus reset is succeeded at any time. */ } -/* - * It waits until SCSI SACK becomes assertion or negation state. - */ -static void nsp32_wait_sack(nsp32_hw_data *data, int state) +static void nsp32_do_bus_reset(nsp32_hw_data *data) { - unsigned int base = data->BaseAddress; - int wait_time = 0; - unsigned char bus; + unsigned int base = data->BaseAddress; + unsigned short intrdat; + int i; - if (!((state == ASSERT) || (state == NEGATE))) { - nsp32_msg(KERN_ERR, "unknown state designation"); + nsp32_dbg(NSP32_DEBUG_BUSRESET, "in"); + + /* + * stop all transfer + * clear TRANSFERCONTROL_BM_START + * clear counter + */ + nsp32_write2(base, TRANSFER_CONTROL, 0); + nsp32_write4(base, BM_CNT, 0); + nsp32_write4(base, CLR_COUNTER, CLRCOUNTER_ALLMASK); + + /* + * fall back to asynchronous transfer mode + * initialize SDTR negotiation flag + */ + for (i = 0; i < NUMBER(data->target); i++) { + nsp32_target *target = &data->target[i]; + + target->sync_flag = SDTR_NONE; + nsp32_set_async(data, target); } - state <<= 4; /* ACK is BIT(4) */ - do { - bus = nsp32_read1(base, SCSI_BUS_MONITOR); - if ((bus & BUSMON_ACK) == state) { - nsp32_dbg(NSP32_DEBUG_WAIT, - "wait_time: %d", wait_time); - return; - } - udelay(1); - wait_time++; - } while (wait_time < REQSACK_TIMEOUT_TIME); + /* + * reset SCSI bus + */ + nsp32_write1(base, SCSI_BUS_CONTROL, BUSCTL_RST); + udelay(RESET_HOLD_TIME); + nsp32_write1(base, SCSI_BUS_CONTROL, 0); + for(i = 0; i < 5; i++) { + intrdat = nsp32_read2(base, IRQ_STATUS); /* dummy read */ + nsp32_dbg(NSP32_DEBUG_BUSRESET, "irq:1: 0x%x", intrdat); + } - nsp32_msg(KERN_WARNING, "wait SACK timeout, state: %d", state); + data->CurrentSC = NULL; } -/* - * assert SCSI ACK - * - * Note: SCSI ACK assertion needs with ACKENB=1, AUTODIRECTION=1. - */ -static void nsp32_sack_assert(nsp32_hw_data *data) +static int nsp32_eh_host_reset(Scsi_Cmnd *SCpnt) { - unsigned char busctrl; - unsigned int base = data->BaseAddress; + struct Scsi_Host *host = SCpnt->device->host; + unsigned int base = SCpnt->device->host->io_port; + nsp32_hw_data *data = (nsp32_hw_data *)host->hostdata; - busctrl = nsp32_read1(base, SCSI_BUS_CONTROL); - busctrl |= (BUSCTL_ACK | AUTODIRECTION | ACKENB); - nsp32_write1(base, SCSI_BUS_CONTROL,busctrl); -} + nsp32_msg(KERN_INFO, "Host Reset"); + nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%x", SCpnt); -/* - * negate SCSI ACK - */ -static void nsp32_sack_negate(nsp32_hw_data *data) -{ - unsigned char busctrl; - unsigned int base = data->BaseAddress; + nsp32hw_init(data); + nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK); + nsp32_do_bus_reset(data); + nsp32_write2(base, IRQ_CONTROL, 0); - busctrl = nsp32_read1(base, SCSI_BUS_CONTROL); - busctrl &= ~BUSCTL_ACK; - nsp32_write1(base, SCSI_BUS_CONTROL, busctrl); + return SUCCESS; /* Host reset is succeeded at any time. */ } +/************************************************************************** + * EEPROM handler + */ /* * getting EEPROM parameter @@ -3165,7 +3083,12 @@ { int vendor = data->pci_devid->vendor; int device = data->pci_devid->device; - int ret, val, i; + int ret; +#ifdef NSP32_DEBUG + int i; +#define NSP32_DEBUG_PROM_BUF_SIZE 0x20 + unsigned char buf[NSP32_DEBUG_PROM_BUF_SIZE]; +#endif /* * EEPROM checking. @@ -3173,12 +3096,12 @@ ret = nsp32_prom_read(data, 0x7e); if (ret != 0x55) { nsp32_msg(KERN_INFO, "No EEPROM detected: 0x%x", ret); - return (FALSE); + return FALSE; } ret = nsp32_prom_read(data, 0x7f); if (ret != 0xaa) { nsp32_msg(KERN_INFO, "Invalid number: 0x%x", ret); - return (FALSE); + return FALSE; } /* @@ -3186,27 +3109,30 @@ */ if (vendor == PCI_VENDOR_ID_WORKBIT && device == PCI_DEVICE_ID_WORKBIT_STANDARD) { - ret = nsp32_getprom_standard(data); + ret = nsp32_getprom_c16(data); } else if (vendor == PCI_VENDOR_ID_WORKBIT && device == PCI_DEVICE_ID_NINJASCSI_32BIB_LOGITEC) { - ret = nsp32_getprom_new(data); + ret = nsp32_getprom_at24(data); } else if (vendor == PCI_VENDOR_ID_WORKBIT && device == PCI_DEVICE_ID_NINJASCSI_32UDE_MELCO ) { - ret = nsp32_getprom_new(data); + ret = nsp32_getprom_at24(data); } else { nsp32_msg(KERN_WARNING, "Unknown EEPROM"); ret = FALSE; } +#ifdef NSP32_DEBUG /* for debug : SPROM data full checking */ - for (i=0; i<=0x1f; i++) { - val = nsp32_prom_read(data, i); - nsp32_dbg(NSP32_DEBUG_EEPROM, - "rom address 0x%x : 0x%x", i, val); + nsp32_dbg(NSP32_DEBUG_EEPROM, "rom dump"); + for (i = 0; i < sizeof(buf); i++) { + buf[i] = nsp32_prom_read(data, i); } + nsp32_byte_dump(buf, 0, sizeof(buf)); +#endif - return (ret); + return ret; } +#undef NSP32_DEBUG_PROM_BUF_SIZE /* @@ -3233,15 +3159,15 @@ * 0x1c : Constant? (0x01) (clock div?) * 0x1d - 0x7c : Not Used (0xff) * 0x7d : Not Used? (0xff) - * 0x7e : Constant (0x55), HBA chip revision - * 0x7f : Constant (0xaa), HBA value + * 0x7e : Constant (0x55), Validity signature + * 0x7f : Constant (0xaa), Validity signature */ -static int nsp32_getprom_new(nsp32_hw_data *data) +static int nsp32_getprom_at24(nsp32_hw_data *data) { - int ret, i; - int auto_sync; - struct nsp32_target *target; - int entry; + int ret, i; + int auto_sync; + nsp32_target *target; + int entry; /* * Reset time which is designated by EEPROM. @@ -3273,8 +3199,7 @@ break; default: nsp32_msg(KERN_WARNING, - "Unsupported Auto Sync mode." - "Fall back to manual mode."); + "Unsupported Auto Sync mode. Fall back to manual mode."); auto_sync = TRUE; } @@ -3285,12 +3210,12 @@ /* * each device Synchronous Transfer Period */ - for (i=0; itarget[i]; if (auto_sync == TRUE) { target->limit_entry = 0; /* set as ULTRA20M */ } else { - ret = nsp32_prom_read(data, i); + ret = nsp32_prom_read(data, i); entry = nsp32_search_period_entry(data, target, ret); if (entry < 0) { /* search failed... set maximum speed */ @@ -3300,12 +3225,12 @@ } } - return (TRUE); + return TRUE; } /* - * ? (I-O Data: SC-NBD) data map: + * C16 110 (I-O Data: SC-NBD) data map: * * ROMADDR * 0x00 - 0x06 : Device Synchronous Transfer Period (SCSI ID 0 - 6) @@ -3321,14 +3246,14 @@ * Value 0: Disable, 1: Enable * 0x1a - 0x7c : Not Used? (0) * 0x7d : Not Used? (0xf8) - * 0x7e : Constant (0x55), HBA chip revision - * 0x7f : Constant (0xaa), HBA value + * 0x7e : Constant (0x55), Validity signature + * 0x7f : Constant (0xaa), Validity signature */ -static int nsp32_getprom_standard(nsp32_hw_data *data) +static int nsp32_getprom_c16(nsp32_hw_data *data) { - int ret, i; - struct nsp32_target *target; - int entry, val; + int ret, i; + nsp32_target *target; + int entry, val; /* * Reset time which is designated by EEPROM. @@ -3340,7 +3265,7 @@ /* * each device Synchronous Transfer Period */ - for (i=0; itarget[i]; ret = nsp32_prom_read(data, i); switch (ret) { @@ -3354,10 +3279,11 @@ val = 0x32; break; case 3: /* ASYNC */ - val = 0x0; + val = 0x00; break; default: /* default 20MB/s */ val = 0x0c; + break; } entry = nsp32_search_period_entry(data, target, val); if (entry < 0 || trans_mode == ULTRA20M_MODE) { @@ -3367,7 +3293,7 @@ target->limit_entry = entry; } - return (TRUE); + return TRUE; } @@ -3382,145 +3308,314 @@ nsp32_prom_start(data); /* device address */ - nsp32_prom_write(data, 1); /* 1 */ - nsp32_prom_write(data, 0); /* 0 */ - nsp32_prom_write(data, 1); /* 1 */ - nsp32_prom_write(data, 0); /* 0 */ - nsp32_prom_write(data, 0); /* A2: 0 (GND) */ - nsp32_prom_write(data, 0); /* A1: 0 (GND) */ - nsp32_prom_write(data, 0); /* A0: 0 (GND) */ + nsp32_prom_write_bit(data, 1); /* 1 */ + nsp32_prom_write_bit(data, 0); /* 0 */ + nsp32_prom_write_bit(data, 1); /* 1 */ + nsp32_prom_write_bit(data, 0); /* 0 */ + nsp32_prom_write_bit(data, 0); /* A2: 0 (GND) */ + nsp32_prom_write_bit(data, 0); /* A1: 0 (GND) */ + nsp32_prom_write_bit(data, 0); /* A0: 0 (GND) */ /* R/W: W for dummy write */ - nsp32_prom_write(data, 0); + nsp32_prom_write_bit(data, 0); /* ack */ - nsp32_prom_write(data, 0); + nsp32_prom_write_bit(data, 0); /* word address */ - for (i=7; i>=0; i--) { - nsp32_prom_write(data, ((romaddr >> i) & 1)); + for (i = 7; i >= 0; i--) { + nsp32_prom_write_bit(data, ((romaddr >> i) & 1)); } /* ack */ - nsp32_prom_write(data, 0); + nsp32_prom_write_bit(data, 0); /* start condition */ nsp32_prom_start(data); /* device address */ - nsp32_prom_write(data, 1); /* 1 */ - nsp32_prom_write(data, 0); /* 0 */ - nsp32_prom_write(data, 1); /* 1 */ - nsp32_prom_write(data, 0); /* 0 */ - nsp32_prom_write(data, 0); /* A2: 0 (GND) */ - nsp32_prom_write(data, 0); /* A1: 0 (GND) */ - nsp32_prom_write(data, 0); /* A0: 0 (GND) */ + nsp32_prom_write_bit(data, 1); /* 1 */ + nsp32_prom_write_bit(data, 0); /* 0 */ + nsp32_prom_write_bit(data, 1); /* 1 */ + nsp32_prom_write_bit(data, 0); /* 0 */ + nsp32_prom_write_bit(data, 0); /* A2: 0 (GND) */ + nsp32_prom_write_bit(data, 0); /* A1: 0 (GND) */ + nsp32_prom_write_bit(data, 0); /* A0: 0 (GND) */ /* R/W: R */ - nsp32_prom_write(data, 1); + nsp32_prom_write_bit(data, 1); /* ack */ - nsp32_prom_write(data, 0); + nsp32_prom_write_bit(data, 0); /* data... */ val = 0; - for (i=7; i>=0; i--) { - val += (nsp32_prom_fetch(data) << i); + for (i = 7; i >= 0; i--) { + int bit = nsp32_prom_read_bit(data) ? 1 : 0; + + val |= (bit << i); } /* no ack */ - nsp32_prom_write(data, 1); + nsp32_prom_write_bit(data, 1); /* stop condition */ nsp32_prom_stop(data); - return (val); + return val; } static void nsp32_prom_start (nsp32_hw_data *data) { /* start condition */ - nsp32_prom_set(data, SCL, 1); - nsp32_prom_set(data, SDA, 1); - nsp32_prom_set(data, ENA, 1); /* output mode */ - nsp32_prom_set(data, SDA, 0); /* keeping SCL=1 and transiting - * SDA 1->0 is start condition */ - nsp32_prom_set(data, SCL, 0); + nsp32_prom_set(data, SROM_CTL, 1); + nsp32_prom_set(data, SROM_DATA, 1); + nsp32_prom_set(data, SROM_ENABLE, 1); /* output mode */ + nsp32_prom_set(data, SROM_DATA, 0); /* keeping SROM_CTL=1 and transiting + * SROM_DATA 1->0 is start condition */ + nsp32_prom_set(data, SROM_CTL, 0); } static void nsp32_prom_stop (nsp32_hw_data *data) { /* stop condition */ - nsp32_prom_set(data, SCL, 1); - nsp32_prom_set(data, SDA, 0); - nsp32_prom_set(data, ENA, 1); /* output mode */ - nsp32_prom_set(data, SDA, 1); - nsp32_prom_set(data, SCL, 0); + nsp32_prom_set(data, SROM_CTL, 1); + nsp32_prom_set(data, SROM_DATA, 0); + nsp32_prom_set(data, SROM_ENABLE, 1); /* output mode */ + nsp32_prom_set(data, SROM_DATA, 1); + nsp32_prom_set(data, SROM_CTL, 0); } -static void nsp32_prom_write (nsp32_hw_data *data, int val) +static void nsp32_prom_write_bit(nsp32_hw_data *data, int val) { /* write */ - nsp32_prom_set(data, SDA, val); - nsp32_prom_set(data, SCL, 1); - nsp32_prom_set(data, SCL, 0); + nsp32_prom_set(data, SROM_DATA, val); + nsp32_prom_set(data, SROM_CTL, 1 ); + nsp32_prom_set(data, SROM_CTL, 0 ); } -static int nsp32_prom_fetch (nsp32_hw_data *data) +static int nsp32_prom_read_bit(nsp32_hw_data *data) { int val; /* read */ - nsp32_prom_set(data, ENA, 0); /* input mode */ - nsp32_prom_set(data, SCL, 1); - val = nsp32_prom_get(data, SDA); - nsp32_prom_set(data, SCL, 0); - nsp32_prom_set(data, ENA, 1); /* output mode */ - return (val); + nsp32_prom_set(data, SROM_ENABLE, 0); /* input mode */ + nsp32_prom_set(data, SROM_CTL, 1); + + val = nsp32_prom_get(data, SROM_DATA); + + nsp32_prom_set(data, SROM_CTL, 0); + nsp32_prom_set(data, SROM_ENABLE, 1); /* output mode */ + + return val; } static inline void nsp32_prom_set(nsp32_hw_data *data, int bit, int val) { - int cur; - int base = data->BaseAddress; + unsigned int base = data->BaseAddress; + int tmp; - switch(val) { - case 0: - cur = nsp32_index_read1(base, SERIAL_ROM_CTL); - nsp32_index_write1(base, SERIAL_ROM_CTL, cur & ~bit); - break; - case 1: - cur = nsp32_index_read1(base, SERIAL_ROM_CTL); - nsp32_index_write1(base, SERIAL_ROM_CTL, cur | bit); - break; - default: - nsp32_msg(KERN_ERR, "val must be 0 or 1"); - return; + tmp = nsp32_index_read1(base, SERIAL_ROM_CTL); + + if (val == 0) { + tmp &= ~bit; + } else { + tmp |= bit; } + nsp32_index_write1(base, SERIAL_ROM_CTL, tmp); + udelay(10); } static inline int nsp32_prom_get(nsp32_hw_data *data, int bit) { - int ret; - int base = data->BaseAddress; + unsigned int base = data->BaseAddress; + int tmp, ret; - ret = nsp32_index_read1(base, SERIAL_ROM_CTL) & bit; - switch (ret) { - case 0: + if (bit != SROM_DATA) { + nsp32_msg(KERN_ERR, "return value is not appropriate"); + return 0; + } + + + tmp = nsp32_index_read1(base, SERIAL_ROM_CTL) & bit; + + if (tmp == 0) { ret = 0; - break; - case SDA: + } else { ret = 1; - break; - default: - nsp32_msg(KERN_ERR, "return value is not appropriate"); } udelay(10); - return (ret); + return ret; +} + + +/************************************************************************** + * Power Management + */ +#ifdef CONFIG_PM +/* Save Device Context */ +static int nsp32_save_state(struct pci_dev *pdev, u32 state) +{ + struct Scsi_Host *host = pci_get_drvdata(pdev); + + nsp32_msg(KERN_INFO, "pci-save_state: stub, pdev=0x%p, state=%ld, slot=%s, host=0x%p", pdev, state, pci_name(pdev), host); + + return 0; +} + +/* Device suspended */ +static int nsp32_suspend(struct pci_dev *pdev, u32 state) +{ + struct Scsi_Host *host = pci_get_drvdata(pdev); + nsp32_hw_data *data = (nsp32_hw_data *)host->hostdata; + + nsp32_msg(KERN_INFO, "pci-suspend: pdev=0x%p, state=%ld, slot=%s, host=0x%p", pdev, state, pci_name(pdev), host); + + pci_save_state (pdev, data->PciState); + pci_disable_device (pdev); + pci_set_power_state(pdev, state); + + return 0; +} + +/* Device woken up */ +static int nsp32_resume(struct pci_dev *pdev) +{ + struct Scsi_Host *host = pci_get_drvdata(pdev); + nsp32_hw_data *data = (nsp32_hw_data *)host->hostdata; + unsigned short reg; + + nsp32_msg(KERN_INFO, "pci-resume: pdev=0x%p, slot=%s, host=0x%p", pdev, pci_name(pdev), host); + + pci_set_power_state(pdev, 0); + pci_enable_wake (pdev, 0, 0); + pci_restore_state (pdev, data->PciState); + + reg = nsp32_read2(data->BaseAddress, INDEX_REG); + + nsp32_msg(KERN_INFO, "io=0x%x reg=0x%x", data->BaseAddress, reg); + + if (reg == 0xffff) { + nsp32_msg(KERN_INFO, "missing device. abort resume."); + return 0; + } + + nsp32hw_init (data); + nsp32_do_bus_reset(data); + + nsp32_msg(KERN_INFO, "resume success"); + + return 0; +} + +/* Enable wake event */ +static int nsp32_enable_wake(struct pci_dev *pdev, u32 state, int enable) +{ + struct Scsi_Host *host = pci_get_drvdata(pdev); + + nsp32_msg(KERN_INFO, "pci-enable_wake: stub, pdev=0x%p, enable=%d, slot=%s, host=0x%p", pdev, enable, pci_name(pdev), host); + + return 0; +} +#endif + +/************************************************************************ + * PCI/Cardbus probe/remove routine + */ +static int __devinit nsp32_probe(struct pci_dev *pdev, const struct pci_device_id *id) +{ + int ret; + nsp32_hw_data *data = &nsp32_data_base; + + nsp32_dbg(NSP32_DEBUG_REGISTER, "enter"); + + ret = pci_enable_device(pdev); + if (ret) { + nsp32_msg(KERN_ERR, "failed to enable pci device"); + return ret; + } + + data->Pci = pdev; + data->pci_devid = id; + data->IrqNumber = pdev->irq; + data->BaseAddress = pci_resource_start(pdev, 0); + data->NumAddress = pci_resource_len (pdev, 0); + data->MmioAddress = + (unsigned long)ioremap_nocache(pci_resource_start(pdev, 1), + pci_resource_len (pdev, 1)); + data->MmioLength = pci_resource_len (pdev, 1); + + pci_set_master(pdev); + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + ret = nsp32_detect(pdev); +#else + ret = scsi_register_host(&nsp32_template); +#endif + + nsp32_msg(KERN_INFO, "irq: %i mmio: 0x%lx+0x%lx slot: %s model: %s", + pdev->irq, + data->MmioAddress, data->MmioLength, + pci_name(pdev), + nsp32_model[id->driver_data]); + + nsp32_dbg(NSP32_DEBUG_REGISTER, "exit %d", ret); + + return ret; +} + +static void __devexit nsp32_remove(struct pci_dev *pdev) +{ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + struct Scsi_Host *host = pci_get_drvdata(pdev); +#endif + + nsp32_dbg(NSP32_DEBUG_REGISTER, "enter"); + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + scsi_remove_host(host); + + nsp32_release(host); + + scsi_host_put(host); +#else + scsi_unregister_host(&nsp32_template); +#endif +} + + + +static struct pci_driver nsp32_driver = { + .name = "nsp32", + .id_table = nsp32_pci_table, + .probe = nsp32_probe, + .remove = __devexit_p(nsp32_remove), +#ifdef CONFIG_PM + .save_state = nsp32_save_state, + .suspend = nsp32_suspend, + .resume = nsp32_resume, + .enable_wake = nsp32_enable_wake, +#endif +}; + +/********************************************************************* + * Moule entry point + */ +static int __init init_nsp32(void) { + nsp32_msg(KERN_INFO, "loading..."); + return pci_module_init(&nsp32_driver); +} + +static void __exit exit_nsp32(void) { + nsp32_msg(KERN_INFO, "unloading..."); + pci_unregister_driver(&nsp32_driver); } +module_init(init_nsp32); +module_exit(exit_nsp32); + /* end */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/nsp32.h linux-2.4.23-pre8/drivers/scsi/nsp32.h --- linux-2.4.22/drivers/scsi/nsp32.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/nsp32.h 2003-10-22 22:49:54.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Workbit NinjaSCSI-32Bi/UDE PCI/Cardbus SCSI Host Bus Adapter driver + * Workbit NinjaSCSI-32Bi/UDE PCI/CardBus SCSI Host Bus Adapter driver * Basic data header * * This program is free software; you can redistribute it and/or modify @@ -16,61 +16,68 @@ #ifndef _NSP32_H #define _NSP32_H - //#define NSP32_DEBUG 9 - /* * VENDOR/DEVICE ID */ #define PCI_VENDOR_ID_IODATA 0x10fc #define PCI_VENDOR_ID_WORKBIT 0x1145 -#define PCI_DEVICE_ID_NINJASCSI_32BI_CBSC_II 0x0005 -#define PCI_DEVICE_ID_NINJASCSI_32BI_KME 0xf007 -#define PCI_DEVICE_ID_NINJASCSI_32BI_WBT 0x8007 -#define PCI_DEVICE_ID_WORKBIT_STANDARD 0xf010 -#define PCI_DEVICE_ID_WORKBIT_DUALEDGE 0xf011 -#define PCI_DEVICE_ID_NINJASCSI_32BI_LOGITEC 0xf012 -#define PCI_DEVICE_ID_NINJASCSI_32BIB_LOGITEC 0xf013 -#define PCI_DEVICE_ID_NINJASCSI_32UDE_MELCO 0xf015 +#define PCI_DEVICE_ID_NINJASCSI_32BI_CBSC_II 0x0005 +#define PCI_DEVICE_ID_NINJASCSI_32BI_KME 0xf007 +#define PCI_DEVICE_ID_NINJASCSI_32BI_WBT 0x8007 +#define PCI_DEVICE_ID_WORKBIT_STANDARD 0xf010 +#define PCI_DEVICE_ID_WORKBIT_DUALEDGE 0xf011 +#define PCI_DEVICE_ID_NINJASCSI_32BI_LOGITEC 0xf012 +#define PCI_DEVICE_ID_NINJASCSI_32BIB_LOGITEC 0xf013 +#define PCI_DEVICE_ID_NINJASCSI_32UDE_MELCO 0xf015 +#define PCI_DEVICE_ID_NINJASCSI_32UDE_MELCO_II 0x8009 /* - * MODEL + * MODEL NAME + * + * note: Model number and model string must be same order. */ enum { MODEL_IODATA = 0, MODEL_KME = 1, MODEL_WORKBIT = 2, - MODEL_EXT_ROM = 3, + MODEL_LOGITEC = 3, MODEL_PCI_WORKBIT = 4, MODEL_PCI_LOGITEC = 5, MODEL_PCI_MELCO = 6, }; static char * nsp32_model[] = { - "I-O DATA CBSC-II", - "KME SCSI card", - "Workbit duo SCSI card", - "External ROM", - "Workbit Standard/IO Data PCI card", - "Logitec PCI card", - "Melco PCI card", + "I-O DATA CBSC-II CardBus card", + "KME SCSI CardBus card", + "Workbit duo SCSI CardBus card", + "Logitec CardBus card with external ROM", + "Workbit / I-O DATA PCI card", + "Logitec PCI card with external ROM", + "Melco CardBus/PCI card with external ROM", }; /* - * SCSI Generic Definitions + * SCSI generic message definitions */ #define EXTENDED_SDTR_LEN 0x03 +/* Little Endian */ +typedef u32 u32_le; +typedef u16 u16_le; /* * MACRO */ -#define BIT(x) (1UL << (x)) +/* from X11/Intrinsic.h */ +#define NUMBER(arr) ((int) (sizeof(arr) / sizeof(arr[0]))) +#define ARRAY_OFFSET(type,num) ((int) (((type *) 0) + (num))) +#define BIT(x) (1UL << (x)) #ifndef MIN -# define MIN(a,b) ((a) > (b) ? (b) : (a)) +# define MIN(a,b) ((a) > (b) ? (b) : (a)) #endif /* @@ -111,7 +118,10 @@ # define TIMER_IRQ_MASK BIT(13) # define FIFO_IRQ_MASK BIT(14) # define SCSI_IRQ_MASK BIT(15) -# define IRQ_CONTROL_ALL_IRQ_MASK 0xf000 +# define IRQ_CONTROL_ALL_IRQ_MASK (PCI_IRQ_MASK | \ + TIMER_IRQ_MASK | \ + FIFO_IRQ_MASK | \ + SCSI_IRQ_MASK ) # define IRQSTATUS_ANY_IRQ (IRQSTATUS_RESELECT_OCCUER | \ IRQSTATUS_PHASE_CHANGE_IRQ | \ IRQSTATUS_SCSIRESET_IRQ | \ @@ -121,8 +131,8 @@ IRQSTATUS_BMCNTERR_IRQ | \ IRQSTATUS_AUTOSCSI_IRQ ) -#define TRANSFER_CONTROL 0x02 /* BASE+02, W, W */ -#define TRANSFER_STATUS 0x02 /* BASE+02, W, R */ +#define TRANSFER_CONTROL 0x02 /* BASE+02, W, W */ +#define TRANSFER_STATUS 0x02 /* BASE+02, W, R */ # define CB_MMIO_MODE BIT(0) # define CB_IO_MODE BIT(1) # define BM_TEST BIT(2) @@ -139,26 +149,29 @@ # define ALL_COUNTER_CLR BIT(14) # define FIFOTEST BIT(15) -#define INDEX_REG 0x04 /* BASE+04, Byte(R/W), Word(R) */ +#define INDEX_REG 0x04 /* BASE+04, Byte(R/W), Word(R) */ -#define TIMER_SET 0x06 /* BASE+06, W, R/W */ -# define TIMER_CNT_MASK 0xff +#define TIMER_SET 0x06 /* BASE+06, W, R/W */ +# define TIMER_CNT_MASK (0xff) # define TIMER_STOP BIT(8) -#define DATA_REG_LOW 0x08 /* BASE+08, LowW, R/W */ -#define DATA_REG_HI 0x0a /* BASE+0a, Hi-W, R/W */ +#define DATA_REG_LOW 0x08 /* BASE+08, LowW, R/W */ +#define DATA_REG_HI 0x0a /* BASE+0a, Hi-W, R/W */ -#define FIFO_REST_CNT 0x0c /* BASE+0c, W, R/W */ +#define FIFO_REST_CNT 0x0c /* BASE+0c, W, R/W */ # define FIFO_REST_MASK 0x1ff # define FIFO_EMPTY_SHLD_FLAG BIT(14) # define FIFO_FULL_SHLD_FLAG BIT(15) -#define SREQ_SMPL_RATE 0x0f /* BASE+0f, B, R/W */ +#define SREQ_SMPL_RATE 0x0f /* BASE+0f, B, R/W */ # define SREQSMPLRATE_RATE0 BIT(0) # define SREQSMPLRATE_RATE1 BIT(1) # define SAMPLING_ENABLE BIT(2) +# define SMPL_40M (0) /* 40MHz: 0-100ns/period */ +# define SMPL_20M (SREQSMPLRATE_RATE0) /* 20MHz: 100-200ns/period */ +# define SMPL_10M (SREQSMPLRATE_RATE1) /* 10Mhz: 200- ns/period */ -#define SCSI_BUS_CONTROL 0x10 /* BASE+10, B, R/W */ +#define SCSI_BUS_CONTROL 0x10 /* BASE+10, B, R/W */ # define BUSCTL_SEL BIT(0) # define BUSCTL_RST BIT(1) # define BUSCTL_DATAOUT_ENB BIT(2) @@ -168,16 +181,21 @@ # define AUTODIRECTION BIT(6) # define ACKENB BIT(7) -#define CLR_COUNTER 0x12 /* BASE+12, B, W */ +#define CLR_COUNTER 0x12 /* BASE+12, B, W */ # define ACK_COUNTER_CLR BIT(0) # define SREQ_COUNTER_CLR BIT(1) # define FIFO_HOST_POINTER_CLR BIT(2) # define FIFO_REST_COUNT_CLR BIT(3) # define BM_COUNTER_CLR BIT(4) # define SAVED_ACK_CLR BIT(5) -# define CLRCOUNTER_ALLMASK (BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5)) +# define CLRCOUNTER_ALLMASK (ACK_COUNTER_CLR | \ + SREQ_COUNTER_CLR | \ + FIFO_HOST_POINTER_CLR | \ + FIFO_REST_COUNT_CLR | \ + BM_COUNTER_CLR | \ + SAVED_ACK_CLR ) -#define SCSI_BUS_MONITOR 0x12 /* BASE+12, B, R */ +#define SCSI_BUS_MONITOR 0x12 /* BASE+12, B, R */ # define BUSMON_MSG BIT(0) # define BUSMON_IO BIT(1) # define BUSMON_CD BIT(2) @@ -187,20 +205,20 @@ # define BUSMON_SEL BIT(6) # define BUSMON_ATN BIT(7) -#define COMMAND_DATA 0x14 /* BASE+14, B, R/W */ +#define COMMAND_DATA 0x14 /* BASE+14, B, R/W */ -#define PARITY_CONTROL 0x16 /* BASE+16, B, R/W */ +#define PARITY_CONTROL 0x16 /* BASE+16, B, W */ # define PARITY_CHECK_ENABLE BIT(0) # define PARITY_ERROR_CLEAR BIT(1) -#define PARITY_STATUS 0x16 +#define PARITY_STATUS 0x16 /* BASE+16, B, R */ //# define PARITY_CHECK_ENABLE BIT(0) # define PARITY_ERROR_NORMAL BIT(1) # define PARITY_ERROR_LSB BIT(1) # define PARITY_ERROR_MSB BIT(2) -#define RESELECT_ID 0x18 /* BASE+18, B, R */ +#define RESELECT_ID 0x18 /* BASE+18, B, R */ -#define COMMAND_CONTROL 0x18 /* BASE+18, W, W */ +#define COMMAND_CONTROL 0x18 /* BASE+18, W, W */ # define CLEAR_CDB_FIFO_POINTER BIT(0) # define AUTO_COMMAND_PHASE BIT(1) # define AUTOSCSI_START BIT(2) @@ -211,27 +229,27 @@ # define AUTO_MSGIN_02 BIT(7) # define AUTO_MSGIN_03 BIT(8) -#define SET_ARBIT 0x1a /* BASE+1a, B, W */ +#define SET_ARBIT 0x1a /* BASE+1a, B, W */ # define ARBIT_GO BIT(0) # define ARBIT_CLEAR BIT(1) -#define ARBIT_STATUS 0x1a /* BASE+1a, B, R */ +#define ARBIT_STATUS 0x1a /* BASE+1a, B, R */ //# define ARBIT_GO BIT(0) # define ARBIT_WIN BIT(1) # define ARBIT_FAIL BIT(2) # define AUTO_PARAMETER_VALID BIT(3) # define SGT_VALID BIT(4) -#define SYNC_REG 0x1c /* BASE+1c, B, R/W */ +#define SYNC_REG 0x1c /* BASE+1c, B, R/W */ -#define ACK_WIDTH 0x1d /* BASE+1d, B, R/W */ +#define ACK_WIDTH 0x1d /* BASE+1d, B, R/W */ -#define SCSI_DATA_WITH_ACK 0x20 /* BASE+20, B, R/W */ +#define SCSI_DATA_WITH_ACK 0x20 /* BASE+20, B, R/W */ #define SCSI_OUT_LATCH_TARGET_ID 0x22 /* BASE+22, B, W */ -#define SCSI_DATA_IN 0x22 /* BASE+22, B, R */ +#define SCSI_DATA_IN 0x22 /* BASE+22, B, R */ -#define SCAM_CONTROL 0x24 /* BASE+24, B, W */ -#define SCAM_STATUS 0x24 /* BASE+24, B, R */ +#define SCAM_CONTROL 0x24 /* BASE+24, B, W */ +#define SCAM_STATUS 0x24 /* BASE+24, B, R */ # define SCAM_MSG BIT(0) # define SCAM_IO BIT(1) # define SCAM_CD BIT(2) @@ -239,31 +257,31 @@ # define SCAM_SEL BIT(4) # define SCAM_XFEROK BIT(5) -#define SCAM_DATA 0x26 /* BASE+26, B, R/W */ -# define SD0 BIT(0) -# define SD1 BIT(1) -# define SD2 BIT(2) -# define SD3 BIT(3) -# define SD4 BIT(4) -# define SD5 BIT(5) -# define SD6 BIT(6) -# define SD7 BIT(7) - -#define SACK_CNT 0x28 /* BASE+28, DW, R/W */ -#define SREQ_CNT 0x2c /* BASE+2c, DW, R/W */ - -#define FIFO_DATA_LOW 0x30 /* BASE+30, B/W/DW, R/W */ -#define FIFO_DATA_HIGH 0x32 /* BASE+32, B/W, R/W */ -#define BM_START_ADR 0x34 /* BASE+34, DW, R/W */ - -#define BM_CNT 0x38 /* BASE+38, DW, R/W */ -# define BM_COUNT_MASK 0x0001ffff -# define SGTEND BIT(31) +#define SCAM_DATA 0x26 /* BASE+26, B, R/W */ +# define SD0 BIT(0) +# define SD1 BIT(1) +# define SD2 BIT(2) +# define SD3 BIT(3) +# define SD4 BIT(4) +# define SD5 BIT(5) +# define SD6 BIT(6) +# define SD7 BIT(7) + +#define SACK_CNT 0x28 /* BASE+28, DW, R/W */ +#define SREQ_CNT 0x2c /* BASE+2c, DW, R/W */ + +#define FIFO_DATA_LOW 0x30 /* BASE+30, B/W/DW, R/W */ +#define FIFO_DATA_HIGH 0x32 /* BASE+32, B/W, R/W */ +#define BM_START_ADR 0x34 /* BASE+34, DW, R/W */ + +#define BM_CNT 0x38 /* BASE+38, DW, R/W */ +# define BM_COUNT_MASK 0x0001ffffUL +# define SGTEND BIT(31) /* Last SGT marker */ -#define SGT_ADR 0x3c /* BASE+3c, DW, R/W */ -#define WAIT_REG 0x40 /* Bi only */ +#define SGT_ADR 0x3c /* BASE+3c, DW, R/W */ +#define WAIT_REG 0x40 /* Bi only */ -#define SCSI_EXECUTE_PHASE 0x40 /* BASE+40, W, R */ +#define SCSI_EXECUTE_PHASE 0x40 /* BASE+40, W, R */ # define COMMAND_PHASE BIT(0) # define DATA_IN_PHASE BIT(1) # define DATA_OUT_PHASE BIT(2) @@ -280,14 +298,14 @@ # define MSGIN_04_VALID BIT(13) # define AUTOSCSI_BUSY BIT(15) -#define SCSI_CSB_IN 0x42 /* BASE+42, B, R */ +#define SCSI_CSB_IN 0x42 /* BASE+42, B, R */ -#define SCSI_MSG_OUT 0x44 /* BASE+44, DW, R/W */ +#define SCSI_MSG_OUT 0x44 /* BASE+44, DW, R/W */ # define MSGOUT_COUNT_MASK (BIT(0)|BIT(1)) -# define MV_VALID BIT(7) +# define MSGOUT_VALID BIT(7) -#define SEL_TIME_OUT 0x48 /* BASE+48, W, R/W */ -#define SAVED_SACK_CNT 0x4c /* BASE+4c, DW, R */ +#define SEL_TIME_OUT 0x48 /* BASE+48, W, R/W */ +#define SAVED_SACK_CNT 0x4c /* BASE+4c, DW, R */ #define HTOSDATADELAY 0x50 /* BASE+50, B, R/W */ #define STOHDATADELAY 0x54 /* BASE+54, B, R/W */ @@ -299,21 +317,21 @@ /* indexed register */ /********************/ -#define CLOCK_DIV 0x00 /* BASE+08, IDX+00, B, R/W */ -# define CLOCK_2 BIT(0) /* MCLK/2 */ -# define CLOCK_4 BIT(1) /* MCLK/4 */ -# define PCICLK BIT(7) /* PCICLK (33MHz) */ +#define CLOCK_DIV 0x00 /* BASE+08, IDX+00, B, R/W */ +# define CLOCK_2 BIT(0) /* MCLK/2 */ +# define CLOCK_4 BIT(1) /* MCLK/4 */ +# define PCICLK BIT(7) /* PCICLK (33MHz) */ -#define TERM_PWR_CONTROL 0x01 /* BASE+08, IDX+01, B, R/W */ +#define TERM_PWR_CONTROL 0x01 /* BASE+08, IDX+01, B, R/W */ # define BPWR BIT(0) # define SENSE BIT(1) /* Read Only */ -#define EXT_PORT_DDR 0x02 /* BASE+08, IDX+02, B, R/W */ -#define EXT_PORT 0x03 /* BASE+08, IDX+03, B, R/W */ -# define LED_ON 0 -# define LED_OFF 1 +#define EXT_PORT_DDR 0x02 /* BASE+08, IDX+02, B, R/W */ +#define EXT_PORT 0x03 /* BASE+08, IDX+03, B, R/W */ +# define LED_ON (0) +# define LED_OFF BIT(0) -#define IRQ_SELECT 0x04 /* BASE+08, IDX+04, W, R/W */ +#define IRQ_SELECT 0x04 /* BASE+08, IDX+04, W, R/W */ # define IRQSELECT_RESELECT_IRQ BIT(0) # define IRQSELECT_PHASE_CHANGE_IRQ BIT(1) # define IRQSELECT_SCSIRESET_IRQ BIT(2) @@ -326,32 +344,35 @@ # define IRQSELECT_BMCNTERR_IRQ BIT(9) # define IRQSELECT_AUTO_SCSI_SEQ_IRQ BIT(10) -#define OLD_SCSI_PHASE 0x05 /* BASE+08, IDX+05, B, R */ +#define OLD_SCSI_PHASE 0x05 /* BASE+08, IDX+05, B, R */ # define OLD_MSG BIT(0) # define OLD_IO BIT(1) # define OLD_CD BIT(2) # define OLD_BUSY BIT(3) -#define FIFO_FULL_SHLD_COUNT 0x06 /* BASE+08, IDX+06, B, R/W */ -#define FIFO_EMPTY_SHLD_COUNT 0x07 /* BASE+08, IDX+07, B, R/W */ +#define FIFO_FULL_SHLD_COUNT 0x06 /* BASE+08, IDX+06, B, R/W */ +#define FIFO_EMPTY_SHLD_COUNT 0x07 /* BASE+08, IDX+07, B, R/W */ -#define EXP_ROM_CONTROL 0x08 /* BASE+08, IDX+08, B, R/W */ +#define EXP_ROM_CONTROL 0x08 /* BASE+08, IDX+08, B, R/W */ /* external ROM control */ +# define ROM_WRITE_ENB BIT(0) +# define IO_ACCESS_ENB BIT(1) +# define ROM_ADR_CLEAR BIT(2) -#define EXP_ROM_ADRL 0x09 /* BASE+08, IDX+09, W, R/W */ +#define EXP_ROM_ADR 0x09 /* BASE+08, IDX+09, W, R/W */ #define EXP_ROM_DATA 0x0a /* BASE+08, IDX+0a, B, R/W */ -#define CHIP_MODE 0x0b /* Bi only */ -# define OEM0 BIT(1) -# define OEM1 BIT(2) -# define OPTB BIT(3) -# define OPTC BIT(4) -# define OPTD BIT(5) -# define OPTE BIT(6) -# define OPTF BIT(7) +#define CHIP_MODE 0x0b /* BASE+08, IDX+0b, B, R */ /* NinjaSCSI-32Bi only */ +# define OEM0 BIT(1) /* OEM select */ /* 00=I-O DATA, 01=KME, 10=Workbit, 11=Ext ROM */ +# define OEM1 BIT(2) /* OEM select */ +# define OPTB BIT(3) /* KME mode select */ +# define OPTC BIT(4) /* KME mode select */ +# define OPTD BIT(5) /* KME mode select */ +# define OPTE BIT(6) /* KME mode select */ +# define OPTF BIT(7) /* Power management */ -#define MISC_WR 0x0c /* BASE+08, IDX+0c, W, R/W */ -#define MISC_RD 0x0c +#define MISC_WR 0x0c /* BASE+08, IDX+0c, W, R/W */ +#define MISC_RD 0x0c # define SCSI_DIRECTION_DETECTOR_SELECT BIT(0) # define SCSI2_HOST_DIRECTION_VALID BIT(1) /* Read only */ # define HOST2_SCSI_DIRECTION_VALID BIT(2) /* Read only */ @@ -362,7 +383,7 @@ # define MISC_MABORT_MASK BIT(7) # define BMSTOP_CHANGE2_NONDATA_PHASE BIT(8) -#define BM_CYCLE 0x0d /* BASE+08, IDX+0d, B, R/W */ +#define BM_CYCLE 0x0d /* BASE+08, IDX+0d, B, R/W */ # define BM_CYCLE0 BIT(0) # define BM_CYCLE1 BIT(1) # define BM_FRAME_ASSERT_TIMING BIT(2) @@ -373,20 +394,26 @@ # define MEMRD_CMD1 BIT(7) -#define SREQ_EDGH 0x0e /* BASE+08, IDX+0e, B, W */ +#define SREQ_EDGH 0x0e /* BASE+08, IDX+0e, B, W */ # define SREQ_EDGH_SELECT BIT(0) -#define UP_CNT 0x0f /* BASE+08, IDX+0f, B, W */ -#define CFG_CMD_STR 0x10 /* BASE+08, IDX+10, W, R */ -#define CFG_LATE_CACHE 0x11 /* BASE+08, IDX+11, W, R/W */ -#define CFG_BASE_ADR_1 0x12 /* BASE+08, IDX+12, W, R */ -#define CFG_BASE_ADR_2 0x13 /* BASE+08, IDX+13, W, R */ -#define CFG_INLINE 0x14 /* BASE+08, IDX+14, W, R */ - -#define SERIAL_ROM_CTL 0x15 /* BASE+08, IDX+15, B, R */ -# define SCL BIT(0) -# define ENA BIT(1) -# define SDA BIT(2) +#define UP_CNT 0x0f /* BASE+08, IDX+0f, B, W */ /* For hardware testing. Don't use it. */ +# define REQCNT_UP BIT(0) +# define ACKCNT_UP BIT(1) +# define BMADR_UP BIT(4) +# define BMCNT_UP BIT(5) +# define SGT_CNT_UP BIT(7) + +#define CFG_CMD_STR 0x10 /* BASE+08, IDX+10, W, R */ +#define CFG_LATE_CACHE 0x11 /* BASE+08, IDX+11, W, R/W */ +#define CFG_BASE_ADR_1 0x12 /* BASE+08, IDX+12, W, R */ +#define CFG_BASE_ADR_2 0x13 /* BASE+08, IDX+13, W, R */ +#define CFG_INLINE 0x14 /* BASE+08, IDX+14, W, R */ + +#define SERIAL_ROM_CTL 0x15 /* BASE+08, IDX+15, B, R */ +# define SROM_CTL BIT(0) +# define SROM_ENABLE BIT(1) +# define SROM_DATA BIT(2) #define FIFO_HST_POINTER 0x16 /* BASE+08, IDX+16, B, R/W */ #define SREQ_DELAY 0x17 /* BASE+08, IDX+17, B, R/W */ @@ -425,5 +452,239 @@ #define BUSPHASE_STATUS ( BUSMON_STATUS & BUSMON_PHASE_MASK ) #define BUSPHASE_SELECT ( BUSMON_SEL | BUSMON_IO ) + +/************************************************************************ + * structure for DMA/Scatter Gather list + */ +#define NSP32_SG_SIZE SG_ALL + +/* All values must be little endian */ +typedef struct _nsp32_sgtable { + u32_le addr; /* transfer address */ + u32_le len; /* transfer length. BIT(31) is for SGTEND mark */ +} __attribute__ ((packed)) nsp32_sgtable; + +/* All values must be little endian */ +typedef struct _nsp32_sglun { + nsp32_sgtable sgt[NSP32_SG_SIZE+1]; /* SG table */ +} __attribute__ ((packed)) nsp32_sglun; +#define NSP32_SG_TABLE_SIZE (sizeof(nsp32_sgtable) * NSP32_SG_SIZE * MAX_TARGET * MAX_LUN) + +/* Auto parameter mode memory map. */ +/* All values must be little endian. */ +typedef struct _nsp32_autoparam { + u8 cdb[4 * 0x10]; /* SCSI Command */ + u32_le msgout; /* outgoing messages */ + u8 syncreg; /* sync register value */ + u8 ackwidth; /* ack width register value */ + u8 target_id; /* target/host device id */ + u8 sample_reg; /* hazard killer sampling rate */ + u16_le command_control; /* command control register */ + u16_le transfer_control; /* transfer control register */ + u32_le sgt_pointer; /* SG table physical address for DMA */ + u32_le dummy[2]; +} __attribute__ ((packed)) nsp32_autoparam; /* must be packed struct */ + +/* + * host data structure + */ +/* message in/out buffer */ +#define MSGOUTBUF_MAX 20 +#define MSGINBUF_MAX 20 + +/* flag for trans_method */ +#define NSP32_TRANSFER_BUSMASTER BIT(0) +#define NSP32_TRANSFER_MMIO BIT(1) /* Not supported yet */ +#define NSP32_TRANSFER_PIO BIT(2) /* Not supported yet */ + + +/* + * structure for connected LUN dynamic data + * + * Note: Currently tagged queuing is disabled, each nsp32_lunt holds + * one SCSI command and one state. + */ +#define DISCPRIV_OK BIT(0) /* DISCPRIV Enable mode */ +#define MSGIN03 BIT(1) /* Auto Msg In 03 Flag */ + +typedef struct _nsp32_lunt { + Scsi_Cmnd *SCpnt; /* Current Handling Scsi_Cmnd */ + unsigned long save_datp; /* Save Data Pointer - saved position from initial address */ + int msgin03; /* auto msg in 03 flag */ + unsigned int sg_num; /* Total number of SG entries */ + int cur_entry; /* Current SG entry number */ + nsp32_sglun *sglun; /* sg table per lun */ + dma_addr_t sglun_paddr; /* sglun physical address */ +} nsp32_lunt; + + +/* + * SCSI TARGET/LUN definition + */ +#define NSP32_HOST_SCSIID 7 /* SCSI initiator is everytime defined as 7 */ +#define MAX_TARGET 8 +#define MAX_LUN 8 /* XXX: In SPI3, max number of LUN is 64. */ + + +typedef struct _nsp32_sync_table { + unsigned char period_num; /* period number */ + unsigned char ackwidth; /* ack width designated by period */ + unsigned char start_period; /* search range - start period */ + unsigned char end_period; /* search range - end period */ + unsigned char sample_rate; /* hazard killer parameter */ +} nsp32_sync_table; + + +/* + * structure for target device static data + */ +/* flag for nsp32_target.sync_flag */ +#define SDTR_NONE 0 /* initial state */ +#define SDTR_INITIATOR BIT(0) /* sending SDTR from initiator */ +#define SDTR_TARGET BIT(1) /* sending SDTR from target */ +#define SDTR_DONE BIT(2) /* exchanging SDTR has been processed */ + +/* syncronous period value for nsp32_target.config_max */ +#define FAST5M 0x32 +#define FAST10M 0x19 +#define ULTRA20M 0x0c + +/* flag for nsp32_target.{sync_offset, period} */ +#define ASYNC_OFFSET 0 /* asynchronous transfer */ +#define MAX_OFFSET 0xf /* synchronous transfer max offset */ + +/* syncreg: + bit:07 06 05 04 03 02 01 00 + ---PERIOD-- ---OFFSET-- */ +#define TO_SYNCREG(period, offset) (((period) & 0x0f) << 4 | ((offset) & 0x0f)) + +typedef struct _nsp32_target { + unsigned char syncreg; /* value for SYNCREG */ + unsigned char ackwidth; /* value for ACKWIDTH */ + unsigned char period; /* sync period (0-255) */ + unsigned char offset; /* sync offset (0-15) */ + int sync_flag; /* SDTR_*, 0 */ + int limit_entry; /* max speed limit entry designated + by EEPROM configuration */ + unsigned char sample_reg; /* SREQ hazard killer register */ +} nsp32_target; + +typedef struct _nsp32_hw_data { + int IrqNumber; + int BaseAddress; + int NumAddress; + unsigned long MmioAddress; +#define NSP32_MMIO_OFFSET 0x0800 + unsigned long MmioLength; + + Scsi_Cmnd *CurrentSC; + + struct pci_dev *Pci; + const struct pci_device_id *pci_devid; + struct Scsi_Host *Host; + spinlock_t Lock; + + char info_str[100]; + + /* allocated memory region */ + nsp32_sglun *sg_list; /* sglist virtuxal address */ + dma_addr_t sg_paddr; /* physical address of hw_sg_table */ + nsp32_autoparam *autoparam; /* auto parameter transfer region */ + dma_addr_t auto_paddr; /* physical address of autoparam */ + int cur_entry; /* current sgt entry */ + + /* target/LUN */ + nsp32_lunt *cur_lunt; /* Current connected LUN table */ + nsp32_lunt lunt[MAX_TARGET][MAX_LUN]; /* All LUN table */ + + nsp32_target *cur_target; /* Current connected SCSI ID */ + nsp32_target target[MAX_TARGET]; /* SCSI ID */ + int cur_id; /* Current connected target ID */ + int cur_lun; /* Current connected target LUN */ + + /* behavior setting parameters */ + int trans_method; /* transfer method flag */ + int resettime; /* Reset time */ + int clock; /* clock dividing flag */ + nsp32_sync_table *synct; /* sync_table determined by clock */ + int syncnum; /* the max number of synct element */ + + /* message buffer */ + unsigned char msgoutbuf[MSGOUTBUF_MAX]; /* msgout buffer */ + char msgout_len; /* msgoutbuf length */ + unsigned char msginbuf [MSGINBUF_MAX]; /* megin buffer */ + char msgin_len; /* msginbuf length */ + +#ifdef CONFIG_PM + u32 PciState[16]; /* save PCI state to this area */ +#endif +} nsp32_hw_data; + +/* + * TIME definition + */ +#define RESET_HOLD_TIME 10000 /* reset time in us (SCSI-2 says the + minimum is 25us) */ +#define SEL_TIMEOUT_TIME 10000 /* 250ms defined in SCSI specification + (25.6us/1unit) */ +#define ARBIT_TIMEOUT_TIME 100 /* 100us */ +#define REQSACK_TIMEOUT_TIME 10000 /* max wait time for REQ/SACK assertion + or negation, 10000us == 10ms */ + +/************************************************************************** + * Compatibility functions + */ + +/* for Kernel 2.4 */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) +# define scsi_register_host(template) scsi_register_module(MODULE_SCSI_HA, template) +# define scsi_unregister_host(template) scsi_unregister_module(MODULE_SCSI_HA, template) +# define scsi_host_put(host) scsi_unregister(host) +# define pci_name(pci_dev) ((pci_dev)->slot_name) + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) +typedef void irqreturn_t; +# define IRQ_NONE /* */ +# define IRQ_HANDLED /* */ +# define IRQ_RETVAL(x) /* */ +#endif + +/* This is ad-hoc version of scsi_host_get_next() */ +static inline struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *host) +{ + if (host == NULL) { + return scsi_hostlist; + } else { + return host->next; + } +} + +/* This is ad-hoc version of scsi_host_hn_get() */ +static inline struct Scsi_Host *scsi_host_hn_get(unsigned short hostno) +{ + struct Scsi_Host *host; + + for (host = scsi_host_get_next(NULL); host != NULL; + host = scsi_host_get_next(host)) { + if (host->host_no == hostno) { + break; + } + } + + return host; +} + +/* host spin lock */ +# define HOST_LOCK (&io_request_lock) +#endif + +/* for Kernel 2.6 */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) +# define __devinitdata /* */ + +/* host spin lock */ +# define HOST_LOCK (data->Host->host_lock) +#endif + #endif /* _NSP32_H */ /* end */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/nsp32_debug.c linux-2.4.23-pre8/drivers/scsi/nsp32_debug.c --- linux-2.4.22/drivers/scsi/nsp32_debug.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/nsp32_debug.c 2003-10-22 22:49:44.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Workbit NinjaSCSI-32Bi/UDE PCI/Cardbus SCSI Host Bus Adapter driver + * Workbit NinjaSCSI-32Bi/UDE PCI/CardBus SCSI Host Bus Adapter driver * Debug routine * * This software may be used and distributed according to the terms of @@ -85,22 +85,22 @@ static void print_commandk (unsigned char *command) { - int i,s; + int i, size; // printk(KERN_DEBUG); print_opcodek(command[0]); - /*printk(KERN_DEBUG __func__ " ");*/ + /*printk(KERN_DEBUG "%s ", __FUNCTION__);*/ if ((command[0] >> 5) == 6 || (command[0] >> 5) == 7 ) { - s = 12; /* vender specific */ + size = 12; /* vender specific */ } else { - s = COMMAND_SIZE(command[0]); + size = COMMAND_SIZE(command[0]); } for ( i = 1; i < s; ++i) { printk("%02x ", command[i]); } - switch (s) { + switch (size) { case 6: printk("LBA=%d len=%d", (((unsigned int)command[1] & 0x0f) << 16) | @@ -137,9 +137,9 @@ printk("\n"); } -static void show_command(Scsi_Cmnd *ptr) +static void show_command(Scsi_Cmnd *SCpnt) { - print_commandk(ptr->cmnd); + print_commandk(SCpnt->cmnd); } static void show_busphase(unsigned char stat) @@ -260,3 +260,45 @@ } } +/* + * Byte dumper + * + * ptr: start address + * offset: offset value for address section + * size: dump size in byte + */ +static void nsp32_byte_dump(void *ptr, int offset, int size) +{ + unsigned char *tmp = ptr; + int pos; + + if (size == 0) { + return; + } + + pos = 0; + while(pos < size) { + /* address */ + if (pos % 16 == 0) { + printk(/*KERN_DEBUG*/ "%08x:", pos + offset); + } + + /* half separator */ + if (pos % 16 == 8) { + printk(" -"); + } + + printk(" %02x", tmp[pos]); + + /* Don't print "\n" at last line. + Because we can get one more "\n". */ + if ((pos % 16 == 15) && (pos + 1 != size)) { + printk("\n"); + } + + pos ++; + } + printk("\n"); +} + +/* end */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/nsp32_io.h linux-2.4.23-pre8/drivers/scsi/nsp32_io.h --- linux-2.4.22/drivers/scsi/nsp32_io.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/nsp32_io.h 2003-10-22 22:48:16.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Workbit NinjaSCSI-32Bi/UDE PCI/Cardbus SCSI Host Bus Adapter driver + * Workbit NinjaSCSI-32Bi/UDE PCI/CardBus SCSI Host Bus Adapter driver * I/O routine * * This software may be used and distributed according to the terms of @@ -22,30 +22,30 @@ return inb(base + index); } -static inline void nsp32_write2(unsigned int base, - unsigned int index, +static inline void nsp32_write2(unsigned int base, + unsigned int index, unsigned short val) { - outw(cpu_to_le16(val), (base + index)); + outw(val, (base + index)); } static inline unsigned short nsp32_read2(unsigned int base, unsigned int index) { - return le16_to_cpu(inw(base + index)); + return inw(base + index); } static inline void nsp32_write4(unsigned int base, unsigned int index, unsigned long val) { - outl(cpu_to_le32(val), (base + index)); + outl(val, (base + index)); } static inline unsigned long nsp32_read4(unsigned int base, unsigned int index) { - return le32_to_cpu(inl(base + index)); + return inl(base + index); } /*==============================================*/ @@ -58,7 +58,7 @@ ptr = (unsigned char *)(base + NSP32_MMIO_OFFSET + index); - *ptr = val; + writeb(val, ptr); } static inline unsigned char nsp32_mmio_read1(unsigned long base, @@ -68,18 +68,18 @@ ptr = (unsigned char *)(base + NSP32_MMIO_OFFSET + index); - return *ptr; + return readb(ptr); } -static inline void nsp32_mmio_write2(unsigned long base, - unsigned int index, +static inline void nsp32_mmio_write2(unsigned long base, + unsigned int index, unsigned short val) { volatile unsigned short *ptr; ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + index); - *ptr = cpu_to_le16(val); + writew(cpu_to_le16(val), ptr); } static inline unsigned short nsp32_mmio_read2(unsigned long base, @@ -87,11 +87,9 @@ { volatile unsigned short *ptr; - //printk(__FUNCTION__ "\n"); - ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + index); - return le16_to_cpu(*ptr); + return le16_to_cpu(readw(ptr)); } static inline void nsp32_mmio_write4(unsigned long base, @@ -102,7 +100,7 @@ ptr = (unsigned long *)(base + NSP32_MMIO_OFFSET + index); - *ptr = cpu_to_le32(val); + writel(cpu_to_le32(val), ptr); } static inline unsigned long nsp32_mmio_read4(unsigned long base, @@ -110,16 +108,12 @@ { volatile unsigned long *ptr; - //printk(__FUNCTION__ "\n"); - ptr = (unsigned long *)(base + NSP32_MMIO_OFFSET + index); - return le32_to_cpu(*ptr); + return le32_to_cpu(readl(ptr)); } - -/*=============================================*/ - +/*==============================================*/ static inline unsigned char nsp32_index_read1(unsigned int base, unsigned int reg) @@ -132,7 +126,7 @@ unsigned int reg, unsigned char val) { - outb(reg, base + INDEX_REG); + outb(reg, base + INDEX_REG ); outb(val, base + DATA_REG_LOW); } @@ -140,15 +134,15 @@ unsigned int reg) { outb(reg, base + INDEX_REG); - return le16_to_cpu(inw(base + DATA_REG_LOW)); + return inw(base + DATA_REG_LOW); } -static inline void nsp32_index_write2(unsigned int base, - unsigned int reg, +static inline void nsp32_index_write2(unsigned int base, + unsigned int reg, unsigned short val) { - outb(reg, base + INDEX_REG); - outw(cpu_to_le16(val), base + DATA_REG_LOW); + outb(reg, base + INDEX_REG ); + outw(val, base + DATA_REG_LOW); } static inline unsigned long nsp32_index_read4(unsigned int base, @@ -157,8 +151,8 @@ unsigned long h,l; outb(reg, base + INDEX_REG); - l = le16_to_cpu(inw(base + DATA_REG_LOW)); - h = le16_to_cpu(inw(base + DATA_REG_HI )); + l = inw(base + DATA_REG_LOW); + h = inw(base + DATA_REG_HI ); return ((h << 16) | l); } @@ -170,15 +164,14 @@ unsigned long h,l; h = (val & 0xffff0000) >> 16; - l = (val & 0x0000ffff) >> 0; + l = (val & 0x0000ffff) >> 0; - outb(reg, base + INDEX_REG); - outw(cpu_to_le16(l), base + DATA_REG_LOW); - outw(cpu_to_le16(h), base + DATA_REG_HI); + outb(reg, base + INDEX_REG ); + outw(l, base + DATA_REG_LOW); + outw(h, base + DATA_REG_HI ); } - -/* ===================================*/ +/*==============================================*/ static inline unsigned char nsp32_mmio_index_read1(unsigned int base, unsigned int reg) @@ -188,13 +181,12 @@ index_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + INDEX_REG); data_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + DATA_REG_LOW); - *index_ptr = reg; - - return ((*data_ptr) & 0xff); + writeb(reg, index_ptr); + return readb(data_ptr); } -static inline void nsp32_mmio_index_write1(unsigned int base, - unsigned int reg, +static inline void nsp32_mmio_index_write1(unsigned int base, + unsigned int reg, unsigned char val) { volatile unsigned short *index_ptr, *data_ptr; @@ -202,8 +194,8 @@ index_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + INDEX_REG); data_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + DATA_REG_LOW); - *index_ptr = reg; - *data_ptr = (unsigned short)val; + writeb(reg, index_ptr); + writeb(val, data_ptr ); } static inline unsigned short nsp32_mmio_index_read2(unsigned int base, @@ -214,13 +206,12 @@ index_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + INDEX_REG); data_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + DATA_REG_LOW); - *index_ptr = reg; - - return le16_to_cpu(*data_ptr); + writeb(reg, index_ptr); + return le16_to_cpu(readw(data_ptr)); } -static inline void nsp32_mmio_index_write2(unsigned int base, - unsigned int reg, +static inline void nsp32_mmio_index_write2(unsigned int base, + unsigned int reg, unsigned short val) { volatile unsigned short *index_ptr, *data_ptr; @@ -228,34 +219,33 @@ index_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + INDEX_REG); data_ptr = (unsigned short *)(base + NSP32_MMIO_OFFSET + DATA_REG_LOW); - *index_ptr = reg; - *data_ptr = val; + writeb(reg, index_ptr); + writew(cpu_to_le16(val), data_ptr ); } -/*-------------------------------------------------------------------*/ +/*==============================================*/ -static inline void nsp32_multi_read4(unsigned int BaseAddr, - unsigned int Register, +static inline void nsp32_multi_read4(unsigned int base, + unsigned int reg, void *buf, unsigned long count) { - insl(BaseAddr + Register, buf, count); + insl(base + reg, buf, count); } static inline void nsp32_fifo_read(unsigned int base, void *buf, unsigned long count) { - //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx*4\n", buf, count); nsp32_multi_read4(base, FIFO_DATA_LOW, buf, count); } -static inline void nsp32_multi_write4(unsigned int BaseAddr, - unsigned int Register, +static inline void nsp32_multi_write4(unsigned int base, + unsigned int reg, void *buf, unsigned long count) { - outsl(BaseAddr + Register, buf, count); + outsl(base + reg, buf, count); } static inline void nsp32_fifo_write(unsigned int base, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/pas16.c linux-2.4.23-pre8/drivers/scsi/pas16.c --- linux-2.4.22/drivers/scsi/pas16.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/pas16.c 2003-10-22 22:47:30.000000000 +0000 @@ -99,11 +99,11 @@ * interrupts. Ie, for a board at the default 0x388 base port, * boot: linux pas16=0x388,255 * - * IRQ_NONE (255) should be specified for no interrupt, + * SCSI_IRQ_NONE (255) should be specified for no interrupt, * IRQ_AUTO (254) to autoprobe for an IRQ line if overridden * on the command line. * - * (IRQ_AUTO == 254, IRQ_NONE == 255 in NCR5380.h) + * (IRQ_AUTO == 254, SCSI_IRQ_NONE == 255 in NCR5380.h) */ #include @@ -404,13 +404,13 @@ else instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS); - if (instance->irq != IRQ_NONE) + if (instance->irq != SCSI_IRQ_NONE) if (request_irq(instance->irq, do_pas16_intr, SA_INTERRUPT, "pas16", NULL)) { printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; } - if (instance->irq == IRQ_NONE) { + if (instance->irq == SCSI_IRQ_NONE) { printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no); printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no); /* Disable 5380 interrupts, leave drive params the same */ @@ -420,7 +420,7 @@ printk(KERN_INFO "scsi%d : at 0x%04x", instance->host_no, (int) instance->io_port); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) printk(" interrupts disabled"); else printk(" irq %d", instance->irq); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/pcmcia/nsp_cs.c linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_cs.c --- linux-2.4.22/drivers/scsi/pcmcia/nsp_cs.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_cs.c 2003-10-22 22:49:48.000000000 +0000 @@ -1,8 +1,10 @@ /*====================================================================== - NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI hostadapter card driver + NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver By: YOKOTA Hiroshi + Ver.2.8 Support 32bit MMIO mode + Support Synchronous Data Transfer Request (SDTR) mode Ver.2.0 Support 32bit PIO mode Ver.1.1.2 Fix for scatter list buffer exceeds Ver.1.1 Support scatter list @@ -23,34 +25,32 @@ ***********************************************************************/ -/* $Id: nsp_cs.c,v 1.42 2001/09/10 10:30:58 elca Exp $ */ - -#ifdef NSP_KERNEL_2_2 -#include -#include -#endif +/* $Id: nsp_cs.c,v 1.25 2003/09/24 10:38:18 elca Exp $ */ +#include #include #include #include #include #include #include +#include #include #include -#include #include #include #include -#include +#include #include +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) +# include +#endif #include #include #include <../drivers/scsi/scsi.h> #include <../drivers/scsi/hosts.h> -#include <../drivers/scsi/sd.h> #include #include @@ -59,138 +59,192 @@ #include #include #include +#include #include #include "nsp_cs.h" MODULE_AUTHOR("YOKOTA Hiroshi "); -MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module"); +MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module $Revision: 1.25 $"); MODULE_SUPPORTED_DEVICE("sd,sr,sg,st"); MODULE_LICENSE("GPL"); -#ifdef PCMCIA_DEBUG -static int pc_debug = PCMCIA_DEBUG; -MODULE_PARM(pc_debug, "i"); -MODULE_PARM_DESC(pc_debug, "set debug level"); -static char *version = "$Id: nsp_cs.c,v 1.42 2001/09/10 10:30:58 elca Exp $"; -#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) -#else -#define DEBUG(n, args...) /* */ -#endif - #include "nsp_io.h" /*====================================================================*/ +/* Parameters that can be set with 'insmod' */ -typedef struct scsi_info_t { - dev_link_t link; - struct Scsi_Host *host; - int ndev; - dev_node_t node[8]; - int stop; - struct bus_operations *bus; -} scsi_info_t; +static unsigned int irq_mask = 0xffff; +MODULE_PARM (irq_mask, "i"); +MODULE_PARM_DESC(irq_mask, "IRQ mask bits (default: 0xffff)"); +static int irq_list[4] = { -1 }; +MODULE_PARM (irq_list, "1-4i"); +MODULE_PARM_DESC(irq_list, "Use specified IRQ number. (default: auto select)"); + +static int nsp_burst_mode = BURST_MEM32; +MODULE_PARM (nsp_burst_mode, "i"); +MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))"); + +/* Release IO ports after configuration? */ +static int free_ports = 0; +MODULE_PARM (free_ports, "i"); +MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))"); -/*----------------------------------------------------------------*/ - -#if (KERNEL_VERSION(2,4,0) > LINUX_VERSION_CODE) -#define PROC_SCSI_NSP PROC_SCSI_IBMMCA /* bad hack... */ -static struct proc_dir_entry proc_scsi_nsp = { - PROC_SCSI_NSP, 6, "nsp_cs", - S_IFDIR | S_IRUGO | S_IXUGO, 2 -}; +/* /usr/src/linux/drivers/scsi/hosts.h */ +static Scsi_Host_Template nsp_driver_template = { + .proc_name = "nsp_cs", + .proc_info = nsp_proc_info, + .name = "WorkBit NinjaSCSI-3/32Bi(16bit)", +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) + .detect = nsp_detect_old, + .release = nsp_release_old, +#endif + .info = nsp_info, + .queuecommand = nsp_queuecommand, +/* .eh_strategy_handler = nsp_eh_strategy,*/ +/* .eh_abort_handler = nsp_eh_abort,*/ +/* .eh_device_reset_handler = nsp_eh_device_reset,*/ + .eh_bus_reset_handler = nsp_eh_bus_reset, + .eh_host_reset_handler = nsp_eh_host_reset, + .can_queue = 1, + .this_id = NSP_INITIATOR_ID, + .sg_tablesize = SG_ALL, + .cmd_per_lun = 1, + .use_clustering = DISABLE_CLUSTERING, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2)) + .use_new_eh_code = 1, #endif +}; -/*====================================================================*/ -/* Parameters that can be set with 'insmod' */ +static dev_link_t *dev_list = NULL; +static dev_info_t dev_info = "nsp_cs"; -static unsigned int irq_mask = 0xffff; -MODULE_PARM(irq_mask, "i"); -MODULE_PARM_DESC(irq_mask, "IRQ mask bits"); +static nsp_hw_data nsp_data_base; /* attach <-> detect glue */ -static int irq_list[4] = { -1 }; -MODULE_PARM(irq_list, "1-4i"); -MODULE_PARM_DESC(irq_list, "IRQ number list"); -/*----------------------------------------------------------------*/ -/* driver state info, local to driver */ -static char nspinfo[100]; /* description */ -/* /usr/src/linux/drivers/scsi/hosts.h */ -static Scsi_Host_Template driver_template = { -/* next: NULL,*/ -#if (KERNEL_VERSION(2,3,99) > LINUX_VERSION_CODE) - proc_dir: &proc_scsi_nsp, /* kernel 2.2 */ +/****************************************************************** + * debug, error print + */ +#ifdef NSP_DEBUG +# include "nsp_debug.c" +#endif /* NSP_DEBUG */ + +#ifndef NSP_DEBUG +# define NSP_DEBUG_MASK 0x000000 +# define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args) +# define nsp_dbg(mask, args...) /* */ #else - proc_name: "nsp_cs", /* kernel 2.4 */ +# define NSP_DEBUG_MASK 0xffffff +# define nsp_msg(type, args...) \ + nsp_cs_message (__FUNCTION__, __LINE__, (type), args) +# define nsp_dbg(mask, args...) \ + nsp_cs_dmessage(__FUNCTION__, __LINE__, (mask), args) #endif -/* proc_info: NULL,*/ - name: "WorkBit NinjaSCSI-3/32Bi", - detect: nsp_detect, - release: nsp_release, - info: nsp_info, -/* command: NULL,*/ - queuecommand: nsp_queuecommand, -/* eh_strategy_handler: nsp_eh_strategy,*/ - eh_abort_handler: nsp_eh_abort, - eh_device_reset_handler: nsp_eh_device_reset, - eh_bus_reset_handler: nsp_eh_bus_reset, - eh_host_reset_handler: nsp_eh_host_reset, - abort: nsp_abort, - reset: nsp_reset, -/* slave_attach: NULL,*/ -/* bios_param: NULL,*/ - can_queue: 1, - this_id: SCSI_INITIATOR_ID, - sg_tablesize: SG_ALL, - cmd_per_lun: 1, -/* present: 0,*/ -/* unchecked_isa_dma: 0,*/ - use_clustering: DISABLE_CLUSTERING, - use_new_eh_code: 0, -/* emulated: 0,*/ -}; -static dev_link_t *dev_list = NULL; -static dev_info_t dev_info = {"nsp_cs"}; +#define NSP_DEBUG_QUEUECOMMAND BIT(0) +#define NSP_DEBUG_REGISTER BIT(1) +#define NSP_DEBUG_AUTOSCSI BIT(2) +#define NSP_DEBUG_INTR BIT(3) +#define NSP_DEBUG_SGLIST BIT(4) +#define NSP_DEBUG_BUSFREE BIT(5) +#define NSP_DEBUG_CDB_CONTENTS BIT(6) +#define NSP_DEBUG_RESELECTION BIT(7) +#define NSP_DEBUG_MSGINOCCUR BIT(8) +#define NSP_DEBUG_EEPROM BIT(9) +#define NSP_DEBUG_MSGOUTOCCUR BIT(10) +#define NSP_DEBUG_BUSRESET BIT(11) +#define NSP_DEBUG_RESTART BIT(12) +#define NSP_DEBUG_SYNC BIT(13) +#define NSP_DEBUG_WAIT BIT(14) +#define NSP_DEBUG_TARGETFLAG BIT(15) +#define NSP_DEBUG_PROC BIT(16) +#define NSP_DEBUG_INIT BIT(17) +#define NSP_DEBUG_DATA_IO BIT(18) +#define NSP_SPECIAL_PRINT_REGISTER BIT(20) + +#define NSP_DEBUG_BUF_LEN 150 + +static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...) +{ + va_list args; + char buf[NSP_DEBUG_BUF_LEN]; + + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); -static nsp_hw_data nsp_data; +#ifndef NSP_DEBUG + printk("%snsp_cs: %s\n", type, buf); +#else + printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf); +#endif +} + +#ifdef NSP_DEBUG +static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...) +{ + va_list args; + char buf[NSP_DEBUG_BUF_LEN]; + + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + if (mask & NSP_DEBUG_MASK) { + printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf); + } +} +#endif /***********************************************************/ +/*==================================================== + * Clenaup parameters and call done() functions. + * You must be set SCpnt->result before call this function. + */ +static void nsp_scsi_done(Scsi_Cmnd *SCpnt) +{ + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + + data->CurrentSC = NULL; + + SCpnt->scsi_done(SCpnt); +} + static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) { -#ifdef PCMCIA_DEBUG - //unsigned int host_id = SCpnt->host->this_id; - //unsigned int base = SCpnt->host->io_port; - unsigned char target = SCpnt->target; -#endif - nsp_hw_data *data = &nsp_data; - - DEBUG(0, __FUNCTION__ "() SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d\n", - SCpnt, target, SCpnt->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg); - //DEBUG(0, " before CurrentSC=0x%p\n", data->CurrentSC); - - if(data->CurrentSC != NULL) { - printk(KERN_DEBUG " " __FUNCTION__ "() CurrentSC!=NULL this can't be happen\n"); - data->CurrentSC = NULL; +#ifdef NSP_DEBUG + /*unsigned int host_id = SCpnt->device->host->this_id;*/ + /*unsigned int base = SCpnt->device->host->io_port;*/ + unsigned char target = SCpnt->device->id; +#endif + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + + nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "SCpnt=0x%p target=%d lun=%d buff=0x%p bufflen=%d use_sg=%d", + SCpnt, target, SCpnt->device->lun, SCpnt->request_buffer, SCpnt->request_bufflen, SCpnt->use_sg); + //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC); + + SCpnt->scsi_done = done; + + if (data->CurrentSC != NULL) { + nsp_msg(KERN_WARNING, "CurrentSC!=NULL this can't be happen"); SCpnt->result = DID_BAD_TARGET << 16; - done(SCpnt); - return -1; + nsp_scsi_done(SCpnt); + return SCSI_MLQUEUE_HOST_BUSY; } show_command(SCpnt); - SCpnt->scsi_done = done; data->CurrentSC = SCpnt; - RESID = SCpnt->request_bufflen; - SCpnt->SCp.Status = -1; - SCpnt->SCp.Message = -1; + SCpnt->SCp.Status = CHECK_CONDITION; + SCpnt->SCp.Message = 0; SCpnt->SCp.have_data_in = IO_UNKNOWN; SCpnt->SCp.sent_command = 0; SCpnt->SCp.phase = PH_UNDETERMINED; + SCpnt->resid = SCpnt->request_bufflen; /* setup scratch area SCp.ptr : buffer pointer @@ -200,7 +254,7 @@ SCp.phase : current state of the command */ if (SCpnt->use_sg) { SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer); SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1; } else { @@ -210,16 +264,18 @@ SCpnt->SCp.buffers_residual = 0; } - if(nsphw_start_selection(SCpnt, data) == FALSE) { - DEBUG(0, " selection fail\n"); - data->CurrentSC = NULL; - SCpnt->result = DID_NO_CONNECT << 16; - done(SCpnt); - return -1; + if (nsphw_start_selection(SCpnt) == FALSE) { + nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail"); + SCpnt->result = DID_BUS_BUSY << 16; + nsp_scsi_done(SCpnt); + return SCSI_MLQUEUE_DEVICE_BUSY; } - //DEBUG(0, __FUNCTION__ "() out\n"); + //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out"); +#ifdef NSP_DEBUG + data->CmdId++; +#endif return 0; } @@ -231,7 +287,7 @@ unsigned int base = data->BaseAddress; unsigned char transfer_mode_reg; - //DEBUG(0, __FUNCTION__ "() enabled=%d\n", enabled); + //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled); if (enabled != FALSE) { transfer_mode_reg = TRANSFER_GO | BRAIND; @@ -244,37 +300,45 @@ nsp_index_write(base, TRANSFERMODE, transfer_mode_reg); } +static void nsphw_init_sync(nsp_hw_data *data) +{ + sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET, + .SyncPeriod = 0, + .SyncOffset = 0 + }; + int i; + + /* setup sync data */ + for ( i = 0; i < NUMBER(data->Sync); i++ ) { + data->Sync[i] = tmp_sync; + } +} + /* * Initialize Ninja hardware */ static int nsphw_init(nsp_hw_data *data) { unsigned int base = data->BaseAddress; - int i, j; - sync_data tmp_sync = { SyncNegotiation: SYNC_NOT_YET, - SyncPeriod: 0, - SyncOffset: 0 - }; - DEBUG(0, __FUNCTION__ "() in base=0x%x\n", base); + nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base); - data->ScsiClockDiv = CLOCK_40M; + data->ScsiClockDiv = CLOCK_40M | FAST_20; data->CurrentSC = NULL; data->FifoCount = 0; data->TransferMode = MODE_IO8; - /* setup sync data */ - for ( i = 0; i < N_TARGET; i++ ) { - for ( j = 0; j < N_LUN; j++ ) { - data->Sync[i][j] = tmp_sync; - } - } + nsphw_init_sync(data); + /* block all interrupts */ - nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK); + nsp_write(base, IRQCONTROL, IRQCONTROL_ALL_CLEAR_AND_MASK); + + nsp_write(base, IFSELECT, 0); + data->ChipRev = nsp_read(base, FIFOSTATUS); /* setup SCSI interface */ - nsp_write(base, IFSELECT, IF_IFSEL); + nsp_write(base, IFSELECT, IF_REGSEL); nsp_index_write(base, SCSIIRQMODE, 0); @@ -291,7 +355,7 @@ nsp_write(base, IFSELECT, IF_REGSEL); nsp_index_write(base, TERMPWRCTRL, 0); if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) { - printk(KERN_INFO "nsp_cs: terminator power on\n"); + nsp_msg(KERN_INFO, "terminator power on"); nsp_index_write(base, TERMPWRCTRL, POWER_ON); } @@ -305,7 +369,7 @@ nsp_index_write(base, SCSIIRQMODE, SCSI_PHASE_CHANGE_EI | RESELECT_EI | SCSI_RESET_IRQ_EI ); - nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR); + nsp_write(base, IRQCONTROL, IRQCONTROL_ALL_CLEAR); nsp_setup_fifo(data, FALSE); @@ -315,110 +379,147 @@ /* * Start selection phase */ -static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, - nsp_hw_data *data) +static int nsphw_start_selection(Scsi_Cmnd *SCpnt) { - unsigned int host_id = SCpnt->host->this_id; - unsigned int base = SCpnt->host->io_port; - unsigned char target = SCpnt->target; - int wait_count; + unsigned int host_id = SCpnt->device->host->this_id; + unsigned int base = SCpnt->device->host->io_port; + unsigned char target = SCpnt->device->id; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + int time_out; unsigned char phase, arbit; - //DEBUG(0, __FUNCTION__ "()in\n"); + //nsp_dbg(NSP_DEBUG_RESELECTION, "in"); phase = nsp_index_read(base, SCSIBUSMON); if(phase != BUSMON_BUS_FREE) { - //DEBUG(0, " bus busy\n"); + //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy"); return FALSE; } /* start arbitration */ - //DEBUG(0, " start arbit\n"); + //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit"); SCpnt->SCp.phase = PH_ARBSTART; nsp_index_write(base, SETARBIT, ARBIT_GO); - wait_count = jiffies + 10 * HZ; + time_out = 1000; do { /* XXX: what a stupid chip! */ arbit = nsp_index_read(base, ARBITSTATUS); - //DEBUG(0, " arbit=%d, wait_count=%d\n", arbit, wait_count); + //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count); udelay(1); /* hold 1.2us */ } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 && - time_before(jiffies, wait_count)); + (time_out-- != 0)); - if((arbit & ARBIT_WIN) == 0) { - //DEBUG(0, " arbit fail\n"); + if (!(arbit & ARBIT_WIN)) { + //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail"); nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR); return FALSE; } /* assert select line */ - //DEBUG(0, " assert SEL line\n"); + //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line"); SCpnt->SCp.phase = PH_SELSTART; - udelay(3); - nsp_index_write(base, SCSIDATALATCH, (1 << host_id) | (1 << target)); - nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); - udelay(3); + udelay(3); /* wait 2.4us */ + nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target)); + nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); + udelay(2); /* wait >1.2us */ nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN); nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR); - udelay(3); - nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN); + /*udelay(1);*/ /* wait >90ns */ + nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN); /* check selection timeout */ - nsp_start_timer(SCpnt, data, 1000/51); + nsp_start_timer(SCpnt, 1000/51); data->SelectionTimeOut = 1; return TRUE; } +/*********************************************************************** + * Period/AckWidth speed conversion table + * + * Note: This period/ackwidth speed table must be in descending order. + ***********************************************************************/ struct nsp_sync_table { - unsigned int min_period; - unsigned int max_period; unsigned int chip_period; unsigned int ack_width; + unsigned int min_period; + unsigned int max_period; }; static struct nsp_sync_table nsp_sync_table_40M[] = { - {0x0c,0x0c,0x1,0}, /* 20MB 50ns*/ - {0x19,0x19,0x3,1}, /* 10MB 100ns*/ - {0x1a,0x25,0x5,2}, /* 7.5MB 150ns*/ - {0x26,0x32,0x7,3}, /* 5MB 200ns*/ - {0x0, 0, 0, 0} + /* {PNo, AW, SP, EP} Speed(MB/s) Period AckWidth */ + {0x1, 0, 0x0c, 0x0c}, /* 20.0 : 50ns, 25ns */ + {0x2, 0, 0x0d, 0x18}, /* 13.3 : 75ns, 25ns */ + {0x3, 1, 0x19, 0x19}, /* 10.0 : 100ns, 50ns */ + {0x4, 1, 0x1a, 0x1f}, /* 8.0 : 125ns, 50ns */ + {0x5, 2, 0x20, 0x25}, /* 7.5 : 150ns, 75ns */ + {0x6, 2, 0x26, 0x31}, /* 5.71: 175ns, 75ns */ + {0x7, 3, 0x32, 0x32}, /* 5.0 : 200ns, 100ns */ + {0x8, 3, 0x33, 0x38}, /* 4.44: 225ns, 100ns */ + {0x9, 3, 0x39, 0x3e}, /* 4.0 : 250ns, 100ns */ + {0xa, 3, 0x3f, 0x44}, /* 3.64: 275ns, 100ns */ + {0xb, 3, 0x45, 0x4b}, /* 3.33: 300ns, 100ns */ + {0xc, 3, 0x4c, 0x53}, /* 3.01: 325ns, 100ns */ + {0xd, 3, 0x54, 0x57}, /* 2.86: 350ns, 100ns */ + {0xe, 3, 0x58, 0x5d}, /* 2.67: 375ns, 100ns */ + {0xf, 3, 0x5e, 0x64}, /* 2.5 : 400ns, 100ns */ + {0,0,0,0}, }; static struct nsp_sync_table nsp_sync_table_20M[] = { - {0x19,0x19,0x1,0}, /* 10MB 100ns*/ - {0x1a,0x25,0x2,0}, /* 7.5MB 150ns*/ - {0x26,0x32,0x3,1}, /* 5MB 200ns*/ - {0x0, 0, 0, 0} + {0x1, 0, 0x19, 0x19}, /* 10.0 : 100ns, 50ns */ + {0x2, 0, 0x1a, 0x25}, /* 6.7 : 150ns, 50ns */ + {0x3, 1, 0x26, 0x32}, /* 5.0 : 200ns, 100ns */ + {0x4, 1, 0x33, 0x3e}, /* 4.0 : 250ns, 100ns */ + {0x5, 2, 0x3f, 0x4b}, /* 3.3 : 300ns, 150ns */ + {0x6, 2, 0x4c, 0x57}, /* 2.8 : 350ns, 150ns */ + {0x7, 3, 0x58, 0x64}, /* 2.5 : 400ns, 200ns */ + {0x8, 3, 0x65, 0x70}, /* 2.2 : 450ns, 200ns */ + {0x9, 3, 0x71, 0x7d}, /* 2.0 : 500ns, 200ns */ + {0xa, 3, 0x7e, 0x89}, /* 1.82: 550ns, 200ns */ + {0xb, 3, 0x8a, 0x95}, /* 1.67: 550ns, 200ns */ + {0xc, 3, 0x96, 0xa2}, /* 1.54: 550ns, 200ns */ + {0xd, 3, 0xa3, 0xae}, /* 1.43: 550ns, 200ns */ + {0xe, 3, 0xaf, 0xbb}, /* 1.33: 550ns, 200ns */ + {0xf, 3, 0xbc, 0xc8}, /* 1.25: 550ns, 200ns */ + {0,0,0,0}, }; /* * setup synchronous data transfer mode */ -static int nsp_msg(Scsi_Cmnd *SCpnt, nsp_hw_data *data) +static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt) { - unsigned char target = SCpnt->target; - unsigned char lun = SCpnt->lun; - sync_data *sync = &(data->Sync[target][lun]); + unsigned char target = SCpnt->device->id; +// unsigned char lun = SCpnt->device->lun; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + sync_data *sync = &(data->Sync[target]); struct nsp_sync_table *sync_table; unsigned int period, offset; int i; - DEBUG(0, __FUNCTION__ "()\n"); - -/**!**/ + nsp_dbg(NSP_DEBUG_SYNC, "in"); period = sync->SyncPeriod; offset = sync->SyncOffset; - DEBUG(0, " period=0x%x, offset=0x%x\n", period, offset); + nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset); - if (data->ScsiClockDiv == CLOCK_20M) { - sync_table = &nsp_sync_table_20M[0]; - } else { - sync_table = &nsp_sync_table_40M[0]; + switch (data->ScsiClockDiv) { + case CLOCK_20M: + case CLOCK_40M: + sync_table = nsp_sync_table_20M; + break; + case CLOCK_40M | FAST_20: + sync_table = nsp_sync_table_40M; + break; + default: + nsp_msg(KERN_WARNING, + "Invalid clock div is selected, set 20M."); + sync_table = nsp_sync_table_20M; + break; } for ( i = 0; sync_table->max_period != 0; i++, sync_table++) { @@ -432,13 +533,12 @@ /* * No proper period/offset found */ - DEBUG(0, " no proper period/offset\n"); + nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset"); sync->SyncPeriod = 0; sync->SyncOffset = 0; sync->SyncRegister = 0; sync->AckWidth = 0; - sync->SyncNegotiation = SYNC_OK; return FALSE; } @@ -446,9 +546,8 @@ sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) | (offset & SYNCREG_OFFSET_MASK); sync->AckWidth = sync_table->ack_width; - sync->SyncNegotiation = SYNC_OK; - DEBUG(0, " sync_reg=0x%x, ack_width=0x%x\n", sync->SyncRegister, sync->AckWidth); + nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth); return TRUE; } @@ -457,11 +556,12 @@ /* * start ninja hardware timer */ -static void nsp_start_timer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int time) +static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; - //DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p, time=%d\n", SCpnt, time); + //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time); data->TimerCount = time; nsp_index_write(base, TIMERCOUNT, time); } @@ -471,23 +571,23 @@ */ static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; unsigned char reg; - int count, i = TRUE; + int time_out; - //DEBUG(0, __FUNCTION__ "()\n"); + //nsp_dbg(NSP_DEBUG_INTR, "in"); - count = jiffies + HZ; + time_out = 100; do { reg = nsp_index_read(base, SCSIBUSMON); if (reg == 0xff) { break; } - } while ((i = time_before(jiffies, count)) && (reg & mask) != 0); + } while ((time_out-- != 0) && (reg & mask) != 0); - if (!i) { - printk(KERN_DEBUG __FUNCTION__ " %s signal off timeut\n", str); + if (time_out == 0) { + nsp_msg(KERN_DEBUG, " %s signal off timeut", str); } return 0; @@ -500,51 +600,52 @@ unsigned char current_phase, unsigned char mask) { - unsigned int base = SCpnt->host->io_port; - int wait_count; + unsigned int base = SCpnt->device->host->io_port; + int time_out; unsigned char phase, i_src; - //DEBUG(0, __FUNCTION__ "() current_phase=0x%x, mask=0x%x\n", current_phase, mask); + //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask); - wait_count = jiffies + HZ; + time_out = 100; do { phase = nsp_index_read(base, SCSIBUSMON); if (phase == 0xff) { - //DEBUG(0, " ret -1\n"); + //nsp_dbg(NSP_DEBUG_INTR, "ret -1"); return -1; } i_src = nsp_read(base, IRQSTATUS); if (i_src & IRQSTATUS_SCSI) { - //DEBUG(0, " ret 0 found scsi signal\n"); + //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal"); return 0; } if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) { - //DEBUG(0, " ret 1 phase=0x%x\n", phase); + //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase); return 1; } - } while(time_before(jiffies, wait_count)); + } while(time_out-- != 0); - //DEBUG(0, __FUNCTION__ " : " __FUNCTION__ " timeout\n"); + //nsp_dbg(NSP_DEBUG_INTR, "timeout"); return -1; } /* * transfer SCSI message */ -static int nsp_xfer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int phase) +static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; char *buf = data->MsgBuffer; int len = MIN(MSGBUF_SIZE, data->MsgLen); int ptr; int ret; - //DEBUG(0, __FUNCTION__ "()\n"); - for (ptr = 0; len > 0; len --, ptr ++) { + //nsp_dbg(NSP_DEBUG_DATA_IO, "in"); + for (ptr = 0; len > 0; len--, ptr++) { ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ); if (ret <= 0) { - DEBUG(0, " xfer quit\n"); + nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit"); return 0; } @@ -555,10 +656,10 @@ /* read & write message */ if (phase & BUSMON_IO) { - DEBUG(0, " read msg\n"); + nsp_dbg(NSP_DEBUG_DATA_IO, "read msg"); buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK); } else { - DEBUG(0, " write msg\n"); + nsp_dbg(NSP_DEBUG_DATA_IO, "write msg"); nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]); } nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer"); @@ -570,11 +671,12 @@ /* * get extra SCSI data from fifo */ -static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt, nsp_hw_data *data) +static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt) { + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; unsigned int count; - //DEBUG(0, __FUNCTION__ "()\n"); + //nsp_dbg(NSP_DEBUG_DATA_IO, "in"); if (SCpnt->SCp.have_data_in != IO_IN) { return 0; @@ -582,7 +684,7 @@ count = nsp_fifo_count(SCpnt); if (data->FifoCount == count) { - //DEBUG(0, " not use bypass quirk\n"); + //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk"); return 0; } @@ -590,30 +692,49 @@ * XXX: NSP_QUIRK * data phase skip only occures in case of SCSI_LOW_READ */ + nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk"); SCpnt->SCp.phase = PH_DATA; - nsp_pio_read(SCpnt, data); + nsp_pio_read(SCpnt); nsp_setup_fifo(data, FALSE); - DEBUG(0, " use bypass quirk\n"); return 0; } /* * accept reselection */ -static int nsp_reselected(Scsi_Cmnd *SCpnt, nsp_hw_data *data) +static int nsp_reselected(Scsi_Cmnd *SCpnt) { - unsigned int base = SCpnt->host->io_port; - unsigned char reg; + unsigned int base = SCpnt->device->host->io_port; + unsigned int host_id = SCpnt->device->host->this_id; + //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + unsigned char bus_reg; + unsigned char id_reg, tmp; + int target; + + nsp_dbg(NSP_DEBUG_RESELECTION, "in"); + + id_reg = nsp_index_read(base, RESELECTID); + tmp = id_reg & (~BIT(host_id)); + target = 0; + while(tmp != 0) { + if (tmp & BIT(0)) { + break; + } + tmp >>= 1; + target++; + } - //DEBUG(0, __FUNCTION__ "()\n"); + if (SCpnt->device->id != target) { + nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target); + } nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect"); - nsp_nexus(SCpnt, data); - reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN); - nsp_index_write(base, SCSIBUSCTRL, reg); - nsp_index_write(base, SCSIBUSCTRL, reg | AUTODIRECTION | ACKENB); + nsp_nexus(SCpnt); + bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN); + nsp_index_write(base, SCSIBUSCTRL, bus_reg); + nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB); return TRUE; } @@ -623,19 +744,20 @@ */ static int nsp_fifo_count(Scsi_Cmnd *SCpnt) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; unsigned int count; - unsigned int l, m, h; + unsigned int l, m, h, dummy; - nsp_index_write(base, POINTERCLR, POINTER_CLEAR); + nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER); - l = (unsigned int)nsp_read(base, DATAREG); - m = (unsigned int)nsp_read(base, DATAREG); - h = (unsigned int)nsp_read(base, DATAREG); + l = nsp_index_read(base, TRANSFERCOUNT); + m = nsp_index_read(base, TRANSFERCOUNT); + h = nsp_index_read(base, TRANSFERCOUNT); + dummy = nsp_index_read(base, TRANSFERCOUNT); /* required this! */ count = (h << 16) | (m << 8) | (l << 0); - //DEBUG(0, __FUNCTION__ "() =0x%x\n", count); + //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count); return count; } @@ -647,34 +769,37 @@ /* * read data in DATA IN phase */ -static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data) +static void nsp_pio_read(Scsi_Cmnd *SCpnt) { - unsigned int base = SCpnt->host->io_port; - int time_out, i; + unsigned int base = SCpnt->device->host->io_port; + unsigned long mmio_base = SCpnt->device->host->base; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + long time_out; int ocount, res; unsigned char stat, fifo_stat; ocount = data->FifoCount; - DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d\n", SCpnt, RESID, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual); + nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d", + SCpnt, SCpnt->resid, ocount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual); - time_out = jiffies + 10 * HZ; + time_out = 1000; - while ((i = time_before(jiffies,time_out)) && + while ((time_out-- != 0) && (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) { stat = nsp_index_read(base, SCSIBUSMON); stat &= BUSMON_PHASE_MASK; - res = nsp_fifo_count(SCpnt) - ocount; - //DEBUG(0, " ptr=0x%p this=0x%x ocount=0x%x res=0x%x\n", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res); + res = nsp_fifo_count(SCpnt) - ocount; + //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res); if (res == 0) { /* if some data avilable ? */ if (stat == BUSPHASE_DATA_IN) { /* phase changed? */ - //DEBUG(0, " wait for data this=%d\n", SCpnt->SCp.this_residual); + //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual); continue; } else { - DEBUG(0, " phase changed stat=0x%x\n", stat); + nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat); break; } } @@ -695,72 +820,93 @@ case MODE_IO8: nsp_fifo8_read (base, SCpnt->SCp.ptr, res ); break; - default: - DEBUG(0, "unknown read mode\n"); + + case MODE_MEM32: + res &= ~(BIT(1)|BIT(0)); /* align 4 */ + nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2); break; + + default: + nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode"); + return; } - RESID -= res; + SCpnt->resid -= res; SCpnt->SCp.ptr += res; SCpnt->SCp.this_residual -= res; ocount += res; - //DEBUG(0, " ptr=0x%p this_residual=0x%x ocount=0x%x\n", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount); + //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount); /* go to next scatter list if available */ if (SCpnt->SCp.this_residual == 0 && SCpnt->SCp.buffers_residual != 0 ) { - //DEBUG(0, " scatterlist next timeout=%d\n", time_out); + //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out); SCpnt->SCp.buffers_residual--; SCpnt->SCp.buffer++; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer); SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; - } + time_out = 1000; - time_out = jiffies + 10 * HZ; + //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset); + } } data->FifoCount = ocount; - if (!i) { - printk(KERN_DEBUG __FUNCTION__ "() pio read timeout resid=%d this_residual=%d buffers_residual=%d\n", RESID, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual); + if (time_out == 0) { + nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d", + SCpnt->resid, SCpnt->SCp.this_residual, SCpnt->SCp.buffers_residual); } - DEBUG(0, " read ocount=0x%x\n", ocount); + nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount); + nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId, SCpnt->resid); } /* * write data in DATA OUT phase */ -static void nsp_pio_write(Scsi_Cmnd *SCpnt, nsp_hw_data *data) +static void nsp_pio_write(Scsi_Cmnd *SCpnt) { - unsigned int base = SCpnt->host->io_port; - int time_out, i; - unsigned int ocount, res; + unsigned int base = SCpnt->device->host->io_port; + unsigned long mmio_base = SCpnt->device->host->base; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + int time_out; + int ocount, res; unsigned char stat; ocount = data->FifoCount; - DEBUG(0, __FUNCTION__ "() in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x\n", data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, RESID); + nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x", + data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, SCpnt->resid); - time_out = jiffies + 10 * HZ; + time_out = 1000; - while ((i = time_before(jiffies, time_out)) && + while ((time_out-- != 0) && (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) { stat = nsp_index_read(base, SCSIBUSMON); stat &= BUSMON_PHASE_MASK; + if (stat != BUSPHASE_DATA_OUT) { - DEBUG(0, " phase changed stat=0x%x\n", stat); + res = ocount - nsp_fifo_count(SCpnt); + + nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res); + /* Put back pointer */ + SCpnt->resid += res; + SCpnt->SCp.ptr -= res; + SCpnt->SCp.this_residual += res; + ocount -= res; + break; } res = ocount - nsp_fifo_count(SCpnt); if (res > 0) { /* write all data? */ - DEBUG(0, " wait for all data out. ocount=0x%x res=%d\n", ocount, res); + nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res); continue; } res = MIN(SCpnt->SCp.this_residual, WFIFO_CRIT); - //DEBUG(0, " ptr=0x%p this=0x%x res=0x%x\n", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res); + //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res); switch (data->TransferMode) { case MODE_IO32: res &= ~(BIT(1)|BIT(0)); /* align 4 */ @@ -769,12 +915,18 @@ case MODE_IO8: nsp_fifo8_write (base, SCpnt->SCp.ptr, res ); break; + + case MODE_MEM32: + res &= ~(BIT(1)|BIT(0)); /* align 4 */ + nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2); + break; + default: - DEBUG(0, "unknown write mode\n"); + nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode"); break; } - RESID -= res; + SCpnt->resid -= res; SCpnt->SCp.ptr += res; SCpnt->SCp.this_residual -= res; ocount += res; @@ -782,55 +934,60 @@ /* go to next scatter list if available */ if (SCpnt->SCp.this_residual == 0 && SCpnt->SCp.buffers_residual != 0 ) { - //DEBUG(0, " scatterlist next\n"); + //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next"); SCpnt->SCp.buffers_residual--; SCpnt->SCp.buffer++; - SCpnt->SCp.ptr = SCpnt->SCp.buffer->address; + SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer); SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; + time_out = 1000; } - - time_out = jiffies + 10 * HZ; } data->FifoCount = ocount; - if (!i) { - printk(KERN_DEBUG __FUNCTION__ "() pio write timeout resid=%d\n", RESID); + if (time_out == 0) { + nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x", SCpnt->resid); } - //DEBUG(0, " write ocount=%d\n", ocount); + nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount); + nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId, SCpnt->resid); } - #undef RFIFO_CRIT #undef WFIFO_CRIT /* * setup synchronous/asynchronous data transfer mode */ -static int nsp_nexus(Scsi_Cmnd *SCpnt, nsp_hw_data *data) +static int nsp_nexus(Scsi_Cmnd *SCpnt) { - unsigned int base = SCpnt->host->io_port; - unsigned char target = SCpnt->target; - unsigned char lun = SCpnt->lun; - sync_data *sync = &(data->Sync[target][lun]); + unsigned int base = SCpnt->device->host->io_port; + unsigned char target = SCpnt->device->id; +// unsigned char lun = SCpnt->device->lun; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + sync_data *sync = &(data->Sync[target]); - //DEBUG(0, __FUNCTION__ "() in SCpnt=0x%p\n", SCpnt); + //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt); /* setup synch transfer registers */ nsp_index_write(base, SYNCREG, sync->SyncRegister); nsp_index_write(base, ACKWIDTH, sync->AckWidth); - if (RESID % 4 != 0 || - RESID <= 256 ) { + if (SCpnt->use_sg == 0 || + SCpnt->resid % 4 != 0 || + SCpnt->resid <= PAGE_SIZE ) { data->TransferMode = MODE_IO8; - } else { + } else if (nsp_burst_mode == BURST_MEM32) { + data->TransferMode = MODE_MEM32; + } else if (nsp_burst_mode == BURST_IO32) { data->TransferMode = MODE_IO32; + } else { + data->TransferMode = MODE_IO8; } /* setup pdma fifo */ nsp_setup_fifo(data, TRUE); /* clear ack counter */ - data->FifoCount = 0; + data->FifoCount = 0; nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER_CLEAR | REQ_COUNTER_CLEAR | @@ -843,111 +1000,126 @@ /* * interrupt handler */ -static void nspintr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t nspintr(int irq, void *dev_id, struct pt_regs *regs) { unsigned int base; - unsigned char i_src, irq_phase, phase; + unsigned char irq_status, irq_phase, phase; Scsi_Cmnd *tmpSC; - int len; unsigned char target, lun; unsigned int *sync_neg; int i, tmp; + unsigned long flags; nsp_hw_data *data; + int handled = 0; - //printk("&nsp_data=0x%p, dev_id=0x%p\n", &nsp_data, dev_id); + //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id); + //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host); - /* sanity check */ - if (&nsp_data != dev_id) { - DEBUG(0, " irq conflict? this can't happen\n"); - return; - } - data = dev_id; - if (irq != data->IrqNumber) { - return; + if ( dev_id != NULL && + ((scsi_info_t *)dev_id)->host != NULL ) { + scsi_info_t *info = (scsi_info_t *)dev_id; + + data = (nsp_hw_data *)(info->host->hostdata); + } else { + nsp_dbg(NSP_DEBUG_INTR, "host data wrong"); + return IRQ_NONE; } + spin_lock_irqsave(HOST_LOCK, flags); + + //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id); + base = data->BaseAddress; - //DEBUG(0, " base=0x%x\n", base); + //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base); /* * interrupt check */ - nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE); - i_src = nsp_read(base, IRQSTATUS); - if (i_src == 0xff || (i_src & IRQSTATUS_MASK) == 0) { - nsp_write(base, IRQCONTROL, 0); - //DEBUG(0, " no irq\n"); - return; + nsp_write(base, IRQCONTROL, IRQCONTROL_ALL_MASK); + irq_status = nsp_read(base, IRQSTATUS); + //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status); + if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) { + //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq"); + goto out; } - - //DEBUG(0, " i_src=0x%x\n", i_src); + handled = 1; /* XXX: IMPORTANT * Do not read an irq_phase register if no scsi phase interrupt. * Unless, you should lose a scsi phase interrupt. */ phase = nsp_index_read(base, SCSIBUSMON); - if((i_src & IRQSTATUS_SCSI) != 0) { + if((irq_status & IRQSTATUS_SCSI) != 0) { irq_phase = nsp_index_read(base, IRQPHASESENCE); } else { irq_phase = 0; } - //DEBUG(0, " irq_phase=0x%x\n", irq_phase); + //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase); /* * timer interrupt handler (scsi vs timer interrupts) */ - //DEBUG(0, " timercount=%d\n", data->TimerCount); + //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount); if (data->TimerCount != 0) { - //DEBUG(0, " stop timer\n"); + //nsp_dbg(NSP_DEBUG_INTR, "stop timer"); nsp_index_write(base, TIMERCOUNT, 0); nsp_index_write(base, TIMERCOUNT, 0); data->TimerCount = 0; } - if ((i_src & IRQSTATUS_MASK) == IRQSTATUS_TIMER && + if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER && data->SelectionTimeOut == 0) { - //DEBUG(0, " timer start\n"); + //nsp_dbg(NSP_DEBUG_INTR, "timer start"); nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR); - return; + goto out; } nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR); + if ((irq_status & IRQSTATUS_SCSI) && + (irq_phase & SCSI_RESET_IRQ)) { + nsp_msg(KERN_ERR, "bus reset (power off?)"); + + nsphw_init(data); + nsp_bus_reset(data); + + if(data->CurrentSC != NULL) { + tmpSC = data->CurrentSC; + tmpSC->result = (DID_RESET << 16) | + ((tmpSC->SCp.Message & 0xff) << 8) | + ((tmpSC->SCp.Status & 0xff) << 0); + nsp_scsi_done(tmpSC); + } + goto out; + } + if (data->CurrentSC == NULL) { - printk(KERN_DEBUG __FUNCTION__ " CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen\n", i_src, phase, irq_phase); - return; - } else { - tmpSC = data->CurrentSC; - target = tmpSC->target; - lun = tmpSC->lun; - sync_neg = &(data->Sync[target][lun].SyncNegotiation); + nsp_msg(KERN_ERR, "CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen. reset everything", irq_status, phase, irq_phase); + nsphw_init(data); + nsp_bus_reset(data); + goto out; } + tmpSC = data->CurrentSC; + target = tmpSC->device->id; + lun = tmpSC->device->lun; + sync_neg = &(data->Sync[target].SyncNegotiation); + /* * parse hardware SCSI irq reasons register */ - if ((i_src & IRQSTATUS_SCSI) != 0) { - if ((irq_phase & SCSI_RESET_IRQ) != 0) { - printk(KERN_DEBUG " " __FUNCTION__ "() bus reset (power off?)\n"); - *sync_neg = SYNC_NOT_YET; - data->CurrentSC = NULL; - tmpSC->result = DID_RESET << 16; - tmpSC->scsi_done(tmpSC); - return; - } - - if ((irq_phase & RESELECT_IRQ) != 0) { - DEBUG(0, " reselect\n"); + if (irq_status & IRQSTATUS_SCSI) { + if (irq_phase & RESELECT_IRQ) { + nsp_dbg(NSP_DEBUG_INTR, "reselect"); nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR); - if (nsp_reselected(tmpSC, data) != FALSE) { - return; + if (nsp_reselected(tmpSC) != FALSE) { + goto out; } } if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) { - return; + goto out; } } @@ -955,50 +1127,48 @@ switch(tmpSC->SCp.phase) { case PH_SELSTART: - *sync_neg = SYNC_NOT_YET; + // *sync_neg = SYNC_NOT_YET; if ((phase & BUSMON_BSY) == 0) { - //DEBUG(0, " selection count=%d\n", data->SelectionTimeOut); + //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut); if (data->SelectionTimeOut >= NSP_SELTIMEOUT) { - DEBUG(0, " selection time out\n"); + nsp_dbg(NSP_DEBUG_INTR, "selection time out"); data->SelectionTimeOut = 0; nsp_index_write(base, SCSIBUSCTRL, 0); - data->CurrentSC = NULL; - tmpSC->result = DID_NO_CONNECT << 16; - tmpSC->scsi_done(tmpSC); + tmpSC->result = DID_TIME_OUT << 16; + nsp_scsi_done(tmpSC); - return; + goto out; } data->SelectionTimeOut += 1; - nsp_start_timer(tmpSC, data, 1000/51); - return; + nsp_start_timer(tmpSC, 1000/51); + goto out; } /* attention assert */ - //DEBUG(0, " attention assert\n"); + //nsp_dbg(NSP_DEBUG_INTR, "attention assert"); data->SelectionTimeOut = 0; tmpSC->SCp.phase = PH_SELECTED; nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN); udelay(1); nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB); - return; + goto out; break; case PH_RESELECT: - //DEBUG(0, " phase reselect\n"); - *sync_neg = SYNC_NOT_YET; + //nsp_dbg(NSP_DEBUG_INTR, "phase reselect"); + // *sync_neg = SYNC_NOT_YET; if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) { - data->CurrentSC = NULL; tmpSC->result = DID_ABORT << 16; - tmpSC->scsi_done(tmpSC); - return; + nsp_scsi_done(tmpSC); + goto out; } /* fall thru */ default: - if ((i_src & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) { - return; + if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) { + goto out; } break; } @@ -1006,140 +1176,153 @@ /* * SCSI sequencer */ - //DEBUG(0, " start scsi seq\n"); + //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq"); /* normal disconnect */ - if ((irq_phase & LATCHED_BUS_FREE) != 0) { - //DEBUG(0, " normal disconnect i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", i_src, phase, irq_phase); + if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) && + (irq_phase & LATCHED_BUS_FREE) != 0 ) { + nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase); + + // *sync_neg = SYNC_NOT_YET; + if ((tmpSC->SCp.Message == MSG_COMMAND_COMPLETE)) { /* all command complete and return status */ - *sync_neg = SYNC_NOT_YET; - data->CurrentSC = NULL; - tmpSC->result = (DID_OK << 16) | - (tmpSC->SCp.Message << 8) | - (tmpSC->SCp.Status << 0); - DEBUG(0, " command complete result=0x%x\n", tmpSC->result); - tmpSC->scsi_done(tmpSC); - return; + tmpSC->result = (DID_OK << 16) | + ((tmpSC->SCp.Message & 0xff) << 8) | + ((tmpSC->SCp.Status & 0xff) << 0); + nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result); + nsp_scsi_done(tmpSC); + + goto out; } - return; + goto out; } /* check unexpected bus free state */ if (phase == 0) { - printk(KERN_DEBUG " " __FUNCTION__ " unexpected bus free. i_src=0x%x, phase=0x%x, irq_phase=0x%x\n", i_src, phase, irq_phase); + nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase); - *sync_neg = SYNC_NOT_YET; - data->CurrentSC = NULL; + *sync_neg = SYNC_NG; tmpSC->result = DID_ERROR << 16; - tmpSC->scsi_done(tmpSC); - return; + nsp_scsi_done(tmpSC); + goto out; } switch (phase & BUSMON_PHASE_MASK) { case BUSPHASE_COMMAND: - DEBUG(0, " BUSPHASE_COMMAND\n"); + nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND"); if ((phase & BUSMON_REQ) == 0) { - DEBUG(0, " REQ == 0\n"); - return; + nsp_dbg(NSP_DEBUG_INTR, "REQ == 0"); + goto out; } tmpSC->SCp.phase = PH_COMMAND; - nsp_nexus(tmpSC, data); + nsp_nexus(tmpSC); /* write scsi command */ + nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len); nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER); - for (len = 0; len < COMMAND_SIZE(tmpSC->cmnd[0]); len++) { - nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[len]); + for (i = 0; i < tmpSC->cmd_len; i++) { + nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]); } nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO); break; case BUSPHASE_DATA_OUT: - DEBUG(0, " BUSPHASE_DATA_OUT\n"); + nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT"); - tmpSC->SCp.phase = PH_DATA; + tmpSC->SCp.phase = PH_DATA; tmpSC->SCp.have_data_in = IO_OUT; - nsp_pio_write(tmpSC, data); + nsp_pio_write(tmpSC); break; case BUSPHASE_DATA_IN: - DEBUG(0, " BUSPHASE_DATA_IN\n"); + nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN"); - tmpSC->SCp.phase = PH_DATA; + tmpSC->SCp.phase = PH_DATA; tmpSC->SCp.have_data_in = IO_IN; - nsp_pio_read(tmpSC, data); + nsp_pio_read(tmpSC); break; case BUSPHASE_STATUS: - nsp_dataphase_bypass(tmpSC, data); - DEBUG(0, " BUSPHASE_STATUS\n"); + nsp_dataphase_bypass(tmpSC); + nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS"); tmpSC->SCp.phase = PH_STATUS; tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK); - //DEBUG(0, " message=0x%x status=0x%x\n", tmpSC->SCp.Message, tmpSC->SCp.Status); + nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status); break; case BUSPHASE_MESSAGE_OUT: - DEBUG(0, " BUSPHASE_MESSAGE_OUT\n"); + nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT"); if ((phase & BUSMON_REQ) == 0) { goto timer_out; } tmpSC->SCp.phase = PH_MSG_OUT; - data->MsgLen = len = 0; + // *sync_neg = SYNC_NOT_YET; + + data->MsgLen = i = 0; + data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++; + if (*sync_neg == SYNC_NOT_YET) { - data->Sync[target][lun].SyncPeriod = 0; - data->Sync[target][lun].SyncOffset = 0; - nsp_msg(tmpSC, data); - - data->MsgBuffer[len] = IDENTIFY(TRUE, lun); len++; - /* - data->MsgBuffer[len] = MSG_EXTENDED; len++; - data->MsgBuffer[len] = 3; len++; - data->MsgBuffer[len] = MSG_EXT_SDTR; len++; - data->MsgBuffer[len] = 0x0c; len++; - data->MsgBuffer[len] = 15; len++; - */ - } - if (len == 0) { - data->MsgBuffer[len] = MSG_NO_OPERATION; len++; + data->Sync[target].SyncPeriod = 0; + data->Sync[target].SyncOffset = 0; + + /**/ + data->MsgBuffer[i] = MSG_EXTENDED; i++; + data->MsgBuffer[i] = 3; i++; + data->MsgBuffer[i] = MSG_EXT_SDTR; i++; + data->MsgBuffer[i] = 0x0c; i++; + data->MsgBuffer[i] = 15; i++; + /**/ } - data->MsgLen = len; + data->MsgLen = i; + nsp_analyze_sdtr(tmpSC); show_message(data); - nsp_message_out(tmpSC, data); + nsp_message_out(tmpSC); break; case BUSPHASE_MESSAGE_IN: - nsp_dataphase_bypass(tmpSC, data); - DEBUG(0, " BUSPHASE_MESSAGE_IN\n"); + nsp_dataphase_bypass(tmpSC); + nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN"); if ((phase & BUSMON_REQ) == 0) { goto timer_out; } tmpSC->SCp.phase = PH_MSG_IN; - nsp_message_in(tmpSC, data); + nsp_message_in(tmpSC); - /* - if (data->MsgLen >= 5 && - data->MsgBuffer[0] == MSG_EXTENDED && - data->MsgBuffer[1] == 3 && - data->MsgBuffer[2] == MSG_EXT_SDTR ) { - data->Sync[target][lun].SyncPeriod = data->MsgBuffer[3]; - data->Sync[target][lun].SyncOffset = data->MsgBuffer[4]; - nsp_msg(tmpSC, data); + /**/ + if (*sync_neg == SYNC_NOT_YET) { + //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun); + + if (data->MsgLen >= 5 && + data->MsgBuffer[0] == MSG_EXTENDED && + data->MsgBuffer[1] == 3 && + data->MsgBuffer[2] == MSG_EXT_SDTR ) { + data->Sync[target].SyncPeriod = data->MsgBuffer[3]; + data->Sync[target].SyncOffset = data->MsgBuffer[4]; + //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]); + *sync_neg = SYNC_OK; + } else { + data->Sync[target].SyncPeriod = 0; + data->Sync[target].SyncOffset = 0; + *sync_neg = SYNC_NG; + } + nsp_analyze_sdtr(tmpSC); } - */ + /**/ /* search last messeage byte */ tmp = -1; @@ -1151,134 +1334,291 @@ } tmpSC->SCp.Message = tmp; - DEBUG(0, " message=0x%x len=%d\n", tmpSC->SCp.Message, data->MsgLen); + nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen); show_message(data); break; case BUSPHASE_SELECT: default: - DEBUG(0, " BUSPHASE other\n"); + nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other"); break; } - //DEBUG(0, __FUNCTION__ "() out\n"); - return; + goto out; + timer_out: - nsp_start_timer(tmpSC, data, 1000/102); - return; + nsp_start_timer(tmpSC, 1000/102); + out: + nsp_write(base, IRQCONTROL, 0); /* clear IRQ mask */ + spin_unlock_irqrestore(HOST_LOCK, flags); + //nsp_dbg(NSP_DEBUG_INTR, "out"); + return IRQ_RETVAL(handled); } -#ifdef PCMCIA_DEBUG -#include "nsp_debug.c" -#endif /* DBG_SHOWCOMMAND */ /*----------------------------------------------------------------*/ /* look for ninja3 card and init if found */ /*----------------------------------------------------------------*/ -static int nsp_detect(Scsi_Host_Template *sht) +static struct Scsi_Host *nsp_detect(Scsi_Host_Template *sht) { struct Scsi_Host *host; /* registered host structure */ - nsp_hw_data *data = &nsp_data; + nsp_hw_data *data; - DEBUG(0, __FUNCTION__ " this_id=%d\n", sht->this_id); + nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data)); +#else + host = scsi_register(sht, sizeof(nsp_hw_data)); +#endif + if (host == NULL) { + nsp_dbg(NSP_DEBUG_INIT, "host failed"); + return NULL; + } - request_region(data->BaseAddress, data->NumAddress, "nsp_cs"); - host = scsi_register(sht, 0); - host->io_port = data->BaseAddress; - host->unique_id = data->BaseAddress; - host->n_io_port = data->NumAddress; - host->irq = data->IrqNumber; - host->dma_channel = 0xff; /* not use dms */ + /* Copy global variable to driver specific area */ + data = (nsp_hw_data *)host->hostdata; + *data = nsp_data_base; + + data->ScsiInfo->host = host; +#ifdef NSP_DEBUG + data->CmdId = 0; +#endif - sprintf(nspinfo, -/* Buffer size is 100 bytes */ -/* 0 1 2 3 4 5 6 7 8 9 0*/ -/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890*/ - "NinjaSCSI-3/32Bi Driver $Revision: 1.42 $, I/O 0x%04lx-0x%04lx IRQ %2d", - host->io_port, host->io_port + host->n_io_port, - host->irq); - sht->name = nspinfo; + nsp_dbg(NSP_DEBUG_INIT, "irq base=0x%p,%d data=0x%p,%d", &nsp_data_base, (&nsp_data_base)->IrqNumber, data, data->IrqNumber); - DEBUG(0, __FUNCTION__ " end\n"); + host->unique_id = data->BaseAddress; + host->io_port = data->BaseAddress; + host->n_io_port = data->NumAddress; + host->irq = data->IrqNumber; + host->base = data->MmioAddress; - return 1; /* detect done. */ + spin_lock_init(&(data->Lock)); + + snprintf(data->nspinfo, + sizeof(data->nspinfo), + "NinjaSCSI-3/32Bi Driver $Revision: 1.25 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d", + host->io_port, host->io_port + host->n_io_port - 1, + host->base, + host->irq); + sht->name = data->nspinfo; + + nsp_dbg(NSP_DEBUG_INIT, "end"); + + + return host; /* detect done. */ } -/* nsp_cs requires own release handler because its uses dev_id (=data) */ -static int nsp_release(struct Scsi_Host *shpnt) +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) +/*----------------------------------------*/ +/* Compatibility functions for 2.4 kernel */ +/*----------------------------------------*/ +static int nsp_detect_old(Scsi_Host_Template *sht) { - nsp_hw_data *data = &nsp_data; - - if (shpnt->irq) { - free_irq(shpnt->irq, data); - } - if (shpnt->io_port && shpnt->n_io_port) { - release_region(shpnt->io_port, shpnt->n_io_port); + if (nsp_detect(sht) == NULL) { + return 0; + } else { + return 1; /* detects 1 Ninja host card */ } +} + +static int nsp_release_old(struct Scsi_Host *shpnt) +{ + //nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata; + + /* PCMCIA Card Service dose same things below. */ + /* So we do nothing. */ + //if (shpnt->irq) { + // free_irq(shpnt->irq, data->ScsiInfo); + //} + //if (shpnt->io_port) { + // release_region(shpnt->io_port, shpnt->n_io_port); + //} + return 0; } +#endif /*----------------------------------------------------------------*/ /* return info string */ /*----------------------------------------------------------------*/ static const char *nsp_info(struct Scsi_Host *shpnt) { - return nspinfo; + nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata; + + return data->nspinfo; } -/*---------------------------------------------------------------*/ -/* error handler */ -/*---------------------------------------------------------------*/ -static int nsp_reset(Scsi_Cmnd *SCpnt, unsigned int why) +#undef SPRINTF +#define SPRINTF(args...) \ + do { \ + if(length > (pos - buffer)) { \ + pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \ + nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\ + } \ + } while(0) + +/* Shows Ninja host card information for user. */ +static int +nsp_proc_info( +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + struct Scsi_Host *host, +#endif + char *buffer, + char **start, + off_t offset, + int length, +#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + int hostno, +#endif + int inout) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p why=%d\n", SCpnt, why); + int id; + char *pos = buffer; + int thislength; + int speed; + unsigned long flags; + nsp_hw_data *data; +#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + struct Scsi_Host *host; +#else + int hostno; +#endif + if (inout) { + return -EINVAL; + } - nsp_eh_bus_reset(SCpnt); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + hostno = host->host_no; +#else + /* search this HBA host */ + host = scsi_host_hn_get(hostno); + if (host == NULL) { + return -ESRCH; + } +#endif + data = (nsp_hw_data *)host->hostdata; - return SCSI_RESET_SUCCESS; -} -static int nsp_abort(Scsi_Cmnd *SCpnt) -{ - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); + SPRINTF("NinjaSCSI status\n\n"); + SPRINTF("Driver version: $Revision: 1.25 $\n"); + SPRINTF("SCSI host No.: %d\n", hostno); + SPRINTF("IRQ: %d\n", host->irq); + SPRINTF("IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1); + SPRINTF("MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1); + SPRINTF("sg_tablesize: %d\n", host->sg_tablesize); + + SPRINTF("burst transfer mode: "); + switch (nsp_burst_mode) { + case BURST_IO8: + SPRINTF("io8"); + break; + case BURST_IO32: + SPRINTF("io32"); + break; + case BURST_MEM32: + SPRINTF("mem32"); + break; + default: + SPRINTF("???"); + break; + } + SPRINTF("\n"); + SPRINTF("Chip ID: %d\n", data->ChipRev >> 4); + SPRINTF("Chip revision: %d\n", data->ChipRev & 0x0f); + + + spin_lock_irqsave(&(data->Lock), flags); + SPRINTF("CurrentSC: 0x%p\n\n", data->CurrentSC); + spin_unlock_irqrestore(&(data->Lock), flags); + + SPRINTF("SDTR status\n"); + for(id = 0; id < NUMBER(data->Sync); id++) { + + SPRINTF("id %d: ", id); + + if (id == host->this_id) { + SPRINTF("----- NinjaSCSI-3 host adapter\n"); + continue; + } - nsp_eh_bus_reset(SCpnt); + switch(data->Sync[id].SyncNegotiation) { + case SYNC_OK: + SPRINTF(" sync"); + break; + case SYNC_NG: + SPRINTF("async"); + break; + case SYNC_NOT_YET: + SPRINTF(" none"); + break; + default: + SPRINTF("?????"); + break; + } + + if (data->Sync[id].SyncPeriod != 0) { + speed = 1000000 / (data->Sync[id].SyncPeriod * 4); + + SPRINTF(" transfer %d.%dMB/s, offset %d", + speed / 1000, + speed % 1000, + data->Sync[id].SyncOffset + ); + } + SPRINTF("\n"); + } - return SCSI_ABORT_SUCCESS; + thislength = pos - (buffer + offset); + + if(thislength < 0) { + *start = 0; + return 0; + } + + + thislength = MIN(thislength, length); + *start = buffer + offset; + + return thislength; } +#undef SPRINTF + +/*---------------------------------------------------------------*/ +/* error handler */ +/*---------------------------------------------------------------*/ /*static int nsp_eh_strategy(struct Scsi_Host *Shost) { return FAILED; }*/ +/* static int nsp_eh_abort(Scsi_Cmnd *SCpnt) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); - - nsp_eh_bus_reset(SCpnt); + nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); - return SUCCESS; -} + return nsp_eh_bus_reset(SCpnt); +}*/ +/* static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt) { - DEBUG(0, __FUNCTION__ " SCpnt=0x%p\n", SCpnt); + nsp_dbg(NSP_DEBUG_BUSRESET, "%s: SCpnt=0x%p", SCpnt); return FAILED; -} +}*/ -static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) +/* Do bus reset. This function uses in low-level initialize functions. */ +static int nsp_bus_reset(nsp_hw_data *data) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = data->BaseAddress; int i; - DEBUG(0, __FUNCTION__ "() SCpnt=0x%p base=0x%x\n", SCpnt, base); - - nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK); + nsp_msg(KERN_WARNING, "Bus reset"); + nsp_write(base, IRQCONTROL, IRQCONTROL_ALL_CLEAR_AND_MASK); nsp_index_write(base, SCSIBUSCTRL, SCSI_RST); mdelay(100); /* 100ms */ @@ -1287,33 +1627,46 @@ nsp_index_read(base, IRQPHASESENCE); /* dummy read */ } - nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR); + nsphw_init_sync(data); + + nsp_write(base, IRQCONTROL, IRQCONTROL_ALL_CLEAR); + + if (data->CurrentSC != NULL) { + nsp_msg(KERN_WARNING, "clean up current scsi command."); + data->CurrentSC->result = DID_ERROR << 16; + nsp_scsi_done(data->CurrentSC); + } return SUCCESS; } +/* Do bus reset. This function uses in high-level SCSI driver. */ +static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) +{ + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; + + nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); + + return nsp_bus_reset(data); +} + +/* Initialise Ninja host adapter. */ static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt) { - nsp_hw_data *data = &nsp_data; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; - DEBUG(0, __FUNCTION__ "\n"); + nsp_dbg(NSP_DEBUG_BUSRESET, "in"); + nsp_msg(KERN_DEBUG, "host reset"); nsphw_init(data); - return nsp_eh_bus_reset(SCpnt); + return SUCCESS; } /********************************************************************** PCMCIA functions - *********************************************************************/ - -/*====================================================================*/ -static void cs_error(client_handle_t handle, int func, int ret) -{ - error_info_t err = { func, ret }; - CardServices(ReportError, handle, &err); -} +**********************************************************************/ /*====================================================================== nsp_cs_attach() creates an "instance" of the driver, allocating @@ -1330,15 +1683,19 @@ client_reg_t client_reg; dev_link_t *link; int ret, i; + nsp_hw_data *data = &nsp_data_base; - DEBUG(0, __FUNCTION__ "()\n"); + nsp_dbg(NSP_DEBUG_INIT, "in"); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); - if (!info) { return NULL; } + if (info == NULL) { return NULL; } memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; + data->ScsiInfo = info; + + nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info); /* The io structure describes IO port mapping */ link->io.NumPorts1 = 0x10; @@ -1352,11 +1709,14 @@ link->irq.IRQInfo2 = irq_mask; } else { for (i = 0; i < 4; i++) { - link->irq.IRQInfo2 |= 1 << irq_list[i]; + link->irq.IRQInfo2 |= BIT(irq_list[i]); } } + + /* Interrupt handler */ link->irq.Handler = &nspintr; - link->irq.Instance = &nsp_data; + link->irq.Instance = info; + link->irq.Attributes |= (SA_SHIRQ | SA_SAMPLE_RANDOM); /* General socket configuration */ link->conf.Attributes = CONF_ENABLE_IRQ; @@ -1384,6 +1744,8 @@ return NULL; } + + nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link); return link; } /* nsp_cs_attach */ @@ -1398,8 +1760,8 @@ { dev_link_t **linkp; - DEBUG(0, __FUNCTION__ "(0x%p)\n", link); - + nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link); + /* Locate device structure */ for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { if (*linkp == link) { @@ -1411,11 +1773,7 @@ } if (link->state & DEV_CONFIG) { - nsp_cs_release((u_long)link); - if (link->state & DEV_STALE_CONFIG) { - link->state |= DEV_STALE_LINK; - return; - } + nsp_cs_release(link); } /* Break the link with Card Services */ @@ -1426,6 +1784,7 @@ /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); + link->priv = NULL; } /* nsp_cs_detach */ @@ -1440,22 +1799,26 @@ #define CFG_CHECK(fn, args...) \ if (CardServices(fn, args) != 0) goto next_entry /*====================================================================*/ - static void nsp_cs_config(dev_link_t *link) { client_handle_t handle = link->handle; scsi_info_t *info = link->priv; tuple_t tuple; cisparse_t parse; - int i, last_ret, last_fn; - u_char tuple_data[64]; + int last_ret, last_fn; + unsigned char tuple_data[64]; config_info_t conf; + win_req_t req; + memreq_t map; + cistpl_cftable_entry_t dflt = { 0 }; + struct Scsi_Host *host; + nsp_hw_data *data = &nsp_data_base; +#if !(LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74)) Scsi_Device *dev; dev_node_t **tail, *node; - struct Scsi_Host *host; - nsp_hw_data *data = &nsp_data; +#endif - DEBUG(0, __FUNCTION__ "() in\n"); + nsp_dbg(NSP_DEBUG_INIT, "in"); tuple.DesiredTuple = CISTPL_CONFIG; tuple.Attributes = 0; @@ -1469,7 +1832,6 @@ link->conf.Present = parse.config.rmask[0]; /* Configure card */ - driver_template.module = &__this_module; link->state |= DEV_CONFIG; /* Look up the current Vcc */ @@ -1479,81 +1841,195 @@ tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; CS_CHECK(GetFirstTuple, handle, &tuple); while (1) { + cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); + CFG_CHECK(GetTupleData, handle, &tuple); CFG_CHECK(ParseTuple, handle, &tuple, &parse); - link->conf.ConfigIndex = parse.cftable_entry.index; - link->io.BasePort1 = parse.cftable_entry.io.win[0].base; - i = CardServices(RequestIO, handle, &link->io); - if (i == CS_SUCCESS) { - break; + + if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { dflt = *cfg; } + if (cfg->index == 0) { goto next_entry; } + link->conf.ConfigIndex = cfg->index; + + /* Does this card need audio output? */ + if (cfg->flags & CISTPL_CFTABLE_AUDIO) { + link->conf.Attributes |= CONF_ENABLE_SPKR; + link->conf.Status = CCSR_AUDIO_ENA; + } + + /* Use power settings for Vcc and Vpp if present */ + /* Note that the CIS values need to be rescaled */ + if (cfg->vcc.present & (1<vcc.param[CISTPL_POWER_VNOM]/10000) { + goto next_entry; + } + } else if (dflt.vcc.present & (1<vpp1.present & (1 << CISTPL_POWER_VNOM)) { + link->conf.Vpp1 = link->conf.Vpp2 = + cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; + } else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) { + link->conf.Vpp1 = link->conf.Vpp2 = + dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000; + } + + /* Do we need to allocate an interrupt? */ + if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) { + link->conf.Attributes |= CONF_ENABLE_IRQ; + } + + /* IO window settings */ + link->io.NumPorts1 = link->io.NumPorts2 = 0; + if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { + cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; + if (!(io->flags & CISTPL_IO_8BIT)) + link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; + if (!(io->flags & CISTPL_IO_16BIT)) + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; + link->io.BasePort1 = io->win[0].base; + link->io.NumPorts1 = io->win[0].len; + if (io->nwin > 1) { + link->io.Attributes2 = link->io.Attributes1; + link->io.BasePort2 = io->win[1].base; + link->io.NumPorts2 = io->win[1].len; + } + /* This reserves IO space but doesn't actually enable it */ + CFG_CHECK(RequestIO, link->handle, &link->io); + } + + if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) { + cistpl_mem_t *mem = + (cfg->mem.nwin) ? &cfg->mem : &dflt.mem; + req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM; + req.Attributes |= WIN_ENABLE; + req.Base = mem->win[0].host_addr; + req.Size = mem->win[0].len; + if (req.Size < 0x1000) { + req.Size = 0x1000; + } + req.AccessSpeed = 0; + link->win = (window_handle_t)link->handle; + CFG_CHECK(RequestWindow, &link->win, &req); + map.Page = 0; map.CardOffset = mem->win[0].card_addr; + CFG_CHECK(MapMemPage, link->win, &map); + + data->MmioAddress = (unsigned long)ioremap_nocache(req.Base, req.Size); + data->MmioLength = req.Size; + } + /* If we got this far, we're cool! */ + break; + next_entry: - DEBUG(0, __FUNCTION__ " next\n"); + nsp_dbg(NSP_DEBUG_INIT, "next"); + + if (link->io.NumPorts1) { + CardServices(ReleaseIO, link->handle, &link->io); + } CS_CHECK(GetNextTuple, handle, &tuple); } - CS_CHECK(RequestIRQ, handle, &link->irq); + if (link->conf.Attributes & CONF_ENABLE_IRQ) { + CS_CHECK(RequestIRQ, link->handle, &link->irq); + } CS_CHECK(RequestConfiguration, handle, &link->conf); - /* A bad hack... */ - release_region(link->io.BasePort1, link->io.NumPorts1); + if (free_ports) { + if (link->io.BasePort1) { + release_region(link->io.BasePort1, link->io.NumPorts1); + } + if (link->io.BasePort2) { + release_region(link->io.BasePort2, link->io.NumPorts2); + } + } /* Set port and IRQ */ data->BaseAddress = link->io.BasePort1; data->NumAddress = link->io.NumPorts1; data->IrqNumber = link->irq.AssignedIRQ; - DEBUG(0, __FUNCTION__ " I/O[0x%x+0x%x] IRQ %d\n", - data->BaseAddress, data->NumAddress, data->IrqNumber); + nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d", + data->BaseAddress, data->NumAddress, data->IrqNumber); if(nsphw_init(data) == FALSE) { goto cs_failed; } - scsi_register_module(MODULE_SCSI_HA, &driver_template); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) + host = nsp_detect(&nsp_driver_template); +#else + scsi_register_host(&nsp_driver_template); + for (host = scsi_host_get_next(NULL); host != NULL; + host = scsi_host_get_next(host)) { + if (host->hostt == &nsp_driver_template) { + break; + } + } +#endif - DEBUG(0, "GET_SCSI_INFO\n"); + if (host == NULL) { + nsp_dbg(NSP_DEBUG_INIT, "detect failed"); + goto cs_failed; + } + + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74)) + scsi_add_host (host, NULL); + scsi_scan_host(host); + + snprintf(info->node.dev_name, sizeof(info->node.dev_name), "scsi%d", host->host_no); + link->dev = &info->node; + info->host = host; + +#else + nsp_dbg(NSP_DEBUG_INIT, "GET_SCSI_INFO"); tail = &link->dev; info->ndev = 0; - for (host = scsi_hostlist; host != NULL; host = host->next) { - if (host->hostt == &driver_template) { - for (dev = host->host_queue; dev != NULL; dev = dev->next) { - u_long arg[2], id; - kernel_scsi_ioctl(dev, SCSI_IOCTL_GET_IDLUN, arg); - id = (arg[0]&0x0f) + ((arg[0]>>4)&0xf0) + - ((arg[0]>>8)&0xf00) + ((arg[0]>>12)&0xf000); - node = &info->node[info->ndev]; - node->minor = 0; - switch (dev->type) { - case TYPE_TAPE: - node->major = SCSI_TAPE_MAJOR; - sprintf(node->dev_name, "st#%04lx", id); - break; - case TYPE_DISK: - case TYPE_MOD: - node->major = SCSI_DISK0_MAJOR; - sprintf(node->dev_name, "sd#%04lx", id); - break; - case TYPE_ROM: - case TYPE_WORM: - node->major = SCSI_CDROM_MAJOR; - sprintf(node->dev_name, "sr#%04lx", id); - break; - default: - node->major = SCSI_GENERIC_MAJOR; - sprintf(node->dev_name, "sg#%04lx", id); - break; - } - *tail = node; tail = &node->next; - info->ndev++; - info->host = dev->host; - } + + nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host); + + for (dev = host->host_queue; dev != NULL; dev = dev->next) { + unsigned long arg[2], id; + kernel_scsi_ioctl(dev, SCSI_IOCTL_GET_IDLUN, arg); + id = (arg[0] & 0x0f) + ((arg[0] >> 4) & 0xf0) + + ((arg[0] >> 8) & 0xf00) + ((arg[0] >> 12) & 0xf000); + node = &info->node[info->ndev]; + node->minor = 0; + switch (dev->type) { + case TYPE_TAPE: + node->major = SCSI_TAPE_MAJOR; + snprintf(node->dev_name, sizeof(node->dev_name), "st#%04lx", id); + break; + case TYPE_DISK: + case TYPE_MOD: + node->major = SCSI_DISK0_MAJOR; + snprintf(node->dev_name, sizeof(node->dev_name), "sd#%04lx", id); + break; + case TYPE_ROM: + case TYPE_WORM: + node->major = SCSI_CDROM_MAJOR; + snprintf(node->dev_name, sizeof(node->dev_name), "sr#%04lx", id); + break; + default: + node->major = SCSI_GENERIC_MAJOR; + snprintf(node->dev_name, sizeof(node->dev_name), "sg#%04lx", id); + break; } + *tail = node; tail = &node->next; + info->ndev++; + info->host = dev->host; } + *tail = NULL; if (info->ndev == 0) { - printk(KERN_INFO "nsp_cs: no SCSI devices found\n"); + nsp_msg(KERN_INFO, "no SCSI devices found"); } + nsp_dbg(NSP_DEBUG_INIT, "host=0x%p", host); +#endif /* Finally, report what we've done */ printk(KERN_INFO "nsp_cs: index 0x%02x: Vcc %d.%d", @@ -1569,47 +2045,60 @@ printk(", io 0x%04x-0x%04x", link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1-1); } + if (link->io.NumPorts2) + printk(" & 0x%04x-0x%04x", link->io.BasePort2, + link->io.BasePort2+link->io.NumPorts2-1); + if (link->win) + printk(", mem 0x%06lx-0x%06lx", req.Base, + req.Base+req.Size-1); printk("\n"); link->state &= ~DEV_CONFIG_PENDING; return; -cs_failed: + cs_failed: + nsp_dbg(NSP_DEBUG_INIT, "config fail"); cs_error(link->handle, last_fn, last_ret); - nsp_cs_release((u_long)link); - return; + nsp_cs_release(link); + return; } /* nsp_cs_config */ #undef CS_CHECK #undef CFG_CHECK + /*====================================================================== After a card is removed, nsp_cs_release() will unregister the net device, and release the PCMCIA configuration. If the device is still open, this will be postponed until it is closed. ======================================================================*/ -static void nsp_cs_release(u_long arg) +static void nsp_cs_release(dev_link_t *link) { - dev_link_t *link = (dev_link_t *)arg; - - DEBUG(0, __FUNCTION__ "(0x%p)\n", link); + scsi_info_t *info = link->priv; + nsp_hw_data *data = NULL; - /* - * If the device is currently in use, we won't release until it - * is actually closed. - */ - if (link->open) { - DEBUG(1, "nsp_cs: release postponed, '%s' still open\n", - link->dev->dev_name); - link->state |= DEV_STALE_CONFIG; - return; + if (info->host == NULL) { + nsp_msg(KERN_DEBUG, "unexpected card release call."); + } else { + data = (nsp_hw_data *)info->host->hostdata; } + nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link); + /* Unlink the device chain */ - scsi_unregister_module(MODULE_SCSI_HA, &driver_template); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2)) + if (info->host != NULL) { + scsi_remove_host(info->host); + } +#else + scsi_unregister_host(&nsp_driver_template); +#endif link->dev = NULL; if (link->win) { + if (data != NULL) { + iounmap((void *)(data->MmioAddress)); + } CardServices(ReleaseWindow, link->win); } CardServices(ReleaseConfiguration, link->handle); @@ -1620,10 +2109,11 @@ CardServices(ReleaseIRQ, link->handle, &link->irq); } link->state &= ~DEV_CONFIG; - - if (link->state & DEV_STALE_LINK) { - nsp_cs_detach(link); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2)) + if (info->host != NULL) { + scsi_host_put(info->host); } +#endif } /* nsp_cs_release */ /*====================================================================== @@ -1637,39 +2127,53 @@ to block future accesses to this device. All the functions that actually access the device should check this flag to make sure the card is still present. - + ======================================================================*/ -static int nsp_cs_event(event_t event, - int priority, - event_callback_args_t *args) +static int nsp_cs_event(event_t event, + int priority, + event_callback_args_t *args) { dev_link_t *link = args->client_data; scsi_info_t *info = link->priv; + nsp_hw_data *data; - DEBUG(1, __FUNCTION__ "(0x%06x)\n", event); + nsp_dbg(NSP_DEBUG_INIT, "in, event=0x%08x", event); switch (event) { case CS_EVENT_CARD_REMOVAL: - DEBUG(0, " event: remove\n"); + nsp_dbg(NSP_DEBUG_INIT, "event: remove"); link->state &= ~DEV_PRESENT; if (link->state & DEV_CONFIG) { ((scsi_info_t *)link->priv)->stop = 1; - nsp_cs_release((u_long)link); + nsp_cs_release(link); } break; case CS_EVENT_CARD_INSERTION: - DEBUG(0, " event: insert\n"); + nsp_dbg(NSP_DEBUG_INIT, "event: insert"); link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,68)) info->bus = args->bus; +#endif nsp_cs_config(link); break; case CS_EVENT_PM_SUSPEND: + nsp_dbg(NSP_DEBUG_INIT, "event: suspend"); link->state |= DEV_SUSPEND; /* Fall through... */ case CS_EVENT_RESET_PHYSICAL: /* Mark the device as stopped, to block IO until later */ + nsp_dbg(NSP_DEBUG_INIT, "event: reset physical"); + + if (info->host != NULL) { + nsp_msg(KERN_INFO, "clear SDTR status"); + + data = (nsp_hw_data *)info->host->hostdata; + + nsphw_init_sync(data); + } + info->stop = 1; if (link->state & DEV_CONFIG) { CardServices(ReleaseConfiguration, link->handle); @@ -1677,68 +2181,92 @@ break; case CS_EVENT_PM_RESUME: + nsp_dbg(NSP_DEBUG_INIT, "event: resume"); link->state &= ~DEV_SUSPEND; /* Fall through... */ case CS_EVENT_CARD_RESET: - DEBUG(0, " event: reset\n"); + nsp_dbg(NSP_DEBUG_INIT, "event: reset"); if (link->state & DEV_CONFIG) { - Scsi_Cmnd tmp; - CardServices(RequestConfiguration, link->handle, &link->conf); - tmp.host = info->host; - nsp_eh_host_reset(&tmp); } info->stop = 0; + + if (info->host != NULL) { + nsp_msg(KERN_INFO, "reset host and bus"); + + data = (nsp_hw_data *)info->host->hostdata; + + nsphw_init (data); + nsp_bus_reset(data); + } + break; default: - DEBUG(0, " event: unknown\n"); + nsp_dbg(NSP_DEBUG_INIT, "event: unknown"); break; } - DEBUG(0, __FUNCTION__ " end\n"); + nsp_dbg(NSP_DEBUG_INIT, "end"); return 0; } /* nsp_cs_event */ /*======================================================================* * module entry point *====================================================================*/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68)) +static struct pcmcia_driver nsp_driver = { + .owner = THIS_MODULE, + .drv = { + .name = "nsp_cs", + }, + .attach = nsp_cs_attach, + .detach = nsp_cs_detach, +}; +#endif + static int __init nsp_cs_init(void) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68)) + nsp_msg(KERN_INFO, "loading..."); + + return pcmcia_register_driver(&nsp_driver); +#else servinfo_t serv; - DEBUG(0, __FUNCTION__ "() in\n"); - DEBUG(0, "%s\n", version); + nsp_msg(KERN_INFO, "loading..."); CardServices(GetCardServicesInfo, &serv); if (serv.Revision != CS_RELEASE_CODE) { - printk(KERN_DEBUG "nsp_cs: Card Services release " - "does not match!\n"); - return -1; + nsp_msg(KERN_DEBUG, "Card Services release does not match!"); + return -EINVAL; } register_pcmcia_driver(&dev_info, &nsp_cs_attach, &nsp_cs_detach); - DEBUG(0, __FUNCTION__ "() out\n"); + nsp_dbg(NSP_DEBUG_INIT, "out"); return 0; +#endif } - -static void __exit nsp_cs_cleanup(void) +static void __exit nsp_cs_exit(void) { - DEBUG(0, __FUNCTION__ "() unloading\n"); + nsp_msg(KERN_INFO, "unloading..."); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68)) + pcmcia_unregister_driver(&nsp_driver); +#else unregister_pcmcia_driver(&dev_info); +#endif + + /* XXX: this really needs to move into generic code.. */ while (dev_list != NULL) { if (dev_list->state & DEV_CONFIG) { - nsp_cs_release((u_long)dev_list); + nsp_cs_release(dev_list); } nsp_cs_detach(dev_list); } } -module_init(nsp_cs_init); -module_exit(nsp_cs_cleanup); -/* - * - * - */ +module_init(nsp_cs_init) +module_exit(nsp_cs_exit) /* end */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/pcmcia/nsp_cs.h linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_cs.h --- linux-2.4.22/drivers/scsi/pcmcia/nsp_cs.h 2001-10-11 16:04:57.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_cs.h 2003-10-22 22:48:36.000000000 +0000 @@ -10,13 +10,13 @@ =========================================================*/ -/* $Id: nsp_cs.h,v 1.27 2001/09/10 10:31:13 elca Exp $ */ +/* $Id: nsp_cs.h,v 1.20 2003/09/24 10:38:18 elca Exp $ */ #ifndef __nsp_cs__ #define __nsp_cs__ /* for debugging */ -/*#define PCMCIA_DEBUG 9*/ +//#define NSP_DEBUG 9 /* #define static @@ -26,64 +26,83 @@ /************************************ * Some useful macros... */ -#define Number(arr) ((int) (sizeof(arr) / sizeof(arr[0]))) -#define BIT(x) (1<<(x)) +#define NUMBER(arr) ((int) (sizeof(arr) / sizeof(arr[0]))) /* from XtNumber() in /usr/X11R6/include/X11/Intrinsic.h */ +#define BIT(x) (1L << (x)) #define MIN(a,b) ((a) > (b) ? (b) : (a)) -/* SCSI initiator must be 7 */ -#define SCSI_INITIATOR_ID 7 +/* SCSI initiator must be ID 7 */ +#define NSP_INITIATOR_ID 7 #define NSP_SELTIMEOUT 200 -/* base register */ -#define IRQCONTROL 0x00 +/*************************************************************************** + * register definitions + ***************************************************************************/ +/*======================================================================== + * base register + ========================================================================*/ +#define IRQCONTROL 0x00 /* R */ # define IRQCONTROL_RESELECT_CLEAR BIT(0) # define IRQCONTROL_PHASE_CHANGE_CLEAR BIT(1) # define IRQCONTROL_TIMER_CLEAR BIT(2) # define IRQCONTROL_FIFO_CLEAR BIT(3) -# define IRQCONTROL_ALLMASK 0xff -# define IRQCONTROL_ALLCLEAR 0x0f -# define IRQCONTROL_IRQDISABLE 0xf0 +# define IRQCONTROL_SCSI_IRQ_MASK BIT(4) +# define IRQCONTROL_EXT_IRQ_MASK BIT(5) +# define IRQCONTROL_TIMER_IRQ_MASK BIT(6) +# define IRQCONTROL_FIFO_IRQ_MASK BIT(7) +# define IRQCONTROL_ALL_MASK (IRQCONTROL_SCSI_IRQ_MASK | \ + IRQCONTROL_EXT_IRQ_MASK | \ + IRQCONTROL_TIMER_IRQ_MASK | \ + IRQCONTROL_FIFO_IRQ_MASK ) +# define IRQCONTROL_ALL_CLEAR (IRQCONTROL_RESELECT_CLEAR | \ + IRQCONTROL_PHASE_CHANGE_CLEAR | \ + IRQCONTROL_TIMER_CLEAR | \ + IRQCONTROL_FIFO_CLEAR ) +# define IRQCONTROL_ALL_CLEAR_AND_MASK (IRQCONTROL_ALL_MASK | \ + IRQCONTROL_ALL_CLEAR) -#define IRQSTATUS 0x00 +#define IRQSTATUS 0x00 /* W */ # define IRQSTATUS_SCSI BIT(0) # define IRQSTATUS_TIMER BIT(2) # define IRQSTATUS_FIFO BIT(3) # define IRQSTATUS_MASK 0x0f -#define IFSELECT 0x01 +#define IFSELECT 0x01 /* W */ # define IF_IFSEL BIT(0) # define IF_REGSEL BIT(2) -#define FIFOSTATUS 0x01 -# define FIFOSTATUS_CHIP_REVISION 0x0f -# define FIFOSTATUS_CHIP_ID 0x70 -# define FIFOSTATUS_FULL_EMPTY 0x80 - -#define INDEXREG 0x02 -#define DATAREG 0x03 -#define FIFODATA 0x04 -#define FIFODATA1 0x05 -#define FIFODATA2 0x06 -#define FIFODATA3 0x07 +#define FIFOSTATUS 0x01 /* R */ +# define FIFOSTATUS_CHIP_REVISION_MASK 0x0f +# define FIFOSTATUS_CHIP_ID_MASK 0x70 +# define FIFOSTATUS_FULL_EMPTY BIT(7) + +#define INDEXREG 0x02 /* R/W */ +#define DATAREG 0x03 /* R/W */ +#define FIFODATA 0x04 /* R/W */ +#define FIFODATA1 0x05 /* R/W */ +#define FIFODATA2 0x06 /* R/W */ +#define FIFODATA3 0x07 /* R/W */ + +/*==================================================================== + * indexed register + ====================================================================*/ +#define EXTBUSCTRL 0x10 /* R/W,deleted */ -/* indexed register */ -#define EXTBUSCTRL 0x10 - -#define CLOCKDIV 0x11 +#define CLOCKDIV 0x11 /* R/W */ # define CLOCK_40M 0x02 # define CLOCK_20M 0x01 +# define FAST_20 BIT(2) -#define TERMPWRCTRL 0x13 +#define TERMPWRCTRL 0x13 /* R/W */ # define POWER_ON BIT(0) -#define SCSIIRQMODE 0x15 +#define SCSIIRQMODE 0x15 /* R/W */ # define SCSI_PHASE_CHANGE_EI BIT(0) # define RESELECT_EI BIT(4) # define FIFO_IRQ_EI BIT(5) # define SCSI_RESET_IRQ_EI BIT(6) -#define IRQPHASESENCE 0x16 +#define IRQPHASESENCE 0x16 /* R */ # define LATCHED_MSG BIT(0) # define LATCHED_IO BIT(1) # define LATCHED_CD BIT(2) @@ -93,9 +112,9 @@ # define FIFO_IRQ BIT(6) # define SCSI_RESET_IRQ BIT(7) -#define TIMERCOUNT 0x17 +#define TIMERCOUNT 0x17 /* R/W */ -#define SCSIBUSCTRL 0x18 +#define SCSIBUSCTRL 0x18 /* R/W */ # define SCSI_SEL BIT(0) # define SCSI_RST BIT(1) # define SCSI_DATAOUT_ENB BIT(2) @@ -105,13 +124,13 @@ # define AUTODIRECTION BIT(6) # define ACKENB BIT(7) -#define SCSIBUSMON 0x19 +#define SCSIBUSMON 0x19 /* R */ -#define SETARBIT 0x1A +#define SETARBIT 0x1A /* W */ # define ARBIT_GO BIT(0) # define ARBIT_FLAG_CLEAR BIT(1) -#define ARBITSTATUS 0x1A +#define ARBITSTATUS 0x1A /* R */ /*# define ARBIT_GO BIT(0)*/ # define ARBIT_WIN BIT(1) # define ARBIT_FAIL BIT(2) @@ -124,90 +143,110 @@ # define CLEAR_COMMAND_POINTER BIT(0) # define AUTO_COMMAND_GO BIT(1) -#define RESELECTID 0x1C /* R */ -#define COMMANDDATA 0x1D +#define RESELECTID 0x1C /* R */ +#define COMMANDDATA 0x1D /* R/W */ -#define POINTERCLR 0x1E /* W */ +#define POINTERCLR 0x1E /* W */ # define POINTER_CLEAR BIT(0) # define ACK_COUNTER_CLEAR BIT(1) # define REQ_COUNTER_CLEAR BIT(2) # define HOST_COUNTER_CLEAR BIT(3) -# define READ_SOURCE 0x30 - -#define TRANSFERCOUNT 0x1E /* R */ - -#define TRANSFERMODE 0x20 -# define MODE_MEM8 BIT(0) -# define MODE_MEM32 BIT(1) -# define MODE_ADR24 BIT(2) -# define MODE_ADR32 BIT(3) -# define MODE_IO8 BIT(4) -# define MODE_IO32 BIT(5) -# define TRANSFER_GO BIT(6) -# define BRAIND BIT(7) +# define READ_SOURCE (BIT(4) | BIT(5)) +# define ACK_COUNTER (0) +# define REQ_COUNTER (BIT(4)) +# define HOST_COUNTER (BIT(5)) + +#define TRANSFERCOUNT 0x1E /* R */ + +#define TRANSFERMODE 0x20 /* R/W */ +# define MODE_MEM8 BIT(0) +# define MODE_MEM32 BIT(1) +# define MODE_ADR24 BIT(2) +# define MODE_ADR32 BIT(3) +# define MODE_IO8 BIT(4) +# define MODE_IO32 BIT(5) +# define TRANSFER_GO BIT(6) +# define BRAIND BIT(7) -#define SYNCREG 0x21 +#define SYNCREG 0x21 /* R/W */ # define SYNCREG_OFFSET_MASK 0x0f # define SYNCREG_PERIOD_MASK 0xf0 # define SYNCREG_PERIOD_SHIFT 4 -#define SCSIDATALATCH 0x22 -#define SCSIDATAIN 0x22 -#define SCSIDATAWITHACK 0x23 -#define SCAMCONTROL 0x24 -#define SCAMSTATUS 0x24 -#define SCAMDATA 0x25 +#define SCSIDATALATCH 0x22 /* W */ +#define SCSIDATAIN 0x22 /* R */ +#define SCSIDATAWITHACK 0x23 /* R/W */ +#define SCAMCONTROL 0x24 /* W */ +#define SCAMSTATUS 0x24 /* R */ +#define SCAMDATA 0x25 /* R/W */ -#define OTHERCONTROL 0x26 +#define OTHERCONTROL 0x26 /* R/W */ # define TPL_ROM_WRITE_EN BIT(0) # define TPWR_OUT BIT(1) # define TPWR_SENSE BIT(2) # define RA8_CONTROL BIT(3) -#define ACKWIDTH 0x27 -#define CLRTESTPNT 0x28 -#define ACKCNTLD 0x29 -#define REQCNTLD 0x2A -#define HSTCNTLD 0x2B -#define CHECKSUM 0x2C +#define ACKWIDTH 0x27 /* R/W */ +#define CLRTESTPNT 0x28 /* W */ +#define ACKCNTLD 0x29 /* W */ +#define REQCNTLD 0x2A /* W */ +#define HSTCNTLD 0x2B /* W */ +#define CHECKSUM 0x2C /* R/W */ -/* +/************************************************************************ * Input status bit definitions. - */ -#define S_ATN 0x80 /**/ -#define S_SELECT 0x40 /**/ -#define S_REQUEST 0x20 /* Request line from SCSI bus*/ -#define S_ACK 0x10 /* Acknowlege line from SCSI bus*/ -#define S_BUSY 0x08 /* Busy line from SCSI bus*/ -#define S_CD 0x04 /* Command/Data line from SCSI bus*/ -#define S_IO 0x02 /* Input/Output line from SCSI bus*/ -#define S_MESSAGE 0x01 /* Message line from SCSI bus*/ + ************************************************************************/ +#define S_MESSAGE BIT(0) /* Message line from SCSI bus */ +#define S_IO BIT(1) /* Input/Output line from SCSI bus */ +#define S_CD BIT(2) /* Command/Data line from SCSI bus */ +#define S_BUSY BIT(3) /* Busy line from SCSI bus */ +#define S_ACK BIT(4) /* Acknowlege line from SCSI bus */ +#define S_REQUEST BIT(5) /* Request line from SCSI bus */ +#define S_SELECT BIT(6) /* */ +#define S_ATN BIT(7) /* */ -/* +/*********************************************************************** * Useful Bus Monitor status combinations. - */ + ***********************************************************************/ #define BUSMON_SEL S_SELECT #define BUSMON_BSY S_BUSY #define BUSMON_REQ S_REQUEST #define BUSMON_IO S_IO #define BUSMON_ACK S_ACK #define BUSMON_BUS_FREE 0 -#define BUSMON_COMMAND ( S_BUSY | S_CD | S_REQUEST ) -#define BUSMON_MESSAGE_IN ( S_BUSY | S_MESSAGE | S_IO | S_CD | S_REQUEST ) -#define BUSMON_MESSAGE_OUT ( S_BUSY | S_MESSAGE | S_CD | S_REQUEST ) -#define BUSMON_DATA_IN ( S_BUSY | S_IO | S_REQUEST ) -#define BUSMON_DATA_OUT ( S_BUSY | S_REQUEST ) -#define BUSMON_STATUS ( S_BUSY | S_IO | S_CD | S_REQUEST ) -#define BUSMON_RESELECT ( S_SELECT | S_IO ) -#define BUSMON_PHASE_MASK ( S_SELECT | S_CD | S_MESSAGE | S_IO ) +#define BUSMON_COMMAND ( S_BUSY | S_CD | S_REQUEST ) +#define BUSMON_MESSAGE_IN ( S_BUSY | S_CD | S_IO | S_MESSAGE | S_REQUEST ) +#define BUSMON_MESSAGE_OUT ( S_BUSY | S_CD | S_MESSAGE | S_REQUEST ) +#define BUSMON_DATA_IN ( S_BUSY | S_IO | S_REQUEST ) +#define BUSMON_DATA_OUT ( S_BUSY | S_REQUEST ) +#define BUSMON_STATUS ( S_BUSY | S_CD | S_IO | S_REQUEST ) +#define BUSMON_SELECT ( S_IO | S_SELECT ) +#define BUSMON_RESELECT ( S_IO | S_SELECT ) +#define BUSMON_PHASE_MASK ( S_CD | S_IO | S_MESSAGE | S_SELECT ) +#define BUSPHASE_SELECT ( BUSMON_SELECT & BUSMON_PHASE_MASK ) #define BUSPHASE_COMMAND ( BUSMON_COMMAND & BUSMON_PHASE_MASK ) #define BUSPHASE_MESSAGE_IN ( BUSMON_MESSAGE_IN & BUSMON_PHASE_MASK ) #define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK ) #define BUSPHASE_DATA_IN ( BUSMON_DATA_IN & BUSMON_PHASE_MASK ) #define BUSPHASE_DATA_OUT ( BUSMON_DATA_OUT & BUSMON_PHASE_MASK ) #define BUSPHASE_STATUS ( BUSMON_STATUS & BUSMON_PHASE_MASK ) -#define BUSPHASE_SELECT ( S_SELECT | S_IO ) + +/*====================================================================*/ + +typedef struct scsi_info_t { + dev_link_t link; + struct Scsi_Host *host; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74)) + dev_node_t node; +#else + int ndev; + dev_node_t node[8]; + struct bus_operations *bus; +#endif + int stop; +} scsi_info_t; + /* synchronous transfer negotiation data */ typedef struct _sync_data { @@ -222,67 +261,116 @@ unsigned char AckWidth; } sync_data; -typedef struct _nsp_data { +typedef struct _nsp_hw_data { unsigned int BaseAddress; unsigned int NumAddress; unsigned int IrqNumber; - unsigned char ScsiClockDiv; + unsigned long MmioAddress; +#define NSP_MMIO_OFFSET 0x0800 + unsigned long MmioLength; + unsigned char ScsiClockDiv; unsigned char TransferMode; + unsigned char ChipRev; int TimerCount; int SelectionTimeOut; Scsi_Cmnd *CurrentSC; + //int CurrnetTarget; int FifoCount; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) - int Residual; -#define RESID data->Residual -#else -#define RESID SCpnt->resid -#endif #define MSGBUF_SIZE 20 unsigned char MsgBuffer[MSGBUF_SIZE]; int MsgLen; #define N_TARGET 8 -#define N_LUN 8 - sync_data Sync[N_TARGET][N_LUN]; + sync_data Sync[N_TARGET]; + + char nspinfo[110]; /* description */ + spinlock_t Lock; + + scsi_info_t *ScsiInfo; /* attach <-> detect glue */ + + +#ifdef NSP_DEBUG + int CmdId; /* Accepted command serial number. + Used for debugging. */ +#endif } nsp_hw_data; -static void nsp_cs_release(u_long arg); -static int nsp_cs_event(event_t event, int priority, event_callback_args_t *args); -static dev_link_t *nsp_cs_attach(void); -static void nsp_cs_detach(dev_link_t *); - -static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, nsp_hw_data *data); -static void nsp_start_timer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int time); - -static int nsp_detect(Scsi_Host_Template * ); -static int nsp_release(struct Scsi_Host *shpnt); -static const char * nsp_info(struct Scsi_Host *shpnt); -static int nsp_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); - -static int nsp_abort(Scsi_Cmnd *); -static int nsp_reset(Scsi_Cmnd *, unsigned int); - -static int nsp_eh_abort(Scsi_Cmnd * SCpnt); -static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt); -static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt); -static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt); - -static int nsp_fifo_count(Scsi_Cmnd *SCpnt); -static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data); -static int nsp_nexus(Scsi_Cmnd *SCpnt, nsp_hw_data *data); - -#ifdef PCMCIA_DEBUG -static void show_command(Scsi_Cmnd *ptr); -static void show_phase(Scsi_Cmnd *SCpnt); +/**************************************************************************** + * + */ + +/* Card service functions */ +static dev_link_t *nsp_cs_attach (void); +static void nsp_cs_detach (dev_link_t *link); +static void nsp_cs_release(dev_link_t *link); +static void nsp_cs_config (dev_link_t *link); +static int nsp_cs_event (event_t event, int priority, event_callback_args_t *args); + +/* Linux SCSI subsystem specific functions */ +static struct Scsi_Host *nsp_detect (Scsi_Host_Template *sht); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) +static int nsp_detect_old (Scsi_Host_Template *sht); +static int nsp_release_old(struct Scsi_Host *shpnt); +#endif +static const char *nsp_info (struct Scsi_Host *shpnt); +static int nsp_proc_info ( +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + struct Scsi_Host *host, +#endif + char *buffer, + char **start, + off_t offset, + int length, +#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73)) + int hostno, +#endif + int inout); +static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *SCpnt)); + +/* Error handler */ +/*static int nsp_eh_abort (Scsi_Cmnd *SCpnt);*/ +/*static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);*/ +static int nsp_eh_bus_reset (Scsi_Cmnd *SCpnt); +static int nsp_eh_host_reset (Scsi_Cmnd *SCpnt); +static int nsp_bus_reset (nsp_hw_data *data); + +/* */ +static int nsphw_init (nsp_hw_data *data); +static int nsphw_start_selection(Scsi_Cmnd *SCpnt); +static void nsp_start_timer (Scsi_Cmnd *SCpnt, int time); +static int nsp_fifo_count (Scsi_Cmnd *SCpnt); +static void nsp_pio_read (Scsi_Cmnd *SCpnt); +static void nsp_pio_write (Scsi_Cmnd *SCpnt); +static int nsp_nexus (Scsi_Cmnd *SCpnt); +static void nsp_scsi_done (Scsi_Cmnd *SCpnt); +static int nsp_analyze_sdtr (Scsi_Cmnd *SCpnt); +static int nsp_negate_signal (Scsi_Cmnd *SCpnt, unsigned char mask, char *str); +static int nsp_expect_signal (Scsi_Cmnd *SCpnt, unsigned char current_phase, unsigned char mask); +static int nsp_xfer (Scsi_Cmnd *SCpnt, int phase); +static int nsp_dataphase_bypass (Scsi_Cmnd *SCpnt); +static int nsp_reselected (Scsi_Cmnd *SCpnt); +static struct Scsi_Host *nsp_detect(Scsi_Host_Template *sht); + +/* Interrupt handler */ +//static irqreturn_t nspintr(int irq, void *dev_id, struct pt_regs *regs); + +/* Module entry point*/ +static int __init nsp_cs_init(void); +static void __exit nsp_cs_exit(void); + + +/* Debug */ +#ifdef NSP_DEBUG +static void show_command (Scsi_Cmnd *SCpnt); +static void show_phase (Scsi_Cmnd *SCpnt); static void show_busphase(unsigned char stat); -static void show_message(nsp_hw_data *data); +static void show_message (nsp_hw_data *data); #else # define show_command(ptr) /* */ # define show_phase(SCpnt) /* */ @@ -294,17 +382,19 @@ * SCSI phase */ enum _scsi_phase { - PH_UNDETERMINED, - PH_ARBSTART, - PH_SELSTART, - PH_SELECTED, - PH_COMMAND, - PH_DATA, - PH_STATUS, - PH_MSG_IN, - PH_MSG_OUT, - PH_DISCONNECT, - PH_RESELECT + PH_UNDETERMINED , + PH_ARBSTART , + PH_SELSTART , + PH_SELECTED , + PH_COMMAND , + PH_DATA , + PH_STATUS , + PH_MSG_IN , + PH_MSG_OUT , + PH_DISCONNECT , + PH_RESELECT , + PH_ABORT , + PH_RESET }; enum _data_in_out { @@ -313,12 +403,85 @@ IO_OUT }; +enum _burst_mode { + BURST_IO8 = 0, + BURST_IO32 = 1, + BURST_MEM32 = 2, +}; -/* SCSI messaage */ + +/************************************************************************** + * SCSI messaage + */ #define MSG_COMMAND_COMPLETE 0x00 #define MSG_EXTENDED 0x01 +#define MSG_ABORT 0x06 #define MSG_NO_OPERATION 0x08 +#define MSG_BUS_DEVICE_RESET 0x0c #define MSG_EXT_SDTR 0x01 + +/************************************************************************** + * Compatibility functions + */ + +/* for Kernel 2.4 */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) +# define scsi_register_host(template) scsi_register_module(MODULE_SCSI_HA, template) +# define scsi_unregister_host(template) scsi_unregister_module(MODULE_SCSI_HA, template) +# define scsi_host_put(host) scsi_unregister(host) + +# define IRQ_NONE /* */ +# define IRQ_HANDLED /* */ +# define IRQ_RETVAL(x) /* */ + +/* This is ad-hoc version of scsi_host_get_next() */ +static inline struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *host) +{ + if (host == NULL) { + return scsi_hostlist; + } else { + return host->next; + } +} + +/* This is ad-hoc version of scsi_host_hn_get() */ +static inline struct Scsi_Host *scsi_host_hn_get(unsigned short hostno) +{ + struct Scsi_Host *host; + + for (host = scsi_host_get_next(NULL); host != NULL; + host = scsi_host_get_next(host)) { + if (host->host_no == hostno) { + break; + } + } + + return host; +} + +static void cs_error(client_handle_t handle, int func, int ret) +{ + error_info_t err = { func, ret }; + CardServices(ReportError, handle, &err); +} + +/* scatter-gather table */ +# define SG_ADDRESS(buffer) ((buffer)->address) + +/* host spin lock */ +# define HOST_LOCK (&io_request_lock) +#endif + +/* for Kernel 2.6 */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) +/* scatter-gather table */ +# define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset)) + +/* host spin lock */ +# define HOST_LOCK (((scsi_info_t *)dev_id)->host->host_lock) +#endif + #endif /*__nsp_cs__*/ +/* end */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/pcmcia/nsp_debug.c linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_debug.c --- linux-2.4.22/drivers/scsi/pcmcia/nsp_debug.c 2001-10-11 16:04:57.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_debug.c 2003-10-22 22:48:38.000000000 +0000 @@ -6,7 +6,7 @@ the GNU General Public License. =========================================================================*/ -/* $Id: nsp_debug.c,v 1.8 2001/09/07 04:32:28 elca Exp $ */ +/* $Id: nsp_debug.c,v 1.3 2003/07/26 14:21:09 elca Exp $ */ /* * Show the command data of a command @@ -87,14 +87,21 @@ static void print_commandk (unsigned char *command) { - int i,s; + int i, s; printk(KERN_DEBUG); print_opcodek(command[0]); /*printk(KERN_DEBUG __FUNCTION__ " ");*/ - for ( i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) { + if ((command[0] >> 5) == 6 || + (command[0] >> 5) == 7 ) { + s = 12; /* vender specific */ + } else { + s = COMMAND_SIZE(command[0]); + } + for ( i = 1; i < s; ++i) { printk("%02x ", command[i]); } - switch (COMMAND_SIZE(command[0])) { + + switch (s) { case 6: printk("LBA=%d len=%d", (((unsigned int)command[1] & 0x0f) << 16) | @@ -131,9 +138,9 @@ printk("\n"); } -static void show_command(Scsi_Cmnd *ptr) +static void show_command(Scsi_Cmnd *SCpnt) { - print_commandk(ptr->cmnd); + print_commandk(SCpnt->cmnd); } static void show_phase(Scsi_Cmnd *SCpnt) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/pcmcia/nsp_io.h linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_io.h --- linux-2.4.22/drivers/scsi/pcmcia/nsp_io.h 2001-10-11 16:04:57.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_io.h 2003-10-22 22:48:56.000000000 +0000 @@ -7,7 +7,7 @@ */ -/* $Id: nsp_io.h,v 1.9 2001/09/07 04:32:42 elca Exp $ */ +/* $Id: nsp_io.h,v 1.3 2003/08/04 21:15:26 elca Exp $ */ #ifndef __NSP_IO_H__ #define __NSP_IO_H__ @@ -76,7 +76,7 @@ void *buf, unsigned long count) { - //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx\n", buf, count); + /*nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx", buf, count);*/ nsp_multi_read_1(base, FIFODATA, buf, count); } @@ -95,7 +95,7 @@ void *buf, unsigned long count) { - //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx*2\n", buf, count); + //nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*2", buf, count); nsp_multi_read_2(base, FIFODATA, buf, count); } @@ -114,7 +114,7 @@ void *buf, unsigned long count) { - //DEBUG(0, __FUNCTION__ "() buf=0x%p, count=0x%lx*4\n", buf, count); + //nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count); nsp_multi_read_4(base, FIFODATA, buf, count); } @@ -172,5 +172,103 @@ nsp_multi_write_4(base, FIFODATA, buf, count); } + +/*====================================================================*/ + +static inline void nsp_mmio_write(unsigned long base, + unsigned int index, + unsigned char val) +{ + unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index); + + writeb(val, ptr); +} + +static inline unsigned char nsp_mmio_read(unsigned long base, + unsigned int index) +{ + unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index); + + return readb(ptr); +} + +/*-----------*/ + +static inline unsigned char nsp_mmio_index_read(unsigned long base, + unsigned int reg) +{ + unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG); + unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG); + + writeb((unsigned char)reg, index_ptr); + return readb(data_ptr); +} + +static inline void nsp_mmio_index_write(unsigned long base, + unsigned int reg, + unsigned char val) +{ + unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG); + unsigned char *data_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG); + + writeb((unsigned char)reg, index_ptr); + writeb(val, data_ptr); +} + +/* read 32bit FIFO */ +static inline void nsp_mmio_multi_read_4(unsigned long base, + unsigned int Register, + void *buf, + unsigned long count) +{ + unsigned long *ptr = (unsigned long *)(base + Register); + unsigned long *tmp = (unsigned long *)buf; + int i; + + //nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr); + + for (i = 0; i < count; i++) { + *tmp = readl(ptr); + //nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp); + tmp++; + } +} + +static inline void nsp_mmio_fifo32_read(unsigned int base, + void *buf, + unsigned long count) +{ + //nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count); + nsp_mmio_multi_read_4(base, FIFODATA, buf, count); +} + +static inline void nsp_mmio_multi_write_4(unsigned long base, + unsigned int Register, + void *buf, + unsigned long count) +{ + unsigned long *ptr = (unsigned long *)(base + Register); + unsigned long *tmp = (unsigned long *)buf; + int i; + + //nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr); + + for (i = 0; i < count; i++) { + writel(*tmp, ptr); + //nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp); + tmp++; + } +} + +static inline void nsp_mmio_fifo32_write(unsigned int base, + void *buf, + unsigned long count) +{ + //nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count); + nsp_mmio_multi_write_4(base, FIFODATA, buf, count); +} + + + #endif /* end */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/pcmcia/nsp_message.c linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_message.c --- linux-2.4.22/drivers/scsi/pcmcia/nsp_message.c 2001-10-11 16:04:57.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/pcmcia/nsp_message.c 2003-10-22 22:48:23.000000000 +0000 @@ -6,11 +6,12 @@ the GNU General Public License. */ -/* $Id: nsp_message.c,v 1.7 2001/09/07 04:33:01 elca Exp $ */ +/* $Id: nsp_message.c,v 1.6 2003/07/26 14:21:09 elca Exp $ */ -static void nsp_message_in(Scsi_Cmnd *SCpnt, nsp_hw_data *data) +static void nsp_message_in(Scsi_Cmnd *SCpnt) { - unsigned int base = SCpnt->host->io_port; + unsigned int base = SCpnt->device->host->io_port; + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; unsigned char data_reg, control_reg; int ret, len; @@ -23,7 +24,7 @@ ret = 16; len = 0; - DEBUG(0, " msgin loop\n"); + nsp_dbg(NSP_DEBUG_MSGINOCCUR, "msgin loop"); do { /* read data */ data_reg = nsp_index_read(base, SCSIDATAIN); @@ -49,8 +50,9 @@ } -static void nsp_message_out(Scsi_Cmnd *SCpnt, nsp_hw_data *data) +static void nsp_message_out(Scsi_Cmnd *SCpnt) { + nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; int ret = 1; int len = data->MsgLen; @@ -61,10 +63,10 @@ * the next "msg out" if exists (no scsi phase changes). */ - DEBUG(0, " msgout loop\n"); + nsp_dbg(NSP_DEBUG_MSGOUTOCCUR, "msgout loop"); do { - if (nsp_xfer(SCpnt, data, BUSPHASE_MESSAGE_OUT)) { - printk(KERN_DEBUG " " __FUNCTION__ " msgout: xfer short\n"); + if (nsp_xfer(SCpnt, BUSPHASE_MESSAGE_OUT)) { + nsp_msg(KERN_DEBUG, "msgout: xfer short"); } /* catch a next signal */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/ql12160_fw.h linux-2.4.23-pre8/drivers/scsi/ql12160_fw.h --- linux-2.4.22/drivers/scsi/ql12160_fw.h 2000-02-08 03:45:28.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/ql12160_fw.h 2003-10-22 22:48:54.000000000 +0000 @@ -1,1704 +1,1787 @@ -/* - ************************************************************************ - * * - * --- ISP12160 Initiator Firmware --- * - * 32 LUN Support * - * * - ************************************************************************ - * * - * Copyright (C) 1999,2000 Qlogic, Corporation - * All rights reserved. +/***************************************************************************** + * QLOGIC LINUX SOFTWARE * - * Redistribution and use in source and binary forms are permitted provided - * that the following conditions are met: - * 1. Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission + * QLogic ISP12160 device driver for Linux 2.2.x and 2.4.x + * Copyright (C) 2002 Qlogic Corporation (www.qlogic.com) * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * * - ************************************************************************ - */ + * 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. + * + *****************************************************************************/ +/************************************************************************ + * --- ISP12160A Initiator Firmware --- * + * 32 LUN Support * + ************************************************************************/ /* - * Firmware Version 10.01.19 (12:38 Oct 12, 1999) + * Firmware Version 10.04.32 (12:03 May 09, 2001) */ #ifdef UNIQUE_FW_NAME -unsigned short fw12160i_version = 10*1024+1; +unsigned short fw12160i_version = 10*1024+4; #else -unsigned short risc_code_version = 10*1024+1; +unsigned short risc_code_version = 10*1024+4; #endif #ifdef UNIQUE_FW_NAME -unsigned char fw12160i_version_str[] = {10,1,19}; +unsigned char fw12160i_version_str[] = {10,4,32}; #else -unsigned char firmware_version[] = {10,1,19}; +unsigned char firmware_version[] = {10,4,32}; #endif #ifdef UNIQUE_FW_NAME -#define fw12160i_VERSION_STRING "10.1.19" +#define fw12160i_VERSION_STRING "10.04.32" #else -#define FW_VERSION_STRING "10.1.19" +#define FW_VERSION_STRING "10.04.32" #endif #ifdef UNIQUE_FW_NAME -unsigned short fw12160i_addr01 = 0x1000 ; +unsigned short fw12160i_addr01 = 0x1000; #else -unsigned short risc_code_addr01 = 0x1000 ; +unsigned short risc_code_addr01 = 0x1000; #endif #ifdef UNIQUE_FW_NAME -unsigned short fw12160i_code01[] = { +unsigned short fw12160i_code01[] = { #else -unsigned short risc_code01[] = { +unsigned short risc_code01[] = { #endif - 0x0804, 0x1041, 0x0000, 0x32f8, 0x0000, 0x2043, 0x4f50, 0x5952, + 0x0804, 0x1041, 0x0000, 0x35e6, 0x0000, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31, 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320, 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350, 0x3132, 0x3136, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056, - 0x6572, 0x7369, 0x6f6e, 0x2031, 0x302e, 0x3031, 0x2020, 0x2043, + 0x6572, 0x7369, 0x6f6e, 0x2031, 0x302e, 0x3034, 0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020, - 0x2400, 0x20c9, 0x8cff, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001, + 0x2400, 0x20c9, 0x8fff, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1120, 0x2071, 0x0100, 0x70a0, 0x70a2, - 0x20c1, 0x0020, 0x2089, 0x1223, 0x2071, 0x0010, 0x70c3, 0x0004, + 0x20c1, 0x0020, 0x2089, 0x1221, 0x2071, 0x0010, 0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x000a, 0x2001, 0x04fd, 0x2004, 0x70d6, 0x2009, 0xfeff, 0x2130, 0x2128, - 0xa1a2, 0x4300, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, - 0xa192, 0x8d00, 0x2009, 0x0000, 0x2001, 0x0032, 0x080c, 0x1d83, - 0x2218, 0x2079, 0x4300, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, + 0xa1a2, 0x4600, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, + 0xa192, 0x9000, 0x2009, 0x0000, 0x2001, 0x0032, 0x080c, 0x1de8, + 0x2218, 0x2079, 0x4600, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x1dd8, 0x2009, 0xff00, 0x3400, 0xa102, 0x0218, 0x0110, 0x20a8, 0x42a4, 0x781b, 0x0064, 0x7814, 0xc0cd, - 0xc0d5, 0x7816, 0x2071, 0x0200, 0x00d6, 0x2069, 0x4340, 0x080c, - 0x42d8, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1130, 0x2069, 0x4380, - 0x2071, 0x0100, 0x080c, 0x42d8, 0x7814, 0xc0d4, 0x7816, 0x00de, + 0xc0d5, 0x7816, 0x2071, 0x0200, 0x00d6, 0x2069, 0x4640, 0x080c, + 0x459a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1130, 0x2069, 0x4680, + 0x2071, 0x0100, 0x080c, 0x459a, 0x7814, 0xc0d4, 0x7816, 0x00de, 0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800, 0xc08d, 0x7802, 0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002, 0x7827, 0x0002, - 0x2009, 0x0002, 0x2069, 0x4340, 0x681b, 0x0003, 0x6823, 0x0007, - 0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028, 0x6837, 0x0000, - 0x683b, 0x0006, 0x6833, 0x0008, 0x683f, 0x0000, 0x8109, 0x0500, - 0x68d3, 0x000a, 0x68c3, 0x43c0, 0x2079, 0x4300, 0x68d7, 0x762d, - 0x68c7, 0x48c0, 0x68cb, 0x47c0, 0x68cf, 0x88c0, 0x68ab, 0x8b44, - 0x68af, 0x8b49, 0x68b3, 0x8b44, 0x68b7, 0x8b44, 0x68a7, 0x0001, - 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11c8, 0x2069, 0x4380, 0x0860, - 0x68d3, 0x000a, 0x68c3, 0x45c0, 0x68d7, 0x7839, 0x68c7, 0x68c0, - 0x68cb, 0x4840, 0x68cf, 0x89d0, 0x68ab, 0x8b49, 0x68af, 0x8b4e, - 0x68b3, 0x8b49, 0x68b7, 0x8b49, 0x68a7, 0x0001, 0x00e6, 0x2069, - 0x47c0, 0x2071, 0x0200, 0x70ec, 0xd0e4, 0x2019, 0x1c09, 0x2021, - 0x0009, 0x1120, 0x2019, 0x1c0c, 0x2021, 0x000c, 0x080c, 0x1cf3, - 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1188, 0x2069, 0x4840, 0x2071, - 0x0100, 0x70ec, 0xd0e4, 0x2019, 0x1c09, 0x2021, 0x0009, 0x1120, - 0x2019, 0x1c0c, 0x2021, 0x000c, 0x080c, 0x1cf3, 0x00ee, 0x2011, - 0x0002, 0x2069, 0x48c0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, - 0x0000, 0x680b, 0x0040, 0x7bc8, 0xa386, 0xfeff, 0x1128, 0x6817, - 0x0100, 0x681f, 0x0064, 0x0020, 0x6817, 0x0064, 0x681f, 0x0002, - 0xade8, 0x0010, 0x1f04, 0x1137, 0x8109, 0x1d38, 0x2001, 0x01ff, - 0x2004, 0xd0fc, 0x1128, 0x8211, 0x0118, 0x2069, 0x68c0, 0x08d8, - 0x080c, 0x2254, 0x080c, 0x3e39, 0x080c, 0x1b0f, 0x080c, 0x42a0, - 0x2091, 0x2200, 0x2079, 0x4300, 0x2071, 0x0050, 0x2091, 0x2400, - 0x2079, 0x4300, 0x2071, 0x0020, 0x2091, 0x2600, 0x2079, 0x0200, - 0x2071, 0x4340, 0x2091, 0x2800, 0x2079, 0x0100, 0x2071, 0x4380, - 0x2091, 0x2000, 0x2079, 0x4300, 0x2071, 0x0010, 0x3200, 0xa085, - 0x303d, 0x2090, 0x2071, 0x0010, 0x70c3, 0x0000, 0x1004, 0x118e, - 0x70c0, 0xa086, 0x0002, 0x1110, 0x080c, 0x13a3, 0x2039, 0x0000, - 0x080c, 0x129c, 0x78ac, 0xa005, 0x1180, 0x0e04, 0x119c, 0x786c, - 0xa065, 0x0110, 0x080c, 0x1ffe, 0x080c, 0x1da4, 0x0e04, 0x11b1, - 0x786c, 0xa065, 0x0110, 0x080c, 0x1ffe, 0x0e04, 0x11b1, 0x2009, - 0x4347, 0x2011, 0x4387, 0x2104, 0x220c, 0xa105, 0x0110, 0x080c, - 0x1c21, 0x2071, 0x4340, 0x70a4, 0xa005, 0x01e8, 0x7450, 0xa485, - 0x0000, 0x01c8, 0x2079, 0x0200, 0x2091, 0x8000, 0x72d4, 0xa28c, - 0x303d, 0x2190, 0x080c, 0x260d, 0x2091, 0x8000, 0x2091, 0x303d, - 0x0e04, 0x11d3, 0x2079, 0x4300, 0x786c, 0xa065, 0x0120, 0x2071, - 0x0010, 0x080c, 0x1ffe, 0x1d04, 0x11db, 0x2079, 0x4300, 0x2071, - 0x0010, 0x080c, 0x40ed, 0x2071, 0x4380, 0x70a4, 0xa005, 0x0188, - 0x7050, 0xa025, 0x0170, 0x2079, 0x0100, 0x2091, 0x8000, 0x72d4, - 0xa28c, 0x303d, 0x2190, 0x080c, 0x260d, 0x2091, 0x8000, 0x2091, - 0x303d, 0x2079, 0x4300, 0x2071, 0x0010, 0x0e04, 0x11fc, 0x786c, - 0xa065, 0x0110, 0x080c, 0x1ffe, 0x1d04, 0x1190, 0x080c, 0x40ed, - 0x0804, 0x1190, 0x3c00, 0xa084, 0x0007, 0x0002, 0x120e, 0x120e, - 0x1210, 0x1210, 0x1215, 0x1215, 0x121a, 0x121a, 0x080c, 0x243b, - 0x2091, 0x2400, 0x080c, 0x3e9c, 0x0005, 0x2091, 0x2200, 0x080c, - 0x3e9c, 0x0005, 0x2091, 0x2200, 0x080c, 0x3e9c, 0x2091, 0x2400, - 0x080c, 0x3e9c, 0x0005, 0x1243, 0x1243, 0x1244, 0x1244, 0x124f, - 0x124f, 0x124f, 0x124f, 0x1258, 0x1258, 0x1263, 0x1263, 0x124f, - 0x124f, 0x124f, 0x124f, 0x1272, 0x1272, 0x1272, 0x1272, 0x1272, - 0x1272, 0x1272, 0x1272, 0x1272, 0x1272, 0x1272, 0x1272, 0x1272, - 0x1272, 0x1272, 0x1272, 0x0cf8, 0x0006, 0x0106, 0x0126, 0x2091, - 0x2800, 0x080c, 0x2458, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, - 0x0106, 0x0126, 0x080c, 0x1202, 0x012e, 0x010e, 0x000e, 0x000d, - 0x0006, 0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x2458, 0x012e, - 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126, 0x2091, 0x2600, - 0x080c, 0x2458, 0x2091, 0x2800, 0x080c, 0x2458, 0x012e, 0x010e, - 0x000e, 0x000d, 0x0006, 0x0106, 0x0126, 0x00e6, 0x00f6, 0x2079, - 0x4300, 0x2071, 0x0200, 0x2069, 0x4340, 0x3d00, 0xd08c, 0x1120, - 0x2069, 0x4380, 0x2071, 0x0100, 0x080c, 0x42d8, 0x00fe, 0x00ee, - 0x012e, 0x010e, 0x000e, 0x000d, 0x7008, 0x800b, 0x1240, 0x7007, - 0x0002, 0xa08c, 0x01e0, 0x1120, 0xd09c, 0x0108, 0x0887, 0x0897, - 0x70c3, 0x4002, 0x0804, 0x13a6, 0x0e04, 0x1308, 0x2061, 0x0000, - 0x6018, 0xd084, 0x1904, 0x1308, 0x7828, 0xa005, 0x1120, 0x0004, - 0x1309, 0x0804, 0x1308, 0xd0fc, 0x0148, 0x0006, 0x080c, 0x1aa9, - 0x000e, 0x0168, 0x2001, 0x4007, 0x0804, 0x13a5, 0x0006, 0x080c, - 0x1a9b, 0x000e, 0x0120, 0x2001, 0x4007, 0x0804, 0x13a5, 0x7910, - 0xd0fc, 0x1128, 0x2061, 0x4340, 0xc19c, 0xc7fc, 0x0020, 0x2061, - 0x4380, 0xc19d, 0xc7fd, 0x6064, 0xa005, 0x15d0, 0x7912, 0x6083, - 0x0000, 0x7828, 0xc0fc, 0xa086, 0x0018, 0x1120, 0x00c6, 0x080c, - 0x18c9, 0x00ce, 0x782b, 0x0000, 0x607c, 0xa065, 0x0190, 0x00c6, - 0x609c, 0x080c, 0x1b76, 0x00ce, 0x609f, 0x0000, 0x080c, 0x19db, - 0x2009, 0x0018, 0x6087, 0x0103, 0x080c, 0x1ab7, 0x1198, 0x080c, - 0x1b02, 0x7810, 0xd09c, 0x1118, 0x2061, 0x4340, 0x0020, 0x2061, - 0x4380, 0xc09c, 0x7812, 0x607f, 0x0000, 0x60d4, 0xd0c4, 0x0130, - 0xc0c4, 0x60d6, 0x2001, 0x4005, 0x0804, 0x13a5, 0x0804, 0x13a3, - 0x0005, 0xa006, 0x70c2, 0x70c6, 0x70ca, 0x70ce, 0x70da, 0x70c0, - 0xa08a, 0x0040, 0x1a04, 0x1355, 0x0002, 0x13a3, 0x13f1, 0x13bf, - 0x1425, 0x1459, 0x1459, 0x13b7, 0x19f3, 0x1463, 0x13b1, 0x13c3, - 0x13c4, 0x13c5, 0x13c6, 0x19f7, 0x13b1, 0x1470, 0x14c5, 0x18e4, - 0x19ed, 0x13c7, 0x1795, 0x17cb, 0x17fa, 0x183d, 0x1752, 0x175f, - 0x1772, 0x1784, 0x159a, 0x13b1, 0x14f7, 0x1502, 0x1510, 0x151e, - 0x1535, 0x1543, 0x1546, 0x1554, 0x1562, 0x156c, 0x1580, 0x158c, - 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x15a7, 0x15b8, 0x15d2, 0x1606, - 0x162f, 0x1641, 0x1644, 0x1677, 0x16aa, 0x16bc, 0x1720, 0x1730, - 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x1742, 0x2100, 0xa08a, 0x0040, - 0x1a04, 0x13b1, 0x0002, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, - 0x1a19, 0x1a1f, 0x13b1, 0x13b1, 0x13b1, 0x1a23, 0x1a63, 0x13b1, - 0x13b1, 0x13b1, 0x13b1, 0x13ec, 0x1454, 0x146b, 0x14c0, 0x18df, - 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x1a67, 0x1a0b, 0x1a15, 0x13b1, - 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, - 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, - 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, - 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, 0x13b1, - 0x13b1, 0x13b1, 0x13b1, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0028, - 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0e04, 0x13a6, - 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, - 0x0005, 0x70c3, 0x4001, 0x0c90, 0x70c3, 0x4006, 0x0c78, 0x2099, - 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0c20, 0x70c4, - 0x70c3, 0x0004, 0x0807, 0x08f8, 0x08f0, 0x08e8, 0x08e0, 0x2091, - 0x8000, 0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, - 0x2020, 0x70d3, 0x000a, 0x2001, 0x0001, 0x70d6, 0x2079, 0x0000, - 0x781b, 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, - 0x2051, 0x0445, 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, - 0x2091, 0x4080, 0x0804, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, - 0x0018, 0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, - 0x20a0, 0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, - 0x721e, 0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0904, 0x13a3, - 0xa182, 0x0040, 0x1210, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, - 0x7007, 0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0de8, 0x7007, - 0x0002, 0xa084, 0x01e0, 0x0120, 0x70c3, 0x4002, 0x0804, 0x13a6, - 0x24a8, 0x53a5, 0x0c10, 0x0804, 0x13a3, 0x2029, 0x0000, 0x2520, - 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x2098, 0x20a1, 0x0030, 0x7003, - 0x0000, 0x7007, 0x0006, 0x731a, 0x721e, 0x7422, 0x7526, 0x2021, - 0x0040, 0x7007, 0x0006, 0x81ff, 0x0904, 0x13a3, 0xa182, 0x0040, - 0x1210, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x24a8, 0x53a6, - 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0de8, 0xa084, 0x01e0, 0x0d48, - 0x70c3, 0x4002, 0x0804, 0x13a6, 0x75d8, 0x74dc, 0x75da, 0x74de, - 0x0878, 0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x1108, 0x200a, - 0x72ca, 0x0804, 0x13a2, 0x70c7, 0x000a, 0x70cb, 0x0001, 0x70cf, - 0x0013, 0x0804, 0x13a3, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0018, - 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, - 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x05f0, 0xa40a, 0x0110, 0x1a04, - 0x13a5, 0x8001, 0x7872, 0xa084, 0xfc00, 0x0138, 0x78ac, 0xc085, - 0x78ae, 0x2001, 0x4005, 0x0804, 0x13a5, 0x7b7e, 0x7a7a, 0x7e86, - 0x7d82, 0x7c76, 0xa48c, 0xff00, 0x0170, 0x8407, 0x8004, 0x8004, - 0x810c, 0x810c, 0x810f, 0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, - 0xa581, 0x0000, 0x0050, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, - 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, - 0x7026, 0xa605, 0x0118, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, - 0xfffc, 0x78ae, 0x0018, 0x78ac, 0xc085, 0x78ae, 0x0804, 0x13a3, - 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0018, 0x2029, 0x0000, 0x2530, - 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, - 0xa005, 0x0500, 0xa40a, 0x0110, 0x1a04, 0x13a5, 0x8001, 0x7892, - 0xa084, 0xfc00, 0x0138, 0x78ac, 0xc0c5, 0x78ae, 0x2001, 0x4005, - 0x0804, 0x13a5, 0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x2600, 0xa505, - 0x0118, 0x7a10, 0xc2c5, 0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, - 0x78ae, 0x0018, 0x78ac, 0xc0c5, 0x78ae, 0x0804, 0x13a3, 0x2009, - 0x0000, 0x786c, 0xa065, 0x0118, 0x8108, 0x6000, 0x0cd8, 0x7ac4, - 0x0804, 0x13a1, 0x2009, 0x4348, 0x210c, 0x2001, 0x01ff, 0x2004, - 0xd0fc, 0x1904, 0x13a2, 0x2011, 0x4388, 0x2214, 0x0804, 0x13a1, - 0x2009, 0x4349, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, - 0x13a2, 0x2011, 0x4389, 0x2214, 0x0804, 0x13a1, 0x2061, 0x4340, - 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x2001, 0x01ff, 0x2004, - 0xd0fc, 0x1148, 0x2061, 0x4380, 0x6328, 0x73da, 0x632c, 0x831c, - 0x831c, 0x831c, 0x73de, 0x0804, 0x13a1, 0x2009, 0x434c, 0x210c, - 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13a2, 0x2011, 0x438c, - 0x2214, 0x0804, 0x13a1, 0x7918, 0x0804, 0x13a2, 0x2009, 0x434d, - 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13a2, 0x2011, - 0x438d, 0x2214, 0x0804, 0x13a1, 0x2009, 0x434e, 0x210c, 0x2001, - 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13a2, 0x2011, 0x438e, 0x2214, - 0x0804, 0x13a1, 0x7920, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, - 0x13a2, 0x7a24, 0x0804, 0x13a1, 0x2011, 0x4840, 0x71c4, 0xd1fc, - 0x1110, 0x2011, 0x47c0, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, - 0x8003, 0xa268, 0x6a00, 0x6b08, 0x6c1c, 0x74da, 0x0804, 0x13a0, - 0x77c4, 0x080c, 0x1b1d, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, - 0x8001, 0x2708, 0x0804, 0x13a0, 0x2061, 0x4340, 0x6118, 0x2001, - 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13a2, 0x2061, 0x4380, 0x6218, - 0x0804, 0x13a1, 0x77c4, 0x080c, 0x1b1d, 0x2091, 0x8000, 0x6908, - 0x6a18, 0x6b10, 0x77da, 0x2091, 0x8001, 0x0804, 0x13a0, 0x71c4, - 0x2110, 0xa294, 0x000f, 0xa282, 0x0010, 0x1a04, 0x139c, 0x080c, - 0x230e, 0xa384, 0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13a0, - 0x71c4, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x1a04, 0x139c, 0xd1bc, - 0x1120, 0x2011, 0x4348, 0x2204, 0x0020, 0x2011, 0x4388, 0x2204, - 0xc0bd, 0x0006, 0x2100, 0xc0bc, 0x2012, 0x080c, 0x22b4, 0x001e, - 0x0804, 0x13a2, 0x71c4, 0x2021, 0x4349, 0x2404, 0x70c6, 0x2019, - 0x0000, 0x0030, 0x71c8, 0x2021, 0x4389, 0x2404, 0x70ca, 0xc3fd, - 0x2011, 0x15fe, 0x20a9, 0x0008, 0x2204, 0xa106, 0x0138, 0x8210, - 0x1f04, 0x15e4, 0x71c4, 0x72c8, 0x0804, 0x139b, 0xa292, 0x15fe, - 0x0026, 0x2122, 0x001e, 0x080c, 0x22c6, 0x2001, 0x01ff, 0x2004, - 0xd0fc, 0x1110, 0xd3fc, 0x09f0, 0x0804, 0x13a3, 0x03e8, 0x00fa, - 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061, 0x4340, - 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, - 0x8003, 0x8003, 0x8003, 0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, - 0x11a0, 0x0026, 0x0016, 0x2061, 0x4380, 0x6128, 0x622c, 0x8214, - 0x8214, 0x8214, 0x70d8, 0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, - 0x602e, 0x71da, 0x72de, 0x001e, 0x002e, 0x0804, 0x13a1, 0x2061, - 0x4340, 0x6130, 0x70c4, 0x6032, 0x2001, 0x01ff, 0x2004, 0xd0fc, - 0x1904, 0x13a2, 0x2061, 0x4380, 0x6230, 0x70c8, 0x6032, 0x0804, - 0x13a1, 0x7918, 0x0804, 0x13a2, 0x71c4, 0xa184, 0xffcf, 0x0148, - 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x139c, 0x72c8, 0x0804, - 0x139b, 0x2011, 0x434d, 0x2204, 0x2112, 0x0006, 0x2019, 0x0000, - 0x080c, 0x2302, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118, 0x001e, - 0x0804, 0x13a2, 0x71c8, 0xa184, 0xffcf, 0x0128, 0x0006, 0x2110, - 0x71c4, 0x0804, 0x139b, 0x2011, 0x438d, 0x2204, 0x2112, 0x0006, - 0xc3fd, 0x080c, 0x2302, 0x002e, 0x001e, 0x0804, 0x13a1, 0x71c4, - 0xa182, 0x0010, 0x0248, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, - 0x139c, 0x72c8, 0x0804, 0x139b, 0x2011, 0x434e, 0x2204, 0x0006, - 0x2112, 0x2019, 0x0000, 0x080c, 0x22ef, 0x2001, 0x01ff, 0x2004, - 0xd0fc, 0x0118, 0x001e, 0x0804, 0x13a2, 0x71c8, 0xa182, 0x0010, - 0x0228, 0x0006, 0x2110, 0x71c4, 0x0804, 0x139b, 0x2011, 0x438e, - 0x2204, 0x0006, 0x2112, 0xc3fd, 0x080c, 0x22ef, 0x002e, 0x001e, - 0x0804, 0x13a1, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x1904, 0x139b, - 0xa284, 0xfffd, 0x1904, 0x139b, 0x2100, 0x7920, 0x7822, 0x2200, - 0x7a24, 0x7826, 0x0804, 0x13a1, 0x2011, 0x4840, 0x71c4, 0xd1fc, - 0x1110, 0x2011, 0x47c0, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, - 0x8003, 0xa268, 0x72c8, 0x73cc, 0x74d8, 0x71c6, 0x6800, 0x70ca, - 0x73ce, 0x74da, 0x2091, 0x8000, 0x6a02, 0xd2ac, 0x1118, 0x2021, - 0x0000, 0x0078, 0xa484, 0x00ff, 0xa082, 0x0002, 0x16e8, 0x843f, - 0xa7bc, 0x00ff, 0x0130, 0xa786, 0x0002, 0x15b0, 0xa484, 0x00ff, - 0x0598, 0x2061, 0x0200, 0xd1fc, 0x0110, 0x2061, 0x0100, 0x2029, - 0x0009, 0x2031, 0x0062, 0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, - 0xa084, 0x00ff, 0x1110, 0xa73d, 0x11f8, 0x2041, 0x001d, 0x8307, - 0xa084, 0x00ff, 0x0150, 0xa842, 0x02b8, 0xa3bc, 0x00ff, 0x2500, - 0xa702, 0x0290, 0x2600, 0xa702, 0x1278, 0x2039, 0x003a, 0x6804, - 0xa705, 0x6806, 0x6b0a, 0x6b0c, 0x73ce, 0x681c, 0x70da, 0x6c1e, - 0x2091, 0x8001, 0x0804, 0x13a3, 0x2091, 0x8001, 0x0804, 0x139d, - 0x77c4, 0x080c, 0x1b1d, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, - 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0804, 0x13a0, - 0x70c4, 0x2061, 0x4340, 0x6118, 0x601a, 0x2001, 0x01ff, 0x2004, - 0xd0fc, 0x1904, 0x13a2, 0x70c8, 0x2061, 0x4380, 0x6218, 0x601a, - 0x0804, 0x13a1, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x1a04, - 0x139c, 0x080c, 0x2332, 0xa384, 0x4000, 0x0110, 0xa295, 0x0020, - 0x0804, 0x13a0, 0x77c4, 0x080c, 0x1b1d, 0x2091, 0x8000, 0x6a08, - 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0804, 0x13a1, 0x77c4, - 0x080c, 0x1b1d, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, - 0x6804, 0xa005, 0x0110, 0x080c, 0x2233, 0x2091, 0x8001, 0x2708, - 0x0804, 0x13a1, 0x77c4, 0x080c, 0x1b1d, 0x2091, 0x8000, 0x6a08, - 0xc295, 0x6a0a, 0x6804, 0xa005, 0x0110, 0x080c, 0x2233, 0x2091, - 0x8001, 0x2708, 0x0804, 0x13a1, 0x77c4, 0x2041, 0x0001, 0x2049, - 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1b35, 0x2091, - 0x8001, 0x2708, 0x6a08, 0x0804, 0x13a1, 0x77c4, 0xd7fc, 0x0128, - 0x080c, 0x1aa9, 0x0138, 0x0804, 0x13a5, 0x080c, 0x1a9b, 0x0110, - 0x0804, 0x13a5, 0x73c8, 0x72cc, 0x77c6, 0x73ca, 0x72ce, 0x080c, - 0x1bad, 0x11e8, 0x6818, 0xa005, 0x01a0, 0x2708, 0x0076, 0x080c, - 0x2351, 0x007e, 0x1170, 0x2001, 0x0015, 0xd7fc, 0x1118, 0x2061, - 0x4340, 0x0018, 0xc0fd, 0x2061, 0x4380, 0x782a, 0x2091, 0x8001, - 0x0005, 0x2091, 0x8001, 0x2001, 0x4005, 0x0804, 0x13a5, 0x2091, - 0x8001, 0x0804, 0x13a3, 0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1aa9, - 0x0138, 0x0804, 0x13a5, 0x080c, 0x1a9b, 0x0110, 0x0804, 0x13a5, - 0x77c6, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, - 0x8000, 0x080c, 0x1b35, 0x2009, 0x0016, 0xd7fc, 0x1118, 0x2061, - 0x4340, 0x0018, 0x2061, 0x4380, 0xc1fd, 0x6067, 0x0003, 0x607f, - 0x0000, 0x6776, 0x6083, 0x000f, 0x792a, 0x080c, 0x2233, 0x2091, + 0x2009, 0x0002, 0x2069, 0x4640, 0x681b, 0x0003, 0x6823, 0x0007, + 0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028, 0x6837, 0x0006, + 0x6833, 0x0008, 0x683b, 0x0000, 0x8109, 0x0500, 0x68cf, 0x000a, + 0x68bf, 0x46c0, 0x2079, 0x4600, 0x68d3, 0x762d, 0x68c3, 0x4bc0, + 0x68c7, 0x4ac0, 0x68cb, 0x8bc0, 0x68a7, 0x8e44, 0x68ab, 0x8e49, + 0x68af, 0x8e44, 0x68b3, 0x8e44, 0x68a3, 0x0001, 0x2001, 0x01ff, + 0x2004, 0xd0fc, 0x11c8, 0x2069, 0x4680, 0x0870, 0x68cf, 0x000a, + 0x68bf, 0x48c0, 0x68d3, 0x7839, 0x68c3, 0x6bc0, 0x68c7, 0x4b40, + 0x68cb, 0x8cd0, 0x68a7, 0x8e49, 0x68ab, 0x8e4e, 0x68af, 0x8e49, + 0x68b3, 0x8e49, 0x68a3, 0x0001, 0x00e6, 0x2069, 0x4ac0, 0x2071, + 0x0200, 0x70ec, 0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120, + 0x2019, 0x180c, 0x2021, 0x000c, 0x080c, 0x1d58, 0x2001, 0x01ff, + 0x2004, 0xd0fc, 0x1188, 0x2069, 0x4b40, 0x2071, 0x0100, 0x70ec, + 0xd0e4, 0x2019, 0x1809, 0x2021, 0x0009, 0x1120, 0x2019, 0x180c, + 0x2021, 0x000c, 0x080c, 0x1d58, 0x00ee, 0x2011, 0x0002, 0x2069, + 0x4bc0, 0x2009, 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, + 0x0040, 0x7bc8, 0xa386, 0xfeff, 0x1128, 0x6817, 0x0100, 0x681f, + 0x0064, 0x0020, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, + 0x1f04, 0x1135, 0x8109, 0x1d38, 0x2001, 0x01ff, 0x2004, 0xd0fc, + 0x1128, 0x8211, 0x0118, 0x2069, 0x6bc0, 0x08d8, 0x080c, 0x22cf, + 0x080c, 0x4015, 0x080c, 0x1b6d, 0x080c, 0x4553, 0x2091, 0x2200, + 0x2079, 0x4600, 0x2071, 0x0050, 0x2091, 0x2400, 0x2079, 0x4600, + 0x2071, 0x0020, 0x2091, 0x2600, 0x2079, 0x0200, 0x2071, 0x4640, + 0x2091, 0x2800, 0x2079, 0x0100, 0x2071, 0x4680, 0x2091, 0x2000, + 0x2079, 0x4600, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090, + 0x2071, 0x0010, 0x70c3, 0x0000, 0x1004, 0x118c, 0x70c0, 0xa086, + 0x0002, 0x1110, 0x080c, 0x13ba, 0x2039, 0x0000, 0x080c, 0x12ab, + 0x78ac, 0xa005, 0x1180, 0x0e04, 0x119a, 0x786c, 0xa065, 0x0110, + 0x080c, 0x207a, 0x080c, 0x1e09, 0x0e04, 0x11af, 0x786c, 0xa065, + 0x0110, 0x080c, 0x207a, 0x0e04, 0x11af, 0x2009, 0x4647, 0x2011, + 0x4687, 0x2104, 0x220c, 0xa105, 0x0110, 0x080c, 0x1c7c, 0x2071, + 0x4640, 0x70a0, 0xa005, 0x01e8, 0x744c, 0xa485, 0x0000, 0x01c8, + 0x2079, 0x0200, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d, 0x2190, + 0x080c, 0x2720, 0x2091, 0x8000, 0x2091, 0x303d, 0x0e04, 0x11d1, + 0x2079, 0x4600, 0x786c, 0xa065, 0x0120, 0x2071, 0x0010, 0x080c, + 0x207a, 0x1d04, 0x11d9, 0x2079, 0x4600, 0x2071, 0x0010, 0x080c, + 0x4370, 0x2071, 0x4680, 0x70a0, 0xa005, 0x0188, 0x704c, 0xa025, + 0x0170, 0x2079, 0x0100, 0x2091, 0x8000, 0x72d0, 0xa28c, 0x303d, + 0x2190, 0x080c, 0x2720, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079, + 0x4600, 0x2071, 0x0010, 0x0e04, 0x11fa, 0x786c, 0xa065, 0x0110, + 0x080c, 0x207a, 0x1d04, 0x118e, 0x080c, 0x4370, 0x0804, 0x118e, + 0x3c00, 0xa084, 0x0007, 0x0002, 0x120c, 0x120c, 0x120e, 0x120e, + 0x1213, 0x1213, 0x1218, 0x1218, 0x080c, 0x254c, 0x2091, 0x2400, + 0x080c, 0x40ad, 0x0005, 0x2091, 0x2200, 0x080c, 0x40ad, 0x0005, + 0x2091, 0x2200, 0x080c, 0x40ad, 0x2091, 0x2400, 0x080c, 0x40ad, + 0x0005, 0x1241, 0x1241, 0x1242, 0x1242, 0x124d, 0x124d, 0x124d, + 0x124d, 0x1256, 0x1256, 0x1261, 0x1261, 0x124d, 0x124d, 0x124d, + 0x124d, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, + 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, 0x1270, + 0x1270, 0x0cf8, 0x0006, 0x0106, 0x0126, 0x2091, 0x2800, 0x080c, + 0x2569, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, 0x0126, + 0x080c, 0x1200, 0x012e, 0x010e, 0x000e, 0x000d, 0x0006, 0x0106, + 0x0126, 0x2091, 0x2600, 0x080c, 0x2569, 0x012e, 0x010e, 0x000e, + 0x000d, 0x0006, 0x0106, 0x0126, 0x2091, 0x2600, 0x080c, 0x2569, + 0x2091, 0x2800, 0x080c, 0x2569, 0x012e, 0x010e, 0x000e, 0x000d, + 0x0006, 0x0106, 0x0126, 0x00d6, 0x00e6, 0x00f6, 0x2079, 0x4600, + 0x2071, 0x0200, 0x2069, 0x4640, 0x3d00, 0xd08c, 0x0130, 0x70ec, + 0xa084, 0x1c00, 0x78e2, 0x080c, 0x459a, 0x3d00, 0xd084, 0x0150, + 0x2069, 0x4680, 0x2071, 0x0100, 0x70ec, 0xa084, 0x1c00, 0x78e6, + 0x080c, 0x459a, 0x080c, 0x24fd, 0x00fe, 0x00ee, 0x00de, 0x012e, + 0x010e, 0x000e, 0x000d, 0x7008, 0x800b, 0x1240, 0x7007, 0x0002, + 0xa08c, 0x01e0, 0x1120, 0xd09c, 0x0108, 0x0887, 0x0897, 0x70c3, + 0x4002, 0x0804, 0x13bd, 0x0e04, 0x131e, 0x2061, 0x0000, 0x6018, + 0xd084, 0x1904, 0x131e, 0x7828, 0xa005, 0x1120, 0x0004, 0x131f, + 0x0804, 0x131e, 0xd0fc, 0x0130, 0x0006, 0x080c, 0x1b0a, 0x000e, + 0x0150, 0x0028, 0x0006, 0x080c, 0x1aff, 0x000e, 0x0120, 0x2001, + 0x4007, 0x0804, 0x13bc, 0x7910, 0xd0fc, 0x1128, 0x2061, 0x4640, + 0xc19c, 0xc7fc, 0x0020, 0x2061, 0x4680, 0xc19d, 0xc7fd, 0x6060, + 0xa005, 0x1904, 0x131e, 0x7912, 0x607e, 0x7828, 0xc0fc, 0xa086, + 0x0018, 0x1120, 0x00c6, 0x080c, 0x1916, 0x00ce, 0x782b, 0x0000, + 0x6078, 0xa065, 0x01e0, 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, + 0x609f, 0x0000, 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, 0x0103, + 0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812, + 0x080c, 0x1b15, 0x000e, 0x7812, 0x1198, 0x080c, 0x1b60, 0x7810, + 0xd09c, 0x1118, 0x2061, 0x4640, 0x0020, 0x2061, 0x4680, 0xc09c, + 0x7812, 0x607b, 0x0000, 0x60d0, 0xd0c4, 0x0130, 0xc0c4, 0x60d2, + 0x2001, 0x4005, 0x0804, 0x13bc, 0x0804, 0x13ba, 0x0005, 0xa006, + 0x70c2, 0x70c6, 0x70ca, 0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a, + 0x0040, 0x1a04, 0x136c, 0x0002, 0x13ba, 0x1408, 0x13d6, 0x143c, + 0x1470, 0x1470, 0x13ce, 0x1a59, 0x147a, 0x13c8, 0x13da, 0x13db, + 0x13dc, 0x13dd, 0x1a5d, 0x13c8, 0x1487, 0x14db, 0x1931, 0x1a53, + 0x13de, 0x17ba, 0x17f0, 0x1822, 0x1868, 0x1777, 0x1784, 0x1797, + 0x17a9, 0x15b0, 0x13c8, 0x150d, 0x1518, 0x1526, 0x1534, 0x154b, + 0x1559, 0x155c, 0x156a, 0x1578, 0x1582, 0x1596, 0x15a2, 0x13c8, + 0x13c8, 0x13c8, 0x13c8, 0x15bd, 0x15ce, 0x15e8, 0x161c, 0x1645, + 0x1657, 0x165a, 0x1685, 0x16be, 0x16d0, 0x1745, 0x1755, 0x13c8, + 0x13c8, 0x13c8, 0x13c8, 0x1767, 0x2100, 0xa08a, 0x0040, 0x1a04, + 0x13c8, 0x0002, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x1a7f, + 0x1a85, 0x13c8, 0x13c8, 0x13c8, 0x1a89, 0x1ac9, 0x13c8, 0x13c8, + 0x13c8, 0x13c8, 0x1403, 0x146b, 0x1482, 0x14d6, 0x192c, 0x13c8, + 0x13c8, 0x18fb, 0x13c8, 0x1acd, 0x1a71, 0x1a7b, 0x13c8, 0x13c8, + 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, + 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, + 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, + 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, 0x13c8, + 0x13c8, 0x13c8, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0028, 0x73ce, + 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0e04, 0x13bd, 0x2061, + 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x0005, + 0x70c3, 0x4001, 0x0c90, 0x70c3, 0x4006, 0x0c78, 0x2099, 0x0041, + 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0c20, 0x70c4, 0x70c3, + 0x0004, 0x0807, 0x08f8, 0x08f0, 0x08e8, 0x08e0, 0x2091, 0x8000, + 0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, + 0x70d3, 0x000a, 0x2001, 0x0004, 0x70d6, 0x2079, 0x0000, 0x781b, + 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051, + 0x0445, 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091, + 0x4080, 0x0804, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0018, + 0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, + 0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e, + 0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0904, 0x13ba, 0xa182, + 0x0040, 0x1210, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x7007, + 0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002, + 0xa084, 0x01e0, 0x0120, 0x70c3, 0x4002, 0x0804, 0x13bd, 0x24a8, + 0x53a5, 0x0c10, 0x0804, 0x13ba, 0x2029, 0x0000, 0x2520, 0x71d0, + 0x72c8, 0x73cc, 0x70c4, 0x2098, 0x20a1, 0x0030, 0x7003, 0x0000, + 0x7007, 0x0006, 0x731a, 0x721e, 0x7422, 0x7526, 0x2021, 0x0040, + 0x7007, 0x0006, 0x81ff, 0x0904, 0x13ba, 0xa182, 0x0040, 0x1210, + 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007, + 0x0001, 0x7008, 0xd0fc, 0x0de8, 0xa084, 0x01e0, 0x0d48, 0x70c3, + 0x4002, 0x0804, 0x13bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0878, + 0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x1108, 0x200a, 0x72ca, + 0x0804, 0x13b9, 0x70c7, 0x000a, 0x70cb, 0x0004, 0x70cf, 0x0020, + 0x0804, 0x13ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0018, 0x2029, + 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, + 0x73ce, 0x74d2, 0xa005, 0x05e8, 0xa40a, 0x0108, 0x1240, 0x8001, + 0x7872, 0xa084, 0xfc00, 0x0138, 0x78ac, 0xc085, 0x78ae, 0x2001, + 0x4005, 0x0804, 0x13bc, 0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76, + 0xa48c, 0xff00, 0x0170, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, + 0x810f, 0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, + 0x0050, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1, + 0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605, + 0x0118, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc, 0x78ae, + 0x0018, 0x78ac, 0xc085, 0x78ae, 0x0804, 0x13ba, 0x75d8, 0x76dc, + 0x75da, 0x76de, 0x0018, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, + 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0500, + 0xa40a, 0x0110, 0x1a04, 0x13bc, 0x8001, 0x7892, 0xa084, 0xfc00, + 0x0138, 0x78ac, 0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0804, 0x13bc, + 0x7a9a, 0x7b9e, 0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0118, 0x7a10, + 0xc2c5, 0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0018, + 0x78ac, 0xc0c5, 0x78ae, 0x0804, 0x13ba, 0x2009, 0x0000, 0x786c, + 0xa065, 0x0118, 0x8108, 0x6000, 0x0cd8, 0x7ac4, 0x0804, 0x13b8, + 0x2009, 0x4648, 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, + 0x13b9, 0x2011, 0x4688, 0x2214, 0x0804, 0x13b8, 0x2009, 0x4649, + 0x210c, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, + 0x4689, 0x2214, 0x0804, 0x13b8, 0x2061, 0x4640, 0x6128, 0x622c, + 0x8214, 0x8214, 0x8214, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1148, + 0x2061, 0x4680, 0x6328, 0x73da, 0x632c, 0x831c, 0x831c, 0x831c, + 0x73de, 0x0804, 0x13b8, 0x2009, 0x464c, 0x210c, 0x2001, 0x01ff, + 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x468c, 0x2214, 0x0804, + 0x13b8, 0x7918, 0x0804, 0x13b9, 0x2009, 0x0202, 0x210c, 0x2001, + 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x0102, 0x2214, + 0x0804, 0x13b8, 0x2009, 0x464d, 0x210c, 0x2001, 0x01ff, 0x2004, + 0xd0fc, 0x1904, 0x13b9, 0x2011, 0x468d, 0x2214, 0x0804, 0x13b8, + 0x7920, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, 0x7a24, + 0x0804, 0x13b8, 0x2011, 0x4b40, 0x71c4, 0xd1fc, 0x1110, 0x2011, + 0x4ac0, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, + 0x6a00, 0x6b08, 0x6c1c, 0x74da, 0x0804, 0x13b7, 0x77c4, 0x080c, + 0x1b7b, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, + 0x0804, 0x13b7, 0x2061, 0x4640, 0x6118, 0x2001, 0x01ff, 0x2004, + 0xd0fc, 0x1904, 0x13b9, 0x2061, 0x4680, 0x6218, 0x0804, 0x13b8, + 0x77c4, 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, + 0x77da, 0x2091, 0x8001, 0x0804, 0x13b7, 0x71c4, 0x2110, 0xa294, + 0x000f, 0xa282, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x238b, 0xa384, + 0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x71c4, 0x2100, + 0xc0bc, 0xa082, 0x0010, 0x1a04, 0x13b3, 0xd1bc, 0x1120, 0x2011, + 0x4648, 0x2204, 0x0020, 0x2011, 0x4688, 0x2204, 0xc0bd, 0x0006, + 0x2100, 0xc0bc, 0x2012, 0x080c, 0x2331, 0x001e, 0x0804, 0x13b9, + 0x71c4, 0x2021, 0x4649, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0030, + 0x71c8, 0x2021, 0x4689, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1614, + 0x20a9, 0x0008, 0x2204, 0xa106, 0x0138, 0x8210, 0x1f04, 0x15fa, + 0x71c4, 0x72c8, 0x0804, 0x13b2, 0xa292, 0x1614, 0x0026, 0x2122, + 0x001e, 0x080c, 0x2343, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1110, + 0xd3fc, 0x09f0, 0x0804, 0x13ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee, + 0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4640, 0x6128, 0x622c, + 0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003, + 0x8003, 0x602e, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x11a0, 0x0026, + 0x0016, 0x2061, 0x4680, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, + 0x70d8, 0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, + 0x72de, 0x001e, 0x002e, 0x0804, 0x13b8, 0x2061, 0x4640, 0x6130, + 0x70c4, 0x6032, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, + 0x2061, 0x4680, 0x6230, 0x70c8, 0x6032, 0x0804, 0x13b8, 0x7918, + 0x0804, 0x13b9, 0x71c4, 0xa184, 0xf0cf, 0x0148, 0x2001, 0x01ff, + 0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8, 0x0804, 0x13b2, 0x0006, + 0x2019, 0x0000, 0x080c, 0x237f, 0x2001, 0x01ff, 0x2004, 0xd0fc, + 0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa184, 0xf0cf, 0x0128, + 0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x0006, 0xc3fd, 0x080c, + 0x237f, 0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0xa182, 0x0010, + 0x0248, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b3, 0x72c8, + 0x0804, 0x13b2, 0x2011, 0x464d, 0x2204, 0x0006, 0x8104, 0x1208, + 0x8108, 0x2112, 0x2019, 0x0000, 0x080c, 0x236c, 0x2001, 0x01ff, + 0x2004, 0xd0fc, 0x0118, 0x001e, 0x0804, 0x13b9, 0x71c8, 0xa182, + 0x0010, 0x0228, 0x0006, 0x2110, 0x71c4, 0x0804, 0x13b2, 0x2011, + 0x468d, 0x2204, 0x0006, 0x8104, 0x1208, 0x8108, 0x2112, 0xc3fd, + 0x080c, 0x236c, 0x002e, 0x001e, 0x0804, 0x13b8, 0x71c4, 0x72c8, + 0xa184, 0xfffd, 0x1904, 0x13b2, 0xa284, 0xfffd, 0x1904, 0x13b2, + 0x2100, 0x7920, 0x7822, 0x2200, 0x7a24, 0x7826, 0x0804, 0x13b8, + 0x2011, 0x4b40, 0x71c4, 0xd1fc, 0x1110, 0x2011, 0x4ac0, 0x8107, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, 0x72c8, 0x73cc, + 0x74d8, 0x71c6, 0x6800, 0x70ca, 0x73ce, 0x74da, 0x2091, 0x8000, + 0x6a02, 0xd2ac, 0x1118, 0x2021, 0x0000, 0x0090, 0xa484, 0x00ff, + 0xa082, 0x0002, 0x1a04, 0x1741, 0x843f, 0xa7bc, 0x00ff, 0x0140, + 0xa786, 0x0002, 0x1904, 0x1741, 0xa484, 0x00ff, 0x0904, 0x1741, + 0x2061, 0x0200, 0xd1fc, 0x0110, 0x2061, 0x0100, 0x2029, 0x0009, + 0x2031, 0x0062, 0x843f, 0xa7bc, 0x00ff, 0x0130, 0x8307, 0xa084, + 0x00ff, 0x1110, 0xa73d, 0x1138, 0x2041, 0x0019, 0xa384, 0x00ff, + 0xa082, 0x001a, 0x0210, 0xa4a4, 0x00ff, 0x8307, 0xa084, 0x00ff, + 0x0188, 0xa842, 0x02f0, 0xa086, 0x0010, 0x1120, 0xa39c, 0x00ff, + 0xa39d, 0x0f00, 0xa3bc, 0x00ff, 0x2500, 0xa702, 0x0290, 0x2600, + 0xa702, 0x1278, 0x2039, 0x003a, 0x6804, 0xa705, 0x6806, 0x6b0a, + 0x6b0c, 0x73ce, 0x681c, 0x70da, 0x6c1e, 0x2091, 0x8001, 0x0804, + 0x13ba, 0x2091, 0x8001, 0x0804, 0x13b4, 0x77c4, 0x080c, 0x1b7b, + 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, + 0x70cc, 0x681e, 0x2708, 0x0804, 0x13b7, 0x70c4, 0x2061, 0x4640, + 0x6118, 0x601a, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x13b9, + 0x70c8, 0x2061, 0x4680, 0x6218, 0x601a, 0x0804, 0x13b8, 0x71c4, + 0x72c8, 0x73cc, 0xa182, 0x0010, 0x1a04, 0x13b3, 0x080c, 0x23af, + 0xa384, 0x4000, 0x0110, 0xa295, 0x0020, 0x0804, 0x13b7, 0x77c4, + 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6a08, 0xc28d, 0x6a0a, 0x2091, + 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4, 0x080c, 0x1b7b, 0x2091, + 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, 0x0110, + 0x080c, 0x22ae, 0x2091, 0x8001, 0x2708, 0x0804, 0x13b8, 0x77c4, + 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, + 0xa005, 0x0110, 0x080c, 0x22ae, 0x2091, 0x8001, 0x2708, 0x0804, + 0x13b8, 0x77c4, 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, + 0x2091, 0x8000, 0x080c, 0x1b93, 0x2091, 0x8001, 0x2708, 0x6a08, + 0x0804, 0x13b8, 0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b0a, 0x0138, + 0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x73c8, + 0x72cc, 0x77c6, 0x73ca, 0x72ce, 0x080c, 0x1c0b, 0x11e8, 0x6818, + 0xa005, 0x01a0, 0x2708, 0x0076, 0x080c, 0x23ce, 0x007e, 0x1170, + 0x2001, 0x0015, 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0xc0fd, + 0x2061, 0x4680, 0x782a, 0x2091, 0x8001, 0x0005, 0x2091, 0x8001, + 0x2001, 0x4005, 0x0804, 0x13bc, 0x2091, 0x8001, 0x0804, 0x13ba, + 0x77c4, 0xd7fc, 0x0128, 0x080c, 0x1b0a, 0x0138, 0x0804, 0x13bc, + 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x77c6, 0x2041, 0x0021, + 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x080c, 0x1b93, + 0x2009, 0x0016, 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, + 0x4680, 0xc1fd, 0x6063, 0x0003, 0x607b, 0x0000, 0x6772, 0x607f, + 0x000f, 0x792a, 0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22ae, 0x2091, 0x8001, 0x0005, 0x77c8, 0x77ca, 0x77c4, 0x77c6, 0xd7fc, 0x0128, - 0x080c, 0x1aa9, 0x0138, 0x0804, 0x13a5, 0x080c, 0x1a9b, 0x0110, - 0x0804, 0x13a5, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2009, 0x0017, - 0xd7fc, 0x1118, 0x2061, 0x4340, 0x0018, 0x2061, 0x4380, 0xc1fd, - 0x607f, 0x0000, 0x6067, 0x0002, 0x6776, 0x6083, 0x000f, 0x792a, - 0x080c, 0x2233, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0005, - 0x2051, 0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0118, 0x60d4, - 0xc0fd, 0x60d6, 0x080c, 0x1b35, 0x70c8, 0x6836, 0x8738, 0xa784, - 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005, 0x72c8, 0xd284, 0x0128, - 0x080c, 0x1aa9, 0x0138, 0x0804, 0x13a5, 0x080c, 0x1a9b, 0x0110, - 0x0804, 0x13a5, 0x72c8, 0x72ca, 0x78ac, 0xa084, 0x0003, 0x1508, - 0x2039, 0x0000, 0xd284, 0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, - 0x0004, 0x2051, 0x0008, 0x080c, 0x1b1d, 0x2091, 0x8000, 0x6808, - 0xc0d4, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x001f, - 0x1d90, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, - 0x1d50, 0x2091, 0x8000, 0x72c8, 0x2069, 0x0100, 0xd284, 0x1110, - 0x2069, 0x0200, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, - 0x01b0, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, - 0x1f04, 0x1885, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, - 0x0110, 0x1f04, 0x188e, 0x20a9, 0x00fa, 0x1f04, 0x1895, 0x2079, - 0x4300, 0x2009, 0x0018, 0x72c8, 0xd284, 0x1118, 0x2061, 0x4340, - 0x0018, 0x2061, 0x4380, 0xc1fd, 0x792a, 0x6067, 0x0001, 0x6083, - 0x000f, 0x60a7, 0x0000, 0x60a8, 0x60b2, 0x60b6, 0x60d4, 0xd0b4, - 0x0160, 0xc0b4, 0x60d6, 0x00c6, 0x60b8, 0xa065, 0x6008, 0xc0d4, - 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x60d4, 0xa084, 0x7eff, - 0x60d6, 0x78ac, 0xc08d, 0x78ae, 0x681b, 0x0054, 0x2091, 0x8001, - 0x0005, 0xd7fc, 0x1118, 0x2069, 0x4340, 0x0010, 0x2069, 0x4380, - 0x71c4, 0x71c6, 0x6916, 0x81ff, 0x1110, 0x68a7, 0x0001, 0x78ac, - 0xc08c, 0x78ae, 0xd084, 0x1110, 0x080c, 0x1c00, 0x0005, 0x75d8, - 0x74dc, 0x75da, 0x74de, 0x0018, 0x2029, 0x0000, 0x2520, 0x71c4, - 0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x4300, 0x7dde, - 0x7cda, 0x7bd6, 0x7ad2, 0x080c, 0x1afa, 0x0904, 0x19d7, 0x20a9, - 0x0005, 0x20a1, 0x4314, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, - 0x2009, 0x0040, 0x080c, 0x1cbf, 0x0120, 0x080c, 0x1b02, 0x0804, - 0x19d7, 0x6004, 0xa08c, 0x00ff, 0xa18e, 0x0009, 0x1120, 0x0006, - 0x080c, 0x1fe3, 0x000e, 0xa084, 0xff00, 0x8007, 0x8009, 0x0904, - 0x1981, 0x00c6, 0x2c68, 0x080c, 0x1afa, 0x05a8, 0x2c00, 0x689e, - 0x8109, 0x1dc0, 0x609f, 0x0000, 0x00ce, 0x00c6, 0x7ddc, 0x7cd8, - 0x7bd4, 0x7ad0, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, - 0xa5a9, 0x0000, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x2c68, 0x689c, - 0xa065, 0x0904, 0x1980, 0x2009, 0x0040, 0x080c, 0x1cbf, 0x1550, - 0x6004, 0xa084, 0x00ff, 0xa086, 0x0002, 0x1168, 0x6004, 0xa084, - 0x00ff, 0xa086, 0x000a, 0x1120, 0x0016, 0x080c, 0x1fe0, 0x001e, - 0x2d00, 0x6002, 0x0898, 0x00ce, 0x00c6, 0x609c, 0x080c, 0x1b76, - 0x00ce, 0x609f, 0x0000, 0x080c, 0x19db, 0x2009, 0x0018, 0x6008, - 0xc0cd, 0x600a, 0x6004, 0x6086, 0x080c, 0x1ab7, 0x080c, 0x1b02, - 0x0804, 0x19d7, 0x00ce, 0x00c6, 0x609c, 0x080c, 0x1b76, 0x00ce, - 0x609f, 0x0000, 0x080c, 0x19db, 0x2009, 0x0018, 0x6087, 0x0103, - 0x601b, 0x0003, 0x080c, 0x1ab7, 0x080c, 0x1b02, 0x0804, 0x19d7, - 0x00ce, 0x6114, 0xd1fc, 0x0120, 0x080c, 0x1aa9, 0x01b8, 0x0018, - 0x080c, 0x1a9b, 0x0198, 0x2029, 0x0000, 0x2520, 0x2009, 0x0018, - 0x73c8, 0x72cc, 0x6087, 0x0103, 0x601b, 0x0021, 0x080c, 0x1ab7, - 0x080c, 0x1b02, 0x2001, 0x4007, 0x0804, 0x13a5, 0x74c4, 0x73c8, - 0x72cc, 0x6014, 0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc, - 0x1118, 0x2071, 0x4340, 0x0018, 0x2071, 0x4380, 0xc1fd, 0x792a, - 0x7067, 0x0005, 0x71d4, 0xa18c, 0xfe7f, 0x71d6, 0x736a, 0x726e, - 0x7472, 0x7076, 0x707b, 0x0000, 0x2c00, 0x707e, 0xa02e, 0x2530, - 0x611c, 0xa184, 0x0060, 0x0110, 0x080c, 0x3de5, 0x00ee, 0x6596, - 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, - 0x6023, 0x0000, 0x080c, 0x2233, 0x2091, 0x8001, 0x0005, 0x70c3, - 0x4005, 0x0804, 0x13a6, 0x20a9, 0x0005, 0x2099, 0x4314, 0x2091, - 0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, - 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, - 0x791e, 0x0804, 0x13a3, 0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, - 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, - 0xa285, 0x0000, 0x1118, 0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, - 0x70ca, 0x0804, 0x13a6, 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, - 0x1a04, 0x139c, 0x7966, 0x0804, 0x13a3, 0x7964, 0x71c6, 0x0804, - 0x13a3, 0x7900, 0x71c6, 0x71c4, 0x7902, 0x0804, 0x13a3, 0x7900, - 0x71c6, 0x0804, 0x13a3, 0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, - 0x0160, 0x810c, 0x0230, 0x8210, 0x810c, 0x810c, 0x0210, 0x8210, - 0x810c, 0x81ff, 0x1904, 0x139d, 0x8210, 0x7a0e, 0xd28c, 0x0538, - 0x7910, 0xc1cd, 0x7912, 0x2009, 0x0021, 0x2019, 0x0003, 0xd284, - 0x01c0, 0x8108, 0x2019, 0x0041, 0x2011, 0x8b4e, 0x2312, 0x2019, - 0x0042, 0x8210, 0x2312, 0x2019, 0x0043, 0x8210, 0x2312, 0x2019, - 0x0046, 0x8210, 0x2312, 0x2019, 0x0047, 0x8210, 0x2312, 0x2019, - 0x0006, 0x2011, 0x8b53, 0x2112, 0x2011, 0x8b73, 0x2312, 0x7904, - 0x7806, 0x0804, 0x13a2, 0x7804, 0x70c6, 0x0804, 0x13a3, 0x71c4, - 0xd1fc, 0x1118, 0x2011, 0x47c0, 0x0010, 0x2011, 0x4840, 0x8107, - 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, 0x2011, 0x0000, - 0x6814, 0xd0fc, 0x0110, 0xa295, 0x0200, 0xd0b4, 0x0110, 0xa295, - 0x0001, 0x6b0c, 0x0804, 0x13a0, 0x0016, 0x7814, 0xd0f4, 0x0138, - 0x2001, 0x4007, 0x70db, 0x0000, 0xa18d, 0x0001, 0x0050, 0xd0fc, - 0x0138, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0008, - 0xa006, 0x001e, 0x0005, 0x0016, 0x7814, 0xd0f4, 0x0138, 0x2001, - 0x4007, 0x70db, 0x0000, 0xa18d, 0x0001, 0x0008, 0xa006, 0x001e, - 0x0005, 0x0016, 0x7814, 0xd0fc, 0x0138, 0x2001, 0x4007, 0x70db, - 0x0001, 0xa18d, 0x0001, 0x0008, 0xa006, 0x001e, 0x0005, 0x7112, - 0x721a, 0x731e, 0x7810, 0xd0c4, 0x0110, 0x7422, 0x7526, 0xac80, - 0x0001, 0x8108, 0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, - 0x0000, 0x6084, 0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, - 0xff00, 0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, - 0xa100, 0x0018, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, - 0xa006, 0xa211, 0x7d10, 0xd5c4, 0x0120, 0x7b84, 0xa319, 0x7c80, - 0xa421, 0x7008, 0xd0fc, 0x0de8, 0x7003, 0x0001, 0x7007, 0x0006, - 0x711a, 0x721e, 0x7d10, 0xd5c4, 0x0110, 0x7322, 0x7426, 0xa084, - 0x01e0, 0x0005, 0x7848, 0xa065, 0x0120, 0x2c04, 0x784a, 0x2063, - 0x0000, 0x0005, 0x00f6, 0x2079, 0x4300, 0x7848, 0x2062, 0x2c00, - 0xa005, 0x1110, 0x080c, 0x243b, 0x784a, 0x00fe, 0x0005, 0x2011, - 0x8d00, 0x7a4a, 0x7bc4, 0x8319, 0x0128, 0xa280, 0x0032, 0x2012, - 0x2010, 0x0cc8, 0x2013, 0x0000, 0x0005, 0x0016, 0x0026, 0xd7fc, - 0x1118, 0x2011, 0x48c0, 0x0010, 0x2011, 0x68c0, 0xa784, 0x0f00, - 0x800b, 0xa784, 0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, - 0xa105, 0xa268, 0x002e, 0x001e, 0x0005, 0x0c39, 0x2900, 0x682a, - 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef, 0xa80d, 0x690a, 0x00e6, - 0xd7fc, 0x1128, 0x2009, 0x4353, 0x2071, 0x4340, 0x0020, 0x2009, - 0x4393, 0x2071, 0x4380, 0x210c, 0x6804, 0xa005, 0x0148, 0xa116, - 0x1138, 0x2060, 0x6000, 0x6806, 0x0016, 0x200b, 0x0000, 0x0018, - 0x2009, 0x0000, 0x0016, 0x6804, 0xa065, 0x0178, 0x6000, 0x6806, - 0x0421, 0x080c, 0x1d30, 0x6810, 0x7908, 0x8109, 0x790a, 0x8001, - 0x6812, 0x1d88, 0x7910, 0xc1a5, 0x7912, 0x001e, 0x6902, 0x6906, - 0x2d00, 0x2060, 0x080c, 0x2580, 0x00ee, 0x0005, 0xa065, 0x0160, - 0x2008, 0x609c, 0xa005, 0x0128, 0x2062, 0x609f, 0x0000, 0xa065, - 0x0cc0, 0x7848, 0x794a, 0x2062, 0x0005, 0x6007, 0x0103, 0x608f, - 0x0000, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, - 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, - 0x1128, 0x2071, 0x4340, 0x2031, 0x43c0, 0x0020, 0x2071, 0x4380, - 0x2031, 0x45c0, 0x7050, 0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, - 0x8000, 0x7052, 0xa006, 0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, - 0x2079, 0x4340, 0x0010, 0x2079, 0x4380, 0x080c, 0x1b1d, 0x2091, - 0x8000, 0x6804, 0x780a, 0xa065, 0x0904, 0x1bfe, 0x0030, 0x2c00, - 0x780a, 0x2060, 0x6000, 0xa065, 0x05c8, 0x6010, 0xa306, 0x1db8, - 0x600c, 0xa206, 0x1da0, 0x2c28, 0x784c, 0xac06, 0x1108, 0x0458, - 0x6804, 0xac06, 0x1140, 0x6000, 0x2060, 0x6806, 0xa005, 0x1118, - 0x6803, 0x0000, 0x0048, 0x6400, 0x7808, 0x2060, 0x6402, 0xa486, - 0x0000, 0x1110, 0x2c00, 0x6802, 0x2560, 0x00fe, 0x080c, 0x1b85, - 0x00f6, 0x601b, 0x0005, 0x6023, 0x0020, 0x00fe, 0x080c, 0x1d30, - 0x00f6, 0x7908, 0x8109, 0x790a, 0x6810, 0x8001, 0x6812, 0x1118, - 0x7810, 0xc0a5, 0x7812, 0x2001, 0xffff, 0xa005, 0x00fe, 0x0005, - 0x0076, 0x2700, 0x2039, 0x0000, 0xd0fc, 0x0108, 0xc7fd, 0x2041, - 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x080c, - 0x1b35, 0x8738, 0xa784, 0x001f, 0x1dd0, 0xa7bc, 0xff00, 0x873f, - 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d90, 0x2091, 0x8001, 0x007e, - 0x0005, 0x786c, 0x2009, 0x8b74, 0x210c, 0xa10d, 0x0118, 0xa065, - 0x0804, 0x1ffe, 0x2061, 0x0000, 0x6018, 0xd084, 0x11b8, 0x7810, - 0xd08c, 0x0130, 0xc08c, 0x7812, 0xc7fc, 0x2069, 0x4340, 0x0028, - 0xc08d, 0x7812, 0x2069, 0x4380, 0xc7fd, 0x2091, 0x8000, 0x681c, - 0x681f, 0x0000, 0x2091, 0x8001, 0xa005, 0x1108, 0x0005, 0xa08c, - 0xfff0, 0x0110, 0x080c, 0x243b, 0x0002, 0x1c5d, 0x1c60, 0x1c66, - 0x1c6a, 0x1c5e, 0x1c6e, 0x1c5e, 0x1c5e, 0x1c5e, 0x1c73, 0x1c9f, - 0x1ca2, 0x1ca7, 0x1c5e, 0x1c5e, 0x1c5e, 0x0005, 0x080c, 0x243b, - 0x080c, 0x1c00, 0x2001, 0x8001, 0x0804, 0x1cb0, 0x2001, 0x8003, - 0x0804, 0x1cb0, 0x2001, 0x8004, 0x0804, 0x1cb0, 0x080c, 0x1c00, - 0x2001, 0x8006, 0x04e8, 0x2091, 0x8000, 0x0076, 0xd7fc, 0x1128, - 0x2069, 0x4340, 0x2039, 0x0009, 0x0020, 0x2069, 0x4380, 0x2039, - 0x0009, 0x6800, 0xa086, 0x0000, 0x0128, 0x000e, 0x6f1e, 0x2091, - 0x8001, 0x0005, 0x6874, 0x007e, 0xa0bc, 0xff00, 0x2041, 0x0021, - 0x2049, 0x0004, 0x2051, 0x0010, 0x080c, 0x1b35, 0x8738, 0xa784, - 0x001f, 0x1dd0, 0x2091, 0x8001, 0x2001, 0x800a, 0x0088, 0x2001, - 0x800c, 0x0070, 0x080c, 0x1c00, 0x2001, 0x800d, 0x0048, 0xd7fc, - 0x0110, 0x78ec, 0x0008, 0x78e4, 0x70c6, 0x2001, 0x800e, 0x0000, - 0x70c2, 0xd7fc, 0x1118, 0x70db, 0x0000, 0x0010, 0x70db, 0x0001, - 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x0005, 0xac80, - 0x0001, 0x81ff, 0x0518, 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, - 0x07ff, 0x0100, 0x7018, 0x0006, 0x701c, 0x0006, 0x7020, 0x0006, - 0x7024, 0x0006, 0x7112, 0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, - 0x7003, 0x0001, 0x7007, 0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, - 0x0002, 0xa08c, 0x01e0, 0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, - 0x7007, 0x0004, 0x000e, 0x7026, 0x000e, 0x7022, 0x000e, 0x701e, - 0x000e, 0x701a, 0x0005, 0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, - 0x6c0e, 0x681f, 0x0201, 0x6803, 0xfd20, 0x6807, 0x0038, 0x6a1a, - 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004, 0x8109, 0x1d80, 0x0005, - 0x70ec, 0xd0dc, 0x1520, 0x2029, 0x0001, 0x7814, 0xd0cc, 0x1160, - 0x70ec, 0xd0e4, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1120, 0x2019, - 0x0c0c, 0x2021, 0x000c, 0x0070, 0x70ec, 0xd0e4, 0x1128, 0x2019, - 0x1c0c, 0x2021, 0x000c, 0x0030, 0x2019, 0x1c09, 0x2021, 0x0009, - 0xa5ad, 0x0200, 0x6b0a, 0x6c0e, 0x6d1e, 0x6807, 0x0038, 0x0005, - 0x6004, 0x6086, 0x2c08, 0x2063, 0x0000, 0x7868, 0xa005, 0x796a, - 0x0110, 0x2c02, 0x0008, 0x796e, 0x0005, 0x00c6, 0x2061, 0x4300, - 0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, - 0x0110, 0x2d02, 0x0008, 0x616e, 0x00ce, 0x0005, 0x2091, 0x8000, - 0x2c04, 0x786e, 0xa005, 0x1108, 0x786a, 0x2091, 0x8001, 0x609c, - 0xa005, 0x0188, 0x00c6, 0x2060, 0x2008, 0x609c, 0xa005, 0x0138, - 0x2062, 0x609f, 0x0000, 0xa065, 0x609c, 0xa005, 0x1dc8, 0x7848, - 0x794a, 0x2062, 0x00ce, 0x7848, 0x2062, 0x609f, 0x0000, 0xac85, - 0x0000, 0x1110, 0x080c, 0x243b, 0x784a, 0x0005, 0x20a9, 0x0010, - 0xa006, 0x8004, 0x8086, 0x818e, 0x1208, 0xa200, 0x1f04, 0x1d7a, - 0x8086, 0x818e, 0x0005, 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, - 0xa11a, 0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, - 0x1d8a, 0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04, 0x1d8a, 0x0006, - 0x3200, 0xa084, 0xefff, 0x2080, 0x000e, 0x015e, 0x0005, 0x0006, - 0x3200, 0xa085, 0x1000, 0x0cb8, 0x7d74, 0x70d0, 0xa506, 0x0904, - 0x1e5b, 0x7810, 0x2050, 0x7800, 0xd08c, 0x0100, 0x080c, 0x1afa, - 0x0904, 0x1e5b, 0xa046, 0x7970, 0x2500, 0x8000, 0xa112, 0x2009, - 0x0040, 0x1208, 0x0030, 0x72d0, 0xa206, 0x0118, 0x8840, 0x2009, - 0x0080, 0x00c6, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, - 0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0110, - 0x080c, 0x1afa, 0x7008, 0xd0fc, 0x0de8, 0x7007, 0x0002, 0x2091, - 0x8001, 0xa08c, 0x01e0, 0x1538, 0x53a5, 0x8cff, 0x1120, 0x88ff, - 0x0904, 0x1e48, 0x0050, 0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80, - 0x0001, 0x20a0, 0x53a5, 0x0804, 0x1e48, 0xa046, 0x7218, 0x731c, - 0xdac4, 0x0110, 0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, - 0xa4a3, 0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e, 0xdac4, 0x0118, - 0x7422, 0x7526, 0xa006, 0x7007, 0x0004, 0x0904, 0x1e48, 0x8cff, - 0x0110, 0x080c, 0x1b02, 0x00ce, 0x080c, 0x1b02, 0xa046, 0x7888, - 0x8000, 0x788a, 0xa086, 0x0002, 0x01c0, 0x7a7c, 0x7b78, 0xdac4, - 0x0110, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004, 0x8004, 0xa210, - 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x721a, 0x731e, - 0xdac4, 0x0588, 0x7422, 0x7526, 0x0470, 0x6014, 0xd0fc, 0x1118, - 0x2069, 0x4340, 0x0010, 0x2069, 0x4380, 0x2091, 0x8000, 0x681f, - 0x0002, 0x88ff, 0x0120, 0xa046, 0x788c, 0x2060, 0x0c70, 0x788b, - 0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0098, - 0x00ce, 0x788b, 0x0000, 0x080c, 0x1fb9, 0x6004, 0xa084, 0x000f, - 0x0059, 0x88ff, 0x0130, 0x788c, 0x2060, 0x6004, 0xa084, 0x000f, - 0x0019, 0x0804, 0x1da4, 0x0005, 0x0002, 0x1e6d, 0x1e88, 0x1ea1, - 0x1e6d, 0x1eae, 0x1e7e, 0x1e6d, 0x1e6d, 0x1e6d, 0x1e86, 0x1e9f, - 0x1e6d, 0x1e6d, 0x1e6d, 0x1e6d, 0x1e6d, 0x2039, 0x0400, 0x78bc, - 0xa705, 0x78be, 0x6008, 0xa705, 0x600a, 0x080c, 0x1eea, 0x609c, - 0x78ba, 0x609f, 0x0000, 0x080c, 0x1fa5, 0x0005, 0x78bc, 0xd0c4, - 0x0108, 0x0c58, 0x601c, 0xc0bd, 0x601e, 0x0030, 0x080c, 0x1fe3, - 0x78bc, 0xd0c4, 0x0108, 0x0c08, 0x78bf, 0x0000, 0x6004, 0x8007, - 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0138, 0x080c, 0x1eea, 0x0120, - 0x78bc, 0xc0c5, 0x78be, 0x0010, 0x0804, 0x1f05, 0x0005, 0x080c, - 0x1fe0, 0x78bc, 0xa08c, 0x0e00, 0x1110, 0xd0c4, 0x1108, 0x0828, - 0x080c, 0x1eea, 0x1110, 0x0804, 0x1f05, 0x0005, 0x78bc, 0xd0c4, - 0x0110, 0x0804, 0x1e6d, 0x78bf, 0x0000, 0x6714, 0x2011, 0x0001, - 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0188, 0xa7bc, 0xff00, - 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc, 0x8000, 0x2011, - 0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108, 0x00c0, 0x080c, - 0x1b1d, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, - 0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001, - 0x1f04, 0x1ed2, 0x8211, 0x0118, 0x20a9, 0x0100, 0x0c58, 0x080c, - 0x1b02, 0x0005, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6, - 0x1110, 0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002, 0x78b8, 0xad06, - 0x1108, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x1130, 0x78bc, 0xc0c4, - 0x78be, 0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6, 0xa02e, 0x2530, - 0x7dba, 0x7db6, 0x65ae, 0x65b2, 0x601c, 0x60a2, 0x2048, 0xa984, - 0xe1ff, 0x601e, 0xa984, 0x0060, 0x0110, 0x080c, 0x3de5, 0x6596, - 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x4380, 0xd7fc, 0x1110, - 0x2071, 0x4340, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x0120, - 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x71c4, 0xa168, 0x2700, - 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x71c8, 0xa100, - 0x60c2, 0x2091, 0x8000, 0x6e08, 0xd684, 0x0170, 0xd9fc, 0x1160, - 0x2091, 0x8001, 0x080c, 0x1b85, 0x2091, 0x8000, 0x080c, 0x1d30, - 0x2091, 0x8001, 0x0804, 0x1fa3, 0x6024, 0xa096, 0x0001, 0x1110, - 0x8000, 0x6026, 0x6a10, 0x6814, 0xa202, 0x0268, 0x0160, 0x2091, - 0x8001, 0x2039, 0x0200, 0x609c, 0x78ba, 0x609f, 0x0000, 0x080c, - 0x1fa5, 0x0804, 0x1fa3, 0x2c08, 0xd9fc, 0x01f0, 0x6800, 0xa065, - 0x01d8, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0168, 0x704c, 0xa206, - 0x1150, 0x6b04, 0x2160, 0x2304, 0x6002, 0xa005, 0x1108, 0x6902, - 0x2260, 0x6102, 0x0098, 0x2d00, 0x2060, 0x080c, 0x2580, 0x6e08, - 0x2160, 0x6202, 0x6906, 0x0050, 0x6800, 0x6902, 0xa065, 0x0110, - 0x6102, 0x0008, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160, 0xd9fc, - 0x0118, 0xa6b4, 0xfffc, 0x6e0a, 0x6810, 0x7d08, 0x8528, 0x7d0a, - 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0128, 0xa6b6, 0x0040, - 0x6e0a, 0x080c, 0x1b96, 0x00ee, 0x0005, 0x6008, 0xa705, 0x600a, - 0x2091, 0x8000, 0x080c, 0x1d30, 0x2091, 0x8001, 0x78b8, 0xa065, - 0x0128, 0x609c, 0x78ba, 0x609f, 0x0000, 0x0c78, 0x78b6, 0x78ba, - 0x0005, 0x7970, 0x7874, 0x2818, 0xd384, 0x0118, 0x8000, 0xa112, - 0x0220, 0x8000, 0xa112, 0x1278, 0xc384, 0x7a7c, 0x721a, 0x7a78, - 0x721e, 0xdac4, 0x0120, 0x7a84, 0x7222, 0x7a80, 0x7226, 0xa006, - 0xd384, 0x0108, 0x8000, 0x7876, 0x70d2, 0x781c, 0xa005, 0x0138, - 0x8001, 0x781e, 0x1120, 0x0e04, 0x1fdf, 0x2091, 0x4080, 0x0005, - 0x2039, 0x1ff5, 0x0010, 0x2039, 0x1ffb, 0x2704, 0xa005, 0x0160, - 0xac00, 0x2068, 0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, - 0x6916, 0x680e, 0x8738, 0x0c88, 0x0005, 0x0003, 0x0009, 0x000f, - 0x0015, 0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x2041, 0x0000, - 0x780c, 0x0002, 0x21a7, 0x2182, 0x2006, 0x2076, 0x2039, 0x8b74, - 0x2734, 0x7d10, 0x00c0, 0x6084, 0xa086, 0x0103, 0x1904, 0x2060, - 0x6114, 0x6018, 0xa105, 0x0120, 0x86ff, 0x11d8, 0x0804, 0x2060, - 0x8603, 0xa080, 0x8b55, 0x620c, 0x2202, 0x8000, 0x6210, 0x2202, - 0x080c, 0x1d4e, 0x8630, 0xa68e, 0x000f, 0x0904, 0x20e1, 0x786c, - 0xa065, 0x1d08, 0x7808, 0xa602, 0x1220, 0xd5ac, 0x1110, 0x263a, - 0x0005, 0xa682, 0x0003, 0x1a04, 0x20e1, 0x2091, 0x8000, 0x2069, - 0x0000, 0x6818, 0xd084, 0x11f8, 0x2011, 0x8b55, 0x2204, 0x70c6, - 0x8210, 0x2204, 0x70ca, 0xd684, 0x1130, 0x8210, 0x2204, 0x70da, - 0x8210, 0x2204, 0x70de, 0xa685, 0x8020, 0x70c2, 0x681b, 0x0001, - 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, - 0x203b, 0x0000, 0x0005, 0x7810, 0xc0ad, 0x7812, 0x0804, 0x20e1, - 0x263a, 0x080c, 0x21ad, 0x1904, 0x21c9, 0x786c, 0xa065, 0x1904, - 0x200b, 0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0108, - 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0804, 0x21c9, 0x2039, 0x8b74, - 0x2734, 0x7d10, 0x00a0, 0x6084, 0xa086, 0x0103, 0x1904, 0x20cb, - 0x6114, 0x6018, 0xa105, 0x0120, 0x86ff, 0x11b8, 0x0804, 0x20cb, - 0xa680, 0x8b55, 0x620c, 0x2202, 0x080c, 0x1d4e, 0x8630, 0xa68e, - 0x001e, 0x0904, 0x20e1, 0x786c, 0xa065, 0x1d28, 0x7808, 0xa602, - 0x1220, 0xd5ac, 0x1110, 0x263a, 0x0005, 0xa682, 0x0006, 0x1a04, - 0x20e1, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x11f8, - 0x2011, 0x8b55, 0x2009, 0x8b4e, 0x26a8, 0x211c, 0x2204, 0x201a, - 0x8108, 0x8210, 0x1f04, 0x20ad, 0xa685, 0x8030, 0x70c2, 0x681b, - 0x0001, 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, - 0x8001, 0xa006, 0x2009, 0x8b75, 0x200a, 0x203a, 0x0005, 0x7810, - 0xc0ad, 0x7812, 0x00b0, 0x263a, 0x080c, 0x21ad, 0x1904, 0x21c9, - 0x786c, 0xa065, 0x1904, 0x207b, 0x2091, 0x8000, 0x7810, 0xa084, - 0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0804, - 0x21c9, 0x2091, 0x8000, 0x7007, 0x0004, 0x7994, 0x70d4, 0xa102, - 0x0228, 0x0168, 0x7b90, 0xa302, 0x1150, 0x0010, 0x8002, 0x1138, - 0x263a, 0x7810, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0005, 0xa184, - 0xff00, 0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, - 0xa100, 0x0018, 0x8107, 0x8004, 0x8004, 0x7a9c, 0xa210, 0x721a, - 0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4, 0x0130, 0x7aa4, 0xa211, - 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1, 0x0030, 0x7003, 0x0000, - 0x2009, 0x8b54, 0x260a, 0x8109, 0x2198, 0x2104, 0xd084, 0x0108, - 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6, 0x8603, 0x7012, 0x7007, - 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a, 0x1208, 0xa006, 0x2028, - 0x7974, 0xa184, 0xff00, 0x0140, 0x810f, 0x810c, 0x810c, 0x8004, - 0x8004, 0x8007, 0xa100, 0x0018, 0x8107, 0x8004, 0x8004, 0x797c, - 0xa108, 0x7a78, 0xa006, 0xa211, 0xd4c4, 0x0120, 0x7b84, 0xa319, - 0x7c80, 0xa421, 0x7008, 0xd0fc, 0x0de8, 0xa084, 0x01e0, 0x01d0, - 0x7d10, 0x2031, 0x8b54, 0x2634, 0x78a8, 0x8000, 0x78aa, 0xd08c, - 0x1138, 0x7007, 0x0006, 0x7004, 0xd094, 0x1de8, 0x0804, 0x20e3, - 0x2069, 0x4347, 0x206b, 0x0003, 0x78ac, 0xa085, 0x0300, 0x78ae, - 0xa006, 0x0048, 0x2030, 0x75d6, 0x2091, 0x4080, 0x7d96, 0x7d10, - 0xa5ac, 0xffcf, 0x7d12, 0x2091, 0x8001, 0x78aa, 0x7007, 0x0006, - 0x263a, 0x7003, 0x0001, 0x711a, 0x721e, 0xd5c4, 0x0110, 0x7322, - 0x7426, 0x0005, 0x6084, 0xa086, 0x0103, 0x11d8, 0x6114, 0x6018, - 0xa105, 0x11b8, 0x2069, 0x0000, 0x6818, 0xd084, 0x1190, 0x600c, - 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, - 0x4080, 0x080c, 0x1d4e, 0x0e04, 0x21a0, 0x786c, 0xa065, 0x1d10, - 0x0005, 0x0059, 0x1530, 0x786c, 0xa065, 0x19e0, 0x0410, 0x0029, - 0x1500, 0x786c, 0xa065, 0x1dd8, 0x00e0, 0x6084, 0xa086, 0x0103, - 0x1168, 0x6018, 0xc0fc, 0x601a, 0xa086, 0x0004, 0x1138, 0x7804, - 0xd0a4, 0x0120, 0x080c, 0x1d4e, 0xa006, 0x0005, 0x0079, 0x1118, - 0xa085, 0x0001, 0x0005, 0x00b9, 0x1110, 0x2041, 0x0001, 0x7d10, - 0x0005, 0x88ff, 0x0110, 0x2091, 0x4080, 0x0005, 0x7b90, 0x7994, - 0x70d4, 0xa102, 0x1118, 0xa385, 0x0000, 0x0005, 0x0210, 0xa302, - 0x0005, 0x8002, 0x0005, 0xa184, 0xff00, 0x0140, 0x810f, 0x810c, + 0x080c, 0x1b0a, 0x0138, 0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, + 0x0804, 0x13bc, 0xa7bc, 0xff00, 0x2091, 0x8000, 0x2009, 0x0017, + 0xd7fc, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, 0x4680, 0xc1fd, + 0x607b, 0x0000, 0x6063, 0x0002, 0x6772, 0x607f, 0x000f, 0x792a, + 0x61d0, 0xc1c4, 0x61d2, 0x080c, 0x22ae, 0x2091, 0x8001, 0x2041, + 0x0021, 0x2049, 0x0005, 0x2051, 0x0030, 0x2091, 0x8000, 0x70c8, + 0xa005, 0x0118, 0x60d0, 0xc0fd, 0x60d2, 0x080c, 0x1b93, 0x70c8, + 0x6836, 0x8738, 0xa784, 0x001f, 0x1dc0, 0x2091, 0x8001, 0x0005, + 0x2019, 0x0000, 0x72c8, 0xd284, 0x0128, 0x080c, 0x1b0a, 0x0138, + 0x0804, 0x13bc, 0x080c, 0x1aff, 0x0110, 0x0804, 0x13bc, 0x72c8, + 0x72ca, 0x78ac, 0xa084, 0x0003, 0x1508, 0x2039, 0x0000, 0xd284, + 0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, + 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, + 0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x1d90, 0xa7bc, 0xff00, + 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d50, 0x2091, 0x8000, + 0x72c8, 0x2069, 0x0100, 0xd284, 0x1110, 0x2069, 0x0200, 0x6808, + 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b, 0x0004, + 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x18b2, 0x684b, + 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04, 0x18bb, + 0x20a9, 0x00fa, 0x1f04, 0x18c2, 0x2079, 0x4600, 0x2009, 0x0018, + 0x72c8, 0xd284, 0x1118, 0x2061, 0x4640, 0x0018, 0x2061, 0x4680, + 0xc1fd, 0x607b, 0x0000, 0x792a, 0x6063, 0x0001, 0x607f, 0x000f, + 0x60a3, 0x0000, 0x60a4, 0x60ae, 0x60b2, 0x60d0, 0xd0b4, 0x0160, + 0xc0b4, 0x60d2, 0x00c6, 0x60b4, 0xa065, 0x6008, 0xc0d4, 0x600a, + 0x6018, 0x8001, 0x601a, 0x00ce, 0x60d0, 0xa084, 0x7eff, 0x60d2, + 0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0108, 0x0005, 0x681b, 0x0054, + 0x2091, 0x8001, 0x0005, 0x73cc, 0x080c, 0x186a, 0x69ec, 0x6a48, + 0xa185, 0x1800, 0x684a, 0xa185, 0x0040, 0x68ee, 0x73cc, 0x2021, + 0x0004, 0x20a9, 0x09ff, 0x1f04, 0x190b, 0x8421, 0x1dd0, 0x8319, + 0x1db0, 0x69ee, 0x6a4a, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, + 0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x71c4, 0x71c6, 0x6916, + 0x81ff, 0x1110, 0x68a3, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084, + 0x1110, 0x080c, 0x1c5b, 0x0005, 0x75d8, 0x74dc, 0x75da, 0x74de, + 0x0010, 0xa02e, 0x2520, 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca, + 0x72ce, 0x2079, 0x4600, 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x080c, + 0x1b58, 0x0904, 0x1a3d, 0x20a9, 0x0005, 0x20a1, 0x4614, 0x2091, + 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, 0x0040, 0x080c, 0x1d24, + 0x0120, 0x080c, 0x1b60, 0x0804, 0x1a3d, 0x6004, 0xa08c, 0x00ff, + 0xa18e, 0x0009, 0x1120, 0x0006, 0x080c, 0x205f, 0x000e, 0xa084, + 0xff00, 0x8007, 0x8009, 0x0904, 0x19e1, 0x00c6, 0x2c68, 0x080c, + 0x1b58, 0x05a8, 0x2c00, 0x689e, 0x8109, 0x1dc0, 0x609f, 0x0000, + 0x00ce, 0x00c6, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040, + 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda, + 0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0904, 0x19e0, 0x2009, + 0x0040, 0x080c, 0x1d24, 0x15a0, 0x6004, 0xa084, 0x00ff, 0xa086, + 0x0002, 0x1168, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, 0x1120, + 0x0016, 0x080c, 0x205c, 0x001e, 0x2d00, 0x6002, 0x0898, 0x00ce, + 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, 0x609f, 0x0000, 0x080c, + 0x1a41, 0x2009, 0x0018, 0x6008, 0xc0cd, 0x600a, 0x6004, 0x6086, + 0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812, + 0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, 0x1b60, 0x0804, 0x1a3d, + 0x00ce, 0x00c6, 0x609c, 0x080c, 0x1bd4, 0x00ce, 0x609f, 0x0000, + 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b, 0x0003, + 0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, 0x0110, 0xc0c5, 0x7812, + 0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, 0x1b60, 0x0804, 0x1a3d, + 0x00ce, 0x6114, 0xd1fc, 0x0120, 0x080c, 0x1b0a, 0x01f0, 0x0018, + 0x080c, 0x1aff, 0x01d0, 0x080c, 0x1a41, 0x2009, 0x0018, 0x6087, + 0x0103, 0x601b, 0x0021, 0x7810, 0x0006, 0x84ff, 0x1110, 0x85ff, + 0x0110, 0xc0c5, 0x7812, 0x080c, 0x1b15, 0x000e, 0x7812, 0x080c, + 0x1b60, 0x2001, 0x4007, 0x0804, 0x13bc, 0x74c4, 0x73c8, 0x72cc, + 0x6014, 0x2091, 0x8000, 0x00e6, 0x2009, 0x0012, 0xd0fc, 0x1118, + 0x2071, 0x4640, 0x0018, 0x2071, 0x4680, 0xc1fd, 0x792a, 0x7063, + 0x0005, 0x71d0, 0xc1c4, 0x71d2, 0x7366, 0x726a, 0x746e, 0x7072, + 0x7077, 0x0000, 0x2c00, 0x707a, 0xa02e, 0x2530, 0x611c, 0xa184, + 0x0060, 0x0110, 0x080c, 0x3fc1, 0x00ee, 0x6596, 0x65a6, 0x669a, + 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000, + 0x080c, 0x22ae, 0x2091, 0x8001, 0x0005, 0x70c3, 0x4005, 0x0804, + 0x13bd, 0x20a9, 0x0005, 0x2099, 0x4614, 0x2091, 0x8000, 0x530a, + 0x2091, 0x8001, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, + 0xa5a9, 0x0000, 0x0005, 0x71c4, 0x70c7, 0x0000, 0x791e, 0x0804, + 0x13ba, 0x71c4, 0x71c6, 0x2168, 0x0010, 0x2069, 0x1000, 0x690c, + 0xa016, 0x2d04, 0xa210, 0x8d68, 0x8109, 0x1dd8, 0xa285, 0x0000, + 0x1118, 0x70c3, 0x4000, 0x0010, 0x70c3, 0x4003, 0x70ca, 0x0804, + 0x13bd, 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x1a04, 0x13b3, + 0x7966, 0x0804, 0x13ba, 0x7964, 0x71c6, 0x0804, 0x13ba, 0x7900, + 0x71c6, 0x71c4, 0x7902, 0x0804, 0x13ba, 0x7900, 0x71c6, 0x0804, + 0x13ba, 0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0160, 0x810c, + 0x0230, 0x8210, 0x810c, 0x810c, 0x0210, 0x8210, 0x810c, 0x81ff, + 0x1904, 0x13b4, 0x8210, 0x7a0e, 0xd28c, 0x0538, 0x7910, 0xc1cd, + 0x7912, 0x2009, 0x0021, 0x2019, 0x0003, 0xd284, 0x01c0, 0x8108, + 0x2019, 0x0041, 0x2011, 0x8e4e, 0x2312, 0x2019, 0x0042, 0x8210, + 0x2312, 0x2019, 0x0043, 0x8210, 0x2312, 0x2019, 0x0046, 0x8210, + 0x2312, 0x2019, 0x0047, 0x8210, 0x2312, 0x2019, 0x0006, 0x2011, + 0x8e53, 0x2112, 0x2011, 0x8e73, 0x2312, 0x7904, 0x7806, 0x0804, + 0x13b9, 0x7804, 0x70c6, 0x0804, 0x13ba, 0x71c4, 0xd1fc, 0x1118, + 0x2011, 0x4ac0, 0x0010, 0x2011, 0x4b40, 0x8107, 0xa084, 0x000f, + 0x8003, 0x8003, 0x8003, 0xa268, 0x2011, 0x0000, 0x6814, 0xd0fc, + 0x0110, 0xa295, 0x0200, 0xd0b4, 0x0110, 0xa295, 0x0001, 0x6b0c, + 0x6800, 0x70da, 0x0804, 0x13b7, 0x7814, 0xd0f4, 0x0130, 0x2001, + 0x4007, 0x70db, 0x0000, 0xa005, 0x0048, 0xd0fc, 0x0130, 0x2001, + 0x4007, 0x70db, 0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7814, + 0xd0f4, 0x0130, 0x2001, 0x4007, 0x70db, 0x0000, 0xa005, 0x0008, + 0xa006, 0x0005, 0x7814, 0xd0fc, 0x0130, 0x2001, 0x4007, 0x70db, + 0x0001, 0xa005, 0x0008, 0xa006, 0x0005, 0x7112, 0x721a, 0x731e, + 0x7810, 0xd0c4, 0x0110, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, + 0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084, + 0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0140, + 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, + 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211, + 0x7d10, 0xd5c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, + 0xd0fc, 0x0de8, 0x7003, 0x0001, 0x7007, 0x0006, 0x711a, 0x721e, + 0x7d10, 0xd5c4, 0x0110, 0x7322, 0x7426, 0xa084, 0x01e0, 0x0005, + 0x7848, 0xa065, 0x0120, 0x2c04, 0x784a, 0x2063, 0x0000, 0x0005, + 0x00f6, 0x2079, 0x4600, 0x7848, 0x2062, 0x2c00, 0xa005, 0x1110, + 0x080c, 0x254c, 0x784a, 0x00fe, 0x0005, 0x2011, 0x9000, 0x7a4a, + 0x7bc4, 0x8319, 0x0128, 0xa280, 0x0032, 0x2012, 0x2010, 0x0cc8, + 0x2013, 0x0000, 0x0005, 0x0016, 0x0026, 0xd7fc, 0x1118, 0x2011, + 0x4bc0, 0x0010, 0x2011, 0x6bc0, 0xa784, 0x0f00, 0x800b, 0xa784, + 0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa268, + 0x002e, 0x001e, 0x0005, 0x0c39, 0x2900, 0x682a, 0x2a00, 0x682e, + 0x6808, 0xa084, 0xf9ef, 0xa80d, 0x690a, 0x00e6, 0xd7fc, 0x1128, + 0x2009, 0x4652, 0x2071, 0x4640, 0x0020, 0x2009, 0x4692, 0x2071, + 0x4680, 0x210c, 0x6804, 0xa005, 0x0148, 0xa116, 0x1138, 0x2060, + 0x6000, 0x6806, 0x0016, 0x200b, 0x0000, 0x0018, 0x2009, 0x0000, + 0x0016, 0x6804, 0xa065, 0x0178, 0x6000, 0x6806, 0x0421, 0x080c, + 0x1d95, 0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x6812, 0x1d88, + 0x7910, 0xc1a5, 0x7912, 0x001e, 0x6902, 0x6906, 0x2d00, 0x2060, + 0x080c, 0x2693, 0x00ee, 0x0005, 0xa065, 0x0160, 0x2008, 0x609c, + 0xa005, 0x0128, 0x2062, 0x609f, 0x0000, 0xa065, 0x0cc0, 0x7848, + 0x794a, 0x2062, 0x0005, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, + 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, + 0x601a, 0x682c, 0x6022, 0x0005, 0x00e6, 0xd7fc, 0x1128, 0x2071, + 0x4640, 0x2031, 0x46c0, 0x0020, 0x2071, 0x4680, 0x2031, 0x48c0, + 0x704c, 0xa08c, 0x0200, 0x1128, 0xa608, 0x2d0a, 0x8000, 0x704e, + 0xa006, 0x00ee, 0x0005, 0x00f6, 0xd7fc, 0x1118, 0x2079, 0x4640, + 0x0010, 0x2079, 0x4680, 0x080c, 0x1b7b, 0x2091, 0x8000, 0x6804, + 0x780a, 0xa065, 0x05f0, 0x0030, 0x2c00, 0x780a, 0x2060, 0x6000, + 0xa065, 0x05b8, 0x6010, 0xa306, 0x1db8, 0x600c, 0xa206, 0x1da0, + 0x2c28, 0x7848, 0xac06, 0x1108, 0x0448, 0x6804, 0xac06, 0x1140, + 0x6000, 0x2060, 0x6806, 0xa005, 0x1118, 0x6803, 0x0000, 0x0048, + 0x6400, 0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x1110, 0x2c00, + 0x6802, 0x2560, 0x080c, 0x1be3, 0x601b, 0x0005, 0x6023, 0x0020, + 0x00fe, 0x080c, 0x1d95, 0x00f6, 0x7908, 0x8109, 0x790a, 0x6810, + 0x8001, 0x6812, 0x1118, 0x7810, 0xc0a5, 0x7812, 0x2001, 0xffff, + 0xa005, 0x00fe, 0x0005, 0x0076, 0x2700, 0x2039, 0x0000, 0xd0fc, + 0x0108, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, + 0x2091, 0x8000, 0x080c, 0x1b93, 0x8738, 0xa784, 0x001f, 0x1dd0, + 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x1d90, + 0x2091, 0x8001, 0x007e, 0x0005, 0x786c, 0x2009, 0x8e74, 0x210c, + 0xa10d, 0x0118, 0xa065, 0x0804, 0x207a, 0x2061, 0x0000, 0x6018, + 0xd084, 0x11b8, 0x7810, 0xd08c, 0x0130, 0xc08c, 0x7812, 0xc7fc, + 0x2069, 0x4640, 0x0028, 0xc08d, 0x7812, 0x2069, 0x4680, 0xc7fd, + 0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091, 0x8001, 0xa005, + 0x1108, 0x0005, 0xa08c, 0xfff0, 0x0110, 0x080c, 0x254c, 0x0002, + 0x1cb8, 0x1cbb, 0x1cc1, 0x1cc5, 0x1cb9, 0x1cc9, 0x1cb9, 0x1cb9, + 0x1cb9, 0x1ccf, 0x1cfb, 0x1cfe, 0x1d03, 0x1d0c, 0x1cb9, 0x1cb9, + 0x0005, 0x080c, 0x254c, 0x080c, 0x1c5b, 0x2001, 0x8001, 0x0804, + 0x1d15, 0x2001, 0x8003, 0x0804, 0x1d15, 0x2001, 0x8004, 0x0804, + 0x1d15, 0x080c, 0x1c5b, 0x2001, 0x8006, 0x0804, 0x1d15, 0x2091, + 0x8000, 0x0076, 0xd7fc, 0x1128, 0x2069, 0x4640, 0x2039, 0x0009, + 0x0020, 0x2069, 0x4680, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000, + 0x0128, 0x000e, 0x6f1e, 0x2091, 0x8001, 0x0005, 0x6870, 0x007e, + 0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, + 0x080c, 0x1b93, 0x8738, 0xa784, 0x001f, 0x1dd0, 0x2091, 0x8001, + 0x2001, 0x800a, 0x00d0, 0x2001, 0x800c, 0x00b8, 0x080c, 0x1c5b, + 0x2001, 0x800d, 0x0090, 0xd7fc, 0x0110, 0x78e4, 0x0008, 0x78e0, + 0x70c6, 0x2001, 0x800e, 0x0048, 0xd7fc, 0x0110, 0x78ec, 0x0008, + 0x78e8, 0x70c6, 0x2001, 0x800f, 0x0000, 0x70c2, 0xd7fc, 0x1118, + 0x70db, 0x0000, 0x0010, 0x70db, 0x0001, 0x2061, 0x0000, 0x601b, + 0x0001, 0x2091, 0x4080, 0x0005, 0xac80, 0x0001, 0x81ff, 0x0518, + 0x2099, 0x0030, 0x20a0, 0x700c, 0xa084, 0x07ff, 0x0100, 0x7018, + 0x0006, 0x701c, 0x0006, 0x7020, 0x0006, 0x7024, 0x0006, 0x7112, + 0x81ac, 0x721a, 0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007, + 0x0001, 0x7008, 0x800b, 0x1ee8, 0x7007, 0x0002, 0xa08c, 0x01e0, + 0x1110, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004, 0x000e, + 0x7026, 0x000e, 0x7022, 0x000e, 0x701e, 0x000e, 0x701a, 0x0005, + 0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x681f, 0x0201, + 0x6803, 0xfd20, 0x6807, 0x0038, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, + 0xa290, 0x0004, 0x8109, 0x1d80, 0x0005, 0x70ec, 0xd0dc, 0x1520, + 0x2029, 0x0001, 0x7814, 0xd0cc, 0x1160, 0x70ec, 0xd0e4, 0x2019, + 0x0c0a, 0x2021, 0x000a, 0x1120, 0x2019, 0x0c0c, 0x2021, 0x000c, + 0x0070, 0x70ec, 0xd0e4, 0x1128, 0x2019, 0x180c, 0x2021, 0x000c, + 0x0030, 0x2019, 0x1809, 0x2021, 0x0009, 0xa5ad, 0x0200, 0x6b0a, + 0x6c0e, 0x6d1e, 0x6807, 0x0038, 0x0005, 0x6004, 0x6086, 0x2c08, + 0x2063, 0x0000, 0x7868, 0xa005, 0x796a, 0x0110, 0x2c02, 0x0008, + 0x796e, 0x0005, 0x00c6, 0x2061, 0x4600, 0x6887, 0x0103, 0x2d08, + 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008, + 0x616e, 0x00ce, 0x0005, 0x2091, 0x8000, 0x2c04, 0x786e, 0xa005, + 0x1108, 0x786a, 0x2091, 0x8001, 0x609c, 0xa005, 0x0188, 0x00c6, + 0x2060, 0x2008, 0x609c, 0xa005, 0x0138, 0x2062, 0x609f, 0x0000, + 0xa065, 0x609c, 0xa005, 0x1dc8, 0x7848, 0x794a, 0x2062, 0x00ce, + 0x7848, 0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x1110, 0x080c, + 0x254c, 0x784a, 0x0005, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, + 0x818e, 0x1208, 0xa200, 0x1f04, 0x1ddf, 0x8086, 0x818e, 0x0005, + 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, + 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x1def, 0x0028, 0xa11a, + 0x2308, 0x8210, 0x1f04, 0x1def, 0x0006, 0x3200, 0xa084, 0xefff, + 0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, 0x1000, + 0x0cb8, 0x7d74, 0x70d0, 0xa506, 0x0904, 0x1ebd, 0x7810, 0x2050, + 0x080c, 0x1b58, 0x0904, 0x1ebd, 0xa046, 0x7970, 0x2500, 0x8000, + 0xa112, 0x2009, 0x0040, 0x1208, 0x0030, 0x72d0, 0xa206, 0x0118, + 0x8840, 0x2009, 0x0080, 0x00c6, 0x7112, 0x7007, 0x0001, 0x2099, + 0x0030, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, + 0x88ff, 0x0110, 0x080c, 0x1b58, 0x7008, 0xd0fc, 0x0de8, 0x7007, + 0x0002, 0x2091, 0x8001, 0xa08c, 0x01e0, 0x1538, 0x53a5, 0x8cff, + 0x1120, 0x88ff, 0x0904, 0x1eaa, 0x0050, 0x2c00, 0x788e, 0x20a9, + 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5, 0x0804, 0x1eaa, 0xa046, + 0x7218, 0x731c, 0xdac4, 0x0110, 0x7420, 0x7524, 0xa292, 0x0040, + 0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab, 0x0000, 0x721a, 0x731e, + 0xdac4, 0x0118, 0x7422, 0x7526, 0xa006, 0x7007, 0x0004, 0x0904, + 0x1eaa, 0x8cff, 0x0110, 0x080c, 0x1b60, 0x00ce, 0x080c, 0x1b60, + 0xa046, 0x7888, 0x8000, 0x788a, 0xa086, 0x0002, 0x01c0, 0x7a7c, + 0x7b78, 0xdac4, 0x0110, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004, + 0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, + 0x721a, 0x731e, 0xdac4, 0x0588, 0x7422, 0x7526, 0x0470, 0x6014, + 0xd0fc, 0x1118, 0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x2091, + 0x8000, 0x681f, 0x0002, 0x88ff, 0x0120, 0xa046, 0x788c, 0x2060, + 0x0c70, 0x788b, 0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, + 0x8001, 0x0098, 0x00ce, 0x788b, 0x0000, 0x080c, 0x2035, 0x6004, + 0xa084, 0x000f, 0x0059, 0x88ff, 0x0130, 0x788c, 0x2060, 0x6004, + 0xa084, 0x000f, 0x0019, 0x0804, 0x1e09, 0x0005, 0x0002, 0x1ecf, + 0x1eea, 0x1f03, 0x1ecf, 0x1f10, 0x1ee0, 0x1ecf, 0x1ecf, 0x1ecf, + 0x1ee8, 0x1f01, 0x1ecf, 0x1ecf, 0x1ecf, 0x1ecf, 0x1ecf, 0x2039, + 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705, 0x600a, 0x080c, + 0x1f4c, 0x609c, 0x78ba, 0x609f, 0x0000, 0x080c, 0x2021, 0x0005, + 0x78bc, 0xd0c4, 0x0108, 0x0c58, 0x601c, 0xc0bd, 0x601e, 0x0030, + 0x080c, 0x205f, 0x78bc, 0xd0c4, 0x0108, 0x0c08, 0x78bf, 0x0000, + 0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0138, 0x080c, + 0x1f4c, 0x0120, 0x78bc, 0xc0c5, 0x78be, 0x0010, 0x0804, 0x1f67, + 0x0005, 0x080c, 0x205c, 0x78bc, 0xa08c, 0x0e00, 0x1110, 0xd0c4, + 0x1108, 0x0828, 0x080c, 0x1f4c, 0x1110, 0x0804, 0x1f67, 0x0005, + 0x78bc, 0xd0c4, 0x0110, 0x0804, 0x1ecf, 0x78bf, 0x0000, 0x6714, + 0x2011, 0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0188, + 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0150, 0xa7bc, + 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0108, + 0x00c0, 0x080c, 0x1b7b, 0x2d00, 0x2091, 0x8000, 0x682b, 0x0000, + 0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a, 0xade8, 0x0010, + 0x2091, 0x8001, 0x1f04, 0x1f34, 0x8211, 0x0118, 0x20a9, 0x0100, + 0x0c58, 0x080c, 0x1b60, 0x0005, 0x609f, 0x0000, 0x78b4, 0xa06d, + 0x2c00, 0x78b6, 0x1110, 0x78ba, 0x0038, 0x689e, 0x2d00, 0x6002, + 0x78b8, 0xad06, 0x1108, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x1130, + 0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006, 0x0005, 0x00e6, + 0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2, 0x601c, 0x60a2, + 0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060, 0x0110, 0x080c, + 0x3fc1, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, 0x4680, + 0xd7fc, 0x1110, 0x2071, 0x4640, 0xa784, 0x0f00, 0x800b, 0xa784, + 0x001f, 0x0120, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x71c0, + 0xa168, 0x2700, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, + 0x71c4, 0xa100, 0x60c2, 0x2091, 0x8000, 0x7814, 0xd0c4, 0x0138, + 0xd7fc, 0x1118, 0xd0f4, 0x1140, 0x0010, 0xd0fc, 0x1128, 0x6e08, + 0xd684, 0x01f0, 0xd9fc, 0x11e0, 0x2091, 0x8001, 0x080c, 0x1be3, + 0x2091, 0x8000, 0x080c, 0x1d95, 0x2091, 0x8001, 0x7814, 0xd0c4, + 0x0904, 0x201f, 0xd7fc, 0x1120, 0xd0f4, 0x1130, 0x0804, 0x201f, + 0xd0fc, 0x1110, 0x0804, 0x201f, 0x601b, 0x0021, 0x0804, 0x201f, + 0x6024, 0xa096, 0x0001, 0x1110, 0x8000, 0x6026, 0x6a10, 0x6814, + 0xa202, 0x0268, 0x0160, 0x2091, 0x8001, 0x2039, 0x0200, 0x609c, + 0x78ba, 0x609f, 0x0000, 0x080c, 0x2021, 0x0804, 0x201f, 0x2c08, + 0xd9fc, 0x01f0, 0x6800, 0xa065, 0x01d8, 0x6a04, 0x7000, 0xa084, + 0x0002, 0x0168, 0x7048, 0xa206, 0x1150, 0x6b04, 0x2160, 0x2304, + 0x6002, 0xa005, 0x1108, 0x6902, 0x2260, 0x6102, 0x0098, 0x2d00, + 0x2060, 0x080c, 0x2693, 0x6e08, 0x2160, 0x6202, 0x6906, 0x0050, + 0x6800, 0x6902, 0xa065, 0x0110, 0x6102, 0x0008, 0x6906, 0x2160, + 0x6003, 0x0000, 0x2160, 0xd9fc, 0x0118, 0xa6b4, 0xfffc, 0x6e0a, + 0x6810, 0x7d08, 0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, + 0xd6b4, 0x0128, 0xa6b6, 0x0040, 0x6e0a, 0x080c, 0x1bf4, 0x00ee, + 0x0005, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x080c, 0x1d95, + 0x2091, 0x8001, 0x78b8, 0xa065, 0x0128, 0x609c, 0x78ba, 0x609f, + 0x0000, 0x0c78, 0x78b6, 0x78ba, 0x0005, 0x7970, 0x7874, 0x2818, + 0xd384, 0x0118, 0x8000, 0xa112, 0x0220, 0x8000, 0xa112, 0x1278, + 0xc384, 0x7a7c, 0x721a, 0x7a78, 0x721e, 0xdac4, 0x0120, 0x7a84, + 0x7222, 0x7a80, 0x7226, 0xa006, 0xd384, 0x0108, 0x8000, 0x7876, + 0x70d2, 0x781c, 0xa005, 0x0138, 0x8001, 0x781e, 0x1120, 0x0e04, + 0x205b, 0x2091, 0x4080, 0x0005, 0x2039, 0x2071, 0x0010, 0x2039, + 0x2077, 0x2704, 0xa005, 0x0160, 0xac00, 0x2068, 0x6908, 0x6810, + 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e, 0x8738, 0x0c88, + 0x0005, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015, + 0x001b, 0x0000, 0x2041, 0x0000, 0x780c, 0x0002, 0x2223, 0x21fe, + 0x2082, 0x20f2, 0x2039, 0x8e74, 0x2734, 0x7d10, 0x00c0, 0x6084, + 0xa086, 0x0103, 0x1904, 0x20dc, 0x6114, 0x6018, 0xa105, 0x0120, + 0x86ff, 0x11d8, 0x0804, 0x20dc, 0x8603, 0xa080, 0x8e55, 0x620c, + 0x2202, 0x8000, 0x6210, 0x2202, 0x080c, 0x1db3, 0x8630, 0xa68e, + 0x000f, 0x0904, 0x215d, 0x786c, 0xa065, 0x1d08, 0x7808, 0xa602, + 0x1220, 0xd5ac, 0x1110, 0x263a, 0x0005, 0xa682, 0x0003, 0x1a04, + 0x215d, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x11f8, + 0x2011, 0x8e55, 0x2204, 0x70c6, 0x8210, 0x2204, 0x70ca, 0xd684, + 0x1130, 0x8210, 0x2204, 0x70da, 0x8210, 0x2204, 0x70de, 0xa685, + 0x8020, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084, + 0xffcf, 0x7812, 0x2091, 0x8001, 0x203b, 0x0000, 0x0005, 0x7810, + 0xc0ad, 0x7812, 0x0804, 0x215d, 0x263a, 0x080c, 0x2229, 0x1904, + 0x2245, 0x786c, 0xa065, 0x1904, 0x2087, 0x2091, 0x8000, 0x7810, + 0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad, 0x7812, 0x2091, 0x8001, + 0x0804, 0x2245, 0x2039, 0x8e74, 0x2734, 0x7d10, 0x00a0, 0x6084, + 0xa086, 0x0103, 0x1904, 0x2147, 0x6114, 0x6018, 0xa105, 0x0120, + 0x86ff, 0x11b8, 0x0804, 0x2147, 0xa680, 0x8e55, 0x620c, 0x2202, + 0x080c, 0x1db3, 0x8630, 0xa68e, 0x001e, 0x0904, 0x215d, 0x786c, + 0xa065, 0x1d28, 0x7808, 0xa602, 0x1220, 0xd5ac, 0x1110, 0x263a, + 0x0005, 0xa682, 0x0006, 0x1a04, 0x215d, 0x2091, 0x8000, 0x2069, + 0x0000, 0x6818, 0xd084, 0x11f8, 0x2011, 0x8e55, 0x2009, 0x8e4e, + 0x26a8, 0x211c, 0x2204, 0x201a, 0x8108, 0x8210, 0x1f04, 0x2129, + 0xa685, 0x8030, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, + 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, 0xa006, 0x2009, 0x8e75, + 0x200a, 0x203a, 0x0005, 0x7810, 0xc0ad, 0x7812, 0x00b0, 0x263a, + 0x080c, 0x2229, 0x1904, 0x2245, 0x786c, 0xa065, 0x1904, 0x20f7, + 0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0108, 0xc0ad, + 0x7812, 0x2091, 0x8001, 0x0804, 0x2245, 0x2091, 0x8000, 0x7007, + 0x0004, 0x7994, 0x70d4, 0xa102, 0x0228, 0x0168, 0x7b90, 0xa302, + 0x1150, 0x0010, 0x8002, 0x1138, 0x263a, 0x7810, 0xc0ad, 0x7812, + 0x2091, 0x8001, 0x0005, 0xa184, 0xff00, 0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, 0x8107, 0x8004, - 0x8004, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0, 0xa210, 0xa006, 0xa319, - 0xa421, 0xa529, 0x2009, 0x0018, 0x6028, 0xa005, 0x0110, 0x2009, - 0x0040, 0x080c, 0x1ab7, 0x01d0, 0x78a8, 0x8000, 0x78aa, 0xd08c, - 0x1510, 0x6014, 0xd0fc, 0x1118, 0x2069, 0x4340, 0x0010, 0x2069, - 0x4380, 0x2091, 0x8000, 0x681f, 0x0003, 0x78ab, 0x0000, 0x78ac, - 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0068, 0x78ab, 0x0000, - 0x080c, 0x1d4e, 0x7990, 0x7894, 0x8000, 0xa10a, 0x1208, 0xa006, - 0x7896, 0x70d6, 0xa006, 0x2071, 0x0010, 0x2091, 0x8001, 0x0005, - 0x2138, 0xd7fc, 0x1118, 0x2009, 0x4359, 0x0010, 0x2009, 0x4399, - 0x2091, 0x8000, 0x200a, 0x00f6, 0x2009, 0x4380, 0x2079, 0x0100, - 0xd7fc, 0x1120, 0x2009, 0x4340, 0x2079, 0x0200, 0x2104, 0xa086, - 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009, 0x4345, 0x0010, 0x2009, - 0x4385, 0x2104, 0xa005, 0x1130, 0x7830, 0xa084, 0x00c0, 0x1110, - 0x781b, 0x0052, 0x00fe, 0x0005, 0x2009, 0x0002, 0x2069, 0x4300, - 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, 0x22a9, 0x2071, 0x4380, - 0x2079, 0x0100, 0x2021, 0x45bf, 0x784b, 0x000f, 0x2001, 0x01ff, - 0x2004, 0xd0fc, 0x0118, 0x2019, 0x3c3b, 0x0030, 0x20a1, 0x012b, - 0x2019, 0x3c3b, 0xd184, 0x0110, 0x20a1, 0x022b, 0x2304, 0xa005, - 0x0140, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318, - 0x0ca8, 0x789b, 0x0000, 0x789b, 0x0020, 0x20a9, 0x0010, 0x78af, - 0x0000, 0x78af, 0x2020, 0x1f04, 0x2287, 0x7003, 0x0000, 0x0016, - 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd, 0x080c, 0x23bd, 0x001e, - 0x7020, 0xa084, 0x000f, 0xa085, 0x6300, 0x7806, 0x780f, 0x9000, - 0x7843, 0x00d8, 0x7853, 0x0090, 0x780b, 0x0308, 0x7456, 0x7053, - 0x0000, 0x8109, 0x0140, 0x2071, 0x4340, 0x2079, 0x0200, 0x2021, - 0x43bf, 0x0804, 0x2264, 0x0005, 0x0016, 0x2011, 0x0101, 0xd1bc, - 0x1110, 0x2011, 0x0201, 0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, - 0xa105, 0x2012, 0x001e, 0x080c, 0x23bd, 0x0005, 0x2011, 0x0101, - 0xd3fc, 0x1110, 0x2011, 0x0201, 0x20a9, 0x0009, 0x810b, 0x1f04, - 0x22ce, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, - 0x0005, 0x2019, 0x0002, 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, - 0x1f04, 0x22df, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, - 0x200a, 0x8319, 0x0118, 0x2009, 0x0201, 0x0c78, 0x0005, 0x2011, - 0x0101, 0xd3fc, 0x1110, 0x2011, 0x0201, 0x20a9, 0x000c, 0x810b, - 0x1f04, 0x22f7, 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, - 0x2012, 0x0005, 0x2011, 0x0102, 0xd3fc, 0x1110, 0x2011, 0x0202, - 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x0005, 0x00c6, 0x2061, - 0x0100, 0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, - 0xa080, 0x0020, 0x609a, 0x62ac, 0x63ac, 0x00ce, 0x0005, 0x00c6, + 0x8004, 0x7a9c, 0xa210, 0x721a, 0x7a98, 0xa006, 0xa211, 0x721e, + 0xd4c4, 0x0130, 0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, + 0x20a1, 0x0030, 0x7003, 0x0000, 0x2009, 0x8e54, 0x260a, 0x8109, + 0x2198, 0x2104, 0xd084, 0x0108, 0x8633, 0xa6b0, 0x0002, 0x26a8, + 0x53a6, 0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, + 0xa10a, 0x1208, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0140, + 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0018, + 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211, + 0xd4c4, 0x0120, 0x7b84, 0xa319, 0x7c80, 0xa421, 0x7008, 0xd0fc, + 0x0de8, 0xa084, 0x01e0, 0x01d0, 0x7d10, 0x2031, 0x8e54, 0x2634, + 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x1138, 0x7007, 0x0006, 0x7004, + 0xd094, 0x1de8, 0x0804, 0x215f, 0x2069, 0x4647, 0x206b, 0x0003, + 0x78ac, 0xa085, 0x0300, 0x78ae, 0xa006, 0x0048, 0x2030, 0x75d6, + 0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091, + 0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a, + 0x721e, 0xd5c4, 0x0110, 0x7322, 0x7426, 0x0005, 0x6084, 0xa086, + 0x0103, 0x11d8, 0x6114, 0x6018, 0xa105, 0x11b8, 0x2069, 0x0000, + 0x6818, 0xd084, 0x1190, 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, + 0x8020, 0x681b, 0x0001, 0x2091, 0x4080, 0x080c, 0x1db3, 0x0e04, + 0x221c, 0x786c, 0xa065, 0x1d10, 0x0005, 0x0059, 0x1530, 0x786c, + 0xa065, 0x19e0, 0x0410, 0x0029, 0x1500, 0x786c, 0xa065, 0x1dd8, + 0x00e0, 0x6084, 0xa086, 0x0103, 0x1168, 0x6018, 0xc0fc, 0x601a, + 0xa086, 0x0004, 0x1138, 0x7804, 0xd0a4, 0x0120, 0x080c, 0x1db3, + 0xa006, 0x0005, 0x0079, 0x1118, 0xa085, 0x0001, 0x0005, 0x00b9, + 0x1110, 0x2041, 0x0001, 0x7d10, 0x0005, 0x88ff, 0x0110, 0x2091, + 0x4080, 0x0005, 0x7b90, 0x7994, 0x70d4, 0xa102, 0x1118, 0xa385, + 0x0000, 0x0005, 0x0210, 0xa302, 0x0005, 0x8002, 0x0005, 0xa184, + 0xff00, 0x0140, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, + 0xa100, 0x0018, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4, + 0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018, + 0x6028, 0xa005, 0x0110, 0x2009, 0x0040, 0x080c, 0x1b15, 0x01d0, + 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x1510, 0x6014, 0xd0fc, 0x1118, + 0x2069, 0x4640, 0x0010, 0x2069, 0x4680, 0x2091, 0x8000, 0x681f, + 0x0003, 0x78ab, 0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, + 0x8001, 0x0068, 0x78ab, 0x0000, 0x080c, 0x1db3, 0x7990, 0x7894, + 0x8000, 0xa10a, 0x1208, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071, + 0x0010, 0x2091, 0x8001, 0x0005, 0xd7fc, 0x1118, 0x2009, 0x4658, + 0x0010, 0x2009, 0x4698, 0x2091, 0x8000, 0x200a, 0x00f6, 0x2009, + 0x4680, 0x2079, 0x0100, 0xd7fc, 0x1120, 0x2009, 0x4640, 0x2079, + 0x0200, 0x2104, 0xa086, 0x0000, 0x1180, 0xd7fc, 0x1118, 0x2009, + 0x4645, 0x0010, 0x2009, 0x4685, 0x2104, 0xa005, 0x1130, 0x7830, + 0xa084, 0x00c0, 0x1110, 0x781b, 0x0052, 0x00fe, 0x0005, 0x2009, + 0x0002, 0x2069, 0x4600, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1904, + 0x2324, 0x2071, 0x4680, 0x2079, 0x0100, 0x2021, 0x48bf, 0x784b, + 0x000f, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x0118, 0x2019, 0x3e0f, + 0x0030, 0x20a1, 0x012b, 0x2019, 0x3e0f, 0xd184, 0x0110, 0x20a1, + 0x022b, 0x2304, 0xa005, 0x0140, 0x789a, 0x8318, 0x23ac, 0x8318, + 0x2398, 0x53a6, 0x3318, 0x0ca8, 0x789b, 0x0000, 0x789b, 0x0020, + 0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, 0x2020, 0x1f04, 0x2302, + 0x7003, 0x0000, 0x0016, 0xd18c, 0x2009, 0x0000, 0x0108, 0xc1bd, + 0x080c, 0x2443, 0x001e, 0x7020, 0xa084, 0x000f, 0xa085, 0x6300, + 0x7806, 0x780f, 0x9000, 0x7843, 0x00d8, 0x7853, 0x0090, 0x780b, + 0x2f08, 0x7452, 0x704f, 0x0000, 0x8109, 0x0140, 0x2071, 0x4640, + 0x2079, 0x0200, 0x2021, 0x46bf, 0x0804, 0x22df, 0x080c, 0x24fd, + 0x0005, 0x0016, 0x2011, 0x0101, 0xd1bc, 0x1110, 0x2011, 0x0201, + 0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, 0x2012, 0x001e, + 0x080c, 0x2443, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, 0x2011, + 0x0201, 0x20a9, 0x0009, 0x810b, 0x1f04, 0x234b, 0xa18c, 0x0e00, + 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x0005, 0x2019, 0x0002, + 0x2009, 0x0101, 0x20a9, 0x0005, 0x8213, 0x1f04, 0x235c, 0xa294, + 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0118, + 0x2009, 0x0201, 0x0c78, 0x0005, 0x2011, 0x0101, 0xd3fc, 0x1110, + 0x2011, 0x0201, 0x20a9, 0x000c, 0x810b, 0x1f04, 0x2374, 0xa18c, + 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x0005, 0x2011, + 0x0102, 0xd3fc, 0x1110, 0x2011, 0x0202, 0x2204, 0xa084, 0xf0cf, + 0xa105, 0x2012, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc, 0x1110, + 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, + 0x62ac, 0x63ac, 0x00ce, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc, + 0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022, + 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x00ce, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc, 0x1110, 0x2061, 0x0200, 0xc1bc, 0x8103, - 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, - 0x00ce, 0x0005, 0x00c6, 0x2061, 0x0100, 0xd1bc, 0x1110, 0x2061, - 0x0200, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, - 0xa28c, 0x0020, 0x0118, 0xc2ac, 0xa39d, 0x4000, 0xc3ec, 0xd3b4, - 0x1108, 0xc3ed, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, - 0x0005, 0x2091, 0x8000, 0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, - 0x23a1, 0xd1fc, 0x0118, 0x2061, 0x8ad0, 0x0010, 0x2061, 0x89c0, - 0x080c, 0x23a9, 0x0538, 0x20a9, 0x0101, 0xd1fc, 0x0118, 0x2061, - 0x89d0, 0x0010, 0x2061, 0x88c0, 0x00c6, 0x04d9, 0x0128, 0x00ce, - 0x8c60, 0x1f04, 0x236c, 0x0468, 0x000e, 0xd1fc, 0x0128, 0xa082, - 0x89d0, 0x2071, 0x4380, 0x0020, 0xa082, 0x88c0, 0x2071, 0x4340, - 0x707a, 0x7176, 0x2001, 0x0004, 0x7066, 0x7083, 0x000f, 0x080c, - 0x2228, 0x00a0, 0xd1fc, 0x1118, 0x2071, 0x4340, 0x0010, 0x2071, - 0x4380, 0x6020, 0xc0dd, 0x6022, 0x7176, 0x2c00, 0x707e, 0x2001, - 0x0006, 0x7066, 0x7083, 0x000f, 0x080c, 0x2228, 0x2001, 0x0000, - 0x0010, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, - 0x0005, 0x2c04, 0xa005, 0x0170, 0x2060, 0x6010, 0xa306, 0x1140, - 0x600c, 0xa206, 0x1128, 0x6014, 0xa106, 0x1110, 0xa006, 0x0020, - 0x6000, 0x0c80, 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, - 0x2079, 0x4380, 0x2071, 0x0100, 0xd1bc, 0x1120, 0x2079, 0x4340, - 0x2071, 0x0200, 0x7920, 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x1110, - 0x001e, 0x0060, 0x810b, 0x810b, 0x810b, 0x810b, 0x000e, 0xa18d, - 0x0800, 0xd0bc, 0x1110, 0xa18d, 0x0f00, 0x2104, 0x00ee, 0x00fe, - 0x0005, 0x00e6, 0x2001, 0x4301, 0x2004, 0xd0ac, 0x1904, 0x2439, - 0x68e4, 0xd0ac, 0x0904, 0x2439, 0xa084, 0x0006, 0x1904, 0x2439, - 0x6014, 0xd0fc, 0x1118, 0x2071, 0x47c0, 0x0010, 0x2071, 0x4840, - 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, - 0xa084, 0x000a, 0x15b0, 0x7108, 0xa194, 0xff00, 0x0590, 0xa18c, - 0x00ff, 0x2001, 0x000a, 0xa106, 0x01a8, 0x2001, 0x000c, 0xa106, - 0x01a0, 0x2001, 0x0012, 0xa106, 0x0198, 0x2001, 0x0014, 0xa106, - 0x0190, 0x2001, 0x0019, 0xa106, 0x0188, 0x2001, 0x0032, 0xa106, - 0x0180, 0x0090, 0x2009, 0x000c, 0x0088, 0x2009, 0x0012, 0x0070, - 0x2009, 0x0014, 0x0058, 0x2009, 0x0019, 0x0040, 0x2009, 0x0020, - 0x0028, 0x2009, 0x003f, 0x0010, 0x2011, 0x0000, 0x2100, 0xa205, - 0x700a, 0x00ee, 0x0005, 0x0e04, 0x243b, 0x2091, 0x8000, 0x2071, - 0x0000, 0x0006, 0x7018, 0xd084, 0x1de8, 0x000e, 0x2071, 0x0010, - 0x70ca, 0x000e, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x0a01, 0x70df, - 0x0013, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0cf8, - 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708e, 0x7592, 0x7496, - 0x769a, 0x779e, 0xa594, 0x003f, 0xd4f4, 0x0138, 0xd7bc, 0x1128, - 0xa784, 0x007d, 0x1904, 0x3ace, 0x0871, 0xa49c, 0x000f, 0xa382, - 0x0004, 0x0320, 0xa3a6, 0x0007, 0x1930, 0x2418, 0x8507, 0xa084, - 0x000f, 0x0002, 0x2a4f, 0x2b10, 0x2b38, 0x2d71, 0x30cc, 0x3112, - 0x31a7, 0x3220, 0x32db, 0x33a6, 0x248d, 0x248a, 0x285b, 0x295c, - 0x30a0, 0x248a, 0x080c, 0x243b, 0x0005, 0xa006, 0x0038, 0x7808, - 0xc08d, 0x780a, 0xa006, 0x7002, 0x704e, 0x7046, 0x70d2, 0x7060, - 0xa005, 0x1904, 0x25d9, 0x7064, 0xa084, 0x0007, 0x0002, 0x24a7, - 0x2513, 0x251b, 0x2524, 0x252d, 0x25bf, 0x2536, 0x2513, 0x7830, - 0xd0bc, 0x1d10, 0x71d4, 0xd1b4, 0x1904, 0x24f0, 0x70a4, 0xa086, - 0x0001, 0x09d0, 0x70b4, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, - 0x0080, 0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, - 0xa05d, 0xa886, 0x0001, 0x0118, 0x69bc, 0x7daa, 0x79aa, 0x68c0, - 0xa04d, 0x6e1c, 0x2001, 0x0010, 0x0804, 0x270a, 0x7060, 0xa005, - 0x1904, 0x248c, 0x00c6, 0x00d6, 0x70b4, 0xa06d, 0x6800, 0xa065, - 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, - 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0118, 0x69bc, 0x7daa, - 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0804, 0x270a, - 0x080c, 0x3a8d, 0x1904, 0x248c, 0x781b, 0x0068, 0x70bc, 0xa06d, - 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, - 0x7808, 0xc08d, 0x780a, 0x68bc, 0x7042, 0xc1b4, 0x71d6, 0x70b8, - 0xa065, 0x68c0, 0x705a, 0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, - 0x0009, 0x7046, 0x0005, 0x080c, 0x3a8d, 0x1120, 0x781b, 0x0054, - 0x7003, 0x0004, 0x0005, 0x080c, 0x3a8d, 0x1128, 0x2011, 0x000c, - 0x0419, 0x7003, 0x0004, 0x0005, 0x080c, 0x3a8d, 0x1128, 0x2011, - 0x0006, 0x00d1, 0x7003, 0x0004, 0x0005, 0x080c, 0x3a8d, 0x1128, - 0x2011, 0x000d, 0x0089, 0x7003, 0x0004, 0x0005, 0x080c, 0x3a8d, - 0x1150, 0x2011, 0x0006, 0x0041, 0x707c, 0x707f, 0x0000, 0x2068, - 0x704e, 0x7003, 0x0001, 0x0005, 0x7174, 0xc1fc, 0x8107, 0x7882, - 0x789b, 0x0080, 0xa286, 0x000c, 0x1120, 0x7aaa, 0x2001, 0x0001, - 0x0098, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, 0x000d, - 0x0120, 0x7aaa, 0x2001, 0x0002, 0x0038, 0x78ab, 0x0020, 0x7178, - 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b, 0x0060, 0x78aa, 0x785b, - 0x0004, 0x781b, 0x0113, 0x080c, 0x3aa0, 0x7083, 0x000f, 0x70d4, - 0xd0b4, 0x0168, 0xc0b4, 0x70d6, 0x00c6, 0x70b8, 0xa065, 0x6008, - 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x0005, - 0x7014, 0xa005, 0x1138, 0x70d4, 0xd0b4, 0x0128, 0x70b8, 0xac06, - 0x1110, 0x0c29, 0x0005, 0x0016, 0x71a4, 0xa186, 0x0001, 0x0528, - 0x00d6, 0x0026, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b4, 0x2068, - 0x6800, 0xac06, 0x0120, 0x8211, 0x01b0, 0x00c9, 0x0cc8, 0x00c6, - 0x2100, 0x2011, 0x0001, 0xa212, 0x70b4, 0x2068, 0x6800, 0x2060, - 0x6008, 0xa084, 0xfbef, 0x600a, 0x8211, 0x0110, 0x0041, 0x0cb0, - 0x70a7, 0x0001, 0x00ce, 0x002e, 0x00de, 0x001e, 0x0005, 0xade8, - 0x0005, 0x70ac, 0xad06, 0x1110, 0x70a8, 0x2068, 0x0005, 0x080c, - 0x3a8d, 0x1904, 0x248c, 0x707c, 0x2068, 0x7774, 0x080c, 0x396d, - 0x2c50, 0x080c, 0x3b28, 0x789b, 0x0080, 0x6814, 0xa084, 0x001f, - 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004, 0x0804, - 0x270f, 0x080c, 0x3a8d, 0x1904, 0x248c, 0x789b, 0x0080, 0x7060, - 0x2068, 0x6f14, 0x70d4, 0xd0b4, 0x0168, 0xc0b4, 0x70d6, 0x00c6, - 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, - 0x601a, 0x00ce, 0x080c, 0x396d, 0x2c50, 0x080c, 0x3b28, 0x6824, - 0xa005, 0x0130, 0xa082, 0x0006, 0x0208, 0x0010, 0x6827, 0x0005, - 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x2031, 0x0020, 0x2041, - 0x0001, 0x2001, 0x0003, 0x0804, 0x270f, 0xc28d, 0x72d6, 0x72c0, - 0xa200, 0xa015, 0x7154, 0x8108, 0xa12a, 0x0208, 0x71c0, 0x2164, - 0x6504, 0x85ff, 0x1170, 0x7156, 0x8421, 0x1da8, 0x70d4, 0xd08c, - 0x0128, 0x70d0, 0xa005, 0x1110, 0x70d3, 0x000a, 0x0005, 0x2200, - 0x0c90, 0x70d4, 0xc08c, 0x70d6, 0x70d3, 0x0000, 0x6034, 0xa005, - 0x1db0, 0x6708, 0xa784, 0x073f, 0x01d0, 0xd7d4, 0x1d80, 0xa784, - 0x0021, 0x1d68, 0xa784, 0x0002, 0x0130, 0xa784, 0x0004, 0x0d38, - 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, 0x1d08, 0xa784, 0x0100, - 0x0130, 0x6018, 0xa005, 0x19d8, 0xa7bc, 0xfeff, 0x670a, 0x2568, - 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e, 0x6318, 0x0128, 0x601c, - 0xa302, 0x0220, 0x0118, 0x0858, 0x83ff, 0x1948, 0x2d58, 0x2c50, - 0x7156, 0xd7bc, 0x1110, 0x7028, 0x6022, 0xc7bc, 0x670a, 0x68c0, - 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041, 0x0001, 0x6b14, 0xa39c, - 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0110, 0xd684, 0x0110, 0xa39c, - 0xffbf, 0xd6a4, 0x0110, 0xa39d, 0x0020, 0xa684, 0x000e, 0x1904, - 0x26c1, 0xc7a5, 0x670a, 0x2c00, 0x68c6, 0x77a4, 0xa786, 0x0001, - 0x1178, 0x70d4, 0xd0b4, 0x1160, 0x7000, 0xa082, 0x0002, 0x1240, - 0x7830, 0xd0bc, 0x1128, 0x789b, 0x0080, 0x7baa, 0x0804, 0x2708, - 0x8739, 0x77a6, 0x2750, 0x77b0, 0xa7b0, 0x0005, 0x70ac, 0xa606, - 0x1108, 0x76a8, 0x76b2, 0x2c3a, 0x8738, 0x2d3a, 0x8738, 0x283a, - 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, 0xd0bc, 0x0150, 0x2091, - 0x8000, 0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, 0x2091, 0x8000, - 0x2090, 0xaad5, 0x0000, 0x0120, 0x8421, 0x2200, 0x1904, 0x2612, - 0x0005, 0xd1dc, 0x0904, 0x35d5, 0x2029, 0x0020, 0xd69c, 0x1120, - 0x8528, 0xd68c, 0x1108, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, - 0xa18c, 0x00ff, 0x70cc, 0xa160, 0x2c64, 0x8cff, 0x0188, 0x6014, - 0xa706, 0x1dd0, 0x60b8, 0x8001, 0x60ba, 0x1d88, 0x2a60, 0x6008, - 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x1904, 0x2612, 0x0005, - 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840, 0x6008, 0xc0d5, - 0x600a, 0x77a4, 0xa786, 0x0001, 0x1904, 0x2698, 0x70d4, 0xd0b4, - 0x1904, 0x2698, 0x7000, 0xa082, 0x0002, 0x1a04, 0x2698, 0x7830, - 0xd0bc, 0x1904, 0x2698, 0x789b, 0x0080, 0x7baa, 0x7daa, 0x79aa, - 0x2001, 0x0002, 0x0006, 0x6018, 0x8000, 0x601a, 0x0008, 0x0006, - 0x2960, 0x6104, 0x2a60, 0x080c, 0x3b3b, 0x1590, 0xa184, 0x0018, - 0x0180, 0xa184, 0x0010, 0x0118, 0x080c, 0x3776, 0x1548, 0xa184, - 0x0008, 0x0138, 0x69a0, 0xa184, 0x0600, 0x1118, 0x080c, 0x3696, - 0x00f8, 0x69a0, 0xa184, 0x1e00, 0x0528, 0xa184, 0x0800, 0x0178, - 0x00c6, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, - 0x0010, 0x6106, 0x00ce, 0x080c, 0x3776, 0x1150, 0x69a0, 0xa184, - 0x0200, 0x0118, 0x080c, 0x36d9, 0x0018, 0xa184, 0x0400, 0x19f0, - 0x69a0, 0xa184, 0x1000, 0x0130, 0x6914, 0xa18c, 0xff00, 0x810f, - 0x080c, 0x231f, 0x002e, 0xa68c, 0x00e0, 0xa684, 0x0060, 0x0128, - 0xa086, 0x0060, 0x1110, 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, - 0x789b, 0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, - 0x0168, 0xc0fc, 0x7087, 0x0000, 0xa08a, 0x000d, 0x0328, 0xa08a, - 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, 0x78aa, 0x3518, - 0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b, - 0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0, - 0xa286, 0x0020, 0x1508, 0x70d4, 0xc0b5, 0x70d6, 0x2c00, 0x70ba, - 0x2d00, 0x70be, 0x6814, 0xc0fc, 0x8007, 0x7882, 0xa286, 0x0002, - 0x0904, 0x27e0, 0x70a4, 0x8000, 0x70a6, 0x74b4, 0xa498, 0x0005, - 0x70ac, 0xa306, 0x1108, 0x73a8, 0x73b6, 0xa286, 0x0010, 0x0904, - 0x248c, 0x00de, 0x00ce, 0x0005, 0x7000, 0xa005, 0x19e0, 0xa286, - 0x0002, 0x1904, 0x27f7, 0x080c, 0x3a8d, 0x19a8, 0x6814, 0xc0fc, - 0x8007, 0x7882, 0x2091, 0x8000, 0x781b, 0x0068, 0x68b4, 0x785a, - 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, - 0x7808, 0xc08d, 0x780a, 0x0126, 0x00d6, 0x00c6, 0x70d4, 0xa084, - 0x2e00, 0x2090, 0x00ce, 0x00de, 0x012e, 0x2900, 0x705a, 0x68bc, - 0x7042, 0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, - 0x7830, 0xd0bc, 0x0140, 0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, - 0x2091, 0x8000, 0x2090, 0x70a4, 0xa005, 0x1108, 0x0005, 0x8421, - 0x0de8, 0x7250, 0x70c0, 0xa200, 0xa015, 0x0804, 0x2612, 0xa286, - 0x0010, 0x1560, 0x080c, 0x3a8d, 0x1904, 0x278b, 0x6814, 0xc0fc, - 0x8007, 0x7882, 0x781b, 0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, - 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, 0x70a4, - 0x8000, 0x70a6, 0x74b4, 0xa490, 0x0005, 0x70ac, 0xa206, 0x1108, - 0x72a8, 0x72b6, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003, 0x0002, - 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x0005, 0x6bb4, 0xa39d, - 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x6b94, 0x7bd6, - 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x0068, 0x2900, 0x705a, - 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605, 0x0170, 0x70d4, - 0xa084, 0x2e00, 0xa086, 0x2600, 0x1118, 0x2009, 0x0000, 0x0010, - 0x2009, 0x0001, 0xa284, 0x000f, 0x0023, 0xad80, 0x0009, 0x7046, - 0x0005, 0x2859, 0x3fb8, 0x3fb8, 0x3fa6, 0x3fb8, 0x2859, 0x2859, - 0x2859, 0x080c, 0x243b, 0x7808, 0xa084, 0xfffd, 0x780a, 0x00f6, - 0x2079, 0x4300, 0x78ac, 0x00fe, 0xd084, 0x01c0, 0x7064, 0xa086, - 0x0001, 0x1118, 0x7066, 0x0804, 0x293a, 0x7064, 0xa086, 0x0005, - 0x1158, 0x707c, 0x2068, 0x681b, 0x0004, 0x6817, 0x0000, 0x6820, - 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7067, 0x0000, 0x70a7, 0x0000, - 0x70a8, 0x70b2, 0x70b6, 0x080c, 0x256f, 0x0156, 0x2011, 0x0004, - 0x7164, 0xa186, 0x0001, 0x0170, 0xa186, 0x0007, 0x1118, 0x701f, - 0x0005, 0x0040, 0x701f, 0x0001, 0x7067, 0x0000, 0x70d4, 0xc0c5, - 0x70d6, 0x0010, 0x7067, 0x0000, 0x2001, 0x430a, 0x2004, 0xa084, - 0x00ff, 0xa086, 0x0018, 0x0130, 0x7018, 0x7016, 0xa005, 0x1110, - 0x70a7, 0x0001, 0x0066, 0x080c, 0x3d52, 0x20a9, 0x0010, 0x2039, - 0x0000, 0x080c, 0x3861, 0xa7b8, 0x0100, 0x1f04, 0x28b1, 0x006e, - 0x7000, 0x0002, 0x28ee, 0x28cc, 0x28cc, 0x28c4, 0x28ee, 0x28ee, - 0x28ee, 0x28c2, 0x080c, 0x243b, 0x7060, 0xa005, 0x0538, 0xad06, - 0x1118, 0x6800, 0x7062, 0x0080, 0x6820, 0xd084, 0x1148, 0x6f14, - 0x080c, 0x396d, 0x6008, 0xc0d4, 0x600a, 0x080c, 0x35ab, 0x0020, - 0x705c, 0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, - 0xd0fc, 0x0108, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820, - 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1d3d, 0xb284, 0x0800, - 0x0118, 0x2021, 0x8ad0, 0x0010, 0x2021, 0x89c0, 0x080c, 0x293f, - 0xb284, 0x0800, 0x0118, 0x2021, 0x4398, 0x0010, 0x2021, 0x4358, - 0x04f1, 0x20a9, 0x0101, 0xb284, 0x0800, 0x0118, 0x2021, 0x89d0, - 0x0010, 0x2021, 0x88c0, 0x0499, 0x8420, 0x1f04, 0x290b, 0xb284, - 0x0600, 0x0118, 0x2061, 0x48c0, 0x0010, 0x2061, 0x68c0, 0x2021, + 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, 0xa28c, 0x0020, 0x0118, + 0xc2ac, 0xa39d, 0x4000, 0xc3ec, 0xd3b4, 0x1108, 0xc3ed, 0x62ae, + 0x2010, 0x60a4, 0x63ae, 0x2018, 0x00ce, 0x0005, 0x2091, 0x8000, + 0x00c6, 0x00e6, 0x6818, 0xa005, 0x0904, 0x2427, 0xd1fc, 0x0118, + 0x2061, 0x8dd0, 0x0010, 0x2061, 0x8cc0, 0x080c, 0x242f, 0x0560, + 0x20a9, 0x0101, 0xd1fc, 0x0118, 0x2061, 0x8cd0, 0x0010, 0x2061, + 0x8bc0, 0x00c6, 0x080c, 0x242f, 0x0128, 0x00ce, 0x8c60, 0x1f04, + 0x23e9, 0x04a8, 0x000e, 0xd1fc, 0x0128, 0xa082, 0x8cd0, 0x2071, + 0x4680, 0x0020, 0xa082, 0x8bc0, 0x2071, 0x4640, 0x7076, 0x7172, + 0x2138, 0x2001, 0x0004, 0x7062, 0x707f, 0x000f, 0x71d0, 0xc1c4, + 0x71d2, 0x080c, 0x22a4, 0x00c0, 0xd1fc, 0x1118, 0x2071, 0x4640, + 0x0010, 0x2071, 0x4680, 0x6020, 0xc0dd, 0x6022, 0x7172, 0x2138, + 0x2c00, 0x707a, 0x2001, 0x0006, 0x7062, 0x707f, 0x000f, 0x71d0, + 0xc1c4, 0x71d2, 0x080c, 0x22a4, 0x2001, 0x0000, 0x0010, 0x2001, + 0x0001, 0x2091, 0x8001, 0xa005, 0x00ee, 0x00ce, 0x0005, 0x2c04, + 0xa005, 0x0170, 0x2060, 0x6010, 0xa306, 0x1140, 0x600c, 0xa206, + 0x1128, 0x6014, 0xa106, 0x1110, 0xa006, 0x0020, 0x6000, 0x0c80, + 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x2079, 0x4680, + 0x2071, 0x0100, 0xd1bc, 0x1120, 0x2079, 0x4640, 0x2071, 0x0200, + 0x7920, 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x1110, 0x001e, 0x0060, + 0x810b, 0x810b, 0x810b, 0x810b, 0x000e, 0xa18d, 0x0800, 0xd0bc, + 0x1110, 0xa18d, 0x0f00, 0x2104, 0x00ee, 0x00fe, 0x0005, 0x2001, + 0x4601, 0x2004, 0xd0ac, 0x1138, 0x68e4, 0xd0ac, 0x0120, 0xa084, + 0x0006, 0x1108, 0x0009, 0x0005, 0x6014, 0x00e6, 0x0036, 0x2018, + 0x2071, 0x4b40, 0xd0fc, 0x1110, 0x2071, 0x4ac0, 0x8007, 0xa084, + 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, 0xa084, 0x000a, + 0x1904, 0x24fa, 0x7108, 0xa194, 0xff00, 0x0904, 0x24fa, 0xa18c, + 0x00ff, 0x701c, 0xa084, 0xff00, 0x01c0, 0x7004, 0xa085, 0x003a, + 0x7006, 0x2001, 0x0009, 0xa102, 0x16d8, 0x2001, 0x000a, 0xa102, + 0x16d0, 0x2001, 0x000c, 0xa102, 0x16c8, 0x701c, 0xa084, 0x00ff, + 0x701e, 0x7004, 0xa084, 0xffdf, 0x7006, 0x2001, 0x000a, 0xa106, + 0x01a8, 0x2001, 0x000c, 0xa106, 0x01a0, 0x2001, 0x0012, 0xa106, + 0x0198, 0x2001, 0x0014, 0xa106, 0x0190, 0x2001, 0x0019, 0xa106, + 0x0188, 0x2001, 0x0032, 0xa106, 0x0180, 0x00d8, 0x2009, 0x000c, + 0x00d0, 0x2009, 0x0012, 0x00b8, 0x2009, 0x0014, 0x00a0, 0x2009, + 0x0019, 0x0088, 0x2009, 0x0020, 0x0070, 0x2009, 0x003f, 0x0058, + 0x2009, 0x000a, 0x0040, 0x2009, 0x000c, 0x0028, 0x2009, 0x0019, + 0x0010, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x7004, 0xa085, + 0x000a, 0x7006, 0x2071, 0x4600, 0x7004, 0xd0bc, 0x0158, 0xd3fc, + 0x1120, 0x73ea, 0x2071, 0x4640, 0x0018, 0x73ee, 0x2071, 0x4680, + 0x701f, 0x000d, 0x003e, 0x00ee, 0x0005, 0x2001, 0x01ff, 0x2004, + 0xd0fc, 0x11d0, 0x2001, 0x04fd, 0x2004, 0xa082, 0x0005, 0x12a0, + 0x2071, 0x0200, 0x71ec, 0xa18c, 0x1c00, 0x810f, 0x810c, 0x810c, + 0x2079, 0x0100, 0x78ec, 0xa084, 0x1c00, 0x8007, 0x8004, 0x8004, + 0xa105, 0xa08a, 0x0007, 0x0208, 0x0005, 0x0002, 0x254b, 0x2532, + 0x254b, 0x2532, 0x2525, 0x253f, 0x2525, 0x7008, 0xa084, 0xc3ff, + 0xa085, 0x3000, 0x700a, 0x7808, 0xa084, 0xc3ff, 0xa085, 0x3000, + 0x780a, 0x0005, 0x7008, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x700a, + 0x7808, 0xa084, 0xc3ff, 0xa085, 0x2000, 0x780a, 0x0005, 0x7008, + 0xa084, 0xc3ff, 0xa085, 0x0c00, 0x700a, 0x7808, 0xa084, 0xc3ff, + 0xa085, 0x0c00, 0x780a, 0x0005, 0x0e04, 0x254c, 0x2091, 0x8000, + 0x2071, 0x0000, 0x0006, 0x7018, 0xd084, 0x1de8, 0x000e, 0x2071, + 0x0010, 0x70ca, 0x000e, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x0a04, + 0x70df, 0x0020, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, + 0x0cf8, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708a, 0x758e, + 0x7492, 0x7696, 0x779a, 0xa594, 0x003f, 0xd4f4, 0x0138, 0xd7bc, + 0x1128, 0xa784, 0x007d, 0x1904, 0x3c74, 0x0871, 0xa49c, 0x000f, + 0xa382, 0x0004, 0x0320, 0xa3a6, 0x0007, 0x1930, 0x2418, 0x8507, + 0xa084, 0x000f, 0x0002, 0x2b49, 0x2c34, 0x2c72, 0x2ed8, 0x3256, + 0x32ad, 0x3353, 0x33e2, 0x34b6, 0x3588, 0x259e, 0x259b, 0x2970, + 0x2a56, 0x322a, 0x259b, 0x080c, 0x254c, 0x0005, 0xa006, 0x0038, + 0x7808, 0xc08d, 0x780a, 0xa006, 0x7002, 0x704a, 0x7042, 0x70ce, + 0x705c, 0xa005, 0x1904, 0x26ec, 0x7060, 0xa084, 0x0007, 0x0002, + 0x25b8, 0x2626, 0x262e, 0x2637, 0x2640, 0x26d2, 0x2649, 0x2626, + 0x7830, 0xd0bc, 0x1d10, 0x71d0, 0xd1bc, 0x19f8, 0xd1b4, 0x1904, + 0x2603, 0x70a0, 0xa086, 0x0001, 0x09c0, 0x70b0, 0xa06d, 0x6800, + 0xa065, 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa, 0x6808, 0xa045, + 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0118, 0x69bc, + 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0010, 0x0804, + 0x281f, 0x705c, 0xa005, 0x1904, 0x259d, 0x00c6, 0x00d6, 0x70b0, + 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0080, 0x6b0c, 0x7baa, + 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, + 0x0118, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, + 0x0020, 0x0804, 0x281f, 0x080c, 0x3c33, 0x1904, 0x259d, 0x781b, + 0x0068, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, + 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, 0x68bc, 0x703e, + 0xc1b4, 0x71d2, 0x70b4, 0xa065, 0x68c0, 0x7056, 0x7003, 0x0002, + 0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005, 0x080c, 0x3c33, + 0x1120, 0x781b, 0x0054, 0x7003, 0x0004, 0x0005, 0x080c, 0x3c33, + 0x1128, 0x2011, 0x000c, 0x0419, 0x7003, 0x0004, 0x0005, 0x080c, + 0x3c33, 0x1128, 0x2011, 0x0006, 0x00d1, 0x7003, 0x0004, 0x0005, + 0x080c, 0x3c33, 0x1128, 0x2011, 0x000d, 0x0089, 0x7003, 0x0004, + 0x0005, 0x080c, 0x3c33, 0x1150, 0x2011, 0x0006, 0x0041, 0x7078, + 0x707b, 0x0000, 0x2068, 0x704a, 0x7003, 0x0004, 0x0005, 0x7170, + 0xc1fc, 0x8107, 0x7882, 0x789b, 0x0080, 0xa286, 0x000c, 0x1120, + 0x7aaa, 0x2001, 0x0001, 0x0098, 0xa18c, 0x001f, 0xa18d, 0x00c0, + 0x79aa, 0xa286, 0x000d, 0x0120, 0x7aaa, 0x2001, 0x0002, 0x0038, + 0x78ab, 0x0020, 0x7174, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b, + 0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x0113, 0x080c, 0x3c46, + 0x707f, 0x000f, 0x70d0, 0xd0b4, 0x0168, 0xc0b4, 0x70d2, 0x00c6, + 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, + 0x601a, 0x00ce, 0x0005, 0x7014, 0xa005, 0x1138, 0x70d0, 0xd0b4, + 0x0128, 0x70b4, 0xac06, 0x1110, 0x0c29, 0x0005, 0x0016, 0x71a0, + 0xa186, 0x0001, 0x0528, 0x00d6, 0x0026, 0x2100, 0x2011, 0x0001, + 0xa212, 0x70b0, 0x2068, 0x6800, 0xac06, 0x0120, 0x8211, 0x01b0, + 0x00c9, 0x0cc8, 0x00c6, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b0, + 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, 0x600a, 0x8211, + 0x0110, 0x0041, 0x0cb0, 0x70a3, 0x0001, 0x00ce, 0x002e, 0x00de, + 0x001e, 0x0005, 0xade8, 0x0005, 0x70a8, 0xad06, 0x1110, 0x70a4, + 0x2068, 0x0005, 0x080c, 0x3c33, 0x1904, 0x259d, 0x7078, 0x2068, + 0x7770, 0x080c, 0x3b6f, 0x2c50, 0x080c, 0x3cce, 0x789b, 0x0080, + 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, + 0x2001, 0x0004, 0x0804, 0x2824, 0x080c, 0x3c33, 0x1904, 0x259d, + 0x789b, 0x0080, 0x705c, 0x2068, 0x6f14, 0x70d0, 0xd0b4, 0x0168, + 0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef, + 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x080c, 0x3b6f, 0x2c50, + 0x080c, 0x3cce, 0x6824, 0xa005, 0x0130, 0xa082, 0x0006, 0x0208, + 0x0010, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, + 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0804, 0x2824, + 0xc28d, 0x72d2, 0x72bc, 0xa200, 0xa015, 0x7150, 0x8108, 0xa12a, + 0x0208, 0x71bc, 0x2164, 0x6504, 0x85ff, 0x1170, 0x7152, 0x8421, + 0x1da8, 0x70d0, 0xd08c, 0x0128, 0x70cc, 0xa005, 0x1110, 0x70cf, + 0x000a, 0x0005, 0x2200, 0x0c90, 0x70d0, 0xc08c, 0x70d2, 0x70cf, + 0x0000, 0x6034, 0xa005, 0x1db0, 0x6708, 0xa784, 0x073f, 0x01d0, + 0xd7d4, 0x1d80, 0xa784, 0x0021, 0x1d68, 0xa784, 0x0002, 0x0130, + 0xa784, 0x0004, 0x0d38, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, + 0x1d08, 0xa784, 0x0100, 0x0130, 0x6018, 0xa005, 0x19d8, 0xa7bc, + 0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, 0x000e, + 0x6318, 0x0128, 0x601c, 0xa302, 0x0220, 0x0118, 0x0858, 0x83ff, + 0x1948, 0x2d58, 0x2c50, 0x7152, 0xd7bc, 0x1120, 0x7028, 0x6022, + 0x603a, 0x0010, 0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100, + 0x2a60, 0x2041, 0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, + 0xd1fc, 0x0110, 0xd684, 0x0110, 0xa39c, 0xffbf, 0xd6a4, 0x0110, + 0xa39d, 0x0020, 0xa684, 0x000e, 0x1904, 0x27d6, 0xc7a5, 0x670a, + 0x2c00, 0x68c6, 0x77a0, 0xa786, 0x0001, 0x1178, 0x70d0, 0xd0b4, + 0x1160, 0x7000, 0xa082, 0x0002, 0x1240, 0x7830, 0xd0bc, 0x1128, + 0x789b, 0x0080, 0x7baa, 0x0804, 0x281d, 0x8739, 0x77a2, 0x2750, + 0x77ac, 0xa7b0, 0x0005, 0x70a8, 0xa606, 0x1108, 0x76a4, 0x76ae, + 0x2c3a, 0x8738, 0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738, + 0x253a, 0x7830, 0xd0bc, 0x0150, 0x2091, 0x8000, 0x2091, 0x303d, + 0x70d0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000, + 0x0120, 0x8421, 0x2200, 0x1904, 0x2725, 0x0005, 0xd1dc, 0x0904, + 0x37ce, 0x2029, 0x0020, 0xd69c, 0x1120, 0x8528, 0xd68c, 0x1108, + 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, 0x00ff, 0x70c8, + 0xa160, 0x2c64, 0x8cff, 0x0188, 0x6014, 0xa706, 0x1dd0, 0x60b8, + 0x8001, 0x60ba, 0x1d88, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, + 0x2200, 0x8421, 0x1904, 0x2725, 0x0005, 0x2a60, 0x610e, 0x69be, + 0x2c00, 0x68c6, 0x8840, 0x6008, 0xc0d5, 0x600a, 0x77a0, 0xa786, + 0x0001, 0x1904, 0x27ad, 0x70d0, 0xd0b4, 0x1904, 0x27ad, 0x7000, + 0xa082, 0x0002, 0x1a04, 0x27ad, 0x7830, 0xd0bc, 0x1904, 0x27ad, + 0x789b, 0x0080, 0x7baa, 0x7daa, 0x79aa, 0x2001, 0x0002, 0x0006, + 0x6018, 0x8000, 0x601a, 0x0008, 0x0006, 0x2960, 0x6104, 0x2a60, + 0x080c, 0x3ce1, 0x1590, 0xa184, 0x0018, 0x0180, 0xa184, 0x0010, + 0x0118, 0x080c, 0x3977, 0x1548, 0xa184, 0x0008, 0x0138, 0x69a0, + 0xa184, 0x0600, 0x1118, 0x080c, 0x3895, 0x00f8, 0x69a0, 0xa184, + 0x1e00, 0x0528, 0xa184, 0x0800, 0x0178, 0x00c6, 0x2960, 0x6000, + 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, 0x0010, 0x6106, 0x00ce, + 0x080c, 0x3977, 0x1150, 0x69a0, 0xa184, 0x0200, 0x0118, 0x080c, + 0x38da, 0x0018, 0xa184, 0x0400, 0x19f0, 0x69a0, 0xa184, 0x1000, + 0x0130, 0x6914, 0xa18c, 0xff00, 0x810f, 0x080c, 0x239c, 0x002e, + 0xa68c, 0x00e0, 0xa684, 0x0060, 0x0128, 0xa086, 0x0060, 0x1110, + 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b, 0x0060, 0x2800, + 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0168, 0xc0fc, 0x7083, + 0x0000, 0xa08a, 0x000d, 0x0328, 0xa08a, 0x000c, 0x7182, 0x2001, + 0x000c, 0x800c, 0x7186, 0x78aa, 0x3518, 0x3340, 0x3428, 0x8000, + 0x80ac, 0xaf80, 0x002b, 0x20a0, 0x789b, 0x0000, 0xad80, 0x000b, + 0x2098, 0x53a6, 0x23a8, 0x2898, 0x25a0, 0xa286, 0x0020, 0x1508, + 0x70d0, 0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00, 0x70ba, 0x6814, + 0xc0fc, 0x8007, 0x7882, 0xa286, 0x0002, 0x0904, 0x28f5, 0x70a0, + 0x8000, 0x70a2, 0x74b0, 0xa498, 0x0005, 0x70a8, 0xa306, 0x1108, + 0x73a4, 0x73b2, 0xa286, 0x0010, 0x0904, 0x259d, 0x00de, 0x00ce, + 0x0005, 0x7000, 0xa005, 0x19e0, 0xa286, 0x0002, 0x1904, 0x290c, + 0x080c, 0x3c33, 0x19a8, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091, + 0x8000, 0x781b, 0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, + 0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a, + 0x0126, 0x00d6, 0x00c6, 0x70d0, 0xa084, 0x2e00, 0x2090, 0x00ce, + 0x00de, 0x012e, 0x2900, 0x7056, 0x68bc, 0x703e, 0x7003, 0x0002, + 0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x7830, 0xd0bc, 0x0140, + 0x2091, 0x303d, 0x70d0, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, + 0x70a0, 0xa005, 0x1108, 0x0005, 0x8421, 0x0de8, 0x724c, 0x70bc, + 0xa200, 0xa015, 0x0804, 0x2725, 0xa286, 0x0010, 0x1560, 0x080c, + 0x3c33, 0x1904, 0x28a0, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x781b, + 0x0068, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, + 0x78da, 0x7808, 0xc08d, 0x780a, 0x70a0, 0x8000, 0x70a2, 0x74b0, + 0xa490, 0x0005, 0x70a8, 0xa206, 0x1108, 0x72a4, 0x72b2, 0x2900, + 0x7056, 0x68bc, 0x703e, 0x7003, 0x0002, 0x2d00, 0x704a, 0xad80, + 0x0009, 0x7042, 0x0005, 0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814, + 0xc0fc, 0x8007, 0x7882, 0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2, + 0x7eda, 0x781b, 0x0068, 0x2900, 0x7056, 0x7202, 0x7808, 0xc08d, + 0x780a, 0x2300, 0xa605, 0x0170, 0x70d0, 0xa084, 0x2e00, 0xa086, + 0x2600, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009, 0x0001, 0xa284, + 0x000f, 0x0023, 0xad80, 0x0009, 0x7042, 0x0005, 0x296e, 0x41d9, + 0x41d9, 0x41c7, 0x41d9, 0x296e, 0x296e, 0x296e, 0x080c, 0x254c, + 0x7808, 0xa084, 0xfffd, 0x780a, 0x00f6, 0x2079, 0x4600, 0x78ac, + 0x00fe, 0xd084, 0x01b0, 0x7060, 0xa086, 0x0001, 0x0904, 0x2a32, + 0x7060, 0xa086, 0x0005, 0x1158, 0x7078, 0x2068, 0x681b, 0x0004, + 0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7063, + 0x0000, 0x70a3, 0x0000, 0x70a4, 0x70ae, 0x70b2, 0x080c, 0x2682, + 0x0156, 0x2011, 0x0004, 0x7160, 0xa186, 0x0001, 0x0160, 0xa186, + 0x0007, 0x1118, 0x701f, 0x0005, 0x0030, 0x701f, 0x0001, 0x70d0, + 0xc0c5, 0x70d2, 0x0000, 0x2001, 0x460a, 0x2004, 0xa084, 0x00ff, + 0xa086, 0x0018, 0x0130, 0x7018, 0x7016, 0xa005, 0x1110, 0x70a3, + 0x0001, 0x0066, 0x080c, 0x3f26, 0x20a9, 0x0010, 0x2039, 0x0000, + 0x080c, 0x3a66, 0xa7b8, 0x0100, 0x1f04, 0x29c0, 0x006e, 0x7000, + 0x0002, 0x29fd, 0x29db, 0x29db, 0x29d3, 0x29fd, 0x29fd, 0x29fd, + 0x29d1, 0x080c, 0x254c, 0x705c, 0xa005, 0x0538, 0xad06, 0x1118, + 0x6800, 0x705e, 0x0080, 0x6820, 0xd084, 0x1148, 0x6f14, 0x080c, + 0x3b6f, 0x6008, 0xc0d4, 0x600a, 0x080c, 0x37a4, 0x0020, 0x7058, + 0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc, + 0x0108, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820, 0xa084, + 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1da2, 0x2011, 0x0004, 0x74c8, + 0xa4a0, 0x0100, 0x04b1, 0xaea0, 0x0017, 0x0499, 0x20a9, 0x0101, + 0x74c8, 0x0479, 0x8420, 0x1f04, 0x2a09, 0x70c0, 0x2060, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0198, 0x6018, 0x0016, - 0x0006, 0x2011, 0x4302, 0x220c, 0xa102, 0x2012, 0x000e, 0x001e, - 0xa102, 0x0338, 0x6012, 0x1128, 0x2011, 0x4304, 0x2204, 0xc0a5, - 0x2012, 0x601b, 0x0000, 0xace0, 0x0010, 0x1f04, 0x291b, 0x8421, - 0x1d00, 0x015e, 0x7003, 0x0000, 0x704f, 0x0000, 0x0005, 0x0046, - 0x2404, 0xa005, 0x01a8, 0x2068, 0x6800, 0x0006, 0x6a1a, 0x6817, - 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, - 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1d3d, 0x000e, 0x0c48, - 0x004e, 0x2023, 0x0000, 0x0005, 0xa282, 0x0003, 0x0310, 0x080c, - 0x243b, 0x2300, 0x0002, 0x2966, 0x29e3, 0x29fd, 0xa282, 0x0002, - 0x0110, 0x080c, 0x243b, 0x7064, 0x7067, 0x0000, 0x7083, 0x0000, - 0x0022, 0x77d4, 0xc7c5, 0x77d6, 0x0002, 0x297d, 0x297d, 0x297f, - 0x29b7, 0x35df, 0x297d, 0x29b7, 0x297d, 0x080c, 0x243b, 0x7774, - 0x080c, 0x3861, 0x7774, 0xa7bc, 0x8f00, 0x080c, 0x396d, 0x6018, - 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0x89c0, 0x0010, 0x2021, - 0x8ad0, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c, 0x2a17, 0x01b8, - 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021, 0x88c0, 0x0010, - 0x2021, 0x89d0, 0x0046, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c, - 0x2a17, 0x004e, 0x0118, 0x8420, 0x1f04, 0x29a2, 0x015e, 0x8738, - 0xa784, 0x001f, 0x1990, 0x0804, 0x248f, 0x0804, 0x248f, 0x7774, - 0x080c, 0x396d, 0x6018, 0xa005, 0x0520, 0xd7fc, 0x1118, 0x2021, - 0x89c0, 0x0010, 0x2021, 0x8ad0, 0x2009, 0x0005, 0x2011, 0x0020, - 0x080c, 0x2a17, 0x01b0, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, - 0x2021, 0x88c0, 0x0010, 0x2021, 0x89d0, 0x0046, 0x2009, 0x0005, - 0x2011, 0x0020, 0x04e1, 0x004e, 0x0118, 0x8420, 0x1f04, 0x29d5, - 0x015e, 0x0804, 0x248f, 0x2200, 0x0002, 0x29e8, 0x29ea, 0x29ea, - 0x080c, 0x243b, 0x2009, 0x0012, 0x7064, 0xa086, 0x0002, 0x0110, - 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0108, 0x691a, 0x7067, 0x0000, - 0x70d4, 0xc0c5, 0x70d6, 0x0804, 0x3a3f, 0x2200, 0x0002, 0x2a04, - 0x29ea, 0x2a02, 0x080c, 0x243b, 0x080c, 0x3d52, 0x7000, 0xa086, - 0x0002, 0x1904, 0x356d, 0x080c, 0x35c5, 0x6008, 0xa084, 0xfbef, - 0x600a, 0x080c, 0x355f, 0x0904, 0x356d, 0x0804, 0x248f, 0x2404, - 0xa005, 0x0590, 0x2068, 0x2d04, 0x0006, 0x6814, 0xa706, 0x0118, - 0x2d20, 0x000e, 0x0ca8, 0x000e, 0x2022, 0x691a, 0x6817, 0x0000, - 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, - 0x00ff, 0xa205, 0x6822, 0x080c, 0x1d3d, 0x2021, 0x4302, 0x241c, - 0x8319, 0x2322, 0x6010, 0x8001, 0x6012, 0x1128, 0x2021, 0x4304, - 0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x080c, - 0x258b, 0x080c, 0x35c5, 0x0005, 0xa085, 0x0001, 0x0ce0, 0x2300, - 0x0002, 0x2a56, 0x2a54, 0x2abc, 0x080c, 0x243b, 0x78e4, 0xa005, - 0x1708, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104, 0x248c, 0x0010, - 0x0304, 0x248c, 0x2008, 0xa084, 0x0030, 0x1110, 0x0804, 0x30a0, - 0x78ec, 0xa084, 0x0003, 0x0dd0, 0x2100, 0xa084, 0x0007, 0x0002, - 0x2a9f, 0x2aa8, 0x2a95, 0x2a78, 0x3a83, 0x3a83, 0x2a78, 0x2ab2, - 0x080c, 0x243b, 0x7000, 0xa086, 0x0004, 0x1190, 0x7064, 0xa086, - 0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x295c, - 0x7064, 0xa086, 0x0006, 0x0db0, 0x7064, 0xa086, 0x0004, 0x0d90, - 0x79e4, 0x2001, 0x0003, 0x0804, 0x2daa, 0x6818, 0xd0fc, 0x0110, - 0x681b, 0x001d, 0x080c, 0x3837, 0x781b, 0x006e, 0x0005, 0x6818, - 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3837, 0x0804, 0x3a61, - 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3837, 0x781b, - 0x00fa, 0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, - 0x3837, 0x781b, 0x00cb, 0x0005, 0xa584, 0x000f, 0x11c0, 0x7000, - 0x0002, 0x248f, 0x2ac9, 0x2acb, 0x356d, 0x356d, 0x356d, 0x2ac9, - 0x2ac9, 0x080c, 0x243b, 0x080c, 0x35c5, 0x6008, 0xa084, 0xfbef, - 0x600a, 0x080c, 0x355f, 0x0904, 0x356d, 0x0804, 0x248f, 0x78e4, - 0xa005, 0x1b04, 0x2a7a, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104, - 0x2a7a, 0x0010, 0x0304, 0x2a7a, 0x2008, 0xa084, 0x0030, 0x1118, - 0x781b, 0x0068, 0x0005, 0x78ec, 0xa084, 0x0003, 0x0dc8, 0x2100, - 0xa184, 0x0007, 0x0002, 0x2b02, 0x2b06, 0x2afd, 0x2afb, 0x3a83, - 0x3a83, 0x2afb, 0x3a7d, 0x080c, 0x243b, 0x080c, 0x383d, 0x781b, - 0x006e, 0x0005, 0x080c, 0x383d, 0x0804, 0x3a61, 0x080c, 0x383d, - 0x781b, 0x00fa, 0x0005, 0x080c, 0x383d, 0x781b, 0x00cb, 0x0005, - 0x2300, 0x0002, 0x2b17, 0x2b15, 0x2b19, 0x080c, 0x243b, 0x0804, - 0x3220, 0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, - 0x0904, 0x3220, 0x78ec, 0xa084, 0x0003, 0x0904, 0x3220, 0xa184, - 0x0100, 0x0d98, 0xa184, 0x0007, 0x0002, 0x2b35, 0x2b06, 0x2a95, - 0x3a3f, 0x3a83, 0x3a83, 0x3a3f, 0x3a7d, 0x080c, 0x3a4b, 0x0005, - 0xa282, 0x0005, 0x0310, 0x080c, 0x243b, 0x7898, 0x2040, 0x2300, - 0x0002, 0x2b44, 0x2d41, 0x2d4b, 0x2200, 0x0002, 0x2b60, 0x2b4d, - 0x2b60, 0x2b4b, 0x2d25, 0x080c, 0x243b, 0x789b, 0x0018, 0x78a8, - 0x2010, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0a04, 0x3809, 0xa08a, - 0x0004, 0x1a04, 0x3809, 0x0002, 0x3809, 0x3809, 0x3809, 0x37bf, - 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0148, 0x0804, 0x3809, - 0x7000, 0xa005, 0x1dd8, 0x2011, 0x0004, 0x0804, 0x33b2, 0xa184, - 0x00ff, 0xa08a, 0x0010, 0x1a04, 0x3809, 0x0002, 0x2b88, 0x2b86, - 0x2b9a, 0x2b9e, 0x2c3c, 0x3809, 0x3809, 0x2c3e, 0x3809, 0x3809, - 0x2d21, 0x2d21, 0x3809, 0x3809, 0x3809, 0x2d23, 0x080c, 0x243b, - 0xd6e4, 0x0140, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a, 0x781b, - 0x00c6, 0x0005, 0x6818, 0xd0fc, 0x0118, 0x681b, 0x001d, 0x0c90, - 0x0804, 0x3a3f, 0x681b, 0x001d, 0x0804, 0x3831, 0x6920, 0x6922, - 0xa684, 0x1800, 0x15e0, 0x6820, 0xd084, 0x1904, 0x2be7, 0x6818, - 0xa086, 0x0008, 0x1110, 0x681b, 0x0000, 0xd6d4, 0x0568, 0xd6bc, - 0x0558, 0x7087, 0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, - 0x0718, 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, - 0x789b, 0x0061, 0x78aa, 0x0156, 0x0136, 0x0146, 0x0016, 0x3208, - 0xa18c, 0x0600, 0x0118, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, - 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, - 0x53a6, 0x014e, 0x013e, 0x015e, 0x781b, 0x0071, 0x0005, 0xd6e4, - 0x0130, 0x781b, 0x0083, 0x0005, 0x781b, 0x0083, 0x0005, 0xa684, - 0x0060, 0x0dd0, 0xd6dc, 0x0dc0, 0xd6fc, 0x01a0, 0xc6fc, 0x7e5a, - 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x8007, 0xa084, 0x007f, 0xa108, - 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, - 0xa303, 0x68ae, 0xd6f4, 0x0118, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, - 0xa086, 0x0003, 0x1148, 0x0006, 0x080c, 0x3d52, 0x080c, 0x3fb8, - 0x000e, 0x781b, 0x0080, 0x0005, 0xa006, 0x080c, 0x4083, 0x6ab0, - 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0120, 0x2200, 0xa422, - 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, - 0x2300, 0xa405, 0x1130, 0xc6f5, 0x7e5a, 0x6eb6, 0x781b, 0x0080, - 0x0005, 0x781b, 0x0080, 0x2200, 0xa115, 0x1118, 0x080c, 0x3fb8, - 0x0005, 0x080c, 0x3fe5, 0x0005, 0x080c, 0x243b, 0x0804, 0x2cbd, - 0x00c6, 0x7058, 0x2060, 0x7aa8, 0xa294, 0x00ff, 0xa286, 0x0004, - 0x11d8, 0x6920, 0xd1e4, 0x1170, 0x2039, 0x0000, 0x2041, 0x0000, - 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x36f6, 0x080c, 0x379a, - 0x0804, 0x2cb1, 0xa18c, 0xecff, 0x6922, 0x6104, 0xa18c, 0xffdd, - 0x6106, 0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003, 0x01d0, 0x6104, - 0xa18c, 0x0010, 0x0548, 0x080c, 0x3969, 0x080c, 0x3776, 0x88ff, - 0x0518, 0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, - 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082, - 0x0005, 0x6920, 0xd1cc, 0x0130, 0xa18c, 0xfdff, 0x6922, 0x6000, - 0xc0ec, 0x6002, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, - 0xa006, 0x2010, 0x080c, 0x379a, 0xa286, 0x0001, 0x0158, 0x6104, - 0xa18c, 0x0008, 0x01b0, 0x080c, 0x3969, 0x080c, 0x3696, 0x88ff, - 0x1980, 0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c, 0xfeff, 0x6922, - 0x6000, 0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, - 0x36f6, 0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, - 0x781b, 0x0083, 0x0005, 0x0804, 0x382d, 0x2808, 0x789b, 0x0080, - 0x2019, 0x0080, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x1188, - 0x7ca8, 0xa4a4, 0x00ff, 0xa480, 0x0002, 0xa300, 0x2018, 0xa102, - 0x0a04, 0x2c40, 0x0904, 0x2c40, 0x24a8, 0x7aa8, 0x1f04, 0x2cd5, - 0x0c48, 0xa284, 0x00f0, 0xa082, 0x0020, 0x06b8, 0x2200, 0xa082, - 0x0021, 0x1698, 0x7aa8, 0x8318, 0x8318, 0x2100, 0xa302, 0x0ad0, - 0xa286, 0x0023, 0x0980, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, - 0xa684, 0xfff1, 0xc0a5, 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, - 0x78a0, 0x8001, 0x0904, 0x2cb1, 0x20a8, 0x7998, 0x789b, 0x0060, - 0x78aa, 0x2011, 0x0080, 0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa, - 0x7a98, 0x1f04, 0x2d03, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, - 0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x8318, 0x2100, 0xa302, - 0x0a04, 0x2cc2, 0xa284, 0x0080, 0x1904, 0x3831, 0x78a0, 0xa005, - 0x08c8, 0x0804, 0x3831, 0x0804, 0x3809, 0x7058, 0xa04d, 0x789b, - 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0110, 0x080c, - 0x243b, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, - 0x0005, 0x1a04, 0x3809, 0x0002, 0x3809, 0x3615, 0x3809, 0x3726, - 0x3b83, 0xa282, 0x0000, 0x1110, 0x080c, 0x243b, 0x080c, 0x3837, - 0x781b, 0x0082, 0x0005, 0xa282, 0x0003, 0x1110, 0x080c, 0x243b, - 0xd4fc, 0x11d0, 0x7064, 0xa005, 0x0110, 0x080c, 0x243b, 0x6f14, - 0x7776, 0xa7bc, 0x8f00, 0x080c, 0x396d, 0x6008, 0xa085, 0x0021, - 0x600a, 0x8738, 0xa784, 0x001f, 0x1db0, 0x080c, 0x383a, 0x7067, - 0x0002, 0x701f, 0x0009, 0x0010, 0x080c, 0x3846, 0x781b, 0x0082, - 0x0005, 0xa282, 0x0004, 0x0310, 0x080c, 0x243b, 0x2300, 0x0002, - 0x2d7b, 0x2eff, 0x2f3b, 0xa286, 0x0003, 0x0560, 0x7200, 0x7cd8, - 0x7ddc, 0x7fd0, 0x71d4, 0xd1b4, 0x00f0, 0x7868, 0xa084, 0x00ff, - 0x11d0, 0xa282, 0x0002, 0x12b8, 0x00d6, 0x783b, 0x8300, 0x781b, - 0x0059, 0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, - 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x00de, - 0x2001, 0x0000, 0x0058, 0x783b, 0x1300, 0x781b, 0x0057, 0x2001, - 0x0000, 0x0020, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x704a, 0x68a0, - 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a, 0xa284, 0x000f, 0x0002, - 0x2ee0, 0x2dc5, 0x2dc2, 0x3012, 0x3085, 0x248f, 0x2dc0, 0x2dc0, - 0x080c, 0x243b, 0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x0120, 0x7048, - 0xa086, 0x0014, 0x11e8, 0x080c, 0x3d52, 0x2009, 0x0000, 0x6818, - 0xd0fc, 0x0108, 0x7048, 0xa086, 0x0014, 0x0168, 0x6818, 0xa086, - 0x0008, 0x1904, 0x2ea2, 0x7858, 0xd09c, 0x0904, 0x2ea2, 0x6820, - 0xd0ac, 0x0904, 0x2ea2, 0x681b, 0x0014, 0x2009, 0x0002, 0x04a8, - 0x7868, 0xa08c, 0x00ff, 0x0588, 0xa186, 0x0008, 0x1158, 0x6008, - 0xc0a4, 0x600a, 0x080c, 0x355f, 0x0540, 0x080c, 0x35c5, 0x080c, - 0x3d52, 0x0060, 0xa186, 0x0028, 0x1500, 0x6018, 0xa005, 0x0d78, - 0x8001, 0x0d68, 0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820, 0xd084, - 0x0904, 0x248f, 0xc084, 0x6822, 0x080c, 0x2580, 0x705c, 0x00c6, - 0x2060, 0x6800, 0x6002, 0x00ce, 0x6004, 0x6802, 0xa005, 0x2d00, - 0x1108, 0x6002, 0x6006, 0x0804, 0x248f, 0x0016, 0x81ff, 0x15e0, - 0x7000, 0xa086, 0x0030, 0x05c0, 0x71d4, 0xd1b4, 0x11e8, 0x7060, - 0xa005, 0x1590, 0x70a4, 0xa086, 0x0001, 0x0570, 0x7003, 0x0000, - 0x0046, 0x0056, 0x0076, 0x0066, 0x00c6, 0x00d6, 0x080c, 0x24b2, - 0x00de, 0x00ce, 0x006e, 0x007e, 0x005e, 0x004e, 0x71d4, 0xd1b4, - 0x11d8, 0x7003, 0x0040, 0x00c0, 0x080c, 0x3a8d, 0x11a8, 0x781b, - 0x0068, 0x00d6, 0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, - 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, - 0x7808, 0xc08d, 0x780a, 0x00de, 0x080c, 0x2f63, 0x001e, 0x81ff, - 0x0904, 0x2ea2, 0xa684, 0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14, - 0xa186, 0x0002, 0x15c0, 0x6818, 0xa086, 0x0014, 0x1130, 0x2008, - 0xd6e4, 0x0118, 0x7868, 0xa08c, 0x00ff, 0x080c, 0x3850, 0x080c, - 0x258b, 0x6820, 0xd0dc, 0x1538, 0x8717, 0xa294, 0x000f, 0x8213, - 0x8213, 0x8213, 0xb284, 0x0600, 0x0118, 0xa290, 0x47c0, 0x0010, - 0xa290, 0x4840, 0xa290, 0x0000, 0x221c, 0xd3c4, 0x0130, 0x8210, - 0x2204, 0xa085, 0x0038, 0x2012, 0x8211, 0xd3d4, 0x0138, 0x68a0, - 0xd0c4, 0x1120, 0x080c, 0x2fcb, 0x0804, 0x248f, 0x6008, 0xc08d, - 0x600a, 0x0008, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0110, 0x7048, - 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0168, 0x2009, - 0x4302, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, 0x1128, 0x2021, - 0x4304, 0x2404, 0xc0a5, 0x2022, 0x6018, 0xa005, 0x0118, 0x8001, - 0x601a, 0x1118, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, 0x1130, - 0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0020, 0x705c, 0x2060, - 0x6800, 0x6002, 0x2061, 0x4300, 0x6887, 0x0103, 0x2d08, 0x206b, - 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008, 0x616e, - 0x7200, 0xa286, 0x0030, 0x0158, 0xa286, 0x0040, 0x1904, 0x248f, - 0x7003, 0x0002, 0x704c, 0x2068, 0x68c4, 0x2060, 0x0005, 0x7003, - 0x0002, 0x70bc, 0xa06d, 0x68bc, 0x7042, 0x70b8, 0xa065, 0x68c0, - 0x705a, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x0005, 0xa282, - 0x0004, 0x0210, 0x080c, 0x243b, 0x2200, 0x0002, 0x2f0a, 0x2f19, - 0x2f25, 0x2f19, 0xa586, 0x1300, 0x0160, 0xa586, 0x8300, 0x1d90, - 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, - 0x600a, 0x7000, 0xa086, 0x0005, 0x0128, 0x080c, 0x3837, 0x781b, - 0x0082, 0x0005, 0x781b, 0x0083, 0x0005, 0x7890, 0x8007, 0x8001, - 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, - 0xa186, 0x0003, 0x0128, 0xa186, 0x0000, 0x0110, 0x0804, 0x3809, - 0x781b, 0x0083, 0x0005, 0x6820, 0xc095, 0x6822, 0x82ff, 0x1118, - 0x080c, 0x3837, 0x0030, 0x8211, 0x0110, 0x080c, 0x243b, 0x080c, - 0x3846, 0x781b, 0x0082, 0x0005, 0x080c, 0x3aa0, 0x7830, 0xa084, - 0x00c0, 0x1170, 0x0016, 0x3208, 0xa18c, 0x0800, 0x001e, 0x0118, - 0x0104, 0x2f60, 0x0010, 0x0304, 0x2f60, 0x791a, 0xa006, 0x0005, - 0xa085, 0x0001, 0x0005, 0xa684, 0x0060, 0x1130, 0x682f, 0x0000, - 0x6833, 0x0000, 0x0804, 0x2fca, 0xd6dc, 0x1198, 0x68b4, 0xd0dc, - 0x1180, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7048, 0xa005, 0x1130, - 0x2200, 0xa105, 0x0904, 0x3d52, 0x704b, 0x0015, 0x0804, 0x3d52, - 0x0005, 0xd6ac, 0x01f0, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833, - 0x0000, 0x0804, 0x3d52, 0x68b4, 0xa084, 0x4000, 0xa635, 0xd6f4, - 0x1da0, 0x7048, 0xa005, 0x1110, 0x704b, 0x0015, 0xd6dc, 0x1128, - 0x68b4, 0xd0dc, 0x0110, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, 0x0804, - 0x3d52, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833, 0x0000, 0x0804, - 0x3d52, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x1da0, 0x7048, - 0xa005, 0x1110, 0x704b, 0x0015, 0x2408, 0x2510, 0x2700, 0x8007, - 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a32, 0x2100, - 0xa205, 0x1110, 0x0804, 0x3d52, 0x7000, 0xa086, 0x0006, 0x0110, - 0x0804, 0x3d52, 0x0005, 0x6946, 0x6008, 0xc0cd, 0xd3cc, 0x0108, - 0xc08d, 0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f, 0x0000, - 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003, - 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020, - 0x7000, 0x0002, 0x248f, 0x2ffa, 0x2ff4, 0x2ff2, 0x2ff2, 0x2ff2, - 0x2ff2, 0x2ff2, 0x080c, 0x243b, 0x6820, 0xd084, 0x1118, 0x080c, - 0x35ab, 0x0030, 0x705c, 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, - 0x3208, 0xa18c, 0x0600, 0x0118, 0x2021, 0x4358, 0x0010, 0x2021, - 0x4398, 0x2404, 0xa005, 0x0110, 0x2020, 0x0cd8, 0x2d22, 0x206b, - 0x0000, 0x0005, 0x080c, 0x35b1, 0x080c, 0x35c5, 0x6008, 0xc0cc, - 0x600a, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, - 0x6944, 0x6916, 0x3208, 0xa18c, 0x0600, 0x0118, 0x2009, 0x0000, - 0x0010, 0x2009, 0x0001, 0x080c, 0x40b1, 0xd6dc, 0x0118, 0x691c, - 0xc1ed, 0x691e, 0x6818, 0xd0fc, 0x0148, 0x7868, 0xa08c, 0x00ff, - 0x0118, 0x681b, 0x001e, 0x0010, 0x681b, 0x0000, 0xb284, 0x0600, - 0x1118, 0x2021, 0x4398, 0x0010, 0x2021, 0x4358, 0x6800, 0x2022, - 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, - 0x0580, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x00d6, - 0x00f6, 0x0156, 0x0146, 0x2079, 0x4300, 0x080c, 0x1b35, 0x014e, - 0x015e, 0x00fe, 0x70cc, 0x2010, 0x2009, 0x0101, 0x0026, 0x2204, - 0xa06d, 0x0140, 0x6814, 0xa706, 0x0110, 0x6800, 0x0cc8, 0x6820, - 0xc0d5, 0x6822, 0x002e, 0x8210, 0x8109, 0x1d80, 0x00de, 0x7067, - 0x0003, 0x707f, 0x0000, 0x7776, 0x7083, 0x000f, 0x71d4, 0xc1c4, - 0x71d6, 0x080c, 0x1d3d, 0x0804, 0x248f, 0x7cd8, 0x7ddc, 0x7fd0, - 0x080c, 0x2f63, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x080c, - 0x3aa4, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0110, 0x7048, - 0x681a, 0xa68c, 0xdf00, 0x691e, 0x7067, 0x0000, 0x0804, 0x248f, - 0x7000, 0xa005, 0x1110, 0x0804, 0x248f, 0xa006, 0x080c, 0x3d52, - 0x6920, 0xd1ac, 0x1110, 0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, - 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822, 0x7000, 0x0002, - 0x248f, 0x30c2, 0x30c2, 0x30c5, 0x30c5, 0x30c5, 0x30c0, 0x30c0, - 0x080c, 0x243b, 0x6818, 0x0804, 0x2daa, 0x6008, 0xc0a4, 0x600a, - 0x6817, 0x0000, 0x0804, 0x357a, 0x2300, 0x0002, 0x30d1, 0x30d3, - 0x3110, 0x080c, 0x243b, 0xd6fc, 0x1904, 0x2bee, 0x7000, 0xa00d, - 0x0002, 0x248f, 0x30e3, 0x30e3, 0x3104, 0x30e3, 0x310d, 0x30e1, - 0x30e1, 0x080c, 0x243b, 0xa684, 0x0060, 0xa086, 0x0060, 0x11d0, - 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x681c, 0xc0ac, 0x681e, 0xa186, - 0x0002, 0x0110, 0x080c, 0x3d52, 0x080c, 0x3fb8, 0x781b, 0x0083, - 0x71d4, 0xd1b4, 0x1904, 0x248c, 0x70a4, 0xa086, 0x0001, 0x1904, - 0x24ce, 0x0005, 0xd6ec, 0x0d30, 0x6818, 0xd0fc, 0x0130, 0x681b, - 0x0015, 0xd6f4, 0x0110, 0x681b, 0x0007, 0x080c, 0x3a4b, 0x0005, - 0x080c, 0x243b, 0x2300, 0x0002, 0x3119, 0x3134, 0x3182, 0x080c, - 0x243b, 0x7000, 0x0002, 0x3123, 0x3125, 0x3125, 0x3123, 0x3123, - 0x3123, 0x3123, 0x3123, 0x080c, 0x243b, 0x080c, 0x3fb8, 0x681c, - 0xc0b4, 0x681e, 0x70d4, 0xd0b4, 0x1904, 0x248c, 0x70a4, 0xa086, - 0x0001, 0x1904, 0x24ce, 0x0005, 0xd6fc, 0x15e0, 0x7000, 0xa00d, - 0x0002, 0x248f, 0x3149, 0x3143, 0x316a, 0x3149, 0x316f, 0x3141, - 0x3141, 0x080c, 0x243b, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, - 0x78da, 0xa684, 0x0060, 0xa086, 0x0060, 0x11d0, 0xa6b4, 0xbfbf, - 0xc6ed, 0x7e5a, 0xa186, 0x0002, 0x0110, 0x080c, 0x3d52, 0x080c, - 0x3fb8, 0x781b, 0x0083, 0x681c, 0xc0b4, 0x681e, 0x71d4, 0xd1b4, - 0x1904, 0x248c, 0x70a4, 0xa086, 0x0001, 0x1904, 0x24ce, 0x0005, - 0xd6ec, 0x0d30, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x0007, 0x781b, - 0x00fb, 0x0005, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100, - 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b, - 0x0083, 0x0005, 0xd6dc, 0x0130, 0x782b, 0x3009, 0x781b, 0x0083, - 0x0804, 0x248c, 0x7884, 0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, - 0x1150, 0xa484, 0x0200, 0x0108, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b, - 0x0083, 0x0804, 0x248c, 0x6820, 0xc095, 0x6822, 0x080c, 0x39ca, - 0xc6dd, 0x080c, 0x3837, 0x781b, 0x0082, 0x0804, 0x248c, 0x2300, - 0x0002, 0x31ac, 0x31ae, 0x31b0, 0x080c, 0x243b, 0x0804, 0x3831, - 0x7d98, 0xd6d4, 0x11f8, 0x79e4, 0xd1ac, 0x0130, 0x78ec, 0xa084, - 0x0003, 0x0110, 0x782b, 0x3009, 0x789b, 0x0060, 0x78ab, 0x0000, - 0xa684, 0xfffb, 0x785a, 0x7d9a, 0x79e4, 0xd1ac, 0x0120, 0x78ec, - 0xa084, 0x0003, 0x1120, 0x2001, 0x0014, 0x0804, 0x2daa, 0xa184, - 0x0007, 0x04c2, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, - 0x81ff, 0x0568, 0x789b, 0x0080, 0x7ba8, 0xa384, 0x0001, 0x11d0, - 0x7ba8, 0x7ba8, 0xa386, 0x0004, 0x1118, 0x2009, 0xffdf, 0x0058, - 0xa386, 0x0001, 0x1118, 0x2009, 0xfff7, 0x0028, 0xa386, 0x0003, - 0x1148, 0x2009, 0xffef, 0x00c6, 0x7058, 0x2060, 0x6004, 0xa104, - 0x6006, 0x00ce, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, - 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xecff, 0x6922, 0x7d9a, - 0x0804, 0x3a3f, 0x2a9f, 0x2aa8, 0x3214, 0x321a, 0x3212, 0x3212, - 0x3a3f, 0x3a3f, 0x080c, 0x243b, 0x6920, 0xa18c, 0xfcff, 0x6922, - 0x0804, 0x3a45, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0804, 0x3a3f, - 0x79e4, 0xa184, 0x0030, 0x0120, 0x78ec, 0xa084, 0x0003, 0x1558, - 0x7000, 0xa086, 0x0004, 0x1190, 0x7064, 0xa086, 0x0002, 0x1130, - 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x295c, 0x7064, 0xa086, - 0x0006, 0x0db0, 0x7064, 0xa086, 0x0004, 0x0d90, 0x7000, 0xa086, - 0x0000, 0x0904, 0x248c, 0x6920, 0xa184, 0x0420, 0x0128, 0xc1d4, - 0x6922, 0x6818, 0x0804, 0x2daa, 0x6818, 0xc0fd, 0x681a, 0x2001, - 0x0014, 0x0804, 0x2daa, 0xa184, 0x0007, 0x0002, 0x3a3f, 0x3a3f, - 0x325e, 0x3a3f, 0x3a83, 0x3a83, 0x3a3f, 0x3a3f, 0xd6bc, 0x0570, - 0x7184, 0x81ff, 0x0558, 0xa182, 0x000d, 0x1318, 0x7087, 0x0000, - 0x0028, 0xa182, 0x000c, 0x7086, 0x2009, 0x000c, 0x789b, 0x0061, - 0x79aa, 0x0156, 0x0136, 0x0146, 0x7088, 0x8114, 0xa210, 0x728a, - 0xa080, 0x000b, 0xad00, 0x2098, 0xb284, 0x0600, 0x0118, 0x20a1, - 0x022b, 0x0010, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, - 0x53a6, 0x014e, 0x013e, 0x015e, 0x0804, 0x3a45, 0xd6d4, 0x1904, - 0x32d1, 0x6820, 0xd084, 0x0904, 0x3a45, 0xa68c, 0x0060, 0xa684, - 0x0060, 0x0120, 0xa086, 0x0060, 0x1108, 0xc1f5, 0xc194, 0x795a, - 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, - 0xc0fd, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0904, 0x35da, 0xa18c, - 0x00f8, 0x1904, 0x35da, 0x0156, 0x0136, 0x0146, 0x0016, 0x20a1, - 0x012b, 0x3208, 0xa18c, 0x0600, 0x0110, 0x20a1, 0x022b, 0x001e, - 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, - 0x014e, 0x013e, 0x015e, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0804, - 0x3a45, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x0008, 0x080c, 0x3837, - 0x781b, 0x00ed, 0x0005, 0x2300, 0x0002, 0x32e2, 0x3398, 0x32e0, - 0x080c, 0x243b, 0x7cd8, 0x7ddc, 0x7fd0, 0x82ff, 0x11f0, 0x7200, - 0xa286, 0x0003, 0x0904, 0x2d7f, 0x71d4, 0xd1b4, 0x00c0, 0x00d6, - 0x783b, 0x8800, 0x781b, 0x0059, 0x70bc, 0xa06d, 0x68b4, 0xc0a5, - 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, - 0x71d6, 0x7003, 0x0030, 0x00de, 0x0030, 0x7200, 0x0020, 0x783b, - 0x1800, 0x781b, 0x0057, 0xa284, 0x000f, 0x0002, 0x3383, 0x3344, - 0x3318, 0x2da7, 0x3316, 0x3383, 0x3316, 0x3316, 0x080c, 0x243b, - 0x681c, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a, 0x6920, 0xc185, - 0x6922, 0x6800, 0x6006, 0xa005, 0x1108, 0x6002, 0x6008, 0xc0d4, - 0x600a, 0x681c, 0xa084, 0x000e, 0x1148, 0xb284, 0x0600, 0x0118, - 0x2009, 0x89c0, 0x0040, 0x2009, 0x8ad0, 0x0028, 0x7030, 0x68ba, - 0x7140, 0x70cc, 0xa108, 0x2104, 0x6802, 0x2d0a, 0x715e, 0xd6dc, - 0x1118, 0xc6fc, 0x6eb6, 0x04f8, 0x6eb6, 0xa684, 0x0060, 0x05d8, - 0xd6dc, 0x1150, 0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898, - 0x68aa, 0x080c, 0x3d52, 0x0478, 0xd6ac, 0x0140, 0xa006, 0x080c, - 0x3d52, 0x2408, 0x2510, 0x69aa, 0x6aa6, 0x0068, 0x2408, 0x2510, - 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x69aa, - 0x6aa6, 0x080c, 0x3d52, 0xd6fc, 0x01b0, 0xa684, 0x7fff, 0x68b6, - 0x2510, 0x2408, 0xd6ac, 0x1138, 0x2700, 0x8007, 0xa084, 0x007f, - 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, - 0x2200, 0xa303, 0x68ae, 0x7000, 0xa086, 0x0030, 0x1904, 0x248f, - 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc, 0x7042, 0x70b8, 0xa065, - 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x0005, - 0xa586, 0x8800, 0x1148, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, - 0x6008, 0xa084, 0xfbef, 0x600a, 0x0804, 0x3831, 0x7047, 0x0000, - 0xa282, 0x0006, 0x0310, 0x080c, 0x243b, 0x2300, 0x0002, 0x33b2, - 0x33e4, 0x340f, 0x2200, 0x0002, 0x33ba, 0x3831, 0x33bc, 0x33ba, - 0x343f, 0x349d, 0x080c, 0x243b, 0x7003, 0x0005, 0xb284, 0x0600, - 0x0118, 0x2001, 0x8ae0, 0x0010, 0x2001, 0x8b12, 0x2068, 0x704e, - 0x0156, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x1f04, 0x33cb, - 0x015e, 0xb284, 0x0600, 0x0118, 0x6817, 0x0000, 0x0010, 0x6817, - 0x8000, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800, - 0x6827, 0x0003, 0x0804, 0x3809, 0x7000, 0xa086, 0x0002, 0x1150, - 0x080c, 0x35c5, 0x0010, 0x080c, 0x3d52, 0x6008, 0xa084, 0xfbef, - 0x600a, 0x0020, 0x7000, 0xa086, 0x0003, 0x0da8, 0x7003, 0x0005, - 0xb284, 0x0600, 0x0118, 0x2001, 0x8ae0, 0x0010, 0x2001, 0x8b12, - 0x2068, 0x704e, 0xad80, 0x0009, 0x7046, 0x2200, 0x0002, 0x3831, - 0x340d, 0x340d, 0x343f, 0x340d, 0x3831, 0x080c, 0x243b, 0x7000, - 0xa086, 0x0002, 0x1150, 0x080c, 0x35c5, 0x0010, 0x080c, 0x3d52, - 0x6008, 0xa084, 0xfbef, 0x600a, 0x0020, 0x7000, 0xa086, 0x0003, - 0x0da8, 0x7003, 0x0005, 0xb284, 0x0600, 0x0118, 0x2001, 0x8ae0, - 0x0010, 0x2001, 0x8b12, 0x2068, 0x704e, 0xad80, 0x0009, 0x7046, - 0x2200, 0x0002, 0x343a, 0x3438, 0x3438, 0x343a, 0x3438, 0x343a, - 0x080c, 0x243b, 0x080c, 0x3846, 0x781b, 0x0082, 0x0005, 0x7000, - 0xa086, 0x0002, 0x1158, 0x70d4, 0xc0b5, 0x70d6, 0x2c00, 0x70ba, - 0x2d00, 0x70be, 0x0038, 0x080c, 0x3d52, 0x0020, 0x7000, 0xa086, - 0x0003, 0x0dc8, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, - 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x89c0, 0xb284, - 0x0600, 0x1118, 0xc2fd, 0x2069, 0x8ad0, 0x2d04, 0x2d08, 0x715e, - 0xa06d, 0x0128, 0x6814, 0xa206, 0x0500, 0x6800, 0x0cb8, 0x7003, - 0x0005, 0xd2fc, 0x1118, 0x2001, 0x8ae0, 0x0010, 0x2001, 0x8b12, - 0x2068, 0x704e, 0x0156, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, - 0x1f04, 0x347d, 0x015e, 0xad80, 0x0009, 0x7046, 0x6a16, 0x68b7, - 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6920, - 0xa184, 0x0c00, 0x0904, 0x3507, 0x681b, 0x0005, 0xc1ad, 0xc1d4, - 0x6922, 0x080c, 0x383d, 0x0804, 0x3507, 0x7200, 0xa286, 0x0002, - 0x1158, 0x70d4, 0xc0b5, 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, - 0x0030, 0x080c, 0x3d52, 0x0018, 0xa286, 0x0003, 0x0dd0, 0x7003, - 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, - 0x001f, 0xa215, 0xb284, 0x0600, 0x1108, 0xc2fd, 0x79a8, 0x79a8, - 0xa18c, 0x00ff, 0x70cc, 0xa168, 0x2d04, 0x2d08, 0x715e, 0xa06d, - 0x0128, 0x6814, 0xa206, 0x0538, 0x6800, 0x0cb8, 0x7003, 0x0005, - 0xb284, 0x0600, 0x0118, 0x2001, 0x8ae0, 0x0010, 0x2001, 0x8b12, - 0x2068, 0x704e, 0x0156, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, - 0x1f04, 0x34dd, 0x015e, 0xb284, 0x0600, 0x0110, 0xc2fc, 0x0008, - 0xc2fd, 0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, - 0x0800, 0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0178, - 0xd0dc, 0x0118, 0x080c, 0x3843, 0x0050, 0x681b, 0x0005, 0xc1ad, - 0xc1d4, 0x6922, 0x080c, 0x383d, 0x707f, 0x0000, 0x0000, 0xa6ac, - 0x0060, 0x05c8, 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x11c0, - 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, 0xb7ff, 0xa586, 0x0060, - 0x0550, 0xc6ed, 0x7e5a, 0x2009, 0x0083, 0xd69c, 0x0128, 0x2009, - 0x0082, 0x2019, 0x0000, 0x2320, 0x791a, 0x080c, 0x3fb8, 0x0418, - 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x01a0, 0x7bd2, - 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xc6f4, 0x7e5a, 0x2011, 0x0083, - 0xd69c, 0x0128, 0x2011, 0x0082, 0x2019, 0x0000, 0x2320, 0x7a1a, - 0x080c, 0x3fe5, 0x0040, 0x7e5a, 0x2009, 0x0083, 0xd69c, 0x0110, - 0x2009, 0x0082, 0x791a, 0x68c0, 0x705a, 0x2d00, 0x704e, 0x68c4, - 0x2060, 0x71d4, 0xd1b4, 0x1904, 0x248c, 0x2300, 0xa405, 0x0904, - 0x248c, 0x70a4, 0xa086, 0x0001, 0x1904, 0x24ce, 0x0005, 0x6020, + 0x0006, 0x2011, 0x4602, 0x220c, 0xa102, 0x2012, 0x000e, 0x001e, + 0xa102, 0x0338, 0x6012, 0x1128, 0x2011, 0x4604, 0x2204, 0xc0a5, + 0x2012, 0x601b, 0x0000, 0xace0, 0x0010, 0x1f04, 0x2a13, 0x8421, + 0x1d00, 0x015e, 0x7063, 0x0000, 0x7003, 0x0000, 0x704b, 0x0000, + 0x0005, 0x0046, 0x2404, 0xa005, 0x01a8, 0x2068, 0x6800, 0x0006, + 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, + 0x681e, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x080c, 0x1da2, + 0x000e, 0x0c48, 0x004e, 0x2023, 0x0000, 0x0005, 0xa282, 0x0003, + 0x0310, 0x080c, 0x254c, 0x2300, 0x0002, 0x2a60, 0x2add, 0x2af7, + 0xa282, 0x0002, 0x0110, 0x080c, 0x254c, 0x7060, 0x7063, 0x0000, + 0x707f, 0x0000, 0x0022, 0x77d0, 0xc7c5, 0x77d2, 0x0002, 0x2a77, + 0x2a77, 0x2a79, 0x2ab1, 0x37d8, 0x2a77, 0x2ab1, 0x2a77, 0x080c, + 0x254c, 0x7770, 0x080c, 0x3a66, 0x7770, 0xa7bc, 0x8f00, 0x080c, + 0x3b6f, 0x6018, 0xa005, 0x0528, 0xd7fc, 0x1118, 0x2021, 0x8cc0, + 0x0010, 0x2021, 0x8dd0, 0x2009, 0x0005, 0x2011, 0x0010, 0x080c, + 0x2b11, 0x01b8, 0x0156, 0x20a9, 0x0101, 0xd7fc, 0x1118, 0x2021, + 0x8bc0, 0x0010, 0x2021, 0x8cd0, 0x0046, 0x2009, 0x0005, 0x2011, + 0x0010, 0x080c, 0x2b11, 0x004e, 0x0118, 0x8420, 0x1f04, 0x2a9c, + 0x015e, 0x8738, 0xa784, 0x001f, 0x1990, 0x0804, 0x25a0, 0x0804, + 0x25a0, 0x7770, 0x080c, 0x3b6f, 0x6018, 0xa005, 0x0520, 0xd7fc, + 0x1118, 0x2021, 0x8cc0, 0x0010, 0x2021, 0x8dd0, 0x2009, 0x0005, + 0x2011, 0x0020, 0x080c, 0x2b11, 0x01b0, 0x0156, 0x20a9, 0x0101, + 0xd7fc, 0x1118, 0x2021, 0x8bc0, 0x0010, 0x2021, 0x8cd0, 0x0046, + 0x2009, 0x0005, 0x2011, 0x0020, 0x04e1, 0x004e, 0x0118, 0x8420, + 0x1f04, 0x2acf, 0x015e, 0x0804, 0x25a0, 0x2200, 0x0002, 0x2ae2, + 0x2ae4, 0x2ae4, 0x080c, 0x254c, 0x2009, 0x0012, 0x7060, 0xa086, + 0x0002, 0x0110, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0108, 0x691a, + 0x7063, 0x0000, 0x70d0, 0xc0c5, 0x70d2, 0x0804, 0x3be5, 0x2200, + 0x0002, 0x2afe, 0x2ae4, 0x2afc, 0x080c, 0x254c, 0x080c, 0x3f26, + 0x7000, 0xa086, 0x0002, 0x1904, 0x375d, 0x080c, 0x37be, 0x6008, + 0xa084, 0xfbef, 0x600a, 0x080c, 0x374f, 0x0904, 0x375d, 0x0804, + 0x25a0, 0x2404, 0xa005, 0x0590, 0x2068, 0x2d04, 0x0006, 0x6814, + 0xa706, 0x0118, 0x2d20, 0x000e, 0x0ca8, 0x000e, 0x2022, 0x691a, + 0x6817, 0x0000, 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, + 0x6820, 0xa084, 0x00ff, 0xa205, 0x6822, 0x080c, 0x1da2, 0x2021, + 0x4602, 0x241c, 0x8319, 0x2322, 0x6010, 0x8001, 0x6012, 0x1128, + 0x2021, 0x4604, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, + 0x600a, 0x080c, 0x269e, 0x080c, 0x37be, 0x0005, 0xa085, 0x0001, + 0x0ce0, 0x2300, 0x0002, 0x2b50, 0x2b4e, 0x2bcb, 0x080c, 0x254c, + 0x78e4, 0xa005, 0x17b0, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104, + 0x259d, 0x0010, 0x0304, 0x259d, 0x2008, 0xa084, 0x0030, 0x1110, + 0x0804, 0x322a, 0x78ec, 0xa084, 0x0003, 0x0dd0, 0x7884, 0xd0fc, + 0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004, + 0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005, + 0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2bae, + 0x2bb7, 0x2ba4, 0x2b87, 0x3c29, 0x3c29, 0x2b87, 0x2bc1, 0x080c, + 0x254c, 0x7000, 0xa086, 0x0004, 0x1190, 0x7060, 0xa086, 0x0002, + 0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x2a56, 0x7060, + 0xa086, 0x0006, 0x0db0, 0x7060, 0xa086, 0x0004, 0x0d90, 0x79e4, + 0x2001, 0x0003, 0x0804, 0x2f18, 0x6818, 0xd0fc, 0x0110, 0x681b, + 0x001d, 0x080c, 0x3a3c, 0x781b, 0x006e, 0x0005, 0x6818, 0xd0fc, + 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, 0x0804, 0x3c07, 0x6818, + 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, 0x781b, 0x00fa, + 0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x080c, 0x3a3c, + 0x781b, 0x00cb, 0x0005, 0xa584, 0x000f, 0x11c0, 0x7000, 0x0002, + 0x25a0, 0x2bd8, 0x2bda, 0x375d, 0x375d, 0x375d, 0x2bd8, 0x2bd8, + 0x080c, 0x254c, 0x080c, 0x37be, 0x6008, 0xa084, 0xfbef, 0x600a, + 0x080c, 0x374f, 0x0904, 0x375d, 0x0804, 0x25a0, 0x78e4, 0xa005, + 0x1b04, 0x2b89, 0x3208, 0xa18c, 0x0800, 0x0118, 0x0104, 0x2b89, + 0x0010, 0x0304, 0x2b89, 0x2008, 0xa084, 0x0030, 0x1118, 0x781b, + 0x0068, 0x0005, 0x78ec, 0xa084, 0x0003, 0x0dc8, 0x7884, 0xd0fc, + 0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004, + 0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005, + 0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2c26, + 0x2c2a, 0x2c21, 0x2c1f, 0x3c29, 0x3c29, 0x2c1f, 0x3c23, 0x080c, + 0x254c, 0x080c, 0x3a42, 0x781b, 0x006e, 0x0005, 0x080c, 0x3a42, + 0x0804, 0x3c07, 0x080c, 0x3a42, 0x781b, 0x00fa, 0x0005, 0x080c, + 0x3a42, 0x781b, 0x00cb, 0x0005, 0x2300, 0x0002, 0x2c3b, 0x2c39, + 0x2c3d, 0x080c, 0x254c, 0x0804, 0x33e2, 0x681b, 0x0016, 0x78a3, + 0x0000, 0x79e4, 0xa184, 0x0030, 0x0904, 0x33e2, 0x78ec, 0xa084, + 0x0003, 0x0904, 0x33e2, 0xa184, 0x0100, 0x0d98, 0x7884, 0xd0fc, + 0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, 0xa086, 0x0004, + 0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, 0xa086, 0x0005, + 0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, 0x0002, 0x2c6f, + 0x2c2a, 0x2ba4, 0x3be5, 0x3c29, 0x3c29, 0x3be5, 0x3c23, 0x080c, + 0x3bf1, 0x0005, 0xa282, 0x0005, 0x0310, 0x080c, 0x254c, 0x7898, + 0x2040, 0x2300, 0x0002, 0x2c7e, 0x2ea8, 0x2eb2, 0x2200, 0x0002, + 0x2c9a, 0x2c87, 0x2c9a, 0x2c85, 0x2e8a, 0x080c, 0x254c, 0x789b, + 0x0018, 0x78a8, 0x2010, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0a04, + 0x3a0b, 0xa08a, 0x0004, 0x1a04, 0x3a0b, 0x0002, 0x3a0b, 0x3a0b, + 0x3a0b, 0x39c1, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0148, + 0x0804, 0x3a0b, 0x7000, 0xa005, 0x1dd8, 0x2011, 0x0004, 0x0804, + 0x3594, 0xa184, 0x00ff, 0xa08a, 0x0010, 0x1a04, 0x3a0b, 0x0002, + 0x2cc2, 0x2cc0, 0x2cd4, 0x2cd8, 0x2d86, 0x3a0b, 0x3a0b, 0x2d88, + 0x3a0b, 0x3a0b, 0x2e86, 0x2e86, 0x3a0b, 0x3a0b, 0x3a0b, 0x2e88, + 0x080c, 0x254c, 0xd6e4, 0x0140, 0x2001, 0x0300, 0x8000, 0x8000, + 0x783a, 0x781b, 0x00c7, 0x0005, 0x6818, 0xd0fc, 0x0118, 0x681b, + 0x001d, 0x0c90, 0x0804, 0x3be5, 0x681b, 0x001d, 0x0804, 0x3a36, + 0x6920, 0x6922, 0xa684, 0x1800, 0x1904, 0x2d29, 0x6820, 0xd084, + 0x1904, 0x2d31, 0x6818, 0xa086, 0x0008, 0x1110, 0x681b, 0x0000, + 0xd6d4, 0x0568, 0xd6bc, 0x0558, 0x7083, 0x0000, 0x6818, 0xa084, + 0x003f, 0xa08a, 0x000d, 0x0718, 0xa08a, 0x000c, 0x7182, 0x2001, + 0x000c, 0x800c, 0x7186, 0x789b, 0x0061, 0x78aa, 0x0156, 0x0136, + 0x0146, 0x0016, 0x3208, 0xa18c, 0x0600, 0x0118, 0x20a1, 0x022b, + 0x0010, 0x20a1, 0x012b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac, + 0xad80, 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6038, + 0xa005, 0x1150, 0x681c, 0xa084, 0x000e, 0x0904, 0x3a36, 0x080c, + 0x3a48, 0x782b, 0x3008, 0x0010, 0x8001, 0x603a, 0x781b, 0x0071, + 0x0005, 0xd6e4, 0x0130, 0x781b, 0x0083, 0x0005, 0x781b, 0x0083, + 0x0005, 0xa684, 0x0060, 0x0dd0, 0xd6dc, 0x0dc0, 0xd6fc, 0x01a0, + 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x8007, 0xa084, + 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, + 0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4, 0x0118, 0xc6f4, 0x7e5a, + 0x6eb6, 0x7000, 0xa086, 0x0003, 0x1148, 0x0006, 0x080c, 0x3f26, + 0x080c, 0x41d9, 0x000e, 0x781b, 0x0080, 0x0005, 0xa006, 0x080c, + 0x42b5, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0120, + 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6, + 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x1130, 0xc6f5, 0x7e5a, 0x6eb6, + 0x781b, 0x0080, 0x0005, 0x781b, 0x0080, 0x2200, 0xa115, 0x1118, + 0x080c, 0x41d9, 0x0005, 0x080c, 0x4206, 0x0005, 0x080c, 0x254c, + 0x0804, 0x2e1c, 0x00c6, 0x7054, 0x2060, 0x6920, 0xa18c, 0xecff, + 0x6922, 0x6000, 0xa084, 0xcfdf, 0x6002, 0x080c, 0x38f4, 0xa006, + 0x2040, 0x2038, 0x080c, 0x399c, 0x0804, 0x2e10, 0x00c6, 0x7054, + 0x2060, 0x2c48, 0x7aa8, 0xa294, 0x00ff, 0xa286, 0x0004, 0x11d8, + 0x6920, 0xd1e4, 0x1170, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, + 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7, 0x080c, 0x399c, 0x0804, + 0x2e10, 0xa18c, 0xecff, 0x6922, 0x6104, 0xa18c, 0xffdd, 0x6106, + 0x6000, 0xc0ac, 0x6002, 0xa286, 0x0003, 0x01d0, 0x6104, 0xa184, + 0x0010, 0x0548, 0x080c, 0x3b6b, 0x080c, 0x3977, 0x88ff, 0x0518, + 0x00ce, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, + 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005, + 0x6920, 0xd1cc, 0x0130, 0xa18c, 0xfdff, 0x6922, 0x6000, 0xc0ec, + 0x6002, 0x2039, 0x0000, 0x2041, 0x0000, 0x2031, 0x0000, 0xa006, + 0x2010, 0x080c, 0x399c, 0xa286, 0x0001, 0x0158, 0x6104, 0xa184, + 0x0008, 0x01b0, 0x080c, 0x3b6b, 0x080c, 0x3895, 0x88ff, 0x1980, + 0x0078, 0x6920, 0xd1c4, 0x0130, 0xa18c, 0xfeff, 0x6922, 0x6000, + 0xc0e4, 0x6002, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7, + 0x00ce, 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, + 0x0083, 0x0005, 0x0804, 0x3a32, 0x2808, 0x789b, 0x0080, 0x2019, + 0x0080, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x11b8, 0x2300, + 0xa102, 0xa086, 0x0001, 0x0904, 0x2d8a, 0x7ca8, 0xa4a4, 0x00ff, + 0xa480, 0x0002, 0xa300, 0x2018, 0xa102, 0x0a04, 0x2d9e, 0x0904, + 0x2d9e, 0x24a8, 0x7aa8, 0x1f04, 0x2e3a, 0x0c18, 0xa284, 0x00f0, + 0xa082, 0x0020, 0x06b8, 0x2200, 0xa082, 0x0021, 0x1698, 0x7aa8, + 0x8318, 0x8318, 0x2100, 0xa302, 0x0aa0, 0xa286, 0x0023, 0x0950, + 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5, + 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x78a0, 0x8001, 0x0904, + 0x2e10, 0x20a8, 0x7998, 0x789b, 0x0060, 0x78aa, 0x2011, 0x0080, + 0x799a, 0x78a8, 0x7998, 0x7a9a, 0x78aa, 0x7a98, 0x1f04, 0x2e68, + 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, 0x781b, + 0x0082, 0x0005, 0x8318, 0x2100, 0xa302, 0x0a04, 0x2e21, 0xa284, + 0x0080, 0x1904, 0x3a36, 0x78a0, 0xa005, 0x08c8, 0x0804, 0x3a36, + 0x0804, 0x3a0b, 0x7054, 0xa04d, 0x789b, 0x0018, 0x78a8, 0xa084, + 0x00ff, 0xa08e, 0x0001, 0x0110, 0x080c, 0x254c, 0x7aa8, 0xa294, + 0x00ff, 0x784b, 0x0008, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0005, + 0x1a04, 0x3a0b, 0x0002, 0x3a0b, 0x380c, 0x3a0b, 0x3927, 0x3d31, + 0xa282, 0x0000, 0x1110, 0x080c, 0x254c, 0x080c, 0x3a3c, 0x781b, + 0x0082, 0x0005, 0xa282, 0x0003, 0x1110, 0x080c, 0x254c, 0xd4fc, + 0x11d0, 0x7060, 0xa005, 0x0110, 0x080c, 0x254c, 0x6f14, 0x7772, + 0xa7bc, 0x8f00, 0x080c, 0x3b6f, 0x6008, 0xa085, 0x0021, 0x600a, + 0x8738, 0xa784, 0x001f, 0x1db0, 0x080c, 0x3a3f, 0x7063, 0x0002, + 0x701f, 0x0009, 0x0010, 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, + 0xa282, 0x0004, 0x0310, 0x080c, 0x254c, 0x2300, 0x0002, 0x2ee2, + 0x3078, 0x30b4, 0xa286, 0x0003, 0x0598, 0x7200, 0x7cd8, 0x7ddc, + 0x7fd0, 0x71d0, 0xd1b4, 0x0528, 0xd1bc, 0x1518, 0x2001, 0x4601, + 0x2004, 0xd0c4, 0x11f0, 0x7868, 0xa084, 0x00ff, 0x11d0, 0xa282, + 0x0002, 0x12b8, 0x00d6, 0x783b, 0x8300, 0x781b, 0x0059, 0x70b8, + 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, + 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, 0x00de, 0x2001, 0x0000, + 0x0058, 0x783b, 0x1300, 0x781b, 0x0057, 0x2001, 0x0000, 0x0020, + 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x7046, 0x68a0, 0xd0ec, 0x0118, + 0x6008, 0xc08d, 0x600a, 0xa284, 0x000f, 0x0002, 0x3059, 0x2f33, + 0x2f30, 0x3184, 0x320f, 0x25a0, 0x2f2e, 0x2f2e, 0x080c, 0x254c, + 0x6008, 0xc0d4, 0x600a, 0xd6e4, 0x0120, 0x7044, 0xa086, 0x0014, + 0x11e8, 0x080c, 0x3f26, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0108, + 0x7044, 0xa086, 0x0014, 0x0168, 0x6818, 0xa086, 0x0008, 0x1904, + 0x301b, 0x7858, 0xd09c, 0x0904, 0x301b, 0x6820, 0xd0ac, 0x0904, + 0x301b, 0x681b, 0x0014, 0x2009, 0x0002, 0x04a8, 0x7868, 0xa08c, + 0x00ff, 0x0588, 0xa186, 0x0008, 0x1158, 0x6008, 0xc0a4, 0x600a, + 0x080c, 0x374f, 0x0540, 0x080c, 0x37be, 0x080c, 0x3f26, 0x0060, + 0xa186, 0x0028, 0x1500, 0x6018, 0xa005, 0x0d78, 0x8001, 0x0d68, + 0x8001, 0x0d58, 0x601e, 0x0c48, 0x6820, 0xd084, 0x0904, 0x25a0, + 0xc084, 0x6822, 0x080c, 0x2693, 0x7058, 0x00c6, 0x2060, 0x6800, + 0x6002, 0x00ce, 0x6004, 0x6802, 0xa005, 0x2d00, 0x1108, 0x6002, + 0x6006, 0x0804, 0x25a0, 0x0016, 0x81ff, 0x15f0, 0x7000, 0xa086, + 0x0030, 0x05d0, 0x71d0, 0xd1bc, 0x15b8, 0xd1b4, 0x11e8, 0x705c, + 0xa005, 0x1590, 0x70a0, 0xa086, 0x0001, 0x0570, 0x7003, 0x0000, + 0x0046, 0x0056, 0x0076, 0x0066, 0x00c6, 0x00d6, 0x080c, 0x25c5, + 0x00de, 0x00ce, 0x006e, 0x007e, 0x005e, 0x004e, 0x71d0, 0xd1b4, + 0x11d8, 0x7003, 0x0040, 0x00c0, 0x080c, 0x3c33, 0x11a8, 0x781b, + 0x0068, 0x00d6, 0x70b8, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, + 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, + 0x7808, 0xc08d, 0x780a, 0x00de, 0x080c, 0x30dc, 0x001e, 0x81ff, + 0x0904, 0x301b, 0xa684, 0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14, + 0xa186, 0x0002, 0x1904, 0x301c, 0x6818, 0xa086, 0x0014, 0x1130, + 0x2008, 0xd6e4, 0x0118, 0x7868, 0xa08c, 0x00ff, 0x080c, 0x3a55, + 0x080c, 0x269e, 0x6820, 0xd0dc, 0x1578, 0x8717, 0xa294, 0x000f, + 0x8213, 0x8213, 0x8213, 0xb284, 0x0600, 0x0118, 0xa290, 0x4ac0, + 0x0010, 0xa290, 0x4b40, 0xa290, 0x0000, 0x221c, 0xd3c4, 0x0170, + 0x6820, 0xd0e4, 0x0128, 0xa084, 0xefff, 0x6822, 0xc3ac, 0x2312, + 0x8210, 0x2204, 0xa085, 0x0038, 0x2012, 0x8211, 0xd3d4, 0x0138, + 0x68a0, 0xd0c4, 0x1120, 0x080c, 0x3144, 0x0804, 0x25a0, 0x6008, + 0xc08d, 0x600a, 0x0008, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0110, + 0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0168, + 0x2009, 0x4602, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, 0x1128, + 0x2021, 0x4604, 0x2404, 0xc0a5, 0x2022, 0x6018, 0xa005, 0x0118, + 0x8001, 0x601a, 0x1118, 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, + 0x1130, 0x6800, 0xa005, 0x1108, 0x6002, 0x6006, 0x0020, 0x7058, + 0x2060, 0x6800, 0x6002, 0x2061, 0x4600, 0x6887, 0x0103, 0x2d08, + 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0110, 0x2d02, 0x0008, + 0x616e, 0x7200, 0xa286, 0x0030, 0x0158, 0xa286, 0x0040, 0x1904, + 0x25a0, 0x7003, 0x0002, 0x7048, 0x2068, 0x68c4, 0x2060, 0x0005, + 0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc, 0x703e, 0x70b4, 0xa065, + 0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80, 0x0009, 0x7042, 0x0005, + 0xa282, 0x0004, 0x0210, 0x080c, 0x254c, 0x2200, 0x0002, 0x3083, + 0x3092, 0x309e, 0x3092, 0xa586, 0x1300, 0x0160, 0xa586, 0x8300, + 0x1d90, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, + 0xfbef, 0x600a, 0x7000, 0xa086, 0x0005, 0x0128, 0x080c, 0x3a3c, + 0x781b, 0x0082, 0x0005, 0x781b, 0x0083, 0x0005, 0x7890, 0x8007, + 0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, + 0x00ff, 0xa186, 0x0003, 0x0128, 0xa186, 0x0000, 0x0110, 0x0804, + 0x3a0b, 0x781b, 0x0083, 0x0005, 0x6820, 0xc095, 0x6822, 0x82ff, + 0x1118, 0x080c, 0x3a3c, 0x0030, 0x8211, 0x0110, 0x080c, 0x254c, + 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, 0x080c, 0x3c46, 0x7830, + 0xa084, 0x00c0, 0x1170, 0x0016, 0x3208, 0xa18c, 0x0800, 0x001e, + 0x0118, 0x0104, 0x30d9, 0x0010, 0x0304, 0x30d9, 0x791a, 0xa006, + 0x0005, 0xa085, 0x0001, 0x0005, 0xa684, 0x0060, 0x1130, 0x682f, + 0x0000, 0x6833, 0x0000, 0x0804, 0x3143, 0xd6dc, 0x1198, 0x68b4, + 0xd0dc, 0x1180, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7044, 0xa005, + 0x1130, 0x2200, 0xa105, 0x0904, 0x3f26, 0x7047, 0x0015, 0x0804, + 0x3f26, 0x0005, 0xd6ac, 0x01f0, 0xd6f4, 0x0130, 0x682f, 0x0000, + 0x6833, 0x0000, 0x0804, 0x3f26, 0x68b4, 0xa084, 0x4000, 0xa635, + 0xd6f4, 0x1da0, 0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0xd6dc, + 0x1128, 0x68b4, 0xd0dc, 0x0110, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, + 0x0804, 0x3f26, 0xd6f4, 0x0130, 0x682f, 0x0000, 0x6833, 0x0000, + 0x0804, 0x3f26, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x1da0, + 0x7044, 0xa005, 0x1110, 0x7047, 0x0015, 0x2408, 0x2510, 0x2700, + 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x692e, 0x6a32, + 0x2100, 0xa205, 0x1110, 0x0804, 0x3f26, 0x7000, 0xa086, 0x0006, + 0x0110, 0x0804, 0x3f26, 0x0005, 0x6946, 0x6008, 0xc0cd, 0xd3cc, + 0x0108, 0xc08d, 0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f, + 0x0000, 0x6893, 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, + 0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, + 0x0020, 0x7000, 0x0002, 0x25a0, 0x3173, 0x316d, 0x316b, 0x316b, + 0x316b, 0x316b, 0x316b, 0x080c, 0x254c, 0x6820, 0xd084, 0x1118, + 0x080c, 0x37a4, 0x0030, 0x7058, 0x2c50, 0x2060, 0x6800, 0x6002, + 0x2a60, 0xaea0, 0x0017, 0x2404, 0xa005, 0x0110, 0x2020, 0x0cd8, + 0x2d22, 0x206b, 0x0000, 0x0005, 0x080c, 0x37aa, 0x080c, 0x37be, + 0x6008, 0xc0cc, 0x600a, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, + 0x6938, 0x691a, 0x6944, 0x6916, 0x2009, 0x0000, 0xae86, 0x4640, + 0x0110, 0x2009, 0x0001, 0x080c, 0x42ec, 0xd6dc, 0x01c8, 0x691c, + 0xc1ed, 0x691e, 0x6828, 0xa082, 0x000e, 0x0290, 0x6848, 0xa084, + 0x000f, 0xa086, 0x000b, 0x1160, 0x685c, 0xa086, 0x0047, 0x1140, + 0x2001, 0x4601, 0x2004, 0xd0ac, 0x1118, 0x2700, 0x080c, 0x2475, + 0x6818, 0xd0fc, 0x0140, 0x681b, 0x0000, 0x7868, 0xa08c, 0x00ff, + 0x0110, 0x681b, 0x001e, 0xaea0, 0x0017, 0x6800, 0x2022, 0x6a3c, + 0x6940, 0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0580, + 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x00d6, 0x00f6, + 0x0156, 0x0146, 0x2079, 0x4600, 0x080c, 0x1b93, 0x014e, 0x015e, + 0x00fe, 0x70c8, 0x2010, 0x2009, 0x0101, 0x0026, 0x2204, 0xa06d, + 0x0140, 0x6814, 0xa706, 0x0110, 0x6800, 0x0cc8, 0x6820, 0xc0d5, + 0x6822, 0x002e, 0x8210, 0x8109, 0x1d80, 0x00de, 0x7063, 0x0003, + 0x707b, 0x0000, 0x7772, 0x707f, 0x000f, 0x71d0, 0xc1c4, 0x71d2, + 0x6818, 0xa086, 0x0002, 0x1138, 0x6817, 0x0000, 0x682b, 0x0000, + 0x681c, 0xc0ec, 0x681e, 0x080c, 0x1da2, 0x0804, 0x25a0, 0x7cd8, + 0x7ddc, 0x7fd0, 0x080c, 0x30dc, 0x682b, 0x0000, 0x789b, 0x000e, + 0x6f14, 0x080c, 0x3c4a, 0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc, + 0x0110, 0x7044, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x7063, 0x0000, + 0x0804, 0x25a0, 0x7000, 0xa005, 0x1110, 0x0804, 0x25a0, 0xa006, + 0x080c, 0x3f26, 0x6920, 0xd1ac, 0x1110, 0x681b, 0x0014, 0xa68c, + 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822, + 0x7000, 0x0002, 0x25a0, 0x324c, 0x324c, 0x324f, 0x324f, 0x324f, + 0x324a, 0x324a, 0x080c, 0x254c, 0x6818, 0x0804, 0x2f18, 0x6008, + 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0804, 0x3772, 0x2300, 0x0002, + 0x325b, 0x325d, 0x32ab, 0x080c, 0x254c, 0xd6fc, 0x1904, 0x2d38, + 0x7000, 0xa00d, 0x0002, 0x25a0, 0x326d, 0x326d, 0x3297, 0x326d, + 0x32a8, 0x326b, 0x326b, 0x080c, 0x254c, 0xa684, 0x0060, 0x0538, + 0xa086, 0x0060, 0x1510, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, + 0x681c, 0xc0ac, 0x681e, 0xa186, 0x0002, 0x0148, 0x080c, 0x3f26, + 0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x4206, 0x0010, 0x080c, + 0x41d9, 0x781b, 0x0083, 0x71d0, 0xd1b4, 0x1904, 0x259d, 0x70a0, + 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6ec, 0x09f0, 0x6818, + 0xd0fc, 0x0170, 0xd6f4, 0x1130, 0x681b, 0x0015, 0x781b, 0x0083, + 0x0804, 0x259d, 0x681b, 0x0007, 0x682f, 0x0000, 0x6833, 0x0000, + 0x080c, 0x3bf1, 0x0005, 0x080c, 0x254c, 0x2300, 0x0002, 0x32b4, + 0x32d6, 0x332e, 0x080c, 0x254c, 0x7000, 0x0002, 0x32be, 0x32c0, + 0x32c7, 0x32be, 0x32be, 0x32be, 0x32be, 0x32be, 0x080c, 0x254c, + 0x69ac, 0x68b0, 0xa115, 0x0118, 0x080c, 0x4206, 0x0010, 0x080c, + 0x41d9, 0x681c, 0xc0b4, 0x681e, 0x70d0, 0xd0b4, 0x1904, 0x259d, + 0x70a0, 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6fc, 0x1904, + 0x331e, 0x7000, 0xa00d, 0x0002, 0x25a0, 0x32ec, 0x32e6, 0x3316, + 0x32ec, 0x331b, 0x32e4, 0x32e4, 0x080c, 0x254c, 0x6894, 0x78d6, + 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0x0538, 0xa086, + 0x0060, 0x1510, 0xa6b4, 0xbfbf, 0xc6ed, 0x7e5a, 0x6eb6, 0xa186, + 0x0002, 0x0148, 0x080c, 0x3f26, 0x69ac, 0x68b0, 0xa115, 0x0118, + 0x080c, 0x4206, 0x0010, 0x080c, 0x41d9, 0x781b, 0x0083, 0x681c, + 0xc0b4, 0x681e, 0x71d0, 0xd1b4, 0x1904, 0x259d, 0x70a0, 0xa086, + 0x0001, 0x1904, 0x25e1, 0x0005, 0xd6ec, 0x09f0, 0x6818, 0xd0fc, + 0x0110, 0x681b, 0x0007, 0x781b, 0x00fb, 0x0005, 0xc6fc, 0x7e5a, + 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, + 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0083, 0x0005, 0xd6dc, 0x0130, + 0x782b, 0x3009, 0x781b, 0x0083, 0x0804, 0x259d, 0x7884, 0xc0ac, + 0x7886, 0x78e4, 0xa084, 0x0008, 0x1150, 0xa484, 0x0200, 0x0108, + 0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0083, 0x0804, 0x259d, 0x6820, + 0xc095, 0x6822, 0x080c, 0x3bdc, 0xc6dd, 0x080c, 0x3a3c, 0x781b, + 0x0082, 0x0804, 0x259d, 0x2300, 0x0002, 0x3358, 0x335a, 0x335c, + 0x080c, 0x254c, 0x0804, 0x3a36, 0x7d98, 0xd6d4, 0x15a8, 0x79e4, + 0xd1ac, 0x0130, 0x78ec, 0xa084, 0x0003, 0x0110, 0x782b, 0x3009, + 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x7d9a, + 0x79e4, 0xd1ac, 0x0120, 0x78ec, 0xa084, 0x0003, 0x1120, 0x2001, + 0x0014, 0x0804, 0x2f18, 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, + 0x0090, 0xa184, 0x0007, 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, + 0x0050, 0xa184, 0x0007, 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, + 0x0010, 0x2001, 0x0001, 0x04c2, 0x7a90, 0xa294, 0x0007, 0x789b, + 0x0060, 0x79a8, 0x81ff, 0x0568, 0x789b, 0x0080, 0x7ba8, 0xa384, + 0x0001, 0x11d0, 0x7ba8, 0x7ba8, 0xa386, 0x0004, 0x1118, 0x2009, + 0xffdf, 0x0058, 0xa386, 0x0001, 0x1118, 0x2009, 0xfff7, 0x0028, + 0xa386, 0x0003, 0x1148, 0x2009, 0xffef, 0x00c6, 0x7054, 0x2060, + 0x6004, 0xa104, 0x6006, 0x00ce, 0x789b, 0x0060, 0x78ab, 0x0000, + 0xa684, 0xfffb, 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xecff, + 0x6922, 0x7d9a, 0x0804, 0x3be5, 0x2bae, 0x2bb7, 0x33d6, 0x33dc, + 0x33d4, 0x33d4, 0x3be5, 0x3be5, 0x080c, 0x254c, 0x6920, 0xa18c, + 0xfcff, 0x6922, 0x0804, 0x3beb, 0x6920, 0xa18c, 0xfcff, 0x6922, + 0x0804, 0x3be5, 0x79e4, 0xa184, 0x0030, 0x0120, 0x78ec, 0xa084, + 0x0003, 0x1570, 0x7000, 0xa086, 0x0004, 0x1190, 0x7060, 0xa086, + 0x0002, 0x1130, 0x2011, 0x0002, 0x2019, 0x0000, 0x0804, 0x2a56, + 0x7060, 0xa086, 0x0006, 0x0db0, 0x7060, 0xa086, 0x0004, 0x0d90, + 0x7000, 0xa086, 0x0000, 0x0904, 0x259d, 0x6920, 0xa184, 0x0420, + 0x0128, 0xc1d4, 0x6922, 0x6818, 0x0804, 0x2f18, 0x6818, 0xa08e, + 0x0002, 0x0120, 0xc0fd, 0x681a, 0x2001, 0x0014, 0x0804, 0x2f18, + 0x7884, 0xd0fc, 0x1118, 0xa184, 0x0007, 0x0090, 0xa184, 0x0007, + 0xa086, 0x0004, 0x1118, 0x2001, 0x0000, 0x0050, 0xa184, 0x0007, + 0xa086, 0x0005, 0x0118, 0xa184, 0x0007, 0x0010, 0x2001, 0x0001, + 0x0002, 0x3be5, 0x3be5, 0x3439, 0x3be5, 0x3c29, 0x3c29, 0x3be5, + 0x3be5, 0xd6bc, 0x0570, 0x7180, 0x81ff, 0x0558, 0xa182, 0x000d, + 0x1318, 0x7083, 0x0000, 0x0028, 0xa182, 0x000c, 0x7082, 0x2009, + 0x000c, 0x789b, 0x0061, 0x79aa, 0x0156, 0x0136, 0x0146, 0x7084, + 0x8114, 0xa210, 0x7286, 0xa080, 0x000b, 0xad00, 0x2098, 0xb284, + 0x0600, 0x0118, 0x20a1, 0x022b, 0x0010, 0x20a1, 0x012b, 0x789b, + 0x0000, 0x8108, 0x81ac, 0x53a6, 0x014e, 0x013e, 0x015e, 0x0804, + 0x3beb, 0xd6d4, 0x1904, 0x34ac, 0x6820, 0xd084, 0x0904, 0x3beb, + 0xa68c, 0x0060, 0xa684, 0x0060, 0x0120, 0xa086, 0x0060, 0x1108, + 0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000, + 0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa, 0x8008, 0x810c, + 0x0904, 0x37d3, 0xa18c, 0x00f8, 0x1904, 0x37d3, 0x0156, 0x0136, + 0x0146, 0x0016, 0x20a1, 0x012b, 0x3208, 0xa18c, 0x0600, 0x0110, + 0x20a1, 0x022b, 0x001e, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, + 0x000b, 0x2098, 0x53a6, 0x014e, 0x013e, 0x015e, 0x6814, 0xc0fc, + 0x8007, 0x7882, 0x0804, 0x3beb, 0x6818, 0xd0fc, 0x0110, 0x681b, + 0x0008, 0x080c, 0x3a3c, 0x781b, 0x00ed, 0x0005, 0x2300, 0x0002, + 0x34bd, 0x357a, 0x34bb, 0x080c, 0x254c, 0x7cd8, 0x7ddc, 0x7fd0, + 0x82ff, 0x1528, 0x7200, 0xa286, 0x0003, 0x0904, 0x2ee6, 0x71d0, + 0xd1bc, 0x11f8, 0xd1b4, 0x01e8, 0x2001, 0x4601, 0x2004, 0xd0c4, + 0x11c0, 0x00d6, 0x783b, 0x8800, 0x781b, 0x0059, 0x70b8, 0xa06d, + 0x68b4, 0xc0a5, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, + 0x78da, 0xc1b4, 0x71d2, 0x7003, 0x0030, 0x00de, 0x0030, 0x7200, + 0x0020, 0x783b, 0x1800, 0x781b, 0x0057, 0xa284, 0x000f, 0x0002, + 0x3565, 0x3522, 0x34fa, 0x2f15, 0x34f8, 0x3565, 0x34f8, 0x34f8, + 0x080c, 0x254c, 0x681c, 0xd0ec, 0x0118, 0x6008, 0xc08d, 0x600a, + 0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005, 0x1108, 0x6002, + 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084, 0x000e, 0x1120, 0x71c8, + 0xa188, 0x0100, 0x0028, 0x7030, 0x68ba, 0x713c, 0x70c8, 0xa108, + 0x2104, 0x6802, 0x2d0a, 0x715a, 0xd6dc, 0x1120, 0xc6fc, 0x6eb6, + 0x0804, 0x3565, 0x6eb6, 0xa684, 0x0060, 0x1120, 0xa684, 0x7fff, + 0x68b6, 0x04d8, 0xd6dc, 0x1150, 0xa684, 0x7fff, 0x68b6, 0x6894, + 0x68a6, 0x6898, 0x68aa, 0x080c, 0x3f26, 0x0478, 0xd6ac, 0x0140, + 0xa006, 0x080c, 0x3f26, 0x2408, 0x2510, 0x69aa, 0x6aa6, 0x0068, + 0x2408, 0x2510, 0x2700, 0x8007, 0xa084, 0x007f, 0xa108, 0xa291, + 0x0000, 0x69aa, 0x6aa6, 0x080c, 0x3f26, 0xd6fc, 0x01b0, 0xa684, + 0x7fff, 0x68b6, 0x2510, 0x2408, 0xd6ac, 0x1138, 0x2700, 0x8007, + 0xa084, 0x007f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, + 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x7000, 0xa086, 0x0030, + 0x1904, 0x25a0, 0x7003, 0x0002, 0x70b8, 0xa06d, 0x68bc, 0x703e, + 0x70b4, 0xa065, 0x68c0, 0x7056, 0x2d00, 0x704a, 0xad80, 0x0009, + 0x7042, 0x0005, 0xa586, 0x8800, 0x1148, 0x7003, 0x0000, 0x6018, + 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, 0x600a, 0x0804, 0x3a36, + 0x7043, 0x0000, 0xa282, 0x0006, 0x0310, 0x080c, 0x254c, 0x2300, + 0x0002, 0x3594, 0x35a5, 0x35af, 0x2200, 0x0002, 0x359c, 0x3a36, + 0x359e, 0x359c, 0x35e0, 0x362e, 0x080c, 0x254c, 0x7a80, 0xa294, + 0x0f00, 0x080c, 0x3682, 0x0804, 0x3a0b, 0x00c1, 0x0002, 0x3a36, + 0x35ad, 0x35ad, 0x35e0, 0x35ad, 0x3a36, 0x080c, 0x254c, 0x0071, + 0x0002, 0x35b9, 0x35b7, 0x35b7, 0x35b9, 0x35b7, 0x35b9, 0x080c, + 0x254c, 0x080c, 0x3a4b, 0x781b, 0x0082, 0x0005, 0x7000, 0xa086, + 0x0002, 0x1150, 0x080c, 0x37be, 0x0010, 0x080c, 0x3f26, 0x6008, + 0xa084, 0xfbef, 0x600a, 0x0020, 0x7000, 0xa086, 0x0003, 0x0da8, + 0x7003, 0x0005, 0x2001, 0x8de0, 0xae8e, 0x4640, 0x0110, 0x2001, + 0x8e12, 0x2068, 0x704a, 0xad80, 0x0009, 0x7042, 0x2200, 0x0005, + 0x7000, 0xa086, 0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2, 0x2c00, + 0x70b6, 0x2d00, 0x70ba, 0x0038, 0x080c, 0x3f26, 0x0020, 0x7000, + 0xa086, 0x0003, 0x0dc8, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, + 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x8cc0, + 0xb284, 0x0600, 0x1118, 0xc2fd, 0x2069, 0x8dd0, 0x2d04, 0x2d08, + 0x715a, 0xa06d, 0x0128, 0x6814, 0xa206, 0x0120, 0x6800, 0x0cb8, + 0x080c, 0x3682, 0x6eb4, 0x7e5a, 0x6920, 0xa184, 0x0c00, 0x0904, + 0x36a8, 0x7060, 0xa086, 0x0006, 0x1128, 0x7070, 0xa206, 0x1110, + 0x7062, 0x707a, 0x681b, 0x0005, 0xc1ad, 0x681b, 0x0005, 0xc1ad, + 0xc1d4, 0x6922, 0x080c, 0x3a42, 0x0804, 0x36a8, 0x7200, 0xa286, + 0x0002, 0x1158, 0x70d0, 0xc0b5, 0x70d2, 0x2c00, 0x70b6, 0x2d00, + 0x70ba, 0x0030, 0x080c, 0x3f26, 0x0018, 0xa286, 0x0003, 0x0dd0, + 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, + 0xa484, 0x001f, 0xa215, 0xae86, 0x4640, 0x0108, 0xc2fd, 0x79a8, + 0x79a8, 0xa18c, 0x00ff, 0x2118, 0x70c8, 0xa168, 0x2d04, 0x2d08, + 0x715a, 0xa06d, 0x0128, 0x6814, 0xa206, 0x0118, 0x6800, 0x0cb8, + 0x0409, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0904, 0x36a8, 0xd0dc, + 0x0178, 0x7060, 0xa086, 0x0004, 0x1140, 0x7070, 0xa206, 0x1128, + 0x7074, 0xa306, 0x1110, 0x7062, 0x707a, 0x080c, 0x3a48, 0x0480, + 0x681b, 0x0005, 0xc1ad, 0xc1d4, 0x6922, 0x080c, 0x3a42, 0x707b, + 0x0000, 0x0430, 0x7003, 0x0005, 0xb284, 0x0600, 0x0118, 0x2001, + 0x8de0, 0x0010, 0x2001, 0x8e12, 0x2068, 0x704a, 0x0156, 0x20a9, + 0x0032, 0x2003, 0x0000, 0x8000, 0x1f04, 0x3691, 0x015e, 0xb284, + 0x0600, 0x0110, 0xc2fc, 0x0008, 0xc2fd, 0x6a16, 0xad80, 0x0009, + 0x7042, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0005, + 0xc6ec, 0xa6ac, 0x0060, 0x0904, 0x36ef, 0x6b98, 0x6c94, 0x69ac, + 0x68b0, 0xa105, 0x11e0, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa586, + 0x0060, 0x05c8, 0xd6f4, 0x1108, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a, + 0x2009, 0x0083, 0xd69c, 0x0128, 0x2009, 0x0082, 0x2019, 0x0000, + 0x2320, 0x791a, 0xd6ec, 0x0588, 0x080c, 0x41d9, 0x0470, 0x68b0, + 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x01f8, 0x7bd2, 0x7bda, + 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x1108, 0xc6ed, 0xc6f4, 0x7e5a, + 0x2011, 0x0083, 0xd69c, 0x0128, 0x2011, 0x0082, 0x2019, 0x0000, + 0x2320, 0x7a1a, 0xd6ec, 0x0188, 0x080c, 0x4206, 0x0070, 0x2019, + 0x0000, 0x2320, 0x0010, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0083, + 0xd69c, 0x0110, 0x2009, 0x0082, 0x791a, 0x68c0, 0x7056, 0x2d00, + 0x704a, 0x68c4, 0x2060, 0x71d0, 0x2001, 0x4601, 0x2004, 0xd0c4, + 0x15c8, 0x70d4, 0xa02d, 0x01b8, 0xd1bc, 0x0548, 0x7a80, 0xa294, + 0x0f00, 0x70d8, 0xa206, 0x0118, 0x78e0, 0xa504, 0x1558, 0x70d6, + 0xc1bc, 0x71d2, 0x0438, 0x2031, 0x0001, 0x852c, 0x0218, 0x8633, + 0x8210, 0x0cd8, 0x0005, 0x7de0, 0xa594, 0xff00, 0x0130, 0x2011, + 0x0008, 0x852f, 0x0c81, 0x8637, 0x0008, 0x0c69, 0x8217, 0x7880, + 0xa084, 0x0f00, 0xa206, 0x0170, 0x72da, 0x76d6, 0x0058, 0x7a80, + 0xa294, 0x0f00, 0x70d8, 0xa236, 0x0dc0, 0x78e0, 0xa534, 0x0da8, + 0xc1bd, 0x71d2, 0xd1b4, 0x1904, 0x259d, 0x2300, 0xa405, 0x0904, + 0x259d, 0x70a0, 0xa086, 0x0001, 0x1904, 0x25e1, 0x0005, 0x6020, 0xa005, 0x0150, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a, - 0x700f, 0x0100, 0x702c, 0x6026, 0x0005, 0xa006, 0x080c, 0x3d52, + 0x700f, 0x0100, 0x702c, 0x6026, 0x0005, 0xa006, 0x080c, 0x3f26, + 0x7000, 0xa086, 0x0002, 0x0120, 0x7060, 0xa086, 0x0005, 0x1150, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, - 0x681f, 0x0100, 0x7000, 0xa084, 0x000f, 0x0002, 0x248f, 0x358b, - 0x3588, 0x35a7, 0x3594, 0x248f, 0x3586, 0x3586, 0x080c, 0x243b, - 0x0441, 0x0409, 0x0028, 0x0429, 0x705c, 0x2060, 0x6800, 0x6002, - 0x080c, 0x1d3d, 0x0804, 0x248f, 0x7064, 0x7067, 0x0000, 0x7083, - 0x0000, 0x0002, 0x35a3, 0x35a3, 0x35a2, 0x35a2, 0x35a2, 0x35a3, - 0x35a2, 0x35a3, 0x2971, 0x7067, 0x0000, 0x0804, 0x248f, 0x681b, - 0x0000, 0x0804, 0x3012, 0x6800, 0xa005, 0x1108, 0x6002, 0x6006, - 0x0005, 0x6410, 0x84ff, 0x0168, 0x2009, 0x4302, 0x2104, 0x8001, - 0x200a, 0x8421, 0x6412, 0x1128, 0x2021, 0x4304, 0x2404, 0xc0a5, - 0x2022, 0x6008, 0xc0a4, 0x600a, 0x0005, 0x6018, 0xa005, 0x0110, - 0x8001, 0x601a, 0x0005, 0x080c, 0x3aa0, 0x681b, 0x0018, 0x04a0, - 0x080c, 0x3aa0, 0x681b, 0x0019, 0x0478, 0x080c, 0x3aa0, 0x681b, - 0x001a, 0x0450, 0x080c, 0x3aa0, 0x681b, 0x0003, 0x0428, 0x7774, - 0x080c, 0x396d, 0x7178, 0xa18c, 0x00ff, 0x3210, 0xa294, 0x0600, - 0x0118, 0xa1e8, 0x88c0, 0x0010, 0xa1e8, 0x89d0, 0x2d04, 0x2d08, - 0x2068, 0xa005, 0x1118, 0x707e, 0x0804, 0x248f, 0x6814, 0xc0fc, - 0x7274, 0xc2fc, 0xa206, 0x0110, 0x6800, 0x0c88, 0x6800, 0x200a, - 0x681b, 0x0005, 0x707f, 0x0000, 0x080c, 0x35b1, 0x6820, 0xd084, - 0x1110, 0x080c, 0x35ab, 0x080c, 0x35c5, 0x681f, 0x0000, 0x6823, - 0x0020, 0x080c, 0x1d3d, 0x0804, 0x248f, 0xa282, 0x0003, 0x1904, - 0x380d, 0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, - 0xc1bd, 0x6922, 0xd1c4, 0x0590, 0xc1c4, 0x6922, 0xa6b4, 0x00ff, - 0x0510, 0xa682, 0x001c, 0x0218, 0x0110, 0x2031, 0x001c, 0x852b, - 0x852b, 0x2041, 0x0000, 0x080c, 0x38c6, 0x0118, 0x080c, 0x36f6, - 0x00a0, 0x080c, 0x3892, 0x080c, 0x36f3, 0x6920, 0xc1c5, 0x6922, - 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, 0x0005, - 0x781b, 0x0082, 0x0005, 0x080c, 0x36f3, 0x7e58, 0xd6d4, 0x1118, - 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0x00c6, 0x7058, - 0x2060, 0x6100, 0xd1e4, 0x0578, 0x6208, 0x8217, 0xa294, 0x00ff, - 0xa282, 0x001c, 0x0218, 0x0110, 0x2011, 0x001c, 0x2600, 0xa202, - 0x1208, 0x2230, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130, - 0xa282, 0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c, - 0x1210, 0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228, 0x080c, - 0x3896, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x38c6, 0x0118, - 0x080c, 0x36f6, 0x0020, 0x080c, 0x3892, 0x080c, 0x36f3, 0x7858, - 0xc095, 0x785a, 0x00ce, 0x781b, 0x0082, 0x0005, 0x00c6, 0x2960, - 0x6000, 0xd0e4, 0x1178, 0x6010, 0xa084, 0x000f, 0x1130, 0x6104, - 0xa18c, 0xfff5, 0x6106, 0x00ce, 0x0005, 0x2011, 0x0032, 0x2019, - 0x0000, 0x00f0, 0x68a0, 0xd0cc, 0x1dc0, 0x6208, 0xa294, 0x00ff, - 0x78ec, 0xd0e4, 0x0130, 0xa282, 0x000b, 0x1218, 0x2011, 0x000a, - 0x0028, 0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x6308, 0x831f, - 0xa39c, 0x00ff, 0xa382, 0x001c, 0x0218, 0x0110, 0x2019, 0x001c, - 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, - 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x080c, 0x3850, 0x00ce, - 0x0005, 0x00c6, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, 0x2011, - 0x0032, 0x2019, 0x0000, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0003, - 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, - 0x6822, 0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x00c6, 0x7158, - 0x2160, 0x2018, 0x2008, 0xa084, 0xffe0, 0xa635, 0x7e86, 0x6018, - 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084, 0x7770, 0xa18c, 0x000f, - 0xa105, 0x2029, 0x4305, 0x252c, 0xd5cc, 0x0140, 0xd3a4, 0x0110, - 0xa085, 0x0800, 0xd3fc, 0x0110, 0xa085, 0x8080, 0x78a6, 0x6016, - 0x788a, 0xa6b4, 0x001f, 0x8637, 0x8204, 0x8004, 0xa605, 0x600e, - 0x6004, 0xa084, 0xffd5, 0x6006, 0x00ce, 0x0005, 0xa282, 0x0002, - 0x1904, 0x3816, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc, 0x0568, - 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x1a04, 0x3809, - 0x080c, 0x379c, 0x080c, 0x36f3, 0xa980, 0x0001, 0x200c, 0x080c, - 0x3969, 0x080c, 0x3696, 0x88ff, 0x0178, 0x789b, 0x0060, 0x2800, - 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, 0x006e, - 0x0005, 0x781b, 0x0082, 0x0005, 0x7e58, 0xd6d4, 0x1118, 0x781b, - 0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0xa282, 0x0002, 0x1218, - 0xa284, 0x0001, 0x0140, 0x7158, 0xa188, 0x0000, 0x210c, 0xd1ec, - 0x1110, 0x2011, 0x0000, 0x080c, 0x3883, 0x0471, 0x080c, 0x36f3, - 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x00c6, 0x0026, - 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x1150, 0x6014, 0xa084, - 0x0040, 0x1120, 0xc1a4, 0x6106, 0xa006, 0x0088, 0x2011, 0x0000, - 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, - 0x0004, 0x080c, 0x3850, 0x6820, 0xa085, 0x0200, 0x6822, 0x002e, - 0x00ce, 0x0005, 0x8807, 0xa715, 0x00c6, 0x2009, 0x0000, 0x7058, - 0x2060, 0x82ff, 0x0110, 0x2009, 0x0040, 0x6018, 0xa080, 0x0002, - 0x789a, 0x78a4, 0xa084, 0xff9f, 0xa105, 0xc0ec, 0xd0b4, 0x1108, - 0xc0ed, 0x6100, 0xd1f4, 0x0110, 0xa085, 0x0020, 0x78a6, 0x6016, - 0x788a, 0x6004, 0xa084, 0xffef, 0x6006, 0x00ce, 0x0005, 0x0006, - 0x7000, 0xa086, 0x0003, 0x0110, 0x000e, 0x0010, 0x000e, 0x0488, - 0xd6ac, 0x0578, 0x7888, 0xa084, 0x0040, 0x0558, 0x7bb8, 0x8307, - 0xa084, 0x007f, 0x1508, 0x8207, 0xa084, 0x00ff, 0xa09e, 0x0001, - 0x1904, 0x382d, 0xd6f4, 0x11d0, 0x79d8, 0x7adc, 0xa108, 0xa291, - 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x080c, 0x4083, 0x781b, - 0x0080, 0xb284, 0x0600, 0x0118, 0x2001, 0x0000, 0x0010, 0x2001, - 0x0001, 0x080c, 0x3f50, 0x0005, 0x080c, 0x243b, 0x781b, 0x0080, - 0x0005, 0x781b, 0x0083, 0x0005, 0x2039, 0x0000, 0x2041, 0x0000, - 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x36f6, 0x080c, 0x379a, - 0x7e58, 0x04f9, 0x781b, 0x0082, 0x0005, 0x0cd9, 0x6820, 0xc0c4, - 0x6822, 0x00c6, 0x7058, 0x2060, 0x0804, 0x3720, 0x0c91, 0x6820, - 0xc0cc, 0x6822, 0x00c6, 0x7058, 0x2060, 0x0804, 0x37b9, 0x0c49, - 0x6820, 0xa084, 0xecff, 0x6822, 0x00c6, 0x7058, 0x2060, 0x6004, - 0xa084, 0xffc5, 0x6006, 0x00ce, 0x0005, 0x0049, 0x781b, 0x0082, - 0x0005, 0x6827, 0x0002, 0x0049, 0x781b, 0x0082, 0x0005, 0x2001, - 0x0005, 0x0088, 0x2001, 0x000c, 0x0070, 0x6820, 0xc0d5, 0x6822, - 0x2001, 0x0006, 0x0040, 0x2001, 0x000d, 0x0028, 0x2001, 0x0009, - 0x0010, 0x2001, 0x0007, 0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, - 0x70d4, 0xd0b4, 0x0168, 0xc0b4, 0x70d6, 0x00c6, 0x70b8, 0xa065, - 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, - 0x0005, 0x0076, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, - 0xb28c, 0x0600, 0x0118, 0xa0e0, 0x47c0, 0x0010, 0xa0e0, 0x4840, - 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, 0x7fe0, 0x78ae, 0x6012, - 0x79a4, 0xa184, 0x773f, 0x78a6, 0x6016, 0x6004, 0xa085, 0x0038, - 0x6006, 0x007e, 0x0005, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, - 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, 0x0004, - 0x0804, 0x3850, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b, 0x0080, - 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, 0x7eaa, - 0x789b, 0x0060, 0x78ab, 0x0005, 0x0804, 0x3850, 0x0156, 0x8007, - 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, 0x79a4, - 0xa18c, 0xffe0, 0x2021, 0x3952, 0x2019, 0x0011, 0x20a9, 0x000e, - 0x2011, 0x0032, 0x2404, 0xa084, 0xffe0, 0xa106, 0x0128, 0x8420, - 0x2300, 0xa210, 0x1f04, 0x38ba, 0x015e, 0x0005, 0x0156, 0x0804, - 0x3908, 0x2021, 0x3960, 0x20a9, 0x0009, 0x2011, 0x0029, 0xa582, - 0x0028, 0x0550, 0x8420, 0x95a9, 0x2011, 0x0033, 0xa582, 0x0033, - 0x0618, 0x8420, 0x95a9, 0x2019, 0x000a, 0x2011, 0x0065, 0x2200, - 0xa502, 0x02d0, 0x8420, 0x2300, 0xa210, 0x1f04, 0x38df, 0x015e, - 0x0088, 0x2021, 0x3952, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, - 0x0033, 0x2200, 0xa502, 0x0240, 0x8420, 0x2300, 0xa210, 0x1f04, - 0x38f1, 0x015e, 0xa006, 0x0005, 0x8211, 0x015e, 0xa582, 0x0064, - 0x1220, 0x7808, 0xa085, 0x0070, 0x780a, 0x2404, 0xa005, 0x0005, - 0xa886, 0x0002, 0x01e8, 0x2021, 0x393e, 0x20a9, 0x000d, 0x2011, - 0x0028, 0xa582, 0x0028, 0x0d48, 0x8420, 0x2019, 0x0019, 0x2011, - 0x0033, 0x2200, 0xa502, 0x0e00, 0x8420, 0x2300, 0xa210, 0x1f04, - 0x3919, 0x015e, 0x2011, 0x0184, 0xa582, 0x0185, 0x0ab0, 0x0890, - 0x2021, 0x394d, 0x20a9, 0x0003, 0x2011, 0x0024, 0xa586, 0x0024, - 0x0960, 0x8420, 0x2011, 0x0028, 0xa586, 0x0028, 0x0930, 0x8420, - 0x2019, 0x0019, 0x2011, 0x0033, 0x0804, 0x38f1, 0x1021, 0x2202, - 0x3403, 0x4604, 0x5805, 0x6a06, 0x7c07, 0x4610, 0x4612, 0x5812, - 0x5a12, 0x6a14, 0x6c14, 0x6e14, 0x7e17, 0x9021, 0xb002, 0xe204, - 0xe210, 0xe210, 0x1209, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404, - 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, 0x0e07, - 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07, 0x7e07, - 0x0e00, 0x789b, 0x0080, 0xa046, 0x0005, 0xa784, 0x0f00, 0x800b, - 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xd7fc, - 0x0118, 0xa0e0, 0x68c0, 0x0010, 0xa0e0, 0x48c0, 0x0005, 0x00e6, - 0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009, 0x4380, 0x2071, - 0x4380, 0x0030, 0x2009, 0x4340, 0x2079, 0x0200, 0x2071, 0x4340, - 0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002, 0x39c5, 0x39a0, - 0x39a0, 0x39a0, 0x39a0, 0x39a0, 0x399e, 0x399e, 0x080c, 0x243b, - 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, 0x1de0, 0x784b, 0x0008, - 0x7848, 0xa084, 0x0008, 0x1de0, 0x68b4, 0xc0f5, 0x68b6, 0x7858, - 0xc0f5, 0x785a, 0x7830, 0xd0bc, 0x1180, 0xb284, 0x0800, 0x0118, - 0x0104, 0x39c5, 0x0010, 0x0304, 0x39c5, 0x681c, 0xd0ac, 0x1118, - 0x080c, 0x3a4b, 0x0010, 0x781b, 0x00fb, 0x2091, 0x8001, 0x00fe, - 0x00ee, 0x0005, 0x00c6, 0x2001, 0x4301, 0x2004, 0xd0ac, 0x1904, - 0x3a3d, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, - 0xb28c, 0x0600, 0x0118, 0xa0e0, 0x47c0, 0x0010, 0xa0e0, 0x4840, - 0x6004, 0xa084, 0x000a, 0x1904, 0x3a3d, 0x6108, 0xa194, 0xff00, - 0x0904, 0x3a3d, 0xa18c, 0x00ff, 0x601c, 0xa084, 0xff00, 0x0180, - 0x2001, 0x0009, 0xa102, 0x16b8, 0x2001, 0x000a, 0xa102, 0x16b0, - 0x2001, 0x000c, 0xa102, 0x16a8, 0x601c, 0xa084, 0x00ff, 0x601e, - 0x2001, 0x000a, 0xa106, 0x01a8, 0x2001, 0x000c, 0xa106, 0x01a0, - 0x2001, 0x0012, 0xa106, 0x0198, 0x2001, 0x0014, 0xa106, 0x0190, - 0x2001, 0x0019, 0xa106, 0x0188, 0x2001, 0x0032, 0xa106, 0x0180, - 0x00d8, 0x2009, 0x000c, 0x00d0, 0x2009, 0x0012, 0x00b8, 0x2009, - 0x0014, 0x00a0, 0x2009, 0x0019, 0x0088, 0x2009, 0x0020, 0x0070, - 0x2009, 0x003f, 0x0058, 0x2009, 0x000a, 0x0040, 0x2009, 0x000c, - 0x0028, 0x2009, 0x0019, 0x0010, 0x2011, 0x0000, 0x2100, 0xa205, - 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x00ce, 0x0005, 0x781b, - 0x0083, 0x0005, 0x781b, 0x0082, 0x0005, 0x781b, 0x0071, 0x0005, - 0x781b, 0x006e, 0x0005, 0x2009, 0x4319, 0x210c, 0xa186, 0x0000, - 0x0150, 0xa186, 0x0001, 0x0150, 0x701f, 0x000b, 0x7067, 0x0001, - 0x781b, 0x0054, 0x0005, 0x781b, 0x00f3, 0x0005, 0x701f, 0x000a, - 0x0005, 0x2009, 0x4319, 0x210c, 0xa186, 0x0000, 0x0168, 0xa186, - 0x0001, 0x0138, 0x701f, 0x000b, 0x7067, 0x0001, 0x781b, 0x0054, - 0x0005, 0x701f, 0x000a, 0x0005, 0x781b, 0x00f2, 0x0005, 0x781b, - 0x00fb, 0x0005, 0x781b, 0x00fa, 0x0005, 0x781b, 0x00cc, 0x0005, - 0x781b, 0x00cb, 0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, - 0x7067, 0x0001, 0x781b, 0x0054, 0x0005, 0x7830, 0xa084, 0x00c0, - 0x1170, 0x7808, 0xc08c, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000, - 0x78ec, 0xa084, 0x0021, 0x0118, 0x7808, 0xc08d, 0x780a, 0x0005, - 0x7808, 0xc08d, 0x780a, 0x0005, 0x7830, 0xa084, 0x0040, 0x1de0, - 0xb284, 0x0800, 0x0118, 0x1104, 0x3ab2, 0x0010, 0x1304, 0x3ab2, - 0x78ac, 0x0005, 0x7808, 0xa084, 0xfffd, 0x780a, 0xe000, 0xe000, - 0xe000, 0xe000, 0x78ec, 0xa084, 0x0021, 0x0140, 0xb284, 0x0800, - 0x0118, 0x1104, 0x3ac1, 0x0010, 0x1304, 0x3ac4, 0x78ac, 0x0006, - 0x7808, 0xa085, 0x0002, 0x780a, 0x000e, 0x0005, 0xa784, 0x0001, - 0x1904, 0x30a0, 0xa784, 0x0070, 0x0140, 0x00c6, 0x2d60, 0x2f68, - 0x080c, 0x23e1, 0x2d78, 0x2c68, 0x00ce, 0xa784, 0x0008, 0x0148, - 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x248f, 0x0804, - 0x3a3f, 0xa784, 0x0004, 0x01c8, 0x78b8, 0xa084, 0x8000, 0x01a8, - 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x248f, 0x78e4, - 0xa084, 0x0007, 0xa086, 0x0001, 0x1140, 0x78c0, 0xa685, 0x4800, - 0x2030, 0x7e5a, 0x781b, 0x00fb, 0x0005, 0xa784, 0x0080, 0x0140, - 0x7884, 0xd0fc, 0x0128, 0x080c, 0x382d, 0x681b, 0x0022, 0x0005, - 0x681b, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, - 0x6833, 0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, - 0x2a7a, 0xb284, 0x0800, 0x0110, 0x0104, 0x248c, 0x0304, 0x248c, - 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xd3fc, - 0x0118, 0xa080, 0x4840, 0x0010, 0xa080, 0x47c0, 0x2060, 0x2048, - 0x705a, 0x2a60, 0x0005, 0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, - 0x3b81, 0xd1ac, 0x05e0, 0x6108, 0x8117, 0xa18c, 0x00ff, 0x631c, - 0x832f, 0x68a0, 0xd0cc, 0x11c8, 0xa584, 0x00ff, 0x0138, 0x78ec, - 0xd0e4, 0x0110, 0x8213, 0x00b8, 0x2029, 0x0000, 0xa182, 0x000c, - 0x1290, 0x78ec, 0xd0e4, 0x1118, 0x2009, 0x000c, 0x0060, 0xa182, - 0x000b, 0x1248, 0x2009, 0x000a, 0x0030, 0x2009, 0x0032, 0x2011, - 0x0000, 0x2029, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, - 0x0004, 0x79aa, 0x78ab, 0x0000, 0x7aaa, 0x7baa, 0x7daa, 0xa8c0, - 0x0008, 0x6820, 0xa085, 0x1000, 0x6822, 0x080c, 0x3850, 0xa085, - 0x0001, 0x00ce, 0x0005, 0xa282, 0x0006, 0x1904, 0x381f, 0x7da8, - 0x7eac, 0x8637, 0xa5ac, 0x00ff, 0xa6b4, 0x00ff, 0x7fac, 0x8747, - 0xa7bc, 0x00ff, 0xa8c4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, - 0x05c8, 0xa18c, 0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x37fc, - 0xa6b4, 0x00ff, 0x0560, 0xa682, 0x0039, 0x1a04, 0x37fc, 0xa582, - 0x0009, 0x0a04, 0x37fc, 0xa882, 0x0003, 0x1a04, 0x37fc, 0xa886, - 0x0002, 0x0128, 0xa886, 0x0000, 0x0138, 0x0804, 0x37fc, 0xa786, - 0x0000, 0x0904, 0x37fc, 0x8634, 0x852b, 0x852b, 0x080c, 0x38c6, - 0x0904, 0x37fc, 0x080c, 0x36f6, 0x080c, 0x379a, 0x7e58, 0xd6d4, - 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0x080c, - 0x36f3, 0x0c90, 0xa886, 0x0002, 0x1108, 0x8634, 0x7158, 0xa188, - 0x0000, 0x210c, 0xd1ac, 0x0904, 0x37fc, 0xd1ec, 0x1120, 0x2039, - 0x0000, 0x2041, 0x0000, 0xd1e4, 0x1120, 0x2031, 0x0000, 0x2041, - 0x0000, 0xa782, 0x0002, 0x12c8, 0x621c, 0xa284, 0x00ff, 0xa706, - 0x0110, 0x2039, 0x0000, 0xa605, 0x0190, 0x6108, 0x811f, 0xa39c, - 0x00ff, 0x0168, 0xa302, 0x1208, 0x2330, 0x8807, 0xa705, 0xa086, - 0x0201, 0x0160, 0xa886, 0x0000, 0x0168, 0x2039, 0x0000, 0x2041, - 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x0070, 0xa284, 0xff00, - 0x1108, 0x2040, 0xa184, 0x00ff, 0xa502, 0x0108, 0x2128, 0x852b, - 0x852b, 0x080c, 0x38c6, 0x0d58, 0x080c, 0x36f6, 0x080c, 0x379a, - 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, - 0x78ab, 0x0000, 0x7daa, 0x7eaa, 0x7faa, 0x2800, 0x78aa, 0x789b, - 0x0060, 0x78ab, 0x0005, 0x080c, 0x3850, 0x7858, 0xc095, 0x785a, - 0x781b, 0x0082, 0x0005, 0x0020, 0x0020, 0x0000, 0x0020, 0x0000, + 0x681f, 0x0100, 0x7000, 0xa084, 0x000f, 0x0002, 0x25a0, 0x3783, + 0x3780, 0x37a0, 0x378c, 0x25a0, 0x377e, 0x377e, 0x080c, 0x254c, + 0x0449, 0x0411, 0x0028, 0x0431, 0x7058, 0x2060, 0x6800, 0x6002, + 0x080c, 0x1da2, 0x0804, 0x25a0, 0x7060, 0x7063, 0x0000, 0x707f, + 0x0000, 0x0002, 0x379c, 0x379c, 0x379a, 0x379a, 0x379a, 0x379c, + 0x379a, 0x379c, 0x0804, 0x2a6b, 0x7063, 0x0000, 0x0804, 0x25a0, + 0x681b, 0x0000, 0x0804, 0x3184, 0x6800, 0xa005, 0x1108, 0x6002, + 0x6006, 0x0005, 0x6410, 0x84ff, 0x0168, 0x2009, 0x4602, 0x2104, + 0x8001, 0x200a, 0x8421, 0x6412, 0x1128, 0x2021, 0x4604, 0x2404, + 0xc0a5, 0x2022, 0x6008, 0xc0a4, 0x600a, 0x0005, 0x6018, 0xa005, + 0x0110, 0x8001, 0x601a, 0x0005, 0x080c, 0x3c46, 0x681b, 0x0018, + 0x0490, 0x080c, 0x3c46, 0x681b, 0x0019, 0x0468, 0x080c, 0x3c46, + 0x681b, 0x001a, 0x0440, 0x080c, 0x3c46, 0x681b, 0x0003, 0x0418, + 0x7770, 0x080c, 0x3b6f, 0x7174, 0xa18c, 0x00ff, 0x3210, 0xa294, + 0x0600, 0x0118, 0xa1e8, 0x8bc0, 0x0010, 0xa1e8, 0x8cd0, 0x2d04, + 0x2d08, 0x2068, 0xa005, 0x1118, 0x707a, 0x0804, 0x25a0, 0x6814, + 0x7270, 0xa206, 0x0110, 0x6800, 0x0c98, 0x6800, 0x200a, 0x681b, + 0x0005, 0x707b, 0x0000, 0x080c, 0x37aa, 0x6820, 0xd084, 0x1110, + 0x080c, 0x37a4, 0x080c, 0x37be, 0x681f, 0x0000, 0x6823, 0x0020, + 0x080c, 0x1da2, 0x0804, 0x25a0, 0xa282, 0x0003, 0x1904, 0x3a10, + 0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xc1bd, + 0x6922, 0xd1c4, 0x05b0, 0xc1c4, 0x6922, 0xa6b4, 0x00ff, 0x0530, + 0xa682, 0x0018, 0x0218, 0x0110, 0x2031, 0x0018, 0xa686, 0x0010, + 0x1108, 0x8630, 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3ac9, + 0x0118, 0x080c, 0x38f7, 0x00a0, 0x080c, 0x3a95, 0x080c, 0x38f4, + 0x6920, 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, + 0x781b, 0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x080c, 0x38f4, + 0x7e58, 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, + 0x0005, 0x00c6, 0x7054, 0x2060, 0x6100, 0xd1e4, 0x0598, 0x6208, + 0x8217, 0xa294, 0x00ff, 0xa282, 0x0018, 0x0218, 0x0110, 0x2011, + 0x0018, 0x2600, 0xa202, 0x1208, 0x2230, 0xa686, 0x0010, 0x1108, + 0x8630, 0x6208, 0xa294, 0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282, + 0x000a, 0x1240, 0x2011, 0x000a, 0x0028, 0xa282, 0x000c, 0x1210, + 0x2011, 0x000c, 0x2200, 0xa502, 0x1208, 0x2228, 0x080c, 0x3a99, + 0x852b, 0x852b, 0x2041, 0x0000, 0x080c, 0x3ac9, 0x0118, 0x080c, + 0x38f7, 0x0020, 0x080c, 0x3a95, 0x080c, 0x38f4, 0x7858, 0xc095, + 0x785a, 0x00ce, 0x781b, 0x0082, 0x0005, 0x00c6, 0x2960, 0x6000, + 0xd0e4, 0x1188, 0xd0b4, 0x1150, 0x6010, 0xa084, 0x000f, 0x1130, + 0x6104, 0xa18c, 0xfff5, 0x6106, 0x00ce, 0x0005, 0x2011, 0x0032, + 0x2019, 0x0000, 0x00f0, 0x68a0, 0xd0cc, 0x1dc0, 0x6208, 0xa294, + 0x00ff, 0x78ec, 0xd0e4, 0x0130, 0xa282, 0x000b, 0x1218, 0x2011, + 0x000a, 0x0028, 0xa282, 0x000c, 0x1210, 0x2011, 0x000c, 0x6308, + 0x831f, 0xa39c, 0x00ff, 0xa382, 0x0018, 0x0218, 0x0110, 0x2019, + 0x0018, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, + 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x080c, 0x3a55, + 0x00ce, 0x0005, 0x00c6, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, + 0x2011, 0x0032, 0x2019, 0x0000, 0x0000, 0x78ab, 0x0001, 0x78ab, + 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, + 0xc0c5, 0x6822, 0x00ce, 0x0005, 0xa006, 0x2030, 0x2010, 0x00c6, + 0x7154, 0x2160, 0x2018, 0x2008, 0xa084, 0xffe0, 0xa635, 0x7e86, + 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, 0xa084, 0x7770, 0xa18c, + 0x000f, 0xa105, 0x2029, 0x4605, 0x252c, 0xd5cc, 0x0140, 0xd3a4, + 0x0110, 0xa085, 0x0800, 0xd3fc, 0x0110, 0xa085, 0x8080, 0x78a6, + 0x6016, 0x788a, 0xa6b4, 0x001f, 0x8637, 0x8204, 0x8004, 0xa605, + 0x600e, 0x6004, 0xa084, 0xffd5, 0x6006, 0x00ce, 0x0005, 0xa282, + 0x0002, 0x1904, 0x3a1a, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc, + 0x0568, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x1a04, + 0x3a0b, 0x080c, 0x399e, 0x080c, 0x38f4, 0xa980, 0x0001, 0x200c, + 0x080c, 0x3b6b, 0x080c, 0x3895, 0x88ff, 0x0178, 0x789b, 0x0060, + 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x1118, 0x781b, + 0x006e, 0x0005, 0x781b, 0x0082, 0x0005, 0x7e58, 0xd6d4, 0x1118, + 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005, 0xa282, 0x0002, + 0x1218, 0xa284, 0x0001, 0x0140, 0x7154, 0xa188, 0x0000, 0x210c, + 0xd1ec, 0x1110, 0x2011, 0x0000, 0x080c, 0x3a87, 0x0479, 0x080c, + 0x38f4, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x00c6, + 0x0026, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x1158, 0xd0bc, + 0x1138, 0x6014, 0xd0b4, 0x1120, 0xc1a4, 0x6106, 0xa006, 0x0088, + 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, + 0x7aaa, 0xa8c0, 0x0004, 0x080c, 0x3a55, 0x6820, 0xa085, 0x0200, + 0x6822, 0x002e, 0x00ce, 0x0005, 0x8807, 0xa715, 0x00c6, 0x2009, + 0x0000, 0x7054, 0x2060, 0x82ff, 0x0110, 0x2009, 0x0040, 0x6018, + 0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, 0xff9f, 0xa105, 0xc0ec, + 0xd0b4, 0x1108, 0xc0ed, 0x6100, 0xd1f4, 0x0110, 0xa085, 0x0020, + 0x78a6, 0x6016, 0x788a, 0x6004, 0xa084, 0xffef, 0x6006, 0x00ce, + 0x0005, 0x0006, 0x7000, 0xa086, 0x0003, 0x0110, 0x000e, 0x0010, + 0x000e, 0x0488, 0xd6ac, 0x0578, 0x7888, 0xa084, 0x0040, 0x0558, + 0x7bb8, 0x8307, 0xa084, 0x007f, 0x1508, 0x8207, 0xa084, 0x00ff, + 0xa09e, 0x0001, 0x1904, 0x3a32, 0xd6f4, 0x11d0, 0x79d8, 0x7adc, + 0xa108, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x080c, + 0x42b5, 0x781b, 0x0080, 0xb284, 0x0600, 0x0118, 0x2001, 0x0000, + 0x0010, 0x2001, 0x0001, 0x080c, 0x4172, 0x0005, 0x080c, 0x254c, + 0x781b, 0x0080, 0x0005, 0x781b, 0x0083, 0x0005, 0x2039, 0x0000, + 0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x080c, 0x38f7, + 0x080c, 0x399c, 0x7e58, 0x080c, 0x3a4e, 0x781b, 0x0082, 0x0005, + 0x0cd1, 0x6820, 0xc0c4, 0x6822, 0x00c6, 0x7054, 0x2060, 0x080c, + 0x3921, 0x00b0, 0x0c81, 0x6820, 0xc0cc, 0x6822, 0x00c6, 0x7054, + 0x2060, 0x080c, 0x39bb, 0x0060, 0x0c31, 0x6820, 0xa084, 0xecff, + 0x6822, 0x00c6, 0x7054, 0x2060, 0x6004, 0xa084, 0xffc5, 0x6006, + 0x00ce, 0x0005, 0x0049, 0x781b, 0x0082, 0x0005, 0x6827, 0x0002, + 0x0049, 0x781b, 0x0082, 0x0005, 0x2001, 0x0005, 0x0088, 0x2001, + 0x000c, 0x0070, 0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0040, + 0x2001, 0x000d, 0x0028, 0x2001, 0x0009, 0x0010, 0x2001, 0x0007, + 0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d0, 0xd0b4, 0x0168, + 0xc0b4, 0x70d2, 0x00c6, 0x70b4, 0xa065, 0x6008, 0xa084, 0xfbef, + 0x600a, 0x6018, 0x8001, 0x601a, 0x00ce, 0x0005, 0x0076, 0x873f, + 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0xa0e0, 0x4ac0, 0xae8e, + 0x4640, 0x0110, 0xa0e0, 0x4b40, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, + 0xa184, 0x7fe0, 0x78ae, 0x6012, 0x79a4, 0xa184, 0x773f, 0x78a6, + 0x6016, 0x6004, 0xa085, 0x0038, 0x6006, 0x007e, 0x0005, 0x789b, + 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, + 0x789b, 0x0060, 0x78ab, 0x0004, 0x0800, 0x2031, 0x0000, 0x2029, + 0x0032, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, + 0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x0804, + 0x3a55, 0x0156, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, + 0x0020, 0x789a, 0x79a4, 0xa18c, 0xffe0, 0x2021, 0x3b54, 0x2019, + 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xffe0, + 0xa106, 0x0128, 0x8420, 0x2300, 0xa210, 0x1f04, 0x3abd, 0x015e, + 0x0005, 0x0156, 0x04f8, 0x2021, 0x3b62, 0x20a9, 0x0009, 0x2011, + 0x0029, 0xa582, 0x0028, 0x0550, 0x8420, 0x95a9, 0x2011, 0x0033, + 0xa582, 0x0033, 0x0618, 0x8420, 0x95a9, 0x2019, 0x000a, 0x2011, + 0x0065, 0x2200, 0xa502, 0x02d0, 0x8420, 0x2300, 0xa210, 0x1f04, + 0x3ae1, 0x015e, 0x0088, 0x2021, 0x3b54, 0x2019, 0x0011, 0x20a9, + 0x000e, 0x2011, 0x0033, 0x2200, 0xa502, 0x0240, 0x8420, 0x2300, + 0xa210, 0x1f04, 0x3af3, 0x015e, 0xa006, 0x0005, 0x8211, 0x015e, + 0xa582, 0x0064, 0x1220, 0x7808, 0xa085, 0x0070, 0x780a, 0x2404, + 0xa005, 0x0005, 0xa886, 0x0002, 0x01e8, 0x2021, 0x3b40, 0x20a9, + 0x000d, 0x2011, 0x0028, 0xa582, 0x0028, 0x0d48, 0x8420, 0x2019, + 0x0019, 0x2011, 0x0033, 0x2200, 0xa502, 0x0e00, 0x8420, 0x2300, + 0xa210, 0x1f04, 0x3b1b, 0x015e, 0x2011, 0x0184, 0xa582, 0x0185, + 0x0ab0, 0x0890, 0x2021, 0x3b4f, 0x20a9, 0x0003, 0x2011, 0x0024, + 0xa586, 0x0024, 0x0960, 0x8420, 0x2011, 0x0028, 0xa586, 0x0028, + 0x0930, 0x8420, 0x2019, 0x0019, 0x2011, 0x0033, 0x0804, 0x3af3, + 0x1021, 0x2202, 0x3403, 0x4604, 0x5805, 0x6a06, 0x7c07, 0x4610, + 0x4612, 0x5812, 0x5a12, 0x6a14, 0x6c14, 0x6e14, 0x7e17, 0x9021, + 0xb002, 0xe204, 0xe210, 0xe210, 0x1209, 0x3002, 0x3202, 0x4203, + 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, + 0x0c07, 0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, + 0x7c07, 0x7e07, 0x0e00, 0x789b, 0x0080, 0xa046, 0x0005, 0xa784, + 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, + 0xa105, 0xd7fc, 0x0118, 0xa0e0, 0x6bc0, 0x0010, 0xa0e0, 0x4bc0, + 0x0005, 0x00e6, 0x00f6, 0xd084, 0x0138, 0x2079, 0x0100, 0x2009, + 0x4680, 0x2071, 0x4680, 0x0030, 0x2009, 0x4640, 0x2079, 0x0200, + 0x2071, 0x4640, 0x2091, 0x8000, 0x2104, 0xa084, 0x000f, 0x0002, + 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba2, 0x3ba0, 0x3ba0, + 0x080c, 0x254c, 0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, + 0x0580, 0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, + 0xa086, 0x1814, 0x1530, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, + 0x1de0, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x1de0, 0x7830, + 0xd0bc, 0x11b8, 0xb284, 0x0800, 0x0118, 0x0104, 0x3bd9, 0x0010, + 0x0304, 0x3bd9, 0x79e4, 0xa184, 0x0030, 0x0158, 0x78ec, 0xa084, + 0x0003, 0x0138, 0x681c, 0xd0ac, 0x1110, 0x00d9, 0x0010, 0x781b, + 0x00fb, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x4601, 0x2004, 0xd0ac, + 0x1118, 0x6814, 0x080c, 0x2475, 0x0005, 0x781b, 0x0083, 0x0005, + 0x781b, 0x0082, 0x0005, 0x781b, 0x0071, 0x0005, 0x781b, 0x006e, + 0x0005, 0x2009, 0x4619, 0x210c, 0xa186, 0x0000, 0x0150, 0xa186, + 0x0001, 0x0150, 0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054, + 0x0005, 0x781b, 0x00f3, 0x0005, 0x701f, 0x000a, 0x0005, 0x2009, + 0x4619, 0x210c, 0xa186, 0x0000, 0x0168, 0xa186, 0x0001, 0x0138, + 0x701f, 0x000b, 0x7063, 0x0001, 0x781b, 0x0054, 0x0005, 0x701f, + 0x000a, 0x0005, 0x781b, 0x00f2, 0x0005, 0x781b, 0x00fb, 0x0005, + 0x781b, 0x00fa, 0x0005, 0x781b, 0x00cc, 0x0005, 0x781b, 0x00cb, + 0x0005, 0x6818, 0xd0fc, 0x0110, 0x681b, 0x001d, 0x7063, 0x0001, + 0x781b, 0x0054, 0x0005, 0x7830, 0xa084, 0x00c0, 0x1170, 0x7808, + 0xc08c, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000, 0x78ec, 0xa084, + 0x0021, 0x0118, 0x7808, 0xc08d, 0x780a, 0x0005, 0x7808, 0xc08d, + 0x780a, 0x0005, 0x7830, 0xa084, 0x0040, 0x1de0, 0xb284, 0x0800, + 0x0118, 0x1104, 0x3c58, 0x0010, 0x1304, 0x3c58, 0x78ac, 0x0005, + 0x7808, 0xa084, 0xfffd, 0x780a, 0xe000, 0xe000, 0xe000, 0xe000, + 0x78ec, 0xa084, 0x0021, 0x0140, 0xb284, 0x0800, 0x0118, 0x1104, + 0x3c67, 0x0010, 0x1304, 0x3c6a, 0x78ac, 0x0006, 0x7808, 0xa085, + 0x0002, 0x780a, 0x000e, 0x0005, 0xa784, 0x0001, 0x1904, 0x322a, + 0xa784, 0x0070, 0x0140, 0x00c6, 0x2d60, 0x2f68, 0x080c, 0x2467, + 0x2d78, 0x2c68, 0x00ce, 0xa784, 0x0008, 0x0148, 0x784b, 0x0008, + 0x78ec, 0xa084, 0x0003, 0x0904, 0x322a, 0x0804, 0x3be5, 0xa784, + 0x0004, 0x01c8, 0x78b8, 0xa084, 0x8000, 0x01a8, 0x784b, 0x0008, + 0x78ec, 0xa084, 0x0003, 0x0904, 0x322a, 0x78e4, 0xa084, 0x0007, + 0xa086, 0x0001, 0x1140, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, + 0x781b, 0x00fb, 0x0005, 0xa784, 0x0080, 0x0140, 0x7884, 0xd0fc, + 0x0128, 0x080c, 0x3a32, 0x681b, 0x0022, 0x0005, 0x681b, 0x0003, + 0x7858, 0xa084, 0x5f00, 0x681e, 0x682f, 0x0000, 0x6833, 0x0000, + 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0904, 0x2b89, 0xb284, + 0x0800, 0x0110, 0x0104, 0x259d, 0x0304, 0x259d, 0x6b14, 0x8307, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xd3fc, 0x0118, 0xa080, + 0x4b40, 0x0010, 0xa080, 0x4ac0, 0x2060, 0x2048, 0x7056, 0x2a60, + 0x0005, 0x00c6, 0x2960, 0x6000, 0xd0ac, 0x0904, 0x3d2f, 0x68a0, + 0xd1ac, 0x1120, 0xa084, 0x0e00, 0x0904, 0x3d2d, 0x6108, 0x8117, + 0xa18c, 0x00ff, 0x631c, 0x832f, 0xd0dc, 0x0110, 0xa39d, 0x0001, + 0xd0cc, 0x11c8, 0xa584, 0x00ff, 0x0138, 0x78ec, 0xd0e4, 0x0110, + 0x8213, 0x00b8, 0x2029, 0x0000, 0xa182, 0x000c, 0x1290, 0x78ec, + 0xd0e4, 0x1118, 0x2009, 0x000c, 0x0060, 0xa182, 0x000b, 0x1248, + 0x2009, 0x000a, 0x0030, 0x2009, 0x0032, 0x2011, 0x0000, 0x2029, + 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, 0x0004, 0x79aa, + 0x78ab, 0x0000, 0x7aaa, 0x7baa, 0x7daa, 0xa8c0, 0x0008, 0x6820, + 0xa085, 0x1000, 0x6822, 0x080c, 0x3a55, 0xa085, 0x0001, 0x00ce, + 0x0005, 0xa282, 0x0006, 0x1904, 0x3a24, 0x7da8, 0x7eac, 0x8637, + 0xa5ac, 0x00ff, 0xa6b4, 0x00ff, 0x7fac, 0x8747, 0xa7bc, 0x00ff, + 0xa8c4, 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1e4, 0x0904, 0x3da3, + 0xa18c, 0xecff, 0x6922, 0xa782, 0x0002, 0x1a04, 0x39fe, 0xa6b4, + 0x00ff, 0x0904, 0x3da0, 0xa682, 0x0031, 0x1a04, 0x39fe, 0xa582, + 0x0009, 0x0a04, 0x39fe, 0xa882, 0x0003, 0x1a04, 0x39fe, 0xa886, + 0x0002, 0x01d0, 0xa886, 0x0000, 0x1904, 0x39fe, 0x2001, 0x000c, + 0x79ec, 0xd1e4, 0x0110, 0x2001, 0x000a, 0xa502, 0x1290, 0x080c, + 0x39fe, 0x00c6, 0x2960, 0x6004, 0xa085, 0x001a, 0x6006, 0x6000, + 0xc0ac, 0x6002, 0x00ce, 0x0005, 0xa786, 0x0000, 0x0904, 0x39fe, + 0x8634, 0xa682, 0x0018, 0x0228, 0x0120, 0x2031, 0x0018, 0x0804, + 0x3df1, 0xa686, 0x0010, 0x1108, 0x8630, 0x852b, 0x852b, 0x080c, + 0x3ac9, 0x0904, 0x39fe, 0x080c, 0x38f7, 0x080c, 0x399c, 0x7e58, + 0xd6d4, 0x1118, 0x781b, 0x0071, 0x0005, 0x781b, 0x0083, 0x0005, + 0x080c, 0x38f4, 0x0c90, 0xa886, 0x0002, 0x1108, 0x8634, 0x7154, + 0xa188, 0x0000, 0x210c, 0xd1ac, 0x0904, 0x39fe, 0xd1ec, 0x1120, + 0x2039, 0x0000, 0x2041, 0x0000, 0xd1e4, 0x1120, 0x2031, 0x0000, + 0x2041, 0x0000, 0xa782, 0x0002, 0x12c8, 0x621c, 0xa284, 0x00ff, + 0xa706, 0x0110, 0x2039, 0x0000, 0xa605, 0x0190, 0x6108, 0x811f, + 0xa39c, 0x00ff, 0x0168, 0xa302, 0x1208, 0x2330, 0x8807, 0xa705, + 0xa086, 0x0201, 0x0160, 0xa886, 0x0000, 0x0168, 0x2039, 0x0000, + 0x2041, 0x0000, 0x2031, 0x0000, 0xa006, 0x2010, 0x0070, 0xa284, + 0xff00, 0x1108, 0x2040, 0xa184, 0x00ff, 0xa502, 0x0108, 0x2128, + 0x852b, 0x852b, 0x080c, 0x3ac9, 0x0d58, 0x080c, 0x38f7, 0x080c, + 0x399c, 0x789b, 0x0080, 0x78ab, 0x0001, 0x78ab, 0x0006, 0x78ab, + 0x0004, 0x7daa, 0x78ab, 0x0000, 0x7eaa, 0x7faa, 0x2800, 0x78aa, + 0x789b, 0x0060, 0x78ab, 0x0008, 0x6820, 0xc0e5, 0x6822, 0x080c, + 0x3a55, 0x7858, 0xc095, 0x785a, 0x781b, 0x0082, 0x0005, 0x0020, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0062, 0x0009, 0x0014, - 0x0014, 0x9855, 0x984d, 0x0014, 0x9911, 0x98ff, 0x0014, 0x0014, - 0x0090, 0x00e7, 0x0100, 0x0402, 0x2008, 0xf880, 0x0018, 0x0017, - 0x840f, 0xd8c1, 0x0014, 0x0016, 0xa20a, 0x0014, 0x300b, 0xa20c, - 0x0014, 0x2500, 0x0013, 0x2500, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, + 0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9855, 0x984d, 0x0014, + 0x9911, 0x98ff, 0x0014, 0x0014, 0x0090, 0x00e7, 0x0100, 0x0402, + 0x2008, 0xf880, 0x0018, 0x0017, 0x840f, 0xd8c1, 0x0014, 0x0016, + 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0x2500, 0x0013, 0x2500, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0xa200, 0x3806, 0x8839, 0x20c4, 0x0864, 0xa84f, - 0x3008, 0x28c1, 0x9d18, 0xa201, 0x300c, 0x2847, 0x8161, 0x846a, - 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2, 0x9cce, 0xa8f3, - 0x0864, 0xa83d, 0x300c, 0xa801, 0x3008, 0x28e1, 0x9cce, 0x2021, - 0xa818, 0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0, 0x6fc0, 0x67a4, - 0x6c80, 0x0212, 0xa205, 0x883d, 0x882b, 0x1814, 0x883b, 0x7027, - 0x85f2, 0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa814, 0x883e, - 0xa812, 0x280a, 0xa204, 0x64c0, 0x6de0, 0x67a0, 0x6fc0, 0x1814, - 0x883b, 0x7027, 0x8576, 0x8677, 0xa806, 0x796d, 0xa8da, 0x796b, - 0xa8f1, 0x7861, 0x883e, 0x206b, 0x28c1, 0x9d18, 0x2044, 0x2103, - 0x20b4, 0x2095, 0xa8ca, 0xa207, 0x2901, 0xa80a, 0x0014, 0xa203, - 0x8000, 0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601, 0xa208, - 0x856e, 0x866f, 0x7121, 0x0014, 0x0704, 0x3008, 0x9cce, 0x0014, - 0xa202, 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf844, 0x856e, - 0x883f, 0x08e6, 0xa8f5, 0xf861, 0xa8ea, 0xf801, 0x0014, 0xf881, - 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014, 0x8532, - 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014, 0x3008, - 0x8000, 0x2849, 0x1011, 0xa8fc, 0x3008, 0x8000, 0xa000, 0x2081, - 0x2802, 0x1011, 0xa8fc, 0xa889, 0x3008, 0x20a1, 0x283c, 0x1011, - 0xa8fc, 0xa209, 0x0017, 0x300c, 0x8000, 0x85a4, 0x1de2, 0xdac1, - 0x0014, 0x0210, 0xa801, 0x0014, 0x26e0, 0x873a, 0xfaa3, 0x19f2, - 0x26e0, 0x18f2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x3806, 0x0210, - 0x9d22, 0x0704, 0xa206, 0x6865, 0x817e, 0x842a, 0x1dc1, 0x8823, - 0x0016, 0x6042, 0x8008, 0xa8fa, 0x8160, 0x842a, 0x8180, 0xf021, - 0x3008, 0x84a8, 0x11d7, 0x7042, 0x20dd, 0x0011, 0x20d5, 0x8822, - 0x0016, 0x0000, 0x0126, 0x70d4, 0xa084, 0x4c00, 0x8004, 0x2090, - 0x7204, 0x7008, 0xc09c, 0xa205, 0x1178, 0x720c, 0x82ff, 0x0128, - 0x8aff, 0x1150, 0x7200, 0xd284, 0x1138, 0x7007, 0x0004, 0x7003, - 0x0008, 0x012e, 0x2000, 0x0005, 0x7000, 0xa084, 0x0003, 0x7002, - 0xc69c, 0xd084, 0x05b8, 0x2001, 0x4301, 0x2004, 0xd0b4, 0x0904, - 0x3dcf, 0x7108, 0xe000, 0x7008, 0xa106, 0x1dd8, 0xa184, 0x0003, - 0x0904, 0x3dcf, 0xa184, 0x01e0, 0x1904, 0x3dcf, 0xd1f4, 0x1d88, - 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60, 0x2011, 0x0180, 0x710c, - 0x8211, 0x0130, 0x7008, 0xd0f4, 0x1d20, 0x700c, 0xa106, 0x0dc0, - 0x7007, 0x0012, 0x7108, 0xe000, 0x7008, 0xa106, 0x1dd8, 0xa184, - 0x0003, 0x0568, 0xd194, 0x0db0, 0xd1f4, 0x0548, 0x7007, 0x0002, - 0x0880, 0x0428, 0x7108, 0xd1fc, 0x0130, 0x080c, 0x3e9e, 0x8aff, - 0x0904, 0x3d58, 0x0cb8, 0x700c, 0xa08c, 0x07ff, 0x01e8, 0x7004, - 0xd084, 0x0178, 0x7014, 0xa005, 0x1148, 0x7010, 0x7310, 0xa306, - 0x1de0, 0x2300, 0xa005, 0x0128, 0xa102, 0x1e20, 0x7007, 0x0010, - 0x0030, 0x8aff, 0x0148, 0x080c, 0x4046, 0x1de8, 0x09d8, 0x080c, - 0x3e58, 0x012e, 0x2000, 0x0005, 0x7204, 0x7108, 0xc19c, 0x8103, - 0x1218, 0x080c, 0x3e9e, 0x0cc0, 0xa205, 0x1d88, 0x7007, 0x0004, - 0x7003, 0x0008, 0x012e, 0x2000, 0x0005, 0x6428, 0x84ff, 0x0508, - 0x2c70, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3e19, 0x273c, 0x87fb, - 0x1148, 0x0210, 0x080c, 0x243b, 0x609c, 0xa075, 0x0190, 0x0c88, - 0x2039, 0x3e0e, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c, 0xa529, - 0x8421, 0x0138, 0x8738, 0x2704, 0xa005, 0x1da8, 0x709c, 0xa075, - 0x1d00, 0x0005, 0x0000, 0x0005, 0x0009, 0x000d, 0x0011, 0x0015, - 0x0019, 0x001d, 0x0000, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, - 0x0000, 0x0000, 0x3e0e, 0x3e0b, 0x0000, 0x0000, 0x8000, 0x0000, - 0x3e0e, 0x0000, 0x3e16, 0x3e13, 0x0000, 0x0000, 0x0000, 0x0000, - 0x3e16, 0x0000, 0x3e11, 0x3e11, 0x0000, 0x0000, 0x8000, 0x0000, - 0x3e11, 0x0000, 0x3e17, 0x3e17, 0x0000, 0x0000, 0x0000, 0x0000, - 0x3e17, 0x2079, 0x4300, 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, - 0x0002, 0x7003, 0x0001, 0x2009, 0x0002, 0x2071, 0x0050, 0x7007, - 0x000a, 0x7007, 0x0002, 0x7003, 0x0000, 0x2001, 0x01ff, 0x2004, - 0xd0fc, 0x1128, 0x8109, 0x0118, 0x2071, 0x0020, 0x0c80, 0x0005, - 0x7004, 0x8004, 0x1690, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108, - 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0110, 0x080c, 0x243b, - 0xa19c, 0x300c, 0xa386, 0x2004, 0x0130, 0xa386, 0x0008, 0x0160, - 0xa386, 0x200c, 0x1d60, 0x7200, 0x8204, 0x0230, 0x730c, 0xa384, - 0x07ff, 0x0110, 0x080c, 0x243b, 0x7007, 0x0012, 0x7000, 0xd084, - 0x1160, 0x7008, 0xa084, 0x01e0, 0x1140, 0x7310, 0x7014, 0xa305, - 0x0120, 0x710c, 0xa184, 0x07ff, 0x1958, 0x7007, 0x0012, 0x7007, - 0x0008, 0x7004, 0xd09c, 0x1de8, 0x7007, 0x0012, 0x7108, 0x8103, - 0x0ed8, 0x7003, 0x0008, 0x0005, 0x7108, 0x0000, 0xa184, 0x01e0, - 0x1550, 0x7108, 0xa184, 0x01e0, 0x1530, 0xa184, 0x0007, 0x0002, - 0x3eb2, 0x3ec0, 0x3eb0, 0x3ec0, 0x3eb0, 0x3f06, 0x3eb0, 0x3f05, - 0x080c, 0x243b, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, - 0x1118, 0x2049, 0x0000, 0x0005, 0x080c, 0x4046, 0x1de8, 0x0005, - 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, 0x0118, 0x080c, - 0x4046, 0x1de8, 0x0005, 0x7007, 0x0012, 0x7108, 0x1d04, 0x3ece, - 0x2091, 0x6000, 0x1d04, 0x3ed2, 0x2091, 0x6000, 0x7007, 0x0012, - 0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8, 0x7007, 0x0012, 0x7108, - 0xd1fc, 0x1dd8, 0x7003, 0x0000, 0x7000, 0xa005, 0x1130, 0x7004, - 0xa005, 0x1118, 0x700c, 0xa005, 0x0108, 0x0c40, 0x2049, 0x0000, - 0xb284, 0x0200, 0x0118, 0x2001, 0x0000, 0x0010, 0x2001, 0x0001, - 0x080c, 0x397f, 0x6818, 0xa084, 0x8000, 0x0110, 0x681b, 0x0002, - 0x0005, 0x080c, 0x243b, 0x080c, 0x243b, 0x04b9, 0x7210, 0x7114, - 0x700c, 0xa09c, 0x07ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, - 0x0461, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c, - 0x2100, 0xa31b, 0x2400, 0xa305, 0x0140, 0x1238, 0x8412, 0x8210, - 0x830a, 0xa189, 0x0000, 0x2b60, 0x0c58, 0x2b60, 0x8a07, 0x0006, - 0x6004, 0xa084, 0x0008, 0x0118, 0xa7ba, 0x3e13, 0x0010, 0xa7ba, - 0x3e0b, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, - 0x7007, 0x0012, 0x080c, 0x3e58, 0x0005, 0x8a50, 0x8739, 0x2704, - 0xa004, 0x1168, 0x6000, 0xa064, 0x1108, 0x2d60, 0x6004, 0xa084, - 0x000f, 0xa080, 0x3e29, 0x203c, 0x87fb, 0x090c, 0x243b, 0x0005, - 0x0126, 0x00d6, 0x70d4, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, - 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057, 0xaad4, 0x00ff, - 0xa084, 0x00ff, 0x0006, 0x6804, 0xa084, 0x0008, 0x000e, 0x0118, - 0xa0b8, 0x3e13, 0x0010, 0xa0b8, 0x3e0b, 0xb284, 0x0200, 0x0110, - 0x7e20, 0x0008, 0x7e24, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0108, - 0xc685, 0x2400, 0xa305, 0x0520, 0x2c58, 0x2704, 0x6104, 0xac60, - 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184, 0x0008, - 0x0140, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081, 0x0000, - 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300, 0xa203, - 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x080c, 0x4067, 0x0010, - 0x080c, 0x4046, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x00d6, - 0x70d4, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x7007, 0x0004, - 0x7004, 0xd094, 0x1de8, 0x7003, 0x0008, 0x012e, 0x2000, 0x0005, - 0x0126, 0x00d6, 0x70d4, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, - 0x7e20, 0xb284, 0x0200, 0x1108, 0x7e24, 0xa6b5, 0x000c, 0x681c, - 0xd0ac, 0x1118, 0xc685, 0x7003, 0x0000, 0x6828, 0x2050, 0x2d60, - 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x3e19, 0x273c, 0x87fb, 0x1138, - 0x0210, 0x080c, 0x243b, 0x689c, 0xa065, 0x0120, 0x0c88, 0x080c, - 0x4046, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x0006, 0x0016, - 0x00d6, 0x70d4, 0xa084, 0x4c00, 0x8004, 0x2090, 0x7e20, 0xb284, - 0x0200, 0x1108, 0x7e24, 0x00de, 0x003e, 0x004e, 0xa6b5, 0x000c, - 0x681c, 0xd0b4, 0x0128, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004, - 0x2049, 0x3fe5, 0x6828, 0xa055, 0x05f0, 0x2d70, 0x2e60, 0x7004, - 0xa0bc, 0x000f, 0xa7b8, 0x3e19, 0x273c, 0x87fb, 0x1140, 0x0210, - 0x080c, 0x243b, 0x709c, 0xa075, 0x2060, 0x0568, 0x0c80, 0x2704, - 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0268, 0x8a51, 0x1110, - 0x080c, 0x243b, 0x8738, 0x2704, 0xa005, 0x1d90, 0x709c, 0xa075, - 0x2060, 0x01c8, 0x08e0, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, - 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1210, 0x080c, - 0x243b, 0xb284, 0x0200, 0x0118, 0x2071, 0x0050, 0x0010, 0x2071, - 0x0020, 0x0804, 0x3f79, 0x012e, 0x2000, 0x0005, 0x7008, 0xa084, - 0x0003, 0xa086, 0x0003, 0x1108, 0x0005, 0x2704, 0xac78, 0x7800, - 0x701a, 0x7804, 0x701e, 0x7808, 0x7012, 0x780c, 0x7016, 0x6004, - 0xa084, 0x0008, 0x0120, 0x7810, 0x7022, 0x7814, 0x7026, 0x7602, - 0x7004, 0xa084, 0x0010, 0xc085, 0x7006, 0x2079, 0x4300, 0x8a51, - 0x01b0, 0x8738, 0x2704, 0xa005, 0x1168, 0x609c, 0xa005, 0x0180, - 0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x3e19, 0x203c, 0x87fb, - 0x090c, 0x243b, 0x7008, 0xa084, 0x0003, 0xa086, 0x0003, 0x0005, - 0x2051, 0x0000, 0x0005, 0x0126, 0x0006, 0x00d6, 0x70d4, 0xa084, - 0x4c00, 0x8004, 0x2090, 0x00de, 0x008e, 0x7108, 0xa184, 0x0003, - 0x1128, 0x6828, 0xa005, 0x0178, 0x0804, 0x3d6c, 0x7108, 0xd1fc, - 0x0118, 0x080c, 0x3e9e, 0x0c88, 0x7007, 0x0010, 0x7108, 0xd1fc, - 0x0de8, 0x080c, 0x3e9e, 0x7008, 0xa086, 0x0008, 0x1d30, 0x7000, - 0xa005, 0x1d18, 0x7003, 0x0000, 0x2049, 0x0000, 0x012e, 0x2000, - 0x0005, 0x0126, 0x0146, 0x0136, 0x0156, 0x00c6, 0x00d6, 0x70d4, - 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x2049, 0x40b1, 0xad80, - 0x0011, 0x20a0, 0xb284, 0x0200, 0x0118, 0x2099, 0x0032, 0x0010, - 0x2099, 0x0031, 0x700c, 0xa084, 0x07ff, 0x682a, 0x7007, 0x0008, - 0x7007, 0x0002, 0x7003, 0x0001, 0x0118, 0x8000, 0x80ac, 0x53a5, - 0x700c, 0xa084, 0x07ff, 0x0130, 0x7007, 0x0004, 0x7004, 0xa084, - 0x0004, 0x1de0, 0x00ce, 0x2049, 0x0000, 0x7003, 0x0000, 0x015e, - 0x013e, 0x014e, 0x012e, 0x2000, 0x0005, 0x2091, 0x8000, 0x2091, - 0x6000, 0x78ac, 0xa005, 0x1168, 0x7974, 0x70d0, 0xa106, 0x1148, - 0x781c, 0xa005, 0x0130, 0x781f, 0x0000, 0x0e04, 0x4101, 0x2091, - 0x4080, 0x7830, 0x8001, 0x7832, 0x1904, 0x416b, 0x7834, 0x7832, - 0x2061, 0x68c0, 0x2069, 0x4380, 0xc7fd, 0x68d0, 0xa005, 0x0128, - 0x8001, 0x68d2, 0x1110, 0x080c, 0x42c4, 0x6800, 0xa084, 0x000f, - 0x0168, 0xa086, 0x0001, 0x0150, 0x6844, 0xa00d, 0x0138, 0x2104, - 0xa005, 0x0120, 0x8001, 0x200a, 0x0904, 0x425f, 0x6814, 0xa005, - 0x01a8, 0x8001, 0x6816, 0x1190, 0x68a7, 0x0001, 0x00f6, 0xd7fc, - 0x1118, 0x2079, 0x0200, 0x0010, 0x2079, 0x0100, 0x080c, 0x3aa0, - 0x00fe, 0x6864, 0xa005, 0x0110, 0x080c, 0x2233, 0x6880, 0xa005, - 0x0140, 0x8001, 0x6882, 0x1128, 0x6867, 0x0000, 0x68d4, 0xc0c5, - 0x68d6, 0x68d4, 0xd0fc, 0x01b0, 0xc0fc, 0x68d6, 0x20a9, 0x0200, - 0x6034, 0xa005, 0x0158, 0x8001, 0x6036, 0x68d4, 0xc0fd, 0x68d6, - 0x1128, 0x6010, 0xa005, 0x0110, 0x080c, 0x2233, 0xace0, 0x0010, - 0x1f04, 0x4150, 0xd7fc, 0x0138, 0x2061, 0x48c0, 0x2069, 0x4340, - 0xc7fc, 0x0804, 0x410d, 0x0459, 0x7838, 0x8001, 0x783a, 0x11a0, - 0x783c, 0x783a, 0x2061, 0x48c0, 0x2069, 0x4340, 0xc7fc, 0x680c, - 0xa005, 0x0110, 0x080c, 0x41c9, 0xd7fc, 0x1130, 0x2061, 0x68c0, - 0x2069, 0x4380, 0xc7fd, 0x0c98, 0x7810, 0xd0cc, 0x0168, 0xd0ac, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0xa200, 0x3806, + 0x8839, 0x20c4, 0x0864, 0xa850, 0x3008, 0x28c1, 0x9d18, 0xa201, + 0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, + 0xa808, 0x28e2, 0x9cce, 0xa8f3, 0x0864, 0xa83e, 0x300c, 0xa801, + 0x3008, 0x28e1, 0x9cce, 0x28a2, 0x7163, 0xa831, 0x2021, 0xa818, + 0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0, 0x6fc0, 0x67a4, 0x6c80, + 0x0212, 0xa205, 0x883d, 0x882b, 0x1814, 0x883b, 0x7027, 0x85f2, + 0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa813, 0x883e, 0xa811, + 0x2882, 0x7162, 0xa814, 0x280a, 0xa204, 0x64c0, 0x6de0, 0x67a0, + 0x6fc0, 0x1814, 0x883b, 0x7023, 0x8576, 0x8677, 0xa802, 0x7861, + 0x883e, 0x206a, 0x28c1, 0x9d18, 0x2042, 0x2101, 0xa8ca, 0x2902, + 0xa20e, 0xa80b, 0xa207, 0x0014, 0xa203, 0x8000, 0x85a4, 0x1872, + 0x879a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e, 0x7121, 0x0014, + 0x0704, 0x3008, 0x9cce, 0x0014, 0xa202, 0x8000, 0x85a4, 0x3009, + 0x84a8, 0x19e2, 0xf844, 0x856e, 0x883f, 0x08e6, 0xa8f5, 0xf861, + 0xa8eb, 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, + 0xfaa2, 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, + 0xd6e0, 0x1fe6, 0x0014, 0x3008, 0x8000, 0x2849, 0x1011, 0xa8fc, + 0x3008, 0x8000, 0xa000, 0x2081, 0x2802, 0x1011, 0xa8fc, 0xa889, + 0x3008, 0x20a1, 0x283c, 0x1011, 0xa8fc, 0xa209, 0x0017, 0x300c, + 0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0x0210, 0xa801, 0x0014, + 0x26e0, 0x873a, 0xfaa3, 0x19f2, 0x26e0, 0x18f2, 0x0014, 0xa20b, + 0x0014, 0xa20d, 0x3806, 0x0210, 0x9d22, 0x0704, 0xa206, 0x6865, + 0x817e, 0x842a, 0x1dc1, 0x8823, 0x0016, 0x6042, 0x8008, 0xa8fa, + 0x8160, 0x842a, 0x8180, 0xf021, 0x3008, 0x84a8, 0x11d7, 0x7042, + 0x20dd, 0x0011, 0x20d5, 0x8822, 0x0016, 0x0000, 0x0126, 0x70d0, + 0xa084, 0x4c00, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205, + 0x11a0, 0x720c, 0x82ff, 0x0128, 0x8aff, 0x1178, 0x7200, 0xd284, + 0x1160, 0x7804, 0xd0cc, 0x0110, 0x080c, 0x4328, 0x7007, 0x0008, + 0x7003, 0x0008, 0x012e, 0x2000, 0x0005, 0x7000, 0xa084, 0x0003, + 0x7002, 0xc69c, 0xd084, 0x0588, 0x7108, 0xe000, 0x7008, 0xa106, + 0x1dd8, 0xa184, 0x0003, 0x0904, 0x3fa2, 0xa184, 0x01e0, 0x1904, + 0x3fa2, 0xd1f4, 0x1d88, 0xa184, 0x3000, 0xa086, 0x1000, 0x0d60, + 0x2011, 0x0180, 0x710c, 0x8211, 0x0130, 0x7008, 0xd0f4, 0x1d20, + 0x700c, 0xa106, 0x0dc0, 0x7007, 0x0012, 0x7108, 0xe000, 0x7008, + 0xa106, 0x1dd8, 0xa184, 0x0003, 0x0568, 0xd194, 0x0db0, 0xd1f4, + 0x0548, 0x7007, 0x0002, 0x0880, 0x0428, 0x7108, 0xd1fc, 0x0130, + 0x080c, 0x40ae, 0x8aff, 0x0904, 0x3f2c, 0x0cb8, 0x700c, 0xa08c, + 0x07ff, 0x01e8, 0x7004, 0xd084, 0x0178, 0x7014, 0xa005, 0x1148, + 0x7010, 0x7310, 0xa306, 0x1de0, 0x2300, 0xa005, 0x0128, 0xa102, + 0x1e20, 0x7007, 0x0010, 0x0030, 0x8aff, 0x0148, 0x080c, 0x426b, + 0x1de8, 0x09d8, 0x080c, 0x4034, 0x012e, 0x2000, 0x0005, 0x7204, + 0x7108, 0xc19c, 0x8103, 0x1218, 0x7007, 0x0002, 0x0cc0, 0xa205, + 0x1d88, 0x7007, 0x0008, 0x7003, 0x0008, 0x0006, 0x2001, 0x4601, + 0x2004, 0xd0cc, 0x0110, 0x080c, 0x4328, 0x000e, 0x012e, 0x2000, + 0x0005, 0x6428, 0x84ff, 0x0508, 0x2c70, 0x7004, 0xa0bc, 0x000f, + 0xa7b8, 0x3ff5, 0x273c, 0x87fb, 0x1148, 0x0210, 0x080c, 0x254c, + 0x609c, 0xa075, 0x0190, 0x0c88, 0x2039, 0x3fea, 0x2704, 0xae68, + 0x6808, 0xa630, 0x680c, 0xa529, 0x8421, 0x0138, 0x8738, 0x2704, + 0xa005, 0x1da8, 0x709c, 0xa075, 0x1d00, 0x0005, 0x0000, 0x0005, + 0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, + 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x3fea, 0x3fe7, + 0x0000, 0x0000, 0x8000, 0x0000, 0x3fea, 0x0000, 0x3ff2, 0x3fef, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3ff2, 0x0000, 0x3fed, 0x3fed, + 0x0000, 0x0000, 0x8000, 0x0000, 0x3fed, 0x0000, 0x3ff3, 0x3ff3, + 0x0000, 0x0000, 0x0000, 0x0000, 0x3ff3, 0x2079, 0x4600, 0x2071, + 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001, 0x2009, + 0x0002, 0x2071, 0x0050, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, + 0x0000, 0x2001, 0x01ff, 0x2004, 0xd0fc, 0x1128, 0x8109, 0x0118, + 0x2071, 0x0020, 0x0c80, 0x0005, 0x7004, 0x8004, 0x1a04, 0x408a, + 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c, + 0x40e6, 0x0804, 0x40aa, 0x7007, 0x0012, 0x2019, 0x0000, 0x7108, + 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0120, 0x080c, 0x40e6, + 0x0804, 0x40aa, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0190, 0xa386, + 0x0008, 0x01c0, 0x7004, 0xd084, 0x1148, 0x7108, 0x7008, 0xa106, + 0x1de0, 0xa184, 0x0003, 0x0110, 0x0804, 0x40e6, 0xa386, 0x200c, + 0x19f0, 0x7200, 0x8204, 0x0230, 0x730c, 0xa384, 0x07ff, 0x0110, + 0x080c, 0x254c, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, + 0x0118, 0x080c, 0x40e6, 0x0470, 0x7007, 0x0012, 0x7000, 0xd084, + 0x1148, 0x7310, 0x7014, 0xa305, 0x0128, 0x710c, 0xa184, 0x07ff, + 0x1904, 0x4034, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, + 0x0118, 0x080c, 0x40e6, 0x00b0, 0x7007, 0x0012, 0x7007, 0x0008, + 0x7004, 0xd09c, 0x1de8, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, + 0x01e0, 0x0118, 0x080c, 0x40e6, 0x0028, 0x7007, 0x0012, 0x7108, + 0x8103, 0x0e88, 0x7003, 0x0008, 0x0005, 0x7108, 0xa184, 0x01e0, + 0x15a8, 0x7108, 0xa184, 0x01e0, 0x1588, 0xa184, 0x0007, 0x0002, + 0x40c2, 0x40d0, 0x40c0, 0x40d0, 0x40c0, 0x4120, 0x40c0, 0x411e, + 0x080c, 0x254c, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, + 0x1118, 0x2049, 0x0000, 0x0005, 0x080c, 0x426b, 0x1de8, 0x0005, + 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x1140, + 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x0003, 0x0108, 0x0030, + 0x8aff, 0x0118, 0x080c, 0x426b, 0x1de8, 0x0005, 0x7007, 0x0012, + 0x7108, 0x1d04, 0x40e9, 0x2091, 0x6000, 0x1d04, 0x40ed, 0x2091, + 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x1de8, + 0x7007, 0x0012, 0x7108, 0xd1fc, 0x1dd8, 0x7003, 0x0000, 0x7000, + 0xa005, 0x1130, 0x7004, 0xa005, 0x1118, 0x700c, 0xa005, 0x0108, + 0x0c40, 0x2049, 0x0000, 0xb284, 0x0200, 0x0118, 0x2001, 0x0000, + 0x0010, 0x2001, 0x0001, 0x080c, 0x3b81, 0x681b, 0x0002, 0x2051, + 0x0000, 0x0005, 0x080c, 0x254c, 0x080c, 0x254c, 0x080c, 0x415f, + 0x7210, 0x7114, 0x700c, 0xa09c, 0x07ff, 0x2800, 0xa300, 0xa211, + 0xa189, 0x0000, 0x04a1, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, + 0xa322, 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0140, 0x1238, + 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0c58, 0x2b60, + 0x8a07, 0x0006, 0x6004, 0xd09c, 0x0118, 0xa7ba, 0x3fef, 0x0010, + 0xa7ba, 0x3fe7, 0x000e, 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, + 0x6b8e, 0x7108, 0x7008, 0xa106, 0x1de0, 0xa184, 0x01e0, 0x0110, + 0x080c, 0x40e6, 0x7007, 0x0012, 0x080c, 0x4034, 0x0005, 0x8a50, + 0x8739, 0x2704, 0xa004, 0x1168, 0x6000, 0xa064, 0x1108, 0x2d60, + 0x6004, 0xa084, 0x000f, 0xa080, 0x4005, 0x203c, 0x87fb, 0x090c, + 0x254c, 0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, + 0x2090, 0x00de, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, 0x8057, + 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x0006, 0x6804, 0xa084, 0x0008, + 0x000e, 0x0118, 0xa0b8, 0x3fef, 0x0010, 0xa0b8, 0x3fe7, 0xb284, + 0x0200, 0x0110, 0x7e20, 0x0008, 0x7e24, 0xa6b5, 0x000c, 0x681c, + 0xd0b4, 0x0108, 0xc685, 0x2400, 0xa305, 0x0518, 0x2c58, 0x2704, + 0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, + 0xd19c, 0x0140, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, 0xa081, + 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, 0x2300, + 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x080c, 0x4292, + 0x0010, 0x080c, 0x426b, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, + 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x7007, + 0x0004, 0x7004, 0xd094, 0x1de8, 0x7003, 0x0008, 0x012e, 0x2000, + 0x0005, 0x0126, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, + 0x00de, 0x7e20, 0xb284, 0x0200, 0x1108, 0x7e24, 0xa6b5, 0x000c, + 0x681c, 0xd0ac, 0x1118, 0xc685, 0x7003, 0x0000, 0x6828, 0x2050, + 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x3ff5, 0x273c, 0x87fb, + 0x1138, 0x0210, 0x080c, 0x254c, 0x689c, 0xa065, 0x0120, 0x0c88, + 0x080c, 0x426b, 0x1de8, 0x012e, 0x2000, 0x0005, 0x0126, 0x0006, + 0x0016, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x7e20, + 0xb284, 0x0200, 0x1108, 0x7e24, 0x00de, 0x003e, 0x004e, 0xa6b5, + 0x000c, 0x681c, 0xd0b4, 0x0128, 0xc685, 0x7003, 0x0000, 0x7007, + 0x0004, 0x2049, 0x4206, 0x6828, 0xa055, 0x00d6, 0x0904, 0x4267, + 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x3ff5, 0x273c, + 0x87fb, 0x1140, 0x0210, 0x080c, 0x254c, 0x709c, 0xa075, 0x2060, + 0x0570, 0x0c80, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, + 0x0268, 0x8a51, 0x1110, 0x080c, 0x254c, 0x8738, 0x2704, 0xa005, + 0x1d90, 0x709c, 0xa075, 0x2060, 0x01d0, 0x08e0, 0x8422, 0x8420, + 0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, + 0xa11b, 0x1210, 0x080c, 0x254c, 0xb284, 0x0200, 0x0118, 0x2071, + 0x0050, 0x0010, 0x2071, 0x0020, 0x00de, 0x0804, 0x419b, 0x00de, + 0x012e, 0x2000, 0x0005, 0x7008, 0x0006, 0xa084, 0x01e0, 0x000e, + 0x0110, 0xa006, 0x0005, 0xa084, 0x0003, 0xa086, 0x0003, 0x1108, + 0x0005, 0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e, 0x7808, + 0x7012, 0x780c, 0x7016, 0x6004, 0xd09c, 0x0120, 0x7810, 0x7022, + 0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085, 0x7006, + 0x2079, 0x4600, 0x8a51, 0x01e8, 0x8738, 0x2704, 0xa005, 0x1168, + 0x609c, 0xa005, 0x01b8, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080, + 0x3ff5, 0x203c, 0x87fb, 0x090c, 0x254c, 0x7008, 0x0006, 0xa084, + 0x01e0, 0x000e, 0x0110, 0xa006, 0x0028, 0xa084, 0x0003, 0xa086, + 0x0003, 0x0005, 0x2051, 0x0000, 0x0005, 0x0126, 0x0006, 0x00d6, + 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, 0x008e, 0x7108, + 0xa184, 0x0003, 0x1128, 0x6828, 0xa005, 0x0178, 0x0804, 0x3f45, + 0x7108, 0xd1fc, 0x0118, 0x080c, 0x40ae, 0x0c88, 0x7007, 0x0010, + 0x7108, 0xd1fc, 0x0de8, 0x080c, 0x40ae, 0x7008, 0xa086, 0x0008, + 0x1d30, 0x7000, 0xa005, 0x1d18, 0x7003, 0x0000, 0x2049, 0x0000, + 0x0006, 0x2001, 0x4601, 0x2004, 0xd0cc, 0x0110, 0x080c, 0x4328, + 0x000e, 0x012e, 0x2000, 0x0005, 0x0126, 0x0146, 0x0136, 0x0156, + 0x00c6, 0x00d6, 0x70d0, 0xa084, 0x4c00, 0x8004, 0x2090, 0x00de, + 0x2049, 0x42ec, 0xad80, 0x0011, 0x20a0, 0xb284, 0x0200, 0x0118, + 0x2099, 0x0032, 0x0010, 0x2099, 0x0031, 0x700c, 0xa084, 0x07ff, + 0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0118, + 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x07ff, 0x0130, 0x7007, + 0x0004, 0x7004, 0xa084, 0x0004, 0x1de0, 0x00ce, 0x2049, 0x0000, + 0x7003, 0x0000, 0x015e, 0x013e, 0x014e, 0x012e, 0x2000, 0x0005, + 0x6814, 0xd0fc, 0x0904, 0x436b, 0x7000, 0xd084, 0x05e0, 0x7e24, + 0xa6b5, 0x0004, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x1de0, + 0x7118, 0x0016, 0x711c, 0x0016, 0x7120, 0x0016, 0x7124, 0x0016, + 0x701b, 0x0000, 0x701f, 0x3fff, 0x7023, 0x0000, 0x7027, 0x0000, + 0x7013, 0x0004, 0x7017, 0x0000, 0x7602, 0x7007, 0x0001, 0x2001, + 0xffff, 0x2009, 0x0031, 0x200a, 0x200a, 0x7108, 0x7008, 0xa106, + 0x1de0, 0xd1fc, 0x0dd0, 0x002e, 0x7226, 0x002e, 0x7222, 0x002e, + 0x721e, 0x002e, 0x721a, 0x7007, 0x0002, 0x7008, 0xa086, 0x0008, + 0x0110, 0x0804, 0x40e6, 0x7007, 0x0004, 0x7003, 0x0000, 0x0005, + 0x2091, 0x8000, 0x2091, 0x6000, 0x78ac, 0xa005, 0x1168, 0x7974, + 0x70d0, 0xa106, 0x1148, 0x781c, 0xa005, 0x0130, 0x781f, 0x0000, + 0x0e04, 0x4384, 0x2091, 0x4080, 0x2069, 0x4680, 0xd7fc, 0x1110, + 0x2069, 0x4640, 0x6800, 0xa084, 0x000f, 0x1198, 0x68d0, 0xd0b4, + 0x0180, 0xd0bc, 0x1170, 0x00f6, 0x2079, 0x0100, 0xd7fc, 0x1110, + 0x2079, 0x0200, 0x7830, 0xa084, 0x00c0, 0x1110, 0x080c, 0x22ae, + 0x00fe, 0x7830, 0x8001, 0x7832, 0x1904, 0x440b, 0x7834, 0x7832, + 0x2061, 0x6bc0, 0x2069, 0x4680, 0xc7fd, 0x68cc, 0xa005, 0x0128, + 0x8001, 0x68ce, 0x1110, 0x080c, 0x4577, 0x6800, 0xa084, 0x000f, + 0x0168, 0xa086, 0x0001, 0x0150, 0x6840, 0xa00d, 0x0138, 0x2104, + 0xa005, 0x0120, 0x8001, 0x200a, 0x0904, 0x4514, 0x6814, 0xa005, + 0x01a8, 0x8001, 0x6816, 0x1190, 0x68a3, 0x0001, 0x00f6, 0xd7fc, + 0x1118, 0x2079, 0x0200, 0x0010, 0x2079, 0x0100, 0x080c, 0x3c46, + 0x00fe, 0x6860, 0xa005, 0x0110, 0x080c, 0x22ae, 0x687c, 0xa005, + 0x0140, 0x8001, 0x687e, 0x1128, 0x6863, 0x0000, 0x68d0, 0xc0c5, + 0x68d2, 0x68d0, 0xd0fc, 0x01b0, 0xc0fc, 0x68d2, 0x20a9, 0x0200, + 0x6034, 0xa005, 0x0158, 0x8001, 0x6036, 0x68d0, 0xc0fd, 0x68d2, + 0x1128, 0x6010, 0xa005, 0x0110, 0x080c, 0x22ae, 0xace0, 0x0010, + 0x1f04, 0x43f0, 0xd7fc, 0x0138, 0x2061, 0x4bc0, 0x2069, 0x4640, + 0xc7fc, 0x0804, 0x43ad, 0x0459, 0x7838, 0x8001, 0x783a, 0x11a0, + 0x783c, 0x783a, 0x2061, 0x4bc0, 0x2069, 0x4640, 0xc7fc, 0x680c, + 0xa005, 0x0110, 0x080c, 0x4487, 0xd7fc, 0x1130, 0x2061, 0x6bc0, + 0x2069, 0x4680, 0xc7fd, 0x0c98, 0x7810, 0xd0cc, 0x0168, 0xd0ac, 0x1120, 0xd0a4, 0x0148, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0e04, - 0x4193, 0x080c, 0x1ffe, 0x0005, 0x2091, 0x8001, 0x0005, 0x7840, - 0x8001, 0x7842, 0x1568, 0x7844, 0x7842, 0x2091, 0x8000, 0x2061, - 0x48c0, 0x2069, 0x4340, 0xc7fc, 0x6810, 0xa005, 0x1110, 0x2001, - 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0118, 0xa080, 0x89d0, 0x0010, - 0xa080, 0x88c0, 0x2040, 0x2004, 0xa065, 0x0150, 0x6024, 0xa005, - 0x0120, 0x8001, 0x6026, 0x0904, 0x4207, 0x6000, 0x2c40, 0x0ca0, - 0xd7fc, 0x1130, 0x2061, 0x68c0, 0x2069, 0x4380, 0xc7fd, 0x08e0, - 0x0005, 0x2009, 0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0540, - 0x6024, 0xa005, 0x0118, 0x8001, 0x6026, 0x0400, 0x6008, 0xc09c, - 0xd084, 0x1110, 0xd0ac, 0x01a8, 0x600a, 0x6004, 0xa06d, 0x01c0, - 0x00c6, 0x0016, 0x6010, 0x8001, 0x6012, 0x080c, 0x35ab, 0x2d00, - 0x2c68, 0x2060, 0x080c, 0x1b85, 0x080c, 0x1d30, 0x001e, 0x00ce, - 0x0038, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0010, 0xa18d, 0x0100, - 0xace0, 0x0010, 0x1f04, 0x41cd, 0xa184, 0x0001, 0x0130, 0xa18c, - 0xfffe, 0x690e, 0x080c, 0x2233, 0x0008, 0x690e, 0x0005, 0x6800, - 0xa005, 0x0120, 0x684c, 0xac06, 0x0904, 0x425f, 0x6864, 0xa005, - 0x0120, 0x6027, 0x0001, 0x0804, 0x425c, 0x2c00, 0x687e, 0x6714, - 0x6f76, 0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, 0x60b4, - 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, - 0x6022, 0x6000, 0x2042, 0x080c, 0x1b1d, 0x6818, 0xa005, 0x0110, + 0x4433, 0x080c, 0x207a, 0x0005, 0x2091, 0x8001, 0x0005, 0x7840, + 0x8001, 0x7842, 0x1904, 0x4486, 0x7844, 0x7842, 0x2069, 0x4640, + 0xc7fc, 0x2079, 0x0200, 0x68d4, 0xa005, 0x0138, 0x7de0, 0xa504, + 0x1120, 0x68d6, 0x68d0, 0xc0bc, 0x68d2, 0x2079, 0x4600, 0x6810, + 0xa005, 0x1110, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0118, + 0xa080, 0x8cd0, 0x0010, 0xa080, 0x8bc0, 0x2040, 0x2004, 0xa065, + 0x01e0, 0x6024, 0xa005, 0x01b0, 0x8001, 0x6026, 0x1198, 0x6800, + 0xa005, 0x0130, 0x6848, 0xac06, 0x1118, 0x080c, 0x4514, 0x0068, + 0x6860, 0xa005, 0x0118, 0x6027, 0x0001, 0x0020, 0x080c, 0x44c8, + 0x2804, 0x0c28, 0x6000, 0x2c40, 0x0c10, 0xd7fc, 0x1138, 0x2069, + 0x4680, 0xc7fd, 0x2079, 0x0100, 0x0804, 0x4443, 0x0005, 0x2009, + 0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0558, 0x6024, 0xa005, + 0x0118, 0x8001, 0x6026, 0x0418, 0x6008, 0xc09c, 0xd084, 0x1110, + 0xd0ac, 0x01c0, 0x600a, 0x6004, 0xa005, 0x01d8, 0x00d6, 0x00c6, + 0x0016, 0x2068, 0x6010, 0x8001, 0x6012, 0x080c, 0x37a4, 0x2d00, + 0x2c68, 0x2060, 0x080c, 0x1be3, 0x080c, 0x1d95, 0x001e, 0x00ce, + 0x00de, 0x0038, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0010, 0xa18d, + 0x0100, 0xace0, 0x0010, 0x1f04, 0x448b, 0xa184, 0x0001, 0x0130, + 0xa18c, 0xfffe, 0x690e, 0x080c, 0x22ae, 0x0008, 0x690e, 0x0005, + 0x2c00, 0x687a, 0x6714, 0x6f72, 0x6017, 0x0000, 0x602b, 0x0000, + 0x601b, 0x0006, 0x60b4, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084, + 0x00ff, 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6858, 0xac06, + 0x1110, 0x2800, 0x685a, 0x080c, 0x1b7b, 0x6818, 0xa005, 0x0110, 0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, 0x7908, 0x8109, - 0x790a, 0x8001, 0x1310, 0x080c, 0x243b, 0x6812, 0x1118, 0x7910, + 0x790a, 0x8001, 0x1310, 0x080c, 0x254c, 0x6812, 0x1118, 0x7910, 0xc1a5, 0x7912, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x080c, - 0x1d3d, 0xd7fc, 0x1118, 0x2069, 0x4340, 0x0010, 0x2069, 0x4380, - 0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x1118, 0x697a, 0x2001, - 0x0004, 0x2708, 0x080c, 0x2228, 0x2091, 0x8001, 0x0005, 0x00d6, - 0x694c, 0x2160, 0xd7fc, 0x1118, 0x2069, 0x0200, 0x0010, 0x2069, - 0x0100, 0x080c, 0x23e1, 0x601b, 0x0006, 0x6858, 0xa084, 0x3f00, - 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, - 0x0000, 0x6033, 0x0000, 0x6830, 0xd0b4, 0x01b0, 0x684b, 0x0004, - 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x4282, 0x684b, - 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04, 0x428b, - 0x20a9, 0x00fa, 0x1f04, 0x4292, 0x6808, 0xa084, 0xfffd, 0x680a, - 0x681b, 0x0054, 0x00de, 0x6867, 0x0007, 0x2091, 0x8001, 0x0005, - 0x2079, 0x4300, 0x00e1, 0x0089, 0x00a9, 0x2009, 0x0002, 0x2069, - 0x4380, 0x680f, 0x0000, 0x6813, 0x0000, 0x6817, 0x0000, 0x8109, - 0x0118, 0x2069, 0x4340, 0x0ca8, 0x0005, 0x2019, 0x00a3, 0x7b3a, - 0x7b3e, 0x0005, 0x2019, 0x0033, 0x7b42, 0x7b46, 0x0005, 0x2019, - 0x32dd, 0x7b32, 0x7b36, 0x0005, 0x6950, 0xa185, 0x0000, 0x0178, - 0x00c6, 0x6ac0, 0x2264, 0x602b, 0x0000, 0x602f, 0x0000, 0x6008, - 0xc0b5, 0x600a, 0x8210, 0x8109, 0x1da8, 0x6952, 0x00ce, 0x0005, - 0x70ec, 0xd0dc, 0x1118, 0xd0d4, 0x0180, 0x0088, 0xae8e, 0x0100, - 0x0130, 0x7814, 0xc0f5, 0x7816, 0xd0d4, 0x1170, 0x0050, 0x7814, - 0xc0fd, 0x7816, 0xd0d4, 0x1140, 0x0020, 0xd0e4, 0x0138, 0x70a0, - 0x70a2, 0x7804, 0xd08c, 0x0110, 0x681f, 0x000c, 0x0005, 0xaf67 + 0x1da2, 0xd7fc, 0x1118, 0x2069, 0x4640, 0x0010, 0x2069, 0x4680, + 0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x1118, 0x6976, 0x2001, + 0x0004, 0x080c, 0x22a4, 0x0005, 0x00d6, 0x6948, 0x2160, 0xd7fc, + 0x1118, 0x2069, 0x0200, 0x0010, 0x2069, 0x0100, 0x080c, 0x2467, + 0x601b, 0x0006, 0x6858, 0xa084, 0x5f00, 0x601e, 0x6020, 0xa084, + 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, + 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x01b0, 0x684b, + 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0110, 0x1f04, 0x453b, + 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, 0xd084, 0x0110, 0x1f04, + 0x4544, 0x20a9, 0x00fa, 0x1f04, 0x454b, 0x681b, 0x0054, 0x00de, + 0x6863, 0x0007, 0x0005, 0x2079, 0x4600, 0x00e1, 0x0089, 0x00a9, + 0x2009, 0x0002, 0x2069, 0x4680, 0x680f, 0x0000, 0x6813, 0x0000, + 0x6817, 0x0000, 0x8109, 0x0118, 0x2069, 0x4640, 0x0ca8, 0x0005, + 0x2019, 0x00a3, 0x7b3a, 0x7b3e, 0x0005, 0x2019, 0x0033, 0x7b42, + 0x7b46, 0x0005, 0x2019, 0x32dd, 0x7b32, 0x7b36, 0x0005, 0x6a4c, + 0xa285, 0x0000, 0x01f0, 0x6950, 0x6bbc, 0xa300, 0x00c6, 0x2164, + 0x6304, 0x83ff, 0x1138, 0x8211, 0x0148, 0x8108, 0xa11a, 0x0eb8, + 0x69bc, 0x0ca8, 0x68cf, 0x000a, 0x00ce, 0x0005, 0x694c, 0x6abc, + 0x2264, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109, 0x1dc8, 0x694e, + 0x00ce, 0x0005, 0x1d04, 0x459a, 0x2091, 0x6000, 0x1d04, 0x459e, + 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x1118, 0xd0d4, 0x0190, 0x0098, + 0xae8e, 0x0100, 0x0138, 0x7814, 0xc0f5, 0xc0c5, 0x7816, 0xd0d4, + 0x1578, 0x0458, 0x7814, 0xc0fd, 0xc0c5, 0x7816, 0xd0d4, 0x1540, + 0x0420, 0xd0e4, 0x0538, 0x1d04, 0x45bb, 0x2091, 0x6000, 0x2009, + 0x000c, 0x1d04, 0x45c1, 0x2091, 0x6000, 0x8109, 0x1dd0, 0x70e4, + 0xa084, 0x01ff, 0xa086, 0x01ff, 0x1110, 0x70ec, 0x08c8, 0xae8e, + 0x0100, 0x0128, 0x7814, 0xc0f4, 0xd0fc, 0x1130, 0x0020, 0x7814, + 0xc0fc, 0xd0f4, 0x1108, 0xc0c4, 0x7816, 0x7804, 0xd08c, 0x0110, + 0x681f, 0x000c, 0x70a0, 0x70a2, 0x0005, 0x7c12 }; #ifdef UNIQUE_FW_NAME -unsigned short fw12160i_length01 = 0x32f8; +unsigned short fw12160i_length01 = 0x35e6; #else -unsigned short risc_code_length01 = 0x32f8; +unsigned short risc_code_length01 = 0x35e6; #endif - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/ql1280_fw.h linux-2.4.23-pre8/drivers/scsi/ql1280_fw.h --- linux-2.4.22/drivers/scsi/ql1280_fw.h 2000-02-08 03:45:28.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/ql1280_fw.h 2003-10-22 22:49:12.000000000 +0000 @@ -1,59 +1,74 @@ +/***************************************************************************** + * QLOGIC LINUX SOFTWARE + * + * QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x + * Copyright (C) 2001 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. + * + *****************************************************************************/ + /************************************************************************ - * * * --- ISP1240/1080/1280 Initiator Firmware --- * * 32 LUN Support * - * * - ************************************************************************ - * Copyright (C) 1999,2000 Qlogic, Corporation. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted provided - * that the following conditions are met: - * 1. Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * * - ************************************************************************ - */ + ************************************************************************/ /* - * Firmware Version 8.09.00 (18:29 Apr 16, 1999) + * Firmware Version 8.15.00 (14:35 Aug 22, 2000) */ -unsigned short fw1280ei_version = 8*1024+9; +#ifdef UNIQUE_FW_NAME +unsigned short fw1280ei_version = 8*1024+15; +#else +unsigned short risc_code_version = 8*1024+15; +#endif + +#ifdef UNIQUE_FW_NAME +unsigned char fw1280ei_version_str[] = {8,15,0}; +#else +unsigned char firmware_version[] = {8,15,0}; +#endif -unsigned char fw1280ei_version_str[] = {8,9,0}; +#ifdef UNIQUE_FW_NAME +#define fw1280ei_VERSION_STRING "8.15.00" +#else +#define FW_VERSION_STRING "8.15.00" +#endif -unsigned short fw1280ei_addr01 = 0x1000 ; +#ifdef UNIQUE_FW_NAME +unsigned short fw1280ei_addr01 = 0x1000; +#else +unsigned short risc_code_addr01 = 0x1000; +#endif -unsigned short fw1280ei_code01[] = { - 0x0078, 0x1041, 0x0000, 0x39e3, 0x0000, 0x2043, 0x4f50, 0x5952, +#ifdef UNIQUE_FW_NAME +unsigned short fw1280ei_code01[] = { +#else +unsigned short risc_code01[] = { +#endif + 0x0078, 0x1041, 0x0000, 0x3d3b, 0x0000, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31, 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320, 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350, 0x3132, 0x3430, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056, - 0x6572, 0x7369, 0x6f6e, 0x2030, 0x382e, 0x3039, 0x2020, 0x2043, + 0x6572, 0x7369, 0x6f6e, 0x2030, 0x382e, 0x3135, 0x2020, 0x2043, 0x7573, 0x746f, 0x6d65, 0x7220, 0x4e6f, 0x2e20, 0x3030, 0x2050, 0x726f, 0x6475, 0x6374, 0x204e, 0x6f2e, 0x2020, 0x3030, 0x2020, - 0x2400, 0x20c9, 0x93ff, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1080, + 0x2400, 0x20c9, 0x97ff, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1080, 0x00c0, 0x1054, 0x2071, 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010, - 0x2089, 0x136a, 0x0078, 0x106d, 0x2001, 0x04fc, 0x2004, 0xa086, + 0x2089, 0x1374, 0x0078, 0x106d, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1280, 0x00c0, 0x1069, 0x2071, 0x0200, 0x70a0, 0x70a2, 0x2071, - 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010, 0x2089, 0x13ea, 0x0078, - 0x106d, 0x20c1, 0x0020, 0x2089, 0x1312, 0x2071, 0x0010, 0x70c3, + 0x0100, 0x70a0, 0x70a2, 0x20c1, 0x0010, 0x2089, 0x13f8, 0x0078, + 0x106d, 0x20c1, 0x0020, 0x2089, 0x131c, 0x2071, 0x0010, 0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0008, 0x2001, 0x04fe, 0x70d6, 0x20c1, 0x0021, 0x2019, 0x0000, 0x2009, 0xfeff, 0x2100, 0x200b, 0xa5a5, 0xa1ec, 0x7fff, 0x2d64, @@ -61,1838 +76,1948 @@ 0xa286, 0xa5a5, 0x0040, 0x10a4, 0xa386, 0x000f, 0x0040, 0x10a0, 0x2c6a, 0x2a5a, 0x20c1, 0x0020, 0x2019, 0x000f, 0x0078, 0x1080, 0x2c6a, 0x2a5a, 0x0078, 0x10a2, 0x2c6a, 0x2a5a, 0x2130, 0x2128, - 0xa1a2, 0x4a00, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, - 0xa192, 0x9400, 0x2009, 0x0000, 0x2001, 0x0032, 0x1078, 0x2078, - 0x2218, 0x2079, 0x4a00, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, - 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10bf, 0x2001, 0x04fc, 0x2004, - 0xa086, 0x1080, 0x00c0, 0x10db, 0x2071, 0x0100, 0x0d7e, 0x2069, - 0x4a40, 0x1078, 0x49ae, 0x0d7f, 0x7810, 0xc0ed, 0x7812, 0x781b, - 0x0064, 0x0078, 0x1100, 0x2001, 0x04fc, 0x2004, 0xa086, 0x1280, - 0x00c0, 0x10fb, 0x7814, 0xc0ed, 0xc0d5, 0x7816, 0x781b, 0x0064, - 0x2071, 0x0200, 0x0d7e, 0x2069, 0x4a40, 0x1078, 0x49ae, 0x2069, - 0x4a80, 0x2071, 0x0100, 0x1078, 0x49ae, 0x7814, 0xc0d4, 0x7816, - 0x0d7f, 0x0078, 0x1100, 0x7814, 0xc0e5, 0x7816, 0x781b, 0x003c, - 0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800, 0xc08d, 0x7802, - 0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002, 0x7827, 0x0002, - 0x2009, 0x0002, 0x2069, 0x4a40, 0x681b, 0x0003, 0x6823, 0x0007, - 0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028, 0x6837, 0x0000, - 0x683b, 0x0006, 0x6833, 0x0008, 0x683f, 0x0000, 0x8109, 0x0040, - 0x1154, 0x68d3, 0x000a, 0x68c3, 0x4ac0, 0x2079, 0x4a00, 0x7814, - 0xd0e4, 0x00c0, 0x113a, 0xd0ec, 0x00c0, 0x113e, 0x68d7, 0x7329, - 0x0078, 0x1140, 0x68d7, 0x730d, 0x0078, 0x1140, 0x68d7, 0x7329, - 0x68c7, 0x4fc0, 0x68cb, 0x4ec0, 0x68cf, 0x8fc0, 0x68ab, 0x9244, - 0x68af, 0x9249, 0x68b3, 0x9244, 0x68b7, 0x9244, 0x68a7, 0x0001, - 0x2069, 0x4a80, 0x0078, 0x1114, 0x68d3, 0x000a, 0x68c3, 0x4cc0, - 0x7814, 0xd0e4, 0x00c0, 0x1160, 0x68d7, 0x7439, 0x0078, 0x1162, - 0x68d7, 0x7419, 0x68c7, 0x6fc0, 0x68cb, 0x4f40, 0x68cf, 0x90d0, - 0x68ab, 0x9249, 0x68af, 0x924e, 0x68b3, 0x9249, 0x68b7, 0x9249, - 0x68a7, 0x0001, 0x7810, 0xd0ec, 0x00c0, 0x11b8, 0x7814, 0xd0e4, - 0x00c0, 0x11aa, 0x0e7e, 0x2069, 0x4ec0, 0x2071, 0x0200, 0x70ec, - 0xd0e4, 0x00c0, 0x118b, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078, - 0x2007, 0x0078, 0x1191, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078, - 0x2007, 0x2069, 0x4f40, 0x2071, 0x0100, 0x70ec, 0xd0e4, 0x00c0, - 0x11a1, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078, 0x2007, 0x0078, - 0x11a7, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078, 0x2007, 0x0e7f, - 0x0078, 0x11d1, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x2069, 0x4ec0, - 0x1078, 0x2007, 0x2069, 0x4f40, 0x1078, 0x2007, 0x0078, 0x11d1, - 0x2069, 0x4ec0, 0x0e7e, 0x2071, 0x0100, 0x70ec, 0xd0e4, 0x00c0, - 0x11ca, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078, 0x2007, 0x0e7f, - 0x0078, 0x11d1, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078, 0x2007, - 0x0e7f, 0x2011, 0x0002, 0x2069, 0x4fc0, 0x2009, 0x0002, 0x20a9, - 0x0100, 0x683f, 0x0000, 0x680b, 0x0040, 0x7bc8, 0xa386, 0xfeff, - 0x00c0, 0x11e8, 0x6817, 0x0100, 0x681f, 0x0064, 0x0078, 0x11ec, - 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, 0x00f0, 0x11d9, - 0x8109, 0x00c0, 0x11d7, 0x8211, 0x0040, 0x11fa, 0x2069, 0x6fc0, - 0x0078, 0x11d5, 0x1078, 0x2611, 0x1078, 0x441d, 0x1078, 0x1df2, - 0x1078, 0x4957, 0x2091, 0x2100, 0x2079, 0x4a00, 0x7810, 0xd0ec, - 0x0040, 0x120e, 0x2071, 0x0020, 0x0078, 0x1210, 0x2071, 0x0050, - 0x2091, 0x2200, 0x2079, 0x4a00, 0x2071, 0x0020, 0x2091, 0x2300, - 0x2079, 0x4a00, 0x7810, 0xd0ec, 0x0040, 0x1222, 0x2079, 0x0100, - 0x0078, 0x1224, 0x2079, 0x0200, 0x2071, 0x4a40, 0x2091, 0x2400, - 0x2079, 0x0100, 0x2071, 0x4a80, 0x2091, 0x2000, 0x2079, 0x4a00, - 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090, 0x2071, 0x0010, - 0x70c3, 0x0000, 0x0090, 0x1243, 0x70c0, 0xa086, 0x0002, 0x00c0, - 0x1243, 0x1078, 0x159d, 0x2039, 0x0000, 0x7810, 0xd0ec, 0x00c0, - 0x12c5, 0x1078, 0x1472, 0x78ac, 0xa005, 0x00c0, 0x1261, 0x0068, - 0x1257, 0x786c, 0xa065, 0x0040, 0x1257, 0x1078, 0x2368, 0x1078, - 0x209f, 0x0068, 0x126e, 0x786c, 0xa065, 0x0040, 0x1261, 0x1078, - 0x2368, 0x0068, 0x126e, 0x2009, 0x4a47, 0x2011, 0x4a87, 0x2104, - 0x220c, 0xa105, 0x0040, 0x126e, 0x1078, 0x1f1e, 0x2071, 0x4a40, - 0x70a4, 0xa005, 0x0040, 0x1293, 0x7450, 0xa485, 0x0000, 0x0040, - 0x1293, 0x2079, 0x0200, 0x2091, 0x8000, 0x72d4, 0xa28c, 0x303d, - 0x2190, 0x1078, 0x2a9c, 0x2091, 0x8000, 0x2091, 0x303d, 0x0068, - 0x1293, 0x2079, 0x4a00, 0x786c, 0xa065, 0x0040, 0x1293, 0x2071, - 0x0010, 0x1078, 0x2368, 0x00e0, 0x129b, 0x2079, 0x4a00, 0x2071, - 0x0010, 0x1078, 0x4765, 0x2071, 0x4a80, 0x70a4, 0xa005, 0x0040, - 0x12b3, 0x7050, 0xa025, 0x0040, 0x12b3, 0x2079, 0x0100, 0x2091, - 0x8000, 0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078, 0x2a9c, 0x2091, - 0x8000, 0x2091, 0x303d, 0x2079, 0x4a00, 0x2071, 0x0010, 0x0068, - 0x12bf, 0x786c, 0xa065, 0x0040, 0x12bf, 0x1078, 0x2368, 0x00e0, - 0x1249, 0x1078, 0x4765, 0x0078, 0x1249, 0x1078, 0x1472, 0x78ac, - 0xa005, 0x00c0, 0x12dd, 0x0068, 0x12d3, 0x786c, 0xa065, 0x0040, - 0x12d3, 0x1078, 0x2368, 0x1078, 0x209f, 0x0068, 0x12e7, 0x786c, - 0xa065, 0x0040, 0x12dd, 0x1078, 0x2368, 0x0068, 0x12e7, 0x2009, - 0x4a47, 0x2104, 0xa005, 0x0040, 0x12e7, 0x1078, 0x1f1e, 0x2071, - 0x4a40, 0x70a4, 0xa005, 0x0040, 0x1302, 0x7450, 0xa485, 0x0000, - 0x0040, 0x1302, 0x2079, 0x0100, 0x2091, 0x8000, 0x72d4, 0xa28c, - 0x303d, 0x2190, 0x1078, 0x2a9c, 0x2091, 0x8000, 0x2091, 0x303d, - 0x2079, 0x4a00, 0x2071, 0x0010, 0x0068, 0x130c, 0x786c, 0xa065, - 0x0040, 0x130c, 0x1078, 0x2368, 0x00e0, 0x12c5, 0x1078, 0x4765, - 0x0078, 0x12c5, 0x1332, 0x1332, 0x1334, 0x1334, 0x1341, 0x1341, - 0x1341, 0x1341, 0x134c, 0x134c, 0x1359, 0x1359, 0x1341, 0x1341, - 0x1341, 0x1341, 0x1332, 0x1332, 0x1334, 0x1334, 0x1341, 0x1341, - 0x1341, 0x1341, 0x134c, 0x134c, 0x1359, 0x1359, 0x1341, 0x1341, - 0x1341, 0x1341, 0x0078, 0x1332, 0x007e, 0x107e, 0x127e, 0x2091, - 0x2400, 0x1078, 0x290b, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, - 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13ba, 0x127f, 0x107f, - 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, - 0x2300, 0x1078, 0x290b, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, - 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x290b, - 0x2091, 0x2400, 0x1078, 0x290b, 0x127f, 0x107f, 0x007f, 0x2091, - 0x8001, 0x007c, 0x138a, 0x138a, 0x138c, 0x138c, 0x1399, 0x1399, - 0x1399, 0x1399, 0x13a4, 0x13a4, 0x138c, 0x138c, 0x1399, 0x1399, - 0x1399, 0x1399, 0x13a5, 0x13a5, 0x13a5, 0x13a5, 0x13a5, 0x13a5, - 0x13a5, 0x13a5, 0x13a5, 0x13a5, 0x13a5, 0x13a5, 0x13a5, 0x13a5, - 0x13a5, 0x13a5, 0x0078, 0x138a, 0x007e, 0x107e, 0x127e, 0x2091, - 0x2300, 0x1078, 0x290b, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, - 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13c7, 0x127f, 0x107f, - 0x007f, 0x2091, 0x8001, 0x007c, 0x007c, 0x107e, 0x127e, 0x0d7e, - 0x0e7e, 0x0f7e, 0x007e, 0x2071, 0x0100, 0x2069, 0x4a40, 0x2079, - 0x4a00, 0x1078, 0x49ae, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, - 0x107f, 0x007c, 0x3c00, 0xa084, 0x0007, 0x0079, 0x13bf, 0x13d0, - 0x13d0, 0x13d2, 0x13d2, 0x13d7, 0x13d7, 0x13dc, 0x13dc, 0x3c00, - 0xa084, 0x0003, 0x0079, 0x13cc, 0x13d0, 0x13d0, 0x13e5, 0x13e5, - 0x1078, 0x28ec, 0x2091, 0x2200, 0x1078, 0x44b7, 0x007c, 0x2091, - 0x2100, 0x1078, 0x44b7, 0x007c, 0x2091, 0x2100, 0x1078, 0x44b7, - 0x2091, 0x2200, 0x1078, 0x44b7, 0x007c, 0x2091, 0x2100, 0x1078, - 0x44b7, 0x007c, 0x140a, 0x140a, 0x140c, 0x140c, 0x1419, 0x1419, - 0x1419, 0x1419, 0x1424, 0x1424, 0x1431, 0x1431, 0x1419, 0x1419, - 0x1419, 0x1419, 0x1442, 0x1442, 0x1442, 0x1442, 0x1442, 0x1442, - 0x1442, 0x1442, 0x1442, 0x1442, 0x1442, 0x1442, 0x1442, 0x1442, - 0x1442, 0x1442, 0x0078, 0x140a, 0x007e, 0x107e, 0x127e, 0x2091, - 0x2400, 0x1078, 0x290b, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, - 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13ba, 0x127f, 0x107f, - 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, - 0x2300, 0x1078, 0x290b, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, - 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x290b, - 0x2091, 0x2400, 0x1078, 0x290b, 0x127f, 0x107f, 0x007f, 0x2091, - 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, - 0x2079, 0x4a00, 0x2071, 0x0200, 0x2069, 0x4a40, 0x3d00, 0xd08c, - 0x00c0, 0x1456, 0x2069, 0x4a80, 0x2071, 0x0100, 0x1078, 0x49ae, - 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007f, 0x007c, 0x7008, - 0x800b, 0x00c8, 0x146d, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0, - 0x146e, 0xd09c, 0x0040, 0x146d, 0x087a, 0x097a, 0x70c3, 0x4002, - 0x0078, 0x15a0, 0x0068, 0x14f7, 0x2061, 0x0000, 0x6018, 0xd084, - 0x00c0, 0x14f7, 0x7828, 0xa005, 0x00c0, 0x1482, 0x0010, 0x14f8, - 0x0078, 0x14f7, 0x7910, 0xd1f4, 0x0040, 0x148a, 0x2001, 0x4007, - 0x0078, 0x159f, 0x7914, 0xd1ec, 0x0040, 0x14a5, 0xd0fc, 0x0040, - 0x149b, 0x007e, 0x1078, 0x1d82, 0x007f, 0x0040, 0x14a5, 0x2001, - 0x4007, 0x0078, 0x159f, 0x007e, 0x1078, 0x1d72, 0x007f, 0x0040, - 0x14a5, 0x2001, 0x4007, 0x0078, 0x159f, 0x7910, 0xd0fc, 0x00c0, - 0x14af, 0x2061, 0x4a40, 0xc19c, 0xc7fc, 0x0078, 0x14b3, 0x2061, - 0x4a80, 0xc19d, 0xc7fd, 0x6064, 0xa005, 0x00c0, 0x14f7, 0x7912, - 0x6083, 0x0000, 0x7828, 0xc0fc, 0xa086, 0x0018, 0x00c0, 0x14c4, - 0x0c7e, 0x1078, 0x1b13, 0x0c7f, 0x782b, 0x0000, 0x607c, 0xa065, - 0x0040, 0x14dd, 0x0c7e, 0x609c, 0x1078, 0x1e5d, 0x0c7f, 0x609f, - 0x0000, 0x1078, 0x1c3f, 0x2009, 0x0018, 0x6087, 0x0103, 0x1078, - 0x1d92, 0x00c0, 0x14f1, 0x1078, 0x1de4, 0x7810, 0xd09c, 0x00c0, - 0x14e5, 0x2061, 0x4a40, 0x0078, 0x14e9, 0x2061, 0x4a80, 0xc09c, - 0x7812, 0x607f, 0x0000, 0x60d4, 0xd0dc, 0x0040, 0x14f5, 0xc0dc, - 0x60d6, 0x2001, 0x4005, 0x0078, 0x159f, 0x0078, 0x159d, 0x007c, - 0x7810, 0xd0f4, 0x0040, 0x1500, 0x2001, 0x4007, 0x0078, 0x159f, - 0xa006, 0x70c2, 0x70c6, 0x70ca, 0x70ce, 0x70da, 0x70c0, 0xa08a, - 0x0040, 0x00c8, 0x150d, 0x0079, 0x1514, 0x2100, 0xa08a, 0x0040, - 0x00c8, 0x15ab, 0x0079, 0x1554, 0x159d, 0x15f3, 0x15bc, 0x162b, - 0x1663, 0x1663, 0x15b3, 0x1c57, 0x166e, 0x15ab, 0x15c0, 0x15c2, - 0x15c4, 0x15c6, 0x1c5c, 0x15ab, 0x167c, 0x16d4, 0x1b35, 0x1c51, - 0x15c8, 0x19a7, 0x19e9, 0x1a1f, 0x1a6b, 0x1962, 0x196f, 0x1983, - 0x1996, 0x17a4, 0x1cdc, 0x1706, 0x1713, 0x171f, 0x172b, 0x1741, - 0x174d, 0x1750, 0x175c, 0x1768, 0x1770, 0x178c, 0x1798, 0x15ab, - 0x15ab, 0x15ab, 0x15ab, 0x17b1, 0x17c3, 0x17df, 0x1815, 0x183d, - 0x184d, 0x1850, 0x1881, 0x18b2, 0x18c4, 0x1931, 0x1941, 0x1d32, - 0x15ab, 0x15ab, 0x15ab, 0x1951, 0x15ab, 0x15ab, 0x15ab, 0x15ab, - 0x15ab, 0x1c81, 0x1c87, 0x15ab, 0x15ab, 0x15ab, 0x1c8b, 0x1cd8, - 0x15ab, 0x15ab, 0x1ce8, 0x1cf7, 0x15ed, 0x165d, 0x1676, 0x16ce, - 0x1b2f, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x1d39, 0x1c73, 0x1c7d, - 0x15ab, 0x15ab, 0x1d02, 0x1d1b, 0x15ab, 0x15ab, 0x15ab, 0x15ab, - 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, - 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, - 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x15ab, - 0x15ab, 0x15ab, 0x15ab, 0x15ab, 0x72ca, 0x71c6, 0x2001, 0x4006, - 0x0078, 0x159f, 0x73ce, 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, - 0x0068, 0x15a0, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, - 0x2091, 0x4080, 0x007c, 0x70c3, 0x4001, 0x0078, 0x15a0, 0x70c3, - 0x4006, 0x0078, 0x15a0, 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, - 0x0005, 0x53a3, 0x0078, 0x159d, 0x70c4, 0x70c3, 0x0004, 0x007a, - 0x0078, 0x159d, 0x0078, 0x159d, 0x0078, 0x159d, 0x0078, 0x159d, - 0x2091, 0x8000, 0x70c3, 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, - 0x70cf, 0x2020, 0x70d3, 0x0008, 0x2001, 0x0009, 0x70d6, 0x2079, - 0x0000, 0x781b, 0x0001, 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, - 0x041a, 0x2051, 0x0445, 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, - 0x5000, 0x2091, 0x4080, 0x0078, 0x0418, 0x75d8, 0x74dc, 0x75da, - 0x74de, 0x0078, 0x15f6, 0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, - 0x73cc, 0x70c4, 0x20a0, 0x2099, 0x0030, 0x7003, 0x0001, 0x7007, - 0x0006, 0x731a, 0x721e, 0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, - 0x0040, 0x159d, 0xa182, 0x0040, 0x00c8, 0x1610, 0x2120, 0xa006, - 0x2008, 0x8403, 0x7012, 0x7007, 0x0004, 0x7007, 0x0001, 0x7008, - 0xd0fc, 0x0040, 0x1617, 0x7007, 0x0002, 0xa084, 0x01e0, 0x0040, - 0x1625, 0x70c3, 0x4002, 0x0078, 0x15a0, 0x24a8, 0x53a5, 0x0078, - 0x1607, 0x0078, 0x159d, 0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, - 0x73cc, 0x70c4, 0x2098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x7007, - 0x0006, 0x731a, 0x721e, 0x7422, 0x7526, 0x2021, 0x0040, 0x7007, - 0x0006, 0x81ff, 0x0040, 0x159d, 0xa182, 0x0040, 0x00c8, 0x164a, - 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007, - 0x0001, 0x7008, 0xd0fc, 0x0040, 0x1651, 0xa084, 0x01e0, 0x0040, - 0x163f, 0x70c3, 0x4002, 0x0078, 0x15a0, 0x75d8, 0x74dc, 0x75da, - 0x74de, 0x0078, 0x162e, 0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, - 0x00c0, 0x166b, 0x200a, 0x72ca, 0x0078, 0x159c, 0x70c7, 0x0008, - 0x70cb, 0x0009, 0x70cf, 0x0000, 0x0078, 0x159d, 0x75d8, 0x76dc, - 0x75da, 0x76de, 0x0078, 0x167f, 0x2029, 0x0000, 0x2530, 0x70c4, - 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, - 0x0040, 0x16c9, 0x8001, 0x7872, 0xa084, 0xfc00, 0x0040, 0x1697, - 0x78ac, 0xc085, 0x78ae, 0x2001, 0x4005, 0x0078, 0x159f, 0x7b7e, - 0x7a7a, 0x7e86, 0x7d82, 0x7c76, 0xa48c, 0xff00, 0x0040, 0x16af, - 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f, 0xa118, 0xa291, - 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, 0x0078, 0x16b9, 0x8407, - 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, - 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605, 0x0040, 0x16c3, - 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc, 0x78ae, 0x0078, - 0x16cc, 0x78ac, 0xc085, 0x78ae, 0x0078, 0x159d, 0x75d8, 0x76dc, - 0x75da, 0x76de, 0x0078, 0x16d7, 0x2029, 0x0000, 0x2530, 0x70c4, - 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, - 0x0040, 0x1701, 0x8001, 0x7892, 0xa084, 0xfc00, 0x0040, 0x16ef, - 0x78ac, 0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0078, 0x159f, 0x7a9a, - 0x7b9e, 0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0040, 0x16fa, 0x7a10, - 0xc2c5, 0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0078, - 0x1704, 0x78ac, 0xc0c5, 0x78ae, 0x0078, 0x159d, 0x2009, 0x0000, - 0x786c, 0xa065, 0x0040, 0x1710, 0x8108, 0x6000, 0x0078, 0x1709, - 0x7ac4, 0x0078, 0x159b, 0x2009, 0x4a48, 0x210c, 0x7810, 0xd0ec, - 0x00c0, 0x159c, 0x2011, 0x4a88, 0x2214, 0x0078, 0x159b, 0x2009, - 0x4a49, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x159c, 0x2011, 0x4a89, - 0x2214, 0x0078, 0x159b, 0x2061, 0x4a40, 0x6128, 0x622c, 0x8214, - 0x8214, 0x8214, 0x7810, 0xd0ec, 0x00c0, 0x173f, 0x2061, 0x4a80, - 0x6328, 0x73da, 0x632c, 0x831c, 0x831c, 0x831c, 0x73de, 0x0078, - 0x159b, 0x2009, 0x4a4c, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x159c, - 0x2011, 0x4a8c, 0x2214, 0x0078, 0x159b, 0x7918, 0x0078, 0x159c, - 0x2009, 0x4a4d, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x159c, 0x2011, - 0x4a8d, 0x2214, 0x0078, 0x159b, 0x2009, 0x4a4e, 0x210c, 0x7810, - 0xd0ec, 0x00c0, 0x159c, 0x2011, 0x4a8e, 0x2214, 0x0078, 0x159b, - 0x7920, 0x7810, 0xd0ec, 0x00c0, 0x159c, 0x7a24, 0x0078, 0x159b, - 0x71c4, 0xd1fc, 0x00c0, 0x1778, 0x2011, 0x4ec0, 0x0078, 0x177a, - 0x2011, 0x4f40, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, - 0xa268, 0x6a00, 0x6804, 0xd09c, 0x0040, 0x1789, 0x6b08, 0x0078, - 0x178a, 0x6b0c, 0x0078, 0x159a, 0x77c4, 0x1078, 0x1e02, 0x2091, - 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x159a, - 0x2061, 0x4a40, 0x6118, 0x7810, 0xd0ec, 0x00c0, 0x159c, 0x2061, - 0x4a80, 0x6218, 0x0078, 0x159b, 0x77c4, 0x1078, 0x1e02, 0x2091, - 0x8000, 0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091, 0x8001, 0x0078, - 0x159a, 0x71c4, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010, 0x00c8, - 0x1595, 0x1078, 0x2729, 0xa384, 0x4000, 0x0040, 0x17c1, 0xa295, - 0x0020, 0x0078, 0x159a, 0x71c4, 0x2100, 0xc0bc, 0xa082, 0x0010, - 0x00c8, 0x1595, 0xd1bc, 0x00c0, 0x17d2, 0x2011, 0x4a48, 0x2204, - 0x0078, 0x17d6, 0x2011, 0x4a88, 0x2204, 0xc0bd, 0x007e, 0x2100, - 0xc0bc, 0x2012, 0x1078, 0x2686, 0x017f, 0x0078, 0x159c, 0x71c4, - 0x2021, 0x4a49, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x17ee, - 0x71c8, 0x2021, 0x4a89, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x180d, - 0x20a9, 0x0008, 0x2204, 0xa106, 0x0040, 0x17fd, 0x8210, 0x00f0, - 0x17f2, 0x71c4, 0x72c8, 0x0078, 0x1594, 0xa292, 0x180d, 0x027e, - 0x2122, 0x017f, 0x1078, 0x26a7, 0x7810, 0xd0ec, 0x00c0, 0x180b, - 0xd3fc, 0x0040, 0x17e8, 0x0078, 0x159d, 0x03e8, 0x00fa, 0x01f4, - 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061, 0x4a40, 0x6128, - 0x622c, 0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, - 0x8003, 0x8003, 0x602e, 0x7810, 0xd0ec, 0x00c0, 0x183b, 0x027e, - 0x017e, 0x2061, 0x4a80, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, - 0x70d8, 0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, - 0x72de, 0x017f, 0x027f, 0x0078, 0x159b, 0x2061, 0x4a40, 0x6130, - 0x70c4, 0x6032, 0x7810, 0xd0ec, 0x00c0, 0x159c, 0x2061, 0x4a80, - 0x6230, 0x70c8, 0x6032, 0x0078, 0x159b, 0x7918, 0x0078, 0x159c, - 0x71c4, 0xa184, 0xffcf, 0x0040, 0x185c, 0x7810, 0xd0ec, 0x00c0, - 0x1595, 0x72c8, 0x0078, 0x1594, 0x2011, 0x4a4d, 0x2204, 0x2112, - 0x007e, 0x2019, 0x0000, 0x1078, 0x270e, 0x7810, 0xd0ec, 0x0040, - 0x186c, 0x017f, 0x0078, 0x159c, 0x71c8, 0xa184, 0xffcf, 0x0040, - 0x1875, 0x2110, 0x71c4, 0x0078, 0x1594, 0x2011, 0x4a8d, 0x2204, - 0x2112, 0x007e, 0xc3fd, 0x1078, 0x270e, 0x027f, 0x017f, 0x0078, - 0x159b, 0x71c4, 0xa182, 0x0010, 0x0048, 0x188d, 0x7810, 0xd0ec, - 0x00c0, 0x1595, 0x72c8, 0x0078, 0x1594, 0x2011, 0x4a4e, 0x2204, - 0x007e, 0x2112, 0x2019, 0x0000, 0x1078, 0x26ec, 0x7810, 0xd0ec, - 0x0040, 0x189d, 0x017f, 0x0078, 0x159c, 0x71c8, 0xa182, 0x0010, - 0x0048, 0x18a6, 0x2110, 0x71c4, 0x0078, 0x1594, 0x2011, 0x4a8e, - 0x2204, 0x007e, 0x2112, 0xc3fd, 0x1078, 0x26ec, 0x027f, 0x017f, - 0x0078, 0x159b, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x1594, - 0xa284, 0xfffd, 0x00c0, 0x1594, 0x2100, 0x7920, 0x7822, 0x2200, - 0x7a24, 0x7826, 0x0078, 0x159b, 0x71c4, 0xd1fc, 0x00c0, 0x18cc, - 0x2011, 0x4ec0, 0x0078, 0x18ce, 0x2011, 0x4f40, 0x8107, 0xa084, - 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, 0x2019, 0x0000, 0x72c8, - 0xa284, 0x0080, 0x0040, 0x18e2, 0x6c14, 0x84ff, 0x00c0, 0x18e2, - 0x6817, 0x0040, 0xa284, 0x0040, 0x0040, 0x18ec, 0x6c10, 0x84ff, - 0x00c0, 0x18ec, 0x6813, 0x0001, 0x6800, 0x007e, 0xa226, 0x0040, - 0x1909, 0x6a02, 0xd4ec, 0x0040, 0x18f6, 0xc3a5, 0xd4e4, 0x0040, - 0x18fa, 0xc39d, 0xd4f4, 0x0040, 0x1909, 0x810f, 0xd2f4, 0x0040, - 0x1905, 0x1078, 0x276b, 0x0078, 0x1909, 0x1078, 0x2749, 0x0078, - 0x1909, 0x72cc, 0x6808, 0xa206, 0x0040, 0x1929, 0xa2a4, 0x00ff, - 0x7814, 0xd0e4, 0x00c0, 0x191c, 0xa482, 0x0028, 0x0048, 0x1926, - 0x0040, 0x1926, 0x0078, 0x1920, 0xa482, 0x0043, 0x0048, 0x1926, - 0x71c4, 0x71c6, 0x027f, 0x72ca, 0x0078, 0x1596, 0x6a0a, 0xa39d, - 0x000a, 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x0078, - 0x159a, 0x77c4, 0x1078, 0x1e02, 0x2091, 0x8000, 0x6a14, 0x6b1c, - 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, - 0x159a, 0x70c4, 0x2061, 0x4a40, 0x6118, 0x601a, 0x7810, 0xd0ec, - 0x00c0, 0x159c, 0x70c8, 0x2061, 0x4a80, 0x6218, 0x601a, 0x0078, - 0x159b, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, 0x1595, - 0x1078, 0x278d, 0xa384, 0x4000, 0x0040, 0x1960, 0xa295, 0x0020, - 0x0078, 0x159a, 0x77c4, 0x1078, 0x1e02, 0x2091, 0x8000, 0x6a08, - 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x159b, 0x77c4, - 0x1078, 0x1e02, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, - 0x6804, 0xa005, 0x0040, 0x197e, 0x1078, 0x25de, 0x2091, 0x8001, - 0x2708, 0x0078, 0x159b, 0x77c4, 0x1078, 0x1e02, 0x2091, 0x8000, - 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1991, 0x1078, - 0x25de, 0x2091, 0x8001, 0x2708, 0x0078, 0x159b, 0x77c4, 0x2041, - 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, - 0x1e1d, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x159b, 0x77c4, - 0x7814, 0xd0e4, 0x00c0, 0x19bb, 0xd7fc, 0x0040, 0x19b5, 0x1078, - 0x1d82, 0x0040, 0x19bb, 0x0078, 0x159f, 0x1078, 0x1d72, 0x0040, - 0x19bb, 0x0078, 0x159f, 0x73c8, 0x72cc, 0x77c6, 0x73ca, 0x72ce, - 0x1078, 0x1e9a, 0x00c0, 0x19e5, 0x6818, 0xa005, 0x0040, 0x19df, - 0x2708, 0x077e, 0x1078, 0x27bd, 0x077f, 0x00c0, 0x19df, 0x2001, - 0x0015, 0xd7fc, 0x00c0, 0x19d8, 0x2061, 0x4a40, 0x0078, 0x19db, - 0xc0fd, 0x2061, 0x4a80, 0x782a, 0x2091, 0x8001, 0x007c, 0x2091, - 0x8001, 0x2001, 0x4005, 0x0078, 0x159f, 0x2091, 0x8001, 0x0078, - 0x159d, 0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x19fd, 0xd7fc, 0x0040, - 0x19f7, 0x1078, 0x1d82, 0x0040, 0x19fd, 0x0078, 0x159f, 0x1078, - 0x1d72, 0x0040, 0x19fd, 0x0078, 0x159f, 0x77c6, 0x2041, 0x0021, - 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, 0x1e1d, - 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x1a11, 0x2061, 0x4a40, 0x0078, - 0x1a14, 0x2061, 0x4a80, 0xc1fd, 0x6067, 0x0003, 0x6776, 0x6083, - 0x000f, 0x792a, 0x1078, 0x25de, 0x2091, 0x8001, 0x007c, 0x77c8, - 0x77ca, 0x77c4, 0x77c6, 0x7814, 0xd0e4, 0x00c0, 0x1a36, 0xd7fc, - 0x0040, 0x1a30, 0x1078, 0x1d82, 0x0040, 0x1a36, 0x0078, 0x159f, - 0x1078, 0x1d72, 0x0040, 0x1a36, 0x0078, 0x159f, 0xa7bc, 0xff00, - 0x2091, 0x8000, 0x2009, 0x0017, 0xd7fc, 0x00c0, 0x1a43, 0x2061, - 0x4a40, 0x0078, 0x1a46, 0x2061, 0x4a80, 0xc1fd, 0x6067, 0x0002, - 0x6776, 0x6083, 0x000f, 0x792a, 0x1078, 0x25de, 0x2091, 0x8001, - 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0010, 0x2091, 0x8000, - 0x70c8, 0xa005, 0x0040, 0x1a5f, 0x60d4, 0xc0fd, 0x60d6, 0x1078, - 0x1e1d, 0x70c8, 0x683e, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1a5f, - 0x2091, 0x8001, 0x007c, 0x7814, 0xd0e4, 0x00c0, 0x1a7f, 0x72c8, - 0xd284, 0x0040, 0x1a79, 0x1078, 0x1d82, 0x0040, 0x1a7f, 0x0078, - 0x159f, 0x1078, 0x1d72, 0x0040, 0x1a7f, 0x0078, 0x159f, 0x72c8, - 0x72ca, 0x78ac, 0xa084, 0x0003, 0x00c0, 0x1aaa, 0x2039, 0x0000, - 0xd284, 0x0040, 0x1a8c, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, - 0x2051, 0x0008, 0x1078, 0x1e02, 0x2091, 0x8000, 0x6808, 0xc0d4, - 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, - 0x1a92, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, - 0x00c0, 0x1a92, 0x2091, 0x8000, 0x72c8, 0xd284, 0x00c0, 0x1abc, - 0x7810, 0xd0ec, 0x0040, 0x1ab8, 0x2069, 0x0100, 0x0078, 0x1abe, - 0x2069, 0x0200, 0x0078, 0x1abe, 0x2069, 0x0100, 0x6830, 0xd0b4, - 0x0040, 0x1ada, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, - 0x0040, 0x1acc, 0x00f0, 0x1ac6, 0x684b, 0x0009, 0x20a9, 0x0014, - 0x6848, 0xd084, 0x0040, 0x1ad6, 0x00f0, 0x1ad0, 0x20a9, 0x00fa, - 0x00f0, 0x1ad8, 0x2079, 0x4a00, 0x2009, 0x0018, 0x72c8, 0xd284, - 0x00c0, 0x1ae6, 0x2061, 0x4a40, 0x0078, 0x1ae9, 0x2061, 0x4a80, - 0xc1fd, 0x792a, 0x6067, 0x0001, 0x6083, 0x000f, 0x60a7, 0x0000, - 0x60a8, 0x60b2, 0x60b6, 0x60d4, 0xd0b4, 0x0040, 0x1b03, 0xc0b4, - 0x60d6, 0x0c7e, 0x60b8, 0xa065, 0x6008, 0xc0d4, 0x600a, 0x6018, - 0x8001, 0x601a, 0x0c7f, 0x60d4, 0xa084, 0x77ff, 0x60d6, 0x78ac, - 0xc08d, 0x78ae, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, 0x0047, - 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1b1a, 0x2069, 0x4a40, - 0x0078, 0x1b1c, 0x2069, 0x4a80, 0x78ac, 0xc08c, 0x78ae, 0xd084, - 0x00c0, 0x1b26, 0x0d7e, 0x1078, 0x1efa, 0x0d7f, 0x71c4, 0x71c6, - 0x6916, 0x81ff, 0x00c0, 0x1b2e, 0x68a7, 0x0001, 0x007c, 0x75d8, - 0x74dc, 0x75da, 0x74de, 0x0078, 0x1b38, 0x2029, 0x0000, 0x2520, - 0x71c4, 0x73c8, 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x4a00, - 0x7dde, 0x7cda, 0x7bd6, 0x7ad2, 0x1078, 0x1ddb, 0x0040, 0x1c3b, - 0x20a9, 0x0005, 0x20a1, 0x4a14, 0x2091, 0x8000, 0x41a1, 0x2091, - 0x8001, 0x2009, 0x0040, 0x1078, 0x1fcf, 0x0040, 0x1b5b, 0x1078, - 0x1de4, 0x0078, 0x1c3b, 0x6004, 0xa08c, 0x00ff, 0xa18e, 0x0009, - 0x00c0, 0x1b66, 0x007e, 0x1078, 0x234b, 0x007f, 0xa084, 0xff00, - 0x8007, 0x8009, 0x0040, 0x1bda, 0x0c7e, 0x2c68, 0x1078, 0x1ddb, - 0x0040, 0x1bac, 0x2c00, 0x689e, 0x8109, 0x00c0, 0x1b6d, 0x609f, - 0x0000, 0x0c7f, 0x0c7e, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, - 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, - 0x7cda, 0x7bd6, 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1bd9, - 0x2009, 0x0040, 0x1078, 0x1fcf, 0x00c0, 0x1bc3, 0x6004, 0xa084, - 0x00ff, 0xa086, 0x0002, 0x00c0, 0x1bac, 0x6004, 0xa084, 0x00ff, - 0xa086, 0x000a, 0x00c0, 0x1ba8, 0x017e, 0x1078, 0x2347, 0x017f, - 0x2d00, 0x6002, 0x0078, 0x1b7b, 0x0c7f, 0x0c7e, 0x609c, 0x1078, - 0x1e5d, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c3f, 0x2009, 0x0018, - 0x6008, 0xc0cd, 0x600a, 0x6004, 0x6086, 0x1078, 0x1d92, 0x1078, - 0x1de4, 0x0078, 0x1c3b, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e5d, - 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c3f, 0x2009, 0x0018, 0x6087, - 0x0103, 0x601b, 0x0003, 0x1078, 0x1d92, 0x1078, 0x1de4, 0x0078, - 0x1c3b, 0x0c7f, 0x7814, 0xd0e4, 0x00c0, 0x1bff, 0x6114, 0xd1fc, - 0x0040, 0x1be8, 0x1078, 0x1d82, 0x0040, 0x1bff, 0x0078, 0x1bec, - 0x1078, 0x1d72, 0x0040, 0x1bff, 0x2029, 0x0000, 0x2520, 0x2009, - 0x0018, 0x73c8, 0x72cc, 0x6087, 0x0103, 0x601b, 0x0021, 0x1078, - 0x1d92, 0x1078, 0x1de4, 0x2001, 0x4007, 0x0078, 0x159f, 0x74c4, - 0x73c8, 0x72cc, 0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009, 0x0012, - 0xd0fc, 0x00c0, 0x1c0f, 0x2071, 0x4a40, 0x0078, 0x1c12, 0x2071, - 0x4a80, 0xc1fd, 0x792a, 0x7067, 0x0005, 0x71d4, 0xa18c, 0xf77f, - 0x71d6, 0x736a, 0x726e, 0x7472, 0x7076, 0x707b, 0x0000, 0x2c00, - 0x707e, 0xa02e, 0x2530, 0x611c, 0xa184, 0x0060, 0x0040, 0x1c2a, - 0x1078, 0x43c1, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, - 0x0000, 0x60b3, 0x0000, 0x6714, 0x6023, 0x0000, 0x1078, 0x25de, - 0x2091, 0x8001, 0x007c, 0x70c3, 0x4005, 0x0078, 0x15a0, 0x20a9, - 0x0005, 0x2099, 0x4a14, 0x2091, 0x8000, 0x530a, 0x2091, 0x8001, - 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, - 0x007c, 0x71c4, 0x70c7, 0x0000, 0x791e, 0x0078, 0x159d, 0x71c4, - 0x71c6, 0x2168, 0x0078, 0x1c5e, 0x2069, 0x1000, 0x690c, 0xa016, - 0x2d04, 0xa210, 0x8d68, 0x8109, 0x00c0, 0x1c60, 0xa285, 0x0000, - 0x00c0, 0x1c6e, 0x70c3, 0x4000, 0x0078, 0x1c70, 0x70c3, 0x4003, - 0x70ca, 0x0078, 0x15a0, 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, - 0x00c8, 0x1595, 0x7966, 0x0078, 0x159d, 0x7964, 0x71c6, 0x0078, - 0x159d, 0x7900, 0x71c6, 0x71c4, 0x7902, 0x0078, 0x159d, 0x7900, - 0x71c6, 0x0078, 0x159d, 0x70c4, 0xd08c, 0x0040, 0x1c94, 0x7a10, - 0xd2ec, 0x00c0, 0x1c94, 0xc08c, 0x2011, 0x0000, 0xa08c, 0x000d, - 0x0040, 0x1ca8, 0x810c, 0x0048, 0x1ca4, 0x8210, 0x810c, 0x810c, - 0x0048, 0x1ca4, 0x8210, 0x810c, 0x81ff, 0x00c0, 0x1596, 0x8210, - 0x7a0e, 0xd28c, 0x0040, 0x1cd4, 0x7910, 0xc1cd, 0x7912, 0x2009, - 0x0021, 0x2019, 0x0003, 0xd284, 0x0040, 0x1cce, 0x8108, 0x2019, - 0x0041, 0x2011, 0x924e, 0x2312, 0x2019, 0x0042, 0x8210, 0x2312, - 0x2019, 0x0043, 0x8210, 0x2312, 0x2019, 0x0046, 0x8210, 0x2312, - 0x2019, 0x0047, 0x8210, 0x2312, 0x2019, 0x0006, 0x2011, 0x9253, - 0x2112, 0x2011, 0x9273, 0x2312, 0x7904, 0x7806, 0x0078, 0x159c, - 0x7804, 0x70c6, 0x0078, 0x159d, 0x2091, 0x8000, 0x2019, 0x0000, - 0x2011, 0x0000, 0x2009, 0x0000, 0x2091, 0x8001, 0x0078, 0x159a, - 0x77c4, 0x1078, 0x1e02, 0x2091, 0x8000, 0x6830, 0xa084, 0xff00, - 0x8007, 0x2010, 0x2091, 0x8001, 0x2708, 0x0078, 0x159b, 0x77c4, - 0x1078, 0x1e02, 0x2091, 0x8000, 0x6a34, 0x2091, 0x8001, 0x2708, - 0x0078, 0x159b, 0x77c4, 0x077e, 0xa7bc, 0xff00, 0x20a9, 0x0008, - 0x72c8, 0x8217, 0x1078, 0x1e02, 0x2091, 0x8000, 0x6c30, 0x6a32, - 0x2091, 0x8001, 0x8738, 0x00f0, 0x1d0a, 0x077f, 0x2708, 0x8427, - 0x2410, 0x0078, 0x159b, 0x77c4, 0x077e, 0xa7bc, 0xff00, 0x20a9, - 0x0008, 0x72c8, 0x1078, 0x1e02, 0x2091, 0x8000, 0x6c34, 0x6a36, - 0x2091, 0x8001, 0x8738, 0x00f0, 0x1d22, 0x077f, 0x2708, 0x2410, - 0x0078, 0x159b, 0x2011, 0x4a3c, 0x220c, 0x70c4, 0x2012, 0x0078, - 0x159c, 0x71c4, 0xd1fc, 0x00c0, 0x1d41, 0x2011, 0x4ec0, 0x0078, - 0x1d43, 0x2011, 0x4f40, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, - 0x8003, 0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1d52, 0x2011, 0x0001, - 0x0078, 0x1d54, 0x2011, 0x0000, 0x6b0c, 0x0078, 0x159a, 0x017e, - 0x7814, 0xd0f4, 0x0040, 0x1d64, 0x2001, 0x4007, 0x70db, 0x0000, - 0xa18d, 0x0001, 0x0078, 0x1d70, 0xd0fc, 0x0040, 0x1d6f, 0x2001, - 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078, 0x1d70, 0xa006, - 0x017f, 0x007c, 0x017e, 0x7814, 0xd0f4, 0x0040, 0x1d7f, 0x2001, - 0x4007, 0x70db, 0x0000, 0xa18d, 0x0001, 0x0078, 0x1d80, 0xa006, - 0x017f, 0x007c, 0x017e, 0x7814, 0xd0fc, 0x0040, 0x1d8f, 0x2001, - 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078, 0x1d90, 0xa006, - 0x017f, 0x007c, 0x7112, 0x721a, 0x731e, 0x7810, 0xd0c4, 0x0040, - 0x1d9b, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c, 0x81a9, - 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084, 0x20a2, 0x53a6, - 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0040, 0x1db8, 0x810f, - 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078, 0x1dbb, - 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, 0xa006, 0xa211, - 0x7d10, 0xd5c4, 0x0040, 0x1dc8, 0x7b84, 0xa319, 0x7c80, 0xa421, - 0x7008, 0xd0fc, 0x0040, 0x1dc8, 0x7003, 0x0001, 0x7007, 0x0006, - 0x711a, 0x721e, 0x7d10, 0xd5c4, 0x0040, 0x1dd8, 0x7322, 0x7426, - 0xa084, 0x01e0, 0x007c, 0x7848, 0xa065, 0x0040, 0x1de3, 0x2c04, - 0x784a, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079, 0x4a00, 0x7848, - 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1def, 0x1078, 0x28ec, 0x784a, - 0x0f7f, 0x007c, 0x2011, 0x9400, 0x7a4a, 0x7bc4, 0x8319, 0x0040, - 0x1dff, 0xa280, 0x0032, 0x2012, 0x2010, 0x0078, 0x1df6, 0x2013, - 0x0000, 0x007c, 0x017e, 0x027e, 0xd7fc, 0x00c0, 0x1e0b, 0x2011, - 0x4fc0, 0x0078, 0x1e0d, 0x2011, 0x6fc0, 0xa784, 0x0f00, 0x800b, - 0xa784, 0x001f, 0x0040, 0x1e18, 0x8003, 0x8003, 0x8003, 0x8003, - 0xa105, 0xa268, 0x027f, 0x017f, 0x007c, 0x1078, 0x1e02, 0x2900, - 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef, 0xa80d, 0x690a, - 0xd7fc, 0x00c0, 0x1e2f, 0x2009, 0x4a53, 0x0078, 0x1e31, 0x2009, - 0x4a93, 0x210c, 0x6804, 0xa005, 0x0040, 0x1e41, 0xa116, 0x00c0, - 0x1e41, 0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, - 0x1e44, 0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1e59, - 0x6000, 0x6806, 0x1078, 0x1e6f, 0x1078, 0x201b, 0x6810, 0x7908, - 0x8109, 0x790a, 0x8001, 0x6812, 0x00c0, 0x1e44, 0x7910, 0xc1a5, - 0x7912, 0x017f, 0x6902, 0x6906, 0x007c, 0xa065, 0x0040, 0x1e6e, - 0x2008, 0x609c, 0xa005, 0x0040, 0x1e6b, 0x2062, 0x609f, 0x0000, - 0xa065, 0x0078, 0x1e61, 0x7848, 0x794a, 0x2062, 0x007c, 0x6007, - 0x0103, 0x608f, 0x0000, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, - 0x2001, 0x0000, 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, - 0x0e7e, 0xd7fc, 0x00c0, 0x1e8a, 0x2071, 0x4a40, 0x2031, 0x4ac0, - 0x0078, 0x1e8e, 0x2071, 0x4a80, 0x2031, 0x4cc0, 0x7050, 0xa08c, - 0x0200, 0x00c0, 0x1e98, 0xa608, 0x2d0a, 0x8000, 0x7052, 0xa006, - 0x0e7f, 0x007c, 0x0f7e, 0xd7fc, 0x00c0, 0x1ea2, 0x2079, 0x4a40, - 0x0078, 0x1ea4, 0x2079, 0x4a80, 0x1078, 0x1e02, 0x2091, 0x8000, - 0x6804, 0x780a, 0xa065, 0x0040, 0x1ef8, 0x0078, 0x1eb6, 0x2c00, - 0x780a, 0x2060, 0x6000, 0xa065, 0x0040, 0x1ef8, 0x6010, 0xa306, - 0x00c0, 0x1eaf, 0x600c, 0xa206, 0x00c0, 0x1eaf, 0x2c28, 0x784c, - 0xac06, 0x00c0, 0x1ec5, 0x0078, 0x1ef5, 0x6804, 0xac06, 0x00c0, - 0x1ed3, 0x6000, 0x2060, 0x6806, 0xa005, 0x00c0, 0x1ed3, 0x6803, - 0x0000, 0x0078, 0x1edd, 0x6400, 0x7808, 0x2060, 0x6402, 0xa486, - 0x0000, 0x00c0, 0x1edd, 0x2c00, 0x6802, 0x2560, 0x0f7f, 0x1078, - 0x1e6f, 0x0f7e, 0x601b, 0x0005, 0x6023, 0x0020, 0x0f7f, 0x1078, - 0x201b, 0x0f7e, 0x7908, 0x8109, 0x790a, 0x6810, 0x8001, 0x6812, - 0x00c0, 0x1ef5, 0x7810, 0xc0a5, 0x7812, 0x2001, 0xffff, 0xa005, - 0x0f7f, 0x007c, 0x077e, 0x2700, 0x2039, 0x0000, 0xd0fc, 0x0040, - 0x1f02, 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, - 0x2091, 0x8000, 0x1078, 0x1e1d, 0x8738, 0xa784, 0x001f, 0x00c0, - 0x1f0a, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, - 0x00c0, 0x1f0a, 0x2091, 0x8001, 0x077f, 0x007c, 0x2061, 0x0000, - 0x6018, 0xd084, 0x00c0, 0x1f3e, 0x7810, 0xd08c, 0x0040, 0x1f2f, - 0xc08c, 0x7812, 0xc7fc, 0x2069, 0x4a40, 0x0078, 0x1f34, 0xc08d, - 0x7812, 0x2069, 0x4a80, 0xc7fd, 0x2091, 0x8000, 0x681c, 0x681f, - 0x0000, 0x2091, 0x8001, 0xa005, 0x00c0, 0x1f3f, 0x007c, 0xa08c, - 0xfff0, 0x0040, 0x1f45, 0x1078, 0x28ec, 0x0079, 0x1f47, 0x1f57, - 0x1f5a, 0x1f60, 0x1f64, 0x1f58, 0x1f68, 0x1f58, 0x1f58, 0x1f58, - 0x1f6e, 0x1f9f, 0x1fa3, 0x1fa9, 0x1f58, 0x1f58, 0x1f58, 0x007c, - 0x1078, 0x28ec, 0x1078, 0x1efa, 0x2001, 0x8001, 0x0078, 0x1fbe, - 0x2001, 0x8003, 0x0078, 0x1fbe, 0x2001, 0x8004, 0x0078, 0x1fbe, - 0x1078, 0x1efa, 0x2001, 0x8006, 0x0078, 0x1fbe, 0x2091, 0x8000, - 0x077e, 0xd7fc, 0x00c0, 0x1f7a, 0x2069, 0x4a40, 0x2039, 0x0009, - 0x0078, 0x1f7e, 0x2069, 0x4a80, 0x2039, 0x0009, 0x6800, 0xa086, - 0x0000, 0x0040, 0x1f88, 0x007f, 0x6f1e, 0x2091, 0x8001, 0x007c, - 0x6874, 0x077f, 0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, - 0x2051, 0x0010, 0x1078, 0x1e1d, 0x8738, 0xa784, 0x001f, 0x00c0, - 0x1f92, 0x2091, 0x8001, 0x2001, 0x800a, 0x0078, 0x1fbe, 0x2001, - 0x800c, 0x0078, 0x1fbe, 0x1078, 0x1efa, 0x2001, 0x800d, 0x0078, - 0x1fbe, 0x7814, 0xd0e4, 0x00c0, 0x1fbc, 0xd0ec, 0x0040, 0x1fb6, - 0xd7fc, 0x0040, 0x1fb6, 0x78ec, 0x0078, 0x1fb7, 0x78e4, 0x70c6, - 0x2001, 0x800e, 0x0078, 0x1fbe, 0x0078, 0x1f58, 0x70c2, 0xd7fc, - 0x00c0, 0x1fc6, 0x70db, 0x0000, 0x0078, 0x1fc8, 0x70db, 0x0001, - 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080, 0x007c, 0xac80, - 0x0001, 0x81ff, 0x0040, 0x1ffa, 0x2099, 0x0030, 0x20a0, 0x700c, - 0xa084, 0x03ff, 0x0040, 0x1fdc, 0x7018, 0x007e, 0x701c, 0x007e, - 0x7020, 0x007e, 0x7024, 0x007e, 0x7112, 0x81ac, 0x721a, 0x731e, - 0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001, 0x7008, 0x800b, - 0x00c8, 0x1fee, 0x7007, 0x0002, 0xa08c, 0x01e0, 0x00c0, 0x1ffa, - 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004, 0x007f, 0x7026, - 0x007f, 0x7022, 0x007f, 0x701e, 0x007f, 0x701a, 0x007c, 0x2011, - 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x6803, 0xfd00, 0x6807, - 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004, 0x8109, - 0x00c0, 0x200b, 0x007c, 0x6004, 0x6086, 0x2c08, 0x2063, 0x0000, - 0x7868, 0xa005, 0x796a, 0x0040, 0x2028, 0x2c02, 0x0078, 0x2029, - 0x796e, 0x007c, 0x0c7e, 0x2061, 0x4a00, 0x6887, 0x0103, 0x2d08, - 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x203a, 0x2d02, - 0x0078, 0x203b, 0x616e, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x2c04, - 0x786e, 0xa005, 0x00c0, 0x2045, 0x786a, 0x2091, 0x8001, 0x609c, - 0xa005, 0x0040, 0x205e, 0x0c7e, 0x2060, 0x2008, 0x609c, 0xa005, - 0x0040, 0x205a, 0x2062, 0x609f, 0x0000, 0xa065, 0x609c, 0xa005, - 0x00c0, 0x2052, 0x7848, 0x794a, 0x2062, 0x0c7f, 0x7848, 0x2062, - 0x609f, 0x0000, 0xac85, 0x0000, 0x00c0, 0x2068, 0x1078, 0x28ec, - 0x784a, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, - 0x00c8, 0x2073, 0xa200, 0x00f0, 0x206e, 0x8086, 0x818e, 0x007c, - 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x2099, 0xa11a, 0x00c8, - 0x2099, 0x8213, 0x818d, 0x0048, 0x208c, 0xa11a, 0x00c8, 0x208d, - 0x00f0, 0x2081, 0x0078, 0x2091, 0xa11a, 0x2308, 0x8210, 0x00f0, - 0x2081, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, - 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x2095, 0x7d74, - 0x70d0, 0xa506, 0x0040, 0x2185, 0x7810, 0x2050, 0x7800, 0xd08c, - 0x0040, 0x20c1, 0xdaec, 0x0040, 0x20c1, 0x0e7e, 0x2091, 0x8000, - 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x20be, 0x7008, 0x0e7f, - 0xa086, 0x0008, 0x0040, 0x20c1, 0x0078, 0x2185, 0x0e7f, 0x0078, - 0x2185, 0x1078, 0x1ddb, 0x0040, 0x2185, 0xa046, 0x7970, 0x2500, - 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x20d0, 0x0078, 0x20d7, - 0x72d0, 0xa206, 0x0040, 0x20d7, 0x8840, 0x2009, 0x0080, 0x0c7e, - 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, 0x0020, 0xac80, - 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0040, 0x20e9, 0x1078, - 0x1ddb, 0x7008, 0xd0fc, 0x0040, 0x20e9, 0x7007, 0x0002, 0x2091, - 0x8001, 0xa08c, 0x01e0, 0x00c0, 0x2120, 0x53a5, 0x8cff, 0x00c0, - 0x20fe, 0x88ff, 0x0040, 0x216f, 0x0078, 0x2108, 0x2c00, 0x788e, - 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5, 0x0078, 0x216f, - 0xa046, 0x7218, 0x731c, 0xdac4, 0x0040, 0x2110, 0x7420, 0x7524, - 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000, 0xa5ab, 0x0000, - 0x721a, 0x731e, 0xdac4, 0x0040, 0x2120, 0x7422, 0x7526, 0xa006, - 0x7007, 0x0004, 0x0040, 0x216f, 0x8cff, 0x0040, 0x2129, 0x1078, - 0x1de4, 0x0c7f, 0x1078, 0x1de4, 0xa046, 0x7888, 0x8000, 0x788a, - 0xa086, 0x0002, 0x0040, 0x214f, 0x7a7c, 0x7b78, 0xdac4, 0x0040, - 0x213b, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004, 0x8004, 0xa210, - 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x721a, 0x731e, - 0xdac4, 0x0040, 0x2185, 0x7422, 0x7526, 0x0078, 0x2185, 0x6014, - 0xd0fc, 0x00c0, 0x2157, 0x2069, 0x4a40, 0x0078, 0x2159, 0x2069, - 0x4a80, 0x2091, 0x8000, 0x681f, 0x0002, 0x88ff, 0x0040, 0x2165, - 0xa046, 0x788c, 0x2060, 0x0078, 0x214f, 0x788b, 0x0000, 0x78ac, - 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0078, 0x2185, 0x0c7f, - 0x788b, 0x0000, 0x1078, 0x2319, 0x6004, 0xa084, 0x000f, 0x1078, - 0x2186, 0x88ff, 0x0040, 0x2183, 0x788c, 0x2060, 0x6004, 0xa084, - 0x000f, 0x1078, 0x2186, 0x0078, 0x209f, 0x007c, 0x0079, 0x2188, - 0x2198, 0x21b6, 0x21d4, 0x2198, 0x21e5, 0x21a9, 0x2198, 0x2198, - 0x2198, 0x21b4, 0x21d2, 0x2198, 0x2198, 0x2198, 0x2198, 0x2198, - 0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, 0xa705, 0x600a, - 0x1078, 0x2228, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078, 0x2303, - 0x007c, 0x78bc, 0xd0c4, 0x0040, 0x21af, 0x0078, 0x2198, 0x601c, - 0xc0bd, 0x601e, 0x0078, 0x21bc, 0x1078, 0x234b, 0x78bc, 0xd0c4, - 0x0040, 0x21bc, 0x0078, 0x2198, 0x78bf, 0x0000, 0x6004, 0x8007, - 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0040, 0x21cf, 0x1078, 0x2228, - 0x0040, 0x21cf, 0x78bc, 0xc0c5, 0x78be, 0x0078, 0x21d1, 0x0078, - 0x2247, 0x007c, 0x1078, 0x2347, 0x78bc, 0xa08c, 0x0e00, 0x00c0, - 0x21dc, 0xd0c4, 0x00c0, 0x21de, 0x0078, 0x2198, 0x1078, 0x2228, - 0x00c0, 0x21e4, 0x0078, 0x2247, 0x007c, 0x78bc, 0xd0c4, 0x0040, - 0x21eb, 0x0078, 0x2198, 0x78bf, 0x0000, 0x6714, 0x2011, 0x0001, - 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, 0x220b, 0xa7bc, - 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040, 0x220b, 0xa7bc, - 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e, 0x0002, 0x0040, - 0x220b, 0x0078, 0x2225, 0x1078, 0x1e02, 0x2d00, 0x2091, 0x8000, - 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, 0xffde, 0x680a, - 0xade8, 0x0010, 0x2091, 0x8001, 0x00f0, 0x220e, 0x8211, 0x0040, - 0x2225, 0x20a9, 0x0100, 0x0078, 0x220e, 0x1078, 0x1de4, 0x007c, - 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6, 0x00c0, 0x2233, - 0x78ba, 0x0078, 0x223b, 0x689e, 0x2d00, 0x6002, 0x78b8, 0xad06, - 0x00c0, 0x223b, 0x6002, 0x78b0, 0x8001, 0x78b2, 0x00c0, 0x2246, - 0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006, 0x007c, 0x0e7e, - 0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2, 0x601c, 0x60a2, - 0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060, 0x0040, 0x225a, - 0x1078, 0x43c1, 0x6596, 0x65a6, 0x669a, 0x66aa, 0x6714, 0x2071, - 0x4a80, 0xd7fc, 0x00c0, 0x2266, 0x2071, 0x4a40, 0xa784, 0x0f00, - 0x800b, 0xa784, 0x001f, 0x0040, 0x2271, 0x8003, 0x8003, 0x8003, - 0x8003, 0xa105, 0x71c4, 0xa168, 0x2700, 0x8007, 0xa084, 0x000f, - 0x8003, 0x8003, 0x8003, 0x71c8, 0xa100, 0x60c2, 0x2091, 0x8000, - 0x7810, 0xd0f4, 0x00c0, 0x228b, 0x6e08, 0xd684, 0x0040, 0x22a1, - 0xd9fc, 0x00c0, 0x22a1, 0x2091, 0x8001, 0x1078, 0x1e6f, 0x2091, - 0x8000, 0x1078, 0x201b, 0x2091, 0x8001, 0x7814, 0xd0e4, 0x00c0, - 0x2301, 0x7810, 0xd0f4, 0x0040, 0x2301, 0x601b, 0x0021, 0x0078, - 0x2301, 0x6024, 0xa096, 0x0001, 0x00c0, 0x22a8, 0x8000, 0x6026, - 0x6a10, 0x6814, 0xa202, 0x0048, 0x22bb, 0x0040, 0x22bb, 0x2091, + 0xa1a2, 0x4e00, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, 0x8424, + 0xa192, 0x9800, 0x2009, 0x0000, 0x2001, 0x0032, 0x1078, 0x207a, + 0x2218, 0x2079, 0x4e00, 0x2fa0, 0x2408, 0x2011, 0x0000, 0x20a9, + 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10bf, 0x2009, 0xff00, 0x3400, + 0xa102, 0x0048, 0x10cf, 0x0040, 0x10cf, 0x20a8, 0x42a4, 0x2001, + 0x04fc, 0x2004, 0xa086, 0x1080, 0x00c0, 0x10e5, 0x2071, 0x0100, + 0x0d7e, 0x2069, 0x4e40, 0x1078, 0x4cdd, 0x0d7f, 0x7810, 0xc0ed, + 0x7812, 0x781b, 0x0064, 0x0078, 0x110a, 0x2001, 0x04fc, 0x2004, + 0xa086, 0x1280, 0x00c0, 0x1105, 0x7814, 0xc0ed, 0xc0d5, 0x7816, + 0x781b, 0x0064, 0x2071, 0x0200, 0x0d7e, 0x2069, 0x4e40, 0x1078, + 0x4cdd, 0x2069, 0x4e80, 0x2071, 0x0100, 0x1078, 0x4cdd, 0x7814, + 0xc0d4, 0x7816, 0x0d7f, 0x0078, 0x110a, 0x7814, 0xc0e5, 0x7816, + 0x781b, 0x003c, 0x7eca, 0x7cc2, 0x7bc6, 0x7867, 0x0000, 0x7800, + 0xc08d, 0x7802, 0x2031, 0x0030, 0x78af, 0x0101, 0x7823, 0x0002, + 0x7827, 0x0002, 0x2009, 0x0002, 0x2069, 0x4e40, 0x681b, 0x0003, + 0x6823, 0x0007, 0x6827, 0x00fa, 0x682b, 0x0008, 0x682f, 0x0028, + 0x6837, 0x0000, 0x683b, 0x0006, 0x6833, 0x0008, 0x683f, 0x0000, + 0x8109, 0x0040, 0x115e, 0x68d3, 0x000a, 0x68c3, 0x4ec0, 0x2079, + 0x4e00, 0x7814, 0xd0e4, 0x00c0, 0x1144, 0xd0ec, 0x00c0, 0x1148, + 0x68d7, 0x7329, 0x0078, 0x114a, 0x68d7, 0x730d, 0x0078, 0x114a, + 0x68d7, 0x732d, 0x68c7, 0x53c0, 0x68cb, 0x52c0, 0x68cf, 0x93c0, + 0x68ab, 0x9644, 0x68af, 0x9649, 0x68b3, 0x9644, 0x68b7, 0x9644, + 0x68a7, 0x0001, 0x2069, 0x4e80, 0x0078, 0x111e, 0x68d3, 0x000a, + 0x68c3, 0x50c0, 0x7814, 0xd0e4, 0x00c0, 0x116a, 0x68d7, 0x7439, + 0x0078, 0x116c, 0x68d7, 0x7419, 0x68c7, 0x73c0, 0x68cb, 0x5340, + 0x68cf, 0x94d0, 0x68ab, 0x9649, 0x68af, 0x964e, 0x68b3, 0x9649, + 0x68b7, 0x9649, 0x68a7, 0x0001, 0x7810, 0xd0ec, 0x00c0, 0x11c2, + 0x7814, 0xd0e4, 0x00c0, 0x11b4, 0x0e7e, 0x2069, 0x52c0, 0x2071, + 0x0200, 0x70ec, 0xd0e4, 0x00c0, 0x1195, 0x2019, 0x0c0c, 0x2021, + 0x000c, 0x1078, 0x2009, 0x0078, 0x119b, 0x2019, 0x0c0a, 0x2021, + 0x000a, 0x1078, 0x2009, 0x2069, 0x5340, 0x2071, 0x0100, 0x70ec, + 0xd0e4, 0x00c0, 0x11ab, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078, + 0x2009, 0x0078, 0x11b1, 0x2019, 0x0c0a, 0x2021, 0x000a, 0x1078, + 0x2009, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0c, 0x2021, 0x000c, + 0x2069, 0x52c0, 0x1078, 0x2009, 0x2069, 0x5340, 0x1078, 0x2009, + 0x0078, 0x11db, 0x2069, 0x52c0, 0x0e7e, 0x2071, 0x0100, 0x70ec, + 0xd0e4, 0x00c0, 0x11d4, 0x2019, 0x0c0c, 0x2021, 0x000c, 0x1078, + 0x2009, 0x0e7f, 0x0078, 0x11db, 0x2019, 0x0c0a, 0x2021, 0x000a, + 0x1078, 0x2009, 0x0e7f, 0x2011, 0x0002, 0x2069, 0x53c0, 0x2009, + 0x0002, 0x20a9, 0x0100, 0x6837, 0x0000, 0x680b, 0x0040, 0x7bc8, + 0xa386, 0xfeff, 0x00c0, 0x11f2, 0x6817, 0x0100, 0x681f, 0x0064, + 0x0078, 0x11f6, 0x6817, 0x0064, 0x681f, 0x0002, 0xade8, 0x0010, + 0x00f0, 0x11e3, 0x8109, 0x00c0, 0x11e1, 0x8211, 0x0040, 0x1204, + 0x2069, 0x73c0, 0x0078, 0x11df, 0x1078, 0x265b, 0x1078, 0x468e, + 0x1078, 0x1dd4, 0x1078, 0x4c6f, 0x2091, 0x2100, 0x2079, 0x4e00, + 0x7810, 0xd0ec, 0x0040, 0x1218, 0x2071, 0x0020, 0x0078, 0x121a, + 0x2071, 0x0050, 0x2091, 0x2200, 0x2079, 0x4e00, 0x2071, 0x0020, + 0x2091, 0x2300, 0x2079, 0x4e00, 0x7810, 0xd0ec, 0x0040, 0x122c, + 0x2079, 0x0100, 0x0078, 0x122e, 0x2079, 0x0200, 0x2071, 0x4e40, + 0x2091, 0x2400, 0x2079, 0x0100, 0x2071, 0x4e80, 0x2091, 0x2000, + 0x2079, 0x4e00, 0x2071, 0x0010, 0x3200, 0xa085, 0x303d, 0x2090, + 0x2071, 0x0010, 0x70c3, 0x0000, 0x0090, 0x124d, 0x70c0, 0xa086, + 0x0002, 0x00c0, 0x124d, 0x1078, 0x15ba, 0x2039, 0x0000, 0x7810, + 0xd0ec, 0x00c0, 0x12cf, 0x1078, 0x148e, 0x78ac, 0xa005, 0x00c0, + 0x126b, 0x0068, 0x1261, 0x786c, 0xa065, 0x0040, 0x1261, 0x1078, + 0x2395, 0x1078, 0x20a1, 0x0068, 0x1278, 0x786c, 0xa065, 0x0040, + 0x126b, 0x1078, 0x2395, 0x0068, 0x1278, 0x2009, 0x4e47, 0x2011, + 0x4e87, 0x2104, 0x220c, 0xa105, 0x0040, 0x1278, 0x1078, 0x1f0a, + 0x2071, 0x4e40, 0x70a4, 0xa005, 0x0040, 0x129d, 0x7450, 0xa485, + 0x0000, 0x0040, 0x129d, 0x2079, 0x0200, 0x2091, 0x8000, 0x72d4, + 0xa28c, 0x303d, 0x2190, 0x1078, 0x2b6a, 0x2091, 0x8000, 0x2091, + 0x303d, 0x0068, 0x129d, 0x2079, 0x4e00, 0x786c, 0xa065, 0x0040, + 0x129d, 0x2071, 0x0010, 0x1078, 0x2395, 0x00e0, 0x12a5, 0x2079, + 0x4e00, 0x2071, 0x0010, 0x1078, 0x4a43, 0x2071, 0x4e80, 0x70a4, + 0xa005, 0x0040, 0x12bd, 0x7050, 0xa025, 0x0040, 0x12bd, 0x2079, + 0x0100, 0x2091, 0x8000, 0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078, + 0x2b6a, 0x2091, 0x8000, 0x2091, 0x303d, 0x2079, 0x4e00, 0x2071, + 0x0010, 0x0068, 0x12c9, 0x786c, 0xa065, 0x0040, 0x12c9, 0x1078, + 0x2395, 0x00e0, 0x1253, 0x1078, 0x4a43, 0x0078, 0x1253, 0x1078, + 0x148e, 0x78ac, 0xa005, 0x00c0, 0x12e7, 0x0068, 0x12dd, 0x786c, + 0xa065, 0x0040, 0x12dd, 0x1078, 0x2395, 0x1078, 0x20a1, 0x0068, + 0x12f1, 0x786c, 0xa065, 0x0040, 0x12e7, 0x1078, 0x2395, 0x0068, + 0x12f1, 0x2009, 0x4e47, 0x2104, 0xa005, 0x0040, 0x12f1, 0x1078, + 0x1f0a, 0x2071, 0x4e40, 0x70a4, 0xa005, 0x0040, 0x130c, 0x7450, + 0xa485, 0x0000, 0x0040, 0x130c, 0x2079, 0x0100, 0x2091, 0x8000, + 0x72d4, 0xa28c, 0x303d, 0x2190, 0x1078, 0x2b6a, 0x2091, 0x8000, + 0x2091, 0x303d, 0x2079, 0x4e00, 0x2071, 0x0010, 0x0068, 0x1316, + 0x786c, 0xa065, 0x0040, 0x1316, 0x1078, 0x2395, 0x00e0, 0x12cf, + 0x1078, 0x4a43, 0x0078, 0x12cf, 0x133c, 0x133c, 0x133e, 0x133e, + 0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363, + 0x134b, 0x134b, 0x134b, 0x134b, 0x133c, 0x133c, 0x133e, 0x133e, + 0x134b, 0x134b, 0x134b, 0x134b, 0x1356, 0x1356, 0x1363, 0x1363, + 0x134b, 0x134b, 0x134b, 0x134b, 0x0078, 0x133c, 0x007e, 0x107e, + 0x127e, 0x2091, 0x2400, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f, + 0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13c8, + 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, 0x107e, + 0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f, + 0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, + 0x1078, 0x298a, 0x2091, 0x2400, 0x1078, 0x298a, 0x127f, 0x107f, + 0x007f, 0x2091, 0x8001, 0x007c, 0x1394, 0x1394, 0x1396, 0x1396, + 0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13ae, 0x13ae, 0x1396, 0x1396, + 0x13a3, 0x13a3, 0x13a3, 0x13a3, 0x13af, 0x13af, 0x13af, 0x13af, + 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, 0x13af, + 0x13af, 0x13af, 0x13af, 0x13af, 0x0078, 0x1394, 0x007e, 0x107e, + 0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x127f, 0x107f, 0x007f, + 0x2091, 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x1078, 0x13d5, + 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007c, 0x107e, + 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x007e, 0x2071, 0x0100, 0x2069, + 0x4e40, 0x2079, 0x4e00, 0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078, + 0x4cdd, 0x007f, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, 0x107f, 0x007c, + 0x3c00, 0xa084, 0x0007, 0x0079, 0x13cd, 0x13de, 0x13de, 0x13e0, + 0x13e0, 0x13e5, 0x13e5, 0x13ea, 0x13ea, 0x3c00, 0xa084, 0x0003, + 0x0079, 0x13da, 0x13de, 0x13de, 0x13f3, 0x13f3, 0x1078, 0x296b, + 0x2091, 0x2200, 0x1078, 0x4768, 0x007c, 0x2091, 0x2100, 0x1078, + 0x4768, 0x007c, 0x2091, 0x2100, 0x1078, 0x4768, 0x2091, 0x2200, + 0x1078, 0x4768, 0x007c, 0x2091, 0x2100, 0x1078, 0x4768, 0x007c, + 0x1418, 0x1418, 0x141a, 0x141a, 0x1427, 0x1427, 0x1427, 0x1427, + 0x1432, 0x1432, 0x143f, 0x143f, 0x1427, 0x1427, 0x1427, 0x1427, + 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, + 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, 0x1450, + 0x0078, 0x1418, 0x007e, 0x107e, 0x127e, 0x2091, 0x2400, 0x1078, + 0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, + 0x107e, 0x127e, 0x1078, 0x13c8, 0x127f, 0x107f, 0x007f, 0x2091, + 0x8001, 0x007c, 0x007e, 0x107e, 0x127e, 0x2091, 0x2300, 0x1078, + 0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, 0x007e, + 0x107e, 0x127e, 0x2091, 0x2300, 0x1078, 0x298a, 0x2091, 0x2400, + 0x1078, 0x298a, 0x127f, 0x107f, 0x007f, 0x2091, 0x8001, 0x007c, + 0x007e, 0x107e, 0x127e, 0x0d7e, 0x0e7e, 0x0f7e, 0x2079, 0x4e00, + 0x2071, 0x0200, 0x2069, 0x4e40, 0x3d00, 0xd08c, 0x0040, 0x1466, + 0x70ec, 0xa084, 0x1c00, 0x78e2, 0x1078, 0x4cdd, 0x3d00, 0xd084, + 0x0040, 0x1474, 0x2069, 0x4e80, 0x2071, 0x0100, 0x70ec, 0xa084, + 0x1c00, 0x78e6, 0x1078, 0x4cdd, 0x0f7f, 0x0e7f, 0x0d7f, 0x127f, + 0x107f, 0x007f, 0x007c, 0x7008, 0x800b, 0x00c8, 0x1489, 0x7007, + 0x0002, 0xa08c, 0x01e0, 0x00c0, 0x148a, 0xd09c, 0x0040, 0x1489, + 0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x15bd, 0x0068, 0x1513, + 0x2061, 0x0000, 0x6018, 0xd084, 0x00c0, 0x1513, 0x7828, 0xa005, + 0x00c0, 0x149e, 0x0010, 0x1514, 0x0078, 0x1513, 0x7910, 0xd1f4, + 0x0040, 0x14a6, 0x2001, 0x4007, 0x0078, 0x15bc, 0x7914, 0xd1ec, + 0x0040, 0x14c1, 0xd0fc, 0x0040, 0x14b7, 0x007e, 0x1078, 0x1d64, + 0x007f, 0x0040, 0x14c1, 0x2001, 0x4007, 0x0078, 0x15bc, 0x007e, + 0x1078, 0x1d54, 0x007f, 0x0040, 0x14c1, 0x2001, 0x4007, 0x0078, + 0x15bc, 0x7910, 0xd0fc, 0x00c0, 0x14cb, 0x2061, 0x4e40, 0xc19c, + 0xc7fc, 0x0078, 0x14cf, 0x2061, 0x4e80, 0xc19d, 0xc7fd, 0x6064, + 0xa005, 0x00c0, 0x1513, 0x7912, 0x6083, 0x0000, 0x7828, 0xc0fc, + 0xa086, 0x0018, 0x00c0, 0x14e0, 0x0c7e, 0x1078, 0x1b5b, 0x0c7f, + 0x782b, 0x0000, 0x607c, 0xa065, 0x0040, 0x14f9, 0x0c7e, 0x609c, + 0x1078, 0x1e49, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x1c84, 0x2009, + 0x0018, 0x6087, 0x0103, 0x1078, 0x1d74, 0x00c0, 0x150d, 0x1078, + 0x1dc6, 0x7810, 0xd09c, 0x00c0, 0x1501, 0x2061, 0x4e40, 0x0078, + 0x1505, 0x2061, 0x4e80, 0xc09c, 0x7812, 0x607f, 0x0000, 0x60d4, + 0xd0dc, 0x0040, 0x1511, 0xc0dc, 0x60d6, 0x2001, 0x4005, 0x0078, + 0x15bc, 0x0078, 0x15ba, 0x007c, 0x7810, 0xd0f4, 0x0040, 0x151c, + 0x2001, 0x4007, 0x0078, 0x15bc, 0xa006, 0x70c2, 0x70c6, 0x70ca, + 0x70ce, 0x70da, 0x70c0, 0xa03d, 0xa08a, 0x0040, 0x00c8, 0x152a, + 0x0079, 0x1531, 0x2100, 0xa08a, 0x0040, 0x00c8, 0x15c8, 0x0079, + 0x1571, 0x15ba, 0x1610, 0x15d9, 0x1648, 0x1680, 0x1680, 0x15d0, + 0x1c9c, 0x168b, 0x15c8, 0x15dd, 0x15df, 0x15e1, 0x15e3, 0x1ca1, + 0x15c8, 0x1699, 0x16f6, 0x1b7b, 0x1c96, 0x15e5, 0x19c0, 0x1a02, + 0x1a3d, 0x1a8e, 0x197b, 0x1988, 0x199c, 0x19af, 0x17cb, 0x15c8, + 0x172d, 0x173a, 0x1746, 0x1752, 0x1768, 0x1774, 0x1777, 0x1783, + 0x178f, 0x1797, 0x17b3, 0x17bf, 0x15c8, 0x15c8, 0x15c8, 0x15c8, + 0x17d8, 0x17ea, 0x1806, 0x183c, 0x1864, 0x1874, 0x1877, 0x18a8, + 0x18d9, 0x18eb, 0x194a, 0x195a, 0x15c8, 0x15c8, 0x15c8, 0x15c8, + 0x196a, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x1cc6, 0x1ccc, + 0x15c8, 0x15c8, 0x15c8, 0x1cd0, 0x1d15, 0x15c8, 0x15c8, 0x15c8, + 0x15c8, 0x160a, 0x167a, 0x1693, 0x16f0, 0x1b75, 0x15c8, 0x15c8, + 0x1b3e, 0x15c8, 0x1d19, 0x1cb8, 0x1cc2, 0x15c8, 0x15c8, 0x15c8, + 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, + 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, + 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, + 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, 0x15c8, + 0x15c8, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x15bc, 0x73ce, + 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x0068, 0x15bd, 0x2061, + 0x0000, 0x601b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c, + 0x70c3, 0x4001, 0x0078, 0x15bd, 0x70c3, 0x4006, 0x0078, 0x15bd, + 0x2099, 0x0041, 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078, + 0x15ba, 0x70c4, 0x70c3, 0x0004, 0x007a, 0x0078, 0x15ba, 0x0078, + 0x15ba, 0x0078, 0x15ba, 0x0078, 0x15ba, 0x2091, 0x8000, 0x70c3, + 0x0004, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, + 0x0008, 0x2001, 0x000f, 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, + 0x2031, 0x0030, 0x2059, 0x1000, 0x2029, 0x041a, 0x2051, 0x0445, + 0x2061, 0x0447, 0x20c1, 0x0020, 0x2091, 0x5000, 0x2091, 0x4080, + 0x0078, 0x0418, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x1613, + 0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x20a0, + 0x2099, 0x0030, 0x7003, 0x0001, 0x7007, 0x0006, 0x731a, 0x721e, + 0x7422, 0x7526, 0x2021, 0x0040, 0x81ff, 0x0040, 0x15ba, 0xa182, + 0x0040, 0x00c8, 0x162d, 0x2120, 0xa006, 0x2008, 0x8403, 0x7012, + 0x7007, 0x0004, 0x7007, 0x0001, 0x7008, 0xd0fc, 0x0040, 0x1634, + 0x7007, 0x0002, 0xa084, 0x01e0, 0x0040, 0x1642, 0x70c3, 0x4002, + 0x0078, 0x15bd, 0x24a8, 0x53a5, 0x0078, 0x1624, 0x0078, 0x15ba, + 0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, 0x73cc, 0x70c4, 0x2098, + 0x20a1, 0x0030, 0x7003, 0x0000, 0x7007, 0x0006, 0x731a, 0x721e, + 0x7422, 0x7526, 0x2021, 0x0040, 0x7007, 0x0006, 0x81ff, 0x0040, + 0x15ba, 0xa182, 0x0040, 0x00c8, 0x1667, 0x2120, 0xa006, 0x2008, + 0x8403, 0x7012, 0x24a8, 0x53a6, 0x7007, 0x0001, 0x7008, 0xd0fc, + 0x0040, 0x166e, 0xa084, 0x01e0, 0x0040, 0x165c, 0x70c3, 0x4002, + 0x0078, 0x15bd, 0x75d8, 0x74dc, 0x75da, 0x74de, 0x0078, 0x164b, + 0x71c4, 0x70c8, 0x2114, 0xa79e, 0x0004, 0x00c0, 0x1688, 0x200a, + 0x72ca, 0x0078, 0x15b9, 0x70c7, 0x0008, 0x70cb, 0x000f, 0x70cf, + 0x0000, 0x0078, 0x15ba, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, + 0x169c, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, + 0x70c6, 0x72ca, 0x73ce, 0x74d2, 0xa005, 0x0040, 0x16eb, 0xa40a, + 0x0040, 0x16ac, 0x00c8, 0x16b5, 0x8001, 0x7872, 0xa084, 0xfc00, + 0x0040, 0x16b9, 0x78ac, 0xc085, 0x78ae, 0x2001, 0x4005, 0x0078, + 0x15bc, 0x7b7e, 0x7a7a, 0x7e86, 0x7d82, 0x7c76, 0xa48c, 0xff00, + 0x0040, 0x16d1, 0x8407, 0x8004, 0x8004, 0x810c, 0x810c, 0x810f, + 0xa118, 0xa291, 0x0000, 0xa6b1, 0x0000, 0xa581, 0x0000, 0x0078, + 0x16db, 0x8407, 0x8004, 0x8004, 0xa318, 0xa291, 0x0000, 0xa6b1, + 0x0000, 0xa581, 0x0000, 0x731a, 0x721e, 0x7622, 0x7026, 0xa605, + 0x0040, 0x16e5, 0x7a10, 0xc2c5, 0x7a12, 0x78ac, 0xa084, 0xfffc, + 0x78ae, 0x0078, 0x16ee, 0x78ac, 0xc085, 0x78ae, 0x0078, 0x15ba, + 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x16f9, 0x2029, 0x0000, + 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d4, 0x70c6, 0x72ca, 0x73ce, + 0x74d6, 0xa005, 0x0040, 0x1728, 0xa40a, 0x0040, 0x1709, 0x00c8, + 0x15bc, 0x8001, 0x7892, 0xa084, 0xfc00, 0x0040, 0x1716, 0x78ac, + 0xc0c5, 0x78ae, 0x2001, 0x4005, 0x0078, 0x15bc, 0x7a9a, 0x7b9e, + 0x7da2, 0x7ea6, 0x2600, 0xa505, 0x0040, 0x1721, 0x7a10, 0xc2c5, + 0x7a12, 0x7c96, 0x78ac, 0xa084, 0xfcff, 0x78ae, 0x0078, 0x172b, + 0x78ac, 0xc0c5, 0x78ae, 0x0078, 0x15ba, 0x2009, 0x0000, 0x786c, + 0xa065, 0x0040, 0x1737, 0x8108, 0x6000, 0x0078, 0x1730, 0x7ac4, + 0x0078, 0x15b8, 0x2009, 0x4e48, 0x210c, 0x7810, 0xd0ec, 0x00c0, + 0x15b9, 0x2011, 0x4e88, 0x2214, 0x0078, 0x15b8, 0x2009, 0x4e49, + 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, 0x4e89, 0x2214, + 0x0078, 0x15b8, 0x2061, 0x4e40, 0x6128, 0x622c, 0x8214, 0x8214, + 0x8214, 0x7810, 0xd0ec, 0x00c0, 0x1766, 0x2061, 0x4e80, 0x6328, + 0x73da, 0x632c, 0x831c, 0x831c, 0x831c, 0x73de, 0x0078, 0x15b8, + 0x2009, 0x4e4c, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, + 0x4e8c, 0x2214, 0x0078, 0x15b8, 0x7918, 0x0078, 0x15b9, 0x2009, + 0x4e4d, 0x210c, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2011, 0x4e8d, + 0x2214, 0x0078, 0x15b8, 0x2009, 0x4e4e, 0x210c, 0x7810, 0xd0ec, + 0x00c0, 0x15b9, 0x2011, 0x4e8e, 0x2214, 0x0078, 0x15b8, 0x7920, + 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x7a24, 0x0078, 0x15b8, 0x71c4, + 0xd1fc, 0x00c0, 0x179f, 0x2011, 0x52c0, 0x0078, 0x17a1, 0x2011, + 0x5340, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa268, + 0x6a00, 0x6804, 0xd09c, 0x0040, 0x17b0, 0x6b08, 0x0078, 0x17b1, + 0x6b0c, 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, + 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b7, 0x2061, + 0x4e40, 0x6118, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2061, 0x4e80, + 0x6218, 0x0078, 0x15b8, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, + 0x6908, 0x6a18, 0x6b10, 0x77da, 0x2091, 0x8001, 0x0078, 0x15b7, + 0x71c4, 0x2110, 0xa294, 0x000f, 0xa282, 0x0010, 0x00c8, 0x15b2, + 0x1078, 0x277f, 0xa384, 0x4000, 0x0040, 0x17e8, 0xa295, 0x0020, + 0x0078, 0x15b7, 0x71c4, 0x2100, 0xc0bc, 0xa082, 0x0010, 0x00c8, + 0x15b2, 0xd1bc, 0x00c0, 0x17f9, 0x2011, 0x4e48, 0x2204, 0x0078, + 0x17fd, 0x2011, 0x4e88, 0x2204, 0xc0bd, 0x007e, 0x2100, 0xc0bc, + 0x2012, 0x1078, 0x26dc, 0x017f, 0x0078, 0x15b9, 0x71c4, 0x2021, + 0x4e49, 0x2404, 0x70c6, 0x2019, 0x0000, 0x0078, 0x1815, 0x71c8, + 0x2021, 0x4e89, 0x2404, 0x70ca, 0xc3fd, 0x2011, 0x1834, 0x20a9, + 0x0008, 0x2204, 0xa106, 0x0040, 0x1824, 0x8210, 0x00f0, 0x1819, + 0x71c4, 0x72c8, 0x0078, 0x15b1, 0xa292, 0x1834, 0x027e, 0x2122, + 0x017f, 0x1078, 0x26fd, 0x7810, 0xd0ec, 0x00c0, 0x1832, 0xd3fc, + 0x0040, 0x180f, 0x0078, 0x15ba, 0x03e8, 0x00fa, 0x01f4, 0x02ee, + 0x0004, 0x0001, 0x0002, 0x0003, 0x2061, 0x4e40, 0x6128, 0x622c, + 0x8214, 0x8214, 0x8214, 0x70c4, 0x602a, 0x70c8, 0x8003, 0x8003, + 0x8003, 0x602e, 0x7810, 0xd0ec, 0x00c0, 0x1862, 0x027e, 0x017e, + 0x2061, 0x4e80, 0x6128, 0x622c, 0x8214, 0x8214, 0x8214, 0x70d8, + 0x602a, 0x70dc, 0x8003, 0x8003, 0x8003, 0x602e, 0x71da, 0x72de, + 0x017f, 0x027f, 0x0078, 0x15b8, 0x2061, 0x4e40, 0x6130, 0x70c4, + 0x6032, 0x7810, 0xd0ec, 0x00c0, 0x15b9, 0x2061, 0x4e80, 0x6230, + 0x70c8, 0x6032, 0x0078, 0x15b8, 0x7918, 0x0078, 0x15b9, 0x71c4, + 0xa184, 0xffcf, 0x0040, 0x1883, 0x7810, 0xd0ec, 0x00c0, 0x15b2, + 0x72c8, 0x0078, 0x15b1, 0x2011, 0x4e4d, 0x2204, 0x2112, 0x007e, + 0x2019, 0x0000, 0x1078, 0x2764, 0x7810, 0xd0ec, 0x0040, 0x1893, + 0x017f, 0x0078, 0x15b9, 0x71c8, 0xa184, 0xffcf, 0x0040, 0x189c, + 0x2110, 0x71c4, 0x0078, 0x15b1, 0x2011, 0x4e8d, 0x2204, 0x2112, + 0x007e, 0xc3fd, 0x1078, 0x2764, 0x027f, 0x017f, 0x0078, 0x15b8, + 0x71c4, 0xa182, 0x0010, 0x0048, 0x18b4, 0x7810, 0xd0ec, 0x00c0, + 0x15b2, 0x72c8, 0x0078, 0x15b1, 0x2011, 0x4e4e, 0x2204, 0x007e, + 0x2112, 0x2019, 0x0000, 0x1078, 0x2742, 0x7810, 0xd0ec, 0x0040, + 0x18c4, 0x017f, 0x0078, 0x15b9, 0x71c8, 0xa182, 0x0010, 0x0048, + 0x18cd, 0x2110, 0x71c4, 0x0078, 0x15b1, 0x2011, 0x4e8e, 0x2204, + 0x007e, 0x2112, 0xc3fd, 0x1078, 0x2742, 0x027f, 0x017f, 0x0078, + 0x15b8, 0x71c4, 0x72c8, 0xa184, 0xfffd, 0x00c0, 0x15b1, 0xa284, + 0xfffd, 0x00c0, 0x15b1, 0x2100, 0x7920, 0x7822, 0x2200, 0x7a24, + 0x7826, 0x0078, 0x15b8, 0x71c4, 0xd1fc, 0x00c0, 0x18f3, 0x2011, + 0x52c0, 0x0078, 0x18f5, 0x2011, 0x5340, 0x8107, 0xa084, 0x000f, + 0x8003, 0x8003, 0x8003, 0xa268, 0x2019, 0x0000, 0x72c8, 0x2091, + 0x8000, 0x6800, 0x007e, 0xa226, 0x0040, 0x191e, 0x6a02, 0xd4ec, + 0x0040, 0x190b, 0xc3a5, 0xd4e4, 0x0040, 0x190f, 0xc39d, 0xd4f4, + 0x0040, 0x191e, 0x810f, 0xd2f4, 0x0040, 0x191a, 0x1078, 0x27c1, + 0x0078, 0x191e, 0x1078, 0x279f, 0x0078, 0x191e, 0x72cc, 0x6808, + 0xa206, 0x0040, 0x1940, 0xa2a4, 0x00ff, 0x7814, 0xd0e4, 0x00c0, + 0x1931, 0xa482, 0x0028, 0x0048, 0x193d, 0x0040, 0x193d, 0x0078, + 0x1935, 0xa482, 0x0043, 0x0048, 0x193d, 0x71c4, 0x71c6, 0x027f, + 0x72ca, 0x2091, 0x8001, 0x0078, 0x15b3, 0x6a0a, 0xa39d, 0x000a, + 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x71c4, 0x2091, 0x8001, + 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, 0x6a14, + 0x6b1c, 0x2091, 0x8001, 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, + 0x0078, 0x15b7, 0x70c4, 0x2061, 0x4e40, 0x6118, 0x601a, 0x7810, + 0xd0ec, 0x00c0, 0x15b9, 0x70c8, 0x2061, 0x4e80, 0x6218, 0x601a, + 0x0078, 0x15b8, 0x71c4, 0x72c8, 0x73cc, 0xa182, 0x0010, 0x00c8, + 0x15b2, 0x1078, 0x27e3, 0xa384, 0x4000, 0x0040, 0x1979, 0xa295, + 0x0020, 0x0078, 0x15b7, 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, + 0x6a08, 0xc28d, 0x6a0a, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b8, + 0x77c4, 0x1078, 0x1de4, 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, + 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1997, 0x1078, 0x2628, 0x2091, + 0x8001, 0x2708, 0x0078, 0x15b8, 0x77c4, 0x1078, 0x1de4, 0x2091, + 0x8000, 0x6a08, 0xc295, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x19aa, + 0x1078, 0x2628, 0x2091, 0x8001, 0x2708, 0x0078, 0x15b8, 0x77c4, + 0x2041, 0x0001, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, + 0x1078, 0x1dff, 0x2091, 0x8001, 0x2708, 0x6a08, 0x0078, 0x15b8, + 0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x19d4, 0xd7fc, 0x0040, 0x19ce, + 0x1078, 0x1d64, 0x0040, 0x19d4, 0x0078, 0x15bc, 0x1078, 0x1d54, + 0x0040, 0x19d4, 0x0078, 0x15bc, 0x73c8, 0x72cc, 0x77c6, 0x73ca, + 0x72ce, 0x1078, 0x1e86, 0x00c0, 0x19fe, 0x6818, 0xa005, 0x0040, + 0x19f8, 0x2708, 0x077e, 0x1078, 0x2813, 0x077f, 0x00c0, 0x19f8, + 0x2001, 0x0015, 0xd7fc, 0x00c0, 0x19f1, 0x2061, 0x4e40, 0x0078, + 0x19f4, 0xc0fd, 0x2061, 0x4e80, 0x782a, 0x2091, 0x8001, 0x007c, + 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x15bc, 0x2091, 0x8001, + 0x0078, 0x15ba, 0x77c4, 0x7814, 0xd0e4, 0x00c0, 0x1a16, 0xd7fc, + 0x0040, 0x1a10, 0x1078, 0x1d64, 0x0040, 0x1a16, 0x0078, 0x15bc, + 0x1078, 0x1d54, 0x0040, 0x1a16, 0x0078, 0x15bc, 0x77c6, 0x2041, + 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x2091, 0x8000, 0x1078, + 0x1dff, 0x2009, 0x0016, 0xd7fc, 0x00c0, 0x1a2a, 0x2061, 0x4e40, + 0x0078, 0x1a2d, 0x2061, 0x4e80, 0xc1fd, 0x6067, 0x0003, 0x607f, + 0x0000, 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc, 0x61d6, + 0x1078, 0x2628, 0x2091, 0x8001, 0x007c, 0x77c8, 0x77ca, 0x77c4, + 0x77c6, 0x7814, 0xd0e4, 0x00c0, 0x1a54, 0xd7fc, 0x0040, 0x1a4e, + 0x1078, 0x1d64, 0x0040, 0x1a54, 0x0078, 0x15bc, 0x1078, 0x1d54, + 0x0040, 0x1a54, 0x0078, 0x15bc, 0xa7bc, 0xff00, 0x2091, 0x8000, + 0x2009, 0x0017, 0xd7fc, 0x00c0, 0x1a61, 0x2061, 0x4e40, 0x0078, + 0x1a64, 0x2061, 0x4e80, 0xc1fd, 0x607f, 0x0000, 0x6067, 0x0002, + 0x6776, 0x6083, 0x000f, 0x792a, 0x61d4, 0xc1dc, 0x61d6, 0x1078, + 0x2628, 0x2091, 0x8001, 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, + 0x0010, 0x2091, 0x8000, 0x70c8, 0xa005, 0x0040, 0x1a82, 0x60d4, + 0xc0fd, 0x60d6, 0x1078, 0x1dff, 0x70c8, 0x6836, 0x8738, 0xa784, + 0x001f, 0x00c0, 0x1a82, 0x2091, 0x8001, 0x007c, 0x2019, 0x0000, + 0x7814, 0xd0e4, 0x00c0, 0x1aa4, 0x72c8, 0xd284, 0x0040, 0x1a9e, + 0x1078, 0x1d64, 0x0040, 0x1aa4, 0x0078, 0x15bc, 0x1078, 0x1d54, + 0x0040, 0x1aa4, 0x0078, 0x15bc, 0x72c8, 0x72ca, 0x78ac, 0xa084, + 0x0003, 0x00c0, 0x1acf, 0x2039, 0x0000, 0xd284, 0x0040, 0x1ab1, + 0xc7fd, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, + 0x1de4, 0x2091, 0x8000, 0x6808, 0xc0d4, 0xa80d, 0x690a, 0x2091, + 0x8001, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1ab7, 0xa7bc, 0xff00, + 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1ab7, 0x2091, + 0x8000, 0x72c8, 0xd284, 0x00c0, 0x1ae1, 0x7810, 0xd0ec, 0x0040, + 0x1add, 0x2069, 0x0100, 0x0078, 0x1ae3, 0x2069, 0x0200, 0x0078, + 0x1ae3, 0x2069, 0x0100, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, + 0xd0b4, 0x0040, 0x1b03, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, + 0xd094, 0x0040, 0x1af5, 0x00f0, 0x1aef, 0x684b, 0x0009, 0x20a9, + 0x0014, 0x6848, 0xd084, 0x0040, 0x1aff, 0x00f0, 0x1af9, 0x20a9, + 0x00fa, 0x00f0, 0x1b01, 0x2079, 0x4e00, 0x2009, 0x0018, 0x72c8, + 0xd284, 0x00c0, 0x1b0f, 0x2061, 0x4e40, 0x0078, 0x1b12, 0x2061, + 0x4e80, 0xc1fd, 0x607f, 0x0000, 0x792a, 0x6067, 0x0001, 0x6083, + 0x000f, 0x60a7, 0x0000, 0x60a8, 0x60b2, 0x60b6, 0x60d4, 0xd0b4, + 0x0040, 0x1b2e, 0xc0b4, 0x60d6, 0x0c7e, 0x60b8, 0xa065, 0x6008, + 0xc0d4, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x60d4, 0xa084, + 0x77ff, 0x60d6, 0x78ac, 0xc08d, 0x78ae, 0x83ff, 0x0040, 0x1b39, + 0x007c, 0x681b, 0x0047, 0x2091, 0x8001, 0x007c, 0x73cc, 0x1078, + 0x1a90, 0x69ec, 0x6a48, 0xa185, 0x1800, 0x684a, 0xa185, 0x0040, + 0x68ee, 0x73cc, 0x2021, 0x0004, 0x20a9, 0x09ff, 0x00f0, 0x1b4e, + 0x8421, 0x00c0, 0x1b4c, 0x8319, 0x00c0, 0x1b4a, 0x69ee, 0x6a4a, + 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x1b62, 0x2069, 0x4e40, + 0x0078, 0x1b64, 0x2069, 0x4e80, 0x71c4, 0x71c6, 0x6916, 0x81ff, + 0x00c0, 0x1b6c, 0x68a7, 0x0001, 0x78ac, 0xc08c, 0x78ae, 0xd084, + 0x00c0, 0x1b74, 0x1078, 0x1ee6, 0x007c, 0x75d8, 0x74dc, 0x75da, + 0x74de, 0x0078, 0x1b7e, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, + 0x72cc, 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x4e00, 0x7dde, 0x7cda, + 0x7bd6, 0x7ad2, 0x1078, 0x1dbd, 0x0040, 0x1c80, 0x20a9, 0x0005, + 0x20a1, 0x4e14, 0x2091, 0x8000, 0x41a1, 0x2091, 0x8001, 0x2009, + 0x0040, 0x1078, 0x1fd1, 0x0040, 0x1ba1, 0x1078, 0x1dc6, 0x0078, + 0x1c80, 0x6004, 0xa08c, 0x00ff, 0xa18e, 0x0009, 0x00c0, 0x1bac, + 0x007e, 0x1078, 0x2378, 0x007f, 0xa084, 0xff00, 0x8007, 0x8009, + 0x0040, 0x1c20, 0x0c7e, 0x2c68, 0x1078, 0x1dbd, 0x0040, 0x1bf2, + 0x2c00, 0x689e, 0x8109, 0x00c0, 0x1bb3, 0x609f, 0x0000, 0x0c7f, + 0x0c7e, 0x7ddc, 0x7cd8, 0x7bd4, 0x7ad0, 0xa290, 0x0040, 0xa399, + 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x7dde, 0x7cda, 0x7bd6, + 0x7ad2, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1c1f, 0x2009, 0x0040, + 0x1078, 0x1fd1, 0x00c0, 0x1c09, 0x6004, 0xa084, 0x00ff, 0xa086, + 0x0002, 0x00c0, 0x1bf2, 0x6004, 0xa084, 0x00ff, 0xa086, 0x000a, + 0x00c0, 0x1bee, 0x017e, 0x1078, 0x2374, 0x017f, 0x2d00, 0x6002, + 0x0078, 0x1bc1, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e49, 0x0c7f, + 0x609f, 0x0000, 0x1078, 0x1c84, 0x2009, 0x0018, 0x6008, 0xc0cd, + 0x600a, 0x6004, 0x6086, 0x1078, 0x1d74, 0x1078, 0x1dc6, 0x0078, + 0x1c80, 0x0c7f, 0x0c7e, 0x609c, 0x1078, 0x1e49, 0x0c7f, 0x609f, + 0x0000, 0x1078, 0x1c84, 0x2009, 0x0018, 0x6087, 0x0103, 0x601b, + 0x0003, 0x1078, 0x1d74, 0x1078, 0x1dc6, 0x0078, 0x1c80, 0x0c7f, + 0x7814, 0xd0e4, 0x00c0, 0x1c45, 0x6114, 0xd1fc, 0x0040, 0x1c2e, + 0x1078, 0x1d64, 0x0040, 0x1c45, 0x0078, 0x1c32, 0x1078, 0x1d54, + 0x0040, 0x1c45, 0x2029, 0x0000, 0x2520, 0x2009, 0x0018, 0x73c8, + 0x72cc, 0x6087, 0x0103, 0x601b, 0x0021, 0x1078, 0x1d74, 0x1078, + 0x1dc6, 0x2001, 0x4007, 0x0078, 0x15bc, 0x74c4, 0x73c8, 0x72cc, + 0x6014, 0x2091, 0x8000, 0x0e7e, 0x2009, 0x0012, 0xd0fc, 0x00c0, + 0x1c55, 0x2071, 0x4e40, 0x0078, 0x1c58, 0x2071, 0x4e80, 0xc1fd, + 0x792a, 0x7067, 0x0005, 0x71d4, 0xc1dc, 0x71d6, 0x736a, 0x726e, + 0x7472, 0x7076, 0x707b, 0x0000, 0x2c00, 0x707e, 0xa02e, 0x2530, + 0x611c, 0xa184, 0x0060, 0x0040, 0x1c6f, 0x1078, 0x4632, 0x0e7f, + 0x6596, 0x65a6, 0x669a, 0x66aa, 0x60af, 0x0000, 0x60b3, 0x0000, + 0x6714, 0x6023, 0x0000, 0x1078, 0x2628, 0x2091, 0x8001, 0x007c, + 0x70c3, 0x4005, 0x0078, 0x15bd, 0x20a9, 0x0005, 0x2099, 0x4e14, + 0x2091, 0x8000, 0x530a, 0x2091, 0x8001, 0x2100, 0xa210, 0xa399, + 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, 0x70c7, + 0x0000, 0x791e, 0x0078, 0x15ba, 0x71c4, 0x71c6, 0x2168, 0x0078, + 0x1ca3, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, 0x8d68, + 0x8109, 0x00c0, 0x1ca5, 0xa285, 0x0000, 0x00c0, 0x1cb3, 0x70c3, + 0x4000, 0x0078, 0x1cb5, 0x70c3, 0x4003, 0x70ca, 0x0078, 0x15bd, + 0x7964, 0x71c6, 0x71c4, 0xa182, 0x0003, 0x00c8, 0x15b2, 0x7966, + 0x0078, 0x15ba, 0x7964, 0x71c6, 0x0078, 0x15ba, 0x7900, 0x71c6, + 0x71c4, 0x7902, 0x0078, 0x15ba, 0x7900, 0x71c6, 0x0078, 0x15ba, + 0x70c4, 0x2011, 0x0000, 0xa08c, 0x000d, 0x0040, 0x1ce5, 0x810c, + 0x0048, 0x1ce1, 0x8210, 0x810c, 0x810c, 0x0048, 0x1ce1, 0x8210, + 0x810c, 0x81ff, 0x00c0, 0x15b3, 0x8210, 0x7a0e, 0xd28c, 0x0040, + 0x1d11, 0x7910, 0xc1cd, 0x7912, 0x2009, 0x0021, 0x2019, 0x0003, + 0xd284, 0x0040, 0x1d0b, 0x8108, 0x2019, 0x0041, 0x2011, 0x964e, + 0x2312, 0x2019, 0x0042, 0x8210, 0x2312, 0x2019, 0x0043, 0x8210, + 0x2312, 0x2019, 0x0046, 0x8210, 0x2312, 0x2019, 0x0047, 0x8210, + 0x2312, 0x2019, 0x0006, 0x2011, 0x9653, 0x2112, 0x2011, 0x9673, + 0x2312, 0x7904, 0x7806, 0x0078, 0x15b9, 0x7804, 0x70c6, 0x0078, + 0x15ba, 0x71c4, 0xd1fc, 0x00c0, 0x1d21, 0x2011, 0x52c0, 0x0078, + 0x1d23, 0x2011, 0x5340, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, + 0x8003, 0xa268, 0x6a14, 0xd2b4, 0x0040, 0x1d32, 0x2011, 0x0001, + 0x0078, 0x1d34, 0x2011, 0x0000, 0x6b0c, 0x6800, 0x70da, 0x0078, + 0x15b7, 0x017e, 0x7814, 0xd0f4, 0x0040, 0x1d46, 0x2001, 0x4007, + 0x70db, 0x0000, 0xa18d, 0x0001, 0x0078, 0x1d52, 0xd0fc, 0x0040, + 0x1d51, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078, + 0x1d52, 0xa006, 0x017f, 0x007c, 0x017e, 0x7814, 0xd0f4, 0x0040, + 0x1d61, 0x2001, 0x4007, 0x70db, 0x0000, 0xa18d, 0x0001, 0x0078, + 0x1d62, 0xa006, 0x017f, 0x007c, 0x017e, 0x7814, 0xd0fc, 0x0040, + 0x1d71, 0x2001, 0x4007, 0x70db, 0x0001, 0xa18d, 0x0001, 0x0078, + 0x1d72, 0xa006, 0x017f, 0x007c, 0x7112, 0x721a, 0x731e, 0x7810, + 0xd0c4, 0x0040, 0x1d7d, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, + 0x810c, 0x81a9, 0x8098, 0x20a1, 0x0030, 0x7003, 0x0000, 0x6084, + 0x20a2, 0x53a6, 0x7007, 0x0001, 0x7974, 0xa184, 0xff00, 0x0040, + 0x1d9a, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, + 0x0078, 0x1d9d, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, + 0xa006, 0xa211, 0x7d10, 0xd5c4, 0x0040, 0x1daa, 0x7b84, 0xa319, + 0x7c80, 0xa421, 0x7008, 0xd0fc, 0x0040, 0x1daa, 0x7003, 0x0001, + 0x7007, 0x0006, 0x711a, 0x721e, 0x7d10, 0xd5c4, 0x0040, 0x1dba, + 0x7322, 0x7426, 0xa084, 0x01e0, 0x007c, 0x7848, 0xa065, 0x0040, + 0x1dc5, 0x2c04, 0x784a, 0x2063, 0x0000, 0x007c, 0x0f7e, 0x2079, + 0x4e00, 0x7848, 0x2062, 0x2c00, 0xa005, 0x00c0, 0x1dd1, 0x1078, + 0x296b, 0x784a, 0x0f7f, 0x007c, 0x2011, 0x9800, 0x7a4a, 0x7bc4, + 0x8319, 0x0040, 0x1de1, 0xa280, 0x0032, 0x2012, 0x2010, 0x0078, + 0x1dd8, 0x2013, 0x0000, 0x007c, 0x017e, 0x027e, 0xd7fc, 0x00c0, + 0x1ded, 0x2011, 0x53c0, 0x0078, 0x1def, 0x2011, 0x73c0, 0xa784, + 0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x1dfa, 0x8003, 0x8003, + 0x8003, 0x8003, 0xa105, 0xa268, 0x027f, 0x017f, 0x007c, 0x1078, + 0x1de4, 0x2900, 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xf9ef, + 0xa80d, 0x690a, 0x0e7e, 0xd7fc, 0x00c0, 0x1e14, 0x2009, 0x4e53, + 0x2071, 0x4e40, 0x0078, 0x1e18, 0x2009, 0x4e93, 0x2071, 0x4e80, + 0x210c, 0x6804, 0xa005, 0x0040, 0x1e28, 0xa116, 0x00c0, 0x1e28, + 0x2060, 0x6000, 0x6806, 0x017e, 0x200b, 0x0000, 0x0078, 0x1e2b, + 0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040, 0x1e40, 0x6000, + 0x6806, 0x1078, 0x1e5b, 0x1078, 0x201d, 0x6810, 0x7908, 0x8109, + 0x790a, 0x8001, 0x6812, 0x00c0, 0x1e2b, 0x7910, 0xc1a5, 0x7912, + 0x017f, 0x6902, 0x6906, 0x2d00, 0x2060, 0x1078, 0x2acc, 0x0e7f, + 0x007c, 0xa065, 0x0040, 0x1e5a, 0x2008, 0x609c, 0xa005, 0x0040, + 0x1e57, 0x2062, 0x609f, 0x0000, 0xa065, 0x0078, 0x1e4d, 0x7848, + 0x794a, 0x2062, 0x007c, 0x6007, 0x0103, 0x608f, 0x0000, 0x20a9, + 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x6828, + 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0xd7fc, 0x00c0, 0x1e76, + 0x2071, 0x4e40, 0x2031, 0x4ec0, 0x0078, 0x1e7a, 0x2071, 0x4e80, + 0x2031, 0x50c0, 0x7050, 0xa08c, 0x0200, 0x00c0, 0x1e84, 0xa608, + 0x2d0a, 0x8000, 0x7052, 0xa006, 0x0e7f, 0x007c, 0x0f7e, 0xd7fc, + 0x00c0, 0x1e8e, 0x2079, 0x4e40, 0x0078, 0x1e90, 0x2079, 0x4e80, + 0x1078, 0x1de4, 0x2091, 0x8000, 0x6804, 0x780a, 0xa065, 0x0040, + 0x1ee4, 0x0078, 0x1ea2, 0x2c00, 0x780a, 0x2060, 0x6000, 0xa065, + 0x0040, 0x1ee4, 0x6010, 0xa306, 0x00c0, 0x1e9b, 0x600c, 0xa206, + 0x00c0, 0x1e9b, 0x2c28, 0x784c, 0xac06, 0x00c0, 0x1eb1, 0x0078, + 0x1ee1, 0x6804, 0xac06, 0x00c0, 0x1ebf, 0x6000, 0x2060, 0x6806, + 0xa005, 0x00c0, 0x1ebf, 0x6803, 0x0000, 0x0078, 0x1ec9, 0x6400, + 0x7808, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x1ec9, 0x2c00, + 0x6802, 0x2560, 0x0f7f, 0x1078, 0x1e5b, 0x0f7e, 0x601b, 0x0005, + 0x6023, 0x0020, 0x0f7f, 0x1078, 0x201d, 0x0f7e, 0x7908, 0x8109, + 0x790a, 0x6810, 0x8001, 0x6812, 0x00c0, 0x1ee1, 0x7810, 0xc0a5, + 0x7812, 0x2001, 0xffff, 0xa005, 0x0f7f, 0x007c, 0x077e, 0x2700, + 0x2039, 0x0000, 0xd0fc, 0x0040, 0x1eee, 0xc7fd, 0x2041, 0x0021, + 0x2049, 0x0004, 0x2051, 0x0008, 0x2091, 0x8000, 0x1078, 0x1dff, + 0x8738, 0xa784, 0x001f, 0x00c0, 0x1ef6, 0xa7bc, 0xff00, 0x873f, + 0x8738, 0x873f, 0xa784, 0x0f00, 0x00c0, 0x1ef6, 0x2091, 0x8001, + 0x077f, 0x007c, 0x786c, 0x2009, 0x9674, 0x210c, 0xa10d, 0x0040, + 0x1f14, 0xa065, 0x0078, 0x2395, 0x2061, 0x0000, 0x6018, 0xd084, + 0x00c0, 0x1f34, 0x7810, 0xd08c, 0x0040, 0x1f25, 0xc08c, 0x7812, + 0xc7fc, 0x2069, 0x4e40, 0x0078, 0x1f2a, 0xc08d, 0x7812, 0x2069, + 0x4e80, 0xc7fd, 0x2091, 0x8000, 0x681c, 0x681f, 0x0000, 0x2091, + 0x8001, 0xa005, 0x00c0, 0x1f35, 0x007c, 0xa08c, 0xfff0, 0x0040, + 0x1f3b, 0x1078, 0x296b, 0x0079, 0x1f3d, 0x1f4d, 0x1f50, 0x1f56, + 0x1f5a, 0x1f4e, 0x1f5e, 0x1f4e, 0x1f4e, 0x1f4e, 0x1f64, 0x1f95, + 0x1f99, 0x1f9f, 0x1fb4, 0x1f4e, 0x1f4e, 0x007c, 0x1078, 0x296b, + 0x1078, 0x1ee6, 0x2001, 0x8001, 0x0078, 0x1fc0, 0x2001, 0x8003, + 0x0078, 0x1fc0, 0x2001, 0x8004, 0x0078, 0x1fc0, 0x1078, 0x1ee6, + 0x2001, 0x8006, 0x0078, 0x1fc0, 0x2091, 0x8000, 0x077e, 0xd7fc, + 0x00c0, 0x1f70, 0x2069, 0x4e40, 0x2039, 0x0009, 0x0078, 0x1f74, + 0x2069, 0x4e80, 0x2039, 0x0009, 0x6800, 0xa086, 0x0000, 0x0040, + 0x1f7e, 0x007f, 0x6f1e, 0x2091, 0x8001, 0x007c, 0x6874, 0x077f, + 0xa0bc, 0xff00, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, + 0x1078, 0x1dff, 0x8738, 0xa784, 0x001f, 0x00c0, 0x1f88, 0x2091, + 0x8001, 0x2001, 0x800a, 0x0078, 0x1fc0, 0x2001, 0x800c, 0x0078, + 0x1fc0, 0x1078, 0x1ee6, 0x2001, 0x800d, 0x0078, 0x1fc0, 0x7814, + 0xd0e4, 0x00c0, 0x1fb2, 0xd0ec, 0x0040, 0x1fac, 0xd7fc, 0x0040, + 0x1fac, 0x78e4, 0x0078, 0x1fad, 0x78e0, 0x70c6, 0x2001, 0x800e, + 0x0078, 0x1fc0, 0x0078, 0x1f4e, 0xd7fc, 0x0040, 0x1fba, 0x78ec, + 0x0078, 0x1fbb, 0x78e8, 0x70c6, 0x2001, 0x800f, 0x0078, 0x1fc0, + 0x70c2, 0xd7fc, 0x00c0, 0x1fc8, 0x70db, 0x0000, 0x0078, 0x1fca, + 0x70db, 0x0001, 0x2061, 0x0000, 0x601b, 0x0001, 0x2091, 0x4080, + 0x007c, 0xac80, 0x0001, 0x81ff, 0x0040, 0x1ffc, 0x2099, 0x0030, + 0x20a0, 0x700c, 0xa084, 0x03ff, 0x0040, 0x1fde, 0x7018, 0x007e, + 0x701c, 0x007e, 0x7020, 0x007e, 0x7024, 0x007e, 0x7112, 0x81ac, + 0x721a, 0x731e, 0x7422, 0x7526, 0x7003, 0x0001, 0x7007, 0x0001, + 0x7008, 0x800b, 0x00c8, 0x1ff0, 0x7007, 0x0002, 0xa08c, 0x01e0, + 0x00c0, 0x1ffc, 0x53a5, 0xa006, 0x7003, 0x0000, 0x7007, 0x0004, + 0x007f, 0x7026, 0x007f, 0x7022, 0x007f, 0x701e, 0x007f, 0x701a, + 0x007c, 0x2011, 0x0020, 0x2009, 0x0010, 0x6b0a, 0x6c0e, 0x6803, + 0xfd00, 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, + 0x0004, 0x8109, 0x00c0, 0x200d, 0x007c, 0x6004, 0x6086, 0x2c08, + 0x2063, 0x0000, 0x7868, 0xa005, 0x796a, 0x0040, 0x202a, 0x2c02, + 0x0078, 0x202b, 0x796e, 0x007c, 0x0c7e, 0x2061, 0x4e00, 0x6887, + 0x0103, 0x2d08, 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040, + 0x203c, 0x2d02, 0x0078, 0x203d, 0x616e, 0x0c7f, 0x007c, 0x2091, + 0x8000, 0x2c04, 0x786e, 0xa005, 0x00c0, 0x2047, 0x786a, 0x2091, + 0x8001, 0x609c, 0xa005, 0x0040, 0x2060, 0x0c7e, 0x2060, 0x2008, + 0x609c, 0xa005, 0x0040, 0x205c, 0x2062, 0x609f, 0x0000, 0xa065, + 0x609c, 0xa005, 0x00c0, 0x2054, 0x7848, 0x794a, 0x2062, 0x0c7f, + 0x7848, 0x2062, 0x609f, 0x0000, 0xac85, 0x0000, 0x00c0, 0x206a, + 0x1078, 0x296b, 0x784a, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, + 0x8086, 0x818e, 0x00c8, 0x2075, 0xa200, 0x00f0, 0x2070, 0x8086, + 0x818e, 0x007c, 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x209b, + 0xa11a, 0x00c8, 0x209b, 0x8213, 0x818d, 0x0048, 0x208e, 0xa11a, + 0x00c8, 0x208f, 0x00f0, 0x2083, 0x0078, 0x2093, 0xa11a, 0x2308, + 0x8210, 0x00f0, 0x2083, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, + 0x007f, 0x157f, 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, + 0x2097, 0x7d74, 0x70d0, 0xa506, 0x0040, 0x2187, 0x7810, 0x2050, + 0x7800, 0xd08c, 0x0040, 0x20c3, 0xdaec, 0x0040, 0x20c3, 0x0e7e, + 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x20c0, + 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x20c3, 0x0078, 0x2187, + 0x0e7f, 0x0078, 0x2187, 0x1078, 0x1dbd, 0x0040, 0x2187, 0xa046, + 0x7970, 0x2500, 0x8000, 0xa112, 0x2009, 0x0040, 0x00c8, 0x20d2, + 0x0078, 0x20d9, 0x72d0, 0xa206, 0x0040, 0x20d9, 0x8840, 0x2009, + 0x0080, 0x0c7e, 0x7112, 0x7007, 0x0001, 0x2099, 0x0030, 0x20a9, + 0x0020, 0xac80, 0x0001, 0x20a0, 0x2061, 0x0000, 0x88ff, 0x0040, + 0x20eb, 0x1078, 0x1dbd, 0x7008, 0xd0fc, 0x0040, 0x20eb, 0x7007, + 0x0002, 0x2091, 0x8001, 0xa08c, 0x01e0, 0x00c0, 0x2122, 0x53a5, + 0x8cff, 0x00c0, 0x2100, 0x88ff, 0x0040, 0x2171, 0x0078, 0x210a, + 0x2c00, 0x788e, 0x20a9, 0x0020, 0xac80, 0x0001, 0x20a0, 0x53a5, + 0x0078, 0x2171, 0xa046, 0x7218, 0x731c, 0xdac4, 0x0040, 0x2112, + 0x7420, 0x7524, 0xa292, 0x0040, 0xa39b, 0x0000, 0xa4a3, 0x0000, + 0xa5ab, 0x0000, 0x721a, 0x731e, 0xdac4, 0x0040, 0x2122, 0x7422, + 0x7526, 0xa006, 0x7007, 0x0004, 0x0040, 0x2171, 0x8cff, 0x0040, + 0x212b, 0x1078, 0x1dc6, 0x0c7f, 0x1078, 0x1dc6, 0xa046, 0x7888, + 0x8000, 0x788a, 0xa086, 0x0002, 0x0040, 0x2151, 0x7a7c, 0x7b78, + 0xdac4, 0x0040, 0x213d, 0x7c84, 0x7d80, 0x7974, 0x8107, 0x8004, + 0x8004, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, + 0x721a, 0x731e, 0xdac4, 0x0040, 0x2187, 0x7422, 0x7526, 0x0078, + 0x2187, 0x6014, 0xd0fc, 0x00c0, 0x2159, 0x2069, 0x4e40, 0x0078, + 0x215b, 0x2069, 0x4e80, 0x2091, 0x8000, 0x681f, 0x0002, 0x88ff, + 0x0040, 0x2167, 0xa046, 0x788c, 0x2060, 0x0078, 0x2151, 0x788b, + 0x0000, 0x78ac, 0xa085, 0x0003, 0x78ae, 0x2091, 0x8001, 0x0078, + 0x2187, 0x0c7f, 0x788b, 0x0000, 0x1078, 0x2346, 0x6004, 0xa084, + 0x000f, 0x1078, 0x2188, 0x88ff, 0x0040, 0x2185, 0x788c, 0x2060, + 0x6004, 0xa084, 0x000f, 0x1078, 0x2188, 0x0078, 0x20a1, 0x007c, + 0x0079, 0x218a, 0x219a, 0x21b8, 0x21d6, 0x219a, 0x21e7, 0x21ab, + 0x219a, 0x219a, 0x219a, 0x21b6, 0x21d4, 0x219a, 0x219a, 0x219a, + 0x219a, 0x219a, 0x2039, 0x0400, 0x78bc, 0xa705, 0x78be, 0x6008, + 0xa705, 0x600a, 0x1078, 0x222a, 0x609c, 0x78ba, 0x609f, 0x0000, + 0x1078, 0x2330, 0x007c, 0x78bc, 0xd0c4, 0x0040, 0x21b1, 0x0078, + 0x219a, 0x601c, 0xc0bd, 0x601e, 0x0078, 0x21be, 0x1078, 0x2378, + 0x78bc, 0xd0c4, 0x0040, 0x21be, 0x0078, 0x219a, 0x78bf, 0x0000, + 0x6004, 0x8007, 0xa084, 0x00ff, 0x78b2, 0x8001, 0x0040, 0x21d1, + 0x1078, 0x222a, 0x0040, 0x21d1, 0x78bc, 0xc0c5, 0x78be, 0x0078, + 0x21d3, 0x0078, 0x2249, 0x007c, 0x1078, 0x2374, 0x78bc, 0xa08c, + 0x0e00, 0x00c0, 0x21de, 0xd0c4, 0x00c0, 0x21e0, 0x0078, 0x219a, + 0x1078, 0x222a, 0x00c0, 0x21e6, 0x0078, 0x2249, 0x007c, 0x78bc, + 0xd0c4, 0x0040, 0x21ed, 0x0078, 0x219a, 0x78bf, 0x0000, 0x6714, + 0x2011, 0x0001, 0x22a8, 0x6018, 0xa084, 0x00ff, 0xa005, 0x0040, + 0x220d, 0xa7bc, 0xff00, 0x20a9, 0x0020, 0xa08e, 0x0001, 0x0040, + 0x220d, 0xa7bc, 0x8000, 0x2011, 0x0002, 0x20a9, 0x0100, 0xa08e, + 0x0002, 0x0040, 0x220d, 0x0078, 0x2227, 0x1078, 0x1de4, 0x2d00, + 0x2091, 0x8000, 0x682b, 0x0000, 0x682f, 0x0000, 0x6808, 0xa084, + 0xffde, 0x680a, 0xade8, 0x0010, 0x2091, 0x8001, 0x00f0, 0x2210, + 0x8211, 0x0040, 0x2227, 0x20a9, 0x0100, 0x0078, 0x2210, 0x1078, + 0x1dc6, 0x007c, 0x609f, 0x0000, 0x78b4, 0xa06d, 0x2c00, 0x78b6, + 0x00c0, 0x2235, 0x78ba, 0x0078, 0x223d, 0x689e, 0x2d00, 0x6002, + 0x78b8, 0xad06, 0x00c0, 0x223d, 0x6002, 0x78b0, 0x8001, 0x78b2, + 0x00c0, 0x2248, 0x78bc, 0xc0c4, 0x78be, 0x78b8, 0x2060, 0xa006, + 0x007c, 0x0e7e, 0xa02e, 0x2530, 0x7dba, 0x7db6, 0x65ae, 0x65b2, + 0x601c, 0x60a2, 0x2048, 0xa984, 0xe1ff, 0x601e, 0xa984, 0x0060, + 0x0040, 0x225c, 0x1078, 0x4632, 0x6596, 0x65a6, 0x669a, 0x66aa, + 0x6714, 0x2071, 0x4e80, 0xd7fc, 0x00c0, 0x2268, 0x2071, 0x4e40, + 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x0040, 0x2273, 0x8003, + 0x8003, 0x8003, 0x8003, 0xa105, 0x71c4, 0xa168, 0x2700, 0x8007, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0x71c8, 0xa100, 0x60c2, + 0x2091, 0x8000, 0x7814, 0xd0c4, 0x0040, 0x2298, 0xd0ec, 0x0040, + 0x2294, 0xd7fc, 0x00c0, 0x2291, 0xd0f4, 0x00c0, 0x229f, 0x0078, + 0x2298, 0xd0fc, 0x00c0, 0x229f, 0x7810, 0xd0f4, 0x00c0, 0x229f, + 0x6e08, 0xd684, 0x0040, 0x22c9, 0xd9fc, 0x00c0, 0x22c9, 0x2091, + 0x8001, 0x1078, 0x1e5b, 0x2091, 0x8000, 0x1078, 0x201d, 0x2091, + 0x8001, 0x7814, 0xd0e4, 0x00c0, 0x232e, 0x7814, 0xd0c4, 0x0040, + 0x232e, 0xd0ec, 0x0040, 0x22c1, 0xd7fc, 0x00c0, 0x22bc, 0xd0f4, + 0x00c0, 0x22c5, 0x0078, 0x232e, 0xd0fc, 0x00c0, 0x22c5, 0x0078, + 0x232e, 0x7810, 0xd0f4, 0x0040, 0x232e, 0x601b, 0x0021, 0x0078, + 0x232e, 0x6024, 0xa096, 0x0001, 0x00c0, 0x22d0, 0x8000, 0x6026, + 0x6a10, 0x6814, 0xa202, 0x0048, 0x22e3, 0x0040, 0x22e3, 0x2091, 0x8001, 0x2039, 0x0200, 0x609c, 0x78ba, 0x609f, 0x0000, 0x1078, - 0x2303, 0x0078, 0x2301, 0x2c08, 0xd9fc, 0x0040, 0x22de, 0x6800, - 0xa065, 0x0040, 0x22de, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0040, - 0x22d9, 0x704c, 0xa206, 0x00c0, 0x22d9, 0x6b04, 0x2160, 0x2304, - 0x6002, 0xa005, 0x00c0, 0x22d5, 0x6902, 0x2260, 0x6102, 0x0078, - 0x22ea, 0x2160, 0x6202, 0x6906, 0x0078, 0x22ea, 0x6800, 0x6902, - 0xa065, 0x0040, 0x22e6, 0x6102, 0x0078, 0x22e7, 0x6906, 0x2160, - 0x6003, 0x0000, 0x2160, 0xd9fc, 0x0040, 0x22f1, 0xa6b4, 0xfffc, - 0x6e0a, 0x6810, 0x7d08, 0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, - 0x8001, 0xd6b4, 0x0040, 0x2301, 0xa6b6, 0x0040, 0x6e0a, 0x1078, - 0x1e80, 0x0e7f, 0x007c, 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, - 0x1078, 0x201b, 0x2091, 0x8001, 0x78b8, 0xa065, 0x0040, 0x2316, - 0x609c, 0x78ba, 0x609f, 0x0000, 0x0078, 0x2303, 0x78b6, 0x78ba, - 0x007c, 0x7970, 0x7874, 0x2818, 0xd384, 0x0040, 0x2323, 0x8000, - 0xa112, 0x0048, 0x2328, 0x8000, 0xa112, 0x00c8, 0x2338, 0xc384, - 0x7a7c, 0x721a, 0x7a78, 0x721e, 0xdac4, 0x0040, 0x2333, 0x7a84, - 0x7222, 0x7a80, 0x7226, 0xa006, 0xd384, 0x0040, 0x2338, 0x8000, - 0x7876, 0x70d2, 0x781c, 0xa005, 0x0040, 0x2346, 0x8001, 0x781e, - 0x00c0, 0x2346, 0x0068, 0x2346, 0x2091, 0x4080, 0x007c, 0x2039, - 0x235f, 0x0078, 0x234d, 0x2039, 0x2365, 0x2704, 0xa005, 0x0040, - 0x235e, 0xac00, 0x2068, 0x6908, 0x6810, 0x6912, 0x680a, 0x690c, - 0x6814, 0x6916, 0x680e, 0x8738, 0x0078, 0x234d, 0x007c, 0x0003, - 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0015, 0x001b, 0x0000, - 0x2041, 0x0000, 0x780c, 0x0079, 0x236d, 0x2535, 0x2508, 0x2371, - 0x23e5, 0x2039, 0x9274, 0x2734, 0x7d10, 0x0078, 0x238c, 0x6084, - 0xa086, 0x0103, 0x00c0, 0x23ce, 0x6114, 0x6018, 0xa105, 0x00c0, - 0x23ce, 0x8603, 0xa080, 0x9255, 0x620c, 0x2202, 0x8000, 0x6210, - 0x2202, 0x1078, 0x203d, 0x8630, 0xa68e, 0x000f, 0x0040, 0x2454, - 0x786c, 0xa065, 0x00c0, 0x2377, 0x7808, 0xa602, 0x00c8, 0x239d, - 0xd5ac, 0x00c0, 0x239d, 0x263a, 0x007c, 0xa682, 0x0003, 0x00c8, - 0x2454, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, - 0x23c9, 0x2011, 0x9255, 0x2204, 0x70c6, 0x8210, 0x2204, 0x70ca, - 0xd684, 0x00c0, 0x23b9, 0x8210, 0x2204, 0x70da, 0x8210, 0x2204, - 0x70de, 0xa685, 0x8020, 0x70c2, 0x681b, 0x0001, 0x2091, 0x4080, - 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, 0x203b, 0x0000, - 0x007c, 0x7810, 0xc0ad, 0x7812, 0x0078, 0x2454, 0x263a, 0x1078, - 0x253f, 0x00c0, 0x254e, 0x786c, 0xa065, 0x00c0, 0x2377, 0x2091, - 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0040, 0x23e0, 0xc0ad, - 0x7812, 0x2091, 0x8001, 0x0078, 0x254e, 0x2039, 0x9274, 0x2734, - 0x7d10, 0x0078, 0x23fc, 0x6084, 0xa086, 0x0103, 0x00c0, 0x243d, - 0x6114, 0x6018, 0xa105, 0x00c0, 0x243d, 0xa680, 0x9255, 0x620c, - 0x2202, 0x1078, 0x203d, 0x8630, 0xa68e, 0x001e, 0x0040, 0x2454, - 0x786c, 0xa065, 0x00c0, 0x23eb, 0x7808, 0xa602, 0x00c8, 0x240d, - 0xd5ac, 0x00c0, 0x240d, 0x263a, 0x007c, 0xa682, 0x0006, 0x00c8, - 0x2454, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, - 0x2438, 0x2011, 0x9255, 0x2009, 0x924e, 0x26a8, 0x211c, 0x2204, - 0x201a, 0x8108, 0x8210, 0x00f0, 0x241e, 0xa685, 0x8030, 0x70c2, - 0x681b, 0x0001, 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, - 0x2091, 0x8001, 0xa006, 0x2009, 0x9275, 0x200a, 0x203a, 0x007c, - 0x7810, 0xc0ad, 0x7812, 0x0078, 0x2454, 0x263a, 0x1078, 0x253f, - 0x00c0, 0x254e, 0x786c, 0xa065, 0x00c0, 0x23eb, 0x2091, 0x8000, - 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0040, 0x244f, 0xc0ad, 0x7812, - 0x2091, 0x8001, 0x0078, 0x254e, 0x2091, 0x8000, 0x7007, 0x0004, - 0x7994, 0x70d4, 0xa102, 0x0048, 0x2465, 0x0040, 0x246f, 0x7b90, - 0xa302, 0x00c0, 0x246f, 0x0078, 0x2468, 0x8002, 0x00c0, 0x246f, - 0x263a, 0x7810, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x007c, 0xa184, - 0xff00, 0x0040, 0x247c, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, - 0x8007, 0xa100, 0x0078, 0x247f, 0x8107, 0x8004, 0x8004, 0x7a9c, - 0xa210, 0x721a, 0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4, 0x0040, - 0x248f, 0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1, - 0x0030, 0x7003, 0x0000, 0x2009, 0x9254, 0x260a, 0x8109, 0x2198, - 0x2104, 0xd084, 0x0040, 0x249d, 0x8633, 0xa6b0, 0x0002, 0x26a8, - 0x53a6, 0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, - 0xa10a, 0x00c8, 0x24ac, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, - 0x0040, 0x24bb, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, - 0xa100, 0x0078, 0x24be, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, - 0x7a78, 0xa006, 0xa211, 0xd4c4, 0x0040, 0x24ca, 0x7b84, 0xa319, - 0x7c80, 0xa421, 0x7008, 0xd0fc, 0x0040, 0x24ca, 0xa084, 0x01e0, - 0x0040, 0x24ef, 0x7d10, 0x2031, 0x9254, 0x2634, 0x78a8, 0x8000, - 0x78aa, 0xd08c, 0x00c0, 0x24e4, 0x7007, 0x0006, 0x7004, 0xd094, - 0x00c0, 0x24de, 0x0078, 0x2456, 0x2069, 0x4a47, 0x206b, 0x0003, - 0x78ac, 0xa085, 0x0300, 0x78ae, 0xa006, 0x0078, 0x24f8, 0x2030, - 0x75d6, 0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, - 0x2091, 0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, - 0x711a, 0x721e, 0xd5c4, 0x0040, 0x2507, 0x7322, 0x7426, 0x007c, - 0x6084, 0xa086, 0x0103, 0x00c0, 0x252b, 0x6114, 0x6018, 0xa105, - 0x00c0, 0x252b, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x252b, - 0x600c, 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, - 0x2091, 0x4080, 0x1078, 0x203d, 0x0068, 0x252a, 0x786c, 0xa065, - 0x00c0, 0x2508, 0x007c, 0x1078, 0x253f, 0x00c0, 0x254e, 0x786c, - 0xa065, 0x00c0, 0x2508, 0x0078, 0x254e, 0x1078, 0x253f, 0x00c0, - 0x254e, 0x786c, 0xa065, 0x00c0, 0x2535, 0x0078, 0x254e, 0x1078, - 0x2554, 0x00c0, 0x2546, 0xa085, 0x0001, 0x007c, 0x1078, 0x2563, - 0x00c0, 0x254c, 0x2041, 0x0001, 0x7d10, 0x007c, 0x88ff, 0x0040, - 0x2553, 0x2091, 0x4080, 0x007c, 0x7b90, 0x7994, 0x70d4, 0xa102, - 0x00c0, 0x255d, 0xa385, 0x0000, 0x007c, 0x0048, 0x2561, 0xa302, - 0x007c, 0x8002, 0x007c, 0x7810, 0xd0ec, 0x0040, 0x257b, 0x0e7e, - 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x2578, - 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, 0x257b, 0x0078, 0x25cc, - 0x0e7f, 0x0078, 0x25cc, 0xa184, 0xff00, 0x0040, 0x2588, 0x810f, - 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, 0x0078, 0x258b, - 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, 0x7ca4, 0x7da0, 0xa210, - 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, 0x0018, 0x6028, 0xa005, - 0x0040, 0x259c, 0x2009, 0x0040, 0x1078, 0x1d92, 0x0040, 0x25be, - 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x00c0, 0x25cc, 0x6014, 0xd0fc, - 0x00c0, 0x25ae, 0x2069, 0x4a40, 0x0078, 0x25b0, 0x2069, 0x4a80, - 0x2091, 0x8000, 0x681f, 0x0003, 0x78ab, 0x0000, 0x78ac, 0xa085, - 0x0300, 0x78ae, 0x2091, 0x8001, 0x0078, 0x25cc, 0x78ab, 0x0000, - 0x1078, 0x203d, 0x7990, 0x7894, 0x8000, 0xa10a, 0x00c8, 0x25c9, - 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071, 0x0010, 0x2091, 0x8001, - 0x007c, 0x2138, 0xd7fc, 0x00c0, 0x25d9, 0x2009, 0x4a59, 0x0078, - 0x25db, 0x2009, 0x4a99, 0x2091, 0x8000, 0x200a, 0x0f7e, 0xd7fc, - 0x00c0, 0x25f2, 0x2009, 0x4a40, 0x2001, 0x4a04, 0x2004, 0xd0ec, - 0x0040, 0x25ee, 0x2079, 0x0100, 0x0078, 0x25f6, 0x2079, 0x0200, - 0x0078, 0x25f6, 0x2009, 0x4a80, 0x2079, 0x0100, 0x2104, 0xa086, - 0x0000, 0x00c0, 0x260f, 0xd7fc, 0x00c0, 0x2602, 0x2009, 0x4a45, - 0x0078, 0x2604, 0x2009, 0x4a85, 0x2104, 0xa005, 0x00c0, 0x260f, - 0x7830, 0xa084, 0x00c0, 0x00c0, 0x260f, 0x781b, 0x0045, 0x0f7f, - 0x007c, 0x2009, 0x0002, 0x2069, 0x4a00, 0x6810, 0xd0ec, 0x00c0, - 0x2672, 0x2071, 0x4a80, 0x2079, 0x0100, 0x2021, 0x4cbf, 0x784b, - 0x000f, 0x2019, 0x4205, 0xd184, 0x0040, 0x2632, 0x6810, 0xd0ec, - 0x0040, 0x262e, 0x20a1, 0x012b, 0x0078, 0x2634, 0x20a1, 0x022b, - 0x0078, 0x2634, 0x20a1, 0x012b, 0x2304, 0xa005, 0x0040, 0x2641, - 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, 0x3318, 0x0078, - 0x2634, 0x789b, 0x0020, 0x20a9, 0x0010, 0x78af, 0x0000, 0x78af, - 0x8020, 0x00f0, 0x2645, 0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, - 0x0000, 0x0040, 0x2654, 0xc1bd, 0x1078, 0x283d, 0x017f, 0x7020, - 0xa084, 0x000f, 0x007e, 0x6814, 0xd0e4, 0x007f, 0x00c0, 0x2664, - 0xa085, 0x6340, 0x0078, 0x2666, 0xa085, 0x62c0, 0x7806, 0x780f, - 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7456, - 0x7053, 0x0000, 0x8109, 0x0040, 0x2685, 0x2071, 0x4a40, 0x6810, - 0xd0ec, 0x0040, 0x267f, 0x2079, 0x0100, 0x0078, 0x2681, 0x2079, - 0x0200, 0x2021, 0x4abf, 0x0078, 0x261f, 0x007c, 0x017e, 0xd1bc, - 0x00c0, 0x269a, 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, - 0x0040, 0x2696, 0x2011, 0x0101, 0x0078, 0x269c, 0x2011, 0x0201, - 0x0078, 0x269c, 0x2011, 0x0101, 0xa18c, 0x000f, 0x2204, 0xa084, - 0xfff0, 0xa105, 0x2012, 0x017f, 0x1078, 0x283d, 0x007c, 0xd3fc, - 0x00c0, 0x26ba, 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, - 0x0040, 0x26b6, 0x2011, 0x0101, 0x0078, 0x26bc, 0x2011, 0x0201, - 0x0078, 0x26bc, 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x00f0, - 0x26be, 0xa18c, 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, - 0x007c, 0x2019, 0x0002, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x0040, - 0x26d6, 0x8319, 0x2009, 0x0101, 0x0078, 0x26d8, 0x2009, 0x0101, - 0x20a9, 0x0005, 0x8213, 0x00f0, 0x26da, 0xa294, 0x00e0, 0x2104, - 0xa084, 0xff1f, 0xa205, 0x200a, 0x8319, 0x0040, 0x26eb, 0x2009, - 0x0201, 0x0078, 0x26d8, 0x007c, 0xd3fc, 0x00c0, 0x26ff, 0x007e, - 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x26fb, 0x2011, - 0x0101, 0x0078, 0x2701, 0x2011, 0x0201, 0x0078, 0x2701, 0x2011, - 0x0101, 0x20a9, 0x000c, 0x810b, 0x00f0, 0x2703, 0xa18c, 0xf000, - 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c, 0xd3fc, 0x00c0, - 0x2721, 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, 0x0040, - 0x271d, 0x2011, 0x0102, 0x0078, 0x2723, 0x2011, 0x0202, 0x0078, - 0x2723, 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, - 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x273d, 0x007e, 0x2001, 0x4a04, - 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2739, 0x2061, 0x0100, 0x0078, - 0x273f, 0x2061, 0x0200, 0x0078, 0x273f, 0x2061, 0x0100, 0xc1bc, - 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x62ac, 0x63ac, 0x0c7f, - 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x275d, 0x007e, 0x2001, 0x4a04, - 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2759, 0x2061, 0x0100, 0x0078, - 0x275f, 0x2061, 0x0200, 0x0078, 0x275f, 0x2061, 0x0100, 0xc1bc, - 0x8103, 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, - 0x60ae, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x277f, 0x007e, - 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x277b, 0x2061, - 0x0100, 0x0078, 0x2781, 0x2061, 0x0200, 0x0078, 0x2781, 0x2061, - 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, - 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, - 0x27a1, 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, 0x0040, - 0x279d, 0x2061, 0x0100, 0x0078, 0x27a3, 0x2061, 0x0200, 0x0078, - 0x27a3, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, - 0x609a, 0x60a4, 0xa28c, 0x0020, 0x0040, 0x27b1, 0xc2ac, 0xa39d, - 0x4000, 0xc3fc, 0xd3b4, 0x00c0, 0x27b6, 0xc3fd, 0x62ae, 0x2010, - 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, - 0x0e7e, 0x6818, 0xa005, 0x0040, 0x281b, 0xd1fc, 0x0040, 0x27cc, - 0x2061, 0x91d0, 0x0078, 0x27ce, 0x2061, 0x90c0, 0x1078, 0x2823, - 0x0040, 0x2801, 0x20a9, 0x0101, 0xd1fc, 0x0040, 0x27db, 0x2061, - 0x90d0, 0x0078, 0x27dd, 0x2061, 0x8fc0, 0x0c7e, 0x1078, 0x2823, - 0x0040, 0x27e8, 0x0c7f, 0x8c60, 0x00f0, 0x27dd, 0x0078, 0x281b, - 0x007f, 0xd1fc, 0x0040, 0x27f2, 0xa082, 0x90d0, 0x2071, 0x4a80, - 0x0078, 0x27f6, 0xa082, 0x8fc0, 0x2071, 0x4a40, 0x707a, 0x7176, - 0x2001, 0x0004, 0x7066, 0x7083, 0x000f, 0x1078, 0x25d1, 0x0078, - 0x2817, 0xd1fc, 0x00c0, 0x2808, 0x2071, 0x4a40, 0x0078, 0x280a, - 0x2071, 0x4a80, 0x6020, 0xc0dd, 0x6022, 0x7176, 0x2c00, 0x707e, - 0x2001, 0x0006, 0x7066, 0x7083, 0x000f, 0x1078, 0x25d1, 0x2001, - 0x0000, 0x0078, 0x281d, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, - 0x0e7f, 0x0c7f, 0x007c, 0x2c04, 0xa005, 0x0040, 0x283a, 0x2060, - 0x6010, 0xa306, 0x00c0, 0x2837, 0x600c, 0xa206, 0x00c0, 0x2837, - 0x6014, 0xa106, 0x00c0, 0x2837, 0xa006, 0x0078, 0x283c, 0x6000, - 0x0078, 0x2824, 0xa085, 0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x017e, - 0xd1bc, 0x00c0, 0x2855, 0x2079, 0x4a40, 0x007e, 0x2001, 0x4a04, - 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2851, 0x2071, 0x0100, 0x0078, - 0x2859, 0x2071, 0x0200, 0x0078, 0x2859, 0x2079, 0x4a80, 0x2071, - 0x0100, 0x7920, 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x00c0, 0x2863, - 0x017f, 0x0078, 0x287e, 0x810b, 0x810b, 0x810b, 0x810b, 0x007f, - 0xd0bc, 0x00c0, 0x287b, 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, - 0x007f, 0x0040, 0x2877, 0xa18d, 0x0f00, 0x0078, 0x287d, 0xa18d, - 0x0f00, 0x0078, 0x287d, 0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, - 0x007c, 0x0e7e, 0x2001, 0x4a01, 0x2004, 0xd0ac, 0x00c0, 0x28ea, - 0x68e4, 0xd0ac, 0x0040, 0x28ea, 0xa084, 0x0006, 0x00c0, 0x28ea, - 0x6014, 0xd0fc, 0x00c0, 0x2898, 0x2071, 0x4ec0, 0x0078, 0x289a, - 0x2071, 0x4f40, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, - 0xae70, 0x7004, 0xa084, 0x000a, 0x00c0, 0x28ea, 0x7108, 0xa194, - 0xff00, 0x0040, 0x28ea, 0xa18c, 0x00ff, 0x2001, 0x000a, 0xa106, - 0x0040, 0x28cd, 0x2001, 0x000c, 0xa106, 0x0040, 0x28d1, 0x2001, - 0x0012, 0xa106, 0x0040, 0x28d5, 0x2001, 0x0014, 0xa106, 0x0040, - 0x28d9, 0x2001, 0x0019, 0xa106, 0x0040, 0x28dd, 0x2001, 0x0032, - 0xa106, 0x0040, 0x28e1, 0x0078, 0x28e5, 0x2009, 0x000c, 0x0078, - 0x28e7, 0x2009, 0x0012, 0x0078, 0x28e7, 0x2009, 0x0014, 0x0078, - 0x28e7, 0x2009, 0x0019, 0x0078, 0x28e7, 0x2009, 0x0020, 0x0078, - 0x28e7, 0x2009, 0x003f, 0x0078, 0x28e7, 0x2011, 0x0000, 0x2100, - 0xa205, 0x700a, 0x0e7f, 0x007c, 0x0068, 0x28ec, 0x2091, 0x8000, - 0x2071, 0x0000, 0x007e, 0x7018, 0xd084, 0x00c0, 0x28f3, 0x007f, - 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, - 0x0809, 0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, - 0x4080, 0x0078, 0x2909, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, - 0x708e, 0x7592, 0x7496, 0x769a, 0x779e, 0xa594, 0x003f, 0xd4f4, - 0x0040, 0x2920, 0xa784, 0x007d, 0x00c0, 0x417b, 0x1078, 0x28ec, - 0xa49c, 0x000f, 0xa382, 0x0004, 0x0050, 0x292b, 0xa3a6, 0x0007, - 0x00c0, 0x28ec, 0x2418, 0x8507, 0xa084, 0x000f, 0x0079, 0x2930, - 0x2f45, 0x3035, 0x3060, 0x32c1, 0x363b, 0x36a1, 0x3741, 0x37bd, - 0x38a1, 0x398a, 0x2943, 0x2940, 0x2d2a, 0x2e43, 0x360e, 0x2940, - 0x1078, 0x28ec, 0x007c, 0xa006, 0x0078, 0x294d, 0x7808, 0xc08d, - 0x780a, 0xa006, 0x7002, 0x704e, 0x7046, 0x70d2, 0x7060, 0xa005, - 0x00c0, 0x2a64, 0x7064, 0xa084, 0x0007, 0x0079, 0x2957, 0x295f, - 0x29cf, 0x29d8, 0x29e3, 0x29ee, 0x2a4a, 0x29f9, 0x29cf, 0x7830, - 0xd0bc, 0x00c0, 0x2942, 0x71d4, 0xd1b4, 0x00c0, 0x29ac, 0x70a4, - 0xa086, 0x0001, 0x0040, 0x2942, 0x70b4, 0xa06d, 0x6800, 0xa065, - 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, - 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040, 0x2982, 0x69bc, - 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, 0x0010, 0x0078, - 0x2bbd, 0x7060, 0xa005, 0x00c0, 0x2942, 0x0c7e, 0x0d7e, 0x70b4, - 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, - 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, - 0x0040, 0x29a5, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, - 0x2001, 0x0020, 0x0078, 0x2bbd, 0x1078, 0x411c, 0x00c0, 0x2942, - 0x781b, 0x005b, 0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, - 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, 0x68bc, - 0x7042, 0xc1b4, 0x71d6, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x7003, - 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0x1078, - 0x411c, 0x00c0, 0x29d7, 0x781b, 0x0047, 0x7003, 0x0004, 0x007c, - 0x1078, 0x411c, 0x00c0, 0x29e2, 0x2011, 0x000c, 0x1078, 0x2a09, - 0x7003, 0x0004, 0x007c, 0x1078, 0x411c, 0x00c0, 0x29ed, 0x2011, - 0x0006, 0x1078, 0x2a09, 0x7003, 0x0004, 0x007c, 0x1078, 0x411c, - 0x00c0, 0x29f8, 0x2011, 0x000d, 0x1078, 0x2a09, 0x7003, 0x0004, - 0x007c, 0x1078, 0x411c, 0x00c0, 0x2a08, 0x2011, 0x0006, 0x1078, - 0x2a09, 0x707c, 0x707f, 0x0000, 0x2068, 0x704e, 0x7003, 0x0001, - 0x007c, 0x7174, 0xc1fc, 0x8107, 0x7882, 0x789b, 0x0010, 0xa286, - 0x000c, 0x00c0, 0x2a18, 0x7aaa, 0x2001, 0x0001, 0x0078, 0x2a2d, - 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, 0x000d, 0x0040, - 0x2a26, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2a2d, 0x78ab, 0x0020, - 0x7178, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b, 0x0060, 0x78aa, - 0x785b, 0x0004, 0x781b, 0x0108, 0x1078, 0x4131, 0x7083, 0x000f, - 0x70d4, 0xd0b4, 0x0040, 0x2a49, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, - 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, - 0x0c7f, 0x007c, 0x1078, 0x411c, 0x00c0, 0x2942, 0x707c, 0x2068, - 0x7774, 0x1078, 0x3fe1, 0x2c50, 0x1078, 0x41f0, 0x789b, 0x0010, - 0x6814, 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, - 0x2001, 0x0004, 0x0078, 0x2bc3, 0x1078, 0x411c, 0x00c0, 0x2942, - 0x789b, 0x0010, 0x7060, 0x2068, 0x6f14, 0x70d4, 0xd0b4, 0x0040, - 0x2a7e, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, - 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x1078, 0x3fe1, - 0x2c50, 0x1078, 0x41f0, 0x6824, 0xa005, 0x0040, 0x2a8f, 0xa082, - 0x0006, 0x0048, 0x2a8d, 0x0078, 0x2a8f, 0x6827, 0x0005, 0x6814, - 0xa084, 0x001f, 0xc0bd, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, - 0x2001, 0x0003, 0x0078, 0x2bc3, 0xc28d, 0x72d6, 0x72c0, 0xa200, - 0xa015, 0x7154, 0x8108, 0xa12a, 0x0048, 0x2aa7, 0x71c0, 0x2164, - 0x6504, 0x85ff, 0x00c0, 0x2abe, 0x7156, 0x8421, 0x00c0, 0x2aa2, - 0x70d4, 0xd08c, 0x0040, 0x2aba, 0x70d0, 0xa005, 0x00c0, 0x2aba, - 0x70d3, 0x000a, 0x007c, 0x2200, 0x0078, 0x2aac, 0x70d4, 0xc08c, - 0x70d6, 0x70d3, 0x0000, 0x603c, 0xa005, 0x00c0, 0x2abb, 0x6708, - 0xa784, 0x073f, 0x0040, 0x2aed, 0xd7d4, 0x00c0, 0x2abb, 0xa784, - 0x0021, 0x00c0, 0x2abb, 0xa784, 0x0002, 0x0040, 0x2ade, 0xa784, - 0x0004, 0x0040, 0x2abb, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, - 0x00c0, 0x2abb, 0xa784, 0x0100, 0x0040, 0x2aed, 0x6018, 0xa005, - 0x00c0, 0x2abb, 0xa7bc, 0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, - 0x6e1c, 0xa684, 0x000e, 0x6318, 0x0040, 0x2afe, 0x601c, 0xa302, - 0x0048, 0x2b01, 0x0040, 0x2b01, 0x0078, 0x2abb, 0x83ff, 0x00c0, - 0x2abb, 0x2d58, 0x2c50, 0x7156, 0xd7bc, 0x00c0, 0x2b09, 0x7028, - 0x6022, 0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, - 0x2041, 0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, - 0x0040, 0x2b1d, 0xd684, 0x0040, 0x2b1f, 0xa39c, 0xffbf, 0xd6a4, - 0x0040, 0x2b24, 0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2b6f, - 0xc7a5, 0x670a, 0x2c00, 0x68c6, 0x77a4, 0xa786, 0x0001, 0x00c0, - 0x2b43, 0x70d4, 0xd0b4, 0x00c0, 0x2b43, 0x7000, 0xa082, 0x0002, - 0x00c8, 0x2b43, 0x7830, 0xd0bc, 0x00c0, 0x2b43, 0x789b, 0x0010, - 0x7baa, 0x0078, 0x2bbb, 0x8739, 0x77a6, 0x2750, 0x77b0, 0xa7b0, - 0x0005, 0x70ac, 0xa606, 0x00c0, 0x2b4e, 0x76a8, 0x76b2, 0x2c3a, - 0x8738, 0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, - 0x7830, 0xd0bc, 0x0040, 0x2b66, 0x2091, 0x8000, 0x2091, 0x303d, - 0x70d4, 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000, - 0x0040, 0x2b6e, 0x8421, 0x2200, 0x00c0, 0x2aa1, 0x007c, 0xd1dc, - 0x0040, 0x3be5, 0x2029, 0x0020, 0xd69c, 0x00c0, 0x2b7c, 0x8528, - 0xd68c, 0x00c0, 0x2b7c, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, - 0xa18c, 0x00ff, 0x70cc, 0xa160, 0x2c64, 0x8cff, 0x0040, 0x2b9b, - 0x6014, 0xa706, 0x00c0, 0x2b84, 0x60b8, 0x8001, 0x60ba, 0x00c0, - 0x2b7f, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, - 0x00c0, 0x2aa1, 0x007c, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, - 0x8840, 0x6008, 0xc0d5, 0x600a, 0x77a4, 0xa786, 0x0001, 0x00c0, - 0x2b43, 0x70d4, 0xd0b4, 0x00c0, 0x2b43, 0x7000, 0xa082, 0x0002, - 0x00c8, 0x2b43, 0x7830, 0xd0bc, 0x00c0, 0x2b43, 0x789b, 0x0010, - 0x7baa, 0x7daa, 0x79aa, 0x2001, 0x0002, 0x007e, 0x6018, 0x8000, - 0x601a, 0x0078, 0x2bc4, 0x007e, 0x2960, 0x6104, 0x2a60, 0xa184, - 0x0018, 0x0040, 0x2be0, 0xa184, 0x0010, 0x0040, 0x2bd3, 0x1078, - 0x3df6, 0x00c0, 0x2c05, 0xa184, 0x0008, 0x0040, 0x2be0, 0x69a0, - 0xa184, 0x0600, 0x00c0, 0x2be0, 0x1078, 0x3cda, 0x0078, 0x2c05, - 0x69a0, 0xa184, 0x1e00, 0x0040, 0x2c10, 0xa184, 0x0800, 0x0040, - 0x2bf9, 0x0c7e, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104, - 0xa18d, 0x0010, 0x6106, 0x0c7f, 0x1078, 0x3df6, 0x00c0, 0x2c05, - 0x69a0, 0xa184, 0x0200, 0x0040, 0x2c01, 0x1078, 0x3d3a, 0x0078, - 0x2c05, 0xa184, 0x0400, 0x00c0, 0x2bdc, 0x69a0, 0xa184, 0x1000, - 0x0040, 0x2c10, 0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x2749, - 0x027f, 0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x2c1d, 0xa086, - 0x0060, 0x00c0, 0x2c1d, 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, - 0x789b, 0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, - 0x0040, 0x2c38, 0xc0fc, 0x7087, 0x0000, 0xa08a, 0x000d, 0x0050, - 0x2c36, 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, - 0x78aa, 0x3518, 0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, - 0x20a0, 0x789b, 0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, - 0x2898, 0x25a0, 0xa286, 0x0020, 0x00c0, 0x2c70, 0x70d4, 0xc0b5, - 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x6814, 0xc0fc, 0x8007, - 0x7882, 0xa286, 0x0002, 0x0040, 0x2ca6, 0x70a4, 0x8000, 0x70a6, - 0x74b4, 0xa498, 0x0005, 0x70ac, 0xa306, 0x00c0, 0x2c68, 0x73a8, - 0x73b6, 0xa286, 0x0010, 0x0040, 0x2942, 0x0d7f, 0x0c7f, 0x007c, - 0x7000, 0xa005, 0x00c0, 0x2c4e, 0xa286, 0x0002, 0x00c0, 0x2cc0, - 0x1078, 0x411c, 0x00c0, 0x2c4e, 0x6814, 0xc0fc, 0x8007, 0x7882, - 0x2091, 0x8000, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6, - 0x78de, 0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, - 0x780a, 0x127e, 0x0d7e, 0x0c7e, 0x70d4, 0xa084, 0x2700, 0x2090, - 0x0c7f, 0x0d7f, 0x127f, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003, - 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x7830, 0xd0bc, - 0x0040, 0x2cb2, 0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, 0x2091, - 0x8000, 0x2090, 0x70a4, 0xa005, 0x00c0, 0x2cb7, 0x007c, 0x8421, - 0x0040, 0x2cb6, 0x7250, 0x70c0, 0xa200, 0xa015, 0x0078, 0x2aa1, - 0xa286, 0x0010, 0x00c0, 0x2cf1, 0x1078, 0x411c, 0x00c0, 0x2c4e, - 0x6814, 0xc0fc, 0x8007, 0x7882, 0x781b, 0x005b, 0x68b4, 0x785a, + 0x2330, 0x0078, 0x232e, 0x2c08, 0xd9fc, 0x0040, 0x230b, 0x6800, + 0xa065, 0x0040, 0x230b, 0x6a04, 0x7000, 0xa084, 0x0002, 0x0040, + 0x2301, 0x704c, 0xa206, 0x00c0, 0x2301, 0x6b04, 0x2160, 0x2304, + 0x6002, 0xa005, 0x00c0, 0x22fd, 0x6902, 0x2260, 0x6102, 0x0078, + 0x2317, 0x2d00, 0x2060, 0x1078, 0x2acc, 0x6e08, 0x2160, 0x6202, + 0x6906, 0x0078, 0x2317, 0x6800, 0x6902, 0xa065, 0x0040, 0x2313, + 0x6102, 0x0078, 0x2314, 0x6906, 0x2160, 0x6003, 0x0000, 0x2160, + 0xd9fc, 0x0040, 0x231e, 0xa6b4, 0xfffc, 0x6e0a, 0x6810, 0x7d08, + 0x8528, 0x7d0a, 0x8000, 0x6812, 0x2091, 0x8001, 0xd6b4, 0x0040, + 0x232e, 0xa6b6, 0x0040, 0x6e0a, 0x1078, 0x1e6c, 0x0e7f, 0x007c, + 0x6008, 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x201d, 0x2091, + 0x8001, 0x78b8, 0xa065, 0x0040, 0x2343, 0x609c, 0x78ba, 0x609f, + 0x0000, 0x0078, 0x2330, 0x78b6, 0x78ba, 0x007c, 0x7970, 0x7874, + 0x2818, 0xd384, 0x0040, 0x2350, 0x8000, 0xa112, 0x0048, 0x2355, + 0x8000, 0xa112, 0x00c8, 0x2365, 0xc384, 0x7a7c, 0x721a, 0x7a78, + 0x721e, 0xdac4, 0x0040, 0x2360, 0x7a84, 0x7222, 0x7a80, 0x7226, + 0xa006, 0xd384, 0x0040, 0x2365, 0x8000, 0x7876, 0x70d2, 0x781c, + 0xa005, 0x0040, 0x2373, 0x8001, 0x781e, 0x00c0, 0x2373, 0x0068, + 0x2373, 0x2091, 0x4080, 0x007c, 0x2039, 0x238c, 0x0078, 0x237a, + 0x2039, 0x2392, 0x2704, 0xa005, 0x0040, 0x238b, 0xac00, 0x2068, + 0x6908, 0x6810, 0x6912, 0x680a, 0x690c, 0x6814, 0x6916, 0x680e, + 0x8738, 0x0078, 0x237a, 0x007c, 0x0003, 0x0009, 0x000f, 0x0015, + 0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x2041, 0x0000, 0x780c, + 0x0079, 0x239a, 0x256c, 0x253f, 0x239e, 0x2417, 0x2039, 0x9674, + 0x2734, 0x7d10, 0x0078, 0x23be, 0x6084, 0xa086, 0x0103, 0x00c0, + 0x2400, 0x6114, 0x6018, 0xa105, 0x0040, 0x23b3, 0x86ff, 0x00c0, + 0x23cf, 0x0078, 0x2400, 0x8603, 0xa080, 0x9655, 0x620c, 0x2202, + 0x8000, 0x6210, 0x2202, 0x1078, 0x203f, 0x8630, 0xa68e, 0x000f, + 0x0040, 0x248b, 0x786c, 0xa065, 0x00c0, 0x23a4, 0x7808, 0xa602, + 0x00c8, 0x23cf, 0xd5ac, 0x00c0, 0x23cf, 0x263a, 0x007c, 0xa682, + 0x0003, 0x00c8, 0x248b, 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, + 0xd084, 0x00c0, 0x23fb, 0x2011, 0x9655, 0x2204, 0x70c6, 0x8210, + 0x2204, 0x70ca, 0xd684, 0x00c0, 0x23eb, 0x8210, 0x2204, 0x70da, + 0x8210, 0x2204, 0x70de, 0xa685, 0x8020, 0x70c2, 0x681b, 0x0001, + 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, 0x8001, + 0x203b, 0x0000, 0x007c, 0x7810, 0xc0ad, 0x7812, 0x0078, 0x248b, + 0x263a, 0x1078, 0x2576, 0x00c0, 0x2599, 0x786c, 0xa065, 0x00c0, + 0x23a4, 0x2091, 0x8000, 0x7810, 0xa084, 0xffcf, 0x86ff, 0x0040, + 0x2412, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0078, 0x2599, 0x2039, + 0x9674, 0x2734, 0x7d10, 0x0078, 0x2433, 0x6084, 0xa086, 0x0103, + 0x00c0, 0x2474, 0x6114, 0x6018, 0xa105, 0x0040, 0x242c, 0x86ff, + 0x00c0, 0x2444, 0x0078, 0x2474, 0xa680, 0x9655, 0x620c, 0x2202, + 0x1078, 0x203f, 0x8630, 0xa68e, 0x001e, 0x0040, 0x248b, 0x786c, + 0xa065, 0x00c0, 0x241d, 0x7808, 0xa602, 0x00c8, 0x2444, 0xd5ac, + 0x00c0, 0x2444, 0x263a, 0x007c, 0xa682, 0x0006, 0x00c8, 0x248b, + 0x2091, 0x8000, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x246f, + 0x2011, 0x9655, 0x2009, 0x964e, 0x26a8, 0x211c, 0x2204, 0x201a, + 0x8108, 0x8210, 0x00f0, 0x2455, 0xa685, 0x8030, 0x70c2, 0x681b, + 0x0001, 0x2091, 0x4080, 0x7810, 0xa084, 0xffcf, 0x7812, 0x2091, + 0x8001, 0xa006, 0x2009, 0x9675, 0x200a, 0x203a, 0x007c, 0x7810, + 0xc0ad, 0x7812, 0x0078, 0x248b, 0x263a, 0x1078, 0x2576, 0x00c0, + 0x2599, 0x786c, 0xa065, 0x00c0, 0x241d, 0x2091, 0x8000, 0x7810, + 0xa084, 0xffcf, 0x86ff, 0x0040, 0x2486, 0xc0ad, 0x7812, 0x2091, + 0x8001, 0x0078, 0x2599, 0x2091, 0x8000, 0x7007, 0x0004, 0x7994, + 0x70d4, 0xa102, 0x0048, 0x249c, 0x0040, 0x24a6, 0x7b90, 0xa302, + 0x00c0, 0x24a6, 0x0078, 0x249f, 0x8002, 0x00c0, 0x24a6, 0x263a, + 0x7810, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x007c, 0xa184, 0xff00, + 0x0040, 0x24b3, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, + 0xa100, 0x0078, 0x24b6, 0x8107, 0x8004, 0x8004, 0x7a9c, 0xa210, + 0x721a, 0x7a98, 0xa006, 0xa211, 0x721e, 0xd4c4, 0x0040, 0x24c6, + 0x7aa4, 0xa211, 0x7222, 0x7aa0, 0xa211, 0x7226, 0x20a1, 0x0030, + 0x7003, 0x0000, 0x2009, 0x9654, 0x260a, 0x8109, 0x2198, 0x2104, + 0xd084, 0x0040, 0x24d4, 0x8633, 0xa6b0, 0x0002, 0x26a8, 0x53a6, + 0x8603, 0x7012, 0x7007, 0x0001, 0x7990, 0x7894, 0x8000, 0xa10a, + 0x00c8, 0x24e3, 0xa006, 0x2028, 0x7974, 0xa184, 0xff00, 0x0040, + 0x24f2, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, 0xa100, + 0x0078, 0x24f5, 0x8107, 0x8004, 0x8004, 0x797c, 0xa108, 0x7a78, + 0xa006, 0xa211, 0xd4c4, 0x0040, 0x2501, 0x7b84, 0xa319, 0x7c80, + 0xa421, 0x7008, 0xd0fc, 0x0040, 0x2501, 0xa084, 0x01e0, 0x0040, + 0x2526, 0x7d10, 0x2031, 0x9654, 0x2634, 0x78a8, 0x8000, 0x78aa, + 0xd08c, 0x00c0, 0x251b, 0x7007, 0x0006, 0x7004, 0xd094, 0x00c0, + 0x2515, 0x0078, 0x248d, 0x2069, 0x4e47, 0x206b, 0x0003, 0x78ac, + 0xa085, 0x0300, 0x78ae, 0xa006, 0x0078, 0x252f, 0x2030, 0x75d6, + 0x2091, 0x4080, 0x7d96, 0x7d10, 0xa5ac, 0xffcf, 0x7d12, 0x2091, + 0x8001, 0x78aa, 0x7007, 0x0006, 0x263a, 0x7003, 0x0001, 0x711a, + 0x721e, 0xd5c4, 0x0040, 0x253e, 0x7322, 0x7426, 0x007c, 0x6084, + 0xa086, 0x0103, 0x00c0, 0x2562, 0x6114, 0x6018, 0xa105, 0x00c0, + 0x2562, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, 0x2562, 0x600c, + 0x70c6, 0x6010, 0x70ca, 0x70c3, 0x8020, 0x681b, 0x0001, 0x2091, + 0x4080, 0x1078, 0x203f, 0x0068, 0x2561, 0x786c, 0xa065, 0x00c0, + 0x253f, 0x007c, 0x1078, 0x2576, 0x00c0, 0x2599, 0x786c, 0xa065, + 0x00c0, 0x253f, 0x0078, 0x2599, 0x1078, 0x2576, 0x00c0, 0x2599, + 0x786c, 0xa065, 0x00c0, 0x256c, 0x0078, 0x2599, 0x6084, 0xa086, + 0x0103, 0x00c0, 0x258a, 0x6018, 0xc0fc, 0x601a, 0xa086, 0x0004, + 0x00c0, 0x258a, 0x7804, 0xd0a4, 0x0040, 0x258a, 0x1078, 0x203f, + 0xa006, 0x007c, 0x1078, 0x259f, 0x00c0, 0x2591, 0xa085, 0x0001, + 0x007c, 0x1078, 0x25ae, 0x00c0, 0x2597, 0x2041, 0x0001, 0x7d10, + 0x007c, 0x88ff, 0x0040, 0x259e, 0x2091, 0x4080, 0x007c, 0x7b90, + 0x7994, 0x70d4, 0xa102, 0x00c0, 0x25a8, 0xa385, 0x0000, 0x007c, + 0x0048, 0x25ac, 0xa302, 0x007c, 0x8002, 0x007c, 0x7810, 0xd0ec, + 0x0040, 0x25c6, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x0020, 0x7004, + 0xa005, 0x00c0, 0x25c3, 0x7008, 0x0e7f, 0xa086, 0x0008, 0x0040, + 0x25c6, 0x0078, 0x2617, 0x0e7f, 0x0078, 0x2617, 0xa184, 0xff00, + 0x0040, 0x25d3, 0x810f, 0x810c, 0x810c, 0x8004, 0x8004, 0x8007, + 0xa100, 0x0078, 0x25d6, 0x8107, 0x8004, 0x8004, 0x7a9c, 0x7b98, + 0x7ca4, 0x7da0, 0xa210, 0xa006, 0xa319, 0xa421, 0xa529, 0x2009, + 0x0018, 0x6028, 0xa005, 0x0040, 0x25e7, 0x2009, 0x0040, 0x1078, + 0x1d74, 0x0040, 0x2609, 0x78a8, 0x8000, 0x78aa, 0xd08c, 0x00c0, + 0x2617, 0x6014, 0xd0fc, 0x00c0, 0x25f9, 0x2069, 0x4e40, 0x0078, + 0x25fb, 0x2069, 0x4e80, 0x2091, 0x8000, 0x681f, 0x0003, 0x78ab, + 0x0000, 0x78ac, 0xa085, 0x0300, 0x78ae, 0x2091, 0x8001, 0x0078, + 0x2617, 0x78ab, 0x0000, 0x1078, 0x203f, 0x7990, 0x7894, 0x8000, + 0xa10a, 0x00c8, 0x2614, 0xa006, 0x7896, 0x70d6, 0xa006, 0x2071, + 0x0010, 0x2091, 0x8001, 0x007c, 0xd7fc, 0x00c0, 0x2623, 0x2009, + 0x4e59, 0x0078, 0x2625, 0x2009, 0x4e99, 0x2091, 0x8000, 0x200a, + 0x0f7e, 0xd7fc, 0x00c0, 0x263c, 0x2009, 0x4e40, 0x2001, 0x4e04, + 0x2004, 0xd0ec, 0x0040, 0x2638, 0x2079, 0x0100, 0x0078, 0x2640, + 0x2079, 0x0200, 0x0078, 0x2640, 0x2009, 0x4e80, 0x2079, 0x0100, + 0x2104, 0xa086, 0x0000, 0x00c0, 0x2659, 0xd7fc, 0x00c0, 0x264c, + 0x2009, 0x4e45, 0x0078, 0x264e, 0x2009, 0x4e85, 0x2104, 0xa005, + 0x00c0, 0x2659, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x2659, 0x781b, + 0x0045, 0x0f7f, 0x007c, 0x2009, 0x0002, 0x2069, 0x4e00, 0x6810, + 0xd0ec, 0x00c0, 0x26c8, 0x2071, 0x4e80, 0x2079, 0x0100, 0x2021, + 0x50bf, 0x784b, 0x000f, 0x2019, 0x4457, 0xd184, 0x0040, 0x267c, + 0x6810, 0xd0ec, 0x0040, 0x2678, 0x20a1, 0x012b, 0x0078, 0x267e, + 0x20a1, 0x022b, 0x0078, 0x267e, 0x20a1, 0x012b, 0x2304, 0xa005, + 0x0040, 0x268b, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, 0x53a6, + 0x3318, 0x0078, 0x267e, 0x789b, 0x0020, 0x20a9, 0x0010, 0x6814, + 0xd0e4, 0x0040, 0x269b, 0x78af, 0x0000, 0x78af, 0x9020, 0x00f0, + 0x2693, 0x0078, 0x26a1, 0x78af, 0x0000, 0x78af, 0x8020, 0x00f0, + 0x269b, 0x7003, 0x0000, 0x017e, 0xd18c, 0x2009, 0x0000, 0x0040, + 0x26aa, 0xc1bd, 0x1078, 0x289b, 0x017f, 0x7020, 0xa084, 0x000f, + 0x007e, 0x6814, 0xd0e4, 0x007f, 0x00c0, 0x26ba, 0xa085, 0x6340, + 0x0078, 0x26bc, 0xa085, 0x62c0, 0x7806, 0x780f, 0x9200, 0x7843, + 0x00d8, 0x7853, 0x0080, 0x780b, 0x0008, 0x7456, 0x7053, 0x0000, + 0x8109, 0x0040, 0x26db, 0x2071, 0x4e40, 0x6810, 0xd0ec, 0x0040, + 0x26d5, 0x2079, 0x0100, 0x0078, 0x26d7, 0x2079, 0x0200, 0x2021, + 0x4ebf, 0x0078, 0x2669, 0x007c, 0x017e, 0xd1bc, 0x00c0, 0x26f0, + 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x26ec, + 0x2011, 0x0101, 0x0078, 0x26f2, 0x2011, 0x0201, 0x0078, 0x26f2, + 0x2011, 0x0101, 0xa18c, 0x000f, 0x2204, 0xa084, 0xfff0, 0xa105, + 0x2012, 0x017f, 0x1078, 0x289b, 0x007c, 0xd3fc, 0x00c0, 0x2710, + 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x270c, + 0x2011, 0x0101, 0x0078, 0x2712, 0x2011, 0x0201, 0x0078, 0x2712, + 0x2011, 0x0101, 0x20a9, 0x0009, 0x810b, 0x00f0, 0x2714, 0xa18c, + 0x0e00, 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2019, + 0x0002, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x0040, 0x272c, 0x8319, + 0x2009, 0x0101, 0x0078, 0x272e, 0x2009, 0x0101, 0x20a9, 0x0005, + 0x8213, 0x00f0, 0x2730, 0xa294, 0x00e0, 0x2104, 0xa084, 0xff1f, + 0xa205, 0x200a, 0x8319, 0x0040, 0x2741, 0x2009, 0x0201, 0x0078, + 0x272e, 0x007c, 0xd3fc, 0x00c0, 0x2755, 0x007e, 0x2001, 0x4e04, + 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2751, 0x2011, 0x0101, 0x0078, + 0x2757, 0x2011, 0x0201, 0x0078, 0x2757, 0x2011, 0x0101, 0x20a9, + 0x000c, 0x810b, 0x00f0, 0x2759, 0xa18c, 0xf000, 0x2204, 0xa084, + 0x0fff, 0xa105, 0x2012, 0x007c, 0xd3fc, 0x00c0, 0x2777, 0x007e, + 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2773, 0x2011, + 0x0102, 0x0078, 0x2779, 0x2011, 0x0202, 0x0078, 0x2779, 0x2011, + 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, 0x0c7e, + 0xd1bc, 0x00c0, 0x2793, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, + 0x007f, 0x0040, 0x278f, 0x2061, 0x0100, 0x0078, 0x2795, 0x2061, + 0x0200, 0x0078, 0x2795, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, + 0xa080, 0x0020, 0x609a, 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x0c7e, + 0xd1bc, 0x00c0, 0x27b3, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, + 0x007f, 0x0040, 0x27af, 0x2061, 0x0100, 0x0078, 0x27b5, 0x2061, + 0x0200, 0x0078, 0x27b5, 0x2061, 0x0100, 0xc1bc, 0x8103, 0x8003, + 0xa080, 0x0022, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, 0x0c7f, + 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x27d5, 0x007e, 0x2001, 0x4e04, + 0x2004, 0xd0ec, 0x007f, 0x0040, 0x27d1, 0x2061, 0x0100, 0x0078, + 0x27d7, 0x2061, 0x0200, 0x0078, 0x27d7, 0x2061, 0x0100, 0xc1bc, + 0x8103, 0x8003, 0xa080, 0x0022, 0x609a, 0x60a4, 0xa085, 0x0020, + 0x60ae, 0x0c7f, 0x007c, 0x0c7e, 0xd1bc, 0x00c0, 0x27f7, 0x007e, + 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x27f3, 0x2061, + 0x0100, 0x0078, 0x27f9, 0x2061, 0x0200, 0x0078, 0x27f9, 0x2061, + 0x0100, 0xc1bc, 0x8103, 0x8003, 0xa080, 0x0020, 0x609a, 0x60a4, + 0xa28c, 0x0020, 0x0040, 0x2807, 0xc2ac, 0xa39d, 0x4000, 0xc3fc, + 0xd3b4, 0x00c0, 0x280c, 0xc3fd, 0x62ae, 0x2010, 0x60a4, 0x63ae, + 0x2018, 0x0c7f, 0x007c, 0x2091, 0x8000, 0x0c7e, 0x0e7e, 0x6818, + 0xa005, 0x0040, 0x2879, 0xd1fc, 0x0040, 0x2822, 0x2061, 0x95d0, + 0x0078, 0x2824, 0x2061, 0x94c0, 0x1078, 0x2881, 0x0040, 0x285b, + 0x20a9, 0x0101, 0xd1fc, 0x0040, 0x2831, 0x2061, 0x94d0, 0x0078, + 0x2833, 0x2061, 0x93c0, 0x0c7e, 0x1078, 0x2881, 0x0040, 0x283e, + 0x0c7f, 0x8c60, 0x00f0, 0x2833, 0x0078, 0x2879, 0x007f, 0xd1fc, + 0x0040, 0x2848, 0xa082, 0x94d0, 0x2071, 0x4e80, 0x0078, 0x284c, + 0xa082, 0x93c0, 0x2071, 0x4e40, 0x707a, 0x7176, 0x2138, 0x2001, + 0x0004, 0x7066, 0x7083, 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x1078, + 0x261c, 0x0078, 0x2875, 0xd1fc, 0x00c0, 0x2862, 0x2071, 0x4e40, + 0x0078, 0x2864, 0x2071, 0x4e80, 0x6020, 0xc0dd, 0x6022, 0x7176, + 0x2138, 0x2c00, 0x707e, 0x2001, 0x0006, 0x7066, 0x7083, 0x000f, + 0x71d4, 0xc1dc, 0x71d6, 0x1078, 0x261c, 0x2001, 0x0000, 0x0078, + 0x287b, 0x2001, 0x0001, 0x2091, 0x8001, 0xa005, 0x0e7f, 0x0c7f, + 0x007c, 0x2c04, 0xa005, 0x0040, 0x2898, 0x2060, 0x6010, 0xa306, + 0x00c0, 0x2895, 0x600c, 0xa206, 0x00c0, 0x2895, 0x6014, 0xa106, + 0x00c0, 0x2895, 0xa006, 0x0078, 0x289a, 0x6000, 0x0078, 0x2882, + 0xa085, 0x0001, 0x007c, 0x0f7e, 0x0e7e, 0x017e, 0xd1bc, 0x00c0, + 0x28b3, 0x2079, 0x4e40, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, + 0x007f, 0x0040, 0x28af, 0x2071, 0x0100, 0x0078, 0x28b7, 0x2071, + 0x0200, 0x0078, 0x28b7, 0x2079, 0x4e80, 0x2071, 0x0100, 0x7920, + 0xa18c, 0x000f, 0x70ec, 0xd0c4, 0x00c0, 0x28c1, 0x017f, 0x0078, + 0x28dc, 0x810b, 0x810b, 0x810b, 0x810b, 0x007f, 0xd0bc, 0x00c0, + 0x28d9, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, + 0x28d5, 0xa18d, 0x0f00, 0x0078, 0x28db, 0xa18d, 0x0f00, 0x0078, + 0x28db, 0xa18d, 0x0800, 0x2104, 0x0e7f, 0x0f7f, 0x007c, 0x0e7e, + 0x2001, 0x4e01, 0x2004, 0xd0ac, 0x00c0, 0x295c, 0x68e4, 0xd0ac, + 0x0040, 0x295c, 0xa084, 0x0006, 0x00c0, 0x295c, 0x6014, 0xd0fc, + 0x00c0, 0x28f6, 0x2071, 0x52c0, 0x0078, 0x28f8, 0x2071, 0x5340, + 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xae70, 0x7004, + 0xa084, 0x000a, 0x00c0, 0x295c, 0x7108, 0xa194, 0xff00, 0x0040, + 0x295c, 0xa18c, 0x00ff, 0x2001, 0x000a, 0xa106, 0x0040, 0x292b, + 0x2001, 0x000c, 0xa106, 0x0040, 0x292f, 0x2001, 0x0012, 0xa106, + 0x0040, 0x2933, 0x2001, 0x0014, 0xa106, 0x0040, 0x2937, 0x2001, + 0x0019, 0xa106, 0x0040, 0x293b, 0x2001, 0x0032, 0xa106, 0x0040, + 0x293f, 0x0078, 0x2943, 0x2009, 0x000c, 0x0078, 0x2945, 0x2009, + 0x0012, 0x0078, 0x2945, 0x2009, 0x0014, 0x0078, 0x2945, 0x2009, + 0x0019, 0x0078, 0x2945, 0x2009, 0x0020, 0x0078, 0x2945, 0x2009, + 0x003f, 0x0078, 0x2945, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, + 0x2071, 0x4e00, 0x7004, 0xd0bc, 0x0040, 0x295c, 0x6014, 0xd0fc, + 0x00c0, 0x2957, 0x70ea, 0x2071, 0x4e40, 0x0078, 0x295a, 0x70ee, + 0x2071, 0x4e80, 0x701f, 0x000d, 0x0e7f, 0x007c, 0x2001, 0x4e05, + 0x2004, 0xd0e4, 0x00c0, 0x296a, 0x7804, 0xa084, 0xff1f, 0xa085, + 0x6340, 0x7806, 0x007c, 0x0068, 0x296b, 0x2091, 0x8000, 0x2071, + 0x0000, 0x007e, 0x7018, 0xd084, 0x00c0, 0x2972, 0x007f, 0x2071, + 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, 0x70db, 0x080f, + 0x70df, 0x0000, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, + 0x0078, 0x2988, 0x7f3c, 0x7e58, 0x7c30, 0x7d38, 0x78a0, 0x708e, + 0x7592, 0x7496, 0x769a, 0x779e, 0xa594, 0x003f, 0xd4f4, 0x0040, + 0x299f, 0xa784, 0x007d, 0x00c0, 0x43cd, 0x1078, 0x296b, 0xa49c, + 0x000f, 0xa382, 0x0004, 0x0050, 0x29aa, 0xa3a6, 0x0007, 0x00c0, + 0x296b, 0x2418, 0x8507, 0xa084, 0x000f, 0x0079, 0x29af, 0x3028, + 0x3119, 0x3144, 0x33b6, 0x379f, 0x3819, 0x38ce, 0x395f, 0x3a4d, + 0x3b3c, 0x29c2, 0x29bf, 0x2df9, 0x2f1c, 0x3770, 0x29bf, 0x1078, + 0x296b, 0x007c, 0xa006, 0x0078, 0x29cc, 0x7808, 0xc08d, 0x780a, + 0xa006, 0x7002, 0x704e, 0x7046, 0x70d2, 0x7060, 0xa005, 0x00c0, + 0x2b32, 0x7064, 0xa084, 0x0007, 0x0079, 0x29d6, 0x29de, 0x2a51, + 0x2a5a, 0x2a65, 0x2a70, 0x2b18, 0x2a7b, 0x2a51, 0x7830, 0xd0bc, + 0x00c0, 0x29c1, 0x71d4, 0xd1bc, 0x00c0, 0x29c1, 0xd1b4, 0x00c0, + 0x2a2e, 0x70a4, 0xa086, 0x0001, 0x0040, 0x29c1, 0x70b4, 0xa06d, + 0x6800, 0xa065, 0xa055, 0x789b, 0x0010, 0x6b0c, 0x7baa, 0x6808, + 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, 0xa886, 0x0001, 0x0040, + 0x2a04, 0x69bc, 0x7daa, 0x79aa, 0x68c0, 0xa04d, 0x6e1c, 0x2001, + 0x0010, 0x0078, 0x2c8c, 0x7060, 0xa005, 0x00c0, 0x29c1, 0x0c7e, + 0x0d7e, 0x70b4, 0xa06d, 0x6800, 0xa065, 0xa055, 0x789b, 0x0010, + 0x6b0c, 0x7baa, 0x6808, 0xa045, 0x6d10, 0x6804, 0xa06d, 0xa05d, + 0xa886, 0x0001, 0x0040, 0x2a27, 0x69bc, 0x7daa, 0x79aa, 0x68c0, + 0xa04d, 0x6e1c, 0x2001, 0x0020, 0x0078, 0x2c8c, 0x1078, 0x4360, + 0x00c0, 0x29c1, 0x781b, 0x005b, 0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, - 0x780a, 0x70a4, 0x8000, 0x70a6, 0x74b4, 0xa490, 0x0005, 0x70ac, - 0xa206, 0x00c0, 0x2ce4, 0x72a8, 0x72b6, 0x2900, 0x705a, 0x68bc, - 0x7042, 0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, - 0x007c, 0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, - 0x7882, 0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, - 0x005b, 0x2900, 0x705a, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, - 0xa605, 0x0040, 0x2d1c, 0x70d4, 0xa084, 0x2700, 0xa086, 0x2300, - 0x00c0, 0x2d16, 0x2009, 0x0000, 0x0078, 0x2d18, 0x2009, 0x0001, - 0xa284, 0x000f, 0x1079, 0x2d20, 0xad80, 0x0009, 0x7046, 0x007c, - 0x2d28, 0x45f7, 0x45f7, 0x45e4, 0x45f7, 0x2d28, 0x2d28, 0x2d28, - 0x1078, 0x28ec, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e, 0x2079, - 0x4a00, 0x78ac, 0x0f7f, 0xd084, 0x0040, 0x2d4e, 0x7064, 0xa086, - 0x0001, 0x00c0, 0x2d3e, 0x7066, 0x0078, 0x2e27, 0x7064, 0xa086, - 0x0005, 0x00c0, 0x2d4c, 0x707c, 0x2068, 0x681b, 0x0004, 0x6817, - 0x0000, 0x6820, 0xc09d, 0x6822, 0x7067, 0x0000, 0x70a7, 0x0000, - 0x70a8, 0x70b2, 0x70b6, 0x70d4, 0xd0b4, 0x0040, 0x2d64, 0xc0b4, + 0x780a, 0x68bc, 0x7042, 0xc1b4, 0x71d6, 0x70b8, 0xa065, 0x68c0, + 0x705a, 0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, + 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a59, 0x781b, 0x0047, 0x7003, + 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a64, 0x2011, 0x000c, + 0x1078, 0x2a8b, 0x7003, 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, + 0x2a6f, 0x2011, 0x0006, 0x1078, 0x2a8b, 0x7003, 0x0004, 0x007c, + 0x1078, 0x4360, 0x00c0, 0x2a7a, 0x2011, 0x000d, 0x1078, 0x2a8b, + 0x7003, 0x0004, 0x007c, 0x1078, 0x4360, 0x00c0, 0x2a8a, 0x2011, + 0x0006, 0x1078, 0x2a8b, 0x707c, 0x707f, 0x0000, 0x2068, 0x704e, + 0x7003, 0x0001, 0x007c, 0x7174, 0xc1fc, 0x8107, 0x7882, 0x789b, + 0x0010, 0xa286, 0x000c, 0x00c0, 0x2a9a, 0x7aaa, 0x2001, 0x0001, + 0x0078, 0x2aaf, 0xa18c, 0x001f, 0xa18d, 0x00c0, 0x79aa, 0xa286, + 0x000d, 0x0040, 0x2aa8, 0x7aaa, 0x2001, 0x0002, 0x0078, 0x2aaf, + 0x78ab, 0x0020, 0x7178, 0x79aa, 0x7aaa, 0x2001, 0x0004, 0x789b, + 0x0060, 0x78aa, 0x785b, 0x0004, 0x781b, 0x0116, 0x1078, 0x4383, + 0x7083, 0x000f, 0x70d4, 0xd0b4, 0x0040, 0x2acb, 0xc0b4, 0x70d6, + 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, + 0x8001, 0x601a, 0x0c7f, 0x007c, 0x7014, 0xa005, 0x00c0, 0x2ada, + 0x70d4, 0xd0b4, 0x0040, 0x2adb, 0x70b8, 0xac06, 0x00c0, 0x2adb, + 0x1078, 0x2aba, 0x007c, 0x017e, 0x71a4, 0xa186, 0x0001, 0x0040, + 0x2b0d, 0x0d7e, 0x027e, 0x2100, 0x2011, 0x0001, 0xa212, 0x70b4, + 0x2068, 0x6800, 0xac06, 0x0040, 0x2af4, 0x8211, 0x0040, 0x2b0b, + 0x1078, 0x2b0f, 0x0078, 0x2ae9, 0x0c7e, 0x2100, 0x2011, 0x0001, + 0xa212, 0x70b4, 0x2068, 0x6800, 0x2060, 0x6008, 0xa084, 0xfbef, + 0x600a, 0x8211, 0x0040, 0x2b08, 0x1078, 0x2b0f, 0x0078, 0x2afb, + 0x70a7, 0x0001, 0x0c7f, 0x027f, 0x0d7f, 0x017f, 0x007c, 0xade8, + 0x0005, 0x70ac, 0xad06, 0x00c0, 0x2b17, 0x70a8, 0x2068, 0x007c, + 0x1078, 0x4360, 0x00c0, 0x29c1, 0x707c, 0x2068, 0x7774, 0x1078, + 0x41fe, 0x2c50, 0x1078, 0x4442, 0x789b, 0x0010, 0x6814, 0xa084, + 0x001f, 0xc0bd, 0x78aa, 0x6e1c, 0x2041, 0x0001, 0x2001, 0x0004, + 0x0078, 0x2c92, 0x1078, 0x4360, 0x00c0, 0x29c1, 0x789b, 0x0010, + 0x7060, 0x2068, 0x6f14, 0x70d4, 0xd0b4, 0x0040, 0x2b4c, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, - 0x6018, 0x8001, 0x601a, 0x0c7f, 0x157e, 0x2011, 0x0004, 0x7164, - 0xa186, 0x0001, 0x0040, 0x2d7d, 0xa186, 0x0007, 0x00c0, 0x2d74, - 0x701f, 0x0005, 0x0078, 0x2d7d, 0x701f, 0x0001, 0x7067, 0x0000, - 0x70d4, 0xc0dd, 0x70d6, 0x0078, 0x2d7f, 0x7067, 0x0000, 0x2001, - 0x4a0a, 0x2004, 0xa084, 0x00ff, 0xa086, 0x0018, 0x0040, 0x2d8f, - 0x7018, 0x7016, 0xa005, 0x00c0, 0x2d8f, 0x70a7, 0x0001, 0x1078, - 0x4326, 0x20a9, 0x0010, 0x2039, 0x0000, 0x1078, 0x3edb, 0xa7b8, - 0x0100, 0x00f0, 0x2d95, 0x7000, 0x0079, 0x2d9e, 0x2dcd, 0x2db3, - 0x2db3, 0x2da8, 0x2dcd, 0x2dcd, 0x2dcd, 0x2da6, 0x1078, 0x28ec, - 0x7060, 0xa005, 0x0040, 0x2dcd, 0xad06, 0x00c0, 0x2db3, 0x6800, - 0x7062, 0x0078, 0x2dc5, 0x6820, 0xd084, 0x00c0, 0x2dc1, 0x6f14, - 0x1078, 0x3fe1, 0x6008, 0xc0d4, 0x600a, 0x1078, 0x3bb5, 0x0078, - 0x2dc5, 0x705c, 0x2060, 0x6800, 0x6002, 0x6a1a, 0x6817, 0x0000, - 0x6820, 0xc09d, 0x6822, 0x1078, 0x202a, 0xb284, 0x0400, 0x0040, - 0x2dd5, 0x2021, 0x91d0, 0x0078, 0x2dd7, 0x2021, 0x90c0, 0x1078, - 0x2e2c, 0xb284, 0x0400, 0x0040, 0x2de1, 0x2021, 0x4a98, 0x0078, - 0x2de3, 0x2021, 0x4a58, 0x1078, 0x2e2c, 0x20a9, 0x0101, 0xb284, - 0x0400, 0x0040, 0x2def, 0x2021, 0x90d0, 0x0078, 0x2df1, 0x2021, - 0x8fc0, 0x1078, 0x2e2c, 0x8420, 0x00f0, 0x2df1, 0xb284, 0x0300, - 0x0040, 0x2dfe, 0x2061, 0x4fc0, 0x0078, 0x2e00, 0x2061, 0x6fc0, - 0x2021, 0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0040, 0x2e1d, - 0x6018, 0x017e, 0x007e, 0x2011, 0x4a02, 0x220c, 0xa102, 0x2012, - 0x007f, 0x017f, 0xa102, 0x0050, 0x2e1d, 0x6012, 0x00c0, 0x2e1d, - 0x2011, 0x4a04, 0x2204, 0xc0a5, 0x2012, 0x601b, 0x0000, 0xace0, - 0x0010, 0x00f0, 0x2e04, 0x8421, 0x00c0, 0x2e02, 0x157f, 0x7003, - 0x0000, 0x704f, 0x0000, 0x007c, 0x047e, 0x2404, 0xa005, 0x0040, - 0x2e3f, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817, 0x0000, 0x6820, - 0xc09d, 0x6822, 0x1078, 0x202a, 0x007f, 0x0078, 0x2e2e, 0x047f, - 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x2e49, 0x1078, - 0x28ec, 0x2300, 0x0079, 0x2e4c, 0x2e4f, 0x2eda, 0x2ef7, 0xa282, - 0x0002, 0x0040, 0x2e55, 0x1078, 0x28ec, 0x7064, 0x7067, 0x0000, - 0x7083, 0x0000, 0x0079, 0x2e5c, 0x2e64, 0x2e64, 0x2e66, 0x2ea6, - 0x3bf1, 0x2e64, 0x2ea6, 0x2e64, 0x1078, 0x28ec, 0x7774, 0x1078, - 0x3edb, 0x7774, 0xa7bc, 0x8f00, 0x1078, 0x3fe1, 0x6018, 0xa005, - 0x0040, 0x2e9d, 0xd7fc, 0x00c0, 0x2e79, 0x2021, 0x90c0, 0x0078, - 0x2e7b, 0x2021, 0x91d0, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078, - 0x2f12, 0x0040, 0x2e9d, 0x157e, 0x20a9, 0x0101, 0xd7fc, 0x00c0, - 0x2e8d, 0x2021, 0x8fc0, 0x0078, 0x2e8f, 0x2021, 0x90d0, 0x047e, - 0x2009, 0x0005, 0x2011, 0x0010, 0x1078, 0x2f12, 0x047f, 0x0040, - 0x2e9c, 0x8420, 0x00f0, 0x2e8f, 0x157f, 0x8738, 0xa784, 0x001f, - 0x00c0, 0x2e6c, 0x0078, 0x2946, 0x0078, 0x2946, 0x7774, 0x1078, - 0x3fe1, 0x6018, 0xa005, 0x0040, 0x2ed8, 0xd7fc, 0x00c0, 0x2eb4, - 0x2021, 0x90c0, 0x0078, 0x2eb6, 0x2021, 0x91d0, 0x2009, 0x0005, - 0x2011, 0x0020, 0x1078, 0x2f12, 0x0040, 0x2ed8, 0x157e, 0x20a9, - 0x0101, 0xd7fc, 0x00c0, 0x2ec8, 0x2021, 0x8fc0, 0x0078, 0x2eca, - 0x2021, 0x90d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020, 0x1078, - 0x2f12, 0x047f, 0x0040, 0x2ed7, 0x8420, 0x00f0, 0x2eca, 0x157f, - 0x0078, 0x2946, 0x2200, 0x0079, 0x2edd, 0x2ee0, 0x2ee2, 0x2ee2, - 0x1078, 0x28ec, 0x2009, 0x0012, 0x7064, 0xa086, 0x0002, 0x0040, - 0x2eeb, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0040, 0x2ef0, 0x691a, - 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078, 0x40c9, 0x2200, - 0x0079, 0x2efa, 0x2eff, 0x2ee2, 0x2efd, 0x1078, 0x28ec, 0x1078, - 0x4326, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3b7a, 0x1078, 0x3bd2, - 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3b6b, 0x0040, 0x3b7a, - 0x0078, 0x2946, 0x2404, 0xa005, 0x0040, 0x2f41, 0x2068, 0x2d04, - 0x007e, 0x6814, 0xa706, 0x0040, 0x2f21, 0x2d20, 0x007f, 0x0078, - 0x2f13, 0x007f, 0x2022, 0x691a, 0x6817, 0x0000, 0x6820, 0xa205, - 0x6822, 0x1078, 0x202a, 0x2021, 0x4a02, 0x241c, 0x8319, 0x2322, - 0x6010, 0x8001, 0x6012, 0x00c0, 0x2f3a, 0x2021, 0x4a04, 0x2404, - 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x1078, 0x3bd2, - 0x007c, 0xa085, 0x0001, 0x0078, 0x2f40, 0x2300, 0x0079, 0x2f48, - 0x2f4d, 0x2f4b, 0x2fce, 0x1078, 0x28ec, 0x78e4, 0xa005, 0x00d0, - 0x2f84, 0x3208, 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, - 0x0040, 0x2f5e, 0xa18c, 0x0300, 0x0078, 0x2f60, 0xa18c, 0x0400, - 0x0040, 0x2f66, 0x0018, 0x2942, 0x0078, 0x2f68, 0x0028, 0x2942, - 0x2008, 0xa084, 0x0030, 0x00c0, 0x2f70, 0x781b, 0x005b, 0x007c, - 0x78ec, 0xa084, 0x0003, 0x0040, 0x2f6d, 0x2100, 0xa084, 0x0007, - 0x0079, 0x2f7a, 0x2fae, 0x2fb8, 0x2fa3, 0x2f82, 0x4111, 0x4111, - 0x2f82, 0x2fc3, 0x1078, 0x28ec, 0x7000, 0xa086, 0x0004, 0x00c0, - 0x2f9e, 0x7064, 0xa086, 0x0002, 0x00c0, 0x2f94, 0x2011, 0x0002, - 0x2019, 0x0000, 0x0078, 0x2e43, 0x7064, 0xa086, 0x0006, 0x0040, - 0x2f8e, 0x7064, 0xa086, 0x0004, 0x0040, 0x2f8e, 0x79e4, 0x2001, - 0x0003, 0x0078, 0x3304, 0x6818, 0xd0fc, 0x0040, 0x2fa9, 0x681b, - 0x001d, 0x1078, 0x3eae, 0x781b, 0x0061, 0x007c, 0x6818, 0xd0fc, - 0x0040, 0x2fb4, 0x681b, 0x001d, 0x1078, 0x3eae, 0x0078, 0x40ed, - 0x6818, 0xd0fc, 0x0040, 0x2fbe, 0x681b, 0x001d, 0x1078, 0x3eae, - 0x781b, 0x00ef, 0x007c, 0x6818, 0xd0fc, 0x0040, 0x2fc9, 0x681b, - 0x001d, 0x1078, 0x3eae, 0x781b, 0x00bf, 0x007c, 0xa584, 0x000f, - 0x00c0, 0x2feb, 0x7000, 0x0079, 0x2fd5, 0x2946, 0x2fdd, 0x2fdf, - 0x3b7a, 0x3b7a, 0x3b7a, 0x2fdd, 0x2fdd, 0x1078, 0x28ec, 0x1078, - 0x3bd2, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3b6b, 0x0040, - 0x3b7a, 0x0078, 0x2946, 0x78e4, 0xa005, 0x00d0, 0x2f84, 0x3208, - 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x2ffc, - 0xa18c, 0x0300, 0x0078, 0x2ffe, 0xa18c, 0x0400, 0x0040, 0x3004, - 0x0018, 0x2f84, 0x0078, 0x3006, 0x0028, 0x2f84, 0x2008, 0xa084, - 0x0030, 0x00c0, 0x300e, 0x781b, 0x005b, 0x007c, 0x78ec, 0xa084, - 0x0003, 0x0040, 0x300b, 0x2100, 0xa184, 0x0007, 0x0079, 0x3018, - 0x3027, 0x302b, 0x3022, 0x3020, 0x4111, 0x4111, 0x3020, 0x410b, - 0x1078, 0x28ec, 0x1078, 0x3eb6, 0x781b, 0x0061, 0x007c, 0x1078, - 0x3eb6, 0x0078, 0x40ed, 0x1078, 0x3eb6, 0x781b, 0x00ef, 0x007c, - 0x1078, 0x3eb6, 0x781b, 0x00bf, 0x007c, 0x2300, 0x0079, 0x3038, - 0x303d, 0x303b, 0x303f, 0x1078, 0x28ec, 0x0078, 0x37bd, 0x681b, - 0x0016, 0x78a3, 0x0000, 0x79e4, 0xa184, 0x0030, 0x0040, 0x37bd, - 0x78ec, 0xa084, 0x0003, 0x0040, 0x37bd, 0xa184, 0x0100, 0x0040, - 0x3043, 0xa184, 0x0007, 0x0079, 0x3055, 0x305d, 0x302b, 0x2fa3, - 0x40c9, 0x4111, 0x4111, 0x40c9, 0x410b, 0x1078, 0x40d5, 0x007c, - 0xa282, 0x0005, 0x0050, 0x3066, 0x1078, 0x28ec, 0x2300, 0x0079, - 0x3069, 0x306c, 0x328b, 0x3296, 0x2200, 0x0079, 0x306f, 0x3089, - 0x3076, 0x3089, 0x3074, 0x326e, 0x1078, 0x28ec, 0x789b, 0x0018, - 0x78a8, 0xa084, 0x00ff, 0xa082, 0x0020, 0x0048, 0x3e9d, 0xa08a, - 0x0004, 0x00c8, 0x3e9d, 0x0079, 0x3085, 0x3e9d, 0x3e9d, 0x3e9d, - 0x3e47, 0x789b, 0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x309a, - 0x0078, 0x3e9d, 0x7000, 0xa005, 0x00c0, 0x3090, 0x2011, 0x0004, - 0x0078, 0x3998, 0xa184, 0x00ff, 0xa08a, 0x0010, 0x00c8, 0x3e9d, - 0x0079, 0x30a2, 0x30b4, 0x30b2, 0x30c9, 0x30cd, 0x318f, 0x3e9d, - 0x3e9d, 0x3191, 0x3e9d, 0x3e9d, 0x326a, 0x326a, 0x3e9d, 0x3e9d, - 0x3e9d, 0x326c, 0x1078, 0x28ec, 0xd6e4, 0x0040, 0x30bf, 0x2001, - 0x0300, 0x8000, 0x8000, 0x783a, 0x781b, 0x00ba, 0x007c, 0x6818, - 0xd0fc, 0x0040, 0x30c7, 0x681b, 0x001d, 0x0078, 0x30b7, 0x0078, - 0x40c9, 0x681b, 0x001d, 0x0078, 0x3ea7, 0x6920, 0x6922, 0xa684, - 0x1800, 0x00c0, 0x3121, 0x6820, 0xd084, 0x00c0, 0x3127, 0x6818, - 0xa086, 0x0008, 0x00c0, 0x30de, 0x681b, 0x0000, 0xd6d4, 0x0040, - 0x318c, 0xd6bc, 0x0040, 0x311e, 0x7087, 0x0000, 0x6818, 0xa084, - 0x003f, 0xa08a, 0x000d, 0x0050, 0x311e, 0xa08a, 0x000c, 0x7186, - 0x2001, 0x000c, 0x800c, 0x718a, 0x789b, 0x0061, 0x78aa, 0x157e, - 0x137e, 0x147e, 0x017e, 0x3208, 0xa18c, 0x0300, 0x0040, 0x3110, - 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x310c, - 0x20a1, 0x012b, 0x0078, 0x3112, 0x20a1, 0x022b, 0x0078, 0x3112, - 0x20a1, 0x012b, 0x017f, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, - 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x781b, 0x0064, - 0x007c, 0xd6e4, 0x0040, 0x3127, 0x781b, 0x0076, 0x007c, 0xa684, - 0x0060, 0x0040, 0x3189, 0xd6dc, 0x0040, 0x3189, 0xd6fc, 0x00c0, - 0x3133, 0x0078, 0x314a, 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, - 0x78d0, 0x801b, 0x00c8, 0x313d, 0x8000, 0xa084, 0x003f, 0xa108, - 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, - 0xa303, 0x68ae, 0xd6f4, 0x0040, 0x3150, 0xc6f4, 0x7e5a, 0x6eb6, - 0x7000, 0xa086, 0x0003, 0x00c0, 0x315e, 0x007e, 0x1078, 0x4326, - 0x1078, 0x45f7, 0x007f, 0x781b, 0x0073, 0x007c, 0xa006, 0x1078, - 0x46e5, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, - 0x316d, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, - 0x6ba6, 0x7bd6, 0x7bde, 0x2300, 0xa405, 0x00c0, 0x317d, 0xc6f5, - 0x7e5a, 0x6eb6, 0x781b, 0x0073, 0x007c, 0x781b, 0x0073, 0x2200, - 0xa115, 0x00c0, 0x3186, 0x1078, 0x45f7, 0x007c, 0x1078, 0x462d, - 0x007c, 0x781b, 0x0076, 0x007c, 0x781b, 0x0064, 0x007c, 0x1078, - 0x28ec, 0x0078, 0x31dd, 0x6920, 0xd1c4, 0x0040, 0x31a6, 0xc1c4, - 0x6922, 0x0c7e, 0x7058, 0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004, - 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, 0x31d1, 0xd1cc, 0x0040, - 0x31d1, 0xc1cc, 0x6922, 0x0c7e, 0x7058, 0x2060, 0x6000, 0xc0ec, - 0x6002, 0x6004, 0xc0a4, 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c, - 0x0040, 0x31d1, 0x1078, 0x3fdd, 0x1078, 0x3cda, 0x88ff, 0x0040, - 0x31d1, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, - 0xd6d4, 0x00c0, 0x31ce, 0x781b, 0x0061, 0x007c, 0x781b, 0x0075, - 0x007c, 0x7e58, 0xd6d4, 0x00c0, 0x31d8, 0x781b, 0x0064, 0x007c, - 0x781b, 0x0076, 0x007c, 0x0078, 0x3ea2, 0x2019, 0x0000, 0x7990, - 0xa18c, 0x0007, 0x00c0, 0x31eb, 0x6820, 0xa084, 0x0100, 0x0040, - 0x31db, 0x2009, 0x0008, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, - 0xa286, 0x0001, 0x00c0, 0x3207, 0x2300, 0x7ca8, 0xa400, 0x2018, - 0xa102, 0x0040, 0x31ff, 0x0048, 0x31ff, 0x0078, 0x3201, 0x0078, - 0x3193, 0x24a8, 0x7aa8, 0x00f0, 0x3201, 0x0078, 0x31ed, 0xa284, - 0x00f0, 0xa086, 0x0020, 0x00c0, 0x325b, 0x8318, 0x8318, 0x2300, - 0xa102, 0x0040, 0x3217, 0x0048, 0x3217, 0x0078, 0x3258, 0xa286, - 0x0023, 0x0040, 0x31db, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, - 0xa684, 0xfff1, 0xc0a5, 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, - 0x0c7e, 0x7058, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, - 0x0040, 0x3238, 0x1078, 0x3fdd, 0x1078, 0x3df6, 0x0078, 0x3246, - 0x0c7e, 0x7058, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, - 0x0040, 0x31d1, 0x1078, 0x3fdd, 0x1078, 0x3cda, 0x88ff, 0x0040, - 0x31d1, 0x789b, 0x0060, 0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, - 0x00c0, 0x3255, 0x781b, 0x0061, 0x007c, 0x781b, 0x0075, 0x007c, - 0x7aa8, 0x0078, 0x31ed, 0x8318, 0x2300, 0xa102, 0x0040, 0x3264, - 0x0048, 0x3264, 0x0078, 0x31ed, 0xa284, 0x0080, 0x00c0, 0x3ea7, - 0x0078, 0x3ea2, 0x0078, 0x3ea7, 0x0078, 0x3e9d, 0x7058, 0xa04d, - 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040, - 0x327b, 0x1078, 0x28ec, 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, - 0x00ff, 0xa08a, 0x0004, 0x00c8, 0x3e9d, 0x0079, 0x3287, 0x3e9d, - 0x3c2c, 0x3e9d, 0x3d9e, 0xa282, 0x0000, 0x00c0, 0x3291, 0x1078, - 0x28ec, 0x1078, 0x3eae, 0x781b, 0x0075, 0x007c, 0xa282, 0x0003, - 0x00c0, 0x329c, 0x1078, 0x28ec, 0xd4fc, 0x00c0, 0x32bc, 0x7064, - 0xa005, 0x0040, 0x32a5, 0x1078, 0x28ec, 0x6f14, 0x7776, 0xa7bc, - 0x8f00, 0x1078, 0x3fe1, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, - 0xa784, 0x001f, 0x00c0, 0x32a9, 0x1078, 0x3eb2, 0x7067, 0x0002, - 0x701f, 0x0009, 0x0078, 0x32be, 0x1078, 0x3ebe, 0x781b, 0x0075, - 0x007c, 0xa282, 0x0004, 0x0050, 0x32c7, 0x1078, 0x28ec, 0x2300, - 0x0079, 0x32ca, 0x32cd, 0x346b, 0x34ae, 0xa286, 0x0003, 0x0040, - 0x3304, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x71d4, 0xd1b4, 0x0078, - 0x32fc, 0x0040, 0x32fc, 0x7868, 0xa084, 0x00ff, 0x00c0, 0x32fc, - 0xa282, 0x0002, 0x00c8, 0x32fc, 0x0d7e, 0x783b, 0x8300, 0x781b, - 0x004c, 0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, - 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, - 0x2001, 0x0000, 0x0078, 0x3308, 0x783b, 0x1300, 0x781b, 0x004a, - 0x2001, 0x0000, 0x0078, 0x3308, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, - 0x704a, 0x68a0, 0xd0ec, 0x0040, 0x3310, 0x6008, 0xc08d, 0x600a, - 0xa284, 0x000f, 0x0079, 0x3314, 0x344b, 0x3321, 0x331e, 0x35ae, - 0x35f2, 0x2946, 0x331c, 0x331c, 0x1078, 0x28ec, 0x6008, 0xc0d4, - 0x600a, 0xd6e4, 0x00c0, 0x3328, 0x1078, 0x4326, 0x0040, 0x3404, - 0x7868, 0xa08c, 0x00ff, 0x0040, 0x3369, 0xa186, 0x0008, 0x00c0, - 0x333e, 0x1078, 0x3bd2, 0x6008, 0xc0a4, 0x600a, 0x1078, 0x3b6b, - 0x0040, 0x3369, 0x1078, 0x4326, 0x0078, 0x3353, 0xa186, 0x0028, - 0x00c0, 0x3369, 0x1078, 0x4326, 0x6008, 0xc0a4, 0x600a, 0x6018, - 0xa005, 0x0040, 0x3353, 0x8001, 0x601a, 0x0040, 0x3353, 0x8001, - 0x0040, 0x3353, 0x601e, 0x6820, 0xd084, 0x0040, 0x2946, 0xc084, - 0x6822, 0x705c, 0x0c7e, 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, - 0x6802, 0xa005, 0x2d00, 0x00c0, 0x3366, 0x6002, 0x6006, 0x0078, - 0x2946, 0x017e, 0x81ff, 0x00c0, 0x33b0, 0x7000, 0xa086, 0x0030, - 0x0040, 0x33b0, 0x71d4, 0xd1b4, 0x00c0, 0x3397, 0x7060, 0xa005, - 0x00c0, 0x33b0, 0x70a4, 0xa086, 0x0001, 0x0040, 0x33b0, 0x7003, + 0x6018, 0x8001, 0x601a, 0x0c7f, 0x1078, 0x41fe, 0x2c50, 0x1078, + 0x4442, 0x6824, 0xa005, 0x0040, 0x2b5d, 0xa082, 0x0006, 0x0048, + 0x2b5b, 0x0078, 0x2b5d, 0x6827, 0x0005, 0x6814, 0xa084, 0x001f, + 0xc0bd, 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, + 0x0078, 0x2c92, 0xc28d, 0x72d6, 0x72c0, 0xa200, 0xa015, 0x7154, + 0x8108, 0xa12a, 0x0048, 0x2b75, 0x71c0, 0x2164, 0x6504, 0x85ff, + 0x00c0, 0x2b8c, 0x7156, 0x8421, 0x00c0, 0x2b70, 0x70d4, 0xd08c, + 0x0040, 0x2b88, 0x70d0, 0xa005, 0x00c0, 0x2b88, 0x70d3, 0x000a, + 0x007c, 0x2200, 0x0078, 0x2b7a, 0x70d4, 0xc08c, 0x70d6, 0x70d3, + 0x0000, 0x6034, 0xa005, 0x00c0, 0x2b89, 0x6708, 0xa784, 0x073f, + 0x0040, 0x2bbb, 0xd7d4, 0x00c0, 0x2b89, 0xa784, 0x0021, 0x00c0, + 0x2b89, 0xa784, 0x0002, 0x0040, 0x2bac, 0xa784, 0x0004, 0x0040, + 0x2b89, 0xa7bc, 0xfffb, 0x670a, 0xa784, 0x0218, 0x00c0, 0x2b89, + 0xa784, 0x0100, 0x0040, 0x2bbb, 0x6018, 0xa005, 0x00c0, 0x2b89, + 0xa7bc, 0xfeff, 0x670a, 0x2568, 0x6823, 0x0000, 0x6e1c, 0xa684, + 0x000e, 0x6318, 0x0040, 0x2bcc, 0x601c, 0xa302, 0x0048, 0x2bcf, + 0x0040, 0x2bcf, 0x0078, 0x2b89, 0x83ff, 0x00c0, 0x2b89, 0x2d58, + 0x2c50, 0x7156, 0xd7bc, 0x00c0, 0x2bd8, 0x7028, 0x6022, 0x603a, + 0xc7bc, 0x670a, 0x68c0, 0xa065, 0xa04d, 0x6100, 0x2a60, 0x2041, + 0x0001, 0x6b14, 0xa39c, 0x001f, 0xa39d, 0x00c0, 0xd1fc, 0x0040, + 0x2bec, 0xd684, 0x0040, 0x2bee, 0xa39c, 0xffbf, 0xd6a4, 0x0040, + 0x2bf3, 0xa39d, 0x0020, 0xa684, 0x000e, 0x00c0, 0x2c3e, 0xc7a5, + 0x670a, 0x2c00, 0x68c6, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c12, + 0x70d4, 0xd0b4, 0x00c0, 0x2c12, 0x7000, 0xa082, 0x0002, 0x00c8, + 0x2c12, 0x7830, 0xd0bc, 0x00c0, 0x2c12, 0x789b, 0x0010, 0x7baa, + 0x0078, 0x2c8a, 0x8739, 0x77a6, 0x2750, 0x77b0, 0xa7b0, 0x0005, + 0x70ac, 0xa606, 0x00c0, 0x2c1d, 0x76a8, 0x76b2, 0x2c3a, 0x8738, + 0x2d3a, 0x8738, 0x283a, 0x8738, 0x233a, 0x8738, 0x253a, 0x7830, + 0xd0bc, 0x0040, 0x2c35, 0x2091, 0x8000, 0x2091, 0x303d, 0x70d4, + 0xa084, 0x303d, 0x2091, 0x8000, 0x2090, 0xaad5, 0x0000, 0x0040, + 0x2c3d, 0x8421, 0x2200, 0x00c0, 0x2b6f, 0x007c, 0xd1dc, 0x0040, + 0x3e00, 0x2029, 0x0020, 0xd69c, 0x00c0, 0x2c4b, 0x8528, 0xd68c, + 0x00c0, 0x2c4b, 0x8528, 0x8840, 0x6f14, 0x610c, 0x8108, 0xa18c, + 0x00ff, 0x70cc, 0xa160, 0x2c64, 0x8cff, 0x0040, 0x2c6a, 0x6014, + 0xa706, 0x00c0, 0x2c53, 0x60b8, 0x8001, 0x60ba, 0x00c0, 0x2c4e, + 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x2200, 0x8421, 0x00c0, + 0x2b6f, 0x007c, 0x2a60, 0x610e, 0x69be, 0x2c00, 0x68c6, 0x8840, + 0x6008, 0xc0d5, 0x600a, 0x77a4, 0xa786, 0x0001, 0x00c0, 0x2c12, + 0x70d4, 0xd0b4, 0x00c0, 0x2c12, 0x7000, 0xa082, 0x0002, 0x00c8, + 0x2c12, 0x7830, 0xd0bc, 0x00c0, 0x2c12, 0x789b, 0x0010, 0x7baa, + 0x7daa, 0x79aa, 0x2001, 0x0002, 0x007e, 0x6018, 0x8000, 0x601a, + 0x0078, 0x2c93, 0x007e, 0x2960, 0x6104, 0x2a60, 0xa184, 0x0018, + 0x0040, 0x2caf, 0xa184, 0x0010, 0x0040, 0x2ca2, 0x1078, 0x4011, + 0x00c0, 0x2cd4, 0xa184, 0x0008, 0x0040, 0x2caf, 0x69a0, 0xa184, + 0x0600, 0x00c0, 0x2caf, 0x1078, 0x3ef5, 0x0078, 0x2cd4, 0x69a0, + 0xa184, 0x1e00, 0x0040, 0x2cdf, 0xa184, 0x0800, 0x0040, 0x2cc8, + 0x0c7e, 0x2960, 0x6000, 0xa085, 0x2000, 0x6002, 0x6104, 0xa18d, + 0x0010, 0x6106, 0x0c7f, 0x1078, 0x4011, 0x00c0, 0x2cd4, 0x69a0, + 0xa184, 0x0200, 0x0040, 0x2cd0, 0x1078, 0x3f54, 0x0078, 0x2cd4, + 0xa184, 0x0400, 0x00c0, 0x2cab, 0x69a0, 0xa184, 0x1000, 0x0040, + 0x2cdf, 0x6914, 0xa18c, 0xff00, 0x810f, 0x1078, 0x279f, 0x027f, + 0xa68c, 0x00e0, 0xa684, 0x0060, 0x0040, 0x2cec, 0xa086, 0x0060, + 0x00c0, 0x2cec, 0xa18d, 0x4000, 0xa18d, 0x0104, 0x69b6, 0x789b, + 0x0060, 0x2800, 0x78aa, 0x6818, 0xc0fd, 0x681a, 0xd6bc, 0x0040, + 0x2d07, 0xc0fc, 0x7087, 0x0000, 0xa08a, 0x000d, 0x0050, 0x2d05, + 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, 0x78aa, + 0x3518, 0x3340, 0x3428, 0x8000, 0x80ac, 0xaf80, 0x002b, 0x20a0, + 0x789b, 0x0000, 0xad80, 0x000b, 0x2098, 0x53a6, 0x23a8, 0x2898, + 0x25a0, 0xa286, 0x0020, 0x00c0, 0x2d3f, 0x70d4, 0xc0b5, 0x70d6, + 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x6814, 0xc0fc, 0x8007, 0x7882, + 0xa286, 0x0002, 0x0040, 0x2d75, 0x70a4, 0x8000, 0x70a6, 0x74b4, + 0xa498, 0x0005, 0x70ac, 0xa306, 0x00c0, 0x2d37, 0x73a8, 0x73b6, + 0xa286, 0x0010, 0x0040, 0x29c1, 0x0d7f, 0x0c7f, 0x007c, 0x7000, + 0xa005, 0x00c0, 0x2d1d, 0xa286, 0x0002, 0x00c0, 0x2d8f, 0x1078, + 0x4360, 0x00c0, 0x2d1d, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x2091, + 0x8000, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, + 0x6898, 0x78d2, 0x78da, 0x2091, 0x8001, 0x7808, 0xc08d, 0x780a, + 0x127e, 0x0d7e, 0x0c7e, 0x70d4, 0xa084, 0x2700, 0x2090, 0x0c7f, + 0x0d7f, 0x127f, 0x2900, 0x705a, 0x68bc, 0x7042, 0x7003, 0x0002, + 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x7830, 0xd0bc, 0x0040, + 0x2d81, 0x2091, 0x303d, 0x70d4, 0xa084, 0x303d, 0x2091, 0x8000, + 0x2090, 0x70a4, 0xa005, 0x00c0, 0x2d86, 0x007c, 0x8421, 0x0040, + 0x2d85, 0x7250, 0x70c0, 0xa200, 0xa015, 0x0078, 0x2b6f, 0xa286, + 0x0010, 0x00c0, 0x2dc0, 0x1078, 0x4360, 0x00c0, 0x2d1d, 0x6814, + 0xc0fc, 0x8007, 0x7882, 0x781b, 0x005b, 0x68b4, 0x785a, 0x6894, + 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0x7808, 0xc08d, 0x780a, + 0x70a4, 0x8000, 0x70a6, 0x74b4, 0xa490, 0x0005, 0x70ac, 0xa206, + 0x00c0, 0x2db3, 0x72a8, 0x72b6, 0x2900, 0x705a, 0x68bc, 0x7042, + 0x7003, 0x0002, 0x2d00, 0x704e, 0xad80, 0x0009, 0x7046, 0x007c, + 0x6bb4, 0xa39d, 0x2000, 0x7b5a, 0x6814, 0xc0fc, 0x8007, 0x7882, + 0x6b94, 0x7bd6, 0x7bde, 0x6e98, 0x7ed2, 0x7eda, 0x781b, 0x005b, + 0x2900, 0x705a, 0x7202, 0x7808, 0xc08d, 0x780a, 0x2300, 0xa605, + 0x0040, 0x2deb, 0x70d4, 0xa084, 0x2700, 0xa086, 0x2300, 0x00c0, + 0x2de5, 0x2009, 0x0000, 0x0078, 0x2de7, 0x2009, 0x0001, 0xa284, + 0x000f, 0x1079, 0x2def, 0xad80, 0x0009, 0x7046, 0x007c, 0x2df7, + 0x48bd, 0x48bd, 0x48aa, 0x48bd, 0x2df7, 0x2df7, 0x2df7, 0x1078, + 0x296b, 0x7808, 0xa084, 0xfffd, 0x780a, 0x1078, 0x295e, 0x0f7e, + 0x2079, 0x4e00, 0x78ac, 0x0f7f, 0xd084, 0x0040, 0x2e21, 0x7064, + 0xa086, 0x0001, 0x00c0, 0x2e0f, 0x7066, 0x0078, 0x2ef8, 0x7064, + 0xa086, 0x0005, 0x00c0, 0x2e1f, 0x707c, 0x2068, 0x681b, 0x0004, + 0x6817, 0x0000, 0x6820, 0xa084, 0x00ff, 0xc09d, 0x6822, 0x7067, + 0x0000, 0x70a7, 0x0000, 0x70a8, 0x70b2, 0x70b6, 0x1078, 0x2aba, + 0x157e, 0x2011, 0x0004, 0x7164, 0xa186, 0x0001, 0x0040, 0x2e41, + 0xa186, 0x0007, 0x00c0, 0x2e38, 0x701f, 0x0005, 0x0078, 0x2e41, + 0x701f, 0x0001, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078, + 0x2e43, 0x7067, 0x0000, 0x2001, 0x4e0a, 0x2004, 0xa084, 0x00ff, + 0xa086, 0x0018, 0x0040, 0x2e53, 0x7018, 0x7016, 0xa005, 0x00c0, + 0x2e53, 0x70a7, 0x0001, 0x067e, 0x1078, 0x4586, 0x20a9, 0x0010, + 0x2039, 0x0000, 0x1078, 0x40f8, 0xa7b8, 0x0100, 0x00f0, 0x2e5a, + 0x067f, 0x7000, 0x0079, 0x2e64, 0x2e9e, 0x2e79, 0x2e79, 0x2e6e, + 0x2e9e, 0x2e9e, 0x2e9e, 0x2e6c, 0x1078, 0x296b, 0x7060, 0xa005, + 0x0040, 0x2e9e, 0xad06, 0x00c0, 0x2e79, 0x6800, 0x7062, 0x0078, + 0x2e8b, 0x6820, 0xd084, 0x00c0, 0x2e87, 0x6f14, 0x1078, 0x41fe, + 0x6008, 0xc0d4, 0x600a, 0x1078, 0x3dd0, 0x0078, 0x2e8b, 0x705c, + 0x2060, 0x6800, 0x6002, 0xa684, 0x5f00, 0x681e, 0x6818, 0xd0fc, + 0x0040, 0x2e93, 0x6a1a, 0x6817, 0x0000, 0x682b, 0x0000, 0x6820, + 0xa084, 0x00ff, 0xc09d, 0x6822, 0x1078, 0x202c, 0xb284, 0x0400, + 0x0040, 0x2ea6, 0x2021, 0x95d0, 0x0078, 0x2ea8, 0x2021, 0x94c0, + 0x1078, 0x2efd, 0xb284, 0x0400, 0x0040, 0x2eb2, 0x2021, 0x4e98, + 0x0078, 0x2eb4, 0x2021, 0x4e58, 0x1078, 0x2efd, 0x20a9, 0x0101, + 0xb284, 0x0400, 0x0040, 0x2ec0, 0x2021, 0x94d0, 0x0078, 0x2ec2, + 0x2021, 0x93c0, 0x1078, 0x2efd, 0x8420, 0x00f0, 0x2ec2, 0xb284, + 0x0300, 0x0040, 0x2ecf, 0x2061, 0x53c0, 0x0078, 0x2ed1, 0x2061, + 0x73c0, 0x2021, 0x0002, 0x20a9, 0x0100, 0x6110, 0x81ff, 0x0040, + 0x2eee, 0x6018, 0x017e, 0x007e, 0x2011, 0x4e02, 0x220c, 0xa102, + 0x2012, 0x007f, 0x017f, 0xa102, 0x0050, 0x2eee, 0x6012, 0x00c0, + 0x2eee, 0x2011, 0x4e04, 0x2204, 0xc0a5, 0x2012, 0x601b, 0x0000, + 0xace0, 0x0010, 0x00f0, 0x2ed5, 0x8421, 0x00c0, 0x2ed3, 0x157f, + 0x7003, 0x0000, 0x704f, 0x0000, 0x007c, 0x047e, 0x2404, 0xa005, + 0x0040, 0x2f18, 0x2068, 0x6800, 0x007e, 0x6a1a, 0x6817, 0x0000, + 0x682b, 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, + 0x00ff, 0xc09d, 0x6822, 0x1078, 0x202c, 0x007f, 0x0078, 0x2eff, + 0x047f, 0x2023, 0x0000, 0x007c, 0xa282, 0x0003, 0x0050, 0x2f22, + 0x1078, 0x296b, 0x2300, 0x0079, 0x2f25, 0x2f28, 0x2fb3, 0x2fd0, + 0xa282, 0x0002, 0x0040, 0x2f2e, 0x1078, 0x296b, 0x7064, 0x7067, + 0x0000, 0x7083, 0x0000, 0x0079, 0x2f35, 0x2f3d, 0x2f3d, 0x2f3f, + 0x2f7f, 0x3e0c, 0x2f3d, 0x2f7f, 0x2f3d, 0x1078, 0x296b, 0x7774, + 0x1078, 0x40f8, 0x7774, 0xa7bc, 0x8f00, 0x1078, 0x41fe, 0x6018, + 0xa005, 0x0040, 0x2f76, 0xd7fc, 0x00c0, 0x2f52, 0x2021, 0x94c0, + 0x0078, 0x2f54, 0x2021, 0x95d0, 0x2009, 0x0005, 0x2011, 0x0010, + 0x1078, 0x2feb, 0x0040, 0x2f76, 0x157e, 0x20a9, 0x0101, 0xd7fc, + 0x00c0, 0x2f66, 0x2021, 0x93c0, 0x0078, 0x2f68, 0x2021, 0x94d0, + 0x047e, 0x2009, 0x0005, 0x2011, 0x0010, 0x1078, 0x2feb, 0x047f, + 0x0040, 0x2f75, 0x8420, 0x00f0, 0x2f68, 0x157f, 0x8738, 0xa784, + 0x001f, 0x00c0, 0x2f45, 0x0078, 0x29c5, 0x0078, 0x29c5, 0x7774, + 0x1078, 0x41fe, 0x6018, 0xa005, 0x0040, 0x2fb1, 0xd7fc, 0x00c0, + 0x2f8d, 0x2021, 0x94c0, 0x0078, 0x2f8f, 0x2021, 0x95d0, 0x2009, + 0x0005, 0x2011, 0x0020, 0x1078, 0x2feb, 0x0040, 0x2fb1, 0x157e, + 0x20a9, 0x0101, 0xd7fc, 0x00c0, 0x2fa1, 0x2021, 0x93c0, 0x0078, + 0x2fa3, 0x2021, 0x94d0, 0x047e, 0x2009, 0x0005, 0x2011, 0x0020, + 0x1078, 0x2feb, 0x047f, 0x0040, 0x2fb0, 0x8420, 0x00f0, 0x2fa3, + 0x157f, 0x0078, 0x29c5, 0x2200, 0x0079, 0x2fb6, 0x2fb9, 0x2fbb, + 0x2fbb, 0x1078, 0x296b, 0x2009, 0x0012, 0x7064, 0xa086, 0x0002, + 0x0040, 0x2fc4, 0x2009, 0x000e, 0x6818, 0xd0fc, 0x0040, 0x2fc9, + 0x691a, 0x7067, 0x0000, 0x70d4, 0xc0dd, 0x70d6, 0x0078, 0x430d, + 0x2200, 0x0079, 0x2fd3, 0x2fd8, 0x2fbb, 0x2fd6, 0x1078, 0x296b, + 0x1078, 0x4586, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3d7e, 0x1078, + 0x3ded, 0x6008, 0xa084, 0xfbef, 0x600a, 0x1078, 0x3d6f, 0x0040, + 0x3d7e, 0x0078, 0x29c5, 0x2404, 0xa005, 0x0040, 0x3024, 0x2068, + 0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x2ffa, 0x2d20, 0x007f, + 0x0078, 0x2fec, 0x007f, 0x2022, 0x691a, 0x6817, 0x0000, 0x682b, + 0x0000, 0x68b4, 0xa084, 0x5f00, 0x681e, 0x6820, 0xa084, 0x00ff, + 0xa205, 0x6822, 0x1078, 0x202c, 0x2021, 0x4e02, 0x241c, 0x8319, + 0x2322, 0x6010, 0x8001, 0x6012, 0x00c0, 0x301b, 0x2021, 0x4e04, + 0x2404, 0xc0a5, 0x2022, 0x6008, 0xa084, 0xf9ef, 0x600a, 0x1078, + 0x2adb, 0x1078, 0x3ded, 0x007c, 0xa085, 0x0001, 0x0078, 0x3023, + 0x2300, 0x0079, 0x302b, 0x3030, 0x302e, 0x30b0, 0x1078, 0x296b, + 0x78e4, 0xa005, 0x00d0, 0x3066, 0x3208, 0x007e, 0x2001, 0x4e04, + 0x2004, 0xd0ec, 0x007f, 0x0040, 0x3041, 0xa18c, 0x0300, 0x0078, + 0x3043, 0xa18c, 0x0400, 0x0040, 0x3049, 0x0018, 0x29c1, 0x0078, + 0x304b, 0x0028, 0x29c1, 0x2008, 0xa084, 0x0030, 0x00c0, 0x3052, + 0x0078, 0x3770, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3050, 0x2100, + 0xa084, 0x0007, 0x0079, 0x305c, 0x3090, 0x309a, 0x3085, 0x3064, + 0x4355, 0x4355, 0x3064, 0x30a5, 0x1078, 0x296b, 0x7000, 0xa086, + 0x0004, 0x00c0, 0x3080, 0x7064, 0xa086, 0x0002, 0x00c0, 0x3076, + 0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x2f1c, 0x7064, 0xa086, + 0x0006, 0x0040, 0x3070, 0x7064, 0xa086, 0x0004, 0x0040, 0x3070, + 0x79e4, 0x2001, 0x0003, 0x0078, 0x33fa, 0x6818, 0xd0fc, 0x0040, + 0x308b, 0x681b, 0x001d, 0x1078, 0x40c8, 0x781b, 0x0064, 0x007c, + 0x6818, 0xd0fc, 0x0040, 0x3096, 0x681b, 0x001d, 0x1078, 0x40c8, + 0x0078, 0x4331, 0x6818, 0xd0fc, 0x0040, 0x30a0, 0x681b, 0x001d, + 0x1078, 0x40c8, 0x781b, 0x00f8, 0x007c, 0x6818, 0xd0fc, 0x0040, + 0x30ab, 0x681b, 0x001d, 0x1078, 0x40c8, 0x781b, 0x00c8, 0x007c, + 0xa584, 0x000f, 0x00c0, 0x30cf, 0x1078, 0x295e, 0x7000, 0x0079, + 0x30b9, 0x29c5, 0x30c1, 0x30c3, 0x3d7e, 0x3d7e, 0x3d7e, 0x30c1, + 0x30c1, 0x1078, 0x296b, 0x1078, 0x3ded, 0x6008, 0xa084, 0xfbef, + 0x600a, 0x1078, 0x3d6f, 0x0040, 0x3d7e, 0x0078, 0x29c5, 0x78e4, + 0xa005, 0x00d0, 0x3066, 0x3208, 0x007e, 0x2001, 0x4e04, 0x2004, + 0xd0ec, 0x007f, 0x0040, 0x30e0, 0xa18c, 0x0300, 0x0078, 0x30e2, + 0xa18c, 0x0400, 0x0040, 0x30e8, 0x0018, 0x3066, 0x0078, 0x30ea, + 0x0028, 0x3066, 0x2008, 0xa084, 0x0030, 0x00c0, 0x30f2, 0x781b, + 0x005b, 0x007c, 0x78ec, 0xa084, 0x0003, 0x0040, 0x30ef, 0x2100, + 0xa184, 0x0007, 0x0079, 0x30fc, 0x310b, 0x310f, 0x3106, 0x3104, + 0x4355, 0x4355, 0x3104, 0x434f, 0x1078, 0x296b, 0x1078, 0x40d0, + 0x781b, 0x0064, 0x007c, 0x1078, 0x40d0, 0x0078, 0x4331, 0x1078, + 0x40d0, 0x781b, 0x00f8, 0x007c, 0x1078, 0x40d0, 0x781b, 0x00c8, + 0x007c, 0x2300, 0x0079, 0x311c, 0x3121, 0x311f, 0x3123, 0x1078, + 0x296b, 0x0078, 0x395f, 0x681b, 0x0016, 0x78a3, 0x0000, 0x79e4, + 0xa184, 0x0030, 0x0040, 0x395f, 0x78ec, 0xa084, 0x0003, 0x0040, + 0x395f, 0xa184, 0x0100, 0x0040, 0x3127, 0xa184, 0x0007, 0x0079, + 0x3139, 0x3141, 0x310f, 0x3085, 0x430d, 0x4355, 0x4355, 0x430d, + 0x434f, 0x1078, 0x4319, 0x007c, 0xa282, 0x0005, 0x0050, 0x314a, + 0x1078, 0x296b, 0x2300, 0x0079, 0x314d, 0x3150, 0x3380, 0x338b, + 0x2200, 0x0079, 0x3153, 0x316d, 0x315a, 0x316d, 0x3158, 0x3363, + 0x1078, 0x296b, 0x789b, 0x0018, 0x78a8, 0xa084, 0x00ff, 0xa082, + 0x0020, 0x0048, 0x40b7, 0xa08a, 0x0004, 0x00c8, 0x40b7, 0x0079, + 0x3169, 0x40b7, 0x40b7, 0x40b7, 0x4061, 0x789b, 0x0018, 0x79a8, + 0xa184, 0x0080, 0x0040, 0x317e, 0x0078, 0x40b7, 0x7000, 0xa005, + 0x00c0, 0x3174, 0x2011, 0x0004, 0x0078, 0x3b4a, 0xa184, 0x00ff, + 0xa08a, 0x0010, 0x00c8, 0x40b7, 0x0079, 0x3186, 0x3198, 0x3196, + 0x31ad, 0x31b1, 0x3284, 0x40b7, 0x40b7, 0x3286, 0x40b7, 0x40b7, + 0x335f, 0x335f, 0x40b7, 0x40b7, 0x40b7, 0x3361, 0x1078, 0x296b, + 0xd6e4, 0x0040, 0x31a3, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a, + 0x781b, 0x00c3, 0x007c, 0x6818, 0xd0fc, 0x0040, 0x31ab, 0x681b, + 0x001d, 0x0078, 0x319b, 0x0078, 0x430d, 0x681b, 0x001d, 0x0078, + 0x40c1, 0x6920, 0x6922, 0xa684, 0x1800, 0x00c0, 0x3216, 0x6820, + 0xd084, 0x00c0, 0x321c, 0x6818, 0xa086, 0x0008, 0x00c0, 0x31c2, + 0x681b, 0x0000, 0xd6d4, 0x0040, 0x3281, 0xd6bc, 0x0040, 0x3202, + 0x7087, 0x0000, 0x6818, 0xa084, 0x003f, 0xa08a, 0x000d, 0x0050, + 0x3202, 0xa08a, 0x000c, 0x7186, 0x2001, 0x000c, 0x800c, 0x718a, + 0x789b, 0x0061, 0x78aa, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208, + 0xa18c, 0x0300, 0x0040, 0x31f4, 0x007e, 0x2001, 0x4e04, 0x2004, + 0xd0ec, 0x007f, 0x0040, 0x31f0, 0x20a1, 0x012b, 0x0078, 0x31f6, + 0x20a1, 0x022b, 0x0078, 0x31f6, 0x20a1, 0x012b, 0x017f, 0x789b, + 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, + 0x137f, 0x157f, 0x6038, 0xa005, 0x00c0, 0x3211, 0x681c, 0xa084, + 0x000e, 0x0040, 0x40c1, 0x1078, 0x40d7, 0x782b, 0x3008, 0x0078, + 0x3213, 0x8001, 0x603a, 0x781b, 0x0067, 0x007c, 0xd6e4, 0x0040, + 0x321c, 0x781b, 0x0079, 0x007c, 0xa684, 0x0060, 0x0040, 0x327e, + 0xd6dc, 0x0040, 0x327e, 0xd6fc, 0x00c0, 0x3228, 0x0078, 0x323f, + 0xc6fc, 0x7e5a, 0x6eb6, 0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8, + 0x3232, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, + 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xd6f4, + 0x0040, 0x3245, 0xc6f4, 0x7e5a, 0x6eb6, 0x7000, 0xa086, 0x0003, + 0x00c0, 0x3253, 0x007e, 0x1078, 0x4586, 0x1078, 0x48bd, 0x007f, + 0x781b, 0x0076, 0x007c, 0xa006, 0x1078, 0x49c3, 0x6ab0, 0x69ac, + 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, 0x3262, 0x2200, 0xa422, + 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x7cda, 0x6ba6, 0x7bd6, 0x7bde, + 0x2300, 0xa405, 0x00c0, 0x3272, 0xc6f5, 0x7e5a, 0x6eb6, 0x781b, + 0x0076, 0x007c, 0x781b, 0x0076, 0x2200, 0xa115, 0x00c0, 0x327b, + 0x1078, 0x48bd, 0x007c, 0x1078, 0x48f5, 0x007c, 0x781b, 0x0079, + 0x007c, 0x781b, 0x0067, 0x007c, 0x1078, 0x296b, 0x0078, 0x32d2, + 0x6920, 0xd1c4, 0x0040, 0x329b, 0xc1c4, 0x6922, 0x0c7e, 0x7058, + 0x2060, 0x6000, 0xc0e4, 0x6002, 0x6004, 0xa084, 0xfff5, 0x6006, + 0x0c7f, 0x0078, 0x32c6, 0xd1cc, 0x0040, 0x32c6, 0xc1cc, 0x6922, + 0x0c7e, 0x7058, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x6004, 0xc0a4, + 0x6006, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x32c6, 0x1078, + 0x41fa, 0x1078, 0x3ef5, 0x88ff, 0x0040, 0x32c6, 0x789b, 0x0060, + 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x32c3, + 0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7e58, 0xd6d4, + 0x00c0, 0x32cd, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079, 0x007c, + 0x0078, 0x40bc, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x00c0, + 0x32e0, 0x6820, 0xa084, 0x0100, 0x0040, 0x32d0, 0x2009, 0x0008, + 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, 0x00c0, + 0x32fc, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, 0x32f4, + 0x0048, 0x32f4, 0x0078, 0x32f6, 0x0078, 0x3288, 0x24a8, 0x7aa8, + 0x00f0, 0x32f6, 0x0078, 0x32e2, 0xa284, 0x00f0, 0xa086, 0x0020, + 0x00c0, 0x3350, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, 0x330c, + 0x0048, 0x330c, 0x0078, 0x334d, 0xa286, 0x0023, 0x0040, 0x32d0, + 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, 0xc0a5, + 0x2030, 0x7e5a, 0x6008, 0xc0a5, 0x600a, 0x0c7e, 0x7058, 0x2060, + 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd1a4, 0x0040, 0x332d, 0x1078, + 0x41fa, 0x1078, 0x4011, 0x0078, 0x333b, 0x0c7e, 0x7058, 0x2060, + 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xd19c, 0x0040, 0x32c6, 0x1078, + 0x41fa, 0x1078, 0x3ef5, 0x88ff, 0x0040, 0x32c6, 0x789b, 0x0060, + 0x2800, 0x78aa, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x334a, 0x781b, + 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x7aa8, 0x0078, 0x32e2, + 0x8318, 0x2300, 0xa102, 0x0040, 0x3359, 0x0048, 0x3359, 0x0078, + 0x32e2, 0xa284, 0x0080, 0x00c0, 0x40c1, 0x0078, 0x40bc, 0x0078, + 0x40c1, 0x0078, 0x40b7, 0x7058, 0xa04d, 0x789b, 0x0018, 0x78a8, + 0xa084, 0x00ff, 0xa08e, 0x0001, 0x0040, 0x3370, 0x1078, 0x296b, + 0x7aa8, 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, + 0x00c8, 0x40b7, 0x0079, 0x337c, 0x40b7, 0x3e46, 0x40b7, 0x3fb9, + 0xa282, 0x0000, 0x00c0, 0x3386, 0x1078, 0x296b, 0x1078, 0x40c8, + 0x781b, 0x0078, 0x007c, 0xa282, 0x0003, 0x00c0, 0x3391, 0x1078, + 0x296b, 0xd4fc, 0x00c0, 0x33b1, 0x7064, 0xa005, 0x0040, 0x339a, + 0x1078, 0x296b, 0x6f14, 0x7776, 0xa7bc, 0x8f00, 0x1078, 0x41fe, + 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x001f, 0x00c0, + 0x339e, 0x1078, 0x40cc, 0x7067, 0x0002, 0x701f, 0x0009, 0x0078, + 0x33b3, 0x1078, 0x40db, 0x781b, 0x0078, 0x007c, 0xa282, 0x0004, + 0x0050, 0x33bc, 0x1078, 0x296b, 0x2300, 0x0079, 0x33bf, 0x33c2, + 0x3582, 0x35c5, 0xa286, 0x0003, 0x0040, 0x33fa, 0x7200, 0x7cd8, + 0x7ddc, 0x7fd0, 0x71d4, 0xd1bc, 0x00c0, 0x33f2, 0xd1b4, 0x0040, + 0x33f2, 0x7868, 0xa084, 0x00ff, 0x00c0, 0x33f2, 0xa282, 0x0002, + 0x00c8, 0x33f2, 0x0d7e, 0x783b, 0x8300, 0x781b, 0x004c, 0x70bc, + 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, + 0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x2001, 0x0000, + 0x0078, 0x33fe, 0x783b, 0x1300, 0x781b, 0x004a, 0x2001, 0x0000, + 0x0078, 0x33fe, 0x7200, 0x7cd8, 0x7ddc, 0x7fd0, 0x704a, 0x68a0, + 0xd0ec, 0x0040, 0x3406, 0x6008, 0xc08d, 0x600a, 0xa284, 0x000f, + 0x0079, 0x340a, 0x3562, 0x3417, 0x3414, 0x36c8, 0x3754, 0x29c5, + 0x3412, 0x3412, 0x1078, 0x296b, 0x6008, 0xc0d4, 0x600a, 0xd6e4, + 0x0040, 0x341f, 0x7048, 0xa086, 0x0014, 0x00c0, 0x343f, 0x1078, + 0x4586, 0x2009, 0x0000, 0x6818, 0xd0fc, 0x0040, 0x3428, 0x7048, + 0xa086, 0x0014, 0x0040, 0x3439, 0x6818, 0xa086, 0x0008, 0x00c0, + 0x351a, 0x7858, 0xd09c, 0x0040, 0x351a, 0x6820, 0xd0ac, 0x0040, + 0x351a, 0x681b, 0x0014, 0x2009, 0x0002, 0x0078, 0x347e, 0x7868, + 0xa08c, 0x00ff, 0x0040, 0x347e, 0xa186, 0x0008, 0x00c0, 0x3455, + 0x6008, 0xc0a4, 0x600a, 0x1078, 0x3d6f, 0x0040, 0x347e, 0x1078, + 0x3ded, 0x1078, 0x4586, 0x0078, 0x3466, 0xa186, 0x0028, 0x00c0, + 0x347e, 0x6018, 0xa005, 0x0040, 0x3448, 0x8001, 0x0040, 0x3448, + 0x8001, 0x0040, 0x3448, 0x601e, 0x0078, 0x3448, 0x6820, 0xd084, + 0x0040, 0x29c5, 0xc084, 0x6822, 0x1078, 0x2acc, 0x705c, 0x0c7e, + 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00, + 0x00c0, 0x347b, 0x6002, 0x6006, 0x0078, 0x29c5, 0x017e, 0x81ff, + 0x00c0, 0x34c8, 0x7000, 0xa086, 0x0030, 0x0040, 0x34c8, 0x71d4, + 0xd1bc, 0x00c0, 0x34c8, 0xd1b4, 0x00c0, 0x34af, 0x7060, 0xa005, + 0x00c0, 0x34c8, 0x70a4, 0xa086, 0x0001, 0x0040, 0x34c8, 0x7003, 0x0000, 0x047e, 0x057e, 0x077e, 0x067e, 0x0c7e, 0x0d7e, 0x1078, - 0x296c, 0x0d7f, 0x0c7f, 0x067f, 0x077f, 0x057f, 0x047f, 0x71d4, - 0xd1b4, 0x00c0, 0x33b0, 0x7003, 0x0040, 0x0078, 0x33b0, 0x1078, - 0x411c, 0x00c0, 0x33b0, 0x781b, 0x005b, 0x0d7e, 0x70bc, 0xa06d, + 0x29ee, 0x0d7f, 0x0c7f, 0x067f, 0x077f, 0x057f, 0x047f, 0x71d4, + 0xd1b4, 0x00c0, 0x34c8, 0x7003, 0x0040, 0x0078, 0x34c8, 0x1078, + 0x4360, 0x00c0, 0x34c8, 0x781b, 0x005b, 0x0d7e, 0x70bc, 0xa06d, 0x68b4, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x7808, 0xc08d, 0x780a, 0x0d7f, - 0x1078, 0x34e8, 0x017f, 0x81ff, 0x0040, 0x3403, 0xa684, 0xdf00, - 0x681e, 0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x00c0, 0x3404, - 0x70d4, 0xd0b4, 0x0040, 0x33d1, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, - 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, - 0x0c7f, 0x6820, 0xd0dc, 0x00c0, 0x3404, 0x8717, 0xa294, 0x000f, - 0x8213, 0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x33e3, 0xa290, - 0x4ec0, 0x0078, 0x33e5, 0xa290, 0x4f40, 0xa290, 0x0000, 0x221c, - 0xd3c4, 0x00c0, 0x33ed, 0x0078, 0x33f3, 0x8210, 0x2204, 0xa085, - 0x0018, 0x2012, 0x8211, 0xd3d4, 0x0040, 0x33fe, 0x68a0, 0xd0c4, - 0x00c0, 0x33fe, 0x1078, 0x3562, 0x0078, 0x2946, 0x6008, 0xc08d, - 0x600a, 0x0078, 0x3404, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0040, - 0x340b, 0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, - 0x0040, 0x3420, 0x2009, 0x4a02, 0x2104, 0x8001, 0x200a, 0x8421, - 0x6412, 0x00c0, 0x3420, 0x2021, 0x4a04, 0x2404, 0xc0a5, 0x2022, - 0x6018, 0xa005, 0x0040, 0x3428, 0x8001, 0x601a, 0x00c0, 0x342b, - 0x6008, 0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x3437, 0x6800, - 0xa005, 0x00c0, 0x3434, 0x6002, 0x6006, 0x0078, 0x343b, 0x705c, - 0x2060, 0x6800, 0x6002, 0x2061, 0x4a00, 0x6887, 0x0103, 0x2d08, - 0x206b, 0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x344a, 0x2d02, - 0x0078, 0x344b, 0x616e, 0x7200, 0xa286, 0x0030, 0x0040, 0x345b, - 0xa286, 0x0040, 0x00c0, 0x2946, 0x7003, 0x0002, 0x704c, 0x2068, - 0x68c4, 0x2060, 0x007c, 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc, - 0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80, - 0x0009, 0x7046, 0x007c, 0xa282, 0x0004, 0x0048, 0x3471, 0x1078, - 0x28ec, 0x2200, 0x0079, 0x3474, 0x3478, 0x3489, 0x3496, 0x3489, - 0xa586, 0x1300, 0x0040, 0x3489, 0xa586, 0x8300, 0x00c0, 0x346f, - 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, - 0x600a, 0x7000, 0xa086, 0x0005, 0x0040, 0x3493, 0x1078, 0x3eae, - 0x781b, 0x0075, 0x007c, 0x781b, 0x0076, 0x007c, 0x7890, 0x8007, - 0x8001, 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, - 0x00ff, 0xa186, 0x0003, 0x0040, 0x34ab, 0xa186, 0x0000, 0x0040, - 0x34ab, 0x0078, 0x3e9d, 0x781b, 0x0076, 0x007c, 0x6820, 0xc095, - 0x6822, 0x82ff, 0x00c0, 0x34b8, 0x1078, 0x3eae, 0x0078, 0x34bf, - 0x8211, 0x0040, 0x34bd, 0x1078, 0x28ec, 0x1078, 0x3ebe, 0x781b, - 0x0075, 0x007c, 0x1078, 0x4131, 0x7830, 0xa084, 0x00c0, 0x00c0, - 0x34e5, 0x017e, 0x3208, 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, - 0x007f, 0x0040, 0x34d7, 0xa18c, 0x0300, 0x0078, 0x34d9, 0xa18c, - 0x0400, 0x017f, 0x0040, 0x34e0, 0x0018, 0x34e5, 0x0078, 0x34e2, - 0x0028, 0x34e5, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, - 0xa684, 0x0060, 0x00c0, 0x34f2, 0x682f, 0x0000, 0x6833, 0x0000, - 0x0078, 0x3561, 0xd6dc, 0x00c0, 0x350a, 0x68b4, 0xd0dc, 0x00c0, - 0x350a, 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7048, 0xa005, 0x00c0, - 0x3507, 0x2200, 0xa105, 0x0040, 0x4326, 0x704b, 0x0015, 0x0078, - 0x4326, 0x007c, 0xd6ac, 0x0040, 0x3530, 0xd6f4, 0x0040, 0x3516, - 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x4326, 0x68b4, 0xa084, - 0x4000, 0xa635, 0xd6f4, 0x00c0, 0x3510, 0x7048, 0xa005, 0x00c0, - 0x3523, 0x704b, 0x0015, 0xd6dc, 0x00c0, 0x352c, 0x68b4, 0xd0dc, - 0x0040, 0x352c, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, 0x0078, 0x4326, - 0xd6f4, 0x0040, 0x3539, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, - 0x4326, 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x00c0, 0x3533, - 0x7048, 0xa005, 0x00c0, 0x3546, 0x704b, 0x0015, 0x2408, 0x2510, - 0x2700, 0x80fb, 0x00c8, 0x354d, 0x8000, 0xa084, 0x003f, 0xa108, - 0xa291, 0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x355a, - 0x0078, 0x4326, 0x7000, 0xa086, 0x0006, 0x0040, 0x3561, 0x0078, - 0x4326, 0x007c, 0x6008, 0xc0cd, 0xd3cc, 0x0040, 0x3568, 0xc08d, - 0x600a, 0x681b, 0x0006, 0x688f, 0x0000, 0x6893, 0x0000, 0x6a30, - 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833, 0x0000, 0x6837, - 0x0020, 0x6897, 0x0000, 0x689b, 0x0020, 0x7000, 0x0079, 0x3580, - 0x2946, 0x3592, 0x358a, 0x3588, 0x3588, 0x3588, 0x3588, 0x3588, - 0x1078, 0x28ec, 0x6820, 0xd084, 0x00c0, 0x3592, 0x1078, 0x3bb5, - 0x0078, 0x3598, 0x705c, 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, - 0x3208, 0xa18c, 0x0300, 0x0040, 0x35a1, 0x2021, 0x4a58, 0x0078, - 0x35a3, 0x2021, 0x4a98, 0x2404, 0xa005, 0x0040, 0x35aa, 0x2020, - 0x0078, 0x35a3, 0x2d22, 0x206b, 0x0000, 0x007c, 0x1078, 0x3bbc, - 0x1078, 0x3bd2, 0x6008, 0xc0cc, 0x600a, 0x682b, 0x0000, 0x789b, - 0x000e, 0x6f14, 0x6817, 0x0002, 0x3208, 0xa18c, 0x0300, 0x0040, - 0x35c5, 0x2009, 0x0000, 0x0078, 0x35c7, 0x2009, 0x0001, 0x1078, - 0x471a, 0xd6dc, 0x0040, 0x35cf, 0x691c, 0xc1ed, 0x691e, 0x6818, - 0xd0fc, 0x0040, 0x35de, 0x7868, 0xa08c, 0x00ff, 0x0040, 0x35dc, - 0x681b, 0x001e, 0x0078, 0x35de, 0x681b, 0x0000, 0xb284, 0x0300, - 0x00c0, 0x35e6, 0x2021, 0x4a98, 0x0078, 0x35e8, 0x2021, 0x4a58, - 0x6800, 0x2022, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078, 0x202a, - 0x0078, 0x2946, 0x7cd8, 0x7ddc, 0x7fd0, 0x1078, 0x34e8, 0x682b, - 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078, 0x4135, 0xa08c, 0x00ff, - 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3607, 0x7048, 0x681a, 0xa68c, - 0xdf00, 0x691e, 0x7067, 0x0000, 0x0078, 0x2946, 0x7000, 0xa005, - 0x00c0, 0x3614, 0x0078, 0x2946, 0xa006, 0x1078, 0x4326, 0x6817, - 0x0000, 0x681b, 0x0014, 0xa68c, 0xdf00, 0x691e, 0x682b, 0x0000, - 0x6820, 0xa084, 0x00ff, 0x6822, 0x7000, 0x0079, 0x3627, 0x2946, - 0x3634, 0x3631, 0x3636, 0x3636, 0x3636, 0x362f, 0x362f, 0x1078, - 0x28ec, 0x6008, 0xc0d4, 0x600a, 0x1078, 0x3bd2, 0x6008, 0xc0a4, - 0x600a, 0x0078, 0x3b85, 0x2300, 0x0079, 0x363e, 0x3641, 0x3643, - 0x369f, 0x1078, 0x28ec, 0xd6fc, 0x00c0, 0x3686, 0x7000, 0xa00d, - 0x0079, 0x364a, 0x2946, 0x3654, 0x3654, 0x3678, 0x3654, 0x3683, - 0x3652, 0x3652, 0x1078, 0x28ec, 0xa684, 0x0060, 0xa086, 0x0060, - 0x00c0, 0x3675, 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x681c, 0xc0ac, - 0x681e, 0xa186, 0x0002, 0x0040, 0x3667, 0x1078, 0x4326, 0x1078, - 0x45f7, 0x781b, 0x0076, 0x71d4, 0xd1b4, 0x00c0, 0x2942, 0x70a4, - 0xa086, 0x0001, 0x00c0, 0x2989, 0x007c, 0xd6ec, 0x0040, 0x365c, - 0x6818, 0xd0fc, 0x0040, 0x3683, 0x681b, 0x0015, 0xd6f4, 0x0040, - 0x3683, 0x681b, 0x0007, 0x1078, 0x40d5, 0x007c, 0xc6fc, 0x7e5a, - 0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8, 0x368f, 0x8000, 0xa084, - 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, - 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0076, 0x007c, 0x1078, - 0x28ec, 0x2300, 0x0079, 0x36a4, 0x36a9, 0x36c5, 0x3719, 0x1078, - 0x28ec, 0x7000, 0x0079, 0x36ac, 0x36b4, 0x36b6, 0x36b6, 0x36b4, - 0x36b4, 0x36b4, 0x36b4, 0x36b4, 0x1078, 0x28ec, 0x1078, 0x45f7, - 0x681c, 0xc0b4, 0x681e, 0x70d4, 0xd0b4, 0x00c0, 0x2942, 0x70a4, - 0xa086, 0x0001, 0x00c0, 0x2989, 0x007c, 0xd6fc, 0x00c0, 0x3709, - 0x7000, 0xa00d, 0x0079, 0x36cc, 0x2946, 0x36dc, 0x36d6, 0x3700, - 0x36dc, 0x3706, 0x36d4, 0x36d4, 0x1078, 0x28ec, 0x6894, 0x78d6, - 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0xa086, 0x0060, - 0x00c0, 0x36fd, 0xa6b4, 0xbfbf, 0xc6ed, 0x7e5a, 0xa186, 0x0002, - 0x0040, 0x36ec, 0x1078, 0x4326, 0x1078, 0x45f7, 0x781b, 0x0076, - 0x681c, 0xc0b4, 0x681e, 0x71d4, 0xd1b4, 0x00c0, 0x2942, 0x70a4, - 0xa086, 0x0001, 0x00c0, 0x2989, 0x007c, 0xd6ec, 0x0040, 0x36e4, - 0x6818, 0xd0fc, 0x0040, 0x3706, 0x681b, 0x0007, 0x781b, 0x00f0, - 0x007c, 0xc6fc, 0x7e5a, 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, - 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0076, - 0x007c, 0xd6dc, 0x0040, 0x3722, 0x782b, 0x3009, 0x781b, 0x0076, - 0x0078, 0x2942, 0x7884, 0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, - 0x00c0, 0x3735, 0xa484, 0x0200, 0x0040, 0x372f, 0xc6f5, 0xc6dd, - 0x7e5a, 0x781b, 0x0076, 0x0078, 0x2942, 0x6820, 0xc095, 0x6822, - 0x1078, 0x4062, 0xc6dd, 0x1078, 0x3eae, 0x781b, 0x0075, 0x0078, - 0x2942, 0x2300, 0x0079, 0x3744, 0x3747, 0x3749, 0x374b, 0x1078, - 0x28ec, 0x0078, 0x3ea7, 0xd6d4, 0x00c0, 0x3771, 0x79e4, 0xd1ac, - 0x0040, 0x3759, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3759, 0x782b, - 0x3009, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, - 0x79e4, 0xd1ac, 0x0040, 0x3769, 0x78ec, 0xa084, 0x0003, 0x00c0, - 0x376d, 0x2001, 0x0014, 0x0078, 0x3304, 0xa184, 0x0007, 0x0079, - 0x37a7, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, - 0x0040, 0x37a5, 0x789b, 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0, - 0x3798, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, 0x378b, 0x2009, - 0xfff7, 0x0078, 0x3791, 0xa386, 0x0003, 0x00c0, 0x3798, 0x2009, - 0xffef, 0x0c7e, 0x7058, 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f, - 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x782b, - 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, 0x40c9, 0x2fae, - 0x2fb8, 0x37b1, 0x37b7, 0x37af, 0x37af, 0x40c9, 0x40c9, 0x1078, - 0x28ec, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, 0x40cf, 0x6920, - 0xa18c, 0xfcff, 0x6922, 0x0078, 0x40c9, 0x79e4, 0xa184, 0x0030, - 0x0040, 0x37c7, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x37f1, 0x7000, - 0xa086, 0x0004, 0x00c0, 0x37e1, 0x7064, 0xa086, 0x0002, 0x00c0, - 0x37d7, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078, 0x2e43, 0x7064, - 0xa086, 0x0006, 0x0040, 0x37d1, 0x7064, 0xa086, 0x0004, 0x0040, - 0x37d1, 0x7000, 0xa086, 0x0000, 0x0040, 0x2942, 0x6820, 0xd0ac, - 0x00c0, 0x37ed, 0x6818, 0xc0fd, 0x681a, 0x2001, 0x0014, 0x0078, - 0x3304, 0xa184, 0x0007, 0x0079, 0x37f5, 0x40c9, 0x40c9, 0x37fd, - 0x40c9, 0x4111, 0x4111, 0x40c9, 0x40c9, 0xd6bc, 0x0040, 0x383f, - 0x7184, 0x81ff, 0x0040, 0x383f, 0xa182, 0x000d, 0x00d0, 0x380c, - 0x7087, 0x0000, 0x0078, 0x3811, 0xa182, 0x000c, 0x7086, 0x2009, - 0x000c, 0x789b, 0x0061, 0x79aa, 0x157e, 0x137e, 0x147e, 0x7088, - 0x8114, 0xa210, 0x728a, 0xa080, 0x000b, 0xad00, 0x2098, 0xb284, - 0x0300, 0x0040, 0x3833, 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, - 0x007f, 0x0040, 0x382f, 0x20a1, 0x012b, 0x0078, 0x3835, 0x20a1, - 0x022b, 0x0078, 0x3835, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8108, - 0x81ac, 0x53a6, 0x147f, 0x137f, 0x157f, 0x0078, 0x40cf, 0xd6d4, - 0x00c0, 0x3893, 0x6820, 0xd084, 0x0040, 0x40cf, 0xa68c, 0x0060, - 0xa684, 0x0060, 0x0040, 0x3851, 0xa086, 0x0060, 0x00c0, 0x3851, - 0xc1f5, 0xc194, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, 0x0000, - 0x789b, 0x0061, 0x6818, 0xc0fd, 0x681a, 0x78aa, 0x8008, 0x810c, - 0x0040, 0x3beb, 0xa18c, 0x00f8, 0x00c0, 0x3beb, 0x157e, 0x137e, - 0x147e, 0x017e, 0x3208, 0xa18c, 0x0300, 0x0040, 0x387f, 0x007e, - 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x387b, 0x20a1, - 0x012b, 0x0078, 0x3881, 0x20a1, 0x022b, 0x0078, 0x3881, 0x20a1, - 0x012b, 0x017f, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, - 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0xc0fc, 0x8007, - 0x7882, 0x0078, 0x40cf, 0x6818, 0xd0fc, 0x0040, 0x3899, 0x681b, - 0x0008, 0x6820, 0xc0ad, 0x6822, 0x1078, 0x3eb6, 0x781b, 0x00e1, - 0x007c, 0x2300, 0x0079, 0x38a4, 0x38a9, 0x397b, 0x38a7, 0x1078, - 0x28ec, 0x7cd8, 0x7ddc, 0x7fd0, 0x82ff, 0x00c0, 0x38d1, 0x7200, - 0xa286, 0x0003, 0x0040, 0x32d2, 0x71d4, 0xd1b4, 0x0078, 0x38d4, - 0x0040, 0x38d4, 0x0d7e, 0x783b, 0x8800, 0x781b, 0x004c, 0x70bc, - 0xa06d, 0x68b4, 0xc0a5, 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, - 0x78d2, 0x78da, 0xc1b4, 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x0078, - 0x38d8, 0x7200, 0x0078, 0x38d8, 0x783b, 0x1800, 0x781b, 0x004a, - 0xa284, 0x000f, 0x0079, 0x38dc, 0x3966, 0x391a, 0x38e6, 0x3300, - 0x38e4, 0x3966, 0x38e4, 0x38e4, 0x1078, 0x28ec, 0x681c, 0xd0ec, - 0x0040, 0x38ed, 0x6008, 0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, - 0x6800, 0x6006, 0xa005, 0x00c0, 0x38f6, 0x6002, 0x6008, 0xc0d4, - 0x600a, 0x681c, 0xa084, 0x000e, 0x00c0, 0x390a, 0xb284, 0x0300, - 0x0040, 0x3906, 0x2009, 0x90c0, 0x0078, 0x390f, 0x2009, 0x91d0, - 0x0078, 0x390f, 0x7030, 0x68ba, 0x7140, 0x70cc, 0xa108, 0x2104, - 0x6802, 0x2d0a, 0x715e, 0xd6dc, 0x00c0, 0x391a, 0xc6fc, 0x6eb6, - 0x0078, 0x3966, 0x6eb6, 0xa684, 0x0060, 0x0040, 0x3966, 0xd6dc, - 0x00c0, 0x392d, 0xa684, 0x7fff, 0x68b6, 0x6894, 0x68a6, 0x6898, - 0x68aa, 0x1078, 0x4326, 0x0078, 0x3966, 0xd6ac, 0x0040, 0x3939, - 0xa006, 0x1078, 0x4326, 0x2408, 0x2510, 0x69aa, 0x6aa6, 0x0078, - 0x3949, 0x2408, 0x2510, 0x2700, 0x801b, 0x00c8, 0x3940, 0x8000, - 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x69aa, 0x6aa6, 0x1078, - 0x4326, 0xd6fc, 0x0040, 0x3966, 0xa684, 0x7fff, 0x68b6, 0x2510, - 0x2408, 0xd6ac, 0x00c0, 0x395e, 0x2700, 0x801b, 0x00c8, 0x3959, - 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, - 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0x7000, 0xa086, - 0x0030, 0x00c0, 0x2946, 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc, - 0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80, - 0x0009, 0x7046, 0x007c, 0xa586, 0x8800, 0x00c0, 0x3988, 0x7003, + 0x1078, 0x35ff, 0x017f, 0x81ff, 0x0040, 0x351a, 0xa684, 0xdf00, + 0x681e, 0x682b, 0x0000, 0x6f14, 0xa186, 0x0002, 0x00c0, 0x351b, + 0x6818, 0xa086, 0x0014, 0x00c0, 0x34e4, 0x2008, 0xd6e4, 0x0040, + 0x34e4, 0x7868, 0xa08c, 0x00ff, 0x1078, 0x2aba, 0x1078, 0x2adb, + 0x6820, 0xd0dc, 0x00c0, 0x351b, 0x8717, 0xa294, 0x000f, 0x8213, + 0x8213, 0x8213, 0xb284, 0x0300, 0x0040, 0x34fa, 0xa290, 0x52c0, + 0x0078, 0x34fc, 0xa290, 0x5340, 0xa290, 0x0000, 0x221c, 0xd3c4, + 0x00c0, 0x3504, 0x0078, 0x350a, 0x8210, 0x2204, 0xa085, 0x0018, + 0x2012, 0x8211, 0xd3d4, 0x0040, 0x3515, 0x68a0, 0xd0c4, 0x00c0, + 0x3515, 0x1078, 0x3679, 0x0078, 0x29c5, 0x6008, 0xc08d, 0x600a, + 0x0078, 0x351b, 0x692a, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3522, + 0x7048, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x6410, 0x84ff, 0x0040, + 0x3537, 0x2009, 0x4e02, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, + 0x00c0, 0x3537, 0x2021, 0x4e04, 0x2404, 0xc0a5, 0x2022, 0x6018, + 0xa005, 0x0040, 0x353f, 0x8001, 0x601a, 0x00c0, 0x3542, 0x6008, + 0xc0a4, 0x600a, 0x6820, 0xd084, 0x00c0, 0x354e, 0x6800, 0xa005, + 0x00c0, 0x354b, 0x6002, 0x6006, 0x0078, 0x3552, 0x705c, 0x2060, + 0x6800, 0x6002, 0x2061, 0x4e00, 0x6887, 0x0103, 0x2d08, 0x206b, + 0x0000, 0x6068, 0xa005, 0x616a, 0x0040, 0x3561, 0x2d02, 0x0078, + 0x3562, 0x616e, 0x7200, 0xa286, 0x0030, 0x0040, 0x3572, 0xa286, + 0x0040, 0x00c0, 0x29c5, 0x7003, 0x0002, 0x704c, 0x2068, 0x68c4, + 0x2060, 0x007c, 0x7003, 0x0002, 0x70bc, 0xa06d, 0x68bc, 0x7042, + 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, 0x704e, 0xad80, 0x0009, + 0x7046, 0x007c, 0xa282, 0x0004, 0x0048, 0x3588, 0x1078, 0x296b, + 0x2200, 0x0079, 0x358b, 0x358f, 0x35a0, 0x35ad, 0x35a0, 0xa586, + 0x1300, 0x0040, 0x35a0, 0xa586, 0x8300, 0x00c0, 0x3586, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, 0xfbef, 0x600a, - 0x0078, 0x3ea7, 0x7047, 0x0000, 0xa282, 0x0006, 0x0050, 0x3992, - 0x1078, 0x28ec, 0x2300, 0x0079, 0x3995, 0x3998, 0x39cf, 0x3a01, - 0x2200, 0x0079, 0x399b, 0x39a1, 0x3ea7, 0x39a3, 0x39a1, 0x3a38, - 0x3a9b, 0x1078, 0x28ec, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, - 0x39ad, 0x2001, 0x91e0, 0x0078, 0x39af, 0x2001, 0x9212, 0x2068, - 0x704e, 0x157e, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, - 0x39b4, 0x157f, 0xb284, 0x0300, 0x0040, 0x39c2, 0x6817, 0x0000, - 0x0078, 0x39c4, 0x6817, 0x8000, 0xad80, 0x0009, 0x7046, 0x68b7, - 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0078, 0x3e9d, 0x7000, - 0xa086, 0x0002, 0x00c0, 0x39e0, 0x1078, 0x3bd2, 0x0078, 0x39da, - 0x1078, 0x4326, 0x6008, 0xa084, 0xfbef, 0x600a, 0x0078, 0x39e5, - 0x7000, 0xa086, 0x0003, 0x0040, 0x39d8, 0x7003, 0x0005, 0xb284, - 0x0300, 0x0040, 0x39ef, 0x2001, 0x91e0, 0x0078, 0x39f1, 0x2001, - 0x9212, 0x2068, 0x704e, 0xad80, 0x0009, 0x7046, 0x2200, 0x0079, - 0x39f9, 0x3ea7, 0x39ff, 0x39ff, 0x3a38, 0x39ff, 0x3ea7, 0x1078, - 0x28ec, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3a12, 0x1078, 0x3bd2, - 0x0078, 0x3a0c, 0x1078, 0x4326, 0x6008, 0xa084, 0xfbef, 0x600a, - 0x0078, 0x3a17, 0x7000, 0xa086, 0x0003, 0x0040, 0x3a0a, 0x7003, - 0x0005, 0xb284, 0x0300, 0x0040, 0x3a21, 0x2001, 0x91e0, 0x0078, - 0x3a23, 0x2001, 0x9212, 0x2068, 0x704e, 0xad80, 0x0009, 0x7046, - 0x2200, 0x0079, 0x3a2b, 0x3a33, 0x3a31, 0x3a31, 0x3a33, 0x3a31, - 0x3a33, 0x1078, 0x28ec, 0x1078, 0x3ebe, 0x781b, 0x0075, 0x007c, - 0x7000, 0xa086, 0x0002, 0x00c0, 0x3a4a, 0x70d4, 0xc0b5, 0x70d6, - 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078, 0x3a4f, 0x1078, 0x4326, - 0x0078, 0x3a4f, 0x7000, 0xa086, 0x0003, 0x0040, 0x3a46, 0x7003, - 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, - 0x001f, 0xa215, 0x2069, 0x90c0, 0xb284, 0x0300, 0x00c0, 0x3a63, - 0xc2fd, 0x2069, 0x91d0, 0x2d04, 0x2d08, 0x715e, 0xa06d, 0x0040, - 0x3a70, 0x6814, 0xa206, 0x0040, 0x3a90, 0x6800, 0x0078, 0x3a64, - 0x7003, 0x0005, 0xd2fc, 0x00c0, 0x3a79, 0x2001, 0x91e0, 0x0078, - 0x3a7b, 0x2001, 0x9212, 0x2068, 0x704e, 0x157e, 0x20a9, 0x0032, - 0x2003, 0x0000, 0x8000, 0x00f0, 0x3a80, 0x157f, 0xad80, 0x0009, - 0x7046, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, - 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x3b10, 0x1078, - 0x3eb6, 0x0078, 0x3b10, 0x7200, 0xa286, 0x0002, 0x00c0, 0x3aad, - 0x70d4, 0xc0b5, 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078, - 0x3ab1, 0x1078, 0x4326, 0x0078, 0x3ab1, 0xa286, 0x0003, 0x0040, - 0x3aa9, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, - 0x7ca8, 0xa484, 0x001f, 0xa215, 0xb284, 0x0300, 0x00c0, 0x3ac1, - 0xc2fd, 0x79a8, 0x79a8, 0xa18c, 0x00ff, 0x70cc, 0xa168, 0x2d04, - 0x2d08, 0x715e, 0xa06d, 0x0040, 0x3ad4, 0x6814, 0xa206, 0x0040, - 0x3afd, 0x6800, 0x0078, 0x3ac8, 0x7003, 0x0005, 0xb284, 0x0300, - 0x0040, 0x3ade, 0x2001, 0x91e0, 0x0078, 0x3ae0, 0x2001, 0x9212, - 0x2068, 0x704e, 0x157e, 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, - 0x00f0, 0x3ae5, 0x157f, 0xb284, 0x0300, 0x0040, 0x3af2, 0xc2fc, - 0x0078, 0x3af3, 0xc2fd, 0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, - 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x6820, 0xa084, - 0x0c00, 0x0040, 0x3b10, 0xd0dc, 0x0040, 0x3b0a, 0x1078, 0x3eba, - 0x0078, 0x3b10, 0x1078, 0x3eb6, 0x707f, 0x0000, 0x0078, 0x3b10, - 0xa6ac, 0x0060, 0x0040, 0x3b4e, 0x6b98, 0x6c94, 0x69ac, 0x68b0, - 0xa105, 0x00c0, 0x3b33, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0xa6b4, - 0xb7ff, 0xa586, 0x0060, 0x0040, 0x3b4e, 0xc6ed, 0x7e5a, 0x2009, - 0x0076, 0xd69c, 0x0040, 0x3b2e, 0x2009, 0x0075, 0x791a, 0x1078, - 0x45f7, 0x0078, 0x3b57, 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, - 0xa305, 0x0040, 0x3b4e, 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, - 0xc6f4, 0x7e5a, 0x2011, 0x0076, 0xd69c, 0x0040, 0x3b49, 0x2011, - 0x0075, 0x7a1a, 0x1078, 0x462d, 0x0078, 0x3b57, 0x7e5a, 0x2009, - 0x0076, 0xd69c, 0x0040, 0x3b56, 0x2009, 0x0075, 0x791a, 0x68c0, - 0x705a, 0x2d00, 0x704e, 0x68c4, 0x2060, 0x71d4, 0xd1b4, 0x00c0, - 0x2942, 0x2300, 0xa405, 0x0040, 0x2942, 0x70a4, 0xa086, 0x0001, - 0x00c0, 0x2989, 0x007c, 0x6020, 0xa005, 0x0040, 0x3b79, 0x8001, - 0x6022, 0x6008, 0xa085, 0x0008, 0x600a, 0x700f, 0x0100, 0x702c, - 0x6026, 0x007c, 0xa006, 0x1078, 0x4326, 0x6817, 0x0000, 0x681b, + 0x7000, 0xa086, 0x0005, 0x0040, 0x35aa, 0x1078, 0x40c8, 0x781b, + 0x0078, 0x007c, 0x781b, 0x0079, 0x007c, 0x7890, 0x8007, 0x8001, + 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, + 0xa186, 0x0003, 0x0040, 0x35c2, 0xa186, 0x0000, 0x0040, 0x35c2, + 0x0078, 0x40b7, 0x781b, 0x0079, 0x007c, 0x6820, 0xc095, 0x6822, + 0x82ff, 0x00c0, 0x35cf, 0x1078, 0x40c8, 0x0078, 0x35d6, 0x8211, + 0x0040, 0x35d4, 0x1078, 0x296b, 0x1078, 0x40db, 0x781b, 0x0078, + 0x007c, 0x1078, 0x4383, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x35fc, + 0x017e, 0x3208, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, + 0x0040, 0x35ee, 0xa18c, 0x0300, 0x0078, 0x35f0, 0xa18c, 0x0400, + 0x017f, 0x0040, 0x35f7, 0x0018, 0x35fc, 0x0078, 0x35f9, 0x0028, + 0x35fc, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, + 0x0060, 0x00c0, 0x3609, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, + 0x3678, 0xd6dc, 0x00c0, 0x3621, 0x68b4, 0xd0dc, 0x00c0, 0x3621, + 0x6998, 0x6a94, 0x692e, 0x6a32, 0x7048, 0xa005, 0x00c0, 0x361e, + 0x2200, 0xa105, 0x0040, 0x4586, 0x704b, 0x0015, 0x0078, 0x4586, + 0x007c, 0xd6ac, 0x0040, 0x3647, 0xd6f4, 0x0040, 0x362d, 0x682f, + 0x0000, 0x6833, 0x0000, 0x0078, 0x4586, 0x68b4, 0xa084, 0x4000, + 0xa635, 0xd6f4, 0x00c0, 0x3627, 0x7048, 0xa005, 0x00c0, 0x363a, + 0x704b, 0x0015, 0xd6dc, 0x00c0, 0x3643, 0x68b4, 0xd0dc, 0x0040, + 0x3643, 0x6ca8, 0x6da4, 0x6c2e, 0x6d32, 0x0078, 0x4586, 0xd6f4, + 0x0040, 0x3650, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x4586, + 0x68b4, 0xa084, 0x4800, 0xa635, 0xd6f4, 0x00c0, 0x364a, 0x7048, + 0xa005, 0x00c0, 0x365d, 0x704b, 0x0015, 0x2408, 0x2510, 0x2700, + 0x80fb, 0x00c8, 0x3664, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, + 0x0000, 0x692e, 0x6a32, 0x2100, 0xa205, 0x00c0, 0x3671, 0x0078, + 0x4586, 0x7000, 0xa086, 0x0006, 0x0040, 0x3678, 0x0078, 0x4586, + 0x007c, 0x6946, 0x6008, 0xc0cd, 0xd3cc, 0x0040, 0x3680, 0xc08d, + 0x600a, 0x6818, 0x683a, 0x681b, 0x0006, 0x688f, 0x0000, 0x6893, + 0x0000, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, 0x0003, 0x6833, + 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, 0x0020, 0x7000, + 0x0079, 0x369a, 0x29c5, 0x36ac, 0x36a4, 0x36a2, 0x36a2, 0x36a2, + 0x36a2, 0x36a2, 0x1078, 0x296b, 0x6820, 0xd084, 0x00c0, 0x36ac, + 0x1078, 0x3dd0, 0x0078, 0x36b2, 0x705c, 0x2c50, 0x2060, 0x6800, + 0x6002, 0x2a60, 0x3208, 0xa18c, 0x0300, 0x0040, 0x36bb, 0x2021, + 0x4e58, 0x0078, 0x36bd, 0x2021, 0x4e98, 0x2404, 0xa005, 0x0040, + 0x36c4, 0x2020, 0x0078, 0x36bd, 0x2d22, 0x206b, 0x0000, 0x007c, + 0x1078, 0x3dd7, 0x1078, 0x3ded, 0x6008, 0xc0cc, 0x600a, 0x682b, + 0x0000, 0x789b, 0x000e, 0x6f14, 0x6938, 0x691a, 0x6944, 0x6916, + 0x3208, 0xa18c, 0x0300, 0x0040, 0x36e1, 0x2009, 0x0000, 0x0078, + 0x36e3, 0x2009, 0x0001, 0x1078, 0x49f8, 0xd6dc, 0x0040, 0x36eb, + 0x691c, 0xc1ed, 0x691e, 0x6818, 0xd0fc, 0x0040, 0x36fa, 0x7868, + 0xa08c, 0x00ff, 0x0040, 0x36f8, 0x681b, 0x001e, 0x0078, 0x36fa, + 0x681b, 0x0000, 0xb284, 0x0300, 0x00c0, 0x3702, 0x2021, 0x4e98, + 0x0078, 0x3704, 0x2021, 0x4e58, 0x6800, 0x2022, 0x6a3c, 0x6940, + 0x6a32, 0x692e, 0x68c0, 0x2060, 0x6000, 0xd0a4, 0x0040, 0x3744, + 0x2041, 0x0021, 0x2049, 0x0005, 0x2051, 0x0020, 0x0d7e, 0x0f7e, + 0x157e, 0x147e, 0x2079, 0x4e00, 0x1078, 0x1dff, 0x147f, 0x157f, + 0x0f7f, 0x70cc, 0x2010, 0x2009, 0x0101, 0x027e, 0x2204, 0xa06d, + 0x0040, 0x3734, 0x6814, 0xa706, 0x0040, 0x3731, 0x6800, 0x0078, + 0x3727, 0x6820, 0xc0d5, 0x6822, 0x027f, 0x8210, 0x8109, 0x00c0, + 0x3725, 0x0d7f, 0x7067, 0x0003, 0x707f, 0x0000, 0x7776, 0x7083, + 0x000f, 0x71d4, 0xc1dc, 0x71d6, 0x6818, 0xa086, 0x0002, 0x00c0, + 0x3750, 0x6817, 0x0000, 0x682b, 0x0000, 0x681c, 0xc0ec, 0x681e, + 0x1078, 0x202c, 0x0078, 0x29c5, 0x7cd8, 0x7ddc, 0x7fd0, 0x1078, + 0x35ff, 0x682b, 0x0000, 0x789b, 0x000e, 0x6f14, 0x1078, 0x4387, + 0xa08c, 0x00ff, 0x6916, 0x6818, 0xd0fc, 0x0040, 0x3769, 0x7048, + 0x681a, 0xa68c, 0xdf00, 0x691e, 0x7067, 0x0000, 0x0078, 0x29c5, + 0x7000, 0xa005, 0x00c0, 0x3776, 0x0078, 0x29c5, 0xa006, 0x1078, + 0x4586, 0x6920, 0xd1ac, 0x00c0, 0x377f, 0x681b, 0x0014, 0xa68c, + 0xdf00, 0x691e, 0x682b, 0x0000, 0x6820, 0xa084, 0x00ff, 0x6822, + 0x7000, 0x0079, 0x378b, 0x29c5, 0x3795, 0x3795, 0x3798, 0x3798, + 0x3798, 0x3793, 0x3793, 0x1078, 0x296b, 0x6818, 0x0078, 0x33fa, + 0x6008, 0xc0a4, 0x600a, 0x6817, 0x0000, 0x0078, 0x3d95, 0x2300, + 0x0079, 0x37a2, 0x37a5, 0x37a7, 0x3817, 0x1078, 0x296b, 0xd6fc, + 0x00c0, 0x37fe, 0x7000, 0xa00d, 0x0079, 0x37ae, 0x29c5, 0x37b8, + 0x37b8, 0x37e8, 0x37b8, 0x37fb, 0x37b6, 0x37b6, 0x1078, 0x296b, + 0xa684, 0x0060, 0x0040, 0x37e8, 0xa086, 0x0060, 0x00c0, 0x37e5, + 0xc6ac, 0xc6f4, 0xc6ed, 0x7e5a, 0x6eb6, 0x681c, 0xc0ac, 0x681e, + 0xa186, 0x0002, 0x0040, 0x37d7, 0x1078, 0x4586, 0x69ac, 0x68b0, + 0xa115, 0x0040, 0x37d7, 0x1078, 0x48f5, 0x0078, 0x37d9, 0x1078, + 0x48bd, 0x781b, 0x0079, 0x71d4, 0xd1b4, 0x00c0, 0x29c1, 0x70a4, + 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0xd6ec, 0x0040, 0x37c2, + 0x6818, 0xd0fc, 0x0040, 0x37fb, 0xd6f4, 0x00c0, 0x37f5, 0x681b, + 0x0015, 0x781b, 0x0079, 0x0078, 0x29c1, 0x681b, 0x0007, 0x682f, + 0x0000, 0x6833, 0x0000, 0x1078, 0x4319, 0x007c, 0xc6fc, 0x7e5a, + 0x7adc, 0x79d8, 0x78d0, 0x801b, 0x00c8, 0x3807, 0x8000, 0xa084, + 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, + 0x6b94, 0x2200, 0xa303, 0x68ae, 0x781b, 0x0079, 0x007c, 0x1078, + 0x296b, 0x2300, 0x0079, 0x381c, 0x3821, 0x3846, 0x38a6, 0x1078, + 0x296b, 0x7000, 0x0079, 0x3824, 0x382c, 0x382e, 0x3837, 0x382c, + 0x382c, 0x382c, 0x382c, 0x382c, 0x1078, 0x296b, 0x69ac, 0x68b0, + 0xa115, 0x0040, 0x3837, 0x1078, 0x48f5, 0x0078, 0x3839, 0x1078, + 0x48bd, 0x681c, 0xc0b4, 0x681e, 0x70d4, 0xd0b4, 0x00c0, 0x29c1, + 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0xd6fc, 0x00c0, + 0x3896, 0x7000, 0xa00d, 0x0079, 0x384d, 0x29c5, 0x385d, 0x3857, + 0x388d, 0x385d, 0x3893, 0x3855, 0x3855, 0x1078, 0x296b, 0x6894, + 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xa684, 0x0060, 0x0040, + 0x388d, 0xa086, 0x0060, 0x00c0, 0x388a, 0xa6b4, 0xbfbf, 0xc6ed, + 0x7e5a, 0x6eb6, 0xa186, 0x0002, 0x0040, 0x3879, 0x1078, 0x4586, + 0x69ac, 0x68b0, 0xa115, 0x0040, 0x3879, 0x1078, 0x48f5, 0x0078, + 0x387b, 0x1078, 0x48bd, 0x781b, 0x0079, 0x681c, 0xc0b4, 0x681e, + 0x71d4, 0xd1b4, 0x00c0, 0x29c1, 0x70a4, 0xa086, 0x0001, 0x00c0, + 0x2a0b, 0x007c, 0xd6ec, 0x0040, 0x3867, 0x6818, 0xd0fc, 0x0040, + 0x3893, 0x681b, 0x0007, 0x781b, 0x00f9, 0x007c, 0xc6fc, 0x7e5a, + 0x7adc, 0x79d8, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, + 0xa303, 0x68ae, 0x79d2, 0x781b, 0x0079, 0x007c, 0xd6dc, 0x0040, + 0x38af, 0x782b, 0x3009, 0x781b, 0x0079, 0x0078, 0x29c1, 0x7884, + 0xc0ac, 0x7886, 0x78e4, 0xa084, 0x0008, 0x00c0, 0x38c2, 0xa484, + 0x0200, 0x0040, 0x38bc, 0xc6f5, 0xc6dd, 0x7e5a, 0x781b, 0x0079, + 0x0078, 0x29c1, 0x6820, 0xc095, 0x6822, 0x1078, 0x4292, 0xc6dd, + 0x1078, 0x40c8, 0x781b, 0x0078, 0x0078, 0x29c1, 0x2300, 0x0079, + 0x38d1, 0x38d4, 0x38d6, 0x38d8, 0x1078, 0x296b, 0x0078, 0x40c1, + 0xd6d4, 0x00c0, 0x3913, 0x79e4, 0xd1ac, 0x0040, 0x38e6, 0x78ec, + 0xa084, 0x0003, 0x0040, 0x38e6, 0x782b, 0x3009, 0x789b, 0x0060, + 0x78ab, 0x0000, 0xa684, 0xfffb, 0x785a, 0x79e4, 0xd1ac, 0x0040, + 0x38f6, 0x78ec, 0xa084, 0x0003, 0x00c0, 0x390f, 0x2001, 0x4e04, + 0x2004, 0xd0e4, 0x00c0, 0x390b, 0x6820, 0xd0c4, 0x0040, 0x390b, + 0x0c7e, 0x7058, 0x2060, 0x6004, 0xc09d, 0x6006, 0x6008, 0xa084, + 0x00ff, 0x600a, 0x0c7f, 0x2001, 0x0014, 0x0078, 0x33fa, 0xa184, + 0x0007, 0x0079, 0x3949, 0x7a90, 0xa294, 0x0007, 0x789b, 0x0060, + 0x79a8, 0x81ff, 0x0040, 0x3947, 0x789b, 0x0010, 0x7ba8, 0xa384, + 0x0001, 0x00c0, 0x393a, 0x7ba8, 0x7ba8, 0xa386, 0x0001, 0x00c0, + 0x392d, 0x2009, 0xfff7, 0x0078, 0x3933, 0xa386, 0x0003, 0x00c0, + 0x393a, 0x2009, 0xffef, 0x0c7e, 0x7058, 0x2060, 0x6004, 0xa104, + 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, + 0x785a, 0x782b, 0x3009, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, + 0x430d, 0x3090, 0x309a, 0x3953, 0x3959, 0x3951, 0x3951, 0x430d, + 0x430d, 0x1078, 0x296b, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, + 0x4313, 0x6920, 0xa18c, 0xfcff, 0x6922, 0x0078, 0x430d, 0x79e4, + 0xa184, 0x0030, 0x0040, 0x3969, 0x78ec, 0xa084, 0x0003, 0x00c0, + 0x399d, 0x7000, 0xa086, 0x0004, 0x00c0, 0x3983, 0x7064, 0xa086, + 0x0002, 0x00c0, 0x3979, 0x2011, 0x0002, 0x2019, 0x0000, 0x0078, + 0x2f1c, 0x7064, 0xa086, 0x0006, 0x0040, 0x3973, 0x7064, 0xa086, + 0x0004, 0x0040, 0x3973, 0x7000, 0xa086, 0x0000, 0x0040, 0x29c1, + 0x6920, 0xa184, 0x0420, 0x0040, 0x3992, 0xc1d4, 0x6922, 0x6818, + 0x0078, 0x33fa, 0x6818, 0xa08e, 0x0002, 0x0040, 0x399b, 0xc0fd, + 0x681a, 0x2001, 0x0014, 0x0078, 0x33fa, 0xa184, 0x0007, 0x0079, + 0x39a1, 0x430d, 0x430d, 0x39a9, 0x430d, 0x4355, 0x4355, 0x430d, + 0x430d, 0xd6bc, 0x0040, 0x39eb, 0x7184, 0x81ff, 0x0040, 0x39eb, + 0xa182, 0x000d, 0x00d0, 0x39b8, 0x7087, 0x0000, 0x0078, 0x39bd, + 0xa182, 0x000c, 0x7086, 0x2009, 0x000c, 0x789b, 0x0061, 0x79aa, + 0x157e, 0x137e, 0x147e, 0x7088, 0x8114, 0xa210, 0x728a, 0xa080, + 0x000b, 0xad00, 0x2098, 0xb284, 0x0300, 0x0040, 0x39df, 0x007e, + 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x39db, 0x20a1, + 0x012b, 0x0078, 0x39e1, 0x20a1, 0x022b, 0x0078, 0x39e1, 0x20a1, + 0x012b, 0x789b, 0x0000, 0x8108, 0x81ac, 0x53a6, 0x147f, 0x137f, + 0x157f, 0x0078, 0x4313, 0xd6d4, 0x00c0, 0x3a3f, 0x6820, 0xd084, + 0x0040, 0x4313, 0xa68c, 0x0060, 0xa684, 0x0060, 0x0040, 0x39fd, + 0xa086, 0x0060, 0x00c0, 0x39fd, 0xc1f5, 0xc194, 0x795a, 0x69b6, + 0x789b, 0x0060, 0x78ab, 0x0000, 0x789b, 0x0061, 0x6818, 0xc0fd, + 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, 0x3e06, 0xa18c, 0x00f8, + 0x00c0, 0x3e06, 0x157e, 0x137e, 0x147e, 0x017e, 0x3208, 0xa18c, + 0x0300, 0x0040, 0x3a2b, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, + 0x007f, 0x0040, 0x3a27, 0x20a1, 0x012b, 0x0078, 0x3a2d, 0x20a1, + 0x022b, 0x0078, 0x3a2d, 0x20a1, 0x012b, 0x017f, 0x789b, 0x0000, + 0x8000, 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, + 0x157f, 0x6814, 0xc0fc, 0x8007, 0x7882, 0x0078, 0x4313, 0x6818, + 0xd0fc, 0x0040, 0x3a45, 0x681b, 0x0008, 0x6820, 0xc0ad, 0x6822, + 0x1078, 0x40d0, 0x781b, 0x00ea, 0x007c, 0x2300, 0x0079, 0x3a50, + 0x3a55, 0x3b2d, 0x3a53, 0x1078, 0x296b, 0x7cd8, 0x7ddc, 0x7fd0, + 0x82ff, 0x00c0, 0x3a7e, 0x7200, 0xa286, 0x0003, 0x0040, 0x33c7, + 0x71d4, 0xd1bc, 0x00c0, 0x3a81, 0xd1b4, 0x0040, 0x3a81, 0x0d7e, + 0x783b, 0x8800, 0x781b, 0x004c, 0x70bc, 0xa06d, 0x68b4, 0xc0a5, + 0x785a, 0x6894, 0x78d6, 0x78de, 0x6898, 0x78d2, 0x78da, 0xc1b4, + 0x71d6, 0x7003, 0x0030, 0x0d7f, 0x0078, 0x3a85, 0x7200, 0x0078, + 0x3a85, 0x783b, 0x1800, 0x781b, 0x004a, 0xa284, 0x000f, 0x0079, + 0x3a89, 0x3b18, 0x3ac7, 0x3a93, 0x33f6, 0x3a91, 0x3b18, 0x3a91, + 0x3a91, 0x1078, 0x296b, 0x681c, 0xd0ec, 0x0040, 0x3a9a, 0x6008, + 0xc08d, 0x600a, 0x6920, 0xc185, 0x6922, 0x6800, 0x6006, 0xa005, + 0x00c0, 0x3aa3, 0x6002, 0x6008, 0xc0d4, 0x600a, 0x681c, 0xa084, + 0x000e, 0x00c0, 0x3ab7, 0xb284, 0x0300, 0x0040, 0x3ab3, 0x2009, + 0x94c0, 0x0078, 0x3abc, 0x2009, 0x95d0, 0x0078, 0x3abc, 0x7030, + 0x68ba, 0x7140, 0x70cc, 0xa108, 0x2104, 0x6802, 0x2d0a, 0x715e, + 0xd6dc, 0x00c0, 0x3ac7, 0xc6fc, 0x6eb6, 0x0078, 0x3b18, 0x6eb6, + 0xa684, 0x0060, 0x00c0, 0x3ad1, 0xa684, 0x7fff, 0x68b6, 0x0078, + 0x3b18, 0xd6dc, 0x00c0, 0x3adf, 0xa684, 0x7fff, 0x68b6, 0x6894, + 0x68a6, 0x6898, 0x68aa, 0x1078, 0x4586, 0x0078, 0x3b18, 0xd6ac, + 0x0040, 0x3aeb, 0xa006, 0x1078, 0x4586, 0x2408, 0x2510, 0x69aa, + 0x6aa6, 0x0078, 0x3afb, 0x2408, 0x2510, 0x2700, 0x801b, 0x00c8, + 0x3af2, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x69aa, + 0x6aa6, 0x1078, 0x4586, 0xd6fc, 0x0040, 0x3b18, 0xa684, 0x7fff, + 0x68b6, 0x2510, 0x2408, 0xd6ac, 0x00c0, 0x3b10, 0x2700, 0x801b, + 0x00c8, 0x3b0b, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, + 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, + 0x7000, 0xa086, 0x0030, 0x00c0, 0x29c5, 0x7003, 0x0002, 0x70bc, + 0xa06d, 0x68bc, 0x7042, 0x70b8, 0xa065, 0x68c0, 0x705a, 0x2d00, + 0x704e, 0xad80, 0x0009, 0x7046, 0x007c, 0xa586, 0x8800, 0x00c0, + 0x3b3a, 0x7003, 0x0000, 0x6018, 0x8001, 0x601a, 0x6008, 0xa084, + 0xfbef, 0x600a, 0x0078, 0x40c1, 0x7047, 0x0000, 0xa282, 0x0006, + 0x0050, 0x3b44, 0x1078, 0x296b, 0x2300, 0x0079, 0x3b47, 0x3b4a, + 0x3b5c, 0x3b68, 0x2200, 0x0079, 0x3b4d, 0x3b53, 0x40c1, 0x3b55, + 0x3b53, 0x3ba2, 0x3bf7, 0x1078, 0x296b, 0x7a80, 0xa294, 0x0f00, + 0x1078, 0x3c81, 0x0078, 0x40b7, 0x1078, 0x3b79, 0x0079, 0x3b60, + 0x40c1, 0x3b66, 0x3b66, 0x3ba2, 0x3b66, 0x40c1, 0x1078, 0x296b, + 0x1078, 0x3b79, 0x0079, 0x3b6c, 0x3b74, 0x3b72, 0x3b72, 0x3b74, + 0x3b72, 0x3b74, 0x1078, 0x296b, 0x1078, 0x40db, 0x781b, 0x0078, + 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3b8a, 0x1078, 0x3ded, + 0x0078, 0x3b84, 0x1078, 0x4586, 0x6008, 0xa084, 0xfbef, 0x600a, + 0x0078, 0x3b8f, 0x7000, 0xa086, 0x0003, 0x0040, 0x3b82, 0x7003, + 0x0005, 0xb284, 0x0300, 0x0040, 0x3b99, 0x2001, 0x95e0, 0x0078, + 0x3b9b, 0x2001, 0x9612, 0x2068, 0x704e, 0xad80, 0x0009, 0x7046, + 0x2200, 0x007c, 0x7000, 0xa086, 0x0002, 0x00c0, 0x3bb4, 0x70d4, + 0xc0b5, 0x70d6, 0x2c00, 0x70ba, 0x2d00, 0x70be, 0x0078, 0x3bb9, + 0x1078, 0x4586, 0x0078, 0x3bb9, 0x7000, 0xa086, 0x0003, 0x0040, + 0x3bb0, 0x7003, 0x0001, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, + 0x7ca8, 0xa484, 0x001f, 0xa215, 0x2069, 0x94c0, 0xb284, 0x0300, + 0x00c0, 0x3bcd, 0xc2fd, 0x2069, 0x95d0, 0x2d04, 0x2d08, 0x715e, + 0xa06d, 0x0040, 0x3bda, 0x6814, 0xa206, 0x0040, 0x3bdc, 0x6800, + 0x0078, 0x3bce, 0x1078, 0x3c81, 0x6eb4, 0x7e5a, 0x6920, 0xa184, + 0x0c00, 0x0040, 0x3cab, 0x7064, 0xa086, 0x0006, 0x00c0, 0x3bee, + 0x7074, 0xa206, 0x00c0, 0x3bee, 0x7066, 0x707e, 0x681b, 0x0005, + 0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x40d0, 0x0078, 0x3cab, 0x7200, + 0xa286, 0x0002, 0x00c0, 0x3c09, 0x70d4, 0xc0b5, 0x70d6, 0x2c00, + 0x70ba, 0x2d00, 0x70be, 0x0078, 0x3c0d, 0x1078, 0x4586, 0x0078, + 0x3c0d, 0xa286, 0x0003, 0x0040, 0x3c05, 0x7003, 0x0001, 0x7a80, + 0xa294, 0x0f00, 0x789b, 0x0018, 0x7ca8, 0xa484, 0x001f, 0xa215, + 0xb284, 0x0300, 0x00c0, 0x3c1d, 0xc2fd, 0x79a8, 0x79a8, 0xa18c, + 0x00ff, 0x2118, 0x70cc, 0xa168, 0x2d04, 0x2d08, 0x715e, 0xa06d, + 0x0040, 0x3c31, 0x6814, 0xa206, 0x0040, 0x3c5a, 0x6800, 0x0078, + 0x3c25, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c3b, 0x2001, + 0x95e0, 0x0078, 0x3c3d, 0x2001, 0x9612, 0x2068, 0x704e, 0x157e, + 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c42, 0x157f, + 0xb284, 0x0300, 0x0040, 0x3c4f, 0xc2fc, 0x0078, 0x3c50, 0xc2fd, + 0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800, + 0x6827, 0x0003, 0x6eb4, 0x6920, 0xa184, 0x0c00, 0x0040, 0x3cab, + 0xd0dc, 0x0040, 0x3c76, 0x7064, 0xa086, 0x0004, 0x00c0, 0x3c72, + 0x7074, 0xa206, 0x00c0, 0x3c72, 0x7078, 0xa306, 0x00c0, 0x3c72, + 0x7066, 0x707e, 0x1078, 0x40d7, 0x0078, 0x3cab, 0x681b, 0x0005, + 0xc1ad, 0xc1d4, 0x6922, 0x1078, 0x40d0, 0x707f, 0x0000, 0x0078, + 0x3cab, 0x7003, 0x0005, 0xb284, 0x0300, 0x0040, 0x3c8b, 0x2001, + 0x95e0, 0x0078, 0x3c8d, 0x2001, 0x9612, 0x2068, 0x704e, 0x157e, + 0x20a9, 0x0032, 0x2003, 0x0000, 0x8000, 0x00f0, 0x3c92, 0x157f, + 0xb284, 0x0300, 0x0040, 0x3c9f, 0xc2fc, 0x0078, 0x3ca0, 0xc2fd, + 0x6a16, 0xad80, 0x0009, 0x7046, 0x68b7, 0x0700, 0x6823, 0x0800, + 0x6827, 0x0003, 0x007c, 0xc6ec, 0xa6ac, 0x0060, 0x0040, 0x3cfd, + 0x6b98, 0x6c94, 0x69ac, 0x68b0, 0xa105, 0x00c0, 0x3cd8, 0x7bd2, + 0x7bda, 0x7cd6, 0x7cde, 0xa586, 0x0060, 0x0040, 0x3d02, 0xd6f4, + 0x00c0, 0x3cc3, 0xc6ed, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079, + 0xd69c, 0x0040, 0x3cd0, 0x2009, 0x0078, 0x2019, 0x0000, 0x2320, + 0x791a, 0xd6ec, 0x0040, 0x3d0d, 0x1078, 0x48bd, 0x0078, 0x3d0d, + 0x68b0, 0xa31a, 0x2100, 0xa423, 0x2400, 0xa305, 0x0040, 0x3d04, + 0x7bd2, 0x7bda, 0x7cd6, 0x7cde, 0x68b0, 0xd6f4, 0x00c0, 0x3ce9, + 0xc6ed, 0xc6f4, 0x7e5a, 0x2011, 0x0079, 0xd69c, 0x0040, 0x3cf5, + 0x2011, 0x0078, 0x2019, 0x0000, 0x2320, 0x7a1a, 0xd6ec, 0x0040, + 0x3d0d, 0x1078, 0x48f5, 0x0078, 0x3d0d, 0x2019, 0x0000, 0x2320, + 0x0078, 0x3d04, 0xa6b4, 0xb7ff, 0x7e5a, 0x2009, 0x0079, 0xd69c, + 0x0040, 0x3d0c, 0x2009, 0x0078, 0x791a, 0x68c0, 0x705a, 0x2d00, + 0x704e, 0x68c4, 0x2060, 0x71d4, 0x2001, 0x4e01, 0x2004, 0xd0c4, + 0x00c0, 0x3d62, 0x70d8, 0xa02d, 0x0040, 0x3d3b, 0xd1bc, 0x0040, + 0x3d55, 0x7a80, 0xa294, 0x0f00, 0x70dc, 0xa206, 0x0040, 0x3d2c, + 0x78e0, 0xa504, 0x00c0, 0x3d62, 0x70da, 0xc1bc, 0x71d6, 0x0078, + 0x3d62, 0x2031, 0x0001, 0x852c, 0x0048, 0x3d3a, 0x8633, 0x8210, + 0x0078, 0x3d33, 0x007c, 0x7de0, 0xa594, 0xff00, 0x0040, 0x3d48, + 0x2011, 0x0008, 0x852f, 0x1078, 0x3d31, 0x8637, 0x0078, 0x3d4a, + 0x1078, 0x3d31, 0x8217, 0x7880, 0xa084, 0x0f00, 0xa206, 0x0040, + 0x3d62, 0x72de, 0x76da, 0x0078, 0x3d62, 0x7a80, 0xa294, 0x0f00, + 0x70dc, 0xa236, 0x0040, 0x3d52, 0x78e0, 0xa534, 0x0040, 0x3d52, + 0xc1bd, 0x71d6, 0xd1b4, 0x00c0, 0x29c1, 0x2300, 0xa405, 0x0040, + 0x29c1, 0x70a4, 0xa086, 0x0001, 0x00c0, 0x2a0b, 0x007c, 0x6020, + 0xa005, 0x0040, 0x3d7d, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, + 0x600a, 0x700f, 0x0100, 0x702c, 0x6026, 0x007c, 0xa006, 0x1078, + 0x4586, 0x7000, 0xa086, 0x0002, 0x0040, 0x3d8b, 0x7064, 0xa086, + 0x0005, 0x00c0, 0x3d95, 0x682b, 0x0000, 0x6817, 0x0000, 0x681b, 0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x000f, - 0x0079, 0x3b8a, 0x2946, 0x3b94, 0x3b94, 0x3bb1, 0x3b9c, 0x2946, - 0x3b92, 0x3b92, 0x1078, 0x28ec, 0x1078, 0x3bbc, 0x1078, 0x3bb5, - 0x1078, 0x202a, 0x0078, 0x2946, 0x7064, 0x7067, 0x0000, 0x7083, - 0x0000, 0x0079, 0x3ba3, 0x3bad, 0x3bad, 0x3bab, 0x3bab, 0x3bab, - 0x3bad, 0x3bab, 0x3bad, 0x0079, 0x2e5c, 0x7067, 0x0000, 0x0078, - 0x2946, 0x681b, 0x0000, 0x0078, 0x35ae, 0x6800, 0xa005, 0x00c0, - 0x3bba, 0x6002, 0x6006, 0x007c, 0x6410, 0x84ff, 0x0040, 0x3bce, - 0x2009, 0x4a02, 0x2104, 0x8001, 0x200a, 0x8421, 0x6412, 0x00c0, - 0x3bce, 0x2021, 0x4a04, 0x2404, 0xc0a5, 0x2022, 0x6008, 0xc0a4, - 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, 0x3bd8, 0x8001, 0x601a, - 0x007c, 0x1078, 0x4131, 0x681b, 0x0018, 0x0078, 0x3c1a, 0x1078, - 0x4131, 0x681b, 0x0019, 0x0078, 0x3c1a, 0x1078, 0x4131, 0x681b, - 0x001a, 0x0078, 0x3c1a, 0x1078, 0x4131, 0x681b, 0x0003, 0x0078, - 0x3c1a, 0x7774, 0x1078, 0x3fe1, 0x7178, 0xa18c, 0x00ff, 0x3210, - 0xa294, 0x0300, 0x0040, 0x3c00, 0xa1e8, 0x8fc0, 0x0078, 0x3c02, - 0xa1e8, 0x90d0, 0x2d04, 0x2d08, 0x2068, 0xa005, 0x00c0, 0x3c0a, - 0x0078, 0x2946, 0x6814, 0xc0fc, 0x7274, 0xc2fc, 0xa206, 0x0040, - 0x3c14, 0x6800, 0x0078, 0x3c03, 0x6800, 0x200a, 0x681b, 0x0005, - 0x707f, 0x0000, 0x1078, 0x3bbc, 0x6820, 0xd084, 0x00c0, 0x3c22, - 0x1078, 0x3bb5, 0x1078, 0x3bd2, 0x681f, 0x0000, 0x6823, 0x0020, - 0x1078, 0x202a, 0x0078, 0x2946, 0xa282, 0x0003, 0x00c0, 0x3e9d, - 0x7da8, 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xc1bd, - 0x6922, 0xd1c4, 0x0040, 0x3c86, 0xc1c4, 0x6922, 0xa6b4, 0x00ff, - 0x0040, 0x3c73, 0xa682, 0x000c, 0x0048, 0x3c4a, 0x0040, 0x3c4a, - 0x2031, 0x000c, 0x2500, 0xa086, 0x000a, 0x0040, 0x3c51, 0x852b, - 0x852b, 0x1078, 0x3f73, 0x0040, 0x3c59, 0x1078, 0x3d55, 0x0078, - 0x3c7c, 0x1078, 0x3f2e, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, - 0x6006, 0x1078, 0x3d8a, 0x0c7f, 0x6920, 0xc1c5, 0x6922, 0x7e58, - 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3c70, 0x781b, 0x0061, 0x007c, - 0x781b, 0x0075, 0x007c, 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, - 0x6006, 0x1078, 0x3d8a, 0x0c7f, 0x7e58, 0xd6d4, 0x00c0, 0x3c83, - 0x781b, 0x0064, 0x007c, 0x781b, 0x0076, 0x007c, 0x0c7e, 0x7058, - 0x2060, 0x6100, 0xd1e4, 0x0040, 0x3ccf, 0x6208, 0x8217, 0xa294, - 0x00ff, 0xa282, 0x000c, 0x0048, 0x3c99, 0x0040, 0x3c99, 0x2011, - 0x000c, 0x2600, 0xa202, 0x00c8, 0x3c9e, 0x2230, 0x6208, 0xa294, - 0x00ff, 0x2001, 0x4a05, 0x2004, 0xd0e4, 0x00c0, 0x3cb3, 0x78ec, - 0xd0e4, 0x0040, 0x3cb3, 0xa282, 0x000a, 0x00c8, 0x3cb9, 0x2011, - 0x000a, 0x0078, 0x3cb9, 0xa282, 0x000c, 0x00c8, 0x3cb9, 0x2011, - 0x000c, 0x2200, 0xa502, 0x00c8, 0x3cbe, 0x2228, 0x1078, 0x3f32, - 0x2500, 0xa086, 0x000a, 0x0040, 0x3cc7, 0x852b, 0x852b, 0x1078, - 0x3f73, 0x0040, 0x3ccf, 0x1078, 0x3d55, 0x0078, 0x3cd3, 0x1078, - 0x3f2e, 0x1078, 0x3d8a, 0x7858, 0xc095, 0x785a, 0x0c7f, 0x781b, - 0x0075, 0x007c, 0x0c7e, 0x2960, 0x6000, 0xd0e4, 0x00c0, 0x3cf1, - 0x6010, 0xa084, 0x000f, 0x00c0, 0x3ceb, 0x6104, 0xa18c, 0xfff5, - 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, - 0x3d1c, 0x68a0, 0xd0cc, 0x00c0, 0x3ceb, 0x6208, 0xa294, 0x00ff, - 0x2001, 0x4a05, 0x2004, 0xd0e4, 0x00c0, 0x3d0a, 0x78ec, 0xd0e4, - 0x0040, 0x3d0a, 0xa282, 0x000a, 0x00c0, 0x3d0a, 0x2011, 0x000a, - 0x0078, 0x3d10, 0xa282, 0x000c, 0x00c8, 0x3d10, 0x2011, 0x000c, - 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c, 0x0048, 0x3d1c, - 0x0040, 0x3d1c, 0x2019, 0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003, - 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xc0c5, - 0x6822, 0x70d4, 0xd0b4, 0x0040, 0x3d38, 0xc0b4, 0x70d6, 0x70b8, - 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, - 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6104, 0xa18c, 0xfff5, 0x6106, - 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3d46, 0x78ab, 0x0001, + 0x0079, 0x3d9a, 0x29c5, 0x3daa, 0x3da4, 0x3dcc, 0x3db4, 0x29c5, + 0x3da2, 0x3da2, 0x1078, 0x296b, 0x1078, 0x3dd7, 0x1078, 0x3dd0, + 0x0078, 0x3db0, 0x1078, 0x3dd7, 0x705c, 0x2060, 0x6800, 0x6002, + 0x1078, 0x202c, 0x0078, 0x29c5, 0x7064, 0x7067, 0x0000, 0x7083, + 0x0000, 0x0079, 0x3dbb, 0x3dc8, 0x3dc8, 0x3dc3, 0x3dc3, 0x3dc3, + 0x3dc8, 0x3dc3, 0x3dc8, 0x77d4, 0xc7dd, 0x77d6, 0x0079, 0x2f35, + 0x7067, 0x0000, 0x0078, 0x29c5, 0x681b, 0x0000, 0x0078, 0x36c8, + 0x6800, 0xa005, 0x00c0, 0x3dd5, 0x6002, 0x6006, 0x007c, 0x6410, + 0x84ff, 0x0040, 0x3de9, 0x2009, 0x4e02, 0x2104, 0x8001, 0x200a, + 0x8421, 0x6412, 0x00c0, 0x3de9, 0x2021, 0x4e04, 0x2404, 0xc0a5, + 0x2022, 0x6008, 0xc0a4, 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, + 0x3df3, 0x8001, 0x601a, 0x007c, 0x1078, 0x4383, 0x681b, 0x0018, + 0x0078, 0x3e34, 0x1078, 0x4383, 0x681b, 0x0019, 0x0078, 0x3e34, + 0x1078, 0x4383, 0x681b, 0x001a, 0x0078, 0x3e34, 0x1078, 0x4383, + 0x681b, 0x0003, 0x0078, 0x3e34, 0x7774, 0x1078, 0x41fe, 0x7178, + 0xa18c, 0x00ff, 0x3210, 0xa294, 0x0300, 0x0040, 0x3e1b, 0xa1e8, + 0x93c0, 0x0078, 0x3e1d, 0xa1e8, 0x94d0, 0x2d04, 0x2d08, 0x2068, + 0xa005, 0x00c0, 0x3e26, 0x707e, 0x0078, 0x29c5, 0x6814, 0x7274, + 0xa206, 0x0040, 0x3e2e, 0x6800, 0x0078, 0x3e1e, 0x6800, 0x200a, + 0x681b, 0x0005, 0x707f, 0x0000, 0x1078, 0x3dd7, 0x6820, 0xd084, + 0x00c0, 0x3e3c, 0x1078, 0x3dd0, 0x1078, 0x3ded, 0x681f, 0x0000, + 0x6823, 0x0020, 0x1078, 0x202c, 0x0078, 0x29c5, 0xa282, 0x0003, + 0x00c0, 0x40b7, 0x7da8, 0xa5ac, 0x00ff, 0x7e5a, 0x7ea8, 0xa6b4, + 0x00ff, 0x6920, 0xc1bd, 0x6922, 0xd1c4, 0x0040, 0x3ea1, 0xc1c4, + 0x6922, 0xa6b4, 0x00ff, 0x0040, 0x3e8e, 0xa682, 0x000c, 0x0048, + 0x3e65, 0x0040, 0x3e65, 0x2031, 0x000c, 0x2500, 0xa086, 0x000a, + 0x0040, 0x3e6c, 0x852b, 0x852b, 0x1078, 0x4190, 0x0040, 0x3e74, + 0x1078, 0x3f6f, 0x0078, 0x3e97, 0x1078, 0x414b, 0x0c7e, 0x2960, + 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3fa5, 0x0c7f, 0x6920, + 0xc1c5, 0x6922, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, 0x3e8b, + 0x781b, 0x0064, 0x007c, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960, + 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x3fa5, 0x0c7f, 0x7e58, + 0xd6d4, 0x00c0, 0x3e9e, 0x781b, 0x0067, 0x007c, 0x781b, 0x0079, + 0x007c, 0x0c7e, 0x7058, 0x2060, 0x6100, 0xd1e4, 0x0040, 0x3eea, + 0x6208, 0x8217, 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x3eb4, + 0x0040, 0x3eb4, 0x2011, 0x000c, 0x2600, 0xa202, 0x00c8, 0x3eb9, + 0x2230, 0x6208, 0xa294, 0x00ff, 0x2001, 0x4e05, 0x2004, 0xd0e4, + 0x00c0, 0x3ece, 0x78ec, 0xd0e4, 0x0040, 0x3ece, 0xa282, 0x000a, + 0x00c8, 0x3ed4, 0x2011, 0x000a, 0x0078, 0x3ed4, 0xa282, 0x000c, + 0x00c8, 0x3ed4, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, 0x3ed9, + 0x2228, 0x1078, 0x414f, 0x2500, 0xa086, 0x000a, 0x0040, 0x3ee2, + 0x852b, 0x852b, 0x1078, 0x4190, 0x0040, 0x3eea, 0x1078, 0x3f6f, + 0x0078, 0x3eee, 0x1078, 0x414b, 0x1078, 0x3fa5, 0x7858, 0xc095, + 0x785a, 0x0c7f, 0x781b, 0x0078, 0x007c, 0x0c7e, 0x2960, 0x6000, + 0xd0e4, 0x00c0, 0x3f0b, 0xa084, 0x0040, 0x00c0, 0x3f05, 0x6104, + 0xa18c, 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, + 0x0000, 0x0078, 0x3f36, 0x68a0, 0xd0cc, 0x00c0, 0x3f05, 0x6208, + 0xa294, 0x00ff, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x3f24, + 0x78ec, 0xd0e4, 0x0040, 0x3f24, 0xa282, 0x000b, 0x00c8, 0x3f24, + 0x2011, 0x000a, 0x0078, 0x3f2a, 0xa282, 0x000c, 0x00c8, 0x3f2a, + 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, 0x00ff, 0xa382, 0x000c, + 0x0048, 0x3f36, 0x0040, 0x3f36, 0x2019, 0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, - 0x6820, 0xc0c5, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7158, 0x2160, - 0x2018, 0xa08c, 0x0020, 0x0040, 0x3d5e, 0xc0ac, 0x2008, 0xa084, - 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, 0x78a4, - 0xa084, 0xfff0, 0xa18c, 0x000f, 0xa105, 0xa39c, 0x0020, 0x0040, - 0x3d73, 0xa085, 0x4000, 0xc0fc, 0xd0b4, 0x00c0, 0x3d78, 0xc0fd, - 0x78a6, 0x6016, 0x788a, 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004, - 0xa084, 0x00ff, 0xa605, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, - 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x6018, 0x789a, 0x78a4, - 0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, - 0x600c, 0xa084, 0x00ff, 0x600e, 0x0c7f, 0x007c, 0xa282, 0x0002, - 0x00c0, 0x3e9d, 0x7aa8, 0x6920, 0xc1bd, 0x6922, 0xd1cc, 0x0040, - 0x3dd9, 0xc1cc, 0x6922, 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, - 0x3e9d, 0x1078, 0x3e2a, 0x1078, 0x3d8a, 0xa980, 0x0001, 0x200c, - 0x1078, 0x3fdd, 0x1078, 0x3cda, 0x88ff, 0x0040, 0x3dcf, 0x789b, - 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, 0x7e5a, 0xd6d4, 0x00c0, - 0x3dcc, 0x781b, 0x0061, 0x007c, 0x781b, 0x0075, 0x007c, 0x7e58, - 0xd6d4, 0x00c0, 0x3dd6, 0x781b, 0x0064, 0x007c, 0x781b, 0x0076, - 0x007c, 0xa282, 0x0002, 0x00c8, 0x3de1, 0xa284, 0x0001, 0x0040, - 0x3dea, 0x7158, 0xa188, 0x0000, 0x210c, 0xd1ec, 0x00c0, 0x3dea, - 0x2011, 0x0000, 0x1078, 0x3f0f, 0x1078, 0x3e2a, 0x1078, 0x3d8a, - 0x7858, 0xc095, 0x785a, 0x781b, 0x0075, 0x007c, 0x0c7e, 0x027e, - 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, 0x00c0, 0x3e0b, 0x6014, - 0xa084, 0x0040, 0x00c0, 0x3e09, 0xc1a4, 0x6106, 0xa006, 0x0078, - 0x3e27, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, - 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x70d4, 0xd0b4, 0x0040, 0x3e23, - 0xc0b4, 0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, - 0x6018, 0x8001, 0x601a, 0x6820, 0xa085, 0x0200, 0x6822, 0x027f, - 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x82ff, 0x0040, 0x3e32, - 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, 0x78a4, 0xa084, - 0xffbf, 0xa205, 0xc0fc, 0xd0b4, 0x00c0, 0x3e3f, 0xc0fd, 0x78a6, - 0x6016, 0x788a, 0x6004, 0xc0a4, 0x6006, 0x0c7f, 0x007c, 0x007e, - 0x7000, 0xa086, 0x0003, 0x0040, 0x3e50, 0x007f, 0x0078, 0x3e53, - 0x007f, 0x0078, 0x3e9a, 0xd6ac, 0x0040, 0x3e9a, 0x7888, 0xa084, - 0x0040, 0x0040, 0x3e9a, 0x7bb8, 0xa384, 0x003f, 0x831b, 0x00c8, - 0x3e62, 0x8000, 0xa005, 0x0040, 0x3e77, 0x831b, 0x00c8, 0x3e6b, - 0x8001, 0x0040, 0x3e97, 0xd6f4, 0x0040, 0x3e77, 0x78b8, 0x801b, - 0x00c8, 0x3e73, 0x8000, 0xa084, 0x003f, 0x00c0, 0x3e97, 0xc6f4, - 0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, 0x00c8, 0x3e82, - 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x46e5, - 0x781b, 0x0073, 0xb284, 0x0300, 0x0040, 0x3e92, 0x2001, 0x0000, - 0x0078, 0x3e94, 0x2001, 0x0001, 0x1078, 0x4585, 0x007c, 0x781b, - 0x0073, 0x007c, 0x781b, 0x0076, 0x007c, 0x1078, 0x3ec2, 0x781b, - 0x0075, 0x007c, 0x1078, 0x3eae, 0x781b, 0x0075, 0x007c, 0x6827, - 0x0002, 0x1078, 0x3eb6, 0x781b, 0x0075, 0x007c, 0x2001, 0x0005, - 0x0078, 0x3ec4, 0x2001, 0x000c, 0x0078, 0x3ec4, 0x2001, 0x0006, - 0x0078, 0x3ec4, 0x2001, 0x000d, 0x0078, 0x3ec4, 0x2001, 0x0009, - 0x0078, 0x3ec4, 0x2001, 0x0007, 0x789b, 0x007e, 0x78aa, 0xc69d, - 0x7e5a, 0x70d4, 0xd0b4, 0x0040, 0x3eda, 0xc0b4, 0x70d6, 0x0c7e, + 0x6820, 0xc0c5, 0x6822, 0x70d4, 0xd0b4, 0x0040, 0x3f52, 0xc0b4, + 0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, + 0x8001, 0x601a, 0x0c7f, 0x007c, 0x0c7e, 0x2960, 0x6104, 0xa18c, + 0xfff5, 0x6106, 0x2011, 0x0032, 0x2019, 0x0000, 0x0078, 0x3f60, + 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, 0x7baa, + 0xa8c0, 0x0005, 0x6820, 0xc0c5, 0x6822, 0x0c7f, 0x007c, 0x0c7e, + 0x7158, 0x2160, 0x2018, 0xa08c, 0x0020, 0x0040, 0x3f78, 0xc0ac, + 0x2008, 0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, + 0x6612, 0x78a4, 0xa084, 0xfff0, 0xa18c, 0x000f, 0xa105, 0xc0f4, + 0xa39c, 0x0020, 0x0040, 0x3f8e, 0xa085, 0x4000, 0xc0fc, 0xd0b4, + 0x00c0, 0x3f93, 0xc0fd, 0x78a6, 0x6016, 0x788a, 0xa6b4, 0x000f, + 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, 0xa605, 0x600e, 0x6004, + 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, + 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, 0x78a6, 0x6012, 0x7884, + 0xa084, 0xfff0, 0x7886, 0x600c, 0xa084, 0x00ff, 0x600e, 0x0c7f, + 0x007c, 0xa282, 0x0002, 0x00c0, 0x40b7, 0x7aa8, 0x6920, 0xc1bd, + 0x6922, 0xd1cc, 0x0040, 0x3ff4, 0xc1cc, 0x6922, 0xa294, 0x00ff, + 0xa282, 0x0002, 0x00c8, 0x40b7, 0x1078, 0x4044, 0x1078, 0x3fa5, + 0xa980, 0x0001, 0x200c, 0x1078, 0x41fa, 0x1078, 0x3ef5, 0x88ff, + 0x0040, 0x3fea, 0x789b, 0x0060, 0x2800, 0x78aa, 0x7e58, 0xc695, + 0x7e5a, 0xd6d4, 0x00c0, 0x3fe7, 0x781b, 0x0064, 0x007c, 0x781b, + 0x0078, 0x007c, 0x7e58, 0xd6d4, 0x00c0, 0x3ff1, 0x781b, 0x0067, + 0x007c, 0x781b, 0x0079, 0x007c, 0xa282, 0x0002, 0x00c8, 0x3ffc, + 0xa284, 0x0001, 0x0040, 0x4005, 0x7158, 0xa188, 0x0000, 0x210c, + 0xd1ec, 0x00c0, 0x4005, 0x2011, 0x0000, 0x1078, 0x412c, 0x1078, + 0x4044, 0x1078, 0x3fa5, 0x7858, 0xc095, 0x785a, 0x781b, 0x0078, + 0x007c, 0x0c7e, 0x027e, 0x2960, 0x6000, 0x2011, 0x0001, 0xd0ec, + 0x00c0, 0x4025, 0xa084, 0x0080, 0x00c0, 0x4023, 0xc1a4, 0x6106, + 0xa006, 0x0078, 0x4041, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, + 0x0002, 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x70d4, 0xd0b4, + 0x0040, 0x403d, 0xc0b4, 0x70d6, 0x70b8, 0xa065, 0x6008, 0xa084, + 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x6820, 0xa085, 0x0200, + 0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7058, 0x2060, 0x82ff, + 0x0040, 0x404c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, + 0x78a4, 0xa084, 0xffbf, 0xa205, 0xc0fc, 0xd0b4, 0x00c0, 0x4059, + 0xc0fd, 0x78a6, 0x6016, 0x788a, 0x6004, 0xc0a4, 0x6006, 0x0c7f, + 0x007c, 0x007e, 0x7000, 0xa086, 0x0003, 0x0040, 0x406a, 0x007f, + 0x0078, 0x406d, 0x007f, 0x0078, 0x40b4, 0xd6ac, 0x0040, 0x40b4, + 0x7888, 0xa084, 0x0040, 0x0040, 0x40b4, 0x7bb8, 0xa384, 0x003f, + 0x831b, 0x00c8, 0x407c, 0x8000, 0xa005, 0x0040, 0x4091, 0x831b, + 0x00c8, 0x4085, 0x8001, 0x0040, 0x40b1, 0xd6f4, 0x0040, 0x4091, + 0x78b8, 0x801b, 0x00c8, 0x408d, 0x8000, 0xa084, 0x003f, 0x00c0, + 0x40b1, 0xc6f4, 0x7e5a, 0x79d8, 0x7adc, 0x2001, 0x0001, 0xa108, + 0x00c8, 0x409c, 0xa291, 0x0000, 0x79d2, 0x79da, 0x7ad6, 0x7ade, + 0x1078, 0x49c3, 0x781b, 0x0076, 0xb284, 0x0300, 0x0040, 0x40ac, + 0x2001, 0x0000, 0x0078, 0x40ae, 0x2001, 0x0001, 0x1078, 0x484b, + 0x007c, 0x781b, 0x0076, 0x007c, 0x781b, 0x0079, 0x007c, 0x1078, + 0x40df, 0x781b, 0x0078, 0x007c, 0x1078, 0x40c8, 0x781b, 0x0078, + 0x007c, 0x6827, 0x0002, 0x1078, 0x40d0, 0x781b, 0x0078, 0x007c, + 0x2001, 0x0005, 0x0078, 0x40e1, 0x2001, 0x000c, 0x0078, 0x40e1, + 0x6820, 0xc0d5, 0x6822, 0x2001, 0x0006, 0x0078, 0x40e1, 0x2001, + 0x000d, 0x0078, 0x40e1, 0x2001, 0x0009, 0x0078, 0x40e1, 0x2001, + 0x0007, 0x789b, 0x007e, 0x78aa, 0xc69d, 0x7e5a, 0x70d4, 0xd0b4, + 0x0040, 0x40f7, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, + 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c, + 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, 0x873b, 0x8703, 0x017e, + 0xb28c, 0x0300, 0x0040, 0x4108, 0xa0e0, 0x52c0, 0x0078, 0x410a, + 0xa0e0, 0x5340, 0x017f, 0xa7b8, 0x0020, 0x7f9a, 0x79a4, 0xa184, + 0x000f, 0x0040, 0x411a, 0xa184, 0xfff0, 0x78a6, 0x6012, 0x6004, + 0xc09d, 0x6006, 0x8738, 0x8738, 0x7f9a, 0x79a4, 0xa184, 0x0040, + 0x0040, 0x412a, 0xa184, 0xffbf, 0xc0fd, 0x78a6, 0x6016, 0x6004, + 0xc0a5, 0x6006, 0x077f, 0x007c, 0x789b, 0x0010, 0x78ab, 0x0001, + 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, 0x789b, 0x0060, 0x78ab, + 0x0004, 0x70d4, 0xd0b4, 0x0040, 0x414a, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, - 0x601a, 0x0c7f, 0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, 0x873b, - 0x873b, 0x8703, 0x017e, 0xb28c, 0x0300, 0x0040, 0x3eeb, 0xa0e0, - 0x4ec0, 0x0078, 0x3eed, 0xa0e0, 0x4f40, 0x017f, 0xa7b8, 0x0020, - 0x7f9a, 0x79a4, 0xa184, 0x000f, 0x0040, 0x3efd, 0xa184, 0xfff0, - 0x78a6, 0x6012, 0x6004, 0xc09d, 0x6006, 0x8738, 0x8738, 0x7f9a, - 0x79a4, 0xa184, 0x0040, 0x0040, 0x3f0d, 0xa184, 0xffbf, 0xc0fd, - 0x78a6, 0x6016, 0x6004, 0xc0a5, 0x6006, 0x077f, 0x007c, 0x789b, - 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, - 0x789b, 0x0060, 0x78ab, 0x0004, 0x70d4, 0xd0b4, 0x0040, 0x3f2d, - 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, 0xfbef, - 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c, 0x2031, 0x0000, - 0x2029, 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, - 0x78ab, 0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, - 0x70d4, 0xd0b4, 0x0040, 0x3f51, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, - 0xa065, 0x6008, 0xa084, 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, - 0x0c7f, 0x007c, 0x157e, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, - 0xa080, 0x0020, 0x789a, 0x79a4, 0xa18c, 0xfff0, 0x2021, 0x3fc6, - 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, 0x0032, 0x2404, 0xa084, - 0xfff0, 0xa106, 0x0040, 0x3f71, 0x8420, 0x2300, 0xa210, 0x00f0, - 0x3f66, 0x157f, 0x007c, 0x157e, 0x2001, 0x4a05, 0x2004, 0xd0e4, - 0x00c0, 0x3fa4, 0x2021, 0x3fd4, 0x20a9, 0x0009, 0x2011, 0x0028, - 0xa582, 0x0019, 0x0040, 0x3fba, 0x0048, 0x3fba, 0x8420, 0x95a9, - 0x2011, 0x0032, 0xa582, 0x0032, 0x0040, 0x3fba, 0x0048, 0x3fba, - 0x8420, 0x95a9, 0x2019, 0x000a, 0x2011, 0x0064, 0x2200, 0xa502, - 0x0040, 0x3fba, 0x0048, 0x3fba, 0x8420, 0x2300, 0xa210, 0x00f0, - 0x3f96, 0x157f, 0x0078, 0x3fb8, 0x2021, 0x3fc6, 0x2019, 0x0011, - 0x20a9, 0x000e, 0x2011, 0x0032, 0x2200, 0xa502, 0x0040, 0x3fba, - 0x0048, 0x3fba, 0x8420, 0x2300, 0xa210, 0x00f0, 0x3fac, 0x157f, - 0xa006, 0x007c, 0x157f, 0xa582, 0x0064, 0x00c8, 0x3fc3, 0x7808, - 0xa085, 0x0070, 0x780a, 0x2404, 0xa005, 0x007c, 0x1209, 0x3002, - 0x3202, 0x4203, 0x4403, 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, - 0x7a06, 0x0c07, 0x0c07, 0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, - 0x6a06, 0x6c06, 0x7c07, 0x7e07, 0x0e00, 0x789b, 0x0010, 0xa046, - 0x007c, 0xa784, 0x0f00, 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, - 0x8003, 0x8003, 0xa105, 0xd7fc, 0x0040, 0x3ff2, 0xa0e0, 0x6fc0, - 0x0078, 0x3ff4, 0xa0e0, 0x4fc0, 0x007c, 0x0e7e, 0x0f7e, 0xd084, - 0x0040, 0x4002, 0x2079, 0x0100, 0x2009, 0x4a80, 0x2071, 0x4a80, - 0x0078, 0x4014, 0x2009, 0x4a40, 0x007e, 0x2001, 0x4a04, 0x2004, - 0xd0ec, 0x007f, 0x0040, 0x4010, 0x2079, 0x0100, 0x0078, 0x4014, - 0x2079, 0x0200, 0x2071, 0x4a40, 0x2091, 0x8000, 0x2104, 0xa084, - 0x000f, 0x0079, 0x401b, 0x405d, 0x4025, 0x4025, 0x4025, 0x4025, - 0x4025, 0x4023, 0x4023, 0x1078, 0x28ec, 0x784b, 0x0004, 0x7848, - 0xa084, 0x0004, 0x00c0, 0x4027, 0x784b, 0x0008, 0x7848, 0xa084, - 0x0008, 0x00c0, 0x402e, 0x68b4, 0xc0f5, 0x68b6, 0x7858, 0xc0f5, - 0x785a, 0x7830, 0xd0bc, 0x00c0, 0x405d, 0x007e, 0x2001, 0x4a04, - 0x2004, 0xd0ec, 0x007f, 0x0040, 0x4049, 0xb284, 0x0300, 0x0078, - 0x404b, 0xb284, 0x0400, 0x0040, 0x4051, 0x0018, 0x405d, 0x0078, - 0x4053, 0x0028, 0x405d, 0x681c, 0xd0ac, 0x00c0, 0x405b, 0x1078, - 0x40d5, 0x0078, 0x405d, 0x781b, 0x00f0, 0x2091, 0x8001, 0x0f7f, - 0x0e7f, 0x007c, 0x0c7e, 0x2001, 0x4a01, 0x2004, 0xd0ac, 0x00c0, - 0x40c7, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, - 0xb28c, 0x0300, 0x0040, 0x4078, 0xa0e0, 0x4ec0, 0x0078, 0x407a, - 0xa0e0, 0x4f40, 0x6004, 0xa084, 0x000a, 0x00c0, 0x40c7, 0x6108, - 0xa194, 0xff00, 0x0040, 0x40c7, 0xa18c, 0x00ff, 0x2001, 0x000a, - 0xa106, 0x0040, 0x40a6, 0x2001, 0x000c, 0xa106, 0x0040, 0x40aa, - 0x2001, 0x0012, 0xa106, 0x0040, 0x40ae, 0x2001, 0x0014, 0xa106, - 0x0040, 0x40b2, 0x2001, 0x0019, 0xa106, 0x0040, 0x40b6, 0x2001, - 0x0032, 0xa106, 0x0040, 0x40ba, 0x0078, 0x40be, 0x2009, 0x000c, - 0x0078, 0x40c0, 0x2009, 0x0012, 0x0078, 0x40c0, 0x2009, 0x0014, - 0x0078, 0x40c0, 0x2009, 0x0019, 0x0078, 0x40c0, 0x2009, 0x0020, - 0x0078, 0x40c0, 0x2009, 0x003f, 0x0078, 0x40c0, 0x2011, 0x0000, - 0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, - 0x007c, 0x781b, 0x0076, 0x007c, 0x781b, 0x0075, 0x007c, 0x781b, - 0x0064, 0x007c, 0x781b, 0x0061, 0x007c, 0x2009, 0x4a19, 0x210c, - 0xa186, 0x0000, 0x0040, 0x40e7, 0xa186, 0x0001, 0x0040, 0x40ea, - 0x701f, 0x000b, 0x7067, 0x0001, 0x781b, 0x0047, 0x007c, 0x781b, - 0x00e7, 0x007c, 0x701f, 0x000a, 0x007c, 0x2009, 0x4a19, 0x210c, - 0xa186, 0x0000, 0x0040, 0x4102, 0xa186, 0x0001, 0x0040, 0x40ff, - 0x701f, 0x000b, 0x7067, 0x0001, 0x781b, 0x0047, 0x007c, 0x701f, - 0x000a, 0x007c, 0x781b, 0x00e6, 0x007c, 0x781b, 0x00f0, 0x007c, - 0x781b, 0x00ef, 0x007c, 0x781b, 0x00c0, 0x007c, 0x781b, 0x00bf, - 0x007c, 0x6818, 0xd0fc, 0x0040, 0x4117, 0x681b, 0x001d, 0x7067, - 0x0001, 0x781b, 0x0047, 0x007c, 0x7830, 0xa084, 0x00c0, 0x00c0, - 0x4130, 0x7808, 0xc08c, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005, - 0x78ec, 0xa084, 0x0021, 0x0040, 0x4130, 0x7808, 0xc08d, 0x780a, - 0x007c, 0x7808, 0xc08d, 0x780a, 0x007c, 0x7830, 0xa084, 0x0040, - 0x00c0, 0x4135, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x0040, 0x4144, - 0xb284, 0x0300, 0x0078, 0x4146, 0xb284, 0x0400, 0x0040, 0x414c, - 0x0098, 0x4150, 0x0078, 0x414e, 0x00a8, 0x4150, 0x78ac, 0x007c, - 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005, 0x0005, 0x0005, - 0x78ec, 0xa084, 0x0021, 0x0040, 0x4173, 0x007e, 0x2001, 0x4a04, - 0x2004, 0xd0ec, 0x007f, 0x0040, 0x4169, 0xb284, 0x0300, 0x0078, - 0x416b, 0xb284, 0x0400, 0x0040, 0x4171, 0x0098, 0x416d, 0x0078, - 0x4173, 0x00a8, 0x4171, 0x78ac, 0x007e, 0x7808, 0xa085, 0x0002, - 0x780a, 0x007f, 0x007c, 0xa784, 0x0001, 0x00c0, 0x360e, 0xa784, - 0x0070, 0x0040, 0x418b, 0x0c7e, 0x2d60, 0x2f68, 0x1078, 0x2881, - 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040, 0x4198, 0x784b, - 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2946, 0x0078, 0x40c9, - 0xa784, 0x0004, 0x0040, 0x41c7, 0x78b8, 0xa084, 0x4001, 0x0040, - 0x41c7, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2946, - 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0, 0x41c7, 0x78c0, - 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00f0, 0x007c, 0x784b, - 0x0008, 0x6818, 0xd0fc, 0x0040, 0x41c4, 0x681b, 0x0015, 0xd6f4, - 0x0040, 0x41c4, 0x681b, 0x0007, 0x1078, 0x40d5, 0x007c, 0x681b, - 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833, - 0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x2f84, - 0x007e, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x41e4, - 0xb284, 0x0300, 0x0078, 0x41e6, 0xb284, 0x0400, 0x0040, 0x41ec, - 0x0018, 0x2942, 0x0078, 0x41ee, 0x0028, 0x2942, 0x0078, 0x3ea2, - 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xd3fc, - 0x0040, 0x41fe, 0xa080, 0x4f40, 0x0078, 0x4200, 0xa080, 0x4ec0, - 0x2060, 0x2048, 0x705a, 0x2a60, 0x007c, 0x0020, 0x0020, 0x0000, + 0x601a, 0x0c7f, 0x007c, 0x2031, 0x0000, 0x2029, 0x0032, 0x789b, + 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7daa, + 0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x70d4, 0xd0b4, 0x0040, + 0x416e, 0xc0b4, 0x70d6, 0x0c7e, 0x70b8, 0xa065, 0x6008, 0xa084, + 0xfbef, 0x600a, 0x6018, 0x8001, 0x601a, 0x0c7f, 0x007c, 0x157e, + 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, 0x789a, + 0x79a4, 0xa18c, 0xfff0, 0x2021, 0x41e3, 0x2019, 0x0011, 0x20a9, + 0x000e, 0x2011, 0x0032, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, + 0x418e, 0x8420, 0x2300, 0xa210, 0x00f0, 0x4183, 0x157f, 0x007c, + 0x157e, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x41c1, 0x2021, + 0x41f1, 0x20a9, 0x0009, 0x2011, 0x0028, 0xa582, 0x0019, 0x0040, + 0x41d7, 0x0048, 0x41d7, 0x8420, 0x95a9, 0x2011, 0x0032, 0xa582, + 0x0032, 0x0040, 0x41d7, 0x0048, 0x41d7, 0x8420, 0x95a9, 0x2019, + 0x000a, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x41d7, 0x0048, + 0x41d7, 0x8420, 0x2300, 0xa210, 0x00f0, 0x41b3, 0x157f, 0x0078, + 0x41d5, 0x2021, 0x41e3, 0x2019, 0x0011, 0x20a9, 0x000e, 0x2011, + 0x0032, 0x2200, 0xa502, 0x0040, 0x41d7, 0x0048, 0x41d7, 0x8420, + 0x2300, 0xa210, 0x00f0, 0x41c9, 0x157f, 0xa006, 0x007c, 0x157f, + 0xa582, 0x0064, 0x00c8, 0x41e0, 0x7808, 0xa085, 0x0070, 0x780a, + 0x2404, 0xa005, 0x007c, 0x1209, 0x3002, 0x3202, 0x4203, 0x4403, + 0x5404, 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0c07, 0x0c07, + 0x0e07, 0x10e1, 0x330a, 0x5805, 0x5a05, 0x6a06, 0x6c06, 0x7c07, + 0x7e07, 0x0e00, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, + 0x800b, 0xa784, 0x001f, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, + 0xd7fc, 0x0040, 0x420f, 0xa0e0, 0x73c0, 0x0078, 0x4211, 0xa0e0, + 0x53c0, 0x007c, 0x0e7e, 0x0f7e, 0xd084, 0x0040, 0x421f, 0x2079, + 0x0100, 0x2009, 0x4e80, 0x2071, 0x4e80, 0x0078, 0x422f, 0x2009, + 0x4e40, 0x2071, 0x4e40, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x0040, + 0x422d, 0x2079, 0x0100, 0x0078, 0x422f, 0x2079, 0x0200, 0x2091, + 0x8000, 0x2104, 0xa084, 0x000f, 0x0079, 0x4236, 0x4240, 0x4240, + 0x4240, 0x4240, 0x4240, 0x4240, 0x423e, 0x423e, 0x1078, 0x296b, + 0x69b4, 0xc1f5, 0xa18c, 0xff9f, 0x69b6, 0xa005, 0x0040, 0x428f, + 0x7858, 0xa084, 0xff9f, 0xa085, 0x6000, 0x785a, 0x7828, 0xa086, + 0x1814, 0x00c0, 0x428f, 0x784b, 0x0004, 0x7848, 0xa084, 0x0004, + 0x00c0, 0x4255, 0x784b, 0x0008, 0x7848, 0xa084, 0x0008, 0x00c0, + 0x425c, 0x7830, 0xd0bc, 0x00c0, 0x428f, 0x007e, 0x2001, 0x4e04, + 0x2004, 0xd0ec, 0x007f, 0x0040, 0x4271, 0xb284, 0x0300, 0x0078, + 0x4273, 0xb284, 0x0400, 0x0040, 0x4279, 0x0018, 0x428f, 0x0078, + 0x427b, 0x0028, 0x428f, 0x79e4, 0xa184, 0x0030, 0x0040, 0x428f, + 0x78ec, 0xa084, 0x0003, 0x0040, 0x428f, 0x681c, 0xd0ac, 0x00c0, + 0x428d, 0x1078, 0x4319, 0x0078, 0x428f, 0x781b, 0x00f9, 0x0f7f, + 0x0e7f, 0x007c, 0x0c7e, 0x2001, 0x4e01, 0x2004, 0xd0ac, 0x00c0, + 0x430b, 0x6814, 0x8007, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, + 0xb28c, 0x0300, 0x0040, 0x42a8, 0xa0e0, 0x52c0, 0x0078, 0x42aa, + 0xa0e0, 0x5340, 0x6004, 0xa084, 0x000a, 0x00c0, 0x430b, 0x6108, + 0xa194, 0xff00, 0x0040, 0x430b, 0xa18c, 0x00ff, 0x2001, 0x000a, + 0xa106, 0x0040, 0x42d6, 0x2001, 0x000c, 0xa106, 0x0040, 0x42da, + 0x2001, 0x0012, 0xa106, 0x0040, 0x42de, 0x2001, 0x0014, 0xa106, + 0x0040, 0x42e2, 0x2001, 0x0019, 0xa106, 0x0040, 0x42e6, 0x2001, + 0x0032, 0xa106, 0x0040, 0x42ea, 0x0078, 0x42ee, 0x2009, 0x000c, + 0x0078, 0x42f0, 0x2009, 0x0012, 0x0078, 0x42f0, 0x2009, 0x0014, + 0x0078, 0x42f0, 0x2009, 0x0019, 0x0078, 0x42f0, 0x2009, 0x0020, + 0x0078, 0x42f0, 0x2009, 0x003f, 0x0078, 0x42f0, 0x2011, 0x0000, + 0x2100, 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x2061, + 0x4e00, 0x6004, 0xd0bc, 0x0040, 0x430b, 0x6814, 0xd0fc, 0x00c0, + 0x4306, 0x60ea, 0x2061, 0x4e40, 0x0078, 0x4309, 0x60ee, 0x2061, + 0x4e80, 0x601f, 0x800f, 0x0c7f, 0x007c, 0x781b, 0x0079, 0x007c, + 0x781b, 0x0078, 0x007c, 0x781b, 0x0067, 0x007c, 0x781b, 0x0064, + 0x007c, 0x2009, 0x4e19, 0x210c, 0xa186, 0x0000, 0x0040, 0x432b, + 0xa186, 0x0001, 0x0040, 0x432e, 0x701f, 0x000b, 0x7067, 0x0001, + 0x781b, 0x0047, 0x007c, 0x781b, 0x00f0, 0x007c, 0x701f, 0x000a, + 0x007c, 0x2009, 0x4e19, 0x210c, 0xa186, 0x0000, 0x0040, 0x4346, + 0xa186, 0x0001, 0x0040, 0x4343, 0x701f, 0x000b, 0x7067, 0x0001, + 0x781b, 0x0047, 0x007c, 0x701f, 0x000a, 0x007c, 0x781b, 0x00ef, + 0x007c, 0x781b, 0x00f9, 0x007c, 0x781b, 0x00f8, 0x007c, 0x781b, + 0x00c9, 0x007c, 0x781b, 0x00c8, 0x007c, 0x6818, 0xd0fc, 0x0040, + 0x435b, 0x681b, 0x001d, 0x7067, 0x0001, 0x781b, 0x0047, 0x007c, + 0x7830, 0xa084, 0x00c0, 0x00c0, 0x4382, 0x7808, 0xc08c, 0x780a, + 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x00c0, + 0x437f, 0x2001, 0x4e05, 0x2004, 0xd0e4, 0x00c0, 0x437d, 0x7804, + 0xa084, 0xff1f, 0xa085, 0x00e0, 0x7806, 0xa006, 0x007c, 0x7808, + 0xc08d, 0x780a, 0x007c, 0x7808, 0xc08d, 0x780a, 0x007c, 0x7830, + 0xa084, 0x0040, 0x00c0, 0x4387, 0x2001, 0x4e04, 0x2004, 0xd0ec, + 0x0040, 0x4396, 0xb284, 0x0300, 0x0078, 0x4398, 0xb284, 0x0400, + 0x0040, 0x439e, 0x0098, 0x43a2, 0x0078, 0x43a0, 0x00a8, 0x43a2, + 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, 0x0005, + 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x43c5, 0x007e, + 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, 0x0040, 0x43bb, 0xb284, + 0x0300, 0x0078, 0x43bd, 0xb284, 0x0400, 0x0040, 0x43c3, 0x0098, + 0x43bf, 0x0078, 0x43c5, 0x00a8, 0x43c3, 0x78ac, 0x007e, 0x7808, + 0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0xa784, 0x0001, 0x00c0, + 0x3770, 0xa784, 0x0070, 0x0040, 0x43dd, 0x0c7e, 0x2d60, 0x2f68, + 0x1078, 0x28df, 0x2d78, 0x2c68, 0x0c7f, 0xa784, 0x0008, 0x0040, + 0x43ea, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, 0x0040, 0x3770, + 0x0078, 0x430d, 0xa784, 0x0004, 0x0040, 0x4419, 0x78b8, 0xa084, + 0x4001, 0x0040, 0x4419, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, + 0x0040, 0x3770, 0x78e4, 0xa084, 0x0007, 0xa086, 0x0001, 0x00c0, + 0x4419, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, 0x781b, 0x00f9, + 0x007c, 0x784b, 0x0008, 0x6818, 0xd0fc, 0x0040, 0x4416, 0x681b, + 0x0015, 0xd6f4, 0x0040, 0x4416, 0x681b, 0x0007, 0x1078, 0x4319, + 0x007c, 0x681b, 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f, + 0x0000, 0x6833, 0x0000, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, + 0x0040, 0x3066, 0x007e, 0x2001, 0x4e04, 0x2004, 0xd0ec, 0x007f, + 0x0040, 0x4436, 0xb284, 0x0300, 0x0078, 0x4438, 0xb284, 0x0400, + 0x0040, 0x443e, 0x0018, 0x29c1, 0x0078, 0x4440, 0x0028, 0x29c1, + 0x0078, 0x40bc, 0x6b14, 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, + 0x8003, 0xd3fc, 0x0040, 0x4450, 0xa080, 0x5340, 0x0078, 0x4452, + 0xa080, 0x52c0, 0x2060, 0x2048, 0x705a, 0x2a60, 0x007c, 0x0020, + 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, - 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0062, - 0x0009, 0x0014, 0x0014, 0x9848, 0x0014, 0x0014, 0x9906, 0x98f4, - 0x0014, 0x0014, 0x0080, 0x00f1, 0x0100, 0x0402, 0x2008, 0xf880, - 0x0018, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, 0x2500, 0x0013, - 0x2500, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, - 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0xa200, - 0x3806, 0x8839, 0x20c4, 0x0864, 0xa850, 0x3008, 0x28c1, 0x9d0d, - 0xa201, 0x300c, 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, - 0x883a, 0xa808, 0x28e2, 0x9cc2, 0xa8f3, 0x0864, 0xa83e, 0x300c, - 0xa801, 0x3008, 0x28e1, 0x9cc2, 0x2021, 0xa81b, 0xa205, 0x870c, - 0xd8de, 0x64a0, 0x6de0, 0x6fc0, 0x63a4, 0x6c80, 0x0212, 0xa205, - 0x883d, 0x9d25, 0x882b, 0x1814, 0x883b, 0x9d2b, 0x883b, 0x7027, - 0x85f2, 0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa812, 0x883e, - 0xa810, 0x280c, 0xa204, 0x64c0, 0x6de0, 0x67a0, 0x6fc0, 0x9d25, - 0x1814, 0x9d2b, 0x883b, 0x7023, 0x8576, 0x8677, 0xa802, 0x7861, - 0x883e, 0x206b, 0x28c1, 0x9d0d, 0x2044, 0x2103, 0x20a2, 0x2081, - 0xa8c9, 0xa207, 0x2901, 0xa80a, 0x0014, 0xa203, 0x8000, 0x85a4, - 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601, 0xa208, 0x856e, 0x866f, - 0x7161, 0x0014, 0x0704, 0x3008, 0x9cc2, 0x0014, 0xa202, 0x8000, - 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf844, 0x856e, 0x883f, 0x08e6, - 0xa8f5, 0xf861, 0xa8ea, 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, - 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, - 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014, 0x3008, 0x8000, 0x284a, - 0x1011, 0xa8fc, 0x3008, 0x9d25, 0x8000, 0xa000, 0x2802, 0x1011, - 0xa8fd, 0x9d2b, 0xa887, 0x3008, 0x9d25, 0x283b, 0x1011, 0xa8fd, - 0xa209, 0x0017, 0x300c, 0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, + 0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9848, 0x0014, 0x0014, + 0x9914, 0x98fd, 0x0014, 0x0014, 0x0080, 0x00ff, 0x0100, 0x0402, + 0x2008, 0xf880, 0x0018, 0xa20a, 0x0014, 0x300b, 0xa20c, 0x0014, + 0x2500, 0x0013, 0x2500, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0xa200, 0x3806, 0x7102, 0x805f, 0x9481, 0x8839, 0x20c4, + 0x0864, 0xa856, 0x3008, 0x28c1, 0x9d1b, 0xa201, 0x300c, 0x2847, + 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, 0x28e2, + 0x9ccb, 0xa8f3, 0x0864, 0xa844, 0x300c, 0xa801, 0x3008, 0x28e1, + 0x9ccb, 0x2021, 0xa81d, 0xa205, 0x870c, 0xd8de, 0x64a0, 0x6de0, + 0x6fc0, 0x63a4, 0x6c80, 0x0212, 0xa205, 0x883d, 0x7942, 0x8020, + 0xa4a1, 0x882b, 0x1814, 0x883b, 0x80df, 0x94a1, 0x7027, 0x85f2, + 0xa737, 0xa532, 0xf003, 0x8576, 0x8677, 0xa816, 0x883e, 0xa814, + 0x2001, 0xa812, 0xa204, 0x64c0, 0x6de0, 0x67a0, 0x6fc0, 0x7942, + 0x8020, 0xa4a1, 0x1814, 0x80df, 0x94a1, 0x883b, 0x7023, 0x8576, + 0x8677, 0xa802, 0x7861, 0x883e, 0x206b, 0x28c1, 0x9d1b, 0x2044, + 0x2103, 0x20a2, 0x2081, 0xa8c3, 0xa207, 0x0904, 0xa20e, 0xa809, + 0xa203, 0x8000, 0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601, + 0xa208, 0x856e, 0x866f, 0x7161, 0x0014, 0x0704, 0x3008, 0x9ccb, + 0x0014, 0xa202, 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf844, + 0x856e, 0x883f, 0x08e6, 0xa8f5, 0xf861, 0xa8ea, 0xf801, 0x0014, + 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, 0x1de2, 0x0014, + 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, 0x1fe6, 0x0014, + 0x3008, 0x8000, 0x284a, 0x1011, 0xa8fc, 0x3008, 0x9d33, 0x8000, + 0xa000, 0x2802, 0x1011, 0xa8fd, 0x9d39, 0xa8bd, 0x3008, 0x9d33, + 0x283b, 0x1011, 0xa8fd, 0xa209, 0x7102, 0x805f, 0x9481, 0x0017, + 0x300c, 0xa209, 0x8000, 0x85a4, 0x1de2, 0xa209, 0xdac1, 0x0014, 0x0210, 0xa801, 0x0014, 0x26e0, 0x873a, 0xfaa3, 0x19f2, 0x26e0, - 0x18f2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9d17, + 0x18f2, 0x0014, 0xa20b, 0x0014, 0xa20d, 0x3806, 0x0210, 0x9d25, 0x0704, 0xa206, 0x6865, 0x817e, 0x842a, 0x1dc1, 0x8823, 0x0016, 0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, 0xf021, 0x3008, 0x84a8, 0x11d6, 0x7042, 0x20dd, 0x0011, 0x20d4, 0x8822, 0x0016, 0x7944, 0x8421, 0xa020, 0xa532, 0x84a1, 0x0016, 0x7944, 0x8421, 0xa0df, 0x9532, 0x84a1, 0x0016, 0x0000, 0x127e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x2090, 0x7204, 0x7008, 0xc09c, 0xa205, - 0x00c0, 0x4342, 0x720c, 0x82ff, 0x0040, 0x433d, 0x8aff, 0x00c0, - 0x4342, 0x7200, 0xd284, 0x00c0, 0x4342, 0x7003, 0x0008, 0x127f, + 0x00c0, 0x45a2, 0x720c, 0x82ff, 0x0040, 0x459d, 0x8aff, 0x00c0, + 0x45a2, 0x7200, 0xd284, 0x00c0, 0x45a2, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x7000, 0xa084, 0x0003, 0x7002, 0xc69c, 0xd084, - 0x0040, 0x4374, 0x2001, 0x4a05, 0x2004, 0xd0ec, 0x00c0, 0x43a5, - 0xd0e4, 0x00c0, 0x435a, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0003, - 0x0040, 0x43a5, 0x0e7e, 0x2071, 0x0010, 0x2009, 0x0007, 0x7008, - 0xa084, 0x3000, 0x00c0, 0x435d, 0x8109, 0x00c0, 0x435f, 0x0e7f, - 0x2009, 0x0007, 0x7008, 0xa084, 0x3000, 0x00c0, 0x435a, 0x8109, - 0x00c0, 0x436a, 0x0078, 0x43a5, 0x7108, 0xd1fc, 0x0040, 0x437f, - 0x1078, 0x44ba, 0x8aff, 0x0040, 0x432c, 0x0078, 0x4374, 0x700c, - 0xa08c, 0x03ff, 0x0040, 0x43aa, 0x7004, 0xd084, 0x0040, 0x439c, - 0x7014, 0xa005, 0x00c0, 0x4398, 0x7010, 0x7310, 0xa306, 0x00c0, - 0x438c, 0x2300, 0xa005, 0x0040, 0x439c, 0xa102, 0x00c8, 0x4374, - 0x7007, 0x0010, 0x0078, 0x43a5, 0x8aff, 0x0040, 0x43aa, 0x1078, - 0x46a3, 0x00c0, 0x439f, 0x0040, 0x4374, 0x1078, 0x4443, 0x127f, - 0x2000, 0x007c, 0x7204, 0x7108, 0xc19c, 0x8103, 0x00c8, 0x43b9, - 0x1078, 0x44ba, 0x0078, 0x43aa, 0x7003, 0x0008, 0x127f, 0x2000, - 0x007c, 0xa205, 0x00c0, 0x43a5, 0x7003, 0x0008, 0x127f, 0x2000, - 0x007c, 0x6428, 0x84ff, 0x0040, 0x43ed, 0x2c70, 0x7004, 0xa0bc, - 0x000f, 0xa7b8, 0x43fd, 0x273c, 0x87fb, 0x00c0, 0x43db, 0x0048, - 0x43d3, 0x1078, 0x28ec, 0x609c, 0xa075, 0x0040, 0x43ed, 0x0078, - 0x43c6, 0x2039, 0x43f2, 0x2704, 0xae68, 0x6808, 0xa630, 0x680c, - 0xa529, 0x8421, 0x0040, 0x43ed, 0x8738, 0x2704, 0xa005, 0x00c0, - 0x43dc, 0x709c, 0xa075, 0x00c0, 0x43c6, 0x007c, 0x0000, 0x0005, - 0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, 0x0003, - 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x43f2, 0x43ef, - 0x0000, 0x0000, 0x8000, 0x0000, 0x43f2, 0x0000, 0x43fa, 0x43f7, - 0x0000, 0x0000, 0x0000, 0x0000, 0x43fa, 0x0000, 0x43f5, 0x43f5, - 0x0000, 0x0000, 0x8000, 0x0000, 0x43f5, 0x0000, 0x43fb, 0x43fb, - 0x0000, 0x0000, 0x0000, 0x0000, 0x43fb, 0x2079, 0x4a00, 0x2071, - 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001, 0x7810, - 0xd0ec, 0x0040, 0x4431, 0x2009, 0x0001, 0x2071, 0x0020, 0x0078, - 0x4435, 0x2009, 0x0002, 0x2071, 0x0050, 0x7007, 0x000a, 0x7007, - 0x0002, 0x7003, 0x0000, 0x8109, 0x0040, 0x4442, 0x2071, 0x0020, - 0x0078, 0x4435, 0x007c, 0x7004, 0x8004, 0x00c8, 0x44a6, 0x7007, - 0x0012, 0x2019, 0x0000, 0x7108, 0x7008, 0xa106, 0x00c0, 0x444b, - 0xa184, 0x01e0, 0x0040, 0x4456, 0x1078, 0x28ec, 0x7810, 0xd0ec, - 0x0040, 0x4470, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0003, 0x00c0, - 0x4474, 0xa184, 0x4000, 0x0040, 0x4478, 0xa382, 0x0003, 0x00c8, - 0x4478, 0xa184, 0x0004, 0x0040, 0x444b, 0x8318, 0x0078, 0x444b, - 0x7814, 0xd0ec, 0x00c0, 0x4478, 0xa184, 0x4000, 0x00c0, 0x444b, - 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040, 0x4486, 0xa386, 0x0008, - 0x0040, 0x4491, 0xa386, 0x200c, 0x00c0, 0x444b, 0x7200, 0x8204, - 0x0048, 0x4491, 0x730c, 0xa384, 0x03ff, 0x0040, 0x4491, 0x1078, - 0x28ec, 0x7007, 0x0012, 0x7000, 0xd084, 0x00c0, 0x44a6, 0x7008, - 0xa084, 0x01e0, 0x00c0, 0x44a6, 0x7310, 0x7014, 0xa305, 0x0040, - 0x44a6, 0x710c, 0xa184, 0x03ff, 0x00c0, 0x4443, 0x7007, 0x0012, - 0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x44aa, 0x7007, 0x0012, - 0x7108, 0x8103, 0x0048, 0x44ae, 0x7003, 0x0008, 0x007c, 0x7108, - 0x0078, 0x44ba, 0xa184, 0x01e0, 0x00c0, 0x44ee, 0x7108, 0xa184, - 0x01e0, 0x00c0, 0x44ee, 0xa184, 0x0007, 0x0079, 0x44c7, 0x44d1, - 0x44e1, 0x44cf, 0x44e1, 0x44cf, 0x4533, 0x44cf, 0x4531, 0x1078, - 0x28ec, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, 0x00c0, - 0x44dc, 0x2049, 0x0000, 0x007c, 0x1078, 0x46a3, 0x00c0, 0x44dc, - 0x007c, 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, 0x0040, - 0x44ed, 0x1078, 0x46a3, 0x00c0, 0x44e9, 0x007c, 0x7007, 0x0012, - 0x7108, 0x00e0, 0x44f1, 0x2091, 0x6000, 0x00e0, 0x44f5, 0x2091, - 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, - 0x44fd, 0x7007, 0x0012, 0x7108, 0xd1fc, 0x00c0, 0x4501, 0x7003, - 0x0000, 0x7000, 0xa005, 0x00c0, 0x4515, 0x7004, 0xa005, 0x00c0, - 0x4515, 0x700c, 0xa005, 0x0040, 0x4517, 0x0078, 0x44f9, 0x2049, - 0x0000, 0xb284, 0x0100, 0x0040, 0x4521, 0x2001, 0x0000, 0x0078, - 0x4523, 0x2001, 0x0001, 0x1078, 0x3ff5, 0x6818, 0xa084, 0x8000, - 0x0040, 0x452c, 0x681b, 0x0002, 0x007c, 0x1078, 0x28ec, 0x1078, - 0x28ec, 0x1078, 0x4570, 0x7210, 0x7114, 0x700c, 0xa09c, 0x03ff, - 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x1078, 0x4570, 0x2704, - 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c, 0x2100, 0xa31b, - 0x2400, 0xa305, 0x0040, 0x4556, 0x00c8, 0x4556, 0x8412, 0x8210, - 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x453d, 0x2b60, 0x8a07, - 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x4562, 0xa7ba, 0x43f7, - 0x0078, 0x4564, 0xa7ba, 0x43ef, 0x007f, 0xa73d, 0x2c00, 0x6886, - 0x6f8a, 0x6c92, 0x6b8e, 0x7007, 0x0012, 0x1078, 0x4443, 0x007c, - 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x4584, 0x6000, 0xa064, - 0x00c0, 0x457b, 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x440d, - 0x203c, 0x87fb, 0x1040, 0x28ec, 0x007c, 0x127e, 0x0d7e, 0x70d4, - 0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060, 0x6888, - 0x6b8c, 0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, - 0x6804, 0xa084, 0x0008, 0x007f, 0x0040, 0x45a2, 0xa0b8, 0x43f7, - 0x0078, 0x45a4, 0xa0b8, 0x43ef, 0xb284, 0x0100, 0x0040, 0x45ab, - 0x7e20, 0x0078, 0x45ac, 0x7e24, 0xa6b5, 0x000c, 0x681c, 0xd0b4, - 0x0040, 0x45b3, 0xc685, 0x2400, 0xa305, 0x0040, 0x45dd, 0x2c58, - 0x2704, 0x6104, 0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, - 0x701e, 0xa184, 0x0008, 0x0040, 0x45cd, 0x6010, 0xa081, 0x0000, - 0x7022, 0x6014, 0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, - 0x7012, 0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, - 0x2b60, 0x1078, 0x46c6, 0x0078, 0x45df, 0x1078, 0x46a3, 0x00c0, - 0x45dd, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, - 0x4600, 0x8004, 0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094, - 0x00c0, 0x45ee, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, - 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x7e20, - 0xb284, 0x0100, 0x00c0, 0x4605, 0x7e24, 0xa6b5, 0x000c, 0x681c, - 0xd0ac, 0x00c0, 0x4610, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004, - 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x43fd, - 0x273c, 0x87fb, 0x00c0, 0x4626, 0x0048, 0x4620, 0x1078, 0x28ec, - 0x689c, 0xa065, 0x0040, 0x462a, 0x0078, 0x4613, 0x1078, 0x46a3, - 0x00c0, 0x4626, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e, - 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x2090, 0x7e20, 0xb284, - 0x0100, 0x00c0, 0x463c, 0x7e24, 0x0d7f, 0x037f, 0x047f, 0xa6b5, - 0x000c, 0x681c, 0xd0b4, 0x0040, 0x464a, 0xc685, 0x7003, 0x0000, - 0x7007, 0x0004, 0x2049, 0x462d, 0x6828, 0xa055, 0x0040, 0x46a0, - 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x43fd, 0x273c, - 0x87fb, 0x00c0, 0x4666, 0x0048, 0x465f, 0x1078, 0x28ec, 0x709c, - 0xa075, 0x2060, 0x0040, 0x46a0, 0x0078, 0x4652, 0x2704, 0xae68, - 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048, 0x467f, 0x8a51, 0x00c0, - 0x4673, 0x1078, 0x28ec, 0x8738, 0x2704, 0xa005, 0x00c0, 0x4667, - 0x709c, 0xa075, 0x2060, 0x0040, 0x46a0, 0x0078, 0x4652, 0x8422, - 0x8420, 0x831a, 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, - 0x2300, 0xa11b, 0x00c8, 0x468e, 0x1078, 0x28ec, 0xb284, 0x0100, - 0x0040, 0x469c, 0x2001, 0x4a04, 0x2004, 0xd0ec, 0x00c0, 0x469c, - 0x2071, 0x0050, 0x0078, 0x469e, 0x2071, 0x0020, 0x0078, 0x45b3, - 0x127f, 0x2000, 0x007c, 0x7008, 0xa084, 0x0003, 0xa086, 0x0003, - 0x00c0, 0x46ab, 0x007c, 0x2704, 0xac78, 0x7800, 0x701a, 0x7804, - 0x701e, 0x7808, 0x7012, 0x780c, 0x7016, 0x6004, 0xa084, 0x0008, - 0x0040, 0x46be, 0x7810, 0x7022, 0x7814, 0x7026, 0x7602, 0x7004, - 0xa084, 0x0010, 0xc085, 0x7006, 0x2079, 0x4a00, 0x8a51, 0x0040, - 0x46e1, 0x8738, 0x2704, 0xa005, 0x00c0, 0x46dc, 0x609c, 0xa005, - 0x0040, 0x46e2, 0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x43fd, - 0x203c, 0x87fb, 0x1040, 0x28ec, 0x7008, 0xa084, 0x0003, 0xa086, - 0x0003, 0x007c, 0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, - 0x70d4, 0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, - 0xa184, 0x0003, 0x00c0, 0x46fa, 0x6828, 0xa005, 0x0040, 0x470a, - 0x0078, 0x4342, 0x7108, 0xd1fc, 0x0040, 0x4702, 0x1078, 0x44ba, - 0x0078, 0x46ef, 0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x4704, - 0x1078, 0x44ba, 0x7008, 0xa086, 0x0008, 0x00c0, 0x46ef, 0x7000, - 0xa005, 0x00c0, 0x46ef, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, - 0x2000, 0x007c, 0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, - 0x70d4, 0xa084, 0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x471a, - 0xad80, 0x0011, 0x20a0, 0xb284, 0x0100, 0x0040, 0x473d, 0x2001, - 0x4a04, 0x2004, 0xd0ec, 0x0040, 0x4739, 0x2099, 0x0031, 0x0078, - 0x473f, 0x2099, 0x0032, 0x0078, 0x473f, 0x2099, 0x0031, 0x700c, - 0xa084, 0x03ff, 0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, - 0x0001, 0x0040, 0x474e, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, - 0x03ff, 0x0040, 0x475a, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, - 0x00c0, 0x4755, 0x0c7f, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, - 0x137f, 0x147f, 0x127f, 0x2000, 0x007c, 0x2091, 0x8000, 0x2091, - 0x6000, 0x78ac, 0xa005, 0x00c0, 0x477c, 0x7974, 0x70d0, 0xa106, - 0x00c0, 0x477c, 0x781c, 0xa005, 0x0040, 0x477c, 0x781f, 0x0000, - 0x0068, 0x477c, 0x2091, 0x4080, 0x7830, 0x8001, 0x7832, 0x00c0, - 0x4804, 0x7834, 0x7832, 0x7810, 0xd0ec, 0x00c0, 0x47fd, 0x2061, - 0x6fc0, 0x2069, 0x4a80, 0xc7fd, 0x68d0, 0xa005, 0x0040, 0x4796, - 0x8001, 0x68d2, 0x00c0, 0x4796, 0x1078, 0x4998, 0x6800, 0xa084, - 0x000f, 0x0040, 0x47ab, 0xa086, 0x0001, 0x0040, 0x47ab, 0x6844, - 0xa00d, 0x0040, 0x47ab, 0x2104, 0xa005, 0x0040, 0x47ab, 0x8001, - 0x200a, 0x0040, 0x4909, 0x6814, 0xa005, 0x0040, 0x47d0, 0x8001, - 0x6816, 0x00c0, 0x47d0, 0x68a7, 0x0001, 0x0f7e, 0xd7fc, 0x00c0, - 0x47c5, 0x7810, 0xd0ec, 0x0040, 0x47c1, 0x2079, 0x0100, 0x0078, - 0x47c7, 0x2079, 0x0200, 0x0078, 0x47c7, 0x2079, 0x0100, 0x1078, - 0x4131, 0x0f7f, 0x6864, 0xa005, 0x0040, 0x47d0, 0x1078, 0x25de, - 0x6880, 0xa005, 0x0040, 0x47dd, 0x8001, 0x6882, 0x00c0, 0x47dd, - 0x6867, 0x0000, 0x68d4, 0xc0dd, 0x68d6, 0x68d4, 0xd0fc, 0x0040, - 0x47fa, 0xc0fc, 0x68d6, 0x20a9, 0x0200, 0x603c, 0xa005, 0x0040, - 0x47f6, 0x8001, 0x603e, 0x68d4, 0xc0fd, 0x68d6, 0x00c0, 0x47f6, - 0x6010, 0xa005, 0x0040, 0x47f6, 0x1078, 0x25de, 0xace0, 0x0010, - 0x00f0, 0x47e5, 0xd7fc, 0x0040, 0x4804, 0x2061, 0x4fc0, 0x2069, - 0x4a40, 0xc7fc, 0x0078, 0x478c, 0x1078, 0x4840, 0x7838, 0x8001, - 0x783a, 0x00c0, 0x4826, 0x783c, 0x783a, 0x2061, 0x4fc0, 0x2069, - 0x4a40, 0xc7fc, 0x680c, 0xa005, 0x0040, 0x4818, 0x1078, 0x487f, - 0xd7fc, 0x00c0, 0x4826, 0x7810, 0xd0ec, 0x00c0, 0x4826, 0x2061, - 0x6fc0, 0x2069, 0x4a80, 0xc7fd, 0x0078, 0x4812, 0x7814, 0xd0e4, - 0x00c0, 0x482a, 0x7810, 0xd0cc, 0x0040, 0x483d, 0xd0ac, 0x00c0, - 0x4836, 0xd0a4, 0x0040, 0x483d, 0xc0ad, 0x7812, 0x2091, 0x8001, - 0x0068, 0x483c, 0x1078, 0x2368, 0x007c, 0x2091, 0x8001, 0x007c, - 0x7840, 0x8001, 0x7842, 0x00c0, 0x487e, 0x7844, 0x7842, 0x2091, - 0x8000, 0x2061, 0x4fc0, 0x2069, 0x4a40, 0xc7fc, 0x6810, 0xa005, - 0x00c0, 0x4854, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0040, - 0x485d, 0xa080, 0x90d0, 0x0078, 0x485f, 0xa080, 0x8fc0, 0x2040, - 0x2004, 0xa065, 0x0040, 0x4870, 0x6024, 0xa005, 0x0040, 0x486c, - 0x8001, 0x6026, 0x0040, 0x48ad, 0x6000, 0x2c40, 0x0078, 0x4861, - 0xd7fc, 0x00c0, 0x487e, 0x7810, 0xd0ec, 0x00c0, 0x487e, 0x2061, - 0x6fc0, 0x2069, 0x4a80, 0xc7fd, 0x0078, 0x484e, 0x007c, 0x2009, - 0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0040, 0x4899, 0x6024, - 0xa005, 0x0040, 0x488f, 0x8001, 0x6026, 0x0078, 0x4897, 0x6008, - 0xc09c, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0078, 0x4899, 0xa18d, - 0x0100, 0xace0, 0x0010, 0x00f0, 0x4883, 0xa184, 0x0001, 0x0040, - 0x48a8, 0xa18c, 0xfffe, 0x690e, 0x1078, 0x25de, 0x0078, 0x48a9, - 0x690e, 0x007c, 0x00c0, 0x48a9, 0x786c, 0x6800, 0xa005, 0x0040, - 0x48b5, 0x684c, 0xac06, 0x0040, 0x4909, 0x6864, 0xa005, 0x0040, - 0x48bd, 0x6027, 0x0001, 0x0078, 0x4906, 0x2c00, 0x687e, 0x601b, - 0x0006, 0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, - 0xa085, 0x0060, 0x6022, 0x6000, 0x2042, 0x6714, 0x6f76, 0x1078, - 0x1e02, 0x6818, 0xa005, 0x0040, 0x48d7, 0x8001, 0x681a, 0x6808, - 0xc0a4, 0x680a, 0x6810, 0x7908, 0x8109, 0x790a, 0x8001, 0x00d0, - 0x48e3, 0x1078, 0x28ec, 0x6812, 0x00c0, 0x48e9, 0x7910, 0xc1a5, - 0x7912, 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x202a, - 0xd7fc, 0x00c0, 0x48f7, 0x2069, 0x4a40, 0x0078, 0x48f9, 0x2069, - 0x4a80, 0x6910, 0xa184, 0x0100, 0x2001, 0x0006, 0x00c0, 0x4903, - 0x697a, 0x2001, 0x0004, 0x2708, 0x1078, 0x25d1, 0x2091, 0x8001, - 0x007c, 0x0d7e, 0x694c, 0x2160, 0xd7fc, 0x00c0, 0x491b, 0x7810, - 0xd0ec, 0x0040, 0x4917, 0x2069, 0x0100, 0x0078, 0x491d, 0x2069, - 0x0200, 0x0078, 0x491d, 0x2069, 0x0100, 0x1078, 0x2881, 0x601b, - 0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, - 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, 0x0000, 0x6830, - 0xd0b4, 0x0040, 0x494b, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, - 0xd094, 0x0040, 0x493d, 0x00f0, 0x4937, 0x684b, 0x0009, 0x20a9, - 0x0014, 0x6848, 0xd084, 0x0040, 0x4947, 0x00f0, 0x4941, 0x20a9, - 0x00fa, 0x00f0, 0x4949, 0x6808, 0xa084, 0xfffd, 0x680a, 0x681b, - 0x0047, 0x0d7f, 0x6867, 0x0007, 0x2091, 0x8001, 0x007c, 0x2079, - 0x4a00, 0x1078, 0x498b, 0x1078, 0x4971, 0x1078, 0x497e, 0x2009, - 0x0002, 0x2069, 0x4a80, 0x680f, 0x0000, 0x6813, 0x0000, 0x6817, - 0x0000, 0x8109, 0x0040, 0x4970, 0x2069, 0x4a40, 0x0078, 0x4963, - 0x007c, 0x7810, 0xd0ec, 0x0040, 0x4979, 0x2019, 0x00cc, 0x0078, - 0x497b, 0x2019, 0x007b, 0x7b3a, 0x7b3e, 0x007c, 0x7814, 0xd0e4, - 0x00c0, 0x4986, 0x2019, 0x0040, 0x0078, 0x4988, 0x2019, 0x0026, - 0x7b42, 0x7b46, 0x007c, 0x7814, 0xd0e4, 0x00c0, 0x4993, 0x2019, - 0x3f94, 0x0078, 0x4995, 0x2019, 0x2624, 0x7b32, 0x7b36, 0x007c, - 0x6950, 0xa185, 0x0000, 0x0040, 0x49ad, 0x0c7e, 0x6ac0, 0x2264, - 0x602b, 0x0000, 0x602f, 0x0000, 0x6008, 0xc0b5, 0x600a, 0x8210, - 0x8109, 0x00c0, 0x499f, 0x6952, 0x0c7f, 0x007c, 0x70ec, 0xd0dc, - 0x00c0, 0x49b7, 0xd0d4, 0x0040, 0x49d6, 0x0078, 0x49d9, 0x7810, - 0xd0ec, 0x0040, 0x49c2, 0xc0f5, 0x7812, 0xd0ec, 0x0040, 0x49dd, - 0x0078, 0x49d9, 0xae8e, 0x0100, 0x0040, 0x49ce, 0x7814, 0xc0f5, - 0x7816, 0xd0d4, 0x00c0, 0x49dd, 0x0078, 0x49d9, 0x7814, 0xc0fd, - 0x7816, 0xd0d4, 0x00c0, 0x49dd, 0x0078, 0x49d9, 0xd0e4, 0x0040, - 0x49df, 0x7804, 0xd08c, 0x0040, 0x49df, 0x681f, 0x000c, 0x70a0, - 0x70a2, 0x007c, 0x699a + 0x0040, 0x45e5, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x45aa, + 0xa184, 0x0003, 0x0040, 0x4616, 0xa184, 0x01e0, 0x00c0, 0x4616, + 0xd1f4, 0x00c0, 0x45aa, 0xa184, 0x3000, 0xa086, 0x1000, 0x0040, + 0x45aa, 0x2011, 0x0180, 0x710c, 0x8211, 0x0040, 0x45cf, 0x7008, + 0xd0f4, 0x00c0, 0x45aa, 0x700c, 0xa106, 0x0040, 0x45c4, 0x7007, + 0x0012, 0x7108, 0x0005, 0x7008, 0xa106, 0x00c0, 0x45d1, 0xa184, + 0x0003, 0x0040, 0x4616, 0xd194, 0x0040, 0x45d1, 0xd1f4, 0x0040, + 0x4616, 0x7007, 0x0002, 0x0078, 0x45aa, 0x7108, 0xd1fc, 0x0040, + 0x45f0, 0x1078, 0x4769, 0x8aff, 0x0040, 0x458c, 0x0078, 0x45e5, + 0x700c, 0xa08c, 0x03ff, 0x0040, 0x461b, 0x7004, 0xd084, 0x0040, + 0x460d, 0x7014, 0xa005, 0x00c0, 0x4609, 0x7010, 0x7310, 0xa306, + 0x00c0, 0x45fd, 0x2300, 0xa005, 0x0040, 0x460d, 0xa102, 0x00c8, + 0x45e5, 0x7007, 0x0010, 0x0078, 0x4616, 0x8aff, 0x0040, 0x461b, + 0x1078, 0x4970, 0x00c0, 0x4610, 0x0040, 0x45e5, 0x1078, 0x46b4, + 0x127f, 0x2000, 0x007c, 0x7204, 0x7108, 0xc19c, 0x8103, 0x00c8, + 0x462a, 0x7007, 0x0002, 0x0078, 0x461b, 0x7003, 0x0008, 0x127f, + 0x2000, 0x007c, 0xa205, 0x00c0, 0x4616, 0x7003, 0x0008, 0x127f, + 0x2000, 0x007c, 0x6428, 0x84ff, 0x0040, 0x465e, 0x2c70, 0x7004, + 0xa0bc, 0x000f, 0xa7b8, 0x466e, 0x273c, 0x87fb, 0x00c0, 0x464c, + 0x0048, 0x4644, 0x1078, 0x296b, 0x609c, 0xa075, 0x0040, 0x465e, + 0x0078, 0x4637, 0x2039, 0x4663, 0x2704, 0xae68, 0x6808, 0xa630, + 0x680c, 0xa529, 0x8421, 0x0040, 0x465e, 0x8738, 0x2704, 0xa005, + 0x00c0, 0x464d, 0x709c, 0xa075, 0x00c0, 0x4637, 0x007c, 0x0000, + 0x0005, 0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, 0x0000, + 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, 0x4663, + 0x4660, 0x0000, 0x0000, 0x8000, 0x0000, 0x4663, 0x0000, 0x466b, + 0x4668, 0x0000, 0x0000, 0x0000, 0x0000, 0x466b, 0x0000, 0x4666, + 0x4666, 0x0000, 0x0000, 0x8000, 0x0000, 0x4666, 0x0000, 0x466c, + 0x466c, 0x0000, 0x0000, 0x0000, 0x0000, 0x466c, 0x2079, 0x4e00, + 0x2071, 0x0010, 0x7007, 0x000a, 0x7007, 0x0002, 0x7003, 0x0001, + 0x7810, 0xd0ec, 0x0040, 0x46a2, 0x2009, 0x0001, 0x2071, 0x0020, + 0x0078, 0x46a6, 0x2009, 0x0002, 0x2071, 0x0050, 0x7007, 0x000a, + 0x7007, 0x0002, 0x7003, 0x0000, 0x8109, 0x0040, 0x46b3, 0x2071, + 0x0020, 0x0078, 0x46a6, 0x007c, 0x7004, 0x8004, 0x00c8, 0x473d, + 0x7108, 0x7008, 0xa106, 0x00c0, 0x46b8, 0xa184, 0x01e0, 0x0040, + 0x46c5, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, 0x0012, 0x2019, + 0x0000, 0x7108, 0x7008, 0xa106, 0x00c0, 0x46c9, 0xa184, 0x01e0, + 0x0040, 0x46d6, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7810, 0xd0ec, + 0x0040, 0x46f0, 0x2001, 0x04fd, 0x2004, 0xa086, 0x0003, 0x00c0, + 0x46f4, 0xa184, 0x4000, 0x0040, 0x46f8, 0xa382, 0x0003, 0x00c8, + 0x46f8, 0xa184, 0x0004, 0x0040, 0x46c9, 0x8318, 0x0078, 0x46c9, + 0x7814, 0xd0ec, 0x00c0, 0x46f8, 0xa184, 0x4000, 0x00c0, 0x46c9, + 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040, 0x4715, 0xa386, 0x0008, + 0x0040, 0x4720, 0x7004, 0xd084, 0x00c0, 0x4711, 0x7108, 0x7008, + 0xa106, 0x00c0, 0x4706, 0xa184, 0x0003, 0x0040, 0x4711, 0x0078, + 0x47ac, 0xa386, 0x200c, 0x00c0, 0x46c9, 0x7200, 0x8204, 0x0048, + 0x4720, 0x730c, 0xa384, 0x03ff, 0x0040, 0x4720, 0x1078, 0x296b, + 0x7108, 0x7008, 0xa106, 0x00c0, 0x4720, 0xa184, 0x01e0, 0x0040, + 0x472d, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, 0x0012, 0x7000, + 0xd084, 0x00c0, 0x473d, 0x7310, 0x7014, 0xa305, 0x0040, 0x473d, + 0x710c, 0xa184, 0x03ff, 0x00c0, 0x46b4, 0x7108, 0x7008, 0xa106, + 0x00c0, 0x473d, 0xa184, 0x01e0, 0x0040, 0x474a, 0x1078, 0x47ac, + 0x0078, 0x4765, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, + 0x00c0, 0x474e, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4752, 0xa184, + 0x01e0, 0x0040, 0x475f, 0x1078, 0x47ac, 0x0078, 0x4765, 0x7007, + 0x0012, 0x7108, 0x8103, 0x0048, 0x4752, 0x7003, 0x0008, 0x007c, + 0x7108, 0xa184, 0x01e0, 0x00c0, 0x47ac, 0x7108, 0xa184, 0x01e0, + 0x00c0, 0x47ac, 0xa184, 0x0007, 0x0079, 0x4776, 0x4780, 0x4790, + 0x477e, 0x4790, 0x477e, 0x47ee, 0x477e, 0x47ec, 0x1078, 0x296b, + 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x8aff, 0x00c0, 0x478b, + 0x2049, 0x0000, 0x007c, 0x1078, 0x4970, 0x00c0, 0x478b, 0x007c, + 0x7004, 0xa084, 0x0010, 0xc08d, 0x7006, 0x7004, 0xd084, 0x00c0, + 0x47a4, 0x7108, 0x7008, 0xa106, 0x00c0, 0x4799, 0xa184, 0x0003, + 0x0040, 0x47a4, 0x0078, 0x47ac, 0x8aff, 0x0040, 0x47ab, 0x1078, + 0x4970, 0x00c0, 0x47a7, 0x007c, 0x7007, 0x0012, 0x7108, 0x00e0, + 0x47af, 0x2091, 0x6000, 0x00e0, 0x47b3, 0x2091, 0x6000, 0x7007, + 0x0012, 0x7007, 0x0008, 0x7004, 0xd09c, 0x00c0, 0x47bb, 0x7007, + 0x0012, 0x7108, 0xd1fc, 0x00c0, 0x47bf, 0x7003, 0x0000, 0x7000, + 0xa005, 0x00c0, 0x47d3, 0x7004, 0xa005, 0x00c0, 0x47d3, 0x700c, + 0xa005, 0x0040, 0x47d5, 0x0078, 0x47b7, 0x2049, 0x0000, 0xb284, + 0x0100, 0x0040, 0x47df, 0x2001, 0x0000, 0x0078, 0x47e1, 0x2001, + 0x0001, 0x1078, 0x4212, 0x681b, 0x0002, 0x2051, 0x0000, 0x007c, + 0x1078, 0x296b, 0x1078, 0x296b, 0x1078, 0x4836, 0x7210, 0x7114, + 0x700c, 0xa09c, 0x03ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, + 0x1078, 0x4836, 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, + 0x630c, 0x2100, 0xa31b, 0x2400, 0xa305, 0x0040, 0x4811, 0x00c8, + 0x4811, 0x8412, 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, + 0x47f8, 0x2b60, 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, + 0x481d, 0xa7ba, 0x4668, 0x0078, 0x481f, 0xa7ba, 0x4660, 0x007f, + 0xa73d, 0x2c00, 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x7108, 0x7008, + 0xa106, 0x00c0, 0x4826, 0xa184, 0x01e0, 0x0040, 0x4831, 0x1078, + 0x47ac, 0x7007, 0x0012, 0x1078, 0x46b4, 0x007c, 0x8a50, 0x8739, + 0x2704, 0xa004, 0x00c0, 0x484a, 0x6000, 0xa064, 0x00c0, 0x4841, + 0x2d60, 0x6004, 0xa084, 0x000f, 0xa080, 0x467e, 0x203c, 0x87fb, + 0x1040, 0x296b, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, 0x4600, + 0x8004, 0x2090, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, 0x6c90, + 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, 0xa084, + 0x0008, 0x007f, 0x0040, 0x4868, 0xa0b8, 0x4668, 0x0078, 0x486a, + 0xa0b8, 0x4660, 0xb284, 0x0100, 0x0040, 0x4871, 0x7e20, 0x0078, + 0x4872, 0x7e24, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040, 0x4879, + 0xc685, 0x2400, 0xa305, 0x0040, 0x48a3, 0x2c58, 0x2704, 0x6104, + 0xac60, 0x6000, 0xa400, 0x701a, 0x6004, 0xa301, 0x701e, 0xa184, + 0x0008, 0x0040, 0x4893, 0x6010, 0xa081, 0x0000, 0x7022, 0x6014, + 0xa081, 0x0000, 0x7026, 0x6208, 0x2400, 0xa202, 0x7012, 0x620c, + 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, 0x0001, 0x2b60, 0x1078, + 0x499b, 0x0078, 0x48a5, 0x1078, 0x4970, 0x00c0, 0x48a3, 0x127f, + 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, + 0x2090, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xd094, 0x00c0, 0x48b4, + 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x70d4, + 0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f, 0x0d7f, 0x7e20, + 0xb284, 0x0100, 0x00c0, 0x48cd, 0x7e24, 0xa6b5, 0x000c, 0x681c, + 0xd0ac, 0x00c0, 0x48d8, 0xc685, 0x7003, 0x0000, 0x7007, 0x0004, + 0x6828, 0x2050, 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x466e, + 0x273c, 0x87fb, 0x00c0, 0x48ee, 0x0048, 0x48e8, 0x1078, 0x296b, + 0x689c, 0xa065, 0x0040, 0x48f2, 0x0078, 0x48db, 0x1078, 0x4970, + 0x00c0, 0x48ee, 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e, + 0x0d7e, 0x70d4, 0xa084, 0x4600, 0x8004, 0x007e, 0x2090, 0x007f, + 0x7e20, 0xb284, 0x0100, 0x00c0, 0x4906, 0x7e24, 0x0d7f, 0x037f, + 0x047f, 0xa6b5, 0x000c, 0x681c, 0xd0b4, 0x0040, 0x4914, 0xc685, + 0x7003, 0x0000, 0x7007, 0x0004, 0x2049, 0x48f5, 0x6828, 0xa055, + 0x0d7e, 0x0040, 0x496c, 0x2d70, 0x2e60, 0x7004, 0xa0bc, 0x000f, + 0xa7b8, 0x466e, 0x273c, 0x87fb, 0x00c0, 0x4931, 0x0048, 0x492a, + 0x1078, 0x296b, 0x709c, 0xa075, 0x2060, 0x0040, 0x496c, 0x0078, + 0x491d, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0048, + 0x494a, 0x8a51, 0x00c0, 0x493e, 0x1078, 0x296b, 0x8738, 0x2704, + 0xa005, 0x00c0, 0x4932, 0x709c, 0xa075, 0x2060, 0x0040, 0x496c, + 0x0078, 0x491d, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x6908, + 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x00c8, 0x4959, 0x1078, + 0x296b, 0xb284, 0x0100, 0x0040, 0x4967, 0x2001, 0x4e04, 0x2004, + 0xd0ec, 0x00c0, 0x4967, 0x2071, 0x0050, 0x0078, 0x4969, 0x2071, + 0x0020, 0x0d7f, 0x0078, 0x4879, 0x0d7f, 0x127f, 0x2000, 0x007c, + 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x4979, 0xa006, + 0x007c, 0xa084, 0x0003, 0xa086, 0x0003, 0x00c0, 0x4980, 0x007c, + 0x2704, 0xac78, 0x7800, 0x701a, 0x7804, 0x701e, 0x7808, 0x7012, + 0x780c, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x4993, 0x7810, + 0x7022, 0x7814, 0x7026, 0x7602, 0x7004, 0xa084, 0x0010, 0xc085, + 0x7006, 0x2079, 0x4e00, 0x8a51, 0x0040, 0x49bf, 0x8738, 0x2704, + 0xa005, 0x00c0, 0x49b1, 0x609c, 0xa005, 0x0040, 0x49c0, 0x2060, + 0x6004, 0xa084, 0x000f, 0xa080, 0x466e, 0x203c, 0x87fb, 0x1040, + 0x296b, 0x7008, 0x007e, 0xa084, 0x01e0, 0x007f, 0x0040, 0x49bb, + 0xa006, 0x0078, 0x49c0, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c, + 0x2051, 0x0000, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x70d4, 0xa084, + 0x4600, 0x8004, 0x2090, 0x0d7f, 0x087f, 0x7108, 0xa184, 0x0003, + 0x00c0, 0x49d8, 0x6828, 0xa005, 0x0040, 0x49e8, 0x0078, 0x45a2, + 0x7108, 0xd1fc, 0x0040, 0x49e0, 0x1078, 0x4769, 0x0078, 0x49cd, + 0x7007, 0x0010, 0x7108, 0xd1fc, 0x0040, 0x49e2, 0x1078, 0x4769, + 0x7008, 0xa086, 0x0008, 0x00c0, 0x49cd, 0x7000, 0xa005, 0x00c0, + 0x49cd, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, 0x007c, + 0x127e, 0x147e, 0x137e, 0x157e, 0x0c7e, 0x0d7e, 0x70d4, 0xa084, + 0x4600, 0x8004, 0x2090, 0x0d7f, 0x2049, 0x49f8, 0xad80, 0x0011, + 0x20a0, 0xb284, 0x0100, 0x0040, 0x4a1b, 0x2001, 0x4e04, 0x2004, + 0xd0ec, 0x0040, 0x4a17, 0x2099, 0x0031, 0x0078, 0x4a1d, 0x2099, + 0x0032, 0x0078, 0x4a1d, 0x2099, 0x0031, 0x700c, 0xa084, 0x03ff, + 0x682a, 0x7007, 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040, + 0x4a2c, 0x8000, 0x80ac, 0x53a5, 0x700c, 0xa084, 0x03ff, 0x0040, + 0x4a38, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x4a33, + 0x0c7f, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, + 0x127f, 0x2000, 0x007c, 0x2091, 0x8000, 0x2091, 0x6000, 0x78ac, + 0xa005, 0x00c0, 0x4a5a, 0x7974, 0x70d0, 0xa106, 0x00c0, 0x4a5a, + 0x781c, 0xa005, 0x0040, 0x4a5a, 0x781f, 0x0000, 0x0068, 0x4a5a, + 0x2091, 0x4080, 0x7830, 0x8001, 0x7832, 0x00c0, 0x4ae2, 0x7834, + 0x7832, 0x7810, 0xd0ec, 0x00c0, 0x4adb, 0x2061, 0x73c0, 0x2069, + 0x4e80, 0xc7fd, 0x68d0, 0xa005, 0x0040, 0x4a74, 0x8001, 0x68d2, + 0x00c0, 0x4a74, 0x1078, 0x4cb0, 0x6800, 0xa084, 0x000f, 0x0040, + 0x4a89, 0xa086, 0x0001, 0x0040, 0x4a89, 0x6844, 0xa00d, 0x0040, + 0x4a89, 0x2104, 0xa005, 0x0040, 0x4a89, 0x8001, 0x200a, 0x0040, + 0x4c23, 0x6814, 0xa005, 0x0040, 0x4aae, 0x8001, 0x6816, 0x00c0, + 0x4aae, 0x68a7, 0x0001, 0x0f7e, 0xd7fc, 0x00c0, 0x4aa3, 0x7810, + 0xd0ec, 0x0040, 0x4a9f, 0x2079, 0x0100, 0x0078, 0x4aa5, 0x2079, + 0x0200, 0x0078, 0x4aa5, 0x2079, 0x0100, 0x1078, 0x4383, 0x0f7f, + 0x6864, 0xa005, 0x0040, 0x4aae, 0x1078, 0x2628, 0x6880, 0xa005, + 0x0040, 0x4abb, 0x8001, 0x6882, 0x00c0, 0x4abb, 0x6867, 0x0000, + 0x68d4, 0xc0dd, 0x68d6, 0x68d4, 0xd0fc, 0x0040, 0x4ad8, 0xc0fc, + 0x68d6, 0x20a9, 0x0200, 0x6034, 0xa005, 0x0040, 0x4ad4, 0x8001, + 0x6036, 0x68d4, 0xc0fd, 0x68d6, 0x00c0, 0x4ad4, 0x6010, 0xa005, + 0x0040, 0x4ad4, 0x1078, 0x2628, 0xace0, 0x0010, 0x00f0, 0x4ac3, + 0xd7fc, 0x0040, 0x4ae2, 0x2061, 0x53c0, 0x2069, 0x4e40, 0xc7fc, + 0x0078, 0x4a6a, 0x1078, 0x4b1e, 0x7838, 0x8001, 0x783a, 0x00c0, + 0x4b04, 0x783c, 0x783a, 0x2061, 0x53c0, 0x2069, 0x4e40, 0xc7fc, + 0x680c, 0xa005, 0x0040, 0x4af6, 0x1078, 0x4b88, 0xd7fc, 0x00c0, + 0x4b04, 0x7810, 0xd0ec, 0x00c0, 0x4b04, 0x2061, 0x73c0, 0x2069, + 0x4e80, 0xc7fd, 0x0078, 0x4af0, 0x7814, 0xd0e4, 0x00c0, 0x4b08, + 0x7810, 0xd0cc, 0x0040, 0x4b1b, 0xd0ac, 0x00c0, 0x4b14, 0xd0a4, + 0x0040, 0x4b1b, 0xc0ad, 0x7812, 0x2091, 0x8001, 0x0068, 0x4b1a, + 0x1078, 0x2395, 0x007c, 0x2091, 0x8001, 0x007c, 0x7840, 0x8001, + 0x7842, 0x00c0, 0x4b87, 0x7844, 0x7842, 0x2069, 0x4e40, 0xc7fc, + 0x7810, 0x2079, 0x0200, 0xd0ec, 0x0040, 0x4b30, 0x2079, 0x0100, + 0x68d8, 0xa005, 0x0040, 0x4b3c, 0x7de0, 0xa504, 0x00c0, 0x4b3c, + 0x68da, 0x68d4, 0xc0bc, 0x68d6, 0x2079, 0x4e00, 0x6810, 0xa005, + 0x00c0, 0x4b44, 0x2001, 0x0101, 0x8001, 0x6812, 0xd7fc, 0x0040, + 0x4b4d, 0xa080, 0x94d0, 0x0078, 0x4b4f, 0xa080, 0x93c0, 0x2040, + 0x2004, 0xa065, 0x0040, 0x4b79, 0x6024, 0xa005, 0x0040, 0x4b75, + 0x8001, 0x6026, 0x00c0, 0x4b75, 0x6800, 0xa005, 0x0040, 0x4b68, + 0x684c, 0xac06, 0x00c0, 0x4b68, 0x1078, 0x4c23, 0x0078, 0x4b79, + 0x6864, 0xa005, 0x0040, 0x4b70, 0x6027, 0x0001, 0x0078, 0x4b75, + 0x1078, 0x4bd6, 0x2804, 0x0078, 0x4b51, 0x6000, 0x2c40, 0x0078, + 0x4b51, 0xd7fc, 0x00c0, 0x4b87, 0x7810, 0xd0ec, 0x00c0, 0x4b87, + 0x2069, 0x4e80, 0xc7fd, 0x2079, 0x0100, 0x0078, 0x4b30, 0x007c, + 0x2009, 0x0000, 0x20a9, 0x0200, 0x6008, 0xd09c, 0x0040, 0x4bc2, + 0x6024, 0xa005, 0x0040, 0x4b98, 0x8001, 0x6026, 0x0078, 0x4bc0, + 0x6008, 0xc09c, 0xd084, 0x00c0, 0x4ba0, 0xd0ac, 0x0040, 0x4bba, + 0x600a, 0x6004, 0xa005, 0x0040, 0x4bc2, 0x0d7e, 0x0c7e, 0x017e, + 0x2068, 0x6010, 0x8001, 0x6012, 0x1078, 0x3dd0, 0x2d00, 0x2c68, + 0x2060, 0x1078, 0x1e5b, 0x1078, 0x201d, 0x017f, 0x0c7f, 0x0d7f, + 0x0078, 0x4bc2, 0xc0bd, 0x600a, 0xa18d, 0x0001, 0x0078, 0x4bc2, + 0xa18d, 0x0100, 0xace0, 0x0010, 0x00f0, 0x4b8c, 0xa184, 0x0001, + 0x0040, 0x4bd1, 0xa18c, 0xfffe, 0x690e, 0x1078, 0x2628, 0x0078, + 0x4bd2, 0x690e, 0x007c, 0x00c0, 0x4bd2, 0x786c, 0x2c00, 0x687e, + 0x6714, 0x6f76, 0x6017, 0x0000, 0x602b, 0x0000, 0x601b, 0x0006, + 0x60b4, 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, + 0x0060, 0x6022, 0x6000, 0x2042, 0x1078, 0x1de4, 0x6818, 0xa005, + 0x0040, 0x4bf4, 0x8001, 0x681a, 0x6808, 0xc0a4, 0x680a, 0x6810, + 0x7908, 0x8109, 0x790a, 0x8001, 0x00d0, 0x4c00, 0x1078, 0x296b, + 0x6812, 0x00c0, 0x4c06, 0x7910, 0xc1a5, 0x7912, 0x602f, 0x0000, + 0x6033, 0x0000, 0x2c68, 0x1078, 0x202c, 0xd7fc, 0x00c0, 0x4c14, + 0x2069, 0x4e40, 0x0078, 0x4c16, 0x2069, 0x4e80, 0x6910, 0xa184, + 0x0100, 0x2001, 0x0006, 0x00c0, 0x4c20, 0x697a, 0x2001, 0x0004, + 0x1078, 0x261c, 0x007c, 0x0d7e, 0x694c, 0x2160, 0xd7fc, 0x00c0, + 0x4c35, 0x7810, 0xd0ec, 0x0040, 0x4c31, 0x2069, 0x0100, 0x0078, + 0x4c37, 0x2069, 0x0200, 0x0078, 0x4c37, 0x2069, 0x0100, 0x1078, + 0x28df, 0x601b, 0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, + 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, + 0x0000, 0x6808, 0xa084, 0xfffd, 0x680a, 0x6830, 0xd0b4, 0x0040, + 0x4c69, 0x684b, 0x0004, 0x20a9, 0x0014, 0x6848, 0xd094, 0x0040, + 0x4c5b, 0x00f0, 0x4c55, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, + 0xd084, 0x0040, 0x4c65, 0x00f0, 0x4c5f, 0x20a9, 0x00fa, 0x00f0, + 0x4c67, 0x681b, 0x0047, 0x0d7f, 0x6867, 0x0007, 0x007c, 0x2079, + 0x4e00, 0x1078, 0x4ca3, 0x1078, 0x4c89, 0x1078, 0x4c96, 0x2009, + 0x0002, 0x2069, 0x4e80, 0x680f, 0x0000, 0x6813, 0x0000, 0x6817, + 0x0000, 0x8109, 0x0040, 0x4c88, 0x2069, 0x4e40, 0x0078, 0x4c7b, + 0x007c, 0x7810, 0xd0ec, 0x0040, 0x4c91, 0x2019, 0x00cc, 0x0078, + 0x4c93, 0x2019, 0x007b, 0x7b3a, 0x7b3e, 0x007c, 0x7814, 0xd0e4, + 0x00c0, 0x4c9e, 0x2019, 0x0040, 0x0078, 0x4ca0, 0x2019, 0x0026, + 0x7b42, 0x7b46, 0x007c, 0x7814, 0xd0e4, 0x00c0, 0x4cab, 0x2019, + 0x3f94, 0x0078, 0x4cad, 0x2019, 0x2624, 0x7b32, 0x7b36, 0x007c, + 0x6a50, 0xa285, 0x0000, 0x0040, 0x4cdc, 0x6954, 0x6bc0, 0xa300, + 0x0c7e, 0x2164, 0x6304, 0x83ff, 0x00c0, 0x4cc8, 0x8211, 0x0040, + 0x4ccc, 0x8108, 0xa11a, 0x0048, 0x4cb9, 0x69c0, 0x0078, 0x4cb9, + 0x68d3, 0x000a, 0x0c7f, 0x007c, 0x6950, 0x6ac0, 0x2264, 0x602b, + 0x0000, 0x602f, 0x0000, 0x6008, 0xc0b5, 0x600a, 0x8210, 0x8109, + 0x00c0, 0x4cce, 0x6952, 0x0c7f, 0x007c, 0x00e0, 0x4cdd, 0x2091, + 0x6000, 0x00e0, 0x4ce1, 0x2091, 0x6000, 0x70ec, 0xd0dc, 0x00c0, + 0x4cee, 0xd0d4, 0x0040, 0x4d17, 0x0078, 0x4d1a, 0x2008, 0x7810, + 0xd0ec, 0x0040, 0x4d01, 0xd1c4, 0x00c0, 0x4d39, 0x7814, 0xc0c5, + 0x7816, 0x7810, 0xc0f5, 0x7812, 0xd0ec, 0x0040, 0x4d35, 0x0078, + 0x4d31, 0xae8e, 0x0100, 0x0040, 0x4d0e, 0x7814, 0xc0f5, 0xc0c5, + 0x7816, 0xd0d4, 0x00c0, 0x4d35, 0x0078, 0x4d31, 0x7814, 0xc0fd, + 0xc0c5, 0x7816, 0xd0d4, 0x00c0, 0x4d35, 0x0078, 0x4d31, 0xd0e4, + 0x0040, 0x4d37, 0x00e0, 0x4d1a, 0x2091, 0x6000, 0x2009, 0x000c, + 0x00e0, 0x4d20, 0x2091, 0x6000, 0x8109, 0x00c0, 0x4d20, 0x70e4, + 0xa084, 0x01ff, 0xa086, 0x01ff, 0x00c0, 0x4d31, 0x70ec, 0x0078, + 0x4cee, 0x7804, 0xd08c, 0x0040, 0x4d37, 0x681f, 0x000c, 0x70a0, + 0x70a2, 0x007c, 0x205b }; -unsigned short fw1280ei_length01 = 0x39e3; - +#ifdef UNIQUE_FW_NAME +unsigned short fw1280ei_length01 = 0x3d3b; +#else +unsigned short risc_code_length01 = 0x3d3b; +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/qla1280.c linux-2.4.23-pre8/drivers/scsi/qla1280.c --- linux-2.4.22/drivers/scsi/qla1280.c 2001-09-30 19:26:07.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/qla1280.c 2003-10-22 22:49:53.000000000 +0000 @@ -1,165 +1,273 @@ -/******************************************************************************** - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP1x80/1x160 device driver for Linux 2.3.x (redhat 6.X). - * - * COPYRIGHT (C) 1999-2000 QLOGIC CORPORATION - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the Qlogic's Linux Software License. See below. - * - * This program is WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistribution's or source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - ********************************************************************************/ - -/***************************************************************************************** - QLOGIC CORPORATION SOFTWARE - "GNU" GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION - AND MODIFICATION - -This GNU General Public License ("License") applies solely to QLogic Linux -Software ("Software") and may be distributed under the terms of this License. - -1. You may copy and distribute verbatim copies of the Software's source code as -you receive it, in any medium, provided that you conspicuously and appropriately -publish on each copy an appropriate copyright notice and disclaimer of warranty; -keep intact all the notices that refer to this License and to the absence of any -warranty; and give any other recipients of the Software a copy of this License along -with the Software. - -You may charge a fee for the physical act of transferring a copy, and you may at your -option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Software or any portion of it, thus forming -a work based on the Software, and copy and distribute such modifications or work under -the terms of Section 1 above, provided that you also meet all of these conditions: - -* a) You must cause the modified files to carry prominent notices stating that you -changed the files and the date of any change. - -* b) You must cause any work that you distribute or publish that in whole or in part -contains or is derived from the Software or any part thereof, to be licensed as a -whole at no charge to all third parties under the terms of this License. - -* c) If the modified Software normally reads commands interactively when run, you -must cause it, when started running for such interactive use in the most ordinary way, -to print or display an announcement including an appropriate copyright notice and a -notice that there is no warranty (or else, saying that you provide a warranty) and that -users may redistribute the Software under these conditions, and telling the user how to -view a copy of this License. (Exception:if the Software itself is interactive but does -not normally print such an announcement, your work based on the Software is not required -to print an announcement.) - -These requirements apply to the modified work as a whole. If identifiable sections of -that work are not derived from the Software, and can be reasonably considered independent -and separate works in themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you distribute the same -sections as part of a whole which is a work based on the Software, the distribution of the -whole must be on the terms of this License, whose permissions for other licensees extend -to the entire whole, and thus to each and every part regardless of who wrote it. - -3. You may copy and distribute the Software (or a work based on it, under Section 2) in -object code or executable form under the terms of Sections 1 and 2 above provided that -you also do one of the following: - -* a) Accompany it with the complete corresponding machine-readable source code, which must -be distributed under the terms of Sections 1 and 2 above on a medium customarily used for -software interchange; or, - -* b) Accompany it with a written offer, valid for at least three years, to give any third -party, for a charge no more than your cost of physically performing source distribution, -a complete machine-readable copy of the corresponding source code, to be distributed under -the terms of Sections 1 and 2 above on a medium customarily used for software interchange; -or, - -* c) Accompany it with the information you received as to the offer to distribute -corresponding source code. (This alternative is allowed only for noncommercial distribution -and only if you received the Software in object code or executable form with such an offer, -in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for making modifications -to it. For an executable work, complete source code means all the source code for all -modules it contains, plus any associated interface definition files, plus the scripts used -to control compilation and installation of the executable. - -If distribution of executable or object code is made by offering access to copy from a -designated place, then offering equivalent access to copy the source code from the same -place counts as distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - -4. You may not copy, modify, sublicense, or distribute the Software except as expressly -provided under this License. Any attempt otherwise to copy, modify, sublicense or -distribute the Software is void, and will automatically terminate your rights under this -License. However, parties who have received copies, or rights, from you under this License -will not have their licenses terminated so long as such parties remain in full compliance. - -5. This license grants you world wide, royalty free non-exclusive rights to modify or -distribute the Software or its derivative works. These actions are prohibited by law -if you do not accept this License. Therefore, by modifying or distributing the Software -(or any work based on the Software), you indicate your acceptance of this License to do -so, and all its terms and conditions for copying, distributing or modifying the Software -or works based on it. - -6. Each time you redistribute the Software (or any work based on the Software), the -recipient automatically receives a license from the original licensor to copy, distribute -or modify the Software subject to these terms and conditions. You may not impose any -further restrictions on the recipients' exercise of the rights granted herein. You are -not responsible for enforcing compliance by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement or for -any other reason (not limited to patent issues), conditions are imposed on you -(whether by court order, agreement or otherwise) that contradict the conditions of this -License, they do not excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this License -and any other pertinent obligations, then as a consequence you may not distribute the -Software at all. - -If any portion of this section is held invalid or unenforceable under any particular -circumstance, the balance of the section is intended to apply and the section as a whole -is intended to apply in other circumstances. -NO WARRANTY - -11. THE SOFTWARE IS PROVIDED WITHOUT A WARRANTY OF ANY KIND. THERE IS NO -WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, -EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE -ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. -SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL -NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE SOFTWARE AS PERMITTED ABOVE, BE LIABLE TO YOU FOR -DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING -BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR -LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO -OPERATE WITH ANY OTHER SOFTWARES), EVEN IF SUCH HOLDER OR OTHER PARTY HAS -BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -END OF TERMS AND CONDITIONS - -*******************************************************************************************/ - -/**************************************************************************** +/****************************************************************************** +* QLOGIC LINUX SOFTWARE +* +* QLogic QLA1280 (Ultra2) and QLA12160 (Ultra3) SCSI driver +* Copyright (C) 2000 Qlogic Corporation (www.qlogic.com) +* Copyright (C) 2001-2003 Jes Sorensen, Wild Open Source Inc. +* +* 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. +* +******************************************************************************/ +#define QLA1280_VERSION "3.23.37" +/***************************************************************************** Revision History: - Rev. 3.00 Jan 17, 1999 DG Qlogic + Rev 3.23.37 October 1, 2003, Jes Sorensen + - Make MMIO depend on CONFIG_X86_VISWS instead of yet another + random CONFIG option + - Clean up locking in probe path + Rev 3.23.36 October 1, 2003, Christoph Hellwig + - queuecommand only ever receives new commands - clear flags + - Reintegrate lost fixes from Linux 2.5 + Rev 3.23.35 August 14, 2003, Jes Sorensen + - Build against 2.6 + Rev 3.23.34 July 23, 2003, Jes Sorensen + - Remove pointless TRUE/FALSE macros + - Clean up vchan handling + Rev 3.23.33 July 3, 2003, Jes Sorensen + - Don't define register access macros before define determining MMIO. + This just happend to work out on ia64 but not elsewhere. + - Don't try and read from the card while it is in reset as + it won't respond and causes an MCA + Rev 3.23.32 June 23, 2003, Jes Sorensen + - Basic support for boot time arguments + Rev 3.23.31 June 8, 2003, Jes Sorensen + - Reduce boot time messages + Rev 3.23.30 June 6, 2003, Jes Sorensen + - Do not enable sync/wide/ppr before it has been determined + that the target device actually supports it + - Enable DMA arbitration for multi channel controllers + Rev 3.23.29 June 3, 2003, Jes Sorensen + - Port to 2.5.69 + Rev 3.23.28 June 3, 2003, Jes Sorensen + - Eliminate duplicate marker commands on bus resets + - Handle outstanding commands appropriately on bus/device resets + Rev 3.23.27 May 28, 2003, Jes Sorensen + - Remove bogus input queue code, let the Linux SCSI layer do the work + - Clean up NVRAM handling, only read it once from the card + - Add a number of missing default nvram parameters + Rev 3.23.26 Beta May 28, 2003, Jes Sorensen + - Use completion queue for mailbox commands instead of busy wait + Rev 3.23.25 Beta May 27, 2003, James Bottomley + - Migrate to use new error handling code + Rev 3.23.24 Beta May 21, 2003, James Bottomley + - Big endian support + - Cleanup data direction code + Rev 3.23.23 Beta May 12, 2003, Jes Sorensen + - Switch to using MMIO instead of PIO + Rev 3.23.22 Beta April 15, 2003, Jes Sorensen + - Fix PCI parity problem with 12160 during reset. + Rev 3.23.21 Beta April 14, 2003, Jes Sorensen + - Use pci_map_page()/pci_unmap_page() instead of map_single version. + Rev 3.23.20 Beta April 9, 2003, Jes Sorensen + - Remove < 2.4.x support + - Introduce HOST_LOCK to make the spin lock changes portable. + - Remove a bunch of idiotic and unnecessary typedef's + - Kill all leftovers of target-mode support which never worked anyway + Rev 3.23.19 Beta April 11, 2002, Linus Torvalds + - Do qla1280_pci_config() before calling request_irq() and + request_region() + - Use pci_dma_hi32() to handle upper word of DMA addresses instead + of large shifts + - Hand correct arguments to free_irq() in case of failure + Rev 3.23.18 Beta April 11, 2002, Jes Sorensen + - Run source through Lindent and clean up the output + Rev 3.23.17 Beta April 11, 2002, Jes Sorensen + - Update SCSI firmware to qla1280 v8.15.00 and qla12160 v10.04.32 + Rev 3.23.16 Beta March 19, 2002, Jes Sorensen + - Rely on mailbox commands generating interrupts - do not + run qla1280_isr() from ql1280_mailbox_command() + - Remove device_reg_t + - Integrate ql12160_set_target_parameters() with 1280 version + - Make qla1280_setup() non static + - Do not call qla1280_check_for_dead_scsi_bus() on every I/O request + sent to the card - this command pauses the firmare!!! + Rev 3.23.15 Beta March 19, 2002, Jes Sorensen + - Clean up qla1280.h - remove obsolete QL_DEBUG_LEVEL_x definitions + - Remove a pile of pointless and confusing (srb_t **) and + (scsi_lu_t *) typecasts + - Explicit mark that we do not use the new error handling (for now) + - Remove scsi_qla_host_t and use 'struct' instead + - Remove in_abort, watchdog_enabled, dpc, dpc_sched, bios_enabled, + pci_64bit_slot flags which weren't used for anything anyway + - Grab host->host_lock while calling qla1280_isr() from abort() + - Use spin_lock()/spin_unlock() in qla1280_intr_handler() - we + do not need to save/restore flags in the interrupt handler + - Enable interrupts early (before any mailbox access) in preparation + for cleaning up the mailbox handling + Rev 3.23.14 Beta March 14, 2002, Jes Sorensen + - Further cleanups. Remove all trace of QL_DEBUG_LEVEL_x and replace + it with proper use of dprintk(). + - Make qla1280_print_scsi_cmd() and qla1280_dump_buffer() both take + a debug level argument to determine if data is to be printed + - Add KERN_* info to printk() + Rev 3.23.13 Beta March 14, 2002, Jes Sorensen + - Significant cosmetic cleanups + - Change debug code to use dprintk() and remove #if mess + Rev 3.23.12 Beta March 13, 2002, Jes Sorensen + - More cosmetic cleanups, fix places treating return as function + - use cpu_relax() in qla1280_debounce_register() + Rev 3.23.11 Beta March 13, 2002, Jes Sorensen + - Make it compile under 2.5.5 + Rev 3.23.10 Beta October 1, 2001, Jes Sorensen + - Do no typecast short * to long * in QL1280BoardTbl, this + broke miserably on big endian boxes + Rev 3.23.9 Beta September 30, 2001, Jes Sorensen + - Remove pre 2.2 hack for checking for reentrance in interrupt handler + - Make data types used to receive from SCSI_{BUS,TCN,LUN}_32 + unsigned int to match the types from struct scsi_cmnd + Rev 3.23.8 Beta September 29, 2001, Jes Sorensen + - Remove bogus timer_t typedef from qla1280.h + - Remove obsolete pre 2.2 PCI setup code, use proper #define's + for PCI_ values, call pci_set_master() + - Fix memleak of qla1280_buffer on module unload + - Only compile module parsing code #ifdef MODULE - should be + changed to use individual MODULE_PARM's later + - Remove dummy_buffer that was never modified nor printed + - ENTER()/LEAVE() are noops unless QL_DEBUG_LEVEL_3, hence remove + #ifdef QL_DEBUG_LEVEL_3/#endif around ENTER()/LEAVE() calls + - Remove \r from print statements, this is Linux, not DOS + - Remove obsolete QLA1280_{SCSILU,INTR,RING}_{LOCK,UNLOCK} + dummy macros + - Remove C++ compile hack in header file as Linux driver are not + supposed to be compiled as C++ + - Kill MS_64BITS macro as it makes the code more readable + - Remove unnecessary flags.in_interrupts bit + Rev 3.23.7 Beta August 20, 2001, Jes Sorensen + - Dont' check for set flags on q->q_flag one by one in qla1280_next() + - Check whether the interrupt was generated by the QLA1280 before + doing any processing + - qla1280_status_entry(): Only zero out part of sense_buffer that + is not being copied into + - Remove more superflouous typecasts + - qla1280_32bit_start_scsi() replace home-brew memcpy() with memcpy() + Rev 3.23.6 Beta August 20, 2001, Tony Luck, Intel + - Don't walk the entire list in qla1280_putq_t() just to directly + grab the pointer to the last element afterwards + Rev 3.23.5 Beta August 9, 2001, Jes Sorensen + - Don't use SA_INTERRUPT, it's use is deprecated for this kinda driver + Rev 3.23.4 Beta August 8, 2001, Jes Sorensen + - Set dev->max_sectors to 1024 + Rev 3.23.3 Beta August 6, 2001, Jes Sorensen + - Provide compat macros for pci_enable_device(), pci_find_subsys() + and scsi_set_pci_device() + - Call scsi_set_pci_device() for all devices + - Reduce size of kernel version dependent device probe code + - Move duplicate probe/init code to separate function + - Handle error if qla1280_mem_alloc() fails + - Kill OFFSET() macro and use Linux's PCI definitions instead + - Kill private structure defining PCI config space (struct config_reg) + - Only allocate I/O port region if not in MMIO mode + - Remove duplicate (unused) sanity check of sife of srb_t + Rev 3.23.2 Beta August 6, 2001, Jes Sorensen + - Change home-brew memset() implementations to use memset() + - Remove all references to COMTRACE() - accessing a PC's COM2 serial + port directly is not legal under Linux. + Rev 3.23.1 Beta April 24, 2001, Jes Sorensen + - Remove pre 2.2 kernel support + - clean up 64 bit DMA setting to use 2.4 API (provide backwards compat) + - Fix MMIO access to use readl/writel instead of directly + dereferencing pointers + - Nuke MSDOS debugging code + - Change true/false data types to int from uint8_t + - Use int for counters instead of uint8_t etc. + - Clean up size & byte order conversion macro usage + Rev 3.23 Beta January 11, 2001 BN Qlogic + - Added check of device_id when handling non + QLA12160s during detect(). + Rev 3.22 Beta January 5, 2001 BN Qlogic + - Changed queue_task() to schedule_task() + for kernels 2.4.0 and higher. + Note: 2.4.0-testxx kernels released prior to + the actual 2.4.0 kernel release on January 2001 + will get compile/link errors with schedule_task(). + Please update your kernel to released 2.4.0 level, + or comment lines in this file flagged with 3.22 + to resolve compile/link error of schedule_task(). + - Added -DCONFIG_SMP in addition to -D__SMP__ + in Makefile for 2.4.0 builds of driver as module. + Rev 3.21 Beta January 4, 2001 BN Qlogic + - Changed criteria of 64/32 Bit mode of HBA + operation according to BITS_PER_LONG rather + than HBA's NVRAM setting of >4Gig memory bit; + so that the HBA auto-configures without the need + to setup each system individually. + Rev 3.20 Beta December 5, 2000 BN Qlogic + - Added priority handling to IA-64 onboard SCSI + ISP12160 chip for kernels greater than 2.3.18. + - Added irqrestore for qla1280_intr_handler. + - Enabled /proc/scsi/qla1280 interface. + - Clear /proc/scsi/qla1280 counters in detect(). + Rev 3.19 Beta October 13, 2000 BN Qlogic + - Declare driver_template for new kernel + (2.4.0 and greater) scsi initialization scheme. + - Update /proc/scsi entry for 2.3.18 kernels and + above as qla1280 + Rev 3.18 Beta October 10, 2000 BN Qlogic + - Changed scan order of adapters to map + the QLA12160 followed by the QLA1280. + Rev 3.17 Beta September 18, 2000 BN Qlogic + - Removed warnings for 32 bit 2.4.x compiles + - Corrected declared size for request and response + DMA addresses that are kept in each ha + Rev. 3.16 Beta August 25, 2000 BN Qlogic + - Corrected 64 bit addressing issue on IA-64 + where the upper 32 bits were not properly + passed to the RISC engine. + Rev. 3.15 Beta August 22, 2000 BN Qlogic + - Modified qla1280_setup_chip to properly load + ISP firmware for greater that 4 Gig memory on IA-64 + Rev. 3.14 Beta August 16, 2000 BN Qlogic + - Added setting of dma_mask to full 64 bit + if flags.enable_64bit_addressing is set in NVRAM + Rev. 3.13 Beta August 16, 2000 BN Qlogic + - Use new PCI DMA mapping APIs for 2.4.x kernel + Rev. 3.12 July 18, 2000 Redhat & BN Qlogic + - Added check of pci_enable_device to detect() for 2.3.x + - Use pci_resource_start() instead of + pdev->resource[0].start in detect() for 2.3.x + - Updated driver version + Rev. 3.11 July 14, 2000 BN Qlogic + - Updated SCSI Firmware to following versions: + qla1x80: 8.13.08 + qla1x160: 10.04.08 + - Updated driver version to 3.11 + Rev. 3.10 June 23, 2000 BN Qlogic + - Added filtering of AMI SubSys Vendor ID devices + Rev. 3.9 + - DEBUG_QLA1280 undefined and new version BN Qlogic + Rev. 3.08b May 9, 2000 MD Dell + - Added logic to check against AMI subsystem vendor ID + Rev. 3.08 May 4, 2000 DG Qlogic + - Added logic to check for PCI subsystem ID. + Rev. 3.07 Apr 24, 2000 DG & BN Qlogic + - Updated SCSI Firmware to following versions: + qla12160: 10.01.19 + qla1280: 8.09.00 + Rev. 3.06 Apr 12, 2000 DG & BN Qlogic + - Internal revision; not released + Rev. 3.05 Mar 28, 2000 DG & BN Qlogic + - Edit correction for virt_to_bus and PROC. + Rev. 3.04 Mar 28, 2000 DG & BN Qlogic + - Merge changes from ia64 port. + Rev. 3.03 Mar 28, 2000 BN Qlogic + - Increase version to reflect new code drop with compile fix + of issue with inclusion of linux/spinlock for 2.3 kernels + Rev. 3.02 Mar 15, 2000 BN Qlogic + - Merge qla1280_proc_info from 2.10 code base + Rev. 3.01 Feb 10, 2000 BN Qlogic + - Corrected code to compile on a 2.2.x kernel. + Rev. 3.00 Jan 17, 2000 DG Qlogic - Added 64-bit support. Rev. 2.07 Nov 9, 1999 DG Qlogic - - Added new routine to set target parameters for ISP12160. + - Added new routine to set target parameters for ISP12160. Rev. 2.06 Sept 10, 1999 DG Qlogic - Added support for ISP12160 Ultra 3 chip. Rev. 2.03 August 3, 1999 Fred Lewis, Intel DuPont @@ -173,27 +281,19 @@ - Added l modifiers to sprintf and printk format specifiers for longs. - Removed unused local variables. Rev. 1.20 June 8, 1999 DG, Qlogic - Changes to support RedHat release 6.0 (kernel 2.2.5). - - Added SCSI exclusive access lock (io_request_lock) when accessing + Changes to support RedHat release 6.0 (kernel 2.2.5). + - Added SCSI exclusive access lock (io_request_lock) when accessing the adapter. - Added changes for the new LINUX interface template. Some new error handling routines have been added to the template, but for now we will use the old ones. - - Initial Beta Release. + - Initial Beta Release. *****************************************************************************/ -#ifdef MODULE +#include #include -#endif -#define QLA1280_VERSION " 3.00-Beta" - -#include -#include -#include -#include -#include #include #include #include @@ -205,226 +305,253 @@ #include #include #include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#if LINUX_VERSION_CODE >= 0x020545 +#include +#include "scsi.h" +#else #include -#include -/* MRS #include */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) -# include -#endif -#include "sd.h" #include "scsi.h" #include "hosts.h" -#define UNIQUE_FW_NAME -#include "qla1280.h" -#include "ql12160_fw.h" /* ISP RISC code */ -#include "ql1280_fw.h" +#include "sd.h" +#endif -#include -#include /* for kmalloc() */ +#if LINUX_VERSION_CODE < 0x020407 +#error "Kernels older than 2.4.7 are no longer supported" +#endif -#ifndef KERNEL_VERSION -# define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z)) -#endif +/* + * Compile time Options: + * 0 - Disable and 1 - Enable + */ +#define QL1280_LUN_SUPPORT 0 +#define WATCHDOGTIMER 0 +#define DEBUG_QLA1280_INTR 0 +#define DEBUG_PRINT_NVRAM 0 +#define DEBUG_QLA1280 0 /* - * Compile time Options: - * 0 - Disable and 1 - Enable + * The SGI VISWS is broken and doesn't support MMIO ;-( */ -#define QLA1280_64BIT_SUPPORT 1 /* 64-bit Support */ -#define QL1280_TARGET_MODE_SUPPORT 0 /* Target mode support */ -#define WATCHDOGTIMER 0 -#define MEMORY_MAPPED_IO 0 -#define DEBUG_QLA1280_INTR 0 -#define USE_NVRAM_DEFAULTS 0 -#define DEBUG_PRINT_NVRAM 0 -#define LOADING_RISC_ACTIVITY 0 -#define AUTO_ESCALATE_RESET 0 /* Automatically escalate resets */ -#define AUTO_ESCALATE_ABORT 0 /* Automatically escalate aborts */ -#define STOP_ON_ERROR 0 /* Stop on aborts and resets */ -#define STOP_ON_RESET 0 -#define STOP_ON_ABORT 0 -#undef DYNAMIC_MEM_ALLOC +#ifdef CONFIG_X86_VISWS +#define MEMORY_MAPPED_IO 0 +#else +#define MEMORY_MAPPED_IO 1 +#endif + +#define UNIQUE_FW_NAME +#include "qla1280.h" +#include "ql12160_fw.h" /* ISP RISC codes */ +#include "ql1280_fw.h" -#define DEBUG_QLA1280 0 /* Debugging */ -/* #define CHECKSRBSIZE */ /* - * These macros to assist programming + * Missing PCI ID's */ +#ifndef PCI_DEVICE_ID_QLOGIC_ISP1080 +#define PCI_DEVICE_ID_QLOGIC_ISP1080 0x1080 +#endif +#ifndef PCI_DEVICE_ID_QLOGIC_ISP1240 +#define PCI_DEVICE_ID_QLOGIC_ISP1240 0x1240 +#endif +#ifndef PCI_DEVICE_ID_QLOGIC_ISP1280 +#define PCI_DEVICE_ID_QLOGIC_ISP1280 0x1280 +#endif +#ifndef PCI_DEVICE_ID_QLOGIC_ISP10160 +#define PCI_DEVICE_ID_QLOGIC_ISP10160 0x1016 +#endif +#ifndef PCI_DEVICE_ID_QLOGIC_ISP12160 +#define PCI_DEVICE_ID_QLOGIC_ISP12160 0x1216 +#endif -#define BZERO(ptr, amt) memset(ptr, 0, amt) -#define BCOPY(src, dst, amt) memcpy(dst, src, amt) -#define KMALLOC(siz) kmalloc((siz), GFP_ATOMIC) -#define KMFREE(ip,siz) kfree((ip)) -#define SYS_DELAY(x) udelay(x);barrier() -#define QLA1280_DELAY(sec) mdelay(sec * 1000) -#define VIRT_TO_BUS(a) virt_to_bus((a)) -#if QLA1280_64BIT_SUPPORT -#if BITS_PER_LONG <= 32 -#define VIRT_TO_BUS_LOW(a) (uint32_t)virt_to_bus((a)) -#define VIRT_TO_BUS_HIGH(a) (uint32_t)(0x0) -#else -#define VIRT_TO_BUS_LOW(a) (uint32_t)(0xffffffff & virt_to_bus((a))) -#define VIRT_TO_BUS_HIGH(a) (uint32_t)(0xffffffff & (virt_to_bus((a))>>32)) +#ifndef PCI_VENDOR_ID_AMI +#define PCI_VENDOR_ID_AMI 0x101e #endif -#endif /* QLA1280_64BIT_SUPPORT */ -#define STATIC +#ifndef BITS_PER_LONG +#error "BITS_PER_LONG not defined!" +#endif +#if (BITS_PER_LONG == 64) || defined CONFIG_HIGHMEM +#define QLA_64BIT_PTR 1 +#endif -#define NVRAM_DELAY() udelay(500) /* 2 microsecond delay */ -void qla1280_device_queue_depth(scsi_qla_host_t *, Scsi_Device *); +#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2) +#include +/* Ugly hack needed for the virtual channel fix on SN2 */ +extern int snia_pcibr_rrb_alloc(struct pci_dev *pci_dev, + int *count_vchan0, int *count_vchan1); +#endif -#define CACHE_FLUSH(a) (RD_REG_WORD(a)) -#define INVALID_HANDLE (MAX_OUTSTANDING_COMMANDS+1) +#ifdef QLA_64BIT_PTR +#define pci_dma_hi32(a) ((a >> 16) >> 16) +#else +#define pci_dma_hi32(a) 0 +#endif +#define pci_dma_lo32(a) (a & 0xffffffff) -#define MSW(x) (uint16_t)((uint32_t)(x) >> 16) -#define LSW(x) (uint16_t)(x) -#define MSB(x) (uint8_t)((uint16_t)(x) >> 8) -#define LSB(x) (uint8_t)(x) +#define NVRAM_DELAY() udelay(500) /* 2 microseconds */ -#if BITS_PER_LONG <= 32 -#define LS_64BITS(x) (uint32_t)(x) -#define MS_64BITS(x) (uint32_t)(0x0) +#if LINUX_VERSION_CODE < 0x020417 +/* Compat already available in 2.4.23 */ +#define irqreturn_t void +#define IRQ_RETVAL(foo) +#endif +#if LINUX_VERSION_CODE < 0x020500 +#define HOST_LOCK &io_request_lock +#define MSG_ORDERED_TAG 1 +static inline void +scsi_adjust_queue_depth(Scsi_Device *device, int tag, int depth) +{ + if (tag) { + device->tagged_queue = tag; + device->current_tag = 0; + } + device->queue_depth = depth; +} +#else +#define HOST_LOCK ha->host->host_lock +#endif +#if LINUX_VERSION_CODE < 0x020600 +#define DEV_SIMPLE_TAGS(device) device->tagged_queue #else -#define LS_64BITS(x) (uint32_t)(0xffffffff & (x)) -#define MS_64BITS(x) (uint32_t)(0xffffffff & ((x)>>32) ) +#define DEV_SIMPLE_TAGS(device) device->simple_tags +#endif +#if defined(__ia64__) && !defined(ia64_platform_is) +#define ia64_platform_is(foo) (!strcmp(x, platform_name)) #endif /* * QLogic Driver Support Function Prototypes. */ -STATIC void qla1280_done(scsi_qla_host_t *, srb_t **, srb_t **); -STATIC void qla1280_next(scsi_qla_host_t *, scsi_lu_t *, uint8_t); -STATIC void qla1280_putq_t(scsi_lu_t *, srb_t *); -STATIC void qla1280_done_q_put(srb_t *, srb_t **, srb_t **); -STATIC void qla1280_select_queue_depth(struct Scsi_Host *, Scsi_Device *); -#ifdef QLA1280_UNUSED -static void qla1280_dump_regs(struct Scsi_Host *host); -#endif -#if STOP_ON_ERROR -static void qla1280_panic(char *, struct Scsi_Host *host); -#endif -void qla1280_print_scsi_cmd(Scsi_Cmnd *cmd); -STATIC void qla1280_abort_queue_single(scsi_qla_host_t *,uint32_t,uint32_t,uint32_t,uint32_t); - -STATIC int qla1280_return_status( sts_entry_t *sts, Scsi_Cmnd *cp); -STATIC void qla1280_removeq(scsi_lu_t *q, srb_t *sp); -STATIC void qla1280_mem_free(scsi_qla_host_t *ha); -static void qla1280_do_dpc(void *p); -#ifdef QLA1280_UNUSED -static void qla1280_set_flags(char * s); -#endif -static char *qla1280_get_token(char *, char *); -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) -STATIC inline void mdelay(int); +static void qla1280_done(struct scsi_qla_host *, struct srb **, struct srb **); +static void qla1280_done_q_put(struct srb *, struct srb **, struct srb **); +static int qla1280_slave_configure(Scsi_Device *); +#if LINUX_VERSION_CODE < 0x020545 +static void qla1280_select_queue_depth(struct Scsi_Host *, Scsi_Device *); +static void qla1280_get_target_options(struct scsi_cmnd *, struct scsi_qla_host *); #endif -static inline void qla1280_enable_intrs(scsi_qla_host_t *); -static inline void qla1280_disable_intrs(scsi_qla_host_t *); + +static int qla1280_return_status(struct response * sts, Scsi_Cmnd * cp); +static void qla1280_mem_free(struct scsi_qla_host *ha); +static int qla1280_get_token(char *); +static int qla1280_setup(char *s) __init; +static inline void qla1280_enable_intrs(struct scsi_qla_host *); +static inline void qla1280_disable_intrs(struct scsi_qla_host *); /* * QLogic ISP1280 Hardware Support Function Prototypes. */ -STATIC uint8_t qla1280_initialize_adapter(struct scsi_qla_host *ha); -STATIC uint8_t qla1280_enable_tgt(scsi_qla_host_t *, uint8_t); -STATIC uint8_t qla1280_isp_firmware(scsi_qla_host_t *); -STATIC uint8_t qla1280_pci_config(scsi_qla_host_t *); -STATIC uint8_t qla1280_chip_diag(scsi_qla_host_t *); -STATIC uint8_t qla1280_setup_chip(scsi_qla_host_t *); -STATIC uint8_t qla1280_init_rings(scsi_qla_host_t *); -STATIC uint8_t qla1280_nvram_config(scsi_qla_host_t *); -STATIC uint8_t qla1280_mailbox_command(scsi_qla_host_t *, uint8_t, uint16_t *); -STATIC uint8_t qla1280_bus_reset(scsi_qla_host_t *, uint8_t); -STATIC uint8_t qla1280_device_reset(scsi_qla_host_t *, uint8_t, uint32_t); -STATIC uint8_t qla1280_abort_device(scsi_qla_host_t *, uint8_t, uint32_t, uint32_t); -STATIC uint8_t qla1280_abort_command(scsi_qla_host_t *, srb_t *), -#if QLA1280_64BIT_SUPPORT - qla1280_64bit_start_scsi(scsi_qla_host_t *, srb_t *), -#endif - qla1280_32bit_start_scsi(scsi_qla_host_t *, srb_t *), - qla1280_abort_isp(scsi_qla_host_t *); -STATIC void qla1280_nv_write(scsi_qla_host_t *, uint16_t), - qla1280_nv_delay(scsi_qla_host_t *), - qla1280_poll(scsi_qla_host_t *), - qla1280_reset_adapter(scsi_qla_host_t *), - qla1280_marker(scsi_qla_host_t *, uint8_t, uint32_t, uint32_t, uint8_t), - qla1280_isp_cmd(scsi_qla_host_t *), - qla1280_isr(scsi_qla_host_t *, srb_t **, srb_t **), - qla1280_rst_aen(scsi_qla_host_t *), - qla1280_status_entry(scsi_qla_host_t *, sts_entry_t *, srb_t **, - srb_t **), - qla1280_error_entry(scsi_qla_host_t *, response_t *, srb_t **, - srb_t **), - qla1280_restart_queues(scsi_qla_host_t *), - qla1280_abort_queues(scsi_qla_host_t *); -STATIC uint16_t qla1280_get_nvram_word(scsi_qla_host_t *, uint32_t), - qla1280_nvram_request(scsi_qla_host_t *, uint32_t), - qla1280_debounce_register(volatile uint16_t *); -STATIC request_t *qla1280_req_pkt(scsi_qla_host_t *); -int qla1280_check_for_dead_scsi_bus(scsi_qla_host_t *ha, srb_t *sp); -STATIC uint8_t qla1280_mem_alloc(scsi_qla_host_t *ha); -STATIC uint8_t qla1280_register_with_Linux(scsi_qla_host_t *ha, uint8_t maxchannels); - -STATIC uint8_t qla12160_set_target_parameters(scsi_qla_host_t *, uint32_t, uint32_t, uint32_t, nvram160_t *); -STATIC void qla12160_get_target_parameters(scsi_qla_host_t *, uint32_t, uint32_t, uint32_t); - -#if QL1280_TARGET_MODE_SUPPORT -STATIC void qla1280_enable_lun(scsi_qla_host_t *, uint8_t, uint32_t), - qla1280_notify_ack(scsi_qla_host_t *, notify_entry_t *), - qla1280_immed_notify(scsi_qla_host_t *, notify_entry_t *), - qla1280_accept_io(scsi_qla_host_t *, ctio_ret_entry_t *), -#if QLA1280_64BIT_SUPPORT - qla1280_64bit_continue_io(scsi_qla_host_t *, atio_entry_t *, uint32_t, - paddr32_t *), -#endif - qla1280_32bit_continue_io(scsi_qla_host_t *, atio_entry_t *, uint32_t, - paddr32_t *), - qla1280_atio_entry(scsi_qla_host_t *, atio_entry_t *), - qla1280_notify_entry(scsi_qla_host_t *, notify_entry_t *); -#endif /* QLA1280_TARGET_MODE_SUPPORT */ - -#ifdef QL_DEBUG_ROUTINES -/* - * Driver Debug Function Prototypes. - */ -STATIC uint8_t qla1280_getbyte(uint8_t *); -STATIC uint16_t qla1280_getword(uint16_t *); -STATIC uint32_t qla1280_getdword(uint32_t *); -STATIC void qla1280_putbyte(uint8_t *, uint8_t), - qla1280_putword(uint16_t *, uint16_t), - qla1280_putdword(uint32_t *, uint32_t), - qla1280_print(caddr_t), - qla1280_output_number(uint32_t, uint8_t), - qla1280_putc(uint8_t), - qla1280_dump_buffer(caddr_t, uint32_t); - -char debug_buff[80]; -#if DEBUG_QLA1280 -STATIC uint8_t ql_debug_print = 1; -#else -STATIC uint8_t ql_debug_print = 0; +static int qla1280_initialize_adapter(struct scsi_qla_host *ha); +static int qla1280_isp_firmware(struct scsi_qla_host *); +static int qla1280_pci_config(struct scsi_qla_host *); +static int qla1280_chip_diag(struct scsi_qla_host *); +static int qla1280_setup_chip(struct scsi_qla_host *); +static int qla1280_init_rings(struct scsi_qla_host *); +static int qla1280_nvram_config(struct scsi_qla_host *); +static int qla1280_mailbox_command(struct scsi_qla_host *, + uint8_t, uint16_t *); +static int qla1280_bus_reset(struct scsi_qla_host *, int); +static int qla1280_device_reset(struct scsi_qla_host *, int, int); +static int qla1280_abort_device(struct scsi_qla_host *, int, int, int); +static int qla1280_abort_command(struct scsi_qla_host *, struct srb *, int); +static int qla1280_abort_isp(struct scsi_qla_host *); +static int qla1280_64bit_start_scsi(struct scsi_qla_host *, struct srb *); +static int qla1280_32bit_start_scsi(struct scsi_qla_host *, struct srb *); +static void qla1280_nv_write(struct scsi_qla_host *, uint16_t); +static void qla1280_poll(struct scsi_qla_host *); +static void qla1280_reset_adapter(struct scsi_qla_host *); +static void qla1280_marker(struct scsi_qla_host *, int, int, int, u8); +static void qla1280_isp_cmd(struct scsi_qla_host *); +irqreturn_t qla1280_intr_handler(int, void *, struct pt_regs *); +static void qla1280_isr(struct scsi_qla_host *, struct srb **, struct srb **); +static void qla1280_rst_aen(struct scsi_qla_host *); +static void qla1280_status_entry(struct scsi_qla_host *, struct response *, + struct srb **, struct srb **); +static void qla1280_error_entry(struct scsi_qla_host *, struct response *, + struct srb **, struct srb **); +static uint16_t qla1280_get_nvram_word(struct scsi_qla_host *, uint32_t); +static uint16_t qla1280_nvram_request(struct scsi_qla_host *, uint32_t); +static uint16_t qla1280_debounce_register(volatile uint16_t *); +static request_t *qla1280_req_pkt(struct scsi_qla_host *); +static int qla1280_check_for_dead_scsi_bus(struct scsi_qla_host *, + unsigned int); +static int qla1280_mem_alloc(struct scsi_qla_host *ha); + +static void qla12160_get_target_parameters(struct scsi_qla_host *, + Scsi_Device *); +static int qla12160_set_target_parameters(struct scsi_qla_host *, int, int); + + +static struct qla_driver_setup driver_setup __initdata; + +/* + * convert scsi data direction to request_t control flags + */ +static inline uint16_t +qla1280_data_direction(struct scsi_cmnd *cmnd) +{ + uint16_t flags = 0; + + switch(cmnd->sc_data_direction) { + + case SCSI_DATA_NONE: + flags = 0; + break; + + case SCSI_DATA_READ: + flags = BIT_5; + break; + + case SCSI_DATA_WRITE: + flags = BIT_6; + break; + + case SCSI_DATA_UNKNOWN: + default: + flags = BIT_5 | BIT_6; + break; + } + return flags; +} + +#if QL1280_LUN_SUPPORT +static void qla1280_enable_lun(struct scsi_qla_host *, int, int); #endif + +#if DEBUG_QLA1280 +static void __qla1280_print_scsi_cmd(Scsi_Cmnd * cmd); +static void __qla1280_dump_buffer(char *, int); #endif + /* * insmod needs to find the variable and make it point to something */ #ifdef MODULE -static char *options = NULL; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,18) +static char *qla1280; /* insmod qla1280 options=verbose" */ -MODULE_PARM(options, "s"); +MODULE_PARM(qla1280, "s"); +#else +__setup("qla1280=", qla1280_setup); #endif -/* - * Just in case someone uses commas to separate items on the insmod - * command line, we define a dummy buffer here to avoid having insmod - * write wild stuff into our code segment - */ -static char dummy_buffer[60] = "Please don't add commas in your insmod command!!\n"; -#endif +MODULE_LICENSE("GPL"); + /* We use the Scsi_Pointer structure that's included with each command * SCSI_Cmnd as a scratchpad for our SRB. @@ -440,122 +567,88 @@ * - SCp.phase --> not used */ -#define CMD_SP(Cmnd) (&(Cmnd)->SCp) -#define CMD_XFRLEN(Cmnd) (Cmnd)->request_bufflen -#define CMD_CDBLEN(Cmnd) (Cmnd)->cmd_len -#define CMD_CDBP(Cmnd) (Cmnd)->cmnd -#define CMD_SNSP(Cmnd) (Cmnd)->sense_buffer -#define CMD_SNSLEN(Cmnd) (sizeof (Cmnd)->sense_buffer) -#define CMD_RESULT(Cmnd) ((Cmnd)->result) -#define CMD_HANDLE(Cmnd) ((Cmnd)->host_scribble) +#define CMD_SP(Cmnd) &Cmnd->SCp +#define CMD_CDBLEN(Cmnd) Cmnd->cmd_len +#define CMD_CDBP(Cmnd) Cmnd->cmnd +#define CMD_SNSP(Cmnd) Cmnd->sense_buffer +#define CMD_SNSLEN(Cmnd) sizeof(Cmnd->sense_buffer) +#define CMD_RESULT(Cmnd) Cmnd->result +#define CMD_HANDLE(Cmnd) Cmnd->host_scribble +#if LINUX_VERSION_CODE < 0x020545 +#define CMD_HOST(Cmnd) Cmnd->host +#define CMD_REQUEST(Cmnd) Cmnd->request.cmd +#define SCSI_BUS_32(Cmnd) Cmnd->channel +#define SCSI_TCN_32(Cmnd) Cmnd->target +#define SCSI_LUN_32(Cmnd) Cmnd->lun +#else +#define CMD_HOST(Cmnd) Cmnd->device->host +#define CMD_REQUEST(Cmnd) Cmnd->request->cmd +#define SCSI_BUS_32(Cmnd) Cmnd->device->channel +#define SCSI_TCN_32(Cmnd) Cmnd->device->id +#define SCSI_LUN_32(Cmnd) Cmnd->device->lun +#endif /*****************************************/ /* ISP Boards supported by this driver */ /*****************************************/ -#define QLA1280_VENDOR_ID 0x1077 -#define QLA1080_DEVICE_ID 0x1080 -#define QLA1240_DEVICE_ID 0x1240 -#define QLA1280_DEVICE_ID 0x1280 -#define QLA12160_DEVICE_ID 0x1216 -#define QLA10160_DEVICE_ID 0x1016 -#define NUM_OF_ISP_DEVICES 6 - -typedef struct _qlaboards -{ - unsigned char bdName[9]; /* Board ID String */ - unsigned long device_id; /* Device PCI ID */ - int numPorts; /* Number of SCSI ports */ - unsigned short *fwcode; /* pointer to FW array */ - unsigned long *fwlen; /* number of words in array */ - unsigned short *fwstart; /* start address for F/W */ - unsigned char *fwver; /* Ptr to F/W version array */ -} qla_boards_t; - -struct _qlaboards QLBoardTbl[NUM_OF_ISP_DEVICES] = -{ - /* Name , Board PCI Device ID, Number of ports */ - {"QLA1080 ", QLA1080_DEVICE_ID, 1, - &fw1280ei_code01[0], (unsigned long *)&fw1280ei_length01,&fw1280ei_addr01, &fw1280ei_version_str[0] }, - {"QLA1240 ", QLA1240_DEVICE_ID, 2, - &fw1280ei_code01[0], (unsigned long *)&fw1280ei_length01,&fw1280ei_addr01, &fw1280ei_version_str[0] }, - {"QLA1280 ", QLA1280_DEVICE_ID, 2, - &fw1280ei_code01[0], (unsigned long *)&fw1280ei_length01,&fw1280ei_addr01, &fw1280ei_version_str[0] }, - {"QLA12160 ", QLA12160_DEVICE_ID, 2, - &fw12160i_code01[0], (unsigned long *)&fw12160i_length01,&fw12160i_addr01, &fw12160i_version_str[0] }, - {"QLA10160 ", QLA10160_DEVICE_ID, 1, - &fw12160i_code01[0], (unsigned long *)&fw12160i_length01,&fw12160i_addr01, &fw12160i_version_str[0] }, - {" ", 0, 0} -}; -static unsigned long qla1280_verbose = 1L; -static scsi_qla_host_t *qla1280_hostlist = NULL; -#ifdef QLA1280_PROFILE -static int qla1280_buffer_size = 0; -static char *qla1280_buffer = NULL; -#endif - -#ifdef QL_DEBUG_LEVEL_3 -#define ENTER(x) sprintf(debug_buff,"qla1280 : Entering %s()\n\r", x); \ - qla1280_print(debug_buff); -#define LEAVE(x) sprintf(debug_buff,"qla1280 : Leaving %s()\n\r", x); \ - qla1280_print(debug_buff); -#define ENTER_INTR(x) sprintf(debug_buff,"qla1280 : Entering %s()\n\r", x); \ - qla1280_print(debug_buff); -#define LEAVE_INTR(x) sprintf(debug_buff,"qla1280 : Leaving %s()\n\r", x); \ - qla1280_print(debug_buff); -#define DEBUG3(x) x -#else -#define ENTER(x) -#define LEAVE(x) -#define ENTER_INTR(x) -#define LEAVE_INTR(x) -#define DEBUG3(x) -#endif +#define NUM_OF_ISP_DEVICES 6 -#if DEBUG_QLA1280 -#define COMTRACE(x) -/* #define COMTRACE(x) qla1280_putc(x); */ -#define DEBUG(x) x -#else -#define DEBUG(x) -#define COMTRACE(x) -#endif +struct qla_boards { + unsigned char name[9]; /* Board ID String */ + unsigned long device_id; /* Device PCI ID */ + int numPorts; /* Number of SCSI ports */ + unsigned short *fwcode; /* pointer to FW array */ + unsigned short *fwlen; /* number of words in array */ + unsigned short *fwstart; /* start address for F/W */ + unsigned char *fwver; /* Ptr to F/W version array */ +}; -#ifdef QL_DEBUG_LEVEL_2 -#define DEBUG2(x) x -#else -#define DEBUG2(x) -#endif -#define DEBUG5(x) +struct qla_boards ql1280_board_tbl[NUM_OF_ISP_DEVICES] = { + /* Name , Board PCI Device ID, Number of ports */ + {"QLA12160", PCI_DEVICE_ID_QLOGIC_ISP12160, 2, + &fw12160i_code01[0], &fw12160i_length01, + &fw12160i_addr01, &fw12160i_version_str[0]}, + {"QLA1080", PCI_DEVICE_ID_QLOGIC_ISP1080, 1, + &fw1280ei_code01[0], &fw1280ei_length01, + &fw1280ei_addr01, &fw1280ei_version_str[0]}, + {"QLA1240", PCI_DEVICE_ID_QLOGIC_ISP1240, 2, + &fw1280ei_code01[0], &fw1280ei_length01, + &fw1280ei_addr01, &fw1280ei_version_str[0]}, + {"QLA1280", PCI_DEVICE_ID_QLOGIC_ISP1280, 2, + &fw1280ei_code01[0], &fw1280ei_length01, + &fw1280ei_addr01, &fw1280ei_version_str[0]}, + {"QLA10160", PCI_DEVICE_ID_QLOGIC_ISP10160, 1, + &fw12160i_code01[0], &fw12160i_length01, + &fw12160i_addr01, &fw12160i_version_str[0]}, + {" ", 0, 0} +}; -#if (BITS_PER_LONG==64) -# define OFFSET(w) (((uint64_t) &w) & 0xFF) /* 256 byte offsets */ +static int qla1280_verbose = 1; +static struct scsi_qla_host *qla1280_hostlist; +static int qla1280_buffer_size; +static char *qla1280_buffer; + +#if DEBUG_QLA1280 +static int ql_debug_level = 1; +#define dprintk(level, format, a...) \ + do { if (ql_debug_level >= level) printk(KERN_ERR format, ##a); } while(0) +#define qla1280_dump_buffer(level, buf, size) \ + if (ql_debug_level >= level) __qla1280_dump_buffer(buf, size) +#define qla1280_print_scsi_cmd(level, cmd) \ + if (ql_debug_level >= level) __qla1280_print_scsi_cmd(cmd) #else -# define OFFSET(w) (((uint32_t) &w) & 0xFF) /* 256 byte offsets */ +#define ql_debug_level 0 +#define dprintk(level, format, a...) do{}while(0) +#define qla1280_dump_buffer(a, b, c) do{}while(0) +#define qla1280_print_scsi_cmd(a, b) do{}while(0) #endif -#define SCSI_BUS_32(scp) ((scp)->channel) -#define SCSI_TCN_32(scp) ((scp)->target) -#define SCSI_LUN_32(scp) ((scp)->lun) - -/****************************************************************************/ -/* LINUX - Loadable Module Functions. */ -/****************************************************************************/ - +#define ENTER(x) dprintk(3, "qla1280 : Entering %s()\n", x); +#define LEAVE(x) dprintk(3, "qla1280 : Leaving %s()\n", x); +#define ENTER_INTR(x) dprintk(4, "qla1280 : Entering %s()\n", x); +#define LEAVE_INTR(x) dprintk(4, "qla1280 : Leaving %s()\n", x); -/************************************************************************* - * qla1280_set_info - * - * Description: - * Set parameters for the driver from the /proc filesystem. - * - * Returns: - *************************************************************************/ -int -qla1280_set_info(char *buffer, int length, struct Scsi_Host *HBAptr) -{ - return (-ENOSYS); /* Currently this is a no-op */ -} /************************************************************************* * qla1280_proc_info @@ -567,464 +660,549 @@ * * Returns: *************************************************************************/ -#ifdef QLA1280_PROFILE -#define PROC_BUF (&qla1280_buffer[size]) -#define LUN_ID (targ_lun>>(MAX_T_BITS+MAX_L_BITS)),((targ_lun>>MAX_L_BITS)&0xf), targ_lun&0x7 -#endif -int -qla1280_proc_info ( char *buffer, char **start, off_t offset, int length, - int hostno, int inout) -{ -#ifdef QLA1280_PROFILE - struct Scsi_Host *host; - scsi_qla_host_t *ha; - int size = 0; - int targ_lun; - scsi_lu_t *up; - int no_devices; - - printk("Entering proc_info 0x%p,0x%lx,0x%x,0x%x\n",buffer,offset,length,hostno); - host = NULL; - /* find the host they want to look at */ - for(ha=qla1280_hostlist; (ha != NULL) && ha->host->host_no != hostno; ha=ha->next) - ; - - if (!ha) - { - size += sprintf(buffer, "Can't find adapter for host number %d\n", hostno); - if (size > length) - { - return (size); - } - else - { - return (length); - } - } - - host = ha->host; - if (inout == TRUE) /* Has data been written to the file? */ - { - return (qla1280_set_info(buffer, length, host)); - } - - /* compute number of active devices */ - no_devices = 0; - for (targ_lun = 0; targ_lun < MAX_EQ; targ_lun++) - { - if( (up = ha->dev[targ_lun]) == NULL ) - continue; - no_devices++; - } - /* size = 112 * no_devices; */ - size = 4096; - /* round up to the next page */ - - /* - * if our old buffer is the right size use it otherwise - * allocate a new one. - */ - if (qla1280_buffer_size != size) - { - /* deallocate this buffer and get a new one */ - if (qla1280_buffer != NULL) - { - kfree(qla1280_buffer); - qla1280_buffer_size = 0; - } - qla1280_buffer = kmalloc(size, GFP_KERNEL); - } - if (qla1280_buffer == NULL) - { - size = sprintf(buffer, "qla1280 - kmalloc error at line %d\n", - __LINE__); - return size; - } - qla1280_buffer_size = size; - - size = 0; - size += sprintf(PROC_BUF, "Qlogic 1280/1080 SCSI driver version: "); /* 43 bytes */ - size += sprintf(PROC_BUF, "%5s, ", QLA1280_VERSION); /* 5 */ - size += sprintf(PROC_BUF, "Qlogic Firmware version: "); /* 25 */ - size += sprintf(PROC_BUF, "%2d.%2d.%2d",_firmware_version[0], /* 8 */ - ql12_firmware_version[1], - ql12_firmware_version[2]); - size += sprintf(PROC_BUF, "\n"); /* 1 */ - - size += sprintf(PROC_BUF, "SCSI Host Adapter Information: %s\n", QLBoardTbl[ha->devnum].bdName); - size += sprintf(PROC_BUF, "Request Queue = 0x%lx, Response Queue = 0x%lx\n", - ha->request_dma, - ha->response_dma); - size += sprintf(PROC_BUF, "Request Queue count= 0x%x, Response Queue count= 0x%x\n", - REQUEST_ENTRY_CNT, - RESPONSE_ENTRY_CNT); - size += sprintf(PROC_BUF,"Number of pending commands = 0x%lx\n", ha->actthreads); - size += sprintf(PROC_BUF,"Number of queued commands = 0x%lx\n", ha->qthreads); - size += sprintf(PROC_BUF,"Number of free request entries = %d\n",ha->req_q_cnt); - size += sprintf(PROC_BUF, "\n"); /* 1 */ - - size += sprintf(PROC_BUF, "Attached devices:\n"); - /* scan for all equipment stats */ - for (targ_lun = 0; targ_lun < MAX_EQ; targ_lun++) - { - if( (up = ha->dev[targ_lun]) == NULL ) - continue; - if( up->io_cnt == 0 ) - { - size += sprintf(PROC_BUF,"(%2d:%2d:%2d) No stats\n",LUN_ID); - continue; - } - /* total reads since boot */ - /* total writes since boot */ - /* total requests since boot */ - size += sprintf(PROC_BUF, "Total requests %ld,",up->io_cnt); - /* current number of pending requests */ - size += sprintf(PROC_BUF, "(%2d:%2d:%2d) pending requests %d,",LUN_ID,up->q_outcnt); - /* avg response time */ - size += sprintf(PROC_BUF, "Avg response time %ld%%,",(up->resp_time/up->io_cnt)*100); - - /* avg active time */ - size += sprintf(PROC_BUF, "Avg active time %ld%%\n",(up->act_time/up->io_cnt)*100); - } - - if (size >= qla1280_buffer_size) - { - printk(KERN_WARNING "qla1280: Overflow buffer in qla1280_proc.c\n"); - } - - if (offset > size - 1) - { - kfree(qla1280_buffer); - qla1280_buffer = NULL; - qla1280_buffer_size = length = 0; - *start = NULL; - } - else - { - *start = &qla1280_buffer[offset]; /* Start of wanted data */ - if (size - offset < length) - { - length = size - offset; - } - } +#define PROC_BUF &qla1280_buffer[len] + +#if LINUX_VERSION_CODE < 0x020600 +static int qla1280_proc_info(char *buffer, char **start, off_t offset, + int length, int hostno, int inout) +#else +static int qla1280_proc_info(struct Scsi_Host *host, char *buffer, + char **start, off_t offset, int length, int inout) +#endif +{ + struct scsi_qla_host *ha; + int size = 0; + int len = 0; + struct qla_boards *bdp; +#ifdef BOGUS_QUEUE + struct scsi_lu *up; + uint32_t b, t, l; +#endif +#if LINUX_VERSION_CODE >= 0x020600 + ha = (struct scsi_qla_host *)host->hostdata; +#else + struct Scsi_Host *host; + /* Find the host that was specified */ + for (ha = qla1280_hostlist; (ha != NULL) + && ha->host->host_no != hostno; ha = ha->next) ; + + /* if host wasn't found then exit */ + if (!ha) { + size = sprintf(buffer, "Can't find adapter for host " + "number %d\n", hostno); + if (size > length) { + return size; + } else { + return 0; + } + } + + host = ha->host; +#endif + + if (inout) + return -ENOSYS; + + /* + * if our old buffer is the right size use it otherwise + * allocate a new one. + */ + if (qla1280_buffer_size != PAGE_SIZE) { + /* deallocate this buffer and get a new one */ + if (qla1280_buffer != NULL) { + free_page((unsigned long)qla1280_buffer); + qla1280_buffer_size = 0; + } + qla1280_buffer = (char *)get_zeroed_page(GFP_KERNEL); + } + if (qla1280_buffer == NULL) { + size = sprintf(buffer, "qla1280 - kmalloc error at line %d\n", + __LINE__); + return size; + } + /* save the size of our buffer */ + qla1280_buffer_size = PAGE_SIZE; + + /* 3.20 clear the buffer we use for proc display */ + memset(qla1280_buffer, 0, PAGE_SIZE); + + /* start building the print buffer */ + bdp = &ql1280_board_tbl[ha->devnum]; + size = sprintf(PROC_BUF, + "QLogic PCI to SCSI Adapter for ISP 1280/12160:\n" + " Firmware version: %2d.%02d.%02d, Driver version %s\n", + bdp->fwver[0], bdp->fwver[1], bdp->fwver[2], + QLA1280_VERSION); + + len += size; + + size = sprintf(PROC_BUF, "SCSI Host Adapter Information: %s\n", + bdp->name); + len += size; + size = sprintf(PROC_BUF, "Request Queue count= 0x%x, Response " + "Queue count= 0x%x\n", + REQUEST_ENTRY_CNT, RESPONSE_ENTRY_CNT); + len += size; + size = sprintf(PROC_BUF, "Number of pending commands = 0x%lx\n", + ha->actthreads); + len += size; + size = sprintf(PROC_BUF, "Number of free request entries = %d\n", + ha->req_q_cnt); + len += size; + size = sprintf(PROC_BUF, "\n"); /* 1 */ + len += size; + + size = sprintf(PROC_BUF, "SCSI device Information:\n"); + len += size; +#ifdef BOGUS_QUEUE + /* scan for all equipment stats */ + for (b = 0; b < MAX_BUSES; b++) + for (t = 0; t < MAX_TARGETS; t++) { + for (l = 0; l < MAX_LUNS; l++) { + up = LU_Q(ha, b, t, l); + if (up == NULL) + continue; + /* unused device/lun */ + if (up->io_cnt == 0 || up->io_cnt < 2) + continue; + /* total reads since boot */ + /* total writes since boot */ + /* total requests since boot */ + size = sprintf (PROC_BUF, + "(%2d:%2d:%2d): Total reqs %ld,", + b, t, l, up->io_cnt); + len += size; + /* current number of pending requests */ + size = sprintf(PROC_BUF, " Pend reqs %d,", + up->q_outcnt); + len += size; +#if 0 + /* avg response time */ + size = sprintf(PROC_BUF, " Avg resp time %ld%%,", + (up->resp_time / up->io_cnt) * + 100); + len += size; + + /* avg active time */ + size = sprintf(PROC_BUF, + " Avg active time %ld%%\n", + (up->act_time / up->io_cnt) * 100); +#else + size = sprintf(PROC_BUF, "\n"); #endif + len += size; + } + if (len >= qla1280_buffer_size) + break; + } +#endif + + if (len >= qla1280_buffer_size) { + printk(KERN_WARNING + "qla1280: Overflow buffer in qla1280_proc.c\n"); + } + + if (offset > len - 1) { + free_page((unsigned long) qla1280_buffer); + qla1280_buffer = NULL; + qla1280_buffer_size = length = 0; + *start = NULL; + } else { + *start = &qla1280_buffer[offset]; /* Start of wanted data */ + if (len - offset < length) { + length = len - offset; + } + } + return length; +} + + +static int qla1280_read_nvram(struct scsi_qla_host *ha) +{ + uint16_t *wptr; + uint8_t chksum; + int cnt; + struct nvram *nv; + + ENTER("qla1280_read_nvram"); + + if (driver_setup.no_nvram) + return 1; + + printk(KERN_INFO "scsi(%ld): Reading NVRAM\n", ha->host_no); + + wptr = (uint16_t *)&ha->nvram; + nv = &ha->nvram; + chksum = 0; + for (cnt = 0; cnt < 3; cnt++) { + *wptr = qla1280_get_nvram_word(ha, cnt); + chksum += *wptr & 0xff; + chksum += (*wptr >> 8) & 0xff; + wptr++; + } - return (length); + if (nv->id0 != 'I' || nv->id1 != 'S' || + nv->id2 != 'P' || nv->id3 != ' ' || nv->version < 1) { + dprintk(2, "Invalid nvram ID or version!\n"); + chksum = 1; + } else { + for (; cnt < sizeof(struct nvram); cnt++) { + *wptr = qla1280_get_nvram_word(ha, cnt); + chksum += *wptr & 0xff; + chksum += (*wptr >> 8) & 0xff; + wptr++; + } + } + + dprintk(3, "qla1280_read_nvram: NVRAM Magic ID= %c %c %c %02x" + " version %i\n", nv->id0, nv->id1, nv->id2, nv->id3, + nv->version); + + + if (chksum) { + if (!driver_setup.no_nvram) + printk(KERN_WARNING "scsi(%ld): Unable to identify or " + "validate NVRAM checksum, using default " + "settings\n", ha->host_no); + ha->nvram_valid = 0; + } else + ha->nvram_valid = 1; + + dprintk(1, "qla1280_read_nvram: Completed Reading NVRAM\n"); + LEAVE("qla1280_read_nvram"); + + return chksum; } /************************************************************************** - * qla1280_detect - * This routine will probe for Qlogic 1280 SCSI host adapters. - * It returns the number of host adapters of a particular - * type that were found. It also initialize all data necessary for - * the driver. It is passed-in the host number, so that it - * knows where its first entry is in the scsi_hosts[] array. + * qla1280_do_device_init + * This routine will register the device with the SCSI subsystem, + * initialize the host adapter structure and call the device init + * routines. * * Input: - * template - pointer to SCSI template + * pdev - pointer to struct pci_dev for adapter + * template - pointer to SCSI template + * devnum - the device number + * bdp - pointer to struct _qlaboards + * num_hosts - the host number * * Returns: - * num - number of host adapters found. + * host - pointer to SCSI host structure **************************************************************************/ -int -qla1280_detect(Scsi_Host_Template *template) -{ - int num_hosts = 0; - struct Scsi_Host *host; - scsi_qla_host_t *ha, *cur_ha; - struct _qlaboards *bdp; - int i, j; -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,1,95) - unsigned int piobase; - unsigned char pci_bus, pci_devfn, pci_irq; - config_reg_t *cfgp = 0; -#endif - device_reg_t *reg; - char *cp; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,95) - struct pci_dev *pdev = NULL; +struct Scsi_Host * +qla1280_do_device_init(struct pci_dev *pdev, Scsi_Host_Template * template, + int devnum, struct qla_boards *bdp, int num_hosts) +{ + struct Scsi_Host *host; + struct scsi_qla_host *ha; + + printk(KERN_INFO "qla1280: %s found on PCI bus %i, dev %i\n", + bdp->name, pdev->bus->number, PCI_SLOT(pdev->devfn)); + + host = scsi_register(template, sizeof(struct scsi_qla_host)); + if (!host) { + printk(KERN_WARNING + "qla1280: Failed to register host, aborting.\n"); + goto error; + } + +#if LINUX_VERSION_CODE < 0x020545 + scsi_set_pci_device(host, pdev); #else - int index; + scsi_set_device(host, &pdev->dev); #endif + ha = (struct scsi_qla_host *)host->hostdata; + /* Clear our data area */ + memset(ha, 0, sizeof(struct scsi_qla_host)); + /* Sanitize the information from PCI BIOS. */ + host->irq = pdev->irq; + ha->pci_bus = pdev->bus->number; + ha->pci_device_fn = pdev->devfn; + ha->pdev = pdev; + ha->device_id = bdp->device_id; + ha->devnum = devnum; /* specifies microcode load address */ + + if (qla1280_mem_alloc(ha)) { + printk(KERN_INFO "qla1x160: Failed to get memory\n"); + goto error_scsi_unregister; + } - ENTER("qla1280_detect"); + ha->ports = bdp->numPorts; + /* following needed for all cases of OS versions */ + ha->host = host; + ha->host_no = host->host_no; -#ifdef CHECKSRBSIZE - if (sizeof(srb_t) > sizeof(Scsi_Pointer) ) - { - printk("Redefine SRB - its too big"); - return 0; - } + host->can_queue = 0xfffff; /* unlimited */ + host->cmd_per_lun = 1; + host->base = (unsigned long)ha->mmpbase; + host->max_channel = bdp->numPorts - 1; + host->max_lun = MAX_LUNS - 1; + host->max_id = MAX_TARGETS; + host->max_sectors = 1024; +#if LINUX_VERSION_CODE < 0x020545 + host->select_queue_depths = qla1280_select_queue_depth; #endif -#ifdef MODULE - DEBUG(sprintf(debug_buff,"DEBUG: qla1280_detect starts at address = %p\n",qla1280_detect);) - DEBUG(qla1280_print(debug_buff);) - /* - * If we are called as a module, the qla1280 pointer may not be null - * and it would point to our bootup string, just like on the lilo - * command line. IF not NULL, then process this config string with - * qla1280_setup - * - * Boot time Options - * To add options at boot time add a line to your lilo.conf file like: - * append="qla1280=verbose,max_tags:{{255,255,255,255},{255,255,255,255}}" - * which will result in the first four devices on the first two - * controllers being set to a tagged queue depth of 32. - */ - if(options) - qla1280_setup(options, NULL); - if(dummy_buffer[0] != 'P') - printk(KERN_WARNING "qla1280: Please read the file /usr/src/linux/drivers" - "/scsi/README.qla1280\n" - "qla1280: to see the proper way to specify options to the qla1280 " - "module\n" - "qla1280: Specifically, don't use any commas when passing arguments to\n" - "qla1280: insmod or else it might trash certain memory areas.\n"); -#endif - - if ((int) !pcibios_present()) - { - printk("scsi: PCI not present\n"); - return 0; - } /* end of IF */ - bdp = &QLBoardTbl[0]; - qla1280_hostlist = NULL; -#if 0 - template->proc_dir = &proc_scsi_qla1280; -#else - template->proc_name = "qla1280"; + ha->instance = num_hosts; + host->unique_id = ha->instance; + + if (qla1280_pci_config(ha)) { + printk(KERN_INFO "qla1x160: Unable to configure PCI\n"); + goto error_mem_alloced; + } + + /* Disable ISP interrupts. */ + qla1280_disable_intrs(ha); + + /* Register the IRQ with Linux (sharable) */ + if (request_irq(host->irq, qla1280_intr_handler, SA_SHIRQ, + "qla1280", ha)) { + printk("qla1280 : Failed to reserve interrupt %d already " + "in use\n", host->irq); + goto error_iounmap; + } +#if !MEMORY_MAPPED_IO + /* Register the I/O space with Linux */ + if (!request_region(host->io_port, 0xff, "qla1280")) { + printk("qla1280: Failed to reserve i/o region 0x%04lx-0x%04lx" + " already in use\n", + host->io_port, host->io_port + 0xff); + goto error_free_irq; + } #endif - - /* Try and find each different type of adapter we support */ - for( i=0; bdp->device_id != 0 && i < NUM_OF_ISP_DEVICES; i++, bdp++ ) { -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,95) - while ((pdev = pci_find_device(QLA1280_VENDOR_ID, - bdp->device_id, pdev ) )) { - if (pci_enable_device(pdev)) continue; -#else - while (!(pcibios_find_device(QLA1280_VENDOR_ID, - bdp->device_id, - index++, &pci_bus, &pci_devfn)) ) { -#endif - /* found a adapter */ - host = scsi_register(template, sizeof(scsi_qla_host_t)); - if (!host) { - printk(KERN_WARNING "qla1280: Failed to register host, aborting.\n"); - return 0; - } - scsi_set_pci_device(host, pdev); - ha = (scsi_qla_host_t *) host->hostdata; - /* Clear our data area */ - for( j =0, cp = (char *)ha; j < sizeof(scsi_qla_host_t); j++) - *cp = 0; - /* Sanitize the information from PCI BIOS. */ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,95) - host->irq = pdev->irq; - host->io_port = pci_resource_start(pdev, 0); - ha->pci_bus = pdev->bus->number; - ha->pci_device_fn = pdev->devfn; - ha->pdev = pdev; -#else - pcibios_read_config_byte(pci_bus, pci_devfn, OFFSET(cfgp->interrupt_line), &pci_irq); - pcibios_read_config_dword(pci_bus, pci_devfn, OFFSET(cfgp->base_port), &piobase); - host->irq = pci_irq; - host->io_port = (unsigned int) piobase; - host->io_port &= PCI_BASE_ADDRESS_IO_MASK; - ha->pci_bus = pci_bus; - ha->pci_device_fn = pci_devfn; -#endif - ha->device_id = bdp->device_id; - - ha->devnum = i; - if( qla1280_mem_alloc(ha) ) { - printk(KERN_INFO "qla1280: Failed to allocate memory for adapter\n"); - } - - ha->ports = bdp->numPorts; - ha->iobase = (device_reg_t *) host->io_port; - ha->host = host; - ha->host_no = host->host_no; - - /* load the F/W, read paramaters, and init the H/W */ - if (qla1280_initialize_adapter(ha)) - { - - printk(KERN_INFO "qla1280: Failed to initialized adapter\n"); - qla1280_mem_free(ha); - scsi_unregister(host); - continue; - } - - host->max_channel = bdp->numPorts-1; - ha->instance = num_hosts; - /* Register our resources with Linux */ - if( qla1280_register_with_Linux(ha, bdp->numPorts-1) ) { - printk(KERN_INFO "qla1280: Failed to register our resources\n"); - qla1280_mem_free(ha); - scsi_unregister(host); - continue; - } + /* load the F/W, read paramaters, and init the H/W */ + if (qla1280_initialize_adapter(ha)) { + printk(KERN_INFO "qla1x160: Failed to initialize adapter\n"); + goto error_release_region; + } - reg = ha->iobase; - /* Disable ISP interrupts. */ - qla1280_disable_intrs(ha); + /* set our host ID (need to do something about our two IDs) */ + host->this_id = ha->bus_settings[0].id; - /* Insure mailbox registers are free. */ - WRT_REG_WORD(®->semaphore, 0); - WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); - WRT_REG_WORD(®->host_cmd, HC_CLR_HOST_INT); - - /* Enable chip interrupts. */ - qla1280_enable_intrs(ha); - - /* Insert new entry into the list of adapters */ - ha->next = NULL; - if( qla1280_hostlist == NULL ) - { - cur_ha = qla1280_hostlist = ha; - } - else - { - cur_ha = qla1280_hostlist; - while( cur_ha->next != NULL ) - cur_ha = cur_ha->next; - cur_ha->next = ha; - } - num_hosts++; - } /* end of WHILE */ - } /* end of FOR */ + return host; - LEAVE("qla1280_detect"); - return num_hosts; + error_release_region: +#if !MEMORY_MAPPED_IO + release_region(host->io_port, 0xff); + error_free_irq: +#endif + free_irq(host->irq, ha); + error_iounmap: +#if MEMORY_MAPPED_IO + if (ha->mmpbase) + iounmap((void *)(((unsigned long) ha->mmpbase) & PAGE_MASK)); +#endif + error_mem_alloced: + qla1280_mem_free(ha); + error_scsi_unregister: + scsi_unregister(host); + error: + return NULL; } /************************************************************************** -* qla1280_register_with_Linux -* -* Description: -* Free the passed in Scsi_Host memory structures prior to unloading the -* module. -* -* Input: -* ha - pointer to host adapter structure -* maxchannels - MAX number of channels. -* -* Returns: -* 0 - Sucessfully reserved resources. -* 1 - Failed to reserved a resource. -**************************************************************************/ -STATIC uint8_t qla1280_register_with_Linux(scsi_qla_host_t *ha, uint8_t maxchannels) + * qla1280_detect + * This routine will probe for Qlogic 1280 SCSI host adapters. + * It returns the number of host adapters of a particular + * type that were found. It also initialize all data necessary for + * the driver. It is passed-in the host number, so that it + * knows where its first entry is in the scsi_hosts[] array. + * + * Input: + * template - pointer to SCSI template + * + * Returns: + * num - number of host adapters found. + **************************************************************************/ +static int +qla1280_detect(Scsi_Host_Template * template) { + struct pci_dev *pdev = NULL; + struct Scsi_Host *host; + struct scsi_qla_host *ha, *cur_ha; + struct qla_boards *bdp; + uint16_t subsys_vendor, subsys_device; + int num_hosts = 0; + int devnum = 0; + + ENTER("qla1280_detect"); + + if (sizeof(struct srb) > sizeof(Scsi_Pointer)) { + printk(KERN_WARNING + "qla1280_detect: [WARNING] struct srb too big\n"); + return 0; + } +#ifdef MODULE + /* + * If we are called as a module, the qla1280 pointer may not be null + * and it would point to our bootup string, just like on the lilo + * command line. IF not NULL, then process this config string with + * qla1280_setup + * + * Boot time Options + * To add options at boot time add a line to your lilo.conf file like: + * append="qla1280=verbose,max_tags:{{255,255,255,255},{255,255,255,255}}" + * which will result in the first four devices on the first two + * controllers being set to a tagged queue depth of 32. + */ + if (qla1280) + qla1280_setup(qla1280); +#endif + + bdp = &ql1280_board_tbl[0]; + qla1280_hostlist = NULL; + template->proc_name = "qla1280"; + + /* First Initialize QLA12160 on PCI Bus 1 Dev 2 */ + while ((pdev = pci_find_subsys(PCI_VENDOR_ID_QLOGIC, bdp->device_id, + PCI_ANY_ID, PCI_ANY_ID, pdev))) { - struct Scsi_Host *host = ha->host; + /* find QLA12160 device on PCI bus=1 slot=2 */ + if ((pdev->bus->number != 1) || (PCI_SLOT(pdev->devfn) != 2)) + continue; - host->can_queue = 0xfffff; /* unlimited */ - host->cmd_per_lun = 1; - host->select_queue_depths = qla1280_select_queue_depth; - host->n_io_port = 0xFF; - host->base = (unsigned long) ha->mmpbase; - host->max_channel = maxchannels; - host->max_lun = MAX_LUNS-1; - host->unique_id = ha->instance; - host->max_id = MAX_TARGETS; - host->unique_id = ha->instance; + /* Bypass all AMI SUBSYS VENDOR IDs */ + if (pdev->subsystem_vendor == PCI_VENDOR_ID_AMI) { + printk(KERN_INFO + "qla1x160: Skip AMI SubSys Vendor ID Chip\n"); + continue; + } - /* set our host ID (need to do something about our two IDs) */ - host->this_id = ha->bus_settings[0].id; - /* Register the IRQ with Linux (sharable) */ - if ( request_irq(host->irq, qla1280_intr_handler, SA_INTERRUPT| SA_SHIRQ, "qla1280", ha)) - { - printk("qla1280 : Failed to reserved interrupt %d already in use\n", host->irq); - qla1280_mem_free(ha); - scsi_unregister(host); - return 1; - } - - /* Register the I/O space with Linux */ - if (check_region(host->io_port, 0xff)) - { - printk("qla1280 : Failed to reserved i/o region 0x%04lx-0x%04lx already in use\n", - host->io_port, host->io_port + 0xff); - free_irq(host->irq, NULL); - qla1280_mem_free(ha); - scsi_unregister(host); - return 1; - } + if (pci_enable_device(pdev)) + goto find_devices; + + host = qla1280_do_device_init(pdev, template, devnum, + bdp, num_hosts); + if (!host) + continue; + ha = (struct scsi_qla_host *)host->hostdata; - request_region(host->io_port, 0xff, "qla1280"); + /* this preferred device will always be the first one found */ + cur_ha = qla1280_hostlist = ha; + num_hosts++; + } - return 0; -} + find_devices: + pdev = NULL; + /* Try and find each different type of adapter we support */ + for (devnum = 0; bdp->device_id != 0 && devnum < NUM_OF_ISP_DEVICES; + devnum++, bdp++) { + /* PCI_SUBSYSTEM_IDS supported */ + while ((pdev = pci_find_subsys(PCI_VENDOR_ID_QLOGIC, + bdp->device_id, PCI_ANY_ID, + PCI_ANY_ID, pdev))) { + if (pci_enable_device(pdev)) + continue; + /* found an adapter */ + subsys_vendor = pdev->subsystem_vendor; + subsys_device = pdev->subsystem_device; + + /* + * skip QLA12160 already initialized on + * PCI Bus 1 Dev 2 since we already initialized + * and presented it + */ + if ((bdp->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160)&& + (pdev->bus->number == 1) && + (PCI_SLOT(pdev->devfn) == 2)) + continue; + + /* Bypass all AMI SUBSYS VENDOR IDs */ + if (subsys_vendor == PCI_VENDOR_ID_AMI) { + printk(KERN_INFO + "qla1x160: Skip AMI SubSys Vendor ID Chip\n"); + continue; + } + dprintk(1, "qla1x160: Supported Device Found VID=%x " + "DID=%x SSVID=%x SSDID=%x\n", pdev->vendor, + pdev->device, subsys_vendor, subsys_device); + + host = qla1280_do_device_init(pdev, template, + devnum, bdp, num_hosts); + if (!host) + continue; + ha = (struct scsi_qla_host *)host->hostdata; + + if (qla1280_hostlist == NULL) { + cur_ha = qla1280_hostlist = ha; + } else { + cur_ha = qla1280_hostlist; + while (cur_ha->next != NULL) + cur_ha = cur_ha->next; + cur_ha->next = ha; + } + num_hosts++; + } /* end of WHILE */ + } /* end of FOR */ + + LEAVE("qla1280_detect"); + return num_hosts; +} /************************************************************************** * qla1280_release * Free the passed in Scsi_Host memory structures prior to unloading the * module. **************************************************************************/ -int +static int qla1280_release(struct Scsi_Host *host) { - scsi_qla_host_t *ha = (scsi_qla_host_t *) host->hostdata; - - ENTER("qla1280_release"); + struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata; - if( !ha->flags.online ) - return(0); + ENTER("qla1280_release"); - /* turn-off interrupts on the card */ - WRT_REG_WORD(&ha->iobase->ictrl, 0); + if (!ha->flags.online) + return 0; - /* Detach interrupts */ - if(host->irq) - free_irq(host->irq, ha); + /* turn-off interrupts on the card */ + WRT_REG_WORD(&ha->iobase->ictrl, 0); - /* release io space registers */ - if( host->io_port ) - release_region(host->io_port, 0xff); + /* Detach interrupts */ + if (host->irq) + free_irq(host->irq, ha); #if MEMORY_MAPPED_IO - if(ha->mmpbase) - { -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) - vfree((void *) (((unsigned long) ha->mmpbase) & PAGE_MASK)); + if (ha->mmpbase) + iounmap(ha->mmpbase); #else - iounmap((void *) (((unsigned long) ha->mmpbase) & PAGE_MASK)); -#endif - } -#endif /* MEMORY_MAPPED_IO */ - qla1280_mem_free(ha); + /* release io space registers */ + if (host->io_port) + release_region(host->io_port, 0xff); +#endif /* MEMORY_MAPPED_IO */ - ENTER("qla1280_release"); - return(0); + qla1280_mem_free(ha); + + ENTER("qla1280_release"); + return 0; } /************************************************************************** * qla1280_info * Return a string describing the driver. **************************************************************************/ -const char * +static const char * qla1280_info(struct Scsi_Host *host) { - static char qla1280_buffer[125]; - char *bp; - scsi_qla_host_t *ha; - qla_boards_t *bdp; - - bp = &qla1280_buffer[0]; - ha = (scsi_qla_host_t *)host->hostdata; - bdp = &QLBoardTbl[ha->devnum]; - memset(bp, 0, sizeof(qla1280_buffer)); - sprintf(bp, - "QLogic %sPCI to SCSI Host Adapter: bus %d device %d irq %d\n" - " Firmware version: %2d.%02d.%02d, Driver version %s", - (char *)&bdp->bdName[0], ha->pci_bus, (ha->pci_device_fn & 0xf8) >> 3, host->irq, - bdp->fwver[0],bdp->fwver[1],bdp->fwver[2], - QLA1280_VERSION); - return(bp); + static char qla1280_scsi_name_buffer[125]; + char *bp; + struct scsi_qla_host *ha; + struct qla_boards *bdp; + + bp = &qla1280_scsi_name_buffer[0]; + ha = (struct scsi_qla_host *)host->hostdata; + bdp = &ql1280_board_tbl[ha->devnum]; + memset(bp, 0, sizeof(qla1280_scsi_name_buffer)); + sprintf (bp, + "QLogic %s PCI to SCSI Host Adapter: bus %d device %d irq %d\n" + " Firmware version: %2d.%02d.%02d, Driver version %s", + &bdp->name[0], ha->pci_bus, (ha->pci_device_fn & 0xf8) >> 3, + host->irq, bdp->fwver[0], bdp->fwver[1], bdp->fwver[2], + QLA1280_VERSION); + return bp; } /************************************************************************** @@ -1038,246 +1216,86 @@ * handling). Unfortunely, it sometimes calls the scheduler in interrupt * context which is a big NO! NO!. **************************************************************************/ -int -qla1280_queuecommand(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *)) +static int +qla1280_queuecommand(Scsi_Cmnd * cmd, void (*fn) (Scsi_Cmnd *)) { - scsi_qla_host_t *ha; - srb_t *sp; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - struct Scsi_Host *host; - uint32_t b, t, l; - scsi_lu_t *q; - u_long handle; - - ENTER("qla1280_queuecommand"); - COMTRACE('C') - - host = cmd->host; - ha = (scsi_qla_host_t *) host->hostdata; - - /* send command to adapter */ - sp = (srb_t *) CMD_SP(cmd); - sp->cmd = cmd; - cmd->scsi_done = fn; - if (cmd->flags == 0) /* new command */ - { - sp->flags = 0; - } - - DEBUG5(qla1280_print_scsi_cmd(cmd)); - - /* Generate LU queue on bus, target, LUN */ - b = SCSI_BUS_32(cmd); - t = SCSI_TCN_32(cmd); - l = SCSI_LUN_32(cmd); - if((q = LU_Q(ha, b, t, l)) == NULL ) - { - DRIVER_LOCK - if( (q = (scsi_lu_t *)KMALLOC(sizeof(struct scsi_lu))) ) - { - LU_Q(ha, b, t, l) = q; - BZERO(q,sizeof(struct scsi_lu)); - DEBUG(sprintf(debug_buff,"Allocate new device queue 0x%x\n",q)); - DEBUG(qla1280_print(debug_buff)); - DRIVER_UNLOCK - } - else - { - CMD_RESULT(cmd) = (int) (DID_BUS_BUSY << 16); - qla1280_done_q_put(sp, &ha->done_q_first, &ha->done_q_last); - - schedule_task(&ha->run_qla_bh); - ha->flags.dpc_sched = TRUE; - DRIVER_UNLOCK - return(0); - } - } - /* Set an invalid handle until we issue the command to ISP */ - /* then we will set the real handle value. */ - handle = INVALID_HANDLE; - CMD_HANDLE(cmd) = (unsigned char *)handle; - - /* Bookkeeping information */ - sp->r_start = jiffies; /* time the request was received */ - sp->u_start = 0; - - /* add the command to our queue */ - ha->qthreads++; - qla1280_putq_t(q,sp); - - DEBUG(sprintf(debug_buff,"qla1280_queuecmd: queue pid=%d, hndl=0x%x\n\r",cmd->pid,handle)); - DEBUG(qla1280_print(debug_buff)); - - /* send command to adapter */ - DRIVER_LOCK - if (q->q_outcnt == 0) - qla1280_restart_queues(ha); - DRIVER_UNLOCK - - - LEAVE("qla1280_queuecommand"); - return (0); + struct scsi_qla_host *ha; + struct srb *sp; + struct Scsi_Host *host; + int bus, target, lun; + int status; + + /*ENTER("qla1280_queuecommand"); + */ + dprintk(2, "qla1280_queuecommand(): jiffies %li\n", jiffies); + + host = CMD_HOST(cmd); + ha = (struct scsi_qla_host *)host->hostdata; + + /* send command to adapter */ + sp = (struct srb *)CMD_SP(cmd); + sp->cmd = cmd; + cmd->scsi_done = fn; + sp->flags = 0; + + qla1280_print_scsi_cmd(5, cmd); + + /* Generate LU queue on bus, target, LUN */ + bus = SCSI_BUS_32(cmd); + target = SCSI_TCN_32(cmd); + lun = SCSI_LUN_32(cmd); + if (ha->flags.enable_64bit_addressing) + status = qla1280_64bit_start_scsi(ha, sp); + else + status = qla1280_32bit_start_scsi(ha, sp); + + /*LEAVE("qla1280_queuecommand"); */ + return status; } -/************************************************************************** - * qla1200_abort - * Abort the speciifed SCSI command(s). - **************************************************************************/ -int -qla1280_abort(Scsi_Cmnd *cmd) +enum action { + ABORT_COMMAND, + ABORT_DEVICE, + DEVICE_RESET, + BUS_RESET, + ADAPTER_RESET, + FAIL +}; + +/* timer action for error action processor */ +static void qla1280_error_wait_timeout(unsigned long __data) +{ + struct scsi_cmnd *cmd = (struct scsi_cmnd *)__data; + struct srb *sp = (struct srb *)CMD_SP(cmd); + + complete(sp->wait); +} + +static void qla1280_mailbox_timeout(unsigned long __data) { - scsi_qla_host_t *ha; - srb_t *sp; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - struct Scsi_Host *host; - uint32_t b, t, l; - scsi_lu_t *q; - int return_status = SCSI_ABORT_SUCCESS; - int found = 0; - int i; - u_long handle; - u_short data; - - ENTER("qla1280_abort"); - COMTRACE('A') - ha = (scsi_qla_host_t *) cmd->host->hostdata; - host = cmd->host; - DRIVER_LOCK - - /* Get the SCSI request ptr */ - sp = (srb_t *) CMD_SP(cmd); - handle = (u_long) CMD_HANDLE(cmd); - if (qla1280_verbose) - printk("scsi(%d): ABORT Command=0x%lx, handle=0x%lx\n",(int)ha->host_no,(long)cmd,handle); - - /* Check for pending interrupts. */ - if( handle == 0L ) - { - COMTRACE('a') - /* we never got this command */ - printk(KERN_INFO "qla1280: Aborting a NULL handle\n"); - DRIVER_UNLOCK - return(SCSI_ABORT_NOT_RUNNING); /* no action - we don't have command */ - } - data = qla1280_debounce_register(&ha->iobase->istatus); - if( !(ha->flags.in_isr) && (data & RISC_INT) ) - { - /* put any pending command in done queue */ - qla1280_isr(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - } - - handle = (u_long) CMD_HANDLE(cmd); - - /* Generate LU queue on bus, target, LUN */ - b = SCSI_BUS_32(cmd); - t = SCSI_TCN_32(cmd); - l = SCSI_LUN_32(cmd); - if((q = LU_Q(ha, b, t, l)) == NULL ) - { - COMTRACE('a') - /* No lun queue -- command must not be active */ - DRIVER_UNLOCK - printk(KERN_WARNING "qla1280 (%d:%d:%d): No LUN queue for the specified device\n",(int)b,(int)t,(int)l); - return(SCSI_ABORT_NOT_RUNNING); /* no action - we don't have command */ - } - -#if AUTO_ESCALATE_ABORT - if ( (sp->flags & SRB_ABORTED) ) - { - DRIVER_UNLOCK - DEBUG(qla1280_print("qla1280_abort: Abort escalayted - returning SCSI_ABORT_SNOOZE.\n\r")); - return(SCSI_ABORT_SNOOZE); - } -#endif - - if ( (sp->flags & SRB_ABORT_PENDING) ) - { - COMTRACE('a') - DRIVER_UNLOCK - if( qla1280_verbose ) - printk("scsi(): Command has a pending abort message - ABORT_PENDING.\n"); - DEBUG(qla1280_print("qla1280: Command has a pending abort message - ABORT_PENDING.\n\r")); - return(SCSI_ABORT_PENDING); - } - -#if STOP_ON_ABORT - printk("Scsi layer issued a ABORT command= 0x%x\n",(int)cmd); - DEBUG2(qla1280_print_scsi_cmd(cmd)); -#endif - - ha->flags.in_abort = TRUE; - /* - * Normally, would would need to search our queue for the specified command - * but; since our sp contains the cmd ptr, we can just remove it from our - * LUN queue. - */ - if( !(sp->flags&SRB_SENT) ) - { - found++; - if( qla1280_verbose ) - printk("scsi(): Command returned from queue aborted.\n"); - DEBUG(qla1280_print("qla1280: Command returned from queue aborted.\n\r")); - /* Remove srb from SCSI LU queue. */ - qla1280_removeq(q, sp); - sp->flags |= SRB_ABORTED; - CMD_RESULT(cmd) = DID_ABORT << 16; - qla1280_done_q_put(sp, &ha->done_q_first, &ha->done_q_last); - return_status = SCSI_ABORT_SUCCESS; - } - else - { /* find the command in our active list */ - for (i = 1; i < MAX_OUTSTANDING_COMMANDS; i++) - { - if( sp == ha->outstanding_cmds[i] ) - { - found++; - DEBUG(qla1280_print("qla1280: RISC aborting command.\n\r")); - qla1280_abort_command(ha,sp); - return_status = SCSI_ABORT_PENDING; - break; - } - } - } - -#if STOP_ON_ABORT - qla1280_panic("qla1280_abort",ha->host); -#endif - if ( found == 0 ) - return_status = SCSI_ABORT_NOT_RUNNING; /* no action - we don't have command */ - - DEBUG(sprintf(debug_buff, "qla1280_abort: Aborted status returned = 0x%x.\n\r",return_status)); - DEBUG(qla1280_print(debug_buff)); - - if( ha->done_q_first ) - qla1280_done(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - if ( found ) - { - qla1280_restart_queues(ha); - } - ha->flags.in_abort = FALSE; - DRIVER_UNLOCK - - LEAVE("qla1280_abort"); - COMTRACE('a') - return(return_status); + struct scsi_qla_host *ha = (struct scsi_qla_host *)__data; + struct device_reg *reg; + reg = ha->iobase; + + ha->mailbox_out[0] = RD_REG_WORD(®->mailbox0); + printk(KERN_ERR "scsi(%ld): mailbox timed out, mailbox0 %04x, " + "ictrl %04x, istatus %04x\n", ha->host_no, ha->mailbox_out[0], + RD_REG_WORD(®->ictrl), RD_REG_WORD(®->istatus)); + complete(ha->mailbox_wait); } /************************************************************************** - * qla1200_reset - * The reset function will reset the SCSI bus and abort any executing - * commands. + * qla1200_error_action + * The function will attempt to perform a specified error action and + * wait for the results (or time out). * * Input: * cmd = Linux SCSI command packet of the command that cause the * bus reset. - * flags = SCSI bus reset option flags (see scsi.h) + * action = error action to take (see action_t) * * Returns: - * DID_RESET in cmd.host_byte of aborted command(s) + * SUCCESS or FAILED * * Note: * Resetting the bus always succeeds - is has to, otherwise the @@ -1285,360 +1303,369 @@ * DEVICE RESET message - on the offending target before pulling * the SCSI bus reset line. **************************************************************************/ -int -qla1280_reset(Scsi_Cmnd *cmd, unsigned int flags) +static int +qla1280_error_action(Scsi_Cmnd * cmd, enum action action) { - scsi_qla_host_t *ha; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - uint32_t b, t, l; - srb_t *sp; - typedef enum - { - ABORT_DEVICE = 1, - DEVICE_RESET = 2, - BUS_RESET = 3, - ADAPTER_RESET= 4, - RESET_DELAYED= 5, - FAIL = 6 - } action_t; - action_t action = ADAPTER_RESET; - u_short data; - scsi_lu_t *q; - int result; - - - ENTER("qla1280_reset"); - COMTRACE('R') - if (qla1280_verbose) - printk("scsi(): Resetting Cmnd=0x%lx, Handle=0x%lx, flags=0x%x\n",(long)cmd,(long)CMD_HANDLE(cmd),flags); - if ( cmd == NULL ) - { - printk(KERN_WARNING "(scsi?:?:?:?) Reset called with NULL Scsi_Cmnd " - "pointer, failing.\n"); - return(SCSI_RESET_SNOOZE); - } - ha = (scsi_qla_host_t *) cmd->host->hostdata; - sp = (srb_t *) CMD_SP(cmd); - -#if STOP_ON_RESET - qla1280_panic("qla1280_reset",ha->host); -#endif - - DRIVER_LOCK - /* Check for pending interrupts. */ - data = qla1280_debounce_register(&ha->iobase->istatus); - if( !(ha->flags.in_isr) && (data & RISC_INT) ) - { - qla1280_isr(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - } - DRIVER_UNLOCK - - /* - * Determine the suggested action that the mid-level driver wants - * us to perform. - */ - if( CMD_HANDLE(cmd) == (unsigned char *) 0 ) - { - /* - * if mid-level driver called reset with a orphan SCSI_Cmnd - * (i.e. a command that's not pending ), so perform the - * function specified. - */ - if( (flags & SCSI_RESET_SUGGEST_HOST_RESET) ) - action = ADAPTER_RESET; - else - action = BUS_RESET; - } - else - { /* - * Mid-level driver has called reset with this SCSI_Cmnd and - * its pending. - */ - if( flags & SCSI_RESET_SUGGEST_HOST_RESET ) - action = ADAPTER_RESET; - else if( flags & SCSI_RESET_SUGGEST_BUS_RESET ) - action = BUS_RESET; - else - action = DEVICE_RESET; - } - - b = SCSI_BUS_32(cmd); - t = SCSI_TCN_32(cmd); - l = SCSI_LUN_32(cmd); - q = LU_Q(ha, b, t, l); - -#if AUTO_ESCALATE_RESET - if ( (action & DEVICE_RESET) && (q->q_flag & QLA1280_QRESET) ) - { - printk(KERN_INFO "qla1280(%d): Bus device reset already sent to " "device, escalating.\n", (int)ha->host_no); - action = BUS_RESET; - } - if ( (action & DEVICE_RESET) && (sp->flags & SRB_ABORT_PENDING) ) - { - printk(KERN_INFO "qla1280(%d):Have already attempted to reach " "device with abort device\n", (int)ha->host_no); - printk(KERN_INFO "qla1280(%d):message, will escalate to BUS " "RESET.\n",(int) ha->host_no); - action = BUS_RESET; - } -#endif - - /* - * By this point, we want to already know what we are going to do, - * so we only need to perform the course of action. - */ - DRIVER_LOCK - result = SCSI_RESET_ERROR; - switch (action) - { - case FAIL: - break; - - case RESET_DELAYED: - result = SCSI_RESET_PENDING; - break; - - case ABORT_DEVICE: - ha->flags.in_reset = TRUE; - if (qla1280_verbose) - printk(KERN_INFO "scsi(%d:%d:%d:%d): Queueing abort device command.\n", (int)ha->host_no,(int)b,(int)t,(int)l); - qla1280_abort_queue_single(ha,b,t,l,DID_ABORT); - if( qla1280_abort_device(ha, b, t, l) == 0) - result = SCSI_RESET_PENDING; - break; - - case DEVICE_RESET: - if (qla1280_verbose) - printk(KERN_INFO "scsi(%d:%d:%d:%d): Queueing device reset command.\n",(int) ha->host_no,(int)b,(int)t,(int)l); - ha->flags.in_reset = TRUE; - for (l = 0; l < MAX_LUNS; l++) - qla1280_abort_queue_single(ha,b,t,l,DID_ABORT); - if( qla1280_device_reset(ha, b, t) == 0 ) - result = SCSI_RESET_PENDING; - q->q_flag |= QLA1280_QRESET; - break; - - case BUS_RESET: - if (qla1280_verbose) - printk(KERN_INFO "qla1280(%d:%d:%d:%d): Issuing BUS DEVICE RESET.\n",(int) ha->host_no,(int)b,(int)t,(int)l); - ha->flags.in_reset = TRUE; - for (t = 0; t < MAX_TARGETS; t++) - for (l = 0; l < MAX_LUNS; l++) - qla1280_abort_queue_single(ha,b,t,l,DID_RESET); - qla1280_bus_reset(ha, b); - /* - * The bus reset routine returns all the outstanding commands back - * with "DID_RESET" in the status field after a short delay - * by the firmware. If the mid-level time out the SCSI reset before - * our delay we may need to ignore it. - */ - /* result = SCSI_RESET_PENDING | SCSI_RESET_BUS_RESET; */ - result = SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET; - mdelay(4 * 1000); barrier(); - if( flags & SCSI_RESET_SYNCHRONOUS ) - { - CMD_RESULT(cmd) = (int) (DID_BUS_BUSY << 16); - (*(cmd)->scsi_done)(cmd); - } - /* ha->reset_start = jiffies; */ - break; - - case ADAPTER_RESET: - default: - if (qla1280_verbose) - { - printk(KERN_INFO "scsi(%d:%d:%d:%d): Issued an ADAPTER RESET.\n",(int) ha->host_no,(int)b,(int)t,(int)l); - printk(KERN_INFO "scsi(%d:%d:%d:%d): I/O processing will continue automatically.\n",(int) ha->host_no,(int)b,(int)t,(int)l); - } - ha->flags.reset_active = TRUE; - /* - * We restarted all of the commands automatically, so the mid-level code can expect - * completions momentitarily. - */ - if( qla1280_abort_isp(ha) == 0 ) - result = SCSI_RESET_SUCCESS | SCSI_RESET_HOST_RESET; - - ha->flags.reset_active = FALSE; - } - - if( ha->done_q_first ) - qla1280_done(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - qla1280_restart_queues(ha); - ha->flags.in_reset = FALSE; - -DRIVER_UNLOCK - DEBUG(printk("RESET returning %d\n", result)); - - COMTRACE('r') - LEAVE("qla1280_reset"); - return( result ); + struct scsi_qla_host *ha; + int bus, target, lun; + struct srb *sp; + uint16_t data; + unsigned char *handle; + int result, i; + DECLARE_COMPLETION(wait); + struct timer_list timer; + + ha = (struct scsi_qla_host *)(CMD_HOST(cmd)->hostdata); + + dprintk(4, "error_action %i, istatus 0x%04x\n", action, + RD_REG_WORD(&ha->iobase->istatus)); + + dprintk(4, "host_cmd 0x%04x, ictrl 0x%04x, jiffies %li\n", + RD_REG_WORD(&ha->iobase->host_cmd), + RD_REG_WORD(&ha->iobase->ictrl), jiffies); + + ENTER("qla1280_error_action"); + if (qla1280_verbose) + printk(KERN_INFO "scsi(%li): Resetting Cmnd=0x%p, " + "Handle=0x%p, action=0x%x\n", + ha->host_no, cmd, CMD_HANDLE(cmd), action); + + if (cmd == NULL) { + printk(KERN_WARNING "(scsi?:?:?:?) Reset called with NULL " + "si_Cmnd pointer, failing.\n"); + LEAVE("qla1280_error_action"); + return FAILED; + } + + ha = (struct scsi_qla_host *)cmd->device->host->hostdata; + sp = (struct srb *)CMD_SP(cmd); + handle = CMD_HANDLE(cmd); + + /* Check for pending interrupts. */ + data = qla1280_debounce_register(&ha->iobase->istatus); + /* + * The io_request_lock is held when the reset handler is called, hence + * the interrupt handler cannot be running in parallel as it also + * grabs the lock. /Jes + */ + if (data & RISC_INT) + qla1280_isr(ha, &ha->done_q_first, &ha->done_q_last); + + /* + * Determine the suggested action that the mid-level driver wants + * us to perform. + */ + if (handle == (unsigned char *)INVALID_HANDLE || handle == NULL) { + if(action == ABORT_COMMAND) { + /* we never got this command */ + printk(KERN_INFO "qla1280: Aborting a NULL handle\n"); + return SUCCESS; /* no action - we don't have command */ + } + } else { + sp->wait = &wait; + } + + bus = SCSI_BUS_32(cmd); + target = SCSI_TCN_32(cmd); + lun = SCSI_LUN_32(cmd); + + /* Overloading result. Here it means the success or fail of the + * *issue* of the action. When we return from the routine, it must + * mean the actual success or fail of the action */ + result = FAILED; + switch (action) { + case FAIL: + break; + + case ABORT_COMMAND: + if ((sp->flags & SRB_ABORT_PENDING)) { + printk(KERN_WARNING + "scsi(): Command has a pending abort " + "message - ABORT_PENDING.\n"); + /* This should technically be impossible since we + * now wait for abort completion */ + break; + } + + for (i = 0; i < MAX_OUTSTANDING_COMMANDS; i++) { + if (sp == ha->outstanding_cmds[i]) { + dprintk(1, "qla1280: RISC aborting command\n"); + if (qla1280_abort_command(ha, sp, i) == 0) + result = SUCCESS; + else { + /* + * Since we don't know what might + * have happend to the command, it + * is unsafe to remove it from the + * device's queue at this point. + * Wait and let the escalation + * process take care of it. + */ + printk(KERN_WARNING + "scsi(%li:%i:%i:%i): Unable" + " to abort command!\n", + ha->host_no, bus, target, lun); + } + } + } + break; + + case ABORT_DEVICE: + ha->flags.in_reset = 1; + if (qla1280_verbose) + printk(KERN_INFO + "scsi(%ld:%d:%d:%d): Queueing abort device " + "command.\n", ha->host_no, bus, target, lun); + if (qla1280_abort_device(ha, bus, target, lun) == 0) + result = SUCCESS; + break; + + case DEVICE_RESET: + if (qla1280_verbose) + printk(KERN_INFO + "scsi(%ld:%d:%d:%d): Queueing device reset " + "command.\n", ha->host_no, bus, target, lun); + ha->flags.in_reset = 1; + if (qla1280_device_reset(ha, bus, target) == 0) + result = SUCCESS; + break; + + case BUS_RESET: + if (qla1280_verbose) + printk(KERN_INFO "qla1280(%ld:%d): Issuing BUS " + "DEVICE RESET\n", ha->host_no, bus); + ha->flags.in_reset = 1; + if (qla1280_bus_reset(ha, bus == 0)) + result = SUCCESS; + + break; + + case ADAPTER_RESET: + default: + if (qla1280_verbose) { + printk(KERN_INFO + "scsi(%ld): Issued ADAPTER RESET\n", + ha->host_no); + printk(KERN_INFO "scsi(%ld): I/O processing will " + "continue automatically\n", ha->host_no); + } + ha->flags.reset_active = 1; + /* + * We restarted all of the commands automatically, so the + * mid-level code can expect completions momentitarily. + */ + if (qla1280_abort_isp(ha) == 0) + result = SUCCESS; + + ha->flags.reset_active = 0; + } + + if (ha->done_q_first) + qla1280_done(ha, &ha->done_q_first, &ha->done_q_last); + ha->flags.in_reset = 0; + + /* If we didn't manage to issue the action, or we have no + * command to wait for, exit here */ + if (result == FAILED || handle == NULL || + handle == (unsigned char *)INVALID_HANDLE) + goto leave; + + /* set up a timer just in case we're really jammed */ + init_timer(&timer); + timer.expires = jiffies + 4*HZ; + timer.data = (unsigned long)cmd; + timer.function = qla1280_error_wait_timeout; + add_timer(&timer); + + /* wait for the action to complete (or the timer to expire) */ + spin_unlock_irq(HOST_LOCK); + wait_for_completion(&wait); + del_timer_sync(&timer); + spin_lock_irq(HOST_LOCK); + sp->wait = NULL; + + /* the only action we might get a fail for is abort */ + if (action == ABORT_COMMAND) { + if(sp->flags & SRB_ABORTED) + result = SUCCESS; + else + result = FAILED; + } + + leave: + dprintk(1, "RESET returning %d\n", result); + + LEAVE("qla1280_error_action"); + return result; } /************************************************************************** - * qla1200_biosparam - * Return the disk geometry for the given SCSI device. + * qla1280_abort + * Abort the specified SCSI command(s). **************************************************************************/ -int -qla1280_biosparam(Disk *disk, kdev_t dev, int geom[]) +static int +qla1280_eh_abort(struct scsi_cmnd * cmd) { - int heads, sectors, cylinders; - - heads = 64; - sectors = 32; - cylinders = disk->capacity / (heads * sectors); - if (cylinders > 1024) - { - heads = 255; - sectors = 63; - cylinders = disk->capacity / (heads * sectors); - /* if (cylinders > 1023) - cylinders = 1023; */ - } - - geom[0] = heads; - geom[1] = sectors; - geom[2] = cylinders; - - return (0); + return qla1280_error_action(cmd, ABORT_COMMAND); } + /************************************************************************** - * qla1280_intr_handler - * Handles the H/W interrupt + * qla1280_device_reset + * Reset the specified SCSI device **************************************************************************/ -void qla1280_intr_handler(int irq, void *dev_id, struct pt_regs *regs) +static int +qla1280_eh_device_reset(struct scsi_cmnd *cmd) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - scsi_qla_host_t *ha; - u_short data; - device_reg_t *reg; - - ENTER_INTR("qla1280_intr_handler"); - COMTRACE('I') - ha = (scsi_qla_host_t *) dev_id; - if(!ha) - { - printk(KERN_INFO "scsi(): Interrupt with NULL host ptr\n"); - COMTRACE('X') - return; - } -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,95) - spin_lock_irqsave(&io_request_lock, cpu_flags); - if(test_and_set_bit(QLA1280_IN_ISR_BIT, &ha->flags)) - { - COMTRACE('X') - spin_unlock_irqrestore(&io_request_lock, cpu_flags); - return; - } - ha->isr_count++; - reg = ha->iobase; - /* disable our interrupt. */ - WRT_REG_WORD(®->ictrl, 0); - data = qla1280_debounce_register(®->istatus); - /* Check for pending interrupts. */ - if ( !(data & RISC_INT) ) - { - /* spurious interrupts can happen legally */ - DEBUG(printk("scsi(%d): Spurious interrupt - ignoring\n",(int)ha->host_no)); - COMTRACE('X') - } - else - qla1280_isr(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - if (ha->done_q_first) - qla1280_done(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - - clear_bit(QLA1280_IN_ISR_BIT, &ha->flags); - spin_unlock_irqrestore(&io_request_lock, cpu_flags); -#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) */ - - if( test_bit(QLA1280_IN_ISR_BIT, (int *)&ha->flags) ) - { - COMTRACE('X') - printk(KERN_INFO "scsi(%d): Already in interrupt - returning \n", (int)ha->host_no); - return; - } - set_bit(QLA1280_IN_ISR_BIT, (int *)&ha->flags); - ha->isr_count++; - reg = ha->iobase; - /* disable our interrupt. */ - WRT_REG_WORD(®->ictrl, 0); - - data = qla1280_debounce_register(®->istatus); - /* Check for pending interrupts. */ - if ( !(data & RISC_INT) ) - { - /* spurious interrupts can happen legally */ - DEBUG(printk("scsi(%d): Spurious interrupt - ignoring\n",(int)ha->host_no)); - COMTRACE('X') - } - else - qla1280_isr(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - - /* if no work to do then call the SCSI mid-level right away */ - if( ha->done_q_first ) - qla1280_done(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - - /* Schedule the DPC routine */ - if (ha->flags.isp_abort_needed || ha->flags.reset_marker || - ha->done_q_first ) - { - ha->run_qla_bh.data = (void *) ha; - ha->run_qla_bh.routine = qla1280_do_dpc; - - COMTRACE('P') - schedule_task(&ha->run_qla_bh); - ha->flags.dpc_sched = TRUE; - } - clear_bit(QLA1280_IN_ISR_BIT, (int *)&ha->flags); -#endif - /* enable our interrupt. */ - WRT_REG_WORD(®->ictrl, ISP_EN_INT + ISP_EN_RISC); + return qla1280_error_action(cmd, DEVICE_RESET); +} - COMTRACE('i') - LEAVE_INTR("qla1280_intr_handler"); +/************************************************************************** + * qla1280_bus_reset + * Reset the specified bus. + **************************************************************************/ +static int +qla1280_eh_bus_reset(struct scsi_cmnd *cmd) +{ + return qla1280_error_action(cmd, BUS_RESET); } /************************************************************************** - * qla1280_do_dpc - * - * Description: - * This routine is a task that is schedule by the interrupt handler - * to perform the background processing for interrupts. We put it - * on a task queue that is consumed whenever the scheduler runs; that's - * so you can do anything (i.e. put the process to sleep etc). In fact, the - * mid-level tries to sleep when it reaches the driver threshold - * "host->can_queue". This can cause a panic if we were in our interrupt - * code . + * qla1280_adapter_reset + * Reset the specified adapter (both channels) **************************************************************************/ -static void qla1280_do_dpc(void *p) +static int +qla1280_eh_adapter_reset(struct scsi_cmnd *cmd) { - scsi_qla_host_t *ha = (scsi_qla_host_t *) p; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif + return qla1280_error_action(cmd, ADAPTER_RESET); +} - COMTRACE('p') -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,95) - spin_lock_irqsave(&io_request_lock, cpu_flags); +/************************************************************************** + * qla1280_biosparam + * Return the disk geometry for the given SCSI device. + **************************************************************************/ +static int +#if LINUX_VERSION_CODE < 0x020545 +qla1280_biosparam(Disk * disk, kdev_t dev, int geom[]) +#else +qla1280_biosparam(struct scsi_device *sdev, struct block_device *bdev, + sector_t capacity, int geom[]) #endif - if (ha->flags.isp_abort_needed) - qla1280_abort_isp(ha); +{ + int heads, sectors, cylinders; +#if LINUX_VERSION_CODE < 0x020545 + unsigned long capacity = disk->capacity; +#endif + + heads = 64; + sectors = 32; + cylinders = (unsigned long)capacity / (heads * sectors); + if (cylinders > 1024) { + heads = 255; + sectors = 63; + cylinders = (unsigned long)capacity / (heads * sectors); + /* if (cylinders > 1023) + cylinders = 1023; */ + } - if (ha->flags.reset_marker) - qla1280_rst_aen(ha); + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; - if (ha->done_q_first) - qla1280_done(ha, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - ha->flags.dpc_sched = FALSE; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,95) - spin_unlock_irqrestore(&io_request_lock, cpu_flags); -#endif + return 0; } /************************************************************************** - * qla1280_device_queue_depth - * + * qla1280_intr_handler + * Handles the H/W interrupt + **************************************************************************/ +irqreturn_t +qla1280_intr_handler(int irq, void *dev_id, struct pt_regs *regs) +{ + struct scsi_qla_host *ha; + struct device_reg *reg; + u16 data; + int handled = 0; + + ENTER_INTR ("qla1280_intr_handler"); + ha = (struct scsi_qla_host *)dev_id; + + spin_lock(HOST_LOCK); + + ha->isr_count++; + reg = ha->iobase; + + WRT_REG_WORD(®->ictrl, 0); /* disable our interrupt. */ + + data = qla1280_debounce_register(®->istatus); + /* Check for pending interrupts. */ + if (data & RISC_INT) { + qla1280_isr(ha, &ha->done_q_first, &ha->done_q_last); + handled = 1; + } + if (ha->done_q_first) + qla1280_done(ha, &ha->done_q_first, &ha->done_q_last); + + spin_unlock(HOST_LOCK); + + /* enable our interrupt. */ + WRT_REG_WORD(®->ictrl, (ISP_EN_INT | ISP_EN_RISC)); + + LEAVE_INTR("qla1280_intr_handler"); + return IRQ_RETVAL(handled); +} + + +static int +qla12160_set_target_parameters(struct scsi_qla_host *ha, int bus, int target) +{ + uint8_t mr; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + struct nvram *nv; + int is1x160, status; + + nv = &ha->nvram; + + if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 || + ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160) + is1x160 = 1; + else + is1x160 = 0; + + mr = BIT_3 | BIT_2 | BIT_1 | BIT_0; + + /* Set Target Parameters. */ + mb[0] = MBC_SET_TARGET_PARAMETERS; + mb[1] = (uint16_t) (bus ? target | BIT_7 : target); + mb[1] <<= 8; + + mb[2] = (nv->bus[bus].target[target].parameter.c << 8); + + if (is1x160) + mb[3] = nv->bus[bus].target[target].flags.flags1x160.sync_offset << 8; + else + mb[3] = nv->bus[bus].target[target].flags.flags1x80.sync_offset << 8; + mb[3] |= nv->bus[bus].target[target].sync_period; + + if (is1x160) { + mb[2] |= nv->bus[bus].target[target].ppr_1x160.flags.enable_ppr << 5; + mb[6] = nv->bus[bus].target[target].ppr_1x160.flags.ppr_options << 8; + mb[6] |= nv->bus[bus].target[target].ppr_1x160.flags.ppr_bus_width; + mr |= BIT_6; + } + + status = qla1280_mailbox_command(ha, mr, &mb[0]); + + if (status) + printk(KERN_WARNING "scsi(%ld:%i:%i): " + "qla1280_set_target_parameters() failed\n", + ha->host_no, bus, target); + return status; +} + + +/************************************************************************** + * qla1280_slave_configure + * * Description: * Determines the queue depth for a given device. There are two ways * a queue depth can be obtained for a tagged queueing device. One @@ -1647,29 +1674,64 @@ * as the default queue depth. Otherwise, we use either 4 or 8 as the * default queue depth (dependent on the number of hardware SCBs). **************************************************************************/ -STATIC void qla1280_device_queue_depth(scsi_qla_host_t *p, Scsi_Device *device) +static int +qla1280_slave_configure(Scsi_Device *device) { - int default_depth = 3; - int bus = device->channel; - int target = device->id; - - device->queue_depth = default_depth; - - if (device->tagged_supported && - (p->bus_settings[bus].qtag_enables & (BIT_0 << target)) ) - { - device->tagged_queue = 1; - device->current_tag = 0; - device->queue_depth = p->bus_settings[bus].hiwat; - /* device->queue_depth = 20; */ - printk(KERN_INFO "scsi(%d:%d:%d:%d): Enabled tagged queuing, queue depth %d.\n", - (int)p->host_no, device->channel, device->id, - device->lun, device->queue_depth); - } - qla12160_get_target_parameters(p, bus, target, device->lun); + struct scsi_qla_host *ha; + int default_depth = 3; + int bus = device->channel; + int target = device->id; + int status = 0; + struct nvram *nv; + unsigned long flags; + + ha = (struct scsi_qla_host *)device->host->hostdata; + nv = &ha->nvram; + + if (qla1280_check_for_dead_scsi_bus(ha, bus)) + return 1; + + if (device->tagged_supported && + (ha->bus_settings[bus].qtag_enables & (BIT_0 << target))) { + scsi_adjust_queue_depth(device, MSG_ORDERED_TAG, + ha->bus_settings[bus].hiwat); + } else { + scsi_adjust_queue_depth(device, 0, default_depth); + } + +#if LINUX_VERSION_CODE > 0x020500 + nv->bus[bus].target[target].parameter.f.enable_sync = device->sdtr; + nv->bus[bus].target[target].parameter.f.enable_wide = device->wdtr; + nv->bus[bus].target[target].ppr_1x160.flags.enable_ppr = device->ppr; +#endif + + if (driver_setup.no_sync || + (driver_setup.sync_mask && + (~driver_setup.sync_mask & (1 << target)))) + nv->bus[bus].target[target].parameter.f.enable_sync = 0; + if (driver_setup.no_wide || + (driver_setup.wide_mask && + (~driver_setup.wide_mask & (1 << target)))) + nv->bus[bus].target[target].parameter.f.enable_wide = 0; + if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 || + ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160) { + if (driver_setup.no_ppr || + (driver_setup.ppr_mask && + (~driver_setup.ppr_mask & (1 << target)))) + nv->bus[bus].target[target].ppr_1x160.flags.enable_ppr = 0; + } + + spin_lock_irqsave(HOST_LOCK, flags); + if (nv->bus[bus].target[target].parameter.f.enable_sync) { + status = qla12160_set_target_parameters(ha, bus, target); + } + qla12160_get_target_parameters(ha, device); + spin_unlock_irqrestore(HOST_LOCK, flags); + return status; } +#if LINUX_VERSION_CODE < 0x020545 /************************************************************************** * qla1280_select_queue_depth * @@ -1677,43 +1739,30 @@ * host adapter. We use a queue depth of 2 for devices that do not * support tagged queueing. **************************************************************************/ -STATIC void +static void qla1280_select_queue_depth(struct Scsi_Host *host, Scsi_Device *scsi_devs) { - Scsi_Device *device; - scsi_qla_host_t *p = (scsi_qla_host_t *) host->hostdata; + Scsi_Device *device; + struct scsi_qla_host *ha = (struct scsi_qla_host *)host->hostdata; - ENTER("qla1280_select_queue_depth"); - for (device = scsi_devs; device != NULL; device = device->next) - { - if (device->host == host) - qla1280_device_queue_depth(p, device); - } - LEAVE("qla1280_select_queue_depth"); -} - -/*--------------------------** -** Driver Support Routines ** -**--------------------------*/ + ENTER("qla1280_select_queue_depth"); + for (device = scsi_devs; device != NULL; device = device->next) { + if (device->host == host) + qla1280_slave_configure(device); + } -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) -/* - * mdelay - * Delay in milliseconds - * - * Input: - * milliseconds = delay - */ -STATIC inline void mdelay(int milliseconds) -{ - int i; + if (scsi_devs) + qla1280_check_for_dead_scsi_bus(ha, scsi_devs->channel); - for(i=0; is_next)) - *done_q_last = NULL; - else - (*done_q_first)->s_prev = NULL; - cmd = sp->cmd; - b = SCSI_BUS_32(cmd); - t = SCSI_TCN_32(cmd); - l = SCSI_LUN_32(cmd); - q = LU_Q(ha, b, t, l); - - /* Decrement outstanding commands on device. */ - if (q->q_outcnt) - q->q_outcnt--; - if (q->q_outcnt < ha->bus_settings[b].hiwat) - { - q->q_flag &= ~QLA1280_QBUSY; - } - - q->resp_time += jiffies - sp->r_start; /* Lun bookkeeping information */ - q->act_time += jiffies - sp->u_start; - q->io_cnt++; - if( sp->dir & BIT_5 ) - q->r_cnt++; - else - q->w_cnt++; - - switch ( (CMD_RESULT(cmd)>>16)) - { - case DID_RESET: - q->q_flag &= ~QLA1280_QRESET; - /* Issue marker command. */ - qla1280_marker(ha, b, t, 0, MK_SYNC_ID); - break; - case DID_ABORT: - sp->flags &= ~SRB_ABORT_PENDING; - sp->flags |= SRB_ABORTED; - if (sp->flags & SRB_TIMEOUT) - CMD_RESULT(sp->cmd)= DID_TIME_OUT << 16; - break; - default: - break; - } - - /* Call the mid-level driver interrupt handler */ - CMD_HANDLE(sp->cmd) = (unsigned char *) 0; - ha->actthreads--; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - sti(); - (*(cmd)->scsi_done)(cmd); - cli(); -#else - (*(cmd)->scsi_done)(cmd); +static void +qla1280_done(struct scsi_qla_host *ha, struct srb ** done_q_first, + struct srb ** done_q_last) +{ + struct srb *sp; + int bus, target, lun; + Scsi_Cmnd *cmd; + + ENTER("qla1280_done"); + + while (*done_q_first != NULL) { + /* remove command from done list */ + sp = *done_q_first; + if (!(*done_q_first = sp->s_next)) + *done_q_last = NULL; + else + (*done_q_first)->s_prev = NULL; + + cmd = sp->cmd; + bus = SCSI_BUS_32(cmd); + target = SCSI_TCN_32(cmd); + lun = SCSI_LUN_32(cmd); + + switch ((CMD_RESULT(cmd) >> 16)) { + case DID_RESET: + /* Issue marker command. */ + qla1280_marker(ha, bus, target, 0, MK_SYNC_ID); + break; + case DID_ABORT: + sp->flags &= ~SRB_ABORT_PENDING; + sp->flags |= SRB_ABORTED; + if (sp->flags & SRB_TIMEOUT) + CMD_RESULT(sp->cmd) = DID_TIME_OUT << 16; + break; + default: + break; + } + + /* Release memory used for this I/O */ + if (cmd->use_sg) { + dprintk(3, "S/G unmap_sg cmd=%p\n", cmd); + + pci_unmap_sg(ha->pdev, cmd->request_buffer, + cmd->use_sg, + scsi_to_pci_dma_dir(cmd->sc_data_direction)); + } else if (cmd->request_bufflen) { + /*dprintk(1, "No S/G unmap_single cmd=%x saved_dma_handle=%lx\n", + cmd, sp->saved_dma_handle); */ + + pci_unmap_page(ha->pdev, sp->saved_dma_handle, + cmd->request_bufflen, + scsi_to_pci_dma_dir(cmd->sc_data_direction)); + } + + /* Call the mid-level driver interrupt handler */ + CMD_HANDLE(sp->cmd) = (unsigned char *)INVALID_HANDLE; + ha->actthreads--; + +#if LINUX_VERSION_CODE < 0x020500 + if (cmd->cmnd[0] == INQUIRY) + qla1280_get_target_options(cmd, ha); #endif - qla1280_next(ha, q, b); - } - DRIVER_UNLOCK + (*(cmd)->scsi_done)(cmd); + if(sp->wait != NULL) + complete(sp->wait); - COMTRACE('d') - LEAVE("qla1280_done"); + } + LEAVE("qla1280_done"); } /* * Translates a ISP error to a Linux SCSI error */ -STATIC int qla1280_return_status( sts_entry_t *sts, Scsi_Cmnd *cp) +static int +qla1280_return_status(struct response * sts, Scsi_Cmnd * cp) { - int host_status = DID_ERROR; + int host_status = DID_ERROR; #if DEBUG_QLA1280_INTR - STATIC char *reason[] = - { - "DID_OK", - "DID_NO_CONNECT", - "DID_BUS_BUSY", - "DID_TIME_OUT", - "DID_BAD_TARGET", - "DID_ABORT", - "DID_PARITY", - "DID_ERROR", - "DID_RESET", - "DID_BAD_INTR" - }; -#endif /* DEBUG_QLA1280_INTR */ + static char *reason[] = { + "DID_OK", + "DID_NO_CONNECT", + "DID_BUS_BUSY", + "DID_TIME_OUT", + "DID_BAD_TARGET", + "DID_ABORT", + "DID_PARITY", + "DID_ERROR", + "DID_RESET", + "DID_BAD_INTR" + }; +#endif /* DEBUG_QLA1280_INTR */ - ENTER("qla1280_return_status"); + ENTER("qla1280_return_status"); #if DEBUG_QLA1280_INTR - /* - DEBUG(printk("qla1280_return_status: compl status = 0x%04x\n", sts->comp_status)); - */ -#endif - switch(sts->comp_status) - { - case CS_COMPLETE: - host_status = DID_OK; - break; - case CS_INCOMPLETE: - if (!(sts->state_flags & SF_GOT_BUS)) - host_status = DID_NO_CONNECT; - else if (!(sts->state_flags & SF_GOT_TARGET)) - host_status = DID_BAD_TARGET; - else if (!(sts->state_flags & SF_SENT_CDB)) - host_status = DID_ERROR; - else if (!(sts->state_flags & SF_TRANSFERRED_DATA)) - host_status = DID_ERROR; - else if (!(sts->state_flags & SF_GOT_STATUS)) - host_status = DID_ERROR; - else if (!(sts->state_flags & SF_GOT_SENSE)) - host_status = DID_ERROR; - break; - case CS_RESET: - host_status = DID_RESET; - break; - case CS_ABORTED: - host_status = DID_ABORT; - break; - case CS_TIMEOUT: - host_status = DID_TIME_OUT; - break; - case CS_DATA_OVERRUN: -#ifdef QL_DEBUG_LEVEL_2 - printk("Data overrun 0x%x\n",(int)sts->residual_length); - qla1280_print( - "\n\rqla1280_isr: response packet data\n\r"); - qla1280_dump_buffer((caddr_t)sts, - RESPONSE_ENTRY_SIZE); -#endif - host_status = DID_ERROR; - break; - case CS_DATA_UNDERRUN: - if ( (CMD_XFRLEN(cp) - sts->residual_length) < cp->underflow) - { - printk("scsi: Underflow detected - retrying command.\n"); - host_status = DID_ERROR; - } - else - host_status = DID_OK; - break; - default: - host_status = DID_ERROR; - break; - } + /* + dprintk(1, "qla1280_return_status: compl status = 0x%04x\n", + sts->comp_status); + */ +#endif + switch (sts->comp_status) { + case CS_COMPLETE: + host_status = DID_OK; + break; + + case CS_INCOMPLETE: + if (!(sts->state_flags & SF_GOT_BUS)) + host_status = DID_NO_CONNECT; + else if (!(sts->state_flags & SF_GOT_TARGET)) + host_status = DID_BAD_TARGET; + else if (!(sts->state_flags & SF_SENT_CDB)) + host_status = DID_ERROR; + else if (!(sts->state_flags & SF_TRANSFERRED_DATA)) + host_status = DID_ERROR; + else if (!(sts->state_flags & SF_GOT_STATUS)) + host_status = DID_ERROR; + else if (!(sts->state_flags & SF_GOT_SENSE)) + host_status = DID_ERROR; + break; + + case CS_RESET: + host_status = DID_RESET; + break; + + case CS_ABORTED: + host_status = DID_ABORT; + break; + + case CS_TIMEOUT: + host_status = DID_TIME_OUT; + break; + + case CS_DATA_OVERRUN: + dprintk(2, "Data overrun 0x%x\n", sts->residual_length); + dprintk(2, "qla1280_isr: response packet data\n"); + qla1280_dump_buffer(2, (char *)sts, RESPONSE_ENTRY_SIZE); + host_status = DID_ERROR; + break; + + case CS_DATA_UNDERRUN: + if ((cp->request_bufflen - sts->residual_length) < + cp->underflow) { + printk(KERN_WARNING + "scsi: Underflow detected - retrying " + "command.\n"); + host_status = DID_ERROR; + } else + host_status = DID_OK; + break; + + default: + host_status = DID_ERROR; + break; + } #if DEBUG_QLA1280_INTR - sprintf(debug_buff, "qla1280 ISP status: host status (%s) scsi status %x\n\r", reason[host_status], sts->scsi_status); - qla1280_print(debug_buff); + dprintk(1, "qla1280 ISP status: host status (%s) scsi status %x\n", + reason[host_status], sts->scsi_status); #endif - LEAVE("qla1280_return_status"); + LEAVE("qla1280_return_status"); - return (sts->scsi_status & 0xff) | (host_status << 16); + return (sts->scsi_status & 0xff) | (host_status << 16); } /* @@ -1903,252 +1946,24 @@ * done_q_first = done queue first pointer. * done_q_last = done queue last pointer. */ -STATIC void -qla1280_done_q_put(srb_t *sp, srb_t **done_q_first, srb_t **done_q_last) -{ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_put_done_q"); -#endif - /* Place block on done queue */ - DRIVER_LOCK - sp->s_next = NULL; - sp->s_prev = *done_q_last; - if (!*done_q_first) - *done_q_first = sp; - else - (*done_q_last)->s_next = sp; - *done_q_last = sp; - - DRIVER_UNLOCK -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_put_done_q"); -#endif -} - -/* - * qla1280_next - * Retrieve and process next job in the queue. - * - * Input: - * ha = adapter block pointer. - * q = SCSI LU pointer. - * b = SCSI bus number. - * SCSI_LU_Q lock must be already obtained and no other locks. - * - * Output: - * Releases SCSI_LU_Q upon exit. - */ -STATIC void -qla1280_next(scsi_qla_host_t *ha, scsi_lu_t *q, uint8_t b) -{ - srb_t *sp; - uint32_t cnt; - uint8_t status; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - - ENTER("qla1280_next"); - - DRIVER_LOCK - while ( ((sp = q->q_first) != NULL) && /* we have a queue pending */ - !(q->q_flag & QLA1280_QBUSY) && /* device not busy */ - !ha->flags.abort_isp_active && /* not resetting the adapter */ - !(q->q_flag & QLA1280_QSUSP) ) /* device not suspended */ - { - /* Remove srb from SCSI LU queue. */ - qla1280_removeq(q, sp); - - DEBUG(sprintf(debug_buff,"starting request 0x%p<-(0x%p)\n\r",q,sp)); - DEBUG(qla1280_print(debug_buff)); - { - /* Set busy flag if reached high water mark. */ - q->q_outcnt++; - if (q->q_outcnt >= ha->bus_settings[b].hiwat) - q->q_flag |= QLA1280_QBUSY; - -#if QLA1280_64BIT_SUPPORT - if (ha->flags.enable_64bit_addressing) - status = qla1280_64bit_start_scsi(ha, sp); - else -#endif - status = qla1280_32bit_start_scsi(ha, sp); - - if (status) /* if couldn't start the request */ - { - if (q->q_outcnt == 1) - { - /* Release SCSI LU queue specific lock */ - QLA1280_SCSILU_UNLOCK(q); - - /* Wait for 30 sec for command to be accepted. */ - for (cnt = 6000000; cnt; cnt--) - { -#if QLA1280_64BIT_SUPPORT - if (ha->flags.enable_64bit_addressing) - status = qla1280_64bit_start_scsi(ha, sp); - else -#endif - status = qla1280_32bit_start_scsi(ha, sp); - - if (!status) - { - break; - } - - /* Go check for pending interrupts. */ - qla1280_poll(ha); - - SYS_DELAY(5); /* 10 */ - } - if (!cnt) - { - /* Set timeout status */ - CMD_RESULT(sp->cmd) = DID_TIME_OUT << 16; - -#if WATCHDOGTIMER - /* Remove command from watchdog queue. */ - if (sp->flags & SRB_WATCHDOG) - qla1280_timeout_remove(ha, sp); -#endif - COMTRACE('M') - CMD_HANDLE(sp->cmd) = (unsigned char *) 0; - - /* Call the mid-level driver interrupt handler */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - sti(); - (*(sp->cmd)->scsi_done)(sp->cmd); - cli(); -#else - (*(sp->cmd)->scsi_done)(sp->cmd); -#endif - - /* Acquire LU queue specific lock */ - QLA1280_SCSILU_LOCK(q); - - if (q->q_outcnt) - q->q_outcnt--; - } - else - /* Acquire LU queue specific lock */ - QLA1280_SCSILU_LOCK(q); - } - else - { /* Place request back on top of device queue. */ - qla1280_putq_t(q, sp); - - if (q->q_outcnt) - q->q_outcnt--; - if (q->q_outcnt < ha->bus_settings[b].hiwat) - q->q_flag &= ~QLA1280_QBUSY; - break; - } - } - } - } - DRIVER_UNLOCK - - /* Release SCSI LU queue specific lock */ - QLA1280_SCSILU_UNLOCK(q); - - LEAVE("qla1280_next"); -} +static void +qla1280_done_q_put(struct srb * sp, struct srb ** done_q_first, + struct srb ** done_q_last) +{ + ENTER("qla1280_put_done_q"); + + /* Place block on done queue */ + sp->s_next = NULL; + sp->s_prev = *done_q_last; + if (!*done_q_first) + *done_q_first = sp; + else + (*done_q_last)->s_next = sp; + *done_q_last = sp; -/* - * qla1280_putq_t - * Add the standard SCB job to the top of standard SCB commands. - * - * Input: - * q = SCSI LU pointer. - * sp = srb pointer. - * SCSI_LU_Q lock must be already obtained. - */ -STATIC void -qla1280_putq_t(scsi_lu_t *q, srb_t *sp) -{ - srb_t *srb_p; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_putq_t"); -#endif - DRIVER_LOCK - DEBUG(sprintf(debug_buff,"Adding to device 0x%p<-(0x%p)\n\r",q,sp)); - DEBUG(qla1280_print(debug_buff)); - sp->s_next = NULL; - if (!q->q_first) /* If queue empty */ - { - sp->s_prev = NULL; - q->q_first = sp; - q->q_last = sp; - } - else - { - srb_p = q->q_first; - while (srb_p ) - srb_p = srb_p->s_next; - - if (srb_p) - { - sp->s_prev = srb_p->s_prev; - if (srb_p->s_prev) - srb_p->s_prev->s_next = sp; - else - q->q_first = sp; - srb_p->s_prev = sp; - sp->s_next = srb_p; - } - else - { - sp->s_prev = q->q_last; - q->q_last->s_next = sp; - q->q_last = sp; - } - } - - DRIVER_UNLOCK -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_putq_t"); -#endif + LEAVE("qla1280_put_done_q"); } -/* - * qla1280_removeq - * Function used to remove a command block from the - * LU queue. - * - * Input: - * q = SCSI LU pointer. - * sp = srb pointer. - * SCSI_LU_Q lock must be already obtained. - */ -STATIC void -qla1280_removeq(scsi_lu_t *q, srb_t *sp) -{ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - DEBUG(sprintf(debug_buff,"Removing from device_q (0x%p)->(0x%p)\n\r",q,sp)); - DEBUG(qla1280_print(debug_buff)); - DRIVER_LOCK - if (sp->s_prev) - { - if ((sp->s_prev->s_next = sp->s_next) != NULL) - sp->s_next->s_prev = sp->s_prev; - else - q->q_last = sp->s_prev; - } - else if (!(q->q_first = sp->s_next)) - q->q_last = NULL; - else - q->q_first->s_prev = NULL; - DRIVER_UNLOCK -} /* * qla1280_mem_alloc @@ -2158,44 +1973,44 @@ * 0 = success. * 1 = failure. */ -STATIC uint8_t -qla1280_mem_alloc(scsi_qla_host_t *ha) +static int +qla1280_mem_alloc(struct scsi_qla_host *ha) { + int status = 1; + dma_addr_t dma_handle; - uint8_t status = 1; - -#ifdef QL_DEBUG_LEVEL_3 ENTER("qla1280_mem_alloc"); -#endif -#ifdef DYNAMIC_MEM_ALLOC - ha->request_ring = qla1280_alloc_phys(REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT, - &ha->request_dma); - if(ha->request_ring) { - ha->response_ring = qla1280_alloc_phys(RESPONSE_ENTRY_SIZE * RESPONSE_ENTRY_CNT, - &ha->response_dma); - if(ha->response_ring) { - status = 0; - } - } -#else - ha->request_ring = &ha->req[0]; - ha->request_dma = VIRT_TO_BUS(&ha->req[0]); - ha->response_ring = &ha->res[0]; - ha->response_dma = VIRT_TO_BUS(&ha->res[0]); + /* get consistent memory allocated for request and response rings */ + ha->request_ring = pci_alloc_consistent(ha->pdev, + ((REQUEST_ENTRY_CNT + 1) * + (sizeof(request_t))), + &dma_handle); + if (!ha->request_ring) + goto error; + ha->request_dma = dma_handle; + ha->response_ring = pci_alloc_consistent(ha->pdev, + ((RESPONSE_ENTRY_CNT + 1) * + (sizeof(struct response))), + &dma_handle); + if (!ha->response_ring) + goto error; + ha->response_dma = dma_handle; status = 0; -#endif + goto finish; - if(status) { -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - qla1280_print("qla1280_mem_alloc: **** FAILED ****\n"); -#endif - } -#ifdef QL_DEBUG_LEVEL_3 - else - LEAVE("qla1280_mem_alloc"); -#endif - return(status); + error: + if (status) + dprintk(2, "qla1280_mem_alloc: **** FAILED ****\n"); + + if (ha->request_ring) + pci_free_consistent(ha->pdev, + ((REQUEST_ENTRY_CNT + 1) * + (sizeof(request_t))), + ha->request_ring, ha->request_dma); + finish: + LEAVE("qla1280_mem_alloc"); + return status; } /* @@ -2205,66 +2020,68 @@ * Input: * ha = adapter block pointer. */ -STATIC void -qla1280_mem_free(scsi_qla_host_t *ha) +static void +qla1280_mem_free(struct scsi_qla_host *ha) { - scsi_lu_t *q; - uint32_t b, t, l; - - ENTER("qlc1280_mem_free"); - if (ha) - { - /* Free device queues. */ - for (b = 0; b < MAX_BUSES; b++) - { - q = LU_Q(ha, b, ha->bus_settings[b].id, 0); - for (t = 0; t < MAX_TARGETS; t++) - for (l = 0; l < MAX_LUNS; l++) - if (LU_Q(ha, b, t, l) != NULL && LU_Q(ha, b, t, l) != q) - KMFREE(LU_Q(ha, b, t, l),sizeof(struct scsi_lu)); - KMFREE(q, sizeof(struct scsi_lu)); - } - for( b =0; b < MAX_EQ; b++ ) - ha->dev[b] = (scsi_lu_t *)NULL; - } + ENTER("qlc1280_mem_free"); + /* free consistent memory allocated for request and response rings */ + if (ha->request_ring) + pci_free_consistent(ha->pdev, + ((REQUEST_ENTRY_CNT + 1) * + (sizeof(request_t))), + ha->request_ring, ha->request_dma); + + if (ha->response_ring) + pci_free_consistent(ha->pdev, + ((RESPONSE_ENTRY_CNT + 1) * + (sizeof(struct response))), + ha->response_ring, ha->response_dma); + + if (qla1280_buffer) { + free_page((unsigned long) qla1280_buffer); + qla1280_buffer = NULL; + } - LEAVE("qlc1280_mem_free"); + LEAVE("qlc1280_mem_free"); } - - - /****************************************************************************/ /* QLogic ISP1280 Hardware Support Functions. */ /****************************************************************************/ /* - * qla2100_enable_intrs - * qla2100_disable_intrs - * - * Input: - * ha = adapter block pointer. - * - * Returns: - * None - */ - static inline void qla1280_enable_intrs(scsi_qla_host_t *ha) { - device_reg_t *reg; - - reg = ha->iobase; - ha->flags.interrupts_on = 1; - /* enable risc and host interrupts */ - WRT_REG_WORD(®->ictrl, (ISP_EN_INT+ ISP_EN_RISC)); - } - - static inline void qla1280_disable_intrs(scsi_qla_host_t *ha) { - device_reg_t *reg; - - reg = ha->iobase; - ha->flags.interrupts_on = 0; - /* disable risc and host interrupts */ - WRT_REG_WORD(®->ictrl, 0); - } + * qla2100_enable_intrs + * qla2100_disable_intrs + * + * Input: + * ha = adapter block pointer. + * + * Returns: + * None + */ +static inline void +qla1280_enable_intrs(struct scsi_qla_host *ha) +{ + struct device_reg *reg; + + reg = ha->iobase; + /* enable risc and host interrupts */ + WRT_REG_WORD(®->ictrl, (ISP_EN_INT | ISP_EN_RISC)); + RD_REG_WORD(®->ictrl); /* PCI Posted Write flush */ + ha->flags.ints_enabled = 1; +} + +static inline void +qla1280_disable_intrs(struct scsi_qla_host *ha) +{ + struct device_reg *reg; + + reg = ha->iobase; + /* disable risc and host interrupts */ + WRT_REG_WORD(®->ictrl, 0); + RD_REG_WORD(®->ictrl); /* PCI Posted Write flush */ + ha->flags.ints_enabled = 0; +} /* * qla1280_initialize_adapter @@ -2276,159 +2093,130 @@ * Returns: * 0 = success */ -STATIC uint8_t -qla1280_initialize_adapter(scsi_qla_host_t *ha) +static int +qla1280_initialize_adapter(struct scsi_qla_host *ha) { - device_reg_t *reg; - uint8_t status; - /* uint8_t cnt; */ - uint8_t b; - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_initialize_adapter"); -#endif - - /* Clear adapter flags. */ - ha->flags.online = FALSE; - ha->flags.isp_abort_needed = FALSE; - ha->flags.disable_host_adapter = FALSE; - ha->flags.reset_active = FALSE; - ha->flags.abort_isp_active = FALSE; - ha->flags.watchdog_enabled = FALSE; - - DEBUG(printk("Configure PCI space for adapter...\n")); - if (!(status = qla1280_pci_config(ha))) - { - reg = ha->iobase; - - /* Disable ISP interrupts. */ - WRT_REG_WORD(®->ictrl, 0); - - /* Insure mailbox registers are free. */ - WRT_REG_WORD(®->semaphore, 0); - WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); - WRT_REG_WORD(®->host_cmd, HC_CLR_HOST_INT); - - /* If firmware needs to be loaded */ - if (qla1280_verbose) - printk("scsi(%d): Determining if RISC is loaded...\n",(int)ha->host_no); - if (qla1280_isp_firmware(ha)) - { - if (qla1280_verbose) - printk("scsi(%d): Verifying chip...\n",(int)ha->host_no); - if (!(status = qla1280_chip_diag(ha))) - { - if (qla1280_verbose) - printk("scsi(%d): Setup chip...\n",(int)ha->host_no); - status = qla1280_setup_chip(ha); - } - } - - if (!status) - { - /* Setup adapter based on NVRAM parameters. */ - if (qla1280_verbose) - printk("scsi(%d): Configure NVRAM parameters...\n",(int)ha->host_no); - qla1280_nvram_config(ha); - - if (!ha->flags.disable_host_adapter && - !qla1280_init_rings(ha)) - { - /* Issue SCSI reset. */ - for (b = 0; b < ha->ports; b++) - if (!ha->bus_settings[b].disable_scsi_reset) - { - /* dg 03/13 if we can't reset twice then bus is dead */ - if( qla1280_bus_reset(ha, b) ) - if( qla1280_bus_reset(ha, b) ) - { - ha->bus_settings[b].scsi_bus_dead = TRUE; - } - } - - do - { - /* Issue marker command. */ - ha->flags.reset_marker = FALSE; - for (b = 0; b < ha->ports; b++) - { - ha->bus_settings[b].reset_marker = FALSE; - qla1280_marker(ha, b, 0, 0, MK_SYNC_ALL); - } - }while (ha->flags.reset_marker); - - ha->flags.online = TRUE; - - /* Enable host adapter target mode. */ - for (b = 0; b < ha->ports; b++) - { - if (!(status = qla1280_enable_tgt(ha, b))) - { - /* for (cnt = 0; cnt < MAX_LUNS; cnt++) - { - qla1280_enable_lun(ha, b, cnt); - qla1280_poll(ha); - }*/ - } - else - break; - } - } - else - status = 1; - } - } - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_initialize_adapter: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - LEAVE("qla1280_initialize_adapter"); + struct device_reg *reg; + int status; + int bus; +#if LINUX_VERSION_CODE > 0x020500 + unsigned long flags; +#endif + + ENTER("qla1280_initialize_adapter"); + + /* Clear adapter flags. */ + ha->flags.online = 0; + ha->flags.disable_host_adapter = 0; + ha->flags.reset_active = 0; + ha->flags.abort_isp_active = 0; + + ha->flags.ints_enabled = 0; +#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2) + if (ia64_platform_is("sn2")) { + int count1, count2; + int c; + + count1 = 3; + count2 = 3; + printk(KERN_INFO "scsi(%li): Enabling SN2 PCI DMA " + "dual channel lockup workaround\n", ha->host_no); + if ((c = snia_pcibr_rrb_alloc(ha->pdev, &count1, &count2)) < 0) + printk(KERN_ERR "scsi(%li): Unable to allocate SN2 " + "virtual DMA channels\n", ha->host_no); + ha->flags.use_pci_vchannel = 1; + + driver_setup.no_nvram = 1; + } #endif - return(status); -} -/* - * qla1280_enable_tgt - * Enable target mode. - * - * Input: - * ha = adapter block pointer. - * b = SCSI bus number. - * - * Returns: - * 0 = success. - */ -STATIC uint8_t -qla1280_enable_tgt(scsi_qla_host_t *ha, uint8_t b) -{ - uint8_t status = 0; - /* uint16_t mb[MAILBOX_REGISTER_COUNT]; */ + dprintk(1, "Configure PCI space for adapter...\n"); + + reg = ha->iobase; + + /* Insure mailbox registers are free. */ + WRT_REG_WORD(®->semaphore, 0); + WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); + WRT_REG_WORD(®->host_cmd, HC_CLR_HOST_INT); + RD_REG_WORD(®->host_cmd); + + if (qla1280_read_nvram(ha)) { + dprintk(2, "qla1280_initialize_adapter: failed to read " + "NVRAM\n"); + } + +#if LINUX_VERSION_CODE >= 0x020500 + /* + * It's necessary to grab the spin here as qla1280_mailbox_command + * needs to be able to drop the lock unconditionally to wait + * for completion. + * In 2.4 ->detect is called with the io_request_lock held. + */ + spin_lock_irqsave(HOST_LOCK, flags); +#endif + /* If firmware needs to be loaded */ + if (qla1280_isp_firmware(ha)) { + if (!(status = qla1280_chip_diag (ha))) { + status = qla1280_setup_chip(ha); + } + } else { + printk(KERN_ERR "scsi(%li): isp_firmware() failed!\n", + ha->host_no); + status = 1; + } + + if (status) { + printk(KERN_ERR "scsi(%li): initialize: pci probe failed!\n", + ha->host_no); + goto out; + } + + /* Setup adapter based on NVRAM parameters. */ + dprintk(1, "scsi(%ld): Configure NVRAM parameters\n", ha->host_no); + qla1280_nvram_config(ha); + + if (!ha->flags.disable_host_adapter && !qla1280_init_rings(ha)) { + /* Issue SCSI reset. */ + /* dg 03/13 if we can't reset twice then bus is dead */ + for (bus = 0; bus < ha->ports; bus++) { + if (!ha->bus_settings[bus].disable_scsi_reset){ + if (qla1280_bus_reset(ha, bus)) { + if (qla1280_bus_reset(ha, bus)) { + ha->bus_settings[bus].scsi_bus_dead = 1; + } + } + } + } -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_enable_tgt: entered\n\r"); + /* + * qla1280_bus_reset() will take care of issueing markers, + * no need to do that here as well! + */ +#if 0 + /* Issue marker command. */ + ha->flags.reset_marker = 0; + for (bus = 0; bus < ha->ports; bus++) { + ha->bus_settings[bus].reset_marker = 0; + qla1280_marker(ha, bus, 0, 0, MK_SYNC_ALL); + } #endif - /* Enable target mode. */ - /* - mb[0] = MBC_ENABLE_TARGET_MODE; - mb[1] = BIT_15; - mb[2] = (uint16_t)(b << 15); - status = qla1280_mailbox_command(ha, BIT_2|BIT_1|BIT_0, &mb[0]); - */ -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_enable_tgt: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_enable_tgt: exiting normally\n\r"); + ha->flags.online = 1; + } else + status = 1; + + out: +#if LINUX_VERSION_CODE >= 0x020500 + spin_unlock_irqrestore(HOST_LOCK, flags); #endif - return(status); + if (status) + dprintk(2, "qla1280_initialize_adapter: **** FAILED ****\n"); + + LEAVE("qla1280_initialize_adapter"); + return status; } + /* * ISP Firmware Test * Checks if present version of RISC firmware is older than @@ -2440,83 +2228,55 @@ * Returns: * 0 = firmware does not need to be loaded. */ -STATIC uint8_t -qla1280_isp_firmware(scsi_qla_host_t *ha) +static int +qla1280_isp_firmware(struct scsi_qla_host *ha) { - nvram_t *nv = (nvram_t *)ha->response_ring; - uint16_t *wptr; - uint8_t chksum; - uint8_t cnt; - uint8_t status = 0; /* dg 2/27 always loads RISC */ - uint16_t mb[MAILBOX_REGISTER_COUNT]; - - ENTER("qla1280_isp_firmware"); - - /* Verify valid NVRAM checksum. */ - wptr = (uint16_t *)ha->response_ring; - DEBUG(printk("qla1280_isp_firmware: Reading NVRAM\n")); - chksum = 0; - for (cnt = 0; cnt < sizeof(nvram_t)/2; cnt++) - { - *wptr = qla1280_get_nvram_word(ha, cnt); - chksum += (uint8_t)*wptr; - chksum += (uint8_t)(*wptr >> 8); - wptr++; - } - DEBUG(printk("qla1280_isp_firmware: Completed Reading NVRAM\n")); - -#if defined(QL_DEBUG_LEVEL_3) - sprintf(debug_buff,"qla1280_isp_firmware: NVRAM Magic ID= %c %c %c\n\r",(char *) nv->id[0],nv->id[1],nv->id[2]); - qla1280_print(debug_buff); -#endif - - /* Bad NVRAM data, load RISC code. */ - if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || - nv->id[2] != 'P' || nv->id[3] != ' ' || nv->version < 1) - { - printk(KERN_INFO "qla1280_isp_firmware: Bad checksum or magic number or version in NVRAM.\n"); - ha->flags.disable_risc_code_load = FALSE; - } - else - ha->flags.disable_risc_code_load = nv->cntr_flags_1.disable_loading_risc_code; - - if (ha->flags.disable_risc_code_load) - { -#if defined(QL_DEBUG_LEVEL_3) - qla1280_print("qla1280_isp_firmware: Telling RISC to verify checksum of loaded BIOS code.\n\r"); -#endif - /* Verify checksum of loaded RISC code. */ - mb[0] = MBC_VERIFY_CHECKSUM; - /* mb[1] = ql12_risc_code_addr01; */ - mb[1] = *QLBoardTbl[ha->devnum].fwstart; - - if (!(status = qla1280_mailbox_command(ha, BIT_1|BIT_0, &mb[0]))) - { - /* Start firmware execution. */ -#if defined(QL_DEBUG_LEVEL_3) - qla1280_print("qla1280_isp_firmware: Startng F/W execution.\n\r"); -#endif - mb[0] = MBC_EXECUTE_FIRMWARE; - /* mb[1] = ql12_risc_code_addr01; */ - mb[1] = *QLBoardTbl[ha->devnum].fwstart; - qla1280_mailbox_command(ha, BIT_1|BIT_0, &mb[0]); - } - else - printk(KERN_INFO "qla1280: RISC checksum failed.\n"); - } - else - { - DEBUG(printk("qla1280: NVRAM configured to load RISC load.\n")); - status = 1; - } - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print( - "qla1280_isp_firmware: **** Load RISC code ****\n\r"); -#endif - LEAVE("qla1280_isp_firmware"); - return(status); + struct nvram *nv = (struct nvram *) ha->response_ring; + int status = 0; /* dg 2/27 always loads RISC */ + uint16_t mb[MAILBOX_REGISTER_COUNT]; + + ENTER("qla1280_isp_firmware"); + + dprintk(1, "scsi(%li): Determining if RISC is loaded\n", ha->host_no); + + /* Bad NVRAM data, load RISC code. */ + if (!ha->nvram_valid) { + ha->flags.disable_risc_code_load = 0; + } else + ha->flags.disable_risc_code_load = + nv->cntr_flags_1.disable_loading_risc_code; + + if (ha->flags.disable_risc_code_load) { + dprintk(3, "qla1280_isp_firmware: Telling RISC to verify " + "checksum of loaded BIOS code.\n"); + + /* Verify checksum of loaded RISC code. */ + mb[0] = MBC_VERIFY_CHECKSUM; + /* mb[1] = ql12_risc_code_addr01; */ + mb[1] = *ql1280_board_tbl[ha->devnum].fwstart; + + if (!(status = + qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]))) { + /* Start firmware execution. */ + dprintk(3, "qla1280_isp_firmware: Startng F/W " + "execution.\n"); + + mb[0] = MBC_EXECUTE_FIRMWARE; + /* mb[1] = ql12_risc_code_addr01; */ + mb[1] = *ql1280_board_tbl[ha->devnum].fwstart; + qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); + } else + printk(KERN_INFO "qla1280: RISC checksum failed.\n"); + } else { + dprintk(1, "qla1280: NVRAM configured to load RISC load.\n"); + status = 1; + } + + if (status) + dprintk(2, "qla1280_isp_firmware: **** Load RISC code ****\n"); + + LEAVE("qla1280_isp_firmware"); + return status; } /* @@ -2529,75 +2289,60 @@ * Returns: * 0 = success. */ -STATIC uint8_t -qla1280_pci_config(scsi_qla_host_t *ha) +static int +qla1280_pci_config(struct scsi_qla_host *ha) { - uint8_t status = 1; - uint32_t command; #if MEMORY_MAPPED_IO - uint32_t page_offset, base; - uint32_t mmapbase; + unsigned long base; + int size; #endif - config_reg_t *creg = 0; - uint16_t buf_wd; + uint16_t buf_wd; + int status = 1; - ENTER("qla1280_pci_config"); + ENTER("qla1280_pci_config"); - /* Get command register. */ - if (pci_read_config_word(ha->pdev,OFFSET(creg->command), &buf_wd) == PCIBIOS_SUCCESSFUL) - { - command = buf_wd; - /* - * Set Bus Master Enable, Memory Address Space Enable and - * reset any error bits. - */ - buf_wd &= ~0x7; + pci_set_master(ha->pdev); + /* + * Set Bus Master Enable, Memory Address Space Enable and + * reset any error bits, in the command register. + */ + pci_read_config_word (ha->pdev, PCI_COMMAND, &buf_wd); #if MEMORY_MAPPED_IO - DEBUG(printk("qla1280: MEMORY MAPPED IO is enabled.\n")); - buf_wd |= BIT_2 + BIT_1 + BIT_0; -#else - buf_wd |= BIT_2 + BIT_0; + buf_wd |= PCI_COMMAND_MEMORY; #endif - if( pci_write_config_word(ha->pdev,OFFSET(creg->command), buf_wd) ) - { - printk(KERN_WARNING "qla1280: Could not write config word.\n"); - } - /* Get expansion ROM address. */ - if (pci_read_config_word(ha->pdev,OFFSET(creg->expansion_rom), &buf_wd) == PCIBIOS_SUCCESSFUL) - { - /* Reset expansion ROM address decode enable. */ - buf_wd &= ~BIT_0; - if (pci_write_config_word(ha->pdev,OFFSET(creg->expansion_rom), buf_wd) == PCIBIOS_SUCCESSFUL) - { + buf_wd |= PCI_COMMAND_IO; + pci_write_config_word (ha->pdev, PCI_COMMAND, buf_wd); + /* + * Reset expansion ROM address decode enable. + */ + pci_read_config_word(ha->pdev, PCI_ROM_ADDRESS, &buf_wd); + buf_wd &= ~PCI_ROM_ADDRESS_ENABLE; + pci_write_config_word (ha->pdev, PCI_ROM_ADDRESS, buf_wd); + + ha->host->io_port = pci_resource_start(ha->pdev, 0); + ha->host->io_port &= PCI_BASE_ADDRESS_IO_MASK; + ha->iobase = (struct device_reg *) ha->host->io_port; + #if MEMORY_MAPPED_IO - /* Get memory mapped I/O address. */ - pci_read_config_dword(ha->pdev,OFFSET(cfgp->mem_base_addr), &mmapbase); - mmapbase &= PCI_BASE_ADDRESS_MEM_MASK; - - /* Find proper memory chunk for memory map I/O reg. */ - base = mmapbase & PAGE_MASK; - page_offset = mmapbase - base; - /* Get virtual address for I/O registers. */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) - ha->mmpbase = ioremap_nocache(base, page_offset + 256); -#else - ha->mmpbase = vremap(base,page_offset + 256); -#endif - if( ha->mmpbase ) - { - ha->mmpbase += page_offset; - /* ha->iobase = ha->mmpbase; */ - status = 0; - } -#else /* MEMORY_MAPPED_IO */ - status = 0; -#endif /* MEMORY_MAPPED_IO */ - } - } - } + /* + * Find proper memory chunk for memory map I/O reg. + */ + base = pci_resource_start(ha->pdev, 1); + size = pci_resource_len(ha->pdev, 1); + /* + * Get virtual address for I/O registers. + */ + ha->mmpbase = ioremap(base, size); + if (ha->mmpbase) { + ha->iobase = (struct device_reg *)ha->mmpbase; + status = 0; + } +#else /* MEMORY_MAPPED_IO */ + status = 0; +#endif /* MEMORY_MAPPED_IO */ - LEAVE("qla1280_pci_config"); - return(status); + LEAVE("qla1280_pci_config"); + return status; } /* @@ -2610,109 +2355,129 @@ * Returns: * 0 = success. */ -STATIC uint8_t -qla1280_chip_diag(scsi_qla_host_t *ha) +static int +qla1280_chip_diag(struct scsi_qla_host *ha) { - device_reg_t *reg = ha->iobase; - uint8_t status = 0; - uint16_t data; - uint32_t cnt; - uint16_t mb[MAILBOX_REGISTER_COUNT]; - -#ifdef QL_DEBUG_LEVEL_3 - sprintf(debug_buff, "qla1280_chip_diag: testing device at 0x%p \n\r",®->id_l); - qla1280_print(debug_buff); -#endif - - /* Soft reset chip and wait for it to finish. */ - WRT_REG_WORD(®->ictrl, ISP_RESET); - data = qla1280_debounce_register(®->ictrl); - for (cnt = 6000000; cnt && data & ISP_RESET; cnt--) - { - SYS_DELAY(5); - data = RD_REG_WORD(®->ictrl); - } - if (cnt) - { - /* Reset register not cleared by chip reset. */ -#if defined(QL_DEBUG_LEVEL_3) - qla1280_print("qla1280_chip_diag: reset register cleared by chip reset\n\r"); -#endif - WRT_REG_WORD(®->cfg_1, 0); - - /* Reset RISC and disable BIOS which - allows RISC to execute out of RAM. */ - WRT_REG_WORD(®->host_cmd, HC_RESET_RISC); - WRT_REG_WORD(®->host_cmd, HC_RELEASE_RISC); - WRT_REG_WORD(®->host_cmd, HC_DISABLE_BIOS); - data = qla1280_debounce_register(®->mailbox0); - for (cnt = 6000000; cnt && data == MBS_BUSY; cnt--) - { - SYS_DELAY(5); - data = RD_REG_WORD(®->mailbox0); - } - - if (cnt) - { - /* Check product ID of chip */ -#if defined(QL_DEBUG_LEVEL_3) - qla1280_print("qla1280_chip_diag: Checking product ID of chip\n\r"); -#endif - if (RD_REG_WORD(®->mailbox1) != PROD_ID_1 || - (RD_REG_WORD(®->mailbox2) != PROD_ID_2 && - RD_REG_WORD(®->mailbox2) != PROD_ID_2a) || - RD_REG_WORD(®->mailbox3) != PROD_ID_3 || - RD_REG_WORD(®->mailbox4) != PROD_ID_4) - { - printk(KERN_INFO "qla1280: Wrong product ID = 0x%x,0x%x,0x%x,0x%x\n", - RD_REG_WORD(®->mailbox1), - RD_REG_WORD(®->mailbox2), - RD_REG_WORD(®->mailbox3), - RD_REG_WORD(®->mailbox4) ); - status = 1; - } - else - { - DEBUG(printk("qla1280_chip_diag: Checking mailboxes of chip\n")); - /* Wrap Incoming Mailboxes Test. */ - mb[0] = MBC_MAILBOX_REGISTER_TEST; - mb[1] = 0xAAAA; - mb[2] = 0x5555; - mb[3] = 0xAA55; - mb[4] = 0x55AA; - mb[5] = 0xA5A5; - mb[6] = 0x5A5A; - mb[7] = 0x2525; - if (!(status = qla1280_mailbox_command(ha, - (BIT_7|BIT_6|BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0), - &mb[0]))) - { - if (mb[1] != 0xAAAA || mb[2] != 0x5555 || - mb[3] != 0xAA55 || mb[4] != 0x55AA) - status = 1; - if (mb[5] != 0xA5A5 || mb[6] != 0x5A5A || - mb[7] != 0x2525) - status = 1; - if( status == 1 ) - printk(KERN_INFO "qla1280: Failed mailbox check\n"); - } - } - } - else - status = 1; - } - else - status = 1; - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_chip_diag: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_chip_diag: exiting normally\n\r"); + uint16_t mb[MAILBOX_REGISTER_COUNT]; + struct device_reg *reg = ha->iobase; + int status = 0; + int cnt; + uint16_t data; + + dprintk(3, "qla1280_chip_diag: testing device at 0x%p \n", ®->id_l); + + dprintk(1, "scsi(%ld): Verifying chip\n", ha->host_no); + + /* Soft reset chip and wait for it to finish. */ + WRT_REG_WORD(®->ictrl, ISP_RESET); + /* + * We can't do a traditional PCI write flush here by reading + * back the register. The card will not respond once the reset + * is in action and we end up with a machine check exception + * instead. Nothing to do but wait and hope for the best. + * A portable pci_write_flush(pdev) call would be very useful here. + */ + udelay(20); + data = qla1280_debounce_register(®->ictrl); + /* + * Yet another QLogic gem ;-( + */ + for (cnt = 1000000; cnt && data & ISP_RESET; cnt--) { + udelay(5); + data = RD_REG_WORD(®->ictrl); + } + + if (cnt) { + /* Reset register cleared by chip reset. */ + dprintk(3, "qla1280_chip_diag: reset register cleared by " + "chip reset\n"); + + WRT_REG_WORD(®->cfg_1, 0); + + /* Reset RISC and disable BIOS which + allows RISC to execute out of RAM. */ +#if 0 + WRT_REG_WORD(®->host_cmd, HC_RESET_RISC); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + WRT_REG_WORD(®->host_cmd, HC_RELEASE_RISC); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + WRT_REG_WORD(®->host_cmd, HC_DISABLE_BIOS); +#else + WRT_REG_WORD(®->host_cmd, HC_RESET_RISC | + HC_RELEASE_RISC | HC_DISABLE_BIOS); #endif - return(status); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + data = qla1280_debounce_register(®->mailbox0); + /* + * I *LOVE* this code! + */ + for (cnt = 1000000; cnt && data == MBS_BUSY; cnt--) { + udelay(5); + data = RD_REG_WORD(®->mailbox0); + } + + if (cnt) { + /* Check product ID of chip */ + dprintk(3, "qla1280_chip_diag: Checking product " + "ID of chip\n"); + + if (RD_REG_WORD(®->mailbox1) != PROD_ID_1 || + (RD_REG_WORD(®->mailbox2) != PROD_ID_2 && + RD_REG_WORD(®->mailbox2) != PROD_ID_2a) || + RD_REG_WORD(®->mailbox3) != PROD_ID_3 || + RD_REG_WORD(®->mailbox4) != PROD_ID_4) { + printk(KERN_INFO "qla1280: Wrong product ID = " + "0x%x,0x%x,0x%x,0x%x\n", + RD_REG_WORD(®->mailbox1), + RD_REG_WORD(®->mailbox2), + RD_REG_WORD(®->mailbox3), + RD_REG_WORD(®->mailbox4)); + status = 1; + } else { + /* + * Enable ints early!!! + */ + qla1280_enable_intrs(ha); + + dprintk(1, "qla1280_chip_diag: Checking " + "mailboxes of chip\n"); + /* Wrap Incoming Mailboxes Test. */ + mb[0] = MBC_MAILBOX_REGISTER_TEST; + mb[1] = 0xAAAA; + mb[2] = 0x5555; + mb[3] = 0xAA55; + mb[4] = 0x55AA; + mb[5] = 0xA5A5; + mb[6] = 0x5A5A; + mb[7] = 0x2525; + if (!(status = qla1280_mailbox_command(ha, + 0xff, + &mb + [0]))) { + if (mb[1] != 0xAAAA || + mb[2] != 0x5555 || + mb[3] != 0xAA55 || + mb[4] != 0x55AA || + mb[5] != 0xA5A5 || + mb[6] != 0x5A5A || + mb[7] != 0x2525) { + status = 1; + printk(KERN_INFO "qla1280: " + "Failed mbox check\n"); + } + } + } + } else + status = 1; + } else + status = 1; + + if (status) + dprintk(2, "qla1280_chip_diag: **** FAILED ****\n"); + else + dprintk(3, "qla1280_chip_diag: exiting normally\n"); + + return status; } /* @@ -2725,173 +2490,142 @@ * Returns: * 0 = success. */ -STATIC uint8_t -qla1280_setup_chip(scsi_qla_host_t *ha) -{ - uint8_t status = 0; - uint16_t risc_address; - uint16_t *risc_code_address; - long risc_code_size; - uint16_t mb[MAILBOX_REGISTER_COUNT]; -#ifdef QLA1280_UNUSED - uint8_t *sp; - int i; -#endif - uint16_t cnt; - int num; - uint8_t *tbuf; - u_long p_tbuf; - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_setup_chip"); -#endif - - if( (tbuf = (uint8_t *)KMALLOC(8000) ) == NULL ) - { - printk("setup_chip: couldn't alloacte memory\n"); - return(1); - } - p_tbuf = VIRT_TO_BUS(tbuf); - /* Load RISC code. */ - /* - risc_address = ql12_risc_code_addr01; - risc_code_address = &ql12_risc_code01[0]; - risc_code_size = ql12_risc_code_length01; - */ - risc_address = *QLBoardTbl[ha->devnum].fwstart; - risc_code_address = QLBoardTbl[ha->devnum].fwcode; - risc_code_size = (long)(*QLBoardTbl[ha->devnum].fwlen & 0xffff); - - DEBUG(printk("qla1280: DMAing RISC code (%d) words.\n",(int)risc_code_size)); - DEBUG(sprintf(debug_buff,"qla1280_setup_chip: Loading RISC code size =(%ld).\n\r",risc_code_size);) - DEBUG(qla1280_print(debug_buff)); - num =0; - while (risc_code_size > 0 && !status) - { - cnt = 2000 >> 1; - - if ( cnt > risc_code_size ) - cnt = risc_code_size; - - DEBUG(sprintf(debug_buff,"qla1280_setup_chip: loading risc @ =(0x%p),%d,%d(0x%x).\n\r",risc_code_address,cnt,num,risc_address);) - DEBUG(qla1280_print(debug_buff)); - DEBUG(printk("qla1280_setup_chip: loading risc @ =code=(0x%p),cnt=%d,seg=%d,addr=0x%x\n\r",risc_code_address,cnt,num,risc_address)); - BCOPY((caddr_t) risc_code_address,(caddr_t) ha->request_ring, (cnt <<1)); - mb[0] = MBC_LOAD_RAM; - /* mb[0] = MBC_LOAD_RAM_A64; */ - mb[1] = risc_address; - mb[4] = cnt; - mb[3] = (uint16_t) ha->request_dma & 0xffff; - mb[2] = (uint16_t) (ha->request_dma >> 16) & 0xffff; - mb[7] = (uint16_t) (MS_64BITS(ha->request_dma) & 0xffff); - mb[6] = (uint16_t) (MS_64BITS(ha->request_dma) >> 16) & 0xffff; - DEBUG(printk("qla1280_setup_chip: op=%d 0x%lx = 0x%4x,0x%4x,0x%4x,0x%4x\n",mb[0],ha->request_dma,mb[6],mb[7],mb[2],mb[3])); - if( (status = qla1280_mailbox_command(ha, BIT_4|BIT_3|BIT_2|BIT_1|BIT_0, - &mb[0])) ) - { - printk("Failed to load partial segment of f/w\n"); - break; - } - /* dump it back */ +#define DUMP_IT_BACK 0 /* for debug of RISC loading */ +static int +qla1280_setup_chip(struct scsi_qla_host *ha) +{ + int status = 0; + uint16_t risc_address; + uint16_t *risc_code_address; + int risc_code_size; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + uint16_t cnt; + int num, i; +#if DUMP_IT_BACK + uint8_t *sp; + uint8_t *tbuf; + dma_addr_t p_tbuf; +#endif + + ENTER("qla1280_setup_chip"); + + dprintk(1, "scsi(%ld): Setup chip\n", ha->host_no); + +#if DUMP_IT_BACK + /* get consistent memory allocated for setup_chip */ + tbuf = pci_alloc_consistent(ha->pdev, 8000, &p_tbuf); +#endif + + /* Load RISC code. */ + risc_address = *ql1280_board_tbl[ha->devnum].fwstart; + risc_code_address = ql1280_board_tbl[ha->devnum].fwcode; + risc_code_size = (int) *ql1280_board_tbl[ha->devnum].fwlen; + + dprintk(1, "qla1280_setup_chip: DMA RISC code (%i) words\n", + risc_code_size); + + num = 0; + while (risc_code_size > 0 && !status) { + int warn __attribute__((unused)) = 0; + + cnt = 2000 >> 1; + + if (cnt > risc_code_size) + cnt = risc_code_size; + + dprintk(2, "qla1280_setup_chip: loading risc @ =(0x%p)," + "%d,%d(0x%x)\n", + risc_code_address, cnt, num, risc_address); + for(i = 0; i < cnt; i++) + ((uint16_t *)ha->request_ring)[i] = + cpu_to_le16(risc_code_address[i]); + + flush_cache_all(); + + mb[0] = MBC_LOAD_RAM; + mb[1] = risc_address; + mb[4] = cnt; + mb[3] = ha->request_dma & 0xffff; + mb[2] = (ha->request_dma >> 16) & 0xffff; + mb[7] = pci_dma_hi32(ha->request_dma) & 0xffff; + mb[6] = pci_dma_hi32(ha->request_dma) >> 16; + dprintk(2, "qla1280_setup_chip: op=%d 0x%p = 0x%4x,0x%4x," + "0x%4x,0x%4x\n", mb[0], (void *)(long)ha->request_dma, + mb[6], mb[7], mb[2], mb[3]); + if ((status = qla1280_mailbox_command(ha, BIT_4 | BIT_3 | + BIT_2 | BIT_1 | BIT_0, + &mb[0]))) { + printk(KERN_ERR "scsi(%li): Failed to load partial " + "segment of f\n", ha->host_no); + break; + } -#if 0 - mb[0] = MBC_DUMP_RAM_A64; - mb[1] = risc_address; - mb[4] = cnt; - mb[3] = (uint16_t) p_tbuf & 0xffff; - mb[2] = (uint16_t) (p_tbuf >> 16) & 0xffff; - mb[7] = (uint16_t) (p_tbuf >> 32) & 0xffff; - mb[6] = (uint16_t) (p_tbuf >> 48) & 0xffff; - - if( (status = qla1280_mailbox_command(ha, BIT_4|BIT_3|BIT_2|BIT_1|BIT_0, - &mb[0])) ) - { - printk("Failed to dump partial segment of f/w\n"); - break; - } - sp = (uint8_t *)ha->request_ring; - for (i = 0; i < (cnt<< 1) ; i++) - { - if( tbuf[i] != sp[i] ) - { - printk("qla1280 : firmware compare error @ byte (0x%x)\n",i); - break; - } - } - -#endif - risc_address += cnt; - risc_code_size = risc_code_size - cnt; - risc_code_address = risc_code_address + cnt; - num++; - } -#ifdef QLA1280_UNUSED - DEBUG(ql_debug_print = 0;) - { - for (i = 0; i < ql12_risc_code_length01; i++) - { - mb[0] = 0x4; - mb[1] = ql12_risc_code_addr01 + i; - mb[2] = ql12_risc_code01[i]; - - status = qla1280_mailbox_command(ha, BIT_2|BIT_1|BIT_0, - &mb[0]); - if (status) - { - printk("qla1280 : firmware load failure\n"); - break; - } - - mb[0] = 0x5; - mb[1] = ql12_risc_code_addr01 + i; - mb[2] = 0; - - status = qla1280_mailbox_command(ha, BIT_2|BIT_1|BIT_0, - &mb[0]); - if (status) - { - printk("qla1280 : firmware dump failure\n"); - break; - } - if( mb[2] != ql12_risc_code01[i] ) - printk("qla1280 : firmware compare error @ (0x%x)\n",ql12_risc_code_addr01+i); - } - } - DEBUG(ql_debug_print = 1;) -#endif - - /* Verify checksum of loaded RISC code. */ - if (!status) - { - DEBUG(printk("qla1280_setup_chip: Verifying checksum of loaded RISC code.\n");) - mb[0] = MBC_VERIFY_CHECKSUM; - /* mb[1] = ql12_risc_code_addr01; */ - mb[1] = *QLBoardTbl[ha->devnum].fwstart; - - if (!(status = qla1280_mailbox_command(ha, BIT_1|BIT_0, &mb[0]))) - { - /* Start firmware execution. */ - DEBUG(qla1280_print("qla1280_setup_chip: start firmware running.\n\r");) - mb[0] = MBC_EXECUTE_FIRMWARE; - /* mb[1] = ql12_risc_code_addr01; */ - mb[1] = *QLBoardTbl[ha->devnum].fwstart; - qla1280_mailbox_command(ha, BIT_1|BIT_0, &mb[0]); - } - else - printk("qla1280_setup_chip: Failed checksum.\n"); - } - - KMFREE(tbuf,8000); - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_setup_chip: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - LEAVE("qla1280_setup_chip"); +#if DUMP_IT_BACK + mb[0] = MBC_DUMP_RAM; + mb[1] = risc_address; + mb[4] = cnt; + mb[3] = p_tbuf & 0xffff; + mb[2] = (p_tbuf >> 16) & 0xffff; + mb[7] = pci_dma_hi32(p_tbuf) & 0xffff; + mb[6] = pci_dma_hi32(p_tbuf) >> 16; + + if ((status = qla1280_mailbox_command(ha, + BIT_4 | BIT_3 | BIT_2 | + BIT_1 | BIT_0, + &mb[0]))) { + printk(KERN_ERR + "Failed to dump partial segment of f/w\n"); + break; + } + sp = (uint8_t *)ha->request_ring; + for (i = 0; i < (cnt << 1); i++) { + if (tbuf[i] != sp[i] && warn++ < 10) { + printk(KERN_ERR "qla1280_setup_chip: FW " + "compare error @ byte(0x%x) loop#=%x\n", + i, num); + printk(KERN_ERR "setup_chip: FWbyte=%x " + "FWfromChip=%x\n", sp[i], tbuf[i]); + /*break; */ + } + } +#endif + risc_address += cnt; + risc_code_size = risc_code_size - cnt; + risc_code_address = risc_code_address + cnt; + num++; + } + + /* Verify checksum of loaded RISC code. */ + if (!status) { + dprintk(1, "qla1280_setup_chip: Verifying checksum of " + "loaded RISC code.\n"); + mb[0] = MBC_VERIFY_CHECKSUM; + /* mb[1] = ql12_risc_code_addr01; */ + mb[1] = *ql1280_board_tbl[ha->devnum].fwstart; + + if (!(status = + qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]))) { + /* Start firmware execution. */ + dprintk(1, + "qla1280_setup_chip: start firmware running.\n"); + mb[0] = MBC_EXECUTE_FIRMWARE; + mb[1] = *ql1280_board_tbl[ha->devnum].fwstart; + qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); + } else + printk(KERN_ERR "scsi(%li): qla1280_setup_chip: " + "Failed checksum\n", ha->host_no); + } + +#if DUMP_IT_BACK + /* free consistent memory allocated for setup_chip */ + pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf); #endif - return(status); + + if (status) + dprintk(2, "qla1280_setup_chip: **** FAILED ****\n"); + + LEAVE("qla1280_setup_chip"); + return status; } /* @@ -2907,61 +2641,54 @@ * Returns: * 0 = success. */ -STATIC uint8_t -qla1280_init_rings(scsi_qla_host_t *ha) +static int +qla1280_init_rings(struct scsi_qla_host *ha) { - uint8_t status = 0; - uint16_t cnt; - uint16_t mb[MAILBOX_REGISTER_COUNT]; - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_init_rings"); -#endif - /* Clear outstanding commands array. */ - for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) - ha->outstanding_cmds[cnt] = 0; - - /* Initialize request queue. */ - ha->request_ring_ptr = ha->request_ring; - ha->req_ring_index = 0; - ha->req_q_cnt = REQUEST_ENTRY_CNT; - /* mb[0] = MBC_INIT_REQUEST_QUEUE; */ - mb[0] = MBC_INIT_REQUEST_QUEUE_A64; - mb[1] = REQUEST_ENTRY_CNT; - mb[3] = (uint16_t)LS_64BITS(ha->request_dma); - mb[2] = (uint16_t)( LS_64BITS(ha->request_dma) >> 16); - mb[4] = 0; - mb[7] = (uint16_t)MS_64BITS(ha->request_dma); - mb[6] = (uint16_t)( MS_64BITS(ha->request_dma) >> 16); - if (!(status = qla1280_mailbox_command(ha, - BIT_7|BIT_6|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0, - &mb[0]))) - { - /* Initialize response queue. */ - ha->response_ring_ptr = ha->response_ring; - ha->rsp_ring_index = 0; - /* mb[0] = MBC_INIT_RESPONSE_QUEUE; */ - mb[0] = MBC_INIT_RESPONSE_QUEUE_A64; - mb[1] = RESPONSE_ENTRY_CNT; - mb[3] = (uint16_t)LS_64BITS(ha->response_dma); - mb[2] = (uint16_t)(LS_64BITS(ha->response_dma) >> 16); - mb[5] = 0; - mb[7] = (uint16_t)MS_64BITS(ha->response_dma); - mb[6] = (uint16_t)(MS_64BITS(ha->response_dma) >> 16); - status = qla1280_mailbox_command(ha, - BIT_7|BIT_6|BIT_5|BIT_3|BIT_2|BIT_1|BIT_0, - &mb[0]); - } - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_init_rings: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - LEAVE("qla1280_init_rings"); -#endif - return(status); + uint16_t mb[MAILBOX_REGISTER_COUNT]; + int status = 0; + + ENTER("qla1280_init_rings"); + + /* Clear outstanding commands array. */ + memset(ha->outstanding_cmds, 0, + sizeof(struct srb *) * MAX_OUTSTANDING_COMMANDS); + + /* Initialize request queue. */ + ha->request_ring_ptr = ha->request_ring; + ha->req_ring_index = 0; + ha->req_q_cnt = REQUEST_ENTRY_CNT; + /* mb[0] = MBC_INIT_REQUEST_QUEUE; */ + mb[0] = MBC_INIT_REQUEST_QUEUE_A64; + mb[1] = REQUEST_ENTRY_CNT; + mb[3] = ha->request_dma & 0xffff; + mb[2] = (ha->request_dma >> 16) & 0xffff; + mb[4] = 0; + mb[7] = pci_dma_hi32(ha->request_dma) & 0xffff; + mb[6] = pci_dma_hi32(ha->request_dma) >> 16; + if (!(status = qla1280_mailbox_command(ha, BIT_7 | BIT_6 | BIT_4 | + BIT_3 | BIT_2 | BIT_1 | BIT_0, + &mb[0]))) { + /* Initialize response queue. */ + ha->response_ring_ptr = ha->response_ring; + ha->rsp_ring_index = 0; + /* mb[0] = MBC_INIT_RESPONSE_QUEUE; */ + mb[0] = MBC_INIT_RESPONSE_QUEUE_A64; + mb[1] = RESPONSE_ENTRY_CNT; + mb[3] = ha->response_dma & 0xffff; + mb[2] = (ha->response_dma >> 16) & 0xffff; + mb[5] = 0; + mb[7] = pci_dma_hi32(ha->response_dma) & 0xffff; + mb[6] = pci_dma_hi32(ha->response_dma) >> 16; + status = qla1280_mailbox_command(ha, BIT_7 | BIT_6 | BIT_5 | + BIT_3 | BIT_2 | BIT_1 | BIT_0, + &mb[0]); + } + + if (status) + dprintk(2, "qla1280_init_rings: **** FAILED ****\n"); + + LEAVE("qla1280_init_rings"); + return status; } /* @@ -2977,322 +2704,366 @@ * Returns: * 0 = success. */ -STATIC uint8_t -qla1280_nvram_config(scsi_qla_host_t *ha) +static int +qla1280_nvram_config(struct scsi_qla_host *ha) { - device_reg_t *reg = ha->iobase; - nvram_t *nv = (nvram_t *)ha->response_ring; - uint8_t status = 0; - uint32_t b, t, l; - uint16_t *wptr; - uint16_t mb[MAILBOX_REGISTER_COUNT]; - uint8_t cnt; - uint8_t chksum; - uint32_t nvsize; - -#if defined(QL_DEBUG_ROUTINES) && !defined(QL_DEBUG_LEVEL_4) - uint8_t saved_print_status = ql_debug_print; -#endif - ENTER("qla1280_nvram_config"); -#if defined(QL_DEBUG_ROUTINES) && !defined(QL_DEBUG_LEVEL_4) - ql_debug_print = FALSE; -#endif - - /* Verify valid NVRAM checksum. */ -#if USE_NVRAM_DEFAULTS - chksum = 1; -#else - wptr = (uint16_t *)ha->response_ring; - chksum = 0; - if( ha->device_id == QLA12160_DEVICE_ID || - ha->device_id == QLA10160_DEVICE_ID ) - nvsize = sizeof(nvram160_t)/2; - else - nvsize = sizeof(nvram_t)/2; - for( cnt = 0; cnt < nvsize; cnt++ ) - { - *wptr = qla1280_get_nvram_word(ha, cnt); - chksum += (uint8_t)*wptr; - chksum += (uint8_t)(*wptr >> 8); - wptr++; - } -#endif - + struct device_reg *reg = ha->iobase; + struct nvram *nv; + int is1x160, status = 0; + int bus, target, lun; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + uint16_t mask; + + ENTER("qla1280_nvram_config"); + + if (ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP12160 || + ha->device_id == PCI_DEVICE_ID_QLOGIC_ISP10160) + is1x160 = 1; + else + is1x160 = 0; - /* Bad NVRAM data, set defaults parameters. */ - if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || - nv->id[2] != 'P' || nv->id[3] != ' ' || nv->version < 1) - { -#if USE_NVRAM_DEFAULTS - DEBUG(printk("Using defaults for NVRAM\n")); + nv = &ha->nvram; + if (!ha->nvram_valid) { + dprintk(1, "Using defaults for NVRAM: \n"); + memset(nv, 0, sizeof(struct nvram)); + + /* nv->cntr_flags_1.disable_loading_risc_code = 1; */ + nv->firmware_feature.f.enable_fast_posting = 1; + nv->firmware_feature.f.disable_synchronous_backoff = 1; + + nv->termination.f.scsi_bus_0_control = 3; + nv->termination.f.scsi_bus_1_control = 3; + nv->termination.f.auto_term_support = 1; + + /* + * Set default FIFO magic - What appropriate values + * would be here is unknown. This is what I have found + * testing with 12160s. + * Now, I would love the magic decoder ring for this one, + * the header file provided by QLogic seems to be bogus + * or incomplete at best. + */ + nv->isp_config.c = 0x44; + + if (is1x160) + nv->isp_parameter = 0x01; + + for (bus = 0; bus < MAX_BUSES; bus++) { + nv->bus[bus].config_1.initiator_id = 7; + nv->bus[bus].bus_reset_delay = 5; + /* 8 = 5.0 clocks */ + nv->bus[bus].config_2.async_data_setup_time = 8; + nv->bus[bus].config_2.req_ack_active_negation = 1; + nv->bus[bus].config_2.data_line_active_negation = 1; + nv->bus[bus].selection_timeout = 250; + nv->bus[bus].max_queue_depth = 256; + + for (target = 0; target < MAX_TARGETS; target++) { + nv->bus[bus].target[target].parameter.f. + renegotiate_on_error = 1; + nv->bus[bus].target[target].parameter.f. + auto_request_sense = 1; + nv->bus[bus].target[target].parameter.f. + tag_queuing = 1; + nv->bus[bus].target[target].parameter.f. + enable_sync = 1; +#if 1 /* Some SCSI Processors do not seem to like this */ + nv->bus[bus].target[target].parameter.f. + enable_wide = 1; +#endif + nv->bus[bus].target[target].parameter.f. + parity_checking = 1; + nv->bus[bus].target[target].parameter.f. + disconnect_allowed = 1; + nv->bus[bus].target[target].execution_throttle= + nv->bus[bus].max_queue_depth - 1; + if (is1x160) { + nv->bus[bus].target[target].flags. + flags1x160.device_enable = 1; + nv->bus[bus].target[target].flags. + flags1x160.sync_offset = 0x0e; + nv->bus[bus].target[target]. + sync_period = 9; + nv->bus[bus].target[target]. + ppr_1x160.flags.enable_ppr = 1; + nv->bus[bus].target[target].ppr_1x160. + flags.ppr_options = 2; + nv->bus[bus].target[target].ppr_1x160. + flags.ppr_bus_width = 1; + } else { + nv->bus[bus].target[target].flags. + flags1x80.device_enable = 1; + nv->bus[bus].target[target].flags. + flags1x80.sync_offset = 0x8; + nv->bus[bus].target[target]. + sync_period = 10; + } + } + } + } else { + /* Always force AUTO sense for LINUX SCSI */ + for (bus = 0; bus < MAX_BUSES; bus++) + for (target = 0; target < MAX_TARGETS; target++) { + nv->bus[bus].target[target].parameter.f. + auto_request_sense = 1; + } + } + dprintk(1, "qla1280 : initiator scsi id bus[0]=%d\n", + nv->bus[0].config_1.initiator_id); + dprintk(1, "qla1280 : initiator scsi id bus[1]=%d\n", + nv->bus[1].config_1.initiator_id); + + dprintk(1, "qla1280 : bus reset delay[0]=%d\n", + nv->bus[0].bus_reset_delay); + dprintk(1, "qla1280 : bus reset delay[1]=%d\n", + nv->bus[1].bus_reset_delay); + + dprintk(1, "qla1280 : retry count[0]=%d\n", nv->bus[0].retry_count); + dprintk(1, "qla1280 : retry delay[0]=%d\n", nv->bus[0].retry_delay); + dprintk(1, "qla1280 : retry count[1]=%d\n", nv->bus[1].retry_count); + dprintk(1, "qla1280 : retry delay[1]=%d\n", nv->bus[1].retry_delay); + + dprintk(1, "qla1280 : async data setup time[0]=%d\n", + nv->bus[0].config_2.async_data_setup_time); + dprintk(1, "qla1280 : async data setup time[1]=%d\n", + nv->bus[1].config_2.async_data_setup_time); + + dprintk(1, "qla1280 : req/ack active negation[0]=%d\n", + nv->bus[0].config_2.req_ack_active_negation); + dprintk(1, "qla1280 : req/ack active negation[1]=%d\n", + nv->bus[1].config_2.req_ack_active_negation); + + dprintk(1, "qla1280 : data line active negation[0]=%d\n", + nv->bus[0].config_2.data_line_active_negation); + dprintk(1, "qla1280 : data line active negation[1]=%d\n", + nv->bus[1].config_2.data_line_active_negation); + + dprintk(1, "qla1280 : disable loading risc code=%d\n", + nv->cntr_flags_1.disable_loading_risc_code); + + dprintk(1, "qla1280 : enable 64bit addressing=%d\n", + nv->cntr_flags_1.enable_64bit_addressing); + + dprintk(1, "qla1280 : selection timeout limit[0]=%d\n", + nv->bus[0].selection_timeout); + dprintk(1, "qla1280 : selection timeout limit[1]=%d\n", + nv->bus[1].selection_timeout); + + dprintk(1, "qla1280 : max queue depth[0]=%d\n", + nv->bus[0].max_queue_depth); + dprintk(1, "qla1280 : max queue depth[1]=%d\n", + nv->bus[1].max_queue_depth); + + /* Disable RISC load of firmware. */ + ha->flags.disable_risc_code_load = + nv->cntr_flags_1.disable_loading_risc_code; + +#ifdef QLA_64BIT_PTR + /* Enable 64bit addressing for OS/System combination supporting it */ + /* actual NVRAM bit is: nv->cntr_flags_1.enable_64bit_addressing */ + /* but we will ignore it and use BITS_PER_LONG macro to setup for */ + /* 64 or 32 bit access of host memory in all x86/ia-64/Alpha systems */ + ha->flags.enable_64bit_addressing = 1; #else - DEBUG(printk("Using defaults for NVRAM: \n")); - DEBUG(printk("checksum=0x%x, Id=%c, version=0x%x\n",chksum,nv->id[0],nv->version)); -#if defined(QL_DEBUG_LEVEL_3) - /* ql_debug_print = 1; - qla1280_dump_buffer((caddr_t)ha->response_ring, REQUEST_ENTRY_SIZE); - ql_debug_print = 0; */ -#endif - wptr = (uint16_t *)ha->response_ring; - for (cnt = 0; cnt < sizeof(nvram_t)/2; cnt++) - *wptr++ = 0; + ha->flags.enable_64bit_addressing = 0; #endif + if (ha->flags.enable_64bit_addressing) { + dprintk(2, "scsi(%li): 64 Bit PCI Addressing Enabled\n", + ha->host_no); - /* nv->cntr_flags_1.disable_loading_risc_code = 1; */ - nv->firmware_feature.w = BIT_0; - nv->termination.f.scsi_bus_0_control = 3; - nv->termination.f.scsi_bus_1_control = 3; - nv->termination.f.auto_term_support = 1; - - for (b = 0; b < MAX_BUSES; b++) - { - nv->bus[b].config_1.initiator_id = 7; - nv->bus[b].bus_reset_delay = 5; - nv->bus[b].config_2.async_data_setup_time = 9; - nv->bus[b].config_2.req_ack_active_negation = 1; - nv->bus[b].config_2.data_line_active_negation = 1; - nv->bus[b].selection_timeout = 250; - nv->bus[b].max_queue_depth = 256; - - for (t = 0; t < MAX_TARGETS; t++) - { - nv->bus[b].target[t].parameter.f.auto_request_sense = 1; - nv->bus[b].target[t].parameter.f.disconnect_allowed = 1; - nv->bus[b].target[t].parameter.f.tag_queuing = 1; - nv->bus[b].target[t].flags.device_enable = 1; - } - } + pci_set_dma_mask(ha->pdev, (dma_addr_t) ~ 0ULL); + } -#if USE_NVRAM_DEFAULTS - status = 0; -#else - status = 1; + /* Set ISP hardware DMA burst */ + mb[0] = nv->isp_config.c; + /* Enable DMA arbitration on dual channel controllers */ + if (ha->ports > 1) + mb[0] |= BIT_13; + WRT_REG_WORD(®->cfg_1, mb[0]); + +#if 1 /* Is this safe? */ + /* Set SCSI termination. */ + WRT_REG_WORD(®->gpio_enable, (BIT_3 + BIT_2 + BIT_1 + BIT_0)); + mb[0] = nv->termination.c & (BIT_3 + BIT_2 + BIT_1 + BIT_0); + WRT_REG_WORD(®->gpio_data, mb[0]); +#endif + + /* ISP parameter word. */ + mb[0] = MBC_SET_SYSTEM_PARAMETER; + mb[1] = nv->isp_parameter; + status |= qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); + +#if 0 + /* clock rate - for qla1240 and older, only */ + mb[0] = MBC_SET_CLOCK_RATE; + mb[1] = 0x50; + status |= qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); +#endif + /* Firmware feature word. */ + mb[0] = MBC_SET_FIRMWARE_FEATURES; + mask = BIT_5 | BIT_1 | BIT_0; + mb[1] = le16_to_cpu(nv->firmware_feature.w) & (mask); +#if defined(CONFIG_IA64_GENERIC) || defined (CONFIG_IA64_SGI_SN2) + if (ia64_platform_is("sn2")) { + printk(KERN_INFO "scsi(%li): Enabling SN2 PCI DMA " + "workaround\n", ha->host_no); + mb[1] |= BIT_9; + } #endif - } - else - { - /* Always force AUTO sense for LINUX SCSI */ - for (b = 0; b < MAX_BUSES; b++) - for (t = 0; t < MAX_TARGETS; t++) - { - nv->bus[b].target[t].parameter.f.auto_request_sense = 1; - } - } -#if DEBUG_PRINT_NVRAM - ql_debug_print = 1; - sprintf(debug_buff,"qla1280 : initiator scsi id bus[0]=%d\n\r", - nv->bus[0].config_1.initiator_id); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : initiator scsi id bus[1]=%d\n\r", - nv->bus[1].config_1.initiator_id); - qla1280_print(debug_buff); - - sprintf(debug_buff,"qla1280 : bus reset delay[0]=%d\n\r", - nv->bus[0].bus_reset_delay); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : bus reset delay[1]=%d\n\r", - nv->bus[1].bus_reset_delay); - qla1280_print(debug_buff); - - sprintf(debug_buff,"qla1280 : retry count[0]=%d\n\r", - nv->bus[0].retry_count); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : retry delay[0]=%d\n\r", - nv->bus[0].retry_delay); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : retry count[1]=%d\n\r", - nv->bus[1].retry_count); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : retry delay[1]=%d\n\r", - nv->bus[1].retry_delay); - qla1280_print(debug_buff); - - sprintf(debug_buff,"qla1280 : async data setup time[0]=%d\n\r", - nv->bus[0].config_2.async_data_setup_time); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : async data setup time[1]=%d\n\r", - nv->bus[1].config_2.async_data_setup_time); - qla1280_print(debug_buff); - - sprintf(debug_buff,"qla1280 : req/ack active negation[0]=%d\n\r", - nv->bus[0].config_2.req_ack_active_negation); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : req/ack active negation[1]=%d\n\r", - nv->bus[1].config_2.req_ack_active_negation); - qla1280_print(debug_buff); - - sprintf(debug_buff,"qla1280 : data line active negation[0]=%d\n\r", - nv->bus[0].config_2.data_line_active_negation); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : data line active negation[1]=%d\n\r", - nv->bus[1].config_2.data_line_active_negation); - qla1280_print(debug_buff); - - - sprintf(debug_buff,"qla1280 : disable loading risc code=%d\n\r", - nv->cntr_flags_1.disable_loading_risc_code); - qla1280_print(debug_buff); - - sprintf(debug_buff,"qla1280 : enable 64bit addressing=%d\n\r", - nv->cntr_flags_1.enable_64bit_addressing); - qla1280_print(debug_buff); - - sprintf(debug_buff,"qla1280 : selection timeout limit[0]=%d\n\r", - nv->bus[0].selection_timeout); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : selection timeout limit[1]=%d\n\r", - nv->bus[1].selection_timeout); - - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : max queue depth[0]=%d\n\r", - nv->bus[0].max_queue_depth); - qla1280_print(debug_buff); - sprintf(debug_buff,"qla1280 : max queue depth[1]=%d\n\r", - nv->bus[1].max_queue_depth); - qla1280_print(debug_buff); -#endif - - DEBUG(ql_debug_print = 0;) - - /* Disable RISC load of firmware. */ - ha->flags.disable_risc_code_load = - nv->cntr_flags_1.disable_loading_risc_code; - /* Enable 64bit addressing. */ - ha->flags.enable_64bit_addressing = - nv->cntr_flags_1.enable_64bit_addressing; - - /* Set ISP hardware DMA burst */ - mb[0] = nv->isp_config.c; - WRT_REG_WORD(®->cfg_1, mb[0]); - - /* Set SCSI termination. */ - WRT_REG_WORD(®->gpio_enable, (BIT_3 + BIT_2 + BIT_1 + BIT_0)); - mb[0] = nv->termination.c & (BIT_3 + BIT_2 + BIT_1 + BIT_0); - WRT_REG_WORD(®->gpio_data, mb[0]); - - /* ISP parameter word. */ - mb[0] = MBC_SET_SYSTEM_PARAMETER; - mb[1] = nv->isp_parameter; - status |= qla1280_mailbox_command(ha, BIT_1|BIT_0, &mb[0]); - - /* Firmware feature word. */ - mb[0] = MBC_SET_FIRMWARE_FEATURES; - mb[1] = nv->firmware_feature.w & (BIT_1|BIT_0); - status |= qla1280_mailbox_command(ha, BIT_1|BIT_0, &mb[0]); - - /* Retry count and delay. */ - mb[0] = MBC_SET_RETRY_COUNT; - mb[1] = nv->bus[0].retry_count; - mb[2] = nv->bus[0].retry_delay; - mb[6] = nv->bus[1].retry_count; - mb[7] = nv->bus[1].retry_delay; - status |= qla1280_mailbox_command(ha, BIT_7|BIT_6|BIT_2|BIT_1|BIT_0, &mb[0]); - - /* ASYNC data setup time. */ - mb[0] = MBC_SET_ASYNC_DATA_SETUP; - mb[1] = nv->bus[0].config_2.async_data_setup_time; - mb[2] = nv->bus[1].config_2.async_data_setup_time; - status |= qla1280_mailbox_command(ha, BIT_2|BIT_1|BIT_0, &mb[0]); - - /* Active negation states. */ - mb[0] = MBC_SET_ACTIVE_NEGATION; - mb[1] = 0; - if (nv->bus[0].config_2.req_ack_active_negation) - mb[1] |= BIT_5; - if (nv->bus[0].config_2.data_line_active_negation) - mb[1] |= BIT_4; - mb[2] = 0; - if (nv->bus[1].config_2.req_ack_active_negation) - mb[2] |= BIT_5; - if (nv->bus[1].config_2.data_line_active_negation) - mb[2] |= BIT_4; - status |= qla1280_mailbox_command(ha, BIT_2|BIT_1|BIT_0, &mb[0]); - - /* Selection timeout. */ - mb[0] = MBC_SET_SELECTION_TIMEOUT; - mb[1] = nv->bus[0].selection_timeout; - mb[2] = nv->bus[1].selection_timeout; - status |= qla1280_mailbox_command(ha, BIT_2|BIT_1|BIT_0, &mb[0]); - - for (b = 0; b < ha->ports; b++) - { - /* SCSI Reset Disable. */ - ha->bus_settings[b].disable_scsi_reset = nv->bus[b].config_1.scsi_reset_disable; - - /* Initiator ID. */ - ha->bus_settings[b].id = nv->bus[b].config_1.initiator_id; - mb[0] = MBC_SET_INITIATOR_ID; - mb[1] = b ? ha->bus_settings[b].id | BIT_7 : ha->bus_settings[b].id; - status |= qla1280_mailbox_command(ha, BIT_1|BIT_0, &mb[0]); - - /* Reset Delay. */ - ha->bus_settings[b].bus_reset_delay = nv->bus[b].bus_reset_delay; - - /* Command queue depth per device. */ - ha->bus_settings[b].hiwat = nv->bus[b].max_queue_depth - 1; - - /* Set target parameters. */ - for (t = 0; t < MAX_TARGETS; t++) - { - if( ha->device_id == QLA12160_DEVICE_ID || - ha->device_id == QLA10160_DEVICE_ID ) - { - status = qla12160_set_target_parameters(ha,b,t,0,(nvram160_t *)nv); - } + status |= qla1280_mailbox_command(ha, mask, &mb[0]); + + /* Retry count and delay. */ + mb[0] = MBC_SET_RETRY_COUNT; + mb[1] = nv->bus[0].retry_count; + mb[2] = nv->bus[0].retry_delay; + mb[6] = nv->bus[1].retry_count; + mb[7] = nv->bus[1].retry_delay; + status |= qla1280_mailbox_command(ha, BIT_7 | BIT_6 | BIT_2 | + BIT_1 | BIT_0, &mb[0]); + + /* ASYNC data setup time. */ + mb[0] = MBC_SET_ASYNC_DATA_SETUP; + mb[1] = nv->bus[0].config_2.async_data_setup_time; + mb[2] = nv->bus[1].config_2.async_data_setup_time; + status |= qla1280_mailbox_command(ha, BIT_2 | BIT_1 | BIT_0, &mb[0]); + + /* Active negation states. */ + mb[0] = MBC_SET_ACTIVE_NEGATION; + mb[1] = 0; + if (nv->bus[0].config_2.req_ack_active_negation) + mb[1] |= BIT_5; + if (nv->bus[0].config_2.data_line_active_negation) + mb[1] |= BIT_4; + mb[2] = 0; + if (nv->bus[1].config_2.req_ack_active_negation) + mb[2] |= BIT_5; + if (nv->bus[1].config_2.data_line_active_negation) + mb[2] |= BIT_4; + status |= qla1280_mailbox_command(ha, BIT_2 | BIT_1 | BIT_0, &mb[0]); + + mb[0] = MBC_SET_DATA_OVERRUN_RECOVERY; + mb[1] = 2; /* Reset SCSI bus and return all outstanding IO */ + status |= qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); + + /* thingy */ + mb[0] = MBC_SET_PCI_CONTROL; + mb[1] = 2; /* Data DMA Channel Burst Enable */ + mb[2] = 2; /* Command DMA Channel Burst Enable */ + status |= qla1280_mailbox_command(ha, BIT_2 | BIT_1 | BIT_0, &mb[0]); + + /* Selection timeout. */ + mb[0] = MBC_SET_SELECTION_TIMEOUT; + mb[1] = nv->bus[0].selection_timeout; + mb[2] = nv->bus[1].selection_timeout; + status |= qla1280_mailbox_command(ha, BIT_2 | BIT_1 | BIT_0, &mb[0]); + + for (bus = 0; bus < ha->ports; bus++) { + /* SCSI Reset Disable. */ + ha->bus_settings[bus].disable_scsi_reset = + nv->bus[bus].config_1.scsi_reset_disable; + + /* Initiator ID. */ + ha->bus_settings[bus].id = nv->bus[bus].config_1.initiator_id; + mb[0] = MBC_SET_INITIATOR_ID; + mb[1] = bus ? ha->bus_settings[bus].id | BIT_7 : + ha->bus_settings[bus].id; + status |= qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); + + /* Reset Delay. */ + ha->bus_settings[bus].bus_reset_delay = + nv->bus[bus].bus_reset_delay; + + /* Command queue depth per device. */ + ha->bus_settings[bus].hiwat = nv->bus[bus].max_queue_depth - 1; + + /* Set target parameters. */ + for (target = 0; target < MAX_TARGETS; target++) { + uint8_t mr = BIT_2 | BIT_1 | BIT_0; + + /* Set Target Parameters. */ + mb[0] = MBC_SET_TARGET_PARAMETERS; + mb[1] = (uint16_t) (bus ? target | BIT_7 : target); + mb[1] <<= 8; + /* + * Do not enable wide, sync, and ppr for the initial + * INQUIRY run. We enable this later if we determine + * the target actually supports it. + */ + nv->bus[bus].target[target].parameter.f. + auto_request_sense = 1; + nv->bus[bus].target[target].parameter.f. + stop_queue_on_check = 0; + + if (is1x160) + nv->bus[bus].target[target].ppr_1x160. + flags.enable_ppr = 0; + /* + * No sync, wide, etc. while probing + */ + mb[2] = (nv->bus[bus].target[target].parameter.c << 8)& + ~(TP_SYNC /*| TP_WIDE | TP_PPR*/); + + if (is1x160) + mb[3] = nv->bus[bus].target[target].flags.flags1x160.sync_offset << 8; else - { - /* Set Target Parameters. */ - mb[0] = MBC_SET_TARGET_PARAMETERS; - mb[1] = (uint16_t)(b ? t | BIT_7 :t); - mb[1] <<= 8; - mb[2] = nv->bus[b].target[t].parameter.c << 8; - mb[2] |= TP_AUTO_REQUEST_SENSE; - mb[2] &= ~TP_STOP_QUEUE; - mb[3] = nv->bus[b].target[t].flags.sync_offset << 8; - mb[3] |= nv->bus[b].target[t].sync_period; - status |= qla1280_mailbox_command(ha, BIT_3|BIT_2|BIT_1|BIT_0, - &mb[0]); - } - - /* Save Tag queuing enable flag. */ - mb[0] = BIT_0 << t; - if (nv->bus[b].target[t].parameter.f.tag_queuing) - ha->bus_settings[b].qtag_enables |= mb[0]; - - /* Save Device enable flag. */ - if (nv->bus[b].target[t].flags.device_enable) - ha->bus_settings[b].device_enables |= mb[0]; - - /* Save LUN disable flag. */ - if (nv->bus[b].target[t].flags.lun_disable) - ha->bus_settings[b].lun_disables |= mb[0]; - - /* Set Device Queue Parameters. */ - for (l = 0; l < MAX_LUNS; l++) - { - mb[0] = MBC_SET_DEVICE_QUEUE; - mb[1] = (uint16_t)(b ? t | BIT_7 :t); - mb[1] = mb[1] << 8 | l; - mb[2] = nv->bus[b].max_queue_depth; - mb[3] = nv->bus[b].target[t].execution_throttle; - status |= qla1280_mailbox_command(ha, BIT_3|BIT_2|BIT_1|BIT_0, - &mb[0]); - } - } - } - DEBUG(ql_debug_print = 0;) - -#if defined(QL_DEBUG_ROUTINES) && !defined(QL_DEBUG_LEVEL_4) - ql_debug_print = saved_print_status; -#endif - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - DEBUG(if (status)) - DEBUG(qla1280_print("qla1280_nvram_config: **** FAILED ****\n\r");) -#endif - LEAVE("qla1280_nvram_config"); - return(status); + mb[3] = nv->bus[bus].target[target].flags.flags1x80.sync_offset << 8; + mb[3] |= nv->bus[bus].target[target].sync_period; + mr |= BIT_3; + + /* + * We don't want to enable ppr etc. before we have + * determined that the target actually supports it + */ +#if 0 + if (is1x160) { + mb[2] |= nv->bus[bus].target[target].ppr_1x160.flags.enable_ppr << 5; + + mb[6] = nv->bus[bus].target[target].ppr_1x160.flags.ppr_options << 8; + mb[6] |= nv->bus[bus].target[target].ppr_1x160.flags.ppr_bus_width; + mr |= BIT_6; + } +#endif + + status = qla1280_mailbox_command(ha, mr, &mb[0]); + + /* Save Tag queuing enable flag. */ + mb[0] = BIT_0 << target; + if (nv->bus[bus].target[target].parameter.f.tag_queuing) + ha->bus_settings[bus].qtag_enables |= mb[0]; + + /* Save Device enable flag. */ + if (is1x160) { + if (nv->bus[bus].target[target].flags.flags1x160.device_enable) + ha->bus_settings[bus].device_enables |= mb[0]; + ha->bus_settings[bus].lun_disables |= 0; + } else { + if (nv->bus[bus].target[target].flags.flags1x80.device_enable) + ha->bus_settings[bus].device_enables |= mb[0]; + /* Save LUN disable flag. */ + if (nv->bus[bus].target[target].flags.flags1x80.lun_disable) + ha->bus_settings[bus].lun_disables |= mb[0]; + } + + + /* Set Device Queue Parameters. */ + for (lun = 0; lun < MAX_LUNS; lun++) { + mb[0] = MBC_SET_DEVICE_QUEUE; + mb[1] = (uint16_t)(bus ? target | BIT_7 : target); + mb[1] = mb[1] << 8 | lun; + mb[2] = nv->bus[bus].max_queue_depth; + mb[3] = nv->bus[bus].target[target].execution_throttle; + status |= qla1280_mailbox_command(ha, 0x0f, + &mb[0]); + } + } + } + + if (status) + dprintk(2, "qla1280_nvram_config: **** FAILED ****\n"); + + LEAVE("qla1280_nvram_config"); + return status; } /* @@ -3307,36 +3078,21 @@ * Returns: * data word. */ -STATIC uint16_t -qla1280_get_nvram_word(scsi_qla_host_t *ha, uint32_t address) +static uint16_t +qla1280_get_nvram_word(struct scsi_qla_host *ha, uint32_t address) { - uint32_t nv_cmd; - uint16_t data; + uint32_t nv_cmd; + uint16_t data; -#ifdef QL_DEBUG_ROUTINES - uint8_t saved_print_status = ql_debug_print; -#endif -#ifdef QL_DEBUG_LEVEL_4 - ENTER("qla1280_get_nvram_word"); -#endif + nv_cmd = address << 16; + nv_cmd |= NV_READ_OP; - nv_cmd = address << 16; - nv_cmd |= NV_READ_OP; + data = le16_to_cpu(qla1280_nvram_request(ha, nv_cmd)); -#ifdef QL_DEBUG_ROUTINES - ql_debug_print = FALSE; -#endif - data = qla1280_nvram_request(ha, nv_cmd); -#ifdef QL_DEBUG_ROUTINES - ql_debug_print = saved_print_status; -#endif + dprintk(8, "qla1280_get_nvram_word: exiting normally NVRAM data = " + "0x%x", data); -#ifdef QL_DEBUG_LEVEL_4 - qla1280_print("qla1280_get_nvram_word: exiting normally NVRAM data = "); - qla1280_output_number((uint32_t)data, 16); - qla1280_print("\n\r"); -#endif - return(data); + return data; } /* @@ -3353,76 +3109,63 @@ * Returns: * data word. */ -STATIC uint16_t -qla1280_nvram_request(scsi_qla_host_t *ha, uint32_t nv_cmd) +static uint16_t +qla1280_nvram_request(struct scsi_qla_host *ha, uint32_t nv_cmd) +{ + struct device_reg *reg = ha->iobase; + int cnt; + uint16_t data = 0; + uint16_t reg_data; + + /* Send command to NVRAM. */ + + nv_cmd <<= 5; + for (cnt = 0; cnt < 11; cnt++) { + if (nv_cmd & BIT_31) + qla1280_nv_write(ha, NV_DATA_OUT); + else + qla1280_nv_write(ha, 0); + nv_cmd <<= 1; + } + + /* Read data from NVRAM. */ + + for (cnt = 0; cnt < 16; cnt++) { + WRT_REG_WORD(®->nvram, (NV_SELECT | NV_CLOCK)); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + NVRAM_DELAY(); + data <<= 1; + reg_data = RD_REG_WORD(®->nvram); + if (reg_data & NV_DATA_IN) + data |= BIT_0; + WRT_REG_WORD(®->nvram, NV_SELECT); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + NVRAM_DELAY(); + } + + /* Deselect chip. */ + + WRT_REG_WORD(®->nvram, NV_DESELECT); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + NVRAM_DELAY(); + + return data; +} + +static void +qla1280_nv_write(struct scsi_qla_host *ha, uint16_t data) { - uint8_t cnt; - device_reg_t *reg = ha->iobase; - uint16_t data = 0; - uint16_t reg_data; - - /* Send command to NVRAM. */ - - nv_cmd <<= 5; - for (cnt = 0; cnt < 11; cnt++) - { - if (nv_cmd & BIT_31) - qla1280_nv_write(ha, NV_DATA_OUT); - else - qla1280_nv_write(ha, 0); - nv_cmd <<= 1; - } - - /* Read data from NVRAM. */ - - for (cnt = 0; cnt < 16; cnt++) - { - WRT_REG_WORD(®->nvram, NV_SELECT+NV_CLOCK); - /* qla1280_nv_delay(ha); */ - NVRAM_DELAY(); - data <<= 1; - reg_data = RD_REG_WORD(®->nvram); - if (reg_data & NV_DATA_IN) - data |= BIT_0; - WRT_REG_WORD(®->nvram, NV_SELECT); - /* qla1280_nv_delay(ha); */ - NVRAM_DELAY(); - } - - /* Deselect chip. */ - - WRT_REG_WORD(®->nvram, NV_DESELECT); - /* qla1280_nv_delay(ha); */ - NVRAM_DELAY(); - - return(data); -} - -STATIC void -qla1280_nv_write(scsi_qla_host_t *ha, uint16_t data) -{ - device_reg_t *reg = ha->iobase; - - WRT_REG_WORD(®->nvram, data | NV_SELECT); - NVRAM_DELAY(); - /* qla1280_nv_delay(ha); */ - WRT_REG_WORD(®->nvram, data | NV_SELECT | NV_CLOCK); - /* qla1280_nv_delay(ha); */ - NVRAM_DELAY(); - WRT_REG_WORD(®->nvram, data | NV_SELECT); - /* qla1280_nv_delay(ha); */ - NVRAM_DELAY(); -} - -STATIC void -qla1280_nv_delay(scsi_qla_host_t *ha) -{ - device_reg_t *reg = ha->iobase; - int cnt = NV_DELAY_COUNT; - uint16_t data = 0; + struct device_reg *reg = ha->iobase; - while (cnt--) - data |= RD_REG_WORD(®->nvram); + WRT_REG_WORD(®->nvram, data | NV_SELECT); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + NVRAM_DELAY(); + WRT_REG_WORD(®->nvram, data | NV_SELECT | NV_CLOCK); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + NVRAM_DELAY(); + WRT_REG_WORD(®->nvram, data | NV_SELECT); + RD_REG_WORD(®->id_l); /* Flush PCI write */ + NVRAM_DELAY(); } /* @@ -3440,112 +3183,108 @@ * Returns: * 0 = success */ -STATIC uint8_t -qla1280_mailbox_command(scsi_qla_host_t *ha, uint8_t mr, uint16_t *mb) +static int +qla1280_mailbox_command(struct scsi_qla_host *ha, uint8_t mr, uint16_t *mb) { - device_reg_t *reg = ha->iobase; - uint8_t status = 0; - uint32_t cnt; - uint16_t *optr, *iptr; - uint16_t data; - srb_t *done_q_first = 0; - srb_t *done_q_last = 0; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_mailbox_command"); -#endif - - /* Acquire interrupt specific lock */ - QLA1280_INTR_LOCK(ha); - DRIVER_LOCK - ha->flags.mbox_busy = TRUE; - - /* Load mailbox registers. */ - optr = (uint16_t *)®->mailbox0; - iptr = mb; - for (cnt = 0; cnt < MAILBOX_REGISTER_COUNT; cnt++) - { - if (mr & BIT_0) - { - WRT_REG_WORD(optr, (*iptr)); - } - - mr >>= 1; - optr++; - iptr++; - } - /* Issue set host interrupt command. */ - ha->flags.mbox_int = FALSE; - WRT_REG_WORD(®->host_cmd, HC_SET_HOST_INT); - data = qla1280_debounce_register(®->istatus); - - /* Wait for 30 seconds for command to finish. */ - for (cnt = 30000000; cnt > 0 && !ha->flags.mbox_int; cnt--) - { - /* Check for pending interrupts. */ - if (data & RISC_INT) - { - qla1280_isr(ha, (srb_t **)&done_q_first, (srb_t **)&done_q_last); - } - SYS_DELAY(1); - data = RD_REG_WORD(®->istatus); - } - - /* Check for mailbox command timeout. */ - if ( !cnt ) - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print( - "qla1280_mailbox_command: **** Command Timeout, mailbox0 = "); - qla1280_output_number((uint32_t)mb[0], 16); - qla1280_print(" ****\n\r"); -#endif - ha->flags.isp_abort_needed = TRUE; - status = 1; - } - else if (ha->mailbox_out[0] != MBS_CMD_CMP) - status = 1; - - /* Load return mailbox registers. */ - optr = mb; - iptr = (uint16_t *)&ha->mailbox_out[0]; - mr = MAILBOX_REGISTER_COUNT; - while (mr--) - *optr++ = *iptr++; - - /* Go check for any response interrupts pending. */ - ha->flags.mbox_busy = FALSE; - qla1280_isr(ha, (srb_t **)&done_q_first, (srb_t **)&done_q_last); - - /* Release interrupt specific lock */ - QLA1280_INTR_UNLOCK(ha); - DRIVER_UNLOCK - - if (ha->flags.isp_abort_needed) - qla1280_abort_isp(ha); - - if (ha->flags.reset_marker) - qla1280_rst_aen(ha); - - if (done_q_first) - qla1280_done(ha, (srb_t **)&done_q_first, (srb_t **)&done_q_last); - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - { - qla1280_print("qla1280_mailbox_command: **** FAILED, mailbox0 = "); - qla1280_output_number((uint32_t)mb[0], 16); - qla1280_print(" ****\n\r"); - } -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - LEAVE("qla1280_mailbox_command"); + struct device_reg *reg = ha->iobase; +#if 0 + struct srb *done_q_first = 0; + struct srb *done_q_last = 0; +#endif + int status = 0; + int cnt; + uint16_t *optr, *iptr; + uint16_t data; + DECLARE_COMPLETION(wait); + struct timer_list timer; + + ENTER("qla1280_mailbox_command"); + + ha->flags.mbox_busy = 1; + + if (ha->mailbox_wait) { + printk(KERN_ERR "Warning mailbox wait already in use!\n"); + } + ha->mailbox_wait = &wait; + + /* + * We really should start out by verifying that the mailbox is + * available before starting sending the command data + */ + /* Load mailbox registers. */ + optr = (uint16_t *) ®->mailbox0; + iptr = mb; + for (cnt = 0; cnt < MAILBOX_REGISTER_COUNT; cnt++) { + if (mr & BIT_0) { + WRT_REG_WORD(optr, (*iptr)); + } + + mr >>= 1; + optr++; + iptr++; + } + + /* Issue set host interrupt command. */ + ha->flags.mbox_busy = 0; + + /* set up a timer just in case we're really jammed */ + init_timer(&timer); + timer.expires = jiffies + 20*HZ; + timer.data = (unsigned long)ha; + timer.function = qla1280_mailbox_timeout; + add_timer(&timer); + + spin_unlock_irq(HOST_LOCK); + WRT_REG_WORD(®->host_cmd, HC_SET_HOST_INT); + data = qla1280_debounce_register(®->istatus); + + wait_for_completion(&wait); + del_timer_sync(&timer); + + spin_lock_irq(HOST_LOCK); + + ha->mailbox_wait = NULL; + + /* Check for mailbox command timeout. */ + if (ha->mailbox_out[0] != MBS_CMD_CMP) { + printk(KERN_WARNING "qla1280_mailbox_command: Command failed, " + "mailbox0 = 0x%04x, mailbox_out0 = 0x%04x, istatus = " + "0x%04x\n", + mb[0], ha->mailbox_out[0], RD_REG_WORD(®->istatus)); + printk(KERN_WARNING "m0 %04x, m1 %04x, m2 %04x, m3 %04x\n", + RD_REG_WORD(®->mailbox0), RD_REG_WORD(®->mailbox1), + RD_REG_WORD(®->mailbox2), RD_REG_WORD(®->mailbox3)); + printk(KERN_WARNING "m4 %04x, m5 %04x, m6 %04x, m7 %04x\n", + RD_REG_WORD(®->mailbox4), RD_REG_WORD(®->mailbox5), + RD_REG_WORD(®->mailbox6), RD_REG_WORD(®->mailbox7)); + status = 1; + } + + /* Load return mailbox registers. */ + optr = mb; + iptr = (uint16_t *) &ha->mailbox_out[0]; + mr = MAILBOX_REGISTER_COUNT; + memcpy(optr, iptr, MAILBOX_REGISTER_COUNT * sizeof(uint16_t)); + +#if 0 + /* Go check for any response interrupts pending. */ + qla1280_isr(ha, &done_q_first, &done_q_last); +#endif + + if (ha->flags.reset_marker) + qla1280_rst_aen(ha); + +#if 0 + if (done_q_first) + qla1280_done (ha, &done_q_first, &done_q_last); #endif - return(status); + + if (status) + dprintk(2, "qla1280_mailbox_command: **** FAILED, mailbox0 = " + "0x%x ****\n", mb[0]); + + LEAVE("qla1280_mailbox_command"); + return status; } /* @@ -3555,43 +3294,30 @@ * Input: * ha = adapter block pointer. */ -STATIC void -qla1280_poll(scsi_qla_host_t *ha) +static void +qla1280_poll(struct scsi_qla_host *ha) { - device_reg_t *reg = ha->iobase; - uint16_t data; - srb_t *done_q_first = 0; - srb_t *done_q_last = 0; - -#ifdef QL_DEBUG_LEVEL_3 - /* ENTER("qla1280_poll"); */ -#endif - - /* Acquire interrupt specific lock */ - QLA1280_INTR_LOCK(ha); - - /* Check for pending interrupts. */ - data = RD_REG_WORD(®->istatus); - if (data & RISC_INT) - qla1280_isr(ha, (srb_t **)&done_q_first, (srb_t **)&done_q_last); - - /* Release interrupt specific lock */ - QLA1280_INTR_UNLOCK(ha); - - if (!ha->flags.mbox_busy) - { - if (ha->flags.isp_abort_needed) - qla1280_abort_isp(ha); - if (ha->flags.reset_marker) - qla1280_rst_aen(ha); - } + struct device_reg *reg = ha->iobase; + uint16_t data; + struct srb *done_q_first = 0; + struct srb *done_q_last = 0; + + /* ENTER("qla1280_poll"); */ + + /* Check for pending interrupts. */ + data = RD_REG_WORD(®->istatus); + if (data & RISC_INT) + qla1280_isr(ha, &done_q_first, &done_q_last); + + if (!ha->flags.mbox_busy) { + if (ha->flags.reset_marker) + qla1280_rst_aen(ha); + } - if (done_q_first) - qla1280_done(ha, (srb_t **)&done_q_first, (srb_t **)&done_q_last); + if (done_q_first) + qla1280_done(ha, &done_q_first, &done_q_last); -#ifdef QL_DEBUG_LEVEL_3 - /* LEAVE("qla1280_poll"); */ -#endif + /* LEAVE("qla1280_poll"); */ } /* @@ -3599,54 +3325,58 @@ * Issue SCSI bus reset. * * Input: - * ha = adapter block pointer. - * b = SCSI bus number. + * ha = adapter block pointer. + * bus = SCSI bus number. * * Returns: * 0 = success */ -STATIC uint8_t -qla1280_bus_reset(scsi_qla_host_t *ha, uint8_t b) +static int +qla1280_bus_reset(struct scsi_qla_host *ha, int bus) { - uint8_t status; - uint16_t mb[MAILBOX_REGISTER_COUNT]; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + uint16_t reset_delay; + int status; + + dprintk(3, "qla1280_bus_reset: entered\n"); + + if (qla1280_verbose) + printk(KERN_INFO "scsi(%li:%i): Resetting SCSI BUS\n", + ha->host_no, bus); + + reset_delay = ha->bus_settings[bus].bus_reset_delay; + mb[0] = MBC_BUS_RESET; + mb[1] = reset_delay; + mb[2] = (uint16_t) bus; + status = qla1280_mailbox_command(ha, BIT_2 | BIT_1 | BIT_0, &mb[0]); + + if (status) { + if (ha->bus_settings[bus].failed_reset_count > 2) + ha->bus_settings[bus].scsi_bus_dead = 1; + ha->bus_settings[bus].failed_reset_count++; + } else { + spin_unlock_irq(HOST_LOCK); + schedule_timeout(reset_delay * HZ); + spin_lock_irq(HOST_LOCK); + + ha->bus_settings[bus].scsi_bus_dead = 0; + ha->bus_settings[bus].failed_reset_count = 0; + ha->bus_settings[bus].reset_marker = 0; + /* Issue marker command. */ + qla1280_marker(ha, bus, 0, 0, MK_SYNC_ALL); + } -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_bus_reset: entered\n\r"); -#endif - if( qla1280_verbose ) - { - printk("scsi(%d): Resetting SCSI BUS (%d)\n",(int)ha->host_no,b); - } - - mb[0] = MBC_BUS_RESET; - mb[1] = ha->bus_settings[b].bus_reset_delay; - mb[2] = (uint16_t)b; - status = qla1280_mailbox_command(ha, BIT_2|BIT_1|BIT_0, &mb[0]); - - if (status) - { - if (ha->bus_settings[b].failed_reset_count > 2) /* dg - 03/13/99 */ - ha->bus_settings[b].scsi_bus_dead = TRUE; - ha->bus_settings[b].failed_reset_count++; - } + /* + * We should probably call qla1280_set_target_parameters() + * here as well for all devices on the bus. + */ + + if (status) + dprintk(2, "qla1280_bus_reset: **** FAILED ****\n"); else - { - QLA1280_DELAY(4); - ha->bus_settings[b].scsi_bus_dead = FALSE; /* dg - 03/13/99 */ - ha->bus_settings[b].failed_reset_count = 0; - /* Issue marker command. */ - qla1280_marker(ha, b, 0, 0, MK_SYNC_ALL); - } -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_bus_reset: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_bus_reset: exiting normally\n\r"); -#endif - return(status); + dprintk(3, "qla1280_bus_reset: exiting normally\n"); + + return status; } /* @@ -3654,40 +3384,34 @@ * Issue bus device reset message to the target. * * Input: - * ha = adapter block pointer. - * b = SCSI BUS number. - * t = SCSI ID. + * ha = adapter block pointer. + * bus = SCSI BUS number. + * target = SCSI ID. * * Returns: * 0 = success */ -STATIC uint8_t -qla1280_device_reset(scsi_qla_host_t *ha, uint8_t b, uint32_t t) +static int +qla1280_device_reset(struct scsi_qla_host *ha, int bus, int target) { - uint8_t status; - uint16_t mb[MAILBOX_REGISTER_COUNT]; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + int status; -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_device_reset"); -#endif + ENTER("qla1280_device_reset"); - mb[0] = MBC_ABORT_TARGET; - mb[1] = (b ? (t | BIT_7) : t) << 8; - mb[2] = 1; - status = qla1280_mailbox_command(ha, BIT_2|BIT_1|BIT_0, &mb[0]); + mb[0] = MBC_ABORT_TARGET; + mb[1] = (bus ? (target | BIT_7) : target) << 8; + mb[2] = 1; + status = qla1280_mailbox_command(ha, BIT_2 | BIT_1 | BIT_0, &mb[0]); - /* Issue marker command. */ - qla1280_marker(ha, b, t, 0, MK_SYNC_ID); + /* Issue marker command. */ + qla1280_marker(ha, bus, target, 0, MK_SYNC_ID); -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_device_reset: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - LEAVE("qla1280_device_reset"); -#endif - return(status); + if (status) + dprintk(2, "qla1280_device_reset: **** FAILED ****\n"); + + LEAVE("qla1280_device_reset"); + return status; } /* @@ -3695,40 +3419,34 @@ * Issue an abort message to the device * * Input: - * ha = adapter block pointer. - * b = SCSI BUS. - * t = SCSI ID. - * l = SCSI LUN. + * ha = adapter block pointer. + * bus = SCSI BUS. + * target = SCSI ID. + * lun = SCSI LUN. * * Returns: * 0 = success */ -STATIC uint8_t -qla1280_abort_device(scsi_qla_host_t *ha, uint8_t b, uint32_t t, uint32_t l) +static int +qla1280_abort_device(struct scsi_qla_host *ha, int bus, int target, int lun) { - uint8_t status; - uint16_t mb[MAILBOX_REGISTER_COUNT]; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + int status; -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_abort_device"); -#endif + ENTER("qla1280_abort_device"); - mb[0] = MBC_ABORT_DEVICE; - mb[1] = (b ? t | BIT_7 : t) << 8 | l; - status = qla1280_mailbox_command(ha, BIT_1|BIT_0, &mb[0]); + mb[0] = MBC_ABORT_DEVICE; + mb[1] = (bus ? target | BIT_7 : target) << 8 | lun; + status = qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]); - /* Issue marker command. */ - qla1280_marker(ha, b, t, l, MK_SYNC_ID_LUN); + /* Issue marker command. */ + qla1280_marker(ha, bus, target, lun, MK_SYNC_ID_LUN); -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_abort_device: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - LEAVE("qla1280_abort_device"); -#endif - return(status); + if (status) + dprintk(2, "qla1280_abort_device: **** FAILED ****\n"); + + LEAVE("qla1280_abort_device"); + return status; } /* @@ -3742,41 +3460,35 @@ * Returns: * 0 = success */ -STATIC uint8_t -qla1280_abort_command(scsi_qla_host_t *ha, srb_t *sp) +static int +qla1280_abort_command(struct scsi_qla_host *ha, struct srb * sp, int handle) { - uint8_t status; - uint16_t mb[MAILBOX_REGISTER_COUNT]; - uint32_t b, t, l; - uint32_t handle; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + unsigned int bus, target, lun; + int status; + + ENTER("qla1280_abort_command"); + + bus = SCSI_BUS_32(sp->cmd); + target = SCSI_TCN_32(sp->cmd); + lun = SCSI_LUN_32(sp->cmd); + + sp->flags |= SRB_ABORT_PENDING; + + mb[0] = MBC_ABORT_COMMAND; + mb[1] = (bus ? target | BIT_7 : target) << 8 | lun; + mb[2] = handle >> 16; + mb[3] = handle & 0xffff; + status = qla1280_mailbox_command(ha, 0x0f, &mb[0]); + + if (status) { + dprintk(2, "qla1280_abort_command: **** FAILED ****\n"); + sp->flags &= ~SRB_ABORT_PENDING; + } -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_abort_command"); -#endif - /* Locate handle number. */ - for (handle = 0; handle < MAX_OUTSTANDING_COMMANDS; handle++) - if (ha->outstanding_cmds[handle] == sp) - break; - - b = SCSI_BUS_32(sp->cmd); - t = SCSI_TCN_32(sp->cmd); - l = SCSI_LUN_32(sp->cmd); - - mb[0] = MBC_ABORT_COMMAND; - mb[1] = (b ? t | BIT_7 : t) << 8 | l; - mb[2] = handle >> 16; - mb[3] = (uint16_t)handle; - status = qla1280_mailbox_command(ha, BIT_3|BIT_2|BIT_1|BIT_0, &mb[0]); - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_abort_command: **** FAILED ****\n\r"); -#endif - sp->flags |= SRB_ABORT_PENDING; - - LEAVE("qla1280_abort_command"); - return(status); + LEAVE("qla1280_abort_command"); + return status; } /* @@ -3786,25 +3498,21 @@ * Input: * ha = adapter block pointer. */ -STATIC void -qla1280_reset_adapter(scsi_qla_host_t *ha) +static void +qla1280_reset_adapter(struct scsi_qla_host *ha) { - device_reg_t *reg = ha->iobase; + struct device_reg *reg = ha->iobase; -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_reset_adapter"); -#endif + ENTER("qla1280_reset_adapter"); - /* Disable ISP chip */ - ha->flags.online = FALSE; - WRT_REG_WORD(®->ictrl, ISP_RESET); - WRT_REG_WORD(®->host_cmd, HC_RESET_RISC); - WRT_REG_WORD(®->host_cmd, HC_RELEASE_RISC); - WRT_REG_WORD(®->host_cmd, HC_DISABLE_BIOS); + /* Disable ISP chip */ + ha->flags.online = 0; + WRT_REG_WORD(®->ictrl, ISP_RESET); + WRT_REG_WORD(®->host_cmd, + HC_RESET_RISC | HC_RELEASE_RISC | HC_DISABLE_BIOS); + RD_REG_WORD(®->id_l); /* Flush PCI write */ -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_reset_adapter"); -#endif + LEAVE("qla1280_reset_adapter"); } /* @@ -3813,38 +3521,34 @@ * * Input: * ha = adapter block pointer. - * b = SCSI BUS number - * t = SCSI ID - * l = SCSI LUN + * bus = SCSI BUS number + * id = SCSI ID + * lun = SCSI LUN * type = marker modifier */ -STATIC void -qla1280_marker(scsi_qla_host_t *ha, uint8_t b, uint32_t t, uint32_t l, uint8_t type) +static void +qla1280_marker(struct scsi_qla_host *ha, int bus, int id, int lun, u8 type) { - mrk_entry_t *pkt; + struct mrk_entry *pkt; -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_marker"); -#endif + ENTER("qla1280_marker"); - /* Get request packet. */ - if ( (pkt = (mrk_entry_t *)qla1280_req_pkt(ha)) ) - { - pkt->entry_type = MARKER_TYPE; - pkt->lun = (uint8_t)l; - pkt->target = (uint8_t)(b ? (t | BIT_7) : t); - pkt->modifier = type; + /* Get request packet. */ + if ((pkt = (struct mrk_entry *) qla1280_req_pkt(ha))) { + pkt->entry_type = MARKER_TYPE; + pkt->lun = (uint8_t) lun; + pkt->target = (uint8_t) (bus ? (id | BIT_7) : id); + pkt->modifier = type; + pkt->entry_status = 0; - /* Issue command to ISP */ - qla1280_isp_cmd(ha); - } + /* Issue command to ISP */ + qla1280_isp_cmd(ha); + } -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_marker"); -#endif + LEAVE("qla1280_marker"); } -#if QLA1280_64BIT_SUPPORT + /* * qla1280_64bit_start_scsi * The start SCSI is responsible for building request packets on @@ -3857,296 +3561,271 @@ * Returns: * 0 = success, was able to issue command. */ -STATIC uint8_t -qla1280_64bit_start_scsi(scsi_qla_host_t *ha, srb_t *sp) +static int +qla1280_64bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) { - device_reg_t *reg = ha->iobase; - uint8_t status = 0; - Scsi_Cmnd *cmd = sp->cmd; - uint32_t cnt; - cmd_a64_entry_t *pkt; - uint16_t req_cnt; - uint16_t seg_cnt; - struct scatterlist *sg = (struct scatterlist *) NULL; - uint32_t *dword_ptr; - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_64bit_start_scsi:"); -#endif - - if( qla1280_check_for_dead_scsi_bus(ha, sp) ) - { - return(0); - } - - /* Calculate number of entries and segments required. */ - seg_cnt = 0; - req_cnt = 1; - if (cmd->use_sg) - { - seg_cnt = cmd->use_sg; - sg = (struct scatterlist *) cmd->request_buffer; - - if (seg_cnt > 2) - { - req_cnt += (uint16_t)(seg_cnt - 2) / 5; - if ((uint16_t)(seg_cnt - 2) % 5) - req_cnt++; - } - } - else if (cmd->request_bufflen) /* If data transfer. */ - { - DEBUG(printk("Single data transfer (0x%x)\n",cmd->request_bufflen)); - seg_cnt = 1; - } - - /* Acquire ring specific lock */ - QLA1280_RING_LOCK(ha); - - if ((uint16_t)(req_cnt + 2) >= ha->req_q_cnt) - { - /* Calculate number of free request entries. */ - cnt = RD_REG_WORD(®->mailbox4); - if (ha->req_ring_index < cnt) - ha->req_q_cnt = cnt - ha->req_ring_index; - else - ha->req_q_cnt = REQUEST_ENTRY_CNT - (ha->req_ring_index - cnt); - } - - /* If room for request in request ring. */ - if ((uint16_t)(req_cnt + 2) < ha->req_q_cnt) - { - /* Check for room in outstanding command list. */ - for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS && - ha->outstanding_cmds[cnt] != 0; cnt++) - ; - - if (cnt < MAX_OUTSTANDING_COMMANDS) - { - ha->outstanding_cmds[cnt] = sp; - ha->req_q_cnt -= req_cnt; - CMD_HANDLE(sp->cmd) = (unsigned char *) (u_long) cnt; - - /* - * Build command packet. - */ - pkt = (cmd_a64_entry_t *)ha->request_ring_ptr; - - pkt->entry_type = COMMAND_A64_TYPE; - pkt->entry_count = (uint8_t)req_cnt; - pkt->sys_define = (uint8_t)ha->req_ring_index; - pkt->handle = (uint32_t)cnt; - - /* Zero out remaining portion of packet. */ - dword_ptr = (uint32_t *)pkt + 2; - for (cnt = 2; cnt < REQUEST_ENTRY_SIZE/4; cnt++) - *dword_ptr++ = 0; - - /* Set ISP command timeout. */ - pkt->timeout = (uint16_t)30; - - /* Set device target ID and LUN */ - pkt->lun = SCSI_LUN_32(cmd); - pkt->target = SCSI_BUS_32(cmd) ? - (SCSI_TCN_32(cmd) | BIT_7) : SCSI_TCN_32(cmd); - - /* Enable simple tag queuing if device supports it. */ - if (cmd->device->tagged_queue ) - pkt->control_flags |= BIT_3; - - /* Load SCSI command packet. */ - pkt->cdb_len = (uint16_t)CMD_CDBLEN(cmd); - BCOPY(&(CMD_CDBP(cmd)), pkt->scsi_cdb, pkt->cdb_len); - DEBUG(printk("Build packet for command[0]=0x%x\n",pkt->scsi_cdb[0])); - - /* - * Load data segments. - */ - if (seg_cnt) /* If data transfer. */ - { - /* Set transfer direction. */ - if ( (cmd->data_cmnd[0] == WRITE_6) ) - pkt->control_flags |= BIT_6; - else - pkt->control_flags |= (BIT_5|BIT_6); - - sp->dir = pkt->control_flags & (BIT_5|BIT_6); - - /* Set total data segment count. */ - pkt->dseg_count = seg_cnt; - - /* Setup packet address segment pointer. */ - dword_ptr = (uint32_t *)&pkt->dseg_0_address; - - if (cmd->use_sg) /* If scatter gather */ - { - /* Load command entry data segments. */ - for (cnt = 0; cnt < 2 && seg_cnt; cnt++, seg_cnt--) - { - DEBUG(sprintf(debug_buff,"SG Segment ap=0x%p, len=0x%x\n\r",sg->address,sg->length)); - DEBUG(qla1280_print(debug_buff)); - *dword_ptr++ = cpu_to_le32(VIRT_TO_BUS_LOW(sg->address)); - *dword_ptr++ = cpu_to_le32(VIRT_TO_BUS_HIGH(sg->address)); - *dword_ptr++ = sg->length; - sg++; - } -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print( - "qla1280_64bit_start_scsi: Scatter/gather command packet data - "); - qla1280_print("b "); - qla1280_output_number((uint32_t)SCSI_BUS_32(cmd), 10); - qla1280_print(" t "); - qla1280_output_number((uint32_t)SCSI_TCN_32(cmd), 10); - qla1280_print(" d "); - qla1280_output_number((uint32_t)SCSI_LUN_32(cmd), 10); - qla1280_print("\n\r"); - qla1280_dump_buffer((caddr_t)pkt, REQUEST_ENTRY_SIZE); -#endif - /* - * Build continuation packets. - */ - while (seg_cnt > 0) - { - /* Adjust ring index. */ - ha->req_ring_index++; - if (ha->req_ring_index == REQUEST_ENTRY_CNT) - { - ha->req_ring_index = 0; - ha->request_ring_ptr = ha->request_ring; - } - else - ha->request_ring_ptr++; - - pkt = (cmd_a64_entry_t *)ha->request_ring_ptr; - - /* Zero out packet. */ - dword_ptr = (uint32_t *)pkt; - for (cnt = 0;cnt < REQUEST_ENTRY_SIZE/4; cnt++) - *dword_ptr++ = 0; - - /* Load packet defaults. */ - ((cont_a64_entry_t *)pkt)->entry_type = - CONTINUE_A64_TYPE; - ((cont_a64_entry_t *)pkt)->entry_count = 1; - ((cont_a64_entry_t *)pkt)->sys_define = (uint8_t) - ha->req_ring_index; - - /* Setup packet address segment pointer. */ - dword_ptr = (uint32_t *) - &((cont_a64_entry_t *)pkt)->dseg_0_address; - - /* Load continuation entry data segments. */ - for (cnt = 0; cnt < 5 && seg_cnt; cnt++, seg_cnt--) - { - *dword_ptr++ = cpu_to_le32(VIRT_TO_BUS_LOW(sg->address)); - *dword_ptr++ = cpu_to_le32(VIRT_TO_BUS_HIGH(sg->address)); - *dword_ptr++ = sg->length; - sg++; - } -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print( - "qla1280_64bit_start_scsi: continuation packet data - c"); - qla1280_print(" b "); - qla1280_output_number((uint32_t)SCSI_BUS_32(cmd), 10); - - qla1280_print(" t "); - qla1280_output_number((uint32_t)SCSI_TCN_32(cmd), 10); - qla1280_print(" d "); - qla1280_output_number((uint32_t)SCSI_LUN_32(cmd), 10); - qla1280_print("\n\r"); - qla1280_dump_buffer((caddr_t)pkt, REQUEST_ENTRY_SIZE); -#endif - } - } - else /* No scatter gather data transfer */ - { - *dword_ptr++ = cpu_to_le32(VIRT_TO_BUS_LOW(cmd->request_buffer)); - *dword_ptr++ = cpu_to_le32(VIRT_TO_BUS_HIGH(cmd->request_buffer)); - *dword_ptr = (uint32_t) cmd->request_bufflen; -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print( - "qla1280_64bit_start_scsi: No scatter/gather command packet data - c"); - qla1280_print(" b "); - qla1280_output_number((uint32_t)SCSI_BUS_32(cmd), 10); - qla1280_print(" t "); - qla1280_output_number((uint32_t)SCSI_TCN_32(cmd), 10); - qla1280_print(" d "); - qla1280_output_number((uint32_t)SCSI_LUN_32(cmd), 10); - qla1280_print("\n\r"); - qla1280_dump_buffer((caddr_t)pkt, REQUEST_ENTRY_SIZE); -#endif - } - } -#ifdef QL_DEBUG_LEVEL_5 - else /* No data transfer */ - { - *dword_ptr++ = (uint32_t) 0; - *dword_ptr++ = (uint32_t) 0; - *dword_ptr = (uint32_t) 0; - qla1280_print( - "qla1280_64bit_start_scsi: No data, command packet data - c"); - qla1280_print(" b "); - qla1280_output_number((uint32_t)SCSI_BUS_32(cmd), 10); - qla1280_print(" t "); - qla1280_output_number((uint32_t)SCSI_TCN_32(cmd), 10); - qla1280_print(" d "); - qla1280_output_number((uint32_t)SCSI_LUN_32(cmd), 10); - qla1280_print("\n\r"); - qla1280_dump_buffer((caddr_t)pkt, REQUEST_ENTRY_SIZE); - } -#endif - /* Adjust ring index. */ - ha->req_ring_index++; - if (ha->req_ring_index == REQUEST_ENTRY_CNT) - { - ha->req_ring_index = 0; - ha->request_ring_ptr = ha->request_ring; - } - else - ha->request_ring_ptr++; - - /* Set chip new ring index. */ - WRT_REG_WORD(®->mailbox4, ha->req_ring_index); - } - else - { - status = 1; -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print( - "qla1280_64bit_start_scsi: NO ROOM IN OUTSTANDING ARRAY\n\r"); - qla1280_print(" req_q_cnt="); - qla1280_output_number((uint32_t)ha->req_q_cnt, 16); -#endif - } - } - else - { - status = 1; -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_64bit_start_scsi: in-ptr="); - qla1280_output_number((uint32_t)ha->req_ring_index, 16); - qla1280_print(" req_q_cnt="); - qla1280_output_number((uint32_t)ha->req_q_cnt, 16); - qla1280_print(" req_cnt="); - qla1280_output_number((uint32_t)req_cnt, 16); - qla1280_print("\n\r"); -#endif - } - - /* Release ring specific lock */ - QLA1280_RING_UNLOCK(ha); - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (status) - qla1280_print("qla1280_64bit_start_scsi: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_64bit_start_scsi: exiting normally\n\r"); -#endif - return(status); + struct device_reg *reg = ha->iobase; + Scsi_Cmnd *cmd = sp->cmd; + cmd_a64_entry_t *pkt; + struct scatterlist *sg = NULL; + u32 *dword_ptr; + dma_addr_t dma_handle; + int status = 0; + int cnt; + int req_cnt; + u16 seg_cnt; + + ENTER("qla1280_64bit_start_scsi:"); + + /* Calculate number of entries and segments required. */ + req_cnt = 1; + if (cmd->use_sg) { + sg = (struct scatterlist *) cmd->request_buffer; + seg_cnt = pci_map_sg(ha->pdev, sg, cmd->use_sg, + scsi_to_pci_dma_dir(cmd->sc_data_direction)); + + if (seg_cnt > 2) { + req_cnt += (seg_cnt - 2) / 5; + if ((seg_cnt - 2) % 5) + req_cnt++; + } + } else if (cmd->request_bufflen) { /* If data transfer. */ + seg_cnt = 1; + } else { + seg_cnt = 0; + } + + if ((req_cnt + 2) >= ha->req_q_cnt) { + /* Calculate number of free request entries. */ + cnt = RD_REG_WORD(®->mailbox4); + if (ha->req_ring_index < cnt) + ha->req_q_cnt = cnt - ha->req_ring_index; + else + ha->req_q_cnt = + REQUEST_ENTRY_CNT - (ha->req_ring_index - cnt); + } + + /* If room for request in request ring. */ + if ((req_cnt + 2) >= ha->req_q_cnt) { + status = 1; + dprintk(2, "qla1280_64bit_start_scsi: in-ptr=0x%x req_q_cnt=" + "0x%xreq_cnt=0x%x", ha->req_ring_index, ha->req_q_cnt, + req_cnt); + goto out; + } + + /* Check for room in outstanding command list. */ + for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS && + ha->outstanding_cmds[cnt] != 0; cnt++); + + if (cnt >= MAX_OUTSTANDING_COMMANDS) { + status = 1; + dprintk(2, "qla1280_64bit_start_scsi: NO ROOM IN " + "OUTSTANDING ARRAY, req_q_cnt=0x%x", ha->req_q_cnt); + goto out; + } + + ha->outstanding_cmds[cnt] = sp; + ha->req_q_cnt -= req_cnt; + CMD_HANDLE(sp->cmd) = (unsigned char *)(unsigned long)(cnt + 1); + + dprintk(2, "64bit_start: cmd=%p sp=%p CDB=%xm, handle %lx\n", cmd, sp, + cmd->cmnd[0], (long)CMD_HANDLE(sp->cmd)); + dprintk(2, " bus %i, target %i, lun %i\n", + SCSI_BUS_32(cmd), SCSI_TCN_32(cmd), SCSI_LUN_32(cmd)); + qla1280_dump_buffer(2, cmd->cmnd, MAX_COMMAND_SIZE); + + /* + * Build command packet. + */ + pkt = (cmd_a64_entry_t *) ha->request_ring_ptr; + + pkt->entry_type = COMMAND_A64_TYPE; + pkt->entry_count = (uint8_t) req_cnt; + pkt->sys_define = (uint8_t) ha->req_ring_index; + pkt->entry_status = 0; + pkt->handle = cpu_to_le32(cnt); + + /* Zero out remaining portion of packet. */ + memset(((char *)pkt + 8), 0, (REQUEST_ENTRY_SIZE - 8)); + + /* Set ISP command timeout. */ + pkt->timeout = cpu_to_le16(30); + + /* Set device target ID and LUN */ + pkt->lun = SCSI_LUN_32(cmd); + pkt->target = SCSI_BUS_32(cmd) ? + (SCSI_TCN_32(cmd) | BIT_7) : SCSI_TCN_32(cmd); + + /* Enable simple tag queuing if device supports it. */ + if (DEV_SIMPLE_TAGS(cmd->device)) + pkt->control_flags |= cpu_to_le16(BIT_3); + + /* Load SCSI command packet. */ + pkt->cdb_len = cpu_to_le16(CMD_CDBLEN(cmd)); + memcpy(pkt->scsi_cdb, &(CMD_CDBP(cmd)), CMD_CDBLEN(cmd)); + /* dprintk(1, "Build packet for command[0]=0x%x\n",pkt->scsi_cdb[0]); */ + + /* Set transfer direction. */ + sp->dir = qla1280_data_direction(cmd); + pkt->control_flags |= cpu_to_le16(sp->dir); + + /* Set total data segment count. */ + pkt->dseg_count = cpu_to_le16(seg_cnt); + + /* + * Load data segments. + */ + if (seg_cnt) { /* If data transfer. */ + /* Setup packet address segment pointer. */ + dword_ptr = (u32 *)&pkt->dseg_0_address; + + if (cmd->use_sg) { /* If scatter gather */ + /* Load command entry data segments. */ + for (cnt = 0; cnt < 2 && seg_cnt; cnt++, seg_cnt--) { + dma_handle = sg_dma_address(sg); +#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2) + if (ha->flags.use_pci_vchannel) + sn_pci_set_vchan(ha->pdev, &dma_handle, + SCSI_BUS_32(cmd)); +#endif + *dword_ptr++ = + cpu_to_le32(pci_dma_lo32(dma_handle)); + *dword_ptr++ = + cpu_to_le32(pci_dma_hi32(dma_handle)); + *dword_ptr++ = cpu_to_le32(sg_dma_len(sg)); + sg++; + dprintk(3, "S/G Segment phys_addr=%x %x, len=0x%x\n", + cpu_to_le32(pci_dma_hi32(dma_handle)), + cpu_to_le32(pci_dma_lo32(dma_handle)), + cpu_to_le32(sg_dma_len(sg))); + } + dprintk(5, "qla1280_64bit_start_scsi: Scatter/gather " + "command packet data - b %i, t %i, l %i \n", + SCSI_BUS_32(cmd), SCSI_TCN_32(cmd), + SCSI_LUN_32(cmd)); + qla1280_dump_buffer(5, (char *)pkt, + REQUEST_ENTRY_SIZE); + + /* + * Build continuation packets. + */ + dprintk(3, "S/G Building Continuation...seg_cnt=0x%x " + "remains\n", seg_cnt); + + while (seg_cnt > 0) { + /* Adjust ring index. */ + ha->req_ring_index++; + if (ha->req_ring_index == REQUEST_ENTRY_CNT) { + ha->req_ring_index = 0; + ha->request_ring_ptr = + ha->request_ring; + } else + ha->request_ring_ptr++; + + pkt = (cmd_a64_entry_t *)ha->request_ring_ptr; + + /* Zero out packet. */ + memset(pkt, 0, REQUEST_ENTRY_SIZE); + + /* Load packet defaults. */ + ((struct cont_a64_entry *) pkt)->entry_type = + CONTINUE_A64_TYPE; + ((struct cont_a64_entry *) pkt)->entry_count = 1; + ((struct cont_a64_entry *) pkt)->sys_define = + (uint8_t)ha->req_ring_index; + /* Setup packet address segment pointer. */ + dword_ptr = + (u32 *)&((struct cont_a64_entry *) pkt)->dseg_0_address; + + /* Load continuation entry data segments. */ + for (cnt = 0; cnt < 5 && seg_cnt; + cnt++, seg_cnt--) { + dma_handle = sg_dma_address(sg); +#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2) + if (ha->flags.use_pci_vchannel) + sn_pci_set_vchan(ha->pdev, &dma_handle, + SCSI_BUS_32(cmd)); +#endif + *dword_ptr++ = + cpu_to_le32(pci_dma_lo32(dma_handle)); + *dword_ptr++ = + cpu_to_le32(pci_dma_hi32(dma_handle)); + *dword_ptr++ = + cpu_to_le32(sg_dma_len(sg)); + dprintk(3, "S/G Segment Cont. phys_addr=%x %x, len=0x%x\n", + cpu_to_le32(pci_dma_hi32(dma_handle)), + cpu_to_le32(pci_dma_lo32(dma_handle)), + cpu_to_le32(sg_dma_len(sg))); + sg++; + } + dprintk(5, "qla1280_64bit_start_scsi: " + "continuation packet data - b %i, t " + "%i, l %i \n", SCSI_BUS_32(cmd), + SCSI_TCN_32(cmd), SCSI_LUN_32(cmd)); + qla1280_dump_buffer(5, (char *)pkt, + REQUEST_ENTRY_SIZE); + } + } else { /* No scatter gather data transfer */ + struct page *page = virt_to_page(cmd->request_buffer); + unsigned long off = (unsigned long)cmd->request_buffer & ~PAGE_MASK; + + dma_handle = pci_map_page(ha->pdev, page, off, + cmd->request_bufflen, + scsi_to_pci_dma_dir(cmd->sc_data_direction)); + + /* save dma_handle for pci_unmap_page */ + sp->saved_dma_handle = dma_handle; +#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2) + if (ha->flags.use_pci_vchannel) + sn_pci_set_vchan(ha->pdev, &dma_handle, + SCSI_BUS_32(cmd)); +#endif + *dword_ptr++ = cpu_to_le32(pci_dma_lo32(dma_handle)); + *dword_ptr++ = cpu_to_le32(pci_dma_hi32(dma_handle)); + *dword_ptr = (uint32_t)cmd->request_bufflen; + + dprintk(5, "qla1280_64bit_start_scsi: No scatter/" + "gather command packet data - b %i, t %i, " + "l %i \n", SCSI_BUS_32(cmd), SCSI_TCN_32(cmd), + SCSI_LUN_32(cmd)); + qla1280_dump_buffer(5, (char *)pkt, + REQUEST_ENTRY_SIZE); + } + } else { /* No data transfer */ + dword_ptr = (uint32_t *)(pkt + 1); + *dword_ptr++ = 0; + *dword_ptr++ = 0; + *dword_ptr = 0; + dprintk(5, "qla1280_64bit_start_scsi: No data, command " + "packet data - b %i, t %i, l %i \n", + SCSI_BUS_32(cmd), SCSI_TCN_32(cmd), SCSI_LUN_32(cmd)); + qla1280_dump_buffer(5, (char *)pkt, REQUEST_ENTRY_SIZE); + } + /* Adjust ring index. */ + ha->req_ring_index++; + if (ha->req_ring_index == REQUEST_ENTRY_CNT) { + ha->req_ring_index = 0; + ha->request_ring_ptr = ha->request_ring; + } else + ha->request_ring_ptr++; + + /* Set chip new ring index. */ + dprintk(2, + "qla1280_64bit_start_scsi: Wakeup RISC for pending command\n"); + sp->flags |= SRB_SENT; + ha->actthreads++; + WRT_REG_WORD(®->mailbox4, ha->req_ring_index); + + out: + if (status) + dprintk(2, "qla1280_64bit_start_scsi: **** FAILED ****\n"); + else + dprintk(3, "qla1280_64bit_start_scsi: exiting normally\n"); + + return status; } -#endif /* QLA1280_64BIT_SUPPORT */ + /* * qla1280_32bit_start_scsi @@ -4155,9 +3834,9 @@ * * The Qlogic firmware interface allows every queue slot to have a SCSI * command and up to 4 scatter/gather (SG) entries. If we need more - * than 4 SG entries, then continuation entries are used that can + * than 4 SG entries, then continuation entries are used that can * hold another 7 entries each. The start routine determines if there - * is eought empty slots then build the combination of requests to + * is eought empty slots then build the combination of requests to * fulfill the OS request. * * Input: @@ -4167,302 +3846,253 @@ * Returns: * 0 = success, was able to issue command. */ -STATIC uint8_t -qla1280_32bit_start_scsi(scsi_qla_host_t *ha, srb_t *sp) +static int +qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) { - device_reg_t *reg = ha->iobase; - uint8_t status = 0; - Scsi_Cmnd *cmd = sp->cmd; - uint32_t cnt; - cmd_entry_t *pkt; - uint16_t req_cnt; - uint16_t seg_cnt; - struct scatterlist *sg = (struct scatterlist *) NULL; - uint8_t *data_ptr; - uint32_t *dword_ptr; - - ENTER("qla1280_32bit_start_scsi"); - - - if( qla1280_check_for_dead_scsi_bus(ha, sp) ) - { - return(0); - } - - /* Calculate number of entries and segments required. */ - req_cnt = 1; - if (cmd->use_sg) - { - /* - * We must build an SG list in adapter format, as the kernel's SG list - * cannot be used directly because of data field size (__alpha__) - * differences and the kernel SG list uses virtual addresses where - * we need physical addresses. - */ - seg_cnt = cmd->use_sg; - sg = (struct scatterlist *) cmd->request_buffer; - /* - * if greater than four sg entries then we need to allocate - * continuation entries - */ - if (seg_cnt > 4) - { - req_cnt += (uint16_t)(seg_cnt - 4) / 7; - if ((uint16_t)(seg_cnt - 4) % 7) - req_cnt++; - } - DEBUG(sprintf(debug_buff,"S/G for data transfer -num segs(%d), req blk cnt(%d)\n\r",seg_cnt,req_cnt)); - DEBUG(qla1280_print(debug_buff)); - } - else if (cmd->request_bufflen) /* If data transfer. */ - { - DEBUG(printk("Single data transfer (0x%x)\n",cmd->request_bufflen)); - seg_cnt = 1; - } - else - { - DEBUG(printk("No data transfer \n")); - seg_cnt = 0; - } - - /* Acquire ring specific lock */ - QLA1280_RING_LOCK(ha); - - if ((uint16_t)(req_cnt + 2) >= ha->req_q_cnt) - { - /* Calculate number of free request entries. */ - cnt = RD_REG_WORD(®->mailbox4); - if (ha->req_ring_index < cnt) - ha->req_q_cnt = cnt - ha->req_ring_index; - else - ha->req_q_cnt = REQUEST_ENTRY_CNT - (ha->req_ring_index - cnt); - } - - DEBUG(sprintf(debug_buff,"Number of free entries = (%d)\n\r",ha->req_q_cnt)); - DEBUG(qla1280_print(debug_buff)); - /* If room for request in request ring. */ - if ((uint16_t)(req_cnt + 2) < ha->req_q_cnt) - { - /* Check for empty slot in outstanding command list. */ - for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS && - (ha->outstanding_cmds[cnt] != 0); cnt++) - ; - - if (cnt < MAX_OUTSTANDING_COMMANDS) - { - CMD_HANDLE(sp->cmd) = (unsigned char *)(unsigned long)cnt; - ha->outstanding_cmds[cnt] = sp; - ha->req_q_cnt -= req_cnt; - - /* - * Build command packet. - */ - pkt = (cmd_entry_t *)ha->request_ring_ptr; - - pkt->entry_type = COMMAND_TYPE; - pkt->entry_count = (uint8_t)req_cnt; - pkt->sys_define = (uint8_t)ha->req_ring_index; - pkt->handle = (uint32_t)cnt; - - /* Zero out remaining portion of packet. */ - dword_ptr = (uint32_t *)pkt + 2; - for (cnt = 2; cnt < REQUEST_ENTRY_SIZE/4; cnt++) - *dword_ptr++ = 0; - - /* Set ISP command timeout. */ - pkt->timeout = (uint16_t)30; - - /* Set device target ID and LUN */ - pkt->lun = SCSI_LUN_32(cmd); - pkt->target = SCSI_BUS_32(cmd) ? - (SCSI_TCN_32(cmd) | BIT_7) : SCSI_TCN_32(cmd); - - /* Enable simple tag queuing if device supports it. */ - if (cmd->device->tagged_queue ) - pkt->control_flags |= BIT_3; - - /* Load SCSI command packet. */ - pkt->cdb_len = (uint16_t)CMD_CDBLEN(cmd); - data_ptr = (uint8_t *) &(CMD_CDBP(cmd)); - for (cnt = 0; cnt < pkt->cdb_len; cnt++) - pkt->scsi_cdb[cnt] = *data_ptr++; - DEBUG(printk("Build packet for command[0]=0x%x\n",pkt->scsi_cdb[0])); - /* - * Load data segments. - */ - if (seg_cnt) - { - DEBUG(printk("loading data segments..\n")); - /* Set transfer direction (READ and WRITE) */ - /* Linux doesn't tell us */ - - /* - * 3/10 dg - Normally, we should need this check with our F/W - * but because of a small issue with it we do. - * - * For block devices, cmd->request.cmd has the operation - * For character devices, this isn't always set properly, so - * we need to check data_cmnd[0]. This catches the conditions - * for st.c, but not sg. Generic commands are pass down to us. - */ - if ( (cmd->data_cmnd[0] == WRITE_6) ) - pkt->control_flags |= BIT_6; - else - pkt->control_flags |= (BIT_5|BIT_6); - - sp->dir = pkt->control_flags & (BIT_5|BIT_6); - - /* Set total data segment count. */ - pkt->dseg_count = seg_cnt; - - /* Setup packet address segment pointer. */ - dword_ptr = (uint32_t *)&pkt->dseg_0_address; - - if (cmd->use_sg) /* If scatter gather */ - { - DEBUG(qla1280_print("Building S/G data segments..\n\r")); - DEBUG(qla1280_dump_buffer((caddr_t)sg, 4*16 )); - /* Load command entry data segments. */ - for (cnt = 0; cnt < 4 && seg_cnt; cnt++, seg_cnt--) - { - *dword_ptr++ = (uint32_t) cpu_to_le32(VIRT_TO_BUS(sg->address)); - *dword_ptr++ = sg->length; - DEBUG(sprintf(debug_buff,"SG Segment ap=0x%p, len=0x%x\n\r",sg->address,sg->length)); - DEBUG(qla1280_print(debug_buff)); - sg++; - } - /* - * Build continuation packets. - */ - while (seg_cnt > 0) - { - /* Adjust ring index. */ - ha->req_ring_index++; - if (ha->req_ring_index == REQUEST_ENTRY_CNT) - { - ha->req_ring_index = 0; - ha->request_ring_ptr = ha->request_ring; - } - else - ha->request_ring_ptr++; - - pkt = (cmd_entry_t *)ha->request_ring_ptr; - - /* Zero out packet. */ - dword_ptr = (uint32_t *)pkt; - for (cnt = 0;cnt < REQUEST_ENTRY_SIZE/4; cnt++) - *dword_ptr++ = 0; - - /* Load packet defaults. */ - ((cont_entry_t *)pkt)->entry_type = - CONTINUE_TYPE; - ((cont_entry_t *)pkt)->entry_count = 1; - - ((cont_entry_t *)pkt)->sys_define = (uint8_t) - ha->req_ring_index; - - /* Setup packet address segment pointer. */ - dword_ptr = (uint32_t *) - &((cont_entry_t *)pkt)->dseg_0_address; - - /* Load continuation entry data segments. */ - for (cnt = 0; cnt < 7 && seg_cnt; cnt++, seg_cnt--) - { - *dword_ptr++ = (u_int) cpu_to_le32(VIRT_TO_BUS(sg->address)); - *dword_ptr++ = sg->length; - sg++; - } -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print( - "qla1280_32bit_start_scsi: continuation packet data - scsi("); - qla1280_output_number((uint32_t)SCSI_BUS_32(cmd), 10); - qla1280_print(":"); - qla1280_output_number((uint32_t)SCSI_TCN_32(cmd), 10); - qla1280_print(":"); - qla1280_output_number((uint32_t)SCSI_LUN_32(cmd), 10); - qla1280_print(")\n\r"); - qla1280_dump_buffer((caddr_t)pkt, REQUEST_ENTRY_SIZE); -#endif - } - } - else /* No scatter gather data transfer */ - { - *dword_ptr++ = (uint32_t) cpu_to_le32(VIRT_TO_BUS(cmd->request_buffer)); - *dword_ptr = (uint32_t) cmd->request_bufflen; - DEBUG(printk("Single Segment ap=0x%p, len=0x%x\n",cmd->request_buffer,cmd->request_bufflen)); - } - } - else /* No data transfer */ - { - *dword_ptr++ = (uint32_t) 0; - *dword_ptr = (uint32_t) 0; -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print( - "qla1280_32bit_start_scsi: No data, command packet data - "); - qla1280_print("\n\r"); - qla1280_dump_buffer((caddr_t)pkt, REQUEST_ENTRY_SIZE); -#endif - } -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print("qla1280_32bit_start_scsi: First IOCB block:\n\r"); - qla1280_dump_buffer((caddr_t)ha->request_ring_ptr, REQUEST_ENTRY_SIZE); -#endif - /* Adjust ring index. */ - ha->req_ring_index++; - if (ha->req_ring_index == REQUEST_ENTRY_CNT) - { - ha->req_ring_index = 0; - ha->request_ring_ptr = ha->request_ring; - } - else - ha->request_ring_ptr++; - - /* Set chip new ring index. */ - DEBUG(qla1280_print("qla1280_32bit_start_scsi: Wakeup RISC for pending command\n\r")); - ha->qthreads--; - sp->u_start = jiffies; - sp->flags |= SRB_SENT; - ha->actthreads++; - /* qla1280_output_number((uint32_t)ha->actthreads++, 16); */ - WRT_REG_WORD(®->mailbox4, ha->req_ring_index); - } - else - { - status = 1; -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print( - "qla1280_32bit_start_scsi: NO ROOM IN OUTSTANDING ARRAY\n\r"); - qla1280_print(" req_q_cnt="); - qla1280_output_number((uint32_t)ha->req_q_cnt, 16); - qla1280_print("\n\r"); -#endif - } - } - else - { - status = 1; -#ifdef QL_DEBUG_LEVEL_2 - /* qla1280_print("qla1280_32bit_start_scsi: in-ptr="); - qla1280_output_number((uint32_t)ha->req_ring_index, 16); - qla1280_print(" req_q_cnt="); - qla1280_output_number((uint32_t)ha->req_q_cnt, 16); - qla1280_print(" req_cnt="); - qla1280_output_number((uint32_t)req_cnt, 16); - qla1280_print("\n\r"); */ -#endif - } - - /* Release ring specific lock */ - QLA1280_RING_UNLOCK(ha); - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - /* if (status) - qla1280_print("qla1280_32bit_start_scsi: **** FAILED ****\n\r"); */ -#endif -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_32bit_start_scsi"); -#endif - return(status); + struct device_reg *reg = ha->iobase; + Scsi_Cmnd *cmd = sp->cmd; + struct cmd_entry *pkt; + struct scatterlist *sg = NULL; + uint32_t *dword_ptr; + int status = 0; + int cnt; + int req_cnt; + uint16_t seg_cnt; + dma_addr_t dma_handle; + + ENTER("qla1280_32bit_start_scsi"); + + dprintk(1, "32bit_start: cmd=%p sp=%p CDB=%x\n", cmd, sp, + cmd->cmnd[0]); + + /* Calculate number of entries and segments required. */ + req_cnt = 1; + if (cmd->use_sg) { + /* + * We must build an SG list in adapter format, as the kernel's + * SG list cannot be used directly because of data field size + * (__alpha__) differences and the kernel SG list uses virtual + * addresses where we need physical addresses. + */ + sg = (struct scatterlist *) cmd->request_buffer; + seg_cnt = pci_map_sg(ha->pdev, sg, cmd->use_sg, + scsi_to_pci_dma_dir(cmd->sc_data_direction)); + + /* + * if greater than four sg entries then we need to allocate + * continuation entries + */ + if (seg_cnt > 4) { + req_cnt += (seg_cnt - 4) / 7; + if ((seg_cnt - 4) % 7) + req_cnt++; + } + dprintk(3, "S/G Transfer cmd=%p seg_cnt=0x%x, req_cnt=%x\n", + cmd, seg_cnt, req_cnt); + } else if (cmd->request_bufflen) { /* If data transfer. */ + dprintk(3, "No S/G transfer t=%x cmd=%p len=%x CDB=%x\n", + SCSI_TCN_32(cmd), cmd, cmd->request_bufflen, + cmd->cmnd[0]); + seg_cnt = 1; + } else { + /* dprintk(1, "No data transfer \n"); */ + seg_cnt = 0; + } + + if ((req_cnt + 2) >= ha->req_q_cnt) { + /* Calculate number of free request entries. */ + cnt = RD_REG_WORD(®->mailbox4); + if (ha->req_ring_index < cnt) + ha->req_q_cnt = cnt - ha->req_ring_index; + else + ha->req_q_cnt = + REQUEST_ENTRY_CNT - (ha->req_ring_index - cnt); + } + + dprintk(3, "Number of free entries=(%d) seg_cnt=0x%x\n", + ha->req_q_cnt, seg_cnt); + /* If room for request in request ring. */ + if ((req_cnt + 2) >= ha->req_q_cnt) { + status = 1; + dprintk(2, "qla1280_32bit_start_scsi: in-ptr=0x%x, " + "req_q_cnt=0x%x, req_cnt=0x%x", ha->req_ring_index, + ha->req_q_cnt, req_cnt); + goto out; + } + + /* Check for empty slot in outstanding command list. */ + for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS && + (ha->outstanding_cmds[cnt] != 0); cnt++) ; + + if (cnt >= MAX_OUTSTANDING_COMMANDS) { + status = 1; + dprintk(2, "qla1280_32bit_start_scsi: NO ROOM IN OUTSTANDING " + "ARRAY, req_q_cnt=0x%x\n", ha->req_q_cnt); + goto out; + } + + CMD_HANDLE(sp->cmd) = (unsigned char *) (unsigned long)(cnt + 1); + ha->outstanding_cmds[cnt] = sp; + ha->req_q_cnt -= req_cnt; + + /* + * Build command packet. + */ + pkt = (struct cmd_entry *) ha->request_ring_ptr; + + pkt->entry_type = COMMAND_TYPE; + pkt->entry_count = (uint8_t) req_cnt; + pkt->sys_define = (uint8_t) ha->req_ring_index; + pkt->entry_status = 0; + pkt->handle = cpu_to_le32(cnt); + + /* Zero out remaining portion of packet. */ + memset(((char *)pkt + 8), 0, (REQUEST_ENTRY_SIZE - 8)); + + /* Set ISP command timeout. */ + pkt->timeout = cpu_to_le16(30); + + /* Set device target ID and LUN */ + pkt->lun = SCSI_LUN_32(cmd); + pkt->target = SCSI_BUS_32(cmd) ? + (SCSI_TCN_32(cmd) | BIT_7) : SCSI_TCN_32(cmd); + + /* Enable simple tag queuing if device supports it. */ + if (DEV_SIMPLE_TAGS(cmd->device)) + pkt->control_flags |= cpu_to_le16(BIT_3); + + /* Load SCSI command packet. */ + pkt->cdb_len = cpu_to_le16(CMD_CDBLEN(cmd)); + memcpy(pkt->scsi_cdb, &(CMD_CDBP(cmd)), CMD_CDBLEN(cmd)); + + /*dprintk(1, "Build packet for command[0]=0x%x\n",pkt->scsi_cdb[0]); */ + /* Set transfer direction. */ + sp->dir = qla1280_data_direction(cmd); + pkt->control_flags |= cpu_to_le16(sp->dir); + + /* Set total data segment count. */ + pkt->dseg_count = cpu_to_le16(seg_cnt); + + /* + * Load data segments. + */ + if (seg_cnt) { + /* Setup packet address segment pointer. */ + dword_ptr = &pkt->dseg_0_address; + + if (cmd->use_sg) { /* If scatter gather */ + dprintk(3, "Building S/G data segments..\n"); + qla1280_dump_buffer(1, (char *)sg, 4 * 16); + + /* Load command entry data segments. */ + for (cnt = 0; cnt < 4 && seg_cnt; cnt++, seg_cnt--) { + *dword_ptr++ = + cpu_to_le32(pci_dma_lo32(sg_dma_address(sg))); + *dword_ptr++ = + cpu_to_le32(sg_dma_len(sg)); + dprintk(3, "S/G Segment phys_addr=0x%lx, len=0x%x\n", + (pci_dma_lo32(sg_dma_address(sg))), + (sg_dma_len(sg))); + sg++; + } + /* + * Build continuation packets. + */ + dprintk(3, "S/G Building Continuation" + "...seg_cnt=0x%x remains\n", seg_cnt); + while (seg_cnt > 0) { + /* Adjust ring index. */ + ha->req_ring_index++; + if (ha->req_ring_index == REQUEST_ENTRY_CNT) { + ha->req_ring_index = 0; + ha->request_ring_ptr = + ha->request_ring; + } else + ha->request_ring_ptr++; + + pkt = (struct cmd_entry *)ha->request_ring_ptr; + + /* Zero out packet. */ + memset(pkt, 0, REQUEST_ENTRY_SIZE); + + /* Load packet defaults. */ + ((struct cont_entry *) pkt)-> + entry_type = CONTINUE_TYPE; + ((struct cont_entry *) pkt)->entry_count = 1; + + ((struct cont_entry *) pkt)->sys_define = + (uint8_t) ha->req_ring_index; + + /* Setup packet address segment pointer. */ + dword_ptr = + &((struct cont_entry *) pkt)->dseg_0_address; + + /* Load continuation entry data segments. */ + for (cnt = 0; cnt < 7 && seg_cnt; + cnt++, seg_cnt--) { + *dword_ptr++ = + cpu_to_le32(pci_dma_lo32(sg_dma_address(sg))); + *dword_ptr++ = + cpu_to_le32(sg_dma_len(sg)); + dprintk(1, + "S/G Segment Cont. phys_addr=0x%x, " + "len=0x%x\n", + cpu_to_le32(pci_dma_lo32(sg_dma_address(sg))), + cpu_to_le32(sg_dma_len(sg))); + sg++; + } + dprintk(5, "qla1280_32bit_start_scsi: " + "continuation packet data - " + "scsi(%i:%i:%i)\n", SCSI_BUS_32(cmd), + SCSI_TCN_32(cmd), SCSI_LUN_32(cmd)); + qla1280_dump_buffer(5, (char *)pkt, + REQUEST_ENTRY_SIZE); + } + } else { /* No S/G data transfer */ + struct page *page = virt_to_page(cmd->request_buffer); + unsigned long off = (unsigned long)cmd->request_buffer & ~PAGE_MASK; + dma_handle = pci_map_page(ha->pdev, page, off, + cmd->request_bufflen, + scsi_to_pci_dma_dir(cmd->sc_data_direction)); + sp->saved_dma_handle = dma_handle; + + *dword_ptr++ = cpu_to_le32(pci_dma_lo32(dma_handle)); + *dword_ptr = cpu_to_le32(cmd->request_bufflen); + } + } else { /* No data transfer at all */ + dword_ptr = (uint32_t *)(pkt + 1); + *dword_ptr++ = 0; + *dword_ptr = 0; + dprintk(5, "qla1280_32bit_start_scsi: No data, command " + "packet data - \n"); + qla1280_dump_buffer(5, (char *)pkt, REQUEST_ENTRY_SIZE); + } + dprintk(5, "qla1280_32bit_start_scsi: First IOCB block:\n"); + qla1280_dump_buffer(5, (char *)ha->request_ring_ptr, + REQUEST_ENTRY_SIZE); + + /* Adjust ring index. */ + ha->req_ring_index++; + if (ha->req_ring_index == REQUEST_ENTRY_CNT) { + ha->req_ring_index = 0; + ha->request_ring_ptr = ha->request_ring; + } else + ha->request_ring_ptr++; + + /* Set chip new ring index. */ + dprintk(2, "qla1280_32bit_start_scsi: Wakeup RISC " + "for pending command\n"); + sp->flags |= SRB_SENT; + ha->actthreads++; + WRT_REG_WORD(®->mailbox4, ha->req_ring_index); + +out: + if (status) + dprintk(2, "qla1280_32bit_start_scsi: **** FAILED ****\n"); + + LEAVE("qla1280_32bit_start_scsi"); + + return status; } /* @@ -4476,405 +4106,140 @@ * Returns: * 0 = failed to get slot. */ -STATIC request_t * -qla1280_req_pkt(scsi_qla_host_t *ha) +static request_t * +qla1280_req_pkt(struct scsi_qla_host *ha) { - device_reg_t *reg = ha->iobase; - request_t *pkt = 0; - uint16_t cnt; - uint32_t *dword_ptr; - uint32_t timer; - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_req_pkt"); -#endif - - /* Wait for 30 seconds for slot. */ - for (timer = 15000000; timer; timer--) - { - /* Acquire ring specific lock */ - QLA1280_RING_LOCK(ha); - - if (ha->req_q_cnt > 0) - { - /* Calculate number of free request entries. */ - cnt = RD_REG_WORD(®->mailbox4); - if (ha->req_ring_index < cnt) - ha->req_q_cnt = cnt - ha->req_ring_index; - else - ha->req_q_cnt = REQUEST_ENTRY_CNT - (ha->req_ring_index - cnt); - } - - /* Found empty request ring slot? */ - if (ha->req_q_cnt > 0) - { - ha->req_q_cnt--; - pkt = ha->request_ring_ptr; - - /* Zero out packet. */ - dword_ptr = (uint32_t *)pkt; - for (cnt = 0; cnt < REQUEST_ENTRY_SIZE/4; cnt++) - *dword_ptr++ = 0; - - /* Set system defined field. */ - pkt->sys_define = (uint8_t)ha->req_ring_index; - - /* Set entry count. */ - pkt->entry_count = 1; - - break; - } - - /* Release ring specific lock */ - QLA1280_RING_UNLOCK(ha); - - SYS_DELAY(2); /* 10 */ - - /* Check for pending interrupts. */ - qla1280_poll(ha); - } - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (!pkt) - qla1280_print("qla1280_req_pkt: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_req_pkt: exiting normally\n\r"); -#endif - return(pkt); -} - -/* - * qla1280_isp_cmd - * Function is responsible for modifying ISP input pointer. - * Releases ring lock. - * - * Input: - * ha = adapter block pointer. - */ -STATIC void -qla1280_isp_cmd(scsi_qla_host_t *ha) -{ - device_reg_t *reg = ha->iobase; - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_isp_cmd"); -#endif - -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print("qla1280_isp_cmd: IOCB data:\n\r"); - qla1280_dump_buffer((caddr_t)ha->request_ring_ptr, REQUEST_ENTRY_SIZE); -#endif - - /* Adjust ring index. */ - ha->req_ring_index++; - if (ha->req_ring_index == REQUEST_ENTRY_CNT) - { - ha->req_ring_index = 0; - ha->request_ring_ptr = ha->request_ring; - } - else - ha->request_ring_ptr++; - - /* Set chip new ring index. */ - WRT_REG_WORD(®->mailbox4, ha->req_ring_index); + struct device_reg *reg = ha->iobase; + request_t *pkt = 0; + int cnt; + uint32_t timer; + + ENTER("qla1280_req_pkt"); + + /* + * This can be called from interrupt context, damn it!!! + */ + /* Wait for 30 seconds for slot. */ + for (timer = 15000000; timer; timer--) { + if (ha->req_q_cnt > 0) { + /* Calculate number of free request entries. */ + cnt = RD_REG_WORD(®->mailbox4); + if (ha->req_ring_index < cnt) + ha->req_q_cnt = cnt - ha->req_ring_index; + else + ha->req_q_cnt = + REQUEST_ENTRY_CNT - (ha->req_ring_index - cnt); + } - /* Release ring specific lock */ - QLA1280_RING_UNLOCK(ha); + /* Found empty request ring slot? */ + if (ha->req_q_cnt > 0) { + ha->req_q_cnt--; + pkt = ha->request_ring_ptr; + + /* Zero out packet. */ + memset(pkt, 0, REQUEST_ENTRY_SIZE); + + /* + * How can this be right when we have a ring + * size of 512??? + */ + /* Set system defined field. */ + pkt->sys_define = (uint8_t) ha->req_ring_index; -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_isp_cmd"); -#endif -} + /* Set entry count. */ + pkt->entry_count = 1; -/* - * qla1280_enable_lun - * Issue enable LUN entry IOCB. - * - * Input: - * ha = adapter block pointer. - * b = SCSI BUS number. - * l = LUN number. - */ -STATIC void -qla1280_enable_lun(scsi_qla_host_t *ha, uint8_t b, uint32_t l) -{ - elun_entry_t *pkt; + break; + } -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_enable_lun: entered\n\r"); -#endif + udelay(2); /* 10 */ - /* Get request packet. */ - /* - if (pkt = (elun_entry_t *)qla1280_req_pkt(ha)) - { - pkt->entry_type = ENABLE_LUN_TYPE; - pkt->lun = (uint16_t)(b ? l | BIT_15 : l); - pkt->command_count = 32; - pkt->immed_notify_count = 1; - pkt->group_6_length = MAX_CMDSZ; - pkt->group_7_length = MAX_CMDSZ; - pkt->timeout = 0x30; + /* Check for pending interrupts. */ + qla1280_poll(ha); + } - qla1280_isp_cmd(ha); - } - */ - pkt = (elun_entry_t *)1; + if (!pkt) + dprintk(2, "qla1280_req_pkt: **** FAILED ****\n"); + else + dprintk(3, "qla1280_req_pkt: exiting normally\n"); -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (!pkt) - qla1280_print("qla1280_enable_lun: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_enable_lun: exiting normally\n\r"); -#endif + return pkt; } -#if QL1280_TARGET_MODE_SUPPORT -/****************************************************************************/ -/* Target Mode Support Functions. */ -/****************************************************************************/ - /* - * qla1280_notify_ack - * Issue notify acknowledge IOCB. - * If sequence ID is zero, acknowledgement of - * SCSI bus reset or bus device reset is assumed. + * qla1280_isp_cmd + * Function is responsible for modifying ISP input pointer. + * Releases ring lock. * * Input: - * ha = adapter block pointer. - * inotify = immediate notify entry pointer. + * ha = adapter block pointer. */ -STATIC void -qla1280_notify_ack(scsi_qla_host_t *ha, notify_entry_t *inotify) +static void +qla1280_isp_cmd(struct scsi_qla_host *ha) { - nack_entry_t *pkt; - -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_notify_ack: entered\n\r"); -#endif - - /* Get request packet. */ - if (pkt = (nack_entry_t *)qla1280_req_pkt(ha)) - { - pkt->entry_type = NOTIFY_ACK_TYPE; - pkt->lun = inotify->lun; - pkt->initiator_id = inotify->initiator_id; - pkt->target_id = inotify->target_id; - if (inotify->seq_id == 0) - pkt->event = BIT_7; - else - pkt->seq_id = inotify->seq_id; - - /* Issue command to ISP */ - qla1280_isp_cmd(ha); - } + struct device_reg *reg = ha->iobase; -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (!pkt) - qla1280_print("qla1280_notify_ack: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_notify_ack: exiting normally\n\r"); -#endif -} - -/* - * qla1280_immed_notify - * Issue immediate notify IOCB for LUN 0. - * - * Input: - * ha = adapter block pointer. - * inotify = immediate notify entry pointer. - */ -STATIC void -qla1280_immed_notify(scsi_qla_host_t *ha, notify_entry_t *inotify) -{ - notify_entry_t *pkt; + ENTER("qla1280_isp_cmd"); -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_immed_notify: entered\n\r"); -#endif + dprintk(5, "qla1280_isp_cmd: IOCB data:\n"); + qla1280_dump_buffer(5, (char *)ha->request_ring_ptr, + REQUEST_ENTRY_SIZE); - /* Get request packet. */ - if (pkt = (notify_entry_t *)qla1280_req_pkt(ha)) - { - pkt->entry_type = IMMED_NOTIFY_TYPE; - pkt->lun = inotify->lun; - pkt->initiator_id = inotify->initiator_id; - pkt->target_id = inotify->target_id; - pkt->status = 1; + /* Adjust ring index. */ + ha->req_ring_index++; + if (ha->req_ring_index == REQUEST_ENTRY_CNT) { + ha->req_ring_index = 0; + ha->request_ring_ptr = ha->request_ring; + } else + ha->request_ring_ptr++; - /* Issue command to ISP */ - qla1280_isp_cmd(ha); - } + /* Set chip new ring index. */ + WRT_REG_WORD(®->mailbox4, ha->req_ring_index); -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (!pkt) - qla1280_print("qla1280_immed_notify: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_immed_notify: exiting normally\n\r"); -#endif + LEAVE("qla1280_isp_cmd"); } +#if QL1280_LUN_SUPPORT /* - * qla1280_accept_io - * Issue accept target I/O IOCB for LUN 0. + * qla1280_enable_lun + * Issue enable LUN entry IOCB. * * Input: - * ha = adapter block pointer. - * ctio = ctio returned entry pointer. + * ha = adapter block pointer. + * bus = SCSI BUS number. + * lun = LUN number. */ -STATIC void -qla1280_accept_io(scsi_qla_host_t *ha, ctio_ret_entry_t *ctio) +static void +qla1280_enable_lun(struct scsi_qla_host *ha, int bus, int lun) { - atio_entry_t *pkt; - -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_accept_io: entered\n\r"); -#endif + struct elun_entry *pkt; - /* Get request packet. */ - if (pkt = (atio_entry_t *)qla1280_req_pkt(ha)) - { - pkt->entry_type = ACCEPT_TGT_IO_TYPE; - pkt->lun = ctio->lun; - pkt->initiator_id = ctio->initiator_id; - pkt->target_id = ctio->target_id; - pkt->tag_value = ctio->tag_value; - pkt->status = 1; + ENTER("qla1280_enable_lun"); + + /* Get request packet. */ + /* + if (pkt = (struct elun_entry *)qla1280_req_pkt(ha)) + { + pkt->entry_type = ENABLE_LUN_TYPE; + pkt->lun = cpu_to_le16(bus ? lun | BIT_15 : lun); + pkt->command_count = 32; + pkt->immed_notify_count = 1; + pkt->group_6_length = MAX_CMDSZ; + pkt->group_7_length = MAX_CMDSZ; + pkt->timeout = cpu_to_le16(0x30); + + qla1280_isp_cmd(ha); + } + */ + pkt = (struct elun_entry *) 1; - /* Issue command to ISP */ - qla1280_isp_cmd(ha); - } - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (!pkt) - qla1280_print("qla1280_accept_io: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_accept_io: exiting normally\n\r"); -#endif + if (!pkt) + dprintk(2, "qla1280_enable_lun: **** FAILED ****\n"); + else + dprintk(3, "qla1280_enable_lun: exiting normally\n"); } - -/* - * qla1280_64bit_continue_io - * Issue continue target I/O IOCB. - * - * Input: - * ha = adapter block pointer. - * atio = atio pointer. - * len = total bytecount. - * addr = physical address pointer. - */ -STATIC void -qla1280_64bit_continue_io(scsi_qla_host_t *ha, atio_entry_t *atio, uint32_t len, - paddr32_t *addr) -{ - ctio_a64_entry_t *pkt; - uint32_t *dword_ptr; - -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_64bit_continue_io: entered\n\r"); -#endif - - /* Get request packet. */ - if (pkt = (ctio_a64_entry_t *)qla1280_req_pkt(ha)) - { - pkt->entry_type = CTIO_A64_TYPE; - pkt->lun = atio->lun; - pkt->initiator_id = atio->initiator_id; - pkt->target_id = atio->target_id; - pkt->option_flags = atio->option_flags; - pkt->tag_value = atio->tag_value; - pkt->scsi_status = atio->scsi_status; - - if (len) - { - pkt->dseg_count = 1; - pkt->transfer_length = len; - pkt->dseg_0_length = len; - dword_ptr = (uint32_t *)addr; - pkt->dseg_0_address[0] = *dword_ptr++; - pkt->dseg_0_address[1] = *dword_ptr; - } - - /* Issue command to ISP */ - qla1280_isp_cmd(ha); - } - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (!pkt) - qla1280_print("qla1280_64bit_continue_io: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_64bit_continue_io: exiting normally\n\r"); #endif -} -/* - * qla1280_32bit_continue_io - * Issue continue target I/O IOCB. - * - * Input: - * ha = adapter block pointer. - * atio = atio pointer. - * len = total bytecount. - * addr = physical address pointer. - */ -STATIC void -qla1280_32bit_continue_io(scsi_qla_host_t *ha, atio_entry_t *atio, uint32_t len, - paddr32_t *addr) -{ - ctio_entry_t *pkt; - uint32_t *dword_ptr; - -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_32bit_continue_io: entered\n\r"); -#endif - - /* Get request packet. */ - if (pkt = (ctio_entry_t *)qla1280_req_pkt(ha)) - { - pkt->entry_type = CONTINUE_TGT_IO_TYPE; - pkt->lun = atio->lun; - pkt->initiator_id = atio->initiator_id; - pkt->target_id = atio->target_id; - pkt->option_flags = atio->option_flags; - pkt->tag_value = atio->tag_value; - pkt->scsi_status = atio->scsi_status; - - if (len) - { - pkt->dseg_count = 1; - pkt->transfer_length = len; - pkt->dseg_0_length = len; - dword_ptr = (uint32_t *)addr; - pkt->dseg_0_address = *dword_ptr; - } - - /* Issue command to ISP */ - qla1280_isp_cmd(ha); - } - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - if (!pkt) - qla1280_print("qla1280_32bit_continue_io: **** FAILED ****\n\r"); -#endif -#ifdef QL_DEBUG_LEVEL_3 - else - qla1280_print("qla1280_32bit_continue_io: exiting normally\n\r"); -#endif -} -#endif /* QL1280_TARGET_MODE_SUPPORT */ /****************************************************************************/ /* Interrupt Service Routine. */ @@ -4888,832 +4253,313 @@ * ha = adapter block pointer. * done_q_first = done queue first pointer. * done_q_last = done queue last pointer. - * INTR_LOCK must be already obtained. ****************************************************************************/ -STATIC void -qla1280_isr(scsi_qla_host_t *ha, srb_t **done_q_first, srb_t **done_q_last) -{ - device_reg_t *reg = ha->iobase; - response_t *pkt; - srb_t *sp; - uint16_t mailbox[MAILBOX_REGISTER_COUNT]; - uint16_t *wptr; - uint32_t index; - - ENTER("qla1280_isr"); - - - /* Save mailbox register 5 */ - mailbox[5] = RD_REG_WORD(®->mailbox5); - - /* Check for mailbox interrupt. */ - - mailbox[0] = RD_REG_WORD(®->semaphore); - if (mailbox[0] & BIT_0) - { - /* Get mailbox data. */ - - wptr = &mailbox[0]; - *wptr++ = RD_REG_WORD(®->mailbox0); - *wptr++ = RD_REG_WORD(®->mailbox1); - *wptr = RD_REG_WORD(®->mailbox2); - if (mailbox[0] != MBA_SCSI_COMPLETION) - { - wptr++; - *wptr++ = RD_REG_WORD(®->mailbox3); - *wptr++ = RD_REG_WORD(®->mailbox4); - wptr++; - *wptr++ = RD_REG_WORD(®->mailbox6); - *wptr = RD_REG_WORD(®->mailbox7); - } - - /* Release mailbox registers. */ - - WRT_REG_WORD(®->semaphore, 0); - WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); - -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print("qla1280_isr: mailbox interrupt mailbox[0] = "); - qla1280_output_number((uint32_t)mailbox[0], 16); - qla1280_print("\n\r"); -#endif - - /* Handle asynchronous event */ - - switch (mailbox[0]) - { - case MBA_SCSI_COMPLETION: /* Response completion */ -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print("qla1280_isr: mailbox response completion\n\r"); -#endif - if (ha->flags.online) - { - /* Get outstanding command index. */ - index = (uint32_t)(mailbox[2] << 16 | mailbox[1]); - - /* Validate handle. */ - if (index < MAX_OUTSTANDING_COMMANDS) - sp = ha->outstanding_cmds[index]; - else - sp = 0; - - if (sp) - { - /* Free outstanding command slot. */ - ha->outstanding_cmds[index] = 0; - - /* Save ISP completion status */ - CMD_RESULT(sp->cmd) = 0; - - /* Place block on done queue */ - sp->s_next = NULL; - sp->s_prev = *done_q_last; - if (!*done_q_first) - *done_q_first = sp; - else - (*done_q_last)->s_next = sp; - *done_q_last = sp; - } - else - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_isr: ISP invalid handle\n\r"); -#endif - printk(KERN_WARNING "qla1280: ISP invalid handle"); - ha->flags.isp_abort_needed = TRUE; - } - } - break; - case MBA_BUS_RESET: /* SCSI Bus Reset */ -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_isr: asynchronous BUS_RESET\n\r"); -#endif - ha->flags.reset_marker = TRUE; - index = mailbox[6] & BIT_0; - ha->bus_settings[index].reset_marker = TRUE; - break; - case MBA_SYSTEM_ERR: /* System Error */ -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_isr: ISP System Error - mbx1="); - qla1280_output_number((uint32_t)mailbox[1], 16); - qla1280_print(", mbx2="); - qla1280_output_number((uint32_t)mailbox[2], 16); - qla1280_print(", mbx3="); - qla1280_output_number((uint32_t)mailbox[3], 16); - qla1280_print("\n\r"); -#endif - printk(KERN_WARNING - "qla1280: ISP System Error - mbx1=%xh, mbx2=%xh, mbx3=%xh\n", - mailbox[1], mailbox[2], mailbox[3]); - ha->flags.isp_abort_needed = TRUE; - break; - case MBA_REQ_TRANSFER_ERR: /* Request Transfer Error */ -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_isr: ISP Request Transfer Error\n\r"); -#endif - printk(KERN_WARNING "qla1280: ISP Request Transfer Error\n"); - ha->flags.isp_abort_needed = TRUE; - break; - case MBA_RSP_TRANSFER_ERR: /* Response Transfer Error */ -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_isr: ISP Response Transfer Error\n\r"); -#endif - printk(KERN_WARNING "qla1280: ISP Response Transfer Error\n"); - ha->flags.isp_abort_needed = TRUE; - break; - case MBA_WAKEUP_THRES: /* Request Queue Wake-up */ -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_isr: asynchronous WAKEUP_THRES\n\r"); -#endif - break; - case MBA_TIMEOUT_RESET: /* Execution Timeout Reset */ -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_isr: asynchronous TIMEOUT_RESET\n\r"); -#endif - break; - case MBA_DEVICE_RESET: /* Bus Device Reset */ -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print( - "qla1280_isr: asynchronous BUS_DEVICE_RESET\n\r"); -#endif - ha->flags.reset_marker = TRUE; - index = mailbox[6] & BIT_0; - ha->bus_settings[index].reset_marker = TRUE; - break; - case MBA_BUS_MODE_CHANGE: -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print( - "qla1280_isr: asynchronous BUS_MODE_CHANGE\n\r"); -#endif - break; - default: - if (mailbox[0] < MBA_ASYNC_EVENT) - { - wptr = &mailbox[0]; - ha->mailbox_out[0] = *wptr++; - ha->mailbox_out[1] = *wptr++; - ha->mailbox_out[2] = *wptr++; - ha->mailbox_out[3] = *wptr++; - ha->mailbox_out[4] = *wptr++; - ha->mailbox_out[5] = *wptr++; - ha->mailbox_out[6] = *wptr++; - ha->mailbox_out[7] = *wptr; - ha->flags.mbox_int = TRUE; - } - break; - } - } - else - WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); - - /* - * Response ring - */ - if (ha->flags.online && !ha->flags.mbox_busy) - { - if (mailbox[5] < RESPONSE_ENTRY_CNT) - { - while (ha->rsp_ring_index != mailbox[5]) - { - pkt = ha->response_ring_ptr; - -#ifdef QL_DEBUG_LEVEL_5 - qla1280_print("qla1280_isr: ha->rsp_ring_index = "); - qla1280_output_number((uint32_t)ha->rsp_ring_index, 16); - qla1280_print(" mailbox[5] = "); - qla1280_output_number((uint32_t)mailbox[5], 16); - qla1280_print("\n\rqla1280_isr: response packet data\n\r"); - qla1280_dump_buffer((caddr_t)pkt, RESPONSE_ENTRY_SIZE); -#endif - -#if defined(QL_DEBUG_LEVEL_2) && !defined(QL_DEBUG_LEVEL_5) - if (pkt->entry_type == STATUS_TYPE) - { - if ((uint8_t)(pkt->scsi_status) || pkt->comp_status || - pkt->entry_status) - { - DEBUG(qla1280_print("qla1280_isr: ha->rsp_ring_index = ");) - DEBUG(qla1280_output_number((uint32_t)ha->rsp_ring_index, - 16);) - DEBUG(qla1280_print(" mailbox[5] = ");) - DEBUG(qla1280_output_number((uint32_t)mailbox[5], 16);) - DEBUG(qla1280_print( "\n\r comp_status = ");) - DEBUG(qla1280_output_number((uint32_t)pkt->comp_status,16);) - DEBUG(qla1280_print( ", ");) - DEBUG(qla1280_print( " scsi_status = ");) - DEBUG(qla1280_output_number((uint32_t)pkt->scsi_status,16);) - DEBUG(qla1280_print( "\n\r");) - /* qla1280_print( - "\n\rqla1280_isr: response packet data\n\r"); - qla1280_dump_buffer((caddr_t)pkt, - RESPONSE_ENTRY_SIZE); */ - } - } - else - { - qla1280_print("qla1280_isr: ha->rsp_ring_index = "); - qla1280_output_number((uint32_t)ha->rsp_ring_index, 16); - qla1280_print(" mailbox[5] = "); - qla1280_output_number((uint32_t)mailbox[5], 16); - qla1280_print( - "\n\rqla1280_isr: response packet data\n\r"); - qla1280_dump_buffer((caddr_t)pkt, RESPONSE_ENTRY_SIZE); - } -#endif - if (pkt->entry_type == STATUS_TYPE || pkt->entry_status) - { - if (pkt->entry_type == STATUS_TYPE) - qla1280_status_entry(ha, (sts_entry_t *)pkt, - done_q_first, done_q_last); - else - qla1280_error_entry(ha, pkt, - done_q_first, done_q_last); - - /* Adjust ring index. */ - ha->rsp_ring_index++; - if (ha->rsp_ring_index == RESPONSE_ENTRY_CNT) - { - ha->rsp_ring_index = 0; - ha->response_ring_ptr = ha->response_ring; - } - else - ha->response_ring_ptr++; - WRT_REG_WORD(®->mailbox5, ha->rsp_ring_index); - } -#if QLA1280_TARGET_MODE_SUPPORT - else - { - pkt = &response_entry; - - /* Copy packet. */ - dptr1 = (uint32_t *)ha->response_ring_ptr; - dptr2 = (uint32_t *)pkt; - for (index = 0; index < RESPONSE_ENTRY_SIZE/4; index++) - *dptr2++ = *dptr1++; - - /* Adjust ring index. */ - ha->rsp_ring_index++; - if (ha->rsp_ring_index == RESPONSE_ENTRY_CNT) - { - ha->rsp_ring_index = 0; - ha->response_ring_ptr = ha->response_ring; - } - else - ha->response_ring_ptr++; - WRT_REG_WORD(®->mailbox5, ha->rsp_ring_index); - - /* Release interrupt specific lock */ - QLA1280_INTR_UNLOCK(ha); - - switch (pkt->entry_type) - { - case ACCEPT_TGT_IO_TYPE: - qla1280_atio_entry(ha, (atio_entry_t *)pkt); - break; - case IMMED_NOTIFY_TYPE: - qla1280_notify_entry(ha, (notify_entry_t *)pkt); - break; - case CTIO_RET_TYPE: - qla1280_accept_io(ha, (ctio_ret_entry_t *)pkt); - break; - default: - break; - } - - /* Acquire interrupt specific lock */ - QLA1280_INTR_LOCK(ha); - } -#endif - } - } - else - { - ha->flags.isp_abort_needed = TRUE; -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_isr: Response pointer Error\n"); -#endif - } - } +static void +qla1280_isr(struct scsi_qla_host *ha, struct srb ** done_q_first, + struct srb ** done_q_last) +{ + struct device_reg *reg = ha->iobase; + struct response *pkt; + struct srb *sp = 0; + uint16_t mailbox[MAILBOX_REGISTER_COUNT]; + uint16_t *wptr; + uint32_t index; + u16 istatus; + + ENTER("qla1280_isr"); + + istatus = RD_REG_WORD(®->istatus); + if (!(istatus & (RISC_INT | PCI_INT))) + return; + + /* Save mailbox register 5 */ + mailbox[5] = RD_REG_WORD(®->mailbox5); + + /* Check for mailbox interrupt. */ + + mailbox[0] = RD_REG_WORD(®->semaphore); + + if (mailbox[0] & BIT_0) { + /* Get mailbox data. */ + /* dprintk(1, "qla1280_isr: In Get mailbox data \n"); */ + + wptr = &mailbox[0]; + *wptr++ = RD_REG_WORD(®->mailbox0); + *wptr++ = RD_REG_WORD(®->mailbox1); + *wptr = RD_REG_WORD(®->mailbox2); + if (mailbox[0] != MBA_SCSI_COMPLETION) { + wptr++; + *wptr++ = RD_REG_WORD(®->mailbox3); + *wptr++ = RD_REG_WORD(®->mailbox4); + wptr++; + *wptr++ = RD_REG_WORD(®->mailbox6); + *wptr = RD_REG_WORD(®->mailbox7); + } - LEAVE("qla1280_isr"); -} + /* Release mailbox registers. */ -/* - * qla1280_rst_aen - * Processes asynchronous reset. - * - * Input: - * ha = adapter block pointer. - */ -STATIC void -qla1280_rst_aen(scsi_qla_host_t *ha) -{ -#if QL1280_TARGET_MODE_SUPPORT - notify_entry_t nentry; -#endif - uint8_t b; + WRT_REG_WORD(®->semaphore, 0); + WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); + + dprintk(5, "qla1280_isr: mailbox interrupt mailbox[0] = 0x%x", + mailbox[0]); + + /* Handle asynchronous event */ + switch (mailbox[0]) { + case MBA_SCSI_COMPLETION: /* Response completion */ + dprintk(5, "qla1280_isr: mailbox SCSI response " + "completion\n"); + + if (ha->flags.online) { + /* Get outstanding command index. */ + index = mailbox[2] << 16 | mailbox[1]; + + /* Validate handle. */ + if (index < MAX_OUTSTANDING_COMMANDS) + sp = ha->outstanding_cmds[index]; + else + sp = 0; + + if (sp) { + /* Free outstanding command slot. */ + ha->outstanding_cmds[index] = 0; + + /* Save ISP completion status */ + CMD_RESULT(sp->cmd) = 0; + + /* Place block on done queue */ + sp->s_next = NULL; + sp->s_prev = *done_q_last; + if (!*done_q_first) + *done_q_first = sp; + else + (*done_q_last)->s_next = sp; + *done_q_last = sp; + } else { + /* + * If we get here we have a real problem! + */ + printk(KERN_WARNING + "qla1280: ISP invalid handle"); + } + } + break; + + case MBA_BUS_RESET: /* SCSI Bus Reset */ + ha->flags.reset_marker = 1; + index = mailbox[6] & BIT_0; + ha->bus_settings[index].reset_marker = 1; + + printk(KERN_DEBUG "qla1280_isr(): index %i " + "asynchronous BUS_RESET\n", index); + break; + + case MBA_SYSTEM_ERR: /* System Error */ + printk(KERN_WARNING + "qla1280: ISP System Error - mbx1=%xh, mbx2=" + "%xh, mbx3=%xh\n", mailbox[1], mailbox[2], + mailbox[3]); + break; + + case MBA_REQ_TRANSFER_ERR: /* Request Transfer Error */ + printk(KERN_WARNING + "qla1280: ISP Request Transfer Error\n"); + break; + + case MBA_RSP_TRANSFER_ERR: /* Response Transfer Error */ + printk(KERN_WARNING + "qla1280: ISP Response Transfer Error\n"); + break; + + case MBA_WAKEUP_THRES: /* Request Queue Wake-up */ + dprintk(2, "qla1280_isr: asynchronous WAKEUP_THRES\n"); + break; + + case MBA_TIMEOUT_RESET: /* Execution Timeout Reset */ + dprintk(2, + "qla1280_isr: asynchronous TIMEOUT_RESET\n"); + break; + + case MBA_DEVICE_RESET: /* Bus Device Reset */ + printk(KERN_INFO "qla1280_isr(): asynchronous " + "BUS_DEVICE_RESET\n"); + + ha->flags.reset_marker = 1; + index = mailbox[6] & BIT_0; + ha->bus_settings[index].reset_marker = 1; + break; + + case MBA_BUS_MODE_CHANGE: + dprintk(2, + "qla1280_isr: asynchronous BUS_MODE_CHANGE\n"); + break; + + default: + /* dprintk(1, "qla1280_isr: default case of switch MB \n"); */ + if (mailbox[0] < MBA_ASYNC_EVENT) { + wptr = &mailbox[0]; + memcpy((uint16_t *) ha->mailbox_out, wptr, + MAILBOX_REGISTER_COUNT * + sizeof(uint16_t)); + + if(ha->mailbox_wait != NULL) + complete(ha->mailbox_wait); + } + break; + } + } else { + WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); + } -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_rst_aen"); + /* + * Response ring - waiting for the mbox_busy flag here seems + * unnecessary as the mailbox data has been copied to ha->mailbox_out + * by the time we actually get here! + */ + if (!(ha->flags.online +#if 0 + && !ha->flags.mbox_busy #endif + )) { + dprintk(2, "qla1280_isr: Response pointer Error\n"); + goto out; + } - if (ha->flags.online && !ha->flags.reset_active && - !ha->flags.abort_isp_active) - { - ha->flags.reset_active = TRUE; - while (ha->flags.reset_marker) - { - /* Issue marker command. */ - ha->flags.reset_marker = FALSE; - for (b = 0; b < ha->ports && !ha->flags.reset_marker; b++) - { - if (ha->bus_settings[b].reset_marker) - { - ha->bus_settings[b].reset_marker = FALSE; - qla1280_marker(ha, b, 0, 0, MK_SYNC_ALL); + if (mailbox[5] >= RESPONSE_ENTRY_CNT) + goto out; - if (!ha->flags.reset_marker) - { -#if QL1280_TARGET_MODE_SUPPORT - /* Issue notify acknowledgement command. */ - bzero((caddr_t)&nentry, sizeof(notify_entry_t)); + while (ha->rsp_ring_index != mailbox[5]) { + pkt = ha->response_ring_ptr; - nentry.initiator_id = nentry.target_id = b ? - ha->bus_settings[b].id | BIT_7 : - ha->bus_settings[b].id; - qla1280_notify_entry(ha, &nentry); -#endif + dprintk(5, "qla1280_isr: ha->rsp_ring_index = 0x%x, mailbox[5]" + " = 0x%x\n", ha->rsp_ring_index, mailbox[5]); + dprintk(5,"qla1280_isr: response packet data\n"); + qla1280_dump_buffer(5, (char *)pkt, RESPONSE_ENTRY_SIZE); + + if (pkt->entry_type == STATUS_TYPE) { + if ((le16_to_cpu(pkt->scsi_status) & 0xff) + || pkt->comp_status || pkt->entry_status) { + dprintk(2, "qla1280_isr: ha->rsp_ring_index = " + "0x%x mailbox[5] = 0x%x, comp_status " + "= 0x%x, scsi_status = 0x%x\n", + ha->rsp_ring_index, mailbox[5], + le16_to_cpu(pkt->comp_status), + le16_to_cpu(pkt->scsi_status)); + } + } else { + dprintk(2, "qla1280_isr: ha->rsp_ring_index = " + "0x%x, mailbox[5] = 0x%x\n", + ha->rsp_ring_index, mailbox[5]); + dprintk(2, "qla1280_isr: response packet data\n"); + qla1280_dump_buffer(2, (char *)pkt, + RESPONSE_ENTRY_SIZE); + } - /* Asynchronous event notification */ - } - } - } - } - } + if (pkt->entry_type == STATUS_TYPE || pkt->entry_status) { + dprintk(2, "status: Cmd %p, handle %i\n", + ha->outstanding_cmds[pkt->handle]->cmd, + pkt->handle); + if (pkt->entry_type == STATUS_TYPE) + qla1280_status_entry(ha, pkt, done_q_first, + done_q_last); + else + qla1280_error_entry(ha, pkt, done_q_first, + done_q_last); -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_rst_aen"); -#endif + /* Adjust ring index. */ + ha->rsp_ring_index++; + if (ha->rsp_ring_index == RESPONSE_ENTRY_CNT) { + ha->rsp_ring_index = 0; + ha->response_ring_ptr = ha->response_ring; + } else + ha->response_ring_ptr++; + WRT_REG_WORD(®->mailbox5, ha->rsp_ring_index); + } + } + + out: + LEAVE("qla1280_isr"); } -#if QL1280_TARGET_MODE_SUPPORT /* - * qla1280_atio_entry - * Processes received ISP accept target I/O entry. + * qla1280_rst_aen + * Processes asynchronous reset. * * Input: * ha = adapter block pointer. - * pkt = entry pointer. */ -STATIC void -qla1280_atio_entry(scsi_qla_host_t *ha, atio_entry_t *pkt) +static void +qla1280_rst_aen(struct scsi_qla_host *ha) { - uint64_t *a64; - uint64_t *end_a64; - paddr32_t phy_addr[2]; - paddr32_t end_addr[2]; - uint32_t len; - uint32_t offset; - uint8_t t; - uint8_t *sense_ptr; - -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: entered\n\r"); -#endif - - t = pkt->initiator_id; - sense_ptr = ha->tsense + t * TARGET_SENSE_SIZE; - a64 = (uint64_t *)&phy_addr[0]; - end_a64 = (uint64_t *)&end_addr[0]; - - switch (pkt->status & ~BIT_7) - { - case 7: /* Path invalid */ -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - qla1280_print("qla1280_atio_entry: Path invalid\n\r"); -#endif - break; - case 0x14: /* Target Bus Phase Sequence Failure */ -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - qla1280_print( - "qla1280_atio_entry: Target Bus Phase Sequence Failure\n\r"); -#endif - if (pkt->status & BIT_7) - { - BCOPY((caddr_t)&pkt->sense_data, sense_ptr,TARGET_SENSE_SIZE); - } - else - { - bzero(sense_ptr, TARGET_SENSE_SIZE); - *sense_ptr = 0x70; - *(sense_ptr+2) = SD_HARDERR; - *(sense_ptr+7) = TARGET_SENSE_SIZE-8; - *(sense_ptr+12) = SC_SELFAIL; - } - pkt->scsi_status = S_CKCON; - pkt->option_flags |= (uint32_t)OF_SSTS | (uint32_t)OF_NO_DATA; - if (ha->flags.enable_64bit_addressing) - qla1280_64bit_continue_io(ha, pkt, 0, 0); - else - qla1280_32bit_continue_io(ha, pkt, 0, 0); - break; - case 0x16: /* Requested Capability Not Available */ -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - qla1280_print( - "qla1280_atio_entry: Target Bus Phase Sequence Failure\n\r"); -#endif - break; - case 0x17: /* Bus Device Reset Message Received */ -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - qla1280_print( - "qla1280_atio_entry: Target Bus Phase Sequence Failure\n\r"); -#endif - break; - case 0x3D: /* CDB Received */ - - /* Check for invalid LUN */ - if (pkt->lun && pkt->cdb[0] != SS_INQUIR && - pkt->cdb[0] != SS_REQSEN) - pkt->cdb[0] = SS_TEST; - - switch (pkt->cdb[0]) - { - case SS_TEST: -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: SS_TEST\n\r"); -#endif - bzero(sense_ptr, TARGET_SENSE_SIZE); - len = 0; - if (pkt->lun == 0) - pkt->scsi_status = S_GOOD; - else - { - *sense_ptr = 0x70; - *(sense_ptr+2) = SD_ILLREQ; - *(sense_ptr+7) = TARGET_SENSE_SIZE-8; - *(sense_ptr+12) = SC_INVLUN; - pkt->scsi_status = S_CKCON; - } - - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - break; - case SS_REQSEN: -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: SS_REQSEN\n\r"); -#endif - phy_addr[0] = ha->tsense_dma; - phy_addr[1] = 0; - *a64 += t * TARGET_SENSE_SIZE; - if (pkt->cdb[4] > TARGET_SENSE_SIZE) - len = TARGET_SENSE_SIZE; - else - len = pkt->cdb[4]; - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_DATA_IN; - break; - case SS_INQUIR: -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: SS_INQUIR\n\r"); -#endif - bzero(sense_ptr, TARGET_SENSE_SIZE); - phy_addr[0] = ha->tbuf_dma; - phy_addr[1] = 0; - *a64 += TARGET_INQ_OFFSET; - - if (pkt->lun == 0) - { - ha->tbuf->inq.id_type = ID_PROCESOR; - ha->tbuf->inq.id_pqual = ID_QOK; - } - else - { - ha->tbuf->inq.id_type = ID_NODEV; - ha->tbuf->inq.id_pqual = ID_QNOLU; - } - - if (pkt->cdb[4] > sizeof(struct ident)) - len = sizeof(struct ident); - else - len = pkt->cdb[4]; - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_DATA_IN; - break; - case SM_WRDB: - bzero(sense_ptr, TARGET_SENSE_SIZE); - offset = pkt->cdb[5]; - offset |= pkt->cdb[4] << 8; - offset |= pkt->cdb[3] << 16; - len = pkt->cdb[8]; - len |= pkt->cdb[7] << 8; - len |= pkt->cdb[6] << 16; - end_addr[0] = phy_addr[0] = ha->tbuf_dma; - end_addr[1] = phy_addr[1] = 0; - *end_a64 += TARGET_DATA_OFFSET + TARGET_DATA_SIZE; - switch (pkt->cdb[1] & 7) - { - case RW_BUF_HDATA: -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: SM_WRDB, RW_BUF_HDATA\n\r"); -#endif - if (len > TARGET_DATA_SIZE + 4) - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_WRDB, length > buffer size\n\r"); -#endif - *sense_ptr = 0x70; - *(sense_ptr+2) = SD_ILLREQ; - *(sense_ptr+7) = TARGET_SENSE_SIZE-8; - *(sense_ptr+12) = SC_ILLCDB; - pkt->scsi_status = S_CKCON; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - len = 0; - } - else if (len) - { - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_DATA_OUT; -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: Issuing SDI_TARMOD_WRCOMP\n\r"); -#endif - sdi_xaen(SDI_TARMOD_WRCOMP, ha->cntlr, - pkt->target_id, pkt->lun, 0, offset); - } - else - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_WRDB, zero length\n\r"); -#endif - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - } - - break; - case RW_BUF_DATA: -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: SM_WRDB, RW_BUF_DATA\n\r"); -#endif - *a64 += offset + TARGET_DATA_OFFSET; - if (pkt->cdb[2] != 0 || *a64 >= *end_a64 || - *a64 + len > *end_a64) - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_WRDB, RW_BUF_DATA BAD\n\r"); - qla1280_print("buf_id="); - qla1280_output_number((uint32_t)pkt->cdb[2], 16); - qla1280_print(", offset="); - qla1280_output_number((uint32_t)offset, 16); - qla1280_print(", length="); - qla1280_output_number((uint32_t)len, 16); - qla1280_print("\n\r"); -#endif - *sense_ptr = 0x70; - *(sense_ptr+2) = SD_ILLREQ; - *(sense_ptr+7) = TARGET_SENSE_SIZE-8; - *(sense_ptr+12) = SC_ILLCDB; - len = 0; - pkt->scsi_status = S_CKCON; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - } - else if (len) - { - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_DATA_OUT; -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: Issuing SDI_TARMOD_WRCOMP\n\r"); -#endif - sdi_xaen(SDI_TARMOD_WRCOMP, ha->cntlr, - pkt->target_id, pkt->lun, 0, offset); - } - else - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_WRDB, zero length\n\r"); -#endif - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - } - break; - default: -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_WRDB unknown mode\n\r"); -#endif - *sense_ptr = 0x70; - *(sense_ptr+2) = SD_ILLREQ; - *(sense_ptr+7) = TARGET_SENSE_SIZE-8; - *(sense_ptr+12) = SC_ILLCDB; - len = 0; - pkt->scsi_status = S_CKCON; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - break; - } - break; - case SM_RDDB: - bzero(sense_ptr, TARGET_SENSE_SIZE); - offset = pkt->cdb[5]; - offset |= pkt->cdb[4] << 8; - offset |= pkt->cdb[3] << 16; - len = pkt->cdb[8]; - len |= pkt->cdb[7] << 8; - len |= pkt->cdb[6] << 16; - end_addr[0] = phy_addr[0] = ha->tbuf_dma; - end_addr[1] = phy_addr[1] = 0; - *end_a64 += TARGET_DATA_OFFSET + TARGET_DATA_SIZE; - switch (pkt->cdb[1] & 7) - { - case RW_BUF_HDATA: -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: SM_RDDB, RW_BUF_HDATA\n\r"); -#endif - if (len) - { - ha->tbuf->hdr[0] = 0; - ha->tbuf->hdr[1] = - (uint8_t)(TARGET_DATA_SIZE >> 16); - ha->tbuf->hdr[2] = - (uint8_t)(TARGET_DATA_SIZE >> 8); - ha->tbuf->hdr[3] = (uint8_t)TARGET_DATA_SIZE; - if (len > TARGET_DATA_SIZE + 4) - len = TARGET_DATA_SIZE + 4; - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_DATA_IN; - } - else - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_RDDB, zero length\n\r"); -#endif - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - } - break; - case RW_BUF_DATA: -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: SM_RDDB, RW_BUF_DATA\n\r"); -#endif - *a64 += offset + TARGET_DATA_OFFSET; - if (pkt->cdb[2] != 0 || *a64 >= *end_a64) - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_RDDB, RW_BUF_DATA BAD\n\r"); - qla1280_print("buf_id="); - qla1280_output_number((uint32_t)pkt->cdb[2], 16); - qla1280_print(", offset="); - qla1280_output_number((uint32_t)offset, 16); - qla1280_print("\n\r"); -#endif - *sense_ptr = 0x70; - *(sense_ptr+2) = SD_ILLREQ; - *(sense_ptr+7) = TARGET_SENSE_SIZE-8; - *(sense_ptr+12) = SC_ILLCDB; - len = 0; - pkt->scsi_status = S_CKCON; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - } - else - { - if (*a64 + len > *end_a64) - len = *end_a64 - *a64; - if (len) - { - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_DATA_IN; - } - else - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_RDDB, zero length\n\r"); -#endif - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - } - } - break; - case RW_BUF_DESC: -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: SM_RDDB, RW_BUF_DESC\n\r"); -#endif - if (len) - { - if (len > 4) - len = 4; - - ha->tbuf->hdr[0] = 0; - if (pkt->cdb[2] != 0) - { - ha->tbuf->hdr[1] = 0; - ha->tbuf->hdr[2] = 0; - ha->tbuf->hdr[3] = 0; - } - else - { - ha->tbuf->hdr[1] = - (uint8_t)(TARGET_DATA_SIZE >> 16); - ha->tbuf->hdr[2] = - (uint8_t)(TARGET_DATA_SIZE >> 8); - ha->tbuf->hdr[3] = - (uint8_t)TARGET_DATA_SIZE; - } - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_DATA_IN; - } - else - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_RDDB, zero length\n\r"); -#endif - pkt->scsi_status = S_GOOD; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - } - break; - default: -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: SM_RDDB unknown mode\n\r"); -#endif - *sense_ptr = 0x70; - *(sense_ptr+2) = SD_ILLREQ; - *(sense_ptr+7) = TARGET_SENSE_SIZE-8; - *(sense_ptr+12) = SC_ILLCDB; - len = 0; - pkt->scsi_status = S_CKCON; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - break; - } - break; - default: -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_atio_entry: Unknown SCSI command\n\r"); - qla1280_dump_buffer((caddr_t)&pkt->cdb[0], pkt->cdb_len); -#endif - bzero(sense_ptr, TARGET_SENSE_SIZE); - *sense_ptr = 0x70; - *(sense_ptr+2) = SD_ILLREQ; - *(sense_ptr+7) = TARGET_SENSE_SIZE-8; - *(sense_ptr+12) = SC_INVOPCODE; - len = 0; - pkt->scsi_status = S_CKCON; - pkt->option_flags |= (uint32_t)OF_SSTS | - (uint32_t)OF_NO_DATA; - break; - } - if (ha->flags.enable_64bit_addressing) - qla1280_64bit_continue_io(ha, pkt, len, (paddr32_t *)&phy_addr); - else - qla1280_32bit_continue_io(ha, pkt, len, (paddr32_t *)&phy_addr); - break; - default: - break; - } + uint8_t bus; -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_atio_entry: exiting normally\n\r"); -#endif + ENTER("qla1280_rst_aen"); + + if (ha->flags.online && !ha->flags.reset_active && + !ha->flags.abort_isp_active) { + ha->flags.reset_active = 1; + while (ha->flags.reset_marker) { + /* Issue marker command. */ + ha->flags.reset_marker = 0; + for (bus = 0; bus < ha->ports && + !ha->flags.reset_marker; bus++) { + if (ha->bus_settings[bus].reset_marker) { + ha->bus_settings[bus].reset_marker = 0; + qla1280_marker(ha, bus, 0, 0, + MK_SYNC_ALL); + } + } + } + } + + LEAVE("qla1280_rst_aen"); } + +#if LINUX_VERSION_CODE < 0x020500 /* - * qla1280_notify_entry - * Processes received ISP immediate notify entry. * - * Input: - * ha = adapter block pointer. - * pkt = entry pointer. */ -STATIC void -qla1280_notify_entry(scsi_qla_host_t *ha, notify_entry_t *pkt) +static void +qla1280_get_target_options(struct scsi_cmnd *cmd, struct scsi_qla_host *ha) { -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_notify_entry: entered\n\r"); -#endif + unsigned char *result; + struct nvram *n; + int bus, target, lun; - /* Acknowledge immediate notify */ - qla1280_notify_ack(ha, pkt); + bus = SCSI_BUS_32(cmd); + target = SCSI_TCN_32(cmd); + lun = SCSI_LUN_32(cmd); - /* Issue notify entry to increment resource count */ - qla1280_immed_notify(ha, pkt); + /* + * Make sure to not touch anything if someone is using the + * sg interface. + */ + if (cmd->use_sg || (CMD_RESULT(cmd) >> 16) != DID_OK || lun) + return; -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_notify_entry: exiting normally\n\r"); -#endif + result = cmd->request_buffer; + n = &ha->nvram; + + n->bus[bus].target[target].parameter.f.enable_wide = 0; + n->bus[bus].target[target].parameter.f.enable_sync = 0; + n->bus[bus].target[target].ppr_1x160.flags.enable_ppr = 0; + + if (result[7] & 0x60) + n->bus[bus].target[target].parameter.f.enable_wide = 1; + if (result[7] & 0x10) + n->bus[bus].target[target].parameter.f.enable_sync = 1; + if ((result[2] >= 3) && (result[4] + 5 > 56) && + (result[56] & 0x4)) + n->bus[bus].target[target].ppr_1x160.flags.enable_ppr = 1; + + dprintk(2, "get_target_options(): wide %i, sync %i, ppr %i\n", + n->bus[bus].target[target].parameter.f.enable_wide, + n->bus[bus].target[target].parameter.f.enable_sync, + n->bus[bus].target[target].ppr_1x160.flags.enable_ppr); } +#endif -#endif /* QLA1280_TARGET_MODE_SUPPORT */ /* * qla1280_status_entry * Processes received ISP status entry. @@ -5724,104 +4570,92 @@ * done_q_first = done queue first pointer. * done_q_last = done queue last pointer. */ -STATIC void -qla1280_status_entry(scsi_qla_host_t *ha, sts_entry_t *pkt, srb_t **done_q_first, - srb_t **done_q_last) -{ - uint32_t b, t, l; - uint8_t sense_sz = 0; - srb_t *sp; - scsi_lu_t *q; - Scsi_Cmnd *cp; - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_status_entry"); -#endif - - /* Validate handle. */ - if (pkt->handle < MAX_OUTSTANDING_COMMANDS) - sp = ha->outstanding_cmds[pkt->handle]; - else - sp = 0; - - if (sp) - { - /* Free outstanding command slot. */ - ha->outstanding_cmds[pkt->handle] = 0; - - cp = sp->cmd; - /* Generate LU queue on cntrl, target, LUN */ - b = SCSI_BUS_32(cp); - t = SCSI_TCN_32(cp); - l = SCSI_LUN_32(cp); - q = LU_Q(ha, b, t, l); - if( pkt->comp_status || pkt->scsi_status ) - { - DEBUG(qla1280_print( "scsi: comp_status = ");) - DEBUG(qla1280_output_number((uint32_t)pkt->comp_status,16);) - DEBUG(qla1280_print( ", ");) - DEBUG(qla1280_print( " scsi_status = ");) - DEBUG(qla1280_output_number((uint32_t)pkt->scsi_status,16);) - DEBUG(qla1280_print( "\n\r");) - DEBUG(qla1280_print(", handle = ");) - DEBUG(qla1280_output_number((uint32_t)pkt->handle, 16);) - DEBUG(qla1280_print("\n\r");) - } - - /* Target busy */ - if ( pkt->scsi_status & SS_BUSY_CONDITION && - pkt->scsi_status != SS_RESERVE_CONFLICT ) - { - CMD_RESULT(cp) = (int) (DID_BUS_BUSY << 16) | - (pkt->scsi_status & 0xff); - } - else - { - - /* Save ISP completion status */ - CMD_RESULT(cp) = qla1280_return_status( pkt, cp ); - - if (pkt->scsi_status & SS_CHECK_CONDITION) - { - BZERO(cp->sense_buffer, CMD_SNSLEN(cp)); - if (pkt->comp_status != CS_ARS_FAILED) - { - if ( pkt->req_sense_length < CMD_SNSLEN(cp) ) - sense_sz = pkt->req_sense_length; - else - sense_sz = CMD_SNSLEN(cp) - 1; - - BCOPY((caddr_t)&pkt->req_sense_data, cp->sense_buffer, sense_sz); - - } -#ifdef QL_DEBUG_LEVEL_2 - DEBUG(qla1280_print( - "qla1280_status_entry: Check condition Sense data, b");) - DEBUG(qla1280_output_number((uint32_t)b, 10);) - DEBUG(qla1280_print("t");) - DEBUG(qla1280_output_number((uint32_t)t, 10);) - DEBUG(qla1280_print("d");) - DEBUG(qla1280_output_number((uint32_t)l, 10);) - DEBUG(qla1280_print("\n\r");) - DEBUG(if (sense_sz)) - DEBUG(qla1280_dump_buffer(cp->sense_buffer, sense_sz);) -#endif - } - } - /* Place command on done queue. */ - qla1280_done_q_put(sp, done_q_first, done_q_last); - } - else - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_status_entry: ISP Invalid handle\n\r"); -#endif - printk(KERN_WARNING "qla1280: Status Entry invalid handle\n"); - ha->flags.isp_abort_needed = TRUE; - } -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_status_entry"); -#endif +static void +qla1280_status_entry(struct scsi_qla_host *ha, struct response *pkt, + struct srb **done_q_first, struct srb **done_q_last) +{ + unsigned int bus, target, lun; + int sense_sz; + struct srb *sp; + Scsi_Cmnd *cmd; + uint32_t handle = le32_to_cpu(pkt->handle); + uint16_t scsi_status = le16_to_cpu(pkt->scsi_status); + uint16_t comp_status = le16_to_cpu(pkt->comp_status); + + ENTER("qla1280_status_entry"); + + /* Validate handle. */ + if (handle < MAX_OUTSTANDING_COMMANDS) + sp = ha->outstanding_cmds[handle]; + else + sp = NULL; + + if (!sp) { + printk(KERN_WARNING "qla1280: Status Entry invalid handle\n"); + goto out; + } + + /* Free outstanding command slot. */ + ha->outstanding_cmds[handle] = 0; + + cmd = sp->cmd; + + /* Generate LU queue on cntrl, target, LUN */ + bus = SCSI_BUS_32(cmd); + target = SCSI_TCN_32(cmd); + lun = SCSI_LUN_32(cmd); + + if (comp_status || scsi_status) { + dprintk(3, "scsi: comp_status = 0x%x, scsi_status = " + "0x%x, handle = 0x%x\n", comp_status, + scsi_status, handle); + } + + /* Target busy */ + if (scsi_status & SS_BUSY_CONDITION && + scsi_status != SS_RESERVE_CONFLICT) { + CMD_RESULT(cmd) = + DID_BUS_BUSY << 16 | (scsi_status & 0xff); + } else { + + /* Save ISP completion status */ + CMD_RESULT(cmd) = qla1280_return_status(pkt, cmd); + + if (scsi_status & SS_CHECK_CONDITION) { + if (comp_status != CS_ARS_FAILED) { + uint16_t req_sense_length = + le16_to_cpu(pkt->req_sense_length); + if (req_sense_length < CMD_SNSLEN(cmd)) + sense_sz = req_sense_length; + else + /* + * Scsi_Cmnd->sense_buffer is + * 64 bytes, why only copy 63? + * This looks wrong! /Jes + */ + sense_sz = CMD_SNSLEN(cmd) - 1; + + memcpy(cmd->sense_buffer, + &pkt->req_sense_data, sense_sz); + } else + sense_sz = 0; + memset(cmd->sense_buffer + sense_sz, 0, + sizeof(cmd->sense_buffer) - sense_sz); + + dprintk(2, "qla1280_status_entry: Check " + "condition Sense data, b %i, t %i, " + "l %i\n", bus, target, lun); + if (sense_sz) + qla1280_dump_buffer(2, + (char *)cmd->sense_buffer, + sense_sz); + } + } + /* Place command on done queue. */ + qla1280_done_q_put(sp, done_q_first, done_q_last); + + out: + LEAVE("qla1280_status_entry"); } /* @@ -5834,71 +4668,55 @@ * done_q_first = done queue first pointer. * done_q_last = done queue last pointer. */ -STATIC void -qla1280_error_entry(scsi_qla_host_t *ha, response_t *pkt, srb_t **done_q_first, - srb_t **done_q_last) -{ - srb_t *sp; - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_error_entry"); -#endif - -#ifdef QL_DEBUG_LEVEL_2 - if (pkt->entry_status & BIT_3) - qla1280_print("qla1280_error_entry: BAD PAYLOAD flag error\n\r"); - else if (pkt->entry_status & BIT_2) - qla1280_print("qla1280_error_entry: BAD HEADER flag error\n\r"); - else if (pkt->entry_status & BIT_1) - qla1280_print("qla1280_error_entry: FULL flag error\n\r"); - else - qla1280_print("qla1280_error_entry: UNKNOWN flag error\n\r"); -#endif - - /* Validate handle. */ - if (pkt->handle < MAX_OUTSTANDING_COMMANDS) - sp = ha->outstanding_cmds[pkt->handle]; - else - sp = 0; - - if (sp) - { - /* Free outstanding command slot. */ - ha->outstanding_cmds[pkt->handle] = 0; - - /* Bad payload or header */ - if (pkt->entry_status & (BIT_3 + BIT_2)) - { - /* Bad payload or header, set error status. */ - /* CMD_RESULT(sp->cmd) = CS_BAD_PAYLOAD; */ - CMD_RESULT(sp->cmd) = (int) DID_ERROR << 16; - } - else if (pkt->entry_status & BIT_1 ) /* FULL flag */ - { - CMD_RESULT(sp->cmd) = (int) DID_BUS_BUSY << 16; - } - else - { - /* Set error status. */ - CMD_RESULT(sp->cmd) =(int) DID_ERROR << 16; - } - /* Place command on done queue. */ - qla1280_done_q_put(sp, done_q_first, done_q_last); - } -#if QLA1280_64BIT_SUPPORT - else if (pkt->entry_type == COMMAND_A64_TYPE) - { -#ifdef QL_DEBUG_LEVEL_2 - qla1280_print("qla1280_error_entry: ISP Invalid handle\n\r"); -#endif - printk(KERN_WARNING "!qla1280: Error Entry invalid handle"); - ha->flags.isp_abort_needed = TRUE; - } -#endif +static void +qla1280_error_entry(struct scsi_qla_host *ha, struct response * pkt, + struct srb ** done_q_first, struct srb ** done_q_last) +{ + struct srb *sp; + uint32_t handle = le32_to_cpu(pkt->handle); + + ENTER("qla1280_error_entry"); + + if (pkt->entry_status & BIT_3) + dprintk(2, "qla1280_error_entry: BAD PAYLOAD flag error\n"); + else if (pkt->entry_status & BIT_2) + dprintk(2, "qla1280_error_entry: BAD HEADER flag error\n"); + else if (pkt->entry_status & BIT_1) + dprintk(2, "qla1280_error_entry: FULL flag error\n"); + else + dprintk(2, "qla1280_error_entry: UNKNOWN flag error\n"); -#ifdef QL_DEBUG_LEVEL_3 - LEAVE("qla1280_error_entry"); + /* Validate handle. */ + if (handle < MAX_OUTSTANDING_COMMANDS) + sp = ha->outstanding_cmds[handle]; + else + sp = 0; + + if (sp) { + /* Free outstanding command slot. */ + ha->outstanding_cmds[handle] = 0; + + /* Bad payload or header */ + if (pkt->entry_status & (BIT_3 + BIT_2)) { + /* Bad payload or header, set error status. */ + /* CMD_RESULT(sp->cmd) = CS_BAD_PAYLOAD; */ + CMD_RESULT(sp->cmd) = DID_ERROR << 16; + } else if (pkt->entry_status & BIT_1) { /* FULL flag */ + CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; + } else { + /* Set error status. */ + CMD_RESULT(sp->cmd) = DID_ERROR << 16; + } + /* Place command on done queue. */ + qla1280_done_q_put(sp, done_q_first, done_q_last); + } +#ifdef QLA_64BIT_PTR + else if (pkt->entry_type == COMMAND_A64_TYPE) { + printk(KERN_WARNING "!qla1280: Error Entry invalid handle"); + } #endif + + LEAVE("qla1280_error_entry"); } /* @@ -5911,236 +4729,91 @@ * Returns: * 0 = success */ -STATIC uint8_t -qla1280_abort_isp(scsi_qla_host_t *ha) -{ - device_reg_t *reg = ha->iobase; - uint8_t status = 0; - uint16_t cnt; - srb_t *sp; - scsi_lu_t *q; - uint32_t b, t, l; -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - unsigned long cpu_flags = 0; -#endif - -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_abort_isp"); -#endif - - DRIVER_LOCK - ha->flags.isp_abort_needed = FALSE; - if (!ha->flags.abort_isp_active && ha->flags.online) - { - ha->flags.abort_isp_active = TRUE; - - /* Disable ISP interrupts. */ - WRT_REG_WORD(®->ictrl, 0); - - /* Dequeue all commands in outstanding command list. */ - for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) - { - sp = ha->outstanding_cmds[cnt]; - if (sp) - { - ha->outstanding_cmds[cnt] = 0; - - /* Generate LU queue on controller, target, LUN */ - b = SCSI_BUS_32(sp->cmd); - t = SCSI_TCN_32(sp->cmd); - l = SCSI_LUN_32(sp->cmd); - - q = (scsi_lu_t *)LU_Q(ha, b, t, l); - - /* Reset outstanding command count. */ - q->q_outcnt = 0; - q->q_flag &= ~QLA1280_QBUSY; - q->q_flag = 0; - - /* Adjust watchdog timer for command. */ - /* if (sp->flags & SRB_WATCHDOG) - sp->timeout += 2; */ - - /* Place request back on top of device queue. */ - /* sp->flags &= ~(SRB_SENT | SRB_TIMEOUT); */ - sp->flags = 0; - qla1280_putq_t(q, sp); - } - } - - /* If firmware needs to be loaded */ - if (qla1280_isp_firmware(ha)) - { - if (!(status = qla1280_chip_diag(ha))) - status = qla1280_setup_chip(ha); - } - - if (!status) - { - /* Setup adapter based on NVRAM parameters. */ - qla1280_nvram_config(ha); - - if (!(status = qla1280_init_rings(ha))) - { - /* Issue SCSI reset. */ - for (b = 0; b < ha->ports; b++) - { - qla1280_bus_reset(ha, b); - } - do - { - /* Issue marker command. */ - ha->flags.reset_marker = FALSE; - for (b = 0; b < ha->ports; b++) - { - ha->bus_settings[b].reset_marker = FALSE; - qla1280_marker(ha, b, 0, 0, MK_SYNC_ALL); - } - }while (ha->flags.reset_marker); - - /* Enable host adapter target mode. */ - for (b = 0; b < ha->ports; b++) - { - if (!(status = qla1280_enable_tgt(ha, b))) - { - for (cnt = 0; cnt < MAX_LUNS; cnt++) - { - /* qla1280_enable_lun(ha, b, cnt); */ - qla1280_poll(ha); - } - } - else - break; - } - - if (!status) - { - /* Enable ISP interrupts. */ - WRT_REG_WORD(®->ictrl, ISP_EN_INT + ISP_EN_RISC); - ha->flags.abort_isp_active = FALSE; - /* Restart queues that may have been stopped. */ - qla1280_restart_queues(ha); - } - } - } - } - - if (status) - { - printk(KERN_WARNING - "qla1280: ISP error recovery failed, board disabled"); - qla1280_reset_adapter(ha); - qla1280_abort_queues(ha); - -#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) - qla1280_print("qla1280_abort_isp: **** FAILED ****\n\r"); -#endif - } -#ifdef QL_DEBUG_LEVEL_3 - else - LEAVE("qla1280_abort_isp"); -#endif - DRIVER_UNLOCK - - return(status); -} - -/* - * qla1280_restart_queues - * Restart all device queues. - * - * Input: - * ha = adapter block pointer. - */ -STATIC void -qla1280_restart_queues(scsi_qla_host_t *ha) +static int +qla1280_abort_isp(struct scsi_qla_host *ha) { - scsi_lu_t *q; - uint32_t b, t, l; + struct srb *sp; + int status = 0; + int cnt; + int bus; -#ifdef QL_DEBUG_LEVEL_3 - ENTER("qla1280_restart_queues"); -#endif - - for (b = 0; b < ha->ports; b++) - for (t = 0; t < MAX_TARGETS; t++) - for (l = 0; l < MAX_LUNS; l++) - { - q = (scsi_lu_t *) LU_Q(ha, b, t, l); - if (q != NULL) - { - /* Acquire LU queue specific lock */ - QLA1280_SCSILU_LOCK(q); + ENTER("qla1280_abort_isp"); - if (q->q_first) - qla1280_next(ha, q, b); - else - /* Release LU queue specific lock */ - QLA1280_SCSILU_UNLOCK(q); - } - } -#ifdef QL_DEBUG_LEVEL_3 - qla1280_print("qla1280_restart_queues: exiting normally\n"); -#endif -} + if (!ha->flags.abort_isp_active && ha->flags.online) { + struct device_reg *reg = ha->iobase; + ha->flags.abort_isp_active = 1; -/* - * qla1280_abort_queue_single - * Abort all commands on a device queues. - * - * Input: - * ha = adapter block pointer. - */ -STATIC void qla1280_abort_queue_single(scsi_qla_host_t *ha,uint32_t b,uint32_t t,uint32_t l,uint32_t stat) -{ - scsi_lu_t *q; - srb_t *sp, *sp_next; + /* Disable ISP interrupts. */ + qla1280_disable_intrs(ha); + WRT_REG_WORD(®->host_cmd, HC_PAUSE_RISC); + RD_REG_WORD(®->id_l); - ENTER("qla1280_abort_queue_single"); - q = (scsi_lu_t * )LU_Q(ha, b, t, l); - if (q != NULL) - { - /* Acquire LU queue specific lock */ - QLA1280_SCSILU_LOCK(q); + printk(KERN_INFO "scsi(%li): dequeuing outstanding commands\n", + ha->host_no); + /* Dequeue all commands in outstanding command list. */ + for (cnt = 0; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) { + Scsi_Cmnd *cmd; + sp = ha->outstanding_cmds[cnt]; + if (sp) { + + cmd = sp->cmd; + CMD_RESULT(cmd) = DID_RESET << 16; - sp = q->q_first; - q->q_first = q->q_last = NULL; + sp->cmd = NULL; + ha->outstanding_cmds[cnt] = NULL; - QLA1280_SCSILU_UNLOCK(q); + (*cmd->scsi_done)(cmd); - while (sp) - { - sp_next = sp->s_next; - CMD_RESULT(sp->cmd) = stat; - qla1280_done_q_put(sp, (srb_t **)&ha->done_q_first, (srb_t **)&ha->done_q_last); - sp = sp_next; - } - } - LEAVE("qla1280_abort_queue_single"); -} + sp->flags = 0; + } + } -/* - * qla1280_abort_queues - * Abort all commands on device queues. - * - * Input: - * ha = adapter block pointer. - */ -STATIC void -qla1280_abort_queues(scsi_qla_host_t *ha) -{ - uint32_t b, t, l; + /* If firmware needs to be loaded */ + if (qla1280_isp_firmware (ha)) { + if (!(status = qla1280_chip_diag(ha))) + status = qla1280_setup_chip(ha); + } - ENTER("qla1280_abort_queues"); + if (!status) { + /* Setup adapter based on NVRAM parameters. */ + qla1280_nvram_config (ha); + + if (!(status = qla1280_init_rings(ha))) { + /* Issue SCSI reset. */ + for (bus = 0; bus < ha->ports; bus++) { + qla1280_bus_reset(ha, bus); + } + /* + * qla1280_bus_reset() will do the marker + * dance - no reason to repeat here! + */ +#if 0 + /* Issue marker command. */ + ha->flags.reset_marker = 0; + for (bus = 0; bus < ha->ports; bus++) { + ha->bus_settings[bus]. + reset_marker = 0; + qla1280_marker(ha, bus, 0, 0, + MK_SYNC_ALL); + } +#endif + ha->flags.abort_isp_active = 0; + } + } + } - for (b = 0; b < ha->ports; b++) - for (t = 0; t < MAX_TARGETS; t++) - for (l = 0; l < MAX_LUNS; l++) - qla1280_abort_queue_single(ha,b,t,l,DID_RESET); + if (status) { + printk(KERN_WARNING + "qla1280: ISP error recovery failed, board disabled"); + qla1280_reset_adapter(ha); + dprintk(2, "qla1280_abort_isp: **** FAILED ****\n"); + } - LEAVE("qla1280_abort_queues"); + LEAVE("qla1280_abort_isp"); + return status; } + /* * qla1280_debounce_register * Debounce register. @@ -6151,28 +4824,27 @@ * Returns: * register value. */ -STATIC uint16_t -qla1280_debounce_register(volatile uint16_t *addr) +static u16 +qla1280_debounce_register(volatile u16 * addr) { - volatile uint16_t ret; - volatile uint16_t ret2; + volatile u16 ret; + volatile u16 ret2; - do - { - ret = RD_REG_WORD(addr); - ret2 = RD_REG_WORD(addr); - }while (ret != ret2); + ret = RD_REG_WORD(addr); + ret2 = RD_REG_WORD(addr); - return(ret); -} + if (ret == ret2) + return ret; + do { + cpu_relax(); + ret = RD_REG_WORD(addr); + ret2 = RD_REG_WORD(addr); + } while (ret != ret2); -/* - * Declarations for load module - */ -static Scsi_Host_Template driver_template = QLA1280_LINUX_TEMPLATE; + return ret; +} -#include "scsi_module.c" /************************************************************************ * qla1280_check_for_dead_scsi_bus * @@ -6181,638 +4853,309 @@ ************************************************************************/ #define SET_SXP_BANK 0x0100 #define SCSI_PHASE_INVALID 0x87FF -int qla1280_check_for_dead_scsi_bus(scsi_qla_host_t *ha, srb_t *sp) -{ - uint16_t config_reg, scsi_control; - device_reg_t *reg = ha->iobase; - uint32_t b; - Scsi_Cmnd *cp; - - /* - * If SCSI Bus is Dead because of bad termination, - * we will return a status of Selection timeout. - */ - - cp = sp->cmd; - b = SCSI_BUS_32(cp); - if (ha->bus_settings[b].scsi_bus_dead) - { - WRT_REG_WORD(®->host_cmd, HC_PAUSE_RISC); - config_reg = RD_REG_WORD(®->cfg_1); - WRT_REG_WORD(®->cfg_1,SET_SXP_BANK); - scsi_control = RD_REG_WORD(®->scsiControlPins); - WRT_REG_WORD(®->cfg_1,config_reg); - WRT_REG_WORD(®->host_cmd, HC_RELEASE_RISC); - - if (scsi_control == SCSI_PHASE_INVALID) - { - CMD_RESULT(cp) = DID_NO_CONNECT << 16; - CMD_HANDLE(cp) = (unsigned char *) 0; - /* ha->actthreads--; */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) - sti(); - (*(cp)->scsi_done)(cp); - cli(); -#else - (*(cp)->scsi_done)(cp); -#endif - return(TRUE); /* bus is dead */ - } - else - { - ha->bus_settings[b].scsi_bus_dead = FALSE; - ha->bus_settings[b].failed_reset_count= 0; - } - } - return(FALSE); /* bus is not dead */ -} - -STATIC uint8_t -qla12160_set_target_parameters(scsi_qla_host_t *ha, uint32_t b, uint32_t t, uint32_t l, nvram160_t *nv) +static int +qla1280_check_for_dead_scsi_bus(struct scsi_qla_host *ha, unsigned int bus) { - uint16_t mb[MAILBOX_REGISTER_COUNT]; + uint16_t config_reg, scsi_control; + struct device_reg *reg = ha->iobase; - /* Set Target Parameters. */ - mb[0] = MBC_SET_TARGET_PARAMETERS; - mb[1] = (uint16_t)(b ? t | BIT_7 :t); - mb[1] <<= 8; - mb[2] = nv->bus[b].target[t].parameter.c << 8; - mb[2] |= TP_AUTO_REQUEST_SENSE; - mb[2] &= ~TP_STOP_QUEUE; - mb[2] |= (nv->bus[b].target[t].flags.enable_ppr << 5); - mb[3] = nv->bus[b].target[t].flags.sync_offset << 8; - mb[3] |= nv->bus[b].target[t].sync_period; + if (ha->bus_settings[bus].scsi_bus_dead) { + WRT_REG_WORD(®->host_cmd, HC_PAUSE_RISC); + config_reg = RD_REG_WORD(®->cfg_1); + WRT_REG_WORD(®->cfg_1, SET_SXP_BANK); + scsi_control = RD_REG_WORD(®->scsiControlPins); + WRT_REG_WORD(®->cfg_1, config_reg); + WRT_REG_WORD(®->host_cmd, HC_RELEASE_RISC); - mb[6] = nv->bus[b].target[t].flags.ppr_options << 8; - mb[6] |= nv->bus[b].target[t].flags.ppr_bus_width; - return( qla1280_mailbox_command(ha, BIT_6|BIT_3|BIT_2|BIT_1|BIT_0, &mb[0]) ) ; + if (scsi_control == SCSI_PHASE_INVALID) { + ha->bus_settings[bus].scsi_bus_dead = 1; +#if 0 + CMD_RESULT(cp) = DID_NO_CONNECT << 16; + CMD_HANDLE(cp) = INVALID_HANDLE; + /* ha->actthreads--; */ + + (*(cp)->scsi_done)(cp); +#endif + return 1; /* bus is dead */ + } else { + ha->bus_settings[bus].scsi_bus_dead = 0; + ha->bus_settings[bus].failed_reset_count = 0; + } + } + return 0; /* bus is not dead */ } -STATIC void -qla12160_get_target_parameters(scsi_qla_host_t *ha, uint32_t b, uint32_t t, uint32_t l) +static void +qla12160_get_target_parameters(struct scsi_qla_host *ha, Scsi_Device *device) { - uint16_t mb[MAILBOX_REGISTER_COUNT]; + uint16_t mb[MAILBOX_REGISTER_COUNT]; + int bus, target, lun; - mb[0] = MBC_GET_TARGET_PARAMETERS; - mb[1] = (uint16_t)(b ? t | BIT_7 :t); - mb[1] <<= 8; - qla1280_mailbox_command(ha, BIT_6|BIT_3|BIT_2|BIT_1|BIT_0, &mb[0]); - if( mb[3] != 0 ) - printk(KERN_INFO "scsi(%d:%d:%d:%d): Synchronous tranfer at period %d, offset %d. \n", - (int)ha->host_no, b, t, l, (mb[3] &0xff), (mb[3] >> 8)); + bus = device->channel; + target = device->id; + lun = device->lun; - if ( (mb[2] & BIT_5) && ((mb[6] >> 8) & 0xff) >= 2 ) - printk(KERN_INFO "scsi(%d:%d:%d:%d): Dual Transition enabled.\n", - (int)ha->host_no, b, t, l); -} + mb[0] = MBC_GET_TARGET_PARAMETERS; + mb[1] = (uint16_t) (bus ? target | BIT_7 : target); + mb[1] <<= 8; + qla1280_mailbox_command(ha, BIT_6 | BIT_3 | BIT_2 | BIT_1 | BIT_0, + &mb[0]); -#ifdef QL_DEBUG_ROUTINES -/****************************************************************************/ -/* Driver Debug Functions. */ -/****************************************************************************/ + printk(KERN_INFO "scsi(%li:%d:%d:%d):", ha->host_no, bus, target, lun); -/* - * Get byte from I/O port - */ -STATIC uint8_t -qla1280_getbyte(uint8_t *port) -{ - uint8_t ret; + if (mb[3] != 0) { + printk(" Sync: period %d, offset %d", + (mb[3] & 0xff), (mb[3] >> 8)); + if (mb[2] & BIT_13) + printk(", Wide"); + if ((mb[2] & BIT_5) && ((mb[6] >> 8) & 0xff) >= 2) + printk(", DT"); + } else + printk(" Async"); -#if MEMORY_MAPPED_IO - ret = *port; -#else - ret = inb((int)port); -#endif - - if (ql_debug_print) - { - qla1280_print("qla1280_getbyte: address = "); - qla1280_output_number((uint32_t)port, 16); - qla1280_print(" data = 0x"); - qla1280_output_number((uint32_t)ret, 16); - qla1280_print("\n\r"); - } - - return(ret); + if (DEV_SIMPLE_TAGS(device)) + printk(", Tagged queuing: depth %d", device->queue_depth); + printk("\n"); } -/* - * Get word from I/O port - */ -STATIC uint16_t -qla1280_getword(uint16_t *port) -{ - uint16_t ret; -#if MEMORY_MAPPED_IO - ret = *port; -#else - ret = inw((int)port); -#endif - - if (ql_debug_print) - { - qla1280_print("qla1280_getword: address = "); - qla1280_output_number((uint32_t)port, 16); - qla1280_print(" data = 0x"); - qla1280_output_number((uint32_t)ret, 16); - qla1280_print("\n\r"); - } - - return(ret); -} - -/* - * Get double word from I/O port - */ -STATIC uint32_t -qla1280_getdword(uint32_t *port) +#if DEBUG_QLA1280 +static void +__qla1280_dump_buffer(char *b, int size) { - uint32_t ret; + int cnt; + u8 c; -#if MEMORY_MAPPED_IO - ret = *port; -#else - ret = inl((int)port); -#endif + printk(KERN_DEBUG " 0 1 2 3 4 5 6 7 8 9 Ah " + "Bh Ch Dh Eh Fh\n"); + printk(KERN_DEBUG "---------------------------------------------" + "------------------\n"); - if (ql_debug_print) - { - qla1280_print("qla1280_getdword: address = "); - qla1280_output_number((uint32_t)port, 16); - qla1280_print(" data = 0x"); - qla1280_output_number((uint32_t)ret, 16); - qla1280_print("\n\r"); - } + for (cnt = 0; cnt < size;) { + c = *b++; - return(ret); -} - -/* - * Send byte to I/O port - */ -STATIC void -qla1280_putbyte(uint8_t *port, uint8_t data) -{ -#if MEMORY_MAPPED_IO - *port = data; -#else - outb(data, (int)port); -#endif - - if (ql_debug_print) - { - qla1280_print("qla1280_putbyte: address = "); - qla1280_output_number((uint32_t)port, 16); - qla1280_print(" data = 0x"); - qla1280_output_number((uint32_t)data, 16); - qla1280_print("\n\r"); - } -} - -/* - * Send word to I/O port - */ -STATIC void -qla1280_putword(uint16_t *port, uint16_t data) -{ -#if MEMORY_MAPPED_IO - *port = data; -#else -#ifdef _LINUX_IOPORTS - outw(data, (int)port); -#else - outw((int)port, data); -#endif -#endif - - if (ql_debug_print) - { - qla1280_print("qla1280_putword: address = "); - qla1280_output_number((uint32_t)port, 16); - qla1280_print(" data = 0x"); - qla1280_output_number((uint32_t)data, 16); - qla1280_print("\n\r"); - } -} - -/* - * Send double word to I/O port - */ -STATIC void -qla1280_putdword(uint32_t *port, uint32_t data) -{ -#if MEMORY_MAPPED_IO - *port = data; -#else -#ifdef _LINUX_IOPORTS - outl(data,(int)port); -#else - outl((int)port, data); -#endif -#endif - - if (ql_debug_print) - { - qla1280_print("qla1280_putdword: address = "); - qla1280_output_number((uint32_t)port, 16); - qla1280_print(" data = 0x"); - qla1280_output_number((uint32_t)data, 16); - qla1280_print("\n\r"); - } -} - -/* - * Dummy function to prevent warnings for - * declared and unused debug functions - */ -void -qla1280_debug(void) -{ - qla1280_getbyte(0); - qla1280_getword(0); - qla1280_getdword(0); - qla1280_putbyte(0, 0); - qla1280_putword(0, 0); - qla1280_putdword(0, 0); + printk("0x%02x", c); + cnt++; + if (!(cnt % 16)) + printk("\n"); + else + printk(" "); + } + if (cnt % 16) + printk("\n"); } -/* - * Out character to COM2 port. - * PORT must be at standard address for COM2 = 0x2F8, - * or COM1 = 0x3F8 - */ -#define OUTB(addr,data) outb((data),(addr)) - -STATIC void -qla1280_putc(uint8_t c) -{ -#ifdef QL_DEBUG_CONSOLE - printk("%c", c); -#else - int com_addr = 0x2f8; - int hardware_flow_control = 1; - int software_flow_control = 0; - uint8_t data; - - /* Wait for transmitter holding and shift registers for empty. */ - do - { - data = inb(com_addr+5); - }while (!(data & BIT_6)); - - /* - * Set BAUD rate for COM2 to 19200 (0x6) - */ - - /* Select rate divisor. */ - OUTB(com_addr+3, 0x83); - - /* BAUD rate divisor LSB. */ - OUTB(com_addr, 0xc); /* 0xC = 9600 baud */ - - /* BAUD rate divisor MSB. */ - OUTB(com_addr+1, 0); - - /* Set No parity, 8 bits, 1 stop bit and - select interrupt enable register. */ - OUTB(com_addr+3, 3); - - /* Disable interrupts. */ - OUTB(com_addr+1, 0); - - /* Set data terminal ready and request to send */ - OUTB(com_addr+4,3); - - if (hardware_flow_control) - { - /* Wait for clear-to-send and data-set-ready */ - do - { - data = inb(com_addr+6) & (BIT_5 + BIT_4); - }while (data != (BIT_5 + BIT_4)); - } - else if (software_flow_control) - { - /* Test for data ready. */ - data = inb(com_addr+5); - if (data & BIT_0) - { - /* If XOFF */ - data = inb(com_addr); - if (data == '\023') - { - /* Wait for XON */ - do - { - /* Wait for char */ - do - { - data = inb(com_addr+5); - }while (!(data & BIT_0)); - data = inb(com_addr); - }while (data != '\021'); - } - } - } - - /* Output character. */ - OUTB(com_addr, c); -#endif -} - -/* - * Out NULL terminated string to COM port. - */ -STATIC void -qla1280_print(caddr_t s) -{ - if (ql_debug_print) - { -#ifdef QL_DEBUG_CONSOLE - printk("%s",s); -#else - /* Output string. */ - while (*s) - qla1280_putc(*s++); -#endif - } -} - -/* - * Output long number to COM port. - */ -STATIC void -qla1280_output_number(uint32_t n, uint8_t base) -{ - int8_t str[12]; - int8_t *s = &str[11]; - int8_t output = 0; - int8_t hex = FALSE; - - if (ql_debug_print) - { - if (base == 10 || base == 16) - { - if (base == 16 && n > 9) - hex = TRUE; - - *s = 0; - do - { - s--; - *s = n % base; - if (*s > 9) - *s += 55; - else - *s += '0'; - n /= base; - }while (n); - - for (; *s; s++) - { - if (*s != '0') - output = 1; - if (output) - qla1280_putc(*s); - } - if (!output) - qla1280_putc(*--s); - - if (hex) - qla1280_putc('h'); - } - } -} - -STATIC void -qla1280_dump_buffer(caddr_t b, uint32_t size) -{ - uint32_t cnt; - uint8_t c; - - if (ql_debug_print) - { - qla1280_print( - " 0 1 2 3 4 5 6 7 8 9 Ah Bh Ch Dh Eh Fh\n\r"); - qla1280_print( - "---------------------------------------------------------------\n\r"); - - for (cnt = 0; cnt < size; ) - { - c = *b++; - if (c < 16) - qla1280_putc(' '); - qla1280_output_number((uint32_t)c, 16); - cnt++; - if (!(cnt % 16)) - qla1280_print("\n\r"); - else if (c < 10) - qla1280_print(" "); - else - qla1280_putc(' '); - } - if (cnt % 16) - qla1280_print("\n\r"); - } -} /************************************************************************** * ql1280_print_scsi_cmd * **************************************************************************/ -void qla1280_print_scsi_cmd(Scsi_Cmnd *cmd) +static void +__qla1280_print_scsi_cmd(Scsi_Cmnd * cmd) { - scsi_qla_host_t *ha; - struct Scsi_Host *host = cmd->host; - srb_t *sp; - /* struct scatterlist *sg; */ - - int i; - ha = (scsi_qla_host_t *) host->hostdata; - - ql_debug_print = 1; - sp = (srb_t *) CMD_SP(cmd); - sprintf(debug_buff,"SCSI Command @= 0x%p, Handle=0x%p\n\r", cmd, CMD_HANDLE(cmd)); - qla1280_print(debug_buff); - sprintf(debug_buff," chan=%d, target = 0x%02x, lun = 0x%02x, cmd_len = 0x%02x\n\r", - cmd->channel, cmd->target, cmd->lun, cmd->cmd_len); - qla1280_print(debug_buff); - qla1280_print(" CDB = "); - for (i = 0; i < cmd->cmd_len; i++) - { - sprintf(debug_buff,"0x%02x ", cmd->cmnd[i]); - qla1280_print(debug_buff); - } - sprintf(debug_buff," seg_cnt =%d\n\r",cmd->use_sg); - qla1280_print(debug_buff); - sprintf(debug_buff," request buffer=0x%p, request buffer len=0x%x\n\r",cmd->request_buffer,cmd->request_bufflen); - qla1280_print(debug_buff); - /* if( cmd->use_sg ) - { - sg = (struct scatterlist *) cmd->request_buffer; - qla1280_print(" SG buffer: \n\r"); - qla1280_dump_buffer((caddr_t)sg, (cmd->use_sg*sizeof(struct scatterlist)) ); - } */ - sprintf(debug_buff," tag=%d, flags=0x%x, transfersize=0x%x \n\r", - cmd->tag, cmd->flags,cmd->transfersize ); - qla1280_print(debug_buff); - sprintf(debug_buff," Pid=%d, SP=0x%p\n\r", (int)cmd->pid, CMD_SP(cmd)); - qla1280_print(debug_buff); - sprintf(debug_buff," r_start=0x%lx, u_start=0x%lx\n\r",sp->r_start,sp->u_start); - qla1280_print(debug_buff); - sprintf(debug_buff," underflow size = 0x%x, direction=0x%x, req.cmd=0x%x \n\r", cmd->underflow, sp->dir,cmd->request.cmd); - qla1280_print(debug_buff); + struct scsi_qla_host *ha; + struct Scsi_Host *host = CMD_HOST(cmd); + struct srb *sp; + /* struct scatterlist *sg; */ + + int i; + ha = (struct scsi_qla_host *)host->hostdata; + + sp = (struct srb *)CMD_SP(cmd); + printk("SCSI Command @= 0x%p, Handle=0x%p\n", cmd, CMD_HANDLE(cmd)); + printk(" chan=%d, target = 0x%02x, lun = 0x%02x, cmd_len = 0x%02x\n", + SCSI_BUS_32(cmd), SCSI_TCN_32(cmd), SCSI_LUN_32(cmd), + CMD_CDBLEN(cmd)); + printk(" CDB = "); + for (i = 0; i < cmd->cmd_len; i++) { + printk("0x%02x ", cmd->cmnd[i]); + } + printk(" seg_cnt =%d\n", cmd->use_sg); + printk(" request buffer=0x%p, request buffer len=0x%x\n", + cmd->request_buffer, cmd->request_bufflen); + /* if (cmd->use_sg) + { + sg = (struct scatterlist *) cmd->request_buffer; + printk(" SG buffer: \n"); + qla1280_dump_buffer(1, (char *)sg, (cmd->use_sg*sizeof(struct scatterlist))); + } */ + printk(" tag=%d, flags=0x%x, transfersize=0x%x \n", + cmd->tag, cmd->flags, cmd->transfersize); + printk(" Pid=%li, SP=0x%p\n", cmd->pid, CMD_SP(cmd)); + printk(" underflow size = 0x%x, direction=0x%x\n", + cmd->underflow, sp->dir); } + /************************************************************************** * ql1280_dump_device * **************************************************************************/ -void -ql1280_dump_device(scsi_qla_host_t *ha) +static void +ql1280_dump_device(struct scsi_qla_host *ha) { - Scsi_Cmnd *cp; - srb_t *sp; - int i; - qla1280_print("Outstanding Commands on controller:\n\r"); - for ( i=0; i < MAX_OUTSTANDING_COMMANDS; i++ ) - { - if( (sp = ha->outstanding_cmds[i]) == NULL ) - continue; - if( (cp = sp->cmd) == NULL ) - continue; - qla1280_print_scsi_cmd(cp); - } + Scsi_Cmnd *cp; + struct srb *sp; + int i; -} -#endif + printk(KERN_DEBUG "Outstanding Commands on controller:\n"); -#ifdef QLA1280_UNUSED -/************************************************************************** - * ql1280_dump_regs - * - **************************************************************************/ -static void qla1280_dump_regs(struct Scsi_Host *host) -{ - printk("Mailbox registers:\n"); - printk("qla1280 : mbox 0 0x%04x \n", inw(host->io_port + 0x70)); - printk("qla1280 : mbox 1 0x%04x \n", inw(host->io_port + 0x72)); - printk("qla1280 : mbox 2 0x%04x \n", inw(host->io_port + 0x74)); - printk("qla1280 : mbox 3 0x%04x \n", inw(host->io_port + 0x76)); - printk("qla1280 : mbox 4 0x%04x \n", inw(host->io_port + 0x78)); - printk("qla1280 : mbox 5 0x%04x \n", inw(host->io_port + 0x7a)); + for (i = 0; i < MAX_OUTSTANDING_COMMANDS; i++) { + if ((sp = ha->outstanding_cmds[i]) == NULL) + continue; + if ((cp = sp->cmd) == NULL) + continue; + qla1280_print_scsi_cmd(1, cp); + } } #endif +enum tokens { + TOKEN_NVRAM, + TOKEN_SYNC, + TOKEN_WIDE, + TOKEN_PPR, + TOKEN_VERBOSE, + TOKEN_DEBUG, +}; + +struct setup_tokens { + char *token; + int val; +}; + +static struct setup_tokens setup_token[] __initdata = +{ + { "nvram", TOKEN_NVRAM }, + { "sync", TOKEN_SYNC }, + { "wide", TOKEN_WIDE }, + { "ppr", TOKEN_PPR }, + { "verbose", TOKEN_VERBOSE }, + { "debug", TOKEN_DEBUG }, +}; + -#if STOP_ON_ERROR /************************************************************************** - * ql1280_panic + * qla1280_setup * + * Handle boot parameters. This really needs to be changed so one + * can specify per adapter parameters. **************************************************************************/ -static void qla1280_panic(char *cp, struct Scsi_Host *host) +static int __init +qla1280_setup(char *s) { - scsi_qla_host_t *ha; - long *fp; + char *cp, *ptr; + unsigned long val; + int toke; + + cp = s; + + while (cp && (ptr = strchr(cp, ':'))) { + ptr++; + if (!strcmp(ptr, "yes")) { + val = 0x10000; + ptr += 3; + } else if (!strcmp(ptr, "no")) { + val = 0; + ptr += 2; + } else + val = simple_strtoul(ptr, &ptr, 0); + + switch ((toke = qla1280_get_token(cp))) { + case TOKEN_NVRAM: + if (!val) + driver_setup.no_nvram = 1; + break; + case TOKEN_SYNC: + if (!val) + driver_setup.no_sync = 1; + else if (val != 0x10000) + driver_setup.sync_mask = val; + break; + case TOKEN_WIDE: + if (!val) + driver_setup.no_wide = 1; + else if (val != 0x10000) + driver_setup.wide_mask = val; + break; + case TOKEN_PPR: + if (!val) + driver_setup.no_ppr = 1; + else if (val != 0x10000) + driver_setup.ppr_mask = val; + break; + case TOKEN_VERBOSE: + qla1280_verbose = val; + break; + default: + printk(KERN_INFO "qla1280: unknown boot option %s\n", + cp); + } - ha = (scsi_qla_host_t *) host->hostdata; - printk("qla1280 - PANIC: %s\n",cp); - printk("Current time=0x%lx\n", jiffies); - printk("Number of pending commands =0x%lx\n", ha->actthreads); - printk("Number of SCSI 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); - DEBUG2(ql_debug_print = 1;) - /* DEBUG2(ql1280_dump_device((scsi_qla_host_t *) host->hostdata)); */ -#ifdef QLA1280_UNUSED - qla1280_dump_regs(host); -#endif - sti(); - panic("Ooops"); - /* cli(); - for(;;) - { - barrier(); - sti(); - } - */ + cp = strchr(ptr, ';'); + if (cp) + cp++; + else { + break; + } + } + return 1; } -#endif -#ifdef QLA1280_UNUSED -static void qla1280_set_flags(char * s) + +static int +qla1280_get_token(char *str) { + char *sep; + long ret = -1; + int i, len; + + len = sizeof(setup_token)/sizeof(struct setup_tokens); + + sep = strchr(str, ':'); + + if (sep) { + for (i = 0; i < len; i++){ + + if (!strncmp(setup_token[i].token, str, (sep - str))) { + ret = setup_token[i].val; + break; + } + } + } + + return ret; } + + +static Scsi_Host_Template driver_template = { + .proc_info = qla1280_proc_info, + .name = "Qlogic ISP 1280/12160", + .detect = qla1280_detect, + .release = qla1280_release, + .info = qla1280_info, + .queuecommand = qla1280_queuecommand, +#if LINUX_VERSION_CODE >= 0x020545 + .slave_configure = qla1280_slave_configure, +#endif + .eh_abort_handler = qla1280_eh_abort, + .eh_device_reset_handler= qla1280_eh_device_reset, + .eh_bus_reset_handler = qla1280_eh_bus_reset, + .eh_host_reset_handler = qla1280_eh_adapter_reset, + .bios_param = qla1280_biosparam, + .can_queue = 255, + .this_id = -1, + .sg_tablesize = SG_ALL, + .cmd_per_lun = 3, + .use_clustering = ENABLE_CLUSTERING, +#if LINUX_VERSION_CODE < 0x020545 + .use_new_eh_code = 1, #endif +}; -/************************************************************************** - * qla1280_setup - * - * Handle Linux boot parameters. This routine allows for assigning a value - * to a parameter with a ':' between the parameter and the value. - * ie. qla1280=max_reqs:0x0A,verbose - **************************************************************************/ -void -qla1280_setup(char *s, int *dummy) -{ - char *end, *str, *cp; +#include "scsi_module.c" -#ifdef QLA1280_UNUSED - static struct - { - const char *name; - int siz; - void (*func)(); - int arg; - } options[] = - { - { "dump_regs", 9, &qla1280_dump_regs, 0 - }, - { "verbose", 7, &qla1280_set_flags, 0x1 - }, - { "", 0, NULL, 0 - } - }; -#endif - - printk("scsi: Processing Option str = %s\n", s); - end = strchr(s, '\0'); - /* locate command */ - str = s; - for( cp = s; *cp && cp != end; cp++ ) - { - cp = qla1280_get_token(cp, str); - printk("scsi: token str = %s\n", str); - /* if found execute routine */ - - } - -} - -static char *qla1280_get_token(char *cmdline, char *str ) -{ - register char *cp = cmdline; - - /* skip preceeding spaces */ - while(strchr(cp,' ')) - ++cp; - /* symbol starts here */ - str = cp; - /* skip char if not a space or : */ - while (*cp && !( strchr(cp,' ') || strchr(cp,':')) ) - cp++; - *cp = '\0'; - return( cp ); -} -MODULE_LICENSE("GPL"); /* * Overrides for Emacs so that we almost follow Linus's tabbing style. @@ -6821,15 +5164,7 @@ * of the file. * --------------------------------------------------------------------------- * Local variables: - * c-indent-level: 2 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -2 - * c-argdecl-indent: 2 - * c-label-offset: -2 - * c-continued-statement-offset: 2 - * c-continued-brace-offset: 0 - * indent-tabs-mode: nil + * c-basic-offset: 8 * tab-width: 8 * End: */ - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/qla1280.h linux-2.4.23-pre8/drivers/scsi/qla1280.h --- linux-2.4.22/drivers/scsi/qla1280.h 2001-09-17 20:16:31.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/qla1280.h 2003-10-22 22:49:51.000000000 +0000 @@ -1,1447 +1,963 @@ -/************************************************************************* - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP1x80/1x160 device driver for Linux 2.3.x (redhat 6.x). - * - * COPYRIGHT (C) 1996-2000 QLOGIC CORPORATION - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the Qlogic's Linux Software License. - * - * This program is WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistribution's or source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - *****************************************************************************/ - -/************************************************************************************* - QLOGIC CORPORATION SOFTWARE - "GNU" GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION - AND MODIFICATION - -This GNU General Public License ("License") applies solely to QLogic Linux -Software ("Software") and may be distributed under the terms of this License. - -1. You may copy and distribute verbatim copies of the Software's source code as -you receive it, in any medium, provided that you conspicuously and appropriately -publish on each copy an appropriate copyright notice and disclaimer of warranty; -keep intact all the notices that refer to this License and to the absence of any -warranty; and give any other recipients of the Software a copy of this License along -with the Software. - -You may charge a fee for the physical act of transferring a copy, and you may at your -option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Software or any portion of it, thus forming -a work based on the Software, and copy and distribute such modifications or work under -the terms of Section 1 above, provided that you also meet all of these conditions: - -* a) You must cause the modified files to carry prominent notices stating that you -changed the files and the date of any change. - -* b) You must cause any work that you distribute or publish that in whole or in part -contains or is derived from the Software or any part thereof, to be licensed as a -whole at no charge to all third parties under the terms of this License. - -* c) If the modified Software normally reads commands interactively when run, you -must cause it, when started running for such interactive use in the most ordinary way, -to print or display an announcement including an appropriate copyright notice and a -notice that there is no warranty (or else, saying that you provide a warranty) and that -users may redistribute the Software under these conditions, and telling the user how to -view a copy of this License. (Exception:if the Software itself is interactive but does -not normally print such an announcement, your work based on the Software is not required -to print an announcement.) - -These requirements apply to the modified work as a whole. If identifiable sections of -that work are not derived from the Software, and can be reasonably considered independent -and separate works in themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you distribute the same -sections as part of a whole which is a work based on the Software, the distribution of the -whole must be on the terms of this License, whose permissions for other licensees extend -to the entire whole, and thus to each and every part regardless of who wrote it. - -3. You may copy and distribute the Software (or a work based on it, under Section 2) in -object code or executable form under the terms of Sections 1 and 2 above provided that -you also do one of the following: - -* a) Accompany it with the complete corresponding machine-readable source code, which must -be distributed under the terms of Sections 1 and 2 above on a medium customarily used for -software interchange; or, - -* b) Accompany it with a written offer, valid for at least three years, to give any third -party, for a charge no more than your cost of physically performing source distribution, -a complete machine-readable copy of the corresponding source code, to be distributed under -the terms of Sections 1 and 2 above on a medium customarily used for software interchange; -or, - -* c) Accompany it with the information you received as to the offer to distribute -corresponding source code. (This alternative is allowed only for noncommercial distribution -and only if you received the Software in object code or executable form with such an offer, -in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for making modifications -to it. For an executable work, complete source code means all the source code for all -modules it contains, plus any associated interface definition files, plus the scripts used -to control compilation and installation of the executable. - -If distribution of executable or object code is made by offering access to copy from a -designated place, then offering equivalent access to copy the source code from the same -place counts as distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - -4. You may not copy, modify, sublicense, or distribute the Software except as expressly -provided under this License. Any attempt otherwise to copy, modify, sublicense or -distribute the Software is void, and will automatically terminate your rights under this -License. However, parties who have received copies, or rights, from you under this License -will not have their licenses terminated so long as such parties remain in full compliance. - -5. This license grants you world wide, royalty free non-exclusive rights to modify or -distribute the Software or its derivative works. These actions are prohibited by law -if you do not accept this License. Therefore, by modifying or distributing the Software -(or any work based on the Software), you indicate your acceptance of this License to do -so, and all its terms and conditions for copying, distributing or modifying the Software -or works based on it. - -6. Each time you redistribute the Software (or any work based on the Software), the -recipient automatically receives a license from the original licensor to copy, distribute -or modify the Software subject to these terms and conditions. You may not impose any -further restrictions on the recipients' exercise of the rights granted herein. You are -not responsible for enforcing compliance by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement or for -any other reason (not limited to patent issues), conditions are imposed on you -(whether by court order, agreement or otherwise) that contradict the conditions of this -License, they do not excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this License -and any other pertinent obligations, then as a consequence you may not distribute the -Software at all. - -If any portion of this section is held invalid or unenforceable under any particular -circumstance, the balance of the section is intended to apply and the section as a whole -is intended to apply in other circumstances. -NO WARRANTY - -11. THE SOFTWARE IS PROVIDED WITHOUT A WARRANTY OF ANY KIND. THERE IS NO -WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, -EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE -ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. -SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL -NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE SOFTWARE AS PERMITTED ABOVE, BE LIABLE TO YOU FOR -DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL -DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING -BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR -LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE SOFTWARE TO -OPERATE WITH ANY OTHER SOFTWARES), EVEN IF SUCH HOLDER OR OTHER PARTY HAS -BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -END OF TERMS AND CONDITIONS - -*************************************************************************************/ - - -#ifndef _IO_HBA_QLA1280_H /* wrapper symbol for kernel use */ -#define _IO_HBA_QLA1280_H /* subject to change without notice */ +/****************************************************************************** +* QLOGIC LINUX SOFTWARE +* +* QLogic ISP1280 (Ultra2) /12160 (Ultra3) SCSI driver +* Copyright (C) 2000 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. +* +******************************************************************************/ -#if defined(__cplusplus) -extern "C" { -#endif +#ifndef _IO_HBA_QLA1280_H /* wrapper symbol for kernel use */ +#define _IO_HBA_QLA1280_H /* subject to change without notice */ -#include - -/* - * Enable define statement to ignore Data Underrun Errors, - * remove define statement to enable detection. - */ -/* #define DATA_UNDERRUN_ERROR_DISABLE */ - -/* - * Driver debug definitions. - */ -/* #define QL_DEBUG_LEVEL_1 */ /* Output register accesses to COM2. */ -/* #define QL_DEBUG_LEVEL_2 */ /* Output error msgs to COM2. */ -/* #define QL_DEBUG_LEVEL_3 */ /* Output function trace msgs to COM2. */ -/* #define QL_DEBUG_LEVEL_4 */ /* Output NVRAM trace msgs to COM2. */ -/* #define QL_DEBUG_LEVEL_5 */ /* Output ring trace msgs to COM2. */ -/* #define QL_DEBUG_LEVEL_6 */ /* Output WATCHDOG timer trace to COM2. */ -/* #define QL_DEBUG_LEVEL_7 */ /* Output RISC load trace msgs to COM2. */ - -#define QL_DEBUG_CONSOLE /* Output to console instead of COM2. */ - -#ifndef TRUE -# define TRUE 1 -#endif -#ifndef FALSE -# define FALSE 0 -#endif - - -#ifndef KERNEL_VERSION -# define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z)) -#endif - -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,1,92) -# if defined(__sparc_v9__) || defined(__powerpc__) -# error "PPC and Sparc platforms are only support under 2.1.92 and above" -# endif -#endif - - -/* - * Locking - */ -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,0) -# include -# include -# define cpuid smp_processor_id() -# if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) -# define DRIVER_LOCK_INIT \ - spin_lock_init(&ha->spin_lock); -# define DRIVER_LOCK \ - if(!ha->cpu_lock_count[cpuid]) { \ - spin_lock_irqsave(&ha->spin_lock, cpu_flags); \ - ha->cpu_lock_count[cpuid]++; \ - } else { \ - ha->cpu_lock_count[cpuid]++; \ - } -# define DRIVER_UNLOCK \ - if(--ha->cpu_lock_count[cpuid] == 0) \ - spin_unlock_irqrestore(&ha->spin_lock, cpu_flags); -# else -# define DRIVER_LOCK_INIT -# define DRIVER_LOCK -# define DRIVER_UNLOCK -# endif -#else -# define cpuid 0 -# define DRIVER_LOCK_INIT -# define DRIVER_LOCK \ - save_flags(cpu_flags); \ - cli(); -# define DRIVER_UNLOCK \ - restore_flags(cpu_flags); -# define le32_to_cpu(x) (x) -# define cpu_to_le32(x) (x) -#endif +#ifndef HOSTS_C /* included in hosts.c */ /* * Data bit definitions. */ -#define BIT_0 0x1 -#define BIT_1 0x2 -#define BIT_2 0x4 -#define BIT_3 0x8 -#define BIT_4 0x10 -#define BIT_5 0x20 -#define BIT_6 0x40 -#define BIT_7 0x80 -#define BIT_8 0x100 -#define BIT_9 0x200 -#define BIT_10 0x400 -#define BIT_11 0x800 -#define BIT_12 0x1000 -#define BIT_13 0x2000 -#define BIT_14 0x4000 -#define BIT_15 0x8000 -#define BIT_16 0x10000 -#define BIT_17 0x20000 -#define BIT_18 0x40000 -#define BIT_19 0x80000 -#define BIT_20 0x100000 -#define BIT_21 0x200000 -#define BIT_22 0x400000 -#define BIT_23 0x800000 -#define BIT_24 0x1000000 -#define BIT_25 0x2000000 -#define BIT_26 0x4000000 -#define BIT_27 0x8000000 -#define BIT_28 0x10000000 -#define BIT_29 0x20000000 -#define BIT_30 0x40000000 -#define BIT_31 0x80000000 - -/* - * Common size type definitions - */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned long uint32_t; -typedef char int8_t; -typedef short int16_t; -typedef long int32_t; -#endif - -/* - * Local Macro Definitions. - */ -#if defined(QL_DEBUG_LEVEL_1) || defined(QL_DEBUG_LEVEL_2) || \ - defined(QL_DEBUG_LEVEL_3) || defined(QL_DEBUG_LEVEL_4) || \ - defined(QL_DEBUG_LEVEL_5) || defined(QL_DEBUG_LEVEL_6) || \ - defined(QL_DEBUG_LEVEL_7) - #define QL_DEBUG_ROUTINES -#endif - -/* - * I/O port macros -*/ -#define LINUX_IOPORTS /* Linux in/out routines are define*/ - /* differently from other OSs */ -/* #define MEMORY_MAPPED_IO */ /* Enable memory mapped I/O */ -#undef MEMORY_MAPPED_IO /* Disable memory mapped I/O */ - -#ifdef QL_DEBUG_LEVEL_1 -#define RD_REG_BYTE(addr) qla1280_getbyte((uint8_t *)addr) -#define RD_REG_WORD(addr) qla1280_getword((uint16_t *)addr) -#define RD_REG_DWORD(addr) qla1280_getdword((uint32_t *)addr) -#define WRT_REG_BYTE(addr, data) qla1280_putbyte((uint8_t *)addr, data) -#define WRT_REG_WORD(addr, data) qla1280_putword((uint16_t *)addr, data) -#define WRT_REG_DWORD(addr, data) qla1280_putdword((uint32_t *)addr, data) -#else /* QL_DEBUG_LEVEL_1 */ -#ifdef MEMORY_MAPPED_IO - #define RD_REG_BYTE(addr) readb((unsigned long) (addr) - #define RD_REG_WORD(addr) readw((unsigned long) (addr) - #define RD_REG_DWORD(addr) readl((unsigned long) (addr) - #define WRT_REG_BYTE(addr, data) writeb((data), (unsigned long) (addr)) - #define WRT_REG_WORD(addr, data) writew((data), (unsigned long) (addr)) - #define WRT_REG_DWORD(addr, data) writel((data), (unsigned long) (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)) -#ifdef LINUX_IOPORTS -/* Parameters are reversed in Linux */ -#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)) -#else -#define WRT_REG_BYTE(addr, data) (outb((unsigned long)addr, data)) -#define WRT_REG_WORD(addr, data) (outw((unsigned long)addr, data)) -#define WRT_REG_DWORD(addr, data) (outl((unsigned long)addr, data)) -#endif -#endif /* MEMORY_MAPPED_IO */ -#endif /* QL_DEBUG_LEVEL_1 */ +#define BIT_0 0x1 +#define BIT_1 0x2 +#define BIT_2 0x4 +#define BIT_3 0x8 +#define BIT_4 0x10 +#define BIT_5 0x20 +#define BIT_6 0x40 +#define BIT_7 0x80 +#define BIT_8 0x100 +#define BIT_9 0x200 +#define BIT_10 0x400 +#define BIT_11 0x800 +#define BIT_12 0x1000 +#define BIT_13 0x2000 +#define BIT_14 0x4000 +#define BIT_15 0x8000 +#define BIT_16 0x10000 +#define BIT_17 0x20000 +#define BIT_18 0x40000 +#define BIT_19 0x80000 +#define BIT_20 0x100000 +#define BIT_21 0x200000 +#define BIT_22 0x400000 +#define BIT_23 0x800000 +#define BIT_24 0x1000000 +#define BIT_25 0x2000000 +#define BIT_26 0x4000000 +#define BIT_27 0x8000000 +#define BIT_28 0x10000000 +#define BIT_29 0x20000000 +#define BIT_30 0x40000000 +#define BIT_31 0x80000000 + +#if MEMORY_MAPPED_IO +#define RD_REG_WORD(addr) readw(addr) +#define WRT_REG_WORD(addr, data) writew(data, addr) +#else /* MEMORY_MAPPED_IO */ +#define RD_REG_WORD(addr) inw((unsigned long)addr) +#define WRT_REG_WORD(addr, data) outw(data, (unsigned long)addr) +#endif /* MEMORY_MAPPED_IO */ /* * Host adapter default definitions. */ -#define MAX_BUSES 2 /* 2 */ -#define MAX_B_BITS 1 +#define MAX_BUSES 2 /* 2 */ +#define MAX_B_BITS 1 -#define MAX_TARGETS 16 /* 16 */ -#define MAX_T_BITS 4 /* 4 */ +#define MAX_TARGETS 16 /* 16 */ +#define MAX_T_BITS 4 /* 4 */ -#define MAX_LUNS 8 /* 32 */ -#define MAX_L_BITS 3 /* 5 */ +#define MAX_LUNS 8 /* 32 */ +#define MAX_L_BITS 3 /* 5 */ /* * Watchdog time quantum */ -#define QLA1280_WDG_TIME_QUANTUM 5 /* In seconds */ +#define QLA1280_WDG_TIME_QUANTUM 5 /* In seconds */ /* Command retry count (0-65535) */ -#define COMMAND_RETRY_COUNT 255 +#define COMMAND_RETRY_COUNT 255 -/* Maximum outstanding commands in ISP queues (1-65535) */ -#define MAX_OUTSTANDING_COMMANDS 512 +/* Maximum outstanding commands in ISP queues */ +#define MAX_OUTSTANDING_COMMANDS 512 +#define INVALID_HANDLE (MAX_OUTSTANDING_COMMANDS + 2) /* ISP request and response entry counts (37-65535) */ -#define REQUEST_ENTRY_CNT 256 /* Number of request entries. */ -#define RESPONSE_ENTRY_CNT 16 /* Number of response entries. */ - -/* Maximum equipage per controller */ -#define MAX_EQ (MAX_BUSES * MAX_TARGETS * MAX_LUNS) +#define REQUEST_ENTRY_CNT 256 /* Number of request entries. */ +#define RESPONSE_ENTRY_CNT 16 /* Number of response entries. */ /* Number of segments 1 - 65535 */ -#define SG_SEGMENTS 32 /* Cmd entry + 6 continuations */ - +#define SG_SEGMENTS 32 /* Cmd entry + 6 continuations */ /* - * SCSI Request Block structure + * SCSI Request Block structure (sp) that is placed + * on cmd->SCp location of every I/O */ -typedef struct srb -{ - Scsi_Cmnd *cmd; /* (4) SCSI command block */ - struct srb *s_next; /* (4) Next block on LU queue */ - struct srb *s_prev; /* (4) Previous block on LU queue */ - uint8_t flags; /* (1) Status flags. */ - uint8_t dir; /* direction of transfer */ - uint8_t unused[2]; - u_long r_start; /* jiffies at start of request */ - u_long u_start; /* jiffies when sent to F/W */ -}srb_t; +struct srb { + Scsi_Cmnd *cmd; /* (4/8) SCSI command block */ + struct srb *s_next; /* (4/8) Next block on LU queue */ + struct srb *s_prev; /* (4/8) Previous block on LU queue */ + uint8_t flags; /* (1) Status flags. */ + uint8_t dir; /* direction of transfer */ + /* + * This should be moved around to save space. + */ + dma_addr_t saved_dma_handle; /* for unmap of single transfers */ + /* NOTE: the sp->cmd will be NULL when this completion is + * called, so you should know the scsi_cmnd when using this */ + struct completion *wait; +}; /* * SRB flag definitions */ -#define SRB_TIMEOUT BIT_0 /* Command timed out */ -#define SRB_SENT BIT_1 /* Command sent to ISP */ -#define SRB_ABORT_PENDING BIT_2 /* Command abort sent to device */ -#define SRB_ABORTED BIT_3 /* Command aborted command already */ - +#define SRB_TIMEOUT BIT_0 /* Command timed out */ +#define SRB_SENT BIT_1 /* Command sent to ISP */ +#define SRB_ABORT_PENDING BIT_2 /* Command abort sent to device */ +#define SRB_ABORTED BIT_3 /* Command aborted command already */ /* * Logical Unit Queue structure */ -typedef struct scsi_lu -{ - srb_t *q_first; /* First block on LU queue */ - srb_t *q_last; /* Last block on LU queue */ - uint8_t q_flag; /* LU queue state flags */ - uint8_t q_sense[16]; /* sense data */ - u_long io_cnt; /* total xfer count */ - u_long resp_time; /* total response time (start - finish) */ - u_long act_time; /* total actived time (minus queuing time) */ - u_long w_cnt; /* total writes */ - u_long r_cnt; /* total reads */ - uint16_t q_outcnt; /* Pending jobs for this LU */ -#if QL1280_TARGET_MODE_SUPPORT - void (*q_func)(); /* Target driver event handler */ - int32_t q_param; /* Target driver event param */ - uint8_t q_lock; /* Device Queue Lock */ -#endif -}scsi_lu_t; - -/* - * Logical Unit flags - */ -#define QLA1280_QBUSY BIT_0 -#define QLA1280_QWAIT BIT_1 -#define QLA1280_QSUSP BIT_2 -#define QLA1280_QSENSE BIT_3 /* Sense data cache valid */ -#define QLA1280_QRESET BIT_4 -#define QLA1280_QHBA BIT_5 -#define QLA1280_BSUSP BIT_6 /* controller is suspended */ -#define QLA1280_BREM BIT_7 /* controller is removed */ - -/* - * ISP PCI Configuration Register Set - */ -typedef volatile struct -{ - uint16_t vendor_id; /* 0x0 */ - uint16_t device_id; /* 0x2 */ - uint16_t command; /* 0x4 */ - uint16_t status; /* 0x6 */ - uint8_t revision_id; /* 0x8 */ - uint8_t programming_interface; /* 0x9 */ - uint8_t sub_class; /* 0xa */ - uint8_t base_class; /* 0xb */ - uint8_t cache_line; /* 0xc */ - uint8_t latency_timer; /* 0xd */ - uint8_t header_type; /* 0xe */ - uint8_t bist; /* 0xf */ - uint32_t base_port; /* 0x10 */ - uint32_t mem_base_addr; /* 0x14 */ - uint32_t base_addr[4]; /* 0x18-0x24 */ - uint32_t reserved_1[2]; /* 0x28-0x2c */ - uint16_t expansion_rom; /* 0x30 */ - uint32_t reserved_2[2]; /* 0x34-0x38 */ - uint8_t interrupt_line; /* 0x3c */ - uint8_t interrupt_pin; /* 0x3d */ - uint8_t min_grant; /* 0x3e */ - uint8_t max_latency; /* 0x3f */ -}config_reg_t; +struct scsi_lu { + struct srb *q_first; /* First block on LU queue */ + struct srb *q_last; /* Last block on LU queue */ + uint8_t q_flag; /* LU queue state flags */ + uint8_t q_sense[16]; /* sense data */ + unsigned long io_cnt; /* total xfer count */ + unsigned long resp_time;/* total response time (start - finish) */ + unsigned long act_time; /* total actived time (minus queuing time) */ + unsigned long w_cnt; /* total writes */ + unsigned long r_cnt; /* total reads */ + uint16_t q_outcnt; /* Pending jobs for this LU */ +}; + +/* + * Logical Unit flags + */ +#define QLA1280_QBUSY BIT_0 +#define QLA1280_QWAIT BIT_1 +#define QLA1280_QSUSP BIT_2 +#define QLA1280_QSENSE BIT_3 /* Sense data cache valid */ +#define QLA1280_QRESET BIT_4 +#define QLA1280_QHBA BIT_5 +#define QLA1280_BSUSP BIT_6 /* controller is suspended */ +#define QLA1280_BREM BIT_7 /* controller is removed */ /* * ISP I/O Register Set structure definitions. */ -typedef volatile struct -{ - uint16_t id_l; /* ID low */ - uint16_t id_h; /* ID high */ - uint16_t cfg_0; /* Configuration 0 */ - uint16_t cfg_1; /* Configuration 1 */ - uint16_t ictrl; /* Interface control */ - #define ISP_RESET BIT_0 /* ISP soft reset */ - #define ISP_EN_INT BIT_1 /* ISP enable interrupts. */ - #define ISP_EN_RISC BIT_2 /* ISP enable RISC interrupts. */ - uint16_t istatus; /* Interface status */ - #define PCI_64BIT_SLOT BIT_14 /* PCI 64-bit slot indicator. */ - #define RISC_INT BIT_2 /* RISC interrupt */ - #define PCI_INT BIT_1 /* PCI interrupt */ - uint16_t semaphore; /* Semaphore */ - uint16_t nvram; /* NVRAM register. */ - #define NV_DESELECT 0 - #define NV_CLOCK BIT_0 - #define NV_SELECT BIT_1 - #define NV_DATA_OUT BIT_2 - #define NV_DATA_IN BIT_3 - uint16_t flash_data; /* Flash BIOS data */ - uint16_t flash_address; /* Flash BIOS address */ - - uint16_t unused_1[0x2e]; /* 0x14-0x6f Gap */ - - uint16_t mailbox0; /* Mailbox 0 */ - uint16_t mailbox1; /* Mailbox 1 */ - uint16_t mailbox2; /* Mailbox 2 */ - uint16_t mailbox3; /* Mailbox 3 */ - uint16_t mailbox4; /* Mailbox 4 */ - uint16_t mailbox5; /* Mailbox 5 */ - uint16_t mailbox6; /* Mailbox 6 */ - uint16_t mailbox7; /* Mailbox 7 */ - - uint16_t unused_2[0x20]; /* 0x80-0xbf Gap */ - - uint16_t host_cmd; /* Host command and control */ - #define HOST_INT BIT_7 /* host interrupt bit */ - #define BIOS_ENABLE BIT_0 - - uint16_t unused_6[0x5]; /* 0xc2-0xcb Gap */ - - uint16_t gpio_data; - uint16_t gpio_enable; - - uint16_t unused_7[0x11]; /* d0-f0 */ - uint16_t scsiControlPins; /* f2 */ - -}device_reg_t; +struct device_reg { + uint16_t id_l; /* ID low */ + uint16_t id_h; /* ID high */ + uint16_t cfg_0; /* Configuration 0 */ + uint16_t cfg_1; /* Configuration 1 */ + uint16_t ictrl; /* Interface control */ +#define ISP_RESET BIT_0 /* ISP soft reset */ +#define ISP_EN_INT BIT_1 /* ISP enable interrupts. */ +#define ISP_EN_RISC BIT_2 /* ISP enable RISC interrupts. */ +#define ISP_FLASH_ENABLE BIT_8 /* Flash BIOS Read/Write enable */ +#define ISP_FLASH_UPPER BIT_9 /* Flash upper bank select */ + uint16_t istatus; /* Interface status */ +#define PCI_64BIT_SLOT BIT_14 /* PCI 64-bit slot indicator. */ +#define RISC_INT BIT_2 /* RISC interrupt */ +#define PCI_INT BIT_1 /* PCI interrupt */ + uint16_t semaphore; /* Semaphore */ + uint16_t nvram; /* NVRAM register. */ +#define NV_DESELECT 0 +#define NV_CLOCK BIT_0 +#define NV_SELECT BIT_1 +#define NV_DATA_OUT BIT_2 +#define NV_DATA_IN BIT_3 + uint16_t flash_data; /* Flash BIOS data */ + uint16_t flash_address; /* Flash BIOS address */ + + uint16_t unused_1[0x2e]; /* 0x14-0x6f Gap */ + + uint16_t mailbox0; /* Mailbox 0 */ + uint16_t mailbox1; /* Mailbox 1 */ + uint16_t mailbox2; /* Mailbox 2 */ + uint16_t mailbox3; /* Mailbox 3 */ + uint16_t mailbox4; /* Mailbox 4 */ + uint16_t mailbox5; /* Mailbox 5 */ + uint16_t mailbox6; /* Mailbox 6 */ + uint16_t mailbox7; /* Mailbox 7 */ + + uint16_t unused_2[0x20];/* 0x80-0xbf Gap */ + + uint16_t host_cmd; /* Host command and control */ +#define HOST_INT BIT_7 /* host interrupt bit */ +#define BIOS_ENABLE BIT_0 + + uint16_t unused_6[0x5]; /* 0xc2-0xcb Gap */ + + uint16_t gpio_data; + uint16_t gpio_enable; + + uint16_t unused_7[0x11]; /* d0-f0 */ + uint16_t scsiControlPins; /* f2 */ +}; -#define MAILBOX_REGISTER_COUNT 8 +#define MAILBOX_REGISTER_COUNT 8 /* * ISP product identification definitions in mailboxes after reset. */ -#define PROD_ID_1 0x4953 -#define PROD_ID_2 0x0000 -#define PROD_ID_2a 0x5020 -#define PROD_ID_3 0x2020 -#define PROD_ID_4 0x1 +#define PROD_ID_1 0x4953 +#define PROD_ID_2 0x0000 +#define PROD_ID_2a 0x5020 +#define PROD_ID_3 0x2020 +#define PROD_ID_4 0x1 /* * ISP host command and control register command definitions */ -#define HC_RESET_RISC 0x1000 /* Reset RISC */ -#define HC_PAUSE_RISC 0x2000 /* Pause RISC */ -#define HC_RELEASE_RISC 0x3000 /* Release RISC from reset. */ -#define HC_SET_HOST_INT 0x5000 /* Set host interrupt */ -#define HC_CLR_HOST_INT 0x6000 /* Clear HOST interrupt */ -#define HC_CLR_RISC_INT 0x7000 /* Clear RISC interrupt */ -#define HC_DISABLE_BIOS 0x9000 /* Disable BIOS. */ +#define HC_RESET_RISC 0x1000 /* Reset RISC */ +#define HC_PAUSE_RISC 0x2000 /* Pause RISC */ +#define HC_RELEASE_RISC 0x3000 /* Release RISC from reset. */ +#define HC_SET_HOST_INT 0x5000 /* Set host interrupt */ +#define HC_CLR_HOST_INT 0x6000 /* Clear HOST interrupt */ +#define HC_CLR_RISC_INT 0x7000 /* Clear RISC interrupt */ +#define HC_DISABLE_BIOS 0x9000 /* Disable BIOS. */ /* * ISP mailbox Self-Test status codes */ -#define MBS_FRM_ALIVE 0 /* Firmware Alive. */ -#define MBS_CHKSUM_ERR 1 /* Checksum Error. */ -#define MBS_SHADOW_LD_ERR 2 /* Shadow Load Error. */ -#define MBS_BUSY 4 /* Busy. */ +#define MBS_FRM_ALIVE 0 /* Firmware Alive. */ +#define MBS_CHKSUM_ERR 1 /* Checksum Error. */ +#define MBS_SHADOW_LD_ERR 2 /* Shadow Load Error. */ +#define MBS_BUSY 4 /* Busy. */ /* * ISP mailbox command complete status codes */ -#define MBS_CMD_CMP 0x4000 /* Command Complete. */ -#define MBS_INV_CMD 0x4001 /* Invalid Command. */ -#define MBS_HOST_INF_ERR 0x4002 /* Host Interface Error. */ -#define MBS_TEST_FAILED 0x4003 /* Test Failed. */ -#define MBS_CMD_ERR 0x4005 /* Command Error. */ -#define MBS_CMD_PARAM_ERR 0x4006 /* Command Parameter Error. */ +#define MBS_CMD_CMP 0x4000 /* Command Complete. */ +#define MBS_INV_CMD 0x4001 /* Invalid Command. */ +#define MBS_HOST_INF_ERR 0x4002 /* Host Interface Error. */ +#define MBS_TEST_FAILED 0x4003 /* Test Failed. */ +#define MBS_CMD_ERR 0x4005 /* Command Error. */ +#define MBS_CMD_PARAM_ERR 0x4006 /* Command Parameter Error. */ /* * ISP mailbox asynchronous event status codes */ -#define MBA_ASYNC_EVENT 0x8000 /* Asynchronous event. */ -#define MBA_BUS_RESET 0x8001 /* SCSI Bus Reset. */ -#define MBA_SYSTEM_ERR 0x8002 /* System Error. */ -#define MBA_REQ_TRANSFER_ERR 0x8003 /* Request Transfer Error. */ -#define MBA_RSP_TRANSFER_ERR 0x8004 /* Response Transfer Error. */ -#define MBA_WAKEUP_THRES 0x8005 /* Request Queue Wake-up. */ -#define MBA_TIMEOUT_RESET 0x8006 /* Execution Timeout Reset. */ -#define MBA_DEVICE_RESET 0x8007 /* Bus Device Reset. */ -#define MBA_BUS_MODE_CHANGE 0x800E /* SCSI bus mode transition. */ -#define MBA_SCSI_COMPLETION 0x8020 /* Completion response. */ +#define MBA_ASYNC_EVENT 0x8000 /* Asynchronous event. */ +#define MBA_BUS_RESET 0x8001 /* SCSI Bus Reset. */ +#define MBA_SYSTEM_ERR 0x8002 /* System Error. */ +#define MBA_REQ_TRANSFER_ERR 0x8003 /* Request Transfer Error. */ +#define MBA_RSP_TRANSFER_ERR 0x8004 /* Response Transfer Error. */ +#define MBA_WAKEUP_THRES 0x8005 /* Request Queue Wake-up. */ +#define MBA_TIMEOUT_RESET 0x8006 /* Execution Timeout Reset. */ +#define MBA_DEVICE_RESET 0x8007 /* Bus Device Reset. */ +#define MBA_BUS_MODE_CHANGE 0x800E /* SCSI bus mode transition. */ +#define MBA_SCSI_COMPLETION 0x8020 /* Completion response. */ /* * ISP mailbox commands */ -#define MBC_NOP 0 /* No Operation. */ -#define MBC_LOAD_RAM 1 /* Load RAM. */ -#define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware. */ -#define MBC_WRITE_RAM_WORD 4 /* Write ram word. */ -#define MBC_READ_RAM_WORD 5 /* Read ram word. */ -#define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */ -#define MBC_VERIFY_CHECKSUM 7 /* Verify checksum. */ -#define MBC_ABOUT_FIRMWARE 8 /* Get firmware revision. */ -#define MBC_INIT_REQUEST_QUEUE 0x10 /* Initialize request queue. */ -#define MBC_INIT_RESPONSE_QUEUE 0x11 /* Initialize response queue. */ -#define MBC_EXECUTE_IOCB 0x12 /* Execute IOCB command. */ -#define MBC_ABORT_COMMAND 0x15 /* Abort IOCB command. */ -#define MBC_ABORT_DEVICE 0x16 /* Abort device (ID/LUN). */ -#define MBC_ABORT_TARGET 0x17 /* Abort target (ID). */ -#define MBC_BUS_RESET 0x18 /* SCSI bus reset. */ -#define MBC_GET_RETRY_COUNT 0x22 /* Get retry count and delay. */ -#define MBC_GET_TARGET_PARAMETERS 0x28 /* Get target parameters. */ -#define MBC_SET_INITIATOR_ID 0x30 /* Set initiator SCSI ID. */ -#define MBC_SET_SELECTION_TIMEOUT 0x31 /* Set selection timeout. */ -#define MBC_SET_RETRY_COUNT 0x32 /* Set retry count and delay. */ -#define MBC_SET_TAG_AGE_LIMIT 0x33 /* Set tag age limit. */ -#define MBC_SET_CLOCK_RATE 0x34 /* Set clock rate. */ -#define MBC_SET_ACTIVE_NEGATION 0x35 /* Set active negation state. */ -#define MBC_SET_ASYNC_DATA_SETUP 0x36 /* Set async data setup time. */ -#define MBC_SET_PCI_CONTROL 0x37 /* Set BUS control parameters. */ -#define MBC_SET_TARGET_PARAMETERS 0x38 /* Set target parameters. */ -#define MBC_SET_DEVICE_QUEUE 0x39 /* Set device queue parameters */ -#define MBC_SET_SYSTEM_PARAMETER 0x45 /* Set system parameter word. */ -#define MBC_SET_FIRMWARE_FEATURES 0x4A /* Set firmware feature word. */ -#define MBC_INIT_REQUEST_QUEUE_A64 0x52 /* Initialize request queue A64 */ -#define MBC_INIT_RESPONSE_QUEUE_A64 0x53 /* Initialize response q A64. */ -#define MBC_ENABLE_TARGET_MODE 0x55 /* Enable target mode. */ +#define MBC_NOP 0 /* No Operation */ +#define MBC_LOAD_RAM 1 /* Load RAM */ +#define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware */ +#define MBC_DUMP_RAM 3 /* Dump RAM contents */ +#define MBC_WRITE_RAM_WORD 4 /* Write ram word */ +#define MBC_READ_RAM_WORD 5 /* Read ram word */ +#define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */ +#define MBC_VERIFY_CHECKSUM 7 /* Verify checksum */ +#define MBC_ABOUT_FIRMWARE 8 /* Get firmware revision */ +#define MBC_INIT_REQUEST_QUEUE 0x10 /* Initialize request queue */ +#define MBC_INIT_RESPONSE_QUEUE 0x11 /* Initialize response queue */ +#define MBC_EXECUTE_IOCB 0x12 /* Execute IOCB command */ +#define MBC_ABORT_COMMAND 0x15 /* Abort IOCB command */ +#define MBC_ABORT_DEVICE 0x16 /* Abort device (ID/LUN) */ +#define MBC_ABORT_TARGET 0x17 /* Abort target (ID) */ +#define MBC_BUS_RESET 0x18 /* SCSI bus reset */ +#define MBC_GET_RETRY_COUNT 0x22 /* Get retry count and delay */ +#define MBC_GET_TARGET_PARAMETERS 0x28 /* Get target parameters */ +#define MBC_SET_INITIATOR_ID 0x30 /* Set initiator SCSI ID */ +#define MBC_SET_SELECTION_TIMEOUT 0x31 /* Set selection timeout */ +#define MBC_SET_RETRY_COUNT 0x32 /* Set retry count and delay */ +#define MBC_SET_TAG_AGE_LIMIT 0x33 /* Set tag age limit */ +#define MBC_SET_CLOCK_RATE 0x34 /* Set clock rate */ +#define MBC_SET_ACTIVE_NEGATION 0x35 /* Set active negation state */ +#define MBC_SET_ASYNC_DATA_SETUP 0x36 /* Set async data setup time */ +#define MBC_SET_PCI_CONTROL 0x37 /* Set BUS control parameters */ +#define MBC_SET_TARGET_PARAMETERS 0x38 /* Set target parameters */ +#define MBC_SET_DEVICE_QUEUE 0x39 /* Set device queue parameters */ +#define MBC_SET_RESET_DELAY_PARAMETERS 0x3A /* Set reset delay parameters */ +#define MBC_SET_SYSTEM_PARAMETER 0x45 /* Set system parameter word */ +#define MBC_SET_FIRMWARE_FEATURES 0x4A /* Set firmware feature word */ +#define MBC_INIT_REQUEST_QUEUE_A64 0x52 /* Initialize request queue A64 */ +#define MBC_INIT_RESPONSE_QUEUE_A64 0x53 /* Initialize response q A64 */ +#define MBC_ENABLE_TARGET_MODE 0x55 /* Enable target mode */ +#define MBC_SET_DATA_OVERRUN_RECOVERY 0x5A /* Set data overrun recovery mode */ /* * ISP Get/Set Target Parameters mailbox command control flags. */ -#define TP_RENEGOTIATE BIT_8 /* Renegotiate on error. */ -#define TP_STOP_QUEUE BIT_9 /* Stop que on check condition */ -#define TP_AUTO_REQUEST_SENSE BIT_10 /* Automatic request sense. */ -#define TP_TAGGED_QUEUE BIT_11 /* Tagged queuing. */ -#define TP_SYNC BIT_12 /* Synchronous data transfers. */ -#define TP_WIDE BIT_13 /* Wide data transfers. */ -#define TP_PARITY BIT_14 /* Parity checking. */ -#define TP_DISCONNECT BIT_15 /* Disconnect privilege. */ +#define TP_PPR BIT_5 /* PPR */ +#define TP_RENEGOTIATE BIT_8 /* Renegotiate on error. */ +#define TP_STOP_QUEUE BIT_9 /* Stop que on check condition */ +#define TP_AUTO_REQUEST_SENSE BIT_10 /* Automatic request sense. */ +#define TP_TAGGED_QUEUE BIT_11 /* Tagged queuing. */ +#define TP_SYNC BIT_12 /* Synchronous data transfers. */ +#define TP_WIDE BIT_13 /* Wide data transfers. */ +#define TP_PARITY BIT_14 /* Parity checking. */ +#define TP_DISCONNECT BIT_15 /* Disconnect privilege. */ /* * NVRAM Command values. */ -#define NV_START_BIT BIT_2 -#define NV_WRITE_OP (BIT_26+BIT_24) -#define NV_READ_OP (BIT_26+BIT_25) -#define NV_ERASE_OP (BIT_26+BIT_25+BIT_24) -#define NV_MASK_OP (BIT_26+BIT_25+BIT_24) -#define NV_DELAY_COUNT 10 - -/* - * QLogic ISP1280 NVRAM structure definition. - */ -typedef struct -{ - uint8_t id[4]; /* 0, 1, 2, 3 */ - uint8_t version; /* 4 */ - - struct - { - uint8_t bios_configuration_mode :2; - uint8_t bios_disable :1; - uint8_t selectable_scsi_boot_enable :1; - uint8_t cd_rom_boot_enable :1; - uint8_t disable_loading_risc_code :1; - uint8_t enable_64bit_addressing :1; - uint8_t unused_7 :1; - }cntr_flags_1; /* 5 */ - - struct - { - uint8_t boot_lun_number :5; - uint8_t scsi_bus_number :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - uint8_t boot_target_number :4; - uint8_t unused_12 :1; - uint8_t unused_13 :1; - uint8_t unused_14 :1; - uint8_t unused_15 :1; - }cntr_flags_2; /* 6, 7 */ - - uint16_t unused_8; /* 8, 9 */ - uint16_t unused_10; /* 10, 11 */ - uint16_t unused_12; /* 12, 13 */ - uint16_t unused_14; /* 14, 15 */ - - union - { - uint8_t c; - struct - { - uint8_t reserved :2; - uint8_t burst_enable :1; - uint8_t reserved_1 :1; - uint8_t fifo_threshold :4; - }f; - }isp_config; /* 16 */ - - /* Termination - * 0 = Disable, 1 = high only, 3 = Auto term - */ - union - { - uint8_t c; - struct - { - uint8_t scsi_bus_1_control :2; - uint8_t scsi_bus_0_control :2; - uint8_t unused_0 :1; - uint8_t unused_1 :1; - uint8_t unused_2 :1; - uint8_t auto_term_support :1; - }f; - }termination; /* 17 */ - - uint16_t isp_parameter; /* 18, 19 */ - - union - { - uint16_t w; - struct - { - uint8_t enable_fast_posting :1; - uint8_t report_lvd_bus_transition :1; - uint8_t unused_2 :1; - uint8_t unused_3 :1; - uint8_t unused_4 :1; - uint8_t unused_5 :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - uint8_t unused_8 :1; - uint8_t unused_9 :1; - uint8_t unused_10 :1; - uint8_t unused_11 :1; - uint8_t unused_12 :1; - uint8_t unused_13 :1; - uint8_t unused_14 :1; - uint8_t unused_15 :1; - }f; - }firmware_feature; /* 20, 21 */ - - uint16_t unused_22; /* 22, 23 */ - - struct - { - struct - { - uint8_t initiator_id :4; - uint8_t scsi_reset_disable :1; - uint8_t scsi_bus_size :1; - uint8_t scsi_bus_type :1; - uint8_t unused_7 :1; - }config_1; /* 24 */ - - uint8_t bus_reset_delay; /* 25 */ - uint8_t retry_count; /* 26 */ - uint8_t retry_delay; /* 27 */ - - struct - { - uint8_t async_data_setup_time :4; - uint8_t req_ack_active_negation :1; - uint8_t data_line_active_negation :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - }config_2; /* 28 */ - - uint8_t unused_29; /* 29 */ - - uint16_t selection_timeout; /* 30, 31 */ - uint16_t max_queue_depth; /* 32, 33 */ - - uint16_t unused_34; /* 34, 35 */ - uint16_t unused_36; /* 36, 37 */ - uint16_t unused_38; /* 38, 39 */ - - struct - { - union - { - uint8_t c; - struct - { - uint8_t renegotiate_on_error :1; - uint8_t stop_queue_on_check :1; - uint8_t auto_request_sense :1; - uint8_t tag_queuing :1; - uint8_t sync_data_transfers :1; - uint8_t wide_data_transfers :1; - uint8_t parity_checking :1; - uint8_t disconnect_allowed :1; - }f; - }parameter; /* 40 */ - - uint8_t execution_throttle; /* 41 */ - uint8_t sync_period; /* 42 */ - - struct - { - uint8_t sync_offset :4; - uint8_t device_enable :1; - uint8_t lun_disable :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - }flags; /* 43 */ - - uint16_t unused_44; /* 44, 45 */ - }target[MAX_TARGETS]; - }bus[MAX_BUSES]; - - uint16_t unused_248; /* 248, 249 */ - - uint16_t subsystem_id[2]; /* 250, 251, 252, 253 */ - - uint8_t unused_254; /* 254 */ - - uint8_t chksum; /* 255 */ -}nvram_t; - -/* - * QLogic ISP12160 NVRAM structure definition. - */ -typedef struct -{ - uint8_t id[4]; /* 0, 1, 2, 3 */ - uint8_t version; /* 4 */ - /* Host/Bios Flags */ - struct - { - uint8_t bios_configuration_mode :2; - uint8_t bios_disable :1; - uint8_t selectable_scsi_boot_enable :1; - uint8_t cd_rom_boot_enable :1; - uint8_t disable_loading_risc_code :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - }cntr_flags_1; /* 5 */ - /* Selectable Boot Support */ - struct - { - uint8_t boot_lun_number :5; - uint8_t scsi_bus_number :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - uint8_t boot_target_number :4; - uint8_t unused_12 :1; - uint8_t unused_13 :1; - uint8_t unused_14 :1; - uint8_t unused_15 :1; - }cntr_flags_2; /* 6, 7 */ - - uint16_t unused_8; /* 8, 9 */ - uint16_t unused_10; /* 10, 11 */ - uint16_t unused_12; /* 12, 13 */ - uint16_t unused_14; /* 14, 15 */ - - /* ISP Config Parameters */ - union - { - uint8_t c; - struct - { - uint8_t reserved :2; - uint8_t burst_enable :1; - uint8_t reserved_1 :1; - uint8_t fifo_threshold :4; - }f; - }isp_config; /* 16 */ - - /* Termination - * 0 = Disable, 1 = high only, 3 = Auto term - */ - union - { - uint8_t c; - struct - { - uint8_t scsi_bus_1_control :2; - uint8_t scsi_bus_0_control :2; - uint8_t unused_0 :1; - uint8_t unused_1 :1; - uint8_t unused_2 :1; - uint8_t auto_term_support :1; - }f; - }termination; /* 17 */ - /* Auto Term - 3 */ - /* High Only - 1 (GPIO2 = 1 & GPIO3 = 0) */ - /* Disable - 0 (GPIO2 = 0 & GPIO3 = X) */ - - uint16_t isp_parameter; /* 18, 19 */ - - union - { - uint16_t w; - struct - { - uint8_t enable_fast_posting :1; - uint8_t report_lvd_bus_transition :1; - uint8_t unused_2 :1; - uint8_t unused_3 :1; - uint8_t unused_4 :1; - uint8_t unused_5 :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - uint8_t unused_8 :1; - uint8_t unused_9 :1; - uint8_t unused_10 :1; - uint8_t unused_11 :1; - uint8_t unused_12 :1; - uint8_t unused_13 :1; - uint8_t unused_14 :1; - uint8_t unused_15 :1; - }f; - }firmware_feature; /* 20, 21 */ - - uint16_t unused_22; /* 22, 23 */ - - struct - { - struct - { - uint8_t initiator_id :4; - uint8_t scsi_reset_disable :1; - uint8_t scsi_bus_size :1; - uint8_t scsi_bus_type :1; - uint8_t unused_7 :1; - }config_1; /* 24 */ - - uint8_t bus_reset_delay; /* 25 */ - uint8_t retry_count; /* 26 */ - uint8_t retry_delay; /* 27 */ - /* Adapter Capabilities bits */ - struct - { - uint8_t async_data_setup_time :4; - uint8_t req_ack_active_negation :1; - uint8_t data_line_active_negation :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - }config_2; /* 28 */ - - uint8_t unused_29; /* 29 */ - - uint16_t selection_timeout; /* 30, 31 */ - uint16_t max_queue_depth; /* 32, 33 */ - - uint16_t unused_34; /* 34, 35 */ - uint16_t unused_36; /* 36, 37 */ - uint16_t unused_38; /* 38, 39 */ - - struct - { - union - { - uint8_t c; - struct - { - uint8_t renegotiate_on_error :1; - uint8_t stop_queue_on_check :1; - uint8_t auto_request_sense :1; - uint8_t tag_queuing :1; - uint8_t sync_data_transfers :1; - uint8_t wide_data_transfers :1; - uint8_t parity_checking :1; - uint8_t disconnect_allowed :1; - }f; - }parameter; /* 40 */ - - uint8_t execution_throttle; /* 41 */ - uint8_t sync_period; /* 42 */ - - struct - { - uint8_t sync_offset :5; - uint8_t device_enable :1; - uint8_t unused_6 :1; - uint8_t unused_7 :1; - uint8_t ppr_options :4; - uint8_t ppr_bus_width :2; - uint8_t unused_8 :1; - uint8_t enable_ppr :1; - }flags; /* 43, 44 */ - - uint8_t unused_45; /* 45 */ - }target[MAX_TARGETS]; - }bus[MAX_BUSES]; +#define NV_START_BIT BIT_2 +#define NV_WRITE_OP (BIT_26 | BIT_24) +#define NV_READ_OP (BIT_26 | BIT_25) +#define NV_ERASE_OP (BIT_26 | BIT_25 | BIT_24) +#define NV_MASK_OP (BIT_26 | BIT_25 | BIT_24) +#define NV_DELAY_COUNT 10 + +/* + * QLogic ISP1280/ISP12160 NVRAM structure definition. + */ +struct nvram { + uint8_t id0; /* 0 */ + uint8_t id1; /* 1 */ + uint8_t id2; /* 2 */ + uint8_t id3; /* 3 */ + uint8_t version; /* 4 */ + + struct { + uint8_t bios_configuration_mode:2; + uint8_t bios_disable:1; + uint8_t selectable_scsi_boot_enable:1; + uint8_t cd_rom_boot_enable:1; + uint8_t disable_loading_risc_code:1; + uint8_t enable_64bit_addressing:1; + uint8_t unused_7:1; + } cntr_flags_1; /* 5 */ + + struct { + uint16_t boot_lun_number:5; + uint16_t scsi_bus_number:1; + uint16_t unused_6:1; + uint16_t unused_7:1; + uint16_t boot_target_number:4; + uint16_t unused_12:1; + uint16_t unused_13:1; + uint16_t unused_14:1; + uint16_t unused_15:1; + } cntr_flags_2; /* 6, 7 */ + + uint16_t unused_8; /* 8, 9 */ + uint16_t unused_10; /* 10, 11 */ + uint16_t unused_12; /* 12, 13 */ + uint16_t unused_14; /* 14, 15 */ + + union { + uint8_t c; + struct { + uint8_t reserved:2; + uint8_t burst_enable:1; + uint8_t reserved_1:1; + uint8_t fifo_threshold:4; + } f; + } isp_config; /* 16 */ + + /* Termination + * 0 = Disable, 1 = high only, 3 = Auto term + */ + union { + uint8_t c; + struct { + uint8_t scsi_bus_1_control:2; + uint8_t scsi_bus_0_control:2; + uint8_t unused_0:1; + uint8_t unused_1:1; + uint8_t unused_2:1; + uint8_t auto_term_support:1; + } f; + } termination; /* 17 */ + + uint16_t isp_parameter; /* 18, 19 */ + + union { + uint16_t w; + struct { + uint16_t enable_fast_posting:1; + uint16_t report_lvd_bus_transition:1; + uint16_t unused_2:1; + uint16_t unused_3:1; + uint16_t disable_iosbs_with_bus_reset_status:1; + uint16_t disable_synchronous_backoff:1; + uint16_t unused_6:1; + uint16_t synchronous_backoff_reporting:1; + uint16_t disable_reselection_fairness:1; + uint16_t unused_9:1; + uint16_t unused_10:1; + uint16_t unused_11:1; + uint16_t unused_12:1; + uint16_t unused_13:1; + uint16_t unused_14:1; + uint16_t unused_15:1; + } f; + } firmware_feature; /* 20, 21 */ + + uint16_t unused_22; /* 22, 23 */ + + struct { + struct { + uint8_t initiator_id:4; + uint8_t scsi_reset_disable:1; + uint8_t scsi_bus_size:1; + uint8_t scsi_bus_type:1; + uint8_t unused_7:1; + } config_1; /* 24 */ + + uint8_t bus_reset_delay; /* 25 */ + uint8_t retry_count; /* 26 */ + uint8_t retry_delay; /* 27 */ + + struct { + uint8_t async_data_setup_time:4; + uint8_t req_ack_active_negation:1; + uint8_t data_line_active_negation:1; + uint8_t unused_6:1; + uint8_t unused_7:1; + } config_2; /* 28 */ + + uint8_t unused_29; /* 29 */ + + uint16_t selection_timeout; /* 30, 31 */ + uint16_t max_queue_depth; /* 32, 33 */ + + uint16_t unused_34; /* 34, 35 */ + uint16_t unused_36; /* 36, 37 */ + uint16_t unused_38; /* 38, 39 */ + + struct { + union { + uint8_t c; + struct { + uint8_t renegotiate_on_error:1; + uint8_t stop_queue_on_check:1; + uint8_t auto_request_sense:1; + uint8_t tag_queuing:1; + uint8_t enable_sync:1; + uint8_t enable_wide:1; + uint8_t parity_checking:1; + uint8_t disconnect_allowed:1; + } f; + } parameter; /* 40 */ + + uint8_t execution_throttle; /* 41 */ + uint8_t sync_period; /* 42 */ + + union { /* 43 */ + uint8_t flags_43; + struct { + uint8_t sync_offset:4; + uint8_t device_enable:1; + uint8_t lun_disable:1; + uint8_t unused_6:1; + uint8_t unused_7:1; + } flags1x80; + struct { + uint8_t sync_offset:5; + uint8_t device_enable:1; + uint8_t unused_6:1; + uint8_t unused_7:1; + } flags1x160; + } flags; + union { /* PPR flags for the 1x160 controllers */ + uint8_t unused_44; + struct { + uint8_t ppr_options:4; + uint8_t ppr_bus_width:2; + uint8_t unused_8:1; + uint8_t enable_ppr:1; + } flags; /* 44 */ + } ppr_1x160; + uint8_t unused_45; /* 45 */ + } target[MAX_TARGETS]; + } bus[MAX_BUSES]; + + uint16_t unused_248; /* 248, 249 */ + + uint16_t subsystem_id[2]; /* 250, 251, 252, 253 */ + + union { /* 254 */ + uint8_t unused_254; + uint8_t system_id_pointer; + } sysid_1x160; - uint16_t unused_248; /* 248, 249 */ - - uint16_t subsystem_id[2]; /* 250, 251, 252, 253 */ - - uint8_t System_Id_Pointer; /* 254 */ - - uint8_t chksum; /* 255 */ -}nvram160_t; + uint8_t chksum; /* 255 */ +}; /* * ISP queue - command entry structure definition. */ -#define MAX_CMDSZ 12 /* SCSI maximum CDB size. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define COMMAND_TYPE 1 /* Command entry */ - uint8_t entry_count; /* Entry count. */ - uint8_t sys_define; /* System defined. */ - uint8_t entry_status; /* Entry Status. */ - uint32_t handle; /* System handle. */ - uint8_t lun; /* SCSI LUN */ - uint8_t target; /* SCSI ID */ - uint16_t cdb_len; /* SCSI command length. */ - uint16_t control_flags; /* Control flags. */ - uint16_t reserved; - uint16_t timeout; /* Command timeout. */ - uint16_t dseg_count; /* Data segment count. */ - uint8_t scsi_cdb[MAX_CMDSZ]; /* SCSI command words. */ - uint32_t dseg_0_address; /* Data segment 0 address. */ - uint32_t dseg_0_length; /* Data segment 0 length. */ - uint32_t dseg_1_address; /* Data segment 1 address. */ - uint32_t dseg_1_length; /* Data segment 1 length. */ - uint32_t dseg_2_address; /* Data segment 2 address. */ - uint32_t dseg_2_length; /* Data segment 2 length. */ - uint32_t dseg_3_address; /* Data segment 3 address. */ - uint32_t dseg_3_length; /* Data segment 3 length. */ -}cmd_entry_t; +#define MAX_CMDSZ 12 /* SCSI maximum CDB size. */ +struct cmd_entry { + uint8_t entry_type; /* Entry type. */ +#define COMMAND_TYPE 1 /* Command entry */ + uint8_t entry_count; /* Entry count. */ + uint8_t sys_define; /* System defined. */ + uint8_t entry_status; /* Entry Status. */ + uint32_t handle; /* System handle. */ + uint8_t lun; /* SCSI LUN */ + uint8_t target; /* SCSI ID */ + uint16_t cdb_len; /* SCSI command length. */ + uint16_t control_flags; /* Control flags. */ + uint16_t reserved; + uint16_t timeout; /* Command timeout. */ + uint16_t dseg_count; /* Data segment count. */ + uint8_t scsi_cdb[MAX_CMDSZ]; /* SCSI command words. */ + uint32_t dseg_0_address; /* Data segment 0 address. */ + uint32_t dseg_0_length; /* Data segment 0 length. */ + uint32_t dseg_1_address; /* Data segment 1 address. */ + uint32_t dseg_1_length; /* Data segment 1 length. */ + uint32_t dseg_2_address; /* Data segment 2 address. */ + uint32_t dseg_2_length; /* Data segment 2 length. */ + uint32_t dseg_3_address; /* Data segment 3 address. */ + uint32_t dseg_3_length; /* Data segment 3 length. */ +}; /* * ISP queue - continuation entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define CONTINUE_TYPE 2 /* Continuation entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t sys_define; /* System defined. */ - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved; /* Reserved */ - uint32_t dseg_0_address; /* Data segment 0 address. */ - uint32_t dseg_0_length; /* Data segment 0 length. */ - uint32_t dseg_1_address; /* Data segment 1 address. */ - uint32_t dseg_1_length; /* Data segment 1 length. */ - uint32_t dseg_2_address; /* Data segment 2 address. */ - uint32_t dseg_2_length; /* Data segment 2 length. */ - uint32_t dseg_3_address; /* Data segment 3 address. */ - uint32_t dseg_3_length; /* Data segment 3 length. */ - uint32_t dseg_4_address; /* Data segment 4 address. */ - uint32_t dseg_4_length; /* Data segment 4 length. */ - uint32_t dseg_5_address; /* Data segment 5 address. */ - uint32_t dseg_5_length; /* Data segment 5 length. */ - uint32_t dseg_6_address; /* Data segment 6 address. */ - uint32_t dseg_6_length; /* Data segment 6 length. */ -}cont_entry_t; +struct cont_entry { + uint8_t entry_type; /* Entry type. */ +#define CONTINUE_TYPE 2 /* Continuation entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t sys_define; /* System defined. */ + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved; /* Reserved */ + uint32_t dseg_0_address; /* Data segment 0 address. */ + uint32_t dseg_0_length; /* Data segment 0 length. */ + uint32_t dseg_1_address; /* Data segment 1 address. */ + uint32_t dseg_1_length; /* Data segment 1 length. */ + uint32_t dseg_2_address; /* Data segment 2 address. */ + uint32_t dseg_2_length; /* Data segment 2 length. */ + uint32_t dseg_3_address; /* Data segment 3 address. */ + uint32_t dseg_3_length; /* Data segment 3 length. */ + uint32_t dseg_4_address; /* Data segment 4 address. */ + uint32_t dseg_4_length; /* Data segment 4 length. */ + uint32_t dseg_5_address; /* Data segment 5 address. */ + uint32_t dseg_5_length; /* Data segment 5 length. */ + uint32_t dseg_6_address; /* Data segment 6 address. */ + uint32_t dseg_6_length; /* Data segment 6 length. */ +}; /* * ISP queue - status entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define STATUS_TYPE 3 /* Status entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t sys_define; /* System defined. */ - uint8_t entry_status; /* Entry Status. */ - #define RF_CONT BIT_0 /* Continuation. */ - #define RF_FULL BIT_1 /* Full */ - #define RF_BAD_HEADER BIT_2 /* Bad header. */ - #define RF_BAD_PAYLOAD BIT_3 /* Bad payload. */ - uint32_t handle; /* System handle. */ - uint16_t scsi_status; /* SCSI status. */ - uint16_t comp_status; /* Completion status. */ - uint16_t state_flags; /* State flags. */ - #define SF_TRANSFER_CMPL BIT_14 /* Transfer Complete. */ - #define SF_GOT_SENSE BIT_13 /* Got Sense */ - #define SF_GOT_STATUS BIT_12 /* Got Status */ - #define SF_TRANSFERRED_DATA BIT_11 /* Transferred data */ - #define SF_SENT_CDB BIT_10 /* Send CDB */ - #define SF_GOT_TARGET BIT_9 /* */ - #define SF_GOT_BUS BIT_8 /* */ - uint16_t status_flags; /* Status flags. */ - uint16_t time; /* Time. */ - uint16_t req_sense_length; /* Request sense data length. */ - uint32_t residual_length; /* Residual transfer length. */ - uint16_t reserved[4]; - uint8_t req_sense_data[32]; /* Request sense data. */ -}sts_entry_t, response_t; +struct response { + uint8_t entry_type; /* Entry type. */ +#define STATUS_TYPE 3 /* Status entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t sys_define; /* System defined. */ + uint8_t entry_status; /* Entry Status. */ +#define RF_CONT BIT_0 /* Continuation. */ +#define RF_FULL BIT_1 /* Full */ +#define RF_BAD_HEADER BIT_2 /* Bad header. */ +#define RF_BAD_PAYLOAD BIT_3 /* Bad payload. */ + uint32_t handle; /* System handle. */ + uint16_t scsi_status; /* SCSI status. */ + uint16_t comp_status; /* Completion status. */ + uint16_t state_flags; /* State flags. */ +#define SF_TRANSFER_CMPL BIT_14 /* Transfer Complete. */ +#define SF_GOT_SENSE BIT_13 /* Got Sense */ +#define SF_GOT_STATUS BIT_12 /* Got Status */ +#define SF_TRANSFERRED_DATA BIT_11 /* Transferred data */ +#define SF_SENT_CDB BIT_10 /* Send CDB */ +#define SF_GOT_TARGET BIT_9 /* */ +#define SF_GOT_BUS BIT_8 /* */ + uint16_t status_flags; /* Status flags. */ + uint16_t time; /* Time. */ + uint16_t req_sense_length; /* Request sense data length. */ + uint32_t residual_length; /* Residual transfer length. */ + uint16_t reserved[4]; + uint8_t req_sense_data[32]; /* Request sense data. */ +}; /* * ISP queue - marker entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define MARKER_TYPE 4 /* Marker entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t sys_define; /* System defined. */ - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved; - uint8_t lun; /* SCSI LUN */ - uint8_t target; /* SCSI ID */ - uint8_t modifier; /* Modifier (7-0). */ - #define MK_SYNC_ID_LUN 0 /* Synchronize ID/LUN */ - #define MK_SYNC_ID 1 /* Synchronize ID */ - #define MK_SYNC_ALL 2 /* Synchronize all ID/LUN */ - uint8_t reserved_1[53]; -}mrk_entry_t; +struct mrk_entry { + uint8_t entry_type; /* Entry type. */ +#define MARKER_TYPE 4 /* Marker entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t sys_define; /* System defined. */ + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved; + uint8_t lun; /* SCSI LUN */ + uint8_t target; /* SCSI ID */ + uint8_t modifier; /* Modifier (7-0). */ +#define MK_SYNC_ID_LUN 0 /* Synchronize ID/LUN */ +#define MK_SYNC_ID 1 /* Synchronize ID */ +#define MK_SYNC_ALL 2 /* Synchronize all ID/LUN */ + uint8_t reserved_1[53]; +}; /* * ISP queue - extended command entry structure definition. + * + * Unused by the driver! */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define EXTENDED_CMD_TYPE 5 /* Extended command entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t sys_define; /* System defined. */ - uint8_t entry_status; /* Entry Status. */ - uint32_t handle; /* System handle. */ - uint8_t lun; /* SCSI LUN */ - uint8_t target; /* SCSI ID */ - uint16_t cdb_len; /* SCSI command length. */ - uint16_t control_flags; /* Control flags. */ - uint16_t reserved; - uint16_t timeout; /* Command timeout. */ - uint16_t dseg_count; /* Data segment count. */ - uint8_t scsi_cdb[88]; /* SCSI command words. */ -}ecmd_entry_t; +struct ecmd_entry { + uint8_t entry_type; /* Entry type. */ +#define EXTENDED_CMD_TYPE 5 /* Extended command entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t sys_define; /* System defined. */ + uint8_t entry_status; /* Entry Status. */ + uint32_t handle; /* System handle. */ + uint8_t lun; /* SCSI LUN */ + uint8_t target; /* SCSI ID */ + uint16_t cdb_len; /* SCSI command length. */ + uint16_t control_flags; /* Control flags. */ + uint16_t reserved; + uint16_t timeout; /* Command timeout. */ + uint16_t dseg_count; /* Data segment count. */ + uint8_t scsi_cdb[88]; /* SCSI command words. */ +}; /* * ISP queue - 64-Bit addressing, command entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define COMMAND_A64_TYPE 9 /* Command A64 entry */ - uint8_t entry_count; /* Entry count. */ - uint8_t sys_define; /* System defined. */ - uint8_t entry_status; /* Entry Status. */ - uint32_t handle; /* System handle. */ - uint8_t lun; /* SCSI LUN */ - uint8_t target; /* SCSI ID */ - uint16_t cdb_len; /* SCSI command length. */ - uint16_t control_flags; /* Control flags. */ - uint16_t reserved; - uint16_t timeout; /* Command timeout. */ - uint16_t dseg_count; /* Data segment count. */ - uint8_t scsi_cdb[MAX_CMDSZ]; /* SCSI command words. */ - uint32_t reserved_1[2]; /* unused */ - uint32_t dseg_0_address[2]; /* Data segment 0 address. */ - uint32_t dseg_0_length; /* Data segment 0 length. */ - uint32_t dseg_1_address[2]; /* Data segment 1 address. */ - uint32_t dseg_1_length; /* Data segment 1 length. */ -}cmd_a64_entry_t, request_t; +typedef struct { + uint8_t entry_type; /* Entry type. */ +#define COMMAND_A64_TYPE 9 /* Command A64 entry */ + uint8_t entry_count; /* Entry count. */ + uint8_t sys_define; /* System defined. */ + uint8_t entry_status; /* Entry Status. */ + uint32_t handle; /* System handle. */ + uint8_t lun; /* SCSI LUN */ + uint8_t target; /* SCSI ID */ + uint16_t cdb_len; /* SCSI command length. */ + uint16_t control_flags; /* Control flags. */ + uint16_t reserved; + uint16_t timeout; /* Command timeout. */ + uint16_t dseg_count; /* Data segment count. */ + uint8_t scsi_cdb[MAX_CMDSZ]; /* SCSI command words. */ + uint32_t reserved_1[2]; /* unused */ + uint32_t dseg_0_address[2]; /* Data segment 0 address. */ + uint32_t dseg_0_length; /* Data segment 0 length. */ + uint32_t dseg_1_address[2]; /* Data segment 1 address. */ + uint32_t dseg_1_length; /* Data segment 1 length. */ +} cmd_a64_entry_t, request_t; /* * ISP queue - 64-Bit addressing, continuation entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define CONTINUE_A64_TYPE 0xA /* Continuation A64 entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t sys_define; /* System defined. */ - uint8_t entry_status; /* Entry Status. */ - uint32_t dseg_0_address[2]; /* Data segment 0 address. */ - uint32_t dseg_0_length; /* Data segment 0 length. */ - uint32_t dseg_1_address[2]; /* Data segment 1 address. */ - uint32_t dseg_1_length; /* Data segment 1 length. */ - uint32_t dseg_2_address[2]; /* Data segment 2 address. */ - uint32_t dseg_2_length; /* Data segment 2 length. */ - uint32_t dseg_3_address[2]; /* Data segment 3 address. */ - uint32_t dseg_3_length; /* Data segment 3 length. */ - uint32_t dseg_4_address[2]; /* Data segment 4 address. */ - uint32_t dseg_4_length; /* Data segment 4 length. */ -}cont_a64_entry_t; +struct cont_a64_entry { + uint8_t entry_type; /* Entry type. */ +#define CONTINUE_A64_TYPE 0xA /* Continuation A64 entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t sys_define; /* System defined. */ + uint8_t entry_status; /* Entry Status. */ + uint32_t dseg_0_address[2]; /* Data segment 0 address. */ + uint32_t dseg_0_length; /* Data segment 0 length. */ + uint32_t dseg_1_address[2]; /* Data segment 1 address. */ + uint32_t dseg_1_length; /* Data segment 1 length. */ + uint32_t dseg_2_address[2]; /* Data segment 2 address. */ + uint32_t dseg_2_length; /* Data segment 2 length. */ + uint32_t dseg_3_address[2]; /* Data segment 3 address. */ + uint32_t dseg_3_length; /* Data segment 3 length. */ + uint32_t dseg_4_address[2]; /* Data segment 4 address. */ + uint32_t dseg_4_length; /* Data segment 4 length. */ +}; /* * ISP queue - enable LUN entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define ENABLE_LUN_TYPE 0xB /* Enable LUN entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status not used. */ - uint32_t reserved_2; - uint16_t lun; /* Bit 15 is bus number. */ - uint16_t reserved_4; - uint32_t option_flags; - uint8_t status; - uint8_t reserved_5; - uint8_t command_count; /* Number of ATIOs allocated. */ - uint8_t immed_notify_count; /* Number of Immediate Notify */ - /* entries allocated. */ - uint8_t group_6_length; /* SCSI CDB length for group 6 */ - /* commands (2-26). */ - uint8_t group_7_length; /* SCSI CDB length for group 7 */ - /* commands (2-26). */ - uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ - uint16_t reserved_6[20]; -}elun_entry_t; +struct elun_entry { + uint8_t entry_type; /* Entry type. */ +#define ENABLE_LUN_TYPE 0xB /* Enable LUN entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status not used. */ + uint32_t reserved_2; + uint16_t lun; /* Bit 15 is bus number. */ + uint16_t reserved_4; + uint32_t option_flags; + uint8_t status; + uint8_t reserved_5; + uint8_t command_count; /* Number of ATIOs allocated. */ + uint8_t immed_notify_count; /* Number of Immediate Notify */ + /* entries allocated. */ + uint8_t group_6_length; /* SCSI CDB length for group 6 */ + /* commands (2-26). */ + uint8_t group_7_length; /* SCSI CDB length for group 7 */ + /* commands (2-26). */ + uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ + uint16_t reserved_6[20]; +}; /* * ISP queue - modify LUN entry structure definition. + * + * Unused by the driver! */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define MODIFY_LUN_TYPE 0xC /* Modify LUN entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved_2; - uint8_t lun; /* SCSI LUN */ - uint8_t reserved_3; - uint8_t operators; - uint8_t reserved_4; - uint32_t option_flags; - uint8_t status; - uint8_t reserved_5; - uint8_t command_count; /* Number of ATIOs allocated. */ - uint8_t immed_notify_count; /* Number of Immediate Notify */ - /* entries allocated. */ - uint16_t reserved_6; - uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ - uint16_t reserved_7[20]; -}modify_lun_entry_t; +struct modify_lun_entry { + uint8_t entry_type; /* Entry type. */ +#define MODIFY_LUN_TYPE 0xC /* Modify LUN entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved_2; + uint8_t lun; /* SCSI LUN */ + uint8_t reserved_3; + uint8_t operators; + uint8_t reserved_4; + uint32_t option_flags; + uint8_t status; + uint8_t reserved_5; + uint8_t command_count; /* Number of ATIOs allocated. */ + uint8_t immed_notify_count; /* Number of Immediate Notify */ + /* entries allocated. */ + uint16_t reserved_6; + uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ + uint16_t reserved_7[20]; +}; /* * ISP queue - immediate notify entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define IMMED_NOTIFY_TYPE 0xD /* Immediate notify entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved_2; - uint8_t lun; - uint8_t initiator_id; - uint8_t reserved_3; - uint8_t target_id; - uint32_t option_flags; - uint8_t status; - uint8_t reserved_4; - uint8_t tag_value; /* Received queue tag message value */ - uint8_t tag_type; /* Received queue tag message type */ - /* entries allocated. */ - uint16_t seq_id; - uint8_t scsi_msg[8]; /* SCSI message not handled by ISP */ - uint16_t reserved_5[8]; - uint8_t sense_data[18]; -}notify_entry_t; +struct notify_entry { + uint8_t entry_type; /* Entry type. */ +#define IMMED_NOTIFY_TYPE 0xD /* Immediate notify entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved_2; + uint8_t lun; + uint8_t initiator_id; + uint8_t reserved_3; + uint8_t target_id; + uint32_t option_flags; + uint8_t status; + uint8_t reserved_4; + uint8_t tag_value; /* Received queue tag message value */ + uint8_t tag_type; /* Received queue tag message type */ + /* entries allocated. */ + uint16_t seq_id; + uint8_t scsi_msg[8]; /* SCSI message not handled by ISP */ + uint16_t reserved_5[8]; + uint8_t sense_data[18]; +}; /* * ISP queue - notify acknowledge entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define NOTIFY_ACK_TYPE 0xE /* Notify acknowledge entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved_2; - uint8_t lun; - uint8_t initiator_id; - uint8_t reserved_3; - uint8_t target_id; - uint32_t option_flags; - uint8_t status; - uint8_t event; - uint16_t seq_id; - uint16_t reserved_4[22]; -}nack_entry_t; +struct nack_entry { + uint8_t entry_type; /* Entry type. */ +#define NOTIFY_ACK_TYPE 0xE /* Notify acknowledge entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved_2; + uint8_t lun; + uint8_t initiator_id; + uint8_t reserved_3; + uint8_t target_id; + uint32_t option_flags; + uint8_t status; + uint8_t event; + uint16_t seq_id; + uint16_t reserved_4[22]; +}; /* * ISP queue - Accept Target I/O (ATIO) entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define ACCEPT_TGT_IO_TYPE 6 /* Accept target I/O entry. */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved_2; - uint8_t lun; - uint8_t initiator_id; - uint8_t cdb_len; - uint8_t target_id; - uint32_t option_flags; - uint8_t status; - uint8_t scsi_status; - uint8_t tag_value; /* Received queue tag message value */ - uint8_t tag_type; /* Received queue tag message type */ - uint8_t cdb[26]; - uint8_t sense_data[18]; -}atio_entry_t; +struct atio_entry { + uint8_t entry_type; /* Entry type. */ +#define ACCEPT_TGT_IO_TYPE 6 /* Accept target I/O entry. */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved_2; + uint8_t lun; + uint8_t initiator_id; + uint8_t cdb_len; + uint8_t target_id; + uint32_t option_flags; + uint8_t status; + uint8_t scsi_status; + uint8_t tag_value; /* Received queue tag message value */ + uint8_t tag_type; /* Received queue tag message type */ + uint8_t cdb[26]; + uint8_t sense_data[18]; +}; /* * ISP queue - Continue Target I/O (CTIO) entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define CONTINUE_TGT_IO_TYPE 7 /* CTIO entry */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved_2; - uint8_t lun; /* SCSI LUN */ - uint8_t initiator_id; - uint8_t reserved_3; - uint8_t target_id; - uint32_t option_flags; - uint8_t status; - uint8_t scsi_status; - uint8_t tag_value; /* Received queue tag message value */ - uint8_t tag_type; /* Received queue tag message type */ - uint32_t transfer_length; - uint32_t residual; - uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ - uint16_t dseg_count; /* Data segment count. */ - uint32_t dseg_0_address; /* Data segment 0 address. */ - uint32_t dseg_0_length; /* Data segment 0 length. */ - uint32_t dseg_1_address; /* Data segment 1 address. */ - uint32_t dseg_1_length; /* Data segment 1 length. */ - uint32_t dseg_2_address; /* Data segment 2 address. */ - uint32_t dseg_2_length; /* Data segment 2 length. */ - uint32_t dseg_3_address; /* Data segment 3 address. */ - uint32_t dseg_3_length; /* Data segment 3 length. */ -}ctio_entry_t; +struct ctio_entry { + uint8_t entry_type; /* Entry type. */ +#define CONTINUE_TGT_IO_TYPE 7 /* CTIO entry */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved_2; + uint8_t lun; /* SCSI LUN */ + uint8_t initiator_id; + uint8_t reserved_3; + uint8_t target_id; + uint32_t option_flags; + uint8_t status; + uint8_t scsi_status; + uint8_t tag_value; /* Received queue tag message value */ + uint8_t tag_type; /* Received queue tag message type */ + uint32_t transfer_length; + uint32_t residual; + uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ + uint16_t dseg_count; /* Data segment count. */ + uint32_t dseg_0_address; /* Data segment 0 address. */ + uint32_t dseg_0_length; /* Data segment 0 length. */ + uint32_t dseg_1_address; /* Data segment 1 address. */ + uint32_t dseg_1_length; /* Data segment 1 length. */ + uint32_t dseg_2_address; /* Data segment 2 address. */ + uint32_t dseg_2_length; /* Data segment 2 length. */ + uint32_t dseg_3_address; /* Data segment 3 address. */ + uint32_t dseg_3_length; /* Data segment 3 length. */ +}; /* * ISP queue - CTIO returned entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define CTIO_RET_TYPE 7 /* CTIO return entry */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved_2; - uint8_t lun; /* SCSI LUN */ - uint8_t initiator_id; - uint8_t reserved_3; - uint8_t target_id; - uint32_t option_flags; - uint8_t status; - uint8_t scsi_status; - uint8_t tag_value; /* Received queue tag message value */ - uint8_t tag_type; /* Received queue tag message type */ - uint32_t transfer_length; - uint32_t residual; - uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ - uint16_t dseg_count; /* Data segment count. */ - uint32_t dseg_0_address; /* Data segment 0 address. */ - uint32_t dseg_0_length; /* Data segment 0 length. */ - uint32_t dseg_1_address; /* Data segment 1 address. */ - uint16_t dseg_1_length; /* Data segment 1 length. */ - uint8_t sense_data[18]; -}ctio_ret_entry_t; +struct ctio_ret_entry { + uint8_t entry_type; /* Entry type. */ +#define CTIO_RET_TYPE 7 /* CTIO return entry */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved_2; + uint8_t lun; /* SCSI LUN */ + uint8_t initiator_id; + uint8_t reserved_3; + uint8_t target_id; + uint32_t option_flags; + uint8_t status; + uint8_t scsi_status; + uint8_t tag_value; /* Received queue tag message value */ + uint8_t tag_type; /* Received queue tag message type */ + uint32_t transfer_length; + uint32_t residual; + uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ + uint16_t dseg_count; /* Data segment count. */ + uint32_t dseg_0_address; /* Data segment 0 address. */ + uint32_t dseg_0_length; /* Data segment 0 length. */ + uint32_t dseg_1_address; /* Data segment 1 address. */ + uint16_t dseg_1_length; /* Data segment 1 length. */ + uint8_t sense_data[18]; +}; /* * ISP queue - CTIO A64 entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define CTIO_A64_TYPE 0xF /* CTIO A64 entry */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved_2; - uint8_t lun; /* SCSI LUN */ - uint8_t initiator_id; - uint8_t reserved_3; - uint8_t target_id; - uint32_t option_flags; - uint8_t status; - uint8_t scsi_status; - uint8_t tag_value; /* Received queue tag message value */ - uint8_t tag_type; /* Received queue tag message type */ - uint32_t transfer_length; - uint32_t residual; - uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ - uint16_t dseg_count; /* Data segment count. */ - uint32_t reserved_4[2]; - uint32_t dseg_0_address[2]; /* Data segment 0 address. */ - uint32_t dseg_0_length; /* Data segment 0 length. */ - uint32_t dseg_1_address[2]; /* Data segment 1 address. */ - uint32_t dseg_1_length; /* Data segment 1 length. */ -}ctio_a64_entry_t; +struct ctio_a64_entry { + uint8_t entry_type; /* Entry type. */ +#define CTIO_A64_TYPE 0xF /* CTIO A64 entry */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved_2; + uint8_t lun; /* SCSI LUN */ + uint8_t initiator_id; + uint8_t reserved_3; + uint8_t target_id; + uint32_t option_flags; + uint8_t status; + uint8_t scsi_status; + uint8_t tag_value; /* Received queue tag message value */ + uint8_t tag_type; /* Received queue tag message type */ + uint32_t transfer_length; + uint32_t residual; + uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ + uint16_t dseg_count; /* Data segment count. */ + uint32_t reserved_4[2]; + uint32_t dseg_0_address[2]; /* Data segment 0 address. */ + uint32_t dseg_0_length; /* Data segment 0 length. */ + uint32_t dseg_1_address[2]; /* Data segment 1 address. */ + uint32_t dseg_1_length; /* Data segment 1 length. */ +}; /* * ISP queue - CTIO returned entry structure definition. */ -typedef struct -{ - uint8_t entry_type; /* Entry type. */ - #define CTIO_A64_RET_TYPE 0xF /* CTIO A64 returned entry */ - uint8_t entry_count; /* Entry count. */ - uint8_t reserved_1; - uint8_t entry_status; /* Entry Status. */ - uint32_t reserved_2; - uint8_t lun; /* SCSI LUN */ - uint8_t initiator_id; - uint8_t reserved_3; - uint8_t target_id; - uint32_t option_flags; - uint8_t status; - uint8_t scsi_status; - uint8_t tag_value; /* Received queue tag message value */ - uint8_t tag_type; /* Received queue tag message type */ - uint32_t transfer_length; - uint32_t residual; - uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ - uint16_t dseg_count; /* Data segment count. */ - uint16_t reserved_4[7]; - uint8_t sense_data[18]; -}ctio_a64_ret_entry_t; +struct ctio_a64_ret_entry { + uint8_t entry_type; /* Entry type. */ +#define CTIO_A64_RET_TYPE 0xF /* CTIO A64 returned entry */ + uint8_t entry_count; /* Entry count. */ + uint8_t reserved_1; + uint8_t entry_status; /* Entry Status. */ + uint32_t reserved_2; + uint8_t lun; /* SCSI LUN */ + uint8_t initiator_id; + uint8_t reserved_3; + uint8_t target_id; + uint32_t option_flags; + uint8_t status; + uint8_t scsi_status; + uint8_t tag_value; /* Received queue tag message value */ + uint8_t tag_type; /* Received queue tag message type */ + uint32_t transfer_length; + uint32_t residual; + uint16_t timeout; /* 0 = 30 seconds, 0xFFFF = disable */ + uint16_t dseg_count; /* Data segment count. */ + uint16_t reserved_4[7]; + uint8_t sense_data[18]; +}; /* * ISP request and response queue entry sizes */ -#define RESPONSE_ENTRY_SIZE (sizeof(response_t)) -#define REQUEST_ENTRY_SIZE (sizeof(request_t)) +#define RESPONSE_ENTRY_SIZE (sizeof(struct response)) +#define REQUEST_ENTRY_SIZE (sizeof(request_t)) /* * ISP status entry - completion status definitions. */ -#define CS_COMPLETE 0x0 /* No errors */ -#define CS_INCOMPLETE 0x1 /* Incomplete transfer of cmd. */ -#define CS_DMA 0x2 /* A DMA direction error. */ -#define CS_TRANSPORT 0x3 /* Transport error. */ -#define CS_RESET 0x4 /* SCSI bus reset occurred */ -#define CS_ABORTED 0x5 /* System aborted command. */ -#define CS_TIMEOUT 0x6 /* Timeout error. */ -#define CS_DATA_OVERRUN 0x7 /* Data overrun. */ -#define CS_COMMAND_OVERRUN 0x8 /* Command Overrun. */ -#define CS_STATUS_OVERRUN 0x9 /* Status Overrun. */ -#define CS_BAD_MSG 0xA /* Bad msg after status phase. */ -#define CS_NO_MSG_OUT 0xB /* No msg out after selection. */ -#define CS_EXTENDED_ID 0xC /* Extended ID failed. */ -#define CS_IDE_MSG 0xD /* Target rejected IDE msg. */ -#define CS_ABORT_MSG 0xE /* Target rejected abort msg. */ -#define CS_REJECT_MSG 0xF /* Target rejected reject msg. */ -#define CS_NOP_MSG 0x10 /* Target rejected NOP msg. */ -#define CS_PARITY_MSG 0x11 /* Target rejected parity msg. */ -#define CS_DEV_RESET_MSG 0x12 /* Target rejected dev rst msg. */ -#define CS_ID_MSG 0x13 /* Target rejected ID msg. */ -#define CS_FREE 0x14 /* Unexpected bus free. */ -#define CS_DATA_UNDERRUN 0x15 /* Data Underrun. */ -#define CS_TRANACTION_1 0x18 /* Transaction error 1 */ -#define CS_TRANACTION_2 0x19 /* Transaction error 2 */ -#define CS_TRANACTION_3 0x1a /* Transaction error 3 */ -#define CS_INV_ENTRY_TYPE 0x1b /* Invalid entry type */ -#define CS_DEV_QUEUE_FULL 0x1c /* Device queue full */ -#define CS_PHASED_SKIPPED 0x1d /* SCSI phase skipped */ -#define CS_ARS_FAILED 0x1e /* ARS failed */ -#define CS_LVD_BUS_ERROR 0x21 /* LVD bus error */ -#define CS_BAD_PAYLOAD 0x80 /* Driver defined */ -#define CS_UNKNOWN 0x81 /* Driver defined */ -#define CS_RETRY 0x82 /* Driver defined */ +#define CS_COMPLETE 0x0 /* No errors */ +#define CS_INCOMPLETE 0x1 /* Incomplete transfer of cmd. */ +#define CS_DMA 0x2 /* A DMA direction error. */ +#define CS_TRANSPORT 0x3 /* Transport error. */ +#define CS_RESET 0x4 /* SCSI bus reset occurred */ +#define CS_ABORTED 0x5 /* System aborted command. */ +#define CS_TIMEOUT 0x6 /* Timeout error. */ +#define CS_DATA_OVERRUN 0x7 /* Data overrun. */ +#define CS_COMMAND_OVERRUN 0x8 /* Command Overrun. */ +#define CS_STATUS_OVERRUN 0x9 /* Status Overrun. */ +#define CS_BAD_MSG 0xA /* Bad msg after status phase. */ +#define CS_NO_MSG_OUT 0xB /* No msg out after selection. */ +#define CS_EXTENDED_ID 0xC /* Extended ID failed. */ +#define CS_IDE_MSG 0xD /* Target rejected IDE msg. */ +#define CS_ABORT_MSG 0xE /* Target rejected abort msg. */ +#define CS_REJECT_MSG 0xF /* Target rejected reject msg. */ +#define CS_NOP_MSG 0x10 /* Target rejected NOP msg. */ +#define CS_PARITY_MSG 0x11 /* Target rejected parity msg. */ +#define CS_DEV_RESET_MSG 0x12 /* Target rejected dev rst msg. */ +#define CS_ID_MSG 0x13 /* Target rejected ID msg. */ +#define CS_FREE 0x14 /* Unexpected bus free. */ +#define CS_DATA_UNDERRUN 0x15 /* Data Underrun. */ +#define CS_TRANACTION_1 0x18 /* Transaction error 1 */ +#define CS_TRANACTION_2 0x19 /* Transaction error 2 */ +#define CS_TRANACTION_3 0x1a /* Transaction error 3 */ +#define CS_INV_ENTRY_TYPE 0x1b /* Invalid entry type */ +#define CS_DEV_QUEUE_FULL 0x1c /* Device queue full */ +#define CS_PHASED_SKIPPED 0x1d /* SCSI phase skipped */ +#define CS_ARS_FAILED 0x1e /* ARS failed */ +#define CS_LVD_BUS_ERROR 0x21 /* LVD bus error */ +#define CS_BAD_PAYLOAD 0x80 /* Driver defined */ +#define CS_UNKNOWN 0x81 /* Driver defined */ +#define CS_RETRY 0x82 /* Driver defined */ /* * ISP status entry - SCSI status byte bit definitions. @@ -1454,282 +970,143 @@ /* * ISP target entries - Option flags bit definitions. */ -#define OF_ENABLE_TAG BIT_1 /* Tagged queue action enable */ -#define OF_DATA_IN BIT_6 /* Data in to initiator */ - /* (data from target to initiator) */ -#define OF_DATA_OUT BIT_7 /* Data out from initiator */ - /* (data from initiator to target) */ +#define OF_ENABLE_TAG BIT_1 /* Tagged queue action enable */ +#define OF_DATA_IN BIT_6 /* Data in to initiator */ + /* (data from target to initiator) */ +#define OF_DATA_OUT BIT_7 /* Data out from initiator */ + /* (data from initiator to target) */ #define OF_NO_DATA (BIT_7 | BIT_6) -#define OF_DISC_DISABLED BIT_15 /* Disconnects disabled */ -#define OF_DISABLE_SDP BIT_24 /* Disable sending save data ptr */ -#define OF_SEND_RDP BIT_26 /* Send restore data pointers msg */ -#define OF_FORCE_DISC BIT_30 /* Disconnects mandatory */ -#define OF_SSTS BIT_31 /* Send SCSI status */ - -#if QL1280_TARGET_MODE_SUPPORT -/* - * Target Read/Write buffer structure. - */ -#define TARGET_DATA_OFFSET 4 -#define TARGET_DATA_SIZE 0x2000 /* 8K */ -#define TARGET_INQ_OFFSET (TARGET_DATA_OFFSET + TARGET_DATA_SIZE) -#define TARGET_SENSE_SIZE 18 -#define TARGET_BUF_SIZE 36 - -typedef struct -{ - uint8_t hdr[4]; - uint8_t data[TARGET_DATA_SIZE]; - struct ident inq; -}tgt_t; -#endif +#define OF_DISC_DISABLED BIT_15 /* Disconnects disabled */ +#define OF_DISABLE_SDP BIT_24 /* Disable sending save data ptr */ +#define OF_SEND_RDP BIT_26 /* Send restore data pointers msg */ +#define OF_FORCE_DISC BIT_30 /* Disconnects mandatory */ +#define OF_SSTS BIT_31 /* Send SCSI status */ + /* - * BUS parameters/settings structure - */ -typedef struct -{ - uint8_t id; /* Host adapter SCSI id */ - uint8_t bus_reset_delay; /* SCSI bus reset delay. */ - uint8_t failed_reset_count; /* number of time reset failed */ - uint8_t unused; - uint16_t device_enables; /* Device enable bits. */ - uint16_t lun_disables; /* LUN disable bits. */ - uint16_t qtag_enables; /* Tag queue enables. */ - uint16_t hiwat; /* High water mark per device. */ - uint8_t reset_marker :1; - uint8_t disable_scsi_reset :1; - uint8_t scsi_bus_dead :1; /* SCSI Bus is Dead, when 5 back to back resets failed */ + * BUS parameters/settings structure - UNUSED + */ +struct bus_param { + uint8_t id; /* Host adapter SCSI id */ + uint8_t bus_reset_delay; /* SCSI bus reset delay. */ + uint8_t failed_reset_count; /* number of time reset failed */ + uint8_t unused; + uint16_t device_enables; /* Device enable bits. */ + uint16_t lun_disables; /* LUN disable bits. */ + uint16_t qtag_enables; /* Tag queue enables. */ + uint16_t hiwat; /* High water mark per device. */ + uint8_t reset_marker:1; + uint8_t disable_scsi_reset:1; + uint8_t scsi_bus_dead:1; /* SCSI Bus is Dead, when 5 back to back resets failed */ +}; + + +struct qla_driver_setup { + uint32_t no_sync:1; + uint32_t no_wide:1; + uint32_t no_ppr:1; + uint32_t no_nvram:1; + uint16_t sync_mask; + uint16_t wide_mask; + uint16_t ppr_mask; +}; -}bus_param_t; /* * Linux Host Adapter structure */ -typedef struct scsi_qla_host -{ - /* Linux adapter configuration data */ - struct Scsi_Host *host; /* pointer to host data */ - struct scsi_qla_host *next; - device_reg_t *iobase; /* Base Memory-mapped I/O address */ - uint8_t pci_bus; - uint8_t pci_device_fn; - uint8_t devnum; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,95) - struct pci_dev *pdev; +struct scsi_qla_host { + /* Linux adapter configuration data */ + struct Scsi_Host *host; /* pointer to host data */ + struct scsi_qla_host *next; + struct device_reg *iobase; /* Base Memory-mapped I/O address */ + + unsigned char *mmpbase; /* memory mapped address */ + unsigned long host_no; + unsigned long instance; + struct pci_dev *pdev; + uint32_t device_id; + uint8_t pci_bus; + uint8_t pci_device_fn; + uint8_t devnum; + uint8_t revision; + uint8_t ports; + + unsigned long actthreads; + unsigned long isr_count; /* Interrupt count */ + unsigned long spurious_int; + + /* Outstandings ISP commands. */ + struct srb *outstanding_cmds[MAX_OUTSTANDING_COMMANDS]; + + /* BUS configuration data */ + struct bus_param bus_settings[MAX_BUSES]; + +#if 0 + /* bottom half run queue */ + struct tq_struct run_qla_bh; #endif - volatile unsigned char *mmpbase; /* memory mapped address */ - unsigned long host_no; - unsigned long instance; - uint8_t revision; - uint8_t ports; -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,1,0) - spinlock_t spin_lock; -#endif - volatile unsigned char cpu_lock_count[NR_CPUS]; - unsigned long actthreads; - unsigned long qthreads; - unsigned long isr_count; /* Interrupt count */ - unsigned long spurious_int; - - uint32_t device_id; - - /* Outstandings ISP commands. */ - srb_t *outstanding_cmds[MAX_OUTSTANDING_COMMANDS]; - /* BUS configuration data */ - bus_param_t bus_settings[MAX_BUSES]; - - /* Device LUN queues. */ - scsi_lu_t *dev[MAX_EQ]; /* Logical unit queues */ + /* Received ISP mailbox data. */ + volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; #ifdef UNUSED - /* Interrupt lock, and data */ - uint8_t intr_lock; /* Lock for interrupt locking */ + struct timer_list dev_timer[MAX_TARGETS]; #endif - /* bottom half run queue */ - struct tq_struct run_qla_bh; - - /* Received ISP mailbox data. */ - volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; - -#ifdef UNUSED - /* ISP ring lock, rings, and indexes */ - uint8_t ring_lock; /* ISP ring lock */ - struct timer_list dev_timer[MAX_TARGETS]; + dma_addr_t request_dma; /* Physical Address */ + request_t *request_ring; /* Base virtual address */ + request_t *request_ring_ptr; /* Current address. */ + uint16_t req_ring_index; /* Current index. */ + uint16_t req_q_cnt; /* Number of available entries. */ + + dma_addr_t response_dma; /* Physical address. */ + struct response *response_ring; /* Base virtual address */ + struct response *response_ring_ptr; /* Current address. */ + uint16_t rsp_ring_index; /* Current index. */ + +#if WATCHDOGTIMER + /* Watchdog queue, lock and total timer */ + uint8_t watchdog_q_lock; /* Lock for watchdog queue */ + struct srb *wdg_q_first; /* First job on watchdog queue */ + struct srb *wdg_q_last; /* Last job on watchdog queue */ + uint32_t total_timeout; /* Total timeout (quantum count) */ + uint32_t watchdogactive; #endif - request_t req[REQUEST_ENTRY_CNT+1]; - response_t res[RESPONSE_ENTRY_CNT+1]; - unsigned long request_dma; /* Physical address. */ - request_t *request_ring; /* Base virtual address */ - request_t *request_ring_ptr; /* Current address. */ - uint16_t req_ring_index; /* Current index. */ - uint16_t req_q_cnt; /* Number of available entries. */ - - unsigned long response_dma; /* Physical address. */ - response_t *response_ring; /* Base virtual address */ - response_t *response_ring_ptr; /* Current address. */ - uint16_t rsp_ring_index; /* Current index. */ - -#if QL1280_TARGET_MODE_SUPPORT - /* Target buffer and sense data. */ - uint32_t tbuf_dma; /* Physical address. */ - tgt_t *tbuf; - uint32_t tsense_dma; /* Physical address. */ - uint8_t *tsense; -#endif + struct srb *done_q_first; /* First job on done queue */ + struct srb *done_q_last; /* Last job on done queue */ -#if WATCHDOGTIMER - /* Watchdog queue, lock and total timer */ - uint8_t watchdog_q_lock; /* Lock for watchdog queue */ - srb_t *wdg_q_first; /* First job on watchdog queue */ - srb_t *wdg_q_last; /* Last job on watchdog queue */ - uint32_t total_timeout; /* Total timeout (quantum count) */ - uint32_t watchdogactive; -#endif - - srb_t *done_q_first; /* First job on done queue */ - srb_t *done_q_last; /* Last job on done queue */ + struct completion *mailbox_wait; - volatile struct - { - uint32_t watchdog_enabled :1; /* 0 */ - uint32_t mbox_int :1; /* 1 */ - uint32_t mbox_busy :1; /* 2 */ - uint32_t online :1; /* 3 */ - uint32_t reset_marker :1; /* 4 */ - uint32_t isp_abort_needed :1; /* 5 */ - uint32_t pci_64bit_slot :1; /* 6 */ - uint32_t disable_host_adapter :1; /* 7 */ - uint32_t reset_active :1; /* 8 */ - uint32_t abort_isp_active :1; /* 9 */ - uint32_t disable_risc_code_load :1; /* 10 */ - uint32_t enable_64bit_addressing :1; /* 11 */ -#define QLA1280_IN_ISR_BIT 12 - uint32_t in_isr :1; /* 12 */ - uint32_t in_abort :1; /* 13 */ - uint32_t in_reset :1; /* 14 */ - uint32_t dpc :1; /* 15 */ - uint32_t dpc_sched :1; /* 16 */ - uint32_t interrupts_on :1; /* 17 */ - }flags; + volatile struct { + uint32_t mbox_busy:1; /* 0 */ + uint32_t online:1; /* 1 */ + uint32_t reset_marker:1; /* 2 */ + uint32_t disable_host_adapter:1; /* 4 */ + uint32_t reset_active:1; /* 5 */ + uint32_t abort_isp_active:1; /* 6 */ + uint32_t disable_risc_code_load:1; /* 7 */ + uint32_t enable_64bit_addressing:1; /* 8 */ + uint32_t in_reset:1; /* 9 */ + uint32_t ints_enabled:1; + uint32_t ignore_nvram:1; +#ifdef __ia64__ + uint32_t use_pci_vchannel:1; +#endif + } flags; -}scsi_qla_host_t; + struct nvram nvram; + int nvram_valid; +}; /* * Macros to help code, maintain, etc. */ -#define SUBDEV(b, t, l) ( (b << (MAX_T_BITS + MAX_L_BITS)) | (t << MAX_L_BITS) | l) -#define LU_Q(ha, b, t, l) (ha->dev[SUBDEV(b, t, l)]) - -/* - * Locking Macro Definitions - * - * LOCK/UNLOCK definitions are lock/unlock primitives for multi-processor - * or spl/splx for uniprocessor. - */ -#define QLA1280_HIER HBA_HIER_BASE /* Locking hierarchy base for hba */ - -#define QLA1280_WATCHDOG_Q_LOCK(ha, p) -#define QLA1280_WATCHDOG_Q_UNLOCK(ha, p) - -#define QLA1280_SCSILU_LOCK(q) -#define QLA1280_SCSILU_UNLOCK(q) - -#define QLA1280_INTR_LOCK(ha) -#define QLA1280_INTR_UNLOCK(ha) +#define SUBDEV(b, t, l) ((b << (MAX_T_BITS + MAX_L_BITS)) | (t << MAX_L_BITS) | l) +#define LU_Q(ha, b, t, l) (ha->dev[SUBDEV(b, t, l)]) -#define QLA1280_RING_LOCK(ha) -#define QLA1280_RING_UNLOCK(ha) - -#if defined(__cplusplus) -} -#endif -/* - * Linux - SCSI Driver Interface Function Prototypes. - */ -int qla1280_proc_info ( char *, char **, off_t, int, int, int); -const char * qla1280_info(struct Scsi_Host *host); -int qla1280_detect(Scsi_Host_Template *); -int qla1280_release(struct Scsi_Host *); -const char * qla1280_info(struct Scsi_Host *); -int qla1280_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); -int qla1280_abort(Scsi_Cmnd *); -int qla1280_reset(Scsi_Cmnd *, unsigned int); -int qla1280_biosparam(Disk *, kdev_t, int[]); -void qla1280_intr_handler(int, void *, struct pt_regs *); -void qla1280_setup(char *s, int *dummy); -#if defined(__386__) -# define QLA1280_BIOSPARAM qla1280_biosparam -#else -# define QLA1280_BIOSPARAM NULL -#endif - -/* - * Scsi_Host_template (see hosts.h) - * Device driver Interfaces to mid-level SCSI driver. - */ -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,95) -/* This interface is now obsolete !!! */ -#define QLA1280_LINUX_TEMPLATE { \ - next: NULL, \ - usage_count: NULL, \ - proc_dir: NULL, \ - proc_info: NULL, \ - name: "Qlogic ISP 1280", \ - detect: qla1280_detect, \ - release: qla1280_release, \ - info: qla1280_info, \ - command: NULL, \ - queuecommand: qla1280_queuecommand, \ - abort: qla1280_abort, \ - reset: qla1280_reset, \ - slave_attach: NULL, \ - bios_param: QLA1280_BIOSPARAM, \ - can_queue: 255, /* MAX_OUTSTANDING_COMMANDS */ \ - this_id: -1, /* scsi id of host adapter */ \ - sg_tablesize: SG_ALL, \ - cmd_per_lun: 3, /* max commands per lun */ \ - present: 0, /* number of 1280s present */ \ - unchecked_isa_dma: 0, /* no memeory DMA restrictions */ \ - use_clustering: ENABLE_CLUSTERING \ -} -#else - -#define QLA1280_LINUX_TEMPLATE { \ - next: NULL, \ - module: NULL, \ - proc_dir: NULL, \ - proc_info: qla1280_proc_info, \ - name: "Qlogic ISP 1280\1080", \ - detect: qla1280_detect, \ - release: qla1280_release, \ - info: qla1280_info, \ - ioctl: NULL, \ - command: NULL, \ - queuecommand: qla1280_queuecommand, \ - eh_strategy_handler: NULL, \ - eh_abort_handler: NULL, \ - eh_device_reset_handler: NULL, \ - eh_bus_reset_handler: NULL, \ - eh_host_reset_handler: NULL, \ - abort: qla1280_abort, \ - reset: qla1280_reset, \ - slave_attach: NULL, \ - bios_param: QLA1280_BIOSPARAM, \ - can_queue: 255, /* max simultaneous cmds */\ - this_id: -1, /* scsi id of host adapter */\ - sg_tablesize: SG_ALL, /* max scatter-gather cmds */\ - cmd_per_lun: 3, /* cmds per lun (linked cmds) */\ - present: 0, /* number of 7xxx's present */\ - unchecked_isa_dma: 0, /* no memory DMA restrictions */\ - use_clustering: ENABLE_CLUSTERING, \ - use_new_eh_code: 0, \ - emulated: 0 \ -} -#endif +#endif /* HOSTS_C */ -#endif /* _IO_HBA_QLA1280_H */ +#endif /* _IO_HBA_QLA1280_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/scsi_scan.c linux-2.4.23-pre8/drivers/scsi/scsi_scan.c --- linux-2.4.22/drivers/scsi/scsi_scan.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/scsi_scan.c 2003-10-22 22:49:17.000000000 +0000 @@ -114,7 +114,8 @@ {"HP", "C2500A", "", BLIST_NOLUN}, /* scanjet iicx */ {"HP", "A6188A", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7100 Array */ {"HP", "A6189A", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7400 Array */ - {"HP", "A6189B", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7410 Array */ + {"HP", "A6189B", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7110 Array */ + {"HP", "A6218A", "*", BLIST_SPARSELUN | BLIST_LARGELUN},/* HP Va7410 Array */ {"YAMAHA", "CDR100", "1.00", BLIST_NOLUN}, /* Locks up if polled for lun != 0 */ {"YAMAHA", "CDR102", "1.00", BLIST_NOLUN}, /* Locks up if polled for lun != 0 * extra reset */ @@ -204,6 +205,7 @@ {"HP", "C7200", "*", BLIST_SPARSELUN}, /* Medium Changer */ {"SMSC", "USB 2 HS", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, {"XYRATEX", "RS", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, + {"NEC", "iStorage", "*", BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN}, /* * Must be at end of list... diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/sun3_scsi.c linux-2.4.23-pre8/drivers/scsi/sun3_scsi.c --- linux-2.4.22/drivers/scsi/sun3_scsi.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/sun3_scsi.c 2003-10-22 22:47:40.000000000 +0000 @@ -267,7 +267,7 @@ #ifndef REAL_DMA printk("scsi%d: IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; #else printk("scsi%d: IRQ%d not free, bailing out\n", instance->host_no, instance->irq); @@ -276,7 +276,7 @@ } printk("scsi%d: Sun3 5380 at port %lX irq", instance->host_no, instance->io_port); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) printk ("s disabled"); else printk (" %d", instance->irq); @@ -305,7 +305,7 @@ #ifdef MODULE int sun3scsi_release (struct Scsi_Host *shpnt) { - if (shpnt->irq != IRQ_NONE) + if (shpnt->irq != SCSI_IRQ_NONE) free_irq (shpnt->irq, NULL); iounmap((void *)sun3_scsi_regp); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/sun3_scsi_vme.c linux-2.4.23-pre8/drivers/scsi/sun3_scsi_vme.c --- linux-2.4.22/drivers/scsi/sun3_scsi_vme.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/sun3_scsi_vme.c 2003-10-22 22:47:58.000000000 +0000 @@ -236,7 +236,7 @@ #ifndef REAL_DMA printk("scsi%d: IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; #else printk("scsi%d: IRQ%d not free, bailing out\n", instance->host_no, instance->irq); @@ -245,7 +245,7 @@ } printk("scsi%d: Sun3 5380 VME at port %lX irq", instance->host_no, instance->io_port); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) printk ("s disabled"); else printk (" %d", instance->irq); @@ -281,7 +281,7 @@ #ifdef MODULE int sun3scsi_release (struct Scsi_Host *shpnt) { - if (shpnt->irq != IRQ_NONE) + if (shpnt->irq != SCSI_IRQ_NONE) free_irq (shpnt->irq, NULL); iounmap(sun3_scsi_regp); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/sym53c8xx_2/Makefile linux-2.4.23-pre8/drivers/scsi/sym53c8xx_2/Makefile --- linux-2.4.22/drivers/scsi/sym53c8xx_2/Makefile 2001-11-09 23:22:54.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/sym53c8xx_2/Makefile 2003-10-22 22:49:17.000000000 +0000 @@ -1,14 +1,14 @@ -# File: drivers/sym53c8xx/Makefile +# File: drivers/scsi/sym53c8xx_2/Makefile # Makefile for the NCR/SYMBIOS/LSI 53C8XX PCI SCSI controllers driver. -list-multi := sym53c8xx.o -sym53c8xx-objs := sym_fw.o sym_glue.o sym_hipd.o sym_malloc.o sym_misc.o sym_nvram.o -obj-$(CONFIG_SCSI_SYM53C8XX_2) := sym53c8xx.o +list-multi := sym53c8xx_2.o +sym53c8xx_2-objs := sym_fw.o sym_glue.o sym_hipd.o sym_malloc.o sym_misc.o sym_nvram.o +obj-$(CONFIG_SCSI_SYM53C8XX_2) := sym53c8xx_2.o EXTRA_CFLAGS += -I. -sym53c8xx.o: $(sym53c8xx-objs) - $(LD) -r -o $@ $(sym53c8xx-objs) +sym53c8xx_2.o: $(sym53c8xx_2-objs) + $(LD) -r -o $@ $(sym53c8xx_2-objs) include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/t128.c linux-2.4.23-pre8/drivers/scsi/t128.c --- linux-2.4.22/drivers/scsi/t128.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/t128.c 2003-10-22 22:49:34.000000000 +0000 @@ -237,20 +237,20 @@ else instance->irq = NCR5380_probe_irq(instance, T128_IRQS); - if (instance->irq != IRQ_NONE) + if (instance->irq != SCSI_IRQ_NONE) if (request_irq(instance->irq, do_t128_intr, SA_INTERRUPT, "t128", NULL)) { printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); - instance->irq = IRQ_NONE; + instance->irq = SCSI_IRQ_NONE; } - if (instance->irq == IRQ_NONE) { + if (instance->irq == SCSI_IRQ_NONE) { printk(KERN_INFO "scsi%d : interrupts not enabled. for better interactive performance,\n", instance->host_no); printk(KERN_INFO "scsi%d : please jumper the board for a free IRQ.\n", instance->host_no); } printk(KERN_INFO "scsi%d : at 0x%08lx", instance->host_no,instance->base); - if (instance->irq == IRQ_NONE) + if (instance->irq == SCSI_IRQ_NONE) printk(" interrupts disabled"); else printk(" irq %d", instance->irq); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/tmscsim.c linux-2.4.23-pre8/drivers/scsi/tmscsim.c --- linux-2.4.22/drivers/scsi/tmscsim.c 2001-12-21 17:41:55.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/tmscsim.c 2003-10-22 22:49:58.000000000 +0000 @@ -3047,7 +3047,7 @@ /* TO DO: We should check for outstanding commands first. */ dc390_shutdown (host); - if (host->irq != IRQ_NONE) + if (host->irq != SCSI_IRQ_NONE) { DEBUG0(printk(KERN_INFO "DC390: Free IRQ %i\n",host->irq);) free_irq (host->irq, pACB); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/scsi/tmscsim.h linux-2.4.23-pre8/drivers/scsi/tmscsim.h --- linux-2.4.22/drivers/scsi/tmscsim.h 2001-07-20 04:08:49.000000000 +0000 +++ linux-2.4.23-pre8/drivers/scsi/tmscsim.h 2003-10-22 22:49:34.000000000 +0000 @@ -11,7 +11,7 @@ #include #include -#define IRQ_NONE 255 +#define SCSI_IRQ_NONE 255 #define MAX_ADAPTER_NUM 4 #define MAX_SG_LIST_BUF 16 /* Not used */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/Config.in linux-2.4.23-pre8/drivers/sound/Config.in --- linux-2.4.22/drivers/sound/Config.in 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/Config.in 2003-10-22 22:49:10.000000000 +0000 @@ -7,6 +7,12 @@ # Prompt user for primary drivers. dep_tristate ' ALi5455 audio support' CONFIG_SOUND_ALI5455 $CONFIG_SOUND $CONFIG_PCI +if [ "$CONFIG_SOUND_ALI5455" = "y" -o "$CONFIG_SOUND_ALI5455" = "m" ]; then + bool ' Enable Codec SPDIF OUT ( Pcm Out Share )' CONFIG_SOUND_ALI5455_CODECSPDIFOUT_PCMOUTSHARE + bool ' Enable Codec SPDIF OUT ( Codec Independent DMA )' CONFIG_SOUND_ALI5455_CODECSPDIFOUT_CODECINDEPENDENTDMA + bool ' Enable Controller SPDIF OUT ( Pcm Out Share )' CONFIG_SOUND_ALI5455_CONTROLLERSPDIFOUT_PCMOUTSHARE + bool ' Enable Controller SPDIF OUT ( Controller Independent DMA )' CONFIG_SOUND_ALI5455_CONTROLLERSPDIFOUT_CONTROLLERINDEPENDENTDMA +fi dep_tristate ' BT878 audio dma' CONFIG_SOUND_BT878 $CONFIG_SOUND $CONFIG_PCI dep_tristate ' C-Media PCI (CMI8338/8738)' CONFIG_SOUND_CMPCI $CONFIG_SOUND $CONFIG_PCI if [ "$CONFIG_SOUND_CMPCI" = "y" -o "$CONFIG_SOUND_CMPCI" = "m" ]; then @@ -226,6 +232,10 @@ dep_tristate ' TV card (bt848) mixer support' CONFIG_SOUND_TVMIXER $CONFIG_SOUND $CONFIG_I2C +dep_tristate ' AD1980 front/back switch plugin' CONFIG_SOUND_AD1980 $CONFIG_SOUND + +dep_tristate ' Wolfson Touchscreen/BMON plugin' CONFIG_SOUND_WM97XX $CONFIG_SOUND + # A cross directory dependence. The sound modules will need gameport.o compiled in, # but it resides in the drivers/char/joystick directory. This define_tristate takes # care of that. --Vojtech diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/Makefile linux-2.4.23-pre8/drivers/sound/Makefile --- linux-2.4.22/drivers/sound/Makefile 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/Makefile 2003-10-22 22:48:20.000000000 +0000 @@ -81,6 +81,8 @@ obj-$(CONFIG_SOUND_RME96XX) += rme96xx.o obj-$(CONFIG_SOUND_BT878) += btaudio.o obj-$(CONFIG_SOUND_IT8172) += ite8172.o ac97_codec.o +obj-$(CONFIG_SOUND_AD1980) += ac97_plugin_ad1980.o +obj-$(CONFIG_SOUND_WM97XX) += ac97_plugin_wm97xx.o ifeq ($(CONFIG_MIDI_EMU10K1),y) obj-$(CONFIG_SOUND_EMU10K1) += sound.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/ac97_codec.c linux-2.4.23-pre8/drivers/sound/ac97_codec.c --- linux-2.4.22/drivers/sound/ac97_codec.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/ac97_codec.c 2003-10-22 22:47:49.000000000 +0000 @@ -1077,6 +1077,9 @@ /* WM9711, WM9712 */ static int wolfson_init11(struct ac97_codec * codec) { + /* stop pop's during suspend/resume */ + codec->codec_write(codec, AC97_WM97XX_TEST, codec->codec_read(codec, AC97_WM97XX_TEST) & 0xffbf); + /* set out3 volume */ codec->codec_write(codec, AC97_WM9711_OUT3VOL, 0x0808); return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/ac97_plugin_wm97xx.c linux-2.4.23-pre8/drivers/sound/ac97_plugin_wm97xx.c --- linux-2.4.22/drivers/sound/ac97_plugin_wm97xx.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/ac97_plugin_wm97xx.c 2003-10-22 22:47:50.000000000 +0000 @@ -0,0 +1,1408 @@ +/* + * ac97_plugin_wm97xx.c -- Touch screen driver for Wolfson WM9705 and WM9712 + * AC97 Codecs. + * + * Copyright 2003 Wolfson Microelectronics PLC. + * Author: Liam Girdwood + * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.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 of the License, or (at your + * option) any later version. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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. + * + * Notes: + * + * Features: + * - supports WM9705, WM9712 + * - polling mode + * - coordinate polling + * - adjustable rpu/dpp settings + * - adjustable pressure current + * - adjustable sample settle delay + * - 4 and 5 wire touchscreens (5 wire is WM9712 only) + * - pen down detection + * - battery monitor + * - sample AUX adc's + * - power management + * - direct AC97 IO from userspace (#define WM97XX_TS_DEBUG) + * + * TODO: + * - continuous mode + * - adjustable sample rate + * - AUX adc in coordinate / continous modes + * - Official device identifier or misc device ? + * + * Revision history + * 7th May 2003 Initial version. + * 6th June 2003 Added non module support and AC97 registration. + * 18th June 2003 Added AUX adc sampling. + * 23rd June 2003 Did some minimal reformatting, fixed a couple of + * locking bugs and noted a race to fix. + * 24th June 2003 Added power management and fixed race condition. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* WM97xx registers and bits */ +#include /* get_user,copy_to_user */ +#include + +#define TS_NAME "ac97_plugin_wm97xx" +#define TS_MINOR 16 +#define WM_TS_VERSION "0.6" +#define AC97_NUM_REG 64 + + +/* + * Debug + */ + +#define PFX TS_NAME +#define WM97XX_TS_DEBUG 0 + +#ifdef WM97XX_TS_DEBUG +#define dbg(format, arg...) printk(KERN_DEBUG PFX ": " format "\n" , ## arg) +#else +#define dbg(format, arg...) do {} while (0) +#endif +#define err(format, arg...) printk(KERN_ERR PFX ": " format "\n" , ## arg) +#define info(format, arg...) printk(KERN_INFO PFX ": " format "\n" , ## arg) +#define warn(format, arg...) printk(KERN_WARNING PFX ": " format "\n" , ## arg) + +/* + * Module parameters + */ + + +/* + * Set the codec sample mode. + * + * The WM9712 can sample touchscreen data in 3 different operating + * modes. i.e. polling, coordinate and continous. + * + * Polling:- The driver polls the codec and issues 3 seperate commands + * over the AC97 link to read X,Y and pressure. + * + * Coordinate: - The driver polls the codec and only issues 1 command over + * the AC97 link to read X,Y and pressure. This mode has + * strict timing requirements and may drop samples if + * interrupted. However, it is less demanding on the AC97 + * link. Note: this mode requires a larger delay than polling + * mode. + * + * Continuous:- The codec automatically samples X,Y and pressure and then + * sends the data over the AC97 link in slots. This is the + * same method used by the codec when recording audio. + * + * Set mode = 0 for polling, 1 for coordinate and 2 for continuous. + * + */ +MODULE_PARM(mode,"i"); +MODULE_PARM_DESC(mode, "Set WM97XX operation mode"); +static int mode = 0; + +/* + * WM9712 - Set internal pull up for pen detect. + * + * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) + * i.e. pull up resistance = 64k Ohms / rpu. + * + * Adjust this value if you are having problems with pen detect not + * detecting any down events. + */ +MODULE_PARM(rpu,"i"); +MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); +static int rpu = 0; + +/* + * WM9705 - Pen detect comparator threshold. + * + * 0 to Vmid in 15 steps, 0 = use zero power comparator with Vmid threshold + * i.e. 1 = Vmid/15 threshold + * 15 = Vmid/1 threshold + * + * Adjust this value if you are having problems with pen detect not + * detecting any down events. + */ +MODULE_PARM(pdd,"i"); +MODULE_PARM_DESC(pdd, "Set pen detect comparator threshold"); +static int pdd = 0; + +/* + * Set current used for pressure measurement. + * + * Set pil = 2 to use 400uA + * pil = 1 to use 200uA and + * pil = 0 to disable pressure measurement. + * + * This is used to increase the range of values returned by the adc + * when measureing touchpanel pressure. + */ +MODULE_PARM(pil,"i"); +MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); +static int pil = 0; + +/* + * WM9712 - Set five_wire = 1 to use a 5 wire touchscreen. + * + * NOTE: Five wire mode does not allow for readback of pressure. + */ +MODULE_PARM(five_wire,"i"); +MODULE_PARM_DESC(five_wire, "Set 5 wire touchscreen."); +static int five_wire = 0; + +/* + * Set adc sample delay. + * + * For accurate touchpanel measurements, some settling time may be + * required between the switch matrix applying a voltage across the + * touchpanel plate and the ADC sampling the signal. + * + * This delay can be set by setting delay = n, where n is the array + * position of the delay in the array delay_table below. + * Long delays > 1ms are supported for completeness, but are not + * recommended. + */ +MODULE_PARM(delay,"i"); +MODULE_PARM_DESC(delay, "Set adc sample delay."); +static int delay = 4; + + +/* +++++++++++++ Lifted from include/linux/h3600_ts.h ++++++++++++++*/ +typedef struct { + unsigned short pressure; // touch pressure + unsigned short x; // calibrated X + unsigned short y; // calibrated Y + unsigned short millisecs; // timestamp of this event +} TS_EVENT; + +typedef struct { + int xscale; + int xtrans; + int yscale; + int ytrans; + int xyswap; +} TS_CAL; + +/* Use 'f' as magic number */ +#define IOC_MAGIC 'f' + +#define TS_GET_RATE _IO(IOC_MAGIC, 8) +#define TS_SET_RATE _IO(IOC_MAGIC, 9) +#define TS_GET_CAL _IOR(IOC_MAGIC, 10, TS_CAL) +#define TS_SET_CAL _IOW(IOC_MAGIC, 11, TS_CAL) + +/* +++++++++++++ Done lifted from include/linux/h3600_ts.h +++++++++*/ + +#define TS_GET_COMP1 _IOR(IOC_MAGIC, 12, short) +#define TS_GET_COMP2 _IOR(IOC_MAGIC, 13, short) +#define TS_GET_BMON _IOR(IOC_MAGIC, 14, short) +#define TS_GET_WIPER _IOR(IOC_MAGIC, 15, short) + +#ifdef WM97XX_TS_DEBUG +/* debug get/set ac97 codec register ioctl's */ +#define TS_GET_AC97_REG _IOR(IOC_MAGIC, 20, short) +#define TS_SET_AC97_REG _IOW(IOC_MAGIC, 21, short) +#define TS_SET_AC97_INDEX _IOW(IOC_MAGIC, 22, short) +#endif + +#define EVENT_BUFSIZE 128 + +typedef struct { + TS_CAL cal; /* Calibration values */ + TS_EVENT event_buf[EVENT_BUFSIZE];/* The event queue */ + int nextIn, nextOut; + int event_count; + int is_wm9712:1; /* are we a WM912 or a WM9705 */ + int is_registered:1; /* Is the driver AC97 registered */ + int line_pgal:5; + int line_pgar:5; + int phone_pga:5; + int mic_pgal:5; + int mic_pgar:5; + int overruns; /* event buffer overruns */ + int adc_errs; /* sample read back errors */ +#ifdef WM97XX_TS_DEBUG + short ac97_index; +#endif + struct fasync_struct *fasync; /* asynch notification */ + struct timer_list acq_timer; /* Timer for triggering acquisitions */ + wait_queue_head_t wait; /* read wait queue */ + spinlock_t lock; + struct ac97_codec *codec; + struct proc_dir_entry *wm97xx_ts_ps; +#ifdef WM97XX_TS_DEBUG + struct proc_dir_entry *wm97xx_debug_ts_ps; +#endif + struct pm_dev * pm; +} wm97xx_ts_t; + +static inline void poll_delay (void); +static int __init wm97xx_ts_init_module(void); +static int wm97xx_poll_read_adc (wm97xx_ts_t* ts, u16 adcsel, u16* sample); +static int wm97xx_coord_read_adc (wm97xx_ts_t* ts, u16* x, u16* y, + u16* pressure); +static inline int pendown (wm97xx_ts_t *ts); +static void wm97xx_acq_timer(unsigned long data); +static int wm97xx_fasync(int fd, struct file *filp, int mode); +static int wm97xx_ioctl(struct inode * inode, struct file *filp, + unsigned int cmd, unsigned long arg); +static unsigned int wm97xx_poll(struct file * filp, poll_table * wait); +static ssize_t wm97xx_read(struct file * filp, char * buf, size_t count, + loff_t * l); +static int wm97xx_open(struct inode * inode, struct file * filp); +static int wm97xx_release(struct inode * inode, struct file * filp); +static void init_wm97xx_phy(void); +static int adc_get (wm97xx_ts_t *ts, unsigned short *value, int id); +static int wm97xx_probe(struct ac97_codec *codec, struct ac97_driver *driver); +static void wm97xx_remove(struct ac97_codec *codec, struct ac97_driver *driver); +static void wm97xx_ts_cleanup_module(void); +static int wm97xx_pm_event(struct pm_dev *dev, pm_request_t rqst, void *data); +static void wm97xx_suspend(void); +static void wm97xx_resume(void); +static void wm9712_pga_save(wm97xx_ts_t* ts); +static void wm9712_pga_restore(wm97xx_ts_t* ts); + +/* AC97 registration info */ +static struct ac97_driver wm9705_driver = { + codec_id: 0x574D4C05, + codec_mask: 0xFFFFFFFF, + name: "Wolfson WM9705 Touchscreen/BMON", + probe: wm97xx_probe, + remove: __devexit_p(wm97xx_remove), +}; + +static struct ac97_driver wm9712_driver = { + codec_id: 0x574D4C12, + codec_mask: 0xFFFFFFFF, + name: "Wolfson WM9712 Touchscreen/BMON", + probe: wm97xx_probe, + remove: __devexit_p(wm97xx_remove), +}; + +/* we only support a single touchscreen */ +static wm97xx_ts_t wm97xx_ts; + +/* + * ADC sample delay times in uS + */ +static const int delay_table[16] = { + 21, // 1 AC97 Link frames + 42, // 2 + 84, // 4 + 167, // 8 + 333, // 16 + 667, // 32 + 1000, // 48 + 1333, // 64 + 2000, // 96 + 2667, // 128 + 3333, // 160 + 4000, // 192 + 4667, // 224 + 5333, // 256 + 6000, // 288 + 0 // No delay, switch matrix always on +}; + +/* + * Delay after issuing a POLL command. + * + * The delay is 3 AC97 link frames + the touchpanel settling delay + */ + +static inline void poll_delay(void) +{ + int pdelay = 3 * AC97_LINK_FRAME + delay_table[delay]; + udelay (pdelay); +} + + +/* + * sample the auxillary ADC's + */ + +static int adc_get(wm97xx_ts_t* ts, unsigned short * value, int id) +{ + short adcsel = 0; + + /* first find out our adcsel flag */ + if (ts->is_wm9712) { + switch (id) { + case TS_COMP1: + adcsel = WM9712_ADCSEL_COMP1; + break; + case TS_COMP2: + adcsel = WM9712_ADCSEL_COMP2; + break; + case TS_BMON: + adcsel = WM9712_ADCSEL_BMON; + break; + case TS_WIPER: + adcsel = WM9712_ADCSEL_WIPER; + break; + } + } else { + switch (id) { + case TS_COMP1: + adcsel = WM9705_ADCSEL_PCBEEP; + break; + case TS_COMP2: + adcsel = WM9705_ADCSEL_PHONE; + break; + case TS_BMON: + adcsel = WM9705_ADCSEL_BMON; + break; + case TS_WIPER: + adcsel = WM9705_ADCSEL_AUX; + break; + } + } + + /* now sample the adc */ + if (mode == 1) { + /* coordinate mode - not currently available (TODO) */ + return 0; + } + else + { + /* polling mode */ + if (!wm97xx_poll_read_adc(ts, adcsel, value)) + return 0; + } + + return 1; +} + + +/* + * Read a sample from the adc in polling mode. + */ +static int wm97xx_poll_read_adc (wm97xx_ts_t* ts, u16 adcsel, u16* sample) +{ + u16 dig1; + int timeout = 5 * delay; + + /* set up digitiser */ + dig1 = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER1); + dig1&=0x0fff; + ts->codec->codec_write(ts->codec, AC97_WM97XX_DIGITISER1, dig1 | adcsel | + WM97XX_POLL); + + /* wait 3 AC97 time slots + delay for conversion */ + poll_delay(); + + /* wait for POLL to go low */ + while ((ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) && timeout) { + udelay(AC97_LINK_FRAME); + timeout--; + } + if (timeout > 0) + *sample = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER_RD); + else { + ts->adc_errs++; + err ("adc sample timeout"); + return 0; + } + + /* check we have correct sample */ + if ((*sample & 0x7000) != adcsel ) { + err ("adc wrong sample, read %x got %x", adcsel, *sample & 0x7000); + return 0; + } + return 1; +} + +/* + * Read a sample from the adc in coordinate mode. + */ +static int wm97xx_coord_read_adc(wm97xx_ts_t* ts, u16* x, u16* y, u16* pressure) +{ + u16 dig1; + int timeout = 5 * delay; + + /* set up digitiser */ + dig1 = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER1); + dig1&=0x0fff; + ts->codec->codec_write(ts->codec, AC97_WM97XX_DIGITISER1, dig1 | WM97XX_ADCSEL_PRES | + WM97XX_POLL); + + /* wait 3 AC97 time slots + delay for conversion */ + poll_delay(); + + /* read X then wait for 1 AC97 link frame + settling delay */ + *x = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER_RD); + udelay (AC97_LINK_FRAME + delay_table[delay]); + + /* read Y */ + *y = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER_RD); + + /* wait for POLL to go low and then read pressure */ + while ((ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER1) & WM97XX_POLL)&& timeout) { + udelay(AC97_LINK_FRAME); + timeout--; + } + if (timeout > 0) + *pressure = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER_RD); + else { + ts->adc_errs++; + err ("adc sample timeout"); + return 0; + } + + /* check we have correct samples */ + if (((*x & 0x7000) == 0x1000) && ((*y & 0x7000) == 0x2000) && + ((*pressure & 0x7000) == 0x3000)) { + return 1; + } else { + ts->adc_errs++; + err ("adc got wrong samples, got x 0x%x y 0x%x pressure 0x%x", *x, *y, *pressure); + return 0; + } +} + +/* + * Is the pen down ? + */ +static inline int pendown (wm97xx_ts_t *ts) +{ + return ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER_RD) & WM97XX_PEN_DOWN; +} + +/* + * X,Y coordinates and pressure aquisition function. + * This function is run by a kernel timer and it's frequency between + * calls is the touchscreen polling rate; + */ + +static void wm97xx_acq_timer(unsigned long data) +{ + wm97xx_ts_t* ts = (wm97xx_ts_t*)data; + unsigned long flags; + long x,y; + TS_EVENT event; + + spin_lock_irqsave(&ts->lock, flags); + + /* are we still registered ? */ + if (!ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + return; /* we better stop then */ + } + + /* read coordinates if pen is down */ + if (!pendown(ts)) + goto acq_exit; + + if (mode == 1) { + /* coordinate mode */ + if (!wm97xx_coord_read_adc(ts, (u16*)&x, (u16*)&y, &event.pressure)) + goto acq_exit; + } else + { + /* polling mode */ + if (!wm97xx_poll_read_adc(ts, WM97XX_ADCSEL_X, (u16*)&x)) + goto acq_exit; + if (!wm97xx_poll_read_adc(ts, WM97XX_ADCSEL_Y, (u16*)&y)) + goto acq_exit; + + /* only read pressure if we have to */ + if (!five_wire && pil) { + if (!wm97xx_poll_read_adc(ts, WM97XX_ADCSEL_PRES, &event.pressure)) + goto acq_exit; + } + else + event.pressure = 0; + } + /* timestamp this new event. */ + event.millisecs = jiffies; + + /* calibrate and remove unwanted bits from samples */ + event.pressure &= 0x0fff; + + x &= 0x00000fff; + x = ((ts->cal.xscale * x) >> 8) + ts->cal.xtrans; + event.x = (u16)x; + + y &= 0x00000fff; + y = ((ts->cal.yscale * y) >> 8) + ts->cal.ytrans; + event.y = (u16)y; + + /* add this event to the event queue */ + ts->event_buf[ts->nextIn++] = event; + if (ts->nextIn == EVENT_BUFSIZE) + ts->nextIn = 0; + if (ts->event_count < EVENT_BUFSIZE) { + ts->event_count++; + } else { + /* throw out the oldest event */ + if (++ts->nextOut == EVENT_BUFSIZE) { + ts->nextOut = 0; + ts->overruns++; + } + } + + /* async notify */ + if (ts->fasync) + kill_fasync(&ts->fasync, SIGIO, POLL_IN); + /* wake up any read call */ + if (waitqueue_active(&ts->wait)) + wake_up_interruptible(&ts->wait); + + /* schedule next acquire */ +acq_exit: + ts->acq_timer.expires = jiffies + HZ / 100; + add_timer(&ts->acq_timer); + + spin_unlock_irqrestore(&ts->lock, flags); +} + + +/* +++++++++++++ File operations ++++++++++++++*/ + +static int wm97xx_fasync(int fd, struct file *filp, int mode) +{ + wm97xx_ts_t* ts = (wm97xx_ts_t*)filp->private_data; + return fasync_helper(fd, filp, mode, &ts->fasync); +} + +static int wm97xx_ioctl(struct inode * inode, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + unsigned short adc_value; +#ifdef WM97XX_TS_DEBUG + short data; +#endif + wm97xx_ts_t* ts = (wm97xx_ts_t*)filp->private_data; + + switch(cmd) { + case TS_GET_RATE: /* TODO: what is this? */ + break; + case TS_SET_RATE: /* TODO: what is this? */ + break; + case TS_GET_CAL: + if(copy_to_user((char *)arg, (char *)&ts->cal, sizeof(TS_CAL))) + return -EFAULT; + break; + case TS_SET_CAL: + if(copy_from_user((char *)&ts->cal, (char *)arg, sizeof(TS_CAL))) + return -EFAULT; + break; + case TS_GET_COMP1: + if (adc_get(ts, &adc_value, TS_COMP1)) { + if(copy_to_user((char *)arg, (char *)&adc_value, sizeof(adc_value))) + return -EFAULT; + } + else + return -EIO; + break; + case TS_GET_COMP2: + if (adc_get(ts, &adc_value, TS_COMP2)) { + if(copy_to_user((char *)arg, (char *)&adc_value, sizeof(adc_value))) + return -EFAULT; + } + else + return -EIO; + break; + case TS_GET_BMON: + if (adc_get(ts, &adc_value, TS_BMON)) { + if(copy_to_user((char *)arg, (char *)&adc_value, sizeof(adc_value))) + return -EFAULT; + } + else + return -EIO; + break; + case TS_GET_WIPER: + if (adc_get(ts, &adc_value, TS_WIPER)) { + if(copy_to_user((char *)arg, (char *)&adc_value, sizeof(adc_value))) + return -EFAULT; + } + else + return -EIO; + break; +#ifdef WM97XX_TS_DEBUG + /* debug get/set ac97 codec register ioctl's + * + * This is direct IO to the codec registers - BE CAREFULL + */ + case TS_GET_AC97_REG: /* read from ac97 reg (index) */ + data = ts->codec->codec_read(ts->codec, ts->ac97_index); + if(copy_to_user((char *)arg, (char *)&data, sizeof(data))) + return -EFAULT; + break; + case TS_SET_AC97_REG: /* write to ac97 reg (index) */ + if(copy_from_user((char *)&data, (char *)arg, sizeof(data))) + return -EFAULT; + ts->codec->codec_write(ts->codec, ts->ac97_index, data); + break; + case TS_SET_AC97_INDEX: /* set ac97 reg index */ + if(copy_from_user((char *)&ts->ac97_index, (char *)arg, sizeof(ts->ac97_index))) + return -EFAULT; + break; +#endif + default: + return -EINVAL; + } + + return 0; +} + +static unsigned int wm97xx_poll(struct file * filp, poll_table * wait) +{ + wm97xx_ts_t *ts = (wm97xx_ts_t *)filp->private_data; + poll_wait(filp, &ts->wait, wait); + if (ts->event_count) + return POLLIN | POLLRDNORM; + return 0; +} + +static ssize_t wm97xx_read(struct file *filp, char *buf, size_t count, loff_t *l) +{ + wm97xx_ts_t* ts = (wm97xx_ts_t*)filp->private_data; + unsigned long flags; + TS_EVENT event; + int i; + + /* are we still registered with AC97 layer ? */ + spin_lock_irqsave(&ts->lock, flags); + if (!ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + return -ENXIO; + } + + if (ts->event_count == 0) { + if (filp->f_flags & O_NONBLOCK) + return -EAGAIN; + spin_unlock_irqrestore(&ts->lock, flags); + + wait_event_interruptible(ts->wait, ts->event_count != 0); + + /* are we still registered after sleep ? */ + spin_lock_irqsave(&ts->lock, flags); + if (!ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + return -ENXIO; + } + if (signal_pending(current)) + return -ERESTARTSYS; + } + + for (i = count; i >= sizeof(TS_EVENT); + i -= sizeof(TS_EVENT), buf += sizeof(TS_EVENT)) { + if (ts->event_count == 0) + break; + spin_lock_irqsave(&ts->lock, flags); + event = ts->event_buf[ts->nextOut++]; + if (ts->nextOut == EVENT_BUFSIZE) + ts->nextOut = 0; + if (ts->event_count) + ts->event_count--; + spin_unlock_irqrestore(&ts->lock, flags); + if(copy_to_user(buf, &event, sizeof(TS_EVENT))) + return i != count ? count - i : -EFAULT; + } + return count - i; +} + + +static int wm97xx_open(struct inode * inode, struct file * filp) +{ + wm97xx_ts_t* ts; + unsigned long flags; + u16 val; + int minor = MINOR(inode->i_rdev); + + if (minor != TS_MINOR) + return -ENODEV; + + filp->private_data = ts = &wm97xx_ts; + + spin_lock_irqsave(&ts->lock, flags); + + /* are we registered with AC97 layer ? */ + if (!ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + return -ENXIO; + } + + /* start digitiser */ + val = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER2); + ts->codec->codec_write(ts->codec, AC97_WM97XX_DIGITISER2, + val | WM97XX_PRP_DET_DIG); + + /* flush event queue */ + ts->nextIn = ts->nextOut = ts->event_count = 0; + + /* Set up timer. */ + init_timer(&ts->acq_timer); + ts->acq_timer.function = wm97xx_acq_timer; + ts->acq_timer.data = (unsigned long)ts; + ts->acq_timer.expires = jiffies + HZ / 100; + add_timer(&ts->acq_timer); + + spin_unlock_irqrestore(&ts->lock, flags); + return 0; +} + +static int wm97xx_release(struct inode * inode, struct file * filp) +{ + wm97xx_ts_t* ts = (wm97xx_ts_t*)filp->private_data; + unsigned long flags; + u16 val; + + wm97xx_fasync(-1, filp, 0); + del_timer_sync(&ts->acq_timer); + + spin_lock_irqsave(&ts->lock, flags); + + /* stop digitiser */ + val = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER2); + ts->codec->codec_write(ts->codec, AC97_WM97XX_DIGITISER2, + val & ~WM97XX_PRP_DET_DIG); + + spin_unlock_irqrestore(&ts->lock, flags); + return 0; +} + +static struct file_operations ts_fops = { + owner: THIS_MODULE, + read: wm97xx_read, + poll: wm97xx_poll, + ioctl: wm97xx_ioctl, + fasync: wm97xx_fasync, + open: wm97xx_open, + release: wm97xx_release, +}; + +/* +++++++++++++ End File operations ++++++++++++++*/ + +#ifdef CONFIG_PROC_FS +static int wm97xx_read_proc (char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + int len = 0, prpu; + u16 dig1, dig2, digrd, adcsel, adcsrc, slt, prp, rev; + unsigned long flags; + char srev = ' '; + + wm97xx_ts_t* ts; + + if ((ts = data) == NULL) + return -ENODEV; + + spin_lock_irqsave(&ts->lock, flags); + if (!ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + len += sprintf (page+len, "No device registered\n"); + return len; + } + + dig1 = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER1); + dig2 = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER2); + digrd = ts->codec->codec_read(ts->codec, AC97_WM97XX_DIGITISER_RD); + rev = (ts->codec->codec_read(ts->codec, AC97_WM9712_REV) & 0x000c) >> 2; + + spin_unlock_irqrestore(&ts->lock, flags); + + adcsel = dig1 & 0x7000; + adcsrc = digrd & 0x7000; + slt = (dig1 & 0x7) + 5; + prp = dig2 & 0xc000; + prpu = dig2 & 0x003f; + + /* driver version */ + len += sprintf (page+len, "Wolfson WM97xx Version %s\n", WM_TS_VERSION); + + /* what we are using */ + len += sprintf (page+len, "Using %s", ts->is_wm9712 ? "WM9712" : "WM9705"); + if (ts->is_wm9712) { + switch (rev) { + case 0x0: + srev = 'A'; + break; + case 0x1: + srev = 'B'; + break; + case 0x2: + srev = 'D'; + break; + case 0x3: + srev = 'E'; + break; + } + len += sprintf (page+len, " silicon rev %c\n",srev); + } else + len += sprintf (page+len, "\n"); + + /* WM97xx settings */ + len += sprintf (page+len, "Settings :\n%s%s%s%s", + dig1 & WM97XX_POLL ? " -sampling adc data(poll)\n" : "", + adcsel == WM97XX_ADCSEL_X ? " -adc set to X coordinate\n" : "", + adcsel == WM97XX_ADCSEL_Y ? " -adc set to Y coordinate\n" : "", + adcsel == WM97XX_ADCSEL_PRES ? " -adc set to pressure\n" : ""); + if (ts->is_wm9712) { + len += sprintf (page+len, "%s%s%s%s", + adcsel == WM9712_ADCSEL_COMP1 ? " -adc set to COMP1/AUX1\n" : "", + adcsel == WM9712_ADCSEL_COMP2 ? " -adc set to COMP2/AUX2\n" : "", + adcsel == WM9712_ADCSEL_BMON ? " -adc set to BMON\n" : "", + adcsel == WM9712_ADCSEL_WIPER ? " -adc set to WIPER\n" : ""); + } else { + len += sprintf (page+len, "%s%s%s%s", + adcsel == WM9705_ADCSEL_PCBEEP ? " -adc set to PCBEEP\n" : "", + adcsel == WM9705_ADCSEL_PHONE ? " -adc set to PHONE\n" : "", + adcsel == WM9705_ADCSEL_BMON ? " -adc set to BMON\n" : "", + adcsel == WM9705_ADCSEL_AUX ? " -adc set to AUX\n" : ""); + } + + len += sprintf (page+len, "%s%s%s%s%s%s", + dig1 & WM97XX_COO ? " -coordinate sampling\n" : " -individual sampling\n", + dig1 & WM97XX_CTC ? " -continuous mode\n" : " -polling mode\n", + prp == WM97XX_PRP_DET ? " -pen detect enabled, no wake up\n" : "", + prp == WM97XX_PRP_DETW ? " -pen detect enabled, wake up\n" : "", + prp == WM97XX_PRP_DET_DIG ? " -pen digitiser and pen detect enabled\n" : "", + dig1 & WM97XX_SLEN ? " -read back using slot " : " -read back using AC97\n"); + + if ((dig1 & WM97XX_SLEN) && slt !=12) + len += sprintf(page+len, "%d\n", slt); + len += sprintf (page+len, " -adc sample delay %d uSecs\n", delay_table[(dig1 & 0x00f0) >> 4]); + + if (ts->is_wm9712) { + if (prpu) + len += sprintf (page+len, " -rpu %d Ohms\n", 64000/ prpu); + len += sprintf (page+len, " -pressure current %s uA\n", dig2 & WM9712_PIL ? "400" : "200"); + len += sprintf (page+len, " -using %s wire touchscreen mode", dig2 & WM9712_45W ? "5" : "4"); + } else { + len += sprintf (page+len, " -pressure current %s uA\n", dig2 & WM9705_PIL ? "400" : "200"); + len += sprintf (page+len, " -%s impedance for PHONE and PCBEEP\n", dig2 & WM9705_PHIZ ? "high" : "low"); + } + + /* WM97xx digitiser read */ + len += sprintf(page+len, "\nADC data:\n%s%d\n%s%s\n", + " -adc value (decimal) : ", digrd & 0x0fff, + " -pen ", digrd & 0x8000 ? "Down" : "Up"); + if (ts->is_wm9712) { + len += sprintf (page+len, "%s%s%s%s", + adcsrc == WM9712_ADCSEL_COMP1 ? " -adc value is COMP1/AUX1\n" : "", + adcsrc == WM9712_ADCSEL_COMP2 ? " -adc value is COMP2/AUX2\n" : "", + adcsrc == WM9712_ADCSEL_BMON ? " -adc value is BMON\n" : "", + adcsrc == WM9712_ADCSEL_WIPER ? " -adc value is WIPER\n" : ""); + } else { + len += sprintf (page+len, "%s%s%s%s", + adcsrc == WM9705_ADCSEL_PCBEEP ? " -adc value is PCBEEP\n" : "", + adcsrc == WM9705_ADCSEL_PHONE ? " -adc value is PHONE\n" : "", + adcsrc == WM9705_ADCSEL_BMON ? " -adc value is BMON\n" : "", + adcsrc == WM9705_ADCSEL_AUX ? " -adc value is AUX\n" : ""); + } + + /* register dump */ + len += sprintf(page+len, "\nRegisters:\n%s%x\n%s%x\n%s%x\n", + " -digitiser 1 (0x76) : 0x", dig1, + " -digitiser 2 (0x78) : 0x", dig2, + " -digitiser read (0x7a) : 0x", digrd); + + /* errors */ + len += sprintf(page+len, "\nErrors:\n%s%d\n%s%d\n", + " -buffer overruns ", ts->overruns, + " -coordinate errors ", ts->adc_errs); + + return len; +} + +#ifdef WM97XX_TS_DEBUG +/* dump all the AC97 register space */ +static int wm_debug_read_proc (char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + int len = 0, i; + unsigned long flags; + wm97xx_ts_t* ts; + u16 reg[AC97_NUM_REG]; + + if ((ts = data) == NULL) + return -ENODEV; + + spin_lock_irqsave(&ts->lock, flags); + if (!ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + len += sprintf (page+len, "Not registered\n"); + return len; + } + + for (i=0; i < AC97_NUM_REG; i++) { + reg[i] = ts->codec->codec_read(ts->codec, i * 2); + } + spin_unlock_irqrestore(&ts->lock, flags); + + for (i=0; i < AC97_NUM_REG; i++) { + len += sprintf (page+len, "0x%2.2x : 0x%4.4x\n",i * 2, reg[i]); + } + + return len; +} +#endif + +#endif + +#ifdef CONFIG_PM +/* WM97xx Power Management + * The WM9712 has extra powerdown states that are controlled in + * seperate registers from the AC97 power management. + * We will only power down into the extra WM9712 states and leave + * the AC97 power management to the sound driver. + */ +static int wm97xx_pm_event(struct pm_dev *dev, pm_request_t rqst, void *data) +{ + switch(rqst) { + case PM_SUSPEND: + wm97xx_suspend(); + break; + case PM_RESUME: + wm97xx_resume(); + break; + } + return 0; +} + +/* + * Power down the codec + */ +static void wm97xx_suspend(void) +{ + wm97xx_ts_t* ts = &wm97xx_ts; + u16 reg; + unsigned long flags; + + /* are we registered */ + spin_lock_irqsave(&ts->lock, flags); + if (!ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + return; + } + + /* wm9705 does not have extra PM */ + if (!ts->is_wm9712) { + spin_unlock_irqrestore(&ts->lock, flags); + return; + } + + /* save and mute the PGA's */ + wm9712_pga_save(ts); + + reg = ts->codec->codec_read(ts->codec, AC97_PHONE_VOL); + ts->codec->codec_write(ts->codec, AC97_PHONE_VOL, reg | 0x001f); + + reg = ts->codec->codec_read(ts->codec, AC97_MIC_VOL); + ts->codec->codec_write(ts->codec, AC97_MIC_VOL, reg | 0x1f1f); + + reg = ts->codec->codec_read(ts->codec, AC97_LINEIN_VOL); + ts->codec->codec_write(ts->codec, AC97_LINEIN_VOL, reg | 0x1f1f); + + /* power down, dont disable the AC link */ + ts->codec->codec_write(ts->codec, AC97_WM9712_POWER, WM9712_PD(14) | WM9712_PD(13) | + WM9712_PD(12) | WM9712_PD(11) | WM9712_PD(10) | + WM9712_PD(9) | WM9712_PD(8) | WM9712_PD(7) | + WM9712_PD(6) | WM9712_PD(5) | WM9712_PD(4) | + WM9712_PD(3) | WM9712_PD(2) | WM9712_PD(1) | + WM9712_PD(0)); + + spin_unlock_irqrestore(&ts->lock, flags); +} + +/* + * Power up the Codec + */ +static void wm97xx_resume(void) +{ + wm97xx_ts_t* ts = &wm97xx_ts; + unsigned long flags; + + /* are we registered */ + spin_lock_irqsave(&ts->lock, flags); + if (!ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + return; + } + + /* wm9705 does not have extra PM */ + if (!ts->is_wm9712) { + spin_unlock_irqrestore(&ts->lock, flags); + return; + } + + /* power up */ + ts->codec->codec_write(ts->codec, AC97_WM9712_POWER, 0x0); + + /* restore PGA state */ + wm9712_pga_restore(ts); + + spin_unlock_irqrestore(&ts->lock, flags); +} + + +/* save state of wm9712 PGA's */ +static void wm9712_pga_save(wm97xx_ts_t* ts) +{ + ts->phone_pga = ts->codec->codec_read(ts->codec, AC97_PHONE_VOL) & 0x001f; + ts->line_pgal = ts->codec->codec_read(ts->codec, AC97_LINEIN_VOL) & 0x1f00; + ts->line_pgar = ts->codec->codec_read(ts->codec, AC97_LINEIN_VOL) & 0x001f; + ts->mic_pgal = ts->codec->codec_read(ts->codec, AC97_MIC_VOL) & 0x1f00; + ts->mic_pgar = ts->codec->codec_read(ts->codec, AC97_MIC_VOL) & 0x001f; +} + +/* restore state of wm9712 PGA's */ +static void wm9712_pga_restore(wm97xx_ts_t* ts) +{ + u16 reg; + + reg = ts->codec->codec_read(ts->codec, AC97_PHONE_VOL); + ts->codec->codec_write(ts->codec, AC97_PHONE_VOL, reg | ts->phone_pga); + + reg = ts->codec->codec_read(ts->codec, AC97_LINEIN_VOL); + ts->codec->codec_write(ts->codec, AC97_LINEIN_VOL, reg | ts->line_pgar | (ts->line_pgal << 8)); + + reg = ts->codec->codec_read(ts->codec, AC97_MIC_VOL); + ts->codec->codec_write(ts->codec, AC97_MIC_VOL, reg | ts->mic_pgar | (ts->mic_pgal << 8)); +} + +#endif + +/* + * set up the physical settings of the device + */ + +static void init_wm97xx_phy(void) +{ + u16 dig1, dig2, aux, vid; + wm97xx_ts_t *ts = &wm97xx_ts; + + /* default values */ + dig1 = WM97XX_DELAY(4) | WM97XX_SLT(6); + if (ts->is_wm9712) + dig2 = WM9712_RPU(1); + else { + dig2 = 0x0; + + /* + * mute VIDEO and AUX as they share X and Y touchscreen + * inputs on the WM9705 + */ + aux = ts->codec->codec_read(ts->codec, AC97_AUX_VOL); + if (!(aux & 0x8000)) { + info("muting AUX mixer as it shares X touchscreen coordinate"); + ts->codec->codec_write(ts->codec, AC97_AUX_VOL, 0x8000 | aux); + } + + vid = ts->codec->codec_read(ts->codec, AC97_VIDEO_VOL); + if (!(vid & 0x8000)) { + info("muting VIDEO mixer as it shares Y touchscreen coordinate"); + ts->codec->codec_write(ts->codec, AC97_VIDEO_VOL, 0x8000 | vid); + } + } + + /* WM9712 rpu */ + if (ts->is_wm9712 && rpu) { + dig2 &= 0xffc0; + dig2 |= WM9712_RPU(rpu); + info("setting pen detect pull-up to %d Ohms",64000 / rpu); + } + + /* touchpanel pressure */ + if (pil == 2) { + if (ts->is_wm9712) + dig2 |= WM9712_PIL; + else + dig2 |= WM9705_PIL; + info("setting pressure measurement current to 400uA."); + } else if (pil) + info ("setting pressure measurement current to 200uA."); + + /* WM9712 five wire */ + if (ts->is_wm9712 && five_wire) { + dig2 |= WM9712_45W; + info("setting 5-wire touchscreen mode."); + } + + /* sample settling delay */ + if (delay!=4) { + if (delay < 0 || delay > 15) { + info ("supplied delay out of range."); + delay = 4; + } + dig1 &= 0xff0f; + dig1 |= WM97XX_DELAY(delay); + info("setting adc sample delay to %d u Secs.", delay_table[delay]); + } + + /* coordinate mode */ + if (mode == 1) { + dig1 |= WM97XX_COO; + info("using coordinate mode"); + } + + /* WM9705 pdd */ + if (pdd && !ts->is_wm9712) { + dig2 |= (pdd & 0x000f); + info("setting pdd to Vmid/%d", 1 - (pdd & 0x000f)); + } + + ts->codec->codec_write(ts->codec, AC97_WM97XX_DIGITISER1, dig1); + ts->codec->codec_write(ts->codec, AC97_WM97XX_DIGITISER2, dig2); +} + + +/* + * Called by the audio codec initialisation to register + * the touchscreen driver. + */ + +static int wm97xx_probe(struct ac97_codec *codec, struct ac97_driver *driver) +{ + unsigned long flags; + u16 id1, id2; + wm97xx_ts_t *ts = &wm97xx_ts; + + spin_lock_irqsave(&ts->lock, flags); + + /* we only support 1 touchscreen at the moment */ + if (ts->is_registered) { + spin_unlock_irqrestore(&ts->lock, flags); + return -1; + } + + /* + * We can only use a WM9705 or WM9712 that has been *first* initialised + * by the AC97 audio driver. This is because we have to use the audio + * drivers codec read() and write() functions to sample the touchscreen + * + * If an initialsed WM97xx is found then get the codec read and write + * functions. + */ + + /* test for a WM9712 or a WM9705 */ + id1 = codec->codec_read(codec, AC97_VENDOR_ID1); + id2 = codec->codec_read(codec, AC97_VENDOR_ID2); + if (id1 == WM97XX_ID1 && id2 == WM9712_ID2) { + ts->is_wm9712 = 1; + info("registered a WM9712"); + } else if (id1 == WM97XX_ID1 && id2 == WM9705_ID2) { + ts->is_wm9712 = 0; + info("registered a WM9705"); + } else { + err("could not find a WM97xx codec. Found a 0x%4x:0x%4x instead", + id1, id2); + spin_unlock_irqrestore(&ts->lock, flags); + return -1; + } + + /* set up AC97 codec interface */ + ts->codec = codec; + codec->driver_private = (void*)&ts; + codec->codec_unregister = 0; + + /* set up physical characteristics */ + init_wm97xx_phy(); + + ts->is_registered = 1; + spin_unlock_irqrestore(&ts->lock, flags); + return 0; +} + +/* this is called by the audio driver when ac97_codec is unloaded */ + +static void wm97xx_remove(struct ac97_codec *codec, struct ac97_driver *driver) +{ + unsigned long flags; + u16 dig1, dig2; + wm97xx_ts_t *ts = codec->driver_private; + + spin_lock_irqsave(&ts->lock, flags); + + /* check that are registered */ + if (!ts->is_registered) { + err("double unregister"); + spin_unlock_irqrestore(&ts->lock, flags); + return; + } + + ts->is_registered = 0; + wake_up_interruptible(&ts->wait); /* So we see its gone */ + + /* restore default digitiser values */ + dig1 = WM97XX_DELAY(4) | WM97XX_SLT(6); + if (ts->is_wm9712) + dig2 = WM9712_RPU(1); + else + dig2 = 0x0; + + codec->codec_write(codec, AC97_WM97XX_DIGITISER1, dig1); + codec->codec_write(codec, AC97_WM97XX_DIGITISER2, dig2); + ts->codec = NULL; + + spin_unlock_irqrestore(&ts->lock, flags); +} + +static struct miscdevice wm97xx_misc = { + minor: TS_MINOR, + name: "touchscreen/wm97xx", + fops: &ts_fops, +}; + +static int __init wm97xx_ts_init_module(void) +{ + wm97xx_ts_t* ts = &wm97xx_ts; + int ret; + char proc_str[64]; + + info("Wolfson WM9705/WM9712 Touchscreen Controller"); + info("Version %s liam.girdwood@wolfsonmicro.com", WM_TS_VERSION); + + memset(ts, 0, sizeof(wm97xx_ts_t)); + + /* register our misc device */ + if ((ret = misc_register(&wm97xx_misc)) < 0) { + err("can't register misc device"); + return ret; + } + + init_waitqueue_head(&ts->wait); + spin_lock_init(&ts->lock); + + // initial calibration values + ts->cal.xscale = 256; + ts->cal.xtrans = 0; + ts->cal.yscale = 256; + ts->cal.ytrans = 0; + + /* reset error counters */ + ts->overruns = 0; + ts->adc_errs = 0; + + /* register with the AC97 layer */ + ac97_register_driver(&wm9705_driver); + ac97_register_driver(&wm9712_driver); + +#ifdef CONFIG_PROC_FS + /* register proc interface */ + sprintf(proc_str, "driver/%s", TS_NAME); + if ((ts->wm97xx_ts_ps = create_proc_read_entry (proc_str, 0, NULL, + wm97xx_read_proc, ts)) == 0) + err("could not register proc interface /proc/%s", proc_str); +#ifdef WM97XX_TS_DEBUG + if ((ts->wm97xx_debug_ts_ps = create_proc_read_entry ("driver/ac97_registers", + 0, NULL,wm_debug_read_proc, ts)) == 0) + err("could not register proc interface /proc/driver/ac97_registers"); +#endif +#endif +#ifdef CONFIG_PM + if ((ts->pm = pm_register(PM_UNKNOWN_DEV, PM_SYS_UNKNOWN, wm97xx_pm_event)) == 0) + err("could not register with power management"); +#endif + return 0; +} + +static void wm97xx_ts_cleanup_module(void) +{ + wm97xx_ts_t* ts = &wm97xx_ts; + +#ifdef CONFIG_PM + pm_unregister (ts->pm); +#endif + ac97_unregister_driver(&wm9705_driver); + ac97_unregister_driver(&wm9712_driver); + misc_deregister(&wm97xx_misc); +} + +/* Module information */ +MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); +MODULE_DESCRIPTION("WM9705/WM9712 Touch Screen / BMON Driver"); +MODULE_LICENSE("GPL"); + +module_init(wm97xx_ts_init_module); +module_exit(wm97xx_ts_cleanup_module); + +#ifndef MODULE + +static int __init wm97xx_ts_setup(char *options) +{ + char *this_opt = options; + + if (!options || !*options) + return 0; + + /* parse the options and check for out of range values */ + for(this_opt=strtok(options, ","); + this_opt; this_opt=strtok(NULL, ",")) { + if (!strncmp(this_opt, "pil:", 4)) { + this_opt+=4; + pil = simple_strtol(this_opt, NULL, 0); + if (pil < 0 || pil > 2) + pil = 0; + continue; + } + if (!strncmp(this_opt, "rpu:", 4)) { + this_opt+=4; + rpu = simple_strtol(this_opt, NULL, 0); + if (rpu < 0 || rpu > 31) + rpu = 0; + continue; + } + if (!strncmp(this_opt, "pdd:", 4)) { + this_opt+=4; + pdd = simple_strtol(this_opt, NULL, 0); + if (pdd < 0 || pdd > 15) + pdd = 0; + continue; + } + if (!strncmp(this_opt, "delay:", 6)) { + this_opt+=6; + delay = simple_strtol(this_opt, NULL, 0); + if (delay < 0 || delay > 15) + delay = 4; + continue; + } + if (!strncmp(this_opt, "five_wire:", 10)) { + this_opt+=10; + five_wire = simple_strtol(this_opt, NULL, 0); + if (five_wire < 0 || five_wire > 1) + five_wire = 0; + continue; + } + if (!strncmp(this_opt, "mode:", 5)) { + this_opt+=5; + mode = simple_strtol(this_opt, NULL, 0); + if (mode < 0 || mode > 2) + mode = 0; + continue; + } + } + return 1; +} + +__setup("wm97xx_ts=", wm97xx_ts_setup); + +#endif /* MODULE */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/ad1889.c linux-2.4.23-pre8/drivers/sound/ad1889.c --- linux-2.4.22/drivers/sound/ad1889.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/ad1889.c 2003-10-22 22:49:20.000000000 +0000 @@ -236,16 +236,24 @@ for (i = 0; i < AD_MAX_STATES; i++) { dmabuf = &dev->state[i].dmabuf; - if ((dmabuf->rawbuf = kmalloc(DMA_SIZE, GFP_KERNEL|GFP_DMA)) == NULL) - return NULL; + dmabuf->rawbuf = kmalloc(DMA_SIZE, GFP_KERNEL|GFP_DMA); + if (!dmabuf->rawbuf) + goto err_free_dmabuf; dmabuf->rawbuf_size = DMA_SIZE; dmabuf->dma_handle = 0; dmabuf->rd_ptr = dmabuf->wr_ptr = dmabuf->dma_len = 0UL; dmabuf->ready = 0; dmabuf->rate = 44100; } - +out: return dev; + +err_free_dmabuf: + while (--i >= 0) + kfree(dev->state[i].dmabuf.rawbuf); + kfree(dev); + dev = NULL; + goto out; } static void ad1889_free_dev(ad1889_dev_t *dev) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/ali5455.c linux-2.4.23-pre8/drivers/sound/ali5455.c --- linux-2.4.22/drivers/sound/ali5455.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/ali5455.c 2003-10-22 22:49:18.000000000 +0000 @@ -1,5 +1,5 @@ /* - * ALI ali5455 and friends ICH driver for Linux + * Driver for ALI 5455 Audio PCI soundcard * LEI HU * * Built from: @@ -23,10 +23,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * - * ALi 5455 theory of operation - * - * The chipset provides three DMA channels that talk to an AC97 + * The chipset provides five DMA channels that talk to an AC97 * CODEC (AC97 is a digital/analog mixer standard). At its simplest * you get 48Khz audio with basic volume and mixer controls. At the * best you get rate adaption in the codec. We set the card up so @@ -42,6 +39,13 @@ * esd working you need to use esd -r 48000 as it won't probe 48KHz * by default. mpg123 can't handle 48Khz only audio so use xmms. * + * + * Not everyone uses 48KHz. We know of no way to detect this reliably + * and certainly not to get the right data. If your ali audio sounds + * stupid you may need to investigate other speeds. According to Analog + * they tend to use a 14.318MHz clock which gives you a base rate of + * 41194Hz. + * * If you need to force a specific rate set the clocking= option * */ @@ -78,31 +82,45 @@ static int strict_clocking = 0; static unsigned int clocking = 0; -static unsigned int codec_pcmout_share_spdif_locked = 0; -static unsigned int codec_independent_spdif_locked = 0; +#ifdef CONFIG_SOUND_ALI5455_CODECSPDIFOUT_PCMOUTSHARE +static unsigned int codec_pcmout_share_spdif_locked = 48000; +#else + static unsigned int codec_pcmout_share_spdif_locked = 0; +#endif +#ifdef CONFIG_SOUND_ALI5455_CODECSPDIFOUT_CODECINDEPENDENTDMA +static unsigned int codec_independent_spdif_locked = 48000; +#else +static unsigned int codec_independent_spdif_locked = 0; +#endif +#ifdef CONFIG_SOUND_ALI5455_CONTROLLERSPDIFOUT_PCMOUTSHARE +static unsigned int controller_pcmout_share_spdif_locked = 48000; +#else static unsigned int controller_pcmout_share_spdif_locked = 0; +#endif +#ifdef CONFIG_SOUND_ALI5455_CONTROLLERSPDIFOUT_CONTROLLERINDEPENDENTDMA +static unsigned int controller_independent_spdif_locked = 48000; +#else static unsigned int controller_independent_spdif_locked = 0; -static unsigned int globel = 0; - -#define ADC_RUNNING 1 -#define DAC_RUNNING 2 -#define CODEC_SPDIFOUT_RUNNING 8 -#define CONTROLLER_SPDIFOUT_RUNNING 4 - -#define SPDIF_ENABLE_OUTPUT 4 /* bits 0,1 are PCM */ - -#define ALI5455_FMT_16BIT 1 -#define ALI5455_FMT_STEREO 2 -#define ALI5455_FMT_MASK 3 +#endif -#define SPDIF_ON 0x0004 -#define SURR_ON 0x0010 -#define CENTER_LFE_ON 0x0020 -#define VOL_MUTED 0x8000 +#define ADC_RUNNING 1 +#define DAC_RUNNING 2 +#define CONTROLLER_SPDIFOUT_RUNNING 4 +#define CODEC_SPDIFOUT_RUNNING 8 + +#define ALI5455_FMT_16BIT 1 +#define ALI5455_FMT_STEREO 2 +#define ALI5455_FMT_MASK 3 + +#define SPDIF_ON 0x0004 +#define SURR_ON 0x0010 +#define CENTER_LFE_ON 0x0020 +#define VOL_MUTED 0x8000 +#define SPDIF_ENABLE_OUTPUT 0x00000004 -#define ALI_SPDIF_OUT_CH_STATUS 0xbf -/* the 810's array of pointers to data buffers */ +#define ALI_SPDIF_OUT_CH_STATUS 0xbf +/* the ali5455 's array of pointers to data buffers */ struct sg_item { #define BUSADDR_MASK 0xFFFFFFFE @@ -113,20 +131,21 @@ u32 control; }; -/* an instance of the ali channel */ +/* An instance of the ali 5455 channel */ #define SG_LEN 32 struct ali_channel { /* these sg guys should probably be allocated seperately as nocache. Must be 8 byte aligned */ struct sg_item sg[SG_LEN]; /* 32*8 */ - u32 offset; /* 4 */ - u32 port; /* 4 */ + u32 offset; /* 4 */ + u32 port; /* 4 */ u32 used; u32 num; }; /* - * we have 3 seperate dma engines. pcm in, pcm out, and mic. + * we have 5 seperate dma engines. pcm in, pcm out, mc in, + * codec independant DMA, and controller independant DMA * each dma engine has controlling registers. These goofy * names are from the datasheet, but make it easy to write * code while leafing through it. @@ -142,11 +161,11 @@ PRE##_CR = 0x##DIG##b /* Control Register */ \ } -ENUM_ENGINE(OFF, 0); /* Offsets */ -ENUM_ENGINE(PI, 4); /* PCM In */ -ENUM_ENGINE(PO, 5); /* PCM Out */ -ENUM_ENGINE(MC, 6); /* Mic In */ -ENUM_ENGINE(CODECSPDIFOUT, 7); /* CODEC SPDIF OUT */ +ENUM_ENGINE(OFF, 0); /* Offsets */ +ENUM_ENGINE(PI, 4); /* PCM In */ +ENUM_ENGINE(PO, 5); /* PCM Out */ +ENUM_ENGINE(MC, 6); /* Mic In */ +ENUM_ENGINE(CODECSPDIFOUT, 7); /* CODEC SPDIF OUT */ ENUM_ENGINE(CONTROLLERSPDIFIN, A); /* CONTROLLER SPDIF In */ ENUM_ENGINE(CONTROLLERSPDIFOUT, B); /* CONTROLLER SPDIF OUT */ @@ -171,7 +190,7 @@ ALI_SPDIFICS = 0xfc /* spdif interface control/status */ }; -// x-status register(x:pcm in ,pcm out, mic in,) +/* x-status register(x:pcm in ,pcm out, mic in,codec independent DMA.controller independent DMA) */ /* interrupts for a dma engine */ #define DMA_INT_FIFO (1<<4) /* fifo under/over flow */ #define DMA_INT_COMPLETE (1<<3) /* buffer read/write complete and ioc set */ @@ -180,8 +199,7 @@ #define DMA_INT_DCH (1) /* DMA Controller Halted (happens on LVI interrupts) */ //not eqult intel #define DMA_INT_MASK (DMA_INT_FIFO|DMA_INT_COMPLETE|DMA_INT_LVI) -/* interrupts for the whole chip */// by interrupt status register finish - +/* interrupts for the whole chip */ #define INT_SPDIFOUT (1<<23) /* controller spdif out INTERRUPT */ #define INT_SPDIFIN (1<<22) #define INT_CODECSPDIFOUT (1<<19) @@ -193,13 +211,14 @@ #define INT_GPIO (1<<1) #define INT_MASK (INT_SPDIFOUT|INT_CODECSPDIFOUT|INT_MICIN|INT_PCMOUT|INT_PCMIN) -#define DRIVER_VERSION "0.02ac" +#define DRIVER_VERSION "0.03-ac" /* magic numbers to protect our data structures */ #define ALI5455_CARD_MAGIC 0x5072696E /* "Prin" */ #define ALI5455_STATE_MAGIC 0x63657373 /* "cess" */ #define ALI5455_DMA_MASK 0xffffffff /* DMA buffer mask for pci_alloc_consist */ -#define NR_HW_CH 5 //I think 5 channel + +#define NR_HW_CH 5 /* I think 5 channel */ /* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */ #define NR_AC97 2 @@ -216,7 +235,7 @@ "ALI 5455" }; -static struct pci_device_id ali_pci_tbl[] __initdata = { +static struct pci_device_id ali_pci_tbl[] __devinitdata = { {PCI_VENDOR_ID_ALI, PCI_DEVICE_ID_ALI_5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ALI5455}, {0,} @@ -267,12 +286,12 @@ unsigned fragshift; /* our buffer acts like a circular ring */ - unsigned hwptr; /* where dma last started, updated by update_ptr */ - unsigned swptr; /* where driver last clear/filled, updated by read/write */ - int count; /* bytes to be consumed or been generated by dma machine */ + unsigned hwptr; /* where dma last started, updated by update_ptr */ + unsigned swptr; /* where driver last clear/filled, updated by read/write */ + int count; /* bytes to be consumed or been generated by dma machine */ unsigned total_bytes; /* total bytes dmaed by hardware */ - unsigned error; /* number of over/underruns */ + unsigned error; /* number of over/underruns */ wait_queue_head_t wait; /* put process on wait queue when no more space in buffer */ /* redundant, but makes calculations easier */ @@ -399,7 +418,11 @@ } -//add support codec spdif out +/* + * we use ALC650 which only support 48k sample rate, so we test firstly + * spdifout 's sample rate validity + */ + static int ali_valid_spdif_rate(struct ac97_codec *codec, int rate) { unsigned long id = 0L; @@ -428,16 +451,13 @@ /* ali_set_spdif_output * - * Configure the S/PDIF output transmitter. When we turn on - * S/PDIF, we turn off the analog output. This may not be - * the right thing to do. + * Configure the S/PDIF output transmitter. * * Assumptions: * The DSP sample rate must already be set to a supported * S/PDIF rate (32kHz, 44.1kHz, or 48kHz) or we abort. */ -static void ali_set_spdif_output(struct ali_state *state, int slots, - int rate) +static void ali_set_spdif_output(struct ali_state *state, int slots, int rate) { int vol; int aud_reg; @@ -453,8 +473,7 @@ /* If the volume wasn't muted before we turned on S/PDIF, unmute it */ if (!(state->card->ac97_status & VOL_MUTED)) { aud_reg = ali_ac97_get(codec, AC97_MASTER_VOL_STEREO); - ali_ac97_set(codec, AC97_MASTER_VOL_STEREO, - (aud_reg & ~VOL_MUTED)); + ali_ac97_set(codec, AC97_MASTER_VOL_STEREO, (aud_reg & ~VOL_MUTED)); } state->card->ac97_status &= ~(VOL_MUTED | SPDIF_ON); return; @@ -486,7 +505,7 @@ ali_ac97_set(codec, AC97_SPDIF_CONTROL, aud_reg); aud_reg = ali_ac97_get(codec, AC97_EXTENDED_STATUS); - aud_reg = (aud_reg & AC97_EA_SLOT_MASK) | slots | AC97_EA_SPDIF; + aud_reg = (aud_reg & AC97_EA_SLOT_MASK) | slots | AC97_EA_SPDIF; /* ALC650 don't support VRA */ ali_ac97_set(codec, AC97_EXTENDED_STATUS, aud_reg); aud_reg = ali_ac97_get(codec, AC97_POWER_CONTROL); @@ -508,8 +527,6 @@ aud_reg = ali_ac97_get(codec, 0x6a); ali_ac97_set(codec, 0x6a, (aud_reg & 0xefff)); } - /* Mute the analog output */ - /* Should this only mute the PCM volume??? */ } } @@ -517,13 +534,6 @@ * * Configure the codec's multi-channel DACs * - * The logic is backwards. Setting the bit to 1 turns off the DAC. - * - * What about the ICH? We currently configure it using the - * SNDCTL_DSP_CHANNELS ioctl. If we're turnning on the DAC, - * does that imply that we want the ICH set to support - * these channels? - * * TODO: * vailidate that the codec really supports these DACs * before turning them on. @@ -556,8 +566,7 @@ } /* set playback sample rate */ -static unsigned int ali_set_dac_rate(struct ali_state *state, - unsigned int rate) +static unsigned int ali_set_dac_rate(struct ali_state *state, unsigned int rate) { struct dmabuf *dmabuf = &state->dmabuf; u32 new_rate; @@ -594,8 +603,7 @@ } /* set recording sample rate */ -static unsigned int ali_set_adc_rate(struct ali_state *state, - unsigned int rate) +static unsigned int ali_set_adc_rate(struct ali_state *state, unsigned int rate) { struct dmabuf *dmabuf = &state->dmabuf; u32 new_rate; @@ -632,11 +640,10 @@ } /* set codec independent spdifout sample rate */ -static unsigned int ali_set_codecspdifout_rate(struct ali_state *state, - unsigned int rate) +static unsigned int ali_set_codecspdifout_rate(struct ali_state *state, unsigned int rate) { struct dmabuf *dmabuf = &state->dmabuf; - + if (!(state->card->ac97_features & 0x0001)) { dmabuf->rate = clocking; return clocking; @@ -652,8 +659,7 @@ } /* set controller independent spdif out function sample rate */ -static void ali_set_spdifout_rate(struct ali_state *state, - unsigned int rate) +static void ali_set_spdifout_rate(struct ali_state *state, unsigned int rate) { unsigned char ch_st_sel; unsigned short status_rate; @@ -729,7 +735,9 @@ data = ((civ + 1) * dmabuf->fragsize - (2 * offset)) % dmabuf->dmasize; if (inw(port_picb) == 0) data -= 2048; - + /* It is hardware bug when read port 's PICB ==0 */ + if ( inw(port_picb) == 0 ) + data -= 2048; return data; } @@ -745,6 +753,8 @@ udelay(1); outb(0, card->iobase + PI_CR); + + // wait for the card to acknowledge shutdown while (inb(card->iobase + PI_CR) != 0); // now clear any latent interrupt bits (like the halt bit) @@ -771,10 +781,8 @@ outb((1 << 4) | (1 << 2), state->card->iobase + PI_CR); if (state->card->channel[0].used == 1) outl(1, state->card->iobase + ALI_DMACR); // DMA CONTROL REGISTRER - udelay(100); if (state->card->channel[2].used == 1) outl((1 << 2), state->card->iobase + ALI_DMACR); //DMA CONTROL REGISTER - udelay(100); } } @@ -965,7 +973,7 @@ static int prog_dmabuf(struct ali_state *state, unsigned rec) { struct dmabuf *dmabuf = &state->dmabuf; - struct ali_channel *c = NULL; + struct ali_channel *c = NULL ; struct sg_item *sg; unsigned long flags; int ret; @@ -1248,9 +1256,7 @@ } } -static inline int ali_get_free_write_space(struct - ali_state - *state) +static inline int ali_get_free_write_space(struct ali_state *state) { struct dmabuf *dmabuf = &state->dmabuf; int free; @@ -1267,9 +1273,7 @@ return (free); } -static inline int ali_get_available_read_data(struct - ali_state - *state) +static inline int ali_get_available_read_data(struct ali_state *state) { struct dmabuf *dmabuf = &state->dmabuf; int avail; @@ -1288,12 +1292,12 @@ static int drain_dac(struct ali_state *state, int signals_allowed) { - DECLARE_WAITQUEUE(wait, current); struct dmabuf *dmabuf = &state->dmabuf; unsigned long flags; unsigned long tmo; int count; + if (!dmabuf->ready) return 0; if (dmabuf->mapped) { @@ -1302,11 +1306,11 @@ } add_wait_queue(&dmabuf->wait, &wait); for (;;) { - spin_lock_irqsave(&state->card->lock, flags); ali_update_ptr(state); count = dmabuf->count; spin_unlock_irqrestore(&state->card->lock, flags); + if (count <= 0) break; /* @@ -1355,7 +1359,6 @@ static int drain_spdifout(struct ali_state *state, int signals_allowed) { - DECLARE_WAITQUEUE(wait, current); struct dmabuf *dmabuf = &state->dmabuf; unsigned long flags; @@ -1548,7 +1551,6 @@ { struct ali_card *card = (struct ali_card *) dev_id; u32 status; - u16 status2; spin_lock(&card->lock); status = inl(card->iobase + ALI_INTERRUPTSR); @@ -1557,19 +1559,8 @@ return; /* not for us */ } - if (codec_independent_spdif_locked > 0) { - if (globel == 0) { - globel += 1; - status2 = inw(card->iobase + 0x76); - outw(status2 | 0x000c, card->iobase + 0x76); - } else { - if (status & (INT_PCMOUT | INT_PCMIN | INT_MICIN | INT_SPDIFOUT | INT_CODECSPDIFOUT)) - ali_channel_interrupt(card); - } - } else { - if (status & (INT_PCMOUT | INT_PCMIN | INT_MICIN | INT_SPDIFOUT | INT_CODECSPDIFOUT)) - ali_channel_interrupt(card); - } + if (status & (INT_PCMOUT | INT_PCMIN | INT_MICIN | INT_SPDIFOUT | INT_CODECSPDIFOUT)) + ali_channel_interrupt(card); /* clear 'em */ outl(status & INT_MASK, card->iobase + ALI_INTERRUPTSR); @@ -1580,8 +1571,7 @@ waiting to be copied to the user's buffer. It is filled by the dma machine and drained by this loop. */ -static ssize_t ali_read(struct file *file, char *buffer, - size_t count, loff_t * ppos) +static ssize_t ali_read(struct file *file, char *buffer, size_t count, loff_t * ppos) { struct ali_state *state = (struct ali_state *) file->private_data; struct ali_card *card = state ? state->card : 0; @@ -1721,8 +1711,7 @@ /* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to the soundcard. it is drained by the dma machine and filled by this loop. */ -static ssize_t ali_write(struct file *file, - const char *buffer, size_t count, loff_t * ppos) +static ssize_t ali_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) { struct ali_state *state = (struct ali_state *) file->private_data; struct ali_card *card = state ? state->card : 0; @@ -1908,8 +1897,7 @@ } /* No kernel lock - we have our own spinlock */ -static unsigned int ali_poll(struct file *file, struct poll_table_struct - *wait) +static unsigned int ali_poll(struct file *file, struct poll_table_struct *wait) { struct ali_state *state = (struct ali_state *) file->private_data; struct dmabuf *dmabuf = &state->dmabuf; @@ -2014,8 +2002,7 @@ } if (c != NULL) { outb(2, state->card->iobase + c->port + OFF_CR); /* reset DMA machine */ - outl(virt_to_bus(&c->sg[0]), - state->card->iobase + c->port + OFF_BDBAR); + outl(virt_to_bus(&c->sg[0]), state->card->iobase + c->port + OFF_BDBAR); outb(0, state->card->iobase + c->port + OFF_CIV); outb(0, state->card->iobase + c->port + OFF_LVI); } @@ -2990,7 +2977,6 @@ { struct ali_card *card = dev->private_data; int count1 = 100; - unsigned long flags; char val; unsigned short int count; @@ -3660,12 +3646,17 @@ MODULE_PARM(codec_independent_spdif_locked, "i"); MODULE_PARM(controller_pcmout_share_spdif_locked, "i"); MODULE_PARM(controller_independent_spdif_locked, "i"); + #define ALI5455_MODULE_NAME "ali5455" + static struct pci_driver ali_pci_driver = { - name:ALI5455_MODULE_NAME, id_table:ali_pci_tbl, probe:ali_probe, - remove:__devexit_p(ali_remove), + name: ALI5455_MODULE_NAME, + id_table: ali_pci_tbl, + probe: ali_probe, + remove: __devexit_p(ali_remove), #ifdef CONFIG_PM - suspend:ali_pm_suspend, resume:ali_pm_resume, + suspend: ali_pm_suspend, + resume: ali_pm_resume, #endif /* CONFIG_PM */ }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/cmpci.c linux-2.4.23-pre8/drivers/sound/cmpci.c --- linux-2.4.22/drivers/sound/cmpci.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/cmpci.c 2003-10-22 22:47:28.000000000 +0000 @@ -98,15 +98,16 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include +#include #include #include "dm.h" @@ -178,26 +179,143 @@ #define DSP_MIX_TREBLEIDX_R ((unsigned char)(0x45)) #define DSP_MIX_BASSIDX_L ((unsigned char)(0x46)) #define DSP_MIX_BASSIDX_R ((unsigned char)(0x47)) +#define DSP_MIX_EXTENSION ((unsigned char)(0xf0)) +// pseudo register for AUX +#define DSP_MIX_AUXVOL_L ((unsigned char)(0x50)) +#define DSP_MIX_AUXVOL_R ((unsigned char)(0x51)) + +// I/O length +#define CM_EXTENT_CODEC 0x100 +#define CM_EXTENT_MIDI 0x2 +#define CM_EXTENT_SYNTH 0x4 +#define CM_EXTENT_GAME 0x8 + +// Function Control Register 0 (00h) +#define CHADC0 0x01 +#define CHADC1 0x02 +#define PAUSE0 0x04 +#define PAUSE1 0x08 + +// Function Control Register 0+2 (02h) +#define CHEN0 0x01 +#define CHEN1 0x02 +#define RST_CH0 0x04 +#define RST_CH1 0x08 + +// Function Control Register 1 (04h) +#define JYSTK_EN 0x02 +#define UART_EN 0x04 +#define SPDO2DAC 0x40 +#define SPDFLOOP 0x80 + +// Function Control Register 1+1 (05h) +#define SPDF_0 0x01 +#define SPDF_1 0x02 +#define ASFC 0xe0 +#define DSFC 0x1c +#define SPDIF2DAC (SPDF_0 << 8 | SPDO2DAC) + +// Channel Format Register (08h) +#define CM_CFMT_STEREO 0x01 +#define CM_CFMT_16BIT 0x02 +#define CM_CFMT_MASK 0x03 +#define POLVALID 0x20 +#define INVSPDIFI 0x80 + +// Channel Format Register+2 (0ah) +#define SPD24SEL 0x20 + +// Channel Format Register+3 (0bh) +#define CHB3D 0x20 +#define CHB3D5C 0x80 + +// Interrupt Hold/Clear Register+2 (0eh) +#define CH0_INT_EN 0x01 +#define CH1_INT_EN 0x02 + +// Interrupt Register (10h) +#define CHINT0 0x01 +#define CHINT1 0x02 +#define CH0BUSY 0x04 +#define CH1BUSY 0x08 + +// Legacy Control/Status Register+1 (15h) +#define EXBASEN 0x10 +#define BASE2LIN 0x20 +#define CENTR2LIN 0x40 +#define CB2LIN (BASE2LIN|CENTR2LIN) +#define CHB3D6C 0x80 + +// Legacy Control/Status Register+2 (16h) +#define DAC2SPDO 0x20 +#define SPDCOPYRHT 0x40 +#define ENSPDOUT 0x80 + +// Legacy Control/Status Register+3 (17h) +#define FMSEL 0x03 +#define VSBSEL 0x0c +#define VMPU 0x60 +#define NXCHG 0x80 + +// Miscellaneous Control Register (18h) +#define REAR2LIN 0x20 +#define MUTECH1 0x40 +#define ENCENTER 0x80 + +// Miscellaneous Control Register+1 (19h) +#define SELSPDIFI2 0x01 +#define SPDF_AC97 0x80 + +// Miscellaneous Control Register+2 (1ah) +#define AC3_EN 0x04 +#define FM_EN 0x08 +#define SPD32SEL 0x20 +#define XCHGDAC 0x40 +#define ENDBDAC 0x80 + +// Miscellaneous Control Register+3 (1bh) +#define SPDIFI48K 0x01 +#define SPDO5V 0x02 +#define N4SPK3D 0x04 +#define RESET 0x40 +#define PWD 0x80 +#define SPDIF48K (SPDIFI48K << 24 | SPDF_AC97 << 8) + +// Mixer1 (24h) +#define CDPLAY 0x01 +#define X3DEN 0x02 +#define REAR2FRONT 0x10 +#define SPK4 0x20 +#define WSMUTE 0x40 + +// Miscellaneous Register (27h) +#define SPDVALID 0x02 +#define CENTR2MIC 0x04 + +#define CM_CFMT_DACSHIFT 0 +#define CM_CFMT_ADCSHIFT 2 +#define CM_FREQ_DACSHIFT 2 +#define CM_FREQ_ADCSHIFT 5 +#define RSTDAC RST_CH0 +#define RSTADC RST_CH1 +#define ENDAC CHEN0 +#define ENADC CHEN1 +#define PAUSEDAC PAUSE0 +#define PAUSEADC PAUSE1 +#define CODEC_CMI_DAC_FRAME1 CODEC_CMI_CH0_FRAME1 +#define CODEC_CMI_DAC_FRAME2 CODEC_CMI_CH0_FRAME2 +#define CODEC_CMI_ADC_FRAME1 CODEC_CMI_CH1_FRAME1 +#define CODEC_CMI_ADC_FRAME2 CODEC_CMI_CH1_FRAME2 +#define DACINT CHINT0 +#define ADCINT CHINT1 +#define DACBUSY CH0BUSY +#define ADCBUSY CH1BUSY +#define ENDACINT CH0_INT_EN +#define ENADCINT CH1_INT_EN -#define CM_CH0_RESET 0x04 -#define CM_CH1_RESET 0x08 -#define CM_EXTENT_CODEC 0x100 -#define CM_EXTENT_MIDI 0x2 -#define CM_EXTENT_SYNTH 0x4 -#define CM_INT_CH0 1 -#define CM_INT_CH1 2 - -#define CM_CFMT_STEREO 0x01 -#define CM_CFMT_16BIT 0x02 -#define CM_CFMT_MASK 0x03 -#define CM_CFMT_DACSHIFT 2 -#define CM_CFMT_ADCSHIFT 0 - +static const unsigned sample_size[] = { 1, 2, 2, 4 }; static const unsigned sample_shift[] = { 0, 1, 1, 2 }; -#define CM_ENABLE_CH1 0x2 -#define CM_ENABLE_CH0 0x1 - /* MIDI buffer sizes **************************/ #define MIDIINBUF 256 @@ -213,11 +331,19 @@ #define NR_DEVICE 3 /* maximum number of devices */ -/*********************************************/ +static unsigned int devindex = 0; + +//*********************************************/ struct cm_state { - unsigned int magic; /* magic */ - struct cm_state *next; /* we keep cm cards in a linked list */ + /* magic */ + unsigned int magic; + + /* list of cmedia devices */ + struct list_head devs; + + /* the corresponding pci_dev structure */ + struct pci_dev *dev; int dev_audio; /* soundcore stuff */ int dev_mixer; @@ -275,7 +401,9 @@ unsigned char ibuf[MIDIINBUF]; unsigned char obuf[MIDIOUTBUF]; } midi; - + + struct gameport gameport; + int chip_version; int max_channels; int curr_channels; @@ -312,8 +440,7 @@ #define DO_SPDIF_IN 0x00000200 #define DO_SPDIF_LOOP 0x00000400 -static struct cm_state *devs; -static unsigned long wavetable_mem; +static LIST_HEAD(devs); /* --------------------------------------------------------------------- */ @@ -356,55 +483,55 @@ static void set_dmadac1(struct cm_state *s, unsigned int addr, unsigned int count) { if (addr) - outl(addr, s->iobase + CODEC_CMI_CH0_FRAME1); - outw(count - 1, s->iobase + CODEC_CMI_CH0_FRAME2); - maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~1, 0); + outl(addr, s->iobase + CODEC_CMI_ADC_FRAME1); + outw(count - 1, s->iobase + CODEC_CMI_ADC_FRAME2); + maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~CHADC1, 0); } static void set_dmaadc(struct cm_state *s, unsigned int addr, unsigned int count) { - outl(addr, s->iobase + CODEC_CMI_CH0_FRAME1); - outw(count - 1, s->iobase + CODEC_CMI_CH0_FRAME2); - maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, 1); + outl(addr, s->iobase + CODEC_CMI_ADC_FRAME1); + outw(count - 1, s->iobase + CODEC_CMI_ADC_FRAME2); + maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, CHADC1); } static void set_dmadac(struct cm_state *s, unsigned int addr, unsigned int count) { - outl(addr, s->iobase + CODEC_CMI_CH1_FRAME1); - outw(count - 1, s->iobase + CODEC_CMI_CH1_FRAME2); - maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~2, 0); + outl(addr, s->iobase + CODEC_CMI_DAC_FRAME1); + outw(count - 1, s->iobase + CODEC_CMI_DAC_FRAME2); + maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~CHADC0, 0); if (s->status & DO_DUAL_DAC) set_dmadac1(s, 0, count); } static void set_countadc(struct cm_state *s, unsigned count) { - outw(count - 1, s->iobase + CODEC_CMI_CH0_FRAME2 + 2); + outw(count - 1, s->iobase + CODEC_CMI_ADC_FRAME2 + 2); } static void set_countdac(struct cm_state *s, unsigned count) { - outw(count - 1, s->iobase + CODEC_CMI_CH1_FRAME2 + 2); + outw(count - 1, s->iobase + CODEC_CMI_DAC_FRAME2 + 2); if (s->status & DO_DUAL_DAC) set_countadc(s, count); } -static inline unsigned get_dmadac(struct cm_state *s) +static unsigned get_dmadac(struct cm_state *s) { unsigned int curr_addr; - curr_addr = inw(s->iobase + CODEC_CMI_CH1_FRAME2) + 1; + curr_addr = inw(s->iobase + CODEC_CMI_DAC_FRAME2) + 1; curr_addr <<= sample_shift[(s->fmt >> CM_CFMT_DACSHIFT) & CM_CFMT_MASK]; curr_addr = s->dma_dac.dmasize - curr_addr; return curr_addr; } -static inline unsigned get_dmaadc(struct cm_state *s) +static unsigned get_dmaadc(struct cm_state *s) { unsigned int curr_addr; - curr_addr = inw(s->iobase + CODEC_CMI_CH0_FRAME2) + 1; + curr_addr = inw(s->iobase + CODEC_CMI_ADC_FRAME2) + 1; curr_addr <<= sample_shift[(s->fmt >> CM_CFMT_ADCSHIFT) & CM_CFMT_MASK]; curr_addr = s->dma_adc.dmasize - curr_addr; @@ -413,23 +540,79 @@ static void wrmixer(struct cm_state *s, unsigned char idx, unsigned char data) { + unsigned char regval, pseudo; + + // pseudo register + if (idx == DSP_MIX_AUXVOL_L) { + data >>= 4; + data &= 0x0f; + regval = inb(s->iobase + CODEC_CMI_AUX_VOL) & ~0x0f; + outb(regval | data, s->iobase + CODEC_CMI_AUX_VOL); + return; + } + if (idx == DSP_MIX_AUXVOL_R) { + data &= 0xf0; + regval = inb(s->iobase + CODEC_CMI_AUX_VOL) & ~0xf0; + outb(regval | data, s->iobase + CODEC_CMI_AUX_VOL); + return; + } outb(idx, s->iobase + CODEC_SB16_ADDR); udelay(10); + // pseudo bits + if (idx == DSP_MIX_OUTMIXIDX) { + pseudo = data & ~0x1f; + pseudo >>= 1; + regval = inb(s->iobase + CODEC_CMI_MIXER2) & ~0x30; + outb(regval | pseudo, s->iobase + CODEC_CMI_MIXER2); + } + if (idx == DSP_MIX_ADCMIXIDX_L) { + pseudo = data & 0x80; + pseudo >>= 1; + regval = inb(s->iobase + CODEC_CMI_MIXER2) & ~0x40; + outb(regval | pseudo, s->iobase + CODEC_CMI_MIXER2); + } + if (idx == DSP_MIX_ADCMIXIDX_R) { + pseudo = data & 0x80; + regval = inb(s->iobase + CODEC_CMI_MIXER2) & ~0x80; + outb(regval | pseudo, s->iobase + CODEC_CMI_MIXER2); + } outb(data, s->iobase + CODEC_SB16_DATA); udelay(10); } static unsigned char rdmixer(struct cm_state *s, unsigned char idx) { - unsigned char v; - unsigned long flags; + unsigned char v, pseudo; - spin_lock_irqsave(&s->lock, flags); + // pseudo register + if (idx == DSP_MIX_AUXVOL_L) { + v = inb(s->iobase + CODEC_CMI_AUX_VOL) & 0x0f; + v <<= 4; + return v; + } + if (idx == DSP_MIX_AUXVOL_L) { + v = inb(s->iobase + CODEC_CMI_AUX_VOL) & 0xf0; + return v; + } outb(idx, s->iobase + CODEC_SB16_ADDR); udelay(10); v = inb(s->iobase + CODEC_SB16_DATA); udelay(10); - spin_unlock_irqrestore(&s->lock, flags); + // pseudo bits + if (idx == DSP_MIX_OUTMIXIDX) { + pseudo = inb(s->iobase + CODEC_CMI_MIXER2) & 0x30; + pseudo <<= 1; + v |= pseudo; + } + if (idx == DSP_MIX_ADCMIXIDX_L) { + pseudo = inb(s->iobase + CODEC_CMI_MIXER2) & 0x40; + pseudo <<= 1; + v |= pseudo; + } + if (idx == DSP_MIX_ADCMIXIDX_R) { + pseudo = inb(s->iobase + CODEC_CMI_MIXER2) & 0x80; + v |= pseudo; + } return v; } @@ -479,24 +662,88 @@ { 48000, (44100 + 48000) / 2, 48000, 7 } }; +static void set_spdif_copyright(struct cm_state *s, int spdif_copyright) +{ + /* enable SPDIF-in Copyright */ + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 2, ~SPDCOPYRHT, spdif_copyright ? SPDCOPYRHT : 0); +} + +static void set_spdif_loop(struct cm_state *s, int spdif_loop) +{ + /* enable SPDIF loop */ + if (spdif_loop) { + s->status |= DO_SPDIF_LOOP; + /* turn on spdif-in to spdif-out */ + maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, SPDFLOOP); + } else { + s->status &= ~DO_SPDIF_LOOP; + /* turn off spdif-in to spdif-out */ + maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~SPDFLOOP, 0); + } +} + +static void set_spdif_monitor(struct cm_state *s, int channel) +{ + // SPDO2DAC + maskw(s->iobase + CODEC_CMI_FUNCTRL1, ~SPDO2DAC, channel == 2 ? SPDO2DAC : 0); + // CDPLAY + if (s->chip_version >= 39) + maskb(s->iobase + CODEC_CMI_MIXER1, ~CDPLAY, channel ? CDPLAY : 0); +} + +static void set_spdifout_level(struct cm_state *s, int level5v) +{ + /* SPDO5V */ + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 3, ~SPDO5V, level5v ? SPDO5V : 0); +} + +static void set_spdifin_inverse(struct cm_state *s, int spdif_inverse) +{ + if (spdif_inverse) { + /* turn on spdif-in inverse */ + if (s->chip_version >= 39) + maskb(s->iobase + CODEC_CMI_CHFORMAT, ~0, INVSPDIFI); + else + maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 1); + } else { + /* turn off spdif-ininverse */ + if (s->chip_version >= 39) + maskb(s->iobase + CODEC_CMI_CHFORMAT, ~INVSPDIFI, 0); + else + maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~1, 0); + } +} + +static void set_spdifin_channel2(struct cm_state *s, int channel2) +{ + /* SELSPDIFI2 */ + if (s->chip_version >= 39) + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 1, ~SELSPDIFI2, channel2 ? SELSPDIFI2 : 0); +} + +static void set_spdifin_valid(struct cm_state *s, int valid) +{ + /* SPDVALID */ + maskb(s->iobase + CODEC_CMI_MISC, ~SPDVALID, valid ? SPDVALID : 0); +} + static void set_spdifout_unlocked(struct cm_state *s, unsigned rate) { if (rate == 48000 || rate == 44100) { + // SPDF_0 + maskw(s->iobase + CODEC_CMI_FUNCTRL1, ~0, SPDF_0); // SPDIFI48K SPDF_ACc97 - maskl(s->iobase + CODEC_CMI_MISC_CTRL, ~0x01008000, rate == 48000 ? 0x01008000 : 0); + maskl(s->iobase + CODEC_CMI_MISC_CTRL, ~SPDIF48K, rate == 48000 ? SPDIF48K : 0); // ENSPDOUT - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 2, ~0, 0x80); - // SPDF_1 SPD2DAC - maskw(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 0x240); - // CDPLAY - if (s->chip_version >= 39) - maskb(s->iobase + CODEC_CMI_MIXER1, ~0, 1); + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 2, ~0, ENSPDOUT); + // monitor SPDIF out + set_spdif_monitor(s, 2); s->status |= DO_SPDIF_OUT; } else { - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 2, ~0x80, 0); - maskw(s->iobase + CODEC_CMI_FUNCTRL1, ~0x240, 0); - if (s->chip_version >= 39) - maskb(s->iobase + CODEC_CMI_MIXER1, ~1, 0); + maskw(s->iobase + CODEC_CMI_FUNCTRL1, ~SPDF_0, 0); + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 2, ~ENSPDOUT, 0); + // monitor none + set_spdif_monitor(s, 0); s->status &= ~DO_SPDIF_OUT; } } @@ -510,7 +757,30 @@ spin_unlock_irqrestore(&s->lock, flags); } -/* find parity for bit 4~30 */ +static void set_spdifin_unlocked(struct cm_state *s, unsigned rate) +{ + if (rate == 48000 || rate == 44100) { + // SPDF_1 + maskw(s->iobase + CODEC_CMI_FUNCTRL1, ~0, SPDF_1); + // SPDIFI48K SPDF_AC97 + maskl(s->iobase + CODEC_CMI_MISC_CTRL, ~SPDIF48K, rate == 48000 ? SPDIF48K : 0); + s->status |= DO_SPDIF_IN; + } else { + maskw(s->iobase + CODEC_CMI_FUNCTRL1, ~SPDF_1, 0); + s->status &= ~DO_SPDIF_IN; + } +} + +static void set_spdifin(struct cm_state *s, unsigned rate) +{ + unsigned long flags; + + spin_lock_irqsave(&s->lock, flags); + set_spdifin_unlocked(s,rate); + spin_unlock_irqrestore(&s->lock, flags); +} + +//* find parity for bit 4~30 */ static unsigned parity(unsigned data) { unsigned parity = 0; @@ -531,21 +801,26 @@ /* enable AC3 */ if (rate == 48000 || rate == 44100) { // mute DAC - maskb(s->iobase + CODEC_CMI_MIXER1, ~0, 0x40); - // AC3EN for 037, 0x10 - maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 0x10); + maskb(s->iobase + CODEC_CMI_MIXER1, ~0, WSMUTE); // AC3EN for 039, 0x04 - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, 0x04); + if (s->chip_version >= 39) + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, AC3_EN); + // AC3EN for 037, 0x10 + else if (s->chip_version == 37) + maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 0x10); if (s->capability & CAN_AC3_HW) { - // SPD24SEL for 037, 0x02 // SPD24SEL for 039, 0x20, but cannot be set - maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 0x02); + if (s->chip_version >= 39) + maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, SPD24SEL); + // SPD24SEL for 037, 0x02 + else if (s->chip_version == 37) + maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 0x02); s->status |= DO_AC3_HW; if (s->chip_version >= 39) - maskb(s->iobase + CODEC_CMI_MIXER1, ~1, 0); + maskb(s->iobase + CODEC_CMI_MIXER1, ~CDPLAY, 0); } else { // SPD32SEL for 037 & 039, 0x20 - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, 0x20); + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, SPD32SEL); // set 176K sample rate to fix 033 HW bug if (s->chip_version == 33) { if (rate == 48000) @@ -556,18 +831,16 @@ s->status |= DO_AC3_SW; } } else { - maskb(s->iobase + CODEC_CMI_MIXER1, ~0x40, 0); + maskb(s->iobase + CODEC_CMI_MIXER1, ~WSMUTE, 0); maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0x32, 0); - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0x24, 0); - maskb(s->iobase + CODEC_CMI_CHFORMAT + 1, ~0x08, 0); + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~(SPD32SEL|AC3_EN), 0); if (s->chip_version == 33) maskb(s->iobase + CODEC_CMI_CHFORMAT + 1, ~0x08, 0); if (s->chip_version >= 39) - maskb(s->iobase + CODEC_CMI_MIXER1, ~0, 1); + maskb(s->iobase + CODEC_CMI_MIXER1, ~0, CDPLAY); s->status &= ~DO_AC3; } s->spdif_counter = 0; - } static void set_ac3(struct cm_state *s, unsigned rate) @@ -629,9 +902,9 @@ } } s->rateadc = rate; - freq <<= 2; + freq <<= CM_FREQ_ADCSHIFT; - maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~0x1c, freq); + maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~ASFC, freq); } static void set_adc_rate(struct cm_state *s, unsigned rate) @@ -652,10 +925,10 @@ } } s->rateadc = rate; - freq <<= 2; + freq <<= CM_FREQ_ADCSHIFT; spin_lock_irqsave(&s->lock, flags); - maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~0x1c, freq); + maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~ASFC, freq); spin_unlock_irqrestore(&s->lock, flags); } @@ -677,46 +950,45 @@ } } s->ratedac = rate; - freq <<= 5; + freq <<= CM_FREQ_DACSHIFT; spin_lock_irqsave(&s->lock, flags); - maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~0xe0, freq); - + maskb(s->iobase + CODEC_CMI_FUNCTRL1 + 1, ~DSFC, freq); + spin_unlock_irqrestore(&s->lock, flags); if (s->curr_channels <= 2) - set_spdifout_unlocked(s, rate); + set_spdifout(s, rate); if (s->status & DO_DUAL_DAC) - set_adc_rate_unlocked(s, rate); - - spin_unlock_irqrestore(&s->lock, flags); + set_adc_rate(s, rate); } /* --------------------------------------------------------------------- */ static inline void reset_adc(struct cm_state *s) { /* reset bus master */ - outb(s->enable | CM_CH0_RESET, s->iobase + CODEC_CMI_FUNCTRL0 + 2); + outb(s->enable | RSTADC, s->iobase + CODEC_CMI_FUNCTRL0 + 2); udelay(10); - outb(s->enable & ~CM_CH0_RESET, s->iobase + CODEC_CMI_FUNCTRL0 + 2); + outb(s->enable & ~RSTADC, s->iobase + CODEC_CMI_FUNCTRL0 + 2); } static inline void reset_dac(struct cm_state *s) { /* reset bus master */ - outb(s->enable | CM_CH1_RESET, s->iobase + CODEC_CMI_FUNCTRL0 + 2); - outb(s->enable & ~CM_CH1_RESET, s->iobase + CODEC_CMI_FUNCTRL0 + 2); + outb(s->enable | RSTDAC, s->iobase + CODEC_CMI_FUNCTRL0 + 2); + udelay(10); + outb(s->enable & ~RSTDAC, s->iobase + CODEC_CMI_FUNCTRL0 + 2); if (s->status & DO_DUAL_DAC) reset_adc(s); } static inline void pause_adc(struct cm_state *s) { - maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, 4); + maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, PAUSEADC); } static inline void pause_dac(struct cm_state *s) { - maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, 8); + maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, PAUSEDAC); if (s->status & DO_DUAL_DAC) pause_adc(s); } @@ -724,7 +996,7 @@ static inline void disable_adc(struct cm_state *s) { /* disable channel */ - s->enable &= ~CM_ENABLE_CH0; + s->enable &= ~ENADC; outb(s->enable, s->iobase + CODEC_CMI_FUNCTRL0 + 2); reset_adc(s); } @@ -732,7 +1004,7 @@ static inline void disable_dac(struct cm_state *s) { /* disable channel */ - s->enable &= ~CM_ENABLE_CH1; + s->enable &= ~ENDAC; outb(s->enable, s->iobase + CODEC_CMI_FUNCTRL0 + 2); reset_dac(s); if (s->status & DO_DUAL_DAC) @@ -741,22 +1013,22 @@ static inline void enable_adc(struct cm_state *s) { - if (!(s->enable & CM_ENABLE_CH0)) { + if (!(s->enable & ENADC)) { /* enable channel */ - s->enable |= CM_ENABLE_CH0; + s->enable |= ENADC; outb(s->enable, s->iobase + CODEC_CMI_FUNCTRL0 + 2); } - maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~4, 0); + maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~PAUSEADC, 0); } static inline void enable_dac_unlocked(struct cm_state *s) { - if (!(s->enable & CM_ENABLE_CH1)) { + if (!(s->enable & ENDAC)) { /* enable channel */ - s->enable |= CM_ENABLE_CH1; + s->enable |= ENDAC; outb(s->enable, s->iobase + CODEC_CMI_FUNCTRL0 + 2); } - maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~8, 0); + maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~PAUSEDAC, 0); if (s->status & DO_DUAL_DAC) enable_adc(s); @@ -773,9 +1045,9 @@ static inline void stop_adc_unlocked(struct cm_state *s) { - if (s->enable & CM_ENABLE_CH0) { + if (s->enable & ENADC) { /* disable interrupt */ - maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~1, 0); + maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~ENADCINT, 0); disable_adc(s); } } @@ -792,9 +1064,9 @@ static inline void stop_dac_unlocked(struct cm_state *s) { - if (s->enable & CM_ENABLE_CH1) { + if (s->enable & ENDAC) { /* disable interrupt */ - maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~2, 0); + maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~ENDACINT, 0); disable_dac(s); } if (s->status & DO_DUAL_DAC) @@ -810,12 +1082,12 @@ spin_unlock_irqrestore(&s->lock, flags); } -static void start_adc_unlocked(struct cm_state *s) +static inline void start_adc_unlocked(struct cm_state *s) { if ((s->dma_adc.mapped || s->dma_adc.count < (signed)(s->dma_adc.dmasize - 2*s->dma_adc.fragsize)) && s->dma_adc.ready) { /* enable interrupt */ - maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, 1); + maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, ENADCINT); enable_adc(s); } } @@ -833,7 +1105,7 @@ { if ((s->dma_adc.mapped || s->dma_adc.count > 0) && s->dma_adc.ready) { /* enable interrupt */ -// maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, 1); + maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, ENADCINT); enable_dac_unlocked(s); } } @@ -842,11 +1114,11 @@ { if ((s->dma_dac.mapped || s->dma_dac.count > 0) && s->dma_dac.ready) { /* enable interrupt */ - maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, 2); + maskb(s->iobase + CODEC_CMI_INT_HLDCLR + 2, ~0, ENDACINT); enable_dac_unlocked(s); } - if (s->status & DO_DUAL_DAC) - start_dac1_unlocked(s); + if (s->status & DO_DUAL_DAC) + start_dac1_unlocked(s); } static void start_dac(struct cm_state *s) @@ -870,13 +1142,13 @@ set_spdifout_unlocked(s, 0); if (s->capability & CAN_MULTI_CH_HW) { // NXCHG - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~0, 0x80); + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~0, NXCHG); // CHB3D or CHB3D5C - maskb(s->iobase + CODEC_CMI_CHFORMAT + 3, ~0xa0, channels > 4 ? 0x80 : 0x20); + maskb(s->iobase + CODEC_CMI_CHFORMAT + 3, ~(CHB3D5C|CHB3D), channels > 4 ? CHB3D5C : CHB3D); // CHB3D6C - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~0x80, channels == 6 ? 0x80 : 0); + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~CHB3D6C, channels == 6 ? CHB3D6C : 0); // ENCENTER - maskb(s->iobase + CODEC_CMI_MISC_CTRL, ~0x80, channels == 6 ? 0x80 : 0); + maskb(s->iobase + CODEC_CMI_MISC_CTRL, ~ENCENTER, channels == 6 ? ENCENTER : 0); s->status |= DO_MULTI_CH_HW; } else if (s->capability & CAN_DUAL_DAC) { unsigned char fmtm = ~0, fmts = 0; @@ -884,7 +1156,7 @@ // ENDBDAC, turn on double DAC mode // XCHGDAC, CH0 -> back, CH1->front - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, 0xC0); + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, ENDBDAC|XCHGDAC); s->status |= DO_DUAL_DAC; // prepare secondary buffer @@ -907,20 +1179,21 @@ } + // N4SPK3D, disable 4 speaker mode (analog duplicate) if (s->speakers > 2) - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 3, ~0x04, 0); + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 3, ~N4SPK3D, 0); s->curr_channels = channels; } else { if (s->status & DO_MULTI_CH_HW) { - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~0x80, 0); - maskb(s->iobase + CODEC_CMI_CHFORMAT + 3, ~0xa0, 0); - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~0x80, 0); + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~NXCHG, 0); + maskb(s->iobase + CODEC_CMI_CHFORMAT + 3, ~(CHB3D5C|CHB3D), 0); + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~CHB3D6C, 0); } else if (s->status & DO_DUAL_DAC) { - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0x80, 0); + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~ENDBDAC, 0); } // N4SPK3D, enable 4 speaker mode (analog duplicate) if (s->speakers > 2) - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 3, ~0, 0x04); + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 3, ~0, N4SPK3D); s->status &= ~DO_MULTI_CH; s->curr_channels = s->fmt & (CM_CFMT_STEREO << CM_CFMT_DACSHIFT) ? 2 : 1; } @@ -1173,10 +1446,10 @@ spin_lock(&s->lock); intstat = inb(s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* acknowledge interrupt */ - if (intsrc & CM_INT_CH0) - mask |= 1; - if (intsrc & CM_INT_CH1) - mask |= 2; + if (intsrc & ADCINT) + mask |= ENADCINT; + if (intsrc & DACINT) + mask |= ENDACINT; outb(intstat & ~mask, s->iobase + CODEC_CMI_INT_HLDCLR + 2); outb(intstat | mask, s->iobase + CODEC_CMI_INT_HLDCLR + 2); cm_update_ptr(s); @@ -1237,6 +1510,7 @@ [SOUND_MIXER_SYNTH] = { DSP_MIX_FMVOLIDX_L, DSP_MIX_FMVOLIDX_R, MT_5MUTE, 0x40, 0x00 }, [SOUND_MIXER_VOLUME] = { DSP_MIX_MASTERVOLIDX_L, DSP_MIX_MASTERVOLIDX_R, MT_5MUTE, 0x00, 0x00 }, [SOUND_MIXER_PCM] = { DSP_MIX_VOICEVOLIDX_L, DSP_MIX_VOICEVOLIDX_R, MT_5MUTE, 0x00, 0x00 }, + [SOUND_MIXER_LINE1] = { DSP_MIX_AUXVOL_L, DSP_MIX_AUXVOL_R, MT_5MUTE, 0x80, 0x20 }, [SOUND_MIXER_SPEAKER]= { DSP_MIX_SPKRVOLIDX, DSP_MIX_SPKRVOLIDX, MT_5MUTEMONO, 0x01, 0x01 } }; @@ -1248,15 +1522,32 @@ [SOUND_MIXER_SYNTH] = 4, [SOUND_MIXER_VOLUME] = 5, [SOUND_MIXER_PCM] = 6, - [SOUND_MIXER_SPEAKER]= 7 + [SOUND_MIXER_LINE1] = 7, + [SOUND_MIXER_SPEAKER]= 8 }; +static unsigned mixer_outmask(struct cm_state *s) +{ + unsigned long flags; + int i, j, k; + + spin_lock_irqsave(&s->lock, flags); + j = rdmixer(s, DSP_MIX_OUTMIXIDX); + spin_unlock_irqrestore(&s->lock, flags); + for (k = i = 0; i < SOUND_MIXER_NRDEVICES; i++) + if (j & mixtable[i].play) + k |= 1 << i; + return k; +} + static unsigned mixer_recmask(struct cm_state *s) { + unsigned long flags; int i, j, k; + spin_lock_irqsave(&s->lock, flags); j = rdmixer(s, DSP_MIX_ADCMIXIDX_L); - j &= 0x7f; + spin_unlock_irqrestore(&s->lock, flags); for (k = i = 0; i < SOUND_MIXER_NRDEVICES; i++) if (j & mixtable[i].rec) k |= 1 << i; @@ -1297,7 +1588,7 @@ return put_user(mixer_recmask(s), (int *)arg); case SOUND_MIXER_OUTSRC: /* Arg contains a bit for each recording source */ - return put_user(mixer_recmask(s), (int *)arg);//need fix + return put_user(mixer_outmask(s), (int *)arg); case SOUND_MIXER_DEVMASK: /* Arg contains a bit for each supported device */ for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++) @@ -1354,7 +1645,7 @@ } spin_lock_irqsave(&s->lock, flags); wrmixer(s, DSP_MIX_ADCMIXIDX_L, j); - wrmixer(s, DSP_MIX_ADCMIXIDX_R, (j & 1) | (j>>1)); + wrmixer(s, DSP_MIX_ADCMIXIDX_R, (j & 1) | (j>>1) | (j & 0x80)); spin_unlock_irqrestore(&s->lock, flags); return 0; @@ -1371,11 +1662,11 @@ j |= mixtable[i].play; } spin_lock_irqsave(&s->lock, flags); - frobindir(s, DSP_MIX_OUTMIXIDX, 0x1f, j); + wrmixer(s, DSP_MIX_OUTMIXIDX, j); spin_unlock_irqrestore(&s->lock, flags); return 0; - default: + default: i = _IOC_NR(cmd); if (i >= SOUND_MIXER_NRDEVICES || !mixtable[i].type) return -EINVAL; @@ -1402,15 +1693,28 @@ rl = (l < 4 ? 0 : (l - 5) / 3) & 31; rr = (rl >> 2) & 7; wrmixer(s, mixtable[i].left, rl<<3); - maskb(s->iobase + CODEC_CMI_MIXER2, ~0x0e, rr<<1); + if (i == SOUND_MIXER_MIC) + maskb(s->iobase + CODEC_CMI_MIXER2, ~0x0e, rr<<1); break; case MT_5MUTEMONO: r = l; rl = l < 4 ? 0 : (l - 5) / 3; - rr = rl >> 2; wrmixer(s, mixtable[i].left, rl<<3); - maskb(s->iobase + CODEC_CMI_MIXER2, ~0x0e, rr<<1); + l = rdmixer(s, DSP_MIX_OUTMIXIDX) & ~mixtable[i].play; + rr = rl ? mixtable[i].play : 0; + wrmixer(s, DSP_MIX_OUTMIXIDX, l | rr); + /* for recording */ + if (i == SOUND_MIXER_MIC) { + if (s->chip_version >= 39) { + rr = rl >> 1; + maskb(s->iobase + CODEC_CMI_MIXER2, ~0x0e, rr&0x07); + frobindir(s, DSP_MIX_EXTENSION, 0x01, rr>>3); + } else { + rr = rl >> 2; + maskb(s->iobase + CODEC_CMI_MIXER2, ~0x0e, rr<<1); + } + } break; case MT_5MUTE: @@ -1418,6 +1722,10 @@ rr = r < 4 ? 0 : (r - 5) / 3; wrmixer(s, mixtable[i].left, rl<<3); wrmixer(s, mixtable[i].right, rr<<3); + l = rdmixer(s, DSP_MIX_OUTMIXIDX); + l &= ~mixtable[i].play; + r = (rl|rr) ? mixtable[i].play : 0; + wrmixer(s, DSP_MIX_OUTMIXIDX, l | r); break; case MT_6MUTE: @@ -1447,12 +1755,16 @@ static int cm_open_mixdev(struct inode *inode, struct file *file) { int minor = MINOR(inode->i_rdev); - struct cm_state *s = devs; + struct list_head *list; + struct cm_state *s; - while (s && s->dev_mixer != minor) - s = s->next; - if (!s) - return -ENODEV; + for (list = devs.next; ; list = list->next) { + if (list == &devs) + return -ENODEV; + s = list_entry(list, struct cm_state, devs); + if (s->dev_mixer == minor) + break; + } VALIDATE_STATE(s); file->private_data = s; return 0; @@ -1490,9 +1802,9 @@ if (s->dma_dac.mapped || !s->dma_dac.ready) return 0; - set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&s->dma_dac.wait, &wait); for (;;) { + __set_current_state(TASK_INTERRUPTIBLE); spin_lock_irqsave(&s->lock, flags); count = s->dma_dac.count; spin_unlock_irqrestore(&s->lock, flags); @@ -1522,6 +1834,7 @@ static ssize_t cm_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct cm_state *s = (struct cm_state *)file->private_data; + DECLARE_WAITQUEUE(wait, current); ssize_t ret; unsigned long flags; unsigned swptr; @@ -1538,12 +1851,15 @@ return -EFAULT; ret = 0; + add_wait_queue(&s->dma_adc.wait, &wait); while (count > 0) { spin_lock_irqsave(&s->lock, flags); swptr = s->dma_adc.swptr; cnt = s->dma_adc.dmasize-swptr; if (s->dma_adc.count < cnt) cnt = s->dma_adc.count; + if (cnt <= 0) + __set_current_state(TASK_INTERRUPTIBLE); spin_unlock_irqrestore(&s->lock, flags); if (cnt > count) cnt = count; @@ -1551,7 +1867,7 @@ start_adc(s); if (file->f_flags & O_NONBLOCK) return ret ? ret : -EAGAIN; - if (!interruptible_sleep_on_timeout(&s->dma_adc.wait, HZ)) { + if (!schedule_timeout(HZ)) { printk(KERN_DEBUG "cmpci: read: chip lockup? dmasz %u fragsz %u count %i hwptr %u swptr %u\n", s->dma_adc.dmasize, s->dma_adc.fragsize, s->dma_adc.count, s->dma_adc.hwptr, s->dma_adc.swptr); @@ -1579,12 +1895,15 @@ start_adc_unlocked(s); spin_unlock_irqrestore(&s->lock, flags); } + remove_wait_queue(&s->dma_adc.wait, &wait); + set_current_state(TASK_RUNNING); return ret; } static ssize_t cm_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct cm_state *s = (struct cm_state *)file->private_data; + DECLARE_WAITQUEUE(wait, current); ssize_t ret; unsigned long flags; unsigned swptr; @@ -1609,6 +1928,7 @@ return -EFAULT; ret = 0; + add_wait_queue(&s->dma_dac.wait, &wait); while (count > 0) { spin_lock_irqsave(&s->lock, flags); if (s->dma_dac.count < 0) { @@ -1629,6 +1949,8 @@ if (s->dma_dac.count + cnt > s->dma_dac.dmasize) cnt = s->dma_dac.dmasize - s->dma_dac.count; } + if (cnt <= 0) + __set_current_state(TASK_INTERRUPTIBLE); spin_unlock_irqrestore(&s->lock, flags); if (cnt > count) cnt = count; @@ -1638,7 +1960,7 @@ start_dac(s); if (file->f_flags & O_NONBLOCK) return ret ? ret : -EAGAIN; - if (!interruptible_sleep_on_timeout(&s->dma_dac.wait, HZ)) { + if (!schedule_timeout(HZ)) { printk(KERN_DEBUG "cmpci: write: chip lockup? dmasz %u fragsz %u count %i hwptr %u swptr %u\n", s->dma_dac.dmasize, s->dma_dac.fragsize, s->dma_dac.count, s->dma_dac.hwptr, s->dma_dac.swptr); @@ -1704,6 +2026,8 @@ } start_dac(s); } + remove_wait_queue(&s->dma_dac.wait, &wait); + set_current_state(TASK_RUNNING); return ret; } @@ -1772,6 +2096,16 @@ return ret; } +#define SNDCTL_SPDIF_COPYRIGHT _SIOW('S', 0, int) // set/reset S/PDIF copy protection +#define SNDCTL_SPDIF_LOOP _SIOW('S', 1, int) // set/reset S/PDIF loop +#define SNDCTL_SPDIF_MONITOR _SIOW('S', 2, int) // set S/PDIF monitor +#define SNDCTL_SPDIF_LEVEL _SIOW('S', 3, int) // set/reset S/PDIF out level +#define SNDCTL_SPDIF_INV _SIOW('S', 4, int) // set/reset S/PDIF in inverse +#define SNDCTL_SPDIF_SEL2 _SIOW('S', 5, int) // set S/PDIF in #2 +#define SNDCTL_SPDIF_VALID _SIOW('S', 6, int) // set S/PDIF valid +#define SNDCTL_SPDIFOUT _SIOW('S', 7, int) // set S/PDIF out +#define SNDCTL_SPDIFIN _SIOW('S', 8, int) // set S/PDIF out + static int cm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct cm_state *s = (struct cm_state *)file->private_data; @@ -1955,14 +2289,14 @@ val = 0; if (s->status & DO_DUAL_DAC) { if (file->f_mode & FMODE_WRITE && - (s->enable & CM_ENABLE_CH1) && - (s->enable & CM_ENABLE_CH0)) + (s->enable & ENDAC) && + (s->enable & ENADC)) val |= PCM_ENABLE_OUTPUT; return put_user(val, (int *)arg); } - if (file->f_mode & FMODE_READ && s->enable & CM_ENABLE_CH0) + if (file->f_mode & FMODE_READ && s->enable & ENADC) val |= PCM_ENABLE_INPUT; - if (file->f_mode & FMODE_WRITE && s->enable & CM_ENABLE_CH1) + if (file->f_mode & FMODE_WRITE && s->enable & ENDAC) val |= PCM_ENABLE_OUTPUT; return put_user(val, (int *)arg); @@ -1994,7 +2328,7 @@ case SNDCTL_DSP_GETOSPACE: if (!(file->f_mode & FMODE_WRITE)) return -EINVAL; - if (!(s->enable & CM_ENABLE_CH1) && (val = prog_dmabuf(s, 0)) != 0) + if (!(s->enable & ENDAC) && (val = prog_dmabuf(s, 0)) != 0) return val; spin_lock_irqsave(&s->lock, flags); cm_update_ptr(s); @@ -2008,7 +2342,7 @@ case SNDCTL_DSP_GETISPACE: if (!(file->f_mode & FMODE_READ)) return -EINVAL; - if (!(s->enable & CM_ENABLE_CH0) && (val = prog_dmabuf(s, 1)) != 0) + if (!(s->enable & ENADC) && (val = prog_dmabuf(s, 1)) != 0) return val; spin_lock_irqsave(&s->lock, flags); cm_update_ptr(s); @@ -2155,6 +2489,11 @@ if (file->f_mode & FMODE_READ) { stop_adc(s); s->dma_adc.ready = 0; + if (val & DSP_BIND_SPDIF) { + set_spdifin(s, s->rateadc); + if (!(s->status & DO_SPDIF_OUT)) + val &= ~DSP_BIND_SPDIF; + } } if (file->f_mode & FMODE_WRITE) { stop_dac(s); @@ -2194,7 +2533,51 @@ case SNDCTL_DSP_MAPOUTBUF: case SNDCTL_DSP_SETSYNCRO: return -EINVAL; - + case SNDCTL_SPDIF_COPYRIGHT: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdif_copyright(s, val); + return 0; + case SNDCTL_SPDIF_LOOP: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdif_loop(s, val); + return 0; + case SNDCTL_SPDIF_MONITOR: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdif_monitor(s, val); + return 0; + case SNDCTL_SPDIF_LEVEL: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdifout_level(s, val); + return 0; + case SNDCTL_SPDIF_INV: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdifin_inverse(s, val); + return 0; + case SNDCTL_SPDIF_SEL2: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdifin_channel2(s, val); + return 0; + case SNDCTL_SPDIF_VALID: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdifin_valid(s, val); + return 0; + case SNDCTL_SPDIFOUT: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdifout(s, val ? s->ratedac : 0); + return 0; + case SNDCTL_SPDIFIN: + if (get_user(val, (int *)arg)) + return -EFAULT; + set_spdifin(s, val ? s->rateadc : 0); + return 0; } return mixer_ioctl(s, cmd, arg); } @@ -2202,13 +2585,18 @@ static int cm_open(struct inode *inode, struct file *file) { int minor = MINOR(inode->i_rdev); - struct cm_state *s = devs; + DECLARE_WAITQUEUE(wait, current); unsigned char fmtm = ~0, fmts = 0; + struct list_head *list; + struct cm_state *s; - while (s && ((s->dev_audio ^ minor) & ~0xf)) - s = s->next; - if (!s) - return -ENODEV; + for (list = devs.next; ; list = list->next) { + if (list == &devs) + return -ENODEV; + s = list_entry(list, struct cm_state, devs); + if (!((s->dev_audio ^ minor) & ~0xf)) + break; + } VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ @@ -2218,8 +2606,12 @@ up(&s->open_sem); return -EBUSY; } + add_wait_queue(&s->open_wait, &wait); + __set_current_state(TASK_INTERRUPTIBLE); up(&s->open_sem); - interruptible_sleep_on(&s->open_wait); + schedule(); + remove_wait_queue(&s->open_wait, &wait); + set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; down(&s->open_sem); @@ -2230,6 +2622,8 @@ fmts |= CM_CFMT_16BIT << CM_CFMT_ADCSHIFT; s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = s->dma_adc.subdivision = 0; set_adc_rate(s, 8000); + // spdif-in is turnned off by default + set_spdifin(s, 0); } if (file->f_mode & FMODE_WRITE) { fmtm &= ~((CM_CFMT_STEREO | CM_CFMT_16BIT) << CM_CFMT_DACSHIFT); @@ -2321,6 +2715,8 @@ cnt = MIDIINBUF - ptr; if (s->midi.icnt < cnt) cnt = s->midi.icnt; + if (cnt <= 0) + __set_current_state(TASK_INTERRUPTIBLE); spin_unlock_irqrestore(&s->lock, flags); if (cnt > count) cnt = count; @@ -2331,7 +2727,6 @@ ret = -EAGAIN; break; } - __set_current_state(TASK_INTERRUPTIBLE); schedule(); if (signal_pending(current)) { @@ -2386,8 +2781,10 @@ cnt = MIDIOUTBUF - ptr; if (s->midi.ocnt + cnt > MIDIOUTBUF) cnt = MIDIOUTBUF - s->midi.ocnt; - if (cnt <= 0) + if (cnt <= 0) { + __set_current_state(TASK_INTERRUPTIBLE); cm_handle_midi(s); + } spin_unlock_irqrestore(&s->lock, flags); if (cnt > count) cnt = count; @@ -2398,7 +2795,6 @@ ret = -EAGAIN; break; } - __set_current_state(TASK_INTERRUPTIBLE); schedule(); if (signal_pending(current)) { if (!ret) @@ -2457,13 +2853,18 @@ static int cm_midi_open(struct inode *inode, struct file *file) { int minor = MINOR(inode->i_rdev); - struct cm_state *s = devs; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; + struct list_head *list; + struct cm_state *s; - while (s && s->dev_midi != minor) - s = s->next; - if (!s) - return -ENODEV; + for (list = devs.next; ; list = list->next) { + if (list == &devs) + return -ENODEV; + s = list_entry(list, struct cm_state, devs); + if (s->dev_midi == minor) + break; + } VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ @@ -2473,8 +2874,12 @@ up(&s->open_sem); return -EBUSY; } + add_wait_queue(&s->open_wait, &wait); + __set_current_state(TASK_INTERRUPTIBLE); up(&s->open_sem); - interruptible_sleep_on(&s->open_wait); + schedule(); + remove_wait_queue(&s->open_wait, &wait); + set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; down(&s->open_sem); @@ -2484,7 +2889,7 @@ s->midi.ird = s->midi.iwr = s->midi.icnt = 0; s->midi.ord = s->midi.owr = s->midi.ocnt = 0; /* enable MPU-401 */ - maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 4); + maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, UART_EN); outb(0xff, s->iomidi+1); /* reset command */ if (!(inb(s->iomidi+1) & 0x80)) inb(s->iomidi); @@ -2554,7 +2959,7 @@ if (!(inb(s->iomidi+1) & 0x80)) inb(s->iomidi); /* disable MPU-401 */ - maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~4, 0); + maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~UART_EN, 0); } spin_unlock_irqrestore(&s->lock, flags); up(&s->open_sem); @@ -2675,12 +3080,17 @@ static int cm_dmfm_open(struct inode *inode, struct file *file) { int minor = MINOR(inode->i_rdev); - struct cm_state *s = devs; + DECLARE_WAITQUEUE(wait, current); + struct list_head *list; + struct cm_state *s; - while (s && s->dev_dmfm != minor) - s = s->next; - if (!s) - return -ENODEV; + for (list = devs.next; ; list = list->next) { + if (list == &devs) + return -ENODEV; + s = list_entry(list, struct cm_state, devs); + if (s->dev_dmfm == minor) + break; + } VALIDATE_STATE(s); file->private_data = s; /* wait for device to become free */ @@ -2690,8 +3100,12 @@ up(&s->open_sem); return -EBUSY; } + add_wait_queue(&s->open_wait, &wait); + __set_current_state(TASK_INTERRUPTIBLE); up(&s->open_sem); - interruptible_sleep_on(&s->open_wait); + schedule(); + remove_wait_queue(&s->open_wait, &wait); + set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; down(&s->open_sem); @@ -2836,11 +3250,17 @@ #else static int use_line_as_bass; #endif +#ifdef CONFIG_SOUND_CMPCI_MIC_BASS +static int use_mic_as_bass = 1; +#else +static int use_mic_as_bass = 0; +#endif #ifdef CONFIG_SOUND_CMPCI_JOYSTICK static int joystick = 1; #else static int joystick; #endif +static int mic_boost = 0; MODULE_PARM(mpuio, "i"); MODULE_PARM(fmio, "i"); MODULE_PARM(spdif_inverse, "i"); @@ -2848,7 +3268,9 @@ MODULE_PARM(speakers, "i"); MODULE_PARM(use_line_as_rear, "i"); MODULE_PARM(use_line_as_bass, "i"); +MODULE_PARM(use_mic_as_bass, "i"); MODULE_PARM(joystick, "i"); +MODULE_PARM(mic_boost, "i"); MODULE_PARM_DESC(mpuio, "(0x330, 0x320, 0x310, 0x300) Base of MPU-401, 0 to disable"); MODULE_PARM_DESC(fmio, "(0x388, 0x3C8, 0x3E0) Base of OPL3, 0 to disable"); MODULE_PARM_DESC(spdif_inverse, "(1/0) Invert S/PDIF-in signal"); @@ -2856,24 +3278,15 @@ MODULE_PARM_DESC(speakers, "(2-6) Number of speakers you connect"); MODULE_PARM_DESC(use_line_as_rear, "(1/0) Use line-in jack as rear-out"); MODULE_PARM_DESC(use_line_as_bass, "(1/0) Use line-in jack as bass/center"); +MODULE_PARM_DESC(use_mic_as_bass, "(1/0) Use mic-in jack as bass/center"); MODULE_PARM_DESC(joystick, "(1/0) Enable joystick interface, still need joystick driver"); +MODULE_PARM_DESC(mic_boost, "(1/0) Enable microphone boost"); -static struct pci_device_id cmpci_pci_tbl[] = { - { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, - { 0 } -}; -MODULE_DEVICE_TABLE(pci, cmpci_pci_tbl); - -void initialize_chip(struct pci_dev *pcidev) +static int __devinit cm_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid) { struct cm_state *s; mm_segment_t fs; - int i, val; + int i, val, ret; unsigned char reg_mask = 0; struct { unsigned short deviceid; @@ -2886,277 +3299,276 @@ { PCI_DEVICE_ID_CMEDIA_CM8738B, "CM8738B" }, }; char *devicename = "unknown"; - { - if (pci_enable_device(pcidev)) - return; - if (pcidev->irq == 0) - return; - s = kmalloc(sizeof(*s), GFP_KERNEL); - if (!s) { - printk(KERN_WARNING "cmpci: out of memory\n"); - return; - } - /* search device name */ - for (i = 0; i < sizeof(devicetable) / sizeof(devicetable[0]); i++) { - if (devicetable[i].deviceid == pcidev->device) - { - devicename = devicetable[i].devicename; - break; - } - } - memset(s, 0, sizeof(struct cm_state)); - init_waitqueue_head(&s->dma_adc.wait); - init_waitqueue_head(&s->dma_dac.wait); - init_waitqueue_head(&s->open_wait); - init_waitqueue_head(&s->midi.iwait); - init_waitqueue_head(&s->midi.owait); - init_MUTEX(&s->open_sem); - spin_lock_init(&s->lock); - s->magic = CM_MAGIC; - s->iobase = pci_resource_start(pcidev, 0); - s->iosynth = fmio; - s->iomidi = mpuio; - s->status = 0; - /* range check */ - if (speakers < 2) - speakers = 2; - else if (speakers > 6) - speakers = 6; - s->speakers = speakers; - if (s->iobase == 0) - return; - s->irq = pcidev->irq; - - if (!request_region(s->iobase, CM_EXTENT_CODEC, "cmpci")) { - printk(KERN_ERR "cmpci: io ports %#x-%#x in use\n", s->iobase, s->iobase+CM_EXTENT_CODEC-1); - goto err_region5; + if ((ret = pci_enable_device(pcidev))) + return ret; + if (pcidev->irq == 0) + return -ENODEV; + s = kmalloc(sizeof(*s), GFP_KERNEL); + if (!s) { + printk(KERN_WARNING "cmpci: out of memory\n"); + return -ENOMEM; + } + /* search device name */ + for (i = 0; i < sizeof(devicetable) / sizeof(devicetable[0]); i++) { + if (devicetable[i].deviceid == pcidev->device) + { + devicename = devicetable[i].devicename; + break; } + } + memset(s, 0, sizeof(struct cm_state)); + init_waitqueue_head(&s->dma_adc.wait); + init_waitqueue_head(&s->dma_dac.wait); + init_waitqueue_head(&s->open_wait); + init_waitqueue_head(&s->midi.iwait); + init_waitqueue_head(&s->midi.owait); + init_MUTEX(&s->open_sem); + spin_lock_init(&s->lock); + s->magic = CM_MAGIC; + s->iobase = pci_resource_start(pcidev, 0); +#ifdef CONFIG_IA64 + /* The IA64 quirk handler didn't fix us up */ + if (s->iobase == 0xff00) + { + kfree(s); + return -ENODEV; + } +#endif + s->iosynth = fmio; + s->iomidi = mpuio; + s->gameport.io = 0x200; + s->status = 0; + /* range check */ + if (speakers < 2) + speakers = 2; + else if (speakers > 6) + speakers = 6; + s->speakers = speakers; + if (s->iobase == 0) + { + kfree(s); + return -ENODEV; + } + s->irq = pcidev->irq; + + if (!request_region(s->iobase, CM_EXTENT_CODEC, "cmpci")) { + printk(KERN_ERR "cmpci: io ports %#x-%#x in use\n", s->iobase, s->iobase+CM_EXTENT_CODEC-1); + goto err_region5; + } #ifdef CONFIG_SOUND_CMPCI_MIDI - /* disable MPU-401 */ - maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x04, 0); - if (s->iomidi) { - if (!request_region(s->iomidi, CM_EXTENT_MIDI, "cmpci Midi")) { - printk(KERN_ERR "cmpci: io ports %#x-%#x in use\n", s->iomidi, s->iomidi+CM_EXTENT_MIDI-1); + /* disable MPU-401 */ + maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x04, 0); + if (s->iomidi) { + if (!request_region(s->iomidi, CM_EXTENT_MIDI, "cmpci Midi")) { + printk(KERN_ERR "cmpci: io ports %#x-%#x in use\n", s->iomidi, s->iomidi+CM_EXTENT_MIDI-1); + s->iomidi = 0; + } else { + /* set IO based at 0x330 */ + switch (s->iomidi) { + case 0x330: + reg_mask = 0; + break; + case 0x320: + reg_mask = 0x20; + break; + case 0x310: + reg_mask = 0x40; + break; + case 0x300: + reg_mask = 0x60; + break; + default: s->iomidi = 0; - } else { - /* set IO based at 0x330 */ - switch (s->iomidi) { - case 0x330: - reg_mask = 0; - break; - case 0x320: - reg_mask = 0x20; - break; - case 0x310: - reg_mask = 0x40; - break; - case 0x300: - reg_mask = 0x60; - break; - default: - s->iomidi = 0; - break; - } - outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60) | reg_mask, s->iobase + CODEC_CMI_LEGACY_CTRL + 3); - /* enable MPU-401 */ - if (s->iomidi) { - maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 0x04); - } - } + break; } + outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60) | reg_mask, s->iobase + CODEC_CMI_LEGACY_CTRL + 3); + /* enable MPU-401 */ + if (s->iomidi) { + maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 0x04); + } + } + } #endif #ifdef CONFIG_SOUND_CMPCI_FM - /* disable FM */ - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~8, 0); - if (s->iosynth) { - if (!request_region(s->iosynth, CM_EXTENT_SYNTH, "cmpci FM")) { - printk(KERN_ERR "cmpci: io ports %#x-%#x in use\n", s->iosynth, s->iosynth+CM_EXTENT_SYNTH-1); + /* disable FM */ + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~8, 0); + if (s->iosynth) { + if (!request_region(s->iosynth, CM_EXTENT_SYNTH, "cmpci FM")) { + printk(KERN_ERR "cmpci: io ports %#x-%#x in use\n", s->iosynth, s->iosynth+CM_EXTENT_SYNTH-1); + s->iosynth = 0; + } else { + /* set IO based at 0x388 */ + switch (s->iosynth) { + case 0x388: + reg_mask = 0; + break; + case 0x3C8: + reg_mask = 0x01; + break; + case 0x3E0: + reg_mask = 0x02; + break; + case 0x3E8: + reg_mask = 0x03; + break; + default: s->iosynth = 0; - } else { - /* set IO based at 0x388 */ - switch (s->iosynth) { - case 0x388: - reg_mask = 0; - break; - case 0x3C8: - reg_mask = 0x01; - break; - case 0x3E0: - reg_mask = 0x02; - break; - case 0x3E8: - reg_mask = 0x03; - break; - default: - s->iosynth = 0; - break; - } - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~0x03, reg_mask); - /* enable FM */ - if (s->iosynth) { - maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, 8); - } - } + break; } + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3, ~0x03, reg_mask); + /* enable FM */ + if (s->iosynth) { + maskb(s->iobase + CODEC_CMI_MISC_CTRL + 2, ~0, 8); + } + } + } #endif - /* enable joystick */ - if (joystick) + /* enable joystick */ + if (joystick) { + if (s->gameport.io && !request_region(s->gameport.io, CM_EXTENT_GAME, "cmpci GAME")) { + printk(KERN_ERR "cmpci: gameport io ports in use\n"); + s->gameport.io = 0; + } else maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 0x02); - else - maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x02, 0); - /* initialize codec registers */ - outb(0, s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* disable ints */ - outb(0, s->iobase + CODEC_CMI_FUNCTRL0 + 2); /* disable channels */ - /* reset mixer */ - wrmixer(s, DSP_MIX_DATARESETIDX, 0); - - /* request irq */ - if (request_irq(s->irq, cm_interrupt, SA_SHIRQ, "cmpci", s)) { - printk(KERN_ERR "cmpci: irq %u in use\n", s->irq); - goto err_irq; - } - printk(KERN_INFO "cmpci: found %s adapter at io %#06x irq %u\n", - devicename, s->iobase, s->irq); - /* register devices */ - if ((s->dev_audio = register_sound_dsp(&cm_audio_fops, -1)) < 0) - goto err_dev1; - if ((s->dev_mixer = register_sound_mixer(&cm_mixer_fops, -1)) < 0) - goto err_dev2; + } else { + maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x02, 0); + s->gameport.io = 0; + } + /* initialize codec registers */ + outb(0, s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* disable ints */ + outb(0, s->iobase + CODEC_CMI_FUNCTRL0 + 2); /* disable channels */ + /* reset mixer */ + wrmixer(s, DSP_MIX_DATARESETIDX, 0); + + /* request irq */ + if (request_irq(s->irq, cm_interrupt, SA_SHIRQ, "cmpci", s)) { + printk(KERN_ERR "cmpci: irq %u in use\n", s->irq); + goto err_irq; + } + printk(KERN_INFO "cmpci: found %s adapter at io %#x irq %u\n", + devicename, s->iobase, s->irq); + /* register devices */ + if ((s->dev_audio = register_sound_dsp(&cm_audio_fops, -1)) < 0) { + ret = s->dev_audio; + goto err_dev1; + } + if ((s->dev_mixer = register_sound_mixer(&cm_mixer_fops, -1)) < 0) { + ret = s->dev_mixer; + goto err_dev2; + } #ifdef CONFIG_SOUND_CMPCI_MIDI - if ((s->dev_midi = register_sound_midi(&cm_midi_fops, -1)) < 0) - goto err_dev3; + if ((s->dev_midi = register_sound_midi(&cm_midi_fops, -1)) < 0) { + ret = s->dev_midi; + goto err_dev3; + } #endif #ifdef CONFIG_SOUND_CMPCI_FM - if ((s->dev_dmfm = register_sound_special(&cm_dmfm_fops, 15 /* ?? */)) < 0) - goto err_dev4; -#endif - pci_set_master(pcidev); /* enable bus mastering */ - /* initialize the chips */ - fs = get_fs(); - set_fs(KERNEL_DS); - /* set mixer output */ - frobindir(s, DSP_MIX_OUTMIXIDX, 0x1f, 0x1f); - /* set mixer input */ - val = SOUND_MASK_LINE|SOUND_MASK_SYNTH|SOUND_MASK_CD|SOUND_MASK_MIC; - mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long)&val); - for (i = 0; i < sizeof(initvol)/sizeof(initvol[0]); i++) { - val = initvol[i].vol; - mixer_ioctl(s, initvol[i].mixch, (unsigned long)&val); - } - /* use channel 0 for record, channel 1 for play */ - maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~2, 1); - s->deviceid = pcidev->device; - - if (pcidev->device == PCI_DEVICE_ID_CMEDIA_CM8738) { - - /* chip version and hw capability check */ - s->chip_version = query_chip(s); - printk(KERN_INFO "cmpci: chip version = 0%d\n", s->chip_version); - - /* seet SPDIF-in inverse before enable SPDIF loop */ - if (spdif_inverse) { - /* turn on spdif-in inverse */ - maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~0, 1); - printk(KERN_INFO "cmpci: Inverse SPDIF-in\n"); - } else { - /* turn off spdif-ininverse */ - maskb(s->iobase + CODEC_CMI_CHFORMAT + 2, ~1, 0); - } - - /* enable SPDIF loop */ - if (spdif_loop) { - s->status |= DO_SPDIF_LOOP; - /* turn on spdif-in to spdif-out */ - maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0, 0x80); - printk(KERN_INFO "cmpci: Enable SPDIF loop\n"); - } else { - s->status &= ~DO_SPDIF_LOOP; - /* turn off spdif-in to spdif-out */ - maskb(s->iobase + CODEC_CMI_FUNCTRL1, ~0x80, 0); - } - if (use_line_as_rear) { - s->capability |= CAN_LINE_AS_REAR; - s->status |= DO_LINE_AS_REAR; - maskb(s->iobase + CODEC_CMI_MIXER1, ~0, 0x20); + if ((s->dev_dmfm = register_sound_special(&cm_dmfm_fops, 15 /* ?? */)) < 0) { + ret = s->dev_dmfm; + goto err_dev4; + } +#endif + pci_set_master(pcidev); /* enable bus mastering */ + /* initialize the chips */ + fs = get_fs(); + set_fs(KERNEL_DS); + /* set mixer output */ + frobindir(s, DSP_MIX_OUTMIXIDX, 0x1f, 0x1f); + /* set mixer input */ + val = SOUND_MASK_LINE|SOUND_MASK_SYNTH|SOUND_MASK_CD|SOUND_MASK_MIC; + mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long)&val); + for (i = 0; i < sizeof(initvol)/sizeof(initvol[0]); i++) { + val = initvol[i].vol; + mixer_ioctl(s, initvol[i].mixch, (unsigned long)&val); + } + /* use channel 1 for record, channel 0 for play */ + maskb(s->iobase + CODEC_CMI_FUNCTRL0, ~0, CHADC1); + /* turn off VMIC3 - mic boost */ + if (mic_boost) + maskb(s->iobase + CODEC_CMI_MIXER2, ~1, 0); + else + maskb(s->iobase + CODEC_CMI_MIXER2, ~0, 1); + s->deviceid = pcidev->device; + + if (pcidev->device == PCI_DEVICE_ID_CMEDIA_CM8738) { + + /* chip version and hw capability check */ + s->chip_version = query_chip(s); + printk(KERN_INFO "cmpci: chip version = 0%d\n", s->chip_version); + + /* seet SPDIF-in inverse before enable SPDIF loop */ + set_spdifin_inverse(s, spdif_inverse); + + /* enable SPDIF loop */ + set_spdif_loop(s, spdif_loop); + + /* use SPDIF in #1 */ + set_spdifin_channel2(s, 0); + + if (use_line_as_rear) { + s->capability |= CAN_LINE_AS_REAR; + s->status |= DO_LINE_AS_REAR; + maskb(s->iobase + CODEC_CMI_MIXER1, ~0, SPK4); + } else + maskb(s->iobase + CODEC_CMI_MIXER1, ~SPK4, 0); + if (s->chip_version >= 39) { + if (use_line_as_bass) { + s->capability |= CAN_LINE_AS_BASS; + s->status |= DO_LINE_AS_BASS; + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~0, CB2LIN); } else - maskb(s->iobase + CODEC_CMI_MIXER1, ~0x20, 0); - if (s->chip_version >= 39) { - if (use_line_as_bass) { - s->capability |= CAN_LINE_AS_BASS; - s->status |= DO_LINE_AS_BASS; - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~0, 0x60); - } else - maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~0x60, 0); - } - } else { - /* 8338 will fall here */ - s->max_channels = 2; + maskb(s->iobase + CODEC_CMI_LEGACY_CTRL + 1, ~CB2LIN, 0); + if (use_mic_as_bass) { + s->capability |= CAN_MIC_AS_BASS; + s->status |= DO_MIC_AS_BASS; + maskb(s->iobase + CODEC_CMI_MISC, ~0, 0x04); + } else + maskb(s->iobase + CODEC_CMI_MISC, ~0x04, 0); } - /* queue it for later freeing */ - s->next = devs; - devs = s; - return; + } else { + s->chip_version = 0; + /* 8338 will fall here */ + s->max_channels = 2; + } + /* register gameport */ + if (joystick) + gameport_register_port(&s->gameport); + /* store it in the driver field */ + pci_set_drvdata(pcidev, s); + /* put it into driver list */ + list_add_tail(&s->devs, &devs); + /* increment devindex */ + if (devindex < NR_DEVICE-1) + devindex++; + return 0; #ifdef CONFIG_SOUND_CMPCI_FM - unregister_sound_special(s->dev_dmfm); - err_dev4: + unregister_sound_special(s->dev_dmfm); +err_dev4: #endif #ifdef CONFIG_SOUND_CMPCI_MIDI - unregister_sound_midi(s->dev_midi); - err_dev3: + unregister_sound_midi(s->dev_midi); +err_dev3: #endif - unregister_sound_mixer(s->dev_mixer); - err_dev2: - unregister_sound_dsp(s->dev_audio); - err_dev1: - printk(KERN_ERR "cmpci: cannot register misc device\n"); - free_irq(s->irq, s); - err_irq: + unregister_sound_mixer(s->dev_mixer); +err_dev2: + unregister_sound_dsp(s->dev_audio); +err_dev1: + printk(KERN_ERR "cmpci: cannot register misc device\n"); + free_irq(s->irq, s); +err_irq: + if (s->gameport.io) + release_region(s->gameport.io, CM_EXTENT_GAME); #ifdef CONFIG_SOUND_CMPCI_FM - if (s->iosynth) release_region(s->iosynth, CM_EXTENT_SYNTH); + if (s->iosynth) release_region(s->iosynth, CM_EXTENT_SYNTH); #endif #ifdef CONFIG_SOUND_CMPCI_MIDI - if (s->iomidi) release_region(s->iomidi, CM_EXTENT_MIDI); + if (s->iomidi) release_region(s->iomidi, CM_EXTENT_MIDI); #endif - release_region(s->iobase, CM_EXTENT_CODEC); - err_region5: - kfree(s); - } - if (!devs) { - if (wavetable_mem) - free_pages(wavetable_mem, 20-PAGE_SHIFT); - return; - } - return; -} - -static int __init init_cmpci(void) -{ - struct pci_dev *pcidev = NULL; - int index = 0; - -#ifdef CONFIG_PCI - if (!pci_present()) /* No PCI bus in this machine! */ -#endif - return -ENODEV; - printk(KERN_INFO "cmpci: version $Revision: 5.64 $ time " __TIME__ " " __DATE__ "\n"); - - while (index < NR_DEVICE && ( - (pcidev = pci_find_device(PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, pcidev)))) { - initialize_chip(pcidev); - index++; - } - while (index < NR_DEVICE && ( - (pcidev = pci_find_device(PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, pcidev)))) { - initialize_chip(pcidev); - index++; - } - while (index < NR_DEVICE && ( - (pcidev = pci_find_device(PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, pcidev)))) { - initialize_chip(pcidev); - index++; - } - return 0; + release_region(s->iobase, CM_EXTENT_CODEC); +err_region5: + kfree(s); + return ret; } /* --------------------------------------------------------------------- */ @@ -3165,42 +3577,74 @@ MODULE_DESCRIPTION("CM8x38 Audio Driver"); MODULE_LICENSE("GPL"); - -static void __exit cleanup_cmpci(void) +static void __devinit cm_remove(struct pci_dev *dev) { - struct cm_state *s; - - while ((s = devs)) { - devs = devs->next; - outb(0, s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* disable ints */ - synchronize_irq(); - outb(0, s->iobase + CODEC_CMI_FUNCTRL0 + 2); /* disable channels */ - free_irq(s->irq, s); + struct cm_state *s = pci_get_drvdata(dev); - /* reset mixer */ - wrmixer(s, DSP_MIX_DATARESETIDX, 0); - - release_region(s->iobase, CM_EXTENT_CODEC); + if (!s) + return; + list_del(&s->devs); + outb(0, s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* disable ints */ + synchronize_irq(); + outb(0, s->iobase + CODEC_CMI_FUNCTRL0 + 2); /* disable channels */ + free_irq(s->irq, s); + + /* reset mixer */ + wrmixer(s, DSP_MIX_DATARESETIDX, 0); + + if (s->gameport.io) { + gameport_unregister_port(&s->gameport); + release_region(s->gameport.io, CM_EXTENT_GAME); + } + release_region(s->iobase, CM_EXTENT_CODEC); #ifdef CONFIG_SOUND_CMPCI_MIDI - if (s->iomidi) release_region(s->iomidi, CM_EXTENT_MIDI); + if (s->iomidi) release_region(s->iomidi, CM_EXTENT_MIDI); #endif #ifdef CONFIG_SOUND_CMPCI_FM - if (s->iosynth) release_region(s->iosynth, CM_EXTENT_SYNTH); + if (s->iosynth) release_region(s->iosynth, CM_EXTENT_SYNTH); #endif - unregister_sound_dsp(s->dev_audio); - unregister_sound_mixer(s->dev_mixer); + unregister_sound_dsp(s->dev_audio); + unregister_sound_mixer(s->dev_mixer); #ifdef CONFIG_SOUND_CMPCI_MIDI - unregister_sound_midi(s->dev_midi); + unregister_sound_midi(s->dev_midi); #endif #ifdef CONFIG_SOUND_CMPCI_FM - unregister_sound_special(s->dev_dmfm); + unregister_sound_special(s->dev_dmfm); #endif - kfree(s); - } - if (wavetable_mem) - free_pages(wavetable_mem, 20-PAGE_SHIFT); + kfree(s); + pci_set_drvdata(dev, NULL); +} + +static struct pci_device_id id_table[] __devinitdata = { + { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, + { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, + { PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, PCI_ANY_ID, PCI_ANY_ID, 0, 0 }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, id_table); + +static struct pci_driver cm_driver = { + name: "cmpci", + id_table: id_table, + probe: cm_probe, + remove: cm_remove +}; + +static int __init init_cmpci(void) +{ + if (!pci_present()) /* No PCI bus in this machine! */ + return -ENODEV; + printk(KERN_INFO "cmpci: version $Revision: 6.16 $ time " __TIME__ " " __DATE__ "\n"); + return pci_module_init(&cm_driver); +} + +static void __exit cleanup_cmpci(void) +{ printk(KERN_INFO "cmpci: unloading\n"); + pci_unregister_driver(&cm_driver); } module_init(init_cmpci); module_exit(cleanup_cmpci); + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/dmasound/dmasound_core.c linux-2.4.23-pre8/drivers/sound/dmasound/dmasound_core.c --- linux-2.4.22/drivers/sound/dmasound/dmasound_core.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/dmasound/dmasound_core.c 2003-10-22 22:47:51.000000000 +0000 @@ -374,7 +374,7 @@ release: mixer_release, }; -static void __init mixer_init(void) +static void mixer_init(void) { #ifndef MODULE int mixer_unit; @@ -1211,6 +1211,8 @@ shared_resources_initialised = 0 ; return result ; break ; + case SOUND_PCM_READ_RATE: + return IOCTL_OUT(arg, dmasound.soft.speed); case SNDCTL_DSP_SPEED: /* Changing this on the fly will have weird effects on the sound. Where there are rate conversions implemented in soft form - it @@ -1337,7 +1339,7 @@ #endif }; -static int __init sq_init(void) +static int sq_init(void) { #ifndef MODULE int sq_unit; @@ -1554,7 +1556,7 @@ release: state_release, }; -static int __init state_init(void) +static int state_init(void) { #ifndef MODULE int state_unit; @@ -1573,7 +1575,7 @@ * This function is called by _one_ chipset-specific driver */ -int __init dmasound_init(void) +int dmasound_init(void) { int res ; #ifdef MODULE @@ -1644,7 +1646,7 @@ #else /* !MODULE */ -static int __init dmasound_setup(char *str) +static int dmasound_setup(char *str) { int ints[6], size; @@ -1660,13 +1662,13 @@ #ifdef HAS_RECORD case 5: if ((ints[5] < 0) || (ints[5] > MAX_CATCH_RADIUS)) - printk("dmasound_setup: illegal catch radius, using default = %d\n", catchRadius); + printk("dmasound_setup: invalid catch radius, using default = %d\n", catchRadius); else catchRadius = ints[5]; /* fall through */ case 4: if (ints[4] < MIN_BUFFERS) - printk("dmasound_setup: illegal number of read buffers, using default = %d\n", + printk("dmasound_setup: invalid number of read buffers, using default = %d\n", numReadBufs); else numReadBufs = ints[4]; @@ -1675,21 +1677,21 @@ if ((size = ints[3]) < 256) /* check for small buffer specs */ size <<= 10 ; if (size < MIN_BUFSIZE || size > MAX_BUFSIZE) - printk("dmasound_setup: illegal read buffer size, using default = %d\n", readBufSize); + printk("dmasound_setup: invalid read buffer size, using default = %d\n", readBufSize); else readBufSize = size; /* fall through */ #else case 3: if ((ints[3] < 0) || (ints[3] > MAX_CATCH_RADIUS)) - printk("dmasound_setup: illegal catch radius, using default = %d\n", catchRadius); + printk("dmasound_setup: invalid catch radius, using default = %d\n", catchRadius); else catchRadius = ints[3]; /* fall through */ #endif case 2: if (ints[1] < MIN_BUFFERS) - printk("dmasound_setup: illegal number of buffers, using default = %d\n", numWriteBufs); + printk("dmasound_setup: invalid number of buffers, using default = %d\n", numWriteBufs); else numWriteBufs = ints[1]; /* fall through */ @@ -1697,13 +1699,13 @@ if ((size = ints[2]) < 256) /* check for small buffer specs */ size <<= 10 ; if (size < MIN_BUFSIZE || size > MAX_BUFSIZE) - printk("dmasound_setup: illegal write buffer size, using default = %d\n", writeBufSize); + printk("dmasound_setup: invalid write buffer size, using default = %d\n", writeBufSize); else writeBufSize = size; case 0: break; default: - printk("dmasound_setup: illegal number of arguments\n"); + printk("dmasound_setup: invalid number of arguments\n"); return 0; } return 1; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/forte.c linux-2.4.23-pre8/drivers/sound/forte.c --- linux-2.4.22/drivers/sound/forte.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/forte.c 2003-10-22 22:48:39.000000000 +0000 @@ -50,7 +50,7 @@ #include #define DRIVER_NAME "forte" -#define DRIVER_VERSION "$Id: forte.c,v 1.63 2003/03/01 05:32:42 mkp Exp $" +#define DRIVER_VERSION "$Id: forte.c,v 1.65 2003/09/18 15:28:39 mkp Exp $" #define PFX DRIVER_NAME ": " #undef M_DEBUG @@ -157,7 +157,6 @@ void *buf; /* Buffer */ dma_addr_t buf_handle; /* Buffer handle */ - unsigned int record; unsigned int format; unsigned int rate; unsigned int stereo; @@ -367,11 +366,11 @@ static struct file_operations forte_mixer_fops = { - owner: THIS_MODULE, - llseek: no_llseek, - ioctl: forte_mixer_ioctl, - open: forte_mixer_open, - release: forte_mixer_release, + .owner = THIS_MODULE, + .llseek = no_llseek, + .ioctl = forte_mixer_ioctl, + .open = forte_mixer_open, + .release = forte_mixer_release, }; @@ -665,14 +664,14 @@ * Locking: Lock held. */ -static void +static int forte_channel_prep (struct forte_channel *channel) { struct page *page; int i; if (channel->buf) - return; + return 0; forte_channel_buffer (channel, channel->frag_sz, channel->frag_num); channel->buf_pages = channel->buf_sz >> PAGE_SHIFT; @@ -690,7 +689,7 @@ &channel->buf_handle); if (!channel->buf || !channel->buf_handle) - BUG(); + return -ENOMEM; page = virt_to_page (channel->buf); @@ -709,6 +708,8 @@ DPRINTK ("%s: %s buffer @ %p (%p)\n", __FUNCTION__, channel->name, channel->buf, channel->buf_handle); + + return 0; } @@ -789,7 +790,6 @@ else if (channel == &chip->rec) { channel->name = "PCM_IN"; channel->iobase = chip->iobase + FORTE_CAP_OFFSET; - channel->record = 1; DPRINTK ("%s: PCM-IN iobase @ %p\n", __FUNCTION__, (void *) channel->iobase); } @@ -800,12 +800,15 @@ /* Defaults: 48kHz, 16-bit, stereo */ channel->ctrl = inw (channel->iobase + FORTE_PLY_CTRL); + + channel->frag_sz = FORTE_DEF_FRAG_SIZE; + channel->frag_num = FORTE_DEF_FRAGMENTS; + channel->frag_msecs = 0; + forte_channel_reset (channel); forte_channel_stereo (channel, 1); forte_channel_format (channel, AFMT_S16_LE); forte_channel_rate (channel, 48000); - channel->frag_sz = FORTE_DEF_FRAG_SIZE; - channel->frag_num = FORTE_DEF_FRAGMENTS; chip->trigger = 0; spin_unlock_irq (&chip->lock); @@ -828,6 +831,9 @@ static void forte_channel_free (struct forte_chip *chip, struct forte_channel *channel) { + struct page *page; + int i; + DPRINTK ("%s: %s\n", __FUNCTION__, channel->name); if (!channel->buf_handle) @@ -835,7 +841,12 @@ pci_free_consistent (chip->pci_dev, channel->buf_pages * PAGE_SIZE, channel->buf, channel->buf_handle); - + + page = virt_to_page (channel->buf); + + for (i = 0; i < channel->buf_pages ; i++) + mem_map_unreserve (page++); + memset (channel, 0x0, sizeof (*channel)); } @@ -1071,7 +1082,7 @@ spin_unlock_irq (&chip->lock); - return copy_to_user ((void *) arg, &abi, sizeof (abi)); + return copy_to_user ((void *) arg, &abi, sizeof (abi)) ? -EFAULT : 0; case SNDCTL_DSP_GETIPTR: DPRINTK ("%s: GETIPTR\n", __FUNCTION__); @@ -1092,7 +1103,7 @@ spin_unlock_irq (&chip->lock); - return copy_to_user ((void *) arg, &cinfo, sizeof (cinfo)); + return copy_to_user ((void *) arg, &cinfo, sizeof (cinfo)) ? -EFAULT : 0; case SNDCTL_DSP_GETOSPACE: if (!wr) @@ -1120,7 +1131,7 @@ spin_unlock_irq (&chip->lock); - return copy_to_user ((void *) arg, &abi, sizeof (abi)); + return copy_to_user ((void *) arg, &abi, sizeof (abi)) ? -EFAULT : 0; case SNDCTL_DSP_GETOPTR: if (!wr) @@ -1139,7 +1150,7 @@ spin_unlock_irq (&chip->lock); - return copy_to_user ((void *) arg, &cinfo, sizeof (cinfo)); + return copy_to_user ((void *) arg, &cinfo, sizeof (cinfo)) ? -EFAULT : 0; case SNDCTL_DSP_GETODELAY: if (!wr) @@ -1189,7 +1200,12 @@ forte_channel_start (&chip->play); else { chip->trigger = 1; - forte_channel_prep (&chip->play); + + if (forte_channel_prep (&chip->play)) { + spin_unlock_irq (&chip->lock); + return -ENOMEM; + } + forte_channel_stop (&chip->play); } @@ -1202,7 +1218,12 @@ forte_channel_start (&chip->rec); else { chip->trigger = 1; - forte_channel_prep (&chip->rec); + + if (forte_channel_prep (&chip->rec)) { + spin_unlock_irq (&chip->lock); + return -ENOMEM; + } + forte_channel_stop (&chip->rec); } @@ -1397,7 +1418,11 @@ goto out; } - forte_channel_prep (channel); + if (forte_channel_prep (channel)) { + ret = -ENOMEM; + goto out; + } + channel->mapped = 1; if (vma->vm_pgoff != 0) { @@ -1461,7 +1486,10 @@ spin_lock_irqsave (&chip->lock, flags); /* Set up buffers with the right fragment size */ - forte_channel_prep (channel); + if (forte_channel_prep (channel)) { + spin_unlock_irqrestore (&chip->lock, flags); + return -ENOMEM; + } while (i) { /* All fragment buffers in use -> wait */ @@ -1569,7 +1597,10 @@ spin_lock_irqsave (&chip->lock, flags); /* Set up buffers with the right fragment size */ - forte_channel_prep (channel); + if (forte_channel_prep (channel)) { + spin_unlock_irqrestore (&chip->lock, flags); + return -ENOMEM; + } /* Start recording */ if (!chip->trigger) @@ -1637,15 +1668,15 @@ static struct file_operations forte_dsp_fops = { - owner: THIS_MODULE, - llseek: &no_llseek, - read: &forte_dsp_read, - write: &forte_dsp_write, - poll: &forte_dsp_poll, - ioctl: &forte_dsp_ioctl, - open: &forte_dsp_open, - release: &forte_dsp_release, - mmap: &forte_dsp_mmap, + .owner = THIS_MODULE, + .llseek = &no_llseek, + .read = &forte_dsp_read, + .write = &forte_dsp_write, + .poll = &forte_dsp_poll, + .ioctl = &forte_dsp_ioctl, + .open = &forte_dsp_open, + .release = &forte_dsp_release, + .mmap = &forte_dsp_mmap, }; @@ -2104,11 +2135,10 @@ static struct pci_driver forte_pci_driver = { - name: DRIVER_NAME, - id_table: forte_pci_ids, - probe: forte_probe, - remove: forte_remove, - + .name = DRIVER_NAME, + .id_table = forte_pci_ids, + .probe = forte_probe, + .remove = forte_remove, }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/i810_audio.c linux-2.4.23-pre8/drivers/sound/i810_audio.c --- linux-2.4.22/drivers/sound/i810_audio.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/i810_audio.c 2003-10-22 22:49:15.000000000 +0000 @@ -72,17 +72,16 @@ * * ICH 4 caveats * - * The ICH4 has the feature, that the codec ID doesn't have to be - * congruent with the IO connection. + * The ICH4 has the feature, that the codec ID doesn't have to be + * congruent with the IO connection. * - * Therefore, from driver version 0.23 on, there is a "codec ID" <-> - * "IO register base offset" mapping (card->ac97_id_map) field. + * Therefore, from driver version 0.23 on, there is a "codec ID" <-> + * "IO register base offset" mapping (card->ac97_id_map) field. * - * Juergen "George" Sawinski (jsaw) + * Juergen "George" Sawinski (jsaw) */ #include -#include #include #include #include @@ -92,6 +91,7 @@ #include #include #include +#include #include #include #include @@ -99,7 +99,6 @@ #include #include #include -#include #include #include @@ -143,10 +142,10 @@ #define PCI_DEVICE_ID_AMD_8111_AC97 0x746d #endif -static int ftsodell=0; -static int strict_clocking=0; -static unsigned int clocking=0; -static int spdif_locked=0; +static int ftsodell; +static int strict_clocking; +static unsigned int clocking; +static int spdif_locked; //#define DEBUG //#define DEBUG2 @@ -182,7 +181,7 @@ struct i810_channel { /* these sg guys should probably be allocated - seperately as nocache. Must be 8 byte aligned */ + separately as nocache. Must be 8 byte aligned */ struct sg_item sg[SG_LEN]; /* 32*8 */ u32 offset; /* 4 */ u32 port; /* 4 */ @@ -191,7 +190,7 @@ }; /* - * we have 3 seperate dma engines. pcm in, pcm out, and mic. + * we have 3 separate dma engines. pcm in, pcm out, and mic. * each dma engine has controlling registers. These goofy * names are from the datasheet, but make it easy to write * code while leafing through it. @@ -317,7 +316,7 @@ /*@FIXME to be verified*/ { 3, 0x0001 }, /* AMD8111 */ }; -static struct pci_device_id i810_pci_tbl [] __initdata = { +static struct pci_device_id i810_pci_tbl [] = { {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ICH82801AA}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82901, @@ -880,7 +879,7 @@ #define DMABUF_DEFAULTORDER (16-PAGE_SHIFT) #define DMABUF_MINORDER 1 -/* allocate DMA buffer, playback and recording buffer should be allocated seperately */ +/* allocate DMA buffer, playback and recording buffer should be allocated separately */ static int alloc_dmabuf(struct i810_state *state) { struct dmabuf *dmabuf = &state->dmabuf; @@ -922,7 +921,7 @@ /* now mark the pages as reserved; otherwise remap_page_range doesn't do what we want */ pend = virt_to_page(rawbuf + (PAGE_SIZE << order) - 1); for (page = virt_to_page(rawbuf); page <= pend; page++) - mem_map_reserve(page); + SetPageReserved(page); return 0; } @@ -937,7 +936,7 @@ /* undo marking the pages as reserved */ pend = virt_to_page(dmabuf->rawbuf + (PAGE_SIZE << dmabuf->buforder) - 1); for (page = virt_to_page(dmabuf->rawbuf); page <= pend; page++) - mem_map_unreserve(page); + ClearPageReserved(page); pci_free_consistent(state->card->pci_dev, PAGE_SIZE << dmabuf->buforder, dmabuf->rawbuf, dmabuf->dma_handle); } @@ -1370,7 +1369,7 @@ #endif } -static void i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct i810_card *card = (struct i810_card *)dev_id; u32 status; @@ -1382,7 +1381,7 @@ if(!(status & INT_MASK)) { spin_unlock(&card->lock); - return; /* not for us */ + return IRQ_NONE; /* not for us */ } if(status & (INT_PO|INT_PI|INT_MC)) @@ -1391,6 +1390,7 @@ /* clear 'em */ outl(status & INT_MASK, card->iobase + GLOB_STA); spin_unlock(&card->lock); + return IRQ_HANDLED; } /* in this loop, dmabuf.count signifies the amount of data that is @@ -1800,7 +1800,8 @@ } if (c != NULL) { outb(2, state->card->iobase+c->port+OFF_CR); /* reset DMA machine */ - while ( inb(state->card->iobase+c->port+OFF_CR) & 2 ); + while ( inb(state->card->iobase+c->port+OFF_CR) & 2 ) + cpu_relax(); outl((u32)state->card->chandma + c->num*sizeof(struct i810_channel), state->card->iobase+c->port+OFF_BDBAR); @@ -2386,9 +2387,9 @@ i810_set_dac_channels ( state, channels ); /* check that they really got turned on */ - if ( !state->card->ac97_status & SURR_ON ) + if (!(state->card->ac97_status & SURR_ON)) val &= ~DSP_BIND_SURR; - if ( !state->card->ac97_status & CENTER_LFE_ON ) + if (!(state->card->ac97_status & CENTER_LFE_ON)) val &= ~DSP_BIND_CENTER_LFE; } } @@ -2537,15 +2538,15 @@ } static /*const*/ struct file_operations i810_audio_fops = { - owner: THIS_MODULE, - llseek: no_llseek, - read: i810_read, - write: i810_write, - poll: i810_poll, - ioctl: i810_ioctl, - mmap: i810_mmap, - open: i810_open, - release: i810_release, + .owner = THIS_MODULE, + .llseek = no_llseek, + .read = i810_read, + .write = i810_write, + .poll = i810_poll, + .ioctl = i810_ioctl, + .mmap = i810_mmap, + .open = i810_open, + .release = i810_release, }; /* Write AC97 codec registers */ @@ -2682,10 +2683,10 @@ } static /*const*/ struct file_operations i810_mixer_fops = { - owner: THIS_MODULE, - llseek: no_llseek, - ioctl: i810_ioctl_mixdev, - open: i810_open_mixdev, + .owner = THIS_MODULE, + .llseek = no_llseek, + .ioctl = i810_ioctl_mixdev, + .open = i810_open_mixdev, }; /* AC97 codec initialisation. These small functions exist so we don't @@ -2727,7 +2728,7 @@ i810_ac97_get(codec, AC97_POWER_CONTROL) & ~0x7f00); /* wait for analog ready */ - for (i=10; i && ((i810_ac97_get(codec, AC97_POWER_CONTROL) & 0xf) != 0xf); i--) + for (i=100; i && ((i810_ac97_get(codec, AC97_POWER_CONTROL) & 0xf) != 0xf); i--) { set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ/20); @@ -3250,7 +3251,6 @@ out_pio: release_region(card->iobase, 64); release_region(card->ac97base, 256); -out_chan: pci_free_consistent(pci_dev, sizeof(struct i810_channel)*NR_HW_CH, card->channel, card->chandma); out_mem: @@ -3266,6 +3266,8 @@ free_irq(card->irq, devs); release_region(card->iobase, 64); release_region(card->ac97base, 256); + pci_free_consistent(pci_dev, sizeof(struct i810_channel)*NR_HW_CH, + card->channel, card->chandma); if (card->use_mmio) { iounmap(card->ac97base_mmio); iounmap(card->iobase_mmio); @@ -3421,22 +3423,19 @@ #define I810_MODULE_NAME "intel810_audio" static struct pci_driver i810_pci_driver = { - name: I810_MODULE_NAME, - id_table: i810_pci_tbl, - probe: i810_probe, - remove: __devexit_p(i810_remove), + .name = I810_MODULE_NAME, + .id_table = i810_pci_tbl, + .probe = i810_probe, + .remove = __devexit_p(i810_remove), #ifdef CONFIG_PM - suspend: i810_pm_suspend, - resume: i810_pm_resume, + .suspend = i810_pm_suspend, + .resume = i810_pm_resume, #endif /* CONFIG_PM */ }; static int __init i810_init_module (void) { - if (!pci_present()) /* No PCI bus in this machine! */ - return -ENODEV; - printk(KERN_INFO "Intel 810 + AC97 Audio, version " DRIVER_VERSION ", " __TIME__ " " __DATE__ "\n"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/sound/ymfpci.c linux-2.4.23-pre8/drivers/sound/ymfpci.c --- linux-2.4.22/drivers/sound/ymfpci.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/sound/ymfpci.c 2003-10-22 22:49:06.000000000 +0000 @@ -2474,7 +2474,6 @@ eid = ymfpci_codec_read(codec, AC97_EXTENDED_ID); if (eid==0xFFFF) { printk(KERN_WARNING "ymfpci: no codec attached ?\n"); - goto out_kfree; } unit->ac97_features = eid; @@ -2626,7 +2625,6 @@ out_release_region: release_mem_region(pci_resource_start(pcidev, 0), 0x8000); out_free: - ac97_release_codec(codec->ac97_codec[0]); return -ENODEV; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/Config.in linux-2.4.23-pre8/drivers/usb/Config.in --- linux-2.4.22/drivers/usb/Config.in 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/Config.in 2003-10-22 22:49:40.000000000 +0000 @@ -110,4 +110,7 @@ dep_tristate ' Alcatel Speedtouch USB support' CONFIG_USB_SPEEDTOUCH $CONFIG_ATM $CONFIG_USB fi fi + +source drivers/usb/gadget/Config.in + endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/acm.c linux-2.4.23-pre8/drivers/usb/acm.c --- linux-2.4.22/drivers/usb/acm.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/acm.c 2003-10-22 22:49:07.000000000 +0000 @@ -363,9 +363,10 @@ count = (count > acm->writesize) ? acm->writesize : count; - if (from_user) - copy_from_user(acm->writeurb.transfer_buffer, buf, count); - else + if (from_user) { + if (copy_from_user(acm->writeurb.transfer_buffer, buf, count)) + return -EFAULT; + } else memcpy(acm->writeurb.transfer_buffer, buf, count); acm->writeurb.transfer_buffer_length = count; @@ -512,7 +513,7 @@ struct usb_config_descriptor *cfacm; struct usb_interface_descriptor *ifcom, *ifdata; struct usb_endpoint_descriptor *epctrl, *epread, *epwrite; - int readsize, ctrlsize, minor, i; + int readsize, ctrlsize, minor, i, j; unsigned char *buf; for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { @@ -521,93 +522,98 @@ dbg("probing config %d", cfacm->bConfigurationValue); - if (cfacm->bNumInterfaces != 2 || - usb_interface_claimed(cfacm->interface + 0) || - usb_interface_claimed(cfacm->interface + 1)) - continue; - - ifcom = cfacm->interface[0].altsetting + 0; - ifdata = cfacm->interface[1].altsetting + 0; - - if (ifdata->bInterfaceClass != 10 || ifdata->bNumEndpoints < 2) { - ifcom = cfacm->interface[1].altsetting + 0; - ifdata = cfacm->interface[0].altsetting + 0; - if (ifdata->bInterfaceClass != 10 || ifdata->bNumEndpoints < 2) + for (j = 0; j < cfacm->bNumInterfaces - 1; j++) { + + if (usb_interface_claimed(cfacm->interface + j) || + usb_interface_claimed(cfacm->interface + j + 1)) continue; - } - if (ifcom->bInterfaceClass != 2 || ifcom->bInterfaceSubClass != 2 || - ifcom->bInterfaceProtocol != 1 || ifcom->bNumEndpoints < 1) - continue; - - epctrl = ifcom->endpoint + 0; - epread = ifdata->endpoint + 0; - epwrite = ifdata->endpoint + 1; - - if ((epctrl->bEndpointAddress & 0x80) != 0x80 || (epctrl->bmAttributes & 3) != 3 || - (epread->bmAttributes & 3) != 2 || (epwrite->bmAttributes & 3) != 2 || - ((epread->bEndpointAddress & 0x80) ^ (epwrite->bEndpointAddress & 0x80)) != 0x80) - continue; - - if ((epread->bEndpointAddress & 0x80) != 0x80) { - epread = ifdata->endpoint + 1; - epwrite = ifdata->endpoint + 0; - } + ifcom = cfacm->interface[j].altsetting + 0; + ifdata = cfacm->interface[j + 1].altsetting + 0; - usb_set_configuration(dev, cfacm->bConfigurationValue); + if (ifdata->bInterfaceClass != 10 || ifdata->bNumEndpoints < 2) { + ifcom = cfacm->interface[j + 1].altsetting + 0; + ifdata = cfacm->interface[j].altsetting + 0; + if (ifdata->bInterfaceClass != 10 || ifdata->bNumEndpoints < 2) + continue; + } - for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++); - if (acm_table[minor]) { - err("no more free acm devices"); - return NULL; - } + if (ifcom->bInterfaceClass != 2 || ifcom->bInterfaceSubClass != 2 || + ifcom->bInterfaceProtocol < 1 || ifcom->bInterfaceProtocol > 6 || + ifcom->bNumEndpoints < 1) + continue; - if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) { - err("out of memory"); - return NULL; - } - memset(acm, 0, sizeof(struct acm)); + epctrl = ifcom->endpoint + 0; + epread = ifdata->endpoint + 0; + epwrite = ifdata->endpoint + 1; + + if ((epctrl->bEndpointAddress & 0x80) != 0x80 || (epctrl->bmAttributes & 3) != 3 || + (epread->bmAttributes & 3) != 2 || (epwrite->bmAttributes & 3) != 2 || + ((epread->bEndpointAddress & 0x80) ^ (epwrite->bEndpointAddress & 0x80)) != 0x80) + continue; - ctrlsize = epctrl->wMaxPacketSize; - readsize = epread->wMaxPacketSize; - acm->writesize = epwrite->wMaxPacketSize; - acm->iface = cfacm->interface; - acm->minor = minor; - acm->dev = dev; - - acm->tqueue.routine = acm_softint; - acm->tqueue.data = acm; - - if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize, GFP_KERNEL))) { - err("out of memory"); - kfree(acm); - return NULL; - } + dbg("using interface %d\n", j); + + if ((epread->bEndpointAddress & 0x80) != 0x80) { + epread = ifdata->endpoint + 1; + epwrite = ifdata->endpoint + 0; + } - FILL_INT_URB(&acm->ctrlurb, dev, usb_rcvintpipe(dev, epctrl->bEndpointAddress), - buf, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval); + usb_set_configuration(dev, cfacm->bConfigurationValue); - FILL_BULK_URB(&acm->readurb, dev, usb_rcvbulkpipe(dev, epread->bEndpointAddress), - buf += ctrlsize, readsize, acm_read_bulk, acm); - acm->readurb.transfer_flags |= USB_NO_FSBR; + for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++); + if (acm_table[minor]) { + err("no more free acm devices"); + return NULL; + } - FILL_BULK_URB(&acm->writeurb, dev, usb_sndbulkpipe(dev, epwrite->bEndpointAddress), - buf += readsize, acm->writesize, acm_write_bulk, acm); - acm->writeurb.transfer_flags |= USB_NO_FSBR; + if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) { + err("out of memory"); + return NULL; + } + memset(acm, 0, sizeof(struct acm)); - printk(KERN_INFO "ttyACM%d: USB ACM device\n", minor); + ctrlsize = epctrl->wMaxPacketSize; + readsize = epread->wMaxPacketSize; + acm->writesize = epwrite->wMaxPacketSize; + acm->iface = cfacm->interface + j; + acm->minor = minor; + acm->dev = dev; + + acm->tqueue.routine = acm_softint; + acm->tqueue.data = acm; + + if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize, GFP_KERNEL))) { + err("out of memory"); + kfree(acm); + return NULL; + } - acm_set_control(acm, acm->ctrlout); + FILL_INT_URB(&acm->ctrlurb, dev, usb_rcvintpipe(dev, epctrl->bEndpointAddress), + buf, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval); - acm->line.speed = cpu_to_le32(9600); - acm->line.databits = 8; - acm_set_line(acm, &acm->line); + FILL_BULK_URB(&acm->readurb, dev, usb_rcvbulkpipe(dev, epread->bEndpointAddress), + buf += ctrlsize, readsize, acm_read_bulk, acm); + acm->readurb.transfer_flags |= USB_NO_FSBR; - usb_driver_claim_interface(&acm_driver, acm->iface + 0, acm); - usb_driver_claim_interface(&acm_driver, acm->iface + 1, acm); + FILL_BULK_URB(&acm->writeurb, dev, usb_sndbulkpipe(dev, epwrite->bEndpointAddress), + buf += readsize, acm->writesize, acm_write_bulk, acm); + acm->writeurb.transfer_flags |= USB_NO_FSBR; - tty_register_devfs(&acm_tty_driver, 0, minor); - return acm_table[minor] = acm; + printk(KERN_INFO "ttyACM%d: USB ACM device\n", minor); + + acm_set_control(acm, acm->ctrlout); + + acm->line.speed = cpu_to_le32(9600); + acm->line.databits = 8; + acm_set_line(acm, &acm->line); + + usb_driver_claim_interface(&acm_driver, acm->iface + 0, acm); + usb_driver_claim_interface(&acm_driver, acm->iface + 1, acm); + + tty_register_devfs(&acm_tty_driver, 0, minor); + return acm_table[minor] = acm; + } } return NULL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/aiptek.c linux-2.4.23-pre8/drivers/usb/aiptek.c --- linux-2.4.22/drivers/usb/aiptek.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/aiptek.c 2003-10-22 22:48:11.000000000 +0000 @@ -1102,7 +1102,8 @@ int num; num = (count < 64) ? count : 64; - copy_from_user(buf, buffer, num); + if (copy_from_user(buf, buffer, num)) + return -EFAULT; buf[num] = '\0'; scan = buf; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/audio.c linux-2.4.23-pre8/drivers/usb/audio.c --- linux-2.4.22/drivers/usb/audio.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/audio.c 2003-10-22 22:49:47.000000000 +0000 @@ -105,6 +105,8 @@ * functionality. Tested and used in production with the emagic emi 2|6 * on PPC and Intel. Also fixed a few logic 'crash and burn' corner * cases. + * 2003-06-30: Thomas Sailer + * Fix SETTRIGGER non OSS API conformity */ /* @@ -279,23 +281,24 @@ unsigned int srate; /* physical buffer */ unsigned char *sgbuf[NRSGBUF]; - unsigned bufsize; - unsigned numfrag; - unsigned fragshift; - unsigned wrptr, rdptr; - unsigned total_bytes; + unsigned int bufsize; + unsigned int numfrag; + unsigned int fragshift; + unsigned int wrptr, rdptr; + unsigned int total_bytes; int count; - unsigned error; /* over/underrun */ + unsigned int error; /* over/underrun */ wait_queue_head_t wait; /* redundant, but makes calculations easier */ - unsigned fragsize; - unsigned dmasize; + unsigned int fragsize; + unsigned int dmasize; /* OSS stuff */ - unsigned mapped:1; - unsigned ready:1; - unsigned ossfragshift; + unsigned int mapped:1; + unsigned int ready:1; + unsigned int enabled:1; + unsigned int ossfragshift; int ossmaxfrags; - unsigned subdivision; + unsigned int subdivision; }; struct usb_audio_state; @@ -562,6 +565,7 @@ break; } db->bufsize = nr << PAGE_SHIFT; + db->enabled = 1; db->ready = 1; dprintk((KERN_DEBUG "usbaudio: dmabuf_init bytepersec %d bufs %d ossfragshift %d ossmaxfrags %d " "fragshift %d fragsize %d numfrag %d dmasize %d bufsize %d fmt 0x%x srate %d\n", @@ -2299,7 +2303,7 @@ if (cnt > count) cnt = count; if (cnt <= 0) { - if (usbin_start(as)) { + if (as->usbin.dma.enabled && usbin_start(as)) { if (!ret) ret = -ENODEV; break; @@ -2332,6 +2336,11 @@ count -= cnt; buffer += cnt; ret += cnt; + if (as->usbin.dma.enabled && usbin_start(as)) { + if (!ret) + ret = -ENODEV; + break; + } } __set_current_state(TASK_RUNNING); remove_wait_queue(&as->usbin.dma.wait, &wait); @@ -2378,7 +2387,7 @@ if (cnt > count) cnt = count; if (cnt <= 0) { - if (usbout_start(as)) { + if (as->usbout.dma.enabled && usbout_start(as)) { if (!ret) ret = -ENODEV; break; @@ -2411,7 +2420,7 @@ count -= cnt; buffer += cnt; ret += cnt; - if (as->usbout.dma.count >= start_thr && usbout_start(as)) { + if (as->usbout.dma.enabled && as->usbout.dma.count >= start_thr && usbout_start(as)) { if (!ret) ret = -ENODEV; break; @@ -2616,19 +2625,25 @@ if (val & PCM_ENABLE_INPUT) { if (!as->usbin.dma.ready && (ret = prog_dmabuf_in(as))) return ret; + as->usbin.dma.enabled = 1; if (usbin_start(as)) return -ENODEV; - } else + } else { + as->usbin.dma.enabled = 0; usbin_stop(as); + } } if (file->f_mode & FMODE_WRITE) { if (val & PCM_ENABLE_OUTPUT) { if (!as->usbout.dma.ready && (ret = prog_dmabuf_out(as))) return ret; + as->usbout.dma.enabled = 1; if (usbout_start(as)) return -ENODEV; - } else + } else { + as->usbout.dma.enabled = 0; usbout_stop(as); + } } return 0; @@ -2827,10 +2842,14 @@ if (signal_pending(current)) return -ERESTARTSYS; } - if (file->f_mode & FMODE_READ) + if (file->f_mode & FMODE_READ) { as->usbin.dma.ossfragshift = as->usbin.dma.ossmaxfrags = as->usbin.dma.subdivision = 0; - if (file->f_mode & FMODE_WRITE) + as->usbin.dma.enabled = 1; + } + if (file->f_mode & FMODE_WRITE) { as->usbout.dma.ossfragshift = as->usbout.dma.ossmaxfrags = as->usbout.dma.subdivision = 0; + as->usbout.dma.enabled = 1; + } if (set_format(as, file->f_mode, ((minor & 0xf) == SND_DEV_DSP16) ? AFMT_S16_LE : AFMT_U8 /* AFMT_ULAW */, 8000)) { up(&open_sem); return -EIO; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/bluetooth.c linux-2.4.23-pre8/drivers/usb/bluetooth.c --- linux-2.4.22/drivers/usb/bluetooth.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/bluetooth.c 2003-10-22 22:48:01.000000000 +0000 @@ -1,8 +1,8 @@ /* * bluetooth.c Version 0.12 * - * Copyright (c) 2000, 2001 Greg Kroah-Hartman - * Copyright (c) 2000 Mark Douglas Corner + * Copyright (C) 2000, 2001 Greg Kroah-Hartman + * Copyright (C) 2000 Mark Douglas Corner * * USB Bluetooth TTY driver, based on the Bluetooth Spec version 1.0B * diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/devio.c linux-2.4.23-pre8/drivers/usb/devio.c --- linux-2.4.22/drivers/usb/devio.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/devio.c 2003-10-22 22:48:56.000000000 +0000 @@ -1078,6 +1078,8 @@ int size; void *buf = 0; int retval = 0; + struct usb_interface *ifp = 0; + struct usb_driver *driver = 0; /* get input parameters and alloc buffer */ if (copy_from_user(&ctrl, (void *) arg, sizeof (ctrl))) @@ -1095,32 +1097,41 @@ } } - /* ioctl to device */ - if (ctrl.ifno < 0) { - switch (ctrl.ioctl_code) { - /* access/release token for issuing control messages - * ask a particular driver to bind/unbind, ... etc - */ - } - retval = -ENOSYS; - - /* ioctl to the driver which has claimed a given interface */ - } else { - struct usb_interface *ifp = 0; - if (!ps->dev) - retval = -ENODEV; - else if (ctrl.ifno >= ps->dev->actconfig->bNumInterfaces) - retval = -EINVAL; + if (!ps->dev) + retval = -ENODEV; + else if (!(ifp = usb_ifnum_to_if (ps->dev, ctrl.ifno))) + retval = -EINVAL; + else switch (ctrl.ioctl_code) { + + /* disconnect kernel driver from interface, leaving it unbound. */ + case USBDEVFS_DISCONNECT: + driver = ifp->driver; + if (driver) { + down (&driver->serialize); + dbg ("disconnect '%s' from dev %d interface %d", + driver->name, ps->dev->devnum, ctrl.ifno); + driver->disconnect (ps->dev, ifp->private_data); + usb_driver_release_interface (driver, ifp); + up (&driver->serialize); + } else + retval = -ENODATA; + break; + + /* let kernel drivers try to (re)bind to the interface */ + case USBDEVFS_CONNECT: + usb_find_interface_driver_for_ifnum (ps->dev, ctrl.ifno); + break; + + /* talk directly to the interface's driver */ + default: + driver = ifp->driver; + if (driver == 0 || driver->ioctl == 0) + retval = -ENOSYS; else { - if (!(ifp = usb_ifnum_to_if (ps->dev, ctrl.ifno))) - retval = -EINVAL; - else if (ifp->driver == 0 || ifp->driver->ioctl == 0) - retval = -ENOSYS; - } - if (retval == 0) /* ifno might usefully be passed ... */ - retval = ifp->driver->ioctl (ps->dev, ctrl.ioctl_code, buf); + retval = driver->ioctl (ps->dev, ctrl.ioctl_code, buf); /* size = min_t(int, size, retval)? */ + } } /* cleanup and return */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/gadget/Config.in linux-2.4.23-pre8/drivers/usb/gadget/Config.in --- linux-2.4.22/drivers/usb/gadget/Config.in 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/gadget/Config.in 2003-10-22 22:48:53.000000000 +0000 @@ -0,0 +1,69 @@ +# +# USB device-side configuration +# for 2.4 kbuild, drivers/usb/gadget/Config.in +# +# Long term, this likely doesn't all belong in one directory +# Plan to split it up eventually. +# +mainmenu_option next_comment +comment 'Support for USB gadgets' + +bool 'Support for USB Gadgets' CONFIG_USB_GADGET +if [ "$CONFIG_USB_GADGET" = "y" ]; then + + # + # really want _exactly one_ device controller driver at a time, + # since they control compile options for gadget drivers. + # + comment 'USB Peripheral Controller Drivers' + + # assume all the dependencies may be undefined ("== true", yeech) + if [ "$CONFIG_PCI" = "y" ] ; then + tristate ' NetChip 2280 support' CONFIG_USB_NET2280 + define_tristate CONFIG_USB_GADGET_CONTROLLER $CONFIG_USB_NET2280 + fi + + if [ "$CONFIG_USB_GADGET_CONTROLLER" = "y" -o "$CONFIG_USB_GADGET_CONTROLLER" = "m" ] ; then + + # + # no reason not to enable more than one gadget driver module, but + # for static linking that would make no sense since the usb model + # has exactly one of these upstream connections and only one + # lowest-level driver can control it. + # + # gadget drivers are compiled to work on specific hardware, since + # + # (a) gadget driver need hardware-specific configuration, like what + # endpoint names and numbers to use, maxpacket sizes, etc + # + # (b) specific hardware features like iso endpoints may be required + # + comment 'USB Gadget Drivers' + + dep_tristate ' Gadget Zero (DEVELOPMENT)' CONFIG_USB_ZERO $CONFIG_USB_GADGET_CONTROLLER + if [ "$CONFIG_USB_ZERO" = "y" -o "$CONFIG_USB_ZERO" = "m" ]; then + if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then + define_bool CONFIG_USB_ZERO_NET2280 y + fi + if [ "$CONFIG_USB_PXA2XX" = "y" -o "$CONFIG_USB_PXA2XX" = "m" ]; then + define_bool CONFIG_USB_ZERO_PXA2XX y + fi + # ... + fi + + dep_tristate ' Ethernet Gadget (EXPERIMENTAL)' CONFIG_USB_ETH $CONFIG_USB_GADGET_CONTROLLER + if [ "$CONFIG_USB_ETH" = "y" -o "$CONFIG_USB_ETH" = "m" ]; then + if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then + define_bool CONFIG_USB_ETH_NET2280 y + fi + if [ "$CONFIG_USB_PXA2XX" = "y" -o "$CONFIG_USB_PXA2XX" = "m" ]; then + define_bool CONFIG_USB_ETH_PXA2XX y + fi + # ... + fi + + # ... or other gadget drivers: printer class, storage, hid, etc ... + + fi +fi +endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/gadget/Makefile linux-2.4.23-pre8/drivers/usb/gadget/Makefile --- linux-2.4.22/drivers/usb/gadget/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/gadget/Makefile 2003-10-22 22:48:21.000000000 +0000 @@ -0,0 +1,31 @@ +# +# Makefile for USB peripheral controller and gadget drivers +# for kbuild 2.4 +# + +# for static linking +O_TARGET := built-in.o + +list-multi := g_zero.o g_ether.o + +obj-$(CONFIG_USB_NET2280) += net2280.o + +# only one of these may be statically linked ... +controller-$(CONFIG_USB_NET2280) += net2280.o + +# ... and only one of these, too; kbuild/kconfig don't help though. +g_zero-objs := zero.o usbstring.o +obj-$(CONFIG_USB_ZERO) += g_zero.o + +g_ether-objs := ether.o usbstring.o +obj-$(CONFIG_USB_ETH) += g_ether.o + + +export-objs := $(controller-y) $(controller-m) + +include $(TOPDIR)/Rules.make + +g_zero.o: $(g_zero-objs) + $(LD) -r -o $@ $(g_zero-objs) +g_ether.o: $(g_ether-objs) + $(LD) -r -o $@ $(g_ether-objs) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/gadget/ether.c linux-2.4.23-pre8/drivers/usb/gadget/ether.c --- linux-2.4.22/drivers/usb/gadget/ether.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/gadget/ether.c 2003-10-22 22:47:34.000000000 +0000 @@ -0,0 +1,1879 @@ +/* + * ether.c -- Ethernet gadget driver, with CDC and non-CDC options + * + * Copyright (C) 2003 David Brownell + * + * 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 DEBUG 1 +// #define VERBOSE + +#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 + +/*-------------------------------------------------------------------------*/ + +/* + * Ethernet gadget driver -- with CDC and non-CDC options + * + * CDC Ethernet is the standard USB solution for sending Ethernet frames + * using USB. Real hardware tends to use the same framing protocol but look + * different for control features. And Microsoft pushes their own approach + * (RNDIS) instead of the standard. + * + * There's some hardware that can't talk CDC. We make that hardware + * implement a "minimalist" vendor-agnostic CDC core: same framing, but + * link-level setup only requires activating the configuration. + */ + +#define DRIVER_DESC "Ethernet Gadget" +#define DRIVER_VERSION "Bastille Day 2003" + +static const char shortname [] = "ether"; +static const char driver_desc [] = DRIVER_DESC; + +#define MIN_PACKET sizeof(struct ethhdr) +#define MAX_PACKET ETH_DATA_LEN /* biggest packet we'll rx/tx */ +#define RX_EXTRA 20 /* guard against rx overflows */ + +/* FIXME allow high speed jumbograms */ + +/*-------------------------------------------------------------------------*/ + +#ifndef container_of +#define container_of list_entry +#endif + +/* 2.5 modified and renamed these */ + +#define work_struct tq_struct +#define INIT_WORK INIT_TQUEUE +#define schedule_work schedule_task +#define flush_scheduled_work flush_scheduled_tasks + +/*-------------------------------------------------------------------------*/ + +struct eth_dev { + spinlock_t lock; + struct usb_gadget *gadget; + struct usb_request *req; /* for control responses */ + + u8 config; + struct usb_ep *in_ep, *out_ep, *status_ep; + const struct usb_endpoint_descriptor + *in, *out, *status; + struct list_head tx_reqs, rx_reqs; + + struct net_device *net; + struct net_device_stats stats; + atomic_t tx_qlen; + + struct work_struct work; + unsigned long todo; +#define WORK_RX_MEMORY 0 +}; + +/*-------------------------------------------------------------------------*/ + +/* This driver keeps a variable number of requests queued, more at + * high speeds. (Numbers are just educated guesses, untuned.) + * Shrink the queue if memory is tight, or make it bigger to + * handle bigger traffic bursts between IRQs (assuming hw dma queues) + */ + +static unsigned qmult = 4; + +#define HS_FACTOR 5 + +#define qlen(gadget) \ + (qmult*((gadget->speed == USB_SPEED_HIGH) ? HS_FACTOR : 1)) + +/* defer IRQs on highspeed TX */ +#define TX_DELAY 8 + + +MODULE_PARM (qmult, "i"); +MODULE_PARM_DESC (qmult, "rx/tx buffering factor"); + +/*-------------------------------------------------------------------------*/ + +/* Thanks to NetChip Technologies for donating this product ID. + * + * DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!! + * Instead: allocate your own, using normal USB-IF procedures. + */ +#define DRIVER_VENDOR_NUM 0x0525 /* NetChip */ +#define DRIVER_PRODUCT_NUM 0xa4a1 /* Linux-USB Ethernet Gadget */ + +/*-------------------------------------------------------------------------*/ + +/* + * hardware-specific configuration, controlled by which device + * controller driver was configured. + * + * CHIP ... hardware identifier + * DRIVER_VERSION_NUM ... alerts the host side driver to differences + * EP0_MAXPACKET ... controls packetization of control requests + * EP_*_NAME ... which endpoints do we use for which purpose? + * EP_*_NUM ... numbers for them (often limited by hardware) + * HIGHSPEED ... define if ep0 and descriptors need high speed support + * MAX_USB_POWER ... define if we use other than 100 mA bus current + * SELFPOWER ... unless we can run on bus power, USB_CONFIG_ATT_SELFPOWER + * WAKEUP ... if hardware supports remote wakeup AND we will issue the + * usb_gadget_wakeup() call to initiate it, USB_CONFIG_ATT_WAKEUP + * + * hw_optimize(gadget) ... for any hardware tweaks we want to kick in + * before we enable our endpoints + * + * add other defines for other portability issues, like hardware that + * for some reason doesn't handle full speed bulk maxpacket of 64. + */ + +#define DEV_CONFIG_VALUE 3 /* some hardware cares */ + +/* #undef on hardware that can't implement CDC */ +#define DEV_CONFIG_CDC + +/* + * NetChip 2280, PCI based. + * + * use DMA with fat fifos for all data traffic, PIO for the status channel + * where its 64 byte maxpacket ceiling is no issue. + * + * performance note: only PIO needs per-usb-packet IRQs (ep0, ep-e, ep-f) + * otherwise IRQs are per-Ethernet-packet unless TX_DELAY and chaining help. + */ +#ifdef CONFIG_USB_ETH_NET2280 +#define CHIP "net2280" +#define DRIVER_VERSION_NUM 0x0111 +#define EP0_MAXPACKET 64 +static const char EP_OUT_NAME [] = "ep-a"; +#define EP_OUT_NUM 1 +static const char EP_IN_NAME [] = "ep-b"; +#define EP_IN_NUM 2 +static const char EP_STATUS_NAME [] = "ep-f"; +#define EP_STATUS_NUM 3 +#define HIGHSPEED +/* specific hardware configs could be bus-powered */ +#define SELFPOWER USB_CONFIG_ATT_SELFPOWER +/* supports remote wakeup, but this driver doesn't */ + +extern int net2280_set_fifo_mode (struct usb_gadget *gadget, int mode); + +static inline void hw_optimize (struct usb_gadget *gadget) +{ + /* we can have bigger ep-a/ep-b fifos (2KB each, 4 USB packets + * for highspeed bulk) because we're not using ep-c/ep-d. + */ + net2280_set_fifo_mode (gadget, 1); +} +#endif + +/* + * PXA-2xx UDC: widely used in second gen Linux-capable ARM PDAs + * and other products. + * + * multiple interfaces (or altsettings) aren't usable. so this hardware + * can't implement CDC, which needs both capabilities. + */ +#ifdef CONFIG_USB_ETH_PXA2XX +#undef DEV_CONFIG_CDC +#define CHIP "pxa2xx" +#define DRIVER_VERSION_NUM 0x0113 +#define EP0_MAXPACKET 16 +static const char EP_OUT_NAME [] = "ep2out-bulk"; +#define EP_OUT_NUM 2 +static const char EP_IN_NAME [] = "ep1in-bulk"; +#define EP_IN_NUM 1 +/* doesn't support bus-powered operation */ +#define SELFPOWER USB_CONFIG_ATT_SELFPOWER +/* supports remote wakeup, but this driver doesn't */ + +/* no hw optimizations to apply */ +#define hw_optimize(g) do {} while (0); +#endif + +/* + * SA-1100 UDC: widely used in first gen Linux-capable PDAs. + * + * can't have a notification endpoint, since there are only the two + * bulk-capable ones. the CDC spec allows that. + */ +#ifdef CONFIG_USB_ETH_SA1100 +#define CHIP "sa1100" +#define DRIVER_VERSION_NUM 0x0115 +#define EP0_MAXPACKET 8 +static const char EP_OUT_NAME [] = "ep1out-bulk"; +#define EP_OUT_NUM 1 +static const char EP_IN_NAME [] = "ep2in-bulk"; +#define EP_IN_NUM 2 +// EP_STATUS_NUM is undefined +/* doesn't support bus-powered operation */ +#define SELFPOWER USB_CONFIG_ATT_SELFPOWER +/* doesn't support remote wakeup? */ + +/* no hw optimizations to apply */ +#define hw_optimize(g) do {} while (0); +#endif + +/*-------------------------------------------------------------------------*/ + +#ifndef EP0_MAXPACKET +# error Configure some USB peripheral controller driver! +#endif + +/* We normally expect hardware that can talk CDC. That involves + * using multiple interfaces and altsettings, and maybe a status + * interrupt. Driver binding to be done according to USB-IF class, + * though you can use different VENDOR and PRODUCT numbers if you + * want (and they're officially assigned). + * + * For hardware that can't talk CDC, we use the same vendor ID that + * ARM Linux has used for ethernet-over-usb, both with sa1100 and + * with pxa250. We're protocol-compatible, if the host-side drivers + * use the endpoint descriptors. DRIVER_VERSION_NUM is nonzero, so + * drivers that need to hard-wire endpoint numbers have a hook. + */ +#ifdef DEV_CONFIG_CDC +#define DEV_CONFIG_CLASS USB_CLASS_COMM +#else +#define DEV_CONFIG_CLASS USB_CLASS_VENDOR_SPEC +#undef EP_STATUS_NUM +#undef DRIVER_VENDOR_NUM +#undef DRIVER_PRODUCT_NUM +#define DRIVER_VENDOR_NUM 0x049f +#define DRIVER_PRODUCT_NUM 0x505a +#endif /* CONFIG_CDC_ETHER */ + +/* power usage is config specific. + * hardware that supports remote wakeup defaults to disabling it. + */ + +#ifndef SELFPOWER +/* default: say we rely on bus power */ +#define SELFPOWER 0 +/* else: + * - SELFPOWER value must be USB_CONFIG_ATT_SELFPOWER + * - MAX_USB_POWER may be nonzero. + */ +#endif + +#ifndef MAX_USB_POWER +/* any hub supports this steady state bus power consumption */ +#define MAX_USB_POWER 100 /* mA */ +#endif + +#ifndef WAKEUP +/* default: this driver won't do remote wakeup */ +#define WAKEUP 0 +/* else value must be USB_CONFIG_ATT_WAKEUP */ +#endif + +/*-------------------------------------------------------------------------*/ + +#define xprintk(d,level,fmt,args...) \ + printk(level "%s %s: " fmt , shortname , (d)->gadget->dev.bus_id , \ + ## args) + +#ifdef DEBUG +#undef DEBUG +#define DEBUG(dev,fmt,args...) \ + xprintk(dev , KERN_DEBUG , fmt , ## args) +#else +#define DEBUG(dev,fmt,args...) \ + do { } while (0) +#endif /* DEBUG */ + +#ifdef VERBOSE +#define VDEBUG DEBUG +#else +#define VDEBUG(dev,fmt,args...) \ + do { } while (0) +#endif /* DEBUG */ + +#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) + +/*-------------------------------------------------------------------------*/ + +/* USB DRIVER HOOKUP (to the hardware driver, below us), mostly + * ep0 implementation: descriptors, config management, setup(). + * also optional class-specific notification interrupt transfer. + */ + +/* + * DESCRIPTORS ... most are static, but strings and (full) configuration + * descriptors are built on demand. Notice how most of the cdc descriptors + * aren't needed in the "minimalist" mode. + */ + +#define STRING_MANUFACTURER 1 +#define STRING_PRODUCT 2 +#define STRING_ETHADDR 3 +#define STRING_DATA 4 +#define STRING_CONTROL 5 + +#define USB_BUFSIZ 256 /* holds our biggest descriptor */ + +/* + * This device advertises one configuration. + */ +static const struct usb_device_descriptor +device_desc = { + .bLength = sizeof device_desc, + .bDescriptorType = USB_DT_DEVICE, + + .bcdUSB = __constant_cpu_to_le16 (0x0200), + + .bDeviceClass = DEV_CONFIG_CLASS, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = EP0_MAXPACKET, + + .idVendor = __constant_cpu_to_le16 (DRIVER_VENDOR_NUM), + .idProduct = __constant_cpu_to_le16 (DRIVER_PRODUCT_NUM), + .bcdDevice = __constant_cpu_to_le16 (DRIVER_VERSION_NUM), + .iManufacturer = STRING_MANUFACTURER, + .iProduct = STRING_PRODUCT, + .bNumConfigurations = 1, +}; + +static const struct usb_config_descriptor +eth_config = { + .bLength = sizeof eth_config, + .bDescriptorType = USB_DT_CONFIG, + + /* compute wTotalLength on the fly */ +#ifdef DEV_CONFIG_CDC + .bNumInterfaces = 2, +#else + .bNumInterfaces = 1, +#endif + .bConfigurationValue = DEV_CONFIG_VALUE, + .iConfiguration = STRING_PRODUCT, + .bmAttributes = USB_CONFIG_ATT_ONE | SELFPOWER | WAKEUP, + .bMaxPower = (MAX_USB_POWER + 1) / 2, +}; + +#ifdef DEV_CONFIG_CDC + +/* + * Compared to the "minimalist" non-CDC model, the CDC model adds + * three class descriptors, two interface descrioptors, and a status + * endpoint. Both have a "data" interface and two bulk endpoints. + * There are also differences in how control requests are handled. + */ + +/* master comm interface optionally has a status notification endpoint */ + +static const struct usb_interface_descriptor +control_intf = { + .bLength = sizeof control_intf, + .bDescriptorType = USB_DT_INTERFACE, + + .bInterfaceNumber = 0, +#ifdef EP_STATUS_NUM + .bNumEndpoints = 1, +#else + .bNumEndpoints = 0, +#endif + .bInterfaceClass = USB_CLASS_COMM, + .bInterfaceSubClass = 6, /* ethernet control model */ + .bInterfaceProtocol = 0, + .iInterface = STRING_CONTROL, +}; + +/* "Header Functional Descriptor" from CDC spec 5.2.3.1 */ +struct header_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u16 bcdCDC; +} __attribute__ ((packed)); + +static const struct header_desc header_desc = { + .bLength = sizeof header_desc, + .bDescriptorType = 0x24, + .bDescriptorSubType = 0, + + .bcdCDC = __constant_cpu_to_le16 (0x0110), +}; + +/* "Union Functional Descriptor" from CDC spec 5.2.3.X */ +struct union_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u8 bMasterInterface0; + u8 bSlaveInterface0; + /* ... and there could be other slave interfaces */ +} __attribute__ ((packed)); + +static const struct union_desc union_desc = { + .bLength = sizeof union_desc, + .bDescriptorType = 0x24, + .bDescriptorSubType = 6, + + .bMasterInterface0 = 0, /* index of control interface */ + .bSlaveInterface0 = 1, /* index of DATA interface */ +}; + +/* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */ +struct ether_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u8 iMACAddress; + u32 bmEthernetStatistics; + u16 wMaxSegmentSize; + u16 wNumberMCFilters; + u8 bNumberPowerFilters; +} __attribute__ ((packed)); + +static const struct ether_desc ether_desc = { + .bLength = sizeof ether_desc, + .bDescriptorType = 0x24, + .bDescriptorSubType = 0x0f, + + /* this descriptor actually adds value, surprise! */ + .iMACAddress = STRING_ETHADDR, + .bmEthernetStatistics = __constant_cpu_to_le32 (0), /* no statistics */ + .wMaxSegmentSize = __constant_cpu_to_le16 (MAX_PACKET + ETH_HLEN), + .wNumberMCFilters = __constant_cpu_to_le16 (0), + .bNumberPowerFilters = 0, +}; + +#ifdef EP_STATUS_NUM + +/* include the status endpoint if we can, even though it's optional. + * + * some drivers (like current Linux cdc-ether!) "need" it to exist even + * if they ignore the connect/disconnect notifications that real aether + * can provide. more advanced cdc configurations might want to support + * encapsulated commands (vendor-specific, using control-OUT). + */ + +#define LOG2_STATUS_INTERVAL_MSEC 6 +#define STATUS_BYTECOUNT 16 /* 8 byte header + data */ +static const struct usb_endpoint_descriptor +fs_status_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_STATUS_NUM | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_INT, + .wMaxPacketSize = __constant_cpu_to_le16 (STATUS_BYTECOUNT), + .bInterval = 1 << LOG2_STATUS_INTERVAL_MSEC, +}; +#endif + +/* the default data interface has no endpoints ... */ + +static const struct usb_interface_descriptor +data_nop_intf = { + .bLength = sizeof data_nop_intf, + .bDescriptorType = USB_DT_INTERFACE, + + .bInterfaceNumber = 1, + .bAlternateSetting = 0, + .bNumEndpoints = 0, + .bInterfaceClass = USB_CLASS_CDC_DATA, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .iInterface = STRING_DATA, +}; + +/* ... but the "real" data interface has two full speed bulk endpoints */ + +static const struct usb_interface_descriptor +data_intf = { + .bLength = sizeof data_intf, + .bDescriptorType = USB_DT_INTERFACE, + + .bInterfaceNumber = 1, + .bAlternateSetting = 1, + .bNumEndpoints = 2, + .bInterfaceClass = USB_CLASS_CDC_DATA, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .iInterface = STRING_DATA, +}; +#else + +/* + * "Minimalist" non-CDC option is a simple vendor-neutral model that most + * full speed controllers can handle: one interface, two bulk endpoints. + */ + +static const struct usb_interface_descriptor +data_intf = { + .bLength = sizeof data_intf, + .bDescriptorType = USB_DT_INTERFACE, + + .bInterfaceNumber = 0, + .bAlternateSetting = 0, + .bNumEndpoints = 2, + .bInterfaceClass = USB_CLASS_VENDOR_SPEC, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .iInterface = STRING_DATA, +}; + +#endif /* DEV_CONFIG_CDC */ + + +static const struct usb_endpoint_descriptor +fs_source_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_IN_NUM | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = __constant_cpu_to_le16 (64), +}; + +static const struct usb_endpoint_descriptor +fs_sink_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_OUT_NUM, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = __constant_cpu_to_le16 (64), +}; + +#ifdef HIGHSPEED + +/* + * usb 2.0 devices need to expose both high speed and full speed + * descriptors, unless they only run at full speed. + */ + +#ifdef EP_STATUS_NUM +static const struct usb_endpoint_descriptor +hs_status_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_STATUS_NUM | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_INT, + .wMaxPacketSize = __constant_cpu_to_le16 (STATUS_BYTECOUNT), + .bInterval = LOG2_STATUS_INTERVAL_MSEC + 3, +}; +#endif + +static const struct usb_endpoint_descriptor +hs_source_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_IN_NUM | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = __constant_cpu_to_le16 (512), + .bInterval = 1, +}; + +static const struct usb_endpoint_descriptor +hs_sink_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_OUT_NUM, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = __constant_cpu_to_le16 (512), + .bInterval = 1, +}; + +static const struct usb_qualifier_descriptor +dev_qualifier = { + .bLength = sizeof dev_qualifier, + .bDescriptorType = USB_DT_DEVICE_QUALIFIER, + + .bcdUSB = __constant_cpu_to_le16 (0x0200), + .bDeviceClass = DEV_CONFIG_CLASS, + + /* assumes ep0 uses the same value for both speeds ... */ + .bMaxPacketSize0 = EP0_MAXPACKET, + + .bNumConfigurations = 1, +}; + +/* maxpacket and other transfer characteristics vary by speed. */ +#define ep_desc(g,hs,fs) (((g)->speed==USB_SPEED_HIGH)?(hs):(fs)) + +#else + +/* if there's no high speed support, maxpacket doesn't change. */ +#define ep_desc(g,hs,fs) fs + +#endif /* !HIGHSPEED */ + +/*-------------------------------------------------------------------------*/ + +/* descriptors that are built on-demand */ + +#ifdef DEV_CONFIG_CDC +/* address that the host will use ... usually assigned at random */ +static char ethaddr [2 * ETH_ALEN + 1]; +#endif + +/* static strings, in iso 8859/1 */ +static struct usb_string strings [] = { + { STRING_MANUFACTURER, UTS_SYSNAME " " UTS_RELEASE "/" CHIP, }, + { STRING_PRODUCT, driver_desc, }, +#ifdef DEV_CONFIG_CDC + { STRING_ETHADDR, ethaddr, }, + { STRING_CONTROL, "CDC Communications Control", }, +#endif + { STRING_DATA, "Ethernet Data", }, + { } /* end of list */ +}; + +static struct usb_gadget_strings stringtab = { + .language = 0x0409, /* en-us */ + .strings = strings, +}; + +/* + * one config, two interfaces: control, data. + * complications: class descriptors, and an altsetting. + */ +static int +config_buf (enum usb_device_speed speed, u8 *buf, u8 type, unsigned index) +{ + const unsigned config_len = USB_DT_CONFIG_SIZE +#ifdef DEV_CONFIG_CDC + + 2 * USB_DT_INTERFACE_SIZE + + sizeof header_desc + + sizeof union_desc + + sizeof ether_desc +#ifdef EP_STATUS_NUM + + USB_DT_ENDPOINT_SIZE +#endif +#endif /* DEV_CONFIG_CDC */ + + USB_DT_INTERFACE_SIZE + + 2 * USB_DT_ENDPOINT_SIZE; + +#ifdef HIGHSPEED + int hs; +#endif + /* a single configuration must always be index 0 */ + if (index > 0) + return -EINVAL; + if (config_len > USB_BUFSIZ) + return -EDOM; + + /* config (or other speed config) */ + memcpy (buf, ð_config, USB_DT_CONFIG_SIZE); + buf [1] = type; + ((struct usb_config_descriptor *) buf)->wTotalLength + = __constant_cpu_to_le16 (config_len); + buf += USB_DT_CONFIG_SIZE; +#ifdef HIGHSPEED + hs = (speed == USB_SPEED_HIGH); + if (type == USB_DT_OTHER_SPEED_CONFIG) + hs = !hs; +#endif + +#ifdef DEV_CONFIG_CDC + /* control interface, class descriptors, optional status endpoint */ + memcpy (buf, &control_intf, USB_DT_INTERFACE_SIZE); + buf += USB_DT_INTERFACE_SIZE; + + memcpy (buf, &header_desc, sizeof header_desc); + buf += sizeof header_desc; + memcpy (buf, &union_desc, sizeof union_desc); + buf += sizeof union_desc; + memcpy (buf, ðer_desc, sizeof ether_desc); + buf += sizeof ether_desc; + +#ifdef EP_STATUS_NUM +#ifdef HIGHSPEED + if (hs) + memcpy (buf, &hs_status_desc, USB_DT_ENDPOINT_SIZE); + else +#endif /* HIGHSPEED */ + memcpy (buf, &fs_status_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; +#endif /* EP_STATUS_NUM */ + + /* default data altsetting has no endpoints */ + memcpy (buf, &data_nop_intf, USB_DT_INTERFACE_SIZE); + buf += USB_DT_INTERFACE_SIZE; +#endif /* DEV_CONFIG_CDC */ + + /* the "real" data interface has two endpoints */ + memcpy (buf, &data_intf, USB_DT_INTERFACE_SIZE); + buf += USB_DT_INTERFACE_SIZE; +#ifdef HIGHSPEED + if (hs) { + memcpy (buf, &hs_source_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; + memcpy (buf, &hs_sink_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; + } else +#endif + { + memcpy (buf, &fs_source_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; + memcpy (buf, &fs_sink_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; + } + + return config_len; +} + +/*-------------------------------------------------------------------------*/ + +static void eth_start (struct eth_dev *dev, int gfp_flags); +static int alloc_requests (struct eth_dev *dev, unsigned n, int gfp_flags); + +static int +set_ether_config (struct eth_dev *dev, int gfp_flags) +{ + int result = 0; + struct usb_ep *ep; + struct usb_gadget *gadget = dev->gadget; + + gadget_for_each_ep (ep, gadget) { + const struct usb_endpoint_descriptor *d; + +#ifdef DEV_CONFIG_CDC + /* With CDC, the host isn't allowed to use these two data + * endpoints in the default altsetting for the interface. + * so we don't activate them yet. + */ + + /* one endpoint writes data back IN to the host */ + if (strcmp (ep->name, EP_IN_NAME) == 0) { + d = ep_desc (gadget, &hs_source_desc, &fs_source_desc); + ep->driver_data = dev; + dev->in_ep = ep; + dev->in = d; + continue; + + /* one endpoint just reads OUT packets */ + } else if (strcmp (ep->name, EP_OUT_NAME) == 0) { + d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc); + ep->driver_data = dev; + dev->out_ep = ep; + dev->out = d; + continue; + } + +#ifdef EP_STATUS_NUM + /* optional status/notification endpoint */ + else if (strcmp (ep->name, EP_STATUS_NAME) == 0) { + d = ep_desc (gadget, &hs_status_desc, &fs_status_desc); + result = usb_ep_enable (ep, d); + if (result == 0) { + ep->driver_data = dev; + dev->status_ep = ep; + dev->status = d; + continue; + } + } +#endif + +#else /* !CONFIG_CDC_ETHER */ + + /* non-CDC is simpler: if the device is there, + * it's live with rx and tx endpoints. + */ + /* one endpoint writes data back IN to the host */ + if (strcmp (ep->name, EP_IN_NAME) == 0) { + d = ep_desc (gadget, &hs_source_desc, &fs_source_desc); + result = usb_ep_enable (ep, d); + if (result == 0) { + ep->driver_data = dev; + dev->in_ep = ep; + dev->in = d; + continue; + } + + /* one endpoint just reads OUT packets */ + } else if (strcmp (ep->name, EP_OUT_NAME) == 0) { + d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc); + result = usb_ep_enable (ep, d); + if (result == 0) { + ep->driver_data = dev; + dev->out_ep = ep; + dev->out = d; + continue; + } + } + +#endif /* !CONFIG_CDC_ETHER */ + + /* ignore any other endpoints */ + else + continue; + + /* stop on error */ + ERROR (dev, "can't enable %s, result %d\n", ep->name, result); + break; + } + if (!result && (!dev->in_ep || !dev->out_ep)) + result = -ENODEV; + + if (result == 0) + result = alloc_requests (dev, qlen (gadget), gfp_flags); + +#ifndef DEV_CONFIG_CDC + if (result == 0) { + netif_carrier_on (dev->net); + if (netif_running (dev->net)) + eth_start (dev, GFP_ATOMIC); + } else { + (void) usb_ep_disable (dev->in_ep); + dev->in_ep = 0; + dev->in = 0; + (void) usb_ep_disable (dev->out_ep); + dev->out_ep = 0; + dev->out = 0; + } +#endif /* !CONFIG_CDC_ETHER */ + + if (result == 0) + DEBUG (dev, "qlen %d\n", qlen (gadget)); + + /* caller is responsible for cleanup on error */ + return result; +} + +static void eth_reset_config (struct eth_dev *dev) +{ + if (dev->config == 0) + return; + + DEBUG (dev, "%s\n", __FUNCTION__); + + netif_stop_queue (dev->net); + netif_carrier_off (dev->net); + + /* just disable endpoints, forcing completion of pending i/o. + * all our completion handlers free their requests in this case. + */ + if (dev->in_ep) { + usb_ep_disable (dev->in_ep); + dev->in_ep = 0; + } + if (dev->out_ep) { + usb_ep_disable (dev->out_ep); + dev->out_ep = 0; + } +#ifdef EP_STATUS_NUM + if (dev->status_ep) { + usb_ep_disable (dev->status_ep); + dev->status_ep = 0; + } +#endif + dev->config = 0; +} + +/* change our operational config. must agree with the code + * that returns config descriptors, and altsetting code. + */ +static int +eth_set_config (struct eth_dev *dev, unsigned number, int gfp_flags) +{ + int result = 0; + struct usb_gadget *gadget = dev->gadget; + + if (number == dev->config) + return 0; + +#ifdef CONFIG_USB_ETH_SA1100 + if (dev->config && atomic_read (&dev->tx_qlen) != 0) { + /* tx fifo is full, but we can't clear it...*/ + INFO (dev, "can't change configurations\n"); + return -ESPIPE; + } +#endif + eth_reset_config (dev); + hw_optimize (gadget); + + switch (number) { + case DEV_CONFIG_VALUE: + result = set_ether_config (dev, gfp_flags); + break; + default: + result = -EINVAL; + /* FALL THROUGH */ + case 0: + return result; + } + + if (result) + eth_reset_config (dev); + else { + char *speed; + + switch (gadget->speed) { + case USB_SPEED_FULL: speed = "full"; break; +#ifdef HIGHSPEED + case USB_SPEED_HIGH: speed = "high"; break; +#endif + default: speed = "?"; break; + } + + dev->config = number; + INFO (dev, "%s speed config #%d: %s\n", speed, number, + driver_desc); + } + return result; +} + +/*-------------------------------------------------------------------------*/ + +#ifdef EP_STATUS_NUM + +/* section 3.8.2 table 11 of the CDC spec lists Ethernet notifications */ +#define CDC_NOTIFY_NETWORK_CONNECTION 0x00 /* required; 6.3.1 */ +#define CDC_NOTIFY_SPEED_CHANGE 0x2a /* required; 6.3.8 */ + +struct cdc_notification { + u8 bmRequestType; + u8 bNotificationType; + u16 wValue; + u16 wIndex; + u16 wLength; + + /* SPEED_CHANGE data looks like this */ + u32 data [2]; +}; + +static void eth_status_complete (struct usb_ep *ep, struct usb_request *req) +{ + struct cdc_notification *event = req->buf; + int value = req->status; + struct eth_dev *dev = ep->driver_data; + + /* issue the second notification if host reads the first */ + if (event->bNotificationType == CDC_NOTIFY_NETWORK_CONNECTION + && value == 0) { + event->bmRequestType = 0xA1; + event->bNotificationType = CDC_NOTIFY_SPEED_CHANGE; + event->wValue = __constant_cpu_to_le16 (0); + event->wIndex = __constant_cpu_to_le16 (1); + event->wLength = __constant_cpu_to_le16 (8); + + /* SPEED_CHANGE data is up/down speeds in bits/sec */ + event->data [0] = event->data [1] = + (dev->gadget->speed == USB_SPEED_HIGH) + ? (13 * 512 * 8 * 1000 * 8) + : (19 * 64 * 1 * 1000 * 8); + + req->length = 16; + value = usb_ep_queue (ep, req, GFP_ATOMIC); + DEBUG (dev, "send SPEED_CHANGE --> %d\n", value); + if (value == 0) + return; + } else + DEBUG (dev, "event %02x --> %d\n", + event->bNotificationType, value); + + /* free when done */ + usb_ep_free_buffer (ep, req->buf, req->dma, 16); + usb_ep_free_request (ep, req); +} + +static void issue_start_status (struct eth_dev *dev) +{ + struct usb_request *req; + struct cdc_notification *event; + int value; + + DEBUG (dev, "%s, flush old status first\n", __FUNCTION__); + + /* flush old status + * + * FIXME ugly idiom, maybe we'd be better with just + * a "cancel the whole queue" primitive since any + * unlink-one primitive has way too many error modes. + * here, we "know" toggle is already clear... + */ + usb_ep_disable (dev->status_ep); + usb_ep_enable (dev->status_ep, dev->status); + + /* FIXME make these allocations static like dev->req */ + req = usb_ep_alloc_request (dev->status_ep, GFP_ATOMIC); + if (req == 0) { + DEBUG (dev, "status ENOMEM\n"); + return; + } + req->buf = usb_ep_alloc_buffer (dev->status_ep, 16, + &dev->req->dma, GFP_ATOMIC); + if (req->buf == 0) { + DEBUG (dev, "status buf ENOMEM\n"); +free_req: + usb_ep_free_request (dev->status_ep, req); + return; + } + + /* 3.8.1 says to issue first NETWORK_CONNECTION, then + * a SPEED_CHANGE. could be useful in some configs. + */ + event = req->buf; + event->bmRequestType = 0xA1; + event->bNotificationType = CDC_NOTIFY_NETWORK_CONNECTION; + event->wValue = __constant_cpu_to_le16 (1); /* connected */ + event->wIndex = __constant_cpu_to_le16 (1); + event->wLength = 0; + + req->length = 8; + req->complete = eth_status_complete; + value = usb_ep_queue (dev->status_ep, req, GFP_ATOMIC); + if (value < 0) { + DEBUG (dev, "status buf queue --> %d\n", value); + usb_ep_free_buffer (dev->status_ep, + req->buf, dev->req->dma, 16); + goto free_req; + } +} + +#endif + +/*-------------------------------------------------------------------------*/ + +static void eth_setup_complete (struct usb_ep *ep, struct usb_request *req) +{ + if (req->status || req->actual != req->length) + DEBUG ((struct eth_dev *) ep->driver_data, + "setup complete --> %d, %d/%d\n", + req->status, req->actual, req->length); +} + +/* see section 3.8.2 table 10 of the CDC spec for more ethernet + * requests, mostly for filters (multicast, pm) and statistics + */ +#define CDC_SET_ETHERNET_PACKET_FILTER 0x43 /* required */ + +/* + * The setup() callback implements all the ep0 functionality that's not + * handled lower down. CDC has a number of less-common features: + * + * - two interfaces: control, and ethernet data + * - data interface has two altsettings: default, and active + * - class-specific descriptors for the control interface + * - a mandatory class-specific control request + */ +static int +eth_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) +{ + struct eth_dev *dev = get_gadget_data (gadget); + struct usb_request *req = dev->req; + int value = -EOPNOTSUPP; + + /* descriptors just go into the pre-allocated ep0 buffer, + * while config change events may enable network traffic. + */ + switch (ctrl->bRequest) { + + case USB_REQ_GET_DESCRIPTOR: + if (ctrl->bRequestType != USB_DIR_IN) + break; + switch (ctrl->wValue >> 8) { + + case USB_DT_DEVICE: + value = min (ctrl->wLength, (u16) sizeof device_desc); + memcpy (req->buf, &device_desc, value); + break; +#ifdef HIGHSPEED + case USB_DT_DEVICE_QUALIFIER: + value = min (ctrl->wLength, (u16) sizeof dev_qualifier); + memcpy (req->buf, &dev_qualifier, value); + break; + + case USB_DT_OTHER_SPEED_CONFIG: + // FALLTHROUGH +#endif /* HIGHSPEED */ + case USB_DT_CONFIG: + value = config_buf (gadget->speed, req->buf, + ctrl->wValue >> 8, + ctrl->wValue & 0xff); + if (value >= 0) + value = min (ctrl->wLength, (u16) value); + break; + + case USB_DT_STRING: + value = usb_gadget_get_string (&stringtab, + ctrl->wValue & 0xff, req->buf); + if (value >= 0) + value = min (ctrl->wLength, (u16) value); + break; + } + break; + + case USB_REQ_SET_CONFIGURATION: + if (ctrl->bRequestType != 0) + break; + spin_lock (&dev->lock); + value = eth_set_config (dev, ctrl->wValue, GFP_ATOMIC); + spin_unlock (&dev->lock); + break; +#ifdef CONFIG_USB_ETH_PXA2XX + /* PXA UDC prevents us from using SET_INTERFACE in normal ways. + * And it hides GET_CONFIGURATION and GET_INTERFACE too. + */ + case USB_REQ_SET_INTERFACE: + spin_lock (&dev->lock); + value = eth_set_config (dev, DEV_CONFIG_VALUE, GFP_ATOMIC); + spin_unlock (&dev->lock); + break; + +#else /* hardware that that stays out of our way */ + case USB_REQ_GET_CONFIGURATION: + if (ctrl->bRequestType != USB_DIR_IN) + break; + *(u8 *)req->buf = dev->config; + value = min (ctrl->wLength, (u16) 1); + break; + + case USB_REQ_SET_INTERFACE: + if (ctrl->bRequestType != USB_RECIP_INTERFACE + || !dev->config + || ctrl->wIndex > 1) + break; + spin_lock (&dev->lock); + switch (ctrl->wIndex) { + case 0: /* control/master intf */ + if (ctrl->wValue != 0) + break; +#ifdef EP_STATUS_NUM + if (dev->status_ep) { + usb_ep_disable (dev->status_ep); + usb_ep_enable (dev->status_ep, dev->status); + } +#endif + value = 0; + break; + case 1: /* data intf */ + if (ctrl->wValue > 1) + break; + usb_ep_disable (dev->in_ep); + usb_ep_disable (dev->out_ep); + + /* CDC requires the data transfers not be done from + * the default interface setting ... also, setting + * the non-default interface clears filters etc. + */ + if (ctrl->wValue == 1) { + usb_ep_enable (dev->in_ep, dev->in); + usb_ep_enable (dev->out_ep, dev->out); + netif_carrier_on (dev->net); +#ifdef EP_STATUS_NUM + issue_start_status (dev); +#endif + if (netif_running (dev->net)) + eth_start (dev, GFP_ATOMIC); + } else { + netif_stop_queue (dev->net); + netif_carrier_off (dev->net); + } + value = 0; + break; + } + spin_unlock (&dev->lock); + break; + case USB_REQ_GET_INTERFACE: + if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE) + || !dev->config + || ctrl->wIndex > 1) + break; + + /* if carrier is on, data interface is active. */ + *(u8 *)req->buf = + ((ctrl->wIndex == 1) && netif_carrier_ok (dev->net)) + ? 1 + : 0, + value = min (ctrl->wLength, (u16) 1); + break; +#endif + +#ifdef DEV_CONFIG_CDC + case CDC_SET_ETHERNET_PACKET_FILTER: + /* see 6.2.30: no data, wIndex = interface, + * wValue = packet filter bitmap + */ + if (ctrl->bRequestType != (USB_TYPE_CLASS|USB_RECIP_INTERFACE) + || ctrl->wLength != 0 + || ctrl->wIndex > 1) + DEBUG (dev, "NOP packet filter %04x\n", ctrl->wValue); + /* NOTE: table 62 has 5 filter bits to reduce traffic, + * and we "must" support multicast and promiscuous. + * this NOP implements a bad filter... + */ + value = 0; + break; +#endif /* DEV_CONFIG_CDC */ + + default: + VDEBUG (dev, + "unknown control req%02x.%02x v%04x i%04x l%d\n", + ctrl->bRequestType, ctrl->bRequest, + ctrl->wValue, ctrl->wIndex, ctrl->wLength); + } + + /* respond with data transfer before status phase? */ + if (value >= 0) { + req->length = value; + value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC); + if (value < 0) { + DEBUG (dev, "ep_queue --> %d\n", value); + req->status = 0; + eth_setup_complete (gadget->ep0, req); + } + } + + /* host either stalls (value < 0) or reports success */ + return value; +} + +static void +eth_disconnect (struct usb_gadget *gadget) +{ + struct eth_dev *dev = get_gadget_data (gadget); + unsigned long flags; + + spin_lock_irqsave (&dev->lock, flags); + netif_stop_queue (dev->net); + netif_carrier_off (dev->net); + eth_reset_config (dev); + spin_unlock_irqrestore (&dev->lock, flags); + + /* next we may get setup() calls to enumerate new connections; + * or an unbind() during shutdown (including removing module). + */ +} + +/*-------------------------------------------------------------------------*/ + +/* NETWORK DRIVER HOOKUP (to the layer above this driver) */ + +static int eth_change_mtu (struct net_device *net, int new_mtu) +{ + struct eth_dev *dev = (struct eth_dev *) net->priv; + + if (new_mtu <= MIN_PACKET || new_mtu > MAX_PACKET) + return -ERANGE; + /* no zero-length packet read wanted after mtu-sized packets */ + if (((new_mtu + sizeof (struct ethhdr)) % dev->in_ep->maxpacket) == 0) + return -EDOM; + net->mtu = new_mtu; + return 0; +} + +static struct net_device_stats *eth_get_stats (struct net_device *net) +{ + return &((struct eth_dev *) net->priv)->stats; +} + +static int eth_ethtool_ioctl (struct net_device *net, void *useraddr) +{ + struct eth_dev *dev = (struct eth_dev *) net->priv; + u32 cmd; + + if (get_user (cmd, (u32 *)useraddr)) + return -EFAULT; + switch (cmd) { + + case ETHTOOL_GDRVINFO: { /* get driver info */ + struct ethtool_drvinfo info; + + memset (&info, 0, sizeof info); + info.cmd = ETHTOOL_GDRVINFO; + strncpy (info.driver, shortname, sizeof info.driver); + strncpy (info.version, DRIVER_VERSION, sizeof info.version); + strncpy (info.fw_version, CHIP, sizeof info.fw_version); + strncpy (info.bus_info, dev->gadget->dev.bus_id, + sizeof info.bus_info); + if (copy_to_user (useraddr, &info, sizeof (info))) + return -EFAULT; + return 0; + } + + case ETHTOOL_GLINK: { /* get link status */ + struct ethtool_value edata = { ETHTOOL_GLINK }; + + edata.data = (dev->gadget->speed != USB_SPEED_UNKNOWN); + if (copy_to_user (useraddr, &edata, sizeof (edata))) + return -EFAULT; + return 0; + } + + } + /* Note that the ethtool user space code requires EOPNOTSUPP */ + return -EOPNOTSUPP; +} + +static int eth_ioctl (struct net_device *net, struct ifreq *rq, int cmd) +{ + switch (cmd) { + case SIOCETHTOOL: + return eth_ethtool_ioctl (net, (void *)rq->ifr_data); + default: + return -EOPNOTSUPP; + } +} + +static void defer_kevent (struct eth_dev *dev, int flag) +{ + if (test_and_set_bit (flag, &dev->todo)) + return; + if (!schedule_work (&dev->work)) + ERROR (dev, "kevent %d may have been dropped\n", flag); + else + DEBUG (dev, "kevent %d scheduled\n", flag); +} + +static void rx_complete (struct usb_ep *ep, struct usb_request *req); + +static int +rx_submit (struct eth_dev *dev, struct usb_request *req, int gfp_flags) +{ + struct sk_buff *skb; + int retval = 0; + 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; + } + + req->buf = skb->data; + req->length = size; + req->complete = rx_complete; + req->context = skb; + + retval = usb_ep_queue (dev->out_ep, req, gfp_flags); + if (retval == -ENOMEM) + defer_kevent (dev, WORK_RX_MEMORY); + if (retval) { + DEBUG (dev, "rx submit --> %d\n", retval); + dev_kfree_skb_any (skb); + list_add (&req->list, &dev->rx_reqs); + } + return retval; +} + +static void rx_complete (struct usb_ep *ep, struct usb_request *req) +{ + struct sk_buff *skb = req->context; + struct eth_dev *dev = ep->driver_data; + int status = req->status; + + switch (status) { + + /* normal completion */ + case 0: + skb_put (skb, req->actual); + if (MIN_PACKET > skb->len + || skb->len > (MAX_PACKET + ETH_HLEN)) { + dev->stats.rx_errors++; + dev->stats.rx_length_errors++; + DEBUG (dev, "rx length %d\n", skb->len); + break; + } + + skb->dev = dev->net; + skb->protocol = eth_type_trans (skb, dev->net); + dev->stats.rx_packets++; + dev->stats.rx_bytes += skb->len; + + /* no buffer copies needed, unless hardware can't + * use skb buffers. + */ + status = netif_rx (skb); + skb = 0; + break; + + /* software-driven interface shutdown */ + case -ECONNRESET: // unlink + case -ESHUTDOWN: // disconnect etc + VDEBUG (dev, "rx shutdown, code %d\n", status); + goto quiesce; + + /* for hardware automagic (such as pxa) */ + case -ECONNABORTED: // endpoint reset + DEBUG (dev, "rx %s reset\n", ep->name); + defer_kevent (dev, WORK_RX_MEMORY); +quiesce: + dev_kfree_skb_any (skb); + goto clean; + + /* data overrun */ + case -EOVERFLOW: + dev->stats.rx_over_errors++; + // FALLTHROUGH + + default: + dev->stats.rx_errors++; + DEBUG (dev, "rx status %d\n", status); + break; + } + + if (skb) + dev_kfree_skb_any (skb); + if (!netif_running (dev->net)) { +clean: + list_add (&req->list, &dev->rx_reqs); + req = 0; + } + if (req) + rx_submit (dev, req, GFP_ATOMIC); +} + +static int prealloc (struct list_head *list, struct usb_ep *ep, + unsigned n, int gfp_flags) +{ + unsigned i; + struct usb_request *req; + + if (!n) + return -ENOMEM; + + /* queue/recycle up to N requests */ + i = n; + list_for_each_entry (req, list, list) { + if (i-- == 0) + goto extra; + } + while (i--) { + req = usb_ep_alloc_request (ep, gfp_flags); + if (!req) + return list_empty (list) ? -ENOMEM : 0; + list_add (&req->list, list); + } + return 0; + +extra: + /* free extras */ + for (;;) { + struct list_head *next; + + next = req->list.next; + list_del (&req->list); + usb_ep_free_request (ep, req); + + if (next == list) + break; + + req = container_of (next, struct usb_request, list); + } + return 0; +} + +static int alloc_requests (struct eth_dev *dev, unsigned n, int gfp_flags) +{ + int status; + + status = prealloc (&dev->tx_reqs, dev->in_ep, n, gfp_flags); + if (status < 0) + goto fail; + status = prealloc (&dev->rx_reqs, dev->out_ep, n, gfp_flags); + if (status < 0) + goto fail; + return 0; +fail: + DEBUG (dev, "can't alloc requests\n"); + return status; +} + +static void rx_fill (struct eth_dev *dev, int gfp_flags) +{ + struct usb_request *req; + + clear_bit (WORK_RX_MEMORY, &dev->todo); + + /* fill unused rxq slots with some skb */ + while (!list_empty (&dev->rx_reqs)) { + req = container_of (dev->rx_reqs.next, + struct usb_request, list); + list_del_init (&req->list); + if (rx_submit (dev, req, gfp_flags) < 0) { + defer_kevent (dev, WORK_RX_MEMORY); + return; + } + } +} + +static void eth_work (void *_dev) +{ + struct eth_dev *dev = _dev; + + if (test_bit (WORK_RX_MEMORY, &dev->todo)) { + if (netif_running (dev->net)) + rx_fill (dev, GFP_KERNEL); + else + clear_bit (WORK_RX_MEMORY, &dev->todo); + } + + if (dev->todo) + DEBUG (dev, "work done, flags = 0x%lx\n", dev->todo); +} + +static void tx_complete (struct usb_ep *ep, struct usb_request *req) +{ + struct sk_buff *skb = req->context; + struct eth_dev *dev = ep->driver_data; + + switch (req->status) { + default: + dev->stats.tx_errors++; + VDEBUG (dev, "tx err %d\n", req->status); + /* FALLTHROUGH */ + case -ECONNRESET: // unlink + case -ESHUTDOWN: // disconnect etc + break; + case 0: + dev->stats.tx_bytes += skb->len; + } + dev->stats.tx_packets++; + + list_add (&req->list, &dev->tx_reqs); + dev_kfree_skb_any (skb); + + atomic_dec (&dev->tx_qlen); + if (netif_carrier_ok (dev->net)) + netif_wake_queue (dev->net); +} + +static int eth_start_xmit (struct sk_buff *skb, struct net_device *net) +{ + struct eth_dev *dev = (struct eth_dev *) net->priv; + int length = skb->len; + int retval; + struct usb_request *req = 0; + + 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); + + /* no buffer copies needed, unless the network stack did it + * or the hardware can't use skb buffers. + */ + req->buf = skb->data; + req->context = skb; + req->complete = tx_complete; + +#ifdef CONFIG_USB_ETH_SA1100 + /* don't demand zlp (req->zero) support from all hardware */ + if ((length % dev->in_ep->maxpacket) == 0) + length++; +#else + /* use zlp framing on tx for strict CDC-Ether conformance, + * though any robust network rx path ignores extra padding. + */ + req->zero = 1; +#endif + req->length = length; + +#ifdef HIGHSPEED + /* throttle highspeed IRQ rate back slightly */ + req->no_interrupt = (dev->gadget->speed == USB_SPEED_HIGH) + ? ((atomic_read (&dev->tx_qlen) % TX_DELAY) != 0) + : 0; +#endif + + retval = usb_ep_queue (dev->in_ep, req, GFP_ATOMIC); + switch (retval) { + default: + DEBUG (dev, "tx queue err %d\n", retval); + break; + case 0: + net->trans_start = jiffies; + atomic_inc (&dev->tx_qlen); + } + + if (retval) { + dev->stats.tx_dropped++; + dev_kfree_skb_any (skb); + if (list_empty (&dev->tx_reqs)) + netif_start_queue (net); + list_add (&req->list, &dev->tx_reqs); + } + return 0; +} + +static void eth_start (struct eth_dev *dev, int gfp_flags) +{ + DEBUG (dev, "%s\n", __FUNCTION__); + + /* fill the rx queue */ + rx_fill (dev, gfp_flags); + + /* and open the tx floodgates */ + atomic_set (&dev->tx_qlen, 0); + netif_wake_queue (dev->net); +} + +static int eth_open (struct net_device *net) +{ + struct eth_dev *dev = (struct eth_dev *) net->priv; + + DEBUG (dev, "%s\n", __FUNCTION__); + if (netif_carrier_ok (dev->net)) + eth_start (dev, GFP_KERNEL); + return 0; +} + +static int eth_stop (struct net_device *net) +{ + struct eth_dev *dev = (struct eth_dev *) net->priv; + + DEBUG (dev, "%s\n", __FUNCTION__); + netif_stop_queue (net); + + DEBUG (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n", + dev->stats.rx_packets, dev->stats.tx_packets, + dev->stats.rx_errors, dev->stats.tx_errors + ); + + /* ensure there are no more active requests */ + if (dev->gadget->speed != USB_SPEED_UNKNOWN) { + usb_ep_disable (dev->in_ep); + usb_ep_disable (dev->out_ep); + if (netif_carrier_ok (dev->net)) { + DEBUG (dev, "host still using in/out endpoints\n"); + usb_ep_enable (dev->in_ep, dev->in); + usb_ep_enable (dev->out_ep, dev->out); + } +#ifdef EP_STATUS_NUM + usb_ep_disable (dev->status_ep); + usb_ep_enable (dev->status_ep, dev->status); +#endif + } + + return 0; +} + +/*-------------------------------------------------------------------------*/ + +static void +eth_unbind (struct usb_gadget *gadget) +{ + struct eth_dev *dev = get_gadget_data (gadget); + struct usb_request *req; + + DEBUG (dev, "unbind\n"); + + /* we've already been disconnected ... no i/o is active */ + if (dev->req) { + usb_ep_free_buffer (gadget->ep0, + dev->req->buf, dev->req->dma, + USB_BUFSIZ); + usb_ep_free_request (gadget->ep0, dev->req); + dev->req = 0; + } + + while (!list_empty (&dev->tx_reqs)) { + req = container_of (dev->tx_reqs.next, + struct usb_request, list); + list_del (&req->list); + usb_ep_free_request (dev->in_ep, req); + } + while (!list_empty (&dev->rx_reqs)) { + req = container_of (dev->rx_reqs.next, + struct usb_request, list); + list_del (&req->list); + usb_ep_free_request (dev->out_ep, req); + } + + unregister_netdev (dev->net); + dev_put (dev->net); + + /* assuming we used keventd, it must quiesce too */ + flush_scheduled_work (); + set_gadget_data (gadget, 0); +} + +static int +eth_bind (struct usb_gadget *gadget) +{ + struct eth_dev *dev; + struct net_device *net; + int status = -ENOMEM; +#ifdef DEV_CONFIG_CDC + u8 node_id [ETH_ALEN]; + + /* just one upstream link at a time */ + if (ethaddr [0] != 0) + return -ENODEV; +#endif + + net = alloc_etherdev (sizeof *dev); + if (!net) + return status; + dev = net->priv; + spin_lock_init (&dev->lock); + INIT_WORK (&dev->work, eth_work, dev); + INIT_LIST_HEAD (&dev->tx_reqs); + INIT_LIST_HEAD (&dev->rx_reqs); + + /* 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. + */ + get_random_bytes (net->dev_addr, ETH_ALEN); + net->dev_addr [0] &= 0xfe; // clear multicast bit + net->dev_addr [0] |= 0x02; // set local assignment bit (IEEE802) + +#ifdef DEV_CONFIG_CDC + /* ... another address for the host, on the other end of the + * link, gets exported through CDC (see CDC spec table 41) + */ + get_random_bytes (node_id, sizeof node_id); + node_id [0] &= 0xfe; // clear multicast bit + node_id [0] |= 0x02; // set local assignment bit (IEEE802) + snprintf (ethaddr, sizeof ethaddr, "%02X%02X%02X%02X%02X%02X", + node_id [0], node_id [1], node_id [2], + node_id [3], node_id [4], node_id [5]); +#endif + + net->change_mtu = eth_change_mtu; + net->get_stats = eth_get_stats; + net->hard_start_xmit = eth_start_xmit; + net->open = eth_open; + net->stop = eth_stop; + // watchdog_timeo, tx_timeout ... + // set_multicast_list + net->do_ioctl = eth_ioctl; + + /* preallocate control response and buffer */ + dev->req = usb_ep_alloc_request (gadget->ep0, GFP_KERNEL); + if (!dev->req) + goto fail; + dev->req->complete = eth_setup_complete; + dev->req->buf = usb_ep_alloc_buffer (gadget->ep0, USB_BUFSIZ, + &dev->req->dma, GFP_KERNEL); + if (!dev->req->buf) { + usb_ep_free_request (gadget->ep0, dev->req); + goto fail; + } + + /* finish hookup to lower layer ... */ + dev->gadget = gadget; + set_gadget_data (gadget, dev); + gadget->ep0->driver_data = dev; + INFO (dev, "%s, " CHIP ", version: " DRIVER_VERSION "\n", driver_desc); +#ifdef DEV_CONFIG_CDC + INFO (dev, "CDC host enet %s\n", ethaddr); +#endif + + /* two kinds of host-initiated state changes: + * - iff DATA transfer is active, carrier is "on" + * - tx queueing enabled if open *and* carrier is "on" + */ + netif_stop_queue (dev->net); + netif_carrier_off (dev->net); + + // SET_NETDEV_DEV (dev->net, &gadget->dev); + status = register_netdev (dev->net); + if (status == 0) + return status; +fail: + eth_unbind (gadget); + return status; +} + +/*-------------------------------------------------------------------------*/ + +static struct usb_gadget_driver eth_driver = { +#ifdef HIGHSPEED + .speed = USB_SPEED_HIGH, +#else + .speed = USB_SPEED_FULL, +#endif + .function = (char *) driver_desc, + .bind = eth_bind, + .unbind = eth_unbind, + + .setup = eth_setup, + .disconnect = eth_disconnect, + + .driver = { + .name = (char *) shortname, + // .shutdown = ... + // .suspend = ... + // .resume = ... + }, +}; + +MODULE_DESCRIPTION (DRIVER_DESC); +MODULE_AUTHOR ("David Brownell"); +MODULE_LICENSE ("GPL"); + + +static int __init init (void) +{ + return usb_gadget_register_driver (ð_driver); +} +module_init (init); + +static void __exit cleanup (void) +{ + usb_gadget_unregister_driver (ð_driver); +} +module_exit (cleanup); + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/gadget/net2280.c linux-2.4.23-pre8/drivers/usb/gadget/net2280.c --- linux-2.4.22/drivers/usb/gadget/net2280.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/gadget/net2280.c 2003-10-22 22:48:17.000000000 +0000 @@ -0,0 +1,2731 @@ +/* + * Driver for the NetChip 2280 USB device controller. + * Specs and errata are available from . + * + * NetChip Technology Inc. supported the development of this driver. + * + * + * CODE STATUS HIGHLIGHTS + * + * Used with a gadget driver like "zero.c" this enumerates fine to Windows + * or Linux hosts; handles disconnect, reconnect, and reset, for full or + * high speed operation; and passes USB-IF "chapter 9" tests. + * + * Handles standard stress loads from the Linux "usbtest" driver, with + * either DMA (default) or PIO (use_dma=n) used for ep-{a,b,c,d}. Testing + * with "ttcp" (and the "ether.c" driver) behaves nicely too. + * + * DMA is enabled by default. Drivers using transfer queues might use + * DMA chaining to remove IRQ latencies between transfers. (Except when + * short OUT transfers happen.) Drivers can use the req->no_interrupt + * hint to completely eliminate some IRQs, if a later IRQ is guaranteed + * and DMA chaining is enabled. + * + * Note that almost all the errata workarounds here are only needed for + * rev1 chips. Rev1a silicon (0110) fixes almost all of them. + */ + +#define USE_DMA_CHAINING + + +/* + * Copyright (C) 2003 David Brownell + * Copyright (C) 2003 NetChip Technologies + * + * 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 DEBUG 1 +// #define VERBOSE /* extra debug messages (success too) */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + + +#define DRIVER_DESC "NetChip 2280 USB Peripheral Controller" +#define DRIVER_VERSION "Bastille Day 2003" + +#define DMA_ADDR_INVALID (~(dma_addr_t)0) +#define EP_DONTUSE 13 /* nonzero */ + +#define USE_RDK_LEDS /* GPIO pins control three LEDs */ + + +static const char driver_name [] = "net2280"; +static const char driver_desc [] = DRIVER_DESC; + +static const char ep0name [] = "ep0"; +static const char *ep_name [] = { + ep0name, + "ep-a", "ep-b", "ep-c", "ep-d", + "ep-e", "ep-f", +}; + +static int use_dma = 1; + +/* mode 0 == ep-{a,b,c,d} 1K fifo each + * mode 1 == ep-{a,b} 2K fifo each, ep-{c,d} unavailable + * mode 2 == ep-a 2K fifo, ep-{b,c} 1K each, ep-d unavailable + */ +static ushort fifo_mode = 0; + +MODULE_PARM (use_dma, "i"); +MODULE_PARM_DESC (use_dma, "true to use dma controllers"); + +MODULE_PARM (fifo_mode, "h"); +MODULE_PARM_DESC (fifo_mode, "net2280 fifo mode"); + + +#define DIR_STRING(bAddress) (((bAddress) & USB_DIR_IN) ? "in" : "out") + +#if defined(USE_SYSFS_DEBUG_FILES) || defined (DEBUG) +static char *type_string (u8 bmAttributes) +{ + switch ((bmAttributes) & USB_ENDPOINT_XFERTYPE_MASK) { + case USB_ENDPOINT_XFER_BULK: return "bulk"; + case USB_ENDPOINT_XFER_ISOC: return "iso"; + case USB_ENDPOINT_XFER_INT: return "intr"; + }; + return "control"; +} +#endif + +#include "net2280.h" + +#define valid_bit __constant_cpu_to_le32 (1 << VALID_BIT) +#define dma_done_ie __constant_cpu_to_le32 (1 << DMA_DONE_INTERRUPT_ENABLE) + +/*-------------------------------------------------------------------------*/ + +static int +net2280_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) +{ + struct net2280 *dev; + struct net2280_ep *ep; + u32 max, tmp; + unsigned long flags; + + ep = container_of (_ep, struct net2280_ep, ep); + if (!_ep || !desc || ep->desc || _ep->name == ep0name + || desc->bDescriptorType != USB_DT_ENDPOINT) + return -EINVAL; + dev = ep->dev; + if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) + return -ESHUTDOWN; + + /* erratum 0119 workaround ties up an endpoint number */ + if ((desc->bEndpointAddress & 0x0f) == EP_DONTUSE) + return -EDOM; + + /* sanity check ep-e/ep-f since their fifos are small */ + max = le16_to_cpu (desc->wMaxPacketSize) & 0x1fff; + if (ep->num > 4 && max > 64) + return -ERANGE; + + spin_lock_irqsave (&dev->lock, flags); + _ep->maxpacket = max & 0x7ff; + ep->desc = desc; + + /* ep_reset() has already been called */ + ep->stopped = 0; + + /* set speed-dependent max packet; may kick in high bandwidth */ + set_idx_reg (dev->regs, REG_EP_MAXPKT (dev, ep->num), max); + + /* FIFO lines can't go to different packets. PIO is ok, so + * use it instead of troublesome (non-bulk) multi-packet DMA. + */ + if (ep->is_in && ep->dma && (max % 4) != 0) { + DEBUG (ep->dev, "%s, no IN dma for maxpacket %d\n", + ep->ep.name, ep->ep.maxpacket); + ep->dma = 0; + } + + /* set type, direction, address; reset fifo counters */ + writel ((1 << FIFO_FLUSH), &ep->regs->ep_stat); + tmp = (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK); + if (tmp == USB_ENDPOINT_XFER_INT) { + /* not just because of erratum 0105; avoid ever + * kicking in the "toggle-irrelevant" mode. + */ + tmp = USB_ENDPOINT_XFER_BULK; + } else if (tmp == USB_ENDPOINT_XFER_BULK) { + /* catch some particularly blatant driver bugs */ + if ((dev->gadget.speed == USB_SPEED_HIGH + && max != 512) + || (dev->gadget.speed == USB_SPEED_FULL + && max > 64)) + return -ERANGE; + } + ep->is_iso = (tmp == USB_ENDPOINT_XFER_ISOC) ? 1 : 0; + tmp <<= ENDPOINT_TYPE; + tmp |= desc->bEndpointAddress; + tmp |= (4 << ENDPOINT_BYTE_COUNT); /* default full fifo lines */ + tmp |= 1 << ENDPOINT_ENABLE; + wmb (); + + /* for OUT transfers, block the rx fifo until a read is posted */ + ep->is_in = (tmp & USB_DIR_IN) != 0; + if (!ep->is_in) + writel ((1 << SET_NAK_OUT_PACKETS), &ep->regs->ep_rsp); + + writel (tmp, &ep->regs->ep_cfg); + +#ifdef NET2280_DMA_OUT_WORKAROUND + if (!ep->is_in) + ep->dma = 0; +#endif + + /* enable irqs */ + if (!ep->dma) { /* pio, per-packet */ + tmp = (1 << ep->num) | readl (&dev->regs->pciirqenb0); + writel (tmp, &dev->regs->pciirqenb0); + + tmp = (1 << DATA_PACKET_RECEIVED_INTERRUPT_ENABLE) + | (1 << DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE) + | readl (&ep->regs->ep_irqenb); + writel (tmp, &ep->regs->ep_irqenb); + } else { /* dma, per-request */ + tmp = (1 << (8 + ep->num)); /* completion */ + tmp |= readl (&dev->regs->pciirqenb1); + writel (tmp, &dev->regs->pciirqenb1); + + /* for short OUT transfers, dma completions can't + * advance the queue; do it pio-style, by hand. + * NOTE erratum 0112 workaround #2 + */ + if ((desc->bEndpointAddress & USB_DIR_IN) == 0) { + tmp = (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT_ENABLE); + writel (tmp, &ep->regs->ep_irqenb); + + tmp = (1 << ep->num) | readl (&dev->regs->pciirqenb0); + writel (tmp, &dev->regs->pciirqenb0); + } + } + + tmp = desc->bEndpointAddress; + DEBUG (dev, "enabled %s (ep%d%s-%s) %s max %04x\n", + _ep->name, tmp & 0x0f, DIR_STRING (tmp), + type_string (desc->bmAttributes), + ep->dma ? "dma" : "pio", max); + + /* pci writes may still be posted */ + spin_unlock_irqrestore (&dev->lock, flags); + return 0; +} + +static int handshake (u32 *ptr, u32 mask, u32 done, int usec) +{ + u32 result; + + do { + result = readl (ptr); + if (result == ~(u32)0) /* "device unplugged" */ + return -ENODEV; + result &= mask; + if (result == done) + return 0; + udelay (1); + usec--; + } while (usec > 0); + return -ETIMEDOUT; +} + +static struct usb_ep_ops net2280_ep_ops; + +static void ep_reset (struct net2280_regs *regs, struct net2280_ep *ep) +{ + u32 tmp; + + ep->desc = 0; + INIT_LIST_HEAD (&ep->queue); + + ep->ep.maxpacket = ~0; + ep->ep.ops = &net2280_ep_ops; + + /* disable the dma, irqs, endpoint... */ + if (ep->dma) { + writel (0, &ep->dma->dmactl); + writel ( (1 << DMA_SCATTER_GATHER_DONE_INTERRUPT) + | (1 << DMA_TRANSACTION_DONE_INTERRUPT) + | (1 << DMA_ABORT) + , &ep->dma->dmastat); + + tmp = readl (®s->pciirqenb0); + tmp &= ~(1 << ep->num); + writel (tmp, ®s->pciirqenb0); + } else { + tmp = readl (®s->pciirqenb1); + tmp &= ~(1 << (8 + ep->num)); /* completion */ + writel (tmp, ®s->pciirqenb1); + } + writel (0, &ep->regs->ep_irqenb); + + /* init to our chosen defaults, notably so that we NAK OUT + * packets until the driver queues a read (+note erratum 0112) + */ + writel ( (1 << SET_NAK_OUT_PACKETS_MODE) + | (1 << SET_NAK_OUT_PACKETS) + | (1 << CLEAR_EP_HIDE_STATUS_PHASE) + | (1 << CLEAR_INTERRUPT_MODE) + | (1 << CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE) + | (1 << CLEAR_ENDPOINT_TOGGLE) + | (1 << CLEAR_ENDPOINT_HALT) + , &ep->regs->ep_rsp); + + /* scrub most status bits, and flush any fifo state */ + writel ( (1 << TIMEOUT) + | (1 << USB_STALL_SENT) + | (1 << USB_IN_NAK_SENT) + | (1 << USB_IN_ACK_RCVD) + | (1 << USB_OUT_PING_NAK_SENT) + | (1 << USB_OUT_ACK_SENT) + | (1 << FIFO_OVERFLOW) + | (1 << FIFO_UNDERFLOW) + | (1 << FIFO_FLUSH) + | (1 << SHORT_PACKET_OUT_DONE_INTERRUPT) + | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) + | (1 << DATA_PACKET_RECEIVED_INTERRUPT) + | (1 << DATA_PACKET_TRANSMITTED_INTERRUPT) + | (1 << DATA_OUT_PING_TOKEN_INTERRUPT) + | (1 << DATA_IN_TOKEN_INTERRUPT) + , &ep->regs->ep_stat); + + /* fifo size is handled separately */ +} + +static void nuke (struct net2280_ep *); + +static int net2280_disable (struct usb_ep *_ep) +{ + struct net2280_ep *ep; + unsigned long flags; + + ep = container_of (_ep, struct net2280_ep, ep); + if (!_ep || !ep->desc || _ep->name == ep0name) + return -EINVAL; + + spin_lock_irqsave (&ep->dev->lock, flags); + nuke (ep); + ep_reset (ep->dev->regs, ep); + + VDEBUG (ep->dev, "disabled %s %s\n", + ep->dma ? "dma" : "pio", _ep->name); + + /* synch memory views with the device */ + (void) readl (&ep->regs->ep_cfg); + + if (use_dma && !ep->dma && ep->num >= 1 && ep->num <= 4) + ep->dma = &ep->dev->dma [ep->num - 1]; + + spin_unlock_irqrestore (&ep->dev->lock, flags); + return 0; +} + +/*-------------------------------------------------------------------------*/ + +static struct usb_request * +net2280_alloc_request (struct usb_ep *_ep, int gfp_flags) +{ + struct net2280_ep *ep; + struct net2280_request *req; + + if (!_ep) + return 0; + ep = container_of (_ep, struct net2280_ep, ep); + + req = kmalloc (sizeof *req, gfp_flags); + if (!req) + return 0; + + memset (req, 0, sizeof *req); + req->req.dma = DMA_ADDR_INVALID; + INIT_LIST_HEAD (&req->queue); + + /* this dma descriptor may be swapped with the previous dummy */ + if (ep->dma) { + struct net2280_dma *td; + + td = pci_pool_alloc (ep->dev->requests, gfp_flags, + &req->td_dma); + if (!td) { + kfree (req); + return 0; + } + td->dmacount = 0; /* not VALID */ + td->dmaaddr = __constant_cpu_to_le32 (DMA_ADDR_INVALID); + req->td = td; + } + return &req->req; +} + +static void +net2280_free_request (struct usb_ep *_ep, struct usb_request *_req) +{ + struct net2280_ep *ep; + struct net2280_request *req; + + ep = container_of (_ep, struct net2280_ep, ep); + if (!_ep || !_req) + return; + + req = container_of (_req, struct net2280_request, req); + WARN_ON (!list_empty (&req->queue)); + if (req->td) + pci_pool_free (ep->dev->requests, req->td, req->td_dma); + kfree (req); +} + +/*-------------------------------------------------------------------------*/ + +#undef USE_KMALLOC + +/* many common platforms have dma-coherent caches, which means that it's + * safe to use kmalloc() memory for all i/o buffers without using any + * cache flushing calls. (unless you're trying to share cache lines + * between dma and non-dma activities, which is a slow idea in any case.) + * + * other platforms need more care, with 2.5 having a moderately general + * solution (which falls down for allocations smaller than one page) + * that improves significantly on the 2.4 PCI allocators by removing + * the restriction that memory never be freed in_interrupt(). + */ +#if defined(CONFIG_X86) +#define USE_KMALLOC + +#elif defined(CONFIG_PPC) && !defined(CONFIG_NOT_COHERENT_CACHE) +#define USE_KMALLOC + +/* FIXME there are other cases, including an x86-64 one ... */ +#endif + +/* allocating buffers this way eliminates dma mapping overhead, which + * on some platforms will mean eliminating a per-io buffer copy. with + * some kinds of system caches, further tweaks may still be needed. + */ +static void * +net2280_alloc_buffer ( + struct usb_ep *_ep, + unsigned bytes, + dma_addr_t *dma, + int gfp_flags +) +{ + void *retval; + struct net2280_ep *ep; + + ep = container_of (_ep, struct net2280_ep, ep); + if (!_ep) + return 0; + + *dma = DMA_ADDR_INVALID; + if (ep->dma) { +#if defined(USE_KMALLOC) + retval = kmalloc (bytes, gfp_flags); + if (retval) + *dma = virt_to_phys (retval); + +#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,5,58) +#warning Using dma_alloc_consistent even with sub-page allocations + /* the main problem with this call is that it wastes memory + * on typical 1/N page allocations: it allocates 1-N pages. + */ + retval = dma_alloc_coherent (&ep->dev->pdev->dev, + bytes, dma, gfp_flags); +#else +#error No dma-coherent memory allocator is available + /* pci_alloc_consistent works, but pci_free_consistent() + * isn't safe in_interrupt(). plus, in addition to the + * 1/Nth page weakness, it doesn't understand gfp_flags. + */ +#endif + } else + retval = kmalloc (bytes, gfp_flags); + + return retval; +} + +static void +net2280_free_buffer ( + struct usb_ep *_ep, + void *buf, + dma_addr_t dma, + unsigned bytes +) { + /* free memory into the right allocator */ +#ifndef USE_KMALLOC + if (dma != DMA_ADDR_INVALID) + dma_free_coherent (ep->dev->pdev, bytes, dma); + else +#endif + kfree (buf); +} + +/*-------------------------------------------------------------------------*/ + +/* load a packet into the fifo we use for usb IN transfers. + * works for all endpoints. + * + * NOTE: pio with ep-a..ep-d could stuff multiple packets into the fifo + * at a time, but this code is simpler because it knows it only writes + * one packet. ep-a..ep-d should use dma instead. + */ +static void +write_fifo (struct net2280_ep *ep, struct usb_request *req) +{ + struct net2280_ep_regs *regs = ep->regs; + u8 *buf; + u32 tmp; + unsigned count, total; + + /* INVARIANT: fifo is currently empty. (testable) */ + + if (req) { + buf = req->buf + req->actual; + prefetch (buf); + total = req->length - req->actual; + } else { + total = 0; + buf = 0; + } + + /* write just one packet at a time */ + count = min (ep->ep.maxpacket, total); + VDEBUG (ep->dev, "write %s fifo (IN) %d bytes%s req %p\n", + ep->ep.name, count, + (count != ep->ep.maxpacket) ? " (short)" : "", + req); + while (count >= 4) { + /* NOTE be careful if you try to align these. fifo lines + * should normally be full (4 bytes) and successive partial + * lines are ok only in certain cases. + */ + tmp = get_unaligned ((u32 *)buf); + cpu_to_le32s (&tmp); + writel (tmp, ®s->ep_data); + buf += 4; + count -= 4; + } + + /* last fifo entry is "short" unless we wrote a full packet */ + if (total < ep->ep.maxpacket) { + tmp = count ? get_unaligned ((u32 *)buf) : count; + cpu_to_le32s (&tmp); + set_fifo_bytecount (ep, count & 0x03); + writel (tmp, ®s->ep_data); + } + + /* pci writes may still be posted */ +} + +/* work around erratum 0106: PCI and USB race over the OUT fifo. + * caller guarantees chiprev 0100, out endpoint is NAKing, and + * there's no real data in the fifo. + */ +static void out_flush (struct net2280_ep *ep) +{ + u32 *statp, tmp; + + ASSERT_OUT_NAKING (ep); + + statp = &ep->regs->ep_stat; + writel ( (1 << DATA_OUT_PING_TOKEN_INTERRUPT) + | (1 << DATA_PACKET_RECEIVED_INTERRUPT) + , statp); + writel ((1 << FIFO_FLUSH), statp); + mb (); + tmp = readl (statp); + if (tmp & (1 << DATA_OUT_PING_TOKEN_INTERRUPT) + /* high speed did bulk NYET; fifo isn't filling */ + && ep->dev->gadget.speed == USB_SPEED_FULL) { + unsigned usec; + + usec = 50; /* 64 byte bulk/interrupt */ + handshake (statp, (1 << USB_OUT_PING_NAK_SENT), + (1 << USB_OUT_PING_NAK_SENT), usec); + /* NAK done; now CLEAR_NAK_OUT_PACKETS is safe */ + } +} + +/* unload packet(s) from the fifo we use for usb OUT transfers. + * returns true iff the request completed, because of short packet + * or the request buffer having filled with full packets. + * + * for ep-a..ep-d this will read multiple packets out when they + * have been accepted. + */ +static int +read_fifo (struct net2280_ep *ep, struct net2280_request *req) +{ + struct net2280_ep_regs *regs = ep->regs; + u8 *buf = req->req.buf + req->req.actual; + unsigned count, tmp, is_short; + unsigned cleanup = 0, prevent = 0; + + /* erratum 0106 ... packets coming in during fifo reads might + * be incompletely rejected. not all cases have workarounds. + */ + if (ep->dev->chiprev == 0x0100) { + tmp = readl (&ep->regs->ep_stat); + if ((tmp & (1 << NAK_OUT_PACKETS))) + /* cleanup = 1 */; + else if ((tmp & (1 << FIFO_FULL)) + /* don't break hs PING protocol ... */ + || ep->dev->gadget.speed == USB_SPEED_FULL) { + start_out_naking (ep); + prevent = 1; + } + /* else: hope we don't see the problem */ + } + + /* never overflow the rx buffer. the fifo reads packets until + * it sees a short one; we might not be ready for them all. + */ + prefetchw (buf); + count = readl (®s->ep_avail); + tmp = req->req.length - req->req.actual; + if (count > tmp) { + /* as with DMA, data overflow gets flushed */ + if ((tmp % ep->ep.maxpacket) != 0) { + ERROR (ep->dev, + "%s out fifo %d bytes, expected %d\n", + ep->ep.name, count, tmp); + req->req.status = -EOVERFLOW; + cleanup = 1; + } + count = tmp; + } + req->req.actual += count; + + is_short = (count == 0) || ((count % ep->ep.maxpacket) != 0); + + VDEBUG (ep->dev, "read %s fifo (OUT) %d bytes%s%s%s req %p %d/%d\n", + ep->ep.name, count, is_short ? " (short)" : "", + cleanup ? " flush" : "", prevent ? " nak" : "", + req, req->req.actual, req->req.length); + + while (count >= 4) { + tmp = readl (®s->ep_data); + cpu_to_le32s (&tmp); + put_unaligned (tmp, (u32 *)buf); + buf += 4; + count -= 4; + } + if (count) { + tmp = readl (®s->ep_data); + cpu_to_le32s (&tmp); + do { + *buf++ = (u8) tmp; + tmp >>= 8; + } while (--count); + } + if (cleanup) + out_flush (ep); + if (prevent) { + writel ((1 << CLEAR_NAK_OUT_PACKETS), &ep->regs->ep_rsp); + (void) readl (&ep->regs->ep_rsp); + } + + return is_short || ((req->req.actual == req->req.length) + && !req->req.zero); +} + +/* fill out dma descriptor to match a given request */ +static inline void +fill_dma_desc (struct net2280_ep *ep, struct net2280_request *req, int valid) +{ + struct net2280_dma *td = req->td; + u32 dmacount = req->req.length; + + /* don't let DMA continue after a short OUT packet, + * so overruns can't affect the next transfer. + * in case of overruns on max-size packets, we can't + * stop the fifo from filling but we can flush it. + */ + if (ep->is_in) + dmacount |= (1 << DMA_DIRECTION); + else + dmacount |= (1 << END_OF_CHAIN); + + req->valid = valid; + if (valid) + dmacount |= (1 << VALID_BIT); +#ifdef USE_DMA_CHAINING + if (!req->req.no_interrupt) +#endif + dmacount |= (1 << DMA_DONE_INTERRUPT_ENABLE); + + /* td->dmadesc = previously set by caller */ + td->dmaaddr = cpu_to_le32p (&req->req.dma); + + /* 2280 may be polling VALID_BIT through ep->dma->dmadesc */ + wmb (); + td->dmacount = cpu_to_le32p (&dmacount); +} + +static const u32 dmactl_default = + (1 << DMA_CLEAR_COUNT_ENABLE) + /* erratum 0116 workaround part 1 (use POLLING) */ + | (POLL_100_USEC << DESCRIPTOR_POLLING_RATE) + | (1 << DMA_VALID_BIT_POLLING_ENABLE) + | (1 << DMA_VALID_BIT_ENABLE) + | (1 << DMA_SCATTER_GATHER_ENABLE) + /* erratum 0116 workaround part 2 (no AUTOSTART) */ + | (1 << DMA_ENABLE); + +static inline void spin_stop_dma (struct net2280_dma_regs *dma) +{ + handshake (&dma->dmactl, (1 << DMA_ENABLE), 0, 50); +} + +static inline void stop_dma (struct net2280_dma_regs *dma) +{ + writel (dmactl_default & ~(1 << DMA_ENABLE), &dma->dmactl); + spin_stop_dma (dma); +} + +static void start_dma (struct net2280_ep *ep, struct net2280_request *req) +{ + u32 tmp; + int clear_nak = 0; + struct net2280_dma_regs *dma = ep->dma; + + /* FIXME can't use DMA for ZLPs */ + + /* previous OUT packet might have been short */ + if (!ep->is_in && ((tmp = readl (&ep->regs->ep_stat)) + & (1 << NAK_OUT_PACKETS)) != 0) { + writel ((1 << SHORT_PACKET_TRANSFERRED_INTERRUPT), + &ep->regs->ep_stat); + + tmp = readl (&ep->regs->ep_avail); + if (tmp == 0) + clear_nak = 1; + else { + /* transfer all/some fifo data */ + writel (req->req.dma, &dma->dmaaddr); + tmp = min (tmp, req->req.length); + + /* dma irq, faking scatterlist status */ + req->td->dmacount = cpu_to_le32 (req->req.length - tmp); + writel ((1 << DMA_DONE_INTERRUPT_ENABLE) + | tmp, &dma->dmacount); + + writel ((1 << DMA_ENABLE), &dma->dmactl); + writel ((1 << DMA_START), &dma->dmastat); + return; + } + } + + /* on this path we know there's no dma queue (yet) */ + WARN_ON (readl (&dma->dmactl) & (1 << DMA_ENABLE)); + tmp = dmactl_default; + + /* force packet boundaries between dma requests, but prevent the + * controller from automagically writing a last "short" packet + * (zero length) unless the driver explicitly said to do that. + */ + if (ep->is_in) { + if (likely ((req->req.length % ep->ep.maxpacket) != 0 + || req->req.zero)) { + tmp |= (1 << DMA_FIFO_VALIDATE); + ep->in_fifo_validate = 1; + } else + ep->in_fifo_validate = 0; + } + + /* init req->td, pointing to the current dummy */ + req->td->dmadesc = cpu_to_le32 (ep->td_dma); + fill_dma_desc (ep, req, 1); + +#ifdef USE_DMA_CHAINING + writel ( (1 << VALID_BIT) + | (ep->is_in << DMA_DIRECTION) + | 0, &dma->dmacount); +#else + req->td->dmacount |= __constant_cpu_to_le32 (1 << END_OF_CHAIN); +#endif + + writel (req->td_dma, &dma->dmadesc); + writel (tmp, &dma->dmactl); + + /* erratum 0116 workaround part 3: pci arbiter away from net2280 */ + (void) readl (&ep->dev->pci->pcimstctl); + + writel ((1 << DMA_START), &dma->dmastat); + + /* recover from previous short read; erratum 0112 workaround #1 */ + if (clear_nak) + writel ((1 << CLEAR_NAK_OUT_PACKETS), &ep->regs->ep_rsp); +} + +static inline void +queue_dma (struct net2280_ep *ep, struct net2280_request *req, int valid) +{ + struct net2280_dma *end; + dma_addr_t tmp; + + /* swap new dummy for old, link; fill and maybe activate */ + end = ep->dummy; + ep->dummy = req->td; + req->td = end; + + tmp = ep->td_dma; + ep->td_dma = req->td_dma; + req->td_dma = tmp; + + end->dmadesc = cpu_to_le32 (ep->td_dma); + + fill_dma_desc (ep, req, valid); +} + +static void +done (struct net2280_ep *ep, struct net2280_request *req, int status) +{ + struct net2280 *dev; + unsigned stopped = ep->stopped; + + list_del_init (&req->queue); + + if (req->req.status == -EINPROGRESS) + req->req.status = status; + else + status = req->req.status; + + dev = ep->dev; + if (req->mapped) { + pci_unmap_single (dev->pdev, req->req.dma, req->req.length, + ep->is_in ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); + req->req.dma = DMA_ADDR_INVALID; + req->mapped = 0; + } + + if (status && status != -ESHUTDOWN) + VDEBUG (dev, "complete %s req %p stat %d len %u/%u\n", + ep->ep.name, &req->req, status, + req->req.actual, req->req.length); + + /* don't modify queue heads during completion callback */ + ep->stopped = 1; + spin_unlock (&dev->lock); + req->req.complete (&ep->ep, &req->req); + spin_lock (&dev->lock); + ep->stopped = stopped; +} + +/*-------------------------------------------------------------------------*/ + +static int +net2280_queue (struct usb_ep *_ep, struct usb_request *_req, int gfp_flags) +{ + struct net2280_request *req; + struct net2280_ep *ep; + struct net2280 *dev; + unsigned long flags; + + /* we always require a cpu-view buffer, so that we can + * always use pio (as fallback or whatever). + */ + req = container_of (_req, struct net2280_request, req); + if (!_req || !_req->complete || !_req->buf + || !list_empty (&req->queue)) + return -EINVAL; + if (_req->length > (~0 & DMA_BYTE_COUNT_MASK)) + return -EDOM; + ep = container_of (_ep, struct net2280_ep, ep); + if (!_ep || (!ep->desc && ep->num != 0)) + return -EINVAL; + dev = ep->dev; + if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) + return -ESHUTDOWN; + + /* FIXME implement PIO fallback for ZLPs with DMA */ + if (ep->dma && _req->length == 0) + return -EOPNOTSUPP; + + /* set up dma mapping in case the caller didn't */ + if (ep->dma && _req->dma == DMA_ADDR_INVALID) { + _req->dma = pci_map_single (dev->pdev, _req->buf, _req->length, + ep->is_in ? PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE); + req->mapped = 1; + } + +#if 0 + VDEBUG (dev, "%s queue req %p, len %d buf %p\n", + _ep->name, _req, _req->length, _req->buf); +#endif + + spin_lock_irqsave (&dev->lock, flags); + + _req->status = -EINPROGRESS; + _req->actual = 0; + req->dma_done = 0; + + /* kickstart this i/o queue? */ + if (list_empty (&ep->queue) && !ep->stopped) { + /* use DMA if the endpoint supports it, else pio */ + if (ep->dma) + start_dma (ep, req); + else { + /* maybe there's no control data, just status ack */ + if (ep->num == 0 && _req->length == 0) { + allow_status (ep); + done (ep, req, 0); + VDEBUG (dev, "%s status ack\n", ep->ep.name); + goto done; + } + + /* PIO ... stuff the fifo, or unblock it. */ + if (ep->is_in) + write_fifo (ep, _req); + else if (list_empty (&ep->queue)) { + u32 s; + + /* OUT FIFO might have packet(s) buffered */ + s = readl (&ep->regs->ep_stat); + if ((s & (1 << FIFO_EMPTY)) == 0) { + /* note: _req->short_not_ok is + * ignored here since PIO _always_ + * stops queue advance here, and + * _req->status doesn't change for + * short reads (only _req->actual) + */ + if (read_fifo (ep, req)) { + done (ep, req, 0); + if (ep->num == 0) + allow_status (ep); + /* don't queue it */ + req = 0; + } else + s = readl (&ep->regs->ep_stat); + } + + /* don't NAK, let the fifo fill */ + if (req && (s & (1 << NAK_OUT_PACKETS))) + writel ((1 << CLEAR_NAK_OUT_PACKETS), + &ep->regs->ep_rsp); + } + } + + } else if (ep->dma) { + int valid = 1; + + if (ep->is_in) { + int expect; + + /* preventing magic zlps is per-engine state, not + * per-transfer; irq logic must recover hiccups. + */ + expect = likely (req->req.zero + || (req->req.length % ep->ep.maxpacket) != 0); + if (expect != ep->in_fifo_validate) + valid = 0; + } + queue_dma (ep, req, valid); + + } /* else the irq handler advances the queue. */ + + if (req) + list_add_tail (&req->queue, &ep->queue); +done: + spin_unlock_irqrestore (&dev->lock, flags); + + /* pci writes may still be posted */ + return 0; +} + +static inline void +dma_done ( + struct net2280_ep *ep, + struct net2280_request *req, + u32 dmacount, + int status +) +{ + req->req.actual = req->req.length - (DMA_BYTE_COUNT_MASK & dmacount); + rmb (); + done (ep, req, status); +} + +static void scan_dma_completions (struct net2280_ep *ep) +{ + /* only look at descriptors that were "naturally" retired, + * so fifo and list head state won't matter + */ + while (!list_empty (&ep->queue)) { + struct net2280_request *req; + u32 tmp; + + req = list_entry (ep->queue.next, + struct net2280_request, queue); + if (!req->valid) + break; + rmb (); + tmp = le32_to_cpup (&req->td->dmacount); + if ((tmp & (1 << VALID_BIT)) != 0) + break; + + /* SHORT_PACKET_TRANSFERRED_INTERRUPT handles "usb-short" + * packets, including overruns, even when the transfer was + * exactly the length requested (dmacount now zero). + * FIXME there's an overrun case here too, where we expect + * a short packet but receive a max length one (won't NAK). + */ + if (!ep->is_in && (req->req.length % ep->ep.maxpacket) != 0) { + req->dma_done = 1; + break; + } + dma_done (ep, req, tmp, 0); + } +} + +static void restart_dma (struct net2280_ep *ep) +{ + struct net2280_request *req; + + if (ep->stopped) + return; + req = list_entry (ep->queue.next, struct net2280_request, queue); + +#ifdef USE_DMA_CHAINING + /* the 2280 will be processing the queue unless queue hiccups after + * the previous transfer: + * IN: wanted automagic zlp, head doesn't (or vice versa) + * OUT: was "usb-short", we must restart. + */ + if (!req->valid) { + struct net2280_request *entry, *prev = 0; + int qmode, reqmode, done = 0; + + DEBUG (ep->dev, "%s dma hiccup td %p\n", ep->ep.name, req->td); + qmode = likely (req->req.zero + || (req->req.length % ep->ep.maxpacket) != 0); + list_for_each_entry (entry, &ep->queue, queue) { + u32 dmacount; + + if (entry != req) + continue; + dmacount = entry->td->dmacount; + if (!done) { + reqmode = likely (entry->req.zero + || (entry->req.length + % ep->ep.maxpacket) != 0); + if (reqmode == qmode) { + entry->valid = 1; + dmacount |= valid_bit; + entry->td->dmacount = dmacount; + prev = entry; + continue; + } else { + prev->td->dmacount |= dma_done_ie; + done = 1; + } + } + + /* walk the rest of the queue so unlinks behave */ + entry->valid = 0; + dmacount &= ~valid_bit; + entry->td->dmacount = dmacount; + prev = entry; + } + start_dma (ep, req); + } else if (!ep->is_in + && (readl (&ep->regs->ep_stat) + & (1 << NAK_OUT_PACKETS)) != 0) + start_dma (ep, req); +#else + start_dma (ep, req); +#endif +} + +static inline void abort_dma (struct net2280_ep *ep) +{ + /* abort the current transfer */ + writel ((1 << DMA_ABORT), &ep->dma->dmastat); + + /* collect completed transfers (except the current one) */ + scan_dma_completions (ep); +} + +/* dequeue ALL requests */ +static void nuke (struct net2280_ep *ep) +{ + struct net2280_request *req; + + /* called with spinlock held */ + ep->stopped = 1; + if (ep->dma) + abort_dma (ep); + while (!list_empty (&ep->queue)) { + req = list_entry (ep->queue.next, + struct net2280_request, + queue); + done (ep, req, -ESHUTDOWN); + } +} + +/* dequeue JUST ONE request */ +static int net2280_dequeue (struct usb_ep *_ep, struct usb_request *_req) +{ + struct net2280_ep *ep; + struct net2280_request *req; + unsigned long flags; + u32 dmactl; + int stopped; + + ep = container_of (_ep, struct net2280_ep, ep); + req = container_of (_req, struct net2280_request, req); + if (!_ep || (!ep->desc && ep->num != 0) || !_req) + return -EINVAL; + + spin_lock_irqsave (&ep->dev->lock, flags); + stopped = ep->stopped; + + /* pause dma while we scan the queue */ + dmactl = 0; + ep->stopped = 1; + if (ep->dma) { + dmactl = readl (&ep->dma->dmactl); + writel (dmactl & ~(1 << DMA_ENABLE), &ep->dma->dmactl); + /* force synch, clean any completed requests */ + spin_stop_dma (ep->dma); + scan_dma_completions (ep); + } + + /* queue head may be partially complete. */ + if (ep->queue.next == &req->queue) { + if (ep->dma) { + DEBUG (ep->dev, "unlink (%s) dma\n", _ep->name); + _req->status = -ECONNRESET; + abort_dma (ep); + if (likely (ep->queue.next == &req->queue)) + dma_done (ep, req, + le32_to_cpup (&req->td->dmacount), + -ECONNRESET); + } else { + DEBUG (ep->dev, "unlink (%s) pio\n", _ep->name); + done (ep, req, -ECONNRESET); + } + req = 0; + +#ifdef USE_DMA_CHAINING + /* patch up hardware chaining data */ + } else if (ep->dma) { + if (req->queue.prev == ep->queue.next) { + writel (le32_to_cpu (req->td->dmadesc), + &ep->dma->dmadesc); + if (req->td->dmacount & dma_done_ie) + writel (readl (&ep->dma->dmacount) + | dma_done_ie, + &ep->dma->dmacount); + } else { + struct net2280_request *prev; + + prev = list_entry (req->queue.prev, + struct net2280_request, queue); + prev->td->dmadesc = req->td->dmadesc; + if (req->td->dmacount & dma_done_ie) + prev->td->dmacount |= dma_done_ie; + } +#endif + } + + if (req) + done (ep, req, -ECONNRESET); + ep->stopped = stopped; + + if (ep->dma) { + /* turn off dma on inactive queues */ + if (list_empty (&ep->queue)) + stop_dma (ep->dma); + else if (!ep->stopped) { + /* resume current request, or start new one */ + if (req) + writel (dmactl, &ep->dma->dmactl); + else + start_dma (ep, list_entry (ep->queue.next, + struct net2280_request, queue)); + } + } + + spin_unlock_irqrestore (&ep->dev->lock, flags); + return req ? 0 : -EOPNOTSUPP; +} + +/*-------------------------------------------------------------------------*/ + +static int +net2280_set_halt (struct usb_ep *_ep, int value) +{ + struct net2280_ep *ep; + + ep = container_of (_ep, struct net2280_ep, ep); + if (!_ep || (!ep->desc && ep->num != 0)) + return -EINVAL; + if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) + return -ESHUTDOWN; + if (ep->desc /* not ep0 */ && (ep->desc->bmAttributes & 0x03) + == USB_ENDPOINT_XFER_ISOC) + return -EINVAL; + + VDEBUG (ep->dev, "%s %s halt\n", _ep->name, value ? "set" : "clear"); + + /* set/clear, then synch memory views with the device */ + if (value) { + if (ep->num == 0) + ep->dev->protocol_stall = 1; + else + set_halt (ep); + } else + clear_halt (ep); + (void) readl (&ep->regs->ep_rsp); + + return 0; +} + +static int +net2280_fifo_status (struct usb_ep *_ep) +{ + struct net2280_ep *ep; + u32 avail; + + ep = container_of (_ep, struct net2280_ep, ep); + if (!_ep || (!ep->desc && ep->num != 0)) + return -ENODEV; + if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) + return -ESHUTDOWN; + + avail = readl (&ep->regs->ep_avail) & ((1 << 12) - 1); + if (avail > ep->fifo_size) + return -EOVERFLOW; + if (ep->is_in) + avail = ep->fifo_size - avail; + return avail; +} + +static void +net2280_fifo_flush (struct usb_ep *_ep) +{ + struct net2280_ep *ep; + + ep = container_of (_ep, struct net2280_ep, ep); + if (!_ep || (!ep->desc && ep->num != 0)) + return; + if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) + return; + + writel ((1 << FIFO_FLUSH), &ep->regs->ep_stat); + (void) readl (&ep->regs->ep_rsp); +} + +static struct usb_ep_ops net2280_ep_ops = { + .enable = net2280_enable, + .disable = net2280_disable, + + .alloc_request = net2280_alloc_request, + .free_request = net2280_free_request, + + .alloc_buffer = net2280_alloc_buffer, + .free_buffer = net2280_free_buffer, + + .queue = net2280_queue, + .dequeue = net2280_dequeue, + + .set_halt = net2280_set_halt, + .fifo_status = net2280_fifo_status, + .fifo_flush = net2280_fifo_flush, +}; + +/*-------------------------------------------------------------------------*/ + +static int net2280_get_frame (struct usb_gadget *_gadget) +{ + struct net2280 *dev; + unsigned long flags; + u16 retval; + + if (!_gadget) + return -ENODEV; + dev = container_of (_gadget, struct net2280, gadget); + spin_lock_irqsave (&dev->lock, flags); + retval = get_idx_reg (dev->regs, REG_FRAME) & 0x03ff; + spin_unlock_irqrestore (&dev->lock, flags); + return retval; +} + +static int net2280_wakeup (struct usb_gadget *_gadget) +{ + struct net2280 *dev; + + if (!_gadget) + return 0; + dev = container_of (_gadget, struct net2280, gadget); + writel (1 << GENERATE_RESUME, &dev->usb->usbstat); + + /* pci writes may still be posted */ + return 0; +} + +static const struct usb_gadget_ops net2280_ops = { + .get_frame = net2280_get_frame, + .wakeup = net2280_wakeup, + + // .set_selfpowered = net2280_set_selfpowered, +}; + +/*-------------------------------------------------------------------------*/ + +#ifdef USE_SYSFS_DEBUG_FILES + +/* "function" sysfs attribute */ +static ssize_t +show_function (struct device *_dev, char *buf) +{ + struct net2280 *dev = dev_get_drvdata (_dev); + + if (!dev->driver + || !dev->driver->function + || strlen (dev->driver->function) > PAGE_SIZE) + return 0; + return snprintf (buf, PAGE_SIZE, "%s\n", dev->driver->function); +} +static DEVICE_ATTR (function, S_IRUGO, show_function, NULL); + +static ssize_t +show_registers (struct device *_dev, char *buf) +{ + struct net2280 *dev; + char *next; + unsigned size, t; + unsigned long flags; + int i; + u32 t1, t2; + char *s; + + dev = dev_get_drvdata (_dev); + next = buf; + size = PAGE_SIZE; + spin_lock_irqsave (&dev->lock, flags); + + if (dev->driver) + s = dev->driver->driver.name; + else + s = "(none)"; + + /* Main Control Registers */ + t = snprintf (next, size, "%s version " DRIVER_VERSION + ", chiprev %04x\n" + "devinit %03x fifoctl %08x gadget '%s'\n" + "pci irqenb0 %02x irqenb1 %08x " + "irqstat0 %04x irqstat1 %08x\n", + driver_name, dev->chiprev, + readl (&dev->regs->devinit), + readl (&dev->regs->fifoctl), + s, + readl (&dev->regs->pciirqenb0), + readl (&dev->regs->pciirqenb1), + readl (&dev->regs->irqstat0), + readl (&dev->regs->irqstat1)); + size -= t; + next += t; + + /* USB Control Registers */ + t1 = readl (&dev->usb->usbctl); + t2 = readl (&dev->usb->usbstat); + if (t1 & (1 << VBUS_PIN)) { + if (t2 & (1 << HIGH_SPEED)) + s = "high speed"; + else if (dev->gadget.speed == USB_SPEED_UNKNOWN) + s = "powered"; + else + s = "full speed"; + /* full speed bit (6) not working?? */ + } else + s = "not attached"; + t = snprintf (next, size, + "stdrsp %08x usbctl %08x usbstat %08x " + "addr 0x%02x (%s)\n", + readl (&dev->usb->stdrsp), t1, t2, + readl (&dev->usb->ouraddr), s); + size -= t; + next += t; + + /* PCI Master Control Registers */ + + /* DMA Control Registers */ + + /* Configurable EP Control Registers */ + for (i = 0; i < 7; i++) { + struct net2280_ep *ep; + + ep = &dev->ep [i]; + if (i && !ep->desc) + continue; + + t1 = readl (&ep->regs->ep_cfg); + t2 = readl (&ep->regs->ep_rsp) & 0xff; + t = snprintf (next, size, + "%s\tcfg %05x rsp (%02x) %s%s%s%s%s%s%s%s" + "irqenb %02x\n", + ep->ep.name, t1, t2, + (t2 & (1 << CLEAR_NAK_OUT_PACKETS)) + ? "NAK " : "", + (t2 & (1 << CLEAR_EP_HIDE_STATUS_PHASE)) + ? "hide " : "", + (t2 & (1 << CLEAR_EP_FORCE_CRC_ERROR)) + ? "CRC " : "", + (t2 & (1 << CLEAR_INTERRUPT_MODE)) + ? "interrupt " : "", + (t2 & (1<regs->ep_irqenb)); + size -= t; + next += t; + + t = snprintf (next, size, + "\tstat %08x avail %04x " + "(ep%d%s-%s)%s\n", + readl (&ep->regs->ep_stat), + readl (&ep->regs->ep_avail), + t1 & 0x0f, DIR_STRING (t1), + type_string (t1 >> 8), + ep->stopped ? "*" : ""); + size -= t; + next += t; + + if (!ep->dma) + continue; + + t = snprintf (next, size, + " dma\tctl %08x stat %08x count %08x\n" + "\taddr %08x desc %08x\n", + readl (&ep->dma->dmactl), + readl (&ep->dma->dmastat), + readl (&ep->dma->dmacount), + readl (&ep->dma->dmaaddr), + readl (&ep->dma->dmadesc)); + size -= t; + next += t; + + } + + /* Indexed Registers */ + // none yet + + /* Statistics */ + t = snprintf (next, size, "irqs: "); + size -= t; + next += t; + for (i = 0; i < 7; i++) { + struct net2280_ep *ep; + + ep = &dev->ep [i]; + if (i && !ep->irqs) + continue; + t = snprintf (next, size, " %s/%ld", ep->ep.name, ep->irqs); + size -= t; + next += t; + + } + t = snprintf (next, size, "\n"); + size -= t; + next += t; + + spin_unlock_irqrestore (&dev->lock, flags); + + return PAGE_SIZE - size; +} +static DEVICE_ATTR (registers, S_IRUGO, show_registers, NULL); + +static ssize_t +show_queues (struct device *_dev, char *buf) +{ + struct net2280 *dev; + char *next; + unsigned size; + unsigned long flags; + int i; + + dev = dev_get_drvdata (_dev); + next = buf; + size = PAGE_SIZE; + spin_lock_irqsave (&dev->lock, flags); + + for (i = 0; i < 7; i++) { + struct net2280_ep *ep = &dev->ep [i]; + struct net2280_request *req; + int t; + + if (i != 0) { + const struct usb_endpoint_descriptor *d; + + d = ep->desc; + if (!d) + continue; + t = d->bEndpointAddress; + t = snprintf (next, size, + "%s (ep%d%s-%s) max %04x %s\n", + ep->ep.name, t & USB_ENDPOINT_NUMBER_MASK, + (t & USB_DIR_IN) ? "in" : "out", + ({ char *val; + switch (d->bmAttributes & 0x03) { + case USB_ENDPOINT_XFER_BULK: + val = "bulk"; break; + case USB_ENDPOINT_XFER_INT: + val = "intr"; break; + default: + val = "iso"; break; + }; val; }), + le16_to_cpu (d->wMaxPacketSize) & 0x1fff, + ep->dma ? "dma" : "pio" + ); + } else /* ep0 should only have one transfer queued */ + t = snprintf (next, size, "ep0 max 64 pio %s\n", + ep->is_in ? "in" : "out"); + if (t <= 0 || t > size) + goto done; + size -= t; + next += t; + + if (list_empty (&ep->queue)) { + t = snprintf (next, size, "\t(nothing queued)\n"); + if (t <= 0 || t > size) + goto done; + size -= t; + next += t; + continue; + } + list_for_each_entry (req, &ep->queue, queue) { + if (ep->dma && req->td_dma == readl (&ep->dma->dmadesc)) + t = snprintf (next, size, + "\treq %p len %d/%d " + "buf %p (dmacount %08x)\n", + &req->req, req->req.actual, + req->req.length, req->req.buf, + readl (&ep->dma->dmacount)); + else + t = snprintf (next, size, + "\treq %p len %d/%d buf %p\n", + &req->req, req->req.actual, + req->req.length, req->req.buf); + if (t <= 0 || t > size) + goto done; + size -= t; + next += t; + } + } + +done: + spin_unlock_irqrestore (&dev->lock, flags); + return PAGE_SIZE - size; +} +static DEVICE_ATTR (queues, S_IRUGO, show_queues, NULL); + + +#else + +#define device_create_file(a,b) do {} while (0) +#define device_remove_file device_create_file + +#endif + +/*-------------------------------------------------------------------------*/ + +/* another driver-specific mode might be a request type doing dma + * to/from another device fifo instead of to/from memory. + */ + +static void set_fifo_mode (struct net2280 *dev, int mode) +{ + /* keeping high bits preserves BAR2 */ + writel ((0xffff << PCI_BASE2_RANGE) | mode, &dev->regs->fifoctl); + + /* always ep-{a,b,e,f} ... maybe not ep-c or ep-d */ + INIT_LIST_HEAD (&dev->gadget.ep_list); + list_add_tail (&dev->ep [1].ep.ep_list, &dev->gadget.ep_list); + list_add_tail (&dev->ep [2].ep.ep_list, &dev->gadget.ep_list); + switch (mode) { + case 0: + list_add_tail (&dev->ep [3].ep.ep_list, &dev->gadget.ep_list); + list_add_tail (&dev->ep [4].ep.ep_list, &dev->gadget.ep_list); + dev->ep [1].fifo_size = dev->ep [2].fifo_size = 1024; + break; + case 1: + dev->ep [1].fifo_size = dev->ep [2].fifo_size = 2048; + break; + case 2: + list_add_tail (&dev->ep [3].ep.ep_list, &dev->gadget.ep_list); + dev->ep [1].fifo_size = 2048; + dev->ep [2].fifo_size = 1024; + break; + } + /* fifo sizes for ep0, ep-c, ep-d, ep-e, and ep-f never change */ + list_add_tail (&dev->ep [5].ep.ep_list, &dev->gadget.ep_list); + list_add_tail (&dev->ep [6].ep.ep_list, &dev->gadget.ep_list); +} + +/** + * net2280_set_fifo_mode - change allocation of fifo buffers + * @gadget: access to the net2280 device that will be updated + * @mode: 0 for default, four 1kB buffers (ep-a through ep-d); + * 1 for two 2kB buffers (ep-a and ep-b only); + * 2 for one 2kB buffer (ep-a) and two 1kB ones (ep-b, ep-c). + * + * returns zero on success, else negative errno. when this succeeds, + * the contents of gadget->ep_list may have changed. + * + * you may only call this function when endpoints a-d are all disabled. + * use it whenever extra hardware buffering can help performance, such + * as before enabling "high bandwidth" interrupt endpoints that use + * maxpacket bigger than 512 (when double buffering would otherwise + * be unavailable). + */ +int net2280_set_fifo_mode (struct usb_gadget *gadget, int mode) +{ + int i; + struct net2280 *dev; + int status = 0; + unsigned long flags; + + if (!gadget) + return -ENODEV; + dev = container_of (gadget, struct net2280, gadget); + + spin_lock_irqsave (&dev->lock, flags); + + for (i = 1; i <= 4; i++) + if (dev->ep [i].desc) { + status = -EINVAL; + break; + } + if (mode < 0 || mode > 2) + status = -EINVAL; + if (status == 0) + set_fifo_mode (dev, mode); + spin_unlock_irqrestore (&dev->lock, flags); + + if (status == 0) { + if (mode == 1) + DEBUG (dev, "fifo: ep-a 2K, ep-b 2K\n"); + else if (mode == 2) + DEBUG (dev, "fifo: ep-a 2K, ep-b 1K, ep-c 1K\n"); + /* else all are 1K */ + } + return status; +} +EXPORT_SYMBOL (net2280_set_fifo_mode); + +/*-------------------------------------------------------------------------*/ + +/* keeping it simple: + * - one bus driver, initted first; + * - one function driver, initted second + * + * most of the work to support multiple net2280 controllers would + * be to associate this gadget driver (yes?) with all of them, or + * perhaps to bind specific drivers to specific devices. + */ + +static struct net2280 *the_controller; + +static void usb_reset (struct net2280 *dev) +{ + u32 tmp; + + /* force immediate bus disconnect, and synch through pci */ + writel (0, &dev->usb->usbctl); + dev->gadget.speed = USB_SPEED_UNKNOWN; + (void) readl (&dev->usb->usbctl); + + net2280_led_init (dev); + + /* disable automatic responses, and irqs */ + writel (0, &dev->usb->stdrsp); + writel (0, &dev->regs->pciirqenb0); + writel (0, &dev->regs->pciirqenb1); + + /* clear old dma and irq state */ + for (tmp = 0; tmp < 4; tmp++) { + writel ((1 << DMA_ABORT), &dev->dma [tmp].dmastat); + stop_dma (&dev->dma [tmp]); + } + writel (~0, &dev->regs->irqstat0), + writel (~(1 << SUSPEND_REQUEST_INTERRUPT), &dev->regs->irqstat1), + + /* reset, and enable pci */ + tmp = readl (&dev->regs->devinit) + | (1 << PCI_ENABLE) + | (1 << FIFO_SOFT_RESET) + | (1 << USB_SOFT_RESET) + | (1 << M8051_RESET); + writel (tmp, &dev->regs->devinit); + + /* standard fifo and endpoint allocations */ + set_fifo_mode (dev, (fifo_mode <= 2) ? fifo_mode : 0); +} + +static void usb_reinit (struct net2280 *dev) +{ + u32 tmp; + int init_dma; + + /* use_dma changes are ignored till next device re-init */ + init_dma = use_dma; + + /* basic endpoint init */ + for (tmp = 0; tmp < 7; tmp++) { + struct net2280_ep *ep = &dev->ep [tmp]; + + ep->ep.name = ep_name [tmp]; + ep->dev = dev; + ep->num = tmp; + + if (tmp > 0 && tmp <= 4) { + ep->fifo_size = 1024; + if (init_dma) + ep->dma = &dev->dma [tmp - 1]; + } else + ep->fifo_size = 64; + ep->regs = &dev->epregs [tmp]; + ep_reset (dev->regs, ep); + } + dev->ep [0].ep.maxpacket = 64; + dev->ep [5].ep.maxpacket = 64; + dev->ep [6].ep.maxpacket = 64; + + dev->gadget.ep0 = &dev->ep [0].ep; + dev->ep [0].stopped = 0; + INIT_LIST_HEAD (&dev->gadget.ep0->ep_list); + + /* we want to prevent lowlevel/insecure access from the USB host, + * but erratum 0119 means this enable bit is ignored + */ + for (tmp = 0; tmp < 5; tmp++) + writel (EP_DONTUSE, &dev->dep [tmp].dep_cfg); +} + +static void ep0_start (struct net2280 *dev) +{ + writel ( (1 << CLEAR_EP_HIDE_STATUS_PHASE) + | (1 << CLEAR_NAK_OUT_PACKETS) + | (1 << CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE) + , &dev->epregs [0].ep_rsp); + + /* + * hardware optionally handles a bunch of standard requests + * that the API hides from drivers anyway. have it do so. + * endpoint status/features are handled in software, to + * help pass tests for some dubious behavior. + */ + writel ( (1 << SET_TEST_MODE) + | (1 << SET_ADDRESS) + | (1 << DEVICE_SET_CLEAR_DEVICE_REMOTE_WAKEUP) + | (1 << GET_DEVICE_STATUS) + | (1 << GET_INTERFACE_STATUS) + , &dev->usb->stdrsp); + writel ( (1 << USB_ROOT_PORT_WAKEUP_ENABLE) + | (1 << SELF_POWERED_USB_DEVICE) + | (1 << REMOTE_WAKEUP_SUPPORT) + | (1 << USB_DETECT_ENABLE) + | (1 << DEVICE_REMOTE_WAKEUP_ENABLE) + , &dev->usb->usbctl); + + /* enable irqs so we can see ep0 and general operation */ + writel ( (1 << SETUP_PACKET_INTERRUPT_ENABLE) + | (1 << ENDPOINT_0_INTERRUPT_ENABLE) + , &dev->regs->pciirqenb0); + writel ( (1 << PCI_INTERRUPT_ENABLE) + | (1 << PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE) + | (1 << PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE) + | (1 << PCI_RETRY_ABORT_INTERRUPT_ENABLE) + | (1 << VBUS_INTERRUPT_ENABLE) + | (1 << ROOT_PORT_RESET_INTERRUPT_ENABLE) + , &dev->regs->pciirqenb1); + + /* don't leave any writes posted */ + (void) readl (&dev->usb->usbctl); +} + +/* when a driver is successfully registered, it will receive + * control requests including set_configuration(), which enables + * non-control requests. then usb traffic follows until a + * disconnect is reported. then a host may connect again, or + * the driver might get unbound. + */ +int usb_gadget_register_driver (struct usb_gadget_driver *driver) +{ + struct net2280 *dev = the_controller; + int retval; + unsigned i; + + /* insist on high speed support from the driver, since + * (dev->usb->xcvrdiag & FORCE_FULL_SPEED_MODE) + * "must not be used in normal operation" + */ + if (!driver + || driver->speed != USB_SPEED_HIGH + || !driver->bind + || !driver->unbind + || !driver->setup) + return -EINVAL; + if (!dev) + return -ENODEV; + if (dev->driver) + return -EBUSY; + + for (i = 0; i < 7; i++) + dev->ep [i].irqs = 0; + + /* hook up the driver ... */ + dev->driver = driver; + retval = driver->bind (&dev->gadget); + if (retval) { + DEBUG (dev, "bind to driver %s --> %d\n", + driver->driver.name, retval); + dev->driver = 0; + return retval; + } + + /* ... then enable host detection and ep0; and we're ready + * for set_configuration as well as eventual disconnect. + */ + net2280_led_active (dev, 1); + ep0_start (dev); + + DEBUG (dev, "%s ready, usbctl %08x stdrsp %08x\n", + driver->driver.name, + readl (&dev->usb->usbctl), + readl (&dev->usb->stdrsp)); + + /* pci writes may still be posted */ + return 0; +} +EXPORT_SYMBOL (usb_gadget_register_driver); + +static void +stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver) +{ + int i; + + /* don't disconnect if it's not connected */ + if (dev->gadget.speed == USB_SPEED_UNKNOWN) + driver = 0; + + /* stop hardware; prevent new request submissions; + * and kill any outstanding requests. + */ + usb_reset (dev); + for (i = 0; i < 7; i++) + nuke (&dev->ep [i]); + + /* report disconnect; the driver is already quiesced */ + if (driver) { + spin_unlock (&dev->lock); + driver->disconnect (&dev->gadget); + spin_lock (&dev->lock); + } + + usb_reinit (dev); +} + +int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) +{ + struct net2280 *dev = the_controller; + unsigned long flags; + + if (!dev) + return -ENODEV; + if (!driver || driver != dev->driver) + return -EINVAL; + + spin_lock_irqsave (&dev->lock, flags); + stop_activity (dev, driver); + spin_unlock_irqrestore (&dev->lock, flags); + + driver->unbind (&dev->gadget); + dev->driver = 0; + + net2280_led_active (dev, 0); + + DEBUG (dev, "unregistered driver '%s'\n", driver->driver.name); + return 0; +} +EXPORT_SYMBOL (usb_gadget_unregister_driver); + + +/*-------------------------------------------------------------------------*/ + +/* handle ep0, ep-e, ep-f with 64 byte packets: packet per irq. + * also works for dma-capable endpoints, in pio mode or just + * to manually advance the queue after short OUT transfers. + */ +static void handle_ep_small (struct net2280_ep *ep) +{ + struct net2280_request *req; + u32 t; + /* 0 error, 1 mid-data, 2 done */ + int mode = 1; + + if (!list_empty (&ep->queue)) + req = list_entry (ep->queue.next, + struct net2280_request, queue); + else + req = 0; + + /* ack all, and handle what we care about */ + t = readl (&ep->regs->ep_stat); + ep->irqs++; +#if 0 + VDEBUG (ep->dev, "%s ack ep_stat %08x, req %p\n", + ep->ep.name, t, req ? &req->req : 0); +#endif + writel (t & ~(1 << NAK_OUT_PACKETS), &ep->regs->ep_stat); + + /* for ep0, monitor token irqs to catch data stage length errors + * and to synchronize on status. + * + * also, to defer reporting of protocol stalls ... here's where + * data or status first appears, handling stalls here should never + * cause trouble on the host side.. + * + * control requests could be slightly faster without token synch for + * status, but status can jam up that way. + */ + if (unlikely (ep->num == 0)) { + if (ep->is_in) { + /* status; stop NAKing */ + if (t & (1 << DATA_OUT_PING_TOKEN_INTERRUPT)) { + if (ep->dev->protocol_stall) { + ep->stopped = 1; + set_halt (ep); + } + mode = 2; + /* reply to extra IN data tokens with a zlp */ + } else if (t & (1 << DATA_IN_TOKEN_INTERRUPT)) { + if (ep->dev->protocol_stall) { + ep->stopped = 1; + set_halt (ep); + mode = 2; + } else if (!req && ep->stopped) + write_fifo (ep, 0); + } + } else { + /* status; stop NAKing */ + if (t & (1 << DATA_IN_TOKEN_INTERRUPT)) { + if (ep->dev->protocol_stall) { + ep->stopped = 1; + set_halt (ep); + } + mode = 2; + /* an extra OUT token is an error */ + } else if (((t & (1 << DATA_OUT_PING_TOKEN_INTERRUPT)) + && req + && req->req.actual == req->req.length) + || !req) { + ep->dev->protocol_stall = 1; + set_halt (ep); + ep->stopped = 1; + if (req) + done (ep, req, -EOVERFLOW); + req = 0; + } + } + } + + if (unlikely (!req)) + return; + + /* manual DMA queue advance after short OUT */ + if (likely (ep->dma != 0)) { + if (t & (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT)) { + u32 count; + + /* TRANSFERRED works around OUT_DONE erratum 0112. + * we expect (N <= maxpacket) bytes; host wrote M. + * iff (M < N) we won't ever see a DMA interrupt. + */ + count = readl (&ep->dma->dmacount); + count &= DMA_BYTE_COUNT_MASK; + if (!req->dma_done) { + /* dma can finish with the FIFO non-empty, + * on (M > N) errors. + */ + while (count && (t & (1 << FIFO_EMPTY)) == 0) { + cpu_relax (); + t = readl (&ep->regs->ep_stat); + count = readl (&ep->dma->dmacount); + count &= DMA_BYTE_COUNT_MASK; + } + } + + /* stop DMA, leave ep NAKing */ + writel ((1 << DMA_ABORT), &ep->dma->dmastat); + spin_stop_dma (ep->dma); + + /* buffer might have been too small */ + t = readl (&ep->regs->ep_avail); + if (t != 0) + DEBUG (ep->dev, "%s dma, discard %d len %d\n", + ep->ep.name, t, count); + dma_done (ep, req, count, t ? -EOVERFLOW : 0); + + /* also flush to prevent erratum 0106 trouble */ + if (t || ep->dev->chiprev == 0x0100) + out_flush (ep); + + /* restart dma (still NAKing OUT!) if needed */ + if (!list_empty (&ep->queue)) + restart_dma (ep); + } else + DEBUG (ep->dev, "%s dma ep_stat %08x ??\n", + ep->ep.name, t); + return; + + /* data packet(s) received (in the fifo, OUT) */ + } else if (t & (1 << DATA_PACKET_RECEIVED_INTERRUPT)) { + if (read_fifo (ep, req) && ep->num != 0) + mode = 2; + + /* data packet(s) transmitted (IN) */ + } else if (t & (1 << DATA_PACKET_TRANSMITTED_INTERRUPT)) { + unsigned len; + + len = req->req.length - req->req.actual; + len = min (ep->ep.maxpacket, len); + req->req.actual += len; + + /* if we wrote it all, we're usually done */ + if (req->req.actual == req->req.length) { + if (ep->num == 0) { + /* wait for control status */ + if (mode != 2) + req = 0; + } else if (!req->req.zero || len != ep->ep.maxpacket) + mode = 2; + } + + /* there was nothing to do ... */ + } else if (mode == 1) + return; + + /* done */ + if (mode == 2) { + /* stream endpoints often resubmit/unlink in completion */ + done (ep, req, 0); + + /* maybe advance queue to next request */ + if (ep->num == 0) { + /* NOTE: net2280 could let gadget driver start the + * status stage later. since not all controllers let + * them control that, the api doesn't (yet) allow it. + */ + if (!ep->stopped) + allow_status (ep); + req = 0; + } else { + if (!list_empty (&ep->queue) && !ep->stopped) + req = list_entry (ep->queue.next, + struct net2280_request, queue); + else + req = 0; + if (req && !ep->is_in) + stop_out_naking (ep); + } + } + + /* is there a buffer for the next packet? + * for best streaming performance, make sure there is one. + */ + if (req && !ep->stopped) { + + /* load IN fifo with next packet (may be zlp) */ + if (t & (1 << DATA_PACKET_TRANSMITTED_INTERRUPT)) + write_fifo (ep, &req->req); + } +} + +static struct net2280_ep * +get_ep_by_addr (struct net2280 *dev, u16 wIndex) +{ + struct net2280_ep *ep; + + if ((wIndex & USB_ENDPOINT_NUMBER_MASK) == 0) + return &dev->ep [0]; + list_for_each_entry (ep, &dev->gadget.ep_list, ep.ep_list) { + u8 bEndpointAddress; + + if (!ep->desc) + continue; + bEndpointAddress = ep->desc->bEndpointAddress; + if ((wIndex ^ bEndpointAddress) & USB_DIR_IN) + continue; + if ((wIndex & 0x0f) == (bEndpointAddress & 0x0f)) + return ep; + } + return 0; +} + +static void handle_stat0_irqs (struct net2280 *dev, u32 stat) +{ + struct net2280_ep *ep; + u32 num, scratch; + + /* most of these don't need individual acks */ + stat &= ~(1 << INTA_ASSERTED); + if (!stat) + return; + // DEBUG (dev, "irqstat0 %04x\n", stat); + + /* starting a control request? */ + if (unlikely (stat & (1 << SETUP_PACKET_INTERRUPT))) { + union { + u32 raw [2]; + struct usb_ctrlrequest r; + } u; + int tmp = 0; + struct net2280_request *req; + + if (dev->gadget.speed == USB_SPEED_UNKNOWN) { + if (readl (&dev->usb->usbstat) & (1 << HIGH_SPEED)) + dev->gadget.speed = USB_SPEED_HIGH; + else + dev->gadget.speed = USB_SPEED_FULL; + net2280_led_speed (dev, dev->gadget.speed); + DEBUG (dev, "%s speed\n", + (dev->gadget.speed == USB_SPEED_HIGH) + ? "high" : "full"); + } + + ep = &dev->ep [0]; + ep->irqs++; + + /* make sure any leftover request state is cleared */ + stat &= ~(1 << ENDPOINT_0_INTERRUPT); + while (!list_empty (&ep->queue)) { + req = list_entry (ep->queue.next, + struct net2280_request, queue); + done (ep, req, (req->req.actual == req->req.length) + ? 0 : -EPROTO); + } + ep->stopped = 0; + dev->protocol_stall = 0; + writel ( (1 << TIMEOUT) + | (1 << USB_STALL_SENT) + | (1 << USB_IN_NAK_SENT) + | (1 << USB_IN_ACK_RCVD) + | (1 << USB_OUT_PING_NAK_SENT) + | (1 << USB_OUT_ACK_SENT) + | (1 << FIFO_OVERFLOW) + | (1 << FIFO_UNDERFLOW) + | (1 << SHORT_PACKET_OUT_DONE_INTERRUPT) + | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) + | (1 << DATA_PACKET_RECEIVED_INTERRUPT) + | (1 << DATA_PACKET_TRANSMITTED_INTERRUPT) + | (1 << DATA_OUT_PING_TOKEN_INTERRUPT) + | (1 << DATA_IN_TOKEN_INTERRUPT) + , &ep->regs->ep_stat); + u.raw [0] = readl (&dev->usb->setup0123); + u.raw [1] = readl (&dev->usb->setup4567); + + cpu_to_le32s (&u.raw [0]); + cpu_to_le32s (&u.raw [1]); + + le16_to_cpus (&u.r.wValue); + le16_to_cpus (&u.r.wIndex); + le16_to_cpus (&u.r.wLength); + + /* ack the irq */ + writel (1 << SETUP_PACKET_INTERRUPT, &dev->regs->irqstat0); + stat ^= (1 << SETUP_PACKET_INTERRUPT); + + /* watch control traffic at the token level, and force + * synchronization before letting the status stage happen. + * FIXME ignore tokens we'll NAK, until driver responds. + * that'll mean a lot less irqs for some drivers. + */ + ep->is_in = (u.r.bRequestType & USB_DIR_IN) != 0; + if (ep->is_in) + scratch = (1 << DATA_PACKET_TRANSMITTED_INTERRUPT) + | (1 << DATA_OUT_PING_TOKEN_INTERRUPT) + | (1 << DATA_IN_TOKEN_INTERRUPT); + else + scratch = (1 << DATA_PACKET_RECEIVED_INTERRUPT) + | (1 << DATA_OUT_PING_TOKEN_INTERRUPT) + | (1 << DATA_IN_TOKEN_INTERRUPT); + writel (scratch, &dev->epregs [0].ep_irqenb); + + /* we made the hardware handle most lowlevel requests; + * everything else goes uplevel to the gadget code. + */ + switch (u.r.bRequest) { + case USB_REQ_GET_STATUS: { + struct net2280_ep *e; + u16 status; + + /* hw handles device and interface status */ + if (u.r.bRequestType != (USB_DIR_IN|USB_RECIP_ENDPOINT)) + goto delegate; + if ((e = get_ep_by_addr (dev, u.r.wIndex)) == 0 + || u.r.wLength > 2) + goto do_stall; + + if (readl (&e->regs->ep_rsp) + & (1 << SET_ENDPOINT_HALT)) + status = __constant_cpu_to_le16 (1); + else + status = __constant_cpu_to_le16 (0); + + /* don't bother with a request object! */ + writel (0, &dev->epregs [0].ep_irqenb); + set_fifo_bytecount (ep, u.r.wLength); + writel (status, &dev->epregs [0].ep_data); + allow_status (ep); + VDEBUG (dev, "%s stat %02x\n", ep->ep.name, status); + goto next_endpoints; + } + break; + case USB_REQ_CLEAR_FEATURE: { + struct net2280_ep *e; + + /* hw handles device features */ + if (u.r.bRequestType != USB_RECIP_ENDPOINT) + goto delegate; + if (u.r.wValue != 0 /* HALT feature */ + || u.r.wLength != 0) + goto do_stall; + if ((e = get_ep_by_addr (dev, u.r.wIndex)) == 0) + goto do_stall; + clear_halt (e); + allow_status (ep); + VDEBUG (dev, "%s clear halt\n", ep->ep.name); + goto next_endpoints; + } + break; + case USB_REQ_SET_FEATURE: { + struct net2280_ep *e; + + /* hw handles device features */ + if (u.r.bRequestType != USB_RECIP_ENDPOINT) + goto delegate; + if (u.r.wValue != 0 /* HALT feature */ + || u.r.wLength != 0) + goto do_stall; + if ((e = get_ep_by_addr (dev, u.r.wIndex)) == 0) + goto do_stall; + set_halt (e); + allow_status (ep); + VDEBUG (dev, "%s set halt\n", ep->ep.name); + goto next_endpoints; + } + break; + default: +delegate: + VDEBUG (dev, "setup %02x.%02x v%04x i%04x " + "ep_cfg %08x\n", + u.r.bRequestType, u.r.bRequest, + u.r.wValue, u.r.wIndex, + readl (&ep->regs->ep_cfg)); + spin_unlock (&dev->lock); + tmp = dev->driver->setup (&dev->gadget, &u.r); + spin_lock (&dev->lock); + } + + /* stall ep0 on error */ + if (tmp < 0) { +do_stall: + VDEBUG (dev, "req %02x.%02x protocol STALL; stat %d\n", + u.r.bRequestType, u.r.bRequest, tmp); + dev->protocol_stall = 1; + } + + /* some in/out token irq should follow; maybe stall then. + * driver must queue a request (even zlp) or halt ep0 + * before the host times out. + */ + } + +next_endpoints: + /* endpoint data irq ? */ + scratch = stat & 0x7f; + stat &= ~0x7f; + for (num = 0; scratch; num++) { + u32 t; + + /* do this endpoint's FIFO and queue need tending? */ + t = 1 << num; + if ((scratch & t) == 0) + continue; + scratch ^= t; + + ep = &dev->ep [num]; + handle_ep_small (ep); + } + + if (stat) + DEBUG (dev, "unhandled irqstat0 %08x\n", stat); +} + +#define DMA_INTERRUPTS ( \ + (1 << DMA_D_INTERRUPT) \ + | (1 << DMA_C_INTERRUPT) \ + | (1 << DMA_B_INTERRUPT) \ + | (1 << DMA_A_INTERRUPT)) +#define PCI_ERROR_INTERRUPTS ( \ + (1 << PCI_MASTER_ABORT_RECEIVED_INTERRUPT) \ + | (1 << PCI_TARGET_ABORT_RECEIVED_INTERRUPT) \ + | (1 << PCI_RETRY_ABORT_INTERRUPT)) + +static void handle_stat1_irqs (struct net2280 *dev, u32 stat) +{ + struct net2280_ep *ep; + u32 tmp, num, scratch; + + /* after disconnect there's nothing else to do! */ + tmp = (1 << VBUS_INTERRUPT) | (1 << ROOT_PORT_RESET_INTERRUPT); + if (stat & tmp) { + writel (tmp, &dev->regs->irqstat1); + if (((stat & (1 << ROOT_PORT_RESET_INTERRUPT)) != 0 + || (readl (&dev->usb->usbctl) & (1 << VBUS_PIN)) == 0 + ) && dev->gadget.speed != USB_SPEED_UNKNOWN) { + DEBUG (dev, "disconnect %s\n", + dev->driver->driver.name); + stop_activity (dev, dev->driver); + ep0_start (dev); + return; + } + stat &= ~tmp; + + /* vBUS can bounce ... one of many reasons to ignore the + * notion of hotplug events on bus connect/disconnect! + */ + if (!stat) + return; + } + + /* NOTE: we don't actually suspend the hardware; that starts to + * interact with PCI power management, and needs something like a + * controller->suspend() call to clear SUSPEND_REQUEST_INTERRUPT. + * we shouldn't see resume interrupts. + * for rev 0100, this also avoids erratum 0102. + */ + tmp = (1 << SUSPEND_REQUEST_CHANGE_INTERRUPT); + if (stat & tmp) { + if (dev->driver->suspend) + dev->driver->suspend (&dev->gadget); + stat &= ~tmp; + } + stat &= ~(1 << SUSPEND_REQUEST_INTERRUPT); + + /* clear any other status/irqs */ + if (stat) + writel (stat, &dev->regs->irqstat1); + + /* some status we can just ignore */ + stat &= ~((1 << CONTROL_STATUS_INTERRUPT) + | (1 << RESUME_INTERRUPT) + | (1 << SOF_INTERRUPT)); + if (!stat) + return; + // DEBUG (dev, "irqstat1 %08x\n", stat); + + /* DMA status, for ep-{a,b,c,d} */ + scratch = stat & DMA_INTERRUPTS; + stat &= ~DMA_INTERRUPTS; + scratch >>= 9; + for (num = 0; scratch; num++) { + struct net2280_dma_regs *dma; + + tmp = 1 << num; + if ((tmp & scratch) == 0) + continue; + scratch ^= tmp; + + ep = &dev->ep [num + 1]; + dma = ep->dma; + + if (!dma) + continue; + + /* clear ep's dma status */ + tmp = readl (&dma->dmastat); + writel (tmp, &dma->dmastat); + +#ifdef USE_DMA_CHAINING + /* chaining should stop only on error (which?) + * or (stat0 codepath) short OUT transfer. + */ +#else + if ((tmp & (1 << DMA_TRANSACTION_DONE_INTERRUPT)) == 0) { + DEBUG (ep->dev, "%s no xact done? %08x\n", + ep->ep.name, tmp); + continue; + } + stop_dma (ep->dma); +#endif + + /* OUT transfers terminate when the data from the + * host is in our memory. Process whatever's done. + * On this path, we know transfer's last packet wasn't + * less than req->length. NAK_OUT_PACKETS may be set, + * or the FIFO may already be holding new packets. + * + * IN transfers can linger in the FIFO for a very + * long time ... we ignore that for now, accounting + * precisely (like PIO does) needs per-packet irqs + */ + scan_dma_completions (ep); + + /* disable dma on inactive queues; else maybe restart */ + if (list_empty (&ep->queue)) { +#ifdef USE_DMA_CHAINING + stop_dma (ep->dma); +#endif + } else { + tmp = readl (&dma->dmactl); + if ((tmp & (1 << DMA_SCATTER_GATHER_ENABLE)) == 0 + || (tmp & (1 << DMA_ENABLE)) == 0) + restart_dma (ep); +#ifdef USE_DMA_CHAINING + else if (ep->desc->bEndpointAddress & USB_DIR_IN) { + struct net2280_request *req; + u32 dmacount; + + /* the descriptor at the head of the chain + * may still have VALID_BIT clear; that's + * used to trigger changing DMA_FIFO_VALIDATE + * (affects automagic zlp writes). + */ + req = list_entry (ep->queue.next, + struct net2280_request, queue); + dmacount = req->td->dmacount; + dmacount &= __constant_cpu_to_le32 ( + (1 << VALID_BIT) + | DMA_BYTE_COUNT_MASK); + if (dmacount && (dmacount & valid_bit) == 0) { + stop_dma (ep->dma); + restart_dma (ep); + } + } +#endif + } + ep->irqs++; + } + + /* NOTE: there are other PCI errors we might usefully notice. + * if they appear very often, here's where to try recovering. + */ + if (stat & PCI_ERROR_INTERRUPTS) { + ERROR (dev, "pci dma error; stat %08x\n", stat); + stat &= ~PCI_ERROR_INTERRUPTS; + /* these are fatal errors, but "maybe" they won't + * happen again ... + */ + stop_activity (dev, dev->driver); + ep0_start (dev); + stat = 0; + } + + if (stat) + DEBUG (dev, "unhandled irqstat1 %08x\n", stat); +} + +static irqreturn_t net2280_irq (int irq, void *_dev, struct pt_regs * r) +{ + struct net2280 *dev = _dev; + + spin_lock (&dev->lock); + + /* handle disconnect, dma, and more */ + handle_stat1_irqs (dev, readl (&dev->regs->irqstat1)); + + /* control requests and PIO */ + handle_stat0_irqs (dev, readl (&dev->regs->irqstat0)); + + spin_unlock (&dev->lock); + + return IRQ_HANDLED; +} + +/*-------------------------------------------------------------------------*/ + +/* tear down the binding between this driver and the pci device */ + +static void net2280_remove (struct pci_dev *pdev) +{ + struct net2280 *dev = pci_get_drvdata (pdev); + + /* start with the driver above us */ + if (dev->driver) { + /* should have been done already by driver model core */ + WARN (dev, "pci remove, driver '%s' is still registered\n", + dev->driver->driver.name); + usb_gadget_unregister_driver (dev->driver); + } + + /* then clean up the resources we allocated during probe() */ + net2280_led_shutdown (dev); + if (dev->requests) { + int i; + for (i = 1; i < 5; i++) { + if (!dev->ep [i].dummy) + continue; + pci_pool_free (dev->requests, dev->ep [i].dummy, + dev->ep [i].td_dma); + } + pci_pool_destroy (dev->requests); + } + if (dev->got_irq) + free_irq (pdev->irq, dev); + if (dev->regs) + iounmap (dev->regs); + if (dev->region) + release_mem_region (pci_resource_start (pdev, 0), + pci_resource_len (pdev, 0)); + if (dev->enabled) + pci_disable_device (pdev); + pci_set_drvdata (pdev, 0); + + INFO (dev, "unbind from pci %s\n", pdev->slot_name); + + kfree (dev); + the_controller = 0; +} + +/* wrap this driver around the specified device, but + * don't respond over USB until a gadget driver binds to us. + */ + +static int net2280_probe (struct pci_dev *pdev, const struct pci_device_id *id) +{ + struct net2280 *dev; + unsigned long resource, len; + void *base = 0; + int retval, i; + char buf [8], *bufp; + + /* if you want to support more than one controller in a system, + * usb_gadget_driver_{register,unregister}() must change. + */ + if (the_controller) { + WARN (the_controller, "ignoring %s\n", pdev->slot_name); + return -EBUSY; + } + + /* alloc, and start init */ + dev = kmalloc (sizeof *dev, SLAB_KERNEL); + if (dev == NULL){ + retval = -ENOMEM; + goto done; + } + + memset (dev, 0, sizeof *dev); + spin_lock_init (&dev->lock); + dev->pdev = pdev; + dev->gadget.ops = &net2280_ops; + + dev->gadget.dev.bus_id = pdev->slot_name; + dev->gadget.name = driver_name; + + /* now all the pci goodies ... */ + if (pci_enable_device (pdev) < 0) { + retval = -ENODEV; + goto done; + } + dev->enabled = 1; + + /* BAR 0 holds all the registers + * BAR 1 is 8051 memory; unused here (note erratum 0103) + * BAR 2 is fifo memory; unused here + */ + resource = pci_resource_start (pdev, 0); + len = pci_resource_len (pdev, 0); + if (!request_mem_region (resource, len, driver_name)) { + DEBUG (dev, "controller already in use\n"); + retval = -EBUSY; + goto done; + } + dev->region = 1; + + base = ioremap_nocache (resource, len); + if (base == NULL) { + DEBUG (dev, "can't map memory\n"); + retval = -EFAULT; + goto done; + } + dev->regs = (struct net2280_regs *) base; + dev->usb = (struct net2280_usb_regs *) (base + 0x0080); + dev->pci = (struct net2280_pci_regs *) (base + 0x0100); + dev->dma = (struct net2280_dma_regs *) (base + 0x0180); + dev->dep = (struct net2280_dep_regs *) (base + 0x0200); + dev->epregs = (struct net2280_ep_regs *) (base + 0x0300); + + /* put into initial config, link up all endpoints */ + usb_reset (dev); + usb_reinit (dev); + + /* irq setup after old hardware is cleaned up */ + if (!pdev->irq) { + ERROR (dev, "No IRQ. Check PCI setup!\n"); + retval = -ENODEV; + goto done; + } +#ifndef __sparc__ + snprintf (buf, sizeof buf, "%d", pdev->irq); + bufp = buf; +#else + bufp = __irq_itoa(pdev->irq); +#endif + if (request_irq (pdev->irq, net2280_irq, SA_SHIRQ, driver_name, dev) + != 0) { + ERROR (dev, "request interrupt %s failed\n", bufp); + retval = -EBUSY; + goto done; + } + dev->got_irq = 1; + + /* DMA setup */ + dev->requests = pci_pool_create ("requests", pdev, + sizeof (struct net2280_dma), + 0 /* no alignment requirements */, + 0 /* or page-crossing issues */, + SLAB_KERNEL /* 2.4 only */ ); + if (!dev->requests) { + DEBUG (dev, "can't get request pool\n"); + retval = -ENOMEM; + goto done; + } + for (i = 1; i < 5; i++) { + struct net2280_dma *td; + + td = pci_pool_alloc (dev->requests, GFP_KERNEL, + &dev->ep [i].td_dma); + if (!td) { + DEBUG (dev, "can't get dummy %d\n", i); + retval = -ENOMEM; + goto done; + } + td->dmacount = 0; /* not VALID */ + td->dmaaddr = __constant_cpu_to_le32 (DMA_ADDR_INVALID); + dev->ep [i].dummy = td; + } + + /* enable lower-overhead pci memory bursts during DMA */ + writel ((1 << PCI_RETRY_ABORT_ENABLE) + | (1 << DMA_MEMORY_WRITE_AND_INVALIDATE_ENABLE) + | (1 << DMA_READ_MULTIPLE_ENABLE) + | (1 << DMA_READ_LINE_ENABLE) + , &dev->pci->pcimstctl); + /* erratum 0115 shouldn't appear: Linux inits PCI_LATENCY_TIMER */ + pci_set_master (pdev); +#ifdef HAVE_PCI_SET_MWI + pci_set_mwi (pdev); +#endif + + /* ... also flushes any posted pci writes */ + dev->chiprev = get_idx_reg (dev->regs, REG_CHIPREV) & 0xffff; + + /* done */ + pci_set_drvdata (pdev, dev); + INFO (dev, "%s\n", driver_desc); + INFO (dev, "irq %s, pci mem %p, chip rev %04x\n", + bufp, base, dev->chiprev); + bufp = DRIVER_VERSION +#ifndef USE_DMA_CHAINING + " (no dma chain)" +#endif +#ifdef NET2280_DMA_OUT_WORKAROUND + " (no dma out)" +#endif + ; + INFO (dev, "version: %s\n", bufp); + the_controller = dev; + + return 0; + +done: + if (dev) + net2280_remove (pdev); + return retval; +} + + +/*-------------------------------------------------------------------------*/ + +static struct pci_device_id pci_ids [] = { { + .class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), + .class_mask = ~0, + .vendor = 0x17cc, + .device = 0x2280, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + +}, { /* end: all zeroes */ } +}; +MODULE_DEVICE_TABLE (pci, pci_ids); + +/* pci driver glue; this is a "new style" PCI driver module */ +static struct pci_driver net2280_pci_driver = { + .name = (char *) driver_name, + .id_table = pci_ids, + + .probe = net2280_probe, + .remove = net2280_remove, + + /* FIXME add power management support */ +}; + +MODULE_DESCRIPTION (DRIVER_DESC); +MODULE_AUTHOR ("David Brownell"); +MODULE_LICENSE ("GPL"); + +static int __init init (void) +{ + return pci_module_init (&net2280_pci_driver); +} +module_init (init); + +static void __exit cleanup (void) +{ + pci_unregister_driver (&net2280_pci_driver); +} +module_exit (cleanup); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/gadget/net2280.h linux-2.4.23-pre8/drivers/usb/gadget/net2280.h --- linux-2.4.22/drivers/usb/gadget/net2280.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/gadget/net2280.h 2003-10-22 22:47:41.000000000 +0000 @@ -0,0 +1,755 @@ +/* + * NetChip 2280 high/full speed USB device controller. + * Unlike many such controllers, this one talks PCI. + */ + +/* + * Copyright (C) 2002 NetChip Technology, Inc. (http://www.netchip.com) + * Copyright (C) 2003 David Brownell + * + * 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 + */ + +/*-------------------------------------------------------------------------*/ + +/* NET2280 MEMORY MAPPED REGISTERS + * + * The register layout came from the chip documentation, and the bit + * number definitions were extracted from chip specification. + * + * Use the shift operator ('<<') to build bit masks, with readl/writel + * to access the registers through PCI. + */ + +/* main registers, BAR0 + 0x0000 */ +struct net2280_regs { + // offset 0x0000 + u32 devinit; +#define LOCAL_CLOCK_FREQUENCY 8 +#define FORCE_PCI_RESET 7 +#define PCI_ID 6 +#define PCI_ENABLE 5 +#define FIFO_SOFT_RESET 4 +#define CFG_SOFT_RESET 3 +#define PCI_SOFT_RESET 2 +#define USB_SOFT_RESET 1 +#define M8051_RESET 0 + u32 eectl; +#define EEPROM_ADDRESS_WIDTH 23 +#define EEPROM_CHIP_SELECT_ACTIVE 22 +#define EEPROM_PRESENT 21 +#define EEPROM_VALID 20 +#define EEPROM_BUSY 19 +#define EEPROM_CHIP_SELECT_ENABLE 18 +#define EEPROM_BYTE_READ_START 17 +#define EEPROM_BYTE_WRITE_START 16 +#define EEPROM_READ_DATA 8 +#define EEPROM_WRITE_DATA 0 + u32 eeclkfreq; + u32 _unused0; + // offset 0x0010 + + u32 pciirqenb0; /* interrupt PCI master ... */ +#define SETUP_PACKET_INTERRUPT_ENABLE 7 +#define ENDPOINT_F_INTERRUPT_ENABLE 6 +#define ENDPOINT_E_INTERRUPT_ENABLE 5 +#define ENDPOINT_D_INTERRUPT_ENABLE 4 +#define ENDPOINT_C_INTERRUPT_ENABLE 3 +#define ENDPOINT_B_INTERRUPT_ENABLE 2 +#define ENDPOINT_A_INTERRUPT_ENABLE 1 +#define ENDPOINT_0_INTERRUPT_ENABLE 0 + u32 pciirqenb1; +#define PCI_INTERRUPT_ENABLE 31 +#define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 +#define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 +#define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 +#define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 +#define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 +#define PCI_TARGET_ABORT_ASSERTED_INTERRUPT_ENABLE 18 +#define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 +#define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 +#define GPIO_INTERRUPT_ENABLE 13 +#define DMA_D_INTERRUPT_ENABLE 12 +#define DMA_C_INTERRUPT_ENABLE 11 +#define DMA_B_INTERRUPT_ENABLE 10 +#define DMA_A_INTERRUPT_ENABLE 9 +#define EEPROM_DONE_INTERRUPT_ENABLE 8 +#define VBUS_INTERRUPT_ENABLE 7 +#define CONTROL_STATUS_INTERRUPT_ENABLE 6 +#define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 +#define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 +#define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 +#define RESUME_INTERRUPT_ENABLE 1 +#define SOF_INTERRUPT_ENABLE 0 + u32 cpu_irqenb0; /* ... or onboard 8051 */ +#define SETUP_PACKET_INTERRUPT_ENABLE 7 +#define ENDPOINT_F_INTERRUPT_ENABLE 6 +#define ENDPOINT_E_INTERRUPT_ENABLE 5 +#define ENDPOINT_D_INTERRUPT_ENABLE 4 +#define ENDPOINT_C_INTERRUPT_ENABLE 3 +#define ENDPOINT_B_INTERRUPT_ENABLE 2 +#define ENDPOINT_A_INTERRUPT_ENABLE 1 +#define ENDPOINT_0_INTERRUPT_ENABLE 0 + u32 cpu_irqenb1; +#define CPU_INTERRUPT_ENABLE 31 +#define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 +#define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 +#define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 +#define PCI_INTA_INTERRUPT_ENABLE 24 +#define PCI_PME_INTERRUPT_ENABLE 23 +#define PCI_SERR_INTERRUPT_ENABLE 22 +#define PCI_PERR_INTERRUPT_ENABLE 21 +#define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 +#define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 +#define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 +#define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 +#define GPIO_INTERRUPT_ENABLE 13 +#define DMA_D_INTERRUPT_ENABLE 12 +#define DMA_C_INTERRUPT_ENABLE 11 +#define DMA_B_INTERRUPT_ENABLE 10 +#define DMA_A_INTERRUPT_ENABLE 9 +#define EEPROM_DONE_INTERRUPT_ENABLE 8 +#define VBUS_INTERRUPT_ENABLE 7 +#define CONTROL_STATUS_INTERRUPT_ENABLE 6 +#define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 +#define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 +#define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 +#define RESUME_INTERRUPT_ENABLE 1 +#define SOF_INTERRUPT_ENABLE 0 + + // offset 0x0020 + u32 _unused1; + u32 usbirqenb1; +#define USB_INTERRUPT_ENABLE 31 +#define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 +#define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 +#define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 +#define PCI_INTA_INTERRUPT_ENABLE 24 +#define PCI_PME_INTERRUPT_ENABLE 23 +#define PCI_SERR_INTERRUPT_ENABLE 22 +#define PCI_PERR_INTERRUPT_ENABLE 21 +#define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 +#define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 +#define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 +#define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 +#define GPIO_INTERRUPT_ENABLE 13 +#define DMA_D_INTERRUPT_ENABLE 12 +#define DMA_C_INTERRUPT_ENABLE 11 +#define DMA_B_INTERRUPT_ENABLE 10 +#define DMA_A_INTERRUPT_ENABLE 9 +#define EEPROM_DONE_INTERRUPT_ENABLE 8 +#define VBUS_INTERRUPT_ENABLE 7 +#define CONTROL_STATUS_INTERRUPT_ENABLE 6 +#define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 +#define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 +#define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 +#define RESUME_INTERRUPT_ENABLE 1 +#define SOF_INTERRUPT_ENABLE 0 + u32 irqstat0; +#define INTA_ASSERTED 12 +#define SETUP_PACKET_INTERRUPT 7 +#define ENDPOINT_F_INTERRUPT 6 +#define ENDPOINT_E_INTERRUPT 5 +#define ENDPOINT_D_INTERRUPT 4 +#define ENDPOINT_C_INTERRUPT 3 +#define ENDPOINT_B_INTERRUPT 2 +#define ENDPOINT_A_INTERRUPT 1 +#define ENDPOINT_0_INTERRUPT 0 + u32 irqstat1; +#define POWER_STATE_CHANGE_INTERRUPT 27 +#define PCI_ARBITER_TIMEOUT_INTERRUPT 26 +#define PCI_PARITY_ERROR_INTERRUPT 25 +#define PCI_INTA_INTERRUPT 24 +#define PCI_PME_INTERRUPT 23 +#define PCI_SERR_INTERRUPT 22 +#define PCI_PERR_INTERRUPT 21 +#define PCI_MASTER_ABORT_RECEIVED_INTERRUPT 20 +#define PCI_TARGET_ABORT_RECEIVED_INTERRUPT 19 +#define PCI_RETRY_ABORT_INTERRUPT 17 +#define PCI_MASTER_CYCLE_DONE_INTERRUPT 16 +#define GPIO_INTERRUPT 13 +#define DMA_D_INTERRUPT 12 +#define DMA_C_INTERRUPT 11 +#define DMA_B_INTERRUPT 10 +#define DMA_A_INTERRUPT 9 +#define EEPROM_DONE_INTERRUPT 8 +#define VBUS_INTERRUPT 7 +#define CONTROL_STATUS_INTERRUPT 6 +#define ROOT_PORT_RESET_INTERRUPT 4 +#define SUSPEND_REQUEST_INTERRUPT 3 +#define SUSPEND_REQUEST_CHANGE_INTERRUPT 2 +#define RESUME_INTERRUPT 1 +#define SOF_INTERRUPT 0 + // offset 0x0030 + u32 idxaddr; + u32 idxdata; + u32 fifoctl; +#define PCI_BASE2_RANGE 16 +#define IGNORE_FIFO_AVAILABILITY 3 +#define PCI_BASE2_SELECT 2 +#define FIFO_CONFIGURATION_SELECT 0 + u32 _unused2; + // offset 0x0040 + u32 memaddr; +#define START 28 +#define DIRECTION 27 +#define FIFO_DIAGNOSTIC_SELECT 24 +#define MEMORY_ADDRESS 0 + u32 memdata0; + u32 memdata1; + u32 _unused3; + // offset 0x0050 + u32 gpioctl; +#define GPIO3_LED_SELECT 12 +#define GPIO3_INTERRUPT_ENABLE 11 +#define GPIO2_INTERRUPT_ENABLE 10 +#define GPIO1_INTERRUPT_ENABLE 9 +#define GPIO0_INTERRUPT_ENABLE 8 +#define GPIO3_OUTPUT_ENABLE 7 +#define GPIO2_OUTPUT_ENABLE 6 +#define GPIO1_OUTPUT_ENABLE 5 +#define GPIO0_OUTPUT_ENABLE 4 +#define GPIO3_DATA 3 +#define GPIO2_DATA 2 +#define GPIO1_DATA 1 +#define GPIO0_DATA 0 + u32 gpiostat; +#define GPIO3_INTERRUPT 3 +#define GPIO2_INTERRUPT 2 +#define GPIO1_INTERRUPT 1 +#define GPIO0_INTERRUPT 0 +} __attribute__ ((packed)); + +/* usb control, BAR0 + 0x0080 */ +struct net2280_usb_regs { + // offset 0x0080 + u32 stdrsp; +#define STALL_UNSUPPORTED_REQUESTS 31 +#define SET_TEST_MODE 16 +#define GET_OTHER_SPEED_CONFIGURATION 15 +#define GET_DEVICE_QUALIFIER 14 +#define SET_ADDRESS 13 +#define ENDPOINT_SET_CLEAR_HALT 12 +#define DEVICE_SET_CLEAR_DEVICE_REMOTE_WAKEUP 11 +#define GET_STRING_DESCRIPTOR_2 10 +#define GET_STRING_DESCRIPTOR_1 9 +#define GET_STRING_DESCRIPTOR_0 8 +#define GET_SET_INTERFACE 6 +#define GET_SET_CONFIGURATION 5 +#define GET_CONFIGURATION_DESCRIPTOR 4 +#define GET_DEVICE_DESCRIPTOR 3 +#define GET_ENDPOINT_STATUS 2 +#define GET_INTERFACE_STATUS 1 +#define GET_DEVICE_STATUS 0 + u32 prodvendid; +#define PRODUCT_ID 16 +#define VENDOR_ID 0 + u32 relnum; + u32 usbctl; +#define SERIAL_NUMBER_INDEX 16 +#define PRODUCT_ID_STRING_ENABLE 13 +#define VENDOR_ID_STRING_ENABLE 12 +#define USB_ROOT_PORT_WAKEUP_ENABLE 11 +#define VBUS_PIN 10 +#define TIMED_DISCONNECT 9 +#define SUSPEND_IMMEDIATELY 7 +#define SELF_POWERED_USB_DEVICE 6 +#define REMOTE_WAKEUP_SUPPORT 5 +#define PME_POLARITY 4 +#define USB_DETECT_ENABLE 3 +#define PME_WAKEUP_ENABLE 2 +#define DEVICE_REMOTE_WAKEUP_ENABLE 1 +#define SELF_POWERED_STATUS 0 + // offset 0x0090 + u32 usbstat; +#define HIGH_SPEED 7 +#define FULL_SPEED 6 +#define GENERATE_RESUME 5 +#define GENERATE_DEVICE_REMOTE_WAKEUP 4 + u32 xcvrdiag; +#define FORCE_HIGH_SPEED_MODE 31 +#define FORCE_FULL_SPEED_MODE 30 +#define USB_TEST_MODE 24 +#define LINE_STATE 16 +#define TRANSCEIVER_OPERATION_MODE 2 +#define TRANSCEIVER_SELECT 1 +#define TERMINATION_SELECT 0 + u32 setup0123; + u32 setup4567; + // offset 0x0090 + u32 _unused0; + u32 ouraddr; +#define FORCE_IMMEDIATE 7 +#define OUR_USB_ADDRESS 0 + u32 ourconfig; +} __attribute__ ((packed)); + +/* pci control, BAR0 + 0x0100 */ +struct net2280_pci_regs { + // offset 0x0100 + u32 pcimstctl; +#define PCI_ARBITER_PARK_SELECT 13 +#define PCI_MULTI LEVEL_ARBITER 12 +#define PCI_RETRY_ABORT_ENABLE 11 +#define DMA_MEMORY_WRITE_AND_INVALIDATE_ENABLE 10 +#define DMA_READ_MULTIPLE_ENABLE 9 +#define DMA_READ_LINE_ENABLE 8 +#define PCI_MASTER_COMMAND_SELECT 6 +#define MEM_READ_OR_WRITE 0 +#define IO_READ_OR_WRITE 1 +#define CFG_READ_OR_WRITE 2 +#define PCI_MASTER_START 5 +#define PCI_MASTER_READ_WRITE 4 +#define PCI_MASTER_WRITE 0 +#define PCI_MASTER_READ 1 +#define PCI_MASTER_BYTE_WRITE_ENABLES 0 + u32 pcimstaddr; + u32 pcimstdata; + u32 pcimststat; +#define PCI_ARBITER_CLEAR 2 +#define PCI_EXTERNAL_ARBITER 1 +#define PCI_HOST_MODE 0 +} __attribute__ ((packed)); + +/* dma control, BAR0 + 0x0180 ... array of four structs like this, + * for channels 0..3. see also struct net2280_dma: descriptor + * that can be loaded into some of these registers. + */ +struct net2280_dma_regs { /* [11.7] */ + // offset 0x0180, 0x01a0, 0x01c0, 0x01e0, + u32 dmactl; +#define DMA_SCATTER_GATHER_DONE_INTERRUPT_ENABLE 25 +#define DMA_CLEAR_COUNT_ENABLE 21 +#define DESCRIPTOR_POLLING_RATE 19 +#define POLL_CONTINUOUS 0 +#define POLL_1_USEC 1 +#define POLL_100_USEC 2 +#define POLL_1_MSEC 3 +#define DMA_VALID_BIT_POLLING_ENABLE 18 +#define DMA_VALID_BIT_ENABLE 17 +#define DMA_SCATTER_GATHER_ENABLE 16 +#define DMA_OUT_AUTO_START_ENABLE 4 +#define DMA_PREEMPT_ENABLE 3 +#define DMA_FIFO_VALIDATE 2 +#define DMA_ENABLE 1 +#define DMA_ADDRESS_HOLD 0 + u32 dmastat; +#define DMA_SCATTER_GATHER_DONE_INTERRUPT 25 +#define DMA_TRANSACTION_DONE_INTERRUPT 24 +#define DMA_ABORT 1 +#define DMA_START 0 + u32 _unused0 [2]; + // offset 0x0190, 0x01b0, 0x01d0, 0x01f0, + u32 dmacount; +#define VALID_BIT 31 +#define DMA_DIRECTION 30 +#define DMA_DONE_INTERRUPT_ENABLE 29 +#define END_OF_CHAIN 28 +#define DMA_BYTE_COUNT_MASK ((1<<24)-1) +#define DMA_BYTE_COUNT 0 + u32 dmaaddr; + u32 dmadesc; + u32 _unused1; +} __attribute__ ((packed)); + +/* dedicated endpoint registers, BAR0 + 0x0200 */ + +struct net2280_dep_regs { /* [11.8] */ + // offset 0x0200, 0x0210, 0x220, 0x230, 0x240 + u32 dep_cfg; + // offset 0x0204, 0x0214, 0x224, 0x234, 0x244 + u32 dep_rsp; + u32 _unused [2]; +} __attribute__ ((packed)); + +/* configurable endpoint registers, BAR0 + 0x0300 ... array of seven structs + * like this, for ep0 then the configurable endpoints A..F + * ep0 reserved for control; E and F have only 64 bytes of fifo + */ +struct net2280_ep_regs { /* [11.9] */ + // offset 0x0300, 0x0320, 0x0340, 0x0360, 0x0380, 0x03a0, 0x03c0 + u32 ep_cfg; +#define ENDPOINT_BYTE_COUNT 16 +#define ENDPOINT_ENABLE 10 +#define ENDPOINT_TYPE 8 +#define ENDPOINT_DIRECTION 7 +#define ENDPOINT_NUMBER 0 + u32 ep_rsp; +#define SET_NAK_OUT_PACKETS 15 +#define SET_EP_HIDE_STATUS_PHASE 14 +#define SET_EP_FORCE_CRC_ERROR 13 +#define SET_INTERRUPT_MODE 12 +#define SET_CONTROL_STATUS_PHASE_HANDSHAKE 11 +#define SET_NAK_OUT_PACKETS_MODE 10 +#define SET_ENDPOINT_TOGGLE 9 +#define SET_ENDPOINT_HALT 8 +#define CLEAR_NAK_OUT_PACKETS 7 +#define CLEAR_EP_HIDE_STATUS_PHASE 6 +#define CLEAR_EP_FORCE_CRC_ERROR 5 +#define CLEAR_INTERRUPT_MODE 4 +#define CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE 3 +#define CLEAR_NAK_OUT_PACKETS_MODE 2 +#define CLEAR_ENDPOINT_TOGGLE 1 +#define CLEAR_ENDPOINT_HALT 0 + u32 ep_irqenb; +#define SHORT_PACKET_OUT_DONE_INTERRUPT_ENABLE 6 +#define SHORT_PACKET_TRANSFERRED_INTERRUPT_ENABLE 5 +#define DATA_PACKET_RECEIVED_INTERRUPT_ENABLE 3 +#define DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE 2 +#define DATA_OUT_PING_TOKEN_INTERRUPT_ENABLE 1 +#define DATA_IN_TOKEN_INTERRUPT_ENABLE 0 + u32 ep_stat; +#define FIFO_VALID_COUNT 24 +#define HIGH_BANDWIDTH_OUT_TRANSACTION_PID 22 +#define TIMEOUT 21 +#define USB_STALL_SENT 20 +#define USB_IN_NAK_SENT 19 +#define USB_IN_ACK_RCVD 18 +#define USB_OUT_PING_NAK_SENT 17 +#define USB_OUT_ACK_SENT 16 +#define FIFO_OVERFLOW 13 +#define FIFO_UNDERFLOW 12 +#define FIFO_FULL 11 +#define FIFO_EMPTY 10 +#define FIFO_FLUSH 9 +#define SHORT_PACKET_OUT_DONE_INTERRUPT 6 +#define SHORT_PACKET_TRANSFERRED_INTERRUPT 5 +#define NAK_OUT_PACKETS 4 +#define DATA_PACKET_RECEIVED_INTERRUPT 3 +#define DATA_PACKET_TRANSMITTED_INTERRUPT 2 +#define DATA_OUT_PING_TOKEN_INTERRUPT 1 +#define DATA_IN_TOKEN_INTERRUPT 0 + // offset 0x0310, 0x0330, 0x0350, 0x0370, 0x0390, 0x03b0, 0x03d0 + u32 ep_avail; + u32 ep_data; + u32 _unused0 [2]; +} __attribute__ ((packed)); + +/*-------------------------------------------------------------------------*/ + +#ifdef __KERNEL__ + +/* indexed registers [11.10] are accessed indirectly + * caller must own the device lock. + */ + +static inline u32 +get_idx_reg (struct net2280_regs *regs, u32 index) +{ + writel (index, ®s->idxaddr); + /* NOTE: synchs device/cpu memory views */ + return readl (®s->idxdata); +} + +static inline void +set_idx_reg (struct net2280_regs *regs, u32 index, u32 value) +{ + writel (index, ®s->idxaddr); + writel (value, ®s->idxdata); + /* posted, may not be visible yet */ +} + +#endif /* __KERNEL__ */ + + +#define REG_DIAG 0x0 +#define RETRY_COUNTER 16 +#define FORCE_PCI_SERR 11 +#define FORCE_PCI_INTERRUPT 10 +#define FORCE_USB_INTERRUPT 9 +#define FORCE_CPU_INTERRUPT 8 +#define ILLEGAL_BYTE_ENABLES 5 +#define FAST_TIMES 4 +#define FORCE_RECEIVE_ERROR 2 +#define FORCE_TRANSMIT_CRC_ERROR 0 +#define REG_FRAME 0x02 /* from last sof */ +#define REG_CHIPREV 0x03 /* in bcd */ +#define REG_HS_NAK_RATE 0x0a /* NAK per N uframes */ + +#define CHIPREV_1 0x0100 +#define CHIPREV_1A 0x0110 + +#ifdef __KERNEL__ + +/* ep a-f highspeed and fullspeed maxpacket, addresses + * computed from ep->num + */ +#define REG_EP_MAXPKT(dev,num) (((num) + 1) * 0x10 + \ + (((dev)->gadget.speed == USB_SPEED_HIGH) ? 0 : 1)) + +/*-------------------------------------------------------------------------*/ + +/* [8.3] for scatter/gather i/o + * use struct net2280_dma_regs bitfields + */ +struct net2280_dma { + u32 dmacount; + u32 dmaaddr; /* the buffer */ + u32 dmadesc; /* next dma descriptor */ + u32 _reserved; +} __attribute__ ((aligned (16))); + +/*-------------------------------------------------------------------------*/ + +/* DRIVER DATA STRUCTURES and UTILITIES */ + +struct net2280_ep { + struct usb_ep ep; + struct net2280_ep_regs *regs; + struct net2280_dma_regs *dma; + struct net2280_dma *dummy; + dma_addr_t td_dma; /* of dummy */ + struct net2280 *dev; + unsigned long irqs; + + /* analogous to a host-side qh */ + struct list_head queue; + const struct usb_endpoint_descriptor *desc; + unsigned num : 8, + fifo_size : 12, + in_fifo_validate : 1, + stopped : 1, + is_in : 1, + is_iso : 1; +}; + +static inline void allow_status (struct net2280_ep *ep) +{ + /* ep0 only */ + writel ( (1 << CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE) + | (1 << CLEAR_NAK_OUT_PACKETS_MODE) + , &ep->regs->ep_rsp); + ep->stopped = 1; +} + +/* count (<= 4) bytes in the next fifo write will be valid */ +static inline void set_fifo_bytecount (struct net2280_ep *ep, unsigned count) +{ + writeb (count, 2 + (u8 *) &ep->regs->ep_cfg); +} + +struct net2280_request { + struct usb_request req; + struct net2280_dma *td; + dma_addr_t td_dma; + struct list_head queue; + unsigned mapped : 1, + dma_done : 1, + valid : 1; +}; + +struct net2280 { + /* each pci device provides one gadget, several endpoints */ + struct usb_gadget gadget; + spinlock_t lock; + struct net2280_ep ep [7]; + struct usb_gadget_driver *driver; + unsigned enabled : 1, + protocol_stall : 1, + got_irq : 1, + region : 1, + selfpowered : 1; + u16 chiprev; + + /* pci state used to access those endpoints */ + struct pci_dev *pdev; + struct net2280_regs *regs; + struct net2280_usb_regs *usb; + struct net2280_pci_regs *pci; + struct net2280_dma_regs *dma; + struct net2280_dep_regs *dep; + struct net2280_ep_regs *epregs; + + struct pci_pool *requests; + // statistics... +}; + +static inline void set_halt (struct net2280_ep *ep) +{ + /* ep0 and bulk/intr endpoints */ + writel ( (1 << CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE) + /* set NAK_OUT for erratum 0114 */ + | ((ep->dev->chiprev == CHIPREV_1) << SET_NAK_OUT_PACKETS) + | (1 << SET_ENDPOINT_HALT) + , &ep->regs->ep_rsp); +} + +static inline void clear_halt (struct net2280_ep *ep) +{ + /* ep0 and bulk/intr endpoints */ + writel ( (1 << CLEAR_ENDPOINT_HALT) + | (1 << CLEAR_ENDPOINT_TOGGLE) + /* unless the gadget driver left a short packet in the + * fifo, this reverses the erratum 0114 workaround. + */ + | ((ep->dev->chiprev == CHIPREV_1) << CLEAR_NAK_OUT_PACKETS) + , &ep->regs->ep_rsp); +} + +#ifdef USE_RDK_LEDS + +static inline void net2280_led_init (struct net2280 *dev) +{ + /* LED3 (green) is on during USB activity. note erratum 0113. */ + writel ((1 << GPIO3_LED_SELECT) + | (1 << GPIO3_OUTPUT_ENABLE) + | (1 << GPIO2_OUTPUT_ENABLE) + | (1 << GPIO1_OUTPUT_ENABLE) + | (1 << GPIO0_OUTPUT_ENABLE) + , &dev->regs->gpioctl); +} + +/* indicate speed with bi-color LED 0/1 */ +static inline +void net2280_led_speed (struct net2280 *dev, enum usb_device_speed speed) +{ + u32 val = readl (&dev->regs->gpioctl); + switch (speed) { + case USB_SPEED_HIGH: /* green */ + val &= ~(1 << GPIO0_DATA); + val |= (1 << GPIO1_DATA); + break; + case USB_SPEED_FULL: /* red */ + val &= ~(1 << GPIO1_DATA); + val |= (1 << GPIO0_DATA); + break; + default: /* (off/black) */ + val &= ~((1 << GPIO1_DATA) | (1 << GPIO0_DATA)); + break; + } + writel (val, &dev->regs->gpioctl); +} + +/* indicate power with LED 2 */ +static inline void net2280_led_active (struct net2280 *dev, int is_active) +{ + u32 val = readl (&dev->regs->gpioctl); + + // FIXME this LED never seems to turn on. + if (is_active) + val |= GPIO2_DATA; + else + val &= ~GPIO2_DATA; + writel (val, &dev->regs->gpioctl); +} +static inline void net2280_led_shutdown (struct net2280 *dev) +{ + /* turn off all four GPIO*_DATA bits */ + writel (readl (&dev->regs->gpioctl) & ~0x0f, + &dev->regs->gpioctl); +} + +#else + +#define net2280_led_init(dev) do { } while (0) +#define net2280_led_speed(dev, speed) do { } while (0) +#define net2280_led_shutdown(dev) do { } while (0) + +#endif + +/*-------------------------------------------------------------------------*/ + +#define xprintk(dev,level,fmt,args...) \ + printk(level "%s %s: " fmt , driver_name , \ + dev->pdev->slot_name , ## args) + +#ifdef DEBUG +#undef DEBUG +#define DEBUG(dev,fmt,args...) \ + xprintk(dev , KERN_DEBUG , fmt , ## args) +#else +#define DEBUG(dev,fmt,args...) \ + do { } while (0) +#endif /* DEBUG */ + +#ifdef VERBOSE +#define VDEBUG DEBUG +#else +#define VDEBUG(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 inline void start_out_naking (struct net2280_ep *ep) +{ + /* NOTE: hardware races lurk here, and PING protocol issues */ + writel ((1 << SET_NAK_OUT_PACKETS), &ep->regs->ep_rsp); + /* synch with device */ + readl (&ep->regs->ep_rsp); +} + +#ifdef DEBUG +static inline void assert_out_naking (struct net2280_ep *ep, const char *where) +{ + u32 tmp = readl (&ep->regs->ep_stat); + + if ((tmp & (1 << NAK_OUT_PACKETS)) == 0) { + DEBUG (ep->dev, "%s %s %08x !NAK\n", + ep->ep.name, where, tmp); + writel ((1 << SET_NAK_OUT_PACKETS), + &ep->regs->ep_rsp); + } +} +#define ASSERT_OUT_NAKING(ep) assert_out_naking(ep,__FUNCTION__) +#else +#define ASSERT_OUT_NAKING(ep) do {} while (0) +#endif + +static inline void stop_out_naking (struct net2280_ep *ep) +{ + u32 tmp; + + tmp = readl (&ep->regs->ep_stat); + if ((tmp & (1 << NAK_OUT_PACKETS)) != 0) + writel ((1 << CLEAR_NAK_OUT_PACKETS), &ep->regs->ep_rsp); +} + +/*-------------------------------------------------------------------------*/ + +/* 2.5 and 2.4.older portability changes ... */ + +#ifndef container_of +#define container_of list_entry +#endif + +#ifndef likely +#define likely(x) (x) +#define unlikely(x) (x) +#endif + +#ifndef BUG_ON +#define BUG_ON(condition) do { if (unlikely((condition)!=0)) BUG(); } while(0) +#endif + +#ifndef WARN_ON +#define WARN_ON(x) do { } while (0) +#endif + +#ifndef IRQ_NONE +typedef void irqreturn_t; +#define IRQ_NONE +#define IRQ_HANDLED +#define IRQ_RETVAL(x) +#endif + +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/gadget/usbstring.c linux-2.4.23-pre8/drivers/usb/gadget/usbstring.c --- linux-2.4.22/drivers/usb/gadget/usbstring.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/gadget/usbstring.c 2003-10-22 22:47:58.000000000 +0000 @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2003 David Brownell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include + +#include +#include + + +/** + * usb_gadget_get_string - fill out a string descriptor + * @table: of c strings using iso latin/1 characters + * @id: string id, from low byte of wValue in get string descriptor + * @buf: at least 256 bytes + * + * Finds the iso latin/1 string matching the ID, and converts it into a + * string descriptor in utf16-le. + * Returns length of descriptor (always even) or negative errno + * + * If your driver needs stings in multiple languages, you'll need to + * to use some alternate solution for languages where the ISO 8859/1 + * (latin/1) character set can't be used. For example, they can't be + * used with Chinese (Big5, GB2312, etc), Japanese, Korean, or many other + * languages. You'd likely "switch (wIndex) { ... }" in your ep0 + * string descriptor logic, using this routine in cases where "western + * european" characters suffice for the strings being returned. + */ +int +usb_gadget_get_string (struct usb_gadget_strings *table, int id, u8 *buf) +{ + struct usb_string *s; + int len; + + /* descriptor 0 has the language id */ + if (id == 0) { + buf [0] = 4; + buf [1] = USB_DT_STRING; + buf [2] = (u8) table->language; + buf [3] = (u8) (table->language >> 8); + return 4; + } + for (s = table->strings; s && s->s; s++) + if (s->id == id) + break; + + /* unrecognized: stall. */ + if (!s || !s->s) + return -EINVAL; + + /* string descriptors have length, tag, then UTF16-LE text */ + len = min ((size_t) 126, strlen (s->s)); + buf [0] = (len + 1) * 2; + buf [1] = USB_DT_STRING; + memset (buf + 2, 0, 2 * len); /* zero all the high bytes */ + while (len) { + buf [2 * len] = s->s [len - 1]; + len--; + } + return buf [0]; +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/gadget/zero.c linux-2.4.23-pre8/drivers/usb/gadget/zero.c --- linux-2.4.22/drivers/usb/gadget/zero.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/gadget/zero.c 2003-10-22 22:47:46.000000000 +0000 @@ -0,0 +1,1261 @@ +/* + * zero.c -- Gadget Zero, for USB development + * + * Copyright (C) 2003 David Brownell + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The names of the above-listed copyright holders may not be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * ALTERNATIVELY, this software may be distributed under the terms of the + * GNU General Public License ("GPL") as published by the Free Software + * Foundation, either version 2 of that License or (at your option) any + * later version. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/* + * Gadget Zero only needs two bulk endpoints, and is an example of how you + * can write a hardware-agnostic gadget driver running inside a USB device. + * + * Hardware details are visible (see CONFIG_USB_ZERO_* below) but don't + * affect most of the driver. + * + * Use it with the Linux host/master side "usbtest" driver to get a basic + * functional test of your device-side usb stack, or with "usb-skeleton". + * + * It supports two similar configurations. One sinks whatever the usb host + * writes, and in return sources zeroes. The other loops whatever the host + * writes back, so the host can read it. Module options include: + * + * buflen=N default N=4096, buffer size used + * qlen=N default N=32, how many buffers in the loopback queue + * loopdefault default false, list loopback config first + * + * Many drivers will only have one configuration, letting them be much + * simpler if they also don't support high speed operation (like this + * driver does). + */ + +#define DEBUG 1 +// #define VERBOSE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + + +/*-------------------------------------------------------------------------*/ + +#define DRIVER_VERSION "Bastille Day 2003" + +static const char shortname [] = "zero"; +static const char longname [] = "Gadget Zero"; + +static const char source_sink [] = "source and sink data"; +static const char loopback [] = "loop input to output"; + +/*-------------------------------------------------------------------------*/ + +/* + * hardware-specific configuration, controlled by which device + * controller driver was configured. + * + * CHIP ... hardware identifier + * DRIVER_VERSION_NUM ... alerts the host side driver to differences + * EP0_MAXPACKET ... controls packetization of control requests + * EP_*_NAME ... which endpoints do we use for which purpose? + * EP_*_NUM ... numbers for them (often limited by hardware) + * HIGHSPEED ... define if ep0 and descriptors need high speed support + * MAX_USB_POWER ... define if we use other than 100 mA bus current + * SELFPOWER ... unless we can run on bus power, USB_CONFIG_ATT_SELFPOWER + * WAKEUP ... if hardware supports remote wakeup AND we will issue the + * usb_gadget_wakeup() call to initiate it, USB_CONFIG_ATT_WAKEUP + * + * hw_optimize(gadget) ... for any hardware tweaks we want to kick in + * before we enable our endpoints + * + * add other defines for other portability issues, like hardware that + * for some reason doesn't handle full speed bulk maxpacket of 64. + */ + +/* + * DRIVER_VERSION_NUM 0x0000 (?): Martin Diehl's ezusb an21/fx code + */ + +/* + * NetChip 2280, PCI based. + * + * This has half a dozen configurable endpoints, four with dedicated + * DMA channels to manage their FIFOs. It supports high speed. + * Those endpoints can be arranged in any desired configuration. + */ +#ifdef CONFIG_USB_ZERO_NET2280 +#define CHIP "net2280" +#define DRIVER_VERSION_NUM 0x0111 +#define EP0_MAXPACKET 64 +static const char EP_OUT_NAME [] = "ep-a"; +#define EP_OUT_NUM 2 +static const char EP_IN_NAME [] = "ep-b"; +#define EP_IN_NUM 2 +#define HIGHSPEED +/* specific hardware configs could be bus-powered */ +#define SELFPOWER USB_CONFIG_ATT_SELFPOWER +/* supports remote wakeup, but this driver doesn't */ + +extern int net2280_set_fifo_mode (struct usb_gadget *gadget, int mode); + +static inline void hw_optimize (struct usb_gadget *gadget) +{ + /* we can have bigger ep-a/ep-b fifos (2KB each, 4 packets + * for highspeed bulk) because we're not using ep-c/ep-d. + */ + net2280_set_fifo_mode (gadget, 1); +} +#endif + +/* + * PXA-2xx UDC: widely used in second gen Linux-capable PDAs. + * + * This has fifteen fixed-function full speed endpoints, and it + * can support all USB transfer types. + * + * These supports three or four configurations, with fixed numbers. + * The hardware interprets SET_INTERFACE, net effect is that you + * can't use altsettings or reset the interfaces independently. + * So stick to a single interface. + */ +#ifdef CONFIG_USB_ZERO_PXA2XX +#define CHIP "pxa2xx" +#define DRIVER_VERSION_NUM 0x0113 +#define EP0_MAXPACKET 16 +static const char EP_OUT_NAME [] = "ep12out-bulk"; +#define EP_OUT_NUM 12 +static const char EP_IN_NAME [] = "ep11in-bulk"; +#define EP_IN_NUM 11 +/* doesn't support bus-powered operation */ +#define SELFPOWER USB_CONFIG_ATT_SELFPOWER +/* supports remote wakeup, but this driver doesn't */ + +/* no hw optimizations to apply */ +#define hw_optimize(g) do {} while (0); +#endif + +/* + * SA-1100 UDC: widely used in first gen Linux-capable PDAs. + * + * This has only two fixed function endpoints, which can only + * be used for bulk (or interrupt) transfers. (Plus control.) + * + * Since it can't flush its TX fifos without disabling the UDC, + * the current configuration or altsettings can't change except + * in special situations. So this is a case of "choose it right + * during enumeration" ... + */ +#ifdef CONFIG_USB_ZERO_SA1100 +#define CHIP "sa1100" +#define DRIVER_VERSION_NUM 0x0115 +#define EP0_MAXPACKET 8 +static const char EP_OUT_NAME [] = "ep1out-bulk"; +#define EP_OUT_NUM 1 +static const char EP_IN_NAME [] = "ep2in-bulk"; +#define EP_IN_NUM 2 +/* doesn't support bus-powered operation */ +#define SELFPOWER USB_CONFIG_ATT_SELFPOWER +/* doesn't support remote wakeup? */ + +/* no hw optimizations to apply */ +#define hw_optimize(g) do {} while (0); +#endif + +/*-------------------------------------------------------------------------*/ + +#ifndef EP0_MAXPACKET +# error Configure some USB peripheral controller driver! +#endif + +/* power usage is config specific. + * hardware that supports remote wakeup defaults to disabling it. + */ + +#ifndef SELFPOWER +/* default: say we rely on bus power */ +#define SELFPOWER 0 +/* else: + * - SELFPOWER value must be USB_CONFIG_ATT_SELFPOWER + * - MAX_USB_POWER may be nonzero. + */ +#endif + +#ifndef MAX_USB_POWER +/* any hub supports this steady state bus power consumption */ +#define MAX_USB_POWER 100 /* mA */ +#endif + +#ifndef WAKEUP +/* default: this driver won't do remote wakeup */ +#define WAKEUP 0 +/* else value must be USB_CONFIG_ATT_WAKEUP */ +#endif + +/*-------------------------------------------------------------------------*/ + +/* big enough to hold our biggest descriptor */ +#define USB_BUFSIZ 256 + +struct zero_dev { + spinlock_t lock; + struct usb_gadget *gadget; + struct usb_request *req; /* for control responses */ + + /* when configured, we have one of two configs: + * - source data (in to host) and sink it (out from host) + * - or loop it back (out from host back in to host) + */ + u8 config; + struct usb_ep *in_ep, *out_ep; +}; + +#define xprintk(d,level,fmt,args...) \ + printk(level "%s %s: " fmt , shortname , (d)->gadget->dev.bus_id , \ + ## args) + +#ifdef DEBUG +#undef DEBUG +#define DEBUG(dev,fmt,args...) \ + xprintk(dev , KERN_DEBUG , fmt , ## args) +#else +#define DEBUG(dev,fmt,args...) \ + do { } while (0) +#endif /* DEBUG */ + +#ifdef VERBOSE +#define VDEBUG DEBUG +#else +#define VDEBUG(dev,fmt,args...) \ + do { } while (0) +#endif /* DEBUG */ + +#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 unsigned buflen = 4096; +static unsigned qlen = 32; +static unsigned pattern = 0; + +/* + * Normally the "loopback" configuration is second (index 1) so + * it's not the default. Here's where to change that order, to + * work better with hosts (like Linux ... for now!) where config + * changes are problematic. + */ +static int loopdefault = 0; + + +MODULE_PARM (buflen, "i"); +MODULE_PARM_DESC (buflen, "size of i/o buffers"); + +MODULE_PARM (qlen, "i"); +MODULE_PARM_DESC (qlen, "depth of loopback buffering"); + +MODULE_PARM (pattern, "i"); +MODULE_PARM_DESC (pattern, "0 for default all-zeroes, 1 for mod63"); + +MODULE_PARM (loopdefault, "b"); +MODULE_PARM_DESC (loopdefault, "true to have default config be loopback"); + +/*-------------------------------------------------------------------------*/ + +/* Thanks to NetChip Technologies for donating this product ID. + * + * DO NOT REUSE THESE IDs with any other driver!! Ever!! + * Instead: allocate your own, using normal USB-IF procedures. + */ +#define DRIVER_VENDOR_NUM 0x0525 /* NetChip */ +#define DRIVER_PRODUCT_NUM 0xa4a0 /* Linux-USB "Gadget Zero" */ + +/*-------------------------------------------------------------------------*/ + +/* + * DESCRIPTORS ... most are static, but strings and (full) + * configuration descriptors are built on demand. + */ + +#define STRING_MANUFACTURER 25 +#define STRING_PRODUCT 42 +#define STRING_SERIAL 101 +#define STRING_SOURCE_SINK 250 +#define STRING_LOOPBACK 251 + +/* + * This device advertises two configurations; these numbers work + * on a pxa250 as well as more flexible hardware. + */ +#define CONFIG_SOURCE_SINK 3 +#define CONFIG_LOOPBACK 2 + +static const struct usb_device_descriptor +device_desc = { + .bLength = sizeof device_desc, + .bDescriptorType = USB_DT_DEVICE, + + .bcdUSB = __constant_cpu_to_le16 (0x0200), + .bDeviceClass = USB_CLASS_VENDOR_SPEC, + .bMaxPacketSize0 = EP0_MAXPACKET, + + .idVendor = __constant_cpu_to_le16 (DRIVER_VENDOR_NUM), + .idProduct = __constant_cpu_to_le16 (DRIVER_PRODUCT_NUM), + .bcdDevice = __constant_cpu_to_le16 (DRIVER_VERSION_NUM), + .iManufacturer = STRING_MANUFACTURER, + .iProduct = STRING_PRODUCT, + .iSerialNumber = STRING_SERIAL, + .bNumConfigurations = 2, +}; + +static const struct usb_config_descriptor +source_sink_config = { + .bLength = sizeof source_sink_config, + .bDescriptorType = USB_DT_CONFIG, + + /* compute wTotalLength on the fly */ + .bNumInterfaces = 1, + .bConfigurationValue = CONFIG_SOURCE_SINK, + .iConfiguration = STRING_SOURCE_SINK, + .bmAttributes = USB_CONFIG_ATT_ONE | SELFPOWER | WAKEUP, + .bMaxPower = (MAX_USB_POWER + 1) / 2, +}; + +static const struct usb_config_descriptor +loopback_config = { + .bLength = sizeof loopback_config, + .bDescriptorType = USB_DT_CONFIG, + + /* compute wTotalLength on the fly */ + .bNumInterfaces = 1, + .bConfigurationValue = CONFIG_LOOPBACK, + .iConfiguration = STRING_LOOPBACK, + .bmAttributes = USB_CONFIG_ATT_ONE | SELFPOWER | WAKEUP, + .bMaxPower = (MAX_USB_POWER + 1) / 2, +}; + +/* one interface in each configuration */ + +static const struct usb_interface_descriptor +source_sink_intf = { + .bLength = sizeof source_sink_intf, + .bDescriptorType = USB_DT_INTERFACE, + + .bNumEndpoints = 2, + .bInterfaceClass = USB_CLASS_VENDOR_SPEC, + .iInterface = STRING_SOURCE_SINK, +}; + +static const struct usb_interface_descriptor +loopback_intf = { + .bLength = sizeof loopback_intf, + .bDescriptorType = USB_DT_INTERFACE, + + .bNumEndpoints = 2, + .bInterfaceClass = USB_CLASS_VENDOR_SPEC, + .iInterface = STRING_LOOPBACK, +}; + +/* two full speed bulk endpoints; their use is config-dependent */ + +static const struct usb_endpoint_descriptor +fs_source_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_IN_NUM | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = __constant_cpu_to_le16 (64), +}; + +static const struct usb_endpoint_descriptor +fs_sink_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_OUT_NUM, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = __constant_cpu_to_le16 (64), +}; + +#ifdef HIGHSPEED + +/* + * usb 2.0 devices need to expose both high speed and full speed + * descriptors, unless they only run at full speed. + * + * that means alternate endpoint descriptors (bigger packets) + * and a "device qualifier" ... plus more construction options + * for the config descriptor. + */ + +static const struct usb_endpoint_descriptor +hs_source_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_IN_NUM | USB_DIR_IN, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = __constant_cpu_to_le16 (512), +}; + +static const struct usb_endpoint_descriptor +hs_sink_desc = { + .bLength = USB_DT_ENDPOINT_SIZE, + .bDescriptorType = USB_DT_ENDPOINT, + + .bEndpointAddress = EP_OUT_NUM, + .bmAttributes = USB_ENDPOINT_XFER_BULK, + .wMaxPacketSize = __constant_cpu_to_le16 (512), +}; + +static const struct usb_qualifier_descriptor +dev_qualifier = { + .bLength = sizeof dev_qualifier, + .bDescriptorType = USB_DT_DEVICE_QUALIFIER, + + .bcdUSB = __constant_cpu_to_le16 (0x0200), + .bDeviceClass = USB_CLASS_VENDOR_SPEC, + + /* assumes ep0 uses the same value for both speeds ... */ + .bMaxPacketSize0 = EP0_MAXPACKET, + + .bNumConfigurations = 2, +}; + +/* maxpacket and other transfer characteristics vary by speed. */ +#define ep_desc(g,hs,fs) (((g)->speed==USB_SPEED_HIGH)?(hs):(fs)) + +#else + +/* if there's no high speed support, maxpacket doesn't change. */ +#define ep_desc(g,hs,fs) fs + +#endif /* !HIGHSPEED */ + +static char serial [40]; + +/* static strings, in iso 8859/1 */ +static struct usb_string strings [] = { + { STRING_MANUFACTURER, UTS_SYSNAME " " UTS_RELEASE " with " CHIP, }, + { STRING_PRODUCT, longname, }, + { STRING_SERIAL, serial, }, + { STRING_LOOPBACK, loopback, }, + { STRING_SOURCE_SINK, source_sink, }, + { } /* end of list */ +}; + +static struct usb_gadget_strings stringtab = { + .language = 0x0409, /* en-us */ + .strings = strings, +}; + +/* + * config descriptors are also handcrafted. these must agree with code + * that sets configurations, and with code managing interfaces and their + * altsettings. other complexity may come from: + * + * - high speed support, including "other speed config" rules + * - multiple configurations + * - interfaces with alternate settings + * - embedded class or vendor-specific descriptors + * + * this handles high speed, and has a second config that could as easily + * have been an alternate interface setting (on most hardware). + * + * NOTE: to demonstrate (and test) more USB capabilities, this driver + * should include an altsetting to test interrupt transfers, including + * high bandwidth modes at high speed. (Maybe work like Intel's test + * device?) + */ +static int +config_buf (enum usb_device_speed speed, + u8 *buf, u8 type, unsigned index) +{ + int is_source_sink; + const unsigned config_len = USB_DT_CONFIG_SIZE + + USB_DT_INTERFACE_SIZE + + 2 * USB_DT_ENDPOINT_SIZE; +#ifdef HIGHSPEED + int hs; +#endif + /* two configurations will always be index 0 and index 1 */ + if (index > 1) + return -EINVAL; + if (config_len > USB_BUFSIZ) + return -EDOM; + is_source_sink = loopdefault ? (index == 1) : (index == 0); + + /* config (or other speed config) */ + if (is_source_sink) + memcpy (buf, &source_sink_config, USB_DT_CONFIG_SIZE); + else + memcpy (buf, &loopback_config, USB_DT_CONFIG_SIZE); + buf [1] = type; + ((struct usb_config_descriptor *) buf)->wTotalLength + = __constant_cpu_to_le16 (config_len); + buf += USB_DT_CONFIG_SIZE; + + /* one interface */ + if (is_source_sink) + memcpy (buf, &source_sink_intf, USB_DT_INTERFACE_SIZE); + else + memcpy (buf, &loopback_intf, USB_DT_INTERFACE_SIZE); + buf += USB_DT_INTERFACE_SIZE; + + /* the endpoints in that interface (at that speed) */ +#ifdef HIGHSPEED + hs = (speed == USB_SPEED_HIGH); + if (type == USB_DT_OTHER_SPEED_CONFIG) + hs = !hs; + if (hs) { + memcpy (buf, &hs_source_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; + memcpy (buf, &hs_sink_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; + } else +#endif + { + memcpy (buf, &fs_source_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; + memcpy (buf, &fs_sink_desc, USB_DT_ENDPOINT_SIZE); + buf += USB_DT_ENDPOINT_SIZE; + } + + return config_len; +} + +/*-------------------------------------------------------------------------*/ + +static struct usb_request * +alloc_ep_req (struct usb_ep *ep, unsigned length) +{ + struct usb_request *req; + + req = usb_ep_alloc_request (ep, GFP_ATOMIC); + if (req) { + req->length = length; + req->buf = usb_ep_alloc_buffer (ep, length, + &req->dma, GFP_ATOMIC); + if (!req->buf) { + usb_ep_free_request (ep, req); + req = 0; + } + } + return req; +} + +static void free_ep_req (struct usb_ep *ep, struct usb_request *req) +{ + if (req->buf) + usb_ep_free_buffer (ep, req->buf, req->dma, req->length); + usb_ep_free_request (ep, req); +} + +/*-------------------------------------------------------------------------*/ + +/* optionally require specific source/sink data patterns */ + +static inline int +check_read_data ( + struct zero_dev *dev, + struct usb_ep *ep, + struct usb_request *req +) +{ + unsigned i; + u8 *buf = req->buf; + + for (i = 0; i < req->actual; i++, buf++) { + switch (pattern) { + /* all-zeroes has no synchronization issues */ + case 0: + if (*buf == 0) + continue; + 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: + if (*buf == (u8)(i % 63)) + continue; + break; + } + ERROR (dev, "bad OUT byte, buf [%d] = %d\n", i, *buf); + usb_ep_set_halt (ep); + return -EINVAL; + } + return 0; +} + +static inline void +reinit_write_data ( + struct zero_dev *dev, + struct usb_ep *ep, + struct usb_request *req +) +{ + unsigned i; + u8 *buf = req->buf; + + switch (pattern) { + case 0: + memset (req->buf, 0, req->length); + break; + case 1: + for (i = 0; i < req->length; i++) + *buf++ = (u8) (i % 63); + break; + } +} + +/* if there is only one request in the queue, there'll always be an + * irq delay between end of one request and start of the next. + * that prevents using hardware dma queues. + */ +static void source_sink_complete (struct usb_ep *ep, struct usb_request *req) +{ + struct zero_dev *dev = ep->driver_data; + int status = req->status; + + switch (status) { + + case 0: /* normal completion? */ + if (ep == dev->out_ep) + check_read_data (dev, ep, req); + else + reinit_write_data (dev, ep, req); + break; + + /* this endpoint is normally active while we're configured */ + case -ECONNABORTED: /* hardware forced ep reset */ + case -ECONNRESET: /* request dequeued */ + case -ESHUTDOWN: /* disconnect from host */ + VDEBUG (dev, "%s gone (%d), %d/%d\n", ep->name, status, + req->actual, req->length); + if (ep == dev->out_ep) + check_read_data (dev, ep, req); + free_ep_req (ep, req); + return; + + case -EOVERFLOW: /* buffer overrun on read means that + * we didn't provide a big enough + * buffer. + */ + default: +#if 1 + DEBUG (dev, "%s complete --> %d, %d/%d\n", ep->name, + status, req->actual, req->length); +#endif + case -EREMOTEIO: /* short read */ + break; + } + + status = usb_ep_queue (ep, req, GFP_ATOMIC); + if (status) { + ERROR (dev, "kill %s: resubmit %d bytes --> %d\n", + ep->name, req->length, status); + usb_ep_set_halt (ep); + /* FIXME recover later ... somehow */ + } +} + +static struct usb_request * +source_sink_start_ep (struct usb_ep *ep, int gfp_flags) +{ + struct usb_request *req; + int status; + + req = alloc_ep_req (ep, buflen); + if (!req) + return 0; + + memset (req->buf, 0, req->length); + req->complete = source_sink_complete; + + if (strcmp (ep->name, EP_IN_NAME) == 0) + reinit_write_data (ep->driver_data, ep, req); + + status = usb_ep_queue (ep, req, gfp_flags); + if (status) { + struct zero_dev *dev = ep->driver_data; + + ERROR (dev, "start %s --> %d\n", ep->name, status); + free_ep_req (ep, req); + req = 0; + } + + return req; +} + +static int +set_source_sink_config (struct zero_dev *dev, int gfp_flags) +{ + int result = 0; + struct usb_ep *ep; + struct usb_gadget *gadget = dev->gadget; + + gadget_for_each_ep (ep, gadget) { + const struct usb_endpoint_descriptor *d; + + /* one endpoint writes (sources) zeroes in (to the host) */ + if (strcmp (ep->name, EP_IN_NAME) == 0) { + d = ep_desc (gadget, &hs_source_desc, &fs_source_desc); + result = usb_ep_enable (ep, d); + if (result == 0) { + ep->driver_data = dev; + if (source_sink_start_ep (ep, gfp_flags) != 0) { + dev->in_ep = ep; + continue; + } + usb_ep_disable (ep); + result = -EIO; + } + + /* one endpoint reads (sinks) anything out (from the host) */ + } else if (strcmp (ep->name, EP_OUT_NAME) == 0) { + d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc); + result = usb_ep_enable (ep, d); + if (result == 0) { + ep->driver_data = dev; + if (source_sink_start_ep (ep, gfp_flags) != 0) { + dev->out_ep = ep; + continue; + } + usb_ep_disable (ep); + result = -EIO; + } + + /* ignore any other endpoints */ + } else + continue; + + /* stop on error */ + ERROR (dev, "can't start %s, result %d\n", ep->name, result); + break; + } + if (result == 0) + DEBUG (dev, "buflen %d\n", buflen); + + /* caller is responsible for cleanup on error */ + return result; +} + +/*-------------------------------------------------------------------------*/ + +static void loopback_complete (struct usb_ep *ep, struct usb_request *req) +{ + struct zero_dev *dev = ep->driver_data; + int status = req->status; + + switch (status) { + + case 0: /* normal completion? */ + if (ep == dev->out_ep) { + /* loop this OUT packet back IN to the host */ + req->zero = (req->actual < req->length); + req->length = req->actual; + status = usb_ep_queue (dev->in_ep, req, GFP_ATOMIC); + if (status == 0) + return; + + /* "should never get here" */ + ERROR (dev, "can't loop %s to %s: %d\n", + ep->name, dev->in_ep->name, + status); + } + + /* queue the buffer for some later OUT packet */ + req->length = buflen; + status = usb_ep_queue (dev->out_ep, req, GFP_ATOMIC); + if (status == 0) + return; + + /* "should never get here" */ + /* FALLTHROUGH */ + + default: + ERROR (dev, "%s loop complete --> %d, %d/%d\n", ep->name, + status, req->actual, req->length); + /* FALLTHROUGH */ + + /* NOTE: since this driver doesn't maintain an explicit record + * of requests it submitted (just maintains qlen count), we + * rely on the hardware driver to clean up on disconnect or + * endpoint disable. + */ + case -ECONNABORTED: /* hardware forced ep reset */ + case -ECONNRESET: /* request dequeued */ + case -ESHUTDOWN: /* disconnect from host */ + free_ep_req (ep, req); + return; + } +} + +static int +set_loopback_config (struct zero_dev *dev, int gfp_flags) +{ + int result = 0; + struct usb_ep *ep; + struct usb_gadget *gadget = dev->gadget; + + gadget_for_each_ep (ep, gadget) { + const struct usb_endpoint_descriptor *d; + + /* one endpoint writes data back IN to the host */ + if (strcmp (ep->name, EP_IN_NAME) == 0) { + d = ep_desc (gadget, &hs_source_desc, &fs_source_desc); + result = usb_ep_enable (ep, d); + if (result == 0) { + ep->driver_data = dev; + dev->in_ep = ep; + continue; + } + + /* one endpoint just reads OUT packets */ + } else if (strcmp (ep->name, EP_OUT_NAME) == 0) { + d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc); + result = usb_ep_enable (ep, d); + if (result == 0) { + ep->driver_data = dev; + dev->out_ep = ep; + continue; + } + + /* ignore any other endpoints */ + } else + continue; + + /* stop on error */ + ERROR (dev, "can't enable %s, result %d\n", ep->name, result); + break; + } + + /* allocate a bunch of read buffers and queue them all at once. + * we buffer at most 'qlen' transfers; fewer if any need more + * than 'buflen' bytes each. + */ + if (result == 0) { + struct usb_request *req; + unsigned i; + + ep = dev->out_ep; + for (i = 0; i < qlen && result == 0; i++) { + req = alloc_ep_req (ep, buflen); + if (req) { + req->complete = loopback_complete; + result = usb_ep_queue (ep, req, GFP_ATOMIC); + if (result) + DEBUG (dev, "%s queue req --> %d\n", + ep->name, result); + } else + result = -ENOMEM; + } + } + if (result == 0) + DEBUG (dev, "qlen %d, buflen %d\n", qlen, buflen); + + /* caller is responsible for cleanup on error */ + return result; +} + +/*-------------------------------------------------------------------------*/ + +static void zero_reset_config (struct zero_dev *dev) +{ + if (dev->config == 0) + return; + + DEBUG (dev, "reset config\n"); + + /* just disable endpoints, forcing completion of pending i/o. + * all our completion handlers free their requests in this case. + */ + if (dev->in_ep) { + usb_ep_disable (dev->in_ep); + dev->in_ep = 0; + } + if (dev->out_ep) { + usb_ep_disable (dev->out_ep); + dev->out_ep = 0; + } + dev->config = 0; +} + +/* change our operational config. this code must agree with the code + * that returns config descriptors, and altsetting code. + * + * it's also responsible for power management interactions. some + * configurations might not work with our current power sources. + * + * note that some device controller hardware will constrain what this + * code can do, perhaps by disallowing more than one configuration or + * by limiting configuration choices (like the pxa2xx). + */ +static int +zero_set_config (struct zero_dev *dev, unsigned number, int gfp_flags) +{ + int result = 0; + struct usb_gadget *gadget = dev->gadget; + + if (number == dev->config) + return 0; + +#ifdef CONFIG_USB_ZERO_SA1100 + if (dev->config) { + /* tx fifo is full, but we can't clear it...*/ + INFO (dev, "can't change configurations\n"); + return -ESPIPE; + } +#endif + zero_reset_config (dev); + hw_optimize (gadget); + + switch (number) { + case CONFIG_SOURCE_SINK: + result = set_source_sink_config (dev, gfp_flags); + break; + case CONFIG_LOOPBACK: + result = set_loopback_config (dev, gfp_flags); + break; + default: + result = -EINVAL; + /* FALL THROUGH */ + case 0: + return result; + } + + if (!result && (!dev->in_ep || !dev->out_ep)) + result = -ENODEV; + if (result) + zero_reset_config (dev); + else { + char *speed; + + switch (gadget->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; + } + + dev->config = number; + INFO (dev, "%s speed config #%d: %s\n", speed, number, + (number == CONFIG_SOURCE_SINK) + ? source_sink : loopback); + } + return result; +} + +/*-------------------------------------------------------------------------*/ + +static void zero_setup_complete (struct usb_ep *ep, struct usb_request *req) +{ + if (req->status || req->actual != req->length) + DEBUG ((struct zero_dev *) ep->driver_data, + "setup complete --> %d, %d/%d\n", + req->status, req->actual, req->length); +} + +/* + * The setup() callback implements all the ep0 functionality that's + * not handled lower down, in hardware or the hardware driver (like + * device and endpoint feature flags, and their status). It's all + * housekeeping for the gadget function we're implementing. Most of + * the work is in config-specific setup. + */ +static int +zero_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) +{ + struct zero_dev *dev = get_gadget_data (gadget); + struct usb_request *req = dev->req; + int value = -EOPNOTSUPP; + + /* usually this stores reply data in the pre-allocated ep0 buffer, + * but config change events will reconfigure hardware. + */ + switch (ctrl->bRequest) { + + case USB_REQ_GET_DESCRIPTOR: + if (ctrl->bRequestType != USB_DIR_IN) + break; + switch (ctrl->wValue >> 8) { + + case USB_DT_DEVICE: + value = min (ctrl->wLength, (u16) sizeof device_desc); + memcpy (req->buf, &device_desc, value); + break; +#ifdef HIGHSPEED + case USB_DT_DEVICE_QUALIFIER: + value = min (ctrl->wLength, (u16) sizeof dev_qualifier); + memcpy (req->buf, &dev_qualifier, value); + break; + + case USB_DT_OTHER_SPEED_CONFIG: + // FALLTHROUGH +#endif /* HIGHSPEED */ + case USB_DT_CONFIG: + value = config_buf (gadget->speed, req->buf, + ctrl->wValue >> 8, + ctrl->wValue & 0xff); + if (value >= 0) + value = min (ctrl->wLength, (u16) value); + break; + + case USB_DT_STRING: + /* wIndex == language code. + * this driver only handles one language, you can + * add others even if they don't use iso8859/1 + */ + value = usb_gadget_get_string (&stringtab, + ctrl->wValue & 0xff, req->buf); + if (value >= 0) + value = min (ctrl->wLength, (u16) value); + break; + } + break; + + /* currently two configs, two speeds */ + case USB_REQ_SET_CONFIGURATION: + if (ctrl->bRequestType != 0) + break; + spin_lock (&dev->lock); + value = zero_set_config (dev, ctrl->wValue, GFP_ATOMIC); + spin_unlock (&dev->lock); + break; + case USB_REQ_GET_CONFIGURATION: + if (ctrl->bRequestType != USB_DIR_IN) + break; + *(u8 *)req->buf = dev->config; + value = min (ctrl->wLength, (u16) 1); + break; + + /* until we add altsetting support, or other interfaces, + * only 0/0 are possible. pxa2xx only supports 0/0 (poorly) + * and already killed pending endpoint I/O. + */ + case USB_REQ_SET_INTERFACE: + if (ctrl->bRequestType != USB_RECIP_INTERFACE) + break; + spin_lock (&dev->lock); + if (dev->config && ctrl->wIndex == 0 && ctrl->wValue == 0) { + u8 config = dev->config; + + /* resets interface configuration, forgets about + * previous transaction state (queued bufs, etc) + * and re-inits endpoint state (toggle etc) + * no response queued, just zero status == success. + * if we had more than one interface we couldn't + * use this "reset the config" shortcut. + */ + zero_reset_config (dev); + zero_set_config (dev, config, GFP_ATOMIC); + value = 0; + } + spin_unlock (&dev->lock); + break; + case USB_REQ_GET_INTERFACE: + if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)) + break; + if (!dev->config) + break; + if (ctrl->wIndex != 0) { + value = -EDOM; + break; + } + *(u8 *)req->buf = 0; + value = min (ctrl->wLength, (u16) 1); + break; + + default: + VDEBUG (dev, + "unknown control req%02x.%02x v%04x i%04x l%d\n", + ctrl->bRequestType, ctrl->bRequest, + ctrl->wValue, ctrl->wIndex, ctrl->wLength); + } + + /* respond with data transfer before status phase? */ + if (value >= 0) { + req->length = value; + value = usb_ep_queue (gadget->ep0, req, GFP_ATOMIC); + if (value < 0) { + DEBUG (dev, "ep_queue --> %d\n", value); + req->status = 0; + zero_setup_complete (gadget->ep0, req); + } + } + + /* device either stalls (value < 0) or reports success */ + return value; +} + +static void +zero_disconnect (struct usb_gadget *gadget) +{ + struct zero_dev *dev = get_gadget_data (gadget); + unsigned long flags; + + spin_lock_irqsave (&dev->lock, flags); + zero_reset_config (dev); + + /* a more significant application might have some non-usb + * activities to quiesce here, saving resources like power + * or pushing the notification up a network stack. + */ + spin_unlock_irqrestore (&dev->lock, flags); + + /* next we may get setup() calls to enumerate new connections; + * or an unbind() during shutdown (including removing module). + */ +} + +/*-------------------------------------------------------------------------*/ + +static void +zero_unbind (struct usb_gadget *gadget) +{ + struct zero_dev *dev = get_gadget_data (gadget); + + DEBUG (dev, "unbind\n"); + + /* we've already been disconnected ... no i/o is active */ + if (dev->req) + free_ep_req (gadget->ep0, dev->req); + kfree (dev); + set_gadget_data (gadget, 0); +} + +static int +zero_bind (struct usb_gadget *gadget) +{ + struct zero_dev *dev; + + dev = kmalloc (sizeof *dev, SLAB_KERNEL); + if (!dev) + return -ENOMEM; + memset (dev, 0, sizeof *dev); + spin_lock_init (&dev->lock); + dev->gadget = gadget; + set_gadget_data (gadget, dev); + + /* preallocate control response and buffer */ + dev->req = usb_ep_alloc_request (gadget->ep0, GFP_KERNEL); + if (!dev->req) + goto enomem; + dev->req->buf = usb_ep_alloc_buffer (gadget->ep0, USB_BUFSIZ, + &dev->req->dma, GFP_KERNEL); + if (!dev->req->buf) + goto enomem; + + dev->req->complete = zero_setup_complete; + + gadget->ep0->driver_data = dev; + + INFO (dev, "%s, version: " DRIVER_VERSION "\n", longname); + return 0; + +enomem: + zero_unbind (gadget); + return -ENOMEM; +} + +/*-------------------------------------------------------------------------*/ + +static struct usb_gadget_driver zero_driver = { +#ifdef HIGHSPEED + .speed = USB_SPEED_HIGH, +#else + .speed = USB_SPEED_FULL, +#endif + .function = (char *) longname, + .bind = zero_bind, + .unbind = zero_unbind, + + .setup = zero_setup, + .disconnect = zero_disconnect, + + .driver = { + .name = (char *) shortname, + // .shutdown = ... + // .suspend = ... + // .resume = ... + }, +}; + +MODULE_AUTHOR ("David Brownell"); +MODULE_LICENSE ("Dual BSD/GPL"); + + +static int __init init (void) +{ + /* a real value would likely come through some id prom + * or module option. this one takes at least two packets. + */ + strncpy (serial, "0123456789.0123456789.0123456789", sizeof serial); + serial [sizeof serial - 1] = 0; + + return usb_gadget_register_driver (&zero_driver); +} +module_init (init); + +static void __exit cleanup (void) +{ + usb_gadget_unregister_driver (&zero_driver); +} +module_exit (cleanup); + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/host/ehci-hcd.c linux-2.4.23-pre8/drivers/usb/host/ehci-hcd.c --- linux-2.4.22/drivers/usb/host/ehci-hcd.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/host/ehci-hcd.c 2003-10-22 22:48:55.000000000 +0000 @@ -333,7 +333,8 @@ spin_lock_init (&ehci->lock); ehci->caps = (struct ehci_caps *) hcd->regs; - ehci->regs = (struct ehci_regs *) (hcd->regs + ehci->caps->length); + ehci->regs = (struct ehci_regs *) (hcd->regs + + readb (&ehci->caps->length)); dbg_hcs_params (ehci, "ehci_start"); dbg_hcc_params (ehci, "ehci_start"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/host/ehci-q.c linux-2.4.23-pre8/drivers/usb/host/ehci-q.c --- linux-2.4.22/drivers/usb/host/ehci-q.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/host/ehci-q.c 2003-10-22 22:47:28.000000000 +0000 @@ -832,6 +832,10 @@ qh->hw_info1 = cpu_to_le32 (info); } } + + /* usb_reset_device() briefly reverts to address 0 */ + if (usb_pipedevice (urb->pipe) == 0) + qh->hw_info1 &= cpu_to_le32(~0x7f); } /* NOTE: changing config or interface setting is not diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/host/ehci-sched.c linux-2.4.23-pre8/drivers/usb/host/ehci-sched.c --- linux-2.4.22/drivers/usb/host/ehci-sched.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/host/ehci-sched.c 2003-10-22 22:48:26.000000000 +0000 @@ -397,7 +397,7 @@ if (status == 0) break; } - } while (status && --frame); + } while (status && frame--); if (status) goto done; qh->start = frame; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/host/uhci-debug.h linux-2.4.23-pre8/drivers/usb/host/uhci-debug.h --- linux-2.4.22/drivers/usb/host/uhci-debug.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/host/uhci-debug.h 2003-10-22 22:49:20.000000000 +0000 @@ -545,7 +545,8 @@ if (!access_ok(VERIFY_WRITE, buf, nbytes)) return -EINVAL; - copy_to_user(buf, up->data + pos, nbytes); + if (copy_to_user(buf, up->data + pos, nbytes)) + return -EFAULT; *ppos += nbytes; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/mdc800.c linux-2.4.23-pre8/drivers/usb/mdc800.c --- linux-2.4.22/drivers/usb/mdc800.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/mdc800.c 2003-10-22 22:47:29.000000000 +0000 @@ -726,7 +726,10 @@ else { /* memcpy Bytes */ - copy_to_user(ptr, &mdc800->out [mdc800->out_ptr], sts); + if (copy_to_user(ptr, &mdc800->out [mdc800->out_ptr], sts)) { + up (&mdc800->io_lock); + return -EFAULT; + } ptr+=sts; left-=sts; mdc800->out_ptr+=sts; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/pwc-ctrl.c linux-2.4.23-pre8/drivers/usb/pwc-ctrl.c --- linux-2.4.22/drivers/usb/pwc-ctrl.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/pwc-ctrl.c 2003-10-22 22:49:45.000000000 +0000 @@ -1,7 +1,7 @@ /* Driver for Philips webcam Functions that send various control messages to the webcam, including video modes. - (C) 1999-2002 Nemosoft Unv. (webcam@smcc.demon.nl) + (C) 1999-2003 Nemosoft Unv. (webcam@smcc.demon.nl) 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 @@ -452,7 +452,7 @@ pdev->view.x = width; pdev->view.y = height; pwc_set_image_buffer_size(pdev); - Trace(TRACE_SIZE, "Set viewport to %dx%d, image size is %dx%d, palette = %d.\n", width, height, pwc_image_sizes[size].x, pwc_image_sizes[size].y, pdev->vpalette); + Trace(TRACE_SIZE, "Set viewport to %dx%d, image size is %dx%d.\n", width, height, pwc_image_sizes[size].x, pwc_image_sizes[size].y); return 0; } @@ -461,38 +461,9 @@ { int factor, i, filler = 0; - switch(pdev->vpalette) { - case VIDEO_PALETTE_RGB32 | 0x80: - case VIDEO_PALETTE_RGB32: - factor = 16; - filler = 0; - break; - case VIDEO_PALETTE_RGB24 | 0x80: - case VIDEO_PALETTE_RGB24: - factor = 12; - filler = 0; - break; - case VIDEO_PALETTE_YUYV: - case VIDEO_PALETTE_YUV422: - factor = 8; - filler = 128; - break; - case VIDEO_PALETTE_YUV420: - case VIDEO_PALETTE_YUV420P: - factor = 6; - filler = 128; - break; -#if PWC_DEBUG - case VIDEO_PALETTE_RAW: - pdev->image.size = pdev->frame_size; - pdev->view.size = pdev->frame_size; - return; - break; -#endif - default: - factor = 0; - break; - } + /* for PALETTE_YUV420P */ + factor = 6; + filler = 128; /* Set sizes in bytes */ pdev->image.size = pdev->image.x * pdev->image.y * factor / 4; @@ -1358,7 +1329,7 @@ { struct pwc_probe probe; - strcpy(probe.name, pdev->vdev->name); + strcpy(probe.name, pdev->vdev.name); probe.type = pdev->type; if (copy_to_user(arg, &probe, sizeof(probe))) ret = -EFAULT; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/pwc-if.c linux-2.4.23-pre8/drivers/usb/pwc-if.c --- linux-2.4.22/drivers/usb/pwc-if.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/pwc-if.c 2003-10-22 22:49:16.000000000 +0000 @@ -1,6 +1,6 @@ -/* Linux driver for Philips webcam +/* Linux driver for Philips webcam USB and Video4Linux interface part. - (C) 1999-2002 Nemosoft Unv. + (C) 1999-2003 Nemosoft Unv. 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 @@ -75,14 +75,21 @@ { USB_DEVICE(0x0471, 0x0310) }, { USB_DEVICE(0x0471, 0x0311) }, { USB_DEVICE(0x0471, 0x0312) }, + { USB_DEVICE(0x0471, 0x0313) }, /* the 'new' 720K */ { USB_DEVICE(0x069A, 0x0001) }, /* Askey */ - { USB_DEVICE(0x046D, 0x08b0) }, /* Logitech QuickCam Pro 3000 */ - { USB_DEVICE(0x046D, 0x08b1) }, /* Logitech QuickCam Notebook Pro */ - { USB_DEVICE(0x046d, 0x08b2) }, /* Logitech QuickCam Pro 4000 */ - { USB_DEVICE(0x046d, 0x08b3) }, /* Logitech QuickCam Zoom */ + { USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */ + { USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */ + { USB_DEVICE(0x046D, 0x08B2) }, /* Logitech QuickCam Pro 4000 */ + { USB_DEVICE(0x046D, 0x08B3) }, /* Logitech QuickCam Zoom */ + { USB_DEVICE(0x046D, 0x08B4) }, /* Logitech (reserved) */ + { USB_DEVICE(0x046D, 0x08B5) }, /* Logitech (reserved) */ + { USB_DEVICE(0x046D, 0x08B6) }, /* Logitech (reserved) */ + { USB_DEVICE(0x046D, 0x08B7) }, /* Logitech (reserved) */ + { USB_DEVICE(0x046D, 0x08B8) }, /* Logitech (reserved) */ { USB_DEVICE(0x055D, 0x9000) }, /* Samsung */ { USB_DEVICE(0x055D, 0x9001) }, { USB_DEVICE(0x041E, 0x400C) }, /* Creative Webcam 5 */ + { USB_DEVICE(0x041E, 0x4011) }, /* Creative Webcam Pro Ex */ { USB_DEVICE(0x04CC, 0x8116) }, /* Afina Eye */ { USB_DEVICE(0x0d81, 0x1910) }, /* Visionite */ { USB_DEVICE(0x0d81, 0x1900) }, @@ -101,11 +108,11 @@ disconnect: usb_pwc_disconnect, /* disconnect() */ }; -#define MAX_DEV_HINTS 10 +#define MAX_DEV_HINTS 20 +#define MAX_ISOC_ERRORS 20 static int default_size = PSZ_QCIF; static int default_fps = 10; -static int default_palette = VIDEO_PALETTE_YUV420P; /* This format is understood by most tools */ static int default_fbufs = 3; /* Default number of frame buffers */ static int default_mbufs = 2; /* Default number of mmap() buffers */ int pwc_trace = TRACE_MODULE | TRACE_FLOW | TRACE_PWCX; @@ -119,9 +126,6 @@ struct pwc_device *pdev; } device_hint[MAX_DEV_HINTS]; -static struct semaphore mem_lock; -static void *mem_leak = NULL; /* For delayed kfree()s. See below */ - /***/ static int pwc_video_open(struct video_device *vdev, int mode); @@ -383,50 +387,50 @@ the user program. The first scheme involves the ISO buffers (called thus since they transport ISO data from the USB controller), and not really interesting. Suffices to say the data from this buffer is quickly - gathered in an interrupt handler (pwc_isoc_handler) and placed into the + gathered in an interrupt handler (pwc_isoc_handler) and placed into the frame buffer. - + The frame buffer is the second scheme, and is the central element here. It collects the data from a single frame from the camera (hence, the name). Frames are delimited by the USB camera with a short USB packet, so that's easy to detect. The frame buffers form a list that is filled - by the camera+USB controller and drained by the user process through + by the camera+USB controller and drained by the user process through either read() or mmap(). - + The image buffer is the third scheme, in which frames are decompressed - and possibly converted into planar format. For mmap() there is more than + and converted into planar format. For mmap() there is more than one image buffer available. - The frame buffers provide the image buffering, in case the user process - is a bit slow. This introduces lag and some undesired side-effects. - The problem arises when the frame buffer is full. I used to drop the last - frame, which makes the data in the queue stale very quickly. But dropping + The frame buffers provide the image buffering. In case the user process + is a bit slow, this introduces lag and some undesired side-effects. + The problem arises when the frame buffer is full. I used to drop the last + frame, which makes the data in the queue stale very quickly. But dropping the frame at the head of the queue proved to be a litte bit more difficult. I tried a circular linked scheme, but this introduced more problems than it solved. Because filling and draining are completely asynchronous processes, this requires some fiddling with pointers and mutexes. - + Eventually, I came up with a system with 2 lists: an 'empty' frame list and a 'full' frame list: * Initially, all frame buffers but one are on the 'empty' list; the one remaining buffer is our initial fill frame. - * If a frame is needed for filling, we take it from the 'empty' list, - unless that list is empty, in which case we take the buffer at the - head of the 'full' list. - * When our fill buffer has been filled, it is appended to the 'full' + * If a frame is needed for filling, we try to take it from the 'empty' + list, unless that list is empty, in which case we take the buffer at + the head of the 'full' list. + * When our fill buffer has been filled, it is appended to the 'full' list. - * If a frame is needed by read() or mmap(), it is taken from the head of + * If a frame is needed by read() or mmap(), it is taken from the head of the 'full' list, handled, and then appended to the 'empty' list. If no buffer is present on the 'full' list, we wait. The advantage is that the buffer that is currently being decompressed/ - converted, is on neither list, and thus not in our way (any other scheme + converted, is on neither list, and thus not in our way (any other scheme I tried had the problem of old data lingering in the queue). Whatever strategy you choose, it always remains a tradeoff: with more frame buffers the chances of a missed frame are reduced. On the other - hand, on slower machines it introduces lag because the queue will + hand, on slower machines it introduces lag because the queue will always be full. */ @@ -437,7 +441,7 @@ { int ret; unsigned long flags; - + ret = 0; spin_lock_irqsave(&pdev->ptrlock, flags); if (pdev->fill_frame != NULL) { @@ -454,11 +458,11 @@ if (pdev->empty_frames != NULL) { /* We have empty frames available. That's easy */ pdev->fill_frame = pdev->empty_frames; - pdev->empty_frames = pdev->empty_frames->next; + pdev->empty_frames = pdev->empty_frames->next; } else { /* Hmm. Take it from the full list */ -#if PWC_DEBUG +#if PWC_DEBUG /* sanity check */ if (pdev->full_frames == NULL) { Err("Neither empty or full frames available!\n"); @@ -478,11 +482,11 @@ spin_unlock_irqrestore(&pdev->ptrlock, flags); return ret; } - + /** - \brief Reset all buffers, pointers and lists, except for the image_used[] buffer. - + \brief Reset all buffers, pointers and lists, except for the image_used[] buffer. + If the image_used[] buffer is cleared too, mmap()/VIDIOCSYNC will run into trouble. */ static void pwc_reset_buffers(struct pwc_device *pdev) @@ -519,7 +523,7 @@ { int ret = 0; unsigned long flags; - + spin_lock_irqsave(&pdev->ptrlock, flags); /* First grab our read_frame; this is removed from all lists, so we can release the lock after this without problems */ @@ -542,7 +546,7 @@ Trace(TRACE_SEQUENCE, "Decompressing frame %d\n", pdev->read_frame->sequence); #endif /* Decompression is a lenghty process, so it's outside of the lock. - This gives the isoc_handler the opportunity to fill more frames + This gives the isoc_handler the opportunity to fill more frames in the mean time. */ spin_unlock_irqrestore(&pdev->ptrlock, flags); @@ -566,7 +570,7 @@ } /** - \brief Advance pointers of image buffer (after each user request) + \brief Advance pointers of image buffer (after each user request) */ static inline void pwc_next_image(struct pwc_device *pdev) { @@ -574,22 +578,6 @@ pdev->fill_image = (pdev->fill_image + 1) % default_mbufs; } -/* 2001-10-14: YUV420P is the only palette remaining. */ -static int pwc_set_palette(struct pwc_device *pdev, int pal) -{ - if ( pal == VIDEO_PALETTE_YUV420P -#if PWC_DEBUG - || pal == VIDEO_PALETTE_RAW -#endif - ) { - pdev->vpalette = pal; - pwc_set_image_buffer_size(pdev); - return 0; - } - Trace(TRACE_READ, "Palette %d not supported.\n", pal); - return -1; -} - /* This gets called for the Isochronous pipe (video). This is done in @@ -601,14 +589,15 @@ int i, fst, flen; int awake; struct pwc_frame_buf *fbuf; - unsigned char *fillptr, *iso_buf; + unsigned char *fillptr = 0, *iso_buf = 0; + awake = 0; pdev = (struct pwc_device *)urb->context; if (pdev == NULL) { Err("isoc_handler() called with NULL device?!\n"); return; } -#ifdef PWC_MAGIC +#ifdef PWC_MAGIC if (pdev->magic != PWC_MAGIC) { Err("isoc_handler() called with bad magic!\n"); return; @@ -619,33 +608,51 @@ return; } if (urb->status != -EINPROGRESS && urb->status != 0) { - char *errmsg; - + const char *errmsg; + errmsg = "Unknown"; switch(urb->status) { case -ENOSR: errmsg = "Buffer error (overrun)"; break; case -EPIPE: errmsg = "Stalled (device not responding)"; break; case -EOVERFLOW: errmsg = "Babble (bad cable?)"; break; case -EPROTO: errmsg = "Bit-stuff error (bad cable?)"; break; - case -EILSEQ: errmsg = "CRC/Timeout"; break; + case -EILSEQ: errmsg = "CRC/Timeout (could be anything)"; break; case -ETIMEDOUT: errmsg = "NAK (device does not respond)"; break; } Trace(TRACE_FLOW, "pwc_isoc_handler() called with status %d [%s].\n", urb->status, errmsg); - return; + /* Give up after a number of contiguous errors on the USB bus. + Appearantly something is wrong so we simulate an unplug event. + */ + if (++pdev->visoc_errors > MAX_ISOC_ERRORS) + { + Info("Too many ISOC errors, bailing out.\n"); + pdev->error_status = EIO; + awake = 1; + } + else + return; // better luck next time } fbuf = pdev->fill_frame; if (fbuf == NULL) { Err("pwc_isoc_handler without valid fill frame.\n"); + awake = 1; + } + else { + fillptr = fbuf->data + fbuf->filled; + } + /* Premature wakeup */ + if (awake) { wake_up_interruptible(&pdev->frameq); return; } - fillptr = fbuf->data + fbuf->filled; - awake = 0; + + /* Reset ISOC error counter. We did get here, after all. */ + pdev->visoc_errors = 0; /* vsync: 0 = don't copy data 1 = sync-hunt - 2 = synched + 2 = synched */ /* Compact data */ for (i = 0; i < urb->number_of_packets; i++) { @@ -674,7 +681,7 @@ if (flen < pdev->vlast_packet_size) { /* Shorter packet... We probably have the end of an image-frame; wake up read() process and let select()/poll() do something. - Decompression is done in user time over there. + Decompression is done in user time over there. */ if (pdev->vsync == 2) { /* The ToUCam Fun CMOS sensor causes the firmware to send 2 or 3 bogus @@ -731,7 +738,7 @@ else { /* Send only once per EOF */ awake = 1; /* delay wake_ups */ - + /* Find our next frame to fill. This will always succeed, since we * nick a frame from either empty or full list, but if we had to * take it from the full list, it means a frame got dropped. @@ -764,7 +771,7 @@ if (iso_error < 20) Trace(TRACE_FLOW, "Iso frame %d of USB has error %d\n", i, fst); } -#endif +#endif } if (awake) wake_up_interruptible(&pdev->frameq); @@ -893,8 +900,10 @@ } } - /* Stop camera, but only if we are sure the camera is still there */ - if (!pdev->unplugged) { + /* Stop camera, but only if we are sure the camera is still there (unplug + is signalled by EPIPE) + */ + if (pdev->error_status && pdev->error_status != EPIPE) { Trace(TRACE_OPEN, "Setting alternate interface 0.\n"); usb_set_interface(pdev->udev, 0, 0); } @@ -922,28 +931,6 @@ } -static inline void set_mem_leak(void *ptr) -{ - down(&mem_lock); - if (mem_leak != NULL) - Err("Memleak: overwriting mem_leak pointer!\n"); - Trace(TRACE_MEMORY, "Setting mem_leak to 0x%p.\n", ptr); - mem_leak = ptr; - up(&mem_lock); -} - -static inline void free_mem_leak(void) -{ - down(&mem_lock); - if (mem_leak != NULL) { - Trace(TRACE_MEMORY, "Freeing mem_leak ptr 0x%p.\n", mem_leak); - kfree(mem_leak); - mem_leak = NULL; - } - up(&mem_lock); -} - - /***************************************************************************/ /* Video4Linux functions */ @@ -967,8 +954,8 @@ Trace(TRACE_OPEN, "Doing first time initialization.\n"); pdev->usb_init = 1; - if (pwc_trace & TRACE_OPEN) { - /* Query CMOS sensor type */ + { + /* Query sensor type */ const char *sensor_type = NULL; i = pwc_get_cmos_sensor(pdev); @@ -987,7 +974,7 @@ default: sensor_type = "unknown type of sensor"; break; } if (sensor_type != NULL) - Info("This %s camera is equipped with a %s (%d).\n", pdev->vdev->name, sensor_type, i); + Info("This %s camera is equipped with a %s (%d).\n", pdev->vdev.name, sensor_type, i); } } @@ -1022,24 +1009,20 @@ pdev->vframe_count = 0; pdev->vframes_dumped = 0; pdev->vframes_error = 0; - pdev->vpalette = default_palette; -#if PWC_DEBUG + pdev->visoc_errors = 0; + pdev->error_status = 0; +#if PWC_DEBUG pdev->sequence = 0; #endif /* Set some defaults */ pdev->vsnapshot = 0; - if (pdev->type == 730 || pdev->type == 740 || pdev->type == 750) - pdev->vsize = PSZ_QSIF; - else - pdev->vsize = PSZ_QCIF; - pdev->vframes = 10; - - /* Start iso pipe for video; first try user-supplied size/fps, if - that fails try QCIF/10 or QSIF/10 (a reasonable default), - then give up + + /* Start iso pipe for video; first try the last used video size + (or the default one); if that fails try QCIF/10 or QSIF/10; + it that fails too, give up. */ - i = pwc_set_video_mode(pdev, pwc_image_sizes[default_size].x, pwc_image_sizes[default_size].y, default_fps, pdev->vcompression, 0); + i = pwc_set_video_mode(pdev, pwc_image_sizes[pdev->vsize].x, pwc_image_sizes[pdev->vsize].y, pdev->vframes, pdev->vcompression, 0); if (i) { Trace(TRACE_OPEN, "First attempt at set_video_mode failed.\n"); if (pdev->type == 730 || pdev->type == 740 || pdev->type == 750) @@ -1091,46 +1074,41 @@ if (pdev->vframe_count > 20) Info("Closing video device: %d frames received, dumped %d frames, %d frames with errors.\n", pdev->vframe_count, pdev->vframes_dumped, pdev->vframes_error); - /* Free isoc URBs, stop camera */ + if (pdev->decompressor != NULL) { + pdev->decompressor->exit(); + pdev->decompressor->unlock(); + pdev->decompressor = NULL; + } + pwc_isoc_cleanup(pdev); + pwc_free_buffers(pdev); - if (!pdev->unplugged) { - /* Turn LEDs off */ + /* Turn off LEDS and power down camera, but only when not unplugged */ + if (pdev->error_status != EPIPE) { if (pwc_set_leds(pdev, 0, 0) < 0) Info("Failed to set LED on/off time.\n"); - /* Power down camera to save energy */ if (power_save) { i = pwc_camera_power(pdev, 0); if (i < 0) Err("Failed to power down camera (%d)\n", i); } } - pdev->vopen = 0; - if (pdev->decompressor != NULL) { - pdev->decompressor->exit(); - pdev->decompressor->unlock(); - } - pwc_free_buffers(pdev); - - /* wake up _disconnect() routine */ - if (pdev->unplugged) - wake_up(&pdev->remove_ok); Trace(TRACE_OPEN, "<< video_close()\n"); } /* * FIXME: what about two parallel reads ???? * ANSWER: Not supported. You can't open the device more than once, - despite what the V4L1 interface says. First, I don't see - the need, second there's no mechanism of alerting the + despite what the V4L1 interface says. First, I don't see + the need, second there's no mechanism of alerting the 2nd/3rd/... process of events like changing image size. - And I don't see the point of blocking that for the + And I don't see the point of blocking that for the 2nd/3rd/... process. In multi-threaded environments reading parallel from any device is tricky anyhow. */ - + static long pwc_video_read(struct video_device *vdev, char *buf, unsigned long count, int noblock) { struct pwc_device *pdev; @@ -1142,17 +1120,20 @@ pdev = vdev->priv; if (pdev == NULL) return -EFAULT; - if (pdev->unplugged) { - Info("pwc_video_read: Device got unplugged (1).\n"); - return -EPIPE; /* unplugged device! */ - } + if (pdev->error_status) + return -pdev->error_status; /* Something happened, report what. */ /* In case we're doing partial reads, we don't have to wait for a frame */ if (pdev->image_read_pos == 0) { /* Do wait queueing according to the (doc)book */ add_wait_queue(&pdev->frameq, &wait); - set_current_state(TASK_INTERRUPTIBLE); while (pdev->full_frames == NULL) { + /* Check for unplugged/etc. here */ + if (pdev->error_status) { + remove_wait_queue(&pdev->frameq, &wait); + set_current_state(TASK_RUNNING); + return -pdev->error_status ; + } if (noblock) { remove_wait_queue(&pdev->frameq, &wait); set_current_state(TASK_RUNNING); @@ -1168,8 +1149,8 @@ } remove_wait_queue(&pdev->frameq, &wait); set_current_state(TASK_RUNNING); - - /* Decompress [, convert] and release frame */ + + /* Decompress and release frame */ if (pwc_handle_frame(pdev)) return -EFAULT; } @@ -1191,35 +1172,33 @@ static long pwc_video_write(struct video_device *vdev, const char *buf, unsigned long count, int noblock) { - return -EINVAL; + return -EINVAL; } static unsigned int pwc_video_poll(struct video_device *vdev, struct file *file, poll_table *wait) { struct pwc_device *pdev; - + if (vdev == NULL) return -EFAULT; pdev = vdev->priv; if (pdev == NULL) return -EFAULT; - + poll_wait(file, &pdev->frameq, wait); - if (pdev->unplugged) { - Info("pwc_video_poll: Device got unplugged.\n"); + if (pdev->error_status) return POLLERR; - } if (pdev->full_frames != NULL) /* we have frames waiting */ return (POLLIN | POLLRDNORM); return 0; } - + static int pwc_video_ioctl(struct video_device *vdev, unsigned int cmd, void *arg) { struct pwc_device *pdev; DECLARE_WAITQUEUE(wait, current); - + if (vdev == NULL) return -EFAULT; pdev = vdev->priv; @@ -1228,7 +1207,7 @@ switch (cmd) { /* Query cabapilities */ - case VIDIOCGCAP: + case VIDIOCGCAP: { struct video_capability caps; @@ -1314,7 +1293,7 @@ else p.colour = 0xffff; p.depth = 24; - p.palette = pdev->vpalette; + p.palette = VIDEO_PALETTE_YUV420P; p.hue = 0xFFFF; /* N/A */ if (copy_to_user(arg, &p, sizeof(p))) @@ -1341,9 +1320,8 @@ pwc_set_contrast(pdev, p.contrast); pwc_set_gamma(pdev, p.whiteness); pwc_set_saturation(pdev, p.colour); - if (p.palette && p.palette != pdev->vpalette) { - if (pwc_set_palette(pdev, p.palette) < 0) - return -EINVAL; + if (p.palette && p.palette != VIDEO_PALETTE_YUV420P) { + return -EINVAL; } break; } @@ -1436,9 +1414,8 @@ various palettes... The driver doesn't support such small images, so I'm working around it. */ - if (vm.format && vm.format != pdev->vpalette) - if (pwc_set_palette(pdev, vm.format) < 0) - return -EINVAL; + if (vm.format && vm.format != VIDEO_PALETTE_YUV420P) + return -EINVAL; if ((vm.width != pdev->view.x || vm.height != pdev->view.y) && (vm.width >= pdev->view_min.x && vm.height >= pdev->view_min.y)) { @@ -1458,7 +1435,7 @@ /* Okay, we're done here. In the SYNC call we wait until a frame comes available, then expand image into the given buffer. - In contrast to the CPiA cam the Philips cams deliver a + In contrast to the CPiA cam the Philips cams deliver a constant stream, almost like a grabber card. Also, we have separate buffers for the rawdata and the image, meaning we can nearly always expand into the requested buffer. @@ -1498,27 +1475,26 @@ return -EINVAL; /* Add ourselves to the frame wait-queue. - + In the loop, check for error conditions and signals. + FIXME: needs auditing for safety. - QUSTION: In what respect? I think that using the - frameq is safe now. + QUESTION: In what respect? I think that using the + frameq is safe now. */ add_wait_queue(&pdev->frameq, &wait); - set_current_state(TASK_INTERRUPTIBLE); while (pdev->full_frames == NULL) { - if (pdev->unplugged) { + if (pdev->error_status) { remove_wait_queue(&pdev->frameq, &wait); set_current_state(TASK_RUNNING); - return -ENODEV; + return -pdev->error_status; } - if (signal_pending(current)) { remove_wait_queue(&pdev->frameq, &wait); set_current_state(TASK_RUNNING); return -ERESTARTSYS; } - set_current_state(TASK_INTERRUPTIBLE); schedule(); + set_current_state(TASK_INTERRUPTIBLE); } remove_wait_queue(&pdev->frameq, &wait); set_current_state(TASK_RUNNING); @@ -1572,7 +1548,7 @@ { struct video_unit vu; - vu.video = pdev->vdev->minor & 0x3F; + vu.video = pdev->vdev.minor & 0x3F; vu.audio = -1; /* not known yet */ vu.vbi = -1; vu.radio = -1; @@ -1623,14 +1599,11 @@ static void *usb_pwc_probe(struct usb_device *udev, unsigned int ifnum, const struct usb_device_id *id) { struct pwc_device *pdev = NULL; - struct video_device *vdev; int vendor_id, product_id, type_id; int i, hint; int video_nr = -1; /* default: use next available device */ char serial_number[30], *name; - free_mem_leak(); - /* Check if we can handle this device */ Trace(TRACE_PROBE, "probe() called [%04X %04X], if %d\n", udev->descriptor.idVendor, udev->descriptor.idProduct, ifnum); @@ -1691,6 +1664,11 @@ name = "Philips 750 webcam"; type_id = 750; break; + case 0x0313: + Info("Philips PCVC720K/40 (ToUCam XS) USB webcam detected.\n"); + name = "Philips 720 webcam"; + type_id = 720; + break; default: return NULL; break; @@ -1713,12 +1691,12 @@ case 0x08b0: Info("Logitech QuickCam Pro 3000 USB webcam detected.\n"); name = "Logitech QuickCam Pro 3000"; - type_id = 730; + type_id = 740; /* CCD sensor */ break; case 0x08b1: Info("Logitech QuickCam for Notebook Pro USB webcam detected.\n"); name = "Logitech QuickCam Notebook Pro"; - type_id = 740; /* ?? unknown sensor */ + type_id = 740; /* CCD sensor */ break; case 0x08b2: Info("Logitech QuickCam 4000 Pro USB webcam detected.\n"); @@ -1730,6 +1708,15 @@ name = "Logitech QuickCam Zoom"; type_id = 740; /* CCD sensor */ break; + case 0x08b4: + case 0x08b5: + case 0x08b6: + case 0x08b7: + case 0x08b8: + Info("Logitech QuickCam detected (reserved ID).\n"); + name = "Logitech QuickCam (res.)"; + type_id = 730; /* Assuming CMOS */ + break; default: return NULL; break; @@ -1763,6 +1750,11 @@ name = "Creative Labs Webcam 5"; type_id = 730; break; + case 0x4011: + Info("Creative Labs Webcam Pro Ex detected.\n"); + name = "Creative Labs Webcam Pro Ex"; + type_id = 740; + break; default: return NULL; break; @@ -1816,26 +1808,20 @@ memset(pdev, 0, sizeof(struct pwc_device)); pdev->type = type_id; pwc_construct(pdev); + pdev->vsize = default_size; + pdev->vframes = default_fps; init_MUTEX(&pdev->modlock); pdev->ptrlock = SPIN_LOCK_UNLOCKED; pdev->udev = udev; init_waitqueue_head(&pdev->frameq); - init_waitqueue_head(&pdev->remove_ok); pdev->vcompression = pwc_preferred_compression; - /* Now hook it up to the video subsystem */ - vdev = kmalloc(sizeof(struct video_device), GFP_KERNEL); - if (vdev == NULL) { - Err("Oops, could not allocate memory for video_device.\n"); - return NULL; - } - memcpy(vdev, &pwc_template, sizeof(pwc_template)); - strcpy(vdev->name, name); - SET_MODULE_OWNER(vdev); - pdev->vdev = vdev; - vdev->priv = pdev; + memcpy(&pdev->vdev, &pwc_template, sizeof(pwc_template)); + strcpy(pdev->vdev.name, name); + SET_MODULE_OWNER(&pdev->vdev); + pdev->vdev.priv = pdev; pdev->release = udev->descriptor.bcdDevice; Trace(TRACE_PROBE, "Release: %04x\n", pdev->release); @@ -1854,14 +1840,14 @@ } } - i = video_register_device(vdev, VFL_TYPE_GRABBER, video_nr); + i = video_register_device(&pdev->vdev, VFL_TYPE_GRABBER, video_nr); if (i < 0) { Err("Failed to register as video device (%d).\n", i); + kfree(pdev); /* Oops, no memory leaks please */ return NULL; } else { - Trace(TRACE_PROBE, "Registered video struct at 0x%p.\n", vdev); - Info("Registered as /dev/video%d.\n", vdev->minor & 0x3F); + Info("Registered as /dev/video%d.\n", pdev->vdev.minor & 0x3F); } /* occupy slot */ if (hint < MAX_DEV_HINTS) @@ -1876,75 +1862,56 @@ { struct pwc_device *pdev; int hint; - DECLARE_WAITQUEUE(wait, current); lock_kernel(); - free_mem_leak(); - pdev = (struct pwc_device *)ptr; if (pdev == NULL) { Err("pwc_disconnect() Called without private pointer.\n"); + unlock_kernel(); return; } if (pdev->udev == NULL) { Err("pwc_disconnect() already called for %p\n", pdev); + unlock_kernel(); return; } if (pdev->udev != udev) { Err("pwc_disconnect() Woops: pointer mismatch udev/pdev.\n"); + unlock_kernel(); return; } -#ifdef PWC_MAGIC +#ifdef PWC_MAGIC if (pdev->magic != PWC_MAGIC) { Err("pwc_disconnect() Magic number failed. Consult your scrolls and try again.\n"); + unlock_kernel(); return; } #endif - - pdev->unplugged = 1; - if (pdev->vdev != NULL) { - add_wait_queue(&pdev->remove_ok, &wait); - set_current_state(TASK_UNINTERRUPTIBLE); - Trace(TRACE_PROBE, "Unregistering video device.\n"); - video_unregister_device(pdev->vdev); - if (pdev->vopen) { - Info("Disconnected while device/video is open!\n"); - - /* Wake up any processes that might be waiting for - a frame, let them return an error condition - */ - wake_up(&pdev->frameq); - - /* Wait until we get a 'go' from _close(). This used - to have a gigantic race condition, since we kfree() - stuff here, but we have to wait until close() - is finished. - */ - - Trace(TRACE_PROBE, "Sleeping on remove_ok.\n"); - /* ... wait ... */ - schedule(); - Trace(TRACE_PROBE, "Done sleeping.\n"); - set_mem_leak(pdev->vdev); - pdev->vdev = NULL; - } - else { - /* Normal disconnect; remove from available devices */ - kfree(pdev->vdev); - pdev->vdev = NULL; - } - remove_wait_queue(&pdev->remove_ok, &wait); - set_current_state(TASK_RUNNING); + + /* We got unplugged; this is signalled by an EPIPE error code */ + if (pdev->vopen) { + Info("Disconnected while webcam is in use!\n"); + pdev->error_status = EPIPE; } + + /* Alert waiting processes */ + wake_up_interruptible(&pdev->frameq); + /* Wait until device is closed */ + while (pdev->vopen) + schedule(); + /* Device is now closed, so we can safely unregister it */ + Trace(TRACE_PROBE, "Unregistering video device in disconnect().\n"); + video_unregister_device(&pdev->vdev); + + /* Free memory (don't set pdev to 0 just yet) */ + kfree(pdev); /* search device_hint[] table if we occupy a slot, by any chance */ for (hint = 0; hint < MAX_DEV_HINTS; hint++) if (device_hint[hint].pdev == pdev) device_hint[hint].pdev = NULL; - pdev->udev = NULL; unlock_kernel(); - kfree(pdev); } @@ -1973,7 +1940,7 @@ static int trace = -1; static int compression = -1; static int leds[2] = { -1, -1 }; -static char *dev_hint[10] = { }; +static char *dev_hint[MAX_DEV_HINTS] = { }; MODULE_PARM(size, "s"); MODULE_PARM_DESC(size, "Initial image size. One of sqcif, qsif, qcif, sif, cif, vga"); @@ -1991,7 +1958,7 @@ MODULE_PARM_DESC(compression, "Preferred compression quality. Range 0 (uncompressed) to 3 (high compression)"); MODULE_PARM(leds, "2i"); MODULE_PARM_DESC(leds, "LED on,off time in milliseconds"); -MODULE_PARM(dev_hint, "0-10s"); +MODULE_PARM(dev_hint, "0-20s"); MODULE_PARM_DESC(dev_hint, "Device node hints"); MODULE_DESCRIPTION("Philips USB & OEM webcam driver"); @@ -2133,14 +2100,12 @@ device_hint[i].type = 0; /* not filled */ } /* ..for MAX_DEV_HINTS */ - init_MUTEX(&mem_lock); Trace(TRACE_PROBE, "Registering driver at address 0x%p.\n", &pwc_driver); return usb_register(&pwc_driver); } static void __exit usb_pwc_exit(void) { - free_mem_leak(); Trace(TRACE_MODULE, "Deregistering driver.\n"); usb_deregister(&pwc_driver); Info("Philips webcam module removed.\n"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/pwc-ioctl.h linux-2.4.23-pre8/drivers/usb/pwc-ioctl.h --- linux-2.4.22/drivers/usb/pwc-ioctl.h 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/pwc-ioctl.h 2003-10-22 22:48:53.000000000 +0000 @@ -1,7 +1,7 @@ #ifndef PWC_IOCTL_H #define PWC_IOCTL_H -/* (C) 2001-2002 Nemosoft Unv. webcam@smcc.demon.nl +/* (C) 2001-2003 Nemosoft Unv. webcam@smcc.demon.nl 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/pwc-misc.c linux-2.4.23-pre8/drivers/usb/pwc-misc.c --- linux-2.4.22/drivers/usb/pwc-misc.c 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/pwc-misc.c 2003-10-22 22:48:34.000000000 +0000 @@ -1,6 +1,6 @@ /* Linux driver for Philips webcam Various miscellaneous functions and tables. - (C) 1999-2002 Nemosoft Unv. (webcam@smcc.demon.nl) + (C) 1999-2003 Nemosoft Unv. (webcam@smcc.demon.nl) 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 @@ -51,7 +51,6 @@ } return find; } - /* initialize variables depending on type */ void pwc_construct(struct pwc_device *pdev) { @@ -81,6 +80,7 @@ pdev->frame_header_size = 0; pdev->frame_trailer_size = 0; break; + case 720: case 730: case 740: case 750: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/pwc-uncompress.c linux-2.4.23-pre8/drivers/usb/pwc-uncompress.c --- linux-2.4.22/drivers/usb/pwc-uncompress.c 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/pwc-uncompress.c 2003-10-22 22:49:00.000000000 +0000 @@ -1,6 +1,6 @@ /* Linux driver for Philips webcam Decompression frontend. - (C) 1999-2002 Nemosoft Unv. (webcam@smcc.demon.nl) + (C) 1999-2003 Nemosoft Unv. (webcam@smcc.demon.nl) 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 @@ -32,7 +32,7 @@ /* Should the pwc_decompress structure ever change, we increase the version number so that we don't get nasty surprises, or can - dynamicly adjust our structure. + dynamically adjust our structure. */ const int pwc_decompressor_version = PWC_MAJOR; @@ -98,14 +98,6 @@ if (!image) return -EFAULT; -#if PWC_DEBUG - /* This is a quickie */ - if (pdev->vpalette == VIDEO_PALETTE_RAW) { - memcpy(image, fbuf->data, pdev->frame_size); - return 0; - } -#endif - yuv = fbuf->data + pdev->frame_header_size; /* Skip header */ if (pdev->vbandlength == 0) { /* Uncompressed mode. We copy the data into the output buffer, @@ -113,8 +105,6 @@ size). Unfortunately we have to do a bit of byte stuffing to get the desired output format/size. */ - switch (pdev->vpalette) { - case VIDEO_PALETTE_YUV420P: /* * We do some byte shuffling here to go from the * native format to YUV420P. @@ -149,11 +139,6 @@ else dstu += (stride >> 1); } - break; - default: - Err("Unsupported palette!"); - break; - } } else { /* Compressed; the decompressor routines will write the data diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/pwc-uncompress.h linux-2.4.23-pre8/drivers/usb/pwc-uncompress.h --- linux-2.4.22/drivers/usb/pwc-uncompress.h 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/pwc-uncompress.h 2003-10-22 22:48:22.000000000 +0000 @@ -1,4 +1,4 @@ -/* (C) 1999-2002 Nemosoft Unv. (webcam@smcc.demon.nl) +/* (C) 1999-2003 Nemosoft Unv. (webcam@smcc.demon.nl) 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/pwc.h linux-2.4.23-pre8/drivers/usb/pwc.h --- linux-2.4.22/drivers/usb/pwc.h 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/pwc.h 2003-10-22 22:49:05.000000000 +0000 @@ -1,4 +1,4 @@ -/* (C) 1999-2002 Nemosoft Unv. (webcam@smcc.demon.nl) +/* (C) 1999-2003 Nemosoft Unv. (webcam@smcc.demon.nl) 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 @@ -60,8 +60,8 @@ /* Version block */ #define PWC_MAJOR 8 -#define PWC_MINOR 10 -#define PWC_VERSION "8.10" +#define PWC_MINOR 11 +#define PWC_VERSION "8.11" #define PWC_NAME "pwc" /* Turn certain features on/off */ @@ -82,7 +82,7 @@ #define PWC_FRAME_SIZE (460800 + TOUCAM_HEADER_SIZE + TOUCAM_TRAILER_SIZE) /* Absolute maximum number of buffers available for mmap() */ -#define MAX_IMAGES 4 +#define MAX_IMAGES 10 struct pwc_coord { @@ -112,6 +112,7 @@ struct pwc_device { + struct video_device vdev; #ifdef PWC_MAGIC int magic; #endif @@ -120,22 +121,21 @@ int type; /* type of cam (645, 646, 675, 680, 690) */ int release; /* release number */ - int unplugged; /* set when the plug is pulled */ + int error_status; /* set when something goes wrong with the cam (unplugged, USB errors) */ int usb_init; /* set when the cam has been initialized over USB */ /*** Video data ***/ int vopen; /* flag */ - struct video_device *vdev; int vendpoint; /* video isoc endpoint */ int vcinterface; /* video control interface */ int valternate; /* alternate interface needed */ int vframes, vsize; /* frames-per-second & size (see PSZ_*) */ - int vpalette; /* YUV */ int vframe_count; /* received frames */ int vframes_dumped; /* counter for dumped frames */ int vframes_error; /* frames received in error */ int vmax_packet_size; /* USB maxpacket size */ int vlast_packet_size; /* for frame synchronisation */ + int visoc_errors; /* number of contiguous ISOC errors */ int vcompression; /* desired compression factor */ int vbandlength; /* compressed band length; 0 is uncompressed */ char vsnapshot; /* snapshot mode */ @@ -147,15 +147,15 @@ 2. data is synchronized and packed into a frame buffer 3a. in case data is compressed, decompress it directly into image buffer 3b. in case data is uncompressed, copy into image buffer with viewport - 4. data is transfered to the user process + 4. data is transferred to the user process - Note that MAX_ISO_BUFS != MAX_FRAMES != MAX_IMAGES.... + Note that MAX_ISO_BUFS != MAX_FRAMES != MAX_IMAGES.... We have in effect a back-to-back-double-buffer system. */ /* 1: isoc */ struct pwc_iso_buf sbuf[MAX_ISO_BUFS]; char iso_init; - + /* 2: frame */ struct pwc_frame_buf *fbuf; /* all frames */ struct pwc_frame_buf *empty_frames, *empty_frames_tail; /* all empty frames */ @@ -168,7 +168,7 @@ #if PWC_DEBUG int sequence; /* Debugging aid */ #endif - + /* 3: decompression */ struct pwc_decompressor *decompressor; /* function block with decompression routines */ void *decompress_data; /* private data for decompression engine */ @@ -176,7 +176,7 @@ /* 4: image */ /* We have an 'image' and a 'view', where 'image' is the fixed-size image as delivered by the camera, and 'view' is the size requested by the - program. The camera image is centered in this viewport, laced with + program. The camera image is centered in this viewport, laced with a gray or black border. view_min <= image <= view <= view_max; */ int image_mask; /* bitmask of supported sizes */ @@ -196,10 +196,9 @@ /*** Misc. data ***/ wait_queue_head_t frameq; /* When waiting for a frame to finish... */ - wait_queue_head_t remove_ok; /* When we got hot unplugged, we have to avoid a few race conditions */ #if PWC_INT_PIPE void *usb_int_handler; /* for the interrupt endpoint */ -#endif +#endif }; /* Enumeration of image sizes */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/scanner.c linux-2.4.23-pre8/drivers/usb/scanner.c --- linux-2.4.22/drivers/usb/scanner.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/scanner.c 2003-10-22 22:48:17.000000000 +0000 @@ -367,6 +367,17 @@ * Mustek, Pacific Image Electronics, Plustek, and Visioneer scanners. * Fixed names of some other scanners. * + * 0.4.14 2003-07-15 + * - Added vendor/product ids for Avision, Canon, HP, Microtek and Relisys + * scanners. + * - When checking if all minors are used don't read beyond p_scn_table + * (Sergey Vlasov). + * - Kfree the scn structure only after disconnect AND close have occured and + * check for scn->present. This avoids crashing when someone writes (reads) to + * the device while it's already disconnected but still open. Patch from + * Sergey Vlasov. + * - Clean up irq urb when not enough memory is available (Sergey Vlasov). + * * TODO * - Performance * - Select/poll methods @@ -411,6 +422,8 @@ */ #include "scanner.h" +static void purge_scanner(struct scn_usb_data *scn); + static void irq_scanner(struct urb *urb) { @@ -501,28 +514,20 @@ static int close_scanner(struct inode * inode, struct file * file) { - struct scn_usb_data *scn; - - kdev_t scn_minor; - - scn_minor = USB_SCN_MINOR (inode); - - dbg("close_scanner: scn_minor:%d", scn_minor); - - if (!p_scn_table[scn_minor]) { - err("close_scanner(%d): invalid scn_minor", scn_minor); - return -ENODEV; - } - - down(&scn_mutex); + struct scn_usb_data *scn = file->private_data; - scn = p_scn_table[scn_minor]; down(&(scn->sem)); scn->isopen = 0; file->private_data = NULL; - up(&scn_mutex); + if (!scn->present) { + /* The device was unplugged while open - need to clean up */ + up(&(scn->sem)); + purge_scanner(scn); + return 0; + } + up(&(scn->sem)); return 0; @@ -550,6 +555,12 @@ down(&(scn->sem)); + if (!scn->present) { + /* The device was unplugged while open */ + up(&(scn->sem)); + return -ENODEV; + } + if (!scn->bulk_out_ep) { /* This scanner does not have a bulk-out endpoint */ up(&(scn->sem)); @@ -644,6 +655,12 @@ down(&(scn->sem)); + if (!scn->present) { + /* The device was unplugged while open */ + up(&(scn->sem)); + return -ENODEV; + } + scn_minor = scn->scn_minor; ibuf = scn->ibuf; @@ -751,6 +768,12 @@ scn = file->private_data; down(&(scn->sem)); + if (!scn->present) { + /* The device was unplugged while open */ + up(&(scn->sem)); + return -ENODEV; + } + dev = scn->scn_dev; switch (cmd) @@ -978,7 +1001,7 @@ } /* Check to make sure that the last slot isn't already taken */ - if (p_scn_table[scn_minor]) { + if (scn_minor >= SCN_MAX_MNR) { err("probe_scanner: No more minor devices remaining."); up(&scn_mutex); return NULL; @@ -1018,6 +1041,8 @@ /* 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.", scn_minor); + if (have_intr) + usb_unlink_urb(&scn->scn_irq); kfree(scn); up(&scn_mutex); return NULL; @@ -1026,6 +1051,8 @@ if (!(scn->ibuf = (char *)kmalloc(IBUF_SIZE, GFP_KERNEL))) { err("probe_scanner(%d): Not enough memory for the input buffer.", scn_minor); + if (have_intr) + usb_unlink_urb(&scn->scn_irq); kfree(scn->obuf); kfree(scn); up(&scn_mutex); @@ -1080,6 +1107,14 @@ } static void +purge_scanner(struct scn_usb_data *scn) +{ + kfree(scn->ibuf); + kfree(scn->obuf); + kfree(scn); +} + +static void disconnect_scanner(struct usb_device *dev, void *ptr) { struct scn_usb_data *scn = (struct scn_usb_data *) ptr; @@ -1094,15 +1129,22 @@ usb_driver_release_interface(&scanner_driver, &scn->scn_dev->actconfig->interface[scn->ifnum]); - kfree(scn->ibuf); - kfree(scn->obuf); - dbg("disconnect_scanner: De-allocating minor:%d", scn->scn_minor); devfs_unregister(scn->devfs); p_scn_table[scn->scn_minor] = NULL; + + if (scn->isopen) { + /* The device is still open - cleanup must be delayed */ + scn->present = 0; + up(&(scn->sem)); + up(&scn_mutex); + return; + } + up (&(scn->sem)); - kfree (scn); up (&scn_mutex); + + purge_scanner(scn); } static struct diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/scanner.h linux-2.4.23-pre8/drivers/usb/scanner.h --- linux-2.4.22/drivers/usb/scanner.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/scanner.h 2003-10-22 22:48:36.000000000 +0000 @@ -44,7 +44,7 @@ // #define DEBUG -#define DRIVER_VERSION "0.4.13" +#define DRIVER_VERSION "0.4.14" #define DRIVER_DESC "USB Scanner Driver" #include @@ -104,6 +104,7 @@ /* 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 */ @@ -116,10 +117,12 @@ { 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, 0x2213) }, /* LIDE 50 */ { USB_DEVICE(0x04a9, 0x3042) }, /* FS4000US */ /* Colorado -- See Primax/Colorado below */ @@ -159,6 +162,7 @@ { USB_DEVICE(0x03f0, 0x0901) }, /* ScanJet 2300C */ { 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 */ { USB_DEVICE(0x03f0, 0x2005) }, /* ScanJet 3570c */ @@ -174,6 +178,7 @@ /* Memorex */ { USB_DEVICE(0x0461, 0x0346) }, /* 6136u - repackaged Primax ? */ /* Microtek */ + { USB_DEVICE(0x05da, 0x20c9) }, /* ScanMaker 6700 */ { USB_DEVICE(0x05da, 0x30ce) }, /* ScanMaker 3800 */ { USB_DEVICE(0x05da, 0x30cf) }, /* ScanMaker 4800 */ { USB_DEVICE(0x04a7, 0x0224) }, /* Scanport 3000 (actually Visioneer?)*/ @@ -251,6 +256,7 @@ { USB_DEVICE(0x06dc, 0x0014) }, /* Winscan Pro 2448U */ /* 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 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/ftdi_sio.c linux-2.4.23-pre8/drivers/usb/serial/ftdi_sio.c --- linux-2.4.22/drivers/usb/serial/ftdi_sio.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/ftdi_sio.c 2003-10-22 22:48:13.000000000 +0000 @@ -17,6 +17,25 @@ * See http://ftdi-usb-sio.sourceforge.net for upto date testing info * and extra documentation * + * (21/Sep/2003) Ian Abbott + * Added VID/PID for Omnidirectional Control Technology US101 USB to + * RS-232 adapter (also rebadged as Dick Smith Electronics XH6381). + * VID/PID supplied by Donald Gordon. + * + * (19/Aug/2003) Ian Abbott + * Omitted some paranoid checks in write bulk callback that don't matter. + * + * (05/Aug/2003) Ian Abbott + * Added VID/PID for ID TECH IDT1221U USB to RS-232 adapter. + * VID/PID provided by Steve Briggs. + * + * (23/Jul/2003) Ian Abbott + * Added PIDs for CrystalFontz 547, 633, 631, 635, 640 and 640 from + * Wayne Wylupski. + * + * (10/Jul/2003) David Glance + * Added PID for DSS-20 SyncStation cradle for Sony-Ericsson P800. + * * (23/Jun/2003) Ian Abbott * Reduced flip buffer pushes and corrected a data length test in * ftdi_read_bulk_callback. @@ -247,8 +266,14 @@ { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0, 0x3ff) }, { USB_DEVICE_VER(FTDI_VID, FTDI_RELAIS_PID, 0, 0x3ff) }, { USB_DEVICE_VER(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID, 0, 0x3ff) }, - { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0, 0x3ff) }, { USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_547_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_633_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_631_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_635_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_640_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_642_PID, 0, 0x3ff) }, { USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0, 0x3ff) }, { USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0, 0x3ff) }, { USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_0_PID, 0, 0x3ff) }, @@ -304,6 +329,8 @@ { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_6_PID, 0, 0x3ff) }, { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_7_PID, 0, 0x3ff) }, { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_8_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(IDTECH_VID, IDTECH_IDT1221U_PID, 0, 0x3ff) }, + { USB_DEVICE_VER(OCT_VID, OCT_US101_PID, 0, 0x3ff) }, { } /* Terminating entry */ }; @@ -312,8 +339,14 @@ { USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0x400, 0xffff) }, { USB_DEVICE_VER(FTDI_VID, FTDI_RELAIS_PID, 0x400, 0xffff) }, { USB_DEVICE_VER(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID, 0x400, 0xffff) }, - { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0x400, 0xffff) }, { USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_634_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_547_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_633_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_631_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_635_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_640_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(FTDI_VID, FTDI_XF_642_PID, 0x400, 0xffff) }, { USB_DEVICE_VER(FTDI_VID, FTDI_VNHCPCUSB_D_PID, 0x400, 0xffff) }, { USB_DEVICE_VER(FTDI_VID, FTDI_DSS20_PID, 0x400, 0xffff) }, { USB_DEVICE_VER(FTDI_MTXORB_VID, FTDI_MTXORB_0_PID, 0x400, 0xffff) }, @@ -369,6 +402,8 @@ { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_6_PID, 0x400, 0xffff) }, { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_7_PID, 0x400, 0xffff) }, { USB_DEVICE_VER(SEALEVEL_VID, SEALEVEL_2803_8_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(IDTECH_VID, IDTECH_IDT1221U_PID, 0x400, 0xffff) }, + { USB_DEVICE_VER(OCT_VID, OCT_US101_PID, 0x400, 0xffff) }, { } /* Terminating entry */ }; @@ -389,8 +424,14 @@ { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) }, { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) }, { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_XF_633_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_XF_631_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_XF_635_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_XF_640_PID) }, + { USB_DEVICE(FTDI_VID, FTDI_XF_642_PID) }, { USB_DEVICE(FTDI_VID, FTDI_DSS20_PID) }, { USB_DEVICE(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID) }, { USB_DEVICE(FTDI_VID, FTDI_VNHCPCUSB_D_PID) }, @@ -447,6 +488,8 @@ { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_6_PID) }, { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_7_PID) }, { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2803_8_PID) }, + { USB_DEVICE(IDTECH_VID, IDTECH_IDT1221U_PID) }, + { USB_DEVICE(OCT_VID, OCT_US101_PID) }, { USB_DEVICE_VER(FTDI_VID, FTDI_HE_TIRA1_PID, 0x400, 0xffff) }, { USB_DEVICE(FTDI_VID, FTDI_USB_UIRT_PID) }, { } /* Terminating entry */ @@ -1419,33 +1462,21 @@ static void ftdi_write_bulk_callback (struct urb *urb) { struct usb_serial_port *port = (struct usb_serial_port *)urb->context; - struct usb_serial *serial; - - dbg("%s", __FUNCTION__); if (port_paranoia_check (port, __FUNCTION__)) return; + dbg("%s - port %d", __FUNCTION__, port->number); + if (urb->status) { dbg("nonzero write bulk status received: %d", urb->status); return; } - serial = get_usb_serial (port, __FUNCTION__); - if (!serial) { - dbg("%s - bad serial pointer, exiting", __FUNCTION__); - return; - } - - /* Have to check for validity of queueing up the tasks */ - dbg("%s - port->open_count = %d", __FUNCTION__, port->open_count); - if (port->open_count > 0){ queue_task(&port->tqueue, &tq_immediate); mark_bh(IMMEDIATE_BH); - } - - return; + } } /* ftdi_write_bulk_callback */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/ftdi_sio.h linux-2.4.23-pre8/drivers/usb/serial/ftdi_sio.h --- linux-2.4.22/drivers/usb/serial/ftdi_sio.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/ftdi_sio.h 2003-10-22 22:49:21.000000000 +0000 @@ -32,8 +32,14 @@ /* www.crystalfontz.com devices - thanx for providing free devices for evaluation ! */ /* they use the ftdi chipset for the USB interface and the vendor id is the same */ -#define FTDI_XF_634_PID 0xFC09 /* Four line device */ -#define FTDI_XF_632_PID 0xFC08 /* Two line device */ +#define FTDI_XF_632_PID 0xFC08 /* 632: 16x2 Character Display */ +#define FTDI_XF_634_PID 0xFC09 /* 634: 20x4 Character Display */ +#define FTDI_XF_547_PID 0xFC0A /* 547: Two line Display */ +#define FTDI_XF_633_PID 0xFC0B /* 633: 16x2 Character Display with Keys */ +#define FTDI_XF_631_PID 0xFC0C /* 631: 20x2 Character Display */ +#define FTDI_XF_635_PID 0xFC0D /* 635: 20x4 Character Display */ +#define FTDI_XF_640_PID 0xFC0E /* 640: Two line Display */ +#define FTDI_XF_642_PID 0xFC0F /* 642: Two line Display */ /* Video Networks Limited / Homechoice in the UK use an ftdi-based device for their 1Mb */ /* broadband internet service. The following PID is exhibited by the usb device supplied */ @@ -121,6 +127,19 @@ /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ +/* + * Definitions for ID TECH (www.idt-net.com) devices + */ +#define IDTECH_VID 0x0ACD /* ID TECH Vendor ID */ +#define IDTECH_IDT1221U_PID 0x0300 /* IDT1221U USB to RS-232 adapter */ + +/* + * Definitions for Omnidirectional Control Technology, Inc. devices + */ +#define OCT_VID 0x0B39 /* OCT vendor ID */ +/* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */ +#define OCT_US101_PID 0x0421 /* OCT US101 USB to RS-232 */ + /* Commands */ #define FTDI_SIO_RESET 0 /* Reset the port */ #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_16654.h linux-2.4.23-pre8/drivers/usb/serial/io_16654.h --- linux-2.4.22/drivers/usb/serial/io_16654.h 2003-06-13 14:51:36.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_16654.h 2003-10-22 22:49:22.000000000 +0000 @@ -2,7 +2,7 @@ * * 16654.H Definitions for 16C654 UART used on EdgePorts * - * Copyright (c) 1998 Inside Out Networks, Inc. + * Copyright (C) 1998 Inside Out Networks, Inc. * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_edgeport.c linux-2.4.23-pre8/drivers/usb/serial/io_edgeport.c --- linux-2.4.22/drivers/usb/serial/io_edgeport.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_edgeport.c 2003-10-22 22:47:39.000000000 +0000 @@ -1,8 +1,8 @@ /* * Edgeport USB Serial Converter driver * - * Copyright(c) 2000 Inside Out Networks, All rights reserved. - * Copyright(c) 2001-2002 Greg Kroah-Hartman + * Copyright (C) 2000 Inside Out Networks, All rights reserved. + * Copyright (C) 2001-2002 Greg Kroah-Hartman * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_edgeport.h linux-2.4.23-pre8/drivers/usb/serial/io_edgeport.h --- linux-2.4.22/drivers/usb/serial/io_edgeport.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_edgeport.h 2003-10-22 22:49:09.000000000 +0000 @@ -2,7 +2,7 @@ * * io_edgeport.h Edgeport Linux Interface definitions * - * Copyright (c) 2000 Inside Out Networks, Inc. + * Copyright (C) 2000 Inside Out Networks, Inc. * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_fw_boot.h linux-2.4.23-pre8/drivers/usb/serial/io_fw_boot.h --- linux-2.4.22/drivers/usb/serial/io_fw_boot.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_fw_boot.h 2003-10-22 22:49:50.000000000 +0000 @@ -1,7 +1,7 @@ //************************************************************** //* Edgeport/4 Binary Image //* Generated by HEX2C v1.06 -//* Copyright(c) 1998 Inside Out Networks, All rights reserved. +//* Copyright (C) 1998 Inside Out Networks, 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 Software Foundation; either version 2 of the License, or diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_fw_boot2.h linux-2.4.23-pre8/drivers/usb/serial/io_fw_boot2.h --- linux-2.4.22/drivers/usb/serial/io_fw_boot2.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_fw_boot2.h 2003-10-22 22:47:59.000000000 +0000 @@ -1,7 +1,7 @@ //************************************************************** //* Edgeport/4 Binary Image //* Generated by HEX2C v1.06 -//* Copyright(c) 1998 Inside Out Networks, All rights reserved. +//* Copyright (C) 1998 Inside Out Networks, 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 Software Foundation; either version 2 of the License, or diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_fw_down.h linux-2.4.23-pre8/drivers/usb/serial/io_fw_down.h --- linux-2.4.22/drivers/usb/serial/io_fw_down.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_fw_down.h 2003-10-22 22:48:41.000000000 +0000 @@ -1,7 +1,7 @@ //************************************************************** //* Edgeport/4 Binary Image //* Generated by HEX2C v1.06 -//* Copyright(c) 1998 Inside Out Networks, All rights reserved. +//* Copyright (C) 1998 Inside Out Networks, 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 Software Foundation; either version 2 of the License, or diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_fw_down2.h linux-2.4.23-pre8/drivers/usb/serial/io_fw_down2.h --- linux-2.4.22/drivers/usb/serial/io_fw_down2.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_fw_down2.h 2003-10-22 22:48:13.000000000 +0000 @@ -1,7 +1,7 @@ //************************************************************** //* Edgeport/4 Binary Image //* Generated by HEX2C v1.06 -//* Copyright(c) 1998 Inside Out Networks, All rights reserved. +//* Copyright (C) 1998 Inside Out Networks, 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 Software Foundation; either version 2 of the License, or diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_fw_down3.h linux-2.4.23-pre8/drivers/usb/serial/io_fw_down3.h --- linux-2.4.22/drivers/usb/serial/io_fw_down3.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_fw_down3.h 2003-10-22 22:49:32.000000000 +0000 @@ -1,7 +1,7 @@ //************************************************************** //* Edgeport Binary Image (for TI based products) //* Generated by TIBin2C v1.00 -//* Copyright(c) 2001 Inside Out Networks, All rights reserved. +//* Copyright (C) 2001 Inside Out Networks, All rights reserved. //************************************************************** diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_ionsp.h linux-2.4.23-pre8/drivers/usb/serial/io_ionsp.h --- linux-2.4.22/drivers/usb/serial/io_ionsp.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_ionsp.h 2003-10-22 22:48:19.000000000 +0000 @@ -2,7 +2,7 @@ * * IONSP.H Definitions for I/O Networks Serial Protocol * - * Copyright (c) 1997-1998 Inside Out Networks, Inc. + * Copyright (C) 1997-1998 Inside Out Networks, Inc. * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_ti.c linux-2.4.23-pre8/drivers/usb/serial/io_ti.c --- linux-2.4.22/drivers/usb/serial/io_ti.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_ti.c 2003-10-22 22:48:42.000000000 +0000 @@ -1,8 +1,8 @@ /* * Edgeport USB Serial Converter driver * - * Copyright(c) 2000-2002 Inside Out Networks, All rights reserved. - * Copyright(c) 2001-2002 Greg Kroah-Hartman + * Copyright (C) 2000-2002 Inside Out Networks, All rights reserved. + * Copyright (C) 2001-2002 Greg Kroah-Hartman * * 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 @@ -126,6 +126,7 @@ static struct usb_device_id edgeport_2port_id_table [] = { { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) }, + { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) }, { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) }, { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) }, { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421_BOOT) }, @@ -144,6 +145,7 @@ static __devinitdata struct usb_device_id id_table_combined [] = { { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) }, { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) }, + { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) }, { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) }, { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) }, { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421_BOOT) }, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_ti.h linux-2.4.23-pre8/drivers/usb/serial/io_ti.h --- linux-2.4.22/drivers/usb/serial/io_ti.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_ti.h 2003-10-22 22:48:30.000000000 +0000 @@ -1,6 +1,6 @@ /***************************************************************************** * - * Copyright (c) 1997-2002 Inside Out Networks, Inc. + * Copyright (C) 1997-2002 Inside Out Networks, Inc. * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/io_usbvend.h linux-2.4.23-pre8/drivers/usb/serial/io_usbvend.h --- linux-2.4.22/drivers/usb/serial/io_usbvend.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/io_usbvend.h 2003-10-22 22:48:01.000000000 +0000 @@ -7,7 +7,7 @@ * ************************************************************************ * - * Copyright (c) 1998 Inside Out Networks, Inc. + * Copyright (C) 1998 Inside Out Networks, Inc. * 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 @@ -118,6 +118,7 @@ #define ION_DEVICE_ID_TI_EDGEPORT_1 0x0215 /* Edgeport/1 RS232 */ #define ION_DEVICE_ID_TI_EDGEPORT_42 0x0217 /* Edgeport/42 4 hub 2 RS232 */ #define ION_DEVICE_ID_TI_EDGEPORT_22 0x021A /* Edgeport/22 Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232 */ +#define ION_DEVICE_ID_TI_EDGEPORT_2C 0x021B /* Edgeport/2c RS232 */ #define ION_DEVICE_ID_TI_EDGEPORT_421_BOOT 0x0240 /* Edgeport/421 in boot mode */ #define ION_DEVICE_ID_TI_EDGEPORT_421_DOWN 0x0241 /* Edgeport/421 in download mode first interface is 2 RS232 (Note that the second interface of this multi interface device should be a standard USB class 7 printer port) */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/ipaq.c linux-2.4.23-pre8/drivers/usb/serial/ipaq.c --- linux-2.4.22/drivers/usb/serial/ipaq.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/ipaq.c 2003-10-22 22:48:59.000000000 +0000 @@ -332,7 +332,7 @@ usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data); tty = port->tty; - if (urb->actual_length) { + if (tty && urb->actual_length) { for (i = 0; i < urb->actual_length ; ++i) { /* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */ if(tty->flip.count >= TTY_FLIPBUF_SIZE) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/keyspan.c linux-2.4.23-pre8/drivers/usb/serial/keyspan.c --- linux-2.4.22/drivers/usb/serial/keyspan.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/keyspan.c 2003-10-22 22:47:44.000000000 +0000 @@ -28,6 +28,9 @@ Change History + 2003sep04 LPM (Keyspan) add support for new single port product USA19HS. + Improve setup message handling for all devices. + 2003Apr16 LPM (Keyspan) fix delayed control message resend for multi-port 'Open' case. Fix 'mpr' entries in keyspan.h (previously broken) @@ -174,6 +177,7 @@ int baud; int old_baud; unsigned int cflag; + unsigned int old_cflag; enum {flow_none, flow_cts, flow_xon} flow_control; int rts_state; /* Handshaking pins (outputs) */ int dtr_state; @@ -189,11 +193,12 @@ /* Include Keyspan message headers. All current Keyspan Adapters - make use of one of three message formats which are referred - to as USA-26, USA-28 and USA-49 by Keyspan and within this driver. */ + make use of one of four message formats which are referred + to as USA-26, USA-28 and USA-49, USA-90 by Keyspan and within this driver. */ #include "keyspan_usa26msg.h" #include "keyspan_usa28msg.h" #include "keyspan_usa49msg.h" +#include "keyspan_usa90msg.h" /* Functions used by new usb-serial code. */ @@ -327,8 +332,8 @@ return -ENOIOCTLCMD; } - /* Write function is generic for the three protocols used - with only a minor change for usa49 required */ + /* Write function is similar for the four protocols used + with only a minor change for usa90 (usa19hs) required */ static int keyspan_write(struct usb_serial_port *port, int from_user, const unsigned char *buf, int count) { @@ -337,18 +342,27 @@ int flip; int left, todo; struct urb *this_urb; - int err; + int err, maxDataLen, dataOffset; p_priv = (struct keyspan_port_private *)(port->private); d_details = p_priv->device_details; + if (d_details->msg_format == msg_usa90) { + maxDataLen = 64; + dataOffset = 0; + } + else { + maxDataLen = 63; + dataOffset = 1; + } + dbg("%s - for port %d (%d chars [%x]), flip=%d", __FUNCTION__, port->number, count, buf[0], p_priv->out_flip); for (left = count; left > 0; left -= todo) { todo = left; - if (todo > 63) - todo = 63; + if (todo > maxDataLen) + todo = maxDataLen; flip = p_priv->out_flip; @@ -371,20 +385,20 @@ break; } - /* First byte in buffer is "last flag" - unused so + /* First byte in buffer is "last flag" (except for usa19hx) - unused so for now so set to zero */ ((char *)this_urb->transfer_buffer)[0] = 0; if (from_user) { - if (copy_from_user(this_urb->transfer_buffer + 1, buf, todo)) + if (copy_from_user(this_urb->transfer_buffer + dataOffset, buf, todo)) return -EFAULT; } else { - memcpy (this_urb->transfer_buffer + 1, buf, todo); + memcpy (this_urb->transfer_buffer + dataOffset, buf, todo); } buf += todo; /* send the data out the bulk port */ - this_urb->transfer_buffer_length = todo + 1; + this_urb->transfer_buffer_length = todo + dataOffset; this_urb->transfer_flags &= ~USB_ASYNC_UNLINK; this_urb->dev = port->serial->dev; @@ -424,9 +438,12 @@ if (urb->actual_length) { /* 0x80 bit is error flag */ if ((data[0] & 0x80) == 0) { - /* no error on any byte */ + /* no errors on individual bytes, only possible overrun err*/ + if (data[0] & RXERROR_OVERRUN) + err = TTY_OVERRUN; + else err = 0; for (i = 1; i < urb->actual_length ; ++i) { - tty_insert_flip_char(tty, data[i], 0); + tty_insert_flip_char(tty, data[i], err); } } else { /* some bytes had errors, every byte has status */ @@ -455,7 +472,7 @@ return; } - /* Outdat handling is common for usa26, usa28 and usa49 messages */ + /* Outdat handling is common for all devices */ static void usa2x_outdat_callback(struct urb *urb) { struct usb_serial_port *port; @@ -561,7 +578,7 @@ } -static void usa28_indat_callback(struct urb *urb) +static void usa28_indat_callback(struct urb *urb) { int i, err; struct usb_serial_port *port; @@ -848,28 +865,171 @@ } +static void usa90_indat_callback(struct urb *urb) +{ + int i, err; + int endpoint; + struct usb_serial_port *port; + struct keyspan_port_private *p_priv; + struct tty_struct *tty; + unsigned char *data = urb->transfer_buffer; + + dbg ("%s", __FUNCTION__); + + endpoint = usb_pipeendpoint(urb->pipe); + + + if (urb->status) { + dbg("%s - nonzero status: %x on endpoint %d.", + __FUNCTION__, urb->status, endpoint); + return; + } + + port = (struct usb_serial_port *) urb->context; + p_priv = (struct keyspan_port_private *)(port->private); + + tty = port->tty; + if (urb->actual_length) { + + /* if current mode is DMA, looks like usa28 format + otherwise looks like usa26 data format */ + + if (p_priv->baud > 57600) { + for (i = 0; i < urb->actual_length ; ++i) + tty_insert_flip_char(tty, data[i], 0); + } + else { + + /* 0x80 bit is error flag */ + if ((data[0] & 0x80) == 0) { + /* no errors on individual bytes, only possible overrun err*/ + if (data[0] & RXERROR_OVERRUN) + err = TTY_OVERRUN; + else err = 0; + for (i = 1; i < urb->actual_length ; ++i) + tty_insert_flip_char(tty, data[i], err); + + } + else { + /* some bytes had errors, every byte has status */ + dbg("%s - RX error!!!!", __FUNCTION__); + for (i = 0; i + 1 < urb->actual_length; i += 2) { + int stat = data[i], flag = 0; + if (stat & RXERROR_OVERRUN) + flag |= TTY_OVERRUN; + if (stat & RXERROR_FRAMING) + flag |= TTY_FRAME; + if (stat & RXERROR_PARITY) + flag |= TTY_PARITY; + /* XXX should handle break (0x10) */ + tty_insert_flip_char(tty, data[i+1], flag); + } + } + } + tty_flip_buffer_push(tty); + } + + /* Resubmit urb so we continue receiving */ + urb->dev = port->serial->dev; + if (port->open_count) + if ((err = usb_submit_urb(urb)) != 0) { + dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err); + } + return; +} + + +static void usa90_instat_callback(struct urb *urb) +{ + unsigned char *data = urb->transfer_buffer; + struct keyspan_usa90_portStatusMessage *msg; + struct usb_serial *serial; + struct usb_serial_port *port; + struct keyspan_port_private *p_priv; + int old_dcd_state, err; + + serial = (struct usb_serial *) urb->context; + + if (urb->status) { + dbg("%s - nonzero status: %x", __FUNCTION__, urb->status); + return; + } + if (urb->actual_length < 14) { + dbg("%s - %d byte report??", __FUNCTION__, urb->actual_length); + goto exit; + } + + msg = (struct keyspan_usa90_portStatusMessage *)data; + + /* Now do something useful with the data */ + + port = &serial->port[0]; + p_priv = (struct keyspan_port_private *)(port->private); + + /* Update handshaking pin state information */ + old_dcd_state = p_priv->dcd_state; + p_priv->cts_state = ((msg->cts) ? 1 : 0); + p_priv->dsr_state = ((msg->dsr) ? 1 : 0); + p_priv->dcd_state = ((msg->dcd) ? 1 : 0); + p_priv->ri_state = ((msg->ri) ? 1 : 0); + + if (port->tty && !C_CLOCAL(port->tty) + && old_dcd_state != p_priv->dcd_state) { + if (old_dcd_state) + tty_hangup(port->tty); + /* else */ + /* wake_up_interruptible(&p_priv->open_wait); */ + } + + /* Resubmit urb so we continue receiving */ + urb->dev = serial->dev; + if ((err = usb_submit_urb(urb)) != 0) { + dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err); + } +exit: + ; +} + +static void usa90_outcont_callback(struct urb *urb) +{ + struct usb_serial_port *port; + struct keyspan_port_private *p_priv; + + port = (struct usb_serial_port *) urb->context; + p_priv = (struct keyspan_port_private *)(port->private); + + if (p_priv->resend_cont) { + dbg ("%s - sending setup", __FUNCTION__); + keyspan_usa90_send_setup(port->serial, port, p_priv->resend_cont - 1); + } +} + static int keyspan_write_room (struct usb_serial_port *port) { struct keyspan_port_private *p_priv; const struct keyspan_device_details *d_details; - int flip; + int flip,dataLen; struct urb *this_urb; dbg("%s", __FUNCTION__); p_priv = (struct keyspan_port_private *)(port->private); d_details = p_priv->device_details; + if (d_details->msg_format == msg_usa90) + dataLen = 64; + else dataLen = 63; + flip = p_priv->out_flip; /* Check both endpoints to see if any are available. */ if ((this_urb = p_priv->out_urbs[flip]) != 0) { if (this_urb->status != -EINPROGRESS) - return (63); + return (dataLen); flip = (flip + 1) & d_details->outdat_endp_flip; if ((this_urb = p_priv->out_urbs[flip]) != 0) if (this_urb->status != -EINPROGRESS) - return (63); + return (dataLen); } return (0); } @@ -888,20 +1048,25 @@ struct usb_serial *serial = port->serial; const struct keyspan_device_details *d_details; int i, err; + int baud_rate, device_port; struct urb *urb; + unsigned int cflag; s_priv = (struct keyspan_serial_private *)(serial->private); p_priv = (struct keyspan_port_private *)(port->private); - d_details = s_priv->device_details; + d_details = p_priv->device_details; dbg("%s - port%d.", __FUNCTION__, port->number); - p_priv = (struct keyspan_port_private *)(port->private); - /* Set some sane defaults */ p_priv->rts_state = 1; p_priv->dtr_state = 1; + p_priv->baud = 9600; + /* force baud and lcr to be set on open */ + p_priv->old_baud = 0; + p_priv->old_cflag = 0; + p_priv->out_flip = 0; p_priv->in_flip = 0; @@ -910,7 +1075,10 @@ if ((urb = p_priv->in_urbs[i]) == NULL) continue; urb->dev = serial->dev; - usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); + + /* make sure endpoint data toggle is synchronized with the device */ + + usb_clear_halt(urb->dev, urb->pipe); if ((err = usb_submit_urb(urb)) != 0) { dbg("%s - submit urb %d failed (%d)", __FUNCTION__, i, err); @@ -925,12 +1093,29 @@ /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */ } - // if the device is a USA49x, determine whether it is an W or WLC model - // and set the baud clock accordingly + /* get the terminal config for the setup message now so we don't + * need to send 2 of them */ + + cflag = port->tty->termios->c_cflag; + device_port = port->number - port->serial->minor; + + /* Baud rate calculation takes baud rate as an integer + so other rates can be generated if desired. */ + baud_rate = tty_get_baud_rate(port->tty); + /* If no match or invalid, leave as default */ + if (baud_rate >= 0 + && d_details->calculate_baud_rate(baud_rate, d_details->baudclk, + NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) { + p_priv->baud = baud_rate; + } + + /* set CTS/RTS handshake etc. */ + p_priv->cflag = cflag; + p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none; keyspan_send_setup(port, 1); //mdelay(100); - keyspan_set_termios(port, NULL); + //keyspan_set_termios(port, NULL); return (0); } @@ -965,7 +1150,7 @@ keyspan_send_setup(port, 2); /* pilot-xfer seems to work best with this delay */ mdelay(100); - keyspan_set_termios(port, NULL); + // keyspan_set_termios(port, NULL); } /*while (p_priv->outcont_urb->status == -EINPROGRESS) { @@ -1160,6 +1345,14 @@ .outdat_callback = usa2x_outdat_callback, .inack_callback = usa49_inack_callback, .outcont_callback = usa49_outcont_callback, + }, { + /* msg_usa90 callbacks */ + .instat_callback = usa90_instat_callback, + .glocont_callback = usa28_glocont_callback, + .indat_callback = usa90_indat_callback, + .outdat_callback = usa2x_outdat_callback, + .inack_callback = usa28_inack_callback, + .outcont_callback = usa90_outcont_callback, } }; @@ -1283,6 +1476,41 @@ return (KEYSPAN_BAUD_RATE_OK); } +/* usa19hs function doesn't require prescaler */ +static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, + u8 *rate_low, u8 *prescaler, int portnum) +{ + u32 b16, /* baud rate times 16 (actual rate used internally) */ + div; /* divisor */ + + dbg ("%s - %d.", __FUNCTION__, baud_rate); + + /* prevent divide by zero... */ + if( (b16 = (baud_rate * 16L)) == 0) + return (KEYSPAN_INVALID_BAUD_RATE); + + + + /* calculate the divisor */ + if( (div = (baudclk / b16)) == 0) + return (KEYSPAN_INVALID_BAUD_RATE); + + if(div > 0xffff) + return (KEYSPAN_INVALID_BAUD_RATE); + + /* return the counter values if non-null */ + if (rate_low) + *rate_low = (u8) (div & 0xff); + + if (rate_hi) + *rate_hi = (u8) ((div >> 8) & 0xff); + + if (rate_low && rate_hi) + dbg ("%s - %d %02x %02x.", __FUNCTION__, baud_rate, *rate_hi, *rate_low); + + return (KEYSPAN_BAUD_RATE_OK); +} + static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, u8 *rate_low, u8 *prescaler, int portnum) { @@ -1435,6 +1663,7 @@ p_priv->resend_cont = reset_port + 1; if (this_urb->status == -EINPROGRESS) { /* dbg ("%s - already writing", __FUNCTION__); */ + mdelay(5); return(-1); } @@ -1585,6 +1814,7 @@ p_priv->resend_cont = reset_port + 1; if (this_urb->status == -EINPROGRESS) { dbg ("%s already writing", __FUNCTION__); + mdelay(5); return(-1); } @@ -1717,6 +1947,7 @@ p_priv->resend_cont = reset_port + 1; if (this_urb->status == -EINPROGRESS) { /* dbg ("%s - already writing", __FUNCTION__); */ + mdelay(5); return(-1); } @@ -1845,6 +2076,144 @@ return (0); } +static int keyspan_usa90_send_setup(struct usb_serial *serial, + struct usb_serial_port *port, + int reset_port) +{ + struct keyspan_usa90_portControlMessage msg; + struct keyspan_serial_private *s_priv; + struct keyspan_port_private *p_priv; + const struct keyspan_device_details *d_details; + struct urb *this_urb; + int err; + u8 prescaler; + + dbg ("%s", __FUNCTION__); + + s_priv = (struct keyspan_serial_private *)(serial->private); + p_priv = (struct keyspan_port_private *)(port->private); + d_details = s_priv->device_details; + + /* only do something if we have a bulk out endpoint */ + if ((this_urb = p_priv->outcont_urb) == NULL) { + dbg("%s - oops no urb.", __FUNCTION__); + return -1; + } + + /* Save reset port val for resend. + Don't overwrite resend for open/close condition. */ + if ((reset_port + 1) > p_priv->resend_cont) + p_priv->resend_cont = reset_port + 1; + if (this_urb->status == -EINPROGRESS) { + dbg ("%s already writing", __FUNCTION__); + mdelay(5); + return(-1); + } + + memset(&msg, 0, sizeof (struct keyspan_usa90_portControlMessage)); + + /* Only set baud rate if it's changed */ + if (p_priv->old_baud != p_priv->baud) { + p_priv->old_baud = p_priv->baud; + msg.setClocking = 0x01; + if (d_details->calculate_baud_rate + (p_priv->baud, d_details->baudclk, &msg.baudHi, + &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE ) { + dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__, + p_priv->baud); + p_priv->baud = 9600; + d_details->calculate_baud_rate (p_priv->baud, d_details->baudclk, + &msg.baudHi, &msg.baudLo, &prescaler, 0); + } + msg.setRxMode = 1; + msg.setTxMode = 1; + } + + /* modes must always be correctly specified */ + if (p_priv->baud > 57600) + { + msg.rxMode = RXMODE_DMA; + msg.txMode = TXMODE_DMA; + } + else + { + msg.rxMode = RXMODE_BYHAND; + msg.txMode = TXMODE_BYHAND; + } + + msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1; + switch (p_priv->cflag & CSIZE) { + case CS5: + msg.lcr |= USA_DATABITS_5; + break; + case CS6: + msg.lcr |= USA_DATABITS_6; + break; + case CS7: + msg.lcr |= USA_DATABITS_7; + break; + case CS8: + msg.lcr |= USA_DATABITS_8; + break; + } + if (p_priv->cflag & PARENB) { + /* note USA_PARITY_NONE == 0 */ + msg.lcr |= (p_priv->cflag & PARODD)? + USA_PARITY_ODD: USA_PARITY_EVEN; + } + if (p_priv->old_cflag != p_priv->cflag) { + p_priv->old_cflag = p_priv->cflag; + msg.setLcr = 0x01; + } + + if (p_priv->flow_control == flow_cts) + msg.txFlowControl = TXFLOW_CTS; + msg.setTxFlowControl = 0x01; + msg.setRxFlowControl = 0x01; + + msg.rxForwardingLength = 16; + msg.rxForwardingTimeout = 16; + msg.txAckSetting = 0; + msg.xonChar = 17; + msg.xoffChar = 19; + + /* Opening port */ + if (reset_port == 1) { + msg.portEnabled = 1; + msg.rxFlush = 1; + msg.txBreak = (p_priv->break_on); + } + /* Closing port */ + else if (reset_port == 2) { + msg.portEnabled = 0; + } + /* Sending intermediate configs */ + else { + if (port->open_count) + msg.portEnabled = 1; + msg.txBreak = (p_priv->break_on); + } + + /* Do handshaking outputs */ + msg.setRts = 0x01; + msg.rts = p_priv->rts_state; + + msg.setDtr = 0x01; + msg.dtr = p_priv->dtr_state; + + p_priv->resend_cont = 0; + memcpy (this_urb->transfer_buffer, &msg, sizeof(msg)); + + /* send the data out the device on control endpoint */ + this_urb->transfer_buffer_length = sizeof(msg); + + this_urb->dev = serial->dev; + if ((err = usb_submit_urb(this_urb)) != 0) { + dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err); + } + return (0); +} + static void keyspan_send_setup(struct usb_serial_port *port, int reset_port) { struct usb_serial *serial = port->serial; @@ -1866,9 +2235,13 @@ case msg_usa49: keyspan_usa49_send_setup(serial, port, reset_port); break; + case msg_usa90: + keyspan_usa90_send_setup(serial, port, reset_port); + break; } } + /* Gets called by the "real" driver (ie once firmware is loaded and renumeration has taken place. */ static int keyspan_startup (struct usb_serial *serial) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/keyspan.h linux-2.4.23-pre8/drivers/usb/serial/keyspan.h --- linux-2.4.22/drivers/usb/serial/keyspan.h 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/keyspan.h 2003-10-22 22:49:11.000000000 +0000 @@ -77,6 +77,10 @@ u8 *rate_hi, u8 *rate_low, u8 *prescaler, int portnum); +static int keyspan_usa19hs_calc_baud (u32 baud_rate, u32 baudclk, + u8 *rate_hi, u8 *rate_low, + u8 *prescaler, int portnum); + static int keyspan_usa28_send_setup (struct usb_serial *serial, struct usb_serial_port *port, int reset_port); @@ -87,6 +91,9 @@ struct usb_serial_port *port, int reset_port); +static int keyspan_usa90_send_setup (struct usb_serial *serial, + struct usb_serial_port *port, + int reset_port); /* Struct used for firmware - increased size of data section to allow Keyspan's 'C' firmware struct to be used unmodified */ @@ -178,6 +185,7 @@ #define KEYSPAN_USA18X_BAUDCLK (12000000L) /* a guess */ #define KEYSPAN_USA19_BAUDCLK (12000000L) #define KEYSPAN_USA19W_BAUDCLK (24000000L) +#define KEYSPAN_USA19HS_BAUDCLK (14769231L) #define KEYSPAN_USA28_BAUDCLK (1843200L) #define KEYSPAN_USA28X_BAUDCLK (12000000L) #define KEYSPAN_USA49W_BAUDCLK (48000000L) @@ -210,6 +218,7 @@ #define keyspan_usa18x_product_id 0x0112 #define keyspan_usa19_product_id 0x0107 #define keyspan_usa19qi_product_id 0x010c +#define keyspan_usa19hs_product_id 0x0121 #define keyspan_mpr_product_id 0x011c #define keyspan_usa19qw_product_id 0x0119 #define keyspan_usa19w_product_id 0x0108 @@ -225,7 +234,7 @@ /* product ID value */ int product_id; - enum {msg_usa26, msg_usa28, msg_usa49} msg_format; + enum {msg_usa26, msg_usa28, msg_usa49, msg_usa90} msg_format; /* Number of physical ports */ int num_ports; @@ -361,6 +370,22 @@ baudclk: KEYSPAN_USA19W_BAUDCLK, }; +static const struct keyspan_device_details usa19hs_device_details = { + product_id: keyspan_usa19hs_product_id, + msg_format: msg_usa90, + num_ports: 1, + indat_endp_flip: 0, + outdat_endp_flip: 0, + indat_endpoints: {0x81}, + outdat_endpoints: {0x01}, + inack_endpoints: {-1}, + outcont_endpoints: {0x02}, + instat_endpoint: 0x82, + glocont_endpoint: -1, + calculate_baud_rate: keyspan_usa19hs_calc_baud, + baudclk: KEYSPAN_USA19HS_BAUDCLK, +}; + static const struct keyspan_device_details usa28_device_details = { product_id: keyspan_usa28_product_id, msg_format: msg_usa28, @@ -450,6 +475,7 @@ &mpr_device_details, &usa19qw_device_details, &usa19w_device_details, + &usa19hs_device_details, &usa28_device_details, &usa28x_device_details, &usa28xa_device_details, @@ -477,6 +503,7 @@ { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) }, + { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) }, @@ -512,6 +539,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_product_id) }, { } /* Terminating entry */ }; @@ -547,8 +575,8 @@ name: "Keyspan 1 port adapter", id_table: keyspan_1port_ids, num_interrupt_in: NUM_DONT_CARE, - num_bulk_in: 3, - num_bulk_out: 4, + num_bulk_in: NUM_DONT_CARE, + num_bulk_out: NUM_DONT_CARE, num_ports: 1, open: keyspan_open, close: keyspan_close, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/keyspan_pda.c linux-2.4.23-pre8/drivers/usb/serial/keyspan_pda.c --- linux-2.4.22/drivers/usb/serial/keyspan_pda.c 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/keyspan_pda.c 2003-10-22 22:49:09.000000000 +0000 @@ -1,9 +1,9 @@ /* * USB Keyspan PDA / Xircom / Entregra Converter driver * - * Copyright (c) 1999 - 2001 Greg Kroah-Hartman - * Copyright (c) 1999, 2000 Brian Warner - * Copyright (c) 2000 Al Borchers + * Copyright (C) 1999 - 2001 Greg Kroah-Hartman + * Copyright (C) 1999, 2000 Brian Warner + * Copyright (C) 2000 Al Borchers * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/keyspan_pda_fw.h linux-2.4.23-pre8/drivers/usb/serial/keyspan_pda_fw.h --- linux-2.4.22/drivers/usb/serial/keyspan_pda_fw.h 2001-05-20 00:47:55.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/keyspan_pda_fw.h 2003-10-22 22:48:59.000000000 +0000 @@ -1,7 +1,7 @@ /* * USB Keyspan PDA Firmware * - * Copyright (c) 1999, 2000 Brian Warner + * Copyright (C) 1999, 2000 Brian Warner * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/keyspan_usa26msg.h linux-2.4.23-pre8/drivers/usb/serial/keyspan_usa26msg.h --- linux-2.4.22/drivers/usb/serial/keyspan_usa26msg.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/keyspan_usa26msg.h 2003-10-22 22:47:30.000000000 +0000 @@ -1,10 +1,10 @@ /* usa26msg.h - Copyright (c) 1998-2000 InnoSys Incorporated. All Rights Reserved + Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - Keyspan USB Async Firmware to run on Anchor EZ-USB + Keyspan USB Async Message Formats for the USA28X Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -15,15 +15,11 @@ disclaimer. The following copyright notice must appear immediately at the beginning of all source files: - Copyright (c) 1998-2000 InnoSys Incorporated. All Rights Reserved + Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of InnoSys Incorprated may not be used to endorse or promote + 2. The name of InnoSys Incorporated may not be used to endorse or promote products derived from this software without specific prior written permission. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/keyspan_usa28msg.h linux-2.4.23-pre8/drivers/usb/serial/keyspan_usa28msg.h --- linux-2.4.22/drivers/usb/serial/keyspan_usa28msg.h 2002-11-28 23:53:14.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/keyspan_usa28msg.h 2003-10-22 22:47:43.000000000 +0000 @@ -1,10 +1,10 @@ /* usa28msg.h - Copyright (c) 1998-2000 InnoSys Incorporated. All Rights Reserved + Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - Keyspan USB Async Firmware to run on Anchor EZ-USB + Keyspan USB Async Message Formats for the USA26X Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -15,15 +15,11 @@ disclaimer. The following copyright notice must appear immediately at the beginning of all source files: - Copyright (c) 1998-2000 InnoSys Incorporated. All Rights Reserved + Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of InnoSys Incorprated may not be used to endorse or promote + 2. The name of InnoSys Incorporated may not be used to endorse or promote products derived from this software without specific prior written permission. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/keyspan_usa49msg.h linux-2.4.23-pre8/drivers/usb/serial/keyspan_usa49msg.h --- linux-2.4.22/drivers/usb/serial/keyspan_usa49msg.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/keyspan_usa49msg.h 2003-10-22 22:47:59.000000000 +0000 @@ -1,10 +1,10 @@ /* usa49msg.h - Copyright (c) 1998-2000 InnoSys Incorporated. All Rights Reserved + Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - Keyspan USB Async Firmware to run on Anchor EZ-USB + Keyspan USB Async Message Formats for the USA49W Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -15,15 +15,11 @@ disclaimer. The following copyright notice must appear immediately at the beginning of all source files: - Copyright (c) 1998-2000 InnoSys Incorporated. All Rights Reserved + Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of InnoSys Incorprated may not be used to endorse or promote + 2. The name of InnoSys Incorporated may not be used to endorse or promote products derived from this software without specific prior written permission. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/keyspan_usa90msg.h linux-2.4.23-pre8/drivers/usb/serial/keyspan_usa90msg.h --- linux-2.4.22/drivers/usb/serial/keyspan_usa90msg.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/keyspan_usa90msg.h 2003-10-22 22:48:26.000000000 +0000 @@ -0,0 +1,198 @@ +/* + usa90msg.h + + Copyright (c) 1998-2003 InnoSys Incorporated. All Rights Reserved + This file is available under a BSD-style copyright + + Keyspan USB Async Message Formats for the USA19HS + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain this licence text + without modification, this list of conditions, and the following + disclaimer. The following copyright notice must appear immediately at + the beginning of all source files: + + Copyright (c) 1998-2003 InnoSys Incorporated. All Rights Reserved + + This file is available under a BSD-style copyright + + 2. The name of InnoSys Incorprated may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY INNOSYS CORP. ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Revisions: + + 2003feb14 add setTxMode/txMode and cancelRxXoff to portControl + 2003mar21 change name of PARITY_0/1 to add MARK/SPACE +*/ + +#ifndef __USA90MSG__ +#define __USA90MSG__ + +struct keyspan_usa90_portControlMessage +{ + /* + there are three types of "commands" sent in the control message: + + 1. configuration changes which must be requested by setting + the corresponding "set" flag (and should only be requested + when necessary, to reduce overhead on the device): + */ + + u8 setClocking, // host requests baud rate be set + baudLo, // host does baud divisor calculation + baudHi, // host does baud divisor calculation + + setLcr, // host requests lcr be set + lcr, // use PARITY, STOPBITS, DATABITS below + + setRxMode, // set receive mode + rxMode, // RXMODE_DMA or RXMODE_BYHAND + + setTxMode, // set transmit mode + txMode, // TXMODE_DMA or TXMODE_BYHAND + + setTxFlowControl, // host requests tx flow control be set + txFlowControl , // use TX_FLOW... bits below + setRxFlowControl, // host requests rx flow control be set + rxFlowControl, // use RX_FLOW... bits below + sendXoff, // host requests XOFF transmitted immediately + sendXon, // host requests XON char transmitted + xonChar, // specified in current character format + xoffChar, // specified in current character format + + sendChar, // host requests char transmitted immediately + txChar, // character to send + + setRts, // host requests RTS output be set + rts, // 1=on, 0=off + setDtr, // host requests DTR output be set + dtr; // 1=on, 0=off + + + /* + 2. configuration data which is simply used as is + and must be specified correctly in every host message. + */ + + u8 rxForwardingLength, // forward when this number of chars available + rxForwardingTimeout, // (1-31 in ms) + txAckSetting; // 0=don't ack, 1=normal, 2-255 TBD... + /* + 3. Firmware states which cause actions if they change + and must be specified correctly in every host message. + */ + + u8 portEnabled, // 0=disabled, 1=enabled + txFlush, // 0=normal, 1=toss outbound data + txBreak, // 0=break off, 1=break on + loopbackMode; // 0=no loopback, 1=loopback enabled + + /* + 4. commands which are flags only; these are processed in order + (so that, e.g., if rxFlush and rxForward flags are set, the + port will have no data to forward); any non-zero value + is respected + */ + + u8 rxFlush, // toss inbound data + rxForward, // forward all inbound data, NOW (as if fwdLen==1) + cancelRxXoff, // cancel any receive XOFF state (_txXoff) + returnStatus; // return current status NOW +}; + +// defines for bits in lcr +#define USA_DATABITS_5 0x00 +#define USA_DATABITS_6 0x01 +#define USA_DATABITS_7 0x02 +#define USA_DATABITS_8 0x03 +#define STOPBITS_5678_1 0x00 // 1 stop bit for all byte sizes +#define STOPBITS_5_1p5 0x04 // 1.5 stop bits for 5-bit byte +#define STOPBITS_678_2 0x04 // 2 stop bits for 6-8 bit byte +#define USA_PARITY_NONE 0x00 +#define USA_PARITY_ODD 0x08 +#define USA_PARITY_EVEN 0x18 +#define PARITY_MARK_1 0x28 // force parity MARK +#define PARITY_SPACE_0 0x38 // force parity SPACE + +#define TXFLOW_CTS 0x04 +#define TXFLOW_DSR 0x08 +#define TXFLOW_XOFF 0x01 +#define TXFLOW_XOFF_ANY 0x02 +#define TXFLOW_XOFF_BITS (TXFLOW_XOFF | TXFLOW_XOFF_ANY) + +#define RXFLOW_XOFF 0x10 +#define RXFLOW_RTS 0x20 +#define RXFLOW_DTR 0x40 +#define RXFLOW_DSR_SENSITIVITY 0x80 + +#define RXMODE_BYHAND 0x00 +#define RXMODE_DMA 0x02 + +#define TXMODE_BYHAND 0x00 +#define TXMODE_DMA 0x02 + + +// all things called "StatusMessage" are sent on the status endpoint + +struct keyspan_usa90_portStatusMessage +{ + u8 msr, // reports the actual MSR register + cts, // reports CTS pin + dcd, // reports DCD pin + dsr, // reports DSR pin + ri, // reports RI pin + _txXoff, // port is in XOFF state (we received XOFF) + rxBreak, // reports break state + rxOverrun, // count of overrun errors (since last reported) + rxParity, // count of parity errors (since last reported) + rxFrame, // count of frame errors (since last reported) + portState, // PORTSTATE_xxx bits (useful for debugging) + messageAck, // message acknowledgement + charAck, // character acknowledgement + controlResponse; // (value = returnStatus) a control message has been processed +}; + +// bits in RX data message when STAT byte is included + +#define RXERROR_OVERRUN 0x02 +#define RXERROR_PARITY 0x04 +#define RXERROR_FRAMING 0x08 +#define RXERROR_BREAK 0x10 + +#define PORTSTATE_ENABLED 0x80 +#define PORTSTATE_TXFLUSH 0x01 +#define PORTSTATE_TXBREAK 0x02 +#define PORTSTATE_LOOPBACK 0x04 + +// MSR bits + +#define MSR_dCTS 0x01 // CTS has changed since last report +#define MSR_dDSR 0x02 +#define MSR_dRI 0x04 +#define MSR_dDCD 0x08 + +#define MSR_CTS 0x10 // current state of CTS +#define MSR_DSR 0x20 +#define MSR_RI 0x40 +#define MSR_DCD 0x80 + +// ie: the maximum length of an endpoint buffer +#define MAX_DATA_LEN 64 + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/pl2303.c linux-2.4.23-pre8/drivers/usb/serial/pl2303.c --- linux-2.4.22/drivers/usb/serial/pl2303.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/pl2303.c 2003-10-22 22:48:53.000000000 +0000 @@ -59,7 +59,7 @@ /* * Version Information */ -#define DRIVER_VERSION "v0.9" +#define DRIVER_VERSION "v0.10" #define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver" @@ -76,6 +76,7 @@ { USB_DEVICE(TRIPP_VENDOR_ID, TRIPP_PRODUCT_ID) }, { USB_DEVICE(RADIOSHACK_VENDOR_ID, RADIOSHACK_PRODUCT_ID) }, { USB_DEVICE(DCU10_VENDOR_ID, DCU10_PRODUCT_ID) }, + { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) }, { } /* Terminating entry */ }; @@ -153,7 +154,8 @@ .shutdown = pl2303_shutdown, }; -struct pl2303_private { +struct pl2303_private { + spinlock_t lock; u8 line_control; u8 line_status; u8 termios_initialized; @@ -170,7 +172,8 @@ if (!priv) return -ENOMEM; memset (priv, 0x00, sizeof (struct pl2303_private)); - serial->port[i].private = priv; + spin_lock_init(&priv->lock); + usb_set_serial_port_data(&serial->port[i], priv); } return 0; } @@ -223,25 +226,30 @@ static void pl2303_set_termios (struct usb_serial_port *port, struct termios *old_termios) { struct usb_serial *serial = port->serial; - struct pl2303_private *priv; + struct pl2303_private *priv = usb_get_serial_port_data(port); + unsigned long flags; unsigned int cflag; unsigned char *buf; int baud; int i; + u8 control; dbg("%s - port %d, initialized = %d", __FUNCTION__, port->number, - ((struct pl2303_private *) port->private)->termios_initialized); + priv->termios_initialized); if ((!port->tty) || (!port->tty->termios)) { dbg("%s - no tty structures", __FUNCTION__); return; } - if (!(((struct pl2303_private *) port->private)->termios_initialized)) { + spin_lock_irqsave(&priv->lock, flags); + if (!priv->termios_initialized) { *(port->tty->termios) = tty_std_termios; port->tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; - ((struct pl2303_private *) port->private)->termios_initialized = 1; + priv->termios_initialized = 1; } + spin_unlock_irqrestore(&priv->lock, flags); + cflag = port->tty->termios->c_cflag; /* check that they really want us to change something */ if (old_termios) { @@ -266,12 +274,6 @@ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); - i = usb_control_msg (serial->dev, usb_sndctrlpipe (serial->dev, 0), - VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE, - 0, 1, NULL, 0, 100); - - dbg ("0x40:1:0:1 %d", i); - if (cflag & CSIZE) { switch (cflag & CSIZE) { case CS5: buf[6] = 5; break; @@ -347,13 +349,19 @@ 0, 0, buf, 7, 100); dbg ("0x21:0x20:0:0 %d", i); - if (cflag && CBAUD) { - priv = port->private; - if ((cflag && CBAUD) == B0) - priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); - else - priv->line_control |= (CONTROL_DTR | CONTROL_RTS); - set_control_lines (serial->dev, priv->line_control); + /* change control lines if we are switching to or from B0 */ + spin_lock_irqsave(&priv->lock, flags); + control = priv->line_control; + if ((cflag & CBAUD) == B0) + priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); + else + priv->line_control |= (CONTROL_DTR | CONTROL_RTS); + if (control != priv->line_control) { + control = priv->line_control; + spin_unlock_irqrestore(&priv->lock, flags); + set_control_lines(serial->dev, control); + } else { + spin_unlock_irqrestore(&priv->lock, flags); } buf[0] = buf[1] = buf[2] = buf[3] = buf[4] = buf[5] = buf[6] = 0; @@ -387,6 +395,9 @@ dbg("%s - port %d", __FUNCTION__, port->number); + usb_clear_halt(serial->dev, port->write_urb->pipe); + usb_clear_halt(serial->dev, port->read_urb->pipe); + #define FISH(a,b,c,d) \ result=usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev,0), \ b, a, c, d, buf, 1, 100); \ @@ -405,9 +416,6 @@ SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0x0404, 1); FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8484, 0); FISH (VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, 0x8383, 0); - SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 0, 1); - SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 1, 0xc0); - SOUP (VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, 2, 4); /* Setup termios */ if (port->tty) { @@ -441,6 +449,7 @@ { struct usb_serial *serial; struct pl2303_private *priv; + unsigned long flags; unsigned int c_cflag; int result; @@ -457,10 +466,11 @@ c_cflag = port->tty->termios->c_cflag; if (c_cflag & HUPCL) { /* drop DTR and RTS */ - priv = port->private; + priv = usb_get_serial_port_data(port); + spin_lock_irqsave(&priv->lock, flags); priv->line_control = 0; - set_control_lines (port->serial->dev, - priv->line_control); + spin_unlock_irqrestore (&priv->lock, flags); + set_control_lines (port->serial->dev, 0); } } @@ -488,12 +498,15 @@ static int set_modem_info (struct usb_serial_port *port, unsigned int cmd, unsigned int *value) { - struct pl2303_private *priv = port->private; + struct pl2303_private *priv = usb_get_serial_port_data(port); + unsigned long flags; unsigned int arg; + u8 control; if (copy_from_user(&arg, value, sizeof(int))) return -EFAULT; + spin_lock_irqsave (&priv->lock, flags); switch (cmd) { case TIOCMBIS: if (arg & TIOCM_RTS) @@ -517,21 +530,31 @@ priv->line_control |= ((arg & TIOCM_DTR) ? CONTROL_DTR : 0); break; } + control = priv->line_control; + spin_unlock_irqrestore (&priv->lock, flags); - return set_control_lines (port->serial->dev, priv->line_control); + return set_control_lines (port->serial->dev, control); } static int get_modem_info (struct usb_serial_port *port, unsigned int *value) { - struct pl2303_private *priv = port->private; - unsigned int mcr = priv->line_control; - unsigned int status = priv->line_status; + struct pl2303_private *priv = usb_get_serial_port_data(port); + unsigned long flags; + unsigned int mcr; + unsigned int status; unsigned int result; + spin_lock_irqsave (&priv->lock, flags); + mcr = priv->line_control; + status = priv->line_status; + spin_unlock_irqrestore (&priv->lock, flags); + result = ((mcr & CONTROL_DTR) ? TIOCM_DTR : 0) | ((mcr & CONTROL_RTS) ? TIOCM_RTS : 0) | ((status & UART_CTS) ? TIOCM_CTS : 0) - | ((status & UART_DSR) ? TIOCM_DSR : 0); + | ((status & UART_DSR) ? TIOCM_DSR : 0) + | ((status & UART_RING) ? TIOCM_RI : 0) + | ((status & UART_DCD) ? TIOCM_CD : 0); dbg("%s - result = %x", __FUNCTION__, result); @@ -564,7 +587,6 @@ return -ENOIOCTLCMD; } - static void pl2303_break_ctl (struct usb_serial_port *port, int break_state) { struct usb_serial *serial = port->serial; @@ -593,8 +615,10 @@ dbg("%s", __FUNCTION__); - for (i = 0; i < serial->num_ports; ++i) - kfree (serial->port[i].private); + for (i = 0; i < serial->num_ports; ++i) { + kfree (usb_get_serial_port_data(&serial->port[i])); + usb_set_serial_port_data(&serial->port[i], NULL); + } } @@ -602,27 +626,42 @@ { struct usb_serial_port *port = (struct usb_serial_port *) urb->context; struct usb_serial *serial = get_usb_serial (port, __FUNCTION__); - struct pl2303_private *priv = port->private; + struct pl2303_private *priv = usb_get_serial_port_data(port); unsigned char *data = urb->transfer_buffer; + unsigned long flags; + + dbg("%s (%d)", __FUNCTION__, port->number); /* ints auto restart... */ - if (!serial) { + 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; } - if (urb->status) { - urb->status = 0; + if (!serial) { return; } usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, urb->transfer_buffer); - if (urb->actual_length > UART_STATE) + if (urb->actual_length < UART_STATE) return; /* Save off the uart status for others to look at */ + spin_lock_irqsave(&priv->lock, flags); priv->line_status = data[UART_STATE]; + spin_unlock_irqrestore(&priv->lock, flags); return; } @@ -632,9 +671,10 @@ { struct usb_serial_port *port = (struct usb_serial_port *) urb->context; struct usb_serial *serial = get_usb_serial (port, __FUNCTION__); - struct pl2303_private *priv = port->private; + struct pl2303_private *priv = usb_get_serial_port_data(port); struct tty_struct *tty; unsigned char *data = urb->transfer_buffer; + unsigned long flags; int i; int result; u8 status; @@ -674,7 +714,10 @@ /* get tty_flag from status */ tty_flag = TTY_NORMAL; + + spin_lock_irqsave(&priv->lock, flags); status = priv->line_status; + spin_unlock_irqrestore(&priv->lock, flags); /* break takes precedence over parity, */ /* which takes precedence over framing errors */ @@ -749,9 +792,14 @@ static int __init pl2303_init (void) { - usb_serial_register (&pl2303_device); + int retval; + retval = usb_serial_register(&pl2303_device); + if (retval) + goto failed_usb_serial_register; info(DRIVER_DESC " " DRIVER_VERSION); return 0; +failed_usb_serial_register: + return retval; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/pl2303.h linux-2.4.23-pre8/drivers/usb/serial/pl2303.h --- linux-2.4.22/drivers/usb/serial/pl2303.h 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/pl2303.h 2003-10-22 22:49:00.000000000 +0000 @@ -37,3 +37,6 @@ #define DCU10_VENDOR_ID 0x0731 #define DCU10_PRODUCT_ID 0x0528 + +#define SITECOM_VENDOR_ID 0x6189 +#define SITECOM_PRODUCT_ID 0x2068 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/usb-serial.h linux-2.4.23-pre8/drivers/usb/serial/usb-serial.h --- linux-2.4.22/drivers/usb/serial/usb-serial.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/usb-serial.h 2003-10-22 22:49:58.000000000 +0000 @@ -1,7 +1,7 @@ /* * USB Serial Converter driver * - * Copyright (C) 1999 - 2002 + * Copyright (C) 1999 - 2003 * Greg Kroah-Hartman (greg@kroah.com) * * This program is free software; you can redistribute it and/or modify @@ -67,7 +67,7 @@ * usb_serial_port: structure for the specific ports of a device. * @magic: magic number for internal validity of this pointer. * @serial: pointer back to the struct usb_serial owner of this port. - * @tty: pointer to the coresponding tty for this port. + * @tty: pointer to the corresponding tty for this port. * @number: the number of the port (the minor number). * @interrupt_in_buffer: pointer to the interrupt in buffer for this port. * @interrupt_in_urb: pointer to the interrupt in struct urb for this port. @@ -118,6 +118,16 @@ struct semaphore sem; void * private; }; +/* get and set the port private data pointer helper functions */ +static inline void *usb_get_serial_port_data (struct usb_serial_port *port) +{ + return port->private; +} + +static inline void usb_set_serial_port_data (struct usb_serial_port *port, void *data) +{ + port->private = data; +} /** * usb_serial - structure used by the usb-serial core for a device @@ -156,6 +166,16 @@ #define NUM_DONT_CARE (-1) +/* get and set the serial private data pointer helper functions */ +static inline void *usb_get_serial_data (struct usb_serial *serial) +{ + return serial->private; +} + +static inline void usb_set_serial_data (struct usb_serial *serial, void *data) +{ + serial->private = data; +} /** * usb_serial_device_type - a structure that defines a usb serial device @@ -292,7 +312,7 @@ if (!port || port_paranoia_check (port, function) || serial_paranoia_check (port->serial, function)) { - /* then say that we dont have a valid usb_serial thing, which will + /* then say that we don't have a valid usb_serial thing, which will * end up genrating -ENODEV return values */ return NULL; } @@ -318,7 +338,7 @@ /* Use our own dbg macro */ #undef dbg -#define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); } while (0) +#define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG "%s: " format "\n" , __FILE__ , ## arg); } while (0) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/usbserial.c linux-2.4.23-pre8/drivers/usb/serial/usbserial.c --- linux-2.4.22/drivers/usb/serial/usbserial.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/usbserial.c 2003-10-22 22:48:38.000000000 +0000 @@ -2,8 +2,8 @@ * USB Serial Converter driver * * Copyright (C) 1999 - 2002 Greg Kroah-Hartman (greg@kroah.com) - * Copyright (c) 2000 Peter Berger (pberger@brimson.com) - * Copyright (c) 2000 Al Borchers (borchers@steinerpoint.com) + * Copyright (C) 2000 Peter Berger (pberger@brimson.com) + * Copyright (C) 2000 Al Borchers (borchers@steinerpoint.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version @@ -556,7 +556,10 @@ else generic_close(port, filp); port->open_count = 0; - port->tty = NULL; + if (port->tty) { + port->tty->driver_data = NULL; + port->tty = NULL; + } } if (port->serial->type->owner) @@ -1401,12 +1404,9 @@ for (i = 0; i < serial->num_ports; ++i) { port = &serial->port[i]; down (&port->sem); - if (port->tty != NULL) { - while (port->open_count > 0) { + if (port->tty != NULL) + while (port->open_count > 0) __serial_close(port, NULL); - } - port->tty->driver_data = NULL; - } up (&port->sem); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/visor.c linux-2.4.23-pre8/drivers/usb/serial/visor.c --- linux-2.4.22/drivers/usb/serial/visor.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/visor.c 2003-10-22 22:48:23.000000000 +0000 @@ -211,6 +211,7 @@ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID) }, { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID) }, + { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID) }, { } /* Terminating entry */ }; @@ -239,6 +240,7 @@ { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NX60_ID) }, { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_NZ90V_ID) }, { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID) }, + { USB_DEVICE(GARMIN_VENDOR_ID, GARMIN_IQUE_3600_ID) }, { } /* Terminating entry */ }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/visor.h linux-2.4.23-pre8/drivers/usb/serial/visor.h --- linux-2.4.22/drivers/usb/serial/visor.h 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/visor.h 2003-10-22 22:48:20.000000000 +0000 @@ -44,6 +44,9 @@ #define SAMSUNG_VENDOR_ID 0x04E8 #define SAMSUNG_SCH_I330_ID 0x8001 +#define GARMIN_VENDOR_ID 0x091E +#define GARMIN_IQUE_3600_ID 0x0004 + /**************************************************************************** * Handspring Visor Vendor specific request codes (bRequest values) * A big thank you to Handspring for providing the following information. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/serial/xircom_pgs_fw.h linux-2.4.23-pre8/drivers/usb/serial/xircom_pgs_fw.h --- linux-2.4.22/drivers/usb/serial/xircom_pgs_fw.h 2001-10-01 20:45:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/serial/xircom_pgs_fw.h 2003-10-22 22:47:59.000000000 +0000 @@ -1,8 +1,8 @@ /* * USB Xircom PGS Firmware * - * Copyright (c) 1999, 2000 Brian Warner - * Copyright (c) 2001 Cristian M. Craciunescu + * Copyright (C) 1999, 2000 Brian Warner + * Copyright (C) 2001 Cristian M. Craciunescu * * 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 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/speedtch.c linux-2.4.23-pre8/drivers/usb/speedtch.c --- linux-2.4.22/drivers/usb/speedtch.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/speedtch.c 2003-10-22 22:48:28.000000000 +0000 @@ -21,7 +21,9 @@ ******************************************************************************/ /* - * Written by Johan Verrept, maintained by Duncan Sands (duncan.sands@wanadoo.fr) + * Written by Johan Verrept, maintained by Duncan Sands (duncan.sands@free.fr) + * + * 1.7+: - See the check-in logs * * 1.6: - No longer opens a connection if the firmware is not loaded * - Added support for the speedtouch 330 @@ -83,6 +85,11 @@ #include +#ifdef DEBUG +#define DEBUG_ON(x) BUG_ON(x) +#else +#define DEBUG_ON(x) do { if (x); } while (0) +#endif #ifdef VERBOSE_DEBUG static int udsl_print_packet (const unsigned char *data, int len); @@ -93,9 +100,9 @@ #define vdbg(arg...) #endif -#define DRIVER_AUTHOR "Johan Verrept, Duncan Sands " +#define DRIVER_AUTHOR "Johan Verrept, Duncan Sands " #define DRIVER_DESC "Alcatel SpeedTouch USB driver" -#define DRIVER_VERSION "1.6" +#define DRIVER_VERSION "1.7" static const char udsl_driver_name [] = "speedtch"; @@ -181,8 +188,7 @@ struct atm_vcc *vcc; /* raw cell reassembly */ - struct sk_buff *skb; - unsigned int max_pdu; + struct sk_buff *sarb; }; /* send */ @@ -306,12 +312,10 @@ { struct udsl_vcc_data *cached_vcc = NULL; struct atm_vcc *vcc; - struct sk_buff *skb; + struct sk_buff *sarb; struct udsl_vcc_data *vcc_data; int cached_vci = 0; unsigned int i; - unsigned int length; - unsigned int pdu_length; int pti; int vci; short cached_vpi = 0; @@ -336,74 +340,73 @@ } vcc = vcc_data->vcc; + sarb = vcc_data->sarb; - if (!vcc_data->skb && !(vcc_data->skb = dev_alloc_skb (vcc_data->max_pdu))) { - dbg ("udsl_extract_cells: no memory for skb (vcc: 0x%p)!", vcc); - if (pti) - atomic_inc (&vcc->stats->rx_err); - continue; - } - - skb = vcc_data->skb; - - if (skb->len + ATM_CELL_PAYLOAD > vcc_data->max_pdu) { - dbg ("udsl_extract_cells: buffer overrun (max_pdu: %u, skb->len %u, vcc: 0x%p)", vcc_data->max_pdu, skb->len, vcc); + if (sarb->tail + ATM_CELL_PAYLOAD > sarb->end) { + dbg ("udsl_extract_cells: buffer overrun (sarb->len %u, vcc: 0x%p)!", sarb->len, vcc); /* discard cells already received */ - skb_trim (skb, 0); - BUG_ON (vcc_data->max_pdu < ATM_CELL_PAYLOAD); + skb_trim (sarb, 0); } - memcpy (skb->tail, source + ATM_CELL_HEADER, ATM_CELL_PAYLOAD); - __skb_put (skb, ATM_CELL_PAYLOAD); + memcpy (sarb->tail, source + ATM_CELL_HEADER, ATM_CELL_PAYLOAD); + __skb_put (sarb, ATM_CELL_PAYLOAD); if (pti) { + struct sk_buff *skb; + unsigned int length; + unsigned int pdu_length; + length = (source [ATM_CELL_SIZE - 6] << 8) + source [ATM_CELL_SIZE - 5]; /* guard against overflow */ if (length > ATM_MAX_AAL5_PDU) { - dbg ("udsl_extract_cells: bogus length %u (vcc: 0x%p)", length, vcc); - goto drop; + dbg ("udsl_extract_cells: bogus length %u (vcc: 0x%p)!", length, vcc); + atomic_inc (&vcc->stats->rx_err); + goto out; } pdu_length = UDSL_NUM_CELLS (length) * ATM_CELL_PAYLOAD; - if (skb->len < pdu_length) { - dbg ("udsl_extract_cells: bogus pdu_length %u (skb->len: %u, vcc: 0x%p)", pdu_length, skb->len, vcc); - goto drop; + if (sarb->len < pdu_length) { + dbg ("udsl_extract_cells: bogus pdu_length %u (sarb->len: %u, vcc: 0x%p)!", pdu_length, sarb->len, vcc); + atomic_inc (&vcc->stats->rx_err); + goto out; } - if (crc32_be (~0, skb->tail - pdu_length, pdu_length) != 0xc704dd7b) { - dbg ("udsl_extract_cells: packet failed crc check (vcc: 0x%p)", vcc); - goto drop; + if (crc32_be (~0, sarb->tail - pdu_length, pdu_length) != 0xc704dd7b) { + dbg ("udsl_extract_cells: packet failed crc check (vcc: 0x%p)!", vcc); + atomic_inc (&vcc->stats->rx_err); + goto out; } - if (!atm_charge (vcc, skb->truesize)) { - dbg ("udsl_extract_cells: failed atm_charge (skb->truesize: %u)", skb->truesize); - goto drop_no_stats; /* atm_charge increments rx_drop */ - } + vdbg ("udsl_extract_cells: got packet (length: %u, pdu_length: %u, vcc: 0x%p)", length, pdu_length, vcc); - /* now that we are sure to send the skb, it is ok to change skb->data */ - if (skb->len > pdu_length) - skb_pull (skb, skb->len - pdu_length); /* discard initial junk */ + if (!(skb = dev_alloc_skb (length))) { + dbg ("udsl_extract_cells: no memory for skb (length: %u)!", length); + atomic_inc (&vcc->stats->rx_drop); + goto out; + } - skb_trim (skb, length); /* drop zero padding and trailer */ + vdbg ("udsl_extract_cells: allocated new sk_buff (skb: 0x%p, skb->truesize: %u)", skb, skb->truesize); - atomic_inc (&vcc->stats->rx); + if (!atm_charge (vcc, skb->truesize)) { + dbg ("udsl_extract_cells: failed atm_charge (skb->truesize: %u)!", skb->truesize); + dev_kfree_skb (skb); + goto out; /* atm_charge increments rx_drop */ + } - PACKETDEBUG (skb->data, skb->len); + memcpy (skb->data, sarb->tail - pdu_length, length); + __skb_put (skb, length); vdbg ("udsl_extract_cells: sending skb 0x%p, skb->len %u, skb->truesize %u", skb, skb->len, skb->truesize); - vcc->push (vcc, skb); - - vcc_data->skb = NULL; + PACKETDEBUG (skb->data, skb->len); - continue; + vcc->push (vcc, skb); -drop: - atomic_inc (&vcc->stats->rx_err); -drop_no_stats: - skb_trim (skb, 0); + atomic_inc (&vcc->stats->rx); +out: + skb_trim (sarb, 0); } } } @@ -497,7 +500,7 @@ memset (target, 0, ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER); target += ATM_CELL_PAYLOAD - ATM_AAL5_TRAILER; - BUG_ON (--ctrl->num_cells); + DEBUG_ON (--ctrl->num_cells); } memcpy (target, ctrl->aal5_trailer, ATM_AAL5_TRAILER); @@ -534,7 +537,7 @@ vdbg ("udsl_complete_receive: urb 0x%p, status %d, actual_length %d, filled_cells %u, rcv 0x%p, buf 0x%p", urb, urb->status, urb->actual_length, buf->filled_cells, rcv, buf); - BUG_ON (buf->filled_cells > rcv_buf_size); + DEBUG_ON (buf->filled_cells > rcv_buf_size); /* may not be in_interrupt() */ spin_lock_irqsave (&instance->receive_lock, flags); @@ -865,6 +868,7 @@ { struct udsl_instance_data *instance = vcc->dev->dev_data; struct udsl_vcc_data *new; + unsigned int max_pdu; dbg ("udsl_atm_open: vpi %hd, vci %d", vpi, vci); @@ -877,8 +881,10 @@ return -EINVAL; /* only support AAL5 */ - if ((vcc->qos.aal != ATM_AAL5) || (vcc->qos.rxtp.max_sdu < 0) || (vcc->qos.rxtp.max_sdu > ATM_MAX_AAL5_PDU)) + if ((vcc->qos.aal != ATM_AAL5) || (vcc->qos.rxtp.max_sdu < 0) || (vcc->qos.rxtp.max_sdu > ATM_MAX_AAL5_PDU)) { + dbg ("udsl_atm_open: unsupported ATM type %d!", vcc->qos.aal); return -EINVAL; + } if (!instance->firmware_loaded) { dbg ("udsl_atm_open: firmware not loaded!"); @@ -888,11 +894,13 @@ down (&instance->serialize); /* vs self, udsl_atm_close */ if (udsl_find_vcc (instance, vpi, vci)) { + dbg ("udsl_atm_open: %hd/%d already in use!", vpi, vci); up (&instance->serialize); return -EADDRINUSE; } if (!(new = kmalloc (sizeof (struct udsl_vcc_data), GFP_KERNEL))) { + dbg ("udsl_atm_open: no memory for vcc_data!"); up (&instance->serialize); return -ENOMEM; } @@ -901,7 +909,15 @@ new->vcc = vcc; new->vpi = vpi; new->vci = vci; - new->max_pdu = max (1, UDSL_NUM_CELLS (vcc->qos.rxtp.max_sdu)) * ATM_CELL_PAYLOAD; + + /* udsl_extract_cells requires at least one cell */ + max_pdu = max (1, UDSL_NUM_CELLS (vcc->qos.rxtp.max_sdu)) * ATM_CELL_PAYLOAD; + if (!(new->sarb = alloc_skb (max_pdu, GFP_KERNEL))) { + dbg ("udsl_atm_open: no memory for SAR buffer!"); + kfree (new); + up (&instance->serialize); + return -ENOMEM; + } vcc->dev_data = new; vcc->vpi = vpi; @@ -919,7 +935,7 @@ tasklet_schedule (&instance->receive_tasklet); - dbg ("udsl_atm_open: allocated vcc data 0x%p (max_pdu: %u)", new, new->max_pdu); + dbg ("udsl_atm_open: allocated vcc data 0x%p (max_pdu: %u)", new, max_pdu); return 0; } @@ -946,9 +962,8 @@ list_del (&vcc_data->list); tasklet_enable (&instance->receive_tasklet); - if (vcc_data->skb) - dev_kfree_skb (vcc_data->skb); - vcc_data->skb = NULL; + kfree_skb (vcc_data->sarb); + vcc_data->sarb = NULL; kfree (vcc_data); vcc->dev_data = NULL; @@ -1205,15 +1220,14 @@ for (i = 0; i < num_rcv_urbs; i++) if ((result = usb_unlink_urb (instance->receivers [i].urb)) < 0) - dbg ("udsl_usb_disconnect: usb_unlink_urb on receive urb %d returned %d", i, result); + dbg ("udsl_usb_disconnect: usb_unlink_urb on receive urb %d returned %d!", i, result); /* wait for completion handlers to finish */ do { count = 0; spin_lock_irq (&instance->receive_lock); list_for_each (pos, &instance->spare_receivers) - if (++count > num_rcv_urbs) - panic (__FILE__ ": memory corruption detected at line %d!\n", __LINE__); + DEBUG_ON (++count > num_rcv_urbs); spin_unlock_irq (&instance->receive_lock); dbg ("udsl_usb_disconnect: found %u spare receivers", count); @@ -1242,15 +1256,14 @@ for (i = 0; i < num_snd_urbs; i++) if ((result = usb_unlink_urb (instance->senders [i].urb)) < 0) - dbg ("udsl_usb_disconnect: usb_unlink_urb on send urb %d returned %d", i, result); + dbg ("udsl_usb_disconnect: usb_unlink_urb on send urb %d returned %d!", i, result); /* wait for completion handlers to finish */ do { count = 0; spin_lock_irq (&instance->send_lock); list_for_each (pos, &instance->spare_senders) - if (++count > num_snd_urbs) - panic (__FILE__ ": memory corruption detected at line %d!\n", __LINE__); + DEBUG_ON (++count > num_snd_urbs); spin_unlock_irq (&instance->send_lock); dbg ("udsl_usb_disconnect: found %u spare senders", count); @@ -1289,11 +1302,9 @@ static int __init udsl_usb_init (void) { - struct sk_buff *skb; /* dummy for sizeof */ - dbg ("udsl_usb_init: driver version " DRIVER_VERSION); - if (sizeof (struct udsl_control) > sizeof (skb->cb)) { + if (sizeof (struct udsl_control) > sizeof (((struct sk_buff *)0)->cb)) { printk (KERN_ERR __FILE__ ": unusable with this kernel!\n"); return -EIO; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/storage/protocol.c linux-2.4.23-pre8/drivers/usb/storage/protocol.c --- linux-2.4.22/drivers/usb/storage/protocol.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/storage/protocol.c 2003-10-22 22:47:29.000000000 +0000 @@ -237,6 +237,10 @@ * a unsigned char cmnd[12], so we know we have storage available */ + /* Pad the ATAPI command with zeros */ + for (; srb->cmd_len<12; srb->cmd_len++) + srb->cmnd[srb->cmd_len] = 0; + /* set command length to 12 bytes (this affects the transport layer) */ srb->cmd_len = 12; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/storage/unusual_devs.h linux-2.4.23-pre8/drivers/usb/storage/unusual_devs.h --- linux-2.4.22/drivers/usb/storage/unusual_devs.h 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/storage/unusual_devs.h 2003-10-22 22:49:16.000000000 +0000 @@ -119,7 +119,7 @@ UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210, "Fujifilm", "FinePix 1400Zoom", - US_SC_8070, US_PR_CBI, NULL, US_FL_FIX_INQUIRY), + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY), /* Reported by Peter Wächtler * The device needs the flags only. @@ -236,7 +236,7 @@ UNUSUAL_DEV( 0x054c, 0x0010, 0x0106, 0x0450, "Sony", "DSC-S30/S70/S75/505V/F505/F707/F717/P8", - US_SC_SCSI, US_PR_CB, NULL, + US_SC_SCSI, US_PR_DEVICE, NULL, US_FL_SINGLE_LUN | US_FL_MODE_XLATE ), /* Reported by wim@geeks.nl */ @@ -264,7 +264,7 @@ UNUSUAL_DEV( 0x054c, 0x002e, 0x0106, 0x0310, "Sony", "Handycam", - US_SC_SCSI, US_PR_CB, NULL, + US_SC_SCSI, US_PR_DEVICE, NULL, US_FL_SINGLE_LUN | US_FL_MODE_XLATE), UNUSUAL_DEV( 0x054c, 0x0032, 0x0000, 0x9999, @@ -289,7 +289,7 @@ UNUSUAL_DEV( 0x057b, 0x0000, 0x0000, 0x0299, "Y-E Data", "Flashbuster-U", - US_SC_UFI, US_PR_CB, NULL, + US_SC_DEVICE, US_PR_CB, NULL, US_FL_SINGLE_LUN), UNUSUAL_DEV( 0x057b, 0x0000, 0x0300, 0x9999, @@ -388,6 +388,18 @@ US_FL_SINGLE_LUN ), #endif +/* Submitted by Benny Sjostrand */ +UNUSUAL_DEV( 0x0686, 0x4011, 0x0001, 0x0001, + "Minolta", + "Dimage F300", + US_SC_SCSI, US_PR_BULK, NULL, 0 ), + +/* Reported by Miguel A. Fosas */ +UNUSUAL_DEV( 0x0686, 0x4017, 0x0001, 0x0001, + "Minolta", + "DIMAGE E223", + US_SC_SCSI, US_PR_DEVICE, NULL, 0 ), + UNUSUAL_DEV( 0x0693, 0x0002, 0x0100, 0x0100, "Hagiwara", "FlashGate SmartMedia", @@ -407,7 +419,7 @@ UNUSUAL_DEV( 0x0781, 0x0002, 0x0009, 0x0009, "Sandisk", "ImageMate SDDR-31", - US_SC_SCSI, US_PR_BULK, NULL, + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_IGNORE_SER ), UNUSUAL_DEV( 0x0781, 0x0100, 0x0100, 0x0100, @@ -536,7 +548,7 @@ * - They don't like the INQUIRY command. So we must handle this command * of the SCSI layer ourselves. */ -UNUSUAL_DEV( 0x07cf, 0x1001, 0x1000, 0x9009, +UNUSUAL_DEV( 0x07cf, 0x1001, 0x1000, 0x5009, "Casio", "QV DigitalCamera", US_SC_8070, US_PR_CB, NULL, @@ -555,7 +567,7 @@ UNUSUAL_DEV( 0x08ca, 0x2011, 0x0000, 0x9999, "AIPTEK", "PocketCAM 3Mega", - US_SC_SCSI, US_PR_BULK, NULL, + US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_MODE_XLATE ), /* aeb */ @@ -605,6 +617,20 @@ 0 ), #endif +/* Submitted by Antoine Mairesse */ +UNUSUAL_DEV( 0x0ed1, 0x6660, 0x0100, 0x0300, + "USB", + "Solid state disk", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY ), + +/* Submitted by Joris Struyve */ +UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff, + "Medion", + "MD 7425", + US_SC_DEVICE, US_PR_DEVICE, NULL, + US_FL_FIX_INQUIRY), + /* Reported by Kevin Cernekee * Tested on hardware version 1.10. * Entry is needed only for the initializer function override. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/stv680.c linux-2.4.23-pre8/drivers/usb/stv680.c --- linux-2.4.22/drivers/usb/stv680.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/stv680.c 2003-10-22 22:48:00.000000000 +0000 @@ -1243,7 +1243,6 @@ PDEBUG (2, "STV(e): VIDIOCSPICT failed"); return -EFAULT; } - copy_from_user (&p, arg, sizeof (p)); PDEBUG (2, "STV(i): palette set to %i in VIDIOSPICT", p.palette); if (stv680_set_pict (stv680, &p)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/usb-skeleton.c linux-2.4.23-pre8/drivers/usb/usb-skeleton.c --- linux-2.4.22/drivers/usb/usb-skeleton.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/usb-skeleton.c 2003-10-22 22:48:53.000000000 +0000 @@ -1,7 +1,7 @@ /* * USB Skeleton driver - 0.7 * - * Copyright (c) 2001 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/usb.c linux-2.4.23-pre8/drivers/usb/usb.c --- linux-2.4.22/drivers/usb/usb.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/usb.c 2003-10-22 22:48:57.000000000 +0000 @@ -195,6 +195,17 @@ up (&usb_bus_list_lock); } +int usb_ifnum_to_ifpos(struct usb_device *dev, unsigned ifnum) +{ + int i; + + for (i = 0; i < dev->actconfig->bNumInterfaces; i++) + if (dev->actconfig->interface[i].altsetting[0].bInterfaceNumber == ifnum) + return i; + + return -EINVAL; +} + struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum) { int i; @@ -759,6 +770,23 @@ return -1; } +/* + * This simply converts the interface _number_ (as in interface.bInterfaceNumber) and + * converts it to the interface _position_ (as in dev->actconfig->interface + position) + * and calls usb_find_interface_driver(). + * + * Note that the number is the same as the position for all interfaces _except_ + * devices with interfaces not sequentially numbered (e.g., 0, 2, 3, etc). + */ +int usb_find_interface_driver_for_ifnum(struct usb_device *dev, unsigned ifnum) +{ + int ifpos = usb_ifnum_to_ifpos(dev, ifnum); + + if (0 > ifpos) + return -EINVAL; + + return usb_find_interface_driver(dev, ifpos); +} #ifdef CONFIG_HOTPLUG @@ -2384,6 +2412,7 @@ * into the kernel, and other device drivers are built as modules, * then these symbols need to be exported for the modules to use. */ +EXPORT_SYMBOL(usb_ifnum_to_ifpos); EXPORT_SYMBOL(usb_ifnum_to_if); EXPORT_SYMBOL(usb_epnum_to_ep_desc); @@ -2398,6 +2427,7 @@ EXPORT_SYMBOL(usb_free_dev); EXPORT_SYMBOL(usb_inc_dev_use); +EXPORT_SYMBOL(usb_find_interface_driver_for_ifnum); EXPORT_SYMBOL(usb_driver_claim_interface); EXPORT_SYMBOL(usb_interface_claimed); EXPORT_SYMBOL(usb_driver_release_interface); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/usbnet.c linux-2.4.23-pre8/drivers/usb/usbnet.c --- linux-2.4.22/drivers/usb/usbnet.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/usbnet.c 2003-10-22 22:47:29.000000000 +0000 @@ -133,6 +133,7 @@ #include #include #include +#include #include #include #include @@ -157,6 +158,7 @@ /* minidrivers _could_ be individually configured */ #define CONFIG_USB_AN2720 +#define CONFIG_USB_AX8817X #define CONFIG_USB_BELKIN #define CONFIG_USB_EPSON2888 #define CONFIG_USB_GENESYS @@ -227,6 +229,7 @@ struct net_device net; struct net_device_stats stats; int msg_level; + struct mii_if_info mii; #ifdef CONFIG_USB_NET1080 u16 packet_id; @@ -254,6 +257,10 @@ #define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */ #define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */ #define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */ +#define FLAG_ETHER 0x0020 /* maybe use "eth%d" names */ + + /* init device ... can sleep, or cause probe() failure */ + int (*bind)(struct usbnet *, struct usb_device *); /* reset device ... can sleep */ int (*reset)(struct usbnet *); @@ -275,6 +282,8 @@ int in; /* rx endpoint */ int out; /* tx endpoint */ int epsize; + + unsigned long data; /* Misc driver specific data */ }; // we record the state for each of our queued skbs @@ -305,6 +314,8 @@ #define RUN_CONTEXT (in_irq () ? "in_irq" \ : (in_interrupt () ? "in_interrupt" : "can sleep")) +static struct ethtool_ops usbnet_ethtool_ops; + /* mostly for PDA style devices, which are always present */ static int always_connected (struct usbnet *dev) { @@ -405,6 +416,306 @@ #endif /* CONFIG_USB_AN2720 */ + +#ifdef CONFIG_USB_AX8817X +/* ASIX AX8817X based USB 2.0 Ethernet Devices */ + +#define HAVE_HARDWARE +#define NEED_MII + +#include + +#define AX_CMD_SET_SW_MII 0x06 +#define AX_CMD_READ_MII_REG 0x07 +#define AX_CMD_WRITE_MII_REG 0x08 +#define AX_CMD_SET_HW_MII 0x0a +#define AX_CMD_WRITE_RX_CTL 0x10 +#define AX_CMD_READ_IPG012 0x11 +#define AX_CMD_WRITE_IPG0 0x12 +#define AX_CMD_WRITE_IPG1 0x13 +#define AX_CMD_WRITE_IPG2 0x14 +#define AX_CMD_WRITE_MULTI_FILTER 0x16 +#define AX_CMD_READ_NODE_ID 0x17 +#define AX_CMD_READ_PHY_ID 0x19 +#define AX_CMD_WRITE_MEDIUM_MODE 0x1b +#define AX_CMD_WRITE_GPIOS 0x1f + +#define AX_MCAST_FILTER_SIZE 8 +#define AX_MAX_MCAST 64 + +static int ax8817x_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + return usb_control_msg( + dev->udev, + usb_rcvctrlpipe(dev->udev, 0), + cmd, + USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + value, + index, + data, + size, + CONTROL_TIMEOUT_JIFFIES); +} + +static int ax8817x_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + return usb_control_msg( + dev->udev, + usb_sndctrlpipe(dev->udev, 0), + cmd, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + value, + index, + data, + size, + CONTROL_TIMEOUT_JIFFIES); +} + +static void ax8817x_async_cmd_callback(struct urb *urb) +{ + struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context; + + if (urb->status < 0) + printk(KERN_DEBUG "ax8817x_async_cmd_callback() failed with %d", + urb->status); + + kfree(req); + usb_free_urb(urb); +} + +static void ax8817x_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, + u16 size, void *data) +{ + struct usb_ctrlrequest *req; + int status; + struct urb *urb; + + if ((urb = ALLOC_URB(0, GFP_ATOMIC)) == NULL) { + devdbg(dev, "Error allocating URB in write_cmd_async!"); + return; + } + + if ((req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC)) == NULL) { + devdbg(dev, "Failed to allocate memory for control request"); + usb_free_urb(urb); + return; + } + + req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; + req->bRequest = cmd; + req->wValue = cpu_to_le16(value); + req->wIndex = cpu_to_le16(index); + req->wLength = cpu_to_le16(size); + + usb_fill_control_urb(urb, dev->udev, + usb_sndctrlpipe(dev->udev, 0), + (void *)req, data, size, + ax8817x_async_cmd_callback, req); + + if((status = SUBMIT_URB(urb, GFP_ATOMIC)) < 0) + devdbg(dev, "Error submitting the control message: status=%d", status); +} + +static void ax8817x_set_multicast(struct net_device *net) +{ + struct usbnet *dev = (struct usbnet *) net->priv; + u8 rx_ctl = 0x8c; + + if (net->flags & IFF_PROMISC) { + rx_ctl |= 0x01; + } else if (net->flags & IFF_ALLMULTI + || net->mc_count > AX_MAX_MCAST) { + rx_ctl |= 0x02; + } else if (net->mc_count == 0) { + /* just broadcast and directed */ + } else { + struct dev_mc_list *mc_list = net->mc_list; + u8 *multi_filter; + u32 crc_bits; + int i; + + multi_filter = kmalloc(AX_MCAST_FILTER_SIZE, GFP_ATOMIC); + if (multi_filter == NULL) { + /* Oops, couldn't allocate a buffer for setting the multicast + filter. Try all multi mode. */ + rx_ctl |= 0x02; + } else { + memset(multi_filter, 0, AX_MCAST_FILTER_SIZE); + + /* Build the multicast hash filter. */ + for (i = 0; i < net->mc_count; i++) { + crc_bits = + ether_crc(ETH_ALEN, + mc_list->dmi_addr) >> 26; + multi_filter[crc_bits >> 3] |= + 1 << (crc_bits & 7); + mc_list = mc_list->next; + } + + ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, + AX_MCAST_FILTER_SIZE, multi_filter); + + rx_ctl |= 0x10; + } + } + + ax8817x_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); +} + +static int ax8817x_mdio_read(struct net_device *netdev, int phy_id, int loc) +{ + struct usbnet *dev = netdev->priv; + u16 res; + u8 buf[4]; + + ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); + ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res); + ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); + + return res & 0xffff; +} + +static void ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) +{ + struct usbnet *dev = netdev->priv; + u16 res = val; + u8 buf[4]; + + ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); + ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res); + ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); +} + +static int ax8817x_bind(struct usbnet *dev, struct usb_device *intf) +{ + int ret; + u8 buf[6]; + u16 *buf16 = (u16 *) buf; + int i; + unsigned long gpio_bits = dev->driver_info->data; + + dev->in = usb_rcvbulkpipe(dev->udev, 3); + dev->out = usb_sndbulkpipe(dev->udev, 2); + + /* Toggle the GPIOs in a manufacturer/model specific way */ + for (i = 2; i >= 0; i--) { + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, + (gpio_bits >> (i * 8)) & 0xff, 0, 0, + buf)) < 0) + return ret; + wait_ms(5); + } + + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x80, 0, 0, buf)) < 0) { + dbg("send AX_CMD_WRITE_RX_CTL failed: %d", ret); + return ret; + } + + /* Get the MAC address */ + memset(buf, 0, ETH_ALEN); + if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, 6, buf)) < 0) { + dbg("read AX_CMD_READ_NODE_ID failed: %d", ret); + return ret; + } + memcpy(dev->net.dev_addr, buf, ETH_ALEN); + + /* Get IPG values */ + if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_IPG012, 0, 0, 3, buf)) < 0) { + dbg("Error reading IPG values: %d", ret); + return ret; + } + + for(i = 0;i < 3;i++) { + ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0 + i, 0, 0, 1, &buf[i]); + } + + /* Get the PHY id */ + if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 0) { + dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret); + return ret; + } else if (ret < 2) { + /* this should always return 2 bytes */ + dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", ret); + return -EIO; + } + + /* Initialize MII structure */ + dev->mii.dev = &dev->net; + dev->mii.mdio_read = ax8817x_mdio_read; + dev->mii.mdio_write = ax8817x_mdio_write; + dev->mii.phy_id_mask = 0x3f; + dev->mii.reg_num_mask = 0x1f; + dev->mii.phy_id = buf[1]; + + if ((ret = ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf)) < 0) { + dbg("Failed to go to software MII mode: %02x", ret); + return ret; + } + + *buf16 = cpu_to_le16(BMCR_RESET); + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, + dev->mii.phy_id, MII_BMCR, 2, buf16)) < 0) { + dbg("Failed to write MII reg - MII_BMCR: %02x", ret); + return ret; + } + + /* Advertise that we can do full-duplex pause */ + *buf16 = cpu_to_le16(ADVERTISE_ALL | ADVERTISE_CSMA | 0x0400); + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, + dev->mii.phy_id, MII_ADVERTISE, + 2, buf16)) < 0) { + dbg("Failed to write MII_REG advertisement: %02x", ret); + return ret; + } + + *buf16 = cpu_to_le16(BMCR_ANENABLE | BMCR_ANRESTART); + if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, + dev->mii.phy_id, MII_BMCR, + 2, buf16)) < 0) { + dbg("Failed to write MII reg autonegotiate: %02x", ret); + return ret; + } + + if ((ret = ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf)) < 0) { + dbg("Failed to set hardware MII: %02x", ret); + return ret; + } + + dev->net.set_multicast_list = ax8817x_set_multicast; + + return 0; +} + +static const struct driver_info ax8817x_info = { + .description = "ASIX AX8817x USB 2.0 Ethernet", + .bind = ax8817x_bind, + .flags = FLAG_ETHER, + .data = 0x00130103, +}; + +static const struct driver_info dlink_dub_e100_info = { + .description = "DLink DUB-E100 USB Ethernet", + .bind = ax8817x_bind, + .flags = FLAG_ETHER, + .data = 0x009f9d9f, +}; + +static const struct driver_info netgear_fa120_info = { + .description = "Netgear FA-120 USB Ethernet", + .bind = ax8817x_bind, + .flags = FLAG_ETHER, + .data = 0x00130103, +}; + +static const struct driver_info hawking_uf200_info = { + .description = "Hawking UF200 USB Ethernet", + .bind = ax8817x_bind, + .flags = FLAG_ETHER, + .data = 0x001f1d1f, +}; +#endif /* CONFIG_USB_AX8817X */ #ifdef CONFIG_USB_BELKIN @@ -1391,27 +1702,8 @@ }; /* PXA-2xx based */ -static const struct driver_info zaurus_sla300_info = { - .description = "Sharp Zaurus SL-A300", - .flags = FLAG_FRAMING_Z, - .check_connect = always_connected, - .tx_fixup = zaurus_tx_fixup, - - .in = 1, .out = 2, - .epsize = 64, -}; -static const struct driver_info zaurus_slb500_info = { - /* Japanese B500 ~= US SL-5600 */ - .description = "Sharp Zaurus SL-B500", - .flags = FLAG_FRAMING_Z, - .check_connect = always_connected, - .tx_fixup = zaurus_tx_fixup, - - .in = 1, .out = 2, - .epsize = 64, -}; -static const struct driver_info zaurus_slc700_info = { - .description = "Sharp Zaurus SL-C700", +static const struct driver_info zaurus_pxa_info = { + .description = "Sharp Zaurus, PXA-2xx based", .flags = FLAG_FRAMING_Z, .check_connect = always_connected, .tx_fixup = zaurus_tx_fixup, @@ -1798,74 +2090,56 @@ /*-------------------------------------------------------------------------*/ -static int usbnet_ethtool_ioctl (struct net_device *net, void *useraddr) +static void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info) { - struct usbnet *dev = (struct usbnet *) net->priv; - u32 cmd; + struct usbnet *dev = net->priv; - if (get_user (cmd, (u32 *)useraddr)) - return -EFAULT; - switch (cmd) { - - case ETHTOOL_GDRVINFO: { /* get driver info */ - struct ethtool_drvinfo info; - - memset (&info, 0, sizeof info); - info.cmd = ETHTOOL_GDRVINFO; - strncpy (info.driver, driver_name, sizeof info.driver); - strncpy (info.version, DRIVER_VERSION, sizeof info.version); - strncpy (info.fw_version, dev->driver_info->description, - sizeof info.fw_version); - usb_make_path (dev->udev, info.bus_info, sizeof info.bus_info); - if (copy_to_user (useraddr, &info, sizeof (info))) - return -EFAULT; - return 0; - } + strncpy (info->driver, driver_name, sizeof info->driver); + strncpy (info->version, DRIVER_VERSION, sizeof info->version); + strncpy (info->fw_version, dev->driver_info->description, + sizeof info->fw_version); + usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info); +} - case ETHTOOL_GLINK: /* get link status */ - if (dev->driver_info->check_connect) { - struct ethtool_value edata = { ETHTOOL_GLINK }; - - edata.data = dev->driver_info->check_connect (dev) == 0; - if (copy_to_user (useraddr, &edata, sizeof (edata))) - return -EFAULT; - return 0; - } - break; +static u32 usbnet_get_link (struct net_device *net) +{ + struct usbnet *dev = net->priv; - case ETHTOOL_GMSGLVL: { /* get message-level */ - struct ethtool_value edata = {ETHTOOL_GMSGLVL}; + /* If a check_connect is defined, return it's results */ + if (dev->driver_info->check_connect) + return dev->driver_info->check_connect (dev) == 0; - edata.data = dev->msg_level; - if (copy_to_user (useraddr, &edata, sizeof (edata))) - return -EFAULT; - return 0; - } + /* Otherwise, we're up to avoid breaking scripts */ + return 1; +} - case ETHTOOL_SMSGLVL: { /* set message-level */ - struct ethtool_value edata; +static u32 usbnet_get_msglevel (struct net_device *net) +{ + struct usbnet *dev = net->priv; - if (copy_from_user (&edata, useraddr, sizeof (edata))) - return -EFAULT; - dev->msg_level = edata.data; - return 0; - } - - /* could also map RINGPARAM to RX/TX QLEN */ + return dev->msg_level; +} - } - /* Note that the ethtool user space code requires EOPNOTSUPP */ - return -EOPNOTSUPP; +static void usbnet_set_msglevel (struct net_device *net, u32 level) +{ + struct usbnet *dev = net->priv; + + dev->msg_level = level; } static int usbnet_ioctl (struct net_device *net, struct ifreq *rq, int cmd) { - switch (cmd) { - case SIOCETHTOOL: - return usbnet_ethtool_ioctl (net, (void *)rq->ifr_data); - default: - return -EOPNOTSUPP; +#ifdef NEED_MII + { + struct usbnet *dev = (struct usbnet *)net->priv; + + if (dev->mii.mdio_read != NULL && dev->mii.mdio_write != NULL) + return generic_mii_ioctl(&dev->mii, + (struct mii_ioctl_data *) &rq->ifr_data, + cmd, NULL); } +#endif + return -EOPNOTSUPP; } /*-------------------------------------------------------------------------*/ @@ -2174,6 +2448,7 @@ struct net_device *net; struct driver_info *info; int altnum = 0; + int status; info = (struct driver_info *) prod->driver_info; @@ -2240,22 +2515,27 @@ net->watchdog_timeo = TX_TIMEOUT_JIFFIES; net->tx_timeout = usbnet_tx_timeout; net->do_ioctl = usbnet_ioctl; + net->ethtool_ops = &usbnet_ethtool_ops; - // get rx/tx params from descriptors; avoid compiled-in details - if (!info->in || !info->out) { - int status = get_endpoints (dev, - udev->actconfig->interface + ifnum); - if (status < 0) { - err ("get_endpoints failed, %d", status); - kfree (dev); - return 0; - } - } else { + // allow device-specific bind/init procedures + // NOTE net->name still not usable ... + if (info->bind) { + status = info->bind (dev, udev); + // heuristic: "usb%d" for links we know are two-host, + // else "eth%d" when there's reasonable doubt. userspace + // can rename the link if it knows better. + if ((dev->driver_info->flags & FLAG_ETHER) != 0 + && (net->dev_addr [0] & 0x02) == 0) + strcpy (net->name, "eth%d"); + } else if (!info->in || info->out) + status = get_endpoints (dev, udev->actconfig->interface + ifnum); + else { dev->in = usb_rcvbulkpipe (udev, info->in); dev->out = usb_sndbulkpipe (udev, info->out); - dev->maxpacket = info->epsize; } + dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1); + register_netdev (&dev->net); devinfo (dev, "register usbnet usb-%s-%s, %s", udev->bus->bus_name, udev->devpath, @@ -2293,6 +2573,30 @@ }, #endif +#ifdef CONFIG_USB_AX8817X +{ + // Linksys USB200M + USB_DEVICE (0x077b, 0x2226), + .driver_info = (unsigned long) &ax8817x_info, +}, { + // Netgear FA120 + USB_DEVICE (0x0846, 0x1040), + .driver_info = (unsigned long) &netgear_fa120_info, +}, { + // DLink DUB-E100 + USB_DEVICE (0x2001, 0x1a00), + .driver_info = (unsigned long) &dlink_dub_e100_info, +}, { + // Intellinet, ST Lab USB Ethernet + USB_DEVICE (0x0b95, 0x1720), + .driver_info = (unsigned long) &ax8817x_info, +}, { + // Hawking UF200, TrendNet TU2-ET100 + USB_DEVICE (0x07b8, 0x420a), + .driver_info = (unsigned long) &hawking_uf200_info, +}, +#endif + #ifdef CONFIG_USB_BELKIN { USB_DEVICE (0x050d, 0x0004), // Belkin @@ -2388,29 +2692,38 @@ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE, .idVendor = 0x04DD, - .idProduct = 0x8005, + .idProduct = 0x8005, /* A-300 */ .bInterfaceClass = 0x02, .bInterfaceSubClass = 0x0a, .bInterfaceProtocol = 0x00, - .driver_info = (unsigned long) &zaurus_sla300_info, + .driver_info = (unsigned long) &zaurus_pxa_info, }, { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE, .idVendor = 0x04DD, - .idProduct = 0x8006, + .idProduct = 0x8006, /* B-500/SL-5600 */ .bInterfaceClass = 0x02, .bInterfaceSubClass = 0x0a, .bInterfaceProtocol = 0x00, - .driver_info = (unsigned long) &zaurus_slb500_info, + .driver_info = (unsigned long) &zaurus_pxa_info, }, { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE, .idVendor = 0x04DD, - .idProduct = 0x8007, + .idProduct = 0x8007, /* C-700 */ + .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 = 0x9031, /* C-750 C-760 */ .bInterfaceClass = 0x02, .bInterfaceSubClass = 0x0a, .bInterfaceProtocol = 0x00, - .driver_info = (unsigned long) &zaurus_slc700_info, + .driver_info = (unsigned long) &zaurus_pxa_info, }, #endif @@ -2425,6 +2738,13 @@ .disconnect = usbnet_disconnect, }; +/* Default ethtool_ops assigned. Devices can override in their bind() routine */ +static struct ethtool_ops usbnet_ethtool_ops = { + .get_drvinfo = usbnet_get_drvinfo, + .get_link = usbnet_get_link, + .get_msglevel = usbnet_get_msglevel, + .set_msglevel = usbnet_set_msglevel, +}; /*-------------------------------------------------------------------------*/ static int __init usbnet_init (void) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/usb/vicam.c linux-2.4.23-pre8/drivers/usb/vicam.c --- linux-2.4.22/drivers/usb/vicam.c 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/usb/vicam.c 2003-10-22 22:47:55.000000000 +0000 @@ -969,18 +969,20 @@ if (cam->framebuf_read_start + count <= cam->framebuf_size) { // count does not exceed available bytes - copy_to_user(buf, - (cam->framebuf) + - cam->framebuf_read_start, count); + if (copy_to_user(buf, + (cam->framebuf) + + cam->framebuf_read_start, count)) + return -EFAULT; cam->framebuf_read_start += count; return count; } else { count = cam->framebuf_size - cam->framebuf_read_start; - copy_to_user(buf, - (cam->framebuf) + - cam->framebuf_read_start, count); + if (copy_to_user(buf, + (cam->framebuf) + + cam->framebuf_read_start, count)) + return -EFAULT; cam->framebuf_read_start = cam->framebuf_size; return count; } @@ -1002,7 +1004,10 @@ if (count > cam->framebuf_size) count = cam->framebuf_size; - copy_to_user(buf, cam->framebuf, count); + if (copy_to_user(buf, cam->framebuf, count)) { + up(&cam->busy_lock); + return -EFAULT; + } if (count != cam->framebuf_size) cam->framebuf_read_start = count; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/Config.in linux-2.4.23-pre8/drivers/video/Config.in --- linux-2.4.22/drivers/video/Config.in 2003-08-25 11:44:42.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/Config.in 2003-10-22 22:48:59.000000000 +0000 @@ -96,6 +96,9 @@ tristate ' Hercules mono graphics console (EXPERIMENTAL)' CONFIG_FB_HGA define_bool CONFIG_VIDEO_SELECT y fi + if [ "$CONFIG_IA64" = "y" ]; then + tristate ' VGA 16-color graphics console' CONFIG_FB_VGA16 + fi if [ "$CONFIG_VISWS" = "y" ]; then tristate ' SGI Visual Workstation framebuffer support' CONFIG_FB_SGIVW define_bool CONFIG_BUS_I2C y @@ -144,14 +147,17 @@ if [ "$CONFIG_FB_ATY" != "n" ]; then bool ' Mach64 GX support (EXPERIMENTAL)' CONFIG_FB_ATY_GX bool ' Mach64 CT/VT/GT/LT (incl. 3D RAGE) support' CONFIG_FB_ATY_CT + if [ "$ARCH" = "i386" -a "$CONFIG_FB_ATY_CT" != "n" ]; then + bool ' Mach64 generic LCD monitor support (EXPERIMENTAL)' CONFIG_FB_ATY_GENERIC_LCD + fi fi tristate ' ATI Radeon display support (EXPERIMENTAL)' CONFIG_FB_RADEON tristate ' ATI Rage128 display support (EXPERIMENTAL)' CONFIG_FB_ATY128 tristate ' Intel 830M/845G/852GM/855GM/865G display support (EXPERIMENTAL)' CONFIG_FB_INTEL - tristate ' SIS acceleration (EXPERIMENTAL)' CONFIG_FB_SIS + tristate ' SIS display support (EXPERIMENTAL)' CONFIG_FB_SIS if [ "$CONFIG_FB_SIS" != "n" ]; then - bool ' SIS 630/540/730 support' CONFIG_FB_SIS_300 - bool ' SIS 315H/315 support' CONFIG_FB_SIS_315 + bool ' SIS 300 series support' CONFIG_FB_SIS_300 + bool ' SIS 315/330 series support' CONFIG_FB_SIS_315 fi tristate ' NeoMagic display support (EXPERIMENTAL)' CONFIG_FB_NEOMAGIC tristate ' 3Dfx Banshee/Voodoo3 display support (EXPERIMENTAL)' CONFIG_FB_3DFX @@ -294,6 +300,7 @@ "$CONFIG_FB_PM3" = "y" -o "$CONFIG_FB_TRIDENT" = "y" -o \ "$CONFIG_FB_P9100" = "y" -o "$CONFIG_FB_ATY128" = "y" -o \ "$CONFIG_FB_RIVA" = "y" -o "$CONFIG_FB_RADEON" = "y" -o \ + "$CONFIG_FB_INTEL" = "y" -o \ "$CONFIG_FB_SGIVW" = "y" -o "$CONFIG_FB_CYBER2000" = "y" -o \ "$CONFIG_FB_SA1100" = "y" -o "$CONFIG_FB_3DFX" = "y" -o \ "$CONFIG_FB_PMAG_BA" = "y" -o "$CONFIG_FB_PMAGB_B" = "y" -o \ @@ -314,12 +321,13 @@ "$CONFIG_FB_VALKYRIE" = "m" -o "$CONFIG_FB_PLATINUM" = "m" -o \ "$CONFIG_FB_IGA" = "m" -o "$CONFIG_FB_MATROX" = "m" -o \ "$CONFIG_FB_CT65550" = "m" -o "$CONFIG_FB_PM2" = "m" -o \ - "$CONFIG_FB_PM3" = "m" -o "$CONFIG_FB_TRIDENT" = "y" -o \ + "$CONFIG_FB_PM3" = "m" -o "$CONFIG_FB_TRIDENT" = "m" -o \ "$CONFIG_FB_P9100" = "m" -o "$CONFIG_FB_ATY128" = "m" -o \ "$CONFIG_FB_RIVA" = "m" -o "$CONFIG_FB_3DFX" = "m" -o \ "$CONFIG_FB_SGIVW" = "m" -o "$CONFIG_FB_CYBER2000" = "m" -o \ "$CONFIG_FB_PMAG_BA" = "m" -o "$CONFIG_FB_PMAGB_B" = "m" -o \ "$CONFIG_FB_MAXINE" = "m" -o "$CONFIG_FB_RADEON" = "m" -o \ + "$CONFIG_FB_INTEL" = "m" -o \ "$CONFIG_FB_SA1100" = "m" -o "$CONFIG_FB_SIS" = "m" -o \ "$CONFIG_FB_TX3912" = "m" -o "$CONFIG_FB_NEOMAGIC" = "m" -o \ "$CONFIG_FB_STI" = "m" -o "$CONFIG_FB_INTEL" = "m" ]; then @@ -330,6 +338,7 @@ "$CONFIG_FB_MAC" = "y" -o "$CONFIG_FB_VESA" = "y" -o \ "$CONFIG_FB_VIRTUAL" = "y" -o "$CONFIG_FB_TBOX" = "y" -o \ "$CONFIG_FB_Q40" = "y" -o "$CONFIG_FB_RADEON" = "y" -o \ + "$CONFIG_FB_INTEL" = "y" -o \ "$CONFIG_FB_CONTROL" = "y" -o "$CONFIG_FB_CLGEN" = "y" -o \ "$CONFIG_FB_VIRGE" = "y" -o "$CONFIG_FB_CYBER" = "y" -o \ "$CONFIG_FB_VALKYRIE" = "y" -o "$CONFIG_FB_PLATINUM" = "y" -o \ @@ -352,10 +361,11 @@ "$CONFIG_FB_VALKYRIE" = "m" -o "$CONFIG_FB_PLATINUM" = "m" -o \ "$CONFIG_FB_CT65550" = "m" -o "$CONFIG_FB_MATROX" = "m" -o \ "$CONFIG_FB_PM2" = "m" -o "$CONFIG_FB_SGIVW" = "m" -o \ - "$CONFIG_FB_PM3" = "m" -o "$CONFIG_FB_TRIDENT" = "y" -o \ + "$CONFIG_FB_PM3" = "m" -o "$CONFIG_FB_TRIDENT" = "m" -o \ "$CONFIG_FB_RIVA" = "m" -o "$CONFIG_FB_ATY128" = "m" -o \ "$CONFIG_FB_CYBER2000" = "m" -o "$CONFIG_FB_SIS" = "m" -o \ "$CONFIG_FB_SA1100" = "m" -o "$CONFIG_FB_RADEON" = "m" -o \ + "$CONFIG_FB_INTEL" = "m" -o \ "$CONFIG_FB_PVR2" = "m" -o "$CONFIG_FB_VOODOO1" = "m" -o \ "$CONFIG_FB_NEOMAGIC" = "m" -o "$CONFIG_FB_INTEL" = "m" ]; then define_tristate CONFIG_FBCON_CFB16 m @@ -387,6 +397,7 @@ "$CONFIG_FB_RIVA" = "y" -o "$CONFIG_FB_ATY128" = "y" -o \ "$CONFIG_FB_FM2" = "y" -o "$CONFIG_FB_SGIVW" = "y" -o \ "$CONFIG_FB_RADEON" = "y" -o "$CONFIG_FB_PVR2" = "y" -o \ + "$CONFIG_FB_INTEL" = "y" -o \ "$CONFIG_FB_3DFX" = "y" -o "$CONFIG_FB_SIS" = "y" -o \ "$CONFIG_FB_VOODOO1" = "y" -o "$CONFIG_FB_CYBER2000" = "y" -o \ "$CONFIG_FB_STI" = "y" -o "$CONFIG_FB_INTEL" = "y" ]; then @@ -397,13 +408,13 @@ "$CONFIG_FB_CONTROL" = "m" -o "$CONFIG_FB_CLGEN" = "m" -o \ "$CONFIG_FB_TGA" = "m" -o "$CONFIG_FB_PLATINUM" = "m" -o \ "$CONFIG_FB_MATROX" = "m" -o "$CONFIG_FB_PM2" = "m" -o \ - "$CONFIG_FB_PM3" = "m" -o "$CONFIG_FB_TRIDENT" = "y" -o \ + "$CONFIG_FB_PM3" = "m" -o "$CONFIG_FB_TRIDENT" = "m" -o \ "$CONFIG_FB_RIVA" = "m" -o "$CONFIG_FB_ATY128" = "m" -o \ "$CONFIG_FB_3DFX" = "m" -o "$CONFIG_FB_RADEON" = "m" -o \ + "$CONFIG_FB_INTEL" = "m" -o \ "$CONFIG_FB_SGIVW" = "m" -o "$CONFIG_FB_SIS" = "m" -o \ "$CONFIG_FB_PVR2" = "m" -o "$CONFIG_FB_VOODOO1" = "m" -o \ - "$CONFIG_FB_CYBER2000" = "m" -o "$CONFIG_FB_STI" = "y" -o \ - "$CONFIG_FB_INTEL" = "m" ]; then + "$CONFIG_FB_CYBER2000" = "m" -o "$CONFIG_FB_STI" = "m" ]; then define_tristate CONFIG_FBCON_CFB32 m fi fi @@ -450,9 +461,9 @@ define_tristate CONFIG_FBCON_HGA m fi fi - if [ "$CONFIG_FB_STI" = "y" ]; then - define_tristate CONFIG_FBCON_STI y - fi + fi + if [ "$CONFIG_FB_STI" = "y" ]; then + define_tristate CONFIG_FBCON_STI y fi bool ' Support only 8 pixels wide fonts' CONFIG_FBCON_FONTWIDTH8_ONLY if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/aty/atyfb.h linux-2.4.23-pre8/drivers/video/aty/atyfb.h --- linux-2.4.22/drivers/video/aty/atyfb.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/aty/atyfb.h 2003-10-22 22:49:09.000000000 +0000 @@ -4,7 +4,8 @@ */ #include - +#include +#include /* * Elements of the hardware specific atyfb_par structure @@ -15,7 +16,6 @@ u32 vyres; u32 xoffset; u32 yoffset; - u32 bpp; u32 h_tot_disp; u32 h_sync_strt_wid; u32 v_tot_disp; @@ -24,6 +24,17 @@ u32 gen_cntl; u32 dp_pix_width; /* acceleration */ u32 dp_chain_mask; /* acceleration */ +#ifdef CONFIG_FB_ATY_GENERIC_LCD + u32 monitors_enabled; /* LCD monitor support */ + u16 h_stretching; /* LCD monitor support */ + u16 v_stretching; /* LCD monitor support */ +#endif + u8 bpp; + u8 h_blank_start; + u8 h_blank_end; + u16 v_blank_start; + u8 v_blank_end; + u8 genmo; }; struct pll_514 { @@ -40,16 +51,17 @@ }; struct pll_ct { - u8 pll_ref_div; - u8 pll_gen_cntl; - u8 mclk_fb_div; +// u8 pll_ref_div; +// u8 pll_gen_cntl; +// u8 mclk_fb_div; u8 pll_vclk_cntl; u8 vclk_post_div; u8 vclk_fb_div; - u8 pll_ext_cntl; +// u8 alt_post_div; +// u8 pll_ext_cntl; u32 dsp_config; /* Mach64 GTB DSP */ u32 dsp_on_off; /* Mach64 GTB DSP */ - u8 mclk_post_div_real; +// u8 mclk_post_div_real; u8 vclk_post_div_real; }; @@ -89,11 +101,42 @@ struct fb_info_aty { struct fb_info fb_info; struct fb_info_aty *next; + u32* ati_regaddr[256]; unsigned long ati_regbase_phys; unsigned long ati_regbase; unsigned long frame_buffer_phys; unsigned long frame_buffer; unsigned long clk_wr_offset; +#ifdef CONFIG_FB_ATY_CT + u8 pll_ref_div; + u8 xclk_post_div_real; + u16 mclk_fb_div; + u8 fifo_size; + u8 dsp_loop_latency; +// u8 page_size; + u8 xclkpagefaultdelay,xclkmaxrasdelay; +#endif +#ifdef CONFIG_FB_ATY_GENERIC_LCD + unsigned long bios_base_phys; + unsigned long bios_base; + unsigned long lcd_table; + u16 lcd_width; + u16 lcd_height; + u32 lcd_pixclock; + u16 lcd_htotal; + u16 lcd_hdisp; + u16 lcd_hsync_start; + u16 lcd_hsync_delay; + u16 lcd_hsync_width; + u16 lcd_vtotal; + u16 lcd_vdisp; + u16 lcd_vsync_start; + u16 lcd_vsync_width; + u16 lcd_right; + u16 lcd_lower; + u16 lcd_hblank_width; + u16 lcd_vblank_width; +#endif struct pci_mmap_map *mmap_map; struct aty_cursor *cursor; struct aty_cmap_regs *aty_cmap_regs; @@ -105,6 +148,7 @@ u32 ref_clk_per; u32 pll_per; u32 mclk_per; + u32 xclk_per; u8 bus_type; u8 ram_type; u8 mem_refresh_rate; @@ -124,6 +168,7 @@ #endif } fbcon_cmap; u8 blitter_may_be_busy; + u8 font_loaded; #ifdef __sparc__ u8 mmaped; int open; @@ -164,6 +209,12 @@ #define M64F_LT_SLEEP 0x00040000 #define M64F_XL_DLL 0x00080000 +#ifdef __i386__ +# define stdcall __attribute__ ((stdcall)) +#else +# define stdcall +#endif +#define packed __attribute__ ((packed)) /* * Register access @@ -172,70 +223,72 @@ static inline u32 aty_ld_le32(int regindex, const struct fb_info_aty *info) { - /* Hack for bloc 1, should be cleanly optimized by compiler */ - if (regindex >= 0x400) - regindex -= 0x800; + if (regindex >= 0x400) { + regindex -= 0x800; +#if defined(__mc68000__) + return le32_to_cpu(*((volatile u32 *)(info->ati_regbase+regindex))); +#else + return readl (info->ati_regbase + regindex); +#endif + } else { +#if defined(__mc68000__) + return le32_to_cpu(*((volatile u32 *)(info->ati_regaddr[regindex/4]))); +#else + return readl (info->ati_regaddr[regindex/4]); +#endif + }; +} -#ifdef CONFIG_ATARI - return in_le32((volatile u32 *)(info->ati_regbase+regindex)); +static inline void aty_st_le32_sr(int regindex, u32 val, + const struct fb_info_aty *info) +{ +#if defined(__mc68000__) + *((volatile u32 *)(info->ati_regaddr[regindex/4])) = cpu_to_le32(val); #else - return readl (info->ati_regbase + regindex); + writel (val,info->ati_regaddr[regindex/4]); #endif } static inline void aty_st_le32(int regindex, u32 val, const struct fb_info_aty *info) { - /* Hack for bloc 1, should be cleanly optimized by compiler */ - if (regindex >= 0x400) - regindex -= 0x800; - -#ifdef CONFIG_ATARI - out_le32 (info->ati_regbase+regindex, val); + if (regindex >= 0x400) { + regindex -= 0x800; +#if defined(__mc68000__) + *((volatile u32 *)(info->ati_regbase+regindex)) = cpu_to_le32(val); +#else + writel (val,info->ati_regbase + regindex); +#endif + } else { +#if defined(__mc68000__) + *((volatile u32 *)(info->ati_regaddr[regindex/4])) = cpu_to_le32(val); #else - writel (val, info->ati_regbase + regindex); + writel (val,info->ati_regaddr[regindex/4]); #endif + }; } static inline u8 aty_ld_8(int regindex, const struct fb_info_aty *info) { - /* Hack for bloc 1, should be cleanly optimized by compiler */ if (regindex >= 0x400) - regindex -= 0x800; - -#ifdef CONFIG_ATARI - return in_8 (info->ati_regbase + regindex); -#else + regindex -= 0x800; return readb (info->ati_regbase + regindex); -#endif } static inline void aty_st_8(int regindex, u8 val, const struct fb_info_aty *info) { - /* Hack for bloc 1, should be cleanly optimized by compiler */ if (regindex >= 0x400) - regindex -= 0x800; - -#ifdef CONFIG_ATARI - out_8 (info->ati_regbase + regindex, val); -#else - writeb (val, info->ati_regbase + regindex); -#endif + regindex -= 0x800; + writeb (val,info->ati_regbase + regindex); } -static inline u8 aty_ld_pll(int offset, const struct fb_info_aty *info) -{ - u8 res; - - /* write addr byte */ - aty_st_8(CLOCK_CNTL + 1, (offset << 2), info); - /* read the register value */ - res = aty_ld_8(CLOCK_CNTL + 2, info); - return res; -} + /* + * Mach64 CT PLL operations + */ +extern u8 aty_ld_pll(int offset, const struct fb_info_aty *info) stdcall; /* * DAC operations @@ -259,10 +312,11 @@ struct aty_pll_ops { int (*var_to_pll)(const struct fb_info_aty *info, u32 vclk_per, u8 bpp, - union aty_pll *pll); + u32 xres, union aty_pll *pll); u32 (*pll_to_var)(const struct fb_info_aty *info, const union aty_pll *pll); void (*set_pll)(const struct fb_info_aty *info, const union aty_pll *pll); + void (*init_pll)(struct fb_info_aty *info); }; extern const struct aty_pll_ops aty_pll_ati18818_1; /* ATI 18818 */ @@ -276,8 +330,8 @@ extern void aty_set_pll_ct(const struct fb_info_aty *info, const union aty_pll *pll); -extern void aty_calc_pll_ct(const struct fb_info_aty *info, - struct pll_ct *pll); +//extern void aty_calc_pll_ct(const struct fb_info_aty *info, +// struct pll_ct *pll); /* @@ -297,7 +351,7 @@ static inline void wait_for_fifo(u16 entries, const struct fb_info_aty *info) { - while ((aty_ld_le32(FIFO_STAT, info) & 0xffff) > + while (__builtin_expect((aty_ld_le32(FIFO_STAT, info) & 0xffff), 0) > ((u32)(0x8000 >> entries))); } @@ -305,20 +359,21 @@ { wait_for_fifo(16, info); while ((aty_ld_le32(GUI_STAT, info) & 1)!= 0); - info->blitter_may_be_busy = 0; + info->blitter_may_be_busy = 0; } extern void aty_reset_engine(const struct fb_info_aty *info); extern void aty_init_engine(const struct atyfb_par *par, struct fb_info_aty *info); extern void aty_rectfill(int dstx, int dsty, u_int width, u_int height, - u_int color, struct fb_info_aty *info); + u_int color, struct fb_info_aty *info); /* * Text console acceleration */ +extern const struct display_switch fbcon_aty0; extern const struct display_switch fbcon_aty8; extern const struct display_switch fbcon_aty16; extern const struct display_switch fbcon_aty24; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/aty/atyfb_base.c linux-2.4.23-pre8/drivers/video/aty/atyfb_base.c --- linux-2.4.22/drivers/video/aty/atyfb_base.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/aty/atyfb_base.c 2003-10-22 22:47:51.000000000 +0000 @@ -1,10 +1,9 @@ - /* * ATI Frame Buffer Device Driver Core * - * Copyright (C) 1997-2001 Geert Uytterhoeven - * Copyright (C) 1998 Bernd Harries - * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) + * Copyright (C) 1997-2001 Geert Uytterhoeven + * Copyright (C) 1998 Bernd Harries + * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) * * This driver supports the following ATI graphics chips: * - ATI Mach64 @@ -15,15 +14,17 @@ * * This driver is partly based on the PowerMac console driver: * - * Copyright (C) 1996 Paul Mackerras + * Copyright (C) 1996 Paul Mackerras * * and on the PowerMac ATI/mach64 display driver: * - * Copyright (C) 1997 Michael AK Tesch + * Copyright (C) 1997 Michael AK Tesch + * + * with work by Jon Howell + * Harry AC Eaton + * Anthony Tong * - * with work by Jon Howell - * Harry AC Eaton - * Anthony Tong + * Generic LCD support written by Daniel Mantione * * 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 @@ -41,7 +42,7 @@ - guess PLL and MCLK based on the original PLL register values initialized by the BIOS or Open Firmware (if they are initialized). - (Anyone to help with this?) + (Anyone to help with this?) ******************************************************************************/ @@ -110,13 +111,12 @@ /* Make sure n * PAGE_SIZE is protected at end of Aperture for GUI-regs */ /* - must be large enough to catch all GUI-Regs */ /* - must be aligned to a PAGE boundary */ -#define GUI_RESERVE (1 * PAGE_SIZE) +#define GUI_RESERVE (1 * PAGE_SIZE) /* FIXME: remove the FAIL definition */ #define FAIL(x) do { printk(x "\n"); return -EINVAL; } while (0) - /* * The Hardware parameters for each card */ @@ -145,22 +145,22 @@ static int atyfb_open(struct fb_info *info, int user); static int atyfb_release(struct fb_info *info, int user); static int atyfb_get_fix(struct fb_fix_screeninfo *fix, int con, - struct fb_info *fb); + struct fb_info *fb); static int atyfb_get_var(struct fb_var_screeninfo *var, int con, - struct fb_info *fb); + struct fb_info *fb); static int atyfb_set_var(struct fb_var_screeninfo *var, int con, - struct fb_info *fb); + struct fb_info *fb); static int atyfb_pan_display(struct fb_var_screeninfo *var, int con, - struct fb_info *fb); + struct fb_info *fb); static int atyfb_get_cmap(struct fb_cmap *cmap, int kspc, int con, - struct fb_info *info); + struct fb_info *info); static int atyfb_set_cmap(struct fb_cmap *cmap, int kspc, int con, - struct fb_info *info); + struct fb_info *info); static int atyfb_ioctl(struct inode *inode, struct file *file, u_int cmd, - u_long arg, int con, struct fb_info *info); + u_long arg, int con, struct fb_info *info); #ifdef __sparc__ static int atyfb_mmap(struct fb_info *info, struct file *file, - struct vm_area_struct *vma); + struct vm_area_struct *vma); #endif static int atyfb_rasterimg(struct fb_info *info, int start); @@ -185,32 +185,33 @@ #endif static void aty_set_crtc(const struct fb_info_aty *info, - const struct crtc *crtc); + const struct crtc *crtc); static int aty_var_to_crtc(const struct fb_info_aty *info, - const struct fb_var_screeninfo *var, - struct crtc *crtc); + const struct fb_var_screeninfo *var, + struct crtc *crtc, u32 *monitors_enabled); static int aty_crtc_to_var(const struct crtc *crtc, - struct fb_var_screeninfo *var); + struct fb_var_screeninfo *var); static void atyfb_set_par(const struct atyfb_par *par, - struct fb_info_aty *info); + struct fb_info_aty *info); static int atyfb_decode_var(const struct fb_var_screeninfo *var, - struct atyfb_par *par, - const struct fb_info_aty *info); + struct atyfb_par *par, + const struct fb_info_aty *info, + u32 monitors_enabled); static int atyfb_encode_var(struct fb_var_screeninfo *var, - const struct atyfb_par *par, - const struct fb_info_aty *info); + const struct atyfb_par *par, + const struct fb_info_aty *info); static void set_off_pitch(struct atyfb_par *par, - const struct fb_info_aty *info); + const struct fb_info_aty *info); static int encode_fix(struct fb_fix_screeninfo *fix, - const struct atyfb_par *par, - const struct fb_info_aty *info); + const struct atyfb_par *par, + const struct fb_info_aty *info); static void atyfb_set_dispsw(struct display *disp, struct fb_info_aty *info, - int bpp, int accel); + int bpp, int accel); static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, - u_int *transp, struct fb_info *fb); + u_int *transp, struct fb_info *fb); static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, - u_int transp, struct fb_info *fb); + u_int transp, struct fb_info *fb); static void do_install_cmap(int con, struct fb_info *info); #ifdef CONFIG_PPC static int read_aty_sense(const struct fb_info_aty *info); @@ -229,20 +230,20 @@ static int currcon = 0; static struct fb_ops atyfb_ops = { - owner: THIS_MODULE, - fb_open: atyfb_open, - fb_release: atyfb_release, - fb_get_fix: atyfb_get_fix, - fb_get_var: atyfb_get_var, - fb_set_var: atyfb_set_var, - fb_get_cmap: atyfb_get_cmap, - fb_set_cmap: atyfb_set_cmap, - fb_pan_display: atyfb_pan_display, - fb_ioctl: atyfb_ioctl, + owner: THIS_MODULE, + fb_open: atyfb_open, + fb_release: atyfb_release, + fb_get_fix: atyfb_get_fix, + fb_get_var: atyfb_get_var, + fb_set_var: atyfb_set_var, + fb_get_cmap: atyfb_get_cmap, + fb_set_cmap: atyfb_set_cmap, + fb_pan_display: atyfb_pan_display, + fb_ioctl: atyfb_ioctl, #ifdef __sparc__ - fb_mmap: atyfb_mmap, + fb_mmap: atyfb_mmap, #endif - fb_rasterimg: atyfb_rasterimg, + fb_rasterimg: atyfb_rasterimg, }; static char atyfb_name[16] = "ATY Mach64"; @@ -252,6 +253,7 @@ static u32 default_vram __initdata = 0; static int default_pll __initdata = 0; static int default_mclk __initdata = 0; +static int default_xclk __initdata = 0; #ifndef MODULE static char *mode_option __initdata = NULL; @@ -308,65 +310,79 @@ u16 pci_id, chip_type; u8 rev_mask, rev_val; const char *name; - int pll, mclk; + int pll, mclk, xclk; u32 features; } aty_chips[] __initdata = { + /* Note to kernel maintainers: Please REFUSE any patch to change a clock rate, + unless someone proves that a value is incorrect for him with a dump of + the driver information table in the BIOS. Patches accepted in the past have + caused chips to be overclocked by as much as 50%! + + Even in the case the table appear to be wrong, do not simply change the value + in the table. Ask about the chip revision the person uses and *add* an entry. + It's also often a good idea to contact ATi. + + Lastly, third party board vendors might use different memory clocks + than ATi. An example of this is the Apple iBook1 which is handled specially + in aty_init. + + (Daniel Mantione, 26 June 2003) + */ #ifdef CONFIG_FB_ATY_GX /* Mach64 GX */ - { 0x4758, 0x00d7, 0x00, 0x00, m64n_gx, 135, 50, M64F_GX }, - { 0x4358, 0x0057, 0x00, 0x00, m64n_cx, 135, 50, M64F_GX }, + { 0x4758, 0x00d7, 0x00, 0x00, m64n_gx, 135, 50, 50, M64F_GX }, + { 0x4358, 0x0057, 0x00, 0x00, m64n_cx, 135, 50, 50, M64F_GX }, #endif /* CONFIG_FB_ATY_GX */ #ifdef CONFIG_FB_ATY_CT /* Mach64 CT */ - { 0x4354, 0x4354, 0x00, 0x00, m64n_ct, 135, 60, M64F_CT | M64F_INTEGRATED | M64F_CT_BUS | M64F_MAGIC_FIFO }, - { 0x4554, 0x4554, 0x00, 0x00, m64n_et, 135, 60, M64F_CT | M64F_INTEGRATED | M64F_CT_BUS | M64F_MAGIC_FIFO }, + { 0x4354, 0x4354, 0x00, 0x00, m64n_ct, 135, 60, 60, M64F_CT | M64F_INTEGRATED | M64F_CT_BUS | M64F_MAGIC_FIFO }, + { 0x4554, 0x4554, 0x00, 0x00, m64n_et, 135, 60, 60, M64F_CT | M64F_INTEGRATED | M64F_CT_BUS | M64F_MAGIC_FIFO }, /* Mach64 VT */ - { 0x5654, 0x5654, 0xc7, 0x00, m64n_vta3, 170, 67, M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_MAGIC_FIFO | M64F_FIFO_24 }, - { 0x5654, 0x5654, 0xc7, 0x40, m64n_vta4, 200, 67, M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_MAGIC_FIFO | M64F_FIFO_24 | M64F_MAGIC_POSTDIV }, - { 0x5654, 0x5654, 0x00, 0x00, m64n_vtb, 200, 67, M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_GTB_DSP | M64F_FIFO_24 }, - { 0x5655, 0x5655, 0x00, 0x00, m64n_vtb, 200, 67, M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL }, - { 0x5656, 0x5656, 0x00, 0x00, m64n_vt4, 230, 83, M64F_VT | M64F_INTEGRATED | M64F_GTB_DSP }, + { 0x5654, 0x5654, 0xc7, 0x00, m64n_vta3, 170, 67, 67, M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_MAGIC_FIFO | M64F_FIFO_24 }, + { 0x5654, 0x5654, 0xc7, 0x40, m64n_vta4, 200, 67, 67, M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_MAGIC_FIFO | M64F_FIFO_24 | M64F_MAGIC_POSTDIV }, + { 0x5654, 0x5654, 0x00, 0x00, m64n_vtb, 200, 67, 67, M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_GTB_DSP | M64F_FIFO_24 }, + { 0x5655, 0x5655, 0x00, 0x00, m64n_vtb, 200, 67, 67, M64F_VT | M64F_INTEGRATED | M64F_VT_BUS | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL }, + { 0x5656, 0x5656, 0x00, 0x00, m64n_vt4, 230, 83, 83, M64F_VT | M64F_INTEGRATED | M64F_GTB_DSP }, /* Mach64 GT (3D RAGE) */ - { 0x4754, 0x4754, 0x07, 0x00, m64n_gt, 135, 63, M64F_GT | M64F_INTEGRATED | M64F_MAGIC_FIFO | M64F_FIFO_24 | M64F_EXTRA_BRIGHT }, - { 0x4754, 0x4754, 0x07, 0x01, m64n_gt, 170, 67, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, - { 0x4754, 0x4754, 0x07, 0x02, m64n_gt, 200, 67, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, - { 0x4755, 0x4755, 0x00, 0x00, m64n_gtb, 200, 67, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, - { 0x4756, 0x4756, 0x00, 0x00, m64n_iic_p, 230, 83, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, - { 0x4757, 0x4757, 0x00, 0x00, m64n_iic_a, 230, 83, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, - { 0x475a, 0x475a, 0x00, 0x00, m64n_iic_a, 230, 83, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4754, 0x4754, 0x07, 0x00, m64n_gt, 135, 63, 63, M64F_GT | M64F_INTEGRATED | M64F_MAGIC_FIFO | M64F_FIFO_24 | M64F_EXTRA_BRIGHT }, + { 0x4754, 0x4754, 0x07, 0x01, m64n_gt, 170, 67, 67, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4754, 0x4754, 0x07, 0x02, m64n_gt, 200, 67, 67, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4755, 0x4755, 0x00, 0x00, m64n_gtb, 200, 67, 67, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4756, 0x4756, 0x00, 0x00, m64n_iic_p, 230, 83, 83, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4757, 0x4757, 0x00, 0x00, m64n_iic_a, 230, 83, 83, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x475a, 0x475a, 0x00, 0x00, m64n_iic_a, 230, 83, 83, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_FIFO_24 | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, /* Mach64 LT */ - { 0x4c54, 0x4c54, 0x00, 0x00, m64n_lt, 135, 63, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP }, - { 0x4c47, 0x4c47, 0x00, 0x00, m64n_ltg, 230, 63, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT | M64F_LT_SLEEP | M64F_G3_PB_1024x768 }, + { 0x4c54, 0x4c54, 0x00, 0x00, m64n_lt, 135, 63, 63, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP }, + { 0x4c47, 0x4c47, 0x00, 0x00, m64n_ltg, 230, 63, 63, M64F_GT | M64F_INTEGRATED | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT | M64F_LT_SLEEP | M64F_G3_PB_1024x768 | M64F_FIFO_24 }, /* Mach64 GTC (3D RAGE PRO) */ - { 0x4742, 0x4742, 0x00, 0x00, m64n_gtc_ba, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, - { 0x4744, 0x4744, 0x00, 0x00, m64n_gtc_ba1, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, - { 0x4749, 0x4749, 0x00, 0x00, m64n_gtc_bp, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT | M64F_MAGIC_VRAM_SIZE }, - { 0x4750, 0x4750, 0x00, 0x00, m64n_gtc_pp, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, - { 0x4751, 0x4751, 0x00, 0x00, m64n_gtc_ppl, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4742, 0x4742, 0x00, 0x00, m64n_gtc_ba, 230, 100, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4744, 0x4744, 0x00, 0x00, m64n_gtc_ba1, 230, 100, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4749, 0x4749, 0x00, 0x00, m64n_gtc_bp, 230, 100, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT | M64F_MAGIC_VRAM_SIZE }, + { 0x4750, 0x4750, 0x00, 0x00, m64n_gtc_pp, 230, 100, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, + { 0x4751, 0x4751, 0x00, 0x00, m64n_gtc_ppl, 230, 100, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT }, /* 3D RAGE XL */ - { 0x4752, 0x4752, 0x00, 0x00, m64n_xl, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT | M64F_XL_DLL }, + { 0x4752, 0x4752, 0x00, 0x00, m64n_xl, 235, 83, 63, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_SDRAM_MAGIC_PLL | M64F_EXTRA_BRIGHT | M64F_XL_DLL }, /* Mach64 LT PRO */ - { 0x4c42, 0x4c42, 0x00, 0x00, m64n_ltp_a, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP }, - { 0x4c44, 0x4c44, 0x00, 0x00, m64n_ltp_p, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP }, - { 0x4c49, 0x4c49, 0x00, 0x00, m64n_ltp_p, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_EXTRA_BRIGHT | M64F_G3_PB_1_1 | M64F_G3_PB_1024x768 }, - { 0x4c50, 0x4c50, 0x00, 0x00, m64n_ltp_p, 230, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP }, + { 0x4c42, 0x4c42, 0x00, 0x00, m64n_ltp_a, 236, 75, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_EXTRA_BRIGHT}, + { 0x4c44, 0x4c44, 0x00, 0x00, m64n_ltp_p, 230, 100, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_EXTRA_BRIGHT}, + { 0x4c49, 0x4c49, 0x00, 0x00, m64n_ltp_p, 230, 100, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_EXTRA_BRIGHT | M64F_G3_PB_1_1 | M64F_G3_PB_1024x768 }, + { 0x4c50, 0x4c50, 0x00, 0x00, m64n_ltp_p, 230, 100, 100, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_EXTRA_BRIGHT}, /* 3D RAGE Mobility */ - { 0x4c4d, 0x4c4d, 0x00, 0x00, m64n_mob_p, 230, 50, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_MOBIL_BUS }, - { 0x4c4e, 0x4c4e, 0x00, 0x00, m64n_mob_a, 230, 50, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_MOBIL_BUS }, + { 0x4c4d, 0x4c4d, 0x00, 0x00, m64n_mob_p, 230, 83, 125, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_MOBIL_BUS | M64F_EXTRA_BRIGHT}, + { 0x4c4e, 0x4c4e, 0x00, 0x00, m64n_mob_a, 230, 83, 125, M64F_GT | M64F_INTEGRATED | M64F_RESET_3D | M64F_GTB_DSP | M64F_MOBIL_BUS | M64F_EXTRA_BRIGHT}, #endif /* CONFIG_FB_ATY_CT */ }; #if defined(CONFIG_FB_ATY_GX) || defined(CONFIG_FB_ATY_CT) static char ram_dram[] __initdata = "DRAM"; -static char ram_resv[] __initdata = "RESV"; #endif /* CONFIG_FB_ATY_GX || CONFIG_FB_ATY_CT */ #ifdef CONFIG_FB_ATY_GX @@ -379,6 +395,7 @@ static char ram_sgram[] __initdata = "SGRAM"; static char ram_wram[] __initdata = "WRAM"; static char ram_off[] __initdata = "OFF"; +static char ram_resv[] __initdata = "RESV"; #endif /* CONFIG_FB_ATY_CT */ #ifdef CONFIG_FB_ATY_GX @@ -406,39 +423,39 @@ { int sense, i; - aty_st_le32(GP_IO, 0x31003100, info); /* drive outputs high */ + aty_st_le32(GP_IO, 0x31003100, info); /* drive outputs high */ __delay(200); - aty_st_le32(GP_IO, 0, info); /* turn off outputs */ + aty_st_le32(GP_IO, 0, info); /* turn off outputs */ __delay(2000); - i = aty_ld_le32(GP_IO, info); /* get primary sense value */ + i = aty_ld_le32(GP_IO, info); /* get primary sense value */ sense = ((i & 0x3000) >> 3) | (i & 0x100); /* drive each sense line low in turn and collect the other 2 */ - aty_st_le32(GP_IO, 0x20000000, info); /* drive A low */ + aty_st_le32(GP_IO, 0x20000000, info); /* drive A low */ __delay(2000); i = aty_ld_le32(GP_IO, info); sense |= ((i & 0x1000) >> 7) | ((i & 0x100) >> 4); - aty_st_le32(GP_IO, 0x20002000, info); /* drive A high again */ + aty_st_le32(GP_IO, 0x20002000, info); /* drive A high again */ __delay(200); - aty_st_le32(GP_IO, 0x10000000, info); /* drive B low */ + aty_st_le32(GP_IO, 0x10000000, info); /* drive B low */ __delay(2000); i = aty_ld_le32(GP_IO, info); sense |= ((i & 0x2000) >> 10) | ((i & 0x100) >> 6); - aty_st_le32(GP_IO, 0x10001000, info); /* drive B high again */ + aty_st_le32(GP_IO, 0x10001000, info); /* drive B high again */ __delay(200); - aty_st_le32(GP_IO, 0x01000000, info); /* drive C low */ + aty_st_le32(GP_IO, 0x01000000, info); /* drive C low */ __delay(2000); sense |= (aty_ld_le32(GP_IO, info) & 0x3000) >> 12; - aty_st_le32(GP_IO, 0, info); /* turn off outputs */ + aty_st_le32(GP_IO, 0, info); /* turn off outputs */ return sense; } #endif /* defined(CONFIG_PPC) */ -#if defined(CONFIG_PMAC_PBOOK) || defined(CONFIG_PMAC_BACKLIGHT) +#if defined(CONFIG_PMAC_PBOOK) || defined(CONFIG_PMAC_BACKLIGHT) || defined (CONFIG_FB_ATY_GENERIC_LCD) static void aty_st_lcd(int index, u32 val, const struct fb_info_aty *info) { unsigned long temp; @@ -460,7 +477,7 @@ /* read the register value */ return aty_ld_le32(LCD_DATA, info); } -#endif /* CONFIG_PMAC_PBOOK || CONFIG_PMAC_BACKLIGHT */ +#endif /* CONFIG_PMAC_PBOOK || CONFIG_PMAC_BACKLIGHT || CONFIG_FB_ATY_GENERIC_LCD*/ /* ------------------------------------------------------------------------- */ @@ -469,30 +486,105 @@ */ static void aty_set_crtc(const struct fb_info_aty *info, - const struct crtc *crtc) + const struct crtc *crtc) { + u32 v; + aty_st_le32(CRTC_H_TOTAL_DISP, crtc->h_tot_disp, info); aty_st_le32(CRTC_H_SYNC_STRT_WID, crtc->h_sync_strt_wid, info); +#ifdef CONFIG_FB_ATY_GENERIC_LCD + /* HACK: + * I don't want to do this, but Geert Uytterhoeven's laptop seems to + * have some shadowing enabled that I don't know yet how to switch + * off. It is a Rage Mobility M1, but doesn't happen on these chips + * in general. (Daniel Mantione, 26 june 2003) + */ + aty_st_lcd(LCD_GEN_CTRL, aty_ld_lcd(LCD_GEN_CTRL, info) | SHADOW_RW_EN, + info); + aty_st_le32(CRTC_H_TOTAL_DISP, crtc->h_tot_disp, info); + aty_st_le32(CRTC_H_SYNC_STRT_WID, crtc->h_sync_strt_wid, info); + aty_st_lcd(LCD_GEN_CTRL, aty_ld_lcd(LCD_GEN_CTRL, info) & ~SHADOW_RW_EN, + info); + /* End hack */ +#endif + aty_st_le32(CRTC_V_TOTAL_DISP, crtc->v_tot_disp, info); aty_st_le32(CRTC_V_SYNC_STRT_WID, crtc->v_sync_strt_wid, info); aty_st_le32(CRTC_VLINE_CRNT_VLINE, 0, info); aty_st_le32(CRTC_OFF_PITCH, crtc->off_pitch, info); aty_st_le32(CRTC_GEN_CNTL, crtc->gen_cntl, info); +/* printk(KERN_INFO "CRTC_GEN_CNTL: %x\n",crtc->gen_cntl); + printk(KERN_INFO "CRTC_H_TOTAL_DISP: %x\n",crtc->h_tot_disp); + printk(KERN_INFO "CRTC_H_SYNC_STRT_WID: %x\n",crtc->h_sync_strt_wid); + printk(KERN_INFO "CRTC_V_TOTAL_DISP: %x\n",crtc->v_tot_disp); + printk(KERN_INFO "CRTC_V_SYNC_STRT_WID: %x\n",crtc->v_sync_strt_wid);*/ +#ifdef CONFIG_FB_ATY_GENERIC_LCD + /* After setting the CRTC registers we should set the LCD + registers. + */ + if (info->lcd_table != 0) { + /* Enable/disable horizontal stretching */ + v = aty_ld_lcd(HORZ_STRETCHING, info); + v = v & ~(HORZ_STRETCH_RATIO | HORZ_STRETCH_EN | AUTO_HORZ_RATIO | + HORZ_STRETCH_LOOP); + v = v | HORZ_STRETCH_MODE; /* Use interpolation instead of duplication. */ + if (crtc->h_stretching != 0) + v = v | HORZ_STRETCH_EN | crtc->h_stretching; + aty_st_lcd(HORZ_STRETCHING, v, info); + /*printk(KERN_INFO "HORZ_STRETCHING: %x\n", v);*/ + + /* Enable/disable vertital stretching */ + v = aty_ld_lcd(VERT_STRETCHING, info); + v = v & ~(VERT_STRETCH_RATIO0 | VERT_STRETCH_EN); + v = v | VERT_STRETCH_USE0; /* Use VERT_STRETCH_RATIO0. */ + if (crtc->v_stretching != 0) + v = v | VERT_STRETCH_EN | crtc->v_stretching; + aty_st_lcd(VERT_STRETCHING, v, info); + /*printk(KERN_INFO "VERT_STRETCHING: %x\n", v);*/ + v = aty_ld_lcd(EXT_VERT_STRETCH, info); + v = v & ~AUTO_VERT_RATIO; /* Forbit the chip to guess the vertical + expansion (used for vga compatibility) */ + v = v | VERT_STRETCH_MODE; /* Use interpolation instead of duplication. */ + aty_st_lcd(EXT_VERT_STRETCH, v, info); + /*printk(KERN_INFO "EXT_VERT_STRETCH: %x\n", v);*/ + + /* Don't use shadowing. Don't divide the horizontal paramters. + (VGA compatibility junk that might be enabled.) + Enable only the monitors that were enabled before we switched the + video mode. + */ + v = aty_ld_lcd(LCD_GEN_CTRL, info); + v = v & ~(HORZ_DIVBY2_EN | DISABLE_PCLK_RESET | SCLK_SEL | + DIS_HOR_CRT_DIVBY2 | VCLK_DAC_PM_EN | XTALIN_PM_EN | + CRTC_RW_SELECT | USE_SHADOWED_ROWCUR | + USE_SHADOWED_VEND | SHADOW_EN | SHADOW_RW_EN | + LCD_ON | CRT_ON); + v = v | DONT_SHADOW_VPAR | crtc->monitors_enabled; + aty_st_lcd(LCD_GEN_CTRL, v, info); + /*printk(KERN_INFO "LCD_GEN_CTRL: %x\n", v);*/ + aty_st_lcd(CONFIG_PANEL, aty_ld_lcd(CONFIG_PANEL, info) | + DONT_SHADOW_HEND, info); + }; +#endif } static int aty_var_to_crtc(const struct fb_info_aty *info, - const struct fb_var_screeninfo *var, - struct crtc *crtc) + const struct fb_var_screeninfo *var, + struct crtc *crtc, u32 *monitors_enabled) { - u32 xres, yres, vxres, vyres, xoffset, yoffset, bpp; + u32 xres, yres, ryres, vxres, vyres, xoffset, yoffset, bpp; u32 left, right, upper, lower, hslen, vslen, sync, vmode; u32 h_total, h_disp, h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol; u32 v_total, v_disp, v_sync_strt, v_sync_wid, v_sync_pol, c_sync; u32 pix_width, dp_pix_width, dp_chain_mask; +#ifdef CONFIG_FB_ATY_GENERIC_LCD + u32 lcd_hsync_start,lcd_htotal,lcd_vsync_start,lcd_vtotal; +#endif /* input */ xres = var->xres; yres = var->yres; + ryres = yres; vxres = var->xres_virtual; vyres = var->yres_virtual; xoffset = var->xoffset; @@ -501,6 +593,7 @@ left = var->left_margin; right = var->right_margin; upper = var->upper_margin; + lower = var->lower_margin; hslen = var->hsync_len; vslen = var->vsync_len; @@ -512,70 +605,82 @@ xoffset = (xoffset+7) & ~7; vxres = (vxres+7) & ~7; if (vxres < xres+xoffset) - vxres = xres+xoffset; + vxres = xres+xoffset; h_disp = xres/8-1; if (h_disp > 0xff) - FAIL("h_disp too large"); + FAIL("h_disp too large"); h_sync_strt = h_disp+(right/8); if (h_sync_strt > 0x1ff) - FAIL("h_sync_start too large"); + FAIL("h_sync_start too large"); h_sync_dly = right & 7; h_sync_wid = (hslen+7)/8; if (h_sync_wid > 0x1f) - FAIL("h_sync_wid too large"); + FAIL("h_sync_wid too large"); h_total = h_sync_strt+h_sync_wid+(h_sync_dly+left+7)/8; if (h_total > 0x1ff) - FAIL("h_total too large"); + FAIL("h_total too large"); h_sync_pol = sync & FB_SYNC_HOR_HIGH_ACT ? 0 : 1; if (vyres < yres+yoffset) - vyres = yres+yoffset; + vyres = yres+yoffset; v_disp = yres-1; if (v_disp > 0x7ff) - FAIL("v_disp too large"); + FAIL("v_disp too large"); v_sync_strt = v_disp+lower; if (v_sync_strt > 0x7ff) - FAIL("v_sync_strt too large"); + FAIL("v_sync_strt too large"); v_sync_wid = vslen; if (v_sync_wid > 0x1f) - FAIL("v_sync_wid too large"); + FAIL("v_sync_wid too large"); v_total = v_sync_strt+v_sync_wid+upper; if (v_total > 0x7ff) - FAIL("v_total too large"); + FAIL("v_total too large"); v_sync_pol = sync & FB_SYNC_VERT_HIGH_ACT ? 0 : 1; - + /* In double scan mode, the vertical parameters need to be doubled. + But in interlaced mode, there is no need to half the vertical parameters. + Code has been tested in 1024x768, 43 Hz interlaced and 640x480, 60 Hz + double scan. + */ + if ((vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) { + ryres <<= 1; + v_total <<= 1; + v_disp <<= 1; + v_sync_strt <<= 1; + v_sync_wid <<= 1; + }; + c_sync = sync & FB_SYNC_COMP_HIGH_ACT ? CRTC_CSYNC_EN : 0; if (bpp <= 8) { - bpp = 8; - pix_width = CRTC_PIX_WIDTH_8BPP; - dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP | BYTE_ORDER_LSB_TO_MSB; - dp_chain_mask = 0x8080; + bpp = 8; + pix_width = CRTC_PIX_WIDTH_8BPP; + dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP | BYTE_ORDER_LSB_TO_MSB; + dp_chain_mask = 0x8080; } else if (bpp <= 16) { - bpp = 16; - pix_width = CRTC_PIX_WIDTH_15BPP; - dp_pix_width = HOST_15BPP | SRC_15BPP | DST_15BPP | - BYTE_ORDER_LSB_TO_MSB; - dp_chain_mask = 0x4210; + bpp = 16; + pix_width = CRTC_PIX_WIDTH_15BPP; + dp_pix_width = HOST_15BPP | SRC_15BPP | DST_15BPP | + BYTE_ORDER_LSB_TO_MSB; + dp_chain_mask = 0x4210; } else if (bpp <= 24 && M64_HAS(INTEGRATED)) { - bpp = 24; - pix_width = CRTC_PIX_WIDTH_24BPP; - dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP | BYTE_ORDER_LSB_TO_MSB; - dp_chain_mask = 0x8080; + bpp = 24; + pix_width = CRTC_PIX_WIDTH_24BPP; + dp_pix_width = HOST_8BPP | SRC_8BPP | DST_8BPP | BYTE_ORDER_LSB_TO_MSB; + dp_chain_mask = 0x8080; } else if (bpp <= 32) { - bpp = 32; - pix_width = CRTC_PIX_WIDTH_32BPP; - dp_pix_width = HOST_32BPP | SRC_32BPP | DST_32BPP | - BYTE_ORDER_LSB_TO_MSB; - dp_chain_mask = 0x8080; + bpp = 32; + pix_width = CRTC_PIX_WIDTH_32BPP; + dp_pix_width = HOST_32BPP | SRC_32BPP | DST_32BPP | + BYTE_ORDER_LSB_TO_MSB; + dp_chain_mask = 0x8080; } else - FAIL("invalid bpp"); + FAIL("invalid bpp"); if (vxres*vyres*bpp/8 > info->total_vram) - FAIL("not enough video RAM"); + FAIL("not enough video RAM"); - if ((vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED) - FAIL("invalid vmode"); +// if ((vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED) +// FAIL("invalid vmode"); /* output */ crtc->vxres = vxres; @@ -583,18 +688,97 @@ crtc->xoffset = xoffset; crtc->yoffset = yoffset; crtc->bpp = bpp; - crtc->h_tot_disp = h_total | (h_disp<<16); - crtc->h_sync_strt_wid = (h_sync_strt & 0xff) | (h_sync_dly<<8) | - ((h_sync_strt & 0x100)<<4) | (h_sync_wid<<16) | - (h_sync_pol<<21); - crtc->v_tot_disp = v_total | (v_disp<<16); - crtc->v_sync_strt_wid = v_sync_strt | (v_sync_wid<<16) | (v_sync_pol<<21); crtc->off_pitch = ((yoffset*vxres+xoffset)*bpp/64) | (vxres<<19); crtc->gen_cntl = pix_width | c_sync | CRTC_EXT_DISP_EN | CRTC_ENABLE; + /* Enable doublescan mode if requested */ + if ((vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) + crtc->gen_cntl|=CRTC_DBL_SCAN_EN; + /* Enable interlaced mode if requested */ + if ((vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) + crtc->gen_cntl|=CRTC_INTERLACE_EN; +#ifdef CONFIG_FB_ATY_GENERIC_LCD + /* We can only program the real mode parameters to the CRTC + if the LCD monitor is switched off. Otherwise we will have to + use the parameters the LCD monitor prefers, effectively setting + a completely different mode which simulates the requested + video mode. + */ + if ((info->lcd_table != 0) && ((*monitors_enabled & LCD_ON) != 0) && + ((xres > info->lcd_width) || (ryres > info->lcd_height)) + ) { + /* We cannot display the mode on the LCD. If the CRT is enabled + we can turn off the LCD. + If the CRT is off, it isn't a good idea to switch it on; we don't + know if one is connected. So it's better to fail then. + */ + if (*monitors_enabled & CRT_ON) { + printk(KERN_INFO "Disabling lcd monitor because video mode does not fit.\n"); + *monitors_enabled = *monitors_enabled & (~LCD_ON); + } else + FAIL("Video mode exceeds size of lcd monitor.\nConnect this computer to a conventional monitor if you really need this mode."); + }; + if ((info->lcd_table == 0) || ((*monitors_enabled & LCD_ON) == 0)) { +#endif + crtc->h_tot_disp = h_total | (h_disp<<16); + crtc->h_sync_strt_wid = (h_sync_strt & 0xff) | (h_sync_dly<<8) | + ((h_sync_strt & 0x100)<<4) | (h_sync_wid<<16) | + (h_sync_pol<<21); + crtc->v_tot_disp = v_total | (v_disp<<16); + crtc->v_sync_strt_wid = v_sync_strt | (v_sync_wid<<16) | (v_sync_pol<<21); +#ifdef CONFIG_FB_ATY_GENERIC_LCD + /* No hardware stretching please! */ + crtc->h_stretching = 0; + crtc->v_stretching = 0; + } else { + /* This is horror! When we simulate, say 640x480 on an 800x600 + lcd monitor, the CRTC should be programmed 800x600 values for + the non visible part, but 640x480 for the visible part. + This code has been tested on a laptop with it's 800x600 lcd + monitor and a conventional monitor both switched on. + Tested modes: 640x400, 720x400, 800x600, 320x200-doublescan, + 800x600-interlaced + */ + lcd_htotal = h_disp + info->lcd_hblank_width; + lcd_hsync_start = h_disp + info->lcd_right; + lcd_vtotal = v_disp + info->lcd_vblank_width; + lcd_vsync_start = v_disp + info->lcd_lower; + + crtc->h_tot_disp = (lcd_htotal) | (h_disp<<16); + crtc->h_sync_strt_wid = (lcd_hsync_start & 0xff) | + (info->lcd_hsync_delay<<8) | + ((lcd_hsync_start & 0x100)<<4) | + (info->lcd_hsync_width<<16); + crtc->v_tot_disp = lcd_vtotal | (v_disp<<16); + crtc->v_sync_strt_wid = lcd_vsync_start | + (info->lcd_vsync_width<<16); + /* To simulate the requested video mode, we use the hardware stretcher, + which zooms the image to the dimensions of the LCD screen. It has + two modes; replication and blending. Replication duplicates some + pixels, blending interpolates between pixels. We use blending. + The formula for blending is: + h_stretching=(source_with/dest_width)*4096 + v_stretching=(source_lines/dest_lines)*1024 + */ + if (xres != info->lcd_width) + crtc->h_stretching = (xres*4096)/info->lcd_width; + else + crtc->h_stretching = 0; + if (ryres != info->lcd_height) + crtc->v_stretching = (ryres*1024)/info->lcd_height; + else + crtc->v_stretching = 0; + /* The prefered mode for the lcd is not interlaced, so disable it if + it was enabled. For doublescan there is no problem, because we can + compensate for it in the hardware stretching (we stretch half as much) + */ + crtc->gen_cntl&=~CRTC_INTERLACE_EN; + }; + crtc->monitors_enabled = *monitors_enabled; +#endif if (M64_HAS(MAGIC_FIFO)) { - /* Not VTB/GTB */ - /* FIXME: magic FIFO values */ - crtc->gen_cntl |= aty_ld_le32(CRTC_GEN_CNTL, info) & 0x000e0000; + /* Not VTB/GTB */ + /* FIXME: magic FIFO values */ + crtc->gen_cntl |= aty_ld_le32(CRTC_GEN_CNTL, info) & 0x000e0000; } crtc->dp_pix_width = dp_pix_width; crtc->dp_chain_mask = dp_chain_mask; @@ -604,18 +788,19 @@ static int aty_crtc_to_var(const struct crtc *crtc, - struct fb_var_screeninfo *var) + struct fb_var_screeninfo *var) { u32 xres, yres, bpp, left, right, upper, lower, hslen, vslen, sync; u32 h_total, h_disp, h_sync_strt, h_sync_dly, h_sync_wid, h_sync_pol; u32 v_total, v_disp, v_sync_strt, v_sync_wid, v_sync_pol, c_sync; u32 pix_width; - + u32 double_scan, interlace; + /* input */ h_total = crtc->h_tot_disp & 0x1ff; h_disp = (crtc->h_tot_disp>>16) & 0xff; h_sync_strt = (crtc->h_sync_strt_wid & 0xff) | - ((crtc->h_sync_strt_wid>>4) & 0x100); + ((crtc->h_sync_strt_wid>>4) & 0x100); h_sync_dly = (crtc->h_sync_strt_wid>>8) & 0x7; h_sync_wid = (crtc->h_sync_strt_wid>>16) & 0x1f; h_sync_pol = (crtc->h_sync_strt_wid>>21) & 0x1; @@ -626,7 +811,9 @@ v_sync_pol = (crtc->v_sync_strt_wid>>21) & 0x1; c_sync = crtc->gen_cntl & CRTC_CSYNC_EN ? 1 : 0; pix_width = crtc->gen_cntl & CRTC_PIX_WIDTH_MASK; - + double_scan = crtc->gen_cntl & CRTC_DBL_SCAN_EN; + interlace = crtc->gen_cntl & CRTC_INTERLACE_EN; + /* convert */ xres = (h_disp+1)*8; yres = v_disp+1; @@ -637,82 +824,82 @@ lower = v_sync_strt-v_disp; vslen = v_sync_wid; sync = (h_sync_pol ? 0 : FB_SYNC_HOR_HIGH_ACT) | - (v_sync_pol ? 0 : FB_SYNC_VERT_HIGH_ACT) | - (c_sync ? FB_SYNC_COMP_HIGH_ACT : 0); + (v_sync_pol ? 0 : FB_SYNC_VERT_HIGH_ACT) | + (c_sync ? FB_SYNC_COMP_HIGH_ACT : 0); switch (pix_width) { #if 0 - case CRTC_PIX_WIDTH_4BPP: - bpp = 4; - var->red.offset = 0; - var->red.length = 8; - var->green.offset = 0; - var->green.length = 8; - var->blue.offset = 0; - var->blue.length = 8; - var->transp.offset = 0; - var->transp.length = 0; - break; -#endif - case CRTC_PIX_WIDTH_8BPP: - bpp = 8; - var->red.offset = 0; - var->red.length = 8; - var->green.offset = 0; - var->green.length = 8; - var->blue.offset = 0; - var->blue.length = 8; - var->transp.offset = 0; - var->transp.length = 0; - break; - case CRTC_PIX_WIDTH_15BPP: /* RGB 555 */ - bpp = 16; - var->red.offset = 10; - var->red.length = 5; - var->green.offset = 5; - var->green.length = 5; - var->blue.offset = 0; - var->blue.length = 5; - var->transp.offset = 0; - var->transp.length = 0; - break; + case CRTC_PIX_WIDTH_4BPP: + bpp = 4; + var->red.offset = 0; + var->red.length = 8; + var->green.offset = 0; + var->green.length = 8; + var->blue.offset = 0; + var->blue.length = 8; + var->transp.offset = 0; + var->transp.length = 0; + break; +#endif + case CRTC_PIX_WIDTH_8BPP: + bpp = 8; + var->red.offset = 0; + var->red.length = 8; + var->green.offset = 0; + var->green.length = 8; + var->blue.offset = 0; + var->blue.length = 8; + var->transp.offset = 0; + var->transp.length = 0; + break; + case CRTC_PIX_WIDTH_15BPP: /* RGB 555 */ + bpp = 16; + var->red.offset = 10; + var->red.length = 5; + var->green.offset = 5; + var->green.length = 5; + var->blue.offset = 0; + var->blue.length = 5; + var->transp.offset = 0; + var->transp.length = 0; + break; #if 0 - case CRTC_PIX_WIDTH_16BPP: /* RGB 565 */ - bpp = 16; - var->red.offset = 11; - var->red.length = 5; - var->green.offset = 5; - var->green.length = 6; - var->blue.offset = 0; - var->blue.length = 5; - var->transp.offset = 0; - var->transp.length = 0; - break; -#endif - case CRTC_PIX_WIDTH_24BPP: /* RGB 888 */ - bpp = 24; - var->red.offset = 16; - var->red.length = 8; - var->green.offset = 8; - var->green.length = 8; - var->blue.offset = 0; - var->blue.length = 8; - var->transp.offset = 0; - var->transp.length = 0; - break; - case CRTC_PIX_WIDTH_32BPP: /* ARGB 8888 */ - bpp = 32; - var->red.offset = 16; - var->red.length = 8; - var->green.offset = 8; - var->green.length = 8; - var->blue.offset = 0; - var->blue.length = 8; - var->transp.offset = 24; - var->transp.length = 8; - break; - default: - FAIL("Invalid pixel width"); + case CRTC_PIX_WIDTH_16BPP: /* RGB 565 */ + bpp = 16; + var->red.offset = 11; + var->red.length = 5; + var->green.offset = 5; + var->green.length = 6; + var->blue.offset = 0; + var->blue.length = 5; + var->transp.offset = 0; + var->transp.length = 0; + break; +#endif + case CRTC_PIX_WIDTH_24BPP: /* RGB 888 */ + bpp = 24; + var->red.offset = 16; + var->red.length = 8; + var->green.offset = 8; + var->green.length = 8; + var->blue.offset = 0; + var->blue.length = 8; + var->transp.offset = 0; + var->transp.length = 0; + break; + case CRTC_PIX_WIDTH_32BPP: /* ARGB 8888 */ + bpp = 32; + var->red.offset = 16; + var->red.length = 8; + var->green.offset = 8; + var->green.length = 8; + var->blue.offset = 0; + var->blue.length = 8; + var->transp.offset = 24; + var->transp.length = 8; + break; + default: + FAIL("Invalid pixel width"); } /* output */ @@ -731,14 +918,30 @@ var->vsync_len = vslen; var->sync = sync; var->vmode = FB_VMODE_NONINTERLACED; - + /* In double scan mode, the vertical parameters are doubled, so we need to + half them to get the right values. + In interlaced mode the values are already correct, so no correction is + necessary. + Code has been tested in 1024x768, 43 Hz interlaced and 640x480, 60 Hz + doublesscan. + */ + if (interlace) + var->vmode = FB_VMODE_INTERLACED; + if (double_scan) { + var->vmode = FB_VMODE_DOUBLE; + var->yres>>=1; + var->upper_margin>>=1; + var->lower_margin>>=1; + var->vsync_len>>=1; + }; + return 0; } /* ------------------------------------------------------------------------- */ static void atyfb_set_par(const struct atyfb_par *par, - struct fb_info_aty *info) + struct fb_info_aty *info) { u32 i; int accelmode; @@ -749,134 +952,157 @@ info->current_par = *par; if (info->blitter_may_be_busy) - wait_for_idle(info); + wait_for_idle(info); tmp = aty_ld_8(CRTC_GEN_CNTL + 3, info); aty_set_crtc(info, &par->crtc); + +#if 0 aty_st_8(CLOCK_CNTL + info->clk_wr_offset, 0, info); - /* better call aty_StrobeClock ?? */ + /* better call aty_StrobeClock ?? */ aty_st_8(CLOCK_CNTL + info->clk_wr_offset, CLOCK_STROBE, info); +#endif + aty_st_8(CLOCK_CNTL, 0, info); + aty_st_8(CLOCK_CNTL, CLOCK_STROBE | CLOCK_DIV, info); info->dac_ops->set_dac(info, &par->pll, par->crtc.bpp, accelmode); info->pll_ops->set_pll(info, &par->pll); if (!M64_HAS(INTEGRATED)) { - /* Don't forget MEM_CNTL */ - i = aty_ld_le32(MEM_CNTL, info) & 0xf0ffffff; - switch (par->crtc.bpp) { - case 8: - i |= 0x02000000; - break; - case 16: - i |= 0x03000000; - break; - case 32: - i |= 0x06000000; - break; - } - aty_st_le32(MEM_CNTL, i, info); + /* Don't forget MEM_CNTL */ + i = aty_ld_le32(MEM_CNTL, info) & 0xf0ffffff; + switch (par->crtc.bpp) { + case 8: + i |= 0x02000000; + break; + case 16: + i |= 0x03000000; + break; + case 32: + i |= 0x06000000; + break; + } + aty_st_le32(MEM_CNTL, i, info); } else { - i = aty_ld_le32(MEM_CNTL, info) & 0xf00fffff; - if (!M64_HAS(MAGIC_POSTDIV)) - i |= info->mem_refresh_rate << 20; - switch (par->crtc.bpp) { - case 8: - case 24: - i |= 0x00000000; - break; - case 16: - i |= 0x04000000; - break; - case 32: - i |= 0x08000000; - break; - } - if (M64_HAS(CT_BUS)) { - aty_st_le32(DAC_CNTL, 0x87010184, info); - aty_st_le32(BUS_CNTL, 0x680000f9, info); - } else if (M64_HAS(VT_BUS)) { - aty_st_le32(DAC_CNTL, 0x87010184, info); - aty_st_le32(BUS_CNTL, 0x680000f9, info); - } else if (M64_HAS(MOBIL_BUS)) { - aty_st_le32(DAC_CNTL, 0x80010102, info); - aty_st_le32(BUS_CNTL, 0x7b33a040, info); - } else { - /* GT */ - aty_st_le32(DAC_CNTL, 0x86010102, info); - aty_st_le32(BUS_CNTL, 0x7b23a040, info); - aty_st_le32(EXT_MEM_CNTL, - aty_ld_le32(EXT_MEM_CNTL, info) | 0x5000001, info); - } - aty_st_le32(MEM_CNTL, i, info); + i = aty_ld_le32(MEM_CNTL, info) & 0xf00fffff; + if (!M64_HAS(MAGIC_POSTDIV)) + i |= info->mem_refresh_rate << 20; + switch (par->crtc.bpp) { + case 8: + case 24: + i |= 0x00000000; + break; + case 16: + i |= 0x04000000; + break; + case 32: + i |= 0x08000000; + break; + } + if (M64_HAS(CT_BUS)) { + aty_st_le32(DAC_CNTL, 0x87010184, info); + aty_st_le32(BUS_CNTL, 0x680000f9, info); + } else if (M64_HAS(VT_BUS)) { + aty_st_le32(DAC_CNTL, 0x87010184, info); + aty_st_le32(BUS_CNTL, 0x680000f9, info); + } else if (M64_HAS(MOBIL_BUS)) { + aty_st_le32(DAC_CNTL, 0x80010102, info); + aty_st_le32(BUS_CNTL, 0x7b33a040, info); + } else { + /* GT */ + aty_st_le32(DAC_CNTL, 0x86010102, info); + aty_st_le32(BUS_CNTL, 0x7b23a040, info); + aty_st_le32(EXT_MEM_CNTL, + aty_ld_le32(EXT_MEM_CNTL, info) | 0x5000001, info); + } + aty_st_le32(MEM_CNTL, i, info); } aty_st_8(DAC_MASK, 0xff, info); /* Initialize the graphics engine */ if (par->accel_flags & FB_ACCELF_TEXT) - aty_init_engine(par, info); + aty_init_engine(par, info); #ifdef CONFIG_FB_COMPAT_XPMAC if (!console_fb_info || console_fb_info == &info->fb_info) { - struct fb_var_screeninfo var; - int vmode, cmode; - display_info.height = ((par->crtc.v_tot_disp>>16) & 0x7ff)+1; - display_info.width = (((par->crtc.h_tot_disp>>16) & 0xff)+1)*8; - display_info.depth = par->crtc.bpp; - display_info.pitch = par->crtc.vxres*par->crtc.bpp/8; - atyfb_encode_var(&var, par, info); - if (mac_var_to_vmode(&var, &vmode, &cmode)) - display_info.mode = 0; - else - display_info.mode = vmode; - strcpy(display_info.name, atyfb_name); - display_info.fb_address = info->frame_buffer_phys; - display_info.cmap_adr_address = info->ati_regbase_phys+0xc0; - display_info.cmap_data_address = info->ati_regbase_phys+0xc1; - display_info.disp_reg_address = info->ati_regbase_phys; + struct fb_var_screeninfo var; + int vmode, cmode; + display_info.height = ((par->crtc.v_tot_disp>>16) & 0x7ff)+1; + display_info.width = (((par->crtc.h_tot_disp>>16) & 0xff)+1)*8; + display_info.depth = par->crtc.bpp; + display_info.pitch = par->crtc.vxres*par->crtc.bpp/8; + atyfb_encode_var(&var, par, info); + if (mac_var_to_vmode(&var, &vmode, &cmode)) + display_info.mode = 0; + else + display_info.mode = vmode; + strcpy(display_info.name, atyfb_name); + display_info.fb_address = info->frame_buffer_phys; + display_info.cmap_adr_address = info->ati_regbase_phys+0xc0; + display_info.cmap_data_address = info->ati_regbase_phys+0xc1; + display_info.disp_reg_address = info->ati_regbase_phys; } #endif /* CONFIG_FB_COMPAT_XPMAC */ #ifdef CONFIG_BOOTX_TEXT btext_update_display(info->frame_buffer_phys, - (((par->crtc.h_tot_disp>>16) & 0xff)+1)*8, - ((par->crtc.v_tot_disp>>16) & 0x7ff)+1, - par->crtc.bpp, - par->crtc.vxres*par->crtc.bpp/8); + (((par->crtc.h_tot_disp>>16) & 0xff)+1)*8, + ((par->crtc.v_tot_disp>>16) & 0x7ff)+1, + par->crtc.bpp, + par->crtc.vxres*par->crtc.bpp/8); #endif /* CONFIG_BOOTX_TEXT */ } static int atyfb_decode_var(const struct fb_var_screeninfo *var, - struct atyfb_par *par, - const struct fb_info_aty *info) + struct atyfb_par *par, + const struct fb_info_aty *info, + u32 monitors_enabled) { int err; + u32 pixclock,xres; - if ((err = aty_var_to_crtc(info, var, &par->crtc)) || - (err = info->pll_ops->var_to_pll(info, var->pixclock, par->crtc.bpp, - &par->pll))) - return err; + err = aty_var_to_crtc(info, var, &par->crtc, &monitors_enabled); + if (err == 0) { + /* Alert! aty_var_to_crtc can modify monitors_enabled which is + important for the pixclock decision */ + pixclock = var->pixclock; + xres = 0; +#ifdef CONFIG_FB_ATY_GENERIC_LCD + if ((info->lcd_table != 0) && ((monitors_enabled & LCD_ON) != 0)) { + pixclock = info->lcd_pixclock; + xres = var->xres; + }; +#endif + if (pixclock == 0) { + FAIL("Invalid pixclock"); + } else + err = info->pll_ops->var_to_pll(info, pixclock, par->crtc.bpp, xres, + &par->pll); + }; + if (err != 0) + return err; if (var->accel_flags & FB_ACCELF_TEXT) - par->accel_flags = FB_ACCELF_TEXT; + par->accel_flags = FB_ACCELF_TEXT; else - par->accel_flags = 0; + par->accel_flags = 0; #if 0 /* fbmon is not done. uncomment for 2.5.x -brad */ - if (!fbmon_valid_timings(var->pixclock, htotal, vtotal, info)) - return -EINVAL; + if (!fbmon_valid_timings(pixclock, htotal, vtotal, info)) + return -EINVAL; #endif return 0; } static int atyfb_encode_var(struct fb_var_screeninfo *var, - const struct atyfb_par *par, - const struct fb_info_aty *info) + const struct atyfb_par *par, + const struct fb_info_aty *info) { int err; memset(var, 0, sizeof(struct fb_var_screeninfo)); if ((err = aty_crtc_to_var(&par->crtc, var))) - return err; + return err; var->pixclock = info->pll_ops->pll_to_var(info, &par->pll); var->height = -1; @@ -889,7 +1115,7 @@ static void set_off_pitch(struct atyfb_par *par, - const struct fb_info_aty *info) + const struct fb_info_aty *info) { u32 xoffset = par->crtc.xoffset; u32 yoffset = par->crtc.yoffset; @@ -912,11 +1138,11 @@ struct fb_info_aty *fb = (struct fb_info_aty *)info; if (user) { - fb->open++; - fb->mmaped = 0; - fb->vtconsole = -1; + fb->open++; + fb->mmaped = 0; + fb->vtconsole = -1; } else { - fb->consolecnt++; + fb->consolecnt++; } #endif return(0); @@ -936,42 +1162,42 @@ struct fb_info_aty *fb = (struct fb_info_aty *)info; if (user) { - fb->open--; - mdelay(1); - wait_for_idle(fb); - if (!fb->open) { - int was_mmaped = fb->mmaped; - - fb->mmaped = 0; - if (fb->vtconsole != -1) - vt_cons[fb->vtconsole]->vc_mode = KD_TEXT; - fb->vtconsole = -1; - - if (was_mmaped) { - struct fb_var_screeninfo var; - - /* Now reset the default display config, we have no - * idea what the program(s) which mmap'd the chip did - * to the configuration, nor whether it restored it - * correctly. - */ - var = default_var; - if (noaccel) - var.accel_flags &= ~FB_ACCELF_TEXT; - else - var.accel_flags |= FB_ACCELF_TEXT; - if (var.yres == var.yres_virtual) { - u32 vram = (fb->total_vram - (PAGE_SIZE << 2)); - var.yres_virtual = ((vram * 8) / var.bits_per_pixel) / - var.xres_virtual; - if (var.yres_virtual < var.yres) - var.yres_virtual = var.yres; - } - atyfb_set_var(&var, -1, &fb->fb_info); - } - } + fb->open--; + mdelay(1); + wait_for_idle(fb); + if (!fb->open) { + int was_mmaped = fb->mmaped; + + fb->mmaped = 0; + if (fb->vtconsole != -1) + vt_cons[fb->vtconsole]->vc_mode = KD_TEXT; + fb->vtconsole = -1; + + if (was_mmaped) { + struct fb_var_screeninfo var; + + /* Now reset the default display config, we have no + * idea what the program(s) which mmap'd the chip did + * to the configuration, nor whether it restored it + * correctly. + */ + var = default_var; + if (noaccel) + var.accel_flags &= ~FB_ACCELF_TEXT; + else + var.accel_flags |= FB_ACCELF_TEXT; + if (var.yres == var.yres_virtual) { + u32 vram = (fb->total_vram - (PAGE_SIZE << 2)); + var.yres_virtual = ((vram * 8) / var.bits_per_pixel) / + var.xres_virtual; + if (var.yres_virtual < var.yres) + var.yres_virtual = var.yres; + } + atyfb_set_var(&var, -1, &fb->fb_info); + } + } } else { - fb->consolecnt--; + fb->consolecnt--; } #endif return(0); @@ -979,8 +1205,8 @@ static int encode_fix(struct fb_fix_screeninfo *fix, - const struct atyfb_par *par, - const struct fb_info_aty *info) + const struct atyfb_par *par, + const struct fb_info_aty *info) { memset(fix, 0, sizeof(struct fb_fix_screeninfo)); @@ -993,27 +1219,27 @@ * Reg Block 1 (multimedia extensions) is at ati_regbase_phys-0x400 */ if (M64_HAS(GX)) { - fix->mmio_start = info->ati_regbase_phys; - fix->mmio_len = 0x400; - fix->accel = FB_ACCEL_ATI_MACH64GX; + fix->mmio_start = info->ati_regbase_phys; + fix->mmio_len = 0x400; + fix->accel = FB_ACCEL_ATI_MACH64GX; } else if (M64_HAS(CT)) { - fix->mmio_start = info->ati_regbase_phys; - fix->mmio_len = 0x400; - fix->accel = FB_ACCEL_ATI_MACH64CT; + fix->mmio_start = info->ati_regbase_phys; + fix->mmio_len = 0x400; + fix->accel = FB_ACCEL_ATI_MACH64CT; } else if (M64_HAS(VT)) { - fix->mmio_start = info->ati_regbase_phys-0x400; - fix->mmio_len = 0x800; - fix->accel = FB_ACCEL_ATI_MACH64VT; + fix->mmio_start = info->ati_regbase_phys-0x400; + fix->mmio_len = 0x800; + fix->accel = FB_ACCEL_ATI_MACH64VT; } else /* if (M64_HAS(GT)) */ { - fix->mmio_start = info->ati_regbase_phys-0x400; - fix->mmio_len = 0x800; - fix->accel = FB_ACCEL_ATI_MACH64GT; + fix->mmio_start = info->ati_regbase_phys-0x400; + fix->mmio_len = 0x800; + fix->accel = FB_ACCEL_ATI_MACH64GT; } fix->type = FB_TYPE_PACKED_PIXELS; fix->type_aux = 0; fix->line_length = par->crtc.vxres*par->crtc.bpp/8; fix->visual = par->crtc.bpp <= 8 ? FB_VISUAL_PSEUDOCOLOR - : FB_VISUAL_DIRECTCOLOR; + : FB_VISUAL_DIRECTCOLOR; fix->ywrapstep = 0; fix->xpanstep = 8; fix->ypanstep = 1; @@ -1027,15 +1253,18 @@ */ static int atyfb_get_fix(struct fb_fix_screeninfo *fix, int con, - struct fb_info *fb) + struct fb_info *fb) { const struct fb_info_aty *info = (struct fb_info_aty *)fb; struct atyfb_par par; if (con == -1) - par = info->default_par; + par = info->default_par; else - atyfb_decode_var(&fb_display[con].var, &par, info); + /* The monitors_enabled information is not important for + the calculation of the information in par that encode_fix + needs, so we pass a 0. */ + atyfb_decode_var(&fb_display[con].var, &par, info, 0); encode_fix(fix, &par, info); return 0; } @@ -1046,125 +1275,185 @@ */ static int atyfb_get_var(struct fb_var_screeninfo *var, int con, - struct fb_info *fb) + struct fb_info *fb) { const struct fb_info_aty *info = (struct fb_info_aty *)fb; if (con == -1) - atyfb_encode_var(var, &info->default_par, info); + atyfb_encode_var(var, &info->default_par, info); else - *var = fb_display[con].var; + *var = fb_display[con].var; return 0; } static void atyfb_set_dispsw(struct display *disp, struct fb_info_aty *info, - int bpp, int accel) + int bpp, int accel) { - switch (bpp) { + switch (bpp) { #ifdef FBCON_HAS_CFB8 - case 8: - info->dispsw = accel ? fbcon_aty8 : fbcon_cfb8; - disp->dispsw = &info->dispsw; - break; + case 8: + info->dispsw = accel ? fbcon_aty8 : fbcon_cfb8; + disp->dispsw = &info->dispsw; + break; #endif #ifdef FBCON_HAS_CFB16 - case 16: - info->dispsw = accel ? fbcon_aty16 : fbcon_cfb16; - disp->dispsw = &info->dispsw; - disp->dispsw_data = info->fbcon_cmap.cfb16; - break; + case 16: + info->dispsw = accel ? fbcon_aty16 : fbcon_cfb16; + disp->dispsw = &info->dispsw; + disp->dispsw_data = info->fbcon_cmap.cfb16; + break; #endif #ifdef FBCON_HAS_CFB24 - case 24: - info->dispsw = accel ? fbcon_aty24 : fbcon_cfb24; - disp->dispsw = &info->dispsw; - disp->dispsw_data = info->fbcon_cmap.cfb24; - break; + case 24: + info->dispsw = accel ? fbcon_aty24 : fbcon_cfb24; + disp->dispsw = &info->dispsw; + disp->dispsw_data = info->fbcon_cmap.cfb24; + break; #endif #ifdef FBCON_HAS_CFB32 - case 32: - info->dispsw = accel ? fbcon_aty32 : fbcon_cfb32; - disp->dispsw = &info->dispsw; - disp->dispsw_data = info->fbcon_cmap.cfb32; - break; -#endif - default: - disp->dispsw = &fbcon_dummy; - } + case 32: + info->dispsw = accel ? fbcon_aty32 : fbcon_cfb32; + disp->dispsw = &info->dispsw; + disp->dispsw_data = info->fbcon_cmap.cfb32; + break; +#endif + default: + disp->dispsw = &fbcon_dummy; + } #ifdef CONFIG_FB_ATY_CT - if (info->cursor) { - info->dispsw.cursor = atyfb_cursor; - info->dispsw.set_font = atyfb_set_font; - } + if (info->cursor) { + info->dispsw.cursor = atyfb_cursor; + info->dispsw.set_font = atyfb_set_font; + } #endif /* CONFIG_FB_ATY_CT */ } + /* + * In the display mode set code we need to make desisions depending on + * wether the LCD or CRT monitor is enabled. + * This is going to give problems in the unlikely case that someone + * for example turns on the LCD monitor just after we tested what + * monitors are enabled. Since the consequences are very serious + * (the graphic card crashes and sends the wrong signals to the lcd + * monitor which gets brighter and brighter; to prevent it from + * damage the computer must be switched off as soon as possible) + * we need to prevent this. + * + * As far as I know there is no way to prevent people switching on the + * LCD monitor while we are programming the video card. So the best way + * to do it, is detect what monitors are enabled before programming the + * video chip. After programming the video chip, we write this information + * back to the video chip, switching the LCD off again if someone enabled + * it. But isn't the card already crashed before we have the chance to + * turn the display back off? I don't think so because the CRTC is disabled + * while we program it. + */ + +#ifdef CONFIG_FB_ATY_GENERIC_LCD +static u32 atyfb_monitors_enabled(struct fb_info_aty *info) { + if (info->lcd_table != 0) { + return aty_ld_lcd(LCD_GEN_CTRL, info) & 3; + }; + return 0; +}; +#else +#define atyfb_monitors_enabled(info) 0 +#endif /* * Set the User Defined Part of the Display */ static int atyfb_set_var(struct fb_var_screeninfo *var, int con, - struct fb_info *fb) + struct fb_info *fb) { struct fb_info_aty *info = (struct fb_info_aty *)fb; struct atyfb_par par; struct display *display; int oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel, accel, err; int activate = var->activate; + u32 monitors_enabled; if (con >= 0) - display = &fb_display[con]; + display = &fb_display[con]; else - display = fb->disp; /* used during initialization */ + display = fb->disp; /* used during initialization */ + + monitors_enabled = atyfb_monitors_enabled(info); - if ((err = atyfb_decode_var(var, &par, info))) - return err; + /* + * We have to be very carefull with encode_var for LCD_panels. Fbdev + * applications do not know about LCD monitors. We have to make them + * think they are using a CRT. That means that alltough the video + * chip is programmed for the resolution of the LCD monitor (say 800x600), + * the applications expect the mode they asked for, say 640x480 + * + * So when a program asks for 640x480, atyfb_decode_var sets the crtc + * registers for 800x600. Then atyfb_encode_var calculates the crtc + * registers back into the var variable, but now the var variable + * will contain wrong values for 800x600! Result: wrong information is + * returned to the program! + * + * To counter this, we call atyfb_decode_var first like if there is no + * lcd monitor switched on. Then we call atyfb_decode_var. Now + * the correct information is returned to the program, but the values + * for the crtc registers are not suited for the LCD monitor. We call + * atyfb_decode_var again to calculate the registers again, this time + * with the right monitors_enabled. + */ + + if ((err = atyfb_decode_var(var, &par, info, CRT_ON))) + return err; atyfb_encode_var(var, &par, (struct fb_info_aty *)info); +#ifdef CONFIG_FB_ATY_GENERIC_LCD + if ((err = atyfb_decode_var(var, &par, info, monitors_enabled))) + return err; +#endif + if ((activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) { - oldxres = display->var.xres; - oldyres = display->var.yres; - oldvxres = display->var.xres_virtual; - oldvyres = display->var.yres_virtual; - oldbpp = display->var.bits_per_pixel; - oldaccel = display->var.accel_flags; - display->var = *var; - accel = var->accel_flags & FB_ACCELF_TEXT; - if (oldxres != var->xres || oldyres != var->yres || - oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || - oldbpp != var->bits_per_pixel || oldaccel != var->accel_flags) { - struct fb_fix_screeninfo fix; - - encode_fix(&fix, &par, info); - display->screen_base = (char *)info->frame_buffer; - display->visual = fix.visual; - display->type = fix.type; - display->type_aux = fix.type_aux; - display->ypanstep = fix.ypanstep; - display->ywrapstep = fix.ywrapstep; - display->line_length = fix.line_length; - display->can_soft_blank = 1; - display->inverse = 0; - if (accel) - display->scrollmode = (info->bus_type == PCI) ? SCROLL_YNOMOVE : 0; - else - display->scrollmode = SCROLL_YREDRAW; - if (info->fb_info.changevar) - (*info->fb_info.changevar)(con); - } - if (!info->fb_info.display_fg || - info->fb_info.display_fg->vc_num == con) { - atyfb_set_par(&par, info); - atyfb_set_dispsw(display, info, par.crtc.bpp, accel); - } - if (oldbpp != var->bits_per_pixel) { - if ((err = fb_alloc_cmap(&display->cmap, 0, 0))) - return err; - do_install_cmap(con, &info->fb_info); - } + oldxres = display->var.xres; + oldyres = display->var.yres; + oldvxres = display->var.xres_virtual; + oldvyres = display->var.yres_virtual; + oldbpp = display->var.bits_per_pixel; + oldaccel = display->var.accel_flags; + display->var = *var; + accel = var->accel_flags & FB_ACCELF_TEXT; + if (oldxres != var->xres || oldyres != var->yres || + oldvxres != var->xres_virtual || oldvyres != var->yres_virtual || + oldbpp != var->bits_per_pixel || oldaccel != var->accel_flags) { + struct fb_fix_screeninfo fix; + + encode_fix(&fix, &par, info); + display->screen_base = (char *)info->frame_buffer; + display->visual = fix.visual; + display->type = fix.type; + display->type_aux = fix.type_aux; + display->ypanstep = fix.ypanstep; + display->ywrapstep = fix.ywrapstep; + display->line_length = fix.line_length; + display->can_soft_blank = 1; + display->inverse = 0; + if (accel) + display->scrollmode = (info->bus_type == PCI) ? SCROLL_YNOMOVE : 0; + else + display->scrollmode = SCROLL_YREDRAW; + if (info->fb_info.changevar) + (*info->fb_info.changevar)(con); + } + if (!info->fb_info.display_fg || + info->fb_info.display_fg->vc_num == con) { + atyfb_set_par(&par, info); + atyfb_set_dispsw(display, info, par.crtc.bpp, accel); + } + if (oldbpp != var->bits_per_pixel) { + if ((err = fb_alloc_cmap(&display->cmap, 0, 0))) + return err; + do_install_cmap(con, &info->fb_info); + } } return 0; @@ -1178,7 +1467,7 @@ */ static int atyfb_pan_display(struct fb_var_screeninfo *var, int con, - struct fb_info *fb) + struct fb_info *fb) { struct fb_info_aty *info = (struct fb_info_aty *)fb; u32 xres, yres, xoffset, yoffset; @@ -1189,7 +1478,7 @@ xoffset = (var->xoffset+7) & ~7; yoffset = var->yoffset; if (xoffset+xres > par->crtc.vxres || yoffset+yres > par->crtc.vyres) - return -EINVAL; + return -EINVAL; par->crtc.xoffset = xoffset; par->crtc.yoffset = yoffset; set_off_pitch(par, info); @@ -1201,15 +1490,15 @@ */ static int atyfb_get_cmap(struct fb_cmap *cmap, int kspc, int con, - struct fb_info *info) + struct fb_info *info) { if (!info->display_fg || con == info->display_fg->vc_num) /* current console? */ - return fb_get_cmap(cmap, kspc, atyfb_getcolreg, info); + return fb_get_cmap(cmap, kspc, atyfb_getcolreg, info); else if (fb_display[con].cmap.len) /* non default colormap? */ - fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); + fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2); else { - int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256; - fb_copy_cmap(fb_default_cmap(size), cmap, kspc ? 0 : 2); + int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256; + fb_copy_cmap(fb_default_cmap(size), cmap, kspc ? 0 : 2); } return 0; } @@ -1219,54 +1508,32 @@ */ static int atyfb_set_cmap(struct fb_cmap *cmap, int kspc, int con, - struct fb_info *info) + struct fb_info *info) { int err; struct display *disp; if (con >= 0) - disp = &fb_display[con]; + disp = &fb_display[con]; else disp = info->disp; - if (!disp->cmap.len) { /* no colormap allocated? */ - int size = disp->var.bits_per_pixel == 16 ? 32 : 256; - if ((err = fb_alloc_cmap(&disp->cmap, size, 0))) - return err; + if (!disp->cmap.len) { /* no colormap allocated? */ + int size = disp->var.bits_per_pixel == 16 ? 32 : 256; + if ((err = fb_alloc_cmap(&disp->cmap, size, 0))) + return err; } - if (!info->display_fg || con == info->display_fg->vc_num) /* current console? */ - return fb_set_cmap(cmap, kspc, atyfb_setcolreg, info); + if (!info->display_fg || con == info->display_fg->vc_num) /* current console? */ + return fb_set_cmap(cmap, kspc, atyfb_setcolreg, info); else - fb_copy_cmap(cmap, &disp->cmap, kspc ? 0 : 1); + fb_copy_cmap(cmap, &disp->cmap, kspc ? 0 : 1); return 0; } -#ifdef DEBUG -#define ATYIO_CLKR 0x41545900 /* ATY\00 */ -#define ATYIO_CLKW 0x41545901 /* ATY\01 */ - -struct atyclk { - u32 ref_clk_per; - u8 pll_ref_div; - u8 mclk_fb_div; - u8 mclk_post_div; /* 1,2,3,4,8 */ - u8 vclk_fb_div; - u8 vclk_post_div; /* 1,2,3,4,6,8,12 */ - u32 dsp_xclks_per_row; /* 0-16383 */ - u32 dsp_loop_latency; /* 0-15 */ - u32 dsp_precision; /* 0-7 */ - u32 dsp_on; /* 0-2047 */ - u32 dsp_off; /* 0-2047 */ -}; - -#define ATYIO_FEATR 0x41545902 /* ATY\02 */ -#define ATYIO_FEATW 0x41545903 /* ATY\03 */ -#endif - static int atyfb_ioctl(struct inode *inode, struct file *file, u_int cmd, - u_long arg, int con, struct fb_info *info2) + u_long arg, int con, struct fb_info *info2) { -#if defined(__sparc__) || (defined(DEBUG) && defined(CONFIG_FB_ATY_CT)) +#if defined(__sparc__) struct fb_info_aty *info = (struct fb_info_aty *)info2; #endif /* __sparc__ || DEBUG */ #ifdef __sparc__ @@ -1274,7 +1541,7 @@ struct display *disp; if (con >= 0) - disp = &fb_display[con]; + disp = &fb_display[con]; else disp = info2->disp; #endif @@ -1282,72 +1549,18 @@ switch (cmd) { #ifdef __sparc__ case FBIOGTYPE: - fbtyp.fb_type = FBTYPE_PCI_GENERIC; - fbtyp.fb_width = info->current_par.crtc.vxres; - fbtyp.fb_height = info->current_par.crtc.vyres; - fbtyp.fb_depth = info->current_par.crtc.bpp; - fbtyp.fb_cmsize = disp->cmap.len; - fbtyp.fb_size = info->total_vram; - if (copy_to_user((struct fbtype *)arg, &fbtyp, sizeof(fbtyp))) - return -EFAULT; - break; + fbtyp.fb_type = FBTYPE_PCI_GENERIC; + fbtyp.fb_width = info->current_par.crtc.vxres; + fbtyp.fb_height = info->current_par.crtc.vyres; + fbtyp.fb_depth = info->current_par.crtc.bpp; + fbtyp.fb_cmsize = disp->cmap.len; + fbtyp.fb_size = info->total_vram; + if (copy_to_user((struct fbtype *)arg, &fbtyp, sizeof(fbtyp))) + return -EFAULT; + break; #endif /* __sparc__ */ -#if defined(DEBUG) && defined(CONFIG_FB_ATY_CT) - case ATYIO_CLKR: - if (M64_HAS(INTEGRATED)) { - struct atyclk clk; - union aty_pll *pll = &info->current_par.pll; - u32 dsp_config = pll->ct.dsp_config; - u32 dsp_on_off = pll->ct.dsp_on_off; - clk.ref_clk_per = info->ref_clk_per; - clk.pll_ref_div = pll->ct.pll_ref_div; - clk.mclk_fb_div = pll->ct.mclk_fb_div; - clk.mclk_post_div = pll->ct.mclk_post_div_real; - clk.vclk_fb_div = pll->ct.vclk_fb_div; - clk.vclk_post_div = pll->ct.vclk_post_div_real; - clk.dsp_xclks_per_row = dsp_config & 0x3fff; - clk.dsp_loop_latency = (dsp_config>>16) & 0xf; - clk.dsp_precision = (dsp_config>>20) & 7; - clk.dsp_on = dsp_on_off & 0x7ff; - clk.dsp_off = (dsp_on_off>>16) & 0x7ff; - if (copy_to_user((struct atyclk *)arg, &clk, sizeof(clk))) - return -EFAULT; - } else - return -EINVAL; - break; - case ATYIO_CLKW: - if (M64_HAS(INTEGRATED)) { - struct atyclk clk; - union aty_pll *pll = &info->current_par.pll; - if (copy_from_user(&clk, (struct atyclk *)arg, sizeof(clk))) - return -EFAULT; - info->ref_clk_per = clk.ref_clk_per; - pll->ct.pll_ref_div = clk.pll_ref_div; - pll->ct.mclk_fb_div = clk.mclk_fb_div; - pll->ct.mclk_post_div_real = clk.mclk_post_div; - pll->ct.vclk_fb_div = clk.vclk_fb_div; - pll->ct.vclk_post_div_real = clk.vclk_post_div; - pll->ct.dsp_config = (clk.dsp_xclks_per_row & 0x3fff) | - ((clk.dsp_loop_latency & 0xf)<<16) | - ((clk.dsp_precision & 7)<<20); - pll->ct.dsp_on_off = (clk.dsp_on & 0x7ff) | - ((clk.dsp_off & 0x7ff)<<16); - aty_calc_pll_ct(info, &pll->ct); - aty_set_pll_ct(info, pll); - } else - return -EINVAL; - break; - case ATYIO_FEATR: - if (get_user(info->features, (u32 *)arg)) - return -EFAULT; - break; - case ATYIO_FEATW: - if (put_user(info->features, (u32 *)arg)) - return -EFAULT; - break; -#endif /* DEBUG && CONFIG_FB_ATY_CT */ default: - return -EINVAL; + return -EINVAL; } return 0; } @@ -1357,148 +1570,148 @@ struct fb_info_aty *fb = (struct fb_info_aty *)info; if (fb->blitter_may_be_busy) - wait_for_idle(fb); + wait_for_idle(fb); return 0; } #ifdef __sparc__ static int atyfb_mmap(struct fb_info *info, struct file *file, - struct vm_area_struct *vma) + struct vm_area_struct *vma) { - struct fb_info_aty *fb = (struct fb_info_aty *)info; - unsigned int size, page, map_size = 0; - unsigned long map_offset = 0; - unsigned long off; - int i; - - if (!fb->mmap_map) - return -ENXIO; - - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) - return -EINVAL; - - off = vma->vm_pgoff << PAGE_SHIFT; - size = vma->vm_end - vma->vm_start; - - /* To stop the swapper from even considering these pages. */ - vma->vm_flags |= (VM_SHM | VM_LOCKED); - - if (((vma->vm_pgoff == 0) && (size == fb->total_vram)) || - ((off == fb->total_vram) && (size == PAGE_SIZE))) - off += 0x8000000000000000UL; - - vma->vm_pgoff = off >> PAGE_SHIFT; /* propagate off changes */ - - /* Each page, see which map applies */ - for (page = 0; page < size; ) { - map_size = 0; - for (i = 0; fb->mmap_map[i].size; i++) { - unsigned long start = fb->mmap_map[i].voff; - unsigned long end = start + fb->mmap_map[i].size; - unsigned long offset = off + page; - - if (start > offset) - continue; - if (offset >= end) - continue; - - map_size = fb->mmap_map[i].size - (offset - start); - map_offset = fb->mmap_map[i].poff + (offset - start); - break; - } - if (!map_size) { - page += PAGE_SIZE; - continue; - } - if (page + map_size > size) - map_size = size - page; - - pgprot_val(vma->vm_page_prot) &= ~(fb->mmap_map[i].prot_mask); - pgprot_val(vma->vm_page_prot) |= fb->mmap_map[i].prot_flag; - - if (remap_page_range(vma->vm_start + page, map_offset, - map_size, vma->vm_page_prot)) - return -EAGAIN; - - page += map_size; - } - - if (!map_size) - return -EINVAL; - - vma->vm_flags |= VM_IO; - - if (!fb->mmaped) { - int lastconsole = 0; - - if (info->display_fg) - lastconsole = info->display_fg->vc_num; - fb->mmaped = 1; - if (fb->consolecnt && fb_display[lastconsole].fb_info == info) { - fb->vtconsole = lastconsole; - vt_cons[lastconsole]->vc_mode = KD_GRAPHICS; - } - } - return 0; + struct fb_info_aty *fb = (struct fb_info_aty *)info; + unsigned int size, page, map_size = 0; + unsigned long map_offset = 0; + unsigned long off; + int i; + + if (!fb->mmap_map) + return -ENXIO; + + if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) + return -EINVAL; + + off = vma->vm_pgoff << PAGE_SHIFT; + size = vma->vm_end - vma->vm_start; + + /* To stop the swapper from even considering these pages. */ + vma->vm_flags |= (VM_SHM | VM_LOCKED); + + if (((vma->vm_pgoff == 0) && (size == fb->total_vram)) || + ((off == fb->total_vram) && (size == PAGE_SIZE))) + off += 0x8000000000000000UL; + + vma->vm_pgoff = off >> PAGE_SHIFT; /* propagate off changes */ + + /* Each page, see which map applies */ + for (page = 0; page < size; ) { + map_size = 0; + for (i = 0; fb->mmap_map[i].size; i++) { + unsigned long start = fb->mmap_map[i].voff; + unsigned long end = start + fb->mmap_map[i].size; + unsigned long offset = off + page; + + if (start > offset) + continue; + if (offset >= end) + continue; + + map_size = fb->mmap_map[i].size - (offset - start); + map_offset = fb->mmap_map[i].poff + (offset - start); + break; + } + if (!map_size) { + page += PAGE_SIZE; + continue; + } + if (page + map_size > size) + map_size = size - page; + + pgprot_val(vma->vm_page_prot) &= ~(fb->mmap_map[i].prot_mask); + pgprot_val(vma->vm_page_prot) |= fb->mmap_map[i].prot_flag; + + if (remap_page_range(vma->vm_start + page, map_offset, + map_size, vma->vm_page_prot)) + return -EAGAIN; + + page += map_size; + } + + if (!map_size) + return -EINVAL; + + vma->vm_flags |= VM_IO; + + if (!fb->mmaped) { + int lastconsole = 0; + + if (info->display_fg) + lastconsole = info->display_fg->vc_num; + fb->mmaped = 1; + if (fb->consolecnt && fb_display[lastconsole].fb_info == info) { + fb->vtconsole = lastconsole; + vt_cons[lastconsole]->vc_mode = KD_GRAPHICS; + } + } + return 0; } static struct { - u32 yoffset; - u8 r[2][256]; - u8 g[2][256]; - u8 b[2][256]; + u32 yoffset; + u8 r[2][256]; + u8 g[2][256]; + u8 b[2][256]; } atyfb_save; static void atyfb_save_palette(struct fb_info *fb, int enter) { - struct fb_info_aty *info = (struct fb_info_aty *)fb; - int i, tmp; + struct fb_info_aty *info = (struct fb_info_aty *)fb; + int i, tmp; - for (i = 0; i < 256; i++) { - tmp = aty_ld_8(DAC_CNTL, info) & 0xfc; - if (M64_HAS(EXTRA_BRIGHT)) - tmp |= 0x2; - aty_st_8(DAC_CNTL, tmp, info); - aty_st_8(DAC_MASK, 0xff, info); - - writeb(i, &info->aty_cmap_regs->rindex); - atyfb_save.r[enter][i] = readb(&info->aty_cmap_regs->lut); - atyfb_save.g[enter][i] = readb(&info->aty_cmap_regs->lut); - atyfb_save.b[enter][i] = readb(&info->aty_cmap_regs->lut); - writeb(i, &info->aty_cmap_regs->windex); - writeb(atyfb_save.r[1-enter][i], &info->aty_cmap_regs->lut); - writeb(atyfb_save.g[1-enter][i], &info->aty_cmap_regs->lut); - writeb(atyfb_save.b[1-enter][i], &info->aty_cmap_regs->lut); - } + for (i = 0; i < 256; i++) { + tmp = aty_ld_8(DAC_CNTL, info) & 0xfc; + if (M64_HAS(EXTRA_BRIGHT)) + tmp |= 0x2; + aty_st_8(DAC_CNTL, tmp, info); + aty_st_8(DAC_MASK, 0xff, info); + + writeb(i, &info->aty_cmap_regs->rindex); + atyfb_save.r[enter][i] = readb(&info->aty_cmap_regs->lut); + atyfb_save.g[enter][i] = readb(&info->aty_cmap_regs->lut); + atyfb_save.b[enter][i] = readb(&info->aty_cmap_regs->lut); + writeb(i, &info->aty_cmap_regs->windex); + writeb(atyfb_save.r[1-enter][i], &info->aty_cmap_regs->lut); + writeb(atyfb_save.g[1-enter][i], &info->aty_cmap_regs->lut); + writeb(atyfb_save.b[1-enter][i], &info->aty_cmap_regs->lut); + } } static void atyfb_palette(int enter) { - struct fb_info_aty *info; - struct atyfb_par *par; - struct display *d; - int i; - - for (i = 0; i < MAX_NR_CONSOLES; i++) { - d = &fb_display[i]; - if (d->fb_info && - d->fb_info->fbops == &atyfb_ops && - d->fb_info->display_fg && - d->fb_info->display_fg->vc_num == i) { - atyfb_save_palette(d->fb_info, enter); - info = (struct fb_info_aty *)d->fb_info; - par = &info->current_par; - if (enter) { - atyfb_save.yoffset = par->crtc.yoffset; - par->crtc.yoffset = 0; - set_off_pitch(par, info); - } else { - par->crtc.yoffset = atyfb_save.yoffset; - set_off_pitch(par, info); - } - break; - } - } + struct fb_info_aty *info; + struct atyfb_par *par; + struct display *d; + int i; + + for (i = 0; i < MAX_NR_CONSOLES; i++) { + d = &fb_display[i]; + if (d->fb_info && + d->fb_info->fbops == &atyfb_ops && + d->fb_info->display_fg && + d->fb_info->display_fg->vc_num == i) { + atyfb_save_palette(d->fb_info, enter); + info = (struct fb_info_aty *)d->fb_info; + par = &info->current_par; + if (enter) { + atyfb_save.yoffset = par->crtc.yoffset; + par->crtc.yoffset = 0; + set_off_pitch(par, info); + } else { + par->crtc.yoffset = atyfb_save.yoffset; + set_off_pitch(par, info); + } + break; + } + } } #endif /* __sparc__ */ @@ -1516,117 +1729,117 @@ */ static int aty_power_mgmt_LT(int sleep, struct fb_info_aty *info) { - unsigned int pm; - int timeout; - - pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); - pm = (pm & ~PWR_MGT_MODE_MASK) | PWR_MGT_MODE_REG; - aty_st_le32(POWER_MANAGEMENT_LG, pm, info); - pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); - - timeout = 200000; - if (sleep) { - /* Sleep */ - pm &= ~PWR_MGT_ON; - aty_st_le32(POWER_MANAGEMENT_LG, pm, info); - pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); - udelay(10); - pm &= ~(PWR_BLON | AUTO_PWR_UP); - pm |= SUSPEND_NOW; - aty_st_le32(POWER_MANAGEMENT_LG, pm, info); - pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); - udelay(10); - pm |= PWR_MGT_ON; - aty_st_le32(POWER_MANAGEMENT_LG, pm, info); - do { - pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); - udelay(10); - if ((--timeout) == 0) - break; - } while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND); - } else { - /* Wakeup */ - pm &= ~PWR_MGT_ON; - aty_st_le32(POWER_MANAGEMENT_LG, pm, info); - pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); - udelay(10); - pm |= (PWR_BLON | AUTO_PWR_UP); - pm &= ~SUSPEND_NOW; - aty_st_le32(POWER_MANAGEMENT_LG, pm, info); - pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); - udelay(10); - pm |= PWR_MGT_ON; - aty_st_le32(POWER_MANAGEMENT_LG, pm, info); - do { - pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); - udelay(10); - if ((--timeout) == 0) - break; - } while ((pm & PWR_MGT_STATUS_MASK) != 0); - } - mdelay(500); + unsigned int pm; + int timeout; + + pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); + pm = (pm & ~PWR_MGT_MODE_MASK) | PWR_MGT_MODE_REG; + aty_st_le32(POWER_MANAGEMENT_LG, pm, info); + pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); + + timeout = 200000; + if (sleep) { + /* Sleep */ + pm &= ~PWR_MGT_ON; + aty_st_le32(POWER_MANAGEMENT_LG, pm, info); + pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); + udelay(10); + pm &= ~(PWR_BLON | AUTO_PWR_UP); + pm |= SUSPEND_NOW; + aty_st_le32(POWER_MANAGEMENT_LG, pm, info); + pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); + udelay(10); + pm |= PWR_MGT_ON; + aty_st_le32(POWER_MANAGEMENT_LG, pm, info); + do { + pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); + udelay(10); + if ((--timeout) == 0) + break; + } while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND); + } else { + /* Wakeup */ + pm &= ~PWR_MGT_ON; + aty_st_le32(POWER_MANAGEMENT_LG, pm, info); + pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); + udelay(10); + pm |= (PWR_BLON | AUTO_PWR_UP); + pm &= ~SUSPEND_NOW; + aty_st_le32(POWER_MANAGEMENT_LG, pm, info); + pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); + udelay(10); + pm |= PWR_MGT_ON; + aty_st_le32(POWER_MANAGEMENT_LG, pm, info); + do { + pm = aty_ld_le32(POWER_MANAGEMENT_LG, info); + udelay(10); + if ((--timeout) == 0) + break; + } while ((pm & PWR_MGT_STATUS_MASK) != 0); + } + mdelay(500); - return timeout ? PBOOK_SLEEP_OK : PBOOK_SLEEP_REFUSE; + return timeout ? PBOOK_SLEEP_OK : PBOOK_SLEEP_REFUSE; } static int aty_power_mgmt_LTPro(int sleep, struct fb_info_aty *info) { - unsigned int pm; - int timeout; - - pm = aty_ld_lcd(POWER_MANAGEMENT, info); - pm = (pm & ~PWR_MGT_MODE_MASK) | PWR_MGT_MODE_REG; - aty_st_lcd(POWER_MANAGEMENT, pm, info); - pm = aty_ld_lcd(POWER_MANAGEMENT, info); - - timeout = 200; - if (sleep) { - /* Sleep */ - pm &= ~PWR_MGT_ON; - aty_st_lcd(POWER_MANAGEMENT, pm, info); - pm = aty_ld_lcd(POWER_MANAGEMENT, info); - udelay(10); - pm &= ~(PWR_BLON | AUTO_PWR_UP); - pm |= SUSPEND_NOW; - aty_st_lcd(POWER_MANAGEMENT, pm, info); - pm = aty_ld_lcd(POWER_MANAGEMENT, info); - udelay(10); - pm |= PWR_MGT_ON; - aty_st_lcd(POWER_MANAGEMENT, pm, info); - do { - pm = aty_ld_lcd(POWER_MANAGEMENT, info); - mdelay(1); - if ((--timeout) == 0) - break; - } while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND); - } else { - /* Wakeup */ - pm &= ~PWR_MGT_ON; - aty_st_lcd(POWER_MANAGEMENT, pm, info); - pm = aty_ld_lcd(POWER_MANAGEMENT, info); - udelay(10); - pm &= ~SUSPEND_NOW; - pm |= (PWR_BLON | AUTO_PWR_UP); - aty_st_lcd(POWER_MANAGEMENT, pm, info); - pm = aty_ld_lcd(POWER_MANAGEMENT, info); - udelay(10); - pm |= PWR_MGT_ON; - aty_st_lcd(POWER_MANAGEMENT, pm, info); - do { - pm = aty_ld_lcd(POWER_MANAGEMENT, info); - mdelay(1); - if ((--timeout) == 0) - break; - } while ((pm & PWR_MGT_STATUS_MASK) != 0); - } + unsigned int pm; + int timeout; + + pm = aty_ld_lcd(POWER_MANAGEMENT, info); + pm = (pm & ~PWR_MGT_MODE_MASK) | PWR_MGT_MODE_REG; + aty_st_lcd(POWER_MANAGEMENT, pm, info); + pm = aty_ld_lcd(POWER_MANAGEMENT, info); + + timeout = 200; + if (sleep) { + /* Sleep */ + pm &= ~PWR_MGT_ON; + aty_st_lcd(POWER_MANAGEMENT, pm, info); + pm = aty_ld_lcd(POWER_MANAGEMENT, info); + udelay(10); + pm &= ~(PWR_BLON | AUTO_PWR_UP); + pm |= SUSPEND_NOW; + aty_st_lcd(POWER_MANAGEMENT, pm, info); + pm = aty_ld_lcd(POWER_MANAGEMENT, info); + udelay(10); + pm |= PWR_MGT_ON; + aty_st_lcd(POWER_MANAGEMENT, pm, info); + do { + pm = aty_ld_lcd(POWER_MANAGEMENT, info); + mdelay(1); + if ((--timeout) == 0) + break; + } while ((pm & PWR_MGT_STATUS_MASK) != PWR_MGT_STATUS_SUSPEND); + } else { + /* Wakeup */ + pm &= ~PWR_MGT_ON; + aty_st_lcd(POWER_MANAGEMENT, pm, info); + pm = aty_ld_lcd(POWER_MANAGEMENT, info); + udelay(10); + pm &= ~SUSPEND_NOW; + pm |= (PWR_BLON | AUTO_PWR_UP); + aty_st_lcd(POWER_MANAGEMENT, pm, info); + pm = aty_ld_lcd(POWER_MANAGEMENT, info); + udelay(10); + pm |= PWR_MGT_ON; + aty_st_lcd(POWER_MANAGEMENT, pm, info); + do { + pm = aty_ld_lcd(POWER_MANAGEMENT, info); + mdelay(1); + if ((--timeout) == 0) + break; + } while ((pm & PWR_MGT_STATUS_MASK) != 0); + } - return timeout ? PBOOK_SLEEP_OK : PBOOK_SLEEP_REFUSE; + return timeout ? PBOOK_SLEEP_OK : PBOOK_SLEEP_REFUSE; } static int aty_power_mgmt(int sleep, struct fb_info_aty *info) { return M64_HAS(LT_SLEEP) ? aty_power_mgmt_LT(sleep, info) - : aty_power_mgmt_LTPro(sleep, info); + : aty_power_mgmt_LTPro(sleep, info); } /* @@ -1635,72 +1848,72 @@ */ static int aty_sleep_notify(struct pmu_sleep_notifier *self, int when) { - struct fb_info_aty *info; - int result; + struct fb_info_aty *info; + int result; - result = PBOOK_SLEEP_OK; + result = PBOOK_SLEEP_OK; - for (info = first_display; info != NULL; info = info->next) { - struct fb_fix_screeninfo fix; - int nb; - - atyfb_get_fix(&fix, fg_console, (struct fb_info *)info); - nb = fb_display[fg_console].var.yres * fix.line_length; - - switch (when) { - case PBOOK_SLEEP_REQUEST: - info->save_framebuffer = vmalloc(nb); - if (info->save_framebuffer == NULL) - return PBOOK_SLEEP_REFUSE; - break; - case PBOOK_SLEEP_REJECT: - if (info->save_framebuffer) { - vfree(info->save_framebuffer); - info->save_framebuffer = 0; - } - break; - case PBOOK_SLEEP_NOW: - if (currcon >= 0) - fb_display[currcon].dispsw = &fbcon_dummy; - if (info->blitter_may_be_busy) - wait_for_idle(info); - /* Stop accel engine (stop bus mastering) */ - if (info->current_par.accel_flags & FB_ACCELF_TEXT) - aty_reset_engine(info); - - /* Backup fb content */ - if (info->save_framebuffer) - memcpy_fromio(info->save_framebuffer, - (void *)info->frame_buffer, nb); - - /* Blank display and LCD */ - atyfbcon_blank(VESA_POWERDOWN+1, (struct fb_info *)info); - - /* Set chip to "suspend" mode */ - result = aty_power_mgmt(1, info); - break; - case PBOOK_WAKE: - /* Wakeup chip */ - result = aty_power_mgmt(0, info); - - /* Restore fb content */ - if (info->save_framebuffer) { - memcpy_toio((void *)info->frame_buffer, - info->save_framebuffer, nb); - vfree(info->save_framebuffer); - info->save_framebuffer = 0; - } - /* Restore display */ - if (currcon >= 0) { - atyfb_set_dispsw(&fb_display[currcon], - info, info->current_par.crtc.bpp, - info->current_par.accel_flags & FB_ACCELF_TEXT); - } - atyfbcon_blank(0, (struct fb_info *)info); - break; - } - } - return result; + for (info = first_display; info != NULL; info = info->next) { + struct fb_fix_screeninfo fix; + int nb; + + atyfb_get_fix(&fix, fg_console, (struct fb_info *)info); + nb = fb_display[fg_console].var.yres * fix.line_length; + + switch (when) { + case PBOOK_SLEEP_REQUEST: + info->save_framebuffer = vmalloc(nb); + if (info->save_framebuffer == NULL) + return PBOOK_SLEEP_REFUSE; + break; + case PBOOK_SLEEP_REJECT: + if (info->save_framebuffer) { + vfree(info->save_framebuffer); + info->save_framebuffer = 0; + } + break; + case PBOOK_SLEEP_NOW: + if (currcon >= 0) + fb_display[currcon].dispsw = &fbcon_dummy; + if (info->blitter_may_be_busy) + wait_for_idle(info); + /* Stop accel engine (stop bus mastering) */ + if (info->current_par.accel_flags & FB_ACCELF_TEXT) + aty_reset_engine(info); + + /* Backup fb content */ + if (info->save_framebuffer) + memcpy_fromio(info->save_framebuffer, + (void *)info->frame_buffer, nb); + + /* Blank display and LCD */ + atyfbcon_blank(VESA_POWERDOWN+1, (struct fb_info *)info); + + /* Set chip to "suspend" mode */ + result = aty_power_mgmt(1, info); + break; + case PBOOK_WAKE: + /* Wakeup chip */ + result = aty_power_mgmt(0, info); + + /* Restore fb content */ + if (info->save_framebuffer) { + memcpy_toio((void *)info->frame_buffer, + info->save_framebuffer, nb); + vfree(info->save_framebuffer); + info->save_framebuffer = 0; + } + /* Restore display */ + if (currcon >= 0) { + atyfb_set_dispsw(&fb_display[currcon], + info, info->current_par.crtc.bpp, + info->current_par.accel_flags & FB_ACCELF_TEXT); + } + atyfbcon_blank(0, (struct fb_info *)info); + break; + } + } + return result; } static struct pmu_sleep_notifier aty_sleep_notifier = { @@ -1715,38 +1928,38 @@ */ static int backlight_conv[] = { - 0x00, 0x3f, 0x4c, 0x59, 0x66, 0x73, 0x80, 0x8d, - 0x9a, 0xa7, 0xb4, 0xc1, 0xcf, 0xdc, 0xe9, 0xff + 0x00, 0x3f, 0x4c, 0x59, 0x66, 0x73, 0x80, 0x8d, + 0x9a, 0xa7, 0xb4, 0xc1, 0xcf, 0xdc, 0xe9, 0xff }; static int aty_set_backlight_enable(int on, int level, void* data) { - struct fb_info_aty *info = (struct fb_info_aty *)data; - unsigned int reg = aty_ld_lcd(LCD_MISC_CNTL, info); - - reg |= (BLMOD_EN | BIASMOD_EN); - if (on && level > BACKLIGHT_OFF) { - reg &= ~BIAS_MOD_LEVEL_MASK; - reg |= (backlight_conv[level] << BIAS_MOD_LEVEL_SHIFT); - } else { - reg &= ~BIAS_MOD_LEVEL_MASK; - reg |= (backlight_conv[0] << BIAS_MOD_LEVEL_SHIFT); - } - aty_st_lcd(LCD_MISC_CNTL, reg, info); + struct fb_info_aty *info = (struct fb_info_aty *)data; + unsigned int reg = aty_ld_lcd(LCD_MISC_CNTL, info); + + reg |= (BLMOD_EN | BIASMOD_EN); + if (on && level > BACKLIGHT_OFF) { + reg &= ~BIAS_MOD_LEVEL_MASK; + reg |= (backlight_conv[level] << BIAS_MOD_LEVEL_SHIFT); + } else { + reg &= ~BIAS_MOD_LEVEL_MASK; + reg |= (backlight_conv[0] << BIAS_MOD_LEVEL_SHIFT); + } + aty_st_lcd(LCD_MISC_CNTL, reg, info); - return 0; + return 0; } static int aty_set_backlight_level(int level, void* data) { - return aty_set_backlight_enable(1, level, data); + return aty_set_backlight_enable(1, level, data); } static struct backlight_controller aty_backlight_controller = { - aty_set_backlight_enable, - aty_set_backlight_level + aty_set_backlight_enable, + aty_set_backlight_level }; #endif /* CONFIG_PMAC_BACKLIGHT */ @@ -1768,25 +1981,27 @@ u16 type; u8 rev; const char *chipname = NULL, *ramname = NULL, *xtal; - int pll, mclk, gtb_memsize; + int pll, mclk, xclk, gtb_memsize; #if defined(CONFIG_PPC) int sense; #endif u8 pll_ref_div; + u32 monitors_enabled; info->aty_cmap_regs = (struct aty_cmap_regs *)(info->ati_regbase+0xc0); chip_id = aty_ld_le32(CONFIG_CHIP_ID, info); type = chip_id & CFG_CHIP_TYPE; rev = (chip_id & CFG_CHIP_REV)>>24; for (j = 0; j < (sizeof(aty_chips)/sizeof(*aty_chips)); j++) - if (type == aty_chips[j].chip_type && - (rev & aty_chips[j].rev_mask) == aty_chips[j].rev_val) { - chipname = aty_chips[j].name; - pll = aty_chips[j].pll; - mclk = aty_chips[j].mclk; - info->features = aty_chips[j].features; - goto found; - } + if (type == aty_chips[j].chip_type && + (rev & aty_chips[j].rev_mask) == aty_chips[j].rev_val) { + chipname = aty_chips[j].name; + pll = aty_chips[j].pll; + mclk = aty_chips[j].mclk; + xclk = aty_chips[j].xclk; + info->features = aty_chips[j].features; + goto found; + } printk("atyfb: Unknown mach64 0x%04x rev 0x%04x\n", type, rev); return 0; @@ -1794,208 +2009,253 @@ printk("atyfb: %s [0x%04x rev 0x%02x] ", chipname, type, rev); #ifdef CONFIG_FB_ATY_GX if (!M64_HAS(INTEGRATED)) { - u32 stat0; - u8 dac_type, dac_subtype, clk_type; - stat0 = aty_ld_le32(CONFIG_STAT0, info); - info->bus_type = (stat0 >> 0) & 0x07; - info->ram_type = (stat0 >> 3) & 0x07; - ramname = aty_gx_ram[info->ram_type]; - /* FIXME: clockchip/RAMDAC probing? */ - dac_type = (aty_ld_le32(DAC_CNTL, info) >> 16) & 0x07; + u32 stat0; + u8 dac_type, dac_subtype, clk_type; + stat0 = aty_ld_le32(CONFIG_STAT0, info); + info->bus_type = (stat0 >> 0) & 0x07; + info->ram_type = (stat0 >> 3) & 0x07; + ramname = aty_gx_ram[info->ram_type]; + /* FIXME: clockchip/RAMDAC probing? */ + dac_type = (aty_ld_le32(DAC_CNTL, info) >> 16) & 0x07; #ifdef CONFIG_ATARI - clk_type = CLK_ATI18818_1; - dac_type = (stat0 >> 9) & 0x07; - if (dac_type == 0x07) - dac_subtype = DAC_ATT20C408; - else - dac_subtype = (aty_ld_8(SCRATCH_REG1 + 1, info) & 0xF0) | dac_type; + clk_type = CLK_ATI18818_1; + dac_type = (stat0 >> 9) & 0x07; + if (dac_type == 0x07) + dac_subtype = DAC_ATT20C408; + else + dac_subtype = (aty_ld_8(SCRATCH_REG1 + 1, info) & 0xF0) | dac_type; #else - dac_type = DAC_IBMRGB514; - dac_subtype = DAC_IBMRGB514; - clk_type = CLK_IBMRGB514; -#endif - switch (dac_subtype) { - case DAC_IBMRGB514: - info->dac_ops = &aty_dac_ibm514; - break; - case DAC_ATI68860_B: - case DAC_ATI68860_C: - info->dac_ops = &aty_dac_ati68860b; - break; - case DAC_ATT20C408: - case DAC_ATT21C498: - info->dac_ops = &aty_dac_att21c498; - break; - default: - printk(" atyfb_set_par: DAC type not implemented yet!\n"); - info->dac_ops = &aty_dac_unsupported; - break; - } - switch (clk_type) { - case CLK_ATI18818_1: - info->pll_ops = &aty_pll_ati18818_1; - break; - case CLK_STG1703: - info->pll_ops = &aty_pll_stg1703; - break; - case CLK_CH8398: - info->pll_ops = &aty_pll_ch8398; - break; - case CLK_ATT20C408: - info->pll_ops = &aty_pll_att20c408; - break; - case CLK_IBMRGB514: - info->pll_ops = &aty_pll_ibm514; - break; - default: - printk(" atyfb_set_par: CLK type not implemented yet!"); - info->pll_ops = &aty_pll_unsupported; - break; - } + dac_type = DAC_IBMRGB514; + dac_subtype = DAC_IBMRGB514; + clk_type = CLK_IBMRGB514; +#endif + switch (dac_subtype) { + case DAC_IBMRGB514: + info->dac_ops = &aty_dac_ibm514; + break; + case DAC_ATI68860_B: + case DAC_ATI68860_C: + info->dac_ops = &aty_dac_ati68860b; + break; + case DAC_ATT20C408: + case DAC_ATT21C498: + info->dac_ops = &aty_dac_att21c498; + break; + default: + printk(" atyfb_set_par: DAC type not implemented yet!\n"); + info->dac_ops = &aty_dac_unsupported; + break; + } + switch (clk_type) { + case CLK_ATI18818_1: + info->pll_ops = &aty_pll_ati18818_1; + break; + case CLK_STG1703: + info->pll_ops = &aty_pll_stg1703; + break; + case CLK_CH8398: + info->pll_ops = &aty_pll_ch8398; + break; + case CLK_ATT20C408: + info->pll_ops = &aty_pll_att20c408; + break; + case CLK_IBMRGB514: + info->pll_ops = &aty_pll_ibm514; + break; + default: + printk(" atyfb_set_par: CLK type not implemented yet!"); + info->pll_ops = &aty_pll_unsupported; + break; + } } #endif /* CONFIG_FB_ATY_GX */ #ifdef CONFIG_FB_ATY_CT if (M64_HAS(INTEGRATED)) { - info->bus_type = PCI; - info->ram_type = (aty_ld_le32(CONFIG_STAT0, info) & 0x07); - ramname = aty_ct_ram[info->ram_type]; - info->dac_ops = &aty_dac_ct; - info->pll_ops = &aty_pll_ct; - /* for many chips, the mclk is 67 MHz for SDRAM, 63 MHz otherwise */ - if (mclk == 67 && info->ram_type < SDRAM) - mclk = 63; + info->bus_type = PCI; + info->ram_type = (aty_ld_le32(CONFIG_STAT0, info) & 0x07); + ramname = aty_ct_ram[info->ram_type]; + info->dac_ops = &aty_dac_ct; + info->pll_ops = &aty_pll_ct; +#ifdef CONFIG_ALL_PPC + /* The Apple iBook1 uses non-standard memory frequencies. We detect it + and set the frequency manually. */ + if ((type==0x4c4e) && machine_is_compatible("PowerBook2,1")) { + mclk=70; + xclk=53; + }; +#endif + /* + * I disable the hack below because it is completely unreliable. + * DRAM at 67 is very well imaginable. If a chip is indeed clocked + * below it's official clock rate because it is equiped with + * too slow memory the driver information table + * in the BIOS will contain the right value. So if you need it + * write code to scan the driver information table, it will work + * in any case the chip is clocked lower than the official rate + * instead of just cases where the mclk is 67 MHz. + * (Daniel Mantione, 25 may 2003) + */ + /* for many chips, the mclk is 67 MHz for SDRAM, 63 MHz otherwise */ +/* if (xclk == 67 && info->ram_type < SDRAM) + xclk = 63;*/ } #endif /* CONFIG_FB_ATY_CT */ info->ref_clk_per = 1000000000000ULL/14318180; xtal = "14.31818"; if (M64_HAS(GTB_DSP) && (pll_ref_div = aty_ld_pll(PLL_REF_DIV, info))) { - int diff1, diff2; - diff1 = 510*14/pll_ref_div-pll; - diff2 = 510*29/pll_ref_div-pll; - if (diff1 < 0) - diff1 = -diff1; - if (diff2 < 0) - diff2 = -diff2; - if (diff2 < diff1) { - info->ref_clk_per = 1000000000000ULL/29498928; - xtal = "29.498928"; - } + int diff1, diff2; + diff1 = 510*14/pll_ref_div-pll; + diff2 = 510*29/pll_ref_div-pll; + if (diff1 < 0) + diff1 = -diff1; + if (diff2 < 0) + diff2 = -diff2; + if (diff2 < diff1) { + info->ref_clk_per = 1000000000000ULL/29498928; + xtal = "29.498928"; + } } i = aty_ld_le32(MEM_CNTL, info); gtb_memsize = M64_HAS(GTB_DSP); if (gtb_memsize) - switch (i & 0xF) { /* 0xF used instead of MEM_SIZE_ALIAS */ - case MEM_SIZE_512K: - info->total_vram = 0x80000; - break; - case MEM_SIZE_1M: - info->total_vram = 0x100000; - break; - case MEM_SIZE_2M_GTB: - info->total_vram = 0x200000; - break; - case MEM_SIZE_4M_GTB: - info->total_vram = 0x400000; - break; - case MEM_SIZE_6M_GTB: - info->total_vram = 0x600000; - break; - case MEM_SIZE_8M_GTB: - info->total_vram = 0x800000; - break; - default: - info->total_vram = 0x80000; - } + switch (i & 0xF) { /* 0xF used instead of MEM_SIZE_ALIAS */ + case MEM_SIZE_512K: + info->total_vram = 0x80000; + break; + case MEM_SIZE_1M: + info->total_vram = 0x100000; + break; + case MEM_SIZE_2M_GTB: + info->total_vram = 0x200000; + break; + case MEM_SIZE_4M_GTB: + info->total_vram = 0x400000; + break; + case MEM_SIZE_6M_GTB: + info->total_vram = 0x600000; + break; + case MEM_SIZE_8M_GTB: + info->total_vram = 0x800000; + break; + default: + info->total_vram = 0x80000; + } else - switch (i & MEM_SIZE_ALIAS) { - case MEM_SIZE_512K: - info->total_vram = 0x80000; - break; - case MEM_SIZE_1M: - info->total_vram = 0x100000; - break; - case MEM_SIZE_2M: - info->total_vram = 0x200000; - break; - case MEM_SIZE_4M: - info->total_vram = 0x400000; - break; - case MEM_SIZE_6M: - info->total_vram = 0x600000; - break; - case MEM_SIZE_8M: - info->total_vram = 0x800000; - break; - default: - info->total_vram = 0x80000; - } + switch (i & MEM_SIZE_ALIAS) { + case MEM_SIZE_512K: + info->total_vram = 0x80000; + break; + case MEM_SIZE_1M: + info->total_vram = 0x100000; + break; + case MEM_SIZE_2M: + info->total_vram = 0x200000; + break; + case MEM_SIZE_4M: + info->total_vram = 0x400000; + break; + case MEM_SIZE_6M: + info->total_vram = 0x600000; + break; + case MEM_SIZE_8M: + info->total_vram = 0x800000; + break; + default: + info->total_vram = 0x80000; + } if (M64_HAS(MAGIC_VRAM_SIZE)) { - if (aty_ld_le32(CONFIG_STAT1, info) & 0x40000000) - info->total_vram += 0x400000; + if (aty_ld_le32(CONFIG_STAT1, info) & 0x40000000) + info->total_vram += 0x400000; } if (default_vram) { - info->total_vram = default_vram*1024; - i = i & ~(gtb_memsize ? 0xF : MEM_SIZE_ALIAS); - if (info->total_vram <= 0x80000) - i |= MEM_SIZE_512K; - else if (info->total_vram <= 0x100000) - i |= MEM_SIZE_1M; - else if (info->total_vram <= 0x200000) - i |= gtb_memsize ? MEM_SIZE_2M_GTB : MEM_SIZE_2M; - else if (info->total_vram <= 0x400000) - i |= gtb_memsize ? MEM_SIZE_4M_GTB : MEM_SIZE_4M; - else if (info->total_vram <= 0x600000) - i |= gtb_memsize ? MEM_SIZE_6M_GTB : MEM_SIZE_6M; - else - i |= gtb_memsize ? MEM_SIZE_8M_GTB : MEM_SIZE_8M; - aty_st_le32(MEM_CNTL, i, info); + info->total_vram = default_vram*1024; + i = i & ~(gtb_memsize ? 0xF : MEM_SIZE_ALIAS); + if (info->total_vram <= 0x80000) + i |= MEM_SIZE_512K; + else if (info->total_vram <= 0x100000) + i |= MEM_SIZE_1M; + else if (info->total_vram <= 0x200000) + i |= gtb_memsize ? MEM_SIZE_2M_GTB : MEM_SIZE_2M; + else if (info->total_vram <= 0x400000) + i |= gtb_memsize ? MEM_SIZE_4M_GTB : MEM_SIZE_4M; + else if (info->total_vram <= 0x600000) + i |= gtb_memsize ? MEM_SIZE_6M_GTB : MEM_SIZE_6M; + else + i |= gtb_memsize ? MEM_SIZE_8M_GTB : MEM_SIZE_8M; + aty_st_le32(MEM_CNTL, i, info); } if (default_pll) - pll = default_pll; + pll = default_pll; if (default_mclk) - mclk = default_mclk; - - printk("%d%c %s, %s MHz XTAL, %d MHz PLL, %d Mhz MCLK\n", - info->total_vram == 0x80000 ? 512 : (info->total_vram >> 20), - info->total_vram == 0x80000 ? 'K' : 'M', ramname, xtal, pll, mclk); - - if (mclk < 44) - info->mem_refresh_rate = 0; /* 000 = 10 Mhz - 43 Mhz */ - else if (mclk < 50) - info->mem_refresh_rate = 1; /* 001 = 44 Mhz - 49 Mhz */ - else if (mclk < 55) - info->mem_refresh_rate = 2; /* 010 = 50 Mhz - 54 Mhz */ - else if (mclk < 66) - info->mem_refresh_rate = 3; /* 011 = 55 Mhz - 65 Mhz */ - else if (mclk < 75) - info->mem_refresh_rate = 4; /* 100 = 66 Mhz - 74 Mhz */ - else if (mclk < 80) - info->mem_refresh_rate = 5; /* 101 = 75 Mhz - 79 Mhz */ - else if (mclk < 100) - info->mem_refresh_rate = 6; /* 110 = 80 Mhz - 100 Mhz */ + mclk = default_mclk; + if (default_xclk) + xclk = default_xclk; + + printk("%d%c %s, %s MHz XTAL, %d MHz PLL, %d Mhz MCLK, %d Mhz XCLK\n", + info->total_vram == 0x80000 ? 512 : (info->total_vram >> 20), + info->total_vram == 0x80000 ? 'K' : 'M', ramname, xtal, pll, mclk, + xclk); + + if (xclk < 44) + info->mem_refresh_rate = 0; /* 000 = 10 Mhz - 43 Mhz */ + else if (xclk < 50) + info->mem_refresh_rate = 1; /* 001 = 44 Mhz - 49 Mhz */ + else if (xclk < 55) + info->mem_refresh_rate = 2; /* 010 = 50 Mhz - 54 Mhz */ + else if (xclk < 66) + info->mem_refresh_rate = 3; /* 011 = 55 Mhz - 65 Mhz */ + else if (xclk < 75) + info->mem_refresh_rate = 4; /* 100 = 66 Mhz - 74 Mhz */ + else if (xclk < 80) + info->mem_refresh_rate = 5; /* 101 = 75 Mhz - 79 Mhz */ + else if (xclk < 100) + info->mem_refresh_rate = 6; /* 110 = 80 Mhz - 100 Mhz */ else - info->mem_refresh_rate = 7; /* 111 = 100 Mhz and above */ + info->mem_refresh_rate = 7; /* 111 = 100 Mhz and above */ info->pll_per = 1000000/pll; - info->mclk_per = 1000000/mclk; + if ((mclk < 0) || (xclk < 0)) { + info->mclk_per = 0; + info->xclk_per = 0; + } else { + info->mclk_per = 1000000/mclk; + info->xclk_per = 1000000/xclk; + }; #ifdef DEBUG if (M64_HAS(INTEGRATED)) { - int i; - printk("BUS_CNTL DAC_CNTL MEM_CNTL EXT_MEM_CNTL CRTC_GEN_CNTL " - "DSP_CONFIG DSP_ON_OFF\n" - "%08x %08x %08x %08x %08x %08x %08x\n" - "PLL", - aty_ld_le32(BUS_CNTL, info), aty_ld_le32(DAC_CNTL, info), - aty_ld_le32(MEM_CNTL, info), aty_ld_le32(EXT_MEM_CNTL, info), - aty_ld_le32(CRTC_GEN_CNTL, info), aty_ld_le32(DSP_CONFIG, info), - aty_ld_le32(DSP_ON_OFF, info)); - for (i = 0; i < 16; i++) - printk(" %02x", aty_ld_pll(i, info)); - printk("\n"); + int i; + printk("BUS_CNTL DAC_CNTL MEM_CNTL EXT_MEM_CNTL CRTC_GEN_CNTL " + "DSP_CONFIG DSP_ON_OFF CLOCK_CNTL\n" + "%08x %08x %08x %08x %08x %08x %08x %08x\n" + "PLL", + aty_ld_le32(BUS_CNTL, info), aty_ld_le32(DAC_CNTL, info), + aty_ld_le32(MEM_CNTL, info), aty_ld_le32(EXT_MEM_CNTL, info), + aty_ld_le32(CRTC_GEN_CNTL, info), aty_ld_le32(DSP_CONFIG, info), + aty_ld_le32(DSP_ON_OFF, info), aty_ld_le32(CLOCK_CNTL ,info)); + for (i = 0; i < 40; i++) + printk(" %02x", aty_ld_pll(i, info)); + printk("\n"); + } +#endif + info->pll_ops->init_pll(info); +#ifdef DEBUG + if (M64_HAS(INTEGRATED)) { + int i; + printk("BUS_CNTL DAC_CNTL MEM_CNTL EXT_MEM_CNTL CRTC_GEN_CNTL " + "DSP_CONFIG DSP_ON_OFF\n" + "%08x %08x %08x %08x %08x %08x %08x\n" + "PLL", + aty_ld_le32(BUS_CNTL, info), aty_ld_le32(DAC_CNTL, info), + aty_ld_le32(MEM_CNTL, info), aty_ld_le32(EXT_MEM_CNTL, info), + aty_ld_le32(CRTC_GEN_CNTL, info), aty_ld_le32(DSP_CONFIG, info), + aty_ld_le32(DSP_ON_OFF, info)); + for (i = 0; i < 40; i++) + printk(" %02x", aty_ld_pll(i, info)); + printk("\n"); } #endif @@ -2005,8 +2265,8 @@ * the full 8 MB of video RAM on 8 MB boards */ if (info->total_vram == 0x800000 || - (info->bus_type == ISA && info->total_vram == 0x400000)) - info->total_vram -= GUI_RESERVE; + (info->bus_type == ISA && info->total_vram == 0x400000)) + info->total_vram -= GUI_RESERVE; /* Clear the video memory */ fb_memset((void *)info->frame_buffer, 0, info->total_vram); @@ -2026,12 +2286,12 @@ #ifdef CONFIG_PMAC_BACKLIGHT if (M64_HAS(G3_PB_1_1) && machine_is_compatible("PowerBook1,1")) { - /* these bits let the 101 powerbook wake up from sleep -- paulus */ - aty_st_lcd(POWER_MANAGEMENT, aty_ld_lcd(POWER_MANAGEMENT, info) - | (USE_F32KHZ | TRISTATE_MEM_EN), info); + /* these bits let the 101 powerbook wake up from sleep -- paulus */ + aty_st_lcd(POWER_MANAGEMENT, aty_ld_lcd(POWER_MANAGEMENT, info) + | (USE_F32KHZ | TRISTATE_MEM_EN), info); } if (M64_HAS(MOBIL_BUS)) - register_backlight_controller(&aty_backlight_controller, info, "ati"); + register_backlight_controller(&aty_backlight_controller, info, "ati"); #endif /* CONFIG_PMAC_BACKLIGHT */ #ifdef MODULE @@ -2040,53 +2300,53 @@ memset(&var, 0, sizeof(var)); #ifdef CONFIG_PPC if (_machine == _MACH_Pmac) { - /* - * FIXME: The NVRAM stuff should be put in a Mac-specific file, as it - * applies to all Mac video cards - */ - if (mode_option) { - if (!mac_find_mode(&var, &info->fb_info, mode_option, 8)) - var = default_var; - } else { - if (default_vmode == VMODE_CHOOSE) { - if (M64_HAS(G3_PB_1024x768)) - /* G3 PowerBook with 1024x768 LCD */ - default_vmode = VMODE_1024_768_60; - else if (machine_is_compatible("iMac")) - default_vmode = VMODE_1024_768_75; - else if (machine_is_compatible("PowerBook2,1")) - /* iBook with 800x600 LCD */ - default_vmode = VMODE_800_600_60; - else - default_vmode = VMODE_640_480_67; - sense = read_aty_sense(info); - printk(KERN_INFO "atyfb: monitor sense=%x, mode %d\n", - sense, mac_map_monitor_sense(sense)); - } - if (default_vmode <= 0 || default_vmode > VMODE_MAX) - default_vmode = VMODE_640_480_60; + /* + * FIXME: The NVRAM stuff should be put in a Mac-specific file, as it + * applies to all Mac video cards + */ + if (mode_option) { + if (!mac_find_mode(&var, &info->fb_info, mode_option, 8)) + var = default_var; + } else { + if (default_vmode == VMODE_CHOOSE) { + if (M64_HAS(G3_PB_1024x768)) + /* G3 PowerBook with 1024x768 LCD */ + default_vmode = VMODE_1024_768_60; + else if (machine_is_compatible("iMac")) + default_vmode = VMODE_1024_768_75; + else if (machine_is_compatible("PowerBook2,1")) + /* iBook with 800x600 LCD */ + default_vmode = VMODE_800_600_60; + else + default_vmode = VMODE_640_480_67; + sense = read_aty_sense(info); + printk(KERN_INFO "atyfb: monitor sense=%x, mode %d\n", + sense, mac_map_monitor_sense(sense)); + } + if (default_vmode <= 0 || default_vmode > VMODE_MAX) + default_vmode = VMODE_640_480_60; #ifdef CONFIG_NVRAM - if (default_cmode == CMODE_NVRAM) - default_cmode = nvram_read_byte(NV_CMODE); + if (default_cmode == CMODE_NVRAM) + default_cmode = nvram_read_byte(NV_CMODE); #endif - if (default_cmode < CMODE_8 || default_cmode > CMODE_32) - default_cmode = CMODE_8; - if (mac_vmode_to_var(default_vmode, default_cmode, &var)) - var = default_var; - } + if (default_cmode < CMODE_8 || default_cmode > CMODE_32) + default_cmode = CMODE_8; + if (mac_vmode_to_var(default_vmode, default_cmode, &var)) + var = default_var; + } } else if (!fb_find_mode(&var, &info->fb_info, mode_option, NULL, 0, NULL, 8)) - var = default_var; + var = default_var; #else /* !CONFIG_PPC */ #ifdef __sparc__ if (mode_option) { - if (!fb_find_mode(&var, &info->fb_info, mode_option, NULL, 0, NULL, 8)) - var = default_var; + if (!fb_find_mode(&var, &info->fb_info, mode_option, NULL, 0, NULL, 8)) + var = default_var; } else - var = default_var; + var = default_var; #else if (!fb_find_mode(&var, &info->fb_info, mode_option, NULL, 0, NULL, 8)) - var = default_var; + var = default_var; #endif /* !__sparc__ */ #endif /* !CONFIG_PPC */ #endif /* !MODULE */ @@ -2096,49 +2356,66 @@ var.accel_flags |= FB_ACCELF_TEXT; if (var.yres == var.yres_virtual) { - u32 vram = (info->total_vram - (PAGE_SIZE << 2)); - var.yres_virtual = ((vram * 8) / var.bits_per_pixel) / var.xres_virtual; - if (var.yres_virtual < var.yres) - var.yres_virtual = var.yres; + u32 vram = (info->total_vram - (PAGE_SIZE << 2)); + var.yres_virtual = ((vram * 8) / var.bits_per_pixel) / var.xres_virtual; + if (var.yres_virtual < var.yres) + var.yres_virtual = var.yres; } - if (atyfb_decode_var(&var, &info->default_par, info)) { - printk("atyfb: can't set default video mode\n"); - return 0; + monitors_enabled = atyfb_monitors_enabled(info); + + if (atyfb_decode_var(&var, &info->default_par, info, monitors_enabled)) { + printk("atyfb: can't set default video mode\n"); + return 0; } #ifdef __sparc__ atyfb_save_palette(&info->fb_info, 0); #endif for (j = 0; j < 16; j++) { - k = color_table[j]; - info->palette[j].red = default_red[k]; - info->palette[j].green = default_grn[k]; - info->palette[j].blue = default_blu[k]; + k = color_table[j]; + info->palette[j].red = default_red[k]; + info->palette[j].green = default_grn[k]; + info->palette[j].blue = default_blu[k]; } #ifdef CONFIG_FB_ATY_CT if (curblink && M64_HAS(INTEGRATED)) { - info->cursor = aty_init_cursor(info); - if (info->cursor) { - info->dispsw.cursor = atyfb_cursor; - info->dispsw.set_font = atyfb_set_font; - } + info->cursor = aty_init_cursor(info); + if (info->cursor) { + info->dispsw.cursor = atyfb_cursor; + info->dispsw.set_font = atyfb_set_font; + } } #endif /* CONFIG_FB_ATY_CT */ atyfb_set_var(&var, -1, &info->fb_info); if (register_framebuffer(&info->fb_info) < 0) - return 0; + return 0; info->next = fb_list; fb_list = info; printk("fb%d: %s frame buffer device on %s\n", - GET_FB_IDX(info->fb_info.node), atyfb_name, name); + GET_FB_IDX(info->fb_info.node), atyfb_name, name); return 1; } + +void __init aty_init_register_array(struct fb_info_aty *info) +{ + u32 **p, **q; + u32 *i; + + i = (u32 *) info->ati_regbase; + p = (u32 **) info->ati_regaddr; + q = p + 256; + do { + *p = i; + i++; + p++; + } while (p != q); +}; int __init atyfb_init(void) { @@ -2157,339 +2434,547 @@ /* Do not attach when we have a serial console. */ if (!con_is_present()) - return -ENXIO; + return -ENXIO; #else u16 tmp; int aux_app; unsigned long raddr; #endif +#if defined(CONFIG_FB_ATY_GENERIC_LCD) + u16 lcd_ofs; + u32 driv_inf_tab,sig,rom_addr; +#endif while ((pdev = pci_find_device(PCI_VENDOR_ID_ATI, PCI_ANY_ID, pdev))) { - if ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) { - struct resource *rp; + if ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) { + struct resource *rp; #ifndef __sparc__ - struct resource *rrp; + struct resource *rrp; #endif - for (i = sizeof(aty_chips)/sizeof(*aty_chips)-1; i >= 0; i--) - if (pdev->device == aty_chips[i].pci_id) - break; - if (i < 0) - continue; - - info = kmalloc(sizeof(struct fb_info_aty), GFP_ATOMIC); - if (!info) { - printk("atyfb_init: can't alloc fb_info_aty\n"); - return -ENXIO; - } - memset(info, 0, sizeof(struct fb_info_aty)); - - rp = &pdev->resource[0]; - if (rp->flags & IORESOURCE_IO) - rp = &pdev->resource[1]; - addr = rp->start; - if (!addr) - continue; - - res_start = rp->start; - res_size = rp->end-rp->start+1; - if (!request_mem_region(res_start, res_size, "atyfb")) - continue; + for (i = sizeof(aty_chips)/sizeof(*aty_chips)-1; i >= 0; i--) + if (pdev->device == aty_chips[i].pci_id) + break; + if (i < 0) + continue; + + info = kmalloc(sizeof(struct fb_info_aty), GFP_ATOMIC); + if (!info) { + printk("atyfb_init: can't alloc fb_info_aty\n"); + return -ENXIO; + } + memset(info, 0, sizeof(struct fb_info_aty)); + + rp = &pdev->resource[0]; + if (rp->flags & IORESOURCE_IO) + rp = &pdev->resource[1]; + addr = rp->start; + if (!addr) + continue; + + res_start = rp->start; + res_size = rp->end-rp->start+1; + if (!request_mem_region(res_start, res_size, "atyfb")) + continue; #ifdef __sparc__ - /* - * Map memory-mapped registers. - */ - info->ati_regbase = addr + 0x7ffc00UL; - info->ati_regbase_phys = addr + 0x7ffc00UL; - - /* - * Map in big-endian aperture. - */ - info->frame_buffer = (unsigned long) addr + 0x800000UL; - info->frame_buffer_phys = addr + 0x800000UL; - - /* - * Figure mmap addresses from PCI config space. - * Split Framebuffer in big- and little-endian halfs. - */ - for (i = 0; i < 6 && pdev->resource[i].start; i++) - /* nothing */; - j = i + 4; - - info->mmap_map = kmalloc(j * sizeof(*info->mmap_map), GFP_ATOMIC); - if (!info->mmap_map) { - printk("atyfb_init: can't alloc mmap_map\n"); - kfree(info); - release_mem_region(res_start, res_size); - return -ENXIO; - } - memset(info->mmap_map, 0, j * sizeof(*info->mmap_map)); - - for (i = 0, j = 2; i < 6 && pdev->resource[i].start; i++) { - struct resource *rp = &pdev->resource[i]; - int io, breg = PCI_BASE_ADDRESS_0 + (i << 2); - unsigned long base; - u32 size, pbase; - - base = rp->start; - - io = (rp->flags & IORESOURCE_IO); - - size = rp->end - base + 1; - - pci_read_config_dword(pdev, breg, &pbase); - - if (io) - size &= ~1; - - /* - * Map the framebuffer a second time, this time without - * the braindead _PAGE_IE setting. This is used by the - * fixed Xserver, but we need to maintain the old mapping - * to stay compatible with older ones... - */ - if (base == addr) { - info->mmap_map[j].voff = (pbase + 0x10000000) & PAGE_MASK; - info->mmap_map[j].poff = base & PAGE_MASK; - info->mmap_map[j].size = (size + ~PAGE_MASK) & PAGE_MASK; - info->mmap_map[j].prot_mask = _PAGE_CACHE; - info->mmap_map[j].prot_flag = _PAGE_E; - j++; - } - - /* - * Here comes the old framebuffer mapping with _PAGE_IE - * set for the big endian half of the framebuffer... - */ - if (base == addr) { - info->mmap_map[j].voff = (pbase + 0x800000) & PAGE_MASK; - info->mmap_map[j].poff = (base+0x800000) & PAGE_MASK; - info->mmap_map[j].size = 0x800000; - info->mmap_map[j].prot_mask = _PAGE_CACHE; - info->mmap_map[j].prot_flag = _PAGE_E|_PAGE_IE; - size -= 0x800000; - j++; - } - - info->mmap_map[j].voff = pbase & PAGE_MASK; - info->mmap_map[j].poff = base & PAGE_MASK; - info->mmap_map[j].size = (size + ~PAGE_MASK) & PAGE_MASK; - info->mmap_map[j].prot_mask = _PAGE_CACHE; - info->mmap_map[j].prot_flag = _PAGE_E; - j++; - } - - if (pdev->device != XL_CHIP_ID) { - /* - * Fix PROMs idea of MEM_CNTL settings... - */ - mem = aty_ld_le32(MEM_CNTL, info); - chip_id = aty_ld_le32(CONFIG_CHIP_ID, info); - if (((chip_id & CFG_CHIP_TYPE) == VT_CHIP_ID) && - !((chip_id >> 24) & 1)) { - switch (mem & 0x0f) { - case 3: - mem = (mem & ~(0x0f)) | 2; - break; - case 7: - mem = (mem & ~(0x0f)) | 3; - break; - case 9: - mem = (mem & ~(0x0f)) | 4; - break; - case 11: - mem = (mem & ~(0x0f)) | 5; - break; - default: - break; - } - if ((aty_ld_le32(CONFIG_STAT0, info) & 7) >= SDRAM) - mem &= ~(0x00700000); - } - mem &= ~(0xcf80e000); /* Turn off all undocumented bits. */ - aty_st_le32(MEM_CNTL, mem, info); - } - - /* - * If this is the console device, we will set default video - * settings to what the PROM left us with. - */ - node = prom_getchild(prom_root_node); - node = prom_searchsiblings(node, "aliases"); - if (node) { - len = prom_getproperty(node, "screen", prop, sizeof(prop)); - if (len > 0) { - prop[len] = '\0'; - node = prom_finddevice(prop); - } else { - node = 0; - } - } - - pcp = pdev->sysdata; - if (node == pcp->prom_node) { - - struct fb_var_screeninfo *var = &default_var; - unsigned int N, P, Q, M, T, R; - u32 v_total, h_total; - struct crtc crtc; - u8 pll_regs[16]; - u8 clock_cntl; - - crtc.vxres = prom_getintdefault(node, "width", 1024); - crtc.vyres = prom_getintdefault(node, "height", 768); - crtc.bpp = prom_getintdefault(node, "depth", 8); - crtc.xoffset = crtc.yoffset = 0; - crtc.h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, info); - crtc.h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, info); - crtc.v_tot_disp = aty_ld_le32(CRTC_V_TOTAL_DISP, info); - crtc.v_sync_strt_wid = aty_ld_le32(CRTC_V_SYNC_STRT_WID, info); - crtc.gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, info); - aty_crtc_to_var(&crtc, var); - - h_total = var->xres + var->right_margin + - var->hsync_len + var->left_margin; - v_total = var->yres + var->lower_margin + - var->vsync_len + var->upper_margin; - - /* - * Read the PLL to figure actual Refresh Rate. - */ - clock_cntl = aty_ld_8(CLOCK_CNTL, info); - /* printk("atyfb: CLOCK_CNTL: %02x\n", clock_cntl); */ - for (i = 0; i < 16; i++) - pll_regs[i] = aty_ld_pll(i, info); - - /* - * PLL Reference Divider M: - */ - M = pll_regs[2]; - - /* - * PLL Feedback Divider N (Dependant on CLOCK_CNTL): - */ - N = pll_regs[7 + (clock_cntl & 3)]; - - /* - * PLL Post Divider P (Dependant on CLOCK_CNTL): - */ - P = 1 << (pll_regs[6] >> ((clock_cntl & 3) << 1)); - - /* - * PLL Divider Q: - */ - Q = N / P; - - /* - * Target Frequency: - * - * T * M - * Q = ------- - * 2 * R - * - * where R is XTALIN (= 14318 or 29498 kHz). - */ - if (pdev->device == XL_CHIP_ID) - R = 29498; - else - R = 14318; + /* + * Map memory-mapped registers. + */ + info->ati_regbase = addr + 0x7ffc00UL; + info->ati_regbase_phys = addr + 0x7ffc00UL; + + /* + * Map in big-endian aperture. + */ + info->frame_buffer = (unsigned long) addr + 0x800000UL; + info->frame_buffer_phys = addr + 0x800000UL; + + aty_init_register_array(info); + + /* + * Figure mmap addresses from PCI config space. + * Split Framebuffer in big- and little-endian halfs. + */ + for (i = 0; i < 6 && pdev->resource[i].start; i++) + /* nothing */; + j = i + 4; + + info->mmap_map = kmalloc(j * sizeof(*info->mmap_map), GFP_ATOMIC); + if (!info->mmap_map) { + printk("atyfb_init: can't alloc mmap_map\n"); + kfree(info); + release_mem_region(res_start, res_size); + return -ENXIO; + } + memset(info->mmap_map, 0, j * sizeof(*info->mmap_map)); + + for (i = 0, j = 2; i < 6 && pdev->resource[i].start; i++) { + struct resource *rp = &pdev->resource[i]; + int io, breg = PCI_BASE_ADDRESS_0 + (i << 2); + unsigned long base; + u32 size, pbase; + + base = rp->start; + + io = (rp->flags & IORESOURCE_IO); + + size = rp->end - base + 1; + + pci_read_config_dword(pdev, breg, &pbase); + + if (io) + size &= ~1; + + /* + * Map the framebuffer a second time, this time without + * the braindead _PAGE_IE setting. This is used by the + * fixed Xserver, but we need to maintain the old mapping + * to stay compatible with older ones... + */ + if (base == addr) { + info->mmap_map[j].voff = (pbase + 0x10000000) & PAGE_MASK; + info->mmap_map[j].poff = base & PAGE_MASK; + info->mmap_map[j].size = (size + ~PAGE_MASK) & PAGE_MASK; + info->mmap_map[j].prot_mask = _PAGE_CACHE; + info->mmap_map[j].prot_flag = _PAGE_E; + j++; + } + + /* + * Here comes the old framebuffer mapping with _PAGE_IE + * set for the big endian half of the framebuffer... + */ + if (base == addr) { + info->mmap_map[j].voff = (pbase + 0x800000) & PAGE_MASK; + info->mmap_map[j].poff = (base+0x800000) & PAGE_MASK; + info->mmap_map[j].size = 0x800000; + info->mmap_map[j].prot_mask = _PAGE_CACHE; + info->mmap_map[j].prot_flag = _PAGE_E|_PAGE_IE; + size -= 0x800000; + j++; + } + + info->mmap_map[j].voff = pbase & PAGE_MASK; + info->mmap_map[j].poff = base & PAGE_MASK; + info->mmap_map[j].size = (size + ~PAGE_MASK) & PAGE_MASK; + info->mmap_map[j].prot_mask = _PAGE_CACHE; + info->mmap_map[j].prot_flag = _PAGE_E; + j++; + } + + if (pdev->device != XL_CHIP_ID) { + /* + * Fix PROMs idea of MEM_CNTL settings... + */ + mem = aty_ld_le32(MEM_CNTL, info); + chip_id = aty_ld_le32(CONFIG_CHIP_ID, info); + if (((chip_id & CFG_CHIP_TYPE) == VT_CHIP_ID) && + !((chip_id >> 24) & 1)) { + switch (mem & 0x0f) { + case 3: + mem = (mem & ~(0x0f)) | 2; + break; + case 7: + mem = (mem & ~(0x0f)) | 3; + break; + case 9: + mem = (mem & ~(0x0f)) | 4; + break; + case 11: + mem = (mem & ~(0x0f)) | 5; + break; + default: + break; + } + if ((aty_ld_le32(CONFIG_STAT0, info) & 7) >= SDRAM) + mem &= ~(0x00700000); + } + mem &= ~(0xcf80e000); /* Turn off all undocumented bits. */ + aty_st_le32(MEM_CNTL, mem, info); + } + + /* + * If this is the console device, we will set default video + * settings to what the PROM left us with. + */ + node = prom_getchild(prom_root_node); + node = prom_searchsiblings(node, "aliases"); + if (node) { + len = prom_getproperty(node, "screen", prop, sizeof(prop)); + if (len > 0) { + prop[len] = '\0'; + node = prom_finddevice(prop); + } else { + node = 0; + } + } + + pcp = pdev->sysdata; + if (node == pcp->prom_node) { + + struct fb_var_screeninfo *var = &default_var; + unsigned int N, P, Q, M, T, R; + u32 v_total, h_total; + struct crtc crtc; + u8 pll_regs[16]; + u8 clock_cntl; + + crtc.vxres = prom_getintdefault(node, "width", 1024); + crtc.vyres = prom_getintdefault(node, "height", 768); + crtc.bpp = prom_getintdefault(node, "depth", 8); + crtc.xoffset = crtc.yoffset = 0; + crtc.h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, info); + crtc.h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, info); + crtc.v_tot_disp = aty_ld_le32(CRTC_V_TOTAL_DISP, info); + crtc.v_sync_strt_wid = aty_ld_le32(CRTC_V_SYNC_STRT_WID, info); + crtc.gen_cntl = aty_ld_le32(CRTC_GEN_CNTL, info); + aty_crtc_to_var(&crtc, var); + + h_total = var->xres + var->right_margin + + var->hsync_len + var->left_margin; + v_total = var->yres + var->lower_margin + + var->vsync_len + var->upper_margin; + + /* + * Read the PLL to figure actual Refresh Rate. + */ + clock_cntl = aty_ld_8(CLOCK_CNTL, info); + /* printk("atyfb: CLOCK_CNTL: %02x\n", clock_cntl); */ + for (i = 0; i < 16; i++) + pll_regs[i] = aty_ld_pll(i, info); + + /* + * PLL Reference Divider M: + */ + M = pll_regs[2]; + + /* + * PLL Feedback Divider N (Dependant on CLOCK_CNTL): + */ + N = pll_regs[7 + (clock_cntl & 3)]; + + /* + * PLL Post Divider P (Dependant on CLOCK_CNTL): + */ + P = 1 << (pll_regs[6] >> ((clock_cntl & 3) << 1)); + + /* + * PLL Divider Q: + */ + Q = N / P; + + /* + * Target Frequency: + * + * T * M + * Q = ------- + * 2 * R + * + * where R is XTALIN (= 14318 or 29498 kHz). + */ + if (pdev->device == XL_CHIP_ID) + R = 29498; + else + R = 14318; - T = 2 * Q * R / M; + T = 2 * Q * R / M; + + default_var.pixclock = 1000000000 / T; + } - default_var.pixclock = 1000000000 / T; - } #else /* __sparc__ */ - aux_app = 0; - raddr = addr + 0x7ff000UL; - rrp = &pdev->resource[2]; - if ((rrp->flags & IORESOURCE_MEM) - && request_mem_region(rrp->start, rrp->end - rrp->start + 1, - "atyfb")) { - aux_app = 1; - raddr = rrp->start; - printk(KERN_INFO "atyfb: using auxiliary register aperture\n"); - } - - info->ati_regbase_phys = raddr; - info->ati_regbase = (unsigned long) ioremap(raddr, 0x1000); - - if(!info->ati_regbase) { - kfree(info); - release_mem_region(res_start, res_size); - return -ENOMEM; - } - - info->ati_regbase_phys += aux_app? 0x400: 0xc00; - info->ati_regbase += aux_app? 0x400: 0xc00; - - /* - * Enable memory-space accesses using config-space - * command register. - */ - pci_read_config_word(pdev, PCI_COMMAND, &tmp); - if (!(tmp & PCI_COMMAND_MEMORY)) { - tmp |= PCI_COMMAND_MEMORY; - pci_write_config_word(pdev, PCI_COMMAND, tmp); - } + aux_app = 0; + raddr = addr + 0x7ff000UL; + rrp = &pdev->resource[2]; + if ((rrp->flags & IORESOURCE_MEM) + && request_mem_region(rrp->start, rrp->end - rrp->start + 1, + "atyfb")) { + aux_app = 1; + raddr = rrp->start; + printk(KERN_INFO "atyfb: using auxiliary register aperture\n"); + } + + info->ati_regbase_phys = raddr; + info->ati_regbase = (unsigned long) ioremap(raddr, 0x1000); + + if(!info->ati_regbase) { + kfree(info); + release_mem_region(res_start, res_size); + return -ENOMEM; + } + + info->ati_regbase_phys += aux_app? 0x400: 0xc00; + info->ati_regbase += aux_app? 0x400: 0xc00; + + /* + * Enable memory-space accesses using config-space + * command register. + */ + pci_read_config_word(pdev, PCI_COMMAND, &tmp); + if (!(tmp & PCI_COMMAND_MEMORY)) { + tmp |= PCI_COMMAND_MEMORY; + pci_write_config_word(pdev, PCI_COMMAND, tmp); + } #ifdef __BIG_ENDIAN - /* Use the big-endian aperture */ - addr += 0x800000; + /* Use the big-endian aperture */ + addr += 0x800000; #endif - /* Map in frame buffer */ - info->frame_buffer_phys = addr; - info->frame_buffer = (unsigned long)ioremap(addr, 0x800000); - - if(!info->frame_buffer) { - kfree(info); - release_mem_region(res_start, res_size); - return -ENXIO; - } + /* Map in frame buffer */ + info->frame_buffer_phys = addr; + info->frame_buffer = (unsigned long)ioremap(addr, 0x800000); + + aty_init_register_array(info); + +#ifdef CONFIG_FB_ATY_GENERIC_LCD + /* To support an LCD panel, we should know it's dimensions and + it's desired pixel clock. + There are two ways to do it: + - Check the startup video mode and calculate the panel + size from it. This is unreliable. + - Read it from the driver information table in the video BIOS. + + So, we try to find a BIOS and get access to it. + */ + rom_addr = 0xc0000 + ((aty_ld_le32(SCRATCH_REG1,info) & 0x7f) << 11); + info->bios_base_phys = rom_addr; + info->bios_base = (unsigned long)ioremap(rom_addr,0x10000); + + /* The BIOS starts with 0xaa55. */ + if (*((u16 *)info->bios_base) == 0xaa55) { + printk(KERN_INFO "atyfb: Mach64 BIOS is located at %x, mapped at %x.\n", + (u32)info->bios_base_phys,(u32)info->bios_base); + + /* Address of driver information table is at offset 0x78. */ + driv_inf_tab=info->bios_base + *((u16 *)(info->bios_base+0x78)); + + /* Check for the driver information table signature. */ + sig = (*(u32 *)driv_inf_tab); + if ((sig == 0x54504c24) || /* Rage LT pro */ + (sig == 0x544d5224) || /* Rage mobility */ + (sig == 0x54435824) || /* Rage XC */ + (sig == 0x544c5824)) { /* Rage XL */ + printk(KERN_INFO "atyfb: BIOS contains driver information table.\n"); + lcd_ofs = (*(u16 *)(driv_inf_tab + 10)); + info->lcd_table = 0; + if (lcd_ofs != 0) { + info->lcd_table = info->bios_base + lcd_ofs; + }; + }; + }; + if (info->lcd_table != 0) { + char model[24]; + char strbuf[16]; + char refresh_rates_buf[100]; + int id,tech,f,i,m,default_refresh_rate; + char *txtcolour; + char *txtmonitor; + char *txtdual; + char *txtformat; + u16 width,height,panel_type,refresh_rates; + u16 *lcdmodeptr; + u32 format; + u8 lcd_refresh_rates[16] = {50,56,60,67,70,72,75,76,85,90,100,120,140,150,160,200}; + /* The most important information is the panel size at + offset 25 and 27, but there's some other nice information + which we print to the screen. + */ + id = *(u8 *)info->lcd_table; + strncpy(model,(char *)info->lcd_table+1,24); + model[23]=0; + + width = info->lcd_width = *(u16 *)(info->lcd_table+25); + height = info->lcd_height = *(u16 *)(info->lcd_table+27); + panel_type = *(u16 *)(info->lcd_table+29); + if (panel_type & 1) + txtcolour = "colour"; + else + txtcolour = "monochrome"; + if (panel_type & 2) + txtdual = "dual (split) "; + else + txtdual = ""; + tech = (panel_type>>2) & 63; + switch (tech) { + case 0: + txtmonitor = "passive matrix"; + break; + case 1: + txtmonitor = "active matrix"; + break; + case 2: + txtmonitor = "active addressed STN"; + break; + case 3: + txtmonitor = "EL"; + break; + case 4: + txtmonitor = "plasma"; + break; + default: + txtmonitor = "unknown"; + }; + format = *(u32 *)(info->lcd_table+57); + if (tech == 0 || tech == 2) { + switch (format & 7) { + case 0: + txtformat = "12 bit interface"; + break; + case 1: + txtformat = "16 bit interface"; + break; + case 2: + txtformat = "24 bit interface"; + break; + default: + txtformat = "unkown format"; + }; + } else { + switch (format & 7) { + case 0: + txtformat = "8 colours"; + break; + case 1: + txtformat = "512 colours"; + break; + case 2: + txtformat = "4096 colours"; + break; + case 4: + txtformat = "262144 colours (LT mode)"; + break; + case 5: + txtformat = "16777216 colours"; + break; + case 6: + txtformat = "262144 colours (FDPI-2 mode)"; + break; + default: + txtformat = "unkown format"; + }; + }; + printk(KERN_INFO "atyfb: %s%s %s monitor detected: %s\n id=%d, %dx%d pixels, %s\n", + txtdual,txtcolour,txtmonitor,model,id,width,height,txtformat); + refresh_rates_buf[0] = 0; + refresh_rates = *(u16 *)(info->lcd_table+62); + m = 1; + f = 0; + for (i=0;i<16;i++) { + if (refresh_rates & m) { + if (f == 0) { + sprintf(strbuf,"%d",lcd_refresh_rates[i]); + f++; + } else + sprintf(strbuf,",%d",lcd_refresh_rates[i]); + strcat(refresh_rates_buf,strbuf); + }; + m = m << 1; + }; + default_refresh_rate = (*(u8 *)(info->lcd_table+61) & 0xf0) >> 4; + printk(KERN_INFO " supports %s Hz refresh rates, default %d Hz\n", + refresh_rates_buf,lcd_refresh_rates[default_refresh_rate]); + /* We now need to determine the crtc parameters for the + lcd monitor. This is tricky, because they are not stored + individually in the BIOS. Instead, the BIOS contains a + table of display modes that work for this monitor. + + The idea is that we search for a mode of the same dimensions + as the dimensions of the lcd monitor. Say our lcd monitor + is 800x600 pixels, we search for a 800x600 monitor. + The CRTC parameters we find here are the ones that we need + to use to simulate other resolutions on the lcd screen. + */ + lcdmodeptr = (u16 *)(info->lcd_table + 64); + while (*lcdmodeptr != 0) { + u32 modeptr; + u16 mwidth,mheight; + modeptr = info->bios_base + *lcdmodeptr; + + mwidth = *((u16 *)(modeptr+0)); + mheight = *((u16 *)(modeptr+2)); + + if (mwidth == width && mheight == height) { + info->lcd_pixclock = 100000000 / *((u16 *)(modeptr+9)); + info->lcd_htotal = *((u16 *)(modeptr+17)) & 511; + info->lcd_hdisp = *((u16 *)(modeptr+19)) & 511; + info->lcd_hsync_start = *((u16 *)(modeptr+21)) & 511; + info->lcd_hsync_delay = (*((u16 *)(modeptr+21)) >> 9) & 7; + info->lcd_hsync_width = *((u8 *)(modeptr+23)) & 63; + info->lcd_vtotal = *((u16 *)(modeptr+24)) & 2047; + info->lcd_vdisp = *((u16 *)(modeptr+26)) & 2047; + info->lcd_vsync_start = *((u16 *)(modeptr+28)) & 2047; + info->lcd_vsync_width = (*((u16 *)(modeptr+28)) >> 11) & 31; + info->lcd_right = info->lcd_hsync_start - info->lcd_hdisp; + info->lcd_lower = info->lcd_vsync_start - info->lcd_vdisp; + info->lcd_hblank_width = info->lcd_htotal - info->lcd_hdisp; + info->lcd_vblank_width = info->lcd_vtotal - info->lcd_vdisp; + break; + }; + + lcdmodeptr++; + }; + if (*lcdmodeptr == 0) { + printk(KERN_WARNING "atyfb: LCD monitor CRTC parameters not found!!!\n"); + /* To do: Switch to CRT if possible. */ + } else { + printk(KERN_INFO " LCD CRTC parameters: %d %d %d %d %d %d %d %d %d %d\n", + info->lcd_pixclock,info->lcd_htotal,info->lcd_hdisp,info->lcd_hsync_start, + info->lcd_hsync_delay,info->lcd_hsync_width,info->lcd_vtotal,info->lcd_vdisp, + info->lcd_vsync_start,info->lcd_vsync_width); + }; + }; +#endif + + if(!info->frame_buffer) { + kfree(info); + release_mem_region(res_start, res_size); + return -ENXIO; + } #endif /* __sparc__ */ - if (!aty_init(info, "PCI")) { - if (info->mmap_map) - kfree(info->mmap_map); - kfree(info); - release_mem_region(res_start, res_size); - return -ENXIO; - } + if (!aty_init(info, "PCI")) { + if (info->mmap_map) + kfree(info->mmap_map); + kfree(info); + release_mem_region(res_start, res_size); + return -ENXIO; + } #ifdef __sparc__ - if (!prom_palette) - prom_palette = atyfb_palette; + if (!prom_palette) + prom_palette = atyfb_palette; - /* - * Add /dev/fb mmap values. - */ - info->mmap_map[0].voff = 0x8000000000000000UL; - info->mmap_map[0].poff = info->frame_buffer & PAGE_MASK; - info->mmap_map[0].size = info->total_vram; - info->mmap_map[0].prot_mask = _PAGE_CACHE; - info->mmap_map[0].prot_flag = _PAGE_E; - info->mmap_map[1].voff = info->mmap_map[0].voff + info->total_vram; - info->mmap_map[1].poff = info->ati_regbase & PAGE_MASK; - info->mmap_map[1].size = PAGE_SIZE; - info->mmap_map[1].prot_mask = _PAGE_CACHE; - info->mmap_map[1].prot_flag = _PAGE_E; + /* + * Add /dev/fb mmap values. + */ + info->mmap_map[0].voff = 0x8000000000000000UL; + info->mmap_map[0].poff = info->frame_buffer & PAGE_MASK; + info->mmap_map[0].size = info->total_vram; + info->mmap_map[0].prot_mask = _PAGE_CACHE; + info->mmap_map[0].prot_flag = _PAGE_E; + info->mmap_map[1].voff = info->mmap_map[0].voff + info->total_vram; + info->mmap_map[1].poff = info->ati_regbase & PAGE_MASK; + info->mmap_map[1].size = PAGE_SIZE; + info->mmap_map[1].prot_mask = _PAGE_CACHE; + info->mmap_map[1].prot_flag = _PAGE_E; #endif /* __sparc__ */ #ifdef CONFIG_PMAC_PBOOK - if (first_display == NULL) - pmu_register_sleep_notifier(&aty_sleep_notifier); - info->next = first_display; - first_display = info; + if (first_display == NULL) + pmu_register_sleep_notifier(&aty_sleep_notifier); + info->next = first_display; + first_display = info; #endif #ifdef CONFIG_FB_COMPAT_XPMAC - if (!console_fb_info) - console_fb_info = &info->fb_info; + if (!console_fb_info) + console_fb_info = &info->fb_info; #endif /* CONFIG_FB_COMPAT_XPMAC */ - } + } } #elif defined(CONFIG_ATARI) @@ -2498,54 +2983,52 @@ struct fb_info_aty *info; for (m64_num = 0; m64_num < mach64_count; m64_num++) { - if (!phys_vmembase[m64_num] || !phys_size[m64_num] || - !phys_guiregbase[m64_num]) { - printk(" phys_*[%d] parameters not set => returning early. \n", - m64_num); - continue; - } - - info = kmalloc(sizeof(struct fb_info_aty), GFP_ATOMIC); - if (!info) { - printk("atyfb_init: can't alloc fb_info_aty\n"); - return -ENOMEM; - } - memset(info, 0, sizeof(struct fb_info_aty)); - - /* - * Map the video memory (physical address given) to somewhere in the - * kernel address space. - */ - info->frame_buffer = (unsigned long)ioremap(phys_vmembase[m64_num], - phys_size[m64_num]); - info->frame_buffer_phys = info->frame_buffer; /* Fake! */ - info->ati_regbase = (unsigned long)ioremap(phys_guiregbase[m64_num], - 0x10000)+0xFC00ul; - info->ati_regbase_phys = info->ati_regbase; /* Fake! */ - - aty_st_le32(CLOCK_CNTL, 0x12345678, info); - clock_r = aty_ld_le32(CLOCK_CNTL, info); - - switch (clock_r & 0x003F) { - case 0x12: - info->clk_wr_offset = 3; /* */ - break; - case 0x34: - info->clk_wr_offset = 2; /* Medusa ST-IO ISA Adapter etc. */ - break; - case 0x16: - info->clk_wr_offset = 1; /* */ - break; - case 0x38: - info->clk_wr_offset = 0; /* Panther 1 ISA Adapter (Gerald) */ - break; - } - - if (!aty_init(info, "ISA bus")) { - kfree(info); - /* This is insufficient! kernel_map has added two large chunks!! */ - return -ENXIO; - } + if (!phys_vmembase[m64_num] || !phys_size[m64_num] || + !phys_guiregbase[m64_num]) { + printk(" phys_*[%d] parameters not set => returning early. \n", + m64_num); + continue; + } + + info = kmalloc(sizeof(struct fb_info_aty), GFP_ATOMIC); + if (!info) { + printk("atyfb_init: can't alloc fb_info_aty\n"); + return -ENOMEM; + } + memset(info, 0, sizeof(struct fb_info_aty)); + + /* + * Map the video memory (physical address given) to somewhere in the + * kernel address space. + */ + info->frame_buffer = ioremap(phys_vmembase[m64_num], phys_size[m64_num]); + info->frame_buffer_phys = info->frame_buffer; /* Fake! */ + info->ati_regbase = ioremap(phys_guiregbase[m64_num], 0x10000)+0xFC00ul; + info->ati_regbase_phys = info->ati_regbase; /* Fake! */ + + aty_st_le32(CLOCK_CNTL, 0x12345678, info); + clock_r = aty_ld_le32(CLOCK_CNTL, info); + + switch (clock_r & 0x003F) { + case 0x12: + info->clk_wr_offset = 3; /* */ + break; + case 0x34: + info->clk_wr_offset = 2; /* Medusa ST-IO ISA Adapter etc. */ + break; + case 0x16: + info->clk_wr_offset = 1; /* */ + break; + case 0x38: + info->clk_wr_offset = 0; /* Panther 1 ISA Adapter (Gerald) */ + break; + } + + if (!aty_init(info, "ISA bus")) { + kfree(info); + /* This is insufficient! kernel_map has added two large chunks!! */ + return -ENXIO; + } } #endif /* CONFIG_ATARI */ return 0; @@ -2557,69 +3040,71 @@ char *this_opt; if (!options || !*options) - return 0; + return 0; while ((this_opt = strsep(&options, ",")) != NULL) { - if (!strncmp(this_opt, "font:", 5)) { - char *p; - int i; - - p = this_opt + 5; - for (i = 0; i < sizeof(fontname) - 1; i++) - if (!*p || *p == ' ' || *p == ',') - break; - memcpy(fontname, this_opt + 5, i); - fontname[i] = 0; - } else if (!strncmp(this_opt, "noblink", 7)) { - curblink = 0; - } else if (!strncmp(this_opt, "noaccel", 7)) { - noaccel = 1; - } else if (!strncmp(this_opt, "vram:", 5)) - default_vram = simple_strtoul(this_opt+5, NULL, 0); - else if (!strncmp(this_opt, "pll:", 4)) - default_pll = simple_strtoul(this_opt+4, NULL, 0); - else if (!strncmp(this_opt, "mclk:", 5)) - default_mclk = simple_strtoul(this_opt+5, NULL, 0); + if (!strncmp(this_opt, "font:", 5)) { + char *p; + int i; + + p = this_opt + 5; + for (i = 0; i < sizeof(fontname) - 1; i++) + if (!*p || *p == ' ' || *p == ',') + break; + memcpy(fontname, this_opt + 5, i); + fontname[i] = 0; + } else if (!strncmp(this_opt, "noblink", 7)) { + curblink = 0; + } else if (!strncmp(this_opt, "noaccel", 7)) { + noaccel = 1; + } else if (!strncmp(this_opt, "vram:", 5)) + default_vram = simple_strtoul(this_opt+5, NULL, 0); + else if (!strncmp(this_opt, "pll:", 4)) + default_pll = simple_strtoul(this_opt+4, NULL, 0); + else if (!strncmp(this_opt, "mclk:", 5)) + default_mclk = simple_strtoul(this_opt+5, NULL, 0); + else if (!strncmp(this_opt, "xclk:", 5)) + default_xclk = simple_strtoul(this_opt+5, NULL, 0); #ifdef CONFIG_PPC - else if (!strncmp(this_opt, "vmode:", 6)) { - unsigned int vmode = simple_strtoul(this_opt+6, NULL, 0); - if (vmode > 0 && vmode <= VMODE_MAX) - default_vmode = vmode; - } else if (!strncmp(this_opt, "cmode:", 6)) { - unsigned int cmode = simple_strtoul(this_opt+6, NULL, 0); - switch (cmode) { - case 0: - case 8: - default_cmode = CMODE_8; - break; - case 15: - case 16: - default_cmode = CMODE_16; - break; - case 24: - case 32: - default_cmode = CMODE_32; - break; - } - } + else if (!strncmp(this_opt, "vmode:", 6)) { + unsigned int vmode = simple_strtoul(this_opt+6, NULL, 0); + if (vmode > 0 && vmode <= VMODE_MAX) + default_vmode = vmode; + } else if (!strncmp(this_opt, "cmode:", 6)) { + unsigned int cmode = simple_strtoul(this_opt+6, NULL, 0); + switch (cmode) { + case 0: + case 8: + default_cmode = CMODE_8; + break; + case 15: + case 16: + default_cmode = CMODE_16; + break; + case 24: + case 32: + default_cmode = CMODE_32; + break; + } + } #endif #ifdef CONFIG_ATARI - /* - * Why do we need this silly Mach64 argument? - * We are already here because of mach64= so its redundant. - */ - else if (MACH_IS_ATARI && (!strncmp(this_opt, "Mach64:", 7))) { - static unsigned char m64_num; - static char mach64_str[80]; - strncpy(mach64_str, this_opt+7, 80); - if (!store_video_par(mach64_str, m64_num)) { - m64_num++; - mach64_count = m64_num; - } - } + /* + * Why do we need this silly Mach64 argument? + * We are already here because of mach64= so its redundant. + */ + else if (MACH_IS_ATARI && (!strncmp(this_opt, "Mach64:", 7))) { + static unsigned char m64_num; + static char mach64_str[80]; + strncpy(mach64_str, this_opt+7, 80); + if (!store_video_par(mach64_str, m64_num)) { + m64_num++; + mach64_count = m64_num; + } + } #endif - else - mode_option = this_opt; + else + mode_option = this_opt; } return 0; } @@ -2634,20 +3119,20 @@ printk("store_video_par() '%s' \n", video_str); if (!(p = strtoke(video_str, ";")) || !*p) - goto mach64_invalid; + goto mach64_invalid; vmembase = simple_strtoul(p, NULL, 0); if (!(p = strtoke(NULL, ";")) || !*p) - goto mach64_invalid; + goto mach64_invalid; size = simple_strtoul(p, NULL, 0); if (!(p = strtoke(NULL, ";")) || !*p) - goto mach64_invalid; + goto mach64_invalid; guiregbase = simple_strtoul(p, NULL, 0); phys_vmembase[m64_num] = vmembase; phys_size[m64_num] = size; phys_guiregbase[m64_num] = guiregbase; printk(" stored them all: $%08lX $%08lX $%08lX \n", vmembase, size, - guiregbase); + guiregbase); return 0; mach64_invalid: @@ -2662,14 +3147,14 @@ sbegin = s ? s : ssave; if (!sbegin) - return NULL; + return NULL; if (*sbegin == '\0') { - ssave = NULL; - return NULL; + ssave = NULL; + return NULL; } send = strpbrk(sbegin, ct); if (send && *send != '\0') - *send++ = '\0'; + *send++ = '\0'; ssave = send; return sbegin; } @@ -2679,24 +3164,27 @@ { struct fb_info_aty *info = (struct fb_info_aty *)fb; struct atyfb_par par; + u32 monitors_enabled; /* Do we have to save the colormap? */ if (fb_display[currcon].cmap.len) - fb_get_cmap(&fb_display[currcon].cmap, 1, atyfb_getcolreg, fb); + fb_get_cmap(&fb_display[currcon].cmap, 1, atyfb_getcolreg, fb); #ifdef CONFIG_FB_ATY_CT /* Erase HW Cursor */ if (info->cursor) - atyfb_cursor(&fb_display[currcon], CM_ERASE, - info->cursor->pos.x, info->cursor->pos.y); + atyfb_cursor(&fb_display[currcon], CM_ERASE, + info->cursor->pos.x, info->cursor->pos.y); #endif /* CONFIG_FB_ATY_CT */ currcon = con; - atyfb_decode_var(&fb_display[con].var, &par, info); + monitors_enabled = atyfb_monitors_enabled(info); + + atyfb_decode_var(&fb_display[con].var, &par, info, monitors_enabled); atyfb_set_par(&par, info); atyfb_set_dispsw(&fb_display[con], info, par.crtc.bpp, - par.accel_flags & FB_ACCELF_TEXT); + par.accel_flags & FB_ACCELF_TEXT); /* Install new colormap */ do_install_cmap(con, fb); @@ -2704,8 +3192,8 @@ #ifdef CONFIG_FB_ATY_CT /* Install hw cursor */ if (info->cursor) { - aty_set_cursor_color(info); - aty_set_cursor_shape(info); + aty_set_cursor_color(info); + aty_set_cursor_shape(info); } #endif /* CONFIG_FB_ATY_CT */ return 1; @@ -2722,32 +3210,32 @@ #ifdef CONFIG_PMAC_BACKLIGHT if ((_machine == _MACH_Pmac) && blank) - set_backlight_enable(0); + set_backlight_enable(0); #endif /* CONFIG_PMAC_BACKLIGHT */ gen_cntl = aty_ld_8(CRTC_GEN_CNTL, info); if (blank > 0) - switch (blank-1) { - case VESA_NO_BLANKING: - gen_cntl |= 0x40; - break; - case VESA_VSYNC_SUSPEND: - gen_cntl |= 0x8; - break; - case VESA_HSYNC_SUSPEND: - gen_cntl |= 0x4; - break; - case VESA_POWERDOWN: - gen_cntl |= 0x4c; - break; - } + switch (blank-1) { + case VESA_NO_BLANKING: + gen_cntl |= 0x40; + break; + case VESA_VSYNC_SUSPEND: + gen_cntl |= 0x8; + break; + case VESA_HSYNC_SUSPEND: + gen_cntl |= 0x4; + break; + case VESA_POWERDOWN: + gen_cntl |= 0x4c; + break; + } else - gen_cntl &= ~(0x4c); + gen_cntl &= ~(0x4c); aty_st_8(CRTC_GEN_CNTL, gen_cntl, info); #ifdef CONFIG_PMAC_BACKLIGHT if ((_machine == _MACH_Pmac) && !blank) - set_backlight_enable(1); + set_backlight_enable(1); #endif /* CONFIG_PMAC_BACKLIGHT */ } @@ -2758,12 +3246,12 @@ */ static int atyfb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue, - u_int *transp, struct fb_info *fb) + u_int *transp, struct fb_info *fb) { struct fb_info_aty *info = (struct fb_info_aty *)fb; if (regno > 255) - return 1; + return 1; *red = (info->palette[regno].red<<8) | info->palette[regno].red; *green = (info->palette[regno].green<<8) | info->palette[regno].green; *blue = (info->palette[regno].blue<<8) | info->palette[regno].blue; @@ -2779,13 +3267,13 @@ */ static int atyfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, - u_int transp, struct fb_info *fb) + u_int transp, struct fb_info *fb) { struct fb_info_aty *info = (struct fb_info_aty *)fb; int i, scale; if (regno > 255) - return 1; + return 1; red >>= 8; green >>= 8; blue >>= 8; @@ -2794,42 +3282,35 @@ info->palette[regno].blue = blue; i = aty_ld_8(DAC_CNTL, info) & 0xfc; if (M64_HAS(EXTRA_BRIGHT)) - i |= 0x2; /*DAC_CNTL|0x2 turns off the extra brightness for gt*/ + i |= 0x2; /*DAC_CNTL|0x2 turns off the extra brightness for gt*/ aty_st_8(DAC_CNTL, i, info); aty_st_8(DAC_MASK, 0xff, info); scale = (M64_HAS(INTEGRATED) && info->current_par.crtc.bpp == 16) ? 3 : 0; -#ifdef CONFIG_ATARI - out_8(&info->aty_cmap_regs->windex, regno << scale); - out_8(&info->aty_cmap_regs->lut, red); - out_8(&info->aty_cmap_regs->lut, green); - out_8(&info->aty_cmap_regs->lut, blue); -#else writeb(regno << scale, &info->aty_cmap_regs->windex); writeb(red, &info->aty_cmap_regs->lut); writeb(green, &info->aty_cmap_regs->lut); writeb(blue, &info->aty_cmap_regs->lut); -#endif if (regno < 16) - switch (info->current_par.crtc.bpp) { + switch (info->current_par.crtc.bpp) { #ifdef FBCON_HAS_CFB16 - case 16: - info->fbcon_cmap.cfb16[regno] = (regno << 10) | (regno << 5) | - regno; - break; + case 16: + info->fbcon_cmap.cfb16[regno] = (regno << 10) | (regno << 5) | + regno; + break; #endif #ifdef FBCON_HAS_CFB24 - case 24: - info->fbcon_cmap.cfb24[regno] = (regno << 16) | (regno << 8) | - regno; - break; + case 24: + info->fbcon_cmap.cfb24[regno] = (regno << 16) | (regno << 8) | + regno; + break; #endif #ifdef FBCON_HAS_CFB32 - case 32: - i = (regno << 8) | regno; - info->fbcon_cmap.cfb32[regno] = (i << 16) | i; - break; + case 32: + i = (regno << 8) | regno; + info->fbcon_cmap.cfb32[regno] = (i << 16) | i; + break; #endif - } + } return 0; } @@ -2837,12 +3318,12 @@ static void do_install_cmap(int con, struct fb_info *info) { if (con != currcon) - return; + return; if (fb_display[con].cmap.len) - fb_set_cmap(&fb_display[con].cmap, 1, atyfb_setcolreg, info); + fb_set_cmap(&fb_display[con].cmap, 1, atyfb_setcolreg, info); else { - int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256; - fb_set_cmap(fb_default_cmap(size), 1, atyfb_setcolreg, info); + int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256; + fb_set_cmap(fb_default_cmap(size), 1, atyfb_setcolreg, info); } } @@ -2866,27 +3347,27 @@ height = yres - conp->vc_rows * fontheight(p); if (height && (yoffset + yres > sy)) { - u32 xres, xoffset; - u32 bgx; + u32 xres, xoffset; + u32 bgx; - xres = (((par->crtc.h_tot_disp >> 16) & 0xff) + 1) * 8; - xoffset = fb_display[con].var.xoffset; + xres = (((par->crtc.h_tot_disp >> 16) & 0xff) + 1) * 8; + xoffset = fb_display[con].var.xoffset; - bgx = attr_bgcol_ec(p, conp); - bgx |= (bgx << 8); - bgx |= (bgx << 16); - - if (sy + height > par->crtc.vyres) { - wait_for_fifo(1, info); - aty_st_le32(SC_BOTTOM, sy + height - 1, info); - } - aty_rectfill(xoffset, sy, xres, height, bgx, info); + bgx = attr_bgcol_ec(p, conp); + bgx |= (bgx << 8); + bgx |= (bgx << 16); + + if (sy + height > par->crtc.vyres) { + wait_for_fifo(1, info); + aty_st_le32(SC_BOTTOM, sy + height - 1, info); + } + aty_rectfill(xoffset, sy, xres, height, bgx, info); } #ifdef CONFIG_FB_ATY_CT if (info->cursor && (yoffset + yres <= sy)) - atyfb_cursor(p, CM_ERASE, info->cursor->pos.x, info->cursor->pos.y); + atyfb_cursor(p, CM_ERASE, info->cursor->pos.x, info->cursor->pos.y); #endif /* CONFIG_FB_ATY_CT */ info->current_par.crtc.yoffset = yoffset; @@ -2906,34 +3387,50 @@ void cleanup_module(void) { while (fb_list) { - struct fb_info_aty *info = fb_list; - fb_list = info->next; + struct fb_info_aty *info = fb_list; + fb_list = info->next; - unregister_framebuffer(&info->fb_info); + unregister_framebuffer(&info->fb_info); #ifndef __sparc__ - if (info->ati_regbase) - iounmap((void *)info->ati_regbase); - if (info->frame_buffer) - iounmap((void *)info->frame_buffer); + if (info->ati_regbase) + iounmap((void *)info->ati_regbase); + if (info->frame_buffer) + iounmap((void *)info->frame_buffer); #ifdef __BIG_ENDIAN - if (info->cursor && info->cursor->ram) - iounmap(info->cursor->ram); + if (info->cursor && info->cursor->ram) + iounmap(info->cursor->ram); #endif #endif - if (info->cursor) { - if (info->cursor->timer) - kfree(info->cursor->timer); - kfree(info->cursor); - } + if (info->cursor) { + if (info->cursor->timer) + kfree(info->cursor->timer); + kfree(info->cursor); + } #ifdef __sparc__ - if (info->mmap_map) - kfree(info->mmap_map); + if (info->mmap_map) + kfree(info->mmap_map); #endif - kfree(info); + kfree(info); } } #endif MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Geert Uytterhoeven, Bernd Harries, Eddie C. Dost, Daniel Mantione"); +MODULE_DESCRIPTION("Accelerated FBDev driver for ATI Mach64 and derivates"); + +MODULE_PARM(curblink, "i"); +MODULE_PARM_DESC(noblink, "Enable(1) or disable(0) cursor blinking"); +MODULE_PARM(noaccel, "i"); +MODULE_PARM_DESC(noaccel, "Disable(1) or enable(0) 2d acceleration"); +MODULE_PARM(default_vram, "i"); +MODULE_PARM_DESC(default_vram, "Specify the amount of available video memory"); +MODULE_PARM(default_pll, "i"); +MODULE_PARM_DESC(default_pll, "Specify the maximum PLL rate"); +MODULE_PARM(default_mclk, "i"); +MODULE_PARM_DESC(default_mclk, "Program the chip clock frequency (in MHz)"); +MODULE_PARM(default_xclk, "i"); +MODULE_PARM_DESC(default_xclk, "Program the memory clock frequency (in MHz)"); + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/aty/mach64.h linux-2.4.23-pre8/drivers/video/aty/mach64.h --- linux-2.4.22/drivers/video/aty/mach64.h 2001-07-31 21:43:29.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/aty/mach64.h 2003-10-22 22:49:07.000000000 +0000 @@ -726,6 +726,10 @@ #define VCLK2_POST 0x30 #define VCLK3_POST 0xC0 +#define EXT_VPLL_EN 0x04 +#define EXT_VPLL_VGA_EN 0x08 +#define EXT_VPLL_INSYNC 0x10 + /* CONFIG_CNTL register constants */ #define APERTURE_4M_ENABLE 1 #define APERTURE_8M_ENABLE 2 @@ -946,6 +950,7 @@ #define SRC_15BPP 0x300 #define SRC_16BPP 0x400 #define SRC_32BPP 0x600 +#define HOST_TRIPLE_EN 0x2000 #define HOST_1BPP 0 #define HOST_4BPP 0x10000 #define HOST_8BPP 0x20000 @@ -1148,6 +1153,69 @@ #define APC_LUT_MN 0x39 #define APC_LUT_OP 0x3A +/* Values in CONFIG_PANEL */ + +#define DONT_SHADOW_HEND 0x00004000ul + +/* Values in LCD_GEN_CTRL */ +#define CRT_ON 0x00000001ul +#define LCD_ON 0x00000002ul +#define HORZ_DIVBY2_EN 0x00000004ul +#define DONT_DS_ICON 0x00000008ul +#define LOCK_8DOT 0x00000010ul +#define ICON_ENABLE 0x00000020ul +#define DONT_SHADOW_VPAR 0x00000040ul +#define V2CLK_PM_EN 0x00000080ul +#define RST_FM 0x00000100ul +#define DISABLE_PCLK_RESET 0x00000200ul /* XC/XL */ +#define DIS_HOR_CRT_DIVBY2 0x00000400ul +#define SCLK_SEL 0x00000800ul +#define SCLK_DELAY 0x0000f000ul +#define TVCLK_PM_EN 0x00010000ul +#define VCLK_DAC_PM_EN 0x00020000ul +#define VCLK_LCD_OFF 0x00040000ul +#define SELECT_WAIT_4MS 0x00080000ul +#define XTALIN_PM_EN 0x00080000ul /* XC/XL */ +#define V2CLK_DAC_PM_EN 0x00100000ul +#define LVDS_EN 0x00200000ul +#define LVDS_PLL_EN 0x00400000ul +#define LVDS_PLL_RESET 0x00800000ul +#define LVDS_RESERVED_BITS 0x07000000ul +#define CRTC_RW_SELECT 0x08000000ul /* LTPro */ +#define USE_SHADOWED_VEND 0x10000000ul +#define USE_SHADOWED_ROWCUR 0x20000000ul +#define SHADOW_EN 0x40000000ul +#define SHADOW_RW_EN 0x80000000ul + +/* Values in HORZ_STRETCHING */ +#define HORZ_STRETCH_BLEND 0x00000ffful +#define HORZ_STRETCH_RATIO 0x0000fffful +#define HORZ_STRETCH_LOOP 0x00070000ul +#define HORZ_STRETCH_LOOP09 0x00000000ul +#define HORZ_STRETCH_LOOP11 0x00010000ul +#define HORZ_STRETCH_LOOP12 0x00020000ul +#define HORZ_STRETCH_LOOP14 0x00030000ul +#define HORZ_STRETCH_LOOP15 0x00040000ul +/* ? 0x00050000ul */ +/* ? 0x00060000ul */ +/* ? 0x00070000ul */ +/* ? 0x00080000ul */ +#define HORZ_PANEL_SIZE 0x0ff00000ul /* XC/XL */ +/* ? 0x10000000ul */ +#define AUTO_HORZ_RATIO 0x20000000ul /* XC/XL */ +#define HORZ_STRETCH_MODE 0x40000000ul +#define HORZ_STRETCH_EN 0x80000000ul + +/* Values in VERT_STRETCHING */ +#define VERT_STRETCH_RATIO0 0x000003fful +#define VERT_STRETCH_RATIO1 0x000ffc00ul +#define VERT_STRETCH_RATIO2 0x3ff00000ul +#define VERT_STRETCH_USE0 0x40000000ul +#define VERT_STRETCH_EN 0x80000000ul + +/* Values in EXT_VERT_STRETCH */ +#define AUTO_VERT_RATIO 0x00400000ul +#define VERT_STRETCH_MODE 0x00000400ul /* Values in LCD_MISC_CNTL */ #define BIAS_MOD_LEVEL_MASK 0x0000ff00 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/aty/mach64_ct.c linux-2.4.23-pre8/drivers/video/aty/mach64_ct.c --- linux-2.4.22/drivers/video/aty/mach64_ct.c 2001-07-31 21:43:29.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/aty/mach64_ct.c 2003-10-22 22:47:28.000000000 +0000 @@ -16,28 +16,99 @@ /* FIXME: remove the FAIL definition */ #define FAIL(x) do { printk(x "\n"); return -EINVAL; } while (0) -static void aty_st_pll(int offset, u8 val, const struct fb_info_aty *info); +static void aty_st_pll(int offset, u8 val, const struct fb_info_aty *info) stdcall; static int aty_valid_pll_ct(const struct fb_info_aty *info, u32 vclk_per, struct pll_ct *pll); -static int aty_dsp_gt(const struct fb_info_aty *info, u8 bpp, +static int aty_dsp_gt(const struct fb_info_aty *info, u8 bpp, u32 stretch, struct pll_ct *pll); static int aty_var_to_pll_ct(const struct fb_info_aty *info, u32 vclk_per, - u8 bpp, union aty_pll *pll); + u8 bpp, u32 stretch, union aty_pll *pll); static u32 aty_pll_ct_to_var(const struct fb_info_aty *info, const union aty_pll *pll); +/* + * ATI Mach64 CT clock synthesis description. + * + * All clocks on the Mach64 can be calculated using the same principle: + * + * XTALIN * x * FB_DIV + * CLK = ---------------------- + * PLL_REF_DIV * POST_DIV + * + * XTALIN is a fixed speed clock. Common speeds are 14.31 MHz and 29.50 MHz. + * PLL_REF_DIV can be set by the user, but is the same for all clocks. + * FB_DIV can be set by the user for each clock individually, it should be set + * between 128 and 255, the chip will generate a bad clock signal for too low + * values. + * x depends on the type of clock; usually it is 2, but for the MCLK it can also + * be set to 4. + * POST_DIV can be set by the user for each clock individually, Possible values + * are 1,2,4,8 and for some clocks other values are available too. + * CLK is of course the clock speed that is generated. + * + * The Mach64 has these clocks: + * + * MCLK The clock rate of the chip + * XCLK The clock rate of the on-chip memory + * VCLK0 First pixel clock of first CRT controller + * VCLK1 Second pixel clock of first CRT controller + * VCLK2 Third pixel clock of first CRT controller + * VCLK3 Fourth pixel clock of first CRT controller + * VCLK Selected pixel clock, one of VCLK0, VCLK1, VCLK2, VCLK3 + * V2CLK Pixel clock of the second CRT controller. + * SCLK Multi-purpose clock + * + * - MCLK and XCLK use the same FB_DIV + * - VCLK0 .. VCLK3 use the same FB_DIV + * - V2CLK is needed when the second CRTC is used (can be used for dualhead); + * i.e. CRT monitor connected to laptop has different resolution than built + * in LCD monitor. + * - SCLK is not available on all cards; it is known to exist on the Rage LT-PRO, + * Rage XL and Rage Mobility. It is known not to exist on the Mach64 VT. + * - V2CLK is not available on all cards, most likely only the Rage LT-PRO, + * the Rage XL and the Rage Mobility + * + * SCLK can be used to: + * - Clock the chip instead of MCLK + * - Replace XTALIN with a user defined frequency + * - Generate the pixel clock for the LCD monitor (instead of VCLK) + */ + + /* + * It can be quite hard to calculate XCLK and MCLK if they don't run at the + * same frequency. Luckily, until now all cards that need asynchrone clock + * speeds seem to have SCLK. + * So this driver uses SCLK to clock the chip and XCLK to clock the memory. + */ +static u8 postdividers[] = {1,2,4,8,3}; -static void aty_st_pll(int offset, u8 val, const struct fb_info_aty *info) +u8 stdcall aty_ld_pll(int offset, const struct fb_info_aty *info) { + unsigned long addr; + + addr = info->ati_regbase + CLOCK_CNTL + 1; /* write addr byte */ - aty_st_8(CLOCK_CNTL + 1, (offset << 2) | PLL_WR_EN, info); - /* write the register value */ - aty_st_8(CLOCK_CNTL + 2, val, info); - aty_st_8(CLOCK_CNTL + 1, (offset << 2) & ~PLL_WR_EN, info); + writeb((offset << 2) | PLL_WR_EN,addr); + addr++; + /* read the register value */ + return readb(addr); } +static void stdcall aty_st_pll(int offset, u8 val, const struct fb_info_aty *info) +{ + unsigned long addr; + addr = info->ati_regbase + CLOCK_CNTL + 1; + /* write addr byte */ + writeb((offset << 2) | PLL_WR_EN,addr); + addr++; + /* write the register value */ + writeb(val,addr); + addr--; + /* Disable write access */ + writeb(offset << 2,addr); +} /* ------------------------------------------------------------------------- */ @@ -45,179 +116,135 @@ * PLL programming (Mach64 CT family) */ +/* + * This procedure sets the display fifo. The display fifo is a buffer that + * contains data read from the video memory that waits to be processed by + * the CRT controller. + * + * On the more modern Mach64 variants, the chip doesn't calculate the + * interval after which the display fifo has to be reloaded from memory + * automatically, the driver has to do it instead. + */ + + +#define Maximum_DSP_PRECISION 7 + static int aty_dsp_gt(const struct fb_info_aty *info, u8 bpp, - struct pll_ct *pll) -{ - u32 dsp_xclks_per_row, dsp_loop_latency, dsp_precision, dsp_off, dsp_on; - u32 xclks_per_row, fifo_off, fifo_on, y, fifo_size, page_size; + u32 width, struct pll_ct *pll) { - /* xclocks_per_row<<11 */ - xclks_per_row = (pll->mclk_fb_div*pll->vclk_post_div_real*64<<11)/ - (pll->vclk_fb_div*pll->mclk_post_div_real*bpp); - if (xclks_per_row < (1<<11)) - FAIL("Dotclock to high"); - if (M64_HAS(FIFO_24)) { - fifo_size = 24; - dsp_loop_latency = 0; - } else { - fifo_size = 32; - dsp_loop_latency = 2; - } - dsp_precision = 0; - y = (xclks_per_row*fifo_size)>>11; - while (y) { - y >>= 1; - dsp_precision++; - } - dsp_precision -= 5; - /* fifo_off<<6 */ - fifo_off = ((xclks_per_row*(fifo_size-1))>>5)+(3<<6); - - if (info->total_vram > 1*1024*1024) { - if (info->ram_type >= SDRAM) { - /* >1 MB SDRAM */ - dsp_loop_latency += 8; - page_size = 8; - } else { - /* >1 MB DRAM */ - dsp_loop_latency += 6; - page_size = 9; - } - } else { - if (info->ram_type >= SDRAM) { - /* <2 MB SDRAM */ - dsp_loop_latency += 9; - page_size = 10; - } else { - /* <2 MB DRAM */ - dsp_loop_latency += 8; - page_size = 10; - } + u32 multiplier,divider,ras_multiplier,ras_divider,tmp; + u32 dsp_on,dsp_off,dsp_xclks; + u8 vshift,xshift; + s8 dsp_precision; + + multiplier = ((u32)info->mclk_fb_div)*pll->vclk_post_div_real; + divider = ((u32)pll->vclk_fb_div)*info->xclk_post_div_real; + + ras_multiplier = info->xclkmaxrasdelay; + ras_divider = 1; + + if (bpp>=8) + divider = divider * (bpp >> 2); + + vshift = (6 - 2); /* FIFO is 64 bits wide in accelerator mode ... */ + + if (bpp == 0) + vshift--; /* ... but only 32 bits in VGA mode. */ + +#ifdef CONFIG_FB_ATY_GENERIC_LCD + if (width != 0) { + multiplier = multiplier * info->lcd_width; + divider = divider * width; + + ras_multiplier = ras_multiplier * info->lcd_width; + ras_divider = ras_divider * width; + }; +#endif + + /* If we don't do this, 32 bits for multiplier & divider won't be + enough in certain situations! */ + while (((multiplier | divider) & 1) == 0) { + multiplier = multiplier >> 1; + divider = divider >> 1; + }; + + /* Determine DSP precision first */ + tmp = ((multiplier * info->fifo_size) << vshift) / divider; + for (dsp_precision = -5; tmp; dsp_precision++) + tmp >>= 1; + if (dsp_precision < 0) + dsp_precision = 0; + else if (dsp_precision > Maximum_DSP_PRECISION) + dsp_precision = Maximum_DSP_PRECISION; + + xshift = 6 - dsp_precision; + vshift += xshift; + + /* Move on to dsp_off */ + dsp_off = ((multiplier * (info->fifo_size - 1)) << vshift) / divider - + (1 << (vshift - xshift)); + + /* Next is dsp_on */ +// if (bpp == 0) +// dsp_on = ((multiplier * 20 << vshift) + divider) / divider; +// else { + dsp_on = ((multiplier << vshift) + divider) / divider; + tmp = ((ras_multiplier << xshift) + ras_divider) / ras_divider; + if (dsp_on < tmp) + dsp_on = tmp; + dsp_on = dsp_on + (tmp * 2) + (info->xclkpagefaultdelay << xshift); +// }; + + /* Calculate rounding factor and apply it to dsp_on */ + tmp = ((1 << (Maximum_DSP_PRECISION - dsp_precision)) - 1) >> 1; + dsp_on = ((dsp_on + tmp) / (tmp + 1)) * (tmp + 1); + + if (dsp_on >= ((dsp_off / (tmp + 1)) * (tmp + 1))) + { + dsp_on = dsp_off - (multiplier << vshift) / divider; + dsp_on = (dsp_on / (tmp + 1)) * (tmp + 1); } - /* fifo_on<<6 */ - if (xclks_per_row >= (page_size<<11)) - fifo_on = ((2*page_size+1)<<6)+(xclks_per_row>>5); - else - fifo_on = (3*page_size+2)<<6; - dsp_xclks_per_row = xclks_per_row>>dsp_precision; - dsp_on = fifo_on>>dsp_precision; - dsp_off = fifo_off>>dsp_precision; - - pll->dsp_config = (dsp_xclks_per_row & 0x3fff) | - ((dsp_loop_latency & 0xf)<<16) | - ((dsp_precision & 7)<<20); - pll->dsp_on_off = (dsp_on & 0x7ff) | ((dsp_off & 0x7ff)<<16); + /* Last but not least: dsp_xclks */ + dsp_xclks = ((multiplier << (vshift + 5)) + divider) / divider; + + /* Get register values. */ + pll->dsp_on_off = (dsp_on << 16) + dsp_off; + pll->dsp_config = (dsp_precision << 20) | (info->dsp_loop_latency << 16) | + dsp_xclks; return 0; -} +}; static int aty_valid_pll_ct(const struct fb_info_aty *info, u32 vclk_per, struct pll_ct *pll) { - u32 q, x; /* x is a workaround for sparc64-linux-gcc */ - x = x; /* x is a workaround for sparc64-linux-gcc */ - - pll->pll_ref_div = info->pll_per*2*255/info->ref_clk_per; - - /* FIXME: use the VTB/GTB /3 post divider if it's better suited */ - q = info->ref_clk_per*pll->pll_ref_div*4/info->mclk_per; /* actually 8*q */ - if (q < 16*8 || q > 255*8) - FAIL("mclk out of range"); - else if (q < 32*8) - pll->mclk_post_div_real = 8; - else if (q < 64*8) - pll->mclk_post_div_real = 4; - else if (q < 128*8) - pll->mclk_post_div_real = 2; - else - pll->mclk_post_div_real = 1; - pll->mclk_fb_div = q*pll->mclk_post_div_real/8; + u32 q; /* FIXME: use the VTB/GTB /{3,6,12} post dividers if they're better suited */ - q = info->ref_clk_per*pll->pll_ref_div*4/vclk_per; /* actually 8*q */ + q = info->ref_clk_per*info->pll_ref_div*4/vclk_per; /* actually 8*q */ if (q < 16*8 || q > 255*8) - FAIL("vclk out of range"); - else if (q < 32*8) - pll->vclk_post_div_real = 8; - else if (q < 64*8) - pll->vclk_post_div_real = 4; - else if (q < 128*8) - pll->vclk_post_div_real = 2; - else - pll->vclk_post_div_real = 1; + FAIL("vclk out of range"); + else { + pll->vclk_post_div = (q < 128*8); + pll->vclk_post_div += (q < 64*8); + pll->vclk_post_div += (q < 32*8); + }; + pll->vclk_post_div_real = postdividers[pll->vclk_post_div]; +// pll->vclk_post_div <<= 6; pll->vclk_fb_div = q*pll->vclk_post_div_real/8; - return 0; -} - -void aty_calc_pll_ct(const struct fb_info_aty *info, struct pll_ct *pll) -{ - u8 mpostdiv = 0; - u8 vpostdiv = 0; - - if (M64_HAS(SDRAM_MAGIC_PLL) && (info->ram_type >= SDRAM)) - pll->pll_gen_cntl = 0x04; - else - pll->pll_gen_cntl = 0x84; - - switch (pll->mclk_post_div_real) { - case 1: - mpostdiv = 0; - break; - case 2: - mpostdiv = 1; - break; - case 3: - mpostdiv = 4; - break; - case 4: - mpostdiv = 2; - break; - case 8: - mpostdiv = 3; - break; - } - pll->pll_gen_cntl |= mpostdiv<<4; /* mclk */ - - if (M64_HAS(MAGIC_POSTDIV)) - pll->pll_ext_cntl = 0; - else - pll->pll_ext_cntl = mpostdiv; /* xclk == mclk */ - - switch (pll->vclk_post_div_real) { - case 2: - vpostdiv = 1; - break; - case 3: - pll->pll_ext_cntl |= 0x10; - case 1: - vpostdiv = 0; - break; - case 6: - pll->pll_ext_cntl |= 0x10; - case 4: - vpostdiv = 2; - break; - case 12: - pll->pll_ext_cntl |= 0x10; - case 8: - vpostdiv = 3; - break; - } - pll->pll_vclk_cntl = 0x03; /* VCLK = PLL_VCLK/VCLKx_POST */ - pll->vclk_post_div = vpostdiv; + return 0; } static int aty_var_to_pll_ct(const struct fb_info_aty *info, u32 vclk_per, - u8 bpp, union aty_pll *pll) + u8 bpp, u32 width, union aty_pll *pll) { int err; if ((err = aty_valid_pll_ct(info, vclk_per, &pll->ct))) - return err; - if (M64_HAS(GTB_DSP) && (err = aty_dsp_gt(info, bpp, &pll->ct))) - return err; - aty_calc_pll_ct(info, &pll->ct); + return err; + if (M64_HAS(GTB_DSP) && (err = aty_dsp_gt(info, bpp, width, &pll->ct))) + return err; return 0; } @@ -225,7 +252,7 @@ const union aty_pll *pll) { u32 ref_clk_per = info->ref_clk_per; - u8 pll_ref_div = pll->ct.pll_ref_div; + u8 pll_ref_div = info->pll_ref_div; u8 vclk_fb_div = pll->ct.vclk_fb_div; u8 vclk_post_div = pll->ct.vclk_post_div_real; @@ -234,27 +261,187 @@ void aty_set_pll_ct(const struct fb_info_aty *info, const union aty_pll *pll) { - aty_st_pll(PLL_REF_DIV, pll->ct.pll_ref_div, info); - aty_st_pll(PLL_GEN_CNTL, pll->ct.pll_gen_cntl, info); - aty_st_pll(MCLK_FB_DIV, pll->ct.mclk_fb_div, info); + u8 a; aty_st_pll(PLL_VCLK_CNTL, pll->ct.pll_vclk_cntl, info); - aty_st_pll(VCLK_POST_DIV, pll->ct.vclk_post_div, info); + a = aty_ld_pll(VCLK_POST_DIV, info) & ~3; + aty_st_pll(VCLK_POST_DIV, a | pll->ct.vclk_post_div, info); aty_st_pll(VCLK0_FB_DIV, pll->ct.vclk_fb_div, info); - aty_st_pll(PLL_EXT_CNTL, pll->ct.pll_ext_cntl, info); if (M64_HAS(GTB_DSP)) { - if (M64_HAS(XL_DLL)) - aty_st_pll(DLL_CNTL, 0x80, info); - else if (info->ram_type >= SDRAM) - aty_st_pll(DLL_CNTL, 0xa6, info); - else - aty_st_pll(DLL_CNTL, 0xa0, info); - aty_st_pll(VFC_CNTL, 0x1b, info); - aty_st_le32(DSP_CONFIG, pll->ct.dsp_config, info); - aty_st_le32(DSP_ON_OFF, pll->ct.dsp_on_off, info); + aty_st_le32(DSP_CONFIG, pll->ct.dsp_config, info); + aty_st_le32(DSP_ON_OFF, pll->ct.dsp_on_off, info); } } + +static void __init aty_init_pll_ct(struct fb_info_aty *info) { + u8 pll_ref_div,pll_gen_cntl,pll_ext_cntl; + u8 mpost_div,xpost_div; + u8 sclk_post_div_real,sclk_fb_div,spll_cntl2; + u32 q,i; + u32 mc,trp,trcd,tcrd,tras; + + mc = aty_ld_le32(MEM_CNTL, info); + trp = (mc & 0x300) >> 8; + trcd = (mc & 0xc00) >> 10; + tcrd = (mc & 0x1000) >> 12; tras = (mc & 0x70000) >> 16; + info->xclkpagefaultdelay = trcd + tcrd + trp + 2; + info->xclkmaxrasdelay = tras + trp + 2; + + if (M64_HAS(FIFO_24)) { + info->fifo_size = 24; + info->xclkpagefaultdelay += 2; + info->xclkmaxrasdelay += 3; + } else { + info->fifo_size = 32; + }; + + switch (info->ram_type) { + case DRAM: + if (info->total_vram<=1*1024*1024) { + info->dsp_loop_latency = 10; + } else { + info->dsp_loop_latency = 8; + info->xclkpagefaultdelay += 2; + }; + break; + case EDO: + case PSEUDO_EDO: + if (info->total_vram<=1*1024*1024) { + info->dsp_loop_latency = 9; + } else { + info->dsp_loop_latency = 8; + info->xclkpagefaultdelay += 1; + }; + break; + case SDRAM: + if (info->total_vram<=1*1024*1024) { + info->dsp_loop_latency = 11; + } else { + info->dsp_loop_latency = 10; + info->xclkpagefaultdelay += 1; + }; + break; + case SGRAM: + info->dsp_loop_latency = 8; + info->xclkpagefaultdelay += 3; + break; + default: + info->dsp_loop_latency = 11; + info->xclkpagefaultdelay += 3; + break; + }; + + if (info->xclkmaxrasdelay <= info->xclkpagefaultdelay) + info->xclkmaxrasdelay = info->xclkpagefaultdelay + 1; + + /* Exit if the user does not want us to tamper with the clock + rates of her chip. */ + if (info->mclk_per == 0) { + u16 mclk_fb_div; + u8 pll_ext_cntl; + + info->pll_ref_div = aty_ld_pll(PLL_REF_DIV, info); + pll_ext_cntl = aty_ld_pll(PLL_EXT_CNTL, info); + info->xclk_post_div_real = postdividers[pll_ext_cntl & 7]; + mclk_fb_div = aty_ld_pll(MCLK_FB_DIV, info); + if (pll_ext_cntl & 8) + mclk_fb_div <<= 1; + info->mclk_fb_div = mclk_fb_div; + return; + }; + + pll_ref_div = info->pll_per*2*255/info->ref_clk_per; + info->pll_ref_div = pll_ref_div; + + /* FIXME: use the VTB/GTB /3 post divider if it's better suited */ + q = info->ref_clk_per*pll_ref_div*4/info->xclk_per; /* actually 8*q */ + if (q < 16*8 || q > 255*8) { + printk(KERN_CRIT "xclk out of range\n"); + return; + } else { + xpost_div = (q < 128*8); + xpost_div += (q < 64*8); + xpost_div += (q < 32*8); + }; + info->xclk_post_div_real = postdividers[xpost_div]; + info->mclk_fb_div = q*info->xclk_post_div_real/8; + + if (M64_HAS(SDRAM_MAGIC_PLL) && (info->ram_type >= SDRAM)) + pll_gen_cntl = 0x04; + else + /* The Rage Mobility M1 needs bit 3 set...*/ + /* original: pll_gen_cntl = 0x84 */ + pll_gen_cntl = 0x8C; + + if (M64_HAS(MAGIC_POSTDIV)) + pll_ext_cntl = 0; + else + pll_ext_cntl = xpost_div; + + if (info->mclk_per == info->xclk_per) + pll_gen_cntl |= xpost_div<<4; /* mclk == xclk */ + else { + /* + * The chip clock is not equal to the memory clock. + * Therefore we will use sclk to clock the chip. + */ + pll_gen_cntl |= 6<<4; /* mclk == sclk*/ + + q = info->ref_clk_per*pll_ref_div*4/info->mclk_per; /* actually 8*q */ + if (q < 16*8 || q > 255*8) { + printk(KERN_CRIT "mclk out of range\n"); + return; + } else { + mpost_div = (q < 128*8); + mpost_div += (q < 64*8); + mpost_div += (q < 32*8); + }; + sclk_post_div_real = postdividers[mpost_div]; + sclk_fb_div = q*sclk_post_div_real/8; + spll_cntl2 = mpost_div << 4; + /* + * This disables the sclk, crashes the computer as reported: + * aty_st_pll(SPLL_CNTL2, 3, info); + * + * So it seems the sclk must be enabled before it is used; + * so PLL_GEN_CNTL must be programmed *after* the sclk. + */ + aty_st_pll(SCLK_FB_DIV, sclk_fb_div, info); + aty_st_pll(SPLL_CNTL2, spll_cntl2, info); + /* + * The sclk has been started. However, I believe the first clock + * ticks it generates are not very stable. Hope this primitive loop + * helps for Rage Mobilities that sometimes crash when + * we switch to sclk. (Daniel Mantione, 13-05-2003) + */ + for (i=0;i<=0x1ffff;i++); + }; + + aty_st_pll(PLL_REF_DIV, pll_ref_div, info); + aty_st_pll(PLL_GEN_CNTL, pll_gen_cntl, info); + aty_st_pll(MCLK_FB_DIV, info->mclk_fb_div, info); + aty_st_pll(PLL_EXT_CNTL, pll_ext_cntl, info); + /* Disable the extra precision pixel clock controls since we do not + use them. */ + aty_st_pll(EXT_VPLL_CNTL, aty_ld_pll(EXT_VPLL_CNTL, info) & + ~(EXT_VPLL_EN | EXT_VPLL_VGA_EN | + EXT_VPLL_INSYNC), info); +#if 0 + /* This code causes problems on the Rage Mobility M1 + and seems unnecessary. Comments wanted! */ + if (M64_HAS(GTB_DSP)) { + if (M64_HAS(XL_DLL)) + aty_st_pll(DLL_CNTL, 0x80, info); + else if (info->ram_type >= SDRAM) + aty_st_pll(DLL_CNTL, 0xa6, info); + else + aty_st_pll(DLL_CNTL, 0xa0, info); + aty_st_pll(VFC_CNTL, 0x1b, info); + }; +#endif +}; + static int dummy(void) { return 0; @@ -268,5 +455,6 @@ var_to_pll: aty_var_to_pll_ct, pll_to_var: aty_pll_ct_to_var, set_pll: aty_set_pll_ct, + init_pll: aty_init_pll_ct }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/aty/mach64_cursor.c linux-2.4.23-pre8/drivers/video/aty/mach64_cursor.c --- linux-2.4.22/drivers/video/aty/mach64_cursor.c 2001-10-25 20:53:52.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/aty/mach64_cursor.c 2003-10-22 22:49:41.000000000 +0000 @@ -144,6 +144,10 @@ yoff = 0; } + /* In doublescan mode, the cursor location also needs to be + doubled. */ + if (par->crtc.gen_cntl & CRTC_DBL_SCAN_EN) + y<<=1; wait_for_fifo(4, fb); aty_st_le32(CUR_OFFSET, (c->offset >> 3) + (yoff << 1), fb); aty_st_le32(CUR_HORZ_VERT_OFF, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/aty/mach64_gx.c linux-2.4.23-pre8/drivers/video/aty/mach64_gx.c --- linux-2.4.22/drivers/video/aty/mach64_gx.c 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/aty/mach64_gx.c 2003-10-22 22:47:54.000000000 +0000 @@ -5,7 +5,6 @@ #include #include -#include #include @@ -37,6 +36,11 @@ #define MIN_N 35 #define MAX_N 255-8 +static int dummy(void) +{ + return 0; +} + /* * Support Functions @@ -183,6 +187,7 @@ var_to_pll: aty_var_to_pll_514, pll_to_var: aty_pll_514_to_var, set_pll: aty_set_pll_514, + init_pll: (void *)dummy }; @@ -467,6 +472,7 @@ var_to_pll: aty_var_to_pll_18818, pll_to_var: aty_pll_18818_to_var, set_pll: aty_set_pll18818, + init_pll: (void *)dummy }; @@ -580,6 +586,7 @@ var_to_pll: aty_var_to_pll_1703, pll_to_var: aty_pll_1703_to_var, set_pll: aty_set_pll_1703, + init_pll: (void *)dummy }; @@ -707,6 +714,7 @@ var_to_pll: aty_var_to_pll_8398, pll_to_var: aty_pll_8398_to_var, set_pll: aty_set_pll_8398, + init_pll: (void *)dummy }; @@ -851,6 +859,7 @@ var_to_pll: aty_var_to_pll_408, pll_to_var: aty_pll_408_to_var, set_pll: aty_set_pll_408, + init_pll: (void *)dummy }; @@ -870,11 +879,6 @@ return 0; } -static int dummy(void) -{ - return 0; -} - const struct aty_dac_ops aty_dac_unsupported = { set_dac: aty_set_dac_unsupported, }; @@ -883,5 +887,6 @@ var_to_pll: (void *)dummy, pll_to_var: (void *)dummy, set_pll: (void *)dummy, + init_pll: (void *)dummy }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/aty128fb.c linux-2.4.23-pre8/drivers/video/aty128fb.c --- linux-2.4.22/drivers/video/aty128fb.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/aty128fb.c 2003-10-22 22:48:54.000000000 +0000 @@ -2134,9 +2134,12 @@ char *rom_base; char *rom; int stage; - int i; + int i,j; char aty_rom_sig[] = "761295520"; /* ATI ROM Signature */ - char R128_sig[] = "R128"; /* Rage128 ROM identifier */ + char *R128_sig[] = { + "R128", /* Rage128 ROM identifier */ + "128b" + }; for (segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) { stage = 1; @@ -2167,10 +2170,14 @@ /* ATI signature found. Let's see if it's a Rage128 */ for (i = 0; (i < 512) && (stage != 4); i++) { - if (R128_sig[0] == *rom) - if (strncmp(R128_sig, rom, - strlen(R128_sig)) == 0) - stage = 4; + for(j = 0;j < sizeof(R128_sig)/sizeof(char *);j++) { + if (R128_sig[j][0] == *rom) + if (strncmp(R128_sig[j], rom, + strlen(R128_sig[j])) == 0) { + stage = 4; + break; + } + } rom++; } if (stage != 4) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/fbcmap.c linux-2.4.23-pre8/drivers/video/fbcmap.c --- linux-2.4.22/drivers/video/fbcmap.c 2001-03-03 02:38:39.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/fbcmap.c 2003-10-22 22:49:20.000000000 +0000 @@ -271,7 +271,7 @@ hred = *red; hgreen = *green; hblue = *blue; - htransp = transp ? *transp : 0; + htransp = transp ? *transp : 0xffff; } else { get_user(hred, red); get_user(hgreen, green); @@ -279,7 +279,7 @@ if (transp) get_user(htransp, transp); else - htransp = 0; + htransp = 0xffff; } red++; green++; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/q40fb.c linux-2.4.23-pre8/drivers/video/q40fb.c --- linux-2.4.22/drivers/video/q40fb.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/q40fb.c 2003-10-22 22:48:17.000000000 +0000 @@ -148,6 +148,8 @@ return -EINVAL; if(var->activate!=FB_ACTIVATE_NOW) return -EINVAL; +// ignore broken tools trying to set these values +#if 0 if(var->pixclock!=0) return -EINVAL; if(var->left_margin!=0) @@ -162,6 +164,7 @@ return -EINVAL; if(var->vmode!=FB_VMODE_NONINTERLACED) return -EINVAL; +#endif return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/300vtbl.h linux-2.4.23-pre8/drivers/video/sis/300vtbl.h --- linux-2.4.22/drivers/video/sis/300vtbl.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/300vtbl.h 2003-10-22 22:47:55.000000000 +0000 @@ -29,6 +29,8 @@ * * Author: Thomas Winischhofer * + * Based on code by Silicon Intergrated Systems + * */ typedef struct _SiS300_StStruct @@ -242,10 +244,10 @@ {0x0047,0x3e,0x34,0x06,0x29,1152, 864}, /* 36 1152x864-75Hz */ {0x0047,0x44,0x3a,0x06,0x29,1152, 864}, /* 37 1152x864-85Hz */ {0x00c7,0x3f,0x28,0x00,0x39, 848, 480}, /* 38 848x480-38Hzi */ - {0xc047,0x40,0x3d,0x00,0x39, 848, 480}, /* 39 848x480-60Hz */ + {0xc067,0x40,0x3d,0x0b,0x39, 848, 480}, /* 39 848x480-60Hz */ {0x00c7,0x41,0x28,0x00,0x3f, 856, 480}, /* 3a 856x480-38Hzi */ {0xc047,0x42,0x28,0x00,0x3f, 856, 480}, /* 3b 856x480-60Hz */ - {0x0047,0x43,0x3e,0x00,0x48,1360, 768}, /* 3c 1360x768-60Hz */ + {0x0067,0x43,0x3e,0x0c,0x48,1360, 768}, /* 3c 1360x768-60Hz */ {0x0077,0x46,0x3f,0x08,0x55,1280, 768}, /* 3d 1280x768-60Hz */ {0x000f,0x47,0x03,0x06,0x5f, 768, 576}, /* 3e 768x576 */ {0x0027,0x48,0x13,0x08,0x67,1360,1024}, /* 3f 1360x1024-59Hz (BARCO1366 only) */ @@ -690,19 +692,19 @@ { 0x31,0xc2, 39}, /* 0x27 */ { 0xbf,0xc8, 35}, /* 0x28 */ /* 856x480 */ { 0x60,0x36, 30}, /* 0x29 */ /* CH/UNTSC TEXT | LVDS_2(CH) - 730, A901(301B), Mitac(CH): 0xe0, 0xb6, 30 */ - { 0x40,0x4a, 28}, /* 0x2a */ - { 0x9f,0x46, 44}, /* 0x2b */ - { 0x97,0x2c, 26}, /* 0x2c */ - { 0x44,0xe4, 25}, /* 0x2d */ - { 0x7e,0x32, 47}, /* 0x2e */ + { 0x40,0x4a, 28}, /* 0x2a */ /* CH-TV */ + { 0x9f,0x46, 44}, /* 0x2b */ /* CH-TV */ + { 0x97,0x2c, 26}, /* 0x2c */ /* CH-TV */ + { 0x44,0xe4, 25}, /* 0x2d */ /* CH-TV */ + { 0x7e,0x32, 47}, /* 0x2e */ /* CH-TV */ { 0x8a,0x24, 31}, /* 0x2f */ /* CH/PAL TEXT | LVDS_2(CH), Mitac(CH) - 730, A901(301B): 0x57, 0xe4, 31 */ - { 0x97,0x2c, 26}, /* 0x30 */ - { 0xce,0x3c, 39}, /* 0x31 */ + { 0x97,0x2c, 26}, /* 0x30 */ /* CH-TV */ + { 0xce,0x3c, 39}, /* 0x31 */ /* CH-TV */ { 0x52,0x4a, 36}, /* 0x32 */ /* CH/PAL 800x600 5/6 */ { 0x34,0x61, 95}, /* 0x33 */ { 0x78,0x27,108}, /* 0x34 */ /* Replacement for index 0x14 for 630 (?) */ { 0xce,0x25,189}, /* 0x35 */ /* Replacement for index 0x1b for 730 (and 540?) */ - { 0x45,0x6b, 21}, /* 0x36 */ + { 0x45,0x6b, 21}, /* 0x36 */ /* Chrontel SuperOverscan */ { 0x52,0xe2, 49}, /* 0x37 */ /* 16:9 modes */ { 0x2b,0x61, 78}, /* 0x38 */ /* 16:9 modes */ { 0x70,0x44,108}, /* 0x39 */ /* 16:9 modes */ @@ -2078,7 +2080,7 @@ static const SiS300_CHTVRegDataStruct SiS300_CHTVReg_SOPAL[] = { - {{0x41,0x12,0x01,0x50,0x34,0,0,0,0,0,0,0,0,0,0,0}}, /* Mode 9: 640x400 PAL 5/4 */ + {{0x41,0x12,0x01,0x50,0x34,0,0,0,0,0,0,0,0,0,0,0}}, /* Mode 9: 640x400 PAL 1/1 */ {{0x41,0x12,0x00,0x50,0x00,0,0,0,0,0,0,0,0,0,0,0}}, {{0x41,0x12,0x01,0x50,0x34,0,0,0,0,0,0,0,0,0,0,0}}, {{0x41,0x12,0x00,0x50,0x00,0,0,0,0,0,0,0,0,0,0,0}}, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/310vtbl.h linux-2.4.23-pre8/drivers/video/sis/310vtbl.h --- linux-2.4.22/drivers/video/sis/310vtbl.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/310vtbl.h 2003-10-22 22:49:05.000000000 +0000 @@ -29,6 +29,8 @@ * * Author: Thomas Winischhofer * + * Based on code by Silicon Intergrated Systems + * */ typedef struct _SiS310_StStruct @@ -117,8 +119,8 @@ {0x5a,0x021b,0x0014,0x0138,SIS_RI_320x240, 0x00,0x00,0x04,0x3f}, /* 320x240x8 fstn */ {0x5b,0x0a1d,0x0014,0x0135,SIS_RI_320x240, 0x00,0x00,0x04,0x3f}, /* 320x240x16 fstn */ {0x5c,0xba1f,0x0204,0x0000,SIS_RI_512x384, 0x00,0x00,0x00,0x28}, /* 512x384x32 */ - {0x5d,0x0a1d,0x0305,0x0139,SIS_RI_640x400, 0x00,0x00,0x07,0x10}, - {0x5e,0x0a1f,0x0305,0x0000,SIS_RI_640x400, 0x00,0x00,0x07,0x10}, /* 640x400x32 */ + {0x5d,0x0a1d,0x0305,0x0139,SIS_RI_640x400, 0x00,0x00,0x05,0x10}, + {0x5e,0x0a1f,0x0305,0x0000,SIS_RI_640x400, 0x00,0x00,0x05,0x10}, /* 640x400x32 */ {0x62,0x0a3f,0x0306,0x013a,SIS_RI_640x480, 0x00,0x00,0x05,0x08}, /* 640x480x32 */ {0x63,0x2a3f,0x0407,0x013b,SIS_RI_800x600, 0x00,0x00,0x07,0x00}, /* 800x600x32 */ {0x64,0x0a7f,0x0508,0x013c,SIS_RI_1024x768, 0x00,0x00,0x08,0x13}, /* 1024x768x32 */ @@ -163,9 +165,9 @@ {0x4f,0x9a1f,0x0000,0x0000,SIS_RI_320x200, 0x00,0x00,0x04,0x25}, /* 320x200x32 */ {0x53,0x9a1f,0x0001,0x0000,SIS_RI_320x240, 0x00,0x00,0x04,0x26}, /* 320x240x32 */ {0x54,0xba1f,0x0103,0x0000,SIS_RI_400x300, 0x00,0x00,0x07,0x27}, /* 400x300x32 */ - {0x5f,0x2a1b,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x4a}, /* 768x576x8 */ - {0x60,0x2a1d,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x4a}, /* 768x576x16 */ - {0x61,0x2a1f,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x00,0x4a}, /* 768x576x32 */ + {0x5f,0x2a1b,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x4a}, /* 768x576x8 */ + {0x60,0x2a1d,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x4a}, /* 768x576x16 */ + {0x61,0x2a1f,0x0f0e,0x0000,SIS_RI_768x576, 0x00,0x00,0x06,0x4a}, /* 768x576x32 */ {0xff,0x0000,0x0000,0x0000,0x00, 0x00,0x00,0x00,0x00} }; @@ -252,10 +254,10 @@ {0x0047,0x44,0x19,0x00,0x29,1152, 864}, /* 0x43 TW: Non-BIOS, new */ {0x0047,0x4a,0x1e,0x00,0x29,1152, 864}, /* 0x44 TW: Non-BIOS, new */ {0x00c7,0x45,0x57,0x00,0x39, 848, 480}, /* 0x45 TW: 848x480-38Hzi - Non-BIOS, new */ - {0xc047,0x46,0x55,0x00,0x39, 848, 480}, /* 0x46 TW: 848x480-60Hz - Non-BIOS, new */ + {0xc067,0x46,0x55,0x0b,0x39, 848, 480}, /* 0x46 TW: 848x480-60Hz - Non-BIOS, new */ {0x00c7,0x47,0x57,0x00,0x3f, 856, 480}, /* 0x47 TW: 856x480-38Hzi - Non-BIOS, new */ {0xc047,0x48,0x57,0x00,0x3f, 856, 480}, /* 0x48 TW: 856x480-60Hz - Non-BIOS, new */ - {0x0047,0x49,0x58,0x00,0x48,1360, 768}, /* 0x49 TW: 1360x768-60Hz - Non-BIOS, new */ + {0x0067,0x49,0x58,0x0c,0x48,1360, 768}, /* 0x49 TW: 1360x768-60Hz - Non-BIOS, new */ {0x000f,0x4d,0x03,0x06,0x5f, 768, 576}, /* 0x4a TW: 768x576 */ {0xffff,0x00,0x00,0x00,0x00, 0, 0} }; @@ -925,7 +927,7 @@ { 1, 1,1688,1066,1688,1066} }; -static const SiS310_LCDDataStruct SiS310_ExtLCD1280x1024Data[] = +static const SiS310_LCDDataStruct SiS310_ExtLCD1280x1024Data[] = { { 211, 60,1024, 501,1688,1066}, { 211, 60,1024, 508,1688,1066}, @@ -962,7 +964,7 @@ { 1, 1,1344, 806,1344, 806} }; -static const SiS310_LCDDataStruct SiS310_NoScaleData1280x1024[] = +static const SiS310_LCDDataStruct SiS310_NoScaleData1280x1024[] = { { 1, 1,1688,1066,1688,1066}, { 1, 1,1688,1066,1688,1066}, @@ -975,6 +977,7 @@ { 1, 1,1688,1066,1688,1066} }; + typedef struct _SiS310_PanelDelayTblStruct { UCHAR timer[2]; @@ -1591,16 +1594,17 @@ }; static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1600x1200_1[] = -{ /* TW: Temporary data, invalid */ - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}} +{ + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}} }; static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1024x768_2[] = @@ -1611,8 +1615,8 @@ {{0x2c,0x12,0x38,0x55,0x2f,0xc1,0x35,0xb1,0x47,0xe9,0x71,0x33}}, {{0x2d,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xc1,0x49,0x33}}, {{0x29,0x12,0xb5,0xd2,0xac,0xe9,0x35,0xd9,0x47,0x11,0x99,0x33}}, - {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}, /* old */ -/* 0x36,0x13,0x02,0x25,0xff,0x03,0x45,0x09,0x07,0xf9,0x00,0x24 new? */ + {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}, /* others */ +/* 0x36,0x13,0x02,0x25,0xff,0x03,0x45,0x09,0x07,0xf9,0x00,0x24 my */ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} }; @@ -1644,22 +1648,23 @@ }; static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1600x1200_2[] = -{ /* TW: Temporary data, invalid */ - {{0x2b,0x12,0xd9,0xe5,0xd5,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}}, - {{0x22,0x12,0xc0,0xcc,0xbc,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}}, - {{0x2b,0x12,0xd9,0xe5,0xd5,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}}, - {{0x22,0x12,0xc0,0xcc,0xbc,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}}, - {{0x33,0x13,0x01,0x0d,0xfd,0x2c,0x23,0x98,0x27,0x3e,0x08,0x42}}, - {{0x3f,0x1b,0x3d,0x49,0x39,0x54,0x23,0xc0,0x27,0x66,0x30,0x42}}, - {{0x33,0x1b,0x91,0x9d,0x8d,0x8c,0x23,0xf8,0x27,0x9e,0x68,0x42}}, - {{0x43,0x24,0x11,0x1d,0x0d,0xcc,0x23,0x38,0x37,0xde,0xa8,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}} +{ + {{0x32,0x1B,0x2C,0x52,0x20,0x80,0x20,0x52,0x30,0xA3,0x3A,0x02}}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {{0x32,0x1B,0x2C,0x52,0x20,0x80,0x20,0x52,0x30,0xA3,0x3A,0x02}}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {{0x3A,0x1B,0x54,0x7A,0x48,0x80,0x24,0x52,0x30,0xA3,0x3A,0x02}}, + {{0x36,0x1B,0x90,0xB6,0x84,0xA8,0x24,0x7A,0x30,0xCB,0x62,0x02}}, + {{0x3A,0x1C,0xE4,0x0A,0xD8,0xE0,0x24,0xB2,0x30,0x03,0x9A,0x02}}, + {{0x4A,0x24,0x64,0x8A,0x58,0x20,0x34,0xF2,0x30,0x43,0xDA,0x52}}, + {{0x47,0x24,0x71,0x97,0x65,0x3E,0x34,0x10,0x40,0x61,0xF8,0x02}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}} }; static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1024x768_3[] = -{ /* TW: Data from 650/301LVx 1.10.6s */ -#if 0 +{ +#if 1 /* Data from 650/301LVx 1.10.6s and others */ {{0x25,0x13,0xc9,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}, {{0x2c,0x13,0x9a,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}, {{0x25,0x13,0xc9,0x24,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}, @@ -1669,8 +1674,9 @@ {{0x36,0x13,0x13,0x25,0xff,0x59,0x45,0x09,0x07,0xf9,0x09,0x24}}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, {{0x25,0x13,0xc9,0x25,0xff,0xf9,0x45,0x09,0x07,0xf9,0x09,0x24}} -#endif /* Data from my 301LV */ - {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}, /* @@@@@ TEST */ +#endif +#if 0 /* Data from my 301LV */ + {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}, /* TEST */ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}, {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}, {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}, @@ -1679,6 +1685,7 @@ {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}, {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}}, {{0x36,0x13,0x02,0x25,0xff,0x21,0x45,0x09,0x07,0x88,0x09,0x24}} +#endif }; /* 1 2 4 5 6 1c 1d 1f 20 21 23 25 */ @@ -1708,16 +1715,17 @@ }; static const SiS310_Part2PortTblStruct SiS310_CRT2Part2_1600x1200_3[] = -{ /* TW: Temporary data, invalid */ - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x42}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}}, - {{0x43,0x24,0x21,0x29,0x19,0xea,0x23,0x0a,0x07,0x32,0xc6,0x32}} +{ + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}}, + {{0x4C,0x24,0xC8,0xE1,0xAF,0x70,0x34,0x0A,0x07,0xFC,0x2A,0x53}} }; typedef struct _SiS310_LCDACRT1DataStruct diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/init.c linux-2.4.23-pre8/drivers/video/sis/init.c --- linux-2.4.22/drivers/video/sis/init.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/init.c 2003-10-22 22:48:19.000000000 +0000 @@ -1,6 +1,7 @@ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init.c,v 1.3 2002/24/04 01:16:16 dawes Exp $ */ /* - * Mode switching code (CRT1 section) for SiS 300/540/630/730/315/550/650/740/330/660 + * Mode switching code (CRT1 section) for + * SiS 300/540/630/730/315/550/650/M650/651/M652/740/330/660/M660/760 * (Universal module for Linux kernel framebuffer and XFree86 4.x) * * Assembler-To-C translation @@ -62,10 +63,6 @@ #endif /* dual head */ #endif /* linux_xf86 */ -#ifdef LINUXBIOS -BOOLEAN SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension); -#endif - #ifdef LINUX_XF86 BOOLEAN SiSSetMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, ScrnInfoPtr pScrn,USHORT ModeNo, BOOLEAN dosetpitch); @@ -74,14 +71,16 @@ USHORT ModeNo); #endif +#ifndef LINUX_XF86 +static ULONG GetDRAMSize(SiS_Private *SiS_Pr, + PSIS_HW_DEVICE_INFO HwDeviceExtension); +#endif + #if defined(ALLOC_PRAGMA) #pragma alloc_text(PAGE,SiSSetMode) #pragma alloc_text(PAGE,SiSInit) #endif -static ULONG GetDRAMSize(SiS_Private *SiS_Pr, - PSIS_HW_DEVICE_INFO HwDeviceExtension); - static void InitCommonPointer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { @@ -219,6 +218,8 @@ SiS_Pr->SiS_LVDSBARCO1366Data_2 = SiS_LVDSBARCO1366Data_2; SiS_Pr->SiS_LVDSBARCO1024Data_1 = SiS_LVDSBARCO1024Data_1; SiS_Pr->SiS_LVDSBARCO1024Data_2 = SiS_LVDSBARCO1024Data_2; + SiS_Pr->SiS_LVDS848x480Data_1 = SiS_LVDS848x480Data_1; + SiS_Pr->SiS_LVDS848x480Data_2 = SiS_LVDS848x480Data_2; SiS_Pr->SiS_LCDA1400x1050Data_1 = SiS_LCDA1400x1050Data_1; SiS_Pr->SiS_LCDA1400x1050Data_2 = SiS_LCDA1400x1050Data_2; @@ -463,8 +464,8 @@ SiS_Pr->SiS_CRT1Table = (SiS_CRT1TableStruct *)SiS310_CRT1Table; /* TW: MCLK is different */ #ifdef LINUXBIOS - if(HwDeviceExtension->jChipType == SIS_660) { - SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_660; /* 660 */ + if(HwDeviceExtension->jChipType >= SIS_660) { + SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_660; /* 660/760 */ } else if(HwDeviceExtension->jChipType == SIS_330) { #endif SiS_Pr->SiS_MCLKData_0 = (SiS_MCLKDataStruct *)SiS310_MCLKData_0_330; /* 330 */ @@ -554,1338 +555,117 @@ SiS_Pr->SiS_PanelType05_2 = (SiS_LVDSDesStruct *)SiS310_PanelType05_2; SiS_Pr->SiS_PanelType06_2 = (SiS_LVDSDesStruct *)SiS310_PanelType06_2; SiS_Pr->SiS_PanelType07_2 = (SiS_LVDSDesStruct *)SiS310_PanelType07_2; - SiS_Pr->SiS_PanelType08_2 = (SiS_LVDSDesStruct *)SiS310_PanelType08_2; - SiS_Pr->SiS_PanelType09_2 = (SiS_LVDSDesStruct *)SiS310_PanelType09_2; - SiS_Pr->SiS_PanelType0a_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0a_2; - SiS_Pr->SiS_PanelType0b_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0b_2; - SiS_Pr->SiS_PanelType0c_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0c_2; - SiS_Pr->SiS_PanelType0d_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0d_2; - SiS_Pr->SiS_PanelType0e_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0e_2; - SiS_Pr->SiS_PanelType0f_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0f_2; - - SiS_Pr->SiS_CRT2Part2_1024x768_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_1; - SiS_Pr->SiS_CRT2Part2_1280x1024_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_1; - SiS_Pr->SiS_CRT2Part2_1400x1050_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_1; - SiS_Pr->SiS_CRT2Part2_1600x1200_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_1; - SiS_Pr->SiS_CRT2Part2_1024x768_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_2; - SiS_Pr->SiS_CRT2Part2_1280x1024_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_2; - SiS_Pr->SiS_CRT2Part2_1400x1050_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_2; - SiS_Pr->SiS_CRT2Part2_1600x1200_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_2; - SiS_Pr->SiS_CRT2Part2_1024x768_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_3; - SiS_Pr->SiS_CRT2Part2_1280x1024_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_3; - SiS_Pr->SiS_CRT2Part2_1400x1050_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_3; - SiS_Pr->SiS_CRT2Part2_1600x1200_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_3; - - SiS_Pr->SiS_LVDSCRT1800x600_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1; - SiS_Pr->SiS_LVDSCRT11024x768_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1; - SiS_Pr->SiS_LVDSCRT11280x1024_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1; - SiS_Pr->SiS_LVDSCRT11400x1050_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1; - SiS_Pr->SiS_LVDSCRT11600x1200_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1; - SiS_Pr->SiS_LVDSCRT1800x600_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1_H; - SiS_Pr->SiS_LVDSCRT11024x768_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1_H; - SiS_Pr->SiS_LVDSCRT11280x1024_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1_H; - SiS_Pr->SiS_LVDSCRT11400x1050_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1_H; - SiS_Pr->SiS_LVDSCRT11600x1200_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1_H; - SiS_Pr->SiS_LVDSCRT1800x600_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2; - SiS_Pr->SiS_LVDSCRT11024x768_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2; - SiS_Pr->SiS_LVDSCRT11280x1024_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2; - SiS_Pr->SiS_LVDSCRT11400x1050_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2; - SiS_Pr->SiS_LVDSCRT11600x1200_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2; - SiS_Pr->SiS_LVDSCRT1800x600_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2_H; - SiS_Pr->SiS_LVDSCRT11024x768_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2_H; - SiS_Pr->SiS_LVDSCRT11280x1024_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2_H; - SiS_Pr->SiS_LVDSCRT11400x1050_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2_H; - SiS_Pr->SiS_LVDSCRT11600x1200_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2_H; - SiS_Pr->SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UNTSC; - SiS_Pr->SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1ONTSC; - SiS_Pr->SiS_CHTVCRT1UPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UPAL; - SiS_Pr->SiS_CHTVCRT1OPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1OPAL; - SiS_Pr->SiS_CHTVCRT1SOPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1SOPAL; - - SiS_Pr->SiS_CHTVReg_UNTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UNTSC; - SiS_Pr->SiS_CHTVReg_ONTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_ONTSC; - SiS_Pr->SiS_CHTVReg_UPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPAL; - SiS_Pr->SiS_CHTVReg_OPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPAL; - SiS_Pr->SiS_CHTVReg_UPALM = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPALM; - SiS_Pr->SiS_CHTVReg_OPALM = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPALM; - SiS_Pr->SiS_CHTVReg_UPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPALN; - SiS_Pr->SiS_CHTVReg_OPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPALN; - SiS_Pr->SiS_CHTVReg_SOPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_SOPAL; - - SiS_Pr->SiS_LCDACRT1800x600_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_1; - SiS_Pr->SiS_LCDACRT11024x768_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_1; - SiS_Pr->SiS_LCDACRT11280x1024_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_1; - SiS_Pr->SiS_LCDACRT11400x1050_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_1; - SiS_Pr->SiS_LCDACRT11600x1200_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_1; - SiS_Pr->SiS_LCDACRT1800x600_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_1_H; - SiS_Pr->SiS_LCDACRT11024x768_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_1_H; - SiS_Pr->SiS_LCDACRT11280x1024_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_1_H; - SiS_Pr->SiS_LCDACRT11400x1050_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_1_H; - SiS_Pr->SiS_LCDACRT11600x1200_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_1_H; - SiS_Pr->SiS_LCDACRT1800x600_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_2; - SiS_Pr->SiS_LCDACRT11024x768_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_2; - SiS_Pr->SiS_LCDACRT11280x1024_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_2; - SiS_Pr->SiS_LCDACRT11400x1050_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_2; - SiS_Pr->SiS_LCDACRT11600x1200_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_2; - SiS_Pr->SiS_LCDACRT1800x600_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_2_H; - SiS_Pr->SiS_LCDACRT11024x768_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_2_H; - SiS_Pr->SiS_LCDACRT11280x1024_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_2_H; - SiS_Pr->SiS_LCDACRT11400x1050_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_2_H; - SiS_Pr->SiS_LCDACRT11600x1200_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_2_H; - - SiS_Pr->SiS_CHTVVCLKUNTSC = SiS310_CHTVVCLKUNTSC; - SiS_Pr->SiS_CHTVVCLKONTSC = SiS310_CHTVVCLKONTSC; - SiS_Pr->SiS_CHTVVCLKUPAL = SiS310_CHTVVCLKUPAL; - SiS_Pr->SiS_CHTVVCLKOPAL = SiS310_CHTVVCLKOPAL; - SiS_Pr->SiS_CHTVVCLKUPALM = SiS310_CHTVVCLKUPALM; - SiS_Pr->SiS_CHTVVCLKOPALM = SiS310_CHTVVCLKOPALM; - SiS_Pr->SiS_CHTVVCLKUPALN = SiS310_CHTVVCLKUPALN; - SiS_Pr->SiS_CHTVVCLKOPALN = SiS310_CHTVVCLKOPALN; - SiS_Pr->SiS_CHTVVCLKSOPAL = SiS310_CHTVVCLKSOPAL; - - SiS_Pr->SiS_Panel320x480 = Panel_320x480; - SiS_Pr->SiS_Panel640x480 = Panel_640x480; - SiS_Pr->SiS_Panel800x600 = Panel_800x600; - SiS_Pr->SiS_Panel1024x768 = Panel_1024x768; - SiS_Pr->SiS_Panel1280x1024 = Panel_1280x1024; - SiS_Pr->SiS_Panel1280x960 = Panel_1280x960; - SiS_Pr->SiS_Panel1600x1200 = Panel_1600x1200; - SiS_Pr->SiS_Panel1400x1050 = Panel_1400x1050; - SiS_Pr->SiS_Panel1152x768 = Panel_1152x768; - SiS_Pr->SiS_Panel1152x864 = Panel_1152x864; - SiS_Pr->SiS_Panel1280x768 = Panel_1280x768; - SiS_Pr->SiS_Panel1024x600 = Panel_1024x600; - SiS_Pr->SiS_Panel640x480_2 = Panel_640x480_2; - SiS_Pr->SiS_Panel640x480_3 = Panel_640x480_3; - SiS_Pr->SiS_PanelMax = Panel_320x480; /* TW: highest value */ - SiS_Pr->SiS_PanelMinLVDS = Panel_800x600; /* TW: lowest value LVDS/LCDA */ - SiS_Pr->SiS_PanelMin301 = Panel_1024x768; /* TW: lowest value 301 */ - SiS_Pr->SiS_PanelCustom = Panel_Custom; - SiS_Pr->SiS_PanelBarco1366 = 255; -} -#endif - -#ifdef LINUXBIOS -/* -------------- SiSInit -----------------*/ -/* TW: I degraded this for LINUXBIOS only, because we - * don't need this otherwise. Under normal - * circumstances, the video BIOS has initialized - * the adapter for us. BTW, this code is incomplete - * and very possibly not working on newer chipsets. - */ -BOOLEAN -SiSInit(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase; - ULONG FBAddr = (ULONG)HwDeviceExtension->pjVideoMemoryAddress; - USHORT BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress; - UCHAR i, temp=0; - UCHAR SR11; -#ifdef LINUX_KERNEL - UCHAR temp1; - ULONG base; -#endif - UCHAR SR13=0, SR14=0, SR16=0 - UCHAR SR17=0, SR19=0, SR1A=0; -#ifdef SIS300 - UCHAR SR18=0, SR12=0; -#endif -#ifdef SIS315H - UCHAR CR37=0, CR38=0, CR79=0, - UCHAR CR7A=0, CR7B=0, CR7C=0; - UCHAR SR1B=0, SR15=0; - PSIS_DSReg pSR; - ULONG Temp; -#endif - UCHAR VBIOSVersion[5]; - - if(FBAddr==0) return (FALSE); - if(BaseAddr==0) return (FALSE); - - SiS_SetReg3((USHORT)(BaseAddr+0x12), 0x67); /* Misc */ - -#ifdef SIS315H - if(HwDeviceExtension->jChipType > SIS_315PRO) { - if(!HwDeviceExtension->bIntegratedMMEnabled) - return (FALSE); - } -#endif - - SiS_MemoryCopy(VBIOSVersion,HwDeviceExtension->szVBIOSVer,4); - VBIOSVersion[4]= 0x00; - - SiSDetermineROMUsage(SiS_Pr, HwDeviceExtension, ROMAddr); - - /* TW: Init pointers */ -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660)) - InitTo310Pointer(SiS_Pr, HwDeviceExtension); -#endif - -#ifdef SIS300 - if((HwDeviceExtension->jChipType == SIS_540) || - (HwDeviceExtension->jChipType == SIS_630) || - (HwDeviceExtension->jChipType == SIS_730) || - (HwDeviceExtension->jChipType == SIS_300)) - InitTo300Pointer(SiS_Pr, HwDeviceExtension); -#endif - - /* TW: Set SiS Register definitions */ - SiSRegInit(SiS_Pr, BaseAddr); - - /* TW: Determine LVDS/CH70xx/TRUMPION */ - SiS_Set_LVDS_TRUMPION(SiS_Pr, HwDeviceExtension); - - /* TW: Unlock registers */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x05,0x86); - -#ifdef LINUX_KERNEL - -#ifdef SIS300 /* Set SR14 */ - if((HwDeviceExtension->jChipType==SIS_540) || - (HwDeviceExtension->jChipType==SIS_630) || - (HwDeviceExtension->jChipType==SIS_730)) { - base=0x80000060; - OutPortLong(base,0xcf8); - temp1 = InPortLong(0xcfc); - temp1 >>= (16+8+4); - temp1 &= 0x07; - temp1++; - temp1 = 1 << temp1; - SR14 = temp1 - 1; - base = 0x80000064; - OutPortLong(base,0xcf8); - temp1 = InPortLong(0xcfc); - temp1 &= 0x00000020; - if(temp1) SR14 |= 0x80; - else SR14 |= 0x40; - } -#endif - -#ifdef SIS315H /* Set SR14 */ - if(HwDeviceExtension->jChipType == SIS_550) { - base = 0x80000060; - OutPortLong(base,0xcf8); - temp1 = InPortLong(0xcfc); - temp1 >>= (16+8+4); - temp1 &= 0x07; - temp1++; - temp1 = 1 << temp1; - SR14 = temp1 - 1; - base = 0x80000064; - OutPortLong(base,0xcf8); - temp1 = InPortLong(0xcfc); - temp1 &= 0x00000020; - if(temp1) SR14 |= 0x80; - else SR14 |= 0x40; - } - - if((HwDeviceExtension->jChipType == SIS_740) || /* Set SR14 */ - (HwDeviceExtension->jChipType == SIS_650)) { - base = 0x80000064; - OutPortLong(base,0xcf8); - temp1=InPortLong(0xcfc); - temp1 >>= 4; - temp1 &= 0x07; - if(temp1 > 2) { - temp = temp1; - switch(temp) { - case 3: temp1 = 0x07; break; - case 4: temp1 = 0x0F; break; - case 5: temp1 = 0x1F; break; - case 6: temp1 = 0x05; break; - case 7: temp1 = 0x17; break; - case 8: break; - case 9: break; - } - } - SR14 = temp1; - base = 0x8000007C; - OutPortLong(base,0xcf8); - temp1 = InPortLong(0xcfc); - temp1 &= 0x00000020; - if(temp1) SR14 |= 0x80; - } -#endif - -#endif /* Linux kernel */ - -#ifdef SIS300 - if((HwDeviceExtension->jChipType == SIS_540)|| - (HwDeviceExtension->jChipType == SIS_630)|| - (HwDeviceExtension->jChipType == SIS_730)) { - SR12 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x12); - SR13 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13); - SR14 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); - SR16 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16); - SR17 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17); - SR18 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x18); - SR19 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x19); - SR1A = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1A); - } else if(HwDeviceExtension->jChipType == SIS_300){ - SR13 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13); - SR14 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); - } -#endif -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_650)) { - SR19 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x19); - SR19 = (SR19)||0x01; /* TW: ??? || ??? */ - if(SR19==0x00) { - SR13 = 0x22; - SR14 = 0x00; - SR15 = 0x01; - SR16 = 0x00; - SR17 = 0x00; - SR1A = 0x00; - SR1B = 0x00; - CR37 = 0x00; - CR38 = 0x00; - CR79 = 0x00; - CR7A = 0x00; - CR7B = 0x00; - CR7C = 0x00; - } else { - SR13 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13); - SR14 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); - SR15 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15); - SR16 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16); - SR17 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17); - SR1A = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1A); - SR1B = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1B); - CR37 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37); /* TW: Was 0x02 - why? */ - CR38 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38); - CR79 = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3d4,0x79); - CR7A = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3d4,0x7A); - CR7B = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3d4,0x7B); - CR7C = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3d4,0x7C); - } - } -#endif - - /* Reset extended registers */ - - for(i=0x06; i< 0x20; i++) SiS_SetReg1(SiS_Pr->SiS_P3c4,i,0); - for(i=0x21; i<=0x27; i++) SiS_SetReg1(SiS_Pr->SiS_P3c4,i,0); - for(i=0x31; i<=0x3D; i++) SiS_SetReg1(SiS_Pr->SiS_P3c4,i,0); - -#ifdef SIS300 - if((HwDeviceExtension->jChipType == SIS_540) || - (HwDeviceExtension->jChipType == SIS_630) || - (HwDeviceExtension->jChipType == SIS_730) || - (HwDeviceExtension->jChipType == SIS_300)) { - for(i=0x38; i<=0x3F; i++) SiS_SetReg1(SiS_Pr->SiS_P3d4,i,0); - } -#endif - -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660)) { - for(i=0x12; i<=0x1B; i++) SiS_SetReg1(SiS_Pr->SiS_P3c4,i,0); - for(i=0x79; i<=0x7C; i++) SiS_SetReg1(SiS_Pr->SiS_P3d4,i,0); - } -#endif - - /* Restore Extended Registers */ - -#ifdef SIS300 - if((HwDeviceExtension->jChipType == SIS_540) || - (HwDeviceExtension->jChipType == SIS_630) || - (HwDeviceExtension->jChipType == SIS_730)) { - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x12,SR12); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,SR13); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,SR14); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,SR16); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x17,SR17); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x18,SR18); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x19,SR19); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1A,SR1A); - } -#endif - -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_650)) { - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,SR13); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,SR14); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x15,SR15); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,SR16); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x17,SR17); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x19,SR19); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1A,SR1A); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1B,SR1B); - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,CR37); - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x38,CR38); - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x79,CR79); - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x7A,CR7A); - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x7B,CR7B); - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x7C,CR7C); - } -#endif - -#ifdef SIS300 - if((HwDeviceExtension->jChipType==SIS_540) || - (HwDeviceExtension->jChipType==SIS_630) || - (HwDeviceExtension->jChipType==SIS_730)) { - temp = (UCHAR)SR1A & 0x03; - } else if(HwDeviceExtension->jChipType == SIS_300) { - /* TW: Nothing */ - } -#endif -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_330)) { - if((*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) == 0) { - temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A) & 0x03; - } - } - if((HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_660)) { - if((*SiS_Pr->pSiS_SoftSetting & SoftDRAMType) == 0) { - temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x07; - } - } -#endif - - SiS_Pr->SiS_RAMType = temp; - SiS_SetMemoryClock(SiS_Pr, ROMAddr, HwDeviceExtension); - - /* Set default register contents */ - - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x07,*SiS_Pr->pSiS_SR07); /* DAC speed */ - - if((HwDeviceExtension->jChipType != SIS_540) && - (HwDeviceExtension->jChipType != SIS_630) && - (HwDeviceExtension->jChipType != SIS_730)){ - for(i=0x15; i<0x1C; i++) { - SiS_SetReg1(SiS_Pr->SiS_P3c4,i,SiS_Pr->SiS_SR15[i-0x15][SiS_Pr->SiS_RAMType]); - } - } - -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_330)) { - for(i=0x40;i<=0x44;i++) { - SiS_SetReg1(SiS_Pr->SiS_P3d4,i,SiS_Pr->SiS_CR40[i-0x40][SiS_Pr->SiS_RAMType]); - } - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x48,0x23); - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x49,SiS_Pr->SiS_CR49[0]); - /* SiS_SetReg1(SiS_Pr->SiS_P3c4,0x25,SiS_Pr->SiS_SR25[0]); */ - } -#endif - - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1F,*SiS_Pr->pSiS_SR1F); /* DAC pedestal */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xA0); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x23,*SiS_Pr->pSiS_SR23); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x24,*SiS_Pr->pSiS_SR24); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x25,SiS_Pr->SiS_SR25[0]); - -#ifdef SIS300 - if(HwDeviceExtension->jChipType == SIS_300) { - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x21,0x84); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x22,0x00); - } -#endif - - SR11 = 0x0F; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x11,SR11); /* Power Management & DDC port */ - - SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr); - SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x00,0x00); - SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x02,*SiS_Pr->pSiS_CRT2Data_1_2); - -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660)) - SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2E,0x08); /* use VB */ -#endif - - temp = *SiS_Pr->pSiS_SR32; - if(SiS_BridgeIsOn(SiS_Pr, BaseAddr)) { - temp &= 0xEF; - } - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp); - -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_330)) { - HwDeviceExtension->pQueryVGAConfigSpace(HwDeviceExtension,0x50,0,&Temp); - Temp >>= 20; - Temp &= 0xF; - if (Temp != 1) { - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x25,SiS_Pr->SiS_SR25[1]); - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x49,SiS_Pr->SiS_CR49[1]); - } - - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x27,0x1F); - - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x31,*SiS_Pr->pSiS_SR31); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,*SiS_Pr->pSiS_SR32); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x33,*SiS_Pr->pSiS_SR33); - } -#endif - - if (SiS_BridgeIsOn(SiS_Pr, BaseAddr) == 0) { - if(SiS_Pr->SiS_IF_DEF_LVDS == 0) { - SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,0x1C); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0D,*SiS_Pr->pSiS_CRT2Data_4_D); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0E,*SiS_Pr->pSiS_CRT2Data_4_E); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x10,*SiS_Pr->pSiS_CRT2Data_4_10); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x0F,0x3F); - } - SiS_LockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr); - } - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x83,0x00); - -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_330)) { - if(HwDeviceExtension->bSkipDramSizing==TRUE) { - SiS_SetDRAMModeRegister(SiS_Pr, ROMAddr,HwDeviceExtension); - pSR = HwDeviceExtension->pSR; - if(pSR != NULL) { - while(pSR->jIdx != 0xFF) { - SiS_SetReg1(SiS_Pr->SiS_P3c4,pSR->jIdx,pSR->jVal); - pSR++; - } - } - } else SiS_SetDRAMSize_310(SiS_Pr, HwDeviceExtension); - } -#endif - -#ifdef SIS315H - if(HwDeviceExtension->jChipType == SIS_550) { - /* SetDRAMConfig begin */ -/* SiS_SetReg1(SiS_Pr->SiS_P3c4,0x12,SR12); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,SR13); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,SR14); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,SR16); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x17,SR17); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x18,SR18); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x19,SR19); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1A,SR1A); */ - /* SetDRAMConfig end */ - } -#endif - -#ifdef SIS300 - if(HwDeviceExtension->jChipType == SIS_300) { - if (HwDeviceExtension->bSkipDramSizing == TRUE) { -/* SiS_SetDRAMModeRegister(ROMAddr,HwDeviceExtension); - temp = (HwDeviceExtension->pSR)->jVal; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,temp); - temp = (HwDeviceExtension->pSR)->jVal; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,temp); */ - } else { -#ifdef TC - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,SR13); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,SR14); - SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x15,0xFF,0x04); -#else - SiS_SetDRAMSize_300(SiS_Pr, HwDeviceExtension); - SiS_SetDRAMSize_300(SiS_Pr, HwDeviceExtension); -#endif - } - } - if((HwDeviceExtension->jChipType==SIS_540)|| - (HwDeviceExtension->jChipType==SIS_630)|| - (HwDeviceExtension->jChipType==SIS_730)) { -#if 0 - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x12,SR12); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,SR13); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,SR14); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,SR16); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x17,SR17); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x18,SR18); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x19,SR19); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1A,SR1A); -#endif - } -/* SetDRAMSize end */ -#endif /* SIS300 */ - - /* Set default Ext2Regs */ -#if 0 - AGP=1; - temp=(UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A); - temp &= 0x30; - if(temp == 0x30) AGP=0; - if(AGP == 0) *SiS_Pr->pSiS_SR21 &= 0xEF; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x21,*SiS_Pr->pSiS_SR21); - if(AGP == 1) *SiS_Pr->pSiS_SR22 &= 0x20; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x22,*SiS_Pr->pSiS_SR22); -#endif - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x21,*SiS_Pr->pSiS_SR21); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x22,*SiS_Pr->pSiS_SR22); - -#if 0 - SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff); - SiS_ClearDAC(SiS_Pr, SiS_Pr->SiS_P3c8); -#endif - -#ifdef LINUXBIOS /* TW: This is not needed for our purposes */ - SiS_DetectMonitor(SiS_Pr, HwDeviceExtension,BaseAddr); /* Sense CRT1 */ - SiS_GetSenseStatus(SiS_Pr, HwDeviceExtension,ROMAddr); /* Sense CRT2 */ -#endif - - return(TRUE); -} - -void -SiS_Set_LVDS_TRUMPION(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - USHORT temp = 0; - -#ifdef SiS300 - if((HwDeviceExtension->jChipType == SIS_540) || - (HwDeviceExtension->jChipType == SIS_630) || - (HwDeviceExtension->jChipType == SIS_730)) { - /* TW: Read POWER_ON_TRAP and copy to CR37 */ - temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1A); - temp = (temp & 0xE0) >> 4; - SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x37,0xF1,temp); - } -#endif -#ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660)) { -#if 0 /* TW: This is not required */ - /* TW: Read POWER_ON_TRAP and copy to CR37 */ - temp = (UCHAR)SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1A); - temp = (temp & 0xE0) >> 4; - SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x37,0xF1,temp); -#endif - } -#endif - - SiSSetLVDSetc(SiS_Pr, HwDeviceExtension, 0); -} - -/* =============== SiS 300 dram sizing begin =============== */ -#ifdef SIS300 -void -SiS_SetDRAMSize_300(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - ULONG FBAddr = (ULONG)HwDeviceExtension->pjVideoMemoryAddress; - USHORT SR13, SR14=0, buswidth, Done; - SHORT i, j, k; - USHORT data, TotalCapacity, PhysicalAdrOtherPage=0; - ULONG Addr; - UCHAR temp; - int PseudoRankCapacity, PseudoTotalCapacity, PseudoAdrPinCount; - int RankCapacity, AdrPinCount, BankNumHigh, BankNumMid, MB2Bank; - int PageCapacity, PhysicalAdrHigh, PhysicalAdrHalfPage; - - SiSSetMode(SiS_Pr, HwDeviceExtension, 0x2e); - - SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x01,0x20); /* Turn OFF Display */ - - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,0x00); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,0xBF); - - buswidth = SiS_ChkBUSWidth_300(SiS_Pr, FBAddr); - - MB2Bank = 16; - Done = 0; - for(i=6; i>=0; i--) { - if(Done == 1) break; - PseudoRankCapacity = 1 << i; - for(j=4; j>=1; j--) { - if(Done == 1) break; - PseudoTotalCapacity = PseudoRankCapacity * j; - PseudoAdrPinCount = 15 - j; - if(PseudoTotalCapacity <= 64) { - for(k=0; k<=16; k++) { - if(Done == 1) break; - RankCapacity = buswidth * SiS_DRAMType[k][3]; - AdrPinCount = SiS_DRAMType[k][2] + SiS_DRAMType[k][0]; - if(RankCapacity == PseudoRankCapacity) - if(AdrPinCount <= PseudoAdrPinCount) { - if(j == 3) { /* Rank No */ - BankNumHigh = RankCapacity * MB2Bank * 3 - 1; - BankNumMid = RankCapacity * MB2Bank * 1 - 1; - } else { - BankNumHigh = RankCapacity * MB2Bank * j - 1; - BankNumMid = RankCapacity * MB2Bank * j / 2 - 1; - } - PageCapacity = (1 << SiS_DRAMType[k][1]) * buswidth * 4; - PhysicalAdrHigh = BankNumHigh; - PhysicalAdrHalfPage = (PageCapacity / 2 + PhysicalAdrHigh) % PageCapacity; - PhysicalAdrOtherPage = PageCapacity * SiS_DRAMType[k][2] + PhysicalAdrHigh; - /* Write data */ - /*Test*/ - SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x15,0xFB); - SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x15,0x04); - /*/Test*/ - TotalCapacity = SiS_DRAMType[k][3] * buswidth; - SR13 = SiS_DRAMType[k][4]; - if(buswidth == 4) SR14 = (TotalCapacity - 1) | 0x80; - if(buswidth == 2) SR14 = (TotalCapacity - 1) | 0x40; - if(buswidth == 1) SR14 = (TotalCapacity - 1) | 0x00; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,SR13); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,SR14); - - Addr = FBAddr + (BankNumHigh) * 64 * 1024 + PhysicalAdrHigh; - *((USHORT *)(Addr)) = (USHORT)PhysicalAdrHigh; - Addr = FBAddr + (BankNumMid) * 64 * 1024 + PhysicalAdrHigh; - *((USHORT *)(Addr)) = (USHORT)BankNumMid; - Addr = FBAddr + (BankNumHigh) * 64 * 1024 + PhysicalAdrHalfPage; - *((USHORT *)(Addr)) = (USHORT)PhysicalAdrHalfPage; - Addr = FBAddr + (BankNumHigh) * 64 * 1024 + PhysicalAdrOtherPage; - *((USHORT *)(Addr)) = PhysicalAdrOtherPage; - - /* Read data */ - Addr = FBAddr + (BankNumHigh) * 64 * 1024 + PhysicalAdrHigh; - data = *((USHORT *)(Addr)); - if(data == PhysicalAdrHigh) Done = 1; - } /* if struct */ - } /* for loop (k) */ - } /* if struct */ - } /* for loop (j) */ - } /* for loop (i) */ -} - -USHORT -SiS_ChkBUSWidth_300(SiS_Private *SiS_Pr, ULONG FBAddress) -{ - PULONG pVideoMemory; - - pVideoMemory = (PULONG)FBAddress; - - pVideoMemory[0] = 0x01234567L; - pVideoMemory[1] = 0x456789ABL; - pVideoMemory[2] = 0x89ABCDEFL; - pVideoMemory[3] = 0xCDEF0123L; - if (pVideoMemory[3]==0xCDEF0123L) { /* Channel A 128bit */ - return(4); - } - if (pVideoMemory[1]==0x456789ABL) { /* Channel B 64bit */ - return(2); - } - return(1); -} -#endif -/* =============== SiS 300 dram sizing end =============== */ - -/* ============ SiS 315 dram sizing begin ============== */ -#ifdef SIS315H - -/* TW: Moved Get310DRAMType further down */ - -void -SiS_Delay15us(SiS_Private *SiS_Pr, ULONG ulMicrsoSec) -{ -} - -void -SiS_SDR_MRS(SiS_Private *SiS_Pr, ) -{ - USHORT data; - - data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16); - data &= 0x3F; /* SR16 D7=0, D6=0 */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,data); /* enable mode register set(MRS) low */ - SiS_Delay15us(SiS_Pr, 0x100); - data |= 0x80; /* SR16 D7=1, D6=0 */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,data); /* enable mode register set(MRS) high */ - SiS_Delay15us(SiS_Pr, 0x100); -} - -void -SiS_DDR_MRS(SiS_Private *SiS_Pr) -{ - USHORT data; - - /* SR16 <- 1F,DF,2F,AF */ - - /* enable DLL of DDR SD/SGRAM , SR16 D4=1 */ - data=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16); - data &= 0x0F; - data |= 0x10; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,data); - - if (!(SiS_Pr->SiS_SR15[1][SiS_Pr->SiS_RAMType] & 0x10)) - data &= 0x0F; - - /* SR16 D7=1,D6=1 */ - data |= 0xC0; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,data); - - /* SR16 D7=1,D6=0,D5=1,D4=0 */ - data &= 0x0F; - data |= 0x20; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,data); - if (!(SiS_Pr->SiS_SR15[1][SiS_Pr->SiS_RAMType] & 0x10)) - data &= 0x0F; - - /* SR16 D7=1 */ - data |= 0x80; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,data); -} - -void -SiS_SetDRAMModeRegister(SiS_Private *SiS_Pr, UCHAR *ROMAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - if (SiS_Get310DRAMType(ROMAddr,HwDeviceExtension) < 2) - SiS_SDR_MRS(SiS_Pr); - else - /* SR16 <- 0F,CF,0F,8F */ - SiS_DDR_MRS(SiS_Pr); -} - -void -SiS_DisableRefresh(SiS_Private *SiS_Pr) -{ - SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x17,0xF8); - SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x19,0x03); -} - -void -SiS_EnableRefresh(SiS_Private *SiS_Pr, UCHAR *ROMAddr) -{ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x17,SiS_Pr->SiS_SR15[2][SiS_Pr->SiS_RAMType]); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x19,SiS_Pr->SiS_SR15[4][SiS_Pr->SiS_RAMType]); -} - -void -SiS_DisableChannelInterleaving(SiS_Private *SiS_Pr, int index, - USHORT SiS_DDRDRAM_TYPE[][5]) -{ - USHORT data; - - data=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15); - data &= 0x1F; - switch (SiS_DDRDRAM_TYPE[index][3]) - { - case 64: data |= 0; break; - case 32: data |= 0x20; break; - case 16: data |= 0x40; break; - case 4: data |= 0x60; break; - } - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x15,data); -} - -void -SiS_SetDRAMSizingType(SiS_Private *SiS_Pr, int index, USHORT DRAMTYPE_TABLE[][5]) -{ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,DRAMTYPE_TABLE[index][4]); - /* should delay 50 ns */ -} - -void -SiS_CheckBusWidth_310(SiS_Private *SiS_Pr, UCHAR *ROMAddress,ULONG FBAddress, - PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - USHORT data, temp; - PULONG volatile pVideoMemory; - - pVideoMemory = (PULONG)FBAddress; - - if(HwDeviceExtension->jChipType == SIS_330) temp = 1; - else temp = 2; - - if(SiS_Get310DRAMType(ROMAddress,HwDeviceExtension) < temp) { - - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,0x00); - if(HwDeviceExtension->jChipType != SIS_330) { - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,0x12); - } else { - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,0x02); - } - /* should delay */ - SiS_SDR_MRS(SiS_Pr); - - SiS_Pr->SiS_ChannelAB = 0; - SiS_Pr->SiS_DataBusWidth = 128; - pVideoMemory[0] = 0x01234567L; - pVideoMemory[1] = 0x456789ABL; - pVideoMemory[2] = 0x89ABCDEFL; - pVideoMemory[3] = 0xCDEF0123L; - pVideoMemory[4] = 0x55555555L; - pVideoMemory[5] = 0x55555555L; - pVideoMemory[6] = 0xFFFFFFFFL; - pVideoMemory[7] = 0xFFFFFFFFL; - if((pVideoMemory[3] != 0xCDEF0123L) || (pVideoMemory[2] != 0x89ABCDEFL)) { - /* Channel A 64Bit */ - SiS_Pr->SiS_DataBusWidth = 64; - SiS_Pr->SiS_ChannelAB = 0; - SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x14, 0xFD); - } - if((pVideoMemory[1] != 0x456789ABL) || (pVideoMemory[0] != 0x01234567L)) { - /* Channel B 64Bit */ - SiS_Pr->SiS_DataBusWidth = 64; - SiS_Pr->SiS_ChannelAB = 1; - SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x14,0xfd,0x01); - } - return; - - } else { - - /* DDR Dual channel */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x13,0x00); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,0x02); /* Channel A, 64bit */ - /* should delay */ - SiS_DDR_MRS(SiS_Pr); - - SiS_Pr->SiS_ChannelAB = 0; - SiS_Pr->SiS_DataBusWidth = 64; - pVideoMemory[0] = 0x01234567L; - pVideoMemory[1] = 0x456789ABL; - pVideoMemory[2] = 0x89ABCDEFL; - pVideoMemory[3] = 0xCDEF0123L; - pVideoMemory[4] = 0x55555555L; - pVideoMemory[5] = 0x55555555L; - pVideoMemory[6] = 0xAAAAAAAAL; - pVideoMemory[7] = 0xAAAAAAAAL; - - if (pVideoMemory[1] == 0x456789ABL) { - if (pVideoMemory[0] == 0x01234567L) { - /* Channel A 64bit */ - return; - } - } else { - if (pVideoMemory[0] == 0x01234567L) { - /* Channel A 32bit */ - SiS_Pr->SiS_DataBusWidth = 32; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,0x00); - return; - } - } - - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,0x03); /* Channel B, 64bit */ - SiS_DDR_MRS(SiS_Pr); - - SiS_Pr->SiS_ChannelAB = 1; - SiS_Pr->SiS_DataBusWidth = 64; - pVideoMemory[0] = 0x01234567L; - pVideoMemory[1] = 0x456789ABL; - pVideoMemory[2] = 0x89ABCDEFL; - pVideoMemory[3] = 0xCDEF0123L; - pVideoMemory[4] = 0x55555555L; - pVideoMemory[5] = 0x55555555L; - pVideoMemory[6] = 0xAAAAAAAAL; - pVideoMemory[7] = 0xAAAAAAAAL; - if(pVideoMemory[1] == 0x456789ABL) { - /* Channel B 64 */ - if(pVideoMemory[0] == 0x01234567L) { - /* Channel B 64bit */ - return; - } else { - /* error */ - } - } else { - if(pVideoMemory[0] == 0x01234567L) { - /* Channel B 32 */ - SiS_Pr->SiS_DataBusWidth = 32; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,0x01); - } else { - /* error */ - } - } - } -} - -int -SiS_SetRank(SiS_Private *SiS_Pr, int index,UCHAR RankNo,USHORT DRAMTYPE_TABLE[][5]) -{ - USHORT data; - int RankSize; - - if ((RankNo==2)&&(DRAMTYPE_TABLE[index][0]==2)) - return 0; - - RankSize = DRAMTYPE_TABLE[index][3]/2 * SiS_Pr->SiS_DataBusWidth / 32; - - if (RankNo * RankSize <= 128) { - data = 0; - while((RankSize >>= 1) > 0) { - data += 0x10; - } - data |= (RankNo - 1) << 2; - data |= (SiS_Pr->SiS_DataBusWidth / 64) & 2; - data |= SiS_Pr->SiS_ChannelAB; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,data); - /* should delay */ - SiS_SDR_MRS(SiS_Pr); - return 1; - } else - return 0; -} - -int -SiS_SetDDRChannel(SiS_Private *SiS_Pr, int index,UCHAR ChannelNo, - USHORT DRAMTYPE_TABLE[][5]) -{ - USHORT data; - int RankSize; - - RankSize = DRAMTYPE_TABLE[index][3]/2 * SiS_Pr->SiS_DataBusWidth / 32; - /* RankSize = DRAMTYPE_TABLE[index][3]; */ - if (ChannelNo * RankSize <= 128) { - data = 0; - while((RankSize >>= 1) > 0) { - data += 0x10; - } - if(ChannelNo == 2) data |= 0x0C; - data |= (SiS_Pr->SiS_DataBusWidth / 32) & 2; - data |= SiS_Pr->SiS_ChannelAB; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,data); - /* should delay */ - SiS_DDR_MRS(SiS_Pr); - return 1; - } else - return 0; -} - -int -SiS_CheckColumn(SiS_Private *SiS_Pr, int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress) -{ - int i; - ULONG Increment,Position; - - /*Increment = 1<<(DRAMTYPE_TABLE[index][2] + SiS_Pr->SiS_DataBusWidth / 64 + 1); */ - Increment = 1 << (10 + SiS_Pr->SiS_DataBusWidth / 64); - - for (i=0,Position=0;i<2;i++) { - *((PULONG)(FBAddress + Position)) = Position; - Position += Increment; - } - - for (i=0,Position=0;i<2;i++) { -/* if (FBAddress[Position]!=Position) */ - if((*(PULONG)(FBAddress + Position)) != Position) - return 0; - Position += Increment; - } - return 1; -} - -int -SiS_CheckBanks(SiS_Private *SiS_Pr, int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress) -{ - int i; - ULONG Increment,Position; - Increment = 1 << (DRAMTYPE_TABLE[index][2] + SiS_Pr->SiS_DataBusWidth / 64 + 2); - - for (i=0,Position=0;i<4;i++) { -/* FBAddress[Position]=Position; */ - *((PULONG)(FBAddress + Position)) = Position; - Position += Increment; - } - - for (i=0,Position=0;i<4;i++) { -/* if (FBAddress[Position]!=Position) */ - if((*(PULONG)(FBAddress + Position)) != Position) - return 0; - Position += Increment; - } - return 1; -} - -int -SiS_CheckRank(SiS_Private *SiS_Pr, int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress) -{ - int i; - ULONG Increment,Position; - Increment = 1<<(DRAMTYPE_TABLE[index][2] + DRAMTYPE_TABLE[index][1] + - DRAMTYPE_TABLE[index][0] + SiS_Pr->SiS_DataBusWidth / 64 + RankNo); - - for (i=0,Position=0;i<2;i++) { -/* FBAddress[Position]=Position; */ - *((PULONG)(FBAddress+Position))=Position; - /* *((PULONG)(FBAddress))=Position; */ - Position += Increment; - } - - for (i=0,Position=0;i<2;i++) { -/* if (FBAddress[Position]!=Position) */ - if ( (*(PULONG) (FBAddress + Position)) !=Position) - /*if ( (*(PULONG) (FBAddress )) !=Position) */ - return 0; - Position += Increment; - } - return 1; -} - -int -SiS_CheckDDRRank(SiS_Private *SiS_Pr, int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress) -{ - ULONG Increment,Position; - USHORT data; - - Increment = 1<<(DRAMTYPE_TABLE[index][2] + DRAMTYPE_TABLE[index][1] + - DRAMTYPE_TABLE[index][0] + SiS_Pr->SiS_DataBusWidth / 64 + RankNo); - - Increment += Increment/2; - - Position =0; - *((PULONG)(FBAddress+Position + 0)) = 0x01234567; - *((PULONG)(FBAddress+Position + 1)) = 0x456789AB; - *((PULONG)(FBAddress+Position + 2)) = 0x55555555; - *((PULONG)(FBAddress+Position + 3)) = 0x55555555; - *((PULONG)(FBAddress+Position + 4)) = 0xAAAAAAAA; - *((PULONG)(FBAddress+Position + 5)) = 0xAAAAAAAA; - - if ( (*(PULONG) (FBAddress + 1)) == 0x456789AB) - return 1; - - if ( (*(PULONG) (FBAddress + 0)) == 0x01234567) - return 0; - - data=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); - data &= 0xF3; - data |= 0x08; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x14,data); - data=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x15); - data += 0x20; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x15,data); - - return 1; -} - -int -SiS_CheckRanks(SiS_Private *SiS_Pr, int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress) -{ - int r; - - for (r=RankNo;r>=1;r--) { - if (!SiS_CheckRank(SiS_Pr, r, index, DRAMTYPE_TABLE, FBAddress)) - return 0; - } - if (!SiS_CheckBanks(SiS_Pr, index, DRAMTYPE_TABLE, FBAddress)) - return 0; - - if (!SiS_CheckColumn(SiS_Pr, index, DRAMTYPE_TABLE, FBAddress)) - return 0; - - return 1; -} - -int -SiS_CheckDDRRanks(SiS_Private *SiS_Pr, int RankNo,int index,USHORT DRAMTYPE_TABLE[][5], - ULONG FBAddress) -{ - int r; - - for (r=RankNo;r>=1;r--) { - if (!SiS_CheckDDRRank(SiS_Pr, r,index,DRAMTYPE_TABLE,FBAddress)) - return 0; - } - if (!SiS_CheckBanks(SiS_Pr, index,DRAMTYPE_TABLE,FBAddress)) - return 0; - - if (!SiS_CheckColumn(SiS_Pr, index,DRAMTYPE_TABLE,FBAddress)) - return 0; - - return 1; -} - -int -SiS_SDRSizing(SiS_Private *SiS_Pr, ULONG FBAddress) -{ - int i; - UCHAR j; - - for (i=0;i<13;i++) { - SiS_SetDRAMSizingType(SiS_Pr, i, SiS_SDRDRAM_TYPE); - for (j=2;j>0;j--) { - if (!SiS_SetRank(SiS_Pr, i,(UCHAR) j, SiS_SDRDRAM_TYPE)) - continue; - else { - if (SiS_CheckRanks(SiS_Pr, j,i,SiS_SDRDRAM_TYPE, FBAddress)) - return 1; - } - } - } - return 0; -} - -int -SiS_DDRSizing(SiS_Private *SiS_Pr, ULONG FBAddress) -{ - - int i; - UCHAR j; - - for (i=0; i<4; i++){ - SiS_SetDRAMSizingType(SiS_Pr, i, SiS_DDRDRAM_TYPE); - SiS_DisableChannelInterleaving(SiS_Pr, i, SiS_DDRDRAM_TYPE); - for (j=2; j>0; j--) { - SiS_SetDDRChannel(SiS_Pr, i, j, SiS_DDRDRAM_TYPE); - if (!SiS_SetRank(SiS_Pr, i, (UCHAR) j, SiS_DDRDRAM_TYPE)) - continue; - else { - if (SiS_CheckDDRRanks(SiS_Pr, j, i, SiS_DDRDRAM_TYPE, FBAddress)) - return 1; - } - } - } - return 0; -} - -/* - check if read cache pointer is correct -*/ -void -SiS_VerifyMclk(SiS_Private *SiS_Pr, ULONG FBAddr) -{ - PUCHAR pVideoMemory = (PUCHAR) FBAddr; - UCHAR i, j; - USHORT Temp,SR21; - - pVideoMemory[0] = 0xaa; /* alan */ - pVideoMemory[16] = 0x55; /* note: PCI read cache is off */ - - if((pVideoMemory[0] != 0xaa) || (pVideoMemory[16] != 0x55)) { - for (i=0,j=16; i<2; i++,j+=16) { - SR21 = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x21); - Temp = SR21 & 0xFB; /* disable PCI post write buffer empty gating */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x21,Temp); - - Temp = SiS_GetReg1(SiS_Pr->SiS_P3c4, 0x3C); - Temp |= 0x01; /* MCLK reset */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x3C,Temp); - Temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3C); - Temp &= 0xFE; /* MCLK normal operation */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x3C,Temp); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x21,SR21); - - pVideoMemory[16+j] = j; - if(pVideoMemory[16+j] == j) { - pVideoMemory[j] = j; - break; - } - } - } -} - -/* TW: Is this a 315E? */ -int -Is315E(SiS_Private *SiS_Pr) -{ - USHORT data; - - data = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x5F); - if(data & 0x10) return 1; - else return 0; -} - -/* TW: For 315 only */ -void -SiS_SetDRAMSize_310(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - UCHAR *ROMAddr = HwDeviceExtension->pjVirtualRomBase; - ULONG FBAddr = (ULONG)HwDeviceExtension->pjVideoMemoryAddress; - USHORT data; - -#ifdef SIS301 /* TW: SIS301 ??? */ - /*SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,0x40); */ -#endif -#ifdef SIS302 /* TW: SIS302 ??? */ - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,0x4D); /* alan,should change value */ - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x31,0xc0); /* alan,should change value */ - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x34,0x3F); /* alan,should change value */ -#endif - - SiSSetMode(SiS_Pr, HwDeviceExtension, 0x2e); - - data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x21); - SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x21,0xDF); /* disable read cache */ - - SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x01,0x20); /* Turn OFF Display */ - - SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x16,0x0F); /* assume lowest speed DRAM */ - - SiS_SetDRAMModeRegister(SiS_Pr, ROMAddr, HwDeviceExtension); - SiS_DisableRefresh(SiS_Pr); - SiS_CheckBusWidth_310(SiS_Pr, ROMAddr, FBAddr, HwDeviceExtension); + SiS_Pr->SiS_PanelType08_2 = (SiS_LVDSDesStruct *)SiS310_PanelType08_2; + SiS_Pr->SiS_PanelType09_2 = (SiS_LVDSDesStruct *)SiS310_PanelType09_2; + SiS_Pr->SiS_PanelType0a_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0a_2; + SiS_Pr->SiS_PanelType0b_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0b_2; + SiS_Pr->SiS_PanelType0c_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0c_2; + SiS_Pr->SiS_PanelType0d_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0d_2; + SiS_Pr->SiS_PanelType0e_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0e_2; + SiS_Pr->SiS_PanelType0f_2 = (SiS_LVDSDesStruct *)SiS310_PanelType0f_2; - SiS_VerifyMclk(SiS_Pr, FBAddr); + SiS_Pr->SiS_CRT2Part2_1024x768_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_1; + SiS_Pr->SiS_CRT2Part2_1280x1024_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_1; + SiS_Pr->SiS_CRT2Part2_1400x1050_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_1; + SiS_Pr->SiS_CRT2Part2_1600x1200_1 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_1; + SiS_Pr->SiS_CRT2Part2_1024x768_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_2; + SiS_Pr->SiS_CRT2Part2_1280x1024_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_2; + SiS_Pr->SiS_CRT2Part2_1400x1050_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_2; + SiS_Pr->SiS_CRT2Part2_1600x1200_2 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_2; + SiS_Pr->SiS_CRT2Part2_1024x768_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1024x768_3; + SiS_Pr->SiS_CRT2Part2_1280x1024_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1280x1024_3; + SiS_Pr->SiS_CRT2Part2_1400x1050_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1400x1050_3; + SiS_Pr->SiS_CRT2Part2_1600x1200_3 = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_1600x1200_3; - if(HwDeviceExtension->jChipType == SIS_330) temp = 1; - else temp = 2; + SiS_Pr->SiS_LVDSCRT1800x600_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1; + SiS_Pr->SiS_LVDSCRT11024x768_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1; + SiS_Pr->SiS_LVDSCRT11280x1024_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1; + SiS_Pr->SiS_LVDSCRT11400x1050_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1; + SiS_Pr->SiS_LVDSCRT11600x1200_1 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1; + SiS_Pr->SiS_LVDSCRT1800x600_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_1_H; + SiS_Pr->SiS_LVDSCRT11024x768_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_1_H; + SiS_Pr->SiS_LVDSCRT11280x1024_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_1_H; + SiS_Pr->SiS_LVDSCRT11400x1050_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_1_H; + SiS_Pr->SiS_LVDSCRT11600x1200_1_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_1_H; + SiS_Pr->SiS_LVDSCRT1800x600_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2; + SiS_Pr->SiS_LVDSCRT11024x768_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2; + SiS_Pr->SiS_LVDSCRT11280x1024_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2; + SiS_Pr->SiS_LVDSCRT11400x1050_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2; + SiS_Pr->SiS_LVDSCRT11600x1200_2 = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2; + SiS_Pr->SiS_LVDSCRT1800x600_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT1800x600_2_H; + SiS_Pr->SiS_LVDSCRT11024x768_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11024x768_2_H; + SiS_Pr->SiS_LVDSCRT11280x1024_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11280x1024_2_H; + SiS_Pr->SiS_LVDSCRT11400x1050_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11400x1050_2_H; + SiS_Pr->SiS_LVDSCRT11600x1200_2_H = (SiS_LVDSCRT1DataStruct *)SiS310_LVDSCRT11600x1200_2_H; + SiS_Pr->SiS_CHTVCRT1UNTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UNTSC; + SiS_Pr->SiS_CHTVCRT1ONTSC = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1ONTSC; + SiS_Pr->SiS_CHTVCRT1UPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1UPAL; + SiS_Pr->SiS_CHTVCRT1OPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1OPAL; + SiS_Pr->SiS_CHTVCRT1SOPAL = (SiS_LVDSCRT1DataStruct *)SiS310_CHTVCRT1SOPAL; - if(SiS_Get310DRAMType(SiS_Pr, ROMAddr, HwDeviceExtension) < temp) - SiS_SDRSizing(SiS_Pr, FBAddr); - else - SiS_DDRSizing(SiS_Pr, FBAddr); + SiS_Pr->SiS_CHTVReg_UNTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UNTSC; + SiS_Pr->SiS_CHTVReg_ONTSC = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_ONTSC; + SiS_Pr->SiS_CHTVReg_UPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPAL; + SiS_Pr->SiS_CHTVReg_OPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPAL; + SiS_Pr->SiS_CHTVReg_UPALM = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPALM; + SiS_Pr->SiS_CHTVReg_OPALM = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPALM; + SiS_Pr->SiS_CHTVReg_UPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_UPALN; + SiS_Pr->SiS_CHTVReg_OPALN = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_OPALN; + SiS_Pr->SiS_CHTVReg_SOPAL = (SiS_CHTVRegDataStruct *)SiS310_CHTVReg_SOPAL; - if(HwDeviceExtension->jChipType != SIS_330) { - if(Is315E(SiS_Pr)) { - data = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); - if((data & 0x0C) == 0x0C) { /* dual channel */ - if((data & 0xF0) > 0x40) - data = (data & 0x0F) | 0x40; - } else { /* single channel */ - if((data & 0xF0) > 0x50) - data = (data & 0x0F) | 0x50; - } - } - } + SiS_Pr->SiS_LCDACRT1800x600_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_1; + SiS_Pr->SiS_LCDACRT11024x768_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_1; + SiS_Pr->SiS_LCDACRT11280x1024_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_1; + SiS_Pr->SiS_LCDACRT11400x1050_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_1; + SiS_Pr->SiS_LCDACRT11600x1200_1 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_1; + SiS_Pr->SiS_LCDACRT1800x600_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_1_H; + SiS_Pr->SiS_LCDACRT11024x768_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_1_H; + SiS_Pr->SiS_LCDACRT11280x1024_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_1_H; + SiS_Pr->SiS_LCDACRT11400x1050_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_1_H; + SiS_Pr->SiS_LCDACRT11600x1200_1_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_1_H; + SiS_Pr->SiS_LCDACRT1800x600_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_2; + SiS_Pr->SiS_LCDACRT11024x768_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_2; + SiS_Pr->SiS_LCDACRT11280x1024_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_2; + SiS_Pr->SiS_LCDACRT11400x1050_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_2; + SiS_Pr->SiS_LCDACRT11600x1200_2 = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_2; + SiS_Pr->SiS_LCDACRT1800x600_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT1800x600_2_H; + SiS_Pr->SiS_LCDACRT11024x768_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11024x768_2_H; + SiS_Pr->SiS_LCDACRT11280x1024_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11280x1024_2_H; + SiS_Pr->SiS_LCDACRT11400x1050_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11400x1050_2_H; + SiS_Pr->SiS_LCDACRT11600x1200_2_H = (SiS_LCDACRT1DataStruct *)SiS310_LCDACRT11600x1200_2_H; - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x16,SiS_Pr->SiS_SR15[1][SiS_Pr->SiS_RAMType]); /* restore SR16 */ + SiS_Pr->SiS_CHTVVCLKUNTSC = SiS310_CHTVVCLKUNTSC; + SiS_Pr->SiS_CHTVVCLKONTSC = SiS310_CHTVVCLKONTSC; + SiS_Pr->SiS_CHTVVCLKUPAL = SiS310_CHTVVCLKUPAL; + SiS_Pr->SiS_CHTVVCLKOPAL = SiS310_CHTVVCLKOPAL; + SiS_Pr->SiS_CHTVVCLKUPALM = SiS310_CHTVVCLKUPALM; + SiS_Pr->SiS_CHTVVCLKOPALM = SiS310_CHTVVCLKOPALM; + SiS_Pr->SiS_CHTVVCLKUPALN = SiS310_CHTVVCLKUPALN; + SiS_Pr->SiS_CHTVVCLKOPALN = SiS310_CHTVVCLKOPALN; + SiS_Pr->SiS_CHTVVCLKSOPAL = SiS310_CHTVVCLKSOPAL; - SiS_EnableRefresh(SiS_Pr, ROMAddr); - SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x21,0x20); /* enable read cache */ + SiS_Pr->SiS_Panel320x480 = Panel_320x480; + SiS_Pr->SiS_Panel640x480 = Panel_640x480; + SiS_Pr->SiS_Panel800x600 = Panel_800x600; + SiS_Pr->SiS_Panel1024x768 = Panel_1024x768; + SiS_Pr->SiS_Panel1280x1024 = Panel_1280x1024; + SiS_Pr->SiS_Panel1280x960 = Panel_1280x960; + SiS_Pr->SiS_Panel1600x1200 = Panel_1600x1200; + SiS_Pr->SiS_Panel1400x1050 = Panel_1400x1050; + SiS_Pr->SiS_Panel1152x768 = Panel_1152x768; + SiS_Pr->SiS_Panel1152x864 = Panel_1152x864; + SiS_Pr->SiS_Panel1280x768 = Panel_1280x768; + SiS_Pr->SiS_Panel1024x600 = Panel_1024x600; + SiS_Pr->SiS_Panel640x480_2 = Panel_640x480_2; + SiS_Pr->SiS_Panel640x480_3 = Panel_640x480_3; + SiS_Pr->SiS_PanelMax = Panel_320x480; /* TW: highest value */ + SiS_Pr->SiS_PanelMinLVDS = Panel_800x600; /* TW: lowest value LVDS/LCDA */ + SiS_Pr->SiS_PanelMin301 = Panel_1024x768; /* TW: lowest value 301 */ + SiS_Pr->SiS_PanelCustom = Panel_Custom; + SiS_Pr->SiS_PanelBarco1366 = 255; } #endif -void -SiS_SetMemoryClock(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x28,SiS_Pr->SiS_MCLKData_0[SiS_Pr->SiS_RAMType].SR28); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x29,SiS_Pr->SiS_MCLKData_0[SiS_Pr->SiS_RAMType].SR29); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2A,SiS_Pr->SiS_MCLKData_0[SiS_Pr->SiS_RAMType].SR2A); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2E,SiS_Pr->SiS_ECLKData[SiS_Pr->SiS_RAMType].SR2E); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2F,SiS_Pr->SiS_ECLKData[SiS_Pr->SiS_RAMType].SR2F); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x30,SiS_Pr->SiS_ECLKData[SiS_Pr->SiS_RAMType].SR30); - -#ifdef SIS315H - if (Is315E(SiS_Pr)) { - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x28,0x3B); /* 143 */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x29,0x22); - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2E,0x3B); /* 143 */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x2F,0x22); - } -#endif -} - -#endif /* ifdef LINUXBIOS */ - #ifdef SIS315H UCHAR SiS_Get310DRAMType(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension) @@ -1919,8 +699,6 @@ } #endif -/* SiSInit END */ - /* ----------------------------------------- */ void SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr) @@ -1951,32 +729,47 @@ void SiSInitPCIetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { -/* #ifdef LINUX_XF86 */ - if ((HwDeviceExtension->jChipType == SIS_540)|| - (HwDeviceExtension->jChipType == SIS_630)|| - (HwDeviceExtension->jChipType == SIS_730)|| - (HwDeviceExtension->jChipType == SIS_300)) { - /* TW: Set - PCI LINEAR ADDRESSING ENABLE (0x80) - - PCI IO ENABLE (0x20) - - MMIO ENABLE (0x1) - */ - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1); - /* TW: Enable 2D (0x42) & 3D accelerator (0x18) */ - SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1E,0xFF,0x5A); - } - if((HwDeviceExtension->jChipType == SIS_315H)|| - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO)|| - (HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660)) { - /* TW: This seems to be done the same way on these chipsets */ + switch(HwDeviceExtension->jChipType) { + case SIS_300: + case SIS_540: + case SIS_630: + case SIS_730: + /* Set - PCI LINEAR ADDRESSING ENABLE (0x80) + * - RELOCATED VGA IO (0x20) + * - MMIO ENABLE (0x1) + */ + SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1); + /* - Enable 2D (0x40) + * - Enable 3D (0x02) + * - Enable 3D Vertex command fetch (0x10) ? + * - Enable 3D command parser (0x08) ? + */ + SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x5A); + break; + case SIS_315H: + case SIS_315: + case SIS_315PRO: + case SIS_650: + case SIS_740: + case SIS_330: + case SIS_660: + case SIS_760: + SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1); + /* - Enable 2D (0x40) + * - Enable 3D (0x02) + * - Enable 3D vertex command fetch (0x10) + * - Enable 3D command parser (0x08) + * - Enable 3D G/L transformation engine (0x80) + */ + SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0xDA); + break; + case SIS_550: SiS_SetReg1(SiS_Pr->SiS_P3c4,0x20,0xa1); - SiS_SetRegANDOR(SiS_Pr->SiS_P3c4,0x1E,0xFF,0x5A); + /* No 3D engine ! */ + /* - Enable 2D (0x40) + */ + SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x40); } -/* #endif */ } void @@ -2002,12 +795,12 @@ } #endif + switch(HwDeviceExtension->jChipType) { #ifdef SIS300 - if((HwDeviceExtension->jChipType == SIS_540) || - (HwDeviceExtension->jChipType == SIS_630) || - (HwDeviceExtension->jChipType == SIS_730)) - { - /* TW: Check for SiS30x first */ + case SIS_540: + case SIS_630: + case SIS_730: + /* Check for SiS30x first */ temp = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00); if((temp == 1) || (temp == 2)) return; temp = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37); @@ -2015,60 +808,58 @@ if((temp >= 2) && (temp <= 5)) SiS_Pr->SiS_IF_DEF_LVDS = 1; if(temp == 3) SiS_Pr->SiS_IF_DEF_TRUMPION = 1; if((temp == 4) || (temp == 5)) { - /* TW: Save power status (and error check) - UNUSED */ + /* Save power status (and error check) - UNUSED */ SiS_Pr->SiS_Backup70xx = SiS_GetCH700x(SiS_Pr, 0x0e); SiS_Pr->SiS_IF_DEF_CH70xx = 1; } - } + break; #endif #ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660)) - { - /* TW: CR37 is different on 315 series */ -#if 0 - if(SiS_Pr->SiS_IF_DEF_FSTN) /* fstn: set CR37=0x04 */ - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x37,0x04); /* (fake LVDS bridge) */ -#endif - + case SIS_550: + case SIS_650: + case SIS_740: + case SIS_330: + case SIS_660: + case SIS_760: temp=SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37); temp = (temp & 0x0E) >> 1; if((temp >= 2) && (temp <= 3)) SiS_Pr->SiS_IF_DEF_LVDS = 1; - if(temp == 3) { - SiS_Pr->SiS_IF_DEF_CH70xx = 2; - } - - /* HiVision (HDTV) is done differently now. */ - /* SiS_Pr->SiS_IF_DEF_HiVision = 1; */ - } + if(temp == 3) SiS_Pr->SiS_IF_DEF_CH70xx = 2; + break; #endif + default: + break; + } } void SiSInitPtr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { + switch(HwDeviceExtension->jChipType) { #ifdef SIS315H - if((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO) || - (HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_330) || - (HwDeviceExtension->jChipType == SIS_660)) - InitTo310Pointer(SiS_Pr, HwDeviceExtension); + case SIS_315H: + case SIS_315: + case SIS_315PRO: + case SIS_550: + case SIS_650: + case SIS_740: + case SIS_330: + case SIS_660: + case SIS_760: + InitTo310Pointer(SiS_Pr, HwDeviceExtension); + break; #endif - #ifdef SIS300 - if ((HwDeviceExtension->jChipType == SIS_540) || - (HwDeviceExtension->jChipType == SIS_630) || - (HwDeviceExtension->jChipType == SIS_730) || - (HwDeviceExtension->jChipType == SIS_300)) - InitTo300Pointer(SiS_Pr, HwDeviceExtension); + case SIS_300: + case SIS_540: + case SIS_630: + case SIS_730: + InitTo300Pointer(SiS_Pr, HwDeviceExtension); + break; #endif + default: + break; + } } void @@ -2141,7 +932,7 @@ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo); - return(SiSSetMode(SiS_Pr, HwDeviceExtension, pScrn, ModeNo, TRUE)); + return(SiSSetMode(SiS_Pr, HwDeviceExtension, pScrn, ModeNo, TRUE)); } #ifdef SISDUALHEAD @@ -2453,6 +1244,7 @@ switch (HwDeviceExtension->ujVBChipID) { case VB_CHIP_301: case VB_CHIP_301B: + case VB_CHIP_301C: case VB_CHIP_301LV: case VB_CHIP_302: case VB_CHIP_302B: @@ -2536,8 +1328,8 @@ if(SiS_Pr->UseCustomMode) { ModeNo = 0xfe; - } - + } + SiSInitPtr(SiS_Pr, HwDeviceExtension); SiSRegInit(SiS_Pr, BaseAddr); @@ -2565,7 +1357,7 @@ if(!SiS_Pr->UseCustomMode) { /* TW: Shift the clear-buffer-bit away */ ModeNo = ((ModeNo & 0x80) << 8) | (ModeNo & 0x7f); - } + } #ifdef LINUX_XF86 /* We never clear the buffer in X */ @@ -2586,17 +1378,17 @@ SiS_UnLockCRT2(SiS_Pr, HwDeviceExtension, BaseAddr); if(!SiS_Pr->UseCustomMode) { - + /* 2.Get ModeID Table */ temp = SiS_SearchModeID(SiS_Pr,ROMAddr,&ModeNo,&ModeIdIndex); if(temp == 0) return(0); - + } else { - + ModeIdIndex = 0; - + } - + /* Determine VBType (301,301B,301LV,302B,302LV) */ SiS_GetVBType(SiS_Pr,BaseAddr,HwDeviceExtension); @@ -2630,9 +1422,11 @@ SiS_SetHiVision(SiS_Pr,BaseAddr,HwDeviceExtension); SiS_GetLCDResInfo(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,HwDeviceExtension); - /* 3. Check memory size */ +#ifndef LINUX_XF86 + /* 3. Check memory size (Kernel framebuffer driver only) */ temp = SiS_CheckMemorySize(SiS_Pr,ROMAddr,HwDeviceExtension,ModeNo,ModeIdIndex); if(!temp) return(0); +#endif if(HwDeviceExtension->jChipType >= SIS_315H) { if(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x17) & 0x08) { @@ -2674,6 +1468,7 @@ switch (HwDeviceExtension->ujVBChipID) { case VB_CHIP_301: case VB_CHIP_301B: + case VB_CHIP_301C: case VB_CHIP_301LV: case VB_CHIP_302: case VB_CHIP_302B: @@ -2999,25 +1794,26 @@ flag = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x00); - /* TW: Illegal values not welcome... */ if(flag > 3) return; rev = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x01); - if (flag >= 2) { + if(flag >= 2) { SiS_Pr->SiS_VBType = VB_SIS302B; - } else if (flag == 1) { + } else if(flag == 1) { SiS_Pr->SiS_VBType = VB_SIS301; - if(rev >= 0xB0) { + if(rev >= 0xC0) { + SiS_Pr->SiS_VBType = VB_SIS301C; + } else if(rev >= 0xB0) { SiS_Pr->SiS_VBType = VB_SIS301B; /* Check if 30xB DH version (no LCD support, use Panel Link instead) */ nolcd = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x23); if(!(nolcd & 0x02)) SiS_Pr->SiS_VBType |= VB_NoLCD; } } - if(SiS_Pr->SiS_VBType & (VB_SIS301B | VB_SIS302B)) { + if(SiS_Pr->SiS_VBType & (VB_SIS301B | VB_SIS301C | VB_SIS302B)) { if(rev >= 0xD0) { - SiS_Pr->SiS_VBType &= ~(VB_SIS301B | VB_SIS302B); + SiS_Pr->SiS_VBType &= ~(VB_SIS301B | VB_SIS301C | VB_SIS302B); SiS_Pr->SiS_VBType |= VB_SIS301LV; SiS_Pr->SiS_VBType &= ~(VB_NoLCD); if(rev >= 0xE0) { @@ -3087,6 +1883,7 @@ return ((BOOLEAN)ModeIdIndex); } +#ifndef LINUX_XF86 BOOLEAN SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo,USHORT ModeIdIndex) @@ -3114,6 +1911,7 @@ if(temp < memorysize) return(FALSE); else return(TRUE); } +#endif UCHAR SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex) @@ -3325,7 +2123,7 @@ if(HwDeviceExtension->jChipType >= SIS_315H) { if(IS_SIS550650740660) { /* 315, 330 don't do this */ - if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { + if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) ARdata=0; } else { ARdata = 0; @@ -3728,6 +2526,9 @@ USHORT data,data2,data3; USHORT infoflag=0,modeflag; USHORT resindex,xres; +#ifdef SIS315H + ULONG longdata; +#endif if(SiS_Pr->UseCustomMode) { modeflag = SiS_Pr->CModeFlag; @@ -3864,9 +2665,9 @@ data2 *= data3; data3 = SiS_GetMCLK(SiS_Pr,ROMAddr, HwDeviceExtension); - data3 *= 1024; + longdata = data3 * 1024; - data2 = data3 / data2; + data2 = longdata / data2; if(SiS_Pr->SiS_ModeType != Mode16Bpp) { if(data2 >= 0x19c) data = 0xba; @@ -4136,6 +2937,7 @@ SiS_SetReg3(DACData,(USHORT)bl); } +#ifndef LINUX_XF86 static ULONG GetDRAMSize(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { @@ -4144,11 +2946,11 @@ USHORT counter; #endif + switch(HwDeviceExtension->jChipType) { #ifdef SIS315H - if ((HwDeviceExtension->jChipType == SIS_315H) || - (HwDeviceExtension->jChipType == SIS_315) || - (HwDeviceExtension->jChipType == SIS_315PRO)) { - + case SIS_315H: + case SIS_315: + case SIS_315PRO: counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); AdapterMemorySize = 1 << ((counter & 0xF0) >> 4); counter >>= 2; @@ -4159,9 +2961,9 @@ AdapterMemorySize <<= 1; /* SINGLE_CHANNEL_2_RANK or DUAL_CHANNEL_1_RANK */ } AdapterMemorySize *= (1024*1024); + break; - } else if(HwDeviceExtension->jChipType == SIS_330) { - + case SIS_330: counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); AdapterMemorySize = 1 << ((counter & 0xF0) >> 4); counter &= 0x0c; @@ -4169,34 +2971,37 @@ AdapterMemorySize <<= 1; } AdapterMemorySize *= (1024*1024); + break; - } else if((HwDeviceExtension->jChipType == SIS_550) || - (HwDeviceExtension->jChipType == SIS_740) || - (HwDeviceExtension->jChipType == SIS_650) || - (HwDeviceExtension->jChipType == SIS_660)) { - + case SIS_550: + case SIS_650: + case SIS_740: + case SIS_660: + case SIS_760: counter = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x3F; counter++; AdapterMemorySize = counter * 4; AdapterMemorySize *= (1024*1024); - } + break; #endif #ifdef SIS300 - if ((HwDeviceExtension->jChipType==SIS_300) || - (HwDeviceExtension->jChipType==SIS_540) || - (HwDeviceExtension->jChipType==SIS_630) || - (HwDeviceExtension->jChipType==SIS_730)) { - + case SIS_300: + case SIS_540: + case SIS_630: + case SIS_730: AdapterMemorySize = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14) & 0x3F; AdapterMemorySize++; AdapterMemorySize *= (1024*1024); - - } + break; #endif + default: + break; + } return AdapterMemorySize; } +#endif #ifndef LINUX_XF86 void @@ -4525,46 +3330,6 @@ return((USHORT)longtemp); } -#if 0 /* TW: Old fragment, unused */ -USHORT -SiS_CalcDelay(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT key) -{ - USHORT data,data2,temp0,temp1; - UCHAR ThLowA[]= {61,3,52,5,68,7,100,11, - 43,3,42,5,54,7, 78,11, - 34,3,37,5,47,7, 67,11}; - - UCHAR ThLowB[]= {81,4,72,6,88,8,120,12, - 55,4,54,6,66,8, 90,12, - 42,4,45,6,55,8, 75,12}; - - UCHAR ThTiming[]= {1,2,2,3,0,1,1,2}; - - data=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16); - data=data>>6; - data2=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x14); - data2=(data2>>4)&0x0C; - data=data|data2; - data=data<1; - if(key==0) { - temp0=(USHORT)ThLowA[data]; - temp1=(USHORT)ThLowA[data+1]; - } else { - temp0=(USHORT)ThLowB[data]; - temp1=(USHORT)ThLowB[data+1]; - } - - data2=0; - data=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x18); - if(data&0x02) data2=data2|0x01; - if(data&0x20) data2=data2|0x02; - if(data&0x40) data2=data2|0x04; - - data=temp1*ThTiming[data2]+temp0; - return(data); -} -#endif - void SiS_SetCRT1FIFO_630(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo, PSIS_HW_DEVICE_INFO HwDeviceExtension, @@ -4815,9 +3580,7 @@ } #endif -/* =============== Autodetection ================ */ -/* I N C O M P L E T E */ - +#ifdef LINUX_XF86 BOOLEAN SiS_GetPanelID(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) { @@ -4890,254 +3653,7 @@ } return 1; } - - -#ifdef LINUXBIOS - -void -SiS_DetectMonitor(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr) -{ - UCHAR DAC_TEST_PARMS[] = {0x0F,0x0F,0x0F}; - UCHAR DAC_CLR_PARMS[] = {0x00,0x00,0x00}; - USHORT SR1F; - - SR1F = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x1F); /* backup DAC pedestal */ - SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1F,0x04); - - if(SiS_Pr->SiS_IF_DEF_LVDS == 0) { - if(!(SiS_BridgeIsOn(SiS_Pr, BaseAddr))) { - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x30,0x41); - } - } - - SiSSetMode(SiS_Pr,HwDeviceExtension,0x2E); - if(HwDeviceExtension->jChipType >= SIS_650) { - /* TW: On 650 only - enable CRT1 */ - SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x63,0xbf); - } - SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff); - SiS_ClearDAC(SiS_Pr, SiS_Pr->SiS_P3c8); - SiS_LongWait(SiS_Pr); - SiS_LongWait(SiS_Pr); - SiS_LongWait(SiS_Pr); - SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x32,0xDF,0x00); - if(SiS_TestMonitorType(SiS_Pr, DAC_TEST_PARMS[0],DAC_TEST_PARMS[1],DAC_TEST_PARMS[2])) { - SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x32,0xDF,0x20); - } else if(SiS_TestMonitorType(SiS_Pr, DAC_TEST_PARMS[0],DAC_TEST_PARMS[1],DAC_TEST_PARMS[2])) { - SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x32,0xDF,0x20); - } - SiS_TestMonitorType(SiS_Pr, DAC_CLR_PARMS[0],DAC_CLR_PARMS[1],DAC_CLR_PARMS[2]); - - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x1F,SR1F); -} - -USHORT -SiS_TestMonitorType(SiS_Private *SiS_Pr, UCHAR R_DAC,UCHAR G_DAC,UCHAR B_DAC) -{ - USHORT temp,tempbx; - - tempbx = R_DAC * 0x4d + G_DAC * 0x97 + B_DAC * 0x1c; - if((tempbx & 0x00ff) > 0x80) tempbx += 0x100; - tempbx = (tempbx & 0xFF00) >> 8; - R_DAC = (UCHAR) tempbx; - G_DAC = (UCHAR) tempbx; - B_DAC = (UCHAR) tempbx; - - SiS_SetReg3(SiS_Pr->SiS_P3c8,0x00); - SiS_SetReg3(SiS_Pr->SiS_P3c9,R_DAC); - SiS_SetReg3(SiS_Pr->SiS_P3c9,G_DAC); - SiS_SetReg3(SiS_Pr->SiS_P3c9,B_DAC); - SiS_LongWait(SiS_Pr); - temp=SiS_GetReg2(SiS_Pr->SiS_P3c2); - if(temp & 0x10) return(1); - else return(0); -} - -void -SiS_GetSenseStatus(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,UCHAR *ROMAddr) -{ - USHORT tempax=0,tempbx,tempcx,temp; - USHORT P2reg0=0,SenseModeNo=0,OutputSelect=*SiS_Pr->pSiS_OutputSelect; - USHORT ModeIdIndex,i; - USHORT BaseAddr = (USHORT)HwDeviceExtension->ulIOAddress; - - if(SiS_Pr->SiS_IF_DEF_LVDS == 1){ - SiS_GetPanelID(SiS_Pr); - temp=LCDSense; - temp=temp|SiS_SenseCHTV(SiS_Pr); - tempbx=~(LCDSense|AVIDEOSense|SVIDEOSense); - SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x32,tempbx,temp); - } else { /* for 301 */ - if(SiS_Pr->SiS_IF_DEF_HiVision==1) { /* for HiVision */ - tempax=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x38); - temp=tempax&0x01; - tempax=SiS_GetReg1(SiS_Pr->SiS_P3c4,0x3A); - temp=temp|(tempax&0x02); - SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x32,0xA0,temp); - } else { - if(SiS_BridgeIsOn(SiS_Pr, BaseAddr)==0) { /* TW: Inserted "==0" */ - P2reg0 = SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00); - if(!(SiS_BridgeIsEnable(SiS_Pr, BaseAddr,HwDeviceExtension))) { - SenseModeNo=0x2e; - temp = SiS_SearchModeID(SiS_Pr, ROMAddr,&SenseModeNo,&ModeIdIndex); - SiS_Pr->SiS_SetFlag = 0x00; - SiS_Pr->SiS_ModeType = ModeVGA; - SiS_Pr->SiS_VBInfo = SetCRT2ToRAMDAC |LoadDACFlag |SetInSlaveMode; - SiS_SetCRT2Group(SiS_Pr, BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension); - for(i=0;i<20;i++) { - SiS_LongWait(SiS_Pr); - } - } - SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,0x1c); - tempax=0; - tempbx=*SiS_Pr->pSiS_RGBSenseData; - if(SiS_Is301B(SiS_Pr, BaseAddr)){ - tempbx=*SiS_Pr->pSiS_RGBSenseData2; - } - tempcx=0x0E08; - if(SiS_Sense(SiS_Pr, tempbx,tempcx)){ - if(SiS_Sense(SiS_Pr, tempbx,tempcx)){ - tempax=tempax|Monitor2Sense; - } - } - tempbx=*SiS_Pr->pSiS_YCSenseData; - if(SiS_Is301B(SiS_Pr, BaseAddr)){ - tempbx=*SiS_Pr->pSiS_YCSenseData2; - } - tempcx=0x0604; - if(SiS_Sense(SiS_Pr, tempbx,tempcx)){ - if(SiS_Sense(SiS_Pr,tempbx,tempcx)){ - tempax=tempax|SVIDEOSense; - } - } - - if(ROMAddr && SiS_Pr->SiS_UseROM) { -#ifdef SIS300 - if((HwDeviceExtension->jChipType==SIS_630)|| - (HwDeviceExtension->jChipType==SIS_730)) { - OutputSelect = ROMAddr[0xfe]; - } -#endif -#ifdef SIS315H - if(HwDeviceExtension->jChipType >= SIS_315H) { - OutputSelect = ROMAddr[0xf3]; - if(HwDeviceExtension->jChipType >= SIS_330) { - OutputSelect = ROMAddr[0x11b]; - } - } #endif - } - if(OutputSelect & BoardTVType){ - tempbx = *SiS_Pr->pSiS_VideoSenseData; - if(SiS_Is301B(SiS_Pr, BaseAddr)){ - tempbx = *SiS_Pr->pSiS_VideoSenseData2; - } - tempcx = 0x0804; - if(SiS_Sense(SiS_Pr, tempbx,tempcx)){ - if(SiS_Sense(SiS_Pr, tempbx,tempcx)){ - tempax |= AVIDEOSense; - } - } - } else { - if(!(tempax & SVIDEOSense)){ - tempbx = *SiS_Pr->pSiS_VideoSenseData; - if(SiS_Is301B(SiS_Pr, BaseAddr)){ - tempbx = *SiS_Pr->pSiS_VideoSenseData2; - } - tempcx = 0x0804; - if(SiS_Sense(SiS_Pr,tempbx,tempcx)){ - if(SiS_Sense(SiS_Pr, tempbx,tempcx)){ - tempax |= AVIDEOSense; - } - } - } - } - } - - if(SiS_SenseLCD(SiS_Pr, HwDeviceExtension)){ - tempax |= LCDSense; - } - - tempbx=0; - tempcx=0; - SiS_Sense(SiS_Pr, tempbx,tempcx); - - if(SiS_Pr->SiS_VBType & (VB_SIS301LV302LV)) { - tempax &= 0x00ef; /* 30xlv have no VGA2*/ - } - SiS_SetRegANDOR(SiS_Pr->SiS_P3d4,0x32,~0xDF,tempax); - SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x00,P2reg0); - if(!(P2reg0 & 0x20)) { - SiS_Pr->SiS_VBInfo = DisableCRT2Display; - SiS_SetCRT2Group(SiS_Pr,BaseAddr,ROMAddr,SenseModeNo,HwDeviceExtension); - } - } - } -} - -BOOLEAN -SiS_Sense(SiS_Private *SiS_Pr, USHORT tempbx,USHORT tempcx) -{ - USHORT temp,i,tempch; - - temp = tempbx & 0xFF; - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x11,temp); - temp = (tempbx & 0xFF00) >> 8; - temp |= (tempcx & 0x00FF); - SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x10,~0x1F,temp); - - for(i=0; i<10; i++) SiS_LongWait(SiS_Pr); - - tempch = (tempcx & 0x7F00) >> 8; - temp = SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x03); - temp ^= 0x0E; - temp &= tempch; - if(temp>0) return 1; - else return 0; -} - -USHORT -SiS_SenseLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - USHORT temp; - - temp=SiS_GetPanelID(SiS_Pr); - if(!temp) temp=SiS_GetLCDDDCInfo(SiS_Pr, HwDeviceExtension); - return(temp); -} - -BOOLEAN -SiS_GetLCDDDCInfo(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension) -{ - USHORT temp; - /*add lcd sense*/ - if(HwDeviceExtension->ulCRT2LCDType==LCD_UNKNOWN) - return 0; - else{ - temp=(USHORT)HwDeviceExtension->ulCRT2LCDType; - SiS_SetReg1(SiS_Pr->SiS_P3d4,0x36,temp); - return 1; - } -} - -USHORT -SiS_SenseCHTV(SiS_Private *SiS_Pr) -{ - USHORT temp,push0e,status; - - status=0; - push0e = SiS_GetCH700x(SiS_Pr, 0x0e); - push0e = (push0e << 8) | 0x0e; - SiS_SetCH700x(SiS_Pr, 0x0b0e); - SiS_SetCH700x(SiS_Pr, 0x0110); - SiS_SetCH700x(SiS_Pr, 0x0010); - temp = SiS_GetCH700x(SiS_Pr, 0x10); - if(temp & 0x08) status |= SVIDEOSense; - if(temp & 0x02) status |= AVIDEOSense; - SiS_SetCH700x(SiS_Pr, push0e); - return(status); -} -#endif /* LINUXBIOS */ /* ================ XFREE86 ================= */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/init.h linux-2.4.23-pre8/drivers/video/sis/init.h --- linux-2.4.22/drivers/video/sis/init.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/init.h 2003-10-22 22:48:20.000000000 +0000 @@ -28,6 +28,9 @@ * PERFORMANCE OF THIS SOFTWARE. * * Author: Thomas Winischhofer + * + * Based on code by Silicon Intergrated Systems + * */ #ifndef _INIT_ @@ -766,7 +769,8 @@ { 12, 5, 954, 448,1270, 530, 50, 0, 50,0xf1,0x04,0x1f,0x18}, { 9, 4, 960, 463,1644, 438, 50, 0, 50,0xf4,0x0b,0x1c,0x0a}, { 9, 4, 848, 528,1270, 530, 0, 0, 50,0xf5,0xfb,0x1b,0x2a}, /* 640x480, 320x240 */ - { 36, 25,1060, 648,1316, 530, 438, 0, 438,0xeb,0x05,0x25,0x16}, /* 800x600, 400x300 */ +/*{ 36, 25,1060, 648,1316, 530, 438, 0, 438,0xeb,0x05,0x25,0x16},*//* 800x600, 400x300 */ + { 36, 25,1060, 648,1270, 530, 438, 0, 438,0xeb,0x05,0x25,0x16}, /* 800x600, 400x300 - better */ { 3, 2,1080, 619,1270, 540, 438, 0, 438,0xf3,0x00,0x1d,0x20}, /* 720x576 */ { 1, 1,1170, 821,1270, 520, 686, 0, 686,0xF3,0x00,0x1D,0x20} /* 1024x768 */ }; @@ -926,27 +930,45 @@ }; static const SiS_LCDDataStruct SiS_StLCD1600x1200Data[] = -{ /* TODO */ - { 0, 0, 0, 0, 0, 0} +{ + {27, 4, 800, 500, 2160, 1250 }, + {27, 4, 800, 500, 2160, 1250 }, + { 6, 1, 900, 500, 2160, 1250 }, + { 6, 1, 900, 500, 2160, 1250 }, + {27, 1, 800, 500, 2160, 1250 }, + { 4, 1,1080, 625, 2160, 1250 }, + { 5, 2,1350, 800, 2160, 1250 }, + {135,88,1600,1100, 2160, 1250 }, + {135,88,1600,1100, 2160, 1250 }, + { 1, 1,2160,1250, 2160, 1250 } }; static const SiS_LCDDataStruct SiS_ExtLCD1600x1200Data[] = -{ /* TODO */ - { 0, 0, 0, 0, 0, 0} +{ + {27, 4, 800, 500, 2160, 1250 }, + {27, 4, 800, 500, 2160, 1250 }, + { 6, 1, 900, 500, 2160, 1250 }, + { 6, 1, 900, 500, 2160, 1250 }, + {27, 1, 800, 500, 2160, 1250 }, + { 4, 1,1080, 625, 2160, 1250 }, + { 5, 2,1350, 800, 2160, 1250 }, + {27,16,1500,1064, 2160, 1250 }, + {27,16,1500,1064, 2160, 1250 }, + { 1, 1,2160,1250, 2160, 1250 } }; static const SiS_LCDDataStruct SiS_NoScaleData1600x1200[] = -{ /* TODO - values guessed */ - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250}, - {1, 1, 2048, 1250, 2048, 1250} +{ + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, + {1, 1, 2160, 1250, 2048, 1250}, }; static const SiS_LCDDataStruct SiS_NoScaleData[] = @@ -960,7 +982,7 @@ { 1, 1,1344, 806,1344, 806 }, { 1, 1,1688,1066,1688,1066 }, { 1, 1,1688, 802,1688, 802 }, /* 1280x768: 802 was 806 in both cases */ - { 1, 1,2048,1250,2048,1250 }, /* 1600x1200 (guessed) */ + { 1, 1,2160,1250,2160,1250 }, /* 1600x1200 */ { 1, 1,1800,1000,1800,1000 } /* 1280x960 */ }; @@ -1302,6 +1324,40 @@ { 800, 525,1280, 813} }; +static const SiS_LVDSDataStruct SiS_LVDS848x480Data_1[]= +{ + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + {1088, 525,1088, 525}, /* 640x480 TODO */ + {1088, 525,1088, 525}, /* 800x600 TODO */ + {1088, 525,1088, 525}, /* 1024x768 TODO */ + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + {1088, 525,1088, 525}, /* 848x480 */ + {1088, 525,1088, 525} /* 1360x768 TODO */ +}; + +static const SiS_LVDSDataStruct SiS_LVDS848x480Data_2[]= +{ + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + {1088, 525,1088, 525}, /* 640x480 */ + {1088, 525,1088, 525}, /* 800x600 */ + {1088, 525,1088, 525}, /* 1024x768 */ + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + { 0, 0, 0, 0}, + {1088, 525,1088, 525}, /* 848x480 */ + {1088, 525,1088, 525} /* 1360x768 TODO */ +}; + /* LCDA */ static const SiS_LVDSDataStruct SiS_LCDA1400x1050Data_1[]= @@ -2126,6 +2182,7 @@ USHORT vendor; UCHAR productnum; USHORT product[5]; + const char *DDCnames[5]; const char *plasmaname; UCHAR modenum; UCHAR plasmamodes[20]; /* | 0x80 = DVI-capable, | 0x40 = analog */ @@ -2233,13 +2290,17 @@ #if 0 /* Product IDs missing */ { 0x38a3, 4, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42VP4/42VP4D/42VP4G/42VP4DG", - 14, /* All DVI, except 0, 7, 13; 3, 15, 16 unknown */ - { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,12|0xc0, - 13|0x40,14|0xc0,15|0xc0,16|0xc0, 0 , 0 , 0 , 0 , 0 , 0 } + 11, /* All DVI, except 0, 7, 13 */ + { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, + 17|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }, +#endif +#if 0 /* Product IDs missing */ { 0x38a3, 3, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42PD1/50PD1/50PD2", 5, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0, 0 , 0 , 0 , 0 , 0 , @@ -2247,6 +2308,7 @@ }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42PD3", 10, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 7|0x40, 8|0xc0, 9|0xc0, @@ -2254,6 +2316,7 @@ }, { 0x38a3, 2, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42VM3/61XM1", 11, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 3|0xc0, 4|0xc0, 5|0xc0, 6|0xc0, 8|0xc0, 9|0xc0,11|0xc0, @@ -2261,6 +2324,7 @@ }, { 0x38a3, 2, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 42MP1/42MP2", 6, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 , @@ -2268,6 +2332,7 @@ }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 50MP1", 10, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, @@ -2276,6 +2341,7 @@ #endif { 0x38a3, 4, { 0xa482, 0xa483, 0x0000, 0x0000, 0x0000 }, + { "PX-42VM", "", "", "", "" }, "NEC PlasmaSync 42MP3/42MP4/50MP2/61MP1", 11, /* All DVI except 0, 7, 13, 17 */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,10|0xc0,11|0xc0,13|0x40,14|0xc0, @@ -2284,6 +2350,7 @@ #if 0 /* Product IDs missing */ { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 3300W", 3, { 0|0x40, 1|0xc0,18|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , @@ -2291,6 +2358,7 @@ }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 4200W", 4, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 0 , 0 , 0 , 0 , 0 , 0 , @@ -2298,6 +2366,7 @@ }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 4210W", 6, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 9|0xc0,11|0xc0, 0 , 0 , 0 , 0 , @@ -2305,6 +2374,7 @@ }, { 0x38a3, 1, { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "NEC PlasmaSync 5000W", 7, /* DVI entirely unknown */ { 0|0x40, 1|0xc0, 2|0xc0, 4|0xc0, 7|0x40, 9|0xc0,11|0xc0, 0 , 0 , 0 , @@ -2313,6 +2383,7 @@ #endif { 0x412f, 2, { 0x000c, 0x000b, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "Pioneer 503CMX/PDA-5002", 6, /* DVI unknown */ { 1|0xc0, 2|0xc0, 9|0xc0,11|0xc0,12|0xc0,15|0xc0, 0 , 0 , 0 , 0 , @@ -2320,6 +2391,7 @@ }, { 0x34a9, 1, { 0xa00e, 0x0000, 0x0000, 0x0000, 0x0000 }, + { "", "", "", "", "" }, "Panasonic TH-42", 5, /* No DVI output */ { 1|0x40, 2|0x40, 4|0x40, 9|0x40,15|0x40, 0 , 0 , 0 , 0 , 0 , @@ -2338,51 +2410,21 @@ ULONG SiS_GetReg3(USHORT); USHORT SiS_GetReg4(USHORT); void SiS_ClearDAC(SiS_Private *SiS_Pr, ULONG); -void SiS_SetMemoryClock(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension); -void SiS_SetDRAMModeRegister(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension); BOOLEAN SiS_SearchVBModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo); void SiS_IsLowResolution(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex); void SiS_GetSysFlags(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension); - -#ifdef SIS300 -void SiS_SetDRAMSize_300(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension); -USHORT SiS_ChkBUSWidth_300(SiS_Private *SiS_Pr, ULONG FBAddress); -#endif - #ifdef SIS315H UCHAR SiS_Get310DRAMType(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension); -void SiS_DDR_MRS(SiS_Private *SiS_Pr); -void SiS_SDR_MRS(SiS_Private *SiS_Pr); -void SiS_DisableRefresh(SiS_Private *SiS_Pr); -void SiS_EnableRefresh(SiS_Private *SiS_Pr, UCHAR *ROMAddr); -void SiS_SetDRAMSize_310(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO); -void SiS_DisableChannelInterleaving(SiS_Private *SiS_Pr, int index,USHORT SiS_DDRDRAM_TYPE[][5]); -void SiS_SetDRAMSizingType(SiS_Private *SiS_Pr, int index,USHORT DRAMTYPE_TABLE[][5]); -void SiS_CheckBusWidth_310(SiS_Private *SiS_Pr, UCHAR *ROMAddress,ULONG FBAddress, - PSIS_HW_DEVICE_INFO HwDeviceExtension); -int SiS_SetRank(SiS_Private *SiS_Pr, int index,UCHAR RankNo,USHORT DRAMTYPE_TABLE[][5]); -int SiS_SetDDRChannel(SiS_Private *SiS_Pr, int index,UCHAR ChannelNo, - USHORT DRAMTYPE_TABLE[][5]); -int SiS_CheckColumn(SiS_Private *SiS_Pr, int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress); -int SiS_CheckBanks(SiS_Private *SiS_Pr, int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress); -int SiS_CheckRank(SiS_Private *SiS_Pr, int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress); -int SiS_CheckDDRRank(SiS_Private *SiS_Pr, int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress); -int SiS_CheckRanks(SiS_Private *SiS_Pr, int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress); -int SiS_CheckDDRRanks(SiS_Private *SiS_Pr, int RankNo,int index,USHORT DRAMTYPE_TABLE[][5],ULONG FBAddress); -int SiS_SDRSizing(SiS_Private *SiS_Pr, ULONG FBAddress); -int SiS_DDRSizing(SiS_Private *SiS_Pr, ULONG FBAddress); -int Is315E(SiS_Private *SiS_Pr); -void SiS_VerifyMclk(SiS_Private *SiS_Pr, ULONG FBAddr); #endif - void SiS_HandleCRT1(SiS_Private *SiS_Pr); void SiS_Handle301B_1400x1050(SiS_Private *SiS_Pr, USHORT ModeNo); void SiS_SetEnableDstn(SiS_Private *SiS_Pr, int enable); void SiS_SetEnableFstn(SiS_Private *SiS_Pr, int enable); -void SiS_Delay15us(SiS_Private *SiS_Pr); BOOLEAN SiS_SearchModeID(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT *ModeNo,USHORT *ModeIdIndex); +#ifndef LINUX_XF86 BOOLEAN SiS_CheckMemorySize(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo,USHORT ModeIdIndex); +#endif UCHAR SiS_GetModePtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex); void SiS_WhatTheHellIsThis(SiS_Private *SiS_Pr,PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr); void SiS_StrangeStuff(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension); @@ -2434,14 +2476,6 @@ void SiS_ClearBuffer(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO,USHORT ModeNo); void SiS_SetCRT1Group(SiS_Private *SiS_Pr, UCHAR *ROMAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo,USHORT ModeIdIndex,USHORT BaseAddr); -void SiS_DetectMonitor(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr); -void SiS_GetSenseStatus(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,UCHAR *ROMAddr); -USHORT SiS_TestMonitorType(SiS_Private *SiS_Pr, UCHAR R_DAC,UCHAR G_DAC,UCHAR B_DAC); -USHORT SiS_SenseCHTV(SiS_Private *SiS_Pr); -BOOLEAN SiS_Sense(SiS_Private *SiS_Pr, USHORT tempbx,USHORT tempcx); -BOOLEAN SiS_GetPanelID(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO); -BOOLEAN SiS_GetLCDDDCInfo(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO); -USHORT SiS_SenseLCD(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO); void SiSRegInit(SiS_Private *SiS_Pr, USHORT BaseAddr); void SiSInitPtr(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension); void SiSSetLVDSetc(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT ModeNo); @@ -2449,6 +2483,7 @@ void SiSDetermineROMUsage(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, UCHAR *ROMAddr); #ifdef LINUX_XF86 +BOOLEAN SiS_GetPanelID(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO); USHORT SiS_CheckBuildCustomMode(ScrnInfoPtr pScrn, DisplayModePtr mode, int VBFlags); void SiS_SetPitch(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr); void SiS_SetPitchCRT1(SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, UShort BaseAddr); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/init301.c linux-2.4.23-pre8/drivers/video/sis/init301.c --- linux-2.4.22/drivers/video/sis/init301.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/init301.c 2003-10-22 22:47:37.000000000 +0000 @@ -1,11 +1,11 @@ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sis/init301.c,v 1.3 2002/22/04 01:16:16 dawes Exp $ */ /* - * Mode switching code (CRT2 section) for SiS 300/540/630/730/315/550/650/740/330/660 + * Mode switching code (CRT2 section) + * for SiS 300/305/540/630/730/315/550/650/M650/651/740/330/660/M660/760/M760 * (Universal module for Linux kernel framebuffer and XFree86 4.x) * - * Assembler-To-C translation * Copyright 2002, 2003 by Thomas Winischhofer - * Formerly based on non-functional code-fragements by SiS, Inc. + * Formerly based on non-functional code-fragements for 300 series by SiS, Inc. * * If distributed as part of the linux kernel, the contents of this file * is entirely covered by the GPL. @@ -107,7 +107,7 @@ ((SiS_Pr->SiS_VBType & VB_NoLCD) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) || ((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV)) ) { SiS_GetLVDSDesData(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex, - HwDeviceExtension); + HwDeviceExtension, BaseAddr); } else { SiS_Pr->SiS_LCDHDES = SiS_Pr->SiS_LCDVDES = 0; } @@ -318,7 +318,7 @@ if( (HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_IF_DEF_LVDS == 1) && - (SiS_Pr->SiS_VBInfo & SetInSlaveMode)) { + (SiS_Pr->SiS_VBInfo & SetInSlaveMode) ) { SiS_SetCRT2Sync(SiS_Pr,BaseAddr,ROMAddr,ModeNo, RefreshRateTableIndex,HwDeviceExtension); @@ -649,7 +649,7 @@ } if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { if(HwDeviceExtension->pdc) { - temp = HwDeviceExtension->pdc & 0x3c; + temp = HwDeviceExtension->pdc & 0x3c; } } } @@ -695,6 +695,14 @@ } else { /* LV (550/301LV checks ROM byte, other LV BIOSes do not) */ tempbl = 0xF0; } + if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD|SetCRT2ToLCDA)) { + if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { + if(HwDeviceExtension->pdc) { + temp = HwDeviceExtension->pdc; + tempbl = 0; + } + } + } } else { if(HwDeviceExtension->jChipType == SIS_740) { temp = 0x03; @@ -1156,7 +1164,8 @@ if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN) && (SiS_Pr->SiS_CustomT != CUT_BARCO1366) && - (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) { + (SiS_Pr->SiS_CustomT != CUT_BARCO1024) && + (SiS_Pr->SiS_CustomT != CUT_PANEL848)) { if(!(SiS_Pr->SiS_LCDInfo & LCDPass11)) { if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) { @@ -1201,7 +1210,8 @@ if((!SiS_Pr->SiS_IF_DEF_DSTN) && (!SiS_Pr->SiS_IF_DEF_FSTN) && (SiS_Pr->SiS_CustomT != CUT_BARCO1366) && - (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) { + (SiS_Pr->SiS_CustomT != CUT_BARCO1024) && + (SiS_Pr->SiS_CustomT != CUT_PANEL848)) { if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) { temp += 6; if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel800x600) { @@ -1311,7 +1321,8 @@ if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) && (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel640x480) && (SiS_Pr->SiS_CustomT != CUT_BARCO1366) && - (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) { + (SiS_Pr->SiS_CustomT != CUT_BARCO1024) && + (SiS_Pr->SiS_CustomT != CUT_PANEL848)) { if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_2 || SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480_3) { tempcx = 0x0017; @@ -1365,7 +1376,8 @@ if((!(SiS_Pr->SiS_LCDInfo & LCDPass11)) && (SiS_Pr->SiS_CustomT != CUT_BARCO1366) && - (SiS_Pr->SiS_CustomT != CUT_BARCO1024)) { + (SiS_Pr->SiS_CustomT != CUT_BARCO1024) && + (SiS_Pr->SiS_CustomT != CUT_PANEL848)) { if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { if( (HwDeviceExtension->jChipType < SIS_315H) && (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel640x480) ) tempcx = 0x0001; @@ -1400,7 +1412,8 @@ if(SiS_Pr->SiS_IF_DEF_FSTN || SiS_Pr->SiS_IF_DEF_DSTN || (SiS_Pr->SiS_CustomT == CUT_BARCO1366) || - (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) { + (SiS_Pr->SiS_CustomT == CUT_BARCO1024) || + (SiS_Pr->SiS_CustomT == CUT_PANEL848)) { temp |= 0x30; } SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0xf0,temp); /* Part1_19h; Panel Link Vertical Retrace End (3:0); Misc. */ @@ -2186,8 +2199,16 @@ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { /* 315 - 30xLV */ - tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37); - tempah &= 0xC0; + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + tempah = infoflag >> 8; + if(SiS_Pr->SiS_LCDInfo & LCDSync) { + tempah = SiS_Pr->SiS_LCDInfo; + } + } else { + tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37); + } + tempah &= 0xC0; + tempah |= 0x20; if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10; SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x19,0x0F,tempah); @@ -2195,15 +2216,14 @@ } else { /* 315 - 301, 301B */ tempah = infoflag >> 8; - tempah &= 0xC0; if(!SiS_Pr->UseCustomMode) { if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { if(SiS_Pr->SiS_LCDInfo & LCDSync) { tempah = SiS_Pr->SiS_LCDInfo; - tempah &= 0xC0; } } } + tempah &= 0xC0; tempah |= 0x20; if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) tempah |= 0x10; @@ -2687,25 +2707,26 @@ /* Checked against 650/LVDS 1.10.07 BIOS */ void SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex, - PSIS_HW_DEVICE_INFO HwDeviceExtension) + USHORT RefreshRateTableIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension, + USHORT BaseAddr) { USHORT modeflag; USHORT PanelIndex,ResIndex; const SiS_LVDSDesStruct *PanelDesPtr = NULL; if((SiS_Pr->UseCustomMode) || - (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom)) { + (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) || + (SiS_Pr->SiS_CustomT == CUT_PANEL848)) { SiS_Pr->SiS_LCDHDES = 0; SiS_Pr->SiS_LCDVDES = 0; return; } - if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) ) { + if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA)) { #ifdef SIS315H SiS_GetLVDSDesPtrA(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex, - &PanelIndex,&ResIndex); + &PanelIndex,&ResIndex, HwDeviceExtension, BaseAddr); switch (PanelIndex) { @@ -2717,6 +2738,8 @@ case 5: PanelDesPtr = SiS_Pr->LVDS1280x1024Des_2; break; case 6: PanelDesPtr = SiS_Pr->LVDS1400x1050Des_2; break; case 7: PanelDesPtr = SiS_Pr->LVDS1600x1200Des_2; break; + case 80: PanelDesPtr = (SiS_LVDSDesStruct *)Clevo1024x768Des_1; break; /* custom */ + case 81: PanelDesPtr = (SiS_LVDSDesStruct *)Clevo1024x768Des_2; break; default: PanelDesPtr = SiS_Pr->LVDS1024x768Des_1; break; } #endif @@ -2868,7 +2891,8 @@ #ifdef SIS315H void SiS_GetLVDSDesPtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex) + USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex, + PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr) { USHORT tempbx=0,tempal; @@ -2878,6 +2902,15 @@ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 4; + if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { + tempbx = 80; + if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++; + } + } + } + if(ModeNo <= 0x13) tempal = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC; else @@ -3077,7 +3110,7 @@ /* For 302LV dual-channel */ if(HwDeviceExtension->jChipType >= SIS_315H) { if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempah |= 0x40; } } @@ -3439,6 +3472,8 @@ case 81: LVDSData = SiS_Pr->SiS_LVDSBARCO1366Data_2; break; case 82: LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_1; break; case 83: LVDSData = SiS_Pr->SiS_LVDSBARCO1024Data_2; break; + case 84: LVDSData = SiS_Pr->SiS_LVDS848x480Data_1; break; + case 85: LVDSData = SiS_Pr->SiS_LVDS848x480Data_2; break; case 90: LVDSData = SiS_Pr->SiS_CHTVUPALMData; break; case 91: LVDSData = SiS_Pr->SiS_CHTVOPALMData; break; case 92: LVDSData = SiS_Pr->SiS_CHTVUPALNData; break; @@ -3666,6 +3701,11 @@ case 27: LCDPtr = SiS_Pr->SiS_NoScaleData1280x768; break; /* Non-expanding */ case 28: LCDPtr = SiS_Pr->SiS_StLCD1280x768Data; break; /* Non-VESA Timing */ case 29: LCDPtr = SiS_Pr->SiS_NoScaleData; break; /* Generic no-scale data */ +#ifdef SIS315H + case 50: LCDPtr = (SiS_LCDDataStruct *)SiS310_ExtCompaq1280x1024Data; break; + case 51: LCDPtr = SiS_Pr->SiS_NoScaleData1280x1024; break; + case 52: LCDPtr = SiS_Pr->SiS_St2LCD1280x1024Data; break; +#endif default: LCDPtr = SiS_Pr->SiS_ExtLCD1024x768Data; break; /* Just to avoid a crash */ } @@ -3712,6 +3752,11 @@ else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 800; else if(SiS_Pr->SiS_VGAVDE == 1024) tempbx = 960; else tempbx = 960; + } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200) { + tempax = 1600; + if (SiS_Pr->SiS_VGAVDE == 350) tempbx = 875; + else if(SiS_Pr->SiS_VGAVDE == 400) tempbx = 1000; + else tempbx = 1200; } else { tempax = SiS_Pr->PanelXRes; tempbx = SiS_Pr->PanelYRes; @@ -3785,7 +3830,7 @@ if(xres == 720) xres = 640; } else { if(SiS_Pr->SiS_VBType & VB_NoLCD) { /* 301BDH */ - if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { + if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToHiVisionTV)) { if(xres == 720) xres = 640; } if(SiS_Pr->SiS_SetFlag & SetDOSMode) { @@ -3797,19 +3842,13 @@ } } } else { - if(SiS_Pr->SiS_VBInfo & (SetCRT2ToAVIDEO | /* (Allow 720 for VGA2) */ - SetCRT2ToSVIDEO | - SetCRT2ToSCART | - SetCRT2ToLCD | - SetCRT2ToHiVisionTV)) { + if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToHiVisionTV)) { if(xres == 720) xres = 640; } if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) { - if((ModeNo <= 0x13) || (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { - /* Panel on 301B via DVI shows 5 extra (garbage-)lines if this is done, - * panel on 30xLV blinks if it's not done... - */ + if(!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) { + /* BIOS bug - does this regardless of scaling */ if(yres == 400) yres = 405; } if(yres == 350) yres = 360; @@ -3905,6 +3944,14 @@ } } +#ifdef SIS315H + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + tempbx = 50; + if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 51; + else if(!(SiS_Pr->SiS_SetFlag & LCDVESATiming)) tempbx = 52; + } +#endif + } else { /* TV */ if((SiS_Pr->SiS_VBType & VB_SIS301B302B) && @@ -3912,7 +3959,7 @@ if(SiS_Pr->SiS_VGAVDE > 480) SiS_Pr->SiS_SetFlag &= (~TVSimuMode); tempbx = 2; if(SiS_Pr->SiS_VBInfo & SetInSlaveMode) { - if(!(SiS_Pr->SiS_SetFlag & TVSimuMode)) tempbx = 12; + if(!(SiS_Pr->SiS_SetFlag & TVSimuMode)) tempbx = 12; } } else { if(SiS_Pr->SiS_VBInfo & SetPALTV) tempbx = 3; @@ -3949,7 +3996,9 @@ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1; if(SiS_Pr->SiS_VBInfo & SetPALTV) { tempbx += 2; - if(SiS_Pr->SiS_CHSOverScan) tempbx = 99; + if(SiS_Pr->SiS_ModeType > ModeVGA) { + if(SiS_Pr->SiS_CHSOverScan) tempbx = 99; + } if(SiS_Pr->SiS_CHPALM) { tempbx = 90; if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1; @@ -3999,7 +4048,12 @@ if(SiS_Pr->SiS_LCDInfo & LCDPass11) { tempbx = 7; } - + + if(SiS_Pr->SiS_CustomT == CUT_PANEL848) { + tempbx = 84; + if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx++; + } + } #if 0 @@ -4063,7 +4117,8 @@ void SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,USHORT *CRT2Index, - USHORT *ResIndex) + USHORT *ResIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension, + USHORT BaseAddr) { USHORT tempbx,tempal; @@ -4077,6 +4132,24 @@ if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx += 16; else if(SiS_Pr->SiS_SetFlag & LCDVESATiming) tempbx += 32; +#ifdef SIS315H + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) { + tempbx = 100; + if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 101; + else if(SiS_Pr->SiS_SetFlag & LCDVESATiming) tempbx = 102; + } + } else if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { + tempbx = 103; + if(SiS_Pr->SiS_LCDInfo & DontExpandLCD) tempbx = 104; + else if(SiS_Pr->SiS_SetFlag & LCDVESATiming) tempbx = 105; + } + } + } +#endif + *CRT2Index = tempbx; *ResIndex = tempal & 0x3F; } @@ -4085,10 +4158,11 @@ SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo, USHORT ModeIdIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension) { - SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, + SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01 }; + 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00 }; USHORT RefreshRateTableIndex,i,backup_i; USHORT modeflag,index,temp,backupindex; @@ -4427,6 +4501,10 @@ if(resinfo == SIS_RI_512x384) return(0); } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelBarco1366) { if((resinfo != SIS_RI_1360x1024) && (resinfo > SIS_RI_1280x1024)) return(0); + } else if(SiS_Pr->SiS_LCDResInfo == Panel_848x480) { + if((resinfo != SIS_RI_1360x768) && + (resinfo != SIS_RI_848x480) && + (resinfo > SIS_RI_1024x768)) return(0); } } } @@ -4729,6 +4807,9 @@ if( (temp & 0x80) || (SiS_Pr->SiS_CHOverScan == 1) ) tempbx |= SetCHTVOverScan; } + if(SiS_Pr->SiS_CHSOverScan) { + tempbx |= SetCHTVOverScan; + } } } @@ -5056,40 +5137,50 @@ modenum = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x34); - if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { + if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { /* LV */ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00); if( (modenum <= 0x13) || (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) || (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) ) { - SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFE,0x00); + SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFE); + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3); + } } - SiS_DDC2Delay(SiS_Pr,0xff00); - SiS_DDC2Delay(SiS_Pr,0x6000); - SiS_DDC2Delay(SiS_Pr,0x8000); - - SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00); - pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06); + if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) { + SiS_DDC2Delay(SiS_Pr,0xff00); + SiS_DDC2Delay(SiS_Pr,0x6000); + SiS_DDC2Delay(SiS_Pr,0x8000); - if(IS_SIS740) { - SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3); - } + SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00); - SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3); + pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06); - if(!(IS_SIS740)) { - if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) { - tempah = 0xef; - if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) { - tempah = 0xf7; - } - SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah); + if(IS_SIS740) { + SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3); } - } - } else if(SiS_Pr->SiS_VBType & VB_NoLCD) { + SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3); + + if(!(IS_SIS740)) { + if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) { + tempah = 0xef; + if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) { + tempah = 0xf7; + } + SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah); + } + } + } + + } else if(SiS_Pr->SiS_VBType & VB_NoLCD) { /* B-DH */ + /* This is actually bullshit. The B-DH bridge has cetainly no + * Part4 Index 26, since it has no ability to drive LCD panels + * at all. But as the BIOS does it, we do it, too... + */ if(HwDeviceExtension->jChipType == SIS_650) { if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) { SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,0xef); @@ -5102,7 +5193,11 @@ } } - if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1F,0xef); + } + + if((SiS_Pr->SiS_VBType & VB_SIS301B302B) || (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280)) { tempah = 0x3f; if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) { tempah = 0x7f; @@ -5116,7 +5211,7 @@ if((SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) || ((SiS_Pr->SiS_VBType & VB_SIS301LV302LV) && (modenum <= 0x13))) { - if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { + if((SiS_Pr->SiS_VBType & VB_SIS301B302B) || (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280)) { SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x1E,0xDF); SiS_DisplayOff(SiS_Pr); SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x32,0xDF); @@ -5139,7 +5234,7 @@ } else { - if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { + if((SiS_Pr->SiS_VBType & VB_SIS301B302B) || (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280)) { if(!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr))) { SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x00,0xdf); SiS_DisplayOff(SiS_Pr); @@ -5163,7 +5258,7 @@ } - if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { + if((SiS_Pr->SiS_VBType & VB_SIS301LV302LV) && (SiS_Pr->SiS_CustomT != CUT_COMPAQ1280)) { SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,~0x10); /* 1.10.8r, 8m */ @@ -5195,18 +5290,21 @@ SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax); } else if(SiS_Pr->SiS_VBType & VB_NoLCD) { + if(HwDeviceExtension->jChipType == SIS_650) { if((SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) || (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)))) { if((!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) || (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)))) { SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2); - SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xFD,0x00); + SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD); SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4); } } } - } else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { + + } else if((SiS_Pr->SiS_VBType & VB_SIS301B302B) || (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280)) { + if(HwDeviceExtension->jChipType == SIS_650) { if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) { tempah = 0xef; @@ -5217,7 +5315,19 @@ } SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x4c,tempah); } + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + if((SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) || + (!(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)))) { + if((!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) || + (!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)))) { + SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 2); + SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x26,0xFD); + SiS_SetPanelDelay(SiS_Pr, ROMAddr, HwDeviceExtension, 4); + } + } + } } + } } else { /* 315, 330 - all bridge types */ @@ -5611,42 +5721,62 @@ #endif if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { - - SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0xef); /* 1.10.7u */ - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00); /* 1.10.7u */ + + if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) { + SiS_SetRegAND(SiS_Pr->SiS_Part4Port,0x1f,0xef); /* 1.10.7u */ + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00); /* 1.10.7u */ + } if(!(IS_SIS740)) { if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) { tempah = 0x10; - if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) { - tempah = 0x08; - } - SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah); + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04) { + if((SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) { + tempah = 0x08; + } else { + tempah = 0x18; + } + } + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x4c,tempah); + } else { + if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) { + tempah = 0x08; + } + SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah); + } } } - SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00); - SiS_DisplayOff(SiS_Pr); - pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06); - if(IS_SIS740) { - SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3); + if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) { + SiS_SetReg3(SiS_Pr->SiS_P3c6,0x00); + SiS_DisplayOff(SiS_Pr); + pushax = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x06); + if(IS_SIS740) { + SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x06,0xE3); + } } if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) || (SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) ) { - if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) { - SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 2); - SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02); - SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 2); - } + if(!(SiS_GetReg1(SiS_Pr->SiS_Part4Port,0x26) & 0x02)) { + if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) { + SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 2); + } + SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x26,0x02); + SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 2); + } } - if(!(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x40)) { - SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10); - delaylong = TRUE; + if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) { + if(!(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x31) & 0x40)) { + SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10); + delaylong = TRUE; + } } } else if(SiS_Pr->SiS_VBType & VB_NoLCD) { + if(HwDeviceExtension->jChipType == SIS_650) { if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) { SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,0x10); @@ -5657,33 +5787,39 @@ SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 0); } } + } else if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { - if(HwDeviceExtension->jChipType == SIS_650) { - if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) { - tempah = 0x10; - if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04) { - tempah = 0x18; - if((SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) { - tempah = 0x08; - } - } - SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah); - } - } - } + if(HwDeviceExtension->jChipType == SIS_650) { + if(!(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr))) { + tempah = 0x10; + if(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04) { + tempah = 0x18; + if((SiS_GetReg1(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) == 0x0c) { + tempah = 0x08; + } + } + SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x4c,tempah); + } + } + + } if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) { temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF; if(SiS_BridgeInSlave(SiS_Pr)) { tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30); - if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20; + if(!(tempah & SetCRT2ToRAMDAC)) { + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + if(!(SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x13) & 0x04)) temp |= 0x20; + } else temp |= 0x20; + } } SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp); SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */ - if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { + if((SiS_Pr->SiS_VBType & VB_SIS301B302B) || (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280)) { SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x2e,0x7f); temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2e); if(!(temp & 0x80)) { @@ -5695,12 +5831,12 @@ } if(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) { - SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x20); + SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x20); } SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20); - if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { + if((SiS_Pr->SiS_VBType & VB_SIS301B302B) || (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280)) { temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2e); if(!(temp & 0x80)) { SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80); @@ -5716,7 +5852,9 @@ } SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,tempah); - if(SiS_Pr->SiS_VBType & VB_SIS301B302B) { + if((SiS_Pr->SiS_VBType & VB_SIS301B302B) || + ((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) && + (!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))))) { SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f); } @@ -5726,60 +5864,87 @@ SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c); SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x12); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0xd0); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x6b); - if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) == 0x02) { - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x0d); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x70); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x40); - if(((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) != 0x03)) { - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x33); /* 00 */ + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x08); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x10); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x4d); + if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) != 0x02) { + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x0d); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x70); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x6b); } + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); + + } else { + + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x12); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0xd0); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x6b); + if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) == 0x02) { /* @@@@ really == ? */ + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x0d); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x70); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x40); + if(((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) != 0x03)) { + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60); + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x33); /* 00 */ + } + } + SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); + if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) != 0x03) { + SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); + } } - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); - if((SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0x0f) != 0x03) { - SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); + + if(SiS_Pr->SiS_CustomT != CUT_COMPAQ1280) { + SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2); } - - SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 2); - + SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1f,0x10); /* 1.10.8r */ - SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80); + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { - if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) { if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) || ((SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ) { - SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10); - if(delaylong) { - SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10); - } - SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension); - SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01); + SiS_DisplayOn(SiS_Pr); + SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1); + SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension); + SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 3); + SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); + if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) { + SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01); + } + } + + } else { + + SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2e,0x80); + + if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) { + if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) || + ((SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) ) { + SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10); + if(delaylong) { + SiS_SetPanelDelayLoop(SiS_Pr,ROMAddr, HwDeviceExtension, 3, 10); + } + SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension); + SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x26,0xfe,0x01); + } } - } - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax); - SiS_DisplayOn(SiS_Pr); - SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff); + SiS_SetReg1(SiS_Pr->SiS_P3c4,0x06,pushax); + SiS_DisplayOn(SiS_Pr); + SiS_SetReg3(SiS_Pr->SiS_P3c6,0xff); + + if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) { + SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f); + } - if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) { - SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f); } -#if 0 - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00); - SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x0c); - SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x20); - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x31,0x05); /* 1.10.8r: 0x0d */ - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x32,0x60); /* 1.10.8r: 0x70 */ - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x33,0x00); /* 1.10.8r: 0x40 */ - SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); - SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x30,0x40); -#endif + } if(SiS_Pr->SiS_VBType & VB_NoLCD) { + if(HwDeviceExtension->jChipType == SIS_650) { if(!(SiS_WeHaveBacklightCtrl(SiS_Pr,HwDeviceExtension, BaseAddr))) { if( (SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr)) || @@ -5789,52 +5954,53 @@ } } } + } } else { /* 315, 330 */ - if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) { - temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF; - if(SiS_BridgeInSlave(SiS_Pr)) { - tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30); - if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20; - } - SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp); + if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) { + temp = SiS_GetReg1(SiS_Pr->SiS_P3c4,0x32) & 0xDF; + if(SiS_BridgeInSlave(SiS_Pr)) { + tempah = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30); + if(!(tempah & SetCRT2ToRAMDAC)) temp |= 0x20; + } + SiS_SetReg1(SiS_Pr->SiS_P3c4,0x32,temp); - SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */ + SiS_SetRegOR(SiS_Pr->SiS_P3c4,0x1E,0x20); /* enable CRT2 */ - temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E); - if(!(temp & 0x80)) - SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80); - } + temp = SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E); + if(!(temp & 0x80)) + SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80); + } - SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20); + SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x00,0x1f,0x20); - if(SiS_Is301B(SiS_Pr,BaseAddr)) { + if(SiS_Is301B(SiS_Pr,BaseAddr)) { - temp=SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E); - if (!(temp & 0x80)) - SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80); + temp=SiS_GetReg1(SiS_Pr->SiS_Part1Port,0x2E); + if(!(temp & 0x80)) + SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x2E,0x80); + + tempah = 0xc0; + if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) { + tempah = 0x80; + if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) { + tempah = 0x40; + } + } + SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,tempah); - tempah = 0xc0; - if(SiS_IsDualEdge(SiS_Pr,HwDeviceExtension, BaseAddr)) { - tempah = 0x80; - if(!(SiS_IsVAMode(SiS_Pr,HwDeviceExtension, BaseAddr))) { - tempah = 0x40; - } - } - SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x1F,tempah); + SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f); - SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7f); + } else { - } else { - - SiS_VBLongWait(SiS_Pr); - SiS_DisplayOn(SiS_Pr); - SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7F); - SiS_VBLongWait(SiS_Pr); + SiS_VBLongWait(SiS_Pr); + SiS_DisplayOn(SiS_Pr); + SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x00,0x7F); + SiS_VBLongWait(SiS_Pr); - } + } } /* 315, 330 */ @@ -5907,28 +6073,29 @@ SiS_UnLockCRT2(SiS_Pr,HwDeviceExtension, BaseAddr); SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x02,0xBF); if(SiS_BridgeInSlave(SiS_Pr)) { - SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F); + SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x01,0x1F); } else { - SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40); + SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x01,0x1F,0x40); } if(SiS_Pr->SiS_IF_DEF_CH70xx == 1) { - if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) { - SiS_SetCH700x(SiS_Pr,0x0B0E); - } + if(!(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension))) { + SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension); + SiS_SetCH700x(SiS_Pr,0x0B0E); + } } if(SiS_CRT2IsLCD(SiS_Pr,BaseAddr,HwDeviceExtension)) { - if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) { - if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x10)) { - if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) { - SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1); - SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1); - } - SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension); - SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7); - } - } + if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x13) & 0x40)) { + if(!(SiS_GetReg1(SiS_Pr->SiS_P3c4,0x16) & 0x10)) { + if(!(SiS_CR36BIOSWord23b(SiS_Pr,HwDeviceExtension))) { + SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1); + SiS_SetPanelDelay(SiS_Pr,ROMAddr, HwDeviceExtension, 1); + } + SiS_WaitVBRetrace(SiS_Pr,HwDeviceExtension); + SiS_SetRegAND(SiS_Pr->SiS_P3c4,0x11,0xF7); + } + } } #endif /* SIS300 */ @@ -6344,6 +6511,20 @@ } else #endif return(0); +} + +BOOLEAN +SiS_IsDualLink(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr) +{ +#ifdef SIS315H + if(HwDeviceExtension->jChipType >= SIS_315H) { + if((SiS_CRT2IsLCD(SiS_Pr, BaseAddr, HwDeviceExtension)) || + (SiS_IsVAMode(SiS_Pr, HwDeviceExtension, BaseAddr))) { + if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) return(1); + } + } +#endif + return(0); } BOOLEAN @@ -6471,16 +6652,6 @@ } BOOLEAN -SiS_IsDisableCRT2(SiS_Private *SiS_Pr, USHORT BaseAddr) -{ - USHORT flag; - - flag = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x30); - if(flag & 0x20) return(0); - else return(1); -} - -BOOLEAN SiS_BridgeIsOn(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension) { USHORT flag; @@ -6575,6 +6746,14 @@ } } +#ifdef SIS315H + if(HwDeviceExtension->jChipType >= SIS_315H) { + if(SiS_Pr->SiS_IF_DEF_LVDS == 0) { + SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x39,~0x04); + } + } +#endif + if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) return; if(!(SiS_Pr->SiS_VBInfo & (SetSimuScanMode | SwitchToCRT2))) return; @@ -6620,8 +6799,12 @@ SiS_Pr->SiS_LCDResInfo = SiS_Pr->SiS_Panel1024x768; } - if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) { - SiS_Pr->SiS_LCDResInfo = Panel_Barco1366; + if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { + if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) { + SiS_Pr->SiS_LCDResInfo = Panel_Barco1366; + } else if(SiS_Pr->SiS_CustomT == CUT_PANEL848) { + SiS_Pr->SiS_LCDResInfo = Panel_848x480; + } } switch(SiS_Pr->SiS_LCDResInfo) { @@ -6643,6 +6826,7 @@ SiS_Pr->PanelYRes = SiS_Pr->CP_MaxY; break; case Panel_Barco1366: SiS_Pr->PanelXRes = 1360; SiS_Pr->PanelYRes = 1024; break; + case Panel_848x480: SiS_Pr->PanelXRes = 848; SiS_Pr->PanelYRes = 480; break; default: SiS_Pr->PanelXRes = 1024; SiS_Pr->PanelYRes = 768; break; } @@ -6655,7 +6839,13 @@ } #endif SiS_Pr->SiS_LCDInfo = temp; - + + if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { + if(SiS_Pr->SiS_CustomT == CUT_PANEL848) { + SiS_Pr->SiS_LCDInfo = 0x80 | 0x40 | 0x20; /* neg sync, RGB24 */ + } + } + if(!(SiS_Pr->UsePanelScaler)) SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD; else if(SiS_Pr->UsePanelScaler == 1) SiS_Pr->SiS_LCDInfo |= DontExpandLCD; @@ -6668,11 +6858,6 @@ if(ModeNo == 0x7c || ModeNo == 0x7d || ModeNo == 0x7e) { /* Bridge does not scale to 1280x960 */ SiS_Pr->SiS_LCDInfo |= DontExpandLCD; - } else if(ModeNo == 0x2f || ModeNo == 0x5d || ModeNo == 0x5e) { - if(!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { - /* Bridge does not scale to 640x400 */ - SiS_Pr->SiS_LCDInfo |= DontExpandLCD; - } } } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x768) { /* TEMP - no idea about the timing and zoom factors */ @@ -6686,6 +6871,11 @@ /* TEMP - no idea about the timing and zoom factors */ SiS_Pr->SiS_LCDInfo |= DontExpandLCD; } + if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { + SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD; + } + } } } @@ -6767,20 +6957,22 @@ } #ifdef SIS315H - /* 650/30xLV 1.10.6s */ if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_Pr->SiS_IF_DEF_LVDS == 0) { - SiS_SetRegAND(SiS_Pr->SiS_P3d4,0x39,~0x04); - if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) { - /* Enable 302B/302LV dual link mode. - * (302B is a theory - not in any BIOS) - */ - if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) || - (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) || - (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) { + if(SiS_Pr->SiS_VBType & (VB_SIS302B | VB_SIS302LV)) { + /* Enable 302B/302LV dual link mode. + * (302B is a theory - not in any BIOS) + */ + if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { + /* (Sets this in SenseLCD; new paneltypes) */ SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04); } - } + } + if((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) || + (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) || + (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) { + SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x39,0x04); + } } } #endif @@ -7124,7 +7316,7 @@ TimingPoint = SiS_Pr->SiS_PALTiming; PhasePoint = SiS_Pr->SiS_PALPhase; - if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) && + if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) || (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) { PhasePoint = SiS_Pr->SiS_PALPhase2; @@ -7136,7 +7328,7 @@ TimingPoint = SiS_Pr->SiS_NTSCTiming; PhasePoint = SiS_Pr->SiS_NTSCPhase; - if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) && + if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) || (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) { PhasePoint = SiS_Pr->SiS_NTSCPhase2; @@ -7161,7 +7353,7 @@ temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,temp); if(temp1 & EnablePALM) { /* 0x40 */ PhasePoint = SiS_Pr->SiS_PALMPhase; - if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) && + if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) || (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) { PhasePoint = SiS_Pr->SiS_PALMPhase2; @@ -7169,7 +7361,7 @@ } if(temp1 & EnablePALN) { /* 0x80 */ PhasePoint = SiS_Pr->SiS_PALNPhase; - if( (SiS_Pr->SiS_VBType & VB_SIS301B302B) && + if( (SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) || (SiS_Pr->SiS_SetFlag & TVSimuMode) ) ) { PhasePoint = SiS_Pr->SiS_PALNPhase2; @@ -7266,10 +7458,8 @@ tempcx = SiS_Pr->SiS_HT; /* 650/30xLV 1.10.6s */ - if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) { - tempcx >>= 1; - } + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { + tempcx >>= 1; } tempcx--; @@ -7444,7 +7634,7 @@ temp |= 0x18; SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x46,temp); temp = tempbx & 0x00FF; - SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x47,temp); /* tv gatingno */ + SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x47,temp); if(HwDeviceExtension->jChipType >= SIS_315H) { if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { tempax = 0; @@ -7586,10 +7776,7 @@ /* From here: Part2 LCD setup */ tempbx = SiS_Pr->SiS_HDE; - if(HwDeviceExtension->jChipType >= SIS_315H) { - /* 650/30xLV 1.10.6s */ - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1; - } + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempbx >>= 1; tempbx--; /* RHACTE=HDE-1 */ temp = tempbx & 0x00FF; SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x2C,temp); @@ -7649,17 +7836,23 @@ /* 630/301 does not do all this */ if((SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) && (SiS_Pr->SiS_VBInfo & SetCRT2ToLCD)) { if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { - /* 650/30xLV 1.10.6s */ - temp |= (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37) >> 6); - temp |= 0x08; /* From 1.10.7w */ - if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) temp |= 0x04; /* From 1.10.7w */ - } else { - tempbx = (tempbx & 0xFF00) | (SiS_Pr->SiS_LCDInfo & 0x0FF); - if(tempbx & LCDSync) { - tempbx &= 0xFFE0; - tempbx = (tempbx & 0xFF00) | ((tempbx & 0x00FF) >> 6); - temp |= (tempbx & 0x00FF); - } + if((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) && + (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024)) { +#ifdef SIS315H + if(SiS_Pr->SiS_LCDInfo & LCDSync) { + temp |= (SiS_Pr->SiS_LCDInfo >> 6); + } +#endif + } else { + /* 650/30xLV 1.10.6s */ + temp |= (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x37) >> 6); + temp |= 0x08; /* From 1.10.7w */ + if(!(SiS_Pr->SiS_LCDInfo & LCDRGB18Bit)) temp |= 0x04; /* From 1.10.7w */ + } + } else { + if(SiS_Pr->SiS_LCDInfo & LCDSync) { + temp |= (SiS_Pr->SiS_LCDInfo >> 6); + } } } SiS_SetReg1(SiS_Pr->SiS_Part2Port,0x1A,temp); @@ -7670,12 +7863,12 @@ SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x17,0xFB); SiS_SetRegAND(SiS_Pr->SiS_Part2Port,0x18,0xDF); - /* much data invalid/missing in tables, use old calculation in such case */ if((HwDeviceExtension->jChipType >= SIS_315H) && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV) && ((SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) || (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) || - (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050)) ) { + (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1400x1050) || + (SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1600x1200)) ) { #ifdef SIS315H /* ------------- 315/330 series ------------ */ @@ -7685,7 +7878,7 @@ */ SiS_GetCRT2Part2Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex, - &CRT2Index,&resindex); + &CRT2Index,&resindex,HwDeviceExtension,BaseAddr); switch(CRT2Index) { case Panel_1024x768 : CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_1; break; /* "Normal" */ @@ -7700,6 +7893,12 @@ case Panel_1280x1024 + 32: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1280x1024_3; break; case Panel_1400x1050 + 32: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1400x1050_3; break; case Panel_1600x1200 + 32: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1600x1200_3; break; + case 100: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Compaq1280x1024_1; break; /* Custom */ + case 101: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Compaq1280x1024_2; break; + case 102: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Compaq1280x1024_3; break; + case 103: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Clevo1024x768_1; break; /* Custom */ + case 104: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Clevo1024x768_2; break; + case 105: CRT2Part2Ptr = (SiS_Part2PortTblStruct *)SiS310_CRT2Part2_Clevo1024x768_3; break; default: CRT2Part2Ptr = SiS_Pr->SiS_CRT2Part2_1024x768_3; break; } @@ -8164,7 +8363,7 @@ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { /* From 650/301LV (any, incl. 1.10.6s, 1.10.7w) */ /* This is a duplicate; done at the end, too */ - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) { + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c); } SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00); @@ -8228,9 +8427,8 @@ temp = 0; if(SiS_Pr->SiS_VGAHDE == 1024) temp = 0x20; } - if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) temp = 0; - } + + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) temp = 0; if(SiS_Pr->SiS_VBType & VB_SIS301) { if(SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024) @@ -8281,7 +8479,7 @@ if(modeflag & HalfDCLK) tempax >>= 1; if((SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) || (SiS_Pr->SiS_HiVision & 0x03)) { if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempax >>= 1; + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempax >>= 1; else if(tempax > 800) tempax -= 800; } else { if(tempax > 800) tempax -= 800; @@ -8336,9 +8534,7 @@ SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x1F,0xC0,temp); tempbx = SiS_Pr->SiS_HT; - if(HwDeviceExtension->jChipType >= SIS_315H) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) tempbx >>= 1; - } + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) tempbx >>= 1; tempbx >>= 1; tempbx -= 2; temp = ((tempbx & 0x0700) >> 8) << 3; @@ -8349,6 +8545,7 @@ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x24,0x0e); + /* LCD-too-dark-error-source, see FinalizeLCD() */ } } @@ -8357,7 +8554,7 @@ /* 315, 330, 650+301B BIOS don't do this at all */ /* This is a duplicate; done for LCDA as well (see above) */ if(SiS_Pr->SiS_VBType & VB_SIS301LV302LV) { - if(SiS_GetReg1(SiS_Pr->SiS_P3d4,0x39) & 0x04) { + if(SiS_IsDualLink(SiS_Pr, HwDeviceExtension, BaseAddr)) { SiS_SetRegOR(SiS_Pr->SiS_Part4Port,0x27,0x2c); } SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00); @@ -8606,7 +8803,9 @@ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1; if(SiS_Pr->SiS_VBInfo & SetPALTV) { tempbx += 2; - if(SiS_Pr->SiS_CHSOverScan) tempbx = 8; + if(SiS_Pr->SiS_ModeType > ModeVGA) { + if(SiS_Pr->SiS_CHSOverScan) tempbx = 8; + } if(SiS_Pr->SiS_CHPALM) { tempbx = 4; if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx += 1; @@ -8648,10 +8847,20 @@ else VCLKIndex = LVDSXlatVCLK3[VCLKIndex]; if(SiS_Pr->SiS_CustomT == CUT_BARCO1366) { - /* Special Timing: Barco iQ Pro R300/400 */ + /* Special Timing: Barco iQ Pro R300/400/... */ VCLKIndex = 0x44; } + if(SiS_Pr->SiS_CustomT == CUT_PANEL848) { + if(HwDeviceExtension->jChipType < SIS_315H) { + VCLKIndex = VCLK34_300; + /* if(resinfo == SIS_RI_1360x768) VCLKIndex = ?; */ + } else { + VCLKIndex = VCLK34_315; + /* if(resinfo == SIS_RI_1360x768) VCLKIndex = ?; */ + } + } + } else { VCLKIndex = (UCHAR)SiS_GetReg2((USHORT)(SiS_Pr->SiS_P3ca+0x02)); @@ -8730,7 +8939,8 @@ } if((SiS_Pr->SiS_CustomT == CUT_BARCO1366) || - (SiS_Pr->SiS_CustomT == CUT_BARCO1024)) + (SiS_Pr->SiS_CustomT == CUT_BARCO1024) || + (SiS_Pr->SiS_CustomT == CUT_PANEL848)) return; temp = SiS_GetLVDSCRT1Ptr(SiS_Pr,ROMAddr,ModeNo,ModeIdIndex,RefreshRateTableIndex, @@ -8868,7 +9078,9 @@ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx++; if(SiS_Pr->SiS_VBInfo & SetPALTV) { tempbx += 2; - if(SiS_Pr->SiS_CHSOverScan) tempbx = 99; + if(SiS_Pr->SiS_ModeType > ModeVGA) { + if(SiS_Pr->SiS_CHSOverScan) tempbx = 99; + } if(SiS_Pr->SiS_CHPALM) { tempbx = 18; /* PALM uses NTSC data */ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) tempbx++; @@ -9027,7 +9239,9 @@ if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) TVType += 1; if(SiS_Pr->SiS_VBInfo & SetPALTV) { TVType += 2; - if(SiS_Pr->SiS_CHSOverScan) TVType = 8; + if(SiS_Pr->SiS_ModeType > ModeVGA) { + if(SiS_Pr->SiS_CHSOverScan) TVType = 8; + } if(SiS_Pr->SiS_CHPALM) { TVType = 4; if(SiS_Pr->SiS_VBInfo & SetCHTVOverScan) TVType += 1; @@ -9125,37 +9339,37 @@ if(resindex == 0x04) { /* 640x480 overscan: Mode 16 */ SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF); /* loop filter off */ SiS_SetCH70xxANDOR(SiS_Pr,0x0121,0xFE); /* ACIV on, no need to set FSCI */ - } else { - if(resindex == 0x05) { /* 800x600 overscan: Mode 23 */ - SiS_SetCH70xxANDOR(SiS_Pr,0x0118,0xF0); /* 0x18-0x1f: FSCI 469,762,048 */ - SiS_SetCH70xxANDOR(SiS_Pr,0x0C19,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x001A,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x001B,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x001C,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x001D,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x001E,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x001F,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x0120,0xEF); /* Loop filter on for mode 23 */ - SiS_SetCH70xxANDOR(SiS_Pr,0x0021,0xFE); /* ACIV off, need to set FSCI */ - } + } else if(resindex == 0x05) { /* 800x600 overscan: Mode 23 */ + SiS_SetCH70xxANDOR(SiS_Pr,0x0118,0xF0); /* 0x18-0x1f: FSCI 469,762,048 */ + SiS_SetCH70xxANDOR(SiS_Pr,0x0C19,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x001A,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x001B,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x001C,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x001D,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x001E,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x001F,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x0120,0xEF); /* Loop filter on for mode 23 */ + SiS_SetCH70xxANDOR(SiS_Pr,0x0021,0xFE); /* ACIV off, need to set FSCI */ } } else { if(resindex == 0x04) { /* ----- 640x480 underscan; Mode 17 */ SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF); /* loop filter off */ SiS_SetCH70xxANDOR(SiS_Pr,0x0121,0xFE); - } else { - if(resindex == 0x05) { /* ----- 800x600 underscan: Mode 24 */ - SiS_SetCH70xxANDOR(SiS_Pr,0x0118,0xF0); /* (FSCI was 0x1f1c71c7 - this is for mode 22) */ - SiS_SetCH70xxANDOR(SiS_Pr,0x0919,0xF0); /* FSCI for mode 24 is 428,554,851 */ - SiS_SetCH70xxANDOR(SiS_Pr,0x081A,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x0b1B,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x031C,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x0a1D,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x061E,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x031F,0xF0); - SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF); /* loop filter off for mode 24 */ - SiS_SetCH70xxANDOR(SiS_Pr,0x0021,0xFE); /* ACIV off, need to set FSCI */ - } + } else if(resindex == 0x05) { /* ----- 800x600 underscan: Mode 24 */ +#if 0 + SiS_SetCH70xxANDOR(SiS_Pr,0x0118,0xF0); /* (FSCI was 0x1f1c71c7 - this is for mode 22) */ + SiS_SetCH70xxANDOR(SiS_Pr,0x0919,0xF0); /* FSCI for mode 24 is 428,554,851 */ + SiS_SetCH70xxANDOR(SiS_Pr,0x081A,0xF0); /* 198b3a63 */ + SiS_SetCH70xxANDOR(SiS_Pr,0x0b1B,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x041C,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x011D,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x061E,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x051F,0xF0); + SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF); /* loop filter off for mode 24 */ + SiS_SetCH70xxANDOR(SiS_Pr,0x0021,0xFE); /* ACIV off, need to set FSCI */ +#endif /* All alternatives wrong (datasheet wrong?), don't use FSCI */ + SiS_SetCH70xxANDOR(SiS_Pr,0x0020,0xEF); /* loop filter off */ + SiS_SetCH70xxANDOR(SiS_Pr,0x0121,0xFE); } } } else { /* ---- PAL ---- */ @@ -9951,7 +10165,7 @@ USHORT temp = 0, myadaptnum = adaptnum; if(adaptnum != 0) { - if(!(VBFlags & (VB_301|VB_301B|VB_302B))) return 0xFFFF; + if(!(VBFlags & (VB_301|VB_301B|VB_301C|VB_302B))) return 0xFFFF; if((VBFlags & VB_30xBDH) && (adaptnum == 1)) return 0xFFFF; } @@ -10241,7 +10455,7 @@ SiS_Pr->CP_HaveCustomData = FALSE; SiS_Pr->CP_MaxX = SiS_Pr->CP_MaxY = SiS_Pr->CP_MaxClock = 0; - if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_302B))) return 0; + if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B))) return 0; if(pSiS->VBFlags & VB_30xBDH) return 0; if(SiS_InitDDCRegs(SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, 1, 0, FALSE) == 0xFFFF) return 0; @@ -10476,7 +10690,8 @@ (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i]) || (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i]) || (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i]) || - (SiS_Pr->CP_Clock[i] > 108000) || + ( ((pSiS->VBFlags & VB_301C) && (SiS_Pr->CP_Clock[i] > 162000)) || + ((!(pSiS->VBFlags & VB_301C)) && (SiS_Pr->CP_Clock[i] > 108000)) ) || (buffer[base+17] & 0x80)) { SiS_Pr->CP_DataValid[i] = FALSE; @@ -10696,7 +10911,8 @@ (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VSyncEnd[i]) || (SiS_Pr->CP_VSyncStart[i] > SiS_Pr->CP_VTotal[i]) || (SiS_Pr->CP_VSyncEnd[i] > SiS_Pr->CP_VTotal[i]) || - (SiS_Pr->CP_Clock[i] > 108000) || + ( ((pSiS->VBFlags & VB_301C) && (SiS_Pr->CP_Clock[i] > 162000)) || + ((!(pSiS->VBFlags & VB_301C)) && (SiS_Pr->CP_Clock[i] > 108000)) ) || (buffer[index + 17] & 0x80)) { SiS_Pr->CP_DataValid[i] = FALSE; @@ -10782,7 +10998,7 @@ int retry; unsigned char buffer[256]; - if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_302B))) return 0; + if(!(pSiS->VBFlags & (VB_301|VB_301B|VB_301C|VB_302B))) return 0; /* if(pSiS->VBFlags & VB_30xBDH) return 0; */ if(SiS_InitDDCRegs(SiS_Pr, pSiS->VBFlags, pSiS->VGAEngine, 2, 0, FALSE) == 0xFFFF) return 0; @@ -10891,12 +11107,10 @@ void SiS_SetCH70xxANDOR(SiS_Private *SiS_Pr, USHORT tempax,USHORT tempbh) { - USHORT tempal,tempah,tempbl; + USHORT tempbl; - tempal = tempax & 0x00FF; - tempah =(tempax >> 8) & 0x00FF; - tempbl = SiS_GetCH70xx(SiS_Pr,tempal); - tempbl = (((tempbl & tempbh) | tempah) << 8 | tempal); + tempbl = SiS_GetCH70xx(SiS_Pr,(tempax & 0x00FF)); + tempbl = (((tempbl & tempbh) << 8) | tempax); SiS_SetCH70xx(SiS_Pr,tempbl); } @@ -11172,7 +11386,8 @@ SetDelayComp(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension,USHORT BaseAddr, UCHAR *ROMAddr, USHORT ModeNo) { - USHORT delay,index,myindex,temp,romptr=0; + USHORT delay=0,index,myindex,temp,romptr=0; + BOOLEAN dochiptest = TRUE; if(SiS_Pr->SiS_VBInfo & SetCRT2ToRAMDAC) { /* VGA */ @@ -11196,68 +11411,99 @@ if(SiS_Pr->SiS_IF_DEF_LVDS == 1) delay = 0x00; } - + } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCD) { /* LCD */ + BOOLEAN gotitfrompci = FALSE; + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return; - - index = GetLCDPtrIndexBIOS(SiS_Pr, HwDeviceExtension, BaseAddr); - myindex = GetLCDPtrIndex(SiS_Pr); - - if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { /* 650+30xLV */ - if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) { - if((ROMAddr) && SiS_Pr->SiS_UseROM) { -#if 0 /* Always use the second pointer on 650; some BIOSes */ - /* still carry old 301 data at the first location */ - romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8); - if(SiS_Pr->SiS_VBType & VB_SIS302LV) -#endif - romptr = ROMAddr[0x122] | (ROMAddr[0x123] << 8); - if(!romptr) return; - delay = ROMAddr[(romptr + index)]; - } else { - delay = SiS310_LCDDelayCompensation_650301B[myindex]; -#if 0 + + if(HwDeviceExtension->pdc) return; + + /* This is a piece of typical SiS crap: They code the OEM LCD + * delay into the code, at none defined place in the BIOS. + * We now have to start doing a PCI subsystem check here. + */ + + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) { + gotitfrompci = TRUE; + dochiptest = FALSE; + delay = 0x03; + } + } + + if((SiS_Pr->SiS_CustomT == CUT_CLEVO1024) || + (SiS_Pr->SiS_CustomT == CUT_CLEVO10242)) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { + gotitfrompci = TRUE; + dochiptest = FALSE; + delay = 0x33; + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2D,delay); + delay &= 0x0f; + } + } + + if(!gotitfrompci) { + + index = GetLCDPtrIndexBIOS(SiS_Pr, HwDeviceExtension, BaseAddr); + myindex = GetLCDPtrIndex(SiS_Pr); + + if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { /* 650+30xLV */ + if(SiS_IsNotM650or651(SiS_Pr,HwDeviceExtension, BaseAddr)) { + if((ROMAddr) && SiS_Pr->SiS_UseROM) { +#if 0 /* Always use the second pointer on 650; some BIOSes */ + /* still carry old 301 data at the first location */ + romptr = ROMAddr[0x120] | (ROMAddr[0x121] << 8); + if(SiS_Pr->SiS_VBType & VB_SIS302LV) +#endif + romptr = ROMAddr[0x122] | (ROMAddr[0x123] << 8); + if(!romptr) return; + delay = ROMAddr[(romptr + index)]; + } else { + delay = SiS310_LCDDelayCompensation_650301B[myindex]; +#if 0 + if(SiS_Pr->SiS_VBType & VB_SIS302LV) + delay = SiS310_LCDDelayCompensation_650301B[myindex]; +#endif + } + } else { + delay = SiS310_LCDDelayCompensation_651301LV[myindex]; if(SiS_Pr->SiS_VBType & VB_SIS302LV) - delay = SiS310_LCDDelayCompensation_650301B[myindex]; -#endif - } - } else { - delay = SiS310_LCDDelayCompensation_651301LV[myindex]; - if(SiS_Pr->SiS_VBType & VB_SIS302LV) - delay = SiS310_LCDDelayCompensation_651302LV[myindex]; - } - } else { - if((ROMAddr) && SiS_Pr->SiS_UseROM && /* 315, 330, 740, 650+301B */ - (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)) { - romptr = GetLCDromptr(SiS_Pr, HwDeviceExtension, ROMAddr); - if(!romptr) return; - delay = ROMAddr[(romptr + index)]; + delay = SiS310_LCDDelayCompensation_651302LV[myindex]; + } } else { - delay = SiS310_LCDDelayCompensation_301[myindex]; - if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { -#if 0 /* This data is (like the one in the BIOS) wrong. */ - if(IS_SIS550650740660) { - delay = SiS310_LCDDelayCompensation_650301B[myindex]; - } else { -#endif - delay = SiS310_LCDDelayCompensation_3xx301B[myindex]; -#if 0 + if((ROMAddr) && SiS_Pr->SiS_UseROM && /* 315, 330, 740, 650+301B */ + (SiS_Pr->SiS_LCDResInfo != SiS_Pr->SiS_Panel1280x1024)) { + romptr = GetLCDromptr(SiS_Pr, HwDeviceExtension, ROMAddr); + if(!romptr) return; + delay = ROMAddr[(romptr + index)]; + } else { + delay = SiS310_LCDDelayCompensation_301[myindex]; + if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { +#if 0 /* This data is (like the one in the BIOS) wrong. */ + if(IS_SIS550650740660) { + delay = SiS310_LCDDelayCompensation_650301B[myindex]; + } else { +#endif + delay = SiS310_LCDDelayCompensation_3xx301B[myindex]; +#if 0 + } +#endif } -#endif - } - if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { - if(IS_SIS650) { - delay = SiS310_LCDDelayCompensation_LVDS650[myindex]; - } else { - delay = SiS310_LCDDelayCompensation_LVDS740[myindex]; + if(SiS_Pr->SiS_IF_DEF_LVDS == 1) { + if(IS_SIS650) { + delay = SiS310_LCDDelayCompensation_LVDS650[myindex]; + } else { + delay = SiS310_LCDDelayCompensation_LVDS740[myindex]; + } } - } + } } } } else { /* TV */ - + index = GetTVPtrIndex(SiS_Pr); if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { @@ -11272,16 +11518,28 @@ if(!romptr) return; delay = ROMAddr[romptr + index]; } else { - delay = SiS310_TVDelayCompensation_301B[index]; -#if 0 + delay = SiS310_TVDelayCompensation_301B[index]; +#if 0 if(SiS_Pr->SiS_VBType & VB_SIS302LV) - delay = SiS310_TVDelayCompensation_301B[index]; + delay = SiS310_TVDelayCompensation_301B[index]; #endif } } else { - delay = SiS310_TVDelayCompensation_651301LV[index]; - if(SiS_Pr->SiS_VBType & VB_SIS302LV) - delay = SiS310_TVDelayCompensation_651302LV[index]; + switch(SiS_Pr->SiS_CustomT) { + case CUT_COMPAQ1280: + delay = 0x02; + dochiptest = FALSE; + break; + case CUT_CLEVO1024: + case CUT_CLEVO10242: + delay = 0x03; + dochiptest = FALSE; + break; + default: + delay = SiS310_TVDelayCompensation_651301LV[index]; + if(SiS_Pr->SiS_VBType & VB_SIS302LV) + delay = SiS310_TVDelayCompensation_651302LV[index]; + } } } else { if((ROMAddr) && SiS_Pr->SiS_UseROM) { @@ -11291,7 +11549,7 @@ } else { delay = SiS310_TVDelayCompensation_301[index]; if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { - if(IS_SIS740) + if(IS_SIS740) delay = SiS310_TVDelayCompensation_740301B[index]; else delay = SiS310_TVDelayCompensation_301B[index]; @@ -11315,15 +11573,15 @@ } } } else { - if(IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { + if(dochiptest && IS_SIS650 && (SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) { temp = (SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) & 0xf0) >> 4; - if(temp == 8) { /* 1400x1050 BIOS */ + if(temp == 8) { /* 1400x1050 BIOS (ECS) */ delay &= 0x0f; delay |= 0xb0; } else if(temp == 6) { delay &= 0x0f; delay |= 0xc0; - } else if(temp > 7) { /* 1280x1024 BIOS */ + } else if(temp > 7) { /* 1280x1024 BIOS (which one?) */ delay = 0x35; } SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x2D,delay); @@ -11451,6 +11709,7 @@ } } } + /* PALN : Is this data correct? */ if(temp == EnablePALN) { if(SiS_Pr->SiS_VBType & VB_SIS301BLV302BLV) { for(i=0x35, j=0; i<=0x38; i++, j++) { @@ -11478,13 +11737,13 @@ if(!(SiS_Pr->SiS_VBInfo & SetCRT2ToTV)) return; temp1 = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x38); /* if PALM/N not set */ - temp1 &= (EnablePALM | EnablePALN); + temp1 &= (EnablePALM | EnablePALN); if(temp1) return; - if (ModeNo<=0x13) { - resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo; + if(ModeNo<=0x13) { + resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo; } else { - resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO; + resinfo = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_RESINFO; } temp = GetTVPtrIndex(SiS_Pr); @@ -11583,9 +11842,17 @@ if(!(SiS_Pr->SiS_VBType & VB_SIS301LV302LV)) return; + if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { + if(SiS_Pr->LVDSHL != -1) { + SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,SiS_Pr->LVDSHL); + } + } + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_PanelCustom) return; if(SiS_Pr->UseCustomMode) return; + if(SiS_Pr->SiS_CustomT == CUT_COMPAQ12802) return; + if(ModeNo <= 0x13) { resinfo = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ResInfo; modeflag = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_ModeFlag; @@ -11594,8 +11861,43 @@ modeflag = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].Ext_ModeFlag; } - if((SiS_GetReg1(SiS_Pr->SiS_P3d4, 0x5f) & 0xf0)) { - SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x03); + if(IS_SIS650) { + if(!(SiS_GetReg1(SiS_Pr->SiS_P3d4, 0x5f) & 0xf0)) { + if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { + SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x02); + } else { + SiS_SetRegOR(SiS_Pr->SiS_Part1Port,0x1e,0x03); + } + } + } + + if(SiS_Pr->SiS_CustomT == CUT_CLEVO1024) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { /* Maybe all panels? */ + if(SiS_Pr->LVDSHL == -1) { + SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01); + } + return; + } + } + + if(SiS_Pr->SiS_CustomT == CUT_CLEVO10242) { + if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { + if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1024x768) { /* Maybe all panels? */ + if(SiS_Pr->LVDSHL == -1) { + SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01); + } + if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) { + tempch = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36) >> 4; + if(tempch == 3) { + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x18,0x02); + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1b,0x25); + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1c,0x00); + SiS_SetReg1(SiS_Pr->SiS_Part1Port,0x1d,0x1b); + } + } + return; + } + } } if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { @@ -11603,8 +11905,11 @@ SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x2a,0x00); SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x30,0x00); SiS_SetReg1(SiS_Pr->SiS_Part4Port,0x34,0x10); - } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) { /* For all panels? */ - SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01); + } else if(SiS_Pr->SiS_LCDResInfo == SiS_Pr->SiS_Panel1280x1024) { /* Maybe all panels? */ + if(SiS_Pr->LVDSHL == -1) { + /* Maybe ACER only? */ + SiS_SetRegANDOR(SiS_Pr->SiS_Part4Port,0x24,0xfc,0x01); + } } tempch = SiS_GetReg1(SiS_Pr->SiS_P3d4,0x36); tempch &= 0xf0; @@ -12168,4 +12473,3 @@ } #endif - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/init301.h linux-2.4.23-pre8/drivers/video/sis/init301.h --- linux-2.4.22/drivers/video/sis/init301.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/init301.h 2003-10-22 22:48:55.000000000 +0000 @@ -28,6 +28,9 @@ * PERFORMANCE OF THIS SOFTWARE. * * Author: Thomas Winischhofer + * + * Based on code by Silicon Intergrated Systems + * */ #ifndef _INIT301_ @@ -121,9 +124,9 @@ BOOLEAN SiS_Is301B(SiS_Private *SiS_Pr, USHORT BaseAddr); BOOLEAN SiS_IsNotM650or651(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); -BOOLEAN SiS_IsDisableCRT2(SiS_Private *SiS_Pr, USHORT BaseAddr); BOOLEAN SiS_IsVAMode(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); BOOLEAN SiS_IsDualEdge(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); +BOOLEAN SiS_IsDualLink(SiS_Private *SiS_Pr, PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); BOOLEAN SiS_CRT2IsLCD(SiS_Private *SiS_Pr, USHORT BaseAddr, PSIS_HW_DEVICE_INFO HwDeviceExtension); void SiS_SetDefCRT2ExtRegs(SiS_Private *SiS_Pr, USHORT BaseAddr); USHORT SiS_GetRatePtrCRT2(SiS_Private *SiS_Pr, UCHAR *ROMAddr, USHORT ModeNo,USHORT ModeIdIndex, @@ -140,7 +143,8 @@ USHORT RefreshRateTableIndex,USHORT *CRT2Index,USHORT *ResIndex); #endif void SiS_GetCRT2Part2Ptr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex,USHORT *CRT2Index, USHORT *ResIndex); + USHORT RefreshRateTableIndex,USHORT *CRT2Index, USHORT *ResIndex, + PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); void SiS_GetCRT2Data301(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension); USHORT SiS_GetResInfo(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex); @@ -155,7 +159,8 @@ PSIS_HW_DEVICE_INFO ); void SiS_SetHiVision(SiS_Private *SiS_Pr, USHORT BaseAddr,PSIS_HW_DEVICE_INFO HwDeviceExtension); void SiS_GetLVDSDesData(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension); + USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension, + USHORT BaseAddr); void SiS_SetCRT2Offset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,PSIS_HW_DEVICE_INFO HwDeviceExtension); USHORT SiS_GetOffset(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, @@ -206,9 +211,10 @@ void SiS_GetLVDSDesPtr(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex, PSIS_HW_DEVICE_INFO HwDeviceExtension); -#ifdef SIS315H +#ifdef SIS315H void SiS_GetLVDSDesPtrA(SiS_Private *SiS_Pr, UCHAR *ROMAddr,USHORT ModeNo,USHORT ModeIdIndex, - USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex); + USHORT RefreshRateTableIndex,USHORT *PanelIndex,USHORT *ResIndex, + PSIS_HW_DEVICE_INFO HwDeviceExtension, USHORT BaseAddr); #endif void SiS_SetTPData(SiS_Private *SiS_Pr); void SiS_SetChrontelGPIO(SiS_Private *SiS_Pr, USHORT myvbinfo); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/initdef.h linux-2.4.23-pre8/drivers/video/sis/initdef.h --- linux-2.4.22/drivers/video/sis/initdef.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/initdef.h 2003-10-22 22:49:05.000000000 +0000 @@ -4,6 +4,11 @@ * * Copyright 2002, 2003 by Thomas Winischhofer, Vienna, Austria * + * If distributed as part of the linux kernel, the contents of this file + * is entirely covered by the GPL. + * + * Otherwise, the following terms apply: + * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that @@ -23,6 +28,9 @@ * PERFORMANCE OF THIS SOFTWARE. * * Author: Thomas Winischhofer + * + * Based on code by Silicon Intergrated Systems + * */ #ifndef _INITDEF_ @@ -39,25 +47,30 @@ #define VB_SIS302B 0x0004 #define VB_SIS301LV 0x0008 #define VB_SIS302LV 0x0010 +#define VB_SIS301C 0x0020 #define VB_SIS30xLV VB_SIS301LV #define VB_SIS30xNEW VB_SIS302LV #define VB_NoLCD 0x8000 -#define VB_SIS301BLV302BLV (VB_SIS301B|VB_SIS302B|VB_SIS301LV|VB_SIS302LV) -#define VB_SIS301B302B (VB_SIS301B|VB_SIS302B) +#define VB_SIS301BLV302BLV (VB_SIS301B|VB_SIS301C|VB_SIS302B|VB_SIS301LV|VB_SIS302LV) +#define VB_SIS301B302B (VB_SIS301B|VB_SIS301C|VB_SIS302B) #define VB_SIS301LV302LV (VB_SIS301LV|VB_SIS302LV) -#define IS_SIS650 (HwDeviceExtension->jChipType == SIS_650) -#define IS_SIS740 (HwDeviceExtension->jChipType == SIS_740) #define IS_SIS330 (HwDeviceExtension->jChipType == SIS_330) #define IS_SIS550 (HwDeviceExtension->jChipType == SIS_550) +#define IS_SIS650 (HwDeviceExtension->jChipType == SIS_650) +#define IS_SIS740 (HwDeviceExtension->jChipType == SIS_740) #define IS_SIS651 (SiS_Pr->SiS_SysFlags & (SF_Is651 | SF_Is652)) #define IS_SISM650 (SiS_Pr->SiS_SysFlags & (SF_IsM650 | SF_IsM652 | SF_IsM653)) +#define IS_SIS661 (SiS_Pr->SiS_SysFlags & (SF_Is661 | SF_IsM651)) +#define IS_SIS741 (SiS_Pr->SiS_SysFlags & SF_IsM741) #define IS_SIS65x (IS_SIS651 || IS_SISM650) +#define IS_SIS661741 (SiS_Pr->SiS_SysFlags & (SF_Is661 | SF_IsM661 | SF_Is741)) #define IS_SIS660 (HwDeviceExtension->jChipType == SIS_660) +#define IS_SIS760 (HwDeviceExtension->jChipType == SIS_760) #define IS_SIS650660 (IS_SIS650 || IS_SIS660) #define IS_SIS650740 ((HwDeviceExtension->jChipType >= SIS_650) && (HwDeviceExtension->jChipType < SIS_330)) -#define IS_SIS650740660 (IS_SIS650 || IS_SIS660 || IS_SIS740) -#define IS_SIS550650740660 (IS_SIS550 || IS_SIS650 || IS_SIS660 || IS_SIS740) +#define IS_SIS650740660 (IS_SIS650 || IS_SIS660 || IS_SIS740 || IS_SIS760) +#define IS_SIS550650740660 (IS_SIS550 || IS_SIS650 || IS_SIS660 || IS_SIS740 || IS_SIS760) #define CRT1Len 17 #define LVDSCRT1Len 15 @@ -151,6 +164,9 @@ #define SF_Is652 0x0004 #define SF_IsM652 0x0008 #define SF_IsM653 0x0010 +#define SF_Is661 0x0020 +#define SF_IsM661 0x0040 +#define SF_Is741 0x0080 #define SF_Is660 0x8000 #define PanelRGB18Bit 0x0100 @@ -296,6 +312,7 @@ #define Panel_320x480 0x0e /* fstn - TW: This is fake, can be any */ #define Panel_Custom 0x0f #define Panel_Barco1366 0x10 +#define Panel_848x480 0x11 /* Index in ModeResInfo table */ #define SIS_RI_320x200 0 @@ -367,12 +384,14 @@ #define VCLK81_300 0x3f /* Index in VCLKData table (300) */ #define VCLK108_3_300 0x42 /* Index in VCLKData table (300) */ #define VCLK100_300 0x43 /* Index in VCLKData table (300) */ +#define VCLK34_300 0x3d /* Index in VCLKData table (300) */ #define VCLK65_315 0x0b /* Index in (VB)VCLKData table (315) */ #define VCLK108_2_315 0x19 /* Index in (VB)VCLKData table (315) */ #define VCLK81_315 0x5b /* Index in (VB)VCLKData table (315) */ #define VCLK162_315 0x21 /* Index in (VB)VCLKData table (315) */ #define VCLK108_3_315 0x45 /* Index in VBVCLKData table (315) */ #define VCLK100_315 0x46 /* Index in VBVCLKData table (315) */ +#define VCLK34_315 0x55 /* Index in VBVCLKData table (315) */ #define TVCLKBASE_300 0x21 /* Indices on TV clocks in VCLKData table (300) */ #define TVCLKBASE_315 0x3a /* Indices on TV clocks in (VB)VCLKData table (315) */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/oem300.h linux-2.4.23-pre8/drivers/video/sis/oem300.h --- linux-2.4.22/drivers/video/sis/oem300.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/oem300.h 2003-10-22 22:48:20.000000000 +0000 @@ -9,7 +9,6 @@ * * Otherwise, the following terms apply: * - * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that @@ -30,6 +29,8 @@ * * Author: Thomas Winischhofer * + * Based on code by Silicon Intergrated Systems + * */ const UCHAR SiS300_OEMTVDelay301[8][4] = diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/oem310.h linux-2.4.23-pre8/drivers/video/sis/oem310.h --- linux-2.4.22/drivers/video/sis/oem310.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/oem310.h 2003-10-22 22:47:28.000000000 +0000 @@ -29,6 +29,8 @@ * * Author: Thomas Winischhofer * + * Based on code by Silicon Intergrated Systems + * */ const UCHAR SiS310_LCDDelayCompensation_301[] = /* 301 */ @@ -391,5 +393,124 @@ } }; +/* OEM data for Compaq Presario 3045US */ +static const SiS_LCDDataStruct SiS310_ExtCompaq1280x1024Data[] = +{ + { 211, 60,1024, 501,1688,1066}, + { 211, 60,1024, 508,1688,1066}, + { 211, 60,1024, 501,1688,1066}, + { 211, 60,1024, 508,1688,1066}, + { 32, 15,1696, 501,1696,1066}, + { 212, 75,1024, 621,1696,1066}, + { 4, 3,1696, 810,1696,1066}, + { 1, 1,1696,1066,1696,1066} +}; + +static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Compaq1280x1024_1[] = +{ + {{0x3F,0x1B,0xD0,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}}, + {{0x35,0x1B,0xA0,0xC0,0x80,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}}, + {{0x3F,0x1B,0xD0,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}}, + {{0x3F,0x1B,0xD0,0xF0,0xB0,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}}, + {{0x45,0x1C,0x20,0x3F,0xFF,0xB8,0x23,0x0A,0x07,0x14,0x8A,0x12}}, + {{0x49,0x1C,0x40,0x7F,0xFF,0xAD,0x23,0x0A,0x07,0xF3,0x8A,0x12}}, + {{0x4C,0x1C,0x18,0x2F,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}, + {{0x48,0x1C,0x15,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}} +}; + +static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Compaq1280x1024_2[] = +{ + {{0x2B,0x12,0xD9,0xE5,0xD5,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}}, + {{0x22,0x12,0xC0,0xCC,0xBC,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}}, + {{0x2B,0x12,0xD9,0xE5,0xD5,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}}, + {{0x22,0x12,0xC0,0xCC,0xBC,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}}, + {{0x33,0x13,0x01,0x0D,0xFD,0x2C,0x23,0x98,0x27,0x3E,0x08,0x42}}, + {{0x3F,0x1B,0x3D,0x49,0x39,0x54,0x23,0xC0,0x27,0x66,0x30,0x42}}, + {{0x33,0x1B,0x91,0x9D,0x8D,0x8C,0x23,0xF8,0x27,0x9E,0x68,0x42}}, + {{0x43,0x24,0x11,0x1D,0x0D,0xCC,0x23,0x38,0x37,0xDE,0xA8,0x42}}, + {{0x43,0x24,0x21,0x29,0x19,0xEA,0x23,0x0A,0x07,0x32,0xC6,0x42}} +}; + +static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Compaq1280x1024_3[] = +{ + {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}, + {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}, + {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}, + {{0x47,0x1C,0x14,0x29,0xFF,0xBD,0x23,0x0A,0x07,0x23,0x8A,0x12}}, + {{0x47,0x1C,0x14,0x29,0xFF,0xBE,0x23,0x0A,0x07,0x26,0x8A,0x42}}, + {{0x47,0x1C,0x14,0x29,0xFF,0xBE,0x23,0x0A,0x07,0x26,0x8A,0x42}}, + {{0x47,0x1C,0x14,0x29,0xFF,0xBE,0x23,0x0A,0x07,0x26,0x8A,0x42}}, + {{0x47,0x1C,0x14,0x29,0xFF,0xBE,0x23,0x0A,0x07,0x26,0x8A,0x42}} +}; + +static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Clevo1024x768_1[] = +{ + {{0x25,0x12,0xC9,0xDC,0xB6,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}, + {{0x2C,0x12,0x9A,0xAE,0x88,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}, + {{0x25,0x12,0xC9,0xDC,0xB6,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {{0x38,0x13,0x16,0x0C,0xE6,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}, + {{0x38,0x18,0x16,0x00,0x00,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}, + {{0x36,0x13,0x13,0x25,0xFF,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {{0x25,0x12,0xC9,0xDC,0xB6,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}} +}; + +static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Clevo1024x768_2[] = +{ + {{0x25,0x12,0x51,0x6E,0x48,0xCC,0x12,0x89,0x47,0x1C,0x49,0x33}}, + {{0x2C,0x12,0x38,0x55,0x2F,0xCC,0x12,0x89,0x47,0x1C,0x49,0x33}}, + {{0x25,0x12,0x51,0x6E,0x48,0xCC,0x12,0x89,0x47,0x1C,0x49,0x33}}, + {{0x2C,0x12,0x38,0x55,0x2F,0xE0,0x12,0xB1,0x47,0x30,0x71,0x33}}, + {{0x2D,0x12,0x79,0x96,0x70,0xCC,0x12,0x89,0x47,0x1C,0x49,0x33}}, + {{0x29,0x12,0xB5,0xD2,0xAC,0xF4,0x12,0xD9,0x47,0x44,0x99,0x33}}, + {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}}, +#if 0 + {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}}, + {{0x2C,0x12,0x38,0x55,0x2F,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}}, + {{0x25,0x12,0x51,0x6E,0x48,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}}, + {{0x2C,0x12,0x38,0x55,0x2F,0xC1,0x35,0xB1,0x47,0xE9,0x71,0x33}}, + {{0x2D,0x12,0x79,0x96,0x70,0x99,0x35,0x89,0x47,0xC1,0x49,0x33}}, + {{0x29,0x12,0xB5,0xD2,0xAC,0xE9,0x35,0xD9,0x47,0x11,0x99,0x33}}, + {{0x36,0x13,0x13,0x25,0xFF,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}} +#endif +}; + +static const SiS_Part2PortTblStruct SiS310_CRT2Part2_Clevo1024x768_3[] = +{ + {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}}, /* Corrected */ + {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}}, + {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}}, + {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}}, + {{0x36,0x13,0x13,0x25,0xFF,0x32,0x22,0x0A,0x07,0x82,0x0A,0x12}}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {{0x25,0x13,0xC9,0x25,0xFF,0x59,0x45,0x09,0x07,0xF9,0x09,0x24}} +}; + +static const SiS_LVDSDesStruct Clevo1024x768Des_1[] = +{ + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 }, + { 0, 0 } +}; + +static const SiS_LVDSDesStruct Clevo1024x768Des_2[] = +{ + { 1184, 622 }, + { 1184, 597 }, + { 1184, 622 }, + { 1184, 597 }, + { 1152, 622 }, + { 1232, 722 }, + { 0, 0 }, + { 0, 794 }, + { 0, 0 } +}; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/sis_accel.c linux-2.4.23-pre8/drivers/video/sis/sis_accel.c --- linux-2.4.22/drivers/video/sis/sis_accel.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/sis_accel.c 2003-10-22 22:49:00.000000000 +0000 @@ -230,7 +230,7 @@ /* SiSSetupCMDFlag(BITBLT | SRCVIDEO) */ } SiS310SetupCMDFlag(ivideo.SiS310_AccelDepth) - /* TW: The 315 series is smart enough to know the direction */ + /* The 315 series is smart enough to know the direction */ } static void diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/sis_accel.h linux-2.4.23-pre8/drivers/video/sis/sis_accel.h --- linux-2.4.22/drivers/video/sis/sis_accel.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/sis_accel.h 2003-10-22 22:47:29.000000000 +0000 @@ -342,16 +342,27 @@ bits 7:0: 2D counter 1 Where is the command queue length (current amount of commands the queue - can accept) on the 315 series? (The current implementation is taken - from 300 series and certainly wrong...) + can accept) on the 315 series? */ /* TW: FIXME: CmdQueLen is... where....? */ +/* We assume a length of 4 bytes per command; since 512K of + * of RAM are allocated, the number of commands is easily + * calculated (assuming that there is no 3D support yet) + * We calculate it very cautiously (128K only) and let the + * rest to the (never?)-to-come (?) 3D engine. (The 3D engine + * can use a similar technique, using the remaining 384K, + * hence a queue overflow is avoided) + * UPDATE: This technique causes a terrible system latency + * on integrated chipsets. Disable the queue handling for + * now. + */ #define SiS310Idle \ { \ while( (MMIO_IN16(ivideo.mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ while( (MMIO_IN16(ivideo.mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ - CmdQueLen=MMIO_IN16(ivideo.mmio_vbase, Q_STATUS); \ + CmdQueLen = 0; \ + /*CmdQueLen = ((128 * 1024) / 4) - 64; */ \ } #define SiS310SetupSRCBase(base) \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/sis_main.c linux-2.4.23-pre8/drivers/video/sis/sis_main.c --- linux-2.4.22/drivers/video/sis/sis_main.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/sis_main.c 2003-10-22 22:49:11.000000000 +0000 @@ -1,12 +1,14 @@ /* - * SiS 300/630/730/540/315/550/650/740/330/660 frame buffer device - * for Linux kernels 2.4.x and 2.5.x + * SiS 300/630/730/540/315/550/650/651/M650/661FX/M661FX/740/741/330 + * frame buffer driver for Linux kernels 2.4.x and 2.5.x * * (C) 1999 Silicon Integrated Systems, Inc. * (C) 2001-2003 Thomas Winischhofer, Vienna, Austria. * - * Authors: SiS (www.sis.com.tw) - * Thomas Winischhofer + * Author: Thomas Winischhofer + * + * Author of code base: + * SiS (www.sis.com.tw) * * See http://www.winischhofer.net/ for more information and updates * @@ -31,6 +33,9 @@ #include #include #include +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +#include +#endif #include #include #include @@ -67,12 +72,6 @@ #include "sis_main.h" #include "sis.h" -#if 0 -#ifdef LINUXBIOS -#include "bios.h" -#endif -#endif - #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,69) #error "This version of sisfb requires at least 2.5.69" @@ -134,7 +133,11 @@ if (!init) { init = TRUE; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74) pci_for_each_dev(pdev) { +#else + while((pdev = pci_find_device(PCI_VENDOR_ID_SI, PCI_ANY_ID, pdev))) { +#endif DPRINTK("sisfb: Current: 0x%x, target: 0x%x\n", pdev->device, ivideo.chip_id); if ((pdev->vendor == PCI_VENDOR_ID_SI) @@ -169,6 +172,7 @@ if (!init) { init = TRUE; switch (ivideo.chip) { +#ifdef CONFIG_FB_SIS_300 case SIS_540: nbridge_id = PCI_DEVICE_ID_SI_540; break; @@ -178,6 +182,8 @@ case SIS_730: nbridge_id = PCI_DEVICE_ID_SI_730; break; +#endif +#ifdef CONFIG_FB_SIS_315 case SIS_550: nbridge_id = PCI_DEVICE_ID_SI_550; break; @@ -190,12 +196,20 @@ case SIS_660: nbridge_id = PCI_DEVICE_ID_SI_660; break; + case SIS_760: + nbridge_id = PCI_DEVICE_ID_SI_760; + break; +#endif default: nbridge_id = 0; break; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74) pci_for_each_dev(pdev) { +#else + while((pdev = pci_find_device(PCI_VENDOR_ID_SI, PCI_ANY_ID, pdev))) { +#endif DPRINTK("Current: 0x%x, target: 0x%x\n", pdev->device, ivideo.chip_id); if ((pdev->vendor == PCI_VENDOR_ID_SI) @@ -247,7 +261,7 @@ return TRUE; }; -static BOOLEAN sisfb_interpret_edid(struct sisfb_monitor *monitor, unsigned char *buffer) +static BOOLEAN sisfb_interpret_edid(struct sisfb_monitor *monitor, u8 *buffer) { int i, j, xres, yres, refresh, index; u32 emodes; @@ -256,7 +270,7 @@ buffer[2] != 0xff || buffer[3] != 0xff || buffer[4] != 0xff || buffer[5] != 0xff || buffer[6] != 0xff || buffer[7] != 0x00) { - printk(KERN_INFO "sisfb: Bad EDID header\n"); + printk(KERN_DEBUG "sisfb: Bad EDID header\n"); return FALSE; } @@ -349,8 +363,8 @@ static void sisfb_handle_ddc(struct sisfb_monitor *monitor, int crtno) { - USHORT temp, i, realcrtno = crtno; - unsigned char buffer[256]; + USHORT temp, i, realcrtno = crtno; + u8 buffer[256]; monitor->datavalid = FALSE; @@ -448,7 +462,7 @@ } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) - if (!strcmp(name, sisbios_mode[MODE_INDEX_NONE].name)) { + if (!strnicmp(name, sisbios_mode[MODE_INDEX_NONE].name, strlen(name))) { if(!quiet) printk(KERN_ERR "sisfb: Mode 'none' not supported anymore. Using default.\n"); sisfb_mode_idx = DEFAULT_MODE; @@ -486,7 +500,7 @@ i = 0; j = 0; while(sisbios_mode[i].mode_no != 0) { - if(!strcmp(nameptr, sisbios_mode[i++].name)) { + if(!strnicmp(nameptr, sisbios_mode[i++].name, strlen(nameptr))) { if(sisfb_fstn) { if(sisbios_mode[i-1].mode_no == 0x50 || sisbios_mode[i-1].mode_no == 0x56 || @@ -501,11 +515,12 @@ } } if((!j) && !quiet) printk(KERN_ERR "sisfb: Invalid mode '%s'\n", nameptr); + } static int sisfb_validate_mode(int myindex, unsigned long vbflags) { - u16 xres, yres; + u16 xres, yres, myres; #ifdef CONFIG_FB_SIS_300 if(sisvga_engine == SIS_300_VGA) { @@ -522,6 +537,8 @@ } #endif + myres = sisbios_mode[myindex].yres; + switch (vbflags & VB_DISPTYPE_DISP2) { case CRT2_LCD: switch (sishw_ext.ulCRT2LCDType) { @@ -553,23 +570,28 @@ default: xres = 0; yres = 0; break; } + if(SiS_Pr.SiS_CustomT == CUT_BARCO1366) { xres = 1360; yres = 1024; } - if(sisbios_mode[myindex].xres > xres) { + + if(SiS_Pr.SiS_CustomT == CUT_PANEL848) { + xres = 848; yres = 480; + } else { + if(sisbios_mode[myindex].xres > xres) { return(-1); - } - if(sisbios_mode[myindex].yres > yres) { + } + if(myres > yres) { return(-1); + } } + if(vbflags & (VB_LVDS | VB_30xBDH)) { switch (sisbios_mode[myindex].xres) { case 320: - if((sisbios_mode[myindex].yres != 200) && - (sisbios_mode[myindex].yres != 240)) + if((myres != 200) && (myres != 240)) return(-1); - if((sisbios_mode[myindex].yres == 240) || - (sisbios_mode[myindex].yres == 480)) { + if((myres == 240) || (myres == 480)) { if(!sisfb_fstn) { if(sisbios_mode[myindex].mode_no == 0x5a || sisbios_mode[myindex].mode_no == 0x5b) @@ -581,51 +603,62 @@ return(-1); } } + if(SiS_Pr.SiS_CustomT == CUT_PANEL848) return(-1); break; case 400: - if(sisbios_mode[myindex].yres != 300) return(-1); + if(myres != 300) return(-1); + if(SiS_Pr.SiS_CustomT == CUT_PANEL848) return(-1); break; case 512: - if(sisbios_mode[myindex].yres != 384) return(-1); + if(myres != 384) return(-1); if(sishw_ext.ulCRT2LCDType == LCD_1024x600) return(-1); + if(SiS_Pr.SiS_CustomT == CUT_PANEL848) return(-1); break; case 640: - if((sisbios_mode[myindex].yres != 400) && - (sisbios_mode[myindex].yres != 480)) + if((myres != 400) && (myres != 480)) return -1; + if(SiS_Pr.SiS_CustomT == CUT_PANEL848) { + if(myres == 400) + return(-1); + } break; case 800: - if(sisbios_mode[myindex].yres != 600) return(-1); + if(myres != 600) return(-1); + break; + case 848: + if(SiS_Pr.SiS_CustomT != CUT_PANEL848) return(-1); + if(myres != 480) return(-1); break; case 1024: - if((sisbios_mode[myindex].yres != 600) && - (sisbios_mode[myindex].yres != 768)) + if((myres != 600) && (myres != 768)) return(-1); - if((sisbios_mode[myindex].yres == 600) && + if((myres == 600) && (sishw_ext.ulCRT2LCDType != LCD_1024x600)) return(-1); break; case 1152: - if((sisbios_mode[myindex].yres) != 768) return(-1); + if(myres != 768) return(-1); if(sishw_ext.ulCRT2LCDType != LCD_1152x768) return(-1); break; case 1280: - if((sisbios_mode[myindex].yres != 768) && - (sisbios_mode[myindex].yres != 1024)) + if((myres != 768) && (myres != 1024)) return(-1); - if((sisbios_mode[myindex].yres == 768) && + if((myres == 768) && (sishw_ext.ulCRT2LCDType != LCD_1280x768)) return(-1); + if(SiS_Pr.SiS_CustomT == CUT_PANEL848) return(-1); break; case 1360: if(SiS_Pr.SiS_CustomT != CUT_BARCO1366) return(-1); - if(sisbios_mode[myindex].yres != 1024) return(-1); + if(myres != 1024) return(-1); break; case 1400: - if(sisbios_mode[myindex].yres != 1050) return(-1); + if(myres != 1050) return(-1); + if(SiS_Pr.SiS_CustomT == CUT_PANEL848) return(-1); break; case 1600: - if(sisbios_mode[myindex].yres != 1200) return(-1); + if(myres != 1200) return(-1); + if(SiS_Pr.SiS_CustomT == CUT_PANEL848) return(-1); break; default: return(-1); @@ -633,74 +666,85 @@ } else { switch (sisbios_mode[myindex].xres) { case 320: - if((sisbios_mode[myindex].yres != 200) && - (sisbios_mode[myindex].yres != 240)) + if((myres != 200) && (myres != 240)) return -1; break; case 400: - if(sisbios_mode[myindex].yres != 300) return(-1); + if(myres != 300) return(-1); break; case 512: - if(sisbios_mode[myindex].yres != 384) return(-1); + if(myres != 384) return(-1); break; case 640: - if((sisbios_mode[myindex].yres != 400) && - (sisbios_mode[myindex].yres != 480)) + if((myres != 400) && (myres != 480)) return(-1); break; case 800: - if(sisbios_mode[myindex].yres != 600) return(-1); + if(myres != 600) return(-1); break; case 1024: - if(sisbios_mode[myindex].yres != 768) return(-1); + if(myres != 768) return(-1); break; case 1280: - if((sisbios_mode[myindex].yres != 960) && - (sisbios_mode[myindex].yres != 768) && - (sisbios_mode[myindex].yres != 1024)) + if((myres != 960) && (myres != 768) && (myres != 1024)) return(-1); - if((sisbios_mode[myindex].yres == 768) || - (sisbios_mode[myindex].yres == 960)) { + if((myres == 768) || (myres == 960)) { if(sishw_ext.ulCRT2LCDType == LCD_1400x1050) return(-1); } - if(sisbios_mode[myindex].yres == 768) { + if(myres == 768) { if(sishw_ext.ulCRT2LCDType == LCD_1280x960) return(-1); } break; case 1400: - if(sisbios_mode[myindex].yres != 1050) return(-1); + if(myres != 1050) return(-1); break; case 1600: - if(sisbios_mode[myindex].yres != 1200) return(-1); + if(myres != 1200) return(-1); break; default: return(-1); } } break; - case CRT2_TV: + + case CRT2_TV: switch (sisbios_mode[myindex].xres) { - case 512: + case 320: if(vbflags & VB_CHRONTEL) return(-1); + if((myres != 200) && (myres != 240)) + return(-1); + break; + case 400: + if(vbflags & VB_CHRONTEL) return(-1); + if(myres != 300) return(-1); + break; + case 512: + if((vbflags & VB_CHRONTEL) && (ivideo.chip < SIS_315H)) + return(-1); if((vbflags & VB_SISBRIDGE) && (vbflags & TV_NTSC)) return(-1); - /* fall through */ + if(myres != 384) return(-1); + break; case 640: - case 800: + if((myres != 400) && (myres != 480)) + return(-1); break; case 720: - if(vbflags & VB_CHRONTEL) return -1; - if(vbflags & TV_NTSC) { - if (sisbios_mode[myindex].yres != 480) { - return(-1); - } - } else if(vbflags & TV_PAL) { - if (sisbios_mode[myindex].yres != 576) { - return(-1); - } - } + if(vbflags & VB_CHRONTEL) return(-1); + if((vbflags & TV_NTSC) && (myres != 480)) + return(-1); + if((vbflags & TV_PAL) && (myres != 576)) + return(-1); + break; + case 768: + if(vbflags & VB_CHRONTEL) return(-1); + if(!(vbflags & TV_PAL)) return(-1); + if(myres != 576) return(-1); + break; + case 800: + if(myres != 600) return(-1); break; case 1024: if(vbflags & VB_301) return(-1); @@ -714,9 +758,10 @@ return(-1); } break; - case CRT2_VGA: + + case CRT2_VGA: if(sisbios_mode[myindex].xres > 1600) return(-1); - if(!(vbflags & (VB_301B|VB_302B))) { + if(!(vbflags & (VB_301B|VB_301C|VB_302B))) { if(sisbios_mode[myindex].xres > 1400) return(-1); } break; @@ -732,7 +777,7 @@ return; while(sis_crt2type[i].type_no != -1) { - if (!strcmp(name, sis_crt2type[i].name)) { + if (!strnicmp(name, sis_crt2type[i].name, strlen(sis_crt2type[i].name))) { sisfb_crt2type = sis_crt2type[i].type_no; sisfb_tvplug = sis_crt2type[i].tvplug_no; sisfb_dstn = (sis_crt2type[i].flags & FL_550_DSTN) ? 1 : 0; @@ -756,7 +801,7 @@ return; while (sis_queuemode[i].type_no != -1) { - if (!strcmp(name, sis_queuemode[i].name)) { + if (!strnicmp(name, sis_queuemode[i].name, strlen(sis_queuemode[i].name))) { sisfb_queuemode = sis_queuemode[i].type_no; break; } @@ -820,7 +865,7 @@ return; while (sis_tvtype[i].type_no != -1) { - if (!strcmp(name, sis_tvtype[i].name)) { + if (!strnicmp(name, sis_tvtype[i].name, strlen(sis_tvtype[i].name))) { ivideo.vbflags |= sis_tvtype[i].type_no; break; } @@ -828,6 +873,43 @@ } } +static void sisfb_search_specialtiming(const char *name) +{ + int i = 0; + BOOLEAN found = FALSE; + + if(name == NULL) + return; + + if(!strnicmp(name, "none", 4)) { + SiS_Pr.SiS_CustomT = CUT_FORCENONE; + printk(KERN_DEBUG "sisfb: Special timing disabled\n"); + } else { + while(mycustomttable[i].chipID != 0) { + if(!strnicmp(name,mycustomttable[i].optionName, strlen(mycustomttable[i].optionName))) { + SiS_Pr.SiS_CustomT = mycustomttable[i].SpecialID; + found = TRUE; + printk(KERN_INFO "sisfb: Special timing for %s %s forced\n", + mycustomttable[i].vendorName, mycustomttable[i].cardName); + break; + } + i++; + } + if(!found) { + printk(KERN_WARNING "sisfb: Invalid SpecialTiming parameter, valid are:"); + printk(KERN_WARNING "\t\"none\" (to disable special timings)\n"); + i = 0; + while(mycustomttable[i].chipID != 0) { + printk(KERN_WARNING "\t\"%s\" (for %s %s)\n", + mycustomttable[i].optionName, + mycustomttable[i].vendorName, + mycustomttable[i].cardName); + i++; + } + } + } +} + static BOOLEAN sisfb_bridgeisslave(void) { unsigned char P1_00; @@ -989,12 +1071,12 @@ } if(sisvga_engine == SIS_300_VGA) { - if((ivideo.vbflags & (VB_301B|VB_302B)) && + if((ivideo.vbflags & (VB_301B|VB_301C|VB_302B)) && (!(ivideo.vbflags & VB_30xBDH))) { setSISIDXREG(SISPART1, 0x13, 0x3f, p1_13); } } else if(sisvga_engine == SIS_315_VGA) { - if((ivideo.vbflags & (VB_301B|VB_302B)) && + if((ivideo.vbflags & (VB_301B|VB_301C|VB_302B)) && (!(ivideo.vbflags & VB_30xBDH))) { setSISIDXREG(SISPART2, 0x00, 0x1f, p2_0); } @@ -1002,7 +1084,7 @@ } else if(ivideo.currentvbflags & CRT2_VGA) { - if(ivideo.vbflags & (VB_301B|VB_302B)) { + if(ivideo.vbflags & (VB_301B|VB_301C|VB_302B)) { setSISIDXREG(SISPART2, 0x00, 0x1f, p2_0); } @@ -1749,6 +1831,7 @@ if (boot_cpu_data.x86 > 3) pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; #endif + /* RedHat requires vma as the first paramater to the following call */ if (io_remap_page_range(vma->vm_start, off, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; @@ -1846,11 +1929,9 @@ rc = 256; break; case 16: - rc = 16; - break; case 32: rc = 16; - break; + break; } return rc; } @@ -2249,7 +2330,7 @@ if(copy_to_user((void *)arg, &sisapdata, sizeof(sisapdata))) return -EFAULT; break; - case SISFB_GET_INFO: /* New for communication with X driver */ + case SISFB_GET_INFO: /* For communication with X driver */ { sisfb_info x; @@ -2262,7 +2343,7 @@ x.heapstart = ivideo.heapstart / 1024; x.fbvidmode = sisfb_mode_no; x.sisfb_caps = sisfb_caps; - x.sisfb_tqlen = 512; /* yet unused */ + x.sisfb_tqlen = 512; /* yet fixed */ x.sisfb_pcibus = ivideo.pcibus; x.sisfb_pcislot = ivideo.pcislot; x.sisfb_pcifunc = ivideo.pcifunc; @@ -2270,6 +2351,8 @@ x.sisfb_lcda = sisfb_detectedlcda; x.sisfb_vbflags = ivideo.vbflags; x.sisfb_currentvbflags = ivideo.currentvbflags; + x.sisfb_scalelcd = SiS_Pr.UsePanelScaler; + x.sisfb_specialtiming = SiS_Pr.SiS_CustomT; if(copy_to_user((void *)arg, &x, sizeof(x))) return -EFAULT; break; @@ -2332,7 +2415,7 @@ fix->mmio_len = sisfb_mmio_size; if(sisvga_engine == SIS_300_VGA) fix->accel = FB_ACCEL_SIS_GLAMOUR; - else if((ivideo.chip == SIS_330) || (ivideo.chip == SIS_660)) + else if((ivideo.chip == SIS_330) || (ivideo.chip == SIS_660) || (ivideo.chip == SIS_760)) fix->accel = FB_ACCEL_SIS_XABRE; else fix->accel = FB_ACCEL_SIS_GLAMOUR_2; @@ -2418,9 +2501,12 @@ } else { /* 540, 630, 730 */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74) pci_for_each_dev(pdev) { - - if ((pdev->vendor == PCI_VENDOR_ID_SI) +#else + while((pdev = pci_find_device(PCI_VENDOR_ID_SI, PCI_ANY_ID, pdev))) { +#endif + if ((pdev->vendor == PCI_VENDOR_ID_SI) && (pdev->device == nbridge_id)) { pci_read_config_byte(pdev, IND_BRI_DRAM_STATUS, &pci_data); pci_data = (pci_data & BRI_DRAM_SIZE_MASK) >> 4; @@ -2461,7 +2547,7 @@ #endif /* CONFIG_FB_SIS_300 */ -#ifdef CONFIG_FB_SIS_315 /* for SiS 315/550/650/740/330 */ +#ifdef CONFIG_FB_SIS_315 /* for SiS 315/550/650/740/330/660/760 */ static int sisfb_get_dram_size_315(void) { @@ -2473,24 +2559,30 @@ if (ivideo.chip == SIS_550 || ivideo.chip == SIS_650 || ivideo.chip == SIS_740 || - ivideo.chip == SIS_660) { + ivideo.chip == SIS_660 || + ivideo.chip == SIS_760) { #ifdef LINUXBIOS +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74) pci_for_each_dev(pdev) { +#else + while((pdev = pci_find_device(PCI_VENDOR_ID_SI, PCI_ANY_ID, pdev))) { +#endif if ( (pdev->vendor == PCI_VENDOR_ID_SI) && ( (pdev->device == PCI_DEVICE_ID_SI_550) || (pdev->device == PCI_DEVICE_ID_SI_650) || (pdev->device == PCI_DEVICE_ID_SI_740) || - (pdev->device == PCI_DEVICE_ID_SI_660))) { + (pdev->device == PCI_DEVICE_ID_SI_660) || + (pdev->device == PCI_DEVICE_ID_SI_760))) { pci_read_config_byte(pdev, IND_BRI_DRAM_STATUS, &pci_data); pci_data = (pci_data & BRI_DRAM_SIZE_MASK) >> 4; ivideo.video_size = (unsigned int)(1 << (pci_data + 21)); pdev_valid = 1; - /* TW: Initialize SR14 "by hand" */ + /* Initialize SR14 "by hand" */ inSISIDXREG(SISSR, IND_SIS_DRAM_SIZE, reg); reg &= 0xC0; switch (pci_data) { @@ -2552,7 +2644,11 @@ "now reading from PCI config\n"); pdev_valid = 0; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74) pci_for_each_dev(pdev) { +#else + while((pdev = pci_find_device(PCI_VENDOR_ID_SI, PCI_ANY_ID, pdev))) { +#endif if ( (pdev->vendor == PCI_VENDOR_ID_SI) && (pdev->device == PCI_DEVICE_ID_SI_550) ) { @@ -2625,7 +2721,7 @@ reg >>= 2; if(ivideo.chip == SIS_330) { - + if(reg) ivideo.video_size <<= 1; } else { @@ -2786,10 +2882,14 @@ ivideo.vbflags |= VB_301; sishw_ext.ujVBChipID = VB_CHIP_301; printk(KERN_INFO "%s SiS301 %s\n", stdstr, bridgestr); - } else if(reg < 0xd0) { + } else if(reg < 0xc0) { ivideo.vbflags |= VB_301B; sishw_ext.ujVBChipID = VB_CHIP_301B; printk(KERN_INFO "%s SiS301B %s\n", stdstr, bridgestr); + } else if(reg < 0xd0) { + ivideo.vbflags |= VB_301C; + sishw_ext.ujVBChipID = VB_CHIP_301C; + printk(KERN_INFO "%s SiS301C %s\n", stdstr, bridgestr); } else if(reg < 0xe0) { ivideo.vbflags |= VB_301LV; sishw_ext.ujVBChipID = VB_CHIP_301LV; @@ -2842,10 +2942,9 @@ break; case SIS_EXTERNAL_CHIP_TRUMPION: ivideo.hasVB = HASVB_TRUMPION; - ivideo.vbflags |= VB_TRUMPION; sishw_ext.usExternalChip = 0x02; printk(KERN_INFO "%s Trumpion LCD scaler\n", stdstr); - break; + break; case SIS_EXTERNAL_CHIP_CHRONTEL: ivideo.hasVB = HASVB_CHRONTEL; ivideo.vbflags |= VB_CHRONTEL; @@ -2927,7 +3026,7 @@ if(sisvga_engine == SIS_300_VGA) { - if(ivideo.vbflags & (VB_301B|VB_302B|VB_301LV|VB_302LV)) { + if(ivideo.vbflags & (VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV)) { testvga2_tempbh = 0x01; testvga2_tempbl = 0x90; testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b; testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74; @@ -2959,7 +3058,7 @@ } else { - if(ivideo.vbflags & (VB_301B|VB_302B)) { + if(ivideo.vbflags & (VB_301B|VB_301C|VB_302B)) { testvga2_tempbh = 0x01; testvga2_tempbl = 0x90; testsvhs_tempbh = 0x01; testsvhs_tempbl = 0x6b; testcvbs_tempbh = 0x01; testcvbs_tempbl = 0x74; @@ -2972,7 +3071,7 @@ testsvhs_tempbh = 0x00; testsvhs_tempbl = 0xb9; testcvbs_tempbh = 0x00; testcvbs_tempbl = 0xb3; } - if(ivideo.vbflags & (VB_301|VB_301B|VB_302B)) { + if(ivideo.vbflags & (VB_301|VB_301B|VB_301C|VB_302B)) { inSISIDXREG(SISPART4,0x01,myflag); if(myflag & 0x04) { testvga2_tempbh = 0x00; testvga2_tempbl = 0xfd; @@ -3196,8 +3295,13 @@ unsigned long *write_port = 0; SIS_CMDTYPE cmd_type; #ifndef AGPOFF +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + struct agp_kern_info *agp_info; + struct agp_memory *agp; +#else agp_kern_info *agp_info; agp_memory *agp; +#endif u32 agp_phys; #endif #endif @@ -3211,8 +3315,9 @@ * in XF86Config-4. * The heap start can also be specified by parameter "mem" when starting the sisfb * driver. sisfb mem=1024 lets heap starts at 1MB, etc. - * On the 315 series, the default is a 1MB heap since DRI is not supported - * there. + * + * On the 315 and Xabre series, the default is a 1MB heap since DRI is not + * supported there. */ if ((!sisfb_mem) || (sisfb_mem > (ivideo.video_size/1024))) { if(sisvga_engine == SIS_300_VGA) { @@ -3280,8 +3385,13 @@ #ifndef AGPOFF if (sisfb_queuemode == AGP_CMD_QUEUE) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + agp_info = vmalloc(sizeof(*agp_info)); + memset((void*)agp_info, 0x00, sizeof(*agp_info)); +#else agp_info = vmalloc(sizeof(agp_kern_info)); memset((void*)agp_info, 0x00, sizeof(agp_kern_info)); +#endif agp_copy_info(agp_info); agp_backend_acquire(); @@ -3382,10 +3492,6 @@ break; default: /* MMIO */ - /* TW: This previously only wrote SIS_MMIO_CMD_ENABLE - * to IND_SIS_CMDQUEUE_SET. I doubt that this is - * enough. Reserve memory in any way. - */ sisfb_heap_end -= COMMAND_QUEUE_AREA_SIZE; sisfb_heap_size -= COMMAND_QUEUE_AREA_SIZE; @@ -3394,7 +3500,7 @@ *write_port = *read_port; - /* TW: Set Auto_Correction bit */ + /* Set Auto_Correction bit */ temp |= (SIS_MMIO_CMD_ENABLE | SIS_CMD_AUTO_CORR); outSISIDXREG(SISSR, IND_SIS_CMDQUEUE_SET, temp); @@ -3782,6 +3888,13 @@ outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR31, cr31); outSISIDXREG(SISCR, IND_SIS_SCRATCH_REG_CR33, cr33); +#ifdef CONFIG_FB_SIS_315 + if(sisvga_engine == SIS_315_VGA) { + /* Clear LCDA and PAL-N/M bits */ + andSISIDXREG(SISCR,0x38,~0xc3); + } +#endif + if(ivideo.accel) sisfb_syncaccel(); SiS_Pr.SiS_UseOEM = sisfb_useoem; @@ -3871,6 +3984,7 @@ case 720: filter_tb = (ivideo.vbflags & TV_NTSC) ? 6 : 14; break; + case 400: case 800: filter_tb = (ivideo.vbflags & TV_NTSC) ? 7 : 15; break; @@ -3906,6 +4020,7 @@ outSISIDXREG(SISPART2, 0x37, 0x22); outSISIDXREG(SISPART2, 0x38, 0x08); break; + case 400: case 800: outSISIDXREG(SISPART2, 0x35, 0xEB); outSISIDXREG(SISPART2, 0x36, 0x15); @@ -3940,6 +4055,7 @@ outSISIDXREG(SISPART2, 0x37, 0x1D); outSISIDXREG(SISPART2, 0x38, 0x20); break; + case 400: case 800: outSISIDXREG(SISPART2, 0x35, 0xFC); outSISIDXREG(SISPART2, 0x36, 0xFB); @@ -3950,7 +4066,7 @@ } } - if ((filter >= 0) && (filter <=7)) { + if ((filter >= 0) && (filter <= 7)) { DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n", filter_tb, filter, sis_TV_filter[filter_tb].filter[filter][0], sis_TV_filter[filter_tb].filter[filter][1], @@ -3974,11 +4090,14 @@ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) sis_fb_info.fontname[0] = '\0'; -#endif +#endif ivideo.refresh_rate = 0; + SiS_Pr.SiS_CustomT = CUT_NONE; + SiS_Pr.UsePanelScaler = -1; + SiS_Pr.LVDSHL = -1; - printk(KERN_INFO "sisfb: Options %s\n", options); + printk(KERN_DEBUG "sisfb: Options %s\n", options); if (!options || !*options) return 0; @@ -3987,57 +4106,67 @@ if (!*this_opt) continue; - if (!strncmp(this_opt, "mode:", 5)) { + if (!strnicmp(this_opt, "mode:", 5)) { sisfb_search_mode(this_opt + 5, FALSE); - } else if (!strncmp(this_opt, "vesa:", 5)) { + } else if (!strnicmp(this_opt, "vesa:", 5)) { sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0), FALSE); -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - } else if (!strcmp(this_opt, "inverse")) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) + } else if (!strnicmp(this_opt, "inverse", 7)) { sisfb_inverse = 1; /* fb_invert_cmaps(); */ - } else if (!strncmp(this_opt, "font:", 5)) { + } else if (!strnicmp(this_opt, "font:", 5)) { strcpy(sis_fb_info.fontname, this_opt + 5); #endif - } else if (!strncmp(this_opt, "vrate:", 6)) { + } else if (!strnicmp(this_opt, "vrate:", 6)) { ivideo.refresh_rate = simple_strtoul(this_opt + 6, NULL, 0); sisfb_parm_rate = ivideo.refresh_rate; - } else if (!strncmp(this_opt, "rate:", 5)) { + } else if (!strnicmp(this_opt, "rate:", 5)) { ivideo.refresh_rate = simple_strtoul(this_opt + 5, NULL, 0); sisfb_parm_rate = ivideo.refresh_rate; - } else if (!strncmp(this_opt, "off", 3)) { + } else if (!strnicmp(this_opt, "off", 3)) { sisfb_off = 1; - } else if (!strncmp(this_opt, "crt1off", 7)) { + } else if (!strnicmp(this_opt, "crt1off", 7)) { sisfb_crt1off = 1; - } else if (!strncmp(this_opt, "filter:", 7)) { + } else if (!strnicmp(this_opt, "filter:", 7)) { filter = (int)simple_strtoul(this_opt + 7, NULL, 0); - } else if (!strncmp(this_opt, "forcecrt2type:", 14)) { + } else if (!strnicmp(this_opt, "forcecrt2type:", 14)) { sisfb_search_crt2type(this_opt + 14); - } else if (!strncmp(this_opt, "forcecrt1:", 10)) { + } else if (!strnicmp(this_opt, "forcecrt1:", 10)) { sisfb_forcecrt1 = (int)simple_strtoul(this_opt + 10, NULL, 0); - } else if (!strncmp(this_opt, "tvmode:",7)) { + } else if (!strnicmp(this_opt, "tvmode:",7)) { sisfb_search_tvstd(this_opt + 7); - } else if (!strncmp(this_opt, "tvstandard:",11)) { + } else if (!strnicmp(this_opt, "tvstandard:",11)) { sisfb_search_tvstd(this_opt + 7); - } else if (!strncmp(this_opt, "mem:",4)) { + } else if (!strnicmp(this_opt, "mem:",4)) { sisfb_mem = simple_strtoul(this_opt + 4, NULL, 0); - } else if (!strncmp(this_opt, "queuemode:", 10)) { + } else if (!strnicmp(this_opt, "queuemode:", 10)) { sisfb_search_queuemode(this_opt + 10); - } else if (!strncmp(this_opt, "pdc:", 4)) { + } else if (!strnicmp(this_opt, "pdc:", 4)) { sisfb_pdc = simple_strtoul(this_opt + 4, NULL, 0); - if(sisfb_pdc & ~0x3c) { - printk(KERN_INFO "sisfb: Illegal pdc parameter\n"); - sisfb_pdc = 0; - } - } else if (!strncmp(this_opt, "noaccel", 7)) { + } else if (!strnicmp(this_opt, "noaccel", 7)) { sisfb_accel = 0; - } else if (!strncmp(this_opt, "noypan", 6)) { + } else if (!strnicmp(this_opt, "noypan", 6)) { sisfb_ypan = 0; - } else if (!strncmp(this_opt, "userom:", 7)) { + } else if (!strnicmp(this_opt, "userom:", 7)) { sisfb_userom = (int)simple_strtoul(this_opt + 7, NULL, 0); - } else if (!strncmp(this_opt, "useoem:", 7)) { + } else if (!strnicmp(this_opt, "useoem:", 7)) { sisfb_useoem = (int)simple_strtoul(this_opt + 7, NULL, 0); - } else if (!strncmp(this_opt, "nocrt2rate", 10)) { - sisfb_nocrt2rate = 1; + } else if (!strnicmp(this_opt, "nocrt2rate", 10)) { + sisfb_nocrt2rate = 1; + } else if (!strnicmp(this_opt, "scalelcd:", 9)) { + unsigned long temp = 2; + temp = simple_strtoul(this_opt + 9, NULL, 0); + if((temp == 0) || (temp == 1)) { + SiS_Pr.UsePanelScaler = temp ^ 1; + } + } else if (!strnicmp(this_opt, "specialtiming:", 14)) { + sisfb_search_specialtiming(this_opt + 14); + } else if (!strnicmp(this_opt, "lvdshl:", 7)) { + unsigned long temp = 4; + temp = simple_strtoul(this_opt + 7, NULL, 0); + if((temp >= 0) && (temp <= 3)) { + SiS_Pr.LVDSHL = temp; + } } else if(this_opt[0] >= '0' && this_opt[0] <= '9') { sisfb_search_mode(this_opt, TRUE); } else { @@ -4066,14 +4195,14 @@ char *sis_sig_300[4] = { "300", "540", "630", "730" }; - char *sis_sig_310[8] = { - "315", "315", "315", "5315", "6325", "6325", "Xabre", "6330" + char *sis_sig_310[9] = { + "315", "315", "315", "5315", "6325", "6325", "Xabre", "6330", "6330" }; ushort sis_nums_300[4] = { SIS_300, SIS_540, SIS_630, SIS_730 }; - unsigned short sis_nums_310[8] = { - SIS_315PRO, SIS_315H, SIS_315, SIS_550, SIS_650, SIS_740, SIS_330, SIS_660 + unsigned short sis_nums_310[9] = { + SIS_315PRO, SIS_315H, SIS_315, SIS_550, SIS_650, SIS_740, SIS_330, SIS_660, SIS_760 }; for(segstart=0x000c0000; segstart<0x000f0000; segstart+=0x00001000) { @@ -4110,7 +4239,7 @@ } } if(stage != 4) { - for(i = 0;(i < 8) && (stage != 4); i++) { + for(i = 0;(i < 9) && (stage != 4); i++) { if(strncmp(sis_sig_310[i], rom, strlen(sis_sig_310[i])) == 0) { if(sis_nums_310[i] == ivideo.chip) { stage = 4; @@ -4169,7 +4298,11 @@ memset(&sis_disp, 0, sizeof(sis_disp)); #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74) pci_for_each_dev(pdev) { +#else + while((pdev = pci_find_device(PCI_VENDOR_ID_SI, PCI_ANY_ID, pdev))) { +#endif for (b = sisdev_list; b->vendor; b++) { if ((b->vendor == pdev->vendor) && (b->device == pdev->device)) { @@ -4211,18 +4344,17 @@ break; case PCI_DEVICE_ID_SI_630_VGA: { + ivideo.chip = SIS_630; sisfb_set_reg4(0xCF8, 0x80000000); reg32 = sisfb_get_reg3(0xCFC); if(reg32 == 0x07301039) { ivideo.chip = SIS_730; -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0) +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0) strcpy(sis_fb_info.modename, "SIS 730"); #else strcpy(myid, "SIS 730"); -#endif - } else - ivideo.chip = SIS_630; - +#endif + } sisvga_engine = SIS_300_VGA; sisfb_hwcursor_size = HW_CURSOR_AREA_SIZE_300 * 2; sisfb_CRT2_write_enable = IND_SIS_CRT2_WRITE_ENABLE_300; @@ -4267,11 +4399,11 @@ reg32 = sisfb_get_reg3(0xCFC); if(reg32 == 0x07401039) { ivideo.chip = SIS_740; -#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0) +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0) strcpy(sis_fb_info.modename, "SIS 740"); #else - strcpy(myid, "SIS 740"); -#endif + strcpy(myid, "SIS 740"); +#endif } sisvga_engine = SIS_315_VGA; sisfb_hwcursor_size = HW_CURSOR_AREA_SIZE_315 * 2; @@ -4285,11 +4417,23 @@ sisfb_CRT2_write_enable = IND_SIS_CRT2_WRITE_ENABLE_315; break; case PCI_DEVICE_ID_SI_660_VGA: - ivideo.chip = SIS_660; - sisvga_engine = SIS_315_VGA; - sisfb_hwcursor_size = HW_CURSOR_AREA_SIZE_315 * 2; - sisfb_CRT2_write_enable = IND_SIS_CRT2_WRITE_ENABLE_315; - break; + { + ivideo.chip = SIS_660; + sisfb_set_reg4(0xCF8, 0x80000000); + reg32 = sisfb_get_reg3(0xCFC); + if(reg32 == 0x07601039) { + ivideo.chip = SIS_760; +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0) + strcpy(sis_fb_info.modename, "SIS 760"); +#else + strcpy(myid, "SIS 760"); +#endif + } + sisvga_engine = SIS_315_VGA; + sisfb_hwcursor_size = HW_CURSOR_AREA_SIZE_315 * 2; + sisfb_CRT2_write_enable = IND_SIS_CRT2_WRITE_ENABLE_315; + break; + } #endif default: return -ENODEV; @@ -4315,9 +4459,7 @@ SiS_Pr.SiS_Backup70xx = 0xff; SiS_Pr.SiS_CHOverScan = -1; SiS_Pr.SiS_ChSW = FALSE; - SiS_Pr.SiS_CustomT = CUT_NONE; SiS_Pr.SiS_UseLCDA = FALSE; - SiS_Pr.UsePanelScaler = -1; SiSRegInit(&SiS_Pr, (USHORT)sishw_ext.ulIOAddress); #ifdef CONFIG_FB_SIS_300 @@ -4364,7 +4506,8 @@ #endif #ifdef CONFIG_FB_SIS_315 if (ivideo.chip == SIS_550 || ivideo.chip == SIS_650 || - ivideo.chip == SIS_740 || ivideo.chip == SIS_660) { + ivideo.chip == SIS_740 || ivideo.chip == SIS_660 || + ivideo.chip == SIS_760) { outSISIDXREG(SISSR, 0x28, 0x5a); outSISIDXREG(SISSR, 0x29, 0x64); @@ -4386,6 +4529,7 @@ case SIS_650: case SIS_740: case SIS_660: + case SIS_760: sishw_ext.bIntegratedMMEnabled = TRUE; break; default: @@ -4426,26 +4570,46 @@ strcpy(sishw_ext.szVBIOSVer, "0.84"); /* Find systems for special custom timing */ - if(sishw_ext.UseROM) { - int i=0,j; - unsigned char *biosver = sishw_ext.pjVirtualRomBase + 0x06; - unsigned char *biosdate = sishw_ext.pjVirtualRomBase + 0x2c; + if(SiS_Pr.SiS_CustomT == CUT_NONE) { + int i=0, j; + unsigned char *biosver = NULL; + unsigned char *biosdate = NULL; BOOLEAN footprint; + unsigned long chksum = 0; + + if(sishw_ext.UseROM) { + biosver = sishw_ext.pjVirtualRomBase + 0x06; + biosdate = sishw_ext.pjVirtualRomBase + 0x2c; + for(i=0; i<32768; i++) chksum += sishw_ext.pjVirtualRomBase[i]; + } + + i=0; do { if( (mycustomttable[i].chipID == ivideo.chip) && - (!strncmp(mycustomttable[i].biosversion, biosver, strlen(mycustomttable[i].biosversion))) && - (!strncmp(mycustomttable[i].biosdate, biosdate, strlen(mycustomttable[i].biosdate))) ) { + ((!strlen(mycustomttable[i].biosversion)) || + (sishw_ext.UseROM && + (!strncmp(mycustomttable[i].biosversion, biosver, strlen(mycustomttable[i].biosversion))))) && + ((!strlen(mycustomttable[i].biosdate)) || + (sishw_ext.UseROM && + (!strncmp(mycustomttable[i].biosdate, biosdate, strlen(mycustomttable[i].biosdate))))) && + ((!mycustomttable[i].bioschksum) || + (sishw_ext.UseROM && + (mycustomttable[i].bioschksum == chksum))) && + (mycustomttable[i].pcisubsysvendor == ivideo.subsysvendor) && + (mycustomttable[i].pcisubsyscard == ivideo.subsysdevice) ) { footprint = TRUE; - for(j=0; j<5; j++) { - if(mycustomttable[i].biosFootprintAddr[j]) { - if(sishw_ext.pjVirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] != + if(sishw_ext.UseROM) { + for(j=0; j<5; j++) { + if(mycustomttable[i].biosFootprintAddr[j]) { + if(sishw_ext.pjVirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] != mycustomttable[i].biosFootprintData[j]) - footprint = FALSE; - } + footprint = FALSE; + } + } } if(footprint) { SiS_Pr.SiS_CustomT = mycustomttable[i].SpecialID; - printk(KERN_DEBUG "sisfb: Identified [%s %s] for non-standard timing\n", + printk(KERN_DEBUG "sisfb: Identified [%s %s], special timing applies\n", mycustomttable[i].vendorName, mycustomttable[i].cardName); break; @@ -4456,7 +4620,7 @@ } #ifdef CONFIG_FB_SIS_300 - /* TW: Mode numbers for 1280x768 are different for 300 and 315 series */ + /* Mode numbers for 1280x768 are different for 300 and 315 series */ if(sisvga_engine == SIS_300_VGA) { sisbios_mode[MODEINDEX_1280x768].mode_no = 0x55; sisbios_mode[MODEINDEX_1280x768+1].mode_no = 0x5a; @@ -4579,6 +4743,7 @@ sishw_ext.ulVideoMemorySize = ivideo.video_size; + if(sisvga_engine == SIS_300_VGA) sisfb_pdc &= 0x3c; if(sisfb_pdc) { sishw_ext.pdc = sisfb_pdc; } else { @@ -4700,8 +4865,31 @@ sisfb_detectedlcda = 0xff; #ifndef LINUXBIOS #ifdef CONFIG_FB_SIS_315 - /* TW: Try to find about LCDA */ + if(sisvga_engine == SIS_315_VGA) { + /* Save PDC */ + if(ivideo.vbflags & (VB_301LV | VB_302LV)) { + int tmp; + inSISIDXREG(SISCR,0x30,tmp); + if(tmp & 0x20) { + /* Currently on LCD? If yes, read current pdc */ + inSISIDXREG(SISPART1,0x2D,sisfb_detectedpdc); + if(sishw_ext.pdc == 0) { + /* Let option override detection */ + sishw_ext.pdc = sisfb_detectedpdc; + } + printk(KERN_INFO + "sisfb: Detected LCD PanelDelayCompensation %d\n", + sisfb_detectedpdc); + } + if((sishw_ext.pdc) && (sishw_ext.pdc != sisfb_detectedpdc)) { + printk(KERN_INFO + "sisfb: Using LCD PanelDelayCompensation %d\n", + sishw_ext.pdc); + } + } + + /* Try to find about LCDA */ if(ivideo.vbflags & (VB_302B | VB_301LV | VB_302LV)) { int tmp; inSISIDXREG(SISCR,0x34,tmp); @@ -4727,7 +4915,7 @@ } if(SiS_Pr.SiS_UseLCDA) { sisfb_detectedlcda = 0x03; - printk(KERN_INFO + printk(KERN_DEBUG "sisfb: Bridge uses LCDA for low resolution and text modes\n"); } } @@ -4738,7 +4926,7 @@ if (!sisfb_crt1off) { sisfb_handle_ddc(&sisfb_thismonitor, 0); } else { - if ((ivideo.vbflags & (VB_301|VB_301B|VB_302B)) && + if ((ivideo.vbflags & (VB_301|VB_301B|VB_301C|VB_302B)) && (ivideo.vbflags & (CRT2_VGA | CRT2_LCD))) { sisfb_handle_ddc(&sisfb_thismonitor, 1); } @@ -4839,7 +5027,7 @@ default_var.xres = default_var.xres_virtual = ivideo.video_width; default_var.yres = default_var.yres_virtual = ivideo.video_height; default_var.bits_per_pixel = ivideo.video_bpp; - + sisfb_bpp_to_var(&default_var); default_var.pixclock = (u32) (1E12 / @@ -4856,7 +5044,7 @@ default_var.pixclock <<= 1; } } - + ivideo.accel = 0; if(sisfb_accel) { ivideo.accel = -1; @@ -4870,7 +5058,7 @@ if(default_var.yres_virtual <= default_var.yres) { default_var.yres_virtual = default_var.yres; } - } + } sis_fb_info.flags = FBINFO_FLAG_DEFAULT; sis_fb_info.var = default_var; @@ -4878,6 +5066,9 @@ sis_fb_info.par = &ivideo; sis_fb_info.screen_base = ivideo.video_vbase; sis_fb_info.fbops = &sisfb_ops; +#if 0 /* Waits for class patch to go in */ + sis_fb_info.dev = &pdev->dev; +#endif sisfb_get_fix(&sis_fb_info.fix, -1, &sis_fb_info); sis_fb_info.pseudo_palette = pseudo_palette; @@ -4893,6 +5084,7 @@ if(ivideo.mtrr) { printk(KERN_INFO "sisfb: Added MTRRs\n"); } + #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) @@ -4913,6 +5105,7 @@ sisfb_registered = 1; printk(KERN_INFO "sisfb: Installed SISFB_GET_INFO ioctl (%x)\n", SISFB_GET_INFO); + printk(KERN_INFO "sisfb: Installed SISFB_GET_VBRSTATUS ioctl (%x)\n", SISFB_GET_VBRSTATUS); printk(KERN_INFO "sisfb: 2D acceleration is %s, scrolling mode %s\n", sisfb_accel ? "enabled" : "disabled", @@ -4956,8 +5149,11 @@ static int useoem = -1; static char *tvstandard = NULL; static int nocrt2rate = 0; +static int scalelcd = -1; +static char *specialtiming = NULL; +static int lvdshl = -1; -MODULE_DESCRIPTION("SiS 300/540/630/730/315/550/650/740/330/660 framebuffer driver"); +MODULE_DESCRIPTION("SiS 300/540/630/730/315/550/650/651/661/740/741/330 framebuffer driver"); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Thomas Winischhofer ; SiS; Various others"); @@ -5024,11 +5220,12 @@ MODULE_PARM(mem, "i"); MODULE_PARM_DESC(mem, "\nDetermines the beginning of the video memory heap in KB. This heap is used\n" - "for video RAM management for eg. DRM/DRI. The default depends on the amount\n" - "of video RAM available. If 8MB of video RAM or less is available, the heap\n" - "starts at 4096KB, if between 8 and 16MB are available at 8192KB, otherwise\n" - "at 12288KB. The value is to be specified without 'KB' and should match\n" - "the MaxXFBMem setting for XFree 4.x (x>=2)."); + "for video RAM management for eg. DRM/DRI. On 300 series, the default depends\n" + "on the amount of video RAM available. If 8MB of video RAM or less is available,\n" + "the heap starts at 4096KB, if between 8 and 16MB are available at 8192KB,\n" + "otherwise at 12288KB. On 315 and Xabre series, the heap is 1MB by default. The\n" + "value is to be specified without 'KB' and should match the MaxXFBMem setting for\n" + "XFree 4.x (x>=2)."); MODULE_PARM(forcecrt2type, "s"); MODULE_PARM_DESC(forcecrt2type, @@ -5046,11 +5243,12 @@ MODULE_PARM(pdc, "i"); MODULE_PARM_DESC(pdc, - "\n(300 series only) This is for manually selecting the LCD panel delay\n" - "compensation. The driver should detect this correctly in most cases; however,\n" - "sometimes this is not possible. If you see 'small waves' on the LCD, try\n" - "setting this to 4, 32 or 24. If the problem persists, try other values\n" - "between 4 and 60 in steps of 4. (default: [autodetected])"); + "\nThis is for manually selecting the LCD panel delay compensation. The driver\n" + "should detect this correctly in most cases; however, sometimes this is not\n" + "possible. If you see 'small waves' on the LCD, try setting this to 4, 32 or 24\n" + "on a 300 series chipset; 3 or 51 on a 315 series chipset. If the problem persists,\n" + "try other values (on 300 series: between 4 and 60 in steps of 4; on 315 series:\n" + "and value from 0 to 255). (default: [autodetected])"); MODULE_PARM(noaccel, "i"); MODULE_PARM_DESC(noaccel, @@ -5060,8 +5258,7 @@ MODULE_PARM(noypan, "i"); MODULE_PARM_DESC(noypan, "\nIf set to anything other than 0, y-panning will be disabled and scrolling\n" - "will be performed by redrawing the screen. This required 2D acceleration, so\n" - "if the option noaccel is set, y-panning will be disabled. (default: 0)"); + "will be performed by redrawing the screen. (default: 0)"); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) MODULE_PARM(inverse, "i"); @@ -5078,24 +5275,44 @@ MODULE_PARM(useoem, "i"); MODULE_PARM_DESC(useoem, "\nSetting this to 0 keeps sisfb from using its internel OEM data for some LCD\n" - "panels and TV connector types. (default: auto)"); + "panels and TV connector types. (default: [auto])"); MODULE_PARM(tvstandard, "s"); MODULE_PARM_DESC(tvstandard, "\nThis allows overriding the BIOS default for the TV standard. Valid choices are\n" - "pal and ntsc. (default: auto)"); + "pal and ntsc. (default: [auto])"); MODULE_PARM(nocrt2rate, "i"); MODULE_PARM_DESC(nocrt2rate, "\nSetting this to 1 will force the driver to use the default refresh rate for\n" - "CRT2 if CRT2 type is VGA. (default: 0, use same rate as crt1)"); - + "CRT2 if CRT2 type is VGA. (default: 0, use same rate as CRT1)"); + +MODULE_PARM(scalelcd, "i"); +MODULE_PARM_DESC(scalelcd, + "\nSetting this to 1 will force the driver to scale the LCD image to the panel's\n" + "native resolution. Setting it to 0 will disable scaling; if the panel can scale\n" + "by itself, it will probably do this, otherwise you will see a black bar around\n" + "the screen image. Default: [autodetect if panel can scale]"); + +MODULE_PARM(specialtiming, "s"); + +MODULE_PARM(lvdshl, "i"); + + int init_module(void) { int err; + SiS_Pr.UsePanelScaler = -1; + SiS_Pr.SiS_CustomT = CUT_NONE; + SiS_Pr.LVDSHL = -1; + ivideo.refresh_rate = sisfb_parm_rate = rate; + if((scalelcd == 0) || (scalelcd == 1)) { + SiS_Pr.UsePanelScaler = scalelcd ^ 1; + } + if(mode) sisfb_search_mode(mode, FALSE); else if(vesa != -1) @@ -5150,14 +5367,15 @@ sisfb_accel = 0; } - if(pdc) { - if(!(pdc & ~0x3c)) { - sisfb_pdc = pdc & 0x3c; - } - } - + if(pdc) sisfb_pdc = pdc & 0x3c; + sisfb_nocrt2rate = nocrt2rate; + if(specialtiming) + sisfb_search_specialtiming(specialtiming); + + if((lvdshl >= 0) && (lvdshl <= 3)) SiS_Pr.LVDSHL = lvdshl; + if((err = sisfb_init()) < 0) return err; return 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/sis_main.h linux-2.4.23-pre8/drivers/video/sis/sis_main.h --- linux-2.4.22/drivers/video/sis/sis_main.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/sis_main.h 2003-10-22 22:48:15.000000000 +0000 @@ -12,7 +12,7 @@ #define VER_MAJOR 1 #define VER_MINOR 6 -#define VER_LEVEL 11 +#define VER_LEVEL 16 #include "sis.h" @@ -35,13 +35,16 @@ #ifndef PCI_DEVICE_ID_SI_660_VGA #define PCI_DEVICE_ID_SI_660_VGA 0x6330 #endif +#ifndef PCI_DEVICE_ID_SI_760 +#define PCI_DEVICE_ID_SI_760 0x0760 +#endif /* To be included in fb.h */ #ifndef FB_ACCEL_SIS_GLAMOUR_2 -#define FB_ACCEL_SIS_GLAMOUR_2 40 /* SiS 315, 650, 740 */ +#define FB_ACCEL_SIS_GLAMOUR_2 40 /* SiS 315, 650, 661, 740 */ #endif #ifndef FB_ACCEL_SIS_XABRE -#define FB_ACCEL_SIS_XABRE 41 /* SiS 330 ("Xabre") */ +#define FB_ACCEL_SIS_XABRE 41 /* SiS 330 ("Xabre"), 660, 760 (DOA) */ #endif #define MAX_ROM_SCAN 0x10000 @@ -57,7 +60,7 @@ #define TURBO_QUEUE_AREA_SIZE 0x80000 /* 512K */ #endif -/* For 315 series */ +/* For 315/Xabre series */ #ifdef CONFIG_FB_SIS_315 #define COMMAND_QUEUE_AREA_SIZE 0x80000 /* 512K */ #define COMMAND_QUEUE_THRESHOLD 0x1F @@ -325,7 +328,7 @@ .xpanstep = 0, .ypanstep = 1, }; -static char myid[20]; +static char myid[40]; static u32 pseudo_palette[17]; #endif @@ -370,7 +373,7 @@ VGA_ENGINE sisvga_engine = UNKNOWN_VGA; int sisfb_accel = -1; -/* TW: These are to adapted according to VGA_ENGINE type */ +/* These are to adapted according to VGA_ENGINE type */ static int sisfb_hwcursor_size = 0; static int sisfb_CRT2_write_enable = 0; @@ -423,9 +426,11 @@ {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_315, "SIS 315"}, {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_315PRO, "SIS 315PRO"}, {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_550_VGA, "SIS 550 VGA"}, - {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_650_VGA, "SIS 650/M650/651/740 VGA"}, + {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_650_VGA, "SIS 650/M650/651/661FX/M661FX/740/741 VGA"}, {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_330, "SIS 330"}, - {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_660_VGA, "SIS 660 VGA"}, +#if 0 + {PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_660_VGA, "SIS 660/M660/760/M760 VGA"}, +#endif {0, 0, NULL} }; @@ -483,13 +488,17 @@ {"720x576x16", 0x34, 0x0000, 0x0000, 720, 576, 16, 1, 90, 36, MD_SIS300|MD_SIS315}, {"720x576x24", 0x36, 0x0000, 0x0000, 720, 576, 32, 1, 90, 36, MD_SIS300|MD_SIS315}, {"720x576x32", 0x36, 0x0000, 0x0000, 720, 576, 32, 1, 90, 36, MD_SIS300|MD_SIS315}, + {"768x576x8", 0x5f, 0x0000, 0x0000, 768, 576, 8, 1, 96, 36, MD_SIS300|MD_SIS315}, + {"768x576x16", 0x60, 0x0000, 0x0000, 768, 576, 16, 1, 96, 36, MD_SIS300|MD_SIS315}, + {"768x576x24", 0x61, 0x0000, 0x0000, 768, 576, 32, 1, 96, 36, MD_SIS300|MD_SIS315}, + {"768x576x32", 0x61, 0x0000, 0x0000, 768, 576, 32, 1, 96, 36, MD_SIS300|MD_SIS315}, {"800x480x8", 0x70, 0x0000, 0x0000, 800, 480, 8, 1, 100, 30, MD_SIS300|MD_SIS315}, {"800x480x16", 0x7a, 0x0000, 0x0000, 800, 480, 16, 1, 100, 30, MD_SIS300|MD_SIS315}, {"800x480x24", 0x76, 0x0000, 0x0000, 800, 480, 32, 1, 100, 30, MD_SIS300|MD_SIS315}, {"800x480x32", 0x76, 0x0000, 0x0000, 800, 480, 32, 1, 100, 30, MD_SIS300|MD_SIS315}, -#define DEFAULT_MODE 39 /* index for 800x600x8 */ -#define DEFAULT_LCDMODE 39 /* index for 800x600x8 */ -#define DEFAULT_TVMODE 39 /* index for 800x600x8 */ +#define DEFAULT_MODE 43 /* index for 800x600x8 */ +#define DEFAULT_LCDMODE 43 /* index for 800x600x8 */ +#define DEFAULT_TVMODE 43 /* index for 800x600x8 */ {"800x600x8", 0x30, 0x0103, 0x0103, 800, 600, 8, 2, 100, 37, MD_SIS300|MD_SIS315}, {"800x600x16", 0x47, 0x0114, 0x0114, 800, 600, 16, 2, 100, 37, MD_SIS300|MD_SIS315}, {"800x600x24", 0x63, 0x013b, 0x0115, 800, 600, 32, 2, 100, 37, MD_SIS300|MD_SIS315}, @@ -526,7 +535,7 @@ {"1280x720x16", 0x75, 0x0000, 0x0000, 1280, 720, 16, 1, 160, 45, MD_SIS300|MD_SIS315}, {"1280x720x24", 0x78, 0x0000, 0x0000, 1280, 720, 32, 1, 160, 45, MD_SIS300|MD_SIS315}, {"1280x720x32", 0x78, 0x0000, 0x0000, 1280, 720, 32, 1, 160, 45, MD_SIS300|MD_SIS315}, -#define MODEINDEX_1280x768 75 +#define MODEINDEX_1280x768 79 {"1280x768x8", 0x23, 0x0000, 0x0000, 1280, 768, 8, 1, 160, 48, MD_SIS300|MD_SIS315}, {"1280x768x16", 0x24, 0x0000, 0x0000, 1280, 768, 16, 1, 160, 48, MD_SIS300|MD_SIS315}, {"1280x768x24", 0x25, 0x0000, 0x0000, 1280, 768, 32, 1, 160, 48, MD_SIS300|MD_SIS315}, @@ -575,11 +584,11 @@ u8 sisfb_mode_no = 0; u8 sisfb_rate_idx = 0; -/* TW: CR36 evaluation */ +/* CR36 evaluation */ const USHORT sis300paneltype[] = { LCD_UNKNOWN, LCD_800x600, LCD_1024x768, LCD_1280x1024, LCD_1280x960, LCD_640x480, LCD_1024x600, LCD_1152x768, - LCD_1024x768, LCD_1024x768, LCD_1024x768, LCD_1024x768, + LCD_1024x768, LCD_1024x768, LCD_1024x768, LCD_1024x768, LCD_1024x768, LCD_1024x768, LCD_320x480, LCD_1024x768 }; const USHORT sis310paneltype[] = @@ -604,17 +613,8 @@ {"SVIDEO", CRT2_TV, TV_SVIDEO, 0}, {"COMPOSITE", CRT2_TV, TV_AVIDEO, 0}, {"SCART", CRT2_TV, TV_SCART, 0}, - {"none", 0, -1, 0}, - {"lcd", CRT2_LCD, -1, 0}, - {"tv", CRT2_TV, -1, 0}, - {"vga", CRT2_VGA, -1, 0}, - {"svideo", CRT2_TV, TV_SVIDEO, 0}, - {"composite", CRT2_TV, TV_AVIDEO, 0}, - {"scart", CRT2_TV, TV_SCART, 0}, {"DSTN", CRT2_LCD, -1, FL_550_DSTN}, - {"dstn", CRT2_LCD, -1, FL_550_DSTN}, {"FSTN", CRT2_LCD, -1, FL_550_FSTN}, - {"fstn", CRT2_LCD, -1, FL_550_FSTN}, {"\0", -1, -1, 0} }; @@ -626,9 +626,6 @@ {"AGP", AGP_CMD_QUEUE}, {"VRAM", VM_CMD_QUEUE}, {"MMIO", MMIO_CMD}, - {"agp", AGP_CMD_QUEUE}, - {"vram", VM_CMD_QUEUE}, - {"mmio", MMIO_CMD}, {"\0", -1} }; @@ -639,8 +636,6 @@ } sis_tvtype[] = { {"PAL", TV_PAL}, {"NTSC", TV_NTSC}, - {"pal", TV_PAL}, - {"ntsc", TV_NTSC}, {"\0", -1} }; @@ -662,6 +657,7 @@ {7, 640, 480, 160, TRUE}, {8, 640, 480, 200, TRUE}, {1, 720, 480, 60, TRUE}, {1, 720, 576, 58, TRUE}, + {1, 768, 576, 58, TRUE}, {1, 800, 480, 60, TRUE}, {2, 800, 480, 75, TRUE}, {3, 800, 480, 85, TRUE}, {1, 800, 600, 56, TRUE}, {2, 800, 600, 60, TRUE}, {3, 800, 600, 72, TRUE}, {4, 800, 600, 75, TRUE}, {5, 800, 600, 85, TRUE}, {6, 800, 600, 105, TRUE}, @@ -760,26 +756,63 @@ unsigned short chipID; char *biosversion; char *biosdate; + unsigned long bioschksum; unsigned short biosFootprintAddr[5]; unsigned char biosFootprintData[5]; + unsigned short pcisubsysvendor; + unsigned short pcisubsyscard; char *vendorName; char *cardName; unsigned long SpecialID; char *optionName; } mycustomttable[] = { { SIS_630, "2.00.07", "09/27/2002-13:38:25", + 0x3240A8, { 0x220, 0x227, 0x228, 0x229, 0x22a }, { 0x01, 0xe3, 0x9a, 0x6a, 0x00 }, + 0x1039, 0x6300, "Barco", "iQ R200L/300/400", CUT_BARCO1366, "BARCO1366" }, { SIS_630, "2.00.07", "09/27/2002-13:38:25", + 0x323FBD, { 0x220, 0x227, 0x228, 0x229, 0x22a }, { 0x00, 0x5a, 0x64, 0x41, 0x00 }, + 0x1039, 0x6300, "Barco", "iQ G200L/300/400/500", CUT_BARCO1024, "BARCO1024" }, + { SIS_650, "", "", + 0, + { 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0 }, + 0x0e11, 0x083c, + "Compaq", "Presario 3017cl/3045US", CUT_COMPAQ12802, "COMPAQ1280" + }, + { SIS_650, "", "", + 0, + { 0x00c, 0, 0, 0, 0 }, + { 'e' , 0, 0, 0, 0 }, + 0x1558, 0x0287, + "Clevo", "L285/L287 (Version 1)", CUT_CLEVO1024, "CLEVO1024" + }, + { SIS_650, "", "", + 0, + { 0x00c, 0, 0, 0, 0 }, + { 'y' , 0, 0, 0, 0 }, + 0x1558, 0x0287, + "Clevo", "L285/L287 (Version 2)", CUT_CLEVO10242, "CLEVO10242" + }, + { 4321, "", "", /* This is hopefully NEVER autodetected */ + 0, + { 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0 }, + 0, 0, + "Generic", "LVDS/Parallel 848x480", CUT_PANEL848, "PANEL848x480" + }, { 0, "", "", + 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, + 0, 0, "", "", CUT_NONE, "" } }; @@ -841,7 +874,7 @@ {0xF8,0xF4,0x18,0x38}, {0xFC,0xFB,0x14,0x2A}, {0x00,0x00,0x10,0x20}, - {0x00,0x04,0x10,0x18}, + {0x00,0x04,0x10,0x18}, {0xFF,0xFF,0xFF,0xFF} }}, { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_2 */ {0xF5,0xEE,0x1B,0x44}, @@ -861,7 +894,7 @@ {0xF9,0x0A,0x17,0x0C}, {0x00,0x07,0x10,0x12}, {0xFF,0xFF,0xFF,0xFF} }}, - { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_4 */ + { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_4 - 320 */ {0x00,0xE0,0x10,0x60}, {0x00,0xEE,0x10,0x44}, {0x00,0xF4,0x10,0x38}, @@ -870,7 +903,7 @@ {0x00,0x00,0x10,0x20}, {0x00,0x04,0x10,0x18}, {0xFF,0xFF,0xFF,0xFF} }}, - { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_5 */ + { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_5 - 640 */ {0xF5,0xEE,0x1B,0x44}, {0xF8,0xF4,0x18,0x38}, {0xEB,0x04,0x25,0x18}, @@ -879,7 +912,7 @@ {0xFA,0x06,0x16,0x14}, {0x00,0x04,0x10,0x18}, {0xFF,0xFF,0xFF,0xFF} }}, - { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_6 */ + { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_6 - 720 */ {0xEB,0x04,0x25,0x18}, {0xE7,0x0E,0x29,0x04}, {0xEE,0x0C,0x22,0x08}, @@ -888,7 +921,7 @@ {0xFC,0x0A,0x14,0x0C}, {0x00,0x08,0x10,0x10}, {0xFF,0xFF,0xFF,0xFF} }}, - { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_7 */ + { {{0x00,0x00,0x00,0x40}, /* NTSCFilter_7 - 800 */ {0xEC,0x02,0x24,0x1C}, {0xF2,0x04,0x1E,0x18}, {0xEB,0x15,0x25,0xF6}, @@ -933,7 +966,7 @@ {0xFB,0x04,0x15,0x18}, {0x00,0x06,0x10,0x14}, {0xFF,0xFF,0xFF,0xFF} }}, - { {{0x00,0x00,0x00,0x40}, /* PALFilter_4 */ + { {{0x00,0x00,0x00,0x40}, /* PALFilter_4 - 320 */ {0x00,0xE0,0x10,0x60}, {0x00,0xEE,0x10,0x44}, {0x00,0xF4,0x10,0x38}, @@ -942,7 +975,7 @@ {0x00,0x00,0x10,0x20}, {0x00,0x04,0x10,0x18}, {0xFF,0xFF,0xFF,0xFF} }}, - { {{0x00,0x00,0x00,0x40}, /* PALFilter_5 */ + { {{0x00,0x00,0x00,0x40}, /* PALFilter_5 - 640 */ {0xF5,0xEE,0x1B,0x44}, {0xF8,0xF4,0x18,0x38}, {0xF1,0xF7,0x1F,0x32}, @@ -951,7 +984,7 @@ {0xFB,0x01,0x15,0x1E}, {0x00,0x04,0x10,0x18}, {0xFF,0xFF,0xFF,0xFF} }}, - { {{0x00,0x00,0x00,0x40}, /* PALFilter_6 */ + { {{0x00,0x00,0x00,0x40}, /* PALFilter_6 - 720 */ {0xF5,0xEE,0x1B,0x2A}, {0xEE,0xFE,0x22,0x24}, {0xF3,0x00,0x1D,0x20}, @@ -960,7 +993,7 @@ {0xFB,0x04,0x15,0x18}, {0x00,0x06,0x10,0x14}, {0xFF,0xFF,0xFF,0xFF} }}, - { {{0x00,0x00,0x00,0x40}, /* PALFilter_7 */ + { {{0x00,0x00,0x00,0x40}, /* PALFilter_7 - 800 */ {0xF5,0xEE,0x1B,0x44}, {0xF8,0xF4,0x18,0x38}, {0xFC,0xFB,0x14,0x2A}, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/vgatypes.h linux-2.4.23-pre8/drivers/video/sis/vgatypes.h --- linux-2.4.22/drivers/video/sis/vgatypes.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/vgatypes.h 2003-10-22 22:47:28.000000000 +0000 @@ -27,7 +27,8 @@ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * - * Author: Thomas Winischhofer + * Authors: Thomas Winischhofer + * Silicon Integrated Systems * */ #ifndef _VGATYPES_ @@ -132,6 +133,7 @@ SIS_740, SIS_330, SIS_660, + SIS_760, MAX_SIS_CHIP } SIS_CHIP_TYPE; #endif @@ -146,6 +148,7 @@ VB_CHIP_302, VB_CHIP_302B, VB_CHIP_302LV, + VB_CHIP_301C, VB_CHIP_UNKNOWN, /* other video bridge or no video bridge */ MAX_VB_CHIP } SIS_VB_CHIP_TYPE; @@ -170,6 +173,7 @@ LCD_1024x600, LCD_640x480_2, /* FSTN, DSTN */ LCD_640x480_3, /* FSTN, DSTN */ + LCD_848x480, LCD_CUSTOM, LCD_UNKNOWN } SIS_LCD_TYPE; @@ -309,7 +313,13 @@ unsigned char sisfb_lcda; - char reserved[235]; /* for future use */ + unsigned long sisfb_vbflags; + unsigned long sisfb_currentvbflags; + + int sisfb_scalelcd; + unsigned long sisfb_specialtiming; + + char reserved[219]; /* for future use */ }; #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/sis/vstruct.h linux-2.4.23-pre8/drivers/video/sis/vstruct.h --- linux-2.4.22/drivers/video/sis/vstruct.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/sis/vstruct.h 2003-10-22 22:47:46.000000000 +0000 @@ -27,8 +27,8 @@ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. * - * Author: Thomas Winischhofer - * ? + * Authors: Thomas Winischhofer + * Silicon Integrated Systems * */ @@ -214,10 +214,15 @@ typedef UCHAR DRAM4Type[4]; /* Defines for SiS_Customt */ -#define CUT_NONE 0 -#define CUT_FORCENONE 1 -#define CUT_BARCO1366 2 -#define CUT_BARCO1024 3 +#define CUT_NONE 0 +#define CUT_FORCENONE 1 +#define CUT_BARCO1366 2 +#define CUT_BARCO1024 3 +#define CUT_COMPAQ1280 4 +#define CUT_COMPAQ12802 5 +#define CUT_PANEL848 6 +#define CUT_CLEVO1024 7 +#define CUT_CLEVO10242 8 typedef struct _SiS_Private { @@ -443,6 +448,8 @@ const SiS_LVDSDataStruct *SiS_LVDSBARCO1366Data_2; const SiS_LVDSDataStruct *SiS_LVDSBARCO1024Data_1; const SiS_LVDSDataStruct *SiS_LVDSBARCO1024Data_2; + const SiS_LVDSDataStruct *SiS_LVDS848x480Data_1; + const SiS_LVDSDataStruct *SiS_LVDS848x480Data_2; const SiS_LVDSDataStruct *SiS_CHTVUNTSCData; const SiS_LVDSDataStruct *SiS_CHTVONTSCData; const SiS_LVDSDataStruct *SiS_CHTVUPALData; @@ -631,6 +638,8 @@ BOOLEAN SiS_CHPALM; BOOLEAN SiS_CHPALN; + + int LVDSHL; BOOLEAN Backup; UCHAR Backup_Mode; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/tdfxfb.c linux-2.4.23-pre8/drivers/video/tdfxfb.c --- linux-2.4.22/drivers/video/tdfxfb.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/tdfxfb.c 2003-10-22 22:48:16.000000000 +0000 @@ -764,7 +764,11 @@ tdfx_outl(SRCXY, 0); tdfx_outl(DSTXY, xx | (yy << 16)); tdfx_outl(COMMAND_2D, COMMAND_2D_H2S_BITBLT | (ROP_COPY << 24)); +#ifdef __BIG_ENDIAN + tdfx_outl(SRCFORMAT, 0x400000 | BIT(20) ); +#else tdfx_outl(SRCFORMAT, 0x400000); +#endif tdfx_outl(DSTFORMAT, fmt); tdfx_outl(DSTSIZE, fontwidth(p) | (fontheight(p) << 16)); i=fontheight(p); @@ -822,7 +826,11 @@ tdfx_outl(COMMAND_3D, COMMAND_3D_NOP); tdfx_outl(COLORFORE, fgx); tdfx_outl(COLORBACK, bgx); +#ifdef __BIG_ENDIAN + tdfx_outl(SRCFORMAT, 0x400000 | BIT(20) ); +#else tdfx_outl(SRCFORMAT, 0x400000); +#endif tdfx_outl(DSTFORMAT, fmt); tdfx_outl(DSTSIZE, w | (h << 16)); tdfx_outl(SRCXY, 0); @@ -1475,6 +1483,7 @@ #if defined(__BIG_ENDIAN) switch (par->bpp) { case 8: + case 24: reg.miscinit0 &= ~(1 << 30); reg.miscinit0 &= ~(1 << 31); break; @@ -1482,7 +1491,6 @@ reg.miscinit0 |= (1 << 30); reg.miscinit0 |= (1 << 31); break; - case 24: case 32: reg.miscinit0 |= (1 << 30); reg.miscinit0 &= ~(1 << 31); @@ -1635,10 +1643,6 @@ v.blue.length = 5; break; case 24: - v.red.offset=16; - v.green.offset=8; - v.blue.offset=0; - v.red.length = v.green.length = v.blue.length = 8; case 32: v.red.offset = 16; v.green.offset = 8; @@ -1942,6 +1946,12 @@ break; } + if (pci_enable_device(pdev)) + { + printk(KERN_WARNING "fb: Unable to enable %s PCI device.\n", name); + return -ENXIO; + } + fb_info.regbase_phys = pci_resource_start(pdev, 0); fb_info.regbase_size = 1 << 24; fb_info.regbase_virt = ioremap_nocache(fb_info.regbase_phys, 1 << 24); @@ -1970,6 +1980,13 @@ fb_info.iobase = pci_resource_start (pdev, 2); + if (!fb_info.iobase) { + printk(KERN_WARNING "fb: Can't access %s I/O ports.\n", name); + iounmap(fb_info.regbase_virt); + iounmap(fb_info.bufbase_virt); + return -ENXIO; + } + printk("fb: %s memory = %ldK\n", name, fb_info.bufbase_size >> 10); #ifdef CONFIG_MTRR @@ -2363,10 +2380,25 @@ unsigned int h,to; tdfxfb_createcursorshape(p); - xline = ~((1 << (32 - fb_info.cursor.w)) - 1); + xline = (~0) << (32 - fb_info.cursor.w); #ifdef __LITTLE_ENDIAN xline = swab32(xline); +#else + switch (p->var.bits_per_pixel) { + case 8: + case 24: + xline = swab32(xline); + break; + case 16: + xline = ((xline & 0xff000000 ) >> 16 ) + | ((xline & 0x00ff0000 ) >> 16 ) + | ((xline & 0x0000ff00 ) << 16 ) + | ((xline & 0x000000ff ) << 16 ); + break; + case 32: + break; + } #endif cursorbase=(u8*)fb_info.bufbase_virt; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/drivers/video/vesafb.c linux-2.4.23-pre8/drivers/video/vesafb.c --- linux-2.4.22/drivers/video/vesafb.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/drivers/video/vesafb.c 2003-10-22 22:47:40.000000000 +0000 @@ -93,7 +93,11 @@ } fbcon_cmap; static int inverse = 0; +#ifdef __x86_64__ +static int mtrr = 1; +#else static int mtrr = 0; +#endif static int vram __initdata = 0; /* needed for vram boot option */ static int currcon = 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/Config.in linux-2.4.23-pre8/fs/Config.in --- linux-2.4.22/fs/Config.in 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/Config.in 2003-10-22 22:49:10.000000000 +0000 @@ -72,9 +72,13 @@ bool '/proc file system support' CONFIG_PROC_FS +# For some reason devfs corrupts memory badly on x86-64. Disable it +# for now. +if [ "$CONFIG_X86_64" != "y" ] ; then dep_bool '/dev file system support (EXPERIMENTAL)' CONFIG_DEVFS_FS $CONFIG_EXPERIMENTAL dep_bool ' Automatically mount at boot' CONFIG_DEVFS_MOUNT $CONFIG_DEVFS_FS dep_bool ' Debug devfs' CONFIG_DEVFS_DEBUG $CONFIG_DEVFS_FS +fi # It compiles as a module for testing only. It should not be used # as a module in general. If we make this "tristate", a bunch of people diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/buffer.c linux-2.4.23-pre8/fs/buffer.c --- linux-2.4.22/fs/buffer.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/buffer.c 2003-10-22 22:49:02.000000000 +0000 @@ -88,6 +88,13 @@ static int osync_buffers_list(struct list_head *); static void __refile_buffer(struct buffer_head *); +/* + * A global sysctl-controlled flag which puts the machine into "laptop mode" + */ +int laptop_mode; + +static DECLARE_WAIT_QUEUE_HEAD(kupdate_wait); + /* This is used by some architectures to estimate available memory. */ atomic_t buffermem_pages = ATOMIC_INIT(0); @@ -612,7 +619,7 @@ if (buffer_attached(bh)) list_del(&bh->b_inode_buffers); set_buffer_attached(bh); - list_add(&bh->b_inode_buffers, list); + list_add_tail(&bh->b_inode_buffers, list); spin_unlock(&lru_list_lock); } @@ -1016,7 +1023,7 @@ dirty *= 100; dirty_limit = tot * bdf_prm.b_un.nfract_stop_bdflush; - if (dirty > dirty_limit) + if (!laptop_mode && dirty > dirty_limit) return 0; return 1; } @@ -1066,6 +1073,8 @@ void mark_buffer_dirty(struct buffer_head *bh) { if (!atomic_set_buffer_dirty(bh)) { + if (block_dump) + printk("%s: dirtied buffer\n", current->comm); __mark_dirty(bh); balance_dirty(); } @@ -1077,6 +1086,12 @@ } EXPORT_SYMBOL(set_buffer_flushtime); +inline int get_buffer_flushtime(void) +{ + return bdf_prm.b_un.interval; +} +EXPORT_SYMBOL(get_buffer_flushtime); + /* * A buffer may need to be moved from one buffer list to another * (e.g. in case it is not shared any more). Handle this. @@ -1749,7 +1764,7 @@ if (!buffer_mapped(bh)) { if (iblock < lblock) { if (get_block(inode, iblock, bh, 0)) - continue; + SetPageError(page); } if (!buffer_mapped(bh)) { memset(kmap(page) + i*blocksize, 0, blocksize); @@ -1769,10 +1784,11 @@ if (!nr) { /* - * all buffers are uptodate - we can set the page - * uptodate as well. + * All buffers are uptodate - we can set the page uptodate + * as well. But not if get_block() returned an error. */ - SetPageUptodate(page); + if (!PageError(page)) + SetPageUptodate(page); UnlockPage(page); return 0; } @@ -2751,10 +2767,10 @@ #endif printk("Buffer memory: %6dkB\n", - atomic_read(&buffermem_pages) << (PAGE_SHIFT-10)); + atomic_read(&buffermem_pages) << (PAGE_SHIFT-10)); - printk("Cache memory: %6dkB\n", - (atomic_read(&page_cache_size)- atomic_read(&buffermem_pages)) << (PAGE_SHIFT-10)); + printk("Cache memory: %6ldkB\n", + (page_cache_size - atomic_read(&buffermem_pages)) << (PAGE_SHIFT-10)); #ifdef CONFIG_SMP /* trylock does nothing on UP and so we could deadlock */ if (!spin_trylock(&lru_list_lock)) @@ -2859,6 +2875,12 @@ wake_up_interruptible(&bdflush_wait); } +void wakeup_kupdate(void) +{ + if (waitqueue_active(&kupdate_wait)) + wake_up(&kupdate_wait); +} + /* * Here we attempt to write back old buffers. We also try to flush inodes * and supers as well, since this function is essentially "update", and @@ -2879,7 +2901,9 @@ spin_lock(&lru_list_lock); bh = lru_list[BUF_DIRTY]; - if (!bh || time_before(jiffies, bh->b_flushtime)) + if (!bh) + break; + if (time_before(jiffies, bh->b_flushtime) && !laptop_mode) break; if (write_some_buffers(NODEV)) continue; @@ -3027,33 +3051,41 @@ complete((struct completion *)startup); for (;;) { + DECLARE_WAITQUEUE(wait, tsk); + + add_wait_queue(&kupdate_wait, &wait); + /* update interval */ interval = bdf_prm.b_un.interval; if (interval) { tsk->state = TASK_INTERRUPTIBLE; schedule_timeout(interval); } else { - stop_kupdate: tsk->state = TASK_STOPPED; schedule(); /* wait for SIGCONT */ } + remove_wait_queue(&kupdate_wait, &wait); /* check for sigstop */ if (signal_pending(tsk)) { - int stopped = 0; + int sig, stopped = 0; + struct siginfo info; + spin_lock_irq(&tsk->sigmask_lock); - if (sigismember(&tsk->pending.signal, SIGSTOP)) { - sigdelset(&tsk->pending.signal, SIGSTOP); + sig = dequeue_signal(¤t->blocked, &info); + if (sig == SIGSTOP) stopped = 1; - } - recalc_sigpending(tsk); spin_unlock_irq(&tsk->sigmask_lock); - if (stopped) - goto stop_kupdate; + if (stopped) { + tsk->state = TASK_STOPPED; + schedule(); /* wait for SIGCONT */ + } } #ifdef DEBUG printk(KERN_DEBUG "kupdate() activated...\n"); #endif sync_old_buffers(); + if (laptop_mode) + fsync_dev(NODEV); run_task_queue(&tq_disk); } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/exec.c linux-2.4.23-pre8/fs/exec.c --- linux-2.4.22/fs/exec.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/exec.c 2003-10-22 22:48:31.000000000 +0000 @@ -50,6 +50,7 @@ int core_uses_pid; char core_pattern[65] = "core"; +int core_setuid_ok = 0; /* The maximal length of core_pattern is also specified in sysctl.c */ static struct linux_binfmt *formats; @@ -425,11 +426,6 @@ struct mm_struct * mm, * old_mm; old_mm = current->mm; - if (old_mm && atomic_read(&old_mm->mm_users) == 1) { - mm_release(); - exit_mmap(old_mm); - return 0; - } mm = mm_alloc(); if (mm) { @@ -1104,13 +1100,18 @@ struct file * file; struct inode * inode; int retval = 0; + int fsuid = current->fsuid; lock_kernel(); binfmt = current->binfmt; if (!binfmt || !binfmt->core_dump) goto fail; if (!is_dumpable(current)) - goto fail; + { + if(!core_setuid_ok || !current->task_dumpable) + goto fail; + current->fsuid = 0; + } current->mm->dumpable = 0; if (current->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump) goto fail; @@ -1139,6 +1140,8 @@ close_fail: filp_close(file, NULL); fail: + if (fsuid != current->fsuid) + current->fsuid = fsuid; unlock_kernel(); return retval; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/fcntl.c linux-2.4.23-pre8/fs/fcntl.c --- linux-2.4.22/fs/fcntl.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/fs/fcntl.c 2003-10-22 22:47:44.000000000 +0000 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -293,6 +294,7 @@ * to fix this will be in libc. */ err = filp->f_owner.pid; + force_successful_syscall_return(); break; case F_SETOWN: lock_kernel(); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/inode.c linux-2.4.23-pre8/fs/inode.c --- linux-2.4.22/fs/inode.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/inode.c 2003-10-22 22:49:50.000000000 +0000 @@ -583,22 +583,25 @@ * Dispose-list gets a local list with local inodes in it, so it doesn't * need to worry about list corruption and SMP locks. */ -static void dispose_list(struct list_head * head) +static void dispose_list(struct list_head *head) { - struct list_head * inode_entry; - struct inode * inode; + int nr_disposed = 0; - while ((inode_entry = head->next) != head) - { - list_del(inode_entry); + while (!list_empty(head)) { + struct inode *inode; + + inode = list_entry(head->next, struct inode, i_list); + list_del(&inode->i_list); - inode = list_entry(inode_entry, struct inode, i_list); if (inode->i_data.nrpages) truncate_inode_pages(&inode->i_data, 0); clear_inode(inode); destroy_inode(inode); - inodes_stat.nr_inodes--; + nr_disposed++; } + spin_lock(&inode_lock); + inodes_stat.nr_inodes -= nr_disposed; + spin_unlock(&inode_lock); } /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jbd/journal.c linux-2.4.23-pre8/fs/jbd/journal.c --- linux-2.4.22/fs/jbd/journal.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/jbd/journal.c 2003-10-22 22:47:55.000000000 +0000 @@ -705,7 +705,7 @@ init_MUTEX(&journal->j_checkpoint_sem); init_MUTEX(&journal->j_sem); - journal->j_commit_interval = (HZ * 5); + journal->j_commit_interval = get_buffer_flushtime(); /* The journal is marked for error until we succeed with recovery! */ journal->j_flags = JFS_ABORT; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jbd/transaction.c linux-2.4.23-pre8/fs/jbd/transaction.c --- linux-2.4.22/fs/jbd/transaction.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jbd/transaction.c 2003-10-22 22:48:22.000000000 +0000 @@ -1581,9 +1581,6 @@ assert_spin_locked(&journal_datalist_lock); transaction = jh->b_transaction; -#ifdef __SMP__ - J_ASSERT (current->lock_depth >= 0); -#endif J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); if (jh->b_jlist != BJ_None) @@ -2016,9 +2013,6 @@ assert_spin_locked(&journal_datalist_lock); -#ifdef __SMP__ - J_ASSERT (current->lock_depth >= 0); -#endif J_ASSERT_JH(jh, jh->b_jlist < BJ_Types); J_ASSERT_JH(jh, jh->b_transaction == transaction || jh->b_transaction == 0); @@ -2108,9 +2102,6 @@ int was_dirty = 0; assert_spin_locked(&journal_datalist_lock); -#ifdef __SMP__ - J_ASSERT_JH(jh, current->lock_depth >= 0); -#endif /* If the buffer is now unused, just drop it. */ if (jh->b_next_transaction == NULL) { __journal_unfile_buffer(jh); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/inode.c linux-2.4.23-pre8/fs/jfs/inode.c --- linux-2.4.22/fs/jfs/inode.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/inode.c 2003-10-22 22:48:24.000000000 +0000 @@ -149,7 +149,7 @@ rc = txCommit(tid, 1, &inode, wait ? COMMIT_SYNC : 0); txEnd(tid); up(&JFS_IP(inode)->commit_sem); - return -rc; + return rc; } void jfs_write_inode(struct inode *inode, int wait) @@ -303,7 +303,7 @@ else IREAD_UNLOCK(ip); } - return -rc; + return rc; } static int jfs_writepage(struct page *page) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_btree.h linux-2.4.23-pre8/fs/jfs/jfs_btree.h --- linux-2.4.22/fs/jfs/jfs_btree.h 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_btree.h 2003-10-22 22:48:42.000000000 +0000 @@ -81,7 +81,7 @@ } else {\ P = NULL;\ jfs_err("bread failed!");\ - RC = EIO;\ + RC = -EIO;\ }\ }\ } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_dmap.c linux-2.4.23-pre8/fs/jfs/jfs_dmap.c --- linux-2.4.22/fs/jfs/jfs_dmap.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_dmap.c 2003-10-22 22:48:20.000000000 +0000 @@ -189,8 +189,8 @@ * * RETURN VALUES: * 0 - success - * ENOMEM - insufficient memory - * EIO - i/o error + * -ENOMEM - insufficient memory + * -EIO - i/o error */ int dbMount(struct inode *ipbmap) { @@ -205,7 +205,7 @@ /* allocate memory for the in-memory bmap descriptor */ bmp = kmalloc(sizeof(struct bmap), GFP_KERNEL); if (bmp == NULL) - return (ENOMEM); + return -ENOMEM; /* read the on-disk bmap descriptor. */ mp = read_metapage(ipbmap, @@ -213,7 +213,7 @@ PSIZE, 0); if (mp == NULL) { kfree(bmp); - return (EIO); + return -EIO; } /* copy the on-disk bmap descriptor to its in-memory version. */ @@ -268,7 +268,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error + * -EIO - i/o error */ int dbUnmount(struct inode *ipbmap, int mounterror) { @@ -316,7 +316,7 @@ PSIZE, 0); if (mp == NULL) { jfs_err("dbSync: read_metapage failed!"); - return (EIO); + return -EIO; } /* copy the in-memory version of the bmap to the on-disk version */ dbmp_le = (struct dbmap *) mp->data; @@ -368,7 +368,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error + * -EIO - i/o error */ int dbFree(struct inode *ip, s64 blkno, s64 nblocks) { @@ -414,7 +414,7 @@ mp = read_metapage(ipbmap, lblkno, PSIZE, 0); if (mp == NULL) { IREAD_UNLOCK(ipbmap); - return (EIO); + return -EIO; } dp = (struct dmap *) mp->data; @@ -463,7 +463,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error + * -EIO - i/o error */ int dbUpdatePMap(struct inode *ipbmap, @@ -503,7 +503,7 @@ mp = read_metapage(bmp->db_ipbmap, lblkno, PSIZE, 0); if (mp == NULL) - return (EIO); + return -EIO; } dp = (struct dmap *) mp->data; @@ -737,8 +737,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error */ int dbAlloc(struct inode *ip, s64 hint, s64 nblocks, s64 * results) { @@ -758,7 +758,7 @@ #ifdef _STILL_TO_PORT /* DASD limit check F226941 */ if (OVER_LIMIT(ip, nblocks)) - return ENOSPC; + return -ENOSPC; #endif /* _STILL_TO_PORT */ /* get the log2 number of blocks to be allocated. @@ -828,7 +828,7 @@ /* get the buffer for the dmap containing the hint. */ - rc = EIO; + rc = -EIO; lblkno = BLKTODMAP(blkno, bmp->db_l2nbperpage); mp = read_metapage(ipbmap, lblkno, PSIZE, 0); if (mp == NULL) @@ -840,7 +840,7 @@ * blocks beginning at the hint. */ if ((rc = dbAllocNext(bmp, dp, blkno, (int) nblocks)) - != ENOSPC) { + != -ENOSPC) { if (rc == 0) { *results = blkno; DBALLOC(bmp->db_DBmap, bmp->db_mapsize, @@ -869,7 +869,7 @@ */ if ((rc = dbAllocNear(bmp, dp, blkno, (int) nblocks, l2nb, results)) - != ENOSPC) { + != -ENOSPC) { if (rc == 0) { DBALLOC(bmp->db_DBmap, bmp->db_mapsize, *results, nblocks); @@ -884,7 +884,7 @@ * the same dmap as the hint. */ if ((rc = dbAllocDmapLev(bmp, dp, (int) nblocks, l2nb, results)) - != ENOSPC) { + != -ENOSPC) { if (rc == 0) { DBALLOC(bmp->db_DBmap, bmp->db_mapsize, *results, nblocks); @@ -904,7 +904,7 @@ */ IWRITE_LOCK(ipbmap); if ((rc = dbAllocAG(bmp, agno, nblocks, l2nb, results)) - != ENOSPC) { + != -ENOSPC) { if (rc == 0) DBALLOC(bmp->db_DBmap, bmp->db_mapsize, *results, nblocks); @@ -923,7 +923,7 @@ /* Try to allocate within this allocation group. if that fails, try to * allocate anywhere in the map. */ - if ((rc = dbAllocAG(bmp, agno, nblocks, l2nb, results)) == ENOSPC) + if ((rc = dbAllocAG(bmp, agno, nblocks, l2nb, results)) == -ENOSPC) rc = dbAllocAny(bmp, nblocks, l2nb, results); if (rc == 0) { DBALLOC(bmp->db_DBmap, bmp->db_mapsize, *results, nblocks); @@ -953,8 +953,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error */ int dbAllocExact(struct inode *ip, s64 blkno, int nblocks) { @@ -976,13 +976,13 @@ */ if (nblocks <= 0 || nblocks > BPERDMAP || blkno >= bmp->db_mapsize) { IREAD_UNLOCK(ipbmap); - return EINVAL; + return -EINVAL; } if (nblocks > ((s64) 1 << bmp->db_maxfreebud)) { /* the free space is no longer available */ IREAD_UNLOCK(ipbmap); - return ENOSPC; + return -ENOSPC; } /* read in the dmap covering the extent */ @@ -990,7 +990,7 @@ mp = read_metapage(ipbmap, lblkno, PSIZE, 0); if (mp == NULL) { IREAD_UNLOCK(ipbmap); - return (EIO); + return -EIO; } dp = (struct dmap *) mp->data; @@ -1038,8 +1038,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error */ int dbReAlloc(struct inode *ip, @@ -1053,7 +1053,7 @@ *results = blkno; return (0); } else { - if (rc != ENOSPC) + if (rc != -ENOSPC) return (rc); } @@ -1087,8 +1087,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error */ int dbExtend(struct inode *ip, s64 blkno, s64 nblocks, s64 addnblocks) { @@ -1106,7 +1106,7 @@ */ if (((rel_block = blkno & (sbi->nbperpage - 1))) && (rel_block + nblocks + addnblocks > sbi->nbperpage)) - return (ENOSPC); + return -ENOSPC; /* get the last block of the current allocation */ lastblkno = blkno + nblocks - 1; @@ -1133,7 +1133,7 @@ if (addnblocks > BPERDMAP || extblkno >= bmp->db_mapsize || (extblkno & (bmp->db_agsize - 1)) == 0) { IREAD_UNLOCK(ipbmap); - return (ENOSPC); + return -ENOSPC; } /* get the buffer for the dmap containing the first block @@ -1143,7 +1143,7 @@ mp = read_metapage(ipbmap, lblkno, PSIZE, 0); if (mp == NULL) { IREAD_UNLOCK(ipbmap); - return (EIO); + return -EIO; } DBALLOCCK(bmp->db_DBmap, bmp->db_mapsize, blkno, nblocks); @@ -1164,7 +1164,7 @@ } else { /* we were not successful */ release_metapage(mp); - assert(rc == ENOSPC || rc == EIO); + assert(rc == -ENOSPC || rc == -EIO); } return (rc); @@ -1185,8 +1185,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error * * serialization: IREAD_LOCK(ipbmap) held on entry/exit; */ @@ -1212,13 +1212,13 @@ * this dmap. */ if (dbitno + nblocks > BPERDMAP) - return (ENOSPC); + return -ENOSPC; /* check if the starting leaf indicates that anything * is free. */ if (leaf[word] == NOFREE) - return (ENOSPC); + return -ENOSPC; /* check the dmaps words corresponding to block range to see * if the block range is free. not all bits of the first and @@ -1247,7 +1247,7 @@ */ mask = (ONES << (DBWORD - nb) >> wbitno); if ((mask & ~le32_to_cpu(dp->wmap[word])) != mask) - return (ENOSPC); + return -ENOSPC; word += 1; } else { @@ -1265,7 +1265,7 @@ /* does the leaf describe any free space ? */ if (leaf[word] < BUDMIN) - return (ENOSPC); + return -ENOSPC; /* determine the l2 number of bits provided * by this leaf. @@ -1311,8 +1311,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error * * serialization: IREAD_LOCK(ipbmap) held on entry/exit; */ @@ -1360,7 +1360,7 @@ return (rc); } - return (ENOSPC); + return -ENOSPC; } @@ -1413,8 +1413,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error * * note: IWRITE_LOCK(ipmap) held on entry/exit; */ @@ -1457,8 +1457,8 @@ if (bmp->db_agsize == BPERDMAP || bmp->db_agfree[agno] == bmp->db_agsize) { rc = dbAllocCtl(bmp, nblocks, l2nb, blkno, results); - /* assert(!(rc == ENOSPC && bmp->db_agfree[agno] == bmp->db_agsize)); */ - if ((rc == ENOSPC) && + /* assert(!(rc == -ENOSPC && bmp->db_agfree[agno] == bmp->db_agsize)); */ + if ((rc == -ENOSPC) && (bmp->db_agfree[agno] == bmp->db_agsize)) { jfs_err("dbAllocAG: removed assert, but still need to " "debug here\nblkno = 0x%Lx, nblocks = 0x%Lx", @@ -1474,7 +1474,7 @@ lblkno = BLKTOCTL(blkno, bmp->db_l2nbperpage, bmp->db_aglevel); mp = read_metapage(bmp->db_ipbmap, lblkno, PSIZE, 0); if (mp == NULL) - return (EIO); + return -EIO; dcp = (struct dmapctl *) mp->data; budmin = dcp->budmin; @@ -1547,7 +1547,7 @@ if ((rc = dbFindCtl(bmp, l2nb, bmp->db_aglevel - 1, &blkno))) { - assert(rc != ENOSPC); + assert(rc != -ENOSPC); return (rc); } } @@ -1555,16 +1555,16 @@ /* allocate the blocks. */ rc = dbAllocCtl(bmp, nblocks, l2nb, blkno, results); - assert(rc != ENOSPC); + assert(rc != -ENOSPC); return (rc); } /* no space in the allocation group. release the buffer and - * return ENOSPC. + * return -ENOSPC. */ release_metapage(mp); - return (ENOSPC); + return -ENOSPC; } @@ -1589,8 +1589,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error * * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; */ @@ -1611,7 +1611,7 @@ /* allocate the blocks. */ rc = dbAllocCtl(bmp, nblocks, l2nb, blkno, results); - assert(rc != ENOSPC); + assert(rc != -ENOSPC); return (rc); } @@ -1639,8 +1639,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error * * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; */ @@ -1664,7 +1664,7 @@ lblkno = BLKTOCTL(b, bmp->db_l2nbperpage, lev); mp = read_metapage(bmp->db_ipbmap, lblkno, PSIZE, 0); if (mp == NULL) - return (EIO); + return -EIO; dcp = (struct dmapctl *) mp->data; budmin = dcp->budmin; @@ -1683,7 +1683,7 @@ */ if (rc) { assert(lev == level); - return (ENOSPC); + return -ENOSPC; } /* adjust the block number to reflect the location within @@ -1746,8 +1746,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error * * serialization: IWRITE_LOCK(ipbmap) held on entry/exit; */ @@ -1767,7 +1767,7 @@ lblkno = BLKTODMAP(blkno, bmp->db_l2nbperpage); mp = read_metapage(bmp->db_ipbmap, lblkno, PSIZE, 0); if (mp == NULL) - return (EIO); + return -EIO; dp = (struct dmap *) mp->data; /* try to allocate the blocks. @@ -1794,7 +1794,7 @@ lblkno = BLKTODMAP(b, bmp->db_l2nbperpage); mp = read_metapage(bmp->db_ipbmap, lblkno, PSIZE, 0); if (mp == NULL) { - rc = EIO; + rc = -EIO; goto backout; } dp = (struct dmap *) mp->data; @@ -1891,8 +1891,8 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient disk resources - * EIO - i/o error + * -ENOSPC - insufficient disk resources + * -EIO - i/o error * * serialization: IREAD_LOCK(ipbmap), e.g., from dbAlloc(), or * IWRITE_LOCK(ipbmap), e.g., dbAllocCtl(), held on entry/exit; @@ -1912,7 +1912,7 @@ * returns the index of the leaf at which free space was found. */ if (dbFindLeaf((dmtree_t *) & dp->tree, l2nb, &leafidx)) - return (ENOSPC); + return -ENOSPC; /* determine the block number within the file system corresponding * to the leaf at which free space was found. @@ -1957,7 +1957,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error + * -EIO - i/o error * * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; */ @@ -2012,7 +2012,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error + * -EIO - i/o error * * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; */ @@ -2392,7 +2392,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error + * -EIO - i/o error * * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; */ @@ -2412,7 +2412,7 @@ lblkno = BLKTOCTL(blkno, bmp->db_l2nbperpage, level); mp = read_metapage(bmp->db_ipbmap, lblkno, PSIZE, 0); if (mp == NULL) - return (EIO); + return -EIO; dcp = (struct dmapctl *) mp->data; /* determine the leaf number corresponding to the block and @@ -2835,7 +2835,7 @@ * * RETURN VALUES: * 0 - success - * ENOSPC - insufficient free blocks. + * -ENOSPC - insufficient free blocks. */ static int dbFindLeaf(dmtree_t * tp, int l2nb, int *leafidx) { @@ -2845,7 +2845,7 @@ * sufficient free space. */ if (l2nb > tp->dmt_stree[ROOT]) - return (ENOSPC); + return -ENOSPC; /* sufficient free space available. now search down the tree * starting at the next level for the leftmost leaf that @@ -3066,7 +3066,7 @@ * RETURN VALUES: * none */ -void fsDirty() +void fsDirty(void) { printk("fsDirty(): bye-bye\n"); assert(0); @@ -3089,7 +3089,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error + * -EIO - i/o error */ int dbAllocBottomUp(struct inode *ip, s64 blkno, s64 nblocks) { @@ -3120,7 +3120,7 @@ mp = read_metapage(ipbmap, lblkno, PSIZE, 0); if (mp == NULL) { IREAD_UNLOCK(ipbmap); - return (EIO); + return -EIO; } dp = (struct dmap *) mp->data; @@ -3530,7 +3530,7 @@ return 0; errout: - return EIO; + return -EIO; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_dtree.c linux-2.4.23-pre8/fs/jfs/jfs_dtree.c --- linux-2.4.22/fs/jfs/jfs_dtree.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_dtree.c 2003-10-22 22:49:19.000000000 +0000 @@ -134,7 +134,7 @@ BT_PUTPAGE(MP);\ updateSuper((IP)->i_sb, FM_DIRTY);\ MP = NULL;\ - RC = EIO;\ + RC = -EIO;\ }\ }\ } @@ -404,7 +404,7 @@ xtInsert(tid, ip, 0, 0, sbi->nbperpage, &xaddr, 0))) { jfs_warn("add_index: xtInsert failed!"); - return -1; + return -EPERM; } ip->i_size = PSIZE; ip->i_blocks += LBLK2PBLK(sb, sbi->nbperpage); @@ -412,7 +412,7 @@ if ((mp = get_index_page(ip, 0)) == 0) { jfs_err("add_index: get_metapage failed!"); xtTruncate(tid, ip, 0, COMMIT_PWMAP); - return -1; + return -EPERM; } tlck = txLock(tid, ip, mp, tlckDATA); llck = (struct linelock *) & tlck->lock; @@ -447,7 +447,7 @@ &xaddr, 0))) { jfs_warn("add_index: xtInsert failed!"); jfs_ip->next_index--; - return -1; + return -EPERM; } ip->i_size += PSIZE; ip->i_blocks += LBLK2PBLK(sb, sbi->nbperpage); @@ -461,7 +461,7 @@ if (mp == 0) { jfs_err("add_index: get/read_metapage failed!"); - return -1; + return -EPERM; } lock_index(tid, ip, mp, index); @@ -588,7 +588,7 @@ (wchar_t *) kmalloc((JFS_NAME_MAX + 1) * sizeof(wchar_t), GFP_NOFS); if (ciKey.name == 0) { - rc = ENOMEM; + rc = -ENOMEM; goto dtSearch_Exit2; } @@ -674,7 +674,7 @@ */ if (flag == JFS_CREATE) { *data = inumber; - rc = EEXIST; + rc = -EEXIST; goto out; } @@ -684,7 +684,7 @@ if ((flag == JFS_REMOVE || flag == JFS_RENAME) && *data != inumber) { - rc = ESTALE; + rc = -ESTALE; goto out; } @@ -732,7 +732,7 @@ */ if (flag == JFS_LOOKUP || flag == JFS_REMOVE || flag == JFS_RENAME) { - rc = ENOENT; + rc = -ENOENT; goto out; } @@ -770,7 +770,7 @@ */ jfs_err("stack overrun in dtSearch!"); updateSuper(sb, FM_DIRTY); - rc = EIO; + rc = -EIO; goto out; } btstack->nsplit++; @@ -840,7 +840,7 @@ if (DO_INDEX(ip)) { if (JFS_IP(ip)->next_index == DIREND) { DT_PUTPAGE(mp); - return EMLINK; + return -EMLINK; } n = NDTLEAF(name->namlen); data.leaf.tid = tid; @@ -953,7 +953,7 @@ GFP_NOFS); if (key.name == 0) { DT_PUTPAGE(smp); - rc = ENOMEM; + rc = -ENOMEM; goto dtSplitUp_Exit; } @@ -1328,7 +1328,7 @@ rbn = addressPXD(pxd); rmp = get_metapage(ip, rbn, PSIZE, 1); if (rmp == NULL) - return EIO; + return -EIO; jfs_info("dtSplitPage: ip:0x%p smp:0x%p rmp:0x%p", ip, smp, rmp); @@ -1579,7 +1579,7 @@ ip->i_blocks += LBLK2PBLK(sb, lengthPXD(pxd)); - return 0; + return rc; } @@ -2628,7 +2628,7 @@ * descend down to leftmost child page */ if (p->header.flag & BT_LEAF) - return ESTALE; + return -ESTALE; /* get the leftmost entry */ stbl = DT_GETSTBL(p); @@ -2666,7 +2666,7 @@ bn = le64_to_cpu(p->header.next); else { DT_PUTPAGE(mp); - return ESTALE; + return -ESTALE; } /* unpin current page */ @@ -3068,7 +3068,7 @@ } if ((rc = dtReadFirst(ip, &btstack))) - return -rc; + return rc; DT_GETSEARCH(ip, btstack.top, bn, mp, p, index); } @@ -3268,7 +3268,7 @@ DT_GETPAGE(ip, bn, mp, PSIZE, p, rc); if (rc) { free_page(dirent_buf); - return -rc; + return rc; } } @@ -4434,8 +4434,8 @@ * flag - JFS_RENAME * * RETURNS: - * ESTALE - If entry found does not match orig_ino passed in - * ENOENT - If no entry can be found to match key + * -ESTALE - If entry found does not match orig_ino passed in + * -ENOENT - If no entry can be found to match key * 0 - If successfully modified entry */ int dtModify(tid_t tid, struct inode *ip, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_extent.c linux-2.4.23-pre8/fs/jfs/jfs_extent.c --- linux-2.4.22/fs/jfs/jfs_extent.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_extent.c 2003-10-22 22:49:04.000000000 +0000 @@ -83,8 +83,8 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. - * ENOSPC - insufficient disk resources. + * -EIO - i/o error. + * -ENOSPC - insufficient disk resources. */ int extAlloc(struct inode *ip, s64 xlen, s64 pno, xad_t * xp, boolean_t abnr) @@ -208,8 +208,8 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. - * ENOSPC - insufficient disk resources. + * -EIO - i/o error. + * -ENOSPC - insufficient disk resources. */ int extRealloc(struct inode *ip, s64 nxlen, xad_t * xp, boolean_t abnr) { @@ -351,7 +351,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. + * -EIO - i/o error. */ int extHint(struct inode *ip, s64 offset, xad_t * xp) { @@ -422,8 +422,8 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. - * ENOSPC - insufficient disk resources. + * -EIO - i/o error. + * -ENOSPC - insufficient disk resources. */ int extRecord(struct inode *ip, xad_t * xp) { @@ -437,7 +437,7 @@ rc = xtUpdate(0, ip, xp); up(&JFS_IP(ip)->commit_sem); - return (rc); + return rc; } @@ -454,8 +454,8 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. - * ENOSPC - insufficient disk resources. + * -EIO - i/o error. + * -ENOSPC - insufficient disk resources. */ int extFill(struct inode *ip, xad_t * xp) { @@ -506,8 +506,8 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. - * ENOSPC - insufficient disk resources. + * -EIO - i/o error. + * -ENOSPC - insufficient disk resources. */ static int extBalloc(struct inode *ip, s64 hint, s64 * nblocks, s64 * blkno) @@ -536,7 +536,7 @@ /* if something other than an out of space error, * stop and return this error. */ - if (rc != ENOSPC) + if (rc != -ENOSPC) return (rc); /* decrease the allocation request size */ @@ -597,8 +597,8 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. - * ENOSPC - insufficient disk resources. + * -EIO - i/o error. + * -ENOSPC - insufficient disk resources. */ static int extBrealloc(struct inode *ip, @@ -611,7 +611,7 @@ *newblkno = blkno; return (0); } else { - if (rc != ENOSPC) + if (rc != -ENOSPC) return (rc); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_filsys.h linux-2.4.23-pre8/fs/jfs/jfs_filsys.h --- linux-2.4.22/fs/jfs/jfs_filsys.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_filsys.h 2003-10-22 22:47:30.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2001 + * Copyright (c) International Business Machines Corp., 2000-2003 * * 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 @@ -29,6 +29,9 @@ /* * file system option (superblock flag) */ +/* mount time flag to disable journaling to disk */ +#define JFS_NOINTEGRITY 0x00000010 + /* platform option (conditional compilation) */ #define JFS_AIX 0x80000000 /* AIX support */ /* POSIX name/directory support */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_imap.c linux-2.4.23-pre8/fs/jfs/jfs_imap.c --- linux-2.4.22/fs/jfs/jfs_imap.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_imap.c 2003-10-22 22:48:53.000000000 +0000 @@ -120,8 +120,8 @@ * * RETURN VALUES: * 0 - success - * ENOMEM - insufficient free virtual memory. - * EIO - i/o error. + * -ENOMEM - insufficient free virtual memory. + * -EIO - i/o error. */ int diMount(struct inode *ipimap) { @@ -137,7 +137,7 @@ imap = (struct inomap *) kmalloc(sizeof(struct inomap), GFP_KERNEL); if (imap == NULL) { jfs_err("diMount: kmalloc returned NULL!"); - return (ENOMEM); + return -ENOMEM; } /* read the on-disk inode map control structure. */ @@ -147,7 +147,7 @@ PSIZE, 0); if (mp == NULL) { kfree(imap); - return (EIO); + return -EIO; } /* copy the on-disk version to the in-memory version. */ @@ -206,8 +206,8 @@ * * RETURN VALUES: * 0 - success - * ENOMEM - insufficient free virtual memory. - * EIO - i/o error. + * -ENOMEM - insufficient free virtual memory. + * -EIO - i/o error. */ int diUnmount(struct inode *ipimap, int mounterror) { @@ -253,7 +253,7 @@ PSIZE, 0); if (mp == NULL) { jfs_err("diSync: get_metapage failed!"); - return EIO; + return -EIO; } /* copy the in-memory version to the on-disk version */ @@ -318,8 +318,8 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. - * ENOMEM - insufficient memory + * -EIO - i/o error. + * -ENOMEM - insufficient memory * */ int diRead(struct inode *ip) @@ -364,7 +364,7 @@ if ((lengthPXD(&iagp->inoext[extno]) != imap->im_nbperiext) || (addressPXD(&iagp->inoext[extno]) == 0)) { release_metapage(mp); - return ESTALE; + return -ESTALE; } /* get disk block number of the page within the inode extent @@ -399,7 +399,7 @@ mp = read_metapage(ipimap, pageno << sbi->l2nbperpage, PSIZE, 1); if (mp == 0) { jfs_err("diRead: read_metapage failed"); - return EIO; + return -EIO; } /* locate the the disk inode requested */ @@ -409,9 +409,9 @@ if (ip->i_ino != le32_to_cpu(dp->di_number)) { jfs_err("diRead: i_ino != di_number"); updateSuper(ip->i_sb, FM_DIRTY); - rc = EIO; + rc = -EIO; } else if (le32_to_cpu(dp->di_nlink) == 0) - rc = ESTALE; + rc = -ESTALE; else /* copy the disk inode to the in-memory inode */ rc = copy_from_dinode(dp, ip); @@ -617,7 +617,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. + * -EIO - i/o error. */ int diWrite(tid_t tid, struct inode *ip) { @@ -676,7 +676,7 @@ retry: mp = read_metapage(ipimap, pageno << sbi->l2nbperpage, PSIZE, 1); if (mp == 0) - return (EIO); + return -EIO; /* get the pointer to the disk inode */ dp = (struct dinode *) mp->data; @@ -890,7 +890,7 @@ * * RETURN VALUES: * 0 - success - * EIO - i/o error. + * -EIO - i/o error. */ int diFree(struct inode *ip) { @@ -928,7 +928,7 @@ (uint) inum, iagno, imap->im_nextiag); dump_mem("imap", imap, 32); updateSuper(ip->i_sb, FM_DIRTY); - return EIO; + return -EIO; } /* get the allocation group for this ino. @@ -977,7 +977,7 @@ IREAD_UNLOCK(ipimap); AG_UNLOCK(imap, agno); updateSuper(ip->i_sb, FM_DIRTY); - return EIO; + return -EIO; } /* * inode extent still has some inodes or below low water mark: @@ -1367,8 +1367,8 @@ * * RETURN VALUES: * 0 - success. - * ENOSPC - insufficient disk resources. - * EIO - i/o error. + * -ENOSPC - insufficient disk resources. + * -EIO - i/o error. */ int diAlloc(struct inode *pip, boolean_t dir, struct inode *ip) { @@ -1476,7 +1476,7 @@ rc = diAllocBit(imap, iagp, ino); IREAD_UNLOCK(ipimap); if (rc) { - assert(rc == EIO); + assert(rc == -EIO); } else { /* set the results of the allocation * and write the iag. @@ -1553,7 +1553,7 @@ rc = diAllocBit(imap, iagp, ino); IREAD_UNLOCK(ipimap); if (rc) { - assert(rc == EIO); + assert(rc == -EIO); } else { /* set the results of the allocation * and write the iag. @@ -1589,10 +1589,10 @@ * new extent, try to allocate the * disk inode from somewhere else. */ - if (rc == ENOSPC) + if (rc == -ENOSPC) break; - assert(rc == EIO); + assert(rc == -EIO); } else { /* set the results of the allocation * and write the iag. @@ -1631,7 +1631,7 @@ AG_UNLOCK(imap, agno); - if (rc != ENOSPC) + if (rc != -ENOSPC) return (rc); /* @@ -1667,8 +1667,8 @@ * * RETURN VALUES: * 0 - success. - * ENOSPC - insufficient disk resources. - * EIO - i/o error. + * -ENOSPC - insufficient disk resources. + * -EIO - i/o error. */ static int diAllocAG(struct inomap * imap, int agno, boolean_t dir, struct inode *ip) @@ -1684,7 +1684,7 @@ if (numfree > numinos) { jfs_err("diAllocAG: numfree > numinos"); updateSuper(ip->i_sb, FM_DIRTY); - return EIO; + return -EIO; } /* determine if we should allocate a new extent of free inodes @@ -1707,7 +1707,7 @@ * below to allocate a free and existing (already backed) * inode from the ag. */ - if ((rc = diAllocExt(imap, agno, ip)) != ENOSPC) + if ((rc = diAllocExt(imap, agno, ip)) != -ENOSPC) return (rc); } @@ -1738,8 +1738,8 @@ * * RETURN VALUES: * 0 - success. - * ENOSPC - insufficient disk resources. - * EIO - i/o error. + * -ENOSPC - insufficient disk resources. + * -EIO - i/o error. */ static int diAllocAny(struct inomap * imap, int agno, boolean_t dir, struct inode *ip) @@ -1758,7 +1758,7 @@ AG_UNLOCK(imap, ag); - if (rc != ENOSPC) + if (rc != -ENOSPC) return (rc); } @@ -1771,13 +1771,13 @@ AG_UNLOCK(imap, ag); - if (rc != ENOSPC) + if (rc != -ENOSPC) return (rc); } /* no free disk inodes. */ - return (ENOSPC); + return -ENOSPC; } @@ -1803,8 +1803,8 @@ * * RETURN VALUES: * 0 - success. - * ENOSPC - insufficient disk resources. - * EIO - i/o error. + * -ENOSPC - insufficient disk resources. + * -EIO - i/o error. */ static int diAllocIno(struct inomap * imap, int agno, struct inode *ip) { @@ -1815,7 +1815,7 @@ /* check if there are iags on the ag's free inode list. */ if ((iagno = imap->im_agctl[agno].inofree) < 0) - return (ENOSPC); + return -ENOSPC; /* obtain read lock on imap inode */ IREAD_LOCK(imap->im_ipimap); @@ -1837,7 +1837,7 @@ jfs_err(" agno = %d, iagno = %d", agno, iagno); dump_mem("iag", iagp, 64); updateSuper(ip->i_sb, FM_DIRTY); - return EIO; + return -EIO; } /* scan the free inode summary map to find an extent @@ -1913,8 +1913,8 @@ * * RETURN VALUES: * 0 - success. - * ENOSPC - insufficient disk resources. - * EIO - i/o error. + * -ENOSPC - insufficient disk resources. + * -EIO - i/o error. */ static int diAllocExt(struct inomap * imap, int agno, struct inode *ip) { @@ -2018,8 +2018,8 @@ * * RETURN VALUES: * 0 - success. - * ENOSPC - insufficient disk resources. - * EIO - i/o error. + * -ENOSPC - insufficient disk resources. + * -EIO - i/o error. */ static int diAllocBit(struct inomap * imap, struct iag * iagp, int ino) { @@ -2158,8 +2158,8 @@ * * RETURN VALUES: * 0 - success. - * ENOSPC - insufficient disk resources. - * EIO - i/o error. + * -ENOSPC - insufficient disk resources. + * -EIO - i/o error. */ static int diNewExt(struct inomap * imap, struct iag * iagp, int extno) { @@ -2272,7 +2272,7 @@ */ dmp = get_metapage(ipimap, blkno + i, PSIZE, 1); if (dmp == NULL) { - rc = EIO; + rc = -EIO; goto error_out; } dp = (struct dinode *) dmp->data; @@ -2418,8 +2418,8 @@ * * RETURN VALUES: * 0 - success. - * ENOSPC - insufficient disk resources. - * EIO - i/o error. + * -ENOSPC - insufficient disk resources. + * -EIO - i/o error. * * serialization: * AG lock held on entry/exit; @@ -2490,7 +2490,7 @@ /* release the inode map lock */ IWRITE_UNLOCK(ipimap); - rc = ENOSPC; + rc = -ENOSPC; goto out; } @@ -2521,7 +2521,7 @@ /* release the inode map lock */ IWRITE_UNLOCK(ipimap); - rc = EIO; + rc = -EIO; goto out; } iagp = (struct iag *) mp->data; @@ -2553,7 +2553,7 @@ /* release the inode map lock */ IWRITE_UNLOCK(ipimap); - rc = EIO; + rc = -EIO; goto out; } @@ -2619,7 +2619,7 @@ /* read the iag */ if ((rc = diIAGRead(imap, iagno, &mp))) { IREAD_UNLOCK(ipimap); - rc = EIO; + rc = -EIO; goto out; } iagp = (struct iag *) mp->data; @@ -2658,7 +2658,7 @@ * * RETURN VALUES: * 0 - success. - * EIO - i/o error. + * -EIO - i/o error. */ static int diIAGRead(struct inomap * imap, int iagno, struct metapage ** mpp) { @@ -2671,7 +2671,7 @@ /* read the iag. */ *mpp = read_metapage(ipimap, blkno, PSIZE, 0); if (*mpp == NULL) { - return (EIO); + return -EIO; } return (0); @@ -2718,7 +2718,8 @@ * is_free - If TRUE indicates inode should be marked freed, otherwise * indicates inode should be marked allocated. * - * RETURNS: 0 for success + * RETURN VALUES: + * 0 for success */ int diUpdatePMap(struct inode *ipimap, @@ -3016,7 +3017,7 @@ * * RETURN VALUES: * 0 - success - * ENOMEM - insufficient memory + * -ENOMEM - insufficient memory */ static int copy_from_dinode(struct dinode * dip, struct inode *ip) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_incore.h linux-2.4.23-pre8/fs/jfs/jfs_incore.h --- linux-2.4.22/fs/jfs/jfs_incore.h 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_incore.h 2003-10-22 22:49:16.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -126,32 +126,34 @@ * JFS-private superblock information. */ struct jfs_sb_info { - unsigned long mntflag; /* 4: aggregate attributes */ - struct inode *ipbmap; /* 4: block map inode */ - struct inode *ipaimap; /* 4: aggregate inode map inode */ - struct inode *ipaimap2; /* 4: secondary aimap inode */ - struct inode *ipimap; /* 4: aggregate inode map inode */ - struct jfs_log *log; /* 4: log */ - short bsize; /* 2: logical block size */ - short l2bsize; /* 2: log2 logical block size */ - short nbperpage; /* 2: blocks per page */ - short l2nbperpage; /* 2: log2 blocks per page */ - short l2niperblk; /* 2: log2 inodes per page */ - kdev_t logdev; /* 2: external log device */ + unsigned long mntflag; /* aggregate attributes */ + struct inode *ipbmap; /* block map inode */ + struct inode *ipaimap; /* aggregate inode map inode */ + struct inode *ipaimap2; /* secondary aimap inode */ + struct inode *ipimap; /* aggregate inode map inode */ + struct jfs_log *log; /* log */ + short bsize; /* logical block size */ + short l2bsize; /* log2 logical block size */ + short nbperpage; /* blocks per page */ + short l2nbperpage; /* log2 blocks per page */ + short l2niperblk; /* log2 inodes per page */ + kdev_t logdev; /* external log device */ uint aggregate; /* volume identifier in log record */ - pxd_t logpxd; /* 8: pxd describing log */ - pxd_t fsckpxd; /* 8: pxd describing fsck wkspc */ - pxd_t ait2; /* 8: pxd describing AIT copy */ - char uuid[16]; /* 16: 128-bit uuid for volume */ - char loguuid[16]; /* 16: 128-bit uuid for log */ + pxd_t logpxd; /* pxd describing log */ + pxd_t fsckpxd; /* pxd describing fsck wkspc */ + pxd_t ait2; /* pxd describing AIT copy */ + char uuid[16]; /* 128-bit uuid for volume */ + char loguuid[16]; /* 128-bit uuid for log */ /* Formerly in ipimap */ - uint gengen; /* 4: inode generation generator*/ - uint inostamp; /* 4: shows inode belongs to fileset*/ + uint gengen; /* inode generation generator*/ + uint inostamp; /* shows inode belongs to fileset*/ /* Formerly in ipbmap */ - struct bmap *bmap; /* 4: incore bmap descriptor */ - struct nls_table *nls_tab; /* 4: current codepage */ - uint state; /* 4: mount/recovery state */ + struct bmap *bmap; /* incore bmap descriptor */ + struct nls_table *nls_tab; /* current codepage */ + uint state; /* mount/recovery state */ + unsigned long flag; /* mount time flags */ + uint p_state; /* state prior to going no integrity */ }; static inline struct jfs_inode_info *JFS_IP(struct inode *inode) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_logmgr.c linux-2.4.23-pre8/fs/jfs/jfs_logmgr.c --- linux-2.4.22/fs/jfs/jfs_logmgr.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_logmgr.c 2003-10-22 22:48:54.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -666,7 +666,7 @@ /* group committed already ? */ if (tblk->flag & tblkGC_COMMITTED) { if (tblk->flag & tblkGC_ERROR) - rc = EIO; + rc = -EIO; LOGGC_UNLOCK(log); return rc; @@ -700,7 +700,7 @@ if (tblk->flag & tblkGC_COMMITTED) { if (tblk->flag & tblkGC_ERROR) - rc = EIO; + rc = -EIO; LOGGC_UNLOCK(log); return rc; @@ -716,7 +716,7 @@ /* removed from commit queue */ if (tblk->flag & tblkGC_ERROR) - rc = EIO; + rc = -EIO; LOGGC_UNLOCK(log); return rc; @@ -1064,7 +1064,7 @@ struct jfs_log *log; if (!(log = kmalloc(sizeof(struct jfs_log), GFP_KERNEL))) - return ENOMEM; + return -ENOMEM; memset(log, 0, sizeof(struct jfs_log)); init_waitqueue_head(&log->syncwait); @@ -1106,12 +1106,11 @@ */ if (!(bdev = bdget(kdev_t_to_nr(JFS_SBI(sb)->logdev)))) { - rc = ENODEV; + rc = -ENODEV; goto free; } if ((rc = blkdev_get(bdev, FMODE_READ|FMODE_WRITE, 0, BDEV_FS))) { - rc = -rc; goto free; } @@ -1164,7 +1163,7 @@ * PARAMETER: log - log structure * * RETURN: 0 - if ok - * EINVAL - bad log magic number or superblock dirty + * -EINVAL - bad log magic number or superblock dirty * error returned from logwait() * * serialization: single first open thread @@ -1206,21 +1205,21 @@ if (logsuper->magic != cpu_to_le32(LOGMAGIC)) { jfs_warn("*** Log Format Error ! ***"); - rc = EINVAL; + rc = -EINVAL; goto errout20; } /* logredo() should have been run successfully. */ if (logsuper->state != cpu_to_le32(LOGREDONE)) { jfs_warn("*** Log Is Dirty ! ***"); - rc = EINVAL; + rc = -EINVAL; goto errout20; } /* initialize log inode from log superblock */ if (test_bit(log_INLINELOG,&log->flag)) { if (log->size != le32_to_cpu(logsuper->size)) { - rc = EINVAL; + rc = -EINVAL; goto errout20; } jfs_info("lmLogInit: inline log:0x%p base:0x%Lx size:0x%x", @@ -1239,6 +1238,15 @@ log->page = le32_to_cpu(logsuper->end) / LOGPSIZE; log->eor = le32_to_cpu(logsuper->end) - (LOGPSIZE * log->page); + /* check for disabled journaling to disk */ + if (JFS_SBI(log->sb)->flag & JFS_NOINTEGRITY) { + log->no_integrity = 1; + log->ni_page = log->page; + log->ni_eor = log->eor; + } + else + log->no_integrity = 0; + /* * initialize for log append write mode */ @@ -1519,6 +1527,14 @@ lrd.type = cpu_to_le16(LOG_SYNCPT); lrd.length = 0; lrd.log.syncpt.sync = 0; + + /* check for disabled journaling to disk */ + if (JFS_SBI(log->sb)->flag & JFS_NOINTEGRITY) { + log->no_integrity = 0; + log->page = log->ni_page; + log->eor = log->ni_eor; + } + lsn = lmWriteRecord(log, NULL, &lrd, NULL); bp = log->bp; lp = (struct logpage *) bp->l_ldata; @@ -1593,7 +1609,7 @@ if (i == MAX_ACTIVE) { jfs_warn("Too many file systems sharing journal!"); lbmFree(bpsuper); - return EMFILE; /* Is there a better rc? */ + return -EMFILE; /* Is there a better rc? */ } } else { for (i = 0; i < MAX_ACTIVE; i++) @@ -1604,7 +1620,7 @@ if (i == MAX_ACTIVE) { jfs_warn("Somebody stomped on the journal!"); lbmFree(bpsuper); - return EIO; + return -EIO; } } @@ -1701,7 +1717,7 @@ error: lbmLogShutdown(log); - return (ENOMEM); + return -ENOMEM; } @@ -1974,7 +1990,12 @@ set_bit(BH_Req, &bp->l_bh.b_state); bp->l_bh.b_rdev = bp->l_bh.b_dev; bp->l_bh.b_rsector = bp->l_blkno << (bp->l_log->l2bsize - 9); - generic_make_request(WRITE, &bp->l_bh); + + if (bp->l_log->no_integrity) + /* don't really do I/O */ + lbmIODone(&bp->l_bh, 1); + else + generic_make_request(WRITE, &bp->l_bh); INCREMENT(lmStat.submitted); run_task_queue(&tq_disk); @@ -1995,7 +2016,7 @@ LCACHE_SLEEP_COND(bp->l_ioevent, (bp->l_flag & lbmDONE), flags); - rc = (bp->l_flag & lbmERROR) ? EIO : 0; + rc = (bp->l_flag & lbmERROR) ? -EIO : 0; if (flag & lbmFREE) lbmfree(bp); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_logmgr.h linux-2.4.23-pre8/fs/jfs/jfs_logmgr.h --- linux-2.4.22/fs/jfs/jfs_logmgr.h 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_logmgr.h 2003-10-22 22:49:57.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -417,6 +417,10 @@ struct lbuf *wqueue; /* 4: log pageout queue */ int count; /* 4: count */ char uuid[16]; /* 16: 128-bit uuid of log device */ + + int no_integrity; /* flag to disable journaling to disk */ + int ni_page; /* backup of page for nointegrity option */ + int ni_eor; /* backup of eor for nointegrity option */ }; /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_mount.c linux-2.4.23-pre8/fs/jfs/jfs_mount.c --- linux-2.4.22/fs/jfs/jfs_mount.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_mount.c 2003-10-22 22:48:21.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * * 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 @@ -72,11 +72,11 @@ * * PARAMETER: sb - super block * - * RETURN: EBUSY - device already mounted or open for write - * EBUSY - cvrdvp already mounted; - * EBUSY - mount table full - * ENOTDIR - cvrdvp not directory on a device mount - * ENXIO - device open failure + * RETURN: -EBUSY - device already mounted or open for write + * -EBUSY - cvrdvp already mounted; + * -EBUSY - mount table full + * -ENOTDIR- cvrdvp not directory on a device mount + * -ENXIO - device open failure */ int jfs_mount(struct super_block *sb) { @@ -98,7 +98,7 @@ ipaimap = diReadSpecial(sb, AGGREGATE_I, 0); if (ipaimap == NULL) { jfs_err("jfs_mount: Faild to read AGGREGATE_I"); - rc = EIO; + rc = -EIO; goto errout20; } sbi->ipaimap = ipaimap; @@ -118,7 +118,7 @@ */ ipbmap = diReadSpecial(sb, BMAP_I, 0); if (ipbmap == NULL) { - rc = EIO; + rc = -EIO; goto errout22; } @@ -149,7 +149,7 @@ ipaimap2 = diReadSpecial(sb, AGGREGATE_I, 1); if (ipaimap2 == 0) { jfs_err("jfs_mount: Faild to read AGGREGATE_I"); - rc = EIO; + rc = -EIO; goto errout35; } sbi->ipaimap2 = ipaimap2; @@ -178,7 +178,7 @@ if (ipimap == NULL) { jfs_err("jfs_mount: Failed to read FILESYSTEM_I"); /* open fileset secondary inode allocation map */ - rc = EIO; + rc = -EIO; goto errout40; } jfs_info("jfs_mount: ipimap:0x%p", ipimap); @@ -327,8 +327,7 @@ /* validate fs signature */ if (strncmp(j_sb->s_magic, JFS_MAGIC, 4) || j_sb->s_version > cpu_to_le32(JFS_VERSION)) { - //rc = EFORMAT; - rc = EINVAL; + rc = -EINVAL; goto out; } @@ -336,7 +335,7 @@ #ifdef _JFS_4K if (bsize != PSIZE) { jfs_err("Currently only 4K block size supported!"); - rc = EINVAL; + rc = -EINVAL; goto out; } #endif /* _JFS_4K */ @@ -372,7 +371,7 @@ if (j_sb->s_state != cpu_to_le32(FM_CLEAN) && !(sb->s_flags & MS_RDONLY)) { jfs_err("jfs_mount: Mount Failure: File System Dirty."); - rc = EINVAL; + rc = -EINVAL; goto out; } @@ -421,12 +420,20 @@ struct buffer_head *bh; int rc; - /* - * Only fsck can fix dirty state - */ - if (sbi->state == FM_DIRTY) + if (sbi->flag & JFS_NOINTEGRITY) { + if (state == FM_DIRTY) { + sbi->p_state = state; + return 0; + } else if (state == FM_MOUNT) { + sbi->p_state = sbi->state; + state = FM_DIRTY; + } else if (state == FM_CLEAN) { + state = sbi->p_state; + } else + jfs_err("updateSuper: bad state"); + } else if (sbi->state == FM_DIRTY) return 0; - + if ((rc = readSuper(sb, &bh))) return rc; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_txnmgr.c linux-2.4.23-pre8/fs/jfs/jfs_txnmgr.c --- linux-2.4.22/fs/jfs/jfs_txnmgr.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_txnmgr.c 2003-10-22 22:48:14.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -177,7 +177,7 @@ struct tlock * tlck); void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd, struct tlock * tlck); -void txAbortCommit(struct commit * cd, int exval); +static void txAbortCommit(struct commit * cd); static void txAllocPMap(struct inode *ip, struct maplock * maplock, struct tblock * tblk); void txForce(struct tblock * tblk); @@ -256,7 +256,7 @@ size = sizeof(struct tblock) * nTxBlock; TxBlock = (struct tblock *) vmalloc(size); if (TxBlock == NULL) - return ENOMEM; + return -ENOMEM; for (k = 1; k < nTxBlock - 1; k++) { TxBlock[k].next = k + 1; @@ -282,7 +282,7 @@ TxLock = (struct tlock *) vmalloc(size); if (TxLock == NULL) { vfree(TxBlock); - return ENOMEM; + return -ENOMEM; } /* initialize tlock table */ @@ -1099,7 +1099,7 @@ struct inode **iplist, /* list of inode to commit */ int flag) { - int rc = 0, rc1 = 0; + int rc = 0; struct commit cd; struct jfs_log *log; struct tblock *tblk; @@ -1114,7 +1114,7 @@ jfs_info("txCommit, tid = %d, flag = %d", tid, flag); /* is read-only file system ? */ if (isReadOnly(iplist[0])) { - rc = EROFS; + rc = -EROFS; goto TheEnd; } @@ -1297,9 +1297,7 @@ out: if (rc != 0) - txAbortCommit(&cd, rc); - else - rc = rc1; + txAbortCommit(&cd); TheEnd: jfs_info("txCommit: tid = %d, returning %d", tid, rc); @@ -2654,14 +2652,13 @@ * log age of page-frames in memory for which caller has * are reset to 0 (to avoid logwarap). */ -void txAbortCommit(struct commit * cd, int exval) +static void txAbortCommit(struct commit * cd) { struct tblock *tblk; tid_t tid; lid_t lid, next; struct metapage *mp; - assert(exval == EIO || exval == ENOMEM); jfs_warn("txAbortCommit: cd:0x%p", cd); /* @@ -2718,7 +2715,7 @@ /* We must have gotten ahead of the user thread */ jfs_info("txLazyCommit: tblk 0x%p not unlocked", tblk); - schedule(); + yield(); } jfs_info("txLazyCommit: processing tblk 0x%p", tblk); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_unicode.c linux-2.4.23-pre8/fs/jfs/jfs_unicode.c --- linux-2.4.22/fs/jfs/jfs_unicode.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_unicode.c 2003-10-22 22:49:09.000000000 +0000 @@ -68,8 +68,7 @@ jfs_err("jfs_strtoUCS: char2uni returned %d.", charlen); jfs_err("charset = %s, char = 0x%x", codepage->charset, (unsigned char) *from); - to[i] = 0x003f; /* a question mark */ - charlen = 1; + return charlen; } } @@ -89,16 +88,21 @@ int length = dentry->d_name.len; if (length > JFS_NAME_MAX) - return ENAMETOOLONG; + return -ENAMETOOLONG; uniName->name = kmalloc((length + 1) * sizeof(wchar_t), GFP_NOFS); if (uniName->name == NULL) - return ENOSPC; + return -ENOSPC; uniName->namlen = jfs_strtoUCS(uniName->name, dentry->d_name.name, length, nls_tab); + if (uniName->namlen < 0) { + kfree(uniName->name); + return uniName->namlen; + } + return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/jfs_xtree.c linux-2.4.23-pre8/fs/jfs/jfs_xtree.c --- linux-2.4.22/fs/jfs/jfs_xtree.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/jfs_xtree.c 2003-10-22 22:49:48.000000000 +0000 @@ -73,7 +73,7 @@ BT_PUTPAGE(MP);\ updateSuper((IP)->i_sb, FM_DIRTY);\ MP = NULL;\ - RC = EIO;\ + RC = -EIO;\ }\ }\ } @@ -814,7 +814,7 @@ /* This test must follow XT_GETSEARCH since mp must be valid if * we branch to out: */ if (cmp == 0) { - rc = EEXIST; + rc = -EEXIST; goto out; } @@ -1033,7 +1033,7 @@ xtSplitRoot(tid, ip, split, &rmp) : xtSplitPage(tid, ip, split, &rmp, &rbn); if (rc) - return EIO; + return -EIO; XT_PUTPAGE(smp); @@ -1238,7 +1238,7 @@ rbn = addressPXD(pxd); rmp = get_metapage(ip, rbn, PSIZE, 1); if (rmp == NULL) - return EIO; + return -EIO; jfs_info("xtSplitPage: ip:0x%p smp:0x%p rmp:0x%p", ip, smp, rmp); @@ -1485,7 +1485,7 @@ rbn = addressPXD(pxd); rmp = get_metapage(ip, rbn, PSIZE, 1); if (rmp == NULL) - return EIO; + return -EIO; jfs_info("xtSplitRoot: ip:0x%p rmp:0x%p", ip, rmp); @@ -2409,7 +2409,7 @@ XT_GETSEARCH(ip, btstack.top, bn, mp, p, index); if (cmp == 0) { - rc = EEXIST; + rc = -EEXIST; goto out; } //insert: @@ -2557,7 +2557,7 @@ if (cmp) { /* unpin the leaf page */ XT_PUTPAGE(mp); - return ENOENT; + return -ENOENT; } /* @@ -2788,7 +2788,7 @@ /* validate extent offset */ offset = xoff << JFS_SBI(ip->i_sb)->l2bsize; if (offset >= ip->i_size) - return ESTALE; /* stale extent */ + return -ESTALE; /* stale extent */ jfs_info("xtRelocate: xtype:%d xoff:0x%lx xlen:0x%x xaddr:0x%lx:0x%lx", xtype, (ulong) xoff, xlen, (ulong) oxaddr, (ulong) nxaddr); @@ -2804,7 +2804,7 @@ return rc; if (cmp) { XT_PUTPAGE(pmp); - return ESTALE; + return -ESTALE; } /* retrieve search result */ @@ -2814,7 +2814,7 @@ xad = &pp->xad[index]; if (addressXAD(xad) != oxaddr || lengthXAD(xad) != xlen) { XT_PUTPAGE(pmp); - return ESTALE; + return -ESTALE; } } else { /* (xtype == XTPAGE) */ @@ -2824,7 +2824,7 @@ return rc; if (cmp) { XT_PUTPAGE(pmp); - return ESTALE; + return -ESTALE; } /* retrieve search result */ @@ -3127,7 +3127,7 @@ if (rc) return rc; if (p->header.flag & BT_LEAF) - return ESTALE; + return -ESTALE; lim = le16_to_cpu(p->header.nextindex) - XTENTRYSTART; @@ -3439,7 +3439,7 @@ getPage: XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); if (rc) - return -rc; + return rc; /* process entries backward from last index */ index = le16_to_cpu(p->header.nextindex) - 1; @@ -3667,7 +3667,7 @@ bn = parent->bn; XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); if (rc) - return -rc; + return rc; index = parent->index; @@ -3924,7 +3924,7 @@ xoff = (committed_size >> JFS_SBI(ip->i_sb)->l2bsize) - 1; rc = xtSearch(ip, xoff, &cmp, &btstack, 0); if (rc) - return -rc; + return rc; assert(cmp == 0); XT_GETSEARCH(ip, btstack.top, bn, mp, p, index); } else { @@ -3941,7 +3941,7 @@ getPage: XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); if (rc) - return -rc; + return rc; /* process entries backward from last index */ index = le16_to_cpu(p->header.nextindex) - 1; @@ -3986,7 +3986,7 @@ bn = parent->bn; XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); if (rc) - return -rc; + return rc; index = parent->index; @@ -4225,8 +4225,7 @@ * at the current entry at the current subtree root page * */ -int xtGather(t) -btree_t *t; +int xtGather(btree_t *t) { int rc = 0; xtpage_t *p; @@ -4312,7 +4311,7 @@ bn = parent->bn; XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); if (rc) - return EIO; + return -EIO; /* first subroot page which * covers all new allocated blocks diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/namei.c linux-2.4.23-pre8/fs/jfs/namei.c --- linux-2.4.22/fs/jfs/namei.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/namei.c 2003-10-22 22:47:52.000000000 +0000 @@ -83,7 +83,7 @@ */ ip = ialloc(dip, mode); if (ip == NULL) { - rc = ENOSPC; + rc = -ENOSPC; goto out2; } @@ -116,7 +116,7 @@ ino = ip->i_ino; if ((rc = dtInsert(tid, dip, &dname, &ino, &btstack))) { jfs_err("jfs_create: dtInsert returned %d", rc); - if (rc == EIO) + if (rc == -EIO) txAbort(tid, 1); /* Marks Filesystem dirty */ else txAbort(tid, 0); /* Filesystem full */ @@ -151,8 +151,8 @@ out1: - jfs_info("jfs_create: rc:%d", -rc); - return -rc; + jfs_info("jfs_create: rc:%d", rc); + return rc; } @@ -186,7 +186,7 @@ /* link count overflow on parent directory ? */ if (dip->i_nlink == JFS_LINK_MAX) { - rc = EMLINK; + rc = -EMLINK; goto out1; } @@ -204,7 +204,7 @@ */ ip = ialloc(dip, S_IFDIR | mode); if (ip == NULL) { - rc = ENOSPC; + rc = -ENOSPC; goto out2; } @@ -238,7 +238,7 @@ if ((rc = dtInsert(tid, dip, &dname, &ino, &btstack))) { jfs_err("jfs_mkdir: dtInsert returned %d", rc); - if (rc == EIO) + if (rc == -EIO) txAbort(tid, 1); /* Marks Filesystem dirty */ else txAbort(tid, 0); /* Filesystem full */ @@ -276,8 +276,8 @@ out1: - jfs_info("jfs_mkdir: rc:%d", -rc); - return -rc; + jfs_info("jfs_mkdir: rc:%d", rc); + return rc; } /* @@ -288,8 +288,8 @@ * PARAMETER: dip - parent inode * dentry - child directory dentry * - * RETURN: EINVAL - if name is . or .. - * EINVAL - if . or .. exist but are invalid. + * RETURN: -EINVAL - if name is . or .. + * -EINVAL - if . or .. exist but are invalid. * errors from subroutines * * note: @@ -313,7 +313,7 @@ /* directory must be empty to be removed */ if (!dtEmpty(ip)) { - rc = ENOTEMPTY; + rc = -ENOTEMPTY; goto out; } @@ -339,7 +339,7 @@ ino = ip->i_ino; if ((rc = dtDelete(tid, dip, &dname, &ino, JFS_REMOVE))) { jfs_err("jfs_rmdir: dtDelete returned %d", rc); - if (rc == EIO) + if (rc == -EIO) txAbort(tid, 1); txEnd(tid); up(&JFS_IP(dip)->commit_sem); @@ -399,7 +399,7 @@ out: jfs_info("jfs_rmdir: rc:%d", rc); - return -rc; + return rc; } /* @@ -455,7 +455,7 @@ ino = ip->i_ino; if ((rc = dtDelete(tid, dip, &dname, &ino, JFS_REMOVE))) { jfs_err("jfs_unlink: dtDelete returned %d", rc); - if (rc == EIO) + if (rc == -EIO) txAbort(tid, 1); /* Marks FS Dirty */ txEnd(tid); up(&JFS_IP(dip)->commit_sem); @@ -485,7 +485,7 @@ up(&JFS_IP(dip)->commit_sem); up(&JFS_IP(ip)->commit_sem); IWRITE_UNLOCK(ip); - rc = -new_size; /* We return -rc */ + rc = new_size; goto out1; } tblk = tid_to_tblock(tid); @@ -521,7 +521,7 @@ new_size = xtTruncate_pmap(tid, ip, new_size); if (new_size < 0) { txAbort(tid, 1); /* Marks FS Dirty */ - rc = -new_size; /* We return -rc */ + rc = new_size; } else rc = txCommit(tid, 2, &iplist[0], COMMIT_SYNC); txEnd(tid); @@ -547,8 +547,8 @@ out1: free_UCSname(&dname); out: - jfs_info("jfs_unlink: rc:%d", -rc); - return -rc; + jfs_info("jfs_unlink: rc:%d", rc); + return rc; } /* @@ -573,7 +573,7 @@ * PARAMETERS: cd - pointer to commit data structure. * current inode is the one to truncate. * - * RETURN : Errors from subroutines + * RETURN: Errors from subroutines */ s64 commitZeroLink(tid_t tid, struct inode *ip) { @@ -767,7 +767,7 @@ down(&JFS_IP(ip)->commit_sem); if (ip->i_nlink == JFS_LINK_MAX) { - rc = EMLINK; + rc = -EMLINK; goto out; } @@ -805,7 +805,7 @@ up(&JFS_IP(ip)->commit_sem); jfs_info("jfs_link: rc:%d", rc); - return -rc; + return rc; } /* @@ -863,7 +863,7 @@ */ ip = ialloc(dip, S_IFLNK | 0777); if (ip == NULL) { - rc = ENOSPC; + rc = -ENOSPC; goto out2; } @@ -955,7 +955,7 @@ if (mp == NULL) { dtDelete(tid, dip, &dname, &ino, JFS_REMOVE); - rc = EIO; + rc = -EIO; goto out3; } memcpy(mp->data, name, copy_size); @@ -975,7 +975,7 @@ ip->i_blocks = LBLK2PBLK(sb, xlen); } else { dtDelete(tid, dip, &dname, &ino, JFS_REMOVE); - rc = ENOSPC; + rc = -ENOSPC; goto out3; } } @@ -1017,8 +1017,8 @@ free_UCSname(&dname); out1: - jfs_info("jfs_symlink: rc:%d", -rc); - return -rc; + jfs_info("jfs_symlink: rc:%d", rc); + return rc; } @@ -1067,7 +1067,7 @@ */ rc = dtSearch(old_dir, &old_dname, &ino, &btstack, JFS_LOOKUP); if (rc || (ino != old_ip->i_ino)) { - rc = ENOENT; + rc = -ENOENT; goto out3; } @@ -1077,26 +1077,26 @@ rc = dtSearch(new_dir, &new_dname, &ino, &btstack, JFS_LOOKUP); if (rc == 0) { if ((new_ip == 0) || (ino != new_ip->i_ino)) { - rc = ESTALE; + rc = -ESTALE; goto out3; } - } else if (rc != ENOENT) + } else if (rc != -ENOENT) goto out3; else if (new_ip) { /* no entry exists, but one was expected */ - rc = ESTALE; + rc = -ESTALE; goto out3; } if (S_ISDIR(old_ip->i_mode)) { if (new_ip) { if (!dtEmpty(new_ip)) { - rc = ENOTEMPTY; + rc = -ENOTEMPTY; goto out3; } } else if ((new_dir != old_dir) && (new_dir->i_nlink == JFS_LINK_MAX)) { - rc = EMLINK; + rc = -EMLINK; goto out3; } } else if (new_ip) @@ -1134,7 +1134,7 @@ /* free block resources */ if ((new_size = commitZeroLink(tid, new_ip)) < 0) { txAbort(tid, 1); /* Marks FS Dirty */ - rc = -new_size; /* We return -rc */ + rc = new_size; goto out4; } tblk = tid_to_tblock(tid); @@ -1251,7 +1251,7 @@ new_size = xtTruncate_pmap(tid, new_ip, new_size); if (new_size < 0) { txAbort(tid, 1); - rc = -new_size; /* We return -rc */ + rc = new_size; } else rc = txCommit(tid, 1, &new_ip, COMMIT_SYNC); txEnd(tid); @@ -1278,7 +1278,7 @@ } jfs_info("jfs_rename: returning %d", rc); - return -rc; + return rc; } @@ -1305,7 +1305,7 @@ ip = ialloc(dir, mode); if (ip == NULL) { - rc = ENOSPC; + rc = -ENOSPC; goto out1; } @@ -1354,7 +1354,7 @@ out: jfs_info("jfs_mknod: returning %d", rc); - return -rc; + return rc; } static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry) @@ -1377,15 +1377,15 @@ else { if ((rc = get_UCSname(&key, dentry, JFS_SBI(dip->i_sb)->nls_tab))) - return ERR_PTR(-rc); + return ERR_PTR(rc); rc = dtSearch(dip, &key, &inum, &btstack, JFS_LOOKUP); free_UCSname(&key); - if (rc == ENOENT) { + if (rc == -ENOENT) { d_add(dentry, NULL); return ERR_PTR(0); } else if (rc) { jfs_err("jfs_lookup: dtSearch returned %d", rc); - return ERR_PTR(-rc); + return ERR_PTR(rc); } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/resize.c linux-2.4.23-pre8/fs/jfs/resize.c --- linux-2.4.22/fs/jfs/resize.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/resize.c 2003-10-22 22:49:43.000000000 +0000 @@ -184,7 +184,7 @@ /* file system cannot be shrinked */ if (newFSSize < bmp->db_mapsize) { - rc = EINVAL; + rc = -EINVAL; goto out; } @@ -317,8 +317,8 @@ t64 = dbMapFileSizeToMapSize(ipbmap); if (mapSize > t64) { printk(KERN_ERR "jfs_extendfs: mapSize (0x%Lx) > t64 (0x%Lx)\n", - (long long)mapSize, (long long)t64); - rc = EIO; + (long long) mapSize, (long long) t64); + rc = -EIO; goto error_out; } nblocks = min(t64 - mapSize, XSize); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/super.c linux-2.4.23-pre8/fs/jfs/super.c --- linux-2.4.22/fs/jfs/super.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/super.c 2003-10-22 22:49:56.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) International Business Machines Corp., 2000-2002 + * Copyright (c) International Business Machines Corp., 2000-2003 * Portions Copyright (c) Christoph Hellwig, 2001-2002 * * This program is free software; you can redistribute it and/or modify @@ -142,7 +142,8 @@ return 0; } -static int parse_options(char *options, struct super_block *sb, s64 *newLVSize) +static int parse_options(char *options, struct super_block *sb, s64 *newLVSize, + int *flag) { void *nls_map = NULL; char *this_char; @@ -158,7 +159,11 @@ continue; if ((value = strchr(this_char, '=')) != NULL) *value++ = 0; - if (!strcmp(this_char, "iocharset")) { + if (!strcmp(this_char, "integrity")) { + *flag &= ~JFS_NOINTEGRITY; + } else if (!strcmp(this_char, "nointegrity")) { + *flag |= JFS_NOINTEGRITY; + } else if (!strcmp(this_char, "iocharset")) { if (!value || !*value) goto needs_arg; if (nls_map) /* specified iocharset twice! */ @@ -208,8 +213,9 @@ { s64 newLVSize = 0; int rc = 0; + int flag = JFS_SBI(sb)->flag; - if (!parse_options(data, sb, &newLVSize)) { + if (!parse_options(data, sb, &newLVSize, &flag)) { return -EINVAL; } if (newLVSize) { @@ -223,10 +229,24 @@ return rc; } - if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) + if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) { + JFS_SBI(sb)->flag = flag; return jfs_mount_rw(sb, 1); - else if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) - return jfs_umount_rw(sb); + } + if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { + rc = jfs_umount_rw(sb); + JFS_SBI(sb)->flag = flag; + return rc; + } + if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY)) + if (!(sb->s_flags & MS_RDONLY)) { + rc = jfs_umount_rw(sb); + if (rc) + return rc; + JFS_SBI(sb)->flag = flag; + return jfs_mount_rw(sb, 1); + } + JFS_SBI(sb)->flag = flag; return 0; } @@ -238,6 +258,7 @@ struct inode *inode; int rc; s64 newLVSize = 0; + int flag; jfs_info("In jfs_read_super s_dev=0x%x s_flags=0x%lx", sb->s_dev, sb->s_flags); @@ -248,10 +269,12 @@ memset(sbi, 0, sizeof (struct jfs_sb_info)); sb->u.generic_sbp = sbi; - if (!parse_options((char *) data, sb, &newLVSize)) { + flag = 0; + if (!parse_options((char *) data, sb, &newLVSize, &flag)) { kfree(sbi); return NULL; } + sbi->flag = flag; if (newLVSize) { printk(KERN_ERR "resize option for remount only\n"); @@ -483,7 +506,7 @@ metapage_exit(); free_slab: kmem_cache_destroy(jfs_inode_cachep); - return -rc; + return rc; } static void __exit exit_jfs_fs(void) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/jfs/xattr.c linux-2.4.23-pre8/fs/jfs/xattr.c --- linux-2.4.22/fs/jfs/xattr.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/fs/jfs/xattr.c 2003-10-22 22:47:39.000000000 +0000 @@ -182,7 +182,7 @@ * used for an inline EA. */ if (!(ji->mode2 & INLINEEA) && !(ji->ea.flag & DXD_INLINE)) - return -1; + return -EPERM; DXDsize(ea, size); DXDlength(ea, 0); @@ -252,7 +252,7 @@ rc = dbAlloc(ip, INOHINT(ip), nblocks, &blkno); if (rc) - return -rc; + return rc; /* * Now have nblocks worth of storage to stuff into the FEALIST. @@ -513,7 +513,7 @@ rc = dbAlloc(inode, INOHINT(inode), (s64) blocks_needed, &blkno); if (rc) - return -rc; + return rc; DXDlength(&ea_buf->new_ea, blocks_needed); DXDaddress(&ea_buf->new_ea, blkno); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/lockd/svc4proc.c linux-2.4.23-pre8/fs/lockd/svc4proc.c --- linux-2.4.22/fs/lockd/svc4proc.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/lockd/svc4proc.c 2003-10-22 22:48:30.000000000 +0000 @@ -449,13 +449,11 @@ if (nlmsvc_ops != NULL) { struct svc_client *clnt; saddr.sin_addr.s_addr = argp->addr; - nlmsvc_ops->exp_readlock(); if ((clnt = nlmsvc_ops->exp_getclient(&saddr)) != NULL && (host = nlm_lookup_host(clnt, &saddr, 0, 0)) != NULL) { nlmsvc_free_host_resources(host); } nlm_release_host(host); - nlmsvc_ops->exp_unlock(); } return rpc_success; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/lockd/svclock.c linux-2.4.23-pre8/fs/lockd/svclock.c --- linux-2.4.22/fs/lockd/svclock.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/lockd/svclock.c 2003-10-22 22:48:20.000000000 +0000 @@ -188,6 +188,11 @@ locks_init_lock(&block->b_call.a_args.lock.fl); locks_init_lock(&block->b_call.a_res.lock.fl); + block->b_host = nlmsvc_lookup_host(rqstp); + if (block->b_host == NULL) { + goto failed_free; + } + if (!nlmclnt_setgrantargs(&block->b_call, lock)) goto failed_free; @@ -199,7 +204,6 @@ /* Create and initialize the block */ block->b_daemon = rqstp->rq_server; - block->b_host = host; block->b_file = file; /* Add to file's list of blocks */ @@ -265,8 +269,7 @@ } } - if (block->b_host) - nlm_release_host(block->b_host); + nlm_release_host(block->b_host); nlmclnt_freegrantargs(&block->b_call); kfree(block); } @@ -515,7 +518,7 @@ * Just retry the grant callback, possibly refreshing the RPC * binding */ if (block->b_granted) { - nlm_rebind_host(block->b_host); + nlm_rebind_host(block->b_call.a_host); goto callback; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/lockd/svcproc.c linux-2.4.23-pre8/fs/lockd/svcproc.c --- linux-2.4.22/fs/lockd/svcproc.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/lockd/svcproc.c 2003-10-22 22:49:10.000000000 +0000 @@ -477,13 +477,11 @@ if (nlmsvc_ops != NULL) { struct svc_client *clnt; saddr.sin_addr.s_addr = argp->addr; - nlmsvc_ops->exp_readlock(); if ((clnt = nlmsvc_ops->exp_getclient(&saddr)) != NULL && (host = nlm_lookup_host(clnt, &saddr, 0, 0)) != NULL) { nlmsvc_free_host_resources(host); } nlm_release_host(host); - nlmsvc_ops->exp_unlock(); } return rpc_success; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/namespace.c linux-2.4.23-pre8/fs/namespace.c --- linux-2.4.22/fs/namespace.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/namespace.c 2003-10-22 22:49:09.000000000 +0000 @@ -110,7 +110,7 @@ mnt->mnt_parent = mntget(nd->mnt); mnt->mnt_mountpoint = dget(nd->dentry); list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); - list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); + list_add_tail(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; } @@ -763,7 +763,7 @@ return -EPERM; } - new_ns = kmalloc(sizeof(struct namespace *), GFP_KERNEL); + new_ns = kmalloc(sizeof(struct namespace), GFP_KERNEL); if (!new_ns) goto out; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/nfs/nfs3proc.c linux-2.4.23-pre8/fs/nfs/nfs3proc.c --- linux-2.4.22/fs/nfs/nfs3proc.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/nfs/nfs3proc.c 2003-10-22 22:48:55.000000000 +0000 @@ -433,8 +433,6 @@ * The decode function itself doesn't perform any decoding, it just makes * sure the reply is syntactically correct. * - * Also note that this implementation handles both plain readdir and - * readdirplus. */ static int nfs3_proc_readdir(struct inode *dir, struct rpc_cred *cred, @@ -448,11 +446,7 @@ struct rpc_message msg = { NFS3PROC_READDIR, &arg, &res, cred }; int status; - if (plus) - msg.rpc_proc = NFS3PROC_READDIRPLUS; - - dprintk("NFS call readdir%s %d\n", - plus? "plus" : "", (unsigned int) cookie); + dprintk("NFS call readdir %d\n", (unsigned int) cookie); dir_attr.valid = 0; status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/nfs/nfs3xdr.c linux-2.4.23-pre8/fs/nfs/nfs3xdr.c --- linux-2.4.22/fs/nfs/nfs3xdr.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/fs/nfs/nfs3xdr.c 2003-10-22 22:49:55.000000000 +0000 @@ -599,8 +599,6 @@ u32 * nfs3_decode_dirent(u32 *p, struct nfs_entry *entry, int plus) { - struct nfs_entry old = *entry; - if (!*p++) { if (!*p) return ERR_PTR(-EAGAIN); @@ -616,20 +614,12 @@ p = xdr_decode_hyper(p, &entry->cookie); if (plus) { - p = xdr_decode_post_op_attr(p, &entry->fattr); + struct nfs_fattr fattr; + p = xdr_decode_post_op_attr(p, &fattr); /* In fact, a post_op_fh3: */ if (*p++) { - p = xdr_decode_fhandle(p, &entry->fh); - /* Ugh -- server reply was truncated */ - if (p == NULL) { - dprintk("NFS: FH truncated\n"); - *entry = old; - return ERR_PTR(-EAGAIN); - } - } else { - /* If we don't get a file handle, the attrs - * aren't worth a lot. */ - entry->fattr.valid = 0; + struct nfs_fh fh; + p = xdr_decode_fhandle(p, &fh); } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/nfs/write.c linux-2.4.23-pre8/fs/nfs/write.c --- linux-2.4.22/fs/nfs/write.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/nfs/write.c 2003-10-22 22:47:59.000000000 +0000 @@ -225,8 +225,19 @@ struct inode *inode = page->mapping->host; unsigned long end_index; unsigned offset = PAGE_CACHE_SIZE; + int inode_referenced = 0; int err; + /* + * Note: We need to ensure that we have a reference to the inode + * if we are to do asynchronous writes. If not, waiting + * in nfs_wait_on_request() may deadlock with clear_inode(). + * + * If igrab() fails here, then it is in any case safe to + * call nfs_wb_page(), since there will be no pending writes. + */ + if (igrab(inode) != 0) + inode_referenced = 1; end_index = inode->i_size >> PAGE_CACHE_SHIFT; /* Ensure we've flushed out any previous writes */ @@ -244,7 +255,8 @@ goto out; do_it: lock_kernel(); - if (NFS_SERVER(inode)->wsize >= PAGE_CACHE_SIZE && !IS_SYNC(inode)) { + if (NFS_SERVER(inode)->wsize >= PAGE_CACHE_SIZE && !IS_SYNC(inode) && + inode_referenced) { err = nfs_writepage_async(NULL, inode, page, 0, offset); if (err >= 0) err = 0; @@ -256,7 +268,9 @@ unlock_kernel(); out: UnlockPage(page); - return err; + if (inode_referenced) + iput(inode); + return err; } /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/nfsd/export.c linux-2.4.23-pre8/fs/nfsd/export.c --- linux-2.4.22/fs/nfsd/export.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/nfsd/export.c 2003-10-22 22:49:03.000000000 +0000 @@ -640,7 +640,7 @@ { NFSEXP_UIDMAP, {"uidmap", ""}}, { NFSEXP_KERBEROS, { "kerberos", ""}}, { NFSEXP_SUNSECURE, { "sunsecure", ""}}, - { NFSEXP_CROSSMNT, {"nohide", ""}}, + { NFSEXP_NOHIDE, {"nohide", ""}}, { NFSEXP_NOSUBTREECHECK, {"no_subtree_check", ""}}, { NFSEXP_NOAUTHNLM, {"insecure_locks", ""}}, #ifdef MSNFS @@ -903,8 +903,10 @@ { struct svc_client *clp; + exp_readlock(); for (clp = clients; clp; clp = clp->cl_next) nfsd_lockd_unexport(clp); + exp_unlock(); } /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/nfsd/nfsfh.c linux-2.4.23-pre8/fs/nfsd/nfsfh.c --- linux-2.4.22/fs/nfsd/nfsfh.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/nfsd/nfsfh.c 2003-10-22 22:48:30.000000000 +0000 @@ -305,6 +305,7 @@ if (pdentry) { igrab(tdentry->d_inode); pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; + pdentry->d_op = child->d_op; } } if (pdentry == NULL) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/nfsd/vfs.c linux-2.4.23-pre8/fs/nfsd/vfs.c --- linux-2.4.22/fs/nfsd/vfs.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/nfsd/vfs.c 2003-10-22 22:48:34.000000000 +0000 @@ -82,7 +82,7 @@ * N.B. After this call _both_ fhp and resfh need an fh_put * * If the lookup would cross a mountpoint, and the mounted filesystem - * is exported to the client with NFSEXP_CROSSMNT, then the lookup is + * is exported to the client with NFSEXP_NOHIDE, then the lookup is * accepted as it stands and the mounted directory is * returned. Otherwise the covered directory is returned. * NOTE: this mountpoint crossing is not supported properly by all @@ -116,7 +116,7 @@ dentry = dget(dparent); else if (dparent != exp->ex_dentry) dentry = dget(dparent->d_parent); - else if (!EX_CROSSMNT(exp)) + else if (!EX_NOHIDE(exp)) dentry = dget(dparent); /* .. == . just like at / */ else { /* checking mountpoint crossing is very different when stepping up */ @@ -158,7 +158,7 @@ exp2 = exp_get(rqstp->rq_client, mounts->d_inode->i_dev, mounts->d_inode->i_ino); - if (exp2 && EX_CROSSMNT(exp2)) { + if (exp2 && EX_NOHIDE(exp2)) { /* successfully crossed mount point */ exp = exp2; dput(dentry); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/ntfs/dir.c linux-2.4.23-pre8/fs/ntfs/dir.c --- linux-2.4.22/fs/ntfs/dir.c 2001-11-04 00:35:46.000000000 +0000 +++ linux-2.4.23-pre8/fs/ntfs/dir.c 2003-10-22 22:48:59.000000000 +0000 @@ -802,17 +802,17 @@ u8 ibs_bits; if (!ino) { - ntfs_error(__FUNCTION__ "(): No inode! Returning -EINVAL.\n"); + ntfs_error("%s(): No inode! Returning -EINVAL.\n",__FUNCTION__); return -EINVAL; } vol = ino->vol; if (!vol) { - ntfs_error(__FUNCTION__ "(): Inode 0x%lx has no volume. " - "Returning -EINVAL.\n", ino->i_number); + ntfs_error("%s(): Inode 0x%lx has no volume. Returning " + "-EINVAL.\n", __FUNCTION__, ino->i_number); return -EINVAL; } - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 1: Entering for " - "inode 0x%lx, p_high = 0x%x, p_low = 0x%x.\n", + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 1: Entering for inode 0x%lx, " + "p_high = 0x%x, p_low = 0x%x.\n", __FUNCTION__, ino->i_number, *p_high, *p_low); if (!*p_high) { /* We are still in the index root. */ @@ -827,8 +827,8 @@ ino->u.index.recordsize = ibs = NTFS_GETU32(buf + 0x8); ino->u.index.clusters_per_record = NTFS_GETU32(buf + 0xC); entry = buf + 0x20; - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 2: In index " - "root.\n"); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 2: In index root.\n", + __FUNCTION__); ibs_bits = ffs(ibs) - 1; /* Compensate for faked "." and "..". */ start = 2; @@ -850,15 +850,15 @@ if (err || io.size != ibs) goto read_err_ret; if (!ntfs_check_index_record(ino, buf)) { - ntfs_error(__FUNCTION__ "(): Index block 0x%x is not " - "an index record. Returning " - "-ENOTDIR.\n", *p_high - 1); + ntfs_error("%s(): Index block 0x%x is not an index " + "record. Returning -ENOTDIR.\n", + __FUNCTION__, *p_high - 1); ntfs_free(buf); return -ENOTDIR; } entry = buf + 0x18 + NTFS_GETU16(buf + 0x18); - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 3: In index " - "allocation.\n"); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 3: In index " + "allocation.\n", __FUNCTION__); start = 0; } /* Process the entries. */ @@ -867,29 +867,30 @@ entry += NTFS_GETU16(entry + 8)) { if (start < finish) { /* Skip entries that were already processed. */ - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 4: " - "Skipping already processed entry " - "p_high 0x%x, p_low 0x%x.\n", *p_high, + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 4: Skipping " + "already processed entry p_high 0x%x, " + "p_low 0x%x.\n", __FUNCTION__, *p_high, start); start++; continue; } - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 5: " - "Processing entry p_high 0x%x, p_low 0x%x.\n", + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 5: Processing entry " + "p_high 0x%x, p_low 0x%x.\n", __FUNCTION__, *p_high, *p_low); if ((err = cb(entry, param))) { /* filldir signalled us to stop. */ - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): " - "Unsorted 6: cb returned %i, " - "returning 0, p_high 0x%x, p_low 0x%x." - "\n", *p_high, *p_low); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 6: cb returned " + "%i, returning 0, p_high 0x%x, " + "p_low 0x%x.\n", __FUNCTION__, err, + *p_high, *p_low); ntfs_free(buf); return 0; } ++*p_low; } - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 7: After processing " - "entries, p_high 0x%x, p_low 0x%x.\n", *p_high, *p_low); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 7: After processing entries, " + "p_high 0x%x, p_low 0x%x.\n", __FUNCTION__, *p_high, + *p_low); /* We have to locate the next record. */ ntfs_free(buf); buf = 0; @@ -898,15 +899,15 @@ if (!attr) { /* Directory does not have index bitmap and index allocation. */ *p_high = 0x7fff; - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 8: No index " - "allocation. Returning 0, p_high 0x7fff, " - "p_low 0x0.\n"); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 8: No index allocation. " + "Returning 0, p_high 0x7fff, p_low 0x0.\n", + __FUNCTION__); return 0; } max_size = attr->size; if (max_size > 0x7fff >> 3) { - ntfs_error(__FUNCTION__ "(): Directory too large. Visible " - "length is truncated.\n"); + ntfs_error("%s(): Directory too large. Visible " + "length is truncated.\n", __FUNCTION__); max_size = 0x7fff >> 3; } buf = ntfs_malloc(max_size); @@ -920,26 +921,26 @@ attr = ntfs_find_attr(ino, vol->at_index_allocation, I30); if (!attr) { ntfs_free(buf); - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 9: Find " - "attr failed. Returning -EIO.\n"); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 9: Find attr failed. " + "Returning -EIO.\n", __FUNCTION__); return -EIO; } if (attr->resident) { ntfs_free(buf); - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 9.5: IA is " - "resident. Not allowed. Returning EINVAL.\n"); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 9.5: IA is resident. Not" + " allowed. Returning EINVAL.\n", __FUNCTION__); return -EINVAL; } /* Loop while going through non-allocated index records. */ max_size <<= 3; while (1) { if (++*p_high >= 0x7fff) { - ntfs_error(__FUNCTION__ "(): Unsorted 10: Directory " + ntfs_error("%s(): Unsorted 10: Directory " "inode 0x%lx overflowed the maximum " "number of index allocation buffers " "the driver can cope with. Pretending " "to be at end of directory.\n", - ino->i_number); + __FUNCTION__, ino->i_number); goto fake_eod; } if (*p_high > max_size || (s64)*p_high << ibs_bits > @@ -949,10 +950,9 @@ *p_high = 0x7fff; *p_low = 0; ntfs_free(buf); - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted " - "10.5: No more index records. " - "Returning 0, p_high 0x7fff, p_low " - "0.\n"); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 10.5: No more " + "index records. Returning 0, p_high " + "0x7fff, p_low 0.\n", __FUNCTION__); return 0; } byte = (ntfs_cluster_t)(*p_high - 1); @@ -961,16 +961,15 @@ if ((buf[byte] & bit)) break; }; - ntfs_debug(DEBUG_DIR3, __FUNCTION__ "(): Unsorted 11: Done. " - "Returning 0, p_high 0x%x, p_low 0x%x.\n", *p_high, - *p_low); + ntfs_debug(DEBUG_DIR3, "%s(): Unsorted 11: Done. Returning 0, p_high " + "0x%x, p_low 0x%x.\n", __FUNCTION__, *p_high, *p_low); ntfs_free(buf); return 0; read_err_ret: if (!err) err = -EIO; - ntfs_error(__FUNCTION__ "(): Read failed. Returning error code %i.\n", - err); + ntfs_error("%s(): Read failed. Returning error code %i.\n", + __FUNCTION__, err); ntfs_free(buf); return err; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/ntfs/fs.c linux-2.4.23-pre8/fs/ntfs/fs.c --- linux-2.4.22/fs/ntfs/fs.c 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/fs/ntfs/fs.c 2003-10-22 22:47:59.000000000 +0000 @@ -114,9 +114,9 @@ if (!ntfs_ino) return -EINVAL; - ntfs_debug(DEBUG_LINUX, __FUNCTION__ "(): Entering for inode 0x%lx, " - "*pos 0x%Lx, count 0x%x.\n", ntfs_ino->i_number, *pos, - count); + ntfs_debug(DEBUG_LINUX, "%s(): Entering for inode 0x%lx, *pos 0x%Lx, " + "count 0x%x.\n", __FUNCTION__, ntfs_ino->i_number, + *pos, count); /* Allows to lock fs ro at any time. */ if (vfs_ino->i_sb->s_flags & MS_RDONLY) return -EROFS; @@ -140,7 +140,7 @@ io.size = count; io.do_read = 0; err = ntfs_readwrite_attr(ntfs_ino, data, *pos, &io); - ntfs_debug(DEBUG_LINUX, __FUNCTION__ "(): Returning %i\n", -err); + ntfs_debug(DEBUG_LINUX, "%s(): Returning %i\n", __FUNCTION__, -err); if (!err) { *pos += io.size; if (*pos > vfs_ino->i_size) @@ -196,20 +196,20 @@ err = ntfs_encodeuni(NTFS_INO2VOL(nf->dir), (ntfs_u16*)(entry + 0x52), name_len, &nf->name, &nf->namelen); if (err) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Skipping " - "unrepresentable file.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Skipping unrepresentable " + "file.\n", __FUNCTION__); err = 0; goto err_ret; } if (!show_sys_files && inum < 0x10UL) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Skipping system " - "file (%s).\n", nf->name); + ntfs_debug(DEBUG_OTHER, "%s(): Skipping system file (%s).\n", + __FUNCTION__, nf->name); err = 0; goto err_ret; } /* Do not return ".", as this is faked. */ if (nf->namelen == 1 && nf->name[0] == '.') { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Skipping \".\"\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Skipping \".\"\n", __FUNCTION__); err = 0; goto err_ret; } @@ -218,8 +218,8 @@ file_type = DT_DIR; else file_type = DT_REG; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Calling filldir for %s with " - "len %i, f_pos 0x%Lx, inode %lu, %s.\n", + ntfs_debug(DEBUG_OTHER, "%s(): Calling filldir for %s with " + "len %i, f_pos 0x%Lx, inode %lu, %s.\n", __FUNCTION__, nf->name, nf->namelen, (loff_t)(nf->ph << 16) | nf->pl, inum, file_type == DT_DIR ? "DT_DIR" : "DT_REG"); /* @@ -254,16 +254,16 @@ cb.pl = filp->f_pos & 0xffff; cb.ph = (filp->f_pos >> 16) & 0x7fff; filp->f_pos = (loff_t)(cb.ph << 16) | cb.pl; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Entering for inode %lu, " - "f_pos 0x%Lx, i_mode 0x%x, i_count %lu.\n", dir->i_ino, - filp->f_pos, (unsigned int)dir->i_mode, + ntfs_debug(DEBUG_OTHER, "%s(): Entering for inode %lu, f_pos 0x%Lx, " + "i_mode 0x%x, i_count %lu.\n", __FUNCTION__, + dir->i_ino, filp->f_pos, (unsigned int)dir->i_mode, atomic_read(&dir->i_count)); if (!cb.ph) { /* Start of directory. Emulate "." and "..". */ if (!cb.pl) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Calling " - "filldir for . with len 1, f_pos 0x%Lx, " - "inode %lu, DT_DIR.\n", filp->f_pos, + ntfs_debug(DEBUG_OTHER, "%s(): Calling filldir for . " + "with len 1, f_pos 0x%Lx, inode %lu, " + "DT_DIR.\n", __FUNCTION__, filp->f_pos, dir->i_ino); cb.ret_code = filldir(dirent, ".", 1, filp->f_pos, dir->i_ino, DT_DIR); @@ -273,9 +273,9 @@ filp->f_pos = (loff_t)(cb.ph << 16) | cb.pl; } if (cb.pl == (u32)1) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Calling " - "filldir for .. with len 2, f_pos 0x%Lx, " - "inode %lu, DT_DIR.\n", filp->f_pos, + ntfs_debug(DEBUG_OTHER, "%s(): Calling filldir for .. " + "with len 2, f_pos 0x%Lx, inode %lu, " + "DT_DIR.\n", __FUNCTION__, filp->f_pos, filp->f_dentry->d_parent->d_inode->i_ino); cb.ret_code = filldir(dirent, "..", 2, filp->f_pos, filp->f_dentry->d_parent->d_inode->i_ino, @@ -293,30 +293,31 @@ cb.dirent = dirent; cb.type = NTFS_INO2VOL(dir)->ngt; do { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Looking for next " - "file using ntfs_getdir_unsorted(), f_pos " - "0x%Lx.\n", (loff_t)(cb.ph << 16) | cb.pl); + ntfs_debug(DEBUG_OTHER, "%s(): Looking for next file using " + "ntfs_getdir_unsorted(), f_pos 0x%Lx.\n", + __FUNCTION__, (loff_t)(cb.ph << 16) | cb.pl); err = ntfs_getdir_unsorted(NTFS_LINO2NINO(dir), &cb.ph, &cb.pl, ntfs_printcb, &cb); } while (!err && !cb.ret_code && cb.ph < 0x7fff); filp->f_pos = (loff_t)(cb.ph << 16) | cb.pl; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After ntfs_getdir_unsorted()" - " calls, f_pos 0x%Lx.\n", filp->f_pos); + ntfs_debug(DEBUG_OTHER, "%s(): After ntfs_getdir_unsorted()" + " calls, f_pos 0x%Lx.\n", __FUNCTION__, filp->f_pos); if (!err) { done: #ifdef DEBUG if (!cb.ret_code) - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): EOD, f_pos " - "0x%Lx, returning 0.\n", filp->f_pos); + ntfs_debug(DEBUG_OTHER, "%s(): EOD, f_pos 0x%Lx, " + "returning 0.\n", __FUNCTION__, + filp->f_pos); else - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): filldir " - "returned %i, returning 0, f_pos " - "0x%Lx.\n", cb.ret_code, filp->f_pos); + ntfs_debug(DEBUG_OTHER, "%s(): filldir returned %i, " + "returning 0, f_pos 0x%Lx.\n", + __FUNCTION__, cb.ret_code, filp->f_pos); #endif return 0; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning %i, f_pos 0x%Lx.\n", - err, filp->f_pos); + ntfs_debug(DEBUG_OTHER, "%s(): Returning %i, f_pos 0x%Lx.\n", + __FUNCTION__, err, filp->f_pos); return err; } @@ -524,8 +525,8 @@ ntfs_iterate_s walk; int err; - ntfs_debug(DEBUG_NAME1, __FUNCTION__ "(): Looking up %s in directory " - "ino 0x%x.\n", d->d_name.name, (unsigned)dir->i_ino); + ntfs_debug(DEBUG_NAME1, "%s(): Looking up %s in directory ino 0x%x.\n", + __FUNCTION__, d->d_name.name, (unsigned)dir->i_ino); walk.name = NULL; walk.namelen = 0; /* Convert to wide string. */ @@ -847,7 +848,6 @@ goto unl_out; } break; - default: /* Nothing. Just clear the inode and exit. */ } ntfs_clear_inode(&inode->u.ntfs_i); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/ntfs/inode.c linux-2.4.23-pre8/fs/ntfs/inode.c --- linux-2.4.22/fs/ntfs/inode.c 2001-12-21 17:42:03.000000000 +0000 +++ linux-2.4.23-pre8/fs/ntfs/inode.c 2003-10-22 22:48:30.000000000 +0000 @@ -671,8 +671,8 @@ ntfs_cluster_t cluster, s_cluster, vcn, len; __s64 l, chunk, copied; - ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): %s 0x%x bytes at offset " - "0x%Lx %s inode 0x%x, attr type 0x%x.\n", + ntfs_debug(DEBUG_FILE3, "%s(): %s 0x%x bytes at offset " + "0x%Lx %s inode 0x%x, attr type 0x%x.\n", __FUNCTION__, dest->do_read ? "Read" : "Write", dest->size, offset, dest->do_read ? "from" : "to", ino->i_number, attr->type); @@ -746,10 +746,10 @@ vcn + attr->d.r.runlist[rnum].len <= s_vcn; rnum++) vcn += attr->d.r.runlist[rnum].len; if (rnum == attr->d.r.len) { - ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): EOPNOTSUPP: " + ntfs_debug(DEBUG_FILE3, "%s(): EOPNOTSUPP: " "inode = 0x%x, rnum = %i, offset = 0x%Lx, vcn = 0x%x, " - "s_vcn = 0x%x.\n", ino->i_number, rnum, offset, vcn, - s_vcn); + "s_vcn = 0x%x.\n", __FUNCTION__, ino->i_number, rnum, + offset, vcn, s_vcn); dump_runlist(attr->d.r.runlist, attr->d.r.len); /*FIXME: Should extend runlist. */ return -EOPNOTSUPP; @@ -793,8 +793,8 @@ buf->do_read = 1; attr = ntfs_find_attr(ino, type, name); if (!attr) { - ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): attr 0x%x not found " - "in inode 0x%x\n", type, ino->i_number); + ntfs_debug(DEBUG_FILE3, "%s(): attr 0x%x not found in inode " + "0x%x\n", __FUNCTION__, type, ino->i_number); return -EINVAL; } return ntfs_readwrite_attr(ino, attr, offset, buf); @@ -808,8 +808,8 @@ buf->do_read = 0; attr = ntfs_find_attr(ino, type, name); if (!attr) { - ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): attr 0x%x not found " - "in inode 0x%x\n", type, ino->i_number); + ntfs_debug(DEBUG_FILE3, "%s(): attr 0x%x not found in inode " + "0x%x\n", __FUNCTION__, type, ino->i_number); return -EINVAL; } return ntfs_readwrite_attr(ino, attr, offset, buf); @@ -1332,7 +1332,7 @@ int i; ntfs_cluster_t ct; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): rlen = %i.\n", rlen); + ntfs_debug(DEBUG_OTHER, "%s(): rlen = %i.\n", __FUNCTION__, rlen); ntfs_debug(DEBUG_OTHER, "VCN LCN Run length\n"); for (i = 0, ct = 0; i < rlen; ct += rl[i++].len) { if (rl[i].lcn == (ntfs_cluster_t)-1) @@ -1372,30 +1372,31 @@ ntfs_runlist *rl; int rlen, rl_size, rl2_pos; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Entering with *r1len = %i, " - "r2len = %i.\n", *r1len, r2len); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Dumping 1st runlist.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Entering with *r1len = %i, " + "r2len = %i.\n", __FUNCTION__, *r1len, r2len); + ntfs_debug(DEBUG_OTHER, "%s(): Dumping 1st runlist.\n", __FUNCTION__); if (*rl1) dump_runlist(*rl1, *r1len); else - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Not present.\n"); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Dumping 2nd runlist.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Not present.\n", __FUNCTION__); + ntfs_debug(DEBUG_OTHER, "%s(): Dumping 2nd runlist.\n", __FUNCTION__); dump_runlist(rl2, r2len); rlen = *r1len + r2len + 1; rl_size = (rlen * sizeof(ntfs_runlist) + PAGE_SIZE - 1) & PAGE_MASK; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): rlen = %i, rl_size = %i.\n", - rlen, rl_size); + ntfs_debug(DEBUG_OTHER, "%s(): rlen = %i, rl_size = %i.\n", + __FUNCTION__, rlen, rl_size); /* Do we have enough space? */ if (rl_size <= ((*r1len * sizeof(ntfs_runlist) + PAGE_SIZE - 1) & PAGE_MASK)) { /* Have enough space already. */ rl = *rl1; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Have enough space " - "already.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Have enough space already.\n", + __FUNCTION__); } else { /* Need more space. Reallocate. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Need more space.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Need more space.\n", + __FUNCTION__); rl = ntfs_vmalloc(rlen << sizeof(ntfs_runlist)); if (!rl) return -ENOMEM; @@ -1406,17 +1407,17 @@ } /* Reuse rl_size as the current position index into rl. */ rl_size = *r1len - 1; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): rl_size = %i.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): rl_size = %i.\n", __FUNCTION__,rl_size); /* Coalesce neighbouring elements, if present. */ rl2_pos = 0; if (rl[rl_size].lcn + rl[rl_size].len == rl2[rl2_pos].lcn) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Coalescing adjacent " - "runs.\n"); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before: " - "rl[rl_size].len = %i.\n", rl[rl_size].len); + ntfs_debug(DEBUG_OTHER, "%s(): Coalescing adjacent runs.\n", + __FUNCTION__); + ntfs_debug(DEBUG_OTHER, "%s(): Before: rl[rl_size].len = %i.\n", + __FUNCTION__, rl[rl_size].len); rl[rl_size].len += rl2[rl2_pos].len; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After: " - "rl[rl_size].len = %i.\n", rl[rl_size].len); + ntfs_debug(DEBUG_OTHER, "%s(): After: rl[rl_size].len = %i.\n", + __FUNCTION__, rl[rl_size].len); rl2_pos++; r2len--; rlen--; @@ -1428,10 +1429,11 @@ rl[rlen].lcn = (ntfs_cluster_t)-1; rl[rlen].len = (ntfs_cluster_t)0; *r1len = rlen; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Dumping result runlist.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Dumping result runlist.\n", + __FUNCTION__); dump_runlist(*rl1, *r1len); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning with *r1len = " - "%i.\n", rlen); + ntfs_debug(DEBUG_OTHER, "%s(): Returning with *r1len = %i.\n", + __FUNCTION__, rlen); return 0; } @@ -1546,7 +1548,7 @@ /* Determine the number of allocated mft records in the mft. */ pass_end = nr_mft_records = data->allocated >> vol->mft_record_size_bits; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): nr_mft_records = %lu.\n", + ntfs_debug(DEBUG_OTHER, "%s(): nr_mft_records = %lu.\n", __FUNCTION__, nr_mft_records); /* Make sure we don't overflow the bitmap. */ l = bmp->initialized << 3; @@ -1565,9 +1567,10 @@ lcn = rl[rlen].lcn + rl[rlen].len; io.fn_put = ntfs_put; io.fn_get = ntfs_get; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Starting bitmap search.\n"); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): pass = %i, pass_start = %lu, " - "pass_end = %lu.\n", pass, pass_start, pass_end); + ntfs_debug(DEBUG_OTHER, "%s(): Starting bitmap search.\n", + __FUNCTION__); + ntfs_debug(DEBUG_OTHER, "%s(): pass = %i, pass_start = %lu, pass_end = " + "%lu.\n", __FUNCTION__, pass, pass_start, pass_end); byte = NULL; // FIXME: For debugging only. /* Loop until a free mft record is found. */ io.size = (nr_mft_records >> 3) & ~PAGE_MASK; @@ -1575,29 +1578,29 @@ io.param = buf; io.do_read = 1; last_read_pos = buf_pos >> 3; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): Before: bmp->allocated = 0x%Lx, " + "bmp->size = 0x%Lx, bmp->initialized = " + "0x%Lx.\n", __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); err = ntfs_readwrite_attr(vol->mft_ino, bmp, last_read_pos, &io); if (err) goto err_ret; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Read %lu bytes.\n", + ntfs_debug(DEBUG_OTHER, "%s(): Read %lu bytes.\n", __FUNCTION__, (unsigned long)io.size); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): After: bmp->allocated = 0x%Lx, " + "bmp->size = 0x%Lx, bmp->initialized = " + "0x%Lx.\n", __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); if (!io.size) goto pass_done; buf_size = io.size << 3; bit = buf_pos & 7UL; buf_pos &= ~7UL; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before loop: " - "buf_size = %lu, buf_pos = %lu, bit = %lu, " - "*byte = 0x%x, b = %u.\n", - buf_size, buf_pos, bit, byte ? *byte : -1, b); + ntfs_debug(DEBUG_OTHER, "%s(): Before loop: buf_size = %lu, " + "buf_pos = %lu, bit = %lu, *byte = 0x%x, b = " + "%u.\n", __FUNCTION__, buf_size, buf_pos, bit, + byte ? *byte : -1, b); for (; bit < buf_size && bit + buf_pos < pass_end; bit &= ~7UL, bit += 8UL) { byte = buf + (bit >> 3); @@ -1606,34 +1609,35 @@ b = ffz((unsigned long)*byte); if (b < (__u8)8 && b >= (bit & 7UL)) { bit = b + (bit & ~7UL) + buf_pos; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Found free rec in for loop. " - "bit = %lu\n", bit); + ntfs_debug(DEBUG_OTHER, "%s(): Found free rec " + "in for loop. bit = %lu\n", + __FUNCTION__, bit); goto found_free_rec; } } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After loop: " - "buf_size = %lu, buf_pos = %lu, bit = %lu, " - "*byte = 0x%x, b = %u.\n", - buf_size, buf_pos, bit, byte ? *byte : -1, b); + ntfs_debug(DEBUG_OTHER, "%s(): After loop: buf_size = %lu, " + "buf_pos = %lu, bit = %lu, *byte = 0x%x, b = " + "%u.\n", __FUNCTION__, buf_size, buf_pos, bit, + byte ? *byte : -1, b); buf_pos += buf_size; if (buf_pos < pass_end) continue; pass_done: /* Finished with the current pass. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At pass_done.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At pass_done.\n", __FUNCTION__); if (pass == 1) { /* * Now do pass 2, scanning the first part of the zone * we omitted in pass 1. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Done pass " - "1.\n"); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Pass = 2.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Done pass 1.\n", + __FUNCTION__); + ntfs_debug(DEBUG_OTHER, "%s(): Pass = 2.\n", + __FUNCTION__); pass = 2; pass_end = pass_start; buf_pos = pass_start = 24UL; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): pass = %i, " - "pass_start = %lu, pass_end = %lu.\n", + ntfs_debug(DEBUG_OTHER, "%s(): pass = %i, pass_start = " + "%lu, pass_end = %lu.\n", __FUNCTION__, pass, pass_start, pass_end); continue; } /* pass == 2 */ @@ -1649,21 +1653,21 @@ bit = nr_mft_records; if (bit < 24UL) bit = 24UL; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Found free " - "record bit (#1) = 0x%lx.\n", bit); + ntfs_debug(DEBUG_OTHER, "%s(): Found free record bit " + "(#1) = 0x%lx.\n", __FUNCTION__, bit); goto found_free_rec; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Done pass 2.\n"); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): Done pass 2.\n", __FUNCTION__); + ntfs_debug(DEBUG_OTHER, "%s(): Before: bmp->allocated = 0x%Lx, " + "bmp->size = 0x%Lx, bmp->initialized = " + "0x%Lx.\n", __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); /* Need to extend the mft bitmap. */ if (bmp->initialized + 8LL > bmp->allocated) { ntfs_io io2; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Initialized " - "> allocated.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Initialized " + "> allocated.\n", __FUNCTION__); /* Need to extend bitmap by one more cluster. */ rl = bmp->d.r.runlist; rlen = bmp->d.r.len - 1; @@ -1677,8 +1681,8 @@ &io2); if (err) goto err_ret; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Read %lu " - "bytes.\n", (unsigned long)io2.size); + ntfs_debug(DEBUG_OTHER, "%s(): Read %lu bytes.\n", + __FUNCTION__, (unsigned long)io2.size); if (io2.size == 1 && b != 0xff) { __u8 tb = 1 << (lcn & (ntfs_cluster_t)7); if (!(b & tb)) { @@ -1695,9 +1699,10 @@ } append_mftbmp_simple: rl[rlen].len++; have_allocated_mftbmp |= 1; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Appending one " - "cluster to mftbmp.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): " + "Appending one cluster " + "to mftbmp.\n", + __FUNCTION__); } } if (!have_allocated_mftbmp) { @@ -1713,11 +1718,12 @@ if (count > 0) { rl2_dealloc_err_out: if (ntfs_deallocate_clusters( vol, rl2, r2len)) - ntfs_error(__FUNCTION__ - "(): Cluster " + ntfs_error("%s(): " + "Cluster " "deallocation in error " "code path failed! You " - "should run chkdsk.\n"); + "should run chkdsk.\n", + __FUNCTION__); } ntfs_vfree(rl2); if (!err) @@ -1752,10 +1758,9 @@ rl[rlen].len = count; bmp->d.r.len = ++rlen; have_allocated_mftbmp |= 2; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Adding run to mftbmp. " - "LCN = %i, len = %i\n", lcn, - count); + ntfs_debug(DEBUG_OTHER, "%s(): Adding run to " + "mftbmp. LCN = %i, len = %i\n", + __FUNCTION__, lcn, count); } /* * We now have extended the mft bitmap allocated size @@ -1763,24 +1768,24 @@ */ bmp->allocated += (__s64)vol->cluster_size; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): After: bmp->allocated = 0x%Lx, " + "bmp->size = 0x%Lx, bmp->initialized = " + "0x%Lx.\n", __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); /* We now have sufficient allocated space. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Now have sufficient " - "allocated space in mftbmp.\n"); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): Now have sufficient allocated " + "space in mftbmp.\n", __FUNCTION__); + ntfs_debug(DEBUG_OTHER, "%s(): Before: bmp->allocated = 0x%Lx, " + "bmp->size = 0x%Lx, bmp->initialized = " + "0x%Lx.\n", __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); buf_pos = bmp->initialized; bmp->initialized += 8LL; if (bmp->initialized > bmp->size) bmp->size = bmp->initialized; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): After: bmp->allocated = 0x%Lx, " + "bmp->size = 0x%Lx, bmp->initialized = " + "0x%Lx.\n", __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); have_allocated_mftbmp |= 4; /* Update the mft bitmap attribute value. */ @@ -1794,27 +1799,27 @@ err = -EIO; goto shrink_mftbmp_err_ret; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote extended " - "mftbmp bytes %lu.\n", (unsigned long)io.size); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After write: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): Wrote extended mftbmp bytes " + "%lu.\n", __FUNCTION__, (unsigned long)io.size); + ntfs_debug(DEBUG_OTHER, "%s(): After write: bmp->allocated = " + "0x%Lx, bmp->size = 0x%Lx, bmp->initialized = " + "0x%Lx.\n", __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); bit = buf_pos << 3; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Found free record " - "bit (#2) = 0x%lx.\n", bit); + ntfs_debug(DEBUG_OTHER, "%s(): Found free record bit (#2) = " + "0x%lx.\n", __FUNCTION__, bit); goto found_free_rec; } found_free_rec: /* bit is the found free mft record. Allocate it in the mft bitmap. */ vol->mft_data_pos = bit; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At found_free_rec.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At found_free_rec.\n", __FUNCTION__); io.param = buf; io.size = 1; io.do_read = 1; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before update: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): Before update: bmp->allocated = 0x%Lx, " + "bmp->size = 0x%Lx, bmp->initialized = 0x%Lx.\n", + __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); err = ntfs_readwrite_attr(vol->mft_ino, bmp, bit >> 3, &io); if (err || io.size != 1) { @@ -1822,7 +1827,7 @@ err = -EIO; goto shrink_mftbmp_err_ret; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Read %lu bytes.\n", + ntfs_debug(DEBUG_OTHER, "%s(): Read %lu bytes.\n", __FUNCTION__, (unsigned long)io.size); #ifdef DEBUG /* Check our bit is really zero! */ @@ -1838,22 +1843,22 @@ err = -EIO; goto shrink_mftbmp_err_ret; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote %lu bytes.\n", + ntfs_debug(DEBUG_OTHER, "%s(): Wrote %lu bytes.\n", __FUNCTION__, (unsigned long)io.size); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After update: " - "bmp->allocated = 0x%Lx, bmp->size = 0x%Lx, " - "bmp->initialized = 0x%Lx.\n", bmp->allocated, + ntfs_debug(DEBUG_OTHER, "%s(): After update: bmp->allocated = 0x%Lx, " + "bmp->size = 0x%Lx, bmp->initialized = 0x%Lx.\n", + __FUNCTION__, bmp->allocated, bmp->size, bmp->initialized); /* The mft bitmap is now uptodate. Deal with mft data attribute now. */ ll = (__s64)(bit + 1) << vol->mft_record_size_bits; if (ll <= data->initialized) { /* The allocated record is already initialized. We are done! */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Allocated mft record " - "already initialized!\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Allocated mft record " + "already initialized!\n", __FUNCTION__); goto done_ret; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Allocated mft record needs " - "to be initialized.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Allocated mft record needs " + "to be initialized.\n", __FUNCTION__); /* The mft record is outside the initialized data. */ mft_rec_size = (unsigned long)vol->mft_record_size; /* Preserve old values for undo purposes. */ @@ -1868,32 +1873,31 @@ while (ll > data->allocated) { ntfs_cluster_t lcn2, nr_lcn2, nr, min_nr; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Extending mft " - "data allocation, data->allocated = 0x%Lx, " - "data->size = 0x%Lx, data->initialized = " - "0x%Lx.\n", data->allocated, data->size, - data->initialized); + ntfs_debug(DEBUG_OTHER, "%s(): Extending mft data allocation, " + "data->allocated = 0x%Lx, data->size = 0x%Lx, " + "data->initialized = 0x%Lx.\n", __FUNCTION__, + data->allocated, data->size, data->initialized); /* Minimum allocation is one mft record worth of clusters. */ if (mft_rec_size <= vol->cluster_size) min_nr = (ntfs_cluster_t)1; else min_nr = mft_rec_size >> vol->cluster_size_bits; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): min_nr = %i.\n", + ntfs_debug(DEBUG_OTHER, "%s(): min_nr = %i.\n", __FUNCTION__, min_nr); /* Allocate 16 mft records worth of clusters. */ nr = mft_rec_size << 4 >> vol->cluster_size_bits; if (!nr) nr = (ntfs_cluster_t)1; /* Determine the preferred allocation location. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): nr = %i.\n", nr); + ntfs_debug(DEBUG_OTHER, "%s(): nr = %i.\n", __FUNCTION__, nr); rl2 = data->d.r.runlist; r2len = data->d.r.len; lcn2 = rl2[r2len - 1].lcn + rl2[r2len - 1].len; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): rl2[r2len - 1].lcn " - "= %i, .len = %i.\n", rl2[r2len - 1].lcn, + ntfs_debug(DEBUG_OTHER, "%s(): rl2[r2len - 1].lcn = %i, .len = " + "%i.\n", __FUNCTION__, rl2[r2len - 1].lcn, rl2[r2len - 1].len); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): lcn2 = %i, r2len = " - "%i.\n", lcn2, r2len); + ntfs_debug(DEBUG_OTHER, "%s(): lcn2 = %i, r2len = %i.\n", + __FUNCTION__, lcn2, r2len); retry_mft_data_allocation: nr_lcn2 = nr; err = ntfs_allocate_clusters(vol, &lcn2, &nr_lcn2, &rl2, @@ -1913,36 +1917,34 @@ if (err == -ENOSPC && nr > min_nr && nr_lcn2 >= min_nr) { nr = min_nr; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Retrying mft data " - "allocation, nr = min_nr = %i" - ".\n", nr); + ntfs_debug(DEBUG_OTHER, "%s(): Retrying mft " + "data allocation, nr = min_nr " + "= %i.\n", __FUNCTION__, nr); goto retry_mft_data_allocation; } goto undo_mftbmp_alloc_err_ret; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Allocated %i " - "clusters starting at LCN %i.\n", nr_lcn2, - lcn2); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Allocated " - "runlist:\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Allocated %i clusters starting " + "at LCN %i.\n", __FUNCTION__, nr_lcn2, lcn2); + ntfs_debug(DEBUG_OTHER, "%s(): Allocated runlist:\n", + __FUNCTION__); dump_runlist(rl2, r2len); /* Append rl2 to the mft data attribute's run list. */ err = splice_runlists(&data->d.r.runlist, (int*)&data->d.r.len, rl2, r2len); if (err) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "splice_runlists failed with error " - "code %i.\n", -err); + ntfs_debug(DEBUG_OTHER, "%s(): splice_runlists failed " + "with error code %i.\n", __FUNCTION__, + -err); goto undo_partial_data_alloc_err_ret; } /* Reflect the allocated clusters in the mft allocated data. */ data->allocated += nr_lcn2 << vol->cluster_size_bits; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After extending mft " - "data allocation, data->allocated = 0x%Lx, " + ntfs_debug(DEBUG_OTHER, "%s(): After extending mft data " + "allocation, data->allocated = 0x%Lx, " "data->size = 0x%Lx, data->initialized = " - "0x%Lx.\n", data->allocated, data->size, - data->initialized); + "0x%Lx.\n", __FUNCTION__, data->allocated, + data->size, data->initialized); } /* Prepare a formatted (empty) mft record. */ memset(buf, 0, mft_rec_size); @@ -1959,8 +1961,8 @@ old_data_initialized = data->initialized; old_data_size = data->size; while (ll > data->initialized) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Initializing mft " - "record 0x%Lx.\n", + ntfs_debug(DEBUG_OTHER, "%s(): Initializing mft record " + "0x%Lx.\n", __FUNCTION__, data->initialized >> vol->mft_record_size_bits); io.param = buf; io.size = mft_rec_size; @@ -1972,15 +1974,15 @@ err = -EIO; goto undo_data_init_err_ret; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote %i bytes to " - "mft data.\n", io.size); + ntfs_debug(DEBUG_OTHER, "%s(): Wrote %i bytes to mft data.\n", + __FUNCTION__, io.size); } /* Update the VFS inode size as well. */ VFS_I(vol->mft_ino)->i_size = data->size; #ifdef DEBUG - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After mft record " + ntfs_debug(DEBUG_OTHER, "%s(): After mft record " "initialization: data->allocated = 0x%Lx, data->size " - "= 0x%Lx, data->initialized = 0x%Lx.\n", + "= 0x%Lx, data->initialized = 0x%Lx.\n", __FUNCTION__, data->allocated, data->size, data->initialized); /* Sanity checks. */ if (data->size > data->allocated || data->size < data->initialized || @@ -1989,45 +1991,47 @@ #endif done_ret: /* Return the number of the allocated mft record. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_ret. *result = bit = " - "0x%lx.\n", bit); + ntfs_debug(DEBUG_OTHER, "%s(): At done_ret. *result = bit = 0x%lx.\n", + __FUNCTION__, bit); *result = bit; vol->mft_data_pos = bit + 1; err_ret: unlock_kernel(); free_page((unsigned long)buf); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Syncing inode $MFT.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Syncing inode $MFT.\n", __FUNCTION__); if (ntfs_update_inode(vol->mft_ino)) - ntfs_error(__FUNCTION__ "(): Failed to sync inode $MFT. " - "Continuing anyway.\n"); + ntfs_error("%s(): Failed to sync inode $MFT. " + "Continuing anyway.\n",__FUNCTION__); if (!err) { - ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): Done. Allocated mft " - "record number *result = 0x%lx.\n", *result); + ntfs_debug(DEBUG_FILE3, "%s(): Done. Allocated mft record " + "number *result = 0x%lx.\n", __FUNCTION__, + *result); return 0; } if (err != -ENOSPC) - ntfs_error(__FUNCTION__ "(): Failed to allocate an mft " - "record. Returning error code %i.\n", -err); + ntfs_error("%s(): Failed to allocate an mft record. Returning " + "error code %i.\n", __FUNCTION__, -err); else - ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): Failed to allocate " - "an mft record due to lack of free space.\n"); + ntfs_debug(DEBUG_FILE3, "%s(): Failed to allocate an mft " + "record due to lack of free space.\n", + __FUNCTION__); return err; undo_data_init_err_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At " - "undo_data_init_err_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At undo_data_init_err_ret.\n", + __FUNCTION__); data->initialized = old_data_initialized; data->size = old_data_size; undo_data_alloc_err_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At undo_data_alloc_err_ret." - "\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At undo_data_alloc_err_ret.\n", + __FUNCTION__); data->allocated = old_data_allocated; undo_partial_data_alloc_err_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At " - "undo_partial_data_alloc_err_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At undo_partial_data_alloc_err_ret.\n", + __FUNCTION__); /* Deallocate the clusters. */ if (ntfs_deallocate_clusters(vol, rl2, r2len)) - ntfs_error(__FUNCTION__ "(): Error deallocating clusters in " - "error code path. You should run chkdsk.\n"); + ntfs_error("%s(): Error deallocating clusters in error code " + "path. You should run chkdsk.\n", __FUNCTION__); ntfs_vfree(rl2); /* Revert the run list back to what it was before. */ r2len = data->d.r.len; @@ -2047,13 +2051,13 @@ ntfs_vfree(data->d.r.runlist); data->d.r.runlist = rl2; } else - ntfs_error(__FUNCTION__ "(): Error reallocating " + ntfs_error("%s(): Error reallocating " "memory in error code path. This " - "should be harmless.\n"); + "should be harmless.\n", __FUNCTION__); } undo_mftbmp_alloc_err_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At " - "undo_mftbmp_alloc_err_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At undo_mftbmp_alloc_err_ret.\n", + __FUNCTION__); /* Deallocate the allocated bit in the mft bitmap. */ io.param = buf; io.size = 1; @@ -2068,13 +2072,14 @@ if (err || io.size != 1) { if (!err) err = -EIO; - ntfs_error(__FUNCTION__ "(): Error deallocating mft record in " - "error code path. You should run chkdsk.\n"); + ntfs_error("%s(): Error deallocating mft record in error code " + "path. You should run chkdsk.\n", __FUNCTION__); } shrink_mftbmp_err_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At shrink_mftbmp_err_ret.\n"); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): have_allocated_mftbmp = " - "%i.\n", have_allocated_mftbmp); + ntfs_debug(DEBUG_OTHER, "%s(): At shrink_mftbmp_err_ret.\n", + __FUNCTION__); + ntfs_debug(DEBUG_OTHER, "%s(): have_allocated_mftbmp = %i.\n", + __FUNCTION__, have_allocated_mftbmp); if (!have_allocated_mftbmp) goto err_ret; /* Shrink the mftbmp back to previous size. */ @@ -2083,15 +2088,15 @@ bmp->initialized -= 8LL; have_allocated_mftbmp &= ~4; /* If no allocation occured then we are done. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): have_allocated_mftbmp = " - "%i.\n", have_allocated_mftbmp); + ntfs_debug(DEBUG_OTHER, "%s(): have_allocated_mftbmp = %i.\n", + __FUNCTION__, have_allocated_mftbmp); if (!have_allocated_mftbmp) goto err_ret; /* Deallocate the allocated cluster. */ bmp->allocated -= (__s64)vol->cluster_size; if (ntfs_deallocate_cluster_run(vol, lcn, (ntfs_cluster_t)1)) - ntfs_error(__FUNCTION__ "(): Error deallocating cluster in " - "error code path. You should run chkdsk.\n"); + ntfs_error("%s(): Error deallocating cluster in error code " + "path. You should run chkdsk.\n", __FUNCTION__); switch (have_allocated_mftbmp & 3) { case 1: /* Delete the last lcn from the last run of mftbmp. */ @@ -2111,10 +2116,10 @@ ntfs_vfree(rl); bmp->d.r.runlist = rl = rlt; } else - ntfs_error(__FUNCTION__ "(): Error " + ntfs_error("%s(): Error " "reallocating memory in error " "code path. This should be " - "harmless.\n"); + "harmless.\n", __FUNCTION__); } bmp->d.r.runlist[bmp->d.r.len].lcn = (ntfs_cluster_t)-1; bmp->d.r.runlist[bmp->d.r.len].len = (ntfs_cluster_t)0; @@ -2256,7 +2261,7 @@ err = ntfs_alloc_mft_record(vol, &(result->i_number)); if (err) { if (err == -ENOSPC) - ntfs_error(__FUNCTION__ "(): No free inodes.\n"); + ntfs_error("%s(): No free inodes.\n", __FUNCTION__); return err; } /* Get the sequence number. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/ntfs/super.c linux-2.4.23-pre8/fs/ntfs/super.c --- linux-2.4.22/fs/ntfs/super.c 2001-09-08 19:24:40.000000000 +0000 +++ linux-2.4.23-pre8/fs/ntfs/super.c 2003-10-22 22:49:14.000000000 +0000 @@ -639,13 +639,13 @@ int rlpos = 0, rlsize, buf_size, err = 0; ntfs_io io; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Entering with *location = " - "0x%x, *count = 0x%x, zone = %s_ZONE.\n", *location, - *count, zone == DATA_ZONE ? "DATA" : "MFT"); + ntfs_debug(DEBUG_OTHER, "%s(): Entering with *location = 0x%x, " + "*count = 0x%x, zone = %s_ZONE.\n", __FUNCTION__, + *location, *count, zone == DATA_ZONE ? "DATA" : "MFT"); buf = (char*)__get_free_page(GFP_NOFS); if (!buf) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning " - "-ENOMEM.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Returning -ENOMEM.\n", + __FUNCTION__); return -ENOMEM; } io.fn_put = ntfs_put; @@ -721,101 +721,101 @@ clusters = *count; rlpos = rlsize = 0; if (*count <= 0) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): *count <= 0, " - "returning -EINVAL.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): *count <= 0, " + "returning -EINVAL.\n", __FUNCTION__); err = -EINVAL; goto err_ret; } while (1) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Start of outer while " + ntfs_debug(DEBUG_OTHER, "%s(): Start of outer while " "loop: done_zones = 0x%x, search_zone = %i, " "pass = %i, zone_start = 0x%x, zone_end = " "0x%x, initial_location = 0x%x, buf_pos = " "0x%x, rlpos = %i, rlsize = %i.\n", - done_zones, search_zone, pass, zone_start, - zone_end, initial_location, buf_pos, rlpos, - rlsize); + __FUNCTION__, done_zones, search_zone, pass, + zone_start, zone_end, initial_location, buf_pos, + rlpos, rlsize); /* Loop until we run out of free clusters. */ io.param = buf; io.size = PAGE_SIZE; io.do_read = 1; last_read_pos = buf_pos >> 3; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): last_read_pos = " - "0x%x.\n", last_read_pos); + ntfs_debug(DEBUG_OTHER, "%s(): last_read_pos = 0x%x.\n", + __FUNCTION__, last_read_pos); err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos, &io); if (err) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "ntfs_read_attr failed with error " - "code %i, going to err_ret.\n", -err); + ntfs_debug(DEBUG_OTHER, "%s(): ntfs_read_attr failed " + "with error code %i, going to " + "err_ret.\n", __FUNCTION__, -err); goto err_ret; } if (!io.size) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): !io.size, " - "going to zone_pass_done.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): !io.size, going to " + "zone_pass_done.\n", __FUNCTION__); goto zone_pass_done; } buf_size = io.size << 3; lcn = buf_pos & 7; buf_pos &= ~7; need_writeback = 0; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Before inner while " + ntfs_debug(DEBUG_OTHER, "%s(): Before inner while " "loop: buf_size = 0x%x, lcn = 0x%x, buf_pos = " - "0x%x, need_writeback = %i.\n", buf_size, lcn, - buf_pos, need_writeback); + "0x%x, need_writeback = %i.\n", __FUNCTION__, + buf_size, lcn, buf_pos, need_writeback); while (lcn < buf_size && lcn + buf_pos < zone_end) { byte = buf + (lcn >> 3); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): In inner " - "while loop: buf_size = 0x%x, lcn = " - "0x%x, buf_pos = 0x%x, need_writeback " - "= %i, byte ofs = 0x%x, *byte = " - "0x%x.\n", buf_size, lcn, buf_pos, - need_writeback, lcn >> 3, *byte); + ntfs_debug(DEBUG_OTHER, "%s(): In inner while loop: " + "buf_size = 0x%x, lcn = 0x%x, buf_pos " + "= 0x%x, need_writeback = %i, byte ofs " + "= 0x%x, *byte = 0x%x.\n", __FUNCTION__, + buf_size, lcn, buf_pos, need_writeback, + lcn >> 3, *byte); /* Skip full bytes. */ if (*byte == 0xff) { lcn += 8; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "continuing while loop 1.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): continuing while" + " loop 1.\n", __FUNCTION__); continue; } bit = 1 << (lcn & 7); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): bit = %i.\n", - bit); + ntfs_debug(DEBUG_OTHER, "%s(): bit = %i.\n", + __FUNCTION__, bit); /* If the bit is already set, go onto the next one. */ if (*byte & bit) { lcn++; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "continuing while loop 2.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): continuing while" + " loop 2.\n", __FUNCTION__); continue; } /* Allocate the bitmap bit. */ *byte |= bit; /* We need to write this bitmap buffer back to disk! */ need_writeback = 1; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): *byte = " - "0x%x, need_writeback = %i.\n", *byte, - need_writeback); + ntfs_debug(DEBUG_OTHER, "%s(): *byte = 0x%x, " + "need_writeback = %i.\n", __FUNCTION__, + *byte, need_writeback); /* Reallocate memory if necessary. */ if ((rlpos + 2) * sizeof(ntfs_runlist) >= rlsize) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Reallocating space.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Reallocating " + "space.\n", __FUNCTION__); /* Setup first free bit return value. */ if (!rl2) { *location = lcn + buf_pos; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): *location = " - "0x%x.\n", *location); + ntfs_debug(DEBUG_OTHER, "%s(): " + "*location = 0x%x.\n", + __FUNCTION__, + *location); } rlsize += PAGE_SIZE; rlt = ntfs_vmalloc(rlsize); if (!rlt) { err = -ENOMEM; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Failed to " - "allocate memory, " + ntfs_debug(DEBUG_OTHER, "%s(): Failed " + "to allocate memory, " "returning -ENOMEM, " - "going to " - "wb_err_ret.\n"); + "going to wb_err_ret.\n", + __FUNCTION__); goto wb_err_ret; } if (rl2) { @@ -824,45 +824,46 @@ ntfs_vfree(rl2); } rl2 = rlt; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Reallocated memory, rlsize = " - "0x%x.\n", rlsize); + ntfs_debug(DEBUG_OTHER, "%s(): Reallocated " + "memory, rlsize = 0x%x.\n", + __FUNCTION__, rlsize); } /* * Coalesce with previous run if adjacent LCNs. * Otherwise, append a new run. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Adding run " - "(lcn 0x%x, len 0x%x), prev_lcn = " - "0x%x, lcn = 0x%x, buf_pos = 0x%x, " - "prev_run_len = 0x%x, rlpos = %i.\n", + ntfs_debug(DEBUG_OTHER, "%s(): Adding run (lcn 0x%x, " + "len 0x%x), prev_lcn = 0x%x, lcn = " + "0x%x, buf_pos = 0x%x, prev_run_len = " + "0x%x, rlpos = %i.\n", __FUNCTION__, lcn + buf_pos, 1, prev_lcn, lcn, buf_pos, prev_run_len, rlpos); if (prev_lcn == lcn + buf_pos - prev_run_len && rlpos) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Coalescing to run (lcn 0x%x, " - "len 0x%x).\n", + ntfs_debug(DEBUG_OTHER, "%s(): Coalescing to " + "run (lcn 0x%x, len 0x%x).\n", + __FUNCTION__, rl2[rlpos - 1].lcn, rl2[rlpos - 1].len); rl2[rlpos - 1].len = ++prev_run_len; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Run now (lcn 0x%x, len 0x%x), " - "prev_run_len = 0x%x.\n", + ntfs_debug(DEBUG_OTHER, "%s(): Run now (lcn " + "0x%x, len 0x%x), prev_run_len " + "= 0x%x.\n", __FUNCTION__, rl2[rlpos - 1].lcn, rl2[rlpos - 1].len, prev_run_len); } else { if (rlpos) - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Adding new run, " - "(previous run lcn " - "0x%x, len 0x%x).\n", + ntfs_debug(DEBUG_OTHER, "%s(): Adding " + "new run, (previous " + "run lcn 0x%x, " + "len 0x%x).\n", + __FUNCTION__, rl2[rlpos - 1].lcn, rl2[rlpos - 1].len); else - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Adding new run, " - "is first run.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Adding " + "new run, is first " + "run.\n", __FUNCTION__); rl2[rlpos].lcn = prev_lcn = lcn + buf_pos; rl2[rlpos].len = prev_run_len = (ntfs_cluster_t)1; @@ -878,17 +879,16 @@ * during the respective zone switches. */ tc = lcn + buf_pos + 1; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Done. Updating current zone " - "position, tc = 0x%x, " - "search_zone = %i.\n", tc, - search_zone); + ntfs_debug(DEBUG_OTHER, "%s(): Done. Updating " + "current zone position, tc = " + "0x%x, search_zone = %i.\n", + __FUNCTION__, tc, search_zone); switch (search_zone) { case 1: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Before checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): Before checks, " "vol->mft_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->mft_zone_pos); if (tc >= vol->mft_zone_end) { vol->mft_zone_pos = @@ -901,17 +901,17 @@ tc > vol->mft_zone_pos) && tc >= vol->mft_lcn) vol->mft_zone_pos = tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): After checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): After checks, " "vol->mft_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->mft_zone_pos); break; case 2: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Before checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): Before checks, " "vol->data1_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->data1_zone_pos); if (tc >= vol->nr_clusters) vol->data1_zone_pos = @@ -921,17 +921,17 @@ tc > vol->data1_zone_pos) && tc >= vol->mft_zone_end) vol->data1_zone_pos = tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): After checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): After checks, " "vol->data1_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->data1_zone_pos); break; case 4: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Before checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): Before checks, " "vol->data2_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->data2_zone_pos); if (tc >= vol->mft_zone_start) vol->data2_zone_pos = @@ -940,52 +940,52 @@ vol->data2_zone_pos || tc > vol->data2_zone_pos) vol->data2_zone_pos = tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): After checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): After checks, " "vol->data2_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->data2_zone_pos); break; default: BUG(); } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Going to done_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Going to " + "done_ret.\n", __FUNCTION__); goto done_ret; } lcn++; } buf_pos += buf_size; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After inner while " + ntfs_debug(DEBUG_OTHER, "%s(): After inner while " "loop: buf_size = 0x%x, lcn = 0x%x, buf_pos = " - "0x%x, need_writeback = %i.\n", buf_size, lcn, - buf_pos, need_writeback); + "0x%x, need_writeback = %i.\n", __FUNCTION__, + buf_size, lcn, buf_pos, need_writeback); if (need_writeback) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing " - "back.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Writing back.\n", + __FUNCTION__); need_writeback = 0; io.param = buf; io.do_read = 0; err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos, &io); if (err) { - ntfs_error(__FUNCTION__ "(): Bitmap writeback " - "failed in read next buffer " - "code path with error code " - "%i.\n", -err); + ntfs_error("%s(): Bitmap writeback failed " + "in read next buffer code " + "path with error code %i.\n", + __FUNCTION__, -err); goto err_ret; } } if (buf_pos < zone_end) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Continuing " + ntfs_debug(DEBUG_OTHER, "%s(): Continuing " "outer while loop, buf_pos = 0x%x, " - "zone_end = 0x%x.\n", buf_pos, - zone_end); + "zone_end = 0x%x.\n", __FUNCTION__, + buf_pos, zone_end); continue; } zone_pass_done: /* Finished with the current zone pass. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At zone_pass_done, " - "pass = %i.\n", pass); + ntfs_debug(DEBUG_OTHER, "%s(): At zone_pass_done, pass = %i.\n", + __FUNCTION__, pass); if (pass == 1) { /* * Now do pass 2, scanning the first part of the zone @@ -1010,36 +1010,37 @@ if (zone_end < zone_start) zone_end = zone_start; buf_pos = zone_start; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Continuing " + ntfs_debug(DEBUG_OTHER, "%s(): Continuing " "outer while loop, pass = 2, " "zone_start = 0x%x, zone_end = 0x%x, " - "buf_pos = 0x%x.\n"); + "buf_pos = 0x%x.\n", __FUNCTION__, + zone_start, zone_end, buf_pos); continue; } /* pass == 2 */ done_zones_check: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_zones_check, " + ntfs_debug(DEBUG_OTHER, "%s(): At done_zones_check, " "search_zone = %i, done_zones before = 0x%x, " - "done_zones after = 0x%x.\n", + "done_zones after = 0x%x.\n", __FUNCTION__, search_zone, done_zones, done_zones | search_zone); done_zones |= search_zone; if (done_zones < 7) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Switching " - "zone.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Switching zone.\n", + __FUNCTION__); /* Now switch to the next zone we haven't done yet. */ pass = 1; switch (search_zone) { case 1: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Switching from mft zone to " - "data1 zone.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Switching from " + "mft zone to data1 zone.\n", + __FUNCTION__); /* Update mft zone position. */ if (rlpos) { ntfs_cluster_t tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Before checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): Before checks, " "vol->mft_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->mft_zone_pos); tc = rl2[rlpos - 1].lcn + rl2[rlpos - 1].len; @@ -1054,10 +1055,10 @@ tc > vol->mft_zone_pos) && tc >= vol->mft_lcn) vol->mft_zone_pos = tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): After checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): After checks, " "vol->mft_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->mft_zone_pos); } /* Switch from mft zone to data1 zone. */ @@ -1074,16 +1075,16 @@ } break; case 2: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Switching from data1 zone to " - "data2 zone.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Switching from " + "data1 zone to data2 zone.\n", + __FUNCTION__); /* Update data1 zone position. */ if (rlpos) { ntfs_cluster_t tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Before checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): Before checks, " "vol->data1_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->data1_zone_pos); tc = rl2[rlpos - 1].lcn + rl2[rlpos - 1].len; @@ -1095,10 +1096,10 @@ tc > vol->data1_zone_pos) && tc >= vol->mft_zone_end) vol->data1_zone_pos = tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): After checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): After checks, " "vol->data1_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->data1_zone_pos); } /* Switch from data1 zone to data2 zone. */ @@ -1116,16 +1117,16 @@ } break; case 4: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Switching from data2 zone to " - "data1 zone.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Switching from " + "data2 zone to data1 zone.\n", + __FUNCTION__); /* Update data2 zone position. */ if (rlpos) { ntfs_cluster_t tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): Before checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): Before checks, " "vol->data2_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->data2_zone_pos); tc = rl2[rlpos - 1].lcn + rl2[rlpos - 1].len; @@ -1136,10 +1137,10 @@ vol->data2_zone_pos || tc > vol->data2_zone_pos) vol->data2_zone_pos = tc; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ - "(): After checks, " + ntfs_debug(DEBUG_OTHER, + "%s(): After checks, " "vol->data2_zone_pos = " - "0x%x.\n", + "0x%x.\n", __FUNCTION__, vol->data2_zone_pos); } /* Switch from data2 zone to data1 zone. */ @@ -1147,45 +1148,45 @@ default: BUG(); } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After zone " - "switch, search_zone = %i, pass = %i, " + ntfs_debug(DEBUG_OTHER, "%s(): After zone switch, " + "search_zone = %i, pass = %i, " "initial_location = 0x%x, zone_start " "= 0x%x, zone_end = 0x%x.\n", - search_zone, pass, initial_location, - zone_start, zone_end); + __FUNCTION__, search_zone, pass, + initial_location, zone_start, zone_end); buf_pos = zone_start; if (zone_start == zone_end) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): " - "Empty zone, going to " - "done_zones_check.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Empty zone, " + "going to done_zones_check.\n", + __FUNCTION__); /* Empty zone. Don't bother searching it. */ goto done_zones_check; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Continuing " - "outer while loop.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Continuing outer while " + "loop.\n", __FUNCTION__); continue; } /* done_zones == 7 */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): All zones are " - "finished.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): All zones are finished.\n", + __FUNCTION__); /* * All zones are finished! If DATA_ZONE, shrink mft zone. If * MFT_ZONE, we have really run out of space. */ mft_zone_size = vol->mft_zone_end - vol->mft_zone_start; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): vol->mft_zone_start " - "= 0x%x, vol->mft_zone_end = 0x%x, " - "mft_zone_size = 0x%x.\n", vol->mft_zone_start, + ntfs_debug(DEBUG_OTHER, "%s(): vol->mft_zone_start = 0x%x, " + "vol->mft_zone_end = 0x%x, mft_zone_size = " + "0x%x.\n", __FUNCTION__, vol->mft_zone_start, vol->mft_zone_end, mft_zone_size); if (zone == MFT_ZONE || mft_zone_size <= (ntfs_cluster_t)0) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): No free " - "clusters left, returning -ENOSPC, " - "going to fail_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): No free clusters left, " + "returning -ENOSPC, going to " + "fail_ret.\n", __FUNCTION__); /* Really no more space left on device. */ err = -ENOSPC; goto fail_ret; } /* zone == DATA_ZONE && mft_zone_size > 0 */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Shrinking mft " - "zone.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Shrinking mft zone.\n", + __FUNCTION__); zone_end = vol->mft_zone_end; mft_zone_size >>= 1; if (mft_zone_size > (ntfs_cluster_t)0) @@ -1203,71 +1204,72 @@ search_zone = 2; pass = 2; done_zones &= ~2; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After shrinking mft " + ntfs_debug(DEBUG_OTHER, "%s(): After shrinking mft " "zone, mft_zone_size = 0x%x, " "vol->mft_zone_start = 0x%x, vol->mft_zone_end " "= 0x%x, vol->mft_zone_pos = 0x%x, search_zone " "= 2, pass = 2, dones_zones = 0x%x, zone_start " "= 0x%x, zone_end = 0x%x, vol->data1_zone_pos " "= 0x%x, continuing outer while loop.\n", - mft_zone_size, vol->mft_zone_start, - vol->mft_zone_end, vol->mft_zone_pos, - search_zone, pass, done_zones, zone_start, + __FUNCTION__, mft_zone_size, + vol->mft_zone_start, vol->mft_zone_end, + vol->mft_zone_pos, done_zones, zone_start, zone_end, vol->data1_zone_pos); } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): After outer while loop.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): After outer while loop.\n", + __FUNCTION__); done_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At done_ret.\n", __FUNCTION__); rl2[rlpos].lcn = (ntfs_cluster_t)-1; rl2[rlpos].len = (ntfs_cluster_t)0; *rl = rl2; *rl_len = rlpos; if (need_writeback) { - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing back.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Writing back.\n", __FUNCTION__); need_writeback = 0; io.param = buf; io.do_read = 0; err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos, &io); if (err) { - ntfs_error(__FUNCTION__ "(): Bitmap writeback failed " - "in done code path with error code " - "%i.\n", -err); + ntfs_error("%s(): Bitmap writeback failed in done " + "code path with error code %i.\n", + __FUNCTION__, -err); goto err_ret; } - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Wrote 0x%Lx bytes.\n", - io.size); + ntfs_debug(DEBUG_OTHER, "%s(): Wrote 0x%Lx bytes.\n", + __FUNCTION__, io.size); } done_fail_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At done_fail_ret (follows " - "done_ret).\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At done_fail_ret (follows done_ret).\n", + __FUNCTION__); unlock_kernel(); free_page((unsigned long)buf); if (err) - ntfs_debug(DEBUG_FILE3, __FUNCTION__ "(): Failed to allocate " + ntfs_debug(DEBUG_FILE3, "%s(): Failed to allocate " "clusters. Returning with error code %i.\n", - -err); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Syncing $Bitmap inode.\n"); + __FUNCTION__, -err); + ntfs_debug(DEBUG_OTHER, "%s(): Syncing $Bitmap inode.\n", __FUNCTION__); if (ntfs_update_inode(vol->bitmap)) - ntfs_error(__FUNCTION__ "(): Failed to sync inode $Bitmap. " - "Continuing anyway.\n"); - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Returning with code %i.\n", + ntfs_error("%s(): Failed to sync inode $Bitmap. " + "Continuing anyway.\n", __FUNCTION__); + ntfs_debug(DEBUG_OTHER, "%s(): Returning with code %i.\n", __FUNCTION__, err); return err; fail_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At fail_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At fail_ret.\n", __FUNCTION__); if (rl2) { if (err == -ENOSPC) { /* Return first free lcn and count of free clusters. */ *location = rl2[0].lcn; *count -= clusters; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): err = " - "-ENOSPC, *location = 0x%x, *count = " - "0x%x.\n", *location, *count); + ntfs_debug(DEBUG_OTHER, "%s(): err = -ENOSPC, " + "*location = 0x%x, *count = 0x%x.\n", + __FUNCTION__, *location, *count); } /* Deallocate all allocated clusters. */ - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Deallocating " - "allocated clusters.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Deallocating allocated " + "clusters.\n", __FUNCTION__); ntfs_deallocate_clusters(vol, rl2, rlpos); /* Free the runlist. */ ntfs_vfree(rl2); @@ -1276,34 +1278,35 @@ /* Nothing free at all. */ *location = vol->data1_zone_pos; /* Irrelevant... */ *count = 0; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): No space " - "left at all, err = -ENOSPC, *location " - "= 0x%x, *count = 0.\n", *location); + ntfs_debug(DEBUG_OTHER, "%s(): No space left at all, " + "err = -ENOSPC, *location = 0x%x, " + "*count = 0.\n", + __FUNCTION__, *location); } } *rl = NULL; *rl_len = 0; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): *rl = NULL, *rl_len = 0, " - "going to done_fail_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): *rl = NULL, *rl_len = 0, " + "going to done_fail_ret.\n", __FUNCTION__); goto done_fail_ret; wb_err_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At wb_err_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At wb_err_ret.\n", __FUNCTION__); if (need_writeback) { int __err; - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): Writing back.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): Writing back.\n", __FUNCTION__); io.param = buf; io.do_read = 0; __err = ntfs_readwrite_attr(vol->bitmap, data, last_read_pos, &io); if (__err) - ntfs_error(__FUNCTION__ "(): Bitmap writeback failed " - "in error code path with error code " - "%i.\n", -__err); + ntfs_error("%s(): Bitmap writeback failed in error " + "code path with error code %i.\n", + __FUNCTION__, -__err); need_writeback = 0; } err_ret: - ntfs_debug(DEBUG_OTHER, __FUNCTION__ "(): At err_ret, *location = -1, " - "*count = 0, going to fail_ret.\n"); + ntfs_debug(DEBUG_OTHER, "%s(): At err_ret, *location = -1, " + "*count = 0, going to fail_ret.\n", __FUNCTION__); *location = -1; *count = 0; goto fail_ret; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/proc/array.c linux-2.4.23-pre8/fs/proc/array.c --- linux-2.4.22/fs/proc/array.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/proc/array.c 2003-10-22 22:49:04.000000000 +0000 @@ -70,6 +70,7 @@ #include #include #include +#include #include #include @@ -511,179 +512,96 @@ size, resident, share, trs, lrs, drs, dt); } -/* - * The way we support synthetic files > 4K - * - without storing their contents in some buffer and - * - without walking through the entire synthetic file until we reach the - * position of the requested data - * is to cleverly encode the current position in the file's f_pos field. - * There is no requirement that a read() call which returns `count' bytes - * of data increases f_pos by exactly `count'. - * - * This idea is Linus' one. Bruno implemented it. - */ - -/* - * For the /proc//maps file, we use fixed length records, each containing - * a single line. - * - * f_pos = (number of the vma in the task->mm->mmap list) * PAGE_SIZE - * + (index into the line) - */ -/* for systems with sizeof(void*) == 4: */ -#define MAPS_LINE_FORMAT4 "%08lx-%08lx %s %08lx %s %lu" -#define MAPS_LINE_MAX4 49 /* sum of 8 1 8 1 4 1 8 1 5 1 10 1 */ - -/* for systems with sizeof(void*) == 8: */ -#define MAPS_LINE_FORMAT8 "%016lx-%016lx %s %016lx %s %lu" -#define MAPS_LINE_MAX8 73 /* sum of 16 1 16 1 4 1 16 1 5 1 10 1 */ - -#define MAPS_LINE_FORMAT (sizeof(void*) == 4 ? MAPS_LINE_FORMAT4 : MAPS_LINE_FORMAT8) -#define MAPS_LINE_MAX (sizeof(void*) == 4 ? MAPS_LINE_MAX4 : MAPS_LINE_MAX8) - -static int proc_pid_maps_get_line (char *buf, struct vm_area_struct *map) -{ - /* produce the next line */ - char *line; - char str[5]; - int flags; - kdev_t dev; - unsigned long ino; +static int show_map(struct seq_file *m, void *v) +{ + struct vm_area_struct *map = v; + struct file *file = map->vm_file; + int flags = map->vm_flags; + unsigned long ino = 0; + dev_t dev = 0; int len; - flags = map->vm_flags; - - str[0] = flags & VM_READ ? 'r' : '-'; - str[1] = flags & VM_WRITE ? 'w' : '-'; - str[2] = flags & VM_EXEC ? 'x' : '-'; - str[3] = flags & VM_MAYSHARE ? 's' : 'p'; - str[4] = 0; - - dev = 0; - ino = 0; - if (map->vm_file != NULL) { - dev = map->vm_file->f_dentry->d_inode->i_dev; - ino = map->vm_file->f_dentry->d_inode->i_ino; - line = d_path(map->vm_file->f_dentry, - map->vm_file->f_vfsmnt, - buf, PAGE_SIZE); - if (IS_ERR(line)) - return PTR_ERR(line); - buf[PAGE_SIZE-1] = '\n'; - line -= MAPS_LINE_MAX; - if(line < buf) - line = buf; - } else - line = buf; - - len = sprintf(line, - MAPS_LINE_FORMAT, - map->vm_start, map->vm_end, str, map->vm_pgoff << PAGE_SHIFT, - kdevname(dev), ino); - - if(map->vm_file) { - int i; - for(i = len; i < MAPS_LINE_MAX; i++) - line[i] = ' '; - len = buf + PAGE_SIZE - line; - memmove(buf, line, len); - } else - line[len++] = '\n'; - return len; + if (file) { + struct inode *inode = map->vm_file->f_dentry->d_inode; + dev = kdev_t_to_nr(inode->i_sb->s_dev); + ino = inode->i_ino; + } + + seq_printf(m, "%08lx-%08lx %c%c%c%c %08lx %02x:%02x %lu %n", + map->vm_start, + map->vm_end, + flags & VM_READ ? 'r' : '-', + flags & VM_WRITE ? 'w' : '-', + flags & VM_EXEC ? 'x' : '-', + flags & VM_MAYSHARE ? 's' : 'p', + map->vm_pgoff << PAGE_SHIFT, + MAJOR(dev), MINOR(dev), ino, &len); + + if (map->vm_file) { + len = 25 + sizeof(void*) * 6 - len; + if (len < 1) + len = 1; + seq_printf(m, "%*c", len, ' '); + seq_path(m, file->f_vfsmnt, file->f_dentry, " \t\n\\"); + } + seq_putc(m, '\n'); + return 0; } -ssize_t proc_pid_read_maps (struct task_struct *task, struct file * file, char * buf, - size_t count, loff_t *ppos) +static void *m_start(struct seq_file *m, loff_t *pos) { + struct task_struct *task = m->private; struct mm_struct *mm; struct vm_area_struct * map; - char *tmp, *kbuf; - long retval; - int off, lineno, loff; - - /* reject calls with out of range parameters immediately */ - retval = 0; - if (*ppos > LONG_MAX) - goto out; - if (count == 0) - goto out; - off = (long)*ppos; - /* - * We might sleep getting the page, so get it first. - */ - retval = -ENOMEM; - kbuf = (char*)__get_free_page(GFP_KERNEL); - if (!kbuf) - goto out; - - tmp = (char*)__get_free_page(GFP_KERNEL); - if (!tmp) - goto out_free1; + loff_t l = *pos; task_lock(task); mm = task->mm; if (mm) atomic_inc(&mm->mm_users); task_unlock(task); - retval = 0; + if (!mm) - goto out_free2; + return NULL; down_read(&mm->mmap_sem); map = mm->mmap; - lineno = 0; - loff = 0; - if (count > PAGE_SIZE) - count = PAGE_SIZE; - while (map) { - int len; - if (off > PAGE_SIZE) { - off -= PAGE_SIZE; - goto next; - } - len = proc_pid_maps_get_line(tmp, map); - if (len < 0) - goto out_unlock; - len -= off; - if (len > 0) { - if (retval+len > count) { - /* only partial line transfer possible */ - len = count - retval; - /* save the offset where the next read - * must start */ - loff = len+off; - } - memcpy(kbuf+retval, tmp+off, len); - retval += len; - } - off = 0; -next: - if (!loff) - lineno++; - if (retval >= count) - break; - if (loff) BUG(); + while (l-- && map) map = map->vm_next; + if (!map) { + up_read(&mm->mmap_sem); + mmput(mm); } + return map; +} -out_unlock: - up_read(&mm->mmap_sem); - mmput(mm); +static void m_stop(struct seq_file *m, void *v) +{ + struct vm_area_struct *map = v; + if (map) { + struct mm_struct *mm = map->vm_mm; + up_read(&mm->mmap_sem); + mmput(mm); + } +} - if (retval > count) BUG(); - if (copy_to_user(buf, kbuf, retval)) - retval = -EFAULT; - else - *ppos = (lineno << PAGE_SHIFT) + loff; - -out_free2: - free_page((unsigned long)tmp); -out_free1: - free_page((unsigned long)kbuf); -out: - return retval; +static void *m_next(struct seq_file *m, void *v, loff_t *pos) +{ + struct vm_area_struct *map = v; + (*pos)++; + if (map->vm_next) + return map->vm_next; + m_stop(m, v); + return NULL; } +struct seq_operations proc_pid_maps_op = { + .start = m_start, + .next = m_next, + .stop = m_stop, + .show = show_map +}; + #ifdef CONFIG_SMP int proc_pid_cpu(struct task_struct *task, char * buffer) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/proc/base.c linux-2.4.23-pre8/fs/proc/base.c --- linux-2.4.22/fs/proc/base.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/proc/base.c 2003-10-22 22:49:06.000000000 +0000 @@ -36,7 +36,6 @@ #define fake_ino(pid,ino) (((pid)<<16)|(ino)) -ssize_t proc_pid_read_maps(struct task_struct*,struct file*,char*,size_t,loff_t*); int proc_pid_stat(struct task_struct*,char*); int proc_pid_status(struct task_struct*,char*); int proc_pid_statm(struct task_struct*,char*); @@ -269,19 +268,23 @@ return proc_check_root(inode); } -static ssize_t pid_maps_read(struct file * file, char * buf, - size_t count, loff_t *ppos) +extern struct seq_operations proc_pid_maps_op; +static int maps_open(struct inode *inode, struct file *file) { - struct inode * inode = file->f_dentry->d_inode; struct task_struct *task = inode->u.proc_i.task; - ssize_t res; - - res = proc_pid_read_maps(task, file, buf, count, ppos); - return res; + int ret = seq_open(file, &proc_pid_maps_op); + if (!ret) { + struct seq_file *m = file->private_data; + m->private = task; + } + return ret; } static struct file_operations proc_maps_operations = { - read: pid_maps_read, + .open = maps_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, }; extern struct seq_operations mounts_op; @@ -473,7 +476,24 @@ } #endif +static loff_t mem_lseek(struct file * file, loff_t offset, int orig) +{ + switch (orig) { + case 0: + file->f_pos = offset; + break; + case 1: + file->f_pos += offset; + break; + default: + return -EINVAL; + } + force_successful_syscall_return(); + return file->f_pos; +} + static struct file_operations proc_mem_operations = { + llseek: mem_lseek, read: mem_read, write: mem_write, open: mem_open, @@ -515,8 +535,10 @@ inode = dentry->d_inode; path = d_path(dentry, mnt, tmp, PAGE_SIZE); - if (IS_ERR(path)) + if (IS_ERR(path)) { + free_page((unsigned long)tmp); return PTR_ERR(path); + } len = tmp + PAGE_SIZE - 1 - path; if (len < buflen) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/proc/generic.c linux-2.4.23-pre8/fs/proc/generic.c --- linux-2.4.22/fs/proc/generic.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/proc/generic.c 2003-10-22 22:49:52.000000000 +0000 @@ -150,13 +150,14 @@ offset += file->f_pos; } retval = -EINVAL; - if (offset>=0 && offset<=file->f_dentry->d_inode->i_sb->s_maxbytes) { + if (offset>=0 && (unsigned long long)offset<=file->f_dentry->d_inode->i_sb->s_maxbytes) { if (offset != file->f_pos) { file->f_pos = offset; file->f_reada = 0; } retval = offset; } + /* RED-PEN user can fake an error here by setting offset to >=-4095 && <0 */ return retval; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/proc/inode.c linux-2.4.23-pre8/fs/proc/inode.c --- linux-2.4.22/fs/proc/inode.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/proc/inode.c 2003-10-22 22:49:33.000000000 +0000 @@ -186,6 +186,7 @@ s->s_blocksize_bits = 10; s->s_magic = PROC_SUPER_MAGIC; s->s_op = &proc_sops; + s->s_maxbytes = ~0UL; root_inode = proc_get_inode(s, PROC_ROOT_INO, &proc_root); if (!root_inode) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/proc/kcore.c linux-2.4.23-pre8/fs/proc/kcore.c --- linux-2.4.22/fs/proc/kcore.c 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/fs/proc/kcore.c 2003-10-22 22:47:29.000000000 +0000 @@ -27,11 +27,14 @@ return capable(CAP_SYS_RAWIO) ? 0 : -EPERM; } +static loff_t lseek_kcore(struct file * file, loff_t offset, int origin); + static ssize_t read_kcore(struct file *, char *, size_t, loff_t *); struct file_operations proc_kcore_operations = { read: read_kcore, open: open_kcore, + llseek: lseek_kcore, }; #ifdef CONFIG_KCORE_AOUT @@ -112,9 +115,9 @@ extern char saved_command_line[]; -static size_t get_kcore_size(int *num_vma, size_t *elf_buflen) +static unsigned long get_kcore_size(int *num_vma, size_t *elf_buflen) { - size_t try, size; + unsigned long try, size; struct vm_struct *m; *num_vma = 0; @@ -125,7 +128,7 @@ } for (m=vmlist; m; m=m->next) { - try = (size_t)m->addr + m->size; + try = (unsigned long)m->addr + m->size; if (try > size) size = try; *num_vma = *num_vma + 1; @@ -313,14 +316,14 @@ static ssize_t read_kcore(struct file *file, char *buffer, size_t buflen, loff_t *fpos) { ssize_t acc = 0; - size_t size, tsz; + unsigned long size, tsz; size_t elf_buflen; int num_vma; unsigned long start; read_lock(&vmlist_lock); proc_root_kcore->size = size = get_kcore_size(&num_vma, &elf_buflen); - if (buflen == 0 || *fpos >= size) { + if (buflen == 0 || (unsigned long long)*fpos >= size) { read_unlock(&vmlist_lock); return 0; } @@ -390,9 +393,16 @@ start = PAGE_OFFSET + (*fpos - elf_buflen); if ((tsz = (PAGE_SIZE - (start & ~PAGE_MASK))) > buflen) tsz = buflen; - while (buflen) { - if ((start >= VMALLOC_START) && (start < VMALLOC_END)) { + int err; + + if ((start > PAGE_OFFSET) && (start < (unsigned long)high_memory)) { + if (kern_addr_valid(start)) { + err = copy_to_user(buffer, (char *)start, tsz); + } else { + err = clear_user(buffer, tsz); + } + } else { char * elf_buf; struct vm_struct *m; unsigned long curstart = start; @@ -432,24 +442,11 @@ (char *)vmstart, vmsize); } read_unlock(&vmlist_lock); - if (copy_to_user(buffer, elf_buf, tsz)) { + err = copy_to_user(buffer, elf_buf, tsz); kfree(elf_buf); - return -EFAULT; } - kfree(elf_buf); - } else if ((start > PAGE_OFFSET) && (start < - (unsigned long)high_memory)) { - if (kern_addr_valid(start)) { - if (copy_to_user(buffer, (char *)start, tsz)) + if (err) return -EFAULT; - } else { - if (clear_user(buffer, tsz)) - return -EFAULT; - } - } else { - if (clear_user(buffer, tsz)) - return -EFAULT; - } buflen -= tsz; *fpos += tsz; buffer += tsz; @@ -461,3 +458,17 @@ return acc; } #endif /* CONFIG_KCORE_AOUT */ + +static loff_t lseek_kcore(struct file * file, loff_t offset, int origin) +{ + switch (origin) { + case 2: + offset += file->f_dentry->d_inode->i_size; + break; + case 1: + offset += file->f_pos; + } + /* RED-PEN user can fake an error here by setting offset to >=-4095 && <0 */ + file->f_pos = offset; + return offset; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/proc/proc_devtree.c linux-2.4.23-pre8/fs/proc/proc_devtree.c --- linux-2.4.22/fs/proc/proc_devtree.c 2000-05-22 03:34:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/proc/proc_devtree.c 2003-10-22 22:47:59.000000000 +0000 @@ -59,11 +59,14 @@ * Unfortunately proc_register puts each new entry * at the beginning of the list. So we rearrange them. */ - ent = create_proc_read_entry(pp->name, S_IRUGO, de, - property_read_proc, pp); + ent = create_proc_read_entry(pp->name, strncmp(pp->name, "security-", 9) ? + S_IRUGO : S_IRUSR, de, property_read_proc, pp); if (ent == 0) break; - ent->size = pp->length; + if (!strncmp(pp->name, "security-", 9)) + ent->size = 0; /* don't leak number of password chars */ + else + ent->size = pp->length; *lastp = ent; lastp = &ent->next; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/proc/proc_misc.c linux-2.4.23-pre8/fs/proc/proc_misc.c --- linux-2.4.22/fs/proc/proc_misc.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/proc/proc_misc.c 2003-10-22 22:47:49.000000000 +0000 @@ -58,7 +58,9 @@ extern int get_device_list(char *); extern int get_filesystem_list(char *); extern int get_exec_domain_list(char *); +#ifndef CONFIG_X86 extern int get_irq_list(char *); +#endif extern int get_dma_list(char *); extern int get_locks_status (char *, char **, off_t, int); extern int get_swaparea_info (char *); @@ -164,7 +166,7 @@ #define B(x) ((unsigned long long)(x) << PAGE_SHIFT) si_meminfo(&i); si_swapinfo(&i); - pg_size = atomic_read(&page_cache_size) - i.bufferram ; + pg_size = page_cache_size - i.bufferram; len = sprintf(page, " total: used: free: shared: buffers: cached:\n" "Mem: %8Lu %8Lu %8Lu %8Lu %8Lu %8Lu\n" @@ -389,6 +391,7 @@ return proc_calc_metrics(page, start, off, count, eof, len); } +#ifndef CONFIG_X86 #if !defined(CONFIG_ARCH_S390) static int interrupts_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) @@ -398,6 +401,38 @@ } #endif +#else /* !CONFIG_X86 */ + +extern int show_interrupts(struct seq_file *p, void *v); +static int interrupts_open(struct inode *inode, struct file *file) +{ + unsigned size = PAGE_SIZE * (1 + smp_num_cpus / 8); + char *buf = kmalloc(size, GFP_KERNEL); + struct seq_file *m; + int res; + + if (!buf) + return -ENOMEM; + res = single_open(file, show_interrupts, NULL); + if (!res) { + m = file->private_data; + m->buf = buf; + m->size = size; + } else + kfree(buf); + return res; +} +static struct file_operations proc_interrupts_operations = { + .open = interrupts_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif /* !CONFIG_X86 */ + +extern struct file_operations proc_ioports_operations; +extern struct file_operations proc_iomem_operations; + static int filesystems_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -412,13 +447,6 @@ return proc_calc_metrics(page, start, off, count, eof, len); } -static int ioports_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - int len = get_ioport_list(page); - return proc_calc_metrics(page, start, off, count, eof, len); -} - static int cmdline_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -463,13 +491,6 @@ return proc_calc_metrics(page, start, off, count, eof, len); } -static int memory_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - int len = get_mem_list(page); - return proc_calc_metrics(page, start, off, count, eof, len); -} - /* * This function accesses profiling information. The returned data is * binary: the sampling step and the actual contents of the profile @@ -588,19 +609,17 @@ #endif {"stat", kstat_read_proc}, {"devices", devices_read_proc}, -#if !defined(CONFIG_ARCH_S390) +#if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_X86) {"interrupts", interrupts_read_proc}, #endif {"filesystems", filesystems_read_proc}, {"dma", dma_read_proc}, - {"ioports", ioports_read_proc}, {"cmdline", cmdline_read_proc}, #ifdef CONFIG_SGI_DS1286 {"rtc", ds1286_read_proc}, #endif {"locks", locks_read_proc}, {"swaps", swaps_read_proc}, - {"iomem", memory_read_proc}, {"execdomains", execdomains_read_proc}, {NULL,} }; @@ -614,6 +633,11 @@ if (entry) entry->proc_fops = &proc_kmsg_operations; create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations); +#if defined(CONFIG_X86) + create_seq_entry("interrupts", 0, &proc_interrupts_operations); +#endif + create_seq_entry("ioports", 0, &proc_ioports_operations); + create_seq_entry("iomem", 0, &proc_iomem_operations); create_seq_entry("partitions", 0, &proc_partitions_operations); create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations); #ifdef CONFIG_MODULES diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/quota_v1.c linux-2.4.23-pre8/fs/quota_v1.c --- linux-2.4.22/fs/quota_v1.c 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/fs/quota_v1.c 2003-10-22 22:48:15.000000000 +0000 @@ -17,7 +17,7 @@ m->dqb_curinodes = d->dqb_curinodes; m->dqb_bhardlimit = d->dqb_bhardlimit; m->dqb_bsoftlimit = d->dqb_bsoftlimit; - m->dqb_curspace = d->dqb_curblocks << QUOTABLOCK_BITS; + m->dqb_curspace = ((qsize_t)d->dqb_curblocks) << QUOTABLOCK_BITS; m->dqb_itime = d->dqb_itime; m->dqb_btime = d->dqb_btime; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/ramfs/inode.c linux-2.4.23-pre8/fs/ramfs/inode.c --- linux-2.4.22/fs/ramfs/inode.c 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/fs/ramfs/inode.c 2003-10-22 22:48:26.000000000 +0000 @@ -44,7 +44,7 @@ { buf->f_type = RAMFS_MAGIC; buf->f_bsize = PAGE_CACHE_SIZE; - buf->f_namelen = 255; + buf->f_namelen = NAME_MAX; return 0; } @@ -54,6 +54,8 @@ */ static struct dentry * ramfs_lookup(struct inode *dir, struct dentry *dentry) { + if (dentry->d_name.len > NAME_MAX) + return ERR_PTR(-ENAMETOOLONG); d_add(dentry, NULL); return NULL; } @@ -138,6 +140,11 @@ int error = -ENOSPC; if (inode) { + if (dir->i_mode & S_ISGID) { + inode->i_gid = dir->i_gid; + if (S_ISDIR(mode)) + inode->i_mode |= S_ISGID; + } d_instantiate(dentry, inode); dget(dentry); /* Extra count - pin the dentry in core */ error = 0; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/fs/seq_file.c linux-2.4.23-pre8/fs/seq_file.c --- linux-2.4.22/fs/seq_file.c 2003-06-13 14:51:37.000000000 +0000 +++ linux-2.4.23-pre8/fs/seq_file.c 2003-10-22 22:49:12.000000000 +0000 @@ -1,7 +1,7 @@ /* * linux/fs/seq_file.c * - * helper functions for making syntetic files from sequences of records. + * helper functions for making synthetic files from sequences of records. * initial implementation -- AV, Oct 2001. */ @@ -10,6 +10,7 @@ #include #include +#include /** * seq_open - initialize sequential file @@ -214,7 +215,7 @@ while ((retval=traverse(m, offset)) == -EAGAIN) ; if (retval) { - /* with extreme perjudice... */ + /* with extreme prejudice... */ file->f_pos = 0; m->index = 0; m->count = 0; @@ -249,7 +250,7 @@ * @s: string * @esc: set of characters that need escaping * - * Puts string into buffer, replacing each occurence of character from + * Puts string into buffer, replacing each occurrence of character from * @esc with usual octal escape. Returns 0 in case of success, -1 - in * case of overflow. */ @@ -295,3 +296,86 @@ m->count = m->size; return -1; } + +int seq_path(struct seq_file *m, + struct vfsmount *mnt, struct dentry *dentry, + char *esc) +{ + if (m->count < m->size) { + char *s = m->buf + m->count; + char *p = d_path(dentry, mnt, s, m->size - m->count); + if (!IS_ERR(p)) { + while (s <= p) { + char c = *p++; + if (!c) { + p = m->buf + m->count; + m->count = s - m->buf; + return s - p; + } else if (!strchr(esc, c)) { + *s++ = c; + } else if (s + 4 > p) { + break; + } else { + *s++ = '\\'; + *s++ = '0' + ((c & 0300) >> 6); + *s++ = '0' + ((c & 070) >> 3); + *s++ = '0' + (c & 07); + } + } + } + } + m->count = m->size; + return -1; +} + +static void *single_start(struct seq_file *p, loff_t *pos) +{ + return NULL + (*pos == 0); +} + +static void *single_next(struct seq_file *p, void *v, loff_t *pos) +{ + ++*pos; + return NULL; +} + +static void single_stop(struct seq_file *p, void *v) +{ +} + +int single_open(struct file *file, int (*show)(struct seq_file *, void*), void *data) +{ + struct seq_operations *op = kmalloc(sizeof(*op), GFP_KERNEL); + int res = -ENOMEM; + + if (op) { + op->start = single_start; + op->next = single_next; + op->stop = single_stop; + op->show = show; + res = seq_open(file, op); + if (!res) + ((struct seq_file *)file->private_data)->private = data; + else + kfree(op); + } + return res; +} + +int single_release(struct inode *inode, struct file *file) +{ + struct seq_operations *op = ((struct seq_file *)file->private_data)->op; + int res = seq_release(inode, file); + kfree(op); + return res; +} + +int seq_release_private(struct inode *inode, struct file *file) +{ + struct seq_file *seq = file->private_data; + + kfree(seq->private); + seq->private = NULL; + return seq_release(inode, file); +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/acpi/acconfig.h linux-2.4.23-pre8/include/acpi/acconfig.h --- linux-2.4.22/include/acpi/acconfig.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/acpi/acconfig.h 2003-10-22 22:48:00.000000000 +0000 @@ -64,7 +64,7 @@ /* Version string */ -#define ACPI_CA_VERSION 0x20030813 +#define ACPI_CA_VERSION 0x20031002 /* Maximum objects in the various object caches */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/acpi/acdisasm.h linux-2.4.23-pre8/include/acpi/acdisasm.h --- linux-2.4.22/include/acpi/acdisasm.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/acpi/acdisasm.h 2003-10-22 22:49:15.000000000 +0000 @@ -152,10 +152,6 @@ acpi_dm_decode_internal_object ( union acpi_operand_object *obj_desc); -void -acpi_dm_decode_node ( - struct acpi_namespace_node *node); - u32 acpi_dm_block_type ( union acpi_parse_object *op); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/acpi/acexcep.h linux-2.4.23-pre8/include/acpi/acexcep.h --- linux-2.4.22/include/acpi/acexcep.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/acpi/acexcep.h 2003-10-22 22:47:39.000000000 +0000 @@ -163,6 +163,7 @@ #define AE_AML_NO_RESOURCE_END_TAG (acpi_status) (0x001E | AE_CODE_AML) #define AE_AML_BAD_RESOURCE_VALUE (acpi_status) (0x001F | AE_CODE_AML) #define AE_AML_CIRCULAR_REFERENCE (acpi_status) (0x0020 | AE_CODE_AML) +#define AE_AML_BAD_RESOURCE_LENGTH (acpi_status) (0x0021 | AE_CODE_AML) #define AE_CODE_AML_MAX 0x0020 @@ -280,7 +281,8 @@ "AE_AML_ALIGNMENT", "AE_AML_NO_RESOURCE_END_TAG", "AE_AML_BAD_RESOURCE_VALUE", - "AE_AML_CIRCULAR_REFERENCE" + "AE_AML_CIRCULAR_REFERENCE", + "AE_AML_BAD_RESOURCE_LENGTH" }; char const *acpi_gbl_exception_names_ctrl[] = diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/acpi/acstruct.h linux-2.4.23-pre8/include/acpi/acstruct.h --- linux-2.4.22/include/acpi/acstruct.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/acpi/acstruct.h 2003-10-22 22:47:41.000000000 +0000 @@ -91,11 +91,12 @@ struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */ union acpi_operand_object **caller_return_desc; union acpi_generic_state *control_state; /* List of control states (nested IFs) */ + struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */ struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */ struct acpi_namespace_node *method_call_node; /* Called method Node*/ union acpi_parse_object *method_call_op; /* method_call Op if running a method */ union acpi_operand_object *method_desc; /* Method descriptor if running a method */ - struct acpi_namespace_node *method_node; /* Method Node if running a method */ + struct acpi_namespace_node *method_node; /* Method node if running a method. */ union acpi_parse_object *op; /* Current parser op */ union acpi_operand_object *operands[ACPI_OBJ_NUM_OPERANDS+1]; /* Operands passed to the interpreter (+1 for NULL terminator) */ const struct acpi_opcode_info *op_info; /* Info on current opcode */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/acpi/actbl.h linux-2.4.23-pre8/include/acpi/actbl.h --- linux-2.4.22/include/acpi/actbl.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/acpi/actbl.h 2003-10-22 22:48:57.000000000 +0000 @@ -65,16 +65,6 @@ #define GL_OWNED 0x02 /* Ownership of global lock is bit 1 */ -/* values of Mapic.Model */ - -#define DUAL_PIC 0 -#define MULTIPLE_APIC 1 - -/* values of Type in struct apic_header */ - -#define APIC_PROC 0 -#define APIC_IO 1 - /* * Common table types. The base code can remain @@ -89,8 +79,10 @@ #pragma pack(1) /* - * Architecture-independent tables - * The architecture dependent tables are in separate files + * ACPI Version-independent tables + * + * NOTE: The tables that are specific to ACPI versions (1.0, 2.0, etc.) + * are in separate files. */ struct rsdp_descriptor /* Root System Descriptor Pointer */ { @@ -106,20 +98,6 @@ }; -struct acpi_table_header /* ACPI common table header */ -{ - char signature [4]; /* ACPI signature (4 ASCII characters) */ - u32 length; /* Length of table, in bytes, including header */ - u8 revision; /* ACPI Specification minor version # */ - u8 checksum; /* To make sum of entire table == 0 */ - char oem_id [6]; /* OEM identification */ - char oem_table_id [8]; /* OEM table identification */ - u32 oem_revision; /* OEM revision number */ - char asl_compiler_id [4]; /* ASL compiler vendor ID */ - u32 asl_compiler_revision; /* ASL compiler revision number */ -}; - - struct acpi_common_facs /* Common FACS for internal use */ { u32 *global_lock; @@ -128,68 +106,196 @@ }; -struct apic_table +#define ACPI_TABLE_HEADER_DEF /* ACPI common table header */ \ + char signature [4]; /* ACPI signature (4 ASCII characters) */\ + u32 length; /* Length of table, in bytes, including header */\ + u8 revision; /* ACPI Specification minor version # */\ + u8 checksum; /* To make sum of entire table == 0 */\ + char oem_id [6]; /* OEM identification */\ + char oem_table_id [8]; /* OEM table identification */\ + u32 oem_revision; /* OEM revision number */\ + char asl_compiler_id [4]; /* ASL compiler vendor ID */\ + u32 asl_compiler_revision; /* ASL compiler revision number */ + + +struct acpi_table_header /* ACPI common table header */ { - struct acpi_table_header header; /* ACPI table header */ - u32 local_apic_address; /* Physical address for accessing local APICs */ - u32 PCATcompat : 1; /* a one indicates system also has dual 8259s */ - u32 reserved1 : 31; + ACPI_TABLE_HEADER_DEF }; -struct apic_header +/* + * MADT values and structures + */ + +/* Values for MADT PCATCompat */ + +#define DUAL_PIC 0 +#define MULTIPLE_APIC 1 + + +/* Master MADT */ + +struct multiple_apic_table { - u8 type; /* APIC type. Either APIC_PROC or APIC_IO */ - u8 length; /* Length of APIC structure */ + ACPI_TABLE_HEADER_DEF /* ACPI common table header */ + u32 local_apic_address; /* Physical address of local APIC */ + u32 PCATcompat : 1; /* A one indicates system also has dual 8259s */ + u32 reserved1 : 31; }; -struct processor_apic +/* Values for Type in APIC_HEADER_DEF */ + +#define APIC_PROCESSOR 0 +#define APIC_IO 1 +#define APIC_XRUPT_OVERRIDE 2 +#define APIC_NMI 3 +#define APIC_LOCAL_NMI 4 +#define APIC_ADDRESS_OVERRIDE 5 +#define APIC_IO_SAPIC 6 +#define APIC_LOCAL_SAPIC 7 +#define APIC_XRUPT_SOURCE 8 +#define APIC_RESERVED 9 /* 9 and greater are reserved */ + +/* + * MADT sub-structures (Follow MULTIPLE_APIC_DESCRIPTION_TABLE) + */ +#define APIC_HEADER_DEF /* Common APIC sub-structure header */\ + u8 type; \ + u8 length; + +/* Values for MPS INTI flags */ + +#define POLARITY_CONFORMS 0 +#define POLARITY_ACTIVE_HIGH 1 +#define POLARITY_RESERVED 2 +#define POLARITY_ACTIVE_LOW 3 + +#define TRIGGER_CONFORMS 0 +#define TRIGGER_EDGE 1 +#define TRIGGER_RESERVED 2 +#define TRIGGER_LEVEL 3 + +/* Common flag definitions */ + +#define MPS_INTI_FLAGS \ + u16 polarity : 2; /* Polarity of APIC I/O input signals */\ + u16 trigger_mode : 2; /* Trigger mode of APIC input signals */\ + u16 reserved1 : 12; /* Reserved, must be zero */ + +#define LOCAL_APIC_FLAGS \ + u32 processor_enabled: 1; /* Processor is usable if set */\ + u32 reserved2 : 31; /* Reserved, must be zero */ + +/* Sub-structures for MADT */ + +struct madt_processor_apic { - struct apic_header header; - u8 processor_apic_id; /* ACPI processor id */ + APIC_HEADER_DEF + u8 processor_id; /* ACPI processor id */ u8 local_apic_id; /* Processor's local APIC id */ - u32 processor_enabled: 1; /* Processor is usable if set */ - u32 reserved1 : 31; + LOCAL_APIC_FLAGS }; - -struct io_apic +struct madt_io_apic { - struct apic_header header; + APIC_HEADER_DEF u8 io_apic_id; /* I/O APIC ID */ u8 reserved; /* Reserved - must be zero */ - u32 io_apic_address; /* APIC's physical address */ - u32 vector; /* Interrupt vector index where INTI + u32 address; /* APIC physical address */ + u32 interrupt; /* Global system interrupt where INTI * lines start */ }; +struct madt_interrupt_override +{ + APIC_HEADER_DEF + u8 bus; /* 0 - ISA */ + u8 source; /* Interrupt source (IRQ) */ + u32 interrupt; /* Global system interrupt */ + MPS_INTI_FLAGS +}; + +struct madt_nmi_source +{ + APIC_HEADER_DEF + MPS_INTI_FLAGS + u32 interrupt; /* Global system interrupt */ +}; + +struct madt_local_apic_nmi +{ + APIC_HEADER_DEF + u8 processor_id; /* ACPI processor id */ + MPS_INTI_FLAGS + u8 lint; /* LINTn to which NMI is connected */ +}; + +struct madt_address_override +{ + APIC_HEADER_DEF + u16 reserved; /* Reserved - must be zero */ + u32 address; /* APIC physical address */ +}; + +struct madt_io_sapic +{ + APIC_HEADER_DEF + u8 io_sapic_id; /* I/O SAPIC ID */ + u8 reserved; /* Reserved - must be zero */ + u32 interrupt_base; /* Glocal interrupt for SAPIC start */ + u64 address; /* SAPIC physical address */ +}; + +struct madt_local_sapic +{ + APIC_HEADER_DEF + u8 processor_id; /* ACPI processor id */ + u8 local_sapic_id; /* SAPIC ID */ + u8 local_sapic_eid; /* SAPIC EID */ + u8 reserved [3]; /* Reserved - must be zero */ + LOCAL_APIC_FLAGS +}; + +struct madt_interrupt_source +{ + APIC_HEADER_DEF + MPS_INTI_FLAGS + u8 interrupt_type; /* 1=PMI, 2=INIT, 3=corrected */ + u8 processor_id; /* Processor ID */ + u8 processor_eid; /* Processor EID */ + u8 io_sapic_vector; /* Vector value for PMI interrupts */ + u32 interrupt; /* Global system interrupt */ + u32 reserved; /* Reserved - must be zero */ +}; -/* - * IA64 TBD: Add SAPIC Tables - */ /* - * IA64 TBD: Modify Smart Battery Description to comply with ACPI IA64 - * extensions. + * Smart Battery */ -struct smart_battery_description_table +struct smart_battery_table { - struct acpi_table_header header; + ACPI_TABLE_HEADER_DEF u32 warning_level; u32 low_level; u32 critical_level; }; -struct hpet_description_table + +/* + * High performance timer + */ +struct hpet_table { - struct acpi_table_header header; + ACPI_TABLE_HEADER_DEF u32 hardware_id; - u32 base_address[3]; + u32 base_address [3]; u8 hpet_number; u16 clock_tick; u8 attributes; }; + #pragma pack() @@ -227,9 +333,10 @@ /* - * Get the architecture-specific tables + * Get the ACPI version-specific tables */ #include "actbl1.h" /* Acpi 1.0 table definitions */ #include "actbl2.h" /* Acpi 2.0 table definitions */ + #endif /* __ACTBL_H__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/acpi/actbl1.h linux-2.4.23-pre8/include/acpi/actbl1.h --- linux-2.4.22/include/acpi/actbl1.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/acpi/actbl1.h 2003-10-22 22:47:51.000000000 +0000 @@ -51,7 +51,7 @@ */ struct rsdt_descriptor_rev1 { - struct acpi_table_header header; /* ACPI Table header */ + ACPI_TABLE_HEADER_DEF /* ACPI common table header */ u32 table_offset_entry [1]; /* Array of pointers to other */ /* ACPI tables */ }; @@ -78,7 +78,7 @@ */ struct fadt_descriptor_rev1 { - struct acpi_table_header header; /* ACPI Table header */ + ACPI_TABLE_HEADER_DEF /* ACPI common table header */ u32 firmware_ctrl; /* Physical address of FACS */ u32 dsdt; /* Physical address of DSDT */ u8 model; /* System Interrupt Model */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/acpi/actbl2.h linux-2.4.23-pre8/include/acpi/actbl2.h --- linux-2.4.22/include/acpi/actbl2.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/acpi/actbl2.h 2003-10-22 22:49:05.000000000 +0000 @@ -71,7 +71,7 @@ */ struct rsdt_descriptor_rev2 { - struct acpi_table_header header; /* ACPI table header */ + ACPI_TABLE_HEADER_DEF /* ACPI common table header */ u32 table_offset_entry [1]; /* Array of pointers to */ /* ACPI table headers */ }; @@ -82,7 +82,7 @@ */ struct xsdt_descriptor_rev2 { - struct acpi_table_header header; /* ACPI table header */ + ACPI_TABLE_HEADER_DEF /* ACPI common table header */ u64 table_offset_entry [1]; /* Array of pointers to */ /* ACPI table headers */ }; @@ -124,7 +124,7 @@ */ struct fadt_descriptor_rev2 { - struct acpi_table_header header; /* ACPI table header */ + ACPI_TABLE_HEADER_DEF /* ACPI common table header */ u32 V1_firmware_ctrl; /* 32-bit physical address of FACS */ u32 V1_dsdt; /* 32-bit physical address of DSDT */ u8 reserved1; /* System Interrupt Model isn't used in ACPI 2.0*/ @@ -195,6 +195,19 @@ }; +/* Embedded Controller */ + +struct ec_boot_resources +{ + ACPI_TABLE_HEADER_DEF + struct acpi_generic_address ec_control; /* Address of EC command/status register */ + struct acpi_generic_address ec_data; /* Address of EC data register */ + u32 uid; /* Unique ID - must be same as the EC _UID method */ + u8 gpe_bit; /* The GPE for the EC */ + u8 ec_id[1]; /* Full namepath of the EC in the ACPI namespace */ +}; + + #pragma pack() #endif /* __ACTBL2_H__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/acpi/actypes.h linux-2.4.23-pre8/include/acpi/actypes.h --- linux-2.4.22/include/acpi/actypes.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/acpi/actypes.h 2003-10-22 22:49:04.000000000 +0000 @@ -207,6 +207,7 @@ /* * Miscellaneous common types */ +typedef u16 UINT16_BIT; typedef u32 UINT32_BIT; typedef acpi_native_uint ACPI_PTRDIFF; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-alpha/irq.h linux-2.4.23-pre8/include/asm-alpha/irq.h --- linux-2.4.22/include/asm-alpha/irq.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-alpha/irq.h 2003-10-22 22:48:54.000000000 +0000 @@ -16,7 +16,17 @@ many places throughout the kernel to size static arrays. That's ok, we'll use alpha_mv.nr_irqs when we want the real thing. */ -# define NR_IRQS (32768 + 16) /* marvel - 32 pids */ +/* When LEGACY_START_ADDRESS is selected, we leave out: + TITAN + WILDFIRE + MARVEL +*/ + +# if defined(CONFIG_ALPHA_LEGACY_START_ADDRESS) +# define NR_IRQS (128) /* max is RAWHIDE/TAKARA */ +# else +# define NR_IRQS (32768 + 16) /* marvel - 32 pids */ +# endif #elif defined(CONFIG_ALPHA_CABRIOLET) || \ defined(CONFIG_ALPHA_EB66P) || \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-alpha/kmap_types.h linux-2.4.23-pre8/include/asm-alpha/kmap_types.h --- linux-2.4.22/include/asm-alpha/kmap_types.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-alpha/kmap_types.h 2003-10-22 22:47:39.000000000 +0000 @@ -0,0 +1,18 @@ +#ifdef __KERNEL__ +#ifndef _ASM_KMAP_TYPES_H +#define _ASM_KMAP_TYPES_H + +enum km_type { + KM_BOUNCE_READ, + KM_SKB_SUNRPC_DATA, + KM_SKB_DATA_SOFTIRQ, + KM_USER0, + KM_USER1, + KM_BH_IRQ, + KM_SOFTIRQ0, + KM_SOFTIRQ1, + KM_TYPE_NR +}; + +#endif +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-alpha/pci.h linux-2.4.23-pre8/include/asm-alpha/pci.h --- linux-2.4.22/include/asm-alpha/pci.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-alpha/pci.h 2003-10-22 22:47:28.000000000 +0000 @@ -50,6 +50,7 @@ bus numbers. */ #define pcibios_assign_all_busses() 1 +#define pcibios_scan_all_fns() 0 #define PCIBIOS_MIN_IO alpha_mv.min_io_address #define PCIBIOS_MIN_MEM alpha_mv.min_mem_address diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-alpha/processor.h linux-2.4.23-pre8/include/asm-alpha/processor.h --- linux-2.4.22/include/asm-alpha/processor.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-alpha/processor.h 2003-10-22 22:49:50.000000000 +0000 @@ -56,8 +56,8 @@ /* * The fields below are Linux-specific: * - * bit 1..5: IEEE_TRAP_ENABLE bits (see fpu.h) - * bit 6..8: UAC bits (see sysinfo.h) + * bit 1..6: IEEE_TRAP_ENABLE bits (see fpu.h) + * bit 7..9: UAC bits (see sysinfo.h) * bit 17..21: IEEE_STATUS_MASK bits (see fpu.h) * bit 63: die_if_kernel recursion lock */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-alpha/ptrace.h linux-2.4.23-pre8/include/asm-alpha/ptrace.h --- linux-2.4.22/include/asm-alpha/ptrace.h 1999-07-12 14:49:36.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-alpha/ptrace.h 2003-10-22 22:47:59.000000000 +0000 @@ -70,6 +70,12 @@ #define user_mode(regs) (((regs)->ps & 8) != 0) #define instruction_pointer(regs) ((regs)->pc) extern void show_regs(struct pt_regs *); + +#define alpha_task_regs(task) \ + ((struct pt_regs *)((long)(task) + 2*PAGE_SIZE) - 1) + +#define force_successful_syscall_return() (alpha_task_regs(current)->r0 = 0) + #endif #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-alpha/sysinfo.h linux-2.4.23-pre8/include/asm-alpha/sysinfo.h --- linux-2.4.22/include/asm-alpha/sysinfo.h 1999-03-22 04:53:46.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-alpha/sysinfo.h 2003-10-22 22:47:44.000000000 +0000 @@ -31,7 +31,7 @@ /* This is the shift that is applied to the UAC bits as stored in the per-thread flags. */ -#define UAC_SHIFT 6 +#define UAC_SHIFT 7 #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-alpha/xor.h linux-2.4.23-pre8/include/asm-alpha/xor.h --- linux-2.4.22/include/asm-alpha/xor.h 2000-11-13 03:39:51.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-alpha/xor.h 2003-10-22 22:49:17.000000000 +0000 @@ -32,809 +32,809 @@ unsigned long *, unsigned long *, unsigned long *, unsigned long *); -asm(" - .text - .align 3 - .ent xor_alpha_2 -xor_alpha_2: - .prologue 0 - srl $16, 6, $16 - .align 4 -2: - ldq $0,0($17) - ldq $1,0($18) - ldq $2,8($17) - ldq $3,8($18) - - ldq $4,16($17) - ldq $5,16($18) - ldq $6,24($17) - ldq $7,24($18) - - ldq $19,32($17) - ldq $20,32($18) - ldq $21,40($17) - ldq $22,40($18) - - ldq $23,48($17) - ldq $24,48($18) - ldq $25,56($17) - xor $0,$1,$0 # 7 cycles from $1 load - - ldq $27,56($18) - xor $2,$3,$2 - stq $0,0($17) - xor $4,$5,$4 - - stq $2,8($17) - xor $6,$7,$6 - stq $4,16($17) - xor $19,$20,$19 - - stq $6,24($17) - xor $21,$22,$21 - stq $19,32($17) - xor $23,$24,$23 - - stq $21,40($17) - xor $25,$27,$25 - stq $23,48($17) - subq $16,1,$16 - - stq $25,56($17) - addq $17,64,$17 - addq $18,64,$18 - bgt $16,2b - - ret - .end xor_alpha_2 - - .align 3 - .ent xor_alpha_3 -xor_alpha_3: - .prologue 0 - srl $16, 6, $16 - .align 4 -3: - ldq $0,0($17) - ldq $1,0($18) - ldq $2,0($19) - ldq $3,8($17) - - ldq $4,8($18) - ldq $6,16($17) - ldq $7,16($18) - ldq $21,24($17) - - ldq $22,24($18) - ldq $24,32($17) - ldq $25,32($18) - ldq $5,8($19) - - ldq $20,16($19) - ldq $23,24($19) - ldq $27,32($19) - nop - - xor $0,$1,$1 # 8 cycles from $0 load - xor $3,$4,$4 # 6 cycles from $4 load - xor $6,$7,$7 # 6 cycles from $7 load - xor $21,$22,$22 # 5 cycles from $22 load - - xor $1,$2,$2 # 9 cycles from $2 load - xor $24,$25,$25 # 5 cycles from $25 load - stq $2,0($17) - xor $4,$5,$5 # 6 cycles from $5 load - - stq $5,8($17) - xor $7,$20,$20 # 7 cycles from $20 load - stq $20,16($17) - xor $22,$23,$23 # 7 cycles from $23 load - - stq $23,24($17) - xor $25,$27,$27 # 7 cycles from $27 load - stq $27,32($17) - nop - - ldq $0,40($17) - ldq $1,40($18) - ldq $3,48($17) - ldq $4,48($18) - - ldq $6,56($17) - ldq $7,56($18) - ldq $2,40($19) - ldq $5,48($19) - - ldq $20,56($19) - xor $0,$1,$1 # 4 cycles from $1 load - xor $3,$4,$4 # 5 cycles from $4 load - xor $6,$7,$7 # 5 cycles from $7 load - - xor $1,$2,$2 # 4 cycles from $2 load - xor $4,$5,$5 # 5 cycles from $5 load - stq $2,40($17) - xor $7,$20,$20 # 4 cycles from $20 load - - stq $5,48($17) - subq $16,1,$16 - stq $20,56($17) - addq $19,64,$19 - - addq $18,64,$18 - addq $17,64,$17 - bgt $16,3b - ret - .end xor_alpha_3 - - .align 3 - .ent xor_alpha_4 -xor_alpha_4: - .prologue 0 - srl $16, 6, $16 - .align 4 -4: - ldq $0,0($17) - ldq $1,0($18) - ldq $2,0($19) - ldq $3,0($20) - - ldq $4,8($17) - ldq $5,8($18) - ldq $6,8($19) - ldq $7,8($20) - - ldq $21,16($17) - ldq $22,16($18) - ldq $23,16($19) - ldq $24,16($20) - - ldq $25,24($17) - xor $0,$1,$1 # 6 cycles from $1 load - ldq $27,24($18) - xor $2,$3,$3 # 6 cycles from $3 load - - ldq $0,24($19) - xor $1,$3,$3 - ldq $1,24($20) - xor $4,$5,$5 # 7 cycles from $5 load - - stq $3,0($17) - xor $6,$7,$7 - xor $21,$22,$22 # 7 cycles from $22 load - xor $5,$7,$7 - - stq $7,8($17) - xor $23,$24,$24 # 7 cycles from $24 load - ldq $2,32($17) - xor $22,$24,$24 - - ldq $3,32($18) - ldq $4,32($19) - ldq $5,32($20) - xor $25,$27,$27 # 8 cycles from $27 load - - ldq $6,40($17) - ldq $7,40($18) - ldq $21,40($19) - ldq $22,40($20) - - stq $24,16($17) - xor $0,$1,$1 # 9 cycles from $1 load - xor $2,$3,$3 # 5 cycles from $3 load - xor $27,$1,$1 - - stq $1,24($17) - xor $4,$5,$5 # 5 cycles from $5 load - ldq $23,48($17) - ldq $24,48($18) - - ldq $25,48($19) - xor $3,$5,$5 - ldq $27,48($20) - ldq $0,56($17) - - ldq $1,56($18) - ldq $2,56($19) - xor $6,$7,$7 # 8 cycles from $6 load - ldq $3,56($20) - - stq $5,32($17) - xor $21,$22,$22 # 8 cycles from $22 load - xor $7,$22,$22 - xor $23,$24,$24 # 5 cycles from $24 load - - stq $22,40($17) - xor $25,$27,$27 # 5 cycles from $27 load - xor $24,$27,$27 - xor $0,$1,$1 # 5 cycles from $1 load - - stq $27,48($17) - xor $2,$3,$3 # 4 cycles from $3 load - xor $1,$3,$3 - subq $16,1,$16 - - stq $3,56($17) - addq $20,64,$20 - addq $19,64,$19 - addq $18,64,$18 - - addq $17,64,$17 - bgt $16,4b - ret - .end xor_alpha_4 - - .align 3 - .ent xor_alpha_5 -xor_alpha_5: - .prologue 0 - srl $16, 6, $16 - .align 4 -5: - ldq $0,0($17) - ldq $1,0($18) - ldq $2,0($19) - ldq $3,0($20) - - ldq $4,0($21) - ldq $5,8($17) - ldq $6,8($18) - ldq $7,8($19) - - ldq $22,8($20) - ldq $23,8($21) - ldq $24,16($17) - ldq $25,16($18) - - ldq $27,16($19) - xor $0,$1,$1 # 6 cycles from $1 load - ldq $28,16($20) - xor $2,$3,$3 # 6 cycles from $3 load - - ldq $0,16($21) - xor $1,$3,$3 - ldq $1,24($17) - xor $3,$4,$4 # 7 cycles from $4 load - - stq $4,0($17) - xor $5,$6,$6 # 7 cycles from $6 load - xor $7,$22,$22 # 7 cycles from $22 load - xor $6,$23,$23 # 7 cycles from $23 load - - ldq $2,24($18) - xor $22,$23,$23 - ldq $3,24($19) - xor $24,$25,$25 # 8 cycles from $25 load - - stq $23,8($17) - xor $25,$27,$27 # 8 cycles from $27 load - ldq $4,24($20) - xor $28,$0,$0 # 7 cycles from $0 load - - ldq $5,24($21) - xor $27,$0,$0 - ldq $6,32($17) - ldq $7,32($18) - - stq $0,16($17) - xor $1,$2,$2 # 6 cycles from $2 load - ldq $22,32($19) - xor $3,$4,$4 # 4 cycles from $4 load - - ldq $23,32($20) - xor $2,$4,$4 - ldq $24,32($21) - ldq $25,40($17) - - ldq $27,40($18) - ldq $28,40($19) - ldq $0,40($20) - xor $4,$5,$5 # 7 cycles from $5 load - - stq $5,24($17) - xor $6,$7,$7 # 7 cycles from $7 load - ldq $1,40($21) - ldq $2,48($17) - - ldq $3,48($18) - xor $7,$22,$22 # 7 cycles from $22 load - ldq $4,48($19) - xor $23,$24,$24 # 6 cycles from $24 load - - ldq $5,48($20) - xor $22,$24,$24 - ldq $6,48($21) - xor $25,$27,$27 # 7 cycles from $27 load - - stq $24,32($17) - xor $27,$28,$28 # 8 cycles from $28 load - ldq $7,56($17) - xor $0,$1,$1 # 6 cycles from $1 load - - ldq $22,56($18) - ldq $23,56($19) - ldq $24,56($20) - ldq $25,56($21) - - xor $28,$1,$1 - xor $2,$3,$3 # 9 cycles from $3 load - xor $3,$4,$4 # 9 cycles from $4 load - xor $5,$6,$6 # 8 cycles from $6 load - - stq $1,40($17) - xor $4,$6,$6 - xor $7,$22,$22 # 7 cycles from $22 load - xor $23,$24,$24 # 6 cycles from $24 load - - stq $6,48($17) - xor $22,$24,$24 - subq $16,1,$16 - xor $24,$25,$25 # 8 cycles from $25 load - - stq $25,56($17) - addq $21,64,$21 - addq $20,64,$20 - addq $19,64,$19 - - addq $18,64,$18 - addq $17,64,$17 - bgt $16,5b - ret - .end xor_alpha_5 - - .align 3 - .ent xor_alpha_prefetch_2 -xor_alpha_prefetch_2: - .prologue 0 - srl $16, 6, $16 - - ldq $31, 0($17) - ldq $31, 0($18) - - ldq $31, 64($17) - ldq $31, 64($18) - - ldq $31, 128($17) - ldq $31, 128($18) - - ldq $31, 192($17) - ldq $31, 192($18) - .align 4 -2: - ldq $0,0($17) - ldq $1,0($18) - ldq $2,8($17) - ldq $3,8($18) - - ldq $4,16($17) - ldq $5,16($18) - ldq $6,24($17) - ldq $7,24($18) - - ldq $19,32($17) - ldq $20,32($18) - ldq $21,40($17) - ldq $22,40($18) - - ldq $23,48($17) - ldq $24,48($18) - ldq $25,56($17) - ldq $27,56($18) - - ldq $31,256($17) - xor $0,$1,$0 # 8 cycles from $1 load - ldq $31,256($18) - xor $2,$3,$2 - - stq $0,0($17) - xor $4,$5,$4 - stq $2,8($17) - xor $6,$7,$6 - - stq $4,16($17) - xor $19,$20,$19 - stq $6,24($17) - xor $21,$22,$21 - - stq $19,32($17) - xor $23,$24,$23 - stq $21,40($17) - xor $25,$27,$25 - - stq $23,48($17) - subq $16,1,$16 - stq $25,56($17) - addq $17,64,$17 - - addq $18,64,$18 - bgt $16,2b - ret - .end xor_alpha_prefetch_2 - - .align 3 - .ent xor_alpha_prefetch_3 -xor_alpha_prefetch_3: - .prologue 0 - srl $16, 6, $16 - - ldq $31, 0($17) - ldq $31, 0($18) - ldq $31, 0($19) - - ldq $31, 64($17) - ldq $31, 64($18) - ldq $31, 64($19) - - ldq $31, 128($17) - ldq $31, 128($18) - ldq $31, 128($19) - - ldq $31, 192($17) - ldq $31, 192($18) - ldq $31, 192($19) - .align 4 -3: - ldq $0,0($17) - ldq $1,0($18) - ldq $2,0($19) - ldq $3,8($17) - - ldq $4,8($18) - ldq $6,16($17) - ldq $7,16($18) - ldq $21,24($17) - - ldq $22,24($18) - ldq $24,32($17) - ldq $25,32($18) - ldq $5,8($19) - - ldq $20,16($19) - ldq $23,24($19) - ldq $27,32($19) - nop - - xor $0,$1,$1 # 8 cycles from $0 load - xor $3,$4,$4 # 7 cycles from $4 load - xor $6,$7,$7 # 6 cycles from $7 load - xor $21,$22,$22 # 5 cycles from $22 load - - xor $1,$2,$2 # 9 cycles from $2 load - xor $24,$25,$25 # 5 cycles from $25 load - stq $2,0($17) - xor $4,$5,$5 # 6 cycles from $5 load - - stq $5,8($17) - xor $7,$20,$20 # 7 cycles from $20 load - stq $20,16($17) - xor $22,$23,$23 # 7 cycles from $23 load - - stq $23,24($17) - xor $25,$27,$27 # 7 cycles from $27 load - stq $27,32($17) - nop - - ldq $0,40($17) - ldq $1,40($18) - ldq $3,48($17) - ldq $4,48($18) - - ldq $6,56($17) - ldq $7,56($18) - ldq $2,40($19) - ldq $5,48($19) - - ldq $20,56($19) - ldq $31,256($17) - ldq $31,256($18) - ldq $31,256($19) - - xor $0,$1,$1 # 6 cycles from $1 load - xor $3,$4,$4 # 5 cycles from $4 load - xor $6,$7,$7 # 5 cycles from $7 load - xor $1,$2,$2 # 4 cycles from $2 load - - xor $4,$5,$5 # 5 cycles from $5 load - xor $7,$20,$20 # 4 cycles from $20 load - stq $2,40($17) - subq $16,1,$16 - - stq $5,48($17) - addq $19,64,$19 - stq $20,56($17) - addq $18,64,$18 - - addq $17,64,$17 - bgt $16,3b - ret - .end xor_alpha_prefetch_3 - - .align 3 - .ent xor_alpha_prefetch_4 -xor_alpha_prefetch_4: - .prologue 0 - srl $16, 6, $16 - - ldq $31, 0($17) - ldq $31, 0($18) - ldq $31, 0($19) - ldq $31, 0($20) - - ldq $31, 64($17) - ldq $31, 64($18) - ldq $31, 64($19) - ldq $31, 64($20) - - ldq $31, 128($17) - ldq $31, 128($18) - ldq $31, 128($19) - ldq $31, 128($20) - - ldq $31, 192($17) - ldq $31, 192($18) - ldq $31, 192($19) - ldq $31, 192($20) - .align 4 -4: - ldq $0,0($17) - ldq $1,0($18) - ldq $2,0($19) - ldq $3,0($20) - - ldq $4,8($17) - ldq $5,8($18) - ldq $6,8($19) - ldq $7,8($20) - - ldq $21,16($17) - ldq $22,16($18) - ldq $23,16($19) - ldq $24,16($20) - - ldq $25,24($17) - xor $0,$1,$1 # 6 cycles from $1 load - ldq $27,24($18) - xor $2,$3,$3 # 6 cycles from $3 load - - ldq $0,24($19) - xor $1,$3,$3 - ldq $1,24($20) - xor $4,$5,$5 # 7 cycles from $5 load - - stq $3,0($17) - xor $6,$7,$7 - xor $21,$22,$22 # 7 cycles from $22 load - xor $5,$7,$7 - - stq $7,8($17) - xor $23,$24,$24 # 7 cycles from $24 load - ldq $2,32($17) - xor $22,$24,$24 - - ldq $3,32($18) - ldq $4,32($19) - ldq $5,32($20) - xor $25,$27,$27 # 8 cycles from $27 load - - ldq $6,40($17) - ldq $7,40($18) - ldq $21,40($19) - ldq $22,40($20) - - stq $24,16($17) - xor $0,$1,$1 # 9 cycles from $1 load - xor $2,$3,$3 # 5 cycles from $3 load - xor $27,$1,$1 - - stq $1,24($17) - xor $4,$5,$5 # 5 cycles from $5 load - ldq $23,48($17) - xor $3,$5,$5 - - ldq $24,48($18) - ldq $25,48($19) - ldq $27,48($20) - ldq $0,56($17) - - ldq $1,56($18) - ldq $2,56($19) - ldq $3,56($20) - xor $6,$7,$7 # 8 cycles from $6 load - - ldq $31,256($17) - xor $21,$22,$22 # 8 cycles from $22 load - ldq $31,256($18) - xor $7,$22,$22 - - ldq $31,256($19) - xor $23,$24,$24 # 6 cycles from $24 load - ldq $31,256($20) - xor $25,$27,$27 # 6 cycles from $27 load - - stq $5,32($17) - xor $24,$27,$27 - xor $0,$1,$1 # 7 cycles from $1 load - xor $2,$3,$3 # 6 cycles from $3 load - - stq $22,40($17) - xor $1,$3,$3 - stq $27,48($17) - subq $16,1,$16 - - stq $3,56($17) - addq $20,64,$20 - addq $19,64,$19 - addq $18,64,$18 - - addq $17,64,$17 - bgt $16,4b - ret - .end xor_alpha_prefetch_4 - - .align 3 - .ent xor_alpha_prefetch_5 -xor_alpha_prefetch_5: - .prologue 0 - srl $16, 6, $16 - - ldq $31, 0($17) - ldq $31, 0($18) - ldq $31, 0($19) - ldq $31, 0($20) - ldq $31, 0($21) - - ldq $31, 64($17) - ldq $31, 64($18) - ldq $31, 64($19) - ldq $31, 64($20) - ldq $31, 64($21) - - ldq $31, 128($17) - ldq $31, 128($18) - ldq $31, 128($19) - ldq $31, 128($20) - ldq $31, 128($21) - - ldq $31, 192($17) - ldq $31, 192($18) - ldq $31, 192($19) - ldq $31, 192($20) - ldq $31, 192($21) - .align 4 -5: - ldq $0,0($17) - ldq $1,0($18) - ldq $2,0($19) - ldq $3,0($20) - - ldq $4,0($21) - ldq $5,8($17) - ldq $6,8($18) - ldq $7,8($19) - - ldq $22,8($20) - ldq $23,8($21) - ldq $24,16($17) - ldq $25,16($18) - - ldq $27,16($19) - xor $0,$1,$1 # 6 cycles from $1 load - ldq $28,16($20) - xor $2,$3,$3 # 6 cycles from $3 load - - ldq $0,16($21) - xor $1,$3,$3 - ldq $1,24($17) - xor $3,$4,$4 # 7 cycles from $4 load - - stq $4,0($17) - xor $5,$6,$6 # 7 cycles from $6 load - xor $7,$22,$22 # 7 cycles from $22 load - xor $6,$23,$23 # 7 cycles from $23 load - - ldq $2,24($18) - xor $22,$23,$23 - ldq $3,24($19) - xor $24,$25,$25 # 8 cycles from $25 load - - stq $23,8($17) - xor $25,$27,$27 # 8 cycles from $27 load - ldq $4,24($20) - xor $28,$0,$0 # 7 cycles from $0 load - - ldq $5,24($21) - xor $27,$0,$0 - ldq $6,32($17) - ldq $7,32($18) - - stq $0,16($17) - xor $1,$2,$2 # 6 cycles from $2 load - ldq $22,32($19) - xor $3,$4,$4 # 4 cycles from $4 load - - ldq $23,32($20) - xor $2,$4,$4 - ldq $24,32($21) - ldq $25,40($17) - - ldq $27,40($18) - ldq $28,40($19) - ldq $0,40($20) - xor $4,$5,$5 # 7 cycles from $5 load - - stq $5,24($17) - xor $6,$7,$7 # 7 cycles from $7 load - ldq $1,40($21) - ldq $2,48($17) - - ldq $3,48($18) - xor $7,$22,$22 # 7 cycles from $22 load - ldq $4,48($19) - xor $23,$24,$24 # 6 cycles from $24 load - - ldq $5,48($20) - xor $22,$24,$24 - ldq $6,48($21) - xor $25,$27,$27 # 7 cycles from $27 load - - stq $24,32($17) - xor $27,$28,$28 # 8 cycles from $28 load - ldq $7,56($17) - xor $0,$1,$1 # 6 cycles from $1 load - - ldq $22,56($18) - ldq $23,56($19) - ldq $24,56($20) - ldq $25,56($21) - - ldq $31,256($17) - xor $28,$1,$1 - ldq $31,256($18) - xor $2,$3,$3 # 9 cycles from $3 load - - ldq $31,256($19) - xor $3,$4,$4 # 9 cycles from $4 load - ldq $31,256($20) - xor $5,$6,$6 # 8 cycles from $6 load - - stq $1,40($17) - xor $4,$6,$6 - xor $7,$22,$22 # 7 cycles from $22 load - xor $23,$24,$24 # 6 cycles from $24 load - - stq $6,48($17) - xor $22,$24,$24 - ldq $31,256($21) - xor $24,$25,$25 # 8 cycles from $25 load - - stq $25,56($17) - subq $16,1,$16 - addq $21,64,$21 - addq $20,64,$20 - - addq $19,64,$19 - addq $18,64,$18 - addq $17,64,$17 - bgt $16,5b - - ret - .end xor_alpha_prefetch_5 +asm(" \n\ + .text \n\ + .align 3 \n\ + .ent xor_alpha_2 \n\ +xor_alpha_2: \n\ + .prologue 0 \n\ + srl $16, 6, $16 \n\ + .align 4 \n\ +2: \n\ + ldq $0,0($17) \n\ + ldq $1,0($18) \n\ + ldq $2,8($17) \n\ + ldq $3,8($18) \n\ + \n\ + ldq $4,16($17) \n\ + ldq $5,16($18) \n\ + ldq $6,24($17) \n\ + ldq $7,24($18) \n\ + \n\ + ldq $19,32($17) \n\ + ldq $20,32($18) \n\ + ldq $21,40($17) \n\ + ldq $22,40($18) \n\ + \n\ + ldq $23,48($17) \n\ + ldq $24,48($18) \n\ + ldq $25,56($17) \n\ + xor $0,$1,$0 # 7 cycles from $1 load \n\ + \n\ + ldq $27,56($18) \n\ + xor $2,$3,$2 \n\ + stq $0,0($17) \n\ + xor $4,$5,$4 \n\ + \n\ + stq $2,8($17) \n\ + xor $6,$7,$6 \n\ + stq $4,16($17) \n\ + xor $19,$20,$19 \n\ + \n\ + stq $6,24($17) \n\ + xor $21,$22,$21 \n\ + stq $19,32($17) \n\ + xor $23,$24,$23 \n\ + \n\ + stq $21,40($17) \n\ + xor $25,$27,$25 \n\ + stq $23,48($17) \n\ + subq $16,1,$16 \n\ + \n\ + stq $25,56($17) \n\ + addq $17,64,$17 \n\ + addq $18,64,$18 \n\ + bgt $16,2b \n\ + \n\ + ret \n\ + .end xor_alpha_2 \n\ + \n\ + .align 3 \n\ + .ent xor_alpha_3 \n\ +xor_alpha_3: \n\ + .prologue 0 \n\ + srl $16, 6, $16 \n\ + .align 4 \n\ +3: \n\ + ldq $0,0($17) \n\ + ldq $1,0($18) \n\ + ldq $2,0($19) \n\ + ldq $3,8($17) \n\ + \n\ + ldq $4,8($18) \n\ + ldq $6,16($17) \n\ + ldq $7,16($18) \n\ + ldq $21,24($17) \n\ + \n\ + ldq $22,24($18) \n\ + ldq $24,32($17) \n\ + ldq $25,32($18) \n\ + ldq $5,8($19) \n\ + \n\ + ldq $20,16($19) \n\ + ldq $23,24($19) \n\ + ldq $27,32($19) \n\ + nop \n\ + \n\ + xor $0,$1,$1 # 8 cycles from $0 load \n\ + xor $3,$4,$4 # 6 cycles from $4 load \n\ + xor $6,$7,$7 # 6 cycles from $7 load \n\ + xor $21,$22,$22 # 5 cycles from $22 load \n\ + \n\ + xor $1,$2,$2 # 9 cycles from $2 load \n\ + xor $24,$25,$25 # 5 cycles from $25 load \n\ + stq $2,0($17) \n\ + xor $4,$5,$5 # 6 cycles from $5 load \n\ + \n\ + stq $5,8($17) \n\ + xor $7,$20,$20 # 7 cycles from $20 load \n\ + stq $20,16($17) \n\ + xor $22,$23,$23 # 7 cycles from $23 load \n\ + \n\ + stq $23,24($17) \n\ + xor $25,$27,$27 # 7 cycles from $27 load \n\ + stq $27,32($17) \n\ + nop \n\ + \n\ + ldq $0,40($17) \n\ + ldq $1,40($18) \n\ + ldq $3,48($17) \n\ + ldq $4,48($18) \n\ + \n\ + ldq $6,56($17) \n\ + ldq $7,56($18) \n\ + ldq $2,40($19) \n\ + ldq $5,48($19) \n\ + \n\ + ldq $20,56($19) \n\ + xor $0,$1,$1 # 4 cycles from $1 load \n\ + xor $3,$4,$4 # 5 cycles from $4 load \n\ + xor $6,$7,$7 # 5 cycles from $7 load \n\ + \n\ + xor $1,$2,$2 # 4 cycles from $2 load \n\ + xor $4,$5,$5 # 5 cycles from $5 load \n\ + stq $2,40($17) \n\ + xor $7,$20,$20 # 4 cycles from $20 load \n\ + \n\ + stq $5,48($17) \n\ + subq $16,1,$16 \n\ + stq $20,56($17) \n\ + addq $19,64,$19 \n\ + \n\ + addq $18,64,$18 \n\ + addq $17,64,$17 \n\ + bgt $16,3b \n\ + ret \n\ + .end xor_alpha_3 \n\ + \n\ + .align 3 \n\ + .ent xor_alpha_4 \n\ +xor_alpha_4: \n\ + .prologue 0 \n\ + srl $16, 6, $16 \n\ + .align 4 \n\ +4: \n\ + ldq $0,0($17) \n\ + ldq $1,0($18) \n\ + ldq $2,0($19) \n\ + ldq $3,0($20) \n\ + \n\ + ldq $4,8($17) \n\ + ldq $5,8($18) \n\ + ldq $6,8($19) \n\ + ldq $7,8($20) \n\ + \n\ + ldq $21,16($17) \n\ + ldq $22,16($18) \n\ + ldq $23,16($19) \n\ + ldq $24,16($20) \n\ + \n\ + ldq $25,24($17) \n\ + xor $0,$1,$1 # 6 cycles from $1 load \n\ + ldq $27,24($18) \n\ + xor $2,$3,$3 # 6 cycles from $3 load \n\ + \n\ + ldq $0,24($19) \n\ + xor $1,$3,$3 \n\ + ldq $1,24($20) \n\ + xor $4,$5,$5 # 7 cycles from $5 load \n\ + \n\ + stq $3,0($17) \n\ + xor $6,$7,$7 \n\ + xor $21,$22,$22 # 7 cycles from $22 load \n\ + xor $5,$7,$7 \n\ + \n\ + stq $7,8($17) \n\ + xor $23,$24,$24 # 7 cycles from $24 load \n\ + ldq $2,32($17) \n\ + xor $22,$24,$24 \n\ + \n\ + ldq $3,32($18) \n\ + ldq $4,32($19) \n\ + ldq $5,32($20) \n\ + xor $25,$27,$27 # 8 cycles from $27 load \n\ + \n\ + ldq $6,40($17) \n\ + ldq $7,40($18) \n\ + ldq $21,40($19) \n\ + ldq $22,40($20) \n\ + \n\ + stq $24,16($17) \n\ + xor $0,$1,$1 # 9 cycles from $1 load \n\ + xor $2,$3,$3 # 5 cycles from $3 load \n\ + xor $27,$1,$1 \n\ + \n\ + stq $1,24($17) \n\ + xor $4,$5,$5 # 5 cycles from $5 load \n\ + ldq $23,48($17) \n\ + ldq $24,48($18) \n\ + \n\ + ldq $25,48($19) \n\ + xor $3,$5,$5 \n\ + ldq $27,48($20) \n\ + ldq $0,56($17) \n\ + \n\ + ldq $1,56($18) \n\ + ldq $2,56($19) \n\ + xor $6,$7,$7 # 8 cycles from $6 load \n\ + ldq $3,56($20) \n\ + \n\ + stq $5,32($17) \n\ + xor $21,$22,$22 # 8 cycles from $22 load \n\ + xor $7,$22,$22 \n\ + xor $23,$24,$24 # 5 cycles from $24 load \n\ + \n\ + stq $22,40($17) \n\ + xor $25,$27,$27 # 5 cycles from $27 load \n\ + xor $24,$27,$27 \n\ + xor $0,$1,$1 # 5 cycles from $1 load \n\ + \n\ + stq $27,48($17) \n\ + xor $2,$3,$3 # 4 cycles from $3 load \n\ + xor $1,$3,$3 \n\ + subq $16,1,$16 \n\ + \n\ + stq $3,56($17) \n\ + addq $20,64,$20 \n\ + addq $19,64,$19 \n\ + addq $18,64,$18 \n\ + \n\ + addq $17,64,$17 \n\ + bgt $16,4b \n\ + ret \n\ + .end xor_alpha_4 \n\ + \n\ + .align 3 \n\ + .ent xor_alpha_5 \n\ +xor_alpha_5: \n\ + .prologue 0 \n\ + srl $16, 6, $16 \n\ + .align 4 \n\ +5: \n\ + ldq $0,0($17) \n\ + ldq $1,0($18) \n\ + ldq $2,0($19) \n\ + ldq $3,0($20) \n\ + \n\ + ldq $4,0($21) \n\ + ldq $5,8($17) \n\ + ldq $6,8($18) \n\ + ldq $7,8($19) \n\ + \n\ + ldq $22,8($20) \n\ + ldq $23,8($21) \n\ + ldq $24,16($17) \n\ + ldq $25,16($18) \n\ + \n\ + ldq $27,16($19) \n\ + xor $0,$1,$1 # 6 cycles from $1 load \n\ + ldq $28,16($20) \n\ + xor $2,$3,$3 # 6 cycles from $3 load \n\ + \n\ + ldq $0,16($21) \n\ + xor $1,$3,$3 \n\ + ldq $1,24($17) \n\ + xor $3,$4,$4 # 7 cycles from $4 load \n\ + \n\ + stq $4,0($17) \n\ + xor $5,$6,$6 # 7 cycles from $6 load \n\ + xor $7,$22,$22 # 7 cycles from $22 load \n\ + xor $6,$23,$23 # 7 cycles from $23 load \n\ + \n\ + ldq $2,24($18) \n\ + xor $22,$23,$23 \n\ + ldq $3,24($19) \n\ + xor $24,$25,$25 # 8 cycles from $25 load \n\ + \n\ + stq $23,8($17) \n\ + xor $25,$27,$27 # 8 cycles from $27 load \n\ + ldq $4,24($20) \n\ + xor $28,$0,$0 # 7 cycles from $0 load \n\ + \n\ + ldq $5,24($21) \n\ + xor $27,$0,$0 \n\ + ldq $6,32($17) \n\ + ldq $7,32($18) \n\ + \n\ + stq $0,16($17) \n\ + xor $1,$2,$2 # 6 cycles from $2 load \n\ + ldq $22,32($19) \n\ + xor $3,$4,$4 # 4 cycles from $4 load \n\ + \n\ + ldq $23,32($20) \n\ + xor $2,$4,$4 \n\ + ldq $24,32($21) \n\ + ldq $25,40($17) \n\ + \n\ + ldq $27,40($18) \n\ + ldq $28,40($19) \n\ + ldq $0,40($20) \n\ + xor $4,$5,$5 # 7 cycles from $5 load \n\ + \n\ + stq $5,24($17) \n\ + xor $6,$7,$7 # 7 cycles from $7 load \n\ + ldq $1,40($21) \n\ + ldq $2,48($17) \n\ + \n\ + ldq $3,48($18) \n\ + xor $7,$22,$22 # 7 cycles from $22 load \n\ + ldq $4,48($19) \n\ + xor $23,$24,$24 # 6 cycles from $24 load \n\ + \n\ + ldq $5,48($20) \n\ + xor $22,$24,$24 \n\ + ldq $6,48($21) \n\ + xor $25,$27,$27 # 7 cycles from $27 load \n\ + \n\ + stq $24,32($17) \n\ + xor $27,$28,$28 # 8 cycles from $28 load \n\ + ldq $7,56($17) \n\ + xor $0,$1,$1 # 6 cycles from $1 load \n\ + \n\ + ldq $22,56($18) \n\ + ldq $23,56($19) \n\ + ldq $24,56($20) \n\ + ldq $25,56($21) \n\ + \n\ + xor $28,$1,$1 \n\ + xor $2,$3,$3 # 9 cycles from $3 load \n\ + xor $3,$4,$4 # 9 cycles from $4 load \n\ + xor $5,$6,$6 # 8 cycles from $6 load \n\ + \n\ + stq $1,40($17) \n\ + xor $4,$6,$6 \n\ + xor $7,$22,$22 # 7 cycles from $22 load \n\ + xor $23,$24,$24 # 6 cycles from $24 load \n\ + \n\ + stq $6,48($17) \n\ + xor $22,$24,$24 \n\ + subq $16,1,$16 \n\ + xor $24,$25,$25 # 8 cycles from $25 load \n\ + \n\ + stq $25,56($17) \n\ + addq $21,64,$21 \n\ + addq $20,64,$20 \n\ + addq $19,64,$19 \n\ + \n\ + addq $18,64,$18 \n\ + addq $17,64,$17 \n\ + bgt $16,5b \n\ + ret \n\ + .end xor_alpha_5 \n\ + \n\ + .align 3 \n\ + .ent xor_alpha_prefetch_2 \n\ +xor_alpha_prefetch_2: \n\ + .prologue 0 \n\ + srl $16, 6, $16 \n\ + \n\ + ldq $31, 0($17) \n\ + ldq $31, 0($18) \n\ + \n\ + ldq $31, 64($17) \n\ + ldq $31, 64($18) \n\ + \n\ + ldq $31, 128($17) \n\ + ldq $31, 128($18) \n\ + \n\ + ldq $31, 192($17) \n\ + ldq $31, 192($18) \n\ + .align 4 \n\ +2: \n\ + ldq $0,0($17) \n\ + ldq $1,0($18) \n\ + ldq $2,8($17) \n\ + ldq $3,8($18) \n\ + \n\ + ldq $4,16($17) \n\ + ldq $5,16($18) \n\ + ldq $6,24($17) \n\ + ldq $7,24($18) \n\ + \n\ + ldq $19,32($17) \n\ + ldq $20,32($18) \n\ + ldq $21,40($17) \n\ + ldq $22,40($18) \n\ + \n\ + ldq $23,48($17) \n\ + ldq $24,48($18) \n\ + ldq $25,56($17) \n\ + ldq $27,56($18) \n\ + \n\ + ldq $31,256($17) \n\ + xor $0,$1,$0 # 8 cycles from $1 load \n\ + ldq $31,256($18) \n\ + xor $2,$3,$2 \n\ + \n\ + stq $0,0($17) \n\ + xor $4,$5,$4 \n\ + stq $2,8($17) \n\ + xor $6,$7,$6 \n\ + \n\ + stq $4,16($17) \n\ + xor $19,$20,$19 \n\ + stq $6,24($17) \n\ + xor $21,$22,$21 \n\ + \n\ + stq $19,32($17) \n\ + xor $23,$24,$23 \n\ + stq $21,40($17) \n\ + xor $25,$27,$25 \n\ + \n\ + stq $23,48($17) \n\ + subq $16,1,$16 \n\ + stq $25,56($17) \n\ + addq $17,64,$17 \n\ + \n\ + addq $18,64,$18 \n\ + bgt $16,2b \n\ + ret \n\ + .end xor_alpha_prefetch_2 \n\ + \n\ + .align 3 \n\ + .ent xor_alpha_prefetch_3 \n\ +xor_alpha_prefetch_3: \n\ + .prologue 0 \n\ + srl $16, 6, $16 \n\ + \n\ + ldq $31, 0($17) \n\ + ldq $31, 0($18) \n\ + ldq $31, 0($19) \n\ + \n\ + ldq $31, 64($17) \n\ + ldq $31, 64($18) \n\ + ldq $31, 64($19) \n\ + \n\ + ldq $31, 128($17) \n\ + ldq $31, 128($18) \n\ + ldq $31, 128($19) \n\ + \n\ + ldq $31, 192($17) \n\ + ldq $31, 192($18) \n\ + ldq $31, 192($19) \n\ + .align 4 \n\ +3: \n\ + ldq $0,0($17) \n\ + ldq $1,0($18) \n\ + ldq $2,0($19) \n\ + ldq $3,8($17) \n\ + \n\ + ldq $4,8($18) \n\ + ldq $6,16($17) \n\ + ldq $7,16($18) \n\ + ldq $21,24($17) \n\ + \n\ + ldq $22,24($18) \n\ + ldq $24,32($17) \n\ + ldq $25,32($18) \n\ + ldq $5,8($19) \n\ + \n\ + ldq $20,16($19) \n\ + ldq $23,24($19) \n\ + ldq $27,32($19) \n\ + nop \n\ + \n\ + xor $0,$1,$1 # 8 cycles from $0 load \n\ + xor $3,$4,$4 # 7 cycles from $4 load \n\ + xor $6,$7,$7 # 6 cycles from $7 load \n\ + xor $21,$22,$22 # 5 cycles from $22 load \n\ + \n\ + xor $1,$2,$2 # 9 cycles from $2 load \n\ + xor $24,$25,$25 # 5 cycles from $25 load \n\ + stq $2,0($17) \n\ + xor $4,$5,$5 # 6 cycles from $5 load \n\ + \n\ + stq $5,8($17) \n\ + xor $7,$20,$20 # 7 cycles from $20 load \n\ + stq $20,16($17) \n\ + xor $22,$23,$23 # 7 cycles from $23 load \n\ + \n\ + stq $23,24($17) \n\ + xor $25,$27,$27 # 7 cycles from $27 load \n\ + stq $27,32($17) \n\ + nop \n\ + \n\ + ldq $0,40($17) \n\ + ldq $1,40($18) \n\ + ldq $3,48($17) \n\ + ldq $4,48($18) \n\ + \n\ + ldq $6,56($17) \n\ + ldq $7,56($18) \n\ + ldq $2,40($19) \n\ + ldq $5,48($19) \n\ + \n\ + ldq $20,56($19) \n\ + ldq $31,256($17) \n\ + ldq $31,256($18) \n\ + ldq $31,256($19) \n\ + \n\ + xor $0,$1,$1 # 6 cycles from $1 load \n\ + xor $3,$4,$4 # 5 cycles from $4 load \n\ + xor $6,$7,$7 # 5 cycles from $7 load \n\ + xor $1,$2,$2 # 4 cycles from $2 load \n\ + \n\ + xor $4,$5,$5 # 5 cycles from $5 load \n\ + xor $7,$20,$20 # 4 cycles from $20 load \n\ + stq $2,40($17) \n\ + subq $16,1,$16 \n\ + \n\ + stq $5,48($17) \n\ + addq $19,64,$19 \n\ + stq $20,56($17) \n\ + addq $18,64,$18 \n\ + \n\ + addq $17,64,$17 \n\ + bgt $16,3b \n\ + ret \n\ + .end xor_alpha_prefetch_3 \n\ + \n\ + .align 3 \n\ + .ent xor_alpha_prefetch_4 \n\ +xor_alpha_prefetch_4: \n\ + .prologue 0 \n\ + srl $16, 6, $16 \n\ + \n\ + ldq $31, 0($17) \n\ + ldq $31, 0($18) \n\ + ldq $31, 0($19) \n\ + ldq $31, 0($20) \n\ + \n\ + ldq $31, 64($17) \n\ + ldq $31, 64($18) \n\ + ldq $31, 64($19) \n\ + ldq $31, 64($20) \n\ + \n\ + ldq $31, 128($17) \n\ + ldq $31, 128($18) \n\ + ldq $31, 128($19) \n\ + ldq $31, 128($20) \n\ + \n\ + ldq $31, 192($17) \n\ + ldq $31, 192($18) \n\ + ldq $31, 192($19) \n\ + ldq $31, 192($20) \n\ + .align 4 \n\ +4: \n\ + ldq $0,0($17) \n\ + ldq $1,0($18) \n\ + ldq $2,0($19) \n\ + ldq $3,0($20) \n\ + \n\ + ldq $4,8($17) \n\ + ldq $5,8($18) \n\ + ldq $6,8($19) \n\ + ldq $7,8($20) \n\ + \n\ + ldq $21,16($17) \n\ + ldq $22,16($18) \n\ + ldq $23,16($19) \n\ + ldq $24,16($20) \n\ + \n\ + ldq $25,24($17) \n\ + xor $0,$1,$1 # 6 cycles from $1 load \n\ + ldq $27,24($18) \n\ + xor $2,$3,$3 # 6 cycles from $3 load \n\ + \n\ + ldq $0,24($19) \n\ + xor $1,$3,$3 \n\ + ldq $1,24($20) \n\ + xor $4,$5,$5 # 7 cycles from $5 load \n\ + \n\ + stq $3,0($17) \n\ + xor $6,$7,$7 \n\ + xor $21,$22,$22 # 7 cycles from $22 load \n\ + xor $5,$7,$7 \n\ + \n\ + stq $7,8($17) \n\ + xor $23,$24,$24 # 7 cycles from $24 load \n\ + ldq $2,32($17) \n\ + xor $22,$24,$24 \n\ + \n\ + ldq $3,32($18) \n\ + ldq $4,32($19) \n\ + ldq $5,32($20) \n\ + xor $25,$27,$27 # 8 cycles from $27 load \n\ + \n\ + ldq $6,40($17) \n\ + ldq $7,40($18) \n\ + ldq $21,40($19) \n\ + ldq $22,40($20) \n\ + \n\ + stq $24,16($17) \n\ + xor $0,$1,$1 # 9 cycles from $1 load \n\ + xor $2,$3,$3 # 5 cycles from $3 load \n\ + xor $27,$1,$1 \n\ + \n\ + stq $1,24($17) \n\ + xor $4,$5,$5 # 5 cycles from $5 load \n\ + ldq $23,48($17) \n\ + xor $3,$5,$5 \n\ + \n\ + ldq $24,48($18) \n\ + ldq $25,48($19) \n\ + ldq $27,48($20) \n\ + ldq $0,56($17) \n\ + \n\ + ldq $1,56($18) \n\ + ldq $2,56($19) \n\ + ldq $3,56($20) \n\ + xor $6,$7,$7 # 8 cycles from $6 load \n\ + \n\ + ldq $31,256($17) \n\ + xor $21,$22,$22 # 8 cycles from $22 load \n\ + ldq $31,256($18) \n\ + xor $7,$22,$22 \n\ + \n\ + ldq $31,256($19) \n\ + xor $23,$24,$24 # 6 cycles from $24 load \n\ + ldq $31,256($20) \n\ + xor $25,$27,$27 # 6 cycles from $27 load \n\ + \n\ + stq $5,32($17) \n\ + xor $24,$27,$27 \n\ + xor $0,$1,$1 # 7 cycles from $1 load \n\ + xor $2,$3,$3 # 6 cycles from $3 load \n\ + \n\ + stq $22,40($17) \n\ + xor $1,$3,$3 \n\ + stq $27,48($17) \n\ + subq $16,1,$16 \n\ + \n\ + stq $3,56($17) \n\ + addq $20,64,$20 \n\ + addq $19,64,$19 \n\ + addq $18,64,$18 \n\ + \n\ + addq $17,64,$17 \n\ + bgt $16,4b \n\ + ret \n\ + .end xor_alpha_prefetch_4 \n\ + \n\ + .align 3 \n\ + .ent xor_alpha_prefetch_5 \n\ +xor_alpha_prefetch_5: \n\ + .prologue 0 \n\ + srl $16, 6, $16 \n\ + \n\ + ldq $31, 0($17) \n\ + ldq $31, 0($18) \n\ + ldq $31, 0($19) \n\ + ldq $31, 0($20) \n\ + ldq $31, 0($21) \n\ + \n\ + ldq $31, 64($17) \n\ + ldq $31, 64($18) \n\ + ldq $31, 64($19) \n\ + ldq $31, 64($20) \n\ + ldq $31, 64($21) \n\ + \n\ + ldq $31, 128($17) \n\ + ldq $31, 128($18) \n\ + ldq $31, 128($19) \n\ + ldq $31, 128($20) \n\ + ldq $31, 128($21) \n\ + \n\ + ldq $31, 192($17) \n\ + ldq $31, 192($18) \n\ + ldq $31, 192($19) \n\ + ldq $31, 192($20) \n\ + ldq $31, 192($21) \n\ + .align 4 \n\ +5: \n\ + ldq $0,0($17) \n\ + ldq $1,0($18) \n\ + ldq $2,0($19) \n\ + ldq $3,0($20) \n\ + \n\ + ldq $4,0($21) \n\ + ldq $5,8($17) \n\ + ldq $6,8($18) \n\ + ldq $7,8($19) \n\ + \n\ + ldq $22,8($20) \n\ + ldq $23,8($21) \n\ + ldq $24,16($17) \n\ + ldq $25,16($18) \n\ + \n\ + ldq $27,16($19) \n\ + xor $0,$1,$1 # 6 cycles from $1 load \n\ + ldq $28,16($20) \n\ + xor $2,$3,$3 # 6 cycles from $3 load \n\ + \n\ + ldq $0,16($21) \n\ + xor $1,$3,$3 \n\ + ldq $1,24($17) \n\ + xor $3,$4,$4 # 7 cycles from $4 load \n\ + \n\ + stq $4,0($17) \n\ + xor $5,$6,$6 # 7 cycles from $6 load \n\ + xor $7,$22,$22 # 7 cycles from $22 load \n\ + xor $6,$23,$23 # 7 cycles from $23 load \n\ + \n\ + ldq $2,24($18) \n\ + xor $22,$23,$23 \n\ + ldq $3,24($19) \n\ + xor $24,$25,$25 # 8 cycles from $25 load \n\ + \n\ + stq $23,8($17) \n\ + xor $25,$27,$27 # 8 cycles from $27 load \n\ + ldq $4,24($20) \n\ + xor $28,$0,$0 # 7 cycles from $0 load \n\ + \n\ + ldq $5,24($21) \n\ + xor $27,$0,$0 \n\ + ldq $6,32($17) \n\ + ldq $7,32($18) \n\ + \n\ + stq $0,16($17) \n\ + xor $1,$2,$2 # 6 cycles from $2 load \n\ + ldq $22,32($19) \n\ + xor $3,$4,$4 # 4 cycles from $4 load \n\ + \n\ + ldq $23,32($20) \n\ + xor $2,$4,$4 \n\ + ldq $24,32($21) \n\ + ldq $25,40($17) \n\ + \n\ + ldq $27,40($18) \n\ + ldq $28,40($19) \n\ + ldq $0,40($20) \n\ + xor $4,$5,$5 # 7 cycles from $5 load \n\ + \n\ + stq $5,24($17) \n\ + xor $6,$7,$7 # 7 cycles from $7 load \n\ + ldq $1,40($21) \n\ + ldq $2,48($17) \n\ + \n\ + ldq $3,48($18) \n\ + xor $7,$22,$22 # 7 cycles from $22 load \n\ + ldq $4,48($19) \n\ + xor $23,$24,$24 # 6 cycles from $24 load \n\ + \n\ + ldq $5,48($20) \n\ + xor $22,$24,$24 \n\ + ldq $6,48($21) \n\ + xor $25,$27,$27 # 7 cycles from $27 load \n\ + \n\ + stq $24,32($17) \n\ + xor $27,$28,$28 # 8 cycles from $28 load \n\ + ldq $7,56($17) \n\ + xor $0,$1,$1 # 6 cycles from $1 load \n\ + \n\ + ldq $22,56($18) \n\ + ldq $23,56($19) \n\ + ldq $24,56($20) \n\ + ldq $25,56($21) \n\ + \n\ + ldq $31,256($17) \n\ + xor $28,$1,$1 \n\ + ldq $31,256($18) \n\ + xor $2,$3,$3 # 9 cycles from $3 load \n\ + \n\ + ldq $31,256($19) \n\ + xor $3,$4,$4 # 9 cycles from $4 load \n\ + ldq $31,256($20) \n\ + xor $5,$6,$6 # 8 cycles from $6 load \n\ + \n\ + stq $1,40($17) \n\ + xor $4,$6,$6 \n\ + xor $7,$22,$22 # 7 cycles from $22 load \n\ + xor $23,$24,$24 # 6 cycles from $24 load \n\ + \n\ + stq $6,48($17) \n\ + xor $22,$24,$24 \n\ + ldq $31,256($21) \n\ + xor $24,$25,$25 # 8 cycles from $25 load \n\ + \n\ + stq $25,56($17) \n\ + subq $16,1,$16 \n\ + addq $21,64,$21 \n\ + addq $20,64,$20 \n\ + \n\ + addq $19,64,$19 \n\ + addq $18,64,$18 \n\ + addq $17,64,$17 \n\ + bgt $16,5b \n\ + \n\ + ret \n\ + .end xor_alpha_prefetch_5 \n\ "); static struct xor_block_template xor_block_alpha = { - name: "alpha", - do_2: xor_alpha_2, - do_3: xor_alpha_3, - do_4: xor_alpha_4, - do_5: xor_alpha_5, + .name = "alpha", + .do_2 = xor_alpha_2, + .do_3 = xor_alpha_3, + .do_4 = xor_alpha_4, + .do_5 = xor_alpha_5, }; static struct xor_block_template xor_block_alpha_prefetch = { - name: "alpha prefetch", - do_2: xor_alpha_prefetch_2, - do_3: xor_alpha_prefetch_3, - do_4: xor_alpha_prefetch_4, - do_5: xor_alpha_prefetch_5, + .name = "alpha prefetch", + .do_2 = xor_alpha_prefetch_2, + .do_3 = xor_alpha_prefetch_3, + .do_4 = xor_alpha_prefetch_4, + .do_5 = xor_alpha_prefetch_5, }; /* For grins, also test the generic routines. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-arm/pci.h linux-2.4.23-pre8/include/asm-arm/pci.h --- linux-2.4.22/include/asm-arm/pci.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-arm/pci.h 2003-10-22 22:48:24.000000000 +0000 @@ -53,6 +53,8 @@ /* We don't do dynamic PCI IRQ allocation */ } +#define pcibios_scan_all_fns() 0 + struct pci_dev; /* Allocate and map kernel buffer using consistent mode DMA for a device. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-i386/acpi.h linux-2.4.23-pre8/include/asm-i386/acpi.h --- linux-2.4.22/include/asm-i386/acpi.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-i386/acpi.h 2003-10-22 22:47:39.000000000 +0000 @@ -106,12 +106,6 @@ :"0"(n_hi), "1"(n_lo)) -#ifdef CONFIG_ACPI_HT_ONLY -extern int acpi_lapic; -#define acpi_ioapic 0 - -#else /* CONFIG_ACPI_HT_ONLY */ - #ifdef CONFIG_ACPI_BOOT extern int acpi_lapic; extern int acpi_ioapic; @@ -144,7 +138,6 @@ # define acpi_ioapic 0 #endif -#endif /* !CONFIG_ACPI_HT_ONLY */ #ifdef CONFIG_ACPI_SLEEP diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-i386/cpufeature.h linux-2.4.23-pre8/include/asm-i386/cpufeature.h --- linux-2.4.22/include/asm-i386/cpufeature.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-i386/cpufeature.h 2003-10-22 22:49:14.000000000 +0000 @@ -10,9 +10,9 @@ /* Sample usage: CPU_FEATURE_P(cpu.x86_capability, FPU) */ #define CPU_FEATURE_P(CAP, FEATURE) test_bit(CAP, X86_FEATURE_##FEATURE ##_BIT) -#define NCAPINTS 4 /* Currently we have 4 32-bit words worth of info */ +#define NCAPINTS 6 /* Currently we have 6 32-bit words worth of info */ -/* Intel-defined CPU features, CPUID level 0x00000001, word 0 */ +/* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */ #define X86_FEATURE_FPU (0*32+ 0) /* Onboard FPU */ #define X86_FEATURE_VME (0*32+ 1) /* Virtual Mode Extensions */ #define X86_FEATURE_DE (0*32+ 2) /* Debugging Extensions */ @@ -47,6 +47,7 @@ /* AMD-defined CPU features, CPUID level 0x80000001, word 1 */ /* Don't duplicate feature flags which are redundant with Intel! */ #define X86_FEATURE_SYSCALL (1*32+11) /* SYSCALL/SYSRET */ +#define X86_FEATURE_MP (1*32+19) /* MP Capable. */ #define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ #define X86_FEATURE_LM (1*32+29) /* Long Mode (x86-64) */ #define X86_FEATURE_3DNOWEXT (1*32+30) /* AMD 3DNow! extensions */ @@ -63,10 +64,19 @@ #define X86_FEATURE_K6_MTRR (3*32+ 1) /* AMD K6 nonstandard MTRRs */ #define X86_FEATURE_CYRIX_ARR (3*32+ 2) /* Cyrix ARRs (= MTRRs) */ #define X86_FEATURE_CENTAUR_MCR (3*32+ 3) /* Centaur MCRs (= MTRRs) */ +/* cpu types for specific tunings: */ +#define X86_FEATURE_K8 (3*32+ 4) /* Opteron, Athlon64 */ +#define X86_FEATURE_K7 (3*32+ 5) /* Athlon */ +#define X86_FEATURE_P3 (3*32+ 6) /* P3 */ +#define X86_FEATURE_P4 (3*32+ 7) /* P4 */ -/* Intel defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ +/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ #define X86_FEATURE_EST (4*32+ 7) /* Enhanced SpeedStep */ +/* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */ +#define X86_FEATURE_XSTORE (5*32+ 2) /* on-CPU RNG present (xstore insn) */ + + #define cpu_has(c, bit) test_bit(bit, (c)->x86_capability) #define boot_cpu_has(bit) test_bit(bit, boot_cpu_data.x86_capability) @@ -77,7 +87,9 @@ #define cpu_has_tsc boot_cpu_has(X86_FEATURE_TSC) #define cpu_has_pae boot_cpu_has(X86_FEATURE_PAE) #define cpu_has_pge boot_cpu_has(X86_FEATURE_PGE) +#define cpu_has_sse2 boot_cpu_has(X86_FEATURE_XMM2) #define cpu_has_apic boot_cpu_has(X86_FEATURE_APIC) +#define cpu_has_sep boot_cpu_has(X86_FEATURE_SEP) #define cpu_has_mtrr boot_cpu_has(X86_FEATURE_MTRR) #define cpu_has_mmx boot_cpu_has(X86_FEATURE_MMX) #define cpu_has_fxsr boot_cpu_has(X86_FEATURE_FXSR) @@ -87,6 +99,7 @@ #define cpu_has_k6_mtrr boot_cpu_has(X86_FEATURE_K6_MTRR) #define cpu_has_cyrix_arr boot_cpu_has(X86_FEATURE_CYRIX_ARR) #define cpu_has_centaur_mcr boot_cpu_has(X86_FEATURE_CENTAUR_MCR) +#define cpu_has_xstore boot_cpu_has(X86_FEATURE_XSTORE) #endif /* __ASM_I386_CPUFEATURE_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-i386/edd.h linux-2.4.23-pre8/include/asm-i386/edd.h --- linux-2.4.22/include/asm-i386/edd.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-i386/edd.h 2003-10-22 22:49:09.000000000 +0000 @@ -0,0 +1,172 @@ +/* + * linux/include/asm-i386/edd.h + * Copyright (C) 2002 Dell Computer Corporation + * by Matt Domsch + * + * structures and definitions for the int 13h, ax={41,48}h + * BIOS Enhanced Disk Drive Services + * This is based on the T13 group document D1572 Revision 0 (August 14 2002) + * available at http://www.t13.org/docs2002/d1572r0.pdf. It is + * very similar to D1484 Revision 3 http://www.t13.org/docs2002/d1484r3.pdf + * + * In a nutshell, arch/i386/boot/setup.S populates a scratch table + * in the empty_zero_block that contains a list of BIOS-enumerated + * boot devices. + * In arch/i386/kernel/setup.c, this information is + * transferred into the edd structure, and in arch/i386/kernel/edd.c, that + * information is used to identify BIOS boot disk. The code in setup.S + * is very sensitive to the size of these structures. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License v2.0 as published by + * the Free Software Foundation + * + * 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. + * + */ +#ifndef _ASM_I386_EDD_H +#define _ASM_I386_EDD_H + +#define EDDNR 0x1e9 /* addr of number of edd_info structs at EDDBUF + in empty_zero_block - treat this as 1 byte */ +#define EDDBUF 0x600 /* addr of edd_info structs in empty_zero_block */ +#define EDDMAXNR 6 /* number of edd_info structs starting at EDDBUF */ +#define EDDEXTSIZE 4 /* change these if you muck with the structures */ +#define EDDPARMSIZE 74 +#define CHECKEXTENSIONSPRESENT 0x41 +#define GETDEVICEPARAMETERS 0x48 +#define EDDMAGIC1 0x55AA +#define EDDMAGIC2 0xAA55 + +#ifndef __ASSEMBLY__ + +#define EDD_EXT_FIXED_DISK_ACCESS (1 << 0) +#define EDD_EXT_DEVICE_LOCKING_AND_EJECTING (1 << 1) +#define EDD_EXT_ENHANCED_DISK_DRIVE_SUPPORT (1 << 2) +#define EDD_EXT_64BIT_EXTENSIONS (1 << 3) + +#define EDD_INFO_DMA_BOUNDRY_ERROR_TRANSPARENT (1 << 0) +#define EDD_INFO_GEOMETRY_VALID (1 << 1) +#define EDD_INFO_REMOVABLE (1 << 2) +#define EDD_INFO_WRITE_VERIFY (1 << 3) +#define EDD_INFO_MEDIA_CHANGE_NOTIFICATION (1 << 4) +#define EDD_INFO_LOCKABLE (1 << 5) +#define EDD_INFO_NO_MEDIA_PRESENT (1 << 6) +#define EDD_INFO_USE_INT13_FN50 (1 << 7) + +struct edd_device_params { + u16 length; + u16 info_flags; + u32 num_default_cylinders; + u32 num_default_heads; + u32 sectors_per_track; + u64 number_of_sectors; + u16 bytes_per_sector; + u32 dpte_ptr; /* 0xFFFFFFFF for our purposes */ + u16 key; /* = 0xBEDD */ + u8 device_path_info_length; /* = 44 */ + u8 reserved2; + u16 reserved3; + u8 host_bus_type[4]; + u8 interface_type[8]; + union { + struct { + u16 base_address; + u16 reserved1; + u32 reserved2; + } __attribute__ ((packed)) isa; + struct { + u8 bus; + u8 slot; + u8 function; + u8 channel; + u32 reserved; + } __attribute__ ((packed)) pci; + /* pcix is same as pci */ + struct { + u64 reserved; + } __attribute__ ((packed)) ibnd; + struct { + u64 reserved; + } __attribute__ ((packed)) xprs; + struct { + u64 reserved; + } __attribute__ ((packed)) htpt; + struct { + u64 reserved; + } __attribute__ ((packed)) unknown; + } interface_path; + union { + struct { + u8 device; + u8 reserved1; + u16 reserved2; + u32 reserved3; + u64 reserved4; + } __attribute__ ((packed)) ata; + struct { + u8 device; + u8 lun; + u8 reserved1; + u8 reserved2; + u32 reserved3; + u64 reserved4; + } __attribute__ ((packed)) atapi; + struct { + u16 id; + u64 lun; + u16 reserved1; + u32 reserved2; + } __attribute__ ((packed)) scsi; + struct { + u64 serial_number; + u64 reserved; + } __attribute__ ((packed)) usb; + struct { + u64 eui; + u64 reserved; + } __attribute__ ((packed)) i1394; + struct { + u64 wwid; + u64 lun; + } __attribute__ ((packed)) fibre; + struct { + u64 identity_tag; + u64 reserved; + } __attribute__ ((packed)) i2o; + struct { + u32 array_number; + u32 reserved1; + u64 reserved2; + } __attribute((packed)) raid; + struct { + u8 device; + u8 reserved1; + u16 reserved2; + u32 reserved3; + u64 reserved4; + } __attribute__ ((packed)) sata; + struct { + u64 reserved1; + u64 reserved2; + } __attribute__ ((packed)) unknown; + } device_path; + u8 reserved4; + u8 checksum; +} __attribute__ ((packed)); + +struct edd_info { + u8 device; + u8 version; + u16 interface_support; + struct edd_device_params params; +} __attribute__ ((packed)); + +extern struct edd_info edd[EDDMAXNR]; +extern unsigned char eddnr; +#endif /*!__ASSEMBLY__ */ + +#endif /* _ASM_I386_EDD_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-i386/hardirq.h linux-2.4.23-pre8/include/asm-i386/hardirq.h --- linux-2.4.22/include/asm-i386/hardirq.h 2001-11-22 19:46:19.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-i386/hardirq.h 2003-10-22 22:49:14.000000000 +0000 @@ -67,6 +67,8 @@ { ++local_irq_count(cpu); + smp_mb(); + while (test_bit(0,&global_irq_lock)) { cpu_relax(); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-i386/msr.h linux-2.4.23-pre8/include/asm-i386/msr.h --- linux-2.4.22/include/asm-i386/msr.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-i386/msr.h 2003-10-22 22:47:30.000000000 +0000 @@ -113,6 +113,7 @@ /* VIA Cyrix defined MSRs*/ #define MSR_VIA_FCR 0x1107 #define MSR_VIA_LONGHAUL 0x110a +#define MSR_VIA_RNG 0x110b #define MSR_VIA_BCR2 0x1147 /* Transmeta defined MSRs */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-i386/pci.h linux-2.4.23-pre8/include/asm-i386/pci.h --- linux-2.4.22/include/asm-i386/pci.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-i386/pci.h 2003-10-22 22:48:39.000000000 +0000 @@ -14,6 +14,7 @@ #else #define pcibios_assign_all_busses() 0 #endif +#define pcibios_scan_all_fns() 0 extern unsigned long pci_mem_start; #define PCIBIOS_MIN_IO 0x1000 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/a.out.h linux-2.4.23-pre8/include/asm-ia64/a.out.h --- linux-2.4.22/include/asm-ia64/a.out.h 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/a.out.h 2003-10-22 22:49:19.000000000 +0000 @@ -30,9 +30,6 @@ #define N_TXTOFF(x) 0 #ifdef __KERNEL__ -# include -# define STACK_TOP (0x6000000000000000UL + (1UL << (4*PAGE_SHIFT - 12)) - PAGE_SIZE) -# define IA64_RBS_BOT (STACK_TOP - 0x80000000L + PAGE_SIZE) /* bottom of reg. backing store */ +#include #endif - #endif /* _ASM_IA64_A_OUT_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/acpi.h linux-2.4.23-pre8/include/asm-ia64/acpi.h --- linux-2.4.22/include/asm-ia64/acpi.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/acpi.h 2003-10-22 22:49:40.000000000 +0000 @@ -97,17 +97,18 @@ } while (0) const char *acpi_get_sysname (void); -int acpi_boot_init (char *cdline); int acpi_request_vector (u32 int_type); int acpi_get_prt (struct pci_vector_struct **vectors, int *count); int acpi_get_interrupt_model (int *type); int acpi_irq_to_vector (u32 irq); -#ifdef CONFIG_DISCONTIGMEM -#define NODE_ARRAY_INDEX(x) ((x) / 8) /* 8 bits/char */ -#define NODE_ARRAY_OFFSET(x) ((x) % 8) /* 8 bits/char */ -#define MAX_PXM_DOMAINS (256) -#endif /* CONFIG_DISCONTIGMEM */ +#ifdef CONFIG_ACPI_NUMA +#include +/* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ +#define MAX_PXM_DOMAINS (256) +extern int __initdata pxm_to_nid_map[MAX_PXM_DOMAINS]; +extern int __initdata nid_to_pxm_map[NR_NODES]; +#endif #endif /*__KERNEL__*/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/bitops.h linux-2.4.23-pre8/include/asm-ia64/bitops.h --- linux-2.4.22/include/asm-ia64/bitops.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/bitops.h 2003-10-22 22:49:35.000000000 +0000 @@ -282,6 +282,21 @@ return result; } +/** + * __ffs - find first bit in word. + * @x: The word to search + * + * Undefined if no bit exists, so code should check against 0 first. + */ +static __inline__ unsigned long +__ffs (unsigned long x) +{ + unsigned long result; + + __asm__ ("popcnt %0=%1" : "=r" (result) : "r" ((x - 1) & ~x)); + return result; +} + #ifdef __KERNEL__ /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/elf.h linux-2.4.23-pre8/include/asm-ia64/elf.h --- linux-2.4.22/include/asm-ia64/elf.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/elf.h 2003-10-22 22:49:11.000000000 +0000 @@ -61,7 +61,7 @@ * b0-b7 * ip cfm psr * ar.rsc ar.bsp ar.bspstore ar.rnat - * ar.ccv ar.unat ar.fpsr ar.pfs ar.lc ar.ec + * ar.ccv ar.unat ar.fpsr ar.pfs ar.lc ar.ec ar.csd ar.ssd */ #define ELF_NGREG 128 /* we really need just 72 but let's leave some headroom... */ #define ELF_NFPREG 128 /* f0 and f1 could be omitted, but so what... */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/hw_irq.h linux-2.4.23-pre8/include/asm-ia64/hw_irq.h --- linux-2.4.22/include/asm-ia64/hw_irq.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/hw_irq.h 2003-10-22 22:48:54.000000000 +0000 @@ -37,8 +37,10 @@ /* * Vectors 0x10-0x1f are used for low priority interrupts, e.g. CMCI. */ -#define IA64_PCE_VECTOR 0x1e /* platform corrected error interrupt vector */ -#define IA64_CMC_VECTOR 0x1f /* correctable machine-check interrupt vector */ +#define IA64_CPEP_VECTOR 0x1c /* corrected platform error polling vector */ +#define IA64_CMCP_VECTOR 0x1d /* corrected machine-check polling vector */ +#define IA64_CPE_VECTOR 0x1e /* corrected platform error interrupt vector */ +#define IA64_CMC_VECTOR 0x1f /* corrected machine-check interrupt vector */ /* * Vectors 0x20-0x2f are reserved for legacy ISA IRQs. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/mca.h linux-2.4.23-pre8/include/asm-ia64/mca.h --- linux-2.4.22/include/asm-ia64/mca.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/mca.h 2003-10-22 22:48:10.000000000 +0000 @@ -89,6 +89,8 @@ u64 imsto_sal_check_ra; /* Return address in SAL_CHECK while going * back to SAL from OS after MCA handling. */ + u64 pal_min_state; /* from PAL in r17 */ + u64 proc_state_param; /* from PAL in r18. See SDV 2:268 11.3.2.1 */ } ia64_mca_sal_to_os_state_t; enum { @@ -132,7 +134,9 @@ extern void ia64_mca_rendez_int_handler(int,void *,struct pt_regs *); extern void ia64_mca_wakeup_int_handler(int,void *,struct pt_regs *); extern void ia64_mca_cmc_int_handler(int,void *,struct pt_regs *); +extern void ia64_mca_cmc_int_caller(int,void *,struct pt_regs *); extern void ia64_mca_cpe_int_handler(int,void *,struct pt_regs *); +extern void ia64_mca_cpe_int_caller(int,void *,struct pt_regs *); extern int ia64_log_print(int,prfunc_t); extern void ia64_mca_cmc_vector_setup(void); extern int ia64_mca_check_errors(void); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/mmzone.h linux-2.4.23-pre8/include/asm-ia64/mmzone.h --- linux-2.4.22/include/asm-ia64/mmzone.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/mmzone.h 2003-10-22 22:48:31.000000000 +0000 @@ -0,0 +1,63 @@ +/* + * 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. + * + * Copyright (c) 2000,2003 Silicon Graphics, Inc. All rights reserved. + * Copyright (c) 2002 NEC Corp. + * Copyright (c) 2002 Erich Focht + * Copyright (c) 2002 Kimio Suganuma + */ +#ifndef _ASM_IA64_MMZONE_H +#define _ASM_IA64_MMZONE_H + +#include +#include + + +#ifdef CONFIG_NUMA + +#ifdef CONFIG_IA64_DIG + +/* + * Platform definitions for DIG platform with contiguous memory. + */ +#define MAX_PHYSNODE_ID 8 /* Maximum node number +1 */ +#define NR_NODES 8 /* Maximum number of nodes in SSI */ +#define NR_MEMBLKS (NR_NODES * 32) + + + + +#elif CONFIG_IA64_SGI_SN2 + +/* + * Platform definitions for DIG platform with contiguous memory. + */ +#define MAX_PHYSNODE_ID 2048 /* Maximum node number +1 */ +#define NR_NODES 256 /* Maximum number of compute nodes in SSI */ +#define NR_MEMBLKS (NR_NODES) + +#elif CONFIG_IA64_GENERIC + + +/* + * Platform definitions for GENERIC platform with contiguous or discontiguous memory. + */ +#define MAX_PHYSNODE_ID 2048 /* Maximum node number +1 */ +#define NR_NODES 256 /* Maximum number of nodes in SSI */ +#define NR_MEMBLKS (NR_NODES) + + +#else +#error unknown platform +#endif + +extern void build_cpu_to_node_map(void); + +#else /* CONFIG_NUMA */ + +#define NR_NODES 1 + +#endif /* CONFIG_NUMA */ +#endif /* _ASM_IA64_MMZONE_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/nodedata.h linux-2.4.23-pre8/include/asm-ia64/nodedata.h --- linux-2.4.22/include/asm-ia64/nodedata.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/nodedata.h 2003-10-22 22:48:39.000000000 +0000 @@ -0,0 +1,66 @@ +/* + * 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. + * + * Copyright (c) 2000 Silicon Graphics, Inc. All rights reserved. + * Copyright (c) 2002 NEC Corp. + * Copyright (c) 2002 Erich Focht + * Copyright (c) 2002 Kimio Suganuma + */ + + +#ifndef _ASM_IA64_NODEDATA_H +#define _ASM_IA64_NODEDATA_H + + +#include + +/* + * Node Data. One of these structures is located on each node of a NUMA system. + */ + +struct pglist_data; +struct ia64_node_data { + short node; + short active_cpu_count; + /* + * The fields are read-only (after boot). They contain pointers to various structures + * located on other nodes. Ths data is replicated on each node in order to reduce + * off-node references. + */ + struct pglist_data *pg_data_ptrs[NR_NODES]; + struct ia64_node_data *node_data_ptrs[NR_NODES]; +}; + + +/* + * Return a pointer to the node_data structure for the executing cpu. + */ +#define local_node_data (local_cpu_data->node_data) + + +/* + * Return a pointer to the node_data structure for the specified node. + */ +#define node_data(node) (local_node_data->node_data_ptrs[node]) + + +/* + * Given a node id, return a pointer to the pg_data_t for the node. + * The following 2 macros are similar. + * + * NODE_DATA - should be used in all code not related to system + * initialization. It uses pernode data structures to minimize + * offnode memory references. However, these structure are not + * present during boot. This macro can be used once cpu_init + * completes. + * + * NOTE: The names of these macros are misleading but are difficult to change + * since they are used in generic linux & on other architecures. + */ +#define NODE_DATA(nid) (local_node_data->pg_data_ptrs[nid]) + +extern struct pglist_data * __init boot_get_pg_data_ptr(long); + +#endif /* _ASM_IA64_NODEDATA_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/numa.h linux-2.4.23-pre8/include/asm-ia64/numa.h --- linux-2.4.22/include/asm-ia64/numa.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/numa.h 2003-10-22 22:49:16.000000000 +0000 @@ -0,0 +1,85 @@ +/* + * 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 file contains NUMA specific prototypes and definitions. + * + * 2002/08/05 Erich Focht + * + */ +#ifndef _ASM_IA64_NUMA_H +#define _ASM_IA64_NUMA_H + +#ifdef CONFIG_NUMA + +#ifdef CONFIG_DISCONTIGMEM +# include +#else +# define NR_NODES (8) +# define NR_MEMBLKS (NR_NODES * 8) +#endif + +#include +#include +#include + +#define NODEMASK_WORDCOUNT ((NR_NODES+(BITS_PER_LONG-1))/BITS_PER_LONG) + +#define NODE_MASK_NONE { [0 ... ((NR_NODES+BITS_PER_LONG-1)/BITS_PER_LONG)-1] = 0 } + +typedef unsigned long nodemask_t[NODEMASK_WORDCOUNT]; + +extern volatile char cpu_to_node_map[NR_CPUS] __cacheline_aligned; +extern volatile unsigned long node_to_cpu_mask[NR_NODES] __cacheline_aligned; + +/* Stuff below this line could be architecture independent */ + +extern int num_memblks; /* total number of memory chunks */ + +/* + * List of node memory chunks. Filled when parsing SRAT table to + * obtain information about memory nodes. +*/ + +struct node_memblk_s { + unsigned long start_paddr; + unsigned long size; + int nid; /* which logical node contains this chunk? */ + int bank; /* which mem bank on this node */ +}; + +struct node_cpuid_s { + u16 phys_id; /* id << 8 | eid */ + int nid; /* logical node containing this CPU */ +}; + +extern struct node_memblk_s node_memblk[NR_MEMBLKS]; +extern struct node_cpuid_s node_cpuid[NR_CPUS]; + +/* + * ACPI 2.0 SLIT (System Locality Information Table) + * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf + * + * This is a matrix with "distances" between nodes, they should be + * proportional to the memory access latency ratios. + */ + +extern u8 numa_slit[NR_NODES * NR_NODES]; +#define node_distance(from,to) (numa_slit[from * numnodes + to]) + +extern int paddr_to_nid(unsigned long paddr); +extern unsigned long memblk_endpaddr(unsigned long paddr); + +#define local_nodeid (cpu_to_node_map[smp_processor_id()]) + +#else /* !CONFIG_NUMA */ + +#define node_distance(from,to) 10 +#define paddr_to_nid(x) 0 +#define memblk_endpaddr(x) ~0UL +#define local_nodeid 0 + +#endif /* CONFIG_NUMA */ + +#endif /* _ASM_IA64_NUMA_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/numnodes.h linux-2.4.23-pre8/include/asm-ia64/numnodes.h --- linux-2.4.22/include/asm-ia64/numnodes.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/numnodes.h 2003-10-22 22:49:02.000000000 +0000 @@ -0,0 +1,7 @@ +#ifndef _ASM_MAX_NUMNODES_H +#define _ASM_MAX_NUMNODES_H + +#include +#define MAX_NUMNODES NR_NODES + +#endif /* _ASM_MAX_NUMNODES_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/page.h linux-2.4.23-pre8/include/asm-ia64/page.h --- linux-2.4.22/include/asm-ia64/page.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/page.h 2003-10-22 22:47:46.000000000 +0000 @@ -30,6 +30,8 @@ #define PAGE_MASK (~(PAGE_SIZE - 1)) #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) +#define RGN_MAP_LIMIT ((1UL << (4*PAGE_SHIFT - 12)) - PAGE_SIZE) /* per region addr limit */ + #ifdef __ASSEMBLY__ # define __pa(x) ((x) - PAGE_OFFSET) # define __va(x) ((x) + PAGE_OFFSET) @@ -52,19 +54,8 @@ */ #define MAP_NR_DENSE(addr) (((unsigned long) (addr) - PAGE_OFFSET) >> PAGE_SHIFT) -#ifdef CONFIG_IA64_GENERIC -# include -# define virt_to_page(kaddr) (mem_map + platform_map_nr(kaddr)) -# define page_to_phys(page) ((page - mem_map) << PAGE_SHIFT) -#elif defined (CONFIG_IA64_SGI_SN1) -# ifndef CONFIG_DISCONTIGMEM -# define virt_to_page(kaddr) (mem_map + MAP_NR_DENSE(kaddr)) -# define page_to_phys(page) XXX fix me -# endif -#else -# define virt_to_page(kaddr) (mem_map + MAP_NR_DENSE(kaddr)) -# define page_to_phys(page) ((page - mem_map) << PAGE_SHIFT) -#endif +#define virt_to_page(kaddr) (mem_map + MAP_NR_DENSE(kaddr)) +#define page_to_phys(page) ((page - mem_map) << PAGE_SHIFT) struct page; extern int ia64_page_valid (struct page *); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/pci.h linux-2.4.23-pre8/include/asm-ia64/pci.h --- linux-2.4.22/include/asm-ia64/pci.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/pci.h 2003-10-22 22:49:37.000000000 +0000 @@ -15,6 +15,7 @@ * loader. */ #define pcibios_assign_all_busses() 0 +#define pcibios_scan_all_fns() 0 #define PCIBIOS_MIN_IO 0x1000 #define PCIBIOS_MIN_MEM 0x10000000 @@ -82,8 +83,8 @@ #define pci_dac_dma_to_offset(dev,dma_addr) ((dma_addr) & ~PAGE_MASK) #define pci_dac_dma_sync_single(dev,dma_addr,len,dir) do { /* nothing */ } while (0) -/* Return the index of the PCI controller for device PDEV. */ -#define pci_controller_num(PDEV) (0) +/* Return the PCI domain number */ +#define pci_controller_num(pdev) (PCI_SEGMENT(pdev)) #define sg_dma_address(sg) ((sg)->dma_address) #define sg_dma_len(sg) ((sg)->dma_length) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/pgtable.h linux-2.4.23-pre8/include/asm-ia64/pgtable.h --- linux-2.4.22/include/asm-ia64/pgtable.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/pgtable.h 2003-10-22 22:48:22.000000000 +0000 @@ -163,7 +163,6 @@ return (addr & (local_cpu_data->unimpl_pa_mask)) == 0; } -#ifndef CONFIG_DISCONTIGMEM /* * kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel * memory. For the return value to be meaningful, ADDR must be >= @@ -179,7 +178,6 @@ */ #define kern_addr_valid(addr) (1) -#endif /* * Now come the defines and routines to manage and access the three-level @@ -193,7 +191,6 @@ #define set_pte(ptep, pteval) (*(ptep) = (pteval)) #define RGN_SIZE (1UL << 61) -#define RGN_MAP_LIMIT ((1UL << (4*PAGE_SHIFT - 12)) - PAGE_SIZE) /* per region addr limit */ #define RGN_KERNEL 7 #define VMALLOC_START (0xa000000000000000 + 3*PAGE_SIZE) @@ -227,10 +224,8 @@ #define pte_none(pte) (!pte_val(pte)) #define pte_present(pte) (pte_val(pte) & (_PAGE_P | _PAGE_PROTNONE)) #define pte_clear(pte) (pte_val(*(pte)) = 0UL) -#ifndef CONFIG_DISCONTIGMEM /* pte_page() returns the "struct page *" corresponding to the PTE: */ #define pte_page(pte) (mem_map + (unsigned long) ((pte_val(pte) & _PFN_MASK) >> PAGE_SHIFT)) -#endif #define pmd_none(pmd) (!pmd_val(pmd)) #define pmd_bad(pmd) (!ia64_phys_addr_valid(pmd_val(pmd))) @@ -430,7 +425,8 @@ * for zero-mapped memory areas etc.. */ extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; -#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) +extern struct page *zero_page_memmap_ptr; +#define ZERO_PAGE(vaddr) (zero_page_memmap_ptr) /* We provide our own get_unmapped_area to cope with VA holes for userland */ #define HAVE_ARCH_UNMAPPED_AREA diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/processor.h linux-2.4.23-pre8/include/asm-ia64/processor.h --- linux-2.4.22/include/asm-ia64/processor.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/processor.h 2003-10-22 22:48:29.000000000 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include #define IA64_NUM_DBG_REGS 8 /* @@ -87,6 +88,9 @@ #include #include #include +#ifdef CONFIG_NUMA +#include +#endif /* like above but expressed as bitfields for more efficient access: */ struct ia64_psr { @@ -187,8 +191,8 @@ } ipi; #endif #ifdef CONFIG_NUMA - void *node_directory; - int numa_node_id; + struct ia64_node_data *node_data; + int nodeid; struct cpuinfo_ia64 *cpu_data[NR_CPUS]; #endif /* Platform specific word. MUST BE LAST IN STRUCT */ @@ -213,9 +217,9 @@ */ #ifdef CONFIG_NUMA # define cpu_data(cpu) local_cpu_data->cpu_data[cpu] -# define numa_node_id() (local_cpu_data->numa_node_id) +# define numa_node_id() (local_cpu_data->nodeid) #else - extern struct cpuinfo_ia64 _cpu_data[NR_CPUS]; + extern struct cpuinfo_ia64 _cpu_data[NR_CPUS]; # define cpu_data(cpu) (&_cpu_data[cpu]) #endif @@ -257,6 +261,7 @@ unsigned long flags; /* various flags */ __u64 map_base; /* base address for get_unmapped_area() */ __u64 task_size; /* limit for task size */ + __u64 rbs_bot; /* the base address for the RBS */ struct siginfo *siginfo; /* current siginfo struct for ptrace() */ #ifdef CONFIG_IA32_SUPPORT @@ -265,11 +270,9 @@ __u64 fcr; /* IA32 floating pt control reg */ __u64 fir; /* IA32 fp except. instr. reg */ __u64 fdr; /* IA32 fp except. data reg */ - __u64 csd; /* IA32 code selector descriptor */ - __u64 ssd; /* IA32 stack selector descriptor */ __u64 old_k1; /* old value of ar.k1 */ __u64 old_iob; /* old IOBase value */ -# define INIT_THREAD_IA32 0, 0, 0x17800000037fULL, 0, 0, 0, 0, 0, 0, +# define INIT_THREAD_IA32 0, 0, 0x17800000037fULL, 0, 0, 0, 0, #else # define INIT_THREAD_IA32 #endif /* CONFIG_IA32_SUPPORT */ @@ -296,6 +299,7 @@ 0, /* flags */ \ DEFAULT_MAP_BASE, /* map_base */ \ DEFAULT_TASK_SIZE, /* task_size */ \ + DEFAULT_USER_STACK_SIZE, /* rbs_bot */ \ 0, /* siginfo */ \ INIT_THREAD_IA32 \ INIT_THREAD_PM \ @@ -312,7 +316,7 @@ regs->cr_iip = new_ip; \ regs->ar_rsc = 0xf; /* eager mode, privilege level 3 */ \ regs->ar_rnat = 0; \ - regs->ar_bspstore = IA64_RBS_BOT; \ + regs->ar_bspstore = current->thread.rbs_bot; \ regs->ar_fpsr = FPSR_DEFAULT; \ regs->loadrs = 0; \ regs->r8 = current->mm->dumpable; /* set "don't zap registers" flag */ \ @@ -337,11 +341,15 @@ regs->r24 = 0; regs->r25 = 0; regs->r26 = 0; regs->r27 = 0; \ regs->r28 = 0; regs->r29 = 0; regs->r30 = 0; regs->r31 = 0; \ regs->ar_ccv = 0; \ + regs->ar_csd = 0; \ + regs->ar_ssd = 0; \ regs->b0 = 0; regs->b7 = 0; \ regs->f6.u.bits[0] = 0; regs->f6.u.bits[1] = 0; \ regs->f7.u.bits[0] = 0; regs->f7.u.bits[1] = 0; \ regs->f8.u.bits[0] = 0; regs->f8.u.bits[1] = 0; \ regs->f9.u.bits[0] = 0; regs->f9.u.bits[1] = 0; \ + regs->f10.u.bits[0] = 0; regs->f10.u.bits[1] = 0; \ + regs->f11.u.bits[0] = 0; regs->f11.u.bits[1] = 0; \ } \ } while (0) @@ -655,8 +663,17 @@ asm volatile ("mov cr.lrr0=%0;; srlz.d" :: "r"(val) : "memory"); } -#define cpu_relax() do { } while (0) +#ifdef GAS_HAS_HINT_INSN +static inline void +ia64_hint_pause (void) +{ + asm volatile ("hint @pause" ::: "memory"); +} +#define cpu_relax() ia64_hint_pause() +#else +#define cpu_relax() barrier() +#endif static inline void ia64_set_lrr1 (unsigned long val) @@ -759,18 +776,12 @@ #define init_task (init_task_union.task) #define init_stack (init_task_union.stack) -/* - * Set the correctable machine check vector register - */ static inline void ia64_set_cmcv (__u64 val) { asm volatile ("mov cr.cmcv=%0" :: "r"(val) : "memory"); } -/* - * Read the correctable machine check vector register - */ static inline __u64 ia64_get_cmcv (void) { @@ -950,6 +961,18 @@ return result; } +/* + * Take a mapped kernel address and return the equivalent address + * in the region 7 identity mapped virtual area. + */ +static inline void * +ia64_imva (void *addr) +{ + void *result; + asm ("tpa %0=%1" : "=r"(result) : "r"(addr)); + return __va(result); +} + #define ARCH_HAS_PREFETCH #define ARCH_HAS_PREFETCHW #define ARCH_HAS_SPINLOCK_PREFETCH diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/ptrace.h linux-2.4.23-pre8/include/asm-ia64/ptrace.h --- linux-2.4.22/include/asm-ia64/ptrace.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/ptrace.h 2003-10-22 22:49:09.000000000 +0000 @@ -2,6 +2,7 @@ #define _ASM_IA64_PTRACE_H /* + * Copyright (C) 1998-2001 Suresh Siddha * Copyright (C) 1998-2001 Hewlett-Packard Co * Copyright (C) 1998-2001 David Mosberger-Tang * Copyright (C) 1998, 1999 Stephane Eranian @@ -90,7 +91,20 @@ * */ struct pt_regs { - /* The following registers are saved by SAVE_MIN: */ + /* In break_fault, only registers from cr_ipsr to r15 are saved. + * In any other interruptions, the registers cr_ipsr~r15, r8~r11, and r14~r3 are saved by + * SAVE_MIN and all other registers are saved by SAVE_REST. + */ + unsigned long b6; /* scratch */ + unsigned long b7; /* scratch */ + + unsigned long ar_csd; /* used by cmp8xchg16 (scratch) */ + unsigned long ar_ssd; /* reserved for future use (scratch) */ + + unsigned long r8; /* scratch (return value register 0) */ + unsigned long r9; /* scratch (return value register 1) */ + unsigned long r10; /* scratch (return value register 2) */ + unsigned long r11; /* scratch (return value register 3) */ unsigned long cr_ipsr; /* interrupted task's psr */ unsigned long cr_iip; /* interrupted task's instruction pointer */ @@ -104,23 +118,19 @@ unsigned long ar_bspstore; /* RSE bspstore */ unsigned long pr; /* 64 predicate registers (1 bit each) */ - unsigned long b6; /* scratch */ + unsigned long b0; /* return pointer (bp) */ unsigned long loadrs; /* size of dirty partition << 16 */ unsigned long r1; /* the gp pointer */ - unsigned long r2; /* scratch */ - unsigned long r3; /* scratch */ unsigned long r12; /* interrupted task's memory stack pointer */ unsigned long r13; /* thread pointer */ - unsigned long r14; /* scratch */ - unsigned long r15; /* scratch */ - unsigned long r8; /* scratch (return value register 0) */ - unsigned long r9; /* scratch (return value register 1) */ - unsigned long r10; /* scratch (return value register 2) */ - unsigned long r11; /* scratch (return value register 3) */ + unsigned long ar_fpsr; /* floating point status (preserved) */ + unsigned long r15; /* scratch */ - /* The following registers are saved by SAVE_REST: */ + unsigned long r14; /* scratch */ + unsigned long r2; /* scratch */ + unsigned long r3; /* scratch */ unsigned long r16; /* scratch */ unsigned long r17; /* scratch */ @@ -140,10 +150,7 @@ unsigned long r31; /* scratch */ unsigned long ar_ccv; /* compare/exchange value (scratch) */ - unsigned long ar_fpsr; /* floating point status (preserved) */ - unsigned long b0; /* return pointer (bp) */ - unsigned long b7; /* scratch */ /* * Floating point registers that the kernel considers * scratch: @@ -152,6 +159,8 @@ struct ia64_fpreg f7; /* scratch */ struct ia64_fpreg f8; /* scratch */ struct ia64_fpreg f9; /* scratch */ + struct ia64_fpreg f10; /* scratch */ + struct ia64_fpreg f11; /* scratch */ }; /* @@ -168,8 +177,6 @@ struct ia64_fpreg f4; /* preserved */ struct ia64_fpreg f5; /* preserved */ - struct ia64_fpreg f10; /* scratch, but untouched by kernel */ - struct ia64_fpreg f11; /* scratch, but untouched by kernel */ struct ia64_fpreg f12; /* scratch, but untouched by kernel */ struct ia64_fpreg f13; /* scratch, but untouched by kernel */ struct ia64_fpreg f14; /* scratch, but untouched by kernel */ @@ -241,11 +248,10 @@ extern void ia64_increment_ip (struct pt_regs *pt); extern void ia64_decrement_ip (struct pt_regs *pt); -static inline void -force_successful_syscall_return (void) -{ - ia64_task_regs(current)->r8 = 0; -} +#define force_successful_syscall_return() \ + do { \ + ia64_task_regs(current)->r8 = 0; \ + } while (0) #endif /* !__KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/ptrace_offsets.h linux-2.4.23-pre8/include/asm-ia64/ptrace_offsets.h --- linux-2.4.22/include/asm-ia64/ptrace_offsets.h 2001-07-31 17:30:09.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/ptrace_offsets.h 2003-10-22 22:48:35.000000000 +0000 @@ -11,9 +11,64 @@ * * struct uarea { * struct ia64_fpreg fph[96]; // f32-f127 - * struct switch_stack sw; - * struct pt_regs pt; - * unsigned long rsvd1[712]; + * unsigned long nat_bits; + * unsigned long empty1; + * struct ia64_fpreg f2; // f2-f5 + * . + * . + * struct ia64_fpreg f5; + * struct ia64_fpreg f10; // f10-f31 + * . + * . + * struct ia64_fpreg f31; + * unsigned long r4; // r4-r7 + * . + * . + * unsigned long r7; + * unsigned long b1; // b1-b5 + * . + * . + * unsigned long b5; + * unsigned long ar_ec; + * unsigned long ar_lc; + * unsigned long empty2[5]; + * unsigned long cr_ipsr; + * unsigned long cr_iip; + * unsigned long cfm; + * unsigned long ar_unat; + * unsigned long ar_pfs; + * unsigned long ar_rsc; + * unsigned long ar_rnat; + * unsigned long ar_bspstore; + * unsigned long pr; + * unsigned long b6; + * unsigned long ar_bsp; + * unsigned long r1; + * unsigned long r2; + * unsigned long r3; + * unsigned long r12; + * unsigned long r13; + * unsigned long r14; + * unsigned long r15; + * unsigned long r8; + * unsigned long r9; + * unsigned long r10; + * unsigned long r11; + * unsigned long r16; + * . + * . + * unsigned long r31; + * unsigned long ar_ccv; + * unsigned long ar_fpsr; + * unsigned long b0; + * unsigned long b7; + * unsigned long f6; + * unsigned long f7; + * unsigned long f8; + * unsigned long f9; + * unsigned long ar_csd; + * unsigned long ar_ssd; + * unsigned long rsvd1[710]; * unsigned long dbr[8]; * unsigned long rsvd2[504]; * unsigned long ibr[8]; @@ -119,7 +174,7 @@ #define PT_F125 0x05d0 #define PT_F126 0x05e0 #define PT_F127 0x05f0 -/* switch stack: */ + #define PT_NAT_BITS 0x0600 #define PT_F2 0x0610 @@ -162,7 +217,6 @@ #define PT_AR_EC 0x0800 #define PT_AR_LC 0x0808 -/* pt_regs */ #define PT_CR_IPSR 0x0830 #define PT_CR_IIP 0x0838 #define PT_CFM 0x0840 @@ -209,6 +263,8 @@ #define PT_F7 0x0990 #define PT_F8 0x09a0 #define PT_F9 0x09b0 +#define PT_AR_CSD 0x09c0 +#define PT_AR_SSD 0x09c8 #define PT_DBR 0x2000 /* data breakpoint registers */ #define PT_IBR 0x3000 /* instruction breakpoint registers */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/resource.h linux-2.4.23-pre8/include/asm-ia64/resource.h --- linux-2.4.22/include/asm-ia64/resource.h 2000-09-22 21:21:19.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/resource.h 2003-10-22 22:49:15.000000000 +0000 @@ -8,6 +8,8 @@ * Copyright (C) 1998, 1999 David Mosberger-Tang */ +#include + #define RLIMIT_CPU 0 /* CPU time in ms */ #define RLIMIT_FSIZE 1 /* Maximum filesize */ #define RLIMIT_DATA 2 /* max data size */ @@ -35,7 +37,7 @@ { RLIM_INFINITY, RLIM_INFINITY }, \ { RLIM_INFINITY, RLIM_INFINITY }, \ { RLIM_INFINITY, RLIM_INFINITY }, \ - { _STK_LIM, RLIM_INFINITY }, \ + { _STK_LIM, DEFAULT_USER_STACK_SIZE }, \ { 0, RLIM_INFINITY }, \ { RLIM_INFINITY, RLIM_INFINITY }, \ { 0, 0 }, \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sal.h linux-2.4.23-pre8/include/asm-ia64/sal.h --- linux-2.4.22/include/asm-ia64/sal.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sal.h 2003-10-22 22:49:43.000000000 +0000 @@ -23,6 +23,18 @@ * (plus examples of platform error info structures from smariset @ Intel) */ +#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK_BIT 0 +#define IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT_BIT 1 +#define IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT_BIT 2 +#define IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT 3 + +#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK (1< #include @@ -56,6 +68,13 @@ ia64_load_scratch_fpregs(__ia64_scn_fr); \ } while (0) +# define SAL_CALL_REENTRANT(result,args...) do { \ + struct ia64_fpreg __ia64_scs_fr[6]; \ + ia64_save_scratch_fpregs(__ia64_scs_fr); \ + __SAL_CALL(result, args); \ + ia64_load_scratch_fpregs(__ia64_scs_fr); \ +} while (0) + #define SAL_SET_VECTORS 0x01000000 #define SAL_GET_STATE_INFO 0x01000001 #define SAL_GET_STATE_INFO_SIZE 0x01000002 @@ -162,11 +181,6 @@ u8 oem_reserved[8]; } ia64_sal_desc_memory_t; -#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK (1 << 0) -#define IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT (1 << 1) -#define IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT (1 << 2) -#define IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT (1 << 3) - typedef struct ia64_sal_desc_platform_feature { u8 type; u8 feature_mask; @@ -226,7 +240,7 @@ /* Encodings for machine check parameter types */ enum { - SAL_MC_PARAM_RENDEZ_INT = 1, /* Rendezevous interrupt */ + SAL_MC_PARAM_RENDEZ_INT = 1, /* Rendezvous interrupt */ SAL_MC_PARAM_RENDEZ_WAKEUP = 2, /* Wakeup */ SAL_MC_PARAM_CPE_INT = 3 /* Corrected Platform Error Int */ }; @@ -658,8 +672,8 @@ ia64_sal_clear_state_info (u64 sal_info_type) { struct ia64_sal_retval isrv; - SAL_CALL(isrv, SAL_CLEAR_STATE_INFO, sal_info_type, 0, - 0, 0, 0, 0, 0); + SAL_CALL_REENTRANT(isrv, SAL_CLEAR_STATE_INFO, sal_info_type, 0, + 0, 0, 0, 0, 0); return isrv.status; } @@ -671,8 +685,8 @@ ia64_sal_get_state_info (u64 sal_info_type, u64 *sal_info) { struct ia64_sal_retval isrv; - SAL_CALL(isrv, SAL_GET_STATE_INFO, sal_info_type, 0, - sal_info, 0, 0, 0, 0); + SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0, + sal_info, 0, 0, 0, 0); if (isrv.status) return 0; @@ -687,8 +701,8 @@ ia64_sal_get_state_info_size (u64 sal_info_type) { struct ia64_sal_retval isrv; - SAL_CALL(isrv, SAL_GET_STATE_INFO_SIZE, sal_info_type, 0, - 0, 0, 0, 0, 0); + SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO_SIZE, sal_info_type, 0, + 0, 0, 0, 0, 0); if (isrv.status) return 0; return isrv.v0; @@ -792,4 +806,6 @@ extern unsigned long sal_platform_features; +#endif /* __ASSEMBLY__ */ + #endif /* _ASM_IA64_PAL_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sigcontext.h linux-2.4.23-pre8/include/asm-ia64/sigcontext.h --- linux-2.4.22/include/asm-ia64/sigcontext.h 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sigcontext.h 2003-10-22 22:47:30.000000000 +0000 @@ -56,7 +56,7 @@ unsigned long sc_rbs_base; /* NULL or new base of sighandler's rbs */ unsigned long sc_loadrs; /* see description above */ - unsigned long sc_ar25; /* rsvd for scratch use */ + unsigned long sc_ar25; /* cmp8xchg16 uses this */ unsigned long sc_ar26; /* rsvd for scratch use */ unsigned long sc_rsvd[12]; /* reserved for future use */ /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/smp.h linux-2.4.23-pre8/include/asm-ia64/smp.h --- linux-2.4.22/include/asm-ia64/smp.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/smp.h 2003-10-22 22:48:55.000000000 +0000 @@ -124,6 +124,7 @@ extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info, int retry, int wait); +extern void smp_build_cpu_map(void); #endif /* CONFIG_SMP */ #endif /* _ASM_IA64_SMP_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/bte.h linux-2.4.23-pre8/include/asm-ia64/sn/bte.h --- linux-2.4.22/include/asm-ia64/sn/bte.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/bte.h 2003-10-22 22:48:24.000000000 +0000 @@ -59,6 +59,15 @@ #endif /* BTE_DEBUG */ +#ifndef L1_CACHE_MASK +#define L1_CACHE_MASK (L1_CACHE_BYTES - 1) +#endif + +#ifndef L1_CACHE_ALIGNED +#define L1_CACHE_ALIGNED(_p) (((u64)(_p) & L1_CACHE_MASK) == 0) +#endif + + /* BTE status register only supports 16 bits for length field */ #define BTE_LEN_BITS (16) #define BTE_LEN_MASK ((1 << BTE_LEN_BITS) - 1) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/cdl.h linux-2.4.23-pre8/include/asm-ia64/sn/cdl.h --- linux-2.4.22/include/asm-ia64/sn/cdl.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/cdl.h 2003-10-22 22:49:07.000000000 +0000 @@ -9,7 +9,9 @@ #ifndef _ASM_IA64_SN_CDL_H #define _ASM_IA64_SN_CDL_H +#ifdef __KERNEL__ #include +#endif struct cdl { int part_num; /* Part part number */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/dmamap.h linux-2.4.23-pre8/include/asm-ia64/sn/dmamap.h --- linux-2.4.22/include/asm-ia64/sn/dmamap.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/dmamap.h 2003-10-22 22:49:39.000000000 +0000 @@ -9,7 +9,7 @@ #ifndef _ASM_IA64_SN_DMAMAP_H #define _ASM_IA64_SN_DMAMAP_H -#include +#include #ifdef __cplusplus extern "C" { @@ -41,33 +41,9 @@ int dma_index; /* Beginning map register to use */ int dma_size; /* Number of map registers to use */ paddr_t dma_addr; /* Corresponding bus addr for A24/A32 */ - caddr_t dma_virtaddr; /* Beginning virtual address that is mapped */ + unsigned long dma_virtaddr; /* Beginning virtual address that is mapped */ } dmamap_t; -struct alenlist_s; - -/* - * Prototypes of exported functions - */ -extern dmamap_t *dma_mapalloc(int, int, int, int); -extern void dma_mapfree(dmamap_t *); -extern int dma_map(dmamap_t *, caddr_t, int); -extern int dma_map2(dmamap_t *, caddr_t, caddr_t, int); -extern paddr_t dma_mapaddr(dmamap_t *, caddr_t); -extern int dma_map_alenlist(dmamap_t *, struct alenlist_s *, size_t); -extern uint ev_kvtoiopnum(caddr_t); - -/* - * These variables are defined in master.d/kernel - */ -extern struct map *a24map[]; -extern struct map *a32map[]; - -extern int a24_mapsize; -extern int a32_mapsize; - -extern sv_t dmamapout; - #ifdef __cplusplus } #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/hcl.h linux-2.4.23-pre8/include/asm-ia64/sn/hcl.h --- linux-2.4.22/include/asm-ia64/sn/hcl.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/hcl.h 2003-10-22 22:48:30.000000000 +0000 @@ -14,6 +14,13 @@ extern vertex_hdl_t hwgraph_root; extern vertex_hdl_t linux_busnum; +void hwgraph_debug(char *, char *, int, vertex_hdl_t, vertex_hdl_t, char *, ...); + +#if 1 +#define HWGRAPH_DEBUG(args) hwgraph_debug args ; +#else +#define HWGRAPH_DEBUG(args) +#endif typedef long labelcl_info_place_t; typedef long arbitrary_info_t; @@ -55,6 +62,7 @@ /* * External declarations of EXPORTED SYMBOLS in hcl.c */ +extern int hwgraph_generate_path(vertex_hdl_t, char *, int); extern vertex_hdl_t hwgraph_register(vertex_hdl_t, const char *, unsigned int, unsigned int, unsigned int, unsigned int, umode_t, uid_t, gid_t, struct file_operations *, void *); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/invent.h linux-2.4.23-pre8/include/asm-ia64/sn/invent.h --- linux-2.4.22/include/asm-ia64/sn/invent.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/invent.h 2003-10-22 22:47:47.000000000 +0000 @@ -701,16 +701,6 @@ #ifdef __KERNEL__ -typedef struct irix5_inventory_s { - app32_ptr_t inv_next; /* next inventory record in list */ - int inv_class; /* class of object */ - int inv_type; /* class sub-type of object */ - major_t inv_controller; /* object major identifier */ - minor_t inv_unit; /* object minor identifier */ - int inv_state; /* information specific to object or - class */ -} irix5_inventory_t; - typedef struct invplace_s { vertex_hdl_t invplace_vhdl; /* current vertex */ vertex_hdl_t invplace_vplace; /* place in vertex list */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/io.h linux-2.4.23-pre8/include/asm-ia64/sn/io.h --- linux-2.4.22/include/asm-ia64/sn/io.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/io.h 2003-10-22 22:47:41.000000000 +0000 @@ -13,6 +13,8 @@ #include +extern int numionodes; + /* Because we only have PCI I/O ports. */ #define IIO_ITTE_BASE 0x400160 /* base of translation table entries */ #define IIO_ITTE(bigwin) (IIO_ITTE_BASE + 8*(bigwin)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/ioc4.h linux-2.4.23-pre8/include/asm-ia64/sn/ioc4.h --- linux-2.4.22/include/asm-ia64/sn/ioc4.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/ioc4.h 2003-10-22 22:48:59.000000000 +0000 @@ -30,7 +30,6 @@ #ifndef _ASM_IA64_SN_IOC4_H #define _ASM_IA64_SN_IOC4_H -#if 0 /* * ioc4.h - IOC4 chip header file @@ -46,7 +45,7 @@ * * All IOC4 registers are 32 bits wide. */ -typedef __uint32_t ioc4reg_t; +typedef uint32_t ioc4reg_t; /* * PCI Configuration Space Register Address Map, use offset from IOC4 PCI @@ -70,10 +69,12 @@ * PCI Memory Space Map */ #define IOC4_PCI_ERR_ADDR_L 0x000 /* Low Error Address */ -#define IOC4_PCI_ERR_ADDR_VLD (0x1 << 0) -#define IOC4_PCI_ERR_ADDR_MST_ID_MSK (0xf << 1) -#define IOC4_PCI_ERR_ADDR_MUL_ERR (0x1 << 5) -#define IOC4_PCI_ERR_ADDR_ADDR_MSK (0x3ffffff << 6) +#define IOC4_PCI_ERR_ADDR_VLD (0x1 << 0) +#define IOC4_PCI_ERR_ADDR_MST_ID_MSK (0xf << 1) +#define IOC4_PCI_ERR_ADDR_MST_NUM_MSK (0xe << 1) +#define IOC4_PCI_ERR_ADDR_MST_TYP_MSK (0x1 << 1) +#define IOC4_PCI_ERR_ADDR_MUL_ERR (0x1 << 5) +#define IOC4_PCI_ERR_ADDR_ADDR_MSK (0x3ffffff << 6) /* Master IDs contained in PCI_ERR_ADDR_MST_ID_MSK */ #define IOC4_MST_ID_S0_TX 0 @@ -569,26 +570,27 @@ /* IOC4 UART register map */ typedef volatile struct ioc4_uartregs { + char i4u_lcr; union { - char rbr; /* read only, DLAB == 0 */ - char thr; /* write only, DLAB == 0 */ - char dll; /* DLAB == 1 */ - } u1; + char iir; /* read only */ + char fcr; /* write only */ + } u3; union { char ier; /* DLAB == 0 */ char dlm; /* DLAB == 1 */ } u2; union { - char iir; /* read only */ - char fcr; /* write only */ - } u3; - char i4u_lcr; - char i4u_mcr; - char i4u_lsr; - char i4u_msr; + char rbr; /* read only, DLAB == 0 */ + char thr; /* write only, DLAB == 0 */ + char dll; /* DLAB == 1 */ + } u1; char i4u_scr; + char i4u_msr; + char i4u_lsr; + char i4u_mcr; } ioc4_uart_t; + #define i4u_rbr u1.rbr #define i4u_thr u1.thr #define i4u_dll u1.dll @@ -704,7 +706,6 @@ ioc4_uart_t uart_3; } ioc4_mem_t; -#endif /* 0 */ /* * Bytebus device space @@ -714,7 +715,6 @@ #define IOC4_BYTEBUS_DEV2 0xC0000L /* Addressed using pci_bar0 */ #define IOC4_BYTEBUS_DEV3 0xE0000L /* Addressed using pci_bar0 */ -#if 0 /* UART clock speed */ #define IOC4_SER_XIN_CLK 66000000 @@ -749,7 +749,7 @@ #define IOC4_INTA_SUBDEVS (IOC4_SDB_SERIAL | IOC4_SDB_KBMS | IOC4_SDB_RT | IOC4_SDB_GENERIC) extern int ioc4_subdev_enabled(vertex_hdl_t, ioc4_subdev_t); -extern void ioc4_subdev_enables(vertex_hdl_t, ulong_t); +extern void ioc4_subdev_enables(vertex_hdl_t, uint64_t); extern void ioc4_subdev_enable(vertex_hdl_t, ioc4_subdev_t); extern void ioc4_subdev_disable(vertex_hdl_t, ioc4_subdev_t); @@ -767,7 +767,7 @@ ioc4_intr_func_f (intr_arg_t, ioc4reg_t); typedef void -ioc4_intr_connect_f (vertex_hdl_t conn_vhdl, +ioc4_intr_connect_f (struct pci_dev *conn_vhdl, ioc4_intr_type_t, ioc4reg_t, ioc4_intr_func_f *, @@ -784,18 +784,17 @@ intr_arg_t info, vertex_hdl_t owner_vhdl); -ioc4_intr_disconnect_f ioc4_intr_disconnect; -ioc4_intr_connect_f ioc4_intr_connect; +void ioc4_intr_connect(vertex_hdl_t, ioc4_intr_type_t, ioc4reg_t, + ioc4_intr_func_f *, intr_arg_t, vertex_hdl_t, + vertex_hdl_t); extern int ioc4_is_console(vertex_hdl_t conn_vhdl); extern void ioc4_mlreset(ioc4_cfg_t *, ioc4_mem_t *); -extern intr_func_f ioc4_intr; extern ioc4_mem_t *ioc4_mem_ptr(void *ioc4_fastinfo); typedef ioc4_intr_func_f *ioc4_intr_func_t; -#endif /* 0 */ #endif /* _ASM_IA64_SN_IOC4_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/ioerror.h linux-2.4.23-pre8/include/asm-ia64/sn/ioerror.h --- linux-2.4.22/include/asm-ia64/sn/ioerror.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/ioerror.h 2003-10-22 22:48:20.000000000 +0000 @@ -185,10 +185,10 @@ typedef int error_handler_f(void *, int, ioerror_mode_t, ioerror_t *); typedef void *error_handler_arg_t; -extern void ioerror_dump(char *, int, int, ioerror_t *); +extern void snia_ioerror_dump(char *, int, int, ioerror_t *); #ifdef ERROR_DEBUG -#define IOERROR_DUMP(x, y, z, t) ioerror_dump((x), (y), (z), (t)) +#define IOERROR_DUMP(x, y, z, t) snia_ioerror_dump((x), (y), (z), (t)) #define IOERR_PRINTF(x) (x) #else #define IOERROR_DUMP(x, y, z, t) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/ioerror_handling.h linux-2.4.23-pre8/include/asm-ia64/sn/ioerror_handling.h --- linux-2.4.22/include/asm-ia64/sn/ioerror_handling.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/ioerror_handling.h 2003-10-22 22:48:59.000000000 +0000 @@ -233,10 +233,6 @@ #define v_error_skip_env_clear(v) \ hwgraph_info_remove_LBL(v, INFO_LBL_ERROR_SKIP_ENV, 0) -/* Skip point interfaces */ -extern error_return_code_t error_skip_point_jump(vertex_hdl_t, boolean_t); -extern error_return_code_t error_skip_point_clear(vertex_hdl_t); - /* REFERENCED */ #if defined(CONFIG_SGI_IO_ERROR_HANDLING) @@ -256,7 +252,7 @@ * one. */ if (v_error_skip_env_get(v, error_env) != GRAPH_SUCCESS) { - error_env = snia_kmem_zalloc(sizeof(label_t), KM_NOSLEEP); + error_env = snia_kmem_zalloc(sizeof(label_t)); /* Unable to allocate memory for jum buffer. This should * be a very rare occurrence. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/iograph.h linux-2.4.23-pre8/include/asm-ia64/sn/iograph.h --- linux-2.4.22/include/asm-ia64/sn/iograph.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/iograph.h 2003-10-22 22:47:39.000000000 +0000 @@ -68,6 +68,7 @@ #define EDGE_LBL_HPC "hpc" #define EDGE_LBL_GFX "gfx" #define EDGE_LBL_HUB "hub" /* For SN0 */ +#define EDGE_LBL_ICE "ice" /* For TIO */ #define EDGE_LBL_HW "hw" #define EDGE_LBL_SYNERGY "synergy" /* For SNIA only */ #define EDGE_LBL_IBUS "ibus" /* For EVEREST */ @@ -75,6 +76,7 @@ #define EDGE_LBL_IO "io" #define EDGE_LBL_IO4 "io4" /* For EVEREST */ #define EDGE_LBL_IOC3 "ioc3" +#define EDGE_LBL_IOC4 "ioc4" #define EDGE_LBL_LUN "lun" #define EDGE_LBL_LINUX "linux" #define EDGE_LBL_LINUX_BUS EDGE_LBL_LINUX "/bus/pci-x" @@ -93,6 +95,9 @@ #define EDGE_LBL_PCIX "pci-x" #define EDGE_LBL_PCIX_0 EDGE_LBL_PCIX "/0" #define EDGE_LBL_PCIX_1 EDGE_LBL_PCIX "/1" +#define EDGE_LBL_AGP "agp" +#define EDGE_LBL_AGP_0 EDGE_LBL_AGP "/0" +#define EDGE_LBL_AGP_1 EDGE_LBL_AGP "/1" #define EDGE_LBL_PORT "port" #define EDGE_LBL_PROM "prom" #define EDGE_LBL_RACK "rack" @@ -112,6 +117,7 @@ #define EDGE_LBL_XIO "xio" #define EDGE_LBL_XSWITCH ".xswitch" #define EDGE_LBL_XTALK "xtalk" +#define EDGE_LBL_CORETALK "coretalk" #define EDGE_LBL_XWIDGET "xwidget" #define EDGE_LBL_ELSC "elsc" #define EDGE_LBL_L1 "L1" @@ -129,6 +135,7 @@ #define EDGE_LBL_PBRICK "Pbrick" #define EDGE_LBL_PEBRICK "PEbrick" #define EDGE_LBL_PXBRICK "PXbrick" +#define EDGE_LBL_OPUSBRICK "onboardio" #define EDGE_LBL_IXBRICK "IXbrick" #define EDGE_LBL_IBRICK "Ibrick" #define EDGE_LBL_XBRICK "Xbrick" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/klconfig.h linux-2.4.23-pre8/include/asm-ia64/sn/klconfig.h --- linux-2.4.22/include/asm-ia64/sn/klconfig.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/klconfig.h 2003-10-22 22:48:23.000000000 +0000 @@ -346,6 +346,7 @@ #define KLTYPE_WEIRDCPU (KLCLASS_CPU | 0x0) #define KLTYPE_SNIA (KLCLASS_CPU | 0x1) +#define KLTYPE_TIO (KLCLASS_CPU | 0x2) #define KLTYPE_WEIRDIO (KLCLASS_IOBRICK | 0x0) #define KLTYPE_BASEIO (KLCLASS_IO | 0x1) /* IOC3, SuperIO, Bridge, SCSI */ @@ -393,6 +394,7 @@ #define KLTYPE_PXBRICK (KLCLASS_IOBRICK | 0x6) #define KLTYPE_IXBRICK (KLCLASS_IOBRICK | 0x7) #define KLTYPE_CGBRICK (KLCLASS_IOBRICK | 0x8) +#define KLTYPE_OPUSBRICK (KLCLASS_IOBRICK | 0x9) #define KLTYPE_PBRICK_BRIDGE KLTYPE_PBRICK @@ -576,6 +578,13 @@ #define KLSTRUCT_PEBRICK 38 #define KLSTRUCT_GIGE 39 #define KLSTRUCT_IDE 40 +#define KLSTRUCT_IOC4 41 +#define KLSTRUCT_IOC4UART 42 +#define KLSTRUCT_IOC4_TTY 43 +#define KLSTRUCT_IOC4PCKM 44 +#define KLSTRUCT_IOC4MS 45 +#define KLSTRUCT_IOC4_ATA 46 +#define KLSTRUCT_PCIGFX 47 /* * These are the indices of various components within a lboard structure. @@ -846,6 +855,10 @@ unsigned long pad; } klenetdev_t ; +typedef struct klpcigfx_s { /* PCI GFX */ + klinfo_t gfx_info ; +} klpcigfx_t ; + typedef struct klkbddev_s { /* KBD device */ klinfo_t kbddev_info ; struct keyboard_data *kbddev_cfg ; /* driver fills up this */ @@ -976,7 +989,6 @@ extern int config_find_xbow(nasid_t, lboard_t **, klxbow_t**); extern int update_klcfg_cpuinfo(nasid_t, int); extern void board_to_path(lboard_t *brd, char *path); -extern moduleid_t get_module_id(nasid_t nasid); extern void nic_name_convert(char *old_name, char *new_name); extern int module_brds(nasid_t nasid, lboard_t **module_brds, int n); extern lboard_t *brd_from_key(uint64_t key); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/ksys/l1.h linux-2.4.23-pre8/include/asm-ia64/sn/ksys/l1.h --- linux-2.4.22/include/asm-ia64/sn/ksys/l1.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/ksys/l1.h 2003-10-22 22:48:24.000000000 +0000 @@ -104,17 +104,23 @@ command string */ /* brick type response codes */ +#define L1_BRICKTYPE_PX 0x23 /* # */ +#define L1_BRICKTYPE_PE 0x25 /* % */ +#define L1_BRICKTYPE_N_p0 0x26 /* & */ #define L1_BRICKTYPE_IP45 0x34 /* 4 */ -#define L1_BRICKTYPE_C 0x43 /* C */ -#define L1_BRICKTYPE_I 0x49 /* I */ -#define L1_BRICKTYPE_P 0x50 /* P */ -#define L1_BRICKTYPE_R 0x52 /* R */ -#define L1_BRICKTYPE_X 0x58 /* X */ -#define L1_BRICKTYPE_X2 0x59 /* Y */ -#define L1_BRICKTYPE_N 0x4e /* N */ -#define L1_BRICKTYPE_PE 0x25 /* % */ -#define L1_BRICKTYPE_PX 0x23 /* # */ -#define L1_BRICKTYPE_IX 0x3d /* = */ +#define L1_BRICKTYPE_IP41 0x35 /* 5 */ +#define L1_BRICKTYPE_TWISTER 0x36 /* 6 */ /* IP53 & ROUTER */ +#define L1_BRICKTYPE_IX 0x3d /* = */ +#define L1_BRICKTYPE_IP34 0x61 /* a */ +#define L1_BRICKTYPE_C 0x63 /* c */ +#define L1_BRICKTYPE_I 0x69 /* i */ +#define L1_BRICKTYPE_N 0x6e /* n */ +#define L1_BRICKTYPE_OPUS 0x6f /* o */ +#define L1_BRICKTYPE_P 0x70 /* p */ +#define L1_BRICKTYPE_R 0x72 /* r */ +#define L1_BRICKTYPE_CHI_CG 0x76 /* v */ +#define L1_BRICKTYPE_X 0x78 /* x */ +#define L1_BRICKTYPE_X2 0x79 /* y */ /* EEPROM codes (for the "read EEPROM" request) */ /* c brick */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/module.h linux-2.4.23-pre8/include/asm-ia64/sn/module.h --- linux-2.4.22/include/asm-ia64/sn/module.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/module.h 2003-10-22 22:48:24.000000000 +0000 @@ -138,6 +138,8 @@ #define MODULE_PEBRICK 8 #define MODULE_PXBRICK 9 #define MODULE_IXBRICK 10 +#define MODULE_CGBRICK 11 +#define MODULE_OPUSBRICK 12 /* * Moduleid_t comparison macros @@ -155,12 +157,13 @@ spinlock_t lock; /* Lock for this structure */ /* List of nodes in this module */ - cnodeid_t nodes[MODULE_MAX_NODES]; - geoid_t geoid[MODULE_MAX_NODES]; + cnodeid_t nodes[MAX_SLABS + 1]; + geoid_t geoid[MAX_SLABS + 1]; struct { - char moduleid[8]; - } io[MODULE_MAX_NODES]; - int nodecnt; /* Number of nodes in array */ + char moduleid[8]; + uint64_t iobrick_type; + } io[MAX_SLABS + 1]; + /* Fields for Module System Controller */ int mesgpend; /* Message pending */ int shutdown; /* Shutdown in progress */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/nodepda.h linux-2.4.23-pre8/include/asm-ia64/sn/nodepda.h --- linux-2.4.22/include/asm-ia64/sn/nodepda.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/nodepda.h 2003-10-22 22:47:59.000000000 +0000 @@ -65,6 +65,8 @@ nodepda_router_info_t **npda_rip_last; + spinlock_t bist_lock; + /* * The BTEs on this node are shared by the local cpus */ @@ -127,8 +129,7 @@ * Check if given a compact node id the corresponding node has all the * cpus disabled. */ -#define is_headless_node(cnode) ((cnode == CNODEID_NONE) || \ - (node_data(cnode)->active_cpu_count == 0)) +#define is_headless_node(cnode) (!test_bit(cnode, &node_has_active_cpus)) /* * Check if given a node vertex handle the corresponding node has all the diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/pci/bridge.h linux-2.4.23-pre8/include/asm-ia64/sn/pci/bridge.h --- linux-2.4.22/include/asm-ia64/sn/pci/bridge.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/pci/bridge.h 2003-10-22 22:47:59.000000000 +0000 @@ -34,20 +34,19 @@ * For a detailed PIC register layout see pic.h. */ +#ifdef __KERNEL__ #include #include #include - -extern int io_get_sh_swapper(nasid_t); -#define BRIDGE_REG_GET32(reg) \ - __swab32( *(volatile uint32_t *) (((uint64_t)reg)^4) ) - -#define BRIDGE_REG_SET32(reg) \ - *(volatile uint32_t *) (((uint64_t)reg)^4) +#else +#include +#include +#include +#endif /* I/O page size */ -#if _PAGESZ == 4096 +#if PAGE_SIZE == 4096 #define IOPFNSHIFT 12 /* 4K per mapped page */ #else #define IOPFNSHIFT 14 /* 16K per mapped page */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/pci/pci_bus_cvlink.h linux-2.4.23-pre8/include/asm-ia64/sn/pci/pci_bus_cvlink.h --- linux-2.4.22/include/asm-ia64/sn/pci/pci_bus_cvlink.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/pci/pci_bus_cvlink.h 2003-10-22 22:48:40.000000000 +0000 @@ -56,8 +56,6 @@ vertex_hdl_t vhdl; int isa64; int isPIC; - volatile unsigned int *dma_buf_sync; - volatile unsigned int *xbow_buf_sync; }; struct sn_dma_maps_s{ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/pci/pciba.h linux-2.4.23-pre8/include/asm-ia64/sn/pci/pciba.h --- linux-2.4.22/include/asm-ia64/sn/pci/pciba.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/pci/pciba.h 2003-10-22 22:47:41.000000000 +0000 @@ -14,14 +14,6 @@ #include #include -/* for application compatibility with IRIX (why do I bother?) */ - -#ifndef __KERNEL__ -typedef u_int8_t uint8_t; -typedef u_int16_t uint16_t; -typedef u_int32_t uint32_t; -#endif - #define PCI_CFG_VENDOR_ID PCI_VENDOR_ID #define PCI_CFG_COMMAND PCI_COMMAND #define PCI_CFG_REV_ID PCI_REVISION_ID diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/pci/pcibr.h linux-2.4.23-pre8/include/asm-ia64/sn/pci/pcibr.h --- linux-2.4.22/include/asm-ia64/sn/pci/pcibr.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/pci/pcibr.h 2003-10-22 22:48:19.000000000 +0000 @@ -194,15 +194,10 @@ extern int pcibr_reset(vertex_hdl_t dev); -extern int pcibr_write_gather_flush(vertex_hdl_t dev); - extern pciio_endian_t pcibr_endian_set(vertex_hdl_t dev, pciio_endian_t device_end, pciio_endian_t desired_end); -extern pciio_priority_t pcibr_priority_set(vertex_hdl_t dev, - pciio_priority_t device_prio); - extern uint64_t pcibr_config_get(vertex_hdl_t conn, unsigned reg, unsigned size); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/pci/pcibr_private.h linux-2.4.23-pre8/include/asm-ia64/sn/pci/pcibr_private.h --- linux-2.4.22/include/asm-ia64/sn/pci/pcibr_private.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/pci/pcibr_private.h 2003-10-22 22:47:29.000000000 +0000 @@ -277,9 +277,9 @@ #define PCIBR_BUS_IO_MAX 0x0FFFFFFF #define PCIBR_BUS_IO_PAGE 0x100000 -#define PCIBR_BUS_SWIN_BASE _PAGESZ +#define PCIBR_BUS_SWIN_BASE PAGE_SIZE #define PCIBR_BUS_SWIN_MAX 0x000FFFFF -#define PCIBR_BUS_SWIN_PAGE _PAGESZ +#define PCIBR_BUS_SWIN_PAGE PAGE_SIZE #define PCIBR_BUS_MEM_BASE 0x200000 #define PCIBR_BUS_MEM_MAX 0x3FFFFFFF @@ -307,7 +307,7 @@ */ #define PV854697 (~0) /* PIC: write 64bit regs as 64bits. permanent */ #define PV854827 (~0) /* PIC: fake widget 0xf presence bit. permanent */ -#define PV855271 (~0) /* PIC: use virt chan iff 64-bit device. permanent */ +#define PV855271 (1 << 1) /* PIC: PIC: use virt chan iff 64-bit device. */ #define PV855272 (1 << 1) /* PIC: runaway interrupt WAR */ #define PV856155 (1 << 1) /* PIC: arbitration WAR */ #define PV856864 (1 << 1) /* PIC: lower timeout to free TNUMs quicker */ @@ -663,8 +663,8 @@ /* * mem alloc/free macros */ -#define NEWAf(ptr,n,f) (ptr = snia_kmem_zalloc((n)*sizeof (*(ptr)), (f&PCIIO_NOSLEEP)?KM_NOSLEEP:KM_SLEEP)) -#define NEWA(ptr,n) (ptr = snia_kmem_zalloc((n)*sizeof (*(ptr)), KM_SLEEP)) +#define NEWAf(ptr,n,f) (ptr = snia_kmem_zalloc((n)*sizeof (*(ptr)))) +#define NEWA(ptr,n) (ptr = snia_kmem_zalloc((n)*sizeof (*(ptr)))) #define DELA(ptr,n) (kfree(ptr)) #define NEWf(ptr,f) NEWAf(ptr,1,f) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/pci/pciio.h linux-2.4.23-pre8/include/asm-ia64/sn/pci/pciio.h --- linux-2.4.22/include/asm-ia64/sn/pci/pciio.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/pci/pciio.h 2003-10-22 22:47:29.000000000 +0000 @@ -13,17 +13,30 @@ * pciio.h -- platform-independent PCI interface */ +#ifdef __KERNEL__ #include #include #include #include +#include #include - +#else +#include +#include +#include +#include +#include +#endif #ifndef __ASSEMBLY__ +#ifdef __KERNEL__ #include #include +#else +#include +#include +#endif typedef int pciio_vendor_id_t; @@ -188,20 +201,6 @@ } pciio_endian_t; /* - * Interface to set PCI arbitration priority for devices that require - * realtime characteristics. pciio_priority_set is used to switch a - * device between the PCI high-priority arbitration ring and the low - * priority arbitration ring. - * - * (Note: this is strictly for the PCI arbitrary priority. It has - * no direct relationship to GBR.) - */ -typedef enum pciio_priority_e { - PCI_PRIO_LOW, - PCI_PRIO_HIGH -} pciio_priority_t; - -/* * handles of various sorts */ typedef struct pciio_piomap_s *pciio_piomap_t; @@ -396,18 +395,11 @@ typedef int pciio_reset_f (vertex_hdl_t conn); /* pci connection point */ -typedef int -pciio_write_gather_flush_f (vertex_hdl_t dev); /* Device flushing buffers */ - typedef pciio_endian_t /* actual endianness */ pciio_endian_set_f (vertex_hdl_t dev, /* specify endianness for this device */ pciio_endian_t device_end, /* endianness of device */ pciio_endian_t desired_end); /* desired endianness */ -typedef pciio_priority_t -pciio_priority_set_f (vertex_hdl_t pcicard, - pciio_priority_t device_prio); - typedef uint64_t pciio_config_get_f (vertex_hdl_t conn, /* pci connection point */ unsigned reg, /* register byte offset */ @@ -479,9 +471,7 @@ pciio_provider_startup_f *provider_startup; pciio_provider_shutdown_f *provider_shutdown; pciio_reset_f *reset; - pciio_write_gather_flush_f *write_gather_flush; pciio_endian_set_f *endian_set; - pciio_priority_set_f *priority_set; pciio_config_get_f *config_get; pciio_config_set_f *config_set; @@ -521,13 +511,9 @@ extern pciio_provider_startup_f pciio_provider_startup; extern pciio_provider_shutdown_f pciio_provider_shutdown; extern pciio_reset_f pciio_reset; -extern pciio_write_gather_flush_f pciio_write_gather_flush; extern pciio_endian_set_f pciio_endian_set; -extern pciio_priority_set_f pciio_priority_set; extern pciio_config_get_f pciio_config_get; extern pciio_config_set_f pciio_config_set; -extern pciio_error_devenable_f pciio_error_devenable; -extern pciio_error_extract_f pciio_error_extract; /* Widgetdev in the IOERROR structure is encoded as follows. * +---------------------------+ @@ -695,5 +681,63 @@ extern int pciio_error_handler(vertex_hdl_t, int, ioerror_mode_t, ioerror_t *); extern int pciio_dma_enabled(vertex_hdl_t); +/** + * sn_pci_set_vchan - Set the requested Virtual Channel bits into the mapped DMA + * address. + * @pci_dev: pci device pointer + * @addr: mapped dma address + * @vchan: Virtual Channel to use 0 or 1. + * + * Set the Virtual Channel bit in the mapped dma address. + */ +static inline int +sn_pci_set_vchan(struct pci_dev *pci_dev, + dma_addr_t *addr, + int vchan) +{ + + if (vchan > 1) { + return -1; + } + + if (!(*addr >> 32)) /* Using a mask here would be cleaner */ + return 0; /* but this generates better code */ + + if (vchan == 1) { + /* Set Bit 57 */ + *addr |= (1UL << 57); + } else { + /* Clear Bit 57 */ + *addr &= ~(1UL << 57); + } + + return 0; +} + #endif /* C or C++ */ + + +/* + * Prototypes + */ + +int snia_badaddr_val(volatile void *addr, int len, volatile void *ptr); +nasid_t snia_get_console_nasid(void); +nasid_t snia_get_master_baseio_nasid(void); +void snia_ioerror_dump(char *name, int error_code, int error_mode, ioerror_t *ioerror); +int snia_pcibr_rrb_alloc(struct pci_dev *pci_dev, int *count_vchan0, int *count_vchan1); +pciio_endian_t snia_pciio_endian_set(struct pci_dev *pci_dev, + pciio_endian_t device_end, pciio_endian_t desired_end); +iopaddr_t snia_pciio_dmatrans_addr(struct pci_dev *pci_dev, device_desc_t dev_desc, + paddr_t paddr, size_t byte_count, unsigned flags); +pciio_dmamap_t snia_pciio_dmamap_alloc(struct pci_dev *pci_dev, + device_desc_t dev_desc, size_t byte_count_max, unsigned flags); +void snia_pciio_dmamap_free(pciio_dmamap_t pciio_dmamap); +iopaddr_t snia_pciio_dmamap_addr(pciio_dmamap_t pciio_dmamap, paddr_t paddr, + size_t byte_count); +void snia_pciio_dmamap_done(pciio_dmamap_t pciio_dmamap); +void *snia_kmem_zalloc(size_t size); +void snia_kmem_free(void *ptr, size_t size); +void *snia_kmem_alloc_node(register size_t size, cnodeid_t node); + #endif /* _ASM_SN_PCI_PCIIO_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/pci/pic.h linux-2.4.23-pre8/include/asm-ia64/sn/pci/pic.h --- linux-2.4.22/include/asm-ia64/sn/pci/pic.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/pci/pic.h 2003-10-22 22:47:39.000000000 +0000 @@ -72,9 +72,6 @@ extern "C" { #endif -// #include -#include - /********************************************************************* * bus provider function table @@ -88,7 +85,13 @@ * pcibr, we can go directly to this ops table. */ +#ifdef __KERNEL__ +#include +#include extern pciio_provider_t pci_pic_provider; +#else +#include +#endif /********************************************************************* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/serialio.h linux-2.4.23-pre8/include/asm-ia64/sn/serialio.h --- linux-2.4.22/include/asm-ia64/sn/serialio.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/serialio.h 2003-10-22 22:49:44.000000000 +0000 @@ -0,0 +1,477 @@ +/* + * Copyright (c) 2003 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + */ + +#ifndef _ASM_IA64_SN_SERIALIO_H +#define _ASM_IA64_SN_SERIALIO_H + +/* + * Definitions for the modular serial i/o driver. + * + * The modular serial i/o driver is a driver which has the hardware + * dependent and hardware independent parts separated into separate + * modules. The upper half is responsible for all hardware independent + * operations, specifically the interface to the kernel. An upper half + * may implement a streams interface, character interface, or whatever + * interface it wishes to the kernel. The same upper half may access any + * physical hardware through a set of standardized entry points into the + * lower level, which deals directly with the hardware. Whereas a + * separate upper layer exists for each kernel interface type (streams, + * character, polling etc), a separate lower level exists for each + * hardware type supported. Any upper and lower layer pair may be + * connected to form a complete driver. This file defines the interface + * between the two + */ + +/* Definitions needed per port by both layers. Each lower layer + * declares a set of per-port private data areas describing each + * physical port, and by definition the first member of that private + * data is the following structure. Thus a pointer to the lower + * layer's private data is interchangeable with a pointer to the + * common private data, and the upper layer does not allocate anything + * so it does need to know anything about the physical configuration + * of the machine. This structure may also contain any hardware + * independent info that must be persistent across device closes. + */ +typedef struct sioport { + /* calling vectors */ + struct serial_calldown *sio_calldown; + struct serial_callup *sio_callup; + + void *sio_upper; /* upper layer's private data area */ + + vertex_hdl_t sio_vhdl; /* vertex handle of the hardware independent + * portion of this port (e.g. tty/1 without + * the d,m,f, etc) + */ + spinlock_t sio_lock; +} sioport_t; + +/* bits for sio_flags */ +#define SIO_HWGRAPH_INITED 0x1 +#define SIO_SPINLOCK_HELD 0x2 +#define SIO_MUTEX_HELD 0x4 +#define SIO_LOCKS_MASK (SIO_SPINLOCK_HELD | SIO_MUTEX_HELD) + +#if DEBUG +/* bits for sio_lockcalls, one per downcall except du_write which is + * not called by an upper layer. + */ +#define L_OPEN 0x0001 +#define L_CONFIG 0x0002 +#define L_ENABLE_HFC 0x0004 +#define L_SET_EXTCLK 0x0008 +#define L_WRITE 0x0010 +#define L_BREAK 0x0020 +#define L_READ 0x0040 +#define L_NOTIFICATION 0x0080 +#define L_RX_TIMEOUT 0x0100 +#define L_SET_DTR 0x0200 +#define L_SET_RTS 0x0400 +#define L_QUERY_DCD 0x0800 +#define L_QUERY_CTS 0x1000 +#define L_SET_PROTOCOL 0x2000 +#define L_ENABLE_TX 0x4000 + +#define L_LOCK_ALL (~0) + +/* debug lock assertion: each lower layer entry point does an + * assertion with the following macro, passing in the port passed to + * the entry point and the bit corresponding to which entry point it + * is. If the upper layer has turned on the bit for that entry point, + * sio_port_islocked is called, thus an upper layer may specify that + * it is ok for a particular downcall to be made without the port lock + * held. + */ +#define L_LOCKED(port, flag) (((port)->sio_lockcalls & (flag)) == 0 || \ + sio_port_islocked(port)) +#endif + +/* flags for next_char_state */ +#define NCS_BREAK 1 +#define NCS_PARITY 2 +#define NCS_FRAMING 4 +#define NCS_OVERRUN 8 + +/* protocol types for DOWN_SET_PROTOCOL */ +enum sio_proto { + PROTO_RS232, + PROTO_RS422 +}; + +/* calldown vector. This is a set of entry points into a lower layer + * module, providing black-box access to the hardware by the upper + * layer + */ +struct serial_calldown { + + /* hardware configuration */ + int (*down_open) (sioport_t *port); + int (*down_config) (sioport_t *port, int baud, int byte_size, + int stop_bits, int parenb, int parodd); + int (*down_enable_hfc) (sioport_t *port, int enable); + int (*down_set_extclk) (sioport_t *port, int clock_factor); + + /* data transmission */ + int (*down_write) (sioport_t *port, char *buf, int len); + int (*down_du_write) (sioport_t *port, char *buf, int len); + void (*down_du_flush) (sioport_t *port); + int (*down_break) (sioport_t *port, int brk); + int (*down_enable_tx) (sioport_t *port, int enb); + + /* data reception */ + int (*down_read) (sioport_t *port, char *buf, int len); + + /* event notification */ + int (*down_notification) (sioport_t *port, int mask, int on); + int (*down_rx_timeout) (sioport_t *port, int timeout); + + /* modem control */ + int (*down_set_DTR) (sioport_t *port, int dtr); + int (*down_set_RTS) (sioport_t *port, int rts); + int (*down_query_DCD) (sioport_t *port); + int (*down_query_CTS) (sioport_t *port); + + /* transmission protocol */ + int (*down_set_protocol) (sioport_t *port, enum sio_proto protocol); + + /* memory mapped user driver support */ + int (*down_mapid) (sioport_t *port, void *arg); + int (*down_map) (sioport_t *port, uint64_t *vt, off_t off); + void (*down_unmap) (sioport_t *port); + int (*down_set_sscr) (sioport_t *port, int arg, int flag); +}; + +/* + * Macros used by the upper layer to access the lower layer. Unless + * otherwise noted, all integer functions should return 0 on success + * or 1 if the hardware does not support the requested operation. In + * the case of non-support, the upper layer may work around the problem + * where appropriate or just notify the user. + * For hardware which supports detaching, these functions should + * return -1 if the hardware is no longer present. + */ + +/* open a device. Do whatever initialization/resetting necessary */ +#define DOWN_OPEN(p) \ + ((p)->sio_calldown->down_open(p)) + +/* configure the hardware with the given baud rate, number of stop + * bits, byte size and parity + */ +#define DOWN_CONFIG(p, a, b, c, d, e) \ + ((p)->sio_calldown->down_config(p, a, b, c, d, e)) + +/* Enable hardware flow control. If the hardware does not support + * this, the upper layer will emulate HFC by manipulating RTS and CTS + */ +#define DOWN_ENABLE_HFC(p, enb) \ + ((p)->sio_calldown->down_enable_hfc(p, enb)) + +/* Set external clock to the given clock factor. If cf is zero, + * internal clock is used. If cf is non-zero external clock is used + * and the clock is cf times the baud. + */ +#define DOWN_SET_EXTCLK(p, cf) \ + ((p)->sio_calldown->down_set_extclk(p, cf)) + +/* Write bytes to the device. The number of bytes actually written is + * returned. The upper layer will continue to call this function until + * it has no more data to send or until 0 is returned, indicating that + * no more bytes may be sent until some have drained. + */ +#define DOWN_WRITE(p, buf, len) \ + ((p)->sio_calldown->down_write(p, buf, len)) + +/* Same as DOWN_WRITE, but called only from synchronous du output + * routines. Allows lower layer the option of implementing kernel + * printfs differently than ordinary console output. + */ +#define DOWN_DU_WRITE(p, buf, len) \ + ((p)->sio_calldown->down_du_write(p, buf, len)) + +/* Flushes previous down_du_write() calls. Needed on serial controllers + * that can heavily buffer output like IOC3 for conbuf_flush(). + */ +#define DOWN_DU_FLUSH(p) \ + ((p)->sio_calldown->down_du_flush(p)) + +/* Set the output break condition high or low */ +#define DOWN_BREAK(p, brk) \ + ((p)->sio_calldown->down_break(p, brk)) + +/* Enable/disable TX for soft flow control */ +#define DOWN_ENABLE_TX(p) \ + ((p)->sio_calldown->down_enable_tx(p, 1)) +#define DOWN_DISABLE_TX(p) \ + ((p)->sio_calldown->down_enable_tx(p, 0)) + +/* Read bytes from the device. The number of bytes actually read is + * returned. All bytes returned by a single call have the same error + * status. Thus if the device has 10 bytes queued for input and byte 5 + * has a parity error, the first call to DOWN_READ will return bytes 0-4 + * only. A subsequent call to DOWN_READ will first cause a call to + * UP_PARITY_ERROR to notify the upper layer that the next byte has an + * error, and then the call to DOWN_READ returns byte 5 alone. A + * subsequent call to DOWN_READ returns bytes 6-9. The upper layer + * continues to call DOWN_READ until 0 is returned, or until it runs out + * of buffer space to receive the chars. + */ +#define DOWN_READ(p, buf, len) \ + ((p)->sio_calldown->down_read(p, buf, len)) + +/* Turn on/off event notification for the specified events. Notification + * status is unchanged for those events not specified. + */ +#define DOWN_NOTIFICATION(p, mask, on) \ + ((p)->sio_calldown->down_notification(p, mask, on)) + +/* Notification types. 1 per upcall. The upper layer can specify + * exactly which upcalls it wishes to receive. UP_DETACH is mandatory + * when applicable and cannot be enabled/disabled. + */ +#define N_DATA_READY 0x01 +#define N_OUTPUT_LOWAT 0x02 +#define N_BREAK 0x04 +#define N_PARITY_ERROR 0x08 +#define N_FRAMING_ERROR 0x10 +#define N_OVERRUN_ERROR 0x20 +#define N_DDCD 0x40 +#define N_DCTS 0x80 + +#define N_ALL_INPUT (N_DATA_READY | N_BREAK | \ + N_PARITY_ERROR | N_FRAMING_ERROR | \ + N_OVERRUN_ERROR | N_DDCD | N_DCTS) + +#define N_ALL_OUTPUT N_OUTPUT_LOWAT + +#define N_ALL_ERRORS (N_PARITY_ERROR | N_FRAMING_ERROR | N_OVERRUN_ERROR) + +#define N_ALL (N_DATA_READY | N_OUTPUT_LOWAT | N_BREAK | \ + N_PARITY_ERROR | N_FRAMING_ERROR | \ + N_OVERRUN_ERROR | N_DDCD | N_DCTS) + +/* Instruct the lower layer that the upper layer would like to be + * notified every t ticks when data is being received. If data is + * streaming in, the lower layer should buffer enough data that + * notification is not required more often than requested, and set a + * timeout so that notification does not occur less often than + * requested. If the lower layer does not support such operations, it + * should return 1, indicating that the upper layer should emulate these + * functions in software. + */ +#define DOWN_RX_TIMEOUT(p, t) \ + ((p)->sio_calldown->down_rx_timeout(p, t)) + +/* Set the output value of DTR */ +#define DOWN_SET_DTR(p, dtr) \ + ((p)->sio_calldown->down_set_DTR(p, dtr)) + +/* Set the output value of RTS */ +#define DOWN_SET_RTS(p, rts) \ + ((p)->sio_calldown->down_set_RTS(p, rts)) + +/* Query current input value of DCD */ +#define DOWN_QUERY_DCD(p) \ + ((p)->sio_calldown->down_query_DCD(p)) + +/* Query current input value of CTS */ +#define DOWN_QUERY_CTS(p) \ + ((p)->sio_calldown->down_query_CTS(p)) + +/* Set transmission protocol */ +#define DOWN_SET_PROTOCOL(p, proto) \ + ((p)->sio_calldown->down_set_protocol(p, proto)) + +/* Query mapped interface type */ +#define DOWN_GET_MAPID(p, arg) \ + ((p)->sio_calldown->down_mapid(p, arg)) + +/* Perform mapping to user address space */ +#define DOWN_MAP(p, vt, off) \ + ((p)->sio_calldown->down_map(p, vt, off)) + +/* Cleanup after mapped port is closed */ +#define DOWN_UNMAP(p) \ + ((p)->sio_calldown->down_unmap(p)) + +/* Set/Reset ioc3 sscr register */ +#define DOWN_SET_SSCR(p, arg, flag) \ + ((p)->sio_calldown->down_set_sscr(p, arg, flag)) + + +/* The callup struct. This is a set of entry points providing + * black-box access to the upper level kernel interface by the + * hardware handling code. These entry points are used for event + * notification + */ +struct serial_callup { + void (*up_data_ready) (sioport_t *port); + void (*up_output_lowat) (sioport_t *port); + void (*up_ncs) (sioport_t *port, int ncs); + void (*up_dDCD) (sioport_t *port, int dcd); + void (*up_dCTS) (sioport_t *port, int cts); + void (*up_detach) (sioport_t *port); +}; + +/* + * Macros used by the lower layer to access the upper layer for event + * notificaiton. These functions are generally called in response to + * an interrupt. Since the port lock may be released across UP calls, + * we must check the callup vector each time. However since the port + * lock is held during DOWN calls (from which these UP calls are made) + * there is no danger of the sio_callup vector being cleared between + * where it is checked and where it is used in the macro + */ + +/* Notify the upper layer that there are input bytes available and + * DOWN_READ may now be called + */ +#define UP_DATA_READY(p) \ + ((p)->sio_callup ? (p)->sio_callup->up_data_ready(p):(void)0) + +/* Notify the upper layer that the lower layer has freed up some + * output buffer space and DOWN_WRITE may now be called + */ +#define UP_OUTPUT_LOWAT(p) \ + ((p)->sio_callup ? (p)->sio_callup->up_output_lowat(p):(void)0) + +/* Notify the upper layer that the next char returned by DOWN_READ + * has the indicated special status. (see NCS_* above) + */ +#define UP_NCS(p, ncs) \ + ((p)->sio_callup ? (p)->sio_callup->up_ncs(p, ncs):(void)0) + +/* Notify the upper layer of the new DCD input value */ +#define UP_DDCD(p, dcd) \ + ((p)->sio_callup ? (p)->sio_callup->up_dDCD(p, dcd):(void)0) + +/* Notify the upper layer of the new CTS input value */ +#define UP_DCTS(p, cts) \ + ((p)->sio_callup ? (p)->sio_callup->up_dCTS(p, cts):(void)0) + +/* notify the upper layer that the lower layer hardware has been detached + * Since the port lock is NOT held when this macro is executed, we must + * guard against the sio_callup vector being cleared between when we check + * it and when we make the upcall, so we use a local copy. + */ +#define UP_DETACH(p) \ +{ \ + struct serial_callup *up; \ + if ((up = (p)->sio_callup)) \ + up->up_detach(p); \ +} + +/* Port locking protocol: + * Any time a DOWN call is made into one of the lower layer entry points, + * the corresponding port is already locked and remains locked throughout + * that downcall. When a lower layer routine makes an UP call, the port + * is assumed to be locked on entry to the upper layer routine, but the + * upper layer routine may release and reacquire the lock if it wishes. + * Thus the lower layer routine should not rely on the port lock being + * held across upcalls. Further, since the port may be disconnected + * any time the port lock is not held, an UP call may cause subsequent + * UP calls to become noops since the upcall vector will be zeroed when + * the port is closed. Thus, any lower layer routine making UP calls must + * be prepared to deal with the possibility that any UP calls it makes + * are noops. + * + * The only time a lower layer routine should manipulate the port lock + * is the lower layer interrupt handler, which should acquire the lock + * during its critical execution. + * + * Any function which assumes that the port is or isn't locked should + * use the function sio_port_islocked in an ASSERT statement to verify + * this assumption + */ + +#if DEBUG +extern int sio_port_islocked(sioport_t *); +#endif + +#define SIO_LOCK_PORT(port, flags) spin_lock_irqsave(&port->sio_lock, flags) +#define SIO_UNLOCK_PORT(port, flags) spin_unlock_irqrestore(&port->sio_lock, flags) + +/* kernel debugger support */ +#ifdef _LANGUAGE_C +extern int console_is_tport; +#define CNTRL_A '\001' +#if DEBUG +#ifndef DEBUG_CHAR +#define DEBUG_CHAR CNTRL_A +#endif +#else +#define DEBUG_CHAR CNTRL_A +#endif +#endif + + +extern void ioc4_serial_initport(sioport_t *, int); + + +/* flags to notify sio_initport() which type of nodes are + * desired for a particular hardware type + */ +#define NODE_TYPE_D 0x01 /* standard plain streams interface */ +#define NODE_TYPE_MODEM 0x02 /* modem streams interface */ +#define NODE_TYPE_FLOW_MODEM 0x04 /* modem/flow control streams */ +#define NODE_TYPE_CHAR 0x08 /* character interface */ +#define NODE_TYPE_MIDI 0x10 /* midi interface */ +#define NODE_TYPE_D_RS422 0x20 /* RS422 without flow control */ +#define NODE_TYPE_FLOW_RS422 0x40 /* RS422 with flow control */ + +#define NODE_TYPE_USER 0x80 /* user mapped interface */ +#define NODE_TYPE_TIMESTAMPED 0x100 /* user mapped interface */ + +#define NODE_TYPE_ALL_RS232 (NODE_TYPE_D | NODE_TYPE_MODEM | \ + NODE_TYPE_FLOW_MODEM | NODE_TYPE_CHAR | \ + NODE_TYPE_MIDI | NODE_TYPE_TIMESTAMPED) +#define NODE_TYPE_ALL_RS422 (NODE_TYPE_D_RS422 | NODE_TYPE_FLOW_RS422 | \ + NODE_TYPE_TIMESTAMPED) + +/* Flags for devflags field of miditype structure */ +#define MIDIDEV_EXTERNAL 0 /* lower half initializes devflags to this for an external device */ +#define MIDIDEV_INTERNAL 0x2 + +#define MIDIDEV_UNREGISTERED -1 /* Initialization for portidx field of miditype structure */ + +typedef struct miditype_s{ + int devflags; /* DEV_EXTERNAL, DEV_INTERNAL */ + int portidx; + void *midi_upper; + sioport_t *port; +} miditype_t; + +typedef struct tsiotype_s{ + void *tsio_upper; + sioport_t *port; + int portidx; + int urbidx; +} tsiotype_t; + +#endif /* _ASM_IA64_SN_SERIALIO_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/sgi.h linux-2.4.23-pre8/include/asm-ia64/sn/sgi.h --- linux-2.4.22/include/asm-ia64/sn/sgi.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/sgi.h 2003-10-22 22:47:30.000000000 +0000 @@ -7,14 +7,16 @@ * Copyright (C) 2000-2003 Silicon Graphics, Inc. All rights reserved. */ +/* + * This file is a bit of a dumping ground. A lot of things that don't really + * have a home, but which make life easier, end up here. + */ #ifndef _ASM_IA64_SN_SGI_H #define _ASM_IA64_SN_SGI_H #include - #include -#include /* for copy_??_user */ #include #include #ifdef CONFIG_HWGFS_FS @@ -25,14 +27,15 @@ typedef devfs_handle_t vertex_hdl_t; #endif -typedef int64_t __psint_t; /* needed by klgraph.c */ - -typedef enum { B_FALSE, B_TRUE } boolean_t; +/* Nice general name length that lots of people like to use */ +#ifndef MAXDEVNAME +#define MAXDEVNAME 256 +#endif /* -** Possible return values from graph routines. -*/ + * Possible return values from graph routines. + */ typedef enum graph_error_e { GRAPH_SUCCESS, /* 0 */ GRAPH_DUP, /* 1 */ @@ -44,87 +47,9 @@ GRAPH_IN_USE /* 7 */ } graph_error_t; -#define KM_SLEEP 0x0000 -#define KM_NOSLEEP 0x0001 /* needed by kmem_alloc_node(), kmem_zalloc() - * calls */ -#define VM_NOSLEEP 0x0001 /* needed kmem_alloc_node(), kmem_zalloc_node - * calls */ -#define XG_WIDGET_PART_NUM 0xC102 /* KONA/xt_regs.h XG_XT_PART_NUM_VALUE */ - -typedef uint64_t vhandl_t; - - -#define NBPP PAGE_SIZE -#define _PAGESZ PAGE_SIZE - -#ifndef MAXDEVNAME -#define MAXDEVNAME 256 -#endif - -#define HUB_PIO_CONVEYOR 0x1 #define CNODEID_NONE ((cnodeid_t)-1) -#define XTALK_PCI_PART_NUM "030-1275-" -#define kdebug 0 - - -#define COPYIN(a, b, c) copy_from_user(b,a,c) -#define COPYOUT(a, b, c) copy_to_user(b,a,c) - -#define BZERO(a,b) memset(a, 0, b) - -#define kern_malloc(x) kmalloc(x, GFP_KERNEL) -#define kern_free(x) kfree(x) - -typedef cpuid_t cpu_cookie_t; #define CPU_NONE (-1) -/* - * mutext support mapping - */ - -#define mutex_spinlock_init(s) spin_lock_init(s) -inline static unsigned long -mutex_spinlock(spinlock_t *sem) { - unsigned long flags = 0; -// spin_lock_irqsave(sem, flags); - spin_lock(sem); - return(flags); -} -// #define mutex_spinunlock(s,t) spin_unlock_irqrestore(s,t) -#define mutex_spinunlock(s,t) spin_unlock(s) - - -#define mutex_t struct semaphore -#define mutex_init(s) init_MUTEX(s) -#define mutex_init_locked(s) init_MUTEX_LOCKED(s) -#define mutex_lock(s) down(s) -#define mutex_unlock(s) up(s) - -#define io_splock(s) mutex_spinlock(s) -#define io_spunlock(s,t) spin_unlock(s) - -#define spin_lock_destroy(s) - -#if defined(DISABLE_ASSERT) -#define ASSERT(expr) -#define ASSERT_ALWAYS(expr) -#else -#define ASSERT(expr) do { \ - if(!(expr)) { \ - printk( "Assertion [%s] failed! %s:%s(line=%d)\n",\ - #expr,__FILE__,__FUNCTION__,__LINE__); \ - panic("Assertion panic\n"); \ - } } while(0) - -#define ASSERT_ALWAYS(expr) do {\ - if(!(expr)) { \ - printk( "Assertion [%s] failed! %s:%s(line=%d)\n",\ - #expr,__FILE__,__FUNCTION__,__LINE__); \ - panic("Assertion always panic\n"); \ - } } while(0) -#endif /* DISABLE_ASSERT */ - -#define PRINT_PANIC panic /* print_register() defs */ @@ -151,31 +76,28 @@ extern void print_register(unsigned long long, struct reg_desc *); -/****************************************** - * Definitions that do not exist in linux * - ******************************************/ - -#define DELAY(a) - -/************************************************ - * Routines redefined to use linux equivalents. * - ************************************************/ - -/* #define FIXME(s) printk("FIXME: [ %s ] in %s at %s:%d\n", s, __FUNCTION__, __FILE__, __LINE__) */ - -#define FIXME(s) - -/* move to stubs.c yet */ -#define dev_to_vhdl(dev) 0 -#define get_timestamp() 0 -#define us_delay(a) -#define v_mapphys(a,b,c) 0 // printk("Fixme: v_mapphys - soft->base 0x%p\n", b); -#define splhi() 0 -#define splx(s) - -extern void * snia_kmem_alloc_node(register size_t, register int, cnodeid_t); -extern void * snia_kmem_zalloc(size_t, int); -extern void * snia_kmem_zalloc_node(register size_t, register int, cnodeid_t ); -extern int is_specified(char *); + +/* + * No code is complete without an Assertion macro + */ + +#if defined(DISABLE_ASSERT) +#define ASSERT(expr) +#define ASSERT_ALWAYS(expr) +#else +#define ASSERT(expr) do { \ + if(!(expr)) { \ + printk( "Assertion [%s] failed! %s:%s(line=%d)\n",\ + #expr,__FILE__,__FUNCTION__,__LINE__); \ + panic("Assertion panic\n"); \ + } } while(0) + +#define ASSERT_ALWAYS(expr) do {\ + if(!(expr)) { \ + printk( "Assertion [%s] failed! %s:%s(line=%d)\n",\ + #expr,__FILE__,__FUNCTION__,__LINE__); \ + panic("Assertion always panic\n"); \ + } } while(0) +#endif /* DISABLE_ASSERT */ #endif /* _ASM_IA64_SN_SGI_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/simulator.h linux-2.4.23-pre8/include/asm-ia64/sn/simulator.h --- linux-2.4.22/include/asm-ia64/sn/simulator.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/simulator.h 2003-10-22 22:49:00.000000000 +0000 @@ -16,11 +16,13 @@ #define IS_RUNNING_ON_SIMULATOR() ({long sn; asm("mov %0=cpuid[%1]" : "=r"(sn) : "r"(2)); sn == SNMAGIC;}) #define SIMULATOR_SLEEP() asm("nop.i 0x8beef") +#define SIMULATOR_PAUSE() asm("nop.i 0x9beef") #else #define IS_RUNNING_ON_SIMULATOR() (0) #define SIMULATOR_SLEEP() +#define SIMULATOR_PAUSE() #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/sn2/arch.h linux-2.4.23-pre8/include/asm-ia64/sn/sn2/arch.h --- linux-2.4.22/include/asm-ia64/sn/sn2/arch.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/sn2/arch.h 2003-10-22 22:49:41.000000000 +0000 @@ -28,7 +28,7 @@ * Effectively, it's the maximum number of compact node ids (cnodeid_t). * This is not necessarily the same as MAX_NASIDS. */ -#define MAX_COMPACT_NODES 128 +#define MAX_COMPACT_NODES 2048 /* * MAX_REGIONS refers to the maximum number of hardware partitioned regions. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/sn2/io.h linux-2.4.23-pre8/include/asm-ia64/sn/sn2/io.h --- linux-2.4.22/include/asm-ia64/sn/sn2/io.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/sn2/io.h 2003-10-22 22:49:56.000000000 +0000 @@ -9,7 +9,7 @@ #ifndef _ASM_SN_SN2_IO_H #define _ASM_SN_SN2_IO_H -extern void * sn_io_addr(unsigned long port); /* Forward definition */ +extern void * sn_io_addr(unsigned long port) __attribute__ ((__const__)); /* Forward definition */ extern void sn_mmiob(void); /* Forward definition */ #define __sn_mf_a() __asm__ __volatile__ ("mf.a" ::: "memory") diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/sn2/shubio.h linux-2.4.23-pre8/include/asm-ia64/sn/sn2/shubio.h --- linux-2.4.22/include/asm-ia64/sn/sn2/shubio.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/sn2/shubio.h 2003-10-22 22:48:26.000000000 +0000 @@ -3629,13 +3629,8 @@ extern int hub_error_devenable(vertex_hdl_t, int, int); extern int hub_dma_enabled(vertex_hdl_t); -/* hubdev */ -extern void hubdev_init(void); -extern void hubdev_register(int (*attach_method)(vertex_hdl_t)); -extern int hubdev_unregister(int (*attach_method)(vertex_hdl_t)); -extern int hubdev_docallouts(vertex_hdl_t hub); - extern caddr_t hubdev_prombase_get(vertex_hdl_t hub); + extern cnodeid_t hubdev_cnodeid_get(vertex_hdl_t hub); #endif /* __ASSEMBLY__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/sn2/sn_private.h linux-2.4.23-pre8/include/asm-ia64/sn/sn2/sn_private.h --- linux-2.4.22/include/asm-ia64/sn/sn2/sn_private.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/sn2/sn_private.h 2003-10-22 22:49:35.000000000 +0000 @@ -24,7 +24,6 @@ extern __psunsigned_t get_master_bridge_base(void); extern void set_master_bridge_base(void); extern int check_nasid_equiv(nasid_t, nasid_t); -extern nasid_t get_console_nasid(void); extern char get_console_pcislot(void); extern int is_master_baseio_nasid_widget(nasid_t test_nasid, xwidgetnum_t test_wid); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/sn_sal.h linux-2.4.23-pre8/include/asm-ia64/sn/sn_sal.h --- linux-2.4.22/include/asm-ia64/sn/sn_sal.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/sn_sal.h 2003-10-22 22:49:54.000000000 +0000 @@ -16,6 +16,7 @@ #include #include #include +#include // SGI Specific Calls @@ -597,8 +598,16 @@ sn_change_memprotect(u64 paddr, u64 len, u64 perms, u64 *nasid_array) { struct ia64_sal_retval ret_stuff; - SAL_CALL(ret_stuff, SN_SAL_MEMPROTECT, paddr, len, nasid_array, + int cnodeid; + unsigned long irq_flags; + + cnodeid = nasid_to_cnodeid(get_node_number(paddr)); + spin_lock(&NODEPDA(cnodeid)->bist_lock); + local_irq_save(irq_flags); + SAL_CALL_NOLOCK(ret_stuff, SN_SAL_MEMPROTECT, paddr, len, nasid_array, perms, 0, 0, 0); + local_irq_restore(irq_flags); + spin_unlock(&NODEPDA(cnodeid)->bist_lock); return ret_stuff.status; } #define SN_MEMPROT_ACCESS_CLASS_0 0x14a080 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/uart16550.h linux-2.4.23-pre8/include/asm-ia64/sn/uart16550.h --- linux-2.4.22/include/asm-ia64/sn/uart16550.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/uart16550.h 2003-10-22 22:49:16.000000000 +0000 @@ -56,6 +56,9 @@ #define LCR_BITS7 0x02 /* 7 bits per char */ #define LCR_BITS8 0x03 /* 8 bits per char */ +#define LCR_1_STOP_BITS 0x00 /* 1 stop bit */ +#define LCR_2_STOP_BITS 0x04 /* 2 stop bits */ + #define LCR_MASK_BITS_CHAR 0x03 #define LCR_MASK_STOP_BITS 0x04 #define LCR_MASK_PARITY_BITS 0x18 @@ -143,6 +146,9 @@ #define DU_RTS_ASSERT(x) ((x) |= MCR_RTS) #define DU_RTS_DEASSERT(x) ((x) &= ~MCR_RTS) +#define SER_DIVISOR(x, clk) (((clk) + (x) * 8) / ((x) * 16)) +#define DIVISOR_TO_BAUD(div, clk) ((clk) / 16 / (div)) + /* * ioctl(fd, I_STR, arg) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/xtalk/xtalk.h linux-2.4.23-pre8/include/asm-ia64/sn/xtalk/xtalk.h --- linux-2.4.22/include/asm-ia64/sn/xtalk/xtalk.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/xtalk/xtalk.h 2003-10-22 22:49:06.000000000 +0000 @@ -10,7 +10,9 @@ #define _ASM_SN_XTALK_XTALK_H #include +#ifdef __KERNEL__ #include "asm/sn/sgi.h" +#endif /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/sn/xtalk/xwidget.h linux-2.4.23-pre8/include/asm-ia64/sn/xtalk/xwidget.h --- linux-2.4.22/include/asm-ia64/sn/xtalk/xwidget.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/sn/xtalk/xwidget.h 2003-10-22 22:47:27.000000000 +0000 @@ -13,10 +13,14 @@ * xwidget.h - generic crosstalk widget header file */ +#ifdef __KERNEL__ #include #ifndef __ASSEMBLY__ #include #endif /* __ASSEMBLY__ */ +#else +#include +#endif #ifdef LITTLE_ENDIAN #define WIDGET_ID 0x00 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/spinlock.h linux-2.4.23-pre8/include/asm-ia64/spinlock.h --- linux-2.4.22/include/asm-ia64/spinlock.h 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/spinlock.h 2003-10-22 22:47:40.000000000 +0000 @@ -74,6 +74,12 @@ #define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 } #define spin_lock_init(x) ((x)->lock = 0) +#ifdef GAS_HAS_HINT_INSN +#define HINT_PAUSE ";; (p7) hint @pause\n" +#else +#define HINT_PAUSE +#endif + /* * Streamlined test_and_set_bit(0, (x)). We use test-and-test-and-set * rather than a simple xchg to avoid writing the cache-line when @@ -87,6 +93,7 @@ "ld4 r2 = [%0]\n" \ ";;\n" \ "cmp4.eq p0,p7 = r0,r2\n" \ + HINT_PAUSE \ "(p7) br.cond.spnt.few 1b \n" \ "cmpxchg4.acq r2 = [%0], r29, ar.ccv\n" \ ";;\n" \ @@ -115,20 +122,21 @@ int tmp = 0; \ __asm__ __volatile__ ("1:\tfetchadd4.acq %0 = [%1], 1\n" \ ";;\n" \ - "tbit.nz p6,p0 = %0, 31\n" \ - "(p6) br.cond.sptk.few 2f\n" \ + "tbit.nz p7,p0 = %0, 31\n" \ + "(p7) br.cond.sptk.few 2f\n" \ ".section .text.lock,\"ax\"\n" \ "2:\tfetchadd4.rel %0 = [%1], -1\n" \ ";;\n" \ "3:\tld4.acq %0 = [%1]\n" \ ";;\n" \ - "tbit.nz p6,p0 = %0, 31\n" \ - "(p6) br.cond.sptk.few 3b\n" \ + "tbit.nz p7,p0 = %0, 31\n" \ + HINT_PAUSE \ + "(p7) br.cond.sptk.few 3b\n" \ "br.cond.sptk.few 1b\n" \ ";;\n" \ ".previous\n" \ : "=&r" (tmp) \ - : "r" (rw) : "p6", "memory"); \ + : "r" (rw) : "p7", "memory"); \ } while(0) #define read_unlock(rw) \ @@ -150,6 +158,7 @@ "ld4 r2 = [%0]\n" \ ";;\n" \ "cmp4.eq p0,p7 = r0,r2\n" \ + HINT_PAUSE \ "(p7) br.cond.spnt.few 1b \n" \ "cmpxchg4.acq r2 = [%0], r29, ar.ccv\n" \ ";;\n" \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/system.h linux-2.4.23-pre8/include/asm-ia64/system.h --- linux-2.4.22/include/asm-ia64/system.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/system.h 2003-10-22 22:48:38.000000000 +0000 @@ -104,7 +104,7 @@ #define set_mb(var, value) do { (var) = (value); mb(); } while (0) #define set_wmb(var, value) do { (var) = (value); mb(); } while (0) -#define safe_halt() ia64_pal_halt(1) /* PAL_HALT */ +#define safe_halt() ia64_pal_halt_light() /* PAL_HALT_LIGHT */ /* * The group barrier in front of the rsm & ssm are necessary to ensure diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/topology.h linux-2.4.23-pre8/include/asm-ia64/topology.h --- linux-2.4.22/include/asm-ia64/topology.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/topology.h 2003-10-22 22:47:41.000000000 +0000 @@ -0,0 +1,63 @@ +/* + * linux/include/asm-ia64/topology.h + * + * Copyright (C) 2002, Erich Focht, NEC + * + * 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 Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ +#ifndef _ASM_IA64_TOPOLOGY_H +#define _ASM_IA64_TOPOLOGY_H + +#include +#include +#include + +#ifdef CONFIG_NUMA +/* + * Returns the number of the node containing CPU 'cpu' + */ +#define __cpu_to_node(cpu) (int)(cpu_to_node_map[cpu]) + +/* + * Returns a bitmask of CPUs on Node 'node'. + */ +#define __node_to_cpu_mask(node) (node_to_cpu_mask[node]) + +#else +#define __cpu_to_node(cpu) (0) +#define __node_to_cpumask(node) (&phys_cpu_present_map) +#endif + +/* + * Returns the number of the node containing MemBlk 'memblk' + */ +#ifdef CONFIG_ACPI_NUMA +#define __memblk_to_node(memblk) (node_memblk[memblk].nid) +#else +#define __memblk_to_node(memblk) (memblk) +#endif + +/* + * Returns the number of the node containing Node 'nid'. + * Not implemented here. Multi-level hierarchies detected with + * the help of node_distance(). + */ +#define __parent_node(nid) (nid) + +/* + * Returns the number of the first CPU on Node 'node'. + */ +#define __node_to_first_cpu(node) (__ffs(__node_to_cpu_mask(node))) + +/* + * Returns the number of the first MemBlk on Node 'node' + * Should be fixed when IA64 discontigmem goes in. + */ +#define __node_to_memblk(node) (node) + +#endif /* _ASM_IA64_TOPOLOGY_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/unwind.h linux-2.4.23-pre8/include/asm-ia64/unwind.h --- linux-2.4.22/include/asm-ia64/unwind.h 2003-08-25 11:44:43.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/unwind.h 2003-10-22 22:47:29.000000000 +0000 @@ -26,7 +26,9 @@ UNW_AR_EC, UNW_AR_FPSR, UNW_AR_RSC, - UNW_AR_CCV + UNW_AR_CCV, + UNW_AR_CSD, + UNW_AR_SSD }; /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ia64/ustack.h linux-2.4.23-pre8/include/asm-ia64/ustack.h --- linux-2.4.22/include/asm-ia64/ustack.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ia64/ustack.h 2003-10-22 22:49:12.000000000 +0000 @@ -0,0 +1,16 @@ +#ifndef _ASM_IA64_USTACK_H +#define _ASM_IA64_USTACK_H + +/* + * Constants for the user stack size + */ + +#include + +/* The absolute hard limit for stack size is 1/2 of the mappable space in the region */ +#define MAX_USER_STACK_SIZE (RGN_MAP_LIMIT/2) +/* Make a default stack size of 2GB */ +#define DEFAULT_USER_STACK_SIZE (1UL << 31) +#define STACK_TOP (0x6000000000000000UL + RGN_MAP_LIMIT) + +#endif /* _ASM_IA64_USTACK_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-m68k/dvma.h linux-2.4.23-pre8/include/asm-m68k/dvma.h --- linux-2.4.22/include/asm-m68k/dvma.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-m68k/dvma.h 2003-10-22 22:49:05.000000000 +0000 @@ -110,7 +110,7 @@ /* Linux DMA information structure, filled during probe. */ struct Linux_SBus_DMA { struct Linux_SBus_DMA *next; - struct linux_sbus_device *SBus_dev; + struct sbus_dev *SBus_dev; struct sparc_dma_registers *regs; /* Status, misc info */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-m68k/mc146818rtc.h linux-2.4.23-pre8/include/asm-m68k/mc146818rtc.h --- linux-2.4.22/include/asm-m68k/mc146818rtc.h 2001-10-25 20:53:55.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-m68k/mc146818rtc.h 2003-10-22 22:47:51.000000000 +0000 @@ -4,37 +4,12 @@ #ifndef _ASM_MC146818RTC_H #define _ASM_MC146818RTC_H -#include -#include - #ifdef CONFIG_ATARI /* RTC in Atari machines */ #include -#include -#include -#define RTC_HAS_IRQ (ATARIHW_PRESENT(TT_MFP)) -#define RTC_IRQ IRQ_TT_MFP_RTC -#define RTC_IRQ_FLAGS IRQ_TYPE_FAST -#define RTC_PORT(x) (TT_RTC_BAS + 2*(x)) -#define RTC_ALWAYS_BCD 0 /* TOS uses binary mode, Linux should be able - * to deal with both modes */ -#define RTC_CHECK_DRIVER_INIT() (MACH_IS_ATARI && ATARIHW_PRESENT(TT_CLK)) -#define RTC_MACH_INIT() \ - do { \ - epoch = atari_rtc_year_offset + 1900; \ - if (RTC_HAS_IRQ) \ - /* select RTC int on H->L edge */ \ - tt_mfp.active_edge &= ~0x40; \ - } while(0) -#define RTC_MACH_EXIT() - -/* On Atari, the year was stored with base 1970 in old TOS versions (before - * 3.06). Later, Atari recognized that this broke leap year recognition, and - * changed the base to 1968. Medusa and Hades always use the new version. */ -#define RTC_CENTURY_SWITCH -1 /* no century switch */ -#define RTC_MINYEAR epoch +#define RTC_PORT(x) (TT_RTC_BAS + 2*(x)) #define CMOS_READ(addr) ({ \ atari_outb_p((addr),RTC_PORT(0)); \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-m68k/pci.h linux-2.4.23-pre8/include/asm-m68k/pci.h --- linux-2.4.22/include/asm-m68k/pci.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-m68k/pci.h 2003-10-22 22:48:53.000000000 +0000 @@ -34,6 +34,7 @@ }; #define pcibios_assign_all_busses() 0 +#define pcibios_scan_all_fns() 0 extern inline void pcibios_set_master(struct pci_dev *dev) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-m68k/processor.h linux-2.4.23-pre8/include/asm-m68k/processor.h --- linux-2.4.22/include/asm-m68k/processor.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-m68k/processor.h 2003-10-22 22:49:14.000000000 +0000 @@ -155,6 +155,6 @@ #define init_task (init_task_union.task) #define init_stack (init_task_union.stack) -#define cpu_relax() do { } while (0) +#define cpu_relax() barrier() #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-m68k/system.h linux-2.4.23-pre8/include/asm-m68k/system.h --- linux-2.4.22/include/asm-m68k/system.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-m68k/system.h 2003-10-22 22:49:13.000000000 +0000 @@ -42,8 +42,9 @@ register void *_next __asm__ ("a1") = (next); \ register void *_last __asm__ ("d1"); \ __asm__ __volatile__("jbsr " SYMBOL_NAME_STR(resume) \ - : "=d" (_last) : "a" (_prev), "a" (_next) \ - : "d0", /* "d1", */ "d2", "d3", "d4", "d5", "a0", "a1"); \ + : "=a" (_prev), "=a" (_next), "=d" (_last) \ + : "0" (_prev), "1" (_next) \ + : "d0", "d2", "d3", "d4", "d5"); \ (last) = _last; \ } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-mips/pci.h linux-2.4.23-pre8/include/asm-mips/pci.h --- linux-2.4.22/include/asm-mips/pci.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-mips/pci.h 2003-10-22 22:49:11.000000000 +0000 @@ -19,6 +19,7 @@ #else #define pcibios_assign_all_busses() 0 #endif +#define pcibios_scan_all_fns() 0 #define PCIBIOS_MIN_IO 0x1000 #define PCIBIOS_MIN_MEM 0x10000000 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-mips64/pci.h linux-2.4.23-pre8/include/asm-mips64/pci.h --- linux-2.4.22/include/asm-mips64/pci.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-mips64/pci.h 2003-10-22 22:47:41.000000000 +0000 @@ -19,6 +19,7 @@ #else #define pcibios_assign_all_busses() 0 #endif +#define pcibios_scan_all_fns() 0 #define PCIBIOS_MIN_IO 0x1000 #define PCIBIOS_MIN_MEM 0x10000000 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-parisc/pci.h linux-2.4.23-pre8/include/asm-parisc/pci.h --- linux-2.4.22/include/asm-parisc/pci.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-parisc/pci.h 2003-10-22 22:49:14.000000000 +0000 @@ -259,6 +259,7 @@ ** to zero for legacy platforms and one for PAT platforms. */ #define pcibios_assign_all_busses() (pdc_type == PDC_TYPE_PAT) +#define pcibios_scan_all_fns() 0 #define PCIBIOS_MIN_IO 0x10 #define PCIBIOS_MIN_MEM 0x1000 /* NBPG - but pci/setup-res.c dies */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/cache.h linux-2.4.23-pre8/include/asm-ppc/cache.h --- linux-2.4.22/include/asm-ppc/cache.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/cache.h 2003-10-22 22:49:46.000000000 +0000 @@ -41,6 +41,8 @@ extern void flush_dcache_range(unsigned long start, unsigned long stop); extern void invalidate_dcache_range(unsigned long start, unsigned long stop); extern void clean_dcache_range(unsigned long start, unsigned long stop); +extern void flush_dcache_all(void); + #endif /* __ASSEMBLY__ */ /* prep registers for L2 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/commproc.h linux-2.4.23-pre8/include/asm-ppc/commproc.h --- linux-2.4.22/include/asm-ppc/commproc.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/commproc.h 2003-10-22 22:49:03.000000000 +0000 @@ -466,6 +466,23 @@ #define SICR_ENET_CLKRT ((uint)0x0000003d) #endif /* CONFIG_RPXCLASSIC */ +/*** D-BOX2 ***********************************************/ + +#ifdef CONFIG_DBOX2 + +#define PA_ENET_RXD ((ushort)0x0004) +#define PA_ENET_TXD ((ushort)0x0008) +#define PA_ENET_RCLK ((ushort)0x0200) +#define PA_ENET_TCLK ((ushort)0x0800) + +#define PC_ENET_TENA ((ushort)0x0002) +#define PC_ENET_CLSN ((ushort)0x0040) +#define PC_ENET_RENA ((ushort)0x0080) + +#define SICR_ENET_MASK ((uint)0x0000ff00) +#define SICR_ENET_CLKRT ((uint)0x00003d00) +#endif /* CONFIG_DBOX2 */ + /*** TQM823L, TQM850L ***********************************************/ #if defined(CONFIG_TQM823L) || defined(CONFIG_TQM850L) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/cpm_8260.h linux-2.4.23-pre8/include/asm-ppc/cpm_8260.h --- linux-2.4.22/include/asm-ppc/cpm_8260.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/cpm_8260.h 2003-10-22 22:48:53.000000000 +0000 @@ -195,7 +195,7 @@ /* SMC uart mode register (Internal memory map). */ -#define SMCMR_REN ((ushort)0x0001) +#define SMCMR_REN ((ushort)0x0001) #define SMCMR_TEN ((ushort)0x0002) #define SMCMR_DM ((ushort)0x000c) #define SMCMR_SM_GCI ((ushort)0x0000) @@ -212,10 +212,12 @@ /* SMC Event and Mask register. */ -#define SMCM_TXE ((unsigned char)0x10) -#define SMCM_BSY ((unsigned char)0x04) -#define SMCM_TX ((unsigned char)0x02) -#define SMCM_RX ((unsigned char)0x01) +#define SMCM_BRKE ((unsigned char)0x40) /* When in UART Mode */ +#define SMCM_BRK ((unsigned char)0x10) /* When in UART Mode */ +#define SMCM_TXE ((unsigned char)0x10) +#define SMCM_BSY ((unsigned char)0x04) +#define SMCM_TX ((unsigned char)0x02) +#define SMCM_RX ((unsigned char)0x01) /* Baud rate generators. */ @@ -314,10 +316,10 @@ /* SCC Event and Mask register. */ -#define SCCM_TXE ((unsigned char)0x10) -#define SCCM_BSY ((unsigned char)0x04) -#define SCCM_TX ((unsigned char)0x02) -#define SCCM_RX ((unsigned char)0x01) +#define SCCM_TXE ((unsigned char)0x10) +#define SCCM_BSY ((unsigned char)0x04) +#define SCCM_TX ((unsigned char)0x02) +#define SCCM_RX ((unsigned char)0x01) typedef struct scc_param { ushort scc_rbase; /* Rx Buffer descriptor base address */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/highmem.h linux-2.4.23-pre8/include/asm-ppc/highmem.h --- linux-2.4.22/include/asm-ppc/highmem.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/highmem.h 2003-10-22 22:48:40.000000000 +0000 @@ -41,13 +41,13 @@ * easily, subsequent pte tables have to be allocated in one physical * chunk of RAM. */ -#define PKMAP_BASE (0xfe000000UL) -#define LAST_PKMAP 1024 +#define PKMAP_BASE CONFIG_HIGHMEM_START +#define LAST_PKMAP PTRS_PER_PTE #define LAST_PKMAP_MASK (LAST_PKMAP-1) #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) -#define KMAP_FIX_BEGIN (0xfe400000UL) +#define KMAP_FIX_BEGIN (PKMAP_BASE + 0x00400000UL) extern void *kmap_high(struct page *page, int nonblock); extern void kunmap_high(struct page *page); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/ibm44x.h linux-2.4.23-pre8/include/asm-ppc/ibm44x.h --- linux-2.4.22/include/asm-ppc/ibm44x.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/ibm44x.h 2003-10-22 22:49:12.000000000 +0000 @@ -0,0 +1,435 @@ +/* + * include/asm-ppc/ibm44x.h + * + * PPC44x definitions + * + * Matt Porter + * + * Copyright 2002-2003 MontaVista Software Inc. + * + * 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. + */ + +#ifdef __KERNEL__ +#ifndef __ASM_IBM44x_H__ +#define __ASM_IBM44x_H__ + +#include + +#ifndef __ASSEMBLY__ +/* + * Data structure defining board information maintained by the boot + * ROM on IBM's "Ebony" evaluation board. An effort has been made to + * keep the field names consistent with the 8xx 'bd_t' board info + * structures. + * + * Ebony firmware stores MAC addresses in the F/W VPD area. The + * firmware must store the other dynamic values in NVRAM like on + * the previous 40x systems so they should be accessible if we + * really want them. + */ +typedef struct board_info { + unsigned char bi_enetaddr[2][6]; /* EMAC addresses */ + unsigned int bi_opb_busfreq; /* OPB clock in Hz */ + int bi_iic_fast[2]; /* Use fast i2c mode */ +} bd_t; +#endif /* __ASSEMBLY__ */ + +#ifndef NR_BOARD_IRQS +#define NR_BOARD_IRQS 0 +#endif + +#define _IO_BASE isa_io_base +#define _ISA_MEM_BASE isa_mem_base +#define PCI_DRAM_OFFSET pci_dram_offset + +/* TLB entry offset/size used for pinning kernel lowmem */ +#define PPC44x_PIN_SHIFT 28 +#define PPC44x_PIN_SIZE (1 << PPC44x_PIN_SHIFT) + +/* Lowest TLB slot consumed by the default pinned TLBs */ +#define PPC44x_LOW_SLOT 62 + +/* + * Standard 4GB "page" definitions + */ +#define PPC44x_IO_PAGE 0x0000000100000000ULL +#define PPC44x_PCICFG_PAGE 0x0000000200000000ULL +#define PPC44x_PCIIO_PAGE PPC44x_PCICFG_PAGE +#define PPC44x_PCIMEM_PAGE 0x0000000300000000ULL + +/* + * 36-bit trap ranges + */ +#define PPC44x_IO_LO 0x40000000 +#define PPC44x_IO_HI 0x40001000 +#define PPC44x_PCICFG_LO 0x0ec00000 +#define PPC44x_PCICFG_HI 0x0ec7ffff +#define PPC44x_PCIMEM_LO 0x80002000 +#define PPC44x_PCIMEM_HI 0xffffffff + +/* + * The "residual" board information structure the boot loader passes + * into the kernel. + */ +#ifndef __ASSEMBLY__ + +/* + * SPRN definitions + */ +#define SPRN_CPC0_GPIO 0xe5/BEARLRL + +/* + * DCRN definitions + */ + +#ifdef CONFIG_440GX +/* SDRs */ +#define DCRN_SDR_CONFIG_ADDR 0xe +#define DCRN_SDR_CONFIG_DATA 0xf +#define DCRN_SDR_PFC0 0x4100 +#define DCRN_SDR_PFC1 0x4101 +#define DCRN_SDR_MFR 0x4300 +#define DCRN_SDR_MFR_TAH0 0x80000000 /* TAHOE0 Enable */ +#define DCRN_SDR_MFR_TAH1 0x40000000 /* TAHOE1 Enable */ +#define DCRN_SDR_MFR_PCM 0x10000000 /* PPC440GP irq compat mode */ +#define DCRN_SDR_MFR_ECS 0x08000000 /* EMAC int clk */ +#define DCRN_SDR_MFR_T0TXFL 0x00080000 +#define DCRN_SDR_MFR_T0TXFH 0x00040000 +#define DCRN_SDR_MFR_T1TXFL 0x00020000 +#define DCRN_SDR_MFR_T1TXFH 0x00010000 +#define DCRN_SDR_MFR_E0TXFL 0x00008000 +#define DCRN_SDR_MFR_E0TXFH 0x00004000 +#define DCRN_SDR_MFR_E0RXFL 0x00002000 +#define DCRN_SDR_MFR_E0RXFH 0x00001000 +#define DCRN_SDR_MFR_E1TXFL 0x00000800 +#define DCRN_SDR_MFR_E1TXFH 0x00000400 +#define DCRN_SDR_MFR_E1RXFL 0x00000200 +#define DCRN_SDR_MFR_E1RXFH 0x00000100 +#define DCRN_SDR_MFR_E2TXFL 0x00000080 +#define DCRN_SDR_MFR_E2TXFH 0x00000040 +#define DCRN_SDR_MFR_E2RXFL 0x00000020 +#define DCRN_SDR_MFR_E2RXFH 0x00000010 +#define DCRN_SDR_MFR_E3TXFL 0x00000008 +#define DCRN_SDR_MFR_E3TXFH 0x00000004 +#define DCRN_SDR_MFR_E3RXFL 0x00000002 +#define DCRN_SDR_MFR_E3RXFH 0x00000001 + +/* SDR read/write helper macros */ +#define SDR_READ(offset) ({\ + mtdcr(DCRN_SDR_CONFIG_ADDR, offset); \ + mfdcr(DCRN_SDR_CONFIG_DATA);}) +#define SDR_WRITE(offset, data) ({\ + mtdcr(DCRN_SDR_CONFIG_ADDR, offset); \ + mtdcr(DCRN_SDR_CONFIG_DATA,data);}) +#endif /* CONFIG_440GX */ + +/* Base DCRNs */ +#define DCRN_DMA0_BASE 0x100 +#define DCRN_DMA1_BASE 0x108 +#define DCRN_DMA2_BASE 0x110 +#define DCRN_DMA3_BASE 0x118 +#define DCRN_DMASR_BASE 0x120 +#define DCRNCAP_DMA_SG 1 /* have DMA scatter/gather capability */ +#define DCRN_MAL_BASE 0x180 + +/* UIC */ +#define DCRN_UIC0_BASE 0xc0 +#define DCRN_UIC1_BASE 0xd0 +#define UIC0 DCRN_UIC0_BASE +#define UIC1 DCRN_UIC1_BASE + +#define DCRN_UIC_SR(base) (base + 0x0) +#define DCRN_UIC_ER(base) (base + 0x2) +#define DCRN_UIC_CR(base) (base + 0x3) +#define DCRN_UIC_PR(base) (base + 0x4) +#define DCRN_UIC_TR(base) (base + 0x5) +#define DCRN_UIC_MSR(base) (base + 0x6) +#define DCRN_UIC_VR(base) (base + 0x7) +#define DCRN_UIC_VCR(base) (base + 0x8) + +#define UIC0_UIC1NC 30 /* UIC1 non-critical interrupt */ +#define UIC0_UIC1CR 31 /* UIC1 critical interrupt */ + +/* 440GP MAL DCRs */ +#define DCRN_MALCR(base) (base + 0x0) /* Configuration */ +#define DCRN_MALESR(base) (base + 0x1) /* Error Status */ +#define DCRN_MALIER(base) (base + 0x2) /* Interrupt Enable */ +#define DCRN_MALTXCASR(base) (base + 0x4) /* Tx Channel Active Set */ +#define DCRN_MALTXCARR(base) (base + 0x5) /* Tx Channel Active Reset */ +#define DCRN_MALTXEOBISR(base) (base + 0x6) /* Tx End of Buffer Interrupt Status */ +#define DCRN_MALTXDEIR(base) (base + 0x7) /* Tx Descriptor Error Interrupt */ +#define DCRN_MALRXCASR(base) (base + 0x10) /* Rx Channel Active Set */ +#define DCRN_MALRXCARR(base) (base + 0x11) /* Rx Channel Active Reset */ +#define DCRN_MALRXEOBISR(base) (base + 0x12) /* Rx End of Buffer Interrupt Status */ +#define DCRN_MALRXDEIR(base) (base + 0x13) /* Rx Descriptor Error Interrupt */ +#define DCRN_MALTXCTP0R(base) (base + 0x20) /* Channel Tx 0 Channel Table Pointer */ +#define DCRN_MALTXCTP1R(base) (base + 0x21) /* Channel Tx 1 Channel Table Pointer */ +#define DCRN_MALTXCTP2R(base) (base + 0x22) /* Channel Tx 2 Channel Table Pointer */ +#define DCRN_MALTXCTP3R(base) (base + 0x23) /* Channel Tx 3 Channel Table Pointer */ +#define DCRN_MALRXCTP0R(base) (base + 0x40) /* Channel Rx 0 Channel Table Pointer */ +#define DCRN_MALRXCTP1R(base) (base + 0x41) /* Channel Rx 1 Channel Table Pointer */ +#define DCRN_MALRCBS0(base) (base + 0x60) /* Channel Rx 0 Channel Buffer Size */ +#define DCRN_MALRCBS1(base) (base + 0x61) /* Channel Rx 1 Channel Buffer Size */ + +/* Compatibility DCRN's */ +#define DCRN_MALRXCTP2R(base) ((base) + 0x42) /* Channel Rx 2 Channel Table Pointer */ +#define DCRN_MALRXCTP3R(base) ((base) + 0x43) /* Channel Rx 3 Channel Table Pointer */ +#define DCRN_MALTXCTP4R(base) ((base) + 0x24) /* Channel Tx 4 Channel Table Pointer */ +#define DCRN_MALTXCTP5R(base) ((base) + 0x25) /* Channel Tx 5 Channel Table Pointer */ +#define DCRN_MALTXCTP6R(base) ((base) + 0x26) /* Channel Tx 6 Channel Table Pointer */ +#define DCRN_MALTXCTP7R(base) ((base) + 0x27) /* Channel Tx 7 Channel Table Pointer */ +#define DCRN_MALRCBS2(base) ((base) + 0x62) /* Channel Rx 2 Channel Buffer Size */ +#define DCRN_MALRCBS3(base) ((base) + 0x63) /* Channel Rx 3 Channel Buffer Size */ + + +#define MALCR_MMSR 0x80000000 /* MAL Software reset */ +#define MALCR_PLBP_1 0x00400000 /* MAL reqest priority: */ +#define MALCR_PLBP_2 0x00800000 /* lowsest is 00 */ +#define MALCR_PLBP_3 0x00C00000 /* highest */ +#define MALCR_GA 0x00200000 /* Guarded Active Bit */ +#define MALCR_OA 0x00100000 /* Ordered Active Bit */ +#define MALCR_PLBLE 0x00080000 /* PLB Lock Error Bit */ +#define MALCR_PLBLT_1 0x00040000 /* PLB Latency Timer */ +#define MALCR_PLBLT_2 0x00020000 +#define MALCR_PLBLT_3 0x00010000 +#define MALCR_PLBLT_4 0x00008000 +#ifdef CONFIG_440GP +#define MALCR_PLBLT_DEFAULT 0x00330000 /* PLB Latency Timer default */ +#else +#define MALCR_PLBLT_DEFAULT 0x00ff0000 /* PLB Latency Timer default */ +#endif +#define MALCR_PLBB 0x00004000 /* PLB Burst Deactivation Bit */ +#define MALCR_OPBBL 0x00000080 /* OPB Lock Bit */ +#define MALCR_EOPIE 0x00000004 /* End Of Packet Interrupt Enable */ +#define MALCR_LEA 0x00000002 /* Locked Error Active */ +#define MALCR_MSD 0x00000001 /* MAL Scroll Descriptor Bit */ +/* DCRN_MALESR */ +#define MALESR_EVB 0x80000000 /* Error Valid Bit */ +#define MALESR_CIDRX 0x40000000 /* Channel ID Receive */ +#define MALESR_DE 0x00100000 /* Descriptor Error */ +#define MALESR_OEN 0x00080000 /* OPB Non-Fullword Error */ +#define MALESR_OTE 0x00040000 /* OPB Timeout Error */ +#define MALESR_OSE 0x00020000 /* OPB Slave Error */ +#define MALESR_PEIN 0x00010000 /* PLB Bus Error Indication */ +#define MALESR_DEI 0x00000010 /* Descriptor Error Interrupt */ +#define MALESR_ONEI 0x00000008 /* OPB Non-Fullword Error Interrupt */ +#define MALESR_OTEI 0x00000004 /* OPB Timeout Error Interrupt */ +#define MALESR_OSEI 0x00000002 /* OPB Slace Error Interrupt */ +#define MALESR_PBEI 0x00000001 /* PLB Bus Error Interrupt */ +/* DCRN_MALIER */ +#define MALIER_DE 0x00000010 /* Descriptor Error Interrupt Enable */ +#define MALIER_NE 0x00000008 /* OPB Non-word Transfer Int Enable */ +#define MALIER_TE 0x00000004 /* OPB Time Out Error Interrupt Enable */ +#define MALIER_OPBE 0x00000002 /* OPB Slave Error Interrupt Enable */ +#define MALIER_PLBE 0x00000001 /* PLB Error Interrupt Enable */ +/* DCRN_MALTXEOBISR */ +#define MALOBISR_CH0 0x80000000 /* EOB channel 1 bit */ +#define MALOBISR_CH2 0x40000000 /* EOB channel 2 bit */ + +/* 440GP PLB Arbiter DCRs */ +#define DCRN_PLB0_REVID 0x082 /* PLB Arbiter Revision ID */ +#define DCRN_PLB0_ACR 0x083 /* PLB Arbiter Control */ +#define DCRN_PLB0_BESR 0x084 /* PLB Error Status */ +#define DCRN_PLB0_BEARL 0x086 /* PLB Error Address Low */ +#define DCRN_PLB0_BEAR DCRN_PLB0_BEARL /* 40x compatibility */ +#define DCRN_PLB0_BEARH 0x087 /* PLB Error Address High */ + +/* 440GP Clock, PM, chip control */ +#define DCRN_CPC0_SR 0x0b0 +#define DCRN_CPC0_ER 0x0b1 +#define DCRN_CPC0_FR 0x0b2 +#define DCRN_CPC0_SYS0 0x0e0 +#define DCRN_CPC0_SYS1 0x0e1 +#define DCRN_CPC0_CUST0 0x0e2 +#define DCRN_CPC0_CUST1 0x0e3 +#define DCRN_CPC0_STRP0 0x0e4 +#define DCRN_CPC0_STRP1 0x0e5 +#define DCRN_CPC0_STRP2 0x0e6 +#define DCRN_CPC0_STRP3 0x0e7 +#define DCRN_CPC0_GPIO 0x0e8 +#define DCRN_CPC0_PLB 0x0e9 +#define DCRN_CPC0_CR1 0x0ea +#define DCRN_CPC0_CR0 0x0eb +#define DCRN_CPC0_MIRQ0 0x0ec +#define DCRN_CPC0_MIRQ1 0x0ed +#define DCRN_CPC0_JTAGID 0x0ef + +/* 440GP DMA controller DCRs */ +#define DCRN_DMACR0 (DCRN_DMA0_BASE + 0x0) /* DMA Channel Control 0 */ +#define DCRN_DMACT0 (DCRN_DMA0_BASE + 0x1) /* DMA Count 0 */ +#define DCRN_DMASAH0 (DCRN_DMA0_BASE + 0x2) /* DMA Src Addr High 0 */ +#define DCRN_DMASA0 (DCRN_DMA0_BASE + 0x3) /* DMA Src Addr Low 0 */ +#define DCRN_DMADAH0 (DCRN_DMA0_BASE + 0x4) /* DMA Dest Addr High 0 */ +#define DCRN_DMADA0 (DCRN_DMA0_BASE + 0x5) /* DMA Dest Addr Low 0 */ +#define DCRN_ASGH0 (DCRN_DMA0_BASE + 0x6) /* DMA SG Desc Addr High 0 */ +#define DCRN_ASG0 (DCRN_DMA0_BASE + 0x7) /* DMA SG Desc Addr Low 0 */ + +#define DCRN_DMACR1 (DCRN_DMA1_BASE + 0x0) /* DMA Channel Control 1 */ +#define DCRN_DMACT1 (DCRN_DMA1_BASE + 0x1) /* DMA Count 1 */ +#define DCRN_DMASAH1 (DCRN_DMA1_BASE + 0x2) /* DMA Src Addr High 1 */ +#define DCRN_DMASA1 (DCRN_DMA1_BASE + 0x3) /* DMA Src Addr Low 1 */ +#define DCRN_DMADAH1 (DCRN_DMA1_BASE + 0x4) /* DMA Dest Addr High 1 */ +#define DCRN_DMADA1 (DCRN_DMA1_BASE + 0x5) /* DMA Dest Addr Low 1 */ +#define DCRN_ASGH1 (DCRN_DMA1_BASE + 0x6) /* DMA SG Desc Addr High 1 */ +#define DCRN_ASG1 (DCRN_DMA1_BASE + 0x7) /* DMA SG Desc Addr Low 1 */ + +#define DCRN_DMACR2 (DCRN_DMA2_BASE + 0x0) /* DMA Channel Control 2 */ +#define DCRN_DMACT2 (DCRN_DMA2_BASE + 0x1) /* DMA Count 2 */ +#define DCRN_DMASAH2 (DCRN_DMA2_BASE + 0x2) /* DMA Src Addr High 2 */ +#define DCRN_DMASA2 (DCRN_DMA2_BASE + 0x3) /* DMA Src Addr Low 2 */ +#define DCRN_DMADAH2 (DCRN_DMA2_BASE + 0x4) /* DMA Dest Addr High 2 */ +#define DCRN_DMADA2 (DCRN_DMA2_BASE + 0x5) /* DMA Dest Addr Low 2 */ +#define DCRN_ASGH2 (DCRN_DMA2_BASE + 0x6) /* DMA SG Desc Addr High 2 */ +#define DCRN_ASG2 (DCRN_DMA2_BASE + 0x7) /* DMA SG Desc Addr Low 2 */ + +#define DCRN_DMACR3 (DCRN_DMA3_BASE + 0x0) /* DMA Channel Control 3 */ +#define DCRN_DMACT3 (DCRN_DMA3_BASE + 0x1) /* DMA Count 3 */ +#define DCRN_DMASAH3 (DCRN_DMA3_BASE + 0x2) /* DMA Src Addr High 3 */ +#define DCRN_DMASA3 (DCRN_DMA3_BASE + 0x3) /* DMA Src Addr Low 3 */ +#define DCRN_DMADAH3 (DCRN_DMA3_BASE + 0x4) /* DMA Dest Addr High 3 */ +#define DCRN_DMADA3 (DCRN_DMA3_BASE + 0x5) /* DMA Dest Addr Low 3 */ +#define DCRN_ASGH3 (DCRN_DMA3_BASE + 0x6) /* DMA SG Desc Addr High 3 */ +#define DCRN_ASG3 (DCRN_DMA3_BASE + 0x7) /* DMA SG Desc Addr Low 3 */ + +#define DCRN_DMASR (DCRN_DMASR_BASE + 0x0) /* DMA Status Register */ +#define DCRN_ASGC (DCRN_DMASR_BASE + 0x3) /* DMA Scatter/Gather Command */ +#define DCRN_SLP (DCRN_DMASR_BASE + 0x5) /* DMA Sleep Register */ +#define DCRN_POL (DCRN_DMASR_BASE + 0x6) /* DMA Polarity Register */ + +/* 440GP DRAM controller DCRs */ +#define DCRN_SDRAM0_CFGADDR 0x010 +#define DCRN_SDRAM0_CFGDATA 0x011 + +#define SDRAM0_B0CR 0x40 +#define SDRAM0_B1CR 0x44 +#define SDRAM0_B2CR 0x48 +#define SDRAM0_B3CR 0x4c + +#define SDRAM_CONFIG_BANK_ENABLE 0x00000001 +#define SDRAM_CONFIG_SIZE_MASK 0x000e0000 +#define SDRAM_CONFIG_BANK_SIZE(reg) ((reg & SDRAM_CONFIG_SIZE_MASK) >> 17) +#define SDRAM_CONFIG_SIZE_8M 0x00000001 +#define SDRAM_CONFIG_SIZE_16M 0x00000002 +#define SDRAM_CONFIG_SIZE_32M 0x00000003 +#define SDRAM_CONFIG_SIZE_64M 0x00000004 +#define SDRAM_CONFIG_SIZE_128M 0x00000005 +#define SDRAM_CONFIG_SIZE_256M 0x00000006 +#define SDRAM_CONFIG_SIZE_512M 0x00000007 +#define PPC44x_MEM_SIZE_8M 0x00800000 +#define PPC44x_MEM_SIZE_16M 0x01000000 +#define PPC44x_MEM_SIZE_32M 0x02000000 +#define PPC44x_MEM_SIZE_64M 0x04000000 +#define PPC44x_MEM_SIZE_128M 0x08000000 +#define PPC44x_MEM_SIZE_256M 0x10000000 +#define PPC44x_MEM_SIZE_512M 0x20000000 + +/* + * PCI-X definitions + */ +#define PCIX0_REG_BASE 0x20ec80000ULL +#define PCIX0_REG_SIZE 0x200 + +#define PCIX0_VENDID 0x000 +#define PCIX0_DEVID 0x002 +#define PCIX0_COMMAND 0x004 +#define PCIX0_STATUS 0x006 +#define PCIX0_REVID 0x008 +#define PCIX0_CLS 0x009 +#define PCIX0_CACHELS 0x00c +#define PCIX0_LATTIM 0x00d +#define PCIX0_HDTYPE 0x00e +#define PCIX0_BIST 0x00f +#define PCIX0_BAR0L 0x010 +#define PCIX0_BAR0H 0x014 +#define PCIX0_BAR1 0x018 +#define PCIX0_BAR2L 0x01c +#define PCIX0_BAR2H 0x020 +#define PCIX0_BAR3 0x024 +#define PCIX0_CISPTR 0x028 +#define PCIX0_SBSYSVID 0x02c +#define PCIX0_SBSYSID 0x02e +#define PCIX0_EROMBA 0x030 +#define PCIX0_CAP 0x034 +#define PCIX0_RES0 0x035 +#define PCIX0_RES1 0x036 +#define PCIX0_RES2 0x038 +#define PCIX0_INTLN 0x03c +#define PCIX0_INTPN 0x03d +#define PCIX0_MINGNT 0x03e +#define PCIX0_MAXLTNCY 0x03f +#define PCIX0_BRDGOPT1 0x040 +#define PCIX0_BRDGOPT2 0x044 +#define PCIX0_ERREN 0x050 +#define PCIX0_ERRSTS 0x054 +#define PCIX0_PLBBESR 0x058 +#define PCIX0_PLBBEARL 0x05c +#define PCIX0_PLBBEARH 0x060 +#define PCIX0_POM0LAL 0x068 +#define PCIX0_POM0LAH 0x06c +#define PCIX0_POM0SA 0x070 +#define PCIX0_POM0PCIAL 0x074 +#define PCIX0_POM0PCIAH 0x078 +#define PCIX0_POM1LAL 0x07c +#define PCIX0_POM1LAH 0x080 +#define PCIX0_POM1SA 0x084 +#define PCIX0_POM1PCIAL 0x088 +#define PCIX0_POM1PCIAH 0x08c +#define PCIX0_POM2SA 0x090 +#define PCIX0_PIM0SAL 0x098 +#define PCIX0_PIM0SA PCIX0_PIM0SAL +#define PCIX0_PIM0LAL 0x09c +#define PCIX0_PIM0LAH 0x0a0 +#define PCIX0_PIM1SA 0x0a4 +#define PCIX0_PIM1LAL 0x0a8 +#define PCIX0_PIM1LAH 0x0ac +#define PCIX0_PIM2SAL 0x0b0 +#define PCIX0_PIM2SA PCIX0_PIM2SAL +#define PCIX0_PIM2LAL 0x0b4 +#define PCIX0_PIM2LAH 0x0b8 +#define PCIX0_OMCAPID 0x0c0 +#define PCIX0_OMNIPTR 0x0c1 +#define PCIX0_OMMC 0x0c2 +#define PCIX0_OMMA 0x0c4 +#define PCIX0_OMMUA 0x0c8 +#define PCIX0_OMMDATA 0x0cc +#define PCIX0_OMMEOI 0x0ce +#define PCIX0_PMCAPID 0x0d0 +#define PCIX0_PMNIPTR 0x0d1 +#define PCIX0_PMC 0x0d2 +#define PCIX0_PMCSR 0x0d4 +#define PCIX0_PMCSRBSE 0x0d6 +#define PCIX0_PMDATA 0x0d7 +#define PCIX0_PMSCRR 0x0d8 +#define PCIX0_CAPID 0x0dc +#define PCIX0_NIPTR 0x0dd +#define PCIX0_CMD 0x0de +#define PCIX0_STS 0x0e0 +#define PCIX0_IDR 0x0e4 +#define PCIX0_CID 0x0e8 +#define PCIX0_RID 0x0ec +#define PCIX0_PIM0SAH 0x0f8 +#define PCIX0_PIM2SAH 0x0fc +#define PCIX0_MSGIL 0x100 +#define PCIX0_MSGIH 0x104 +#define PCIX0_MSGOL 0x108 +#define PCIX0_MSGOH 0x10c +#define PCIX0_IM 0x1f8 + +#define IIC_OWN 0x55 +#define IIC_CLOCK 50 + +#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] + +#include + +#endif /* __ASSEMBLY__ */ +#endif /* __ASM_IBM44x_H__ */ +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/ibm4xx.h linux-2.4.23-pre8/include/asm-ppc/ibm4xx.h --- linux-2.4.22/include/asm-ppc/ibm4xx.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/ibm4xx.h 2003-10-22 22:48:57.000000000 +0000 @@ -80,6 +80,16 @@ #define PCI_DRAM_OFFSET 0 #endif +#elif CONFIG_44x + +#if defined(CONFIG_EBONY) +#include +#endif + +#if defined(CONFIG_OCOTEA) +#include +#endif + #endif /* CONFIG_40x */ #ifndef __ASSEMBLY__ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/io.h linux-2.4.23-pre8/include/asm-ppc/io.h --- linux-2.4.22/include/asm-ppc/io.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/io.h 2003-10-22 22:48:18.000000000 +0000 @@ -3,7 +3,9 @@ #define _PPC_IO_H #include +#include #include +#include #include #include @@ -40,6 +42,7 @@ extern unsigned long isa_io_base; extern unsigned long isa_mem_base; extern unsigned long pci_dram_offset; + #define readb(addr) in_8((volatile u8 *)(addr)) #define writeb(b,addr) out_8((volatile u8 *)(addr), (b)) #if defined(CONFIG_APUS) @@ -195,14 +198,15 @@ * Map in an area of physical address space, for accessing * I/O devices etc. */ -extern void *__ioremap(unsigned long address, unsigned long size, +extern void *__ioremap(phys_addr_t address, unsigned long size, unsigned long flags); -extern void *ioremap(unsigned long address, unsigned long size); +extern void *ioremap(phys_addr_t address, unsigned long size); +extern void *ioremap64(unsigned long long address, unsigned long size); #define ioremap_nocache(addr, size) ioremap((addr), (size)) extern void iounmap(void *addr); extern unsigned long iopa(unsigned long addr); extern unsigned long mm_ptov(unsigned long addr) __attribute__ ((const)); -extern void io_block_mapping(unsigned long virt, unsigned long phys, +extern void io_block_mapping(unsigned long virt, phys_addr_t phys, unsigned int size, int flags); /* @@ -223,10 +227,7 @@ */ extern inline unsigned long virt_to_bus(volatile void * address) { -#if defined(CONFIG_APUS) || defined(CONFIG_8xx) || defined(CONFIG_4xx) - /* I think everyone will be using this version if we start allowing - * uncached pages in alternate virtual spaces. -- Dan - */ +#ifdef CONFIG_APUS return (iopa((unsigned long) address) + PCI_DRAM_OFFSET); #else if (address == (void *)0) @@ -237,7 +238,7 @@ extern inline void * bus_to_virt(unsigned long address) { -#if defined(CONFIG_APUS) || defined(CONFIG_8xx) || defined(CONFIG_40x) +#ifdef CONFIG_APUS return (void*) mm_ptov (address - PCI_DRAM_OFFSET); #else if (address == 0) @@ -252,7 +253,7 @@ */ extern inline unsigned long virt_to_phys(volatile void * address) { -#if defined(CONFIG_APUS) || defined(CONFIG_8xx) || defined(CONFIG_40x) +#ifdef CONFIG_APUS return iopa ((unsigned long) address); #else return (unsigned long) address - KERNELBASE; @@ -261,7 +262,7 @@ extern inline void * phys_to_virt(unsigned long address) { -#if defined(CONFIG_APUS) || defined(CONFIG_8xx) || defined(CONFIG_40x) +#ifdef CONFIG_APUS return (void*) mm_ptov (address); #else return (void *) (address + KERNELBASE); @@ -401,11 +402,43 @@ return 0; } -/* Nothing to do */ +#ifdef CONFIG_NOT_COHERENT_CACHE + +/* + * DMA-consistent mapping functions for PowerPCs that don't support + * cache snooping. These allocate/free a region of uncached mapped + * memory space for use with DMA devices. Alternatively, you could + * allocate the space "normally" and use the cache management functions + * to ensure it is consistent. + */ +extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle); +extern void consistent_free(void *vaddr); +extern void consistent_sync(void *vaddr, size_t size, int rw); +extern void consistent_sync_page(struct page *page, unsigned long offset, + size_t size, int rw); + +#define dma_cache_inv(_start,_size) \ + invalidate_dcache_range(_start, (_start + _size)) +#define dma_cache_wback(_start,_size) \ + clean_dcache_range(_start, (_start + _size)) +#define dma_cache_wback_inv(_start,_size) \ + flush_dcache_range(_start, (_start + _size)) + +#else /* ! CONFIG_NOT_COHERENT_CACHE */ + +/* + * Cache coherent cores. + */ #define dma_cache_inv(_start,_size) do { } while (0) #define dma_cache_wback(_start,_size) do { } while (0) #define dma_cache_wback_inv(_start,_size) do { } while (0) -#endif +#define consistent_alloc(gfp, size, handle) NULL +#define consistent_free(addr, size) do { } while (0) +#define consistent_sync(addr, size, rw) do { } while (0) +#define consistent_sync_page(pg, off, sz, rw) do { } while (0) + +#endif /* CONFIG_NOT_COHERENT_CACHE */ +#endif /* _PPC_IO_H */ #endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/ipc.h linux-2.4.23-pre8/include/asm-ppc/ipc.h --- linux-2.4.22/include/asm-ppc/ipc.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/ipc.h 2003-10-22 22:49:56.000000000 +0000 @@ -14,6 +14,7 @@ #define SEMOP 1 #define SEMGET 2 #define SEMCTL 3 +#define SEMTIMEDOP 4 #define MSGSND 11 #define MSGRCV 12 #define MSGGET 13 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/irq.h linux-2.4.23-pre8/include/asm-ppc/irq.h --- linux-2.4.22/include/asm-ppc/irq.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/irq.h 2003-10-22 22:47:44.000000000 +0000 @@ -71,8 +71,8 @@ return (irq); } -#elif defined(CONFIG_440) -#include +#elif defined(CONFIG_44x) +#include #define NR_UIC_IRQS 32 #define NR_IRQS ((NR_UIC_IRQS * NR_UICS) + NR_BOARD_IRQS) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/mmu.h linux-2.4.23-pre8/include/asm-ppc/mmu.h --- linux-2.4.22/include/asm-ppc/mmu.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/mmu.h 2003-10-22 22:49:35.000000000 +0000 @@ -10,6 +10,18 @@ #ifndef __ASSEMBLY__ +/* + * Define physical address type. Machines using split size + * virtual/physical addressing like 32-bit virtual / 36-bit + * physical need a larger than native word size type. -Matt + */ +#ifdef CONFIG_PTE_64BIT +typedef unsigned long long phys_addr_t; +extern phys_addr_t fixup_bigphys_addr(phys_addr_t, phys_addr_t); +#else +typedef unsigned long phys_addr_t; +#endif + /* Default "unsigned long" context */ typedef unsigned long mm_context_t; @@ -326,5 +338,54 @@ #define TLB_M 0x00000002 /* Memory is coherent */ #define TLB_G 0x00000001 /* Memory is guarded from prefetch */ +/* + * PPC44x support + */ +#define PPC44x_MMUCR_TID 0x000000ff +#define PPC44x_MMUCR_STS 0x00010000 + +#define PPC44x_TLB_PAGEID 0 +#define PPC44x_TLB_XLAT 1 +#define PPC44x_TLB_ATTRIB 2 + +/* Page identification fields */ +#define PPC44x_TLB_EPN_MASK 0xfffffc00 /* Effective Page Number */ +#define PPC44x_TLB_VALID 0x00000200 /* Valid flag */ +#define PPC44x_TLB_TS 0x00000100 /* Translation address space */ +#define PPC44x_TLB_PAGESZ_MASK 0x000000f0 +#define PPC44x_TLB_PAGESZ(x) (x << 4) +#define PPC44x_PAGESZ_1K 0 +#define PPC44x_PAGESZ_4K 1 +#define PPC44x_PAGESZ_16K 2 +#define PPC44x_PAGESZ_64K 3 +#define PPC44x_PAGESZ_256K 4 +#define PPC44x_PAGESZ_1M 5 +#define PPC44x_PAGESZ_16M 7 +#define PPC44x_PAGESZ_256M 9 + +/* Translation fields */ +#define PPC44x_TLB_RPN_MASK 0xfffffc00 /* Real Page Number */ +#define PPC44x_TLB_ERPN_MASK 0x0000000f + +/* Storage attribute and access control fields */ +#define PPC44x_TLB_ATTR_MASK 0x0000ff80 +#define PPC44x_TLB_U0 0x00008000 /* User 0 */ +#define PPC44x_TLB_U1 0x00004000 /* User 1 */ +#define PPC44x_TLB_U2 0x00002000 /* User 2 */ +#define PPC44x_TLB_U3 0x00001000 /* User 3 */ +#define PPC44x_TLB_W 0x00000800 /* Caching is write-through */ +#define PPC44x_TLB_I 0x00000400 /* Caching is inhibited */ +#define PPC44x_TLB_M 0x00000200 /* Memory is coherent */ +#define PPC44x_TLB_G 0x00000100 /* Memory is guarded */ +#define PPC44x_TLB_E 0x00000080 /* Memory is guarded */ + +#define PPC44x_TLB_PERM_MASK 0x0000003f +#define PPC44x_TLB_UX 0x00000020 /* User execution */ +#define PPC44x_TLB_UW 0x00000010 /* User write */ +#define PPC44x_TLB_UR 0x00000008 /* User read */ +#define PPC44x_TLB_SX 0x00000004 /* Super execution */ +#define PPC44x_TLB_SW 0x00000002 /* Super write */ +#define PPC44x_TLB_SR 0x00000001 /* Super read */ + #endif /* _PPC_MMU_H_ */ #endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/mpc8xx.h linux-2.4.23-pre8/include/asm-ppc/mpc8xx.h --- linux-2.4.22/include/asm-ppc/mpc8xx.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/mpc8xx.h 2003-10-22 22:49:32.000000000 +0000 @@ -32,6 +32,10 @@ #include #endif +#ifdef CONFIG_DBOX2 +#include +#endif + #if defined(CONFIG_TQM8xxL) #include #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/ocp.h linux-2.4.23-pre8/include/asm-ppc/ocp.h --- linux-2.4.22/include/asm-ppc/ocp.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/ocp.h 2003-10-22 22:48:25.000000000 +0000 @@ -40,6 +40,7 @@ #include #include +#include #include #include #include @@ -103,7 +104,7 @@ unsigned int vendor; unsigned int function; int index; - unsigned long paddr; + phys_addr_t paddr; int irq; unsigned long pm; void *additions; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/page.h linux-2.4.23-pre8/include/asm-ppc/page.h --- linux-2.4.22/include/asm-ppc/page.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/page.h 2003-10-22 22:48:16.000000000 +0000 @@ -4,16 +4,33 @@ /* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 #define PAGE_SIZE (1UL << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +/* + * Subtle: this is an int (not an unsigned long) and so it + * gets extended to 64 bits the way want (i.e. with 1s). -- paulus + */ +#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) #ifdef __KERNEL__ #include -/* Be sure to change arch/ppc/Makefile to match */ -#define PAGE_OFFSET 0xc0000000 +#define PAGE_OFFSET CONFIG_KERNEL_START #define KERNELBASE PAGE_OFFSET #ifndef __ASSEMBLY__ +/* + * The basic type of a PTE - 64 bits for those CPUs with > 32 bit + * physical addressing. For now this just the IBM PPC440. + */ +#ifdef CONFIG_PTE_64BIT +typedef unsigned long long pte_basic_t; +#define PTE_SHIFT (PAGE_SHIFT - 3) /* 512 ptes per page */ +#define PTE_FMT "%16Lx" +#else +typedef unsigned long pte_basic_t; +#define PTE_SHIFT (PAGE_SHIFT - 2) /* 1024 ptes per page */ +#define PTE_FMT "%.8lx" +#endif + #include /* for xmon definition */ #ifdef CONFIG_XMON @@ -35,7 +52,7 @@ /* * These are used to make use of C type-checking.. */ -typedef struct { unsigned long pte; } pte_t; +typedef struct { pte_basic_t pte; } pte_t; typedef struct { unsigned long pmd; } pmd_t; typedef struct { unsigned long pgd; } pgd_t; typedef struct { unsigned long pgprot; } pgprot_t; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/pci.h linux-2.4.23-pre8/include/asm-ppc/pci.h --- linux-2.4.22/include/asm-ppc/pci.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/pci.h 2003-10-22 22:49:14.000000000 +0000 @@ -2,6 +2,14 @@ #define __PPC_PCI_H #ifdef __KERNEL__ +#include +#include +#include +#include +#include + +struct pci_dev; + /* Values for the `which' argument to sys_pciconfig_iobase syscall. */ #define IOBASE_BRIDGE_NUMBER 0 #define IOBASE_MEMORY 1 @@ -16,6 +24,7 @@ extern int pci_assign_all_busses; #define pcibios_assign_all_busses() (pci_assign_all_busses) +#define pcibios_scan_all_fns() 0 #define PCIBIOS_MIN_IO 0x1000 #define PCIBIOS_MIN_MEM 0x10000000 @@ -43,18 +52,12 @@ extern unsigned long pci_phys_to_bus(unsigned long pa, int busnr); extern unsigned long pci_bus_to_phys(unsigned int ba, int busnr); -/* Dynamic DMA Mapping stuff, stolen from i386 - * ++ajoshi +/* + * Dynamic DMA Mapping stuff + * Originally stolen from i386 by ajoshi and updated by paulus + * Non-consistent cache support by Dan Malek */ -#include -#include -#include -#include -#include - -struct pci_dev; - /* The PCI address space does equal the physical memory * address space. The networking and block device layers use * this boolean for bounce buffer decisions. @@ -91,8 +94,8 @@ static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction) { - if (direction == PCI_DMA_NONE) - BUG(); + BUG_ON(direction == PCI_DMA_NONE); + consistent_sync(ptr, size, direction); return virt_to_bus(ptr); } @@ -117,10 +120,11 @@ * to pci_map_single, but takes a struct page instead of a virtual address */ static inline dma_addr_t pci_map_page(struct pci_dev *hwdev, struct page *page, - unsigned long offset, size_t size, int direction) + unsigned long offset, size_t size, + int direction) { - if (direction == PCI_DMA_NONE) - BUG(); + BUG_ON(direction == PCI_DMA_NONE); + consistent_sync_page(page, offset, size, direction); return (page - mem_map) * PAGE_SIZE + PCI_DRAM_OFFSET + offset; } @@ -136,7 +140,8 @@ * mode for DMA. This is the scather-gather version of the * above pci_map_single interface. Here the scatter gather list * elements are each tagged with the appropriate dma address - * and length. They are obtained via sg_dma_{address,length}(SG). + * and length. They are obtained via sg_dma_{address,len}(SG), + * defined in . * * NOTE: An implementation may be able to use a smaller number of * DMA address/length pairs than there are SG table elements. @@ -164,10 +169,15 @@ else if (!sg[i].address && !sg[i].page) BUG(); - if (sg[i].address) + if (sg[i].address) { + consistent_sync(sg[i].address, sg[i].length, direction); sg[i].dma_address = virt_to_bus(sg[i].address); - else + } else { + consistent_sync_page(sg[i].page, sg[i].offset, + sg[i].length, direction); sg[i].dma_address = page_to_bus(sg[i].page) + sg[i].offset; + } + sg[i].dma_length = sg[i].length; } return nents; @@ -180,8 +190,7 @@ static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction) { - if (direction == PCI_DMA_NONE) - BUG(); + BUG_ON(direction == PCI_DMA_NONE); /* nothing to do */ } @@ -198,9 +207,9 @@ dma_addr_t dma_handle, size_t size, int direction) { - if (direction == PCI_DMA_NONE) - BUG(); - /* nothing to do */ + BUG_ON(direction == PCI_DMA_NONE); + + consistent_sync(bus_to_virt(dma_handle), size, direction); } /* Make physical memory consistent for a set of streaming @@ -213,9 +222,17 @@ struct scatterlist *sg, int nelems, int direction) { - if (direction == PCI_DMA_NONE) - BUG(); - /* nothing to do */ + int i; + + BUG_ON(direction == PCI_DMA_NONE); + + for (i = 0; i < nelems; i++, sg++) { + if (sg->address) + consistent_sync(sg->address, sg->length, direction); + else + consistent_sync_page(sg->page, sg->offset, + sg->length, direction); + } } /* Return whether the given PCI device DMA address mask can @@ -258,14 +275,6 @@ /* Nothing to do. */ } -/* These macros should be used after a pci_map_sg call has been done - * to get bus addresses of each of the SG entries and their lengths. - * You should only work with the number of sg entries pci_map_sg - * returns. - */ -#define sg_dma_address(sg) ((sg)->dma_address) -#define sg_dma_len(sg) ((sg)->length) - /* Return the index of the PCI controller for device PDEV. */ extern int pci_controller_num(struct pci_dev *pdev); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/pgalloc.h linux-2.4.23-pre8/include/asm-ppc/pgalloc.h --- linux-2.4.22/include/asm-ppc/pgalloc.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/pgalloc.h 2003-10-22 22:47:28.000000000 +0000 @@ -6,6 +6,13 @@ #include #include +#ifdef CONFIG_PTE_64BIT +/* 44x uses an 8kB pgdir because it has 8-byte Linux PTEs. */ +#define PGDIR_ORDER 1 +#else +#define PGDIR_ORDER 0 +#endif + /* * This is handled very differently on the PPC since out page tables * are all 0's and I want to be able to use these zero'd pages elsewhere @@ -56,7 +63,7 @@ { pgd_t *ret; - if ((ret = (pgd_t *)__get_free_page(GFP_KERNEL)) != NULL) + if ((ret = (pgd_t *)__get_free_pages(GFP_KERNEL, PGDIR_ORDER)) != NULL) clear_page(ret); return ret; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/pgtable.h linux-2.4.23-pre8/include/asm-ppc/pgtable.h --- linux-2.4.22/include/asm-ppc/pgtable.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/pgtable.h 2003-10-22 22:48:11.000000000 +0000 @@ -109,6 +109,13 @@ extern unsigned long va_to_phys(unsigned long address); extern pte_t *va_to_pte(unsigned long address); extern unsigned long ioremap_bot, ioremap_base; +extern unsigned long vmalloc_start; + +/* Start and end of the vmalloc area. */ +#define VMALLOC_START vmalloc_start +#define VMALLOC_END ioremap_bot +#define VMALLOC_VMADDR(x) ((unsigned long)(x)) + #endif /* __ASSEMBLY__ */ /* @@ -154,13 +161,23 @@ * and ITLB, respectively (see "mmu.h" for definitions). */ -/* PMD_SHIFT determines the size of the area mapped by the second-level page tables */ -#define PMD_SHIFT 22 +/* + * The normal case is that PTEs are 32-bits and we have a 1-page + * 1024-entry pgdir pointing to 1-page 1024-entry PTE pages. -- paulus + * + * For any >32-bit physical address platform, we can use the following + * two level page table layout where the pgdir is 8KB and the MS 13 bits + * are an index to the second level table. The combined pgdir/pmd first + * level has 2048 entries and the second level has 512 64-bit PTE entries. + * -Matt + */ +/* PMD_SHIFT determines the size of the area mapped by the PTE pages */ +#define PMD_SHIFT (PAGE_SHIFT + PTE_SHIFT) #define PMD_SIZE (1UL << PMD_SHIFT) #define PMD_MASK (~(PMD_SIZE-1)) -/* PGDIR_SHIFT determines what a third-level page table entry can map */ -#define PGDIR_SHIFT 22 +/* PGDIR_SHIFT determines what a top-level page table entry can map */ +#define PGDIR_SHIFT PMD_SHIFT #define PGDIR_SIZE (1UL << PGDIR_SHIFT) #define PGDIR_MASK (~(PGDIR_SIZE-1)) @@ -168,9 +185,10 @@ * entries per page directory level: our page-table tree is two-level, so * we don't really have any PMD directory. */ -#define PTRS_PER_PTE 1024 +#define PTRS_PER_PTE (1 << PTE_SHIFT) #define PTRS_PER_PMD 1 -#define PTRS_PER_PGD 1024 +#define PTRS_PER_PGD (1 << (32 - PGDIR_SHIFT)) + #define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) #define FIRST_USER_PGD_NR 0 @@ -178,35 +196,13 @@ #define KERNEL_PGD_PTRS (PTRS_PER_PGD-USER_PGD_PTRS) #define pte_ERROR(e) \ - printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e)) + printk("%s:%d: bad pte "PTE_FMT".\n", __FILE__, __LINE__, pte_val(e)) #define pmd_ERROR(e) \ printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e)) #define pgd_ERROR(e) \ printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) /* - * Just any arbitrary offset to the start of the vmalloc VM area: the - * current 64MB value just means that there will be a 64MB "hole" after the - * physical memory until the kernel virtual memory starts. That means that - * any out-of-bounds memory accesses will hopefully be caught. - * The vmalloc() routines leaves a hole of 4kB between each vmalloced - * area for the same reason. ;) - * - * We no longer map larger than phys RAM with the BATs so we don't have - * to worry about the VMALLOC_OFFSET causing problems. We do have to worry - * about clashes between our early calls to ioremap() that start growing down - * from ioremap_base being run into the VM area allocations (growing upwards - * from VMALLOC_START). For this reason we have ioremap_bot to check when - * we actually run into our mappings setup in the early boot with the VM - * system. This really does become a problem for machines with good amounts - * of RAM. -- Cort - */ -#define VMALLOC_OFFSET (0x1000000) /* 16M */ -#define VMALLOC_START ((((long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) -#define VMALLOC_END ioremap_bot - -/* * Bits in a linux-style PTE. These match the bits in the * (hardware-defined) PowerPC PTE as closely as possible. */ @@ -252,6 +248,44 @@ #define _PAGE_ACCESSED 0x400 /* software: R: page referenced */ #define _PMD_PRESENT PAGE_MASK +#elif defined(CONFIG_44x) +/* + * Definitions for PPC44x + * + * Because of the 3 word TLB entries to support 36-bit addressing, + * the attribute are difficult to map in such a fashion that they + * are easily loaded during exception processing. I decided to + * organize the entry so the ERPN is the only portion in the + * upper word of the PTE and the attribute bits below are packed + * in as sensibly as they can be in the area below a 4KB page size + * oriented RPN. This at least makes it easy to load the RPN and + * ERPN fields in the TLB. -Matt + * + * Note that these bits preclude future use of a page size + * less than 4KB. + */ +#define _PAGE_PRESENT 0x00000001 /* S: PTE valid */ +#define _PAGE_RW 0x00000002 /* S: Write permission */ +#define _PAGE_DIRTY 0x00000004 /* S: Page dirty */ +#define _PAGE_ACCESSED 0x00000008 /* S: Page referenced */ +#define _PAGE_HWWRITE 0x00000010 /* H: Dirty & RW */ +#define _PAGE_HWEXEC 0x00000020 /* H: Execute permission */ +#define _PAGE_USER 0x00000040 /* S: User page */ +#define _PAGE_ENDIAN 0x00000080 /* H: E bit */ +#define _PAGE_GUARDED 0x00000100 /* H: G bit */ +#define _PAGE_COHERENT 0x00000200 /* H: M bit */ +#define _PAGE_FILE 0x00000400 /* S: nonlinear file mapping */ +#define _PAGE_NO_CACHE 0x00000400 /* H: I bit */ +#define _PAGE_WRITETHRU 0x00000800 /* H: W bit */ + +/* TODO: Add large page lowmem mapping support */ +#define _PMD_PRESENT PAGE_MASK +#define _PMD_PRESENT_MASK (PAGE_MASK) +#define _PMD_BAD (~PAGE_MASK) + +/* ERPN in a PTE never gets cleared, ignore it */ +#define _PTE_NONE_MASK 0xffffffff00000000ULL + #elif defined(CONFIG_8xx) /* Definitions for 8xx embedded chips. */ #define _PAGE_PRESENT 0x0001 /* Page is valid */ @@ -271,6 +305,16 @@ #define _PAGE_DIRTY 0x0200 /* software: page changed */ #define _PAGE_USER 0x0800 /* One of the PP bits, the other is USER&~RW */ +/* + * The 8xx TLB miss handler allegedly sets _PAGE_ACCESSED in the PTE + * for an address even if _PAGE_PRESENT is not set, as a performance + * optimization. This is a bug if you ever want to use swap unless + * _PAGE_ACCESSED is 2, which it isn't, or unless you have 8xx-specific + * definitions for __swp_entry etc. below, which would be gross. + * -- paulus + */ +#define _PTE_NONE_MASK _PAGE_ACCESSED + #else /* CONFIG_6xx */ /* Definitions for 60x, 740/750, etc. */ #define _PAGE_PRESENT 0x001 /* software: pte contains a translation */ @@ -284,21 +328,19 @@ #define _PAGE_ACCESSED 0x100 /* R: page referenced */ #define _PAGE_EXEC 0x200 /* software: i-cache coherency required */ #define _PAGE_RW 0x400 /* software: user write access allowed */ + +#define _PTE_NONE_MASK _PAGE_HASHPTE + #endif -/* The non-standard PowerPC MMUs, which includes the 4xx and 8xx (and - * mabe 603e) have TLB miss handlers that unconditionally set the - * _PAGE_ACCESSED flag as a performance optimization. This causes - * problems for the page_none() macro, just like the HASHPTE flag does - * for the standard PowerPC MMUs. Depending upon the MMU configuration, - * either HASHPTE or ACCESSED will have to be masked to give us a - * proper pte_none() condition. +/* + * Some bits are only used on some cpu families... */ #ifndef _PAGE_HASHPTE #define _PAGE_HASHPTE 0 -#define _PTE_NONE_MASK _PAGE_ACCESSED -#else -#define _PTE_NONE_MASK _PAGE_HASHPTE +#endif +#ifndef _PTE_NONE_MASK +#define _PTE_NONE_MASK 0 #endif #ifndef _PAGE_SHARED #define _PAGE_SHARED 0 @@ -324,7 +366,16 @@ #define _PAGE_BASE _PAGE_PRESENT | _PAGE_ACCESSED #define _PAGE_WRENABLE _PAGE_RW | _PAGE_DIRTY | _PAGE_HWWRITE +/* + * 44x wants _PAGE_GUARDED on all kernel pages for various reasons. + * Allegedly that doesn't hurt performance. -- paulus + */ +#ifdef CONFIG_44x +#define _PAGE_KERNEL _PAGE_BASE | _PAGE_WRENABLE | _PAGE_SHARED | _PAGE_HWEXEC | _PAGE_GUARDED +#else #define _PAGE_KERNEL _PAGE_BASE | _PAGE_WRENABLE | _PAGE_SHARED | _PAGE_HWEXEC +#endif + #define _PAGE_IO _PAGE_KERNEL | _PAGE_NO_CACHE | _PAGE_GUARDED #define PAGE_NONE __pgprot(_PAGE_BASE) @@ -438,7 +489,7 @@ * and a page entry and page directory to the page they refer to. */ -static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot) +static inline pte_t mk_pte_phys(phys_addr_t physpage, pgprot_t pgprot) { pte_t pte; pte_val(pte) = physpage | pgprot_val(pgprot); @@ -463,6 +514,8 @@ * * pte_update clears and sets bit atomically, and returns * the old pte value. + * The ((unsigned long)(p+1) - 4) hack is to get to the least-significant + * 32 bits of the PTE regardless of whether PTEs are 32 or 64 bits. */ static inline unsigned long pte_update(pte_t *p, unsigned long clr, unsigned long set) @@ -477,7 +530,7 @@ " stwcx. %1,0,%3\n\ bne- 1b" : "=&r" (old), "=&r" (tmp), "=m" (*p) - : "r" (p), "r" (clr), "r" (set), "m" (*p) + : "r" ((unsigned long)(p+1) - 4), "r" (clr), "r" (set), "m" (*p) : "cc" ); return old; } @@ -544,7 +597,8 @@ return (pte_t *) pmd_page(*dir) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)); } -extern pgd_t swapper_pg_dir[1024]; +extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; + extern void paging_init(void); /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/ppc4xx_dma.h linux-2.4.23-pre8/include/asm-ppc/ppc4xx_dma.h --- linux-2.4.22/include/asm-ppc/ppc4xx_dma.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/ppc4xx_dma.h 2003-10-22 22:49:05.000000000 +0000 @@ -0,0 +1,593 @@ +/* + * include/asm-ppc/ppc4xx_dma.h + * + * IBM PPC4xx DMA engine library + * + * Copyright 2000-2003 MontaVista Software Inc. + * + * Cleaned by Matt Porter + * + * Original code by Armin Kuster + * and Pete Popov + * + * 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. + * + * 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. + */ + +#ifdef __KERNEL__ +#ifndef __ASMPPC_PPC4xx_DMA_H +#define __ASMPPC_PPC4xx_DMA_H + +#include +#include +#include +#include + +#undef DEBUG_4xxDMA + +#define MAX_PPC4xx_DMA_CHANNELS 4 + +/* in arch/ppc/kernel/setup.c -- Cort */ +extern unsigned long DMA_MODE_WRITE, DMA_MODE_READ; + +/* + * Function return status codes + * These values are used to indicate whether or not the function + * call was successful, or a bad/invalid parameter was passed. + */ +#define DMA_STATUS_GOOD 0 +#define DMA_STATUS_BAD_CHANNEL 1 +#define DMA_STATUS_BAD_HANDLE 2 +#define DMA_STATUS_BAD_MODE 3 +#define DMA_STATUS_NULL_POINTER 4 +#define DMA_STATUS_OUT_OF_MEMORY 5 +#define DMA_STATUS_SGL_LIST_EMPTY 6 +#define DMA_STATUS_GENERAL_ERROR 7 +#define DMA_STATUS_CHANNEL_NOTFREE 8 + +#define DMA_CHANNEL_BUSY 0x80000000 + +/* + * These indicate status as returned from the DMA Status Register. + */ +#define DMA_STATUS_NO_ERROR 0 +#define DMA_STATUS_CS 1 /* Count Status */ +#define DMA_STATUS_TS 2 /* Transfer Status */ +#define DMA_STATUS_DMA_ERROR 3 /* DMA Error Occurred */ +#define DMA_STATUS_DMA_BUSY 4 /* The channel is busy */ + + +/* + * DMA Channel Control Registers + */ + +#ifdef CONFIG_44x +#define PPC4xx_DMA_64BIT +#define DMA_CR_OFFSET 1 +#else +#define DMA_CR_OFFSET 0 +#endif + +#define DMA_CE_ENABLE (1<<31) /* DMA Channel Enable */ +#define SET_DMA_CE_ENABLE(x) (((x)&0x1)<<31) +#define GET_DMA_CE_ENABLE(x) (((x)&DMA_CE_ENABLE)>>31) + +#define DMA_CIE_ENABLE (1<<30) /* DMA Channel Interrupt Enable */ +#define SET_DMA_CIE_ENABLE(x) (((x)&0x1)<<30) +#define GET_DMA_CIE_ENABLE(x) (((x)&DMA_CIE_ENABLE)>>30) + +#define DMA_TD (1<<29) +#define SET_DMA_TD(x) (((x)&0x1)<<29) +#define GET_DMA_TD(x) (((x)&DMA_TD)>>29) + +#define DMA_PL (1<<28) /* Peripheral Location */ +#define SET_DMA_PL(x) (((x)&0x1)<<28) +#define GET_DMA_PL(x) (((x)&DMA_PL)>>28) + +#define EXTERNAL_PERIPHERAL 0 +#define INTERNAL_PERIPHERAL 1 + +#define SET_DMA_PW(x) (((x)&0x3)<<(26-DMA_CR_OFFSET)) /* Peripheral Width */ +#define DMA_PW_MASK SET_DMA_PW(3) +#define PW_8 0 +#define PW_16 1 +#define PW_32 2 +#define PW_64 3 +/* FIXME: Add PW_128 support for 440GP DMA block */ +#define GET_DMA_PW(x) (((x)&DMA_PW_MASK)>>(26-DMA_CR_OFFSET)) + +#define DMA_DAI (1<<(25-DMA_CR_OFFSET)) /* Destination Address Increment */ +#define SET_DMA_DAI(x) (((x)&0x1)<<(25-DMA_CR_OFFSET)) + +#define DMA_SAI (1<<(24-DMA_CR_OFFSET)) /* Source Address Increment */ +#define SET_DMA_SAI(x) (((x)&0x1)<<(24-DMA_CR_OFFSET)) + +#define DMA_BEN (1<<(23-DMA_CR_OFFSET)) /* Buffer Enable */ +#define SET_DMA_BEN(x) (((x)&0x1)<<(23-DMA_CR_OFFSET)) + +#define SET_DMA_TM(x) (((x)&0x3)<<(21-DMA_CR_OFFSET)) /* Transfer Mode */ +#define DMA_TM_MASK SET_DMA_TM(3) +#define TM_PERIPHERAL 0 /* Peripheral */ +#define TM_RESERVED 1 /* Reserved */ +#define TM_S_MM 2 /* Memory to Memory */ +#define TM_D_MM 3 /* Device Paced Memory to Memory */ +#define GET_DMA_TM(x) (((x)&DMA_TM_MASK)>>(21-DMA_CR_OFFSET)) + +#define SET_DMA_PSC(x) (((x)&0x3)<<(19-DMA_CR_OFFSET)) /* Peripheral Setup Cycles */ +#define DMA_PSC_MASK SET_DMA_PSC(3) +#define GET_DMA_PSC(x) (((x)&DMA_PSC_MASK)>>(19-DMA_CR_OFFSET)) + +#define SET_DMA_PWC(x) (((x)&0x3F)<<(13-DMA_CR_OFFSET)) /* Peripheral Wait Cycles */ +#define DMA_PWC_MASK SET_DMA_PWC(0x3F) +#define GET_DMA_PWC(x) (((x)&DMA_PWC_MASK)>>(13-DMA_CR_OFFSET)) + +#define SET_DMA_PHC(x) (((x)&0x7)<<(10-DMA_CR_OFFSET)) /* Peripheral Hold Cycles */ +#define DMA_PHC_MASK SET_DMA_PHC(0x7) +#define GET_DMA_PHC(x) (((x)&DMA_PHC_MASK)>>(10-DMA_CR_OFFSET)) + +#define DMA_ETD_OUTPUT (1<<(9-DMA_CR_OFFSET)) /* EOT pin is a TC output */ +#define SET_DMA_ETD(x) (((x)&0x1)<<(9-DMA_CR_OFFSET)) + +#define DMA_TCE_ENABLE (1<<(8-DMA_CR_OFFSET)) +#define SET_DMA_TCE(x) (((x)&0x1)<<(8-DMA_CR_OFFSET)) + +#define DMA_DEC (1<<(2) /* Address Decrement */ +#define SET_DMA_DEC(x) (((x)&0x1)<<2) +#define GET_DMA_DEC(x) (((x)&DMA_DEC)>>2) + +/* + * Transfer Modes + * These modes are defined in a way that makes it possible to + * simply "or" in the value in the control register. + */ + +#define DMA_MODE_MM (SET_DMA_TM(TM_S_MM)) /* memory to memory */ + + /* Device-paced memory to memory, */ + /* device is at source address */ +#define DMA_MODE_MM_DEVATSRC (DMA_TD | SET_DMA_TM(TM_D_MM)) + + /* Device-paced memory to memory, */ + /* device is at destination address */ +#define DMA_MODE_MM_DEVATDST (SET_DMA_TM(TM_D_MM)) + +/* 405gp/440gp */ +#define SET_DMA_PREFETCH(x) (((x)&0x3)<<(4-DMA_CR_OFFSET)) /* Memory Read Prefetch */ +#define DMA_PREFETCH_MASK SET_DMA_PREFETCH(3) +#define PREFETCH_1 0 /* Prefetch 1 Double Word */ +#define PREFETCH_2 1 +#define PREFETCH_4 2 +#define GET_DMA_PREFETCH(x) (((x)&DMA_PREFETCH_MASK)>>(4-DMA_CR_OFFSET)) + +#define DMA_PCE (1<<(3-DMA_CR_OFFSET)) /* Parity Check Enable */ +#define SET_DMA_PCE(x) (((x)&0x1)<<(3-DMA_CR_OFFSET)) +#define GET_DMA_PCE(x) (((x)&DMA_PCE)>>(3-DMA_CR_OFFSET)) + +/* stb3x */ + +#define DMA_ECE_ENABLE (1<<5) +#define SET_DMA_ECE(x) (((x)&0x1)<<5) +#define GET_DMA_ECE(x) (((x)&DMA_ECE_ENABLE)>>5) + +#define DMA_TCD_DISABLE (1<<4) +#define SET_DMA_TCD(x) (((x)&0x1)<<4) +#define GET_DMA_TCD(x) (((x)&DMA_TCD_DISABLE)>>4) + +typedef uint32_t sgl_handle_t; + +#ifdef CONFIG_PPC4xx_EDMA + +#define SGL_LIST_SIZE 4096 +#define DMA_PPC4xx_SIZE SGL_LIST_SIZE + +#define SET_DMA_PRIORITY(x) (((x)&0x3)<<(6-DMA_CR_OFFSET)) /* DMA Channel Priority */ +#define DMA_PRIORITY_MASK SET_DMA_PRIORITY(3) +#define PRIORITY_LOW 0 +#define PRIORITY_MID_LOW 1 +#define PRIORITY_MID_HIGH 2 +#define PRIORITY_HIGH 3 +#define GET_DMA_PRIORITY(x) (((x)&DMA_PRIORITY_MASK)>>(6-DMA_CR_OFFSET)) + +/* + * DMA Polarity Configuration Register + */ + +#define DMAReq0_ActiveLow (1<<31) +#define DMAAck0_ActiveLow (1<<30) +#define EOT0_ActiveLow (1<<29) /* End of Transfer */ + +#define DMAReq1_ActiveLow (1<<28) +#define DMAAck1_ActiveLow (1<<27) +#define EOT1_ActiveLow (1<<26) + +#define DMAReq2_ActiveLow (1<<25) +#define DMAAck2_ActiveLow (1<<24) +#define EOT2_ActiveLow (1<<23) + +#define DMAReq3_ActiveLow (1<<22) +#define DMAAck3_ActiveLow (1<<21) +#define EOT3_ActiveLow (1<<20) + +/* + * DMA Sleep Mode Register + */ +#define SLEEP_MODE_ENABLE (1<<21) + +/* + * DMA Status Register + */ +#define DMA_CS0 (1<<31) /* Terminal Count has been reached */ +#define DMA_CS1 (1<<30) +#define DMA_CS2 (1<<29) +#define DMA_CS3 (1<<28) + +#define DMA_TS0 (1<<27) /* End of Transfer has been requested */ +#define DMA_TS1 (1<<26) +#define DMA_TS2 (1<<25) +#define DMA_TS3 (1<<24) + +#define DMA_CH0_ERR (1<<23) /* DMA Chanel 0 Error */ +#define DMA_CH1_ERR (1<<22) +#define DMA_CH2_ERR (1<<21) +#define DMA_CH3_ERR (1<<20) + +#define DMA_IN_DMA_REQ0 (1<<19) /* Internal DMA Request is pending */ +#define DMA_IN_DMA_REQ1 (1<<18) +#define DMA_IN_DMA_REQ2 (1<<17) +#define DMA_IN_DMA_REQ3 (1<<16) + +#define DMA_EXT_DMA_REQ0 (1<<15) /* External DMA Request is pending */ +#define DMA_EXT_DMA_REQ1 (1<<14) +#define DMA_EXT_DMA_REQ2 (1<<13) +#define DMA_EXT_DMA_REQ3 (1<<12) + +#define DMA_CH0_BUSY (1<<11) /* DMA Channel 0 Busy */ +#define DMA_CH1_BUSY (1<<10) +#define DMA_CH2_BUSY (1<<9) +#define DMA_CH3_BUSY (1<<8) + +#define DMA_SG0 (1<<7) /* DMA Channel 0 Scatter/Gather in progress */ +#define DMA_SG1 (1<<6) +#define DMA_SG2 (1<<5) +#define DMA_SG3 (1<<4) + +/* + * DMA SG Command Register + */ +#define SSG0_ENABLE (1<<31) /* Start Scatter Gather */ +#define SSG1_ENABLE (1<<30) +#define SSG2_ENABLE (1<<29) +#define SSG3_ENABLE (1<<28) +#define SSG0_MASK_ENABLE (1<<15) /* Enable writing to SSG0 bit */ +#define SSG1_MASK_ENABLE (1<<14) +#define SSG2_MASK_ENABLE (1<<13) +#define SSG3_MASK_ENABLE (1<<12) + +/* + * DMA Scatter/Gather Descriptor Bit fields + */ +#define SG_LINK (1<<31) /* Link */ +#define SG_TCI_ENABLE (1<<29) /* Enable Terminal Count Interrupt */ +#define SG_ETI_ENABLE (1<<28) /* Enable End of Transfer Interrupt */ +#define SG_ERI_ENABLE (1<<27) /* Enable Error Interrupt */ +#define SG_COUNT_MASK 0xFFFF /* Count Field */ + +#define SET_DMA_CONTROL \ + (SET_DMA_CIE_ENABLE(p_init->int_enable) | /* interrupt enable */ \ + SET_DMA_BEN(p_init->buffer_enable) | /* buffer enable */\ + SET_DMA_ETD(p_init->etd_output) | /* end of transfer pin */ \ + SET_DMA_TCE(p_init->tce_enable) | /* terminal count enable */ \ + SET_DMA_PL(p_init->pl) | /* peripheral location */ \ + SET_DMA_DAI(p_init->dai) | /* dest addr increment */ \ + SET_DMA_SAI(p_init->sai) | /* src addr increment */ \ + SET_DMA_PRIORITY(p_init->cp) | /* channel priority */ \ + SET_DMA_PW(p_init->pwidth) | /* peripheral/bus width */ \ + SET_DMA_PSC(p_init->psc) | /* peripheral setup cycles */ \ + SET_DMA_PWC(p_init->pwc) | /* peripheral wait cycles */ \ + SET_DMA_PHC(p_init->phc) | /* peripheral hold cycles */ \ + SET_DMA_PREFETCH(p_init->pf) /* read prefetch */) + +#define GET_DMA_POLARITY(chan) (DMAReq##chan##_ActiveLow | DMAAck##chan##_ActiveLow | EOT##chan##_ActiveLow) + +#elif defined(CONFIG_STBXXX_DMA) /* stb03xxx */ + +#define DMA_PPC4xx_SIZE 4096 + +/* + * DMA Status Register + */ + +#define SET_DMA_PRIORITY(x) (((x)&0x00800001)) /* DMA Channel Priority */ +#define DMA_PRIORITY_MASK 0x00800001 +#define PRIORITY_LOW 0x00000000 +#define PRIORITY_MID_LOW 0x00000001 +#define PRIORITY_MID_HIGH 0x00800000 +#define PRIORITY_HIGH 0x00800001 +#define GET_DMA_PRIORITY(x) (((((x)&DMA_PRIORITY_MASK) &0x00800000) >> 22 ) | (((x)&DMA_PRIORITY_MASK) &0x00000001)) + +#define DMA_CS0 (1<<31) /* Terminal Count has been reached */ +#define DMA_CS1 (1<<30) +#define DMA_CS2 (1<<29) +#define DMA_CS3 (1<<28) + +#define DMA_TS0 (1<<27) /* End of Transfer has been requested */ +#define DMA_TS1 (1<<26) +#define DMA_TS2 (1<<25) +#define DMA_TS3 (1<<24) + +#define DMA_CH0_ERR (1<<23) /* DMA Chanel 0 Error */ +#define DMA_CH1_ERR (1<<22) +#define DMA_CH2_ERR (1<<21) +#define DMA_CH3_ERR (1<<20) + +#define DMA_CT0 (1<<19) /* Chained transfere */ + +#define DMA_IN_DMA_REQ0 (1<<18) /* Internal DMA Request is pending */ +#define DMA_IN_DMA_REQ1 (1<<17) +#define DMA_IN_DMA_REQ2 (1<<16) +#define DMA_IN_DMA_REQ3 (1<<15) + +#define DMA_EXT_DMA_REQ0 (1<<14) /* External DMA Request is pending */ +#define DMA_EXT_DMA_REQ1 (1<<13) +#define DMA_EXT_DMA_REQ2 (1<<12) +#define DMA_EXT_DMA_REQ3 (1<<11) + +#define DMA_CH0_BUSY (1<<10) /* DMA Channel 0 Busy */ +#define DMA_CH1_BUSY (1<<9) +#define DMA_CH2_BUSY (1<<8) +#define DMA_CH3_BUSY (1<<7) + +#define DMA_CT1 (1<<6) /* Chained transfere */ +#define DMA_CT2 (1<<5) +#define DMA_CT3 (1<<4) + +#define DMA_CH_ENABLE (1<<7) +#define SET_DMA_CH(x) (((x)&0x1)<<7) +#define GET_DMA_CH(x) (((x)&DMA_CH_ENABLE)>>7) + +/* STBx25xxx dma unique */ +/* enable device port on a dma channel + * example ext 0 on dma 1 + */ + +#define SSP0_RECV 15 +#define SSP0_XMIT 14 +#define EXT_DMA_0 12 +#define SC1_XMIT 11 +#define SC1_RECV 10 +#define EXT_DMA_2 9 +#define EXT_DMA_3 8 +#define SERIAL2_XMIT 7 +#define SERIAL2_RECV 6 +#define SC0_XMIT 5 +#define SC0_RECV 4 +#define SERIAL1_XMIT 3 +#define SERIAL1_RECV 2 +#define SERIAL0_XMIT 1 +#define SERIAL0_RECV 0 + +#define DMA_CHAN_0 1 +#define DMA_CHAN_1 2 +#define DMA_CHAN_2 3 +#define DMA_CHAN_3 4 + +/* end STBx25xx */ + +/* + * Bit 30 must be one for Redwoods, otherwise transfers may receive errors. + */ +#define DMA_CR_MB0 0x2 + +#define SET_DMA_CONTROL \ + (SET_DMA_CIE_ENABLE(p_init->int_enable) | /* interrupt enable */ \ + SET_DMA_ETD(p_init->etd_output) | /* end of transfer pin */ \ + SET_DMA_TCE(p_init->tce_enable) | /* terminal count enable */ \ + SET_DMA_PL(p_init->pl) | /* peripheral location */ \ + SET_DMA_DAI(p_init->dai) | /* dest addr increment */ \ + SET_DMA_SAI(p_init->sai) | /* src addr increment */ \ + SET_DMA_PRIORITY(p_init->cp) | /* channel priority */ \ + SET_DMA_PW(p_init->pwidth) | /* peripheral/bus width */ \ + SET_DMA_PSC(p_init->psc) | /* peripheral setup cycles */ \ + SET_DMA_PWC(p_init->pwc) | /* peripheral wait cycles */ \ + SET_DMA_PHC(p_init->phc) | /* peripheral hold cycles */ \ + SET_DMA_TCD(p_init->tcd_disable) | /* TC chain mode disable */ \ + SET_DMA_ECE(p_init->ece_enable) | /* ECE chanin mode enable */ \ + SET_DMA_CH(p_init->ch_enable) | /* Chain enable */ \ + DMA_CR_MB0 /* must be one */) + +#define GET_DMA_POLARITY(chan) chan + +#endif + +typedef struct { + unsigned short in_use; /* set when channel is being used, clr when + * available. + */ + /* + * Valid polarity settings: + * DMAReq0_ActiveLow + * DMAAck0_ActiveLow + * EOT0_ActiveLow + * + * DMAReq1_ActiveLow + * DMAAck1_ActiveLow + * EOT1_ActiveLow + * + * DMAReq2_ActiveLow + * DMAAck2_ActiveLow + * EOT2_ActiveLow + * + * DMAReq3_ActiveLow + * DMAAck3_ActiveLow + * EOT3_ActiveLow + */ + unsigned int polarity; + + char buffer_enable; /* Boolean: buffer enable */ + char tce_enable; /* Boolean: terminal count enable */ + char etd_output; /* Boolean: eot pin is a tc output */ + char pce; /* Boolean: parity check enable */ + + /* + * Peripheral location: + * INTERNAL_PERIPHERAL (UART0 on the 405GP) + * EXTERNAL_PERIPHERAL + */ + char pl; /* internal/external peripheral */ + + /* + * Valid pwidth settings: + * PW_8 + * PW_16 + * PW_32 + * PW_64 + */ + unsigned int pwidth; + + char dai; /* Boolean: dst address increment */ + char sai; /* Boolean: src address increment */ + + /* + * Valid psc settings: 0-3 + */ + unsigned int psc; /* Peripheral Setup Cycles */ + + /* + * Valid pwc settings: + * 0-63 + */ + unsigned int pwc; /* Peripheral Wait Cycles */ + + /* + * Valid phc settings: + * 0-7 + */ + unsigned int phc; /* Peripheral Hold Cycles */ + + /* + * Valid cp (channel priority) settings: + * PRIORITY_LOW + * PRIORITY_MID_LOW + * PRIORITY_MID_HIGH + * PRIORITY_HIGH + */ + unsigned int cp; /* channel priority */ + + /* + * Valid pf (memory read prefetch) settings: + * + * PREFETCH_1 + * PREFETCH_2 + * PREFETCH_4 + */ + unsigned int pf; /* memory read prefetch */ + + /* + * Boolean: channel interrupt enable + * NOTE: for sgl transfers, only the last descriptor will be setup to + * interrupt. + */ + char int_enable; + + char shift; /* easy access to byte_count shift, based on */ + /* the width of the channel */ + + uint32_t control; /* channel control word */ + + /* These variabled are used ONLY in single dma transfers */ + unsigned int mode; /* transfer mode */ + phys_addr_t addr; + char ce; /* channel enable */ +#ifdef CONFIG_STB03xxx + char ch_enable; + char tcd_disable; + char ece_enable; + char td; /* transfer direction */ +#endif + +} ppc_dma_ch_t; + +/* + * PPC44x DMA implementations have a slightly different + * descriptor layout. Probably moved about due to the + * change to 64-bit addresses and link pointer. I don't + * know why they didn't just leave control_count after + * the dst_addr. + */ +#ifdef PPC4xx_DMA_64BIT +typedef struct { + uint32_t control; + uint32_t control_count; + phys_addr_t src_addr; + phys_addr_t dst_addr; + phys_addr_t next; +} ppc_sgl_t; +#else +typedef struct { + uint32_t control; + phys_addr_t src_addr; + phys_addr_t dst_addr; + uint32_t control_count; + uint32_t next; +} ppc_sgl_t; +#endif + +typedef struct { + unsigned int dmanr; + uint32_t control; /* channel ctrl word; loaded from each descrptr */ + uint32_t sgl_control; /* LK, TCI, ETI, and ERI bits in sgl descriptor */ + dma_addr_t dma_addr; /* dma (physical) address of this list */ + ppc_sgl_t *phead; + ppc_sgl_t *ptail; + uint32_t pad32[2]; + +} sgl_list_info_t; + +typedef struct { + phys_addr_t *src_addr; + phys_addr_t *dst_addr; + phys_addr_t dma_src_addr; + phys_addr_t dma_dst_addr; +} pci_alloc_desc_t; + +extern ppc_dma_ch_t dma_channels[]; + +/* + * The DMA API are in ppc4xx_dma.c and ppc4xx_sgdma.c + */ +extern int ppc4xx_init_dma_channel(unsigned int, ppc_dma_ch_t *); +extern int ppc4xx_get_channel_config(unsigned int, ppc_dma_ch_t *); +extern int ppc4xx_set_channel_priority(unsigned int, unsigned int); +extern unsigned int ppc4xx_get_peripheral_width(unsigned int); +extern int ppc4xx_alloc_dma_handle(sgl_handle_t *, unsigned int, unsigned int); +extern void ppc4xx_free_dma_handle(sgl_handle_t); +extern int ppc4xx_get_dma_status(void); +extern void ppc4xx_set_src_addr(int dmanr, phys_addr_t src_addr); +extern void ppc4xx_set_dst_addr(int dmanr, phys_addr_t dst_addr); +extern void ppc4xx_enable_dma(unsigned int dmanr); +extern void ppc4xx_disable_dma(unsigned int dmanr); +extern void ppc4xx_set_dma_count(unsigned int dmanr, unsigned int count); +extern int ppc4xx_get_dma_residue(unsigned int dmanr); +extern void ppc4xx_set_dma_addr2(unsigned int dmanr, phys_addr_t src_dma_addr, + phys_addr_t dst_dma_addr); +extern int ppc4xx_enable_dma_interrupt(unsigned int dmanr); +extern int ppc4xx_disable_dma_interrupt(unsigned int dmanr); +extern int ppc4xx_clr_dma_status(unsigned int dmanr); +extern int ppc4xx_map_dma_port(unsigned int dmanr, unsigned int ocp_dma,short dma_chan); +extern int ppc4xx_disable_dma_port(unsigned int dmanr, unsigned int ocp_dma,short dma_chan); +extern int ppc4xx_set_dma_mode(unsigned int dmanr, unsigned int mode); + +/* These are in kernel/dma.c: */ + +/* reserve a DMA channel */ +extern int request_dma(unsigned int dmanr, const char *device_id); +/* release it again */ +extern void free_dma(unsigned int dmanr); +#endif +#endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/ppc_asm.h linux-2.4.23-pre8/include/asm-ppc/ppc_asm.h --- linux-2.4.22/include/asm-ppc/ppc_asm.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/ppc_asm.h 2003-10-22 22:47:39.000000000 +0000 @@ -112,6 +112,12 @@ bdnz 0b #endif +#ifdef CONFIG_BOOKE +#define tophys(rd,rs) \ + mr rd,rs +#define tovirt(rd,rs) \ + mr rd,rs +#else /* CONFIG_BOOKE */ /* * On APUS (Amiga PowerPC cpu upgrade board), we don't know the * physical base address of RAM at compile time. @@ -129,6 +135,7 @@ .align 1; \ .long 0b; \ .previous +#endif /* CONFIG_BOOKE */ /* * On 64-bit cpus, we use the rfid instruction instead of rfi, but diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/processor.h linux-2.4.23-pre8/include/asm-ppc/processor.h --- linux-2.4.22/include/asm-ppc/processor.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/processor.h 2003-10-22 22:47:29.000000000 +0000 @@ -3,6 +3,12 @@ #define __ASM_PPC_PROCESSOR_H /* + * The Book E definitions are hacked into here for 44x right + * now. This whole thing needs regorganized (maybe per-core + * files) * so that it becomes readable. -Matt + */ + +/* * Default implementation of macro that returns current * instruction pointer ("program counter"). */ @@ -45,6 +51,11 @@ #define MSR_RI (1<<1) /* Recoverable Exception */ #define MSR_LE (1<<0) /* Little Endian */ +#ifdef CONFIG_BOOKE +#define MSR_IS MSR_IR /* Instruction Space */ +#define MSR_DS MSR_DR /* Data Space */ +#endif + #ifdef CONFIG_APUS_FAST_EXCEPT #define MSR_ MSR_ME|MSR_IP|MSR_RI #else @@ -89,8 +100,13 @@ #define SPRN_CDBCR 0x3D7 /* Cache Debug Control Register */ #define SPRN_CTR 0x009 /* Count Register */ #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */ +#ifdef CONFIG_BOOKE +#define SPRN_DAC1 0x13C /* Book E Data Address Compare 1 */ +#define SPRN_DAC2 0x13D /* Book E Data Address Compare 2 */ +#else #define SPRN_DAC1 0x3F6 /* Data Address Compare 1 */ #define SPRN_DAC2 0x3F7 /* Data Address Compare 2 */ +#endif /* CONFIG_BOOKE */ #define SPRN_DAR 0x013 /* Data Address Register */ #define SPRN_DBAT0L 0x219 /* Data BAT 0 Lower Register */ #define SPRN_DBAT0U 0x218 /* Data BAT 0 Upper Register */ @@ -109,7 +125,7 @@ #define SPRN_DBAT7L 0x23F /* Data BAT 7 Lower Register */ #define SPRN_DBAT7U 0x23E /* Data BAT 7 Upper Register */ -#define SPRN_DBCR 0x3F2 /* Debug Control Regsiter */ +#define SPRN_DBCR 0x3F2 /* Debug Control Register */ #define DBCR_EDM 0x80000000 #define DBCR_IDM 0x40000000 #define DBCR_RST(x) (((x) & 0x3) << 28) @@ -142,7 +158,11 @@ #define DBCR_SDA 0x00000004 /* Second DAC Enable */ #define DBCR_JOI 0x00000002 /* JTAG Serial Outbound Int. Enable */ #define DBCR_JII 0x00000001 /* JTAG Serial Inbound Int. Enable */ +#ifdef CONFIG_BOOKE +#define SPRN_DBCR0 0x134 /* Book E Debug Control Register 0 */ +#else #define SPRN_DBCR0 0x3F2 /* Debug Control Register 0 */ +#endif /* CONFIG_BOOKE */ #define DBCR0_EDM 0x80000000 /* External Debug Mode */ #define DBCR0_IDM 0x40000000 /* Internal Debug Mode */ #define DBCR0_RST 0x30000000 /* all the bits in the RST field */ @@ -165,10 +185,17 @@ #define DBCR0_IA12T 0x00008000 /* Instr Addr 1-2 range Toggle */ #define DBCR0_IA34T 0x00004000 /* Instr Addr 3-4 range Toggle */ #define DBCR0_FT 0x00000001 /* Freeze Timers on debug event */ +#ifdef CONFIG_BOOKE +#define SPRN_DBCR1 0x135 /* Book E Debug Control Register 1 */ +#define SPRN_DBSR 0x130 /* Book E Debug Status Register */ +#define DBSR_IC 0x08000000 /* Book E Instruction Completion */ +#define DBSR_TIE 0x01000000 /* Book E Trap Instruction debug Event*/ +#else /* CONFIG_BOOKE */ #define SPRN_DBCR1 0x3BD /* Debug Control Register 1 */ #define SPRN_DBSR 0x3F0 /* Debug Status Register */ #define DBSR_IC 0x80000000 /* Instruction Completion */ #define DBSR_TIE 0x10000000 /* Trap Instruction debug Event */ +#endif /* CONFIG_BOOKE */ #define SPRN_DCCR 0x3FA /* Data Cache Cacheability Register */ #define DCCR_NOCACHE 0 /* Noncacheable */ #define DCCR_CACHE 1 /* Cacheable */ @@ -176,7 +203,11 @@ #define SPRN_DCWR 0x3BA /* Data Cache Write-thru Register */ #define DCWR_COPY 0 /* Copy-back */ #define DCWR_WRITE 1 /* Write-through */ +#ifdef CONFIG_BOOKE +#define SPRN_DEAR 0x03D /* Book E Data Error Address Register */ +#else #define SPRN_DEAR 0x3D5 /* Data Error Address Register */ +#endif /* CONFIG_BOOKE */ #define SPRN_DEC 0x016 /* Decrement Register */ #define SPRN_DER 0x095 /* Debug Enable Regsiter */ #define DER_RSTE 0x40000000 /* Reset Interrupt */ @@ -201,7 +232,11 @@ #define SPRN_DMISS 0x3D0 /* Data TLB Miss Register */ #define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */ #define SPRN_EAR 0x11A /* External Address Register */ +#ifdef CONFIG_BOOKE +#define SPRN_ESR 0x03E /* Book E Exception Syndrome Register */ +#else #define SPRN_ESR 0x3D4 /* Exception Syndrome Register */ +#endif /* CONFIG_BOOKE */ #define ESR_IMCP 0x80000000 /* Instr. Machine Check - Protection */ #define ESR_IMCN 0x40000000 /* Instr. Machine Check - Non-config */ #define ESR_IMCB 0x20000000 /* Instr. Machine Check - Bus error */ @@ -261,8 +296,13 @@ #define HID1_ABE (1<<10) /* 7450 Address Broadcast Enable */ #define SPRN_HID2 0x3F8 /* Hardware Implementation Register 2 */ #define SPRN_IABR 0x3F2 /* Instruction Address Breakpoint Register */ +#ifdef CONFIG_BOOKE +#define SPRN_IAC1 0x138 /* Book E Instruction Address Compare 1 */ +#define SPRN_IAC2 0x139 /* Book E Instruction Address Compare 2 */ +#else #define SPRN_IAC1 0x3F4 /* Instruction Address Compare 1 */ #define SPRN_IAC2 0x3F5 /* Instruction Address Compare 2 */ +#endif /* CONFIG_BOOKE */ #define SPRN_IBAT0L 0x211 /* Instruction BAT 0 Lower Register */ #define SPRN_IBAT0U 0x210 /* Instruction BAT 0 Upper Register */ #define SPRN_IBAT1L 0x213 /* Instruction BAT 1 Lower Register */ @@ -353,8 +393,13 @@ #define SPRN_PBL2 0x3FE /* Protection Bound Lower 2 */ #define SPRN_PBU1 0x3FD /* Protection Bound Upper 1 */ #define SPRN_PBU2 0x3FF /* Protection Bound Upper 2 */ +#ifdef CONFIG_BOOKE +#define SPRN_PID 0x030 /* Book E Process ID */ +#define SPRN_PIR 0x11E /* Book E Processor Identification Register */ +#else #define SPRN_PID 0x3B1 /* Process ID */ #define SPRN_PIR 0x3FF /* Processor Identification Register */ +#endif /* CONFIG_BOOKE */ #define SPRN_PIT 0x3DB /* Programmable Interval Timer */ #define SPRN_PMC1 0x3B9 /* Performance Counter Register 1 */ #define SPRN_PMC2 0x3BA /* Performance Counter Register 2 */ @@ -379,6 +424,14 @@ #define SPRN_SPRG5 0x115 /* Special Purpose Register General 5 (4xx) */ #define SPRN_SPRG6 0x116 /* Special Purpose Register General 6 (4xx) */ #define SPRN_SPRG7 0x117 /* Special Purpose Register General 7 (4xx) */ +#define SPRG4R SPRN_SPRG4R /* Book E Supervisor Private Registers */ +#define SPRG5R SPRN_SPRG5R +#define SPRG6R SPRN_SPRG6R +#define SPRG7R SPRN_SPRG7R +#define SPRG4W SPRN_SPRG4W +#define SPRG5W SPRN_SPRG5W +#define SPRG6W SPRN_SPRG6W +#define SPRG7W SPRN_SPRG7W #define SPRN_SRR0 0x01A /* Save/Restore Register 0 */ #define SPRN_SRR1 0x01B /* Save/Restore Register 1 */ #define SPRN_SRR2 0x3DE /* Save/Restore Register 2 */ @@ -392,7 +445,11 @@ #define SPRN_TBRU 0x10D /* Time Base Read Upper Register (user, R/O) */ #define SPRN_TBWL 0x11C /* Time Base Lower Register (super, R/W) */ #define SPRN_TBWU 0x11D /* Time Base Upper Register (super, R/W) */ +#ifdef CONFIG_BOOKE +#define SPRN_TCR 0x154 /* Book E Timer Control Register */ +#else #define SPRN_TCR 0x3DA /* Timer Control Register */ +#endif /* CONFIG_BOOKE */ #define TCR_WP(x) (((x)&0x3)<<30) /* WDT Period */ #define WP_2_17 0 /* 2^17 clocks */ #define WP_2_21 1 /* 2^21 clocks */ @@ -405,6 +462,7 @@ #define WRC_SYSTEM 3 /* System reset will occur */ #define TCR_WIE 0x08000000 /* WDT Interrupt Enable */ #define TCR_PIE 0x04000000 /* PIT Interrupt Enable */ +#define TCR_DIE TCR_PIE /* DEC Interrupt Enable */ #define TCR_FP(x) (((x)&0x3)<<24) /* FIT Period */ #define FP_2_9 0 /* 2^9 clocks */ #define FP_2_13 1 /* 2^13 clocks */ @@ -425,7 +483,11 @@ #define SPRN_THRM3 0x3FE /* Thermal Management Register 3 */ #define THRM3_E (1<<0) #define SPRN_TLBMISS 0x3D4 /* 980 7450 TLB Miss Register */ +#ifdef CONFIG_BOOKE +#define SPRN_TSR 0x150 /* Book E Timer Status Register */ +#else #define SPRN_TSR 0x3D8 /* Timer Status Register */ +#endif /* CONFIG_BOOKE */ #define TSR_ENW 0x80000000 /* Enable Next Watchdog */ #define TSR_WIS 0x40000000 /* WDT Interrupt Status */ #define TSR_WRS(x) (((x)&0x3)<<28) /* WDT Reset Status */ @@ -434,6 +496,7 @@ #define WRS_CHIP 2 /* WDT forced chip reset */ #define WRS_SYSTEM 3 /* WDT forced system reset */ #define TSR_PIS 0x08000000 /* PIT Interrupt Status */ +#define TSR_DIS TSR_PIS /* DEC Interrupt Status */ #define TSR_FIS 0x04000000 /* FIT Interrupt Status */ #define SPRN_UMMCR0 0x3A8 /* User Monitor Mode Control Register 0 */ #define SPRN_UMMCR1 0x3AC /* User Monitor Mode Control Register 0 */ @@ -446,6 +509,45 @@ #define SPRN_XER 0x001 /* Fixed Point Exception Register */ #define SPRN_ZPR 0x3B0 /* Zone Protection Register */ +/* Book E definitions */ +#define SPRN_DECAR 0x036 /* Decrementer Auto Reload Register */ +#define SPRN_CSRR0 0x03A /* Critical Save and Restore Register 0 */ +#define SPRN_CSRR1 0x03B /* Critical Save and Restore Register 1 */ +#define SPRN_IVPR 0x03F /* Interrupt Vector Prefix Register */ +#define SPRN_USPRG0 0x100 /* User Special Purpose Register General 0 */ +#define SPRN_SPRG4R 0x104 /* Special Purpose Register General 4 Read */ +#define SPRN_SPRG5R 0x105 /* Special Purpose Register General 5 Read */ +#define SPRN_SPRG6R 0x106 /* Special Purpose Register General 6 Read */ +#define SPRN_SPRG7R 0x107 /* Special Purpose Register General 7 Read */ +#define SPRN_SPRG4W 0x114 /* Special Purpose Register General 4 Write */ +#define SPRN_SPRG5W 0x115 /* Special Purpose Register General 5 Write */ +#define SPRN_SPRG6W 0x116 /* Special Purpose Register General 6 Write */ +#define SPRN_SPRG7W 0x117 /* Special Purpose Register General 7 Write */ +#define SPRN_DBCR2 0x136 /* Debug Control Register 2 */ +#define SPRN_IAC3 0x13A /* Instruction Address Compare 3 */ +#define SPRN_IAC4 0x13B /* Instruction Address Compare 4 */ +#define SPRN_DVC1 0x13E /* */ +#define SPRN_DVC2 0x13F /* */ +#define SPRN_IVOR0 0x190 /* Interrupt Vector Offset Register 0 */ +#define SPRN_IVOR1 0x191 /* Interrupt Vector Offset Register 1 */ +#define SPRN_IVOR2 0x192 /* Interrupt Vector Offset Register 2 */ +#define SPRN_IVOR3 0x193 /* Interrupt Vector Offset Register 3 */ +#define SPRN_IVOR4 0x194 /* Interrupt Vector Offset Register 4 */ +#define SPRN_IVOR5 0x195 /* Interrupt Vector Offset Register 5 */ +#define SPRN_IVOR6 0x196 /* Interrupt Vector Offset Register 6 */ +#define SPRN_IVOR7 0x197 /* Interrupt Vector Offset Register 7 */ +#define SPRN_IVOR8 0x198 /* Interrupt Vector Offset Register 8 */ +#define SPRN_IVOR9 0x199 /* Interrupt Vector Offset Register 9 */ +#define SPRN_IVOR10 0x19a /* Interrupt Vector Offset Register 10 */ +#define SPRN_IVOR11 0x19b /* Interrupt Vector Offset Register 11 */ +#define SPRN_IVOR12 0x19c /* Interrupt Vector Offset Register 12 */ +#define SPRN_IVOR13 0x19d /* Interrupt Vector Offset Register 13 */ +#define SPRN_IVOR14 0x19e /* Interrupt Vector Offset Register 14 */ +#define SPRN_IVOR15 0x19f /* Interrupt Vector Offset Register 15 */ +#define SPRN_MMUCR 0x3b2 /* MMU Control Register */ + +#define ESR_ST 0x00800000 /* Store Operation */ + /* Short-hand versions for a number of the above SPRNs */ #define CTR SPRN_CTR /* Counter Register */ @@ -559,6 +661,10 @@ #define PVR_403GCX 0x00201400 #define PVR_405GP 0x40110000 #define PVR_STB03XXX 0x40310000 +#define PVR_440GP_RB 0x40120440 +#define PVR_440GP_RC1 0x40120481 +#define PVR_440GP_RC2 0x40200481 +#define PVR_440GX_RC1 0x51b21850 #define PVR_601 0x00010000 #define PVR_602 0x00050000 #define PVR_603 0x00030000 @@ -691,7 +797,7 @@ * as soon as I get around to remapping the io areas with the BATs * to match the mac we can raise this. -- Cort */ -#define TASK_SIZE (0x80000000UL) +#define TASK_SIZE CONFIG_TASK_SIZE /* This decides where the kernel will search for a free chunk of vm * space during mmap's. @@ -716,6 +822,7 @@ vector128 vr[32]; /* Complete AltiVec set */ vector128 vscr; /* AltiVec status */ unsigned long vrsave; + int used_vr; /* set if process has used altivec */ #endif /* CONFIG_ALTIVEC */ #if defined(CONFIG_4xx) /* Saved 4xx debug registers */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/scatterlist.h linux-2.4.23-pre8/include/asm-ppc/scatterlist.h --- linux-2.4.22/include/asm-ppc/scatterlist.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/scatterlist.h 2003-10-22 22:47:37.000000000 +0000 @@ -9,9 +9,12 @@ * or NULL for highmem page */ struct page * page; /* Location for highmem page, if any */ unsigned int offset; /* for highmem, page offset */ + unsigned int length; /* length at address or page+offset */ - dma_addr_t dma_address; /* phys/bus dma address */ - unsigned int length; /* length */ + dma_addr_t dma_address; /* phys/bus dma address */ + unsigned int dma_length; /* number of bytes mapped at dma_address */ + /* Note that if we coalesce multiple scatterlist elements, + dma_length can be different from length */ }; /* @@ -22,7 +25,7 @@ * is 0. */ #define sg_dma_address(sg) ((sg)->dma_address) -#define sg_dma_len(sg) ((sg)->length) +#define sg_dma_len(sg) ((sg)->dma_length) #endif /* !(_PPC_SCATTERLIST_H) */ #endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/serial.h linux-2.4.23-pre8/include/asm-ppc/serial.h --- linux-2.4.22/include/asm-ppc/serial.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/serial.h 2003-10-22 22:49:41.000000000 +0000 @@ -14,7 +14,7 @@ #include #elif defined(CONFIG_SPRUCE) #include -#elif defined(CONFIG_40x) +#elif defined(CONFIG_4xx) #include #else diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/sigcontext.h linux-2.4.23-pre8/include/asm-ppc/sigcontext.h --- linux-2.4.22/include/asm-ppc/sigcontext.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/sigcontext.h 2003-10-22 22:47:28.000000000 +0000 @@ -3,8 +3,7 @@ #include - -struct sigcontext_struct { +struct sigcontext { unsigned long _unused[4]; int signal; unsigned long handler; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/uaccess.h linux-2.4.23-pre8/include/asm-ppc/uaccess.h --- linux-2.4.22/include/asm-ppc/uaccess.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/uaccess.h 2003-10-22 22:47:30.000000000 +0000 @@ -77,16 +77,28 @@ * As we use the same address space for kernel and user data on the * PowerPC, we can just do these as direct assignments. (Of course, the * exception handling means that it's no longer "just"...) + * + * The "user64" versions of the user access functions are versions that + * allow access of 64-bit data. The "get_user" functions do not + * properly handle 64-bit data because the value gets down cast to a long. + * The "put_user" functions already handle 64-bit data properly but we add + * "user64" versions for completeness */ #define get_user(x,ptr) \ __get_user_check((x),(ptr),sizeof(*(ptr))) +#define get_user64(x,ptr) \ + __get_user64_check((x),(ptr),sizeof(*(ptr))) #define put_user(x,ptr) \ __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) +#define put_user64(x,ptr) put_user(x,ptr) #define __get_user(x,ptr) \ __get_user_nocheck((x),(ptr),sizeof(*(ptr))) +#define __get_user64(x,ptr) \ + __get_user64_nocheck((x),(ptr),sizeof(*(ptr))) #define __put_user(x,ptr) \ __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) +#define __put_user64(x,ptr) __put_user(x,ptr) extern long __put_user_bad(void); @@ -166,6 +178,15 @@ __gu_err; \ }) +#define __get_user64_nocheck(x,ptr,size) \ +({ \ + long __gu_err; \ + long long __gu_val; \ + __get_user_size64(__gu_val,(ptr),(size),__gu_err); \ + (x) = (__typeof__(*(ptr)))__gu_val; \ + __gu_err; \ +}) + #define __get_user_check(x,ptr,size) \ ({ \ long __gu_err = -EFAULT, __gu_val = 0; \ @@ -176,6 +197,17 @@ __gu_err; \ }) +#define __get_user64_check(x,ptr,size) \ +({ \ + long __gu_err = -EFAULT; \ + long long __gu_val = 0; \ + const __typeof__(*(ptr)) *__gu_addr = (ptr); \ + if (access_ok(VERIFY_READ,__gu_addr,size)) \ + __get_user_size64(__gu_val,__gu_addr,(size),__gu_err); \ + (x) = (__typeof__(*(ptr)))__gu_val; \ + __gu_err; \ +}) + extern long __get_user_bad(void); #define __get_user_size(x,ptr,size,retval) \ @@ -185,6 +217,17 @@ case 1: __get_user_asm(x,ptr,retval,"lbz"); break; \ case 2: __get_user_asm(x,ptr,retval,"lhz"); break; \ case 4: __get_user_asm(x,ptr,retval,"lwz"); break; \ + default: (x) = __get_user_bad(); \ + } \ +} while (0) + +#define __get_user_size64(x,ptr,size,retval) \ +do { \ + retval = 0; \ + switch (size) { \ + case 1: __get_user_asm(x,ptr,retval,"lbz"); break; \ + case 2: __get_user_asm(x,ptr,retval,"lhz"); break; \ + case 4: __get_user_asm(x,ptr,retval,"lwz"); break; \ case 8: __get_user_asm2(x, ptr, retval); break; \ default: (x) = __get_user_bad(); \ } \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/ucontext.h linux-2.4.23-pre8/include/asm-ppc/ucontext.h --- linux-2.4.22/include/asm-ppc/ucontext.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/ucontext.h 2003-10-22 22:49:09.000000000 +0000 @@ -1,14 +1,27 @@ #ifndef _ASMPPC_UCONTEXT_H #define _ASMPPC_UCONTEXT_H -/* Copied from i386. */ +#include +#include + +struct mcontext { + elf_gregset_t mc_gregs; + elf_fpregset_t mc_fregs; + unsigned long mc_pad[2]; + elf_vrregset_t mc_vregs __attribute__((__aligned__(16))); +}; struct ucontext { - unsigned long uc_flags; - struct ucontext *uc_link; - stack_t uc_stack; - struct sigcontext_struct uc_mcontext; - sigset_t uc_sigmask; /* mask last for extensibility */ + unsigned long uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + int uc_pad[7]; + struct mcontext *uc_regs; /* points to uc_mcontext field */ + sigset_t uc_sigmask; + /* glibc has 1024-bit signal masks, ours are 64-bit */ + int uc_maskext[30]; + int uc_pad2[3]; + struct mcontext uc_mcontext; }; #endif /* !_ASMPPC_UCONTEXT_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc/unistd.h linux-2.4.23-pre8/include/asm-ppc/unistd.h --- linux-2.4.22/include/asm-ppc/unistd.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc/unistd.h 2003-10-22 22:47:59.000000000 +0000 @@ -237,7 +237,25 @@ #define __NR_io_getevents 229 #define __NR_io_submit 230 #define __NR_io_cancel 231 +#define __NR_set_tid_address 232 +#define __NR_fadvise64 233 +#define __NR_exit_group 234 +#define __NR_lookup_dcookie 235 +#define __NR_epoll_create 236 +#define __NR_epoll_ctl 237 +#define __NR_epoll_wait 238 +#define __NR_remap_file_pages 239 +#define __NR_timer_create 240 +#define __NR_timer_settime 241 +#define __NR_timer_gettime 242 +#define __NR_timer_getoverrun 243 +#define __NR_timer_delete 244 +#define __NR_clock_settime 245 +#define __NR_clock_gettime 246 +#define __NR_clock_getres 247 +#define __NR_clock_nanosleep 248 #endif +#define __NR_swapcontext 249 #define __NR(n) #n diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-ppc64/pci.h linux-2.4.23-pre8/include/asm-ppc64/pci.h --- linux-2.4.22/include/asm-ppc64/pci.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-ppc64/pci.h 2003-10-22 22:48:00.000000000 +0000 @@ -25,6 +25,12 @@ #define PCIBIOS_MIN_IO 0x1000 #define PCIBIOS_MIN_MEM 0x10000000 +/* + * ppc64 can have multifunction devices that do not respond to function 0. + * In this case we must scan all functions. + */ +#define pcibios_scan_all_fns() 1 + static inline void pcibios_set_master(struct pci_dev *dev) { /* No special bus mastering setup handling */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/checksum.h linux-2.4.23-pre8/include/asm-sh/checksum.h --- linux-2.4.22/include/asm-sh/checksum.h 2001-09-08 19:29:09.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/checksum.h 2003-10-22 22:47:55.000000000 +0000 @@ -169,7 +169,6 @@ } #define _HAVE_ARCH_IPV6_CSUM -#ifdef CONFIG_IPV6 static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, __u32 len, @@ -205,7 +204,6 @@ return csum_fold(sum); } -#endif /* * Copy and checksum to user diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/delay.h linux-2.4.23-pre8/include/asm-sh/delay.h --- linux-2.4.22/include/asm-sh/delay.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/delay.h 2003-10-22 22:49:39.000000000 +0000 @@ -8,6 +8,7 @@ */ extern void __bad_udelay(void); +extern void __bad_ndelay(void); extern void __udelay(unsigned long usecs); extern void __ndelay(unsigned long nsecs); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/div64.h linux-2.4.23-pre8/include/asm-sh/div64.h --- linux-2.4.22/include/asm-sh/div64.h 2000-03-05 17:33:55.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/div64.h 2003-10-22 22:47:29.000000000 +0000 @@ -1,10 +1,20 @@ #ifndef __ASM_SH_DIV64 #define __ASM_SH_DIV64 +extern u64 __xdiv64_32(u64 n, u32 d); + #define do_div(n,base) ({ \ -int __res; \ -__res = ((unsigned long) n) % (unsigned) base; \ -n = ((unsigned long) n) / (unsigned) base; \ +u64 __n = (n), __q; \ +u32 __base = (base); \ +u32 __res; \ +if ((__n >> 32) == 0) { \ + __res = ((unsigned long) __n) % (unsigned) __base; \ + (n) = ((unsigned long) __n) / (unsigned) __base; \ +} else { \ + __q = __xdiv64_32(__n, __base); \ + __res = __n - __q * __base; \ + (n) = __q; \ +} \ __res; }) #endif /* __ASM_SH_DIV64 */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/io.h linux-2.4.23-pre8/include/asm-sh/io.h --- linux-2.4.22/include/asm-sh/io.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/io.h 2003-10-22 22:49:02.000000000 +0000 @@ -135,6 +135,8 @@ # include # elif defined(CONFIG_SH_SECUREEDGE5410) # include +# elif defined(CONFIG_SH_SH4202_MICRODEV) +# include # elif defined(CONFIG_SH_UNKNOWN) # include # else diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/io_microdev.h linux-2.4.23-pre8/include/asm-sh/io_microdev.h --- linux-2.4.22/include/asm-sh/io_microdev.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/io_microdev.h 2003-10-22 22:49:01.000000000 +0000 @@ -0,0 +1,82 @@ +/* + * linux/include/asm-sh/io_microdev.h + * + * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com) + * + * IO functions for the SuperH SH4-202 MicroDev board. + * + * May be copied or modified under the terms of the GNU General Public + * License. See linux/COPYING for more information. + * + */ + + +#ifndef _ASM_SH_IO_MICRODEV_H +#define _ASM_SH_IO_MICRODEV_H + +#include + +extern unsigned long microdev_isa_port2addr(unsigned long offset); + +extern unsigned char microdev_inb(unsigned long port); +extern unsigned short microdev_inw(unsigned long port); +extern unsigned int microdev_inl(unsigned long port); + +extern void microdev_outb(unsigned char value, unsigned long port); +extern void microdev_outw(unsigned short value, unsigned long port); +extern void microdev_outl(unsigned int value, unsigned long port); + +extern unsigned char microdev_inb_p(unsigned long port); +extern unsigned short microdev_inw_p(unsigned long port); +extern unsigned int microdev_inl_p(unsigned long port); + +extern void microdev_outb_p(unsigned char value, unsigned long port); +extern void microdev_outw_p(unsigned short value, unsigned long port); +extern void microdev_outl_p(unsigned int value, unsigned long port); + +extern void microdev_insb(unsigned long port, void *addr, unsigned long count); +extern void microdev_insw(unsigned long port, void *addr, unsigned long count); +extern void microdev_insl(unsigned long port, void *addr, unsigned long count); + +extern void microdev_outsb(unsigned long port, const void *addr, unsigned long count); +extern void microdev_outsw(unsigned long port, const void *addr, unsigned long count); +extern void microdev_outsl(unsigned long port, const void *addr, unsigned long count); + +#ifdef __WANT_IO_DEF + +# define __inb microdev_inb +# define __inw microdev_inw +# define __inl microdev_inl +# define __outb microdev_outb +# define __outw microdev_outw +# define __outl microdev_outl + +# define __inb_p microdev_inb_p +# define __inw_p microdev_inw_p +# define __inl_p microdev_inl_p +# define __outb_p microdev_outb_p +# define __outw_p microdev_outw_p +# define __outl_p microdev_outl_p + +# define __insb microdev_insb +# define __insw microdev_insw +# define __insl microdev_insl +# define __outsb microdev_outsb +# define __outsw microdev_outsw +# define __outsl microdev_outsl + +# define __readb generic_readb +# define __readw generic_readw +# define __readl generic_readl +# define __writeb generic_writeb +# define __writew generic_writew +# define __writel generic_writel + +# define __isa_port2addr microdev_isa_port2addr +# define __ioremap generic_ioremap +# define __iounmap generic_iounmap + +#endif + +#endif /* _ASM_SH_IO_MICRODEV_H */ + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/irq.h linux-2.4.23-pre8/include/asm-sh/irq.h --- linux-2.4.22/include/asm-sh/irq.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/irq.h 2003-10-22 22:47:41.000000000 +0000 @@ -127,6 +127,8 @@ # define ONCHIP_NR_IRQS 48 // Actually 44 # elif defined(CONFIG_CPU_SUBTYPE_SH7751) # define ONCHIP_NR_IRQS 72 +# elif defined(CONFIG_CPU_SUBTYPE_SH4_202) +# define ONCHIP_NR_IRQS 72 # elif defined(CONFIG_CPU_SUBTYPE_ST40STB1) # define ONCHIP_NR_IRQS 144 # elif defined(CONFIG_CPU_SUBTYPE_ST40GX1) @@ -275,7 +277,7 @@ #endif /* CONFIG_CPU_SUBTYPE_SH7707 || CONFIG_CPU_SUBTYPE_SH7709 */ #if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751) || \ - defined(CONFIG_CPU_SUBTYPE_ST40) + defined(CONFIG_CPU_SUBTYPE_ST40) || defined(CONFIG_CPU_SUBTYPE_SH4_202) #define INTC_ICR 0xffd00000 #define INTC_ICR_NMIL (1<<15) #define INTC_ICR_MAI (1<<14) @@ -293,18 +295,21 @@ #else #error Unknown CPU #endif - -#define INTC2_BASE0 0xfe080000 -#define INTC2_INTC2MODE (INTC2_BASE0+0x80) - + +#define INTC2_BASE 0xfe080000 +#define INTC2_INTC2MODE (INTC2_BASE+0x80) + #define INTC2_INTPRI_OFFSET 0x00 #define INTC2_INTREQ_OFFSET 0x20 #define INTC2_INTMSK_OFFSET 0x40 #define INTC2_INTMSKCLR_OFFSET 0x60 - -extern void make_intc2_irq(unsigned int irq,unsigned int addr, - unsigned int group,int pos,int priority); - + +void make_intc2_irq(unsigned int irq, + unsigned int ipr_offset, unsigned int ipr_shift, + unsigned int msk_offset, unsigned int msk_shift, + unsigned int priority); +void init_IRQ_intc2(void); +void intc2_add_clear_irq(int irq, int (*fn)(int)); #endif #ifdef CONFIG_SH_GENERIC diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/irq_microdev.h linux-2.4.23-pre8/include/asm-sh/irq_microdev.h --- linux-2.4.22/include/asm-sh/irq_microdev.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/irq_microdev.h 2003-10-22 22:47:41.000000000 +0000 @@ -0,0 +1,38 @@ +/* + * linux/include/asm-sh/irq_microdev.h + * + * Copyright (C) 2003 Sean McGoogan (Sean.McGoogan@superh.com) + * + * IRQ functions for the SuperH SH4-202 MicroDev board. + * + * May be copied or modified under the terms of the GNU General Public + * License. See linux/COPYING for more information. + * + */ + + +#ifndef _ASM_SH_IRQ_MICRODEV_H +#define _ASM_SH_IRQ_MICRODEV_H + +extern void __init init_microdev_irq(void); + + + /* + * The following are useful macros for manipulating the + * interrupt controller (INTC) on the CPU-board FPGA. + * It should be noted that there is an INTC on the FPGA, + * and a seperate INTC on the SH4-202 core - these are + * two different things, both of which need to be prorammed + * to correctly route - unfortunately, they have the + * same name and abbreviations! + */ +#define MICRODEV_FPGA_INTC_BASE 0xa6110000ul /* INTC base address on CPU-board FPGA */ +#define MICRODEV_FPGA_INTENB_REG (MICRODEV_FPGA_INTC_BASE+0ul) /* Interrupt Enable Register on INTC on CPU-board FPGA */ +#define MICRODEV_FPGA_INTDSB_REG (MICRODEV_FPGA_INTC_BASE+8ul) /* Interrupt Disable Register on INTC on CPU-board FPGA */ +#define MICRODEV_FPGA_INTC_MASK(n) (1ul<<(n)) /* Interupt mask to enable/disable INTC in CPU-board FPGA */ +#define MICRODEV_FPGA_INTPRI_REG(n) (MICRODEV_FPGA_INTC_BASE+0x10+((n)/8)*8)/* Interrupt Priority Register on INTC on CPU-board FPGA */ +#define MICRODEV_FPGA_INTPRI_LEVEL(n,x) ((x)<<(((n)%8)*4)) /* MICRODEV_FPGA_INTPRI_LEVEL(int_number, int_level) */ +#define MICRODEV_FPGA_INTPRI_MASK(n) (MICRODEV_FPGA_INTPRI_LEVEL((n),0xful)) /* Interrupt Priority Mask on INTC on CPU-board FPGA */ + + +#endif /* _ASM_SH_IRQ_MICRODEV_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/machvec.h linux-2.4.23-pre8/include/asm-sh/machvec.h --- linux-2.4.22/include/asm-sh/machvec.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/machvec.h 2003-10-22 22:47:37.000000000 +0000 @@ -81,6 +81,7 @@ unsigned int mv_hw_7751se: 1; unsigned int mv_hw_adx : 1; unsigned int mv_hw_snapgear : 1; + unsigned int mv_hw_sh4202_microdev : 1; }; extern struct sh_machine_vector sh_mv; @@ -102,6 +103,7 @@ #define MACH_7751SE (sh_mv.mv_hw_7751se) #define MACH_ADX (sh_mv.mv_hw_adx) #define MACH_SNAPGEAR (sh_mv.mv_snapgear) +#define MACH_SH4202_MICRODEV (sh_mv.mv_hw_sh4202_microdev) #else # ifdef CONFIG_SH_SOLUTION_ENGINE # define MACH_SE 1 @@ -183,6 +185,11 @@ # else # define MACH_SNAPGEAR 0 # endif +# ifdef CONFIG_SH_SH4202_MICRODEV +# define MACH_SH4202_MICRODEV 1 +# else +# define MACH_SH4202_MICRODEV 0 +# endif #endif #endif /* _ASM_SH_MACHVEC_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/pci.h linux-2.4.23-pre8/include/asm-sh/pci.h --- linux-2.4.22/include/asm-sh/pci.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/pci.h 2003-10-22 22:49:09.000000000 +0000 @@ -10,6 +10,7 @@ or architectures with incomplete PCI setup by the loader */ #define pcibios_assign_all_busses() 1 +#define pcibios_scan_all_fns() 0 #if defined(CONFIG_CPU_SUBTYPE_ST40) /* These are currently the correct values for the ST40 based chips. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh/processor.h linux-2.4.23-pre8/include/asm-sh/processor.h --- linux-2.4.22/include/asm-sh/processor.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh/processor.h 2003-10-22 22:48:26.000000000 +0000 @@ -23,8 +23,9 @@ enum cpu_type { CPU_SH7708, /* Represents 7707, 7708, 7708S, 7708R, 7709 */ CPU_SH7729, /* Represents 7709A, 7729 */ - CPU_SH7750, /* Represents 7750, 7751 */ + CPU_SH7750, /* Represents 7750, 7751 */ CPU_ST40, /* Represents ST40STB1 and ST40GX1 */ + CPU_SH4202, CPU_SH_NONE }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh64/pci.h linux-2.4.23-pre8/include/asm-sh64/pci.h --- linux-2.4.22/include/asm-sh64/pci.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh64/pci.h 2003-10-22 22:48:57.000000000 +0000 @@ -42,6 +42,7 @@ ** or architectures with incomplete PCI setup by the loader */ #define pcibios_assign_all_busses() 1 +#define pcibios_scan_all_fns() 0 /* ** These are currently the correct values for the STM overdrive board. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh64/processor.h linux-2.4.23-pre8/include/asm-sh64/processor.h --- linux-2.4.22/include/asm-sh64/processor.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh64/processor.h 2003-10-22 22:47:56.000000000 +0000 @@ -113,11 +113,12 @@ #ifndef __ASSEMBLY__ /* - * FPU structure and data + * FPU structure and data : require 8-byte alignment as we need to access it + with fld.p, fst.p */ struct sh_fpu_hard_struct { - unsigned long long fp_regs[32]; + unsigned long fp_regs[64]; unsigned int fpscr; /* long status; * software status information */ }; @@ -135,6 +136,9 @@ union sh_fpu_union { struct sh_fpu_hard_struct hard; // struct sh_fpu_soft_struct soft; + /* 'hard' itself only produces 32 bit alignment, yet we need + to access it using 64 bit load/store as well. */ + unsigned long long alignment_dummy; }; struct thread_struct { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sh64/registers.h linux-2.4.23-pre8/include/asm-sh64/registers.h --- linux-2.4.22/include/asm-sh64/registers.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sh64/registers.h 2003-10-22 22:47:55.000000000 +0000 @@ -188,6 +188,7 @@ ** defines below are used only in .../arch/sh5/kernel/fpu.c */ # define __f(x) __str(fr##x) +# define __p(x) __str(fp##x) # define __d(x) __str(dr##x) /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/atomic.h linux-2.4.23-pre8/include/asm-sparc/atomic.h --- linux-2.4.22/include/asm-sparc/atomic.h 2001-10-30 23:08:11.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/atomic.h 2003-10-22 22:49:09.000000000 +0000 @@ -48,10 +48,13 @@ #define atomic_set(v, i) (((v)->counter) = ((i) << 8)) #endif -static __inline__ int __atomic_add(int i, atomic_t *v) +static inline int __atomic_add(int i, atomic_t *v) { register volatile int *ptr asm("g1"); register int increment asm("g2"); + register int tmp1 asm("g3"); + register int tmp2 asm("g4"); + register int tmp3 asm("g7"); ptr = &v->counter; increment = i; @@ -60,17 +63,20 @@ "mov %%o7, %%g4\n\t" "call ___atomic_add\n\t" " add %%o7, 8, %%o7\n" - : "=&r" (increment) + : "=&r" (increment), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3) : "0" (increment), "r" (ptr) - : "g3", "g4", "g7", "memory", "cc"); + : "memory", "cc"); return increment; } -static __inline__ int __atomic_sub(int i, atomic_t *v) +static inline int __atomic_sub(int i, atomic_t *v) { register volatile int *ptr asm("g1"); register int increment asm("g2"); + register int tmp1 asm("g3"); + register int tmp2 asm("g4"); + register int tmp3 asm("g7"); ptr = &v->counter; increment = i; @@ -79,9 +85,9 @@ "mov %%o7, %%g4\n\t" "call ___atomic_sub\n\t" " add %%o7, 8, %%o7\n" - : "=&r" (increment) + : "=&r" (increment), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3) : "0" (increment), "r" (ptr) - : "g3", "g4", "g7", "memory", "cc"); + : "memory", "cc"); return increment; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/bitops.h linux-2.4.23-pre8/include/asm-sparc/bitops.h --- linux-2.4.22/include/asm-sparc/bitops.h 2001-12-21 17:42:03.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/bitops.h 2003-10-22 22:49:32.000000000 +0000 @@ -21,10 +21,14 @@ * within the first byte. Sparc is BIG-Endian. Unless noted otherwise * all bit-ops return 0 if bit was previously clear and != 0 otherwise. */ -static __inline__ int test_and_set_bit(unsigned long nr, volatile void *addr) +static inline int test_and_set_bit(unsigned long nr, volatile void *addr) { register unsigned long mask asm("g2"); register unsigned long *ADDR asm("g1"); + register int tmp1 asm("g3"); + register int tmp2 asm("g4"); + register int tmp3 asm("g5"); + register int tmp4 asm("g7"); ADDR = ((unsigned long *) addr) + (nr >> 5); mask = 1 << (nr & 31); @@ -33,17 +37,21 @@ "mov %%o7, %%g4\n\t" "call ___set_bit\n\t" " add %%o7, 8, %%o7\n" - : "=&r" (mask) + : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4) : "0" (mask), "r" (ADDR) - : "g3", "g4", "g5", "g7", "memory", "cc"); + : "memory", "cc"); return mask != 0; } -static __inline__ void set_bit(unsigned long nr, volatile void *addr) +static inline void set_bit(unsigned long nr, volatile void *addr) { register unsigned long mask asm("g2"); register unsigned long *ADDR asm("g1"); + register int tmp1 asm("g3"); + register int tmp2 asm("g4"); + register int tmp3 asm("g5"); + register int tmp4 asm("g7"); ADDR = ((unsigned long *) addr) + (nr >> 5); mask = 1 << (nr & 31); @@ -52,15 +60,19 @@ "mov %%o7, %%g4\n\t" "call ___set_bit\n\t" " add %%o7, 8, %%o7\n" - : "=&r" (mask) + : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4) : "0" (mask), "r" (ADDR) - : "g3", "g4", "g5", "g7", "cc"); + : "memory", "cc"); } -static __inline__ int test_and_clear_bit(unsigned long nr, volatile void *addr) +static inline int test_and_clear_bit(unsigned long nr, volatile void *addr) { register unsigned long mask asm("g2"); register unsigned long *ADDR asm("g1"); + register int tmp1 asm("g3"); + register int tmp2 asm("g4"); + register int tmp3 asm("g5"); + register int tmp4 asm("g7"); ADDR = ((unsigned long *) addr) + (nr >> 5); mask = 1 << (nr & 31); @@ -69,17 +81,21 @@ "mov %%o7, %%g4\n\t" "call ___clear_bit\n\t" " add %%o7, 8, %%o7\n" - : "=&r" (mask) + : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4) : "0" (mask), "r" (ADDR) - : "g3", "g4", "g5", "g7", "memory", "cc"); + : "memory", "cc"); return mask != 0; } -static __inline__ void clear_bit(unsigned long nr, volatile void *addr) +static inline void clear_bit(unsigned long nr, volatile void *addr) { register unsigned long mask asm("g2"); register unsigned long *ADDR asm("g1"); + register int tmp1 asm("g3"); + register int tmp2 asm("g4"); + register int tmp3 asm("g5"); + register int tmp4 asm("g7"); ADDR = ((unsigned long *) addr) + (nr >> 5); mask = 1 << (nr & 31); @@ -88,15 +104,19 @@ "mov %%o7, %%g4\n\t" "call ___clear_bit\n\t" " add %%o7, 8, %%o7\n" - : "=&r" (mask) + : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4) : "0" (mask), "r" (ADDR) - : "g3", "g4", "g5", "g7", "cc"); + : "memory", "cc"); } -static __inline__ int test_and_change_bit(unsigned long nr, volatile void *addr) +static inline int test_and_change_bit(unsigned long nr, volatile void *addr) { register unsigned long mask asm("g2"); register unsigned long *ADDR asm("g1"); + register int tmp1 asm("g3"); + register int tmp2 asm("g4"); + register int tmp3 asm("g5"); + register int tmp4 asm("g7"); ADDR = ((unsigned long *) addr) + (nr >> 5); mask = 1 << (nr & 31); @@ -105,17 +125,21 @@ "mov %%o7, %%g4\n\t" "call ___change_bit\n\t" " add %%o7, 8, %%o7\n" - : "=&r" (mask) + : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4) : "0" (mask), "r" (ADDR) - : "g3", "g4", "g5", "g7", "memory", "cc"); + : "memory", "cc"); return mask != 0; } -static __inline__ void change_bit(unsigned long nr, volatile void *addr) +static inline void change_bit(unsigned long nr, volatile void *addr) { register unsigned long mask asm("g2"); register unsigned long *ADDR asm("g1"); + register int tmp1 asm("g3"); + register int tmp2 asm("g4"); + register int tmp3 asm("g5"); + register int tmp4 asm("g7"); ADDR = ((unsigned long *) addr) + (nr >> 5); mask = 1 << (nr & 31); @@ -124,15 +148,15 @@ "mov %%o7, %%g4\n\t" "call ___change_bit\n\t" " add %%o7, 8, %%o7\n" - : "=&r" (mask) + : "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4) : "0" (mask), "r" (ADDR) - : "g3", "g4", "g5", "g7", "cc"); + : "memory", "cc"); } /* * non-atomic versions */ -static __inline__ void __set_bit(int nr, volatile void *addr) +static inline void __set_bit(int nr, volatile void *addr) { unsigned long mask = 1UL << (nr & 0x1f); unsigned long *p = ((unsigned long *)addr) + (nr >> 5); @@ -140,7 +164,7 @@ *p |= mask; } -static __inline__ void __clear_bit(int nr, volatile void *addr) +static inline void __clear_bit(int nr, volatile void *addr) { unsigned long mask = 1UL << (nr & 0x1f); unsigned long *p = ((unsigned long *)addr) + (nr >> 5); @@ -148,7 +172,7 @@ *p &= ~mask; } -static __inline__ void __change_bit(int nr, volatile void *addr) +static inline void __change_bit(int nr, volatile void *addr) { unsigned long mask = 1UL << (nr & 0x1f); unsigned long *p = ((unsigned long *)addr) + (nr >> 5); @@ -156,7 +180,7 @@ *p ^= mask; } -static __inline__ int __test_and_set_bit(int nr, volatile void *addr) +static inline int __test_and_set_bit(int nr, volatile void *addr) { unsigned long mask = 1UL << (nr & 0x1f); unsigned long *p = ((unsigned long *)addr) + (nr >> 5); @@ -166,7 +190,7 @@ return (old & mask) != 0; } -static __inline__ int __test_and_clear_bit(int nr, volatile void *addr) +static inline int __test_and_clear_bit(int nr, volatile void *addr) { unsigned long mask = 1UL << (nr & 0x1f); unsigned long *p = ((unsigned long *)addr) + (nr >> 5); @@ -176,7 +200,7 @@ return (old & mask) != 0; } -static __inline__ int __test_and_change_bit(int nr, volatile void *addr) +static inline int __test_and_change_bit(int nr, volatile void *addr) { unsigned long mask = 1UL << (nr & 0x1f); unsigned long *p = ((unsigned long *)addr) + (nr >> 5); @@ -190,13 +214,13 @@ #define smp_mb__after_clear_bit() do { } while(0) /* The following routine need not be atomic. */ -static __inline__ int test_bit(int nr, __const__ void *addr) +static inline int test_bit(int nr, __const__ void *addr) { return (1 & (((__const__ unsigned int *) addr)[nr >> 5] >> (nr & 31))) != 0; } /* The easy/cheese version for now. */ -static __inline__ unsigned long ffz(unsigned long word) +static inline unsigned long ffz(unsigned long word) { unsigned long result = 0; @@ -227,7 +251,7 @@ * 'size' bits, starting the search at bit 'offset'. This is largely based * on Linus's ALPHA routines, which are pretty portable BTW. */ -static __inline__ unsigned long find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) +static inline unsigned long find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) { unsigned long *p = ((unsigned long *) addr) + (offset >> 5); unsigned long result = offset & ~31UL; @@ -272,7 +296,7 @@ #define find_first_zero_bit(addr, size) \ find_next_zero_bit((addr), (size), 0) -static __inline__ int test_le_bit(int nr, __const__ void * addr) +static inline int test_le_bit(int nr, __const__ void * addr) { __const__ unsigned char *ADDR = (__const__ unsigned char *) addr; return (ADDR[nr >> 3] >> (nr & 7)) & 1; @@ -281,7 +305,7 @@ /* * non-atomic versions */ -static __inline__ void __set_le_bit(int nr, void *addr) +static inline void __set_le_bit(int nr, void *addr) { unsigned char *ADDR = (unsigned char *)addr; @@ -289,7 +313,7 @@ *ADDR |= 1 << (nr & 0x07); } -static __inline__ void __clear_le_bit(int nr, void *addr) +static inline void __clear_le_bit(int nr, void *addr) { unsigned char *ADDR = (unsigned char *)addr; @@ -297,7 +321,7 @@ *ADDR &= ~(1 << (nr & 0x07)); } -static __inline__ int __test_and_set_le_bit(int nr, void *addr) +static inline int __test_and_set_le_bit(int nr, void *addr) { int mask, retval; unsigned char *ADDR = (unsigned char *)addr; @@ -309,7 +333,7 @@ return retval; } -static __inline__ int __test_and_clear_le_bit(int nr, void *addr) +static inline int __test_and_clear_le_bit(int nr, void *addr) { int mask, retval; unsigned char *ADDR = (unsigned char *)addr; @@ -321,7 +345,7 @@ return retval; } -static __inline__ unsigned long find_next_zero_le_bit(void *addr, unsigned long size, unsigned long offset) +static inline unsigned long find_next_zero_le_bit(void *addr, unsigned long size, unsigned long offset) { unsigned long *p = ((unsigned long *) addr) + (offset >> 5); unsigned long result = offset & ~31UL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/checksum.h linux-2.4.23-pre8/include/asm-sparc/checksum.h --- linux-2.4.22/include/asm-sparc/checksum.h 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/checksum.h 2003-10-22 22:47:28.000000000 +0000 @@ -48,23 +48,26 @@ extern unsigned int __csum_partial_copy_sparc_generic (const char *, char *); -extern __inline__ unsigned int +static inline unsigned int csum_partial_copy_nocheck (const char *src, char *dst, int len, unsigned int sum) { register unsigned int ret asm("o0") = (unsigned int)src; register char *d asm("o1") = dst; register int l asm("g1") = len; - + __asm__ __volatile__ ( "call " C_LABEL_STR(__csum_partial_copy_sparc_generic) "\n\t" - " mov %4, %%g7\n" - : "=r" (ret) : "0" (ret), "r" (d), "r" (l), "r" (sum) : - "o1", "o2", "o3", "o4", "o5", "o7", "g1", "g2", "g3", "g4", "g5", "g7"); + " mov %6, %%g7\n" + : "=&r" (ret), "=&r" (d), "=&r" (l) + : "0" (ret), "1" (d), "2" (l), "r" (sum) + : "o2", "o3", "o4", "o5", "o7", + "g2", "g3", "g4", "g5", "g7", + "memory", "cc"); return ret; } -extern __inline__ unsigned int +static inline unsigned int csum_partial_copy_from_user(const char *src, char *dst, int len, unsigned int sum, int *err) { @@ -85,14 +88,16 @@ ".previous\n" "1:\n\t" "call " C_LABEL_STR(__csum_partial_copy_sparc_generic) "\n\t" - " st %5, [%%sp + 64]\n" - : "=r" (ret) : "0" (ret), "r" (d), "r" (l), "r" (s), "r" (err) : - "o1", "o2", "o3", "o4", "o5", "o7", "g1", "g2", "g3", "g4", "g5", "g7"); + " st %8, [%%sp + 64]\n" + : "=&r" (ret), "=&r" (d), "=&r" (l), "=&r" (s) + : "0" (ret), "1" (d), "2" (l), "3" (s), "r" (err) + : "o2", "o3", "o4", "o5", "o7", "g2", "g3", "g4", "g5", + "cc", "memory"); return ret; } } -extern __inline__ unsigned int +static inline unsigned int csum_partial_copy_to_user(const char *src, char *dst, int len, unsigned int sum, int *err) { @@ -112,9 +117,12 @@ ".previous\n" "1:\n\t" "call " C_LABEL_STR(__csum_partial_copy_sparc_generic) "\n\t" - " st %5, [%%sp + 64]\n" - : "=r" (ret) : "0" (ret), "r" (d), "r" (l), "r" (s), "r" (err) : - "o1", "o2", "o3", "o4", "o5", "o7", "g1", "g2", "g3", "g4", "g5", "g7"); + " st %8, [%%sp + 64]\n" + : "=&r" (ret), "=&r" (d), "=&r" (l), "=&r" (s) + : "0" (ret), "1" (d), "2" (l), "3" (s), "r" (err) + : "o2", "o3", "o4", "o5", "o7", + "g2", "g3", "g4", "g5", + "cc", "memory"); return ret; } } @@ -125,8 +133,8 @@ /* ihl is always 5 or greater, almost always is 5, and iph is word aligned * the majority of the time. */ -extern __inline__ unsigned short ip_fast_csum(__const__ unsigned char *iph, - unsigned int ihl) +static inline unsigned short ip_fast_csum(const unsigned char *iph, + unsigned int ihl) { unsigned short sum; @@ -163,7 +171,7 @@ } /* Fold a partial checksum without adding pseudo headers. */ -extern __inline__ unsigned int csum_fold(unsigned int sum) +static inline unsigned int csum_fold(unsigned int sum) { unsigned int tmp; @@ -177,11 +185,11 @@ return sum; } -extern __inline__ unsigned long csum_tcpudp_nofold(unsigned long saddr, - unsigned long daddr, - unsigned int len, - unsigned short proto, - unsigned int sum) +static inline unsigned long csum_tcpudp_nofold(unsigned long saddr, + unsigned long daddr, + unsigned int len, + unsigned short proto, + unsigned int sum) { __asm__ __volatile__("addcc\t%1, %0, %0\n\t" "addxcc\t%2, %0, %0\n\t" @@ -209,11 +217,11 @@ #define _HAVE_ARCH_IPV6_CSUM -static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr, - struct in6_addr *daddr, - __u32 len, - unsigned short proto, - unsigned int sum) +static inline unsigned short int csum_ipv6_magic(struct in6_addr *saddr, + struct in6_addr *daddr, + __u32 len, + unsigned short proto, + unsigned int sum) { __asm__ __volatile__ ( "addcc %3, %4, %%g4\n\t" @@ -244,7 +252,7 @@ } /* this routine is used for miscellaneous IP-like checksums, mainly in icmp.c */ -extern __inline__ unsigned short ip_compute_csum(unsigned char * buff, int len) +static inline unsigned short ip_compute_csum(unsigned char * buff, int len) { return csum_fold(csum_partial(buff, len, 0)); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/pci.h linux-2.4.23-pre8/include/asm-sparc/pci.h --- linux-2.4.22/include/asm-sparc/pci.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/pci.h 2003-10-22 22:49:14.000000000 +0000 @@ -8,6 +8,7 @@ * or architectures with incomplete PCI setup by the loader. */ #define pcibios_assign_all_busses() 0 +#define pcibios_scan_all_fns() 0 #define PCIBIOS_MIN_IO 0UL #define PCIBIOS_MIN_MEM 0UL diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/pgtsrmmu.h linux-2.4.23-pre8/include/asm-sparc/pgtsrmmu.h --- linux-2.4.22/include/asm-sparc/pgtsrmmu.h 2000-07-18 19:29:47.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/pgtsrmmu.h 2003-10-22 22:48:26.000000000 +0000 @@ -9,6 +9,9 @@ #include +/* Number of contexts is implementation-dependent; 64k is the most we support */ +#define SRMMU_MAX_CONTEXTS 65536 + /* PMD_SHIFT determines the size of the area a second-level page table can map */ #define SRMMU_PMD_SHIFT 18 #define SRMMU_PMD_SIZE (1UL << SRMMU_PMD_SHIFT) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/pgtsun4.h linux-2.4.23-pre8/include/asm-sparc/pgtsun4.h --- linux-2.4.22/include/asm-sparc/pgtsun4.h 2000-06-20 00:59:39.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/pgtsun4.h 2003-10-22 22:47:59.000000000 +0000 @@ -76,7 +76,7 @@ #ifndef __ASSEMBLY__ -extern __inline__ unsigned long sun4c_get_synchronous_error(void) +static inline unsigned long sun4c_get_synchronous_error(void) { unsigned long sync_err; @@ -86,7 +86,7 @@ return sync_err; } -extern __inline__ unsigned long sun4c_get_synchronous_address(void) +static inline unsigned long sun4c_get_synchronous_address(void) { unsigned long sync_addr; @@ -97,7 +97,7 @@ } /* SUN4 pte, segmap, and context manipulation */ -extern __inline__ unsigned long sun4c_get_segmap(unsigned long addr) +static inline unsigned long sun4c_get_segmap(unsigned long addr) { register unsigned long entry; @@ -107,14 +107,15 @@ return entry; } -extern __inline__ void sun4c_put_segmap(unsigned long addr, unsigned long entry) +static inline void sun4c_put_segmap(unsigned long addr, unsigned long entry) { __asm__ __volatile__("\n\tstha %1, [%0] %2; nop; nop; nop;\n\t" : : "r" (addr), "r" (entry), - "i" (ASI_SEGMAP)); + "i" (ASI_SEGMAP) + : "memory"); } -extern __inline__ unsigned long sun4c_get_pte(unsigned long addr) +static inline unsigned long sun4c_get_pte(unsigned long addr) { register unsigned long entry; @@ -124,14 +125,15 @@ return entry; } -extern __inline__ void sun4c_put_pte(unsigned long addr, unsigned long entry) +static inline void sun4c_put_pte(unsigned long addr, unsigned long entry) { __asm__ __volatile__("\n\tsta %1, [%0] %2; nop; nop; nop;\n\t" : : "r" (addr), - "r" ((entry & ~(_SUN4C_PAGE_PRESENT))), "i" (ASI_PTE)); + "r" ((entry & ~(_SUN4C_PAGE_PRESENT))), "i" (ASI_PTE) + : "memory"); } -extern __inline__ int sun4c_get_context(void) +static inline int sun4c_get_context(void) { register int ctx; @@ -142,10 +144,11 @@ return ctx; } -extern __inline__ int sun4c_set_context(int ctx) +static inline int sun4c_set_context(int ctx) { __asm__ __volatile__("\n\tstba %0, [%1] %2; nop; nop; nop;\n\t" : : - "r" (ctx), "r" (AC_CONTEXT), "i" (ASI_CONTROL)); + "r" (ctx), "r" (AC_CONTEXT), "i" (ASI_CONTROL) + : "memory"); return ctx; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/pgtsun4c.h linux-2.4.23-pre8/include/asm-sparc/pgtsun4c.h --- linux-2.4.22/include/asm-sparc/pgtsun4c.h 2000-06-20 00:59:39.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/pgtsun4c.h 2003-10-22 22:47:54.000000000 +0000 @@ -75,7 +75,7 @@ #ifndef __ASSEMBLY__ -extern __inline__ unsigned long sun4c_get_synchronous_error(void) +static inline unsigned long sun4c_get_synchronous_error(void) { unsigned long sync_err; @@ -85,7 +85,7 @@ return sync_err; } -extern __inline__ unsigned long sun4c_get_synchronous_address(void) +static inline unsigned long sun4c_get_synchronous_address(void) { unsigned long sync_addr; @@ -96,7 +96,7 @@ } /* SUN4C pte, segmap, and context manipulation */ -extern __inline__ unsigned long sun4c_get_segmap(unsigned long addr) +static inline unsigned long sun4c_get_segmap(unsigned long addr) { register unsigned long entry; @@ -107,15 +107,16 @@ return entry; } -extern __inline__ void sun4c_put_segmap(unsigned long addr, unsigned long entry) +static inline void sun4c_put_segmap(unsigned long addr, unsigned long entry) { __asm__ __volatile__("\n\tstba %1, [%0] %2; nop; nop; nop;\n\t" : : "r" (addr), "r" (entry), - "i" (ASI_SEGMAP)); + "i" (ASI_SEGMAP) + : "memory"); } -extern __inline__ unsigned long sun4c_get_pte(unsigned long addr) +static inline unsigned long sun4c_get_pte(unsigned long addr) { register unsigned long entry; @@ -125,14 +126,15 @@ return entry; } -extern __inline__ void sun4c_put_pte(unsigned long addr, unsigned long entry) +static inline void sun4c_put_pte(unsigned long addr, unsigned long entry) { __asm__ __volatile__("\n\tsta %1, [%0] %2; nop; nop; nop;\n\t" : : "r" (addr), - "r" ((entry & ~(_SUN4C_PAGE_PRESENT))), "i" (ASI_PTE)); + "r" ((entry & ~(_SUN4C_PAGE_PRESENT))), "i" (ASI_PTE) + : "memory"); } -extern __inline__ int sun4c_get_context(void) +static inline int sun4c_get_context(void) { register int ctx; @@ -143,10 +145,11 @@ return ctx; } -extern __inline__ int sun4c_set_context(int ctx) +static inline int sun4c_set_context(int ctx) { __asm__ __volatile__("\n\tstba %0, [%1] %2; nop; nop; nop;\n\t" : : - "r" (ctx), "r" (AC_CONTEXT), "i" (ASI_CONTROL)); + "r" (ctx), "r" (AC_CONTEXT), "i" (ASI_CONTROL) + : "memory"); return ctx; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/processor.h linux-2.4.23-pre8/include/asm-sparc/processor.h --- linux-2.4.22/include/asm-sparc/processor.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/processor.h 2003-10-22 22:49:51.000000000 +0000 @@ -140,8 +140,12 @@ "std\t%%g0, [%0 + %3 + 0x30]\n\t" "st\t%1, [%0 + %3 + 0x38]\n\t" "st\t%%g0, [%0 + %3 + 0x3c]" - : : "r" (regs), "r" (sp - sizeof(struct reg_window)), "r" (zero), - "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0]))); + : /* no outputs */ + : "r" (regs), + "r" (sp - sizeof(struct reg_window)), + "r" (zero), + "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0])) + : "memory"); } /* Free all resources held by a thread. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/ross.h linux-2.4.23-pre8/include/asm-sparc/ross.h --- linux-2.4.22/include/asm-sparc/ross.h 1998-01-12 23:15:54.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/ross.h 2003-10-22 22:48:53.000000000 +0000 @@ -96,27 +96,29 @@ #ifndef __ASSEMBLY__ -extern __inline__ unsigned int get_ross_icr(void) +static inline unsigned int get_ross_icr(void) { unsigned int icreg; __asm__ __volatile__(".word 0x8347c000\n\t" /* rd %iccr, %g1 */ - "mov %%g1, %0\n\t" : - "=r" (icreg) : : - "g1", "memory"); + "mov %%g1, %0\n\t" + : "=r" (icreg) + : /* no inputs */ + : "g1", "memory"); return icreg; } -extern __inline__ void put_ross_icr(unsigned int icreg) +static inline void put_ross_icr(unsigned int icreg) { __asm__ __volatile__("or %%g0, %0, %%g1\n\t" ".word 0xbf806000\n\t" /* wr %g1, 0x0, %iccr */ "nop\n\t" "nop\n\t" - "nop\n\t" : : - "r" (icreg) : - "g1", "memory"); + "nop\n\t" + : /* no outputs */ + : "r" (icreg) + : "g1", "memory"); return; } @@ -124,52 +126,62 @@ /* HyperSparc specific cache flushing. */ /* This is for the on-chip instruction cache. */ -extern __inline__ void hyper_flush_whole_icache(void) +static inline void hyper_flush_whole_icache(void) { - __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : : - "i" (ASI_M_FLUSH_IWHOLE)); + __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" + : /* no outputs */ + : "i" (ASI_M_FLUSH_IWHOLE) + : "memory"); return; } extern int vac_cache_size; extern int vac_line_size; -extern __inline__ void hyper_clear_all_tags(void) +static inline void hyper_clear_all_tags(void) { unsigned long addr; for(addr = 0; addr < vac_cache_size; addr += vac_line_size) - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_DATAC_TAG)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_DATAC_TAG) + : "memory"); } -extern __inline__ void hyper_flush_unconditional_combined(void) +static inline void hyper_flush_unconditional_combined(void) { unsigned long addr; - for(addr = 0; addr < vac_cache_size; addr += vac_line_size) - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_FLUSH_CTX)); + for (addr = 0; addr < vac_cache_size; addr += vac_line_size) + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_FLUSH_CTX) + : "memory"); } -extern __inline__ void hyper_flush_cache_user(void) +static inline void hyper_flush_cache_user(void) { unsigned long addr; - for(addr = 0; addr < vac_cache_size; addr += vac_line_size) - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_FLUSH_USER)); + for (addr = 0; addr < vac_cache_size; addr += vac_line_size) + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_FLUSH_USER) + : "memory"); } -extern __inline__ void hyper_flush_cache_page(unsigned long page) +static inline void hyper_flush_cache_page(unsigned long page) { unsigned long end; page &= PAGE_MASK; end = page + PAGE_SIZE; - while(page < end) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (page), "i" (ASI_M_FLUSH_PAGE)); + while (page < end) { + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (page), "i" (ASI_M_FLUSH_PAGE) + : "memory"); page += vac_line_size; } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/sfp-machine.h linux-2.4.23-pre8/include/asm-sparc/sfp-machine.h --- linux-2.4.22/include/asm-sparc/sfp-machine.h 2000-05-09 05:00:01.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/sfp-machine.h 2003-10-22 22:49:16.000000000 +0000 @@ -77,9 +77,9 @@ /* Some assembly to speed things up. */ #define __FP_FRAC_ADD_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \ - __asm__ ("addcc %r7,%8,%2 - addxcc %r5,%6,%1 - addx %r3,%4,%0" \ + __asm__ ("addcc %r7,%8,%2\n\t" \ + "addxcc %r5,%6,%1\n\t" \ + "addx %r3,%4,%0\n" \ : "=r" ((USItype)(r2)), \ "=&r" ((USItype)(r1)), \ "=&r" ((USItype)(r0)) \ @@ -92,9 +92,9 @@ : "cc") #define __FP_FRAC_SUB_3(r2,r1,r0,x2,x1,x0,y2,y1,y0) \ - __asm__ ("subcc %r7,%8,%2 - subxcc %r5,%6,%1 - subx %r3,%4,%0" \ + __asm__ ("subcc %r7,%8,%2\n\t" \ + "subxcc %r5,%6,%1\n\t" \ + "subx %r3,%4,%0\n" \ : "=r" ((USItype)(r2)), \ "=&r" ((USItype)(r1)), \ "=&r" ((USItype)(r0)) \ @@ -111,11 +111,11 @@ /* We need to fool gcc, as we need to pass more than 10 \ input/outputs. */ \ register USItype _t1 __asm__ ("g1"), _t2 __asm__ ("g2"); \ - __asm__ __volatile__ (" - addcc %r8,%9,%1 - addxcc %r6,%7,%0 - addxcc %r4,%5,%%g2 - addx %r2,%3,%%g1" \ + __asm__ __volatile__ ( \ + "addcc %r8,%9,%1\n\t" \ + "addxcc %r6,%7,%0\n\t" \ + "addxcc %r4,%5,%%g2\n\t" \ + "addx %r2,%3,%%g1\n\t" \ : "=&r" ((USItype)(r1)), \ "=&r" ((USItype)(r0)) \ : "%rJ" ((USItype)(x3)), \ @@ -136,11 +136,11 @@ /* We need to fool gcc, as we need to pass more than 10 \ input/outputs. */ \ register USItype _t1 __asm__ ("g1"), _t2 __asm__ ("g2"); \ - __asm__ __volatile__ (" - subcc %r8,%9,%1 - subxcc %r6,%7,%0 - subxcc %r4,%5,%%g2 - subx %r2,%3,%%g1" \ + __asm__ __volatile__ ( \ + "subcc %r8,%9,%1\n\t" \ + "subxcc %r6,%7,%0\n\t" \ + "subxcc %r4,%5,%%g2\n\t" \ + "subx %r2,%3,%%g1\n\t" \ : "=&r" ((USItype)(r1)), \ "=&r" ((USItype)(r0)) \ : "%rJ" ((USItype)(x3)), \ @@ -161,10 +161,10 @@ #define __FP_FRAC_DEC_4(x3,x2,x1,x0,y3,y2,y1,y0) __FP_FRAC_SUB_4(x3,x2,x1,x0,x3,x2,x1,x0,y3,y2,y1,y0) #define __FP_FRAC_ADDI_4(x3,x2,x1,x0,i) \ - __asm__ ("addcc %3,%4,%3 - addxcc %2,%%g0,%2 - addxcc %1,%%g0,%1 - addx %0,%%g0,%0" \ + __asm__ ("addcc %3,%4,%3\n\t" \ + "addxcc %2,%%g0,%2\n\t" \ + "addxcc %1,%%g0,%1\n\t" \ + "addx %0,%%g0,%0\n\t" \ : "=&r" ((USItype)(x3)), \ "=&r" ((USItype)(x2)), \ "=&r" ((USItype)(x1)), \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/swift.h linux-2.4.23-pre8/include/asm-sparc/swift.h --- linux-2.4.22/include/asm-sparc/swift.h 1996-11-09 08:30:13.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/swift.h 2003-10-22 22:48:34.000000000 +0000 @@ -27,68 +27,80 @@ #define SWIFT_EN 0x00000001 /* MMU enable */ /* Bits [13:5] select one of 512 instruction cache tags */ -extern __inline__ void swift_inv_insn_tag(unsigned long addr) +static inline void swift_inv_insn_tag(unsigned long addr) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_TXTC_TAG)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_TXTC_TAG) + : "memory"); } /* Bits [12:4] select one of 512 data cache tags */ -extern __inline__ void swift_inv_data_tag(unsigned long addr) +static inline void swift_inv_data_tag(unsigned long addr) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_DATAC_TAG)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_DATAC_TAG) + : "memory"); } -extern __inline__ void swift_flush_dcache(void) +static inline void swift_flush_dcache(void) { unsigned long addr; - for(addr = 0; addr < 0x2000; addr += 0x10) + for (addr = 0; addr < 0x2000; addr += 0x10) swift_inv_data_tag(addr); } -extern __inline__ void swift_flush_icache(void) +static inline void swift_flush_icache(void) { unsigned long addr; - for(addr = 0; addr < 0x4000; addr += 0x20) + for (addr = 0; addr < 0x4000; addr += 0x20) swift_inv_insn_tag(addr); } -extern __inline__ void swift_idflash_clear(void) +static inline void swift_idflash_clear(void) { unsigned long addr; - for(addr = 0; addr < 0x2000; addr += 0x10) { + for (addr = 0; addr < 0x2000; addr += 0x10) { swift_inv_insn_tag(addr<<1); swift_inv_data_tag(addr); } } /* Swift is so broken, it isn't even safe to use the following. */ -extern __inline__ void swift_flush_page(unsigned long page) +static inline void swift_flush_page(unsigned long page) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (page), "i" (ASI_M_FLUSH_PAGE)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (page), "i" (ASI_M_FLUSH_PAGE) + : "memory"); } -extern __inline__ void swift_flush_segment(unsigned long addr) +static inline void swift_flush_segment(unsigned long addr) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_FLUSH_SEG)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_FLUSH_SEG) + : "memory"); } -extern __inline__ void swift_flush_region(unsigned long addr) +static inline void swift_flush_region(unsigned long addr) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_FLUSH_REGION)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_FLUSH_REGION) + : "memory"); } -extern __inline__ void swift_flush_context(void) +static inline void swift_flush_context(void) { - __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : : - "i" (ASI_M_FLUSH_CTX)); + __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" + : /* no outputs */ + : "i" (ASI_M_FLUSH_CTX) + : "memory"); } #endif /* !(_SPARC_SWIFT_H) */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/system.h linux-2.4.23-pre8/include/asm-sparc/system.h --- linux-2.4.22/include/asm-sparc/system.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/system.h 2003-10-22 22:49:12.000000000 +0000 @@ -217,7 +217,7 @@ "wr %0, %2, %%psr\n\t" "nop; nop; nop;\n" "1:\n" - : "=r" (retval) + : "=&r" (retval) : "r" (__new_psr), "i" (PSR_PIL) : "g1", "g2", "memory", "cc"); @@ -315,7 +315,8 @@ #ifdef CONFIG_SMP __asm__ __volatile__("swap [%2], %0" : "=&r" (val) - : "0" (val), "r" (m)); + : "0" (val), "r" (m) + : "memory"); return val; #else register unsigned long *ptr asm("g1"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/tsunami.h linux-2.4.23-pre8/include/asm-sparc/tsunami.h --- linux-2.4.22/include/asm-sparc/tsunami.h 1996-11-09 08:30:19.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/tsunami.h 2003-10-22 22:49:39.000000000 +0000 @@ -45,16 +45,20 @@ #define TSUNAMI_NF 0x00000002 #define TSUNAMI_ME 0x00000001 -extern __inline__ void tsunami_flush_icache(void) +static inline void tsunami_flush_icache(void) { - __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : : - "i" (ASI_M_IC_FLCLEAR) : "memory"); + __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" + : /* no outputs */ + : "i" (ASI_M_IC_FLCLEAR) + : "memory"); } -extern __inline__ void tsunami_flush_dcache(void) +static inline void tsunami_flush_dcache(void) { - __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : : - "i" (ASI_M_DC_FLCLEAR) : "memory"); + __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" + : /* no outputs */ + : "i" (ASI_M_DC_FLCLEAR) + : "memory"); } #endif /* !(_SPARC_TSUNAMI_H) */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/turbosparc.h linux-2.4.23-pre8/include/asm-sparc/turbosparc.h --- linux-2.4.22/include/asm-sparc/turbosparc.h 1998-10-04 17:22:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/turbosparc.h 2003-10-22 22:49:20.000000000 +0000 @@ -59,60 +59,64 @@ #ifndef __ASSEMBLY__ /* Bits [13:5] select one of 512 instruction cache tags */ -extern __inline__ void turbosparc_inv_insn_tag(unsigned long addr) +static inline void turbosparc_inv_insn_tag(unsigned long addr) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_TXTC_TAG)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_TXTC_TAG) + : "memory"); } /* Bits [13:5] select one of 512 data cache tags */ -extern __inline__ void turbosparc_inv_data_tag(unsigned long addr) +static inline void turbosparc_inv_data_tag(unsigned long addr) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (addr), "i" (ASI_M_DATAC_TAG)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (addr), "i" (ASI_M_DATAC_TAG) + : "memory"); } -extern __inline__ void turbosparc_flush_icache(void) +static inline void turbosparc_flush_icache(void) { unsigned long addr; - for(addr = 0; addr < 0x4000; addr += 0x20) + for (addr = 0; addr < 0x4000; addr += 0x20) turbosparc_inv_insn_tag(addr); } -extern __inline__ void turbosparc_flush_dcache(void) +static inline void turbosparc_flush_dcache(void) { unsigned long addr; - for(addr = 0; addr < 0x4000; addr += 0x20) + for (addr = 0; addr < 0x4000; addr += 0x20) turbosparc_inv_data_tag(addr); } -extern __inline__ void turbosparc_idflash_clear(void) +static inline void turbosparc_idflash_clear(void) { unsigned long addr; - for(addr = 0; addr < 0x4000; addr += 0x20) { + for (addr = 0; addr < 0x4000; addr += 0x20) { turbosparc_inv_insn_tag(addr); turbosparc_inv_data_tag(addr); } } -extern __inline__ void turbosparc_set_ccreg(unsigned long regval) +static inline void turbosparc_set_ccreg(unsigned long regval) { - __asm__ __volatile__("sta %0, [%1] %2\n\t" : : - "r" (regval), "r" (0x600), - "i" (ASI_M_MMUREGS)); + __asm__ __volatile__("sta %0, [%1] %2\n\t" + : /* no outputs */ + : "r" (regval), "r" (0x600), "i" (ASI_M_MMUREGS) + : "memory"); } -extern __inline__ unsigned long turbosparc_get_ccreg(void) +static inline unsigned long turbosparc_get_ccreg(void) { unsigned long regval; - __asm__ __volatile__("lda [%1] %2, %0\n\t" : - "=r" (regval) : - "r" (0x600), - "i" (ASI_M_MMUREGS)); + __asm__ __volatile__("lda [%1] %2, %0\n\t" + : "=r" (regval) + : "r" (0x600), "i" (ASI_M_MMUREGS)); return regval; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/vac-ops.h linux-2.4.23-pre8/include/asm-sparc/vac-ops.h --- linux-2.4.22/include/asm-sparc/vac-ops.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/vac-ops.h 2003-10-22 22:48:16.000000000 +0000 @@ -108,27 +108,29 @@ extern struct sun4c_vac_props sun4c_vacinfo; /* sun4c_enable_vac() enables the sun4c virtual address cache. */ -extern __inline__ void sun4c_enable_vac(void) +static inline void sun4c_enable_vac(void) { - __asm__ __volatile__("lduba [%0] %1, %%g1\n\t" - "or %%g1, %2, %%g1\n\t" - "stba %%g1, [%0] %1\n\t" : : - "r" ((unsigned int) AC_SENABLE), - "i" (ASI_CONTROL), "i" (SENABLE_CACHE) : - "g1"); - sun4c_vacinfo.on = 1; + __asm__ __volatile__("lduba [%0] %1, %%g1\n\t" + "or %%g1, %2, %%g1\n\t" + "stba %%g1, [%0] %1\n\t" + : /* no outputs */ + : "r" ((unsigned int) AC_SENABLE), + "i" (ASI_CONTROL), "i" (SENABLE_CACHE) + : "g1", "memory"); + sun4c_vacinfo.on = 1; } /* sun4c_disable_vac() disables the virtual address cache. */ -extern __inline__ void sun4c_disable_vac(void) +static inline void sun4c_disable_vac(void) { - __asm__ __volatile__("lduba [%0] %1, %%g1\n\t" - "andn %%g1, %2, %%g1\n\t" - "stba %%g1, [%0] %1\n\t" : : - "r" ((unsigned int) AC_SENABLE), - "i" (ASI_CONTROL), "i" (SENABLE_CACHE) : - "g1"); - sun4c_vacinfo.on = 0; + __asm__ __volatile__("lduba [%0] %1, %%g1\n\t" + "andn %%g1, %2, %%g1\n\t" + "stba %%g1, [%0] %1\n\t" + : /* no outputs */ + : "r" ((unsigned int) AC_SENABLE), + "i" (ASI_CONTROL), "i" (SENABLE_CACHE) + : "g1", "memory"); + sun4c_vacinfo.on = 0; } #endif /* !(_SPARC_VAC_OPS_H) */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc/viking.h linux-2.4.23-pre8/include/asm-sparc/viking.h --- linux-2.4.22/include/asm-sparc/viking.h 1997-04-24 02:01:28.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc/viking.h 2003-10-22 22:49:12.000000000 +0000 @@ -110,48 +110,57 @@ #ifndef __ASSEMBLY__ -extern __inline__ void viking_flush_icache(void) +static inline void viking_flush_icache(void) { - __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : : - "i" (ASI_M_IC_FLCLEAR)); + __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" + : /* no outputs */ + : "i" (ASI_M_IC_FLCLEAR) + : "memory"); } -extern __inline__ void viking_flush_dcache(void) +static inline void viking_flush_dcache(void) { - __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" : : - "i" (ASI_M_DC_FLCLEAR)); + __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t" + : /* no outputs */ + : "i" (ASI_M_DC_FLCLEAR) + : "memory"); } -extern __inline__ void viking_unlock_icache(void) +static inline void viking_unlock_icache(void) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (0x80000000), "i" (ASI_M_IC_FLCLEAR)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (0x80000000), "i" (ASI_M_IC_FLCLEAR) + : "memory"); } -extern __inline__ void viking_unlock_dcache(void) +static inline void viking_unlock_dcache(void) { - __asm__ __volatile__("sta %%g0, [%0] %1\n\t" : : - "r" (0x80000000), "i" (ASI_M_DC_FLCLEAR)); + __asm__ __volatile__("sta %%g0, [%0] %1\n\t" + : /* no outputs */ + : "r" (0x80000000), "i" (ASI_M_DC_FLCLEAR) + : "memory"); } -extern __inline__ void viking_set_bpreg(unsigned long regval) +static inline void viking_set_bpreg(unsigned long regval) { - __asm__ __volatile__("sta %0, [%%g0] %1\n\t" : : - "r" (regval), - "i" (ASI_M_ACTION)); + __asm__ __volatile__("sta %0, [%%g0] %1\n\t" + : /* no outputs */ + : "r" (regval), "i" (ASI_M_ACTION) + : "memory"); } -extern __inline__ unsigned long viking_get_bpreg(void) +static inline unsigned long viking_get_bpreg(void) { unsigned long regval; - __asm__ __volatile__("lda [%%g0] %1, %0\n\t" : - "=r" (regval) : - "i" (ASI_M_ACTION)); + __asm__ __volatile__("lda [%%g0] %1, %0\n\t" + : "=r" (regval) + : "i" (ASI_M_ACTION)); return regval; } -extern __inline__ void viking_get_dcache_ptag(int set, int block, +static inline void viking_get_dcache_ptag(int set, int block, unsigned long *data) { unsigned long ptag = ((set & 0x7f) << 5) | ((block & 0x3) << 26) | @@ -160,15 +169,15 @@ __asm__ __volatile__ ("ldda [%2] %3, %%g2\n\t" "or %%g0, %%g2, %0\n\t" - "or %%g0, %%g3, %1\n\t" : - "=r" (info), "=r" (page) : - "r" (ptag), "i" (ASI_M_DATAC_TAG) : - "g2", "g3"); + "or %%g0, %%g3, %1\n\t" + : "=r" (info), "=r" (page) + : "r" (ptag), "i" (ASI_M_DATAC_TAG) + : "g2", "g3"); data[0] = info; data[1] = page; } -extern __inline__ void viking_mxcc_turn_off_parity(unsigned long *mregp, +static inline void viking_mxcc_turn_off_parity(unsigned long *mregp, unsigned long *mxcc_cregp) { unsigned long mreg = *mregp; @@ -190,30 +199,32 @@ "2:\n\t" "sta %0, [%%g0] %3\n\t" "sta %1, [%2] %4\n" - "1:\n\t" : : - "r" (mreg), "r" (mxcc_creg), - "r" (MXCC_CREG), "i" (ASI_M_MMUREGS), - "i" (ASI_M_MXCC) : "g2", "cc"); + "1:\n\t" + : /* no output */ + : "r" (mreg), "r" (mxcc_creg), + "r" (MXCC_CREG), "i" (ASI_M_MMUREGS), + "i" (ASI_M_MXCC) + : "g2", "memory", "cc"); *mregp = mreg; *mxcc_cregp = mxcc_creg; } -extern __inline__ unsigned long viking_hwprobe(unsigned long vaddr) +static inline unsigned long viking_hwprobe(unsigned long vaddr) { unsigned long val; vaddr &= PAGE_MASK; /* Probe all MMU entries. */ - __asm__ __volatile__("lda [%1] %2, %0\n\t" : - "=r" (val) : - "r" (vaddr | 0x400), "i" (ASI_M_FLUSH_PROBE)); + __asm__ __volatile__("lda [%1] %2, %0\n\t" + : "=r" (val) + : "r" (vaddr | 0x400), "i" (ASI_M_FLUSH_PROBE)); if (!val) return 0; /* Probe region. */ - __asm__ __volatile__("lda [%1] %2, %0\n\t" : - "=r" (val) : - "r" (vaddr | 0x200), "i" (ASI_M_FLUSH_PROBE)); + __asm__ __volatile__("lda [%1] %2, %0\n\t" + : "=r" (val) + : "r" (vaddr | 0x200), "i" (ASI_M_FLUSH_PROBE)); if ((val & SRMMU_ET_MASK) == SRMMU_ET_PTE) { vaddr &= ~SRMMU_PGDIR_MASK; vaddr >>= PAGE_SHIFT; @@ -221,9 +232,9 @@ } /* Probe segment. */ - __asm__ __volatile__("lda [%1] %2, %0\n\t" : - "=r" (val) : - "r" (vaddr | 0x100), "i" (ASI_M_FLUSH_PROBE)); + __asm__ __volatile__("lda [%1] %2, %0\n\t" + : "=r" (val) + : "r" (vaddr | 0x100), "i" (ASI_M_FLUSH_PROBE)); if ((val & SRMMU_ET_MASK) == SRMMU_ET_PTE) { vaddr &= ~SRMMU_PMD_MASK; vaddr >>= PAGE_SHIFT; @@ -231,9 +242,9 @@ } /* Probe page. */ - __asm__ __volatile__("lda [%1] %2, %0\n\t" : - "=r" (val) : - "r" (vaddr), "i" (ASI_M_FLUSH_PROBE)); + __asm__ __volatile__("lda [%1] %2, %0\n\t" + : "=r" (val) + : "r" (vaddr), "i" (ASI_M_FLUSH_PROBE)); return val; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/asi.h linux-2.4.23-pre8/include/asm-sparc64/asi.h --- linux-2.4.22/include/asm-sparc64/asi.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/asi.h 2003-10-22 22:48:11.000000000 +0000 @@ -36,10 +36,12 @@ #define ASI_PCACHE_DATA 0x31 /* (III) PCache data RAM diag */ #define ASI_PCACHE_TAG 0x32 /* (III) PCache tag RAM diag */ #define ASI_PCACHE_SNOOP_TAG 0x33 /* (III) PCache snoop tag RAM diag */ +#define ASI_QUAD_LDD_PHYS 0x34 /* (III+) PADDR, qword load */ #define ASI_WCACHE_VALID_BITS 0x38 /* (III) WCache Valid Bits diag */ #define ASI_WCACHE_DATA 0x39 /* (III) WCache data RAM diag */ #define ASI_WCACHE_TAG 0x3a /* (III) WCache tag RAM diag */ #define ASI_WCACHE_SNOOP_TAG 0x3b /* (III) WCache snoop tag RAM diag */ +#define ASI_QUAD_LDD_PHYS_L 0x3c /* (III+) PADDR, qword load, little endian */ #define ASI_SRAM_FAST_INIT 0x40 /* (III+) Fast SRAM init */ #define ASI_DCACHE_INVALIDATE 0x42 /* (III) DCache Invalidate diag */ #define ASI_DCACHE_UTAG 0x43 /* (III) DCache uTag diag */ @@ -51,6 +53,7 @@ #define ASI_INTR_DISPATCH_STAT 0x48 /* IRQ vector dispatch status */ #define ASI_INTR_RECEIVE 0x49 /* IRQ vector receive status */ #define ASI_UPA_CONFIG 0x4a /* UPA config space */ +#define ASI_JBUS_CONFIG 0x4a /* (IIIi) JBUS Config Register */ #define ASI_SAFARI_CONFIG 0x4a /* (III) Safari Config Register */ #define ASI_SAFARI_ADDRESS 0x4a /* (III) Safari Address Register */ #define ASI_ESTATE_ERROR_EN 0x4b /* E-cache error enable space */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/chafsr.h linux-2.4.23-pre8/include/asm-sparc64/chafsr.h --- linux-2.4.22/include/asm-sparc64/chafsr.h 2001-04-12 19:10:25.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/chafsr.h 2003-10-22 22:49:13.000000000 +0000 @@ -4,10 +4,54 @@ /* Cheetah Asynchronous Fault Status register, ASI=0x4C VA<63:0>=0x0 */ +/* Comments indicate which processor variants on which the bit definition + * is valid. Codes are: + * ch --> cheetah + * ch+ --> cheetah plus + * jp --> jalapeno + */ + /* All bits of this register except M_SYNDROME and E_SYNDROME are * read, write 1 to clear. M_SYNDROME and E_SYNDROME are read-only. */ +/* Software bit set by linux trap handlers to indicate that the trap was + * signalled at %tl >= 1. + */ +#define CHAFSR_TL1 (1UL << 63UL) /* n/a */ + +/* Unmapped error from system bus for prefetch queue or + * store queue read operation + */ +#define CHPAFSR_DTO (1UL << 59UL) /* ch+ */ + +/* Bus error from system bus for prefetch queue or store queue + * read operation + */ +#define CHPAFSR_DBERR (1UL << 58UL) /* ch+ */ + +/* Hardware corrected E-cache Tag ECC error */ +#define CHPAFSR_THCE (1UL << 57UL) /* ch+ */ +/* System interface protocol error, hw timeout caused */ +#define JPAFSR_JETO (1UL << 57UL) /* jp */ + +/* SW handled correctable E-cache Tag ECC error */ +#define CHPAFSR_TSCE (1UL << 56UL) /* ch+ */ +/* Parity error on system snoop results */ +#define JPAFSR_SCE (1UL << 56UL) /* jp */ + +/* Uncorrectable E-cache Tag ECC error */ +#define CHPAFSR_TUE (1UL << 55UL) /* ch+ */ +/* System interface protocol error, illegal command detected */ +#define JPAFSR_JEIC (1UL << 55UL) /* jp */ + +/* Uncorrectable system bus data ECC error due to prefetch + * or store fill request + */ +#define CHPAFSR_DUE (1UL << 54UL) /* ch+ */ +/* System interface protocol error, illegal ADTYPE detected */ +#define JPAFSR_JEIT (1UL << 54UL) /* jp */ + /* Multiple errors of the same type have occurred. This bit is set when * an uncorrectable error or a SW correctable error occurs and the status * bit to report that error is already set. When multiple errors of @@ -22,12 +66,12 @@ * subunit will be logged. All errors in subsequent 16-byte subunits * from the same 64-byte transaction are ignored. */ -#define CHAFSR_ME 0x0020000000000000 +#define CHAFSR_ME (1UL << 53UL) /* ch,ch+,jp */ /* Privileged state error has occurred. This is a capture of PSTATE.PRIV * at the time the error is detected. */ -#define CHAFSR_PRIV 0x0010000000000000 +#define CHAFSR_PRIV (1UL << 52UL) /* ch,ch+,jp */ /* The following bits 51 (CHAFSR_PERR) to 33 (CHAFSR_CE) are sticky error * bits and record the most recently detected errors. Bits accumulate @@ -38,74 +82,123 @@ * pin when this event occurs and it also logs a specific cause code * into a JTAG scannable flop. */ -#define CHAFSR_PERR 0x0008000000000000 +#define CHAFSR_PERR (1UL << 51UL) /* ch,ch+,jp */ /* Internal processor error. The processor asserts its' ERROR * pin when this event occurs and it also logs a specific cause code * into a JTAG scannable flop. */ -#define CHAFSR_IERR 0x0004000000000000 +#define CHAFSR_IERR (1UL << 50UL) /* ch,ch+,jp */ /* System request parity error on incoming address */ -#define CHAFSR_ISAP 0x0002000000000000 +#define CHAFSR_ISAP (1UL << 49UL) /* ch,ch+,jp */ /* HW Corrected system bus MTAG ECC error */ -#define CHAFSR_EMC 0x0001000000000000 +#define CHAFSR_EMC (1UL << 48UL) /* ch,ch+ */ +/* Parity error on L2 cache tag SRAM */ +#define JPAFSR_ETP (1UL << 48UL) /* jp */ /* Uncorrectable system bus MTAG ECC error */ -#define CHAFSR_EMU 0x0000800000000000 +#define CHAFSR_EMU (1UL << 47UL) /* ch,ch+ */ +/* Out of range memory error has occurred */ +#define JPAFSR_OM (1UL << 47UL) /* jp */ /* HW Corrected system bus data ECC error for read of interrupt vector */ -#define CHAFSR_IVC 0x0000400000000000 +#define CHAFSR_IVC (1UL << 46UL) /* ch,ch+ */ +/* Error due to unsupported store */ +#define JPAFSR_UMS (1UL << 46UL) /* jp */ /* Uncorrectable system bus data ECC error for read of interrupt vector */ -#define CHAFSR_IVU 0x0000200000000000 +#define CHAFSR_IVU (1UL << 45UL) /* ch,ch+,jp */ /* Unmappeed error from system bus */ -#define CHAFSR_TO 0x0000100000000000 +#define CHAFSR_TO (1UL << 44UL) /* ch,ch+,jp */ /* Bus error response from system bus */ -#define CHAFSR_BERR 0x0000080000000000 +#define CHAFSR_BERR (1UL << 43UL) /* ch,ch+,jp */ /* SW Correctable E-cache ECC error for instruction fetch or data access * other than block load. */ -#define CHAFSR_UCC 0x0000040000000000 +#define CHAFSR_UCC (1UL << 42UL) /* ch,ch+,jp */ /* Uncorrectable E-cache ECC error for instruction fetch or data access * other than block load. */ -#define CHAFSR_UCU 0x0000020000000000 +#define CHAFSR_UCU (1UL << 41UL) /* ch,ch+,jp */ /* Copyout HW Corrected ECC error */ -#define CHAFSR_CPC 0x0000010000000000 +#define CHAFSR_CPC (1UL << 40UL) /* ch,ch+,jp */ /* Copyout Uncorrectable ECC error */ -#define CHAFSR_CPU 0x0000008000000000 +#define CHAFSR_CPU (1UL << 39UL) /* ch,ch+,jp */ /* HW Corrected ECC error from E-cache for writeback */ -#define CHAFSR_WDC 0x0000004000000000 +#define CHAFSR_WDC (1UL << 38UL) /* ch,ch+,jp */ /* Uncorrectable ECC error from E-cache for writeback */ -#define CHAFSR_WDU 0x0000002000000000 +#define CHAFSR_WDU (1UL << 37UL) /* ch,ch+,jp */ /* HW Corrected ECC error from E-cache for store merge or block load */ -#define CHAFSR_EDC 0x0000001000000000 +#define CHAFSR_EDC (1UL << 36UL) /* ch,ch+,jp */ /* Uncorrectable ECC error from E-cache for store merge or block load */ -#define CHAFSR_EDU 0x0000000800000000 +#define CHAFSR_EDU (1UL << 35UL) /* ch,ch+,jp */ /* Uncorrectable system bus data ECC error for read of memory or I/O */ -#define CHAFSR_UE 0x0000000400000000 +#define CHAFSR_UE (1UL << 34UL) /* ch,ch+,jp */ /* HW Corrected system bus data ECC error for read of memory or I/O */ -#define CHAFSR_CE 0x0000000200000000 +#define CHAFSR_CE (1UL << 33UL) /* ch,ch+,jp */ + +/* Uncorrectable ECC error from remote cache/memory */ +#define JPAFSR_RUE (1UL << 32UL) /* jp */ + +/* Correctable ECC error from remote cache/memory */ +#define JPAFSR_RCE (1UL << 31UL) /* jp */ + +/* JBUS parity error on returned read data */ +#define JPAFSR_BP (1UL << 30UL) /* jp */ + +/* JBUS parity error on data for writeback or block store */ +#define JPAFSR_WBP (1UL << 29UL) /* jp */ + +/* Foreign read to DRAM incurring correctable ECC error */ +#define JPAFSR_FRC (1UL << 28UL) /* jp */ + +/* Foreign read to DRAM incurring uncorrectable ECC error */ +#define JPAFSR_FRU (1UL << 27UL) /* jp */ #define CHAFSR_ERRORS (CHAFSR_PERR | CHAFSR_IERR | CHAFSR_ISAP | CHAFSR_EMC | \ CHAFSR_EMU | CHAFSR_IVC | CHAFSR_IVU | CHAFSR_TO | \ CHAFSR_BERR | CHAFSR_UCC | CHAFSR_UCU | CHAFSR_CPC | \ CHAFSR_CPU | CHAFSR_WDC | CHAFSR_WDU | CHAFSR_EDC | \ CHAFSR_EDU | CHAFSR_UE | CHAFSR_CE) +#define CHPAFSR_ERRORS (CHPAFSR_DTO | CHPAFSR_DBERR | CHPAFSR_THCE | \ + CHPAFSR_TSCE | CHPAFSR_TUE | CHPAFSR_DUE | \ + CHAFSR_PERR | CHAFSR_IERR | CHAFSR_ISAP | CHAFSR_EMC | \ + CHAFSR_EMU | CHAFSR_IVC | CHAFSR_IVU | CHAFSR_TO | \ + CHAFSR_BERR | CHAFSR_UCC | CHAFSR_UCU | CHAFSR_CPC | \ + CHAFSR_CPU | CHAFSR_WDC | CHAFSR_WDU | CHAFSR_EDC | \ + CHAFSR_EDU | CHAFSR_UE | CHAFSR_CE) +#define JPAFSR_ERRORS (JPAFSR_JETO | JPAFSR_SCE | JPAFSR_JEIC | \ + JPAFSR_JEIT | CHAFSR_PERR | CHAFSR_IERR | \ + CHAFSR_ISAP | JPAFSR_ETP | JPAFSR_OM | \ + JPAFSR_UMS | CHAFSR_IVU | CHAFSR_TO | \ + CHAFSR_BERR | CHAFSR_UCC | CHAFSR_UCU | \ + CHAFSR_CPC | CHAFSR_CPU | CHAFSR_WDC | \ + CHAFSR_WDU | CHAFSR_EDC | CHAFSR_EDU | \ + CHAFSR_UE | CHAFSR_CE | JPAFSR_RUE | \ + JPAFSR_RCE | JPAFSR_BP | JPAFSR_WBP | \ + JPAFSR_FRC | JPAFSR_FRU) + +/* Active JBUS request signal when error occurred */ +#define JPAFSR_JBREQ (0x7UL << 24UL) /* jp */ +#define JPAFSR_JBREQ_SHIFT 24UL + +/* L2 cache way information */ +#define JPAFSR_ETW (0x3UL << 22UL) /* jp */ +#define JPAFSR_ETW_SHIFT 22UL /* System bus MTAG ECC syndrome. This field captures the status of the * first occurrence of the highest-priority error according to the M_SYND @@ -113,8 +206,12 @@ * for which the M_SYND is reported, is cleared, the contents of the M_SYND * field will be unchanged by will be unfrozen for further error capture. */ -#define CHAFSR_M_SYNDROME 0x00000000000f0000 -#define CHAFSR_M_SYNDROME_SHIFT 16 +#define CHAFSR_M_SYNDROME (0xfUL << 16UL) /* ch,ch+,jp */ +#define CHAFSR_M_SYNDROME_SHIFT 16UL + +/* Agenid Id of the foreign device causing the UE/CE errors */ +#define JPAFSR_AID (0x1fUL << 9UL) /* jp */ +#define JPAFSR_AID_SHIFT 9UL /* System bus or E-cache data ECC syndrome. This field captures the status * of the first occurrence of the highest-priority error according to the @@ -122,8 +219,8 @@ * error for which the E_SYND is reported, is cleare, the contents of the E_SYND * field will be unchanged but will be unfrozen for further error capture. */ -#define CHAFSR_E_SYNDROME 0x00000000000001ff -#define CHAFSR_E_SYNDROME_SHIFT 0 +#define CHAFSR_E_SYNDROME (0x1ffUL << 0UL) /* ch,ch+,jp */ +#define CHAFSR_E_SYNDROME_SHIFT 0UL /* The AFSR must be explicitly cleared by software, it is not cleared automatically * by a read. Writes to bits <51:33> with bits set will clear the corresponding @@ -142,9 +239,4 @@ * also apply to the M_SYNDROME and E_SYNDROME fields of the AFSR. */ -/* Software bit set by linux trap handlers to indicate that the trap was - * signalled at %tl >= 1. - */ -#define CHAFSR_TL1 0x8000000000000000 - #endif /* _SPARC64_CHAFSR_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/head.h linux-2.4.23-pre8/include/asm-sparc64/head.h --- linux-2.4.22/include/asm-sparc64/head.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/head.h 2003-10-22 22:48:30.000000000 +0000 @@ -9,10 +9,12 @@ #define PTREGS_OFF (STACK_BIAS + STACKFRAME_SZ) #define __CHEETAH_ID 0x003e0014 +#define __JALAPENO_ID 0x003e0016 #define CHEETAH_MANUF 0x003e #define CHEETAH_IMPL 0x0014 #define CHEETAH_PLUS_IMPL 0x0015 +#define JALAPENO_IMPL 0x0016 #define BRANCH_IF_CHEETAH_BASE(tmp1,tmp2,label) \ rdpr %ver, %tmp1; \ @@ -23,6 +25,15 @@ be,pn %icc, label; \ nop; +#define BRANCH_IF_JALAPENO(tmp1,tmp2,label) \ + rdpr %ver, %tmp1; \ + sethi %hi(__JALAPENO_ID), %tmp2; \ + srlx %tmp1, 32, %tmp1; \ + or %tmp2, %lo(__JALAPENO_ID), %tmp2;\ + cmp %tmp1, %tmp2; \ + be,pn %icc, label; \ + nop; + #define BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(tmp1,tmp2,label) \ rdpr %ver, %tmp1; \ srlx %tmp1, (32 + 16), %tmp2; \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/io.h linux-2.4.23-pre8/include/asm-sparc64/io.h --- linux-2.4.22/include/asm-sparc64/io.h 2002-02-25 19:38:13.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/io.h 2003-10-22 22:49:22.000000000 +0000 @@ -413,7 +413,7 @@ */ #define ioremap(__offset, __size) ((void *)(__offset)) #define ioremap_nocache(X,Y) ioremap((X),(Y)) -#define iounmap(__addr) do { } while(0) +#define iounmap(__addr) do { (void)(__addr); } while(0) /* Similarly for SBUS. */ #define sbus_ioremap(__res, __offset, __size, __name) \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/irq.h linux-2.4.23-pre8/include/asm-sparc64/irq.h --- linux-2.4.22/include/asm-sparc64/irq.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/irq.h 2003-10-22 22:48:59.000000000 +0000 @@ -76,6 +76,7 @@ /* IMAP/ICLR register defines */ #define IMAP_VALID 0x80000000 /* IRQ Enabled */ #define IMAP_TID_UPA 0x7c000000 /* UPA TargetID */ +#define IMAP_TID_JBUS 0x7c000000 /* JBUS TargetID */ #define IMAP_AID_SAFARI 0x7c000000 /* Safari AgentID */ #define IMAP_NID_SAFARI 0x03e00000 /* Safari NodeID */ #define IMAP_IGN 0x000007c0 /* IRQ Group Number */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/isa.h linux-2.4.23-pre8/include/asm-sparc64/isa.h --- linux-2.4.22/include/asm-sparc64/isa.h 2001-05-16 17:31:27.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/isa.h 2003-10-22 22:49:38.000000000 +0000 @@ -32,6 +32,11 @@ #define linux_prom_isa_ranges linux_prom_ebus_ranges struct linux_prom_isa_ranges isa_ranges[PROMREG_MAX]; int num_isa_ranges; +#define linux_prom_isa_intmap linux_prom_ebus_intmap + struct linux_prom_isa_intmap isa_intmap[PROMREG_MAX]; + int num_isa_intmap; +#define linux_prom_isa_intmask linux_prom_ebus_intmask + struct linux_prom_isa_intmap isa_intmask; }; extern struct isa_bridge *isa_chain; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/pbm.h linux-2.4.23-pre8/include/asm-sparc64/pbm.h --- linux-2.4.22/include/asm-sparc64/pbm.h 2001-08-15 02:57:29.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/pbm.h 2003-10-22 22:49:58.000000000 +0000 @@ -128,6 +128,25 @@ /* PCI controller we sit under. */ struct pci_controller_info *parent; + /* Physical address base of controller registers. */ + unsigned long controller_regs; + + /* Physical address base of PBM registers. */ + unsigned long pbm_regs; + + /* Opaque 32-bit system bus Port ID. */ + u32 portid; + + /* Chipset version information. */ + int chip_type; +#define PBM_CHIP_TYPE_SABRE 1 +#define PBM_CHIP_TYPE_PSYCHO 2 +#define PBM_CHIP_TYPE_SCHIZO 3 +#define PBM_CHIP_TYPE_SCHIZO_PLUS 4 +#define PBM_CHIP_TYPE_TOMATILLO 5 + int chip_version; + int chip_revision; + /* Name used for top-level resources. */ char name[64]; @@ -139,6 +158,7 @@ struct linux_prom_pci_intmap pbm_intmap[PROM_PCIIMAP_MAX]; int num_pbm_intmap; struct linux_prom_pci_intmask pbm_intmask; + u64 ino_bitmap; /* PBM I/O and Memory space resources. */ struct resource io_space; @@ -170,12 +190,6 @@ /* List of all PCI controllers. */ struct pci_controller_info *next; - /* Physical address base of controller registers. */ - unsigned long controller_regs; - - /* Opaque 32-bit system bus Port ID. */ - u32 portid; - /* Each controller gets a unique index, used mostly for * error logging purposes. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/pci.h linux-2.4.23-pre8/include/asm-sparc64/pci.h --- linux-2.4.22/include/asm-sparc64/pci.h 2002-02-25 19:38:13.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/pci.h 2003-10-22 22:47:55.000000000 +0000 @@ -11,6 +11,7 @@ * or architectures with incomplete PCI setup by the loader. */ #define pcibios_assign_all_busses() 0 +#define pcibios_scan_all_fns() 0 #define PCIBIOS_MIN_IO 0UL #define PCIBIOS_MIN_MEM 0UL diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/processor.h linux-2.4.23-pre8/include/asm-sparc64/processor.h --- linux-2.4.22/include/asm-sparc64/processor.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/processor.h 2003-10-22 22:47:30.000000000 +0000 @@ -109,6 +109,7 @@ #define SPARC_FLAG_NEWCHILD 0x08 /* task is just-spawned child process */ #define SPARC_FLAG_PERFCTR 0x10 /* task has performance counters active */ #define SPARC_FLAG_ABI_PENDING 0x20 /* change of SPARC_FLAG_32BIT pending */ +#define SPARC_FLAG_SYS_SUCCESS 0x40 /* Force successful syscall return. */ #define FAULT_CODE_WRITE 0x01 /* Write access, implies D-TLB */ #define FAULT_CODE_DTLB 0x02 /* Miss happened in D-TLB */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/ptrace.h linux-2.4.23-pre8/include/asm-sparc64/ptrace.h --- linux-2.4.22/include/asm-sparc64/ptrace.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/ptrace.h 2003-10-22 22:49:07.000000000 +0000 @@ -97,6 +97,10 @@ #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV)) #define instruction_pointer(regs) ((regs)->tpc) extern void show_regs(struct pt_regs *); +#define force_successful_syscall_return() \ +do { \ + current->thread.flags |= SPARC_FLAG_SYS_SUCCESS; \ +} while (0) #endif #else /* __ASSEMBLY__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/smp.h linux-2.4.23-pre8/include/asm-sparc64/smp.h --- linux-2.4.22/include/asm-sparc64/smp.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/smp.h 2003-10-22 22:48:26.000000000 +0000 @@ -87,11 +87,19 @@ extern __inline__ int hard_smp_processor_id(void) { if (tlb_type == cheetah || tlb_type == cheetah_plus) { - unsigned long safari_config; - __asm__ __volatile__("ldxa [%%g0] %1, %0" - : "=r" (safari_config) - : "i" (ASI_SAFARI_CONFIG)); - return ((safari_config >> 17) & 0x3ff); + unsigned long cfg, ver; + __asm__ __volatile__("rdpr %%ver, %0" : "=r" (ver)); + if ((ver >> 32) == 0x003e0016) { + __asm__ __volatile__("ldxa [%%g0] %1, %0" + : "=r" (cfg) + : "i" (ASI_JBUS_CONFIG)); + return ((cfg >> 17) & 0x1f); + } else { + __asm__ __volatile__("ldxa [%%g0] %1, %0" + : "=r" (cfg) + : "i" (ASI_SAFARI_CONFIG)); + return ((cfg >> 17) & 0x3ff); + } } else if (this_is_starfire != 0) { return starfire_hard_smp_processor_id(); } else { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-sparc64/visasm.h linux-2.4.23-pre8/include/asm-sparc64/visasm.h --- linux-2.4.22/include/asm-sparc64/visasm.h 2001-04-27 05:17:26.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-sparc64/visasm.h 2003-10-22 22:47:49.000000000 +0000 @@ -19,7 +19,8 @@ andcc %o5, (FPRS_FEF|FPRS_DU), %g0; \ be,pt %icc, 297f; \ sethi %hi(297f), %g7; \ - ba,pt %xcc, VISenter; \ + sethi %hi(VISenter), %g1; \ + jmpl %g1 + %lo(VISenter), %g0; \ or %g7, %lo(297f), %g7; \ 297: wr %g0, FPRS_FEF, %fprs; \ @@ -34,7 +35,8 @@ andcc %o5, FPRS_FEF, %g0; \ be,pt %icc, 297f; \ sethi %hi(298f), %g7; \ - ba,pt %xcc, VISenterhalf; \ + sethi %hi(VISenterhalf), %g1; \ + jmpl %g1 + %lo(VISenterhalf), %g0; \ or %g7, %lo(298f), %g7; \ clr %o5; \ 297: wr %o5, FPRS_FEF, %fprs; \ @@ -50,7 +52,8 @@ " andcc %%o5, %0, %%g0\n" " be,pt %%icc, 299f\n" " sethi %%hi(298f), %%g7\n" -" ba VISenter ! Note. This cannot be bp, as it may be too far from VISenter.\n" +" sethi %%hi(VISenter), %%g1\n" +" jmpl %%g1 + %%lo(VISenter), %%g0\n" " or %%g7, %%lo(298f), %%g7\n" " 298: wr %%g0, 0, %%fprs\n" " 299:\n" diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/acpi.h linux-2.4.23-pre8/include/asm-x86_64/acpi.h --- linux-2.4.22/include/asm-x86_64/acpi.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/acpi.h 2003-10-22 22:47:44.000000000 +0000 @@ -116,6 +116,9 @@ #ifdef CONFIG_X86_IO_APIC extern int acpi_ioapic; #else +static inline void disable_ioapic_setup(void) +{ } + #define acpi_ioapic 0 #endif @@ -142,6 +145,8 @@ extern void mp_config_ioapic_for_sci(int irq); +extern int use_acpi_pci; + #endif /*__KERNEL__*/ #endif /*_ASM_ACPI_H*/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/apic.h linux-2.4.23-pre8/include/asm-x86_64/apic.h --- linux-2.4.22/include/asm-x86_64/apic.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/apic.h 2003-10-22 22:47:28.000000000 +0000 @@ -102,4 +102,17 @@ #define esr_disable 0 extern unsigned boot_cpu_id; +extern int skip_ioapic_setup; + +static inline void disable_ioapic_setup(void) +{ + + skip_ioapic_setup = 1; +} + +static inline int ioapic_setup_disabled(void) +{ + return skip_ioapic_setup; +} + #endif /* __ASM_APIC_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/calling.h linux-2.4.23-pre8/include/asm-x86_64/calling.h --- linux-2.4.22/include/asm-x86_64/calling.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/calling.h 2003-10-22 22:49:19.000000000 +0000 @@ -8,7 +8,7 @@ #define R14 8 #define R13 16 #define R12 24 -#define RBP 36 +#define RBP 32 #define RBX 40 /* arguments: interrupts/non tracing syscalls only save upto here*/ #define R11 48 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/cpufeature.h linux-2.4.23-pre8/include/asm-x86_64/cpufeature.h --- linux-2.4.22/include/asm-x86_64/cpufeature.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/cpufeature.h 2003-10-22 22:49:50.000000000 +0000 @@ -63,6 +63,26 @@ #define X86_FEATURE_CYRIX_ARR (3*32+ 2) /* Cyrix ARRs (= MTRRs) */ #define X86_FEATURE_CENTAUR_MCR (3*32+ 3) /* Centaur MCRs (= MTRRs) */ +#define cpu_has(c, bit) test_bit(bit, (c)->x86_capability) +#define boot_cpu_has(bit) test_bit(bit, boot_cpu_data.x86_capability) + +#define cpu_has_pge 1 +#define cpu_has_pse 1 +#define cpu_has_pae 1 +#define cpu_has_tsc 1 +#define cpu_has_de 1 +#define cpu_has_vme 1 +#define cpu_has_fxsr 1 +#define cpu_has_xmm 1 +#define cpu_has_apic boot_cpu_has(X86_FEATURE_APIC) +#define cpu_has_ht 0 +#define cpu_has_mp boot_cpu_has(X86_FEATURE_MP) +#define cpu_has_k6_mtrr 0 +#define cpu_has_cyrix_arr 0 +#define cpu_has_centaur_mcr 0 +#define cpu_has_mmx 0 +#define cpu_has_fpu 1 + #endif /* __ASM_X8664_CPUFEATURE_H */ /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/hardirq.h linux-2.4.23-pre8/include/asm-x86_64/hardirq.h --- linux-2.4.22/include/asm-x86_64/hardirq.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/hardirq.h 2003-10-22 22:47:29.000000000 +0000 @@ -67,6 +67,8 @@ { ++local_irq_count(cpu); + smp_mb(); + while (test_bit(0,&global_irq_lock)) { cpu_relax(); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/ia32.h linux-2.4.23-pre8/include/asm-x86_64/ia32.h --- linux-2.4.22/include/asm-x86_64/ia32.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/ia32.h 2003-10-22 22:49:15.000000000 +0000 @@ -234,6 +234,11 @@ int iov_len; }; +struct timespec32 { + int tv_sec; + int tv_nsec; +}; + #endif /* !CONFIG_IA32_SUPPORT */ #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/io_apic.h linux-2.4.23-pre8/include/asm-x86_64/io_apic.h --- linux-2.4.22/include/asm-x86_64/io_apic.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/io_apic.h 2003-10-22 22:49:54.000000000 +0000 @@ -148,6 +148,6 @@ extern int io_apic_get_unique_id (int ioapic, int apic_id); extern int io_apic_get_version (int ioapic); extern int io_apic_get_redir_entries (int ioapic); -extern int io_apic_set_pci_routing (int ioapic, int pin, int irq); +extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int, int); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/kdebug.h linux-2.4.23-pre8/include/asm-x86_64/kdebug.h --- linux-2.4.22/include/asm-x86_64/kdebug.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/kdebug.h 2003-10-22 22:47:43.000000000 +0000 @@ -39,11 +39,13 @@ return notifier_call_chain(&die_chain, val, &args); } - extern int printk_address(unsigned long address); extern void die(const char *,struct pt_regs *,long); +extern void __die(const char *,struct pt_regs *,long); extern void show_stack(unsigned long* esp); extern void show_registers(struct pt_regs *regs); extern void dump_pagetable(unsigned long); +extern void prepare_die(unsigned long *flags); +extern void exit_die(unsigned long flags); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/msr.h linux-2.4.23-pre8/include/asm-x86_64/msr.h --- linux-2.4.22/include/asm-x86_64/msr.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/msr.h 2003-10-22 22:49:34.000000000 +0000 @@ -173,6 +173,9 @@ /* VIA Cyrix defined MSRs*/ #define MSR_VIA_FCR 0x1107 +#define MSR_VIA_LONGHAUL 0x110a +#define MSR_VIA_RNG 0x110b +#define MSR_VIA_BCR2 0x1147 /* Intel defined MSRs. */ #define MSR_IA32_P5_MC_ADDR 0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/pci.h linux-2.4.23-pre8/include/asm-x86_64/pci.h --- linux-2.4.22/include/asm-x86_64/pci.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/pci.h 2003-10-22 22:49:48.000000000 +0000 @@ -17,6 +17,7 @@ #else #define pcibios_assign_all_busses() 0 #endif +#define pcibios_scan_all_fns() 0 extern unsigned long pci_mem_start; #define PCIBIOS_MIN_IO 0x1000 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/pgalloc.h linux-2.4.23-pre8/include/asm-x86_64/pgalloc.h --- linux-2.4.22/include/asm-x86_64/pgalloc.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/pgalloc.h 2003-10-22 22:49:41.000000000 +0000 @@ -204,7 +204,7 @@ { struct mm_struct *active_mm; int state; -}; +} ____cacheline_aligned; extern struct tlb_state cpu_tlbstate[NR_CPUS]; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/processor.h linux-2.4.23-pre8/include/asm-x86_64/processor.h --- linux-2.4.22/include/asm-x86_64/processor.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/processor.h 2003-10-22 22:49:48.000000000 +0000 @@ -17,6 +17,7 @@ #include #include #include +#include #define TF_MASK 0x00000100 #define IF_MASK 0x00000200 @@ -77,16 +78,6 @@ #define current_cpu_data boot_cpu_data #endif -#define cpu_has_pge 1 -#define cpu_has_pse 1 -#define cpu_has_pae 1 -#define cpu_has_tsc 1 -#define cpu_has_de 1 -#define cpu_has_vme 1 -#define cpu_has_fxsr 1 -#define cpu_has_xmm 1 -#define cpu_has_apic (test_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability)) - extern char ignore_irq13; extern void identify_cpu(struct cpuinfo_x86 *); @@ -258,7 +249,9 @@ /* This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_32 0xa0000000 + +#define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? 0xc0000000 : 0xFFFFe000) +#define TASK_UNMAPPED_32 (IA32_PAGE_OFFSET / 3) #define TASK_UNMAPPED_64 (TASK_SIZE/3) #define TASK_UNMAPPED_BASE \ ((current->thread.flags & THREAD_IA32) ? TASK_UNMAPPED_32 : TASK_UNMAPPED_64) @@ -396,7 +389,7 @@ /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ extern inline void rep_nop(void) { - __asm__ __volatile__("rep;nop"); + __asm__ __volatile__("rep;nop":::"memory"); } /* Avoid speculative execution by the CPU */ @@ -406,8 +399,6 @@ asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory"); } -#define cpu_has_fpu 1 - #define ARCH_HAS_PREFETCH #define ARCH_HAS_PREFETCHW #define ARCH_HAS_SPINLOCK_PREFETCH diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/proto.h linux-2.4.23-pre8/include/asm-x86_64/proto.h --- linux-2.4.22/include/asm-x86_64/proto.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/proto.h 2003-10-22 22:47:36.000000000 +0000 @@ -43,6 +43,8 @@ extern void __show_regs(struct pt_regs * regs); extern void show_regs(struct pt_regs * regs); +extern int apic_disabled; +extern int acpi_disabled; #define round_up(x,y) (((x) + (y) - 1) & ~((y)-1)) #define round_down(x,y) ((x) & ~((y)-1)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/ptrace.h linux-2.4.23-pre8/include/asm-x86_64/ptrace.h --- linux-2.4.22/include/asm-x86_64/ptrace.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/ptrace.h 2003-10-22 22:48:59.000000000 +0000 @@ -6,7 +6,7 @@ #define R14 8 #define R13 16 #define R12 24 -#define RBP 36 +#define RBP 32 #define RBX 40 /* arguments: interrupts/non tracing syscalls only save upto here*/ #define R11 48 @@ -37,10 +37,6 @@ /* options set using PTRACE_SETOPTIONS */ #define PTRACE_O_TRACESYSGOOD 0x00000001 -/* Dummy values for ptrace */ -#define FS 1000 -#define GS 1008 - #ifndef __ASSEMBLY__ struct pt_regs { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/system.h linux-2.4.23-pre8/include/asm-x86_64/system.h --- linux-2.4.22/include/asm-x86_64/system.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/system.h 2003-10-22 22:49:11.000000000 +0000 @@ -284,8 +284,8 @@ #define sti() __global_sti() #define save_flags(x) ((x)=__global_save_flags()) #define restore_flags(x) __global_restore_flags(x) -#define save_and_cli(x) do { save_flags(x); cli(); } while(0); -#define save_and_sti(x) do { save_flags(x); sti(); } while(0); +#define save_and_cli(x) do { save_flags(x); cli(); } while(0) +#define save_and_sti(x) do { save_flags(x); sti(); } while(0) #else diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/uaccess.h linux-2.4.23-pre8/include/asm-x86_64/uaccess.h --- linux-2.4.22/include/asm-x86_64/uaccess.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/uaccess.h 2003-10-22 22:48:57.000000000 +0000 @@ -254,12 +254,12 @@ case 10: __get_user_asm(*(u64*)dst,(u64*)src,ret,"q","","=r",16); if (ret) return ret; - __get_user_asm(*(u16*)(8+dst),(u16*)(8+src),ret,"w","w","=r",2); + __get_user_asm(*(u16*)(8+(char*)dst),(u16*)(8+(char*)src),ret,"w","w","=r",2); return ret; case 16: __get_user_asm(*(u64*)dst,(u64*)src,ret,"q","","=r",16); if (ret) return ret; - __get_user_asm(*(u64*)(8+dst),(u64*)(8+src),ret,"q","","=r",8); + __get_user_asm(*(u64*)(8+(char*)dst),(u64*)(8+(char*)src),ret,"q","","=r",8); return ret; default: return copy_user_generic(dst,src,size); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/asm-x86_64/unistd.h linux-2.4.23-pre8/include/asm-x86_64/unistd.h --- linux-2.4.22/include/asm-x86_64/unistd.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/asm-x86_64/unistd.h 2003-10-22 22:49:17.000000000 +0000 @@ -462,7 +462,7 @@ #define __NR_tkill 200 /* 2.5 only */ __SYSCALL(__NR_tkill, sys_ni_syscall) #define __NR_time 201 -__SYSCALL(__NR_time, sys_time) +__SYSCALL(__NR_time, sys_time64) #define __NR_futex 202 /* 2.5 only */ __SYSCALL(__NR_futex, sys_ni_syscall) #define __NR_sched_setaffinity 203 @@ -495,8 +495,12 @@ __SYSCALL(__NR_remap_file_pages, sys_ni_syscall) #define __NR_getdents64 217 __SYSCALL(__NR_getdents64, sys_getdents64) +#define __NR_restart_syscall 219 +__SYSCALL(__NR_restart_syscall, sys_ni_syscall) +#define __NR_semtimedop 220 +__SYSCALL(__NR_semtimedop, sys_semtimedop) -#define __NR_syscall_max __NR_getdents64 +#define __NR_syscall_max __NR_semtimedop #ifndef __NO_STUBS diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/acpi.h linux-2.4.23-pre8/include/linux/acpi.h --- linux-2.4.22/include/linux/acpi.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/acpi.h 2003-10-22 22:47:28.000000000 +0000 @@ -369,16 +369,10 @@ #else /*!CONFIG_ACPI_BOOT*/ -#ifdef CONFIG_ACPI_HT_ONLY -int acpi_boot_init (void); - -#else /* !CONFIG_ACPI_HT_ONLY */ - static inline int acpi_boot_init(void) { return 0; } -#endif /* !CONFIG_ACPI_HT_ONLY */ #endif /*!CONFIG_ACPI_BOOT*/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/agp_backend.h linux-2.4.23-pre8/include/linux/agp_backend.h --- linux-2.4.22/include/linux/agp_backend.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/agp_backend.h 2003-10-22 22:49:17.000000000 +0000 @@ -55,6 +55,9 @@ INTEL_I855_PM, INTEL_I860, INTEL_I865_G, + INTEL_I7205, + INTEL_I7505, + INTEL_460GX, VIA_GENERIC, VIA_VP3, VIA_MVP3, @@ -65,6 +68,7 @@ VIA_APOLLO_KT133, VIA_APOLLO_KM266, VIA_APOLLO_KT400, + VIA_CLE266, VIA_APOLLO_P4M266, VIA_APOLLO_P4X400, SIS_GENERIC, @@ -88,8 +92,16 @@ SVWRKS_GENERIC, NVIDIA_NFORCE, NVIDIA_NFORCE2, + NVIDIA_NFORCE3, NVIDIA_GENERIC, HP_ZX1, + ATI_RS100, + ATI_RS200, + ATI_RS250, + ATI_RS300_100, + ATI_RS300_133, + ATI_RS300_166, + ATI_RS300_200 }; typedef struct _agp_version { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/atmdev.h linux-2.4.23-pre8/include/linux/atmdev.h --- linux-2.4.22/include/linux/atmdev.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/atmdev.h 2003-10-22 22:48:17.000000000 +0000 @@ -296,15 +296,11 @@ struct k_atm_aal_stats *stats; /* pointer to AAL stats group */ wait_queue_head_t sleep; /* if socket is busy */ struct sock *sk; /* socket backpointer */ - struct atm_vcc *prev,*next; /* SVC part --- may move later ------------------------------------- */ short itf; /* interface number */ struct sockaddr_atmsvc local; struct sockaddr_atmsvc remote; void (*callback)(struct atm_vcc *vcc); - struct sk_buff_head listenq; - int backlog_quota; /* number of connection requests we */ - /* can still accept */ int reply; /* also used by ATMTCP */ /* Multipoint part ------------------------------------------------- */ struct atm_vcc *session; /* session VCC descriptor */ @@ -330,8 +326,6 @@ /* (NULL) */ const char *type; /* device type name */ int number; /* device index */ - struct atm_vcc *vccs; /* VCC table (or NULL) */ - struct atm_vcc *last; /* last VCC (or undefined) */ void *dev_data; /* per-device data */ void *phy_data; /* private PHY date */ atm_dev_flags_t flags; /* device flags (ATM_DF_*) */ @@ -400,6 +394,9 @@ unsigned long atm_options; /* ATM layer options */ }; +extern struct sock *vcc_sklist; +extern rwlock_t vcc_sklist_lock; + #define ATM_SKB(skb) (((struct atm_skb_data *) (skb)->cb)) struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops, @@ -407,7 +404,8 @@ struct atm_dev *atm_dev_lookup(int number); void atm_dev_deregister(struct atm_dev *dev); void shutdown_atm_dev(struct atm_dev *dev); -void bind_vcc(struct atm_vcc *vcc,struct atm_dev *dev); +void vcc_insert_socket(struct sock *sk); +void vcc_remove_socket(struct sock *sk); /* @@ -445,7 +443,7 @@ } -static inline void atm_dev_release(struct atm_dev *dev) +static inline void atm_dev_put(struct atm_dev *dev) { atomic_dec(&dev->refcnt); @@ -461,7 +459,7 @@ int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci); int atm_pcr_goal(struct atm_trafprm *tp); -void atm_async_release_vcc(struct atm_vcc *vcc,int reply); +void vcc_release_async(struct atm_vcc *vcc, int reply); #endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/byteorder/generic.h linux-2.4.23-pre8/include/linux/byteorder/generic.h --- linux-2.4.22/include/linux/byteorder/generic.h 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/byteorder/generic.h 2003-10-22 22:47:28.000000000 +0000 @@ -122,7 +122,7 @@ #define be16_to_cpus __be16_to_cpus #endif - +#if defined(__KERNEL__) /* * Handle ntohl and suches. These have various compatibility * issues - like we want to give the prototype even though we @@ -146,35 +146,26 @@ * Do the prototypes. Somebody might want to take the * address or some such sick thing.. */ -#if defined(__KERNEL__) || (defined (__GLIBC__) && __GLIBC__ >= 2) extern __u32 ntohl(__u32); extern __u32 htonl(__u32); -#else -extern unsigned long int ntohl(unsigned long int); -extern unsigned long int htonl(unsigned long int); -#endif extern unsigned short int ntohs(unsigned short int); extern unsigned short int htons(unsigned short int); - -#if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) && !defined(__STRICT_ANSI__) +#if defined(__GNUC__) && defined(__OPTIMIZE__) #define ___htonl(x) __cpu_to_be32(x) #define ___htons(x) __cpu_to_be16(x) #define ___ntohl(x) __be32_to_cpu(x) #define ___ntohs(x) __be16_to_cpu(x) -#if defined(__KERNEL__) || (defined (__GLIBC__) && __GLIBC__ >= 2) #define htonl(x) ___htonl(x) #define ntohl(x) ___ntohl(x) -#else -#define htonl(x) ((unsigned long)___htonl(x)) -#define ntohl(x) ((unsigned long)___ntohl(x)) -#endif #define htons(x) ___htons(x) #define ntohs(x) ___ntohs(x) #endif /* OPTIMIZE */ +#endif /* KERNEL */ + #endif /* _LINUX_BYTEORDER_GENERIC_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/console.h linux-2.4.23-pre8/include/linux/console.h --- linux-2.4.22/include/linux/console.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/console.h 2003-10-22 22:48:39.000000000 +0000 @@ -113,6 +113,7 @@ extern void release_console_sem(void); extern void console_conditional_schedule(void); extern void console_unblank(void); +extern void disable_console_blank(void); /* VESA Blanking Levels */ #define VESA_NO_BLANKING 0 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/ethtool.h linux-2.4.23-pre8/include/linux/ethtool.h --- linux-2.4.22/include/linux/ethtool.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/ethtool.h 2003-10-22 22:48:14.000000000 +0000 @@ -97,7 +97,7 @@ u32 rx_max_coalesced_frames; /* Same as above two parameters, except that these values - * apply while an IRQ is being services by the host. Not + * apply while an IRQ is being serviced by the host. Not * all cards support this feature and the values are ignored * in that case. */ @@ -119,7 +119,7 @@ u32 tx_max_coalesced_frames; /* Same as above two parameters, except that these values - * apply while an IRQ is being services by the host. Not + * apply while an IRQ is being serviced by the host. Not * all cards support this feature and the values are ignored * in that case. */ @@ -250,6 +250,103 @@ u64 data[0]; }; +struct net_device; + +/* Some generic methods drivers may use in their ethtool_ops */ +u32 ethtool_op_get_link(struct net_device *dev); +u32 ethtool_op_get_tx_csum(struct net_device *dev); +int ethtool_op_set_tx_csum(struct net_device *dev, u32 data); +u32 ethtool_op_get_sg(struct net_device *dev); +int ethtool_op_set_sg(struct net_device *dev, u32 data); + +/** + * ðtool_ops - Alter and report network device settings + * get_settings: Get device-specific settings + * set_settings: Set device-specific settings + * get_drvinfo: Report driver information + * get_regs: Get device registers + * get_wol: Report whether Wake-on-Lan is enabled + * set_wol: Turn Wake-on-Lan on or off + * get_msglevel: Report driver message level + * set_msglevel: Set driver message level + * nway_reset: Restart autonegotiation + * get_link: Get link status + * get_eeprom: Read data from the device EEPROM + * set_eeprom: Write data to the device EEPROM + * get_coalesce: Get interrupt coalescing parameters + * set_coalesce: Set interrupt coalescing parameters + * get_ringparam: Report ring sizes + * set_ringparam: Set ring sizes + * get_pauseparam: Report pause parameters + * set_pauseparam: Set pause paramters + * get_rx_csum: Report whether receive checksums are turned on or off + * set_rx_csum: Turn receive checksum on or off + * get_tx_csum: Report whether transmit checksums are turned on or off + * set_tx_csum: Turn transmit checksums on or off + * get_sg: Report whether scatter-gather is enabled + * set_sg: Turn scatter-gather on or off + * self_test: Run specified self-tests + * get_strings: Return a set of strings that describe the requested objects + * phys_id: Identify the device + * get_stats: Return statistics about the device + * + * Description: + * + * get_settings: + * @get_settings is passed an ðtool_cmd to fill in. It returns + * an negative errno or zero. + * + * set_settings: + * @set_settings is passed an ðtool_cmd and should attempt to set + * all the settings this device supports. It may return an error value + * if something goes wrong (otherwise 0). + * + * get_eeprom: + * Should fill in the magic field. Don't need to check len for zero + * or wraparound. Fill in the data argument with the eeprom values + * from offset to offset + len. Update len to the amount read. + * Returns an error or zero. + * + * set_eeprom: + * Should validate the magic field. Don't need to check len for zero + * or wraparound. Update len to the amount written. Returns an error + * or zero. + */ +struct ethtool_ops { + int (*get_settings)(struct net_device *, struct ethtool_cmd *); + int (*set_settings)(struct net_device *, struct ethtool_cmd *); + void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); + int (*get_regs_len)(struct net_device *); + void (*get_regs)(struct net_device *, struct ethtool_regs *, void *); + void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); + int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); + u32 (*get_msglevel)(struct net_device *); + void (*set_msglevel)(struct net_device *, u32); + int (*nway_reset)(struct net_device *); + u32 (*get_link)(struct net_device *); + int (*get_eeprom_len)(struct net_device *); + int (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); + int (*get_coalesce)(struct net_device *, struct ethtool_coalesce *); + int (*set_coalesce)(struct net_device *, struct ethtool_coalesce *); + void (*get_ringparam)(struct net_device *, struct ethtool_ringparam *); + int (*set_ringparam)(struct net_device *, struct ethtool_ringparam *); + void (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam*); + int (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam*); + u32 (*get_rx_csum)(struct net_device *); + int (*set_rx_csum)(struct net_device *, u32); + u32 (*get_tx_csum)(struct net_device *); + int (*set_tx_csum)(struct net_device *, u32); + u32 (*get_sg)(struct net_device *); + int (*set_sg)(struct net_device *, u32); + int (*self_test_count)(struct net_device *); + void (*self_test)(struct net_device *, struct ethtool_test *, u64 *); + void (*get_strings)(struct net_device *, u32 stringset, u8 *); + int (*phys_id)(struct net_device *, u32); + int (*get_stats_count)(struct net_device *); + void (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *); +}; + /* CMDs currently supported */ #define ETHTOOL_GSET 0x00000001 /* Get settings. */ #define ETHTOOL_SSET 0x00000002 /* Set settings. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/firmware.h linux-2.4.23-pre8/include/linux/firmware.h --- linux-2.4.22/include/linux/firmware.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/firmware.h 2003-10-22 22:47:39.000000000 +0000 @@ -0,0 +1,20 @@ +#ifndef _LINUX_FIRMWARE_H +#define _LINUX_FIRMWARE_H +#include +#include +#define FIRMWARE_NAME_MAX 30 +struct firmware { + size_t size; + u8 *data; +}; +int request_firmware (const struct firmware **fw, const char *name, + const char *device); +int request_firmware_nowait ( + struct module *module, + const char *name, const char *device, void *context, + void (*cont)(const struct firmware *fw, void *context)); +/* On 2.5 'device' is 'struct device *' */ + +void release_firmware (const struct firmware *fw); +void register_firmware (const char *name, const u8 *data, size_t size); +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/fs.h linux-2.4.23-pre8/include/linux/fs.h --- linux-2.4.22/include/linux/fs.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/fs.h 2003-10-22 22:48:15.000000000 +0000 @@ -1255,6 +1255,7 @@ } extern void set_buffer_flushtime(struct buffer_head *); +extern inline int get_buffer_flushtime(void); extern void balance_dirty(void); extern int check_disk_change(kdev_t); extern int invalidate_inodes(struct super_block *); @@ -1445,8 +1446,10 @@ return get_hash_table(sb->s_dev, block, sb->s_blocksize); } extern void wakeup_bdflush(void); +extern void wakeup_kupdate(void); extern void put_unused_buffer_head(struct buffer_head * bh); extern struct buffer_head * get_unused_buffer_head(int async); +extern int block_dump; extern int brw_page(int, struct page *, kdev_t, int [], int); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/hdlc/ioctl.h linux-2.4.23-pre8/include/linux/hdlc/ioctl.h --- linux-2.4.22/include/linux/hdlc/ioctl.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/hdlc/ioctl.h 2003-10-22 22:49:00.000000000 +0000 @@ -34,22 +34,15 @@ } fr_proto_pvc; /* for creating/deleting FR PVCs */ typedef struct { + unsigned int dlci; + char master[IFNAMSIZ]; /* Name of master FRAD device */ +}fr_proto_pvc_info; /* for returning PVC information only */ + +typedef struct { unsigned int interval; unsigned int timeout; } cisco_proto; /* PPP doesn't need any info now - supply length = 0 to ioctl */ -union hdlc_settings { - raw_hdlc_proto raw_hdlc; - cisco_proto cisco; - fr_proto fr; - fr_proto_pvc fr_pvc; -}; - -union line_settings { - sync_serial_settings sync; - te1_settings te1; -}; - #endif /* __HDLC_IOCTL_H__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/hdlc.h linux-2.4.23-pre8/include/linux/hdlc.h --- linux-2.4.22/include/linux/hdlc.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/hdlc.h 2003-10-22 22:49:53.000000000 +0000 @@ -1,12 +1,11 @@ /* * Generic HDLC support routines for Linux * - * Copyright (C) 1999-2002 Krzysztof Halasa + * Copyright (C) 1999-2003 Krzysztof Halasa * * 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. + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. */ #ifndef __HDLC_H @@ -52,7 +51,7 @@ #include #define HDLC_MAX_MTU 1500 /* Ethernet 1500 bytes */ -#define HDLC_MAX_MRU (HDLC_MAX_MTU + 10) /* max 10 bytes for FR */ +#define HDLC_MAX_MRU (HDLC_MAX_MTU + 10 + 14 + 4) /* for ETH+VLAN over FR */ #define MAXLEN_LMISTAT 20 /* max size of status enquiry frame */ @@ -145,17 +144,20 @@ typedef struct pvc_device_struct { - struct net_device netdev; /* PVC net device - must be first */ - struct net_device_stats stats; struct hdlc_device_struct *master; - struct pvc_device_struct *next; + struct net_device *main; + struct net_device *ether; /* bridged Ethernet interface */ + struct pvc_device_struct *next; /* Sorted in ascending DLCI order */ + int dlci; + int open_count; struct { - int active; - int new; - int deleted; - int fecn; - int becn; + unsigned int new: 1; + unsigned int active: 1; + unsigned int exist: 1; + unsigned int deleted: 1; + unsigned int fecn: 1; + unsigned int becn: 1; }state; }pvc_device; @@ -180,18 +182,20 @@ void (*stop)(struct hdlc_device_struct *hdlc); void (*proto_detach)(struct hdlc_device_struct *hdlc); void (*netif_rx)(struct sk_buff *skb); + unsigned short (*type_trans)(struct sk_buff *skb, + struct net_device *dev); int proto; /* IF_PROTO_HDLC/CISCO/FR/etc. */ union { struct { fr_proto settings; pvc_device *first_pvc; - int pvc_count; + int dce_pvc_count; struct timer_list timer; int last_poll; int reliable; - int changed; + int dce_changed; int request; int fullrep_sent; u32 last_errors; /* last errors bit list */ @@ -226,6 +230,7 @@ int hdlc_raw_ioctl(hdlc_device *hdlc, struct ifreq *ifr); +int hdlc_raw_eth_ioctl(hdlc_device *hdlc, struct ifreq *ifr); int hdlc_cisco_ioctl(hdlc_device *hdlc, struct ifreq *ifr); int hdlc_ppp_ioctl(hdlc_device *hdlc, struct ifreq *ifr); int hdlc_fr_ioctl(hdlc_device *hdlc, struct ifreq *ifr); @@ -254,15 +259,9 @@ } -static __inline__ struct net_device* pvc_to_dev(pvc_device *pvc) -{ - return &pvc->netdev; -} - - static __inline__ pvc_device* dev_to_pvc(struct net_device *dev) { - return (pvc_device*)dev; + return (pvc_device*)dev->priv; } @@ -272,19 +271,6 @@ } -static __inline__ const char *pvc_to_name(pvc_device *pvc) -{ - return pvc_to_dev(pvc)->name; -} - - -static __inline__ u16 netdev_dlci(struct net_device *dev) -{ - return ntohs(*(u16*)dev->dev_addr); -} - - - static __inline__ u16 q922_to_dlci(u8 *hdr) { return ((hdr[0] & 0xFC) << 2) | ((hdr[1] & 0xF0) >> 4); @@ -345,5 +331,15 @@ } +static __inline__ unsigned short hdlc_type_trans(struct sk_buff *skb, + struct net_device *dev) +{ + hdlc_device *hdlc = dev_to_hdlc(skb->dev); + if (hdlc->type_trans) + return hdlc->type_trans(skb, dev); + else + return __constant_htons(ETH_P_HDLC); +} + #endif /* __KERNEL */ #endif /* __HDLC_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/ide.h linux-2.4.23-pre8/include/linux/ide.h --- linux-2.4.22/include/linux/ide.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/ide.h 2003-10-22 22:47:59.000000000 +0000 @@ -1003,6 +1003,7 @@ unsigned udma_four : 1; /* 1=ATA-66 capable, 0=default */ unsigned highmem : 1; /* can do full 32-bit dma */ unsigned no_dsc : 1; /* 0 default, 1 dsc_overlap disabled */ + unsigned sata : 1; /* 0 PATA, 1 SATA */ void *hwif_data; /* extra hwif data */ } ide_hwif_t; @@ -1331,9 +1332,10 @@ extern int ide_xlate_1024(kdev_t, int, int, const char *); /* - * Convert kdev_t structure into ide_drive_t * one. + * Convert kdev_t structure into ide_drive_t * one. If force is set the + * non present drives can be opened. */ -extern ide_drive_t *get_info_ptr(kdev_t i_rdev); +extern ide_drive_t *ide_info_ptr(kdev_t i_rdev, int force); /* * Return the current idea about the total capacity of this drive. @@ -1349,12 +1351,6 @@ extern ide_startstop_t ide_do_reset(ide_drive_t *); /* - * Re-Start an operation for an IDE interface. - * The caller should return immediately after invoking this. - */ -extern int restart_request(ide_drive_t *, struct request *); - -/* * This function is intended to be used prior to invoking ide_do_drive_cmd(). */ extern void ide_init_drive_cmd(struct request *); @@ -1722,6 +1718,12 @@ extern void hwif_unregister(ide_hwif_t *); +extern void ide_probe_reset(ide_hwif_t *); +extern void ide_tune_drives(ide_hwif_t *); +extern int ide_wait_hwif_ready(ide_hwif_t *); +extern u8 ide_probe_for_drive(ide_drive_t *); + + extern void export_ide_init_queue(ide_drive_t *); extern u8 export_probe_for_drive(ide_drive_t *); extern int probe_hwif_init(ide_hwif_t *); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/if.h linux-2.4.23-pre8/include/linux/if.h --- linux-2.4.22/include/linux/if.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/if.h 2003-10-22 22:48:42.000000000 +0000 @@ -21,6 +21,8 @@ #include /* for "__kernel_caddr_t" et al */ #include /* for "struct sockaddr" et al */ + +#define IFNAMSIZ 16 #include /* Standard interface flags (netdevice->flags). */ @@ -59,7 +61,7 @@ #define IF_IFACE_X21 0x1002 /* X.21 serial interface */ #define IF_IFACE_T1 0x1003 /* T1 telco serial interface */ #define IF_IFACE_E1 0x1004 /* E1 telco serial interface */ -#define IF_IFACE_SYNC_SERIAL 0x1005 /* cant'b be set by software */ +#define IF_IFACE_SYNC_SERIAL 0x1005 /* can't be set by software */ /* For definitions see hdlc.h */ #define IF_PROTO_HDLC 0x2000 /* raw HDLC protocol */ @@ -69,7 +71,11 @@ #define IF_PROTO_FR_ADD_PVC 0x2004 /* Create FR PVC */ #define IF_PROTO_FR_DEL_PVC 0x2005 /* Delete FR PVC */ #define IF_PROTO_X25 0x2006 /* X.25 */ - +#define IF_PROTO_HDLC_ETH 0x2007 /* raw HDLC, Ethernet emulation */ +#define IF_PROTO_FR_ADD_ETH_PVC 0x2008 /* Create FR Ethernet-bridged PVC */ +#define IF_PROTO_FR_DEL_ETH_PVC 0x2009 /* Delete FR Ethernet-bridged PVC */ +#define IF_PROTO_FR_PVC 0x200A /* for reading PVC status */ +#define IF_PROTO_FR_ETH_PVC 0x200B /* @@ -103,6 +109,7 @@ cisco_proto *cisco; fr_proto *fr; fr_proto_pvc *fr_pvc; + fr_proto_pvc_info *fr_pvc_info; /* interface settings */ sync_serial_settings *sync; @@ -120,7 +127,6 @@ struct ifreq { #define IFHWADDRLEN 6 -#define IFNAMSIZ 16 union { char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/in.h linux-2.4.23-pre8/include/linux/in.h --- linux-2.4.22/include/linux/in.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/in.h 2003-10-22 22:48:56.000000000 +0000 @@ -19,6 +19,7 @@ #define _LINUX_IN_H #include +#include /* Standard well-defined IP protocols. */ enum { @@ -41,6 +42,7 @@ IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */ IPPROTO_AH = 51, /* Authentication Header protocol */ IPPROTO_COMP = 108, /* Compression Header protocol */ + IPPROTO_SCTP = 132, /* Stream Control Transport Protocol */ IPPROTO_RAW = 255, /* Raw IP packets */ IPPROTO_MAX @@ -136,29 +138,29 @@ struct group_req { - __u32 gr_interface; /* interface index */ - struct sockaddr_storage gr_group; /* group address */ + __u32 gr_interface; /* interface index */ + struct __kernel_sockaddr_storage gr_group; /* group address */ }; struct group_source_req { - __u32 gsr_interface; /* interface index */ - struct sockaddr_storage gsr_group; /* group address */ - struct sockaddr_storage gsr_source; /* source address */ + __u32 gsr_interface; /* interface index */ + struct __kernel_sockaddr_storage gsr_group; /* group address */ + struct __kernel_sockaddr_storage gsr_source; /* source address */ }; struct group_filter { - __u32 gf_interface; /* interface index */ - struct sockaddr_storage gf_group; /* multicast address */ - __u32 gf_fmode; /* filter mode */ - __u32 gf_numsrc; /* number of sources */ - struct sockaddr_storage gf_slist[1]; /* interface index */ + __u32 gf_interface; /* interface index */ + struct __kernel_sockaddr_storage gf_group; /* multicast address */ + __u32 gf_fmode; /* filter mode */ + __u32 gf_numsrc; /* number of sources */ + struct __kernel_sockaddr_storage gf_slist[1]; /* interface index */ }; #define GROUP_FILTER_SIZE(numsrc) \ - (sizeof(struct group_filter) - sizeof(struct sockaddr_storage) \ - + (numsrc) * sizeof(struct sockaddr_storage)) + (sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) \ + + (numsrc) * sizeof(struct __kernel_sockaddr_storage)) struct in_pktinfo { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/interrupt.h linux-2.4.23-pre8/include/linux/interrupt.h --- linux-2.4.22/include/linux/interrupt.h 2003-06-13 14:51:38.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/interrupt.h 2003-10-22 22:47:28.000000000 +0000 @@ -12,6 +12,12 @@ #include #include +/* For 2.6.x compatibility */ +typedef void irqreturn_t; +#define IRQ_NONE +#define IRQ_HANDLED +#define IRQ_RETVAL(x) + struct irqaction { void (*handler)(int, void *, struct pt_regs *); unsigned long flags; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/ioport.h linux-2.4.23-pre8/include/linux/ioport.h --- linux-2.4.22/include/linux/ioport.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/ioport.h 2003-10-22 22:47:59.000000000 +0000 @@ -83,8 +83,6 @@ extern struct resource ioport_resource; extern struct resource iomem_resource; -extern int get_resource_list(struct resource *, char *buf, int size); - extern int check_resource(struct resource *root, unsigned long, unsigned long); extern int request_resource(struct resource *root, struct resource *new); extern int release_resource(struct resource *new); @@ -111,9 +109,6 @@ extern int __check_region(struct resource *, unsigned long, unsigned long); extern void __release_region(struct resource *, unsigned long, unsigned long); -#define get_ioport_list(buf) get_resource_list(&ioport_resource, buf, PAGE_SIZE) -#define get_mem_list(buf) get_resource_list(&iomem_resource, buf, PAGE_SIZE) - #define HAVE_AUTOIRQ extern void autoirq_setup(int waittime); extern int autoirq_report(int waittime); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/ipv6.h linux-2.4.23-pre8/include/linux/ipv6.h --- linux-2.4.22/include/linux/ipv6.h 2001-11-22 19:47:11.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/ipv6.h 2003-10-22 22:49:12.000000000 +0000 @@ -70,7 +70,7 @@ __u32 bitmap; /* strict/loose bit map */ struct in6_addr addr[0]; -#define rt0_type rt_hdr.type; +#define rt0_type rt_hdr.type }; /* @@ -100,6 +100,52 @@ struct in6_addr daddr; }; +/* + * This structure contains configuration options per IPv6 link. + */ +struct ipv6_devconf { + __s32 forwarding; + __s32 hop_limit; + __s32 mtu6; + __s32 accept_ra; + __s32 accept_redirects; + __s32 autoconf; + __s32 dad_transmits; + __s32 rtr_solicits; + __s32 rtr_solicit_interval; + __s32 rtr_solicit_delay; +#ifdef CONFIG_IPV6_PRIVACY + __s32 use_tempaddr; + __s32 temp_valid_lft; + __s32 temp_prefered_lft; + __s32 regen_max_retry; + __s32 max_desync_factor; +#endif + void *sysctl; +}; + +/* index values for the variables in ipv6_devconf */ +enum { + DEVCONF_FORWARDING = 0, + DEVCONF_HOPLIMIT, + DEVCONF_MTU6, + DEVCONF_ACCEPT_RA, + DEVCONF_ACCEPT_REDIRECTS, + DEVCONF_AUTOCONF, + DEVCONF_DAD_TRANSMITS, + DEVCONF_RTR_SOLICITS, + DEVCONF_RTR_SOLICIT_INTERVAL, + DEVCONF_RTR_SOLICIT_DELAY, +#ifdef CONFIG_IPV6_PRIVACY + DEVCONF_USE_TEMPADDR, + DEVCONF_TEMP_VALID_LFT, + DEVCONF_TEMP_PREFERED_LFT, + DEVCONF_REGEN_MAX_RETRY, + DEVCONF_MAX_DESYNC_FACTOR, +#endif + DEVCONF_MAX +}; + #ifdef __KERNEL__ /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/ipv6_route.h linux-2.4.23-pre8/include/linux/ipv6_route.h --- linux-2.4.22/include/linux/ipv6_route.h 1998-08-28 02:33:08.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/ipv6_route.h 2003-10-22 22:48:00.000000000 +0000 @@ -25,6 +25,7 @@ #define RTF_DEFAULT 0x00010000 /* default - learned via ND */ #define RTF_ALLONLINK 0x00020000 /* fallback, no routers on link */ #define RTF_ADDRCONF 0x00040000 /* addrconf route - RA */ +#define RTF_PREFIX_RT 0x00080000 /* A prefix only route - RA */ #define RTF_NONEXTHOP 0x00200000 /* route with no nexthop */ #define RTF_EXPIRES 0x00400000 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/list.h linux-2.4.23-pre8/include/linux/list.h --- linux-2.4.22/include/linux/list.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/list.h 2003-10-22 22:47:30.000000000 +0000 @@ -227,6 +227,19 @@ pos = list_entry(pos->member.next, typeof(*pos), member), \ prefetch(pos->member.next)) +/** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos: the type * to use as a loop counter. + * @n: another type * to use as temporary storage + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + n = list_entry(pos->member.next, typeof(*pos), member); \ + &pos->member != (head); \ + pos = n, n = list_entry(n->member.next, typeof(*n), member)) + #endif /* __KERNEL__ || _LVM_H_INCLUDE */ #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/lvm.h linux-2.4.23-pre8/include/linux/lvm.h --- linux-2.4.22/include/linux/lvm.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/lvm.h 2003-10-22 22:47:36.000000000 +0000 @@ -80,8 +80,8 @@ #ifndef _LVM_H_INCLUDE #define _LVM_H_INCLUDE -#define LVM_RELEASE_NAME "1.0.5+" -#define LVM_RELEASE_DATE "22/07/2002" +#define LVM_RELEASE_NAME "1.0.7" +#define LVM_RELEASE_DATE "28/03/2003" #define _LVM_KERNEL_H_VERSION "LVM "LVM_RELEASE_NAME" ("LVM_RELEASE_DATE")" @@ -94,7 +94,7 @@ #define LVM_TOTAL_RESET #ifdef __KERNEL__ -#undef LVM_HD_NAME /* display nice names in /proc/partitions */ +#undef LVM_HD_NAME /* display nice names in /proc/partitions */ /* lots of debugging output (see driver source) #define DEBUG_LVM_GET_INFO @@ -118,7 +118,7 @@ causes problems on some platforms. It's not nice but then neither is the alternative. */ struct list_head { - struct list_head *next, *prev; + struct list_head *next, *prev; }; #define __KERNEL__ #include @@ -258,9 +258,9 @@ #define LVM_PE_T_MAX ( ( 1 << ( sizeof ( uint16_t) * 8)) - 2) #define LVM_LV_SIZE_MAX(a) ( ( long long) LVM_PE_T_MAX * (a)->pe_size > ( long long) 1024*1024/SECTOR_SIZE*1024*1024 ? ( long long) 1024*1024/SECTOR_SIZE*1024*1024 : ( long long) LVM_PE_T_MAX * (a)->pe_size) -#define LVM_MIN_PE_SIZE ( 8192L / SECTOR_SIZE) /* 8 KB in sectors */ +#define LVM_MIN_PE_SIZE ( 8192L / SECTOR_SIZE) /* 8 KB in sectors */ #define LVM_MAX_PE_SIZE ( 16L * 1024L * 1024L / SECTOR_SIZE * 1024) /* 16GB in sectors */ -#define LVM_DEFAULT_PE_SIZE ( 4096L * 1024 / SECTOR_SIZE) /* 4 MB in sectors */ +#define LVM_DEFAULT_PE_SIZE ( 32768L * 1024 / SECTOR_SIZE) /* 32 MB in sectors */ #define LVM_DEFAULT_STRIPE_SIZE 16L /* 16 KB */ #define LVM_MIN_STRIPE_SIZE ( PAGE_SIZE/SECTOR_SIZE) /* PAGESIZE in sectors */ #define LVM_MAX_STRIPE_SIZE ( 512L * 1024 / SECTOR_SIZE) /* 512 KB in sectors */ @@ -416,9 +416,9 @@ typedef struct lv_block_exception_v1 { struct list_head hash; uint32_t rsector_org; - kdev_t rdev_org; + kdev_t rdev_org; uint32_t rsector_new; - kdev_t rdev_new; + kdev_t rdev_new; } lv_block_exception_t; /* disk stored pe information */ @@ -462,7 +462,7 @@ uint pe_stale; /* for future use */ pe_disk_t *pe; /* HM */ struct block_device *bd; - char pv_uuid[UUID_LEN+1]; + char pv_uuid[UUID_LEN + 1]; #ifndef __KERNEL__ uint32_t pe_start; /* in sectors */ @@ -473,7 +473,7 @@ /* disk */ typedef struct pv_disk_v2 { uint8_t id[2]; /* Identifier */ - uint16_t version; /* HM lvm version */ + uint16_t version; /* HM lvm version */ lvm_disk_data_t pv_on_disk; lvm_disk_data_t vg_on_disk; lvm_disk_data_t pv_uuidlist_on_disk; @@ -486,14 +486,14 @@ uint32_t pv_number; uint32_t pv_status; uint32_t pv_allocatable; - uint32_t pv_size; /* HM */ + uint32_t pv_size; /* HM */ uint32_t lv_cur; uint32_t pe_size; uint32_t pe_total; uint32_t pe_allocated; - + /* new in struct version 2 */ - uint32_t pe_start; /* in sectors */ + uint32_t pe_start; /* in sectors */ } pv_disk_t; @@ -567,8 +567,8 @@ uint32_t lv_snapshot_hash_table_size; uint32_t lv_snapshot_hash_mask; wait_queue_head_t lv_snapshot_wait; - int lv_snapshot_use_rate; - struct vg_v3 *vg; + int lv_snapshot_use_rate; + struct vg_v3 *vg; uint lv_allocated_snapshot_le; #else @@ -582,14 +582,14 @@ uint8_t vg_name[NAME_LEN]; uint32_t lv_access; uint32_t lv_status; - uint32_t lv_open; /* HM */ - uint32_t lv_dev; /* HM */ + uint32_t lv_open; /* HM */ + uint32_t lv_dev; /* HM */ uint32_t lv_number; /* HM */ uint32_t lv_mirror_copies; /* for future use */ uint32_t lv_recovery; /* " */ uint32_t lv_schedule; /* " */ uint32_t lv_size; - uint32_t lv_snapshot_minor;/* minor number of original */ + uint32_t lv_snapshot_minor; /* minor number of original */ uint16_t lv_chunk_size; /* chunk size of snapshot */ uint16_t dummy; uint32_t lv_allocated_le; @@ -626,7 +626,7 @@ struct proc_dir_entry *proc; pv_t *pv[ABS_MAX_PV + 1]; /* physical volume struct pointers */ lv_t *lv[ABS_MAX_LV + 1]; /* logical volume struct pointers */ - char vg_uuid[UUID_LEN+1]; /* volume group UUID */ + char vg_uuid[UUID_LEN + 1]; /* volume group UUID */ #ifdef __KERNEL__ struct proc_dir_entry *vg_dir_pde; struct proc_dir_entry *lv_subdir_pde; @@ -640,20 +640,20 @@ /* disk */ typedef struct vg_disk_v2 { uint8_t vg_uuid[UUID_LEN]; /* volume group UUID */ - uint8_t vg_name_dummy[NAME_LEN-UUID_LEN]; /* rest of v1 VG name */ + uint8_t vg_name_dummy[NAME_LEN - UUID_LEN]; /* rest of v1 VG name */ uint32_t vg_number; /* volume group number */ uint32_t vg_access; /* read/write */ uint32_t vg_status; /* active or not */ - uint32_t lv_max; /* maximum logical volumes */ - uint32_t lv_cur; /* current logical volumes */ - uint32_t lv_open; /* open logical volumes */ - uint32_t pv_max; /* maximum physical volumes */ - uint32_t pv_cur; /* current physical volumes FU */ - uint32_t pv_act; /* active physical volumes */ + uint32_t lv_max; /* maximum logical volumes */ + uint32_t lv_cur; /* current logical volumes */ + uint32_t lv_open; /* open logical volumes */ + uint32_t pv_max; /* maximum physical volumes */ + uint32_t pv_cur; /* current physical volumes FU */ + uint32_t pv_act; /* active physical volumes */ uint32_t dummy; uint32_t vgda; /* volume group descriptor arrays FU */ - uint32_t pe_size; /* physical extent size in sectors */ - uint32_t pe_total; /* total of physical extents */ + uint32_t pe_size; /* physical extent size in sectors */ + uint32_t pe_total; /* total of physical extents */ uint32_t pe_allocated; /* allocated physical extents */ uint32_t pvg_total; /* physical volume groups FU */ } vg_disk_t; @@ -712,40 +712,44 @@ /* Request structure LV_SNAPSHOT_USE_RATE */ typedef struct { - int block; - int rate; + int block; + int rate; } lv_snapshot_use_rate_req_t; /* useful inlines */ -static inline ulong round_up(ulong n, ulong size) { +static inline ulong round_up(ulong n, ulong size) +{ size--; return (n + size) & ~size; } -static inline ulong div_up(ulong n, ulong size) { +static inline ulong div_up(ulong n, ulong size) +{ return round_up(n, size) / size; } /* FIXME: nasty capital letters */ -static int inline LVM_GET_COW_TABLE_CHUNKS_PER_PE(vg_t *vg, lv_t *lv) { +static int inline LVM_GET_COW_TABLE_CHUNKS_PER_PE(vg_t * vg, lv_t * lv) +{ return vg->pe_size / lv->lv_chunk_size; } -static int inline LVM_GET_COW_TABLE_ENTRIES_PER_PE(vg_t *vg, lv_t *lv) { +static int inline LVM_GET_COW_TABLE_ENTRIES_PER_PE(vg_t * vg, lv_t * lv) +{ ulong chunks = vg->pe_size / lv->lv_chunk_size; ulong entry_size = sizeof(lv_COW_table_disk_t); ulong chunk_size = lv->lv_chunk_size * SECTOR_SIZE; ulong entries = (vg->pe_size * SECTOR_SIZE) / - (entry_size + chunk_size); + (entry_size + chunk_size); - if(chunks < 2) + if (chunks < 2) return 0; - for(; entries; entries--) - if((div_up(entries * entry_size, chunk_size) + entries) <= - chunks) + for (; entries; entries--) + if ((div_up(entries * entry_size, chunk_size) + entries) <= + chunks) break; return entries; @@ -753,4 +757,3 @@ #endif /* #ifndef _LVM_H_INCLUDE */ - diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/mm.h linux-2.4.23-pre8/include/linux/mm.h --- linux-2.4.22/include/linux/mm.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/mm.h 2003-10-22 22:47:37.000000000 +0000 @@ -322,9 +322,11 @@ #define TryLockPage(page) test_and_set_bit(PG_locked, &(page)->flags) #define PageChecked(page) test_bit(PG_checked, &(page)->flags) #define SetPageChecked(page) set_bit(PG_checked, &(page)->flags) +#define ClearPageChecked(page) clear_bit(PG_checked, &(page)->flags) #define PageLaunder(page) test_bit(PG_launder, &(page)->flags) #define SetPageLaunder(page) set_bit(PG_launder, &(page)->flags) #define ClearPageLaunder(page) clear_bit(PG_launder, &(page)->flags) +#define ClearPageArch1(page) clear_bit(PG_arch_1, &(page)->flags) /* * The zone field is never updated after free_area_init_core() @@ -535,8 +537,8 @@ return page_count(page) - !!page->buffers == 1; } -extern int can_share_swap_page(struct page *); -extern int remove_exclusive_swap_page(struct page *); +extern int FASTCALL(can_share_swap_page(struct page *)); +extern int FASTCALL(remove_exclusive_swap_page(struct page *)); extern void __free_pte(pte_t); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/mmzone.h linux-2.4.23-pre8/include/linux/mmzone.h --- linux-2.4.22/include/linux/mmzone.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/mmzone.h 2003-10-22 22:47:30.000000000 +0000 @@ -19,6 +19,11 @@ #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER #endif +#define ZONE_DMA 0 +#define ZONE_NORMAL 1 +#define ZONE_HIGHMEM 2 +#define MAX_NR_ZONES 3 + typedef struct free_area_struct { struct list_head free_list; unsigned long *map; @@ -26,6 +31,11 @@ struct pglist_data; +typedef struct zone_watermarks_s { + unsigned long min, low, high; +} zone_watermarks_t; + + /* * On machines where it is needed (eg PCs) we divide physical memory * into multiple physical zones. On a PC we have 3 zones: @@ -40,8 +50,27 @@ */ spinlock_t lock; unsigned long free_pages; - unsigned long pages_min, pages_low, pages_high; - int need_balance; + /* + * We don't know if the memory that we're going to allocate will be freeable + * or/and it will be released eventually, so to avoid totally wasting several + * GB of ram we must reserve some of the lower zone memory (otherwise we risk + * to run OOM on the lower zones despite there's tons of freeable ram + * on the higher zones). + */ + zone_watermarks_t watermarks[MAX_NR_ZONES]; + + /* + * The below fields are protected by different locks (or by + * no lock at all like need_balance), so they're longs to + * provide an atomic granularity against each other on + * all architectures. + */ + unsigned long need_balance; + /* protected by the pagemap_lru_lock */ + unsigned long nr_active_pages, nr_inactive_pages; + /* protected by the pagecache_lock */ + unsigned long nr_cache_pages; + /* * free areas of different sizes @@ -90,13 +119,9 @@ */ char *name; unsigned long size; + unsigned long realsize; } zone_t; -#define ZONE_DMA 0 -#define ZONE_NORMAL 1 -#define ZONE_HIGHMEM 2 -#define MAX_NR_ZONES 3 - /* * One allocation request operates on a zonelist. A zonelist * is a list of zones, the first one is the 'goal' of the @@ -143,8 +168,8 @@ extern int numnodes; extern pg_data_t *pgdat_list; -#define memclass(pgzone, classzone) (((pgzone)->zone_pgdat == (classzone)->zone_pgdat) \ - && ((pgzone) <= (classzone))) +#define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones) +#define memclass(pgzone, classzone) (zone_idx(pgzone) <= zone_idx(classzone)) /* * The following two are not meant for general usage. They are here as diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/net.h linux-2.4.23-pre8/include/linux/net.h --- linux-2.4.22/include/linux/net.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/net.h 2003-10-22 22:48:36.000000000 +0000 @@ -141,6 +141,7 @@ const struct iovec * iov, long count, long size); extern struct socket *sockfd_lookup(int fd, int *err); +extern int sock_map_fd(struct socket *sock); extern int net_ratelimit(void); extern unsigned long net_random(void); extern void net_srandom(unsigned long); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/netdevice.h linux-2.4.23-pre8/include/linux/netdevice.h --- linux-2.4.22/include/linux/netdevice.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/netdevice.h 2003-10-22 22:49:41.000000000 +0000 @@ -41,9 +41,15 @@ struct divert_blk; struct vlan_group; +struct ethtool_ops; + + /* source back-compat hook */ +#define SET_ETHTOOL_OPS(netdev,ops) \ + ( (netdev)->ethtool_ops = (ops) ) #define HAVE_ALLOC_NETDEV /* feature macro: alloc_xxxdev functions are available. */ +#define HAVE_FREE_NETDEV #define NET_XMIT_SUCCESS 0 #define NET_XMIT_DROP 1 /* skb dropped */ @@ -198,7 +204,7 @@ (HH_DATA_MOD - ((__len) & (HH_DATA_MOD - 1))) #define HH_DATA_ALIGN(__len) \ (((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1)) - unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER)]; + unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)]; }; /* These flag bits are private to the generic network queueing @@ -290,6 +296,8 @@ * See for details. Jean II */ struct iw_handler_def * wireless_handlers; + struct ethtool_ops *ethtool_ops; + /* * This marks the end of the "visible" part of the structure. All * fields hereafter are internal to the system, and may change at @@ -601,6 +609,7 @@ #define HAVE_NETIF_RECEIVE_SKB 1 extern int netif_receive_skb(struct sk_buff *skb); extern int dev_ioctl(unsigned int cmd, void *); +extern int dev_ethtool(struct ifreq *); extern int dev_change_flags(struct net_device *, unsigned); extern void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev); @@ -789,10 +798,43 @@ local_irq_save(flags); if (!test_bit(__LINK_STATE_RX_SCHED, &dev->state)) BUG(); list_del(&dev->poll_list); + smp_mb__before_clear_bit(); clear_bit(__LINK_STATE_RX_SCHED, &dev->state); local_irq_restore(flags); } +static inline void netif_poll_disable(struct net_device *dev) +{ + while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) { + /* No hurry. */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(1); + } +} + +static inline void netif_poll_enable(struct net_device *dev) +{ + clear_bit(__LINK_STATE_RX_SCHED, &dev->state); +} + +/* same as netif_rx_complete, except that local_irq_save(flags) + * has already been issued + */ +static inline void __netif_rx_complete(struct net_device *dev) +{ + if (!test_bit(__LINK_STATE_RX_SCHED, &dev->state)) BUG(); + list_del(&dev->poll_list); + smp_mb__before_clear_bit(); + clear_bit(__LINK_STATE_RX_SCHED, &dev->state); +} + +static inline void netif_tx_disable(struct net_device *dev) +{ + spin_lock_bh(&dev->xmit_lock); + netif_stop_queue(dev); + spin_unlock_bh(&dev->xmit_lock); +} + /* These functions live elsewhere (drivers/net/net_init.c, but related) */ extern void ether_setup(struct net_device *dev); @@ -801,6 +843,8 @@ extern void fc_setup(struct net_device *dev); extern void fc_freedev(struct net_device *dev); /* Support for loadable net-drivers */ +extern struct net_device *alloc_netdev(int sizeof_priv, const char *name, + void (*setup)(struct net_device *)); extern int register_netdev(struct net_device *dev); extern void unregister_netdev(struct net_device *dev); /* Functions used for multicast support */ @@ -828,6 +872,10 @@ extern void dev_clear_fastroute(struct net_device *dev); #endif +static inline void free_netdev(struct net_device *dev) +{ + kfree(dev); +} #endif /* __KERNEL__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/netfilter_ipv4/ip_conntrack_tuple.h linux-2.4.23-pre8/include/linux/netfilter_ipv4/ip_conntrack_tuple.h --- linux-2.4.22/include/linux/netfilter_ipv4/ip_conntrack_tuple.h 2002-02-25 19:38:13.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/netfilter_ipv4/ip_conntrack_tuple.h 2003-10-22 22:49:14.000000000 +0000 @@ -62,6 +62,14 @@ } dst; }; +/* This is optimized opposed to a memset of the whole structure. Everything we + * really care about is the source/destination unions */ +#define IP_CT_TUPLE_U_BLANK(tuple) \ + do { \ + (tuple)->src.u.all = 0; \ + (tuple)->dst.u.all = 0; \ + } while (0) + enum ip_conntrack_dir { IP_CT_DIR_ORIGINAL, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/netfilter_ipv4/ip_nat_rule.h linux-2.4.23-pre8/include/linux/netfilter_ipv4/ip_nat_rule.h --- linux-2.4.22/include/linux/netfilter_ipv4/ip_nat_rule.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/netfilter_ipv4/ip_nat_rule.h 2003-10-22 22:48:29.000000000 +0000 @@ -14,5 +14,10 @@ const struct net_device *out, struct ip_conntrack *ct, struct ip_nat_info *info); + +extern unsigned int +alloc_null_binding(struct ip_conntrack *conntrack, + struct ip_nat_info *info, + unsigned int hooknum); #endif #endif /* _IP_NAT_RULE_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/nfs_xdr.h linux-2.4.23-pre8/include/linux/nfs_xdr.h --- linux-2.4.22/include/linux/nfs_xdr.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/nfs_xdr.h 2003-10-22 22:48:19.000000000 +0000 @@ -109,8 +109,6 @@ const char * name; unsigned int len; int eof; - struct nfs_fh fh; - struct nfs_fattr fattr; }; /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/nfsd/export.h linux-2.4.23-pre8/include/linux/nfsd/export.h --- linux-2.4.22/include/linux/nfsd/export.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/nfsd/export.h 2003-10-22 22:47:29.000000000 +0000 @@ -35,7 +35,7 @@ #define NFSEXP_UIDMAP 0x0040 #define NFSEXP_KERBEROS 0x0080 /* not available */ #define NFSEXP_SUNSECURE 0x0100 -#define NFSEXP_CROSSMNT 0x0200 +#define NFSEXP_NOHIDE 0x0200 #define NFSEXP_NOSUBTREECHECK 0x0400 #define NFSEXP_NOAUTHNLM 0x0800 /* Don't authenticate NLM requests - just trust */ #define NFSEXP_MSNFS 0x1000 /* do silly things that MS clients expect */ @@ -80,7 +80,7 @@ #define EX_SECURE(exp) (!((exp)->ex_flags & NFSEXP_INSECURE_PORT)) #define EX_ISSYNC(exp) (!((exp)->ex_flags & NFSEXP_ASYNC)) #define EX_RDONLY(exp) ((exp)->ex_flags & NFSEXP_READONLY) -#define EX_CROSSMNT(exp) ((exp)->ex_flags & NFSEXP_CROSSMNT) +#define EX_NOHIDE(exp) ((exp)->ex_flags & NFSEXP_NOHIDE) #define EX_SUNSECURE(exp) ((exp)->ex_flags & NFSEXP_SUNSECURE) #define EX_WGATHER(exp) ((exp)->ex_flags & NFSEXP_GATHERED_WRITES) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/pagemap.h linux-2.4.23-pre8/include/linux/pagemap.h --- linux-2.4.22/include/linux/pagemap.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/pagemap.h 2003-10-22 22:47:30.000000000 +0000 @@ -45,7 +45,7 @@ #define PAGE_HASH_BITS (page_hash_bits) #define PAGE_HASH_SIZE (1 << PAGE_HASH_BITS) -extern atomic_t page_cache_size; /* # of pages currently in the hash table */ +extern unsigned long page_cache_size; /* # of pages currently in the hash table */ extern struct page **page_hash_table; extern void page_cache_init(unsigned long); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/pci.h linux-2.4.23-pre8/include/linux/pci.h --- linux-2.4.22/include/linux/pci.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/pci.h 2003-10-22 22:48:54.000000000 +0000 @@ -520,6 +520,32 @@ int (*enable_wake) (struct pci_dev *dev, u32 state, int enable); /* Enable wake event */ }; +/** + * PCI_DEVICE - macro used to describe a specific pci device + * @vend: the 16 bit PCI Vendor ID + * @dev: the 16 bit PCI Device ID + * + * This macro is used to create a struct pci_device_id that matches a + * specific device. The subvendor and subdevice fields will be set to + * PCI_ANY_ID. + */ +#define PCI_DEVICE(vend,dev) \ + .vendor = (vend), .device = (dev), \ + .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID + +/** + * PCI_DEVICE_CLASS - macro used to describe a specific pci device class + * @dev_class: the class, subclass, prog-if triple for this device + * @dev_class_mask: the class mask for this device + * + * This macro is used to create a struct pci_device_id that matches a + * specific PCI class. The vendor, device, subvendor, and subdevice + * fields will be set to PCI_ANY_ID. + */ +#define PCI_DEVICE_CLASS(dev_class,dev_class_mask) \ + .class = (dev_class), .class_mask = (dev_class_mask), \ + .vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \ + .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID /* these external functions are only available when PCI support is enabled */ #ifdef CONFIG_PCI @@ -602,7 +628,6 @@ #define HAVE_PCI_SET_MWI int pci_set_mwi(struct pci_dev *dev); void pci_clear_mwi(struct pci_dev *dev); -int pdev_set_mwi(struct pci_dev *dev); int pci_set_dma_mask(struct pci_dev *dev, u64 mask); int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask); int pci_assign_resource(struct pci_dev *dev, int i); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/pci_ids.h linux-2.4.23-pre8/include/linux/pci_ids.h --- linux-2.4.22/include/linux/pci_ids.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/pci_ids.h 2003-10-22 22:48:38.000000000 +0000 @@ -559,6 +559,7 @@ #define PCI_DEVICE_ID_SI_750 0x0750 #define PCI_DEVICE_ID_SI_751 0x0751 #define PCI_DEVICE_ID_SI_752 0x0752 +#define PCI_DEVICE_ID_SI_755 0x0755 #define PCI_DEVICE_ID_SI_900 0x0900 #define PCI_DEVICE_ID_SI_5107 0x5107 #define PCI_DEVICE_ID_SI_5300 0x5300 @@ -810,6 +811,7 @@ #define PCI_DEVICE_ID_SUN_SCHIZO 0x8001 #define PCI_DEVICE_ID_SUN_SABRE 0xa000 #define PCI_DEVICE_ID_SUN_HUMMINGBIRD 0xa001 +#define PCI_DEVICE_ID_SUN_TOMATILLO 0xa801 #define PCI_VENDOR_ID_CMD 0x1095 #define PCI_DEVICE_ID_SII_1210SA 0x0240 @@ -841,6 +843,7 @@ #define PCI_VENDOR_ID_SGI 0x10a9 #define PCI_DEVICE_ID_SGI_IOC3 0x0003 +#define PCI_DEVICE_ID_SGI_IOC4 0x100a #define PCI_VENDOR_ID_ACC 0x10aa #define PCI_DEVICE_ID_ACC_2056 0x0000 @@ -965,6 +968,7 @@ #define PCI_DEVICE_ID_NVIDIA_UVTNT2 0x002D #define PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE 0x0065 #define PCI_DEVICE_ID_NVIDIA_ITNT2 0x00A0 +#define PCI_DEVICE_ID_NVIDIA_NFORCE3 0x00d1 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR 0x0100 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR 0x0101 #define PCI_DEVICE_ID_NVIDIA_QUADRO 0x0103 @@ -1082,12 +1086,14 @@ #define PCI_DEVICE_ID_VIA_8233C_0 0x3109 #define PCI_DEVICE_ID_VIA_8361 0x3112 #define PCI_DEVICE_ID_VIA_8375 0x3116 +#define PCI_DEVICE_ID_VIA_CLE266 0x3123 #define PCI_DEVICE_ID_VIA_8233A 0x3147 #define PCI_DEVICE_ID_VIA_P4M266 0x3148 #define PCI_DEVICE_ID_VIA_8237_SATA 0x3149 #define PCI_DEVICE_ID_VIA_P4X333 0x3168 #define PCI_DEVICE_ID_VIA_8235 0x3177 #define PCI_DEVICE_ID_VIA_8377_0 0x3189 +#define PCI_DEVICE_ID_VIA_K8T400M_0 0x3188 #define PCI_DEVICE_ID_VIA_8237 0x3227 #define PCI_DEVICE_ID_VIA_86C100A 0x6100 #define PCI_DEVICE_ID_VIA_8231 0x8231 @@ -1187,6 +1193,8 @@ #define PCI_DEVICE_ID_SYSKONNECT_TR 0x4200 #define PCI_DEVICE_ID_SYSKONNECT_GE 0x4300 #define PCI_DEVICE_ID_SYSKONNECT_YU 0x4320 +#define PCI_DEVICE_ID_SYSKONNECT_9DXX 0x4400 +#define PCI_DEVICE_ID_SYSKONNECT_9MXX 0x4500 #define PCI_VENDOR_ID_VMIC 0x114a #define PCI_DEVICE_ID_VMIC_VME 0x7587 @@ -1649,13 +1657,19 @@ #define PCI_DEVICE_ID_TIGON3_5704 0x1648 #define PCI_DEVICE_ID_TIGON3_5702FE 0x164d #define PCI_DEVICE_ID_TIGON3_5705 0x1653 +#define PCI_DEVICE_ID_TIGON3_5705_2 0x1654 #define PCI_DEVICE_ID_TIGON3_5705M 0x165d +#define PCI_DEVICE_ID_TIGON3_5705M_2 0x165e #define PCI_DEVICE_ID_TIGON3_5782 0x1696 +#define PCI_DEVICE_ID_TIGON3_5788 0x169c #define PCI_DEVICE_ID_TIGON3_5702X 0x16a6 #define PCI_DEVICE_ID_TIGON3_5703X 0x16a7 #define PCI_DEVICE_ID_TIGON3_5704S 0x16a8 #define PCI_DEVICE_ID_TIGON3_5702A3 0x16c6 #define PCI_DEVICE_ID_TIGON3_5703A3 0x16c7 +#define PCI_DEVICE_ID_TIGON3_5901 0x170d +#define PCI_DEVICE_ID_TIGON3_5901_2 0x170e +#define PCI_DEVICE_ID_BCM4401 0x4401 #define PCI_VENDOR_ID_SYBA 0x1592 #define PCI_DEVICE_ID_SYBA_2P_EPP 0x0782 @@ -1672,7 +1686,9 @@ #define PCI_VENDOR_ID_ALTIMA 0x173b #define PCI_DEVICE_ID_ALTIMA_AC1000 0x03e8 +#define PCI_DEVICE_ID_ALTIMA_AC1001 0x03e9 #define PCI_DEVICE_ID_ALTIMA_AC9100 0x03ea +#define PCI_DEVICE_ID_ALTIMA_AC1003 0x03eb #define PCI_VENDOR_ID_SYMPHONY 0x1c1c #define PCI_DEVICE_ID_SYMPHONY_101 0x0001 @@ -1756,6 +1772,7 @@ #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 #define PCI_DEVICE_ID_INTEL_82092AA_1 0x1222 #define PCI_DEVICE_ID_INTEL_7116 0x1223 +#define PCI_DEVICE_ID_INTEL_7205_0 0x255d #define PCI_DEVICE_ID_INTEL_82596 0x1226 #define PCI_DEVICE_ID_INTEL_82865 0x1227 #define PCI_DEVICE_ID_INTEL_82557 0x1229 @@ -1768,6 +1785,7 @@ #define PCI_DEVICE_ID_INTEL_82380FB 0x124b #define PCI_DEVICE_ID_INTEL_82439 0x1250 #define PCI_DEVICE_ID_INTEL_80960_RP 0x1960 +#define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 #define PCI_DEVICE_ID_INTEL_82371SB_0 0x7000 #define PCI_DEVICE_ID_INTEL_82371SB_1 0x7010 #define PCI_DEVICE_ID_INTEL_82371SB_2 0x7020 @@ -1856,6 +1874,8 @@ #define PCI_DEVICE_ID_INTEL_ESB_11 0x25ac #define PCI_DEVICE_ID_INTEL_ESB_12 0x25ad #define PCI_DEVICE_ID_INTEL_ESB_13 0x25ae +#define PCI_DEVICE_ID_INTEL_82850_HB 0x2530 +#define PCI_DEVICE_ID_INTEL_82845G_HB 0x2560 #define PCI_DEVICE_ID_INTEL_80310 0x530d #define PCI_DEVICE_ID_INTEL_82810_MC1 0x7120 #define PCI_DEVICE_ID_INTEL_82810_IG1 0x7121 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/personality.h linux-2.4.23-pre8/include/linux/personality.h --- linux-2.4.22/include/linux/personality.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/personality.h 2003-10-22 22:48:59.000000000 +0000 @@ -57,6 +57,7 @@ PER_SUNOS = 0x0006 | STICKY_TIMEOUTS, PER_XENIX = 0x0007 | STICKY_TIMEOUTS | SHORT_INODE, PER_LINUX32 = 0x0008, + PER_LINUX32_3GB = 0x0008 | ADDR_LIMIT_3GB, PER_IRIX32 = 0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */ PER_IRIXN32 = 0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */ PER_IRIX64 = 0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/pkt_sched.h linux-2.4.23-pre8/include/linux/pkt_sched.h --- linux-2.4.22/include/linux/pkt_sched.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/pkt_sched.h 2003-10-22 22:49:13.000000000 +0000 @@ -45,7 +45,7 @@ struct tc_estimator { - char interval; + signed char interval; unsigned char ewma_log; }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/proc_fs.h linux-2.4.23-pre8/include/linux/proc_fs.h --- linux-2.4.22/include/linux/proc_fs.h 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/proc_fs.h 2003-10-22 22:47:28.000000000 +0000 @@ -209,4 +209,9 @@ #endif /* CONFIG_PROC_FS */ +static inline struct proc_dir_entry *PDE(const struct inode *inode) +{ + return (struct proc_dir_entry *)inode->u.generic_ip; +} + #endif /* _LINUX_PROC_FS_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/ptrace.h linux-2.4.23-pre8/include/linux/ptrace.h --- linux-2.4.22/include/linux/ptrace.h 2001-09-14 22:55:17.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/ptrace.h 2003-10-22 22:47:42.000000000 +0000 @@ -23,4 +23,22 @@ #include +#ifdef __KERNEL__ + +#ifndef force_successful_syscall_return +/* + * System call handlers that, upon successful completion, need to return a + * negative value should call force_successful_syscall_return() right before + * returning. On architectures where the syscall convention provides for a + * separate error flag (e.g., alpha, ia64, ppc{,64}, sparc{,64}, possibly + * others), this macro can be used to ensure that the error flag will not get + * set. On architectures which do not support a separate error flag, the macro + * is a no-op and the spurious error condition needs to be filtered out by some + * other means (e.g., in user-level, by passing an extra argument to the + * syscall handler, or something along those lines). + */ +#define force_successful_syscall_return() do { } while (0) +#endif +#endif + #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/rtnetlink.h linux-2.4.23-pre8/include/linux/rtnetlink.h --- linux-2.4.22/include/linux/rtnetlink.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/rtnetlink.h 2003-10-22 22:49:17.000000000 +0000 @@ -167,6 +167,7 @@ #define RTM_F_NOTIFY 0x100 /* Notify user of route change */ #define RTM_F_CLONED 0x200 /* This route is cloned */ #define RTM_F_EQUALIZE 0x400 /* Multipath equalizer: NI */ +#define RTM_F_PREFIX 0x800 /* Prefix addresses */ /* Reserved table identifiers */ @@ -444,10 +445,12 @@ #define IFLA_MASTER IFLA_MASTER IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */ #define IFLA_WIRELESS IFLA_WIRELESS + IFLA_PROTINFO, /* Protocol specific information for a link */ +#define IFLA_PROTINFO IFLA_PROTINFO }; -#define IFLA_MAX IFLA_WIRELESS +#define IFLA_MAX IFLA_PROTINFO #define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) @@ -481,6 +484,18 @@ for IPIP tunnels, when route to endpoint is allowed to change) */ +/* Subtype attributes for IFLA_PROTINFO */ +enum +{ + IFLA_INET6_UNSPEC, + IFLA_INET6_FLAGS, /* link flags */ + IFLA_INET6_CONF, /* sysctl parameters */ + IFLA_INET6_STATS, /* statistics */ + IFLA_INET6_MCAST, /* MC things. What of them? */ +}; + +#define IFLA_INET6_MAX IFLA_INET6_MCAST + /***************************************************************** * Traffic control messages. ****/ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/sched.h linux-2.4.23-pre8/include/linux/sched.h --- linux-2.4.22/include/linux/sched.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/sched.h 2003-10-22 22:47:42.000000000 +0000 @@ -429,7 +429,6 @@ #define PF_DUMPCORE 0x00000200 /* dumped core */ #define PF_SIGNALED 0x00000400 /* killed by a signal */ #define PF_MEMALLOC 0x00000800 /* Allocating memory */ -#define PF_MEMDIE 0x00001000 /* Killed for out-of-memory */ #define PF_FREE_PAGES 0x00002000 /* per process page freeing */ #define PF_NOIO 0x00004000 /* avoid generating further I/O */ @@ -575,6 +574,7 @@ /* per-UID process charging. */ extern struct user_struct * alloc_uid(uid_t); extern void free_uid(struct user_struct *); +extern void switch_uid(struct user_struct *); #include diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/sctp.h linux-2.4.23-pre8/include/linux/sctp.h --- linux-2.4.22/include/linux/sctp.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/sctp.h 2003-10-22 22:47:28.000000000 +0000 @@ -0,0 +1,588 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2002 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * This file is part of the SCTP kernel reference Implementation + * + * Various protocol defined structures. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Xingang Guo + * randall@sctp.chicago.il.us + * kmorneau@cisco.com + * qxie1@email.mot.com + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ +#ifndef __LINUX_SCTP_H__ +#define __LINUX_SCTP_H__ + +#include /* We need in_addr. */ +#include /* We need in6_addr. */ + + +/* Section 3.1. SCTP Common Header Format */ +typedef struct sctphdr { + __u16 source; + __u16 dest; + __u32 vtag; + __u32 checksum; +} sctp_sctphdr_t __attribute__((packed)); + +/* Section 3.2. Chunk Field Descriptions. */ +typedef struct sctp_chunkhdr { + __u8 type; + __u8 flags; + __u16 length; +} sctp_chunkhdr_t __attribute__((packed)); + + +/* Section 3.2. Chunk Type Values. + * [Chunk Type] identifies the type of information contained in the Chunk + * Value field. It takes a value from 0 to 254. The value of 255 is + * reserved for future use as an extension field. + */ +typedef enum { + SCTP_CID_DATA = 0, + SCTP_CID_INIT = 1, + SCTP_CID_INIT_ACK = 2, + SCTP_CID_SACK = 3, + SCTP_CID_HEARTBEAT = 4, + SCTP_CID_HEARTBEAT_ACK = 5, + SCTP_CID_ABORT = 6, + SCTP_CID_SHUTDOWN = 7, + SCTP_CID_SHUTDOWN_ACK = 8, + SCTP_CID_ERROR = 9, + SCTP_CID_COOKIE_ECHO = 10, + SCTP_CID_COOKIE_ACK = 11, + SCTP_CID_ECN_ECNE = 12, + SCTP_CID_ECN_CWR = 13, + SCTP_CID_SHUTDOWN_COMPLETE = 14, + + /* Use hex, as defined in ADDIP sec. 3.1 */ + SCTP_CID_ASCONF = 0xC1, + SCTP_CID_ASCONF_ACK = 0x80, +} sctp_cid_t; /* enum */ + + +/* Section 3.2 + * Chunk Types are encoded such that the highest-order two bits specify + * the action that must be taken if the processing endpoint does not + * recognize the Chunk Type. + */ +typedef enum { + SCTP_CID_ACTION_DISCARD = 0x00, + SCTP_CID_ACTION_DISCARD_ERR = 0x40, + SCTP_CID_ACTION_SKIP = 0x80, + SCTP_CID_ACTION_SKIP_ERR = 0xc0, +} sctp_cid_action_t; + +enum { SCTP_CID_ACTION_MASK = 0xc0, }; + +/* This flag is used in Chunk Flags for ABORT and SHUTDOWN COMPLETE. + * + * 3.3.7 Abort Association (ABORT) (6): + * The T bit is set to 0 if the sender had a TCB that it destroyed. + * If the sender did not have a TCB it should set this bit to 1. + */ +enum { SCTP_CHUNK_FLAG_T = 0x01 }; + +/* + * Set the T bit + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type = 14 |Reserved |T| Length = 4 | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * Chunk Flags: 8 bits + * + * Reserved: 7 bits + * Set to 0 on transmit and ignored on receipt. + * + * T bit: 1 bit + * The T bit is set to 0 if the sender had a TCB that it destroyed. If + * the sender did NOT have a TCB it should set this bit to 1. + * + * Note: Special rules apply to this chunk for verification, please + * see Section 8.5.1 for details. + */ + +#define sctp_test_T_bit(c) ((c)->chunk_hdr->flags & SCTP_CHUNK_FLAG_T) + +/* RFC 2960 + * Section 3.2.1 Optional/Variable-length Parmaeter Format. + */ + +typedef struct sctp_paramhdr { + __u16 type; + __u16 length; +} sctp_paramhdr_t __attribute((packed)); + +typedef enum { + + /* RFC 2960 Section 3.3.5 */ + SCTP_PARAM_HEARTBEAT_INFO = __constant_htons(1), + /* RFC 2960 Section 3.3.2.1 */ + SCTP_PARAM_IPV4_ADDRESS = __constant_htons(5), + SCTP_PARAM_IPV6_ADDRESS = __constant_htons(6), + SCTP_PARAM_STATE_COOKIE = __constant_htons(7), + SCTP_PARAM_UNRECOGNIZED_PARAMETERS = __constant_htons(8), + SCTP_PARAM_COOKIE_PRESERVATIVE = __constant_htons(9), + SCTP_PARAM_HOST_NAME_ADDRESS = __constant_htons(11), + SCTP_PARAM_SUPPORTED_ADDRESS_TYPES = __constant_htons(12), + SCTP_PARAM_ECN_CAPABLE = __constant_htons(0x8000), + + /* Add-IP Extension. Section 3.2 */ + SCTP_PARAM_ADD_IP = __constant_htons(0xc001), + SCTP_PARAM_DEL_IP = __constant_htons(0xc002), + SCTP_PARAM_ERR_CAUSE = __constant_htons(0xc003), + SCTP_PARAM_SET_PRIMARY = __constant_htons(0xc004), + SCTP_PARAM_SUCCESS_REPORT = __constant_htons(0xc005), + SCTP_PARAM_ADAPTION_LAYER_IND = __constant_htons(0xc006), + +} sctp_param_t; /* enum */ + + +/* RFC 2960 Section 3.2.1 + * The Parameter Types are encoded such that the highest-order two bits + * specify the action that must be taken if the processing endpoint does + * not recognize the Parameter Type. + * + */ +typedef enum { + SCTP_PARAM_ACTION_DISCARD = __constant_htons(0x0000), + SCTP_PARAM_ACTION_DISCARD_ERR = __constant_htons(0x4000), + SCTP_PARAM_ACTION_SKIP = __constant_htons(0x8000), + SCTP_PARAM_ACTION_SKIP_ERR = __constant_htons(0xc000), +} sctp_param_action_t; + +enum { SCTP_PARAM_ACTION_MASK = __constant_htons(0xc000), }; + +/* RFC 2960 Section 3.3.1 Payload Data (DATA) (0) */ + +typedef struct sctp_datahdr { + __u32 tsn; + __u16 stream; + __u16 ssn; + __u32 ppid; + __u8 payload[0]; +} sctp_datahdr_t __attribute__((packed)); + +typedef struct sctp_data_chunk { + sctp_chunkhdr_t chunk_hdr; + sctp_datahdr_t data_hdr; +} sctp_data_chunk_t __attribute__((packed)); + +/* DATA Chuck Specific Flags */ +enum { + SCTP_DATA_MIDDLE_FRAG = 0x00, + SCTP_DATA_LAST_FRAG = 0x01, + SCTP_DATA_FIRST_FRAG = 0x02, + SCTP_DATA_NOT_FRAG = 0x03, + SCTP_DATA_UNORDERED = 0x04, +}; +enum { SCTP_DATA_FRAG_MASK = 0x03, }; + + +/* RFC 2960 Section 3.3.2 Initiation (INIT) (1) + * + * This chunk is used to initiate a SCTP association between two + * endpoints. + */ +typedef struct sctp_inithdr { + __u32 init_tag; + __u32 a_rwnd; + __u16 num_outbound_streams; + __u16 num_inbound_streams; + __u32 initial_tsn; + __u8 params[0]; +} sctp_inithdr_t __attribute__((packed)); + +typedef struct sctp_init_chunk { + sctp_chunkhdr_t chunk_hdr; + sctp_inithdr_t init_hdr; +} sctp_init_chunk_t __attribute__((packed)); + + +/* Section 3.3.2.1. IPv4 Address Parameter (5) */ +typedef struct sctp_ipv4addr_param { + sctp_paramhdr_t param_hdr; + struct in_addr addr; +} sctp_ipv4addr_param_t __attribute__((packed)); + +/* Section 3.3.2.1. IPv6 Address Parameter (6) */ +typedef struct sctp_ipv6addr_param { + sctp_paramhdr_t param_hdr; + struct in6_addr addr; +} sctp_ipv6addr_param_t __attribute__((packed)); + +/* Section 3.3.2.1 Cookie Preservative (9) */ +typedef struct sctp_cookie_preserve_param { + sctp_paramhdr_t param_hdr; + uint32_t lifespan_increment; +} sctp_cookie_preserve_param_t __attribute__((packed)); + +/* Section 3.3.2.1 Host Name Address (11) */ +typedef struct sctp_hostname_param { + sctp_paramhdr_t param_hdr; + uint8_t hostname[0]; +} sctp_hostname_param_t __attribute__((packed)); + +/* Section 3.3.2.1 Supported Address Types (12) */ +typedef struct sctp_supported_addrs_param { + sctp_paramhdr_t param_hdr; + uint16_t types[0]; +} sctp_supported_addrs_param_t __attribute__((packed)); + +/* Appendix A. ECN Capable (32768) */ +typedef struct sctp_ecn_capable_param { + sctp_paramhdr_t param_hdr; +} sctp_ecn_capable_param_t __attribute__((packed)); + + + +/* RFC 2960. Section 3.3.3 Initiation Acknowledgement (INIT ACK) (2): + * The INIT ACK chunk is used to acknowledge the initiation of an SCTP + * association. + */ +typedef sctp_init_chunk_t sctp_initack_chunk_t; + +/* Section 3.3.3.1 State Cookie (7) */ +typedef struct sctp_cookie_param { + sctp_paramhdr_t p; + __u8 body[0]; +} sctp_cookie_param_t __attribute__((packed)); + +/* Section 3.3.3.1 Unrecognized Parameters (8) */ +typedef struct sctp_unrecognized_param { + sctp_paramhdr_t param_hdr; + sctp_paramhdr_t unrecognized; +} sctp_unrecognized_param_t __attribute__((packed)); + + + +/* + * 3.3.4 Selective Acknowledgement (SACK) (3): + * + * This chunk is sent to the peer endpoint to acknowledge received DATA + * chunks and to inform the peer endpoint of gaps in the received + * subsequences of DATA chunks as represented by their TSNs. + */ + +typedef struct sctp_gap_ack_block { + __u16 start; + __u16 end; +} sctp_gap_ack_block_t __attribute__((packed)); + +typedef uint32_t sctp_dup_tsn_t; + +typedef union { + sctp_gap_ack_block_t gab; + sctp_dup_tsn_t dup; +} sctp_sack_variable_t; + +typedef struct sctp_sackhdr { + __u32 cum_tsn_ack; + __u32 a_rwnd; + __u16 num_gap_ack_blocks; + __u16 num_dup_tsns; + sctp_sack_variable_t variable[0]; +} sctp_sackhdr_t __attribute__((packed)); + +typedef struct sctp_sack_chunk { + sctp_chunkhdr_t chunk_hdr; + sctp_sackhdr_t sack_hdr; +} sctp_sack_chunk_t __attribute__((packed)); + + +/* RFC 2960. Section 3.3.5 Heartbeat Request (HEARTBEAT) (4): + * + * An endpoint should send this chunk to its peer endpoint to probe the + * reachability of a particular destination transport address defined in + * the present association. + */ + +typedef struct sctp_heartbeathdr { + sctp_paramhdr_t info; +} sctp_heartbeathdr_t __attribute__((packed)); + +typedef struct sctp_heartbeat_chunk { + sctp_chunkhdr_t chunk_hdr; + sctp_heartbeathdr_t hb_hdr; +} sctp_heartbeat_chunk_t __attribute__((packed)); + + +/* For the abort and shutdown ACK we must carry the init tag in the + * common header. Just the common header is all that is needed with a + * chunk descriptor. + */ +typedef struct sctp_abort_chunk { + sctp_chunkhdr_t uh; +} sctp_abort_chunkt_t __attribute__((packed)); + + +/* For the graceful shutdown we must carry the tag (in common header) + * and the highest consecutive acking value. + */ +typedef struct sctp_shutdownhdr { + __u32 cum_tsn_ack; +} sctp_shutdownhdr_t __attribute__((packed)); + +struct sctp_shutdown_chunk_t { + sctp_chunkhdr_t chunk_hdr; + sctp_shutdownhdr_t shutdown_hdr; +} __attribute__((packed)); + + + +/* RFC 2960. Section 3.3.10 Operation Error (ERROR) (9) */ + +typedef struct sctp_errhdr { + __u16 cause; + __u16 length; + __u8 variable[0]; +} sctp_errhdr_t __attribute__((packed)); + +typedef struct sctp_operr_chunk { + sctp_chunkhdr_t chunk_hdr; + sctp_errhdr_t err_hdr; +} sctp_operr_chunk_t __attribute__((packed)); + +/* RFC 2960 3.3.10 - Operation Error + * + * Cause Code: 16 bits (unsigned integer) + * + * Defines the type of error conditions being reported. + * Cause Code + * Value Cause Code + * --------- ---------------- + * 1 Invalid Stream Identifier + * 2 Missing Mandatory Parameter + * 3 Stale Cookie Error + * 4 Out of Resource + * 5 Unresolvable Address + * 6 Unrecognized Chunk Type + * 7 Invalid Mandatory Parameter + * 8 Unrecognized Parameters + * 9 No User Data + * 10 Cookie Received While Shutting Down + */ +typedef enum { + + SCTP_ERROR_NO_ERROR = __constant_htons(0x00), + SCTP_ERROR_INV_STRM = __constant_htons(0x01), + SCTP_ERROR_MISS_PARAM = __constant_htons(0x02), + SCTP_ERROR_STALE_COOKIE = __constant_htons(0x03), + SCTP_ERROR_NO_RESOURCE = __constant_htons(0x04), + SCTP_ERROR_DNS_FAILED = __constant_htons(0x05), + SCTP_ERROR_UNKNOWN_CHUNK = __constant_htons(0x06), + SCTP_ERROR_INV_PARAM = __constant_htons(0x07), + SCTP_ERROR_UNKNOWN_PARAM = __constant_htons(0x08), + SCTP_ERROR_NO_DATA = __constant_htons(0x09), + SCTP_ERROR_COOKIE_IN_SHUTDOWN = __constant_htons(0x0a), + + + /* SCTP Implementation Guide: + * 11 Restart of an association with new addresses + * 12 User Initiated Abort + * 13 Protocol Violation + */ + + SCTP_ERROR_RESTART = __constant_htons(0x0b), + SCTP_ERROR_USER_ABORT = __constant_htons(0x0c), + SCTP_ERROR_PROTO_VIOLATION = __constant_htons(0x0d), + + /* ADDIP Section 3.3 New Error Causes + * + * Four new Error Causes are added to the SCTP Operational Errors, + * primarily for use in the ASCONF-ACK chunk. + * + * Value Cause Code + * --------- ---------------- + * 0x0100 Request to Delete Last Remaining IP Address. + * 0x0101 Operation Refused Due to Resource Shortage. + * 0x0102 Request to Delete Source IP Address. + * 0x0103 Association Aborted due to illegal ASCONF-ACK + */ + SCTP_ERROR_DEL_LAST_IP = __constant_htons(0x0100), + SCTP_ERROR_RSRC_LOW = __constant_htons(0x0101), + SCTP_ERROR_DEL_SRC_IP = __constant_htons(0x0102), + SCTP_ERROR_ASCONF_ACK = __constant_htons(0x0103), + +} sctp_error_t; + + + +/* RFC 2960. Appendix A. Explicit Congestion Notification. + * Explicit Congestion Notification Echo (ECNE) (12) + */ +typedef struct sctp_ecnehdr { + __u32 lowest_tsn; +} sctp_ecnehdr_t; + +typedef struct sctp_ecne_chunk { + sctp_chunkhdr_t chunk_hdr; + sctp_ecnehdr_t ence_hdr; +} sctp_ecne_chunk_t __attribute__((packed)); + +/* RFC 2960. Appendix A. Explicit Congestion Notification. + * Congestion Window Reduced (CWR) (13) + */ +typedef struct sctp_cwrhdr { + __u32 lowest_tsn; +} sctp_cwrhdr_t; + +typedef struct sctp_cwr_chunk { + sctp_chunkhdr_t chunk_hdr; + sctp_cwrhdr_t cwr_hdr; +} sctp_cwr_chunk_t __attribute__((packed)); + + +/* FIXME: Cleanup needs to continue below this line. */ + +/* + * ADDIP Section 3.1 New Chunk Types + */ + + +/* ADDIP Section 3.1.1 + * + * ASCONF-Request Correlation ID: 32 bits (unsigned integer) + * + * This is an opaque integer assigned by the sender to identify each + * request parameter. It is in host byte order and is only meaningful + * to the sender. The receiver of the ASCONF Chunk will copy this 32 + * bit value into the ASCONF Correlation ID field of the + * ASCONF-ACK. The sender of the ASCONF can use this same value in the + * ASCONF-ACK to find which request the response is for. + * + * ASCONF Parameter: TLV format + * + * Each Address configuration change is represented by a TLV parameter + * as defined in Section 3.2. One or more requests may be present in + * an ASCONF Chunk. + */ +typedef struct { + __u32 correlation; + sctp_paramhdr_t p; + __u8 payload[0]; +} sctpAsconfReq_t; + +/* ADDIP + * 3.1.1 Address/Stream Configuration Change Chunk (ASCONF) + * + * This chunk is used to communicate to the remote endpoint one of the + * configuration change requests that MUST be acknowledged. The + * information carried in the ASCONF Chunk uses the form of a + * Tag-Length-Value (TLV), as described in "3.2.1 + * Optional/Variable-length Parameter Format" in [RFC2960], for all + * variable parameters. + */ +typedef struct { + __u32 serial; + __u8 reserved[3]; + __u8 addr_type; + __u32 addr[4]; + sctpAsconfReq_t requests[0]; +} sctpAsconf_t; + +/* ADDIP + * 3.1.2 Address/Stream Configuration Acknowledgment Chunk (ASCONF-ACK) + * + * ASCONF-Request Correlation ID: 32 bits (unsigned integer) + * + * This value is copied from the ASCONF Correlation ID received in the + * ASCONF Chunk. It is used by the receiver of the ASCONF-ACK to identify + * which ASCONF parameter this response is associated with. + * + * ASCONF Parameter Response : TLV format + * + * The ASCONF Parameter Response is used in the ASCONF-ACK to report + * status of ASCONF processing. By default, if a responding endpoint + * does not include any Error Cause, a success is indicated. Thus a + * sender of an ASCONF-ACK MAY indicate complete success of all TLVs in + * an ASCONF by returning only the Chunk Type, Chunk Flags, Chunk Length + * (set to 8) and the Serial Number. + */ +typedef union { + struct { + __u32 correlation; + sctp_paramhdr_t header; /* success report */ + } success; + struct { + __u32 correlation; + sctp_paramhdr_t header; /* error cause indication */ + sctp_paramhdr_t errcause; + uint8_t request[0]; /* original request from ASCONF */ + } error; +#define __correlation success.correlation +#define __header success.header +#define __cause error.errcause +#define __request error.request +} sctpAsconfAckRsp_t; + +/* ADDIP + * 3.1.2 Address/Stream Configuration Acknowledgment Chunk (ASCONF-ACK) + * + * This chunk is used by the receiver of an ASCONF Chunk to + * acknowledge the reception. It carries zero or more results for any + * ASCONF Parameters that were processed by the receiver. + */ +typedef struct { + __u32 serial; + sctpAsconfAckRsp_t responses[0]; +} sctpAsconfAck_t; + +/********************************************************************* + * Internal structures + * + * These are data structures which never go out on the wire. + *********************************************************************/ + +/* What is this data structure for? The TLV isn't one--it is just a + * value. Perhaps this data structure ought to have a type--otherwise + * it is not unambigiously parseable. --piggy + */ +typedef struct { + struct list_head hook; + int length; /* length of the TLV */ + + /* the actually TLV to be copied into ASCONF_ACK */ + sctpAsconfAckRsp_t TLV; +} sctpAsconfAckRspNode_t; + +#endif /* __LINUX_SCTP_H__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/seq_file.h linux-2.4.23-pre8/include/linux/seq_file.h --- linux-2.4.22/include/linux/seq_file.h 2002-08-03 00:39:45.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/seq_file.h 2003-10-22 22:49:52.000000000 +0000 @@ -2,7 +2,15 @@ #define _LINUX_SEQ_FILE_H #ifdef __KERNEL__ +#include +#include +#include + struct seq_operations; +struct file; +struct vfsmount; +struct dentry; +struct inode; struct seq_file { char *buf; @@ -52,5 +60,10 @@ int seq_printf(struct seq_file *, const char *, ...) __attribute__ ((format (printf,2,3))); +int seq_path(struct seq_file *, struct vfsmount *, struct dentry *, char *); + +int single_open(struct file *, int (*)(struct seq_file *, void *), void *); +int single_release(struct inode *, struct file *); +int seq_release_private(struct inode *, struct file *); #endif #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/sisfb.h linux-2.4.23-pre8/include/linux/sisfb.h --- linux-2.4.22/include/linux/sisfb.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/sisfb.h 2003-10-22 22:47:54.000000000 +0000 @@ -39,9 +39,9 @@ #define VB_CHRONTEL 0x02000000 #define VB_301LV 0x04000000 #define VB_302LV 0x08000000 -#define VB_TRUMPION 0x10000000 -#define VB_VIDEOBRIDGE (VB_301|VB_301B|VB_302B|VB_301LV|VB_302LV| \ - VB_LVDS|VB_CHRONTEL|VB_TRUMPION) +#define VB_301C 0x10000000 +#define VB_VIDEOBRIDGE (VB_301|VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV| \ + VB_LVDS|VB_CHRONTEL) #define VB_SISBRIDGE (VB_301|VB_301B|VB_302B|VB_301LV|VB_302LV) #define VB_SINGLE_MODE 0x20000000 /* CRT1 or CRT2; determined by VB_DISPTYPE_CRTx */ #define VB_DISPMODE_SINGLE VB_SINGLE_MODE @@ -88,6 +88,7 @@ SIS_740, SIS_330, SIS_660, + SIS_760, MAX_SIS_CHIP } SIS_CHIP_TYPE; @@ -243,7 +244,10 @@ unsigned long sisfb_vbflags; unsigned long sisfb_currentvbflags; - char reserved[227]; /* for future use */ + int sisfb_scalelcd; + unsigned long sisfb_specialtiming; + + char reserved[219]; /* for future use */ }; #ifdef __KERNEL__ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/socket.h linux-2.4.23-pre8/include/linux/socket.h --- linux-2.4.22/include/linux/socket.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/socket.h 2003-10-22 22:49:16.000000000 +0000 @@ -1,6 +1,21 @@ #ifndef _LINUX_SOCKET_H #define _LINUX_SOCKET_H +/* + * Desired design of maximum size and alignment (see RFC2553) + */ +#define _K_SS_MAXSIZE 128 /* Implementation specific max size */ +#define _K_SS_ALIGNSIZE (__alignof__ (struct sockaddr *)) + /* Implementation specific desired alignment */ + +struct __kernel_sockaddr_storage { + unsigned short ss_family; /* address family */ + /* Following field(s) are implementation specific */ + char __data[_K_SS_MAXSIZE - sizeof(unsigned short)]; + /* space to achieve desired size, */ + /* _SS_MAXSIZE value minus size of ss_family */ +} __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */ + #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) #include /* arch-dependent defines */ @@ -24,20 +39,7 @@ int l_linger; /* How long to linger for */ }; -/* - * Desired design of maximum size and alignment (see RFC2553) - */ -#define _SS_MAXSIZE 128 /* Implementation specific max size */ -#define _SS_ALIGNSIZE (__alignof__ (struct sockaddr *)) - /* Implementation specific desired alignment */ - -struct sockaddr_storage { - sa_family_t ss_family; /* address family */ - /* Following field(s) are implementation specific */ - char __data[_SS_MAXSIZE - sizeof(sa_family_t)]; - /* space to achieve desired size, */ - /* _SS_MAXSIZE value minus size of ss_family */ -} __attribute__ ((aligned(_SS_ALIGNSIZE))); /* force desired alignment */ +#define sockaddr_storage __kernel_sockaddr_storage /* * As we do 4.4BSD message passing we use a 4.4BSD message passing @@ -242,6 +244,7 @@ #define SOL_UDP 17 #define SOL_IPV6 41 #define SOL_ICMPV6 58 +#define SOL_SCTP 132 #define SOL_RAW 255 #define SOL_IPX 256 #define SOL_AX25 257 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/sonypi.h linux-2.4.23-pre8/include/linux/sonypi.h --- linux-2.4.22/include/linux/sonypi.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/sonypi.h 2003-10-22 22:48:31.000000000 +0000 @@ -94,6 +94,8 @@ #define SONYPI_EVENT_MEMORYSTICK_INSERT 54 #define SONYPI_EVENT_MEMORYSTICK_EJECT 55 #define SONYPI_EVENT_ANYBUTTON_RELEASED 56 +#define SONYPI_EVENT_BATTERY_INSERT 57 +#define SONYPI_EVENT_BATTERY_REMOVE 58 /* get/set brightness */ #define SONYPI_IOCGBRT _IOR('v', 0, __u8) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/sunrpc/svc.h linux-2.4.23-pre8/include/linux/sunrpc/svc.h --- linux-2.4.22/include/linux/sunrpc/svc.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/sunrpc/svc.h 2003-10-22 22:49:00.000000000 +0000 @@ -112,6 +112,8 @@ rq_secure : 1, /* secure port */ rq_auth : 1; /* check client */ + __u32 rq_daddr; /* dest addr of request - reply from here */ + void * rq_argp; /* decoded arguments */ void * rq_resp; /* xdr'd results */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/sunrpc/timer.h linux-2.4.23-pre8/include/linux/sunrpc/timer.h --- linux-2.4.22/include/linux/sunrpc/timer.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/sunrpc/timer.h 2003-10-22 22:49:11.000000000 +0000 @@ -15,7 +15,7 @@ long timeo; /* default timeout value */ long srtt[5]; /* smoothed round trip time << 3 */ long sdrtt[5]; /* soothed medium deviation of RTT */ - atomic_t ntimeouts; /* Global count of the number of timeouts */ + int ntimeouts[5]; /* Number of timeouts for the last request */ }; @@ -23,19 +23,27 @@ extern void rpc_update_rtt(struct rpc_rtt *rt, int timer, long m); extern long rpc_calc_rto(struct rpc_rtt *rt, int timer); -static inline void rpc_inc_timeo(struct rpc_rtt *rt) +static inline void rpc_set_timeo(struct rpc_rtt *rt, int timer, int ntimeo) { - atomic_inc(&rt->ntimeouts); + int *t; + if (!timer) + return; + t = &rt->ntimeouts[timer-1]; + if (ntimeo < *t) { + if (*t > 0) + (*t)--; + } else { + if (ntimeo > 8) + ntimeo = 8; + *t = ntimeo; + } } -static inline void rpc_clear_timeo(struct rpc_rtt *rt) +static inline int rpc_ntimeo(struct rpc_rtt *rt, int timer) { - atomic_set(&rt->ntimeouts, 0); -} - -static inline int rpc_ntimeo(struct rpc_rtt *rt) -{ - return atomic_read(&rt->ntimeouts); + if (!timer) + return 0; + return rt->ntimeouts[timer-1]; } #endif /* _LINUX_SUNRPC_TIMER_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/sunrpc/xprt.h linux-2.4.23-pre8/include/linux/sunrpc/xprt.h --- linux-2.4.22/include/linux/sunrpc/xprt.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/sunrpc/xprt.h 2003-10-22 22:49:14.000000000 +0000 @@ -115,7 +115,7 @@ long rq_xtime; /* when transmitted */ int rq_ntimeo; - int rq_nresend; + int rq_ntrans; }; #define rq_svec rq_snd_buf.head #define rq_slen rq_snd_buf.len diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/swap.h linux-2.4.23-pre8/include/linux/swap.h --- linux-2.4.22/include/linux/swap.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/swap.h 2003-10-22 22:47:32.000000000 +0000 @@ -87,7 +87,7 @@ extern unsigned int nr_free_buffer_pages(void); extern int nr_active_pages; extern int nr_inactive_pages; -extern atomic_t page_cache_size; +extern unsigned long page_cache_size; extern atomic_t buffermem_pages; extern spinlock_cacheline_t pagecache_lock_cacheline; @@ -115,6 +115,7 @@ extern wait_queue_head_t kswapd_wait; extern int FASTCALL(try_to_free_pages_zone(zone_t *, unsigned int)); extern int FASTCALL(try_to_free_pages(unsigned int)); +extern int vm_vfs_scan_ratio, vm_cache_scan_ratio, vm_lru_balance_ratio, vm_passes, vm_gfp_debug, vm_mapped_ratio; /* linux/mm/page_io.c */ extern void rw_swap_page(int, struct page *); @@ -175,34 +176,46 @@ BUG(); \ } while (0) +extern void delta_nr_active_pages(struct page *page, long delta); +#define inc_nr_active_pages(page) delta_nr_active_pages(page, 1) +#define dec_nr_active_pages(page) delta_nr_active_pages(page, -1) + +extern void delta_nr_inactive_pages(struct page *page, long delta); +#define inc_nr_inactive_pages(page) delta_nr_inactive_pages(page, 1) +#define dec_nr_inactive_pages(page) delta_nr_inactive_pages(page, -1) + #define add_page_to_active_list(page) \ do { \ DEBUG_LRU_PAGE(page); \ SetPageActive(page); \ list_add(&(page)->lru, &active_list); \ - nr_active_pages++; \ + inc_nr_active_pages(page); \ } while (0) #define add_page_to_inactive_list(page) \ do { \ DEBUG_LRU_PAGE(page); \ list_add(&(page)->lru, &inactive_list); \ - nr_inactive_pages++; \ + inc_nr_inactive_pages(page); \ } while (0) #define del_page_from_active_list(page) \ do { \ list_del(&(page)->lru); \ ClearPageActive(page); \ - nr_active_pages--; \ + dec_nr_active_pages(page); \ } while (0) #define del_page_from_inactive_list(page) \ do { \ list_del(&(page)->lru); \ - nr_inactive_pages--; \ + dec_nr_inactive_pages(page); \ } while (0) +extern void delta_nr_cache_pages(struct page *page, long delta); +#define inc_nr_cache_pages(page) delta_nr_cache_pages(page, 1) +#define dec_nr_cache_pages(page) delta_nr_cache_pages(page, -1) + extern spinlock_t swaplock; #define swap_list_lock() spin_lock(&swaplock) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/sysctl.h linux-2.4.23-pre8/include/linux/sysctl.h --- linux-2.4.22/include/linux/sysctl.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/sysctl.h 2003-10-22 22:47:29.000000000 +0000 @@ -127,6 +127,7 @@ KERN_CORE_PATTERN=56, /* string: pattern for core-files */ KERN_PPC_L3CR=57, /* l3cr register on PPC */ KERN_EXCEPTION_TRACE=58, /* boolean: exception trace */ + KERN_CORE_SETUID=59, /* int: set to allow core dumps of setuid apps */ }; @@ -146,6 +147,15 @@ VM_MAX_MAP_COUNT=11, /* int: Maximum number of active map areas */ VM_MIN_READAHEAD=12, /* Min file readahead */ VM_MAX_READAHEAD=13, /* Max file readahead */ + VM_VFS_SCAN_RATIO=14, /* part of the inactive vfs lists to scan */ + VM_LRU_BALANCE_RATIO=15,/* balance active and inactive caches */ + VM_PASSES=16, /* number of vm passes before failing */ + VM_PAGEBUF=17, /* struct: Control pagebuf parameters */ + VM_GFP_DEBUG=18, /* debug GFP failures */ + VM_CACHE_SCAN_RATIO=19, /* part of the inactive cache list to scan */ + VM_MAPPED_RATIO=20, /* amount of unfreeable pages that triggers swapout */ + VM_LAPTOP_MODE=21, /* kernel in laptop flush mode */ + VM_BLOCK_DUMP=22, /* dump fs activity to log */ }; @@ -168,7 +178,8 @@ NET_TR=14, NET_DECNET=15, NET_ECONET=16, - NET_KHTTPD=17 + NET_KHTTPD=17, + NET_SCTP=18 }; /* /proc/sys/kernel/random */ @@ -236,6 +247,7 @@ NET_IPV4_NEIGH=17, NET_IPV4_ROUTE=18, NET_IPV4_FIB_HASH=19, + NET_IPV4_NETFILTER=20, NET_IPV4_TCP_TIMESTAMPS=33, NET_IPV4_TCP_WINDOW_SCALING=34, @@ -348,6 +360,24 @@ NET_IPV4_CONF_MEDIUM_ID=14, }; +/* /proc/sys/net/ipv4/netfilter */ +enum +{ + NET_IPV4_NF_CONNTRACK_MAX=1, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT=2, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV=3, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED=4, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT=5, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT=6, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK=7, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT=8, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE=9, + NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT=10, + NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT_STREAM=11, + NET_IPV4_NF_CONNTRACK_ICMP_TIMEOUT=12, + NET_IPV4_NF_CONNTRACK_GENERIC_TIMEOUT=13, +}; + /* /proc/sys/net/ipv6 */ enum { NET_IPV6_CONF=16, @@ -501,6 +531,21 @@ NET_DECNET_DEBUG_LEVEL = 255 }; +/* /proc/sys/net/sctp */ +enum { + NET_SCTP_RTO_INITIAL = 1, + NET_SCTP_RTO_MIN = 2, + NET_SCTP_RTO_MAX = 3, + NET_SCTP_RTO_ALPHA = 4, + NET_SCTP_RTO_BETA = 5, + NET_SCTP_VALID_COOKIE_LIFE = 6, + NET_SCTP_ASSOCIATION_MAX_RETRANS = 7, + NET_SCTP_PATH_MAX_RETRANS = 8, + NET_SCTP_MAX_INIT_RETRANSMITS = 9, + NET_SCTP_HB_INTERVAL = 10, + NET_SCTP_PRESERVE_ENABLE = 11, + NET_SCTP_MAX_BURST = 12, +}; /* /proc/sys/net/khttpd/ */ enum { NET_KHTTPD_DOCROOT = 1, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/threads.h linux-2.4.23-pre8/include/linux/threads.h --- linux-2.4.22/include/linux/threads.h 2002-02-25 19:38:13.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/threads.h 2003-10-22 22:47:32.000000000 +0000 @@ -9,9 +9,9 @@ */ #ifdef CONFIG_SMP -#define NR_CPUS 32 /* Max processors that can be running in SMP */ +#define NR_CPUS CONFIG_NR_CPUS #else -#define NR_CPUS 1 +#define NR_CPUS 1 #endif #define MIN_THREADS_LEFT_FOR_ROOT 4 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/usb.h linux-2.4.23-pre8/include/linux/usb.h --- linux-2.4.22/include/linux/usb.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/usb.h 2003-10-22 22:48:40.000000000 +0000 @@ -865,6 +865,7 @@ struct usb_device *children[USB_MAXCHILDREN]; }; +extern int usb_ifnum_to_ifpos(struct usb_device *dev, unsigned ifnum); extern struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum); extern struct usb_endpoint_descriptor *usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum); @@ -873,6 +874,7 @@ extern void usb_scan_devices(void); /* used these for multi-interface device registration */ +extern int usb_find_interface_driver_for_ifnum(struct usb_device *dev, unsigned int ifnum); extern void usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void* priv); extern int usb_interface_claimed(struct usb_interface *iface); extern void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/usb_ch9.h linux-2.4.23-pre8/include/linux/usb_ch9.h --- linux-2.4.22/include/linux/usb_ch9.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/usb_ch9.h 2003-10-22 22:48:39.000000000 +0000 @@ -0,0 +1,315 @@ +/* + * This file holds USB constants and structures that are needed for USB + * device APIs. These are used by the USB device model, which is defined + * in chapter 9 of the USB 2.0 specification. Linux has several APIs in C + * that need these: + * + * - the master/host side Linux-USB kernel driver API; + * - the "usbfs" user space API; and + * - (eventually) a Linux "gadget" slave/device side driver API. + * + * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems + * act either as a USB master/host or as a USB slave/device. That means + * the master and slave side APIs will benefit from working well together. + */ + +#ifndef __LINUX_USB_CH9_H +#define __LINUX_USB_CH9_H + +#include /* __u8 etc */ + +/*-------------------------------------------------------------------------*/ + +/* CONTROL REQUEST SUPPORT */ + +/* + * USB directions + * + * This bit flag is used in endpoint descriptors' bEndpointAddress field. + * It's also one of three fields in control requests bRequestType. + */ +#define USB_DIR_OUT 0 /* to device */ +#define USB_DIR_IN 0x80 /* to host */ + +/* + * USB types, the second of three bRequestType fields + */ +#define USB_TYPE_MASK (0x03 << 5) +#define USB_TYPE_STANDARD (0x00 << 5) +#define USB_TYPE_CLASS (0x01 << 5) +#define USB_TYPE_VENDOR (0x02 << 5) +#define USB_TYPE_RESERVED (0x03 << 5) + +/* + * USB recipients, the third of three bRequestType fields + */ +#define USB_RECIP_MASK 0x1f +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 + +/* + * Standard requests, for the bRequest field of a SETUP packet. + * + * These are qualified by the bRequestType field, so that for example + * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved + * by a GET_STATUS request. + */ +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + + +/** + * struct usb_ctrlrequest - SETUP data for a USB device control request + * @bRequestType: matches the USB bmRequestType field + * @bRequest: matches the USB bRequest field + * @wValue: matches the USB wValue field (le16 byte order) + * @wIndex: matches the USB wIndex field (le16 byte order) + * @wLength: matches the USB wLength field (le16 byte order) + * + * This structure is used to send control requests to a USB device. It matches + * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the + * USB spec for a fuller description of the different fields, and what they are + * used for. + * + * Note that the driver for any interface can issue control requests. + * For most devices, interfaces don't coordinate with each other, so + * such requests may be made at any time. + */ +struct usb_ctrlrequest { + __u8 bRequestType; + __u8 bRequest; + __u16 wValue; + __u16 wIndex; + __u16 wLength; +} __attribute__ ((packed)); + +/*-------------------------------------------------------------------------*/ + +/* + * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or + * (rarely) accepted by SET_DESCRIPTOR. + * + * Note that all multi-byte values here are encoded in little endian + * byte order "on the wire". But when exposed through Linux-USB APIs, + * they've been converted to cpu byte order. + */ + +/* + * Descriptor types ... USB 2.0 spec table 9.5 + */ +#define USB_DT_DEVICE 0x01 +#define USB_DT_CONFIG 0x02 +#define USB_DT_STRING 0x03 +#define USB_DT_INTERFACE 0x04 +#define USB_DT_ENDPOINT 0x05 +#define USB_DT_DEVICE_QUALIFIER 0x06 +#define USB_DT_OTHER_SPEED_CONFIG 0x07 +#define USB_DT_INTERFACE_POWER 0x08 + +/* All standard descriptors have these 2 fields at the beginning */ +struct usb_descriptor_header { + __u8 bLength; + __u8 bDescriptorType; +} __attribute__ ((packed)); + + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_DEVICE: Device descriptor */ +struct usb_device_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __u16 idVendor; + __u16 idProduct; + __u16 bcdDevice; + __u8 iManufacturer; + __u8 iProduct; + __u8 iSerialNumber; + __u8 bNumConfigurations; +} __attribute__ ((packed)); + +#define USB_DT_DEVICE_SIZE 18 + + +/* + * Device and/or Interface Class codes + * as found in bDeviceClass or bInterfaceClass + * and defined by www.usb.org documents + */ +#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ +#define USB_CLASS_AUDIO 1 +#define USB_CLASS_COMM 2 +#define USB_CLASS_HID 3 +#define USB_CLASS_PHYSICAL 5 +#define USB_CLASS_STILL_IMAGE 6 +#define USB_CLASS_PRINTER 7 +#define USB_CLASS_MASS_STORAGE 8 +#define USB_CLASS_HUB 9 +#define USB_CLASS_CDC_DATA 0x0a +#define USB_CLASS_CSCID 0x0b /* chip+ smart card */ +#define USB_CLASS_CONTENT_SEC 0x0d /* content security */ +#define USB_CLASS_APP_SPEC 0xfe +#define USB_CLASS_VENDOR_SPEC 0xff + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_CONFIG: Configuration descriptor information. + * + * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the + * descriptor type is different. Highspeed-capable devices can look + * different depending on what speed they're currently running. Only + * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG + * descriptors. + */ +struct usb_config_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u16 wTotalLength; + __u8 bNumInterfaces; + __u8 bConfigurationValue; + __u8 iConfiguration; + __u8 bmAttributes; + __u8 bMaxPower; +} __attribute__ ((packed)); + +#define USB_DT_CONFIG_SIZE 9 + +/* from config descriptor bmAttributes */ +#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ +#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ +#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_STRING: String descriptor */ +struct usb_string_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u16 wData[1]; /* UTF-16LE encoded */ +} __attribute__ ((packed)); + +/* note that "string" zero is special, it holds language codes that + * the device supports, not Unicode characters. + */ + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_INTERFACE: Interface descriptor */ +struct usb_interface_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u8 bInterfaceNumber; + __u8 bAlternateSetting; + __u8 bNumEndpoints; + __u8 bInterfaceClass; + __u8 bInterfaceSubClass; + __u8 bInterfaceProtocol; + __u8 iInterface; +} __attribute__ ((packed)); + +#define USB_DT_INTERFACE_SIZE 9 + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_ENDPOINT: Endpoint descriptor */ +struct usb_endpoint_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u8 bEndpointAddress; + __u8 bmAttributes; + __u16 wMaxPacketSize; + __u8 bInterval; + + // NOTE: these two are _only_ in audio endpoints. + // use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. + __u8 bRefresh; + __u8 bSynchAddress; +} __attribute__ ((packed)); + +#define USB_DT_ENDPOINT_SIZE 7 +#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ + + +/* + * Endpoints + */ +#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ +#define USB_ENDPOINT_DIR_MASK 0x80 + +#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ +#define USB_ENDPOINT_XFER_CONTROL 0 +#define USB_ENDPOINT_XFER_ISOC 1 +#define USB_ENDPOINT_XFER_BULK 2 +#define USB_ENDPOINT_XFER_INT 3 + + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ +struct usb_qualifier_descriptor { + __u8 bLength; + __u8 bDescriptorType; + + __u16 bcdUSB; + __u8 bDeviceClass; + __u8 bDeviceSubClass; + __u8 bDeviceProtocol; + __u8 bMaxPacketSize0; + __u8 bNumConfigurations; + __u8 bRESERVED; +} __attribute__ ((packed)); + + +/*-------------------------------------------------------------------------*/ + +/* USB 2.0 defines three speeds, here's how Linux identifies them */ + +enum usb_device_speed { + USB_SPEED_UNKNOWN = 0, /* enumerating */ + USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ + USB_SPEED_HIGH /* usb 2.0 */ +}; + +enum usb_device_state { + /* NOTATTACHED isn't in the USB spec, and this state acts + * the same as ATTACHED ... but it's clearer this way. + */ + USB_STATE_NOTATTACHED = 0, + + /* the chapter 9 device states */ + USB_STATE_ATTACHED, + USB_STATE_POWERED, + USB_STATE_DEFAULT, /* limited function */ + USB_STATE_ADDRESS, + USB_STATE_CONFIGURED, /* most functions */ + + USB_STATE_SUSPENDED + + /* NOTE: there are actually four different SUSPENDED + * states, returning to POWERED, DEFAULT, ADDRESS, or + * CONFIGURED respectively when SOF tokens flow again. + */ +}; + +#endif /* __LINUX_USB_CH9_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/usb_gadget.h linux-2.4.23-pre8/include/linux/usb_gadget.h --- linux-2.4.22/include/linux/usb_gadget.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/usb_gadget.h 2003-10-22 22:48:12.000000000 +0000 @@ -0,0 +1,719 @@ +/* + * + * + * We call the USB code inside a Linux-based peripheral device a "gadget" + * driver, except for the hardware-specific bus glue. One USB host can + * master many USB gadgets, but the gadgets are only slaved to one host. + * + * + * (c) Copyright 2002-2003 by David Brownell + * All Rights Reserved. + * + * This software is licensed under the GNU GPL version 2. + */ + +#ifndef __LINUX_USB_GADGET_H +#define __LINUX_USB_GADGET_H + +#ifdef __KERNEL__ + +struct usb_ep; + +/** + * struct usb_request - describes one i/o request + * @buf: Buffer used for data. Always provide this; some controllers + * only use PIO, or don't use DMA for some endpoints. + * @dma: DMA address corresponding to 'buf'. If you don't set this + * field, and the usb controller needs one, it is responsible + * for mapping and unmapping the buffer. + * @length: Length of that data + * @no_interrupt: If true, hints that no completion irq is needed. + * Helpful sometimes with deep request queues. + * @zero: If true, when writing data, makes the last packet be "short" + * by adding a zero length packet as needed; + * @short_not_ok: When reading data, makes short packets be + * treated as errors (queue stops advancing till cleanup). + * @complete: Function called when request completes + * @context: For use by the completion callback + * @list: For use by the gadget driver. + * @status: Reports completion code, zero or a negative errno. + * Normally, faults block the transfer queue from advancing until + * the completion callback returns. + * Code "-ESHUTDOWN" indicates completion caused by device disconnect, + * or when the driver disabled the endpoint. + * @actual: Reports actual bytes transferred. For reads (OUT + * transfers) this may be less than the requested length. If the + * short_not_ok flag is set, short reads are treated as errors + * even when status otherwise indicates successful completion. + * Note that for writes (IN transfers) the data bytes may still + * reside in a device-side FIFO. + * + * These are allocated/freed through the endpoint they're used with. The + * hardware's driver can add extra per-request data to the memory it returns, + * which often avoids separate memory allocations (potential failures), + * later when the request is queued. + * + * Request flags affect request handling, such as whether a zero length + * packet is written (the "zero" flag), whether a short read should be + * treated as an error (blocking request queue advance, the "short_not_ok" + * flag), or hinting that an interrupt is not required (the "no_interrupt" + * flag, for use with deep request queues). + * + * Bulk endpoints can use any size buffers, and can also be used for interrupt + * transfers. interrupt-only endpoints can be much less functional. + */ + // NOTE this is analagous to 'struct urb' on the host side, + // except that it's thinner and promotes more pre-allocation. + // + // ISSUE should this be allocated through the device? + +struct usb_request { + void *buf; + unsigned length; + dma_addr_t dma; + + unsigned no_interrupt : 1, + zero : 1, + short_not_ok : 1; + + void (*complete)(struct usb_ep *ep, + struct usb_request *req); + void *context; + struct list_head list; + + int status; + unsigned actual; +}; + +/*-------------------------------------------------------------------------*/ + +/* endpoint-specific parts of the api to the usb controller hardware. + * unlike the urb model, (de)multiplexing layers are not required. + * (so this api could slash overhead if used on the host side...) + * + * note that device side usb controllers commonly differ in how many + * endpoints they support, as well as their capabilities. + */ +struct usb_ep_ops { + int (*enable) (struct usb_ep *ep, + const struct usb_endpoint_descriptor *desc); + int (*disable) (struct usb_ep *ep); + + struct usb_request *(*alloc_request) (struct usb_ep *ep, + int gfp_flags); + void (*free_request) (struct usb_ep *ep, struct usb_request *req); + + void *(*alloc_buffer) (struct usb_ep *ep, unsigned bytes, + dma_addr_t *dma, int gfp_flags); + void (*free_buffer) (struct usb_ep *ep, void *buf, dma_addr_t dma, + unsigned bytes); + // NOTE: on 2.5, drivers may also use dma_map() and + // dma_sync_single() to manage dma overhead. + + int (*queue) (struct usb_ep *ep, struct usb_request *req, + int gfp_flags); + int (*dequeue) (struct usb_ep *ep, struct usb_request *req); + + int (*set_halt) (struct usb_ep *ep, int value); + int (*fifo_status) (struct usb_ep *ep); + void (*fifo_flush) (struct usb_ep *ep); +}; + +/** + * struct usb_ep - device side representation of USB endpoint + * @name:identifier for the endpoint, such as "ep-a" or "ep9in-bulk" + * @ep_list:the gadget's ep_list holds all of its endpoints + * @maxpacket:the maximum packet size used on this endpoint, as + * configured when the endpoint was enabled. + * @driver_data:for use by the gadget driver. all other fields are + * read-only to gadget drivers. + * + * the bus controller driver lists all the general purpose endpoints in + * gadget->ep_list. the control endpoint (gadget->ep0) is not in that list, + * and is accessed only in response to a driver setup() callback. + */ +struct usb_ep { + void *driver_data; + + const char *name; + const struct usb_ep_ops *ops; + struct list_head ep_list; + unsigned maxpacket : 16; +}; + +/*-------------------------------------------------------------------------*/ + +/** + * usb_ep_enable - configure endpoint, making it usable + * @ep:the endpoint being configured. may not be the endpoint named "ep0". + * drivers discover endpoints through the ep_list of a usb_gadget. + * @desc:descriptor for desired behavior. caller guarantees this pointer + * remains valid until the endpoint is disabled; the data byte order + * is little-endian (usb-standard). + * + * when configurations are set, or when interface settings change, the driver + * will enable or disable the relevant endpoints. while it is enabled, an + * endpoint may be used for i/o until the driver receives a disconnect() from + * the host or until the endpoint is disabled. + * + * the ep0 implementation (which calls this routine) must ensure that the + * hardware capabilities of each endpoint match the descriptor provided + * for it. for example, an endpoint named "ep2in-bulk" would be usable + * for interrupt transfers as well as bulk, but it likely couldn't be used + * for iso transfers or for endpoint 14. some endpoints are fully + * configurable, with more generic names like "ep-a". (remember that for + * USB, "in" means "towards the USB master".) + * + * returns zero, or a negative error code. + */ +static inline int +usb_ep_enable (struct usb_ep *ep, const struct usb_endpoint_descriptor *desc) +{ + return ep->ops->enable (ep, desc); +} + +/** + * usb_ep_disable - endpoint is no longer usable + * @ep:the endpoint being unconfigured. may not be the endpoint named "ep0". + * + * no other task may be using this endpoint when this is called. + * any pending and uncompleted requests will complete with status + * indicating disconnect (-ESHUTDOWN) before this call returns. + * gadget drivers must call usb_ep_enable() again before queueing + * requests to the endpoint. + * + * returns zero, or a negative error code. + */ +static inline int +usb_ep_disable (struct usb_ep *ep) +{ + return ep->ops->disable (ep); +} + +/** + * usb_ep_alloc_request - allocate a request object to use with this endpoint + * @ep:the endpoint to be used with with the request + * @gfp_flags:GFP_* flags to use + * + * Request objects must be allocated with this call, since they normally + * need controller-specific setup and may even need endpoint-specific + * resources such as allocation of DMA descriptors. + * Requests may be submitted with usb_ep_queue(), and receive a single + * completion callback. Free requests with usb_ep_free_request(), when + * they are no longer needed. + * + * Returns the request, or null if one could not be allocated. + */ +static inline struct usb_request * +usb_ep_alloc_request (struct usb_ep *ep, int gfp_flags) +{ + return ep->ops->alloc_request (ep, gfp_flags); +} + +/** + * usb_ep_free_request - frees a request object + * @ep:the endpoint associated with the request + * @req:the request being freed + * + * Reverses the effect of usb_ep_alloc_request(). + * Caller guarantees the request is not queued, and that it will + * no longer be requeued (or otherwise used). + */ +static inline void +usb_ep_free_request (struct usb_ep *ep, struct usb_request *req) +{ + ep->ops->free_request (ep, req); +} + +/** + * usb_ep_alloc_buffer - allocate an I/O buffer + * @ep:the endpoint associated with the buffer + * @len:length of the desired buffer + * @dma:pointer to the buffer's DMA address; must be valid + * @gfp_flags:GFP_* flags to use + * + * Returns a new buffer, or null if one could not be allocated. + * The buffer is suitably aligned for dma, if that endpoint uses DMA, + * and the caller won't have to care about dma-inconsistency + * or any hidden "bounce buffer" mechanism. No additional per-request + * DMA mapping will be required for such buffers. + * Free it later with usb_ep_free_buffer(). + * + * You don't need to use this call to allocate I/O buffers unless you + * want to make sure drivers don't incur costs for such "bounce buffer" + * copies or per-request DMA mappings. + */ +static inline void * +usb_ep_alloc_buffer (struct usb_ep *ep, unsigned len, dma_addr_t *dma, + int gfp_flags) +{ + return ep->ops->alloc_buffer (ep, len, dma, gfp_flags); +} + +/** + * usb_ep_free_buffer - frees an i/o buffer + * @ep:the endpoint associated with the buffer + * @buf:CPU view address of the buffer + * @dma:the buffer's DMA address + * @len:length of the buffer + * + * reverses the effect of usb_ep_alloc_buffer(). + * caller guarantees the buffer will no longer be accessed + */ +static inline void +usb_ep_free_buffer (struct usb_ep *ep, void *buf, dma_addr_t dma, unsigned len) +{ + ep->ops->free_buffer (ep, buf, dma, len); +} + +/** + * usb_ep_queue - queues (submits) an I/O request to an endpoint. + * @ep:the endpoint associated with the request + * @req:the request being submitted + * @gfp_flags: GFP_* flags to use in case the lower level driver couldn't + * pre-allocate all necessary memory with the request. + * + * This tells the device controller to perform the specified request through + * that endpoint (reading or writing a buffer). When the request completes, + * including being canceled by usb_ep_dequeue(), the request's completion + * routine is called to return the request to the driver. Any endpoint + * (except control endpoints like ep0) may have more than one transfer + * request queued; they complete in FIFO order. Once a gadget driver + * submits a request, that request may not be examined or modified until it + * is given back to that driver through the completion callback. + * + * Each request is turned into one or more packets. The controller driver + * never merges adjacent requests into the same packet. OUT transfers + * will sometimes use data that's already buffered in the hardware. + * + * Bulk endpoints can queue any amount of data; the transfer is packetized + * automatically. The last packet will be short if the request doesn't fill it + * out completely. Zero length packets (ZLPs) should be avoided in portable + * protocols since not all usb hardware can successfully handle zero length + * packets. (ZLPs may be explicitly written, and may be implicitly written if + * the request 'zero' flag is set.) Bulk endpoints may also be used + * for interrupt transfers; but the reverse is not true, and some endpoints + * won't support every interrupt transfer. (Such as 768 byte packets.) + * + * Interrupt-only endpoints are less functional than bulk endpoints, for + * example by not supporting queueing or not handling buffers that are + * larger than the endpoint's maxpacket size. They may also treat data + * toggle differently. + * + * Control endpoints ... after getting a setup() callback, the driver queues + * one response (even if it would be zero length). That enables the + * status ack, after transfering data as specified in the response. Setup + * functions may return negative error codes to generate protocol stalls. + * (Note that some USB device controllers disallow protocol stall responses + * in some cases.) When control responses are deferred (the response is + * written after the setup callback returns), then usb_ep_set_halt() may be + * used on ep0 to trigger protocol stalls. + * + * For periodic endpoints, like interrupt or isochronous ones, the usb host + * arranges to poll once per interval, and the gadget driver usually will + * have queued some data to transfer at that time. + * + * Returns zero, or a negative error code. Endpoints that are not enabled + * report errors; errors will also be + * reported when the usb peripheral is disconnected. + */ +static inline int +usb_ep_queue (struct usb_ep *ep, struct usb_request *req, int gfp_flags) +{ + return ep->ops->queue (ep, req, gfp_flags); +} + +/** + * usb_ep_dequeue - dequeues (cancels, unlinks) an I/O request from an endpoint + * @ep:the endpoint associated with the request + * @req:the request being canceled + * + * if the request is still active on the endpoint, it is dequeued and its + * completion routine is called (with status -ECONNRESET); else a negative + * error code is returned. + * + * note that some hardware can't clear out write fifos (to unlink the request + * at the head of the queue) except as part of disconnecting from usb. such + * restrictions prevent drivers from supporting configuration changes, + * even to configuration zero (a "chapter 9" requirement). + */ +static inline int usb_ep_dequeue (struct usb_ep *ep, struct usb_request *req) +{ + return ep->ops->dequeue (ep, req); +} + +/** + * usb_ep_set_halt - sets the endpoint halt feature. + * @ep: the non-isochronous endpoint being stalled + * + * Use this to stall an endpoint, perhaps as an error report. + * Except for control endpoints, + * the endpoint stays halted (will not stream any data) until the host + * clears this feature; drivers may need to empty the endpoint's request + * queue first, to make sure no inappropriate transfers happen. + * + * Note that while an endpoint CLEAR_FEATURE will be invisible to the + * gadget driver, a SET_INTERFACE will not be. To reset endpoints for the + * current altsetting, see usb_ep_clear_halt(). When switching altsettings, + * it's simplest to use usb_ep_enable() or usb_ep_disable() for the endpoints. + * + * Returns zero, or a negative error code. On success, this call sets + * underlying hardware state that blocks data transfers. + */ +static inline int +usb_ep_set_halt (struct usb_ep *ep) +{ + return ep->ops->set_halt (ep, 1); +} + +/** + * usb_ep_clear_halt - clears endpoint halt, and resets toggle + * @ep:the bulk or interrupt endpoint being reset + * + * Use this when responding to the standard usb "set interface" request, + * for endpoints that aren't reconfigured, after clearing any other state + * in the endpoint's i/o queue. + * + * Returns zero, or a negative error code. On success, this call clears + * the underlying hardware state reflecting endpoint halt and data toggle. + * Note that some hardware can't support this request (like pxa2xx_udc), + * and accordingly can't correctly implement interface altsettings. + */ +static inline int +usb_ep_clear_halt (struct usb_ep *ep) +{ + return ep->ops->set_halt (ep, 0); +} + +/** + * usb_ep_fifo_status - returns number of bytes in fifo, or error + * @ep: the endpoint whose fifo status is being checked. + * + * FIFO endpoints may have "unclaimed data" in them in certain cases, + * such as after aborted transfers. Hosts may not have collected all + * the IN data written by the gadget driver, as reported by a request + * completion. The gadget driver may not have collected all the data + * written OUT to it by the host. Drivers that need precise handling for + * fault reporting or recovery may need to use this call. + * + * This returns the number of such bytes in the fifo, or a negative + * errno if the endpoint doesn't use a FIFO or doesn't support such + * precise handling. + */ +static inline int +usb_ep_fifo_status (struct usb_ep *ep) +{ + if (ep->ops->fifo_status) + return ep->ops->fifo_status (ep); + else + return -EOPNOTSUPP; +} + +/** + * usb_ep_fifo_flush - flushes contents of a fifo + * @ep: the endpoint whose fifo is being flushed. + * + * This call may be used to flush the "unclaimed data" that may exist in + * an endpoint fifo after abnormal transaction terminations. The call + * must never be used except when endpoint is not being used for any + * protocol translation. + */ +static inline void +usb_ep_fifo_flush (struct usb_ep *ep) +{ + if (ep->ops->fifo_flush) + ep->ops->fifo_flush (ep); +} + + +/*-------------------------------------------------------------------------*/ + +struct usb_gadget; + +/* the rest of the api to the controller hardware: device operations, + * which don't involve endpoints (or i/o). + */ +struct usb_gadget_ops { + int (*get_frame)(struct usb_gadget *); + int (*wakeup)(struct usb_gadget *); + int (*set_selfpowered) (struct usb_gadget *, int value); + int (*ioctl)(struct usb_gadget *, + unsigned code, unsigned long param); +}; + +/** + * struct usb_gadget - represents a usb slave device + * @ep0: Endpoint zero, used when reading or writing responses to + * driver setup() requests + * @ep_list: List of other endpoints supported by the device. + * @speed: Speed of current connection to USB host. + * @name: Identifies the controller hardware type. Used in diagnostics + * and sometimes configuration. + * + * Gadgets have a mostly-portable "gadget driver" implementing device + * functions, handling all usb configurations and interfaces. They + * also have a hardware-specific driver (accessed through ops vectors), + * which insulates the gadget driver from hardware details and packages + * the hardware endpoints through generic i/o queues. + * + * Except for the driver data, all fields in this structure are + * read-only to the gadget driver. That driver data is part of the + * "driver model" infrastructure in 2.5 (and later) kernels, and for + * earlier systems is grouped in a similar structure that's not known + * to the rest of the kernel. + */ +struct usb_gadget { + /* readonly to gadget driver */ + const struct usb_gadget_ops *ops; + struct usb_ep *ep0; + struct list_head ep_list; /* of usb_ep */ + enum usb_device_speed speed; + const char *name; + + struct __gadget_device { + const char *bus_id; + void *driver_data; + } dev; +}; + +static inline void set_gadget_data (struct usb_gadget *gadget, void *data) + { gadget->dev.driver_data = data; } +static inline void *get_gadget_data (struct usb_gadget *gadget) + { return gadget->dev.driver_data; } + + +/* iterates the non-control endpoints; 'tmp' is a struct usb_ep pointer */ +#define gadget_for_each_ep(tmp,gadget) \ + list_for_each_entry(tmp, &(gadget)->ep_list, ep_list) + +#ifndef list_for_each_entry +/* not available in 2.4.18 */ +#define list_for_each_entry(pos, head, member) \ + for (pos = list_entry((head)->next, typeof(*pos), member), \ + prefetch(pos->member.next); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member), \ + prefetch(pos->member.next)) +#endif + + +/** + * usb_gadget_frame_number - returns the current frame number + * @gadget: controller that reports the frame number + * + * Returns the usb frame number, normally eleven bits from a SOF packet, + * or negative errno if this device doesn't support this capability. + */ +static inline int usb_gadget_frame_number (struct usb_gadget *gadget) +{ + return gadget->ops->get_frame (gadget); +} + +/** + * usb_gadget_wakeup - tries to wake up the host connected to this gadget + * @gadget: controller used to wake up the host + * + * Returns zero on success, else negative error code if the hardware + * doesn't support such attempts, or its support has not been enabled + * by the usb host. Drivers must return device descriptors that report + * their ability to support this, or hosts won't enable it. + */ +static inline int usb_gadget_wakeup (struct usb_gadget *gadget) +{ + if (!gadget->ops->wakeup) + return -EOPNOTSUPP; + return gadget->ops->wakeup (gadget); +} + +/** + * usb_gadget_set_selfpowered - sets the device selfpowered feature. + * @gadget:the device being declared as self-powered + * + * this affects the device status reported by the hardware driver + * to reflect that it now has a local power supply. + * + * returns zero on success, else negative errno. + */ +static inline int +usb_gadget_set_selfpowered (struct usb_gadget *gadget) +{ + if (!gadget->ops->set_selfpowered) + return -EOPNOTSUPP; + return gadget->ops->set_selfpowered (gadget, 1); +} + +/** + * usb_gadget_clear_selfpowered - clear the device selfpowered feature. + * @gadget:the device being declared as bus-powered + * + * this affects the device status reported by the hardware driver. + * some hardware may not support bus-powered operation, in which + * case this feature's value can never change. + * + * returns zero on success, else negative errno. + */ +static inline int +usb_gadget_clear_selfpowered (struct usb_gadget *gadget) +{ + if (!gadget->ops->set_selfpowered) + return -EOPNOTSUPP; + return gadget->ops->set_selfpowered (gadget, 0); +} + + +/*-------------------------------------------------------------------------*/ + +/** + * struct usb_gadget_driver - driver for usb 'slave' devices + * @function: String describing the gadget's function + * @speed: Highest speed the driver handles. + * @bind: Invoked when the driver is bound to a gadget, usually + * after registering the driver. + * At that point, ep0 is fully initialized, and ep_list holds + * the currently-available endpoints. + * Called in a context that permits sleeping. + * @setup: Invoked for ep0 control requests that aren't handled by + * the hardware level driver. Most calls must be handled by + * the gadget driver, including descriptor and configuration + * management. The 16 bit members of the setup data are in + * cpu order. Called in_interrupt; this may not sleep. Driver + * queues a response to ep0, or returns negative to stall. + * @disconnect: Invoked after all transfers have been stopped, + * when the host is disconnected. May be called in_interrupt; this + * may not sleep. Some devices can't detect disconnect, so this might + * not be called except as part of controller shutdown. + * @unbind: Invoked when the driver is unbound from a gadget, + * usually from rmmod (after a disconnect is reported). + * Called in a context that permits sleeping. + * @suspend: Invoked on USB suspend. May be called in_interrupt. + * @resume: Invoked on USB resume. May be called in_interrupt. + * + * Devices are disabled till a gadget driver successfully bind()s, which + * means the driver will handle setup() requests needed to enumerate (and + * meet "chapter 9" requirements) then do some useful work. + * + * Drivers use hardware-specific knowledge to configure the usb hardware. + * endpoint addressing is only one of several hardware characteristics that + * are in descriptors the ep0 implementation returns from setup() calls. + * + * Except for ep0 implementation, most driver code shouldn't need change to + * run on top of different usb controllers. It'll use endpoints set up by + * that ep0 implementation. + * + * The usb controller driver handles a few standard usb requests. Those + * include set_address, and feature flags for devices, interfaces, and + * endpoints (the get_status, set_feature, and clear_feature requests). + * + * Accordingly, the driver's setup() callback must always implement all + * get_descriptor requests, returning at least a device descriptor and + * a configuration descriptor. Drivers must make sure the endpoint + * descriptors match any hardware constraints. Some hardware also constrains + * other descriptors. (The pxa250 allows only configurations 1, 2, or 3). + * + * The driver's setup() callback must also implement set_configuration, + * and should also implement set_interface, get_configuration, and + * get_interface. Setting a configuration (or interface) is where + * endpoints should be activated or (config 0) shut down. + * + * (Note that only the default control endpoint is supported. Neither + * hosts nor devices generally support control traffic except to ep0.) + * + * Most devices will ignore USB suspend/resume operations, and so will + * not provide those callbacks. However, some may need to change modes + * when the host is not longer directing those activities. For example, + * local controls (buttons, dials, etc) may need to be re-enabled since + * the (remote) host can't do that any longer; or an error state might + * be cleared, to make the device behave identically whether or not + * power is maintained. + */ +struct usb_gadget_driver { + char *function; + enum usb_device_speed speed; + int (*bind)(struct usb_gadget *); + void (*unbind)(struct usb_gadget *); + int (*setup)(struct usb_gadget *, + const struct usb_ctrlrequest *); + void (*disconnect)(struct usb_gadget *); + void (*suspend)(struct usb_gadget *); + void (*resume)(struct usb_gadget *); + + // FIXME support safe rmmod + struct __gadget_driver { + const char *name; + void *driver_data; + } driver; +}; + + + +/*-------------------------------------------------------------------------*/ + +/* driver modules register and unregister, as usual. + * these calls must be made in a context that can sleep. + * + * these will usually be implemented directly by the hardware-dependent + * usb bus interface driver, which will only support a single driver. + */ + +/** + * usb_gadget_register_driver - register a gadget driver + * @driver:the driver being registered + * + * Call this in your gadget driver's module initialization function, + * to tell the underlying usb controller driver about your driver. + * The driver's bind() function will be called to bind it to a + * gadget. This function must be called in a context that can sleep. + */ +int usb_gadget_register_driver (struct usb_gadget_driver *driver); + +/** + * usb_gadget_unregister_driver - unregister a gadget driver + * @driver:the driver being unregistered + * + * Call this in your gadget driver's module cleanup function, + * to tell the underlying usb controller that your driver is + * going away. If the controller is connected to a USB host, + * it will first disconnect(). The driver is also requested + * to unbind() and clean up any device state, before this procedure + * finally returns. + * This function must be called in a context that can sleep. + */ +int usb_gadget_unregister_driver (struct usb_gadget_driver *driver); + +/*-------------------------------------------------------------------------*/ + +/* utility to simplify dealing with string descriptors */ + +/** + * struct usb_string - wraps a C string and its USB id + * @id:the (nonzero) ID for this string + * @s:the string, in ISO-8859/1 characters + * + * If you're using usb_gadget_get_string(), use this to wrap a string + * together with its ID. + */ +struct usb_string { + u8 id; + const char *s; +}; + +/** + * struct usb_gadget_strings - a set of USB strings in a given language + * @language:identifies the strings' language (0x0409 for en-us) + * @strings:array of strings with their ids + * + * If you're using usb_gadget_get_string(), use this to wrap all the + * strings for a given language. + */ +struct usb_gadget_strings { + u16 language; /* 0x0409 for en-us */ + struct usb_string *strings; +}; + +/* put descriptor for string with that id into buf (buflen >= 256) */ +int usb_gadget_get_string (struct usb_gadget_strings *table, int id, u8 *buf); + + +#endif /* __KERNEL__ */ + +#endif /* __LINUX_USB_GADGET_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/usbdevice_fs.h linux-2.4.23-pre8/include/linux/usbdevice_fs.h --- linux-2.4.22/include/linux/usbdevice_fs.h 2001-11-22 19:49:52.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/usbdevice_fs.h 2003-10-22 22:48:11.000000000 +0000 @@ -142,6 +142,8 @@ #define USBDEVFS_HUB_PORTINFO _IOR('U', 19, struct usbdevfs_hub_portinfo) #define USBDEVFS_RESET _IO('U', 20) #define USBDEVFS_CLEAR_HALT _IOR('U', 21, unsigned int) +#define USBDEVFS_DISCONNECT _IO('U', 22) +#define USBDEVFS_CONNECT _IO('U', 23) /* --------------------------------------------------------------------- */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/videodev.h linux-2.4.23-pre8/include/linux/videodev.h --- linux-2.4.22/include/linux/videodev.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/videodev.h 2003-10-22 22:49:58.000000000 +0000 @@ -4,32 +4,25 @@ #include #include -#if 0 -/* - * v4l2 is still work-in-progress, integration planed for 2.5.x - * v4l2 project homepage: http://www.thedirks.org/v4l2/ - * patches available from: http://bytesex.org/patches/ - */ -# define HAVE_V4L2 1 -# include -#else -# undef HAVE_V4L2 -#endif - #ifdef __KERNEL__ #include +#include #include struct video_device { - struct module *owner; - char name[32]; - int type; /* v4l1 */ - int type2; /* v4l2 */ + /* device info */ + char name[32]; + int type; /* v4l1 */ + int type2; /* v4l2 */ int hardware; int minor; + /* device ops + callbacks */ + struct file_operations *fops; + void (*release)(struct video_device *vfd); + /* old, obsolete interface -- dropped in 2.5.x, don't use it */ int (*open)(struct video_device *, int mode); void (*close)(struct video_device *); @@ -40,28 +33,50 @@ int (*mmap)(struct video_device *, const char *, unsigned long); int (*initialize)(struct video_device *); - /* new interface -- we will use file_operations directly - * like soundcore does. */ - struct file_operations *fops; - void *priv; /* Used to be 'private' but that upsets C++ */ - - /* for videodev.c intenal usage -- don't touch */ - int users; - struct semaphore lock; - devfs_handle_t devfs_handle; +#if 1 /* to be removed in 2.7.x */ + /* obsolete -- fops->owner is used instead */ + struct module *owner; + /* dev->driver_data will be used instead some day. + * Use the video_{get|set}_drvdata() helper functions, + * so the switch over will be transparent for you. + * Or use {pci|usb}_{get|set}_drvdata() directly. */ + void *priv; +#endif + + /* for videodev.c intenal usage -- please don't touch */ + int users; /* video_exclusive_{open|close} ... */ + struct semaphore lock; /* ... helper function uses these */ + devfs_handle_t devfs_handle; /* devfs */ }; #define VIDEO_MAJOR 81 -extern int video_register_device(struct video_device *, int type, int nr); #define VFL_TYPE_GRABBER 0 #define VFL_TYPE_VBI 1 #define VFL_TYPE_RADIO 2 #define VFL_TYPE_VTX 3 +extern int video_register_device(struct video_device *, int type, int nr); extern void video_unregister_device(struct video_device *); extern struct video_device* video_devdata(struct file*); + +/* helper functions to alloc / release struct video_device, the + later can be used for video_device->release() */ +struct video_device *video_device_alloc(void); +void video_device_release(struct video_device *vfd); + +/* helper functions to access driver private data. */ +static inline void *video_get_drvdata(struct video_device *dev) +{ + return dev->priv; +} + +static inline void video_set_drvdata(struct video_device *dev, void *data) +{ + dev->priv = data; +} + extern int video_exclusive_open(struct inode *inode, struct file *file); extern int video_exclusive_release(struct inode *inode, struct file *file); extern int video_usercopy(struct inode *inode, struct file *file, @@ -403,9 +418,8 @@ #define VID_HARDWARE_PWC 31 /* Philips webcams */ #define VID_HARDWARE_MEYE 32 /* Sony Vaio MotionEye cameras */ #define VID_HARDWARE_CPIA2 33 -#define VID_HARDWARE_VICAM 34 /* ViCam, 3Com Homeconnect */ +#define VID_HARDWARE_VICAM 34 #define VID_HARDWARE_SF16FMR2 35 - #endif /* __LINUX_VIDEODEV_H */ /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/wireless.h linux-2.4.23-pre8/include/linux/wireless.h --- linux-2.4.22/include/linux/wireless.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/wireless.h 2003-10-22 22:49:09.000000000 +0000 @@ -1,7 +1,7 @@ /* * This file define a set of standard wireless extensions * - * Version : 15 12.7.02 + * Version : 16 2.4.03 * * Authors : Jean Tourrilhes - HPL - * Copyright (c) 1997-2002 Jean Tourrilhes, All Rights Reserved. @@ -69,6 +69,8 @@ /***************************** INCLUDES *****************************/ +/* To minimise problems in user space, I might remove those headers + * at some point. Jean II */ #include /* for "caddr_t" et al */ #include /* for "struct sockaddr" et al */ #include /* for IFNAMSIZ and co... */ @@ -80,7 +82,7 @@ * (there is some stuff that will be added in the future...) * I just plan to increment with each new version. */ -#define WIRELESS_EXT 15 +#define WIRELESS_EXT 16 /* * Changes : @@ -163,6 +165,16 @@ * - Add IW_TXPOW_RANGE for range of Tx Powers * - Add IWEVREGISTERED & IWEVEXPIRED events for Access Points * - Add IW_MODE_MONITOR for passive monitor + * + * V15 to V16 + * ---------- + * - Increase the number of bitrates in iw_range to 32 (for 802.11g) + * - Increase the number of frequencies in iw_range to 32 (for 802.11b+a) + * - Reshuffle struct iw_range for increases, add filler + * - Increase IW_MAX_AP to 64 for driver returning a lot of addresses + * - Remove IW_MAX_GET_SPY because conflict with enhanced spy support + * - Add SIOCSIWTHRSPY/SIOCGIWTHRSPY and "struct iw_thrspy" + * - Add IW_ENCODE_TEMP and iw_range->encoding_login_index */ /**************************** CONSTANTS ****************************/ @@ -196,9 +208,11 @@ /* SIOCGIWSTATS is strictly used between user space and the kernel, and * is never passed to the driver (i.e. the driver will never see it). */ -/* Mobile IP support (statistics per MAC address) */ +/* Spy support (statistics per MAC address - used for Mobile IP support) */ #define SIOCSIWSPY 0x8B10 /* set spy addresses */ #define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */ +#define SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */ +#define SIOCGIWTHRSPY 0x8B13 /* get spy threshold */ /* Access Point manipulation */ #define SIOCSIWAP 0x8B14 /* set access point MAC addresses */ @@ -294,7 +308,7 @@ #define IW_PRIV_TYPE_FLOAT 0x5000 /* struct iw_freq */ #define IW_PRIV_TYPE_ADDR 0x6000 /* struct sockaddr */ -#define IW_PRIV_SIZE_FIXED 0x0800 /* Variable or fixed nuber of args */ +#define IW_PRIV_SIZE_FIXED 0x0800 /* Variable or fixed number of args */ #define IW_PRIV_SIZE_MASK 0x07FF /* Max number of those args */ @@ -306,13 +320,13 @@ /* ----------------------- OTHER CONSTANTS ----------------------- */ /* Maximum frequencies in the range struct */ -#define IW_MAX_FREQUENCIES 16 +#define IW_MAX_FREQUENCIES 32 /* Note : if you have something like 80 frequencies, * don't increase this constant and don't fill the frequency list. * The user will be able to set by channel anyway... */ /* Maximum bit rates in the range struct */ -#define IW_MAX_BITRATES 8 +#define IW_MAX_BITRATES 32 /* Maximum tx powers in the range struct */ #define IW_MAX_TXPOWER 8 @@ -320,8 +334,7 @@ * a few of them in the struct iw_range. */ /* Maximum of address that you may set with SPY */ -#define IW_MAX_SPY 8 /* set */ -#define IW_MAX_GET_SPY 64 /* get */ +#define IW_MAX_SPY 8 /* Maximum of address that you may get in the list of access points in range */ @@ -354,7 +367,8 @@ #define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */ #define IW_ENCODE_RESTRICTED 0x4000 /* Refuse non-encoded packets */ #define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */ -#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ +#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ +#define IW_ENCODE_TEMP 0x0400 /* Temporary key */ /* Power management flags available (along with the value, if any) */ #define IW_POWER_ON 0x0000 /* No details... */ @@ -482,6 +496,17 @@ __u32 beacon; /* Missed beacons/superframe */ }; +/* + * Quality range (for spy threshold) + */ +struct iw_thrspy +{ + struct sockaddr addr; /* Source address (hw/mac) */ + struct iw_quality qual; /* Quality of the link */ + struct iw_quality low; /* Low threshold */ + struct iw_quality high; /* High threshold */ +}; + /* ------------------------ WIRELESS STATS ------------------------ */ /* * Wireless statistics (used for /proc/net/wireless) @@ -534,7 +559,7 @@ struct iw_quality qual; /* Quality part of statistics */ struct sockaddr ap_addr; /* Access point address */ - struct sockaddr addr; /* Destination address (hw) */ + struct sockaddr addr; /* Destination address (hw/mac) */ struct iw_param param; /* Other small parameters */ struct iw_point data; /* Other large parameters */ @@ -582,17 +607,31 @@ __u32 min_nwid; /* Minimal NWID we are able to set */ __u32 max_nwid; /* Maximal NWID we are able to set */ - /* Frequency */ - __u16 num_channels; /* Number of channels [0; num - 1] */ - __u8 num_frequency; /* Number of entry in the list */ - struct iw_freq freq[IW_MAX_FREQUENCIES]; /* list */ - /* Note : this frequency list doesn't need to fit channel numbers */ + /* Old Frequency (backward compat - moved lower ) */ + __u16 old_num_channels; + __u8 old_num_frequency; + /* Filler to keep "version" at the same offset */ + __s32 old_freq[6]; /* signal level threshold range */ __s32 sensitivity; /* Quality of link & SNR stuff */ + /* Quality range (link, level, noise) + * If the quality is absolute, it will be in the range [0 ; max_qual], + * if the quality is dBm, it will be in the range [max_qual ; 0]. + * Don't forget that we use 8 bit arithmetics... */ struct iw_quality max_qual; /* Quality of the link */ + /* This should contain the average/typical values of the quality + * indicator. This should be the threshold between a "good" and + * a "bad" link (example : monitor going from green to orange). + * Currently, user space apps like quality monitors don't have any + * way to calibrate the measurement. With this, they can split + * the range between 0 and max_qual in different quality level + * (using a geometric subdivision centered on the average). + * I expect that people doing the user space apps will feedback + * us on which value we need to put in each driver... */ + struct iw_quality avg_qual; /* Quality of the link */ /* Rates */ __u8 num_bitrates; /* Number of entries in the list */ @@ -619,6 +658,8 @@ __u16 encoding_size[IW_MAX_ENCODING_SIZES]; /* Different token sizes */ __u8 num_encoding_sizes; /* Number of entry in the list */ __u8 max_encoding_tokens; /* Max number of tokens */ + /* For drivers that need a "login/passwd" form */ + __u8 encoding_login_index; /* token index for login token */ /* Transmit power */ __u16 txpower_capa; /* What options are supported */ @@ -638,18 +679,12 @@ __s32 min_r_time; /* Minimal retry lifetime */ __s32 max_r_time; /* Maximal retry lifetime */ - /* Average quality of link & SNR */ - struct iw_quality avg_qual; /* Quality of the link */ - /* This should contain the average/typical values of the quality - * indicator. This should be the threshold between a "good" and - * a "bad" link (example : monitor going from green to orange). - * Currently, user space apps like quality monitors don't have any - * way to calibrate the measurement. With this, they can split - * the range between 0 and max_qual in different quality level - * (using a geometric subdivision centered on the average). - * I expect that people doing the user space apps will feedback - * us on which value we need to put in each driver... - */ + /* Frequency */ + __u16 num_channels; /* Number of channels [0; num - 1] */ + __u8 num_frequency; /* Number of entry in the list */ + struct iw_freq freq[IW_MAX_FREQUENCIES]; /* list */ + /* Note : this frequency list doesn't need to fit channel numbers, + * because each entry contain its channel index */ }; /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/linux/wm97xx.h linux-2.4.23-pre8/include/linux/wm97xx.h --- linux-2.4.22/include/linux/wm97xx.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/linux/wm97xx.h 2003-10-22 22:48:00.000000000 +0000 @@ -0,0 +1,96 @@ + +/* + * Register bits for Wolfson WM97xx series of codecs + */ + +#ifndef _WM97XX_H_ +#define _WM97XX_H_ + +#include /* AC97 control layer */ + +/* + * WM97xx AC97 Touchscreen registers + */ +#define AC97_WM97XX_DIGITISER1 0x76 +#define AC97_WM97XX_DIGITISER2 0x78 +#define AC97_WM97XX_DIGITISER_RD 0x7a + +/* + * WM97xx register bits + */ +#define WM97XX_POLL 0x8000 /* initiate a polling measurement */ +#define WM97XX_ADCSEL_X 0x1000 /* x coord measurement */ +#define WM97XX_ADCSEL_Y 0x2000 /* y coord measurement */ +#define WM97XX_ADCSEL_PRES 0x3000 /* pressure measurement */ +#define WM97XX_COO 0x0800 /* enable coordinate mode */ +#define WM97XX_CTC 0x0400 /* enable continuous mode */ +#define WM97XX_CM_RATE_93 0x0000 /* 93.75Hz continuous rate */ +#define WM97XX_CM_RATE_187 0x0100 /* 187.5Hz continuous rate */ +#define WM97XX_CM_RATE_375 0x0200 /* 375Hz continuous rate */ +#define WM97XX_CM_RATE_750 0x0300 /* 750Hz continuous rate */ +#define WM97XX_CM_RATE_8K 0x00f0 /* 8kHz continuous rate */ +#define WM97XX_CM_RATE_12K 0x01f0 /* 12kHz continuous rate */ +#define WM97XX_CM_RATE_24K 0x02f0 /* 24kHz continuous rate */ +#define WM97XX_CM_RATE_48K 0x03f0 /* 48kHz continuous rate */ +#define WM97XX_DELAY(i) ((i << 4) & 0x00f0) /* sample delay times */ +#define WM97XX_SLEN 0x0008 /* slot read back enable */ +#define WM97XX_SLT(i) ((i - 5) & 0x7) /* touchpanel slot selection (5-11) */ +#define WM97XX_PRP_DETW 0x4000 /* pen detect on, digitiser off, wake up */ +#define WM97XX_PRP_DET 0x8000 /* pen detect on, digitiser off, no wake up */ +#define WM97XX_PRP_DET_DIG 0xc000 /* pen detect on, digitiser on */ +#define WM97XX_RPR 0x2000 /* wake up on pen down */ +#define WM97XX_PEN_DOWN 0x8000 /* pen is down */ + +/* WM9712 Bits */ +#define WM9712_45W 0x1000 /* set for 5-wire touchscreen */ +#define WM9712_PDEN 0x0800 /* measure only when pen down */ +#define WM9712_WAIT 0x0200 /* wait until adc is read before next sample */ +#define WM9712_PIL 0x0100 /* current used for pressure measurement. set 400uA else 200uA */ +#define WM9712_MASK_HI 0x0040 /* hi on mask pin (47) stops conversions */ +#define WM9712_MASK_EDGE 0x0080 /* rising/falling edge on pin delays sample */ +#define WM9712_MASK_SYNC 0x00c0 /* rising/falling edge on mask initiates sample */ +#define WM9712_RPU(i) (i&0x3f) /* internal pull up on pen detect (64k / rpu) */ +#define WM9712_ADCSEL_COMP1 0x4000 /* COMP1/AUX1 measurement (pin29) */ +#define WM9712_ADCSEL_COMP2 0x5000 /* COMP2/AUX2 measurement (pin30) */ +#define WM9712_ADCSEL_BMON 0x6000 /* BMON/AUX3 measurement (pin31) */ +#define WM9712_ADCSEL_WIPER 0x7000 /* WIPER/AUX4 measurement (pin12) */ +#define WM9712_PD(i) (0x1 << i) /* power management */ + +/* WM9712 Registers */ +#define AC97_WM9712_POWER 0x24 +#define AC97_WM9712_REV 0x58 + +/* WM9705 Bits */ +#define WM9705_PDEN 0x1000 /* measure only when pen is down */ +#define WM9705_PINV 0x0800 /* inverts sense of pen down output */ +#define WM9705_BSEN 0x0400 /* BUSY flag enable, pin47 is 1 when busy */ +#define WM9705_BINV 0x0200 /* invert BUSY (pin47) output */ +#define WM9705_WAIT 0x0100 /* wait until adc is read before next sample */ +#define WM9705_PIL 0x0080 /* current used for pressure measurement. set 400uA else 200uA */ +#define WM9705_PHIZ 0x0040 /* set PHONE and PCBEEP inputs to high impedance */ +#define WM9705_MASK_HI 0x0010 /* hi on mask stops conversions */ +#define WM9705_MASK_EDGE 0x0020 /* rising/falling edge on pin delays sample */ +#define WM9705_MASK_SYNC 0x0030 /* rising/falling edge on mask initiates sample */ +#define WM9705_PDD(i) (i & 0x000f) /* pen detect comparator threshold */ +#define WM9705_ADCSEL_BMON 0x4000 /* BMON measurement */ +#define WM9705_ADCSEL_AUX 0x5000 /* AUX measurement */ +#define WM9705_ADCSEL_PHONE 0x6000 /* PHONE measurement */ +#define WM9705_ADCSEL_PCBEEP 0x7000 /* PCBEEP measurement */ + +/* AUX ADC ID's */ +#define TS_COMP1 0x0 +#define TS_COMP2 0x1 +#define TS_BMON 0x2 +#define TS_WIPER 0x3 + +/* ID numbers */ +#define WM97XX_ID1 0x574d +#define WM9712_ID2 0x4c12 +#define WM9705_ID2 0x4c05 + +#define AC97_LINK_FRAME 21 /* time in uS for AC97 link frame */ + +void register_touchscreen_codec(struct ac97_codec *codec); +void unregister_touchscreen_codec(struct ac97_codec *codec); + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/if_inet6.h linux-2.4.23-pre8/include/net/if_inet6.h --- linux-2.4.22/include/net/if_inet6.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/net/if_inet6.h 2003-10-22 22:49:46.000000000 +0000 @@ -15,6 +15,10 @@ #ifndef _NET_IF_INET6_H #define _NET_IF_INET6_H +#include + +#define IF_RA_OTHERCONF 0x80 +#define IF_RA_MANAGED 0x40 #define IF_RA_RCVD 0x20 #define IF_RS_SENT 0x10 @@ -124,22 +128,6 @@ #define IFA_SITE IPV6_ADDR_SITELOCAL #define IFA_GLOBAL 0x0000U -struct ipv6_devconf -{ - int forwarding; - int hop_limit; - int mtu6; - int accept_ra; - int accept_redirects; - int autoconf; - int dad_transmits; - int rtr_solicits; - int rtr_solicit_interval; - int rtr_solicit_delay; - - void *sysctl; -}; - struct inet6_dev { struct net_device *dev; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/inet_common.h linux-2.4.23-pre8/include/net/inet_common.h --- linux-2.4.22/include/net/inet_common.h 1999-08-23 17:01:02.000000000 +0000 +++ linux-2.4.23-pre8/include/net/inet_common.h 2003-10-22 22:49:14.000000000 +0000 @@ -43,6 +43,14 @@ extern void inet_sock_destruct(struct sock *sk); extern atomic_t inet_sock_nr; +extern int inet_bind(struct socket *sock, + struct sockaddr *uaddr, int addr_len); +extern int inet_getname(struct socket *sock, + struct sockaddr *uaddr, + int *uaddr_len, int peer); +extern int inet_ioctl(struct socket *sock, + unsigned int cmd, unsigned long arg); + #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/ip.h linux-2.4.23-pre8/include/net/ip.h --- linux-2.4.22/include/net/ip.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/net/ip.h 2003-10-22 22:49:11.000000000 +0000 @@ -96,7 +96,7 @@ extern int ip_fragment(struct sk_buff *skb, int (*out)(struct sk_buff*)); extern int ip_do_nat(struct sk_buff *skb); extern void ip_send_check(struct iphdr *ip); -extern int ip_queue_xmit(struct sk_buff *skb); +extern int ip_queue_xmit(struct sk_buff *skb, int ipfragok); extern void ip_init(void); extern int ip_build_xmit(struct sock *sk, int getfrag (const void *, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/ip_vs.h linux-2.4.23-pre8/include/net/ip_vs.h --- linux-2.4.22/include/net/ip_vs.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/ip_vs.h 2003-10-22 22:47:50.000000000 +0000 @@ -0,0 +1,932 @@ +/* + * IP Virtual Server + * data structure and functionality definitions + */ + +#ifndef _IP_VS_H +#define _IP_VS_H + +#include /* For __uXX types */ + +#define IP_VS_VERSION_CODE 0x01000A +#define NVERSION(version) \ + (version >> 16) & 0xFF, \ + (version >> 8) & 0xFF, \ + version & 0xFF + +/* + * Virtual Service Flags + */ +#define IP_VS_SVC_F_PERSISTENT 0x0001 /* persistent port */ +#define IP_VS_SVC_F_HASHED 0x0002 /* hashed entry */ + +/* + * Destination Server Flags + */ +#define IP_VS_DEST_F_AVAILABLE 0x0001 /* Available tag */ + +/* + * IPVS sync daemon states + */ +#define IP_VS_STATE_NONE 0 /* daemon is stopped */ +#define IP_VS_STATE_MASTER 1 /* started as master */ +#define IP_VS_STATE_BACKUP 2 /* started as backup */ + +/* + * IPVS socket options + */ +#define IP_VS_BASE_CTL (64+1024+64) /* base */ + +#define IP_VS_SO_SET_NONE IP_VS_BASE_CTL /* just peek */ +#define IP_VS_SO_SET_INSERT (IP_VS_BASE_CTL+1) +#define IP_VS_SO_SET_ADD (IP_VS_BASE_CTL+2) +#define IP_VS_SO_SET_EDIT (IP_VS_BASE_CTL+3) +#define IP_VS_SO_SET_DEL (IP_VS_BASE_CTL+4) +#define IP_VS_SO_SET_FLUSH (IP_VS_BASE_CTL+5) +#define IP_VS_SO_SET_LIST (IP_VS_BASE_CTL+6) +#define IP_VS_SO_SET_ADDDEST (IP_VS_BASE_CTL+7) +#define IP_VS_SO_SET_DELDEST (IP_VS_BASE_CTL+8) +#define IP_VS_SO_SET_EDITDEST (IP_VS_BASE_CTL+9) +#define IP_VS_SO_SET_TIMEOUTS (IP_VS_BASE_CTL+10) +#define IP_VS_SO_SET_STARTDAEMON (IP_VS_BASE_CTL+11) +#define IP_VS_SO_SET_STOPDAEMON (IP_VS_BASE_CTL+12) +#define IP_VS_SO_SET_RESTORE (IP_VS_BASE_CTL+13) +#define IP_VS_SO_SET_SAVE (IP_VS_BASE_CTL+14) +#define IP_VS_SO_SET_ZERO (IP_VS_BASE_CTL+15) +#define IP_VS_SO_SET_MAX IP_VS_SO_SET_ZERO + +#define IP_VS_SO_GET_VERSION IP_VS_BASE_CTL +#define IP_VS_SO_GET_INFO (IP_VS_BASE_CTL+1) +#define IP_VS_SO_GET_SERVICES (IP_VS_BASE_CTL+2) +#define IP_VS_SO_GET_SERVICE (IP_VS_BASE_CTL+3) +#define IP_VS_SO_GET_DESTS (IP_VS_BASE_CTL+4) +#define IP_VS_SO_GET_DEST (IP_VS_BASE_CTL+5) /* not used now */ +#define IP_VS_SO_GET_TIMEOUTS (IP_VS_BASE_CTL+6) +#define IP_VS_SO_GET_DAEMON (IP_VS_BASE_CTL+7) +#define IP_VS_SO_GET_MAX IP_VS_SO_GET_DAEMON + + +/* + * IPVS Connection Flags + */ +#define IP_VS_CONN_F_FWD_MASK 0x0007 /* mask for the fwd methods */ +#define IP_VS_CONN_F_MASQ 0x0000 /* masquerading */ +#define IP_VS_CONN_F_LOCALNODE 0x0001 /* local node */ +#define IP_VS_CONN_F_TUNNEL 0x0002 /* tunneling */ +#define IP_VS_CONN_F_DROUTE 0x0003 /* direct routing */ +#define IP_VS_CONN_F_BYPASS 0x0004 /* cache bypass */ +#define IP_VS_CONN_F_HASHED 0x0040 /* hashed entry */ +#define IP_VS_CONN_F_NOOUTPUT 0x0080 /* no output packets */ +#define IP_VS_CONN_F_INACTIVE 0x0100 /* not established */ +#define IP_VS_CONN_F_OUT_SEQ 0x0200 /* must do output seq adjust */ +#define IP_VS_CONN_F_IN_SEQ 0x0400 /* must do input seq adjust */ +#define IP_VS_CONN_F_SEQ_MASK 0x0600 /* in/out sequence mask */ +#define IP_VS_CONN_F_NO_CPORT 0x0800 /* no client port set yet */ + +/* Move it to better place one day, for now keep it unique */ +#define NFC_IPVS_PROPERTY 0x10000 + +#define IP_VS_SCHEDNAME_MAXLEN 16 +#define IP_VS_IFNAME_MAXLEN 16 + +struct ip_vs_rule_user { + /* global options */ + int tcp_timeout; /* timeout values */ + int tcp_fin_timeout; + int udp_timeout; + int state; /* sync daemon state */ + char mcast_ifn[IP_VS_IFNAME_MAXLEN]; + /* multicast interface name */ + + /* virtual service options */ + u_int16_t protocol; + u_int32_t vaddr; /* virtual address */ + u_int16_t vport; + u_int32_t vfwmark; /* firwall mark of virtual service*/ + char sched_name[IP_VS_SCHEDNAME_MAXLEN]; + unsigned vs_flags; /* virtual service flags */ + unsigned timeout; /* persistent timeout in ticks */ + u_int32_t netmask; /* persistent netmask */ + + /* destination specific options */ + u_int32_t daddr; /* destination address */ + u_int16_t dport; + unsigned conn_flags; /* destination flags */ + int weight; /* destination weight */ +}; + + +/* + * IPVS statistics object (for user space) + */ +struct ip_vs_stats_user +{ + __u32 conns; /* connections scheduled */ + __u32 inpkts; /* incoming packets */ + __u32 outpkts; /* outgoing packets */ + __u64 inbytes; /* incoming bytes */ + __u64 outbytes; /* outgoing bytes */ + + __u32 cps; /* current connection rate */ + __u32 inpps; /* current in packet rate */ + __u32 outpps; /* current out packet rate */ + __u32 inbps; /* current in byte rate */ + __u32 outbps; /* current out byte rate */ +}; + + +/* The argument to IP_VS_SO_GET_INFO */ +struct ip_vs_getinfo { + /* version number */ + unsigned int version; + + /* size of connection hash table */ + unsigned int size; + + /* number of virtual services */ + unsigned int num_services; +}; + +/* The argument to IP_VS_SO_GET_SERVICE */ +struct ip_vs_service_user { + /* which service: user fills this in */ + u_int16_t protocol; + u_int32_t addr; /* virtual address */ + u_int16_t port; + u_int32_t fwmark; /* firwall mark of virtual service */ + + /* service options */ + char sched_name[IP_VS_SCHEDNAME_MAXLEN]; + unsigned flags; /* virtual service flags */ + unsigned timeout; /* persistent timeout in ticks */ + u_int32_t netmask; /* persistent netmask */ + + /* number of real servers */ + unsigned int num_dests; + + /* statistics */ + struct ip_vs_stats_user stats; +}; + +struct ip_vs_dest_user { + u_int32_t addr; /* destination address */ + u_int16_t port; + unsigned flags; /* destination flags */ + int weight; /* destination weight */ + u_int32_t activeconns; /* active connections */ + u_int32_t inactconns; /* inactive connections */ + + /* statistics */ + struct ip_vs_stats_user stats; +}; + +/* The argument to IP_VS_SO_GET_DESTS */ +struct ip_vs_get_dests { + /* which service: user fills this in */ + u_int16_t protocol; + u_int32_t addr; /* virtual address */ + u_int16_t port; + u_int32_t fwmark; /* firwall mark of virtual service */ + + /* number of real servers */ + unsigned int num_dests; + + /* the real servers */ + struct ip_vs_dest_user entrytable[0]; +}; + +/* The argument to IP_VS_SO_GET_SERVICES */ +struct ip_vs_get_services { + /* number of virtual services */ + unsigned int num_services; + + /* service table */ + struct ip_vs_service_user entrytable[0]; +}; + +/* The argument to IP_VS_SO_GET_TIMEOUTS */ +struct ip_vs_timeout_user { + int tcp_timeout; + int tcp_fin_timeout; + int udp_timeout; +}; + +/* The argument to IP_VS_SO_GET_DAEMON */ +struct ip_vs_daemon_user { + int state; /* sync daemon state */ + char mcast_ifn[IP_VS_IFNAME_MAXLEN]; /* multicast interface name */ +}; + + +#ifdef __KERNEL__ + +#include +#include /* for struct list_head */ +#include /* for struct rwlock_t */ +#include /* for struct sk_buff */ +#include /* for struct iphdr */ +#include /* for struct atomic_t */ +#include /* for struct neighbour; */ +#include /* for struct dst_entry */ +#include /* for ip_route_output */ +#include +#include + + +#ifdef CONFIG_IP_VS_DEBUG +extern int ip_vs_get_debug_level(void); +#define IP_VS_DBG(level, msg...) \ + do { \ + if (level <= ip_vs_get_debug_level()) \ + printk(KERN_DEBUG "IPVS: " msg); \ + } while (0) +#define IP_VS_DBG_RL(msg...) \ + do { \ + if (net_ratelimit()) \ + printk(KERN_DEBUG "IPVS: " msg); \ + } while (0) +#else /* NO DEBUGGING at ALL */ +#define IP_VS_DBG(level, msg...) do {} while (0) +#define IP_VS_DBG_RL(msg...) do {} while (0) +#endif + +#define IP_VS_BUG() BUG() +#define IP_VS_ERR(msg...) printk(KERN_ERR "IPVS: " msg) +#define IP_VS_INFO(msg...) printk(KERN_INFO "IPVS: " msg) +#define IP_VS_WARNING(msg...) \ + printk(KERN_WARNING "IPVS: " msg) +#define IP_VS_ERR_RL(msg...) \ + do { \ + if (net_ratelimit()) \ + printk(KERN_ERR "IPVS: " msg); \ + } while (0) + +#ifdef CONFIG_IP_VS_DEBUG +#define EnterFunction(level) \ + do { \ + if (level <= ip_vs_get_debug_level()) \ + printk(KERN_DEBUG "Enter: %s, %s line %i\n", \ + __FUNCTION__, __FILE__, __LINE__); \ + } while (0) +#define LeaveFunction(level) \ + do { \ + if (level <= ip_vs_get_debug_level()) \ + printk(KERN_DEBUG "Leave: %s, %s line %i\n", \ + __FUNCTION__, __FILE__, __LINE__); \ + } while (0) +#else +#define EnterFunction(level) do {} while (0) +#define LeaveFunction(level) do {} while (0) +#endif + + +/* + * The port number of FTP service (in network order). + */ +#define FTPPORT __constant_htons(21) +#define FTPDATA __constant_htons(20) + + +/* + * IPVS sysctl variables under the /proc/sys/net/ipv4/vs/ + */ +#define NET_IPV4_VS 21 + +enum { + NET_IPV4_VS_DEBUG_LEVEL=1, + NET_IPV4_VS_AMEMTHRESH=2, + NET_IPV4_VS_AMDROPRATE=3, + NET_IPV4_VS_DROP_ENTRY=4, + NET_IPV4_VS_DROP_PACKET=5, + NET_IPV4_VS_SECURE_TCP=6, + NET_IPV4_VS_TO_ES=7, + NET_IPV4_VS_TO_SS=8, + NET_IPV4_VS_TO_SR=9, + NET_IPV4_VS_TO_FW=10, + NET_IPV4_VS_TO_TW=11, + NET_IPV4_VS_TO_CL=12, + NET_IPV4_VS_TO_CW=13, + NET_IPV4_VS_TO_LA=14, + NET_IPV4_VS_TO_LI=15, + NET_IPV4_VS_TO_SA=16, + NET_IPV4_VS_TO_UDP=17, + NET_IPV4_VS_TO_ICMP=18, + NET_IPV4_VS_LBLC_EXPIRE=19, + NET_IPV4_VS_LBLCR_EXPIRE=20, + NET_IPV4_VS_CACHE_BYPASS=22, + NET_IPV4_VS_EXPIRE_NODEST_CONN=23, + NET_IPV4_VS_SYNC_THRESHOLD=24, + NET_IPV4_VS_NAT_ICMP_SEND=25, + NET_IPV4_VS_LAST +}; + + +/* + * IPVS State Values + */ +enum { + IP_VS_S_NONE = 0, + IP_VS_S_ESTABLISHED, + IP_VS_S_SYN_SENT, + IP_VS_S_SYN_RECV, + IP_VS_S_FIN_WAIT, + IP_VS_S_TIME_WAIT, + IP_VS_S_CLOSE, + IP_VS_S_CLOSE_WAIT, + IP_VS_S_LAST_ACK, + IP_VS_S_LISTEN, + IP_VS_S_SYNACK, + IP_VS_S_UDP, + IP_VS_S_ICMP, + IP_VS_S_LAST +}; + + +struct ip_vs_timeout_table { + atomic_t refcnt; + int scale; + int timeout[IP_VS_S_LAST+1]; +}; + + +/* + * Transport protocol header + */ +union ip_vs_tphdr { + unsigned char *raw; + struct udphdr *uh; + struct tcphdr *th; + struct icmphdr *icmph; + __u16 *portp; +}; + + +/* + * Delta sequence info structure + * Each ip_vs_conn has 2 (output AND input seq. changes). + * Only used in the VS/NAT. + */ +struct ip_vs_seq { + __u32 init_seq; /* Add delta from this seq */ + __u32 delta; /* Delta in sequence numbers */ + __u32 previous_delta; /* Delta in sequence numbers + before last resized pkt */ +}; + + +/* + * IPVS statistics object + */ +struct ip_vs_stats +{ + __u32 conns; /* connections scheduled */ + __u32 inpkts; /* incoming packets */ + __u32 outpkts; /* outgoing packets */ + __u64 inbytes; /* incoming bytes */ + __u64 outbytes; /* outgoing bytes */ + + __u32 cps; /* current connection rate */ + __u32 inpps; /* current in packet rate */ + __u32 outpps; /* current out packet rate */ + __u32 inbps; /* current in byte rate */ + __u32 outbps; /* current out byte rate */ + + spinlock_t lock; /* spin lock */ +}; + + +/* + * IP_VS structure allocated for each dynamically scheduled connection + */ +struct ip_vs_conn { + struct list_head c_list; /* hashed list heads */ + + /* Protocol, addresses and port numbers */ + __u32 caddr; /* client address */ + __u32 vaddr; /* virtual address */ + __u32 daddr; /* destination address */ + __u16 cport; + __u16 vport; + __u16 dport; + __u16 protocol; /* Which protocol (TCP/UDP) */ + + /* counter and timer */ + atomic_t refcnt; /* reference count */ + struct timer_list timer; /* Expiration timer */ + volatile unsigned long timeout; /* timeout */ + struct ip_vs_timeout_table *timeout_table; + + /* Flags and state transition */ + spinlock_t lock; /* lock for state transition */ + volatile __u16 flags; /* status flags */ + volatile __u16 state; /* state info */ + + /* Control members */ + struct ip_vs_conn *control; /* Master control connection */ + atomic_t n_control; /* Number of controlled ones */ + struct ip_vs_dest *dest; /* real server */ + atomic_t in_pkts; /* incoming packet counter */ + + /* packet transmitter for different forwarding methods */ + int (*packet_xmit)(struct sk_buff *skb, struct ip_vs_conn *cp); + + /* Note: we can group the following members into a structure, + in order to save more space, and the following members are + only used in VS/NAT anyway */ + struct ip_vs_app *app; /* bound ip_vs_app object */ + void *app_data; /* Application private data */ + struct ip_vs_seq in_seq; /* incoming seq. struct */ + struct ip_vs_seq out_seq; /* outgoing seq. struct */ +}; + + +/* + * The information about the virtual service offered to the net + * and the forwarding entries + */ +struct ip_vs_service { + struct list_head s_list; /* for normal service table */ + struct list_head f_list; /* for fwmark-based service table */ + atomic_t refcnt; /* reference counter */ + atomic_t usecnt; /* use counter */ + + __u16 protocol; /* which protocol (TCP/UDP) */ + __u32 addr; /* IP address for virtual service */ + __u16 port; /* port number for the service */ + __u32 fwmark; /* firewall mark of the service */ + unsigned flags; /* service status flags */ + unsigned timeout; /* persistent timeout in ticks */ + __u32 netmask; /* grouping granularity */ + + struct list_head destinations; /* real server d-linked list */ + __u32 num_dests; /* number of servers */ + struct ip_vs_stats stats; /* statistics for the service */ + + /* for scheduling */ + struct ip_vs_scheduler *scheduler; /* bound scheduler object */ + rwlock_t sched_lock; /* lock sched_data */ + void *sched_data; /* scheduler application data */ +}; + + +/* + * The real server destination forwarding entry + * with ip address, port number, and so on. + */ +struct ip_vs_dest { + struct list_head n_list; /* for the dests in the service */ + struct list_head d_list; /* for table with all the dests */ + + __u32 addr; /* IP address of real server */ + __u16 port; /* port number of the service */ + unsigned flags; /* dest status flags */ + atomic_t weight; /* server weight */ + atomic_t conn_flags; /* flags to copy to conn */ + atomic_t activeconns; /* active connections */ + atomic_t inactconns; /* inactive connections */ + atomic_t refcnt; /* reference counter */ + struct ip_vs_stats stats; /* statistics */ + + /* for destination cache */ + spinlock_t dst_lock; /* lock dst_cache */ + struct dst_entry *dst_cache; /* destination cache entry */ + u32 dst_rtos; /* RT_TOS(tos) for dst */ + + /* for virtual service */ + struct ip_vs_service *svc; /* service that it belongs to */ + __u16 protocol; /* which protocol (TCP/UDP) */ + __u32 vaddr; /* IP address for virtual service */ + __u16 vport; /* port number for the service */ + __u32 vfwmark; /* firewall mark of the service */ +}; + + +/* + * The scheduler object + */ +struct ip_vs_scheduler { + struct list_head n_list; /* d-linked list head */ + char *name; /* scheduler name */ + atomic_t refcnt; /* reference counter */ + struct module *module; /* THIS_MODULE/NULL */ + + /* scheduler initializing service */ + int (*init_service)(struct ip_vs_service *svc); + /* scheduling service finish */ + int (*done_service)(struct ip_vs_service *svc); + /* scheduler updating service */ + int (*update_service)(struct ip_vs_service *svc); + + /* selecting a server from the given service */ + struct ip_vs_dest* (*schedule)(struct ip_vs_service *svc, + struct iphdr *iph); +}; + + +/* + * The application module object + */ +struct ip_vs_app +{ + struct list_head n_list; /* d-linked list head */ + char *name; /* name of application module */ + unsigned type; /* type = proto<<16 | port + (host byte order)*/ + struct module *module; /* THIS_MODULE/NULL */ + + /* ip_vs_app initializer */ + int (*init_conn)(struct ip_vs_app *, struct ip_vs_conn *); + /* ip_vs_app finish */ + int (*done_conn)(struct ip_vs_app *, struct ip_vs_conn *); + /* output hook */ + int (*pkt_out)(struct ip_vs_app *, + struct ip_vs_conn *, struct sk_buff *); + /* input hook */ + int (*pkt_in)(struct ip_vs_app *, + struct ip_vs_conn *, struct sk_buff *); +}; + + +/* + * IPVS core functions + * (from ip_vs_core.c) + */ +extern const char *ip_vs_proto_name(unsigned proto); +extern unsigned int check_for_ip_vs_out(struct sk_buff **skb_p, + int (*okfn)(struct sk_buff *)); + + +/* + * ip_vs_conn handling functions + * (from ip_vs_conn.c) + */ + +/* + * IPVS connection entry hash table + */ +#ifndef CONFIG_IP_VS_TAB_BITS +#define CONFIG_IP_VS_TAB_BITS 12 +#endif +/* make sure that IP_VS_CONN_TAB_BITS is located in [8, 20] */ +#if CONFIG_IP_VS_TAB_BITS < 8 +#define IP_VS_CONN_TAB_BITS 8 +#endif +#if CONFIG_IP_VS_TAB_BITS > 20 +#define IP_VS_CONN_TAB_BITS 20 +#endif +#if 8 <= CONFIG_IP_VS_TAB_BITS && CONFIG_IP_VS_TAB_BITS <= 20 +#define IP_VS_CONN_TAB_BITS CONFIG_IP_VS_TAB_BITS +#endif +#define IP_VS_CONN_TAB_SIZE (1 << IP_VS_CONN_TAB_BITS) +#define IP_VS_CONN_TAB_MASK (IP_VS_CONN_TAB_SIZE - 1) + +#define VS_STATE_INPUT 0 +#define VS_STATE_OUTPUT 4 +#define VS_STATE_INPUT_ONLY 8 + +extern struct ip_vs_timeout_table vs_timeout_table; +extern struct ip_vs_timeout_table vs_timeout_table_dos; + +extern struct ip_vs_conn *ip_vs_conn_in_get +(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port); +extern struct ip_vs_conn *ip_vs_conn_out_get +(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port); + +/* put back the conn without restarting its timer */ +static inline void __ip_vs_conn_put(struct ip_vs_conn *cp) +{ + atomic_dec(&cp->refcnt); +} +extern void ip_vs_conn_put(struct ip_vs_conn *cp); + +extern struct ip_vs_conn * +ip_vs_conn_new(int proto, __u32 caddr, __u16 cport, __u32 vaddr, __u16 vport, + __u32 daddr, __u16 dport, unsigned flags, + struct ip_vs_dest *dest); +extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp); + +extern const char * ip_vs_state_name(int state); +extern int ip_vs_set_state(struct ip_vs_conn *cp, int state_off, + struct iphdr *iph, void *tp); +extern int ip_vs_conn_listen(struct ip_vs_conn *cp); +extern int ip_vs_check_template(struct ip_vs_conn *ct); +extern void ip_vs_secure_tcp_set(int on); +extern void ip_vs_random_dropentry(void); +extern int ip_vs_conn_init(void); +extern void ip_vs_conn_cleanup(void); + +static inline void ip_vs_control_del(struct ip_vs_conn *cp) +{ + struct ip_vs_conn *ctl_cp = cp->control; + if (!ctl_cp) { + IP_VS_ERR("request control DEL for uncontrolled: " + "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(cp->vaddr),ntohs(cp->vport)); + return; + } + + IP_VS_DBG(7, "DELeting control for: " + "cp.dst=%d.%d.%d.%d:%d ctl_cp.dst=%d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(ctl_cp->caddr),ntohs(ctl_cp->cport)); + + cp->control = NULL; + if (atomic_read(&ctl_cp->n_control) == 0) { + IP_VS_ERR("BUG control DEL with n=0 : " + "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(cp->vaddr),ntohs(cp->vport)); + return; + } + atomic_dec(&ctl_cp->n_control); +} + +static inline void +ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp) +{ + if (cp->control) { + IP_VS_ERR("request control ADD for already controlled: " + "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(cp->vaddr),ntohs(cp->vport)); + ip_vs_control_del(cp); + } + + IP_VS_DBG(7, "ADDing control for: " + "cp.dst=%d.%d.%d.%d:%d ctl_cp.dst=%d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(ctl_cp->caddr),ntohs(ctl_cp->cport)); + + cp->control = ctl_cp; + atomic_inc(&ctl_cp->n_control); +} + + +/* + * IPVS application functions + * (from ip_vs_app.c) + */ +#define IP_VS_APP_MAX_PORTS 8 +extern int register_ip_vs_app(struct ip_vs_app *mapp, + unsigned short proto, __u16 port); +extern int unregister_ip_vs_app(struct ip_vs_app *mapp); +extern struct ip_vs_app * ip_vs_bind_app(struct ip_vs_conn *cp); +extern int ip_vs_unbind_app(struct ip_vs_conn *cp); +extern int ip_vs_app_pkt_out(struct ip_vs_conn *, struct sk_buff *skb); +extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff *skb); +extern int ip_vs_skb_replace(struct sk_buff *skb, int pri, + char *o_buf, int o_len, char *n_buf, int n_len); +extern int ip_vs_app_init(void); +extern void ip_vs_app_cleanup(void); + + +/* + * Registering/unregistering scheduler functions + * (from ip_vs_sched.c) + */ +extern int register_ip_vs_scheduler(struct ip_vs_scheduler *scheduler); +extern int unregister_ip_vs_scheduler(struct ip_vs_scheduler *scheduler); +extern int ip_vs_bind_scheduler(struct ip_vs_service *svc, + struct ip_vs_scheduler *scheduler); +extern int ip_vs_unbind_scheduler(struct ip_vs_service *svc); +extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name); +extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler); + + +/* + * IPVS control data and functions + * (from ip_vs_ctl.c) + */ +extern int sysctl_ip_vs_cache_bypass; +extern int sysctl_ip_vs_expire_nodest_conn; +extern int sysctl_ip_vs_sync_threshold; +extern int sysctl_ip_vs_nat_icmp_send; +extern struct ip_vs_stats ip_vs_stats; + +extern struct ip_vs_service *ip_vs_service_get(__u32 fwmark, + __u16 protocol, + __u32 vaddr, __u16 vport); +static inline void ip_vs_service_put(struct ip_vs_service *svc) +{ + atomic_dec(&svc->usecnt); +} + +extern struct ip_vs_dest * +ip_vs_lookup_real_service(__u16 protocol, __u32 daddr, __u16 dport); +extern void ip_vs_random_dropentry(void); +extern int ip_vs_control_init(void); +extern void ip_vs_control_cleanup(void); + + +/* + * IPVS sync daemon data and function prototypes + * (from ip_vs_sync.c) + */ +extern volatile int ip_vs_sync_state; +extern char ip_vs_mcast_ifn[IP_VS_IFNAME_MAXLEN]; +extern int start_sync_thread(int state, char *mcast_ifn); +extern int stop_sync_thread(void); +extern void ip_vs_sync_conn(struct ip_vs_conn *cp); + + +/* + * IPVS rate estimator prototypes (from ip_vs_est.c) + */ +extern int ip_vs_new_estimator(struct ip_vs_stats *stats); +extern void ip_vs_kill_estimator(struct ip_vs_stats *stats); +extern void ip_vs_zero_estimator(struct ip_vs_stats *stats); + + +/* + * This is a simple mechanism to ignore packets when + * we are loaded. Just set ip_vs_drop_rate to 'n' and + * we start to drop 1/rate of the packets + */ +extern int ip_vs_drop_rate; +extern int ip_vs_drop_counter; + +static __inline__ int ip_vs_todrop(void) +{ + if (!ip_vs_drop_rate) return 0; + if (--ip_vs_drop_counter > 0) return 0; + ip_vs_drop_counter = ip_vs_drop_rate; + return 1; +} + + +/* + * ip_vs_fwd_tag returns the forwarding tag of the connection + */ +#define IP_VS_FWD_METHOD(cp) (cp->flags & IP_VS_CONN_F_FWD_MASK) + +extern __inline__ char ip_vs_fwd_tag(struct ip_vs_conn *cp) +{ + char fwd; + + switch (IP_VS_FWD_METHOD(cp)) { + case IP_VS_CONN_F_MASQ: + fwd = 'M'; break; + case IP_VS_CONN_F_LOCALNODE: + fwd = 'L'; break; + case IP_VS_CONN_F_TUNNEL: + fwd = 'T'; break; + case IP_VS_CONN_F_DROUTE: + fwd = 'R'; break; + case IP_VS_CONN_F_BYPASS: + fwd = 'B'; break; + default: + fwd = '?'; break; + } + return fwd; +} + + +/* + * transport layer header checking + */ +extern inline int ip_vs_header_check(struct sk_buff *skb, int proto, int ihl) +{ + int len; + + switch (proto) { + case IPPROTO_TCP: + len = ihl + sizeof(struct tcphdr); + /* we don't care about TCP options */ + break; + case IPPROTO_UDP: + len = ihl + sizeof(struct udphdr); + break; + default: + len = 0; + } + + /* guarantee protocol header available in skb data area */ + if (!pskb_may_pull(skb, len)) + return -1; + else + return 0; +} + + +/* + * Destination cache + */ +static inline void +__ip_vs_dst_set(struct ip_vs_dest *dest, u32 rtos, struct dst_entry *dst) +{ + struct dst_entry *old_dst; + + old_dst = dest->dst_cache; + dest->dst_cache = dst; + dest->dst_rtos = rtos; + dst_release(old_dst); +} + +static inline void +__ip_vs_dst_reset(struct ip_vs_dest *dest) +{ + struct dst_entry *old_dst; + + old_dst = dest->dst_cache; + dest->dst_cache = NULL; + dst_release(old_dst); +} + +static inline struct dst_entry * +__ip_vs_dst_check(struct ip_vs_dest *dest, u32 rtos, u32 cookie) +{ + struct dst_entry *dst = dest->dst_cache; + + if (!dst) + return NULL; + if ((dst->obsolete || rtos != dest->dst_rtos) && + dst->ops->check(dst, cookie) == NULL) { + dest->dst_cache = 0; + return NULL; + } + dst_hold(dst); + return dst; +} + +static inline struct rtable * +__ip_vs_get_out_rt(struct ip_vs_conn *cp, u32 rtos) +{ + struct rtable *rt; /* Route to the other host */ + struct ip_vs_dest *dest = cp->dest; + + if (dest) { + spin_lock(&dest->dst_lock); + if (!(rt = (struct rtable *) + __ip_vs_dst_check(dest, rtos, 0))) { + if (ip_route_output(&rt, dest->addr, 0, rtos, 0)) { + spin_unlock(&dest->dst_lock); + IP_VS_DBG_RL("ip_route_output error, " + "dest: %u.%u.%u.%u\n", + NIPQUAD(dest->addr)); + return NULL; + } + __ip_vs_dst_set(dest, rtos, dst_clone(&rt->u.dst)); + IP_VS_DBG(10, "new dst %u.%u.%u.%u, refcnt=%d, rtos=%X\n", + NIPQUAD(dest->addr), + atomic_read(&rt->u.dst.__refcnt), rtos); + } + spin_unlock(&dest->dst_lock); + } else { + if (ip_route_output(&rt, cp->daddr, 0, rtos, 0)) { + IP_VS_DBG_RL("ip_route_output error, dest: " + "%u.%u.%u.%u\n", NIPQUAD(cp->daddr)); + return NULL; + } + } + + return rt; +} + +static inline u16 ip_vs_check_diff(u32 old, u32 new, u16 oldsum) +{ + u32 diff[2] = { old, new }; + + return csum_fold(csum_partial((char *) diff, sizeof(diff), + oldsum ^ 0xFFFF)); +} + +static inline void ip_vs_fast_check_update(union ip_vs_tphdr *h, + u32 oldip, u32 newip, u16 oldport, u16 newport, u8 protocol) +{ + u16 *checkp; + + if (protocol == IPPROTO_TCP) + checkp = &h->th->check; + else + checkp = &h->uh->check; + *checkp = ip_vs_check_diff(~oldip, newip, + ip_vs_check_diff(oldport ^ 0xFFFF, + newport, *checkp)); + if (!*checkp && protocol == IPPROTO_UDP) + *checkp = 0xFFFF; +} + +static inline int +ip_vs_skb_cow(struct sk_buff *skb, unsigned int headroom, + struct iphdr **iph_p, unsigned char **t_p) +{ + int delta = (headroom > 16 ? headroom : 16) - skb_headroom(skb); + + if (delta < 0) + delta = 0; + + if (delta || skb_cloned(skb)) { + if (pskb_expand_head(skb, (delta+15)&~15, 0, GFP_ATOMIC)) + return -ENOMEM; + + /* skb data changed, update pointers */ + *iph_p = skb->nh.iph; + *t_p = (char*) (*iph_p) + (*iph_p)->ihl * 4; + } + return 0; +} + +#endif /* __KERNEL__ */ + +#endif /* _IP_VS_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/ipv6.h linux-2.4.23-pre8/include/net/ipv6.h --- linux-2.4.22/include/net/ipv6.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/net/ipv6.h 2003-10-22 22:49:19.000000000 +0000 @@ -353,6 +353,14 @@ u32 info, u8 *payload); extern void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info); +extern int inet6_release(struct socket *sock); +extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr, + int addr_len); +extern int inet6_getname(struct socket *sock, struct sockaddr *uaddr, + int *uaddr_len, int peer); +extern int inet6_ioctl(struct socket *sock, unsigned int cmd, + unsigned long arg); + #endif /* __KERNEL__ */ #endif /* _NET_IPV6_H */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/iw_handler.h linux-2.4.23-pre8/include/net/iw_handler.h --- linux-2.4.22/include/net/iw_handler.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/net/iw_handler.h 2003-10-22 22:48:31.000000000 +0000 @@ -1,7 +1,7 @@ /* * This file define the new driver API for Wireless Extensions * - * Version : 4 21.6.02 + * Version : 5 4.12.02 * * Authors : Jean Tourrilhes - HPL - * Copyright (c) 2001-2002 Jean Tourrilhes, All Rights Reserved. @@ -206,7 +206,7 @@ * will be needed... * I just plan to increment with each new version. */ -#define IW_HANDLER_VERSION 4 +#define IW_HANDLER_VERSION 5 /* * Changes : @@ -220,10 +220,18 @@ * V3 to V4 * -------- * - Reshuffle IW_HEADER_TYPE_XXX to map IW_PRIV_TYPE_XXX changes + * + * V4 to V5 + * -------- + * - Add new spy support : struct iw_spy_data & prototypes */ /**************************** CONSTANTS ****************************/ +/* Enable enhanced spy support. Disable to reduce footprint */ +#define IW_WIRELESS_SPY +#define IW_WIRELESS_THRSPY + /* Special error message for the driver to indicate that we * should do a commit after return from the iw_handler */ #define EIWCOMMIT EINPROGRESS @@ -315,6 +323,9 @@ * We will automatically export that to user space... */ struct iw_priv_args * private_args; + /* Driver enhanced spy support */ + long spy_offset; /* Spy data offset */ + /* In the long term, get_wireless_stats will move from * 'struct net_device' to here, to minimise bloat. */ }; @@ -350,6 +361,33 @@ /* Need to think of short header translation table. Later. */ +/* --------------------- ENHANCED SPY SUPPORT --------------------- */ +/* + * In the old days, the driver was handling spy support all by itself. + * Now, the driver can delegate this task to Wireless Extensions. + * It needs to include this struct in its private part and use the + * standard spy iw_handler. + */ + +/* + * Instance specific spy data, i.e. addresses spied and quality for them. + */ +struct iw_spy_data +{ +#ifdef IW_WIRELESS_SPY + /* --- Standard spy support --- */ + int spy_number; + u_char spy_address[IW_MAX_SPY][ETH_ALEN]; + struct iw_quality spy_stat[IW_MAX_SPY]; +#ifdef IW_WIRELESS_THRSPY + /* --- Enhanced spy support (event) */ + struct iw_quality spy_thr_low; /* Low threshold */ + struct iw_quality spy_thr_high; /* High threshold */ + u_char spy_thr_under[IW_MAX_SPY]; +#endif /* IW_WIRELESS_THRSPY */ +#endif /* IW_WIRELESS_SPY */ +}; + /**************************** PROTOTYPES ****************************/ /* * Functions part of the Wireless Extensions (defined in net/core/wireless.c). @@ -376,6 +414,31 @@ /* We may need a function to send a stream of events to user space. * More on that later... */ +/* Standard handler for SIOCSIWSPY */ +extern int iw_handler_set_spy(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra); +/* Standard handler for SIOCGIWSPY */ +extern int iw_handler_get_spy(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra); +/* Standard handler for SIOCSIWTHRSPY */ +extern int iw_handler_set_thrspy(struct net_device * dev, + struct iw_request_info *info, + union iwreq_data * wrqu, + char * extra); +/* Standard handler for SIOCGIWTHRSPY */ +extern int iw_handler_get_thrspy(struct net_device * dev, + struct iw_request_info *info, + union iwreq_data * wrqu, + char * extra); +/* Driver call to update spy records */ +extern void wireless_spy_update(struct net_device * dev, + unsigned char * address, + struct iw_quality * wstats); + /************************* INLINE FUNTIONS *************************/ /* * Function that are so simple that it's more efficient inlining them diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/neighbour.h linux-2.4.23-pre8/include/net/neighbour.h --- linux-2.4.22/include/net/neighbour.h 2001-11-22 19:47:11.000000000 +0000 +++ linux-2.4.23-pre8/include/net/neighbour.h 2003-10-22 22:49:46.000000000 +0000 @@ -180,6 +180,7 @@ extern void neigh_destroy(struct neighbour *neigh); extern int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb); extern int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, int override, int arp); +extern void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev); extern int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev); extern int neigh_resolve_output(struct sk_buff *skb); extern int neigh_connected_output(struct sk_buff *skb); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/pkt_sched.h linux-2.4.23-pre8/include/net/pkt_sched.h --- linux-2.4.22/include/net/pkt_sched.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/net/pkt_sched.h 2003-10-22 22:47:59.000000000 +0000 @@ -212,12 +212,16 @@ #if PSCHED_CLOCK_SOURCE == PSCHED_JIFFIES -#if HZ == 100 +#if HZ < 96 +#define PSCHED_JSCALE 14 +#elif HZ >= 96 && HZ < 192 #define PSCHED_JSCALE 13 -#elif HZ == 1024 +#elif HZ >= 192 && HZ < 384 +#define PSCHED_JSCALE 12 +#elif HZ >= 384 && HZ < 768 +#define PSCHED_JSCALE 11 +#elif HZ >= 768 #define PSCHED_JSCALE 10 -#else -#define PSCHED_JSCALE 0 #endif #define PSCHED_EXPORTLIST_2 diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/command.h linux-2.4.23-pre8/include/net/sctp/command.h --- linux-2.4.22/include/net/sctp/command.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/command.h 2003-10-22 22:49:18.000000000 +0000 @@ -0,0 +1,214 @@ +/* SCTP kernel reference Implementation Copyright (C) 1999-2001 + * Cisco, Motorola, and IBM + * + * This file is part of the SCTP kernel reference Implementation + * + * These are the definitions needed for the command object. + * + * The SCTP reference implementation 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. + * + * the SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to one of the + * following email addresses: + * + * La Monte H.P. Yarroll + * Karl Knutson + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + + +#ifndef __net_sctp_command_h__ +#define __net_sctp_command_h__ + +#include +#include + + +typedef enum { + SCTP_CMD_NOP = 0, /* Do nothing. */ + SCTP_CMD_NEW_ASOC, /* Register a new association. */ + SCTP_CMD_DELETE_TCB, /* Delete the current association. */ + SCTP_CMD_NEW_STATE, /* Enter a new state. */ + SCTP_CMD_REPORT_TSN, /* Record the arrival of a TSN. */ + SCTP_CMD_GEN_SACK, /* Send a Selective ACK (maybe). */ + SCTP_CMD_PROCESS_SACK, /* Process an inbound SACK. */ + SCTP_CMD_GEN_INIT_ACK, /* Generate an INIT ACK chunk. */ + SCTP_CMD_PEER_INIT, /* Process a INIT from the peer. */ + SCTP_CMD_GEN_COOKIE_ECHO, /* Generate a COOKIE ECHO chunk. */ + SCTP_CMD_CHUNK_ULP, /* Send a chunk to the sockets layer. */ + SCTP_CMD_EVENT_ULP, /* Send a notification to the sockets layer. */ + SCTP_CMD_REPLY, /* Send a chunk to our peer. */ + SCTP_CMD_SEND_PKT, /* Send a full packet to our peer. */ + SCTP_CMD_RETRAN, /* Mark a transport for retransmission. */ + SCTP_CMD_ECN_CE, /* Do delayed CE processing. */ + SCTP_CMD_ECN_ECNE, /* Do delayed ECNE processing. */ + SCTP_CMD_ECN_CWR, /* Do delayed CWR processing. */ + SCTP_CMD_TIMER_START, /* Start a timer. */ + SCTP_CMD_TIMER_RESTART, /* Restart a timer. */ + SCTP_CMD_TIMER_STOP, /* Stop a timer. */ + SCTP_CMD_COUNTER_RESET, /* Reset a counter. */ + SCTP_CMD_COUNTER_INC, /* Increment a counter. */ + SCTP_CMD_INIT_RESTART, /* High level, do init timer work. */ + SCTP_CMD_INIT_FAILED, /* High level, do init failure work. */ + SCTP_CMD_REPORT_DUP, /* Report a duplicate TSN. */ + SCTP_CMD_STRIKE, /* Mark a strike against a transport. */ + SCTP_CMD_TRANSMIT, /* Transmit the outqueue. */ + SCTP_CMD_HB_TIMERS_START, /* Start the heartbeat timers. */ + SCTP_CMD_HB_TIMER_UPDATE, /* Update a heartbeat timers. */ + SCTP_CMD_HB_TIMERS_STOP, /* Stop the heartbeat timers. */ + SCTP_CMD_TRANSPORT_RESET, /* Reset the status of a transport. */ + SCTP_CMD_TRANSPORT_ON, /* Mark the transport as active. */ + SCTP_CMD_REPORT_ERROR, /* Pass this error back out of the sm. */ + SCTP_CMD_REPORT_BAD_TAG, /* Verification tags didn't match. */ + SCTP_CMD_PROCESS_CTSN, /* Sideeffect from shutdown. */ + SCTP_CMD_ASSOC_FAILED, /* Handle association failure. */ + SCTP_CMD_DISCARD_PACKET, /* Discard the whole packet. */ + SCTP_CMD_GEN_SHUTDOWN, /* Generate a SHUTDOWN chunk. */ + SCTP_CMD_UPDATE_ASSOC, /* Update association information. */ + SCTP_CMD_PURGE_OUTQUEUE, /* Purge all data waiting to be sent. */ + SCTP_CMD_SETUP_T2, /* Hi-level, setup T2-shutdown parms. */ + SCTP_CMD_RTO_PENDING, /* Set transport's rto_pending. */ + SCTP_CMD_PART_DELIVER, /* Partial data delivery considerations. */ + SCTP_CMD_RENEGE, /* Renege data on an association. */ + SCTP_CMD_LAST +} sctp_verb_t; + +#define SCTP_CMD_MAX (SCTP_CMD_LAST - 1) +#define SCTP_CMD_NUM_VERBS (SCTP_CMD_MAX + 1) + +/* How many commands can you put in an sctp_cmd_seq_t? + * This is a rather arbitrary number, ideally derived from a careful + * analysis of the state functions, but in reality just taken from + * thin air in the hopes othat we don't trigger a kernel panic. + */ +#define SCTP_MAX_NUM_COMMANDS 14 + +typedef union { + __s32 i32; + __u32 u32; + __u16 u16; + __u8 u8; + int error; + sctp_state_t state; + sctp_event_timeout_t to; + sctp_counter_t counter; + void *ptr; + struct sctp_chunk *chunk; + struct sctp_association *asoc; + struct sctp_transport *transport; + struct sctp_bind_addr *bp; + sctp_init_chunk_t *init; + struct sctp_ulpevent *ulpevent; + struct sctp_packet *packet; + sctp_sackhdr_t *sackh; +} sctp_arg_t; + +/* We are simulating ML type constructors here. + * + * SCTP_ARG_CONSTRUCTOR(NAME, TYPE, ELT) builds a function called + * SCTP_NAME() which takes an argument of type TYPE and returns an + * sctp_arg_t. It does this by inserting the sole argument into the + * ELT union element of a local sctp_arg_t. + * + * E.g., SCTP_ARG_CONSTRUCTOR(I32, __s32, i32) builds SCTP_I32(arg), + * which takes an __s32 and returns a sctp_arg_t containing the + * __s32. So, after foo = SCTP_I32(arg), foo.i32 == arg. + */ +static inline sctp_arg_t SCTP_NULL(void) +{ + sctp_arg_t retval; retval.ptr = NULL; return retval; +} +static inline sctp_arg_t SCTP_NOFORCE(void) +{ + sctp_arg_t retval; retval.i32 = 0; return retval; +} +static inline sctp_arg_t SCTP_FORCE(void) +{ + sctp_arg_t retval; retval.i32 = 1; return retval; +} + +#define SCTP_ARG_CONSTRUCTOR(name, type, elt) \ +static inline sctp_arg_t \ +SCTP_## name (type arg) \ +{ sctp_arg_t retval; retval.elt = arg; return retval; } + +SCTP_ARG_CONSTRUCTOR(I32, __s32, i32) +SCTP_ARG_CONSTRUCTOR(U32, __u32, u32) +SCTP_ARG_CONSTRUCTOR(U16, __u16, u16) +SCTP_ARG_CONSTRUCTOR(U8, __u8, u8) +SCTP_ARG_CONSTRUCTOR(ERROR, int, error) +SCTP_ARG_CONSTRUCTOR(STATE, sctp_state_t, state) +SCTP_ARG_CONSTRUCTOR(COUNTER, sctp_counter_t, counter) +SCTP_ARG_CONSTRUCTOR(TO, sctp_event_timeout_t, to) +SCTP_ARG_CONSTRUCTOR(PTR, void *, ptr) +SCTP_ARG_CONSTRUCTOR(CHUNK, struct sctp_chunk *, chunk) +SCTP_ARG_CONSTRUCTOR(ASOC, struct sctp_association *, asoc) +SCTP_ARG_CONSTRUCTOR(TRANSPORT, struct sctp_transport *, transport) +SCTP_ARG_CONSTRUCTOR(BA, struct sctp_bind_addr *, bp) +SCTP_ARG_CONSTRUCTOR(PEER_INIT, sctp_init_chunk_t *, init) +SCTP_ARG_CONSTRUCTOR(ULPEVENT, struct sctp_ulpevent *, ulpevent) +SCTP_ARG_CONSTRUCTOR(PACKET, struct sctp_packet *, packet) +SCTP_ARG_CONSTRUCTOR(SACKH, sctp_sackhdr_t *, sackh) + +typedef struct { + sctp_arg_t obj; + sctp_verb_t verb; +} sctp_cmd_t; + +typedef struct { + sctp_cmd_t cmds[SCTP_MAX_NUM_COMMANDS]; + __u8 next_free_slot; + __u8 next_cmd; +} sctp_cmd_seq_t; + + +/* Create a new sctp_command_sequence. + * Return NULL if creating a new sequence fails. + */ +sctp_cmd_seq_t *sctp_new_cmd_seq(int gfp); + +/* Initialize a block of memory as a command sequence. + * Return 0 if the initialization fails. + */ +int sctp_init_cmd_seq(sctp_cmd_seq_t *seq); + +/* Add a command to an sctp_cmd_seq_t. + * Return 0 if the command sequence is full. + * + * Use the SCTP_* constructors defined by SCTP_ARG_CONSTRUCTOR() above + * to wrap data which goes in the obj argument. + */ +int sctp_add_cmd(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj); + +/* Rewind an sctp_cmd_seq_t to iterate from the start. + * Return 0 if the rewind fails. + */ +int sctp_rewind_sequence(sctp_cmd_seq_t *seq); + +/* Return the next command structure in an sctp_cmd_seq. + * Return NULL at the end of the sequence. + */ +sctp_cmd_t *sctp_next_cmd(sctp_cmd_seq_t *seq); + +/* Dispose of a command sequence. */ +void sctp_free_cmd_seq(sctp_cmd_seq_t *seq); + +#endif /* __net_sctp_command_h__ */ + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/compat.h linux-2.4.23-pre8/include/net/sctp/compat.h --- linux-2.4.22/include/net/sctp/compat.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/compat.h 2003-10-22 22:47:29.000000000 +0000 @@ -0,0 +1,102 @@ +/* SCTP kernel reference Implementation + * + * Copyright (c) 2003 Hewlett-Packard Company + * + * This file is part of the SCTP kernel reference Implementation + * + * This header represents the structures and constants needed to backport + * lksctp from Linux kernel 2.5 to 2.4 This file also has some code that + * has been taken from the source base of Linux kernel 2.5 + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#ifndef __net_sctp_compat_h__ +#define __net_sctp_compat_h__ + +#include +#include +#include +#include + +/* + * The following defines are for compatibility with 2.5 + */ +/* + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +#define DEFINE_SNMP_STAT(type, name) \ + type name[NR_CPUS * 2] +#define DECLARE_SNMP_STAT(type, name) \ + extern type name[] +#define SNMP_DEC_STATS(mib, field) ((mib)[2*smp_processor_id()+!in_softirq()].field--) + +#define sctp_sk(__sk) (&(((struct sock *)__sk)->tp_pinfo.af_sctp)) +#define inet_sk(__sk) (&(((struct sock *)__sk)->protinfo.af_inet)) +#define inet6_sk(__sk) (&(((struct sock *)__sk)->net_pinfo.af_inet6)) + +#define virt_addr_valid(x) VALID_PAGE(virt_to_page((x))) +#define sock_owned_by_user(sk) ((sk)->lock.users) +#define sk_set_owner(x, y) +#define __unsafe(x) MOD_INC_USE_COUNT +#define dst_pmtu(x) ((x)->pmtu) + +void sctp_hash_digest(const char *key, const int in_key_len, + const char *text, const int text_len, + __u8 *digest); +/* + * find last bit set. + */ +static __inline__ int fls(int x) +{ + int r = 32; + + if (!x) + return 0; + if (!(x & 0xffff0000u)) { + x <<= 16; + r -= 16; + } + if (!(x & 0xff000000u)) { + x <<= 8; + r -= 8; + } + if (!(x & 0xf0000000u)) { + x <<= 4; + r -= 4; + } + if (!(x & 0xc0000000u)) { + x <<= 2; + r -= 2; + } + if (!(x & 0x80000000u)) { + x <<= 1; + r -= 1; + } + return r; +} + +#endif /* __net_sctp_compat_h__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/constants.h linux-2.4.23-pre8/include/net/sctp/constants.h --- linux-2.4.22/include/net/sctp/constants.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/constants.h 2003-10-22 22:47:29.000000000 +0000 @@ -0,0 +1,439 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001-2002 International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Randall Stewart + * Ken Morneau + * Qiaobing Xie + * Xingang Guo + * Sridhar Samudrala + * Daisy Chang + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#ifndef __sctp_constants_h__ +#define __sctp_constants_h__ + +#include /* For TCP states used in sctp_sock_state_t */ +#include +#include /* For ipv6hdr. */ +#include + +/* Value used for stream negotiation. */ +enum { SCTP_MAX_STREAM = 0xffff }; +enum { SCTP_DEFAULT_OUTSTREAMS = 10 }; +enum { SCTP_DEFAULT_INSTREAMS = SCTP_MAX_STREAM }; + +/* Define the amount of space to reserve for SCTP, IP, LL. + * There is a little bit of waste that we are always allocating + * for ipv6 headers, but this seems worth the simplicity. + */ + +#define SCTP_IP_OVERHEAD ((sizeof(struct sctphdr)\ + + sizeof(struct ipv6hdr)\ + + MAX_HEADER)) + +/* Since CIDs are sparse, we need all four of the following + * symbols. CIDs are dense through SCTP_CID_BASE_MAX. + */ +#define SCTP_CID_BASE_MAX SCTP_CID_SHUTDOWN_COMPLETE +#define SCTP_CID_MAX SCTP_CID_ASCONF_ACK + +#define SCTP_NUM_BASE_CHUNK_TYPES (SCTP_CID_BASE_MAX + 1) +#define SCTP_NUM_CHUNK_TYPES (SCTP_NUM_BASE_CHUNKTYPES + 2) + + +/* These are the different flavours of event. */ +typedef enum { + + SCTP_EVENT_T_CHUNK = 1, + SCTP_EVENT_T_TIMEOUT, + SCTP_EVENT_T_OTHER, + SCTP_EVENT_T_PRIMITIVE + +} sctp_event_t; + +#define SCTP_EVENT_T_MAX SCTP_EVENT_T_PRIMITIVE +#define SCTP_EVENT_T_NUM (SCTP_EVENT_T_MAX + 1) + +/* As a convenience for the state machine, we append SCTP_EVENT_* and + * SCTP_ULP_* to the list of possible chunks. + */ + +typedef enum { + SCTP_EVENT_TIMEOUT_NONE = 0, + SCTP_EVENT_TIMEOUT_T1_COOKIE, + SCTP_EVENT_TIMEOUT_T1_INIT, + SCTP_EVENT_TIMEOUT_T2_SHUTDOWN, + SCTP_EVENT_TIMEOUT_T3_RTX, + SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD, + SCTP_EVENT_TIMEOUT_HEARTBEAT, + SCTP_EVENT_TIMEOUT_SACK, + SCTP_EVENT_TIMEOUT_AUTOCLOSE, +} sctp_event_timeout_t; + +#define SCTP_EVENT_TIMEOUT_MAX SCTP_EVENT_TIMEOUT_AUTOCLOSE +#define SCTP_NUM_TIMEOUT_TYPES (SCTP_EVENT_TIMEOUT_MAX + 1) + +typedef enum { + SCTP_EVENT_NO_PENDING_TSN = 0, +} sctp_event_other_t; + +#define SCTP_EVENT_OTHER_MAX SCTP_EVENT_NO_PENDING_TSN +#define SCTP_NUM_OTHER_TYPES (SCTP_EVENT_OTHER_MAX + 1) + +/* These are primitive requests from the ULP. */ +typedef enum { + SCTP_PRIMITIVE_ASSOCIATE = 0, + SCTP_PRIMITIVE_SHUTDOWN, + SCTP_PRIMITIVE_ABORT, + SCTP_PRIMITIVE_SEND, + SCTP_PRIMITIVE_REQUESTHEARTBEAT, +} sctp_event_primitive_t; + +#define SCTP_EVENT_PRIMITIVE_MAX SCTP_PRIMITIVE_REQUESTHEARTBEAT +#define SCTP_NUM_PRIMITIVE_TYPES (SCTP_EVENT_PRIMITIVE_MAX + 1) + +/* We define here a utility type for manipulating subtypes. + * The subtype constructors all work like this: + * + * sctp_subtype_t foo = SCTP_ST_CHUNK(SCTP_CID_INIT); + */ + +typedef union { + sctp_cid_t chunk; + sctp_event_timeout_t timeout; + sctp_event_other_t other; + sctp_event_primitive_t primitive; +} sctp_subtype_t; + +#define SCTP_SUBTYPE_CONSTRUCTOR(_name, _type, _elt) \ +static inline sctp_subtype_t \ +SCTP_ST_## _name (_type _arg) \ +{ sctp_subtype_t _retval; _retval._elt = _arg; return _retval; } + +SCTP_SUBTYPE_CONSTRUCTOR(CHUNK, sctp_cid_t, chunk) +SCTP_SUBTYPE_CONSTRUCTOR(TIMEOUT, sctp_event_timeout_t, timeout) +SCTP_SUBTYPE_CONSTRUCTOR(OTHER, sctp_event_other_t, other) +SCTP_SUBTYPE_CONSTRUCTOR(PRIMITIVE, sctp_event_primitive_t, primitive) + + +#define sctp_chunk_is_control(a) (a->chunk_hdr->type != SCTP_CID_DATA) +#define sctp_chunk_is_data(a) (a->chunk_hdr->type == SCTP_CID_DATA) + +/* Calculate the actual data size in a data chunk */ +#define SCTP_DATA_SNDSIZE(c) ((int)((unsigned long)(c->chunk_end)\ + - (unsigned long)(c->chunk_hdr)\ + - sizeof(sctp_data_chunk_t))) + +/* This is a table of printable names of sctp_param_t's. */ +extern const char *sctp_param_tbl[]; + + +#define SCTP_MAX_ERROR_CAUSE SCTP_ERROR_NONEXIST_IP +#define SCTP_NUM_ERROR_CAUSE 10 + +/* Internal error codes */ +typedef enum { + + SCTP_IERROR_NO_ERROR = 0, + SCTP_IERROR_BASE = 1000, + SCTP_IERROR_NO_COOKIE, + SCTP_IERROR_BAD_SIG, + SCTP_IERROR_STALE_COOKIE, + SCTP_IERROR_NOMEM, + SCTP_IERROR_MALFORMED, + SCTP_IERROR_BAD_TAG, + SCTP_IERROR_BIG_GAP, + SCTP_IERROR_DUP_TSN, + +} sctp_ierror_t; + + + +/* SCTP state defines for internal state machine */ +typedef enum { + + SCTP_STATE_EMPTY = 0, + SCTP_STATE_CLOSED = 1, + SCTP_STATE_COOKIE_WAIT = 2, + SCTP_STATE_COOKIE_ECHOED = 3, + SCTP_STATE_ESTABLISHED = 4, + SCTP_STATE_SHUTDOWN_PENDING = 5, + SCTP_STATE_SHUTDOWN_SENT = 6, + SCTP_STATE_SHUTDOWN_RECEIVED = 7, + SCTP_STATE_SHUTDOWN_ACK_SENT = 8, + +} sctp_state_t; + +#define SCTP_STATE_MAX SCTP_STATE_SHUTDOWN_ACK_SENT +#define SCTP_STATE_NUM_STATES (SCTP_STATE_MAX + 1) + +/* These are values for sk->state. + * For a UDP-style SCTP socket, the states are defined as follows + * - A socket in SCTP_SS_CLOSED state indicates that it is not willing to + * accept new associations, but it can initiate the creation of new ones. + * - A socket in SCTP_SS_LISTENING state indicates that it is willing to + * accept new associations and can initiate the creation of new ones. + * - A socket in SCTP_SS_ESTABLISHED state indicates that it is a peeled off + * socket with one association. + * For a TCP-style SCTP socket, the states are defined as follows + * - A socket in SCTP_SS_CLOSED state indicates that it is not willing to + * accept new associations, but it can initiate the creation of new ones. + * - A socket in SCTP_SS_LISTENING state indicates that it is willing to + * accept new associations, but cannot initiate the creation of new ones. + * - A socket in SCTP_SS_ESTABLISHED state indicates that it has a single + * association. + */ +typedef enum { + SCTP_SS_CLOSED = TCP_CLOSE, + SCTP_SS_LISTENING = TCP_LISTEN, + SCTP_SS_ESTABLISHING = TCP_SYN_SENT, + SCTP_SS_ESTABLISHED = TCP_ESTABLISHED, + SCTP_SS_DISCONNECTING = TCP_CLOSING, +} sctp_sock_state_t; + +/* These functions map various type to printable names. */ +const char *sctp_cname(const sctp_subtype_t); /* chunk types */ +const char *sctp_oname(const sctp_subtype_t); /* other events */ +const char *sctp_tname(const sctp_subtype_t); /* timeouts */ +const char *sctp_pname(const sctp_subtype_t); /* primitives */ + +/* This is a table of printable names of sctp_state_t's. */ +extern const char *sctp_state_tbl[], *sctp_evttype_tbl[], *sctp_status_tbl[]; + +/* SCTP reachability state for each address */ +#define SCTP_ADDR_NOHB 4 +#define SCTP_ADDR_REACHABLE 2 +#define SCTP_ADDR_NOT_REACHABLE 1 + +/* Maximum chunk length considering padding requirements. */ +enum { SCTP_MAX_CHUNK_LEN = ((1<<16) - sizeof(__u32)) }; + +/* Encourage Cookie-Echo bundling by pre-fragmenting chunks a little + * harder (until reaching ESTABLISHED state). + */ +enum { SCTP_ARBITRARY_COOKIE_ECHO_LEN = 200 }; + +/* Guess at how big to make the TSN mapping array. + * We guarantee that we can handle at least this big a gap between the + * cumulative ACK and the highest TSN. In practice, we can often + * handle up to twice this value. + * + * NEVER make this more than 32767 (2^15-1). The Gap Ack Blocks in a + * SACK (see section 3.3.4) are only 16 bits, so 2*SCTP_TSN_MAP_SIZE + * must be less than 65535 (2^16 - 1), or we will have overflow + * problems creating SACK's. + */ +#define SCTP_TSN_MAP_SIZE 2048 +#define SCTP_TSN_MAX_GAP 65535 + +/* We will not record more than this many duplicate TSNs between two + * SACKs. The minimum PMTU is 576. Remove all the headers and there + * is enough room for 131 duplicate reports. Round down to the + * nearest power of 2. + */ +enum { SCTP_MIN_PMTU = 576 }; +enum { SCTP_MAX_DUP_TSNS = 128 }; + +typedef enum { + SCTP_COUNTER_INIT_ERROR, +} sctp_counter_t; + +/* How many counters does an association need? */ +#define SCTP_NUMBER_COUNTERS 5 + +/* Here we define the default timers. */ + +/* cookie timer def = ? seconds */ +#define SCTP_DEFAULT_TIMEOUT_T1_COOKIE (3 * HZ) + +/* init timer def = 3 seconds */ +#define SCTP_DEFAULT_TIMEOUT_T1_INIT (3 * HZ) + +/* shutdown timer def = 300 ms */ +#define SCTP_DEFAULT_TIMEOUT_T2_SHUTDOWN ((300 * HZ) / 1000) + +/* 0 seconds + RTO */ +#define SCTP_DEFAULT_TIMEOUT_HEARTBEAT (10 * HZ) + +/* recv timer def = 200ms (in usec) */ +#define SCTP_DEFAULT_TIMEOUT_SACK ((200 * HZ) / 1000) +#define SCTP_DEFAULT_TIMEOUT_SACK_MAX ((500 * HZ) / 1000) /* 500 ms */ + +/* RTO.Initial - 3 seconds + * RTO.Min - 1 second + * RTO.Max - 60 seconds + * RTO.Alpha - 1/8 + * RTO.Beta - 1/4 + */ +#define SCTP_RTO_INITIAL (3 * HZ) +#define SCTP_RTO_MIN (1 * HZ) +#define SCTP_RTO_MAX (60 * HZ) + +#define SCTP_RTO_ALPHA 3 /* 1/8 when converted to right shifts. */ +#define SCTP_RTO_BETA 2 /* 1/4 when converted to right shifts. */ + +/* Maximum number of new data packets that can be sent in a burst. */ +#define SCTP_MAX_BURST 4 + +#define SCTP_CLOCK_GRANULARITY 1 /* 1 jiffy */ + +#define SCTP_DEF_MAX_INIT 6 +#define SCTP_DEF_MAX_SEND 10 + +#define SCTP_DEFAULT_COOKIE_LIFE_SEC 60 /* seconds */ +#define SCTP_DEFAULT_COOKIE_LIFE_USEC 0 /* microseconds */ + +#define SCTP_DEFAULT_MINWINDOW 1500 /* default minimum rwnd size */ +#define SCTP_DEFAULT_MAXWINDOW 32768 /* default rwnd size */ +#define SCTP_DEFAULT_MAXSEGMENT 1500 /* MTU size, this is the limit + * to which we will raise the P-MTU. + */ +#define SCTP_DEFAULT_MINSEGMENT 512 /* MTU size ... if no mtu disc */ +#define SCTP_HOW_MANY_SECRETS 2 /* How many secrets I keep */ +#define SCTP_HOW_LONG_COOKIE_LIVE 3600 /* How many seconds the current + * secret will live? + */ +#define SCTP_SECRET_SIZE 32 /* Number of octets in a 256 bits. */ + +#define SCTP_SIGNATURE_SIZE 20 /* size of a SLA-1 signature */ + +#define SCTP_COOKIE_MULTIPLE 32 /* Pad out our cookie to make our hash + * functions simpler to write. + */ + +#if defined (CONFIG_SCTP_HMAC_MD5) +#define SCTP_COOKIE_HMAC_ALG "md5" +#elif defined (CONFIG_SCTP_HMAC_SHA1) +#define SCTP_COOKIE_HMAC_ALG "sha1" +#else +#define SCTP_COOKIE_HMAC_ALG NULL +#endif + +/* These return values describe the success or failure of a number of + * routines which form the lower interface to SCTP_outqueue. + */ +typedef enum { + SCTP_XMIT_OK, + SCTP_XMIT_PMTU_FULL, + SCTP_XMIT_RWND_FULL, + SCTP_XMIT_MUST_FRAG, + SCTP_XMIT_NAGLE_DELAY, +} sctp_xmit_t; + +/* These are the commands for manipulating transports. */ +typedef enum { + SCTP_TRANSPORT_UP, + SCTP_TRANSPORT_DOWN, +} sctp_transport_cmd_t; + +/* These are the address scopes defined mainly for IPv4 addresses + * based on draft of SCTP IPv4 scoping . + * These scopes are hopefully generic enough to be used on scoping both + * IPv4 and IPv6 addresses in SCTP. + * At this point, the IPv6 scopes will be mapped to these internal scopes + * as much as possible. + */ +typedef enum { + SCTP_SCOPE_GLOBAL, /* IPv4 global addresses */ + SCTP_SCOPE_PRIVATE, /* IPv4 private addresses */ + SCTP_SCOPE_LINK, /* IPv4 link local address */ + SCTP_SCOPE_LOOPBACK, /* IPv4 loopback address */ + SCTP_SCOPE_UNUSABLE, /* IPv4 unusable addresses */ +} sctp_scope_t; + +/* Based on IPv4 scoping , + * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 198.18.0.0/24, + * 192.88.99.0/24. + * Also, RFC 8.4, non-unicast addresses are not considered valid SCTP + * addresses. + */ +#define IS_IPV4_UNUSABLE_ADDRESS(a) \ + ((INADDR_BROADCAST == *a) || \ + (MULTICAST(*a)) || \ + (((unsigned char *)(a))[0] == 0) || \ + ((((unsigned char *)(a))[0] == 198) && \ + (((unsigned char *)(a))[1] == 18) && \ + (((unsigned char *)(a))[2] == 0)) || \ + ((((unsigned char *)(a))[0] == 192) && \ + (((unsigned char *)(a))[1] == 88) && \ + (((unsigned char *)(a))[2] == 99))) + +/* IPv4 Link-local addresses: 169.254.0.0/16. */ +#define IS_IPV4_LINK_ADDRESS(a) \ + ((((unsigned char *)(a))[0] == 169) && \ + (((unsigned char *)(a))[1] == 254)) + +/* RFC 1918 "Address Allocation for Private Internets" defines the IPv4 + * private address space as the following: + * + * 10.0.0.0 - 10.255.255.255 (10/8 prefix) + * 172.16.0.0.0 - 172.31.255.255 (172.16/12 prefix) + * 192.168.0.0 - 192.168.255.255 (192.168/16 prefix) + */ +#define IS_IPV4_PRIVATE_ADDRESS(a) \ + ((((unsigned char *)(a))[0] == 10) || \ + ((((unsigned char *)(a))[0] == 172) && \ + (((unsigned char *)(a))[1] >= 16) && \ + (((unsigned char *)(a))[1] < 32)) || \ + ((((unsigned char *)(a))[0] == 192) && \ + (((unsigned char *)(a))[1] == 168))) + +/* Flags used for the bind address copy functions. */ +#define SCTP_ADDR6_ALLOWED 0x00000001 /* IPv6 address is allowed by + local sock family */ +#define SCTP_ADDR4_PEERSUPP 0x00000002 /* IPv4 address is supported by + peer */ +#define SCTP_ADDR6_PEERSUPP 0x00000004 /* IPv6 address is supported by + peer */ + +/* Reasons to retransmit. */ +typedef enum { + SCTP_RTXR_T3_RTX, + SCTP_RTXR_FAST_RTX, + SCTP_RTXR_PMTUD, +} sctp_retransmit_reason_t; + +/* Reasons to lower cwnd. */ +typedef enum { + SCTP_LOWER_CWND_T3_RTX, + SCTP_LOWER_CWND_FAST_RTX, + SCTP_LOWER_CWND_ECNE, + SCTP_LOWER_CWND_INACTIVE, +} sctp_lower_cwnd_t; + +#endif /* __sctp_constants_h__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/sctp.h linux-2.4.23-pre8/include/net/sctp/sctp.h --- linux-2.4.22/include/net/sctp/sctp.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/sctp.h 2003-10-22 22:48:24.000000000 +0000 @@ -0,0 +1,556 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines, Corp. + * Copyright (c) 2001-2003 Intel Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * The base lksctp header. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Xingang Guo + * Jon Grimm + * Daisy Chang + * Sridhar Samudrala + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#ifndef __net_sctp_h__ +#define __net_sctp_h__ + +/* Header Strategy. + * Start getting some control over the header file depencies: + * includes + * constants + * structs + * prototypes + * macros, externs, and inlines + * + * Move test_frame specific items out of the kernel headers + * and into the test frame headers. This is not perfect in any sense + * and will continue to evolve. + */ + + +#include + +#ifdef TEST_FRAME +#undef CONFIG_PROC_FS +#undef CONFIG_SCTP_DBG_OBJCNT +#undef CONFIG_SYSCTL +#endif /* TEST_FRAME */ + +#include +#include +#include +#include +#include +#include +#include + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Set SCTP_DEBUG flag via config if not already set. */ +#ifndef SCTP_DEBUG +#ifdef CONFIG_SCTP_DBG_MSG +#define SCTP_DEBUG 1 +#else +#define SCTP_DEBUG 0 +#endif /* CONFIG_SCTP_DBG */ +#endif /* SCTP_DEBUG */ + +#ifdef CONFIG_IP_SCTP_MODULE +#define SCTP_PROTOSW_FLAG 0 +#else /* static! */ +#define SCTP_PROTOSW_FLAG INET_PROTOSW_PERMANENT +#endif + + +/* Certain internal static functions need to be exported when + * compiled into the test frame. + */ +#ifndef SCTP_STATIC +#define SCTP_STATIC static +#endif + +/* + * Function declarations. + */ + +/* + * sctp_protocol.c + */ +extern struct sctp_protocol sctp_proto; +extern struct sock *sctp_get_ctl_sock(void); +extern int sctp_copy_local_addr_list(struct sctp_protocol *, + struct sctp_bind_addr *, + sctp_scope_t, int gfp, int flags); +extern struct sctp_pf *sctp_get_pf_specific(sa_family_t family); +extern int sctp_register_pf(struct sctp_pf *, sa_family_t); + +/* + * sctp/socket.c + */ +extern int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb); +extern int sctp_inet_listen(struct socket *sock, int backlog); +extern void sctp_write_space(struct sock *sk); +extern unsigned int sctp_poll(struct file *file, struct socket *sock, + poll_table *wait); + +/* + * sctp/primitive.c + */ +extern int sctp_primitive_ASSOCIATE(struct sctp_association *, void *arg); +extern int sctp_primitive_SHUTDOWN(struct sctp_association *, void *arg); +extern int sctp_primitive_ABORT(struct sctp_association *, void *arg); +extern int sctp_primitive_SEND(struct sctp_association *, void *arg); +extern int sctp_primitive_REQUESTHEARTBEAT(struct sctp_association *, void *arg); + +/* + * sctp/crc32c.c + */ +extern __u32 sctp_start_cksum(__u8 *ptr, __u16 count); +extern __u32 sctp_update_cksum(__u8 *ptr, __u16 count, __u32 cksum); +extern __u32 sctp_end_cksum(__u32 cksum); +extern __u32 sctp_update_copy_cksum(__u8 *, __u8 *, __u16 count, __u32 cksum); + +/* + * sctp/input.c + */ +extern int sctp_rcv(struct sk_buff *skb); +extern void sctp_v4_err(struct sk_buff *skb, u32 info); +extern void sctp_hash_established(struct sctp_association *); +extern void __sctp_hash_established(struct sctp_association *); +extern void sctp_unhash_established(struct sctp_association *); +extern void __sctp_unhash_established(struct sctp_association *); +extern void sctp_hash_endpoint(struct sctp_endpoint *); +extern void __sctp_hash_endpoint(struct sctp_endpoint *); +extern void sctp_unhash_endpoint(struct sctp_endpoint *); +extern void __sctp_unhash_endpoint(struct sctp_endpoint *); +extern struct sctp_association *__sctp_lookup_association( + const union sctp_addr *, + const union sctp_addr *, + struct sctp_transport **); +extern struct sock *sctp_err_lookup(int family, struct sk_buff *, + struct sctphdr *, struct sctp_endpoint **, + struct sctp_association **, + struct sctp_transport **); +extern void sctp_err_finish(struct sock *, struct sctp_endpoint *, + struct sctp_association *); +extern void sctp_icmp_frag_needed(struct sock *, struct sctp_association *, + struct sctp_transport *t, __u32 pmtu); + +/* + * Section: Macros, externs, and inlines + */ + + +#ifdef TEST_FRAME +#include +#else + +/* spin lock wrappers. */ +#define sctp_spin_lock_irqsave(lock, flags) spin_lock_irqsave(lock, flags) +#define sctp_spin_unlock_irqrestore(lock, flags) \ + spin_unlock_irqrestore(lock, flags) +#define sctp_local_bh_disable() local_bh_disable() +#define sctp_local_bh_enable() local_bh_enable() +#define sctp_spin_lock(lock) spin_lock(lock) +#define sctp_spin_unlock(lock) spin_unlock(lock) +#define sctp_write_lock(lock) write_lock(lock) +#define sctp_write_unlock(lock) write_unlock(lock) +#define sctp_read_lock(lock) read_lock(lock) +#define sctp_read_unlock(lock) read_unlock(lock) + +/* sock lock wrappers. */ +#define sctp_lock_sock(sk) lock_sock(sk) +#define sctp_release_sock(sk) release_sock(sk) +#define sctp_bh_lock_sock(sk) bh_lock_sock(sk) +#define sctp_bh_unlock_sock(sk) bh_unlock_sock(sk) +#define SCTP_SOCK_SLEEP_PRE(sk) SOCK_SLEEP_PRE(sk) +#define SCTP_SOCK_SLEEP_POST(sk) SOCK_SLEEP_POST(sk) + +/* SCTP SNMP MIB stats handlers */ +DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics); +#define SCTP_INC_STATS(field) SNMP_INC_STATS(sctp_statistics, field) +#define SCTP_INC_STATS_BH(field) SNMP_INC_STATS_BH(sctp_statistics, field) +#define SCTP_INC_STATS_USER(field) SNMP_INC_STATS_USER(sctp_statistics, field) +#define SCTP_DEC_STATS(field) SNMP_DEC_STATS(sctp_statistics, field) + +/* Determine if this is a valid kernel address. */ +static inline int sctp_is_valid_kaddr(unsigned long addr) +{ + struct page *page; + + /* Make sure the address is not in the user address space. */ + if (addr < PAGE_OFFSET) + return 0; + + page = virt_to_page((void*)addr); + + /* Is this page valid? */ + if (!virt_addr_valid((void*)addr) || PageReserved(page)) + return 0; + + return 1; +} + +#endif /* !TEST_FRAME */ + + +/* Print debugging messages. */ +#if SCTP_DEBUG +extern int sctp_debug_flag; +#define SCTP_DEBUG_PRINTK(whatever...) \ + ((void) (sctp_debug_flag && printk(KERN_DEBUG whatever))) +#define SCTP_ENABLE_DEBUG { sctp_debug_flag = 1; } +#define SCTP_DISABLE_DEBUG { sctp_debug_flag = 0; } + +#define SCTP_ASSERT(expr, str, func) \ + if (!(expr)) { \ + SCTP_DEBUG_PRINTK("Assertion Failed: %s(%s) at %s:%s:%d\n", \ + str, (#expr), __FILE__, __FUNCTION__, __LINE__); \ + func; \ + } + +#else /* SCTP_DEBUG */ + +#define SCTP_DEBUG_PRINTK(whatever...) +#define SCTP_ENABLE_DEBUG +#define SCTP_DISABLE_DEBUG +#define SCTP_ASSERT(expr, str, func) + +#endif /* SCTP_DEBUG */ + + +/* + * Macros for keeping a global reference of object allocations. + */ +#ifdef CONFIG_SCTP_DBG_OBJCNT + +extern atomic_t sctp_dbg_objcnt_sock; +extern atomic_t sctp_dbg_objcnt_ep; +extern atomic_t sctp_dbg_objcnt_assoc; +extern atomic_t sctp_dbg_objcnt_transport; +extern atomic_t sctp_dbg_objcnt_chunk; +extern atomic_t sctp_dbg_objcnt_bind_addr; +extern atomic_t sctp_dbg_objcnt_addr; +extern atomic_t sctp_dbg_objcnt_ssnmap; + +/* Macros to atomically increment/decrement objcnt counters. */ +#define SCTP_DBG_OBJCNT_INC(name) \ +atomic_inc(&sctp_dbg_objcnt_## name) +#define SCTP_DBG_OBJCNT_DEC(name) \ +atomic_dec(&sctp_dbg_objcnt_## name) +#define SCTP_DBG_OBJCNT(name) \ +atomic_t sctp_dbg_objcnt_## name = ATOMIC_INIT(0) + +/* Macro to help create new entries in in the global array of + * objcnt counters. + */ +#define SCTP_DBG_OBJCNT_ENTRY(name) \ +{.label= #name, .counter= &sctp_dbg_objcnt_## name} + +extern void sctp_dbg_objcnt_init(void); +extern void sctp_dbg_objcnt_exit(void); + +#else + +#define SCTP_DBG_OBJCNT_INC(name) +#define SCTP_DBG_OBJCNT_DEC(name) + +static inline void sctp_dbg_objcnt_init(void) { return; } +static inline void sctp_dbg_objcnt_exit(void) { return; } + +#endif /* CONFIG_SCTP_DBG_OBJCOUNT */ + +#if defined CONFIG_SYSCTL +extern void sctp_sysctl_register(void); +extern void sctp_sysctl_unregister(void); +#else +static inline void sctp_sysctl_register(void) { return; } +static inline void sctp_sysctl_unregister(void) { return; } +#endif + +/* Size of Supported Address Parameter for 'x' address types. */ +#define SCTP_SAT_LEN(x) (sizeof(struct sctp_paramhdr) + (x) * sizeof(__u16)) + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + +extern int sctp_v6_init(void); +extern void sctp_v6_exit(void); +extern void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, + int type, int code, int offset, __u32 info); + +#else /* #ifdef defined(CONFIG_IPV6) */ + +static inline int sctp_v6_init(void) { return 0; } +static inline void sctp_v6_exit(void) { return; } + +#endif /* #if defined(CONFIG_IPV6) */ + +/* Some wrappers, in case crypto not available. */ +#if defined (CONFIG_CRYPTO_HMAC) +#define sctp_crypto_alloc_tfm crypto_alloc_tfm +#define sctp_crypto_free_tfm crypto_free_tfm +#define sctp_crypto_hmac crypto_hmac +#else +#define sctp_crypto_alloc_tfm(x...) NULL +#define sctp_crypto_free_tfm(x...) +#define sctp_crypto_hmac(x...) +#endif + + +/* Map an association to an assoc_id. */ +static inline sctp_assoc_t sctp_assoc2id(const struct sctp_association *asoc) +{ + return (sctp_assoc_t) asoc; +} + + +/* Look up the association by its id. */ +struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id); + + +/* A macro to walk a list of skbs. */ +#define sctp_skb_for_each(pos, head, tmp) \ +for (pos = (head)->next;\ + tmp = (pos)->next, pos != ((struct sk_buff *)(head));\ + pos = tmp) + + +/* A helper to append an entire skb list (list) to another (head). */ +static inline void sctp_skb_list_tail(struct sk_buff_head *list, + struct sk_buff_head *head) +{ + unsigned long flags; + + sctp_spin_lock_irqsave(&head->lock, flags); + sctp_spin_lock(&list->lock); + + list_splice((struct list_head *)list, (struct list_head *)head->prev); + + head->qlen += list->qlen; + list->qlen = 0; + + sctp_spin_unlock(&list->lock); + sctp_spin_unlock_irqrestore(&head->lock, flags); +} + +/** + * sctp_list_dequeue - remove from the head of the queue + * @list: list to dequeue from + * + * Remove the head of the list. The head item is + * returned or %NULL if the list is empty. + */ + +static inline struct list_head *sctp_list_dequeue(struct list_head *list) +{ + struct list_head *result = NULL; + + if (list->next != list) { + result = list->next; + list->next = result->next; + list->next->prev = list; + INIT_LIST_HEAD(result); + } + return result; +} + +/* Calculate the size (in bytes) occupied by the data of an iovec. */ +static inline size_t get_user_iov_size(struct iovec *iov, int iovlen) +{ + size_t retval = 0; + + for (; iovlen > 0; --iovlen) { + retval += iov->iov_len; + iov++; + } + + return retval; +} + +/* Generate a random jitter in the range of -50% ~ +50% of input RTO. */ +static inline __s32 sctp_jitter(__u32 rto) +{ + static __u32 sctp_rand; + __s32 ret; + + sctp_rand += jiffies; + sctp_rand ^= (sctp_rand << 12); + sctp_rand ^= (sctp_rand >> 20); + + /* Choose random number from 0 to rto, then move to -50% ~ +50% + * of rto. + */ + ret = sctp_rand % rto - (rto >> 1); + return ret; +} + +/* Break down data chunks at this point. */ +static inline int sctp_frag_point(int pmtu) +{ + pmtu -= SCTP_IP_OVERHEAD + sizeof(struct sctp_data_chunk); + pmtu -= sizeof(struct sctp_sack_chunk); + + return pmtu; +} + +/* Walk through a list of TLV parameters. Don't trust the + * individual parameter lengths and instead depend on + * the chunk length to indicate when to stop. Make sure + * there is room for a param header too. + */ +#define sctp_walk_params(pos, chunk, member)\ +_sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length), member) + +#define _sctp_walk_params(pos, chunk, end, member)\ +for (pos.v = chunk->member;\ + pos.v <= (void *)chunk + end - sizeof(sctp_paramhdr_t) &&\ + pos.v <= (void *)chunk + end - WORD_ROUND(ntohs(pos.p->length)); \ + pos.v += WORD_ROUND(ntohs(pos.p->length))) + +/* Round an int up to the next multiple of 4. */ +#define WORD_ROUND(s) (((s)+3)&~3) + +/* Make a new instance of type. */ +#define t_new(type, flags) (type *)kmalloc(sizeof(type), flags) + +/* Compare two timevals. */ +#define tv_lt(s, t) \ + (s.tv_sec < t.tv_sec || (s.tv_sec == t.tv_sec && s.tv_usec < t.tv_usec)) + +/* Stolen from net/profile.h. Using it from there is more grief than + * it is worth. + */ +static inline void tv_add(const struct timeval *entered, struct timeval *leaved) +{ + time_t usecs = leaved->tv_usec + entered->tv_usec; + time_t secs = leaved->tv_sec + entered->tv_sec; + + if (usecs >= 1000000) { + usecs -= 1000000; + secs++; + } + leaved->tv_sec = secs; + leaved->tv_usec = usecs; +} + + +/* External references. */ + +extern struct proto sctp_prot; +extern struct proc_dir_entry *proc_net_sctp; +extern void sctp_put_port(struct sock *sk); + +/* Static inline functions. */ + +/* Return the SCTP protocol structure. */ +static inline struct sctp_protocol *sctp_get_protocol(void) +{ + return &sctp_proto; +} + +/* Convert from an IP version number to an Address Family symbol. */ +static inline int ipver2af(__u8 ipver) +{ + switch (ipver) { + case 4: + return AF_INET; + case 6: + return AF_INET6; + default: + return 0; + }; +} + +/* Perform some sanity checks. */ +static inline int sctp_sanity_check(void) +{ + SCTP_ASSERT(sizeof(struct sctp_ulpevent) <= + sizeof(((struct sk_buff *)0)->cb), + "SCTP: ulpevent does not fit in skb!\n", return 0); + + return 1; +} + +/* Warning: The following hash functions assume a power of two 'size'. */ +/* This is the hash function for the SCTP port hash table. */ +static inline int sctp_phashfn(__u16 lport) +{ + struct sctp_protocol *sctp_proto = sctp_get_protocol(); + return (lport & (sctp_proto->port_hashsize - 1)); +} + +/* This is the hash function for the endpoint hash table. */ +static inline int sctp_ep_hashfn(__u16 lport) +{ + struct sctp_protocol *sctp_proto = sctp_get_protocol(); + return (lport & (sctp_proto->ep_hashsize - 1)); +} + +/* This is the hash function for the association hash table. */ +static inline int sctp_assoc_hashfn(__u16 lport, __u16 rport) +{ + struct sctp_protocol *sctp_proto = sctp_get_protocol(); + int h = (lport << 16) + rport; + h ^= h>>8; + return (h & (sctp_proto->assoc_hashsize - 1)); +} + +/* This is the hash function for the association hash table. This is + * not used yet, but could be used as a better hash function when + * we have a vtag. + */ +static inline int sctp_vtag_hashfn(__u16 lport, __u16 rport, __u32 vtag) +{ + struct sctp_protocol *sctp_proto = sctp_get_protocol(); + int h = (lport << 16) + rport; + h ^= vtag; + return (h & (sctp_proto->assoc_hashsize-1)); +} + +#endif /* __net_sctp_h__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/sla1.h linux-2.4.23-pre8/include/net/sctp/sla1.h --- linux-2.4.22/include/net/sctp/sla1.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/sla1.h 2003-10-22 22:48:14.000000000 +0000 @@ -0,0 +1,80 @@ +/* SCTP reference Implementation + * Copyright (C) 1999 Cisco, Inc. + * Copyright (C) 1999 Motorola, Inc. + * + * This file originates from Randy Stewart's SCTP reference Implementation. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Randy Stewart + * Ken Morneau + * Qiaobing Xie + */ + +#ifndef __SLA1_h__ +#define __SLA1_h__ + +struct SLA_1_Context { + unsigned int A; + unsigned int B; + unsigned int C; + unsigned int D; + unsigned int E; + unsigned int H0; + unsigned int H1; + unsigned int H2; + unsigned int H3; + unsigned int H4; + unsigned int words[80]; + unsigned int TEMP; + + /* block I am collecting to process */ + char SLAblock[64]; + + /* collected so far */ + int howManyInBlock; + unsigned int runningTotal; +}; + + +#define F1(B,C,D) (((B & C) | ((~B) & D))) /* 0 <= t <= 19 */ +#define F2(B,C,D) (B ^ C ^ D) /* 20 <= t <= 39 */ +#define F3(B,C,D) ((B & C) | (B & D) | (C & D)) /* 40 <= t <= 59 */ +#define F4(B,C,D) (B ^ C ^ D) /*600 <= t <= 79 */ +/* circular shift */ + +#define CSHIFT(A,B) ((B << A) | (B >> (32-A))) + +#define K1 0x5a827999 /* 0 <= t <= 19 */ +#define K2 0x6ed9eba1 /* 20 <= t <= 39 */ +#define K3 0x8f1bbcdc /* 40 <= t <= 59 */ +#define K4 0xca62c1d6 /* 60 <= t <= 79 */ + +#define H0INIT 0x67452301 +#define H1INIT 0xefcdab89 +#define H2INIT 0x98badcfe +#define H3INIT 0x10325476 +#define H4INIT 0xc3d2e1f0 + +extern void SLA1_Init(struct SLA_1_Context *); +extern void SLA1_Process(struct SLA_1_Context *, const unsigned char *, int); +extern void SLA1_Final(struct SLA_1_Context *, unsigned char *); + +#endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/sm.h linux-2.4.23-pre8/include/net/sctp/sm.h --- linux-2.4.22/include/net/sctp/sm.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/sm.h 2003-10-22 22:48:26.000000000 +0000 @@ -0,0 +1,480 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001-2002 International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * This file is part of the implementation of the add-IP extension, + * based on June 29, 2001, + * for the SCTP kernel reference Implementation. + * + * These are definitions needed by the state machine. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email addresses: + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Xingang Guo + * Jon Grimm + * Dajiang Zhang + * Sridhar Samudrala + * Daisy Chang + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + + +#include +#include +#include +#include +#include +#include + +#ifndef __sctp_sm_h__ +#define __sctp_sm_h__ + +/* + * Possible values for the disposition are: + */ +typedef enum { + SCTP_DISPOSITION_DISCARD, /* No further processing. */ + SCTP_DISPOSITION_CONSUME, /* Process return values normally. */ + SCTP_DISPOSITION_NOMEM, /* We ran out of memory--recover. */ + SCTP_DISPOSITION_DELETE_TCB, /* Close the association. */ + SCTP_DISPOSITION_ABORT, /* Close the association NOW. */ + SCTP_DISPOSITION_VIOLATION, /* The peer is misbehaving. */ + SCTP_DISPOSITION_NOT_IMPL, /* This entry is not implemented. */ + SCTP_DISPOSITION_ERROR, /* This is plain old user error. */ + SCTP_DISPOSITION_BUG, /* This is a bug. */ +} sctp_disposition_t; + +typedef struct { + int name; + int action; +} sctp_sm_command_t; + +typedef sctp_disposition_t (sctp_state_fn_t) (const struct sctp_endpoint *, + const struct sctp_association *, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *); +typedef void (sctp_timer_event_t) (unsigned long); +typedef struct { + sctp_state_fn_t *fn; + char *name; +} sctp_sm_table_entry_t; + +/* A naming convention of "sctp_sf_xxx" applies to all the state functions + * currently in use. + */ + +/* Prototypes for generic state functions. */ +sctp_state_fn_t sctp_sf_not_impl; +sctp_state_fn_t sctp_sf_bug; + +/* Prototypes for gener timer state functions. */ +sctp_state_fn_t sctp_sf_timer_ignore; + +/* Prototypes for chunk state functions. */ +sctp_state_fn_t sctp_sf_do_9_1_abort; +sctp_state_fn_t sctp_sf_cookie_wait_abort; +sctp_state_fn_t sctp_sf_cookie_echoed_abort; +sctp_state_fn_t sctp_sf_shutdown_pending_abort; +sctp_state_fn_t sctp_sf_shutdown_sent_abort; +sctp_state_fn_t sctp_sf_shutdown_ack_sent_abort; +sctp_state_fn_t sctp_sf_do_5_1B_init; +sctp_state_fn_t sctp_sf_do_5_1C_ack; +sctp_state_fn_t sctp_sf_do_5_1D_ce; +sctp_state_fn_t sctp_sf_do_5_1E_ca; +sctp_state_fn_t sctp_sf_do_4_C; +sctp_state_fn_t sctp_sf_eat_data_6_2; +sctp_state_fn_t sctp_sf_eat_data_fast_4_4; +sctp_state_fn_t sctp_sf_eat_sack_6_2; +sctp_state_fn_t sctp_sf_tabort_8_4_8; +sctp_state_fn_t sctp_sf_operr_notify; +sctp_state_fn_t sctp_sf_t1_timer_expire; +sctp_state_fn_t sctp_sf_t2_timer_expire; +sctp_state_fn_t sctp_sf_t5_timer_expire; +sctp_state_fn_t sctp_sf_sendbeat_8_3; +sctp_state_fn_t sctp_sf_beat_8_3; +sctp_state_fn_t sctp_sf_backbeat_8_3; +sctp_state_fn_t sctp_sf_do_9_2_final; +sctp_state_fn_t sctp_sf_do_9_2_shutdown; +sctp_state_fn_t sctp_sf_do_ecn_cwr; +sctp_state_fn_t sctp_sf_do_ecne; +sctp_state_fn_t sctp_sf_ootb; +sctp_state_fn_t sctp_sf_shut_8_4_5; +sctp_state_fn_t sctp_sf_pdiscard; +sctp_state_fn_t sctp_sf_violation; +sctp_state_fn_t sctp_sf_discard_chunk; +sctp_state_fn_t sctp_sf_do_5_2_1_siminit; +sctp_state_fn_t sctp_sf_do_5_2_2_dupinit; +sctp_state_fn_t sctp_sf_do_5_2_4_dupcook; +sctp_state_fn_t sctp_sf_unk_chunk; +sctp_state_fn_t sctp_sf_do_8_5_1_E_sa; +sctp_state_fn_t sctp_sf_cookie_echoed_err; +sctp_state_fn_t sctp_sf_do_5_2_6_stale; + +/* Prototypes for primitive event state functions. */ +sctp_state_fn_t sctp_sf_do_prm_asoc; +sctp_state_fn_t sctp_sf_do_prm_send; +sctp_state_fn_t sctp_sf_do_9_2_prm_shutdown; +sctp_state_fn_t sctp_sf_cookie_wait_prm_shutdown; +sctp_state_fn_t sctp_sf_cookie_echoed_prm_shutdown; +sctp_state_fn_t sctp_sf_do_9_1_prm_abort; +sctp_state_fn_t sctp_sf_cookie_wait_prm_abort; +sctp_state_fn_t sctp_sf_cookie_echoed_prm_abort; +sctp_state_fn_t sctp_sf_shutdown_pending_prm_abort; +sctp_state_fn_t sctp_sf_shutdown_sent_prm_abort; +sctp_state_fn_t sctp_sf_shutdown_ack_sent_prm_abort; +sctp_state_fn_t sctp_sf_error_closed; +sctp_state_fn_t sctp_sf_error_shutdown; +sctp_state_fn_t sctp_sf_ignore_primitive; +sctp_state_fn_t sctp_sf_do_prm_requestheartbeat; + +/* Prototypes for other event state functions. */ +sctp_state_fn_t sctp_sf_do_9_2_start_shutdown; +sctp_state_fn_t sctp_sf_do_9_2_shutdown_ack; +sctp_state_fn_t sctp_sf_ignore_other; + +/* Prototypes for timeout event state functions. */ +sctp_state_fn_t sctp_sf_do_6_3_3_rtx; +sctp_state_fn_t sctp_sf_do_6_2_sack; +sctp_state_fn_t sctp_sf_autoclose_timer_expire; + + +/* These are state functions which are either obsolete or not in use yet. + * If any of these functions needs to be revived, it should be renamed with + * the "sctp_sf_xxx" prefix, and be moved to the above prototype groups. + */ + +/* Prototypes for chunk state functions. Not in use. */ +sctp_state_fn_t sctp_sf_do_9_2_reshutack; +sctp_state_fn_t sctp_sf_do_9_2_reshut; +sctp_state_fn_t sctp_sf_do_9_2_shutack; + +sctp_state_fn_t lucky; +sctp_state_fn_t other_stupid; + +/* Prototypes for timeout event state functions. Not in use. */ +sctp_state_fn_t sctp_do_4_2_reinit; +sctp_state_fn_t sctp_do_4_3_reecho; +sctp_state_fn_t sctp_do_9_2_reshut; +sctp_state_fn_t sctp_do_9_2_reshutack; +sctp_state_fn_t sctp_do_8_3_hb_err; +sctp_state_fn_t sctp_heartoff; + +/* Prototypes for addip related state functions. Not in use. */ +sctp_state_fn_t sctp_addip_do_asconf; +sctp_state_fn_t sctp_addip_do_asconf_ack; + +/* Prototypes for utility support functions. */ +__u8 sctp_get_chunk_type(struct sctp_chunk *chunk); +sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type, + sctp_state_t state, + sctp_subtype_t event_subtype); +int sctp_chunk_iif(const struct sctp_chunk *); +struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *, + struct sctp_chunk *, + int gfp); +__u32 sctp_generate_verification_tag(void); +void sctp_populate_tie_tags(__u8 *cookie, __u32 curTag, __u32 hisTag); + +/* Prototypes for chunk-building functions. */ +sctp_chunk_t *sctp_make_init(const struct sctp_association *, + const sctp_bind_addr_t *, + int gfp, int vparam_len); +sctp_chunk_t *sctp_make_init_ack(const struct sctp_association *, + const sctp_chunk_t *, + const int gfp, + const int unkparam_len); +sctp_chunk_t *sctp_make_cookie_echo(const struct sctp_association *, + const sctp_chunk_t *); +sctp_chunk_t *sctp_make_cookie_ack(const struct sctp_association *, + const sctp_chunk_t *); +sctp_chunk_t *sctp_make_cwr(const struct sctp_association *, + const __u32 lowest_tsn, + const sctp_chunk_t *); +sctp_chunk_t *sctp_make_datafrag(struct sctp_association *, + const struct sctp_sndrcvinfo *sinfo, + int len, const __u8 *data, + __u8 flags, __u16 ssn); +sctp_chunk_t * sctp_make_datafrag_empty(struct sctp_association *, + const struct sctp_sndrcvinfo *sinfo, + int len, const __u8 flags, + __u16 ssn); +sctp_chunk_t *sctp_make_data(struct sctp_association *, + const struct sctp_sndrcvinfo *sinfo, + int len, const __u8 *data); +sctp_chunk_t *sctp_make_data_empty(struct sctp_association *, + const struct sctp_sndrcvinfo *, int len); +sctp_chunk_t *sctp_make_ecne(const struct sctp_association *, + const __u32); +sctp_chunk_t *sctp_make_sack(const struct sctp_association *); +sctp_chunk_t *sctp_make_shutdown(const struct sctp_association *asoc); +sctp_chunk_t *sctp_make_shutdown_ack(const struct sctp_association *asoc, + const sctp_chunk_t *); +sctp_chunk_t *sctp_make_shutdown_complete(const struct sctp_association *, + const sctp_chunk_t *); +void sctp_init_cause(sctp_chunk_t *, __u16 cause, const void *, size_t); +sctp_chunk_t *sctp_make_abort(const struct sctp_association *, + const sctp_chunk_t *, + const size_t hint); +sctp_chunk_t *sctp_make_abort_no_data(const struct sctp_association *, + const sctp_chunk_t *, + __u32 tsn); +sctp_chunk_t *sctp_make_abort_user(const struct sctp_association *, + const sctp_chunk_t *, + const struct msghdr *); +sctp_chunk_t *sctp_make_heartbeat(const struct sctp_association *, + const struct sctp_transport *, + const void *payload, + const size_t paylen); +sctp_chunk_t *sctp_make_heartbeat_ack(const struct sctp_association *, + const sctp_chunk_t *, + const void *payload, + const size_t paylen); +sctp_chunk_t *sctp_make_op_error(const struct sctp_association *, + const sctp_chunk_t *chunk, + __u16 cause_code, + const void *payload, + size_t paylen); +void sctp_chunk_assign_tsn(sctp_chunk_t *); +void sctp_chunk_assign_ssn(sctp_chunk_t *); +int sctp_datachunks_from_user(struct sctp_association *, + const struct sctp_sndrcvinfo *, + struct msghdr *, int len, + struct sk_buff_head *); + + +/* Prototypes for statetable processing. */ + +int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *, + struct sctp_association *asoc, + void *event_arg, + int gfp); + +int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *, + struct sctp_association *asoc, + void *event_arg, + sctp_disposition_t status, + sctp_cmd_seq_t *commands, + int gfp); + +/* 2nd level prototypes */ +int +sctp_cmd_interpreter(sctp_event_t event_type, sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *ep, + struct sctp_association *asoc, + void *event_arg, + sctp_disposition_t status, + sctp_cmd_seq_t *retval, + int gfp); + + +int sctp_gen_sack(struct sctp_association *, int force, sctp_cmd_seq_t *); +void sctp_do_TSNdup(struct sctp_association *, sctp_chunk_t *, long gap); + +void sctp_generate_t3_rtx_event(unsigned long peer); +void sctp_generate_heartbeat_event(unsigned long peer); + +sctp_sackhdr_t *sctp_sm_pull_sack(sctp_chunk_t *); +struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *, + const struct sctp_association *, + struct sctp_chunk *chunk, + const void *payload, + size_t paylen); +struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *, + const struct sctp_chunk *); +void sctp_ootb_pkt_free(struct sctp_packet *); + +sctp_cookie_param_t * +sctp_pack_cookie(const struct sctp_endpoint *, const struct sctp_association *, + const struct sctp_chunk *, int *cookie_len, + const __u8 *, int addrs_len); +struct sctp_association *sctp_unpack_cookie(const struct sctp_endpoint *, + const struct sctp_association *, + sctp_chunk_t *, int gfp, int *err, + sctp_chunk_t **err_chk_p); +int sctp_addip_addr_config(struct sctp_association *, sctp_param_t, + struct sockaddr_storage*, int); +void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_chunk_t *chunk, + sctp_cmd_seq_t *commands, + sctp_chunk_t *err_chunk); + +/* 3rd level prototypes */ +__u32 sctp_generate_tag(const struct sctp_endpoint *); +__u32 sctp_generate_tsn(const struct sctp_endpoint *); + +/* 4th level prototypes */ +void sctp_param2sockaddr(union sctp_addr *addr, sctp_addr_param_t *, + __u16 port, int iif); +int sctp_addr2sockaddr(const union sctp_params, union sctp_addr *); +int sockaddr2sctp_addr(const union sctp_addr *, sctp_addr_param_t *); + +/* Extern declarations for major data structures. */ +sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t, sctp_state_t); +extern sctp_sm_table_entry_t +primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES]; +extern sctp_sm_table_entry_t +other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES]; +extern sctp_sm_table_entry_t +timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES]; +extern sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES]; + +/* These are some handy utility macros... */ + + +/* Get the size of a DATA chunk payload. */ +static inline __u16 sctp_data_size(sctp_chunk_t *chunk) +{ + __u16 size; + + size = ntohs(chunk->chunk_hdr->length); + size -= sizeof(sctp_data_chunk_t); + + return size; +} + +/* Compare two TSNs */ + +/* RFC 1982 - Serial Number Arithmetic + * + * 2. Comparison + * Then, s1 is said to be equal to s2 if and only if i1 is equal to i2, + * in all other cases, s1 is not equal to s2. + * + * s1 is said to be less than s2 if, and only if, s1 is not equal to s2, + * and + * + * (i1 < i2 and i2 - i1 < 2^(SERIAL_BITS - 1)) or + * (i1 > i2 and i1 - i2 > 2^(SERIAL_BITS - 1)) + * + * s1 is said to be greater than s2 if, and only if, s1 is not equal to + * s2, and + * + * (i1 < i2 and i2 - i1 > 2^(SERIAL_BITS - 1)) or + * (i1 > i2 and i1 - i2 < 2^(SERIAL_BITS - 1)) + */ + +/* + * RFC 2960 + * 1.6 Serial Number Arithmetic + * + * Comparisons and arithmetic on TSNs in this document SHOULD use Serial + * Number Arithmetic as defined in [RFC1982] where SERIAL_BITS = 32. + */ + +enum { + TSN_SIGN_BIT = (1<<31) +}; + +static inline int TSN_lt(__u32 s, __u32 t) +{ + return (((s) - (t)) & TSN_SIGN_BIT); +} + +static inline int TSN_lte(__u32 s, __u32 t) +{ + return (((s) == (t)) || (((s) - (t)) & TSN_SIGN_BIT)); +} + +/* Compare two SSNs */ + +/* + * RFC 2960 + * 1.6 Serial Number Arithmetic + * + * Comparisons and arithmetic on Stream Sequence Numbers in this document + * SHOULD use Serial Number Arithmetic as defined in [RFC1982] where + * SERIAL_BITS = 16. + */ +enum { + SSN_SIGN_BIT = (1<<15) +}; + +static inline int SSN_lt(__u16 s, __u16 t) +{ + return (((s) - (t)) & SSN_SIGN_BIT); +} + +static inline int SSN_lte(__u16 s, __u16 t) +{ + return (((s) == (t)) || (((s) - (t)) & SSN_SIGN_BIT)); +} + +/* Run sctp_add_cmd() generating a BUG() if there is a failure. */ +static inline void sctp_add_cmd_sf(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj) +{ + if (unlikely(!sctp_add_cmd(seq, verb, obj))) + BUG(); +} + +/* Check VTAG of the packet matches the sender's own tag OR its peer's + * tag and the T bit is set in the Chunk Flags. + */ +static inline int +sctp_vtag_verify_either(const sctp_chunk_t *chunk, + const struct sctp_association *asoc) +{ + /* RFC 2960 Section 8.5.1, sctpimpguide-06 Section 2.13.2 + * + * B) The receiver of a ABORT shall accept the packet if the + * Verification Tag field of the packet matches its own tag OR it + * is set to its peer's tag and the T bit is set in the Chunk + * Flags. Otherwise, the receiver MUST silently discard the packet + * and take no further action. + * + * (C) The receiver of a SHUTDOWN COMPLETE shall accept the + * packet if the Verification Tag field of the packet + * matches its own tag OR it is set to its peer's tag and + * the T bit is set in the Chunk Flags. Otherwise, the + * receiver MUST silently discard the packet and take no + * further action.... + * + */ + if ((ntohl(chunk->sctp_hdr->vtag) == asoc->c.my_vtag) || + (sctp_test_T_bit(chunk) && (ntohl(chunk->sctp_hdr->vtag) + == asoc->c.peer_vtag))) { + return 1; + } + + return 0; +} + +#endif /* __sctp_sm_h__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/structs.h linux-2.4.23-pre8/include/net/sctp/structs.h --- linux-2.4.22/include/net/sctp/structs.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/structs.h 2003-10-22 22:49:12.000000000 +0000 @@ -0,0 +1,1631 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001-2003 International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email addresses: + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Randall Stewart + * Ken Morneau + * Qiaobing Xie + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Xingang Guo + * Hui Huang + * Sridhar Samudrala + * Daisy Chang + * Dajiang Zhang + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#ifndef __sctp_structs_h__ +#define __sctp_structs_h__ + +#include /* We get struct timespec. */ +#include /* linux/in.h needs this!! */ +#include /* We get struct sockaddr_in. */ +#include /* We get struct in6_addr */ +#include /* We get MAXHOSTNAMELEN. */ +#include /* This gets us atomic counters. */ +#include /* We need sk_buff_head. */ +#include /* We need sctp* header structs. */ +#include + +/* A convenience structure for handling sockaddr structures. + * We should wean ourselves off this. + */ +union sctp_addr { + struct sockaddr_in v4; + struct sockaddr_in6 v6; + struct sockaddr sa; +}; + + +/* Forward declarations for data structures. */ +struct sctp_protocol; +struct sctp_endpoint; +struct sctp_association; +struct sctp_transport; +struct sctp_packet; +struct sctp_chunk; +struct sctp_inq; +struct sctp_outq; +struct sctp_bind_addr; +struct sctp_ulpq; +struct sctp_opt; +struct sctp_ep_common; +struct sctp_ssnmap; + +typedef struct sctp_chunk sctp_chunk_t; +typedef struct sctp_bind_addr sctp_bind_addr_t; + +#include +#include +#include + +/* Structures useful for managing bind/connect. */ + +typedef struct sctp_bind_bucket { + unsigned short port; + unsigned short fastreuse; + struct sctp_bind_bucket *next; + struct sctp_bind_bucket **pprev; + struct sock *sk; +} sctp_bind_bucket_t; + +typedef struct sctp_bind_hashbucket { + spinlock_t lock; + struct sctp_bind_bucket *chain; +} sctp_bind_hashbucket_t; + +/* Used for hashing all associations. */ +typedef struct sctp_hashbucket { + rwlock_t lock; + struct sctp_ep_common *chain; +} sctp_hashbucket_t __attribute__((__aligned__(8))); + + +/* The SCTP protocol structure. */ +struct sctp_protocol { + /* RFC2960 Section 14. Suggested SCTP Protocol Parameter Values + * + * The following protocol parameters are RECOMMENDED: + * + * RTO.Initial - 3 seconds + * RTO.Min - 1 second + * RTO.Max - 60 seconds + * RTO.Alpha - 1/8 (3 when converted to right shifts.) + * RTO.Beta - 1/4 (2 when converted to right shifts.) + */ + __u32 rto_initial; + __u32 rto_min; + __u32 rto_max; + + /* Note: rto_alpha and rto_beta are really defined as inverse + * powers of two to facilitate integer operations. + */ + int rto_alpha; + int rto_beta; + + /* Max.Burst - 4 */ + int max_burst; + + /* Valid.Cookie.Life - 60 seconds */ + int valid_cookie_life; + + /* Whether Cookie Preservative is enabled(1) or not(0) */ + int cookie_preserve_enable; + + /* Association.Max.Retrans - 10 attempts + * Path.Max.Retrans - 5 attempts (per destination address) + * Max.Init.Retransmits - 8 attempts + */ + int max_retrans_association; + int max_retrans_path; + int max_retrans_init; + + /* HB.interval - 30 seconds */ + int hb_interval; + + /* The following variables are implementation specific. */ + + /* Default initialization values to be applied to new associations. */ + __u16 max_instreams; + __u16 max_outstreams; + + /* This is a list of groups of functions for each address + * family that we support. + */ + struct list_head address_families; + + /* This is the hash of all endpoints. */ + int ep_hashsize; + sctp_hashbucket_t *ep_hashbucket; + + /* This is the hash of all associations. */ + int assoc_hashsize; + sctp_hashbucket_t *assoc_hashbucket; + + /* This is the sctp port control hash. */ + int port_hashsize; + int port_rover; + spinlock_t port_alloc_lock; /* Protects port_rover. */ + sctp_bind_hashbucket_t *port_hashtable; + + /* This is the global local address list. + * We actively maintain this complete list of interfaces on + * the system by catching routing events. + * + * It is a list of struct sockaddr_storage_list. + */ + struct list_head local_addr_list; + spinlock_t local_addr_lock; +}; + + +/* + * Pointers to address related SCTP functions. + * (i.e. things that depend on the address family.) + */ +struct sctp_af { + int (*sctp_xmit) (struct sk_buff *skb, + struct sctp_transport *, + int ipfragok); + int (*setsockopt) (struct sock *sk, + int level, + int optname, + char *optval, + int optlen); + int (*getsockopt) (struct sock *sk, + int level, + int optname, + char *optval, + int *optlen); + struct dst_entry *(*get_dst) (struct sctp_association *asoc, + union sctp_addr *daddr, + union sctp_addr *saddr); + void (*get_saddr) (struct sctp_association *asoc, + struct dst_entry *dst, + union sctp_addr *daddr, + union sctp_addr *saddr); + void (*copy_addrlist) (struct list_head *, + struct net_device *); + void (*dst_saddr) (union sctp_addr *saddr, + struct dst_entry *dst, + unsigned short port); + int (*cmp_addr) (const union sctp_addr *addr1, + const union sctp_addr *addr2); + void (*addr_copy) (union sctp_addr *dst, + union sctp_addr *src); + void (*from_skb) (union sctp_addr *, + struct sk_buff *skb, + int saddr); + void (*from_sk) (union sctp_addr *, + struct sock *sk); + void (*to_sk_saddr) (union sctp_addr *, + struct sock *sk); + void (*to_sk_daddr) (union sctp_addr *, + struct sock *sk); + int (*addr_valid) (union sctp_addr *); + sctp_scope_t (*scope) (union sctp_addr *); + void (*inaddr_any) (union sctp_addr *, unsigned short); + int (*is_any) (const union sctp_addr *); + int (*available) (const union sctp_addr *); + int (*skb_iif) (const struct sk_buff *sk); + __u16 net_header_len; + int sockaddr_len; + sa_family_t sa_family; + struct list_head list; +}; + +struct sctp_af *sctp_get_af_specific(sa_family_t); +int sctp_register_af(struct sctp_af *); + +/* Protocol family functions. */ +struct sctp_pf { + void (*event_msgname)(struct sctp_ulpevent *, char *, int *); + void (*skb_msgname) (struct sk_buff *, char *, int *); + int (*af_supported) (sa_family_t); + int (*cmp_addr) (const union sctp_addr *, + const union sctp_addr *, + struct sctp_opt *); + int (*bind_verify) (struct sctp_opt *, union sctp_addr *); + int (*send_verify) (struct sctp_opt *, union sctp_addr *); + int (*supported_addrs)(const struct sctp_opt *, __u16 *); + struct sock *(*create_accept_sk) (struct sock *sk, + struct sctp_association *asoc); + struct sctp_af *af; +}; + +/* SCTP Socket type: UDP or TCP style. */ +typedef enum { + SCTP_SOCKET_UDP = 0, + SCTP_SOCKET_UDP_HIGH_BANDWIDTH, + SCTP_SOCKET_TCP +} sctp_socket_type_t; + +/* Per socket SCTP information. */ +struct sctp_opt { + /* What kind of a socket is this? */ + sctp_socket_type_t type; + + /* PF_ family specific functions. */ + struct sctp_pf *pf; + + /* Access to HMAC transform. */ + struct crypto_tfm *hmac; + + /* What is our base endpointer? */ + struct sctp_endpoint *ep; + + /* Various Socket Options. */ + __u16 default_stream; + __u32 default_ppid; + struct sctp_initmsg initmsg; + struct sctp_rtoinfo rtoinfo; + struct sctp_paddrparams paddrparam; + struct sctp_event_subscribe subscribe; + __u32 autoclose; + __u8 nodelay; + __u8 disable_fragments; + __u8 pd_mode; + + /* Receive to here while partial delivery is in effect. */ + struct sk_buff_head pd_lobby; +}; + + + +/* This is our APPLICATION-SPECIFIC state cookie. + * THIS IS NOT DICTATED BY THE SPECIFICATION. + */ +/* These are the parts of an association which we send in the cookie. + * Most of these are straight out of: + * RFC2960 12.2 Parameters necessary per association (i.e. the TCB) + * + */ + +typedef struct sctp_cookie { + /* My : Tag expected in every inbound packet and sent + * Verification: in the INIT or INIT ACK chunk. + * Tag : + */ + __u32 my_vtag; + + /* Peer's : Tag expected in every outbound packet except + * Verification: in the INIT chunk. + * Tag : + */ + __u32 peer_vtag; + + /* The rest of these are not from the spec, but really need to + * be in the cookie. + */ + + /* My Tie Tag : Assist in discovering a restarting association. */ + __u32 my_ttag; + + /* Peer's Tie Tag: Assist in discovering a restarting association. */ + __u32 peer_ttag; + + /* Number of inbound/outbound streams which are set + * and negotiated during the INIT process. + */ + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + + /* When does this cookie expire? */ + struct timeval expiration __attribute__((packed)); + + /* This is the first sequence number I used. */ + __u32 initial_tsn; + + /* This holds the originating address of the INIT packet. */ + union sctp_addr peer_addr; + + /* This is a shim for my peer's INIT packet, followed by + * a copy of the raw address list of the association. + * The length of the raw address list is saved in the + * raw_addr_list_len field, which will be used at the time when + * the association TCB is re-constructed from the cookie. + */ + __u32 raw_addr_list_len; + sctp_init_chunk_t peer_init[0]; +} sctp_cookie_t __attribute__((aligned(4))); + + +/* The format of our cookie that we send to our peer. */ +typedef struct sctp_signed_cookie { + __u8 signature[SCTP_SECRET_SIZE]; + sctp_cookie_t c; +} sctp_signed_cookie_t; + +/* This is another convenience type to allocate memory for address + * params for the maximum size and pass such structures around + * internally. + */ +typedef union { + sctp_ipv4addr_param_t v4; + sctp_ipv6addr_param_t v6; +} sctp_addr_param_t; + +/* A convenience type to allow walking through the various + * parameters and avoid casting all over the place. + */ +union sctp_params { + void *v; + sctp_paramhdr_t *p; + sctp_cookie_preserve_param_t *life; + sctp_hostname_param_t *dns; + sctp_cookie_param_t *cookie; + sctp_supported_addrs_param_t *sat; + sctp_ipv4addr_param_t *v4; + sctp_ipv6addr_param_t *v6; + sctp_addr_param_t *addr; +}; + +/* RFC 2960. Section 3.3.5 Heartbeat. + * Heartbeat Information: variable length + * The Sender-specific Heartbeat Info field should normally include + * information about the sender's current time when this HEARTBEAT + * chunk is sent and the destination transport address to which this + * HEARTBEAT is sent (see Section 8.3). + */ +typedef struct sctp_sender_hb_info { + sctp_paramhdr_t param_hdr; + union sctp_addr daddr; + unsigned long sent_at; +} sctp_sender_hb_info_t __attribute__((packed, aligned(4))); + +/* + * RFC 2960 1.3.2 Sequenced Delivery within Streams + * + * The term "stream" is used in SCTP to refer to a sequence of user + * messages that are to be delivered to the upper-layer protocol in + * order with respect to other messages within the same stream. This is + * in contrast to its usage in TCP, where it refers to a sequence of + * bytes (in this document a byte is assumed to be eight bits). + * ... + * + * This is the structure we use to track both our outbound and inbound + * SSN, or Stream Sequence Numbers. + */ + +struct sctp_stream { + __u16 *ssn; + unsigned int len; +}; + +struct sctp_ssnmap { + struct sctp_stream in; + struct sctp_stream out; + int malloced; +}; + +struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *, __u16, __u16); +struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, int gfp); +void sctp_ssnmap_free(struct sctp_ssnmap *map); +void sctp_ssnmap_clear(struct sctp_ssnmap *map); + +/* What is the current SSN number for this stream? */ +static inline __u16 sctp_ssn_peek(struct sctp_stream *stream, __u16 id) +{ + return stream->ssn[id]; +} + +/* Return the next SSN number for this stream. */ +static inline __u16 sctp_ssn_next(struct sctp_stream *stream, __u16 id) +{ + return stream->ssn[id]++; +} + + +/* RFC2960 1.4 Key Terms + * + * o Chunk: A unit of information within an SCTP packet, consisting of + * a chunk header and chunk-specific content. + * + * As a matter of convenience, we remember the SCTP common header for + * each chunk as well as a few other header pointers... + */ +struct sctp_chunk { + /* These first three elements MUST PRECISELY match the first + * three elements of struct sk_buff. This allows us to reuse + * all the skb_* queue management functions. + */ + sctp_chunk_t *next; + sctp_chunk_t *prev; + struct sk_buff_head *list; + + /* This is our link to the per-transport transmitted list. */ + struct list_head transmitted_list; + + /* This field is used by chunks that hold fragmented data. + * For the first fragment this is the list that holds the rest of + * fragments. For the remaining fragments, this is the link to the + * frag_list maintained in the first fragment. + */ + struct list_head frag_list; + + /* This points to the sk_buff containing the actual data. */ + struct sk_buff *skb; + + /* These are the SCTP headers by reverse order in a packet. + * Note that some of these may happen more than once. In that + * case, we point at the "current" one, whatever that means + * for that level of header. + */ + + /* We point this at the FIRST TLV parameter to chunk_hdr. */ + union sctp_params param_hdr; + union { + __u8 *v; + sctp_datahdr_t *data_hdr; + sctp_inithdr_t *init_hdr; + sctp_sackhdr_t *sack_hdr; + sctp_heartbeathdr_t *hb_hdr; + sctp_sender_hb_info_t *hbs_hdr; + sctp_shutdownhdr_t *shutdown_hdr; + sctp_signed_cookie_t *cookie_hdr; + sctp_ecnehdr_t *ecne_hdr; + sctp_cwrhdr_t *ecn_cwr_hdr; + sctp_errhdr_t *err_hdr; + } subh; + + __u8 *chunk_end; + + sctp_chunkhdr_t *chunk_hdr; + + sctp_sctphdr_t *sctp_hdr; + + /* This needs to be recoverable for SCTP_SEND_FAILED events. */ + struct sctp_sndrcvinfo sinfo; + + /* Which association does this belong to? */ + struct sctp_association *asoc; + + /* What endpoint received this chunk? */ + struct sctp_ep_common *rcvr; + + /* We fill this in if we are calculating RTT. */ + unsigned long sent_at; + + __u8 rtt_in_progress; /* Is this chunk used for RTT calculation? */ + __u8 num_times_sent; /* How man times did we send this? */ + __u8 has_tsn; /* Does this chunk have a TSN yet? */ + __u8 has_ssn; /* Does this chunk have a SSN yet? */ + __u8 singleton; /* Was this the only chunk in the packet? */ + __u8 end_of_packet; /* Was this the last chunk in the packet? */ + __u8 ecn_ce_done; /* Have we processed the ECN CE bit? */ + __u8 pdiscard; /* Discard the whole packet now? */ + __u8 tsn_gap_acked; /* Is this chunk acked by a GAP ACK? */ + __u8 fast_retransmit; /* Is this chunk fast retransmitted? */ + __u8 tsn_missing_report; /* Data chunk missing counter. */ + + /* What is the origin IP address for this chunk? */ + union sctp_addr source; + /* Destination address for this chunk. */ + union sctp_addr dest; + + /* For an inbound chunk, this tells us where it came from. + * For an outbound chunk, it tells us where we'd like it to + * go. It is NULL if we have no preference. + */ + struct sctp_transport *transport; +}; + +sctp_chunk_t *sctp_make_chunk(const struct sctp_association *, __u8 type, + __u8 flags, int size); +void sctp_free_chunk(sctp_chunk_t *); +void *sctp_addto_chunk(sctp_chunk_t *chunk, int len, const void *data); +sctp_chunk_t *sctp_chunkify(struct sk_buff *, const struct sctp_association *, + struct sock *); +void sctp_init_addrs(sctp_chunk_t *, union sctp_addr *, union sctp_addr *); +const union sctp_addr *sctp_source(const sctp_chunk_t *chunk); + +/* This is a structure for holding either an IPv6 or an IPv4 address. */ +/* sin_family -- AF_INET or AF_INET6 + * sin_port -- ordinary port number + * sin_addr -- cast to either (struct in_addr) or (struct in6_addr) + */ +struct sockaddr_storage_list { + struct list_head list; + union sctp_addr a; +}; + +typedef sctp_chunk_t *(sctp_packet_phandler_t)(struct sctp_association *); + +/* This structure holds lists of chunks as we are assembling for + * transmission. + */ +struct sctp_packet { + /* These are the SCTP header values (host order) for the packet. */ + __u16 source_port; + __u16 destination_port; + __u32 vtag; + + /* This contains the payload chunks. */ + struct sk_buff_head chunks; + /* This is the total size of all chunks INCLUDING padding. */ + size_t size; + + /* The packet is destined for this transport address. + * The function we finally use to pass down to the next lower + * layer lives in the transport structure. + */ + struct sctp_transport *transport; + + /* Allow a callback for getting a high priority chunk + * bundled early into the packet (This is used for ECNE). + */ + sctp_packet_phandler_t *get_prepend_chunk; + + /* This packet should advertise ECN capability to the network + * via the ECT bit. + */ + char ecn_capable; + + /* This packet contains a COOKIE-ECHO chunk. */ + char has_cookie_echo; + + /* This packet containsa SACK chunk. */ + char has_sack; + + /* SCTP cannot fragment this packet. So let ip fragment it. */ + char ipfragok; + + int malloced; +}; + +typedef int (sctp_outq_thandler_t)(struct sctp_outq *, void *); +typedef int (sctp_outq_ehandler_t)(struct sctp_outq *); +typedef struct sctp_packet *(sctp_outq_ohandler_init_t) + (struct sctp_packet *, + struct sctp_transport *, + __u16 sport, + __u16 dport); +typedef struct sctp_packet *(sctp_outq_ohandler_config_t) + (struct sctp_packet *, + __u32 vtag, + int ecn_capable, + sctp_packet_phandler_t *get_prepend_chunk); +typedef sctp_xmit_t (sctp_outq_ohandler_t)(struct sctp_packet *, + sctp_chunk_t *); +typedef int (sctp_outq_ohandler_force_t)(struct sctp_packet *); + +sctp_outq_ohandler_init_t sctp_packet_init; +sctp_outq_ohandler_config_t sctp_packet_config; +sctp_outq_ohandler_t sctp_packet_append_chunk; +sctp_outq_ohandler_t sctp_packet_transmit_chunk; +sctp_outq_ohandler_force_t sctp_packet_transmit; +void sctp_packet_free(struct sctp_packet *); + + +/* This represents a remote transport address. + * For local transport addresses, we just use union sctp_addr. + * + * RFC2960 Section 1.4 Key Terms + * + * o Transport address: A Transport Address is traditionally defined + * by Network Layer address, Transport Layer protocol and Transport + * Layer port number. In the case of SCTP running over IP, a + * transport address is defined by the combination of an IP address + * and an SCTP port number (where SCTP is the Transport protocol). + * + * RFC2960 Section 7.1 SCTP Differences from TCP Congestion control + * + * o The sender keeps a separate congestion control parameter set for + * each of the destination addresses it can send to (not each + * source-destination pair but for each destination). The parameters + * should decay if the address is not used for a long enough time + * period. + * + */ +struct sctp_transport { + /* A list of transports. */ + struct list_head transports; + + /* Reference counting. */ + atomic_t refcnt; + int dead; + + /* This is the peer's IP address and port. */ + union sctp_addr ipaddr; + + /* These are the functions we call to handle LLP stuff. */ + struct sctp_af *af_specific; + + /* Which association do we belong to? */ + struct sctp_association *asoc; + + /* RFC2960 + * + * 12.3 Per Transport Address Data + * + * For each destination transport address in the peer's + * address list derived from the INIT or INIT ACK chunk, a + * number of data elements needs to be maintained including: + */ + __u32 rtt; /* This is the most recent RTT. */ + + /* RTO : The current retransmission timeout value. */ + __u32 rto; + + /* RTTVAR : The current RTT variation. */ + __u32 rttvar; + + /* SRTT : The current smoothed round trip time. */ + __u32 srtt; + + /* RTO-Pending : A flag used to track if one of the DATA + * chunks sent to this address is currently being + * used to compute a RTT. If this flag is 0, + * the next DATA chunk sent to this destination + * should be used to compute a RTT and this flag + * should be set. Every time the RTT + * calculation completes (i.e. the DATA chunk + * is SACK'd) clear this flag. + */ + int rto_pending; + + /* + * These are the congestion stats. + */ + /* cwnd : The current congestion window. */ + __u32 cwnd; /* This is the actual cwnd. */ + + /* ssthresh : The current slow start threshold value. */ + __u32 ssthresh; + + /* partial : The tracking method for increase of cwnd when in + * bytes acked : congestion avoidance mode (see Section 6.2.2) + */ + __u32 partial_bytes_acked; + + /* Data that has been sent, but not acknowledged. */ + __u32 flight_size; + + /* PMTU : The current known path MTU. */ + __u32 pmtu; + + /* Destination */ + struct dst_entry *dst; + /* Source address. */ + union sctp_addr saddr; + + /* When was the last time(in jiffies) that a data packet was sent on + * this transport? This is used to adjust the cwnd when the transport + * becomes inactive. + */ + unsigned long last_time_used; + + /* Heartbeat interval: The endpoint sends out a Heartbeat chunk to + * the destination address every heartbeat interval. + */ + int hb_interval; + + /* When was the last time (in jiffies) that we heard from this + * transport? We use this to pick new active and retran paths. + */ + unsigned long last_time_heard; + + /* Last time(in jiffies) when cwnd is reduced due to the congestion + * indication based on ECNE chunk. + */ + unsigned long last_time_ecne_reduced; + + /* active : The current active state of this destination, + * : i.e. DOWN, UP, etc. + */ + int active; + + /* hb_allowed : The current heartbeat state of this destination, + * : i.e. ALLOW-HB, NO-HEARTBEAT, etc. + */ + int hb_allowed; + + /* These are the error stats for this destination. */ + + /* Error count : The current error count for this destination. */ + unsigned short error_count; + + /* Error : Current error threshold for this destination + * Threshold : i.e. what value marks the destination down if + * : errorCount reaches this value. + */ + unsigned short error_threshold; + + /* This is the max_retrans value for the transport and will + * be initialized to proto.max_retrans.path. This can be changed + * using SCTP_SET_PEER_ADDR_PARAMS socket option. + */ + int max_retrans; + + /* We use this name for debugging output... */ + char *debug_name; + + /* Per : A timer used by each destination. + * Destination : + * Timer : + * + * [Everywhere else in the text this is called T3-rtx. -ed] + */ + struct timer_list T3_rtx_timer; + + /* Heartbeat timer is per destination. */ + struct timer_list hb_timer; + + /* Since we're using per-destination retransmission timers + * (see above), we're also using per-destination "transmitted" + * queues. This probably ought to be a private struct + * accessible only within the outqueue, but it's not, yet. + */ + struct list_head transmitted; + + /* We build bundle-able packets for this transport here. */ + struct sctp_packet packet; + + /* This is the list of transports that have chunks to send. */ + struct list_head send_ready; + + int malloced; /* Is this structure kfree()able? */ +}; + +struct sctp_transport *sctp_transport_new(const union sctp_addr *, int); +struct sctp_transport *sctp_transport_init(struct sctp_transport *, + const union sctp_addr *, int); +void sctp_transport_set_owner(struct sctp_transport *, + struct sctp_association *); +void sctp_transport_route(struct sctp_transport *, union sctp_addr *, + struct sctp_opt *); +void sctp_transport_pmtu(struct sctp_transport *); +void sctp_transport_free(struct sctp_transport *); +void sctp_transport_destroy(struct sctp_transport *); +void sctp_transport_reset_timers(struct sctp_transport *); +void sctp_transport_hold(struct sctp_transport *); +void sctp_transport_put(struct sctp_transport *); +void sctp_transport_update_rto(struct sctp_transport *, __u32); +void sctp_transport_raise_cwnd(struct sctp_transport *, __u32, __u32); +void sctp_transport_lower_cwnd(struct sctp_transport *, sctp_lower_cwnd_t); +unsigned long sctp_transport_timeout(struct sctp_transport *); + + +/* This is the structure we use to queue packets as they come into + * SCTP. We write packets to it and read chunks from it. + */ +struct sctp_inq { + /* This is actually a queue of sctp_chunk each + * containing a partially decoded packet. + */ + struct sk_buff_head in; + /* This is the packet which is currently off the in queue and is + * being worked on through the inbound chunk processing. + */ + sctp_chunk_t *in_progress; + + /* This is the delayed task to finish delivering inbound + * messages. + */ + struct tq_struct immediate; + + int malloced; /* Is this structure kfree()able? */ +}; + +struct sctp_inq *sctp_inq_new(void); +void sctp_inq_init(struct sctp_inq *); +void sctp_inq_free(struct sctp_inq *); +void sctp_inq_push(struct sctp_inq *, sctp_chunk_t *packet); +struct sctp_chunk *sctp_inq_pop(struct sctp_inq *); +void sctp_inq_set_th_handler(struct sctp_inq *, void (*)(void *), void *); + +/* This is the structure we use to hold outbound chunks. You push + * chunks in and they automatically pop out the other end as bundled + * packets (it calls (*output_handler)()). + * + * This structure covers sections 6.3, 6.4, 6.7, 6.8, 6.10, 7., 8.1, + * and 8.2 of the v13 draft. + * + * It handles retransmissions. The connection to the timeout portion + * of the state machine is through sctp_..._timeout() and timeout_handler. + * + * If you feed it SACKs, it will eat them. + * + * If you give it big chunks, it will fragment them. + * + * It assigns TSN's to data chunks. This happens at the last possible + * instant before transmission. + * + * When free()'d, it empties itself out via output_handler(). + */ +struct sctp_outq { + struct sctp_association *asoc; + + /* Data pending that has never been transmitted. */ + struct sk_buff_head out; + + unsigned out_qlen; /* Total length of queued data chunks. */ + + /* Error of send failed, may used in SCTP_SEND_FAILED event. */ + unsigned error; + + /* These are control chunks we want to send. */ + struct sk_buff_head control; + + /* These are chunks that have been sacked but are above the + * CTSN, or cumulative tsn ack point. + */ + struct list_head sacked; + + /* Put chunks on this list to schedule them for + * retransmission. + */ + struct list_head retransmit; + + /* Call these functions to send chunks down to the next lower + * layer. This is always sctp_packet, but we separate the two + * structures to make testing simpler. + */ + sctp_outq_ohandler_init_t *init_output; + sctp_outq_ohandler_config_t *config_output; + sctp_outq_ohandler_t *append_output; + sctp_outq_ohandler_t *build_output; + sctp_outq_ohandler_force_t *force_output; + + /* How many unackd bytes do we have in-flight? */ + __u32 outstanding_bytes; + + /* Is this structure empty? */ + int empty; + + /* Are we kfree()able? */ + int malloced; +}; + +struct sctp_outq *sctp_outq_new(struct sctp_association *); +void sctp_outq_init(struct sctp_association *, struct sctp_outq *); +void sctp_outq_teardown(struct sctp_outq *); +void sctp_outq_free(struct sctp_outq*); +int sctp_outq_tail(struct sctp_outq *, sctp_chunk_t *chunk); +int sctp_outq_flush(struct sctp_outq *, int); +int sctp_outq_sack(struct sctp_outq *, sctp_sackhdr_t *); +int sctp_outq_is_empty(const struct sctp_outq *); +int sctp_outq_set_output_handlers(struct sctp_outq *, + sctp_outq_ohandler_init_t init, + sctp_outq_ohandler_config_t config, + sctp_outq_ohandler_t append, + sctp_outq_ohandler_t build, + sctp_outq_ohandler_force_t force); +void sctp_outq_restart(struct sctp_outq *); +void sctp_retransmit(struct sctp_outq *, struct sctp_transport *, + sctp_retransmit_reason_t); +void sctp_retransmit_mark(struct sctp_outq *, struct sctp_transport *, __u8); + + +/* These bind address data fields common between endpoints and associations */ +struct sctp_bind_addr { + + /* RFC 2960 12.1 Parameters necessary for the SCTP instance + * + * SCTP Port: The local SCTP port number the endpoint is + * bound to. + */ + __u16 port; + + /* RFC 2960 12.1 Parameters necessary for the SCTP instance + * + * Address List: The list of IP addresses that this instance + * has bound. This information is passed to one's + * peer(s) in INIT and INIT ACK chunks. + */ + struct list_head address_list; + + int malloced; /* Are we kfree()able? */ +}; + +sctp_bind_addr_t *sctp_bind_addr_new(int gfp_mask); +void sctp_bind_addr_init(sctp_bind_addr_t *, __u16 port); +void sctp_bind_addr_free(sctp_bind_addr_t *); +int sctp_bind_addr_copy(sctp_bind_addr_t *dest, const sctp_bind_addr_t *src, + sctp_scope_t scope, int gfp,int flags); +int sctp_add_bind_addr(sctp_bind_addr_t *, union sctp_addr *, + int gfp); +int sctp_del_bind_addr(sctp_bind_addr_t *, union sctp_addr *); +int sctp_bind_addr_match(sctp_bind_addr_t *, const union sctp_addr *, + struct sctp_opt *); +union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp, + int *addrs_len, int gfp); +int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw, int len, + __u16 port, int gfp); + +sctp_scope_t sctp_scope(const union sctp_addr *); +int sctp_in_scope(const union sctp_addr *addr, const sctp_scope_t scope); +int sctp_is_any(const union sctp_addr *addr); +int sctp_addr_is_valid(const union sctp_addr *addr); + + +/* What type of endpoint? */ +typedef enum { + SCTP_EP_TYPE_SOCKET, + SCTP_EP_TYPE_ASSOCIATION, +} sctp_endpoint_type_t; + +/* + * A common base class to bridge the implmentation view of a + * socket (usually listening) endpoint versus an association's + * local endpoint. + * This common structure is useful for several purposes: + * 1) Common interface for lookup routines. + * a) Subfunctions work for either endpoint or association + * b) Single interface to lookup allows hiding the lookup lock rather + * than acquiring it externally. + * 2) Common interface for the inbound chunk handling/state machine. + * 3) Common object handling routines for reference counting, etc. + * 4) Disentangle association lookup from endpoint lookup, where we + * do not have to find our endpoint to find our association. + * + */ + +struct sctp_ep_common { + /* Fields to help us manage our entries in the hash tables. */ + struct sctp_ep_common *next; + struct sctp_ep_common **pprev; + int hashent; + + /* Runtime type information. What kind of endpoint is this? */ + sctp_endpoint_type_t type; + + /* Some fields to help us manage this object. + * refcnt - Reference count access to this object. + * dead - Do not attempt to use this object. + * malloced - Do we need to kfree this object? + */ + atomic_t refcnt; + char dead; + char malloced; + + /* What socket does this endpoint belong to? */ + struct sock *sk; + + /* This is where we receive inbound chunks. */ + struct sctp_inq inqueue; + + /* This substructure includes the defining parameters of the + * endpoint: + * bind_addr.port is our shared port number. + * bind_addr.address_list is our set of local IP addresses. + */ + sctp_bind_addr_t bind_addr; + + /* Protection during address list comparisons. */ + rwlock_t addr_lock; +}; + + +/* RFC Section 1.4 Key Terms + * + * o SCTP endpoint: The logical sender/receiver of SCTP packets. On a + * multi-homed host, an SCTP endpoint is represented to its peers as a + * combination of a set of eligible destination transport addresses to + * which SCTP packets can be sent and a set of eligible source + * transport addresses from which SCTP packets can be received. + * All transport addresses used by an SCTP endpoint must use the + * same port number, but can use multiple IP addresses. A transport + * address used by an SCTP endpoint must not be used by another + * SCTP endpoint. In other words, a transport address is unique + * to an SCTP endpoint. + * + * From an implementation perspective, each socket has one of these. + * A TCP-style socket will have exactly one association on one of + * these. An UDP-style socket will have multiple associations hanging + * off one of these. + */ + +struct sctp_endpoint { + /* Common substructure for endpoint and association. */ + struct sctp_ep_common base; + + /* Associations: A list of current associations and mappings + * to the data consumers for each association. This + * may be in the form of a hash table or other + * implementation dependent structure. The data + * consumers may be process identification + * information such as file descriptors, named pipe + * pointer, or table pointers dependent on how SCTP + * is implemented. + */ + /* This is really a list of struct sctp_association entries. */ + struct list_head asocs; + + /* Secret Key: A secret key used by this endpoint to compute + * the MAC. This SHOULD be a cryptographic quality + * random number with a sufficient length. + * Discussion in [RFC1750] can be helpful in + * selection of the key. + */ + __u8 secret_key[SCTP_HOW_MANY_SECRETS][SCTP_SECRET_SIZE]; + int current_key; + int last_key; + int key_changed_at; + + /* Default timeouts. */ + int timeouts[SCTP_NUM_TIMEOUT_TYPES]; + + /* Various thresholds. */ + + /* Name for debugging output... */ + char *debug_name; +}; + +/* Recover the outter endpoint structure. */ +static inline struct sctp_endpoint *sctp_ep(struct sctp_ep_common *base) +{ + struct sctp_endpoint *ep; + + ep = container_of(base, struct sctp_endpoint, base); + return ep; +} + +/* These are function signatures for manipulating endpoints. */ +struct sctp_endpoint *sctp_endpoint_new(struct sock *, int); +struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *, + struct sock *, int gfp); +void sctp_endpoint_free(struct sctp_endpoint *); +void sctp_endpoint_put(struct sctp_endpoint *); +void sctp_endpoint_hold(struct sctp_endpoint *); +void sctp_endpoint_add_asoc(struct sctp_endpoint *, struct sctp_association *); +struct sctp_association *sctp_endpoint_lookup_assoc( + const struct sctp_endpoint *ep, + const union sctp_addr *paddr, + struct sctp_transport **); +int sctp_endpoint_is_peeled_off(struct sctp_endpoint *, + const union sctp_addr *); +struct sctp_endpoint *sctp_endpoint_is_match(struct sctp_endpoint *, + const union sctp_addr *); +int sctp_has_association(const union sctp_addr *laddr, + const union sctp_addr *paddr); + +int sctp_verify_init(const struct sctp_association *asoc, sctp_cid_t, + sctp_init_chunk_t *peer_init, struct sctp_chunk *chunk, + struct sctp_chunk **err_chunk); +int sctp_process_init(struct sctp_association *, sctp_cid_t cid, + const union sctp_addr *peer, + sctp_init_chunk_t *init, int gfp); +int sctp_process_param(struct sctp_association *, union sctp_params param, + const union sctp_addr *from, int gfp); +__u32 sctp_generate_tag(const struct sctp_endpoint *); +__u32 sctp_generate_tsn(const struct sctp_endpoint *); + + +/* RFC2960 + * + * 12. Recommended Transmission Control Block (TCB) Parameters + * + * This section details a recommended set of parameters that should + * be contained within the TCB for an implementation. This section is + * for illustrative purposes and should not be deemed as requirements + * on an implementation or as an exhaustive list of all parameters + * inside an SCTP TCB. Each implementation may need its own additional + * parameters for optimization. + */ + + +/* Here we have information about each individual association. */ +struct sctp_association { + + /* A base structure common to endpoint and association. + * In this context, it represents the associations's view + * of the local endpoint of the association. + */ + struct sctp_ep_common base; + + /* Associations on the same socket. */ + struct list_head asocs; + + /* This is a signature that lets us know that this is a + * struct sctp_association data structure. Used for mapping an + * association id to an association. + */ + __u32 eyecatcher; + + /* This is our parent endpoint. */ + struct sctp_endpoint *ep; + + /* These are those association elements needed in the cookie. */ + sctp_cookie_t c; + + /* This is all information about our peer. */ + struct { + /* rwnd + * + * Peer Rwnd : Current calculated value of the peer's rwnd. + */ + __u32 rwnd; + + /* transport_addr_list + * + * Peer : A list of SCTP transport addresses that the + * Transport : peer is bound to. This information is derived + * Address : from the INIT or INIT ACK and is used to + * List : associate an inbound packet with a given + * : association. Normally this information is + * : hashed or keyed for quick lookup and access + * : of the TCB. + * + * It is a list of SCTP_transport's. + */ + struct list_head transport_addr_list; + + /* port + * The transport layer port number. + */ + __u16 port; + + /* primary_path + * + * Primary : This is the current primary destination + * Path : transport address of the peer endpoint. It + * : may also specify a source transport address + * : on this endpoint. + * + * All of these paths live on transport_addr_list. + * + * At the bakeoffs, we discovered that the intent of + * primaryPath is that it only changes when the ULP + * asks to have it changed. We add the activePath to + * designate the connection we are currently using to + * transmit new data and most control chunks. + */ + struct sctp_transport *primary_path; + + /* Cache the primary path address here, when we + * need a an address for msg_name. + */ + union sctp_addr primary_addr; + + /* active_path + * The path that we are currently using to + * transmit new data and most control chunks. + */ + struct sctp_transport *active_path; + + /* retran_path + * + * RFC2960 6.4 Multi-homed SCTP Endpoints + * ... + * Furthermore, when its peer is multi-homed, an + * endpoint SHOULD try to retransmit a chunk to an + * active destination transport address that is + * different from the last destination address to + * which the DATA chunk was sent. + */ + struct sctp_transport *retran_path; + + /* Pointer to last transport I have sent on. */ + struct sctp_transport *last_sent_to; + + /* This is the last transport I have received DATA on. */ + struct sctp_transport *last_data_from; + + /* + * Mapping An array of bits or bytes indicating which out of + * Array order TSN's have been received (relative to the + * Last Rcvd TSN). If no gaps exist, i.e. no out of + * order packets have been received, this array + * will be set to all zero. This structure may be + * in the form of a circular buffer or bit array. + * + * Last Rcvd : This is the last TSN received in + * TSN : sequence. This value is set initially by + * : taking the peer's Initial TSN, received in + * : the INIT or INIT ACK chunk, and subtracting + * : one from it. + * + * Throughout most of the specification this is called the + * "Cumulative TSN ACK Point". In this case, we + * ignore the advice in 12.2 in favour of the term + * used in the bulk of the text. This value is hidden + * in tsn_map--we get it by calling sctp_tsnmap_get_ctsn(). + */ + struct sctp_tsnmap tsn_map; + __u8 _map[sctp_tsnmap_storage_size(SCTP_TSN_MAP_SIZE)]; + + /* Do we need to sack the peer? */ + __u8 sack_needed; + /* These are capabilities which our peer advertised. */ + __u8 ecn_capable; /* Can peer do ECN? */ + __u8 ipv4_address; /* Peer understands IPv4 addresses? */ + __u8 ipv6_address; /* Peer understands IPv6 addresses? */ + __u8 hostname_address;/* Peer understands DNS addresses? */ + sctp_inithdr_t i; + int cookie_len; + void *cookie; + + /* ADDIP Extention (ADDIP) --xguo */ + /* minus 1 (ADDIP sec. 4.2 C1) */ + __u32 addip_serial; + } peer; + + /* State : A state variable indicating what state the + * : association is in, i.e. COOKIE-WAIT, + * : COOKIE-ECHOED, ESTABLISHED, SHUTDOWN-PENDING, + * : SHUTDOWN-SENT, SHUTDOWN-RECEIVED, SHUTDOWN-ACK-SENT. + * + * Note: No "CLOSED" state is illustrated since if a + * association is "CLOSED" its TCB SHOULD be removed. + * + * In this implementation we DO have a CLOSED + * state which is used during initiation and shutdown. + * + * State takes values from SCTP_STATE_*. + */ + sctp_state_t state; + + /* When did we enter this state? */ + int state_timestamp; + + /* The cookie life I award for any cookie. */ + struct timeval cookie_life; + + /* Overall : The overall association error count. + * Error Count : [Clear this any time I get something.] + */ + int overall_error_count; + + /* Overall : The threshold for this association that if + * Error : the Overall Error Count reaches will cause + * Threshold : this association to be torn down. + */ + int overall_error_threshold; + + /* These are the association's initial, max, and min RTO values. + * These values will be initialized by system defaults, but can + * be modified via the SCTP_RTOINFO socket option. + */ + __u32 rto_initial; + __u32 rto_max; + __u32 rto_min; + + /* Maximum number of new data packets that can be sent in a burst. */ + int max_burst; + + /* This is the max_retrans value for the association. This value will + * be initialized initialized from system defaults, but can be + * modified by the SCTP_ASSOCINFO socket option. + */ + int max_retrans; + + /* Maximum number of times the endpoint will retransmit INIT */ + __u16 max_init_attempts; + + /* How many times have we resent an INIT? */ + __u16 init_retries; + + /* The largest timeout or RTO value to use in attempting an INIT */ + __u16 max_init_timeo; + + + int timeouts[SCTP_NUM_TIMEOUT_TYPES]; + struct timer_list timers[SCTP_NUM_TIMEOUT_TYPES]; + + /* Transport to which SHUTDOWN chunk was last sent. */ + struct sctp_transport *shutdown_last_sent_to; + + /* Next TSN : The next TSN number to be assigned to a new + * : DATA chunk. This is sent in the INIT or INIT + * : ACK chunk to the peer and incremented each + * : time a DATA chunk is assigned a TSN + * : (normally just prior to transmit or during + * : fragmentation). + */ + __u32 next_tsn; + + /* + * Last Rcvd : This is the last TSN received in sequence. This value + * TSN : is set initially by taking the peer's Initial TSN, + * : received in the INIT or INIT ACK chunk, and + * : subtracting one from it. + * + * Most of RFC 2960 refers to this as the Cumulative TSN Ack Point. + */ + + __u32 ctsn_ack_point; + + /* Highest TSN that is acknowledged by incoming SACKs. */ + __u32 highest_sacked; + + /* The number of unacknowledged data chunks. Reported through + * the SCTP_STATUS sockopt. + */ + __u16 unack_data; + + /* This is the association's receive buffer space. This value is used + * to set a_rwnd field in an INIT or a SACK chunk. + */ + __u32 rwnd; + + /* This is the last advertised value of rwnd over a SACK chunk. */ + __u32 a_rwnd; + + /* Number of bytes by which the rwnd has slopped. The rwnd is allowed + * to slop over a maximum of the association's frag_point. + */ + __u32 rwnd_over; + + /* This is the sndbuf size in use for the association. + * This corresponds to the sndbuf size for the association, + * as specified in the sk->sndbuf. + */ + int sndbuf_used; + + /* This is the wait queue head for send requests waiting on + * the association sndbuf space. + */ + wait_queue_head_t wait; + + /* Association : The smallest PMTU discovered for all of the + * PMTU : peer's transport addresses. + */ + __u32 pmtu; + + /* The message size at which SCTP fragmentation will occur. */ + __u32 frag_point; + + /* Ack State : This flag indicates if the next received + * : packet is to be responded to with a + * : SACK. This is initializedto 0. When a packet + * : is received it is incremented. If this value + * : reaches 2 or more, a SACK is sent and the + * : value is reset to 0. Note: This is used only + * : when no DATA chunks are received out of + * : order. When DATA chunks are out of order, + * : SACK's are not delayed (see Section 6). + */ + /* Do we need to send an ack? + * When counters[SctpCounterAckState] is above 1 we do! + */ + int counters[SCTP_NUMBER_COUNTERS]; + + struct { + __u16 stream; + __u16 flags; + __u32 ppid; + __u32 context; + __u32 timetolive; + } defaults; + + /* This tracks outbound ssn for a given stream. */ + struct sctp_ssnmap *ssnmap; + + /* All outbound chunks go through this structure. */ + struct sctp_outq outqueue; + + /* A smart pipe that will handle reordering and fragmentation, + * as well as handle passing events up to the ULP. + */ + struct sctp_ulpq ulpq; + + /* Need to send an ECNE Chunk? */ + int need_ecne; + + /* Last TSN that caused an ECNE Chunk to be sent. */ + __u32 last_ecne_tsn; + + /* Last TSN that caused a CWR Chunk to be sent. */ + __u32 last_cwr_tsn; + + /* How many duplicated TSNs have we seen? */ + int numduptsns; + + /* Number of seconds of idle time before an association is closed. */ + __u32 autoclose; + + /* Name for debugging output... */ + char *debug_name; + + /* These are to support + * "SCTP Extensions for Dynamic Reconfiguration of IP Addresses + * and Enforcement of Flow and Message Limits" + * + * or "ADDIP" for short. + */ + + /* Is the ADDIP extension enabled for this association? */ + int addip_enable; + + /* ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks + * + * R1) One and only one ASCONF Chunk MAY be in transit and + * unacknowledged at any one time. If a sender, after sending + * an ASCONF chunk, decides it needs to transfer another + * ASCONF Chunk, it MUST wait until the ASCONF-ACK Chunk + * returns from the previous ASCONF Chunk before sending a + * subsequent ASCONF. Note this restriction binds each side, + * so at any time two ASCONF may be in-transit on any given + * association (one sent from each endpoint). + * + * [This is our one-and-only-one ASCONF in flight. If we do + * not have an ASCONF in flight, this is NULL.] + */ + sctp_chunk_t *addip_last_asconf; + + /* ADDIP Section 4.2 Upon reception of an ASCONF Chunk. + * + * IMPLEMENTATION NOTE: As an optimization a receiver may wish + * to save the last ASCONF-ACK for some predetermined period + * of time and instead of re-processing the ASCONF (with the + * same serial number) it may just re-transmit the + * ASCONF-ACK. It may wish to use the arrival of a new serial + * number to discard the previously saved ASCONF-ACK or any + * other means it may choose to expire the saved ASCONF-ACK. + * + * [This is our saved ASCONF-ACK. We invalidate it when a new + * ASCONF serial number arrives.] + */ + sctp_chunk_t *addip_last_asconf_ack; + + /* These ASCONF chunks are waiting to be sent. + * + * These chunaks can't be pushed to outqueue until receiving + * ASCONF_ACK for the previous ASCONF indicated by + * addip_last_asconf, so as to guarantee that only one ASCONF + * is in flight at any time. + * + * ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks + * + * In defining the ASCONF Chunk transfer procedures, it is + * essential that these transfers MUST NOT cause congestion + * within the network. To achieve this, we place these + * restrictions on the transfer of ASCONF Chunks: + * + * R1) One and only one ASCONF Chunk MAY be in transit and + * unacknowledged at any one time. If a sender, after sending + * an ASCONF chunk, decides it needs to transfer another + * ASCONF Chunk, it MUST wait until the ASCONF-ACK Chunk + * returns from the previous ASCONF Chunk before sending a + * subsequent ASCONF. Note this restriction binds each side, + * so at any time two ASCONF may be in-transit on any given + * association (one sent from each endpoint). + * + * + * [I really think this is EXACTLY the sort of intelligence + * which already resides in sctp_outq. Please move this + * queue and its supporting logic down there. --piggy] + */ + struct sk_buff_head addip_chunks; + + /* ADDIP Section 4.1 ASCONF Chunk Procedures + * + * A2) A serial number should be assigned to the Chunk. The + * serial number should be a monotonically increasing + * number. All serial numbers are defined to be initialized at + * the start of the association to the same value as the + * Initial TSN. + * + * [and] + * + * ADDIP + * 3.1.1 Address/Stream Configuration Change Chunk (ASCONF) + * + * Serial Number : 32 bits (unsigned integer) + * + * This value represents a Serial Number for the ASCONF + * Chunk. The valid range of Serial Number is from 0 to + * 4294967295 (2**32 - 1). Serial Numbers wrap back to 0 + * after reaching 4294967295. + */ + __u32 addip_serial; + + /* Is it a temporary association? */ + __u8 temp; +}; + + +/* An eyecatcher for determining if we are really looking at an + * association data structure. + */ +enum { + SCTP_ASSOC_EYECATCHER = 0xa550c123, +}; + +/* Recover the outter association structure. */ +static inline struct sctp_association *sctp_assoc(struct sctp_ep_common *base) +{ + struct sctp_association *asoc; + + asoc = container_of(base, struct sctp_association, base); + return asoc; +} + +/* These are function signatures for manipulating associations. */ + + +struct sctp_association * +sctp_association_new(const struct sctp_endpoint *, const struct sock *, + sctp_scope_t scope, int gfp); +struct sctp_association * +sctp_association_init(struct sctp_association *, const struct sctp_endpoint *, + const struct sock *, sctp_scope_t scope, + int gfp); +void sctp_association_free(struct sctp_association *); +void sctp_association_put(struct sctp_association *); +void sctp_association_hold(struct sctp_association *); + +struct sctp_transport *sctp_assoc_choose_shutdown_transport( + struct sctp_association *); +void sctp_assoc_update_retran_path(struct sctp_association *); +struct sctp_transport *sctp_assoc_lookup_paddr(const struct sctp_association *, + const union sctp_addr *); +struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *, + const union sctp_addr *address, + const int gfp); +void sctp_assoc_control_transport(struct sctp_association *, + struct sctp_transport *, + sctp_transport_cmd_t, sctp_sn_error_t); +struct sctp_transport *sctp_assoc_lookup_tsn(struct sctp_association *, __u32); +struct sctp_transport *sctp_assoc_is_match(struct sctp_association *, + const union sctp_addr *, + const union sctp_addr *); +void sctp_assoc_migrate(struct sctp_association *, struct sock *); +void sctp_assoc_update(struct sctp_association *old, + struct sctp_association *new); + +__u32 sctp_association_get_next_tsn(struct sctp_association *); +__u32 sctp_association_get_tsn_block(struct sctp_association *, int); + +void sctp_assoc_sync_pmtu(struct sctp_association *); +void sctp_assoc_rwnd_increase(struct sctp_association *, int); +void sctp_assoc_rwnd_decrease(struct sctp_association *, int); +void sctp_assoc_set_primary(struct sctp_association *, + struct sctp_transport *); +int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *, int); +int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *, + sctp_cookie_t *, int gfp); + +int sctp_cmp_addr_exact(const union sctp_addr *ss1, + const union sctp_addr *ss2); +sctp_chunk_t *sctp_get_ecne_prepend(struct sctp_association *asoc); +sctp_chunk_t *sctp_get_no_prepend(struct sctp_association *asoc); + +/* A convenience structure to parse out SCTP specific CMSGs. */ +typedef struct sctp_cmsgs { + struct sctp_initmsg *init; + struct sctp_sndrcvinfo *info; +} sctp_cmsgs_t; + +/* Structure for tracking memory objects */ +typedef struct { + char *label; + atomic_t *counter; +} sctp_dbg_objcnt_entry_t; + +#endif /* __sctp_structs_h__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/tsnmap.h linux-2.4.23-pre8/include/net/sctp/tsnmap.h --- linux-2.4.22/include/net/sctp/tsnmap.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/tsnmap.h 2003-10-22 22:49:16.000000000 +0000 @@ -0,0 +1,186 @@ +/* SCTP kernel reference Implementation Copyright (C) 1999-2001 + * Cisco, Motorola, Intel, and International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * These are the definitions needed for the tsnmap type. The tsnmap is used + * to track out of order TSNs received. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Jon Grimm + * La Monte H.P. Yarroll + * Karl Knutson + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ +#include + +#ifndef __sctp_tsnmap_h__ +#define __sctp_tsnmap_h__ + +/* RFC 2960 12.2 Parameters necessary per association (i.e. the TCB) + * Mapping An array of bits or bytes indicating which out of + * Array order TSN's have been received (relative to the + * Last Rcvd TSN). If no gaps exist, i.e. no out of + * order packets have been received, this array + * will be set to all zero. This structure may be + * in the form of a circular buffer or bit array. + */ +struct sctp_tsnmap { + /* This array counts the number of chunks with each TSN. + * It points at one of the two buffers with which we will + * ping-pong between. + */ + __u8 *tsn_map; + + /* This marks the tsn which overflows the tsn_map, when the + * cumulative ack point reaches this point we know we can switch + * maps (tsn_map and overflow_map swap). + */ + __u32 overflow_tsn; + + /* This is the overflow array for tsn_map. + * It points at one of the other ping-pong buffers. + */ + __u8 *overflow_map; + + /* This is the TSN at tsn_map[0]. */ + __u32 base_tsn; + + /* Last Rcvd : This is the last TSN received in + * TSN : sequence. This value is set initially by + * : taking the peer's Initial TSN, received in + * : the INIT or INIT ACK chunk, and subtracting + * : one from it. + * + * Throughout most of the specification this is called the + * "Cumulative TSN ACK Point". In this case, we + * ignore the advice in 12.2 in favour of the term + * used in the bulk of the text. + */ + __u32 cumulative_tsn_ack_point; + + /* This is the minimum number of TSNs we can track. This corresponds + * to the size of tsn_map. Note: the overflow_map allows us to + * potentially track more than this quantity. + */ + __u16 len; + + /* This is the highest TSN we've marked. */ + __u32 max_tsn_seen; + + /* Data chunks pending receipt. used by SCTP_STATUS sockopt */ + __u16 pending_data; + + /* We record duplicate TSNs here. We clear this after + * every SACK. Store up to SCTP_MAX_DUP_TSNS worth of + * information. + */ + __u32 dup_tsns[SCTP_MAX_DUP_TSNS]; + __u16 num_dup_tsns; + + int malloced; + + __u8 raw_map[0]; +}; + +struct sctp_tsnmap_iter { + __u32 start; +}; + +/* Create a new tsnmap. */ +struct sctp_tsnmap *sctp_tsnmap_new(__u16 len, __u32 init_tsn, int gfp); + +/* Dispose of a tsnmap. */ +void sctp_tsnmap_free(struct sctp_tsnmap *); + +/* This macro assists in creation of external storage for variable length + * internal buffers. We double allocate so the overflow map works. + */ +#define sctp_tsnmap_storage_size(count) (sizeof(__u8) * (count) * 2) + +/* Initialize a block of memory as a tsnmap. */ +struct sctp_tsnmap *sctp_tsnmap_init(struct sctp_tsnmap *, __u16 len, + __u32 initial_tsn); + +/* Test the tracking state of this TSN. + * Returns: + * 0 if the TSN has not yet been seen + * >0 if the TSN has been seen (duplicate) + * <0 if the TSN is invalid (too large to track) + */ +int sctp_tsnmap_check(const struct sctp_tsnmap *, __u32 tsn); + +/* Mark this TSN as seen. */ +void sctp_tsnmap_mark(struct sctp_tsnmap *, __u32 tsn); + +/* Retrieve the Cumulative TSN ACK Point. */ +__u32 sctp_tsnmap_get_ctsn(const struct sctp_tsnmap *); + +/* Retrieve the highest TSN we've seen. */ +__u32 sctp_tsnmap_get_max_tsn_seen(const struct sctp_tsnmap *); + +/* How many Duplicate TSNs are stored? */ +static inline __u16 sctp_tsnmap_num_dups(struct sctp_tsnmap *map) +{ + return map->num_dup_tsns; +} + +/* Return pointer to duplicate tsn array as needed by SACK. */ +static inline __u32 *sctp_tsnmap_get_dups(struct sctp_tsnmap *map) +{ + map->num_dup_tsns = 0; + return map->dup_tsns; +} + +/* Mark a duplicate TSN. Note: limit the storage of duplicate TSN + * information. + */ +static inline void sctp_tsnmap_mark_dup(struct sctp_tsnmap *map, __u32 tsn) +{ + if (map->num_dup_tsns < SCTP_MAX_DUP_TSNS) + map->dup_tsns[map->num_dup_tsns++] = htonl(tsn); +} + +/* Renege a TSN that was seen. */ +void sctp_tsnmap_renege(struct sctp_tsnmap *, __u32 tsn); + +/* Is there a gap in the TSN map? */ +int sctp_tsnmap_has_gap(const struct sctp_tsnmap *); + +/* Initialize a gap ack block interator from user-provided memory. */ +void sctp_tsnmap_iter_init(const struct sctp_tsnmap *, + struct sctp_tsnmap_iter *); + +/* Get the next gap ack blocks. We return 0 if there are no more + * gap ack blocks. + */ +int sctp_tsnmap_next_gap_ack(const struct sctp_tsnmap *, + struct sctp_tsnmap_iter *,__u16 *start, __u16 *end); + +#endif /* __sctp_tsnmap_h__ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/ulpevent.h linux-2.4.23-pre8/include/net/sctp/ulpevent.h --- linux-2.4.22/include/net/sctp/ulpevent.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/ulpevent.h 2003-10-22 22:49:41.000000000 +0000 @@ -0,0 +1,156 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * These are the definitions needed for the sctp_ulpevent type. The + * sctp_ulpevent type is used to carry information from the state machine + * upwards to the ULP. + * + * This file is part of the SCTP kernel reference Implementation + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Jon Grimm + * La Monte H.P. Yarroll + * Karl Knutson + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#ifndef __sctp_ulpevent_h__ +#define __sctp_ulpevent_h__ + +#include + +/* A structure to carry information to the ULP (e.g. Sockets API) */ +/* Warning: This sits inside an skb.cb[] area. Be very careful of + * growing this structure as it is at the maximum limit now. + */ +struct sctp_ulpevent { + struct sctp_sndrcvinfo sndrcvinfo; + int msg_flags; + int iif; +}; +#define event_asoc sndrcvinfo.sinfo_assoc_id + +/* Retrieve the skb this event sits inside of. */ +static inline struct sk_buff *sctp_event2skb(struct sctp_ulpevent *ev) +{ + return container_of((void *)ev, struct sk_buff, cb); +} + +/* Retrieve & cast the event sitting inside the skb. */ +static inline struct sctp_ulpevent *sctp_skb2event(struct sk_buff *skb) +{ + return (struct sctp_ulpevent *)skb->cb; +} + +struct sctp_ulpevent *sctp_ulpevent_new(int size, int flags, int gfp); +struct sctp_ulpevent *sctp_ulpevent_init(struct sctp_ulpevent *, int flags); +void sctp_ulpevent_free(struct sctp_ulpevent *); +int sctp_ulpevent_is_notification(const struct sctp_ulpevent *); + +struct sctp_ulpevent *sctp_ulpevent_make_assoc_change( + const struct sctp_association *asoc, + __u16 flags, + __u16 state, + __u16 error, + __u16 outbound, + __u16 inbound, + int gfp); + +struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change( + const struct sctp_association *asoc, + const struct sockaddr_storage *aaddr, + int flags, + int state, + int error, + int gfp); + +struct sctp_ulpevent *sctp_ulpevent_make_remote_error( + const struct sctp_association *asoc, + struct sctp_chunk *chunk, + __u16 flags, + int gfp); +struct sctp_ulpevent *sctp_ulpevent_make_send_failed( + const struct sctp_association *asoc, + struct sctp_chunk *chunk, + __u16 flags, + __u32 error, + int gfp); + +struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event( + const struct sctp_association *asoc, + __u16 flags, + int gfp); + +struct sctp_ulpevent *sctp_ulpevent_make_pdapi( + const struct sctp_association *asoc, + __u32 indication, int gfp); + +struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, + struct sctp_chunk *chunk, + int gfp); + +void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event, + struct msghdr *); +__u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event); + +/* Is this event type enabled? */ +static inline int sctp_ulpevent_type_enabled(__u16 sn_type, + struct sctp_event_subscribe *mask) +{ + char *amask = (char *) mask; + return amask[sn_type - SCTP_SN_TYPE_BASE]; +} + +/* Given an event subscription, is this event enabled? */ +static inline int sctp_ulpevent_is_enabled(const struct sctp_ulpevent *event, + struct sctp_event_subscribe *mask) +{ + __u16 sn_type; + int enabled = 1; + + if (sctp_ulpevent_is_notification(event)) { + sn_type = sctp_ulpevent_get_notification_type(event); + enabled = sctp_ulpevent_type_enabled(sn_type, mask); + } + return enabled; +} + +#endif /* __sctp_ulpevent_h__ */ + + + + + + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/ulpqueue.h linux-2.4.23-pre8/include/net/sctp/ulpqueue.h --- linux-2.4.22/include/net/sctp/ulpqueue.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/ulpqueue.h 2003-10-22 22:47:56.000000000 +0000 @@ -0,0 +1,89 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * These are the definitions needed for the sctp_ulpq type. The + * sctp_ulpq is the interface between the Upper Layer Protocol, or ULP, + * and the core SCTP state machine. This is the component which handles + * reassembly and ordering. + * + * The SCTP reference implementation 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. + * + * the SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email addresses: + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Jon Grimm + * La Monte H.P. Yarroll + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#ifndef __sctp_ulpqueue_h__ +#define __sctp_ulpqueue_h__ + +/* A structure to carry information to the ULP (e.g. Sockets API) */ +struct sctp_ulpq { + char malloced; + char pd_mode; + struct sctp_association *asoc; + struct sk_buff_head reasm; + struct sk_buff_head lobby; +}; + +/* Prototypes. */ +struct sctp_ulpq *sctp_ulpq_new(struct sctp_association *asoc, int gfp); +struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *, + struct sctp_association *); +void sctp_ulpq_free(struct sctp_ulpq *); + +/* Add a new DATA chunk for processing. */ +int sctp_ulpq_tail_data(struct sctp_ulpq *, struct sctp_chunk *, int); + +/* Add a new event for propagation to the ULP. */ +int sctp_ulpq_tail_event(struct sctp_ulpq *, struct sctp_ulpevent *ev); + +/* Renege previously received chunks. */ +void sctp_ulpq_renege(struct sctp_ulpq *, struct sctp_chunk *, int); + +/* Perform partial delivery. */ +void sctp_ulpq_partial_delivery(struct sctp_ulpq *, struct sctp_chunk *, int); + +/* Abort the partial delivery. */ +void sctp_ulpq_abort_pd(struct sctp_ulpq *, int); + +/* Clear the partial data delivery condition on this socket. */ +int sctp_clear_pd(struct sock *sk); + +#endif /* __sctp_ulpqueue_h__ */ + + + + + + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sctp/user.h linux-2.4.23-pre8/include/net/sctp/user.h --- linux-2.4.22/include/net/sctp/user.h 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sctp/user.h 2003-10-22 22:48:41.000000000 +0000 @@ -0,0 +1,628 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001 International Business Machines, Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * This header represents the structures and constants needed to support + * the SCTP Extension to the Sockets API. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * R. Stewart + * K. Morneau + * Q. Xie + * Karl Knutson + * Jon Grimm + * Daisy Chang + * + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ +#include +#include + +#ifndef __net_sctp_user_h__ +#define __net_sctp_user_h__ + +struct sctp_association; +typedef struct sctp_association * sctp_assoc_t; + +/* The following symbols come from the Sockets API Extensions for + * SCTP . + */ +enum sctp_optname { + SCTP_RTOINFO, +#define SCTP_RTOINFO SCTP_RTOINFO + SCTP_ASSOCRTXINFO, +#define SCTP_ASSOCRTXINFO SCTP_ASSOCRTXINFO + SCTP_INITMSG, +#define SCTP_INITMSG SCTP_INITMSG + SCTP_AUTO_CLOSE, +#define SCTP_AUTO_CLOSE SCTP_AUTO_CLOSE + SCTP_SET_PRIMARY_ADDR, +#define SCTP_SET_PRIMARY_ADDR SCTP_SET_PRIMARY_ADDR + SCTP_SET_PEER_PRIMARY_ADDR, +#define SCTP_SET_PEER_PRIMARY_ADDR SCTP_SET_PEER_PRIMARY_ADDR + SCTP_SET_ADAPTATION_LAYER, +#define SCTP_SET_ADAPTATION_LAYER SCTP_SET_ADAPTATION_LAYER + SCTP_SET_STREAM_TIMEOUTS, +#define SCTP_SET_STREAM_TIMEOUTS SCTP_SET_STREAM_TIMEOUTS + SCTP_DISABLE_FRAGMENTS, +#define SCTP_DISABLE_FRAGMENTS SCTP_DISABLE_FRAGMENTS + SCTP_SET_PEER_ADDR_PARAMS, +#define SCTP_SET_PEER_ADDR_PARAMS SCTP_SET_PEER_ADDR_PARAMS + SCTP_GET_PEER_ADDR_PARAMS, +#define SCTP_GET_PEER_ADDR_PARAMS SCTP_GET_PEER_ADDR_PARAMS + SCTP_STATUS, +#define SCTP_STATUS SCTP_STATUS + SCTP_GET_PEER_ADDR_INFO, +#define SCTP_GET_PEER_ADDR_INFO SCTP_GET_PEER_ADDR_INFO + SCTP_SET_EVENTS, +#define SCTP_SET_EVENTS SCTP_SET_EVENTS + SCTP_AUTOCLOSE, +#define SCTP_AUTOCLOSE SCTP_AUTOCLOSE + SCTP_SET_DEFAULT_SEND_PARAM, +#define SCTP_SET_DEFAULT_SEND_PARAM SCTP_SET_DEFAULT_SEND_PARAM + + SCTP_SOCKOPT_DEBUG_NAME = 42, /* FIXME */ +#define SCTP_SOCKOPT_DEBUG_NAME SCTP_SOCKOPT_DEBUG_NAME + + SCTP_SOCKOPT_BINDX_ADD, /* BINDX requests for adding addresses. */ +#define SCTP_SOCKOPT_BINDX_ADD SCTP_SOCKOPT_BINDX_ADD + SCTP_SOCKOPT_BINDX_REM, /* BINDX requests for removing addresses. */ +#define SCTP_SOCKOPT_BINDX_REM SCTP_SOCKOPT_BINDX_REM + SCTP_SOCKOPT_PEELOFF, /* peel off association. */ +#define SCTP_SOCKOPT_PEELOFF SCTP_SOCKOPT_PEELOFF + SCTP_GET_PEER_ADDRS_NUM, /* Get number of peer addresss. */ +#define SCTP_GET_PEER_ADDRS_NUM SCTP_GET_PEER_ADDRS_NUM + SCTP_GET_PEER_ADDRS, /* Get all peer addresss. */ +#define SCTP_GET_PEER_ADDRS SCTP_GET_PEER_ADDRS + SCTP_GET_LOCAL_ADDRS_NUM, /* Get number of local addresss. */ +#define SCTP_GET_LOCAL_ADDRS_NUM SCTP_GET_LOCAL_ADDRS_NUM + SCTP_GET_LOCAL_ADDRS, /* Get all local addresss. */ +#define SCTP_GET_LOCAL_ADDRS SCTP_GET_LOCAL_ADDRS + SCTP_NODELAY, /* Get/set nodelay option. */ +#define SCTP_NODELAY SCTP_NODELAY +}; + + +/* + * 5.2 SCTP msg_control Structures + * + * A key element of all SCTP-specific socket extensions is the use of + * ancillary data to specify and access SCTP-specific data via the + * struct msghdr's msg_control member used in sendmsg() and recvmsg(). + * Fine-grained control over initialization and sending parameters are + * handled with ancillary data. + * + * Each ancillary data item is preceeded by a struct cmsghdr (see + * Section 5.1), which defines the function and purpose of the data + * contained in in the cmsg_data[] member. + */ + +/* + * 5.2.1 SCTP Initiation Structure (SCTP_INIT) + * + * This cmsghdr structure provides information for initializing new + * SCTP associations with sendmsg(). The SCTP_INITMSG socket option + * uses this same data structure. This structure is not used for + * recvmsg(). + * + * cmsg_level cmsg_type cmsg_data[] + * ------------ ------------ ---------------------- + * IPPROTO_SCTP SCTP_INIT struct sctp_initmsg + * + */ +struct sctp_initmsg { + __u16 sinit_num_ostreams; + __u16 sinit_max_instreams; + __u16 sinit_max_attempts; + __u16 sinit_max_init_timeo; +}; + + +/* + * 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) + * + * This cmsghdr structure specifies SCTP options for sendmsg() and + * describes SCTP header information about a received message through + * recvmsg(). + * + * cmsg_level cmsg_type cmsg_data[] + * ------------ ------------ ---------------------- + * IPPROTO_SCTP SCTP_SNDRCV struct sctp_sndrcvinfo + * + */ +struct sctp_sndrcvinfo { + __u16 sinfo_stream; + __u16 sinfo_ssn; + __u16 sinfo_flags; + __u32 sinfo_ppid; + __u32 sinfo_context; + __u32 sinfo_timetolive; + __u32 sinfo_tsn; + __u32 sinfo_cumtsn; + sctp_assoc_t sinfo_assoc_id; +}; + +/* + * sinfo_flags: 16 bits (unsigned integer) + * + * This field may contain any of the following flags and is composed of + * a bitwise OR of these values. + */ + +enum sctp_sinfo_flags { + MSG_UNORDERED = 1, /* Send/receive message unordered. */ + MSG_ADDR_OVER = 2, /* Override the primary destination. */ + MSG_ABORT=4, /* Send an ABORT message to the peer. */ + /* MSG_EOF is already defined per socket.h */ +}; + + +typedef union { + __u8 raw; + struct sctp_initmsg init; + struct sctp_sndrcvinfo sndrcv; +} sctp_cmsg_data_t; + +/* These are cmsg_types. */ +typedef enum sctp_cmsg_type { + SCTP_INIT, /* 5.2.1 SCTP Initiation Structure */ + SCTP_SNDRCV, /* 5.2.2 SCTP Header Information Structure */ +} sctp_cmsg_t; + + +/* + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * Communication notifications inform the ULP that an SCTP association + * has either begun or ended. The identifier for a new association is + * provided by this notificaion. The notification information has the + * following format: + * + */ + +struct sctp_assoc_change { + __u16 sac_type; + __u16 sac_flags; + __u32 sac_length; + __u16 sac_state; + __u16 sac_error; + __u16 sac_outbound_streams; + __u16 sac_inbound_streams; + sctp_assoc_t sac_assoc_id; +}; + +/* + * sac_state: 32 bits (signed integer) + * + * This field holds one of a number of values that communicate the + * event that happened to the association. They include: + * + * Note: The following state names deviate from the API draft as + * the names clash too easily with other kernel symbols. + */ +enum sctp_sac_state { + SCTP_COMM_UP, + SCTP_COMM_LOST, + SCTP_RESTART, + SCTP_SHUTDOWN_COMP, + SCTP_CANT_STR_ASSOC, +}; + +/* + * 5.3.1.2 SCTP_PEER_ADDR_CHANGE + * + * When a destination address on a multi-homed peer encounters a change + * an interface details event is sent. The information has the + * following structure: + */ +struct sctp_paddr_change { + __u16 spc_type; + __u16 spc_flags; + __u32 spc_length; + struct sockaddr_storage spc_aaddr; + int spc_state; + int spc_error; + sctp_assoc_t spc_assoc_id; +}; + +/* + * spc_state: 32 bits (signed integer) + * + * This field holds one of a number of values that communicate the + * event that happened to the address. They include: + */ +enum sctp_spc_state { + ADDRESS_AVAILABLE, + ADDRESS_UNREACHABLE, + ADDRESS_REMOVED, + ADDRESS_ADDED, + ADDRESS_MADE_PRIM, +}; + + +/* + * 5.3.1.3 SCTP_REMOTE_ERROR + * + * A remote peer may send an Operational Error message to its peer. + * This message indicates a variety of error conditions on an + * association. The entire error TLV as it appears on the wire is + * included in a SCTP_REMOTE_ERROR event. Please refer to the SCTP + * specification [SCTP] and any extensions for a list of possible + * error formats. SCTP error TLVs have the format: + */ +struct sctp_remote_error { + __u16 sre_type; + __u16 sre_flags; + __u32 sre_length; + __u16 sre_error; + __u16 sre_len; + sctp_assoc_t sre_assoc_id; + __u8 sre_data[0]; +}; + + +/* + * 5.3.1.4 SCTP_SEND_FAILED + * + * If SCTP cannot deliver a message it may return the message as a + * notification. + */ +struct sctp_send_failed { + __u16 ssf_type; + __u16 ssf_flags; + __u32 ssf_length; + __u32 ssf_error; + struct sctp_sndrcvinfo ssf_info; + sctp_assoc_t ssf_assoc_id; + __u8 ssf_data[0]; +}; + +/* + * ssf_flags: 16 bits (unsigned integer) + * + * The flag value will take one of the following values + * + * SCTP_DATA_UNSENT - Indicates that the data was never put on + * the wire. + * + * SCTP_DATA_SENT - Indicates that the data was put on the wire. + * Note that this does not necessarily mean that the + * data was (or was not) successfully delivered. + */ + +enum sctp_ssf_flags { + SCTP_DATA_UNSENT, + SCTP_DATA_SENT, +}; + +/* + * 5.3.1.5 SCTP_SHUTDOWN_EVENT + * + * When a peer sends a SHUTDOWN, SCTP delivers this notification to + * inform the application that it should cease sending data. + */ + +struct sctp_shutdown_event { + __u16 sse_type; + __u16 sse_flags; + __u32 sse_length; + sctp_assoc_t sse_assoc_id; +}; + +/* + * 5.3.1.6 SCTP_ADAPTION_INDICATION + * + * When a peer sends a Adaption Layer Indication parameter , SCTP + * delivers this notification to inform the application + * that of the peers requested adaption layer. + */ +struct sctp_adaption_event { + __u16 sai_type; + __u16 sai_flags; + __u32 sai_length; + __u32 sai_adaptation_bits; + sctp_assoc_t sse_assoc_id; +}; + +/* + * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT + * + * When a reciever is engaged in a partial delivery of a + * message this notification will be used to inidicate + * various events. + */ + +struct sctp_rcv_pdapi_event { + __u16 pdapi_type; + __u16 pdapi_flags; + __u32 pdapi_length; + __u32 pdapi_indication; + sctp_assoc_t pdapi_assoc_id; +}; + +enum { SCTP_PARTIAL_DELIVERY_ABORTED=0, }; + +/* + * Described in Section 7.3 + * Ancillary Data and Notification Interest Options + */ +struct sctp_event_subscribe { + __u8 sctp_data_io_event; + __u8 sctp_association_event; + __u8 sctp_address_event; + __u8 sctp_send_failure_event; + __u8 sctp_peer_error_event; + __u8 sctp_shutdown_event; + __u8 sctp_partial_delivery_event; + __u8 sctp_adaption_layer_event; +}; + +/* + * 5.3.1 SCTP Notification Structure + * + * The notification structure is defined as the union of all + * notification types. + * + */ +union sctp_notification { + struct { + __u16 sn_type; /* Notification type. */ + __u16 sn_flags; + __u32 sn_length; + } h; + struct sctp_assoc_change sn_assoc_change; + struct sctp_paddr_change sn_padr_change; + struct sctp_remote_error sn_remote_error; + struct sctp_send_failed sn_send_failed; + struct sctp_shutdown_event sn_shutdown_event; + struct sctp_adaption_event sn_adaption_event; + struct sctp_rcv_pdapi_event sn_rcv_pdapi_event; +}; + +/* Section 5.3.1 + * All standard values for sn_type flags are greater than 2^15. + * Values from 2^15 and down are reserved. + */ + +enum sctp_sn_type { + SCTP_SN_TYPE_BASE = (1<<15), + SCTP_ASSOC_CHANGE, + SCTP_PEER_ADDR_CHANGE, + SCTP_SEND_FAILED, + SCTP_REMOTE_ERROR, + SCTP_SHUTDOWN_EVENT, + SCTP_PARTIAL_DELIVERY_EVENT, + SCTP_ADAPTION_INDICATION, +}; + +/* Notification error codes used to fill up the error fields in some + * notifications. + * SCTP_PEER_ADDRESS_CHAGE : spc_error + * SCTP_ASSOC_CHANGE : sac_error + * These names should be potentially included in the draft 04 of the SCTP + * sockets API specification. + */ +typedef enum sctp_sn_error { + SCTP_FAILED_THRESHOLD, + SCTP_RECEIVED_SACK, + SCTP_HEARTBEAT_SUCCESS, + SCTP_RESPONSE_TO_USER_REQ, + SCTP_INTERNAL_ERROR, + SCTP_SHUTDOWN_GUARD_EXPIRES, + SCTP_PEER_FAULTY, +} sctp_sn_error_t; + +/* + * + * 7.1.14 Peer Address Parameters + * + * Applications can enable or disable heartbeats for any peer address + * of an association, modify an address's heartbeat interval, force a + * heartbeat to be sent immediately, and adjust the address's maximum + * number of retransmissions sent before an address is considered + * unreachable. The following structure is used to access and modify an + * address's parameters: + */ + +struct sctp_paddrparams { + struct sockaddr_storage spp_address; + __u32 spp_hbinterval; + __u16 spp_pathmaxrxt; + sctp_assoc_t spp_assoc_id; +}; + +/* + * 7.2.2 Peer Address Information + * + * Applications can retrieve information about a specific peer address + * of an association, including its reachability state, congestion + * window, and retransmission timer values. This information is + * read-only. The following structure is used to access this + * information: + */ + +struct sctp_paddrinfo { + sctp_assoc_t spinfo_assoc_id; + struct sockaddr_storage spinfo_address; + __s32 spinfo_state; + __u32 spinfo_cwnd; + __u32 spinfo_srtt; + __u32 spinfo_rto; + __u32 spinfo_mtu; +}; + + +/* + * 7.1.1 Retransmission Timeout Parameters (SCTP_RTOINFO) + * + * The protocol parameters used to initialize and bound retransmission + * timeout (RTO) are tunable. See [SCTP] for more information on how + * these parameters are used in RTO calculation. The peer address + * parameter is ignored for TCP style socket. + */ + +struct sctp_rtoinfo { + __u32 srto_initial; + __u32 srto_max; + __u32 srto_min; + sctp_assoc_t srto_assoc_id; +}; + +/* + * 7.1.2 Association Retransmission Parameter (SCTP_ASSOCRTXINFO) + * + * The protocol parameter used to set the number of retransmissions + * sent before an association is considered unreachable. + * See [SCTP] for more information on how this parameter is used. The + * peer address parameter is ignored for TCP style socket. + */ + +struct sctp_assocparams { + __u16 sasoc_asocmaxrxt; + sctp_assoc_t sasoc_assoc_id; +}; + + +/* + * 7.1.9 Set Primary Address (SCTP_SET_PRIMARY_ADDR) + * + * Requests that the peer mark the enclosed address as the association + * primary. The enclosed address must be one of the association's + * locally bound addresses. The following structure is used to make a + * set primary request: + */ + +struct sctp_setprim { + struct sockaddr_storage ssp_addr; + sctp_assoc_t ssp_assoc_id; +}; + +/* + * 7.1.10 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR) + * + * Requests that the local SCTP stack use the enclosed peer address as + * the association primary. The enclosed address must be one of the + * association peer's addresses. The following structure is used to + * make a set peer primary request: + */ + +struct sctp_setpeerprim { + struct sockaddr_storage sspp_addr; + sctp_assoc_t sspp_assoc_id; +}; + +/* + * 7.2.1 Association Status (SCTP_STATUS) + * + * Applications can retrieve current status information about an + * association, including association state, peer receiver window size, + * number of unacked data chunks, and number of data chunks pending + * receipt. This information is read-only. The following structure is + * used to access this information: + */ +struct sctp_status { + sctp_assoc_t sstat_assoc_id; + __s32 sstat_state; + __u32 sstat_rwnd; + __u16 sstat_unackdata; + __u16 sstat_penddata; + __u16 sstat_instrms; + __u16 sstat_outstrms; + __u32 sstat_fragmentation_point; + struct sctp_paddrinfo sstat_primary; +}; + + +/* + * 7.1.12 Set Adaption Layer Indicator + * + * Requests that the local endpoint set the specified Adaption Layer + * Indication parameter for all future + * INIT and INIT-ACK exchanges. + */ + +struct sctp_setadaption { + __u32 ssb_adaption_ind; +}; + +/* + * 7.1.12 Set default message time outs (SCTP_SET_STREAM_TIMEOUTS) + * + * This option requests that the requested stream apply a + * default time-out for messages in queue. + */ +struct sctp_setstrm_timeout { + sctp_assoc_t ssto_assoc_id; + __u32 ssto_timeout; + __u16 ssto_streamid_start; + __u16 ssto_streamid_end; +}; + +/* + * 8.3 8.5 get all peer/local addresses on a socket + * This parameter struct is for getsockopt + */ +struct sctp_getaddrs { + sctp_assoc_t assoc_id; + int addr_num; + struct sockaddr_storage *addrs; +}; + +/* These are bit fields for msghdr->msg_flags. See section 5.1. */ +/* On user space Linux, these live in as an enum. */ +enum sctp_msg_flags { + MSG_NOTIFICATION = 0x8000, +#define MSG_NOTIFICATION MSG_NOTIFICATION +}; + +/* + * 8.1 sctp_bindx() + * + * The flags parameter is formed from the bitwise OR of zero or more of the + * following currently defined flags: + */ +#define BINDX_ADD_ADDR 0x01 +#define BINDX_REM_ADDR 0x02 + +/* This is the structure that is passed as an argument(optval) to + * getsockopt(SCTP_SOCKOPT_PEELOFF). + */ +typedef struct { + sctp_assoc_t associd; + int sd; +} sctp_peeloff_arg_t; + +#endif /* __net_sctp_user_h__ */ + + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/snmp.h linux-2.4.23-pre8/include/net/snmp.h --- linux-2.4.22/include/net/snmp.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/net/snmp.h 2003-10-22 22:48:34.000000000 +0000 @@ -212,6 +212,35 @@ unsigned long __pad[0]; } ____cacheline_aligned; +/* draft-ietf-sigtran-sctp-mib-07.txt */ +struct sctp_mib +{ + unsigned long SctpCurrEstab; + unsigned long SctpActiveEstabs; + unsigned long SctpPassiveEstabs; + unsigned long SctpAborteds; + unsigned long SctpShutdowns; + unsigned long SctpOutOfBlues; + unsigned long SctpChecksumErrors; + unsigned long SctpOutCtrlChunks; + unsigned long SctpOutOrderChunks; + unsigned long SctpOutUnorderChunks; + unsigned long SctpInCtrlChunks; + unsigned long SctpInOrderChunks; + unsigned long SctpInUnorderChunks; + unsigned long SctpFragUsrMsgs; + unsigned long SctpReasmUsrMsgs; + unsigned long SctpOutSCTPPacks; + unsigned long SctpInSCTPPacks; + unsigned long SctpRtoAlgorithm; + unsigned long SctpRtoMin; + unsigned long SctpRtoMax; + unsigned long SctpRtoInitial; + unsigned long SctpValCookieLife; + unsigned long SctpMaxInitRetr; + unsigned long __pad[0]; +}; + struct linux_mib { unsigned long SyncookiesSent; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/sock.h linux-2.4.23-pre8/include/net/sock.h --- linux-2.4.22/include/net/sock.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/include/net/sock.h 2003-10-22 22:49:14.000000000 +0000 @@ -49,6 +49,9 @@ #include #endif #include /* struct tcphdr */ +#if defined(CONFIG_IP_SCTP) || defined (CONFIG_IP_SCTP_MODULE) +#include /* struct sctp_opt */ +#endif #include #include /* struct sk_buff */ @@ -586,6 +589,9 @@ union { struct tcp_opt af_tcp; +#if defined(CONFIG_IP_SCTP) || defined (CONFIG_IP_SCTP_MODULE) + struct sctp_opt af_sctp; +#endif #if defined(CONFIG_INET) || defined (CONFIG_INET_MODULE) struct raw_opt tp_raw4; #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/net/tcp.h linux-2.4.23-pre8/include/net/tcp.h --- linux-2.4.22/include/net/tcp.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/include/net/tcp.h 2003-10-22 22:47:46.000000000 +0000 @@ -555,7 +555,8 @@ */ struct tcp_func { - int (*queue_xmit) (struct sk_buff *skb); + int (*queue_xmit) (struct sk_buff *skb, + int ipfragok); void (*send_check) (struct sock *sk, struct tcphdr *th, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/include/scsi/scsi.h linux-2.4.23-pre8/include/scsi/scsi.h --- linux-2.4.22/include/scsi/scsi.h 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/include/scsi/scsi.h 2003-10-22 22:49:48.000000000 +0000 @@ -78,6 +78,7 @@ #define MODE_SENSE_10 0x5a #define PERSISTENT_RESERVE_IN 0x5e #define PERSISTENT_RESERVE_OUT 0x5f +#define REPORT_LUNS 0xa0 #define MOVE_MEDIUM 0xa5 #define READ_12 0xa8 #define WRITE_12 0xaa @@ -88,10 +89,31 @@ #define READ_ELEMENT_STATUS 0xb8 #define SEND_VOLUME_TAG 0xb6 #define WRITE_LONG_2 0xea +#define READ_16 0x88 +#define WRITE_16 0x8a +#define SERVICE_ACTION_IN 0x9e +/* values for service action in */ +#define SAI_READ_CAPACITY_16 0x10 #define SCSI_RETRY_10(c) ((c) == READ_6 || (c) == WRITE_6 || (c) == SEEK_6) /* + * SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft + * T10/1561-D Revision 4 Draft dated 7th November 2002. + */ +#define SAM_STAT_GOOD 0x00 +#define SAM_STAT_CHECK_CONDITION 0x02 +#define SAM_STAT_CONDITION_MET 0x04 +#define SAM_STAT_BUSY 0x08 +#define SAM_STAT_INTERMEDIATE 0x10 +#define SAM_STAT_INTERMEDIATE_CONDITION_MET 0x14 +#define SAM_STAT_RESERVATION_CONFLICT 0x18 +#define SAM_STAT_COMMAND_TERMINATED 0x22 /* obsolete in SAM-3 */ +#define SAM_STAT_TASK_SET_FULL 0x28 +#define SAM_STAT_ACA_ACTIVE 0x30 +#define SAM_STAT_TASK_ABORTED 0x40 + +/* * Status codes */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/init/do_mounts.c linux-2.4.23-pre8/init/do_mounts.c --- linux-2.4.22/init/do_mounts.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/init/do_mounts.c 2003-10-22 22:49:21.000000000 +0000 @@ -360,6 +360,7 @@ flags |= MS_RDONLY; goto retry; case -EINVAL: + case -EBUSY: continue; } /* diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/init/main.c linux-2.4.23-pre8/init/main.c --- linux-2.4.22/init/main.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/init/main.c 2003-10-22 22:47:56.000000000 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -424,9 +425,6 @@ #ifdef CONFIG_PROC_FS proc_root_init(); #endif -#if defined(CONFIG_SYSVIPC) - ipc_init(); -#endif check_bugs(); printk("POSIX conformance testing by UNIFIX\n"); @@ -436,6 +434,9 @@ * make syscalls (and thus be locked). */ smp_init(); +#if defined(CONFIG_SYSVIPC) + ipc_init(); +#endif rest_init(); } @@ -544,10 +545,17 @@ #endif } +static void run_init_process(char *init_filename) +{ + argv_init[0] = init_filename; + execve(init_filename, argv_init, envp_init); +} + extern void prepare_namespace(void); static int init(void * unused) { + struct files_struct *files; lock_kernel(); do_basic_setup(); @@ -560,7 +568,17 @@ */ free_initmem(); unlock_kernel(); - + + /* + * Right now we are a thread sharing with a ton of kernel + * stuff. We don't want to end up in user space in that state + */ + + files = current->files; + if(unshare_files()) + panic("unshare"); + put_files_struct(files); + if (open("/dev/console", O_RDWR, 0) < 0) printk("Warning: unable to open an initial console.\n"); @@ -575,10 +593,12 @@ */ if (execute_command) - execve(execute_command,argv_init,envp_init); - execve("/sbin/init",argv_init,envp_init); - execve("/etc/init",argv_init,envp_init); - execve("/bin/init",argv_init,envp_init); - execve("/bin/sh",argv_init,envp_init); + run_init_process(execute_command); + + run_init_process("/sbin/init"); + run_init_process("/etc/init"); + run_init_process("/bin/init"); + run_init_process("/bin/sh"); + panic("No init found. Try passing init= option to kernel."); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/fork.c linux-2.4.23-pre8/kernel/fork.c --- linux-2.4.22/kernel/fork.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/kernel/fork.c 2003-10-22 22:47:42.000000000 +0000 @@ -266,6 +266,7 @@ { BUG_ON(mm == &init_mm); pgd_free(mm->pgd); + check_pgt_cache(); destroy_context(mm); free_mm(mm); } @@ -746,7 +747,8 @@ goto bad_fork_cleanup_fs; if (copy_mm(clone_flags, p)) goto bad_fork_cleanup_sighand; - if (copy_namespace(clone_flags, p)) + retval = copy_namespace(clone_flags, p); + if (retval) goto bad_fork_cleanup_mm; retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs); if (retval) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/kmod.c linux-2.4.23-pre8/kernel/kmod.c --- linux-2.4.22/kernel/kmod.c 2002-08-03 00:39:46.000000000 +0000 +++ linux-2.4.23-pre8/kernel/kmod.c 2003-10-22 22:48:21.000000000 +0000 @@ -119,19 +119,14 @@ if (curtask->files->fd[i]) close(i); } - /* Drop the "current user" thing */ - { - struct user_struct *user = curtask->user; - curtask->user = INIT_USER; - atomic_inc(&INIT_USER->__count); - atomic_inc(&INIT_USER->processes); - atomic_dec(&user->processes); - free_uid(user); - } + switch_uid(INIT_USER); /* Give kmod all effective privileges.. */ - curtask->euid = curtask->fsuid = 0; - curtask->egid = curtask->fsgid = 0; + curtask->euid = curtask->uid = curtask->suid = curtask->fsuid = 0; + curtask->egid = curtask->gid = curtask->sgid = curtask->fsgid = 0; + + curtask->ngroups = 0; + cap_set_full(curtask->cap_effective); /* Allow execve args to be in kernel space. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/ksyms.c linux-2.4.23-pre8/kernel/ksyms.c --- linux-2.4.22/kernel/ksyms.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/kernel/ksyms.c 2003-10-22 22:47:30.000000000 +0000 @@ -513,6 +513,9 @@ EXPORT_SYMBOL(seq_release); EXPORT_SYMBOL(seq_read); EXPORT_SYMBOL(seq_lseek); +EXPORT_SYMBOL(single_open); +EXPORT_SYMBOL(single_release); +EXPORT_SYMBOL(seq_release_private); /* Program loader interfaces */ EXPORT_SYMBOL(setup_arg_pages); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/panic.c linux-2.4.23-pre8/kernel/panic.c --- linux-2.4.22/kernel/panic.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/kernel/panic.c 2003-10-22 22:49:43.000000000 +0000 @@ -16,6 +16,7 @@ #include #include #include +#include asmlinkage void sys_sync(void); /* it's really int */ @@ -31,6 +32,8 @@ __setup("panic=", panic_setup); +int machine_paniced; + /** * panic - halt the system * @fmt: The text string to print @@ -49,6 +52,11 @@ unsigned long caller = (unsigned long) __builtin_return_address(0); #endif +#ifdef CONFIG_VT + disable_console_blank(); +#endif + machine_paniced = 1; + bust_spinlocks(1); va_start(args, fmt); vsprintf(buf, fmt, args); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/printk.c linux-2.4.23-pre8/kernel/printk.c --- linux-2.4.22/kernel/printk.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/kernel/printk.c 2003-10-22 22:49:52.000000000 +0000 @@ -29,6 +29,7 @@ #include +#if !defined(CONFIG_LOG_BUF_SHIFT) || (CONFIG_LOG_BUF_SHIFT == 0) #if defined(CONFIG_MULTIQUAD) || defined(CONFIG_IA64) #define LOG_BUF_LEN (65536) #elif defined(CONFIG_ARCH_S390) @@ -38,6 +39,9 @@ #else #define LOG_BUF_LEN (16384) /* This must be a power of two */ #endif +#else /* CONFIG_LOG_BUF_SHIFT */ +#define LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) +#endif #define LOG_BUF_MASK (LOG_BUF_LEN-1) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/resource.c linux-2.4.23-pre8/kernel/resource.c --- linux-2.4.22/kernel/resource.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/kernel/resource.c 2003-10-22 22:49:10.000000000 +0000 @@ -13,6 +13,7 @@ #include #include #include +#include #include struct resource ioport_resource = { "PCI IO", 0x0000, IO_SPACE_LIMIT, IORESOURCE_IO }; @@ -20,48 +21,92 @@ static rwlock_t resource_lock = RW_LOCK_UNLOCKED; -/* - * This generates reports for /proc/ioports and /proc/iomem - */ -static char * do_resource_list(struct resource *entry, const char *fmt, int offset, char *buf, char *end) +enum { MAX_IORES_LEVEL = 5 }; + +static void *r_next(struct seq_file *m, void *v, loff_t *pos) { - if (offset < 0) - offset = 0; + struct resource *p = v; + (*pos)++; + if (p->child) + return p->child; + while (!p->sibling && p->parent) + p = p->parent; + return p->sibling; +} - while (entry) { - const char *name = entry->name; - unsigned long from, to; - - if ((int) (end-buf) < 80) - return buf; - - from = entry->start; - to = entry->end; - if (!name) - name = ""; - - buf += sprintf(buf, fmt + offset, from, to, name); - if (entry->child) - buf = do_resource_list(entry->child, fmt, offset-2, buf, end); - entry = entry->sibling; - } +static void *r_start(struct seq_file *m, loff_t *pos) +{ + struct resource *p = m->private; + loff_t l = 0; + read_lock(&resource_lock); + for (p = p->child; p && l < *pos; p = r_next(m, p, &l)) + ; + return p; +} - return buf; +static void r_stop(struct seq_file *m, void *v) +{ + read_unlock(&resource_lock); } -int get_resource_list(struct resource *root, char *buf, int size) +static int r_show(struct seq_file *m, void *v) { - char *fmt; - int retval; + struct resource *root = m->private; + struct resource *r = v, *p; + int width = root->end < 0x10000 ? 4 : 8; + int depth; - fmt = " %08lx-%08lx : %s\n"; - if (root->end < 0x10000) - fmt = " %04lx-%04lx : %s\n"; - read_lock(&resource_lock); - retval = do_resource_list(root->child, fmt, 8, buf, buf + size) - buf; - read_unlock(&resource_lock); - return retval; -} + for (depth = 0, p = r; depth < MAX_IORES_LEVEL; depth++, p = p->parent) + if (p->parent == root) + break; + seq_printf(m, "%*s%0*lx-%0*lx : %s\n", + depth * 2, "", + width, r->start, + width, r->end, + r->name ? r->name : ""); + return 0; +} + +static struct seq_operations resource_op = { + .start = r_start, + .next = r_next, + .stop = r_stop, + .show = r_show, +}; + +static int ioports_open(struct inode *inode, struct file *file) +{ + int res = seq_open(file, &resource_op); + if (!res) { + struct seq_file *m = file->private_data; + m->private = &ioport_resource; + } + return res; +} + +static int iomem_open(struct inode *inode, struct file *file) +{ + int res = seq_open(file, &resource_op); + if (!res) { + struct seq_file *m = file->private_data; + m->private = &iomem_resource; + } + return res; +} + +struct file_operations proc_ioports_operations = { + .open = ioports_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +struct file_operations proc_iomem_operations = { + .open = iomem_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; /* Return the conflict entry if you can't request it */ static struct resource * __request_resource(struct resource *root, struct resource *new) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/sched.c linux-2.4.23-pre8/kernel/sched.c --- linux-2.4.22/kernel/sched.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/kernel/sched.c 2003-10-22 22:49:17.000000000 +0000 @@ -1312,7 +1312,7 @@ this_task->cap_permitted = CAP_FULL_SET; this_task->keep_capabilities = 0; memcpy(this_task->rlim, init_task.rlim, sizeof(*(this_task->rlim))); - this_task->user = INIT_USER; + switch_uid(INIT_USER); spin_unlock(&runqueue_lock); write_unlock_irq(&tasklist_lock); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/sys.c linux-2.4.23-pre8/kernel/sys.c --- linux-2.4.22/kernel/sys.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/kernel/sys.c 2003-10-22 22:47:43.000000000 +0000 @@ -511,19 +511,12 @@ static int set_user(uid_t new_ruid, int dumpclear) { - struct user_struct *new_user, *old_user; + struct user_struct *new_user; - /* What if a process setreuid()'s and this brings the - * new uid over his NPROC rlimit? We can check this now - * cheaply with the new uid cache, so if it matters - * we should be checking for it. -DaveM - */ new_user = alloc_uid(new_ruid); if (!new_user) return -EAGAIN; - old_user = current->user; - atomic_dec(&old_user->processes); - atomic_inc(&new_user->processes); + switch_uid(new_user); if(dumpclear) { @@ -531,8 +524,6 @@ wmb(); } current->uid = new_ruid; - current->user = new_user; - free_uid(old_user); return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/sysctl.c linux-2.4.23-pre8/kernel/sysctl.c --- linux-2.4.22/kernel/sysctl.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/kernel/sysctl.c 2003-10-22 22:47:43.000000000 +0000 @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -49,8 +50,11 @@ extern int max_queued_signals; extern int sysrq_enabled; extern int core_uses_pid; +extern int core_setuid_ok; extern char core_pattern[]; extern int cad_pid; +extern int laptop_mode; +extern int block_dump; /* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ static int maxolduid = 65535; @@ -176,6 +180,8 @@ 0644, NULL, &proc_dointvec}, {KERN_CORE_USES_PID, "core_uses_pid", &core_uses_pid, sizeof(int), 0644, NULL, &proc_dointvec}, + {KERN_CORE_USES_PID, "core_setuid_ok", &core_setuid_ok, sizeof(int), + 0644, NULL, &proc_dointvec}, {KERN_CORE_PATTERN, "core_pattern", core_pattern, 64, 0644, NULL, &proc_dostring, &sysctl_string}, {KERN_TAINTED, "tainted", &tainted, sizeof(int), @@ -273,6 +279,18 @@ }; static ctl_table vm_table[] = { + {VM_GFP_DEBUG, "vm_gfp_debug", + &vm_gfp_debug, sizeof(int), 0644, NULL, &proc_dointvec}, + {VM_VFS_SCAN_RATIO, "vm_vfs_scan_ratio", + &vm_vfs_scan_ratio, sizeof(int), 0644, NULL, &proc_dointvec}, + {VM_CACHE_SCAN_RATIO, "vm_cache_scan_ratio", + &vm_cache_scan_ratio, sizeof(int), 0644, NULL, &proc_dointvec}, + {VM_MAPPED_RATIO, "vm_mapped_ratio", + &vm_mapped_ratio, sizeof(int), 0644, NULL, &proc_dointvec}, + {VM_LRU_BALANCE_RATIO, "vm_lru_balance_ratio", + &vm_lru_balance_ratio, sizeof(int), 0644, NULL, &proc_dointvec}, + {VM_PASSES, "vm_passes", + &vm_passes, sizeof(int), 0644, NULL, &proc_dointvec}, {VM_BDFLUSH, "bdflush", &bdf_prm, 9*sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &bdflush_min, &bdflush_max}, @@ -290,6 +308,10 @@ &vm_max_readahead,sizeof(int), 0644, NULL, &proc_dointvec}, {VM_MAX_MAP_COUNT, "max_map_count", &max_map_count, sizeof(int), 0644, NULL, &proc_dointvec}, + {VM_LAPTOP_MODE, "laptop_mode", + &laptop_mode, sizeof(int), 0644, NULL, &proc_dointvec}, + {VM_BLOCK_DUMP, "block_dump", + &block_dump, sizeof(int), 0644, NULL, &proc_dointvec}, {0} }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/kernel/user.c linux-2.4.23-pre8/kernel/user.c --- linux-2.4.22/kernel/user.c 2000-11-29 06:43:39.000000000 +0000 +++ linux-2.4.23-pre8/kernel/user.c 2003-10-22 22:48:29.000000000 +0000 @@ -120,6 +120,23 @@ return up; } +void switch_uid(struct user_struct *new_user) +{ + struct user_struct *old_user; + + /* What if a process setreuid()'s and this brings the + * new uid over his NPROC rlimit? We can check this now + * cheaply with the new uid cache, so if it matters + * we should be checking for it. -DaveM + */ + old_user = current->user; + atomic_inc(&new_user->__count); + atomic_inc(&new_user->processes); + atomic_dec(&old_user->processes); + current->user = new_user; + free_uid(old_user); +} + static int __init uid_cache_init(void) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/lib/Config.in linux-2.4.23-pre8/lib/Config.in --- linux-2.4.22/lib/Config.in 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/lib/Config.in 2003-10-22 22:49:09.000000000 +0000 @@ -41,4 +41,9 @@ fi fi +if [ "$CONFIG_EXPERIMENTAL" = "y" -a \ + "$CONFIG_HOTPLUG" = "y" ]; then + tristate 'Hotplug firmware loading support (EXPERIMENTAL)' CONFIG_FW_LOADER +fi + endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/lib/Makefile linux-2.4.23-pre8/lib/Makefile --- linux-2.4.22/lib/Makefile 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/lib/Makefile 2003-10-22 22:47:38.000000000 +0000 @@ -9,11 +9,12 @@ L_TARGET := lib.a export-objs := cmdline.o dec_and_lock.o rwsem-spinlock.o rwsem.o \ - rbtree.o crc32.o + rbtree.o crc32.o firmware_class.o obj-y := errno.o ctype.o string.o vsprintf.o brlock.o cmdline.o \ bust_spinlocks.o rbtree.o dump_stack.o +obj-$(CONFIG_FW_LOADER) += firmware_class.o obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o @@ -28,6 +29,7 @@ include $(TOPDIR)/drivers/net/Makefile.lib include $(TOPDIR)/drivers/usb/Makefile.lib +include $(TOPDIR)/drivers/bluetooth/Makefile.lib include $(TOPDIR)/fs/Makefile.lib include $(TOPDIR)/net/bluetooth/bnep/Makefile.lib diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/lib/firmware_class.c linux-2.4.23-pre8/lib/firmware_class.c --- linux-2.4.22/lib/firmware_class.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/lib/firmware_class.c 2003-10-22 22:47:44.000000000 +0000 @@ -0,0 +1,571 @@ +/* + * firmware_class.c - Multi purpose firmware loading support + * + * Copyright (c) 2003 Manuel Estrada Sainz + * + * Please see Documentation/firmware_class/ for more information. + * + */ +/* + * Based on kernel/kmod.c and drivers/usb/usb.c + */ +/* + kernel/kmod.c + Kirk Petersen + + Reorganized not to be a daemon by Adam Richter, with guidance + from Greg Zornetzer. + + Modified to avoid chroot and file sharing problems. + Mikael Pettersson + + Limit the concurrent number of kmod modprobes to catch loops from + "modprobe needs a service that is in a module". + Keith Owens December 1999 + + Unblock all signals when we exec a usermode process. + Shuu Yamaguchi December 2000 +*/ +/* + * drivers/usb/usb.c + * + * (C) Copyright Linus Torvalds 1999 + * (C) Copyright Johannes Erdfelt 1999-2001 + * (C) Copyright Andreas Gal 1999 + * (C) Copyright Gregory P. Smith 1999 + * (C) Copyright Deti Fliegl 1999 (new USB architecture) + * (C) Copyright Randy Dunlap 2000 + * (C) Copyright David Brownell 2000 (kernel hotplug, usb_device_id) + * (C) Copyright Yggdrasil Computing, Inc. 2000 + * (usb_device_id matching changes by Adam J. Richter) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "linux/firmware.h" + +MODULE_AUTHOR("Manuel Estrada Sainz "); +MODULE_DESCRIPTION("Multi purpose firmware loading support"); +MODULE_LICENSE("GPL"); + +#define err(format, arg...) \ + printk(KERN_ERR "%s:%s: " format "\n",__FILE__, __FUNCTION__ , ## arg) +#define warn(format, arg...) \ + printk(KERN_WARNING "%s:%s: " format "\n",__FILE__, __FUNCTION__ , ## arg) +#define dbg(format, arg...) \ + printk(KERN_DEBUG "%s:%s: " format "\n",__FILE__, __FUNCTION__ , ## arg) + +static int loading_timeout = 10; /* In seconds */ +static struct proc_dir_entry *proc_dir_timeout; +static struct proc_dir_entry *proc_dir; + +#ifdef CONFIG_HOTPLUG + +static int +call_helper(char *verb, const char *name, const char *device) +{ + char *argv[3], **envp, *buf, *scratch; + int i = 0; + + int retval = 0; + + if (!hotplug_path[0]) + return -ENOENT; + if (in_interrupt()) { + err("in_interrupt"); + return -EFAULT; + } + if (!current->fs->root) { + warn("call_policy %s -- no FS yet", verb); + return -EPERM; + } + + if (!(envp = (char **) kmalloc(20 * sizeof (char *), GFP_KERNEL))) { + err("unable to allocate envp"); + return -ENOMEM; + } + if (!(buf = kmalloc(256, GFP_KERNEL))) { + kfree(envp); + err("unable to allocate buf"); + return -ENOMEM; + } + + /* only one standardized param to hotplug command: type */ + argv[0] = hotplug_path; + argv[1] = "firmware"; + argv[2] = 0; + + /* minimal command environment */ + envp[i++] = "HOME=/"; + envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin"; + +#ifdef DEBUG + /* hint that policy agent should enter no-stdout debug mode */ + envp[i++] = "DEBUG=kernel"; +#endif + scratch = buf; + + if (device) { + envp[i++] = scratch; + scratch += snprintf(scratch, FIRMWARE_NAME_MAX+25, + "DEVPATH=/driver/firmware/%s", device) + 1; + } + + envp[i++] = scratch; + scratch += sprintf(scratch, "ACTION=%s", verb) + 1; + + envp[i++] = scratch; + scratch += snprintf(scratch, FIRMWARE_NAME_MAX, + "FIRMWARE=%s", name) + 1; + + envp[i++] = 0; + +#ifdef DEBUG + dbg("firmware: %s %s %s", argv[0], argv[1], verb); +#endif + + retval = call_usermodehelper(argv[0], argv, envp); + if (retval) { + printk("call_usermodehelper return %d\n", retval); + } + + kfree(buf); + kfree(envp); + return retval; +} +#else + +static inline int +call_helper(char *verb, const char *name, const char *device) +{ + return -ENOENT; +} + +#endif /* CONFIG_HOTPLUG */ + +struct firmware_priv { + struct completion completion; + struct proc_dir_entry *proc_dir; + struct proc_dir_entry *attr_data; + struct proc_dir_entry *attr_loading; + struct firmware *fw; + int loading; + int abort; + int alloc_size; + struct timer_list timeout; +}; + +static int +firmware_timeout_show(char *buf, char **start, off_t off, + int count, int *eof, void *data) +{ + return sprintf(buf, "%d\n", loading_timeout); +} + +/** + * firmware_timeout_store: + * Description: + * Sets the number of seconds to wait for the firmware. Once + * this expires an error will be return to the driver and no + * firmware will be provided. + * + * Note: zero means 'wait for ever' + * + **/ +static int +firmware_timeout_store(struct file *file, const char *buf, + unsigned long count, void *data) +{ + loading_timeout = simple_strtol(buf, NULL, 10); + return count; +} + +static int +firmware_loading_show(char *buf, char **start, off_t off, + int count, int *eof, void *data) +{ + struct firmware_priv *fw_priv = data; + return sprintf(buf, "%d\n", fw_priv->loading); +} + +/** + * firmware_loading_store: - loading control file + * Description: + * The relevant values are: + * + * 1: Start a load, discarding any previous partial load. + * 0: Conclude the load and handle the data to the driver code. + * -1: Conclude the load with an error and discard any written data. + **/ +static int +firmware_loading_store(struct file *file, const char *buf, + unsigned long count, void *data) +{ + struct firmware_priv *fw_priv = data; + int prev_loading = fw_priv->loading; + + fw_priv->loading = simple_strtol(buf, NULL, 10); + + switch (fw_priv->loading) { + case -1: + fw_priv->abort = 1; + wmb(); + complete(&fw_priv->completion); + break; + case 1: + kfree(fw_priv->fw->data); + fw_priv->fw->data = NULL; + fw_priv->fw->size = 0; + fw_priv->alloc_size = 0; + break; + case 0: + if (prev_loading == 1) + complete(&fw_priv->completion); + break; + } + + return count; +} + +static int +firmware_data_read(char *buffer, char **start, off_t offset, + int count, int *eof, void *data) +{ + struct firmware_priv *fw_priv = data; + struct firmware *fw = fw_priv->fw; + + if (offset > fw->size) + return 0; + if (offset + count > fw->size) + count = fw->size - offset; + + memcpy(buffer, fw->data + offset, count); + *start = (void *) ((long) count); + return count; +} +static int +fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) +{ + u8 *new_data; + int new_size; + + if (min_size <= fw_priv->alloc_size) + return 0; + if((min_size % PAGE_SIZE) == 0) + new_size = min_size; + else + new_size = (min_size + PAGE_SIZE) & PAGE_MASK; + new_data = vmalloc(new_size); + if (!new_data) { + printk(KERN_ERR "%s: unable to alloc buffer\n", __FUNCTION__); + /* Make sure that we don't keep incomplete data */ + fw_priv->abort = 1; + return -ENOMEM; + } + fw_priv->alloc_size = new_size; + if (fw_priv->fw->data) { + memcpy(new_data, fw_priv->fw->data, fw_priv->fw->size); + vfree(fw_priv->fw->data); + } + fw_priv->fw->data = new_data; + BUG_ON(min_size > fw_priv->alloc_size); + return 0; +} + +/** + * firmware_data_write: + * + * Description: + * + * Data written to the 'data' attribute will be later handled to + * the driver as a firmware image. + **/ +static int +firmware_data_write(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct firmware_priv *fw_priv = data; + struct firmware *fw = fw_priv->fw; + int offset = file->f_pos; + int retval; + + retval = fw_realloc_buffer(fw_priv, offset + count); + if (retval) { + printk("%s: retval:%d\n", __FUNCTION__, retval); + return retval; + } + + memcpy(fw->data + offset, buffer, count); + + fw->size = max_t(size_t, offset + count, fw->size); + file->f_pos += count; + return count; +} + +static void +firmware_class_timeout(u_long data) +{ + struct firmware_priv *fw_priv = (struct firmware_priv *) data; + fw_priv->abort = 1; + wmb(); + complete(&fw_priv->completion); +} +static int +fw_setup_class_device(struct firmware_priv **fw_priv_p, + const char *fw_name, const char *device) +{ + int retval; + struct firmware_priv *fw_priv = kmalloc(sizeof (struct firmware_priv), + GFP_KERNEL); + *fw_priv_p = fw_priv; + if (!fw_priv) { + retval = -ENOMEM; + goto out; + } + memset(fw_priv, 0, sizeof (*fw_priv)); + + init_completion(&fw_priv->completion); + + fw_priv->timeout.function = firmware_class_timeout; + fw_priv->timeout.data = (u_long) fw_priv; + init_timer(&fw_priv->timeout); + + retval = -EAGAIN; + fw_priv->proc_dir = create_proc_entry(device, 0644 | S_IFDIR, proc_dir); + if (!fw_priv->proc_dir) + goto err_free_fw_priv; + + fw_priv->attr_data = create_proc_entry("data", 0644 | S_IFREG, + fw_priv->proc_dir); + if (!fw_priv->attr_data) + goto err_remove_dir; + + fw_priv->attr_data->read_proc = firmware_data_read; + fw_priv->attr_data->write_proc = firmware_data_write; + fw_priv->attr_data->data = fw_priv; + + fw_priv->attr_loading = create_proc_entry("loading", 0644 | S_IFREG, + fw_priv->proc_dir); + if (!fw_priv->attr_loading) + goto err_remove_data; + + fw_priv->attr_loading->read_proc = firmware_loading_show; + fw_priv->attr_loading->write_proc = firmware_loading_store; + fw_priv->attr_loading->data = fw_priv; + + retval = 0; + fw_priv->fw = kmalloc(sizeof (struct firmware), GFP_KERNEL); + if (!fw_priv->fw) { + printk(KERN_ERR "%s: kmalloc(struct firmware) failed\n", + __FUNCTION__); + retval = -ENOMEM; + goto err_remove_loading; + } + memset(fw_priv->fw, 0, sizeof (*fw_priv->fw)); + + goto out; + +err_remove_loading: + remove_proc_entry("loading", fw_priv->proc_dir); +err_remove_data: + remove_proc_entry("data", fw_priv->proc_dir); +err_remove_dir: + remove_proc_entry(device, proc_dir); +err_free_fw_priv: + kfree(fw_priv); +out: + return retval; +} +static void +fw_remove_class_device(struct firmware_priv *fw_priv) +{ + remove_proc_entry("loading", fw_priv->proc_dir); + remove_proc_entry("data", fw_priv->proc_dir); + remove_proc_entry(fw_priv->proc_dir->name, proc_dir); +} + +/** + * request_firmware: - request firmware to hotplug and wait for it + * Description: + * @firmware will be used to return a firmware image by the name + * of @name for device @device. + * + * Should be called from user context where sleeping is allowed. + * + * @name will be use as $FIRMWARE in the hotplug environment and + * should be distinctive enough not to be confused with any other + * firmware image for this or any other device. + **/ +int +request_firmware(const struct firmware **firmware, const char *name, + const char *device) +{ + struct firmware_priv *fw_priv; + int retval; + + if (!firmware) { + retval = -EINVAL; + goto out; + } + *firmware = NULL; + + retval = fw_setup_class_device(&fw_priv, name, device); + if (retval) + goto out; + + retval = call_helper("add", name, device); + if (retval) + goto out; + if (loading_timeout) { + fw_priv->timeout.expires = jiffies + loading_timeout * HZ; + add_timer(&fw_priv->timeout); + } + + wait_for_completion(&fw_priv->completion); + + del_timer(&fw_priv->timeout); + fw_remove_class_device(fw_priv); + + if (fw_priv->fw->size && !fw_priv->abort) { + *firmware = fw_priv->fw; + } else { + retval = -ENOENT; + vfree(fw_priv->fw->data); + kfree(fw_priv->fw); + } +out: + kfree(fw_priv); + return retval; +} + +void +release_firmware(const struct firmware *fw) +{ + if (fw) { + vfree(fw->data); + kfree(fw); + } +} + +/** + * register_firmware: - provide a firmware image for later usage + * + * Description: + * Make sure that @data will be available by requesting firmware @name. + * + * Note: This will not be possible until some kind of persistence + * is available. + **/ +void +register_firmware(const char *name, const u8 *data, size_t size) +{ + /* This is meaningless without firmware caching, so until we + * decide if firmware caching is reasonable just leave it as a + * noop */ +} + +/* Async support */ +struct firmware_work { + struct tq_struct work; + struct module *module; + const char *name; + const char *device; + void *context; + void (*cont)(const struct firmware *fw, void *context); +}; + +static void +request_firmware_work_func(void *arg) +{ + struct firmware_work *fw_work = arg; + const struct firmware *fw; + if (!arg) + return; + request_firmware(&fw, fw_work->name, fw_work->device); + fw_work->cont(fw, fw_work->context); + release_firmware(fw); + __MOD_DEC_USE_COUNT(fw_work->module); + kfree(fw_work); +} + +/** + * request_firmware_nowait: + * + * Description: + * Asynchronous variant of request_firmware() for contexts where + * it is not possible to sleep. + * + * @cont will be called asynchronously when the firmware request is over. + * + * @context will be passed over to @cont. + * + * @fw may be %NULL if firmware request fails. + * + **/ +int +request_firmware_nowait( + struct module *module, + const char *name, const char *device, void *context, + void (*cont)(const struct firmware *fw, void *context)) +{ + struct firmware_work *fw_work = kmalloc(sizeof (struct firmware_work), + GFP_ATOMIC); + if (!fw_work) + return -ENOMEM; + if (!try_inc_mod_count(module)) { + kfree(fw_work); + return -EFAULT; + } + + *fw_work = (struct firmware_work) { + .module = module, + .name = name, + .device = device, + .context = context, + .cont = cont, + }; + INIT_TQUEUE(&fw_work->work, request_firmware_work_func, fw_work); + + schedule_task(&fw_work->work); + return 0; +} + +static int __init +firmware_class_init(void) +{ + proc_dir = create_proc_entry("driver/firmware", 0755 | S_IFDIR, NULL); + if (!proc_dir) + return -EAGAIN; + proc_dir_timeout = create_proc_entry("timeout", + 0644 | S_IFREG, proc_dir); + if (!proc_dir_timeout) { + remove_proc_entry("driver/firmware", NULL); + return -EAGAIN; + } + proc_dir_timeout->read_proc = firmware_timeout_show; + proc_dir_timeout->write_proc = firmware_timeout_store; + return 0; +} +static void __exit +firmware_class_exit(void) +{ + remove_proc_entry("timeout", proc_dir); + remove_proc_entry("driver/firmware", NULL); +} + +module_init(firmware_class_init); +module_exit(firmware_class_exit); + +EXPORT_SYMBOL(release_firmware); +EXPORT_SYMBOL(request_firmware); +EXPORT_SYMBOL(request_firmware_nowait); +EXPORT_SYMBOL(register_firmware); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/filemap.c linux-2.4.23-pre8/mm/filemap.c --- linux-2.4.22/mm/filemap.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/mm/filemap.c 2003-10-22 22:48:26.000000000 +0000 @@ -42,7 +42,7 @@ * SMP-threaded pagemap-LRU 1999, Andrea Arcangeli */ -atomic_t page_cache_size = ATOMIC_INIT(0); +unsigned long page_cache_size; unsigned int page_hash_bits; struct page **page_hash_table; @@ -79,7 +79,7 @@ next->pprev_hash = &page->next_hash; if (page->buffers) PAGE_BUG(page); - atomic_inc(&page_cache_size); + inc_nr_cache_pages(page); } static inline void add_page_to_inode_queue(struct address_space *mapping, struct page * page) @@ -113,7 +113,7 @@ next->pprev_hash = pprev; *pprev = next; page->pprev_hash = NULL; - atomic_dec(&page_cache_size); + dec_nr_cache_pages(page); } /* @@ -165,6 +165,8 @@ if (mapping && mapping->host) mark_inode_dirty_pages(mapping->host); + if (block_dump) + printk(KERN_DEBUG "%s: dirtied page\n", current->comm); } } } @@ -654,10 +656,19 @@ struct address_space *mapping, unsigned long offset, struct page **hash) { - unsigned long flags; - - flags = page->flags & ~(1 << PG_uptodate | 1 << PG_error | 1 << PG_dirty | 1 << PG_referenced | 1 << PG_arch_1 | 1 << PG_checked); - page->flags = flags | (1 << PG_locked); + /* + * Yes this is inefficient, however it is needed. The problem + * is that we could be adding a page to the swap cache while + * another CPU is also modifying page->flags, so the updates + * really do need to be atomic. -- Rik + */ + ClearPageUptodate(page); + ClearPageError(page); + ClearPageDirty(page); + ClearPageReferenced(page); + ClearPageArch1(page); + ClearPageChecked(page); + LockPage(page); page_cache_get(page); page->index = offset; add_page_to_inode_queue(mapping, page); @@ -3007,7 +3018,7 @@ } /* FIXME: this is for backwards compatibility with 2.4 */ - if (!S_ISBLK(inode->i_mode) && file->f_flags & O_APPEND) + if (!S_ISBLK(inode->i_mode) && (file->f_flags & O_APPEND)) *ppos = pos = inode->i_size; /* @@ -3238,7 +3249,7 @@ if (err != 0 || count == 0) goto out; - if (!file->f_flags & O_DIRECT) + if (!(file->f_flags & O_DIRECT)) BUG(); remove_suid(inode); @@ -3259,7 +3270,7 @@ * Sync the fs metadata but not the minor inode changes and * of course not the data as we did direct DMA for the IO. */ - if (written >= 0 && file->f_flags & O_SYNC) + if (written >= 0 && (file->f_flags & O_SYNC)) status = generic_osync_inode(inode, OSYNC_METADATA); err = written ? written : status; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/memory.c linux-2.4.23-pre8/mm/memory.c --- linux-2.4.22/mm/memory.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/mm/memory.c 2003-10-22 22:48:43.000000000 +0000 @@ -1287,7 +1287,8 @@ */ /* Only go through if we didn't race with anybody else... */ if (pte_none(*page_table)) { - ++mm->rss; + if (!PageReserved(new_page)) + ++mm->rss; flush_page_to_ram(new_page); flush_icache_page(vma, new_page); entry = mk_pte(new_page, vma->vm_page_prot); @@ -1414,6 +1415,7 @@ */ if (!pgd_none(*pgd)) { pmd_free(new); + check_pgt_cache(); goto out; } } @@ -1448,6 +1450,7 @@ */ if (!pmd_none(*pmd)) { pte_free(new); + check_pgt_cache(); goto out; } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/mmap.c linux-2.4.23-pre8/mm/mmap.c --- linux-2.4.22/mm/mmap.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/mm/mmap.c 2003-10-22 22:49:06.000000000 +0000 @@ -69,7 +69,7 @@ return 1; /* The page cache contains buffer pages these days.. */ - free = atomic_read(&page_cache_size); + free = page_cache_size; free += nr_free_pages(); free += nr_swap_pages; @@ -1041,6 +1041,9 @@ if (!len) return addr; + if ((addr + len) > TASK_SIZE || (addr + len) < addr) + return -EINVAL; + /* * mlock MCL_FUTURE? */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/mprotect.c linux-2.4.23-pre8/mm/mprotect.c --- linux-2.4.22/mm/mprotect.c 2002-08-03 00:39:46.000000000 +0000 +++ linux-2.4.23-pre8/mm/mprotect.c 2003-10-22 22:48:36.000000000 +0000 @@ -275,7 +275,7 @@ len = PAGE_ALIGN(len); end = start + len; if (end < start) - return -EINVAL; + return -ENOMEM; if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)) return -EINVAL; if (end == start) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/oom_kill.c linux-2.4.23-pre8/mm/oom_kill.c --- linux-2.4.22/mm/oom_kill.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/mm/oom_kill.c 2003-10-22 22:47:28.000000000 +0000 @@ -21,6 +21,8 @@ #include #include +#if 0 /* Nothing in this file is used */ + /* #define DEBUG */ /** @@ -151,7 +153,6 @@ * exit() and clear out its resources quickly... */ p->counter = 5 * HZ; - p->flags |= PF_MEMALLOC | PF_MEMDIE; /* This process has hardware access, be more careful. */ if (cap_t(p->cap_effective) & CAP_TO_MASK(CAP_SYS_RAWIO)) { @@ -256,3 +257,5 @@ first = now; count = 0; } + +#endif /* Unused file */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/page_alloc.c linux-2.4.23-pre8/mm/page_alloc.c --- linux-2.4.22/mm/page_alloc.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/mm/page_alloc.c 2003-10-22 22:47:39.000000000 +0000 @@ -42,6 +42,9 @@ static int zone_balance_ratio[MAX_NR_ZONES] __initdata = { 128, 128, 128, }; static int zone_balance_min[MAX_NR_ZONES] __initdata = { 20 , 20, 20, }; static int zone_balance_max[MAX_NR_ZONES] __initdata = { 255 , 255, 255, }; +static int lower_zone_reserve_ratio[MAX_NR_ZONES-1] = { 256, 32 }; + +int vm_gfp_debug = 0; /* * Temporary debugging check. @@ -106,7 +109,8 @@ BUG(); if (PageActive(page)) BUG(); - page->flags &= ~((1<flags & PF_FREE_PAGES) goto local_freelist; @@ -253,10 +257,8 @@ static struct page * balance_classzone(zone_t * classzone, unsigned int gfp_mask, unsigned int order, int * freed) { struct page * page = NULL; - int __freed = 0; + int __freed; - if (!(gfp_mask & __GFP_WAIT)) - goto out; if (in_interrupt()) BUG(); @@ -316,33 +318,36 @@ } current->nr_local_pages = 0; } - out: + *freed = __freed; return page; } +static inline unsigned long zone_free_pages(zone_t * zone, unsigned int order) +{ + long free = zone->free_pages - (1UL << order); + return free >= 0 ? free : 0; +} + /* * This is the 'heart' of the zoned buddy allocator: */ struct page * __alloc_pages(unsigned int gfp_mask, unsigned int order, zonelist_t *zonelist) { - unsigned long min; zone_t **zone, * classzone; struct page * page; - int freed; + int freed, class_idx; zone = zonelist->zones; classzone = *zone; - if (classzone == NULL) - return NULL; - min = 1UL << order; + class_idx = zone_idx(classzone); + for (;;) { zone_t *z = *(zone++); if (!z) break; - min += z->pages_low; - if (z->free_pages > min) { + if (zone_free_pages(z, order) > z->watermarks[class_idx].low) { page = rmqueue(z, order); if (page) return page; @@ -355,18 +360,16 @@ wake_up_interruptible(&kswapd_wait); zone = zonelist->zones; - min = 1UL << order; for (;;) { - unsigned long local_min; + unsigned long min; zone_t *z = *(zone++); if (!z) break; - local_min = z->pages_min; + min = z->watermarks[class_idx].min; if (!(gfp_mask & __GFP_WAIT)) - local_min >>= 2; - min += local_min; - if (z->free_pages > min) { + min >>= 2; + if (zone_free_pages(z, order) > min) { page = rmqueue(z, order); if (page) return page; @@ -375,8 +378,7 @@ /* here we're in the low on memory slow path */ -rebalance: - if (current->flags & (PF_MEMALLOC | PF_MEMDIE)) { + if (current->flags & PF_MEMALLOC && !in_interrupt()) { zone = zonelist->zones; for (;;) { zone_t *z = *(zone++); @@ -392,34 +394,51 @@ /* Atomic allocations - we can't balance anything */ if (!(gfp_mask & __GFP_WAIT)) - return NULL; + goto out; + rebalance: page = balance_classzone(classzone, gfp_mask, order, &freed); if (page) return page; zone = zonelist->zones; - min = 1UL << order; - for (;;) { - zone_t *z = *(zone++); - if (!z) - break; + if (likely(freed)) { + for (;;) { + zone_t *z = *(zone++); + if (!z) + break; - min += z->pages_min; - if (z->free_pages > min) { - page = rmqueue(z, order); - if (page) - return page; + if (zone_free_pages(z, order) > z->watermarks[class_idx].min) { + page = rmqueue(z, order); + if (page) + return page; + } } - } + goto rebalance; + } else { + /* + * Check that no other task is been killed meanwhile, + * in such a case we can succeed the allocation. + */ + for (;;) { + zone_t *z = *(zone++); + if (!z) + break; - /* Don't let big-order allocations loop */ - if (order > 3) - return NULL; + if (zone_free_pages(z, order) > z->watermarks[class_idx].high) { + page = rmqueue(z, order); + if (page) + return page; + } + } + } - /* Yield for kswapd, and try again */ - yield(); - goto rebalance; + out: + printk(KERN_NOTICE "__alloc_pages: %u-order allocation failed (gfp=0x%x/%i)\n", + order, gfp_mask, !!(current->flags & PF_MEMALLOC)); + if (unlikely(vm_gfp_debug)) + dump_stack(); + return NULL; } /* @@ -481,17 +500,22 @@ { pg_data_t *pgdat; unsigned int sum = 0; + zonelist_t *zonelist; + zone_t **zonep, *zone; for_each_pgdat(pgdat) { - zonelist_t *zonelist = pgdat->node_zonelists + (GFP_USER & GFP_ZONEMASK); - zone_t **zonep = zonelist->zones; - zone_t *zone; - - for (zone = *zonep++; zone; zone = *zonep++) { - unsigned long size = zone->size; - unsigned long high = zone->pages_high; - if (size > high) - sum += size - high; + int class_idx; + zonelist = pgdat->node_zonelists + (GFP_USER & GFP_ZONEMASK); + zonep = zonelist->zones; + zone = *zonep; + class_idx = zone_idx(zone); + + sum += zone->nr_cache_pages; + for (zone = pgdat->node_zones; zone < pgdat->node_zones + MAX_NR_ZONES; zone++) { + int free = zone->free_pages - zone->watermarks[class_idx].high; + if (free <= 0) + continue; + sum += free; } } @@ -532,13 +556,9 @@ zone_t *zone; for (zone = tmpdat->node_zones; zone < tmpdat->node_zones + MAX_NR_ZONES; zone++) - printk("Zone:%s freepages:%6lukB min:%6lukB low:%6lukB " - "high:%6lukB\n", + printk("Zone:%s freepages:%6lukB\n", zone->name, - K(zone->free_pages), - K(zone->pages_min), - K(zone->pages_low), - K(zone->pages_high)); + K(zone->free_pages)); tmpdat = tmpdat->node_next; } @@ -729,6 +749,7 @@ zone_t *zone = pgdat->node_zones + j; unsigned long mask; unsigned long size, realsize; + int idx; zone_table[nid * MAX_NR_ZONES + j] = zone; realsize = size = zones_size[j]; @@ -737,11 +758,15 @@ printk("zone(%lu): %lu pages.\n", j, size); zone->size = size; + zone->realsize = realsize; zone->name = zone_names[j]; zone->lock = SPIN_LOCK_UNLOCKED; zone->zone_pgdat = pgdat; zone->free_pages = 0; zone->need_balance = 0; + zone->nr_active_pages = zone->nr_inactive_pages = 0; + + if (!size) continue; @@ -766,9 +791,29 @@ mask = zone_balance_min[j]; else if (mask > zone_balance_max[j]) mask = zone_balance_max[j]; - zone->pages_min = mask; - zone->pages_low = mask*2; - zone->pages_high = mask*3; + zone->watermarks[j].min = mask; + zone->watermarks[j].low = mask*2; + zone->watermarks[j].high = mask*3; + /* now set the watermarks of the lower zones in the "j" classzone */ + for (idx = j-1; idx >= 0; idx--) { + zone_t * lower_zone = pgdat->node_zones + idx; + unsigned long lower_zone_reserve; + if (!lower_zone->size) + continue; + + mask = lower_zone->watermarks[idx].min; + lower_zone->watermarks[j].min = mask; + lower_zone->watermarks[j].low = mask*2; + lower_zone->watermarks[j].high = mask*3; + + /* now the brainer part */ + lower_zone_reserve = realsize / lower_zone_reserve_ratio[idx]; + lower_zone->watermarks[j].min += lower_zone_reserve; + lower_zone->watermarks[j].low += lower_zone_reserve; + lower_zone->watermarks[j].high += lower_zone_reserve; + + realsize += lower_zone->realsize; + } zone->zone_mem_map = mem_map + offset; zone->zone_start_mapnr = offset; @@ -852,3 +897,16 @@ } __setup("memfrac=", setup_mem_frac); + +static int __init setup_lower_zone_reserve(char *str) +{ + int j = 0; + + while (get_option(&str, &lower_zone_reserve_ratio[j++]) == 2); + printk("setup_lower_zone_reserve: "); + for (j = 0; j < MAX_NR_ZONES-1; j++) printk("%d ", lower_zone_reserve_ratio[j]); + printk("\n"); + return 1; +} + +__setup("lower_zone_reserve=", setup_lower_zone_reserve); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/shmem.c linux-2.4.23-pre8/mm/shmem.c --- linux-2.4.22/mm/shmem.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/mm/shmem.c 2003-10-22 22:48:39.000000000 +0000 @@ -46,6 +46,10 @@ #define VM_ACCT(size) (PAGE_CACHE_ALIGN(size) >> PAGE_SHIFT) +/* info->flags needs VM_flags to handle pagein/truncate race efficiently */ +#define SHMEM_PAGEIN VM_READ +#define SHMEM_TRUNCATE VM_WRITE + /* Pretend that each entry is of this size in directory's i_size */ #define BOGO_DIRENT_SIZE 20 @@ -364,8 +368,23 @@ while (index < info->next_index) freed += shmem_truncate_indirect(info, index); BUG_ON(info->swapped > info->next_index); - spin_unlock(&info->lock); + if (inode->i_mapping->nrpages && (info->flags & SHMEM_PAGEIN)) { + /* + * Call truncate_inode_pages again: racing shmem_unuse_inode + * may have swizzled a page in from swap since vmtruncate or + * generic_delete_inode did it, before we lowered next_index. + * Also, though shmem_getpage checks i_size before adding to + * cache, no recheck after: so fix the narrow window there too. + */ + info->flags |= SHMEM_TRUNCATE; + spin_unlock(&info->lock); + truncate_inode_pages(inode->i_mapping, inode->i_size); + spin_lock(&info->lock); + info->flags &= ~SHMEM_TRUNCATE; + } + + spin_unlock(&info->lock); spin_lock(&sbinfo->stat_lock); sbinfo->free_blocks += freed; inode->i_blocks -= freed*BLOCKS_PER_PAGE; @@ -392,6 +411,19 @@ attr->ia_size>>PAGE_CACHE_SHIFT, &page, SGP_READ); } + /* + * Reset SHMEM_PAGEIN flag so that shmem_truncate can + * detect if any pages might have been added to cache + * after truncate_inode_pages. But we needn't bother + * if it's being fully truncated to zero-length: the + * nrpages check is efficient enough in that case. + */ + if (attr->ia_size) { + struct shmem_inode_info *info = SHMEM_I(inode); + spin_lock(&info->lock); + info->flags &= ~SHMEM_PAGEIN; + spin_unlock(&info->lock); + } } } @@ -439,7 +471,6 @@ struct address_space *mapping; swp_entry_t *ptr; unsigned long idx; - unsigned long limit; int offset; idx = 0; @@ -471,13 +502,9 @@ inode = info->inode; mapping = inode->i_mapping; delete_from_swap_cache(page); - - /* Racing against delete or truncate? Must leave out of page cache */ - limit = (inode->i_state & I_FREEING)? 0: - (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - - if (idx >= limit || add_to_page_cache_unique(page, + if (add_to_page_cache_unique(page, mapping, idx, page_hash(mapping, idx)) == 0) { + info->flags |= SHMEM_PAGEIN; ptr[offset].val = 0; info->swapped--; } else if (add_to_swap_cache(page, entry) != 0) @@ -529,21 +556,26 @@ BUG_ON(!PageLocked(page)); if (!PageLaunder(page)) - return fail_writepage(page); + goto fail; mapping = page->mapping; index = page->index; inode = mapping->host; info = SHMEM_I(inode); if (info->flags & VM_LOCKED) - return fail_writepage(page); + goto fail; getswap: swap = get_swap_page(); if (!swap.val) - return fail_writepage(page); + goto fail; spin_lock(&info->lock); - BUG_ON(index >= info->next_index); + if (index >= info->next_index) { + BUG_ON(!(info->flags & SHMEM_TRUNCATE)); + spin_unlock(&info->lock); + swap_free(swap); + goto fail; + } entry = shmem_swp_entry(info, index, NULL); BUG_ON(!entry); BUG_ON(entry->val); @@ -559,6 +591,7 @@ * Add page back to page cache, unref swap, try again. */ add_to_page_cache_locked(page, mapping, index); + info->flags |= SHMEM_PAGEIN; spin_unlock(&info->lock); swap_free(swap); goto getswap; @@ -571,6 +604,8 @@ set_page_dirty(page); UnlockPage(page); return 0; +fail: + return fail_writepage(page); } /* @@ -670,6 +705,7 @@ swap_free(swap); } else if (add_to_page_cache_unique(swappage, mapping, idx, page_hash(mapping, idx)) == 0) { + info->flags |= SHMEM_PAGEIN; entry->val = 0; info->swapped--; spin_unlock(&info->lock); @@ -735,6 +771,7 @@ goto failed; goto repeat; } + info->flags |= SHMEM_PAGEIN; } spin_unlock(&info->lock); @@ -1129,6 +1166,8 @@ */ static struct dentry *shmem_lookup(struct inode *dir, struct dentry *dentry) { + if (dentry->d_name.len > NAME_MAX) + return ERR_PTR(-ENAMETOOLONG); d_add(dentry, NULL); return NULL; } @@ -1142,6 +1181,11 @@ int error = -ENOSPC; if (inode) { + if (dir->i_mode & S_ISGID) { + inode->i_gid = dir->i_gid; + if (S_ISDIR(mode)) + inode->i_mode |= S_ISGID; + } dir->i_size += BOGO_DIRENT_SIZE; dir->i_ctime = dir->i_mtime = CURRENT_TIME; d_instantiate(dentry, inode); @@ -1308,6 +1352,8 @@ SetPageDirty(page); page_cache_release(page); } + if (dir->i_mode & S_ISGID) + inode->i_gid = dir->i_gid; dir->i_size += BOGO_DIRENT_SIZE; dir->i_ctime = dir->i_mtime = CURRENT_TIME; d_instantiate(dentry, inode); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/slab.c linux-2.4.23-pre8/mm/slab.c --- linux-2.4.22/mm/slab.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/mm/slab.c 2003-10-22 22:49:16.000000000 +0000 @@ -1784,8 +1784,9 @@ full_free = 0; p = searchp->slabs_free.next; while (p != &searchp->slabs_free) { - slabp = list_entry(p, slab_t, list); #if DEBUG + slabp = list_entry(p, slab_t, list); + if (slabp->inuse) BUG(); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/swap.c linux-2.4.23-pre8/mm/swap.c --- linux-2.4.22/mm/swap.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/mm/swap.c 2003-10-22 22:48:35.000000000 +0000 @@ -94,6 +94,78 @@ spin_unlock(&pagemap_lru_lock); } +/** + * delta_nr_active_pages: alter the number of active pages. + * + * @page: the page which is being activated/deactivated + * @delta: +1 for activation, -1 for deactivation + * + * Called under pagecache_lock + */ +void delta_nr_active_pages(struct page *page, long delta) +{ + pg_data_t *pgdat; + zone_t *classzone, *overflow; + + classzone = page_zone(page); + pgdat = classzone->zone_pgdat; + overflow = pgdat->node_zones + pgdat->nr_zones; + + while (classzone < overflow) { + classzone->nr_active_pages += delta; + classzone++; + } + nr_active_pages += delta; +} + +/** + * delta_nr_inactive_pages: alter the number of inactive pages. + * + * @page: the page which is being deactivated/activated + * @delta: +1 for deactivation, -1 for activation + * + * Called under pagecache_lock + */ +void delta_nr_inactive_pages(struct page *page, long delta) +{ + pg_data_t *pgdat; + zone_t *classzone, *overflow; + + classzone = page_zone(page); + pgdat = classzone->zone_pgdat; + overflow = pgdat->node_zones + pgdat->nr_zones; + + while (classzone < overflow) { + classzone->nr_inactive_pages += delta; + classzone++; + } + nr_inactive_pages += delta; +} + +/** + * delta_nr_cache_pages: alter the number of pages in the pagecache + * + * @page: the page which is being added/removed + * @delta: +1 for addition, -1 for removal + * + * Called under pagecache_lock + */ +void delta_nr_cache_pages(struct page *page, long delta) +{ + pg_data_t *pgdat; + zone_t *classzone, *overflow; + + classzone = page_zone(page); + pgdat = classzone->zone_pgdat; + overflow = pgdat->node_zones + pgdat->nr_zones; + + while (classzone < overflow) { + classzone->nr_cache_pages += delta; + classzone++; + } + page_cache_size += delta; +} + /* * Perform any setup for the swap system */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/mm/vmscan.c linux-2.4.23-pre8/mm/vmscan.c --- linux-2.4.22/mm/vmscan.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/mm/vmscan.c 2003-10-22 22:47:49.000000000 +0000 @@ -27,12 +27,42 @@ #include /* - * The "priority" of VM scanning is how much of the queues we - * will scan in one go. A value of 6 for DEF_PRIORITY implies - * that we'll scan 1/64th of the queues ("queue_length >> 6") - * during a normal aging round. + * "vm_passes" is the number of vm passes before failing the + * memory balancing. Take into account 3 passes are needed + * for a flush/wait/free cycle and that we only scan 1/vm_cache_scan_ratio + * of the inactive list at each pass. */ -#define DEF_PRIORITY (6) +int vm_passes = 60; + +/* + * "vm_cache_scan_ratio" is how much of the inactive LRU queue we will scan + * in one go. A value of 6 for vm_cache_scan_ratio implies that we'll + * scan 1/6 of the inactive lists during a normal aging round. + */ +int vm_cache_scan_ratio = 6; + +/* + * "vm_mapped_ratio" controls the pageout rate, the smaller, the earlier + * we'll start to pageout. + */ +int vm_mapped_ratio = 100; + +/* + * "vm_lru_balance_ratio" controls the balance between active and + * inactive cache. The bigger vm_balance is, the easier the + * active cache will grow, because we'll rotate the active list + * slowly. A value of 2 means we'll go towards a balance of + * 1/3 of the cache being inactive. + */ +int vm_lru_balance_ratio = 2; + +/* + * "vm_vfs_scan_ratio" is what proportion of the VFS queues we will scan + * in one go. A value of 6 for vm_vfs_scan_ratio implies that 1/6th of + * the unused-inode, dentry and dquot caches will be freed during a normal + * aging round. + */ +int vm_vfs_scan_ratio = 6; /* * The swap-out function returns 1 if it successfully @@ -292,13 +322,13 @@ return count; } -static int FASTCALL(swap_out(unsigned int priority, unsigned int gfp_mask, zone_t * classzone)); -static int swap_out(unsigned int priority, unsigned int gfp_mask, zone_t * classzone) +static int FASTCALL(swap_out(zone_t * classzone)); +static int swap_out(zone_t * classzone) { int counter, nr_pages = SWAP_CLUSTER_MAX; struct mm_struct *mm; - counter = mmlist_nr; + counter = mmlist_nr << 1; do { if (unlikely(current->need_resched)) { __set_current_state(TASK_RUNNING); @@ -334,15 +364,15 @@ return 0; } -static int FASTCALL(shrink_cache(int nr_pages, zone_t * classzone, unsigned int gfp_mask, int priority)); -static int shrink_cache(int nr_pages, zone_t * classzone, unsigned int gfp_mask, int priority) +static void FASTCALL(refill_inactive(int nr_pages, zone_t * classzone)); +static int FASTCALL(shrink_cache(int nr_pages, zone_t * classzone, unsigned int gfp_mask, int * failed_swapout)); +static int shrink_cache(int nr_pages, zone_t * classzone, unsigned int gfp_mask, int * failed_swapout) { struct list_head * entry; - int max_scan = nr_inactive_pages / priority; - int max_mapped = min((nr_pages << (10 - priority)), max_scan / 10); + int max_scan = (classzone->nr_inactive_pages + classzone->nr_active_pages) / vm_cache_scan_ratio; + int max_mapped = vm_mapped_ratio * nr_pages; - spin_lock(&pagemap_lru_lock); - while (--max_scan >= 0 && (entry = inactive_list.prev) != &inactive_list) { + while (max_scan && classzone->nr_inactive_pages && (entry = inactive_list.prev) != &inactive_list) { struct page * page; if (unlikely(current->need_resched)) { @@ -371,6 +401,8 @@ if (!memclass(page_zone(page), classzone)) continue; + max_scan--; + /* Racy check to avoid trylocking when not worthwhile */ if (!page->buffers && (page_count(page) != 1 || !page->mapping)) goto page_mapped; @@ -468,34 +500,49 @@ spin_lock(&pagecache_lock); /* - * this is the non-racy check for busy page. + * This is the non-racy check for busy page. + * It is critical to check PageDirty _after_ we made sure + * the page is freeable so not in use by anybody. + * At this point we're guaranteed that page->buffers is NULL, + * nobody can refill page->buffers under us because we still + * hold the page lock. */ - if (!page->mapping || !is_page_cache_freeable(page)) { + if (!page->mapping || page_count(page) > 1) { spin_unlock(&pagecache_lock); UnlockPage(page); page_mapped: - if (--max_mapped >= 0) - continue; + if (--max_mapped < 0) { + spin_unlock(&pagemap_lru_lock); - /* - * Alert! We've found too many mapped pages on the - * inactive list, so we start swapping out now! - */ - spin_unlock(&pagemap_lru_lock); - swap_out(priority, gfp_mask, classzone); - return nr_pages; - } + nr_pages -= kmem_cache_reap(gfp_mask); + if (nr_pages <= 0) + goto out; - /* - * It is critical to check PageDirty _after_ we made sure - * the page is freeable* so not in use by anybody. - */ + shrink_dcache_memory(vm_vfs_scan_ratio, gfp_mask); + shrink_icache_memory(vm_vfs_scan_ratio, gfp_mask); +#ifdef CONFIG_QUOTA + shrink_dqcache_memory(vm_vfs_scan_ratio, gfp_mask); +#endif + + if (!*failed_swapout) + *failed_swapout = !swap_out(classzone); + + max_mapped = nr_pages * vm_mapped_ratio; + + spin_lock(&pagemap_lru_lock); + refill_inactive(nr_pages, classzone); + } + continue; + + } if (PageDirty(page)) { spin_unlock(&pagecache_lock); UnlockPage(page); continue; } + __lru_cache_del(page); + /* point of no return */ if (likely(!PageSwapCache(page))) { __remove_inode_page(page); @@ -508,7 +555,6 @@ swap_free(swap); } - __lru_cache_del(page); UnlockPage(page); /* effectively free the page here */ @@ -520,6 +566,7 @@ } spin_unlock(&pagemap_lru_lock); + out: return nr_pages; } @@ -530,13 +577,15 @@ * We move them the other way when we see the * reference bit on the page. */ -static void refill_inactive(int nr_pages) +static void refill_inactive(int nr_pages, zone_t * classzone) { struct list_head * entry; + unsigned long ratio; + + ratio = (unsigned long) nr_pages * classzone->nr_active_pages / (((unsigned long) classzone->nr_inactive_pages * vm_lru_balance_ratio) + 1); - spin_lock(&pagemap_lru_lock); entry = active_list.prev; - while (nr_pages && entry != &active_list) { + while (ratio && entry != &active_list) { struct page * page; page = list_entry(entry, struct page, lru); @@ -547,60 +596,68 @@ continue; } - nr_pages--; + ratio--; del_page_from_active_list(page); add_page_to_inactive_list(page); SetPageReferenced(page); } - spin_unlock(&pagemap_lru_lock); + + if (entry != &active_list) { + list_del(&active_list); + list_add(&active_list, entry); + } } -static int FASTCALL(shrink_caches(zone_t * classzone, int priority, unsigned int gfp_mask, int nr_pages)); -static int shrink_caches(zone_t * classzone, int priority, unsigned int gfp_mask, int nr_pages) +static int FASTCALL(shrink_caches(zone_t * classzone, unsigned int gfp_mask, int nr_pages, int * failed_swapout)); +static int shrink_caches(zone_t * classzone, unsigned int gfp_mask, int nr_pages, int * failed_swapout) { - int chunk_size = nr_pages; - unsigned long ratio; - nr_pages -= kmem_cache_reap(gfp_mask); if (nr_pages <= 0) - return 0; + goto out; - nr_pages = chunk_size; - /* try to keep the active list 2/3 of the size of the cache */ - ratio = (unsigned long) nr_pages * nr_active_pages / ((nr_inactive_pages + 1) * 2); - refill_inactive(ratio); - - nr_pages = shrink_cache(nr_pages, classzone, gfp_mask, priority); - if (nr_pages <= 0) - return 0; + spin_lock(&pagemap_lru_lock); + refill_inactive(nr_pages, classzone); - shrink_dcache_memory(priority, gfp_mask); - shrink_icache_memory(priority, gfp_mask); -#ifdef CONFIG_QUOTA - shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); -#endif + nr_pages = shrink_cache(nr_pages, classzone, gfp_mask, failed_swapout); - return nr_pages; +out: + return nr_pages; } +static int check_classzone_need_balance(zone_t * classzone); + int try_to_free_pages_zone(zone_t *classzone, unsigned int gfp_mask) { - int priority = DEF_PRIORITY; - int nr_pages = SWAP_CLUSTER_MAX; - gfp_mask = pf_gfp_mask(gfp_mask); - do { - nr_pages = shrink_caches(classzone, priority, gfp_mask, nr_pages); - if (nr_pages <= 0) - return 1; - } while (--priority); - /* - * Hmm.. Cache shrink failed - time to kill something? - * Mhwahahhaha! This is the part I really like. Giggle. - */ - out_of_memory(); + for (;;) { + int tries = vm_passes; + int failed_swapout = !(gfp_mask & __GFP_IO); + int nr_pages = SWAP_CLUSTER_MAX; + + do { + nr_pages = shrink_caches(classzone, gfp_mask, nr_pages, &failed_swapout); + if (nr_pages <= 0) + return 1; + shrink_dcache_memory(vm_vfs_scan_ratio, gfp_mask); + shrink_icache_memory(vm_vfs_scan_ratio, gfp_mask); +#ifdef CONFIG_QUOTA + shrink_dqcache_memory(vm_vfs_scan_ratio, gfp_mask); +#endif + if (!failed_swapout) + failed_swapout = !swap_out(classzone); + } while (--tries); + + if (likely(current->pid != 1)) + break; + if (!check_classzone_need_balance(classzone)) + break; + + __set_current_state(TASK_RUNNING); + yield(); + } + return 0; } @@ -627,11 +684,12 @@ static int check_classzone_need_balance(zone_t * classzone) { - zone_t * first_classzone; + zone_t * first_zone; + int class_idx = zone_idx(classzone); - first_classzone = classzone->zone_pgdat->node_zones; - while (classzone >= first_classzone) { - if (classzone->free_pages > classzone->pages_high) + first_zone = classzone->zone_pgdat->node_zones; + while (classzone >= first_zone) { + if (classzone->free_pages > classzone->watermarks[class_idx].high) return 0; classzone--; } @@ -647,12 +705,12 @@ zone = pgdat->node_zones + i; if (unlikely(current->need_resched)) schedule(); - if (!zone->need_balance) + if (!zone->need_balance || !zone->size) continue; if (!try_to_free_pages_zone(zone, GFP_KSWAPD)) { zone->need_balance = 0; __set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ); + schedule_timeout(HZ*5); continue; } if (check_classzone_need_balance(zone)) @@ -684,7 +742,7 @@ for (i = pgdat->nr_zones-1; i >= 0; i--) { zone = pgdat->node_zones + i; - if (!zone->need_balance) + if (!zone->need_balance || !zone->size) continue; return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/8021q/vlan.c linux-2.4.23-pre8/net/8021q/vlan.c --- linux-2.4.22/net/8021q/vlan.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/8021q/vlan.c 2003-10-22 22:49:18.000000000 +0000 @@ -533,7 +533,9 @@ grp->vlan_devices[VLAN_ID] = new_dev; - vlan_proc_add_dev(new_dev); /* create it's proc entry */ + if (vlan_proc_add_dev(new_dev)<0)/* create it's proc entry */ + printk(KERN_WARNING "VLAN: failed to add proc entry for %s\n", + new_dev->name); if (real_dev->features & NETIF_F_HW_VLAN_FILTER) real_dev->vlan_rx_add_vid(real_dev, VLAN_ID); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/8021q/vlan_dev.c linux-2.4.23-pre8/net/8021q/vlan_dev.c --- linux-2.4.22/net/8021q/vlan_dev.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/8021q/vlan_dev.c 2003-10-22 22:49:35.000000000 +0000 @@ -75,7 +75,11 @@ static inline struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb) { if (VLAN_DEV_INFO(skb->dev)->flags & 1) { - skb = skb_share_check(skb, GFP_ATOMIC); + if (skb_shared(skb) || skb_cloned(skb)) { + struct sk_buff *nskb = skb_copy(skb, GFP_ATOMIC); + kfree_skb(skb); + skb = nskb; + } if (skb) { /* Lifted from Gleb's VLAN code... */ memmove(skb->data - ETH_HLEN, @@ -171,7 +175,7 @@ #ifdef VLAN_DEBUG printk(VLAN_DBG "%s: dropping skb: %p because came in on wrong device, dev: %s real_dev: %s, skb_dev: %s\n", - __FUNCTION__ skb, dev->name, + __FUNCTION__, skb, dev->name, VLAN_DEV_INFO(skb->dev)->real_dev->name, skb->dev->name); #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/8021q/vlanproc.c linux-2.4.23-pre8/net/8021q/vlanproc.c --- linux-2.4.22/net/8021q/vlanproc.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/8021q/vlanproc.c 2003-10-22 22:48:26.000000000 +0000 @@ -204,8 +204,10 @@ #endif /** NOTE: This will consume the memory pointed to by dent, it seems. */ - remove_proc_entry(VLAN_DEV_INFO(vlandev)->dent->name, proc_vlan_dir); - VLAN_DEV_INFO(vlandev)->dent = NULL; + if (VLAN_DEV_INFO(vlandev)->dent) { + remove_proc_entry(VLAN_DEV_INFO(vlandev)->dent->name, proc_vlan_dir); + VLAN_DEV_INFO(vlandev)->dent = NULL; + } return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/Config.in linux-2.4.23-pre8/net/Config.in --- linux-2.4.22/net/Config.in 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/Config.in 2003-10-22 22:48:12.000000000 +0000 @@ -29,6 +29,9 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then source net/khttpd/Config.in fi + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + source net/sctp/Config.in + fi fi if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then tristate 'Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)' CONFIG_ATM diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/Makefile linux-2.4.23-pre8/net/Makefile --- linux-2.4.22/net/Makefile 2002-08-03 00:39:46.000000000 +0000 +++ linux-2.4.23-pre8/net/Makefile 2003-10-22 22:48:39.000000000 +0000 @@ -7,7 +7,7 @@ O_TARGET := network.o -mod-subdirs := ipv4/netfilter ipv6/netfilter ipx irda bluetooth atm netlink sched core +mod-subdirs := ipv4/netfilter ipv6/netfilter ipx irda bluetooth atm netlink sched core sctp export-objs := netsyms.o subdir-y := core ethernet @@ -19,6 +19,7 @@ subdir-$(CONFIG_NETFILTER) += ipv4/netfilter subdir-$(CONFIG_UNIX) += unix subdir-$(CONFIG_IPV6) += ipv6 +subdir-$(CONFIG_IP_SCTP) += sctp ifneq ($(CONFIG_IPV6),n) ifneq ($(CONFIG_IPV6),) @@ -46,6 +47,10 @@ subdir-$(CONFIG_ECONET) += econet subdir-$(CONFIG_VLAN_8021Q) += 8021q +ifeq ($(CONFIG_NETFILTER),y) + mod-subdirs += ipv4/ipvs + subdir-$(CONFIG_IP_VS) += ipv4/ipvs +endif obj-y := socket.o $(join $(subdir-y), $(patsubst %,/%.o,$(notdir $(subdir-y)))) ifeq ($(CONFIG_NET),y) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/addr.c linux-2.4.23-pre8/net/atm/addr.c --- linux-2.4.22/net/atm/addr.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/addr.c 2003-10-22 22:47:37.000000000 +0000 @@ -118,23 +118,24 @@ { unsigned long flags; struct atm_dev_addr *walk; - int total; + int total = 0, error; + struct sockaddr_atmsvc *tmp_buf, *tmp_bufp; + spin_lock_irqsave(&dev->lock, flags); - total = 0; - for (walk = dev->local; walk; walk = walk->next) { + for (walk = dev->local; walk; walk = walk->next) total += sizeof(struct sockaddr_atmsvc); - if (total > size) { - spin_unlock_irqrestore(&dev->lock, flags); - return -E2BIG; - } - if (copy_to_user(u_buf,&walk->addr, - sizeof(struct sockaddr_atmsvc))) { - spin_unlock_irqrestore(&dev->lock, flags); - return -EFAULT; - } - u_buf++; + tmp_buf = tmp_bufp = kmalloc(total, GFP_ATOMIC); + if (!tmp_buf) { + spin_unlock_irqrestore(&dev->lock, flags); + return -ENOMEM; } + for (walk = dev->local; walk; walk = walk->next) + memcpy(tmp_bufp++, &walk->addr, sizeof(struct sockaddr_atmsvc)); spin_unlock_irqrestore(&dev->lock, flags); - return total; + error = total > size ? -E2BIG : total; + if (copy_to_user(u_buf, tmp_buf, total < size ? total : size)) + error = -EFAULT; + kfree(tmp_buf); + return error; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/atm_misc.c linux-2.4.23-pre8/net/atm/atm_misc.c --- linux-2.4.22/net/atm/atm_misc.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/atm_misc.c 2003-10-22 22:48:10.000000000 +0000 @@ -45,15 +45,20 @@ static int check_ci(struct atm_vcc *vcc,short vpi,int vci) { + struct sock *s; struct atm_vcc *walk; - for (walk = vcc->dev->vccs; walk; walk = walk->next) + for (s = vcc_sklist; s; s = s->next) { + walk = s->protinfo.af_atm; + if (walk->dev != vcc->dev) + continue; if (test_bit(ATM_VF_ADDR,&walk->flags) && walk->vpi == vpi && walk->vci == vci && ((walk->qos.txtp.traffic_class != ATM_NONE && vcc->qos.txtp.traffic_class != ATM_NONE) || (walk->qos.rxtp.traffic_class != ATM_NONE && vcc->qos.rxtp.traffic_class != ATM_NONE))) return -EADDRINUSE; + } /* allow VCCs with same VPI/VCI iff they don't collide on TX/RX (but we may refuse such sharing for other reasons, e.g. if protocol requires to have both channels) */ @@ -63,17 +68,16 @@ int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci) { - unsigned long flags; static short p = 0; /* poor man's per-device cache */ static int c = 0; short old_p; int old_c; int err; - spin_lock_irqsave(&vcc->dev->lock, flags); + read_lock(&vcc_sklist_lock); if (*vpi != ATM_VPI_ANY && *vci != ATM_VCI_ANY) { err = check_ci(vcc,*vpi,*vci); - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return err; } /* last scan may have left values out of bounds for current device */ @@ -88,7 +92,7 @@ if (!check_ci(vcc,p,c)) { *vpi = p; *vci = c; - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return 0; } if (*vci == ATM_VCI_ANY) { @@ -103,7 +107,7 @@ } } while (old_p != p || old_c != c); - spin_unlock_irqrestore(&vcc->dev->lock, flags); + read_unlock(&vcc_sklist_lock); return -EADDRINUSE; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/br2684.c linux-2.4.23-pre8/net/atm/br2684.c --- linux-2.4.22/net/atm/br2684.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/br2684.c 2003-10-22 22:49:58.000000000 +0000 @@ -16,9 +16,12 @@ #include #include #include +#include +#include #include +#include "common.h" #include "ipcommon.h" /* @@ -768,8 +771,6 @@ extern struct proc_dir_entry *atm_proc_root; /* from proc.c */ -extern int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long); - /* the following avoids some spurious warnings from the compiler */ #define UNUSED __attribute__((unused)) @@ -779,14 +780,14 @@ if ((p = create_proc_entry("br2684", 0, atm_proc_root)) == NULL) return -ENOMEM; p->proc_fops = &br2684_proc_operations; - br2684_ioctl_hook = br2684_ioctl; + br2684_ioctl_set(br2684_ioctl); return 0; } static void __exit UNUSED br2684_exit(void) { struct br2684_dev *brdev; - br2684_ioctl_hook = NULL; + br2684_ioctl_set(NULL); remove_proc_entry("br2684", atm_proc_root); while (!list_empty(&br2684_devs)) { brdev = list_entry_brdev(br2684_devs.next); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/clip.c linux-2.4.23-pre8/net/atm/clip.c --- linux-2.4.22/net/atm/clip.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/clip.c 2003-10-22 22:48:41.000000000 +0000 @@ -93,6 +93,7 @@ printk(KERN_CRIT "!clip_vcc->entry (clip_vcc %p)\n",clip_vcc); return; } + spin_lock_bh(&entry->neigh->dev->xmit_lock); /* block clip_start_xmit() */ entry->neigh->used = jiffies; for (walk = &entry->vccs; *walk; walk = &(*walk)->next) if (*walk == clip_vcc) { @@ -102,17 +103,20 @@ clip_vcc->entry = NULL; if (clip_vcc->xoff) netif_wake_queue(entry->neigh->dev); - if (entry->vccs) return; + if (entry->vccs) + goto out; entry->expires = jiffies-1; /* force resolution or expiration */ error = neigh_update(entry->neigh,NULL,NUD_NONE,0,0); if (error) printk(KERN_CRIT "unlink_clip_vcc: " "neigh_update failed with %d\n",error); - return; + goto out; } printk(KERN_CRIT "ATMARP: unlink_clip_vcc failed (entry %p, vcc " "0x%p)\n",entry,clip_vcc); +out: + spin_unlock_bh(&entry->neigh->dev->xmit_lock); } @@ -140,8 +144,8 @@ DPRINTK("releasing vcc %p->%p of " "entry %p\n",clip_vcc,clip_vcc->vcc, entry); - atm_async_release_vcc(clip_vcc->vcc, - -ETIMEDOUT); + vcc_release_async(clip_vcc->vcc, + -ETIMEDOUT); } if (entry->vccs || time_before(jiffies, entry->expires)) { @@ -736,7 +740,8 @@ set_bit(ATM_VF_META,&vcc->flags); set_bit(ATM_VF_READY,&vcc->flags); /* allow replies and avoid getting closed if signaling dies */ - bind_vcc(vcc,&atmarpd_dev); + vcc->dev = &atmarpd_dev; + vcc_insert_socket(vcc->sk); vcc->push = NULL; vcc->pop = NULL; /* crash */ vcc->push_oam = NULL; /* crash */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/common.c linux-2.4.23-pre8/net/atm/common.c --- linux-2.4.22/net/atm/common.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/common.c 2003-10-22 22:49:58.000000000 +0000 @@ -33,21 +33,61 @@ #include #include "lec.h" #include "lec_arpc.h" -struct atm_lane_ops atm_lane_ops; -#endif -#ifdef CONFIG_ATM_LANE_MODULE +struct atm_lane_ops *atm_lane_ops; +static DECLARE_MUTEX(atm_lane_ops_mutex); + +void atm_lane_ops_set(struct atm_lane_ops *hook) +{ + down(&atm_lane_ops_mutex); + atm_lane_ops = hook; + up(&atm_lane_ops_mutex); +} + +int try_atm_lane_ops(void) +{ + down(&atm_lane_ops_mutex); + if (atm_lane_ops && try_inc_mod_count(atm_lane_ops->owner)) { + up(&atm_lane_ops_mutex); + return 1; + } + up(&atm_lane_ops_mutex); + return 0; +} + +#if defined(CONFIG_ATM_LANE_MODULE) || defined(CONFIG_ATM_MPOA_MODULE) EXPORT_SYMBOL(atm_lane_ops); +EXPORT_SYMBOL(try_atm_lane_ops); +EXPORT_SYMBOL(atm_lane_ops_set); +#endif #endif #if defined(CONFIG_ATM_MPOA) || defined(CONFIG_ATM_MPOA_MODULE) #include #include "mpc.h" -struct atm_mpoa_ops atm_mpoa_ops; -#endif +struct atm_mpoa_ops *atm_mpoa_ops; +static DECLARE_MUTEX(atm_mpoa_ops_mutex); + +void atm_mpoa_ops_set(struct atm_mpoa_ops *hook) +{ + down(&atm_mpoa_ops_mutex); + atm_mpoa_ops = hook; + up(&atm_mpoa_ops_mutex); +} + +int try_atm_mpoa_ops(void) +{ + down(&atm_mpoa_ops_mutex); + if (atm_mpoa_ops && try_inc_mod_count(atm_mpoa_ops->owner)) { + up(&atm_mpoa_ops_mutex); + return 1; + } + up(&atm_mpoa_ops_mutex); + return 0; +} #ifdef CONFIG_ATM_MPOA_MODULE EXPORT_SYMBOL(atm_mpoa_ops); -#ifndef CONFIG_ATM_LANE_MODULE -EXPORT_SYMBOL(atm_lane_ops); +EXPORT_SYMBOL(try_atm_mpoa_ops); +EXPORT_SYMBOL(atm_mpoa_ops_set); #endif #endif @@ -84,21 +124,41 @@ #ifdef CONFIG_ATM_CLIP_MODULE EXPORT_SYMBOL(atm_clip_ops); -EXPORT_SYMBOL(atm_clip_ops_mutex); +EXPORT_SYMBOL(try_atm_clip_ops); EXPORT_SYMBOL(atm_clip_ops_set); #endif #endif #if defined(CONFIG_PPPOATM) || defined(CONFIG_PPPOATM_MODULE) -int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long); -EXPORT_SYMBOL(pppoatm_ioctl_hook); +static DECLARE_MUTEX(pppoatm_ioctl_mutex); + +static int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long); + +void pppoatm_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long)) +{ + down(&pppoatm_ioctl_mutex); + pppoatm_ioctl_hook = hook; + up(&pppoatm_ioctl_mutex); +} +#ifdef CONFIG_PPPOATM_MODULE +EXPORT_SYMBOL(pppoatm_ioctl_set); +#endif #endif #if defined(CONFIG_ATM_BR2684) || defined(CONFIG_ATM_BR2684_MODULE) -int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long); -#endif +static DECLARE_MUTEX(br2684_ioctl_mutex); + +static int (*br2684_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long); + +void br2684_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long)) +{ + down(&br2684_ioctl_mutex); + br2684_ioctl_hook = hook; + up(&br2684_ioctl_mutex); +} #ifdef CONFIG_ATM_BR2684_MODULE -EXPORT_SYMBOL(br2684_ioctl_hook); +EXPORT_SYMBOL(br2684_ioctl_set); +#endif #endif #include "resources.h" /* atm_find_dev */ @@ -118,6 +178,38 @@ #endif +struct sock *vcc_sklist; +rwlock_t vcc_sklist_lock = RW_LOCK_UNLOCKED; + +void __vcc_insert_socket(struct sock *sk) +{ + sk->next = vcc_sklist; + if (sk->next) + vcc_sklist->pprev = &sk->next; + vcc_sklist = sk; + sk->pprev = &vcc_sklist; +} + +void vcc_insert_socket(struct sock *sk) +{ + write_lock_irq(&vcc_sklist_lock); + __vcc_insert_socket(sk); + write_unlock_irq(&vcc_sklist_lock); +} + +void vcc_remove_socket(struct sock *sk) +{ + write_lock_irq(&vcc_sklist_lock); + if (sk->pprev) { + if (sk->next) + sk->next->pprev = sk->pprev; + *sk->pprev = sk->next; + sk->pprev = NULL; + } + write_unlock_irq(&vcc_sklist_lock); +} + + static struct sk_buff *alloc_tx(struct atm_vcc *vcc,unsigned int size) { struct sk_buff *skb; @@ -134,16 +226,46 @@ } -int atm_create(struct socket *sock,int protocol,int family) +EXPORT_SYMBOL(vcc_sklist); +EXPORT_SYMBOL(vcc_sklist_lock); +EXPORT_SYMBOL(vcc_insert_socket); +EXPORT_SYMBOL(vcc_remove_socket); + +static void vcc_sock_destruct(struct sock *sk) { + struct atm_vcc *vcc = sk->protinfo.af_atm; + + if (atomic_read(&vcc->sk->rmem_alloc)) + printk(KERN_DEBUG "vcc_sock_destruct: rmem leakage (%d bytes) detected.\n", atomic_read(&sk->rmem_alloc)); + + if (atomic_read(&vcc->sk->wmem_alloc)) + printk(KERN_DEBUG "vcc_sock_destruct: wmem leakage (%d bytes) detected.\n", atomic_read(&sk->wmem_alloc)); + + kfree(sk->protinfo.af_atm); +} + +int vcc_create(struct socket *sock, int protocol, int family) +{ struct sock *sk; struct atm_vcc *vcc; sock->sk = NULL; - if (sock->type == SOCK_STREAM) return -EINVAL; - if (!(sk = alloc_atm_vcc_sk(family))) return -ENOMEM; - vcc = sk->protinfo.af_atm; - memset(&vcc->flags,0,sizeof(vcc->flags)); + if (sock->type == SOCK_STREAM) + return -EINVAL; + sk = sk_alloc(family, GFP_KERNEL, 1); + if (!sk) + return -ENOMEM; + sock_init_data(NULL, sk); + + vcc = sk->protinfo.af_atm = kmalloc(sizeof(*vcc), GFP_KERNEL); + if (!vcc) { + sk_free(sk); + return -ENOMEM; + } + + memset(vcc, 0, sizeof(*vcc)); + vcc->sk = sk; + vcc->dev = NULL; vcc->callback = NULL; memset(&vcc->local,0,sizeof(struct sockaddr_atmsvc)); @@ -157,23 +279,28 @@ vcc->vpi = vcc->vci = 0; /* no VCI/VPI yet */ vcc->atm_options = vcc->aal_options = 0; init_waitqueue_head(&vcc->sleep); - skb_queue_head_init(&vcc->listenq); sk->sleep = &vcc->sleep; + sk->destruct = vcc_sock_destruct; sock->sk = sk; return 0; } -void atm_release_vcc_sk(struct sock *sk,int free_sk) +static void vcc_destroy_socket(struct sock *sk) { struct atm_vcc *vcc; struct sk_buff *skb; vcc = sk->protinfo.af_atm; - clear_bit(ATM_VF_READY,&vcc->flags); + clear_bit(ATM_VF_READY, &vcc->flags); if (vcc->dev) { - if (vcc->dev->ops->close) vcc->dev->ops->close(vcc); - if (vcc->push) vcc->push(vcc,NULL); /* atmarpd has no push */ + if (vcc->dev->ops->close) + vcc->dev->ops->close(vcc); + if (vcc->push) + vcc->push(vcc, NULL); /* atmarpd has no push */ + + vcc_remove_socket(sk); /* no more receive */ + while ((skb = skb_dequeue(&vcc->sk->receive_queue))) { atm_return(vcc,skb->truesize); kfree_skb(skb); @@ -181,35 +308,36 @@ if (vcc->dev->ops->owner) __MOD_DEC_USE_COUNT(vcc->dev->ops->owner); - atm_dev_release(vcc->dev); - if (atomic_read(&vcc->sk->rmem_alloc)) - printk(KERN_WARNING "atm_release_vcc: strange ... " - "rmem_alloc == %d after closing\n", - atomic_read(&vcc->sk->rmem_alloc)); - bind_vcc(vcc,NULL); + atm_dev_put(vcc->dev); } - - if (free_sk) free_atm_vcc_sk(sk); } -int atm_release(struct socket *sock) +int vcc_release(struct socket *sock) { - if (sock->sk) - atm_release_vcc_sk(sock->sk,1); + struct sock *sk = sock->sk; + + if (sk) { + lock_sock(sk); + vcc_destroy_socket(sock->sk); + release_sock(sk); + sock_put(sk); + } + return 0; } -void atm_async_release_vcc(struct atm_vcc *vcc,int reply) +void vcc_release_async(struct atm_vcc *vcc, int reply) { - set_bit(ATM_VF_CLOSE,&vcc->flags); + set_bit(ATM_VF_CLOSE, &vcc->flags); vcc->reply = reply; + vcc->sk->err = -reply; wake_up(&vcc->sleep); } -EXPORT_SYMBOL(atm_async_release_vcc); +EXPORT_SYMBOL(vcc_release_async); static int adjust_tp(struct atm_trafprm *tp,unsigned char aal) @@ -238,8 +366,8 @@ } -static int atm_do_connect_dev(struct atm_vcc *vcc,struct atm_dev *dev,int vpi, - int vci) +static int __vcc_connect(struct atm_vcc *vcc, struct atm_dev *dev, int vpi, + int vci) { int error; @@ -250,7 +378,10 @@ if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE)) return -EPERM; error = 0; - bind_vcc(vcc,dev); + if (!try_inc_mod_count(dev->ops->owner)) + return -ENODEV; + vcc->dev = dev; + vcc_insert_socket(vcc->sk); switch (vcc->qos.aal) { case ATM_AAL0: error = atm_init_aal0(vcc); @@ -273,53 +404,50 @@ } if (!error) error = adjust_tp(&vcc->qos.txtp,vcc->qos.aal); if (!error) error = adjust_tp(&vcc->qos.rxtp,vcc->qos.aal); - if (error) { - bind_vcc(vcc,NULL); - return error; - } + if (error) + goto fail; DPRINTK("VCC %d.%d, AAL %d\n",vpi,vci,vcc->qos.aal); DPRINTK(" TX: %d, PCR %d..%d, SDU %d\n",vcc->qos.txtp.traffic_class, vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,vcc->qos.txtp.max_sdu); DPRINTK(" RX: %d, PCR %d..%d, SDU %d\n",vcc->qos.rxtp.traffic_class, vcc->qos.rxtp.min_pcr,vcc->qos.rxtp.max_pcr,vcc->qos.rxtp.max_sdu); - if (!try_inc_mod_count(dev->ops->owner)) - return -ENODEV; if (dev->ops->open) { - error = dev->ops->open(vcc,vpi,vci); - if (error) { - if (dev->ops->owner) - __MOD_DEC_USE_COUNT(dev->ops->owner); - bind_vcc(vcc,NULL); - return error; - } + if ((error = dev->ops->open(vcc,vpi,vci))) + goto fail; } return 0; + +fail: + vcc_remove_socket(vcc->sk); + if (dev->ops->owner) + __MOD_DEC_USE_COUNT(dev->ops->owner); + /* ensure we get dev module ref count correct */ + vcc->dev = NULL; + return error; + } -static int atm_do_connect(struct atm_vcc *vcc,int itf,int vpi,int vci) +int vcc_connect(struct socket *sock, int itf, short vpi, int vci) { struct atm_dev *dev; - int return_val; - - dev = atm_dev_lookup(itf); - if (!dev) - return_val = -ENODEV; - else { - return_val = atm_do_connect_dev(vcc,dev,vpi,vci); - if (return_val) atm_dev_release(dev); - } - - return return_val; -} + struct atm_vcc *vcc = ATM_SD(sock); + int error; + DPRINTK("vcc_connect (vpi %d, vci %d)\n",vpi,vci); + if (sock->state == SS_CONNECTED) + return -EISCONN; + if (sock->state != SS_UNCONNECTED) + return -EINVAL; + if (!(vpi || vci)) + return -EINVAL; -int atm_connect_vcc(struct atm_vcc *vcc,int itf,short vpi,int vci) -{ if (vpi != ATM_VPI_UNSPEC && vci != ATM_VCI_UNSPEC) clear_bit(ATM_VF_PARTIAL,&vcc->flags); - else if (test_bit(ATM_VF_PARTIAL,&vcc->flags)) return -EINVAL; - DPRINTK("atm_connect (TX: cl %d,bw %d-%d,sdu %d; " + else + if (test_bit(ATM_VF_PARTIAL,&vcc->flags)) + return -EINVAL; + DPRINTK("vcc_connect (TX: cl %d,bw %d-%d,sdu %d; " "RX: cl %d,bw %d-%d,sdu %d,AAL %s%d)\n", vcc->qos.txtp.traffic_class,vcc->qos.txtp.min_pcr, vcc->qos.txtp.max_pcr,vcc->qos.txtp.max_sdu, @@ -327,143 +455,142 @@ vcc->qos.rxtp.max_pcr,vcc->qos.rxtp.max_sdu, vcc->qos.aal == ATM_AAL5 ? "" : vcc->qos.aal == ATM_AAL0 ? "" : " ??? code ",vcc->qos.aal == ATM_AAL0 ? 0 : vcc->qos.aal); - if (!test_bit(ATM_VF_HASQOS,&vcc->flags)) return -EBADFD; + if (!test_bit(ATM_VF_HASQOS, &vcc->flags)) + return -EBADFD; if (vcc->qos.txtp.traffic_class == ATM_ANYCLASS || vcc->qos.rxtp.traffic_class == ATM_ANYCLASS) return -EINVAL; if (itf != ATM_ITF_ANY) { - int error; - - error = atm_do_connect(vcc,itf,vpi,vci); - if (error) return error; - } - else { - struct atm_dev *dev = NULL; + dev = atm_dev_lookup(itf); + if (!dev) + return -ENODEV; + error = __vcc_connect(vcc, dev, vpi, vci); + if (error) { + atm_dev_put(dev); + return error; + } + } else { struct list_head *p, *next; + dev = NULL; spin_lock(&atm_dev_lock); list_for_each_safe(p, next, &atm_devs) { dev = list_entry(p, struct atm_dev, dev_list); atm_dev_hold(dev); spin_unlock(&atm_dev_lock); - if (!atm_do_connect_dev(vcc,dev,vpi,vci)) + if (!__vcc_connect(vcc, dev, vpi, vci)) break; - atm_dev_release(dev); + atm_dev_put(dev); dev = NULL; spin_lock(&atm_dev_lock); } spin_unlock(&atm_dev_lock); - if (!dev) return -ENODEV; + if (!dev) + return -ENODEV; } if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC) set_bit(ATM_VF_PARTIAL,&vcc->flags); - return 0; -} - - -int atm_connect(struct socket *sock,int itf,short vpi,int vci) -{ - int error; - - DPRINTK("atm_connect (vpi %d, vci %d)\n",vpi,vci); - if (sock->state == SS_CONNECTED) return -EISCONN; - if (sock->state != SS_UNCONNECTED) return -EINVAL; - if (!(vpi || vci)) return -EINVAL; - error = atm_connect_vcc(ATM_SD(sock),itf,vpi,vci); - if (error) return error; if (test_bit(ATM_VF_READY,&ATM_SD(sock)->flags)) sock->state = SS_CONNECTED; return 0; } -int atm_recvmsg(struct socket *sock,struct msghdr *m,int total_len, - int flags,struct scm_cookie *scm) +int vcc_recvmsg(struct socket *sock, struct msghdr *msg, + int size, int flags, struct scm_cookie *scm) { - DECLARE_WAITQUEUE(wait,current); - struct atm_vcc *vcc; - struct sk_buff *skb; - int eff_len,error; - void *buff; - int size; - - if (sock->state != SS_CONNECTED) return -ENOTCONN; - if (flags & ~MSG_DONTWAIT) return -EOPNOTSUPP; - if (m->msg_iovlen != 1) return -ENOSYS; /* fix this later @@@ */ - buff = m->msg_iov->iov_base; - size = m->msg_iov->iov_len; - vcc = ATM_SD(sock); - add_wait_queue(&vcc->sleep,&wait); - set_current_state(TASK_INTERRUPTIBLE); - error = 1; /* <= 0 is error */ - while (!(skb = skb_dequeue(&vcc->sk->receive_queue))) { - if (test_bit(ATM_VF_RELEASED,&vcc->flags) || - test_bit(ATM_VF_CLOSE,&vcc->flags)) { - error = vcc->reply; - break; - } - if (!test_bit(ATM_VF_READY,&vcc->flags)) { - error = 0; - break; - } - if (flags & MSG_DONTWAIT) { - error = -EAGAIN; - break; - } - schedule(); - set_current_state(TASK_INTERRUPTIBLE); - if (signal_pending(current)) { - error = -ERESTARTSYS; - break; - } - } - set_current_state(TASK_RUNNING); - remove_wait_queue(&vcc->sleep,&wait); - if (error <= 0) return error; - sock_recv_timestamp(m, vcc->sk, skb); - eff_len = skb->len > size ? size : skb->len; - if (skb->len > size) /* Not fit ? Report it... */ - m->msg_flags |= MSG_TRUNC; + struct sock *sk = sock->sk; + struct atm_vcc *vcc; + struct sk_buff *skb; + int copied, error = -EINVAL; + + if (sock->state != SS_CONNECTED) + return -ENOTCONN; + if (flags & ~MSG_DONTWAIT) /* only handle MSG_DONTWAIT */ + return -EOPNOTSUPP; + vcc = ATM_SD(sock); + if (test_bit(ATM_VF_RELEASED,&vcc->flags) || + test_bit(ATM_VF_CLOSE,&vcc->flags)) + return vcc->reply; + if (!test_bit(ATM_VF_READY, &vcc->flags)) + return 0; + + skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &error); + if (!skb) + return error; + + copied = skb->len; + if (copied > size) { + copied = size; + msg->msg_flags |= MSG_TRUNC; + } + + error = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); + if (error) + return error; + sock_recv_timestamp(msg, sk, skb); if (vcc->dev->ops->feedback) - vcc->dev->ops->feedback(vcc,skb,(unsigned long) skb->data, - (unsigned long) buff,eff_len); - DPRINTK("RcvM %d -= %d\n",atomic_read(&vcc->sk->rmem_alloc),skb->truesize); - atm_return(vcc,skb->truesize); - error = copy_to_user(buff,skb->data,eff_len) ? -EFAULT : 0; - kfree_skb(skb); - return error ? error : eff_len; + vcc->dev->ops->feedback(vcc, skb, (unsigned long) skb->data, + (unsigned long) msg->msg_iov->iov_base, copied); + DPRINTK("RcvM %d -= %d\n", atomic_read(&vcc->sk->rmem_alloc), skb->truesize); + atm_return(vcc, skb->truesize); + skb_free_datagram(sk, skb); + return copied; } + + - -int atm_sendmsg(struct socket *sock,struct msghdr *m,int total_len, - struct scm_cookie *scm) +int vcc_sendmsg(struct socket *sock, struct msghdr *m, int total_len, + struct scm_cookie *scm) { + struct sock *sk = sock->sk; DECLARE_WAITQUEUE(wait,current); - struct atm_vcc *vcc; - struct sk_buff *skb; - int eff,error; - const void *buff; - int size; - - if (sock->state != SS_CONNECTED) return -ENOTCONN; - if (m->msg_name) return -EISCONN; - if (m->msg_iovlen != 1) return -ENOSYS; /* fix this later @@@ */ - buff = m->msg_iov->iov_base; - size = m->msg_iov->iov_len; - vcc = ATM_SD(sock); - if (test_bit(ATM_VF_RELEASED,&vcc->flags) || - test_bit(ATM_VF_CLOSE,&vcc->flags)) - return vcc->reply; - if (!test_bit(ATM_VF_READY,&vcc->flags)) return -EPIPE; - if (!size) return 0; - if (size < 0 || size > vcc->qos.txtp.max_sdu) return -EMSGSIZE; - /* verify_area is done by net/socket.c */ - eff = (size+3) & ~3; /* align to word boundary */ - add_wait_queue(&vcc->sleep,&wait); + struct atm_vcc *vcc; + struct sk_buff *skb; + int eff,error; + const void *buff; + int size; + + lock_sock(sk); + if (sock->state != SS_CONNECTED) { + error = -ENOTCONN; + goto out; + } + if (m->msg_name) { + error = -EISCONN; + goto out; + } + if (m->msg_iovlen != 1) { + error = -ENOSYS; /* fix this later @@@ */ + goto out; + } + buff = m->msg_iov->iov_base; + size = m->msg_iov->iov_len; + vcc = ATM_SD(sock); + if (test_bit(ATM_VF_RELEASED, &vcc->flags) || + test_bit(ATM_VF_CLOSE, &vcc->flags)) { + error = vcc->reply; + goto out; + } + if (!test_bit(ATM_VF_READY, &vcc->flags)) { + error = -EPIPE; + goto out; + } + if (!size) { + error = 0; + goto out; + } + if (size < 0 || size > vcc->qos.txtp.max_sdu) { + error = -EMSGSIZE; + goto out; + } + /* verify_area is done by net/socket.c */ + eff = (size+3) & ~3; /* align to word boundary */ + add_wait_queue(&vcc->sleep,&wait); set_current_state(TASK_INTERRUPTIBLE); - error = 0; - while (!(skb = alloc_tx(vcc,eff))) { - if (m->msg_flags & MSG_DONTWAIT) { + error = 0; + while (!(skb = alloc_tx(vcc,eff))) { + if (m->msg_flags & MSG_DONTWAIT) { error = -EAGAIN; break; } @@ -485,16 +612,21 @@ } set_current_state(TASK_RUNNING); remove_wait_queue(&vcc->sleep,&wait); - if (error) return error; + if (error) + goto out; skb->dev = NULL; /* for paths shared with net_device interfaces */ ATM_SKB(skb)->atm_options = vcc->atm_options; if (copy_from_user(skb_put(skb,size),buff,size)) { kfree_skb(skb); - return -EFAULT; + error = -EFAULT; + goto out; } if (eff != size) memset(skb->data+size,0,eff-size); error = vcc->dev->ops->send(vcc,skb); - return error ? error : size; + error = error ? error : size; +out: + release_sock(sk); + return error; } @@ -506,7 +638,7 @@ vcc = ATM_SD(sock); poll_wait(file,&vcc->sleep,wait); mask = 0; - if (skb_peek(&vcc->sk->receive_queue) || skb_peek(&vcc->listenq)) + if (skb_peek(&vcc->sk->receive_queue)) mask |= POLLIN | POLLRDNORM; if (test_bit(ATM_VF_RELEASED,&vcc->flags) || test_bit(ATM_VF_CLOSE,&vcc->flags)) @@ -524,129 +656,51 @@ } -static void copy_aal_stats(struct k_atm_aal_stats *from, - struct atm_aal_stats *to) -{ -#define __HANDLE_ITEM(i) to->i = atomic_read(&from->i) - __AAL_STAT_ITEMS -#undef __HANDLE_ITEM -} - - -static void subtract_aal_stats(struct k_atm_aal_stats *from, - struct atm_aal_stats *to) +int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) { -#define __HANDLE_ITEM(i) atomic_sub(to->i,&from->i) - __AAL_STAT_ITEMS -#undef __HANDLE_ITEM -} - - -static int fetch_stats(struct atm_dev *dev,struct atm_dev_stats *arg,int zero) -{ - struct atm_dev_stats tmp; - int error = 0; - - copy_aal_stats(&dev->stats.aal0,&tmp.aal0); - copy_aal_stats(&dev->stats.aal34,&tmp.aal34); - copy_aal_stats(&dev->stats.aal5,&tmp.aal5); - if (arg) error = copy_to_user(arg,&tmp,sizeof(tmp)); - if (zero && !error) { - subtract_aal_stats(&dev->stats.aal0,&tmp.aal0); - subtract_aal_stats(&dev->stats.aal34,&tmp.aal34); - subtract_aal_stats(&dev->stats.aal5,&tmp.aal5); - } - return error ? -EFAULT : 0; -} - - -int atm_ioctl(struct socket *sock,unsigned int cmd,unsigned long arg) -{ - struct atm_dev *dev; - struct list_head *p; struct atm_vcc *vcc; - int *tmp_buf, *tmp_p; - void *buf; - int error,len,size,number, ret_val; + int error; - ret_val = 0; vcc = ATM_SD(sock); switch (cmd) { case SIOCOUTQ: if (sock->state != SS_CONNECTED || - !test_bit(ATM_VF_READY,&vcc->flags)) { - ret_val = -EINVAL; + !test_bit(ATM_VF_READY, &vcc->flags)) { + error = -EINVAL; goto done; } - ret_val = put_user(vcc->sk->sndbuf- - atomic_read(&vcc->sk->wmem_alloc), - (int *) arg) ? -EFAULT : 0; + error = put_user(vcc->sk->sndbuf- + atomic_read(&vcc->sk->wmem_alloc), + (int *) arg) ? -EFAULT : 0; goto done; case SIOCINQ: { struct sk_buff *skb; if (sock->state != SS_CONNECTED) { - ret_val = -EINVAL; + error = -EINVAL; goto done; } skb = skb_peek(&vcc->sk->receive_queue); - ret_val = put_user(skb ? skb->len : 0,(int *) arg) - ? -EFAULT : 0; - goto done; - } - case ATM_GETNAMES: - if (get_user(buf, - &((struct atm_iobuf *) arg)->buffer)) { - ret_val = -EFAULT; + error = put_user(skb ? skb->len : 0, + (int *) arg) ? -EFAULT : 0; goto done; } - if (get_user(len, - &((struct atm_iobuf *) arg)->length)) { - ret_val = -EFAULT; - goto done; - } - size = 0; - spin_lock(&atm_dev_lock); - list_for_each(p, &atm_devs) - size += sizeof(int); - if (size > len) { - spin_unlock(&atm_dev_lock); - ret_val = -E2BIG; - goto done; - } - tmp_buf = kmalloc(size, GFP_ATOMIC); - if (!tmp_buf) { - spin_unlock(&atm_dev_lock); - ret_val = -ENOMEM; - goto done; - } - tmp_p = tmp_buf; - list_for_each(p, &atm_devs) { - dev = list_entry(p, struct atm_dev, dev_list); - *tmp_p++ = dev->number; - } - spin_unlock(&atm_dev_lock); - ret_val = ((copy_to_user(buf, tmp_buf, size)) || - put_user(size, &((struct atm_iobuf *) arg)->length) - ) ? -EFAULT : 0; - kfree(tmp_buf); - goto done; case SIOCGSTAMP: /* borrowed from IP */ if (!vcc->sk->stamp.tv_sec) { - ret_val = -ENOENT; + error = -ENOENT; goto done; } - ret_val = copy_to_user((void *) arg, &vcc->sk->stamp, - sizeof(struct timeval)) ? -EFAULT : 0; + error = copy_to_user((void *) arg, &vcc->sk->stamp, + sizeof(struct timeval)) ? -EFAULT : 0; goto done; case ATM_SETSC: printk(KERN_WARNING "ATM_SETSC is obsolete\n"); - ret_val = 0; + error = 0; goto done; case ATMSIGD_CTRL: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } /* @@ -657,28 +711,29 @@ * have the same privledges that /proc/kcore needs */ if (!capable(CAP_SYS_RAWIO)) { - ret_val = -EPERM; + error = -EPERM; goto done; } error = sigd_attach(vcc); - if (!error) sock->state = SS_CONNECTED; - ret_val = error; + if (!error) + sock->state = SS_CONNECTED; goto done; #if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) case SIOCMKCLIP: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } if (try_atm_clip_ops()) { - ret_val = atm_clip_ops->clip_create(arg); - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + error = atm_clip_ops->clip_create(arg); + if (atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); } else - ret_val = -ENOSYS; + error = -ENOSYS; goto done; case ATMARPD_CTRL: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } #if defined(CONFIG_ATM_CLIP_MODULE) @@ -687,324 +742,194 @@ #endif if (try_atm_clip_ops()) { error = atm_clip_ops->atm_init_atmarp(vcc); - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + if (atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); if (!error) sock->state = SS_CONNECTED; - ret_val = error; } else - ret_val = -ENOSYS; + error = -ENOSYS; goto done; case ATMARP_MKIP: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } if (try_atm_clip_ops()) { - ret_val = atm_clip_ops->clip_mkip(vcc, arg); - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + error = atm_clip_ops->clip_mkip(vcc, arg); + if (atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); } else - ret_val = -ENOSYS; + error = -ENOSYS; goto done; case ATMARP_SETENTRY: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } if (try_atm_clip_ops()) { - ret_val = atm_clip_ops->clip_setentry(vcc, arg); - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + error = atm_clip_ops->clip_setentry(vcc, arg); + if (atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); } else - ret_val = -ENOSYS; + error = -ENOSYS; goto done; case ATMARP_ENCAP: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } if (try_atm_clip_ops()) { - ret_val = atm_clip_ops->clip_encap(vcc, arg); - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + error = atm_clip_ops->clip_encap(vcc, arg); + if (atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); } else - ret_val = -ENOSYS; + error = -ENOSYS; goto done; #endif #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) case ATMLEC_CTRL: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; - goto done; - } - if (atm_lane_ops.lecd_attach == NULL) - atm_lane_init(); - if (atm_lane_ops.lecd_attach == NULL) { /* try again */ - ret_val = -ENOSYS; + error = -EPERM; goto done; } - error = atm_lane_ops.lecd_attach(vcc, (int)arg); - if (error >= 0) sock->state = SS_CONNECTED; - ret_val = error; +#if defined(CONFIG_ATM_LANE_MODULE) + if (!atm_lane_ops) + request_module("lec"); +#endif + if (try_atm_lane_ops()) { + error = atm_lane_ops->lecd_attach(vcc, (int) arg); + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); + if (error >= 0) + sock->state = SS_CONNECTED; + } else + error = -ENOSYS; goto done; case ATMLEC_MCAST: - if (!capable(CAP_NET_ADMIN)) - ret_val = -EPERM; - else - ret_val = atm_lane_ops.mcast_attach(vcc, (int)arg); + if (!capable(CAP_NET_ADMIN)) { + error = -EPERM; + goto done; + } + if (try_atm_lane_ops()) { + error = atm_lane_ops->mcast_attach(vcc, (int) arg); + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); + } else + error = -ENOSYS; goto done; case ATMLEC_DATA: - if (!capable(CAP_NET_ADMIN)) - ret_val = -EPERM; - else - ret_val = atm_lane_ops.vcc_attach(vcc, (void*)arg); + if (!capable(CAP_NET_ADMIN)) { + error = -EPERM; + goto done; + } + if (try_atm_lane_ops()) { + error = atm_lane_ops->vcc_attach(vcc, (void *) arg); + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); + } else + error = -ENOSYS; goto done; #endif #if defined(CONFIG_ATM_MPOA) || defined(CONFIG_ATM_MPOA_MODULE) case ATMMPC_CTRL: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } - if (atm_mpoa_ops.mpoad_attach == NULL) - atm_mpoa_init(); - if (atm_mpoa_ops.mpoad_attach == NULL) { /* try again */ - ret_val = -ENOSYS; - goto done; - } - error = atm_mpoa_ops.mpoad_attach(vcc, (int)arg); - if (error >= 0) sock->state = SS_CONNECTED; - ret_val = error; +#if defined(CONFIG_ATM_MPOA_MODULE) + if (!atm_mpoa_ops) + request_module("mpoa"); +#endif + if (try_atm_mpoa_ops()) { + error = atm_mpoa_ops->mpoad_attach(vcc, (int) arg); + if (atm_mpoa_ops->owner) + __MOD_DEC_USE_COUNT(atm_mpoa_ops->owner); + if (error >= 0) + sock->state = SS_CONNECTED; + } else + error = -ENOSYS; goto done; case ATMMPC_DATA: - if (!capable(CAP_NET_ADMIN)) - ret_val = -EPERM; - else - ret_val = atm_mpoa_ops.vcc_attach(vcc, arg); + if (!capable(CAP_NET_ADMIN)) { + error = -EPERM; + goto done; + } + if (try_atm_mpoa_ops()) { + error = atm_mpoa_ops->vcc_attach(vcc, arg); + if (atm_mpoa_ops->owner) + __MOD_DEC_USE_COUNT(atm_mpoa_ops->owner); + } else + error = -ENOSYS; goto done; #endif #if defined(CONFIG_ATM_TCP) || defined(CONFIG_ATM_TCP_MODULE) case SIOCSIFATMTCP: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } if (!atm_tcp_ops.attach) { - ret_val = -ENOPKG; + error = -ENOPKG; goto done; } - fops_get (&atm_tcp_ops); - error = atm_tcp_ops.attach(vcc,(int) arg); - if (error >= 0) sock->state = SS_CONNECTED; - else fops_put (&atm_tcp_ops); - ret_val = error; + fops_get(&atm_tcp_ops); + error = atm_tcp_ops.attach(vcc, (int) arg); + if (error >= 0) + sock->state = SS_CONNECTED; + else + fops_put(&atm_tcp_ops); goto done; case ATMTCP_CREATE: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } if (!atm_tcp_ops.create_persistent) { - ret_val = -ENOPKG; + error = -ENOPKG; goto done; } error = atm_tcp_ops.create_persistent((int) arg); - if (error < 0) fops_put (&atm_tcp_ops); - ret_val = error; + if (error < 0) + fops_put(&atm_tcp_ops); goto done; case ATMTCP_REMOVE: if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; + error = -EPERM; goto done; } if (!atm_tcp_ops.remove_persistent) { - ret_val = -ENOPKG; + error = -ENOPKG; goto done; } error = atm_tcp_ops.remove_persistent((int) arg); - fops_put (&atm_tcp_ops); - ret_val = error; + fops_put(&atm_tcp_ops); goto done; #endif default: break; } + error = -ENOIOCTLCMD; #if defined(CONFIG_PPPOATM) || defined(CONFIG_PPPOATM_MODULE) - if (pppoatm_ioctl_hook) { - ret_val = pppoatm_ioctl_hook(vcc, cmd, arg); - if (ret_val != -ENOIOCTLCMD) - goto done; - } + down(&pppoatm_ioctl_mutex); + if (pppoatm_ioctl_hook) + error = pppoatm_ioctl_hook(vcc, cmd, arg); + up(&pppoatm_ioctl_mutex); + if (error != -ENOIOCTLCMD) + goto done; #endif #if defined(CONFIG_ATM_BR2684) || defined(CONFIG_ATM_BR2684_MODULE) - if (br2684_ioctl_hook) { - ret_val = br2684_ioctl_hook(vcc, cmd, arg); - if (ret_val != -ENOIOCTLCMD) - goto done; - } -#endif - - if (get_user(buf,&((struct atmif_sioc *) arg)->arg)) { - ret_val = -EFAULT; - goto done; - } - if (get_user(len,&((struct atmif_sioc *) arg)->length)) { - ret_val = -EFAULT; + down(&br2684_ioctl_mutex); + if (br2684_ioctl_hook) + error = br2684_ioctl_hook(vcc, cmd, arg); + up(&br2684_ioctl_mutex); + if (error != -ENOIOCTLCMD) goto done; - } - if (get_user(number,&((struct atmif_sioc *) arg)->number)) { - ret_val = -EFAULT; - goto done; - } - if (!(dev = atm_dev_lookup(number))) { - ret_val = -ENODEV; - goto done; - } - - size = 0; - switch (cmd) { - case ATM_GETTYPE: - size = strlen(dev->type)+1; - if (copy_to_user(buf,dev->type,size)) { - ret_val = -EFAULT; - goto done_release; - } - break; - case ATM_GETESI: - size = ESI_LEN; - if (copy_to_user(buf,dev->esi,size)) { - ret_val = -EFAULT; - goto done_release; - } - break; - case ATM_SETESI: - { - int i; - - for (i = 0; i < ESI_LEN; i++) - if (dev->esi[i]) { - ret_val = -EEXIST; - goto done_release; - } - } - /* fall through */ - case ATM_SETESIF: - { - unsigned char esi[ESI_LEN]; - - if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; - goto done_release; - } - if (copy_from_user(esi,buf,ESI_LEN)) { - ret_val = -EFAULT; - goto done_release; - } - memcpy(dev->esi,esi,ESI_LEN); - ret_val = ESI_LEN; - goto done_release; - } - case ATM_GETSTATZ: - if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; - goto done_release; - } - /* fall through */ - case ATM_GETSTAT: - size = sizeof(struct atm_dev_stats); - error = fetch_stats(dev,buf,cmd == ATM_GETSTATZ); - if (error) { - ret_val = error; - goto done_release; - } - break; - case ATM_GETCIRANGE: - size = sizeof(struct atm_cirange); - if (copy_to_user(buf,&dev->ci_range,size)) { - ret_val = -EFAULT; - goto done_release; - } - break; - case ATM_GETLINKRATE: - size = sizeof(int); - if (copy_to_user(buf,&dev->link_rate,size)) { - ret_val = -EFAULT; - goto done_release; - } - break; - case ATM_RSTADDR: - if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; - goto done_release; - } - atm_reset_addr(dev); - break; - case ATM_ADDADDR: - case ATM_DELADDR: - if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; - goto done_release; - } - { - struct sockaddr_atmsvc addr; +#endif - if (copy_from_user(&addr,buf,sizeof(addr))) { - ret_val = -EFAULT; - goto done_release; - } - if (cmd == ATM_ADDADDR) - ret_val = atm_add_addr(dev,&addr); - else - ret_val = atm_del_addr(dev,&addr); - goto done_release; - } - case ATM_GETADDR: - size = atm_get_addr(dev,buf,len); - if (size < 0) - ret_val = size; - else - /* may return 0, but later on size == 0 means "don't - write the length" */ - ret_val = put_user(size, - &((struct atmif_sioc *) arg)->length) ? -EFAULT : 0; - goto done_release; - case ATM_SETLOOP: - if (__ATM_LM_XTRMT((int) (long) buf) && - __ATM_LM_XTLOC((int) (long) buf) > - __ATM_LM_XTRMT((int) (long) buf)) { - ret_val = -EINVAL; - goto done_release; - } - /* fall through */ - case ATM_SETCIRANGE: - case SONET_GETSTATZ: - case SONET_SETDIAG: - case SONET_CLRDIAG: - case SONET_SETFRAMING: - if (!capable(CAP_NET_ADMIN)) { - ret_val = -EPERM; - goto done_release; - } - /* fall through */ - default: - if (!dev->ops->ioctl) { - ret_val = -EINVAL; - goto done_release; - } - size = dev->ops->ioctl(dev,cmd,buf); - if (size < 0) { - ret_val = (size == -ENOIOCTLCMD ? -EINVAL : size); - goto done_release; - } - } - - if (size) - ret_val = put_user(size,&((struct atmif_sioc *) arg)->length) ? - -EFAULT : 0; - else - ret_val = 0; -done_release: - atm_dev_release(dev); + error = atm_dev_ioctl(cmd, arg); done: - return ret_val; + return error; } @@ -1062,14 +987,16 @@ return check_tp(&qos->rxtp); } - -static int atm_do_setsockopt(struct socket *sock,int level,int optname, - void *optval,int optlen) +int vcc_setsockopt(struct socket *sock, int level, int optname, + char *optval, int optlen) { struct atm_vcc *vcc; unsigned long value; int error; + if (__SO_LEVEL_MATCH(optname, level) && optlen != __SO_SIZE(optname)) + return -EINVAL; + vcc = ATM_SD(sock); switch (optname) { case SO_ATMQOS: @@ -1103,10 +1030,16 @@ } -static int atm_do_getsockopt(struct socket *sock,int level,int optname, - void *optval,int optlen) +int vcc_getsockopt(struct socket *sock, int level, int optname, + char *optval, int *optlen) { struct atm_vcc *vcc; + int len; + + if (get_user(len, optlen)) + return -EFAULT; + if (__SO_LEVEL_MATCH(optname, level) && len != __SO_SIZE(optname)) + return -EINVAL; vcc = ATM_SD(sock); switch (optname) { @@ -1137,65 +1070,10 @@ break; } if (!vcc->dev || !vcc->dev->ops->getsockopt) return -EINVAL; - return vcc->dev->ops->getsockopt(vcc,level,optname,optval,optlen); -} - - -int atm_setsockopt(struct socket *sock,int level,int optname,char *optval, - int optlen) -{ - if (__SO_LEVEL_MATCH(optname, level) && optlen != __SO_SIZE(optname)) - return -EINVAL; - return atm_do_setsockopt(sock,level,optname,optval,optlen); + return vcc->dev->ops->getsockopt(vcc, level, optname, optval, len); } -int atm_getsockopt(struct socket *sock,int level,int optname, - char *optval,int *optlen) -{ - int len; - - if (get_user(len,optlen)) return -EFAULT; - if (__SO_LEVEL_MATCH(optname, level) && len != __SO_SIZE(optname)) - return -EINVAL; - return atm_do_getsockopt(sock,level,optname,optval,len); -} - - -/* - * lane_mpoa_init.c: A couple of helper functions - * to make modular LANE and MPOA client easier to implement - */ - -/* - * This is how it goes: - * - * if xxxx is not compiled as module, call atm_xxxx_init_ops() - * from here - * else call atm_mpoa_init_ops() from init_module() within - * the kernel when xxxx module is loaded - * - * In either case function pointers in struct atm_xxxx_ops - * are initialized to their correct values. Either they - * point to functions in the module or in the kernel - */ - -extern struct atm_mpoa_ops atm_mpoa_ops; /* in common.c */ -extern struct atm_lane_ops atm_lane_ops; /* in common.c */ - -#if defined(CONFIG_ATM_MPOA) || defined(CONFIG_ATM_MPOA_MODULE) -void atm_mpoa_init(void) -{ -#ifndef CONFIG_ATM_MPOA_MODULE /* not module */ - atm_mpoa_init_ops(&atm_mpoa_ops); -#else - request_module("mpoa"); -#endif - - return; -} -#endif - #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) struct net_bridge_fdb_entry *(*br_fdb_get_hook)(struct net_bridge *br, @@ -1206,18 +1084,8 @@ EXPORT_SYMBOL(br_fdb_put_hook); #endif /* defined(CONFIG_ATM_LANE_MODULE) || defined(CONFIG_BRIDGE_MODULE) */ #endif /* defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) */ +#endif /* defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) */ -void atm_lane_init(void) -{ -#ifndef CONFIG_ATM_LANE_MODULE /* not module */ - atm_lane_init_ops(&atm_lane_ops); -#else - request_module("lec"); -#endif - - return; -} -#endif static int __init atm_init(void) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/common.h linux-2.4.23-pre8/net/atm/common.h --- linux-2.4.22/net/atm/common.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/common.h 2003-10-22 22:49:14.000000000 +0000 @@ -10,24 +10,25 @@ #include /* for poll_table */ -int atm_create(struct socket *sock,int protocol,int family); -int atm_release(struct socket *sock); -int atm_connect(struct socket *sock,int itf,short vpi,int vci); -int atm_recvmsg(struct socket *sock,struct msghdr *m,int total_len, - int flags,struct scm_cookie *scm); -int atm_sendmsg(struct socket *sock,struct msghdr *m,int total_len, - struct scm_cookie *scm); +int vcc_create(struct socket *sock, int protocol, int family); +int vcc_release(struct socket *sock); +int vcc_connect(struct socket *sock, int itf, short vpi, int vci); +int vcc_recvmsg(struct socket *sock, struct msghdr *msg, + int size, int flags, struct scm_cookie *scm); +int vcc_sendmsg(struct socket *sock, struct msghdr *m, int total_len, + struct scm_cookie *scm); unsigned int atm_poll(struct file *file,struct socket *sock,poll_table *wait); -int atm_ioctl(struct socket *sock,unsigned int cmd,unsigned long arg); -int atm_setsockopt(struct socket *sock,int level,int optname,char *optval, - int optlen); -int atm_getsockopt(struct socket *sock,int level,int optname,char *optval, - int *optlen); +int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); +int vcc_setsockopt(struct socket *sock, int level, int optname, char *optval, + int optlen); +int vcc_getsockopt(struct socket *sock, int level, int optname, char *optval, + int *optlen); -int atm_connect_vcc(struct atm_vcc *vcc,int itf,short vpi,int vci); -void atm_release_vcc_sk(struct sock *sk,int free_sk); void atm_shutdown_dev(struct atm_dev *dev); +void pppoatm_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long)); +void br2684_ioctl_set(int (*hook)(struct atm_vcc *, unsigned int, unsigned long)); + int atmpvc_init(void); void atmpvc_exit(void); int atmsvc_init(void); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/lec.c linux-2.4.23-pre8/net/atm/lec.c --- linux-2.4.22/net/atm/lec.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/lec.c 2003-10-22 22:49:06.000000000 +0000 @@ -11,6 +11,7 @@ /* We are ethernet device */ #include #include +#include #include #include #include @@ -44,7 +45,7 @@ #include "lec.h" #include "lec_arpc.h" -#include "resources.h" /* for bind_vcc() */ +#include "resources.h" #if 0 #define DPRINTK printk @@ -57,8 +58,6 @@ unsigned char *addr); extern void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent); -static spinlock_t lec_arp_spinlock = SPIN_LOCK_UNLOCKED; - #define DUMP_PACKETS 0 /* 0 = None, * 1 = 30 first bytes * 2 = Whole packet @@ -72,9 +71,9 @@ static int lec_close(struct net_device *dev); static struct net_device_stats *lec_get_stats(struct net_device *dev); static void lec_init(struct net_device *dev); -static __inline__ struct lec_arp_table* lec_arp_find(struct lec_priv *priv, +static inline struct lec_arp_table* lec_arp_find(struct lec_priv *priv, unsigned char *mac_addr); -static __inline__ int lec_arp_remove(struct lec_arp_table **lec_arp_tables, +static inline int lec_arp_remove(struct lec_priv *priv, struct lec_arp_table *to_remove); /* LANE2 functions */ static void lane2_associate_ind (struct net_device *dev, u8 *mac_address, @@ -96,8 +95,18 @@ static struct net_device *dev_lec[MAX_LEC_ITF]; /* This will be called from proc.c via function pointer */ -struct net_device **get_dev_lec (void) { - return &dev_lec[0]; +struct net_device *get_dev_lec(int itf) +{ + struct net_device *dev; + + if (itf >= MAX_LEC_ITF) + return NULL; + rtnl_lock(); + dev = dev_lec[itf]; + if (dev) + dev_hold(dev); + rtnl_unlock(); + return dev; } #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) @@ -433,7 +442,7 @@ break; case l_narp_req: /* LANE2: see 7.1.35 in the lane2 spec */ entry = lec_arp_find(priv, mesg->content.normal.mac_addr); - lec_arp_remove(priv->lec_arp_tables, entry); + lec_arp_remove(priv, entry); if (mesg->content.normal.no_source_le_narp) break; @@ -809,7 +818,8 @@ lec_arp_init(priv); priv->itfnum = i; /* LANE2 addition */ priv->lecd = vcc; - bind_vcc(vcc, &lecatm_dev); + vcc->dev = &lecatm_dev; + vcc_insert_socket(vcc->sk); vcc->proto_data = dev_lec[i]; set_bit(ATM_VF_META,&vcc->flags); @@ -834,37 +844,28 @@ return i; } -void atm_lane_init_ops(struct atm_lane_ops *ops) +static struct atm_lane_ops __atm_lane_ops = { - ops->lecd_attach = lecd_attach; - ops->mcast_attach = lec_mcast_attach; - ops->vcc_attach = lec_vcc_attach; - ops->get_lecs = get_dev_lec; - - printk("lec.c: " __DATE__ " " __TIME__ " initialized\n"); - - return; -} + .lecd_attach = lecd_attach, + .mcast_attach = lec_mcast_attach, + .vcc_attach = lec_vcc_attach, + .get_lec = get_dev_lec, + .owner = THIS_MODULE +}; static int __init lane_module_init(void) { - extern struct atm_lane_ops atm_lane_ops; - - atm_lane_init_ops(&atm_lane_ops); - + atm_lane_ops_set(&__atm_lane_ops); + printk("lec.c: " __DATE__ " " __TIME__ " initialized\n"); return 0; } static void __exit lane_module_cleanup(void) { int i; - extern struct atm_lane_ops atm_lane_ops; struct lec_priv *priv; - atm_lane_ops.lecd_attach = NULL; - atm_lane_ops.mcast_attach = NULL; - atm_lane_ops.vcc_attach = NULL; - atm_lane_ops.get_lecs = NULL; + atm_lane_ops_set(NULL); for (i = 0; i < MAX_LEC_ITF; i++) { if (dev_lec[i] != NULL) { @@ -874,7 +875,7 @@ unregister_trdev(dev_lec[i]); else #endif - unregister_netdev(dev_lec[i]); + unregister_netdev(dev_lec[i]); kfree(dev_lec[i]); dev_lec[i] = NULL; } @@ -1074,6 +1075,7 @@ for (i=0;ilec_arp_tables[i] = NULL; } + spin_lock_init(&priv->lec_arp_lock); init_timer(&priv->lec_arp_timer); priv->lec_arp_timer.expires = jiffies+LEC_ARP_REFRESH_INTERVAL; priv->lec_arp_timer.data = (unsigned long)priv; @@ -1091,7 +1093,7 @@ clear_bit(ATM_VF_READY,&entry->vcc->flags); entry->vcc->push(entry->vcc, NULL); #endif - atm_async_release_vcc(entry->vcc, -EPIPE); + vcc_release_async(entry->vcc, -EPIPE); entry->vcc = NULL; } if (entry->recv_vcc) { @@ -1101,7 +1103,7 @@ clear_bit(ATM_VF_READY,&entry->recv_vcc->flags); entry->recv_vcc->push(entry->recv_vcc, NULL); #endif - atm_async_release_vcc(entry->recv_vcc, -EPIPE); + vcc_release_async(entry->recv_vcc, -EPIPE); entry->recv_vcc = NULL; } } @@ -1110,21 +1112,20 @@ * Insert entry to lec_arp_table * LANE2: Add to the end of the list to satisfy 8.1.13 */ -static __inline__ void -lec_arp_add(struct lec_arp_table **lec_arp_tables, - struct lec_arp_table *to_add) +static inline void +lec_arp_add(struct lec_priv *priv, struct lec_arp_table *to_add) { unsigned long flags; unsigned short place; struct lec_arp_table *tmp; - spin_lock_irqsave(&lec_arp_spinlock, flags); + spin_lock_irqsave(&priv->lec_arp_lock, flags); place = HASH(to_add->mac_addr[ETH_ALEN-1]); - tmp = lec_arp_tables[place]; + tmp = priv->lec_arp_tables[place]; to_add->next = NULL; if (tmp == NULL) - lec_arp_tables[place] = to_add; + priv->lec_arp_tables[place] = to_add; else { /* add to the end */ while (tmp->next) @@ -1132,7 +1133,7 @@ tmp->next = to_add; } - spin_unlock_irqrestore(&lec_arp_spinlock, flags); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); DPRINTK("LEC_ARP: Added entry:%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", 0xff&to_add->mac_addr[0], 0xff&to_add->mac_addr[1], @@ -1143,8 +1144,8 @@ /* * Remove entry from lec_arp_table */ -static __inline__ int -lec_arp_remove(struct lec_arp_table **lec_arp_tables, +static inline int +lec_arp_remove(struct lec_priv *priv, struct lec_arp_table *to_remove) { unsigned long flags; @@ -1152,22 +1153,22 @@ struct lec_arp_table *tmp; int remove_vcc=1; - spin_lock_irqsave(&lec_arp_spinlock, flags); + spin_lock_irqsave(&priv->lec_arp_lock, flags); if (!to_remove) { - spin_unlock_irqrestore(&lec_arp_spinlock, flags); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); return -1; } place = HASH(to_remove->mac_addr[ETH_ALEN-1]); - tmp = lec_arp_tables[place]; + tmp = priv->lec_arp_tables[place]; if (tmp == to_remove) { - lec_arp_tables[place] = tmp->next; + priv->lec_arp_tables[place] = tmp->next; } else { while(tmp && tmp->next != to_remove) { tmp = tmp->next; } if (!tmp) {/* Entry was not found */ - spin_unlock_irqrestore(&lec_arp_spinlock, flags); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); return -1; } } @@ -1181,7 +1182,7 @@ * ESI_FLUSH_PENDING, ESI_FORWARD_DIRECT */ for(place=0;placenext){ + for(tmp = priv->lec_arp_tables[place]; tmp != NULL; tmp = tmp->next) { if (memcmp(tmp->atm_addr, to_remove->atm_addr, ATM_ESA_LEN)==0) { remove_vcc=0; @@ -1194,7 +1195,7 @@ } skb_queue_purge(&to_remove->tx_wait); /* FIXME: good place for this? */ - spin_unlock_irqrestore(&lec_arp_spinlock, flags); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); DPRINTK("LEC_ARP: Removed entry:%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", 0xff&to_remove->mac_addr[0], 0xff&to_remove->mac_addr[1], @@ -1390,7 +1391,7 @@ for (i=0;ilec_arp_tables[i];entry != NULL; entry=next) { next = entry->next; - lec_arp_remove(priv->lec_arp_tables, entry); + lec_arp_remove(priv, entry); kfree(entry); } } @@ -1430,7 +1431,7 @@ /* * Find entry by mac_address */ -static __inline__ struct lec_arp_table* +static inline struct lec_arp_table* lec_arp_find(struct lec_priv *priv, unsigned char *mac_addr) { @@ -1568,8 +1569,6 @@ lec_arp_check_expire(unsigned long data) { struct lec_priv *priv = (struct lec_priv *)data; - struct lec_arp_table **lec_arp_tables = - (struct lec_arp_table **)priv->lec_arp_tables; struct lec_arp_table *entry, *next; unsigned long now; unsigned long time_to_check; @@ -1585,7 +1584,7 @@ lec_arp_get(priv); now = jiffies; for(i=0;ilec_arp_tables[i]; entry != NULL; ) { if ((entry->flags) & LEC_REMOTE_FLAG && priv->topology_change) time_to_check=priv->forward_delay_time; @@ -1601,7 +1600,7 @@ /* Remove entry */ DPRINTK("LEC:Entry timed out\n"); next = entry->next; - lec_arp_remove(lec_arp_tables, entry); + lec_arp_remove(priv, entry); kfree(entry); entry = next; } else { @@ -1690,7 +1689,7 @@ if (!entry) { return priv->mcast_vcc; } - lec_arp_add(priv->lec_arp_tables, entry); + lec_arp_add(priv, entry); /* We want arp-request(s) to be sent */ entry->packets_flooded =1; entry->status = ESI_ARP_PENDING; @@ -1723,7 +1722,7 @@ if (!memcmp(atm_addr, entry->atm_addr, ATM_ESA_LEN) && (permanent || !(entry->flags & LEC_PERMANENT_FLAG))) { - lec_arp_remove(priv->lec_arp_tables, entry); + lec_arp_remove(priv, entry); kfree(entry); } lec_arp_put(priv); @@ -1789,7 +1788,7 @@ entry->status = ESI_FORWARD_DIRECT; memcpy(entry->mac_addr, mac_addr, ETH_ALEN); entry->last_used = jiffies; - lec_arp_add(priv->lec_arp_tables, entry); + lec_arp_add(priv, entry); } if (remoteflag) entry->flags|=LEC_REMOTE_FLAG; @@ -1809,7 +1808,7 @@ return; } entry->status = ESI_UNKNOWN; - lec_arp_add(priv->lec_arp_tables, entry); + lec_arp_add(priv, entry); /* Temporary, changes before end of function */ } memcpy(entry->atm_addr, atm_addr, ATM_ESA_LEN); @@ -2056,7 +2055,7 @@ to_add->old_push = vcc->push; vcc->push = lec_push; priv->mcast_vcc = vcc; - lec_arp_add(priv->lec_arp_tables, to_add); + lec_arp_add(priv, to_add); lec_arp_put(priv); return 0; } @@ -2074,7 +2073,7 @@ for(entry = priv->lec_arp_tables[i];entry; entry=next) { next = entry->next; if (vcc == entry->vcc) { - lec_arp_remove(priv->lec_arp_tables,entry); + lec_arp_remove(priv, entry); kfree(entry); if (priv->mcast_vcc == vcc) { priv->mcast_vcc = NULL; @@ -2154,23 +2153,23 @@ lec_arp_get(priv); entry = priv->lec_arp_empty_ones; if (vcc == entry->vcc) { - spin_lock_irqsave(&lec_arp_spinlock, flags); + spin_lock_irqsave(&priv->lec_arp_lock, flags); del_timer(&entry->timer); memcpy(entry->mac_addr, src, ETH_ALEN); entry->status = ESI_FORWARD_DIRECT; entry->last_used = jiffies; priv->lec_arp_empty_ones = entry->next; - spin_unlock_irqrestore(&lec_arp_spinlock, flags); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); /* We might have got an entry */ if ((prev=lec_arp_find(priv,src))) { - lec_arp_remove(priv->lec_arp_tables, prev); + lec_arp_remove(priv, prev); kfree(prev); } - lec_arp_add(priv->lec_arp_tables, entry); + lec_arp_add(priv, entry); lec_arp_put(priv); return; } - spin_lock_irqsave(&lec_arp_spinlock, flags); + spin_lock_irqsave(&priv->lec_arp_lock, flags); prev = entry; entry = entry->next; while (entry && entry->vcc != vcc) { @@ -2180,7 +2179,7 @@ if (!entry) { DPRINTK("LEC_ARP: Arp_check_empties: entry not found!\n"); lec_arp_put(priv); - spin_unlock_irqrestore(&lec_arp_spinlock, flags); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); return; } del_timer(&entry->timer); @@ -2188,12 +2187,12 @@ entry->status = ESI_FORWARD_DIRECT; entry->last_used = jiffies; prev->next = entry->next; - spin_unlock_irqrestore(&lec_arp_spinlock, flags); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); if ((prev = lec_arp_find(priv, src))) { - lec_arp_remove(priv->lec_arp_tables,prev); + lec_arp_remove(priv, prev); kfree(prev); } - lec_arp_add(priv->lec_arp_tables,entry); + lec_arp_add(priv, entry); lec_arp_put(priv); } MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/lec.h linux-2.4.23-pre8/net/atm/lec.h --- linux-2.4.22/net/atm/lec.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/lec.h 2003-10-22 22:48:26.000000000 +0000 @@ -64,7 +64,8 @@ int (*lecd_attach)(struct atm_vcc *vcc, int arg); int (*mcast_attach)(struct atm_vcc *vcc, int arg); int (*vcc_attach)(struct atm_vcc *vcc, void *arg); - struct net_device **(*get_lecs)(void); + struct net_device * (*get_lec)(int itf); + struct module *owner; }; /* @@ -102,6 +103,7 @@ collects all those VCCs. LANEv1 client has only one item in this list. These entries are not aged out. */ atomic_t lec_arp_users; + spinlock_t lec_arp_lock; struct atm_vcc *mcast_vcc; /* Default Multicast Send VCC */ struct atm_vcc *lecd; struct timer_list lec_arp_timer; @@ -148,14 +150,16 @@ int lecd_attach(struct atm_vcc *vcc, int arg); int lec_vcc_attach(struct atm_vcc *vcc, void *arg); int lec_mcast_attach(struct atm_vcc *vcc, int arg); -struct net_device **get_dev_lec(void); +struct net_device *get_dev_lec(int itf); int make_lec(struct atm_vcc *vcc); int send_to_lecd(struct lec_priv *priv, atmlec_msg_type type, unsigned char *mac_addr, unsigned char *atm_addr, struct sk_buff *data); void lec_push(struct atm_vcc *vcc, struct sk_buff *skb); -void atm_lane_init(void); -void atm_lane_init_ops(struct atm_lane_ops *ops); +extern struct atm_lane_ops *atm_lane_ops; +void atm_lane_ops_set(struct atm_lane_ops *hook); +int try_atm_lane_ops(void); + #endif /* _LEC_H_ */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/mpc.c linux-2.4.23-pre8/net/atm/mpc.c --- linux-2.4.22/net/atm/mpc.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/mpc.c 2003-10-22 22:49:19.000000000 +0000 @@ -28,7 +28,7 @@ #include "lec.h" #include "mpc.h" -#include "resources.h" /* for bind_vcc() */ +#include "resources.h" /* * mpc.c: Implementation of MPOA client kernel part @@ -251,12 +251,14 @@ static struct net_device *find_lec_by_itfnum(int itf) { - extern struct atm_lane_ops atm_lane_ops; /* in common.c */ - - if (atm_lane_ops.get_lecs == NULL) + struct net_device *dev; + if (!try_atm_lane_ops()) return NULL; - return atm_lane_ops.get_lecs()[itf]; /* FIXME: something better */ + dev = atm_lane_ops->get_lec(itf); + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); + return dev; } static struct mpoa_client *alloc_mpc(void) @@ -777,14 +779,16 @@ if (mpc->dev) { /* check if the lec is LANE2 capable */ priv = (struct lec_priv *)mpc->dev->priv; - if (priv->lane_version < 2) + if (priv->lane_version < 2) { + dev_put(mpc->dev); mpc->dev = NULL; - else + } else priv->lane2_ops->associate_indicator = lane2_assoc_ind; } mpc->mpoad_vcc = vcc; - bind_vcc(vcc, &mpc_dev); + vcc->dev = &mpc_dev; + vcc_insert_socket(vcc->sk); set_bit(ATM_VF_META,&vcc->flags); set_bit(ATM_VF_READY,&vcc->flags); @@ -837,6 +841,7 @@ struct lec_priv *priv = (struct lec_priv *)mpc->dev->priv; priv->lane2_ops->associate_indicator = NULL; stop_mpc(mpc); + dev_put(mpc->dev); } mpc->in_ops->destroy_cache(mpc); @@ -973,6 +978,7 @@ } mpc->dev_num = priv->itfnum; mpc->dev = dev; + dev_hold(dev); dprintk("mpoa: (%s) was initialized\n", dev->name); break; case NETDEV_UNREGISTER: @@ -982,6 +988,7 @@ break; dprintk("mpoa: device (%s) was deallocated\n", dev->name); stop_mpc(mpc); + dev_put(mpc->dev); mpc->dev = NULL; break; case NETDEV_UP: @@ -1391,13 +1398,18 @@ return; } -void atm_mpoa_init_ops(struct atm_mpoa_ops *ops) +static struct atm_mpoa_ops __atm_mpoa_ops = { + .mpoad_attach = atm_mpoa_mpoad_attach, + .vcc_attach = atm_mpoa_vcc_attach, + .owner = THIS_MODULE +}; + +static __init int atm_mpoa_init(void) { - ops->mpoad_attach = atm_mpoa_mpoad_attach; - ops->vcc_attach = atm_mpoa_vcc_attach; + atm_mpoa_ops_set(&__atm_mpoa_ops); #ifdef CONFIG_PROC_FS - if(mpc_proc_init() != 0) + if (mpc_proc_init() != 0) printk(KERN_INFO "mpoa: failed to initialize /proc/mpoa\n"); else printk(KERN_INFO "mpoa: /proc/mpoa initialized\n"); @@ -1405,22 +1417,11 @@ printk("mpc.c: " __DATE__ " " __TIME__ " initialized\n"); - return; -} - -#ifdef MODULE -int init_module(void) -{ - extern struct atm_mpoa_ops atm_mpoa_ops; - - atm_mpoa_init_ops(&atm_mpoa_ops); - return 0; } -void cleanup_module(void) +void __exit atm_mpoa_cleanup(void) { - extern struct atm_mpoa_ops atm_mpoa_ops; struct mpoa_client *mpc, *tmp; struct atm_mpoa_qos *qos, *nextqos; struct lec_priv *priv; @@ -1435,8 +1436,7 @@ del_timer(&mpc_timer); unregister_netdevice_notifier(&mpoa_notifier); - atm_mpoa_ops.mpoad_attach = NULL; - atm_mpoa_ops.vcc_attach = NULL; + atm_mpoa_ops_set(NULL); mpc = mpcs; mpcs = NULL; @@ -1471,5 +1471,8 @@ return; } -#endif /* MODULE */ + +module_init(atm_mpoa_init); +module_exit(atm_mpoa_cleanup); + MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/mpc.h linux-2.4.23-pre8/net/atm/mpc.h --- linux-2.4.22/net/atm/mpc.h 2000-12-11 21:33:43.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/mpc.h 2003-10-22 22:47:43.000000000 +0000 @@ -48,11 +48,13 @@ struct atm_mpoa_ops { int (*mpoad_attach)(struct atm_vcc *vcc, int arg); /* attach mpoa daemon */ int (*vcc_attach)(struct atm_vcc *vcc, long arg); /* attach shortcut vcc */ + struct module *owner; }; /* Boot/module initialization function */ -void atm_mpoa_init(void); -void atm_mpoa_init_ops(struct atm_mpoa_ops *ops); +extern struct atm_mpoa_ops *atm_mpoa_ops; +int try_atm_mpoa_ops(void); +void atm_mpoa_ops_set(struct atm_mpoa_ops *hook); /* MPOA QoS operations */ struct atm_mpoa_qos *atm_mpoa_add_qos(uint32_t dst_ip, struct atm_qos *qos); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/mpoa_caches.c linux-2.4.23-pre8/net/atm/mpoa_caches.c --- linux-2.4.22/net/atm/mpoa_caches.c 2000-04-14 16:48:47.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/mpoa_caches.c 2003-10-22 22:47:59.000000000 +0000 @@ -212,7 +212,7 @@ client->eg_ops->put(eg_entry); return; } - atm_async_release_vcc(vcc, -EPIPE); + vcc_release_async(vcc, -EPIPE); } return; @@ -447,7 +447,7 @@ client->in_ops->put(in_entry); return; } - atm_async_release_vcc(vcc, -EPIPE); + vcc_release_async(vcc, -EPIPE); } return; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/pppoatm.c linux-2.4.23-pre8/net/atm/pppoatm.c --- linux-2.4.22/net/atm/pppoatm.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/pppoatm.c 2003-10-22 22:49:10.000000000 +0000 @@ -44,6 +44,8 @@ #include #include +#include "common.h" + #if 0 #define DPRINTK(format, args...) \ printk(KERN_DEBUG "pppoatm: " format, ##args) @@ -344,17 +346,15 @@ /* the following avoids some spurious warnings from the compiler */ #define UNUSED __attribute__((unused)) -extern int (*pppoatm_ioctl_hook)(struct atm_vcc *, unsigned int, unsigned long); - static int __init UNUSED pppoatm_init(void) { - pppoatm_ioctl_hook = pppoatm_ioctl; + pppoatm_ioctl_set(pppoatm_ioctl); return 0; } static void __exit UNUSED pppoatm_exit(void) { - pppoatm_ioctl_hook = NULL; + pppoatm_ioctl_set(NULL); } module_init(pppoatm_init); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/proc.c linux-2.4.23-pre8/net/atm/proc.c --- linux-2.4.22/net/atm/proc.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/proc.c 2003-10-22 22:48:20.000000000 +0000 @@ -47,7 +47,6 @@ #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) #include "lec.h" #include "lec_arpc.h" -extern struct atm_lane_ops atm_lane_ops; /* in common.c */ #endif static ssize_t proc_dev_atm_read(struct file *file,char *buf,size_t count, @@ -333,9 +332,7 @@ static int atm_pvc_info(loff_t pos,char *buf) { - unsigned long flags; - struct atm_dev *dev; - struct list_head *p; + struct sock *s; struct atm_vcc *vcc; int left, clip_info = 0; @@ -348,27 +345,23 @@ if (try_atm_clip_ops()) clip_info = 1; #endif - spin_lock(&atm_dev_lock); - list_for_each(p, &atm_devs) { - dev = list_entry(p, struct atm_dev, dev_list); - spin_lock_irqsave(&dev->lock, flags); - for (vcc = dev->vccs; vcc; vcc = vcc->next) - if (vcc->sk->family == PF_ATMPVC && vcc->dev && !left--) { - pvc_info(vcc,buf,clip_info); - spin_unlock_irqrestore(&dev->lock, flags); - spin_unlock(&atm_dev_lock); + read_lock(&vcc_sklist_lock); + for(s = vcc_sklist; s; s = s->next) { + vcc = s->protinfo.af_atm; + if (vcc->sk->family == PF_ATMPVC && vcc->dev && !left--) { + pvc_info(vcc,buf,clip_info); + read_unlock(&vcc_sklist_lock); #if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) - if (clip_info) - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + if (clip_info && atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); #endif - return strlen(buf); - } - spin_unlock_irqrestore(&dev->lock, flags); + return strlen(buf); + } } - spin_unlock(&atm_dev_lock); + read_unlock(&vcc_sklist_lock); #if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) - if (clip_info) - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + if (clip_info && atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); #endif return 0; } @@ -376,10 +369,8 @@ static int atm_vc_info(loff_t pos,char *buf) { - unsigned long flags; - struct atm_dev *dev; - struct list_head *p; struct atm_vcc *vcc; + struct sock *s; int left; if (!pos) @@ -387,20 +378,16 @@ "Address"," Itf VPI VCI Fam Flags Reply Send buffer" " Recv buffer\n"); left = pos-1; - spin_lock(&atm_dev_lock); - list_for_each(p, &atm_devs) { - dev = list_entry(p, struct atm_dev, dev_list); - spin_lock_irqsave(&dev->lock, flags); - for (vcc = dev->vccs; vcc; vcc = vcc->next) - if (!left--) { - vc_info(vcc,buf); - spin_unlock_irqrestore(&dev->lock, flags); - spin_unlock(&atm_dev_lock); - return strlen(buf); - } - spin_unlock_irqrestore(&dev->lock, flags); + read_lock(&vcc_sklist_lock); + for(s = vcc_sklist; s; s = s->next) { + vcc = s->protinfo.af_atm; + if (!left--) { + vc_info(vcc,buf); + read_unlock(&vcc_sklist_lock); + return strlen(buf); + } } - spin_unlock(&atm_dev_lock); + read_unlock(&vcc_sklist_lock); return 0; } @@ -408,29 +395,23 @@ static int atm_svc_info(loff_t pos,char *buf) { - unsigned long flags; - struct atm_dev *dev; - struct list_head *p; + struct sock *s; struct atm_vcc *vcc; int left; if (!pos) return sprintf(buf,"Itf VPI VCI State Remote\n"); left = pos-1; - spin_lock(&atm_dev_lock); - list_for_each(p, &atm_devs) { - dev = list_entry(p, struct atm_dev, dev_list); - spin_lock_irqsave(&dev->lock, flags); - for (vcc = dev->vccs; vcc; vcc = vcc->next) - if (vcc->sk->family == PF_ATMSVC && !left--) { - svc_info(vcc,buf); - spin_unlock_irqrestore(&dev->lock, flags); - spin_unlock(&atm_dev_lock); - return strlen(buf); - } - spin_unlock_irqrestore(&dev->lock, flags); + read_lock(&vcc_sklist_lock); + for(s = vcc_sklist; s; s = s->next) { + vcc = s->protinfo.af_atm; + if (vcc->sk->family == PF_ATMSVC && !left--) { + svc_info(vcc,buf); + read_unlock(&vcc_sklist_lock); + return strlen(buf); + } } - spin_unlock(&atm_dev_lock); + read_unlock(&vcc_sklist_lock); return 0; } @@ -458,7 +439,8 @@ if (--count) continue; atmarp_info(n->dev,entry,NULL,buf); read_unlock_bh(&clip_tbl_hook->lock); - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + if (atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); return strlen(buf); } for (vcc = entry->vccs; vcc; @@ -466,12 +448,14 @@ if (--count) continue; atmarp_info(n->dev,entry,vcc,buf); read_unlock_bh(&clip_tbl_hook->lock); - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + if (atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); return strlen(buf); } } read_unlock_bh(&clip_tbl_hook->lock); - __MOD_DEC_USE_COUNT(atm_clip_ops->owner); + if (atm_clip_ops->owner) + __MOD_DEC_USE_COUNT(atm_clip_ops->owner); return 0; } #endif @@ -479,57 +463,77 @@ #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) static int atm_lec_info(loff_t pos,char *buf) { + unsigned long flags; struct lec_priv *priv; struct lec_arp_table *entry; int i, count, d, e; - struct net_device **dev_lec; + struct net_device *dev; if (!pos) { return sprintf(buf,"Itf MAC ATM destination" " Status Flags " "VPI/VCI Recv VPI/VCI\n"); } - if (atm_lane_ops.get_lecs == NULL) + if (!try_atm_lane_ops()) return 0; /* the lane module is not there yet */ - else - dev_lec = atm_lane_ops.get_lecs(); count = pos; - for(d=0;dpriv)) continue; - for(i=0;ilec_arp_tables[i]; - for(;entry;entry=entry->next) { - if (--count) continue; - e=sprintf(buf,"%s ", - dev_lec[d]->name); - lec_info(entry,buf+e); + for(d = 0; d < MAX_LEC_ITF; d++) { + dev = atm_lane_ops->get_lec(d); + if (!dev || !(priv = (struct lec_priv *) dev->priv)) + continue; + spin_lock_irqsave(&priv->lec_arp_lock, flags); + for(i = 0; i < LEC_ARP_TABLE_SIZE; i++) { + for(entry = priv->lec_arp_tables[i]; entry; entry = entry->next) { + if (--count) + continue; + e = sprintf(buf,"%s ", dev->name); + lec_info(entry, buf+e); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); + dev_put(dev); + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); return strlen(buf); } } - for(entry=priv->lec_arp_empty_ones; entry; - entry=entry->next) { - if (--count) continue; - e=sprintf(buf,"%s ",dev_lec[d]->name); + for(entry = priv->lec_arp_empty_ones; entry; entry = entry->next) { + if (--count) + continue; + e = sprintf(buf,"%s ", dev->name); lec_info(entry, buf+e); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); + dev_put(dev); + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); return strlen(buf); } - for(entry=priv->lec_no_forward; entry; - entry=entry->next) { - if (--count) continue; - e=sprintf(buf,"%s ",dev_lec[d]->name); + for(entry = priv->lec_no_forward; entry; entry=entry->next) { + if (--count) + continue; + e = sprintf(buf,"%s ", dev->name); lec_info(entry, buf+e); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); + dev_put(dev); + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); return strlen(buf); } - for(entry=priv->mcast_fwds; entry; - entry=entry->next) { - if (--count) continue; - e=sprintf(buf,"%s ",dev_lec[d]->name); + for(entry = priv->mcast_fwds; entry; entry = entry->next) { + if (--count) + continue; + e = sprintf(buf,"%s ", dev->name); lec_info(entry, buf+e); + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); + dev_put(dev); + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); return strlen(buf); } + spin_unlock_irqrestore(&priv->lec_arp_lock, flags); + dev_put(dev); } + if (atm_lane_ops->owner) + __MOD_DEC_USE_COUNT(atm_lane_ops->owner); return 0; } #endif diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/pvc.c linux-2.4.23-pre8/net/atm/pvc.c --- linux-2.4.22/net/atm/pvc.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/pvc.c 2003-10-22 22:48:22.000000000 +0000 @@ -18,10 +18,6 @@ #include "resources.h" /* devs and vccs */ #include "common.h" /* common for PVCs and SVCs */ -#ifndef NULL -#define NULL 0 -#endif - static int pvc_shutdown(struct socket *sock,int how) { @@ -32,20 +28,29 @@ static int pvc_bind(struct socket *sock,struct sockaddr *sockaddr, int sockaddr_len) { + struct sock *sk = sock->sk; struct sockaddr_atmpvc *addr; struct atm_vcc *vcc; + int error; if (sockaddr_len != sizeof(struct sockaddr_atmpvc)) return -EINVAL; addr = (struct sockaddr_atmpvc *) sockaddr; if (addr->sap_family != AF_ATMPVC) return -EAFNOSUPPORT; + lock_sock(sk); vcc = ATM_SD(sock); - if (!test_bit(ATM_VF_HASQOS,&vcc->flags)) return -EBADFD; + if (!test_bit(ATM_VF_HASQOS, &vcc->flags)) { + error = -EBADFD; + goto out; + } if (test_bit(ATM_VF_PARTIAL,&vcc->flags)) { if (vcc->vpi != ATM_VPI_UNSPEC) addr->sap_addr.vpi = vcc->vpi; if (vcc->vci != ATM_VCI_UNSPEC) addr->sap_addr.vci = vcc->vci; } - return atm_connect(sock,addr->sap_addr.itf,addr->sap_addr.vpi, - addr->sap_addr.vci); + error = vcc_connect(sock, addr->sap_addr.itf, addr->sap_addr.vpi, + addr->sap_addr.vci); +out: + release_sock(sk); + return error; } @@ -55,6 +60,31 @@ return pvc_bind(sock,sockaddr,sockaddr_len); } +static int pvc_setsockopt(struct socket *sock, int level, int optname, + char *optval, int optlen) +{ + struct sock *sk = sock->sk; + int error; + + lock_sock(sk); + error = vcc_setsockopt(sock, level, optname, optval, optlen); + release_sock(sk); + return error; +} + + +static int pvc_getsockopt(struct socket *sock, int level, int optname, + char *optval, int *optlen) +{ + struct sock *sk = sock->sk; + int error; + + lock_sock(sk); + error = vcc_getsockopt(sock, level, optname, optval, optlen); + release_sock(sk); + return error; +} + static int pvc_getname(struct socket *sock,struct sockaddr *sockaddr, int *sockaddr_len,int peer) @@ -73,36 +103,32 @@ } -static struct proto_ops SOCKOPS_WRAPPED(pvc_proto_ops) = { - family: PF_ATMPVC, +static struct proto_ops pvc_proto_ops = { + .family = PF_ATMPVC, - release: atm_release, - bind: pvc_bind, - connect: pvc_connect, - socketpair: sock_no_socketpair, - accept: sock_no_accept, - getname: pvc_getname, - poll: atm_poll, - ioctl: atm_ioctl, - listen: sock_no_listen, - shutdown: pvc_shutdown, - setsockopt: atm_setsockopt, - getsockopt: atm_getsockopt, - sendmsg: atm_sendmsg, - recvmsg: atm_recvmsg, - mmap: sock_no_mmap, - sendpage: sock_no_sendpage, + .release = vcc_release, + .bind = pvc_bind, + .connect = pvc_connect, + .socketpair = sock_no_socketpair, + .accept = sock_no_accept, + .getname = pvc_getname, + .poll = atm_poll, + .ioctl = vcc_ioctl, + .listen = sock_no_listen, + .shutdown = pvc_shutdown, + .setsockopt = pvc_setsockopt, + .getsockopt = pvc_getsockopt, + .sendmsg = vcc_sendmsg, + .recvmsg = vcc_recvmsg, + .mmap = sock_no_mmap, + .sendpage = sock_no_sendpage, }; -#include -SOCKOPS_WRAP(pvc_proto, PF_ATMPVC); - - static int pvc_create(struct socket *sock,int protocol) { sock->ops = &pvc_proto_ops; - return atm_create(sock,protocol,PF_ATMPVC); + return vcc_create(sock, protocol, PF_ATMPVC); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/resources.c linux-2.4.23-pre8/net/atm/resources.c --- linux-2.4.22/net/atm/resources.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/resources.c 2003-10-22 22:49:40.000000000 +0000 @@ -7,6 +7,7 @@ #include #include #include +#include #include /* for barrier */ #include #include @@ -15,11 +16,7 @@ #include "common.h" #include "resources.h" - - -#ifndef NULL -#define NULL 0 -#endif +#include "addr.h" LIST_HEAD(atm_devs); @@ -88,7 +85,7 @@ spin_lock(&atm_dev_lock); if (number != -1) { if ((inuse = __atm_dev_lookup(number))) { - atm_dev_release(inuse); + atm_dev_put(inuse); spin_unlock(&atm_dev_lock); __free_atm_dev(dev); return NULL; @@ -97,13 +94,11 @@ } else { dev->number = 0; while ((inuse = __atm_dev_lookup(dev->number))) { - atm_dev_release(inuse); + atm_dev_put(inuse); dev->number++; } } - dev->vccs = dev->last = NULL; - dev->dev_data = NULL; - barrier(); + dev->ops = ops; if (flags) dev->flags = *flags; @@ -138,7 +133,8 @@ unsigned long warning_time; #ifdef CONFIG_PROC_FS - if (dev->ops->proc_read) atm_proc_dev_deregister(dev); + if (dev->ops->proc_read) + atm_proc_dev_deregister(dev); #endif spin_lock(&atm_dev_lock); list_del(&dev->dev_list); @@ -172,76 +168,234 @@ } -/* Handler for sk->destruct, invoked by sk_free() */ -static void atm_free_sock(struct sock *sk) +static void copy_aal_stats(struct k_atm_aal_stats *from, + struct atm_aal_stats *to) { - kfree(sk->protinfo.af_atm); +#define __HANDLE_ITEM(i) to->i = atomic_read(&from->i) + __AAL_STAT_ITEMS +#undef __HANDLE_ITEM } -struct sock *alloc_atm_vcc_sk(int family) -{ - struct sock *sk; - struct atm_vcc *vcc; - sk = sk_alloc(family, GFP_KERNEL, 1); - if (!sk) - return NULL; - vcc = sk->protinfo.af_atm = kmalloc(sizeof(*vcc), GFP_KERNEL); - if (!vcc) { - sk_free(sk); - return NULL; - } - sock_init_data(NULL, sk); - sk->destruct = atm_free_sock; - memset(vcc, 0, sizeof(*vcc)); - vcc->sk = sk; - - return sk; +static void subtract_aal_stats(struct k_atm_aal_stats *from, + struct atm_aal_stats *to) +{ +#define __HANDLE_ITEM(i) atomic_sub(to->i, &from->i) + __AAL_STAT_ITEMS +#undef __HANDLE_ITEM } -static void unlink_vcc(struct atm_vcc *vcc) +static int fetch_stats(struct atm_dev *dev, struct atm_dev_stats *arg, int zero) { - unsigned long flags; - if (vcc->dev) { - spin_lock_irqsave(&vcc->dev->lock, flags); - if (vcc->prev) - vcc->prev->next = vcc->next; - else - vcc->dev->vccs = vcc->next; + struct atm_dev_stats tmp; + int error = 0; - if (vcc->next) - vcc->next->prev = vcc->prev; - else - vcc->dev->last = vcc->prev; - spin_unlock_irqrestore(&vcc->dev->lock, flags); + copy_aal_stats(&dev->stats.aal0, &tmp.aal0); + copy_aal_stats(&dev->stats.aal34, &tmp.aal34); + copy_aal_stats(&dev->stats.aal5, &tmp.aal5); + if (arg) + error = copy_to_user(arg, &tmp, sizeof(tmp)); + if (zero && !error) { + subtract_aal_stats(&dev->stats.aal0, &tmp.aal0); + subtract_aal_stats(&dev->stats.aal34, &tmp.aal34); + subtract_aal_stats(&dev->stats.aal5, &tmp.aal5); } + return error ? -EFAULT : 0; } - -void free_atm_vcc_sk(struct sock *sk) +int atm_dev_ioctl(unsigned int cmd, unsigned long arg) { - unlink_vcc(sk->protinfo.af_atm); - sk_free(sk); -} - + void *buf; + int error = 0, len, number, size = 0; + struct atm_dev *dev; -void bind_vcc(struct atm_vcc *vcc,struct atm_dev *dev) -{ - unsigned long flags; + if (cmd == ATM_GETNAMES) { + int *tmp_buf, *tmp_bufp; + struct list_head *p; + /* + * ATM_GETNAMES is a special case: it doesn't require a + * device number argument + */ + if (get_user(buf, &((struct atm_iobuf *) arg)->buffer)) + return -EFAULT; + if (get_user(len, &((struct atm_iobuf *) arg)->length)) + return -EFAULT; + spin_lock(&atm_dev_lock); + list_for_each(p, &atm_devs) + size += sizeof(int); + if (size > len) { + spin_unlock(&atm_dev_lock); + return -E2BIG; + } + tmp_buf = tmp_bufp = kmalloc(size, GFP_ATOMIC); + if (!tmp_buf) { + spin_unlock(&atm_dev_lock); + return -ENOMEM; + } + list_for_each(p, &atm_devs) { + dev = list_entry(p, struct atm_dev, dev_list); + *tmp_bufp++ = dev->number; + } + spin_unlock(&atm_dev_lock); + error = (copy_to_user(buf, tmp_buf, size) || + put_user(size, &((struct atm_iobuf *) arg)->length)) + ? -EFAULT : 0; + kfree(tmp_buf); + return error; + } - unlink_vcc(vcc); - vcc->dev = dev; - if (dev) { - spin_lock_irqsave(&dev->lock, flags); - vcc->next = NULL; - vcc->prev = dev->last; - if (dev->vccs) dev->last->next = vcc; - else dev->vccs = vcc; - dev->last = vcc; - spin_unlock_irqrestore(&dev->lock, flags); + if (get_user(buf, &((struct atmif_sioc *) arg)->arg)) + return -EFAULT; + if (get_user(len, &((struct atmif_sioc *) arg)->length)) + return -EFAULT; + if (get_user(number, &((struct atmif_sioc *) arg)->number)) + return -EFAULT; + + if (!(dev = atm_dev_lookup(number))) + return -ENODEV; + + switch (cmd) { + case ATM_GETTYPE: + size = strlen(dev->type) + 1; + if (copy_to_user(buf, dev->type, size)) { + error = -EFAULT; + goto done; + } + break; + case ATM_GETESI: + size = ESI_LEN; + if (copy_to_user(buf, dev->esi, size)) { + error = -EFAULT; + goto done; + } + break; + case ATM_SETESI: + { + int i; + + for (i = 0; i < ESI_LEN; i++) + if (dev->esi[i]) { + error = -EEXIST; + goto done; + } + } + /* fall through */ + case ATM_SETESIF: + { + unsigned char esi[ESI_LEN]; + + if (!capable(CAP_NET_ADMIN)) { + error = -EPERM; + goto done; + } + if (copy_from_user(esi, buf, ESI_LEN)) { + error = -EFAULT; + goto done; + } + memcpy(dev->esi, esi, ESI_LEN); + error = ESI_LEN; + goto done; + } + case ATM_GETSTATZ: + if (!capable(CAP_NET_ADMIN)) { + error = -EPERM; + goto done; + } + /* fall through */ + case ATM_GETSTAT: + size = sizeof(struct atm_dev_stats); + error = fetch_stats(dev, buf, cmd == ATM_GETSTATZ); + if (error) + goto done; + break; + case ATM_GETCIRANGE: + size = sizeof(struct atm_cirange); + if (copy_to_user(buf, &dev->ci_range, size)) { + error = -EFAULT; + goto done; + } + break; + case ATM_GETLINKRATE: + size = sizeof(int); + if (copy_to_user(buf, &dev->link_rate, size)) { + error = -EFAULT; + goto done; + } + break; + case ATM_RSTADDR: + if (!capable(CAP_NET_ADMIN)) { + error = -EPERM; + goto done; + } + atm_reset_addr(dev); + break; + case ATM_ADDADDR: + case ATM_DELADDR: + if (!capable(CAP_NET_ADMIN)) { + error = -EPERM; + goto done; + } + { + struct sockaddr_atmsvc addr; + + if (copy_from_user(&addr, buf, sizeof(addr))) { + error = -EFAULT; + goto done; + } + if (cmd == ATM_ADDADDR) + error = atm_add_addr(dev, &addr); + else + error = atm_del_addr(dev, &addr); + goto done; + } + case ATM_GETADDR: + error = atm_get_addr(dev, buf, len); + if (error < 0) + goto done; + size = error; + /* write back size even if it's zero */ + goto write_size; + case ATM_SETLOOP: + if (__ATM_LM_XTRMT((int) (long) buf) && + __ATM_LM_XTLOC((int) (long) buf) > + __ATM_LM_XTRMT((int) (long) buf)) { + error = -EINVAL; + goto done; + } + /* fall through */ + case ATM_SETCIRANGE: + case SONET_GETSTATZ: + case SONET_SETDIAG: + case SONET_CLRDIAG: + case SONET_SETFRAMING: + if (!capable(CAP_NET_ADMIN)) { + error = -EPERM; + goto done; + } + /* fall through */ + default: + if (!dev->ops->ioctl) { + error = -EINVAL; + goto done; + } + size = dev->ops->ioctl(dev, cmd, buf); + if (size < 0) { + error = (size == -ENOIOCTLCMD ? -EINVAL : size); + goto done; + } + } + + if (size) { +write_size: + error = put_user(size, + &((struct atmif_sioc *) arg)->length) + ? -EFAULT : 0; } +done: + atm_dev_put(dev); + return error; } @@ -249,4 +403,3 @@ EXPORT_SYMBOL(atm_dev_deregister); EXPORT_SYMBOL(atm_dev_lookup); EXPORT_SYMBOL(shutdown_atm_dev); -EXPORT_SYMBOL(bind_vcc); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/resources.h linux-2.4.23-pre8/net/atm/resources.h --- linux-2.4.22/net/atm/resources.h 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/resources.h 2003-10-22 22:49:18.000000000 +0000 @@ -14,8 +14,7 @@ extern spinlock_t atm_dev_lock; -struct sock *alloc_atm_vcc_sk(int family); -void free_atm_vcc_sk(struct sock *sk); +int atm_dev_ioctl(unsigned int cmd, unsigned long arg); #ifdef CONFIG_PROC_FS diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/signaling.c linux-2.4.23-pre8/net/atm/signaling.c --- linux-2.4.22/net/atm/signaling.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/signaling.c 2003-10-22 22:49:16.000000000 +0000 @@ -124,26 +124,31 @@ clear_bit(ATM_VF_REGIS,&vcc->flags); clear_bit(ATM_VF_READY,&vcc->flags); vcc->reply = msg->reply; + vcc->sk->err = -msg->reply; break; case as_indicate: vcc = *(struct atm_vcc **) &msg->listen_vcc; DPRINTK("as_indicate!!!\n"); - if (!vcc->backlog_quota) { + lock_sock(vcc->sk); + if (vcc->sk->ack_backlog == vcc->sk->max_ack_backlog) { sigd_enq(0,as_reject,vcc,NULL,NULL); - return 0; + goto as_indicate_complete; } - vcc->backlog_quota--; - skb_queue_tail(&vcc->listenq,skb); + vcc->sk->ack_backlog++; + skb_queue_tail(&vcc->sk->receive_queue,skb); if (vcc->callback) { DPRINTK("waking vcc->sleep 0x%p\n", &vcc->sleep); vcc->callback(vcc); } +as_indicate_complete: + release_sock(vcc->sk); return 0; case as_close: set_bit(ATM_VF_RELEASED,&vcc->flags); clear_bit(ATM_VF_READY,&vcc->flags); vcc->reply = msg->reply; + vcc->sk->err = -msg->reply; break; case as_modify: modify_qos(vcc,msg); @@ -194,25 +199,21 @@ } -static void purge_vccs(struct atm_vcc *vcc) +static void purge_vcc(struct atm_vcc *vcc) { - while (vcc) { - if (vcc->sk->family == PF_ATMSVC && - !test_bit(ATM_VF_META,&vcc->flags)) { - set_bit(ATM_VF_RELEASED,&vcc->flags); - vcc->reply = -EUNATCH; - wake_up(&vcc->sleep); - } - vcc = vcc->next; + if (vcc->sk->family == PF_ATMSVC && + !test_bit(ATM_VF_META, &vcc->flags)) { + set_bit(ATM_VF_RELEASED, &vcc->flags); + vcc->reply = -EUNATCH; + vcc->sk->err = EUNATCH; + wake_up(&vcc->sleep); } } static void sigd_close(struct atm_vcc *vcc) { - unsigned long flags; - struct atm_dev *dev; - struct list_head *p; + struct sock *s; DPRINTK("sigd_close\n"); sigd = NULL; @@ -220,14 +221,14 @@ printk(KERN_ERR "sigd_close: closing with requests pending\n"); skb_queue_purge(&vcc->sk->receive_queue); - spin_lock(&atm_dev_lock); - list_for_each(p, &atm_devs) { - dev = list_entry(p, struct atm_dev, dev_list); - spin_lock_irqsave(&dev->lock, flags); - purge_vccs(dev->vccs); - spin_unlock_irqrestore(&dev->lock, flags); + read_lock(&vcc_sklist_lock); + for(s = vcc_sklist; s; s = s->next) { + struct atm_vcc *vcc = s->protinfo.af_atm; + + if (vcc->dev) + purge_vcc(vcc); } - spin_unlock(&atm_dev_lock); + read_unlock(&vcc_sklist_lock); } @@ -250,7 +251,8 @@ if (sigd) return -EADDRINUSE; DPRINTK("sigd_attach\n"); sigd = vcc; - bind_vcc(vcc,&sigd_dev); + vcc->dev = &sigd_dev; + vcc_insert_socket(vcc->sk); set_bit(ATM_VF_META,&vcc->flags); set_bit(ATM_VF_READY,&vcc->flags); wake_up(&sigd_sleep); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/atm/svc.c linux-2.4.23-pre8/net/atm/svc.c --- linux-2.4.22/net/atm/svc.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/atm/svc.c 2003-10-22 22:49:09.000000000 +0000 @@ -75,7 +75,7 @@ } /* beware - socket is still in use by atmsigd until the last as_indicate has been answered */ - while ((skb = skb_dequeue(&vcc->listenq))) { + while ((skb = skb_dequeue(&vcc->sk->receive_queue))) { DPRINTK("LISTEN REL\n"); sigd_enq2(NULL,as_reject,vcc,NULL,NULL,&vcc->qos,0); dev_kfree_skb(skb); @@ -89,18 +89,21 @@ static int svc_release(struct socket *sock) { + struct sock *sk = sock->sk; struct atm_vcc *vcc; - if (!sock->sk) return 0; - vcc = ATM_SD(sock); - DPRINTK("svc_release %p\n",vcc); - clear_bit(ATM_VF_READY,&vcc->flags); - atm_release_vcc_sk(sock->sk,0); - svc_disconnect(vcc); - /* VCC pointer is used as a reference, so we must not free it - (thereby subjecting it to re-use) before all pending connections - are closed */ - free_atm_vcc_sk(sock->sk); + if (sk) { + vcc = ATM_SD(sock); + DPRINTK("svc_release %p\n", vcc); + clear_bit(ATM_VF_READY, &vcc->flags); + /* VCC pointer is used as a reference, so we must not free it + (thereby subjecting it to re-use) before all pending connections + are closed */ + sock_hold(sk); + vcc_release(sock); + svc_disconnect(vcc); + sock_put(sk); + } return 0; } @@ -109,20 +112,39 @@ int sockaddr_len) { DECLARE_WAITQUEUE(wait,current); + struct sock *sk = sock->sk; struct sockaddr_atmsvc *addr; struct atm_vcc *vcc; + int error; - if (sockaddr_len != sizeof(struct sockaddr_atmsvc)) return -EINVAL; - if (sock->state == SS_CONNECTED) return -EISCONN; - if (sock->state != SS_UNCONNECTED) return -EINVAL; + if (sockaddr_len != sizeof(struct sockaddr_atmsvc)) + return -EINVAL; + lock_sock(sk); + if (sock->state == SS_CONNECTED) { + error = -EISCONN; + goto out; + } + if (sock->state != SS_UNCONNECTED) { + error = -EINVAL; + goto out; + } vcc = ATM_SD(sock); - if (test_bit(ATM_VF_SESSION,&vcc->flags)) return -EINVAL; + if (test_bit(ATM_VF_SESSION, &vcc->flags)) { + error = -EINVAL; + goto out; + } addr = (struct sockaddr_atmsvc *) sockaddr; - if (addr->sas_family != AF_ATMSVC) return -EAFNOSUPPORT; + if (addr->sas_family != AF_ATMSVC) { + error = -EAFNOSUPPORT; + goto out; + } clear_bit(ATM_VF_BOUND,&vcc->flags); /* failing rebind will kill old binding */ /* @@@ check memory (de)allocation on rebind */ - if (!test_bit(ATM_VF_HASQOS,&vcc->flags)) return -EBADFD; + if (!test_bit(ATM_VF_HASQOS,&vcc->flags)) { + error = -EBADFD; + goto out; + } vcc->local = *addr; vcc->reply = WAITING; add_wait_queue(&vcc->sleep,&wait); @@ -133,9 +155,16 @@ } remove_wait_queue(&vcc->sleep,&wait); clear_bit(ATM_VF_REGIS,&vcc->flags); /* doesn't count */ - if (!sigd) return -EUNATCH; - if (!vcc->reply) set_bit(ATM_VF_BOUND,&vcc->flags); - return vcc->reply; + if (!sigd) { + error = -EUNATCH; + goto out; + } + if (!vcc->reply) + set_bit(ATM_VF_BOUND,&vcc->flags); + error = vcc->reply; +out: + release_sock(sk); + return error; } @@ -143,31 +172,60 @@ int sockaddr_len,int flags) { DECLARE_WAITQUEUE(wait,current); + struct sock *sk = sock->sk; struct sockaddr_atmsvc *addr; struct atm_vcc *vcc = ATM_SD(sock); int error; DPRINTK("svc_connect %p\n",vcc); - if (sockaddr_len != sizeof(struct sockaddr_atmsvc)) return -EINVAL; - if (sock->state == SS_CONNECTED) return -EISCONN; - if (sock->state == SS_CONNECTING) { - if (vcc->reply == WAITING) return -EALREADY; - sock->state = SS_UNCONNECTED; - if (vcc->reply) return vcc->reply; + lock_sock(sk); + if (sockaddr_len != sizeof(struct sockaddr_atmsvc)) { + error = -EINVAL; + goto out; } - else { - int error; - if (sock->state != SS_UNCONNECTED) return -EINVAL; - if (test_bit(ATM_VF_SESSION,&vcc->flags)) return -EINVAL; + switch (sock->state) { + default: + error = -EINVAL; + goto out; + case SS_CONNECTED: + error = -EISCONN; + goto out; + case SS_CONNECTING: + if (vcc->reply == WAITING) { + error = -EALREADY; + goto out; + } + sock->state = SS_UNCONNECTED; + if (vcc->reply) { + error = vcc->reply; + goto out; + } + break; + case SS_UNCONNECTED: + if (test_bit(ATM_VF_SESSION, &vcc->flags)) { + error = -EINVAL; + goto out; + } addr = (struct sockaddr_atmsvc *) sockaddr; - if (addr->sas_family != AF_ATMSVC) return -EAFNOSUPPORT; - if (!test_bit(ATM_VF_HASQOS,&vcc->flags)) return -EBADFD; + if (addr->sas_family != AF_ATMSVC) { + error = -EAFNOSUPPORT; + goto out; + } + if (!test_bit(ATM_VF_HASQOS, &vcc->flags)) { + error = -EBADFD; + goto out; + } if (vcc->qos.txtp.traffic_class == ATM_ANYCLASS || - vcc->qos.rxtp.traffic_class == ATM_ANYCLASS) - return -EINVAL; + vcc->qos.rxtp.traffic_class == ATM_ANYCLASS) { + error = -EINVAL; + goto out; + } if (!vcc->qos.txtp.traffic_class && - !vcc->qos.rxtp.traffic_class) return -EINVAL; + !vcc->qos.rxtp.traffic_class) { + error = -EINVAL; + goto out; + } vcc->remote = *addr; vcc->reply = WAITING; add_wait_queue(&vcc->sleep,&wait); @@ -175,7 +233,8 @@ if (flags & O_NONBLOCK) { remove_wait_queue(&vcc->sleep,&wait); sock->state = SS_CONNECTING; - return -EINPROGRESS; + error = -EINPROGRESS; + goto out; } error = 0; while (vcc->reply == WAITING && sigd) { @@ -214,9 +273,16 @@ break; } remove_wait_queue(&vcc->sleep,&wait); - if (error) return error; - if (!sigd) return -EUNATCH; - if (vcc->reply) return vcc->reply; + if (error) + goto out; + if (!sigd) { + error = -EUNATCH; + goto out; + } + if (vcc->reply) { + error = vcc->reply; + goto out; + } } /* * Not supported yet @@ -229,9 +295,11 @@ /* * #endif */ - if (!(error = atm_connect(sock,vcc->itf,vcc->vpi,vcc->vci))) + if (!(error = vcc_connect(sock, vcc->itf, vcc->vpi, vcc->vci))) sock->state = SS_CONNECTED; else (void) svc_disconnect(vcc); +out: + release_sock(sk); return error; } @@ -239,11 +307,17 @@ static int svc_listen(struct socket *sock,int backlog) { DECLARE_WAITQUEUE(wait,current); + struct sock *sk = sock->sk; struct atm_vcc *vcc = ATM_SD(sock); + int error; DPRINTK("svc_listen %p\n",vcc); + lock_sock(sk); /* let server handle listen on unbound sockets */ - if (test_bit(ATM_VF_SESSION,&vcc->flags)) return -EINVAL; + if (test_bit(ATM_VF_SESSION,&vcc->flags)) { + error = -EINVAL; + goto out; + } vcc->reply = WAITING; add_wait_queue(&vcc->sleep,&wait); sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local); @@ -252,24 +326,33 @@ schedule(); } remove_wait_queue(&vcc->sleep,&wait); - if (!sigd) return -EUNATCH; + if (!sigd) { + error = -EUNATCH; + goto out; + } set_bit(ATM_VF_LISTEN,&vcc->flags); - vcc->backlog_quota = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT; - return vcc->reply; + vcc->sk->max_ack_backlog = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT; + error = vcc->reply; +out: + release_sock(sk); + return error; } static int svc_accept(struct socket *sock,struct socket *newsock,int flags) { + struct sock *sk = sock->sk; struct sk_buff *skb; struct atmsvc_msg *msg; struct atm_vcc *old_vcc = ATM_SD(sock); struct atm_vcc *new_vcc; int error; + lock_sock(sk); + error = svc_create(newsock,0); if (error) - return error; + goto out; new_vcc = ATM_SD(newsock); @@ -278,7 +361,7 @@ DECLARE_WAITQUEUE(wait,current); add_wait_queue(&old_vcc->sleep,&wait); - while (!(skb = skb_dequeue(&old_vcc->listenq)) && sigd) { + while (!(skb = skb_dequeue(&old_vcc->sk->receive_queue)) && sigd) { if (test_bit(ATM_VF_RELEASED,&old_vcc->flags)) break; if (test_bit(ATM_VF_CLOSE,&old_vcc->flags)) { error = old_vcc->reply; @@ -288,30 +371,36 @@ error = -EAGAIN; break; } - set_current_state(TASK_INTERRUPTIBLE); + release_sock(sk); schedule(); + lock_sock(sk); if (signal_pending(current)) { error = -ERESTARTSYS; break; } } remove_wait_queue(&old_vcc->sleep,&wait); - if (error) return error; - if (!skb) return -EUNATCH; + if (error) + goto out; + if (!skb) { + error = -EUNATCH; + goto out; + } msg = (struct atmsvc_msg *) skb->data; new_vcc->qos = msg->qos; set_bit(ATM_VF_HASQOS,&new_vcc->flags); new_vcc->remote = msg->svc; new_vcc->local = msg->local; new_vcc->sap = msg->sap; - error = atm_connect(newsock,msg->pvc.sap_addr.itf, - msg->pvc.sap_addr.vpi,msg->pvc.sap_addr.vci); + error = vcc_connect(newsock, msg->pvc.sap_addr.itf, + msg->pvc.sap_addr.vpi, msg->pvc.sap_addr.vci); dev_kfree_skb(skb); - old_vcc->backlog_quota++; + old_vcc->sk->ack_backlog--; if (error) { sigd_enq2(NULL,as_reject,old_vcc,NULL,NULL, &old_vcc->qos,error); - return error == -EAGAIN ? -EBUSY : error; + error = error == -EAGAIN ? -EBUSY : error; + goto out; } /* wait should be short, so we ignore the non-blocking flag */ new_vcc->reply = WAITING; @@ -319,15 +408,25 @@ sigd_enq(new_vcc,as_accept,old_vcc,NULL,NULL); while (new_vcc->reply == WAITING && sigd) { set_current_state(TASK_UNINTERRUPTIBLE); + release_sock(sk); schedule(); + lock_sock(sk); } remove_wait_queue(&new_vcc->sleep,&wait); - if (!sigd) return -EUNATCH; + if (!sigd) { + error = -EUNATCH; + goto out; + } if (!new_vcc->reply) break; - if (new_vcc->reply != -ERESTARTSYS) return new_vcc->reply; + if (new_vcc->reply != -ERESTARTSYS) { + error = new_vcc->reply; + goto out; + } } newsock->state = SS_CONNECTED; - return 0; +out: + release_sock(sk); + return error; } @@ -365,63 +464,84 @@ static int svc_setsockopt(struct socket *sock,int level,int optname, char *optval,int optlen) { + struct sock *sk = sock->sk; struct atm_vcc *vcc; + int error = 0; if (!__SO_LEVEL_MATCH(optname, level) || optname != SO_ATMSAP || - optlen != sizeof(struct atm_sap)) - return atm_setsockopt(sock,level,optname,optval,optlen); + optlen != sizeof(struct atm_sap)) { + error = vcc_setsockopt(sock, level, optname, optval, optlen); + goto out; + } vcc = ATM_SD(sock); - if (copy_from_user(&vcc->sap,optval,optlen)) return -EFAULT; - set_bit(ATM_VF_HASSAP,&vcc->flags); - return 0; + if (copy_from_user(&vcc->sap, optval, optlen)) { + error = -EFAULT; + goto out; + } + set_bit(ATM_VF_HASSAP, &vcc->flags); +out: + release_sock(sk); + return error; } static int svc_getsockopt(struct socket *sock,int level,int optname, char *optval,int *optlen) { - int len; + struct sock *sk = sock->sk; + int error = 0, len; - if (!__SO_LEVEL_MATCH(optname, level) || optname != SO_ATMSAP) - return atm_getsockopt(sock,level,optname,optval,optlen); - if (get_user(len,optlen)) return -EFAULT; - if (len != sizeof(struct atm_sap)) return -EINVAL; - return copy_to_user(optval,&ATM_SD(sock)->sap,sizeof(struct atm_sap)) ? - -EFAULT : 0; + lock_sock(sk); + if (!__SO_LEVEL_MATCH(optname, level) || optname != SO_ATMSAP) { + error = vcc_getsockopt(sock, level, optname, optval, optlen); + goto out; + } + if (get_user(len, optlen)) { + error = -EFAULT; + goto out; + } + if (len != sizeof(struct atm_sap)) { + error = -EINVAL; + goto out; + } + if (copy_to_user(optval, &ATM_SD(sock)->sap, sizeof(struct atm_sap))) { + error = -EFAULT; + goto out; + } +out: + release_sock(sk); + return error; } -static struct proto_ops SOCKOPS_WRAPPED(svc_proto_ops) = { - family: PF_ATMSVC, - - release: svc_release, - bind: svc_bind, - connect: svc_connect, - socketpair: sock_no_socketpair, - accept: svc_accept, - getname: svc_getname, - poll: atm_poll, - ioctl: atm_ioctl, - listen: svc_listen, - shutdown: svc_shutdown, - setsockopt: svc_setsockopt, - getsockopt: svc_getsockopt, - sendmsg: atm_sendmsg, - recvmsg: atm_recvmsg, - mmap: sock_no_mmap, - sendpage: sock_no_sendpage, -}; +static struct proto_ops svc_proto_ops = { + .family = PF_ATMSVC, + .release = svc_release, + .bind = svc_bind, + .connect = svc_connect, + .socketpair = sock_no_socketpair, + .accept = svc_accept, + .getname = svc_getname, + .poll = atm_poll, + .ioctl = vcc_ioctl, + .listen = svc_listen, + .shutdown = svc_shutdown, + .setsockopt = svc_setsockopt, + .getsockopt = svc_getsockopt, + .sendmsg = vcc_sendmsg, + .recvmsg = vcc_recvmsg, + .mmap = sock_no_mmap, + .sendpage = sock_no_sendpage, +}; -#include -SOCKOPS_WRAP(svc_proto, PF_ATMSVC); static int svc_create(struct socket *sock,int protocol) { int error; sock->ops = &svc_proto_ops; - error = atm_create(sock,protocol,AF_ATMSVC); + error = vcc_create(sock, protocol, AF_ATMSVC); if (error) return error; ATM_SD(sock)->callback = svc_callback; ATM_SD(sock)->local.sas_family = AF_ATMSVC; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/bridge/br_forward.c linux-2.4.23-pre8/net/bridge/br_forward.c --- linux-2.4.22/net/bridge/br_forward.c 2002-08-03 00:39:46.000000000 +0000 +++ linux-2.4.23-pre8/net/bridge/br_forward.c 2003-10-22 22:48:24.000000000 +0000 @@ -59,6 +59,7 @@ indev = skb->dev; skb->dev = to->dev; + skb->ip_summed = CHECKSUM_NONE; NF_HOOK(PF_BRIDGE, NF_BR_FORWARD, skb, indev, skb->dev, __br_forward_finish); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/bridge/br_stp_bpdu.c linux-2.4.23-pre8/net/bridge/br_stp_bpdu.c --- linux-2.4.22/net/bridge/br_stp_bpdu.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/bridge/br_stp_bpdu.c 2003-10-22 22:49:17.000000000 +0000 @@ -194,6 +194,6 @@ } err: - kfree(skb); + kfree_skb(skb); return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/core/Makefile linux-2.4.23-pre8/net/core/Makefile --- linux-2.4.22/net/core/Makefile 2002-08-03 00:39:46.000000000 +0000 +++ linux-2.4.23-pre8/net/core/Makefile 2003-10-22 22:49:40.000000000 +0000 @@ -21,7 +21,8 @@ obj-$(CONFIG_FILTER) += filter.o -obj-$(CONFIG_NET) += dev.o dev_mcast.o dst.o neighbour.o rtnetlink.o utils.o +obj-$(CONFIG_NET) += dev.o ethtool.o dev_mcast.o dst.o neighbour.o \ + rtnetlink.o utils.o obj-$(CONFIG_NETFILTER) += netfilter.o obj-$(CONFIG_NET_DIVERT) += dv.o diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/core/dev.c linux-2.4.23-pre8/net/core/dev.c --- linux-2.4.22/net/core/dev.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/core/dev.c 2003-10-22 22:48:57.000000000 +0000 @@ -1539,10 +1539,10 @@ return ret; } -static int process_backlog(struct net_device *blog_dev, int *budget) +static int process_backlog(struct net_device *backlog_dev, int *budget) { int work = 0; - int quota = min(blog_dev->quota, *budget); + int quota = min(backlog_dev->quota, *budget); int this_cpu = smp_processor_id(); struct softnet_data *queue = &softnet_data[this_cpu]; unsigned long start_time = jiffies; @@ -1570,8 +1570,8 @@ #ifdef CONFIG_NET_HW_FLOWCONTROL if (queue->throttle && queue->input_pkt_queue.qlen < no_cong_thresh ) { + queue->throttle = 0; if (atomic_dec_and_test(&netdev_dropping)) { - queue->throttle = 0; netdev_wakeup(); break; } @@ -1579,16 +1579,17 @@ #endif } - blog_dev->quota -= work; + backlog_dev->quota -= work; *budget -= work; return -1; job_done: - blog_dev->quota -= work; + backlog_dev->quota -= work; *budget -= work; - list_del(&blog_dev->poll_list); - clear_bit(__LINK_STATE_RX_SCHED, &blog_dev->state); + list_del(&backlog_dev->poll_list); + smp_mb__before_clear_bit(); + netif_poll_enable(backlog_dev); if (queue->throttle) { queue->throttle = 0; @@ -2198,7 +2199,6 @@ cmd == SIOCBONDSLAVEINFOQUERY || cmd == SIOCBONDINFOQUERY || cmd == SIOCBONDCHANGEACTIVE || - cmd == SIOCETHTOOL || cmd == SIOCGMIIPHY || cmd == SIOCGMIIREG || cmd == SIOCSMIIREG || @@ -2294,6 +2294,20 @@ } return ret; + case SIOCETHTOOL: + dev_load(ifr.ifr_name); + rtnl_lock(); + ret = dev_ethtool(&ifr); + rtnl_unlock(); + if (!ret) { + if (colon) + *colon = ':'; + if (copy_to_user(arg, &ifr, + sizeof(struct ifreq))) + ret = -EFAULT; + } + return ret; + /* * These ioctl calls: * - require superuser power. @@ -2301,7 +2315,6 @@ * - return a value */ - case SIOCETHTOOL: case SIOCGMIIPHY: case SIOCGMIIREG: if (!capable(CAP_NET_ADMIN)) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/core/ethtool.c linux-2.4.23-pre8/net/core/ethtool.c --- linux-2.4.22/net/core/ethtool.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/core/ethtool.c 2003-10-22 22:47:27.000000000 +0000 @@ -0,0 +1,694 @@ +/* + * net/core/ethtool.c - Ethtool ioctl handler + * Copyright (c) 2003 Matthew Wilcox + * + * This file is where we call all the ethtool_ops commands to get + * the information ethtool needs. We fall back to calling do_ioctl() + * for drivers which haven't been converted to ethtool_ops yet. + * + * It's GPL, stupid. + */ + +#include +#include +#include +#include +#include + +/* + * Some useful ethtool_ops methods that're device independent. + * If we find that all drivers want to do the same thing here, + * we can turn these into dev_() function calls. + */ + +u32 ethtool_op_get_link(struct net_device *dev) +{ + return netif_carrier_ok(dev) ? 1 : 0; +} + +u32 ethtool_op_get_tx_csum(struct net_device *dev) +{ + return (dev->features & NETIF_F_IP_CSUM) != 0; +} + +int ethtool_op_set_tx_csum(struct net_device *dev, u32 data) +{ + if (data) + dev->features |= NETIF_F_IP_CSUM; + else + dev->features &= ~NETIF_F_IP_CSUM; + + return 0; +} + +u32 ethtool_op_get_sg(struct net_device *dev) +{ + return (dev->features & NETIF_F_SG) != 0; +} + +int ethtool_op_set_sg(struct net_device *dev, u32 data) +{ + if (data) + dev->features |= NETIF_F_SG; + else + dev->features &= ~NETIF_F_SG; + + return 0; +} + +/* Handlers for each ethtool command */ + +static int ethtool_get_settings(struct net_device *dev, void *useraddr) +{ + struct ethtool_cmd cmd = { ETHTOOL_GSET }; + int err; + + if (!dev->ethtool_ops->get_settings) + return -EOPNOTSUPP; + + err = dev->ethtool_ops->get_settings(dev, &cmd); + if (err < 0) + return err; + + if (copy_to_user(useraddr, &cmd, sizeof(cmd))) + return -EFAULT; + return 0; +} + +static int ethtool_set_settings(struct net_device *dev, void *useraddr) +{ + struct ethtool_cmd cmd; + + if (!dev->ethtool_ops->set_settings) + return -EOPNOTSUPP; + + if (copy_from_user(&cmd, useraddr, sizeof(cmd))) + return -EFAULT; + + return dev->ethtool_ops->set_settings(dev, &cmd); +} + +static int ethtool_get_drvinfo(struct net_device *dev, void *useraddr) +{ + struct ethtool_drvinfo info; + struct ethtool_ops *ops = dev->ethtool_ops; + + if (!ops->get_drvinfo) + return -EOPNOTSUPP; + + memset(&info, 0, sizeof(info)); + info.cmd = ETHTOOL_GDRVINFO; + ops->get_drvinfo(dev, &info); + + if (ops->self_test_count) + info.testinfo_len = ops->self_test_count(dev); + if (ops->get_stats_count) + info.n_stats = ops->get_stats_count(dev); + if (ops->get_regs_len) + info.regdump_len = ops->get_regs_len(dev); + if (ops->get_eeprom_len) + info.eedump_len = ops->get_eeprom_len(dev); + + if (copy_to_user(useraddr, &info, sizeof(info))) + return -EFAULT; + return 0; +} + +static int ethtool_get_regs(struct net_device *dev, char *useraddr) +{ + struct ethtool_regs regs; + struct ethtool_ops *ops = dev->ethtool_ops; + void *regbuf; + int reglen, ret; + + if (!ops->get_regs || !ops->get_regs_len) + return -EOPNOTSUPP; + + if (copy_from_user(®s, useraddr, sizeof(regs))) + return -EFAULT; + + reglen = ops->get_regs_len(dev); + if (regs.len > reglen) + regs.len = reglen; + + regbuf = kmalloc(reglen, GFP_USER); + if (!regbuf) + return -ENOMEM; + + ops->get_regs(dev, ®s, regbuf); + + ret = -EFAULT; + if (copy_to_user(useraddr, ®s, sizeof(regs))) + goto out; + useraddr += offsetof(struct ethtool_regs, data); + if (copy_to_user(useraddr, regbuf, reglen)) + goto out; + ret = 0; + + out: + kfree(regbuf); + return ret; +} + +static int ethtool_get_wol(struct net_device *dev, char *useraddr) +{ + struct ethtool_wolinfo wol = { ETHTOOL_GWOL }; + + if (!dev->ethtool_ops->get_wol) + return -EOPNOTSUPP; + + dev->ethtool_ops->get_wol(dev, &wol); + + if (copy_to_user(useraddr, &wol, sizeof(wol))) + return -EFAULT; + return 0; +} + +static int ethtool_set_wol(struct net_device *dev, char *useraddr) +{ + struct ethtool_wolinfo wol; + + if (!dev->ethtool_ops->set_wol) + return -EOPNOTSUPP; + + if (copy_from_user(&wol, useraddr, sizeof(wol))) + return -EFAULT; + + return dev->ethtool_ops->set_wol(dev, &wol); +} + +static int ethtool_get_msglevel(struct net_device *dev, char *useraddr) +{ + struct ethtool_value edata = { ETHTOOL_GMSGLVL }; + + if (!dev->ethtool_ops->get_msglevel) + return -EOPNOTSUPP; + + edata.data = dev->ethtool_ops->get_msglevel(dev); + + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; +} + +static int ethtool_set_msglevel(struct net_device *dev, char *useraddr) +{ + struct ethtool_value edata; + + if (!dev->ethtool_ops->set_msglevel) + return -EOPNOTSUPP; + + if (copy_from_user(&edata, useraddr, sizeof(edata))) + return -EFAULT; + + dev->ethtool_ops->set_msglevel(dev, edata.data); + return 0; +} + +static int ethtool_nway_reset(struct net_device *dev) +{ + if (!dev->ethtool_ops->nway_reset) + return -EOPNOTSUPP; + + return dev->ethtool_ops->nway_reset(dev); +} + +static int ethtool_get_link(struct net_device *dev, void *useraddr) +{ + struct ethtool_value edata = { ETHTOOL_GLINK }; + + if (!dev->ethtool_ops->get_link) + return -EOPNOTSUPP; + + edata.data = dev->ethtool_ops->get_link(dev); + + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; +} + +static int ethtool_get_eeprom(struct net_device *dev, void *useraddr) +{ + struct ethtool_eeprom eeprom; + struct ethtool_ops *ops = dev->ethtool_ops; + u8 *data; + int ret; + + if (!ops->get_eeprom || !ops->get_eeprom_len) + return -EOPNOTSUPP; + + if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) + return -EFAULT; + + /* Check for wrap and zero */ + if (eeprom.offset + eeprom.len <= eeprom.offset) + return -EINVAL; + + /* Check for exceeding total eeprom len */ + if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) + return -EINVAL; + + data = kmalloc(eeprom.len, GFP_USER); + if (!data) + return -ENOMEM; + + ret = -EFAULT; + if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) + goto out; + + ret = ops->get_eeprom(dev, &eeprom, data); + if (ret) + goto out; + + ret = -EFAULT; + if (copy_to_user(useraddr, &eeprom, sizeof(eeprom))) + goto out; + if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) + goto out; + ret = 0; + + out: + kfree(data); + return ret; +} + +static int ethtool_set_eeprom(struct net_device *dev, void *useraddr) +{ + struct ethtool_eeprom eeprom; + struct ethtool_ops *ops = dev->ethtool_ops; + u8 *data; + int ret; + + if (!ops->set_eeprom || !ops->get_eeprom_len) + return -EOPNOTSUPP; + + if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) + return -EFAULT; + + /* Check for wrap and zero */ + if (eeprom.offset + eeprom.len <= eeprom.offset) + return -EINVAL; + + /* Check for exceeding total eeprom len */ + if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) + return -EINVAL; + + data = kmalloc(eeprom.len, GFP_USER); + if (!data) + return -ENOMEM; + + ret = -EFAULT; + if (copy_from_user(data, useraddr + sizeof(eeprom), eeprom.len)) + goto out; + + ret = ops->set_eeprom(dev, &eeprom, data); + if (ret) + goto out; + + if (copy_to_user(useraddr + sizeof(eeprom), data, eeprom.len)) + ret = -EFAULT; + + out: + kfree(data); + return ret; +} + +static int ethtool_get_coalesce(struct net_device *dev, void *useraddr) +{ + struct ethtool_coalesce coalesce = { ETHTOOL_GCOALESCE }; + + if (!dev->ethtool_ops->get_coalesce) + return -EOPNOTSUPP; + + dev->ethtool_ops->get_coalesce(dev, &coalesce); + + if (copy_to_user(useraddr, &coalesce, sizeof(coalesce))) + return -EFAULT; + return 0; +} + +static int ethtool_set_coalesce(struct net_device *dev, void *useraddr) +{ + struct ethtool_coalesce coalesce; + + if (!dev->ethtool_ops->get_coalesce) + return -EOPNOTSUPP; + + if (copy_from_user(&coalesce, useraddr, sizeof(coalesce))) + return -EFAULT; + + return dev->ethtool_ops->set_coalesce(dev, &coalesce); +} + +static int ethtool_get_ringparam(struct net_device *dev, void *useraddr) +{ + struct ethtool_ringparam ringparam = { ETHTOOL_GRINGPARAM }; + + if (!dev->ethtool_ops->get_ringparam) + return -EOPNOTSUPP; + + dev->ethtool_ops->get_ringparam(dev, &ringparam); + + if (copy_to_user(useraddr, &ringparam, sizeof(ringparam))) + return -EFAULT; + return 0; +} + +static int ethtool_set_ringparam(struct net_device *dev, void *useraddr) +{ + struct ethtool_ringparam ringparam; + + if (!dev->ethtool_ops->get_ringparam) + return -EOPNOTSUPP; + + if (copy_from_user(&ringparam, useraddr, sizeof(ringparam))) + return -EFAULT; + + return dev->ethtool_ops->set_ringparam(dev, &ringparam); +} + +static int ethtool_get_pauseparam(struct net_device *dev, void *useraddr) +{ + struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM }; + + if (!dev->ethtool_ops->get_pauseparam) + return -EOPNOTSUPP; + + dev->ethtool_ops->get_pauseparam(dev, &pauseparam); + + if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam))) + return -EFAULT; + return 0; +} + +static int ethtool_set_pauseparam(struct net_device *dev, void *useraddr) +{ + struct ethtool_pauseparam pauseparam; + + if (!dev->ethtool_ops->get_pauseparam) + return -EOPNOTSUPP; + + if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam))) + return -EFAULT; + + return dev->ethtool_ops->set_pauseparam(dev, &pauseparam); +} + +static int ethtool_get_rx_csum(struct net_device *dev, char *useraddr) +{ + struct ethtool_value edata = { ETHTOOL_GRXCSUM }; + + if (!dev->ethtool_ops->get_rx_csum) + return -EOPNOTSUPP; + + edata.data = dev->ethtool_ops->get_rx_csum(dev); + + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; +} + +static int ethtool_set_rx_csum(struct net_device *dev, char *useraddr) +{ + struct ethtool_value edata; + + if (!dev->ethtool_ops->set_rx_csum) + return -EOPNOTSUPP; + + if (copy_from_user(&edata, useraddr, sizeof(edata))) + return -EFAULT; + + dev->ethtool_ops->set_rx_csum(dev, edata.data); + return 0; +} + +static int ethtool_get_tx_csum(struct net_device *dev, char *useraddr) +{ + struct ethtool_value edata = { ETHTOOL_GTXCSUM }; + + if (!dev->ethtool_ops->get_tx_csum) + return -EOPNOTSUPP; + + edata.data = dev->ethtool_ops->get_tx_csum(dev); + + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; +} + +static int ethtool_set_tx_csum(struct net_device *dev, char *useraddr) +{ + struct ethtool_value edata; + + if (!dev->ethtool_ops->set_tx_csum) + return -EOPNOTSUPP; + + if (copy_from_user(&edata, useraddr, sizeof(edata))) + return -EFAULT; + + return dev->ethtool_ops->set_tx_csum(dev, edata.data); +} + +static int ethtool_get_sg(struct net_device *dev, char *useraddr) +{ + struct ethtool_value edata = { ETHTOOL_GSG }; + + if (!dev->ethtool_ops->get_sg) + return -EOPNOTSUPP; + + edata.data = dev->ethtool_ops->get_sg(dev); + + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; +} + +static int ethtool_set_sg(struct net_device *dev, char *useraddr) +{ + struct ethtool_value edata; + + if (!dev->ethtool_ops->set_sg) + return -EOPNOTSUPP; + + if (copy_from_user(&edata, useraddr, sizeof(edata))) + return -EFAULT; + + return dev->ethtool_ops->set_sg(dev, edata.data); +} + +static int ethtool_self_test(struct net_device *dev, char *useraddr) +{ + struct ethtool_test test; + struct ethtool_ops *ops = dev->ethtool_ops; + u64 *data; + int ret; + + if (!ops->self_test || !ops->self_test_count) + return -EOPNOTSUPP; + + if (copy_from_user(&test, useraddr, sizeof(test))) + return -EFAULT; + + test.len = ops->self_test_count(dev); + data = kmalloc(test.len * sizeof(u64), GFP_USER); + if (!data) + return -ENOMEM; + + ops->self_test(dev, &test, data); + + ret = -EFAULT; + if (copy_to_user(useraddr, &test, sizeof(test))) + goto out; + useraddr += sizeof(test); + if (copy_to_user(useraddr, data, test.len * sizeof(u64))) + goto out; + ret = 0; + + out: + kfree(data); + return ret; +} + +static int ethtool_get_strings(struct net_device *dev, void *useraddr) +{ + struct ethtool_gstrings gstrings; + struct ethtool_ops *ops = dev->ethtool_ops; + u8 *data; + int ret; + + if (!ops->get_strings) + return -EOPNOTSUPP; + + if (copy_from_user(&gstrings, useraddr, sizeof(gstrings))) + return -EFAULT; + + switch (gstrings.string_set) { + case ETH_SS_TEST: + if (!ops->self_test_count) + return -EOPNOTSUPP; + gstrings.len = ops->self_test_count(dev); + break; + case ETH_SS_STATS: + if (!ops->get_stats_count) + return -EOPNOTSUPP; + gstrings.len = ops->get_stats_count(dev); + break; + default: + return -EINVAL; + } + + data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER); + if (!data) + return -ENOMEM; + + ops->get_strings(dev, gstrings.string_set, data); + + ret = -EFAULT; + if (copy_to_user(useraddr, &gstrings, sizeof(gstrings))) + goto out; + useraddr += sizeof(gstrings); + if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN)) + goto out; + ret = 0; + + out: + kfree(data); + return ret; +} + +static int ethtool_phys_id(struct net_device *dev, void *useraddr) +{ + struct ethtool_value id; + + if (!dev->ethtool_ops->phys_id) + return -EOPNOTSUPP; + + if (copy_from_user(&id, useraddr, sizeof(id))) + return -EFAULT; + + return dev->ethtool_ops->phys_id(dev, id.data); +} + +static int ethtool_get_stats(struct net_device *dev, void *useraddr) +{ + struct ethtool_stats stats; + struct ethtool_ops *ops = dev->ethtool_ops; + u64 *data; + int ret; + + if (!ops->get_ethtool_stats || !ops->get_stats_count) + return -EOPNOTSUPP; + + if (copy_from_user(&stats, useraddr, sizeof(stats))) + return -EFAULT; + + stats.n_stats = ops->get_stats_count(dev); + data = kmalloc(stats.n_stats * sizeof(u64), GFP_USER); + if (!data) + return -ENOMEM; + + ops->get_ethtool_stats(dev, &stats, data); + + ret = -EFAULT; + if (copy_to_user(useraddr, &stats, sizeof(stats))) + goto out; + useraddr += sizeof(stats); + if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64))) + goto out; + ret = 0; + + out: + kfree(data); + return ret; +} + +/* The main entry point in this file. Called from net/core/dev.c */ + +int dev_ethtool(struct ifreq *ifr) +{ + struct net_device *dev = __dev_get_by_name(ifr->ifr_name); + void *useraddr = (void *) ifr->ifr_data; + u32 ethcmd; + + /* + * XXX: This can be pushed down into the ethtool_* handlers that + * need it. Keep existing behaviour for the moment. + */ + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (!dev || !netif_device_present(dev)) + return -ENODEV; + + if (!dev->ethtool_ops) + goto ioctl; + + if (copy_from_user(ðcmd, useraddr, sizeof (ethcmd))) + return -EFAULT; + + switch (ethcmd) { + case ETHTOOL_GSET: + return ethtool_get_settings(dev, useraddr); + case ETHTOOL_SSET: + return ethtool_set_settings(dev, useraddr); + case ETHTOOL_GDRVINFO: + return ethtool_get_drvinfo(dev, useraddr); + case ETHTOOL_GREGS: + return ethtool_get_regs(dev, useraddr); + case ETHTOOL_GWOL: + return ethtool_get_wol(dev, useraddr); + case ETHTOOL_SWOL: + return ethtool_set_wol(dev, useraddr); + case ETHTOOL_GMSGLVL: + return ethtool_get_msglevel(dev, useraddr); + case ETHTOOL_SMSGLVL: + return ethtool_set_msglevel(dev, useraddr); + case ETHTOOL_NWAY_RST: + return ethtool_nway_reset(dev); + case ETHTOOL_GLINK: + return ethtool_get_link(dev, useraddr); + case ETHTOOL_GEEPROM: + return ethtool_get_eeprom(dev, useraddr); + case ETHTOOL_SEEPROM: + return ethtool_set_eeprom(dev, useraddr); + case ETHTOOL_GCOALESCE: + return ethtool_get_coalesce(dev, useraddr); + case ETHTOOL_SCOALESCE: + return ethtool_set_coalesce(dev, useraddr); + case ETHTOOL_GRINGPARAM: + return ethtool_get_ringparam(dev, useraddr); + case ETHTOOL_SRINGPARAM: + return ethtool_set_ringparam(dev, useraddr); + case ETHTOOL_GPAUSEPARAM: + return ethtool_get_pauseparam(dev, useraddr); + case ETHTOOL_SPAUSEPARAM: + return ethtool_set_pauseparam(dev, useraddr); + case ETHTOOL_GRXCSUM: + return ethtool_get_rx_csum(dev, useraddr); + case ETHTOOL_SRXCSUM: + return ethtool_set_rx_csum(dev, useraddr); + case ETHTOOL_GTXCSUM: + return ethtool_get_tx_csum(dev, useraddr); + case ETHTOOL_STXCSUM: + return ethtool_set_tx_csum(dev, useraddr); + case ETHTOOL_GSG: + return ethtool_get_sg(dev, useraddr); + case ETHTOOL_SSG: + return ethtool_set_sg(dev, useraddr); + case ETHTOOL_TEST: + return ethtool_self_test(dev, useraddr); + case ETHTOOL_GSTRINGS: + return ethtool_get_strings(dev, useraddr); + case ETHTOOL_PHYS_ID: + return ethtool_phys_id(dev, useraddr); + case ETHTOOL_GSTATS: + return ethtool_get_stats(dev, useraddr); + default: + return -EOPNOTSUPP; + } + + ioctl: + if (dev->do_ioctl) + return dev->do_ioctl(dev, ifr, SIOCETHTOOL); + return -EOPNOTSUPP; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/core/neighbour.c linux-2.4.23-pre8/net/core/neighbour.c --- linux-2.4.22/net/core/neighbour.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/core/neighbour.c 2003-10-22 22:47:37.000000000 +0000 @@ -50,6 +50,7 @@ static void neigh_app_notify(struct neighbour *n); #endif static int pneigh_ifdown(struct neigh_table *tbl, struct net_device *dev); +void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev); static int neigh_glbl_allocs; static struct neigh_table *neigh_tables; @@ -169,6 +170,33 @@ } } +void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev) +{ + int i; + + write_lock_bh(&tbl->lock); + + for (i=0; i <= NEIGH_HASHMASK; i++) { + struct neighbour *n, **np; + + np = &tbl->hash_buckets[i]; + while ((n = *np) != NULL) { + if (dev && n->dev != dev) { + np = &n->next; + continue; + } + *np = n->next; + write_lock_bh(&n->lock); + n->dead = 1; + neigh_del_timer(n); + write_unlock_bh(&n->lock); + neigh_release(n); + } + } + + write_unlock_bh(&tbl->lock); +} + int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev) { int i; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/core/pktgen.c linux-2.4.23-pre8/net/core/pktgen.c --- linux-2.4.22/net/core/pktgen.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/net/core/pktgen.c 2003-10-22 22:47:44.000000000 +0000 @@ -46,6 +46,9 @@ * Also moved to /proc/net/pktgen/ * --ro * + * Fix refcount off by one if first packet fails, potential null deref, + * memleak 030710- KJP + * * See Documentation/networking/pktgen.txt for how to use this. */ @@ -84,9 +87,9 @@ #define cycles() ((u32)get_cycles()) -#define VERSION "pktgen version 1.2" +#define VERSION "pktgen version 1.3" static char version[] __initdata = - "pktgen.c: v1.2: Packet Generator for packet performance testing.\n"; + "pktgen.c: v1.3: Packet Generator for packet performance testing.\n"; /* Used to help with determining the pkts on receive */ @@ -613,12 +616,11 @@ kfree_skb(skb); skb = fill_packet(odev, info); if (skb == NULL) { - break; + goto out_reldev; } fp++; fp_tmp = 0; /* reset counter */ } - atomic_inc(&skb->users); } nr_frags = skb_shinfo(skb)->nr_frags; @@ -626,7 +628,11 @@ spin_lock_bh(&odev->xmit_lock); if (!netif_queue_stopped(odev)) { + atomic_inc(&skb->users); + if (odev->hard_start_xmit(skb, odev)) { + + atomic_dec(&skb->users); if (net_ratelimit()) { printk(KERN_INFO "Hard xmit error\n"); } @@ -731,15 +737,15 @@ (unsigned long long) info->errors ); } - + + kfree_skb(skb); + out_reldev: if (odev) { dev_put(odev); odev = NULL; } - /* TODO: Is this worth printing out (other than for debug?) */ - printk("fp = %llu\n", (unsigned long long) fp); return; } @@ -955,7 +961,8 @@ if (len < 0) return len; memset(name, 0, sizeof(name)); - copy_from_user(name, &user_buffer[i], len); + if (copy_from_user(name, &user_buffer[i], len)) + return -EFAULT; i += len; max = count -i; @@ -1085,18 +1092,20 @@ if (len < 0) return len; memset(info->outdev, 0, sizeof(info->outdev)); - copy_from_user(info->outdev, &user_buffer[i], len); + if (copy_from_user(info->outdev, &user_buffer[i], len)) + return -EFAULT; i += len; sprintf(result, "OK: odev=%s", info->outdev); return count; } if (!strcmp(name, "flag")) { char f[32]; - memset(f, 0, 32); len = strn_len(&user_buffer[i], sizeof(f) - 1); if (len < 0) return len; - copy_from_user(f, &user_buffer[i], len); + memset(f, 0, 32); + if (copy_from_user(f, &user_buffer[i], len)) + return -EFAULT; i += len; if (strcmp(f, "IPSRC_RND") == 0) { info->flags |= F_IPSRC_RND; @@ -1148,7 +1157,8 @@ if (len < 0) return len; memset(info->dst_min, 0, sizeof(info->dst_min)); - copy_from_user(info->dst_min, &user_buffer[i], len); + if (copy_from_user(info->dst_min, &user_buffer[i], len)) + return -EFAULT; if(debug) printk("pg: dst_min set to: %s\n", info->dst_min); i += len; @@ -1160,7 +1170,8 @@ if (len < 0) return len; memset(info->dst_max, 0, sizeof(info->dst_max)); - copy_from_user(info->dst_max, &user_buffer[i], len); + if (copy_from_user(info->dst_max, &user_buffer[i], len)) + return -EFAULT; if(debug) printk("pg: dst_max set to: %s\n", info->dst_max); i += len; @@ -1172,7 +1183,8 @@ if (len < 0) return len; memset(info->src_min, 0, sizeof(info->src_min)); - copy_from_user(info->src_min, &user_buffer[i], len); + if (copy_from_user(info->src_min, &user_buffer[i], len)) + return -EFAULT; if(debug) printk("pg: src_min set to: %s\n", info->src_min); i += len; @@ -1184,7 +1196,8 @@ if (len < 0) return len; memset(info->src_max, 0, sizeof(info->src_max)); - copy_from_user(info->src_max, &user_buffer[i], len); + if (copy_from_user(info->src_max, &user_buffer[i], len)) + return -EFAULT; if(debug) printk("pg: src_max set to: %s\n", info->src_max); i += len; @@ -1199,7 +1212,8 @@ if (len < 0) return len; memset(valstr, 0, sizeof(valstr)); - copy_from_user(valstr, &user_buffer[i], len); + if (copy_from_user(valstr, &user_buffer[i], len)) + return -EFAULT; i += len; for(*m = 0;*v && m < info->dst_mac + 6; v++) { @@ -1231,7 +1245,8 @@ if (len < 0) return len; memset(valstr, 0, sizeof(valstr)); - copy_from_user(valstr, &user_buffer[i], len); + if (copy_from_user(valstr, &user_buffer[i], len)) + return -EFAULT; i += len; for(*m = 0;*v && m < info->src_mac + 6; v++) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/core/sysctl_net_core.c linux-2.4.23-pre8/net/core/sysctl_net_core.c --- linux-2.4.22/net/core/sysctl_net_core.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/net/core/sysctl_net_core.c 2003-10-22 22:48:30.000000000 +0000 @@ -55,7 +55,7 @@ &netdev_max_backlog, sizeof(int), 0644, NULL, &proc_dointvec}, {NET_CORE_NO_CONG_THRESH, "no_cong_thresh", - &no_cong, sizeof(int), 0644, NULL, + &no_cong_thresh, sizeof(int), 0644, NULL, &proc_dointvec}, {NET_CORE_NO_CONG, "no_cong", &no_cong, sizeof(int), 0644, NULL, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/core/wireless.c linux-2.4.23-pre8/net/core/wireless.c --- linux-2.4.22/net/core/wireless.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/core/wireless.c 2003-10-22 22:47:57.000000000 +0000 @@ -2,7 +2,7 @@ * This file implement the Wireless Extensions APIs. * * Authors : Jean Tourrilhes - HPL - - * Copyright (c) 1997-2002 Jean Tourrilhes, All Rights Reserved. + * Copyright (c) 1997-2003 Jean Tourrilhes, All Rights Reserved. * * (As all part of the Linux kernel, this file is GPL) */ @@ -43,6 +43,11 @@ * o Turn on WE_STRICT_WRITE by default + kernel warning * o Fix WE_STRICT_WRITE in ioctl_export_private() (32 => iw_num) * o Fix off-by-one in test (extra_size <= IFNAMSIZ) + * + * v6 - 9.01.03 - Jean II + * o Add common spy support : iw_handler_set_spy(), wireless_spy_update() + * o Add enhanced spy support : iw_handler_set_thrspy() and event. + * o Add WIRELESS_EXT version display in /proc/net/wireless */ /***************************** INCLUDES *****************************/ @@ -52,6 +57,7 @@ #include /* off_t */ #include /* struct ifreq, dev_get_by_name() */ #include /* rtnetlink stuff */ +#include /* ARPHRD_ETHER */ #include /* Pretty obvious */ #include /* New driver API */ @@ -65,6 +71,7 @@ /* Debuging stuff */ #undef WE_IOCTL_DEBUG /* Debug IOCTL API */ #undef WE_EVENT_DEBUG /* Debug Event dispatcher */ +#undef WE_SPY_DEBUG /* Debug enhanced spy support */ /* Options */ #define WE_EVENT_NETLINK /* Propagate events using rtnetlink */ @@ -72,7 +79,7 @@ /************************* GLOBAL VARIABLES *************************/ /* - * You should not use global variables, because or re-entrancy. + * You should not use global variables, because of re-entrancy. * On our case, it's only const, so it's OK... */ /* @@ -115,11 +122,11 @@ /* SIOCSIWSPY */ { IW_HEADER_TYPE_POINT, 0, sizeof(struct sockaddr), 0, IW_MAX_SPY, 0}, /* SIOCGIWSPY */ - { IW_HEADER_TYPE_POINT, 0, (sizeof(struct sockaddr) + sizeof(struct iw_quality)), 0, IW_MAX_GET_SPY, 0}, - /* -- hole -- */ - { IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0}, - /* -- hole -- */ - { IW_HEADER_TYPE_NULL, 0, 0, 0, 0, 0}, + { IW_HEADER_TYPE_POINT, 0, (sizeof(struct sockaddr) + sizeof(struct iw_quality)), 0, IW_MAX_SPY, 0}, + /* SIOCSIWTHRSPY */ + { IW_HEADER_TYPE_POINT, 0, sizeof(struct iw_thrspy), 1, 1, 0}, + /* SIOCGIWTHRSPY */ + { IW_HEADER_TYPE_POINT, 0, sizeof(struct iw_thrspy), 1, 1, 0}, /* SIOCSIWAP */ { IW_HEADER_TYPE_ADDR, 0, 0, 0, 0, 0}, /* SIOCGIWAP */ @@ -377,9 +384,9 @@ struct net_device * dev; size = sprintf(buffer, - "Inter-| sta-| Quality | Discarded packets | Missed\n" - " face | tus | link level noise | nwid crypt frag retry misc | beacon\n" - ); + "Inter-| sta-| Quality | Discarded packets | Missed | WE\n" + " face | tus | link level noise | nwid crypt frag retry misc | beacon | %d\n", + WIRELESS_EXT); pos += size; len += size; @@ -1024,3 +1031,252 @@ return; /* Always success, I guess ;-) */ } + +/********************** ENHANCED IWSPY SUPPORT **********************/ +/* + * In the old days, the driver was handling spy support all by itself. + * Now, the driver can delegate this task to Wireless Extensions. + * It needs to use those standard spy iw_handler in struct iw_handler_def, + * push data to us via XXX and include struct iw_spy_data in its + * private part. + * One of the main advantage of centralising spy support here is that + * it becomes much easier to improve and extend it without having to touch + * the drivers. One example is the addition of the Spy-Threshold events. + * Note : IW_WIRELESS_SPY is defined in iw_handler.h + */ + +/*------------------------------------------------------------------*/ +/* + * Standard Wireless Handler : set Spy List + */ +int iw_handler_set_spy(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra) +{ +#ifdef IW_WIRELESS_SPY + struct iw_spy_data * spydata = (dev->priv + + dev->wireless_handlers->spy_offset); + struct sockaddr * address = (struct sockaddr *) extra; + + /* Disable spy collection while we copy the addresses. + * As we don't disable interrupts, we need to do this to avoid races. + * As we are the only writer, this is good enough. */ + spydata->spy_number = 0; + + /* Are there are addresses to copy? */ + if(wrqu->data.length > 0) { + int i; + + /* Copy addresses */ + for(i = 0; i < wrqu->data.length; i++) + memcpy(spydata->spy_address[i], address[i].sa_data, + ETH_ALEN); + /* Reset stats */ + memset(spydata->spy_stat, 0, + sizeof(struct iw_quality) * IW_MAX_SPY); + +#ifdef WE_SPY_DEBUG + printk(KERN_DEBUG "iw_handler_set_spy() : offset %ld, spydata %p, num %d\n", dev->wireless_handlers->spy_offset, spydata, wrqu->data.length); + for (i = 0; i < wrqu->data.length; i++) + printk(KERN_DEBUG + "%02X:%02X:%02X:%02X:%02X:%02X \n", + spydata->spy_address[i][0], + spydata->spy_address[i][1], + spydata->spy_address[i][2], + spydata->spy_address[i][3], + spydata->spy_address[i][4], + spydata->spy_address[i][5]); +#endif /* WE_SPY_DEBUG */ + } + /* Enable addresses */ + spydata->spy_number = wrqu->data.length; + + return 0; +#else /* IW_WIRELESS_SPY */ + return -EOPNOTSUPP; +#endif /* IW_WIRELESS_SPY */ +} + +/*------------------------------------------------------------------*/ +/* + * Standard Wireless Handler : get Spy List + */ +int iw_handler_get_spy(struct net_device * dev, + struct iw_request_info * info, + union iwreq_data * wrqu, + char * extra) +{ +#ifdef IW_WIRELESS_SPY + struct iw_spy_data * spydata = (dev->priv + + dev->wireless_handlers->spy_offset); + struct sockaddr * address = (struct sockaddr *) extra; + int i; + + wrqu->data.length = spydata->spy_number; + + /* Copy addresses. */ + for(i = 0; i < spydata->spy_number; i++) { + memcpy(address[i].sa_data, spydata->spy_address[i], ETH_ALEN); + address[i].sa_family = AF_UNIX; + } + /* Copy stats to the user buffer (just after). */ + if(spydata->spy_number > 0) + memcpy(extra + (sizeof(struct sockaddr) *spydata->spy_number), + spydata->spy_stat, + sizeof(struct iw_quality) * spydata->spy_number); + /* Reset updated flags. */ + for(i = 0; i < spydata->spy_number; i++) + spydata->spy_stat[i].updated = 0; + return 0; +#else /* IW_WIRELESS_SPY */ + return -EOPNOTSUPP; +#endif /* IW_WIRELESS_SPY */ +} + +/*------------------------------------------------------------------*/ +/* + * Standard Wireless Handler : set spy threshold + */ +int iw_handler_set_thrspy(struct net_device * dev, + struct iw_request_info *info, + union iwreq_data * wrqu, + char * extra) +{ +#ifdef IW_WIRELESS_THRSPY + struct iw_spy_data * spydata = (dev->priv + + dev->wireless_handlers->spy_offset); + struct iw_thrspy * threshold = (struct iw_thrspy *) extra; + + /* Just do it */ + memcpy(&(spydata->spy_thr_low), &(threshold->low), + 2 * sizeof(struct iw_quality)); + + /* Clear flag */ + memset(spydata->spy_thr_under, '\0', sizeof(spydata->spy_thr_under)); + +#ifdef WE_SPY_DEBUG + printk(KERN_DEBUG "iw_handler_set_thrspy() : low %d ; high %d\n", spydata->spy_thr_low.level, spydata->spy_thr_high.level); +#endif /* WE_SPY_DEBUG */ + + return 0; +#else /* IW_WIRELESS_THRSPY */ + return -EOPNOTSUPP; +#endif /* IW_WIRELESS_THRSPY */ +} + +/*------------------------------------------------------------------*/ +/* + * Standard Wireless Handler : get spy threshold + */ +int iw_handler_get_thrspy(struct net_device * dev, + struct iw_request_info *info, + union iwreq_data * wrqu, + char * extra) +{ +#ifdef IW_WIRELESS_THRSPY + struct iw_spy_data * spydata = (dev->priv + + dev->wireless_handlers->spy_offset); + struct iw_thrspy * threshold = (struct iw_thrspy *) extra; + + /* Just do it */ + memcpy(&(threshold->low), &(spydata->spy_thr_low), + 2 * sizeof(struct iw_quality)); + + return 0; +#else /* IW_WIRELESS_THRSPY */ + return -EOPNOTSUPP; +#endif /* IW_WIRELESS_THRSPY */ +} + +#ifdef IW_WIRELESS_THRSPY +/*------------------------------------------------------------------*/ +/* + * Prepare and send a Spy Threshold event + */ +static void iw_send_thrspy_event(struct net_device * dev, + struct iw_spy_data * spydata, + unsigned char * address, + struct iw_quality * wstats) +{ + union iwreq_data wrqu; + struct iw_thrspy threshold; + + /* Init */ + wrqu.data.length = 1; + wrqu.data.flags = 0; + /* Copy address */ + memcpy(threshold.addr.sa_data, address, ETH_ALEN); + threshold.addr.sa_family = ARPHRD_ETHER; + /* Copy stats */ + memcpy(&(threshold.qual), wstats, sizeof(struct iw_quality)); + /* Copy also thresholds */ + memcpy(&(threshold.low), &(spydata->spy_thr_low), + 2 * sizeof(struct iw_quality)); + +#ifdef WE_SPY_DEBUG + printk(KERN_DEBUG "iw_send_thrspy_event() : address %02X:%02X:%02X:%02X:%02X:%02X, level %d, up = %d\n", + threshold.addr.sa_data[0], + threshold.addr.sa_data[1], + threshold.addr.sa_data[2], + threshold.addr.sa_data[3], + threshold.addr.sa_data[4], + threshold.addr.sa_data[5], threshold.qual.level); +#endif /* WE_SPY_DEBUG */ + + /* Send event to user space */ + wireless_send_event(dev, SIOCGIWTHRSPY, &wrqu, (char *) &threshold); +} +#endif /* IW_WIRELESS_THRSPY */ + +/* ---------------------------------------------------------------- */ +/* + * Call for the driver to update the spy data. + * For now, the spy data is a simple array. As the size of the array is + * small, this is good enough. If we wanted to support larger number of + * spy addresses, we should use something more efficient... + */ +void wireless_spy_update(struct net_device * dev, + unsigned char * address, + struct iw_quality * wstats) +{ +#ifdef IW_WIRELESS_SPY + struct iw_spy_data * spydata = (dev->priv + + dev->wireless_handlers->spy_offset); + int i; + int match = -1; + +#ifdef WE_SPY_DEBUG + printk(KERN_DEBUG "wireless_spy_update() : offset %ld, spydata %p, address %02X:%02X:%02X:%02X:%02X:%02X\n", dev->wireless_handlers->spy_offset, spydata, address[0], address[1], address[2], address[3], address[4], address[5]); +#endif /* WE_SPY_DEBUG */ + + /* Update all records that match */ + for(i = 0; i < spydata->spy_number; i++) + if(!memcmp(address, spydata->spy_address[i], ETH_ALEN)) { + memcpy(&(spydata->spy_stat[i]), wstats, + sizeof(struct iw_quality)); + match = i; + } +#ifdef IW_WIRELESS_THRSPY + /* Generate an event if we cross the spy threshold. + * To avoid event storms, we have a simple hysteresis : we generate + * event only when we go under the low threshold or above the + * high threshold. */ + if(match >= 0) { + if(spydata->spy_thr_under[match]) { + if(wstats->level > spydata->spy_thr_high.level) { + spydata->spy_thr_under[match] = 0; + iw_send_thrspy_event(dev, spydata, + address, wstats); + } + } else { + if(wstats->level < spydata->spy_thr_low.level) { + spydata->spy_thr_under[match] = 1; + iw_send_thrspy_event(dev, spydata, + address, wstats); + } + } + } +#endif /* IW_WIRELESS_THRSPY */ +#endif /* IW_WIRELESS_SPY */ +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/Config.in linux-2.4.23-pre8/net/ipv4/Config.in --- linux-2.4.22/net/ipv4/Config.in 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/Config.in 2003-10-22 22:47:41.000000000 +0000 @@ -43,3 +43,6 @@ if [ "$CONFIG_NETFILTER" != "n" ]; then source net/ipv4/netfilter/Config.in fi +if [ "$CONFIG_NETFILTER" != "n" ]; then + source net/ipv4/ipvs/Config.in +fi diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/af_inet.c linux-2.4.23-pre8/net/ipv4/af_inet.c --- linux-2.4.22/net/ipv4/af_inet.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/af_inet.c 2003-10-22 22:47:49.000000000 +0000 @@ -470,7 +470,7 @@ /* It is off by default, see below. */ int sysctl_ip_nonlocal_bind; -static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) +int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) { struct sockaddr_in *addr=(struct sockaddr_in *)uaddr; struct sock *sk=sock->sk; @@ -703,7 +703,7 @@ * This does both peername and sockname. */ -static int inet_getname(struct socket *sock, struct sockaddr *uaddr, +int inet_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer) { struct sock *sk = sock->sk; @@ -820,7 +820,7 @@ * There's a good 20K of config code hanging around the kernel. */ -static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) +int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) { struct sock *sk = sock->sk; int err; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/arp.c linux-2.4.23-pre8/net/ipv4/arp.c --- linux-2.4.22/net/ipv4/arp.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/arp.c 2003-10-22 22:49:22.000000000 +0000 @@ -852,8 +852,15 @@ int arp_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) { - struct arphdr *arp = skb->nh.arph; + struct arphdr *arp; + /* ARP header, plus 2 device addresses, plus 2 IP addresses. */ + if (!pskb_may_pull(skb, (sizeof(struct arphdr) + + (2 * dev->addr_len) + + (2 * sizeof(u32))))) + goto freeskb; + + arp = skb->nh.arph; if (arp->ar_hln != dev->addr_len || dev->flags & IFF_NOARP || skb->pkt_type == PACKET_OTHERHOST || @@ -864,11 +871,6 @@ if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) goto out_of_mem; - if (skb_is_nonlinear(skb)) { - if (skb_linearize(skb, GFP_ATOMIC) != 0) - goto freeskb; - } - return NF_HOOK(NF_ARP, NF_ARP_IN, skb, dev, NULL, arp_process); freeskb: @@ -1212,6 +1214,26 @@ } #endif +static int arp_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) +{ + struct net_device *dev = ptr; + + switch (event) { + case NETDEV_CHANGEADDR: + neigh_changeaddr(&arp_tbl, dev); + rt_cache_flush(0); + break; + default: + break; + } + + return NOTIFY_DONE; +} + +struct notifier_block arp_netdev_notifier = { + .notifier_call = arp_netdev_event, +}; + /* Note, that it is not on notifier chain. It is necessary, that this routine was called after route cache will be flushed. @@ -1243,6 +1265,7 @@ #ifdef CONFIG_SYSCTL neigh_sysctl_register(NULL, &arp_tbl.parms, NET_IPV4, NET_IPV4_NEIGH, "ipv4"); #endif + register_netdevice_notifier(&arp_netdev_notifier); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/devinet.c linux-2.4.23-pre8/net/ipv4/devinet.c --- linux-2.4.22/net/ipv4/devinet.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/devinet.c 2003-10-22 22:48:12.000000000 +0000 @@ -883,6 +883,7 @@ unsigned char *b = skb->tail; nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm)); + if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; ifm = NLMSG_DATA(nlh); ifm->ifa_family = AF_INET; ifm->ifa_prefixlen = ifa->ifa_prefixlen; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/icmp.c linux-2.4.23-pre8/net/ipv4/icmp.c --- linux-2.4.22/net/ipv4/icmp.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/icmp.c 2003-10-22 22:49:40.000000000 +0000 @@ -187,11 +187,17 @@ #define icmp_socket (&__icmp_inode[smp_processor_id()].u.socket_i) #define icmp_socket_cpu(X) (&__icmp_inode[(X)].u.socket_i) -static void icmp_xmit_lock(void) +static int icmp_xmit_lock(void) { local_bh_disable(); - if (unlikely(!spin_trylock(&icmp_socket->sk->lock.slock))) - BUG(); + if (unlikely(!spin_trylock(&icmp_socket->sk->lock.slock))) { + /* This can happen if the output path signals a + * dst_link_failure() for an outgoing ICMP packet. + */ + local_bh_enable(); + return 1; + } + return 0; } static void icmp_xmit_unlock(void) @@ -320,7 +326,8 @@ if (ip_options_echo(&icmp_param->replyopts, skb)) return; - icmp_xmit_lock(); + if (icmp_xmit_lock()) + return; icmp_param->data.icmph.checksum=0; icmp_param->csum=0; @@ -427,7 +434,8 @@ } } - icmp_xmit_lock(); + if (icmp_xmit_lock()) + return; /* * Construct source address and options. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/igmp.c linux-2.4.23-pre8/net/ipv4/igmp.c --- linux-2.4.22/net/ipv4/igmp.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/igmp.c 2003-10-22 22:49:48.000000000 +0000 @@ -285,8 +285,10 @@ return 0; } skb = alloc_skb(size + dev->hard_header_len + 15, GFP_ATOMIC); - if (skb == NULL) + if (skb == NULL) { + ip_rt_put(rt); return 0; + } skb->dst = &rt->u.dst; skb->dev = dev; @@ -1372,8 +1374,9 @@ sf_markstate(pmc); #endif if (!delta) { + err = -EINVAL; if (!pmc->sfcount[sfmode]) - return -EINVAL; + goto out_unlock; pmc->sfcount[sfmode]--; } err = 0; @@ -1404,6 +1407,7 @@ igmp_ifc_event(pmc->interface); #endif } +out_unlock: spin_unlock_bh(&pmc->lock); return err; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ip_gre.c linux-2.4.23-pre8/net/ipv4/ip_gre.c --- linux-2.4.22/net/ipv4/ip_gre.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ip_gre.c 2003-10-22 22:49:15.000000000 +0000 @@ -807,8 +807,6 @@ tunnel->err_count = 0; } - skb->h.raw = skb->nh.raw; - max_headroom = ((tdev->hard_header_len+15)&~15)+ gre_hlen; if (skb_headroom(skb) < max_headroom || skb_cloned(skb) || skb_shared(skb)) { @@ -827,6 +825,7 @@ old_iph = skb->nh.iph; } + skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, gre_hlen); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); dst_release(skb->dst); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ip_output.c linux-2.4.23-pre8/net/ipv4/ip_output.c --- linux-2.4.22/net/ipv4/ip_output.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ip_output.c 2003-10-22 22:49:48.000000000 +0000 @@ -339,7 +339,7 @@ return ip_fragment(skb, skb->dst->output); } -int ip_queue_xmit(struct sk_buff *skb) +int ip_queue_xmit(struct sk_buff *skb, int ipfragok) { struct sock *sk = skb->sk; struct ip_options *opt = sk->protinfo.af_inet.opt; @@ -384,7 +384,7 @@ iph = (struct iphdr *) skb_push(skb, sizeof(struct iphdr) + (opt ? opt->optlen : 0)); *((__u16 *)iph) = htons((4 << 12) | (5 << 8) | (sk->protinfo.af_inet.tos & 0xff)); iph->tot_len = htons(skb->len); - if (ip_dont_fragment(sk, &rt->u.dst)) + if (ip_dont_fragment(sk, &rt->u.dst) && !ipfragok) iph->frag_off = htons(IP_DF); else iph->frag_off = 0; @@ -879,6 +879,7 @@ #endif #ifdef CONFIG_NETFILTER skb2->nfmark = skb->nfmark; + skb2->nfcache = skb->nfcache; /* Connection association is same as pre-frag packet */ skb2->nfct = skb->nfct; nf_conntrack_get(skb2->nfct); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipconfig.c linux-2.4.23-pre8/net/ipv4/ipconfig.c --- linux-2.4.22/net/ipv4/ipconfig.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipconfig.c 2003-10-22 22:47:37.000000000 +0000 @@ -124,14 +124,14 @@ int ic_host_name_set __initdata = 0; /* Host name set by us? */ -u32 ic_myaddr __initdata = INADDR_NONE; /* My IP address */ -u32 ic_netmask __initdata = INADDR_NONE; /* Netmask for local subnet */ -u32 ic_gateway __initdata = INADDR_NONE; /* Gateway IP address */ +u32 ic_myaddr = INADDR_NONE; /* My IP address */ +u32 ic_netmask = INADDR_NONE; /* Netmask for local subnet */ +u32 ic_gateway = INADDR_NONE; /* Gateway IP address */ -u32 ic_servaddr __initdata = INADDR_NONE; /* Boot server IP address */ +u32 ic_servaddr = INADDR_NONE; /* Boot server IP address */ -u32 root_server_addr __initdata = INADDR_NONE; /* Address of NFS server */ -u8 root_server_path[256] __initdata = { 0, }; /* Path to mount as root */ +u32 root_server_addr = INADDR_NONE; /* Address of NFS server */ +u8 root_server_path[256] = { 0, }; /* Path to mount as root */ /* Persistent data: */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipip.c linux-2.4.23-pre8/net/ipv4/ipip.c --- linux-2.4.22/net/ipv4/ipip.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipip.c 2003-10-22 22:49:56.000000000 +0000 @@ -603,8 +603,6 @@ tunnel->err_count = 0; } - skb->h.raw = skb->nh.raw; - /* * Okay, now see if we can stuff it in the buffer as-is. */ @@ -626,6 +624,7 @@ old_iph = skb->nh.iph; } + skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); dst_release(skb->dst); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipmr.c linux-2.4.23-pre8/net/ipv4/ipmr.c --- linux-2.4.22/net/ipv4/ipmr.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipmr.c 2003-10-22 22:48:55.000000000 +0000 @@ -1096,6 +1096,7 @@ skb->h.ipiph = skb->nh.iph; skb->nh.iph = iph; + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); #ifdef CONFIG_NETFILTER nf_conntrack_put(skb->nfct); skb->nfct = NULL; @@ -1104,8 +1105,12 @@ static inline int ipmr_forward_finish(struct sk_buff *skb) { + struct ip_options *opt = &(IPCB(skb)->opt); struct dst_entry *dst = skb->dst; + if (unlikely(opt->optlen)) + ip_forward_options(skb); + if (skb->len <= dst->pmtu) return dst->output(skb); else diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/Config.in linux-2.4.23-pre8/net/ipv4/ipvs/Config.in --- linux-2.4.22/net/ipv4/ipvs/Config.in 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/Config.in 2003-10-22 22:48:11.000000000 +0000 @@ -0,0 +1,26 @@ +# +# IP VS configuration +# +mainmenu_option next_comment +comment ' IP: Virtual Server Configuration' + +tristate 'virtual server support (EXPERIMENTAL)' CONFIG_IP_VS +if [ "$CONFIG_IP_VS" != "n" ]; then + bool ' IP virtual server debugging' CONFIG_IP_VS_DEBUG + int ' IPVS connection table size (the Nth power of 2)' CONFIG_IP_VS_TAB_BITS 12 + comment 'IPVS scheduler' + dep_tristate ' round-robin scheduling' CONFIG_IP_VS_RR $CONFIG_IP_VS + dep_tristate ' weighted round-robin scheduling' CONFIG_IP_VS_WRR $CONFIG_IP_VS + dep_tristate ' least-connection scheduling scheduling' CONFIG_IP_VS_LC $CONFIG_IP_VS + dep_tristate ' weighted least-connection scheduling' CONFIG_IP_VS_WLC $CONFIG_IP_VS + dep_tristate ' locality-based least-connection scheduling' CONFIG_IP_VS_LBLC $CONFIG_IP_VS + dep_tristate ' locality-based least-connection with replication scheduling' CONFIG_IP_VS_LBLCR $CONFIG_IP_VS + dep_tristate ' destination hashing scheduling' CONFIG_IP_VS_DH $CONFIG_IP_VS + dep_tristate ' source hashing scheduling' CONFIG_IP_VS_SH $CONFIG_IP_VS + dep_tristate ' shortest expected delay scheduling' CONFIG_IP_VS_SED $CONFIG_IP_VS + dep_tristate ' never queue scheduling' CONFIG_IP_VS_NQ $CONFIG_IP_VS + comment 'IPVS application helper' + dep_tristate ' FTP protocol helper' CONFIG_IP_VS_FTP $CONFIG_IP_VS +fi + +endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/Makefile linux-2.4.23-pre8/net/ipv4/ipvs/Makefile --- linux-2.4.22/net/ipv4/ipvs/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/Makefile 2003-10-22 22:47:54.000000000 +0000 @@ -0,0 +1,43 @@ +# +# Makefile for the IPVS modules on top of IPv4. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). +# +# Note 2! The CFLAGS definition is now in the main makefile... + +O_TARGET := ipvs.o + +export-objs := ip_vs_core.o ip_vs_app.o + +ip_vs-objs := ip_vs_conn.o ip_vs_core.o ip_vs_ctl.o ip_vs_sched.o \ + ip_vs_app.o ip_vs_sync.o ip_vs_est.o + +ifeq ($(CONFIG_IP_VS),y) + obj-y := $(ip_vs-objs) +else + ifeq ($(CONFIG_IP_VS),m) + obj-m := ip_vs.o + endif +endif + +# IPVS schedulers +obj-$(CONFIG_IP_VS_RR) += ip_vs_rr.o +obj-$(CONFIG_IP_VS_WRR) += ip_vs_wrr.o +obj-$(CONFIG_IP_VS_LC) += ip_vs_lc.o +obj-$(CONFIG_IP_VS_WLC) += ip_vs_wlc.o +obj-$(CONFIG_IP_VS_LBLC) += ip_vs_lblc.o +obj-$(CONFIG_IP_VS_LBLCR) += ip_vs_lblcr.o +obj-$(CONFIG_IP_VS_DH) += ip_vs_dh.o +obj-$(CONFIG_IP_VS_SH) += ip_vs_sh.o +obj-$(CONFIG_IP_VS_SED) += ip_vs_sed.o +obj-$(CONFIG_IP_VS_NQ) += ip_vs_nq.o + +# IPVS application helpers +obj-$(CONFIG_IP_VS_FTP) += ip_vs_ftp.o + +include $(TOPDIR)/Rules.make + +ip_vs.o: $(ip_vs-objs) + $(LD) $(LD_RFLAG) -r -o $@ $(ip_vs-objs) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_app.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_app.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_app.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_app.c 2003-10-22 22:47:45.000000000 +0000 @@ -0,0 +1,508 @@ +/* + * IPVS Application module + * + * Version: $Id: ip_vs_app.c,v 1.14 2001/11/23 14:34:10 wensong Exp $ + * + * Authors: Wensong Zhang + * + * 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. + * + * Most code here is taken from ip_masq_app.c in kernel 2.2. The difference + * is that ip_vs_app module handles the reverse direction (incoming requests + * and outgoing responses). The ip_vs_app modules are only used for VS/NAT. + * + * IP_MASQ_APP application masquerading module + * + * Author: Juan Jose Ciarlante, + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define IP_VS_APP_TAB_SIZE 16 /* must be power of 2 */ + +#define IP_VS_APP_HASH(proto, port) ((port^proto) & (IP_VS_APP_TAB_SIZE-1)) +#define IP_VS_APP_TYPE(proto, port) (proto<<16 | port) +#define IP_VS_APP_PORT(type) (type & 0xffff) +#define IP_VS_APP_PROTO(type) ((type>>16) & 0x00ff) + + +EXPORT_SYMBOL(register_ip_vs_app); +EXPORT_SYMBOL(unregister_ip_vs_app); + + +/* + * will hold ipvs app. hashed list heads + */ +static struct list_head ip_vs_app_base[IP_VS_APP_TAB_SIZE]; + +/* lock for ip_vs_app table */ +static rwlock_t __ip_vs_app_lock = RW_LOCK_UNLOCKED; + + +/* + * ip_vs_app registration routine + * port: host byte order. + */ +int register_ip_vs_app(struct ip_vs_app *vapp, + unsigned short proto, __u16 port) +{ + unsigned hash; + + if (!vapp) { + IP_VS_ERR("register_ip_vs_app(): NULL arg\n"); + return -EINVAL; + } + + MOD_INC_USE_COUNT; + + vapp->type = IP_VS_APP_TYPE(proto, port); + hash = IP_VS_APP_HASH(proto, port); + + write_lock_bh(&__ip_vs_app_lock); + list_add(&vapp->n_list, &ip_vs_app_base[hash]); + write_unlock_bh(&__ip_vs_app_lock); + + return 0; +} + + +/* + * ip_vs_app unregistration routine. + */ +int unregister_ip_vs_app(struct ip_vs_app *vapp) +{ + if (!vapp) { + IP_VS_ERR("unregister_ip_vs_app(): NULL arg\n"); + return -EINVAL; + } + + write_lock_bh(&__ip_vs_app_lock); + list_del(&vapp->n_list); + write_unlock_bh(&__ip_vs_app_lock); + + MOD_DEC_USE_COUNT; + + return 0; +} + + +/* + * get ip_vs_app object by its proto and port (net byte order). + */ +static struct ip_vs_app * ip_vs_app_get(unsigned short proto, __u16 port) +{ + struct list_head *e; + struct ip_vs_app *vapp; + unsigned hash; + unsigned type; + + port = ntohs(port); + type = IP_VS_APP_TYPE(proto, port); + hash = IP_VS_APP_HASH(proto, port); + + read_lock_bh(&__ip_vs_app_lock); + + list_for_each(e, &ip_vs_app_base[hash]) { + vapp = list_entry(e, struct ip_vs_app, n_list); + + /* + * Test and MOD_INC_USE_COUNT atomically + */ + if (vapp->module && !try_inc_mod_count(vapp->module)) { + /* + * This application module is just deleted + */ + continue; + } + if (type == vapp->type) { + read_unlock_bh(&__ip_vs_app_lock); + return vapp; + } + + if (vapp->module) + __MOD_DEC_USE_COUNT(vapp->module); + } + + read_unlock_bh(&__ip_vs_app_lock); + return NULL; +} + + +/* + * Bind ip_vs_conn to its ip_vs_app based on proto and dport, + * and call the ip_vs_app constructor. + */ +struct ip_vs_app * ip_vs_bind_app(struct ip_vs_conn *cp) +{ + struct ip_vs_app *vapp; + + /* no need to bind app if its forwarding method is not NAT */ + if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ) + return NULL; + + if (cp->protocol != IPPROTO_TCP && cp->protocol != IPPROTO_UDP) + return NULL; + + /* + * don't allow binding if already bound + */ + if (cp->app != NULL) { + IP_VS_ERR("ip_vs_bind_app(): " + "called for already bound object.\n"); + return cp->app; + } + + vapp = ip_vs_app_get(cp->protocol, cp->vport); + + if (vapp != NULL) { + cp->app = vapp; + + if (vapp->init_conn) + vapp->init_conn(vapp, cp); + } + return vapp; +} + + +/* + * Unbind cp from type object and call cp destructor (does not kfree()). + */ +int ip_vs_unbind_app(struct ip_vs_conn *cp) +{ + struct ip_vs_app *vapp = cp->app; + + if (cp->protocol != IPPROTO_TCP && cp->protocol != IPPROTO_UDP) + return 0; + + if (vapp != NULL) { + if (vapp->done_conn) + vapp->done_conn(vapp, cp); + cp->app = NULL; + if (vapp->module) + __MOD_DEC_USE_COUNT(vapp->module); + } + return (vapp != NULL); +} + + +/* + * Fixes th->seq based on ip_vs_seq info. + */ +static inline void vs_fix_seq(const struct ip_vs_seq *vseq, struct tcphdr *th) +{ + __u32 seq = ntohl(th->seq); + + /* + * Adjust seq with delta-offset for all packets after + * the most recent resized pkt seq and with previous_delta offset + * for all packets before most recent resized pkt seq. + */ + if (vseq->delta || vseq->previous_delta) { + if(after(seq, vseq->init_seq)) { + th->seq = htonl(seq + vseq->delta); + IP_VS_DBG(9, "vs_fix_seq(): added delta (%d) to seq\n", + vseq->delta); + } else { + th->seq = htonl(seq + vseq->previous_delta); + IP_VS_DBG(9, "vs_fix_seq(): added previous_delta " + "(%d) to seq\n", vseq->previous_delta); + } + } +} + + +/* + * Fixes th->ack_seq based on ip_vs_seq info. + */ +static inline void +vs_fix_ack_seq(const struct ip_vs_seq *vseq, struct tcphdr *th) +{ + __u32 ack_seq = ntohl(th->ack_seq); + + /* + * Adjust ack_seq with delta-offset for + * the packets AFTER most recent resized pkt has caused a shift + * for packets before most recent resized pkt, use previous_delta + */ + if (vseq->delta || vseq->previous_delta) { + /* since ack_seq is the number of octet that is expected + to receive next, so compare it with init_seq+delta */ + if(after(ack_seq, vseq->init_seq+vseq->delta)) { + th->ack_seq = htonl(ack_seq - vseq->delta); + IP_VS_DBG(9, "vs_fix_ack_seq(): subtracted delta " + "(%d) from ack_seq\n", vseq->delta); + + } else { + th->ack_seq = htonl(ack_seq - vseq->previous_delta); + IP_VS_DBG(9, "vs_fix_ack_seq(): subtracted " + "previous_delta (%d) from ack_seq\n", + vseq->previous_delta); + } + } +} + + +/* + * Updates ip_vs_seq if pkt has been resized + * Assumes already checked proto==IPPROTO_TCP and diff!=0. + */ +static inline void vs_seq_update(struct ip_vs_conn *cp, struct ip_vs_seq *vseq, + unsigned flag, __u32 seq, int diff) +{ + /* spinlock is to keep updating cp->flags atomic */ + spin_lock(&cp->lock); + if ( !(cp->flags & flag) || after(seq, vseq->init_seq)) { + vseq->previous_delta = vseq->delta; + vseq->delta += diff; + vseq->init_seq = seq; + cp->flags |= flag; + } + spin_unlock(&cp->lock); +} + + +/* + * Output pkt hook. Will call bound ip_vs_app specific function + * called by ip_vs_out(), assumes previously checked cp!=NULL + * returns (new - old) skb->len diff. + */ +int ip_vs_app_pkt_out(struct ip_vs_conn *cp, struct sk_buff *skb) +{ + struct ip_vs_app *vapp; + int diff; + struct iphdr *iph; + struct tcphdr *th; + __u32 seq; + + /* + * check if application module is bound to + * this ip_vs_conn. + */ + if ((vapp = cp->app) == NULL) + return 0; + + iph = skb->nh.iph; + th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); + + /* + * Remember seq number in case this pkt gets resized + */ + seq = ntohl(th->seq); + + /* + * Fix seq stuff if flagged as so. + */ + if (cp->protocol == IPPROTO_TCP) { + if (cp->flags & IP_VS_CONN_F_OUT_SEQ) + vs_fix_seq(&cp->out_seq, th); + if (cp->flags & IP_VS_CONN_F_IN_SEQ) + vs_fix_ack_seq(&cp->in_seq, th); + } + + /* + * Call private output hook function + */ + if (vapp->pkt_out == NULL) + return 0; + + diff = vapp->pkt_out(vapp, cp, skb); + + /* + * Update ip_vs seq stuff if len has changed. + */ + if (diff != 0 && cp->protocol == IPPROTO_TCP) + vs_seq_update(cp, &cp->out_seq, + IP_VS_CONN_F_OUT_SEQ, seq, diff); + + return diff; +} + + +/* + * Input pkt hook. Will call bound ip_vs_app specific function + * called by ip_fw_demasquerade(), assumes previously checked cp!=NULL. + * returns (new - old) skb->len diff. + */ +int ip_vs_app_pkt_in(struct ip_vs_conn *cp, struct sk_buff *skb) +{ + struct ip_vs_app *vapp; + int diff; + struct iphdr *iph; + struct tcphdr *th; + __u32 seq; + + /* + * check if application module is bound to + * this ip_vs_conn. + */ + if ((vapp = cp->app) == NULL) + return 0; + + iph = skb->nh.iph; + th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); + + /* + * Remember seq number in case this pkt gets resized + */ + seq = ntohl(th->seq); + + /* + * Fix seq stuff if flagged as so. + */ + if (cp->protocol == IPPROTO_TCP) { + if (cp->flags & IP_VS_CONN_F_IN_SEQ) + vs_fix_seq(&cp->in_seq, th); + if (cp->flags & IP_VS_CONN_F_OUT_SEQ) + vs_fix_ack_seq(&cp->out_seq, th); + } + + /* + * Call private input hook function + */ + if (vapp->pkt_in == NULL) + return 0; + + diff = vapp->pkt_in(vapp, cp, skb); + + /* + * Update ip_vs seq stuff if len has changed. + */ + if (diff != 0 && cp->protocol == IPPROTO_TCP) + vs_seq_update(cp, &cp->in_seq, + IP_VS_CONN_F_IN_SEQ, seq, diff); + + return diff; +} + + +/* + * /proc/net/ip_vs_app entry function + */ +static int ip_vs_app_getinfo(char *buffer, char **start, off_t offset, + int length) +{ + off_t pos=0; + int len=0; + char temp[64]; + int idx; + struct ip_vs_app *vapp; + struct list_head *e; + + pos = 64; + if (pos > offset) { + len += sprintf(buffer+len, "%-63s\n", + "prot port usecnt name"); + } + + read_lock_bh(&__ip_vs_app_lock); + for (idx=0 ; idx < IP_VS_APP_TAB_SIZE; idx++) { + list_for_each (e, &ip_vs_app_base[idx]) { + vapp = list_entry(e, struct ip_vs_app, n_list); + + pos += 64; + if (pos <= offset) + continue; + sprintf(temp, "%-3s %-7u %-6d %-17s", + ip_vs_proto_name(IP_VS_APP_PROTO(vapp->type)), + IP_VS_APP_PORT(vapp->type), + vapp->module?GET_USE_COUNT(vapp->module):0, + vapp->name); + len += sprintf(buffer+len, "%-63s\n", temp); + if (pos >= offset+length) + goto done; + } + } + done: + read_unlock_bh(&__ip_vs_app_lock); + + *start = buffer+len-(pos-offset); /* Start of wanted data */ + len = pos-offset; + if (len > length) + len = length; + if (len < 0) + len = 0; + return len; +} + + +/* + * Replace a segment of data with a new segment + */ +int ip_vs_skb_replace(struct sk_buff *skb, int pri, + char *o_buf, int o_len, char *n_buf, int n_len) +{ + struct iphdr *iph; + int diff; + int o_offset; + int o_left; + + EnterFunction(9); + + diff = n_len - o_len; + o_offset = o_buf - (char *)skb->data; + /* The length of left data after o_buf+o_len in the skb data */ + o_left = skb->len - (o_offset + o_len); + + if (diff <= 0) { + memmove(o_buf + n_len, o_buf + o_len, o_left); + memcpy(o_buf, n_buf, n_len); + skb_trim(skb, skb->len + diff); + } else if (diff <= skb_tailroom(skb)) { + skb_put(skb, diff); + memmove(o_buf + n_len, o_buf + o_len, o_left); + memcpy(o_buf, n_buf, n_len); + } else { + if (pskb_expand_head(skb, skb_headroom(skb), diff, pri)) + return -ENOMEM; + skb_put(skb, diff); + memmove(skb->data + o_offset + n_len, + skb->data + o_offset + o_len, o_left); + memcpy(skb->data + o_offset, n_buf, n_len); + } + + /* must update the iph total length here */ + iph = skb->nh.iph; + iph->tot_len = htons(skb->len); + + LeaveFunction(9); + return 0; +} + + +int ip_vs_app_init(void) +{ + int idx; + + for (idx=0 ; idx < IP_VS_APP_TAB_SIZE; idx++) { + INIT_LIST_HEAD(&ip_vs_app_base[idx]); + } + + /* we will replace it with proc_net_ipvs_create() soon */ + proc_net_create("ip_vs_app", 0, ip_vs_app_getinfo); + return 0; +} + +void ip_vs_app_cleanup(void) +{ + proc_net_remove("ip_vs_app"); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_conn.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_conn.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_conn.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_conn.c 2003-10-22 22:49:12.000000000 +0000 @@ -0,0 +1,1562 @@ +/* + * IPVS An implementation of the IP virtual server support for the + * LINUX operating system. IPVS is now implemented as a module + * over the Netfilter framework. IPVS can be used to build a + * high-performance and highly available server based on a + * cluster of servers. + * + * Version: $Id: ip_vs_conn.c,v 1.28.2.5 2003/08/09 13:27:08 wensong Exp $ + * + * Authors: Wensong Zhang + * Peter Kese + * Julian Anastasov + * + * 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. + * + * The IPVS code for kernel 2.2 was done by Wensong Zhang and Peter Kese, + * with changes/fixes from Julian Anastasov, Lars Marowsky-Bree, Horms + * and others. Many code here is taken from IP MASQ code of kernel 2.2. + * + * Changes: + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include /* for tcphdr */ +#include +#include /* for proc_net_* */ +#include /* for local_bh_* */ +#include +#include /* for csum_tcpudp_magic */ +#include +#include /* for icmp_send */ +#include /* for ip_route_output */ +#include +#include +#include +#include + +#include + + +/* + * Connection hash table: for input and output packets lookups of IPVS + */ +static struct list_head *ip_vs_conn_tab; + +/* SLAB cache for IPVS connections */ +static kmem_cache_t *ip_vs_conn_cachep; + +/* counter for current IPVS connections */ +static atomic_t ip_vs_conn_count = ATOMIC_INIT(0); + +/* counter for no-client-port connections */ +static atomic_t ip_vs_conn_no_cport_cnt = ATOMIC_INIT(0); + +/* random value for IPVS connection hash */ +static unsigned int ip_vs_conn_rnd; + +/* + * Fine locking granularity for big connection hash table + */ +#define CT_LOCKARRAY_BITS 4 +#define CT_LOCKARRAY_SIZE (1<flags & IP_VS_CONN_F_HASHED) { + IP_VS_ERR("ip_vs_conn_hash(): request for already hashed, " + "called from %p\n", __builtin_return_address(0)); + return 0; + } + + /* Hash by protocol, client address and port */ + hash = ip_vs_conn_hashkey(cp->protocol, cp->caddr, cp->cport); + + ct_write_lock(hash); + + list_add(&cp->c_list, &ip_vs_conn_tab[hash]); + cp->flags |= IP_VS_CONN_F_HASHED; + atomic_inc(&cp->refcnt); + + ct_write_unlock(hash); + + return 1; +} + + +/* + * UNhashes ip_vs_conn from ip_vs_conn_tab. + * returns bool success. + */ +static int ip_vs_conn_unhash(struct ip_vs_conn *cp) +{ + unsigned hash; + + if (!(cp->flags & IP_VS_CONN_F_HASHED)) { + IP_VS_ERR("ip_vs_conn_unhash(): request for unhash flagged, " + "called from %p\n", __builtin_return_address(0)); + return 0; + } + + /* unhash it and decrease its reference counter */ + hash = ip_vs_conn_hashkey(cp->protocol, cp->caddr, cp->cport); + ct_write_lock(hash); + + list_del(&cp->c_list); + cp->flags &= ~IP_VS_CONN_F_HASHED; + atomic_dec(&cp->refcnt); + + ct_write_unlock(hash); + + return 1; +} + + +/* + * Gets ip_vs_conn associated with supplied parameters in the ip_vs_conn_tab. + * Called for pkts coming from OUTside-to-INside. + * s_addr, s_port: pkt source address (foreign host) + * d_addr, d_port: pkt dest address (load balancer) + */ +static inline struct ip_vs_conn *__ip_vs_conn_in_get +(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port) +{ + unsigned hash; + struct ip_vs_conn *cp; + struct list_head *l,*e; + + hash = ip_vs_conn_hashkey(protocol, s_addr, s_port); + l = &ip_vs_conn_tab[hash]; + + ct_read_lock(hash); + + for (e=l->next; e!=l; e=e->next) { + cp = list_entry(e, struct ip_vs_conn, c_list); + if (s_addr==cp->caddr && s_port==cp->cport && + d_port==cp->vport && d_addr==cp->vaddr && + protocol==cp->protocol) { + /* HIT */ + atomic_inc(&cp->refcnt); + ct_read_unlock(hash); + return cp; + } + } + + ct_read_unlock(hash); + + return NULL; +} + +struct ip_vs_conn *ip_vs_conn_in_get +(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port) +{ + struct ip_vs_conn *cp; + + cp = __ip_vs_conn_in_get(protocol, s_addr, s_port, d_addr, d_port); + if (!cp && atomic_read(&ip_vs_conn_no_cport_cnt)) + cp = __ip_vs_conn_in_get(protocol, s_addr, 0, d_addr, d_port); + + IP_VS_DBG(7, "lookup/in %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n", + ip_vs_proto_name(protocol), + NIPQUAD(s_addr), ntohs(s_port), + NIPQUAD(d_addr), ntohs(d_port), + cp?"hit":"not hit"); + + return cp; +} + + +/* + * Gets ip_vs_conn associated with supplied parameters in the ip_vs_conn_tab. + * Called for pkts coming from inside-to-OUTside. + * s_addr, s_port: pkt source address (inside host) + * d_addr, d_port: pkt dest address (foreign host) + */ +struct ip_vs_conn *ip_vs_conn_out_get +(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port) +{ + unsigned hash; + struct ip_vs_conn *cp, *ret=NULL; + struct list_head *l,*e; + + /* + * Check for "full" addressed entries + */ + hash = ip_vs_conn_hashkey(protocol, d_addr, d_port); + l = &ip_vs_conn_tab[hash]; + + ct_read_lock(hash); + + for (e=l->next; e!=l; e=e->next) { + cp = list_entry(e, struct ip_vs_conn, c_list); + if (d_addr == cp->caddr && d_port == cp->cport && + s_port == cp->dport && s_addr == cp->daddr && + protocol == cp->protocol) { + /* HIT */ + atomic_inc(&cp->refcnt); + ret = cp; + break; + } + } + + ct_read_unlock(hash); + + IP_VS_DBG(7, "lookup/out %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d %s\n", + ip_vs_proto_name(protocol), + NIPQUAD(s_addr), ntohs(s_port), + NIPQUAD(d_addr), ntohs(d_port), + ret?"hit":"not hit"); + + return ret; +} + + +/* + * Put back the conn and restart its timer with its timeout + */ +void ip_vs_conn_put(struct ip_vs_conn *cp) +{ + /* reset it expire in its timeout */ + mod_timer(&cp->timer, jiffies+cp->timeout); + + __ip_vs_conn_put(cp); +} + + +/* + * Timeout table[state] + */ +struct ip_vs_timeout_table vs_timeout_table = { + ATOMIC_INIT(0), /* refcnt */ + 0, /* scale */ + { + [IP_VS_S_NONE] = 30*60*HZ, + [IP_VS_S_ESTABLISHED] = 15*60*HZ, + [IP_VS_S_SYN_SENT] = 2*60*HZ, + [IP_VS_S_SYN_RECV] = 1*60*HZ, + [IP_VS_S_FIN_WAIT] = 2*60*HZ, + [IP_VS_S_TIME_WAIT] = 2*60*HZ, + [IP_VS_S_CLOSE] = 10*HZ, + [IP_VS_S_CLOSE_WAIT] = 60*HZ, + [IP_VS_S_LAST_ACK] = 30*HZ, + [IP_VS_S_LISTEN] = 2*60*HZ, + [IP_VS_S_SYNACK] = 120*HZ, + [IP_VS_S_UDP] = 5*60*HZ, + [IP_VS_S_ICMP] = 1*60*HZ, + [IP_VS_S_LAST] = 2*HZ, + }, /* timeout */ +}; + + +struct ip_vs_timeout_table vs_timeout_table_dos = { + ATOMIC_INIT(0), /* refcnt */ + 0, /* scale */ + { + [IP_VS_S_NONE] = 15*60*HZ, + [IP_VS_S_ESTABLISHED] = 8*60*HZ, + [IP_VS_S_SYN_SENT] = 60*HZ, + [IP_VS_S_SYN_RECV] = 10*HZ, + [IP_VS_S_FIN_WAIT] = 60*HZ, + [IP_VS_S_TIME_WAIT] = 60*HZ, + [IP_VS_S_CLOSE] = 10*HZ, + [IP_VS_S_CLOSE_WAIT] = 60*HZ, + [IP_VS_S_LAST_ACK] = 30*HZ, + [IP_VS_S_LISTEN] = 2*60*HZ, + [IP_VS_S_SYNACK] = 100*HZ, + [IP_VS_S_UDP] = 3*60*HZ, + [IP_VS_S_ICMP] = 1*60*HZ, + [IP_VS_S_LAST] = 2*HZ, + }, /* timeout */ +}; + + +/* + * Timeout table to use for the VS entries + * If NULL we use the default table (vs_timeout_table). + * Under flood attack we switch to vs_timeout_table_dos + */ + +static struct ip_vs_timeout_table *ip_vs_timeout_table = &vs_timeout_table; + +static const char * state_name_table[IP_VS_S_LAST+1] = { + [IP_VS_S_NONE] = "NONE", + [IP_VS_S_ESTABLISHED] = "ESTABLISHED", + [IP_VS_S_SYN_SENT] = "SYN_SENT", + [IP_VS_S_SYN_RECV] = "SYN_RECV", + [IP_VS_S_FIN_WAIT] = "FIN_WAIT", + [IP_VS_S_TIME_WAIT] = "TIME_WAIT", + [IP_VS_S_CLOSE] = "CLOSE", + [IP_VS_S_CLOSE_WAIT] = "CLOSE_WAIT", + [IP_VS_S_LAST_ACK] = "LAST_ACK", + [IP_VS_S_LISTEN] = "LISTEN", + [IP_VS_S_SYNACK] = "SYNACK", + [IP_VS_S_UDP] = "UDP", + [IP_VS_S_ICMP] = "ICMP", + [IP_VS_S_LAST] = "BUG!", +}; + +#define sNO IP_VS_S_NONE +#define sES IP_VS_S_ESTABLISHED +#define sSS IP_VS_S_SYN_SENT +#define sSR IP_VS_S_SYN_RECV +#define sFW IP_VS_S_FIN_WAIT +#define sTW IP_VS_S_TIME_WAIT +#define sCL IP_VS_S_CLOSE +#define sCW IP_VS_S_CLOSE_WAIT +#define sLA IP_VS_S_LAST_ACK +#define sLI IP_VS_S_LISTEN +#define sSA IP_VS_S_SYNACK + +struct vs_tcp_states_t { + int next_state[IP_VS_S_LAST]; /* should be _LAST_TCP */ +}; + +const char * ip_vs_state_name(int state) +{ + if (state >= IP_VS_S_LAST) + return "ERR!"; + return state_name_table[state] ? state_name_table[state] : "?"; +} + +static struct vs_tcp_states_t vs_tcp_states [] = { +/* INPUT */ +/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */ +/*syn*/ {{sSR, sES, sES, sSR, sSR, sSR, sSR, sSR, sSR, sSR, sSR }}, +/*fin*/ {{sCL, sCW, sSS, sTW, sTW, sTW, sCL, sCW, sLA, sLI, sTW }}, +/*ack*/ {{sCL, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }}, +/*rst*/ {{sCL, sCL, sCL, sSR, sCL, sCL, sCL, sCL, sLA, sLI, sSR }}, + +/* OUTPUT */ +/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */ +/*syn*/ {{sSS, sES, sSS, sSR, sSS, sSS, sSS, sSS, sSS, sLI, sSR }}, +/*fin*/ {{sTW, sFW, sSS, sTW, sFW, sTW, sCL, sTW, sLA, sLI, sTW }}, +/*ack*/ {{sES, sES, sSS, sES, sFW, sTW, sCL, sCW, sLA, sES, sES }}, +/*rst*/ {{sCL, sCL, sSS, sCL, sCL, sTW, sCL, sCL, sCL, sCL, sCL }}, + +/* INPUT-ONLY */ +/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */ +/*syn*/ {{sSR, sES, sES, sSR, sSR, sSR, sSR, sSR, sSR, sSR, sSR }}, +/*fin*/ {{sCL, sFW, sSS, sTW, sFW, sTW, sCL, sCW, sLA, sLI, sTW }}, +/*ack*/ {{sCL, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }}, +/*rst*/ {{sCL, sCL, sCL, sSR, sCL, sCL, sCL, sCL, sLA, sLI, sCL }}, +}; + +static struct vs_tcp_states_t vs_tcp_states_dos [] = { +/* INPUT */ +/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */ +/*syn*/ {{sSR, sES, sES, sSR, sSR, sSR, sSR, sSR, sSR, sSR, sSA }}, +/*fin*/ {{sCL, sCW, sSS, sTW, sTW, sTW, sCL, sCW, sLA, sLI, sSA }}, +/*ack*/ {{sCL, sES, sSS, sSR, sFW, sTW, sCL, sCW, sCL, sLI, sSA }}, +/*rst*/ {{sCL, sCL, sCL, sSR, sCL, sCL, sCL, sCL, sLA, sLI, sCL }}, + +/* OUTPUT */ +/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */ +/*syn*/ {{sSS, sES, sSS, sSA, sSS, sSS, sSS, sSS, sSS, sLI, sSA }}, +/*fin*/ {{sTW, sFW, sSS, sTW, sFW, sTW, sCL, sTW, sLA, sLI, sTW }}, +/*ack*/ {{sES, sES, sSS, sES, sFW, sTW, sCL, sCW, sLA, sES, sES }}, +/*rst*/ {{sCL, sCL, sSS, sCL, sCL, sTW, sCL, sCL, sCL, sCL, sCL }}, + +/* INPUT-ONLY */ +/* sNO, sES, sSS, sSR, sFW, sTW, sCL, sCW, sLA, sLI, sSA */ +/*syn*/ {{sSA, sES, sES, sSR, sSA, sSA, sSA, sSA, sSA, sSA, sSA }}, +/*fin*/ {{sCL, sFW, sSS, sTW, sFW, sTW, sCL, sCW, sLA, sLI, sTW }}, +/*ack*/ {{sCL, sES, sSS, sES, sFW, sTW, sCL, sCW, sCL, sLI, sES }}, +/*rst*/ {{sCL, sCL, sCL, sSR, sCL, sCL, sCL, sCL, sLA, sLI, sCL }}, +}; + +static struct vs_tcp_states_t *ip_vs_state_table = vs_tcp_states; + +void ip_vs_secure_tcp_set(int on) +{ + if (on) { + ip_vs_state_table = vs_tcp_states_dos; + ip_vs_timeout_table = &vs_timeout_table_dos; + } else { + ip_vs_state_table = vs_tcp_states; + ip_vs_timeout_table = &vs_timeout_table; + } +} + + +static inline int vs_tcp_state_idx(struct tcphdr *th, int state_off) +{ + /* + * [0-3]: input states, [4-7]: output, [8-11] input only states. + */ + if (th->rst) + return state_off+3; + if (th->syn) + return state_off+0; + if (th->fin) + return state_off+1; + if (th->ack) + return state_off+2; + return -1; +} + + +static inline int vs_set_state_timeout(struct ip_vs_conn *cp, int state) +{ + struct ip_vs_timeout_table *vstim = cp->timeout_table; + + /* + * Use default timeout table if no specific for this entry + */ + if (!vstim) + vstim = &vs_timeout_table; + + cp->timeout = vstim->timeout[cp->state=state]; + + if (vstim->scale) { + int scale = vstim->scale; + + if (scale<0) + cp->timeout >>= -scale; + else if (scale > 0) + cp->timeout <<= scale; + } + + return state; +} + + +static inline int +vs_tcp_state(struct ip_vs_conn *cp, int state_off, struct tcphdr *th) +{ + int state_idx; + int new_state = IP_VS_S_CLOSE; + + /* + * Update state offset to INPUT_ONLY if necessary + * or delete NO_OUTPUT flag if output packet detected + */ + if (cp->flags & IP_VS_CONN_F_NOOUTPUT) { + if (state_off == VS_STATE_OUTPUT) + cp->flags &= ~IP_VS_CONN_F_NOOUTPUT; + else + state_off = VS_STATE_INPUT_ONLY; + } + + if ((state_idx = vs_tcp_state_idx(th, state_off)) < 0) { + IP_VS_DBG(8, "vs_tcp_state_idx(%d)=%d!!!\n", + state_off, state_idx); + goto tcp_state_out; + } + + new_state = ip_vs_state_table[state_idx].next_state[cp->state]; + + tcp_state_out: + if (new_state != cp->state) { + struct ip_vs_dest *dest = cp->dest; + + IP_VS_DBG(8, "%s %s [%c%c%c%c] %u.%u.%u.%u:%d->" + "%u.%u.%u.%u:%d state: %s->%s cnt:%d\n", + ip_vs_proto_name(cp->protocol), + (state_off==VS_STATE_OUTPUT)?"output ":"input ", + th->syn? 'S' : '.', + th->fin? 'F' : '.', + th->ack? 'A' : '.', + th->rst? 'R' : '.', + NIPQUAD(cp->daddr), ntohs(cp->dport), + NIPQUAD(cp->caddr), ntohs(cp->cport), + ip_vs_state_name(cp->state), + ip_vs_state_name(new_state), + atomic_read(&cp->refcnt)); + if (dest) { + if (!(cp->flags & IP_VS_CONN_F_INACTIVE) && + (new_state != IP_VS_S_ESTABLISHED)) { + atomic_dec(&dest->activeconns); + atomic_inc(&dest->inactconns); + cp->flags |= IP_VS_CONN_F_INACTIVE; + } else if ((cp->flags & IP_VS_CONN_F_INACTIVE) && + (new_state == IP_VS_S_ESTABLISHED)) { + atomic_inc(&dest->activeconns); + atomic_dec(&dest->inactconns); + cp->flags &= ~IP_VS_CONN_F_INACTIVE; + } + } + } + + return vs_set_state_timeout(cp, new_state); +} + + +/* + * Handle state transitions + */ +int ip_vs_set_state(struct ip_vs_conn *cp, + int state_off, struct iphdr *iph, void *tp) +{ + int ret; + + spin_lock(&cp->lock); + switch (iph->protocol) { + case IPPROTO_TCP: + ret = vs_tcp_state(cp, state_off, tp); + break; + case IPPROTO_UDP: + ret = vs_set_state_timeout(cp, IP_VS_S_UDP); + break; + case IPPROTO_ICMP: + ret = vs_set_state_timeout(cp, IP_VS_S_ICMP); + break; + default: + ret = -1; + } + spin_unlock(&cp->lock); + + return ret; +} + + +/* + * Set LISTEN timeout. (ip_vs_conn_put will setup timer) + */ +int ip_vs_conn_listen(struct ip_vs_conn *cp) +{ + vs_set_state_timeout(cp, IP_VS_S_LISTEN); + return cp->timeout; +} + + +/* + * Bypass transmitter + * Let packets bypass the destination when the destination is not + * available, it may be only used in transparent cache cluster. + */ +static int ip_vs_bypass_xmit(struct sk_buff *skb, struct ip_vs_conn *cp) +{ + struct rtable *rt; /* Route to the other host */ + struct iphdr *iph = skb->nh.iph; + u8 tos = iph->tos; + int mtu; + + EnterFunction(10); + + if (ip_route_output(&rt, iph->daddr, 0, RT_TOS(tos), 0)) { + IP_VS_DBG_RL("ip_vs_bypass_xmit(): ip_route_output error, " + "dest: %u.%u.%u.%u\n", NIPQUAD(iph->daddr)); + goto tx_error_icmp; + } + + /* MTU checking */ + mtu = rt->u.dst.pmtu; + if ((skb->len > mtu) && (iph->frag_off&__constant_htons(IP_DF))) { + ip_rt_put(rt); + icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); + IP_VS_DBG_RL("ip_vs_bypass_xmit(): frag needed\n"); + goto tx_error; + } + + /* update checksum because skb might be defragmented */ + ip_send_check(iph); + + if (unlikely(skb_headroom(skb) < rt->u.dst.dev->hard_header_len)) { + if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) { + ip_rt_put(rt); + IP_VS_ERR_RL("ip_vs_bypass_xmit(): no memory\n"); + goto tx_error; + } + } + + /* drop old route */ + dst_release(skb->dst); + skb->dst = &rt->u.dst; + +#ifdef CONFIG_NETFILTER_DEBUG + skb->nf_debug = 1 << NF_IP_LOCAL_OUT; +#endif /* CONFIG_NETFILTER_DEBUG */ + skb->nfcache |= NFC_IPVS_PROPERTY; + ip_send(skb); + + LeaveFunction(10); + return NF_STOLEN; + + tx_error_icmp: + dst_link_failure(skb); + tx_error: + kfree_skb(skb); + return NF_STOLEN; +} + + +/* + * NULL transmitter (do nothing except return NF_ACCEPT) + */ +static int ip_vs_null_xmit(struct sk_buff *skb, struct ip_vs_conn *cp) +{ + return NF_ACCEPT; +} + + +/* + * NAT transmitter (only for outside-to-inside nat forwarding) + */ +static int ip_vs_nat_xmit(struct sk_buff *skb, struct ip_vs_conn *cp) +{ + struct rtable *rt; /* Route to the other host */ + struct iphdr *iph; + union ip_vs_tphdr h; + int ihl; + unsigned short size; + int mtu; + + EnterFunction(10); + + /* + * If it has ip_vs_app helper, the helper may change the payload, + * so it needs full checksum checking and checksum calculation. + * If not, only the header (such as IP address and port number) + * will be changed, so it is fast to do incremental checksum update, + * and let the destination host do final checksum checking. + */ + + if (cp->app && skb_is_nonlinear(skb) + && skb_linearize(skb, GFP_ATOMIC) != 0) + return NF_DROP; + + iph = skb->nh.iph; + ihl = iph->ihl << 2; + h.raw = (char*) iph + ihl; + size = ntohs(iph->tot_len) - ihl; + + /* do TCP/UDP checksum checking if it has application helper */ + if (cp->app && (iph->protocol != IPPROTO_UDP || h.uh->check != 0)) { + switch (skb->ip_summed) { + case CHECKSUM_NONE: + skb->csum = csum_partial(h.raw, size, 0); + + case CHECKSUM_HW: + if (csum_tcpudp_magic(iph->saddr, iph->daddr, size, + iph->protocol, skb->csum)) { + IP_VS_DBG_RL("Incoming failed %s checksum " + "from %d.%d.%d.%d (size=%d)!\n", + ip_vs_proto_name(iph->protocol), + NIPQUAD(iph->saddr), + size); + goto tx_error; + } + break; + default: + /* CHECKSUM_UNNECESSARY */ + break; + } + } + + /* + * Check if it is no_cport connection ... + */ + if (cp->flags & IP_VS_CONN_F_NO_CPORT) { + atomic_dec(&ip_vs_conn_no_cport_cnt); + ip_vs_conn_unhash(cp); + cp->flags &= ~IP_VS_CONN_F_NO_CPORT; + cp->cport = h.portp[0]; + /* hash on new dport */ + ip_vs_conn_hash(cp); + + IP_VS_DBG(10, "filled cport=%d\n", ntohs(cp->dport)); + } + + if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(iph->tos)))) + goto tx_error_icmp; + + /* MTU checking */ + mtu = rt->u.dst.pmtu; + if ((skb->len > mtu) && (iph->frag_off&__constant_htons(IP_DF))) { + ip_rt_put(rt); + icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); + IP_VS_DBG_RL("ip_vs_nat_xmit(): frag needed\n"); + goto tx_error; + } + + /* drop old route */ + dst_release(skb->dst); + skb->dst = &rt->u.dst; + + /* copy-on-write the packet before mangling it */ + if (ip_vs_skb_cow(skb, rt->u.dst.dev->hard_header_len, &iph, &h.raw)) + return NF_DROP; + + /* mangle the packet */ + iph->daddr = cp->daddr; + h.portp[1] = cp->dport; + + /* + * Attempt ip_vs_app call. + * will fix ip_vs_conn and iph ack_seq stuff + */ + if (ip_vs_app_pkt_in(cp, skb) != 0) { + /* skb data has probably changed, update pointers */ + iph = skb->nh.iph; + h.raw = (char*) iph + ihl; + size = skb->len - ihl; + } + + /* + * Adjust TCP/UDP checksums + */ + if (!cp->app && (iph->protocol != IPPROTO_UDP || h.uh->check != 0)) { + /* Only port and addr are changed, do fast csum update */ + ip_vs_fast_check_update(&h, cp->vaddr, cp->daddr, + cp->vport, cp->dport, iph->protocol); + if (skb->ip_summed == CHECKSUM_HW) + skb->ip_summed = CHECKSUM_NONE; + } else { + /* full checksum calculation */ + switch (iph->protocol) { + case IPPROTO_TCP: + h.th->check = 0; + h.th->check = csum_tcpudp_magic(iph->saddr, iph->daddr, + size, iph->protocol, + csum_partial(h.raw, size, 0)); + break; + case IPPROTO_UDP: + h.uh->check = 0; + h.uh->check = csum_tcpudp_magic(iph->saddr, iph->daddr, + size, iph->protocol, + csum_partial(h.raw, size, 0)); + if (h.uh->check == 0) + h.uh->check = 0xFFFF; + break; + } + skb->ip_summed = CHECKSUM_UNNECESSARY; + } + ip_send_check(iph); + + IP_VS_DBG(10, "NAT to %u.%u.%u.%u:%d\n", + NIPQUAD(iph->daddr), ntohs(h.portp[1])); + + /* FIXME: when application helper enlarges the packet and the length + is larger than the MTU of outgoing device, there will be still + MTU problem. */ + +#ifdef CONFIG_NETFILTER_DEBUG + skb->nf_debug = 1 << NF_IP_LOCAL_OUT; +#endif /* CONFIG_NETFILTER_DEBUG */ + skb->nfcache |= NFC_IPVS_PROPERTY; + ip_send(skb); + + LeaveFunction(10); + return NF_STOLEN; + + tx_error_icmp: + dst_link_failure(skb); + tx_error: + kfree_skb(skb); + return NF_STOLEN; +} + + +/* + * IP Tunneling transmitter + * + * This function encapsulates the packet in a new IP packet, its + * destination will be set to cp->daddr. Most code of this function + * is taken from ipip.c. + * + * It is used in VS/TUN cluster. The load balancer selects a real + * server from a cluster based on a scheduling algorithm, + * encapsulates the request packet and forwards it to the selected + * server. For example, all real servers are configured with + * "ifconfig tunl0 up". When the server receives + * the encapsulated packet, it will decapsulate the packet, processe + * the request and return the response packets directly to the client + * without passing the load balancer. This can greatly increase the + * scalability of virtual server. + */ +static int ip_vs_tunnel_xmit(struct sk_buff *skb, struct ip_vs_conn *cp) +{ + struct rtable *rt; /* Route to the other host */ + struct net_device *tdev; /* Device to other host */ + struct iphdr *old_iph = skb->nh.iph; + u8 tos = old_iph->tos; + u16 df = old_iph->frag_off; + struct iphdr *iph; /* Our new IP header */ + int max_headroom; /* The extra header space needed */ + int mtu; + + EnterFunction(10); + + if (skb->protocol != __constant_htons(ETH_P_IP)) { + IP_VS_DBG_RL("ip_vs_tunnel_xmit(): protocol error, " + "ETH_P_IP: %d, skb protocol: %d\n", + __constant_htons(ETH_P_IP), skb->protocol); + goto tx_error; + } + + if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(tos)))) + goto tx_error_icmp; + + tdev = rt->u.dst.dev; + + mtu = rt->u.dst.pmtu - sizeof(struct iphdr); + if (mtu < 68) { + ip_rt_put(rt); + IP_VS_DBG_RL("ip_vs_tunnel_xmit(): mtu less than 68\n"); + goto tx_error; + } + if (skb->dst && mtu < skb->dst->pmtu) + skb->dst->pmtu = mtu; + + df |= (old_iph->frag_off&__constant_htons(IP_DF)); + + if ((old_iph->frag_off&__constant_htons(IP_DF)) + && mtu < ntohs(old_iph->tot_len)) { + icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); + ip_rt_put(rt); + IP_VS_DBG_RL("ip_vs_tunnel_xmit(): frag needed\n"); + goto tx_error; + } + + /* update checksum because skb might be defragmented */ + ip_send_check(old_iph); + + skb->h.raw = skb->nh.raw; + + /* + * Okay, now see if we can stuff it in the buffer as-is. + */ + max_headroom = (((tdev->hard_header_len+15)&~15)+sizeof(struct iphdr)); + + if (skb_headroom(skb) < max_headroom + || skb_cloned(skb) || skb_shared(skb)) { + struct sk_buff *new_skb = + skb_realloc_headroom(skb, max_headroom); + if (!new_skb) { + ip_rt_put(rt); + IP_VS_ERR_RL("ip_vs_tunnel_xmit(): no memory\n"); + return NF_DROP; + } + kfree_skb(skb); + skb = new_skb; + old_iph = skb->nh.iph; + } + + skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); + + /* drop old route */ + dst_release(skb->dst); + skb->dst = &rt->u.dst; + + /* + * Push down and install the IPIP header. + */ + iph = skb->nh.iph; + iph->version = 4; + iph->ihl = sizeof(struct iphdr)>>2; + iph->frag_off = df; + iph->protocol = IPPROTO_IPIP; + iph->tos = tos; + iph->daddr = rt->rt_dst; + iph->saddr = rt->rt_src; + iph->ttl = old_iph->ttl; + iph->tot_len = htons(skb->len); + ip_select_ident(iph, &rt->u.dst, NULL); + ip_send_check(iph); + + skb->ip_summed = CHECKSUM_NONE; +#ifdef CONFIG_NETFILTER_DEBUG + skb->nf_debug = 1 << NF_IP_LOCAL_OUT; +#endif /* CONFIG_NETFILTER_DEBUG */ + skb->nfcache |= NFC_IPVS_PROPERTY; + ip_send(skb); + + LeaveFunction(10); + + return NF_STOLEN; + + tx_error_icmp: + dst_link_failure(skb); + tx_error: + kfree_skb(skb); + return NF_STOLEN; +} + + +/* + * Direct Routing transmitter + */ +static int ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp) +{ + struct rtable *rt; /* Route to the other host */ + struct iphdr *iph = skb->nh.iph; + int mtu; + + EnterFunction(10); + + if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(iph->tos)))) + goto tx_error_icmp; + + /* MTU checking */ + mtu = rt->u.dst.pmtu; + if ((iph->frag_off&__constant_htons(IP_DF)) && skb->len > mtu) { + icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); + ip_rt_put(rt); + IP_VS_DBG_RL("ip_vs_dr_xmit(): frag needed\n"); + goto tx_error; + } + + /* update checksum because skb might be defragmented */ + ip_send_check(iph); + + if (unlikely(skb_headroom(skb) < rt->u.dst.dev->hard_header_len)) { + if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) { + ip_rt_put(rt); + IP_VS_ERR_RL("ip_vs_dr_xmit(): no memory\n"); + goto tx_error; + } + } + + /* drop old route */ + dst_release(skb->dst); + skb->dst = &rt->u.dst; + +#ifdef CONFIG_NETFILTER_DEBUG + skb->nf_debug = 1 << NF_IP_LOCAL_OUT; +#endif /* CONFIG_NETFILTER_DEBUG */ + skb->nfcache |= NFC_IPVS_PROPERTY; + ip_send(skb); + +#if 0000 + NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev, + do_ip_send); +#endif + LeaveFunction(10); + return NF_STOLEN; + + tx_error_icmp: + dst_link_failure(skb); + tx_error: + kfree_skb(skb); + return NF_STOLEN; +} + + +/* + * Bind a connection entry with the corresponding packet_xmit. + * Called by ip_vs_conn_new. + */ +static inline void ip_vs_bind_xmit(struct ip_vs_conn *cp) +{ + switch (IP_VS_FWD_METHOD(cp)) { + case IP_VS_CONN_F_MASQ: + cp->packet_xmit = ip_vs_nat_xmit; + break; + + case IP_VS_CONN_F_TUNNEL: + cp->packet_xmit = ip_vs_tunnel_xmit; + break; + + case IP_VS_CONN_F_DROUTE: + cp->packet_xmit = ip_vs_dr_xmit; + break; + + case IP_VS_CONN_F_LOCALNODE: + cp->packet_xmit = ip_vs_null_xmit; + break; + + case IP_VS_CONN_F_BYPASS: + cp->packet_xmit = ip_vs_bypass_xmit; + break; + } +} + + +/* + * Bind a connection entry with a virtual service destination + * Called just after a new connection entry is created. + */ +static inline void +ip_vs_bind_dest(struct ip_vs_conn *cp, struct ip_vs_dest *dest) +{ + /* if dest is NULL, then return directly */ + if (!dest) + return; + + /* Increase the refcnt counter of the dest */ + atomic_inc(&dest->refcnt); + + /* Bind with the destination and its corresponding transmitter */ + cp->flags |= atomic_read(&dest->conn_flags); + cp->dest = dest; + + IP_VS_DBG(9, "Bind-dest %s c:%u.%u.%u.%u:%d v:%u.%u.%u.%u:%d " + "d:%u.%u.%u.%u:%d fwd:%c s:%s flg:%X cnt:%d destcnt:%d\n", + ip_vs_proto_name(cp->protocol), + NIPQUAD(cp->caddr), ntohs(cp->cport), + NIPQUAD(cp->vaddr), ntohs(cp->vport), + NIPQUAD(cp->daddr), ntohs(cp->dport), + ip_vs_fwd_tag(cp), ip_vs_state_name(cp->state), + cp->flags, atomic_read(&cp->refcnt), + atomic_read(&dest->refcnt)); +} + + +/* + * Unbind a connection entry with its VS destination + * Called by the ip_vs_conn_expire function. + */ +static inline void ip_vs_unbind_dest(struct ip_vs_conn *cp) +{ + struct ip_vs_dest *dest = cp->dest; + + /* if dest is NULL, then return directly */ + if (!dest) + return; + + IP_VS_DBG(9, "Unbind-dest %s c:%u.%u.%u.%u:%d " + "v:%u.%u.%u.%u:%d d:%u.%u.%u.%u:%d fwd:%c " + "s:%s flg:%X cnt:%d destcnt:%d", + ip_vs_proto_name(cp->protocol), + NIPQUAD(cp->caddr), ntohs(cp->cport), + NIPQUAD(cp->vaddr), ntohs(cp->vport), + NIPQUAD(cp->daddr), ntohs(cp->dport), + ip_vs_fwd_tag(cp), ip_vs_state_name(cp->state), + cp->flags, atomic_read(&cp->refcnt), + atomic_read(&dest->refcnt)); + + /* + * Decrease the inactconns or activeconns counter + * if it is not a connection template ((cp->cport!=0) + * || (cp->flags & IP_VS_CONN_F_NO_CPORT)). + */ + if (cp->cport || (cp->flags & IP_VS_CONN_F_NO_CPORT)) { + if (cp->flags & IP_VS_CONN_F_INACTIVE) { + atomic_dec(&dest->inactconns); + } else { + atomic_dec(&dest->activeconns); + } + } + + /* + * Simply decrease the refcnt of the dest, because the + * dest will be either in service's destination list + * or in the trash. + */ + atomic_dec(&dest->refcnt); +} + + +/* + * Checking if the destination of a connection template is available. + * If available, return 1, otherwise invalidate this connection + * template and return 0. + */ +int ip_vs_check_template(struct ip_vs_conn *ct) +{ + struct ip_vs_dest *dest = ct->dest; + + /* + * Checking the dest server status. + */ + if ((dest == NULL) || + !(dest->flags & IP_VS_DEST_F_AVAILABLE)) { + IP_VS_DBG(9, "check_template: dest not available for " + "protocol %s s:%u.%u.%u.%u:%d v:%u.%u.%u.%u:%d " + "-> d:%u.%u.%u.%u:%d\n", + ip_vs_proto_name(ct->protocol), + NIPQUAD(ct->caddr), ntohs(ct->cport), + NIPQUAD(ct->vaddr), ntohs(ct->vport), + NIPQUAD(ct->daddr), ntohs(ct->dport)); + + /* + * Invalidate the connection template + */ + ip_vs_conn_unhash(ct); + ct->dport = 65535; + ct->vport = 65535; + ct->cport = 0; + ip_vs_conn_hash(ct); + + /* + * Simply decrease the refcnt of the template, + * don't restart its timer. + */ + atomic_dec(&ct->refcnt); + return 0; + } + return 1; +} + + +static inline void +ip_vs_timeout_attach(struct ip_vs_conn *cp, struct ip_vs_timeout_table *vstim) +{ + atomic_inc(&vstim->refcnt); + cp->timeout_table = vstim; +} + +static inline void ip_vs_timeout_detach(struct ip_vs_conn *cp) +{ + struct ip_vs_timeout_table *vstim = cp->timeout_table; + + if (!vstim) + return; + cp->timeout_table = NULL; + atomic_dec(&vstim->refcnt); +} + + +static void ip_vs_conn_expire(unsigned long data) +{ + struct ip_vs_conn *cp = (struct ip_vs_conn *)data; + + if (cp->timeout_table) + cp->timeout = cp->timeout_table->timeout[IP_VS_S_TIME_WAIT]; + else + cp->timeout = vs_timeout_table.timeout[IP_VS_S_TIME_WAIT]; + + /* + * hey, I'm using it + */ + atomic_inc(&cp->refcnt); + + /* + * do I control anybody? + */ + if (atomic_read(&cp->n_control)) + goto expire_later; + + /* + * unhash it if it is hashed in the conn table + */ + ip_vs_conn_unhash(cp); + + /* + * refcnt==1 implies I'm the only one referrer + */ + if (likely(atomic_read(&cp->refcnt) == 1)) { + /* make sure that there is no timer on it now */ + if (timer_pending(&cp->timer)) + del_timer(&cp->timer); + + /* does anybody control me? */ + if (cp->control) + ip_vs_control_del(cp); + + ip_vs_unbind_dest(cp); + ip_vs_unbind_app(cp); + ip_vs_timeout_detach(cp); + if (cp->flags & IP_VS_CONN_F_NO_CPORT) + atomic_dec(&ip_vs_conn_no_cport_cnt); + atomic_dec(&ip_vs_conn_count); + + kmem_cache_free(ip_vs_conn_cachep, cp); + return; + } + + /* hash it back to the table */ + ip_vs_conn_hash(cp); + + expire_later: + IP_VS_DBG(7, "delayed: refcnt-1=%d conn.n_control=%d\n", + atomic_read(&cp->refcnt)-1, + atomic_read(&cp->n_control)); + + ip_vs_conn_put(cp); +} + + +void ip_vs_conn_expire_now(struct ip_vs_conn *cp) +{ + cp->timeout = 0; + mod_timer(&cp->timer, jiffies); + __ip_vs_conn_put(cp); +} + +/* + * Create a new connection entry and hash it into the ip_vs_conn_tab. + */ +struct ip_vs_conn * +ip_vs_conn_new(int proto, __u32 caddr, __u16 cport, __u32 vaddr, __u16 vport, + __u32 daddr, __u16 dport, unsigned flags, + struct ip_vs_dest *dest) +{ + struct ip_vs_conn *cp; + + cp = kmem_cache_alloc(ip_vs_conn_cachep, GFP_ATOMIC); + if (cp == NULL) { + IP_VS_ERR_RL("ip_vs_conn_new: no memory available.\n"); + return NULL; + } + + memset(cp, 0, sizeof(*cp)); + INIT_LIST_HEAD(&cp->c_list); + init_timer(&cp->timer); + cp->timer.data = (unsigned long)cp; + cp->timer.function = ip_vs_conn_expire; + ip_vs_timeout_attach(cp, ip_vs_timeout_table); + cp->protocol = proto; + cp->caddr = caddr; + cp->cport = cport; + cp->vaddr = vaddr; + cp->vport = vport; + cp->daddr = daddr; + cp->dport = dport; + cp->flags = flags; + cp->app_data = NULL; + cp->control = NULL; + cp->lock = SPIN_LOCK_UNLOCKED; + + atomic_set(&cp->n_control, 0); + atomic_set(&cp->in_pkts, 0); + + atomic_inc(&ip_vs_conn_count); + if (flags & IP_VS_CONN_F_NO_CPORT) + atomic_inc(&ip_vs_conn_no_cport_cnt); + + /* Bind its application helper (only for VS/NAT) if any */ + ip_vs_bind_app(cp); + + /* Bind the connection with a destination server */ + ip_vs_bind_dest(cp, dest); + + /* Set its state and timeout */ + vs_set_state_timeout(cp, IP_VS_S_NONE); + + /* Bind its packet transmitter */ + ip_vs_bind_xmit(cp); + + /* + * Set the entry is referenced by the current thread before hashing + * it in the table, so that other thread run ip_vs_random_dropentry + * but cannot drop this entry. + */ + atomic_set(&cp->refcnt, 1); + + /* Hash it in the ip_vs_conn_tab finally */ + ip_vs_conn_hash(cp); + + return cp; +} + + +/* + * /proc/net/ip_vs_conn entries + */ +static int +ip_vs_conn_getinfo(char *buffer, char **start, off_t offset, int length) +{ + off_t pos=0; + int idx, len=0; + char temp[70]; + struct ip_vs_conn *cp; + struct list_head *l, *e; + + pos = 128; + if (pos > offset) { + len += sprintf(buffer+len, "%-127s\n", + "Pro FromIP FPrt ToIP TPrt DestIP DPrt State Expires"); + } + + for(idx = 0; idx < IP_VS_CONN_TAB_SIZE; idx++) { + /* + * Lock is actually only need in next loop + * we are called from uspace: must stop bh. + */ + ct_read_lock_bh(idx); + + l = &ip_vs_conn_tab[idx]; + for (e=l->next; e!=l; e=e->next) { + cp = list_entry(e, struct ip_vs_conn, c_list); + pos += 128; + if (pos <= offset) + continue; + sprintf(temp, + "%-3s %08X %04X %08X %04X %08X %04X %-11s %7lu", + ip_vs_proto_name(cp->protocol), + ntohl(cp->caddr), ntohs(cp->cport), + ntohl(cp->vaddr), ntohs(cp->vport), + ntohl(cp->daddr), ntohs(cp->dport), + ip_vs_state_name(cp->state), + (cp->timer.expires-jiffies)/HZ); + len += sprintf(buffer+len, "%-127s\n", temp); + if (pos >= offset+length) { + ct_read_unlock_bh(idx); + goto done; + } + } + ct_read_unlock_bh(idx); + } + + done: + *start = buffer+len-(pos-offset); /* Start of wanted data */ + len = pos-offset; + if (len > length) + len = length; + if (len < 0) + len = 0; + return len; +} + + +/* + * Randomly drop connection entries before running out of memory + */ +static inline int todrop_entry(struct ip_vs_conn *cp) +{ + /* + * The drop rate array needs tuning for real environments. + * Called from timer bh only => no locking + */ + static char todrop_rate[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; + static char todrop_counter[9] = {0}; + int i; + + /* if the conn entry hasn't lasted for 60 seconds, don't drop it. + This will leave enough time for normal connection to get + through. */ + if (cp->timeout+jiffies-cp->timer.expires < 60*HZ) + return 0; + + /* Don't drop the entry if its number of incoming packets is not + located in [0, 8] */ + i = atomic_read(&cp->in_pkts); + if (i > 8 || i < 0) return 0; + + if (!todrop_rate[i]) return 0; + if (--todrop_counter[i] > 0) return 0; + + todrop_counter[i] = todrop_rate[i]; + return 1; +} + + +void ip_vs_random_dropentry(void) +{ + int idx; + struct ip_vs_conn *cp; + struct list_head *l,*e; + struct ip_vs_conn *ct; + + /* + * Randomly scan 1/32 of the whole table every second + */ + for (idx=0; idx<(IP_VS_CONN_TAB_SIZE>>5); idx++) { + unsigned hash = net_random()&IP_VS_CONN_TAB_MASK; + + /* + * Lock is actually needed in this loop. + */ + ct_write_lock(hash); + + l = &ip_vs_conn_tab[hash]; + for (e=l->next; e!=l; e=e->next) { + cp = list_entry(e, struct ip_vs_conn, c_list); + if (!cp->cport && !(cp->flags & IP_VS_CONN_F_NO_CPORT)) + /* connection template */ + continue; + switch(cp->state) { + case IP_VS_S_SYN_RECV: + case IP_VS_S_SYNACK: + break; + + case IP_VS_S_ESTABLISHED: + case IP_VS_S_UDP: + if (todrop_entry(cp)) + break; + continue; + + default: + continue; + } + + /* + * Drop the entry, and drop its ct if not referenced + */ + atomic_inc(&cp->refcnt); + ct_write_unlock(hash); + + if ((ct = cp->control)) + atomic_inc(&ct->refcnt); + IP_VS_DBG(4, "del connection\n"); + ip_vs_conn_expire_now(cp); + if (ct) { + IP_VS_DBG(4, "del conn template\n"); + ip_vs_conn_expire_now(ct); + } + ct_write_lock(hash); + } + ct_write_unlock(hash); + } +} + + +/* + * Flush all the connection entries in the ip_vs_conn_tab + */ +static void ip_vs_conn_flush(void) +{ + int idx; + struct ip_vs_conn *cp; + struct list_head *l,*e; + struct ip_vs_conn *ct; + + flush_again: + for (idx=0; idxnext; e!=l; e=e->next) { + cp = list_entry(e, struct ip_vs_conn, c_list); + atomic_inc(&cp->refcnt); + ct_write_unlock(idx); + + if ((ct = cp->control)) + atomic_inc(&ct->refcnt); + IP_VS_DBG(4, "del connection\n"); + ip_vs_conn_expire_now(cp); + if (ct) { + IP_VS_DBG(4, "del conn template\n"); + ip_vs_conn_expire_now(ct); + } + ct_write_lock(idx); + } + ct_write_unlock_bh(idx); + } + + /* the counter may be not NULL, because maybe some conn entries + are run by slow timer handler or unhashed but still referred */ + if (atomic_read(&ip_vs_conn_count) != 0) { + schedule(); + goto flush_again; + } +} + + +int ip_vs_conn_init(void) +{ + int idx; + + /* + * Allocate the connection hash table and initialize its list heads + */ + ip_vs_conn_tab = vmalloc(IP_VS_CONN_TAB_SIZE*sizeof(struct list_head)); + if (!ip_vs_conn_tab) + return -ENOMEM; + + IP_VS_INFO("Connection hash table configured " + "(size=%d, memory=%ldKbytes)\n", + IP_VS_CONN_TAB_SIZE, + (long)(IP_VS_CONN_TAB_SIZE*sizeof(struct list_head))/1024); + IP_VS_DBG(0, "Each connection entry needs %d bytes at least\n", + sizeof(struct ip_vs_conn)); + + for (idx = 0; idx < IP_VS_CONN_TAB_SIZE; idx++) { + INIT_LIST_HEAD(&ip_vs_conn_tab[idx]); + } + + for (idx = 0; idx < CT_LOCKARRAY_SIZE; idx++) { + __ip_vs_conntbl_lock_array[idx].l = RW_LOCK_UNLOCKED; + } + + /* Allocate ip_vs_conn slab cache */ + ip_vs_conn_cachep = kmem_cache_create("ip_vs_conn", + sizeof(struct ip_vs_conn), 0, + SLAB_HWCACHE_ALIGN, NULL, NULL); + if (!ip_vs_conn_cachep) { + vfree(ip_vs_conn_tab); + return -ENOMEM; + } + + proc_net_create("ip_vs_conn", 0, ip_vs_conn_getinfo); + + /* calculate the random value for connection hash */ + get_random_bytes(&ip_vs_conn_rnd, sizeof(ip_vs_conn_rnd)); + + return 0; +} + +void ip_vs_conn_cleanup(void) +{ + /* flush all the connection entries first */ + ip_vs_conn_flush(); + + /* Release the empty cache */ + kmem_cache_destroy(ip_vs_conn_cachep); + proc_net_remove("ip_vs_conn"); + vfree(ip_vs_conn_tab); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_core.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_core.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_core.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_core.c 2003-10-22 22:47:51.000000000 +0000 @@ -0,0 +1,1284 @@ +/* + * IPVS An implementation of the IP virtual server support for the + * LINUX operating system. IPVS is now implemented as a module + * over the Netfilter framework. IPVS can be used to build a + * high-performance and highly available server based on a + * cluster of servers. + * + * Version: $Id: ip_vs_core.c,v 1.31.2.5 2003/07/29 14:37:12 wensong Exp $ + * + * Authors: Wensong Zhang + * Peter Kese + * Julian Anastasov + * + * 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. + * + * The IPVS code for kernel 2.2 was done by Wensong Zhang and Peter Kese, + * with changes/fixes from Julian Anastasov, Lars Marowsky-Bree, Horms + * and others. + * + * Changes: + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include /* for icmp_send */ +#include + +#include +#include + +#include + + +EXPORT_SYMBOL(register_ip_vs_scheduler); +EXPORT_SYMBOL(unregister_ip_vs_scheduler); +EXPORT_SYMBOL(ip_vs_skb_replace); +EXPORT_SYMBOL(ip_vs_proto_name); +EXPORT_SYMBOL(ip_vs_conn_new); +EXPORT_SYMBOL(ip_vs_conn_in_get); +EXPORT_SYMBOL(ip_vs_conn_out_get); +EXPORT_SYMBOL(ip_vs_conn_listen); +EXPORT_SYMBOL(ip_vs_conn_put); +#ifdef CONFIG_IP_VS_DEBUG +EXPORT_SYMBOL(ip_vs_get_debug_level); +#endif +EXPORT_SYMBOL(check_for_ip_vs_out); + + +/* ID used in ICMP lookups */ +#define icmp_id(icmph) ((icmph->un).echo.id) + +const char *ip_vs_proto_name(unsigned proto) +{ + static char buf[20]; + + switch (proto) { + case IPPROTO_IP: + return "IP"; + case IPPROTO_UDP: + return "UDP"; + case IPPROTO_TCP: + return "TCP"; + case IPPROTO_ICMP: + return "ICMP"; + default: + sprintf(buf, "IP_%d", proto); + return buf; + } +} + + +static inline void +ip_vs_in_stats(struct ip_vs_conn *cp, struct sk_buff *skb) +{ + struct ip_vs_dest *dest = cp->dest; + if (dest && (dest->flags & IP_VS_DEST_F_AVAILABLE)) { + spin_lock(&dest->stats.lock); + dest->stats.inpkts++; + dest->stats.inbytes += skb->len; + spin_unlock(&dest->stats.lock); + + spin_lock(&dest->svc->stats.lock); + dest->svc->stats.inpkts++; + dest->svc->stats.inbytes += skb->len; + spin_unlock(&dest->svc->stats.lock); + + spin_lock(&ip_vs_stats.lock); + ip_vs_stats.inpkts++; + ip_vs_stats.inbytes += skb->len; + spin_unlock(&ip_vs_stats.lock); + } +} + + +static inline void +ip_vs_out_stats(struct ip_vs_conn *cp, struct sk_buff *skb) +{ + struct ip_vs_dest *dest = cp->dest; + if (dest && (dest->flags & IP_VS_DEST_F_AVAILABLE)) { + spin_lock(&dest->stats.lock); + dest->stats.outpkts++; + dest->stats.outbytes += skb->len; + spin_unlock(&dest->stats.lock); + + spin_lock(&dest->svc->stats.lock); + dest->svc->stats.outpkts++; + dest->svc->stats.outbytes += skb->len; + spin_unlock(&dest->svc->stats.lock); + + spin_lock(&ip_vs_stats.lock); + ip_vs_stats.outpkts++; + ip_vs_stats.outbytes += skb->len; + spin_unlock(&ip_vs_stats.lock); + } +} + + +static inline void +ip_vs_conn_stats(struct ip_vs_conn *cp, struct ip_vs_service *svc) +{ + spin_lock(&cp->dest->stats.lock); + cp->dest->stats.conns++; + spin_unlock(&cp->dest->stats.lock); + + spin_lock(&svc->stats.lock); + svc->stats.conns++; + spin_unlock(&svc->stats.lock); + + spin_lock(&ip_vs_stats.lock); + ip_vs_stats.conns++; + spin_unlock(&ip_vs_stats.lock); +} + +/* + * IPVS persistent scheduling function + * It creates a connection entry according to its template if exists, + * or selects a server and creates a connection entry plus a template. + * Locking: we are svc user (svc->refcnt), so we hold all dests too + */ +static struct ip_vs_conn * +ip_vs_sched_persist(struct ip_vs_service *svc, struct iphdr *iph) +{ + struct ip_vs_conn *cp = NULL; + struct ip_vs_dest *dest; + const __u16 *portp; + struct ip_vs_conn *ct; + __u16 dport; /* destination port to forward */ + __u32 snet; /* source network of the client, after masking */ + + portp = (__u16 *)&(((char *)iph)[iph->ihl*4]); + + /* Mask saddr with the netmask to adjust template granularity */ + snet = iph->saddr & svc->netmask; + + IP_VS_DBG(6, "P-schedule: src %u.%u.%u.%u:%u dest %u.%u.%u.%u:%u " + "mnet %u.%u.%u.%u\n", + NIPQUAD(iph->saddr), ntohs(portp[0]), + NIPQUAD(iph->daddr), ntohs(portp[1]), + NIPQUAD(snet)); + + /* + * As far as we know, FTP is a very complicated network protocol, and + * it uses control connection and data connections. For active FTP, + * FTP server initialize data connection to the client, its source port + * is often 20. For passive FTP, FTP server tells the clients the port + * that it passively listens to, and the client issues the data + * connection. In the tunneling or direct routing mode, the load + * balancer is on the client-to-server half of connection, the port + * number is unknown to the load balancer. So, a conn template like + * is created for persistent FTP + * service, and a template like + * is created for other persistent services. + */ + if (portp[1] == svc->port) { + /* Check if a template already exists */ + if (svc->port != FTPPORT) + ct = ip_vs_conn_in_get(iph->protocol, snet, 0, + iph->daddr, portp[1]); + else + ct = ip_vs_conn_in_get(iph->protocol, snet, 0, + iph->daddr, 0); + + if (!ct || !ip_vs_check_template(ct)) { + /* + * No template found or the dest of the connection + * template is not available. + */ + dest = svc->scheduler->schedule(svc, iph); + if (dest == NULL) { + IP_VS_DBG(1, "P-schedule: no dest found.\n"); + return NULL; + } + + /* + * Create a template like for non-ftp service, + * and + * for ftp service. + */ + if (svc->port != FTPPORT) + ct = ip_vs_conn_new(iph->protocol, + snet, 0, + iph->daddr, portp[1], + dest->addr, dest->port, + 0, + dest); + else + ct = ip_vs_conn_new(iph->protocol, + snet, 0, + iph->daddr, 0, + dest->addr, 0, + 0, + dest); + if (ct == NULL) + return NULL; + + ct->timeout = svc->timeout; + } else { + /* set destination with the found template */ + dest = ct->dest; + } + dport = dest->port; + } else { + /* + * Note: persistent fwmark-based services and persistent + * port zero service are handled here. + * fwmark template: + * port zero template: + */ + if (svc->fwmark) + ct = ip_vs_conn_in_get(IPPROTO_IP, snet, 0, + htonl(svc->fwmark), 0); + else + ct = ip_vs_conn_in_get(iph->protocol, snet, 0, + iph->daddr, 0); + + if (!ct || !ip_vs_check_template(ct)) { + /* + * If it is not persistent port zero, return NULL, + * otherwise create a connection template. + */ + if (svc->port) + return NULL; + + dest = svc->scheduler->schedule(svc, iph); + if (dest == NULL) { + IP_VS_DBG(1, "P-schedule: no dest found.\n"); + return NULL; + } + + /* + * Create a template according to the service + */ + if (svc->fwmark) + ct = ip_vs_conn_new(IPPROTO_IP, + snet, 0, + htonl(svc->fwmark), 0, + dest->addr, 0, + 0, + dest); + else + ct = ip_vs_conn_new(iph->protocol, + snet, 0, + iph->daddr, 0, + dest->addr, 0, + 0, + dest); + if (ct == NULL) + return NULL; + + ct->timeout = svc->timeout; + } else { + /* set destination with the found template */ + dest = ct->dest; + } + dport = portp[1]; + } + + /* + * Create a new connection according to the template + */ + cp = ip_vs_conn_new(iph->protocol, + iph->saddr, portp[0], + iph->daddr, portp[1], + dest->addr, dport, + 0, + dest); + if (cp == NULL) { + ip_vs_conn_put(ct); + return NULL; + } + + /* + * Increase the inactive connection counter + * because it is in Syn-Received + * state (inactive) when the connection is created. + */ + atomic_inc(&dest->inactconns); + + /* + * Add its control + */ + ip_vs_control_add(cp, ct); + + ip_vs_conn_put(ct); + return cp; +} + + +/* + * IPVS main scheduling function + * It selects a server according to the virtual service, and + * creates a connection entry. + */ +static struct ip_vs_conn * +ip_vs_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + struct ip_vs_conn *cp = NULL; + struct ip_vs_dest *dest; + const __u16 *portp; + + /* + * Persistent service + */ + if (svc->flags & IP_VS_SVC_F_PERSISTENT) + return ip_vs_sched_persist(svc, iph); + + /* + * Non-persistent service + */ + portp = (__u16 *)&(((char *)iph)[iph->ihl*4]); + if (!svc->fwmark && portp[1] != svc->port) { + if (!svc->port) + IP_VS_ERR("Schedule: port zero only supported " + "in persistent services, " + "check your ipvs configuration\n"); + return NULL; + } + + dest = svc->scheduler->schedule(svc, iph); + if (dest == NULL) { + IP_VS_DBG(1, "Schedule: no dest found.\n"); + return NULL; + } + + /* + * Create a connection entry. + */ + cp = ip_vs_conn_new(iph->protocol, + iph->saddr, portp[0], + iph->daddr, portp[1], + dest->addr, dest->port?dest->port:portp[1], + 0, + dest); + if (cp == NULL) + return NULL; + + /* + * Increase the inactive connection counter because it is in + * Syn-Received state (inactive) when the connection is created. + */ + atomic_inc(&dest->inactconns); + + IP_VS_DBG(6, "Schedule fwd:%c s:%s c:%u.%u.%u.%u:%u v:%u.%u.%u.%u:%u " + "d:%u.%u.%u.%u:%u flg:%X cnt:%d\n", + ip_vs_fwd_tag(cp), ip_vs_state_name(cp->state), + NIPQUAD(cp->caddr), ntohs(cp->cport), + NIPQUAD(cp->vaddr), ntohs(cp->vport), + NIPQUAD(cp->daddr), ntohs(cp->dport), + cp->flags, atomic_read(&cp->refcnt)); + + return cp; +} + + +/* + * Pass or drop the packet. + * Called by ip_vs_in, when the virtual service is available but + * no destination is available for a new connection. + */ +static int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb) +{ + struct iphdr *iph = skb->nh.iph; + __u16 *portp = (__u16 *)&(((char *)iph)[iph->ihl*4]); + + /* if it is fwmark-based service, the cache_bypass sysctl is up + and the destination is RTN_UNICAST (and not local), then create + a cache_bypass connection entry */ + if (sysctl_ip_vs_cache_bypass && svc->fwmark + && (inet_addr_type(iph->daddr) == RTN_UNICAST)) { + int ret; + struct ip_vs_conn *cp; + + ip_vs_service_put(svc); + + /* create a new connection entry */ + IP_VS_DBG(6, "ip_vs_leave: create a cache_bypass entry\n"); + cp = ip_vs_conn_new(iph->protocol, + iph->saddr, portp[0], + iph->daddr, portp[1], + 0, 0, + IP_VS_CONN_F_BYPASS, + NULL); + if (cp == NULL) { + kfree_skb(skb); + return NF_STOLEN; + } + + /* statistics */ + ip_vs_in_stats(cp, skb); + + /* set state */ + ip_vs_set_state(cp, VS_STATE_INPUT, iph, portp); + + /* transmit the first SYN packet */ + ret = cp->packet_xmit(skb, cp); + + atomic_inc(&cp->in_pkts); + ip_vs_conn_put(cp); + return ret; + } + + /* + * When the virtual ftp service is presented, packets destined + * for other services on the VIP may get here (except services + * listed in the ipvs table), pass the packets, because it is + * not ipvs job to decide to drop the packets. + */ + if ((svc->port == FTPPORT) && (portp[1] != FTPPORT)) { + ip_vs_service_put(svc); + return NF_ACCEPT; + } + + ip_vs_service_put(svc); + + /* + * Notify the client that the destination is unreachable, and + * release the socket buffer. + * Since it is in IP layer, the TCP socket is not actually + * created, the TCP RST packet cannot be sent, instead that + * ICMP_PORT_UNREACH is sent here no matter it is TCP/UDP. --WZ + */ + icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); + kfree_skb(skb); + return NF_STOLEN; +} + + +/* + * It is hooked before NF_IP_PRI_NAT_SRC at the NF_IP_POST_ROUTING + * chain, and is used for VS/NAT. + * It detects packets for VS/NAT connections and sends the packets + * immediately. This can avoid that iptable_nat mangles the packets + * for VS/NAT. + */ +static unsigned int ip_vs_post_routing(unsigned int hooknum, + struct sk_buff **skb_p, + const struct net_device *in, + const struct net_device *out, + int (*okfn)(struct sk_buff *)) +{ + struct sk_buff *skb = *skb_p; + + if (!(skb->nfcache & NFC_IPVS_PROPERTY)) + return NF_ACCEPT; + + /* The packet was sent from IPVS, exit this chain */ + (*okfn)(skb); + + return NF_STOLEN; +} + + +/* + * Handle ICMP messages in the inside-to-outside direction (outgoing). + * Find any that might be relevant, check against existing connections, + * forward to the right destination host if relevant. + * Currently handles error types - unreachable, quench, ttl exceeded. + * (Only used in VS/NAT) + */ +static int ip_vs_out_icmp(struct sk_buff **skb_p) +{ + struct sk_buff *skb = *skb_p; + struct iphdr *iph; + struct icmphdr *icmph; + struct iphdr *ciph; /* The ip header contained within the ICMP */ + __u16 *pptr; /* port numbers from TCP/UDP contained header */ + unsigned short ihl; + unsigned short len; + unsigned short clen, csize; + struct ip_vs_conn *cp; + + /* reassemble IP fragments, but will it happen in ICMP packets?? */ + if (skb->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { + skb = ip_defrag(skb); + if (!skb) + return NF_STOLEN; + *skb_p = skb; + } + + if (skb_is_nonlinear(skb)) { + if (skb_linearize(skb, GFP_ATOMIC) != 0) + return NF_DROP; + ip_send_check(skb->nh.iph); + } + + iph = skb->nh.iph; + ihl = iph->ihl << 2; + icmph = (struct icmphdr *)((char *)iph + ihl); + len = ntohs(iph->tot_len) - ihl; + if (len < sizeof(struct icmphdr)) + return NF_DROP; + + IP_VS_DBG(12, "outgoing ICMP (%d,%d) %u.%u.%u.%u->%u.%u.%u.%u\n", + icmph->type, ntohs(icmp_id(icmph)), + NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); + + /* + * Work through seeing if this is for us. + * These checks are supposed to be in an order that means easy + * things are checked first to speed up processing.... however + * this means that some packets will manage to get a long way + * down this stack and then be rejected, but that's life. + */ + if ((icmph->type != ICMP_DEST_UNREACH) && + (icmph->type != ICMP_SOURCE_QUENCH) && + (icmph->type != ICMP_TIME_EXCEEDED)) + return NF_ACCEPT; + + /* Now find the contained IP header */ + clen = len - sizeof(struct icmphdr); + if (clen < sizeof(struct iphdr)) + return NF_DROP; + ciph = (struct iphdr *) (icmph + 1); + csize = ciph->ihl << 2; + if (clen < csize) + return NF_DROP; + + /* We are only interested ICMPs generated from TCP or UDP packets */ + if (ciph->protocol != IPPROTO_UDP && ciph->protocol != IPPROTO_TCP) + return NF_ACCEPT; + + /* Skip non-first embedded TCP/UDP fragments */ + if (ciph->frag_off & __constant_htons(IP_OFFSET)) + return NF_ACCEPT; + + /* We need at least TCP/UDP ports here */ + if (clen < csize + sizeof(struct udphdr)) + return NF_DROP; + + /* + * Find the ports involved - this packet was + * incoming so the ports are right way round + * (but reversed relative to outer IP header!) + */ + pptr = (__u16 *)&(((char *)ciph)[csize]); + + /* Ensure the checksum is correct */ + if (ip_compute_csum((unsigned char *) icmph, len)) { + /* Failed checksum! */ + IP_VS_DBG(1, "forward ICMP: failed checksum from %d.%d.%d.%d!\n", + NIPQUAD(iph->saddr)); + return NF_DROP; + } + + IP_VS_DBG(11, "Handling outgoing ICMP for " + "%u.%u.%u.%u:%d -> %u.%u.%u.%u:%d\n", + NIPQUAD(ciph->saddr), ntohs(pptr[0]), + NIPQUAD(ciph->daddr), ntohs(pptr[1])); + + /* ciph content is actually */ + cp = ip_vs_conn_out_get(ciph->protocol, ciph->daddr, pptr[1], + ciph->saddr, pptr[0]); + if (!cp) + return NF_ACCEPT; + + if (IP_VS_FWD_METHOD(cp) != 0) { + IP_VS_ERR("shouldn't reach here, because the box is on the" + "half connection in the tun/dr module.\n"); + } + + /* Now we do real damage to this packet...! */ + /* First change the source IP address, and recalc checksum */ + iph->saddr = cp->vaddr; + ip_send_check(iph); + + /* Now change the *dest* address in the contained IP */ + ciph->daddr = cp->vaddr; + ip_send_check(ciph); + + /* the TCP/UDP dest port - cannot redo check */ + pptr[1] = cp->vport; + + /* And finally the ICMP checksum */ + icmph->checksum = 0; + icmph->checksum = ip_compute_csum((unsigned char *) icmph, len); + skb->ip_summed = CHECKSUM_UNNECESSARY; + + /* do the statistics and put it back */ + ip_vs_out_stats(cp, skb); + ip_vs_conn_put(cp); + + IP_VS_DBG(11, "Forwarding correct outgoing ICMP to " + "%u.%u.%u.%u:%d -> %u.%u.%u.%u:%d\n", + NIPQUAD(ciph->saddr), ntohs(pptr[0]), + NIPQUAD(ciph->daddr), ntohs(pptr[1])); + + skb->nfcache |= NFC_IPVS_PROPERTY; + + return NF_ACCEPT; +} + + +/* + * It is hooked at the NF_IP_FORWARD chain, used only for VS/NAT. + * Check if outgoing packet belongs to the established ip_vs_conn, + * rewrite addresses of the packet and send it on its way... + */ +static unsigned int ip_vs_out(unsigned int hooknum, + struct sk_buff **skb_p, + const struct net_device *in, + const struct net_device *out, + int (*okfn)(struct sk_buff *)) +{ + struct sk_buff *skb = *skb_p; + struct iphdr *iph; + union ip_vs_tphdr h; + struct ip_vs_conn *cp; + int size; + int ihl; + + EnterFunction(11); + + if (skb->nfcache & NFC_IPVS_PROPERTY) + return NF_ACCEPT; + + iph = skb->nh.iph; + if (iph->protocol == IPPROTO_ICMP) + return ip_vs_out_icmp(skb_p); + + /* let it go if other IP protocols */ + if (iph->protocol != IPPROTO_TCP && iph->protocol != IPPROTO_UDP) + return NF_ACCEPT; + + /* reassemble IP fragments */ + if (iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { + skb = ip_defrag(skb); + if (!skb) + return NF_STOLEN; + iph = skb->nh.iph; + *skb_p = skb; + } + + /* make sure that protocol header available in skb data area, + note that skb data area may be reallocated. */ + ihl = iph->ihl << 2; + if (ip_vs_header_check(skb, iph->protocol, ihl) == -1) + return NF_DROP; + + iph = skb->nh.iph; + h.raw = (char*) iph + ihl; + + /* + * Check if the packet belongs to an old entry + */ + cp = ip_vs_conn_out_get(iph->protocol, iph->saddr, h.portp[0], + iph->daddr, h.portp[1]); + if (!cp) { + if (sysctl_ip_vs_nat_icmp_send && + ip_vs_lookup_real_service(iph->protocol, + iph->saddr, h.portp[0])) { + /* + * Notify the real server: there is no existing + * entry if it is not RST packet or not TCP packet. + */ + if (!h.th->rst || iph->protocol != IPPROTO_TCP) { + icmp_send(skb, ICMP_DEST_UNREACH, + ICMP_PORT_UNREACH, 0); + kfree_skb(skb); + return NF_STOLEN; + } + } + IP_VS_DBG(12, "packet for %s %d.%d.%d.%d:%d " + "continue traversal as normal.\n", + ip_vs_proto_name(iph->protocol), + NIPQUAD(iph->daddr), + ntohs(h.portp[1])); + if (skb_is_nonlinear(skb)) + ip_send_check(iph); + return NF_ACCEPT; + } + + /* + * If it has ip_vs_app helper, the helper may change the payload, + * so it needs full checksum checking and checksum calculation. + * If not, only the header (addr/port) is changed, so it is fast + * to do incremental checksum update, and let the destination host + * do final checksum checking. + */ + + if (cp->app && skb_is_nonlinear(skb)) { + if (skb_linearize(skb, GFP_ATOMIC) != 0) { + ip_vs_conn_put(cp); + return NF_DROP; + } + iph = skb->nh.iph; + h.raw = (char*) iph + ihl; + } + + size = skb->len - ihl; + IP_VS_DBG(11, "O-pkt: %s size=%d\n", + ip_vs_proto_name(iph->protocol), size); + + /* do TCP/UDP checksum checking if it has application helper */ + if (cp->app && (iph->protocol != IPPROTO_UDP || h.uh->check != 0)) { + switch (skb->ip_summed) { + case CHECKSUM_NONE: + skb->csum = csum_partial(h.raw, size, 0); + case CHECKSUM_HW: + if (csum_tcpudp_magic(iph->saddr, iph->daddr, size, + iph->protocol, skb->csum)) { + ip_vs_conn_put(cp); + IP_VS_DBG_RL("Outgoing failed %s checksum " + "from %d.%d.%d.%d (size=%d)!\n", + ip_vs_proto_name(iph->protocol), + NIPQUAD(iph->saddr), + size); + return NF_DROP; + } + break; + default: + /* CHECKSUM_UNNECESSARY */ + break; + } + } + + IP_VS_DBG(11, "Outgoing %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d\n", + ip_vs_proto_name(iph->protocol), + NIPQUAD(iph->saddr), ntohs(h.portp[0]), + NIPQUAD(iph->daddr), ntohs(h.portp[1])); + + /* mangle the packet */ + iph->saddr = cp->vaddr; + h.portp[0] = cp->vport; + + /* + * Call application helper if needed + */ + if (ip_vs_app_pkt_out(cp, skb) != 0) { + /* skb data has probably changed, update pointers */ + iph = skb->nh.iph; + h.raw = (char*)iph + ihl; + size = skb->len - ihl; + } + + /* + * Adjust TCP/UDP checksums + */ + if (!cp->app && (iph->protocol != IPPROTO_UDP || h.uh->check != 0)) { + /* Only port and addr are changed, do fast csum update */ + ip_vs_fast_check_update(&h, cp->daddr, cp->vaddr, + cp->dport, cp->vport, iph->protocol); + if (skb->ip_summed == CHECKSUM_HW) + skb->ip_summed = CHECKSUM_NONE; + } else { + /* full checksum calculation */ + switch (iph->protocol) { + case IPPROTO_TCP: + h.th->check = 0; + skb->csum = csum_partial(h.raw, size, 0); + h.th->check = csum_tcpudp_magic(iph->saddr, iph->daddr, + size, iph->protocol, + skb->csum); + IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%d)\n", + ip_vs_proto_name(iph->protocol), h.th->check, + (char*)&(h.th->check) - (char*)h.raw); + break; + case IPPROTO_UDP: + h.uh->check = 0; + skb->csum = csum_partial(h.raw, size, 0); + h.uh->check = csum_tcpudp_magic(iph->saddr, iph->daddr, + size, iph->protocol, + skb->csum); + if (h.uh->check == 0) + h.uh->check = 0xFFFF; + IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%d)\n", + ip_vs_proto_name(iph->protocol), h.uh->check, + (char*)&(h.uh->check) - (char*)h.raw); + break; + } + } + ip_send_check(iph); + + ip_vs_out_stats(cp, skb); + ip_vs_set_state(cp, VS_STATE_OUTPUT, iph, h.portp); + ip_vs_conn_put(cp); + + skb->nfcache |= NFC_IPVS_PROPERTY; + + LeaveFunction(11); + return NF_ACCEPT; +} + + +/* + * Check if the packet is for VS/NAT connections, then send it + * immediately. + * Called by ip_fw_compact to detect packets for VS/NAT before + * they are changed by ipchains masquerading code. + */ +unsigned int check_for_ip_vs_out(struct sk_buff **skb_p, + int (*okfn)(struct sk_buff *)) +{ + unsigned int ret; + + ret = ip_vs_out(NF_IP_FORWARD, skb_p, NULL, NULL, NULL); + if (ret != NF_ACCEPT) { + return ret; + } else { + /* send the packet immediately if it is already mangled + by ip_vs_out */ + if ((*skb_p)->nfcache & NFC_IPVS_PROPERTY) { + (*okfn)(*skb_p); + return NF_STOLEN; + } + } + return NF_ACCEPT; +} + + +/* + * Handle ICMP messages in the outside-to-inside direction (incoming) + * and sometimes in outgoing direction from ip_vs_forward_icmp. + * Find any that might be relevant, check against existing connections, + * forward to the right destination host if relevant. + * Currently handles error types - unreachable, quench, ttl exceeded. + */ +static int ip_vs_in_icmp(struct sk_buff **skb_p) +{ + struct sk_buff *skb = *skb_p; + struct iphdr *iph; + struct icmphdr *icmph; + struct iphdr *ciph; /* The ip header contained within the ICMP */ + __u16 *pptr; /* port numbers from TCP/UDP contained header */ + unsigned short len; + unsigned short clen, csize; + struct ip_vs_conn *cp; + struct rtable *rt; /* Route to the other host */ + int mtu; + + if (skb_is_nonlinear(skb)) { + if (skb_linearize(skb, GFP_ATOMIC) != 0) + return NF_DROP; + } + + iph = skb->nh.iph; + ip_send_check(iph); + icmph = (struct icmphdr *)((char *)iph + (iph->ihl << 2)); + len = ntohs(iph->tot_len) - (iph->ihl<<2); + if (len < sizeof(struct icmphdr)) + return NF_DROP; + + IP_VS_DBG(12, "icmp in (%d,%d) %u.%u.%u.%u -> %u.%u.%u.%u\n", + icmph->type, ntohs(icmp_id(icmph)), + NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); + + if ((icmph->type != ICMP_DEST_UNREACH) && + (icmph->type != ICMP_SOURCE_QUENCH) && + (icmph->type != ICMP_TIME_EXCEEDED)) + return NF_ACCEPT; + + /* + * If we get here we have an ICMP error of one of the above 3 types + * Now find the contained IP header + */ + clen = len - sizeof(struct icmphdr); + if (clen < sizeof(struct iphdr)) + return NF_DROP; + ciph = (struct iphdr *) (icmph + 1); + csize = ciph->ihl << 2; + if (clen < csize) + return NF_DROP; + + /* We are only interested ICMPs generated from TCP or UDP packets */ + if (ciph->protocol != IPPROTO_UDP && ciph->protocol != IPPROTO_TCP) + return NF_ACCEPT; + + /* Skip non-first embedded TCP/UDP fragments */ + if (ciph->frag_off & __constant_htons(IP_OFFSET)) + return NF_ACCEPT; + + /* We need at least TCP/UDP ports here */ + if (clen < csize + sizeof(struct udphdr)) + return NF_DROP; + + /* Ensure the checksum is correct */ + if (ip_compute_csum((unsigned char *) icmph, len)) { + /* Failed checksum! */ + IP_VS_ERR_RL("incoming ICMP: failed checksum from " + "%d.%d.%d.%d!\n", NIPQUAD(iph->saddr)); + return NF_DROP; + } + + pptr = (__u16 *)&(((char *)ciph)[csize]); + + IP_VS_DBG(11, "Handling incoming ICMP for " + "%u.%u.%u.%u:%d -> %u.%u.%u.%u:%d\n", + NIPQUAD(ciph->saddr), ntohs(pptr[0]), + NIPQUAD(ciph->daddr), ntohs(pptr[1])); + + /* This is pretty much what ip_vs_conn_in_get() does, + except parameters are in the reverse order */ + cp = ip_vs_conn_in_get(ciph->protocol, + ciph->daddr, pptr[1], + ciph->saddr, pptr[0]); + if (cp == NULL) + return NF_ACCEPT; + + ip_vs_in_stats(cp, skb); + + /* The ICMP packet for VS/TUN, VS/DR and LOCALNODE will be + forwarded directly here, because there is no need to + translate address/port back */ + if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ) { + int ret; + if (cp->packet_xmit) + ret = cp->packet_xmit(skb, cp); + else + ret = NF_ACCEPT; + atomic_inc(&cp->in_pkts); + ip_vs_conn_put(cp); + return ret; + } + + /* + * mangle and send the packet here + */ + if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(iph->tos)))) + goto tx_error_icmp; + + /* MTU checking */ + mtu = rt->u.dst.pmtu; + if ((skb->len > mtu) && (iph->frag_off&__constant_htons(IP_DF))) { + ip_rt_put(rt); + icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); + IP_VS_DBG_RL("ip_vs_in_icmp(): frag needed\n"); + goto tx_error; + } + + /* drop old route */ + dst_release(skb->dst); + skb->dst = &rt->u.dst; + + /* copy-on-write the packet before mangling it */ + if (ip_vs_skb_cow(skb, rt->u.dst.dev->hard_header_len, + &iph, (unsigned char**)&icmph)) { + ip_vs_conn_put(cp); + return NF_DROP; + } + ciph = (struct iphdr *) (icmph + 1); + pptr = (__u16 *)&(((char *)ciph)[csize]); + + /* The ICMP packet for VS/NAT must be written to correct addresses + before being forwarded to the right server */ + + /* First change the dest IP address, and recalc checksum */ + iph->daddr = cp->daddr; + ip_send_check(iph); + + /* Now change the *source* address in the contained IP */ + ciph->saddr = cp->daddr; + ip_send_check(ciph); + + /* the TCP/UDP source port - cannot redo check */ + pptr[0] = cp->dport; + + /* And finally the ICMP checksum */ + icmph->checksum = 0; + icmph->checksum = ip_compute_csum((unsigned char *) icmph, len); + skb->ip_summed = CHECKSUM_UNNECESSARY; + + IP_VS_DBG(11, "Forwarding incoming ICMP to " + "%u.%u.%u.%u:%d -> %u.%u.%u.%u:%d\n", + NIPQUAD(ciph->saddr), ntohs(pptr[0]), + NIPQUAD(ciph->daddr), ntohs(pptr[1])); + +#ifdef CONFIG_NETFILTER_DEBUG + skb->nf_debug = 1 << NF_IP_LOCAL_OUT; +#endif /* CONFIG_NETFILTER_DEBUG */ + ip_send(skb); + ip_vs_conn_put(cp); + return NF_STOLEN; + + tx_error_icmp: + dst_link_failure(skb); + tx_error: + dev_kfree_skb(skb); + ip_vs_conn_put(cp); + return NF_STOLEN; +} + + +/* + * Check if it's for virtual services, look it up, + * and send it on its way... + */ +static unsigned int ip_vs_in(unsigned int hooknum, + struct sk_buff **skb_p, + const struct net_device *in, + const struct net_device *out, + int (*okfn)(struct sk_buff *)) +{ + struct sk_buff *skb = *skb_p; + struct iphdr *iph = skb->nh.iph; + union ip_vs_tphdr h; + struct ip_vs_conn *cp; + struct ip_vs_service *svc; + int ihl; + int ret; + + /* + * Big tappo: only PACKET_HOST (nor loopback neither mcasts) + * ... don't know why 1st test DOES NOT include 2nd (?) + */ + if (skb->pkt_type != PACKET_HOST || skb->dev == &loopback_dev) { + IP_VS_DBG(12, "packet type=%d proto=%d daddr=%d.%d.%d.%d ignored\n", + skb->pkt_type, + iph->protocol, + NIPQUAD(iph->daddr)); + return NF_ACCEPT; + } + + if (iph->protocol == IPPROTO_ICMP) + return ip_vs_in_icmp(skb_p); + + /* let it go if other IP protocols */ + if (iph->protocol != IPPROTO_TCP && iph->protocol != IPPROTO_UDP) + return NF_ACCEPT; + + /* make sure that protocol header available in skb data area, + note that skb data area may be reallocated. */ + ihl = iph->ihl << 2; + if (ip_vs_header_check(skb, iph->protocol, ihl) == -1) + return NF_DROP; + iph = skb->nh.iph; + h.raw = (char*) iph + ihl; + + /* + * Check if the packet belongs to an existing connection entry + */ + cp = ip_vs_conn_in_get(iph->protocol, iph->saddr, h.portp[0], + iph->daddr, h.portp[1]); + + if (!cp && + (h.th->syn || (iph->protocol!=IPPROTO_TCP)) && + (svc = ip_vs_service_get(skb->nfmark, iph->protocol, + iph->daddr, h.portp[1]))) { + if (ip_vs_todrop()) { + /* + * It seems that we are very loaded. + * We have to drop this packet :( + */ + ip_vs_service_put(svc); + return NF_DROP; + } + + /* + * Let the virtual server select a real server for the + * incoming connection, and create a connection entry. + */ + cp = ip_vs_schedule(svc, iph); + if (!cp) + return ip_vs_leave(svc, skb); + ip_vs_conn_stats(cp, svc); + ip_vs_service_put(svc); + } + + if (!cp) { + /* sorry, all this trouble for a no-hit :) */ + IP_VS_DBG(12, "packet for %s %d.%d.%d.%d:%d continue " + "traversal as normal.\n", + ip_vs_proto_name(iph->protocol), + NIPQUAD(iph->daddr), + ntohs(h.portp[1])); + return NF_ACCEPT; + } + + IP_VS_DBG(11, "Incoming %s %u.%u.%u.%u:%d->%u.%u.%u.%u:%d\n", + ip_vs_proto_name(iph->protocol), + NIPQUAD(iph->saddr), ntohs(h.portp[0]), + NIPQUAD(iph->daddr), ntohs(h.portp[1])); + + /* Check the server status */ + if (cp->dest && !(cp->dest->flags & IP_VS_DEST_F_AVAILABLE)) { + /* the destination server is not availabe */ + + if (sysctl_ip_vs_expire_nodest_conn) { + /* try to expire the connection immediately */ + ip_vs_conn_expire_now(cp); + } else { + /* don't restart its timer, and silently + drop the packet. */ + __ip_vs_conn_put(cp); + } + return NF_DROP; + } + + ip_vs_in_stats(cp, skb); + ip_vs_set_state(cp, VS_STATE_INPUT, iph, h.portp); + if (cp->packet_xmit) + ret = cp->packet_xmit(skb, cp); + else { + IP_VS_DBG_RL("warning: packet_xmit is null"); + ret = NF_ACCEPT; + } + + /* increase its packet counter and check if it is needed + to be synchronized */ + atomic_inc(&cp->in_pkts); + if (ip_vs_sync_state == IP_VS_STATE_MASTER && + (cp->protocol != IPPROTO_TCP || + cp->state == IP_VS_S_ESTABLISHED) && + (atomic_read(&cp->in_pkts) % 50 == sysctl_ip_vs_sync_threshold)) + ip_vs_sync_conn(cp); + + ip_vs_conn_put(cp); + return ret; +} + + +/* + * It is hooked at the NF_IP_FORWARD chain, in order to catch ICMP + * packets destined for 0.0.0.0/0. + * When fwmark-based virtual service is used, such as transparent + * cache cluster, TCP packets can be marked and routed to ip_vs_in, + * but ICMP destined for 0.0.0.0/0 cannot not be easily marked and + * sent to ip_vs_in_icmp. So, catch them at the NF_IP_FORWARD chain + * and send them to ip_vs_in_icmp. + */ +static unsigned int ip_vs_forward_icmp(unsigned int hooknum, + struct sk_buff **skb_p, + const struct net_device *in, + const struct net_device *out, + int (*okfn)(struct sk_buff *)) +{ + struct sk_buff *skb = *skb_p; + struct iphdr *iph = skb->nh.iph; + + if (iph->protocol != IPPROTO_ICMP) + return NF_ACCEPT; + + if (iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { + skb = ip_defrag(skb); + if (!skb) + return NF_STOLEN; + *skb_p = skb; + } + + return ip_vs_in_icmp(skb_p); +} + + +/* After packet filtering, forward packet through VS/DR, VS/TUN, + or VS/NAT(change destination), so that filtering rules can be + applied to IPVS. */ +static struct nf_hook_ops ip_vs_in_ops = { + { NULL, NULL }, + ip_vs_in, PF_INET, NF_IP_LOCAL_IN, 100 +}; + +/* After packet filtering, change source only for VS/NAT */ +static struct nf_hook_ops ip_vs_out_ops = { + { NULL, NULL }, + ip_vs_out, PF_INET, NF_IP_FORWARD, 100 +}; + +/* After packet filtering (but before ip_vs_out_icmp), catch icmp + destined for 0.0.0.0/0, which is for incoming IPVS connections */ +static struct nf_hook_ops ip_vs_forward_icmp_ops = { + { NULL, NULL }, + ip_vs_forward_icmp, PF_INET, NF_IP_FORWARD, 99 +}; + +/* Before the netfilter connection tracking, exit from POST_ROUTING */ +static struct nf_hook_ops ip_vs_post_routing_ops = { + { NULL, NULL }, + ip_vs_post_routing, PF_INET, NF_IP_POST_ROUTING, NF_IP_PRI_NAT_SRC-1 +}; + + +/* + * Initialize IP Virtual Server + */ +static int __init ip_vs_init(void) +{ + int ret; + + ret = ip_vs_control_init(); + if (ret < 0) { + IP_VS_ERR("can't setup control.\n"); + goto cleanup_nothing; + } + + ret = ip_vs_conn_init(); + if (ret < 0) { + IP_VS_ERR("can't setup connection table.\n"); + goto cleanup_control; + } + + ret = ip_vs_app_init(); + if (ret < 0) { + IP_VS_ERR("can't setup application helper.\n"); + goto cleanup_conn; + } + + ret = nf_register_hook(&ip_vs_in_ops); + if (ret < 0) { + IP_VS_ERR("can't register in hook.\n"); + goto cleanup_app; + } + ret = nf_register_hook(&ip_vs_out_ops); + if (ret < 0) { + IP_VS_ERR("can't register out hook.\n"); + goto cleanup_inops; + } + ret = nf_register_hook(&ip_vs_post_routing_ops); + if (ret < 0) { + IP_VS_ERR("can't register post_routing hook.\n"); + goto cleanup_outops; + } + ret = nf_register_hook(&ip_vs_forward_icmp_ops); + if (ret < 0) { + IP_VS_ERR("can't register forward_icmp hook.\n"); + goto cleanup_postroutingops; + } + + IP_VS_INFO("ipvs loaded.\n"); + return ret; + + cleanup_postroutingops: + nf_unregister_hook(&ip_vs_post_routing_ops); + cleanup_outops: + nf_unregister_hook(&ip_vs_out_ops); + cleanup_inops: + nf_unregister_hook(&ip_vs_in_ops); + cleanup_app: + ip_vs_app_cleanup(); + cleanup_conn: + ip_vs_conn_cleanup(); + cleanup_control: + ip_vs_control_cleanup(); + cleanup_nothing: + return ret; +} + +static void __exit ip_vs_cleanup(void) +{ + nf_unregister_hook(&ip_vs_forward_icmp_ops); + nf_unregister_hook(&ip_vs_post_routing_ops); + nf_unregister_hook(&ip_vs_out_ops); + nf_unregister_hook(&ip_vs_in_ops); + ip_vs_app_cleanup(); + ip_vs_conn_cleanup(); + ip_vs_control_cleanup(); + IP_VS_INFO("ipvs unloaded.\n"); +} + +module_init(ip_vs_init); +module_exit(ip_vs_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_ctl.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_ctl.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_ctl.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_ctl.c 2003-10-22 22:48:30.000000000 +0000 @@ -0,0 +1,2155 @@ +/* + * IPVS An implementation of the IP virtual server support for the + * LINUX operating system. IPVS is now implemented as a module + * over the NetFilter framework. IPVS can be used to build a + * high-performance and highly available server based on a + * cluster of servers. + * + * Version: $Id: ip_vs_ctl.c,v 1.30.2.3 2003/07/29 14:37:12 wensong Exp $ + * + * Authors: Wensong Zhang + * Peter Kese + * Julian Anastasov + * + * 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. + * + * Changes: + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include + +#include + +/* semaphore for IPVS sockopts. And, [gs]etsockopt may sleep. */ +static DECLARE_MUTEX(__ip_vs_mutex); + +/* lock for service table */ +rwlock_t __ip_vs_svc_lock = RW_LOCK_UNLOCKED; + +/* lock for table with the real services */ +static rwlock_t __ip_vs_rs_lock = RW_LOCK_UNLOCKED; + +/* lock for state and timeout tables */ +static rwlock_t __ip_vs_securetcp_lock = RW_LOCK_UNLOCKED; + +/* lock for drop entry handling */ +static spinlock_t __ip_vs_dropentry_lock = SPIN_LOCK_UNLOCKED; + +/* lock for drop packet handling */ +static spinlock_t __ip_vs_droppacket_lock = SPIN_LOCK_UNLOCKED; + +/* 1/rate drop and drop-entry variables */ +int ip_vs_drop_rate = 0; +int ip_vs_drop_counter = 0; +atomic_t ip_vs_dropentry = ATOMIC_INIT(0); + +/* number of virtual services */ +static int ip_vs_num_services = 0; + +/* sysctl variables */ +static int sysctl_ip_vs_drop_entry = 0; +static int sysctl_ip_vs_drop_packet = 0; +static int sysctl_ip_vs_secure_tcp = 0; +static int sysctl_ip_vs_amemthresh = 2048; +static int sysctl_ip_vs_am_droprate = 10; +int sysctl_ip_vs_cache_bypass = 0; +int sysctl_ip_vs_expire_nodest_conn = 0; +int sysctl_ip_vs_sync_threshold = 3; +int sysctl_ip_vs_nat_icmp_send = 0; + +#ifdef CONFIG_IP_VS_DEBUG +static int sysctl_ip_vs_debug_level = 0; + +int ip_vs_get_debug_level(void) +{ + return sysctl_ip_vs_debug_level; +} +#endif + +/* + * update_defense_level is called from timer bh and from sysctl. + */ +static void update_defense_level(void) +{ + struct sysinfo i; + int availmem; + int nomem; + + /* we only count free and buffered memory (in pages) */ + si_meminfo(&i); + availmem = i.freeram + i.bufferram; + + nomem = (availmem < sysctl_ip_vs_amemthresh); + + /* drop_entry */ + spin_lock(&__ip_vs_dropentry_lock); + switch (sysctl_ip_vs_drop_entry) { + case 0: + atomic_set(&ip_vs_dropentry, 0); + break; + case 1: + if (nomem) { + atomic_set(&ip_vs_dropentry, 1); + sysctl_ip_vs_drop_entry = 2; + } else { + atomic_set(&ip_vs_dropentry, 0); + } + break; + case 2: + if (nomem) { + atomic_set(&ip_vs_dropentry, 1); + } else { + atomic_set(&ip_vs_dropentry, 0); + sysctl_ip_vs_drop_entry = 1; + }; + break; + case 3: + atomic_set(&ip_vs_dropentry, 1); + break; + } + spin_unlock(&__ip_vs_dropentry_lock); + + /* drop_packet */ + spin_lock(&__ip_vs_droppacket_lock); + switch (sysctl_ip_vs_drop_packet) { + case 0: + ip_vs_drop_rate = 0; + break; + case 1: + if (nomem) { + ip_vs_drop_rate = ip_vs_drop_counter + = sysctl_ip_vs_amemthresh / + (sysctl_ip_vs_amemthresh - availmem); + sysctl_ip_vs_drop_packet = 2; + } else { + ip_vs_drop_rate = 0; + } + break; + case 2: + if (nomem) { + ip_vs_drop_rate = ip_vs_drop_counter + = sysctl_ip_vs_amemthresh / + (sysctl_ip_vs_amemthresh - availmem); + } else { + ip_vs_drop_rate = 0; + sysctl_ip_vs_drop_packet = 1; + } + break; + case 3: + ip_vs_drop_rate = sysctl_ip_vs_am_droprate; + break; + } + spin_unlock(&__ip_vs_droppacket_lock); + + /* secure_tcp */ + write_lock(&__ip_vs_securetcp_lock); + switch (sysctl_ip_vs_secure_tcp) { + case 0: + ip_vs_secure_tcp_set(0); + break; + case 1: + if (nomem) { + ip_vs_secure_tcp_set(1); + sysctl_ip_vs_secure_tcp = 2; + } else { + ip_vs_secure_tcp_set(0); + } + break; + case 2: + if (nomem) { + ip_vs_secure_tcp_set(1); + } else { + ip_vs_secure_tcp_set(0); + sysctl_ip_vs_secure_tcp = 1; + } + break; + case 3: + ip_vs_secure_tcp_set(1); + break; + } + write_unlock(&__ip_vs_securetcp_lock); +} + + +/* + * Timer for checking the defense + */ +static struct timer_list defense_timer; +#define DEFENSE_TIMER_PERIOD 1*HZ + +static void defense_timer_handler(unsigned long data) +{ + update_defense_level(); + if (atomic_read(&ip_vs_dropentry)) + ip_vs_random_dropentry(); + + mod_timer(&defense_timer, jiffies + DEFENSE_TIMER_PERIOD); +} + + +/* + * Hash table: for virtual service lookups + */ +#define IP_VS_SVC_TAB_BITS 8 +#define IP_VS_SVC_TAB_SIZE (1 << IP_VS_SVC_TAB_BITS) +#define IP_VS_SVC_TAB_MASK (IP_VS_SVC_TAB_SIZE - 1) + +/* the service table hashed by */ +static struct list_head ip_vs_svc_table[IP_VS_SVC_TAB_SIZE]; +/* the service table hashed by fwmark */ +static struct list_head ip_vs_svc_fwm_table[IP_VS_SVC_TAB_SIZE]; + +/* + * Hash table: for real service lookups + */ +#define IP_VS_RTAB_BITS 4 +#define IP_VS_RTAB_SIZE (1 << IP_VS_RTAB_BITS) +#define IP_VS_RTAB_MASK (IP_VS_RTAB_SIZE - 1) + +static struct list_head ip_vs_rtable[IP_VS_RTAB_SIZE]; + +/* + * Trash for destinations + */ +static LIST_HEAD(ip_vs_dest_trash); + +/* + * FTP & NULL virtual service counters + */ +static atomic_t ip_vs_ftpsvc_counter = ATOMIC_INIT(0); +static atomic_t ip_vs_nullsvc_counter = ATOMIC_INIT(0); + + +/* + * Returns hash value for virtual service + */ +static __inline__ unsigned +ip_vs_svc_hashkey(unsigned proto, __u32 addr, __u16 port) +{ + register unsigned porth = ntohs(port); + + return (proto^ntohl(addr)^(porth>>IP_VS_SVC_TAB_BITS)^porth) + & IP_VS_SVC_TAB_MASK; +} + +/* + * Returns hash value of fwmark for virtual service lookup + */ +static __inline__ unsigned ip_vs_svc_fwm_hashkey(__u32 fwmark) +{ + return fwmark & IP_VS_SVC_TAB_MASK; +} + +/* + * Hashes ip_vs_service in the ip_vs_svc_table by + * or in the ip_vs_svc_fwm_table by fwmark. + * Should be called with locked tables. + * Returns bool success. + */ +static int ip_vs_svc_hash(struct ip_vs_service *svc) +{ + unsigned hash; + + if (svc->flags & IP_VS_SVC_F_HASHED) { + IP_VS_ERR("ip_vs_svc_hash(): request for already hashed, " + "called from %p\n", __builtin_return_address(0)); + return 0; + } + + if (svc->fwmark == 0) { + /* + * Hash it by in ip_vs_svc_table + */ + hash = ip_vs_svc_hashkey(svc->protocol, svc->addr, svc->port); + list_add(&svc->s_list, &ip_vs_svc_table[hash]); + } else { + /* + * Hash it by fwmark in ip_vs_svc_fwm_table + */ + hash = ip_vs_svc_fwm_hashkey(svc->fwmark); + list_add(&svc->f_list, &ip_vs_svc_fwm_table[hash]); + } + + svc->flags |= IP_VS_SVC_F_HASHED; + /* increase its refcnt because it is referenced by the svc table */ + atomic_inc(&svc->refcnt); + return 1; +} + + +/* + * Unhashes ip_vs_service from ip_vs_svc_table/ip_vs_svc_fwm_table. + * Should be called with locked tables. + * Returns bool success. + */ +static int ip_vs_svc_unhash(struct ip_vs_service *svc) +{ + if (!(svc->flags & IP_VS_SVC_F_HASHED)) { + IP_VS_ERR("ip_vs_svc_unhash(): request for unhash flagged, " + "called from %p\n", __builtin_return_address(0)); + return 0; + } + + if (svc->fwmark == 0) { + /* + * Remove it from the ip_vs_svc_table table. + */ + list_del(&svc->s_list); + } else { + /* + * Remove it from the ip_vs_svc_fwm_table table. + */ + list_del(&svc->f_list); + } + + svc->flags &= ~IP_VS_SVC_F_HASHED; + atomic_dec(&svc->refcnt); + return 1; +} + + +/* + * Get service by {proto,addr,port} in the service table. + */ +static __inline__ struct ip_vs_service * +__ip_vs_service_get(__u16 protocol, __u32 vaddr, __u16 vport) +{ + unsigned hash; + struct ip_vs_service *svc; + struct list_head *l,*e; + + /* + * Check for "full" addressed entries + */ + hash = ip_vs_svc_hashkey(protocol, vaddr, vport); + + l = &ip_vs_svc_table[hash]; + for (e=l->next; e!=l; e=e->next) { + svc = list_entry(e, struct ip_vs_service, s_list); + if ((svc->addr == vaddr) + && (svc->port == vport) + && (svc->protocol == protocol)) { + /* HIT */ + atomic_inc(&svc->usecnt); + return svc; + } + } + + return NULL; +} + + +/* + * Get service by {fwmark} in the service table. + */ +static __inline__ struct ip_vs_service *__ip_vs_svc_fwm_get(__u32 fwmark) +{ + unsigned hash; + struct ip_vs_service *svc; + struct list_head *l,*e; + + /* + * Check for "full" addressed entries + */ + hash = ip_vs_svc_fwm_hashkey(fwmark); + + l = &ip_vs_svc_fwm_table[hash]; + for (e=l->next; e!=l; e=e->next) { + svc = list_entry(e, struct ip_vs_service, f_list); + if (svc->fwmark == fwmark) { + /* HIT */ + atomic_inc(&svc->usecnt); + return svc; + } + } + + return NULL; +} + +struct ip_vs_service * +ip_vs_service_get(__u32 fwmark, __u16 protocol, __u32 vaddr, __u16 vport) +{ + struct ip_vs_service *svc; + + read_lock(&__ip_vs_svc_lock); + + /* + * Check the table hashed by fwmark first + */ + if (fwmark && (svc = __ip_vs_svc_fwm_get(fwmark))) + goto out; + + /* + * Check the table hashed by + * for "full" addressed entries + */ + svc = __ip_vs_service_get(protocol, vaddr, vport); + + if (svc == NULL + && protocol == IPPROTO_TCP + && atomic_read(&ip_vs_ftpsvc_counter) + && (vport == FTPDATA || ntohs(vport) >= PROT_SOCK)) { + /* + * Check if ftp service entry exists, the packet + * might belong to FTP data connections. + */ + svc = __ip_vs_service_get(protocol, vaddr, FTPPORT); + } + + if (svc == NULL + && atomic_read(&ip_vs_nullsvc_counter)) { + /* + * Check if the catch-all port (port zero) exists + */ + svc = __ip_vs_service_get(protocol, vaddr, 0); + } + + out: + read_unlock(&__ip_vs_svc_lock); + + IP_VS_DBG(6, "lookup service: fwm %u %s %u.%u.%u.%u:%u %s\n", + fwmark, ip_vs_proto_name(protocol), + NIPQUAD(vaddr), ntohs(vport), + svc?"hit":"not hit"); + + return svc; +} + + +static inline void +__ip_vs_bind_svc(struct ip_vs_dest *dest, struct ip_vs_service *svc) +{ + atomic_inc(&svc->refcnt); + dest->svc = svc; +} + +static inline void +__ip_vs_unbind_svc(struct ip_vs_dest *dest) +{ + struct ip_vs_service *svc = dest->svc; + + dest->svc = NULL; + if (atomic_dec_and_test(&svc->refcnt)) + kfree(svc); +} + +/* + * Returns hash value for real service + */ +static __inline__ unsigned ip_vs_rs_hashkey(__u32 addr, __u16 port) +{ + register unsigned porth = ntohs(port); + + return (ntohl(addr)^(porth>>IP_VS_RTAB_BITS)^porth) + & IP_VS_RTAB_MASK; +} + +/* + * Hashes ip_vs_dest in ip_vs_rtable by proto,addr,port. + * should be called with locked tables. + * returns bool success. + */ +static int ip_vs_rs_hash(struct ip_vs_dest *dest) +{ + unsigned hash; + + if (!list_empty(&dest->d_list)) { + return 0; + } + + /* + * Hash by proto,addr,port, + * which are the parameters of the real service. + */ + hash = ip_vs_rs_hashkey(dest->addr, dest->port); + list_add(&dest->d_list, &ip_vs_rtable[hash]); + + return 1; +} + +/* + * UNhashes ip_vs_dest from ip_vs_rtable. + * should be called with locked tables. + * returns bool success. + */ +static int ip_vs_rs_unhash(struct ip_vs_dest *dest) +{ + /* + * Remove it from the ip_vs_rtable table. + */ + if (!list_empty(&dest->d_list)) { + list_del(&dest->d_list); + INIT_LIST_HEAD(&dest->d_list); + } + + return 1; +} + +/* + * Lookup real service by {proto,addr,port} in the real service table. + */ +struct ip_vs_dest * +ip_vs_lookup_real_service(__u16 protocol, __u32 daddr, __u16 dport) +{ + unsigned hash; + struct ip_vs_dest *dest; + struct list_head *l,*e; + + /* + * Check for "full" addressed entries + * Return the first found entry + */ + hash = ip_vs_rs_hashkey(daddr, dport); + + l = &ip_vs_rtable[hash]; + + read_lock(&__ip_vs_rs_lock); + for (e=l->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, d_list); + if ((dest->addr == daddr) + && (dest->port == dport) + && ((dest->protocol == protocol) || + dest->vfwmark)) { + /* HIT */ + read_unlock(&__ip_vs_rs_lock); + return dest; + } + } + read_unlock(&__ip_vs_rs_lock); + + return NULL; +} + +/* + * Lookup destination by {addr,port} in the given service + */ +static struct ip_vs_dest * +ip_vs_lookup_dest(struct ip_vs_service *svc, __u32 daddr, __u16 dport) +{ + struct ip_vs_dest *dest; + struct list_head *l, *e; + + /* + * Find the destination for the given service + */ + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + if ((dest->addr == daddr) && (dest->port == dport)) { + /* HIT */ + return dest; + } + } + + return NULL; +} + + +/* + * Lookup dest by {svc,addr,port} in the destination trash. + * The destination trash is used to hold the destinations that are removed + * from the service table but are still referenced by some conn entries. + * The reason to add the destination trash is when the dest is temporary + * down (either by administrator or by monitor program), the dest can be + * picked back from the trash, the remaining connections to the dest can + * continue, and the counting information of the dest is also useful for + * scheduling. + */ +static struct ip_vs_dest * +ip_vs_trash_get_dest(struct ip_vs_service *svc, __u32 daddr, __u16 dport) +{ + struct ip_vs_dest *dest; + struct list_head *l, *e; + + /* + * Find the destination in trash + */ + l = &ip_vs_dest_trash; + + for (e=l->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + IP_VS_DBG(3, "Destination %u/%u.%u.%u.%u:%u still in trash, " + "refcnt=%d\n", + dest->vfwmark, + NIPQUAD(dest->addr), ntohs(dest->port), + atomic_read(&dest->refcnt)); + if (dest->addr == daddr && + dest->port == dport && + dest->vfwmark == svc->fwmark && + dest->protocol == svc->protocol && + (svc->fwmark || + (dest->vaddr == svc->addr && + dest->vport == svc->port))) { + /* HIT */ + return dest; + } + + /* + * Try to purge the destination from trash if not referenced + */ + if (atomic_read(&dest->refcnt) == 1) { + IP_VS_DBG(3, "Removing destination %u/%u.%u.%u.%u:%u " + "from trash\n", + dest->vfwmark, + NIPQUAD(dest->addr), ntohs(dest->port)); + e = e->prev; + list_del(&dest->n_list); + __ip_vs_dst_reset(dest); + __ip_vs_unbind_svc(dest); + kfree(dest); + } + } + + return NULL; +} + + +/* + * Clean up all the destinations in the trash + * Called by the ip_vs_control_cleanup() + * + * When the ip_vs_control_clearup is activated by ipvs module exit, + * the service tables must have been flushed and all the connections + * are expired, and the refcnt of each destination in the trash must + * be 1, so we simply release them here. + */ +static void ip_vs_trash_cleanup(void) +{ + struct ip_vs_dest *dest; + struct list_head *l; + + l = &ip_vs_dest_trash; + + while (l->next != l) { + dest = list_entry(l->next, struct ip_vs_dest, n_list); + list_del(&dest->n_list); + __ip_vs_dst_reset(dest); + __ip_vs_unbind_svc(dest); + kfree(dest); + } +} + + +static inline void +__ip_vs_zero_stats(struct ip_vs_stats *stats) +{ + spin_lock_bh(&stats->lock); + memset(stats, 0, (char *)&stats->lock - (char *)stats); + spin_unlock_bh(&stats->lock); + ip_vs_zero_estimator(stats); +} + +/* + * Update a destination in the given service + */ +static void __ip_vs_update_dest(struct ip_vs_service *svc, + struct ip_vs_dest *dest, + struct ip_vs_rule_user *ur) +{ + int conn_flags; + + /* + * Set the weight and the flags + */ + atomic_set(&dest->weight, ur->weight); + + conn_flags = ur->conn_flags | IP_VS_CONN_F_INACTIVE; + + /* + * Check if local node and update the flags + */ + if (inet_addr_type(ur->daddr) == RTN_LOCAL) { + conn_flags = (conn_flags & ~IP_VS_CONN_F_FWD_MASK) + | IP_VS_CONN_F_LOCALNODE; + } + + /* + * Set the IP_VS_CONN_F_NOOUTPUT flag if not masquerading + */ + if ((conn_flags & IP_VS_CONN_F_FWD_MASK) != 0) { + conn_flags |= IP_VS_CONN_F_NOOUTPUT; + } else { + /* + * Put the real service in ip_vs_rtable if not present. + * For now only for NAT! + */ + write_lock_bh(&__ip_vs_rs_lock); + ip_vs_rs_hash(dest); + write_unlock_bh(&__ip_vs_rs_lock); + } + atomic_set(&dest->conn_flags, conn_flags); + + /* bind the service */ + if (!dest->svc) { + __ip_vs_bind_svc(dest, svc); + } else { + if (dest->svc != svc) { + __ip_vs_unbind_svc(dest); + __ip_vs_zero_stats(&dest->stats); + __ip_vs_bind_svc(dest, svc); + } + } + + /* set the dest status flags */ + dest->flags |= IP_VS_DEST_F_AVAILABLE; +} + + +/* + * Create a destination for the given service + */ +static int +ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_rule_user *ur, + struct ip_vs_dest **destp) +{ + struct ip_vs_dest *dest; + unsigned atype; + + EnterFunction(2); + + atype = inet_addr_type(ur->daddr); + if (atype != RTN_LOCAL && atype != RTN_UNICAST) + return -EINVAL; + + *destp = dest = (struct ip_vs_dest*) + kmalloc(sizeof(struct ip_vs_dest), GFP_ATOMIC); + if (dest == NULL) { + IP_VS_ERR("ip_vs_new_dest: kmalloc failed.\n"); + return -ENOMEM; + } + memset(dest, 0, sizeof(struct ip_vs_dest)); + + dest->protocol = svc->protocol; + dest->vaddr = svc->addr; + dest->vport = svc->port; + dest->vfwmark = svc->fwmark; + dest->addr = ur->daddr; + dest->port = ur->dport; + + atomic_set(&dest->activeconns, 0); + atomic_set(&dest->inactconns, 0); + atomic_set(&dest->refcnt, 0); + + INIT_LIST_HEAD(&dest->d_list); + dest->dst_lock = SPIN_LOCK_UNLOCKED; + dest->stats.lock = SPIN_LOCK_UNLOCKED; + __ip_vs_update_dest(svc, dest, ur); + ip_vs_new_estimator(&dest->stats); + + LeaveFunction(2); + return 0; +} + + +/* + * Add a destination into an existing service + */ +static int ip_vs_add_dest(struct ip_vs_service *svc, + struct ip_vs_rule_user *ur) +{ + struct ip_vs_dest *dest; + __u32 daddr = ur->daddr; + __u16 dport = ur->dport; + int ret; + + EnterFunction(2); + + if (ur->weight < 0) { + IP_VS_ERR("ip_vs_add_dest(): server weight less than zero\n"); + return -ERANGE; + } + + /* + * Check if the dest already exists in the list + */ + dest = ip_vs_lookup_dest(svc, daddr, dport); + if (dest != NULL) { + IP_VS_DBG(1, "ip_vs_add_dest(): dest already exists\n"); + return -EEXIST; + } + + /* + * Check if the dest already exists in the trash and + * is from the same service + */ + dest = ip_vs_trash_get_dest(svc, daddr, dport); + if (dest != NULL) { + IP_VS_DBG(3, "Get destination %u.%u.%u.%u:%u from trash, " + "refcnt=%d, service %u/%u.%u.%u.%u:%u\n", + NIPQUAD(daddr), ntohs(dport), + atomic_read(&dest->refcnt), + dest->vfwmark, + NIPQUAD(dest->vaddr), + ntohs(dest->vport)); + __ip_vs_update_dest(svc, dest, ur); + + /* + * Get the destination from the trash + */ + list_del(&dest->n_list); + + ip_vs_new_estimator(&dest->stats); + + write_lock_bh(&__ip_vs_svc_lock); + + /* + * Wait until all other svc users go away. + */ + while (atomic_read(&svc->usecnt) > 1) {}; + + list_add(&dest->n_list, &svc->destinations); + svc->num_dests++; + + /* call the update_service function of its scheduler */ + svc->scheduler->update_service(svc); + + write_unlock_bh(&__ip_vs_svc_lock); + return 0; + } + + /* + * Allocate and initialize the dest structure + */ + ret = ip_vs_new_dest(svc, ur, &dest); + if (ret) { + return ret; + } + + /* + * Add the dest entry into the list + */ + atomic_inc(&dest->refcnt); + + write_lock_bh(&__ip_vs_svc_lock); + + /* + * Wait until all other svc users go away. + */ + while (atomic_read(&svc->usecnt) > 1) {}; + + list_add(&dest->n_list, &svc->destinations); + svc->num_dests++; + + /* call the update_service function of its scheduler */ + svc->scheduler->update_service(svc); + + write_unlock_bh(&__ip_vs_svc_lock); + + LeaveFunction(2); + + return 0; +} + + +/* + * Edit a destination in the given service + */ +static int ip_vs_edit_dest(struct ip_vs_service *svc, + struct ip_vs_rule_user *ur) +{ + struct ip_vs_dest *dest; + __u32 daddr = ur->daddr; + __u16 dport = ur->dport; + + EnterFunction(2); + + if (ur->weight < 0) { + IP_VS_ERR("ip_vs_edit_dest(): server weight less than zero\n"); + return -ERANGE; + } + + /* + * Lookup the destination list + */ + dest = ip_vs_lookup_dest(svc, daddr, dport); + if (dest == NULL) { + IP_VS_DBG(1, "ip_vs_edit_dest(): dest doesn't exist\n"); + return -ENOENT; + } + + __ip_vs_update_dest(svc, dest, ur); + + /* call the update_service, because server weight may be changed */ + svc->scheduler->update_service(svc); + + LeaveFunction(2); + + return 0; +} + + +/* + * Delete a destination (must be already unlinked from the service) + */ +static void __ip_vs_del_dest(struct ip_vs_dest *dest) +{ + ip_vs_kill_estimator(&dest->stats); + + /* + * Remove it from the d-linked list with the real services. + */ + write_lock_bh(&__ip_vs_rs_lock); + ip_vs_rs_unhash(dest); + write_unlock_bh(&__ip_vs_rs_lock); + + /* + * Decrease the refcnt of the dest, and free the dest + * if nobody refers to it (refcnt=0). Otherwise, throw + * the destination into the trash. + */ + if (atomic_dec_and_test(&dest->refcnt)) { + __ip_vs_dst_reset(dest); + /* simply decrease svc->refcnt here, let the caller check + and release the service if nobody refers to it. + Only user context can release destination and service, + and only one user context can update virtual service at a + time, so the operation here is OK */ + atomic_dec(&dest->svc->refcnt); + kfree(dest); + } else { + IP_VS_DBG(3, "Moving dest %u.%u.%u.%u:%u into trash, refcnt=%d\n", + NIPQUAD(dest->addr), ntohs(dest->port), + atomic_read(&dest->refcnt)); + list_add(&dest->n_list, &ip_vs_dest_trash); + atomic_inc(&dest->refcnt); + } +} + + +/* + * Unlink a destination from the given service + */ +static void __ip_vs_unlink_dest(struct ip_vs_service *svc, + struct ip_vs_dest *dest, + int svcupd) +{ + dest->flags &= ~IP_VS_DEST_F_AVAILABLE; + + /* + * Remove it from the d-linked destination list. + */ + list_del(&dest->n_list); + svc->num_dests--; + if (svcupd) { + /* + * Call the update_service function of its scheduler + */ + svc->scheduler->update_service(svc); + } +} + + +/* + * Delete a destination server in the given service + */ +static int ip_vs_del_dest(struct ip_vs_service *svc,struct ip_vs_rule_user *ur) +{ + struct ip_vs_dest *dest; + __u32 daddr = ur->daddr; + __u16 dport = ur->dport; + + EnterFunction(2); + + dest = ip_vs_lookup_dest(svc, daddr, dport); + if (dest == NULL) { + IP_VS_DBG(1, "ip_vs_del_dest(): destination not found!\n"); + return -ENOENT; + } + + write_lock_bh(&__ip_vs_svc_lock); + + /* + * Wait until all other svc users go away. + */ + while (atomic_read(&svc->usecnt) > 1) {}; + + /* + * Unlink dest from the service + */ + __ip_vs_unlink_dest(svc, dest, 1); + + write_unlock_bh(&__ip_vs_svc_lock); + + /* + * Delete the destination + */ + __ip_vs_del_dest(dest); + + LeaveFunction(2); + + return 0; +} + + +/* + * Add a service into the service hash table + */ +static int +ip_vs_add_service(struct ip_vs_rule_user *ur, struct ip_vs_service **svc_p) +{ + int ret = 0; + struct ip_vs_scheduler *sched; + struct ip_vs_service *svc = NULL; + + MOD_INC_USE_COUNT; + + /* + * Lookup the scheduler, by 'ur->sched_name' + */ + sched = ip_vs_scheduler_get(ur->sched_name); + if (sched == NULL) { + IP_VS_INFO("Scheduler module ip_vs_%s.o not found\n", + ur->sched_name); + ret = -ENOENT; + goto out_mod_dec; + } + + svc = (struct ip_vs_service*) + kmalloc(sizeof(struct ip_vs_service), GFP_ATOMIC); + if (svc == NULL) { + IP_VS_DBG(1, "ip_vs_add_service: kmalloc failed.\n"); + ret = -ENOMEM; + goto out_err; + } + memset(svc, 0, sizeof(struct ip_vs_service)); + + svc->protocol = ur->protocol; + svc->addr = ur->vaddr; + svc->port = ur->vport; + svc->fwmark = ur->vfwmark; + svc->flags = ur->vs_flags; + svc->timeout = ur->timeout * HZ; + svc->netmask = ur->netmask; + + INIT_LIST_HEAD(&svc->destinations); + svc->sched_lock = RW_LOCK_UNLOCKED; + svc->stats.lock = SPIN_LOCK_UNLOCKED; + + /* + * Bind the scheduler + */ + ret = ip_vs_bind_scheduler(svc, sched); + if (ret) { + goto out_err; + } + + /* + * Update the virtual service counters + */ + if (svc->port == FTPPORT) + atomic_inc(&ip_vs_ftpsvc_counter); + else if (svc->port == 0) + atomic_inc(&ip_vs_nullsvc_counter); + + /* + * I'm the first user of the service + */ + atomic_set(&svc->usecnt, 1); + atomic_set(&svc->refcnt, 0); + + ip_vs_new_estimator(&svc->stats); + ip_vs_num_services++; + + /* + * Hash the service into the service table + */ + write_lock_bh(&__ip_vs_svc_lock); + ip_vs_svc_hash(svc); + write_unlock_bh(&__ip_vs_svc_lock); + + *svc_p = svc; + return 0; + + out_err: + if (svc) + kfree(svc); + ip_vs_scheduler_put(sched); + out_mod_dec: + MOD_DEC_USE_COUNT; + return ret; +} + + +/* + * Edit a service and bind it with a new scheduler + */ +static int ip_vs_edit_service(struct ip_vs_service *svc, + struct ip_vs_rule_user *ur) +{ + struct ip_vs_scheduler *sched, *old_sched; + int ret = 0; + + /* + * Lookup the scheduler, by 'ur->sched_name' + */ + sched = ip_vs_scheduler_get(ur->sched_name); + if (sched == NULL) { + IP_VS_INFO("Scheduler module ip_vs_%s.o not found\n", + ur->sched_name); + return -ENOENT; + } + + write_lock_bh(&__ip_vs_svc_lock); + + /* + * Wait until all other svc users go away. + */ + while (atomic_read(&svc->usecnt) > 1) {}; + + /* + * Set the flags and timeout value + */ + svc->flags = ur->vs_flags | IP_VS_SVC_F_HASHED; + svc->timeout = ur->timeout * HZ; + svc->netmask = ur->netmask; + + old_sched = svc->scheduler; + if (sched != old_sched) { + /* + * Unbind the old scheduler + */ + if ((ret = ip_vs_unbind_scheduler(svc))) { + old_sched = sched; + goto out; + } + + /* + * Bind the new scheduler + */ + if ((ret = ip_vs_bind_scheduler(svc, sched))) { + /* + * If ip_vs_bind_scheduler fails, restore the old + * scheduler. + * The main reason of failure is out of memory. + * + * The question is if the old scheduler can be + * restored all the time. TODO: if it cannot be + * restored some time, we must delete the service, + * otherwise the system may crash. + */ + ip_vs_bind_scheduler(svc, old_sched); + old_sched = sched; + } + } + + out: + write_unlock_bh(&__ip_vs_svc_lock); + + if (old_sched) + ip_vs_scheduler_put(old_sched); + + return ret; +} + + +/* + * Delete a service from the service list + * The service must be unlinked, unlocked and not referenced! + */ +static void __ip_vs_del_service(struct ip_vs_service *svc) +{ + struct list_head *l; + struct ip_vs_dest *dest; + struct ip_vs_scheduler *old_sched; + + ip_vs_num_services--; + ip_vs_kill_estimator(&svc->stats); + + /* + * Unbind scheduler + */ + old_sched = svc->scheduler; + ip_vs_unbind_scheduler(svc); + if (old_sched && old_sched->module) + __MOD_DEC_USE_COUNT(old_sched->module); + + /* + * Unlink the whole destination list + */ + l = &svc->destinations; + while (l->next != l) { + dest = list_entry(l->next, struct ip_vs_dest, n_list); + __ip_vs_unlink_dest(svc, dest, 0); + __ip_vs_del_dest(dest); + } + + /* + * Update the virtual service counters + */ + if (svc->port == FTPPORT) + atomic_dec(&ip_vs_ftpsvc_counter); + else if (svc->port == 0) + atomic_dec(&ip_vs_nullsvc_counter); + + /* + * Free the service if nobody refers to it + */ + if (atomic_read(&svc->refcnt) == 0) + kfree(svc); + MOD_DEC_USE_COUNT; +} + +/* + * Delete a service from the service list + */ +static int ip_vs_del_service(struct ip_vs_service *svc) +{ + if (svc == NULL) + return -EEXIST; + + /* + * Unhash it from the service table + */ + write_lock_bh(&__ip_vs_svc_lock); + + ip_vs_svc_unhash(svc); + + /* + * Wait until all the svc users go away. + */ + while (atomic_read(&svc->usecnt) > 1) {}; + + __ip_vs_del_service(svc); + + write_unlock_bh(&__ip_vs_svc_lock); + + return 0; +} + + +/* + * Flush all the virtual services + */ +static int ip_vs_flush(void) +{ + int idx; + struct ip_vs_service *svc; + struct list_head *l; + + /* + * Flush the service table hashed by + */ + for(idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + l = &ip_vs_svc_table[idx]; + while (l->next != l) { + svc = list_entry(l->next,struct ip_vs_service,s_list); + write_lock_bh(&__ip_vs_svc_lock); + ip_vs_svc_unhash(svc); + /* + * Wait until all the svc users go away. + */ + while (atomic_read(&svc->usecnt) > 0) {}; + __ip_vs_del_service(svc); + write_unlock_bh(&__ip_vs_svc_lock); + } + } + + /* + * Flush the service table hashed by fwmark + */ + for(idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + l = &ip_vs_svc_fwm_table[idx]; + while (l->next != l) { + svc = list_entry(l->next,struct ip_vs_service,f_list); + write_lock_bh(&__ip_vs_svc_lock); + ip_vs_svc_unhash(svc); + /* + * Wait until all the svc users go away. + */ + while (atomic_read(&svc->usecnt) > 0) {}; + __ip_vs_del_service(svc); + write_unlock_bh(&__ip_vs_svc_lock); + } + } + + return 0; +} + + +/* + * Zero counters in a service or all services + */ +static int ip_vs_zero_service(struct ip_vs_service *svc) +{ + struct list_head *l; + struct ip_vs_dest *dest; + + write_lock_bh(&__ip_vs_svc_lock); + list_for_each (l, &svc->destinations) { + dest = list_entry(l, struct ip_vs_dest, n_list); + __ip_vs_zero_stats(&dest->stats); + } + __ip_vs_zero_stats(&svc->stats); + write_unlock_bh(&__ip_vs_svc_lock); + return 0; +} + +static int ip_vs_zero_all(void) +{ + int idx; + struct list_head *l; + struct ip_vs_service *svc; + + for(idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + list_for_each (l, &ip_vs_svc_table[idx]) { + svc = list_entry(l, struct ip_vs_service, s_list); + ip_vs_zero_service(svc); + } + } + + for(idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + list_for_each (l, &ip_vs_svc_fwm_table[idx]) { + svc = list_entry(l, struct ip_vs_service, f_list); + ip_vs_zero_service(svc); + } + } + + __ip_vs_zero_stats(&ip_vs_stats); + return 0; +} + + +static int ip_vs_sysctl_defense_mode(ctl_table *ctl, int write, + struct file * filp, void *buffer, size_t *lenp) +{ + int *valp = ctl->data; + int val = *valp; + int ret; + + ret = proc_dointvec(ctl, write, filp, buffer, lenp); + if (write && (*valp != val)) { + if ((*valp < 0) || (*valp > 3)) { + /* Restore the correct value */ + *valp = val; + } else { + local_bh_disable(); + update_defense_level(); + local_bh_enable(); + } + } + return ret; +} + + +/* + * IPVS sysctl table + */ +struct ip_vs_sysctl_table { + struct ctl_table_header *sysctl_header; + ctl_table vs_vars[NET_IPV4_VS_LAST]; + ctl_table vs_dir[2]; + ctl_table ipv4_dir[2]; + ctl_table root_dir[2]; +}; + + +static struct ip_vs_sysctl_table ipv4_vs_table = { + NULL, + {{NET_IPV4_VS_AMEMTHRESH, "amemthresh", + &sysctl_ip_vs_amemthresh, sizeof(int), 0644, NULL, + &proc_dointvec}, +#ifdef CONFIG_IP_VS_DEBUG + {NET_IPV4_VS_DEBUG_LEVEL, "debug_level", + &sysctl_ip_vs_debug_level, sizeof(int), 0644, NULL, + &proc_dointvec}, +#endif + {NET_IPV4_VS_AMDROPRATE, "am_droprate", + &sysctl_ip_vs_am_droprate, sizeof(int), 0644, NULL, + &proc_dointvec}, + {NET_IPV4_VS_DROP_ENTRY, "drop_entry", + &sysctl_ip_vs_drop_entry, sizeof(int), 0644, NULL, + &ip_vs_sysctl_defense_mode}, + {NET_IPV4_VS_DROP_PACKET, "drop_packet", + &sysctl_ip_vs_drop_packet, sizeof(int), 0644, NULL, + &ip_vs_sysctl_defense_mode}, + {NET_IPV4_VS_SECURE_TCP, "secure_tcp", + &sysctl_ip_vs_secure_tcp, sizeof(int), 0644, NULL, + &ip_vs_sysctl_defense_mode}, + {NET_IPV4_VS_TO_ES, "timeout_established", + &vs_timeout_table_dos.timeout[IP_VS_S_ESTABLISHED], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_SS, "timeout_synsent", + &vs_timeout_table_dos.timeout[IP_VS_S_SYN_SENT], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_SR, "timeout_synrecv", + &vs_timeout_table_dos.timeout[IP_VS_S_SYN_RECV], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_FW, "timeout_finwait", + &vs_timeout_table_dos.timeout[IP_VS_S_FIN_WAIT], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_TW, "timeout_timewait", + &vs_timeout_table_dos.timeout[IP_VS_S_TIME_WAIT], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_CL, "timeout_close", + &vs_timeout_table_dos.timeout[IP_VS_S_CLOSE], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_CW, "timeout_closewait", + &vs_timeout_table_dos.timeout[IP_VS_S_CLOSE_WAIT], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_LA, "timeout_lastack", + &vs_timeout_table_dos.timeout[IP_VS_S_LAST_ACK], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_LI, "timeout_listen", + &vs_timeout_table_dos.timeout[IP_VS_S_LISTEN], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_SA, "timeout_synack", + &vs_timeout_table_dos.timeout[IP_VS_S_SYNACK], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_UDP, "timeout_udp", + &vs_timeout_table_dos.timeout[IP_VS_S_UDP], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_TO_ICMP, "timeout_icmp", + &vs_timeout_table_dos.timeout[IP_VS_S_ICMP], + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {NET_IPV4_VS_CACHE_BYPASS, "cache_bypass", + &sysctl_ip_vs_cache_bypass, sizeof(int), 0644, NULL, + &proc_dointvec}, + {NET_IPV4_VS_EXPIRE_NODEST_CONN, "expire_nodest_conn", + &sysctl_ip_vs_expire_nodest_conn, sizeof(int), 0644, NULL, + &proc_dointvec}, + {NET_IPV4_VS_SYNC_THRESHOLD, "sync_threshold", + &sysctl_ip_vs_sync_threshold, sizeof(int), 0644, NULL, + &proc_dointvec}, + {NET_IPV4_VS_NAT_ICMP_SEND, "nat_icmp_send", + &sysctl_ip_vs_nat_icmp_send, sizeof(int), 0644, NULL, + &proc_dointvec}, + {0}}, + {{NET_IPV4_VS, "vs", NULL, 0, 0555, ipv4_vs_table.vs_vars}, + {0}}, + {{NET_IPV4, "ipv4", NULL, 0, 0555, ipv4_vs_table.vs_dir}, + {0}}, + {{CTL_NET, "net", NULL, 0, 0555, ipv4_vs_table.ipv4_dir}, + {0}} +}; + + +/* + * Write the contents of the VS rule table to a PROCfs file. + * (It is kept just for backward compatibility) + */ +static inline char *ip_vs_fwd_name(unsigned flags) +{ + char *fwd; + + switch (flags & IP_VS_CONN_F_FWD_MASK) { + case IP_VS_CONN_F_LOCALNODE: + fwd = "Local"; + break; + case IP_VS_CONN_F_TUNNEL: + fwd = "Tunnel"; + break; + case IP_VS_CONN_F_DROUTE: + fwd = "Route"; + break; + default: + fwd = "Masq"; + } + return fwd; +} + +static int ip_vs_get_info(char *buf, char **start, off_t offset, int length) +{ + int len=0; + off_t pos=0; + char temp[64], temp2[32]; + int idx; + struct ip_vs_service *svc; + struct ip_vs_dest *dest; + struct list_head *l, *e, *p, *q; + + /* + * Note: since the length of the buffer is usually the multiple + * of 512, it is good to use fixed record of the divisor of 512, + * so that records won't be truncated at buffer boundary. + */ + pos = 192; + if (pos > offset) { + sprintf(temp, + "IP Virtual Server version %d.%d.%d (size=%d)", + NVERSION(IP_VS_VERSION_CODE), IP_VS_CONN_TAB_SIZE); + len += sprintf(buf+len, "%-63s\n", temp); + len += sprintf(buf+len, "%-63s\n", + "Prot LocalAddress:Port Scheduler Flags"); + len += sprintf(buf+len, "%-63s\n", + " -> RemoteAddress:Port Forward Weight ActiveConn InActConn"); + } + + read_lock_bh(&__ip_vs_svc_lock); + + /* print the service table hashed by */ + for (idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + l = &ip_vs_svc_table[idx]; + for (e=l->next; e!=l; e=e->next) { + svc = list_entry(e, struct ip_vs_service, s_list); + pos += 64; + if (pos > offset) { + if (svc->flags & IP_VS_SVC_F_PERSISTENT) + sprintf(temp2, "persistent %d %08X", + svc->timeout, + ntohl(svc->netmask)); + else + temp2[0] = '\0'; + + sprintf(temp, "%s %08X:%04X %s %s", + ip_vs_proto_name(svc->protocol), + ntohl(svc->addr), + ntohs(svc->port), + svc->scheduler->name, temp2); + len += sprintf(buf+len, "%-63s\n", temp); + if (len >= length) + goto done; + } + + p = &svc->destinations; + for (q=p->next; q!=p; q=q->next) { + dest = list_entry(q, struct ip_vs_dest, n_list); + pos += 64; + if (pos <= offset) + continue; + sprintf(temp, + " -> %08X:%04X %-7s %-6d %-10d %-10d", + ntohl(dest->addr), + ntohs(dest->port), + ip_vs_fwd_name(atomic_read(&dest->conn_flags)), + atomic_read(&dest->weight), + atomic_read(&dest->activeconns), + atomic_read(&dest->inactconns)); + len += sprintf(buf+len, "%-63s\n", temp); + if (len >= length) + goto done; + } + } + } + + /* print the service table hashed by fwmark */ + for (idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + l = &ip_vs_svc_fwm_table[idx]; + for (e=l->next; e!=l; e=e->next) { + svc = list_entry(e, struct ip_vs_service, f_list); + pos += 64; + if (pos > offset) { + if (svc->flags & IP_VS_SVC_F_PERSISTENT) + sprintf(temp2, "persistent %d %08X", + svc->timeout, + ntohl(svc->netmask)); + else + temp2[0] = '\0'; + + sprintf(temp, "FWM %08X %s %s", + svc->fwmark, + svc->scheduler->name, temp2); + len += sprintf(buf+len, "%-63s\n", temp); + if (len >= length) + goto done; + } + + p = &svc->destinations; + for (q=p->next; q!=p; q=q->next) { + dest = list_entry(q, struct ip_vs_dest, n_list); + pos += 64; + if (pos <= offset) + continue; + sprintf(temp, + " -> %08X:%04X %-7s %-6d %-10d %-10d", + ntohl(dest->addr), + ntohs(dest->port), + ip_vs_fwd_name(atomic_read(&dest->conn_flags)), + atomic_read(&dest->weight), + atomic_read(&dest->activeconns), + atomic_read(&dest->inactconns)); + len += sprintf(buf+len, "%-63s\n", temp); + if (len >= length) + goto done; + } + } + } + + done: + read_unlock_bh(&__ip_vs_svc_lock); + + *start = buf+len-(pos-offset); /* Start of wanted data */ + len = pos-offset; + if (len > length) + len = length; + if (len < 0) + len = 0; + return len; +} + + +struct ip_vs_stats ip_vs_stats; + +static int +ip_vs_stats_get_info(char *buf, char **start, off_t offset, int length) +{ + int len=0; + off_t pos=0; + char temp[64]; + + pos += 320; + if (pos > offset) { + len += sprintf(buf+len, "%-63s\n%-63s\n", +/* 01234567 01234567 01234567 0123456701234567 0123456701234567 */ + " Total Incoming Outgoing Incoming Outgoing", + " Conns Packets Packets Bytes Bytes"); + + spin_lock_bh(&ip_vs_stats.lock); + sprintf(temp, "%8X %8X %8X %8X%08X %8X%08X", + ip_vs_stats.conns, + ip_vs_stats.inpkts, + ip_vs_stats.outpkts, + (__u32)(ip_vs_stats.inbytes>>32), + (__u32)ip_vs_stats.inbytes, + (__u32)(ip_vs_stats.outbytes>>32), + (__u32)ip_vs_stats.outbytes); + len += sprintf(buf+len, "%-62s\n\n", temp); + + len += sprintf(buf+len, "%-63s\n", +/* 01234567 01234567 01234567 0123456701234567 0123456701234567 */ + " Conns/s Pkts/s Pkts/s Bytes/s Bytes/s"); + sprintf(temp, "%8X %8X %8X %16X %16X", + ip_vs_stats.cps, + ip_vs_stats.inpps, + ip_vs_stats.outpps, + ip_vs_stats.inbps, + ip_vs_stats.outbps); + len += sprintf(buf+len, "%-63s\n", temp); + + spin_unlock_bh(&ip_vs_stats.lock); + } + + *start = buf+len-(pos-offset); /* Start of wanted data */ + len = pos-offset; + if (len > length) + len = length; + if (len < 0) + len = 0; + return len; +} + + +/* + * Set timeout values for tcp tcpfin udp in the vs_timeout_table. + */ +static int ip_vs_set_timeouts(struct ip_vs_rule_user *u) +{ + IP_VS_DBG(2, "Setting timeout tcp:%d tcpfin:%d udp:%d\n", + u->tcp_timeout, + u->tcp_fin_timeout, + u->udp_timeout); + + if (u->tcp_timeout) { + vs_timeout_table.timeout[IP_VS_S_ESTABLISHED] + = u->tcp_timeout * HZ; + } + + if (u->tcp_fin_timeout) { + vs_timeout_table.timeout[IP_VS_S_FIN_WAIT] + = u->tcp_fin_timeout * HZ; + } + + if (u->udp_timeout) { + vs_timeout_table.timeout[IP_VS_S_UDP] + = u->udp_timeout * HZ; + } + return 0; +} + + +static int +do_ip_vs_set_ctl(struct sock *sk, int cmd, void *user, unsigned int len) +{ + int ret; + struct ip_vs_rule_user *urule; + struct ip_vs_service *svc = NULL; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + /* + * Check the size of mm, no overflow... + * len > 128000 is a sanity check. + */ + if (len < sizeof(struct ip_vs_rule_user)) { + IP_VS_ERR("set_ctl: len %u < %u\n", + len, sizeof(struct ip_vs_rule_user)); + return -EINVAL; + } else if (len > 128000) { + IP_VS_ERR("set_ctl: len %u > 128000\n", len); + return -EINVAL; + } else if ((urule = kmalloc(len, GFP_KERNEL)) == NULL) { + IP_VS_ERR("set_ctl: no mem for len %u\n", len); + return -ENOMEM; + } else if (copy_from_user(urule, user, len) != 0) { + ret = -EFAULT; + goto out_free; + } + + MOD_INC_USE_COUNT; + if (down_interruptible(&__ip_vs_mutex)) { + ret = -ERESTARTSYS; + goto out_dec; + } + + if (cmd == IP_VS_SO_SET_FLUSH) { + /* Flush the virtual service */ + ret = ip_vs_flush(); + goto out_unlock; + } else if (cmd == IP_VS_SO_SET_TIMEOUTS) { + /* Set timeout values for (tcp tcpfin udp) */ + ret = ip_vs_set_timeouts(urule); + goto out_unlock; + } else if (cmd == IP_VS_SO_SET_STARTDAEMON) { + ret = start_sync_thread(urule->state, urule->mcast_ifn); + goto out_unlock; + } else if (cmd == IP_VS_SO_SET_STOPDAEMON) { + ret = stop_sync_thread(); + goto out_unlock; + } else if (cmd == IP_VS_SO_SET_ZERO) { + /* if no service address is set, zero counters in all */ + if (!urule->vfwmark && !urule->vaddr && !urule->vport) { + ret = ip_vs_zero_all(); + goto out_unlock; + } + } + + /* + * Check for valid protocol: TCP or UDP. Even for fwmark!=0 + */ + if (urule->protocol!=IPPROTO_TCP && urule->protocol!=IPPROTO_UDP) { + IP_VS_INFO("vs_ctl: invalid protocol: %d %d.%d.%d.%d:%d %s", + ntohs(urule->protocol), NIPQUAD(urule->vaddr), + ntohs(urule->vport), urule->sched_name); + ret = -EFAULT; + goto out_unlock; + } + + /* + * Lookup the exact service by or fwmark + */ + if (urule->vfwmark == 0) + svc = __ip_vs_service_get(urule->protocol, + urule->vaddr, urule->vport); + else + svc = __ip_vs_svc_fwm_get(urule->vfwmark); + + if (cmd != IP_VS_SO_SET_ADD + && (svc == NULL || svc->protocol != urule->protocol)) { + ret = -ESRCH; + goto out_unlock; + } + + switch (cmd) { + case IP_VS_SO_SET_ADD: + if (svc != NULL) + ret = -EEXIST; + else + ret = ip_vs_add_service(urule, &svc); + break; + case IP_VS_SO_SET_EDIT: + ret = ip_vs_edit_service(svc, urule); + break; + case IP_VS_SO_SET_DEL: + ret = ip_vs_del_service(svc); + if (!ret) + goto out_unlock; + break; + case IP_VS_SO_SET_ADDDEST: + ret = ip_vs_add_dest(svc, urule); + break; + case IP_VS_SO_SET_EDITDEST: + ret = ip_vs_edit_dest(svc, urule); + break; + case IP_VS_SO_SET_DELDEST: + ret = ip_vs_del_dest(svc, urule); + break; + case IP_VS_SO_SET_ZERO: + ret = ip_vs_zero_service(svc); + break; + default: + ret = -EINVAL; + } + + if (svc) + ip_vs_service_put(svc); + + out_unlock: + up(&__ip_vs_mutex); + out_dec: + MOD_DEC_USE_COUNT; + out_free: + kfree(urule); + return ret; +} + + +static inline void +__ip_vs_copy_stats(struct ip_vs_stats_user *dst, struct ip_vs_stats *src) +{ + spin_lock_bh(&src->lock); + memcpy(dst, src, (char*)&src->lock - (char*)src); + spin_unlock_bh(&src->lock); +} + +static inline int +__ip_vs_get_service_entries(const struct ip_vs_get_services *get, + struct ip_vs_get_services *uptr) +{ + int idx, count=0; + struct ip_vs_service *svc; + struct list_head *l; + struct ip_vs_service_user entry; + int ret = 0; + + for (idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + list_for_each (l, &ip_vs_svc_table[idx]) { + if (count >= get->num_services) + goto out; + svc = list_entry(l, struct ip_vs_service, s_list); + entry.protocol = svc->protocol; + entry.addr = svc->addr; + entry.port = svc->port; + entry.fwmark = svc->fwmark; + strcpy(entry.sched_name, svc->scheduler->name); + entry.flags = svc->flags; + entry.timeout = svc->timeout / HZ; + entry.netmask = svc->netmask; + entry.num_dests = svc->num_dests; + __ip_vs_copy_stats(&entry.stats, &svc->stats); + if (copy_to_user(&uptr->entrytable[count], + &entry, sizeof(entry))) { + ret = -EFAULT; + goto out; + } + count++; + } + } + + for (idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + list_for_each (l, &ip_vs_svc_fwm_table[idx]) { + if (count >= get->num_services) + goto out; + svc = list_entry(l, struct ip_vs_service, f_list); + entry.protocol = svc->protocol; + entry.addr = svc->addr; + entry.port = svc->port; + entry.fwmark = svc->fwmark; + strcpy(entry.sched_name, svc->scheduler->name); + entry.flags = svc->flags; + entry.timeout = svc->timeout / HZ; + entry.netmask = svc->netmask; + entry.num_dests = svc->num_dests; + __ip_vs_copy_stats(&entry.stats, &svc->stats); + if (copy_to_user(&uptr->entrytable[count], + &entry, sizeof(entry))) { + ret = -EFAULT; + goto out; + } + count++; + } + } + out: + return ret; +} + +static inline int +__ip_vs_get_dest_entries(const struct ip_vs_get_dests *get, + struct ip_vs_get_dests *uptr) +{ + struct ip_vs_service *svc; + int ret = 0; + + if (get->fwmark) + svc = __ip_vs_svc_fwm_get(get->fwmark); + else + svc = __ip_vs_service_get(get->protocol, + get->addr, get->port); + if (svc) { + int count = 0; + struct ip_vs_dest *dest; + struct list_head *l, *e; + struct ip_vs_dest_user entry; + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + if (count >= get->num_dests) + break; + dest = list_entry(e, struct ip_vs_dest, n_list); + entry.addr = dest->addr; + entry.port = dest->port; + entry.flags = atomic_read(&dest->conn_flags); + entry.weight = atomic_read(&dest->weight); + entry.activeconns = atomic_read(&dest->activeconns); + entry.inactconns = atomic_read(&dest->inactconns); + __ip_vs_copy_stats(&entry.stats, &dest->stats); + if (copy_to_user(&uptr->entrytable[count], + &entry, sizeof(entry))) { + ret = -EFAULT; + break; + } + count++; + } + ip_vs_service_put(svc); + } else + ret = -ESRCH; + return ret; +} + +static inline void +__ip_vs_get_timeouts(struct ip_vs_timeout_user *u) +{ + u->tcp_timeout = vs_timeout_table.timeout[IP_VS_S_ESTABLISHED] / HZ; + u->tcp_fin_timeout = vs_timeout_table.timeout[IP_VS_S_FIN_WAIT] / HZ; + u->udp_timeout = vs_timeout_table.timeout[IP_VS_S_UDP] / HZ; +} + +static int +do_ip_vs_get_ctl(struct sock *sk, int cmd, void *user, int *len) +{ + int ret = 0; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (down_interruptible(&__ip_vs_mutex)) + return -ERESTARTSYS; + + switch (cmd) { + case IP_VS_SO_GET_VERSION: + { + char buf[64]; + + sprintf(buf, "IP Virtual Server version %d.%d.%d (size=%d)", + NVERSION(IP_VS_VERSION_CODE), IP_VS_CONN_TAB_SIZE); + if (*len < strlen(buf)+1) { + ret = -EINVAL; + goto out; + } + if (copy_to_user(user, buf, strlen(buf)+1) != 0) { + ret = -EFAULT; + goto out; + } + *len = strlen(buf)+1; + } + break; + + case IP_VS_SO_GET_INFO: + { + struct ip_vs_getinfo info; + info.version = IP_VS_VERSION_CODE; + info.size = IP_VS_CONN_TAB_SIZE; + info.num_services = ip_vs_num_services; + if (copy_to_user(user, &info, sizeof(info)) != 0) + ret = -EFAULT; + } + break; + + case IP_VS_SO_GET_SERVICES: + { + struct ip_vs_get_services get; + + if (*len < sizeof(get)) { + IP_VS_ERR("length: %u < %u\n", *len, sizeof(get)); + ret = -EINVAL; + goto out; + } + if (copy_from_user(&get, user, sizeof(get))) { + ret = -EFAULT; + goto out; + } + if (*len != (sizeof(get)+sizeof(struct ip_vs_service_user)*get.num_services)) { + IP_VS_ERR("length: %u != %u\n", *len, + sizeof(get)+sizeof(struct ip_vs_service_user)*get.num_services); + ret = -EINVAL; + goto out; + } + ret = __ip_vs_get_service_entries(&get, user); + } + break; + + case IP_VS_SO_GET_SERVICE: + { + struct ip_vs_service_user get; + struct ip_vs_service *svc; + + if (*len != sizeof(get)) { + IP_VS_ERR("length: %u != %u\n", *len, sizeof(get)); + ret = -EINVAL; + goto out; + } + if (copy_from_user(&get, user, sizeof(get))) { + ret = -EFAULT; + goto out; + } + + if (get.fwmark) + svc = __ip_vs_svc_fwm_get(get.fwmark); + else + svc = __ip_vs_service_get(get.protocol, + get.addr, get.port); + if (svc) { + strcpy(get.sched_name, svc->scheduler->name); + get.flags = svc->flags; + get.timeout = svc->timeout / HZ; + get.netmask = svc->netmask; + get.num_dests = svc->num_dests; + __ip_vs_copy_stats(&get.stats, &svc->stats); + if (copy_to_user(user, &get, *len) != 0) + ret = -EFAULT; + ip_vs_service_put(svc); + } else + ret = -ESRCH; + } + break; + + case IP_VS_SO_GET_DESTS: + { + struct ip_vs_get_dests get; + + if (*len < sizeof(get)) { + IP_VS_ERR("length: %u < %u\n", *len, sizeof(get)); + ret = -EINVAL; + goto out; + } + if (copy_from_user(&get, user, sizeof(get))) { + ret = -EFAULT; + goto out; + } + if (*len != (sizeof(get) + + sizeof(struct ip_vs_dest_user)*get.num_dests)) { + IP_VS_ERR("length: %u != %u\n", *len, + sizeof(get)+sizeof(struct ip_vs_dest_user)*get.num_dests); + ret = -EINVAL; + goto out; + } + ret = __ip_vs_get_dest_entries(&get, user); + } + break; + + case IP_VS_SO_GET_TIMEOUTS: + { + struct ip_vs_timeout_user u; + + if (*len < sizeof(u)) { + IP_VS_ERR("length: %u < %u\n", *len, sizeof(u)); + ret = -EINVAL; + goto out; + } + __ip_vs_get_timeouts(&u); + if (copy_to_user(user, &u, sizeof(u)) != 0) + ret = -EFAULT; + } + break; + + case IP_VS_SO_GET_DAEMON: + { + struct ip_vs_daemon_user u; + + if (*len < sizeof(u)) { + IP_VS_ERR("length: %u < %u\n", *len, sizeof(u)); + ret = -EINVAL; + goto out; + } + u.state = ip_vs_sync_state; + strcpy(u.mcast_ifn, ip_vs_mcast_ifn); + if (copy_to_user(user, &u, sizeof(u)) != 0) + ret = -EFAULT; + } + break; + + default: + ret = -EINVAL; + } + + out: + up(&__ip_vs_mutex); + return ret; +} + + +static struct nf_sockopt_ops ip_vs_sockopts = { + { NULL, NULL }, PF_INET, + IP_VS_BASE_CTL, IP_VS_SO_SET_MAX+1, do_ip_vs_set_ctl, + IP_VS_BASE_CTL, IP_VS_SO_GET_MAX+1, do_ip_vs_get_ctl +}; + + +int ip_vs_control_init(void) +{ + int ret; + int idx; + + EnterFunction(2); + + ret = nf_register_sockopt(&ip_vs_sockopts); + if (ret) { + IP_VS_ERR("cannot register sockopt.\n"); + return ret; + } + + proc_net_create("ip_vs", 0, ip_vs_get_info); + proc_net_create("ip_vs_stats", 0, ip_vs_stats_get_info); + + ipv4_vs_table.sysctl_header = + register_sysctl_table(ipv4_vs_table.root_dir, 0); + /* + * Initilize ip_vs_svc_table, ip_vs_svc_fwm_table, ip_vs_rtable, + * ip_vs_schedulers. + */ + for(idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { + INIT_LIST_HEAD(&ip_vs_svc_table[idx]); + INIT_LIST_HEAD(&ip_vs_svc_fwm_table[idx]); + } + for(idx = 0; idx < IP_VS_RTAB_SIZE; idx++) { + INIT_LIST_HEAD(&ip_vs_rtable[idx]); + } + + memset(&ip_vs_stats, 0, sizeof(ip_vs_stats)); + ip_vs_stats.lock = SPIN_LOCK_UNLOCKED; + ip_vs_new_estimator(&ip_vs_stats); + + /* Hook the defense timer */ + init_timer(&defense_timer); + defense_timer.function = defense_timer_handler; + defense_timer.expires = jiffies + DEFENSE_TIMER_PERIOD; + add_timer(&defense_timer); + + LeaveFunction(2); + return 0; +} + +void ip_vs_control_cleanup(void) +{ + EnterFunction(2); + ip_vs_trash_cleanup(); + del_timer_sync(&defense_timer); + ip_vs_kill_estimator(&ip_vs_stats); + unregister_sysctl_table(ipv4_vs_table.sysctl_header); + proc_net_remove("ip_vs_stats"); + proc_net_remove("ip_vs"); + nf_unregister_sockopt(&ip_vs_sockopts); + LeaveFunction(2); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_dh.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_dh.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_dh.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_dh.c 2003-10-22 22:48:55.000000000 +0000 @@ -0,0 +1,265 @@ +/* + * IPVS: Destination Hashing scheduling module + * + * Version: $Id: ip_vs_dh.c,v 1.4 2001/10/19 15:05:17 wensong Exp $ + * + * Authors: Wensong Zhang + * + * Inspired by the consistent hashing scheduler patch from + * Thomas Proell + * + * 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. + * + * Changes: + * + */ + +/* + * The dh algorithm is to select server by the hash key of destination IP + * address. The pseudo code is as follows: + * + * n <- servernode[dest_ip]; + * if (n is dead) OR + * (n is overloaded, such as n.conns>2*n.weight) then + * return NULL; + * + * return n; + * + * Notes that servernode is a 256-bucket hash table that maps the hash + * index derived from packet destination IP address to the current server + * array. If the dh scheduler is used in cache cluster, it is good to + * combine it with cache_bypass feature. When the statically assigned + * server is dead or overloaded, the load balancer can bypass the cache + * server and send requests to the original server directly. + * + */ + +#include +#include +#include +#include +#include +#include + +#include + + +/* + * IPVS DH bucket + */ +struct ip_vs_dh_bucket { + struct ip_vs_dest *dest; /* real server (cache) */ +}; + +/* + * for IPVS DH entry hash table + */ +#ifndef CONFIG_IP_VS_DH_TAB_BITS +#define CONFIG_IP_VS_DH_TAB_BITS 8 +#endif +#define IP_VS_DH_TAB_BITS CONFIG_IP_VS_DH_TAB_BITS +#define IP_VS_DH_TAB_SIZE (1 << IP_VS_DH_TAB_BITS) +#define IP_VS_DH_TAB_MASK (IP_VS_DH_TAB_SIZE - 1) + + +/* + * Returns hash value for IPVS DH entry + */ +static inline unsigned ip_vs_dh_hashkey(__u32 addr) +{ + return (ntohl(addr)*2654435761UL) & IP_VS_DH_TAB_MASK; +} + + +/* + * Get ip_vs_dest associated with supplied parameters. + */ +static inline struct ip_vs_dest * +ip_vs_dh_get(struct ip_vs_dh_bucket *tbl, __u32 addr) +{ + return (tbl[ip_vs_dh_hashkey(addr)]).dest; +} + + +/* + * Assign all the hash buckets of the specified table with the service. + */ +static int +ip_vs_dh_assign(struct ip_vs_dh_bucket *tbl, struct ip_vs_service *svc) +{ + int i; + struct ip_vs_dh_bucket *b; + struct list_head *p; + struct ip_vs_dest *dest; + + b = tbl; + p = &svc->destinations; + for (i=0; idest = NULL; + } else { + if (p == &svc->destinations) + p = p->next; + + dest = list_entry(p, struct ip_vs_dest, n_list); + atomic_inc(&dest->refcnt); + b->dest = dest; + + p = p->next; + } + b++; + } + return 0; +} + + +/* + * Flush all the hash buckets of the specified table. + */ +static void ip_vs_dh_flush(struct ip_vs_dh_bucket *tbl) +{ + int i; + struct ip_vs_dh_bucket *b; + + b = tbl; + for (i=0; idest) { + atomic_dec(&b->dest->refcnt); + b->dest = NULL; + } + b++; + } +} + + +static int ip_vs_dh_init_svc(struct ip_vs_service *svc) +{ + struct ip_vs_dh_bucket *tbl; + + /* allocate the DH table for this service */ + tbl = kmalloc(sizeof(struct ip_vs_dh_bucket)*IP_VS_DH_TAB_SIZE, + GFP_ATOMIC); + if (tbl == NULL) { + IP_VS_ERR("ip_vs_dh_init_svc(): no memory\n"); + return -ENOMEM; + } + svc->sched_data = tbl; + IP_VS_DBG(6, "DH hash table (memory=%dbytes) allocated for " + "current service\n", + sizeof(struct ip_vs_dh_bucket)*IP_VS_DH_TAB_SIZE); + + /* assign the hash buckets with the updated service */ + ip_vs_dh_assign(tbl, svc); + + return 0; +} + + +static int ip_vs_dh_done_svc(struct ip_vs_service *svc) +{ + struct ip_vs_dh_bucket *tbl = svc->sched_data; + + /* got to clean up hash buckets here */ + ip_vs_dh_flush(tbl); + + /* release the table itself */ + kfree(svc->sched_data); + IP_VS_DBG(6, "DH hash table (memory=%dbytes) released\n", + sizeof(struct ip_vs_dh_bucket)*IP_VS_DH_TAB_SIZE); + + return 0; +} + + +static int ip_vs_dh_update_svc(struct ip_vs_service *svc) +{ + struct ip_vs_dh_bucket *tbl = svc->sched_data; + + /* got to clean up hash buckets here */ + ip_vs_dh_flush(tbl); + + /* assign the hash buckets with the updated service */ + ip_vs_dh_assign(tbl, svc); + + return 0; +} + + +/* + * If the number of active connections is twice larger than its weight, + * consider that the server is overloaded here. + */ +static inline int is_overloaded(struct ip_vs_dest *dest) +{ + if (atomic_read(&dest->activeconns) > atomic_read(&dest->weight)*2) { + return 1; + } + return 0; +} + + +/* + * Destination hashing scheduling + */ +static struct ip_vs_dest * +ip_vs_dh_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + struct ip_vs_dest *dest; + struct ip_vs_dh_bucket *tbl; + + IP_VS_DBG(6, "ip_vs_dh_schedule(): Scheduling...\n"); + + tbl = (struct ip_vs_dh_bucket *)svc->sched_data; + dest = ip_vs_dh_get(tbl, iph->daddr); + if (!dest + || !(dest->flags & IP_VS_DEST_F_AVAILABLE) + || atomic_read(&dest->weight) <= 0 + || is_overloaded(dest)) { + return NULL; + } + + IP_VS_DBG(6, "DH: destination IP address %u.%u.%u.%u " + "--> server %u.%u.%u.%u:%d\n", + NIPQUAD(iph->daddr), + NIPQUAD(dest->addr), + ntohs(dest->port)); + + return dest; +} + + +/* + * IPVS DH Scheduler structure + */ +static struct ip_vs_scheduler ip_vs_dh_scheduler = +{ + {0}, /* n_list */ + "dh", /* name */ + ATOMIC_INIT(0), /* refcnt */ + THIS_MODULE, /* this module */ + ip_vs_dh_init_svc, /* service initializer */ + ip_vs_dh_done_svc, /* service done */ + ip_vs_dh_update_svc, /* service updater */ + ip_vs_dh_schedule, /* select a server from the destination list */ +}; + + +static int __init ip_vs_dh_init(void) +{ + INIT_LIST_HEAD(&ip_vs_dh_scheduler.n_list); + return register_ip_vs_scheduler(&ip_vs_dh_scheduler); +} + + +static void __exit ip_vs_dh_cleanup(void) +{ + unregister_ip_vs_scheduler(&ip_vs_dh_scheduler); +} + + +module_init(ip_vs_dh_init); +module_exit(ip_vs_dh_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_est.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_est.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_est.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_est.c 2003-10-22 22:47:52.000000000 +0000 @@ -0,0 +1,200 @@ +/* + * ip_vs_est.c Simple rate estimator for IPVS + * + * Version: $Id: ip_vs_est.c,v 1.3.2.1 2003/07/29 14:37:13 wensong Exp $ + * + * Authors: Wensong Zhang + * + * 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. + * + * Changes: + * + */ +#include +#include + +#include + +/* + This code is to estimate rate in a shorter interval (such as 8 + seconds) for virtual services and real servers. For measure rate in a + long interval, it is easy to implement a user level daemon which + periodically reads those statistical counters and measure rate. + + Currently, the measurement is activated by slow timer handler. Hope + this measurement will not introduce too much load. + + We measure rate during the last 8 seconds every 2 seconds: + + avgrate = avgrate*(1-W) + rate*W + + where W = 2^(-2) + + NOTES. + + * The stored value for average bps is scaled by 2^5, so that maximal + rate is ~2.15Gbits/s, average pps and cps are scaled by 2^10. + + * A lot code is taken from net/sched/estimator.c + */ + + +struct ip_vs_estimator +{ + struct ip_vs_estimator *next; + struct ip_vs_stats *stats; + + u32 last_conns; + u32 last_inpkts; + u32 last_outpkts; + u64 last_inbytes; + u64 last_outbytes; + + u32 cps; + u32 inpps; + u32 outpps; + u32 inbps; + u32 outbps; +}; + + +static struct ip_vs_estimator *est_list = NULL; +static rwlock_t est_lock = RW_LOCK_UNLOCKED; +static struct timer_list est_timer; + +static void estimation_timer(unsigned long arg) +{ + struct ip_vs_estimator *e; + struct ip_vs_stats *s; + u32 n_conns; + u32 n_inpkts, n_outpkts; + u64 n_inbytes, n_outbytes; + u32 rate; + + read_lock(&est_lock); + for (e = est_list; e; e = e->next) { + s = e->stats; + + spin_lock(&s->lock); + n_conns = s->conns; + n_inpkts = s->inpkts; + n_outpkts = s->outpkts; + n_inbytes = s->inbytes; + n_outbytes = s->outbytes; + + /* scaled by 2^10, but divided 2 seconds */ + rate = (n_conns - e->last_conns)<<9; + e->last_conns = n_conns; + e->cps += ((long)rate - (long)e->cps)>>2; + s->cps = (e->cps+0x1FF)>>10; + + rate = (n_inpkts - e->last_inpkts)<<9; + e->last_inpkts = n_inpkts; + e->inpps += ((long)rate - (long)e->inpps)>>2; + s->inpps = (e->inpps+0x1FF)>>10; + + rate = (n_outpkts - e->last_outpkts)<<9; + e->last_outpkts = n_outpkts; + e->outpps += ((long)rate - (long)e->outpps)>>2; + s->outpps = (e->outpps+0x1FF)>>10; + + rate = (n_inbytes - e->last_inbytes)<<4; + e->last_inbytes = n_inbytes; + e->inbps += ((long)rate - (long)e->inbps)>>2; + s->inbps = (e->inbps+0xF)>>5; + + rate = (n_outbytes - e->last_outbytes)<<4; + e->last_outbytes = n_outbytes; + e->outbps += ((long)rate - (long)e->outbps)>>2; + s->outbps = (e->outbps+0xF)>>5; + spin_unlock(&s->lock); + } + read_unlock(&est_lock); + mod_timer(&est_timer, jiffies + 2*HZ); +} + +int ip_vs_new_estimator(struct ip_vs_stats *stats) +{ + struct ip_vs_estimator *est; + + est = kmalloc(sizeof(*est), GFP_KERNEL); + if (est == NULL) + return -ENOMEM; + + memset(est, 0, sizeof(*est)); + est->stats = stats; + est->last_conns = stats->conns; + est->cps = stats->cps<<10; + + est->last_inpkts = stats->inpkts; + est->inpps = stats->inpps<<10; + + est->last_outpkts = stats->outpkts; + est->outpps = stats->outpps<<10; + + est->last_inbytes = stats->inbytes; + est->inbps = stats->inbps<<5; + + est->last_outbytes = stats->outbytes; + est->outbps = stats->outbps<<5; + + est->next = est_list; + if (est->next == NULL) { + init_timer(&est_timer); + est_timer.expires = jiffies + 2*HZ; + est_timer.function = estimation_timer; + add_timer(&est_timer); + } + write_lock_bh(&est_lock); + est_list = est; + write_unlock_bh(&est_lock); + return 0; +} + +void ip_vs_kill_estimator(struct ip_vs_stats *stats) +{ + struct ip_vs_estimator *est, **pest; + int killed = 0; + + write_lock_bh(&est_lock); + pest = &est_list; + while ((est=*pest) != NULL) { + if (est->stats != stats) { + pest = &est->next; + continue; + } + *pest = est->next; + kfree(est); + killed++; + } + if (killed && est_list == NULL) + del_timer_sync(&est_timer); + write_unlock_bh(&est_lock); +} + +void ip_vs_zero_estimator(struct ip_vs_stats *stats) +{ + struct ip_vs_estimator *e; + + write_lock_bh(&est_lock); + for (e = est_list; e; e = e->next) { + if (e->stats != stats) + continue; + + /* set counters zero */ + e->last_conns = 0; + e->last_inpkts = 0; + e->last_outpkts = 0; + e->last_inbytes = 0; + e->last_outbytes = 0; + e->cps = 0; + e->inpps = 0; + e->outpps = 0; + e->inbps = 0; + e->outbps = 0; + } + write_unlock_bh(&est_lock); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_ftp.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_ftp.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_ftp.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_ftp.c 2003-10-22 22:49:11.000000000 +0000 @@ -0,0 +1,412 @@ +/* + * IP_VS ftp application module + * + * Version: $Id: ip_vs_ftp.c,v 1.12 2002/08/10 04:32:35 wensong Exp $ + * + * Authors: Wensong Zhang + * + * Changes: + * + * + * 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. + * + * Most code here is taken from ip_masq_ftp.c in kernel 2.2. The difference + * is that ip_vs_ftp module handles the reverse direction to ip_masq_ftp. + * + * IP_MASQ_FTP ftp masquerading module + * + * Version: @(#)ip_masq_ftp.c 0.04 02/05/96 + * + * Author: Wouter Gadeyne + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#define SERVER_STRING "227 Entering Passive Mode (" +#define CLIENT_STRING "PORT " + + +/* + * List of ports (up to IP_VS_APP_MAX_PORTS) to be handled by helper + * First port is set to the default port. + */ +static int ports[IP_VS_APP_MAX_PORTS] = {21, 0}; +struct ip_vs_app *incarnations[IP_VS_APP_MAX_PORTS]; + +/* + * Debug level + */ +#ifdef CONFIG_IP_VS_DEBUG +static int debug=0; +MODULE_PARM(debug, "i"); +#endif + +MODULE_PARM(ports, "1-" __MODULE_STRING(IP_VS_APP_MAX_PORTS) "i"); + +/* Dummy variable */ +static int ip_vs_ftp_pasv; + + +static int +ip_vs_ftp_init_conn(struct ip_vs_app *vapp, struct ip_vs_conn *cp) +{ + return 0; +} + + +static int +ip_vs_ftp_done_conn(struct ip_vs_app *vapp, struct ip_vs_conn *cp) +{ + return 0; +} + + +/* + * Get from the string "xxx.xxx.xxx.xxx,ppp,ppp", started + * with the "pattern" and terminated with the "term" character. + * is in network order. + */ +static int ip_vs_ftp_get_addrport(char *data, char *data_limit, + const char *pattern, size_t plen, char term, + __u32 *addr, __u16 *port, + char **start, char **end) +{ + unsigned char p[6]; + int i = 0; + + if (data_limit - data < plen) { + /* check if there is partial match */ + if (strnicmp(data, pattern, data_limit - data) == 0) + return -1; + else + return 0; + } + + if (strnicmp(data, pattern, plen) != 0) { + return 0; + } + *start = data + plen; + + for (data = *start; *data != term; data++) { + if (data == data_limit) + return -1; + } + *end = data; + + memset(p, 0, sizeof(p)); + for (data = *start; data != *end; data++) { + if (*data >= '0' && *data <= '9') { + p[i] = p[i]*10 + *data - '0'; + } else if (*data == ',' && i < 5) { + i++; + } else { + /* unexpected character */ + return -1; + } + } + + if (i != 5) + return -1; + + *addr = (p[3]<<24) | (p[2]<<16) | (p[1]<<8) | p[0]; + *port = (p[5]<<8) | p[4]; + return 1; +} + + +/* + * Look at outgoing ftp packets to catch the response to a PASV command + * from the server (inside-to-outside). + * When we see one, we build a connection entry with the client address, + * client port 0 (unknown at the moment), the server address and the + * server port. Mark the current connection entry as a control channel + * of the new entry. All this work is just to make the data connection + * can be scheduled to the right server later. + * + * The outgoing packet should be something like + * "227 Entering Passive Mode (xxx,xxx,xxx,xxx,ppp,ppp)". + * xxx,xxx,xxx,xxx is the server address, ppp,ppp is the server port number. + */ +static int ip_vs_ftp_out(struct ip_vs_app *vapp, + struct ip_vs_conn *cp, struct sk_buff *skb) +{ + struct iphdr *iph; + struct tcphdr *th; + char *data, *data_limit; + char *start, *end; + __u32 from; + __u16 port; + struct ip_vs_conn *n_cp; + char buf[24]; /* xxx.xxx.xxx.xxx,ppp,ppp\000 */ + unsigned buf_len; + int diff; + + /* Only useful for established sessions */ + if (cp->state != IP_VS_S_ESTABLISHED) + return 0; + + if (cp->app_data == &ip_vs_ftp_pasv) { + iph = skb->nh.iph; + th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); + data = (char *)th + (th->doff << 2); + data_limit = skb->tail; + + if (ip_vs_ftp_get_addrport(data, data_limit, + SERVER_STRING, + sizeof(SERVER_STRING)-1, ')', + &from, &port, + &start, &end) != 1) + return 0; + + IP_VS_DBG(1-debug, "PASV response (%u.%u.%u.%u:%d) -> " + "%u.%u.%u.%u:%d detected\n", + NIPQUAD(from), ntohs(port), NIPQUAD(cp->caddr), 0); + + /* + * Now update or create an connection entry for it + */ + n_cp = ip_vs_conn_out_get(iph->protocol, from, port, + cp->caddr, 0); + if (!n_cp) { + n_cp = ip_vs_conn_new(IPPROTO_TCP, + cp->caddr, 0, + cp->vaddr, port, + from, port, + IP_VS_CONN_F_NO_CPORT, + cp->dest); + if (!n_cp) + return 0; + + /* add its controller */ + ip_vs_control_add(n_cp, cp); + + /* increase dest's inactive connection counter */ + if (cp->dest) + atomic_inc(&cp->dest->inactconns); + } + + /* + * Replace the old passive address with the new one + */ + from = n_cp->vaddr; + port = n_cp->vport; + sprintf(buf,"%d,%d,%d,%d,%d,%d", NIPQUAD(from), + port&255, port>>8&255); + buf_len = strlen(buf); + + /* + * Calculate required delta-offset to keep TCP happy + */ + diff = buf_len - (end-start); + + if (diff == 0) { + /* simply replace it with new passive address */ + memcpy(start, buf, buf_len); + } else { + /* fixme: return value isn't checked here */ + ip_vs_skb_replace(skb, GFP_ATOMIC, start, + end-start, buf, buf_len); + } + + cp->app_data = NULL; + ip_vs_conn_listen(n_cp); + ip_vs_conn_put(n_cp); + return diff; + } + return 0; +} + + +/* + * Look at incoming ftp packets to catch the PASV/PORT command + * (outside-to-inside). + * + * The incoming packet having the PORT command should be something like + * "PORT xxx,xxx,xxx,xxx,ppp,ppp\n". + * xxx,xxx,xxx,xxx is the client address, ppp,ppp is the client port number. + * In this case, we create a connection entry using the client address and + * port, so that the active ftp data connection from the server can reach + * the client. + */ +static int ip_vs_ftp_in(struct ip_vs_app *vapp, + struct ip_vs_conn *cp, struct sk_buff *skb) +{ + struct iphdr *iph; + struct tcphdr *th; + char *data, *data_start, *data_limit; + char *start, *end; + __u32 to; + __u16 port; + struct ip_vs_conn *n_cp; + + /* Only useful for established sessions */ + if (cp->state != IP_VS_S_ESTABLISHED) + return 0; + + /* + * Detecting whether it is passive + */ + iph = skb->nh.iph; + th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); + + /* Since there may be OPTIONS in the TCP packet and the HLEN is + the length of the header in 32-bit multiples, it is accurate + to calculate data address by th+HLEN*4 */ + data = data_start = (char *)th + (th->doff << 2); + data_limit = skb->tail; + + while (data <= data_limit - 6) { + if (strnicmp(data, "PASV\r\n", 6) == 0) { + IP_VS_DBG(1-debug, "got PASV at %d of %d\n", + data - data_start, + data_limit - data_start); + cp->app_data = &ip_vs_ftp_pasv; + return 0; + } + data++; + } + + /* + * To support virtual FTP server, the scenerio is as follows: + * FTP client ----> Load Balancer ----> FTP server + * First detect the port number in the application data, + * then create a new connection entry for the coming data + * connection. + */ + if (ip_vs_ftp_get_addrport(data_start, data_limit, + CLIENT_STRING, sizeof(CLIENT_STRING)-1, + '\r', &to, &port, + &start, &end) != 1) + return 0; + + IP_VS_DBG(1-debug, "PORT %u.%u.%u.%u:%d detected\n", + NIPQUAD(to), ntohs(port)); + + /* + * Now update or create a connection entry for it + */ + IP_VS_DBG(1-debug, "protocol %s %u.%u.%u.%u:%d %u.%u.%u.%u:%d\n", + ip_vs_proto_name(iph->protocol), + NIPQUAD(to), ntohs(port), + NIPQUAD(cp->vaddr), ntohs(cp->vport) - 1); + + n_cp = ip_vs_conn_in_get(iph->protocol, + to, port, + cp->vaddr, htons(ntohs(cp->vport)-1)); + if (!n_cp) { + n_cp = ip_vs_conn_new(IPPROTO_TCP, + to, port, + cp->vaddr, htons(ntohs(cp->vport)-1), + cp->daddr, htons(ntohs(cp->dport)-1), + 0, + cp->dest); + if (!n_cp) + return 0; + + /* add its controller */ + ip_vs_control_add(n_cp, cp); + + /* increase dest's inactive connection counter */ + if (cp->dest) + atomic_inc(&cp->dest->inactconns); + } + + /* + * Move tunnel to listen state + */ + ip_vs_conn_listen(n_cp); + ip_vs_conn_put(n_cp); + + /* no diff required for incoming packets */ + return 0; +} + + +static struct ip_vs_app ip_vs_ftp = { + {0}, /* n_list */ + "ftp", /* name */ + 0, /* type */ + THIS_MODULE, /* this module */ + ip_vs_ftp_init_conn, /* ip_vs_init_conn */ + ip_vs_ftp_done_conn, /* ip_vs_done_conn */ + ip_vs_ftp_out, /* pkt_out */ + ip_vs_ftp_in, /* pkt_in */ +}; + + +/* + * ip_vs_ftp initialization + */ +static int __init ip_vs_ftp_init(void) +{ + int i, j; + + for (i=0; i + * + * 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. + * + * Changes: + * Martin Hamilton : fixed the terrible locking bugs + * *lock(tbl->lock) ==> *lock(&tbl->lock) + * Wensong Zhang : fixed the uninitilized tbl->lock bug + * Wensong Zhang : added doing full expiration check to + * collect stale entries of 24+ hours when + * no partial expire check in a half hour + * Julian Anastasov : replaced del_timer call with del_timer_sync + * to avoid the possible race between timer + * handler and del_timer thread in SMP + * + */ + +/* + * The lblc algorithm is as follows (pseudo code): + * + * if cachenode[dest_ip] is null then + * n, cachenode[dest_ip] <- {weighted least-conn node}; + * else + * n <- cachenode[dest_ip]; + * if (n is dead) OR + * (n.conns>n.weight AND + * there is a node m with m.conns +#include +#include +#include +#include +#include + +/* for systcl */ +#include +#include + +#include + + +/* + * It is for garbage collection of stale IPVS lblc entries, + * when the table is full. + */ +#define CHECK_EXPIRE_INTERVAL (60*HZ) +#define ENTRY_TIMEOUT (6*60*HZ) + +/* + * It is for full expiration check. + * When there is no partial expiration check (garbage collection) + * in a half hour, do a full expiration check to collect stale + * entries that haven't been touched for a day. + */ +#define COUNT_FOR_FULL_EXPIRATION 30 +int sysctl_ip_vs_lblc_expiration = 24*60*60*HZ; + + +/* + * for IPVS lblc entry hash table + */ +#ifndef CONFIG_IP_VS_LBLC_TAB_BITS +#define CONFIG_IP_VS_LBLC_TAB_BITS 10 +#endif +#define IP_VS_LBLC_TAB_BITS CONFIG_IP_VS_LBLC_TAB_BITS +#define IP_VS_LBLC_TAB_SIZE (1 << IP_VS_LBLC_TAB_BITS) +#define IP_VS_LBLC_TAB_MASK (IP_VS_LBLC_TAB_SIZE - 1) + + +/* + * IPVS lblc entry represents an association between destination + * IP address and its destination server + */ +struct ip_vs_lblc_entry { + struct list_head list; + __u32 addr; /* destination IP address */ + struct ip_vs_dest *dest; /* real server (cache) */ + unsigned long lastuse; /* last used time */ +}; + + +/* + * IPVS lblc hash table + */ +struct ip_vs_lblc_table { + rwlock_t lock; /* lock for this table */ + struct list_head bucket[IP_VS_LBLC_TAB_SIZE]; /* hash bucket */ + atomic_t entries; /* number of entries */ + int max_size; /* maximum size of entries */ + struct timer_list periodic_timer; /* collect stale entries */ + int rover; /* rover for expire check */ + int counter; /* counter for no expire */ +}; + + +/* + * IPVS LBLC sysctl table + */ +struct ip_vs_lblc_sysctl_table { + struct ctl_table_header *sysctl_header; + ctl_table vs_vars[2]; + ctl_table vs_dir[2]; + ctl_table ipv4_dir[2]; + ctl_table root_dir[2]; +}; + + +static struct ip_vs_lblc_sysctl_table lblc_sysctl_table = { + NULL, + {{NET_IPV4_VS_LBLC_EXPIRE, "lblc_expiration", + &sysctl_ip_vs_lblc_expiration, + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {0}}, + {{NET_IPV4_VS, "vs", NULL, 0, 0555, lblc_sysctl_table.vs_vars}, + {0}}, + {{NET_IPV4, "ipv4", NULL, 0, 0555, lblc_sysctl_table.vs_dir}, + {0}}, + {{CTL_NET, "net", NULL, 0, 0555, lblc_sysctl_table.ipv4_dir}, + {0}} +}; + + +/* + * new/free a ip_vs_lblc_entry, which is a mapping of a destionation + * IP address to a server. + */ +static inline struct ip_vs_lblc_entry * +ip_vs_lblc_new(__u32 daddr, struct ip_vs_dest *dest) +{ + struct ip_vs_lblc_entry *en; + + en = kmalloc(sizeof(struct ip_vs_lblc_entry), GFP_ATOMIC); + if (en == NULL) { + IP_VS_ERR("ip_vs_lblc_new(): no memory\n"); + return NULL; + } + + INIT_LIST_HEAD(&en->list); + en->addr = daddr; + + atomic_inc(&dest->refcnt); + en->dest = dest; + + return en; +} + + +static inline void ip_vs_lblc_free(struct ip_vs_lblc_entry *en) +{ + list_del(&en->list); + /* + * We don't kfree dest because it is refered either by its service + * or the trash dest list. + */ + atomic_dec(&en->dest->refcnt); + kfree(en); +} + + +/* + * Returns hash value for IPVS LBLC entry + */ +static inline unsigned ip_vs_lblc_hashkey(__u32 addr) +{ + return (ntohl(addr)*2654435761UL) & IP_VS_LBLC_TAB_MASK; +} + + +/* + * Hash an entry in the ip_vs_lblc_table. + * returns bool success. + */ +static int +ip_vs_lblc_hash(struct ip_vs_lblc_table *tbl, struct ip_vs_lblc_entry *en) +{ + unsigned hash; + + if (!list_empty(&en->list)) { + IP_VS_ERR("ip_vs_lblc_hash(): request for already hashed, " + "called from %p\n", __builtin_return_address(0)); + return 0; + } + + /* + * Hash by destination IP address + */ + hash = ip_vs_lblc_hashkey(en->addr); + + write_lock(&tbl->lock); + list_add(&en->list, &tbl->bucket[hash]); + atomic_inc(&tbl->entries); + write_unlock(&tbl->lock); + + return 1; +} + + +#if 0000 +/* + * Unhash ip_vs_lblc_entry from ip_vs_lblc_table. + * returns bool success. + */ +static int ip_vs_lblc_unhash(struct ip_vs_lblc_table *tbl, + struct ip_vs_lblc_entry *en) +{ + if (list_empty(&en->list)) { + IP_VS_ERR("ip_vs_lblc_unhash(): request for not hashed entry, " + "called from %p\n", __builtin_return_address(0)); + return 0; + } + + /* + * Remove it from the table + */ + write_lock(&tbl->lock); + list_del(&en->list); + INIT_LIST_HEAD(&en->list); + write_unlock(&tbl->lock); + + return 1; +} +#endif + + +/* + * Get ip_vs_lblc_entry associated with supplied parameters. + */ +static inline struct ip_vs_lblc_entry * +ip_vs_lblc_get(struct ip_vs_lblc_table *tbl, __u32 addr) +{ + unsigned hash; + struct ip_vs_lblc_entry *en; + struct list_head *l,*e; + + hash = ip_vs_lblc_hashkey(addr); + l = &tbl->bucket[hash]; + + read_lock(&tbl->lock); + + for (e=l->next; e!=l; e=e->next) { + en = list_entry(e, struct ip_vs_lblc_entry, list); + if (en->addr == addr) { + /* HIT */ + read_unlock(&tbl->lock); + return en; + } + } + + read_unlock(&tbl->lock); + + return NULL; +} + + +/* + * Flush all the entries of the specified table. + */ +static void ip_vs_lblc_flush(struct ip_vs_lblc_table *tbl) +{ + int i; + struct list_head *l; + struct ip_vs_lblc_entry *en; + + for (i=0; ilock); + for (l=&tbl->bucket[i]; l->next!=l; ) { + en = list_entry(l->next, + struct ip_vs_lblc_entry, list); + ip_vs_lblc_free(en); + atomic_dec(&tbl->entries); + } + write_unlock(&tbl->lock); + } +} + + +static inline void ip_vs_lblc_full_check(struct ip_vs_lblc_table *tbl) +{ + unsigned long now = jiffies; + int i, j; + struct list_head *l, *e; + struct ip_vs_lblc_entry *en; + + for (i=0, j=tbl->rover; ibucket[j]; + write_lock(&tbl->lock); + while (e->next != l) { + en = list_entry(e->next, + struct ip_vs_lblc_entry, list); + if ((now - en->lastuse) < + sysctl_ip_vs_lblc_expiration) { + e = e->next; + continue; + } + ip_vs_lblc_free(en); + atomic_dec(&tbl->entries); + } + write_unlock(&tbl->lock); + } + tbl->rover = j; +} + + +/* + * Periodical timer handler for IPVS lblc table + * It is used to collect stale entries when the number of entries + * exceeds the maximum size of the table. + * + * Fixme: we probably need more complicated algorithm to collect + * entries that have not been used for a long time even + * if the number of entries doesn't exceed the maximum size + * of the table. + * The full expiration check is for this purpose now. + */ +static void ip_vs_lblc_check_expire(unsigned long data) +{ + struct ip_vs_lblc_table *tbl; + unsigned long now = jiffies; + int goal; + int i, j; + struct list_head *l, *e; + struct ip_vs_lblc_entry *en; + + tbl = (struct ip_vs_lblc_table *)data; + + if ((tbl->counter % COUNT_FOR_FULL_EXPIRATION) == 0) { + /* do full expiration check */ + ip_vs_lblc_full_check(tbl); + tbl->counter = 1; + goto out; + } + + if (atomic_read(&tbl->entries) <= tbl->max_size) { + tbl->counter++; + goto out; + } + + goal = (atomic_read(&tbl->entries) - tbl->max_size)*4/3; + if (goal > tbl->max_size/2) + goal = tbl->max_size/2; + + for (i=0, j=tbl->rover; ibucket[j]; + write_lock(&tbl->lock); + while (e->next != l) { + en = list_entry(e->next, + struct ip_vs_lblc_entry, list); + if ((now - en->lastuse) < ENTRY_TIMEOUT) { + e = e->next; + continue; + } + ip_vs_lblc_free(en); + atomic_dec(&tbl->entries); + goal--; + } + write_unlock(&tbl->lock); + if (goal <= 0) + break; + } + tbl->rover = j; + + out: + mod_timer(&tbl->periodic_timer, jiffies+CHECK_EXPIRE_INTERVAL); +} + + +static int ip_vs_lblc_init_svc(struct ip_vs_service *svc) +{ + int i; + struct ip_vs_lblc_table *tbl; + + /* + * Allocate the ip_vs_lblc_table for this service + */ + tbl = kmalloc(sizeof(struct ip_vs_lblc_table), GFP_ATOMIC); + if (tbl == NULL) { + IP_VS_ERR("ip_vs_lblc_init_svc(): no memory\n"); + return -ENOMEM; + } + svc->sched_data = tbl; + IP_VS_DBG(6, "LBLC hash table (memory=%dbytes) allocated for " + "current service\n", + sizeof(struct ip_vs_lblc_table)); + + /* + * Initialize the hash buckets + */ + for (i=0; ibucket[i]); + } + tbl->lock = RW_LOCK_UNLOCKED; + tbl->max_size = IP_VS_LBLC_TAB_SIZE*16; + tbl->rover = 0; + tbl->counter = 1; + + /* + * Hook periodic timer for garbage collection + */ + init_timer(&tbl->periodic_timer); + tbl->periodic_timer.data = (unsigned long)tbl; + tbl->periodic_timer.function = ip_vs_lblc_check_expire; + tbl->periodic_timer.expires = jiffies+CHECK_EXPIRE_INTERVAL; + add_timer(&tbl->periodic_timer); + + return 0; +} + + +static int ip_vs_lblc_done_svc(struct ip_vs_service *svc) +{ + struct ip_vs_lblc_table *tbl = svc->sched_data; + + /* remove periodic timer */ + del_timer_sync(&tbl->periodic_timer); + + /* got to clean up table entries here */ + ip_vs_lblc_flush(tbl); + + /* release the table itself */ + kfree(svc->sched_data); + IP_VS_DBG(6, "LBLC hash table (memory=%dbytes) released\n", + sizeof(struct ip_vs_lblc_table)); + + return 0; +} + + +static int ip_vs_lblc_update_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static inline struct ip_vs_dest * +__ip_vs_wlc_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + register struct list_head *l, *e; + struct ip_vs_dest *dest, *least; + int loh, doh; + + /* + * We think the overhead of processing active connections is fifty + * times higher than that of inactive connections in average. (This + * fifty times might not be accurate, we will change it later.) We + * use the following formula to estimate the overhead: + * dest->activeconns*50 + dest->inactconns + * and the load: + * (dest overhead) / dest->weight + * + * Remember -- no floats in kernel mode!!! + * The comparison of h1*w2 > h2*w1 is equivalent to that of + * h1/w1 > h2/w2 + * if every weight is larger than zero. + * + * The server with weight=0 is quiesced and will not receive any + * new connection. + */ + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + least = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&least->weight) > 0) { + loh = atomic_read(&least->activeconns) * 50 + + atomic_read(&least->inactconns); + goto nextstage; + } + } + return NULL; + + /* + * Find the destination with the least load. + */ + nextstage: + for (e=e->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + doh = atomic_read(&dest->activeconns) * 50 + + atomic_read(&dest->inactconns); + if (loh * atomic_read(&dest->weight) > + doh * atomic_read(&least->weight)) { + least = dest; + loh = doh; + } + } + + IP_VS_DBG(6, "LBLC: server %d.%d.%d.%d:%d " + "activeconns %d refcnt %d weight %d overhead %d\n", + NIPQUAD(least->addr), ntohs(least->port), + atomic_read(&least->activeconns), + atomic_read(&least->refcnt), + atomic_read(&least->weight), loh); + + return least; +} + + +/* + * If this destination server is overloaded and there is a less loaded + * server, then return true. + */ +static inline int +is_overloaded(struct ip_vs_dest *dest, struct ip_vs_service *svc) +{ + if (atomic_read(&dest->activeconns) > atomic_read(&dest->weight)) { + register struct list_head *l, *e; + struct ip_vs_dest *d; + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + d = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&d->activeconns)*2 + < atomic_read(&d->weight)) { + return 1; + } + } + } + return 0; +} + + +/* + * Locality-Based (weighted) Least-Connection scheduling + */ +static struct ip_vs_dest * +ip_vs_lblc_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + struct ip_vs_dest *dest; + struct ip_vs_lblc_table *tbl; + struct ip_vs_lblc_entry *en; + + IP_VS_DBG(6, "ip_vs_lblc_schedule(): Scheduling...\n"); + + tbl = (struct ip_vs_lblc_table *)svc->sched_data; + en = ip_vs_lblc_get(tbl, iph->daddr); + if (en == NULL) { + dest = __ip_vs_wlc_schedule(svc, iph); + if (dest == NULL) { + IP_VS_DBG(1, "no destination available\n"); + return NULL; + } + en = ip_vs_lblc_new(iph->daddr, dest); + if (en == NULL) { + return NULL; + } + ip_vs_lblc_hash(tbl, en); + } else { + dest = en->dest; + if (!(dest->flags & IP_VS_DEST_F_AVAILABLE) + || atomic_read(&dest->weight) <= 0 + || is_overloaded(dest, svc)) { + dest = __ip_vs_wlc_schedule(svc, iph); + if (dest == NULL) { + IP_VS_DBG(1, "no destination available\n"); + return NULL; + } + atomic_dec(&en->dest->refcnt); + atomic_inc(&dest->refcnt); + en->dest = dest; + } + } + en->lastuse = jiffies; + + IP_VS_DBG(6, "LBLC: destination IP address %u.%u.%u.%u " + "--> server %u.%u.%u.%u:%d\n", + NIPQUAD(en->addr), + NIPQUAD(dest->addr), + ntohs(dest->port)); + + return dest; +} + + +/* + * IPVS LBLC Scheduler structure + */ +static struct ip_vs_scheduler ip_vs_lblc_scheduler = +{ + {0}, /* n_list */ + "lblc", /* name */ + ATOMIC_INIT(0), /* refcnt */ + THIS_MODULE, /* this module */ + ip_vs_lblc_init_svc, /* service initializer */ + ip_vs_lblc_done_svc, /* service done */ + ip_vs_lblc_update_svc, /* service updater */ + ip_vs_lblc_schedule, /* select a server from the destination list */ +}; + + +static int __init ip_vs_lblc_init(void) +{ + INIT_LIST_HEAD(&ip_vs_lblc_scheduler.n_list); + lblc_sysctl_table.sysctl_header = + register_sysctl_table(lblc_sysctl_table.root_dir, 0); + return register_ip_vs_scheduler(&ip_vs_lblc_scheduler); +} + + +static void __exit ip_vs_lblc_cleanup(void) +{ + unregister_sysctl_table(lblc_sysctl_table.sysctl_header); + unregister_ip_vs_scheduler(&ip_vs_lblc_scheduler); +} + + +module_init(ip_vs_lblc_init); +module_exit(ip_vs_lblc_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_lblcr.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_lblcr.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_lblcr.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_lblcr.c 2003-10-22 22:49:08.000000000 +0000 @@ -0,0 +1,884 @@ +/* + * IPVS: Locality-Based Least-Connection with Replication scheduler + * + * Version: $Id: ip_vs_lblcr.c,v 1.10 2002/03/25 12:44:35 wensong Exp $ + * + * Authors: Wensong Zhang + * + * 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. + * + * Changes: + * Julian Anastasov : Added the missing (dest->weight>0) + * condition in the ip_vs_dest_set_max. + * + */ + +/* + * The lblc/r algorithm is as follows (pseudo code): + * + * if serverSet[dest_ip] is null then + * n, serverSet[dest_ip] <- {weighted least-conn node}; + * else + * n <- {least-conn (alive) node in serverSet[dest_ip]}; + * if (n is null) OR + * (n.conns>n.weight AND + * there is a node m with m.conns 1 AND + * now - serverSet[dest_ip].lastMod > T then + * m <- {most conn node in serverSet[dest_ip]}; + * remove m from serverSet[dest_ip]; + * if serverSet[dest_ip] changed then + * serverSet[dest_ip].lastMod <- now; + * + * return n; + * + */ + +#include +#include +#include +#include +#include +#include + +/* for systcl */ +#include +#include +/* for proc_net_create/proc_net_remove */ +#include + +#include + + +/* + * It is for garbage collection of stale IPVS lblcr entries, + * when the table is full. + */ +#define CHECK_EXPIRE_INTERVAL (60*HZ) +#define ENTRY_TIMEOUT (6*60*HZ) + +/* + * It is for full expiration check. + * When there is no partial expiration check (garbage collection) + * in a half hour, do a full expiration check to collect stale + * entries that haven't been touched for a day. + */ +#define COUNT_FOR_FULL_EXPIRATION 30 +int sysctl_ip_vs_lblcr_expiration = 24*60*60*HZ; + + +/* + * for IPVS lblcr entry hash table + */ +#ifndef CONFIG_IP_VS_LBLCR_TAB_BITS +#define CONFIG_IP_VS_LBLCR_TAB_BITS 10 +#endif +#define IP_VS_LBLCR_TAB_BITS CONFIG_IP_VS_LBLCR_TAB_BITS +#define IP_VS_LBLCR_TAB_SIZE (1 << IP_VS_LBLCR_TAB_BITS) +#define IP_VS_LBLCR_TAB_MASK (IP_VS_LBLCR_TAB_SIZE - 1) + + +/* + * IPVS destination set structure and operations + */ +struct ip_vs_dest_list { + struct ip_vs_dest_list *next; /* list link */ + struct ip_vs_dest *dest; /* destination server */ +}; + +struct ip_vs_dest_set { + atomic_t size; /* set size */ + unsigned long lastmod; /* last modified time */ + struct ip_vs_dest_list *list; /* destination list */ + rwlock_t lock; /* lock for this list */ +}; + + +static struct ip_vs_dest_list * +ip_vs_dest_set_insert(struct ip_vs_dest_set *set, struct ip_vs_dest *dest) +{ + struct ip_vs_dest_list *e; + + for (e=set->list; e!=NULL; e=e->next) { + if (e->dest == dest) + /* already existed */ + return NULL; + } + + e = kmalloc(sizeof(struct ip_vs_dest_list), GFP_ATOMIC); + if (e == NULL) { + IP_VS_ERR("ip_vs_dest_set_insert(): no memory\n"); + return NULL; + } + + atomic_inc(&dest->refcnt); + e->dest = dest; + + /* link it to the list */ + write_lock(&set->lock); + e->next = set->list; + set->list = e; + atomic_inc(&set->size); + write_unlock(&set->lock); + + set->lastmod = jiffies; + return e; +} + +static void +ip_vs_dest_set_erase(struct ip_vs_dest_set *set, struct ip_vs_dest *dest) +{ + struct ip_vs_dest_list *e, **ep; + + write_lock(&set->lock); + for (ep=&set->list, e=*ep; e!=NULL; e=*ep) { + if (e->dest == dest) { + /* HIT */ + *ep = e->next; + atomic_dec(&set->size); + set->lastmod = jiffies; + atomic_dec(&e->dest->refcnt); + kfree(e); + break; + } + ep = &e->next; + } + write_unlock(&set->lock); +} + +static void ip_vs_dest_set_eraseall(struct ip_vs_dest_set *set) +{ + struct ip_vs_dest_list *e, **ep; + + write_lock(&set->lock); + for (ep=&set->list, e=*ep; e!=NULL; e=*ep) { + *ep = e->next; + /* + * We don't kfree dest because it is refered either + * by its service or by the trash dest list. + */ + atomic_dec(&e->dest->refcnt); + kfree(e); + } + write_unlock(&set->lock); +} + +/* get weighted least-connection node in the destination set */ +static inline struct ip_vs_dest *ip_vs_dest_set_min(struct ip_vs_dest_set *set) +{ + register struct ip_vs_dest_list *e; + struct ip_vs_dest *dest, *least; + int loh, doh; + + if (set == NULL) + return NULL; + + read_lock(&set->lock); + /* select the first destination server, whose weight > 0 */ + for (e=set->list; e!=NULL; e=e->next) { + least = e->dest; + if ((atomic_read(&least->weight) > 0) + && (least->flags & IP_VS_DEST_F_AVAILABLE)) { + loh = atomic_read(&least->activeconns) * 50 + + atomic_read(&least->inactconns); + goto nextstage; + } + } + read_unlock(&set->lock); + return NULL; + + /* find the destination with the weighted least load */ + nextstage: + for (e=e->next; e!=NULL; e=e->next) { + dest = e->dest; + doh = atomic_read(&dest->activeconns) * 50 + + atomic_read(&dest->inactconns); + if ((loh * atomic_read(&dest->weight) > + doh * atomic_read(&least->weight)) + && (dest->flags & IP_VS_DEST_F_AVAILABLE)) { + least = dest; + loh = doh; + } + } + read_unlock(&set->lock); + + IP_VS_DBG(6, "ip_vs_dest_set_min: server %d.%d.%d.%d:%d " + "activeconns %d refcnt %d weight %d overhead %d\n", + NIPQUAD(least->addr), ntohs(least->port), + atomic_read(&least->activeconns), + atomic_read(&least->refcnt), + atomic_read(&least->weight), loh); + return least; +} + + +/* get weighted most-connection node in the destination set */ +static inline struct ip_vs_dest *ip_vs_dest_set_max(struct ip_vs_dest_set *set) +{ + register struct ip_vs_dest_list *e; + struct ip_vs_dest *dest, *most; + int moh, doh; + + if (set == NULL) + return NULL; + + read_lock(&set->lock); + /* select the first destination server, whose weight > 0 */ + for (e=set->list; e!=NULL; e=e->next) { + most = e->dest; + if (atomic_read(&most->weight) > 0) { + moh = atomic_read(&most->activeconns) * 50 + + atomic_read(&most->inactconns); + goto nextstage; + } + } + read_unlock(&set->lock); + return NULL; + + /* find the destination with the weighted most load */ + nextstage: + for (e=e->next; e!=NULL; e=e->next) { + dest = e->dest; + doh = atomic_read(&dest->activeconns) * 50 + + atomic_read(&dest->inactconns); + /* moh/mw < doh/dw ==> moh*dw < doh*mw, where mw,dw>0 */ + if ((moh * atomic_read(&dest->weight) < + doh * atomic_read(&most->weight)) + && (atomic_read(&dest->weight) > 0)) { + most = dest; + moh = doh; + } + } + read_unlock(&set->lock); + + IP_VS_DBG(6, "ip_vs_dest_set_max: server %d.%d.%d.%d:%d " + "activeconns %d refcnt %d weight %d overhead %d\n", + NIPQUAD(most->addr), ntohs(most->port), + atomic_read(&most->activeconns), + atomic_read(&most->refcnt), + atomic_read(&most->weight), moh); + return most; +} + + +/* + * IPVS lblcr entry represents an association between destination + * IP address and its destination server set + */ +struct ip_vs_lblcr_entry { + struct list_head list; + __u32 addr; /* destination IP address */ + struct ip_vs_dest_set set; /* destination server set */ + unsigned long lastuse; /* last used time */ +}; + + +/* + * IPVS lblcr hash table + */ +struct ip_vs_lblcr_table { + rwlock_t lock; /* lock for this table */ + struct list_head bucket[IP_VS_LBLCR_TAB_SIZE]; /* hash bucket */ + atomic_t entries; /* number of entries */ + int max_size; /* maximum size of entries */ + struct timer_list periodic_timer; /* collect stale entries */ + int rover; /* rover for expire check */ + int counter; /* counter for no expire */ +}; + + +/* + * IPVS LBLCR sysctl table + */ +struct ip_vs_lblcr_sysctl_table { + struct ctl_table_header *sysctl_header; + ctl_table vs_vars[2]; + ctl_table vs_dir[2]; + ctl_table ipv4_dir[2]; + ctl_table root_dir[2]; +}; + + +static struct ip_vs_lblcr_sysctl_table lblcr_sysctl_table = { + NULL, + {{NET_IPV4_VS_LBLCR_EXPIRE, "lblcr_expiration", + &sysctl_ip_vs_lblcr_expiration, + sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, + {0}}, + {{NET_IPV4_VS, "vs", NULL, 0, 0555, lblcr_sysctl_table.vs_vars}, + {0}}, + {{NET_IPV4, "ipv4", NULL, 0, 0555, lblcr_sysctl_table.vs_dir}, + {0}}, + {{CTL_NET, "net", NULL, 0, 0555, lblcr_sysctl_table.ipv4_dir}, + {0}} +}; + + +/* + * new/free a ip_vs_lblcr_entry, which is a mapping of a destination + * IP address to a server. + */ +static inline struct ip_vs_lblcr_entry *ip_vs_lblcr_new(__u32 daddr) +{ + struct ip_vs_lblcr_entry *en; + + en = kmalloc(sizeof(struct ip_vs_lblcr_entry), GFP_ATOMIC); + if (en == NULL) { + IP_VS_ERR("ip_vs_lblcr_new(): no memory\n"); + return NULL; + } + + INIT_LIST_HEAD(&en->list); + en->addr = daddr; + + /* initilize its dest set */ + atomic_set(&(en->set.size), 0); + en->set.list = NULL; + en->set.lock = RW_LOCK_UNLOCKED; + + return en; +} + + +static inline void ip_vs_lblcr_free(struct ip_vs_lblcr_entry *en) +{ + list_del(&en->list); + ip_vs_dest_set_eraseall(&en->set); + kfree(en); +} + + +/* + * Returns hash value for IPVS LBLCR entry + */ +static inline unsigned ip_vs_lblcr_hashkey(__u32 addr) +{ + return (ntohl(addr)*2654435761UL) & IP_VS_LBLCR_TAB_MASK; +} + + +/* + * Hash an entry in the ip_vs_lblcr_table. + * returns bool success. + */ +static int +ip_vs_lblcr_hash(struct ip_vs_lblcr_table *tbl, struct ip_vs_lblcr_entry *en) +{ + unsigned hash; + + if (!list_empty(&en->list)) { + IP_VS_ERR("ip_vs_lblcr_hash(): request for already hashed, " + "called from %p\n", __builtin_return_address(0)); + return 0; + } + + /* + * Hash by destination IP address + */ + hash = ip_vs_lblcr_hashkey(en->addr); + + write_lock(&tbl->lock); + list_add(&en->list, &tbl->bucket[hash]); + atomic_inc(&tbl->entries); + write_unlock(&tbl->lock); + + return 1; +} + + +#if 0000 +/* + * Unhash ip_vs_lblcr_entry from ip_vs_lblcr_table. + * returns bool success. + */ +static int ip_vs_lblcr_unhash(struct ip_vs_lblcr_table *tbl, + struct ip_vs_lblcr_entry *en) +{ + if (list_empty(&en->list)) { + IP_VS_ERR("ip_vs_lblcr_unhash(): request for not hashed entry, " + "called from %p\n", __builtin_return_address(0)); + return 0; + } + + /* + * Remove it from the table + */ + write_lock(&tbl->lock); + list_del(&en->list); + INIT_LIST_HEAD(&en->list); + write_unlock(&tbl->lock); + + return 1; +} +#endif + + +/* + * Get ip_vs_lblcr_entry associated with supplied parameters. + */ +static inline struct ip_vs_lblcr_entry * +ip_vs_lblcr_get(struct ip_vs_lblcr_table *tbl, __u32 addr) +{ + unsigned hash; + struct ip_vs_lblcr_entry *en; + struct list_head *l,*e; + + hash = ip_vs_lblcr_hashkey(addr); + l = &tbl->bucket[hash]; + + read_lock(&tbl->lock); + + for (e=l->next; e!=l; e=e->next) { + en = list_entry(e, struct ip_vs_lblcr_entry, list); + if (en->addr == addr) { + /* HIT */ + read_unlock(&tbl->lock); + return en; + } + } + + read_unlock(&tbl->lock); + + return NULL; +} + + +/* + * Flush all the entries of the specified table. + */ +static void ip_vs_lblcr_flush(struct ip_vs_lblcr_table *tbl) +{ + int i; + struct list_head *l; + struct ip_vs_lblcr_entry *en; + + for (i=0; ilock); + for (l=&tbl->bucket[i]; l->next!=l; ) { + en = list_entry(l->next, + struct ip_vs_lblcr_entry, list); + ip_vs_lblcr_free(en); + atomic_dec(&tbl->entries); + } + write_unlock(&tbl->lock); + } +} + + +static inline void ip_vs_lblcr_full_check(struct ip_vs_lblcr_table *tbl) +{ + unsigned long now = jiffies; + int i, j; + struct list_head *l, *e; + struct ip_vs_lblcr_entry *en; + + for (i=0, j=tbl->rover; ibucket[j]; + write_lock(&tbl->lock); + while (e->next != l) { + en = list_entry(e->next, + struct ip_vs_lblcr_entry, list); + if ((now - en->lastuse) < + sysctl_ip_vs_lblcr_expiration) { + e = e->next; + continue; + } + ip_vs_lblcr_free(en); + atomic_dec(&tbl->entries); + } + write_unlock(&tbl->lock); + } + tbl->rover = j; +} + + +/* + * Periodical timer handler for IPVS lblcr table + * It is used to collect stale entries when the number of entries + * exceeds the maximum size of the table. + * + * Fixme: we probably need more complicated algorithm to collect + * entries that have not been used for a long time even + * if the number of entries doesn't exceed the maximum size + * of the table. + * The full expiration check is for this purpose now. + */ +static void ip_vs_lblcr_check_expire(unsigned long data) +{ + struct ip_vs_lblcr_table *tbl; + unsigned long now = jiffies; + int goal; + int i, j; + struct list_head *l, *e; + struct ip_vs_lblcr_entry *en; + + tbl = (struct ip_vs_lblcr_table *)data; + + if ((tbl->counter % COUNT_FOR_FULL_EXPIRATION) == 0) { + /* do full expiration check */ + ip_vs_lblcr_full_check(tbl); + tbl->counter = 1; + goto out; + } + + if (atomic_read(&tbl->entries) <= tbl->max_size) { + tbl->counter++; + goto out; + } + + goal = (atomic_read(&tbl->entries) - tbl->max_size)*4/3; + if (goal > tbl->max_size/2) + goal = tbl->max_size/2; + + for (i=0, j=tbl->rover; ibucket[j]; + write_lock(&tbl->lock); + while (e->next != l) { + en = list_entry(e->next, + struct ip_vs_lblcr_entry, list); + if ((now - en->lastuse) < ENTRY_TIMEOUT) { + e = e->next; + continue; + } + ip_vs_lblcr_free(en); + atomic_dec(&tbl->entries); + goal--; + } + write_unlock(&tbl->lock); + if (goal <= 0) + break; + } + tbl->rover = j; + + out: + mod_timer(&tbl->periodic_timer, jiffies+CHECK_EXPIRE_INTERVAL); +} + + +#ifdef CONFIG_IP_VS_LBLCR_DEBUG +static struct ip_vs_lblcr_table *lblcr_table_list; + +/* + * /proc/net/ip_vs_lblcr to display the mappings of + * destination IP address <==> its serverSet + */ +static int +ip_vs_lblcr_getinfo(char *buffer, char **start, off_t offset, int length) +{ + off_t pos=0, begin; + int len=0, size; + struct ip_vs_lblcr_table *tbl; + unsigned long now = jiffies; + int i; + struct list_head *l, *e; + struct ip_vs_lblcr_entry *en; + + tbl = lblcr_table_list; + + size = sprintf(buffer, "LastTime Dest IP address Server set\n"); + pos += size; + len += size; + + for (i=0; ibucket[i]; + read_lock_bh(&tbl->lock); + for (e=l->next; e!=l; e=e->next) { + char tbuf[16]; + struct ip_vs_dest_list *d; + + en = list_entry(e, struct ip_vs_lblcr_entry, list); + sprintf(tbuf, "%u.%u.%u.%u", NIPQUAD(en->addr)); + size = sprintf(buffer+len, "%8lu %-16s ", + now-en->lastuse, tbuf); + + read_lock(&en->set.lock); + for (d=en->set.list; d!=NULL; d=d->next) { + size += sprintf(buffer+len+size, + "%u.%u.%u.%u ", + NIPQUAD(d->dest->addr)); + } + read_unlock(&en->set.lock); + size += sprintf(buffer+len+size, "\n"); + len += size; + pos += size; + if (pos <= offset) + len=0; + if (pos >= offset+length) { + read_unlock_bh(&tbl->lock); + goto done; + } + } + read_unlock_bh(&tbl->lock); + } + + done: + begin = len - (pos - offset); + *start = buffer + begin; + len -= begin; + if(len>length) + len = length; + return len; +} +#endif + + +static int ip_vs_lblcr_init_svc(struct ip_vs_service *svc) +{ + int i; + struct ip_vs_lblcr_table *tbl; + + /* + * Allocate the ip_vs_lblcr_table for this service + */ + tbl = kmalloc(sizeof(struct ip_vs_lblcr_table), GFP_ATOMIC); + if (tbl == NULL) { + IP_VS_ERR("ip_vs_lblcr_init_svc(): no memory\n"); + return -ENOMEM; + } + svc->sched_data = tbl; + IP_VS_DBG(6, "LBLCR hash table (memory=%dbytes) allocated for " + "current service\n", + sizeof(struct ip_vs_lblcr_table)); + + /* + * Initialize the hash buckets + */ + for (i=0; ibucket[i]); + } + tbl->lock = RW_LOCK_UNLOCKED; + tbl->max_size = IP_VS_LBLCR_TAB_SIZE*16; + tbl->rover = 0; + tbl->counter = 1; + + /* + * Hook periodic timer for garbage collection + */ + init_timer(&tbl->periodic_timer); + tbl->periodic_timer.data = (unsigned long)tbl; + tbl->periodic_timer.function = ip_vs_lblcr_check_expire; + tbl->periodic_timer.expires = jiffies+CHECK_EXPIRE_INTERVAL; + add_timer(&tbl->periodic_timer); + +#ifdef CONFIG_IP_VS_LBLCR_DEBUG + lblcr_table_list = tbl; +#endif + return 0; +} + + +static int ip_vs_lblcr_done_svc(struct ip_vs_service *svc) +{ + struct ip_vs_lblcr_table *tbl = svc->sched_data; + + /* remove periodic timer */ + del_timer_sync(&tbl->periodic_timer); + + /* got to clean up table entries here */ + ip_vs_lblcr_flush(tbl); + + /* release the table itself */ + kfree(svc->sched_data); + IP_VS_DBG(6, "LBLCR hash table (memory=%dbytes) released\n", + sizeof(struct ip_vs_lblcr_table)); + + return 0; +} + + +static int ip_vs_lblcr_update_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static inline struct ip_vs_dest * +__ip_vs_wlc_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + register struct list_head *l, *e; + struct ip_vs_dest *dest, *least; + int loh, doh; + + /* + * We think the overhead of processing active connections is fifty + * times higher than that of inactive connections in average. (This + * fifty times might not be accurate, we will change it later.) We + * use the following formula to estimate the overhead: + * dest->activeconns*50 + dest->inactconns + * and the load: + * (dest overhead) / dest->weight + * + * Remember -- no floats in kernel mode!!! + * The comparison of h1*w2 > h2*w1 is equivalent to that of + * h1/w1 > h2/w2 + * if every weight is larger than zero. + * + * The server with weight=0 is quiesced and will not receive any + * new connection. + */ + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + least = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&least->weight) > 0) { + loh = atomic_read(&least->activeconns) * 50 + + atomic_read(&least->inactconns); + goto nextstage; + } + } + return NULL; + + /* + * Find the destination with the least load. + */ + nextstage: + for (e=e->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + doh = atomic_read(&dest->activeconns) * 50 + + atomic_read(&dest->inactconns); + if (loh * atomic_read(&dest->weight) > + doh * atomic_read(&least->weight)) { + least = dest; + loh = doh; + } + } + + IP_VS_DBG(6, "LBLCR: server %d.%d.%d.%d:%d " + "activeconns %d refcnt %d weight %d overhead %d\n", + NIPQUAD(least->addr), ntohs(least->port), + atomic_read(&least->activeconns), + atomic_read(&least->refcnt), + atomic_read(&least->weight), loh); + + return least; +} + + +/* + * If this destination server is overloaded and there is a less loaded + * server, then return true. + */ +static inline int +is_overloaded(struct ip_vs_dest *dest, struct ip_vs_service *svc) +{ + if (atomic_read(&dest->activeconns) > atomic_read(&dest->weight)) { + register struct list_head *l, *e; + struct ip_vs_dest *d; + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + d = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&d->activeconns)*2 + < atomic_read(&d->weight)) { + return 1; + } + } + } + return 0; +} + + +/* + * Locality-Based (weighted) Least-Connection scheduling + */ +static struct ip_vs_dest * +ip_vs_lblcr_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + struct ip_vs_dest *dest; + struct ip_vs_lblcr_table *tbl; + struct ip_vs_lblcr_entry *en; + + IP_VS_DBG(6, "ip_vs_lblcr_schedule(): Scheduling...\n"); + + tbl = (struct ip_vs_lblcr_table *)svc->sched_data; + en = ip_vs_lblcr_get(tbl, iph->daddr); + if (en == NULL) { + dest = __ip_vs_wlc_schedule(svc, iph); + if (dest == NULL) { + IP_VS_DBG(1, "no destination available\n"); + return NULL; + } + en = ip_vs_lblcr_new(iph->daddr); + if (en == NULL) { + return NULL; + } + ip_vs_dest_set_insert(&en->set, dest); + ip_vs_lblcr_hash(tbl, en); + } else { + dest = ip_vs_dest_set_min(&en->set); + if (!dest || is_overloaded(dest, svc)) { + dest = __ip_vs_wlc_schedule(svc, iph); + if (dest == NULL) { + IP_VS_DBG(1, "no destination available\n"); + return NULL; + } + ip_vs_dest_set_insert(&en->set, dest); + } + if (atomic_read(&en->set.size) > 1 && + jiffies-en->set.lastmod > sysctl_ip_vs_lblcr_expiration) { + struct ip_vs_dest *m; + m = ip_vs_dest_set_max(&en->set); + if (m) + ip_vs_dest_set_erase(&en->set, m); + } + } + en->lastuse = jiffies; + + IP_VS_DBG(6, "LBLCR: destination IP address %u.%u.%u.%u " + "--> server %u.%u.%u.%u:%d\n", + NIPQUAD(en->addr), + NIPQUAD(dest->addr), + ntohs(dest->port)); + + return dest; +} + + +/* + * IPVS LBLCR Scheduler structure + */ +static struct ip_vs_scheduler ip_vs_lblcr_scheduler = +{ + {0}, /* n_list */ + "lblcr", /* name */ + ATOMIC_INIT(0), /* refcnt */ + THIS_MODULE, /* this module */ + ip_vs_lblcr_init_svc, /* service initializer */ + ip_vs_lblcr_done_svc, /* service done */ + ip_vs_lblcr_update_svc, /* service updater */ + ip_vs_lblcr_schedule, /* select a server from the destination list */ +}; + + +static int __init ip_vs_lblcr_init(void) +{ + INIT_LIST_HEAD(&ip_vs_lblcr_scheduler.n_list); + lblcr_sysctl_table.sysctl_header = + register_sysctl_table(lblcr_sysctl_table.root_dir, 0); +#ifdef CONFIG_IP_VS_LBLCR_DEBUG + proc_net_create("ip_vs_lblcr", 0, ip_vs_lblcr_getinfo); +#endif + return register_ip_vs_scheduler(&ip_vs_lblcr_scheduler); +} + + +static void __exit ip_vs_lblcr_cleanup(void) +{ +#ifdef CONFIG_IP_VS_LBLCR_DEBUG + proc_net_remove("ip_vs_lblcr"); +#endif + unregister_sysctl_table(lblcr_sysctl_table.sysctl_header); + unregister_ip_vs_scheduler(&ip_vs_lblcr_scheduler); +} + + +module_init(ip_vs_lblcr_init); +module_exit(ip_vs_lblcr_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_lc.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_lc.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_lc.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_lc.c 2003-10-22 22:48:41.000000000 +0000 @@ -0,0 +1,142 @@ +/* + * IPVS: Least-Connection Scheduling module + * + * Version: $Id: ip_vs_lc.c,v 1.8.2.1 2003/04/11 14:02:35 wensong Exp $ + * + * Authors: Wensong Zhang + * + * 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. + * + * Changes: + * Wensong Zhang : added the ip_vs_lc_update_svc + * Wensong Zhang : added any dest with weight=0 is quiesced + * + */ + +#include +#include +#include +#include +#include +#include + +#include + + +static int ip_vs_lc_init_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int ip_vs_lc_done_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int ip_vs_lc_update_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static inline unsigned int +ip_vs_lc_dest_overhead(struct ip_vs_dest *dest) +{ + /* + * We think the overhead of processing active connections is 256 + * times higher than that of inactive connections in average. (This + * 256 times might not be accurate, we will change it later) We + * use the following formula to estimate the overhead now: + * dest->activeconns*256 + dest->inactconns + */ + return (atomic_read(&dest->activeconns) << 8) + + atomic_read(&dest->inactconns); +} + + +/* + * Least Connection scheduling + */ +static struct ip_vs_dest * +ip_vs_lc_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + struct list_head *l, *e; + struct ip_vs_dest *dest, *least; + unsigned int loh, doh; + + IP_VS_DBG(6, "ip_vs_lc_schedule(): Scheduling...\n"); + + /* + * Simply select the server with the least number of + * (activeconns<<5) + inactconns + * Except whose weight is equal to zero. + * If the weight is equal to zero, it means that the server is + * quiesced, the existing connections to the server still get + * served, but no new connection is assigned to the server. + */ + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + least = list_entry (e, struct ip_vs_dest, n_list); + if (atomic_read(&least->weight) > 0) { + loh = ip_vs_lc_dest_overhead(least); + goto nextstage; + } + } + return NULL; + + /* + * Find the destination with the least load. + */ + nextstage: + for (e=e->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&dest->weight) == 0) + continue; + doh = ip_vs_lc_dest_overhead(dest); + if (doh < loh) { + least = dest; + loh = doh; + } + } + + IP_VS_DBG(6, "LC: server %u.%u.%u.%u:%u activeconns %d inactconns %d\n", + NIPQUAD(least->addr), ntohs(least->port), + atomic_read(&least->activeconns), + atomic_read(&least->inactconns)); + + return least; +} + + +static struct ip_vs_scheduler ip_vs_lc_scheduler = { + {0}, /* n_list */ + "lc", /* name */ + ATOMIC_INIT(0), /* refcnt */ + THIS_MODULE, /* this module */ + ip_vs_lc_init_svc, /* service initializer */ + ip_vs_lc_done_svc, /* service done */ + ip_vs_lc_update_svc, /* service updater */ + ip_vs_lc_schedule, /* select a server from the destination list */ +}; + + +static int __init ip_vs_lc_init(void) +{ + INIT_LIST_HEAD(&ip_vs_lc_scheduler.n_list); + return register_ip_vs_scheduler(&ip_vs_lc_scheduler) ; +} + +static void __exit ip_vs_lc_cleanup(void) +{ + unregister_ip_vs_scheduler(&ip_vs_lc_scheduler); +} + +module_init(ip_vs_lc_init); +module_exit(ip_vs_lc_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_nq.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_nq.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_nq.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_nq.c 2003-10-22 22:48:13.000000000 +0000 @@ -0,0 +1,177 @@ +/* + * IPVS: Never Queue scheduling module + * + * Version: $Id: ip_vs_nq.c,v 1.1.2.1 2003/05/20 17:05:02 wensong Exp $ + * + * Authors: Wensong Zhang + * + * 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. + * + * Changes: + * + */ + +/* + * The NQ algorithm adopts a two-speed model. When there is an idle server + * available, the job will be sent to the idle server, instead of waiting + * for a fast one. When there is no idle server available, the job will be + * sent to the server that minimize its expected delay (The Shortest + * Expected Delay scheduling algorithm). + * + * See the following paper for more information: + * A. Weinrib and S. Shenker, Greed is not enough: Adaptive load sharing + * in large heterogeneous systems. In Proceedings IEEE INFOCOM'88, + * pages 986-994, 1988. + * + * Thanks must go to Marko Buuri for talking NQ to me. + * + * The difference between NQ and SED is that NQ can improve overall + * system utilization. + * + */ + +#include +#include +#include +#include +#include +#include + +#include + + +static int +ip_vs_nq_init_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int +ip_vs_nq_done_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int +ip_vs_nq_update_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static inline unsigned int +ip_vs_nq_dest_overhead(struct ip_vs_dest *dest) +{ + /* + * We only use the active connection number in the cost + * calculation here. + */ + return atomic_read(&dest->activeconns) + 1; +} + + +/* + * Weighted Least Connection scheduling + */ +static struct ip_vs_dest * +ip_vs_nq_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + register struct list_head *l, *e; + struct ip_vs_dest *dest, *least; + unsigned int loh, doh; + + IP_VS_DBG(6, "ip_vs_nq_schedule(): Scheduling...\n"); + + /* + * We calculate the load of each dest server as follows: + * (server expected overhead) / dest->weight + * + * Remember -- no floats in kernel mode!!! + * The comparison of h1*w2 > h2*w1 is equivalent to that of + * h1/w1 > h2/w2 + * if every weight is larger than zero. + * + * The server with weight=0 is quiesced and will not receive any + * new connections. + */ + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + least = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&least->weight) > 0) { + loh = ip_vs_nq_dest_overhead(least); + + /* return the server directly if it is idle */ + if (atomic_read(&least->activeconns) == 0) + goto out; + + goto nextstage; + } + } + return NULL; + + /* + * Find the destination with the least load. + */ + nextstage: + for (e=e->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + doh = ip_vs_nq_dest_overhead(dest); + + /* return the server directly if it is idle */ + if (atomic_read(&dest->activeconns) == 0) { + least = dest; + loh = doh; + goto out; + } + + if (loh * atomic_read(&dest->weight) > + doh * atomic_read(&least->weight)) { + least = dest; + loh = doh; + } + } + + out: + IP_VS_DBG(6, "NQ: server %u.%u.%u.%u:%u " + "activeconns %d refcnt %d weight %d overhead %d\n", + NIPQUAD(least->addr), ntohs(least->port), + atomic_read(&least->activeconns), + atomic_read(&least->refcnt), + atomic_read(&least->weight), loh); + + return least; +} + + +static struct ip_vs_scheduler ip_vs_nq_scheduler = +{ + .name = "nq", + .refcnt = ATOMIC_INIT(0), + .module = THIS_MODULE, + .init_service = ip_vs_nq_init_svc, + .done_service = ip_vs_nq_done_svc, + .update_service = ip_vs_nq_update_svc, + .schedule = ip_vs_nq_schedule, +}; + + +static int __init ip_vs_nq_init(void) +{ + INIT_LIST_HEAD(&ip_vs_nq_scheduler.n_list); + return register_ip_vs_scheduler(&ip_vs_nq_scheduler); +} + +static void __exit ip_vs_nq_cleanup(void) +{ + unregister_ip_vs_scheduler(&ip_vs_nq_scheduler); +} + +module_init(ip_vs_nq_init); +module_exit(ip_vs_nq_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_rr.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_rr.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_rr.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_rr.c 2003-10-22 22:49:10.000000000 +0000 @@ -0,0 +1,120 @@ +/* + * IPVS: Round-Robin Scheduling module + * + * Version: $Id: ip_vs_rr.c,v 1.8 2001/10/19 15:05:17 wensong Exp $ + * + * Authors: Wensong Zhang + * Peter Kese + * + * 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. + * + * Fixes/Changes: + * Wensong Zhang : changed the ip_vs_rr_schedule to return dest + * Julian Anastasov : fixed the NULL pointer access bug in debugging + * Wensong Zhang : changed some comestics things for debugging + * Wensong Zhang : changed for the d-linked destination list + * Wensong Zhang : added the ip_vs_rr_update_svc + * Wensong Zhang : added any dest with weight=0 is quiesced + * + */ + +#include +#include +#include +#include +#include +#include + +#include + + +static int ip_vs_rr_init_svc(struct ip_vs_service *svc) +{ + svc->sched_data = &svc->destinations; + return 0; +} + + +static int ip_vs_rr_done_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int ip_vs_rr_update_svc(struct ip_vs_service *svc) +{ + svc->sched_data = &svc->destinations; + return 0; +} + + +/* + * Round-Robin Scheduling + */ +static struct ip_vs_dest * +ip_vs_rr_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + register struct list_head *p, *q; + struct ip_vs_dest *dest; + + IP_VS_DBG(6, "ip_vs_rr_schedule(): Scheduling...\n"); + + write_lock(&svc->sched_lock); + p = (struct list_head *)svc->sched_data; + p = p->next; + q = p; + do { + if (q == &svc->destinations) { + q = q->next; + continue; + } + dest = list_entry(q, struct ip_vs_dest, n_list); + if (atomic_read(&dest->weight) > 0) + /* HIT */ + goto out; + q = q->next; + } while (q != p); + write_unlock(&svc->sched_lock); + return NULL; + + out: + svc->sched_data = q; + write_unlock(&svc->sched_lock); + IP_VS_DBG(6, "RR: server %u.%u.%u.%u:%u " + "activeconns %d refcnt %d weight %d\n", + NIPQUAD(dest->addr), ntohs(dest->port), + atomic_read(&dest->activeconns), + atomic_read(&dest->refcnt), atomic_read(&dest->weight)); + + return dest; +} + + +static struct ip_vs_scheduler ip_vs_rr_scheduler = { + {0}, /* n_list */ + "rr", /* name */ + ATOMIC_INIT(0), /* refcnt */ + THIS_MODULE, /* this module */ + ip_vs_rr_init_svc, /* service initializer */ + ip_vs_rr_done_svc, /* service done */ + ip_vs_rr_update_svc, /* service updater */ + ip_vs_rr_schedule, /* select a server from the destination list */ +}; + +static int __init ip_vs_rr_init(void) +{ + INIT_LIST_HEAD(&ip_vs_rr_scheduler.n_list); + return register_ip_vs_scheduler(&ip_vs_rr_scheduler); +} + +static void __exit ip_vs_rr_cleanup(void) +{ + unregister_ip_vs_scheduler(&ip_vs_rr_scheduler); +} + +module_init(ip_vs_rr_init); +module_exit(ip_vs_rr_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_sched.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_sched.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_sched.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_sched.c 2003-10-22 22:48:19.000000000 +0000 @@ -0,0 +1,260 @@ +/* + * IPVS An implementation of the IP virtual server support for the + * LINUX operating system. IPVS is now implemented as a module + * over the Netfilter framework. IPVS can be used to build a + * high-performance and highly available server based on a + * cluster of servers. + * + * Version: $Id: ip_vs_sched.c,v 1.11 2001/11/04 08:58:43 wensong Exp $ + * + * Authors: Wensong Zhang + * Peter Kese + * + * 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. + * + * Changes: + * + */ + +#include +#include +#include +#include +#include +#include +#include /* for local_bh_* */ +#include +#include + +#include + +/* + * IPVS scheduler list + */ +static LIST_HEAD(ip_vs_schedulers); + +/* lock for service table */ +static rwlock_t __ip_vs_sched_lock = RW_LOCK_UNLOCKED; + + +/* + * Bind a service with a scheduler + */ +int ip_vs_bind_scheduler(struct ip_vs_service *svc, + struct ip_vs_scheduler *scheduler) +{ + int ret; + + if (svc == NULL) { + IP_VS_ERR("ip_vs_bind_scheduler(): svc arg NULL\n"); + return -EINVAL; + } + if (scheduler == NULL) { + IP_VS_ERR("ip_vs_bind_scheduler(): scheduler arg NULL\n"); + return -EINVAL; + } + + svc->scheduler = scheduler; + + if (scheduler->init_service) { + ret = scheduler->init_service(svc); + if (ret) { + IP_VS_ERR("ip_vs_bind_scheduler(): init error\n"); + return ret; + } + } + + return 0; +} + + +/* + * Unbind a service with its scheduler + */ +int ip_vs_unbind_scheduler(struct ip_vs_service *svc) +{ + struct ip_vs_scheduler *sched; + + if (svc == NULL) { + IP_VS_ERR("ip_vs_unbind_scheduler(): svc arg NULL\n"); + return -EINVAL; + } + + sched = svc->scheduler; + if (sched == NULL) { + IP_VS_ERR("ip_vs_unbind_scheduler(): svc isn't bound\n"); + return -EINVAL; + } + + if (sched->done_service) { + if (sched->done_service(svc) != 0) { + IP_VS_ERR("ip_vs_unbind_scheduler(): done error\n"); + return -EINVAL; + } + } + + svc->scheduler = NULL; + return 0; +} + + +/* + * Get scheduler in the scheduler list by name + */ +static struct ip_vs_scheduler *ip_vs_sched_getbyname(const char *sched_name) +{ + struct ip_vs_scheduler *sched; + struct list_head *l, *e; + + IP_VS_DBG(2, "ip_vs_sched_getbyname(): sched_name \"%s\"\n", + sched_name); + + l = &ip_vs_schedulers; + + read_lock_bh(&__ip_vs_sched_lock); + + for (e=l->next; e!=l; e=e->next) { + sched = list_entry(e, struct ip_vs_scheduler, n_list); + + /* + * Test and MOD_INC_USE_COUNT atomically + */ + if (sched->module && !try_inc_mod_count(sched->module)) { + /* + * This scheduler is just deleted + */ + continue; + } + if (strcmp(sched_name, sched->name)==0) { + /* HIT */ + read_unlock_bh(&__ip_vs_sched_lock); + return sched; + } + if (sched->module) + __MOD_DEC_USE_COUNT(sched->module); + } + + read_unlock_bh(&__ip_vs_sched_lock); + return NULL; +} + + +/* + * Lookup scheduler and try to load it if it doesn't exist + */ +struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name) +{ + struct ip_vs_scheduler *sched; + + /* + * Search for the scheduler by sched_name + */ + sched = ip_vs_sched_getbyname(sched_name); + + /* + * If scheduler not found, load the module and search again + */ + if (sched == NULL) { + char module_name[IP_VS_SCHEDNAME_MAXLEN+8]; + sprintf(module_name,"ip_vs_%s", sched_name); + request_module(module_name); + sched = ip_vs_sched_getbyname(sched_name); + } + + return sched; +} + +void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler) +{ + if (scheduler->module) + __MOD_DEC_USE_COUNT(scheduler->module); +} + + +/* + * Register a scheduler in the scheduler list + */ +int register_ip_vs_scheduler(struct ip_vs_scheduler *scheduler) +{ + struct ip_vs_scheduler *sched; + + if (!scheduler) { + IP_VS_ERR("register_ip_vs_scheduler(): NULL arg\n"); + return -EINVAL; + } + + if (!scheduler->name) { + IP_VS_ERR("register_ip_vs_scheduler(): NULL scheduler_name\n"); + return -EINVAL; + } + + MOD_INC_USE_COUNT; + + /* + * Make sure that the scheduler with this name doesn't exist + * in the scheduler list. + */ + sched = ip_vs_sched_getbyname(scheduler->name); + if (sched) { + ip_vs_scheduler_put(sched); + MOD_DEC_USE_COUNT; + IP_VS_ERR("register_ip_vs_scheduler(): [%s] scheduler " + "already existed in the system\n", scheduler->name); + return -EINVAL; + } + + write_lock_bh(&__ip_vs_sched_lock); + + if (scheduler->n_list.next != &scheduler->n_list) { + write_unlock_bh(&__ip_vs_sched_lock); + MOD_DEC_USE_COUNT; + IP_VS_ERR("register_ip_vs_scheduler(): [%s] scheduler " + "already linked\n", scheduler->name); + return -EINVAL; + } + + /* + * Add it into the d-linked scheduler list + */ + list_add(&scheduler->n_list, &ip_vs_schedulers); + write_unlock_bh(&__ip_vs_sched_lock); + + IP_VS_INFO("[%s] scheduler registered.\n", scheduler->name); + + return 0; +} + + +/* + * Unregister a scheduler from the scheduler list + */ +int unregister_ip_vs_scheduler(struct ip_vs_scheduler *scheduler) +{ + if (!scheduler) { + IP_VS_ERR( "unregister_ip_vs_scheduler(): NULL arg\n"); + return -EINVAL; + } + + write_lock_bh(&__ip_vs_sched_lock); + if (scheduler->n_list.next == &scheduler->n_list) { + write_unlock_bh(&__ip_vs_sched_lock); + IP_VS_ERR("unregister_ip_vs_scheduler(): [%s] scheduler " + "is not in the list. failed\n", scheduler->name); + return -EINVAL; + } + + /* + * Remove it from the d-linked scheduler list + */ + list_del(&scheduler->n_list); + write_unlock_bh(&__ip_vs_sched_lock); + + MOD_DEC_USE_COUNT; + + IP_VS_INFO("[%s] scheduler unregistered.\n", scheduler->name); + + return 0; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_sed.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_sed.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_sed.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_sed.c 2003-10-22 22:48:10.000000000 +0000 @@ -0,0 +1,167 @@ +/* + * IPVS: Shortest Expected Delay scheduling module + * + * Version: $Id: ip_vs_sed.c,v 1.1.2.1 2003/05/20 17:05:02 wensong Exp $ + * + * Authors: Wensong Zhang + * + * 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. + * + * Changes: + * + */ + +/* + * The SED algorithm attempts to minimize each job's expected delay until + * completion. The expected delay that the job will experience is + * (Ci + 1) / Ui if sent to the ith server, in which Ci is the number of + * jobs on the the ith server and Ui is the fixed service rate (weight) of + * the ith server. The SED algorithm adopts a greedy policy that each does + * what is in its own best interest, i.e. to join the queue which would + * minimize its expected delay of completion. + * + * See the following paper for more information: + * A. Weinrib and S. Shenker, Greed is not enough: Adaptive load sharing + * in large heterogeneous systems. In Proceedings IEEE INFOCOM'88, + * pages 986-994, 1988. + * + * Thanks must go to Marko Buuri for talking SED to me. + * + * The difference between SED and WLC is that SED includes the incoming + * job in the cost function (the increment of 1). SED may outperform + * WLC, while scheduling big jobs under larger heterogeneous systems + * (the server weight varies a lot). + * + */ + +#include +#include +#include +#include +#include +#include + +#include + + +static int +ip_vs_sed_init_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int +ip_vs_sed_done_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int +ip_vs_sed_update_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static inline unsigned int +ip_vs_sed_dest_overhead(struct ip_vs_dest *dest) +{ + /* + * We only use the active connection number in the cost + * calculation here. + */ + return atomic_read(&dest->activeconns) + 1; +} + + +/* + * Weighted Least Connection scheduling + */ +static struct ip_vs_dest * +ip_vs_sed_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + register struct list_head *l, *e; + struct ip_vs_dest *dest, *least; + unsigned int loh, doh; + + IP_VS_DBG(6, "ip_vs_sed_schedule(): Scheduling...\n"); + + /* + * We calculate the load of each dest server as follows: + * (server expected overhead) / dest->weight + * + * Remember -- no floats in kernel mode!!! + * The comparison of h1*w2 > h2*w1 is equivalent to that of + * h1/w1 > h2/w2 + * if every weight is larger than zero. + * + * The server with weight=0 is quiesced and will not receive any + * new connections. + */ + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + least = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&least->weight) > 0) { + loh = ip_vs_sed_dest_overhead(least); + goto nextstage; + } + } + return NULL; + + /* + * Find the destination with the least load. + */ + nextstage: + for (e=e->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + doh = ip_vs_sed_dest_overhead(dest); + if (loh * atomic_read(&dest->weight) > + doh * atomic_read(&least->weight)) { + least = dest; + loh = doh; + } + } + + IP_VS_DBG(6, "SED: server %u.%u.%u.%u:%u " + "activeconns %d refcnt %d weight %d overhead %d\n", + NIPQUAD(least->addr), ntohs(least->port), + atomic_read(&least->activeconns), + atomic_read(&least->refcnt), + atomic_read(&least->weight), loh); + + return least; +} + + +static struct ip_vs_scheduler ip_vs_sed_scheduler = +{ + .name = "sed", + .refcnt = ATOMIC_INIT(0), + .module = THIS_MODULE, + .init_service = ip_vs_sed_init_svc, + .done_service = ip_vs_sed_done_svc, + .update_service = ip_vs_sed_update_svc, + .schedule = ip_vs_sed_schedule, +}; + + +static int __init ip_vs_sed_init(void) +{ + INIT_LIST_HEAD(&ip_vs_sed_scheduler.n_list); + return register_ip_vs_scheduler(&ip_vs_sed_scheduler); +} + +static void __exit ip_vs_sed_cleanup(void) +{ + unregister_ip_vs_scheduler(&ip_vs_sed_scheduler); +} + +module_init(ip_vs_sed_init); +module_exit(ip_vs_sed_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_sh.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_sh.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_sh.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_sh.c 2003-10-22 22:49:03.000000000 +0000 @@ -0,0 +1,262 @@ +/* + * IPVS: Source Hashing scheduling module + * + * Version: $Id: ip_vs_sh.c,v 1.4 2001/10/19 15:05:17 wensong Exp $ + * + * Authors: Wensong Zhang + * + * 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. + * + * Changes: + * + */ + +/* + * The sh algorithm is to select server by the hash key of source IP + * address. The pseudo code is as follows: + * + * n <- servernode[src_ip]; + * if (n is dead) OR + * (n is overloaded, such as n.conns>2*n.weight) then + * return NULL; + * + * return n; + * + * Notes that servernode is a 256-bucket hash table that maps the hash + * index derived from packet source IP address to the current server + * array. If the sh scheduler is used in cache cluster, it is good to + * combine it with cache_bypass feature. When the statically assigned + * server is dead or overloaded, the load balancer can bypass the cache + * server and send requests to the original server directly. + * + */ + +#include +#include +#include +#include +#include +#include + +#include + + +/* + * IPVS SH bucket + */ +struct ip_vs_sh_bucket { + struct ip_vs_dest *dest; /* real server (cache) */ +}; + +/* + * for IPVS SH entry hash table + */ +#ifndef CONFIG_IP_VS_SH_TAB_BITS +#define CONFIG_IP_VS_SH_TAB_BITS 8 +#endif +#define IP_VS_SH_TAB_BITS CONFIG_IP_VS_SH_TAB_BITS +#define IP_VS_SH_TAB_SIZE (1 << IP_VS_SH_TAB_BITS) +#define IP_VS_SH_TAB_MASK (IP_VS_SH_TAB_SIZE - 1) + + +/* + * Returns hash value for IPVS SH entry + */ +static inline unsigned ip_vs_sh_hashkey(__u32 addr) +{ + return (ntohl(addr)*2654435761UL) & IP_VS_SH_TAB_MASK; +} + + +/* + * Get ip_vs_dest associated with supplied parameters. + */ +static inline struct ip_vs_dest * +ip_vs_sh_get(struct ip_vs_sh_bucket *tbl, __u32 addr) +{ + return (tbl[ip_vs_sh_hashkey(addr)]).dest; +} + + +/* + * Assign all the hash buckets of the specified table with the service. + */ +static int +ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc) +{ + int i; + struct ip_vs_sh_bucket *b; + struct list_head *p; + struct ip_vs_dest *dest; + + b = tbl; + p = &svc->destinations; + for (i=0; idest = NULL; + } else { + if (p == &svc->destinations) + p = p->next; + + dest = list_entry(p, struct ip_vs_dest, n_list); + atomic_inc(&dest->refcnt); + b->dest = dest; + + p = p->next; + } + b++; + } + return 0; +} + + +/* + * Flush all the hash buckets of the specified table. + */ +static void ip_vs_sh_flush(struct ip_vs_sh_bucket *tbl) +{ + int i; + struct ip_vs_sh_bucket *b; + + b = tbl; + for (i=0; idest) { + atomic_dec(&b->dest->refcnt); + b->dest = NULL; + } + b++; + } +} + + +static int ip_vs_sh_init_svc(struct ip_vs_service *svc) +{ + struct ip_vs_sh_bucket *tbl; + + /* allocate the SH table for this service */ + tbl = kmalloc(sizeof(struct ip_vs_sh_bucket)*IP_VS_SH_TAB_SIZE, + GFP_ATOMIC); + if (tbl == NULL) { + IP_VS_ERR("ip_vs_sh_init_svc(): no memory\n"); + return -ENOMEM; + } + svc->sched_data = tbl; + IP_VS_DBG(6, "SH hash table (memory=%dbytes) allocated for " + "current service\n", + sizeof(struct ip_vs_sh_bucket)*IP_VS_SH_TAB_SIZE); + + /* assign the hash buckets with the updated service */ + ip_vs_sh_assign(tbl, svc); + + return 0; +} + + +static int ip_vs_sh_done_svc(struct ip_vs_service *svc) +{ + struct ip_vs_sh_bucket *tbl = svc->sched_data; + + /* got to clean up hash buckets here */ + ip_vs_sh_flush(tbl); + + /* release the table itself */ + kfree(svc->sched_data); + IP_VS_DBG(6, "SH hash table (memory=%dbytes) released\n", + sizeof(struct ip_vs_sh_bucket)*IP_VS_SH_TAB_SIZE); + + return 0; +} + + +static int ip_vs_sh_update_svc(struct ip_vs_service *svc) +{ + struct ip_vs_sh_bucket *tbl = svc->sched_data; + + /* got to clean up hash buckets here */ + ip_vs_sh_flush(tbl); + + /* assign the hash buckets with the updated service */ + ip_vs_sh_assign(tbl, svc); + + return 0; +} + + +/* + * If the number of active connections is twice larger than its weight, + * consider that the server is overloaded here. + */ +static inline int is_overloaded(struct ip_vs_dest *dest) +{ + if (atomic_read(&dest->activeconns) > atomic_read(&dest->weight)*2) { + return 1; + } + return 0; +} + + +/* + * Source Hashing scheduling + */ +static struct ip_vs_dest * +ip_vs_sh_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + struct ip_vs_dest *dest; + struct ip_vs_sh_bucket *tbl; + + IP_VS_DBG(6, "ip_vs_sh_schedule(): Scheduling...\n"); + + tbl = (struct ip_vs_sh_bucket *)svc->sched_data; + dest = ip_vs_sh_get(tbl, iph->saddr); + if (!dest + || !(dest->flags & IP_VS_DEST_F_AVAILABLE) + || atomic_read(&dest->weight) <= 0 + || is_overloaded(dest)) { + return NULL; + } + + IP_VS_DBG(6, "SH: source IP address %u.%u.%u.%u " + "--> server %u.%u.%u.%u:%d\n", + NIPQUAD(iph->saddr), + NIPQUAD(dest->addr), + ntohs(dest->port)); + + return dest; +} + + +/* + * IPVS SH Scheduler structure + */ +static struct ip_vs_scheduler ip_vs_sh_scheduler = +{ + {0}, /* n_list */ + "sh", /* name */ + ATOMIC_INIT(0), /* refcnt */ + THIS_MODULE, /* this module */ + ip_vs_sh_init_svc, /* service initializer */ + ip_vs_sh_done_svc, /* service done */ + ip_vs_sh_update_svc, /* service updater */ + ip_vs_sh_schedule, /* select a server from the destination list */ +}; + + +static int __init ip_vs_sh_init(void) +{ + INIT_LIST_HEAD(&ip_vs_sh_scheduler.n_list); + return register_ip_vs_scheduler(&ip_vs_sh_scheduler); +} + + +static void __exit ip_vs_sh_cleanup(void) +{ + unregister_ip_vs_scheduler(&ip_vs_sh_scheduler); +} + + +module_init(ip_vs_sh_init); +module_exit(ip_vs_sh_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_sync.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_sync.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_sync.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_sync.c 2003-10-22 22:49:07.000000000 +0000 @@ -0,0 +1,793 @@ +/* + * IPVS An implementation of the IP virtual server support for the + * LINUX operating system. IPVS is now implemented as a module + * over the NetFilter framework. IPVS can be used to build a + * high-performance and highly available server based on a + * cluster of servers. + * + * Version: $Id: ip_vs_sync.c,v 1.8 2002/08/17 14:06:02 wensong Exp $ + * + * Authors: Wensong Zhang + * + * ip_vs_sync: sync connection info from master load balancer to backups + * through multicast + */ + +#define __KERNEL_SYSCALLS__ /* for waitpid */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include /* for ip_mc_join_group */ + +#include +#include +#include /* for get_fs and set_fs */ + +#include + +#define IP_VS_SYNC_GROUP 0xe0000051 /* multicast addr - 224.0.0.81 */ +#define IP_VS_SYNC_PORT 8848 /* multicast port */ + + +/* + * IPVS sync connection entry + */ +struct ip_vs_sync_conn { + __u8 reserved; + + /* Protocol, addresses and port numbers */ + __u8 protocol; /* Which protocol (TCP/UDP) */ + __u16 cport; + __u16 vport; + __u16 dport; + __u32 caddr; /* client address */ + __u32 vaddr; /* virtual address */ + __u32 daddr; /* destination address */ + + /* Flags and state transition */ + __u16 flags; /* status flags */ + __u16 state; /* state info */ + + /* The sequence options start here */ +}; + +struct ip_vs_sync_conn_options { + struct ip_vs_seq in_seq; /* incoming seq. struct */ + struct ip_vs_seq out_seq; /* outgoing seq. struct */ +}; + +#define IP_VS_SYNC_CONN_TIMEOUT (3*60*HZ) +#define SIMPLE_CONN_SIZE (sizeof(struct ip_vs_sync_conn)) +#define FULL_CONN_SIZE \ +(sizeof(struct ip_vs_sync_conn) + sizeof(struct ip_vs_sync_conn_options)) + + +/* + The master mulitcasts messages to the backup load balancers in the + following format. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Count Conns | Reserved | Size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | IPVS Sync Connection (1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | . | + | . | + | . | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | IPVS Sync Connection (n) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +#define SYNC_MESG_MAX_SIZE (24*50+4) +struct ip_vs_sync_mesg { + __u8 nr_conns; + __u8 reserved; + __u16 size; + + /* ip_vs_sync_conn entries start here */ +}; + + +struct ip_vs_sync_buff { + struct list_head list; + unsigned long firstuse; + + /* pointers for the message data */ + struct ip_vs_sync_mesg *mesg; + unsigned char *head; + unsigned char *end; +}; + + +/* the sync_buff list head and the lock */ +static LIST_HEAD(ip_vs_sync_queue); +static spinlock_t ip_vs_sync_lock = SPIN_LOCK_UNLOCKED; + +/* current sync_buff for accepting new conn entries */ +static struct ip_vs_sync_buff *curr_sb = NULL; +static spinlock_t curr_sb_lock = SPIN_LOCK_UNLOCKED; + +static inline void sb_queue_tail(struct ip_vs_sync_buff *sb) +{ + spin_lock(&ip_vs_sync_lock); + list_add_tail(&sb->list, &ip_vs_sync_queue); + spin_unlock(&ip_vs_sync_lock); +} + +static inline struct ip_vs_sync_buff * sb_dequeue(void) +{ + struct ip_vs_sync_buff *sb; + + spin_lock_bh(&ip_vs_sync_lock); + if (list_empty(&ip_vs_sync_queue)) { + sb = NULL; + } else { + sb = list_entry(ip_vs_sync_queue.next, + struct ip_vs_sync_buff, + list); + list_del(&sb->list); + } + spin_unlock_bh(&ip_vs_sync_lock); + + return sb; +} + +static inline struct ip_vs_sync_buff * ip_vs_sync_buff_create(void) +{ + struct ip_vs_sync_buff *sb; + + if (!(sb=kmalloc(sizeof(struct ip_vs_sync_buff), GFP_ATOMIC))) + return NULL; + + if (!(sb->mesg=kmalloc(SYNC_MESG_MAX_SIZE, GFP_ATOMIC))) { + kfree(sb); + return NULL; + } + sb->mesg->nr_conns = 0; + sb->mesg->size = 4; + sb->head = (unsigned char *)sb->mesg + 4; + sb->end = (unsigned char *)sb->mesg + SYNC_MESG_MAX_SIZE; + sb->firstuse = jiffies; + return sb; +} + +static inline void ip_vs_sync_buff_release(struct ip_vs_sync_buff *sb) +{ + kfree(sb->mesg); + kfree(sb); +} + +/* + * Get the current sync buffer if it has been created for more + * than the specified time or the specified time is zero. + */ +static inline struct ip_vs_sync_buff * +get_curr_sync_buff(unsigned long time) +{ + struct ip_vs_sync_buff *sb; + + spin_lock_bh(&curr_sb_lock); + if (curr_sb && + (jiffies - curr_sb->firstuse > time || time == 0)) { + sb = curr_sb; + curr_sb = NULL; + } else + sb = NULL; + spin_unlock_bh(&curr_sb_lock); + return sb; +} + + +/* + * Add an ip_vs_conn information into the current sync_buff. + * Called by ip_vs_in. + */ +void ip_vs_sync_conn(struct ip_vs_conn *cp) +{ + struct ip_vs_sync_mesg *m; + struct ip_vs_sync_conn *s; + int len; + + spin_lock(&curr_sb_lock); + if (!curr_sb) { + if (!(curr_sb=ip_vs_sync_buff_create())) { + spin_unlock(&curr_sb_lock); + IP_VS_ERR("ip_vs_sync_buff_create failed.\n"); + return; + } + } + + len = (cp->flags & IP_VS_CONN_F_SEQ_MASK) ? FULL_CONN_SIZE : + SIMPLE_CONN_SIZE; + m = curr_sb->mesg; + s = (struct ip_vs_sync_conn *)curr_sb->head; + + /* copy members */ + s->protocol = cp->protocol; + s->cport = cp->cport; + s->vport = cp->vport; + s->dport = cp->dport; + s->caddr = cp->caddr; + s->vaddr = cp->vaddr; + s->daddr = cp->daddr; + s->flags = htons(cp->flags & ~IP_VS_CONN_F_HASHED); + s->state = htons(cp->state); + if (cp->flags & IP_VS_CONN_F_SEQ_MASK) { + struct ip_vs_sync_conn_options *opt = + (struct ip_vs_sync_conn_options *)&s[1]; + memcpy(opt, &cp->in_seq, sizeof(*opt)); + } + + m->nr_conns++; + m->size += len; + curr_sb->head += len; + + /* check if there is a space for next one */ + if (curr_sb->head+FULL_CONN_SIZE > curr_sb->end) { + sb_queue_tail(curr_sb); + curr_sb = NULL; + } + spin_unlock(&curr_sb_lock); + + /* synchronize its controller if it has */ + if (cp->control) + ip_vs_sync_conn(cp->control); +} + + +/* + * Process received multicast message and create the corresponding + * ip_vs_conn entries. + */ +static void ip_vs_process_message(const char *buffer, const size_t buflen) +{ + struct ip_vs_sync_mesg *m = (struct ip_vs_sync_mesg *)buffer; + struct ip_vs_sync_conn *s; + struct ip_vs_sync_conn_options *opt; + struct ip_vs_conn *cp; + char *p; + int i; + + if (buflen != m->size) { + IP_VS_ERR("bogus message\n"); + return; + } + + p = (char *)buffer + sizeof(struct ip_vs_sync_mesg); + for (i=0; inr_conns; i++) { + s = (struct ip_vs_sync_conn *)p; + cp = ip_vs_conn_in_get(s->protocol, + s->caddr, s->cport, + s->vaddr, s->vport); + if (!cp) { + cp = ip_vs_conn_new(s->protocol, + s->caddr, s->cport, + s->vaddr, s->vport, + s->daddr, s->dport, + ntohs(s->flags), NULL); + if (!cp) { + IP_VS_ERR("ip_vs_conn_new failed\n"); + return; + } + cp->state = ntohs(s->state); + } else if (!cp->dest) { + /* it is an entry created by the synchronization */ + cp->state = ntohs(s->state); + cp->flags = ntohs(s->flags) | IP_VS_CONN_F_HASHED; + } /* Note that we don't touch its state and flags + if it is a normal entry. */ + + if (ntohs(s->flags) & IP_VS_CONN_F_SEQ_MASK) { + opt = (struct ip_vs_sync_conn_options *)&s[1]; + memcpy(&cp->in_seq, opt, sizeof(*opt)); + p += FULL_CONN_SIZE; + } else + p += SIMPLE_CONN_SIZE; + + atomic_set(&cp->in_pkts, sysctl_ip_vs_sync_threshold); + cp->timeout = IP_VS_SYNC_CONN_TIMEOUT; + ip_vs_conn_put(cp); + + if (p > buffer+buflen) { + IP_VS_ERR("bogus message\n"); + return; + } + } +} + + +/* ipvs sync daemon state */ +volatile int ip_vs_sync_state = IP_VS_STATE_NONE; + +/* multicast interface name */ +char ip_vs_mcast_ifn[IP_VS_IFNAME_MAXLEN]; + +/* multicast addr */ +static struct sockaddr_in mcast_addr; + + +/* + * Setup loopback of outgoing multicasts on a sending socket + */ +static void set_mcast_loop(struct sock *sk, u_char loop) +{ + /* setsockopt(sock, SOL_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)); */ + lock_sock(sk); + sk->protinfo.af_inet.mc_loop = loop ? 1 : 0; + release_sock(sk); +} + +/* + * Specify TTL for outgoing multicasts on a sending socket + */ +static void set_mcast_ttl(struct sock *sk, u_char ttl) +{ + /* setsockopt(sock, SOL_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); */ + lock_sock(sk); + sk->protinfo.af_inet.mc_ttl = ttl; + release_sock(sk); +} + +/* + * Specifiy default interface for outgoing multicasts + */ +static int set_mcast_if(struct sock *sk, char *ifname) +{ + struct net_device *dev; + + if ((dev = __dev_get_by_name(ifname)) == NULL) + return -ENODEV; + + if (sk->bound_dev_if && dev->ifindex != sk->bound_dev_if) + return -EINVAL; + + lock_sock(sk); + sk->protinfo.af_inet.mc_index = dev->ifindex; + /* sk->protinfo.af_inet.mc_addr = 0; */ + release_sock(sk); + + return 0; +} + +/* + * Join a multicast group. + * the group is specified by a class D multicast address 224.0.0.0/8 + * in the in_addr structure passed in as a parameter. + */ +static int +join_mcast_group(struct sock *sk, struct in_addr *addr, char *ifname) +{ + struct ip_mreqn mreq; + struct net_device *dev; + int ret; + + memset(&mreq, 0, sizeof(mreq)); + memcpy(&mreq.imr_multiaddr, addr, sizeof(struct in_addr)); + + if ((dev = __dev_get_by_name(ifname)) == NULL) + return -ENODEV; + if (sk->bound_dev_if && dev->ifindex != sk->bound_dev_if) + return -EINVAL; + + mreq.imr_ifindex = dev->ifindex; + + lock_sock(sk); + ret = ip_mc_join_group(sk, &mreq); + release_sock(sk); + + return ret; +} + + +static int bind_mcastif_addr(struct socket *sock, char *ifname) +{ + struct net_device *dev; + u32 addr; + struct sockaddr_in sin; + + if ((dev = __dev_get_by_name(ifname)) == NULL) + return -ENODEV; + + addr = inet_select_addr(dev, 0, RT_SCOPE_UNIVERSE); + if (!addr) + IP_VS_ERR("You probably need to specify IP address on " + "multicast interface.\n"); + + IP_VS_DBG(7, "binding socket with (%s) %u.%u.%u.%u\n", + ifname, NIPQUAD(addr)); + + /* Now bind the socket with the address of multicast interface */ + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = addr; + sin.sin_port = 0; + + return sock->ops->bind(sock, (struct sockaddr*)&sin, sizeof(sin)); +} + +/* + * Set up sending multicast socket over UDP + */ +static struct socket * make_send_sock(void) +{ + struct socket *sock; + + /* First create a socket */ + if (sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { + IP_VS_ERR("Error during creation of socket; terminating\n"); + return NULL; + } + + if (set_mcast_if(sock->sk, ip_vs_mcast_ifn) < 0) { + IP_VS_ERR("Error setting outbound mcast interface\n"); + goto error; + } + + set_mcast_loop(sock->sk, 0); + set_mcast_ttl(sock->sk, 1); + + if (bind_mcastif_addr(sock, ip_vs_mcast_ifn) < 0) { + IP_VS_ERR("Error binding address of the mcast interface\n"); + goto error; + } + + if (sock->ops->connect(sock, + (struct sockaddr*)&mcast_addr, + sizeof(struct sockaddr), 0) < 0) { + IP_VS_ERR("Error connecting to the multicast addr\n"); + goto error; + } + + return sock; + + error: + sock_release(sock); + return NULL; +} + + +/* + * Set up receiving multicast socket over UDP + */ +static struct socket * make_receive_sock(void) +{ + struct socket *sock; + + /* First create a socket */ + if (sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { + IP_VS_ERR("Error during creation of socket; terminating\n"); + return NULL; + } + + /* it is equivalent to the REUSEADDR option in user-space */ + sock->sk->reuse = 1; + + if (sock->ops->bind(sock, + (struct sockaddr*)&mcast_addr, + sizeof(struct sockaddr)) < 0) { + IP_VS_ERR("Error binding to the multicast addr\n"); + goto error; + } + + /* join the multicast group */ + if (join_mcast_group(sock->sk, + (struct in_addr*)&mcast_addr.sin_addr, + ip_vs_mcast_ifn) < 0) { + IP_VS_ERR("Error joining to the multicast group\n"); + goto error; + } + + return sock; + + error: + sock_release(sock); + return NULL; +} + + +static int +ip_vs_send_async(struct socket *sock, const char *buffer, const size_t length) +{ + struct msghdr msg; + mm_segment_t oldfs; + struct iovec iov; + int len; + + EnterFunction(7); + iov.iov_base = (void *)buffer; + iov.iov_len = length; + msg.msg_name = 0; + msg.msg_namelen = 0; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = NULL; + msg.msg_controllen = 0; + msg.msg_flags = MSG_DONTWAIT|MSG_NOSIGNAL; + + oldfs = get_fs(); set_fs(KERNEL_DS); + len = sock_sendmsg(sock, &msg, (size_t)(length)); + set_fs(oldfs); + + LeaveFunction(7); + return len; +} + + +static int +ip_vs_receive(struct socket *sock, char *buffer, const size_t buflen) +{ + struct msghdr msg; + struct iovec iov; + int len; + mm_segment_t oldfs; + + EnterFunction(7); + + /* Receive a packet */ + iov.iov_base = buffer; + iov.iov_len = (size_t)buflen; + msg.msg_name = 0; + msg.msg_namelen = 0; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = NULL; + msg.msg_controllen = 0; + msg.msg_flags = 0; + + oldfs = get_fs(); set_fs(KERNEL_DS); + len = sock_recvmsg(sock, &msg, buflen, 0); + set_fs(oldfs); + + if (len < 0) + return -1; + + LeaveFunction(7); + return len; +} + + +static int errno; + +static DECLARE_WAIT_QUEUE_HEAD(sync_wait); +static pid_t sync_pid = 0; + +static DECLARE_WAIT_QUEUE_HEAD(stop_sync_wait); +static int stop_sync = 0; + +static void sync_master_loop(void) +{ + struct socket *sock; + struct ip_vs_sync_buff *sb; + struct ip_vs_sync_mesg *m; + + /* create the sending multicast socket */ + sock = make_send_sock(); + if (!sock) + return; + + for (;;) { + while ((sb=sb_dequeue())) { + m = sb->mesg; + if (ip_vs_send_async(sock, (char *)m, + m->size) != m->size) + IP_VS_ERR("ip_vs_send_async error\n"); + ip_vs_sync_buff_release(sb); + } + + /* check if entries stay in curr_sb for 2 seconds */ + if ((sb = get_curr_sync_buff(2*HZ))) { + m = sb->mesg; + if (ip_vs_send_async(sock, (char *)m, + m->size) != m->size) + IP_VS_ERR("ip_vs_send_async error\n"); + ip_vs_sync_buff_release(sb); + } + + if (stop_sync) + break; + + __set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ); + __set_current_state(TASK_RUNNING); + } + + /* clean up the sync_buff queue */ + while ((sb=sb_dequeue())) { + ip_vs_sync_buff_release(sb); + } + + /* clean up the current sync_buff */ + if ((sb = get_curr_sync_buff(0))) { + ip_vs_sync_buff_release(sb); + } + + /* release the sending multicast socket */ + sock_release(sock); +} + + +static void sync_backup_loop(void) +{ + struct socket *sock; + char *buf; + int len; + + if (!(buf=kmalloc(SYNC_MESG_MAX_SIZE, GFP_ATOMIC))) { + IP_VS_ERR("sync_backup_loop: kmalloc error\n"); + return; + } + + /* create the receiving multicast socket */ + sock = make_receive_sock(); + if (!sock) + goto out; + + for (;;) { + /* do you have data now? */ + while (!skb_queue_empty(&(sock->sk->receive_queue))) { + if ((len=ip_vs_receive(sock, buf, + SYNC_MESG_MAX_SIZE))<=0) { + IP_VS_ERR("receiving message error\n"); + break; + } + /* disable bottom half, because it accessed the data + shared by softirq while getting/creating conns */ + local_bh_disable(); + ip_vs_process_message(buf, len); + local_bh_enable(); + } + + if (stop_sync) + break; + + __set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ); + __set_current_state(TASK_RUNNING); + } + + /* release the sending multicast socket */ + sock_release(sock); + + out: + kfree(buf); +} + + +static int sync_thread(void *startup) +{ + DECLARE_WAITQUEUE(wait, current); + mm_segment_t oldmm; + int state; + + MOD_INC_USE_COUNT; + daemonize(); + + oldmm = get_fs(); + set_fs(KERNEL_DS); + + if (ip_vs_sync_state == IP_VS_STATE_MASTER) + sprintf(current->comm, "ipvs syncmaster"); + else if (ip_vs_sync_state == IP_VS_STATE_BACKUP) + sprintf(current->comm, "ipvs syncbackup"); + else IP_VS_BUG(); + + spin_lock_irq(¤t->sigmask_lock); + siginitsetinv(¤t->blocked, 0); + recalc_sigpending(current); + spin_unlock_irq(¤t->sigmask_lock); + + /* set up multicast address */ + mcast_addr.sin_family = AF_INET; + mcast_addr.sin_port = htons(IP_VS_SYNC_PORT); + mcast_addr.sin_addr.s_addr = htonl(IP_VS_SYNC_GROUP); + + add_wait_queue(&sync_wait, &wait); + + state = ip_vs_sync_state; + sync_pid = current->pid; + IP_VS_INFO("sync thread started.\n"); + complete((struct completion *)startup); + + /* processing master/backup loop here */ + if (state == IP_VS_STATE_MASTER) + sync_master_loop(); + else if (state == IP_VS_STATE_BACKUP) + sync_backup_loop(); + else IP_VS_BUG(); + + remove_wait_queue(&sync_wait, &wait); + + /* thread exits */ + sync_pid = 0; + IP_VS_INFO("sync thread stopped!\n"); + + set_fs(oldmm); + MOD_DEC_USE_COUNT; + + stop_sync = 0; + wake_up(&stop_sync_wait); + + return 0; +} + + +static int fork_sync_thread(void *startup) +{ + /* fork the sync thread here, then the parent process of the + sync thread is the init process after this thread exits. */ + if (kernel_thread(sync_thread, startup, 0) < 0) + IP_VS_BUG(); + return 0; +} + + +int start_sync_thread(int state, char *mcast_ifn) +{ + DECLARE_COMPLETION(startup); + pid_t pid; + int waitpid_result; + + if (sync_pid) + return -EEXIST; + + IP_VS_DBG(7, "%s: pid %d\n", __FUNCTION__, current->pid); + IP_VS_DBG(7, "Each ip_vs_sync_conn entry need %d bytes\n", + sizeof(struct ip_vs_sync_conn)); + + ip_vs_sync_state = state; + strcpy(ip_vs_mcast_ifn, mcast_ifn); + + if ((pid = kernel_thread(fork_sync_thread, &startup, 0)) < 0) + IP_VS_BUG(); + + if ((waitpid_result = waitpid(pid, NULL, __WCLONE)) != pid) { + IP_VS_ERR("%s: waitpid(%d,...) failed, errno %d\n", + __FUNCTION__, pid, -waitpid_result); + } + + wait_for_completion(&startup); + + return 0; +} + + +int stop_sync_thread(void) +{ + DECLARE_WAITQUEUE(wait, current); + + if (!sync_pid) + return -ESRCH; + + IP_VS_DBG(7, "%s: pid %d\n", __FUNCTION__, current->pid); + IP_VS_INFO("stopping sync thread %d ...\n", sync_pid); + + __set_current_state(TASK_UNINTERRUPTIBLE); + add_wait_queue(&stop_sync_wait, &wait); + ip_vs_sync_state = IP_VS_STATE_NONE; + stop_sync = 1; + wake_up(&sync_wait); + schedule(); + __set_current_state(TASK_RUNNING); + remove_wait_queue(&stop_sync_wait, &wait); + + /* Note: no need to reap the sync thread, because its parent + process is the init process */ + + if (stop_sync) + IP_VS_BUG(); + + return 0; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_wlc.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_wlc.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_wlc.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_wlc.c 2003-10-22 22:49:48.000000000 +0000 @@ -0,0 +1,157 @@ +/* + * IPVS: Weighted Least-Connection Scheduling module + * + * Version: $Id: ip_vs_wlc.c,v 1.10.2.1 2003/04/11 14:02:35 wensong Exp $ + * + * Authors: Wensong Zhang + * Peter Kese + * + * 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. + * + * Changes: + * Wensong Zhang : changed the ip_vs_wlc_schedule to return dest + * Wensong Zhang : changed to use the inactconns in scheduling + * Wensong Zhang : changed some comestics things for debugging + * Wensong Zhang : changed for the d-linked destination list + * Wensong Zhang : added the ip_vs_wlc_update_svc + * Wensong Zhang : added any dest with weight=0 is quiesced + * + */ + +#include +#include +#include +#include +#include +#include + +#include + + +static int +ip_vs_wlc_init_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int +ip_vs_wlc_done_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static int +ip_vs_wlc_update_svc(struct ip_vs_service *svc) +{ + return 0; +} + + +static inline unsigned int +ip_vs_wlc_dest_overhead(struct ip_vs_dest *dest) +{ + /* + * We think the overhead of processing active connections is 256 + * times higher than that of inactive connections in average. (This + * 256 times might not be accurate, we will change it later) We + * use the following formula to estimate the overhead now: + * dest->activeconns*256 + dest->inactconns + */ + return (atomic_read(&dest->activeconns) << 8) + + atomic_read(&dest->inactconns); +} + + +/* + * Weighted Least Connection scheduling + */ +static struct ip_vs_dest * +ip_vs_wlc_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + register struct list_head *l, *e; + struct ip_vs_dest *dest, *least; + unsigned int loh, doh; + + IP_VS_DBG(6, "ip_vs_wlc_schedule(): Scheduling...\n"); + + /* + * We calculate the load of each dest server as follows: + * (dest overhead) / dest->weight + * + * Remember -- no floats in kernel mode!!! + * The comparison of h1*w2 > h2*w1 is equivalent to that of + * h1/w1 > h2/w2 + * if every weight is larger than zero. + * + * The server with weight=0 is quiesced and will not receive any + * new connections. + */ + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + least = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&least->weight) > 0) { + loh = ip_vs_wlc_dest_overhead(least); + goto nextstage; + } + } + return NULL; + + /* + * Find the destination with the least load. + */ + nextstage: + for (e=e->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + + doh = ip_vs_wlc_dest_overhead(dest); + if (loh * atomic_read(&dest->weight) > + doh * atomic_read(&least->weight)) { + least = dest; + loh = doh; + } + } + + IP_VS_DBG(6, "WLC: server %u.%u.%u.%u:%u " + "activeconns %d refcnt %d weight %d overhead %d\n", + NIPQUAD(least->addr), ntohs(least->port), + atomic_read(&least->activeconns), + atomic_read(&least->refcnt), + atomic_read(&least->weight), loh); + + return least; +} + + +static struct ip_vs_scheduler ip_vs_wlc_scheduler = +{ + {0}, /* n_list */ + "wlc", /* name */ + ATOMIC_INIT(0), /* refcnt */ + THIS_MODULE, /* this module */ + ip_vs_wlc_init_svc, /* service initializer */ + ip_vs_wlc_done_svc, /* service done */ + ip_vs_wlc_update_svc, /* service updater */ + ip_vs_wlc_schedule, /* select a server from the destination list */ +}; + + +static int __init ip_vs_wlc_init(void) +{ + INIT_LIST_HEAD(&ip_vs_wlc_scheduler.n_list); + return register_ip_vs_scheduler(&ip_vs_wlc_scheduler); +} + +static void __exit ip_vs_wlc_cleanup(void) +{ + unregister_ip_vs_scheduler(&ip_vs_wlc_scheduler); +} + +module_init(ip_vs_wlc_init); +module_exit(ip_vs_wlc_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/ipvs/ip_vs_wrr.c linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_wrr.c --- linux-2.4.22/net/ipv4/ipvs/ip_vs_wrr.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/ipvs/ip_vs_wrr.c 2003-10-22 22:49:17.000000000 +0000 @@ -0,0 +1,240 @@ +/* + * IPVS: Weighted Round-Robin Scheduling module + * + * Version: $Id: ip_vs_wrr.c,v 1.11 2002/03/25 12:44:35 wensong Exp $ + * + * Authors: Wensong Zhang + * + * 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. + * + * Changes: + * Wensong Zhang : changed the ip_vs_wrr_schedule to return dest + * Wensong Zhang : changed some comestics things for debugging + * Wensong Zhang : changed for the d-linked destination list + * Wensong Zhang : added the ip_vs_wrr_update_svc + * Julian Anastasov : fixed the bug of returning destination + * with weight 0 when all weights are zero + * + */ + +#include +#include +#include +#include +#include +#include + +#include + +/* + * current destination pointer for weighted round-robin scheduling + */ +struct ip_vs_wrr_mark { + struct list_head *cl; /* current list head */ + int cw; /* current weight */ + int mw; /* maximum weight */ + int di; /* decreasing interval */ +}; + + +/* + * Get the gcd of server weights + */ +static int gcd(int a, int b) +{ + int c; + + while ((c = a % b)) { + a = b; + b = c; + } + return b; +} + +static int ip_vs_wrr_gcd_weight(struct ip_vs_service *svc) +{ + register struct list_head *l, *e; + struct ip_vs_dest *dest; + int weight; + int g = 1; + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + weight = atomic_read(&dest->weight); + if (weight > 0) { + g = weight; + break; + } + } + if (e == l) + return g; + + for (e=e->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + weight = atomic_read(&dest->weight); + if (weight > 0) + g = gcd(weight, g); + } + + return g; +} + + +/* + * Get the maximum weight of the service destinations. + */ +static int ip_vs_wrr_max_weight(struct ip_vs_service *svc) +{ + register struct list_head *l, *e; + struct ip_vs_dest *dest; + int weight = 0; + + l = &svc->destinations; + for (e=l->next; e!=l; e=e->next) { + dest = list_entry(e, struct ip_vs_dest, n_list); + if (atomic_read(&dest->weight) > weight) + weight = atomic_read(&dest->weight); + } + + return weight; +} + + +static int ip_vs_wrr_init_svc(struct ip_vs_service *svc) +{ + struct ip_vs_wrr_mark *mark; + + /* + * Allocate the mark variable for WRR scheduling + */ + mark = kmalloc(sizeof(struct ip_vs_wrr_mark), GFP_ATOMIC); + if (mark == NULL) { + IP_VS_ERR("ip_vs_wrr_init_svc(): no memory\n"); + return -ENOMEM; + } + mark->cl = &svc->destinations; + mark->cw = 0; + mark->mw = ip_vs_wrr_max_weight(svc); + mark->di = ip_vs_wrr_gcd_weight(svc); + svc->sched_data = mark; + + return 0; +} + + +static int ip_vs_wrr_done_svc(struct ip_vs_service *svc) +{ + /* + * Release the mark variable + */ + kfree(svc->sched_data); + + return 0; +} + + +static int ip_vs_wrr_update_svc(struct ip_vs_service *svc) +{ + struct ip_vs_wrr_mark *mark = svc->sched_data; + + mark->cl = &svc->destinations; + mark->mw = ip_vs_wrr_max_weight(svc); + mark->di = ip_vs_wrr_gcd_weight(svc); + return 0; +} + + +/* + * Weighted Round-Robin Scheduling + */ +static struct ip_vs_dest * +ip_vs_wrr_schedule(struct ip_vs_service *svc, struct iphdr *iph) +{ + struct ip_vs_dest *dest; + struct ip_vs_wrr_mark *mark = svc->sched_data; + + IP_VS_DBG(6, "ip_vs_wrr_schedule(): Scheduling...\n"); + + /* + * This loop will always terminate, because 0cwsched_lock); + while (1) { + if (mark->cl == &svc->destinations) { + /* it is at the head of the destination list */ + + if (mark->cl == mark->cl->next) { + /* no dest entry */ + write_unlock(&svc->sched_lock); + return NULL; + } + + mark->cl = svc->destinations.next; + mark->cw -= mark->di; + if (mark->cw <= 0) { + mark->cw = mark->mw; + /* + * Still zero, which means no availabe servers. + */ + if (mark->cw == 0) { + mark->cl = &svc->destinations; + write_unlock(&svc->sched_lock); + IP_VS_INFO("ip_vs_wrr_schedule(): " + "no available servers\n"); + return NULL; + } + } + } + else mark->cl = mark->cl->next; + + if (mark->cl != &svc->destinations) { + /* not at the head of the list */ + dest = list_entry(mark->cl, struct ip_vs_dest, n_list); + if (atomic_read(&dest->weight) >= mark->cw) { + write_unlock(&svc->sched_lock); + break; + } + } + } + + IP_VS_DBG(6, "WRR: server %u.%u.%u.%u:%u " + "activeconns %d refcnt %d weight %d\n", + NIPQUAD(dest->addr), ntohs(dest->port), + atomic_read(&dest->activeconns), + atomic_read(&dest->refcnt), + atomic_read(&dest->weight)); + + return dest; +} + + +static struct ip_vs_scheduler ip_vs_wrr_scheduler = { + {0}, /* n_list */ + "wrr", /* name */ + ATOMIC_INIT(0), /* refcnt */ + THIS_MODULE, /* this module */ + ip_vs_wrr_init_svc, /* service initializer */ + ip_vs_wrr_done_svc, /* service done */ + ip_vs_wrr_update_svc, /* service updater */ + ip_vs_wrr_schedule, /* select a server from the destination list */ +}; + +static int __init ip_vs_wrr_init(void) +{ + INIT_LIST_HEAD(&ip_vs_wrr_scheduler.n_list); + return register_ip_vs_scheduler(&ip_vs_wrr_scheduler) ; +} + +static void __exit ip_vs_wrr_cleanup(void) +{ + unregister_ip_vs_scheduler(&ip_vs_wrr_scheduler); +} + +module_init(ip_vs_wrr_init); +module_exit(ip_vs_wrr_cleanup); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_conntrack_core.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_core.c --- linux-2.4.22/net/ipv4/netfilter/ip_conntrack_core.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_core.c 2003-10-22 22:47:28.000000000 +0000 @@ -60,7 +60,7 @@ LIST_HEAD(protocol_list); static LIST_HEAD(helpers); unsigned int ip_conntrack_htable_size = 0; -static int ip_conntrack_max = 0; +int ip_conntrack_max = 0; static atomic_t ip_conntrack_count = ATOMIC_INIT(0); struct list_head *ip_conntrack_hash; static kmem_cache_t *ip_conntrack_cachep; @@ -291,14 +291,15 @@ static void clean_from_lists(struct ip_conntrack *ct) { + unsigned int ho, hr; + DEBUGP("clean_from_lists(%p)\n", ct); MUST_BE_WRITE_LOCKED(&ip_conntrack_lock); - LIST_DELETE(&ip_conntrack_hash - [hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple)], - &ct->tuplehash[IP_CT_DIR_ORIGINAL]); - LIST_DELETE(&ip_conntrack_hash - [hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple)], - &ct->tuplehash[IP_CT_DIR_REPLY]); + + ho = hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple); + hr = hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple); + LIST_DELETE(&ip_conntrack_hash[ho], &ct->tuplehash[IP_CT_DIR_ORIGINAL]); + LIST_DELETE(&ip_conntrack_hash[hr], &ct->tuplehash[IP_CT_DIR_REPLY]); /* Destroy all un-established, pending expectations */ remove_expectations(ct, 1); @@ -307,7 +308,7 @@ static void destroy_conntrack(struct nf_conntrack *nfct) { - struct ip_conntrack *ct = (struct ip_conntrack *)nfct; + struct ip_conntrack *ct = (struct ip_conntrack *)nfct, *master = NULL; struct ip_conntrack_protocol *proto; DEBUGP("destroy_conntrack(%p)\n", ct); @@ -334,12 +335,15 @@ /* can't call __unexpect_related here, * since it would screw up expect_list */ list_del(&ct->master->expected_list); - ip_conntrack_put(ct->master->expectant); + master = ct->master->expectant; } kfree(ct->master); } WRITE_UNLOCK(&ip_conntrack_lock); + if (master) + ip_conntrack_put(master); + DEBUGP("destroy_conntrack: returning ct=%p to slab\n", ct); kmem_cache_free(ip_conntrack_cachep, ct); atomic_dec(&ip_conntrack_count); @@ -370,9 +374,10 @@ const struct ip_conntrack *ignored_conntrack) { struct ip_conntrack_tuple_hash *h; + unsigned int hash = hash_conntrack(tuple); MUST_BE_READ_LOCKED(&ip_conntrack_lock); - h = LIST_FIND(&ip_conntrack_hash[hash_conntrack(tuple)], + h = LIST_FIND(&ip_conntrack_hash[hash], conntrack_tuple_cmp, struct ip_conntrack_tuple_hash *, tuple, ignored_conntrack); @@ -1303,9 +1308,14 @@ getorigdst(struct sock *sk, int optval, void *user, int *len) { struct ip_conntrack_tuple_hash *h; - struct ip_conntrack_tuple tuple = { { sk->rcv_saddr, { .tcp = { sk->sport } } }, - { sk->daddr, { .tcp = { sk->dport } }, - IPPROTO_TCP } }; + struct ip_conntrack_tuple tuple; + + IP_CT_TUPLE_U_BLANK(&tuple); + tuple.src.ip = sk->rcv_saddr; + tuple.src.u.tcp.port = sk->sport; + tuple.dst.ip = sk->daddr; + tuple.dst.u.tcp.port = sk->dport; + tuple.dst.protonum = IPPROTO_TCP; /* We only do TCP at the moment: is there a better way? */ if (strcmp(sk->prot->name, "TCP") != 0) { @@ -1349,29 +1359,6 @@ SO_ORIGINAL_DST, SO_ORIGINAL_DST+1, &getorigdst, 0, NULL }; -#define NET_IP_CONNTRACK_MAX 2089 -#define NET_IP_CONNTRACK_MAX_NAME "ip_conntrack_max" - -#ifdef CONFIG_SYSCTL -static struct ctl_table_header *ip_conntrack_sysctl_header; - -static ctl_table ip_conntrack_table[] = { - { NET_IP_CONNTRACK_MAX, NET_IP_CONNTRACK_MAX_NAME, &ip_conntrack_max, - sizeof(ip_conntrack_max), 0644, NULL, proc_dointvec }, - { 0 } -}; - -static ctl_table ip_conntrack_dir_table[] = { - {NET_IPV4, "ipv4", NULL, 0, 0555, ip_conntrack_table, 0, 0, 0, 0, 0}, - { 0 } -}; - -static ctl_table ip_conntrack_root_table[] = { - {CTL_NET, "net", NULL, 0, 0555, ip_conntrack_dir_table, 0, 0, 0, 0, 0}, - { 0 } -}; -#endif /*CONFIG_SYSCTL*/ - static int kill_all(const struct ip_conntrack *i, void *data) { return 1; @@ -1381,9 +1368,6 @@ supposed to kill the mall. */ void ip_conntrack_cleanup(void) { -#ifdef CONFIG_SYSCTL - unregister_sysctl_table(ip_conntrack_sysctl_header); -#endif ip_ct_attach = NULL; /* This makes sure all current packets have passed through netfilter framework. Roll on, two-stage module @@ -1462,25 +1446,10 @@ for (i = 0; i < ip_conntrack_htable_size; i++) INIT_LIST_HEAD(&ip_conntrack_hash[i]); -/* This is fucking braindead. There is NO WAY of doing this without - the CONFIG_SYSCTL unless you don't want to detect errors. - Grrr... --RR */ -#ifdef CONFIG_SYSCTL - ip_conntrack_sysctl_header - = register_sysctl_table(ip_conntrack_root_table, 0); - if (ip_conntrack_sysctl_header == NULL) { - goto err_free_ct_cachep; - } -#endif /*CONFIG_SYSCTL*/ - /* For use by ipt_REJECT */ ip_ct_attach = ip_conntrack_attach; return ret; -#ifdef CONFIG_SYSCTL -err_free_ct_cachep: - kmem_cache_destroy(ip_conntrack_cachep); -#endif /*CONFIG_SYSCTL*/ err_free_hash: vfree(ip_conntrack_hash); err_unreg_sockopt: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_conntrack_irc.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_irc.c --- linux-2.4.22/net/ipv4/netfilter/ip_conntrack_irc.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_irc.c 2003-10-22 22:49:16.000000000 +0000 @@ -192,7 +192,10 @@ DEBUGP("DCC bound ip/port: %u.%u.%u.%u:%u\n", HIPQUAD(dcc_ip), dcc_port); - if (ct->tuplehash[dir].tuple.src.ip != htonl(dcc_ip)) { + /* dcc_ip can be the internal OR external (NAT'ed) IP + * Tiago Sousa */ + if (ct->tuplehash[dir].tuple.src.ip != htonl(dcc_ip) + && ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip != htonl(dcc_ip)) { if (net_ratelimit()) printk(KERN_WARNING "Forged DCC command from " @@ -218,7 +221,7 @@ exp->tuple = ((struct ip_conntrack_tuple) { { 0, { 0 } }, - { htonl(dcc_ip), { .tcp = { htons(dcc_port) } }, + { ct->tuplehash[dir].tuple.src.ip, { .tcp = { htons(dcc_port) } }, IPPROTO_TCP }}); exp->mask = ((struct ip_conntrack_tuple) { { 0, { 0 } }, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_conntrack_proto_generic.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_proto_generic.c --- linux-2.4.22/net/ipv4/netfilter/ip_conntrack_proto_generic.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_proto_generic.c 2003-10-22 22:48:28.000000000 +0000 @@ -4,7 +4,7 @@ #include #include -#define GENERIC_TIMEOUT (600*HZ) +unsigned long ip_ct_generic_timeout = 600*HZ; static int generic_pkt_to_tuple(const void *datah, size_t datalen, struct ip_conntrack_tuple *tuple) @@ -43,7 +43,7 @@ struct iphdr *iph, size_t len, enum ip_conntrack_info conntrackinfo) { - ip_ct_refresh(conntrack, GENERIC_TIMEOUT); + ip_ct_refresh(conntrack, ip_ct_generic_timeout); return NF_ACCEPT; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_conntrack_proto_icmp.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_proto_icmp.c --- linux-2.4.22/net/ipv4/netfilter/ip_conntrack_proto_icmp.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_proto_icmp.c 2003-10-22 22:47:30.000000000 +0000 @@ -6,7 +6,7 @@ #include #include -#define ICMP_TIMEOUT (30*HZ) +unsigned long ip_ct_icmp_timeout = 30*HZ; #if 0 #define DEBUGP printk @@ -82,7 +82,7 @@ ct->timeout.function((unsigned long)ct); } else { atomic_inc(&ct->proto.icmp.count); - ip_ct_refresh(ct, ICMP_TIMEOUT); + ip_ct_refresh(ct, ip_ct_icmp_timeout); } return NF_ACCEPT; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_conntrack_proto_tcp.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_proto_tcp.c --- linux-2.4.22/net/ipv4/netfilter/ip_conntrack_proto_tcp.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_proto_tcp.c 2003-10-22 22:49:49.000000000 +0000 @@ -49,20 +49,28 @@ #define HOURS * 60 MINS #define DAYS * 24 HOURS - -static unsigned long tcp_timeouts[] -= { 30 MINS, /* TCP_CONNTRACK_NONE, */ - 5 DAYS, /* TCP_CONNTRACK_ESTABLISHED, */ - 2 MINS, /* TCP_CONNTRACK_SYN_SENT, */ - 60 SECS, /* TCP_CONNTRACK_SYN_RECV, */ - 2 MINS, /* TCP_CONNTRACK_FIN_WAIT, */ - 2 MINS, /* TCP_CONNTRACK_TIME_WAIT, */ - 10 SECS, /* TCP_CONNTRACK_CLOSE, */ - 60 SECS, /* TCP_CONNTRACK_CLOSE_WAIT, */ - 30 SECS, /* TCP_CONNTRACK_LAST_ACK, */ - 2 MINS, /* TCP_CONNTRACK_LISTEN, */ -}; - +unsigned long ip_ct_tcp_timeout_syn_sent = 2 MINS; +unsigned long ip_ct_tcp_timeout_syn_recv = 60 SECS; +unsigned long ip_ct_tcp_timeout_established = 5 DAYS; +unsigned long ip_ct_tcp_timeout_fin_wait = 2 MINS; +unsigned long ip_ct_tcp_timeout_close_wait = 3 DAYS; +unsigned long ip_ct_tcp_timeout_last_ack = 30 SECS; +unsigned long ip_ct_tcp_timeout_time_wait = 2 MINS; +unsigned long ip_ct_tcp_timeout_close = 10 SECS; + +static unsigned long * tcp_timeouts[] += { 0, /* TCP_CONNTRACK_NONE */ + &ip_ct_tcp_timeout_established, /* TCP_CONNTRACK_ESTABLISHED, */ + &ip_ct_tcp_timeout_syn_sent, /* TCP_CONNTRACK_SYN_SENT, */ + &ip_ct_tcp_timeout_syn_recv, /* TCP_CONNTRACK_SYN_RECV, */ + &ip_ct_tcp_timeout_fin_wait, /* TCP_CONNTRACK_FIN_WAIT, */ + &ip_ct_tcp_timeout_time_wait, /* TCP_CONNTRACK_TIME_WAIT, */ + &ip_ct_tcp_timeout_close, /* TCP_CONNTRACK_CLOSE, */ + &ip_ct_tcp_timeout_close_wait, /* TCP_CONNTRACK_CLOSE_WAIT, */ + &ip_ct_tcp_timeout_last_ack, /* TCP_CONNTRACK_LAST_ACK, */ + 0, /* TCP_CONNTRACK_LISTEN */ + }; + #define sNO TCP_CONNTRACK_NONE #define sES TCP_CONNTRACK_ESTABLISHED #define sSS TCP_CONNTRACK_SYN_SENT @@ -203,7 +211,7 @@ set_bit(IPS_ASSURED_BIT, &conntrack->status); WRITE_UNLOCK(&tcp_lock); - ip_ct_refresh(conntrack, tcp_timeouts[newconntrack]); + ip_ct_refresh(conntrack, *tcp_timeouts[newconntrack]); } return NF_ACCEPT; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_conntrack_proto_udp.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_proto_udp.c --- linux-2.4.22/net/ipv4/netfilter/ip_conntrack_proto_udp.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_proto_udp.c 2003-10-22 22:47:27.000000000 +0000 @@ -6,8 +6,8 @@ #include #include -#define UDP_TIMEOUT (30*HZ) -#define UDP_STREAM_TIMEOUT (180*HZ) +unsigned long ip_ct_udp_timeout = 30*HZ; +unsigned long ip_ct_udp_timeout_stream = 180*HZ; static int udp_pkt_to_tuple(const void *datah, size_t datalen, struct ip_conntrack_tuple *tuple) @@ -52,11 +52,11 @@ /* If we've seen traffic both ways, this is some kind of UDP stream. Extend timeout. */ if (test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)) { - ip_ct_refresh(conntrack, UDP_STREAM_TIMEOUT); + ip_ct_refresh(conntrack, ip_ct_udp_timeout_stream); /* Also, more likely to be important, and not a probe */ set_bit(IPS_ASSURED_BIT, &conntrack->status); } else - ip_ct_refresh(conntrack, UDP_TIMEOUT); + ip_ct_refresh(conntrack, ip_ct_udp_timeout); return NF_ACCEPT; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_conntrack_standalone.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_standalone.c --- linux-2.4.22/net/ipv4/netfilter/ip_conntrack_standalone.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_conntrack_standalone.c 2003-10-22 22:48:42.000000000 +0000 @@ -7,6 +7,7 @@ /* (c) 1999 Paul `Rusty' Russell. Licenced under the GNU General Public Licence. */ +#include #include #include #include @@ -16,6 +17,9 @@ #include #include #include +#ifdef CONFIG_SYSCTL +#include +#endif #include #define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_conntrack_lock) @@ -239,6 +243,98 @@ static struct nf_hook_ops ip_conntrack_local_in_ops = { { NULL, NULL }, ip_confirm, PF_INET, NF_IP_LOCAL_IN, NF_IP_PRI_LAST-1 }; +/* Sysctl support */ + +#ifdef CONFIG_SYSCTL + +/* From ip_conntrack_core.c */ +extern int ip_conntrack_max; + +/* From ip_conntrack_proto_tcp.c */ +extern unsigned long ip_ct_tcp_timeout_syn_sent; +extern unsigned long ip_ct_tcp_timeout_syn_recv; +extern unsigned long ip_ct_tcp_timeout_established; +extern unsigned long ip_ct_tcp_timeout_fin_wait; +extern unsigned long ip_ct_tcp_timeout_close_wait; +extern unsigned long ip_ct_tcp_timeout_last_ack; +extern unsigned long ip_ct_tcp_timeout_time_wait; +extern unsigned long ip_ct_tcp_timeout_close; + +/* From ip_conntrack_proto_udp.c */ +extern unsigned long ip_ct_udp_timeout; +extern unsigned long ip_ct_udp_timeout_stream; + +/* From ip_conntrack_proto_icmp.c */ +extern unsigned long ip_ct_icmp_timeout; + +/* From ip_conntrack_proto_icmp.c */ +extern unsigned long ip_ct_generic_timeout; + +static struct ctl_table_header *ip_ct_sysctl_header; + +static ctl_table ip_ct_sysctl_table[] = { + {NET_IPV4_NF_CONNTRACK_MAX, "ip_conntrack_max", + &ip_conntrack_max, sizeof(int), 0644, NULL, + &proc_dointvec}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT, "ip_conntrack_tcp_timeout_syn_sent", + &ip_ct_tcp_timeout_syn_sent, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV, "ip_conntrack_tcp_timeout_syn_recv", + &ip_ct_tcp_timeout_syn_recv, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED, "ip_conntrack_tcp_timeout_established", + &ip_ct_tcp_timeout_established, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT, "ip_conntrack_tcp_timeout_fin_wait", + &ip_ct_tcp_timeout_fin_wait, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT, "ip_conntrack_tcp_timeout_close_wait", + &ip_ct_tcp_timeout_close_wait, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK, "ip_conntrack_tcp_timeout_last_ack", + &ip_ct_tcp_timeout_last_ack, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT, "ip_conntrack_tcp_timeout_time_wait", + &ip_ct_tcp_timeout_time_wait, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE, "ip_conntrack_tcp_timeout_close", + &ip_ct_tcp_timeout_close, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT, "ip_conntrack_udp_timeout", + &ip_ct_udp_timeout, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT_STREAM, "ip_conntrack_udp_timeout_stream", + &ip_ct_udp_timeout_stream, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_ICMP_TIMEOUT, "ip_conntrack_icmp_timeout", + &ip_ct_icmp_timeout, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_GENERIC_TIMEOUT, "ip_conntrack_generic_timeout", + &ip_ct_generic_timeout, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {0} +}; + +#define NET_IP_CONNTRACK_MAX 2089 + +static ctl_table ip_ct_netfilter_table[] = { + {NET_IPV4_NETFILTER, "netfilter", NULL, 0, 0555, ip_ct_sysctl_table, 0, 0, 0, 0, 0}, + {NET_IP_CONNTRACK_MAX, "ip_conntrack_max", + &ip_conntrack_max, sizeof(int), 0644, NULL, + &proc_dointvec}, + {0} +}; + +static ctl_table ip_ct_ipv4_table[] = { + {NET_IPV4, "ipv4", NULL, 0, 0555, ip_ct_netfilter_table, 0, 0, 0, 0, 0}, + {0} +}; + +static ctl_table ip_ct_net_table[] = { + {CTL_NET, "net", NULL, 0, 0555, ip_ct_ipv4_table, 0, 0, 0, 0, 0}, + {0} +}; +#endif static int init_or_cleanup(int init) { struct proc_dir_entry *proc; @@ -274,10 +370,20 @@ printk("ip_conntrack: can't register local in hook.\n"); goto cleanup_inoutandlocalops; } +#ifdef CONFIG_SYSCTL + ip_ct_sysctl_header = register_sysctl_table(ip_ct_net_table, 0); + if (ip_ct_sysctl_header == NULL) { + printk("ip_conntrack: can't register to sysctl.\n"); + goto cleanup; + } +#endif return ret; cleanup: +#ifdef CONFIG_SYSCTL + unregister_sysctl_table(ip_ct_sysctl_header); +#endif nf_unregister_hook(&ip_conntrack_local_in_ops); cleanup_inoutandlocalops: nf_unregister_hook(&ip_conntrack_out_ops); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_fw_compat.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_fw_compat.c --- linux-2.4.22/net/ipv4/netfilter/ip_fw_compat.c 2001-12-21 17:42:05.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_fw_compat.c 2003-10-22 22:48:32.000000000 +0000 @@ -47,6 +47,12 @@ extern int __init masq_init(void); extern void masq_cleanup(void); +#ifdef CONFIG_IP_VS +/* From ip_vs_core.c */ +extern unsigned int +check_for_ip_vs_out(struct sk_buff **skb_p, int (*okfn)(struct sk_buff *)); +#endif + /* They call these; we do what they want. */ int register_firewall(int pf, struct firewall_ops *fw) { @@ -172,8 +178,14 @@ return NF_ACCEPT; case FW_MASQUERADE: - if (hooknum == NF_IP_FORWARD) + if (hooknum == NF_IP_FORWARD) { +#ifdef CONFIG_IP_VS + /* check if it is for ip_vs */ + if (check_for_ip_vs_out(pskb, okfn) == NF_STOLEN) + return NF_STOLEN; +#endif return do_masquerade(pskb, out); + } else return NF_ACCEPT; case FW_REDIRECT: diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_nat_amanda.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_amanda.c --- linux-2.4.22/net/ipv4/netfilter/ip_nat_amanda.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_amanda.c 2003-10-22 22:47:58.000000000 +0000 @@ -101,7 +101,7 @@ struct ip_conntrack_expect *exp = expect; struct ip_ct_amanda_expect *ct_amanda_info = &exp->help.exp_amanda_info; struct ip_conntrack_tuple t = exp->tuple; - int port; + u_int16_t port; MUST_BE_LOCKED(&ip_amanda_lock); @@ -115,7 +115,7 @@ writable */ t.dst.ip = newip; - for (port = ct_amanda_info->port + 10; port != 0; port++) { + for (port = ct_amanda_info->port; port != 0; port++) { t.dst.u.tcp.port = htons(port); if (ip_conntrack_change_expect(exp, &t) == 0) break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_nat_core.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_core.c --- linux-2.4.22/net/ipv4/netfilter/ip_nat_core.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_core.c 2003-10-22 22:47:51.000000000 +0000 @@ -67,6 +67,7 @@ static void ip_nat_cleanup_conntrack(struct ip_conntrack *conn) { struct ip_nat_info *info = &conn->nat.info; + unsigned int hs, hp; if (!info->initialized) return; @@ -74,21 +75,18 @@ IP_NF_ASSERT(info->bysource.conntrack); IP_NF_ASSERT(info->byipsproto.conntrack); + hs = hash_by_src(&conn->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src, + conn->tuplehash[IP_CT_DIR_ORIGINAL] + .tuple.dst.protonum); + + hp = hash_by_ipsproto(conn->tuplehash[IP_CT_DIR_REPLY].tuple.src.ip, + conn->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip, + conn->tuplehash[IP_CT_DIR_REPLY] + .tuple.dst.protonum); + WRITE_LOCK(&ip_nat_lock); - LIST_DELETE(&bysource[hash_by_src(&conn->tuplehash[IP_CT_DIR_ORIGINAL] - .tuple.src, - conn->tuplehash[IP_CT_DIR_ORIGINAL] - .tuple.dst.protonum)], - &info->bysource); - - LIST_DELETE(&byipsproto - [hash_by_ipsproto(conn->tuplehash[IP_CT_DIR_REPLY] - .tuple.src.ip, - conn->tuplehash[IP_CT_DIR_REPLY] - .tuple.dst.ip, - conn->tuplehash[IP_CT_DIR_REPLY] - .tuple.dst.protonum)], - &info->byipsproto); + LIST_DELETE(&bysource[hs], &info->bysource); + LIST_DELETE(&byipsproto[hp], &info->byipsproto); WRITE_UNLOCK(&ip_nat_lock); } @@ -159,8 +157,8 @@ continue; } - if ((mr->range[i].flags & IP_NAT_RANGE_PROTO_SPECIFIED) - && proto->in_range(&newtuple, IP_NAT_MANIP_SRC, + if (!(mr->range[i].flags & IP_NAT_RANGE_PROTO_SPECIFIED) + || proto->in_range(&newtuple, IP_NAT_MANIP_SRC, &mr->range[i].min, &mr->range[i].max)) return 1; } @@ -244,11 +242,12 @@ const struct ip_conntrack *conntrack) { unsigned int score = 0; + unsigned int h; MUST_BE_READ_LOCKED(&ip_nat_lock); - LIST_FIND(&byipsproto[hash_by_ipsproto(src, dst, protonum)], - fake_cmp, struct ip_nat_hash *, src, dst, protonum, &score, - conntrack); + h = hash_by_ipsproto(src, dst, protonum); + LIST_FIND(&byipsproto[h], fake_cmp, struct ip_nat_hash *, + src, dst, protonum, &score, conntrack); return score; } @@ -516,12 +515,14 @@ struct ip_conntrack_tuple new_tuple, inv_tuple, reply; struct ip_conntrack_tuple orig_tp; struct ip_nat_info *info = &conntrack->nat.info; + int in_hashes = info->initialized; MUST_BE_WRITE_LOCKED(&ip_nat_lock); IP_NF_ASSERT(hooknum == NF_IP_PRE_ROUTING || hooknum == NF_IP_POST_ROUTING || hooknum == NF_IP_LOCAL_OUT); IP_NF_ASSERT(info->num_manips < IP_NAT_MAX_MANIPS); + IP_NF_ASSERT(!(info->initialized & (1 << HOOK2MANIP(hooknum)))); /* What we've got will look like inverse of reply. Normally this is what is in the conntrack, except for prior @@ -638,6 +639,14 @@ /* It's done. */ info->initialized |= (1 << HOOK2MANIP(hooknum)); + + if (in_hashes) { + IP_NF_ASSERT(info->bysource.conntrack); + replace_in_hashes(conntrack, info); + } else { + place_in_hashes(conntrack, info); + } + return NF_ACCEPT; } @@ -756,11 +765,6 @@ enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo); int is_tcp = (*pskb)->nh.iph->protocol == IPPROTO_TCP; - /* Skip everything and don't call helpers if there are no - * manips for this connection */ - if (info->num_manips == 0) - return NF_ACCEPT; - /* Need nat lock to protect against modification, but neither conntrack (referenced) and helper (deleted with synchronize_bh()) can vanish. */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_nat_helper.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_helper.c --- linux-2.4.22/net/ipv4/netfilter/ip_nat_helper.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_helper.c 2003-10-22 22:47:54.000000000 +0000 @@ -195,16 +195,11 @@ skb_trim(*skb, newlen); } - /* fix checksum information */ - iph->tot_len = htons(newlen); - (*skb)->csum = csum_partial((char *)tcph + tcph->doff*4, - newtcplen - tcph->doff*4, 0); - + /* fix checksum information */ tcph->check = 0; tcph->check = tcp_v4_check(tcph, newtcplen, iph->saddr, iph->daddr, - csum_partial((char *)tcph, tcph->doff*4, - (*skb)->csum)); + csum_partial((char *)tcph, newtcplen, 0)); ip_send_check(iph); return 1; @@ -238,6 +233,13 @@ newudplen = udplen - match_len + rep_len; newlen = iph->ihl*4 + newudplen; + /* UDP helpers might accidentally mangle the wrong packet */ + if (udplen < sizeof(*udph) + match_offset + match_len) { + if (net_ratelimit()) + printk("ip_nat_mangle_udp_packet: undersized packet\n"); + return 0; + } + if (newlen > 65535) { if (net_ratelimit()) printk("ip_nat_mangle_udp_packet: nat'ed packet " @@ -299,18 +301,12 @@ iph->tot_len = htons(newlen); /* fix udp checksum if udp checksum was previously calculated */ - if ((*skb)->csum != 0) { - (*skb)->csum = csum_partial((char *)udph + - sizeof(struct udphdr), - newudplen - sizeof(struct udphdr), - 0); - + if (udph->check != 0) { udph->check = 0; udph->check = csum_tcpudp_magic(iph->saddr, iph->daddr, newudplen, IPPROTO_UDP, csum_partial((char *)udph, - sizeof(struct udphdr), - (*skb)->csum)); + newudplen, 0)); } ip_send_check(iph); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_nat_irc.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_irc.c --- linux-2.4.22/net/ipv4/netfilter/ip_nat_irc.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_irc.c 2003-10-22 22:49:53.000000000 +0000 @@ -99,7 +99,7 @@ struct ip_conntrack_tuple t; struct iphdr *iph = (*pskb)->nh.iph; struct tcphdr *tcph = (void *) iph + iph->ihl * 4; - int port; + u_int16_t port; /* "4294967296 65635 " */ char buffer[18]; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_nat_rule.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_rule.c --- linux-2.4.22/net/ipv4/netfilter/ip_nat_rule.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_rule.c 2003-10-22 22:48:36.000000000 +0000 @@ -230,7 +230,7 @@ return 1; } -static inline unsigned int +inline unsigned int alloc_null_binding(struct ip_conntrack *conntrack, struct ip_nat_info *info, unsigned int hooknum) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_nat_snmp_basic.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_snmp_basic.c --- linux-2.4.22/net/ipv4/netfilter/ip_nat_snmp_basic.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_snmp_basic.c 2003-10-22 22:49:19.000000000 +0000 @@ -53,9 +53,9 @@ #include #include #include +#include #include #include -#include diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_nat_standalone.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_standalone.c --- linux-2.4.22/net/ipv4/netfilter/ip_nat_standalone.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_standalone.c 2003-10-22 22:48:13.000000000 +0000 @@ -115,7 +115,6 @@ /* Seen it before? This can happen for loopback, retrans, or local packets.. */ if (!(info->initialized & (1 << maniptype))) { - int in_hashes = info->initialized; unsigned int ret; if (ct->master @@ -126,9 +125,10 @@ } else { #ifdef CONFIG_IP_NF_NAT_LOCAL /* LOCAL_IN hook doesn't have a chain! */ - if (hooknum == NF_IP_LOCAL_IN) { - ret = NF_ACCEPT; - } else + if (hooknum == NF_IP_LOCAL_IN) + ret = alloc_null_binding(ct, info, + hooknum); + else #endif ret = ip_nat_rule_find(pskb, hooknum, in, out, ct, info); @@ -138,13 +138,6 @@ WRITE_UNLOCK(&ip_nat_lock); return ret; } - - if (in_hashes) { - IP_NF_ASSERT(info->bysource.conntrack); - replace_in_hashes(ct, info); - } else { - place_in_hashes(ct, info); - } } else DEBUGP("Already setup manip %s for ct %p\n", maniptype == IP_NAT_MANIP_SRC ? "SRC" : "DST", @@ -195,6 +188,7 @@ return ip_nat_fn(hooknum, pskb, in, out, okfn); } +#ifdef CONFIG_IP_NF_NAT_LOCAL static unsigned int ip_nat_local_fn(unsigned int hooknum, struct sk_buff **pskb, @@ -220,6 +214,7 @@ return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP; return ret; } +#endif /* We must be after connection tracking and before packet filtering. */ @@ -229,11 +224,12 @@ /* After packet filtering, change source */ static struct nf_hook_ops ip_nat_out_ops = { { NULL, NULL }, ip_nat_out, PF_INET, NF_IP_POST_ROUTING, NF_IP_PRI_NAT_SRC}; + +#ifdef CONFIG_IP_NF_NAT_LOCAL /* Before packet filtering, change destination */ static struct nf_hook_ops ip_nat_local_out_ops = { { NULL, NULL }, ip_nat_local_fn, PF_INET, NF_IP_LOCAL_OUT, NF_IP_PRI_NAT_DST }; - -#ifdef CONFIG_IP_NF_NAT_LOCAL +/* After packet filtering, change source for reply packets of LOCAL_OUT DNAT */ static struct nf_hook_ops ip_nat_local_in_ops = { { NULL, NULL }, ip_nat_fn, PF_INET, NF_IP_LOCAL_IN, NF_IP_PRI_NAT_SRC }; #endif @@ -301,12 +297,12 @@ printk("ip_nat_init: can't register out hook.\n"); goto cleanup_inops; } +#ifdef CONFIG_IP_NF_NAT_LOCAL ret = nf_register_hook(&ip_nat_local_out_ops); if (ret < 0) { printk("ip_nat_init: can't register local out hook.\n"); goto cleanup_outops; } -#ifdef CONFIG_IP_NF_NAT_LOCAL ret = nf_register_hook(&ip_nat_local_in_ops); if (ret < 0) { printk("ip_nat_init: can't register local in hook.\n"); @@ -323,9 +319,9 @@ #ifdef CONFIG_IP_NF_NAT_LOCAL nf_unregister_hook(&ip_nat_local_in_ops); cleanup_localoutops: -#endif nf_unregister_hook(&ip_nat_local_out_ops); cleanup_outops: +#endif nf_unregister_hook(&ip_nat_out_ops); cleanup_inops: nf_unregister_hook(&ip_nat_in_ops); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ip_nat_tftp.c linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_tftp.c --- linux-2.4.22/net/ipv4/netfilter/ip_nat_tftp.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ip_nat_tftp.c 2003-10-22 22:47:41.000000000 +0000 @@ -153,7 +153,7 @@ static int __init init(void) { - int i, ret; + int i, ret = 0; char *tmpname; if (!ports[0]) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ipt_LOG.c linux-2.4.23-pre8/net/ipv4/netfilter/ipt_LOG.c --- linux-2.4.22/net/ipv4/netfilter/ipt_LOG.c 2002-02-25 19:38:14.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ipt_LOG.c 2003-10-22 22:48:25.000000000 +0000 @@ -3,15 +3,14 @@ */ #include #include -#include #include +#include #include #include #include -#include - -struct in_device; #include + +#include #include #if 0 @@ -20,10 +19,20 @@ #define DEBUGP(format, args...) #endif +/* FIXME: move to ip.h like in 2.5 */ +struct ahhdr { + __u8 nexthdr; + __u8 hdrlen; + __u16 reserved; + __u32 spi; + __u32 seq_no; +}; + struct esphdr { __u32 spi; -}; /* FIXME evil kludge */ - + __u32 seq_no; +}; + /* Use lock to serialize, so printks don't overlap */ static spinlock_t log_lock = SPIN_LOCK_UNLOCKED; @@ -58,7 +67,8 @@ printk("FRAG:%u ", ntohs(iph->frag_off) & IP_OFFSET); if ((info->logflags & IPT_LOG_IPOPT) - && iph->ihl * 4 != sizeof(struct iphdr)) { + && iph->ihl * 4 != sizeof(struct iphdr) + && iph->ihl * 4 >= datalen) { unsigned int i; /* Max length: 127 "OPT (" 15*4*2chars ") " */ @@ -230,13 +240,30 @@ break; } /* Max Length */ - case IPPROTO_AH: + case IPPROTO_AH: { + struct ahhdr *ah = protoh; + + /* Max length: 9 "PROTO=AH " */ + printk("PROTO=AH "); + + if (ntohs(iph->frag_off) & IP_OFFSET) + break; + + /* Max length: 25 "INCOMPLETE [65535 bytes] " */ + if (datalen < sizeof (*ah)) { + printk("INCOMPLETE [%u bytes] ", datalen); + break; + } + + /* Length: 15 "SPI=0xF1234567 " */ + printk("SPI=0x%x ", ntohl(ah->spi) ); + break; + } case IPPROTO_ESP: { struct esphdr *esph = protoh; - int esp= (iph->protocol==IPPROTO_ESP); /* Max length: 10 "PROTO=ESP " */ - printk("PROTO=%s ",esp? "ESP" : "AH"); + printk("PROTO=ESP "); if (ntohs(iph->frag_off) & IP_OFFSET) break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ipt_MASQUERADE.c linux-2.4.23-pre8/net/ipv4/netfilter/ipt_MASQUERADE.c --- linux-2.4.22/net/ipv4/netfilter/ipt_MASQUERADE.c 2001-09-30 19:26:08.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ipt_MASQUERADE.c 2003-10-22 22:49:06.000000000 +0000 @@ -87,13 +87,21 @@ key.dst = (*pskb)->nh.iph->daddr; key.src = 0; /* Unknown: that's what we're trying to establish */ key.tos = RT_TOS((*pskb)->nh.iph->tos)|RTO_CONN; - key.oif = out->ifindex; + key.oif = 0; #ifdef CONFIG_IP_ROUTE_FWMARK key.fwmark = (*pskb)->nfmark; #endif if (ip_route_output_key(&rt, &key) != 0) { - /* Shouldn't happen */ - printk("MASQUERADE: No route: Rusty's brain broke!\n"); + /* Funky routing can do this. */ + if (net_ratelimit()) + printk("MASQUERADE:" + " No route: Rusty's brain broke!\n"); + return NF_DROP; + } + if (rt->u.dst.dev != out) { + if (net_ratelimit()) + printk("MASQUERADE:" + " Route sent us somewhere else.\n"); return NF_DROP; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ipt_REJECT.c linux-2.4.23-pre8/net/ipv4/netfilter/ipt_REJECT.c --- linux-2.4.22/net/ipv4/netfilter/ipt_REJECT.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ipt_REJECT.c 2003-10-22 22:48:19.000000000 +0000 @@ -34,16 +34,17 @@ attach(new_skb, nfct); } -static inline struct rtable *route_reverse(struct sk_buff *skb, int local) +static inline struct rtable *route_reverse(struct sk_buff *skb, int hook) { struct iphdr *iph = skb->nh.iph; struct dst_entry *odst; struct rt_key key = {}; struct rtable *rt; - if (local) { + if (hook != NF_IP_FORWARD) { key.dst = iph->saddr; - key.src = iph->daddr; + if (hook == NF_IP_LOCAL_IN) + key.src = iph->daddr; key.tos = RT_TOS(iph->tos); if (ip_route_output_key(&rt, &key) != 0) @@ -75,7 +76,7 @@ } /* Send RST reply */ -static void send_reset(struct sk_buff *oldskb, int local) +static void send_reset(struct sk_buff *oldskb, int hook) { struct sk_buff *nskb; struct tcphdr *otcph, *tcph; @@ -104,7 +105,7 @@ csum_partial((char *)otcph, otcplen, 0)) != 0) return; - if ((rt = route_reverse(oldskb, local)) == NULL) + if ((rt = route_reverse(oldskb, hook)) == NULL) return; hh_len = (rt->u.dst.dev->hard_header_len + 15)&~15; @@ -372,7 +373,7 @@ send_unreach(*pskb, ICMP_PKT_FILTERED); break; case IPT_TCP_RESET: - send_reset(*pskb, hooknum == NF_IP_LOCAL_IN); + send_reset(*pskb, hooknum); case IPT_ICMP_ECHOREPLY: /* Doesn't happen. */ break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ipt_ah.c linux-2.4.23-pre8/net/ipv4/netfilter/ipt_ah.c --- linux-2.4.22/net/ipv4/netfilter/ipt_ah.c 2002-11-28 23:53:15.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ipt_ah.c 2003-10-22 22:49:14.000000000 +0000 @@ -15,7 +15,11 @@ #endif struct ahhdr { + __u8 nexthdr; + __u8 hdrlen; + __u16 reserved; __u32 spi; + __u32 seq_no; }; /* Returns 1 if the spi is matched by the range, 0 otherwise */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ipt_esp.c linux-2.4.23-pre8/net/ipv4/netfilter/ipt_esp.c --- linux-2.4.22/net/ipv4/netfilter/ipt_esp.c 2002-02-25 19:38:14.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ipt_esp.c 2003-10-22 22:47:38.000000000 +0000 @@ -16,6 +16,7 @@ struct esphdr { __u32 spi; + __u32 seq_no; }; /* Returns 1 if the spi is matched by the range, 0 otherwise */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/netfilter/ipt_unclean.c linux-2.4.23-pre8/net/ipv4/netfilter/ipt_unclean.c --- linux-2.4.22/net/ipv4/netfilter/ipt_unclean.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/netfilter/ipt_unclean.c 2003-10-22 22:49:05.000000000 +0000 @@ -259,6 +259,24 @@ #define TH_ECE 0x40 #define TH_CWR 0x80 +/* table of valid flag combinations - ECE and CWR are always valid */ +static u8 tcp_valid_flags[(TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG) + 1] = +{ + [TH_SYN] = 1, + [TH_SYN|TH_ACK] = 1, + [TH_RST] = 1, + [TH_RST|TH_ACK] = 1, + [TH_RST|TH_ACK|TH_PUSH] = 1, + [TH_FIN|TH_ACK] = 1, + [TH_ACK] = 1, + [TH_ACK|TH_PUSH] = 1, + [TH_ACK|TH_URG] = 1, + [TH_ACK|TH_URG|TH_PUSH] = 1, + [TH_FIN|TH_ACK|TH_PUSH] = 1, + [TH_FIN|TH_ACK|TH_URG] = 1, + [TH_FIN|TH_ACK|TH_URG|TH_PUSH] = 1 +}; + /* TCP-specific checks. */ static int check_tcp(const struct iphdr *iph, @@ -330,19 +348,7 @@ /* CHECK: TCP flags. */ tcpflags = (((u_int8_t *)tcph)[13] & ~(TH_ECE|TH_CWR)); - if (tcpflags != TH_SYN - && tcpflags != (TH_SYN|TH_ACK) - && tcpflags != TH_RST - && tcpflags != (TH_RST|TH_ACK) - && tcpflags != (TH_RST|TH_ACK|TH_PUSH) - && tcpflags != (TH_FIN|TH_ACK) - && tcpflags != TH_ACK - && tcpflags != (TH_ACK|TH_PUSH) - && tcpflags != (TH_ACK|TH_URG) - && tcpflags != (TH_ACK|TH_URG|TH_PUSH) - && tcpflags != (TH_FIN|TH_ACK|TH_PUSH) - && tcpflags != (TH_FIN|TH_ACK|TH_URG) - && tcpflags != (TH_FIN|TH_ACK|TH_URG|TH_PUSH)) { + if (!tcp_valid_flags[tcpflags]) { limpk("TCP flags bad: %u\n", tcpflags); return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/route.c linux-2.4.23-pre8/net/ipv4/route.c --- linux-2.4.22/net/ipv4/route.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/route.c 2003-10-22 22:49:50.000000000 +0000 @@ -375,7 +375,9 @@ */ static inline u32 rt_score(struct rtable *rt) { - u32 score = rt->u.dst.__use; + u32 score = jiffies - rt->u.dst.lastuse; + + score = ~score & ~(3<<30); if (rt_valuable(rt)) score |= (1<<31); @@ -703,8 +705,7 @@ * The second limit is less certain. At the moment it allows * only 2 entries per bucket. We will see. */ - if (chain_length > ip_rt_gc_elasticity || - (chain_length > 1 && !(min_score & (1<<31)))) { + if (chain_length > ip_rt_gc_elasticity) { *candp = cand->u.rt_next; rt_free(cand); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/tcp_ipv4.c linux-2.4.23-pre8/net/ipv4/tcp_ipv4.c --- linux-2.4.22/net/ipv4/tcp_ipv4.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/tcp_ipv4.c 2003-10-22 22:48:25.000000000 +0000 @@ -189,7 +189,9 @@ if (sk != sk2 && sk2->reuse <= 1 && !ipv6_only_sock(sk2) && - sk->bound_dev_if == sk2->bound_dev_if) { + (!sk->bound_dev_if || + !sk2->bound_dev_if || + sk->bound_dev_if == sk2->bound_dev_if)) { if (!sk_reuse || !sk2->reuse || sk2->state == TCP_LISTEN) { diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/tcp_output.c linux-2.4.23-pre8/net/ipv4/tcp_output.c --- linux-2.4.22/net/ipv4/tcp_output.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/tcp_output.c 2003-10-22 22:49:11.000000000 +0000 @@ -275,7 +275,7 @@ TCP_INC_STATS(TcpOutSegs); - err = tp->af_specific->queue_xmit(skb); + err = tp->af_specific->queue_xmit(skb, 0); if (err <= 0) return err; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv4/udp.c linux-2.4.23-pre8/net/ipv4/udp.c --- linux-2.4.22/net/ipv4/udp.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv4/udp.c 2003-10-22 22:47:55.000000000 +0000 @@ -164,7 +164,9 @@ if (sk2->num == snum && sk2 != sk && !ipv6_only_sock(sk2) && - sk2->bound_dev_if == sk->bound_dev_if && + (!sk2->bound_dev_if || + !sk->bound_dev_if || + sk2->bound_dev_if == sk->bound_dev_if) && (!sk2->rcv_saddr || !sk->rcv_saddr || sk2->rcv_saddr == sk->rcv_saddr) && diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/Makefile linux-2.4.23-pre8/net/ipv6/Makefile --- linux-2.4.22/net/ipv6/Makefile 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/Makefile 2003-10-22 22:49:15.000000000 +0000 @@ -13,7 +13,9 @@ route.o ip6_fib.o ipv6_sockglue.o ndisc.o udp.o raw.o \ protocol.o icmp.o mcast.o reassembly.o tcp_ipv6.o \ exthdrs.o sysctl_net_ipv6.o datagram.o proc.o \ - ip6_flowlabel.o + ip6_flowlabel.o ipv6_syms.o + +export-objs := ipv6_syms.o obj-m := $(O_TARGET) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/addrconf.c linux-2.4.23-pre8/net/ipv6/addrconf.c --- linux-2.4.22/net/ipv6/addrconf.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/addrconf.c 2003-10-22 22:49:39.000000000 +0000 @@ -103,7 +103,7 @@ static int addrconf_ifdown(struct net_device *dev, int how); -static void addrconf_dad_start(struct inet6_ifaddr *ifp); +static void addrconf_dad_start(struct inet6_ifaddr *ifp, int flags); static void addrconf_dad_timer(unsigned long data); static void addrconf_dad_completed(struct inet6_ifaddr *ifp); static void addrconf_rs_timer(unsigned long data); @@ -898,7 +898,7 @@ rtmsg.rtmsg_dst_len = 8; rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF; rtmsg.rtmsg_ifindex = dev->ifindex; - rtmsg.rtmsg_flags = RTF_UP|RTF_ADDRCONF; + rtmsg.rtmsg_flags = RTF_UP; rtmsg.rtmsg_type = RTMSG_NEWROUTE; ip6_route_add(&rtmsg, NULL); } @@ -925,7 +925,7 @@ struct in6_addr addr; ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); - addrconf_prefix_route(&addr, 64, dev, 0, RTF_ADDRCONF); + addrconf_prefix_route(&addr, 64, dev, 0, 0); } static struct inet6_dev *addrconf_add_dev(struct net_device *dev) @@ -1017,7 +1017,7 @@ } } else if (pinfo->onlink && valid_lft) { addrconf_prefix_route(&pinfo->prefix, pinfo->prefix_len, - dev, rt_expires, RTF_ADDRCONF|RTF_EXPIRES); + dev, rt_expires, RTF_ADDRCONF|RTF_EXPIRES|RTF_PREFIX_RT); } if (rt) dst_release(&rt->u.dst); @@ -1063,7 +1063,7 @@ return; } - addrconf_dad_start(ifp); + addrconf_dad_start(ifp, RTF_ADDRCONF|RTF_PREFIX_RT); } if (ifp && valid_lft == 0) { @@ -1175,7 +1175,7 @@ ifp = ipv6_add_addr(idev, pfx, plen, scope, IFA_F_PERMANENT); if (!IS_ERR(ifp)) { - addrconf_dad_start(ifp); + addrconf_dad_start(ifp, 0); in6_ifa_put(ifp); return 0; } @@ -1350,7 +1350,7 @@ ifp = ipv6_add_addr(idev, addr, 64, IFA_LINK, IFA_F_PERMANENT); if (!IS_ERR(ifp)) { - addrconf_dad_start(ifp); + addrconf_dad_start(ifp, 0); in6_ifa_put(ifp); } } @@ -1588,8 +1588,7 @@ memset(&rtmsg, 0, sizeof(struct in6_rtmsg)); rtmsg.rtmsg_type = RTMSG_NEWROUTE; rtmsg.rtmsg_metric = IP6_RT_PRIO_ADDRCONF; - rtmsg.rtmsg_flags = (RTF_ALLONLINK | RTF_ADDRCONF | - RTF_DEFAULT | RTF_UP); + rtmsg.rtmsg_flags = (RTF_ALLONLINK | RTF_DEFAULT | RTF_UP); rtmsg.rtmsg_ifindex = ifp->idev->dev->ifindex; @@ -1603,7 +1602,7 @@ /* * Duplicate Address Detection */ -static void addrconf_dad_start(struct inet6_ifaddr *ifp) +static void addrconf_dad_start(struct inet6_ifaddr *ifp, int flags) { struct net_device *dev; unsigned long rand_num; @@ -1613,7 +1612,7 @@ addrconf_join_solict(dev, &ifp->addr); if (ifp->prefix_len != 128 && (ifp->flags&IFA_F_PERMANENT)) - addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev, 0, RTF_ADDRCONF); + addrconf_prefix_route(&ifp->addr, ifp->prefix_len, dev, 0, flags); net_srandom(ifp->addr.s6_addr32[3]); rand_num = net_random() % (ifp->idev->cnf.rtr_solicit_delay ? : 1); @@ -1895,6 +1894,7 @@ unsigned char *b = skb->tail; nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm)); + if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; ifm = NLMSG_DATA(nlh); ifm->ifa_family = AF_INET6; ifm->ifa_prefixlen = ifa->prefix_len; @@ -1981,11 +1981,112 @@ netlink_broadcast(rtnl, skb, 0, RTMGRP_IPV6_IFADDR, GFP_ATOMIC); } +static void inline ipv6_store_devconf(struct ipv6_devconf *cnf, + __s32 *array, int bytes) +{ + memset(array, 0, bytes); + array[DEVCONF_FORWARDING] = cnf->forwarding; + array[DEVCONF_HOPLIMIT] = cnf->hop_limit; + array[DEVCONF_MTU6] = cnf->mtu6; + array[DEVCONF_ACCEPT_RA] = cnf->accept_ra; + array[DEVCONF_ACCEPT_REDIRECTS] = cnf->accept_redirects; + array[DEVCONF_AUTOCONF] = cnf->autoconf; + array[DEVCONF_DAD_TRANSMITS] = cnf->dad_transmits; + array[DEVCONF_RTR_SOLICITS] = cnf->rtr_solicits; + array[DEVCONF_RTR_SOLICIT_INTERVAL] = cnf->rtr_solicit_interval; + array[DEVCONF_RTR_SOLICIT_DELAY] = cnf->rtr_solicit_delay; +#ifdef CONFIG_IPV6_PRIVACY + array[DEVCONF_USE_TEMPADDR] = cnf->use_tempaddr; + array[DEVCONF_TEMP_VALID_LFT] = cnf->temp_valid_lft; + array[DEVCONF_TEMP_PREFERED_LFT] = cnf->temp_prefered_lft; + array[DEVCONF_REGEN_MAX_RETRY] = cnf->regen_max_retry; + array[DEVCONF_MAX_DESYNC_FACTOR] = cnf->max_desync_factor; +#endif +} + +static int inet6_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, + struct inet6_dev *idev, + int type, u32 pid, u32 seq) +{ + __s32 *array = NULL; + struct ifinfomsg *r; + struct nlmsghdr *nlh; + unsigned char *b = skb->tail; + struct rtattr *subattr; + + nlh = NLMSG_PUT(skb, pid, seq, type, sizeof(*r)); + if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; + r = NLMSG_DATA(nlh); + r->ifi_family = AF_INET6; + r->ifi_type = dev->type; + r->ifi_index = dev->ifindex; + r->ifi_flags = dev->flags; + r->ifi_change = 0; + if (!netif_running(dev) || !netif_carrier_ok(dev)) + r->ifi_flags &= ~IFF_RUNNING; + else + r->ifi_flags |= IFF_RUNNING; + + RTA_PUT(skb, IFLA_IFNAME, strlen(dev->name)+1, dev->name); + + subattr = (struct rtattr*)skb->tail; + + RTA_PUT(skb, IFLA_PROTINFO, 0, NULL); + + /* return the device flags */ + RTA_PUT(skb, IFLA_INET6_FLAGS, sizeof(__u32), &idev->if_flags); + + /* return the device sysctl params */ + if ((array = kmalloc(DEVCONF_MAX * sizeof(*array), GFP_ATOMIC)) == NULL) + goto rtattr_failure; + ipv6_store_devconf(&idev->cnf, array, DEVCONF_MAX * sizeof(*array)); + RTA_PUT(skb, IFLA_INET6_CONF, DEVCONF_MAX * sizeof(*array), array); + + /* XXX - Statistics/MC not implemented */ + subattr->rta_len = skb->tail - (u8*)subattr; + + nlh->nlmsg_len = skb->tail - b; + kfree(array); + return skb->len; + +nlmsg_failure: +rtattr_failure: + if (array) + kfree(array); + skb_trim(skb, b - skb->data); + return -1; +} + +static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) +{ + int idx, err; + int s_idx = cb->args[0]; + struct net_device *dev; + struct inet6_dev *idev; + + read_lock(&dev_base_lock); + for (dev=dev_base, idx=0; dev; dev = dev->next, idx++) { + if (idx < s_idx) + continue; + if ((idev = in6_dev_get(dev)) == NULL) + continue; + err = inet6_fill_ifinfo(skb, dev, idev, RTM_NEWLINK, + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq); + in6_dev_put(idev); + if (err <= 0) + break; + } + read_unlock(&dev_base_lock); + cb->args[0] = idx; + + return skb->len; +} + static struct rtnetlink_link inet6_rtnetlink_table[RTM_MAX-RTM_BASE+1] = { { NULL, NULL, }, { NULL, NULL, }, - { NULL, NULL, }, + { NULL, inet6_dump_ifinfo, }, { NULL, NULL, }, { inet6_rtm_newaddr, NULL, }, diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/af_inet6.c linux-2.4.23-pre8/net/ipv6/af_inet6.c --- linux-2.4.22/net/ipv6/af_inet6.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/af_inet6.c 2003-10-22 22:49:01.000000000 +0000 @@ -233,7 +233,7 @@ /* bind for INET6 API */ -static int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) +int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) { struct sockaddr_in6 *addr=(struct sockaddr_in6 *)uaddr; struct sock *sk = sock->sk; @@ -329,7 +329,7 @@ return 0; } -static int inet6_release(struct socket *sock) +int inet6_release(struct socket *sock) { struct sock *sk = sock->sk; @@ -376,7 +376,7 @@ * This does both peername and sockname. */ -static int inet6_getname(struct socket *sock, struct sockaddr *uaddr, +int inet6_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_len, int peer) { struct sockaddr_in6 *sin=(struct sockaddr_in6 *)uaddr; @@ -413,7 +413,7 @@ return(0); } -static int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) +int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) { struct sock *sk = sock->sk; int err = -EINVAL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/icmp.c linux-2.4.23-pre8/net/ipv6/icmp.c --- linux-2.4.22/net/ipv6/icmp.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/icmp.c 2003-10-22 22:48:21.000000000 +0000 @@ -97,11 +97,18 @@ }; -static void icmpv6_xmit_lock(void) +static int icmpv6_xmit_lock(void) { local_bh_disable(); - if (unlikely(!spin_trylock(&icmpv6_socket->sk->lock.slock))) - BUG(); + if (unlikely(!spin_trylock(&icmpv6_socket->sk->lock.slock))) { + /* This can happen if the output path (f.e. SIT or + * ip6ip6 tunnel) signals dst_link_failure() for an + * outgoing ICMP6 packet. + */ + local_bh_enable(); + return 1; + } + return 0; } static void icmpv6_xmit_unlock(void) @@ -325,7 +332,8 @@ fl.uli_u.icmpt.type = type; fl.uli_u.icmpt.code = code; - icmpv6_xmit_lock(); + if (icmpv6_xmit_lock()) + return; if (!icmpv6_xrlim_allow(sk, type, &fl)) goto out; @@ -399,7 +407,8 @@ fl.uli_u.icmpt.type = ICMPV6_ECHO_REPLY; fl.uli_u.icmpt.code = 0; - icmpv6_xmit_lock(); + if (icmpv6_xmit_lock()) + return; ip6_build_xmit(sk, icmpv6_getfrag, &msg, &fl, msg.len, NULL, -1, MSG_DONTWAIT); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/ipv6_syms.c linux-2.4.23-pre8/net/ipv6/ipv6_syms.c --- linux-2.4.22/net/ipv6/ipv6_syms.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/ipv6_syms.c 2003-10-22 22:48:38.000000000 +0000 @@ -0,0 +1,35 @@ + +#include +#include +#include +#include +#include +#include +#include + +EXPORT_SYMBOL(ipv6_addr_type); +EXPORT_SYMBOL(icmpv6_send); +EXPORT_SYMBOL(icmpv6_statistics); +EXPORT_SYMBOL(icmpv6_err_convert); +EXPORT_SYMBOL(ndisc_mc_map); +EXPORT_SYMBOL(register_inet6addr_notifier); +EXPORT_SYMBOL(unregister_inet6addr_notifier); +EXPORT_SYMBOL(ip6_route_output); +#ifdef CONFIG_NETFILTER +EXPORT_SYMBOL(ip6_route_me_harder); +#endif +EXPORT_SYMBOL(addrconf_lock); +EXPORT_SYMBOL(ipv6_setsockopt); +EXPORT_SYMBOL(ipv6_getsockopt); +EXPORT_SYMBOL(inet6_register_protosw); +EXPORT_SYMBOL(inet6_unregister_protosw); +EXPORT_SYMBOL(inet6_add_protocol); +EXPORT_SYMBOL(inet6_del_protocol); +EXPORT_SYMBOL(ip6_xmit); +EXPORT_SYMBOL(inet6_release); +EXPORT_SYMBOL(inet6_bind); +EXPORT_SYMBOL(inet6_getname); +EXPORT_SYMBOL(inet6_ioctl); +EXPORT_SYMBOL(ipv6_get_saddr); +EXPORT_SYMBOL(ipv6_chk_addr); +EXPORT_SYMBOL(in6_dev_finish_destroy); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/mcast.c linux-2.4.23-pre8/net/ipv6/mcast.c --- linux-2.4.22/net/ipv6/mcast.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/mcast.c 2003-10-22 22:49:22.000000000 +0000 @@ -2020,6 +2020,9 @@ struct ifmcaddr6 *i; struct in6_addr maddr; + /* Deactivate timers */ + ipv6_mc_down(idev); + /* Delete all-nodes address. */ ipv6_addr_all_nodes(&maddr); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/ndisc.c linux-2.4.23-pre8/net/ipv6/ndisc.c --- linux-2.4.22/net/ipv6/ndisc.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/ndisc.c 2003-10-22 22:49:04.000000000 +0000 @@ -944,6 +944,17 @@ in6_dev->if_flags |= IF_RA_RCVD; } + /* + * Remember the managed/otherconf flags from most recently + * received RA message (RFC 2462) -- yoshfuji + */ + in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED | + IF_RA_OTHERCONF)) | + (ra_msg->icmph.icmp6_addrconf_managed ? + IF_RA_MANAGED : 0) | + (ra_msg->icmph.icmp6_addrconf_other ? + IF_RA_OTHERCONF : 0); + lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); rt = rt6_get_dflt_router(&skb->nh.ipv6h->saddr, skb->dev); @@ -1336,6 +1347,26 @@ return 0; } +static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) +{ + struct net_device *dev = ptr; + + switch (event) { + case NETDEV_CHANGEADDR: + neigh_changeaddr(&nd_tbl, dev); + fib6_run_gc(0); + break; + default: + break; + } + + return NOTIFY_DONE; +} + +struct notifier_block ndisc_netdev_notifier = { + .notifier_call = ndisc_netdev_event, +}; + int __init ndisc_init(struct net_proto_family *ops) { struct sock *sk; @@ -1377,6 +1408,7 @@ neigh_sysctl_register(NULL, &nd_tbl.parms, NET_IPV6, NET_IPV6_NEIGH, "ipv6"); #endif + register_netdevice_notifier(&ndisc_netdev_notifier); return 0; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/netfilter/ip6t_ipv6header.c linux-2.4.23-pre8/net/ipv6/netfilter/ip6t_ipv6header.c --- linux-2.4.22/net/ipv6/netfilter/ip6t_ipv6header.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/netfilter/ip6t_ipv6header.c 2003-10-22 22:47:30.000000000 +0000 @@ -129,20 +129,13 @@ return 1; } -static void -ipv6header_destroy(void *matchinfo, - unsigned int matchinfosize) -{ - return; -} - static struct ip6t_match ip6t_ipv6header_match = { { NULL, NULL }, "ipv6header", &ipv6header_match, &ipv6header_checkentry, - &ipv6header_destroy, + NULL, THIS_MODULE }; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/raw.c linux-2.4.23-pre8/net/ipv6/raw.c --- linux-2.4.22/net/ipv6/raw.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/raw.c 2003-10-22 22:48:35.000000000 +0000 @@ -771,6 +771,7 @@ val = -1; else val = opt->offset; + break; default: return -ENOPROTOOPT; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/route.c linux-2.4.23-pre8/net/ipv6/route.c --- linux-2.4.22/net/ipv6/route.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/route.c 2003-10-22 22:48:01.000000000 +0000 @@ -1580,13 +1580,19 @@ struct in6_addr *src, int iif, int type, u32 pid, u32 seq, - struct nlmsghdr *in_nlh) + struct nlmsghdr *in_nlh, int prefix) { struct rtmsg *rtm; struct nlmsghdr *nlh; unsigned char *b = skb->tail; struct rta_cacheinfo ci; + if (prefix) { /* user wants prefix routes only */ + if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { + /* success since this is not a prefix route */ + return 1; + } + } if (!pid && in_nlh) { pid = in_nlh->nlmsg_pid; } @@ -1667,10 +1673,17 @@ static int rt6_dump_route(struct rt6_info *rt, void *p_arg) { struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg; + struct rtmsg *rtm; + int prefix; + + rtm = NLMSG_DATA(arg->cb->nlh); + if (rtm) + prefix = (rtm->rtm_flags & RTM_F_PREFIX) != 0; + else prefix = 0; return rt6_fill_node(arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq, - NULL); + NULL, prefix); } static int fib6_dump_node(struct fib6_walker_t *w) @@ -1821,7 +1834,7 @@ fl.nl_u.ip6_u.saddr, iif, RTM_NEWROUTE, NETLINK_CB(in_skb).pid, - nlh->nlmsg_seq, nlh); + nlh->nlmsg_seq, nlh, 0); if (err < 0) { err = -EMSGSIZE; goto out_free; @@ -1847,7 +1860,7 @@ netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, ENOBUFS); return; } - if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0, nlh) < 0) { + if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0, nlh, 0) < 0) { kfree_skb(skb); netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, EINVAL); return; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/sit.c linux-2.4.23-pre8/net/ipv6/sit.c --- linux-2.4.22/net/ipv6/sit.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/sit.c 2003-10-22 22:49:39.000000000 +0000 @@ -552,8 +552,6 @@ tunnel->err_count = 0; } - skb->h.raw = skb->nh.raw; - /* * Okay, now see if we can stuff it in the buffer as-is. */ @@ -575,6 +573,7 @@ iph6 = skb->nh.ipv6h; } + skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); dst_release(skb->dst); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/tcp_ipv6.c linux-2.4.23-pre8/net/ipv6/tcp_ipv6.c --- linux-2.4.22/net/ipv6/tcp_ipv6.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/tcp_ipv6.c 2003-10-22 22:49:01.000000000 +0000 @@ -59,7 +59,7 @@ struct sk_buff *skb); static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb); -static int tcp_v6_xmit(struct sk_buff *skb); +static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok); static struct tcp_func ipv6_mapped; static struct tcp_func ipv6_specific; @@ -146,7 +146,9 @@ /* We must walk the whole port owner list in this case. -DaveM */ for( ; sk2 != NULL; sk2 = sk2->bind_next) { if (sk != sk2 && - sk->bound_dev_if == sk2->bound_dev_if) { + (!sk->bound_dev_if || + !sk2->bound_dev_if || + sk->bound_dev_if == sk2->bound_dev_if)) { if (!sk_reuse || !sk2->reuse || sk2->state == TCP_LISTEN) { @@ -1715,7 +1717,7 @@ return 0; } -static int tcp_v6_xmit(struct sk_buff *skb) +static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok) { struct sock *sk = skb->sk; struct ipv6_pinfo * np = &sk->net_pinfo.af_inet6; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/ipv6/udp.c linux-2.4.23-pre8/net/ipv6/udp.c --- linux-2.4.22/net/ipv6/udp.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/ipv6/udp.c 2003-10-22 22:48:17.000000000 +0000 @@ -108,7 +108,9 @@ sk2 = sk2->next) { if (sk2->num == snum && sk2 != sk && - sk2->bound_dev_if == sk->bound_dev_if && + (!sk2->bound_dev_if || + !sk->bound_dev_if || + sk2->bound_dev_if == sk->bound_dev_if) && ((!sk2->rcv_saddr && !ipv6_only_sock(sk)) || (sk2->family == AF_INET6 && ipv6_addr_any(&sk2->net_pinfo.af_inet6.rcv_saddr) && diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/af_irda.c linux-2.4.23-pre8/net/irda/af_irda.c --- linux-2.4.22/net/irda/af_irda.c 2002-11-28 23:53:16.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/af_irda.c 2003-10-22 22:48:24.000000000 +0000 @@ -98,7 +98,7 @@ struct sock *sk; int err; - IRDA_DEBUG(3, __FUNCTION__ "()\n"); + IRDA_DEBUG(3, "%s()\n", __FUNCTION__); self = (struct irda_sock *) instance; ASSERT(self != NULL, return -1;); @@ -108,7 +108,7 @@ err = sock_queue_rcv_skb(sk, skb); if (err) { - IRDA_DEBUG(1, __FUNCTION__ "(), error: no more mem!\n"); + IRDA_DEBUG(1, "%s(), error: no more mem!\n", __FUNCTION__); self->rx_flow = FLOW_STOP; /* When we return error, TTP will need to requeue the skb */ @@ -132,7 +132,7 @@ self = (struct irda_sock *) instance; - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); /* Don't care about it, but let's not leak it */ if(skb) @@ -194,7 +194,7 @@ self = (struct irda_sock *) instance; - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); sk = self->sk; if (sk == NULL) @@ -210,14 +210,14 @@ switch (sk->type) { case SOCK_STREAM: if (max_sdu_size != 0) { - ERROR(__FUNCTION__ "(), max_sdu_size must be 0\n"); + ERROR("%s(), max_sdu_size must be 0\n", __FUNCTION__); return; } self->max_data_size = irttp_get_max_seg_size(self->tsap); break; case SOCK_SEQPACKET: if (max_sdu_size == 0) { - ERROR(__FUNCTION__ "(), max_sdu_size cannot be 0\n"); + ERROR("%s(), max_sdu_size cannot be 0\n", __FUNCTION__); return; } self->max_data_size = max_sdu_size; @@ -226,7 +226,7 @@ self->max_data_size = irttp_get_max_seg_size(self->tsap); }; - IRDA_DEBUG(2, __FUNCTION__ "(), max_data_size=%d\n", + IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __FUNCTION__, self->max_data_size); memcpy(&self->qos_tx, qos, sizeof(struct qos_info)); @@ -253,7 +253,7 @@ self = (struct irda_sock *) instance; - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); sk = self->sk; if (sk == NULL) @@ -269,14 +269,14 @@ switch (sk->type) { case SOCK_STREAM: if (max_sdu_size != 0) { - ERROR(__FUNCTION__ "(), max_sdu_size must be 0\n"); + ERROR("%s(), max_sdu_size must be 0\n", __FUNCTION__); return; } self->max_data_size = irttp_get_max_seg_size(self->tsap); break; case SOCK_SEQPACKET: if (max_sdu_size == 0) { - ERROR(__FUNCTION__ "(), max_sdu_size cannot be 0\n"); + ERROR("%s(), max_sdu_size cannot be 0\n", __FUNCTION__); return; } self->max_data_size = max_sdu_size; @@ -285,7 +285,7 @@ self->max_data_size = irttp_get_max_seg_size(self->tsap); }; - IRDA_DEBUG(2, __FUNCTION__ "(), max_data_size=%d\n", + IRDA_DEBUG(2, "%s(), max_data_size=%d\n", __FUNCTION__ self->max_data_size); memcpy(&self->qos_tx, qos, sizeof(struct qos_info)); @@ -304,13 +304,13 @@ { struct sk_buff *skb; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); skb = dev_alloc_skb(64); if (skb == NULL) { - IRDA_DEBUG(0, __FUNCTION__ "() Unable to allocate sk_buff!\n"); + IRDA_DEBUG(0, "%s() Unable to allocate sk_buff!\n", __FUNCTION__); return; } @@ -331,7 +331,7 @@ struct irda_sock *self; struct sock *sk; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self = (struct irda_sock *) instance; ASSERT(self != NULL, return;); @@ -341,17 +341,16 @@ switch (flow) { case FLOW_STOP: - IRDA_DEBUG(1, __FUNCTION__ "(), IrTTP wants us to slow down\n"); + IRDA_DEBUG(1, "%s(), IrTTP wants us to slow down\n", __FUNCTION__); self->tx_flow = flow; break; case FLOW_START: self->tx_flow = flow; - IRDA_DEBUG(1, __FUNCTION__ - "(), IrTTP wants us to start again\n"); + IRDA_DEBUG(1, "%s(), IrTTP wants us to start again\n", __FUNCTION__); wake_up_interruptible(sk->sleep); break; default: - IRDA_DEBUG( 0, __FUNCTION__ "(), Unknown flow command!\n"); + IRDA_DEBUG( 0, "%s(), Unknown flow command!\n", __FUNCTION__); /* Unknown flow command, better stop */ self->tx_flow = flow; break; @@ -373,11 +372,11 @@ self = (struct irda_sock *) priv; if (!self) { - WARNING(__FUNCTION__ "(), lost myself!\n"); + WARNING("%s(), lost myself!\n", __FUNCTION__); return; } - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); /* We probably don't need to make any more queries */ iriap_close(self->iriap); @@ -385,7 +384,7 @@ /* Check if request succeeded */ if (result != IAS_SUCCESS) { - IRDA_DEBUG(1, __FUNCTION__ "(), IAS query failed! (%d)\n", + IRDA_DEBUG(1, "%s(), IAS query failed! (%d)\n", __FUNCTION__ result); self->errno = result; /* We really need it later */ @@ -419,11 +418,11 @@ { struct irda_sock *self; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self = (struct irda_sock *) priv; if (!self) { - WARNING(__FUNCTION__ "(), lost myself!\n"); + WARNING("%s(), lost myself!\n", __FUNCTION__); return; } @@ -456,7 +455,7 @@ { struct irda_sock *self; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self = (struct irda_sock *) priv; ASSERT(self != NULL, return;); @@ -481,7 +480,7 @@ notify_t notify; if (self->tsap) { - WARNING(__FUNCTION__ "(), busy!\n"); + WARNING("%s(), busy!\n", __FUNCTION__); return -EBUSY; } @@ -499,7 +498,7 @@ self->tsap = irttp_open_tsap(tsap_sel, DEFAULT_INITIAL_CREDIT, ¬ify); if (self->tsap == NULL) { - IRDA_DEBUG( 0, __FUNCTION__ "(), Unable to allocate TSAP!\n"); + IRDA_DEBUG( 0, "%s(), Unable to allocate TSAP!\n", __FUNCTION__); return -ENOMEM; } /* Remember which TSAP selector we actually got */ @@ -520,7 +519,7 @@ notify_t notify; if (self->lsap) { - WARNING(__FUNCTION__ "(), busy!\n"); + WARNING("%s(), busy!\n", __FUNCTION__); return -EBUSY; } @@ -532,7 +531,7 @@ self->lsap = irlmp_open_lsap(LSAP_CONNLESS, ¬ify, pid); if (self->lsap == NULL) { - IRDA_DEBUG( 0, __FUNCTION__ "(), Unable to allocate LSAP!\n"); + IRDA_DEBUG( 0, "%s(), Unable to allocate LSAP!\n", __FUNCTION__); return -ENOMEM; } @@ -553,12 +552,12 @@ */ static int irda_find_lsap_sel(struct irda_sock *self, char *name) { - IRDA_DEBUG(2, __FUNCTION__ "(%p, %s)\n", self, name); + IRDA_DEBUG(2, "%s(%p, %s)\n", __FUNCTION__, self, name); ASSERT(self != NULL, return -1;); if (self->iriap) { - WARNING(__FUNCTION__ "(), busy with a previous query\n"); + WARNING("%s(), busy with a previous query\n", __FUNCTION__); return -EBUSY; } @@ -591,7 +590,7 @@ /* Get the remote TSAP selector */ switch (self->ias_result->type) { case IAS_INTEGER: - IRDA_DEBUG(4, __FUNCTION__ "() int=%d\n", + IRDA_DEBUG(4, "%s() int=%d\n", __FUNCTION__, self->ias_result->t.integer); if (self->ias_result->t.integer != -1) @@ -601,7 +600,7 @@ break; default: self->dtsap_sel = 0; - IRDA_DEBUG(0, __FUNCTION__ "(), bad type!\n"); + IRDA_DEBUG(0, "%s(), bad type!\n", __FUNCTION__); break; } if (self->ias_result) @@ -639,7 +638,7 @@ __u32 daddr = DEV_ADDR_ANY; /* Address we found the service on */ __u8 dtsap_sel = 0x0; /* TSAP associated with it */ - IRDA_DEBUG(2, __FUNCTION__ "(), name=%s\n", name); + IRDA_DEBUG(2, "%s(), name=%s\n", __FUNCTION__, name); ASSERT(self != NULL, return -1;); @@ -661,7 +660,7 @@ /* Try the address in the log */ self->daddr = discoveries[i].daddr; self->saddr = 0x0; - IRDA_DEBUG(1, __FUNCTION__ "(), trying daddr = %08x\n", + IRDA_DEBUG(1, "%s(), trying daddr = %08x\n", __FUNCTION__, self->daddr); /* Query remote LM-IAS for this service */ @@ -670,9 +669,8 @@ case 0: /* We found the requested service */ if(daddr != DEV_ADDR_ANY) { - IRDA_DEBUG(1, __FUNCTION__ - "(), discovered service ''%s'' in two different devices !!!\n", - name); + IRDA_DEBUG(1, "%s(), discovered service ''%s'' in two different devices !!!\n", + __FUNCTION__, name); self->daddr = DEV_ADDR_ANY; kfree(discoveries); return(-ENOTUNIQ); @@ -686,8 +684,7 @@ break; default: /* Something bad did happen :-( */ - IRDA_DEBUG(0, __FUNCTION__ - "(), unexpected IAS query failure\n"); + IRDA_DEBUG(0, "%s(), unexpected IAS query failure\n", __FUNCTION__); self->daddr = DEV_ADDR_ANY; kfree(discoveries); return(-EHOSTUNREACH); @@ -699,9 +696,8 @@ /* Check out what we found */ if(daddr == DEV_ADDR_ANY) { - IRDA_DEBUG(1, __FUNCTION__ - "(), cannot discover service ''%s'' in any device !!!\n", - name); + IRDA_DEBUG(1, "%s(), cannot discover service ''%s'' in any device !!!\n", + __FUNCTION__, name); self->daddr = DEV_ADDR_ANY; return(-EADDRNOTAVAIL); } @@ -711,9 +707,8 @@ self->saddr = 0x0; self->dtsap_sel = dtsap_sel; - IRDA_DEBUG(1, __FUNCTION__ - "(), discovered requested service ''%s'' at address %08x\n", - name, self->daddr); + IRDA_DEBUG(1, "%s(), discovered requested service ''%s'' at address %08x\n", + __FUNCTION__, name, self->daddr); return 0; } @@ -744,8 +739,8 @@ saddr.sir_addr = self->saddr; } - IRDA_DEBUG(1, __FUNCTION__ "(), tsap_sel = %#x\n", saddr.sir_lsap_sel); - IRDA_DEBUG(1, __FUNCTION__ "(), addr = %08x\n", saddr.sir_addr); + IRDA_DEBUG(1, "%s(), tsap_sel = %#x\n", __FUNCTION__, saddr.sir_lsap_sel); + IRDA_DEBUG(1, "%s(), addr = %08x\n", __FUNCTION__, saddr.sir_addr); /* uaddr_len come to us uninitialised */ *uaddr_len = sizeof (struct sockaddr_irda); @@ -764,7 +759,7 @@ { struct sock *sk = sock->sk; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if ((sk->type != SOCK_STREAM) && (sk->type != SOCK_SEQPACKET) && (sk->type != SOCK_DGRAM)) @@ -796,7 +791,7 @@ self = sk->protinfo.irda; ASSERT(self != NULL, return -1;); - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); if (addr_len != sizeof(struct sockaddr_irda)) return -EINVAL; @@ -806,8 +801,7 @@ if ((sk->type == SOCK_DGRAM) && (sk->protocol == IRDAPROTO_ULTRA)) { self->pid = addr->sir_lsap_sel; if (self->pid & 0x80) { - IRDA_DEBUG(0, __FUNCTION__ - "(), extension in PID not supp!\n"); + IRDA_DEBUG(0, "%s(), extension in PID not supp!\n", __FUNCTION__); return -EOPNOTSUPP; } err = irda_open_lsap(self, self->pid); @@ -852,7 +846,7 @@ struct sk_buff *skb; int err; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self = sk->protinfo.irda; ASSERT(self != NULL, return -1;); @@ -898,7 +892,7 @@ /* Now attach up the new socket */ new->tsap = irttp_dup(self->tsap, new); if (!new->tsap) { - IRDA_DEBUG(0, __FUNCTION__ "(), dup failed!\n"); + IRDA_DEBUG(0, "%s(), dup failed!\n", __FUNCTION__); return -1; } @@ -959,7 +953,7 @@ self = sk->protinfo.irda; - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); /* Don't allow connect for Ultra sockets */ if ((sk->type == SOCK_DGRAM) && (sk->protocol == IRDAPROTO_ULTRA)) @@ -989,19 +983,18 @@ /* Try to find one suitable */ err = irda_discover_daddr_and_lsap_sel(self, addr->sir_name); if (err) { - IRDA_DEBUG(0, __FUNCTION__ - "(), auto-connect failed!\n"); + IRDA_DEBUG(0, "%s(), auto-connect failed!\n", __FUNCTION__); return err; } } else { /* Use the one provided by the user */ self->daddr = addr->sir_addr; - IRDA_DEBUG(1, __FUNCTION__ "(), daddr = %08x\n", self->daddr); + IRDA_DEBUG(1, "%s(), daddr = %08x\n", __FUNCTION__, self->daddr); /* Query remote LM-IAS */ err = irda_find_lsap_sel(self, addr->sir_name); if (err) { - IRDA_DEBUG(0, __FUNCTION__ "(), connect failed!\n"); + IRDA_DEBUG(0, "%s(), connect failed!\n", __FUNCTION__); return err; } } @@ -1019,7 +1012,7 @@ self->saddr, self->daddr, NULL, self->max_sdu_size_rx, NULL); if (err) { - IRDA_DEBUG(0, __FUNCTION__ "(), connect failed!\n"); + IRDA_DEBUG(0, "%s(), connect failed!\n", __FUNCTION__); return err; } @@ -1064,7 +1057,7 @@ struct sock *sk; struct irda_sock *self; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Check for valid socket type */ switch (sock->type) { @@ -1088,7 +1081,7 @@ } memset(self, 0, sizeof(struct irda_sock)); - IRDA_DEBUG(2, __FUNCTION__ "() : self is %p\n", self); + IRDA_DEBUG(2, "%s() : self is %p\n", __FUNCTION__, self); init_waitqueue_head(&self->query_wait); @@ -1122,7 +1115,7 @@ self->max_sdu_size_rx = TTP_SAR_UNBOUND; break; default: - ERROR(__FUNCTION__ "(), protocol not supported!\n"); + ERROR("%s(), protocol not supported!\n", __FUNCTION__); return -ESOCKTNOSUPPORT; } break; @@ -1151,7 +1144,7 @@ */ void irda_destroy_socket(struct irda_sock *self) { - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); ASSERT(self != NULL, return;); @@ -1197,7 +1190,7 @@ { struct sock *sk = sock->sk; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if (sk == NULL) return 0; @@ -1266,7 +1259,7 @@ unsigned char *asmptr; int err; - IRDA_DEBUG(4, __FUNCTION__ "(), len=%d\n", len); + IRDA_DEBUG(4, "%s(), len=%d\n", __FUNCTION__, len); /* Note : socket.c set MSG_EOR on SEQPACKET sockets */ if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_EOR)) @@ -1285,7 +1278,7 @@ /* Check if IrTTP is wants us to slow down */ while (self->tx_flow == FLOW_STOP) { - IRDA_DEBUG(2, __FUNCTION__ "(), IrTTP is busy, going to sleep!\n"); + IRDA_DEBUG(2, "%s(), IrTTP is busy, going to sleep!\n", __FUNCTION__); interruptible_sleep_on(sk->sleep); /* Check if we are still connected */ @@ -1298,8 +1291,7 @@ /* Check that we don't send out to big frames */ if (len > self->max_data_size) { - IRDA_DEBUG(2, __FUNCTION__ - "(), Chopping frame from %d to %d bytes!\n", len, + IRDA_DEBUG(2, "%s(), Chopping frame from %d to %d bytes!\n", __FUNCTION__, len, self->max_data_size); len = self->max_data_size; } @@ -1320,7 +1312,7 @@ */ err = irttp_data_request(self->tsap, skb); if (err) { - IRDA_DEBUG(0, __FUNCTION__ "(), err=%d\n", err); + IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err); return err; } /* Tell client how much data we actually sent */ @@ -1341,7 +1333,7 @@ struct sk_buff *skb; int copied, err; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); self = sk->protinfo.irda; ASSERT(self != NULL, return -1;); @@ -1355,8 +1347,7 @@ copied = skb->len; if (copied > size) { - IRDA_DEBUG(2, __FUNCTION__ - "(), Received truncated frame (%d < %d)!\n", + IRDA_DEBUG(2, "%s(), Received truncated frame (%d < %d)!\n", __FUNCTION__, copied, size); copied = size; msg->msg_flags |= MSG_TRUNC; @@ -1373,7 +1364,7 @@ */ if (self->rx_flow == FLOW_STOP) { if ((atomic_read(&sk->rmem_alloc) << 2) <= sk->rcvbuf) { - IRDA_DEBUG(2, __FUNCTION__ "(), Starting IrTTP\n"); + IRDA_DEBUG(2, "%s(), Starting IrTTP\n", __FUNCTION__); self->rx_flow = FLOW_START; irttp_flow_request(self->tsap, FLOW_START); } @@ -1412,7 +1403,7 @@ int copied = 0; int target = 1; - IRDA_DEBUG(3, __FUNCTION__ "()\n"); + IRDA_DEBUG(3, "%s()\n", __FUNCTION__); self = sk->protinfo.irda; ASSERT(self != NULL, return -1;); @@ -1472,14 +1463,14 @@ /* put the skb back if we didn't use it up.. */ if (skb->len) { - IRDA_DEBUG(1, __FUNCTION__ "(), back on q!\n"); + IRDA_DEBUG(1, "%s(), back on q!\n", __FUNCTION__); skb_queue_head(&sk->receive_queue, skb); break; } kfree_skb(skb); } else { - IRDA_DEBUG(0, __FUNCTION__ "() questionable!?\n"); + IRDA_DEBUG(0, "%s() questionable!?\n", __FUNCTION__); /* put message back and return */ skb_queue_head(&sk->receive_queue, skb); @@ -1495,7 +1486,7 @@ */ if (self->rx_flow == FLOW_STOP) { if ((atomic_read(&sk->rmem_alloc) << 2) <= sk->rcvbuf) { - IRDA_DEBUG(2, __FUNCTION__ "(), Starting IrTTP\n"); + IRDA_DEBUG(2, "%s(), Starting IrTTP\n", __FUNCTION__); self->rx_flow = FLOW_START; irttp_flow_request(self->tsap, FLOW_START); } @@ -1520,7 +1511,7 @@ unsigned char *asmptr; int err; - IRDA_DEBUG(4, __FUNCTION__ "(), len=%d\n", len); + IRDA_DEBUG(4, "%s(), len=%d\n", __FUNCTION__, len); if (msg->msg_flags & ~MSG_DONTWAIT) return -EINVAL; @@ -1541,8 +1532,8 @@ * service, so we have no fragmentation and no coalescence */ if (len > self->max_data_size) { - IRDA_DEBUG(0, __FUNCTION__ "(), Warning to much data! " - "Chopping frame from %d to %d bytes!\n", len, + IRDA_DEBUG(0, "%s(), Warning to much data! " + "Chopping frame from %d to %d bytes!\n", __FUNCTION__, len, self->max_data_size); len = self->max_data_size; } @@ -1554,7 +1545,7 @@ skb_reserve(skb, self->max_header_size); - IRDA_DEBUG(4, __FUNCTION__ "(), appending user data\n"); + IRDA_DEBUG(4, "%s(), appending user data\n", __FUNCTION__); asmptr = skb->h.raw = skb_put(skb, len); memcpy_fromiovec(asmptr, msg->msg_iov, len); @@ -1564,7 +1555,7 @@ */ err = irttp_udata_request(self->tsap, skb); if (err) { - IRDA_DEBUG(0, __FUNCTION__ "(), err=%d\n", err); + IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err); return err; } return len; @@ -1586,7 +1577,7 @@ unsigned char *asmptr; int err; - IRDA_DEBUG(4, __FUNCTION__ "(), len=%d\n", len); + IRDA_DEBUG(4, "%s(), len=%d\n", __FUNCTION__, len); if (msg->msg_flags & ~MSG_DONTWAIT) return -EINVAL; @@ -1604,8 +1595,8 @@ * service, so we have no fragmentation and no coalescence */ if (len > self->max_data_size) { - IRDA_DEBUG(0, __FUNCTION__ "(), Warning to much data! " - "Chopping frame from %d to %d bytes!\n", len, + IRDA_DEBUG(0, "%s(), Warning to much data! " + "Chopping frame from %d to %d bytes!\n", __FUNCTION__, len, self->max_data_size); len = self->max_data_size; } @@ -1617,13 +1608,13 @@ skb_reserve(skb, self->max_header_size); - IRDA_DEBUG(4, __FUNCTION__ "(), appending user data\n"); + IRDA_DEBUG(4, "%s(), appending user data\n", __FUNCTION__); asmptr = skb->h.raw = skb_put(skb, len); memcpy_fromiovec(asmptr, msg->msg_iov, len); err = irlmp_connless_data_request(self->lsap, skb); if (err) { - IRDA_DEBUG(0, __FUNCTION__ "(), err=%d\n", err); + IRDA_DEBUG(0, "%s(), err=%d\n", __FUNCTION__, err); return err; } return len; @@ -1644,7 +1635,7 @@ self = sk->protinfo.irda; ASSERT(self != NULL, return -1;); - IRDA_DEBUG(1, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(1, "%s(%p)\n", __FUNCTION__, self); sk->state = TCP_CLOSE; sk->shutdown |= SEND_SHUTDOWN; @@ -1682,7 +1673,7 @@ unsigned int mask; struct irda_sock *self; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); self = sk->protinfo.irda; poll_wait(file, sk->sleep, wait); @@ -1692,7 +1683,7 @@ if (sk->err) mask |= POLLERR; if (sk->shutdown & RCV_SHUTDOWN) { - IRDA_DEBUG(0, __FUNCTION__ "(), POLLHUP\n"); + IRDA_DEBUG(0, "%s(), POLLHUP\n", __FUNCTION__); mask |= POLLHUP; } @@ -1706,7 +1697,7 @@ switch (sk->type) { case SOCK_STREAM: if (sk->state == TCP_CLOSE) { - IRDA_DEBUG(0, __FUNCTION__ "(), POLLHUP\n"); + IRDA_DEBUG(0, "%s(), POLLHUP\n", __FUNCTION__); mask |= POLLHUP; } @@ -1745,7 +1736,7 @@ { struct sock *sk = sock->sk; - IRDA_DEBUG(4, __FUNCTION__ "(), cmd=%#x\n", cmd); + IRDA_DEBUG(4, "%s(), cmd=%#x\n", __FUNCTION__, cmd); switch (cmd) { case TIOCOUTQ: { @@ -1792,7 +1783,7 @@ case SIOCSIFMETRIC: return -EINVAL; default: - IRDA_DEBUG(1, __FUNCTION__ "(), doing device ioctl!\n"); + IRDA_DEBUG(1, "%s(), doing device ioctl!\n", __FUNCTION__); return dev_ioctl(cmd, (void *) arg); } @@ -1819,7 +1810,7 @@ self = sk->protinfo.irda; ASSERT(self != NULL, return -1;); - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); if (level != SOL_IRLMP) return -ENOPROTOOPT; @@ -1981,8 +1972,7 @@ /* Check is the user space own the object */ if(ias_attr->value->owner != IAS_USER_ATTR) { - IRDA_DEBUG(1, __FUNCTION__ - "(), attempting to delete a kernel attribute\n"); + IRDA_DEBUG(1, "%s(), attempting to delete a kernel attribute\n", __FUNCTION__); kfree(ias_opt); return -EPERM; } @@ -2000,13 +1990,11 @@ /* Only possible for a seqpacket service (TTP with SAR) */ if (sk->type != SOCK_SEQPACKET) { - IRDA_DEBUG(2, __FUNCTION__ - "(), setting max_sdu_size = %d\n", opt); + IRDA_DEBUG(2, "%s(), setting max_sdu_size = %d\n", __FUNCTION__, opt); self->max_sdu_size_rx = opt; } else { - WARNING(__FUNCTION__ - "(), not allowed to set MAXSDUSIZE for this " - "socket type!\n"); + WARNING("%s(), not allowed to set MAXSDUSIZE for this " + "socket type!\n", __FUNCTION__); return -ENOPROTOOPT; } break; @@ -2123,7 +2111,7 @@ self = sk->protinfo.irda; - IRDA_DEBUG(2, __FUNCTION__ "(%p)\n", self); + IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self); if (level != SOL_IRLMP) return -ENOPROTOOPT; @@ -2283,8 +2271,7 @@ /* Check that we can proceed with IAP */ if (self->iriap) { - WARNING(__FUNCTION__ - "(), busy with a previous query\n"); + WARNING("%s(), busy with a previous query\n", __FUNCTION__); kfree(ias_opt); return -EBUSY; } @@ -2365,8 +2352,7 @@ /* Wait until a node is discovered */ if (!self->cachediscovery) { - IRDA_DEBUG(1, __FUNCTION__ - "(), nothing discovered yet, going to sleep...\n"); + IRDA_DEBUG(1, "%s(), nothing discovered yet, going to sleep...\n", __FUNCTION__); /* Set watchdog timer to expire in ms. */ self->watchdog.function = irda_discovery_timeout; @@ -2381,12 +2367,10 @@ if(timer_pending(&(self->watchdog))) del_timer(&(self->watchdog)); - IRDA_DEBUG(1, __FUNCTION__ - "(), ...waking up !\n"); + IRDA_DEBUG(1, "%s(), ...waking up !\n", __FUNCTION__); } else - IRDA_DEBUG(1, __FUNCTION__ - "(), found immediately !\n"); + IRDA_DEBUG(1, "%s(), found immediately !\n", __FUNCTION__); /* Tell IrLMP that we have been notified */ irlmp_update_client(self->ckey, self->mask, NULL, NULL, NULL); @@ -2527,11 +2511,11 @@ switch (event) { case NETDEV_UP: - IRDA_DEBUG(3, __FUNCTION__ "(), NETDEV_UP\n"); + IRDA_DEBUG(3, "%s(), NETDEV_UP\n", __FUNCTION__); /* irda_dev_device_up(dev); */ break; case NETDEV_DOWN: - IRDA_DEBUG(3, __FUNCTION__ "(), NETDEV_DOWN\n"); + IRDA_DEBUG(3, "%s(), NETDEV_DOWN\n", __FUNCTION__); /* irda_kill_by_device(dev); */ /* irda_rt_device_down(dev); */ /* irda_dev_device_down(dev); */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/ircomm/ircomm_core.c linux-2.4.23-pre8/net/irda/ircomm/ircomm_core.c --- linux-2.4.22/net/irda/ircomm/ircomm_core.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/ircomm/ircomm_core.c 2003-10-22 22:47:28.000000000 +0000 @@ -63,7 +63,7 @@ { ircomm = hashbin_new(HB_LOCAL); if (ircomm == NULL) { - ERROR(__FUNCTION__ "(), can't allocate hashbin!\n"); + ERROR("%s(), can't allocate hashbin!\n", __FUNCTION__); return -ENOMEM; } @@ -79,7 +79,7 @@ #ifdef MODULE void ircomm_cleanup(void) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); hashbin_delete(ircomm, (FREE_FUNC) __ircomm_close); @@ -100,7 +100,7 @@ struct ircomm_cb *self = NULL; int ret; - IRDA_DEBUG(2, __FUNCTION__ "(), service_type=0x%02x\n", + IRDA_DEBUG(2, "%s(), service_type=0x%02x\n", __FUNCTION__, service_type); ASSERT(ircomm != NULL, return NULL;); @@ -144,7 +144,7 @@ */ static int __ircomm_close(struct ircomm_cb *self) { - IRDA_DEBUG(2, __FUNCTION__"()\n"); + IRDA_DEBUG(2,"%s()\n", __FUNCTION__); /* Disconnect link if any */ ircomm_do_event(self, IRCOMM_DISCONNECT_REQUEST, NULL, NULL); @@ -180,7 +180,7 @@ ASSERT(self != NULL, return -EIO;); ASSERT(self->magic == IRCOMM_MAGIC, return -EIO;); - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); entry = hashbin_remove(ircomm, self->line, NULL); @@ -203,7 +203,7 @@ struct ircomm_info info; int ret; - IRDA_DEBUG(2 , __FUNCTION__"()\n"); + IRDA_DEBUG(2 ,"%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_MAGIC, return -1;); @@ -230,7 +230,7 @@ { int clen = 0; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Check if the packet contains data on the control channel */ if (skb->len > 0) @@ -246,7 +246,7 @@ info->qos, info->max_data_size, info->max_header_size, skb); else { - IRDA_DEBUG(0, __FUNCTION__ "(), missing handler\n"); + IRDA_DEBUG(0, "%s(), missing handler\n", __FUNCTION__); dev_kfree_skb(skb); } } @@ -264,7 +264,7 @@ ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_MAGIC, return -1;); - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ret = ircomm_do_event(self, IRCOMM_CONNECT_RESPONSE, userdata, NULL); @@ -280,7 +280,7 @@ void ircomm_connect_confirm(struct ircomm_cb *self, struct sk_buff *skb, struct ircomm_info *info) { - IRDA_DEBUG(4, __FUNCTION__"()\n"); + IRDA_DEBUG(4,"%s()\n", __FUNCTION__); if (self->notify.connect_confirm ) self->notify.connect_confirm(self->notify.instance, @@ -288,7 +288,7 @@ info->max_data_size, info->max_header_size, skb); else { - IRDA_DEBUG(0, __FUNCTION__ "(), missing handler\n"); + IRDA_DEBUG(0, "%s(), missing handler\n", __FUNCTION__); dev_kfree_skb(skb); } } @@ -303,7 +303,7 @@ { int ret; - IRDA_DEBUG(4, __FUNCTION__"()\n"); + IRDA_DEBUG(4,"%s()\n", __FUNCTION__); ASSERT(self != NULL, return -EFAULT;); ASSERT(self->magic == IRCOMM_MAGIC, return -EFAULT;); @@ -322,14 +322,14 @@ */ void ircomm_data_indication(struct ircomm_cb *self, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__"()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(skb->len > 0, return;); if (self->notify.data_indication) self->notify.data_indication(self->notify.instance, self, skb); else { - IRDA_DEBUG(0, __FUNCTION__ "(), missing handler\n"); + IRDA_DEBUG(0, "%s(), missing handler\n", __FUNCTION__); dev_kfree_skb(skb); } } @@ -362,8 +362,7 @@ if (skb->len) ircomm_data_indication(self, skb); else { - IRDA_DEBUG(4, __FUNCTION__ - "(), data was control info only!\n"); + IRDA_DEBUG(4, "%s(), data was control info only!\n", __FUNCTION__); dev_kfree_skb(skb); } } @@ -378,7 +377,7 @@ { int ret; - IRDA_DEBUG(2, __FUNCTION__"()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -EFAULT;); ASSERT(self->magic == IRCOMM_MAGIC, return -EFAULT;); @@ -400,7 +399,7 @@ { struct sk_buff *ctrl_skb; - IRDA_DEBUG(2, __FUNCTION__"()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ctrl_skb = skb_clone(skb, GFP_ATOMIC); if (!ctrl_skb) @@ -414,7 +413,7 @@ self->notify.udata_indication(self->notify.instance, self, ctrl_skb); else { - IRDA_DEBUG(0, __FUNCTION__ "(), missing handler\n"); + IRDA_DEBUG(0, "%s(), missing handler\n", __FUNCTION__); dev_kfree_skb(skb); } } @@ -430,7 +429,7 @@ struct ircomm_info info; int ret; - IRDA_DEBUG(2, __FUNCTION__"()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_MAGIC, return -1;); @@ -449,7 +448,7 @@ void ircomm_disconnect_indication(struct ircomm_cb *self, struct sk_buff *skb, struct ircomm_info *info) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(info != NULL, return;); @@ -457,7 +456,7 @@ self->notify.disconnect_indication(self->notify.instance, self, info->reason, skb); } else { - IRDA_DEBUG(0, __FUNCTION__ "(), missing handler\n"); + IRDA_DEBUG(0, "%s(), missing handler\n", __FUNCTION__); dev_kfree_skb(skb); } } @@ -470,7 +469,7 @@ */ void ircomm_flow_request(struct ircomm_cb *self, LOCAL_FLOW flow) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_MAGIC, return;); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/ircomm/ircomm_event.c linux-2.4.23-pre8/net/irda/ircomm/ircomm_event.c --- linux-2.4.22/net/irda/ircomm/ircomm_event.c 2001-03-02 19:12:12.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/ircomm/ircomm_event.c 2003-10-22 22:48:24.000000000 +0000 @@ -107,7 +107,7 @@ ircomm_connect_indication(self, skb, info); break; default: - IRDA_DEBUG(4, __FUNCTION__"(), unknown event: %s\n", + IRDA_DEBUG(4,"%s(), unknown event: %s\n", __FUNCTION__, ircomm_event[event]); if (skb) dev_kfree_skb(skb); @@ -139,7 +139,7 @@ ircomm_disconnect_indication(self, skb, info); break; default: - IRDA_DEBUG(0, __FUNCTION__"(), unknown event: %s\n", + IRDA_DEBUG(0, "%s(), unknown event: %s\n", __FUNCTION__, ircomm_event[event]); if (skb) dev_kfree_skb(skb); @@ -174,7 +174,7 @@ ircomm_disconnect_indication(self, skb, info); break; default: - IRDA_DEBUG(0, __FUNCTION__ "(), unknown event = %s\n", + IRDA_DEBUG(0, "%s(), unknown event = %s\n", __FUNCTION__, ircomm_event[event]); if (skb) dev_kfree_skb(skb); @@ -218,7 +218,7 @@ ret = self->issue.disconnect_request(self, skb, info); break; default: - IRDA_DEBUG(0, __FUNCTION__ "(), unknown event = %s\n", + IRDA_DEBUG(0, "%s(), unknown event = %s\n", __FUNCTION__, ircomm_event[event]); if (skb) dev_kfree_skb(skb); @@ -236,7 +236,7 @@ int ircomm_do_event(struct ircomm_cb *self, IRCOMM_EVENT event, struct sk_buff *skb, struct ircomm_info *info) { - IRDA_DEBUG(4, __FUNCTION__": state=%s, event=%s\n", + IRDA_DEBUG(4, "%s: state=%s, event=%s\n", __FUNCTION__, ircomm_state[self->state], ircomm_event[event]); return (*state[self->state])(self, event, skb, info); @@ -252,6 +252,6 @@ { self->state = state; - IRDA_DEBUG(4, __FUNCTION__": next state=%s, service type=%d\n", + IRDA_DEBUG(4, "%s: next state=%s, service type=%d\n", __FUNCTION__, ircomm_state[self->state], self->service_type); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/ircomm/ircomm_lmp.c linux-2.4.23-pre8/net/irda/ircomm/ircomm_lmp.c --- linux-2.4.22/net/irda/ircomm/ircomm_lmp.c 2002-02-25 19:38:14.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/ircomm/ircomm_lmp.c 2003-10-22 22:47:34.000000000 +0000 @@ -49,7 +49,7 @@ { notify_t notify; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); /* Register callbacks */ irda_notify_init(¬ify); @@ -62,7 +62,7 @@ self->lsap = irlmp_open_lsap(LSAP_ANY, ¬ify, 0); if (!self->lsap) { - IRDA_DEBUG(0,__FUNCTION__"failed to allocate tsap\n"); + IRDA_DEBUG(0, "%s failed to allocate tsap\n", __FUNCTION__); return -1; } self->slsap_sel = self->lsap->slsap_sel; @@ -90,7 +90,7 @@ { int ret = 0; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); ret = irlmp_connect_request(self->lsap, info->dlsap_sel, info->saddr, info->daddr, NULL, userdata); @@ -108,7 +108,7 @@ struct sk_buff *skb; int ret; - IRDA_DEBUG(0, __FUNCTION__"()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); /* Any userdata supplied? */ if (userdata == NULL) { @@ -139,7 +139,7 @@ struct sk_buff *skb; int ret; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); if (!userdata) { skb = dev_alloc_skb(64); @@ -172,13 +172,13 @@ cb = (struct irda_skb_cb *) skb->cb; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); line = cb->line; self = (struct ircomm_cb *) hashbin_find(ircomm, line, NULL); if (!self) { - IRDA_DEBUG(2, __FUNCTION__ "(), didn't find myself\n"); + IRDA_DEBUG(2, "%s(), didn't find myself\n", __FUNCTION__); return; } @@ -188,7 +188,7 @@ self->pkt_count--; if ((self->pkt_count < 2) && (self->flow_status == FLOW_STOP)) { - IRDA_DEBUG(2, __FUNCTION__ "(), asking TTY to start again!\n"); + IRDA_DEBUG(2, "%s(), asking TTY to start again!\n", __FUNCTION__); self->flow_status = FLOW_START; if (self->notify.flow_indication) self->notify.flow_indication(self->notify.instance, @@ -214,12 +214,12 @@ cb->line = self->line; - IRDA_DEBUG(4, __FUNCTION__"(), sending frame\n"); + IRDA_DEBUG(4, "%s(), sending frame\n", __FUNCTION__); skb->destructor = ircomm_lmp_flow_control; if ((self->pkt_count++ > 7) && (self->flow_status == FLOW_START)) { - IRDA_DEBUG(2, __FUNCTION__ "(), asking TTY to slow down!\n"); + IRDA_DEBUG(2, "%s(), asking TTY to slow down!\n", __FUNCTION__); self->flow_status = FLOW_STOP; if (self->notify.flow_indication) self->notify.flow_indication(self->notify.instance, @@ -227,7 +227,7 @@ } ret = irlmp_data_request(self->lsap, skb); if (ret) { - ERROR(__FUNCTION__ "(), failed\n"); + ERROR("%s(), failed\n", __FUNCTION__); dev_kfree_skb(skb); } @@ -245,7 +245,7 @@ { struct ircomm_cb *self = (struct ircomm_cb *) instance; - IRDA_DEBUG(4, __FUNCTION__"()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_MAGIC, return -1;); @@ -272,7 +272,7 @@ struct ircomm_cb *self = (struct ircomm_cb *) instance; struct ircomm_info info; - IRDA_DEBUG(0, __FUNCTION__"()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_MAGIC, return;); @@ -302,7 +302,7 @@ struct ircomm_cb *self = (struct ircomm_cb *)instance; struct ircomm_info info; - IRDA_DEBUG(0, __FUNCTION__"()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_MAGIC, return;); @@ -329,7 +329,7 @@ struct ircomm_cb *self = (struct ircomm_cb *) instance; struct ircomm_info info; - IRDA_DEBUG(0, __FUNCTION__"()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_MAGIC, return;); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/ircomm/ircomm_param.c linux-2.4.23-pre8/net/irda/ircomm/ircomm_param.c --- linux-2.4.22/net/irda/ircomm/ircomm_param.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/ircomm/ircomm_param.c 2003-10-22 22:48:56.000000000 +0000 @@ -118,7 +118,7 @@ struct sk_buff *skb; int count; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); @@ -152,7 +152,7 @@ count = irda_param_insert(self, pi, skb->tail, skb_tailroom(skb), &ircomm_param_info); if (count < 0) { - WARNING(__FUNCTION__ "(), no room for parameter!\n"); + WARNING("%s(), no room for parameter!\n", __FUNCTION__); restore_flags(flags); return -1; } @@ -160,7 +160,7 @@ restore_flags(flags); - IRDA_DEBUG(2, __FUNCTION__ "(), skb->len=%d\n", skb->len); + IRDA_DEBUG(2, "%s(), skb->len=%d\n", __FUNCTION__, skb->len); if (flush) { /* ircomm_tty_do_softint will take care of the rest */ @@ -195,11 +195,10 @@ /* Find all common service types */ service_type &= self->service_type; if (!service_type) { - IRDA_DEBUG(2, __FUNCTION__ - "(), No common service type to use!\n"); + IRDA_DEBUG(2, "%s(), No common service type to use!\n", __FUNCTION__); return -1; } - IRDA_DEBUG(0, __FUNCTION__ "(), services in common=%02x\n", + IRDA_DEBUG(0, __FUNCTION__ "%s(), services in common=%02x\n", __FUNCTION__, service_type); /* @@ -214,7 +213,7 @@ else if (service_type & IRCOMM_3_WIRE_RAW) self->settings.service_type = IRCOMM_3_WIRE_RAW; - IRDA_DEBUG(0, __FUNCTION__ "(), resulting service type=0x%02x\n", + IRDA_DEBUG(0, "%s(), resulting service type=0x%02x\n", __FUNCTION__, self->settings.service_type); /* @@ -257,7 +256,7 @@ else { self->settings.port_type = (__u8) param->pv.i; - IRDA_DEBUG(0, __FUNCTION__ "(), port type=%d\n", + IRDA_DEBUG(0, "%s(), port type=%d\n", __FUNCTION__, self->settings.port_type); } return 0; @@ -277,9 +276,9 @@ ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); if (get) { - IRDA_DEBUG(0, __FUNCTION__ "(), not imp!\n"); + IRDA_DEBUG(0, "%s(), not imp!\n", __FUNCTION__); } else { - IRDA_DEBUG(0, __FUNCTION__ "(), port-name=%s\n", param->pv.c); + IRDA_DEBUG(0, "%s(), port-name=%s\n", __FUNCTION__, param->pv.c); strncpy(self->settings.port_name, param->pv.c, 32); } @@ -304,7 +303,7 @@ else self->settings.data_rate = param->pv.i; - IRDA_DEBUG(2, __FUNCTION__ "(), data rate = %d\n", param->pv.i); + IRDA_DEBUG(2, "%s(), data rate = %d\n", __FUNCTION__, param->pv.i); return 0; } @@ -350,7 +349,7 @@ else self->settings.flow_control = (__u8) param->pv.i; - IRDA_DEBUG(1, __FUNCTION__ "(), flow control = 0x%02x\n", (__u8) param->pv.i); + IRDA_DEBUG(1, "%s(), flow control = 0x%02x\n", __FUNCTION__, (__u8) param->pv.i); return 0; } @@ -376,7 +375,7 @@ self->settings.xonxoff[1] = (__u16) param->pv.i >> 8; } - IRDA_DEBUG(0, __FUNCTION__ "(), XON/XOFF = 0x%02x,0x%02x\n", + IRDA_DEBUG(0, "%s(), XON/XOFF = 0x%02x,0x%02x\n", __FUNCTION__, param->pv.i & 0xff, param->pv.i >> 8); return 0; @@ -403,7 +402,7 @@ self->settings.enqack[1] = (__u16) param->pv.i >> 8; } - IRDA_DEBUG(0, __FUNCTION__ "(), ENQ/ACK = 0x%02x,0x%02x\n", + IRDA_DEBUG(0, "%s(), ENQ/ACK = 0x%02x,0x%02x\n", __FUNCTION__, param->pv.i & 0xff, param->pv.i >> 8); return 0; @@ -418,7 +417,7 @@ static int ircomm_param_line_status(void *instance, irda_param_t *param, int get) { - IRDA_DEBUG(2, __FUNCTION__ "(), not impl.\n"); + IRDA_DEBUG(2, "%s(), not impl.\n", __FUNCTION__); return 0; } @@ -477,7 +476,7 @@ struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; __u8 dce; - IRDA_DEBUG(1, __FUNCTION__ "(), dce = 0x%02x\n", (__u8) param->pv.i); + IRDA_DEBUG(1, "%s(), dce = 0x%02x\n", __FUNCTION__, (__u8) param->pv.i); dce = (__u8) param->pv.i; @@ -489,7 +488,7 @@ /* Check if any of the settings have changed */ if (dce & 0x0f) { if (dce & IRCOMM_DELTA_CTS) { - IRDA_DEBUG(2, __FUNCTION__ "(), CTS \n"); + IRDA_DEBUG(2, "%s(), CTS \n", __FUNCTION__); } } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/ircomm/ircomm_ttp.c linux-2.4.23-pre8/net/irda/ircomm/ircomm_ttp.c --- linux-2.4.22/net/irda/ircomm/ircomm_ttp.c 2001-03-02 19:12:12.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/ircomm/ircomm_ttp.c 2003-10-22 22:49:41.000000000 +0000 @@ -49,7 +49,7 @@ { notify_t notify; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); /* Register callbacks */ irda_notify_init(¬ify); @@ -64,7 +64,7 @@ self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT, ¬ify); if (!self->tsap) { - IRDA_DEBUG(0, __FUNCTION__"failed to allocate tsap\n"); + IRDA_DEBUG(0, "%s failed to allocate tsap\n", __FUNCTION__); return -1; } self->slsap_sel = self->tsap->stsap_sel; @@ -92,7 +92,7 @@ { int ret = 0; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ret = irttp_connect_request(self->tsap, info->dlsap_sel, info->saddr, info->daddr, NULL, @@ -110,7 +110,7 @@ { int ret; - IRDA_DEBUG(4, __FUNCTION__"()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ret = irttp_connect_response(self->tsap, TTP_SAR_DISABLE, skb); @@ -133,7 +133,7 @@ ASSERT(skb != NULL, return -1;); - IRDA_DEBUG(2, __FUNCTION__"(), clen=%d\n", clen); + IRDA_DEBUG(2, "%s(), clen=%d\n", __FUNCTION__, clen); /* * Insert clen field, currently we either send data only, or control @@ -146,7 +146,7 @@ ret = irttp_data_request(self->tsap, skb); if (ret) { - ERROR(__FUNCTION__ "(), failed\n"); + ERROR("%s(), failed\n", __FUNCTION__); dev_kfree_skb(skb); } @@ -164,7 +164,7 @@ { struct ircomm_cb *self = (struct ircomm_cb *) instance; - IRDA_DEBUG(4, __FUNCTION__"()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_MAGIC, return -1;); @@ -184,7 +184,7 @@ struct ircomm_cb *self = (struct ircomm_cb *) instance; struct ircomm_info info; - IRDA_DEBUG(4, __FUNCTION__"()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_MAGIC, return;); @@ -192,7 +192,7 @@ ASSERT(qos != NULL, return;); if (max_sdu_size != TTP_SAR_DISABLE) { - ERROR(__FUNCTION__ "(), SAR not allowed for IrCOMM!\n"); + ERROR("%s(), SAR not allowed for IrCOMM!\n", __FUNCTION__); dev_kfree_skb(skb); return; } @@ -221,7 +221,7 @@ struct ircomm_cb *self = (struct ircomm_cb *)instance; struct ircomm_info info; - IRDA_DEBUG(4, __FUNCTION__"()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_MAGIC, return;); @@ -229,7 +229,7 @@ ASSERT(qos != NULL, return;); if (max_sdu_size != TTP_SAR_DISABLE) { - ERROR(__FUNCTION__ "(), SAR not allowed for IrCOMM!\n"); + ERROR("%s(), SAR not allowed for IrCOMM!\n", __FUNCTION__); dev_kfree_skb(skb); return; } @@ -272,7 +272,7 @@ struct ircomm_cb *self = (struct ircomm_cb *) instance; struct ircomm_info info; - IRDA_DEBUG(2, __FUNCTION__"()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_MAGIC, return;); @@ -292,7 +292,7 @@ { struct ircomm_cb *self = (struct ircomm_cb *) instance; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_MAGIC, return;); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/ircomm/ircomm_tty_attach.c linux-2.4.23-pre8/net/irda/ircomm/ircomm_tty_attach.c --- linux-2.4.22/net/irda/ircomm/ircomm_tty_attach.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/ircomm/ircomm_tty_attach.c 2003-10-22 22:48:29.000000000 +0000 @@ -126,14 +126,14 @@ */ int ircomm_tty_attach_cable(struct ircomm_tty_cb *self) { - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); /* Check if somebody has already connected to us */ if (ircomm_is_connected(self->ircomm)) { - IRDA_DEBUG(0, __FUNCTION__ "(), already connected!\n"); + IRDA_DEBUG(0, "%s(), already connected!\n", __FUNCTION__); return 0; } @@ -144,7 +144,7 @@ /* Check if somebody has already connected to us */ if (ircomm_is_connected(self->ircomm)) { - IRDA_DEBUG(0, __FUNCTION__ "(), already connected!\n"); + IRDA_DEBUG(0, "%s(), already connected!\n", __FUNCTION__); return 0; } @@ -161,7 +161,7 @@ */ void ircomm_tty_detach_cable(struct ircomm_tty_cb *self) { - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); @@ -203,7 +203,7 @@ __u8 oct_seq[6]; __u16 hints; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); @@ -258,16 +258,16 @@ * Set default values, but only if the application for some reason * haven't set them already */ - IRDA_DEBUG(2, __FUNCTION__ "(), data-rate = %d\n", + IRDA_DEBUG(2, "%s(), data-rate = %d\n", __FUNCTION__, self->settings.data_rate); if (!self->settings.data_rate) self->settings.data_rate = 9600; - IRDA_DEBUG(2, __FUNCTION__ "(), data-format = %d\n", + IRDA_DEBUG(2, "%s(), data-format = %d\n", __FUNCTION__, self->settings.data_format); if (!self->settings.data_format) self->settings.data_format = IRCOMM_WSIZE_8; /* 8N1 */ - IRDA_DEBUG(2, __FUNCTION__ "(), flow-control = %d\n", + IRDA_DEBUG(2, "%s(), flow-control = %d\n", __FUNCTION__, self->settings.flow_control); /*self->settings.flow_control = IRCOMM_RTS_CTS_IN|IRCOMM_RTS_CTS_OUT;*/ @@ -312,7 +312,7 @@ struct ircomm_tty_cb *self; struct ircomm_tty_info info; - IRDA_DEBUG(2, __FUNCTION__"()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Important note : * We need to drop all passive discoveries. @@ -354,7 +354,7 @@ { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); @@ -384,7 +384,7 @@ { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) priv; - IRDA_DEBUG(2, __FUNCTION__"()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); @@ -395,13 +395,13 @@ /* Check if request succeeded */ if (result != IAS_SUCCESS) { - IRDA_DEBUG(4, __FUNCTION__ "(), got NULL value!\n"); + IRDA_DEBUG(4, "%s(), got NULL value!\n", __FUNCTION__); return; } switch (value->type) { case IAS_OCT_SEQ: - IRDA_DEBUG(2, __FUNCTION__"(), got octet sequence\n"); + IRDA_DEBUG(2, "%s(), got octet sequence\n", __FUNCTION__); irda_param_extract_all(self, value->t.oct_seq, value->len, &ircomm_param_info); @@ -411,21 +411,21 @@ break; case IAS_INTEGER: /* Got LSAP selector */ - IRDA_DEBUG(2, __FUNCTION__"(), got lsapsel = %d\n", + IRDA_DEBUG(2, "%s(), got lsapsel = %d\n", __FUNCTION__, value->t.integer); if (value->t.integer == -1) { - IRDA_DEBUG(0, __FUNCTION__"(), invalid value!\n"); + IRDA_DEBUG(0, "%s(), invalid value!\n", __FUNCTION__); } else self->dlsap_sel = value->t.integer; ircomm_tty_do_event(self, IRCOMM_TTY_GOT_LSAPSEL, NULL, NULL); break; case IAS_MISSING: - IRDA_DEBUG(0, __FUNCTION__"(), got IAS_MISSING\n"); + IRDA_DEBUG(0, "%s(), got IAS_MISSING\n", __FUNCTION__); break; default: - IRDA_DEBUG(0, __FUNCTION__"(), got unknown type!\n"); + IRDA_DEBUG(0, "%s(), got unknown type!\n", __FUNCTION__); break; } irias_delete_value(value); @@ -445,7 +445,7 @@ { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); @@ -476,7 +476,7 @@ struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance; int clen; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); @@ -505,7 +505,7 @@ */ void ircomm_tty_link_established(struct ircomm_tty_cb *self) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); @@ -580,7 +580,7 @@ { struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) data; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;); @@ -601,7 +601,7 @@ { int ret = 0; - IRDA_DEBUG(2, __FUNCTION__": state=%s, event=%s\n", + IRDA_DEBUG(2, "%s: state=%s, event=%s\n", __FUNCTION__, ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { case IRCOMM_TTY_ATTACH_CABLE: @@ -616,8 +616,7 @@ self->saddr = info->saddr; if (self->iriap) { - WARNING(__FUNCTION__ - "(), busy with a previous query\n"); + WARNING("%s(), busy with a previous query\n", __FUNCTION__); return -EBUSY; } @@ -645,7 +644,7 @@ ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: - IRDA_DEBUG(2, __FUNCTION__"(), unknown event: %s\n", + IRDA_DEBUG(2, "%s(), unknown event: %s\n", __FUNCTION__, ircomm_tty_event[event]); return -EINVAL; } @@ -665,7 +664,7 @@ { int ret = 0; - IRDA_DEBUG(2, __FUNCTION__": state=%s, event=%s\n", + IRDA_DEBUG(2, "%s: state=%s, event=%s\n", __FUNCTION__, ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { @@ -674,8 +673,7 @@ self->saddr = info->saddr; if (self->iriap) { - WARNING(__FUNCTION__ - "(), busy with a previous query\n"); + WARNING("%s(), busy with a previous query\n", __FUNCTION__); return -EBUSY; } @@ -717,7 +715,7 @@ ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: - IRDA_DEBUG(2, __FUNCTION__"(), unknown event: %s\n", + IRDA_DEBUG(2, "%s(), unknown event: %s\n", __FUNCTION__, ircomm_tty_event[event]); return -EINVAL; } @@ -737,14 +735,13 @@ { int ret = 0; - IRDA_DEBUG(2, __FUNCTION__": state=%s, event=%s\n", + IRDA_DEBUG(2, "%s: state=%s, event=%s\n", __FUNCTION__, ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { case IRCOMM_TTY_GOT_PARAMETERS: if (self->iriap) { - WARNING(__FUNCTION__ - "(), busy with a previous query\n"); + WARNING("%s(), busy with a previous query\n", __FUNCTION__); return -EBUSY; } @@ -774,7 +771,7 @@ ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: - IRDA_DEBUG(2, __FUNCTION__"(), unknown event: %s\n", + IRDA_DEBUG(2, "%s(), unknown event: %s\n", __FUNCTION__, ircomm_tty_event[event]); return -EINVAL; } @@ -794,7 +791,7 @@ { int ret = 0; - IRDA_DEBUG(2, __FUNCTION__": state=%s, event=%s\n", + IRDA_DEBUG(2, "%s: state=%s, event=%s\n", __FUNCTION__, ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { @@ -822,7 +819,7 @@ ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: - IRDA_DEBUG(2, __FUNCTION__"(), unknown event: %s\n", + IRDA_DEBUG(2, "%s(), unknown event: %s\n", __FUNCTION__, ircomm_tty_event[event]); return -EINVAL; } @@ -842,7 +839,7 @@ { int ret = 0; - IRDA_DEBUG(2, __FUNCTION__": state=%s, event=%s\n", + IRDA_DEBUG(2, "%s: state=%s, event=%s\n", __FUNCTION__, ircomm_tty_state[self->state], ircomm_tty_event[event]); switch (event) { @@ -874,7 +871,7 @@ ircomm_tty_next_state(self, IRCOMM_TTY_IDLE); break; default: - IRDA_DEBUG(2, __FUNCTION__"(), unknown event: %s\n", + IRDA_DEBUG(2, "%s(), unknown event: %s\n", __FUNCTION__, ircomm_tty_event[event]); return -EINVAL; } @@ -911,13 +908,13 @@ self->settings.dce = IRCOMM_DELTA_CD; ircomm_tty_check_modem_status(self); } else { - IRDA_DEBUG(0, __FUNCTION__ "(), hanging up!\n"); + IRDA_DEBUG(0, "%s(), hanging up!\n", __FUNCTION__); if (self->tty) tty_hangup(self->tty); } break; default: - IRDA_DEBUG(2, __FUNCTION__"(), unknown event: %s\n", + IRDA_DEBUG(2, "%s(), unknown event: %s\n", __FUNCTION__, ircomm_tty_event[event]); return -EINVAL; } @@ -936,7 +933,7 @@ ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); - IRDA_DEBUG(2, __FUNCTION__": state=%s, event=%s\n", + IRDA_DEBUG(2, "%s: state=%s, event=%s\n", __FUNCTION__, ircomm_tty_state[self->state], ircomm_tty_event[event]); return (*state[self->state])(self, event, skb, info); @@ -955,7 +952,7 @@ self->state = state; - IRDA_DEBUG(2, __FUNCTION__": next state=%s, service type=%d\n", + IRDA_DEBUG(2, "%s: next state=%s, service type=%d\n", __FUNCTION__, ircomm_tty_state[self->state], self->service_type); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/ircomm/ircomm_tty_ioctl.c linux-2.4.23-pre8/net/irda/ircomm/ircomm_tty_ioctl.c --- linux-2.4.22/net/irda/ircomm/ircomm_tty_ioctl.c 2002-11-28 23:53:16.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/ircomm/ircomm_tty_ioctl.c 2003-10-22 22:47:29.000000000 +0000 @@ -59,7 +59,7 @@ unsigned cflag, cval; int baud; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if (!self->tty || !self->tty->termios || !self->ircomm) return; @@ -96,7 +96,7 @@ self->settings.flow_control |= IRCOMM_RTS_CTS_IN; /* This got me. Bummer. Jean II */ if (self->service_type == IRCOMM_3_WIRE_RAW) - WARNING(__FUNCTION__ "(), enabling RTS/CTS on link that doesn't support it (3-wire-raw)\n"); + WARNING("%s(), enabling RTS/CTS on link that doesn't support it (3-wire-raw)\n", __FUNCTION__); } else { self->flags &= ~ASYNC_CTS_FLOW; self->settings.flow_control &= ~IRCOMM_RTS_CTS_IN; @@ -152,7 +152,7 @@ struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; unsigned int cflag = tty->termios->c_cflag; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if ((cflag == old_termios->c_cflag) && (RELEVANT_IFLAG(tty->termios->c_iflag) == @@ -201,7 +201,7 @@ { unsigned int result; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); result = ((self->settings.dte & IRCOMM_RTS) ? TIOCM_RTS : 0) | ((self->settings.dte & IRCOMM_DTR) ? TIOCM_DTR : 0) @@ -225,7 +225,7 @@ unsigned int arg; __u8 old_rts, old_dtr; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;); @@ -287,7 +287,7 @@ if (!retinfo) return -EFAULT; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); memset(&info, 0, sizeof(info)); info.line = self->line; @@ -323,7 +323,7 @@ struct serial_struct new_serial; struct ircomm_tty_cb old_state, *state; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); if (copy_from_user(&new_serial,new_info,sizeof(new_serial))) return -EFAULT; @@ -397,7 +397,7 @@ struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data; int ret = 0; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) && (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) && @@ -426,7 +426,7 @@ break; case TIOCGICOUNT: - IRDA_DEBUG(0, __FUNCTION__ "(), TIOCGICOUNT not impl!\n"); + IRDA_DEBUG(0, "%s(), TIOCGICOUNT not impl!\n", __FUNCTION__); #if 0 save_flags(flags); cli(); cnow = driver->icount; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irda_device.c linux-2.4.23-pre8/net/irda/irda_device.c --- linux-2.4.22/net/irda/irda_device.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irda_device.c 2003-10-22 22:48:54.000000000 +0000 @@ -174,7 +174,7 @@ void irda_device_cleanup(void) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); hashbin_delete(tasks, (FREE_FUNC) __irda_task_delete); hashbin_delete(dongles, NULL); @@ -190,7 +190,7 @@ { struct irlap_cb *self; - IRDA_DEBUG(4, __FUNCTION__ "(%s)\n", status ? "TRUE" : "FALSE"); + IRDA_DEBUG(4, "%s(%s)\n", __FUNCTION__, status ? "TRUE" : "FALSE"); self = (struct irlap_cb *) dev->atalk_ptr; @@ -215,11 +215,11 @@ struct if_irda_req req; int ret; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if (!dev->do_ioctl) { - ERROR(__FUNCTION__ "(), do_ioctl not impl. by " - "device driver\n"); + ERROR("%s(), do_ioctl not impl. by " + "device driver\n", __FUNCTION__); return -1; } @@ -236,11 +236,11 @@ struct if_irda_req req; int ret; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if (!dev->do_ioctl) { - ERROR(__FUNCTION__ "(), do_ioctl not impl. by " - "device driver\n"); + ERROR("%s(), do_ioctl not impl. by " + "device driver\n", __FUNCTION__); return -1; } @@ -262,11 +262,11 @@ struct if_irda_req req; int ret; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if (!dev->do_ioctl) { - ERROR(__FUNCTION__ "(), do_ioctl not impl. by " - "device driver\n"); + ERROR("%s(), do_ioctl not impl. by " + "device driver\n", __FUNCTION__); return -1; } @@ -279,7 +279,7 @@ void irda_task_next_state(struct irda_task *task, IRDA_TASK_STATE state) { - IRDA_DEBUG(2, __FUNCTION__ "(), state = %s\n", task_state[state]); + IRDA_DEBUG(2, "%s(), state = %s\n", __FUNCTION__, task_state[state]); task->state = state; } @@ -313,7 +313,7 @@ int count = 0; int timeout; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(task != NULL, return -1;); ASSERT(task->magic == IRDA_TASK_MAGIC, return -1;); @@ -322,14 +322,14 @@ do { timeout = task->function(task); if (count++ > 100) { - ERROR(__FUNCTION__ "(), error in task handler!\n"); + ERROR("%s(), error in task handler!\n", __FUNCTION__); irda_task_delete(task); return TRUE; } } while ((timeout == 0) && (task->state != IRDA_TASK_DONE)); if (timeout < 0) { - ERROR(__FUNCTION__ "(), Error executing task!\n"); + ERROR("%s(), Error executing task!\n", __FUNCTION__); irda_task_delete(task); return TRUE; } @@ -361,8 +361,7 @@ irda_task_timer_expired); finished = FALSE; } else { - IRDA_DEBUG(0, __FUNCTION__ - "(), not finished, and no timeout!\n"); + IRDA_DEBUG(0, "%s(), not finished, and no timeout!\n", __FUNCTION__); finished = FALSE; } @@ -391,7 +390,7 @@ struct irda_task *task; int ret; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); task = kmalloc(sizeof(struct irda_task), GFP_ATOMIC); if (!task) @@ -428,7 +427,7 @@ { struct irda_task *task; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); task = (struct irda_task *) data; @@ -547,7 +546,7 @@ { /* Check if this dongle has been registred before */ if (hashbin_find(dongles, new->type, NULL)) { - MESSAGE(__FUNCTION__ "(), Dongle already registered\n"); + MESSAGE("%s(), Dongle already registered\n", __FUNCTION__); return 0; } @@ -569,7 +568,7 @@ node = hashbin_remove(dongles, dongle->type, NULL); if (!node) { - ERROR(__FUNCTION__ "(), dongle not found!\n"); + ERROR("%s(), dongle not found!\n", __FUNCTION__); return; } } @@ -586,11 +585,11 @@ struct if_irda_req req; int ret; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); if (!dev->do_ioctl) { - ERROR(__FUNCTION__ "(), set_raw_mode not impl. by " - "device driver\n"); + ERROR("%s(), set_raw_mode not impl. by " + "device driver\n", __FUNCTION__); return -1; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irias_object.c linux-2.4.23-pre8/net/irda/irias_object.c --- linux-2.4.22/net/irda/irias_object.c 2001-10-05 01:41:09.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irias_object.c 2003-10-22 22:49:07.000000000 +0000 @@ -59,7 +59,7 @@ /* Allocate new string */ new_str = kmalloc(len + 1, GFP_ATOMIC); if (new_str == NULL) { - WARNING(__FUNCTION__"(), Unable to kmalloc!\n"); + WARNING("%s(), Unable to kmalloc!\n", __FUNCTION__); return NULL; } @@ -80,12 +80,12 @@ { struct ias_object *obj; - IRDA_DEBUG( 4, __FUNCTION__ "()\n"); + IRDA_DEBUG( 4, "%s()\n", __FUNCTION__); obj = (struct ias_object *) kmalloc(sizeof(struct ias_object), GFP_ATOMIC); if (obj == NULL) { - IRDA_DEBUG(0, __FUNCTION__ "(), Unable to allocate object!\n"); + IRDA_DEBUG(0, "%s(), Unable to allocate object!\n", __FUNCTION__); return NULL; } memset(obj, 0, sizeof( struct ias_object)); @@ -272,7 +272,7 @@ /* Find object */ obj = hashbin_find(objects, 0, obj_name); if (obj == NULL) { - WARNING(__FUNCTION__ "(), Unable to find object: %s\n", + WARNING("%s(), Unable to find object: %s\n", __FUNCTION__, obj_name); return -1; } @@ -280,14 +280,13 @@ /* Find attribute */ attrib = hashbin_find(obj->attribs, 0, attrib_name); if (attrib == NULL) { - WARNING(__FUNCTION__ "(), Unable to find attribute: %s\n", + WARNING("%s(), Unable to find attribute: %s\n", __FUNCTION__, attrib_name); return -1; } if ( attrib->value->type != new_value->type) { - IRDA_DEBUG( 0, __FUNCTION__ - "(), changing value type not allowed!\n"); + IRDA_DEBUG( 0, "%s(), changing value type not allowed!\n", __FUNCTION__); return -1; } @@ -319,7 +318,7 @@ attrib = (struct ias_attrib *) kmalloc(sizeof(struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { - WARNING(__FUNCTION__ "(), Unable to allocate attribute!\n"); + WARNING("%s(), Unable to allocate attribute!\n", __FUNCTION__); return; } memset(attrib, 0, sizeof( struct ias_attrib)); @@ -354,8 +353,7 @@ attrib = (struct ias_attrib *) kmalloc(sizeof(struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { - WARNING(__FUNCTION__ - "(), Unable to allocate attribute!\n"); + WARNING("%s(), Unable to allocate attribute!\n", __FUNCTION__); return; } memset(attrib, 0, sizeof( struct ias_attrib)); @@ -388,7 +386,7 @@ attrib = (struct ias_attrib *) kmalloc(sizeof( struct ias_attrib), GFP_ATOMIC); if (attrib == NULL) { - WARNING(__FUNCTION__ "(), Unable to allocate attribute!\n"); + WARNING("%s(), Unable to allocate attribute!\n", __FUNCTION__); return; } memset(attrib, 0, sizeof( struct ias_attrib)); @@ -413,7 +411,7 @@ value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { - WARNING(__FUNCTION__ "(), Unable to kmalloc!\n"); + WARNING("%s(), Unable to kmalloc!\n", __FUNCTION__); return NULL; } memset(value, 0, sizeof(struct ias_value)); @@ -438,7 +436,7 @@ value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { - WARNING(__FUNCTION__ "(), Unable to kmalloc!\n"); + WARNING("%s(), Unable to kmalloc!\n", __FUNCTION__); return NULL; } memset( value, 0, sizeof( struct ias_value)); @@ -465,7 +463,7 @@ value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { - WARNING(__FUNCTION__ "(), Unable to kmalloc!\n"); + WARNING("%s(), Unable to kmalloc!\n", __FUNCTION__); return NULL; } memset(value, 0, sizeof(struct ias_value)); @@ -478,7 +476,7 @@ value->t.oct_seq = kmalloc(len, GFP_ATOMIC); if (value->t.oct_seq == NULL){ - WARNING(__FUNCTION__"(), Unable to kmalloc!\n"); + WARNING("%s(), Unable to kmalloc!\n", __FUNCTION__); kfree(value); return NULL; } @@ -492,7 +490,7 @@ value = kmalloc(sizeof(struct ias_value), GFP_ATOMIC); if (value == NULL) { - WARNING(__FUNCTION__ "(), Unable to kmalloc!\n"); + WARNING("%s(), Unable to kmalloc!\n", __FUNCTION__); return NULL; } memset(value, 0, sizeof(struct ias_value)); @@ -511,7 +509,7 @@ */ void irias_delete_value(struct ias_value *value) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(value != NULL, return;); @@ -531,7 +529,7 @@ kfree(value->t.oct_seq); break; default: - IRDA_DEBUG(0, __FUNCTION__ "(), Unknown value type!\n"); + IRDA_DEBUG(0, "%s(), Unknown value type!\n", __FUNCTION__); break; } kfree(value); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlan/irlan_client.c linux-2.4.23-pre8/net/irda/irlan/irlan_client.c --- linux-2.4.22/net/irda/irlan/irlan_client.c 2002-11-28 23:53:16.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlan/irlan_client.c 2003-10-22 22:49:00.000000000 +0000 @@ -71,7 +71,7 @@ { struct irlan_cb *self = (struct irlan_cb *) data; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -90,7 +90,7 @@ void irlan_client_start_kick_timer(struct irlan_cb *self, int timeout) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); irda_start_timer(&self->client.kick_timer, timeout, (void *) self, irlan_client_kick_timer_expired); @@ -104,7 +104,7 @@ */ void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr) { - IRDA_DEBUG(1, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -116,7 +116,7 @@ if ((self->client.state != IRLAN_IDLE) || (self->provider.access_type == ACCESS_DIRECT)) { - IRDA_DEBUG(0, __FUNCTION__ "(), already awake!\n"); + IRDA_DEBUG(0, "%s(), already awake!\n", __FUNCTION__); return; } @@ -125,7 +125,7 @@ self->daddr = daddr; if (self->disconnect_reason == LM_USER_REQUEST) { - IRDA_DEBUG(0, __FUNCTION__ "(), still stopped by user\n"); + IRDA_DEBUG(0, "%s(), still stopped by user\n", __FUNCTION__); return; } @@ -152,7 +152,7 @@ struct irlan_cb *self; __u32 saddr, daddr; - IRDA_DEBUG(1, __FUNCTION__"()\n"); + IRDA_DEBUG(1, "%s()\n", __FUNCTION__); ASSERT(irlan != NULL, return;); ASSERT(discovery != NULL, return;); @@ -174,7 +174,7 @@ if (self) { ASSERT(self->magic == IRLAN_MAGIC, return;); - IRDA_DEBUG(1, __FUNCTION__ "(), Found instance (%08x)!\n", + IRDA_DEBUG(1, "%s(), Found instance (%08x)!\n", __FUNCTION__, daddr); irlan_client_wakeup(self, saddr, daddr); @@ -192,7 +192,7 @@ { struct irlan_cb *self; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self = (struct irlan_cb *) instance; @@ -203,7 +203,7 @@ irlan_do_client_event(self, IRLAN_DATA_INDICATION, skb); /* Ready for a new command */ - IRDA_DEBUG(2, __FUNCTION__ "(), clearing tx_busy\n"); + IRDA_DEBUG(2, "%s(), clearing tx_busy\n", __FUNCTION__); self->client.tx_busy = FALSE; /* Check if we have some queued commands waiting to be sent */ @@ -220,7 +220,7 @@ struct tsap_cb *tsap; struct sk_buff *skb; - IRDA_DEBUG(4, __FUNCTION__ "(), reason=%d\n", reason); + IRDA_DEBUG(4, "%s(), reason=%d\n", __FUNCTION__, reason); self = (struct irlan_cb *) instance; tsap = (struct tsap_cb *) sap; @@ -252,7 +252,7 @@ struct tsap_cb *tsap; notify_t notify; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -272,7 +272,7 @@ tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT, ¬ify); if (!tsap) { - IRDA_DEBUG(2, __FUNCTION__ "(), Got no tsap!\n"); + IRDA_DEBUG(2, "%s(), Got no tsap!\n", __FUNCTION__); return; } self->client.tsap_ctrl = tsap; @@ -292,7 +292,7 @@ { struct irlan_cb *self; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); self = (struct irlan_cb *) instance; @@ -318,7 +318,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -361,13 +361,13 @@ ASSERT(skb != NULL, return;); - IRDA_DEBUG(4, __FUNCTION__ "() skb->len=%d\n", (int) skb->len); + IRDA_DEBUG(4, "%s() skb->len=%d\n", __FUNCTION__, (int) skb->len); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); if (!skb) { - ERROR( __FUNCTION__ "(), Got NULL skb!\n"); + ERROR("%s(), Got NULL skb!\n", __FUNCTION__); return; } frame = skb->data; @@ -392,7 +392,7 @@ /* How many parameters? */ count = frame[1]; - IRDA_DEBUG(4, __FUNCTION__ "(), got %d parameters\n", count); + IRDA_DEBUG(4, "%s(), got %d parameters\n", __FUNCTION__, count); ptr = frame+2; @@ -400,7 +400,7 @@ for (i=0; imagic == IRLAN_MAGIC, return;); @@ -462,7 +462,7 @@ else if (strcmp(value, "HOSTED") == 0) self->client.access_type = ACCESS_HOSTED; else { - IRDA_DEBUG(2, __FUNCTION__ "(), unknown access type!\n"); + IRDA_DEBUG(2, "%s(), unknown access type!\n", __FUNCTION__); } } /* IRLAN version */ @@ -484,14 +484,14 @@ memcpy(&tmp_cpu, value, 2); /* Align value */ le16_to_cpus(&tmp_cpu); /* Convert to host order */ self->client.recv_arb_val = tmp_cpu; - IRDA_DEBUG(2, __FUNCTION__ "(), receive arb val=%d\n", + IRDA_DEBUG(2, "%s(), receive arb val=%d\n", __FUNCTION__, self->client.recv_arb_val); } if (strcmp(param, "MAX_FRAME") == 0) { memcpy(&tmp_cpu, value, 2); /* Align value */ le16_to_cpus(&tmp_cpu); /* Convert to host order */ self->client.max_frame = tmp_cpu; - IRDA_DEBUG(4, __FUNCTION__ "(), max frame=%d\n", + IRDA_DEBUG(4, "%s(), max frame=%d\n", __FUNCTION__, self->client.max_frame); } @@ -526,7 +526,7 @@ { struct irlan_cb *self; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(priv != NULL, return;); @@ -539,7 +539,7 @@ /* Check if request succeeded */ if (result != IAS_SUCCESS) { - IRDA_DEBUG(2, __FUNCTION__ "(), got NULL value!\n"); + IRDA_DEBUG(2, "%s(), got NULL value!\n", __FUNCTION__); irlan_do_client_event(self, IRLAN_IAS_PROVIDER_NOT_AVAIL, NULL); return; @@ -557,7 +557,7 @@ irias_delete_value(value); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), unknown type!\n"); + IRDA_DEBUG(2, "%s(), unknown type!\n", __FUNCTION__); break; } irlan_do_client_event(self, IRLAN_IAS_PROVIDER_NOT_AVAIL, NULL); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlan/irlan_client_event.c linux-2.4.23-pre8/net/irda/irlan/irlan_client_event.c --- linux-2.4.22/net/irda/irlan/irlan_client_event.c 2000-11-28 02:07:31.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlan/irlan_client_event.c 2003-10-22 22:48:21.000000000 +0000 @@ -92,7 +92,7 @@ static int irlan_client_state_idle(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRLAN_MAGIC, return -1;); @@ -100,8 +100,7 @@ switch (event) { case IRLAN_DISCOVERY_INDICATION: if (self->client.iriap) { - WARNING(__FUNCTION__ - "(), busy with a previous query\n"); + WARNING("%s(), busy with a previous query\n", __FUNCTION__); return -EBUSY; } @@ -114,10 +113,10 @@ "IrLAN", "IrDA:TinyTP:LsapSel"); break; case IRLAN_WATCHDOG_TIMEOUT: - IRDA_DEBUG(2, __FUNCTION__ "(), IRLAN_WATCHDOG_TIMEOUT\n"); + IRDA_DEBUG(2, "%s(), IRLAN_WATCHDOG_TIMEOUT\n", __FUNCTION__); break; default: - IRDA_DEBUG(4, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(4, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -136,7 +135,7 @@ static int irlan_client_state_query(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRLAN_MAGIC, return -1;); @@ -154,7 +153,7 @@ irlan_next_client_state(self, IRLAN_CONN); break; case IRLAN_IAS_PROVIDER_NOT_AVAIL: - IRDA_DEBUG(2, __FUNCTION__ "(), IAS_PROVIDER_NOT_AVAIL\n"); + IRDA_DEBUG(2, "%s(), IAS_PROVIDER_NOT_AVAIL\n", __FUNCTION__); irlan_next_client_state(self, IRLAN_IDLE); /* Give the client a kick! */ @@ -167,10 +166,10 @@ irlan_next_client_state(self, IRLAN_IDLE); break; case IRLAN_WATCHDOG_TIMEOUT: - IRDA_DEBUG(2, __FUNCTION__ "(), IRLAN_WATCHDOG_TIMEOUT\n"); + IRDA_DEBUG(2, "%s(), IRLAN_WATCHDOG_TIMEOUT\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__"(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -189,7 +188,7 @@ static int irlan_client_state_conn(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -204,10 +203,10 @@ irlan_next_client_state(self, IRLAN_IDLE); break; case IRLAN_WATCHDOG_TIMEOUT: - IRDA_DEBUG(2, __FUNCTION__ "(), IRLAN_WATCHDOG_TIMEOUT\n"); + IRDA_DEBUG(2, "%s(), IRLAN_WATCHDOG_TIMEOUT\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -224,7 +223,7 @@ static int irlan_client_state_info(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -244,10 +243,10 @@ irlan_next_client_state(self, IRLAN_IDLE); break; case IRLAN_WATCHDOG_TIMEOUT: - IRDA_DEBUG(2, __FUNCTION__ "(), IRLAN_WATCHDOG_TIMEOUT\n"); + IRDA_DEBUG(2, "%s(), IRLAN_WATCHDOG_TIMEOUT\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -266,7 +265,7 @@ static int irlan_client_state_media(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -281,10 +280,10 @@ irlan_next_client_state(self, IRLAN_IDLE); break; case IRLAN_WATCHDOG_TIMEOUT: - IRDA_DEBUG(2, __FUNCTION__ "(), IRLAN_WATCHDOG_TIMEOUT\n"); + IRDA_DEBUG(2, "%s(), IRLAN_WATCHDOG_TIMEOUT\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -305,7 +304,7 @@ { struct qos_info qos; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -344,7 +343,7 @@ irlan_next_client_state(self, IRLAN_DATA); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), unknown access type!\n"); + IRDA_DEBUG(2, "%s(), unknown access type!\n", __FUNCTION__); break; } break; @@ -353,10 +352,10 @@ irlan_next_client_state(self, IRLAN_IDLE); break; case IRLAN_WATCHDOG_TIMEOUT: - IRDA_DEBUG(2, __FUNCTION__ "(), IRLAN_WATCHDOG_TIMEOUT\n"); + IRDA_DEBUG(2, "%s(), IRLAN_WATCHDOG_TIMEOUT\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } @@ -376,7 +375,7 @@ static int irlan_client_state_wait(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -390,10 +389,10 @@ irlan_next_client_state(self, IRLAN_IDLE); break; case IRLAN_WATCHDOG_TIMEOUT: - IRDA_DEBUG(2, __FUNCTION__ "(), IRLAN_WATCHDOG_TIMEOUT\n"); + IRDA_DEBUG(2, "%s(), IRLAN_WATCHDOG_TIMEOUT\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -407,7 +406,7 @@ { struct qos_info qos; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -429,7 +428,7 @@ } else if (self->client.recv_arb_val > self->provider.send_arb_val) { - IRDA_DEBUG(2, __FUNCTION__ "(), lost the battle :-(\n"); + IRDA_DEBUG(2, "%s(), lost the battle :-(\n", __FUNCTION__); } break; case IRLAN_DATA_CONNECT_INDICATION: @@ -440,10 +439,10 @@ irlan_next_client_state(self, IRLAN_IDLE); break; case IRLAN_WATCHDOG_TIMEOUT: - IRDA_DEBUG(2, __FUNCTION__ "(), IRLAN_WATCHDOG_TIMEOUT\n"); + IRDA_DEBUG(2, "%s(), IRLAN_WATCHDOG_TIMEOUT\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -462,7 +461,7 @@ static int irlan_client_state_data(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRLAN_MAGIC, return -1;); @@ -476,7 +475,7 @@ irlan_next_client_state(self, IRLAN_IDLE); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -494,7 +493,7 @@ static int irlan_client_state_close(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if (skb) dev_kfree_skb(skb); @@ -511,7 +510,7 @@ static int irlan_client_state_sync(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if (skb) dev_kfree_skb(skb); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlan/irlan_common.c linux-2.4.23-pre8/net/irda/irlan/irlan_common.c --- linux-2.4.22/net/irda/irlan/irlan_common.c 2002-02-25 19:38:14.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlan/irlan_common.c 2003-10-22 22:47:28.000000000 +0000 @@ -122,7 +122,7 @@ struct irlan_cb *new; __u16 hints; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); /* Allocate master structure */ irlan = hashbin_new(HB_LOCAL); if (irlan == NULL) { @@ -133,7 +133,7 @@ create_proc_info_entry("irlan", 0, proc_irda, irlan_proc_read); #endif /* CONFIG_PROC_FS */ - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); hints = irlmp_service_to_hint(S_LAN); /* Register with IrLMP as a client */ @@ -157,7 +157,7 @@ void irlan_cleanup(void) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); irlmp_unregister_client(ckey); irlmp_unregister_service(skey); @@ -181,7 +181,7 @@ { int i=0; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); /* Check if we should call the device eth or irlan */ if (!eth) { @@ -192,7 +192,7 @@ } if (register_netdev(&self->dev) != 0) { - IRDA_DEBUG(2, __FUNCTION__ "(), register_netdev() failed!\n"); + IRDA_DEBUG(2, "%s(), register_netdev() failed!\n", __FUNCTION__); return -1; } return 0; @@ -208,7 +208,7 @@ { struct irlan_cb *self; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(irlan != NULL, return NULL;); /* @@ -264,7 +264,7 @@ { struct sk_buff *skb; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -301,7 +301,7 @@ struct irlan_cb *self; struct tsap_cb *tsap; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); self = (struct irlan_cb *) instance; tsap = (struct tsap_cb *) sap; @@ -390,7 +390,7 @@ struct irlan_cb *self; struct tsap_cb *tsap; - IRDA_DEBUG(0, __FUNCTION__ "(), reason=%d\n", reason); + IRDA_DEBUG(0, "%s(), reason=%d\n", __FUNCTION__, reason); self = (struct irlan_cb *) instance; tsap = (struct tsap_cb *) sap; @@ -409,22 +409,22 @@ switch (reason) { case LM_USER_REQUEST: /* User request */ - IRDA_DEBUG(2, __FUNCTION__ "(), User requested\n"); + IRDA_DEBUG(2, "%s(), User requested\n", __FUNCTION__); break; case LM_LAP_DISCONNECT: /* Unexpected IrLAP disconnect */ - IRDA_DEBUG(2, __FUNCTION__ "(), Unexpected IrLAP disconnect\n"); + IRDA_DEBUG(2, "%s(), Unexpected IrLAP disconnect\n", __FUNCTION__); break; case LM_CONNECT_FAILURE: /* Failed to establish IrLAP connection */ - IRDA_DEBUG(2, __FUNCTION__ "(), IrLAP connect failed\n"); + IRDA_DEBUG(2, "%s(), IrLAP connect failed\n", __FUNCTION__); break; case LM_LAP_RESET: /* IrLAP reset */ - IRDA_DEBUG(2, __FUNCTION__ "(), IrLAP reset\n"); + IRDA_DEBUG(2, "%s(), IrLAP reset\n", __FUNCTION__); break; case LM_INIT_DISCONNECT: - IRDA_DEBUG(2, __FUNCTION__ "(), IrLMP connect failed\n"); + IRDA_DEBUG(2, "%s(), IrLMP connect failed\n", __FUNCTION__); break; default: - ERROR(__FUNCTION__ "(), Unknown disconnect reason\n"); + ERROR("%s(), Unknown disconnect reason\n", __FUNCTION__); break; } @@ -446,7 +446,7 @@ struct tsap_cb *tsap; notify_t notify; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -468,7 +468,7 @@ tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT, ¬ify); if (!tsap) { - IRDA_DEBUG(2, __FUNCTION__ "(), Got no tsap!\n"); + IRDA_DEBUG(2, "%s(), Got no tsap!\n", __FUNCTION__); return; } self->tsap_data = tsap; @@ -482,7 +482,7 @@ void irlan_close_tsaps(struct irlan_cb *self) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -572,7 +572,7 @@ { struct sk_buff *skb; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); if (irda_lock(&self->client.tx_busy) == FALSE) return -EBUSY; @@ -591,7 +591,7 @@ dev_kfree_skb(skb); return -1; } - IRDA_DEBUG(2, __FUNCTION__ "(), sending ...\n"); + IRDA_DEBUG(2, "%s(), sending ...\n", __FUNCTION__); return irttp_data_request(self->client.tsap_ctrl, skb); } @@ -604,7 +604,7 @@ */ void irlan_ctrl_data_request(struct irlan_cb *self, struct sk_buff *skb) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Queue command */ skb_queue_tail(&self->client.txq, skb); @@ -624,7 +624,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -656,7 +656,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -688,7 +688,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -727,7 +727,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -765,7 +765,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -804,7 +804,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -844,7 +844,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -879,7 +879,7 @@ struct sk_buff *skb; __u8 *frame; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -964,7 +964,7 @@ int n=0; if (skb == NULL) { - IRDA_DEBUG(2, __FUNCTION__ "(), Got NULL skb\n"); + IRDA_DEBUG(2, "%s(), Got NULL skb\n", __FUNCTION__); return 0; } @@ -981,7 +981,7 @@ ASSERT(value_len > 0, return 0;); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown parameter type!\n"); + IRDA_DEBUG(2, "%s(), Unknown parameter type!\n", __FUNCTION__); return 0; break; } @@ -991,7 +991,7 @@ /* Make space for data */ if (skb_tailroom(skb) < (param_len+value_len+3)) { - IRDA_DEBUG(2, __FUNCTION__ "(), No more space at end of skb\n"); + IRDA_DEBUG(2, "%s(), No more space at end of skb\n", __FUNCTION__); return 0; } skb_put(skb, param_len+value_len+3); @@ -1038,13 +1038,13 @@ __u16 val_len; int n=0; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); /* get length of parameter name (1 byte) */ name_len = buf[n++]; if (name_len > 254) { - IRDA_DEBUG(2, __FUNCTION__ "(), name_len > 254\n"); + IRDA_DEBUG(2, "%s(), name_len > 254\n", __FUNCTION__); return -RSP_INVALID_COMMAND_FORMAT; } @@ -1061,7 +1061,7 @@ le16_to_cpus(&val_len); n+=2; if (val_len > 1016) { - IRDA_DEBUG(2, __FUNCTION__ "(), parameter length to long\n"); + IRDA_DEBUG(2, "%s(), parameter length to long\n", __FUNCTION__); return -RSP_INVALID_COMMAND_FORMAT; } *len = val_len; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlan/irlan_eth.c linux-2.4.23-pre8/net/irda/irlan/irlan_eth.c --- linux-2.4.22/net/irda/irlan/irlan_eth.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlan/irlan_eth.c 2003-10-22 22:48:15.000000000 +0000 @@ -51,7 +51,7 @@ { struct irlan_cb *self; - IRDA_DEBUG(2, __FUNCTION__"()\n"); + IRDA_DEBUG(2,"%s()\n", __FUNCTION__); ASSERT(dev != NULL, return -1;); @@ -109,7 +109,7 @@ { struct irlan_cb *self; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(dev != NULL, return -1;); @@ -143,7 +143,7 @@ struct irlan_cb *self = (struct irlan_cb *) dev->priv; struct sk_buff *skb; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Stop device */ netif_stop_queue(dev); @@ -354,14 +354,14 @@ self = dev->priv; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); /* Check if data channel has been connected yet */ if (self->client.state != IRLAN_DATA) { - IRDA_DEBUG(1, __FUNCTION__ "(), delaying!\n"); + IRDA_DEBUG(1, "%s(), delaying!\n", __FUNCTION__); return; } @@ -371,20 +371,20 @@ } else if ((dev->flags & IFF_ALLMULTI) || dev->mc_count > HW_MAX_ADDRS) { /* Disable promiscuous mode, use normal mode. */ - IRDA_DEBUG(4, __FUNCTION__ "(), Setting multicast filter\n"); + IRDA_DEBUG(4, "%s(), Setting multicast filter\n", __FUNCTION__); /* hardware_set_filter(NULL); */ irlan_set_multicast_filter(self, TRUE); } else if (dev->mc_count) { - IRDA_DEBUG(4, __FUNCTION__ "(), Setting multicast filter\n"); + IRDA_DEBUG(4, "%s(), Setting multicast filter\n", __FUNCTION__); /* Walk the address list, and load the filter */ /* hardware_set_filter(dev->mc_list); */ irlan_set_multicast_filter(self, TRUE); } else { - IRDA_DEBUG(4, __FUNCTION__ "(), Clearing multicast filter\n"); + IRDA_DEBUG(4, "%s(), Clearing multicast filter\n", __FUNCTION__); irlan_set_multicast_filter(self, FALSE); } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlan/irlan_event.c linux-2.4.23-pre8/net/irda/irlan/irlan_event.c --- linux-2.4.22/net/irda/irlan/irlan_event.c 1999-11-03 01:07:55.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlan/irlan_event.c 2003-10-22 22:49:37.000000000 +0000 @@ -40,7 +40,7 @@ void irlan_next_client_state(struct irlan_cb *self, IRLAN_STATE state) { - IRDA_DEBUG(2, __FUNCTION__"(), %s\n", irlan_state[state]); + IRDA_DEBUG(2, "%s(), %s\n", __FUNCTION__, irlan_state[state]); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); @@ -50,7 +50,7 @@ void irlan_next_provider_state(struct irlan_cb *self, IRLAN_STATE state) { - IRDA_DEBUG(2, __FUNCTION__"(), %s\n", irlan_state[state]); + IRDA_DEBUG(2, "%s(), %s\n", __FUNCTION__, irlan_state[state]); ASSERT(self != NULL, return;); ASSERT(self->magic == IRLAN_MAGIC, return;); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlan/irlan_filter.c linux-2.4.23-pre8/net/irda/irlan/irlan_filter.c --- linux-2.4.22/net/irda/irlan/irlan_filter.c 1999-11-03 01:07:55.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlan/irlan_filter.c 2003-10-22 22:49:41.000000000 +0000 @@ -143,7 +143,7 @@ { __u8 *bytes; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); bytes = value; @@ -156,7 +156,7 @@ * This is experimental!! DB. */ if (strcmp(param, "MODE") == 0) { - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); self->use_udata = TRUE; return; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlan/irlan_provider.c linux-2.4.23-pre8/net/irda/irlan/irlan_provider.c --- linux-2.4.22/net/irda/irlan/irlan_provider.c 2001-03-02 19:12:12.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlan/irlan_provider.c 2003-10-22 22:48:31.000000000 +0000 @@ -70,7 +70,7 @@ struct irlan_cb *self; __u8 code; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); self = (struct irlan_cb *) instance; @@ -99,15 +99,15 @@ irlan_do_provider_event(self, IRLAN_FILTER_CONFIG_CMD, skb); break; case CMD_RECONNECT_DATA_CHAN: - IRDA_DEBUG(2, __FUNCTION__"(), Got RECONNECT_DATA_CHAN command\n"); - IRDA_DEBUG(2, __FUNCTION__"(), NOT IMPLEMENTED\n"); + IRDA_DEBUG(2, "%s(), Got RECONNECT_DATA_CHAN command\n", __FUNCTION__); + IRDA_DEBUG(2, "%s(), NOT IMPLEMENTED\n", __FUNCTION__); break; case CMD_CLOSE_DATA_CHAN: IRDA_DEBUG(2, "Got CLOSE_DATA_CHAN command!\n"); - IRDA_DEBUG(2, __FUNCTION__"(), NOT IMPLEMENTED\n"); + IRDA_DEBUG(2, "%s(), NOT IMPLEMENTED\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown command!\n"); + IRDA_DEBUG(2, "%s(), Unknown command!\n", __FUNCTION__); break; } return 0; @@ -129,7 +129,7 @@ struct tsap_cb *tsap; __u32 saddr, daddr; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); self = (struct irlan_cb *) instance; tsap = (struct tsap_cb *) sap; @@ -182,7 +182,7 @@ struct irlan_cb *self; struct tsap_cb *tsap; - IRDA_DEBUG(4, __FUNCTION__ "(), reason=%d\n", reason); + IRDA_DEBUG(4, "%s(), reason=%d\n", __FUNCTION__, reason); self = (struct irlan_cb *) instance; tsap = (struct tsap_cb *) sap; @@ -236,7 +236,7 @@ ASSERT(skb != NULL, return -RSP_PROTOCOL_ERROR;); - IRDA_DEBUG(4, __FUNCTION__ "(), skb->len=%d\n", (int)skb->len); + IRDA_DEBUG(4, "%s(), skb->len=%d\n", __FUNCTION__, (int)skb->len); ASSERT(self != NULL, return -RSP_PROTOCOL_ERROR;); ASSERT(self->magic == IRLAN_MAGIC, return -RSP_PROTOCOL_ERROR;); @@ -266,7 +266,7 @@ for (i=0; imagic == IRLAN_MAGIC, return;); @@ -316,7 +316,7 @@ irlan_insert_string_param(skb, "MEDIA", "802.5"); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), unknown media type!\n"); + IRDA_DEBUG(2, "%s(), unknown media type!\n", __FUNCTION__); break; } irlan_insert_short_param(skb, "IRLAN_VER", 0x0101); @@ -340,7 +340,7 @@ irlan_insert_string_param(skb, "ACCESS_TYPE", "HOSTED"); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown access type\n"); + IRDA_DEBUG(2, "%s(), Unknown access type\n", __FUNCTION__); break; } irlan_insert_short_param(skb, "MAX_FRAME", 0x05ee); @@ -361,7 +361,7 @@ handle_filter_request(self, skb); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown command!\n"); + IRDA_DEBUG(2, "%s(), Unknown command!\n", __FUNCTION__); break; } @@ -379,7 +379,7 @@ struct tsap_cb *tsap; notify_t notify; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRLAN_MAGIC, return -1;); @@ -400,7 +400,7 @@ tsap = irttp_open_tsap(LSAP_ANY, 1, ¬ify); if (!tsap) { - IRDA_DEBUG(2, __FUNCTION__ "(), Got no tsap!\n"); + IRDA_DEBUG(2, "%s(), Got no tsap!\n", __FUNCTION__); return -1; } self->provider.tsap_ctrl = tsap; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlan/irlan_provider_event.c linux-2.4.23-pre8/net/irda/irlan/irlan_provider_event.c --- linux-2.4.22/net/irda/irlan/irlan_provider_event.c 1999-11-03 01:07:55.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlan/irlan_provider_event.c 2003-10-22 22:49:01.000000000 +0000 @@ -72,7 +72,7 @@ static int irlan_provider_state_idle(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -82,7 +82,7 @@ irlan_next_provider_state( self, IRLAN_INFO); break; default: - IRDA_DEBUG(4, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(4, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -101,7 +101,7 @@ { int ret; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -147,7 +147,7 @@ irlan_next_provider_state(self, IRLAN_IDLE); break; default: - IRDA_DEBUG( 0, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG( 0, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -166,7 +166,7 @@ static int irlan_provider_state_open(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); @@ -186,7 +186,7 @@ irlan_next_provider_state(self, IRLAN_IDLE); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) @@ -205,7 +205,7 @@ static int irlan_provider_state_data(struct irlan_cb *self, IRLAN_EVENT event, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == IRLAN_MAGIC, return -1;); @@ -221,7 +221,7 @@ irlan_next_provider_state(self, IRLAN_IDLE); break; default: - IRDA_DEBUG( 0, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG( 0, "%s(), Unknown event %d\n", __FUNCTION__, event); break; } if (skb) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlap_event.c linux-2.4.23-pre8/net/irda/irlap_event.c --- linux-2.4.22/net/irda/irlap_event.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlap_event.c 2003-10-22 22:49:05.000000000 +0000 @@ -217,7 +217,7 @@ } else self->fast_RR = FALSE; - IRDA_DEBUG(3, __FUNCTION__ "(), timeout=%d (%ld)\n", timeout, jiffies); + IRDA_DEBUG(3, "%s(), timeout=%d (%ld)\n", __FUNCTION__, timeout, jiffies); #endif /* CONFIG_IRDA_FAST_RR */ if (timeout == 0) @@ -241,7 +241,7 @@ if (!self || self->magic != LAP_MAGIC) return; - IRDA_DEBUG(3, __FUNCTION__ "(), event = %s, state = %s\n", + IRDA_DEBUG(3, "%s(), event = %s, state = %s\n", __FUNCTION__, irlap_event[event], irlap_state[self->state]); ret = (*state[self->state])(self, event, skb, info); @@ -259,7 +259,7 @@ * try to disconnect link if we send any data frames, since * that will change the state away form XMIT */ - IRDA_DEBUG(2, __FUNCTION__ "() : queue len = %d\n", + IRDA_DEBUG(2, "%s() : queue len = %d\n", __FUNCTION__, skb_queue_len(&self->txq)); if (skb_queue_len(&self->txq)) { @@ -353,8 +353,7 @@ /* Note : this will never happen, because we test * media busy in irlap_connect_request() and * postpone the event... - Jean II */ - IRDA_DEBUG(0, __FUNCTION__ - "(), CONNECT_REQUEST: media busy!\n"); + IRDA_DEBUG(0, "%s(), CONNECT_REQUEST: media busy!\n", __FUNCTION__); /* Always switch state before calling upper layers */ irlap_next_state(self, LAP_NDM); @@ -380,15 +379,15 @@ irlap_connect_indication(self, skb); } else { - IRDA_DEBUG(0, __FUNCTION__ "(), SNRM frame does not " - "contain an I field!\n"); + IRDA_DEBUG(0, "%s(), SNRM frame does not " + "contain an I field!\n", __FUNCTION__); } break; case DISCOVERY_REQUEST: ASSERT(info != NULL, return -1;); if (self->media_busy) { - IRDA_DEBUG(0, __FUNCTION__ "(), media busy!\n"); + IRDA_DEBUG(0, "%s(), media busy!\n", __FUNCTION__); /* irlap->log.condition = MEDIA_BUSY; */ /* This will make IrLMP try again */ @@ -450,7 +449,7 @@ * log (and post an event). * Jean II */ - IRDA_DEBUG(1, __FUNCTION__ "(), Receiving final discovery request, missed the discovery slots :-(\n"); + IRDA_DEBUG(1, "%s(), Receiving final discovery request, missed the discovery slots :-(\n", __FUNCTION__); /* Last discovery request -> in the log */ irlap_discovery_indication(self, info->discovery); @@ -526,8 +525,7 @@ case RECV_UI_FRAME: /* Only accept broadcast frames in NDM mode */ if (info->caddr != CBROADCAST) { - IRDA_DEBUG(0, __FUNCTION__ - "(), not a broadcast frame!\n"); + IRDA_DEBUG(0, "%s(), not a broadcast frame!\n", __FUNCTION__); } else irlap_unitdata_indication(self, skb); break; @@ -543,10 +541,10 @@ irlap_send_test_frame(self, CBROADCAST, info->daddr, skb); break; case RECV_TEST_RSP: - IRDA_DEBUG(0, __FUNCTION__ "() not implemented!\n"); + IRDA_DEBUG(0, "%s() not implemented!\n", __FUNCTION__); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n", + IRDA_DEBUG(2, "%s(), Unknown event %s\n", __FUNCTION__, irlap_event[event]); ret = -1; @@ -574,13 +572,13 @@ ASSERT(info != NULL, return -1;); ASSERT(info->discovery != NULL, return -1;); - IRDA_DEBUG(4, __FUNCTION__ "(), daddr=%08x\n", + IRDA_DEBUG(4, "%s(), daddr=%08x\n", __FUNCTION__, info->discovery->daddr); if (!self->discovery_log) { - WARNING(__FUNCTION__ "(), discovery log is gone! " + WARNING("%s(), discovery log is gone! " "maybe the discovery timeout has been set to " - "short?\n"); + "short?\n", __FUNCTION__); break; } hashbin_insert(self->discovery_log, @@ -605,7 +603,7 @@ ASSERT(info != NULL, return -1;); - IRDA_DEBUG(1, __FUNCTION__ "(), Receiving discovery request (s = %d) while performing discovery :-(\n", info->s); + IRDA_DEBUG(1, "%s(), Receiving discovery request (s = %d) while performing discovery :-(\n", __FUNCTION__, info->s); /* Last discovery request ? */ if (info->s == 0xff) @@ -619,9 +617,8 @@ * timing requirements. */ if (irda_device_is_receiving(self->netdev) && !self->add_wait) { - IRDA_DEBUG(2, __FUNCTION__ - "(), device is slow to answer, " - "waiting some more!\n"); + IRDA_DEBUG(2, "%s(), device is slow to answer, " + "waiting some more!\n", __FUNCTION__); irlap_start_slot_timer(self, MSECS_TO_JIFFIES(10)); self->add_wait = TRUE; return ret; @@ -657,7 +654,7 @@ } break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n", + IRDA_DEBUG(2, "%s(), Unknown event %s\n", __FUNCTION__, irlap_event[event]); ret = -1; @@ -679,14 +676,14 @@ discovery_t *discovery_rsp; int ret=0; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == LAP_MAGIC, return -1;); switch (event) { case QUERY_TIMER_EXPIRED: - IRDA_DEBUG(2, __FUNCTION__ "(), QUERY_TIMER_EXPIRED <%ld>\n", + IRDA_DEBUG(2, "%s(), QUERY_TIMER_EXPIRED <%ld>\n", __FUNCTION__, jiffies); irlap_next_state(self, LAP_NDM); break; @@ -715,7 +712,7 @@ } break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %d, %s\n", event, + IRDA_DEBUG(1, "%s(), Unknown event %d, %s\n", __FUNCTION__, event, irlap_event[event]); ret = -1; @@ -736,7 +733,7 @@ { int ret = 0; - IRDA_DEBUG(4, __FUNCTION__ "(), event=%s\n", irlap_event[ event]); + IRDA_DEBUG(4, "%s(), event=%s\n", __FUNCTION__, irlap_event[ event]); ASSERT(self != NULL, return -1;); ASSERT(self->magic == LAP_MAGIC, return -1;); @@ -796,19 +793,18 @@ break; case RECV_DISCOVERY_XID_CMD: - IRDA_DEBUG(3, __FUNCTION__ - "(), event RECV_DISCOVER_XID_CMD!\n"); + IRDA_DEBUG(3, "%s(), event RECV_DISCOVER_XID_CMD!\n", __FUNCTION__); irlap_next_state(self, LAP_NDM); break; case DISCONNECT_REQUEST: - IRDA_DEBUG(0, __FUNCTION__ "(), Disconnect request!\n"); + IRDA_DEBUG(0, "%s(), Disconnect request!\n", __FUNCTION__); irlap_send_dm_frame(self); irlap_next_state( self, LAP_NDM); irlap_disconnect_indication(self, LAP_DISC_INDICATION); break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %d, %s\n", event, + IRDA_DEBUG(1, "%s(), Unknown event %d, %s\n", __FUNCTION__, event, irlap_event[event]); ret = -1; @@ -830,7 +826,7 @@ { int ret = 0; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == LAP_MAGIC, return -1;); @@ -859,7 +855,7 @@ self->retry_count++; break; case RECV_SNRM_CMD: - IRDA_DEBUG(4, __FUNCTION__ "(), SNRM battle!\n"); + IRDA_DEBUG(4, "%s(), SNRM battle!\n", __FUNCTION__); ASSERT(skb != NULL, return 0;); ASSERT(info != NULL, return 0;); @@ -940,7 +936,7 @@ irlap_disconnect_indication(self, LAP_DISC_INDICATION); break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %d, %s\n", event, + IRDA_DEBUG(1, "%s(), Unknown event %d, %s\n", __FUNCTION__, event, irlap_event[event]); ret = -1; @@ -958,7 +954,7 @@ static int irlap_state_offline(struct irlap_cb *self, IRLAP_EVENT event, struct sk_buff *skb, struct irlap_info *info) { - IRDA_DEBUG( 0, __FUNCTION__ "(), Unknown event\n"); + IRDA_DEBUG( 0, "%s(), Unknown event\n", __FUNCTION__); return -1; } @@ -989,9 +985,8 @@ * speed and turn-around-time. */ if (skb->len > self->bytes_left) { - IRDA_DEBUG(4, __FUNCTION__ - "(), Not allowed to transmit more " - "bytes!\n"); + IRDA_DEBUG(4, "%s(), Not allowed to transmit more " + "bytes!\n", __FUNCTION__); skb_queue_head(&self->txq, skb_get(skb)); /* * We should switch state to LAP_NRM_P, but @@ -1029,8 +1024,7 @@ self->fast_RR = FALSE; #endif /* CONFIG_IRDA_FAST_RR */ } else { - IRDA_DEBUG(4, __FUNCTION__ - "(), Unable to send! remote busy?\n"); + IRDA_DEBUG(4, "%s(), Unable to send! remote busy?\n", __FUNCTION__); skb_queue_head(&self->txq, skb_get(skb)); /* @@ -1041,7 +1035,7 @@ } break; case POLL_TIMER_EXPIRED: - IRDA_DEBUG(3, __FUNCTION__ "(), POLL_TIMER_EXPIRED (%ld)\n", + IRDA_DEBUG(3, "%s(), POLL_TIMER_EXPIRED (%ld)\n", __FUNCTION__, jiffies); irlap_send_rr_frame(self, CMD_FRAME); /* Return to NRM properly - Jean II */ @@ -1067,7 +1061,7 @@ * when we return... - Jean II */ break; default: - IRDA_DEBUG(0, __FUNCTION__ "(), Unknown event %s\n", + IRDA_DEBUG(0, "%s(), Unknown event %s\n", __FUNCTION__, irlap_event[event]); ret = -EINVAL; @@ -1086,7 +1080,7 @@ { int ret = 0; - IRDA_DEBUG(1, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == LAP_MAGIC, return -1;); @@ -1121,7 +1115,7 @@ } break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %d\n", event); + IRDA_DEBUG(1, "%s(), Unknown event %d\n", __FUNCTION__, event); ret = -1; break; @@ -1234,8 +1228,7 @@ /* Keep state */ irlap_next_state(self, LAP_NRM_P); } else { - IRDA_DEBUG(4, __FUNCTION__ - "(), missing or duplicate frame!\n"); + IRDA_DEBUG(4, "%s(), missing or duplicate frame!\n", __FUNCTION__); /* Update Nr received */ irlap_update_nr_received(self, info->nr); @@ -1299,8 +1292,7 @@ if ((ns_status == NS_UNEXPECTED) && (nr_status == NR_UNEXPECTED)) { - IRDA_DEBUG(4, __FUNCTION__ - "(), unexpected nr and ns!\n"); + IRDA_DEBUG(4, "%s(), unexpected nr and ns!\n", __FUNCTION__); if (info->pf) { /* Resend rejected frames */ irlap_resend_rejected_frames(self, CMD_FRAME); @@ -1339,9 +1331,8 @@ } break; } - IRDA_DEBUG(1, __FUNCTION__ "(), Not implemented!\n"); - IRDA_DEBUG(1, __FUNCTION__ - "(), event=%s, ns_status=%d, nr_status=%d\n", + IRDA_DEBUG(1, "%s(), Not implemented!\n", __FUNCTION__); + IRDA_DEBUG(1, "%s(), event=%s, ns_status=%d, nr_status=%d\n", __FUNCTION__, irlap_event[ event], ns_status, nr_status); break; case RECV_UI_FRAME: @@ -1353,7 +1344,7 @@ del_timer(&self->final_timer); irlap_data_indication(self, skb, TRUE); irlap_next_state(self, LAP_XMIT_P); - printk(__FUNCTION__ "(): RECV_UI_FRAME: next state %s\n", irlap_state[self->state]); + printk("%s(): RECV_UI_FRAME: next state %s\n", __FUNCTION__, irlap_state[self->state]); irlap_start_poll_timer(self, self->poll_timeout); } break; @@ -1406,8 +1397,8 @@ irlap_next_state(self, LAP_NRM_P); } else if (ret == NR_INVALID) { - IRDA_DEBUG(1, __FUNCTION__ "(), Received RR with " - "invalid nr !\n"); + IRDA_DEBUG(1, "%s(), Received RR with " + "invalid nr !\n", __FUNCTION__); del_timer(&self->final_timer); irlap_next_state(self, LAP_RESET_WAIT); @@ -1507,7 +1498,7 @@ irlap_start_final_timer(self, self->final_timeout); break; case RECV_RD_RSP: - IRDA_DEBUG(1, __FUNCTION__ "(), RECV_RD_RSP\n"); + IRDA_DEBUG(1, "%s(), RECV_RD_RSP\n", __FUNCTION__); irlap_flush_all_queues(self); irlap_next_state(self, LAP_XMIT_P); @@ -1515,7 +1506,7 @@ irlap_disconnect_request(self); break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %s\n", + IRDA_DEBUG(1, "%s(), Unknown event %s\n", __FUNCTION__, irlap_event[event]); ret = -1; @@ -1536,7 +1527,7 @@ { int ret = 0; - IRDA_DEBUG(3, __FUNCTION__ "(), event = %s\n", irlap_event[event]); + IRDA_DEBUG(3, "%s(), event = %s\n", __FUNCTION__, irlap_event[event]); ASSERT(self != NULL, return -1;); ASSERT(self->magic == LAP_MAGIC, return -1;); @@ -1562,7 +1553,7 @@ irlap_next_state( self, LAP_PCLOSE); break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n", + IRDA_DEBUG(2, "%s(), Unknown event %s\n", __FUNCTION__, irlap_event[event]); ret = -1; @@ -1583,7 +1574,7 @@ { int ret = 0; - IRDA_DEBUG(3, __FUNCTION__ "(), event = %s\n", irlap_event[event]); + IRDA_DEBUG(3, "%s(), event = %s\n", __FUNCTION__, irlap_event[event]); ASSERT(self != NULL, return -1;); ASSERT(self->magic == LAP_MAGIC, return -1;); @@ -1641,7 +1632,7 @@ * state */ if (!info) { - IRDA_DEBUG(3, __FUNCTION__ "(), RECV_SNRM_CMD\n"); + IRDA_DEBUG(3, "%s(), RECV_SNRM_CMD\n", __FUNCTION__); irlap_initiate_connection_state(self); irlap_wait_min_turn_around(self, &self->qos_tx); irlap_send_ua_response_frame(self, &self->qos_rx); @@ -1649,12 +1640,11 @@ irlap_start_wd_timer(self, self->wd_timeout); irlap_next_state(self, LAP_NDM); } else { - IRDA_DEBUG(0, __FUNCTION__ - "(), SNRM frame contained an I field!\n"); + IRDA_DEBUG(0, "%s(), SNRM frame contained an I field!\n", __FUNCTION__); } break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %s\n", + IRDA_DEBUG(1, "%s(), Unknown event %s\n", __FUNCTION__, irlap_event[event]); ret = -1; @@ -1675,7 +1665,7 @@ { int ret = 0; - IRDA_DEBUG(4, __FUNCTION__ "(), event=%s\n", irlap_event[event]); + IRDA_DEBUG(4, "%s(), event=%s\n", __FUNCTION__, irlap_event[event]); ASSERT(self != NULL, return -ENODEV;); ASSERT(self->magic == LAP_MAGIC, return -EBADR;); @@ -1731,7 +1721,7 @@ ret = -EPROTO; } } else { - IRDA_DEBUG(2, __FUNCTION__ "(), Unable to send!\n"); + IRDA_DEBUG(2, "%s(), Unable to send!\n", __FUNCTION__); skb_queue_head(&self->txq, skb_get(skb)); ret = -EPROTO; } @@ -1747,7 +1737,7 @@ * when we return... - Jean II */ break; default: - IRDA_DEBUG(2, __FUNCTION__ "(), Unknown event %s\n", + IRDA_DEBUG(2, "%s(), Unknown event %s\n", __FUNCTION__, irlap_event[event]); ret = -EINVAL; @@ -1770,7 +1760,7 @@ int nr_status; int ret = 0; - IRDA_DEBUG(4, __FUNCTION__ "(), event=%s\n", irlap_event[ event]); + IRDA_DEBUG(4, "%s(), event=%s\n", __FUNCTION__, irlap_event[ event]); ASSERT(self != NULL, return -1;); ASSERT(self->magic == LAP_MAGIC, return -1;); @@ -1778,8 +1768,8 @@ switch (event) { case RECV_I_CMD: /* Optimize for the common case */ /* FIXME: must check for remote_busy below */ - IRDA_DEBUG(4, __FUNCTION__ "(), event=%s nr=%d, vs=%d, ns=%d, " - "vr=%d, pf=%d\n", irlap_event[event], info->nr, + IRDA_DEBUG(4, "%s(), event=%s nr=%d, vs=%d, ns=%d, " + "vr=%d, pf=%d\n", __FUNCTION__, irlap_event[event], info->nr, self->vs, info->ns, self->vr, info->pf); self->retry_count = 0; @@ -2011,21 +2001,19 @@ /* Keep state */ irlap_next_state(self, LAP_NRM_S); } else { - IRDA_DEBUG(1, __FUNCTION__ - "(), invalid nr not implemented!\n"); + IRDA_DEBUG(1, "%s(), invalid nr not implemented!\n", __FUNCTION__); } break; case RECV_SNRM_CMD: /* SNRM frame is not allowed to contain an I-field */ if (!info) { del_timer(&self->wd_timer); - IRDA_DEBUG(1, __FUNCTION__ "(), received SNRM cmd\n"); + IRDA_DEBUG(1, "%s(), received SNRM cmd\n", __FUNCTION__); irlap_next_state(self, LAP_RESET_CHECK); irlap_reset_indication(self); } else { - IRDA_DEBUG(0, __FUNCTION__ - "(), SNRM frame contained an I-field!\n"); + IRDA_DEBUG(0, "%s(), SNRM frame contained an I-field!\n", __FUNCTION__); } break; @@ -2057,7 +2045,7 @@ * which explain why we use (self->N2 / 2) here !!! * Jean II */ - IRDA_DEBUG(1, __FUNCTION__ "(), retry_count = %d\n", + IRDA_DEBUG(1, "%s(), retry_count = %d\n", __FUNCTION__, self->retry_count); if (self->retry_count < (self->N2 / 2)) { @@ -2110,7 +2098,7 @@ irlap_send_test_frame(self, self->caddr, info->daddr, skb); break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %d, (%s)\n", + IRDA_DEBUG(1, "%s(), Unknown event %d, (%s)\n", __FUNCTION__, event, irlap_event[event]); ret = -EINVAL; @@ -2130,7 +2118,7 @@ { int ret = 0; - IRDA_DEBUG(1, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -ENODEV;); ASSERT(self->magic == LAP_MAGIC, return -EBADR;); @@ -2168,7 +2156,7 @@ irlap_disconnect_indication(self, LAP_DISC_INDICATION); break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %d, (%s)\n", + IRDA_DEBUG(1, "%s(), Unknown event %d, (%s)\n", __FUNCTION__, event, irlap_event[event]); ret = -EINVAL; @@ -2184,7 +2172,7 @@ { int ret = 0; - IRDA_DEBUG(1, __FUNCTION__ "(), event=%s\n", irlap_event[event]); + IRDA_DEBUG(1, "%s(), event=%s\n", __FUNCTION__, irlap_event[event]); ASSERT(self != NULL, return -ENODEV;); ASSERT(self->magic == LAP_MAGIC, return -EBADR;); @@ -2205,7 +2193,7 @@ irlap_next_state(self, LAP_SCLOSE); break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown event %d, (%s)\n", + IRDA_DEBUG(1, "%s(), Unknown event %d, (%s)\n", __FUNCTION__, event, irlap_event[event]); ret = -EINVAL; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlap_frame.c linux-2.4.23-pre8/net/irda/irlap_frame.c --- linux-2.4.22/net/irda/irlap_frame.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlap_frame.c 2003-10-22 22:48:14.000000000 +0000 @@ -167,8 +167,7 @@ /* Check if the new connection address is valid */ if ((info->caddr == 0x00) || (info->caddr == 0xfe)) { - IRDA_DEBUG(3, __FUNCTION__ - "(), invalid connection address!\n"); + IRDA_DEBUG(3, "%s(), invalid connection address!\n", __FUNCTION__); return; } @@ -178,7 +177,7 @@ /* Only accept if addressed directly to us */ if (info->saddr != self->saddr) { - IRDA_DEBUG(2, __FUNCTION__ "(), not addressed to us!\n"); + IRDA_DEBUG(2, "%s(), not addressed to us!\n", __FUNCTION__); return; } irlap_do_event(self, RECV_SNRM_CMD, skb, info); @@ -200,7 +199,7 @@ struct ua_frame *frame; int ret; - IRDA_DEBUG(2, __FUNCTION__ "() <%ld>\n", jiffies); + IRDA_DEBUG(2, "%s() <%ld>\n", __FUNCTION__, jiffies); ASSERT(self != NULL, return;); ASSERT(self->magic == LAP_MAGIC, return;); @@ -275,7 +274,7 @@ struct sk_buff *skb = NULL; __u8 *frame; - IRDA_DEBUG(3, __FUNCTION__ "()\n"); + IRDA_DEBUG(3, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LAP_MAGIC, return;); @@ -306,7 +305,7 @@ __u32 bcast = BROADCAST; __u8 *info; - IRDA_DEBUG(4, __FUNCTION__ "(), s=%d, S=%d, command=%d\n", s, S, + IRDA_DEBUG(4, "%s(), s=%d, S=%d, command=%d\n", __FUNCTION__, s, S, command); ASSERT(self != NULL, return;); @@ -398,7 +397,7 @@ __u8 *discovery_info; char *text; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LAP_MAGIC, return;); @@ -410,13 +409,12 @@ /* Make sure frame is addressed to us */ if ((info->saddr != self->saddr) && (info->saddr != BROADCAST)) { - IRDA_DEBUG(0, __FUNCTION__ - "(), frame is not addressed to us!\n"); + IRDA_DEBUG(0, "%s(), frame is not addressed to us!\n", __FUNCTION__); return; } if ((discovery = kmalloc(sizeof(discovery_t), GFP_ATOMIC)) == NULL) { - WARNING(__FUNCTION__ "(), kmalloc failed!\n"); + WARNING("%s(), kmalloc failed!\n", __FUNCTION__); return; } memset(discovery, 0, sizeof(discovery_t)); @@ -425,7 +423,7 @@ discovery->saddr = self->saddr; discovery->timestamp = jiffies; - IRDA_DEBUG(4, __FUNCTION__ "(), daddr=%08x\n", discovery->daddr); + IRDA_DEBUG(4, "%s(), daddr=%08x\n", __FUNCTION__, discovery->daddr); discovery_info = skb_pull(skb, sizeof(struct xid_frame)); @@ -476,8 +474,7 @@ /* Make sure frame is addressed to us */ if ((info->saddr != self->saddr) && (info->saddr != BROADCAST)) { - IRDA_DEBUG(0, __FUNCTION__ - "(), frame is not addressed to us!\n"); + IRDA_DEBUG(0, "%s(), frame is not addressed to us!\n", __FUNCTION__); return; } @@ -509,7 +506,7 @@ if (info->s == 0xff) { /* Check if things are sane at this point... */ if((discovery_info == NULL) || (skb->len < 3)) { - ERROR(__FUNCTION__ "(), discovery frame to short!\n"); + ERROR("%s(), discovery frame to short!\n", __FUNCTION__); return; } @@ -518,7 +515,7 @@ */ discovery = kmalloc(sizeof(discovery_t), GFP_ATOMIC); if (!discovery) { - WARNING(__FUNCTION__ "(), unable to malloc!\n"); + WARNING("%s(), unable to malloc!\n", __FUNCTION__); return; } @@ -642,7 +639,7 @@ frame[2] = 0; - IRDA_DEBUG(4, __FUNCTION__ "(), vr=%d, %ld\n",self->vr, jiffies); + IRDA_DEBUG(4, "%s(), vr=%d, %ld\n", __FUNCTION__, self->vr, jiffies); irlap_queue_xmit(self, skb); } @@ -658,7 +655,7 @@ { info->nr = skb->data[1] >> 5; - IRDA_DEBUG(4, __FUNCTION__ "(), nr=%d, %ld\n", info->nr, jiffies); + IRDA_DEBUG(4, "%s(), nr=%d, %ld\n", __FUNCTION__, info->nr, jiffies); if (command) irlap_do_event(self, RECV_RNR_CMD, skb, info); @@ -669,7 +666,7 @@ static void irlap_recv_rej_frame(struct irlap_cb *self, struct sk_buff *skb, struct irlap_info *info, int command) { - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); info->nr = skb->data[1] >> 5; @@ -683,7 +680,7 @@ static void irlap_recv_srej_frame(struct irlap_cb *self, struct sk_buff *skb, struct irlap_info *info, int command) { - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); info->nr = skb->data[1] >> 5; @@ -697,7 +694,7 @@ static void irlap_recv_disc_frame(struct irlap_cb *self, struct sk_buff *skb, struct irlap_info *info, int command) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* Check if this is a command or a response frame */ if (command) @@ -754,7 +751,7 @@ irlap_send_i_frame( self, tx_skb, CMD_FRAME); } else { - IRDA_DEBUG(4, __FUNCTION__ "(), sending unreliable frame\n"); + IRDA_DEBUG(4, "%s(), sending unreliable frame\n", __FUNCTION__); irlap_send_ui_frame(self, skb_get(skb), self->caddr, CMD_FRAME); self->window -= 1; } @@ -803,7 +800,7 @@ irlap_send_i_frame(self, tx_skb, CMD_FRAME); } else { - IRDA_DEBUG(4, __FUNCTION__ "(), sending unreliable frame\n"); + IRDA_DEBUG(4, "%s(), sending unreliable frame\n", __FUNCTION__); if (self->ack_required) { irlap_send_ui_frame(self, skb_get(skb), self->caddr, CMD_FRAME); @@ -952,7 +949,7 @@ /* tx_skb = skb_clone( skb, GFP_ATOMIC); */ tx_skb = skb_copy(skb, GFP_ATOMIC); if (!tx_skb) { - IRDA_DEBUG(0, __FUNCTION__ "(), unable to copy\n"); + IRDA_DEBUG(0, "%s(), unable to copy\n", __FUNCTION__); return; } /* Unlink tx_skb from list */ @@ -987,7 +984,7 @@ */ while (skb_queue_len( &self->txq) > 0) { - IRDA_DEBUG(0, __FUNCTION__ "(), sending additional frames!\n"); + IRDA_DEBUG(0, "%s(), sending additional frames!\n", __FUNCTION__); if ((skb_queue_len( &self->txq) > 0) && (self->window > 0)) { skb = skb_dequeue( &self->txq); @@ -1032,7 +1029,7 @@ /* tx_skb = skb_clone( skb, GFP_ATOMIC); */ tx_skb = skb_copy(skb, GFP_ATOMIC); if (!tx_skb) { - IRDA_DEBUG(0, __FUNCTION__ "(), unable to copy\n"); + IRDA_DEBUG(0, "%s(), unable to copy\n", __FUNCTION__); return; } /* Unlink tx_skb from list */ @@ -1058,7 +1055,7 @@ void irlap_send_ui_frame(struct irlap_cb *self, struct sk_buff *skb, __u8 caddr, int command) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LAP_MAGIC, return;); @@ -1118,7 +1115,7 @@ static void irlap_recv_ui_frame(struct irlap_cb *self, struct sk_buff *skb, struct irlap_info *info) { - IRDA_DEBUG( 4, __FUNCTION__ "()\n"); + IRDA_DEBUG( 4, "%s()\n", __FUNCTION__); info->pf = skb->data[1] & PF_BIT; /* Final bit */ @@ -1137,7 +1134,7 @@ __u8 *frame; int w, x, y, z; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(0, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LAP_MAGIC, return;); @@ -1226,15 +1223,14 @@ { struct test_frame *frame; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); frame = (struct test_frame *) skb->data; /* Broadcast frames must carry saddr and daddr fields */ if (info->caddr == CBROADCAST) { if (skb->len < sizeof(struct test_frame)) { - IRDA_DEBUG(0, __FUNCTION__ - "() test frame to short!\n"); + IRDA_DEBUG(0, "%s() test frame to short!\n", __FUNCTION__); return; } @@ -1281,7 +1277,7 @@ /* Check if frame is large enough for parsing */ if (skb->len < 2) { - ERROR(__FUNCTION__ "(), frame to short!\n"); + ERROR("%s(), frame to short!\n", __FUNCTION__); dev_kfree_skb(skb); return -1; } @@ -1296,7 +1292,7 @@ /* First we check if this frame has a valid connection address */ if ((info.caddr != self->caddr) && (info.caddr != CBROADCAST)) { - IRDA_DEBUG(0, __FUNCTION__ "(), wrong connection address!\n"); + IRDA_DEBUG(0, "%s(), wrong connection address!\n", __FUNCTION__); goto out; } /* @@ -1330,8 +1326,7 @@ irlap_recv_srej_frame(self, skb, &info, command); break; default: - WARNING(__FUNCTION__ - "() Unknown S-frame %02x received!\n", + WARNING("%s() Unknown S-frame %02x received!\n", __FUNCTION__, info.control); break; } @@ -1369,7 +1364,7 @@ irlap_recv_ui_frame(self, skb, &info); break; default: - WARNING(__FUNCTION__ "(), Unknown frame %02x received!\n", + WARNING("%s(), Unknown frame %02x received!\n", __FUNCTION__, info.control); break; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irlmp_frame.c linux-2.4.23-pre8/net/irda/irlmp_frame.c --- linux-2.4.22/net/irda/irlmp_frame.c 2002-11-28 23:53:16.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irlmp_frame.c 2003-10-22 22:49:09.000000000 +0000 @@ -45,7 +45,7 @@ skb->data[1] = slsap; if (expedited) { - IRDA_DEBUG(4, __FUNCTION__ "(), sending expedited data\n"); + IRDA_DEBUG(4, "%s(), sending expedited data\n", __FUNCTION__); irlap_data_request(self->irlap, skb, TRUE); } else irlap_data_request(self->irlap, skb, FALSE); @@ -61,7 +61,7 @@ { __u8 *frame; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LMP_LAP_MAGIC, return;); @@ -96,7 +96,7 @@ __u8 dlsap_sel; /* Destination LSAP address */ __u8 *fp; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LMP_LAP_MAGIC, return;); @@ -116,9 +116,9 @@ * it in a different way than other established connections. */ if ((fp[0] & CONTROL_BIT) && (fp[2] == CONNECT_CMD)) { - IRDA_DEBUG(3, __FUNCTION__ "(), incoming connection, " + IRDA_DEBUG(3, "%s(), incoming connection, " "source LSAP=%d, dest LSAP=%d\n", - slsap_sel, dlsap_sel); + __FUNCTION__, slsap_sel, dlsap_sel); /* Try to find LSAP among the unconnected LSAPs */ lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, CONNECT_CMD, @@ -126,7 +126,7 @@ /* Maybe LSAP was already connected, so try one more time */ if (!lsap) { - IRDA_DEBUG(1, __FUNCTION__ "(), incoming connection for LSAP already connected\n"); + IRDA_DEBUG(1, "%s(), incoming connection for LSAP already connected\n", __FUNCTION__); lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, 0, self->lsaps); } @@ -136,14 +136,12 @@ if (lsap == NULL) { IRDA_DEBUG(2, "IrLMP, Sorry, no LSAP for received frame!\n"); - IRDA_DEBUG(2, __FUNCTION__ - "(), slsap_sel = %02x, dlsap_sel = %02x\n", slsap_sel, + IRDA_DEBUG(2, "%s(), slsap_sel = %02x, dlsap_sel = %02x\n", __FUNCTION__, slsap_sel, dlsap_sel); if (fp[0] & CONTROL_BIT) { - IRDA_DEBUG(2, __FUNCTION__ - "(), received control frame %02x\n", fp[2]); + IRDA_DEBUG(2, "%s(), received control frame %02x\n", __FUNCTION__, fp[2]); } else { - IRDA_DEBUG(2, __FUNCTION__ "(), received data frame\n"); + IRDA_DEBUG(2, "%s(), received data frame\n", __FUNCTION__); } dev_kfree_skb(skb); return; @@ -162,8 +160,7 @@ irlmp_do_lsap_event(lsap, LM_CONNECT_CONFIRM, skb); break; case DISCONNECT: - IRDA_DEBUG(4, __FUNCTION__ - "(), Disconnect indication!\n"); + IRDA_DEBUG(4, "%s(), Disconnect indication!\n", __FUNCTION__); irlmp_do_lsap_event(lsap, LM_DISCONNECT_INDICATION, skb); break; @@ -176,8 +173,7 @@ dev_kfree_skb(skb); break; default: - IRDA_DEBUG(0, __FUNCTION__ - "(), Unknown control frame %02x\n", fp[2]); + IRDA_DEBUG(0, "%s(), Unknown control frame %02x\n", __FUNCTION__, fp[2]); dev_kfree_skb(skb); break; } @@ -211,7 +207,7 @@ __u8 pid; /* Protocol identifier */ __u8 *fp; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LMP_LAP_MAGIC, return;); @@ -228,7 +224,7 @@ pid = fp[2]; if (pid & 0x80) { - IRDA_DEBUG(0, __FUNCTION__ "(), extension in PID not supp!\n"); + IRDA_DEBUG(0, "%s(), extension in PID not supp!\n", __FUNCTION__); dev_kfree_skb(skb); return; @@ -236,7 +232,7 @@ /* Check if frame is addressed to the connectionless LSAP */ if ((slsap_sel != LSAP_CONNLESS) || (dlsap_sel != LSAP_CONNLESS)) { - IRDA_DEBUG(0, __FUNCTION__ "(), dropping frame!\n"); + IRDA_DEBUG(0, "%s(), dropping frame!\n", __FUNCTION__); dev_kfree_skb(skb); return; @@ -258,7 +254,7 @@ if (lsap) irlmp_connless_data_indication(lsap, skb); else { - IRDA_DEBUG(0, __FUNCTION__ "(), found no matching LSAP!\n"); + IRDA_DEBUG(0, "%s(), found no matching LSAP!\n", __FUNCTION__); dev_kfree_skb(skb); } } @@ -275,7 +271,7 @@ LAP_REASON reason, struct sk_buff *userdata) { - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(lap != NULL, return;); ASSERT(lap->magic == LMP_LAP_MAGIC, return;); @@ -303,7 +299,7 @@ __u32 daddr, struct qos_info *qos, struct sk_buff *skb) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); /* Copy QoS settings for this session */ self->qos = qos; @@ -324,7 +320,7 @@ void irlmp_link_connect_confirm(struct lap_cb *self, struct qos_info *qos, struct sk_buff *userdata) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LMP_LAP_MAGIC, return;); @@ -391,7 +387,7 @@ */ void irlmp_link_discovery_confirm(struct lap_cb *self, hashbin_t *log) { - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == LMP_LAP_MAGIC, return;); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irnet/irnet.h linux-2.4.23-pre8/net/irda/irnet/irnet.h --- linux-2.4.22/net/irda/irnet/irnet.h 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irnet/irnet.h 2003-10-22 22:49:11.000000000 +0000 @@ -324,27 +324,27 @@ /* All error messages (will show up in the normal logs) */ #define DERROR(dbg, args...) \ {if(DEBUG_##dbg) \ - printk(KERN_INFO "irnet: " __FUNCTION__ "(): " args);} + printk(KERN_INFO "irnet: %s(): ", __FUNCTION__); printk(args);} /* Normal debug message (will show up in /var/log/debug) */ #define DEBUG(dbg, args...) \ {if(DEBUG_##dbg) \ - printk(KERN_DEBUG "irnet: " __FUNCTION__ "(): " args);} + printk(KERN_DEBUG "irnet: %s(): ", __FUNCTION__); printk(args);} /* Entering a function (trace) */ #define DENTER(dbg, args...) \ {if(DEBUG_##dbg) \ - printk(KERN_DEBUG "irnet: ->" __FUNCTION__ args);} + printk(KERN_DEBUG "irnet: ->%s", __FUNCTION__); printk(args);} /* Entering and exiting a function in one go (trace) */ #define DPASS(dbg, args...) \ {if(DEBUG_##dbg) \ - printk(KERN_DEBUG "irnet: <>" __FUNCTION__ args);} + printk(KERN_DEBUG "irnet: <>%s", __FUNCTION__); printk(args);} /* Exiting a function (trace) */ #define DEXIT(dbg, args...) \ {if(DEBUG_##dbg) \ - printk(KERN_DEBUG "irnet: <-" __FUNCTION__ "()" args);} + printk(KERN_DEBUG "irnet: <-%s()", __FUNCTION__); printk(args);} /* Exit a function with debug */ #define DRETURN(ret, dbg, args...) \ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irqueue.c linux-2.4.23-pre8/net/irda/irqueue.c --- linux-2.4.22/net/irda/irqueue.c 2001-07-04 18:50:38.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irqueue.c 2003-10-22 22:47:51.000000000 +0000 @@ -154,7 +154,7 @@ unsigned long flags = 0; int bin; - IRDA_DEBUG( 4, __FUNCTION__"()\n"); + IRDA_DEBUG( 4,"%s()\n", __FUNCTION__); ASSERT( hashbin != NULL, return;); ASSERT( hashbin->magic == HB_MAGIC, return;); @@ -308,7 +308,7 @@ unsigned long flags = 0; irda_queue_t* entry; - IRDA_DEBUG( 4, __FUNCTION__ "()\n"); + IRDA_DEBUG( 4, "%s()\n", __FUNCTION__); ASSERT( hashbin != NULL, return NULL;); ASSERT( hashbin->magic == HB_MAGIC, return NULL;); @@ -407,7 +407,7 @@ int bin; __u32 hashv; - IRDA_DEBUG( 4, __FUNCTION__ "()\n"); + IRDA_DEBUG( 4, "%s()\n", __FUNCTION__); ASSERT( hashbin != NULL, return NULL;); ASSERT( hashbin->magic == HB_MAGIC, return NULL;); @@ -553,7 +553,7 @@ */ static void __enqueue_last( irda_queue_t **queue, irda_queue_t* element) { - IRDA_DEBUG( 4, __FUNCTION__ "()\n"); + IRDA_DEBUG( 4, "%s()\n", __FUNCTION__); /* * Check if queue is empty. @@ -596,7 +596,7 @@ void enqueue_first(irda_queue_t **queue, irda_queue_t* element) { - IRDA_DEBUG( 4, __FUNCTION__ "()\n"); + IRDA_DEBUG( 4, "%s()\n", __FUNCTION__); /* * Check if queue is empty. diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/irttp.c linux-2.4.23-pre8/net/irda/irttp.c --- linux-2.4.22/net/irda/irttp.c 2003-06-13 14:51:39.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/irttp.c 2003-10-22 22:49:05.000000000 +0000 @@ -94,7 +94,7 @@ irttp->tsaps = hashbin_new(HB_LOCAL); if (!irttp->tsaps) { - ERROR(__FUNCTION__ "(), can't allocate IrTTP hashbin!\n"); + ERROR("%s(), can't allocate IrTTP hashbin!\n", __FUNCTION__); return -ENOMEM; } @@ -165,7 +165,7 @@ if (!self || self->magic != TTP_TSAP_MAGIC) return; - IRDA_DEBUG(4, __FUNCTION__ "(instance=%p)\n", self); + IRDA_DEBUG(4, "%s(instance=%p)\n", __FUNCTION__, self); /* Try to make some progress, especially on Tx side - Jean II */ irttp_run_rx_queue(self); @@ -206,7 +206,7 @@ { struct sk_buff* skb; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == TTP_TSAP_MAGIC, return;); @@ -239,7 +239,7 @@ ASSERT(self != NULL, return NULL;); ASSERT(self->magic == TTP_TSAP_MAGIC, return NULL;); - IRDA_DEBUG(2, __FUNCTION__ "(), self->rx_sdu_size=%d\n", + IRDA_DEBUG(2, "%s(), self->rx_sdu_size=%d\n", __FUNCTION__, self->rx_sdu_size); skb = dev_alloc_skb(TTP_HEADER + self->rx_sdu_size); @@ -262,9 +262,9 @@ dev_kfree_skb(frag); } - IRDA_DEBUG(2, __FUNCTION__ "(), frame len=%d\n", n); + IRDA_DEBUG(2, "%s(), frame len=%d\n", __FUNCTION__, n); - IRDA_DEBUG(2, __FUNCTION__ "(), rx_sdu_size=%d\n", self->rx_sdu_size); + IRDA_DEBUG(2, "%s(), rx_sdu_size=%d\n", __FUNCTION__, self->rx_sdu_size); ASSERT(n <= self->rx_sdu_size, return NULL;); /* Set the new length */ @@ -287,7 +287,7 @@ struct sk_buff *frag; __u8 *frame; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == TTP_TSAP_MAGIC, return;); @@ -297,7 +297,7 @@ * Split frame into a number of segments */ while (skb->len > self->max_seg_size) { - IRDA_DEBUG(2, __FUNCTION__ "(), fragmenting ...\n"); + IRDA_DEBUG(2, "%s(), fragmenting ...\n", __FUNCTION__); /* Make new segment */ frag = dev_alloc_skb(self->max_seg_size+self->max_header_size); @@ -321,7 +321,7 @@ skb_queue_tail(&self->tx_queue, frag); } /* Queue what is left of the original skb */ - IRDA_DEBUG(2, __FUNCTION__ "(), queuing last segment\n"); + IRDA_DEBUG(2, "%s(), queuing last segment\n", __FUNCTION__); frame = skb_push(skb, TTP_HEADER); frame[0] = 0x00; /* Clear more bit */ @@ -352,7 +352,7 @@ else self->tx_max_sdu_size = param->pv.i; - IRDA_DEBUG(1, __FUNCTION__ "(), MaxSduSize=%d\n", param->pv.i); + IRDA_DEBUG(1, "%s(), MaxSduSize=%d\n", __FUNCTION__, param->pv.i); return 0; } @@ -380,13 +380,13 @@ * JeanII */ if((stsap_sel != LSAP_ANY) && ((stsap_sel < 0x01) || (stsap_sel >= 0x70))) { - IRDA_DEBUG(0, __FUNCTION__ "(), invalid tsap!\n"); + IRDA_DEBUG(0, "%s(), invalid tsap!\n", __FUNCTION__); return NULL; } self = kmalloc(sizeof(struct tsap_cb), GFP_ATOMIC); if (self == NULL) { - IRDA_DEBUG(0, __FUNCTION__ "(), unable to kmalloc!\n"); + IRDA_DEBUG(0, "%s(), unable to kmalloc!\n", __FUNCTION__); return NULL; } memset(self, 0, sizeof(struct tsap_cb)); @@ -421,7 +421,7 @@ */ lsap = irlmp_open_lsap(stsap_sel, &ttp_notify, 0); if (lsap == NULL) { - WARNING(__FUNCTION__ "(), unable to allocate LSAP!!\n"); + WARNING("%s(), unable to allocate LSAP!!\n", __FUNCTION__); return NULL; } @@ -431,7 +431,7 @@ * the stsap_sel we have might not be valid anymore */ self->stsap_sel = lsap->slsap_sel; - IRDA_DEBUG(4, __FUNCTION__ "(), stsap_sel=%02x\n", self->stsap_sel); + IRDA_DEBUG(4, "%s(), stsap_sel=%02x\n", __FUNCTION__, self->stsap_sel); self->notify = *notify; self->lsap = lsap; @@ -488,7 +488,7 @@ { struct tsap_cb *tsap; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return -1;); ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;); @@ -497,7 +497,7 @@ if (self->connected) { /* Check if disconnect is not pending */ if (!test_bit(0, &self->disconnect_pend)) { - WARNING(__FUNCTION__ "(), TSAP still connected!\n"); + WARNING("%s(), TSAP still connected!\n", __FUNCTION__); irttp_disconnect_request(self, NULL, P_NORMAL); } self->close_pend = TRUE; @@ -533,16 +533,16 @@ ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;); ASSERT(skb != NULL, return -1;); - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); /* Check that nothing bad happens */ if ((skb->len == 0) || (!self->connected)) { - IRDA_DEBUG(1, __FUNCTION__ "(), No data, or not connected\n"); + IRDA_DEBUG(1, "%s(), No data, or not connected\n", __FUNCTION__); return -1; } if (skb->len > self->max_seg_size) { - IRDA_DEBUG(1, __FUNCTION__ "(), UData is to large for IrLAP!\n"); + IRDA_DEBUG(1, "%s(), UData is to large for IrLAP!\n", __FUNCTION__); return -1; } @@ -566,12 +566,12 @@ ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;); ASSERT(skb != NULL, return -1;); - IRDA_DEBUG(2, __FUNCTION__ " : queue len = %d\n", + IRDA_DEBUG(2, "%s : queue len = %d\n", __FUNCTION__, skb_queue_len(&self->tx_queue)); /* Check that nothing bad happens */ if ((skb->len == 0) || (!self->connected)) { - WARNING(__FUNCTION__ "(), No data, or not connected\n"); + WARNING("%s(), No data, or not connected\n", __FUNCTION__); return -ENOTCONN; } @@ -580,8 +580,7 @@ * inside an IrLAP frame */ if ((self->tx_max_sdu_size == 0) && (skb->len > self->max_seg_size)) { - ERROR(__FUNCTION__ - "(), SAR disabled, and data is to large for IrLAP!\n"); + ERROR("%s(), SAR disabled, and data is to large for IrLAP!\n", __FUNCTION__); return -EMSGSIZE; } @@ -593,8 +592,8 @@ (self->tx_max_sdu_size != TTP_SAR_UNBOUND) && (skb->len > self->tx_max_sdu_size)) { - ERROR(__FUNCTION__ "(), SAR enabled, " - "but data is larger than TxMaxSduSize!\n"); + ERROR("%s(), SAR enabled, " + "but data is larger than TxMaxSduSize!\n", __FUNCTION__); return -EMSGSIZE; } /* @@ -665,7 +664,7 @@ unsigned long flags; int n; - IRDA_DEBUG(2, __FUNCTION__ "() : send_credit = %d, queue_len = %d\n", + IRDA_DEBUG(2, "%s() : send_credit = %d, queue_len = %d\n", __FUNCTION__, self->send_credit, skb_queue_len(&self->tx_queue)); /* Get exclusive access to the tx queue, otherwise don't touch it */ @@ -773,7 +772,7 @@ ASSERT(self != NULL, return;); ASSERT(self->magic == TTP_TSAP_MAGIC, return;); - IRDA_DEBUG(4, __FUNCTION__ "() send=%d,avail=%d,remote=%d\n", + IRDA_DEBUG(4, "%s() send=%d,avail=%d,remote=%d\n", __FUNCTION__, self->send_credit, self->avail_credit, self->remote_credit); /* Give credit to peer */ @@ -821,7 +820,7 @@ { struct tsap_cb *self; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); self = (struct tsap_cb *) instance; @@ -933,7 +932,7 @@ { struct tsap_cb *self; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); self = (struct tsap_cb *) instance; @@ -947,7 +946,7 @@ self->notify.status_indication(self->notify.instance, link, lock); else - IRDA_DEBUG(2, __FUNCTION__ "(), no handler\n"); + IRDA_DEBUG(2, "%s(), no handler\n", __FUNCTION__); } /* @@ -965,7 +964,7 @@ ASSERT(self != NULL, return;); ASSERT(self->magic == TTP_TSAP_MAGIC, return;); - IRDA_DEBUG(4, __FUNCTION__ "(instance=%p)\n", self); + IRDA_DEBUG(4, "%s(instance=%p)\n", __FUNCTION__, self); /* We are "polled" directly from LAP, and the LAP want to fill * its Tx window. We want to do our best to send it data, so that @@ -1003,18 +1002,18 @@ */ void irttp_flow_request(struct tsap_cb *self, LOCAL_FLOW flow) { - IRDA_DEBUG(1, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, "%s()\n", __FUNCTION__); ASSERT(self != NULL, return;); ASSERT(self->magic == TTP_TSAP_MAGIC, return;); switch (flow) { case FLOW_STOP: - IRDA_DEBUG(1, __FUNCTION__ "(), flow stop\n"); + IRDA_DEBUG(1, "%s(), flow stop\n", __FUNCTION__); self->rx_sdu_busy = TRUE; break; case FLOW_START: - IRDA_DEBUG(1, __FUNCTION__ "(), flow start\n"); + IRDA_DEBUG(1, "%s(), flow start\n", __FUNCTION__); self->rx_sdu_busy = FALSE; /* Client say he can accept more data, try to free our @@ -1023,7 +1022,7 @@ break; default: - IRDA_DEBUG(1, __FUNCTION__ "(), Unknown flow command!\n"); + IRDA_DEBUG(1, "%s(), Unknown flow command!\n", __FUNCTION__); } } @@ -1042,7 +1041,7 @@ __u8 *frame; __u8 n; - IRDA_DEBUG(4, __FUNCTION__ "(), max_sdu_size=%d\n", max_sdu_size); + IRDA_DEBUG(4, "%s(), max_sdu_size=%d\n", __FUNCTION__, max_sdu_size); ASSERT(self != NULL, return -EBADR;); ASSERT(self->magic == TTP_TSAP_MAGIC, return -EBADR;); @@ -1134,7 +1133,7 @@ __u8 plen; __u8 n; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); self = (struct tsap_cb *) instance; @@ -1158,7 +1157,7 @@ n = skb->data[0] & 0x7f; - IRDA_DEBUG(4, __FUNCTION__ "(), Initial send_credit=%d\n", n); + IRDA_DEBUG(4, "%s(), Initial send_credit=%d\n", __FUNCTION__, n); self->send_credit = n; self->tx_max_sdu_size = 0; @@ -1178,8 +1177,7 @@ /* Any errors in the parameter list? */ if (ret < 0) { - WARNING(__FUNCTION__ - "(), error extracting parameters\n"); + WARNING("%s(), error extracting parameters\n", __FUNCTION__); dev_kfree_skb(skb); /* Do not accept this connection attempt */ @@ -1189,10 +1187,10 @@ skb_pull(skb, IRDA_MIN(skb->len, plen+1)); } - IRDA_DEBUG(4, __FUNCTION__ "() send=%d,avail=%d,remote=%d\n", + IRDA_DEBUG(4, "%s() send=%d,avail=%d,remote=%d\n", __FUNCTION__, self->send_credit, self->avail_credit, self->remote_credit); - IRDA_DEBUG(2, __FUNCTION__ "(), MaxSduSize=%d\n", self->tx_max_sdu_size); + IRDA_DEBUG(2, "%s(), MaxSduSize=%d\n", __FUNCTION__, self->tx_max_sdu_size); if (self->notify.connect_confirm) { self->notify.connect_confirm(self->notify.instance, self, qos, @@ -1229,7 +1227,7 @@ self->max_seg_size = max_seg_size - TTP_HEADER;; self->max_header_size = max_header_size+TTP_HEADER; - IRDA_DEBUG(4, __FUNCTION__ "(), TSAP sel=%02x\n", self->stsap_sel); + IRDA_DEBUG(4, "%s(), TSAP sel=%02x\n", __FUNCTION__, self->stsap_sel); /* Need to update dtsap_sel if its equal to LSAP_ANY */ self->dtsap_sel = lsap->dlsap_sel; @@ -1253,8 +1251,7 @@ /* Any errors in the parameter list? */ if (ret < 0) { - WARNING(__FUNCTION__ - "(), error extracting parameters\n"); + WARNING("%s(), error extracting parameters\n", __FUNCTION__); dev_kfree_skb(skb); /* Do not accept this connection attempt */ @@ -1291,7 +1288,7 @@ ASSERT(self != NULL, return -1;); ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;); - IRDA_DEBUG(4, __FUNCTION__ "(), Source TSAP selector=%02x\n", + IRDA_DEBUG(4, "%s(), Source TSAP selector=%02x\n", __FUNCTION__, self->stsap_sel); /* Any userdata supplied? */ @@ -1369,15 +1366,15 @@ { struct tsap_cb *new; - IRDA_DEBUG(1, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, "%s()\n", __FUNCTION__); if (!hashbin_find(irttp->tsaps, (int) orig, NULL)) { - IRDA_DEBUG(0, __FUNCTION__ "(), unable to find TSAP\n"); + IRDA_DEBUG(0, "%s(), unable to find TSAP\n", __FUNCTION__); return NULL; } new = kmalloc(sizeof(struct tsap_cb), GFP_ATOMIC); if (!new) { - IRDA_DEBUG(0, __FUNCTION__ "(), unable to kmalloc\n"); + IRDA_DEBUG(0, "%s(), unable to kmalloc\n", __FUNCTION__); return NULL; } /* Dup */ @@ -1415,7 +1412,7 @@ /* Already disconnected? */ if (!self->connected) { - IRDA_DEBUG(4, __FUNCTION__ "(), already disconnected!\n"); + IRDA_DEBUG(4, "%s(), already disconnected!\n", __FUNCTION__); if (userdata) dev_kfree_skb(userdata); return -1; @@ -1427,7 +1424,7 @@ * for following a disconnect_indication() (i.e. net_bh). * Jean II */ if(test_and_set_bit(0, &self->disconnect_pend)) { - IRDA_DEBUG(0, __FUNCTION__ "(), disconnect already pending\n"); + IRDA_DEBUG(0, "%s(), disconnect already pending\n", __FUNCTION__); if (userdata) dev_kfree_skb(userdata); @@ -1446,7 +1443,7 @@ * disconnecting right now since the data will * not have any usable connection to be sent on */ - IRDA_DEBUG(1, __FUNCTION__ "High priority!!()\n" ); + IRDA_DEBUG(1, "%s High priority!!()\n", __FUNCTION__); irttp_flush_queues(self); } else if (priority == P_NORMAL) { /* @@ -1467,7 +1464,7 @@ * be sent at the LMP level (so even if the peer has its Tx queue * full of data). - Jean II */ - IRDA_DEBUG(1, __FUNCTION__ "(), Disconnecting ...\n"); + IRDA_DEBUG(1, "%s(), Disconnecting ...\n", __FUNCTION__); self->connected = FALSE; if (!userdata) { @@ -1501,7 +1498,7 @@ { struct tsap_cb *self; - IRDA_DEBUG(4, __FUNCTION__ "()\n"); + IRDA_DEBUG(4, "%s()\n", __FUNCTION__); self = (struct tsap_cb *) instance; @@ -1561,7 +1558,7 @@ * give an error back */ if (err == -ENOMEM) { - IRDA_DEBUG(0, __FUNCTION__ "() requeueing skb!\n"); + IRDA_DEBUG(0, "%s() requeueing skb!\n", __FUNCTION__); /* Make sure we take a break */ self->rx_sdu_busy = TRUE; @@ -1586,7 +1583,7 @@ struct sk_buff *skb; int more = 0; - IRDA_DEBUG(2, __FUNCTION__ "() send=%d,avail=%d,remote=%d\n", + IRDA_DEBUG(2, "%s() send=%d,avail=%d,remote=%d\n", __FUNCTION__, self->send_credit, self->avail_credit, self->remote_credit); /* Get exclusive access to the rx queue, otherwise don't touch it */ @@ -1626,7 +1623,7 @@ * limits of the maximum size of the rx_sdu */ if (self->rx_sdu_size <= self->rx_max_sdu_size) { - IRDA_DEBUG(4, __FUNCTION__ "(), queueing frag\n"); + IRDA_DEBUG(4, "%s(), queueing frag\n", __FUNCTION__); skb_queue_tail(&self->rx_fragments, skb); } else { /* Free the part of the SDU that is too big */ @@ -1656,7 +1653,7 @@ /* Now we can deliver the reassembled skb */ irttp_do_data_indication(self, skb); } else { - IRDA_DEBUG(1, __FUNCTION__ "(), Truncated frame\n"); + IRDA_DEBUG(1, "%s(), Truncated frame\n", __FUNCTION__); /* Free the part of the SDU that is too big */ dev_kfree_skb(skb); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/parameters.c linux-2.4.23-pre8/net/irda/parameters.c --- linux-2.4.22/net/irda/parameters.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/parameters.c 2003-10-22 22:49:10.000000000 +0000 @@ -150,22 +150,22 @@ */ if (p.pl == 0) { if (p.pv.i < 0xff) { - IRDA_DEBUG(2, __FUNCTION__ "(), using 1 byte\n"); + IRDA_DEBUG(2, "%s(), using 1 byte\n", __FUNCTION__); p.pl = 1; } else if (p.pv.i < 0xffff) { - IRDA_DEBUG(2, __FUNCTION__ "(), using 2 bytes\n"); + IRDA_DEBUG(2, "%s(), using 2 bytes\n", __FUNCTION__); p.pl = 2; } else { - IRDA_DEBUG(2, __FUNCTION__ "(), using 4 bytes\n"); + IRDA_DEBUG(2, "%s(), using 4 bytes\n", __FUNCTION__); p.pl = 4; /* Default length */ } } /* Check if buffer is long enough for insertion */ if (len < (2+p.pl)) { - WARNING(__FUNCTION__ "(), buffer to short for insertion!\n"); + WARNING("%s(), buffer to short for insertion!\n", __FUNCTION__); return -1; } - IRDA_DEBUG(2, __FUNCTION__ "(), pi=%#x, pl=%d, pi=%d\n", p.pi, p.pl, p.pv.i); + IRDA_DEBUG(2, "%s(), pi=%#x, pl=%d, pi=%d\n", __FUNCTION__, p.pi, p.pl, p.pv.i); switch (p.pl) { case 1: n += irda_param_pack(buf, "bbb", p.pi, p.pl, (__u8) p.pv.i); @@ -186,7 +186,7 @@ break; default: - WARNING(__FUNCTION__ "() length %d not supported\n", p.pl); + WARNING("%s() length %d not supported\n", __FUNCTION__, p.pl); /* Skip parameter */ return -1; } @@ -215,8 +215,8 @@ /* Check if buffer is long enough for parsing */ if (len < (2+p.pl)) { - WARNING(__FUNCTION__ "(), buffer to short for parsing! " - "Need %d bytes, but len is only %d\n", p.pl, len); + WARNING("%s(), buffer to short for parsing! " + "Need %d bytes, but len is only %d\n", __FUNCTION__, p.pl, len); return -1; } @@ -226,9 +226,9 @@ * PV_INTEGER means that the handler is flexible. */ if (((type & PV_MASK) != PV_INTEGER) && ((type & PV_MASK) != p.pl)) { - ERROR(__FUNCTION__ "(), invalid parameter length! " + ERROR("%s(), invalid parameter length! " "Expected %d bytes, but value had %d bytes!\n", - type & PV_MASK, p.pl); + __FUNCTION__, type & PV_MASK, p.pl); /* Most parameters are bit/byte fields or little endian, * so it's ok to only extract a subset of it (the subset @@ -265,13 +265,13 @@ le32_to_cpus(&p.pv.i); break; default: - WARNING(__FUNCTION__ "() length %d not supported\n", p.pl); + WARNING("%s() length %d not supported\n", __FUNCTION__, p.pl); /* Skip parameter */ return p.pl+2; } - IRDA_DEBUG(2, __FUNCTION__ "(), pi=%#x, pl=%d, pi=%d\n", p.pi, p.pl, p.pv.i); + IRDA_DEBUG(2, "%s(), pi=%#x, pl=%d, pi=%d\n", __FUNCTION__, p.pi, p.pl, p.pv.i); /* Call handler for this parameter */ err = (*func)(self, &p, PV_PUT); if (err < 0) @@ -293,17 +293,17 @@ irda_param_t p; int err; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); p.pi = pi; /* In case handler needs to know */ p.pl = buf[1]; /* Extract lenght of value */ - IRDA_DEBUG(2, __FUNCTION__ "(), pi=%#x, pl=%d\n", p.pi, p.pl); + IRDA_DEBUG(2, "%s(), pi=%#x, pl=%d\n", __FUNCTION__, p.pi, p.pl); /* Check if buffer is long enough for parsing */ if (len < (2+p.pl)) { - WARNING(__FUNCTION__ "(), buffer to short for parsing! " - "Need %d bytes, but len is only %d\n", p.pl, len); + WARNING("%s(), buffer to short for parsing! " + "Need %d bytes, but len is only %d\n", __FUNCTION__, p.pl, len); return -1; } @@ -311,7 +311,7 @@ * checked that the buffer is long enough */ strncpy(str, buf+2, p.pl); - IRDA_DEBUG(2, __FUNCTION__ "(), str=0x%02x 0x%02x\n", (__u8) str[0], + IRDA_DEBUG(2, "%s(), str=0x%02x 0x%02x\n", __FUNCTION__, (__u8) str[0], (__u8) str[1]); /* Null terminate string */ @@ -343,12 +343,12 @@ /* Check if buffer is long enough for parsing */ if (len < (2+p.pl)) { - WARNING(__FUNCTION__ "(), buffer to short for parsing! " - "Need %d bytes, but len is only %d\n", p.pl, len); + WARNING("%s(), buffer to short for parsing! " + "Need %d bytes, but len is only %d\n", __FUNCTION__, p.pl, len); return -1; } - IRDA_DEBUG(0, __FUNCTION__ "(), not impl\n"); + IRDA_DEBUG(0, "%s(), not impl\n", __FUNCTION__); return p.pl+2; /* Extracted pl+2 bytes */ } @@ -474,8 +474,7 @@ if ((pi_major > info->len-1) || (pi_minor > info->tables[pi_major].len-1)) { - IRDA_DEBUG(0, __FUNCTION__ - "(), no handler for parameter=0x%02x\n", pi); + IRDA_DEBUG(0, "%s(), no handler for parameter=0x%02x\n", __FUNCTION__, pi); /* Skip this parameter */ return -1; @@ -489,7 +488,7 @@ /* Check if handler has been implemented */ if (!pi_minor_info->func) { - MESSAGE(__FUNCTION__"(), no handler for pi=%#x\n", pi); + MESSAGE("%s(), no handler for pi=%#x\n", __FUNCTION__, pi); /* Skip this parameter */ return -1; } @@ -526,7 +525,7 @@ if ((pi_major > info->len-1) || (pi_minor > info->tables[pi_major].len-1)) { - IRDA_DEBUG(0, __FUNCTION__ "(), no handler for parameter=0x%02x\n", + IRDA_DEBUG(0, "%s(), no handler for parameter=0x%02x\n", __FUNCTION__, buf[0]); /* Skip this parameter */ @@ -539,12 +538,12 @@ /* Find expected data type for this parameter identifier (pi)*/ type = pi_minor_info->type; - IRDA_DEBUG(3, __FUNCTION__ "(), pi=[%d,%d], type=%d\n", + IRDA_DEBUG(3, "%s(), pi=[%d,%d], type=%d\n", __FUNCTION__, pi_major, pi_minor, type); /* Check if handler has been implemented */ if (!pi_minor_info->func) { - MESSAGE(__FUNCTION__"(), no handler for pi=%#x\n", buf[n]); + MESSAGE("%s(), no handler for pi=%#x\n", __FUNCTION__, buf[n]); /* Skip this parameter */ return 2 + buf[n + 1]; /* Continue */ } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/qos.c linux-2.4.23-pre8/net/irda/qos.c --- linux-2.4.22/net/irda/qos.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/qos.c 2003-10-22 22:49:22.000000000 +0000 @@ -348,7 +348,7 @@ __u32 line_capacity; int index; - IRDA_DEBUG(2, __FUNCTION__ "()\n"); + IRDA_DEBUG(2, "%s()\n", __FUNCTION__); /* * Make sure the mintt is sensible. @@ -374,8 +374,7 @@ if ((qos->baud_rate.value < 115200) && (qos->max_turn_time.value < 500)) { - IRDA_DEBUG(0, __FUNCTION__ - "(), adjusting max turn time from %d to 500 ms\n", + IRDA_DEBUG(0, "%s(), adjusting max turn time from %d to 500 ms\n", __FUNCTION__, qos->max_turn_time.value); qos->max_turn_time.value = 500; } @@ -391,8 +390,7 @@ #ifdef CONFIG_IRDA_DYNAMIC_WINDOW while ((qos->data_size.value > line_capacity) && (index > 0)) { qos->data_size.value = data_sizes[index--]; - IRDA_DEBUG(2, __FUNCTION__ - "(), reducing data size to %d\n", + IRDA_DEBUG(2, "%s(), reducing data size to %d\n", __FUNCTION__, qos->data_size.value); } #else /* Use method described in section 6.6.11 of IrLAP */ @@ -402,16 +400,14 @@ /* Must be able to send at least one frame */ if (qos->window_size.value > 1) { qos->window_size.value--; - IRDA_DEBUG(2, __FUNCTION__ - "(), reducing window size to %d\n", + IRDA_DEBUG(2, "%s(), reducing window size to %d\n", __FUNCTION__, qos->window_size.value); } else if (index > 1) { qos->data_size.value = data_sizes[index--]; - IRDA_DEBUG(2, __FUNCTION__ - "(), reducing data size to %d\n", + IRDA_DEBUG(2, "%s(), reducing data size to %d\n", __FUNCTION__, qos->data_size.value); } else { - WARNING(__FUNCTION__ "(), nothing more we can do!\n"); + WARNING("%s(), nothing more we can do!\n", __FUNCTION__); } } #endif /* CONFIG_IRDA_DYNAMIC_WINDOW */ @@ -545,7 +541,7 @@ if (get) { param->pv.i = self->qos_rx.baud_rate.bits; - IRDA_DEBUG(2, __FUNCTION__ "(), baud rate = 0x%02x\n", + IRDA_DEBUG(2, "%s(), baud rate = 0x%02x\n", __FUNCTION__, param->pv.i); } else { /* @@ -718,7 +714,7 @@ __u32 line_capacity; int i,j; - IRDA_DEBUG(2, __FUNCTION__ "(), speed=%d, max_turn_time=%d\n", + IRDA_DEBUG(2, "%s(), speed=%d, max_turn_time=%d\n", __FUNCTION__, speed, max_turn_time); i = value_index(speed, baud_rates, 10); @@ -729,7 +725,7 @@ line_capacity = max_line_capacities[i][j]; - IRDA_DEBUG(2, __FUNCTION__ "(), line capacity=%d bytes\n", + IRDA_DEBUG(2, "%s(), line capacity=%d bytes\n", __FUNCTION__, line_capacity); return line_capacity; @@ -743,7 +739,7 @@ irlap_min_turn_time_in_bytes(qos->baud_rate.value, qos->min_turn_time.value); - IRDA_DEBUG(2, __FUNCTION__ "(), requested line capacity=%d\n", + IRDA_DEBUG(2, "%s(), requested line capacity=%d\n", __FUNCTION__, line_capacity); return line_capacity; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/irda/wrapper.c linux-2.4.23-pre8/net/irda/wrapper.c --- linux-2.4.22/net/irda/wrapper.c 2001-04-30 23:26:09.000000000 +0000 +++ linux-2.4.23-pre8/net/irda/wrapper.c 2003-10-22 22:47:59.000000000 +0000 @@ -93,16 +93,16 @@ * Nothing to worry about, but we set the default number of * BOF's */ - IRDA_DEBUG(1, __FUNCTION__ "(), wrong magic in skb!\n"); + IRDA_DEBUG(1, "%s(), wrong magic in skb!\n", __FUNCTION__); xbofs = 10; } else xbofs = cb->xbofs + cb->xbofs_delay; - IRDA_DEBUG(4, __FUNCTION__ "(), xbofs=%d\n", xbofs); + IRDA_DEBUG(4, "%s(), xbofs=%d\n", __FUNCTION__, xbofs); /* Check that we never use more than 115 + 48 xbofs */ if (xbofs > 163) { - IRDA_DEBUG(0, __FUNCTION__ "(), too many xbofs (%d)\n", xbofs); + IRDA_DEBUG(0, "%s(), too many xbofs (%d)\n", __FUNCTION__, xbofs); xbofs = 163; } @@ -265,7 +265,7 @@ case EOF: /* Abort frame */ rx_buff->state = OUTSIDE_FRAME; - IRDA_DEBUG(1, __FUNCTION__ "(), abort frame\n"); + IRDA_DEBUG(1, "%s(), abort frame\n", __FUNCTION__); stats->rx_errors++; stats->rx_frame_errors++; break; @@ -289,13 +289,12 @@ { switch (byte) { case BOF: /* New frame? */ - IRDA_DEBUG(1, __FUNCTION__ - "(), Discarding incomplete frame\n"); + IRDA_DEBUG(1, "%s(), Discarding incomplete frame\n", __FUNCTION__); rx_buff->state = BEGIN_FRAME; irda_device_set_media_busy(dev, TRUE); break; case CE: - WARNING(__FUNCTION__ "(), state not defined\n"); + WARNING("%s(), state not defined\n", __FUNCTION__); break; case EOF: /* Abort frame */ rx_buff->state = OUTSIDE_FRAME; @@ -311,7 +310,7 @@ rx_buff->fcs = irda_fcs(rx_buff->fcs, byte); rx_buff->state = INSIDE_FRAME; } else { - IRDA_DEBUG(1, __FUNCTION__ "(), rx buffer overflow\n"); + IRDA_DEBUG(1, "%s(), rx buffer overflow\n", __FUNCTION__); rx_buff->state = OUTSIDE_FRAME; } break; @@ -332,8 +331,7 @@ switch (byte) { case BOF: /* New frame? */ - IRDA_DEBUG(1, __FUNCTION__ - "(), Discarding incomplete frame\n"); + IRDA_DEBUG(1, "%s(), Discarding incomplete frame\n", __FUNCTION__); rx_buff->state = BEGIN_FRAME; irda_device_set_media_busy(dev, TRUE); break; @@ -354,7 +352,7 @@ /* Wrong CRC, discard frame! */ irda_device_set_media_busy(dev, TRUE); - IRDA_DEBUG(1, __FUNCTION__ "(), crc error\n"); + IRDA_DEBUG(1, "%s(), crc error\n", __FUNCTION__); stats->rx_errors++; stats->rx_crc_errors++; } @@ -364,8 +362,7 @@ rx_buff->data[rx_buff->len++] = byte; rx_buff->fcs = irda_fcs(rx_buff->fcs, byte); } else { - IRDA_DEBUG(1, __FUNCTION__ - "(), Rx buffer overflow, aborting\n"); + IRDA_DEBUG(1, "%s(), Rx buffer overflow, aborting\n", __FUNCTION__); rx_buff->state = OUTSIDE_FRAME; } break; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/netlink/af_netlink.c linux-2.4.23-pre8/net/netlink/af_netlink.c --- linux-2.4.22/net/netlink/af_netlink.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/netlink/af_netlink.c 2003-10-22 22:48:57.000000000 +0000 @@ -846,8 +846,17 @@ size = NLMSG_SPACE(4 + NLMSG_ALIGN(nlh->nlmsg_len)); skb = alloc_skb(size, GFP_KERNEL); - if (!skb) - return; + if (!skb) { + struct sock *sk; + + sk = netlink_lookup(in_skb->sk->protocol, + NETLINK_CB(in_skb).pid); + if (sk) { + sk->err = ENOBUFS; + sk->error_report(sk); + sock_put(sk); + } + } rep = __nlmsg_put(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, NLMSG_ERROR, sizeof(struct nlmsgerr)); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/netsyms.c linux-2.4.23-pre8/net/netsyms.c --- linux-2.4.22/net/netsyms.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/netsyms.c 2003-10-22 22:48:38.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -59,7 +60,7 @@ extern struct net_proto_family inet_family_ops; -#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) || defined (CONFIG_KHTTPD) || defined (CONFIG_KHTTPD_MODULE) +#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) || defined (CONFIG_KHTTPD) || defined (CONFIG_KHTTPD_MODULE) || defined (CONFIG_IP_SCTP_MODULE) #include #include #include @@ -163,6 +164,7 @@ EXPORT_SYMBOL(put_cmsg); EXPORT_SYMBOL(sock_kmalloc); EXPORT_SYMBOL(sock_kfree_s); +EXPORT_SYMBOL(sock_map_fd); EXPORT_SYMBOL(sockfd_lookup); #ifdef CONFIG_FILTER @@ -193,6 +195,7 @@ EXPORT_SYMBOL(neigh_parms_release); EXPORT_SYMBOL(neigh_rand_reach_time); EXPORT_SYMBOL(neigh_compat_output); +EXPORT_SYMBOL(neigh_changeaddr); /* dst_entry */ EXPORT_SYMBOL(dst_alloc); @@ -254,6 +257,8 @@ EXPORT_SYMBOL(ip_route_output_key); EXPORT_SYMBOL(ip_route_input); EXPORT_SYMBOL(icmp_send); +EXPORT_SYMBOL(icmp_statistics); +EXPORT_SYMBOL(icmp_err_convert); EXPORT_SYMBOL(ip_options_compile); EXPORT_SYMBOL(ip_options_undo); EXPORT_SYMBOL(arp_send); @@ -265,6 +270,7 @@ EXPORT_SYMBOL(in_aton); EXPORT_SYMBOL(ip_mc_inc_group); EXPORT_SYMBOL(ip_mc_dec_group); +EXPORT_SYMBOL(ip_mc_join_group); EXPORT_SYMBOL(ip_finish_output); EXPORT_SYMBOL(inet_stream_ops); EXPORT_SYMBOL(inet_dgram_ops); @@ -291,19 +297,7 @@ #endif -#ifdef CONFIG_IPV6 -EXPORT_SYMBOL(ipv6_addr_type); -EXPORT_SYMBOL(icmpv6_send); -EXPORT_SYMBOL(ndisc_mc_map); -EXPORT_SYMBOL(register_inet6addr_notifier); -EXPORT_SYMBOL(unregister_inet6addr_notifier); -#include -EXPORT_SYMBOL(ip6_route_output); -#ifdef CONFIG_NETFILTER -EXPORT_SYMBOL(ip6_route_me_harder); -#endif -#endif -#if defined (CONFIG_IPV6_MODULE) || defined (CONFIG_KHTTPD) || defined (CONFIG_KHTTPD_MODULE) +#if defined (CONFIG_IPV6_MODULE) || defined (CONFIG_KHTTPD) || defined (CONFIG_KHTTPD_MODULE) || defined (CONFIG_IP_SCTP_MODULE) /* inet functions common to v4 and v6 */ EXPORT_SYMBOL(inet_release); EXPORT_SYMBOL(inet_stream_connect); @@ -419,6 +413,14 @@ EXPORT_SYMBOL(tcp_read_sock); +#ifdef CONFIG_IP_SCTP_MODULE +EXPORT_SYMBOL(ip_setsockopt); +EXPORT_SYMBOL(ip_getsockopt); +EXPORT_SYMBOL(inet_ioctl); +EXPORT_SYMBOL(inet_bind); +EXPORT_SYMBOL(inet_getname); +#endif /* CONFIG_IP_SCTP_MODULE */ + EXPORT_SYMBOL(netlink_set_err); EXPORT_SYMBOL(netlink_broadcast); EXPORT_SYMBOL(netlink_unicast); @@ -609,6 +611,18 @@ #if defined(CONFIG_NET_RADIO) || defined(CONFIG_NET_PCMCIA_RADIO) #include EXPORT_SYMBOL(wireless_send_event); +EXPORT_SYMBOL(iw_handler_set_spy); +EXPORT_SYMBOL(iw_handler_get_spy); +EXPORT_SYMBOL(iw_handler_set_thrspy); +EXPORT_SYMBOL(iw_handler_get_thrspy); +EXPORT_SYMBOL(wireless_spy_update); #endif /* CONFIG_NET_RADIO || CONFIG_NET_PCMCIA_RADIO */ +/* ethtool.c */ +EXPORT_SYMBOL(ethtool_op_get_link); +EXPORT_SYMBOL(ethtool_op_get_tx_csum); +EXPORT_SYMBOL(ethtool_op_set_tx_csum); +EXPORT_SYMBOL(ethtool_op_get_sg); +EXPORT_SYMBOL(ethtool_op_set_sg); + #endif /* CONFIG_NET */ diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sched/sch_generic.c linux-2.4.23-pre8/net/sched/sch_generic.c --- linux-2.4.22/net/sched/sch_generic.c 2002-11-28 23:53:16.000000000 +0000 +++ linux-2.4.23-pre8/net/sched/sch_generic.c 2003-10-22 22:47:32.000000000 +0000 @@ -7,7 +7,7 @@ * 2 of the License, or (at your option) any later version. * * Authors: Alexey Kuznetsov, - * Jamal Hadi Salim, 990601 + * Jamal Hadi Salim, 990601 * - Ingress support */ @@ -283,6 +283,8 @@ if (list->qlen <= qdisc->dev->tx_queue_len) { __skb_queue_tail(list, skb); qdisc->q.qlen++; + qdisc->stats.bytes += skb->len; + qdisc->stats.packets++; return 0; } qdisc->stats.drops++; @@ -331,6 +333,21 @@ qdisc->q.qlen = 0; } +static int pfifo_fast_dump(struct Qdisc *qdisc, struct sk_buff *skb) +{ + unsigned char *b = skb->tail; + struct tc_prio_qopt opt; + + opt.bands = 3; + memcpy(&opt.priomap, prio2band, TC_PRIO_MAX+1); + RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt); + return skb->len; + +rtattr_failure: + skb_trim(skb, b - skb->data); + return -1; +} + static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt) { int i; @@ -358,6 +375,10 @@ pfifo_fast_init, pfifo_fast_reset, + NULL, + NULL, + pfifo_fast_dump, + }; struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops) @@ -406,7 +427,6 @@ dev = qdisc->dev; -#ifdef CONFIG_NET_SCHED if (dev) { struct Qdisc *q, **qp; for (qp = &qdisc->dev->qdisc_list; (q=*qp) != NULL; qp = &q->next) { @@ -419,7 +439,6 @@ #ifdef CONFIG_NET_ESTIMATOR qdisc_kill_estimator(&qdisc->stats); #endif -#endif if (ops->reset) ops->reset(qdisc); if (ops->destroy) @@ -445,6 +464,12 @@ printk(KERN_INFO "%s: activation failed\n", dev->name); return; } + + write_lock(&qdisc_tree_lock); + qdisc->next = dev->qdisc_list; + dev->qdisc_list = qdisc; + write_unlock(&qdisc_tree_lock); + } else { qdisc = &noqueue_qdisc; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sched/sch_htb.c linux-2.4.23-pre8/net/sched/sch_htb.c --- linux-2.4.22/net/sched/sch_htb.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/sched/sch_htb.c 2003-10-22 22:47:30.000000000 +0000 @@ -19,9 +19,11 @@ * code review and helpful comments on shaping * Tomasz Wrona, * created test case so that I was able to fix nasty bug + * Wilfried Weissmann + * spotted bug in dequeue code and helped with fix * and many others. thanks. * - * $Id: sch_htb.c,v 1.20 2003/06/18 19:55:49 devik Exp devik $ + * $Id: sch_htb.c,v 1.24 2003/07/28 15:25:23 devik Exp devik $ */ #include #include @@ -73,7 +75,7 @@ #define HTB_HYSTERESIS 1/* whether to use mode hysteresis for speedup */ #define HTB_QLOCK(S) spin_lock_bh(&(S)->dev->queue_lock) #define HTB_QUNLOCK(S) spin_unlock_bh(&(S)->dev->queue_lock) -#define HTB_VER 0x3000c /* major must be matched with number suplied by TC as version */ +#define HTB_VER 0x3000d /* major must be matched with number suplied by TC as version */ #if HTB_VER >> 16 != TC_HTB_PROTOVER #error "Mismatched sch_htb.c and pkt_sch.h" @@ -98,7 +100,8 @@ from LSB */ #ifdef HTB_DEBUG -#define HTB_DBG(S,L,FMT,ARG...) if (((q->debug>>(2*S))&3) >= L) \ +#define HTB_DBG_COND(S,L) (((q->debug>>(2*S))&3) >= L) +#define HTB_DBG(S,L,FMT,ARG...) if (HTB_DBG_COND(S,L)) \ printk(KERN_DEBUG FMT,##ARG) #define HTB_CHCL(cl) BUG_TRAP((cl)->magic == HTB_CMAGIC) #define HTB_PASSQ q, @@ -114,6 +117,7 @@ rb_erase(N,R); \ (N)->rb_color = -1; } while (0) #else +#define HTB_DBG_COND(S,L) (0) #define HTB_DBG(S,L,FMT,ARG...) #define HTB_PASSQ #define HTB_ARGQ @@ -454,12 +458,14 @@ { rb_node_t *p; if ((*n)->rb_right) { + /* child at right. use it or its leftmost ancestor */ *n = (*n)->rb_right; while ((*n)->rb_left) *n = (*n)->rb_left; return; } while ((p = (*n)->rb_parent) != NULL) { + /* if we've arrived from left child then we have next node */ if (p->rb_left == *n) break; *n = p; } @@ -912,6 +918,7 @@ rb_node_t **pptr; } stk[TC_HTB_MAXDEPTH],*sp = stk; + BUG_TRAP(tree->rb_node); sp->root = tree->rb_node; sp->pptr = pptr; @@ -945,15 +952,36 @@ htb_dequeue_tree(struct htb_sched *q,int prio,int level) { struct sk_buff *skb = NULL; - //struct htb_sched *q = (struct htb_sched *)sch->data; struct htb_class *cl,*start; /* look initial class up in the row */ start = cl = htb_lookup_leaf (q->row[level]+prio,prio,q->ptr[level]+prio); do { - BUG_TRAP(cl && cl->un.leaf.q->q.qlen); if (!cl) return NULL; +next: + BUG_TRAP(cl); + if (!cl) return NULL; HTB_DBG(4,1,"htb_deq_tr prio=%d lev=%d cl=%X defic=%d\n", prio,level,cl->classid,cl->un.leaf.deficit[level]); + + /* class can be empty - it is unlikely but can be true if leaf + qdisc drops packets in enqueue routine or if someone used + graft operation on the leaf since last dequeue; + simply deactivate and skip such class */ + if (unlikely(cl->un.leaf.q->q.qlen == 0)) { + struct htb_class *next; + htb_deactivate(q,cl); + + /* row/level might become empty */ + if ((q->row_mask[level] & (1 << prio)) == 0) + return NULL; + + next = htb_lookup_leaf (q->row[level]+prio, + prio,q->ptr[level]+prio); + if (cl == start) /* fix start if we just deleted it */ + start = next; + cl = next; + goto next; + } if (likely((skb = cl->un.leaf.q->dequeue(cl->un.leaf.q)) != NULL)) break; @@ -1201,7 +1229,8 @@ gopt.direct_pkts = q->direct_pkts; #ifdef HTB_DEBUG - htb_debug_dump(q); + if (HTB_DBG_COND(0,2)) + htb_debug_dump(q); #endif gopt.version = HTB_VER; gopt.rate2quantum = q->rate2quantum; @@ -1282,6 +1311,9 @@ return -ENOBUFS; sch_tree_lock(sch); if ((*old = xchg(&cl->un.leaf.q, new)) != NULL) { + if (cl->prio_activity) + htb_deactivate ((struct htb_sched*)sch->data,cl); + /* TODO: is it correct ? Why CBQ doesn't do it ? */ sch->q.qlen -= (*old)->q.qlen; qdisc_reset(*old); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/Config.in linux-2.4.23-pre8/net/sctp/Config.in --- linux-2.4.22/net/sctp/Config.in 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/Config.in 2003-10-22 22:48:13.000000000 +0000 @@ -0,0 +1,20 @@ +# +# SCTP configuration +# +mainmenu_option next_comment +comment ' SCTP Configuration (EXPERIMENTAL)' + +if [ "$CONFIG_IPV6" != "n" ]; then + define_bool CONFIG_IPV6_SCTP__ $CONFIG_IPV6 +else + define_bool CONFIG_IPV6_SCTP__ y +fi + +dep_tristate ' The SCTP Protocol (EXPERIMENTAL)' CONFIG_IP_SCTP $CONFIG_IPV6_SCTP__ +if [ "$CONFIG_IP_SCTP" != "n" ]; then + bool ' SCTP: Use old checksum (Adler-32)' CONFIG_SCTP_ADLER32 + bool ' SCTP: Debug messages' CONFIG_SCTP_DBG_MSG + bool ' SCTP: Debug object counts' CONFIG_SCTP_DBG_OBJCNT +fi + +endmenu diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/Makefile linux-2.4.23-pre8/net/sctp/Makefile --- linux-2.4.22/net/sctp/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/Makefile 2003-10-22 22:48:29.000000000 +0000 @@ -0,0 +1,27 @@ +# +# Makefile for SCTP support code. +# + +O_TARGET := sctp.o + +obj-$(CONFIG_IP_SCTP) += sctp.o + +obj-y := endpointola.o output.o sm_make_chunk.o associola.o hashdriver.o \ + outqueue.o sm_sideeffect.o transport.o bind_addr.o input.o primitive.o \ + sm_statefuns.o tsnmap.o command.o inqueue.o proc.o sm_statetable.o \ + ulpevent.o protocol.o socket.o ulpqueue.o debug.o sla1.o ssnmap.o + +ifeq ($(CONFIG_SCTP_ADLER32), y) +obj-y += adler32.o +else +obj-y += crc32c.o +endif + +obj-$(CONFIG_SCTP_DBG_OBJCNT) += objcnt.o +obj-$(CONFIG_SYSCTL) += sysctl.o + +obj-$(subst m,y,$(CONFIG_IPV6)) += ipv6.o + +sctp-objs := $(obj-y) + +include $(TOPDIR)/Rules.make diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/adler32.c linux-2.4.23-pre8/net/sctp/adler32.c --- linux-2.4.22/net/sctp/adler32.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/adler32.c 2003-10-22 22:49:12.000000000 +0000 @@ -0,0 +1,171 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2003 International Business Machines, Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * This file has direct heritage from the SCTP user-level reference + * implementation by R. Stewart, et al. These functions implement the + * Adler-32 algorithm as specified by RFC 2960. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Randall Stewart + * Ken Morneau + * Qiaobing Xie + * Sridhar Samudrala + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +/* This is an entry point for external calls + * Define this function in the header file. This is + * direct from rfc1950, ... + * + * The following C code computes the Adler-32 checksum of a data buffer. + * It is written for clarity, not for speed. The sample code is in the + * ANSI C programming language. Non C users may find it easier to read + * with these hints: + * + * & Bitwise AND operator. + * >> Bitwise right shift operator. When applied to an + * unsigned quantity, as here, right shift inserts zero bit(s) + * at the left. + * << Bitwise left shift operator. Left shift inserts zero + * bit(s) at the right. + * ++ "n++" increments the variable n. + * % modulo operator: a % b is the remainder of a divided by b. + * + * Well, the above is a bit of a lie, I have optimized this a small + * tad, but I have commented the original lines below + */ + +#include +#include + +#define BASE 65521 /* largest prime smaller than 65536 */ + + +/* Performance work as shown this pig to be the + * worst CPU wise guy. I have done what I could think + * of on my flight to Australia but I am sure some + * clever assembly could speed this up, but of + * course this would require the dreaded #ifdef's for + * architecture. If you can speed this up more, pass + * it back and we will incorporate it :-) + */ + +unsigned long update_adler32(unsigned long adler, + unsigned char *buf, int len) +{ + __u32 s1 = adler & 0xffff; + __u32 s2 = (adler >> 16) & 0xffff; + int n; + + for (n = 0; n < len; n++,buf++) { + /* s1 = (s1 + buf[n]) % BASE */ + /* first we add */ + s1 = (s1 + *buf); + + /* Now if we need to, we do a mod by + * subtracting. It seems a bit faster + * since I really will only ever do + * one subtract at the MOST, since buf[n] + * is a max of 255. + */ + if (s1 >= BASE) + s1 -= BASE; + + /* s2 = (s2 + s1) % BASE */ + /* first we add */ + s2 = (s2 + s1); + + /* again, it is more efficient (it seems) to + * subtract since the most s2 will ever be + * is (BASE-1 + BASE-1) in the worse case. + * This would then be (2 * BASE) - 2, which + * will still only do one subtract. On Intel + * this is much better to do this way and + * avoid the divide. Have not -pg'd on + * sparc. + */ + if (s2 >= BASE) { + /* s2 %= BASE;*/ + s2 -= BASE; + } + } + + /* Return the adler32 of the bytes buf[0..len-1] */ + return (s2 << 16) + s1; +} + +__u32 sctp_start_cksum(__u8 *ptr, __u16 count) +{ + /* + * Update a running Adler-32 checksum with the bytes + * buf[0..len-1] and return the updated checksum. The Adler-32 + * checksum should be initialized to 1. + */ + __u32 adler = 1L; + __u32 zero = 0L; + + /* Calculate the CRC up to the checksum field. */ + adler = update_adler32(adler, ptr, + sizeof(struct sctphdr) - sizeof(__u32)); + /* Skip over the checksum field. */ + adler = update_adler32(adler, (unsigned char *) &zero, + sizeof(__u32)); + ptr += sizeof(struct sctphdr); + count -= sizeof(struct sctphdr); + + /* Calculate the rest of the Adler-32. */ + adler = update_adler32(adler, ptr, count); + + return adler; +} + +__u32 sctp_update_cksum(__u8 *ptr, __u16 count, __u32 adler) +{ + adler = update_adler32(adler, ptr, count); + + return adler; +} + +__u32 sctp_update_copy_cksum(__u8 *to, __u8 *from, __u16 count, __u32 adler) +{ + /* Its not worth it to try harder. Adler32 is obsolescent. */ + adler = update_adler32(adler, from, count); + memcpy(to, from, count); + + return adler; +} + +__u32 sctp_end_cksum(__u32 adler) +{ + return adler; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/associola.c linux-2.4.23-pre8/net/sctp/associola.c --- linux-2.4.22/net/sctp/associola.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/associola.c 2003-10-22 22:48:34.000000000 +0000 @@ -0,0 +1,1106 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * This file is part of the SCTP kernel reference Implementation + * + * This module provides the abstraction for an SCTP association. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Xingang Guo + * Hui Huang + * Sridhar Samudrala + * Daisy Chang + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +/* Forward declarations for internal functions. */ +static void sctp_assoc_bh_rcv(struct sctp_association *asoc); + + +/* 1st Level Abstractions. */ + +/* Allocate and initialize a new association */ +struct sctp_association *sctp_association_new(const struct sctp_endpoint *ep, + const struct sock *sk, + sctp_scope_t scope, int gfp) +{ + struct sctp_association *asoc; + + asoc = t_new(struct sctp_association, gfp); + if (!asoc) + goto fail; + + if (!sctp_association_init(asoc, ep, sk, scope, gfp)) + goto fail_init; + + asoc->base.malloced = 1; + SCTP_DBG_OBJCNT_INC(assoc); + + return asoc; + +fail_init: + kfree(asoc); +fail: + return NULL; +} + +/* Initialize a new association from provided memory. */ +struct sctp_association *sctp_association_init(struct sctp_association *asoc, + const struct sctp_endpoint *ep, + const struct sock *sk, + sctp_scope_t scope, + int gfp) +{ + struct sctp_opt *sp; + struct sctp_protocol *proto = sctp_get_protocol(); + int i; + + /* Retrieve the SCTP per socket area. */ + sp = sctp_sk((struct sock *)sk); + + /* Init all variables to a known value. */ + memset(asoc, 0, sizeof(struct sctp_association)); + + /* Discarding const is appropriate here. */ + asoc->ep = (struct sctp_endpoint *)ep; + sctp_endpoint_hold(asoc->ep); + + /* Hold the sock. */ + asoc->base.sk = (struct sock *)sk; + sock_hold(asoc->base.sk); + + /* Initialize the common base substructure. */ + asoc->base.type = SCTP_EP_TYPE_ASSOCIATION; + + /* Initialize the object handling fields. */ + atomic_set(&asoc->base.refcnt, 1); + asoc->base.dead = 0; + asoc->base.malloced = 0; + + /* Initialize the bind addr area. */ + sctp_bind_addr_init(&asoc->base.bind_addr, ep->base.bind_addr.port); + asoc->base.addr_lock = RW_LOCK_UNLOCKED; + + asoc->state = SCTP_STATE_CLOSED; + asoc->state_timestamp = jiffies; + + /* Set things that have constant value. */ + asoc->cookie_life.tv_sec = sctp_proto.valid_cookie_life / HZ; + asoc->cookie_life.tv_usec = (sctp_proto.valid_cookie_life % HZ) * + 1000000L / HZ; + + asoc->pmtu = 0; + asoc->frag_point = 0; + + /* Initialize the default association max_retrans and RTO values. */ + asoc->max_retrans = proto->max_retrans_association; + asoc->rto_initial = proto->rto_initial; + asoc->rto_max = proto->rto_max; + asoc->rto_min = proto->rto_min; + + asoc->overall_error_threshold = 0; + asoc->overall_error_count = 0; + + /* Initialize the maximum mumber of new data packets that can be sent + * in a burst. + */ + asoc->max_burst = proto->max_burst; + + /* Copy things from the endpoint. */ + for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) { + asoc->timeouts[i] = ep->timeouts[i]; + init_timer(&asoc->timers[i]); + asoc->timers[i].function = sctp_timer_events[i]; + asoc->timers[i].data = (unsigned long) asoc; + } + + /* Pull default initialization values from the sock options. + * Note: This assumes that the values have already been + * validated in the sock. + */ + asoc->c.sinit_max_instreams = sp->initmsg.sinit_max_instreams; + asoc->c.sinit_num_ostreams = sp->initmsg.sinit_num_ostreams; + asoc->max_init_attempts = sp->initmsg.sinit_max_attempts; + asoc->max_init_timeo = sp->initmsg.sinit_max_init_timeo * HZ; + + /* Allocate storage for the ssnmap after the inbound and outbound + * streams have been negotiated during Init. + */ + asoc->ssnmap = NULL; + + /* Set the local window size for receive. + * This is also the rcvbuf space per association. + * RFC 6 - A SCTP receiver MUST be able to receive a minimum of + * 1500 bytes in one SCTP packet. + */ + if (sk->rcvbuf < SCTP_DEFAULT_MINWINDOW) + asoc->rwnd = SCTP_DEFAULT_MINWINDOW; + else + asoc->rwnd = sk->rcvbuf; + + asoc->a_rwnd = asoc->rwnd; + + asoc->rwnd_over = 0; + + /* Use my own max window until I learn something better. */ + asoc->peer.rwnd = SCTP_DEFAULT_MAXWINDOW; + + /* Set the sndbuf size for transmit. */ + asoc->sndbuf_used = 0; + + init_waitqueue_head(&asoc->wait); + + asoc->c.my_vtag = sctp_generate_tag(ep); + asoc->peer.i.init_tag = 0; /* INIT needs a vtag of 0. */ + asoc->c.peer_vtag = 0; + asoc->c.my_ttag = 0; + asoc->c.peer_ttag = 0; + + asoc->c.initial_tsn = sctp_generate_tsn(ep); + + asoc->next_tsn = asoc->c.initial_tsn; + + asoc->ctsn_ack_point = asoc->next_tsn - 1; + asoc->highest_sacked = asoc->ctsn_ack_point; + asoc->last_cwr_tsn = asoc->ctsn_ack_point; + asoc->unack_data = 0; + + SCTP_DEBUG_PRINTK("myctsnap for %s INIT as 0x%x.\n", + asoc->ep->debug_name, + asoc->ctsn_ack_point); + + /* ADDIP Section 4.1 Asconf Chunk Procedures + * + * When an endpoint has an ASCONF signaled change to be sent to the + * remote endpoint it should do the following: + * ... + * A2) a serial number should be assigned to the chunk. The serial + * number should be a monotonically increasing number. All serial + * numbers are defined to be initialized at the start of the + * association to the same value as the initial TSN. + */ + asoc->addip_serial = asoc->c.initial_tsn; + + /* Make an empty list of remote transport addresses. */ + INIT_LIST_HEAD(&asoc->peer.transport_addr_list); + + /* RFC 2960 5.1 Normal Establishment of an Association + * + * After the reception of the first data chunk in an + * association the endpoint must immediately respond with a + * sack to acknowledge the data chunk. Subsequent + * acknowledgements should be done as described in Section + * 6.2. + * + * [We implement this by telling a new association that it + * already received one packet.] + */ + asoc->peer.sack_needed = 1; + + /* Create an input queue. */ + sctp_inq_init(&asoc->base.inqueue); + sctp_inq_set_th_handler(&asoc->base.inqueue, + (void (*)(void *))sctp_assoc_bh_rcv, + asoc); + + /* Create an output queue. */ + sctp_outq_init(asoc, &asoc->outqueue); + sctp_outq_set_output_handlers(&asoc->outqueue, + sctp_packet_init, + sctp_packet_config, + sctp_packet_append_chunk, + sctp_packet_transmit_chunk, + sctp_packet_transmit); + + if (NULL == sctp_ulpq_init(&asoc->ulpq, asoc)) + goto fail_init; + + /* Set up the tsn tracking. */ + sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_SIZE, 0); + + skb_queue_head_init(&asoc->addip_chunks); + + asoc->need_ecne = 0; + + asoc->debug_name = "unnamedasoc"; + asoc->eyecatcher = SCTP_ASSOC_EYECATCHER; + + /* Assume that peer would support both address types unless we are + * told otherwise. + */ + asoc->peer.ipv4_address = 1; + asoc->peer.ipv6_address = 1; + INIT_LIST_HEAD(&asoc->asocs); + + asoc->autoclose = sp->autoclose; + + return asoc; + +fail_init: + sctp_endpoint_put(asoc->ep); + sock_put(asoc->base.sk); + return NULL; +} + +/* Free this association if possible. There may still be users, so + * the actual deallocation may be delayed. + */ +void sctp_association_free(struct sctp_association *asoc) +{ + struct sock *sk = asoc->base.sk; + struct sctp_transport *transport; + struct list_head *pos, *temp; + int i; + + list_del(&asoc->asocs); + + /* Decrement the backlog value for a TCP-style listening socket. */ + if ((SCTP_SOCKET_TCP == sctp_sk(sk)->type) && + (SCTP_SS_LISTENING == sk->state)) + sk->ack_backlog--; + + /* Mark as dead, so other users can know this structure is + * going away. + */ + asoc->base.dead = 1; + + /* Dispose of any data lying around in the outqueue. */ + sctp_outq_free(&asoc->outqueue); + + /* Dispose of any pending messages for the upper layer. */ + sctp_ulpq_free(&asoc->ulpq); + + /* Dispose of any pending chunks on the inqueue. */ + sctp_inq_free(&asoc->base.inqueue); + + /* Free ssnmap storage. */ + sctp_ssnmap_free(asoc->ssnmap); + + /* Clean up the bound address list. */ + sctp_bind_addr_free(&asoc->base.bind_addr); + + /* Do we need to go through all of our timers and + * delete them? To be safe we will try to delete all, but we + * should be able to go through and make a guess based + * on our state. + */ + for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) { + if (timer_pending(&asoc->timers[i]) && + del_timer(&asoc->timers[i])) + sctp_association_put(asoc); + } + + /* Free peer's cached cookie. */ + if (asoc->peer.cookie) { + kfree(asoc->peer.cookie); + } + + /* Release the transport structures. */ + list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { + transport = list_entry(pos, struct sctp_transport, transports); + list_del(pos); + sctp_transport_free(transport); + } + + asoc->eyecatcher = 0; + + sctp_association_put(asoc); +} + +/* Cleanup and free up an association. */ +static void sctp_association_destroy(struct sctp_association *asoc) +{ + SCTP_ASSERT(asoc->base.dead, "Assoc is not dead", return); + + sctp_endpoint_put(asoc->ep); + sock_put(asoc->base.sk); + + if (asoc->base.malloced) { + kfree(asoc); + SCTP_DBG_OBJCNT_DEC(assoc); + } +} + +/* Change the primary destination address for the peer. */ +void sctp_assoc_set_primary(struct sctp_association *asoc, + struct sctp_transport *transport) +{ + asoc->peer.primary_path = transport; + + /* Set a default msg_name for events. */ + memcpy(&asoc->peer.primary_addr, &transport->ipaddr, + sizeof(union sctp_addr)); + + /* If the primary path is changing, assume that the + * user wants to use this new path. + */ + if (transport->active) + asoc->peer.active_path = transport; +} + +/* Add a transport address to an association. */ +struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, + const union sctp_addr *addr, + int gfp) +{ + struct sctp_transport *peer; + struct sctp_opt *sp; + unsigned short port; + + /* AF_INET and AF_INET6 share common port field. */ + port = addr->v4.sin_port; + + /* Set the port if it has not been set yet. */ + if (0 == asoc->peer.port) { + asoc->peer.port = port; + } + + /* Check to see if this is a duplicate. */ + peer = sctp_assoc_lookup_paddr(asoc, addr); + if (peer) + return peer; + + peer = sctp_transport_new(addr, gfp); + if (!peer) + return NULL; + + sctp_transport_set_owner(peer, asoc); + + /* Initialize the pmtu of the transport. */ + sctp_transport_pmtu(peer); + + /* If this is the first transport addr on this association, + * initialize the association PMTU to the peer's PMTU. + * If not and the current association PMTU is higher than the new + * peer's PMTU, reset the association PMTU to the new peer's PMTU. + */ + if (asoc->pmtu) + asoc->pmtu = min_t(int, peer->pmtu, asoc->pmtu); + else + asoc->pmtu = peer->pmtu; + + SCTP_DEBUG_PRINTK("sctp_assoc_add_peer:association %p PMTU set to " + "%d\n", asoc, asoc->pmtu); + + asoc->frag_point = sctp_frag_point(asoc->pmtu); + + /* The asoc->peer.port might not be meaningful yet, but + * initialize the packet structure anyway. + */ + (asoc->outqueue.init_output)(&peer->packet, + peer, + asoc->base.bind_addr.port, + asoc->peer.port); + + /* 7.2.1 Slow-Start + * + * o The initial cwnd before data transmission or after a + * sufficiently long idle period MUST be <= 2*MTU. + * + * o The initial value of ssthresh MAY be arbitrarily high + * (for example, implementations MAY use the size of the + * receiver advertised window). + */ + peer->cwnd = asoc->pmtu * 2; + + /* At this point, we may not have the receiver's advertised window, + * so initialize ssthresh to the default value and it will be set + * later when we process the INIT. + */ + peer->ssthresh = SCTP_DEFAULT_MAXWINDOW; + + peer->partial_bytes_acked = 0; + peer->flight_size = 0; + + peer->error_threshold = peer->max_retrans; + + /* Update the overall error threshold value of the association + * taking the new peer's error threshold into account. + */ + asoc->overall_error_threshold = + min(asoc->overall_error_threshold + peer->error_threshold, + asoc->max_retrans); + + /* By default, enable heartbeat for peer address. */ + peer->hb_allowed = 1; + + /* Initialize the peer's heartbeat interval based on the + * sock configured value. + */ + sp = sctp_sk(asoc->base.sk); + peer->hb_interval = sp->paddrparam.spp_hbinterval * HZ; + + /* Attach the remote transport to our asoc. */ + list_add_tail(&peer->transports, &asoc->peer.transport_addr_list); + + /* If we do not yet have a primary path, set one. */ + if (NULL == asoc->peer.primary_path) { + sctp_assoc_set_primary(asoc, peer); + asoc->peer.retran_path = peer; + } + + if (asoc->peer.active_path == asoc->peer.retran_path) + asoc->peer.retran_path = peer; + + return peer; +} + +/* Lookup a transport by address. */ +struct sctp_transport *sctp_assoc_lookup_paddr( + const struct sctp_association *asoc, + const union sctp_addr *address) +{ + struct sctp_transport *t; + struct list_head *pos; + + /* Cycle through all transports searching for a peer address. */ + + list_for_each(pos, &asoc->peer.transport_addr_list) { + t = list_entry(pos, struct sctp_transport, transports); + if (sctp_cmp_addr_exact(address, &t->ipaddr)) + return t; + } + + return NULL; +} + +/* Engage in transport control operations. + * Mark the transport up or down and send a notification to the user. + * Select and update the new active and retran paths. + */ +void sctp_assoc_control_transport(struct sctp_association *asoc, + struct sctp_transport *transport, + sctp_transport_cmd_t command, + sctp_sn_error_t error) +{ + struct sctp_transport *t = NULL; + struct sctp_transport *first; + struct sctp_transport *second; + struct sctp_ulpevent *event; + struct list_head *pos; + int spc_state = 0; + + /* Record the transition on the transport. */ + switch (command) { + case SCTP_TRANSPORT_UP: + transport->active = 1; + spc_state = ADDRESS_AVAILABLE; + break; + + case SCTP_TRANSPORT_DOWN: + transport->active = 0; + spc_state = ADDRESS_UNREACHABLE; + break; + + default: + return; + }; + + /* Generate and send a SCTP_PEER_ADDR_CHANGE notification to the + * user. + */ + event = sctp_ulpevent_make_peer_addr_change(asoc, + (struct sockaddr_storage *) &transport->ipaddr, + 0, spc_state, error, GFP_ATOMIC); + if (event) + sctp_ulpq_tail_event(&asoc->ulpq, event); + + /* Select new active and retran paths. */ + + /* Look for the two most recently used active transports. + * + * This code produces the wrong ordering whenever jiffies + * rolls over, but we still get usable transports, so we don't + * worry about it. + */ + first = NULL; second = NULL; + + list_for_each(pos, &asoc->peer.transport_addr_list) { + t = list_entry(pos, struct sctp_transport, transports); + + if (!t->active) + continue; + if (!first || t->last_time_heard > first->last_time_heard) { + second = first; + first = t; + } + if (!second || t->last_time_heard > second->last_time_heard) + second = t; + } + + /* RFC 2960 6.4 Multi-Homed SCTP Endpoints + * + * By default, an endpoint should always transmit to the + * primary path, unless the SCTP user explicitly specifies the + * destination transport address (and possibly source + * transport address) to use. + * + * [If the primary is active but not most recent, bump the most + * recently used transport.] + */ + if (asoc->peer.primary_path->active && + first != asoc->peer.primary_path) { + second = first; + first = asoc->peer.primary_path; + } + + /* If we failed to find a usable transport, just camp on the + * primary, even if it is inactive. + */ + if (NULL == first) { + first = asoc->peer.primary_path; + second = asoc->peer.primary_path; + } + + /* Set the active and retran transports. */ + asoc->peer.active_path = first; + asoc->peer.retran_path = second; +} + +/* Hold a reference to an association. */ +void sctp_association_hold(struct sctp_association *asoc) +{ + atomic_inc(&asoc->base.refcnt); +} + +/* Release a reference to an association and cleanup + * if there are no more references. + */ +void sctp_association_put(struct sctp_association *asoc) +{ + if (atomic_dec_and_test(&asoc->base.refcnt)) + sctp_association_destroy(asoc); +} + +/* Allocate the next TSN, Transmission Sequence Number, for the given + * association. + */ +__u32 sctp_association_get_next_tsn(struct sctp_association *asoc) +{ + /* From Section 1.6 Serial Number Arithmetic: + * Transmission Sequence Numbers wrap around when they reach + * 2**32 - 1. That is, the next TSN a DATA chunk MUST use + * after transmitting TSN = 2*32 - 1 is TSN = 0. + */ + __u32 retval = asoc->next_tsn; + asoc->next_tsn++; + asoc->unack_data++; + + return retval; +} + +/* Allocate 'num' TSNs by incrementing the association's TSN by num. */ +__u32 sctp_association_get_tsn_block(struct sctp_association *asoc, int num) +{ + __u32 retval = asoc->next_tsn; + + asoc->next_tsn += num; + asoc->unack_data += num; + + return retval; +} + + +/* Compare two addresses to see if they match. Wildcard addresses + * only match themselves. + */ +int sctp_cmp_addr_exact(const union sctp_addr *ss1, + const union sctp_addr *ss2) +{ + struct sctp_af *af; + + af = sctp_get_af_specific(ss1->sa.sa_family); + if (unlikely(!af)) + return 0; + + return af->cmp_addr(ss1, ss2); +} + +/* Return an ecne chunk to get prepended to a packet. + * Note: We are sly and return a shared, prealloced chunk. FIXME: + * No we don't, but we could/should. + */ +sctp_chunk_t *sctp_get_ecne_prepend(struct sctp_association *asoc) +{ + struct sctp_chunk *chunk; + + /* Send ECNE if needed. + * Not being able to allocate a chunk here is not deadly. + */ + if (asoc->need_ecne) + chunk = sctp_make_ecne(asoc, asoc->last_ecne_tsn); + else + chunk = NULL; + + return chunk; +} + +/* Use this function for the packet prepend callback when no ECNE + * packet is desired (e.g. some packets don't like to be bundled). + */ +sctp_chunk_t *sctp_get_no_prepend(struct sctp_association *asoc) +{ + return NULL; +} + +/* + * Find which transport this TSN was sent on. + */ +struct sctp_transport *sctp_assoc_lookup_tsn(struct sctp_association *asoc, __u32 tsn) +{ + struct sctp_transport *active; + struct sctp_transport *match; + struct list_head *entry, *pos; + struct sctp_transport *transport; + sctp_chunk_t *chunk; + __u32 key = htonl(tsn); + + match = NULL; + + /* + * FIXME: In general, find a more efficient data structure for + * searching. + */ + + /* + * The general strategy is to search each transport's transmitted + * list. Return which transport this TSN lives on. + * + * Let's be hopeful and check the active_path first. + * Another optimization would be to know if there is only one + * outbound path and not have to look for the TSN at all. + * + */ + + active = asoc->peer.active_path; + + list_for_each(entry, &active->transmitted) { + chunk = list_entry(entry, sctp_chunk_t, transmitted_list); + + if (key == chunk->subh.data_hdr->tsn) { + match = active; + goto out; + } + } + + /* If not found, go search all the other transports. */ + list_for_each(pos, &asoc->peer.transport_addr_list) { + transport = list_entry(pos, struct sctp_transport, transports); + + if (transport == active) + break; + list_for_each(entry, &transport->transmitted) { + chunk = list_entry(entry, sctp_chunk_t, + transmitted_list); + if (key == chunk->subh.data_hdr->tsn) { + match = transport; + goto out; + } + } + } +out: + return match; +} + +/* Is this the association we are looking for? */ +struct sctp_transport *sctp_assoc_is_match(struct sctp_association *asoc, + const union sctp_addr *laddr, + const union sctp_addr *paddr) +{ + struct sctp_transport *transport; + + sctp_read_lock(&asoc->base.addr_lock); + + if ((asoc->base.bind_addr.port == laddr->v4.sin_port) && + (asoc->peer.port == paddr->v4.sin_port)) { + transport = sctp_assoc_lookup_paddr(asoc, paddr); + if (!transport) + goto out; + + if (sctp_bind_addr_match(&asoc->base.bind_addr, laddr, + sctp_sk(asoc->base.sk))) + goto out; + } + transport = NULL; + +out: + sctp_read_unlock(&asoc->base.addr_lock); + return transport; +} + +/* Do delayed input processing. This is scheduled by sctp_rcv(). */ +static void sctp_assoc_bh_rcv(struct sctp_association *asoc) +{ + struct sctp_endpoint *ep; + sctp_chunk_t *chunk; + struct sock *sk; + struct sctp_inq *inqueue; + int state, subtype; + sctp_assoc_t associd = sctp_assoc2id(asoc); + int error = 0; + + /* The association should be held so we should be safe. */ + ep = asoc->ep; + sk = asoc->base.sk; + + inqueue = &asoc->base.inqueue; + while (NULL != (chunk = sctp_inq_pop(inqueue))) { + state = asoc->state; + subtype = chunk->chunk_hdr->type; + + /* Remember where the last DATA chunk came from so we + * know where to send the SACK. + */ + if (sctp_chunk_is_data(chunk)) + asoc->peer.last_data_from = chunk->transport; + else + SCTP_INC_STATS(SctpInCtrlChunks); + + if (chunk->transport) + chunk->transport->last_time_heard = jiffies; + + /* Run through the state machine. */ + error = sctp_do_sm(SCTP_EVENT_T_CHUNK, SCTP_ST_CHUNK(subtype), + state, ep, asoc, chunk, GFP_ATOMIC); + + /* Check to see if the association is freed in response to + * the incoming chunk. If so, get out of the while loop. + */ + if (!sctp_id2assoc(sk, associd)) + break; + + /* If there is an error on chunk, discard this packet. */ + if (error && chunk) + chunk->pdiscard = 1; + } + +} + +/* This routine moves an association from its old sk to a new sk. */ +void sctp_assoc_migrate(struct sctp_association *assoc, struct sock *newsk) +{ + struct sctp_opt *newsp = sctp_sk(newsk); + struct sock *oldsk = assoc->base.sk; + + /* Delete the association from the old endpoint's list of + * associations. + */ + list_del(&assoc->asocs); + + /* Decrement the backlog value for a TCP-style socket. */ + if (SCTP_SOCKET_TCP == sctp_sk(oldsk)->type) + oldsk->ack_backlog--; + + /* Release references to the old endpoint and the sock. */ + sctp_endpoint_put(assoc->ep); + sock_put(assoc->base.sk); + + /* Get a reference to the new endpoint. */ + assoc->ep = newsp->ep; + sctp_endpoint_hold(assoc->ep); + + /* Get a reference to the new sock. */ + assoc->base.sk = newsk; + sock_hold(assoc->base.sk); + + /* Add the association to the new endpoint's list of associations. */ + sctp_endpoint_add_asoc(newsp->ep, assoc); +} + +/* Update an association (possibly from unexpected COOKIE-ECHO processing). */ +void sctp_assoc_update(struct sctp_association *asoc, struct sctp_association *new) +{ + /* Copy in new parameters of peer. */ + asoc->c = new->c; + asoc->peer.rwnd = new->peer.rwnd; + asoc->peer.sack_needed = new->peer.sack_needed; + asoc->peer.i = new->peer.i; + sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_SIZE, + asoc->peer.i.initial_tsn); + + /* FIXME: + * Do we need to copy primary_path etc? + * + * More explicitly, addresses may have been removed and + * this needs accounting for. + */ + + /* If the case is A (association restart), use + * initial_tsn as next_tsn. If the case is B, use + * current next_tsn in case data sent to peer + * has been discarded and needs retransmission. + */ + if (SCTP_STATE_ESTABLISHED == asoc->state) { + + asoc->next_tsn = new->next_tsn; + asoc->ctsn_ack_point = new->ctsn_ack_point; + + /* Reinitialize SSN for both local streams + * and peer's streams. + */ + sctp_ssnmap_clear(asoc->ssnmap); + + } else { + asoc->ctsn_ack_point = asoc->next_tsn - 1; + if (!asoc->ssnmap) { + /* Move the ssnmap. */ + asoc->ssnmap = new->ssnmap; + new->ssnmap = NULL; + } + } + +} + +/* Update the retran path for sending a retransmitted packet. + * Round-robin through the active transports, else round-robin + * through the inactive transports as this is the next best thing + * we can try. + */ +void sctp_assoc_update_retran_path(struct sctp_association *asoc) +{ + struct sctp_transport *t, *next; + struct list_head *head = &asoc->peer.transport_addr_list; + struct list_head *pos; + + /* Find the next transport in a round-robin fashion. */ + t = asoc->peer.retran_path; + pos = &t->transports; + next = NULL; + + while (1) { + /* Skip the head. */ + if (pos->next == head) + pos = head->next; + else + pos = pos->next; + + t = list_entry(pos, struct sctp_transport, transports); + + /* Try to find an active transport. */ + + if (t->active) { + break; + } else { + /* Keep track of the next transport in case + * we don't find any active transport. + */ + if (!next) + next = t; + } + + /* We have exhausted the list, but didn't find any + * other active transports. If so, use the next + * transport. + */ + if (t == asoc->peer.retran_path) { + t = next; + break; + } + } + + asoc->peer.retran_path = t; +} + +/* Choose the transport for sending a SHUTDOWN packet. */ +struct sctp_transport *sctp_assoc_choose_shutdown_transport(struct sctp_association *asoc) +{ + /* If this is the first time SHUTDOWN is sent, use the active path, + * else use the retran path. If the last SHUTDOWN was sent over the + * retran path, update the retran path and use it. + */ + if (!asoc->shutdown_last_sent_to) + return asoc->peer.active_path; + else { + if (asoc->shutdown_last_sent_to == asoc->peer.retran_path) + sctp_assoc_update_retran_path(asoc); + return asoc->peer.retran_path; + } + +} + +/* Update the association's pmtu and frag_point by going through all the + * transports. This routine is called when a transport's PMTU has changed. + */ +void sctp_assoc_sync_pmtu(struct sctp_association *asoc) +{ + struct sctp_transport *t; + struct list_head *pos; + __u32 pmtu = 0; + + if (!asoc) + return; + + /* Get the lowest pmtu of all the transports. */ + list_for_each(pos, &asoc->peer.transport_addr_list) { + t = list_entry(pos, struct sctp_transport, transports); + if (!pmtu || (t->pmtu < pmtu)) + pmtu = t->pmtu; + } + + if (pmtu) { + asoc->pmtu = pmtu; + asoc->frag_point = sctp_frag_point(pmtu); + } + + SCTP_DEBUG_PRINTK("%s: asoc:%p, pmtu:%d, frag_point:%d\n", + __FUNCTION__, asoc, asoc->pmtu, asoc->frag_point); +} + +/* Should we send a SACK to update our peer? */ +static inline int sctp_peer_needs_update(struct sctp_association *asoc) +{ + switch (asoc->state) { + case SCTP_STATE_ESTABLISHED: + case SCTP_STATE_SHUTDOWN_PENDING: + case SCTP_STATE_SHUTDOWN_RECEIVED: + if ((asoc->rwnd > asoc->a_rwnd) && + ((asoc->rwnd - asoc->a_rwnd) >= + min_t(__u32, (asoc->base.sk->rcvbuf >> 1), asoc->pmtu))) + return 1; + break; + default: + break; + } + return 0; +} + +/* Increase asoc's rwnd by len and send any window update SACK if needed. */ +void sctp_assoc_rwnd_increase(struct sctp_association *asoc, int len) +{ + sctp_chunk_t *sack; + struct timer_list *timer; + + if (asoc->rwnd_over) { + if (asoc->rwnd_over >= len) { + asoc->rwnd_over -= len; + } else { + asoc->rwnd += (len - asoc->rwnd_over); + asoc->rwnd_over = 0; + } + } else { + asoc->rwnd += len; + } + + SCTP_DEBUG_PRINTK("%s: asoc %p rwnd increased by %d to (%u, %u) " + "- %u\n", __FUNCTION__, asoc, len, asoc->rwnd, + asoc->rwnd_over, asoc->a_rwnd); + + /* Send a window update SACK if the rwnd has increased by at least the + * minimum of the association's PMTU and half of the receive buffer. + * The algorithm used is similar to the one described in + * Section 4.2.3.3 of RFC 1122. + */ + if (sctp_peer_needs_update(asoc)) { + asoc->a_rwnd = asoc->rwnd; + SCTP_DEBUG_PRINTK("%s: Sending window update SACK- asoc: %p " + "rwnd: %u a_rwnd: %u\n", __FUNCTION__, + asoc, asoc->rwnd, asoc->a_rwnd); + sack = sctp_make_sack(asoc); + if (!sack) + return; + + asoc->peer.sack_needed = 0; + + sctp_outq_tail(&asoc->outqueue, sack); + + /* Stop the SACK timer. */ + timer = &asoc->timers[SCTP_EVENT_TIMEOUT_SACK]; + if (timer_pending(timer) && del_timer(timer)) + sctp_association_put(asoc); + } +} + +/* Decrease asoc's rwnd by len. */ +void sctp_assoc_rwnd_decrease(struct sctp_association *asoc, int len) +{ + SCTP_ASSERT(asoc->rwnd, "rwnd zero", return); + SCTP_ASSERT(!asoc->rwnd_over, "rwnd_over not zero", return); + if (asoc->rwnd >= len) { + asoc->rwnd -= len; + } else { + asoc->rwnd_over = len - asoc->rwnd; + asoc->rwnd = 0; + } + SCTP_DEBUG_PRINTK("%s: asoc %p rwnd decreased by %d to (%u, %u)\n", + __FUNCTION__, asoc, len, asoc->rwnd, + asoc->rwnd_over); +} + +/* Build the bind address list for the association based on info from the + * local endpoint and the remote peer. + */ +int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc, int gfp) +{ + sctp_scope_t scope; + int flags; + + /* Use scoping rules to determine the subset of addresses from + * the endpoint. + */ + scope = sctp_scope(&asoc->peer.active_path->ipaddr); + flags = (PF_INET6 == asoc->base.sk->family) ? SCTP_ADDR6_ALLOWED : 0; + if (asoc->peer.ipv4_address) + flags |= SCTP_ADDR4_PEERSUPP; + if (asoc->peer.ipv6_address) + flags |= SCTP_ADDR6_PEERSUPP; + + return sctp_bind_addr_copy(&asoc->base.bind_addr, + &asoc->ep->base.bind_addr, + scope, gfp, flags); +} + +/* Build the association's bind address list from the cookie. */ +int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *asoc, + sctp_cookie_t *cookie, int gfp) +{ + int var_size2 = ntohs(cookie->peer_init->chunk_hdr.length); + int var_size3 = cookie->raw_addr_list_len; + __u8 *raw = (__u8 *)cookie + sizeof(sctp_cookie_t) + var_size2; + + return sctp_raw_to_bind_addrs(&asoc->base.bind_addr, raw, var_size3, + asoc->ep->base.bind_addr.port, gfp); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/bind_addr.c linux-2.4.23-pre8/net/sctp/bind_addr.c --- linux-2.4.22/net/sctp/bind_addr.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/bind_addr.c 2003-10-22 22:47:29.000000000 +0000 @@ -0,0 +1,396 @@ +/* SCTP kernel reference Implementation + * Copyright (c) Cisco 1999,2000 + * Copyright (c) Motorola 1999,2000,2001 + * Copyright (c) International Business Machines Corp., 2001,2002 + * Copyright (c) La Monte H.P. Yarroll 2001 + * + * This file is part of the SCTP kernel reference implementation. + * + * A collection class to handle the storage of transport addresses. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Daisy Chang + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Forward declarations for internal helpers. */ +static int sctp_copy_one_addr(sctp_bind_addr_t *, union sctp_addr *, + sctp_scope_t scope, int gfp, int flags); +static void sctp_bind_addr_clean(sctp_bind_addr_t *); + +/* First Level Abstractions. */ + +/* Copy 'src' to 'dest' taking 'scope' into account. Omit addresses + * in 'src' which have a broader scope than 'scope'. + */ +int sctp_bind_addr_copy(sctp_bind_addr_t *dest, const sctp_bind_addr_t *src, + sctp_scope_t scope, int gfp, int flags) +{ + struct sockaddr_storage_list *addr; + struct list_head *pos; + int error = 0; + + /* All addresses share the same port. */ + dest->port = src->port; + + /* Extract the addresses which are relevant for this scope. */ + list_for_each(pos, &src->address_list) { + addr = list_entry(pos, struct sockaddr_storage_list, list); + error = sctp_copy_one_addr(dest, &addr->a, scope, + gfp, flags); + if (error < 0) + goto out; + } + + /* If there are no addresses matching the scope and + * this is global scope, try to get a link scope address, with + * the assumption that we must be sitting behind a NAT. + */ + if (list_empty(&dest->address_list) && (SCTP_SCOPE_GLOBAL == scope)) { + list_for_each(pos, &src->address_list) { + addr = list_entry(pos, struct sockaddr_storage_list, + list); + error = sctp_copy_one_addr(dest, &addr->a, + SCTP_SCOPE_LINK, gfp, + flags); + if (error < 0) + goto out; + } + } + +out: + if (error) + sctp_bind_addr_clean(dest); + + return error; +} + +/* Create a new SCTP_bind_addr from nothing. */ +sctp_bind_addr_t *sctp_bind_addr_new(int gfp) +{ + sctp_bind_addr_t *retval; + + retval = t_new(sctp_bind_addr_t, gfp); + if (!retval) + goto nomem; + + sctp_bind_addr_init(retval, 0); + retval->malloced = 1; + SCTP_DBG_OBJCNT_INC(bind_addr); + +nomem: + return retval; +} + +/* Initialize the SCTP_bind_addr structure for either an endpoint or + * an association. + */ +void sctp_bind_addr_init(sctp_bind_addr_t *bp, __u16 port) +{ + bp->malloced = 0; + + INIT_LIST_HEAD(&bp->address_list); + bp->port = port; +} + +/* Dispose of the address list. */ +static void sctp_bind_addr_clean(sctp_bind_addr_t *bp) +{ + struct sockaddr_storage_list *addr; + struct list_head *pos, *temp; + + /* Empty the bind address list. */ + list_for_each_safe(pos, temp, &bp->address_list) { + addr = list_entry(pos, struct sockaddr_storage_list, list); + list_del(pos); + kfree(addr); + SCTP_DBG_OBJCNT_DEC(addr); + } +} + +/* Dispose of an SCTP_bind_addr structure */ +void sctp_bind_addr_free(sctp_bind_addr_t *bp) +{ + /* Empty the bind address list. */ + sctp_bind_addr_clean(bp); + + if (bp->malloced) { + kfree(bp); + SCTP_DBG_OBJCNT_DEC(bind_addr); + } +} + +/* Add an address to the bind address list in the SCTP_bind_addr structure. */ +int sctp_add_bind_addr(sctp_bind_addr_t *bp, union sctp_addr *new, + int gfp) +{ + struct sockaddr_storage_list *addr; + + /* Add the address to the bind address list. */ + addr = t_new(struct sockaddr_storage_list, gfp); + if (!addr) + return -ENOMEM; + + addr->a = *new; + + /* Fix up the port if it has not yet been set. + * Both v4 and v6 have the port at the same offset. + */ + if (!addr->a.v4.sin_port) + addr->a.v4.sin_port = bp->port; + + INIT_LIST_HEAD(&addr->list); + list_add_tail(&addr->list, &bp->address_list); + SCTP_DBG_OBJCNT_INC(addr); + + return 0; +} + +/* Delete an address from the bind address list in the SCTP_bind_addr + * structure. + */ +int sctp_del_bind_addr(sctp_bind_addr_t *bp, union sctp_addr *del_addr) +{ + struct list_head *pos, *temp; + struct sockaddr_storage_list *addr; + + list_for_each_safe(pos, temp, &bp->address_list) { + addr = list_entry(pos, struct sockaddr_storage_list, list); + if (sctp_cmp_addr_exact(&addr->a, del_addr)) { + /* Found the exact match. */ + list_del(pos); + kfree(addr); + SCTP_DBG_OBJCNT_DEC(addr); + + return 0; + } + } + + return -EINVAL; +} + +/* Create a network byte-order representation of all the addresses + * formated as SCTP parameters. + * + * The second argument is the return value for the length. + */ +union sctp_params sctp_bind_addrs_to_raw(const sctp_bind_addr_t *bp, + int *addrs_len, int gfp) +{ + union sctp_params addrparms; + union sctp_params retval; + int addrparms_len; + sctp_addr_param_t rawaddr; + int len; + struct sockaddr_storage_list *addr; + struct list_head *pos; + addrparms_len = 0; + len = 0; + + /* Allocate enough memory at once. */ + list_for_each(pos, &bp->address_list) { + len += sizeof(sctp_addr_param_t); + } + + /* Don't even bother embedding an address if there + * is only one. + */ + if (len == sizeof(sctp_addr_param_t)) { + retval.v = NULL; + goto end_raw; + } + + retval.v = kmalloc(len, gfp); + if (!retval.v) + goto end_raw; + + addrparms = retval; + + list_for_each(pos, &bp->address_list) { + addr = list_entry(pos, struct sockaddr_storage_list, list); + len = sockaddr2sctp_addr(&addr->a, &rawaddr); + memcpy(addrparms.v, &rawaddr, len); + addrparms.v += len; + addrparms_len += len; + } + +end_raw: + *addrs_len = addrparms_len; + return retval; +} + +/* + * Create an address list out of the raw address list format (IPv4 and IPv6 + * address parameters). + */ +int sctp_raw_to_bind_addrs(sctp_bind_addr_t *bp, __u8 *raw_addr_list, + int addrs_len, __u16 port, int gfp) +{ + sctp_addr_param_t *rawaddr; + sctp_paramhdr_t *param; + union sctp_addr addr; + int retval = 0; + int len; + + /* Convert the raw address to standard address format */ + while (addrs_len) { + param = (sctp_paramhdr_t *)raw_addr_list; + rawaddr = (sctp_addr_param_t *)raw_addr_list; + + switch (param->type) { + case SCTP_PARAM_IPV4_ADDRESS: + case SCTP_PARAM_IPV6_ADDRESS: + sctp_param2sockaddr(&addr, rawaddr, port, 0); + retval = sctp_add_bind_addr(bp, &addr, gfp); + if (retval) { + /* Can't finish building the list, clean up. */ + sctp_bind_addr_clean(bp); + break;; + } + len = ntohs(param->length); + addrs_len -= len; + raw_addr_list += len; + break; + default: + /* Corrupted raw addr list! */ + retval = -EINVAL; + sctp_bind_addr_clean(bp); + break; + } + if (retval) + break; + } + + return retval; +} + +/******************************************************************** + * 2nd Level Abstractions + ********************************************************************/ + +/* Does this contain a specified address? Allow wildcarding. */ +int sctp_bind_addr_match(sctp_bind_addr_t *bp, const union sctp_addr *addr, + struct sctp_opt *opt) +{ + struct sockaddr_storage_list *laddr; + struct list_head *pos; + + list_for_each(pos, &bp->address_list) { + laddr = list_entry(pos, struct sockaddr_storage_list, list); + if (opt->pf->cmp_addr(&laddr->a, addr, opt)) + return 1; + } + + return 0; +} + +/* Copy out addresses from the global local address list. */ +static int sctp_copy_one_addr(sctp_bind_addr_t *dest, union sctp_addr *addr, + sctp_scope_t scope, int gfp, int flags) +{ + struct sctp_protocol *proto = sctp_get_protocol(); + int error = 0; + + if (sctp_is_any(addr)) { + error = sctp_copy_local_addr_list(proto, dest, scope, + gfp, flags); + } else if (sctp_in_scope(addr, scope)) { + /* Now that the address is in scope, check to see if + * the address type is supported by local sock as + * well as the remote peer. + */ + if ((((AF_INET == addr->sa.sa_family) && + (flags & SCTP_ADDR4_PEERSUPP))) || + (((AF_INET6 == addr->sa.sa_family) && + (flags & SCTP_ADDR6_ALLOWED) && + (flags & SCTP_ADDR6_PEERSUPP)))) + error = sctp_add_bind_addr(dest, addr, gfp); + } + + return error; +} + +/* Is this a wildcard address? */ +int sctp_is_any(const union sctp_addr *addr) +{ + struct sctp_af *af = sctp_get_af_specific(addr->sa.sa_family); + if (!af) + return 0; + return af->is_any(addr); +} + +/* Is 'addr' valid for 'scope'? */ +int sctp_in_scope(const union sctp_addr *addr, sctp_scope_t scope) +{ + sctp_scope_t addr_scope = sctp_scope(addr); + + /* The unusable SCTP addresses will not be considered with + * any defined scopes. + */ + if (SCTP_SCOPE_UNUSABLE == addr_scope) + return 0; + /* + * For INIT and INIT-ACK address list, let L be the level of + * of requested destination address, sender and receiver + * SHOULD include all of its addresses with level greater + * than or equal to L. + */ + if (addr_scope <= scope) + return 1; + + return 0; +} + +/******************************************************************** + * 3rd Level Abstractions + ********************************************************************/ + +/* What is the scope of 'addr'? */ +sctp_scope_t sctp_scope(const union sctp_addr *addr) +{ + struct sctp_af *af; + + af = sctp_get_af_specific(addr->sa.sa_family); + if (!af) + return SCTP_SCOPE_UNUSABLE; + + return af->scope((union sctp_addr *)addr); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/command.c linux-2.4.23-pre8/net/sctp/command.c --- linux-2.4.22/net/sctp/command.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/command.c 2003-10-22 22:47:30.000000000 +0000 @@ -0,0 +1,104 @@ +/* SCTP kernel reference Implementation Copyright (C) 1999-2001 + * Cisco, Motorola, and IBM + * Copyright 2001 La Monte H.P. Yarroll + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions manipulate sctp command sequences. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include + +/* Create a new sctp_command_sequence. */ +sctp_cmd_seq_t *sctp_new_cmd_seq(int gfp) +{ + sctp_cmd_seq_t *retval = t_new(sctp_cmd_seq_t, gfp); + + if (retval) + sctp_init_cmd_seq(retval); + + return retval; +} + +/* Initialize a block of memory as a command sequence. */ +int sctp_init_cmd_seq(sctp_cmd_seq_t *seq) +{ + memset(seq, 0, sizeof(sctp_cmd_seq_t)); + return 1; /* We always succeed. */ +} + +/* Add a command to a sctp_cmd_seq_t. + * Return 0 if the command sequence is full. + */ +int sctp_add_cmd(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj) +{ + if (seq->next_free_slot >= SCTP_MAX_NUM_COMMANDS) + goto fail; + + seq->cmds[seq->next_free_slot].verb = verb; + seq->cmds[seq->next_free_slot++].obj = obj; + + return 1; + +fail: + return 0; +} + +/* Rewind an sctp_cmd_seq_t to iterate from the start. */ +int sctp_rewind_sequence(sctp_cmd_seq_t *seq) +{ + seq->next_cmd = 0; + return 1; /* We always succeed. */ +} + +/* Return the next command structure in a sctp_cmd_seq. + * Returns NULL at the end of the sequence. + */ +sctp_cmd_t *sctp_next_cmd(sctp_cmd_seq_t *seq) +{ + sctp_cmd_t *retval = NULL; + + if (seq->next_cmd < seq->next_free_slot) + retval = &seq->cmds[seq->next_cmd++]; + + return retval; +} + +/* Dispose of a command sequence. */ +void sctp_free_cmd_seq(sctp_cmd_seq_t *seq) +{ + kfree(seq); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/crc32c.c linux-2.4.23-pre8/net/sctp/crc32c.c --- linux-2.4.22/net/sctp/crc32c.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/crc32c.c 2003-10-22 22:49:37.000000000 +0000 @@ -0,0 +1,220 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines, Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * SCTP Checksum functions + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Dinakaran Joseph + * Jon Grimm + * Sridhar Samudrala + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +/* The following code has been taken directly from + * draft-ietf-tsvwg-sctpcsum-03.txt + * + * The code has now been modified specifically for SCTP knowledge. + */ + +#include +#include + +#define CRC32C_POLY 0x1EDC6F41 +#define CRC32C(c,d) (c=(c>>8)^crc_c[(c^(d))&0xFF]) +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* Copyright 2001, D. Otis. Use this program, code or tables */ +/* extracted from it, as desired without restriction. */ +/* */ +/* 32 Bit Reflected CRC table generation for SCTP. */ +/* To accommodate serial byte data being shifted out least */ +/* significant bit first, the table's 32 bit words are reflected */ +/* which flips both byte and bit MS and LS positions. The CRC */ +/* is calculated MS bits first from the perspective of the serial*/ +/* stream. The x^32 term is implied and the x^0 term may also */ +/* be shown as +1. The polynomial code used is 0x1EDC6F41. */ +/* Castagnoli93 */ +/* x^32+x^28+x^27+x^26+x^25+x^23+x^22+x^20+x^19+x^18+x^14+x^13+ */ +/* x^11+x^10+x^9+x^8+x^6+x^0 */ +/* Guy Castagnoli Stefan Braeuer and Martin Herrman */ +/* "Optimization of Cyclic Redundancy-Check Codes */ +/* with 24 and 32 Parity Bits", */ +/* IEEE Transactions on Communications, Vol.41, No.6, June 1993 */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +__u32 crc_c[256] = { + 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, + 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB, + 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B, + 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24, + 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B, + 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384, + 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54, + 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B, + 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A, + 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35, + 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5, + 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA, + 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45, + 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A, + 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A, + 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595, + 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48, + 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957, + 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687, + 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198, + 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927, + 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38, + 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8, + 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7, + 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096, + 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789, + 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859, + 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46, + 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9, + 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6, + 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36, + 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829, + 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C, + 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93, + 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043, + 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C, + 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3, + 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC, + 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C, + 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033, + 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652, + 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D, + 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D, + 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982, + 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D, + 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622, + 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2, + 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED, + 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530, + 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F, + 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF, + 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0, + 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F, + 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540, + 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90, + 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F, + 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE, + 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1, + 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321, + 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E, + 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81, + 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E, + 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E, + 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351, +}; + +__u32 sctp_start_cksum(__u8 *buffer, __u16 length) +{ + __u32 crc32 = ~(__u32) 0; + __u32 i; + + /* Optimize this routine to be SCTP specific, knowing how + * to skip the checksum field of the SCTP header. + */ + + /* Calculate CRC up to the checksum. */ + for (i = 0; i < (sizeof(struct sctphdr) - sizeof(__u32)); i++) + CRC32C(crc32, buffer[i]); + + /* Skip checksum field of the header. */ + for (i = 0; i < sizeof(__u32); i++) + CRC32C(crc32, 0); + + /* Calculate the rest of the CRC. */ + for (i = sizeof(struct sctphdr); i < length ; i++) + CRC32C(crc32, buffer[i]); + + return crc32; +} + +__u32 sctp_update_cksum(__u8 *buffer, __u16 length, __u32 crc32) +{ + __u32 i; + + for (i = 0; i < length ; i++) + CRC32C(crc32, buffer[i]); + + return crc32; +} + +__u32 sctp_update_copy_cksum(__u8 *to, __u8 *from, __u16 length, __u32 crc32) +{ + __u32 i; + __u32 *_to = (__u32 *)to; + __u32 *_from = (__u32 *)from; + + for (i = 0; i < (length/4); i++) { + _to[i] = _from[i]; + CRC32C(crc32, from[i*4]); + CRC32C(crc32, from[i*4+1]); + CRC32C(crc32, from[i*4+2]); + CRC32C(crc32, from[i*4+3]); + } + + return crc32; +} + +__u32 sctp_end_cksum(__u32 crc32) +{ + __u32 result; + __u8 byte0, byte1, byte2, byte3; + + result = ~crc32; + + /* result now holds the negated polynomial remainder; + * since the table and algorithm is "reflected" [williams95]. + * That is, result has the same value as if we mapped the message + * to a polyomial, computed the host-bit-order polynomial + * remainder, performed final negation, then did an end-for-end + * bit-reversal. + * Note that a 32-bit bit-reversal is identical to four inplace + * 8-bit reversals followed by an end-for-end byteswap. + * In other words, the bytes of each bit are in the right order, + * but the bytes have been byteswapped. So we now do an explicit + * byteswap. On a little-endian machine, this byteswap and + * the final ntohl cancel out and could be elided. + */ + byte0 = result & 0xff; + byte1 = (result>>8) & 0xff; + byte2 = (result>>16) & 0xff; + byte3 = (result>>24) & 0xff; + + crc32 = ((byte0 << 24) | + (byte1 << 16) | + (byte2 << 8) | + byte3); + return crc32; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/debug.c linux-2.4.23-pre8/net/sctp/debug.c --- linux-2.4.22/net/sctp/debug.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/debug.c 2003-10-22 22:48:38.000000000 +0000 @@ -0,0 +1,202 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * This file is part of the implementation of the add-IP extension, + * based on June 29, 2001, + * for the SCTP kernel reference Implementation. + * + * This file converts numerical ID value to alphabetical names for SCTP + * terms such as chunk type, parameter time, event type, etc. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Xingang Guo + * Jon Grimm + * Daisy Chang + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include + +#if SCTP_DEBUG +int sctp_debug_flag = 1; /* Initially enable DEBUG */ +#endif /* SCTP_DEBUG */ + +/* These are printable forms of Chunk ID's from section 3.1. */ +static const char *sctp_cid_tbl[SCTP_NUM_BASE_CHUNK_TYPES] = { + "DATA", + "INIT", + "INIT_ACK", + "SACK", + "HEARTBEAT", + "HEARTBEAT_ACK", + "ABORT", + "SHUTDOWN", + "SHUTDOWN_ACK", + "ERROR", + "COOKIE_ECHO", + "COOKIE_ACK", + "ECN_ECNE", + "ECN_CWR", + "SHUTDOWN_COMPLETE", +}; + +/* Lookup "chunk type" debug name. */ +const char *sctp_cname(const sctp_subtype_t cid) +{ + if (cid.chunk < 0) + return "illegal chunk id"; + if (cid.chunk <= SCTP_CID_BASE_MAX) + return sctp_cid_tbl[cid.chunk]; + + switch (cid.chunk) { + case SCTP_CID_ASCONF: + return "ASCONF"; + + case SCTP_CID_ASCONF_ACK: + return "ASCONF_ACK"; + + default: + return "unknown chunk"; + }; + return "unknown chunk"; +} + +/* These are printable form of variable-length parameters. */ +const char *sctp_param_tbl[SCTP_PARAM_ECN_CAPABLE + 1] = { + "", + "PARAM_HEARTBEAT_INFO", + "", + "", + "", + "PARAM_IPV4_ADDRESS", + "PARAM_IPV6_ADDRESS", + "PARAM_STATE_COOKIE", + "PARAM_UNRECOGNIZED_PARAMETERS", + "PARAM_COOKIE_PRESERVATIVE", + "", + "PARAM_HOST_NAME_ADDRESS", + "PARAM_SUPPORTED_ADDRESS_TYPES", +}; + +/* These are printable forms of the states. */ +const char *sctp_state_tbl[SCTP_STATE_NUM_STATES] = { + "STATE_EMPTY", + "STATE_CLOSED", + "STATE_COOKIE_WAIT", + "STATE_COOKIE_ECHOED", + "STATE_ESTABLISHED", + "STATE_SHUTDOWN_PENDING", + "STATE_SHUTDOWN_SENT", + "STATE_SHUTDOWN_RECEIVED", + "STATE_SHUTDOWN_ACK_SENT", +}; + +/* Events that could change the state of an association. */ +const char *sctp_evttype_tbl[] = { + "EVENT_T_unknown", + "EVENT_T_CHUNK", + "EVENT_T_TIMEOUT", + "EVENT_T_OTHER", + "EVENT_T_PRIMITIVE" +}; + +/* Return value of a state function */ +const char *sctp_status_tbl[] = { + "DISPOSITION_DISCARD", + "DISPOSITION_CONSUME", + "DISPOSITION_NOMEM", + "DISPOSITION_DELETE_TCB", + "DISPOSITION_ABORT", + "DISPOSITION_VIOLATION", + "DISPOSITION_NOT_IMPL", + "DISPOSITION_ERROR", + "DISPOSITION_BUG" +}; + +/* Printable forms of primitives */ +static const char *sctp_primitive_tbl[SCTP_NUM_PRIMITIVE_TYPES] = { + "PRIMITIVE_ASSOCIATE", + "PRIMITIVE_SHUTDOWN", + "PRIMITIVE_ABORT", + "PRIMITIVE_SEND", + "PRIMITIVE_REQUESTHEARTBEAT", +}; + +/* Lookup primitive debug name. */ +const char *sctp_pname(const sctp_subtype_t id) +{ + if (id.primitive < 0) + return "illegal primitive"; + if (id.primitive <= SCTP_EVENT_PRIMITIVE_MAX) + return sctp_primitive_tbl[id.primitive]; + return "unknown_primitive"; +} + +static const char *sctp_other_tbl[] = { + "NO_PENDING_TSN", +}; + +/* Lookup "other" debug name. */ +const char *sctp_oname(const sctp_subtype_t id) +{ + if (id.other < 0) + return "illegal 'other' event"; + if (id.other < SCTP_EVENT_OTHER_MAX) + return sctp_other_tbl[id.other]; + return "unknown 'other' event"; +} + +static const char *sctp_timer_tbl[] = { + "TIMEOUT_NONE", + "TIMEOUT_T1_COOKIE", + "TIMEOUT_T1_INIT", + "TIMEOUT_T2_SHUTDOWN", + "TIMEOUT_T3_RTX", + "TIMEOUT_T5_SHUTDOWN_GUARD", + "TIMEOUT_HEARTBEAT", + "TIMEOUT_SACK", + "TIMEOUT_AUTOCLOSE", +}; + +/* Lookup timer debug name. */ +const char *sctp_tname(const sctp_subtype_t id) +{ + if (id.timeout < 0) + return "illegal 'timer' event"; + if (id.timeout <= SCTP_EVENT_TIMEOUT_MAX) + return sctp_timer_tbl[id.timeout]; + return "unknown_timer"; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/endpointola.c linux-2.4.23-pre8/net/sctp/endpointola.c --- linux-2.4.22/net/sctp/endpointola.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/endpointola.c 2003-10-22 22:49:58.000000000 +0000 @@ -0,0 +1,396 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2002 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * This file is part of the SCTP kernel reference Implementation + * + * This abstraction represents an SCTP endpoint. + * + * This file is part of the implementation of the add-IP extension, + * based on June 29, 2001, + * for the SCTP kernel reference Implementation. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Daisy Chang + * Dajiang Zhang + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include /* get_random_bytes() */ +#include +#include +#include +#include + +/* Forward declarations for internal helpers. */ +static void sctp_endpoint_bh_rcv(struct sctp_endpoint *ep); + +/* Create a sctp_endpoint with all that boring stuff initialized. + * Returns NULL if there isn't enough memory. + */ +struct sctp_endpoint *sctp_endpoint_new(struct sock *sk, int gfp) +{ + struct sctp_endpoint *ep; + + /* Build a local endpoint. */ + ep = t_new(struct sctp_endpoint, gfp); + if (!ep) + goto fail; + if (!sctp_endpoint_init(ep, sk, gfp)) + goto fail_init; + ep->base.malloced = 1; + SCTP_DBG_OBJCNT_INC(ep); + return ep; + +fail_init: + kfree(ep); +fail: + return NULL; +} + +/* + * Initialize the base fields of the endpoint structure. + */ +struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, + struct sock *sk, int gfp) +{ + struct sctp_opt *sp = sctp_sk(sk); + memset(ep, 0, sizeof(struct sctp_endpoint)); + + /* Initialize the base structure. */ + /* What type of endpoint are we? */ + ep->base.type = SCTP_EP_TYPE_SOCKET; + + /* Initialize the basic object fields. */ + atomic_set(&ep->base.refcnt, 1); + ep->base.dead = 0; + ep->base.malloced = 1; + + /* Create an input queue. */ + sctp_inq_init(&ep->base.inqueue); + + /* Set its top-half handler */ + sctp_inq_set_th_handler(&ep->base.inqueue, + (void (*)(void *))sctp_endpoint_bh_rcv, ep); + + /* Initialize the bind addr area */ + sctp_bind_addr_init(&ep->base.bind_addr, 0); + ep->base.addr_lock = RW_LOCK_UNLOCKED; + + /* Remember who we are attached to. */ + ep->base.sk = sk; + sock_hold(ep->base.sk); + + /* Create the lists of associations. */ + INIT_LIST_HEAD(&ep->asocs); + + /* Set up the base timeout information. */ + ep->timeouts[SCTP_EVENT_TIMEOUT_NONE] = 0; + ep->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] = + SCTP_DEFAULT_TIMEOUT_T1_COOKIE; + ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = + SCTP_DEFAULT_TIMEOUT_T1_INIT; + ep->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = + sp->rtoinfo.srto_initial; + ep->timeouts[SCTP_EVENT_TIMEOUT_T3_RTX] = 0; + + /* sctpimpguide-05 Section 2.12.2 + * If the 'T5-shutdown-guard' timer is used, it SHOULD be set to the + * recommended value of 5 times 'RTO.Max'. + */ + ep->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD] + = 5 * sp->rtoinfo.srto_max; + + ep->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = + SCTP_DEFAULT_TIMEOUT_HEARTBEAT; + ep->timeouts[SCTP_EVENT_TIMEOUT_SACK] = + SCTP_DEFAULT_TIMEOUT_SACK; + ep->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = + sp->autoclose * HZ; + + /* Set up the default send/receive buffer space. */ + + /* FIXME - Should the min and max window size be configurable + * sysctl parameters as opposed to be constants? + */ + sk->rcvbuf = SCTP_DEFAULT_MAXWINDOW; + sk->sndbuf = SCTP_DEFAULT_MAXWINDOW * 2; + + /* Use SCTP specific send buffer space queues. */ + sk->write_space = sctp_write_space; + sk->use_write_queue = 1; + + /* Initialize the secret key used with cookie. */ + get_random_bytes(&ep->secret_key[0], SCTP_SECRET_SIZE); + ep->last_key = ep->current_key = 0; + ep->key_changed_at = jiffies; + + ep->debug_name = "unnamedEndpoint"; + return ep; +} + +/* Add an association to an endpoint. */ +void sctp_endpoint_add_asoc(struct sctp_endpoint *ep, + struct sctp_association *asoc) +{ + struct sock *sk = ep->base.sk; + + /* Now just add it to our list of asocs */ + list_add_tail(&asoc->asocs, &ep->asocs); + + /* Increment the backlog value for a TCP-style listening socket. */ + if ((SCTP_SOCKET_TCP == sctp_sk(sk)->type) && + (SCTP_SS_LISTENING == sk->state)) + sk->ack_backlog++; +} + +/* Free the endpoint structure. Delay cleanup until + * all users have released their reference count on this structure. + */ +void sctp_endpoint_free(struct sctp_endpoint *ep) +{ + ep->base.dead = 1; + sctp_endpoint_put(ep); +} + +/* Final destructor for endpoint. */ +void sctp_endpoint_destroy(struct sctp_endpoint *ep) +{ + SCTP_ASSERT(ep->base.dead, "Endpoint is not dead", return); + + ep->base.sk->state = SCTP_SS_CLOSED; + + /* Unlink this endpoint, so we can't find it again! */ + sctp_unhash_endpoint(ep); + + /* Free up the HMAC transform. */ + if (sctp_sk(ep->base.sk)->hmac) + sctp_crypto_free_tfm(sctp_sk(ep->base.sk)->hmac); + + /* Cleanup. */ + sctp_inq_free(&ep->base.inqueue); + sctp_bind_addr_free(&ep->base.bind_addr); + + /* Remove and free the port */ + if (ep->base.sk->prev != NULL) + sctp_put_port(ep->base.sk); + + /* Give up our hold on the sock. */ + if (ep->base.sk) + sock_put(ep->base.sk); + + /* Finally, free up our memory. */ + if (ep->base.malloced) { + kfree(ep); + SCTP_DBG_OBJCNT_DEC(ep); + } +} + +/* Hold a reference to an endpoint. */ +void sctp_endpoint_hold(struct sctp_endpoint *ep) +{ + atomic_inc(&ep->base.refcnt); +} + +/* Release a reference to an endpoint and clean up if there are + * no more references. + */ +void sctp_endpoint_put(struct sctp_endpoint *ep) +{ + if (atomic_dec_and_test(&ep->base.refcnt)) + sctp_endpoint_destroy(ep); +} + +/* Is this the endpoint we are looking for? */ +struct sctp_endpoint *sctp_endpoint_is_match(struct sctp_endpoint *ep, + const union sctp_addr *laddr) +{ + struct sctp_endpoint *retval; + + sctp_read_lock(&ep->base.addr_lock); + if (ep->base.bind_addr.port == laddr->v4.sin_port) { + if (sctp_bind_addr_match(&ep->base.bind_addr, laddr, + sctp_sk(ep->base.sk))) { + retval = ep; + goto out; + } + } + + retval = NULL; + +out: + sctp_read_unlock(&ep->base.addr_lock); + return retval; +} + +/* Find the association that goes with this chunk. + * We do a linear search of the associations for this endpoint. + * We return the matching transport address too. + */ +struct sctp_association *__sctp_endpoint_lookup_assoc( + const struct sctp_endpoint *ep, + const union sctp_addr *paddr, + struct sctp_transport **transport) +{ + int rport; + struct sctp_association *asoc; + struct list_head *pos; + + rport = paddr->v4.sin_port; + + list_for_each(pos, &ep->asocs) { + asoc = list_entry(pos, struct sctp_association, asocs); + if (rport == asoc->peer.port) { + sctp_read_lock(&asoc->base.addr_lock); + *transport = sctp_assoc_lookup_paddr(asoc, paddr); + sctp_read_unlock(&asoc->base.addr_lock); + + if (*transport) + return asoc; + } + } + + *transport = NULL; + return NULL; +} + +/* Lookup association on an endpoint based on a peer address. BH-safe. */ +struct sctp_association *sctp_endpoint_lookup_assoc( + const struct sctp_endpoint *ep, + const union sctp_addr *paddr, + struct sctp_transport **transport) +{ + struct sctp_association *asoc; + + sctp_local_bh_disable(); + asoc = __sctp_endpoint_lookup_assoc(ep, paddr, transport); + sctp_local_bh_enable(); + + return asoc; +} + +/* Look for any peeled off association from the endpoint that matches the + * given peer address. + */ +int sctp_endpoint_is_peeled_off(struct sctp_endpoint *ep, + const union sctp_addr *paddr) +{ + struct list_head *pos; + struct sockaddr_storage_list *addr; + sctp_bind_addr_t *bp; + + sctp_read_lock(&ep->base.addr_lock); + bp = &ep->base.bind_addr; + list_for_each(pos, &bp->address_list) { + addr = list_entry(pos, struct sockaddr_storage_list, list); + if (sctp_has_association(&addr->a, paddr)) { + sctp_read_unlock(&ep->base.addr_lock); + return 1; + } + } + sctp_read_unlock(&ep->base.addr_lock); + + return 0; +} + +/* Do delayed input processing. This is scheduled by sctp_rcv(). + * This may be called on BH or task time. + */ +static void sctp_endpoint_bh_rcv(struct sctp_endpoint *ep) +{ + struct sctp_association *asoc; + struct sock *sk; + struct sctp_transport *transport; + sctp_chunk_t *chunk; + struct sctp_inq *inqueue; + sctp_subtype_t subtype; + sctp_state_t state; + int error = 0; + + if (ep->base.dead) + return; + + asoc = NULL; + inqueue = &ep->base.inqueue; + sk = ep->base.sk; + + while (NULL != (chunk = sctp_inq_pop(inqueue))) { + subtype.chunk = chunk->chunk_hdr->type; + + /* We might have grown an association since last we + * looked, so try again. + * + * This happens when we've just processed our + * COOKIE-ECHO chunk. + */ + if (NULL == chunk->asoc) { + asoc = sctp_endpoint_lookup_assoc(ep, + sctp_source(chunk), + &transport); + chunk->asoc = asoc; + chunk->transport = transport; + } + + state = asoc ? asoc->state : SCTP_STATE_CLOSED; + + /* Remember where the last DATA chunk came from so we + * know where to send the SACK. + */ + if (asoc && sctp_chunk_is_data(chunk)) + asoc->peer.last_data_from = chunk->transport; + else + SCTP_INC_STATS(SctpInCtrlChunks); + + if (chunk->transport) + chunk->transport->last_time_heard = jiffies; + + error = sctp_do_sm(SCTP_EVENT_T_CHUNK, subtype, state, + ep, asoc, chunk, GFP_ATOMIC); + + if (error && chunk) + chunk->pdiscard = 1; + + /* Check to see if the endpoint is freed in response to + * the incoming chunk. If so, get out of the while loop. + */ + if (!sctp_sk(sk)->ep) + break; + } +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/hashdriver.c linux-2.4.23-pre8/net/sctp/hashdriver.c --- linux-2.4.22/net/sctp/hashdriver.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/hashdriver.c 2003-10-22 22:49:22.000000000 +0000 @@ -0,0 +1,128 @@ +/* SCTP reference Implementation Copyright (C) 1999 Cisco And Motorola + * + * This file origiantes from Randy Stewart's SCTP reference Implementation. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Randy Stewart rstewar1@email.mot.com + * Ken Morneau kmorneau@cisco.com + * Qiaobing Xie qxie1@email.mot.com + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorperated into the next SCTP release. + * + * There are still LOTS of bugs in this code... I always run on the motto + * "it is a wonder any code ever works :)" + */ + +#include +#include +#include +#include + +/* SCTP Main driver. + * passing a two pointers and two lengths, + * returning a digest pointer filled. The md5 code + * was taken directly from the RFC (2104) so to understand it + * you may want to go look at the RFC referenced in the + * SCTP spec. We did modify this code to either user OUR + * implementation of SLA1 or the MD5 that comes from its + * RFC. SLA1 may have IPR issues so you need to check in + * to this if you wish to use it... Or at least that is + * what the FIP-180.1 web page says. + */ + +void sctp_hash_digest(const char *key, const int in_key_len, + const char *text, const int text_len, + __u8 *digest) +{ + int key_len = in_key_len; + struct SLA_1_Context context; + + __u8 k_ipad[65]; /* inner padding - + * key XORd with ipad + */ + __u8 k_opad[65]; /* outer padding - + * key XORd with opad + */ + __u8 tk[20]; + int i; + + /* if key is longer than 64 bytes reset it to key=MD5(key) */ + if (key_len > 64) { + struct SLA_1_Context tctx; + + SLA1_Init(&tctx); + SLA1_Process(&tctx, key, key_len); + SLA1_Final(&tctx,tk); + key = tk; + key_len = 20; + } + + /* + * the HMAC_MD5 transform looks like: + * + * MD5(K XOR opad, MD5(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected + */ + + /* start out by storing key in pads */ + memset(k_ipad, 0, sizeof k_ipad); + memset(k_opad, 0, sizeof k_opad); + memcpy(k_ipad, key, key_len); + memcpy(k_opad, key, key_len); + + /* XOR key with ipad and opad values */ + for (i = 0; i < 64; i++) { + k_ipad[i] ^= 0x36; + k_opad[i] ^= 0x5c; + } + + /* perform inner hash */ + SLA1_Init(&context); /* init context for 1st + * pass + */ + SLA1_Process(&context, k_ipad, 64); /* start with inner pad */ + SLA1_Process(&context, text, text_len); /* then text of datagram */ + SLA1_Final(&context,digest); /* finish up 1st pass */ + + /* + * perform outer hash + */ + SLA1_Init(&context); /* init context for 2nd + * pass + */ + SLA1_Process(&context, k_opad, 64); /* start with outer pad */ + SLA1_Process(&context, digest, 20); /* then results of 1st + * hash + */ + SLA1_Final(&context, digest); /* finish up 2nd pass */ +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/input.c linux-2.4.23-pre8/net/sctp/input.c --- linux-2.4.22/net/sctp/input.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/input.c 2003-10-22 22:49:10.000000000 +0000 @@ -0,0 +1,834 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions handle all input from the IP layer into SCTP. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Xingang Guo + * Jon Grimm + * Hui Huang + * Daisy Chang + * Sridhar Samudrala + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include /* For struct list_head */ +#include +#include +#include /* For struct timeval */ +#include +#include +#include +#include +#include +#include +#include + +/* Forward declarations for internal helpers. */ +static int sctp_rcv_ootb(struct sk_buff *); +struct sctp_association *__sctp_rcv_lookup(struct sk_buff *skb, + const union sctp_addr *laddr, + const union sctp_addr *paddr, + struct sctp_transport **transportp); +struct sctp_endpoint *__sctp_rcv_lookup_endpoint(const union sctp_addr *laddr); + + +/* Calculate the SCTP checksum of an SCTP packet. */ +static inline int sctp_rcv_checksum(struct sk_buff *skb) +{ + struct sctphdr *sh; + __u32 cmp, val; + struct sk_buff *list = skb_shinfo(skb)->frag_list; + + sh = (struct sctphdr *) skb->h.raw; + cmp = ntohl(sh->checksum); + + val = sctp_start_cksum((__u8 *)sh, skb_headlen(skb)); + + for (; list; list = list->next) + val = sctp_update_cksum((__u8 *)list->data, skb_headlen(list), + val); + + val = sctp_end_cksum(val); + + if (val != cmp) { + /* CRC failure, dump it. */ + SCTP_INC_STATS_BH(SctpChecksumErrors); + return -1; + } + return 0; +} + +/* + * This is the routine which IP calls when receiving an SCTP packet. + */ +int sctp_rcv(struct sk_buff *skb) +{ + struct sock *sk; + struct sctp_association *asoc; + struct sctp_endpoint *ep = NULL; + struct sctp_ep_common *rcvr; + struct sctp_transport *transport = NULL; + sctp_chunk_t *chunk; + struct sctphdr *sh; + union sctp_addr src; + union sctp_addr dest; + int family; + struct sctp_af *af; + int ret = 0; + + if (skb->pkt_type!=PACKET_HOST) + goto discard_it; + + SCTP_INC_STATS_BH(SctpInSCTPPacks); + + sh = (struct sctphdr *) skb->h.raw; + + /* Pull up the IP and SCTP headers. */ + __skb_pull(skb, skb->h.raw - skb->data); + if (skb->len < sizeof(struct sctphdr)) + goto bad_packet; + if (sctp_rcv_checksum(skb) < 0) + goto bad_packet; + + skb_pull(skb, sizeof(struct sctphdr)); + + family = ipver2af(skb->nh.iph->version); + af = sctp_get_af_specific(family); + if (unlikely(!af)) + goto bad_packet; + + /* Initialize local addresses for lookups. */ + af->from_skb(&src, skb, 1); + af->from_skb(&dest, skb, 0); + + /* If the packet is to or from a non-unicast address, + * silently discard the packet. + * + * This is not clearly defined in the RFC except in section + * 8.4 - OOTB handling. However, based on the book "Stream Control + * Transmission Protocol" 2.1, "It is important to note that the + * IP address of an SCTP transport address must be a routable + * unicast address. In other words, IP multicast addresses and + * IP broadcast addresses cannot be used in an SCTP transport + * address." + */ + if (!af->addr_valid(&src) || !af->addr_valid(&dest)) + goto discard_it; + + asoc = __sctp_rcv_lookup(skb, &src, &dest, &transport); + + /* + * RFC 2960, 8.4 - Handle "Out of the blue" Packets. + * An SCTP packet is called an "out of the blue" (OOTB) + * packet if it is correctly formed, i.e., passed the + * receiver's checksum check, but the receiver is not + * able to identify the association to which this + * packet belongs. + */ + if (!asoc) { + ep = __sctp_rcv_lookup_endpoint(&dest); + if (sctp_rcv_ootb(skb)) { + SCTP_INC_STATS_BH(SctpOutOfBlues); + goto discard_release; + } + } + + /* Retrieve the common input handling substructure. */ + rcvr = asoc ? &asoc->base : &ep->base; + sk = rcvr->sk; + + if (!ipsec_sk_policy(sk, skb)) + goto discard_release; + + ret = sk_filter(sk, skb, 1); + if (ret) + goto discard_release; + + /* Create an SCTP packet structure. */ + chunk = sctp_chunkify(skb, asoc, sk); + if (!chunk) { + ret = -ENOMEM; + goto discard_release; + } + + /* Remember what endpoint is to handle this packet. */ + chunk->rcvr = rcvr; + + /* Remember the SCTP header. */ + chunk->sctp_hdr = sh; + + /* Set the source and destination addresses of the incoming chunk. */ + sctp_init_addrs(chunk, &src, &dest); + + /* Remember where we came from. */ + chunk->transport = transport; + + /* Acquire access to the sock lock. Note: We are safe from other + * bottom halves on this lock, but a user may be in the lock too, + * so check if it is busy. + */ + sctp_bh_lock_sock(sk); + + if (sock_owned_by_user(sk)) + sk_add_backlog(sk, (struct sk_buff *) chunk); + else + sctp_backlog_rcv(sk, (struct sk_buff *) chunk); + + /* Release the sock and any reference counts we took in the + * lookup calls. + */ + sctp_bh_unlock_sock(sk); + if (asoc) + sctp_association_put(asoc); + else + sctp_endpoint_put(ep); + sock_put(sk); + return ret; + +bad_packet: + SCTP_INC_STATS(SctpChecksumErrors); + +discard_it: + kfree_skb(skb); + return ret; + +discard_release: + /* Release any structures we may be holding. */ + if (asoc) { + sock_put(asoc->base.sk); + sctp_association_put(asoc); + } else { + sock_put(ep->base.sk); + sctp_endpoint_put(ep); + } + + goto discard_it; +} + +/* Handle second half of inbound skb processing. If the sock was busy, + * we may have need to delay processing until later when the sock is + * released (on the backlog). If not busy, we call this routine + * directly from the bottom half. + */ +int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb) +{ + sctp_chunk_t *chunk; + struct sctp_inq *inqueue; + + /* One day chunk will live inside the skb, but for + * now this works. + */ + chunk = (sctp_chunk_t *) skb; + inqueue = &chunk->rcvr->inqueue; + + sctp_inq_push(inqueue, chunk); + return 0; +} + +/* Handle icmp frag needed error. */ +void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc, + struct sctp_transport *t, __u32 pmtu) +{ + if (unlikely(pmtu < SCTP_DEFAULT_MINSEGMENT)) { + printk(KERN_WARNING "%s: Reported pmtu %d too low, " + "using default minimum of %d\n", __FUNCTION__, pmtu, + SCTP_DEFAULT_MINSEGMENT); + pmtu = SCTP_DEFAULT_MINSEGMENT; + } + + if (!sock_owned_by_user(sk) && t && (t->pmtu != pmtu)) { + t->pmtu = pmtu; + sctp_assoc_sync_pmtu(asoc); + sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD); + } +} + +/* Common lookup code for icmp/icmpv6 error handler. */ +struct sock *sctp_err_lookup(int family, struct sk_buff *skb, + struct sctphdr *sctphdr, + struct sctp_endpoint **epp, + struct sctp_association **app, + struct sctp_transport **tpp) +{ + union sctp_addr saddr; + union sctp_addr daddr; + struct sctp_af *af; + struct sock *sk = NULL; + struct sctp_endpoint *ep = NULL; + struct sctp_association *asoc = NULL; + struct sctp_transport *transport = NULL; + + *app = NULL; *epp = NULL; *tpp = NULL; + + af = sctp_get_af_specific(family); + if (unlikely(!af)) { + return NULL; + } + + /* Initialize local addresses for lookups. */ + af->from_skb(&saddr, skb, 1); + af->from_skb(&daddr, skb, 0); + + /* Look for an association that matches the incoming ICMP error + * packet. + */ + asoc = __sctp_lookup_association(&saddr, &daddr, &transport); + if (!asoc) { + /* If there is no matching association, see if it matches any + * endpoint. This may happen for an ICMP error generated in + * response to an INIT_ACK. + */ + ep = __sctp_rcv_lookup_endpoint(&daddr); + if (!ep) { + return NULL; + } + } + + if (asoc) { + if (ntohl(sctphdr->vtag) != asoc->c.peer_vtag) { + ICMP_INC_STATS_BH(IcmpInErrors); + goto out; + } + sk = asoc->base.sk; + } else + sk = ep->base.sk; + + sctp_bh_lock_sock(sk); + + /* If too many ICMPs get dropped on busy + * servers this needs to be solved differently. + */ + if (sock_owned_by_user(sk)) + NET_INC_STATS_BH(LockDroppedIcmps); + + *epp = ep; + *app = asoc; + *tpp = transport; + return sk; + +out: + sock_put(sk); + if (asoc) + sctp_association_put(asoc); + if (ep) + sctp_endpoint_put(ep); + return NULL; +} + +/* Common cleanup code for icmp/icmpv6 error handler. */ +void sctp_err_finish(struct sock *sk, struct sctp_endpoint *ep, + struct sctp_association *asoc) +{ + sctp_bh_unlock_sock(sk); + sock_put(sk); + if (asoc) + sctp_association_put(asoc); + if (ep) + sctp_endpoint_put(ep); +} + +/* + * This routine is called by the ICMP module when it gets some + * sort of error condition. If err < 0 then the socket should + * be closed and the error returned to the user. If err > 0 + * it's just the icmp type << 8 | icmp code. After adjustment + * header points to the first 8 bytes of the sctp header. We need + * to find the appropriate port. + * + * The locking strategy used here is very "optimistic". When + * someone else accesses the socket the ICMP is just dropped + * and for some paths there is no check at all. + * A more general error queue to queue errors for later handling + * is probably better. + * + */ +void sctp_v4_err(struct sk_buff *skb, __u32 info) +{ + struct iphdr *iph = (struct iphdr *)skb->data; + struct sctphdr *sh = (struct sctphdr *)(skb->data + (iph->ihl <<2)); + int type = skb->h.icmph->type; + int code = skb->h.icmph->code; + struct sock *sk; + struct sctp_endpoint *ep; + struct sctp_association *asoc; + struct sctp_transport *transport; + struct inet_opt *inet; + char *saveip, *savesctp; + int err; + + if (skb->len < ((iph->ihl << 2) + 8)) { + ICMP_INC_STATS_BH(IcmpInErrors); + return; + } + + /* Fix up skb to look at the embedded net header. */ + saveip = skb->nh.raw; + savesctp = skb->h.raw; + skb->nh.iph = iph; + skb->h.raw = (char *)sh; + sk = sctp_err_lookup(AF_INET, skb, sh, &ep, &asoc, &transport); + /* Put back, the original pointers. */ + skb->nh.raw = saveip; + skb->h.raw = savesctp; + if (!sk) { + ICMP_INC_STATS_BH(IcmpInErrors); + return; + } + /* Warning: The sock lock is held. Remember to call + * sctp_err_finish! + */ + + switch (type) { + case ICMP_PARAMETERPROB: + err = EPROTO; + break; + case ICMP_DEST_UNREACH: + if (code > NR_ICMP_UNREACH) + goto out_unlock; + + /* PMTU discovery (RFC1191) */ + if (ICMP_FRAG_NEEDED == code) { + sctp_icmp_frag_needed(sk, asoc, transport, info); + goto out_unlock; + } + + err = icmp_err_convert[code].errno; + break; + case ICMP_TIME_EXCEEDED: + /* Ignore any time exceeded errors due to fragment reassembly + * timeouts. + */ + if (ICMP_EXC_FRAGTIME == code) + goto out_unlock; + + err = EHOSTUNREACH; + break; + default: + goto out_unlock; + } + + inet = inet_sk(sk); + if (!sock_owned_by_user(sk) && inet->recverr) { + sk->err = err; + sk->error_report(sk); + } else { /* Only an error on timeout */ + sk->err_soft = err; + } + +out_unlock: + sctp_err_finish(sk, ep, asoc); +} + +/* + * RFC 2960, 8.4 - Handle "Out of the blue" Packets. + * + * This function scans all the chunks in the OOTB packet to determine if + * the packet should be discarded right away. If a response might be needed + * for this packet, or, if further processing is possible, the packet will + * be queued to a proper inqueue for the next phase of handling. + * + * Output: + * Return 0 - If further processing is needed. + * Return 1 - If the packet can be discarded right away. + */ +int sctp_rcv_ootb(struct sk_buff *skb) +{ + sctp_chunkhdr_t *ch; + __u8 *ch_end; + sctp_errhdr_t *err; + + ch = (sctp_chunkhdr_t *) skb->data; + + /* Scan through all the chunks in the packet. */ + do { + ch_end = ((__u8 *) ch) + WORD_ROUND(ntohs(ch->length)); + + /* RFC 8.4, 2) If the OOTB packet contains an ABORT chunk, the + * receiver MUST silently discard the OOTB packet and take no + * further action. + */ + if (SCTP_CID_ABORT == ch->type) + goto discard; + + /* RFC 8.4, 6) If the packet contains a SHUTDOWN COMPLETE + * chunk, the receiver should silently discard the packet + * and take no further action. + */ + if (SCTP_CID_SHUTDOWN_COMPLETE == ch->type) + goto discard; + + /* RFC 8.4, 7) If the packet contains a "Stale cookie" ERROR + * or a COOKIE ACK the SCTP Packet should be silently + * discarded. + */ + if (SCTP_CID_COOKIE_ACK == ch->type) + goto discard; + + if (SCTP_CID_ERROR == ch->type) { + err = (sctp_errhdr_t *)(ch + sizeof(sctp_chunkhdr_t)); + if (SCTP_ERROR_STALE_COOKIE == err->cause) + goto discard; + } + + ch = (sctp_chunkhdr_t *) ch_end; + } while (ch_end < skb->tail); + + return 0; + +discard: + return 1; +} + +/* Insert endpoint into the hash table. */ +void __sctp_hash_endpoint(struct sctp_endpoint *ep) +{ + struct sctp_ep_common **epp; + struct sctp_ep_common *epb; + sctp_hashbucket_t *head; + + epb = &ep->base; + + epb->hashent = sctp_ep_hashfn(epb->bind_addr.port); + head = &sctp_proto.ep_hashbucket[epb->hashent]; + + sctp_write_lock(&head->lock); + epp = &head->chain; + epb->next = *epp; + if (epb->next) + (*epp)->pprev = &epb->next; + *epp = epb; + epb->pprev = epp; + sctp_write_unlock(&head->lock); +} + +/* Add an endpoint to the hash. Local BH-safe. */ +void sctp_hash_endpoint(struct sctp_endpoint *ep) +{ + sctp_local_bh_disable(); + __sctp_hash_endpoint(ep); + sctp_local_bh_enable(); +} + +/* Remove endpoint from the hash table. */ +void __sctp_unhash_endpoint(struct sctp_endpoint *ep) +{ + sctp_hashbucket_t *head; + struct sctp_ep_common *epb; + + epb = &ep->base; + + epb->hashent = sctp_ep_hashfn(epb->bind_addr.port); + + head = &sctp_proto.ep_hashbucket[epb->hashent]; + + sctp_write_lock(&head->lock); + + if (epb->pprev) { + if (epb->next) + epb->next->pprev = epb->pprev; + *epb->pprev = epb->next; + epb->pprev = NULL; + } + + sctp_write_unlock(&head->lock); +} + +/* Remove endpoint from the hash. Local BH-safe. */ +void sctp_unhash_endpoint(struct sctp_endpoint *ep) +{ + sctp_local_bh_disable(); + __sctp_unhash_endpoint(ep); + sctp_local_bh_enable(); +} + +/* Look up an endpoint. */ +struct sctp_endpoint *__sctp_rcv_lookup_endpoint(const union sctp_addr *laddr) +{ + sctp_hashbucket_t *head; + struct sctp_ep_common *epb; + struct sctp_endpoint *ep; + int hash; + + hash = sctp_ep_hashfn(laddr->v4.sin_port); + head = &sctp_proto.ep_hashbucket[hash]; + read_lock(&head->lock); + for (epb = head->chain; epb; epb = epb->next) { + ep = sctp_ep(epb); + if (sctp_endpoint_is_match(ep, laddr)) + goto hit; + } + + ep = sctp_sk((sctp_get_ctl_sock()))->ep; + epb = &ep->base; + +hit: + sctp_endpoint_hold(ep); + sock_hold(epb->sk); + read_unlock(&head->lock); + return ep; +} + +/* Add an association to the hash. Local BH-safe. */ +void sctp_hash_established(struct sctp_association *asoc) +{ + sctp_local_bh_disable(); + __sctp_hash_established(asoc); + sctp_local_bh_enable(); +} + +/* Insert association into the hash table. */ +void __sctp_hash_established(struct sctp_association *asoc) +{ + struct sctp_ep_common **epp; + struct sctp_ep_common *epb; + sctp_hashbucket_t *head; + + epb = &asoc->base; + + /* Calculate which chain this entry will belong to. */ + epb->hashent = sctp_assoc_hashfn(epb->bind_addr.port, asoc->peer.port); + + head = &sctp_proto.assoc_hashbucket[epb->hashent]; + + sctp_write_lock(&head->lock); + epp = &head->chain; + epb->next = *epp; + if (epb->next) + (*epp)->pprev = &epb->next; + *epp = epb; + epb->pprev = epp; + sctp_write_unlock(&head->lock); +} + +/* Remove association from the hash table. Local BH-safe. */ +void sctp_unhash_established(struct sctp_association *asoc) +{ + sctp_local_bh_disable(); + __sctp_unhash_established(asoc); + sctp_local_bh_enable(); +} + +/* Remove association from the hash table. */ +void __sctp_unhash_established(struct sctp_association *asoc) +{ + sctp_hashbucket_t *head; + struct sctp_ep_common *epb; + + epb = &asoc->base; + + epb->hashent = sctp_assoc_hashfn(epb->bind_addr.port, + asoc->peer.port); + + head = &sctp_proto.assoc_hashbucket[epb->hashent]; + + sctp_write_lock(&head->lock); + + if (epb->pprev) { + if (epb->next) + epb->next->pprev = epb->pprev; + *epb->pprev = epb->next; + epb->pprev = NULL; + } + + sctp_write_unlock(&head->lock); +} + +/* Look up an association. */ +struct sctp_association *__sctp_lookup_association( + const union sctp_addr *local, + const union sctp_addr *peer, + struct sctp_transport **pt) +{ + sctp_hashbucket_t *head; + struct sctp_ep_common *epb; + struct sctp_association *asoc; + struct sctp_transport *transport; + int hash; + + /* Optimize here for direct hit, only listening connections can + * have wildcards anyways. + */ + hash = sctp_assoc_hashfn(local->v4.sin_port, peer->v4.sin_port); + head = &sctp_proto.assoc_hashbucket[hash]; + read_lock(&head->lock); + for (epb = head->chain; epb; epb = epb->next) { + asoc = sctp_assoc(epb); + transport = sctp_assoc_is_match(asoc, local, peer); + if (transport) + goto hit; + } + + read_unlock(&head->lock); + + return NULL; + +hit: + *pt = transport; + sctp_association_hold(asoc); + sock_hold(epb->sk); + read_unlock(&head->lock); + return asoc; +} + +/* Look up an association. BH-safe. */ +struct sctp_association *sctp_lookup_association(const union sctp_addr *laddr, + const union sctp_addr *paddr, + struct sctp_transport **transportp) +{ + struct sctp_association *asoc; + + sctp_local_bh_disable(); + asoc = __sctp_lookup_association(laddr, paddr, transportp); + sctp_local_bh_enable(); + + return asoc; +} + +/* Is there an association matching the given local and peer addresses? */ +int sctp_has_association(const union sctp_addr *laddr, + const union sctp_addr *paddr) +{ + struct sctp_association *asoc; + struct sctp_transport *transport; + + if ((asoc = sctp_lookup_association(laddr, paddr, &transport))) { + sock_put(asoc->base.sk); + sctp_association_put(asoc); + return 1; + } + + return 0; +} + +/* + * SCTP Implementors Guide, 2.18 Handling of address + * parameters within the INIT or INIT-ACK. + * + * D) When searching for a matching TCB upon reception of an INIT + * or INIT-ACK chunk the receiver SHOULD use not only the + * source address of the packet (containing the INIT or + * INIT-ACK) but the receiver SHOULD also use all valid + * address parameters contained within the chunk. + * + * 2.18.3 Solution description + * + * This new text clearly specifies to an implementor the need + * to look within the INIT or INIT-ACK. Any implementation that + * does not do this, may not be able to establish associations + * in certain circumstances. + * + */ +static struct sctp_association *__sctp_rcv_init_lookup(struct sk_buff *skb, + const union sctp_addr *laddr, struct sctp_transport **transportp) +{ + struct sctp_association *asoc; + union sctp_addr addr; + union sctp_addr *paddr = &addr; + struct sctphdr *sh = (struct sctphdr *) skb->h.raw; + sctp_chunkhdr_t *ch; + union sctp_params params; + sctp_init_chunk_t *init; + + ch = (sctp_chunkhdr_t *) skb->data; + + /* If this is INIT/INIT-ACK look inside the chunk too. */ + switch (ch->type) { + case SCTP_CID_INIT: + case SCTP_CID_INIT_ACK: + break; + default: + return NULL; + } + + /* + * This code will NOT touch anything inside the chunk--it is + * strictly READ-ONLY. + * + * RFC 2960 3 SCTP packet Format + * + * Multiple chunks can be bundled into one SCTP packet up to + * the MTU size, except for the INIT, INIT ACK, and SHUTDOWN + * COMPLETE chunks. These chunks MUST NOT be bundled with any + * other chunk in a packet. See Section 6.10 for more details + * on chunk bundling. + */ + + /* Find the start of the TLVs and the end of the chunk. This is + * the region we search for address parameters. + */ + init = (sctp_init_chunk_t *)skb->data; + + /* Walk the parameters looking for embedded addresses. */ + sctp_walk_params(params, init, init_hdr.params) { + + /* Note: Ignoring hostname addresses. */ + if ((SCTP_PARAM_IPV4_ADDRESS != params.p->type) && + (SCTP_PARAM_IPV6_ADDRESS != params.p->type)) + continue; + + sctp_param2sockaddr(paddr, params.addr, ntohs(sh->source), 0); + asoc = __sctp_lookup_association(laddr, paddr, transportp); + if (asoc) + return asoc; + } + + return NULL; +} + +/* Lookup an association for an inbound skb. */ +struct sctp_association *__sctp_rcv_lookup(struct sk_buff *skb, + const union sctp_addr *paddr, + const union sctp_addr *laddr, + struct sctp_transport **transportp) +{ + struct sctp_association *asoc; + + asoc = __sctp_lookup_association(laddr, paddr, transportp); + + /* Further lookup for INIT/INIT-ACK packets. + * SCTP Implementors Guide, 2.18 Handling of address + * parameters within the INIT or INIT-ACK. + */ + if (!asoc) + asoc = __sctp_rcv_init_lookup(skb, laddr, transportp); + + return asoc; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/inqueue.c linux-2.4.23-pre8/net/sctp/inqueue.c --- linux-2.4.22/net/sctp/inqueue.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/inqueue.c 2003-10-22 22:48:34.000000000 +0000 @@ -0,0 +1,199 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2002 International Business Machines, Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions are the methods for accessing the SCTP inqueue. + * + * An SCTP inqueue is a queue into which you push SCTP packets + * (which might be bundles or fragments of chunks) and out of which you + * pop SCTP whole chunks. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include + +/* Initialize an SCTP inqueue. */ +void sctp_inq_init(struct sctp_inq *queue) +{ + skb_queue_head_init(&queue->in); + queue->in_progress = NULL; + + /* Create a task for delivering data. */ + INIT_LIST_HEAD(&queue->immediate.list); + queue->immediate.sync = 0; + queue->immediate.routine = NULL; + queue->immediate.data = NULL; + + queue->malloced = 0; +} + +/* Create an initialized sctp_inq. */ +struct sctp_inq *sctp_inq_new(void) +{ + struct sctp_inq *retval; + + retval = t_new(struct sctp_inq, GFP_ATOMIC); + if (retval) { + sctp_inq_init(retval); + retval->malloced = 1; + } + return retval; +} + +/* Release the memory associated with an SCTP inqueue. */ +void sctp_inq_free(struct sctp_inq *queue) +{ + sctp_chunk_t *chunk; + + /* Empty the queue. */ + while ((chunk = (sctp_chunk_t *) skb_dequeue(&queue->in))) + sctp_free_chunk(chunk); + + /* If there is a packet which is currently being worked on, + * free it as well. + */ + if (queue->in_progress) + sctp_free_chunk(queue->in_progress); + + if (queue->malloced) { + /* Dump the master memory segment. */ + kfree(queue); + } +} + +/* Put a new packet in an SCTP inqueue. + * We assume that packet->sctp_hdr is set and in host byte order. + */ +void sctp_inq_push(struct sctp_inq *q, sctp_chunk_t *packet) +{ + /* Directly call the packet handling routine. */ + + /* We are now calling this either from the soft interrupt + * or from the backlog processing. + * Eventually, we should clean up inqueue to not rely + * on the BH related data structures. + */ + skb_queue_tail(&(q->in), (struct sk_buff *) packet); + q->immediate.routine(q->immediate.data); +} + +/* Extract a chunk from an SCTP inqueue. + * + * WARNING: If you need to put the chunk on another queue, you need to + * make a shallow copy (clone) of it. + */ +sctp_chunk_t *sctp_inq_pop(struct sctp_inq *queue) +{ + sctp_chunk_t *chunk; + sctp_chunkhdr_t *ch = NULL; + + /* The assumption is that we are safe to process the chunks + * at this time. + */ + + if ((chunk = queue->in_progress)) { + /* There is a packet that we have been working on. + * Any post processing work to do before we move on? + */ + if (chunk->singleton || + chunk->end_of_packet || + chunk->pdiscard) { + sctp_free_chunk(chunk); + chunk = queue->in_progress = NULL; + } else { + /* Nothing to do. Next chunk in the packet, please. */ + ch = (sctp_chunkhdr_t *) chunk->chunk_end; + + /* Force chunk->skb->data to chunk->chunk_end. */ + skb_pull(chunk->skb, + chunk->chunk_end - chunk->skb->data); + } + } + + /* Do we need to take the next packet out of the queue to process? */ + if (!chunk) { + /* Is the queue empty? */ + if (skb_queue_empty(&queue->in)) + return NULL; + + chunk = queue->in_progress = + (sctp_chunk_t *) skb_dequeue(&queue->in); + + /* This is the first chunk in the packet. */ + chunk->singleton = 1; + ch = (sctp_chunkhdr_t *) chunk->skb->data; + } + + chunk->chunk_hdr = ch; + chunk->chunk_end = ((__u8 *) ch) + + WORD_ROUND(ntohs(ch->length)); + skb_pull(chunk->skb, sizeof(sctp_chunkhdr_t)); + chunk->subh.v = NULL; /* Subheader is no longer valid. */ + + if (chunk->chunk_end < chunk->skb->tail) { + /* This is not a singleton */ + chunk->singleton = 0; + } else { + /* We are at the end of the packet, so mark the chunk + * in case we need to send a SACK. + */ + chunk->end_of_packet = 1; + } + + SCTP_DEBUG_PRINTK("+++sctp_inq_pop+++ chunk %p[%s]," + " length %d, skb->len %d\n",chunk, + sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)), + ntohs(chunk->chunk_hdr->length), chunk->skb->len); + return chunk; +} + +/* Set a top-half handler. + * + * Originally, we the top-half handler was scheduled as a BH. We now + * call the handler directly in sctp_inq_push() at a time that + * we know we are lock safe. + * The intent is that this routine will pull stuff out of the + * inqueue and process it. + */ +void sctp_inq_set_th_handler(struct sctp_inq *q, + void (*callback)(void *), void *arg) +{ + q->immediate.routine = callback; + q->immediate.data = arg; +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/ipv6.c linux-2.4.23-pre8/net/sctp/ipv6.c --- linux-2.4.22/net/sctp/ipv6.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/ipv6.c 2003-10-22 22:48:55.000000000 +0000 @@ -0,0 +1,868 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * Copyright (c) 2002-2003 International Business Machines, Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * SCTP over IPv6. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Le Yanqun + * Hui Huang + * La Monte H.P. Yarroll + * Sridhar Samudrala + * Jon Grimm + * + * Based on: + * linux/net/ipv6/tcp_ipv6.c + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#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 + +extern struct notifier_block sctp_inetaddr_notifier; + +/* FIXME: This macro needs to be moved to a common header file. */ +#define NIP6(addr) \ + ntohs((addr)->s6_addr16[0]), \ + ntohs((addr)->s6_addr16[1]), \ + ntohs((addr)->s6_addr16[2]), \ + ntohs((addr)->s6_addr16[3]), \ + ntohs((addr)->s6_addr16[4]), \ + ntohs((addr)->s6_addr16[5]), \ + ntohs((addr)->s6_addr16[6]), \ + ntohs((addr)->s6_addr16[7]) + +/* ICMP error handler. */ +void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, + int type, int code, int offset, __u32 info) +{ + struct inet6_dev *idev; + struct ipv6hdr *iph = (struct ipv6hdr *)skb->data; + struct sctphdr *sh = (struct sctphdr *)(skb->data + offset); + struct sock *sk; + struct sctp_endpoint *ep; + struct sctp_association *asoc; + struct sctp_transport *transport; + struct ipv6_pinfo *np; + char *saveip, *savesctp; + int err; + + idev = in6_dev_get(skb->dev); + + /* Fix up skb to look at the embedded net header. */ + saveip = skb->nh.raw; + savesctp = skb->h.raw; + skb->nh.ipv6h = iph; + skb->h.raw = (char *)sh; + sk = sctp_err_lookup(AF_INET6, skb, sh, &ep, &asoc, &transport); + /* Put back, the original pointers. */ + skb->nh.raw = saveip; + skb->h.raw = savesctp; + if (!sk) { + ICMP6_INC_STATS_BH(Icmp6InErrors); + goto out; + } + + /* Warning: The sock lock is held. Remember to call + * sctp_err_finish! + */ + + switch (type) { + case ICMPV6_PKT_TOOBIG: + sctp_icmp_frag_needed(sk, asoc, transport, ntohl(info)); + goto out_unlock; + default: + break; + } + + np = inet6_sk(sk); + icmpv6_err_convert(type, code, &err); + if (!sock_owned_by_user(sk) && np->recverr) { + sk->err = err; + sk->error_report(sk); + } else { /* Only an error on timeout */ + sk->err_soft = err; + } + +out_unlock: + sctp_err_finish(sk, ep, asoc); +out: + if (likely(idev != NULL)) + in6_dev_put(idev); +} + +/* Based on tcp_v6_xmit() in tcp_ipv6.c. */ +static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport, + int ipfragok) +{ + struct sock *sk = skb->sk; + struct ipv6_pinfo *np = inet6_sk(sk); + struct flowi fl; + + fl.proto = sk->protocol; + + /* Fill in the dest address from the route entry passed with the skb + * and the source address from the transport. + */ + fl.fl6_dst = &transport->ipaddr.v6.sin6_addr; + fl.fl6_src = &transport->saddr.v6.sin6_addr; + + fl.fl6_flowlabel = np->flow_label; + IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel); + if (ipv6_addr_type(fl.fl6_src) & IPV6_ADDR_LINKLOCAL) + fl.oif = transport->saddr.v6.sin6_scope_id; + else + fl.oif = sk->bound_dev_if; + fl.uli_u.ports.sport = (sk)->sport; + fl.uli_u.ports.dport = transport->ipaddr.v6.sin6_port; + + if (np->opt && np->opt->srcrt) { + struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt; + fl.nl_u.ip6_u.daddr = rt0->addr; + } + + SCTP_DEBUG_PRINTK("%s: skb:%p, len:%d, " + "src:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x " + "dst:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", + __FUNCTION__, skb, skb->len, NIP6(fl.fl6_src), + NIP6(fl.fl6_dst)); + + SCTP_INC_STATS(SctpOutSCTPPacks); + + return ip6_xmit(sk, skb, &fl, np->opt); +} + +/* Returns the dst cache entry for the given source and destination ip + * addresses. + */ +struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc, + union sctp_addr *daddr, + union sctp_addr *saddr) +{ + struct dst_entry *dst; + struct flowi fl = { + .nl_u = { .ip6_u = { .daddr = &daddr->v6.sin6_addr, } } }; + + SCTP_DEBUG_PRINTK("%s: DST=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x ", + __FUNCTION__, NIP6(fl.fl6_dst)); + + if (saddr) { + fl.fl6_src = &saddr->v6.sin6_addr; + SCTP_DEBUG_PRINTK( + "SRC=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x - ", + NIP6(fl.fl6_src)); + } + + dst = ip6_route_output(NULL, &fl); + if (dst) { + struct rt6_info *rt; + rt = (struct rt6_info *)dst; + SCTP_DEBUG_PRINTK( + "rt6_dst:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x " + "rt6_src:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", + NIP6(&rt->rt6i_dst.addr), NIP6(&rt->rt6i_src.addr)); + } else { + SCTP_DEBUG_PRINTK("NO ROUTE\n"); + } + + return dst; +} + +/* Returns the number of consecutive initial bits that match in the 2 ipv6 + * addresses. + */ +static inline int sctp_v6_addr_match_len(union sctp_addr *s1, + union sctp_addr *s2) +{ + struct in6_addr *a1 = &s1->v6.sin6_addr; + struct in6_addr *a2 = &s2->v6.sin6_addr; + int i, j; + + for (i = 0; i < 4 ; i++) { + __u32 a1xora2; + + a1xora2 = a1->s6_addr32[i] ^ a2->s6_addr32[i]; + + if ((j = fls(ntohl(a1xora2)))) + return (i * 32 + 32 - j); + } + + return (i*32); +} + +/* Fills in the source address(saddr) based on the destination address(daddr) + * and asoc's bind address list. + */ +void sctp_v6_get_saddr(struct sctp_association *asoc, struct dst_entry *dst, + union sctp_addr *daddr, union sctp_addr *saddr) +{ + sctp_bind_addr_t *bp; + rwlock_t *addr_lock; + struct sockaddr_storage_list *laddr; + struct list_head *pos; + sctp_scope_t scope; + union sctp_addr *baddr = NULL; + __u8 matchlen = 0; + __u8 bmatchlen; + + SCTP_DEBUG_PRINTK("%s: asoc:%p dst:%p " + "daddr:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x ", + __FUNCTION__, asoc, dst, NIP6(&daddr->v6.sin6_addr)); + + if (!asoc) { + ipv6_get_saddr(dst, &daddr->v6.sin6_addr,&saddr->v6.sin6_addr); + SCTP_DEBUG_PRINTK("saddr from ipv6_get_saddr: " + "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", + NIP6(&saddr->v6.sin6_addr)); + return; + } + + scope = sctp_scope(daddr); + + bp = &asoc->base.bind_addr; + addr_lock = &asoc->base.addr_lock; + + /* Go through the bind address list and find the best source address + * that matches the scope of the destination address. + */ + sctp_read_lock(addr_lock); + list_for_each(pos, &bp->address_list) { + laddr = list_entry(pos, struct sockaddr_storage_list, list); + if ((laddr->a.sa.sa_family == AF_INET6) && + (scope <= sctp_scope(&laddr->a))) { + bmatchlen = sctp_v6_addr_match_len(daddr, &laddr->a); + if (!baddr || (matchlen < bmatchlen)) { + baddr = &laddr->a; + matchlen = bmatchlen; + } + } + } + + if (baddr) { + memcpy(saddr, baddr, sizeof(union sctp_addr)); + SCTP_DEBUG_PRINTK("saddr: " + "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", + NIP6(&saddr->v6.sin6_addr)); + } else { + printk(KERN_ERR "%s: asoc:%p Could not find a valid source " + "address for the " + "dest:%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", + __FUNCTION__, asoc, NIP6(&daddr->v6.sin6_addr)); + } + + sctp_read_unlock(addr_lock); +} + +/* Make a copy of all potential local addresses. */ +static void sctp_v6_copy_addrlist(struct list_head *addrlist, + struct net_device *dev) +{ + struct inet6_dev *in6_dev; + struct inet6_ifaddr *ifp; + struct sockaddr_storage_list *addr; + + read_lock(&addrconf_lock); + if ((in6_dev = __in6_dev_get(dev)) == NULL) { + read_unlock(&addrconf_lock); + return; + } + + read_lock(&in6_dev->lock); + for (ifp = in6_dev->addr_list; ifp; ifp = ifp->if_next) { + /* Add the address to the local list. */ + addr = t_new(struct sockaddr_storage_list, GFP_ATOMIC); + if (addr) { + addr->a.v6.sin6_family = AF_INET6; + addr->a.v6.sin6_port = 0; + addr->a.v6.sin6_addr = ifp->addr; + addr->a.v6.sin6_scope_id = dev->ifindex; + INIT_LIST_HEAD(&addr->list); + list_add_tail(&addr->list, addrlist); + } + } + + read_unlock(&in6_dev->lock); + read_unlock(&addrconf_lock); +} + +/* Initialize a sockaddr_storage from in incoming skb. */ +static void sctp_v6_from_skb(union sctp_addr *addr,struct sk_buff *skb, + int is_saddr) +{ + void *from; + __u16 *port; + struct sctphdr *sh; + + port = &addr->v6.sin6_port; + addr->v6.sin6_family = AF_INET6; + addr->v6.sin6_flowinfo = 0; /* FIXME */ + addr->v6.sin6_scope_id = ((struct inet6_skb_parm *)skb->cb)->iif; + + sh = (struct sctphdr *) skb->h.raw; + if (is_saddr) { + *port = ntohs(sh->source); + from = &skb->nh.ipv6h->saddr; + } else { + *port = ntohs(sh->dest); + from = &skb->nh.ipv6h->daddr; + } + ipv6_addr_copy(&addr->v6.sin6_addr, from); +} + +/* Initialize an sctp_addr from a socket. */ +static void sctp_v6_from_sk(union sctp_addr *addr, struct sock *sk) +{ + addr->v6.sin6_family = AF_INET6; + addr->v6.sin6_port = (sk)->num; + addr->v6.sin6_addr = inet6_sk(sk)->rcv_saddr; +} + +/* Initialize sk->rcv_saddr from sctp_addr. */ +static void sctp_v6_to_sk_saddr(union sctp_addr *addr, struct sock *sk) +{ + inet6_sk(sk)->rcv_saddr = addr->v6.sin6_addr; +} + +/* Initialize sk->daddr from sctp_addr. */ +static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk) +{ + inet6_sk(sk)->daddr = addr->v6.sin6_addr; +} + +/* Initialize a sctp_addr from a dst_entry. */ +static void sctp_v6_dst_saddr(union sctp_addr *addr, struct dst_entry *dst, + unsigned short port) +{ + struct rt6_info *rt = (struct rt6_info *)dst; + addr->sa.sa_family = AF_INET6; + addr->v6.sin6_port = port; + ipv6_addr_copy(&addr->v6.sin6_addr, &rt->rt6i_src.addr); +} + +/* Compare addresses exactly. + * FIXME: v4-mapped-v6. + */ +static int sctp_v6_cmp_addr(const union sctp_addr *addr1, + const union sctp_addr *addr2) +{ + if (addr1->sa.sa_family != addr2->sa.sa_family) + return 0; + if (ipv6_addr_cmp(&addr1->v6.sin6_addr, &addr2->v6.sin6_addr)) + return 0; + /* If this is a linklocal address, compare the scope_id. */ + if (ipv6_addr_type(&addr1->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL) { + if (addr1->v6.sin6_scope_id && addr2->v6.sin6_scope_id && + (addr1->v6.sin6_scope_id != addr2->v6.sin6_scope_id)) { + return 0; + } + } + + return 1; +} + +/* Initialize addr struct to INADDR_ANY. */ +static void sctp_v6_inaddr_any(union sctp_addr *addr, unsigned short port) +{ + memset(addr, 0x00, sizeof(union sctp_addr)); + addr->v6.sin6_family = AF_INET6; + addr->v6.sin6_port = port; +} + +/* Is this a wildcard address? */ +static int sctp_v6_is_any(const union sctp_addr *addr) +{ + int type; + type = ipv6_addr_type((struct in6_addr *)&addr->v6.sin6_addr); + return IPV6_ADDR_ANY == type; +} + +/* Should this be available for binding? */ +static int sctp_v6_available(const union sctp_addr *addr) +{ + int type; + struct in6_addr *in6 = (struct in6_addr *)&addr->v6.sin6_addr; + + type = ipv6_addr_type(in6); + if (IPV6_ADDR_ANY == type) + return 1; + if (!(type & IPV6_ADDR_UNICAST)) + return 0; + + return ipv6_chk_addr(in6, NULL); +} + +/* This function checks if the address is a valid address to be used for + * SCTP. + * + * Output: + * Return 0 - If the address is a non-unicast or an illegal address. + * Return 1 - If the address is a unicast. + */ +static int sctp_v6_addr_valid(union sctp_addr *addr) +{ + int ret = ipv6_addr_type(&addr->v6.sin6_addr); + + /* FIXME: v4-mapped-v6 address support. */ + + /* Is this a non-unicast address */ + if (!(ret & IPV6_ADDR_UNICAST)) + return 0; + + return 1; +} + +/* What is the scope of 'addr'? */ +static sctp_scope_t sctp_v6_scope(union sctp_addr *addr) +{ + int v6scope; + sctp_scope_t retval; + + /* The IPv6 scope is really a set of bit fields. + * See IFA_* in . Map to a generic SCTP scope. + */ + + v6scope = ipv6_addr_scope(&addr->v6.sin6_addr); + switch (v6scope) { + case IFA_HOST: + retval = SCTP_SCOPE_LOOPBACK; + break; + case IFA_LINK: + retval = SCTP_SCOPE_LINK; + break; + case IFA_SITE: + retval = SCTP_SCOPE_PRIVATE; + break; + default: + retval = SCTP_SCOPE_GLOBAL; + break; + }; + + return retval; +} + +/* Create and initialize a new sk for the socket to be returned by accept(). */ +struct sock *sctp_v6_create_accept_sk(struct sock *sk, + struct sctp_association *asoc) +{ + struct sock *newsk; + struct inet_opt *newinet; + struct ipv6_pinfo *newnp, *np = inet6_sk(sk); + + newsk = sk_alloc(PF_INET6, GFP_KERNEL, sizeof(struct sock)); + if (!newsk) + goto out; + + sock_init_data(NULL, newsk); + sk_set_owner(newsk, THIS_MODULE); + + newsk->type = SOCK_STREAM; + + newsk->prot = sk->prot; + newsk->no_check = sk->no_check; + newsk->reuse = sk->reuse; + + newsk->destruct = inet_sock_destruct; + newsk->zapped = 0; + newsk->family = PF_INET6; + newsk->protocol = IPPROTO_SCTP; + newsk->backlog_rcv = sk->prot->backlog_rcv; + newsk->shutdown = sk->shutdown; + + newinet = inet_sk(newsk); + newnp = inet6_sk(newsk); + + memcpy(newnp, np, sizeof(struct ipv6_pinfo)); + + /* Initialize sk's sport, dport, rcv_saddr and daddr for getsockname() + * and getpeername(). + */ + newsk->sport = sk->sport; + newnp->saddr = np->saddr; + newnp->rcv_saddr = np->rcv_saddr; + newsk->dport = htons(asoc->peer.port); + newnp->daddr = asoc->peer.primary_addr.v6.sin6_addr; + +#ifdef INET_REFCNT_DEBUG + atomic_inc(&inet6_sock_nr); + atomic_inc(&inet_sock_nr); +#endif + + if (0 != newsk->prot->init(newsk)) { + inet_sock_release(newsk); + newsk = NULL; + } + +out: + return newsk; +} + +/* Where did this skb come from? */ +static int sctp_v6_skb_iif(const struct sk_buff *skb) +{ + struct inet6_skb_parm *opt = (struct inet6_skb_parm *) skb->cb; + return opt->iif; +} + +/* Initialize a PF_INET6 socket msg_name. */ +static void sctp_inet6_msgname(char *msgname, int *addr_len) +{ + struct sockaddr_in6 *sin6; + + sin6 = (struct sockaddr_in6 *)msgname; + sin6->sin6_family = AF_INET6; + sin6->sin6_flowinfo = 0; + sin6->sin6_scope_id = 0; /*FIXME */ + *addr_len = sizeof(struct sockaddr_in6); +} + +/* Initialize a PF_INET msgname from a ulpevent. */ +static void sctp_inet6_event_msgname(struct sctp_ulpevent *event, + char *msgname, int *addrlen) +{ + struct sockaddr_in6 *sin6, *sin6from; + + if (msgname) { + union sctp_addr *addr; + + sctp_inet6_msgname(msgname, addrlen); + sin6 = (struct sockaddr_in6 *)msgname; + sin6->sin6_port = htons(event->event_asoc->peer.port); + addr = &event->event_asoc->peer.primary_addr; + + /* Note: If we go to a common v6 format, this code + * will change. + */ + + /* Map ipv4 address into v4-mapped-on-v6 address. */ + if (AF_INET == addr->sa.sa_family) { + /* FIXME: Easy, but there was no way to test this + * yet. + */ + return; + } + + sin6from = &event->event_asoc->peer.primary_addr.v6; + ipv6_addr_copy(&sin6->sin6_addr, &sin6from->sin6_addr); + if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL) + sin6->sin6_scope_id = sin6from->sin6_scope_id; + } +} + +/* Initialize a msg_name from an inbound skb. */ +static void sctp_inet6_skb_msgname(struct sk_buff *skb, char *msgname, + int *addr_len) +{ + struct sctphdr *sh; + struct sockaddr_in6 *sin6; + + if (msgname) { + sctp_inet6_msgname(msgname, addr_len); + sin6 = (struct sockaddr_in6 *)msgname; + sh = (struct sctphdr *)skb->h.raw; + sin6->sin6_port = sh->source; + + /* FIXME: Map ipv4 address into v4-mapped-on-v6 address. */ + if (__constant_htons(ETH_P_IP) == skb->protocol) { + /* FIXME: The latest I-D added options for two + * behaviors. + */ + return; + } + + /* Otherwise, just copy the v6 address. */ + + ipv6_addr_copy(&sin6->sin6_addr, &skb->nh.ipv6h->saddr); + if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL) { + struct sctp_ulpevent *ev = sctp_skb2event(skb); + sin6->sin6_scope_id = ev->iif; + } + } +} + +/* Do we support this AF? */ +static int sctp_inet6_af_supported(sa_family_t family) +{ + /* FIXME: v4-mapped-v6 addresses. The I-D is still waffling + * on what to do with sockaddr formats for PF_INET6 sockets. + * For now assume we'll support both. + */ + switch (family) { + case AF_INET6: + case AF_INET: + return 1; + default: + return 0; + } +} + +/* Address matching with wildcards allowed. This extra level + * of indirection lets us choose whether a PF_INET6 should + * disallow any v4 addresses if we so choose. + */ +static int sctp_inet6_cmp_addr(const union sctp_addr *addr1, + const union sctp_addr *addr2, + struct sctp_opt *opt) +{ + struct sctp_af *af1, *af2; + + af1 = sctp_get_af_specific(addr1->sa.sa_family); + af2 = sctp_get_af_specific(addr2->sa.sa_family); + + if (!af1 || !af2) + return 0; + /* Today, wildcard AF_INET/AF_INET6. */ + if (sctp_is_any(addr1) || sctp_is_any(addr2)) + return 1; + + if (addr1->sa.sa_family != addr2->sa.sa_family) + return 0; + + return af1->cmp_addr(addr1, addr2); +} + +/* Verify that the provided sockaddr looks bindable. Common verification, + * has already been taken care of. + */ +static int sctp_inet6_bind_verify(struct sctp_opt *opt, union sctp_addr *addr) +{ + struct sctp_af *af; + + /* ASSERT: address family has already been verified. */ + if (addr->sa.sa_family != AF_INET6) + af = sctp_get_af_specific(addr->sa.sa_family); + else { + struct sock *sk; + int type = ipv6_addr_type(&addr->v6.sin6_addr); + sk = container_of(opt, struct sock, tp_pinfo.af_sctp); + if (type & IPV6_ADDR_LINKLOCAL) { + /* Note: Behavior similar to af_inet6.c: + * 1) Overrides previous bound_dev_if + * 2) Destructive even if bind isn't successful. + */ + + if (addr->v6.sin6_scope_id) + sk->bound_dev_if = addr->v6.sin6_scope_id; + if (!sk->bound_dev_if) + return 0; + } + af = opt->pf->af; + } + return af->available(addr); +} + +/* Verify that the provided sockaddr looks bindable. Common verification, + * has already been taken care of. + */ +static int sctp_inet6_send_verify(struct sctp_opt *opt, union sctp_addr *addr) +{ + struct sctp_af *af = NULL; + + /* ASSERT: address family has already been verified. */ + if (addr->sa.sa_family != AF_INET6) + af = sctp_get_af_specific(addr->sa.sa_family); + else { + struct sock *sk; + int type = ipv6_addr_type(&addr->v6.sin6_addr); + sk = container_of(opt, struct sock, tp_pinfo.af_sctp); + if (type & IPV6_ADDR_LINKLOCAL) { + /* Note: Behavior similar to af_inet6.c: + * 1) Overrides previous bound_dev_if + * 2) Destructive even if bind isn't successful. + */ + + if (addr->v6.sin6_scope_id) + sk->bound_dev_if = addr->v6.sin6_scope_id; + if (!sk->bound_dev_if) + return 0; + } + af = opt->pf->af; + } + + return af != NULL; +} + +/* Fill in Supported Address Type information for INIT and INIT-ACK + * chunks. Note: In the future, we may want to look at sock options + * to determine whether a PF_INET6 socket really wants to have IPV4 + * addresses. + * Returns number of addresses supported. + */ +static int sctp_inet6_supported_addrs(const struct sctp_opt *opt, + __u16 *types) +{ + types[0] = SCTP_PARAM_IPV4_ADDRESS; + types[1] = SCTP_PARAM_IPV6_ADDRESS; + return 2; +} + +static struct proto_ops inet6_seqpacket_ops = { + .family = PF_INET6, + .release = inet6_release, + .bind = inet6_bind, + .connect = inet_dgram_connect, + .socketpair = sock_no_socketpair, + .accept = inet_accept, + .getname = inet6_getname, + .poll = sctp_poll, + .ioctl = inet6_ioctl, + .listen = sctp_inet_listen, + .shutdown = inet_shutdown, + .setsockopt = inet_setsockopt, + .getsockopt = inet_getsockopt, + .sendmsg = inet_sendmsg, + .recvmsg = inet_recvmsg, + .mmap = sock_no_mmap, +}; + +static struct inet_protosw sctpv6_seqpacket_protosw = { + .type = SOCK_SEQPACKET, + .protocol = IPPROTO_SCTP, + .prot = &sctp_prot, + .ops = &inet6_seqpacket_ops, + .capability = -1, + .no_check = 0, + .flags = SCTP_PROTOSW_FLAG +}; +static struct inet_protosw sctpv6_stream_protosw = { + .type = SOCK_STREAM, + .protocol = IPPROTO_SCTP, + .prot = &sctp_prot, + .ops = &inet6_seqpacket_ops, + .capability = -1, + .no_check = 0, + .flags = SCTP_PROTOSW_FLAG, +}; + +static struct inet6_protocol sctpv6_protocol = { + .handler = sctp_rcv, + .err_handler = sctp_v6_err, + .next = NULL, + .protocol = IPPROTO_SCTP, + .copy = 0, + .data = NULL, + .name = "SCTPv6", +}; + +static struct sctp_af sctp_ipv6_specific = { + .sctp_xmit = sctp_v6_xmit, + .setsockopt = ipv6_setsockopt, + .getsockopt = ipv6_getsockopt, + .get_dst = sctp_v6_get_dst, + .get_saddr = sctp_v6_get_saddr, + .copy_addrlist = sctp_v6_copy_addrlist, + .from_skb = sctp_v6_from_skb, + .from_sk = sctp_v6_from_sk, + .to_sk_saddr = sctp_v6_to_sk_saddr, + .to_sk_daddr = sctp_v6_to_sk_daddr, + .dst_saddr = sctp_v6_dst_saddr, + .cmp_addr = sctp_v6_cmp_addr, + .scope = sctp_v6_scope, + .addr_valid = sctp_v6_addr_valid, + .inaddr_any = sctp_v6_inaddr_any, + .is_any = sctp_v6_is_any, + .available = sctp_v6_available, + .skb_iif = sctp_v6_skb_iif, + .net_header_len = sizeof(struct ipv6hdr), + .sockaddr_len = sizeof(struct sockaddr_in6), + .sa_family = AF_INET6, +}; + +static struct sctp_pf sctp_pf_inet6_specific = { + .event_msgname = sctp_inet6_event_msgname, + .skb_msgname = sctp_inet6_skb_msgname, + .af_supported = sctp_inet6_af_supported, + .cmp_addr = sctp_inet6_cmp_addr, + .bind_verify = sctp_inet6_bind_verify, + .send_verify = sctp_inet6_send_verify, + .supported_addrs = sctp_inet6_supported_addrs, + .create_accept_sk = sctp_v6_create_accept_sk, + .af = &sctp_ipv6_specific, +}; + +/* Initialize IPv6 support and register with inet6 stack. */ +int sctp_v6_init(void) +{ + /* Register inet6 protocol. */ + inet6_add_protocol(&sctpv6_protocol); + + /* Add SCTPv6(UDP and TCP style) to inetsw6 linked list. */ + inet6_register_protosw(&sctpv6_seqpacket_protosw); + inet6_register_protosw(&sctpv6_stream_protosw); + + /* Register the SCTP specific PF_INET6 functions. */ + sctp_register_pf(&sctp_pf_inet6_specific, PF_INET6); + + /* Register the SCTP specific AF_INET6 functions. */ + sctp_register_af(&sctp_ipv6_specific); + + /* Register notifier for inet6 address additions/deletions. */ + register_inet6addr_notifier(&sctp_inetaddr_notifier); + + return 0; +} + +/* IPv6 specific exit support. */ +void sctp_v6_exit(void) +{ + list_del(&sctp_ipv6_specific.list); + inet6_del_protocol(&sctpv6_protocol); + inet6_unregister_protosw(&sctpv6_seqpacket_protosw); + inet6_unregister_protosw(&sctpv6_stream_protosw); + unregister_inet6addr_notifier(&sctp_inetaddr_notifier); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/objcnt.c linux-2.4.23-pre8/net/sctp/objcnt.c --- linux-2.4.22/net/sctp/objcnt.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/objcnt.c 2003-10-22 22:48:29.000000000 +0000 @@ -0,0 +1,135 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 2001 International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * Support for memory object debugging. This allows one to monitor the + * object allocations/deallocations for types instrumented for this + * via the proc fs. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Jon Grimm + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include + +/* + * Global counters to count raw object allocation counts. + * To add new counters, choose a unique suffix for the variable + * name as the helper macros key off this suffix to make + * life easier for the programmer. + */ + +SCTP_DBG_OBJCNT(sock); +SCTP_DBG_OBJCNT(ep); +SCTP_DBG_OBJCNT(transport); +SCTP_DBG_OBJCNT(assoc); +SCTP_DBG_OBJCNT(bind_addr); +SCTP_DBG_OBJCNT(chunk); +SCTP_DBG_OBJCNT(addr); +SCTP_DBG_OBJCNT(ssnmap); + +/* An array to make it easy to pretty print the debug information + * to the proc fs. + */ +sctp_dbg_objcnt_entry_t sctp_dbg_objcnt[] = { + SCTP_DBG_OBJCNT_ENTRY(sock), + SCTP_DBG_OBJCNT_ENTRY(ep), + SCTP_DBG_OBJCNT_ENTRY(assoc), + SCTP_DBG_OBJCNT_ENTRY(transport), + SCTP_DBG_OBJCNT_ENTRY(chunk), + SCTP_DBG_OBJCNT_ENTRY(bind_addr), + SCTP_DBG_OBJCNT_ENTRY(addr), + SCTP_DBG_OBJCNT_ENTRY(ssnmap), +}; + +/* Callback from procfs to read out objcount information. + * Walk through the entries in the sctp_dbg_objcnt array, dumping + * the raw object counts for each monitored type. + * + * This code was modified from similar code in route.c + */ +static int sctp_dbg_objcnt_read(char *buffer, char **start, off_t offset, + int length, int *eof, void *data) +{ + int len = 0; + off_t pos = 0; + int entries; + int i; + char temp[128]; + + /* How many entries? */ + entries = sizeof(sctp_dbg_objcnt)/sizeof(sctp_dbg_objcnt[0]); + + /* Walk the entries and print out the debug information + * for proc fs. + */ + for (i = 0; i < entries; i++) { + pos += 128; + + /* Skip ahead. */ + if (pos <= offset) { + len = 0; + continue; + } + /* Print out each entry. */ + sprintf(temp, "%s: %d", + sctp_dbg_objcnt[i].label, + atomic_read(sctp_dbg_objcnt[i].counter)); + + sprintf(buffer + len, "%-127s\n", temp); + len += 128; + if (pos >= offset+length) + goto done; + } + +done: + *start = buffer + len - (pos - offset); + len = pos - offset; + if (len > length) + len = length; + + return len; +} + +/* Initialize the objcount in the proc filesystem. */ +void sctp_dbg_objcnt_init(void) +{ + create_proc_read_entry("sctp_dbg_objcnt", 0, proc_net_sctp, + sctp_dbg_objcnt_read, NULL); +} + +/* Cleanup the objcount entry in the proc filesystem. */ +void sctp_dbg_objcnt_exit(void) +{ + remove_proc_entry("sctp_dbg_objcount", proc_net_sctp); +} + + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/output.c linux-2.4.23-pre8/net/sctp/output.c --- linux-2.4.22/net/sctp/output.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/output.c 2003-10-22 22:48:42.000000000 +0000 @@ -0,0 +1,636 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines, Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions handle output processing. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Sridhar Samudrala + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef TEST_FRAME +#include +#endif /* TEST_FRAME (not defined) */ + +#include /* for sa_family_t */ +#include + +#include +#include + +/* Forward declarations for private helpers. */ +static void sctp_packet_reset(struct sctp_packet *packet); +static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet, + struct sctp_chunk *chunk); + +/* Config a packet. + * This appears to be a followup set of initializations.) + */ +struct sctp_packet *sctp_packet_config(struct sctp_packet *packet, + __u32 vtag, int ecn_capable, + sctp_packet_phandler_t *prepend_handler) +{ + int packet_empty = (packet->size == SCTP_IP_OVERHEAD); + + packet->vtag = vtag; + packet->ecn_capable = ecn_capable; + packet->get_prepend_chunk = prepend_handler; + packet->has_cookie_echo = 0; + packet->has_sack = 0; + packet->ipfragok = 0; + + /* We might need to call the prepend_handler right away. */ + if (packet_empty) + sctp_packet_reset(packet); + return packet; +} + +/* Initialize the packet structure. */ +struct sctp_packet *sctp_packet_init(struct sctp_packet *packet, + struct sctp_transport *transport, + __u16 sport, __u16 dport) +{ + packet->transport = transport; + packet->source_port = sport; + packet->destination_port = dport; + skb_queue_head_init(&packet->chunks); + packet->vtag = 0; + packet->ecn_capable = 0; + packet->get_prepend_chunk = NULL; + packet->has_cookie_echo = 0; + packet->has_sack = 0; + packet->ipfragok = 0; + packet->malloced = 0; + sctp_packet_reset(packet); + return packet; +} + +/* Free a packet. */ +void sctp_packet_free(struct sctp_packet *packet) +{ + struct sctp_chunk *chunk; + + while ((chunk = (struct sctp_chunk *)__skb_dequeue(&packet->chunks))) + sctp_free_chunk(chunk); + + if (packet->malloced) + kfree(packet); +} + +/* This routine tries to append the chunk to the offered packet. If adding + * the chunk causes the packet to exceed the path MTU and COOKIE_ECHO chunk + * is not present in the packet, it transmits the input packet. + * Data can be bundled with a packet containing a COOKIE_ECHO chunk as long + * as it can fit in the packet, but any more data that does not fit in this + * packet can be sent only after receiving the COOKIE_ACK. + */ +sctp_xmit_t sctp_packet_transmit_chunk(struct sctp_packet *packet, + struct sctp_chunk *chunk) +{ + sctp_xmit_t retval; + int error = 0; + + switch ((retval = (sctp_packet_append_chunk(packet, chunk)))) { + case SCTP_XMIT_PMTU_FULL: + if (!packet->has_cookie_echo) { + error = sctp_packet_transmit(packet); + if (error < 0) + chunk->skb->sk->err = -error; + + /* If we have an empty packet, then we can NOT ever + * return PMTU_FULL. + */ + retval = sctp_packet_append_chunk(packet, chunk); + } + break; + + case SCTP_XMIT_MUST_FRAG: + case SCTP_XMIT_RWND_FULL: + case SCTP_XMIT_OK: + case SCTP_XMIT_NAGLE_DELAY: + break; + }; + + return retval; +} + +/* Try to bundle a SACK with the packet. */ +static sctp_xmit_t sctp_packet_bundle_sack(struct sctp_packet *pkt, + struct sctp_chunk *chunk) +{ + sctp_xmit_t retval = SCTP_XMIT_OK; + + /* If sending DATA and haven't aleady bundled a SACK, try to + * bundle one in to the packet. + */ + if (sctp_chunk_is_data(chunk) && !pkt->has_sack && + !pkt->has_cookie_echo) { + struct sctp_association *asoc; + asoc = pkt->transport->asoc; + + if (asoc->a_rwnd > asoc->rwnd) { + struct sctp_chunk *sack; + asoc->a_rwnd = asoc->rwnd; + sack = sctp_make_sack(asoc); + if (sack) { + struct timer_list *timer; + retval = sctp_packet_append_chunk(pkt, sack); + asoc->peer.sack_needed = 0; + timer = &asoc->timers[SCTP_EVENT_TIMEOUT_SACK]; + if (timer_pending(timer) && del_timer(timer)) + sctp_association_put(asoc); + } + } + } + return retval; +} + +/* Append a chunk to the offered packet reporting back any inability to do + * so. + */ +sctp_xmit_t sctp_packet_append_chunk(struct sctp_packet *packet, + struct sctp_chunk *chunk) +{ + sctp_xmit_t retval = SCTP_XMIT_OK; + __u16 chunk_len = WORD_ROUND(ntohs(chunk->chunk_hdr->length)); + size_t psize; + size_t pmtu; + int too_big; + + retval = sctp_packet_bundle_sack(packet, chunk); + psize = packet->size; + + if (retval != SCTP_XMIT_OK) + goto finish; + + pmtu = ((packet->transport->asoc) ? + (packet->transport->asoc->pmtu) : + (packet->transport->pmtu)); + + too_big = (psize + chunk_len > pmtu); + + /* Decide if we need to fragment or resubmit later. */ + if (too_big) { + int packet_empty = (packet->size == SCTP_IP_OVERHEAD); + + /* Both control chunks and data chunks with TSNs are + * non-fragmentable. + */ + int fragmentable = sctp_chunk_is_data(chunk) && + (!chunk->has_tsn); + if (packet_empty) { + if (fragmentable) { + retval = SCTP_XMIT_MUST_FRAG; + goto finish; + } else { + /* The packet is too big but we can + * not fragment it--we have to just + * transmit and rely on IP + * fragmentation. + */ + packet->ipfragok = 1; + goto append; + } + } else { /* !packet_empty */ + retval = SCTP_XMIT_PMTU_FULL; + goto finish; + } + } else { + /* The chunk fits in the packet. */ + goto append; + } + +append: + /* We believe that this chunk is OK to add to the packet (as + * long as we have the cwnd for it). + */ + + /* DATA is a special case since we must examine both rwnd and cwnd + * before we send DATA. + */ + if (sctp_chunk_is_data(chunk)) { + retval = sctp_packet_append_data(packet, chunk); + /* Disallow SACK bundling after DATA. */ + packet->has_sack = 1; + if (SCTP_XMIT_OK != retval) + goto finish; + } else if (SCTP_CID_COOKIE_ECHO == chunk->chunk_hdr->type) + packet->has_cookie_echo = 1; + else if (SCTP_CID_SACK == chunk->chunk_hdr->type) + packet->has_sack = 1; + + /* It is OK to send this chunk. */ + __skb_queue_tail(&packet->chunks, (struct sk_buff *)chunk); + packet->size += chunk_len; +finish: + return retval; +} + +/* All packets are sent to the network through this function from + * sctp_outq_tail(). + * + * The return value is a normal kernel error return value. + */ +int sctp_packet_transmit(struct sctp_packet *packet) +{ + struct sctp_transport *tp = packet->transport; + struct sctp_association *asoc = tp->asoc; + struct sctphdr *sh; + __u32 crc32; + struct sk_buff *nskb; + struct sctp_chunk *chunk; + struct sock *sk; + int err = 0; + int padding; /* How much padding do we need? */ + __u8 has_data = 0; + struct dst_entry *dst; + + /* Do NOT generate a chunkless packet... */ + if (skb_queue_empty(&packet->chunks)) + return err; + + /* Set up convenience variables... */ + chunk = (struct sctp_chunk *) (packet->chunks.next); + sk = chunk->skb->sk; + + /* Allocate the new skb. */ + nskb = dev_alloc_skb(packet->size); + if (!nskb) { + err = -ENOMEM; + goto out; + } + + /* Make sure the outbound skb has enough header room reserved. */ + skb_reserve(nskb, SCTP_IP_OVERHEAD); + + /* Set the owning socket so that we know where to get the + * destination IP address. + */ + skb_set_owner_w(nskb, sk); + + /* Build the SCTP header. */ + sh = (struct sctphdr *)skb_push(nskb, sizeof(struct sctphdr)); + sh->source = htons(packet->source_port); + sh->dest = htons(packet->destination_port); + + /* From 6.8 Adler-32 Checksum Calculation: + * After the packet is constructed (containing the SCTP common + * header and one or more control or DATA chunks), the + * transmitter shall: + * + * 1) Fill in the proper Verification Tag in the SCTP common + * header and initialize the checksum field to 0's. + */ + sh->vtag = htonl(packet->vtag); + sh->checksum = 0; + + + /* 2) Calculate the Adler-32 checksum of the whole packet, + * including the SCTP common header and all the + * chunks. + * + * Note: Adler-32 is no longer applicable, as has been replaced + * by CRC32-C as described in . + */ + crc32 = sctp_start_cksum((__u8 *)sh, sizeof(struct sctphdr)); + + /** + * 6.10 Bundling + * + * An endpoint bundles chunks by simply including multiple + * chunks in one outbound SCTP packet. ... + */ + + /** + * 3.2 Chunk Field Descriptions + * + * The total length of a chunk (including Type, Length and + * Value fields) MUST be a multiple of 4 bytes. If the length + * of the chunk is not a multiple of 4 bytes, the sender MUST + * pad the chunk with all zero bytes and this padding is not + * included in the chunk length field. The sender should + * never pad with more than 3 bytes. + * + * [This whole comment explains WORD_ROUND() below.] + */ + SCTP_DEBUG_PRINTK("***sctp_transmit_packet***\n"); + while ((chunk = (struct sctp_chunk *)__skb_dequeue(&packet->chunks))) { + chunk->num_times_sent++; + chunk->sent_at = jiffies; + if (sctp_chunk_is_data(chunk)) { + sctp_chunk_assign_tsn(chunk); + + /* 6.3.1 C4) When data is in flight and when allowed + * by rule C5, a new RTT measurement MUST be made each + * round trip. Furthermore, new RTT measurements + * SHOULD be made no more than once per round-trip + * for a given destination transport address. + */ + if ((1 == chunk->num_times_sent) && + (!tp->rto_pending)) { + chunk->rtt_in_progress = 1; + tp->rto_pending = 1; + } + has_data = 1; + } + padding = WORD_ROUND(chunk->skb->len) - chunk->skb->len; + if (padding) + memset(skb_put(chunk->skb, padding), 0, padding); + + crc32 = sctp_update_copy_cksum(skb_put(nskb, chunk->skb->len), + chunk->skb->data, + chunk->skb->len, crc32); + + SCTP_DEBUG_PRINTK("%s %p[%s] %s 0x%x, %s %d, %s %d, %s %d, " + "%s %d\n", + "*** Chunk", chunk, + sctp_cname(SCTP_ST_CHUNK( + chunk->chunk_hdr->type)), + chunk->has_tsn ? "TSN" : "No TSN", + chunk->has_tsn ? + ntohl(chunk->subh.data_hdr->tsn) : 0, + "length", ntohs(chunk->chunk_hdr->length), + "chunk->skb->len", chunk->skb->len, + "num_times_sent", chunk->num_times_sent, + "rtt_in_progress", chunk->rtt_in_progress); + + /* + * If this is a control chunk, this is our last + * reference. Free data chunks after they've been + * acknowledged or have failed. + */ + if (!sctp_chunk_is_data(chunk)) + sctp_free_chunk(chunk); + } + + /* Perform final transformation on checksum. */ + crc32 = sctp_end_cksum(crc32); + + /* 3) Put the resultant value into the checksum field in the + * common header, and leave the rest of the bits unchanged. + */ + sh->checksum = htonl(crc32); + + /* IP layer ECN support + * From RFC 2481 + * "The ECN-Capable Transport (ECT) bit would be set by the + * data sender to indicate that the end-points of the + * transport protocol are ECN-capable." + * + * If ECN capable && negotiated && it makes sense for + * this packet to support it (e.g. post ECN negotiation) + * then lets set the ECT bit + * + * FIXME: Need to do something else for IPv6 + */ + if (packet->ecn_capable) { + INET_ECN_xmit(nskb->sk); + } else { + INET_ECN_dontxmit(nskb->sk); + } + + /* Set up the IP options. */ + /* BUG: not implemented + * For v4 this all lives somewhere in sk->opt... + */ + + /* Dump that on IP! */ + if (asoc && asoc->peer.last_sent_to != tp) { + /* Considering the multiple CPU scenario, this is a + * "correcter" place for last_sent_to. --xguo + */ + asoc->peer.last_sent_to = tp; + } + + if (has_data) { + struct timer_list *timer; + unsigned long timeout; + + tp->last_time_used = jiffies; + + /* Restart the AUTOCLOSE timer when sending data. */ + if ((SCTP_STATE_ESTABLISHED == asoc->state) && + (asoc->autoclose)) { + timer = &asoc->timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE]; + timeout = asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE]; + + if (!mod_timer(timer, jiffies + timeout)) + sctp_association_hold(asoc); + } + } + + dst = tp->dst; + /* The 'obsolete' field of dst is set to 2 when a dst is freed. */ + if (!dst || (dst->obsolete > 1)) { + dst_release(dst); + sctp_transport_route(tp, NULL, sctp_sk(sk)); + sctp_assoc_sync_pmtu(asoc); + } + + nskb->dst = dst_clone(tp->dst); + if (!nskb->dst) + goto no_route; + + SCTP_DEBUG_PRINTK("***sctp_transmit_packet*** skb length %d\n", + nskb->len); + (*tp->af_specific->sctp_xmit)(nskb, tp, packet->ipfragok); +out: + packet->size = SCTP_IP_OVERHEAD; + return err; +no_route: + kfree_skb(nskb); + IP_INC_STATS_BH(IpOutNoRoutes); + + /* FIXME: Returning the 'err' will effect all the associations + * associated with a socket, although only one of the paths of the + * association is unreachable. + * The real failure of a transport or association can be passed on + * to the user via notifications. So setting this error may not be + * required. + */ + /* err = -EHOSTUNREACH; */ + goto out; +} + +/******************************************************************** + * 2nd Level Abstractions + ********************************************************************/ + +/* + * This private function resets the packet to a fresh state. + */ +static void sctp_packet_reset(struct sctp_packet *packet) +{ + struct sctp_chunk *chunk = NULL; + + packet->size = SCTP_IP_OVERHEAD; + + if (packet->get_prepend_chunk) + chunk = packet->get_prepend_chunk(packet->transport->asoc); + + /* If there a is a prepend chunk stick it on the list before + * any other chunks get appended. + */ + if (chunk) + sctp_packet_append_chunk(packet, chunk); +} + +/* This private function handles the specifics of appending DATA chunks. */ +static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet, + struct sctp_chunk *chunk) +{ + sctp_xmit_t retval = SCTP_XMIT_OK; + size_t datasize, rwnd, inflight; + struct sctp_transport *transport = packet->transport; + __u32 max_burst_bytes; + struct sctp_association *asoc = transport->asoc; + struct sctp_opt *sp = sctp_sk(asoc->base.sk); + struct sctp_outq *q = &asoc->outqueue; + + /* RFC 2960 6.1 Transmission of DATA Chunks + * + * A) At any given time, the data sender MUST NOT transmit new data to + * any destination transport address if its peer's rwnd indicates + * that the peer has no buffer space (i.e. rwnd is 0, see Section + * 6.2.1). However, regardless of the value of rwnd (including if it + * is 0), the data sender can always have one DATA chunk in flight to + * the receiver if allowed by cwnd (see rule B below). This rule + * allows the sender to probe for a change in rwnd that the sender + * missed due to the SACK having been lost in transit from the data + * receiver to the data sender. + */ + + rwnd = asoc->peer.rwnd; + inflight = asoc->outqueue.outstanding_bytes; + + datasize = sctp_data_size(chunk); + + if (datasize > rwnd) { + if (inflight > 0) { + /* We have (at least) one data chunk in flight, + * so we can't fall back to rule 6.1 B). + */ + retval = SCTP_XMIT_RWND_FULL; + goto finish; + } + } + + /* sctpimpguide-05 2.14.2 + * D) When the time comes for the sender to + * transmit new DATA chunks, the protocol parameter Max.Burst MUST + * first be applied to limit how many new DATA chunks may be sent. + * The limit is applied by adjusting cwnd as follows: + * if ((flightsize + Max.Burst * MTU) < cwnd) + * cwnd = flightsize + Max.Burst * MTU + */ + max_burst_bytes = asoc->max_burst * asoc->pmtu; + if ((transport->flight_size + max_burst_bytes) < transport->cwnd) { + transport->cwnd = transport->flight_size + max_burst_bytes; + SCTP_DEBUG_PRINTK("%s: cwnd limited by max_burst: " + "transport: %p, cwnd: %d, " + "ssthresh: %d, flight_size: %d, " + "pba: %d\n", + __FUNCTION__, transport, + transport->cwnd, + transport->ssthresh, + transport->flight_size, + transport->partial_bytes_acked); + } + + /* RFC 2960 6.1 Transmission of DATA Chunks + * + * B) At any given time, the sender MUST NOT transmit new data + * to a given transport address if it has cwnd or more bytes + * of data outstanding to that transport address. + */ + /* RFC 7.2.4 & the Implementers Guide 2.8. + * + * 3) ... + * When a Fast Retransmit is being performed the sender SHOULD + * ignore the value of cwnd and SHOULD NOT delay retransmission. + */ + if (!chunk->fast_retransmit) + if (transport->flight_size >= transport->cwnd) { + retval = SCTP_XMIT_RWND_FULL; + goto finish; + } + + /* Nagle's algorithm to solve small-packet problem: + * Inhibit the sending of new chunks when new outgoing data arrives + * if any previously transmitted data on the connection remains + * unacknowledged. + */ + if (!sp->nodelay && SCTP_IP_OVERHEAD == packet->size && + q->outstanding_bytes && SCTP_STATE_ESTABLISHED == asoc->state) { + unsigned len = datasize + q->out_qlen; + + /* Check whether this chunk and all the rest of pending + * data will fit or delay in hopes of bundling a full + * sized packet. + */ + if (len < asoc->pmtu - SCTP_IP_OVERHEAD) { + retval = SCTP_XMIT_NAGLE_DELAY; + goto finish; + } + } + + /* Keep track of how many bytes are in flight over this transport. */ + transport->flight_size += datasize; + + /* Keep track of how many bytes are in flight to the receiver. */ + asoc->outqueue.outstanding_bytes += datasize; + + /* Update our view of the receiver's rwnd. */ + if (datasize < rwnd) + rwnd -= datasize; + else + rwnd = 0; + + asoc->peer.rwnd = rwnd; + +finish: + return retval; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/outqueue.c linux-2.4.23-pre8/net/sctp/outqueue.c --- linux-2.4.22/net/sctp/outqueue.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/outqueue.c 2003-10-22 22:48:15.000000000 +0000 @@ -0,0 +1,1637 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 Intel Corp. + * Copyright (c) 2001-2003 International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions implement the sctp_outq class. The outqueue handles + * bundling and queueing of outgoing SCTP chunks. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Perry Melange + * Xingang Guo + * Hui Huang + * Sridhar Samudrala + * Jon Grimm + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include /* For struct list_head */ +#include +#include +#include /* For skb_set_owner_w */ + +#include + +/* Declare internal functions here. */ +static int sctp_acked(sctp_sackhdr_t *sack, __u32 tsn); +static void sctp_check_transmitted(struct sctp_outq *q, + struct list_head *transmitted_queue, + struct sctp_transport *transport, + sctp_sackhdr_t *sack, + __u32 highest_new_tsn); + +/* Add data to the front of the queue. */ +static inline void sctp_outq_head_data(struct sctp_outq *q, + struct sctp_chunk *ch) +{ + __skb_queue_head(&q->out, (struct sk_buff *)ch); + q->out_qlen += ch->skb->len; + return; +} + +/* Take data from the front of the queue. */ +static inline struct sctp_chunk *sctp_outq_dequeue_data(struct sctp_outq *q) +{ + struct sctp_chunk *ch; + ch = (struct sctp_chunk *)__skb_dequeue(&q->out); + if (ch) + q->out_qlen -= ch->skb->len; + return ch; +} +/* Add data chunk to the end of the queue. */ +static inline void sctp_outq_tail_data(struct sctp_outq *q, + struct sctp_chunk *ch) +{ + __skb_queue_tail(&q->out, (struct sk_buff *)ch); + q->out_qlen += ch->skb->len; + return; +} + +/* Insert a chunk behind chunk 'pos'. */ +static inline void sctp_outq_insert_data(struct sctp_outq *q, + struct sctp_chunk *ch, + struct sctp_chunk *pos) +{ + __skb_insert((struct sk_buff *)ch, (struct sk_buff *)pos->prev, + (struct sk_buff *)pos, pos->list); + q->out_qlen += ch->skb->len; +} + +/* Generate a new outqueue. */ +struct sctp_outq *sctp_outq_new(struct sctp_association *asoc) +{ + struct sctp_outq *q; + + q = t_new(struct sctp_outq, GFP_KERNEL); + if (q) { + sctp_outq_init(asoc, q); + q->malloced = 1; + } + return q; +} + +/* Initialize an existing sctp_outq. This does the boring stuff. + * You still need to define handlers if you really want to DO + * something with this structure... + */ +void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q) +{ + q->asoc = asoc; + skb_queue_head_init(&q->out); + skb_queue_head_init(&q->control); + INIT_LIST_HEAD(&q->retransmit); + INIT_LIST_HEAD(&q->sacked); + + q->init_output = NULL; + q->config_output = NULL; + q->append_output = NULL; + q->build_output = NULL; + q->force_output = NULL; + + q->outstanding_bytes = 0; + q->empty = 1; + + q->malloced = 0; + q->out_qlen = 0; +} + +/* Free the outqueue structure and any related pending chunks. + */ +void sctp_outq_teardown(struct sctp_outq *q) +{ + struct sctp_transport *transport; + struct list_head *lchunk, *pos, *temp; + sctp_chunk_t *chunk; + struct sctp_ulpevent *ev; + + /* Throw away unacknowledged chunks. */ + list_for_each(pos, &q->asoc->peer.transport_addr_list) { + transport = list_entry(pos, struct sctp_transport, transports); + while ((lchunk = sctp_list_dequeue(&transport->transmitted))) { + chunk = list_entry(lchunk, sctp_chunk_t, + transmitted_list); + + /* Generate a SEND FAILED event. */ + ev = sctp_ulpevent_make_send_failed(q->asoc, + chunk, SCTP_DATA_SENT, + q->error, GFP_ATOMIC); + if (ev) + sctp_ulpq_tail_event(&q->asoc->ulpq, ev); + + sctp_free_chunk(chunk); + } + } + + /* Throw away chunks that have been gap ACKed. */ + list_for_each_safe(lchunk, temp, &q->sacked) { + list_del(lchunk); + chunk = list_entry(lchunk, sctp_chunk_t, transmitted_list); + sctp_free_chunk(chunk); + } + + /* Throw away any chunks in the retransmit queue. */ + list_for_each_safe(lchunk, temp, &q->retransmit) { + list_del(lchunk); + chunk = list_entry(lchunk, sctp_chunk_t, transmitted_list); + sctp_free_chunk(chunk); + } + + /* Throw away any leftover data chunks. */ + while ((chunk = sctp_outq_dequeue_data(q))) { + + /* Generate a SEND FAILED event. */ + ev = sctp_ulpevent_make_send_failed(q->asoc, + chunk, SCTP_DATA_UNSENT, + q->error, GFP_ATOMIC); + if (ev) + sctp_ulpq_tail_event(&q->asoc->ulpq, ev); + + sctp_free_chunk(chunk); + } + + q->error = 0; + + /* Throw away any leftover control chunks. */ + while ((chunk = (sctp_chunk_t *) skb_dequeue(&q->control))) + sctp_free_chunk(chunk); +} + +/* Free the outqueue structure and any related pending chunks. */ +void sctp_outq_free(struct sctp_outq *q) +{ + /* Throw away leftover chunks. */ + sctp_outq_teardown(q); + + /* If we were kmalloc()'d, free the memory. */ + if (q->malloced) + kfree(q); +} + +/* Put a new chunk in an sctp_outq. */ +int sctp_outq_tail(struct sctp_outq *q, sctp_chunk_t *chunk) +{ + int error = 0; + + SCTP_DEBUG_PRINTK("sctp_outq_tail(%p, %p[%s])\n", + q, chunk, chunk && chunk->chunk_hdr ? + sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)) + : "Illegal Chunk"); + + /* If it is data, queue it up, otherwise, send it + * immediately. + */ + if (SCTP_CID_DATA == chunk->chunk_hdr->type) { + /* Is it OK to queue data chunks? */ + /* From 9. Termination of Association + * + * When either endpoint performs a shutdown, the + * association on each peer will stop accepting new + * data from its user and only deliver data in queue + * at the time of sending or receiving the SHUTDOWN + * chunk. + */ + switch (q->asoc->state) { + case SCTP_STATE_EMPTY: + case SCTP_STATE_CLOSED: + case SCTP_STATE_SHUTDOWN_PENDING: + case SCTP_STATE_SHUTDOWN_SENT: + case SCTP_STATE_SHUTDOWN_RECEIVED: + case SCTP_STATE_SHUTDOWN_ACK_SENT: + /* Cannot send after transport endpoint shutdown */ + error = -ESHUTDOWN; + break; + + default: + SCTP_DEBUG_PRINTK("outqueueing (%p, %p[%s])\n", + q, chunk, chunk && chunk->chunk_hdr ? + sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)) + : "Illegal Chunk"); + + sctp_outq_tail_data(q, chunk); + if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) + SCTP_INC_STATS(SctpOutUnorderChunks); + else + SCTP_INC_STATS(SctpOutOrderChunks); + q->empty = 0; + break; + }; + } else { + __skb_queue_tail(&q->control, (struct sk_buff *) chunk); + SCTP_INC_STATS(SctpOutCtrlChunks); + } + + if (error < 0) + return error; + + error = sctp_outq_flush(q, 0); + + return error; +} + +/* Insert a chunk into the retransmit queue. Chunks on the retransmit + * queue are kept in order, based on the TSNs. + */ +void sctp_retransmit_insert(struct list_head *tlchunk, struct sctp_outq *q) +{ + struct list_head *rlchunk; + sctp_chunk_t *tchunk, *rchunk; + __u32 ttsn, rtsn; + int done = 0; + + tchunk = list_entry(tlchunk, sctp_chunk_t, transmitted_list); + ttsn = ntohl(tchunk->subh.data_hdr->tsn); + + list_for_each(rlchunk, &q->retransmit) { + rchunk = list_entry(rlchunk, sctp_chunk_t, transmitted_list); + rtsn = ntohl(rchunk->subh.data_hdr->tsn); + if (TSN_lt(ttsn, rtsn)) { + list_add(tlchunk, rlchunk->prev); + done = 1; + break; + } + } + if (!done) { + list_add_tail(tlchunk, &q->retransmit); + } +} + +/* Mark all the eligible packets on a transport for retransmission. */ +void sctp_retransmit_mark(struct sctp_outq *q, + struct sctp_transport *transport, + __u8 fast_retransmit) +{ + struct list_head *lchunk, *ltemp; + sctp_chunk_t *chunk; + + /* Walk through the specified transmitted queue. */ + list_for_each_safe(lchunk, ltemp, &transport->transmitted) { + chunk = list_entry(lchunk, sctp_chunk_t, transmitted_list); + + /* If we are doing retransmission due to a fast retransmit, + * only the chunk's that are marked for fast retransmit + * should be added to the retransmit queue. If we are doing + * retransmission due to a timeout or pmtu discovery, only the + * chunks that are not yet acked should be added to the + * retransmit queue. + */ + if ((fast_retransmit && chunk->fast_retransmit) || + (!fast_retransmit && !chunk->tsn_gap_acked)) { + /* RFC 2960 6.2.1 Processing a Received SACK + * + * C) Any time a DATA chunk is marked for + * retransmission (via either T3-rtx timer expiration + * (Section 6.3.3) or via fast retransmit + * (Section 7.2.4)), add the data size of those + * chunks to the rwnd. + */ + q->asoc->peer.rwnd += sctp_data_size(chunk); + q->outstanding_bytes -= sctp_data_size(chunk); + transport->flight_size -= sctp_data_size(chunk); + + /* sctpimpguide-05 Section 2.8.2 + * M5) If a T3-rtx timer expires, the + * 'TSN.Missing.Report' of all affected TSNs is set + * to 0. + */ + chunk->tsn_missing_report = 0; + + /* If a chunk that is being used for RTT measurement + * has to be retransmitted, we cannot use this chunk + * anymore for RTT measurements. Reset rto_pending so + * that a new RTT measurement is started when a new + * data chunk is sent. + */ + if (chunk->rtt_in_progress) { + chunk->rtt_in_progress = 0; + transport->rto_pending = 0; + } + + /* Move the chunk to the retransmit queue. The chunks + * on the retransmit queue is always kept in order. + */ + list_del(lchunk); + sctp_retransmit_insert(lchunk, q); + } + } + + SCTP_DEBUG_PRINTK("%s: transport: %p, fast_retransmit: %d, " + "cwnd: %d, ssthresh: %d, flight_size: %d, " + "pba: %d\n", __FUNCTION__, + transport, fast_retransmit, + transport->cwnd, transport->ssthresh, + transport->flight_size, + transport->partial_bytes_acked); + +} + +/* Mark all the eligible packets on a transport for retransmission and force + * one packet out. + */ +void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport, + sctp_retransmit_reason_t reason) +{ + int error = 0; + __u8 fast_retransmit = 0; + + switch(reason) { + case SCTP_RTXR_T3_RTX: + sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_T3_RTX); + /* Update the retran path if the T3-rtx timer has expired for + * the current retran path. + */ + if (transport == transport->asoc->peer.retran_path) + sctp_assoc_update_retran_path(transport->asoc); + break; + case SCTP_RTXR_FAST_RTX: + sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_FAST_RTX); + fast_retransmit = 1; + break; + case SCTP_RTXR_PMTUD: + default: + break; + } + + sctp_retransmit_mark(q, transport, fast_retransmit); + + error = sctp_outq_flush(q, /* rtx_timeout */ 1); + + if (error) + q->asoc->base.sk->err = -error; +} + +/* + * Transmit DATA chunks on the retransmit queue. Upon return from + * sctp_outq_flush_rtx() the packet 'pkt' may contain chunks which + * need to be transmitted by the caller. + * We assume that pkt->transport has already been set. + * + * The return value is a normal kernel error return value. + */ +static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt, + int rtx_timeout, int *start_timer) +{ + struct list_head *lqueue; + struct list_head *lchunk; + struct sctp_transport *transport = pkt->transport; + sctp_xmit_t status; + sctp_chunk_t *chunk; + struct sctp_association *asoc; + int error = 0; + + asoc = q->asoc; + lqueue = &q->retransmit; + + /* RFC 2960 6.3.3 Handle T3-rtx Expiration + * + * E3) Determine how many of the earliest (i.e., lowest TSN) + * outstanding DATA chunks for the address for which the + * T3-rtx has expired will fit into a single packet, subject + * to the MTU constraint for the path corresponding to the + * destination transport address to which the retransmission + * is being sent (this may be different from the address for + * which the timer expires [see Section 6.4]). Call this value + * K. Bundle and retransmit those K DATA chunks in a single + * packet to the destination endpoint. + * + * [Just to be painfully clear, if we are retransmitting + * because a timeout just happened, we should send only ONE + * packet of retransmitted data.] + */ + lchunk = sctp_list_dequeue(lqueue); + + while (lchunk) { + chunk = list_entry(lchunk, sctp_chunk_t, transmitted_list); + + /* Make sure that Gap Acked TSNs are not retransmitted. A + * simple approach is just to move such TSNs out of the + * way and into a 'transmitted' queue and skip to the + * next chunk. + */ + if (chunk->tsn_gap_acked) { + list_add_tail(lchunk, &transport->transmitted); + lchunk = sctp_list_dequeue(lqueue); + continue; + } + + /* Attempt to append this chunk to the packet. */ + status = (*q->append_output)(pkt, chunk); + + switch (status) { + case SCTP_XMIT_PMTU_FULL: + /* Send this packet. */ + if ((error = (*q->force_output)(pkt)) == 0) + *start_timer = 1; + + /* If we are retransmitting, we should only + * send a single packet. + */ + if (rtx_timeout) { + list_add(lchunk, lqueue); + lchunk = NULL; + } + + /* Bundle lchunk in the next round. */ + break; + + case SCTP_XMIT_RWND_FULL: + /* Send this packet. */ + if ((error = (*q->force_output)(pkt)) == 0) + *start_timer = 1; + + /* Stop sending DATA as there is no more room + * at the receiver. + */ + list_add(lchunk, lqueue); + lchunk = NULL; + break; + + default: + /* The append was successful, so add this chunk to + * the transmitted list. + */ + list_add_tail(lchunk, &transport->transmitted); + *start_timer = 1; + q->empty = 0; + + /* Retrieve a new chunk to bundle. */ + lchunk = sctp_list_dequeue(lqueue); + break; + }; + } + + return error; +} + +/* This routine either transmits the fragment or puts it on the output + * queue. 'pos' points to the next chunk in the output queue after the + * chunk that is currently in the process of fragmentation. + */ +void sctp_xmit_frag(struct sctp_outq *q, struct sctp_chunk *pos, + struct sctp_packet *packet, struct sctp_chunk *frag, __u32 tsn) +{ + struct sctp_transport *transport = packet->transport; + struct sk_buff_head *queue = &q->out; + sctp_xmit_t status; + int error; + + frag->subh.data_hdr->tsn = htonl(tsn); + frag->has_tsn = 1; + + /* An inner fragment may be smaller than the earlier one and may get + * in if we call q->build_output. This ensures that all the fragments + * are sent in order. + */ + if (!skb_queue_empty(queue)) { + SCTP_DEBUG_PRINTK("sctp_xmit_frag: q not empty. " + "adding 0x%x to outqueue\n", + ntohl(frag->subh.data_hdr->tsn)); + if (pos) + sctp_outq_insert_data(q, frag, pos); + else + sctp_outq_tail_data(q, frag); + return; + } + + /* Add the chunk fragment to the packet. */ + status = (*q->build_output)(packet, frag); + switch (status) { + case SCTP_XMIT_RWND_FULL: + /* RWND is full, so put the chunk in the output queue. */ + SCTP_DEBUG_PRINTK("sctp_xmit_frag: rwnd full. " + "adding 0x%x to outqueue\n", + ntohl(frag->subh.data_hdr->tsn)); + if (pos) + sctp_outq_insert_data(q, frag, pos); + else + sctp_outq_tail_data(q, frag); + break; + + case SCTP_XMIT_OK: + error = (*q->force_output)(packet); + if (error < 0) { + /* Packet could not be transmitted, put the chunk in + * the output queue + */ + SCTP_DEBUG_PRINTK("sctp_xmit_frag: force output " + "failed. adding 0x%x to outqueue\n", + ntohl(frag->subh.data_hdr->tsn)); + if (pos) + sctp_outq_insert_data(q, frag, pos); + else + sctp_outq_tail_data(q, frag); + } else { + SCTP_DEBUG_PRINTK("sctp_xmit_frag: force output " + "success. 0x%x sent\n", + ntohl(frag->subh.data_hdr->tsn)); + list_add_tail(&frag->transmitted_list, + &transport->transmitted); + + sctp_transport_reset_timers(transport); + } + break; + + default: + BUG(); + }; +} + +/* This routine calls sctp_xmit_frag() for all the fragments of a message. + * The argument 'frag' point to the first fragment and it holds the list + * of all the other fragments in the 'frag_list' field. + */ +void sctp_xmit_fragmented_chunks(struct sctp_outq *q, struct sctp_packet *pkt, + sctp_chunk_t *frag) +{ + struct sctp_association *asoc = frag->asoc; + struct list_head *lfrag, *frag_list; + __u32 tsn; + int nfrags = 1; + struct sctp_chunk *pos; + + /* Count the number of fragments. */ + frag_list = &frag->frag_list; + list_for_each(lfrag, frag_list) { + nfrags++; + } + + /* Get a TSN block of nfrags TSNs. */ + tsn = sctp_association_get_tsn_block(asoc, nfrags); + + pos = (struct sctp_chunk *)skb_peek(&q->out); + /* Transmit the first fragment. */ + sctp_xmit_frag(q, pos, pkt, frag, tsn++); + + /* Transmit the rest of fragments. */ + frag_list = &frag->frag_list; + list_for_each(lfrag, frag_list) { + frag = list_entry(lfrag, sctp_chunk_t, frag_list); + sctp_xmit_frag(q, pos, pkt, frag, tsn++); + } +} + +/* This routine breaks the given chunk into 'max_frag_data_len' size + * fragments. It returns the first fragment with the frag_list field holding + * the remaining fragments. + */ +sctp_chunk_t *sctp_fragment_chunk(sctp_chunk_t *chunk, + size_t max_frag_data_len) +{ + struct sctp_association *asoc = chunk->asoc; + void *data_ptr = chunk->subh.data_hdr; + struct sctp_sndrcvinfo *sinfo = &chunk->sinfo; + __u16 chunk_data_len = sctp_data_size(chunk); + __u16 ssn = ntohs(chunk->subh.data_hdr->ssn); + sctp_chunk_t *first_frag, *frag; + struct list_head *frag_list; + int nfrags; + __u8 old_flags, flags; + + /* nfrags = no. of max size fragments + any smaller last fragment. */ + nfrags = ((chunk_data_len / max_frag_data_len) + + ((chunk_data_len % max_frag_data_len) ? 1 : 0)); + + /* Start of the data in the chunk. */ + data_ptr += sizeof(sctp_datahdr_t); + + /* Are we fragmenting an already fragmented large message? */ + old_flags = chunk->chunk_hdr->flags; + if (old_flags & SCTP_DATA_FIRST_FRAG) + flags = SCTP_DATA_FIRST_FRAG; + else + flags = SCTP_DATA_MIDDLE_FRAG; + + /* Make the first fragment. */ + first_frag = sctp_make_datafrag(asoc, sinfo, max_frag_data_len, + data_ptr, flags, ssn); + + if (!first_frag) + goto err; + first_frag->has_ssn = 1; + /* All the fragments are added to the frag_list of the first chunk. */ + frag_list = &first_frag->frag_list; + + chunk_data_len -= max_frag_data_len; + data_ptr += max_frag_data_len; + + /* Make the middle fragments. */ + while (chunk_data_len > max_frag_data_len) { + frag = sctp_make_datafrag(asoc, sinfo, max_frag_data_len, + data_ptr, SCTP_DATA_MIDDLE_FRAG, + ssn); + if (!frag) + goto err; + frag->has_ssn = 1; + /* Add the middle fragment to the first fragment's + * frag_list. + */ + list_add_tail(&frag->frag_list, frag_list); + + chunk_data_len -= max_frag_data_len; + data_ptr += max_frag_data_len; + } + + if (old_flags & SCTP_DATA_LAST_FRAG) + flags = SCTP_DATA_LAST_FRAG; + else + flags = SCTP_DATA_MIDDLE_FRAG; + + /* Make the last fragment. */ + frag = sctp_make_datafrag(asoc, sinfo, chunk_data_len, data_ptr, + flags, ssn); + if (!frag) + goto err; + frag->has_ssn = 1; + + /* Add the last fragment to the first fragment's frag_list. */ + list_add_tail(&frag->frag_list, frag_list); + + /* Free the original chunk. */ + sctp_free_chunk(chunk); + + return first_frag; + +err: + /* Free any fragments that are created before the failure. */ + if (first_frag) { + struct list_head *flist, *lfrag; + + /* Free all the fragments off the first one. */ + flist = &first_frag->frag_list; + while (NULL != (lfrag = sctp_list_dequeue(flist))) { + frag = list_entry(lfrag, sctp_chunk_t, frag_list); + sctp_free_chunk(frag); + } + + /* Free the first fragment. */ + sctp_free_chunk(first_frag); + } + + return NULL; +} + +/* + * sctp_outq_flush - Try to flush an outqueue. + * + * Description: Send everything in q which we legally can, subject to + * congestion limitations. + * * Note: This function can be called from multiple contexts so appropriate + * locking concerns must be made. Today we use the sock lock to protect + * this function. + */ +int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) +{ + struct sctp_packet *packet; + struct sctp_packet singleton; + struct sctp_association *asoc = q->asoc; + int ecn_capable = asoc->peer.ecn_capable; + __u16 sport = asoc->base.bind_addr.port; + __u16 dport = asoc->peer.port; + __u32 vtag = asoc->peer.i.init_tag; + /* This is the ECNE handler for singleton packets. */ + sctp_packet_phandler_t *s_ecne_handler = NULL; + sctp_packet_phandler_t *ecne_handler = NULL; + struct sk_buff_head *queue; + struct sctp_transport *transport = NULL; + struct sctp_transport *new_transport; + sctp_chunk_t *chunk; + sctp_xmit_t status; + int error = 0; + int start_timer = 0; + + /* These transports have chunks to send. */ + struct list_head transport_list; + struct list_head *ltransport; + + INIT_LIST_HEAD(&transport_list); + packet = NULL; + + /* + * 6.10 Bundling + * ... + * When bundling control chunks with DATA chunks, an + * endpoint MUST place control chunks first in the outbound + * SCTP packet. The transmitter MUST transmit DATA chunks + * within a SCTP packet in increasing order of TSN. + * ... + */ + if (ecn_capable) { + s_ecne_handler = &sctp_get_no_prepend; + ecne_handler = &sctp_get_ecne_prepend; + } + + queue = &q->control; + while ((chunk = (sctp_chunk_t *)skb_dequeue(queue))) { + /* Pick the right transport to use. */ + new_transport = chunk->transport; + + if (!new_transport) { + new_transport = asoc->peer.active_path; + } else if (!new_transport->active) { + /* If the chunk is Heartbeat, send it to + * chunk->transport, even it's inactive. + */ + if (chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT) + new_transport = asoc->peer.active_path; + } + + /* Are we switching transports? + * Take care of transport locks. + */ + if (new_transport != transport) { + transport = new_transport; + if (list_empty(&transport->send_ready)) { + list_add_tail(&transport->send_ready, + &transport_list); + } + packet = &transport->packet; + (*q->config_output)(packet, vtag, + ecn_capable, ecne_handler); + } + + switch (chunk->chunk_hdr->type) { + /* + * 6.10 Bundling + * ... + * An endpoint MUST NOT bundle INIT, INIT ACK or SHUTDOWN + * COMPLETE with any other chunks. [Send them immediately.] + */ + case SCTP_CID_INIT: + case SCTP_CID_INIT_ACK: + case SCTP_CID_SHUTDOWN_COMPLETE: + (*q->init_output)(&singleton, transport, sport, dport); + (*q->config_output)(&singleton, vtag, ecn_capable, + s_ecne_handler); + (void) (*q->build_output)(&singleton, chunk); + error = (*q->force_output)(&singleton); + if (error < 0) + return error; + break; + + case SCTP_CID_ABORT: + case SCTP_CID_SACK: + case SCTP_CID_HEARTBEAT: + case SCTP_CID_HEARTBEAT_ACK: + case SCTP_CID_SHUTDOWN: + case SCTP_CID_SHUTDOWN_ACK: + case SCTP_CID_ERROR: + case SCTP_CID_COOKIE_ECHO: + case SCTP_CID_COOKIE_ACK: + case SCTP_CID_ECN_ECNE: + case SCTP_CID_ECN_CWR: + (void) (*q->build_output)(packet, chunk); + break; + + case SCTP_CID_ASCONF: + case SCTP_CID_ASCONF_ACK: + (void) (*q->build_output)(packet, chunk); + break; + + default: + /* We built a chunk with an illegal type! */ + BUG(); + }; + } + + /* Is it OK to send data chunks? */ + switch (asoc->state) { + case SCTP_STATE_COOKIE_ECHOED: + /* Only allow bundling when this packet has a COOKIE-ECHO + * chunk. + */ + if (!packet || !packet->has_cookie_echo) + break; + + /* fallthru */ + case SCTP_STATE_ESTABLISHED: + case SCTP_STATE_SHUTDOWN_PENDING: + case SCTP_STATE_SHUTDOWN_RECEIVED: + /* + * RFC 2960 6.1 Transmission of DATA Chunks + * + * C) When the time comes for the sender to transmit, + * before sending new DATA chunks, the sender MUST + * first transmit any outstanding DATA chunks which + * are marked for retransmission (limited by the + * current cwnd). + */ + if (!list_empty(&q->retransmit)) { + if (transport == asoc->peer.retran_path) + goto retran; + + /* Switch transports & prepare the packet. */ + + transport = asoc->peer.retran_path; + + if (list_empty(&transport->send_ready)) { + list_add_tail(&transport->send_ready, + &transport_list); + } + + packet = &transport->packet; + (*q->config_output)(packet, vtag, + ecn_capable, ecne_handler); + retran: + error = sctp_outq_flush_rtx(q, packet, + rtx_timeout, &start_timer); + + if (start_timer) + sctp_transport_reset_timers(transport); + + /* This can happen on COOKIE-ECHO resend. Only + * one chunk can get bundled with a COOKIE-ECHO. + */ + if (packet->has_cookie_echo) + goto sctp_flush_out; + + /* Don't send new data if there is still data + * waiting to retransmit. + */ + if (!list_empty(&q->retransmit)) + goto sctp_flush_out; + } + + /* Finally, transmit new packets. */ + start_timer = 0; + queue = &q->out; + + while ((chunk = sctp_outq_dequeue_data(q))) { + /* RFC 2960 6.5 Every DATA chunk MUST carry a valid + * stream identifier. + */ + if (chunk->sinfo.sinfo_stream >= + asoc->c.sinit_num_ostreams) { + struct sctp_ulpevent *ev; + + /* Generate a SEND FAILED event. */ + ev = sctp_ulpevent_make_send_failed(asoc, + chunk, SCTP_DATA_UNSENT, + SCTP_ERROR_INV_STRM, GFP_ATOMIC); + if (ev) + sctp_ulpq_tail_event(&asoc->ulpq, ev); + + /* Free the chunk. */ + sctp_free_chunk(chunk); + continue; + } + + /* Now do delayed assignment of SSN. This will + * probably change again when we start supporting + * large (> approximately 2^16) size messages. + */ + sctp_chunk_assign_ssn(chunk); + + /* If there is a specified transport, use it. + * Otherwise, we want to use the active path. + */ + new_transport = chunk->transport; + if (new_transport == NULL || + !new_transport->active) + new_transport = asoc->peer.active_path; + + /* Change packets if necessary. */ + if (new_transport != transport) { + transport = new_transport; + + /* Schedule to have this transport's + * packet flushed. + */ + if (list_empty(&transport->send_ready)) { + list_add_tail(&transport->send_ready, + &transport_list); + } + + packet = &transport->packet; + (*q->config_output)(packet, vtag, + ecn_capable, ecne_handler); + } + + SCTP_DEBUG_PRINTK("sctp_transmit_packet(%p, %p[%s]), ", + q, chunk, + chunk && chunk->chunk_hdr ? + sctp_cname(SCTP_ST_CHUNK( + chunk->chunk_hdr->type)) + : "Illegal Chunk"); + + SCTP_DEBUG_PRINTK("TX TSN 0x%x skb->head " + "%p skb->users %d.\n", + ntohl(chunk->subh.data_hdr->tsn), + chunk->skb ?chunk->skb->head : 0, + chunk->skb ? + atomic_read(&chunk->skb->users) : -1); + + /* Add the chunk to the packet. */ + status = (*q->build_output)(packet, chunk); + + switch (status) { + case SCTP_XMIT_PMTU_FULL: + case SCTP_XMIT_RWND_FULL: + case SCTP_XMIT_NAGLE_DELAY: + /* We could not append this chunk, so put + * the chunk back on the output queue. + */ + SCTP_DEBUG_PRINTK("sctp_outq_flush: could " + "not transmit TSN: 0x%x, status: %d\n", + ntohl(chunk->subh.data_hdr->tsn), + status); + sctp_outq_head_data(q, chunk); + goto sctp_flush_out; + break; + + case SCTP_XMIT_MUST_FRAG: { + sctp_chunk_t *frag; + + frag = sctp_fragment_chunk(chunk, + packet->transport->asoc->frag_point); + if (!frag) { + /* We could not fragment due to out of + * memory condition. Free the original + * chunk and return ENOMEM. + */ + sctp_free_chunk(chunk); + error = -ENOMEM; + return error; + } + + sctp_xmit_fragmented_chunks(q, packet, frag); + goto sctp_flush_out; + break; + } + + case SCTP_XMIT_OK: + break; + + default: + BUG(); + } + + /* BUG: We assume that the (*q->force_output()) + * call below will succeed all the time and add the + * chunk to the transmitted list and restart the + * timers. + * It is possible that the call can fail under OOM + * conditions. + * + * Is this really a problem? Won't this behave + * like a lost TSN? + */ + list_add_tail(&chunk->transmitted_list, + &transport->transmitted); + + sctp_transport_reset_timers(transport); + + q->empty = 0; + + /* Only let one DATA chunk get bundled with a + * COOKIE-ECHO chunk. + */ + if (packet->has_cookie_echo) + goto sctp_flush_out; + } + break; + + default: + /* Do nothing. */ + break; + } + +sctp_flush_out: + + /* Before returning, examine all the transports touched in + * this call. Right now, we bluntly force clear all the + * transports. Things might change after we implement Nagle. + * But such an examination is still required. + * + * --xguo + */ + while ((ltransport = sctp_list_dequeue(&transport_list)) != NULL ) { + struct sctp_transport *t = list_entry(ltransport, + struct sctp_transport, + send_ready); + if (t != transport) + transport = t; + + packet = &transport->packet; + if (packet->size != SCTP_IP_OVERHEAD) + error = (*q->force_output)(packet); + } + + return error; +} + +/* Set the various output handling callbacks. */ +int sctp_outq_set_output_handlers(struct sctp_outq *q, + sctp_outq_ohandler_init_t init, + sctp_outq_ohandler_config_t config, + sctp_outq_ohandler_t append, + sctp_outq_ohandler_t build, + sctp_outq_ohandler_force_t force) +{ + q->init_output = init; + q->config_output = config; + q->append_output = append; + q->build_output = build; + q->force_output = force; + return 0; +} + +/* Update unack_data based on the incoming SACK chunk */ +static void sctp_sack_update_unack_data(struct sctp_association *assoc, + sctp_sackhdr_t *sack) +{ + sctp_sack_variable_t *frags; + __u16 unack_data; + int i; + + unack_data = assoc->next_tsn - assoc->ctsn_ack_point - 1; + + frags = sack->variable; + for (i = 0; i < ntohs(sack->num_gap_ack_blocks); i++) { + unack_data -= ((ntohs(frags[i].gab.end) - + ntohs(frags[i].gab.start) + 1)); + } + + assoc->unack_data = unack_data; +} + +/* Return the highest new tsn that is acknowledged by the given SACK chunk. */ +static __u32 sctp_highest_new_tsn(sctp_sackhdr_t *sack, + struct sctp_association *asoc) +{ + struct list_head *ltransport, *lchunk; + struct sctp_transport *transport; + sctp_chunk_t *chunk; + __u32 highest_new_tsn, tsn; + struct list_head *transport_list = &asoc->peer.transport_addr_list; + + highest_new_tsn = ntohl(sack->cum_tsn_ack); + + list_for_each(ltransport, transport_list) { + transport = list_entry(ltransport, struct sctp_transport, + transports); + list_for_each(lchunk, &transport->transmitted) { + chunk = list_entry(lchunk, sctp_chunk_t, + transmitted_list); + tsn = ntohl(chunk->subh.data_hdr->tsn); + + if (!chunk->tsn_gap_acked && + TSN_lt(highest_new_tsn, tsn) && + sctp_acked(sack, tsn)) + highest_new_tsn = tsn; + } + } + + return highest_new_tsn; +} + +/* This is where we REALLY process a SACK. + * + * Process the SACK against the outqueue. Mostly, this just frees + * things off the transmitted queue. + */ +int sctp_outq_sack(struct sctp_outq *q, sctp_sackhdr_t *sack) +{ + struct sctp_association *asoc = q->asoc; + struct sctp_transport *transport; + sctp_chunk_t *tchunk; + struct list_head *lchunk, *transport_list, *pos; + sctp_sack_variable_t *frags = sack->variable; + __u32 sack_ctsn, ctsn, tsn; + __u32 highest_tsn, highest_new_tsn; + __u32 sack_a_rwnd; + int outstanding; + + /* Grab the association's destination address list. */ + transport_list = &asoc->peer.transport_addr_list; + + sack_ctsn = ntohl(sack->cum_tsn_ack); + + /* Get the highest TSN in the sack. */ + highest_tsn = sack_ctsn + + ntohs(frags[ntohs(sack->num_gap_ack_blocks) - 1].gab.end); + + if (TSN_lt(asoc->highest_sacked, highest_tsn)) { + highest_new_tsn = highest_tsn; + asoc->highest_sacked = highest_tsn; + } else { + highest_new_tsn = sctp_highest_new_tsn(sack, asoc); + } + + /* Run through the retransmit queue. Credit bytes received + * and free those chunks that we can. + */ + sctp_check_transmitted(q, &q->retransmit, NULL, sack, highest_new_tsn); + + /* Run through the transmitted queue. + * Credit bytes received and free those chunks which we can. + * + * This is a MASSIVE candidate for optimization. + */ + list_for_each(pos, transport_list) { + transport = list_entry(pos, struct sctp_transport, + transports); + sctp_check_transmitted(q, &transport->transmitted, + transport, sack, highest_new_tsn); + } + + /* Move the Cumulative TSN Ack Point if appropriate. */ + if (TSN_lt(asoc->ctsn_ack_point, sack_ctsn)) + asoc->ctsn_ack_point = sack_ctsn; + + /* Update unack_data field in the assoc. */ + sctp_sack_update_unack_data(asoc, sack); + + ctsn = asoc->ctsn_ack_point; + + SCTP_DEBUG_PRINTK("%s: sack Cumulative TSN Ack is 0x%x.\n", + __FUNCTION__, sack_ctsn); + SCTP_DEBUG_PRINTK("%s: Cumulative TSN Ack of association " + "%p is 0x%x.\n", __FUNCTION__, asoc, ctsn); + + /* Throw away stuff rotting on the sack queue. */ + list_for_each(lchunk, &q->sacked) { + tchunk = list_entry(lchunk, sctp_chunk_t, transmitted_list); + tsn = ntohl(tchunk->subh.data_hdr->tsn); + if (TSN_lte(tsn, ctsn)) { + lchunk = lchunk->prev; + sctp_free_chunk(tchunk); + } + } + + /* ii) Set rwnd equal to the newly received a_rwnd minus the + * number of bytes still outstanding after processing the + * Cumulative TSN Ack and the Gap Ack Blocks. + */ + + sack_a_rwnd = ntohl(sack->a_rwnd); + outstanding = q->outstanding_bytes; + + if (outstanding < sack_a_rwnd) + sack_a_rwnd -= outstanding; + else + sack_a_rwnd = 0; + + asoc->peer.rwnd = sack_a_rwnd; + + /* See if all chunks are acked. + * Make sure the empty queue handler will get run later. + */ + q->empty = skb_queue_empty(&q->out) && list_empty(&q->retransmit); + if (!q->empty) + goto finish; + + list_for_each(pos, transport_list) { + transport = list_entry(pos, struct sctp_transport, + transports); + q->empty = q->empty && list_empty(&transport->transmitted); + if (!q->empty) + goto finish; + } + + SCTP_DEBUG_PRINTK("sack queue is empty.\n"); +finish: + return q->empty; +} + +/* Is the outqueue empty? */ +int sctp_outq_is_empty(const struct sctp_outq *q) +{ + return q->empty; +} + +/******************************************************************** + * 2nd Level Abstractions + ********************************************************************/ + +/* Go through a transport's transmitted list or the assocication's retransmit + * list and move chunks that are acked by the Cumulative TSN Ack to q->sacked. + * The retransmit list will not have an associated transport. In case of a + * transmitted list with a transport, the transport's congestion, rto and fast + * retransmit parameters are also updated and if needed a fast retransmit + * process is started. + * + * I added coherent debug information output. --xguo + * + * Instead of printing 'sacked' or 'kept' for each TSN on the + * transmitted_queue, we print a range: SACKED: TSN1-TSN2, TSN3, TSN4-TSN5. + * KEPT TSN6-TSN7, etc. + */ +static void sctp_check_transmitted(struct sctp_outq *q, + struct list_head *transmitted_queue, + struct sctp_transport *transport, + sctp_sackhdr_t *sack, + __u32 highest_new_tsn_in_sack) +{ + struct list_head *lchunk; + sctp_chunk_t *tchunk; + struct list_head tlist; + __u32 tsn; + __u32 sack_ctsn; + __u32 rtt; + __u8 restart_timer = 0; + __u8 do_fast_retransmit = 0; + int bytes_acked = 0; + + /* These state variables are for coherent debug output. --xguo */ + +#if SCTP_DEBUG + __u32 dbg_ack_tsn = 0; /* An ACKed TSN range starts here... */ + __u32 dbg_last_ack_tsn = 0; /* ...and finishes here. */ + __u32 dbg_kept_tsn = 0; /* An un-ACKed range starts here... */ + __u32 dbg_last_kept_tsn = 0; /* ...and finishes here. */ + + /* 0 : The last TSN was ACKed. + * 1 : The last TSN was NOT ACKed (i.e. KEPT). + * -1: We need to initialize. + */ + int dbg_prt_state = -1; +#endif /* SCTP_DEBUG */ + + sack_ctsn = ntohl(sack->cum_tsn_ack); + + INIT_LIST_HEAD(&tlist); + + /* The while loop will skip empty transmitted queues. */ + while (NULL != (lchunk = sctp_list_dequeue(transmitted_queue))) { + tchunk = list_entry(lchunk, sctp_chunk_t, transmitted_list); + + tsn = ntohl(tchunk->subh.data_hdr->tsn); + if (sctp_acked(sack, tsn)) { + /* If this queue is the retransmit queue, the + * retransmit timer has already reclaimed + * the outstanding bytes for this chunk, so only + * count bytes associated with a transport. + */ + if (transport) { + /* If this chunk is being used for RTT + * measurement, calculate the RTT and update + * the RTO using this value. + * + * 6.3.1 C5) Karn's algorithm: RTT measurements + * MUST NOT be made using packets that were + * retransmitted (and thus for which it is + * ambiguous whether the reply was for the + * first instance of the packet or a later + * instance). + */ + if ((!tchunk->tsn_gap_acked) && + (1 == tchunk->num_times_sent) && + (tchunk->rtt_in_progress)) { + rtt = jiffies - tchunk->sent_at; + sctp_transport_update_rto(transport, + rtt); + } + } + if (TSN_lte(tsn, sack_ctsn)) { + /* RFC 2960 6.3.2 Retransmission Timer Rules + * + * R3) Whenever a SACK is received + * that acknowledges the DATA chunk + * with the earliest outstanding TSN + * for that address, restart T3-rtx + * timer for that address with its + * current RTO. + */ + restart_timer = 1; + + if (!tchunk->tsn_gap_acked) { + tchunk->tsn_gap_acked = 1; + bytes_acked += sctp_data_size(tchunk); + } + + list_add_tail(&tchunk->transmitted_list, + &q->sacked); + } else { + /* RFC2960 7.2.4, sctpimpguide-05 2.8.2 + * M2) Each time a SACK arrives reporting + * 'Stray DATA chunk(s)' record the highest TSN + * reported as newly acknowledged, call this + * value 'HighestTSNinSack'. A newly + * acknowledged DATA chunk is one not + * previously acknowledged in a SACK. + * + * When the SCTP sender of data receives a SACK + * chunk that acknowledges, for the first time, + * the receipt of a DATA chunk, all the still + * unacknowledged DATA chunks whose TSN is + * older than that newly acknowledged DATA + * chunk, are qualified as 'Stray DATA chunks'. + */ + if (!tchunk->tsn_gap_acked) { + tchunk->tsn_gap_acked = 1; + bytes_acked += sctp_data_size(tchunk); + } + list_add_tail(lchunk, &tlist); + } + +#if SCTP_DEBUG + switch (dbg_prt_state) { + case 0: /* last TSN was ACKed */ + if (dbg_last_ack_tsn + 1 == tsn) { + /* This TSN belongs to the + * current ACK range. + */ + break; + } + + if (dbg_last_ack_tsn != dbg_ack_tsn) { + /* Display the end of the + * current range. + */ + SCTP_DEBUG_PRINTK("-%08x", + dbg_last_ack_tsn); + } + + /* Start a new range. */ + SCTP_DEBUG_PRINTK(",%08x", tsn); + dbg_ack_tsn = tsn; + break; + + case 1: /* The last TSN was NOT ACKed. */ + if (dbg_last_kept_tsn != dbg_kept_tsn) { + /* Display the end of current range. */ + SCTP_DEBUG_PRINTK("-%08x", + dbg_last_kept_tsn); + } + + SCTP_DEBUG_PRINTK("\n"); + + /* FALL THROUGH... */ + default: + /* This is the first-ever TSN we examined. */ + /* Start a new range of ACK-ed TSNs. */ + SCTP_DEBUG_PRINTK("ACKed: %08x", tsn); + dbg_prt_state = 0; + dbg_ack_tsn = tsn; + }; + + dbg_last_ack_tsn = tsn; +#endif /* SCTP_DEBUG */ + + } else { + if (tchunk->tsn_gap_acked) { + SCTP_DEBUG_PRINTK("%s: Receiver reneged on " + "data TSN: 0x%x\n", + __FUNCTION__, + tsn); + tchunk->tsn_gap_acked = 0; + + bytes_acked -= sctp_data_size(tchunk); + + /* RFC 2960 6.3.2 Retransmission Timer Rules + * + * R4) Whenever a SACK is received missing a + * TSN that was previously acknowledged via a + * Gap Ack Block, start T3-rtx for the + * destination address to which the DATA + * chunk was originally + * transmitted if it is not already running. + */ + restart_timer = 1; + } + + list_add_tail(lchunk, &tlist); + +#if SCTP_DEBUG + /* See the above comments on ACK-ed TSNs. */ + switch (dbg_prt_state) { + case 1: + if (dbg_last_kept_tsn + 1 == tsn) + break; + + if (dbg_last_kept_tsn != dbg_kept_tsn) + SCTP_DEBUG_PRINTK("-%08x", + dbg_last_kept_tsn); + + SCTP_DEBUG_PRINTK(",%08x", tsn); + dbg_kept_tsn = tsn; + break; + + case 0: + if (dbg_last_ack_tsn != dbg_ack_tsn) + SCTP_DEBUG_PRINTK("-%08x", + dbg_last_ack_tsn); + SCTP_DEBUG_PRINTK("\n"); + + /* FALL THROUGH... */ + default: + SCTP_DEBUG_PRINTK("KEPT: %08x",tsn); + dbg_prt_state = 1; + dbg_kept_tsn = tsn; + }; + + dbg_last_kept_tsn = tsn; +#endif /* SCTP_DEBUG */ + } + } + +#if SCTP_DEBUG + /* Finish off the last range, displaying its ending TSN. */ + switch (dbg_prt_state) { + case 0: + if (dbg_last_ack_tsn != dbg_ack_tsn) { + SCTP_DEBUG_PRINTK("-%08x\n", dbg_last_ack_tsn); + } else { + SCTP_DEBUG_PRINTK("\n"); + } + break; + + case 1: + if (dbg_last_kept_tsn != dbg_kept_tsn) { + SCTP_DEBUG_PRINTK("-%08x\n", dbg_last_kept_tsn); + } else { + SCTP_DEBUG_PRINTK("\n"); + } + }; +#endif /* SCTP_DEBUG */ + if (transport) { + if (bytes_acked) { + /* 8.2. When an outstanding TSN is acknowledged, + * the endpoint shall clear the error counter of + * the destination transport address to which the + * DATA chunk was last sent. + * The association's overall error counter is + * also cleared. + */ + transport->error_count = 0; + transport->asoc->overall_error_count = 0; + + /* Mark the destination transport address as + * active if it is not so marked. + */ + if (!transport->active) { + sctp_assoc_control_transport( + transport->asoc, + transport, + SCTP_TRANSPORT_UP, + SCTP_RECEIVED_SACK); + } + + sctp_transport_raise_cwnd(transport, sack_ctsn, + bytes_acked); + + transport->flight_size -= bytes_acked; + q->outstanding_bytes -= bytes_acked; + } else { + /* RFC 2960 6.1, sctpimpguide-06 2.15.2 + * When a sender is doing zero window probing, it + * should not timeout the association if it continues + * to receive new packets from the receiver. The + * reason is that the receiver MAY keep its window + * closed for an indefinite time. + * A sender is doing zero window probing when the + * receiver's advertised window is zero, and there is + * only one data chunk in flight to the receiver. + */ + if ((0 == q->asoc->peer.rwnd) && + (!list_empty(&tlist)) && + (sack_ctsn+2 == q->asoc->next_tsn)) { + SCTP_DEBUG_PRINTK("%s: SACK received for zero " + "window probe: %u\n", + __FUNCTION__, sack_ctsn); + q->asoc->overall_error_count = 0; + transport->error_count = 0; + } + } + + /* RFC 2960 6.3.2 Retransmission Timer Rules + * + * R2) Whenever all outstanding data sent to an address have + * been acknowledged, turn off the T3-rtx timer of that + * address. + */ + if (!transport->flight_size) { + if (timer_pending(&transport->T3_rtx_timer) && + del_timer(&transport->T3_rtx_timer)) { + sctp_transport_put(transport); + } + } else if (restart_timer) { + if (!mod_timer(&transport->T3_rtx_timer, + jiffies + transport->rto)) + sctp_transport_hold(transport); + } + } + + /* Reconstruct the transmitted list with chunks that are not yet + * acked by the Cumulative TSN Ack. + */ + while (NULL != (lchunk = sctp_list_dequeue(&tlist))) { + tchunk = list_entry(lchunk, sctp_chunk_t, transmitted_list); + tsn = ntohl(tchunk->subh.data_hdr->tsn); + + /* RFC 2960 7.2.4, sctpimpguide-05 2.8.2 M3) Examine all + * 'Unacknowledged TSN's', if the TSN number of an + * 'Unacknowledged TSN' is smaller than the 'HighestTSNinSack' + * value, increment the 'TSN.Missing.Report' count on that + * chunk if it has NOT been fast retransmitted or marked for + * fast retransmit already. + * + * M4) If any DATA chunk is found to have a + * 'TSN.Missing.Report' + * value larger than or equal to 4, mark that chunk for + * retransmission and start the fast retransmit procedure. + */ + if ((!tchunk->fast_retransmit) && + (!tchunk->tsn_gap_acked) && + (TSN_lt(tsn, highest_new_tsn_in_sack))) { + tchunk->tsn_missing_report++; + SCTP_DEBUG_PRINTK("%s: TSN 0x%x missing counter: %d\n", + __FUNCTION__, tsn, + tchunk->tsn_missing_report); + } + if (tchunk->tsn_missing_report >= 4) { + tchunk->fast_retransmit = 1; + do_fast_retransmit = 1; + } + + list_add_tail(lchunk, transmitted_queue); + } + + if (transport) { + if (do_fast_retransmit) + sctp_retransmit(q, transport, SCTP_RTXR_FAST_RTX); + + SCTP_DEBUG_PRINTK("%s: transport: %p, cwnd: %d, " + "ssthresh: %d, flight_size: %d, pba: %d\n", + __FUNCTION__, transport, transport->cwnd, + transport->ssthresh, transport->flight_size, + transport->partial_bytes_acked); + } +} + +/* Is the given TSN acked by this packet? */ +static int sctp_acked(sctp_sackhdr_t *sack, __u32 tsn) +{ + int i; + sctp_sack_variable_t *frags; + __u16 gap; + __u32 ctsn = ntohl(sack->cum_tsn_ack); + + if (TSN_lte(tsn, ctsn)) + goto pass; + + /* 3.3.4 Selective Acknowledgement (SACK) (3): + * + * Gap Ack Blocks: + * These fields contain the Gap Ack Blocks. They are repeated + * for each Gap Ack Block up to the number of Gap Ack Blocks + * defined in the Number of Gap Ack Blocks field. All DATA + * chunks with TSNs greater than or equal to (Cumulative TSN + * Ack + Gap Ack Block Start) and less than or equal to + * (Cumulative TSN Ack + Gap Ack Block End) of each Gap Ack + * Block are assumed to have been received correctly. + */ + + frags = sack->variable; + gap = tsn - ctsn; + for (i = 0; i < ntohs(sack->num_gap_ack_blocks); ++i) { + if (TSN_lte(ntohs(frags[i].gab.start), gap) && + TSN_lte(gap, ntohs(frags[i].gab.end))) + goto pass; + } + + return 0; +pass: + return 1; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/primitive.c linux-2.4.23-pre8/net/sctp/primitive.c --- linux-2.4.22/net/sctp/primitive.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/primitive.c 2003-10-22 22:47:42.000000000 +0000 @@ -0,0 +1,205 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions implement the SCTP primitive functions from Section 10. + * + * Note that the descriptions from the specification are USER level + * functions--this file is the functions which populate the struct proto + * for SCTP which is the BOTTOM of the sockets interface. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Narasimha Budihal + * Karl Knutson + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include /* For struct list_head */ +#include +#include +#include /* For struct timeval */ +#include +#include +#include + +#define DECLARE_PRIMITIVE(name) \ +/* This is called in the code as sctp_primitive_ ## name. */ \ +int sctp_primitive_ ## name(struct sctp_association *asoc, \ + void *arg) { \ + int error = 0; \ + sctp_event_t event_type; sctp_subtype_t subtype; \ + sctp_state_t state; \ + struct sctp_endpoint *ep; \ + \ + event_type = SCTP_EVENT_T_PRIMITIVE; \ + subtype = SCTP_ST_PRIMITIVE(SCTP_PRIMITIVE_ ## name); \ + state = asoc ? asoc->state : SCTP_STATE_CLOSED; \ + ep = asoc ? asoc->ep : NULL; \ + \ + error = sctp_do_sm(event_type, subtype, state, ep, asoc, \ + arg, GFP_KERNEL); \ + return error; \ +} + +/* 10.1 ULP-to-SCTP + * B) Associate + * + * Format: ASSOCIATE(local SCTP instance name, destination transport addr, + * outbound stream count) + * -> association id [,destination transport addr list] [,outbound stream + * count] + * + * This primitive allows the upper layer to initiate an association to a + * specific peer endpoint. + * + * This version assumes that asoc is fully populated with the initial + * parameters. We then return a traditional kernel indicator of + * success or failure. + */ + +/* This is called in the code as sctp_primitive_ASSOCIATE. */ + +DECLARE_PRIMITIVE(ASSOCIATE) + +/* 10.1 ULP-to-SCTP + * C) Shutdown + * + * Format: SHUTDOWN(association id) + * -> result + * + * Gracefully closes an association. Any locally queued user data + * will be delivered to the peer. The association will be terminated only + * after the peer acknowledges all the SCTP packets sent. A success code + * will be returned on successful termination of the association. If + * attempting to terminate the association results in a failure, an error + * code shall be returned. + */ + +DECLARE_PRIMITIVE(SHUTDOWN); + +/* 10.1 ULP-to-SCTP + * C) Abort + * + * Format: Abort(association id [, cause code]) + * -> result + * + * Ungracefully closes an association. Any locally queued user data + * will be discarded and an ABORT chunk is sent to the peer. A success + * code will be returned on successful abortion of the association. If + * attempting to abort the association results in a failure, an error + * code shall be returned. + */ + +DECLARE_PRIMITIVE(ABORT); + +/* 10.1 ULP-to-SCTP + * E) Send + * + * Format: SEND(association id, buffer address, byte count [,context] + * [,stream id] [,life time] [,destination transport address] + * [,unorder flag] [,no-bundle flag] [,payload protocol-id] ) + * -> result + * + * This is the main method to send user data via SCTP. + * + * Mandatory attributes: + * + * o association id - local handle to the SCTP association + * + * o buffer address - the location where the user message to be + * transmitted is stored; + * + * o byte count - The size of the user data in number of bytes; + * + * Optional attributes: + * + * o context - an optional 32 bit integer that will be carried in the + * sending failure notification to the ULP if the transportation of + * this User Message fails. + * + * o stream id - to indicate which stream to send the data on. If not + * specified, stream 0 will be used. + * + * o life time - specifies the life time of the user data. The user data + * will not be sent by SCTP after the life time expires. This + * parameter can be used to avoid efforts to transmit stale + * user messages. SCTP notifies the ULP if the data cannot be + * initiated to transport (i.e. sent to the destination via SCTP's + * send primitive) within the life time variable. However, the + * user data will be transmitted if SCTP has attempted to transmit a + * chunk before the life time expired. + * + * o destination transport address - specified as one of the destination + * transport addresses of the peer endpoint to which this packet + * should be sent. Whenever possible, SCTP should use this destination + * transport address for sending the packets, instead of the current + * primary path. + * + * o unorder flag - this flag, if present, indicates that the user + * would like the data delivered in an unordered fashion to the peer + * (i.e., the U flag is set to 1 on all DATA chunks carrying this + * message). + * + * o no-bundle flag - instructs SCTP not to bundle this user data with + * other outbound DATA chunks. SCTP MAY still bundle even when + * this flag is present, when faced with network congestion. + * + * o payload protocol-id - A 32 bit unsigned integer that is to be + * passed to the peer indicating the type of payload protocol data + * being transmitted. This value is passed as opaque data by SCTP. + */ + +DECLARE_PRIMITIVE(SEND); + +/* 10.1 ULP-to-SCTP + * J) Request Heartbeat + * + * Format: REQUESTHEARTBEAT(association id, destination transport address) + * + * -> result + * + * Instructs the local endpoint to perform a HeartBeat on the specified + * destination transport address of the given association. The returned + * result should indicate whether the transmission of the HEARTBEAT + * chunk to the destination address is successful. + * + * Mandatory attributes: + * + * o association id - local handle to the SCTP association + * + * o destination transport address - the transport address of the + * association on which a heartbeat should be issued. + */ + +DECLARE_PRIMITIVE(REQUESTHEARTBEAT); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/proc.c linux-2.4.23-pre8/net/sctp/proc.c --- linux-2.4.22/net/sctp/proc.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/proc.c 2003-10-22 22:47:56.000000000 +0000 @@ -0,0 +1,129 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 2003 International Business Machines, Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Sridhar Samudrala + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include + +static char *sctp_snmp_list[] = { +#define SCTP_SNMP_ENTRY(x) #x + SCTP_SNMP_ENTRY(SctpCurrEstab), + SCTP_SNMP_ENTRY(SctpActiveEstabs), + SCTP_SNMP_ENTRY(SctpPassiveEstabs), + SCTP_SNMP_ENTRY(SctpAborteds), + SCTP_SNMP_ENTRY(SctpShutdowns), + SCTP_SNMP_ENTRY(SctpOutOfBlues), + SCTP_SNMP_ENTRY(SctpChecksumErrors), + SCTP_SNMP_ENTRY(SctpOutCtrlChunks), + SCTP_SNMP_ENTRY(SctpOutOrderChunks), + SCTP_SNMP_ENTRY(SctpOutUnorderChunks), + SCTP_SNMP_ENTRY(SctpInCtrlChunks), + SCTP_SNMP_ENTRY(SctpInOrderChunks), + SCTP_SNMP_ENTRY(SctpInUnorderChunks), + SCTP_SNMP_ENTRY(SctpFragUsrMsgs), + SCTP_SNMP_ENTRY(SctpReasmUsrMsgs), + SCTP_SNMP_ENTRY(SctpOutSCTPPacks), + SCTP_SNMP_ENTRY(SctpInSCTPPacks), +#undef SCTP_SNMP_ENTRY +}; + +/* Return the current value of a particular entry in the mib by adding its + * per cpu counters. + */ +static unsigned long +fold_field(void *mib[], int nr) +{ + unsigned long res = 0; + int i; + int sz = sizeof(struct sctp_mib); + unsigned long* begin; + + sz /= sizeof(unsigned long); + begin = (unsigned long*) mib; + + for (i=0; iproc_fops = &sctp_snmp_seq_fops; + + return 0; +} + +/* Cleanup the proc fs entry for 'snmp' object. */ +void sctp_snmp_proc_exit(void) +{ + remove_proc_entry("snmp", proc_net_sctp); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/protocol.c linux-2.4.23-pre8/net/sctp/protocol.c --- linux-2.4.22/net/sctp/protocol.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/protocol.c 2003-10-22 22:48:59.000000000 +0000 @@ -0,0 +1,1082 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2002 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * This file is part of the SCTP kernel reference Implementation + * + * Initialization/cleanup for SCTP protocol support. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Sridhar Samudrala + * Daisy Chang + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Global data structures. */ +struct sctp_protocol sctp_proto; +struct proc_dir_entry *proc_net_sctp; +DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics); + +/* This is the global socket data structure used for responding to + * the Out-of-the-blue (OOTB) packets. A control sock will be created + * for this socket at the initialization time. + */ +static struct socket *sctp_ctl_socket; + +static struct sctp_pf *sctp_pf_inet6_specific; +static struct sctp_pf *sctp_pf_inet_specific; +static struct sctp_af *sctp_af_v4_specific; +static struct sctp_af *sctp_af_v6_specific; + +extern struct net_proto_family inet_family_ops; + +extern int sctp_snmp_proc_init(void); +extern int sctp_snmp_proc_exit(void); + +/* Return the address of the control sock. */ +struct sock *sctp_get_ctl_sock(void) +{ + return sctp_ctl_socket->sk; +} + +/* Set up the proc fs entry for the SCTP protocol. */ +__init int sctp_proc_init(void) +{ + int rc = 0; + + if (!proc_net_sctp) { + struct proc_dir_entry *ent; + ent = proc_mkdir("net/sctp", 0); + if (ent) { + ent->owner = THIS_MODULE; + proc_net_sctp = ent; + } else + rc = -ENOMEM; + } + + if (sctp_snmp_proc_init()) + rc = -ENOMEM; + + return rc; +} + +/* Clean up the proc fs entry for the SCTP protocol. */ +void sctp_proc_exit(void) +{ + + sctp_snmp_proc_exit(); + + if (proc_net_sctp) { + proc_net_sctp = NULL; + remove_proc_entry("net/sctp", 0); + } +} + +/* Private helper to extract ipv4 address and stash them in + * the protocol structure. + */ +static void sctp_v4_copy_addrlist(struct list_head *addrlist, + struct net_device *dev) +{ + struct in_device *in_dev; + struct in_ifaddr *ifa; + struct sockaddr_storage_list *addr; + + read_lock(&inetdev_lock); + if ((in_dev = __in_dev_get(dev)) == NULL) { + read_unlock(&inetdev_lock); + return; + } + + read_lock(&in_dev->lock); + for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { + /* Add the address to the local list. */ + addr = t_new(struct sockaddr_storage_list, GFP_ATOMIC); + if (addr) { + addr->a.v4.sin_family = AF_INET; + addr->a.v4.sin_port = 0; + addr->a.v4.sin_addr.s_addr = ifa->ifa_local; + list_add_tail(&addr->list, addrlist); + } + } + + read_unlock(&in_dev->lock); + read_unlock(&inetdev_lock); +} + +/* Extract our IP addresses from the system and stash them in the + * protocol structure. + */ +static void __sctp_get_local_addr_list(struct sctp_protocol *proto) +{ + struct net_device *dev; + struct list_head *pos; + struct sctp_af *af; + + read_lock(&dev_base_lock); + for (dev = dev_base; dev; dev = dev->next) { + list_for_each(pos, &proto->address_families) { + af = list_entry(pos, struct sctp_af, list); + af->copy_addrlist(&proto->local_addr_list, dev); + } + } + read_unlock(&dev_base_lock); +} + +static void sctp_get_local_addr_list(struct sctp_protocol *proto) +{ + unsigned long flags; + + sctp_spin_lock_irqsave(&sctp_proto.local_addr_lock, flags); + __sctp_get_local_addr_list(&sctp_proto); + sctp_spin_unlock_irqrestore(&sctp_proto.local_addr_lock, flags); +} + +/* Free the existing local addresses. */ +static void __sctp_free_local_addr_list(struct sctp_protocol *proto) +{ + struct sockaddr_storage_list *addr; + struct list_head *pos, *temp; + + list_for_each_safe(pos, temp, &proto->local_addr_list) { + addr = list_entry(pos, struct sockaddr_storage_list, list); + list_del(pos); + kfree(addr); + } +} + +/* Free the existing local addresses. */ +static void sctp_free_local_addr_list(struct sctp_protocol *proto) +{ + unsigned long flags; + + sctp_spin_lock_irqsave(&proto->local_addr_lock, flags); + __sctp_free_local_addr_list(proto); + sctp_spin_unlock_irqrestore(&proto->local_addr_lock, flags); +} + +/* Copy the local addresses which are valid for 'scope' into 'bp'. */ +int sctp_copy_local_addr_list(struct sctp_protocol *proto, + struct sctp_bind_addr *bp, sctp_scope_t scope, + int gfp, int copy_flags) +{ + struct sockaddr_storage_list *addr; + int error = 0; + struct list_head *pos; + unsigned long flags; + + sctp_spin_lock_irqsave(&proto->local_addr_lock, flags); + list_for_each(pos, &proto->local_addr_list) { + addr = list_entry(pos, struct sockaddr_storage_list, list); + if (sctp_in_scope(&addr->a, scope)) { + /* Now that the address is in scope, check to see if + * the address type is really supported by the local + * sock as well as the remote peer. + */ + if ((((AF_INET == addr->a.sa.sa_family) && + (copy_flags & SCTP_ADDR4_PEERSUPP))) || + (((AF_INET6 == addr->a.sa.sa_family) && + (copy_flags & SCTP_ADDR6_ALLOWED) && + (copy_flags & SCTP_ADDR6_PEERSUPP)))) { + error = sctp_add_bind_addr(bp, &addr->a, + GFP_ATOMIC); + if (error) + goto end_copy; + } + } + } + +end_copy: + sctp_spin_unlock_irqrestore(&proto->local_addr_lock, flags); + return error; +} + +/* Initialize a sctp_addr from in incoming skb. */ +static void sctp_v4_from_skb(union sctp_addr *addr, struct sk_buff *skb, + int is_saddr) +{ + void *from; + __u16 *port; + struct sctphdr *sh; + + port = &addr->v4.sin_port; + addr->v4.sin_family = AF_INET; + + sh = (struct sctphdr *) skb->h.raw; + if (is_saddr) { + *port = ntohs(sh->source); + from = &skb->nh.iph->saddr; + } else { + *port = ntohs(sh->dest); + from = &skb->nh.iph->daddr; + } + memcpy(&addr->v4.sin_addr.s_addr, from, sizeof(struct in_addr)); +} + +/* Initialize an sctp_addr from a socket. */ +static void sctp_v4_from_sk(union sctp_addr *addr, struct sock *sk) +{ + addr->v4.sin_family = AF_INET; + addr->v4.sin_port = (sk)->num; + addr->v4.sin_addr.s_addr = (sk)->rcv_saddr; +} + +/* Initialize sk->rcv_saddr from sctp_addr. */ +static void sctp_v4_to_sk_saddr(union sctp_addr *addr, struct sock *sk) +{ + (sk)->rcv_saddr = addr->v4.sin_addr.s_addr; +} + +/* Initialize sk->daddr from sctp_addr. */ +static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk) +{ + (sk)->daddr = addr->v4.sin_addr.s_addr; +} + +/* Initialize a sctp_addr from a dst_entry. */ +static void sctp_v4_dst_saddr(union sctp_addr *saddr, struct dst_entry *dst, + unsigned short port) +{ + struct rtable *rt = (struct rtable *)dst; + saddr->v4.sin_family = AF_INET; + saddr->v4.sin_port = port; + saddr->v4.sin_addr.s_addr = rt->rt_src; +} + +/* Compare two addresses exactly. */ +static int sctp_v4_cmp_addr(const union sctp_addr *addr1, + const union sctp_addr *addr2) +{ + if (addr1->sa.sa_family != addr2->sa.sa_family) + return 0; + if (addr1->v4.sin_port != addr2->v4.sin_port) + return 0; + if (addr1->v4.sin_addr.s_addr != addr2->v4.sin_addr.s_addr) + return 0; + + return 1; +} + +/* Initialize addr struct to INADDR_ANY. */ +static void sctp_v4_inaddr_any(union sctp_addr *addr, unsigned short port) +{ + addr->v4.sin_family = AF_INET; + addr->v4.sin_addr.s_addr = INADDR_ANY; + addr->v4.sin_port = port; +} + +/* Is this a wildcard address? */ +static int sctp_v4_is_any(const union sctp_addr *addr) +{ + return INADDR_ANY == addr->v4.sin_addr.s_addr; +} + +/* This function checks if the address is a valid address to be used for + * SCTP binding. + * + * Output: + * Return 0 - If the address is a non-unicast or an illegal address. + * Return 1 - If the address is a unicast. + */ +static int sctp_v4_addr_valid(union sctp_addr *addr) +{ + /* Is this a non-unicast address or a unusable SCTP address? */ + if (IS_IPV4_UNUSABLE_ADDRESS(&addr->v4.sin_addr.s_addr)) + return 0; + + return 1; +} + +/* Should this be available for binding? */ +static int sctp_v4_available(const union sctp_addr *addr) +{ + int ret = inet_addr_type(addr->v4.sin_addr.s_addr); + + /* FIXME: ip_nonlocal_bind sysctl support. */ + + if (addr->v4.sin_addr.s_addr != INADDR_ANY && ret != RTN_LOCAL) + return 0; + return 1; +} + +/* Checking the loopback, private and other address scopes as defined in + * RFC 1918. The IPv4 scoping is based on the draft for SCTP IPv4 + * scoping . + * + * Level 0 - unusable SCTP addresses + * Level 1 - loopback address + * Level 2 - link-local addresses + * Level 3 - private addresses. + * Level 4 - global addresses + * For INIT and INIT-ACK address list, let L be the level of + * of requested destination address, sender and receiver + * SHOULD include all of its addresses with level greater + * than or equal to L. + */ +static sctp_scope_t sctp_v4_scope(union sctp_addr *addr) +{ + sctp_scope_t retval; + + /* Should IPv4 scoping be a sysctl configurable option + * so users can turn it off (default on) for certain + * unconventional networking environments? + */ + + /* Check for unusable SCTP addresses. */ + if (IS_IPV4_UNUSABLE_ADDRESS(&addr->v4.sin_addr.s_addr)) { + retval = SCTP_SCOPE_UNUSABLE; + } else if (LOOPBACK(addr->v4.sin_addr.s_addr)) { + retval = SCTP_SCOPE_LOOPBACK; + } else if (IS_IPV4_LINK_ADDRESS(&addr->v4.sin_addr.s_addr)) { + retval = SCTP_SCOPE_LINK; + } else if (IS_IPV4_PRIVATE_ADDRESS(&addr->v4.sin_addr.s_addr)) { + retval = SCTP_SCOPE_PRIVATE; + } else { + retval = SCTP_SCOPE_GLOBAL; + } + + return retval; +} + +/* Returns a valid dst cache entry for the given source and destination ip + * addresses. If an association is passed, trys to get a dst entry with a + * source address that matches an address in the bind address list. + */ +struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, + union sctp_addr *daddr, + union sctp_addr *saddr) +{ + struct rtable *rt; + struct rt_key key; + sctp_bind_addr_t *bp; + rwlock_t *addr_lock; + struct sockaddr_storage_list *laddr; + struct list_head *pos; + struct dst_entry *dst = NULL; + union sctp_addr dst_saddr; + + memset(&key, 0x0, sizeof(struct rt_key)); + key.dst = daddr->v4.sin_addr.s_addr; + + if (saddr) + key.src = saddr->v4.sin_addr.s_addr; + + SCTP_DEBUG_PRINTK("%s: DST:%u.%u.%u.%u, SRC:%u.%u.%u.%u - ", + __FUNCTION__, NIPQUAD(key.dst), + NIPQUAD(key.src)); + + if (!ip_route_output_key(&rt, &key)) { + dst = &rt->u.dst; + } + + /* If there is no association or if a source address is passed, no + * more validation is required. + */ + if (!asoc || saddr) + goto out; + + bp = &asoc->base.bind_addr; + addr_lock = &asoc->base.addr_lock; + + if (dst) { + /* Walk through the bind address list and look for a bind + * address that matches the source address of the returned dst. + */ + sctp_read_lock(addr_lock); + list_for_each(pos, &bp->address_list) { + laddr = list_entry(pos, struct sockaddr_storage_list, + list); + sctp_v4_dst_saddr(&dst_saddr, dst, bp->port); + if (sctp_v4_cmp_addr(&dst_saddr, &laddr->a)) + goto out_unlock; + } + sctp_read_unlock(addr_lock); + + /* None of the bound addresses match the source address of the + * dst. So release it. + */ + dst_release(dst); + dst = NULL; + } + + /* Walk through the bind address list and try to get a dst that + * matches a bind address as the source address. + */ + sctp_read_lock(addr_lock); + list_for_each(pos, &bp->address_list) { + laddr = list_entry(pos, struct sockaddr_storage_list, list); + + if (AF_INET == laddr->a.sa.sa_family) { + key.src = laddr->a.v4.sin_addr.s_addr; + if (!ip_route_output_key(&rt, &key)) { + dst = &rt->u.dst; + goto out_unlock; + } + } + } + +out_unlock: + sctp_read_unlock(addr_lock); +out: + if (dst) + SCTP_DEBUG_PRINTK("rt_dst:%u.%u.%u.%u, rt_src:%u.%u.%u.%u\n", + NIPQUAD(rt->rt_dst), NIPQUAD(rt->rt_src)); + else + SCTP_DEBUG_PRINTK("NO ROUTE\n"); + + return dst; +} + +/* For v4, the source address is cached in the route entry(dst). So no need + * to cache it separately and hence this is an empty routine. + */ +void sctp_v4_get_saddr(struct sctp_association *asoc, + struct dst_entry *dst, + union sctp_addr *daddr, + union sctp_addr *saddr) +{ + struct rtable *rt = (struct rtable *)dst; + + if (rt) { + saddr->v4.sin_family = AF_INET; + saddr->v4.sin_port = asoc->base.bind_addr.port; + saddr->v4.sin_addr.s_addr = rt->rt_src; + } +} + +/* What interface did this skb arrive on? */ +int sctp_v4_skb_iif(const struct sk_buff *skb) +{ + return ((struct rtable *)skb->dst)->rt_iif; +} + +/* Create and initialize a new sk for the socket returned by accept(). */ +struct sock *sctp_v4_create_accept_sk(struct sock *sk, + struct sctp_association *asoc) +{ + struct sock *newsk; + struct inet_opt *inet = inet_sk(sk); + struct inet_opt *newinet; + + newsk = sk_alloc(PF_INET, GFP_KERNEL, sizeof(struct sock)); + if (!newsk) + goto out; + + sock_init_data(NULL, newsk); + sk_set_owner(newsk, THIS_MODULE); + + newsk->type = SOCK_STREAM; + + newsk->prot = sk->prot; + newsk->no_check = sk->no_check; + newsk->reuse = sk->reuse; + newsk->shutdown = sk->shutdown; + + newsk->destruct = inet_sock_destruct; + newsk->zapped = 0; + newsk->family = PF_INET; + newsk->protocol = IPPROTO_SCTP; + newsk->backlog_rcv = sk->prot->backlog_rcv; + + newinet = inet_sk(newsk); + + /* Initialize sk's sport, dport, rcv_saddr and daddr for + * getsockname() and getpeername() + */ + newsk->sport = sk->sport; + newsk->saddr = sk->saddr; + newsk->rcv_saddr = sk->rcv_saddr; + newsk->dport = htons(asoc->peer.port); + newsk->daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr; + newinet->pmtudisc = inet->pmtudisc; + newinet->id = 0; + + newinet->ttl = sysctl_ip_default_ttl; + newinet->mc_loop = 1; + newinet->mc_ttl = 1; + newinet->mc_index = 0; + newinet->mc_list = NULL; + +#ifdef INET_REFCNT_DEBUG + atomic_inc(&inet_sock_nr); +#endif + + if (0 != newsk->prot->init(newsk)) { + inet_sock_release(newsk); + newsk = NULL; + } + +out: + return newsk; +} + +/* Event handler for inet address addition/deletion events. + * Basically, whenever there is an event, we re-build our local address list. + */ +static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev, + void *ptr) +{ + unsigned long flags; + + sctp_spin_lock_irqsave(&sctp_proto.local_addr_lock, flags); + __sctp_free_local_addr_list(&sctp_proto); + __sctp_get_local_addr_list(&sctp_proto); + sctp_spin_unlock_irqrestore(&sctp_proto.local_addr_lock, flags); + + return NOTIFY_DONE; +} + +/* + * Initialize the control inode/socket with a control endpoint data + * structure. This endpoint is reserved exclusively for the OOTB processing. + */ +int sctp_ctl_sock_init(void) +{ + int err; + sa_family_t family; + + if (sctp_get_pf_specific(PF_INET6)) + family = PF_INET6; + else + family = PF_INET; + + err = sock_create(family, SOCK_SEQPACKET, IPPROTO_SCTP, + &sctp_ctl_socket); + if (err < 0) { + printk(KERN_ERR + "SCTP: Failed to create the SCTP control socket.\n"); + return err; + } + sctp_ctl_socket->sk->allocation = GFP_ATOMIC; + inet_sk(sctp_ctl_socket->sk)->ttl = MAXTTL; + + return 0; +} + +/* Register address family specific functions. */ +int sctp_register_af(struct sctp_af *af) +{ + switch (af->sa_family) { + case AF_INET: + if (sctp_af_v4_specific) + return 0; + sctp_af_v4_specific = af; + break; + case AF_INET6: + if (sctp_af_v6_specific) + return 0; + sctp_af_v6_specific = af; + break; + default: + return 0; + } + + INIT_LIST_HEAD(&af->list); + list_add_tail(&af->list, &sctp_proto.address_families); + return 1; +} + +/* Get the table of functions for manipulating a particular address + * family. + */ +struct sctp_af *sctp_get_af_specific(sa_family_t family) +{ + switch (family) { + case AF_INET: + return sctp_af_v4_specific; + case AF_INET6: + return sctp_af_v6_specific; + default: + return NULL; + } +} + +/* Common code to initialize a AF_INET msg_name. */ +static void sctp_inet_msgname(char *msgname, int *addr_len) +{ + struct sockaddr_in *sin; + + sin = (struct sockaddr_in *)msgname; + *addr_len = sizeof(struct sockaddr_in); + sin->sin_family = AF_INET; + memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); +} + +/* Copy the primary address of the peer primary address as the msg_name. */ +static void sctp_inet_event_msgname(struct sctp_ulpevent *event, char *msgname, + int *addr_len) +{ + struct sockaddr_in *sin, *sinfrom; + + if (msgname) { + sctp_inet_msgname(msgname, addr_len); + sin = (struct sockaddr_in *)msgname; + sinfrom = &event->event_asoc->peer.primary_addr.v4; + sin->sin_port = htons(event->event_asoc->peer.port); + sin->sin_addr.s_addr = sinfrom->sin_addr.s_addr; + } +} + +/* Initialize and copy out a msgname from an inbound skb. */ +static void sctp_inet_skb_msgname(struct sk_buff *skb, char *msgname, int *len) +{ + struct sctphdr *sh; + struct sockaddr_in *sin; + + if (msgname) { + sctp_inet_msgname(msgname, len); + sin = (struct sockaddr_in *)msgname; + sh = (struct sctphdr *)skb->h.raw; + sin->sin_port = sh->source; + sin->sin_addr.s_addr = skb->nh.iph->saddr; + } +} + +/* Do we support this AF? */ +static int sctp_inet_af_supported(sa_family_t family) +{ + /* PF_INET only supports AF_INET addresses. */ + return (AF_INET == family); +} + +/* Address matching with wildcards allowed. */ +static int sctp_inet_cmp_addr(const union sctp_addr *addr1, + const union sctp_addr *addr2, + struct sctp_opt *opt) +{ + /* PF_INET only supports AF_INET addresses. */ + if (addr1->sa.sa_family != addr2->sa.sa_family) + return 0; + if (INADDR_ANY == addr1->v4.sin_addr.s_addr || + INADDR_ANY == addr2->v4.sin_addr.s_addr) + return 1; + if (addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr) + return 1; + + return 0; +} + +/* Verify that provided sockaddr looks bindable. Common verification has + * already been taken care of. + */ +static int sctp_inet_bind_verify(struct sctp_opt *opt, union sctp_addr *addr) +{ + return sctp_v4_available(addr); +} + +/* Verify that sockaddr looks sendable. Common verification has already + * been taken care of. + */ +static int sctp_inet_send_verify(struct sctp_opt *opt, union sctp_addr *addr) +{ + return 1; +} + +/* Fill in Supported Address Type information for INIT and INIT-ACK + * chunks. Returns number of addresses supported. + */ +static int sctp_inet_supported_addrs(const struct sctp_opt *opt, + __u16 *types) +{ + types[0] = SCTP_PARAM_IPV4_ADDRESS; + return 1; +} + +/* Wrapper routine that calls the ip transmit routine. */ +static inline int sctp_v4_xmit(struct sk_buff *skb, + struct sctp_transport *transport, int ipfragok) +{ + SCTP_DEBUG_PRINTK("%s: skb:%p, len:%d, " + "src:%u.%u.%u.%u, dst:%u.%u.%u.%u\n", + __FUNCTION__, skb, skb->len, + NIPQUAD(((struct rtable *)skb->dst)->rt_src), + NIPQUAD(((struct rtable *)skb->dst)->rt_dst)); + + SCTP_INC_STATS(SctpOutSCTPPacks); + return ip_queue_xmit(skb, ipfragok); +} + +struct sctp_af sctp_ipv4_specific; + +static struct sctp_pf sctp_pf_inet = { + .event_msgname = sctp_inet_event_msgname, + .skb_msgname = sctp_inet_skb_msgname, + .af_supported = sctp_inet_af_supported, + .cmp_addr = sctp_inet_cmp_addr, + .bind_verify = sctp_inet_bind_verify, + .send_verify = sctp_inet_send_verify, + .supported_addrs = sctp_inet_supported_addrs, + .create_accept_sk = sctp_v4_create_accept_sk, + .af = &sctp_ipv4_specific, +}; + +/* Notifier for inetaddr addition/deletion events. */ +struct notifier_block sctp_inetaddr_notifier = { + .notifier_call = sctp_inetaddr_event, +}; + +/* Socket operations. */ +struct proto_ops inet_seqpacket_ops = { + .family = PF_INET, + .release = inet_release, /* Needs to be wrapped... */ + .bind = inet_bind, + .connect = inet_dgram_connect, + .socketpair = sock_no_socketpair, + .accept = inet_accept, + .getname = inet_getname, /* Semantics are different. */ + .poll = sctp_poll, + .ioctl = inet_ioctl, + .listen = sctp_inet_listen, + .shutdown = inet_shutdown, /* Looks harmless. */ + .setsockopt = inet_setsockopt, /* IP_SOL IP_OPTION is a problem. */ + .getsockopt = inet_getsockopt, + .sendmsg = inet_sendmsg, + .recvmsg = inet_recvmsg, + .mmap = sock_no_mmap, + .sendpage = sock_no_sendpage, +}; + +/* Registration with AF_INET family. */ +static struct inet_protosw sctp_seqpacket_protosw = { + .type = SOCK_SEQPACKET, + .protocol = IPPROTO_SCTP, + .prot = &sctp_prot, + .ops = &inet_seqpacket_ops, + .capability = -1, + .no_check = 0, + .flags = SCTP_PROTOSW_FLAG +}; +static struct inet_protosw sctp_stream_protosw = { + .type = SOCK_STREAM, + .protocol = IPPROTO_SCTP, + .prot = &sctp_prot, + .ops = &inet_seqpacket_ops, + .capability = -1, + .no_check = 0, + .flags = SCTP_PROTOSW_FLAG +}; + +/* Register with IP layer. */ +static struct inet_protocol sctp_protocol = { + .handler = sctp_rcv, + .err_handler = sctp_v4_err, + .protocol = IPPROTO_SCTP, + .name = "SCTP" +}; + +/* IPv4 address related functions. */ +struct sctp_af sctp_ipv4_specific = { + .sctp_xmit = sctp_v4_xmit, + .setsockopt = ip_setsockopt, + .getsockopt = ip_getsockopt, + .get_dst = sctp_v4_get_dst, + .get_saddr = sctp_v4_get_saddr, + .copy_addrlist = sctp_v4_copy_addrlist, + .from_skb = sctp_v4_from_skb, + .from_sk = sctp_v4_from_sk, + .to_sk_saddr = sctp_v4_to_sk_saddr, + .to_sk_daddr = sctp_v4_to_sk_daddr, + .dst_saddr = sctp_v4_dst_saddr, + .cmp_addr = sctp_v4_cmp_addr, + .addr_valid = sctp_v4_addr_valid, + .inaddr_any = sctp_v4_inaddr_any, + .is_any = sctp_v4_is_any, + .available = sctp_v4_available, + .scope = sctp_v4_scope, + .skb_iif = sctp_v4_skb_iif, + .net_header_len = sizeof(struct iphdr), + .sockaddr_len = sizeof(struct sockaddr_in), + .sa_family = AF_INET, +}; + +struct sctp_pf *sctp_get_pf_specific(sa_family_t family) { + + switch (family) { + case PF_INET: + return sctp_pf_inet_specific; + case PF_INET6: + return sctp_pf_inet6_specific; + default: + return NULL; + } +} + +/* Register the PF specific function table. */ +int sctp_register_pf(struct sctp_pf *pf, sa_family_t family) +{ + switch (family) { + case PF_INET: + if (sctp_pf_inet_specific) + return 0; + sctp_pf_inet_specific = pf; + break; + case PF_INET6: + if (sctp_pf_inet6_specific) + return 0; + sctp_pf_inet6_specific = pf; + break; + default: + return 0; + } + return 1; +} + +static int __init init_sctp_mibs(void) +{ + return 0; +} + +static void cleanup_sctp_mibs(void) +{ +} + +/* Initialize the universe into something sensible. */ +__init int sctp_init(void) +{ + int i; + int status = 0; + + /* SCTP_DEBUG sanity check. */ + if (!sctp_sanity_check()) + return -EINVAL; + + /* Add SCTP to inet_protos hash table. */ + inet_add_protocol(&sctp_protocol); + + /* Add SCTP(TCP and UDP style) to inetsw linked list. */ + inet_register_protosw(&sctp_seqpacket_protosw); + inet_register_protosw(&sctp_stream_protosw); + + /* Allocate and initialise sctp mibs. */ + status = init_sctp_mibs(); + if (status) + goto err_init_mibs; + + /* Initialize proc fs directory. */ + sctp_proc_init(); + + /* Initialize object count debugging. */ + sctp_dbg_objcnt_init(); + + /* Initialize the SCTP specific PF functions. */ + sctp_register_pf(&sctp_pf_inet, PF_INET); + /* + * 14. Suggested SCTP Protocol Parameter Values + */ + /* The following protocol parameters are RECOMMENDED: */ + /* RTO.Initial - 3 seconds */ + sctp_proto.rto_initial = SCTP_RTO_INITIAL; + /* RTO.Min - 1 second */ + sctp_proto.rto_min = SCTP_RTO_MIN; + /* RTO.Max - 60 seconds */ + sctp_proto.rto_max = SCTP_RTO_MAX; + /* RTO.Alpha - 1/8 */ + sctp_proto.rto_alpha = SCTP_RTO_ALPHA; + /* RTO.Beta - 1/4 */ + sctp_proto.rto_beta = SCTP_RTO_BETA; + + /* Valid.Cookie.Life - 60 seconds */ + sctp_proto.valid_cookie_life = 60 * HZ; + + /* Whether Cookie Preservative is enabled(1) or not(0) */ + sctp_proto.cookie_preserve_enable = 1; + + /* Max.Burst - 4 */ + sctp_proto.max_burst = SCTP_MAX_BURST; + + /* Association.Max.Retrans - 10 attempts + * Path.Max.Retrans - 5 attempts (per destination address) + * Max.Init.Retransmits - 8 attempts + */ + sctp_proto.max_retrans_association = 10; + sctp_proto.max_retrans_path = 5; + sctp_proto.max_retrans_init = 8; + + /* HB.interval - 30 seconds */ + sctp_proto.hb_interval = 30 * HZ; + + /* Implementation specific variables. */ + + /* Initialize default stream count setup information. */ + sctp_proto.max_instreams = SCTP_DEFAULT_INSTREAMS; + sctp_proto.max_outstreams = SCTP_DEFAULT_OUTSTREAMS; + + /* Allocate and initialize the association hash table. */ + sctp_proto.assoc_hashsize = 4096; + sctp_proto.assoc_hashbucket = (sctp_hashbucket_t *) + kmalloc(4096 * sizeof(sctp_hashbucket_t), GFP_KERNEL); + if (!sctp_proto.assoc_hashbucket) { + printk(KERN_ERR "SCTP: Failed association hash alloc.\n"); + status = -ENOMEM; + goto err_ahash_alloc; + } + for (i = 0; i < sctp_proto.assoc_hashsize; i++) { + sctp_proto.assoc_hashbucket[i].lock = RW_LOCK_UNLOCKED; + sctp_proto.assoc_hashbucket[i].chain = NULL; + } + + /* Allocate and initialize the endpoint hash table. */ + sctp_proto.ep_hashsize = 64; + sctp_proto.ep_hashbucket = (sctp_hashbucket_t *) + kmalloc(64 * sizeof(sctp_hashbucket_t), GFP_KERNEL); + if (!sctp_proto.ep_hashbucket) { + printk(KERN_ERR "SCTP: Failed endpoint_hash alloc.\n"); + status = -ENOMEM; + goto err_ehash_alloc; + } + + for (i = 0; i < sctp_proto.ep_hashsize; i++) { + sctp_proto.ep_hashbucket[i].lock = RW_LOCK_UNLOCKED; + sctp_proto.ep_hashbucket[i].chain = NULL; + } + + /* Allocate and initialize the SCTP port hash table. */ + sctp_proto.port_hashsize = 4096; + sctp_proto.port_hashtable = (sctp_bind_hashbucket_t *) + kmalloc(4096 * sizeof(sctp_bind_hashbucket_t), GFP_KERNEL); + if (!sctp_proto.port_hashtable) { + printk(KERN_ERR "SCTP: Failed bind hash alloc."); + status = -ENOMEM; + goto err_bhash_alloc; + } + + sctp_proto.port_alloc_lock = SPIN_LOCK_UNLOCKED; + sctp_proto.port_rover = sysctl_local_port_range[0] - 1; + for (i = 0; i < sctp_proto.port_hashsize; i++) { + sctp_proto.port_hashtable[i].lock = SPIN_LOCK_UNLOCKED; + sctp_proto.port_hashtable[i].chain = NULL; + } + + sctp_sysctl_register(); + + INIT_LIST_HEAD(&sctp_proto.address_families); + sctp_register_af(&sctp_ipv4_specific); + + status = sctp_v6_init(); + if (status) + goto err_v6_init; + + /* Initialize the control inode/socket for handling OOTB packets. */ + if ((status = sctp_ctl_sock_init())) { + printk (KERN_ERR + "SCTP: Failed to initialize the SCTP control sock.\n"); + goto err_ctl_sock_init; + } + + /* Initialize the local address list. */ + INIT_LIST_HEAD(&sctp_proto.local_addr_list); + sctp_proto.local_addr_lock = SPIN_LOCK_UNLOCKED; + + /* Register notifier for inet address additions/deletions. */ + register_inetaddr_notifier(&sctp_inetaddr_notifier); + + sctp_get_local_addr_list(&sctp_proto); + + __unsafe(THIS_MODULE); + return 0; + +err_ctl_sock_init: + sctp_v6_exit(); +err_v6_init: + sctp_sysctl_unregister(); + list_del(&sctp_ipv4_specific.list); + kfree(sctp_proto.port_hashtable); +err_bhash_alloc: + kfree(sctp_proto.ep_hashbucket); +err_ehash_alloc: + kfree(sctp_proto.assoc_hashbucket); +err_ahash_alloc: + sctp_dbg_objcnt_exit(); + sctp_proc_exit(); + cleanup_sctp_mibs(); +err_init_mibs: + inet_del_protocol(&sctp_protocol); + inet_unregister_protosw(&sctp_seqpacket_protosw); + inet_unregister_protosw(&sctp_stream_protosw); + return status; +} + +/* Exit handler for the SCTP protocol. */ +__exit void sctp_exit(void) +{ + /* BUG. This should probably do something useful like clean + * up all the remaining associations and all that memory. + */ + + /* Unregister notifier for inet address additions/deletions. */ + unregister_inetaddr_notifier(&sctp_inetaddr_notifier); + + /* Free the local address list. */ + sctp_free_local_addr_list(&sctp_proto); + + /* Free the control endpoint. */ + sock_release(sctp_ctl_socket); + + sctp_v6_exit(); + sctp_sysctl_unregister(); + list_del(&sctp_ipv4_specific.list); + + kfree(sctp_proto.assoc_hashbucket); + kfree(sctp_proto.ep_hashbucket); + kfree(sctp_proto.port_hashtable); + + sctp_dbg_objcnt_exit(); + sctp_proc_exit(); + cleanup_sctp_mibs(); + + inet_del_protocol(&sctp_protocol); + inet_unregister_protosw(&sctp_seqpacket_protosw); + inet_unregister_protosw(&sctp_stream_protosw); +} + +module_init(sctp_init); +module_exit(sctp_exit); + +MODULE_AUTHOR("Linux Kernel SCTP developers "); +MODULE_DESCRIPTION("Support for the SCTP protocol (RFC2960)"); +MODULE_LICENSE("GPL"); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/sla1.c linux-2.4.23-pre8/net/sctp/sla1.c --- linux-2.4.22/net/sctp/sla1.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/sla1.c 2003-10-22 22:48:43.000000000 +0000 @@ -0,0 +1,281 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * + * This file is part of the SCTP kernel reference Implementation + * + * (It's really SHA-1 but Hey I was tired when I created this + * file, and on a plane to France :-) + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Randall Stewart + * kmorneau@cisco.com + * qxie1@email.mot.com + * + * Based on: + * Randy Stewart, et al. SCTP Reference Implementation which is licenced + * under the GPL. + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include /* for memcpy */ +#include /* dead chicken for in.h */ +#include /* for htonl and ntohl */ + +#include + +void SLA1_Init(struct SLA_1_Context *ctx) +{ + /* Init the SLA-1 context structure. */ + ctx->A = 0; + ctx->B = 0; + ctx->C = 0; + ctx->D = 0; + ctx->E = 0; + ctx->H0 = H0INIT; + ctx->H1 = H1INIT; + ctx->H2 = H2INIT; + ctx->H3 = H3INIT; + ctx->H4 = H4INIT; + ctx->TEMP = 0; + memset(ctx->words, 0, sizeof(ctx->words)); + ctx->howManyInBlock = 0; + ctx->runningTotal = 0; +} + +void SLA1processABlock(struct SLA_1_Context *ctx,unsigned int *block) +{ + int i; + /* init the W0-W15 to the block of words being + * hashed. + */ + /* step a) */ + + for (i = 0; i < 16; i++) + ctx->words[i] = ntohl(block[i]); + + /* now init the rest based on the SLA-1 formula, step b) */ + for (i = 16; i < 80; i++) + ctx->words[i] = + CSHIFT(1, ((ctx->words[(i-3)]) ^ + (ctx->words[(i-8)]) ^ + (ctx->words[(i-14)]) ^ + (ctx->words[(i-16)]))); + + /* step c) */ + ctx->A = ctx->H0; + ctx->B = ctx->H1; + ctx->C = ctx->H2; + ctx->D = ctx->H3; + ctx->E = ctx->H4; + + /* step d) */ + for (i = 0; i < 80; i++) { + if (i < 20) { + ctx->TEMP = ((CSHIFT(5, ctx->A)) + + (F1(ctx->B, ctx->C, ctx->D)) + + (ctx->E) + + ctx->words[i] + + K1 + ); + } else if (i < 40) { + ctx->TEMP = ((CSHIFT(5, ctx->A)) + + (F2(ctx->B, ctx->C, ctx->D)) + + (ctx->E) + + (ctx->words[i]) + + K2 + ); + } else if (i < 60) { + ctx->TEMP = ((CSHIFT(5, ctx->A)) + + (F3(ctx->B, ctx->C, ctx->D)) + + (ctx->E) + + (ctx->words[i]) + + K3 + ); + } else { + ctx->TEMP = ((CSHIFT(5, ctx->A)) + + (F4(ctx->B, ctx->C, ctx->D)) + + (ctx->E) + + (ctx->words[i]) + + K4 + ); + } + ctx->E = ctx->D; + ctx->D = ctx->C; + ctx->C = CSHIFT(30, ctx->B); + ctx->B = ctx->A; + ctx->A = ctx->TEMP; + } + + /* step e) */ + ctx->H0 = (ctx->H0) + (ctx->A); + ctx->H1 = (ctx->H1) + (ctx->B); + ctx->H2 = (ctx->H2) + (ctx->C); + ctx->H3 = (ctx->H3) + (ctx->D); + ctx->H4 = (ctx->H4) + (ctx->E); +} + +void SLA1_Process(struct SLA_1_Context *ctx, const unsigned char *ptr, int siz) +{ + int numberLeft, leftToFill; + + numberLeft = siz; + while (numberLeft > 0) { + leftToFill = sizeof(ctx->SLAblock) - ctx->howManyInBlock; + if (leftToFill > numberLeft) { + /* can only partially fill up this one */ + memcpy(&ctx->SLAblock[ctx->howManyInBlock], + ptr, numberLeft); + ctx->howManyInBlock += siz; + ctx->runningTotal += siz; + break; + } else { + /* block is now full, process it */ + memcpy(&ctx->SLAblock[ctx->howManyInBlock], + ptr, leftToFill); + SLA1processABlock(ctx, (unsigned int *) ctx->SLAblock); + numberLeft -= leftToFill; + ctx->runningTotal += leftToFill; + ctx->howManyInBlock = 0; + } + } +} + +void SLA1_Final(struct SLA_1_Context *ctx, unsigned char *digestBuf) +{ + /* if any left in block fill with padding + * and process. Then transfer the digest to + * the pointer. At the last block some special + * rules need to apply. We must add a 1 bit + * following the message, then we pad with + * 0's. The total size is encoded as a 64 bit + * number at the end. Now if the last buffer has + * more than 55 octets in it we cannot fit + * the 64 bit number + 10000000 pad on the end + * and must add the 10000000 pad, pad the rest + * of the message with 0's and then create a + * all 0 message with just the 64 bit size + * at the end and run this block through by itself. + * Also the 64 bit int must be in network byte + * order. + */ + int i, leftToFill; + unsigned int *ptr; + + if (ctx->howManyInBlock > 55) { + /* special case, we need to process two + * blocks here. One for the current stuff + * plus possibly the pad. The other for + * the size. + */ + leftToFill = sizeof(ctx->SLAblock) - ctx->howManyInBlock; + if (leftToFill == 0) { + /* Should not really happen but I am paranoid */ + /* Not paranoid enough! It is possible for leftToFill + * to become negative! AAA!!!! This is another reason + * to pick MD5 :-)... + */ + SLA1processABlock(ctx, (unsigned int *) ctx->SLAblock); + /* init last block, a bit different then the rest :-) */ + ctx->SLAblock[0] = 0x80; + for (i = 1; i < sizeof(ctx->SLAblock); i++) { + ctx->SLAblock[i] = 0x0; + } + } else if (leftToFill == 1) { + ctx->SLAblock[ctx->howManyInBlock] = 0x80; + SLA1processABlock(ctx, (unsigned int *) ctx->SLAblock); + /* init last block */ + memset(ctx->SLAblock, 0, sizeof(ctx->SLAblock)); + } else { + ctx->SLAblock[ctx->howManyInBlock] = 0x80; + for (i = (ctx->howManyInBlock + 1); + i < sizeof(ctx->SLAblock); + i++) { + ctx->SLAblock[i] = 0x0; + } + SLA1processABlock(ctx, (unsigned int *) ctx->SLAblock); + /* init last block */ + memset(ctx->SLAblock, 0, sizeof(ctx->SLAblock)); + } + /* This is in bits so multiply by 8 */ + ctx->runningTotal *= 8; + ptr = (unsigned int *) &ctx->SLAblock[60]; + *ptr = htonl(ctx->runningTotal); + SLA1processABlock(ctx, (unsigned int *) ctx->SLAblock); + } else { + /* easy case, we just pad this + * message to size - end with 0 + * add the magic 0x80 to the next + * word and then put the network byte + * order size in the last spot and + * process the block. + */ + ctx->SLAblock[ctx->howManyInBlock] = 0x80; + for (i = (ctx->howManyInBlock + 1); + i < sizeof(ctx->SLAblock); + i++) { + ctx->SLAblock[i] = 0x0; + } + /* get last int spot */ + ctx->runningTotal *= 8; + ptr = (unsigned int *) &ctx->SLAblock[60]; + *ptr = htonl(ctx->runningTotal); + SLA1processABlock(ctx, (unsigned int *) ctx->SLAblock); + } + /* Now at this point all we need do is transfer the + * digest back to the user + */ + digestBuf[3] = (ctx->H0 & 0xff); + digestBuf[2] = ((ctx->H0 >> 8) & 0xff); + digestBuf[1] = ((ctx->H0 >> 16) & 0xff); + digestBuf[0] = ((ctx->H0 >> 24) & 0xff); + + digestBuf[7] = (ctx->H1 & 0xff); + digestBuf[6] = ((ctx->H1 >> 8) & 0xff); + digestBuf[5] = ((ctx->H1 >> 16) & 0xff); + digestBuf[4] = ((ctx->H1 >> 24) & 0xff); + + digestBuf[11] = (ctx->H2 & 0xff); + digestBuf[10] = ((ctx->H2 >> 8) & 0xff); + digestBuf[9] = ((ctx->H2 >> 16) & 0xff); + digestBuf[8] = ((ctx->H2 >> 24) & 0xff); + + digestBuf[15] = (ctx->H3 & 0xff); + digestBuf[14] = ((ctx->H3 >> 8) & 0xff); + digestBuf[13] = ((ctx->H3 >> 16) & 0xff); + digestBuf[12] = ((ctx->H3 >> 24) & 0xff); + + digestBuf[19] = (ctx->H4 & 0xff); + digestBuf[18] = ((ctx->H4 >> 8) & 0xff); + digestBuf[17] = ((ctx->H4 >> 16) & 0xff); + digestBuf[16] = ((ctx->H4 >> 24) & 0xff); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/sm_make_chunk.c linux-2.4.23-pre8/net/sctp/sm_make_chunk.c --- linux-2.4.22/net/sctp/sm_make_chunk.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/sm_make_chunk.c 2003-10-22 22:47:31.000000000 +0000 @@ -0,0 +1,2199 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2002 Intel Corp. + * Copyright (c) 2001-2002 International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * This file includes part of the implementation of the add-IP extension, + * based on June 29, 2001, + * for the SCTP kernel reference Implementation. + * + * These functions work with the state functions in sctp_sm_statefuns.c + * to implement the state operations. These functions implement the + * steps which require modifying existing data structures. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * C. Robin + * Jon Grimm + * Xingang Guo + * Dajiang Zhang + * Sridhar Samudrala + * Daisy Chang + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include /* for get_random_bytes */ +#include +#include + +/* What was the inbound interface for this chunk? */ +int sctp_chunk_iif(const struct sctp_chunk *chunk) +{ + struct sctp_af *af; + int iif = 0; + + af = sctp_get_af_specific(ipver2af(chunk->skb->nh.iph->version)); + if (af) + iif = af->skb_iif(chunk->skb); + + return iif; +} + +/* RFC 2960 3.3.2 Initiation (INIT) (1) + * + * Note 2: The ECN capable field is reserved for future use of + * Explicit Congestion Notification. + */ +static const sctp_ecn_capable_param_t ecap_param = { + { + SCTP_PARAM_ECN_CAPABLE, + __constant_htons(sizeof(sctp_ecn_capable_param_t)), + } +}; + +/* A helper to initialize to initialize an op error inside a + * provided chunk, as most cause codes will be embedded inside an + * abort chunk. + */ +void sctp_init_cause(sctp_chunk_t *chunk, __u16 cause_code, + const void *payload, size_t paylen) +{ + sctp_errhdr_t err; + int padlen; + __u16 len; + + /* Cause code constants are now defined in network order. */ + err.cause = cause_code; + len = sizeof(sctp_errhdr_t) + paylen; + padlen = len % 4; + err.length = htons(len); + len += padlen; + sctp_addto_chunk(chunk, sizeof(sctp_errhdr_t), &err); + chunk->subh.err_hdr = sctp_addto_chunk(chunk, paylen, payload); +} + +/* 3.3.2 Initiation (INIT) (1) + * + * This chunk is used to initiate a SCTP association between two + * endpoints. The format of the INIT chunk is shown below: + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type = 1 | Chunk Flags | Chunk Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Initiate Tag | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Advertised Receiver Window Credit (a_rwnd) | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Number of Outbound Streams | Number of Inbound Streams | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Initial TSN | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * \ \ + * / Optional/Variable-Length Parameters / + * \ \ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * + * The INIT chunk contains the following parameters. Unless otherwise + * noted, each parameter MUST only be included once in the INIT chunk. + * + * Fixed Parameters Status + * ---------------------------------------------- + * Initiate Tag Mandatory + * Advertised Receiver Window Credit Mandatory + * Number of Outbound Streams Mandatory + * Number of Inbound Streams Mandatory + * Initial TSN Mandatory + * + * Variable Parameters Status Type Value + * ------------------------------------------------------------- + * IPv4 Address (Note 1) Optional 5 + * IPv6 Address (Note 1) Optional 6 + * Cookie Preservative Optional 9 + * Reserved for ECN Capable (Note 2) Optional 32768 (0x8000) + * Host Name Address (Note 3) Optional 11 + * Supported Address Types (Note 4) Optional 12 + */ +sctp_chunk_t *sctp_make_init(const struct sctp_association *asoc, + const sctp_bind_addr_t *bp, + int gfp, int vparam_len) +{ + sctp_inithdr_t init; + union sctp_params addrs; + size_t chunksize; + sctp_chunk_t *retval = NULL; + int num_types, addrs_len = 0; + struct sctp_opt *sp; + sctp_supported_addrs_param_t sat; + __u16 types[2]; + + /* RFC 2960 3.3.2 Initiation (INIT) (1) + * + * Note 1: The INIT chunks can contain multiple addresses that + * can be IPv4 and/or IPv6 in any combination. + */ + retval = NULL; + + /* Convert the provided bind address list to raw format. */ + addrs = sctp_bind_addrs_to_raw(bp, &addrs_len, gfp); + + init.init_tag = htonl(asoc->c.my_vtag); + init.a_rwnd = htonl(asoc->rwnd); + init.num_outbound_streams = htons(asoc->c.sinit_num_ostreams); + init.num_inbound_streams = htons(asoc->c.sinit_max_instreams); + init.initial_tsn = htonl(asoc->c.initial_tsn); + + /* How many address types are needed? */ + sp = sctp_sk(asoc->base.sk); + num_types = sp->pf->supported_addrs(sp, types); + + chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types); + chunksize += sizeof(ecap_param); + chunksize += vparam_len; + + /* RFC 2960 3.3.2 Initiation (INIT) (1) + * + * Note 3: An INIT chunk MUST NOT contain more than one Host + * Name address parameter. Moreover, the sender of the INIT + * MUST NOT combine any other address types with the Host Name + * address in the INIT. The receiver of INIT MUST ignore any + * other address types if the Host Name address parameter is + * present in the received INIT chunk. + * + * PLEASE DO NOT FIXME [This version does not support Host Name.] + */ + + retval = sctp_make_chunk(asoc, SCTP_CID_INIT, 0, chunksize); + if (!retval) + goto nodata; + + retval->subh.init_hdr = + sctp_addto_chunk(retval, sizeof(init), &init); + retval->param_hdr.v = + sctp_addto_chunk(retval, addrs_len, addrs.v); + + /* RFC 2960 3.3.2 Initiation (INIT) (1) + * + * Note 4: This parameter, when present, specifies all the + * address types the sending endpoint can support. The absence + * of this parameter indicates that the sending endpoint can + * support any address type. + */ + sat.param_hdr.type = SCTP_PARAM_SUPPORTED_ADDRESS_TYPES; + sat.param_hdr.length = htons(SCTP_SAT_LEN(num_types)); + sctp_addto_chunk(retval, sizeof(sat), &sat); + sctp_addto_chunk(retval, num_types * sizeof(__u16), &types); + + sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param); +nodata: + if (addrs.v) + kfree(addrs.v); + return retval; +} + +sctp_chunk_t *sctp_make_init_ack(const struct sctp_association *asoc, + const sctp_chunk_t *chunk, + int gfp, int unkparam_len) +{ + sctp_inithdr_t initack; + sctp_chunk_t *retval; + union sctp_params addrs; + int addrs_len; + sctp_cookie_param_t *cookie; + int cookie_len; + size_t chunksize; + + retval = NULL; + + /* Note: there may be no addresses to embed. */ + addrs = sctp_bind_addrs_to_raw(&asoc->base.bind_addr, &addrs_len, gfp); + + initack.init_tag = htonl(asoc->c.my_vtag); + initack.a_rwnd = htonl(asoc->rwnd); + initack.num_outbound_streams = htons(asoc->c.sinit_num_ostreams); + initack.num_inbound_streams = htons(asoc->c.sinit_max_instreams); + initack.initial_tsn = htonl(asoc->c.initial_tsn); + + /* FIXME: We really ought to build the cookie right + * into the packet instead of allocating more fresh memory. + */ + cookie = sctp_pack_cookie(asoc->ep, asoc, chunk, &cookie_len, + addrs.v, addrs_len); + if (!cookie) + goto nomem_cookie; + + /* Calculate the total size of allocation, include the reserved + * space for reporting unknown parameters if it is specified. + */ + chunksize = sizeof(initack) + addrs_len + cookie_len + unkparam_len; + + /* Tell peer that we'll do ECN only if peer advertised such cap. */ + if (asoc->peer.ecn_capable) + chunksize += sizeof(ecap_param); + + /* Now allocate and fill out the chunk. */ + retval = sctp_make_chunk(asoc, SCTP_CID_INIT_ACK, 0, chunksize); + if (!retval) + goto nomem_chunk; + + /* Per the advice in RFC 2960 6.4, send this reply to + * the source of the INIT packet. + */ + retval->transport = chunk->transport; + retval->subh.init_hdr = + sctp_addto_chunk(retval, sizeof(initack), &initack); + retval->param_hdr.v = sctp_addto_chunk(retval, addrs_len, addrs.v); + sctp_addto_chunk(retval, cookie_len, cookie); + if (asoc->peer.ecn_capable) + sctp_addto_chunk(retval, sizeof(ecap_param), &ecap_param); + + /* We need to remove the const qualifier at this point. */ + retval->asoc = (struct sctp_association *) asoc; + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it received the DATA or control chunk + * to which it is replying. + * + * [INIT ACK back to where the INIT came from.] + */ + if (chunk) + retval->transport = chunk->transport; + +nomem_chunk: + kfree(cookie); +nomem_cookie: + if (addrs.v) + kfree(addrs.v); + return retval; +} + +/* 3.3.11 Cookie Echo (COOKIE ECHO) (10): + * + * This chunk is used only during the initialization of an association. + * It is sent by the initiator of an association to its peer to complete + * the initialization process. This chunk MUST precede any DATA chunk + * sent within the association, but MAY be bundled with one or more DATA + * chunks in the same packet. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type = 10 |Chunk Flags | Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * / Cookie / + * \ \ + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * Chunk Flags: 8 bit + * + * Set to zero on transmit and ignored on receipt. + * + * Length: 16 bits (unsigned integer) + * + * Set to the size of the chunk in bytes, including the 4 bytes of + * the chunk header and the size of the Cookie. + * + * Cookie: variable size + * + * This field must contain the exact cookie received in the + * State Cookie parameter from the previous INIT ACK. + * + * An implementation SHOULD make the cookie as small as possible + * to insure interoperability. + */ +sctp_chunk_t *sctp_make_cookie_echo(const struct sctp_association *asoc, + const sctp_chunk_t *chunk) +{ + sctp_chunk_t *retval; + void *cookie; + int cookie_len; + + cookie = asoc->peer.cookie; + cookie_len = asoc->peer.cookie_len; + + /* Build a cookie echo chunk. */ + retval = sctp_make_chunk(asoc, SCTP_CID_COOKIE_ECHO, 0, cookie_len); + if (!retval) + goto nodata; + retval->subh.cookie_hdr = + sctp_addto_chunk(retval, cookie_len, cookie); + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it * received the DATA or control chunk + * to which it is replying. + * + * [COOKIE ECHO back to where the INIT ACK came from.] + */ + if (chunk) + retval->transport = chunk->transport; + +nodata: + return retval; +} + +/* 3.3.12 Cookie Acknowledgement (COOKIE ACK) (11): + * + * This chunk is used only during the initialization of an + * association. It is used to acknowledge the receipt of a COOKIE + * ECHO chunk. This chunk MUST precede any DATA or SACK chunk sent + * within the association, but MAY be bundled with one or more DATA + * chunks or SACK chunk in the same SCTP packet. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type = 11 |Chunk Flags | Length = 4 | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * Chunk Flags: 8 bits + * + * Set to zero on transmit and ignored on receipt. + */ +sctp_chunk_t *sctp_make_cookie_ack(const struct sctp_association *asoc, + const sctp_chunk_t *chunk) +{ + sctp_chunk_t *retval; + + retval = sctp_make_chunk(asoc, SCTP_CID_COOKIE_ACK, 0, 0); + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it * received the DATA or control chunk + * to which it is replying. + * + * [COOKIE ACK back to where the COOKIE ECHO came from.] + */ + if (retval && chunk) + retval->transport = chunk->transport; + + return retval; +} + +/* + * Appendix A: Explicit Congestion Notification: + * CWR: + * + * RFC 2481 details a specific bit for a sender to send in the header of + * its next outbound TCP segment to indicate to its peer that it has + * reduced its congestion window. This is termed the CWR bit. For + * SCTP the same indication is made by including the CWR chunk. + * This chunk contains one data element, i.e. the TSN number that + * was sent in the ECNE chunk. This element represents the lowest + * TSN number in the datagram that was originally marked with the + * CE bit. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Chunk Type=13 | Flags=00000000| Chunk Length = 8 | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Lowest TSN Number | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * Note: The CWR is considered a Control chunk. + */ +sctp_chunk_t *sctp_make_cwr(const struct sctp_association *asoc, + const __u32 lowest_tsn, + const sctp_chunk_t *chunk) +{ + sctp_chunk_t *retval; + sctp_cwrhdr_t cwr; + + cwr.lowest_tsn = htonl(lowest_tsn); + retval = sctp_make_chunk(asoc, SCTP_CID_ECN_CWR, 0, + sizeof(sctp_cwrhdr_t)); + + if (!retval) + goto nodata; + + retval->subh.ecn_cwr_hdr = + sctp_addto_chunk(retval, sizeof(cwr), &cwr); + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it * received the DATA or control chunk + * to which it is replying. + * + * [Report a reduced congestion window back to where the ECNE + * came from.] + */ + if (chunk) + retval->transport = chunk->transport; + +nodata: + return retval; +} + +/* Make an ECNE chunk. This is a congestion experienced report. */ +sctp_chunk_t *sctp_make_ecne(const struct sctp_association *asoc, + const __u32 lowest_tsn) +{ + sctp_chunk_t *retval; + sctp_ecnehdr_t ecne; + + ecne.lowest_tsn = htonl(lowest_tsn); + retval = sctp_make_chunk(asoc, SCTP_CID_ECN_ECNE, 0, + sizeof(sctp_ecnehdr_t)); + if (!retval) + goto nodata; + retval->subh.ecne_hdr = + sctp_addto_chunk(retval, sizeof(ecne), &ecne); + +nodata: + return retval; +} + +/* Make a DATA chunk for the given association from the provided + * parameters. However, do not populate the data payload. + */ +sctp_chunk_t *sctp_make_datafrag_empty(struct sctp_association *asoc, + const struct sctp_sndrcvinfo *sinfo, + int data_len, __u8 flags, __u16 ssn) +{ + sctp_chunk_t *retval; + sctp_datahdr_t dp; + int chunk_len; + + /* We assign the TSN as LATE as possible, not here when + * creating the chunk. + */ + dp.tsn= 1000000; /* This marker is a debugging aid. */ + dp.stream = htons(sinfo->sinfo_stream); + dp.ppid = htonl(sinfo->sinfo_ppid); + dp.ssn = htons(ssn); + + /* Set the flags for an unordered send. */ + if (sinfo->sinfo_flags & MSG_UNORDERED) + flags |= SCTP_DATA_UNORDERED; + + chunk_len = sizeof(dp) + data_len; + retval = sctp_make_chunk(asoc, SCTP_CID_DATA, flags, chunk_len); + if (!retval) + goto nodata; + + retval->subh.data_hdr = sctp_addto_chunk(retval, sizeof(dp), &dp); + memcpy(&retval->sinfo, sinfo, sizeof(struct sctp_sndrcvinfo)); + +nodata: + return retval; +} + +/* Make a DATA chunk for the given association. Populate the data + * payload. + */ +sctp_chunk_t *sctp_make_datafrag(struct sctp_association *asoc, + const struct sctp_sndrcvinfo *sinfo, + int data_len, const __u8 *data, + __u8 flags, __u16 ssn) +{ + sctp_chunk_t *retval; + + retval = sctp_make_datafrag_empty(asoc, sinfo, data_len, flags, ssn); + if (retval) + sctp_addto_chunk(retval, data_len, data); + + return retval; +} + +/* Make a DATA chunk for the given association to ride on stream id + * 'stream', with a payload id of 'payload', and a body of 'data'. + */ +sctp_chunk_t *sctp_make_data(struct sctp_association *asoc, + const struct sctp_sndrcvinfo *sinfo, + int data_len, const __u8 *data) +{ + sctp_chunk_t *retval = NULL; + + retval = sctp_make_data_empty(asoc, sinfo, data_len); + if (retval) + sctp_addto_chunk(retval, data_len, data); + return retval; +} + +/* Make a DATA chunk for the given association to ride on stream id + * 'stream', with a payload id of 'payload', and a body big enough to + * hold 'data_len' octets of data. We use this version when we need + * to build the message AFTER allocating memory. + */ +sctp_chunk_t *sctp_make_data_empty(struct sctp_association *asoc, + const struct sctp_sndrcvinfo *sinfo, + int data_len) +{ + __u8 flags = SCTP_DATA_NOT_FRAG; + + return sctp_make_datafrag_empty(asoc, sinfo, data_len, flags, 0); +} + +/* Create a selective ackowledgement (SACK) for the given + * association. This reports on which TSN's we've seen to date, + * including duplicates and gaps. + */ +sctp_chunk_t *sctp_make_sack(const struct sctp_association *asoc) +{ + sctp_chunk_t *retval; + sctp_sackhdr_t sack; + sctp_gap_ack_block_t gab; + int length; + __u32 ctsn; + struct sctp_tsnmap_iter iter; + __u16 num_gabs, num_dup_tsns; + struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map; + + ctsn = sctp_tsnmap_get_ctsn(map); + SCTP_DEBUG_PRINTK("sackCTSNAck sent is 0x%x.\n", ctsn); + + /* Count the number of Gap Ack Blocks. */ + num_gabs = 0; + + if (sctp_tsnmap_has_gap(map)) { + sctp_tsnmap_iter_init(map, &iter); + while (sctp_tsnmap_next_gap_ack(map, &iter, + &gab.start, &gab.end)) + num_gabs++; + } + + num_dup_tsns = sctp_tsnmap_num_dups(map); + + /* Initialize the SACK header. */ + sack.cum_tsn_ack = htonl(ctsn); + sack.a_rwnd = htonl(asoc->a_rwnd); + sack.num_gap_ack_blocks = htons(num_gabs); + sack.num_dup_tsns = htons(num_dup_tsns); + + length = sizeof(sack) + + sizeof(sctp_gap_ack_block_t) * num_gabs + + sizeof(__u32) * num_dup_tsns; + + /* Create the chunk. */ + retval = sctp_make_chunk(asoc, SCTP_CID_SACK, 0, length); + if (!retval) + goto nodata; + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, etc.) to the same destination transport + * address from which it received the DATA or control chunk to + * which it is replying. This rule should also be followed if + * the endpoint is bundling DATA chunks together with the + * reply chunk. + * + * However, when acknowledging multiple DATA chunks received + * in packets from different source addresses in a single + * SACK, the SACK chunk may be transmitted to one of the + * destination transport addresses from which the DATA or + * control chunks being acknowledged were received. + * + * [BUG: We do not implement the following paragraph. + * Perhaps we should remember the last transport we used for a + * SACK and avoid that (if possible) if we have seen any + * duplicates. --piggy] + * + * When a receiver of a duplicate DATA chunk sends a SACK to a + * multi- homed endpoint it MAY be beneficial to vary the + * destination address and not use the source address of the + * DATA chunk. The reason being that receiving a duplicate + * from a multi-homed endpoint might indicate that the return + * path (as specified in the source address of the DATA chunk) + * for the SACK is broken. + * + * [Send to the address from which we last received a DATA chunk.] + */ + retval->transport = asoc->peer.last_data_from; + + retval->subh.sack_hdr = + sctp_addto_chunk(retval, sizeof(sack), &sack); + + /* Put the Gap Ack Blocks into the chunk. */ + if (num_gabs) { + sctp_tsnmap_iter_init(map, &iter); + while(sctp_tsnmap_next_gap_ack(map, &iter, + &gab.start, &gab.end)) { + gab.start = htons(gab.start); + gab.end = htons(gab.end); + sctp_addto_chunk(retval, sizeof(sctp_gap_ack_block_t), + &gab); + } + } + + /* Register the duplicates. */ + sctp_addto_chunk(retval, sizeof(__u32) * num_dup_tsns, + sctp_tsnmap_get_dups(map)); + +nodata: + return retval; +} + +/* Make a SHUTDOWN chunk. */ +sctp_chunk_t *sctp_make_shutdown(const struct sctp_association *asoc) +{ + sctp_chunk_t *retval; + sctp_shutdownhdr_t shut; + __u32 ctsn; + + ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map); + shut.cum_tsn_ack = htonl(ctsn); + + retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN, 0, + sizeof(sctp_shutdownhdr_t)); + if (!retval) + goto nodata; + + retval->subh.shutdown_hdr = + sctp_addto_chunk(retval, sizeof(shut), &shut); +nodata: + return retval; +} + +sctp_chunk_t *sctp_make_shutdown_ack(const struct sctp_association *asoc, + const sctp_chunk_t *chunk) +{ + sctp_chunk_t *retval; + + retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN_ACK, 0, 0); + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it * received the DATA or control chunk + * to which it is replying. + * + * [ACK back to where the SHUTDOWN came from.] + */ + if (retval && chunk) + retval->transport = chunk->transport; + + return retval; +} + +sctp_chunk_t *sctp_make_shutdown_complete(const struct sctp_association *asoc, + const sctp_chunk_t *chunk) +{ + sctp_chunk_t *retval; + __u8 flags = 0; + + /* Maybe set the T-bit if we have no association. */ + flags |= asoc ? 0 : SCTP_CHUNK_FLAG_T; + + retval = sctp_make_chunk(asoc, SCTP_CID_SHUTDOWN_COMPLETE, flags, 0); + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it * received the DATA or control chunk + * to which it is replying. + * + * [Report SHUTDOWN COMPLETE back to where the SHUTDOWN ACK + * came from.] + */ + if (retval && chunk) + retval->transport = chunk->transport; + + return retval; +} + +/* Create an ABORT. Note that we set the T bit if we have no + * association. + */ +sctp_chunk_t *sctp_make_abort(const struct sctp_association *asoc, + const sctp_chunk_t *chunk, + const size_t hint) +{ + sctp_chunk_t *retval; + __u8 flags = 0; + + /* Maybe set the T-bit if we have no association. */ + flags |= asoc ? 0 : SCTP_CHUNK_FLAG_T; + + retval = sctp_make_chunk(asoc, SCTP_CID_ABORT, flags, hint); + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it * received the DATA or control chunk + * to which it is replying. + * + * [ABORT back to where the offender came from.] + */ + if (retval && chunk) + retval->transport = chunk->transport; + + return retval; +} + +/* Helper to create ABORT with a NO_USER_DATA error. */ +sctp_chunk_t *sctp_make_abort_no_data(const struct sctp_association *asoc, + const sctp_chunk_t *chunk, __u32 tsn) +{ + sctp_chunk_t *retval; + __u32 payload; + + retval = sctp_make_abort(asoc, chunk, sizeof(sctp_errhdr_t) + + sizeof(tsn)); + + if (!retval) + goto no_mem; + + /* Put the tsn back into network byte order. */ + payload = htonl(tsn); + sctp_init_cause(retval, SCTP_ERROR_NO_DATA, (const void *)&payload, + sizeof(payload)); + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it * received the DATA or control chunk + * to which it is replying. + * + * [ABORT back to where the offender came from.] + */ + if (chunk) + retval->transport = chunk->transport; + +no_mem: + return retval; +} + +/* Helper to create ABORT with a SCTP_ERROR_USER_ABORT error. */ +sctp_chunk_t *sctp_make_abort_user(const struct sctp_association *asoc, + const sctp_chunk_t *chunk, + const struct msghdr *msg) +{ + sctp_chunk_t *retval; + void *payload = NULL, *payoff; + size_t paylen; + struct iovec *iov = msg->msg_iov; + int iovlen = msg->msg_iovlen; + + paylen = get_user_iov_size(iov, iovlen); + retval = sctp_make_abort(asoc, chunk, sizeof(sctp_errhdr_t) + paylen); + if (!retval) + goto err_chunk; + + if (paylen) { + /* Put the msg_iov together into payload. */ + payload = kmalloc(paylen, GFP_ATOMIC); + if (!payload) + goto err_payload; + payoff = payload; + + for (; iovlen > 0; --iovlen) { + if (copy_from_user(payoff, iov->iov_base,iov->iov_len)) + goto err_copy; + payoff += iov->iov_len; + iov++; + } + } + + sctp_init_cause(retval, SCTP_ERROR_USER_ABORT, payload, paylen); + + if (paylen) + kfree(payload); + + return retval; + +err_copy: + kfree(payload); +err_payload: + sctp_free_chunk(retval); + retval = NULL; +err_chunk: + return retval; +} + +/* Make a HEARTBEAT chunk. */ +sctp_chunk_t *sctp_make_heartbeat(const struct sctp_association *asoc, + const struct sctp_transport *transport, + const void *payload, const size_t paylen) +{ + sctp_chunk_t *retval = sctp_make_chunk(asoc, SCTP_CID_HEARTBEAT, + 0, paylen); + + if (!retval) + goto nodata; + + /* Cast away the 'const', as this is just telling the chunk + * what transport it belongs to. + */ + retval->transport = (struct sctp_transport *) transport; + retval->subh.hbs_hdr = sctp_addto_chunk(retval, paylen, payload); + +nodata: + return retval; +} + +sctp_chunk_t *sctp_make_heartbeat_ack(const struct sctp_association *asoc, + const sctp_chunk_t *chunk, + const void *payload, const size_t paylen) +{ + sctp_chunk_t *retval = sctp_make_chunk(asoc, SCTP_CID_HEARTBEAT_ACK, + 0, paylen); + + if (!retval) + goto nodata; + retval->subh.hbs_hdr = sctp_addto_chunk(retval, paylen, payload); + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, * etc.) to the same destination transport + * address from which it * received the DATA or control chunk + * to which it is replying. + * + * [HBACK back to where the HEARTBEAT came from.] + */ + if (chunk) + retval->transport = chunk->transport; + +nodata: + return retval; +} + +/* Create an Operation Error chunk with the specified space reserved. + * This routine can be used for containing multiple causes in the chunk. + */ +sctp_chunk_t *sctp_make_op_error_space(const struct sctp_association *asoc, + const sctp_chunk_t *chunk, + size_t size) +{ + sctp_chunk_t *retval; + + retval = sctp_make_chunk(asoc, SCTP_CID_ERROR, 0, + sizeof(sctp_errhdr_t) + size); + if (!retval) + goto nodata; + + /* RFC 2960 6.4 Multi-homed SCTP Endpoints + * + * An endpoint SHOULD transmit reply chunks (e.g., SACK, + * HEARTBEAT ACK, etc.) to the same destination transport + * address from which it received the DATA or control chunk + * to which it is replying. + * + */ + if (chunk) + retval->transport = chunk->transport; + +nodata: + return retval; +} + +/* Create an Operation Error chunk. */ +sctp_chunk_t *sctp_make_op_error(const struct sctp_association *asoc, + const sctp_chunk_t *chunk, + __u16 cause_code, const void *payload, + size_t paylen) +{ + sctp_chunk_t *retval = sctp_make_op_error_space(asoc, chunk, paylen); + + if (!retval) + goto nodata; + + sctp_init_cause(retval, cause_code, payload, paylen); + +nodata: + return retval; +} + +/******************************************************************** + * 2nd Level Abstractions + ********************************************************************/ + +/* Turn an skb into a chunk. + * FIXME: Eventually move the structure directly inside the skb->cb[]. + */ +sctp_chunk_t *sctp_chunkify(struct sk_buff *skb, + const struct sctp_association *asoc, + struct sock *sk) +{ + sctp_chunk_t *retval = t_new(sctp_chunk_t, GFP_ATOMIC); + + if (!retval) + goto nodata; + memset(retval, 0, sizeof(sctp_chunk_t)); + + if (!sk) { + SCTP_DEBUG_PRINTK("chunkifying skb %p w/o an sk\n", skb); + } + + retval->skb = skb; + retval->asoc = (struct sctp_association *)asoc; + retval->num_times_sent = 0; + retval->has_tsn = 0; + retval->has_ssn = 0; + retval->rtt_in_progress = 0; + retval->sent_at = jiffies; + retval->singleton = 1; + retval->end_of_packet = 0; + retval->ecn_ce_done = 0; + retval->pdiscard = 0; + + /* sctpimpguide-05.txt Section 2.8.2 + * M1) Each time a new DATA chunk is transmitted + * set the 'TSN.Missing.Report' count for that TSN to 0. The + * 'TSN.Missing.Report' count will be used to determine missing chunks + * and when to fast retransmit. + */ + retval->tsn_missing_report = 0; + retval->tsn_gap_acked = 0; + retval->fast_retransmit = 0; + + /* Polish the bead hole. */ + INIT_LIST_HEAD(&retval->transmitted_list); + INIT_LIST_HEAD(&retval->frag_list); + SCTP_DBG_OBJCNT_INC(chunk); + +nodata: + return retval; +} + +/* Set chunk->source and dest based on the IP header in chunk->skb. */ +void sctp_init_addrs(sctp_chunk_t *chunk, union sctp_addr *src, + union sctp_addr *dest) +{ + memcpy(&chunk->source, src, sizeof(union sctp_addr)); + memcpy(&chunk->dest, dest, sizeof(union sctp_addr)); +} + +/* Extract the source address from a chunk. */ +const union sctp_addr *sctp_source(const sctp_chunk_t *chunk) +{ + /* If we have a known transport, use that. */ + if (chunk->transport) { + return &chunk->transport->ipaddr; + } else { + /* Otherwise, extract it from the IP header. */ + return &chunk->source; + } +} + +/* Create a new chunk, setting the type and flags headers from the + * arguments, reserving enough space for a 'paylen' byte payload. + */ +sctp_chunk_t *sctp_make_chunk(const struct sctp_association *asoc, + __u8 type, __u8 flags, int paylen) +{ + sctp_chunk_t *retval; + sctp_chunkhdr_t *chunk_hdr; + struct sk_buff *skb; + struct sock *sk; + + /* No need to allocate LL here, as this is only a chunk. */ + skb = alloc_skb(WORD_ROUND(sizeof(sctp_chunkhdr_t) + paylen), + GFP_ATOMIC); + if (!skb) + goto nodata; + + /* Make room for the chunk header. */ + chunk_hdr = (sctp_chunkhdr_t *)skb_put(skb, sizeof(sctp_chunkhdr_t)); + chunk_hdr->type = type; + chunk_hdr->flags = flags; + chunk_hdr->length = htons(sizeof(sctp_chunkhdr_t)); + + sk = asoc ? asoc->base.sk : NULL; + retval = sctp_chunkify(skb, asoc, sk); + if (!retval) { + kfree_skb(skb); + goto nodata; + } + + retval->chunk_hdr = chunk_hdr; + retval->chunk_end = ((__u8 *)chunk_hdr) + sizeof(sctp_chunkhdr_t); + + /* Set the skb to the belonging sock for accounting. */ + skb->sk = sk; + + return retval; + +nodata: + return NULL; +} + +/* Release the memory occupied by a chunk. */ +void sctp_free_chunk(sctp_chunk_t *chunk) +{ + /* Make sure that we are not on any list. */ + skb_unlink((struct sk_buff *) chunk); + list_del(&chunk->transmitted_list); + + /* Free the chunk skb data and the SCTP_chunk stub itself. */ + dev_kfree_skb(chunk->skb); + + kfree(chunk); + SCTP_DBG_OBJCNT_DEC(chunk); +} + + +/* Append bytes to the end of a chunk. Will panic if chunk is not big + * enough. + */ +void *sctp_addto_chunk(sctp_chunk_t *chunk, int len, const void *data) +{ + void *target; + void *padding; + int chunklen = ntohs(chunk->chunk_hdr->length); + int padlen = chunklen % 4; + + padding = skb_put(chunk->skb, padlen); + target = skb_put(chunk->skb, len); + + memset(padding, 0, padlen); + memcpy(target, data, len); + + /* Adjust the chunk length field. */ + chunk->chunk_hdr->length = htons(chunklen + padlen + len); + chunk->chunk_end = chunk->skb->tail; + + return target; +} + +/* Append bytes from user space to the end of a chunk. Will panic if + * chunk is not big enough. + * Returns a kernel err value. + */ +static int sctp_user_addto_chunk(sctp_chunk_t *chunk, int off, int len, + struct iovec *data) +{ + __u8 *target; + int err = 0; + + /* Make room in chunk for data. */ + target = skb_put(chunk->skb, len); + + /* Copy data (whole iovec) into chunk */ + if ((err = memcpy_fromiovecend(target, data, off, len))) + goto out; + + /* Adjust the chunk length field. */ + chunk->chunk_hdr->length = + htons(ntohs(chunk->chunk_hdr->length) + len); + chunk->chunk_end = chunk->skb->tail; + +out: + return err; +} + +/* A data chunk can have a maximum payload of (2^16 - 20). Break + * down any such message into smaller chunks. Opportunistically, fragment + * the chunks down to the current MTU constraints. We may get refragmented + * later if the PMTU changes, but it is _much better_ to fragment immediately + * with a reasonable guess than always doing our fragmentation on the + * soft-interrupt. + */ + + +int sctp_datachunks_from_user(struct sctp_association *asoc, + const struct sctp_sndrcvinfo *sinfo, + struct msghdr *msg, int msg_len, + struct sk_buff_head *chunks) +{ + int max, whole, i, offset, over, err; + int len, first_len; + sctp_chunk_t *chunk; + __u8 frag; + + /* What is a reasonable fragmentation point right now? */ + max = asoc->pmtu; + if (max < SCTP_MIN_PMTU) + max = SCTP_MIN_PMTU; + max -= SCTP_IP_OVERHEAD; + + /* Make sure not beyond maximum chunk size. */ + if (max > SCTP_MAX_CHUNK_LEN) + max = SCTP_MAX_CHUNK_LEN; + + /* Subtract out the overhead of a data chunk header. */ + max -= sizeof(struct sctp_data_chunk); + + whole = 0; + first_len = max; + + /* Encourage Cookie-ECHO bundling. */ + if (asoc->state < SCTP_STATE_COOKIE_ECHOED) { + whole = msg_len / (max - SCTP_ARBITRARY_COOKIE_ECHO_LEN); + + /* Account for the DATA to be bundled with the COOKIE-ECHO. */ + if (whole) { + first_len = max - SCTP_ARBITRARY_COOKIE_ECHO_LEN; + msg_len -= first_len; + whole = 1; + } + } + + /* How many full sized? How many bytes leftover? */ + whole += msg_len / max; + over = msg_len % max; + offset = 0; + + if (whole && over) + SCTP_INC_STATS_USER(SctpFragUsrMsgs); + + /* Create chunks for all the full sized DATA chunks. */ + for (i=0, len=first_len; i < whole; i++) { + frag = SCTP_DATA_MIDDLE_FRAG; + + if (0 == i) + frag |= SCTP_DATA_FIRST_FRAG; + + if ((i == (whole - 1)) && !over) + frag |= SCTP_DATA_LAST_FRAG; + + chunk = sctp_make_datafrag_empty(asoc, sinfo, len, frag, 0); + + if (!chunk) + goto nomem; + err = sctp_user_addto_chunk(chunk, offset, len, msg->msg_iov); + if (err < 0) + goto errout; + + offset += len; + + /* Put the chunk->skb back into the form expected by send. */ + __skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr + - (__u8 *)chunk->skb->data); + + __skb_queue_tail(chunks, (struct sk_buff *)chunk); + + /* The first chunk, the first chunk was likely short + * to allow bundling, so reset to full size. + */ + if (0 == i) + len = max; + } + + /* .. now the leftover bytes. */ + if (over) { + if (!whole) + frag = SCTP_DATA_NOT_FRAG; + else + frag = SCTP_DATA_LAST_FRAG; + + chunk = sctp_make_datafrag_empty(asoc, sinfo, over, frag, 0); + + if (!chunk) + goto nomem; + + err = sctp_user_addto_chunk(chunk, offset, over, msg->msg_iov); + + /* Put the chunk->skb back into the form expected by send. */ + __skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr + - (__u8 *)chunk->skb->data); + if (err < 0) + goto errout; + + __skb_queue_tail(chunks, (struct sk_buff *)chunk); + } + err = 0; + goto out; + +nomem: + err = -ENOMEM; +errout: + while ((chunk = (sctp_chunk_t *)__skb_dequeue(chunks))) + sctp_free_chunk(chunk); +out: + return err; +} + +/* Helper function to assign a TSN if needed. This assumes that both + * the data_hdr and association have already been assigned. + */ +void sctp_chunk_assign_ssn(sctp_chunk_t *chunk) +{ + __u16 ssn; + __u16 sid; + + if (chunk->has_ssn) + return; + + /* This is the last possible instant to assign a SSN. */ + if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) { + ssn = 0; + } else { + sid = htons(chunk->subh.data_hdr->stream); + if (chunk->chunk_hdr->flags & SCTP_DATA_LAST_FRAG) + ssn = sctp_ssn_next(&chunk->asoc->ssnmap->out, sid); + else + ssn = sctp_ssn_peek(&chunk->asoc->ssnmap->out, sid); + ssn = htons(ssn); + } + + chunk->subh.data_hdr->ssn = ssn; + chunk->has_ssn = 1; +} + +/* Helper function to assign a TSN if needed. This assumes that both + * the data_hdr and association have already been assigned. + */ +void sctp_chunk_assign_tsn(sctp_chunk_t *chunk) +{ + if (!chunk->has_tsn) { + /* This is the last possible instant to + * assign a TSN. + */ + chunk->subh.data_hdr->tsn = + htonl(sctp_association_get_next_tsn(chunk->asoc)); + chunk->has_tsn = 1; + } +} + +/* Create a CLOSED association to use with an incoming packet. */ +struct sctp_association *sctp_make_temp_asoc(const struct sctp_endpoint *ep, + struct sctp_chunk *chunk, int gfp) +{ + struct sctp_association *asoc; + struct sk_buff *skb; + sctp_scope_t scope; + + /* Create the bare association. */ + scope = sctp_scope(sctp_source(chunk)); + asoc = sctp_association_new(ep, ep->base.sk, scope, gfp); + if (!asoc) + goto nodata; + asoc->temp = 1; + skb = chunk->skb; + /* Create an entry for the source address of the packet. */ + /* FIXME: Use the af specific helpers. */ + switch (skb->nh.iph->version) { + case 4: + asoc->c.peer_addr.v4.sin_family = AF_INET; + asoc->c.peer_addr.v4.sin_port = ntohs(chunk->sctp_hdr->source); + asoc->c.peer_addr.v4.sin_addr.s_addr = skb->nh.iph->saddr; + break; + + case 6: + asoc->c.peer_addr.v6.sin6_family = AF_INET6; + asoc->c.peer_addr.v6.sin6_port + = ntohs(chunk->sctp_hdr->source); + asoc->c.peer_addr.v6.sin6_flowinfo = 0; /* BUG BUG BUG */ + asoc->c.peer_addr.v6.sin6_addr = skb->nh.ipv6h->saddr; + asoc->c.peer_addr.v6.sin6_scope_id = + ((struct inet6_skb_parm *)skb->cb)->iif; + break; + + default: + /* Yikes! I never heard of this kind of address. */ + goto fail; + }; + +nodata: + return asoc; + +fail: + sctp_association_free(asoc); + return NULL; +} + +/* Build a cookie representing asoc. + * This INCLUDES the param header needed to put the cookie in the INIT ACK. + */ +sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_chunk_t *init_chunk, + int *cookie_len, + const __u8 *raw_addrs, int addrs_len) +{ + sctp_cookie_param_t *retval; + sctp_signed_cookie_t *cookie; + struct scatterlist sg; + int headersize, bodysize; + unsigned int keylen; + char *key; + + headersize = sizeof(sctp_paramhdr_t) + SCTP_SECRET_SIZE; + bodysize = sizeof(sctp_cookie_t) + + ntohs(init_chunk->chunk_hdr->length) + addrs_len; + + /* Pad out the cookie to a multiple to make the signature + * functions simpler to write. + */ + if (bodysize % SCTP_COOKIE_MULTIPLE) + bodysize += SCTP_COOKIE_MULTIPLE + - (bodysize % SCTP_COOKIE_MULTIPLE); + *cookie_len = headersize + bodysize; + + retval = (sctp_cookie_param_t *)kmalloc(*cookie_len, GFP_ATOMIC); + + if (!retval) { + *cookie_len = 0; + goto nodata; + } + + /* Clear this memory since we are sending this data structure + * out on the network. + */ + memset(retval, 0x00, *cookie_len); + cookie = (sctp_signed_cookie_t *) retval->body; + + /* Set up the parameter header. */ + retval->p.type = SCTP_PARAM_STATE_COOKIE; + retval->p.length = htons(*cookie_len); + + /* Copy the cookie part of the association itself. */ + cookie->c = asoc->c; + + /* Save the raw address list length in the cookie. */ + cookie->c.raw_addr_list_len = addrs_len; + + /* Set an expiration time for the cookie. */ + do_gettimeofday(&cookie->c.expiration); + tv_add(&asoc->cookie_life, &cookie->c.expiration); + + /* Copy the peer's init packet. */ + memcpy(&cookie->c.peer_init[0], init_chunk->chunk_hdr, + ntohs(init_chunk->chunk_hdr->length)); + + /* Copy the raw local address list of the association. */ + memcpy((__u8 *)&cookie->c.peer_init[0] + + ntohs(init_chunk->chunk_hdr->length), raw_addrs, addrs_len); + + if (sctp_sk(ep->base.sk)->hmac) { + /* Sign the message. */ + sg.page = virt_to_page(&cookie->c); + sg.offset = (unsigned long)(&cookie->c) % PAGE_SIZE; + sg.length = bodysize; + keylen = SCTP_SECRET_SIZE; + key = (char *)ep->secret_key[ep->current_key]; + + sctp_crypto_hmac(sctp_sk(ep->base.sk)->hmac, key, &keylen, + &sg, 1, cookie->signature); + } else + sctp_hash_digest(ep->secret_key[ep->current_key], + SCTP_SECRET_SIZE, (__u8 *) &cookie->c, + bodysize, cookie->signature); + +nodata: + return retval; +} + +/* Unpack the cookie from COOKIE ECHO chunk, recreating the association. */ +struct sctp_association *sctp_unpack_cookie( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + sctp_chunk_t *chunk, int gfp, + int *error, sctp_chunk_t **errp) +{ + struct sctp_association *retval = NULL; + sctp_signed_cookie_t *cookie; + sctp_cookie_t *bear_cookie; + int headersize, bodysize, fixed_size; + __u8 digest[SCTP_SIGNATURE_SIZE]; + int secret; + struct scatterlist sg; + unsigned int keylen; + char *key; + sctp_scope_t scope; + struct sk_buff *skb = chunk->skb; + + headersize = sizeof(sctp_chunkhdr_t) + SCTP_SECRET_SIZE; + bodysize = ntohs(chunk->chunk_hdr->length) - headersize; + fixed_size = headersize + sizeof(sctp_cookie_t); + + /* Verify that the chunk looks like it even has a cookie. + * There must be enough room for our cookie and our peer's + * INIT chunk. + */ + if (ntohs(chunk->chunk_hdr->length) < + (fixed_size + sizeof(sctp_chunkhdr_t))) + goto malformed; + + /* Verify that the cookie has been padded out. */ + if (bodysize % SCTP_COOKIE_MULTIPLE) + goto malformed; + + /* Process the cookie. */ + cookie = chunk->subh.cookie_hdr; + bear_cookie = &cookie->c; + + if (!sctp_sk(ep->base.sk)->hmac) { + secret = ep->current_key; + sctp_hash_digest(ep->secret_key[secret], SCTP_SECRET_SIZE, + (__u8 *) bear_cookie, bodysize, digest); + + if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) { + /* Try the previous key. */ + secret = ep->last_key; + sctp_hash_digest(ep->secret_key[secret], + SCTP_SECRET_SIZE, (__u8 *) bear_cookie, + bodysize, digest); + + if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) { + /* Yikes! Still bad signature! */ + *error = -SCTP_IERROR_BAD_SIG; + goto fail; + } + + } + + goto no_hmac; + } + + /* Check the signature. */ + keylen = SCTP_SECRET_SIZE; + sg.page = virt_to_page(bear_cookie); + sg.offset = (unsigned long)(bear_cookie) % PAGE_SIZE; + sg.length = bodysize; + key = (char *)ep->secret_key[ep->current_key]; + + memset(digest, 0x00, sizeof(digest)); + sctp_crypto_hmac(sctp_sk(ep->base.sk)->hmac, key, &keylen, &sg, + 1, digest); + + if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) { + /* Try the previous key. */ + key = (char *)ep->secret_key[ep->last_key]; + memset(digest, 0x00, sizeof(digest)); + sctp_crypto_hmac(sctp_sk(ep->base.sk)->hmac, key, &keylen, + &sg, 1, digest); + + if (memcmp(digest, cookie->signature, SCTP_SIGNATURE_SIZE)) { + /* Yikes! Still bad signature! */ + *error = -SCTP_IERROR_BAD_SIG; + goto fail; + } + } + +no_hmac: + /* Check to see if the cookie is stale. If there is already + * an association, there is no need to check cookie's expiration + * for init collision case of lost COOKIE ACK. + */ + if (!asoc && tv_lt(bear_cookie->expiration, skb->stamp)) { + __u16 len; + /* + * Section 3.3.10.3 Stale Cookie Error (3) + * + * Cause of error + * --------------- + * Stale Cookie Error: Indicates the receipt of a valid State + * Cookie that has expired. + */ + len = ntohs(chunk->chunk_hdr->length); + *errp = sctp_make_op_error_space(asoc, chunk, len); + if (*errp) { + suseconds_t usecs = (skb->stamp.tv_sec - + bear_cookie->expiration.tv_sec) * 1000000L + + skb->stamp.tv_usec - + bear_cookie->expiration.tv_usec; + + usecs = htonl(usecs); + sctp_init_cause(*errp, SCTP_ERROR_STALE_COOKIE, + &usecs, sizeof(usecs)); + *error = -SCTP_IERROR_STALE_COOKIE; + } else + *error = -SCTP_IERROR_NOMEM; + + goto fail; + } + + /* Make a new base association. */ + scope = sctp_scope(sctp_source(chunk)); + retval = sctp_association_new(ep, ep->base.sk, scope, gfp); + if (!retval) { + *error = -SCTP_IERROR_NOMEM; + goto fail; + } + + /* Set up our peer's port number. */ + retval->peer.port = ntohs(chunk->sctp_hdr->source); + + /* Populate the association from the cookie. */ + retval->c = *bear_cookie; + + if (sctp_assoc_set_bind_addr_from_cookie(retval, bear_cookie, + GFP_ATOMIC) < 0) { + *error = -SCTP_IERROR_NOMEM; + goto fail; + } + + /* Also, add the destination address. */ + if (list_empty(&retval->base.bind_addr.address_list)) { + sctp_add_bind_addr(&retval->base.bind_addr, &chunk->dest, + GFP_ATOMIC); + } + + retval->next_tsn = retval->c.initial_tsn; + retval->ctsn_ack_point = retval->next_tsn - 1; + + /* The INIT stuff will be done by the side effects. */ + return retval; + +fail: + if (retval) + sctp_association_free(retval); + + return NULL; + +malformed: + /* Yikes! The packet is either corrupt or deliberately + * malformed. + */ + *error = -SCTP_IERROR_MALFORMED; + goto fail; +} + +/******************************************************************** + * 3rd Level Abstractions + ********************************************************************/ + +struct __sctp_missing { + __u32 num_missing; + __u16 type; +} __attribute__((packed));; + +/* + * Report a missing mandatory parameter. + */ +static int sctp_process_missing_param(const struct sctp_association *asoc, + sctp_param_t paramtype, + sctp_chunk_t *chunk, + sctp_chunk_t **errp) +{ + struct __sctp_missing report; + __u16 len; + + len = WORD_ROUND(sizeof(report)); + + /* Make an ERROR chunk, preparing enough room for + * returning multiple unknown parameters. + */ + if (!*errp) + *errp = sctp_make_op_error_space(asoc, chunk, len); + + if (*errp) { + report.num_missing = htonl(1); + report.type = paramtype; + sctp_init_cause(*errp, SCTP_ERROR_INV_PARAM, + &report, sizeof(report)); + } + + /* Stop processing this chunk. */ + return 0; +} + +/* Report an Invalid Mandatory Parameter. */ +static int sctp_process_inv_mandatory(const struct sctp_association *asoc, + sctp_chunk_t *chunk, + sctp_chunk_t **errp) +{ + /* Invalid Mandatory Parameter Error has no payload. */ + + if (!*errp) + *errp = sctp_make_op_error_space(asoc, chunk, 0); + + if (*errp) + sctp_init_cause(*errp, SCTP_ERROR_INV_PARAM, NULL, 0); + + /* Stop processing this chunk. */ + return 0; +} + +/* Do not attempt to handle the HOST_NAME parm. However, do + * send back an indicator to the peer. + */ +static int sctp_process_hn_param(const struct sctp_association *asoc, + union sctp_params param, + sctp_chunk_t *chunk, + sctp_chunk_t **errp) +{ + __u16 len = ntohs(param.p->length); + + /* Make an ERROR chunk. */ + if (!*errp) + *errp = sctp_make_op_error_space(asoc, chunk, len); + + if (*errp) + sctp_init_cause(*errp, SCTP_ERROR_DNS_FAILED, + param.v, len); + + /* Stop processing this chunk. */ + return 0; +} + +/* RFC 3.2.1 & the Implementers Guide 2.2. + * + * The Parameter Types are encoded such that the + * highest-order two bits specify the action that must be + * taken if the processing endpoint does not recognize the + * Parameter Type. + * + * 00 - Stop processing this SCTP chunk and discard it, + * do not process any further chunks within it. + * + * 01 - Stop processing this SCTP chunk and discard it, + * do not process any further chunks within it, and report + * the unrecognized parameter in an 'Unrecognized + * Parameter Type' (in either an ERROR or in the INIT ACK). + * + * 10 - Skip this parameter and continue processing. + * + * 11 - Skip this parameter and continue processing but + * report the unrecognized parameter in an + * 'Unrecognized Parameter Type' (in either an ERROR or in + * the INIT ACK). + * + * Return value: + * 0 - discard the chunk + * 1 - continue with the chunk + */ +static int sctp_process_unk_param(const struct sctp_association *asoc, + union sctp_params param, + sctp_chunk_t *chunk, + sctp_chunk_t **errp) +{ + int retval = 1; + + switch (param.p->type & SCTP_PARAM_ACTION_MASK) { + case SCTP_PARAM_ACTION_DISCARD: + retval = 0; + break; + case SCTP_PARAM_ACTION_DISCARD_ERR: + retval = 0; + /* Make an ERROR chunk, preparing enough room for + * returning multiple unknown parameters. + */ + if (NULL == *errp) + *errp = sctp_make_op_error_space(asoc, chunk, + ntohs(chunk->chunk_hdr->length)); + + if (*errp) + sctp_init_cause(*errp, SCTP_ERROR_UNKNOWN_PARAM, + param.v, + WORD_ROUND(ntohs(param.p->length))); + + break; + case SCTP_PARAM_ACTION_SKIP: + break; + case SCTP_PARAM_ACTION_SKIP_ERR: + /* Make an ERROR chunk, preparing enough room for + * returning multiple unknown parameters. + */ + if (NULL == *errp) + *errp = sctp_make_op_error_space(asoc, chunk, + ntohs(chunk->chunk_hdr->length)); + + if (*errp) { + sctp_init_cause(*errp, SCTP_ERROR_UNKNOWN_PARAM, + param.v, + WORD_ROUND(ntohs(param.p->length))); + } else { + /* If there is no memory for generating the ERROR + * report as specified, an ABORT will be triggered + * to the peer and the association won't be + * established. + */ + retval = 0; + } + + break; + default: + break; + } + + return retval; +} + +/* Find unrecognized parameters in the chunk. + * Return values: + * 0 - discard the chunk + * 1 - continue with the chunk + */ +static int sctp_verify_param(const struct sctp_association *asoc, + union sctp_params param, + sctp_cid_t cid, + sctp_chunk_t *chunk, + sctp_chunk_t **err_chunk) +{ + int retval = 1; + + /* FIXME - This routine is not looking at each parameter per the + * chunk type, i.e., unrecognized parameters should be further + * identified based on the chunk id. + */ + + switch (param.p->type) { + case SCTP_PARAM_IPV4_ADDRESS: + case SCTP_PARAM_IPV6_ADDRESS: + case SCTP_PARAM_COOKIE_PRESERVATIVE: + case SCTP_PARAM_SUPPORTED_ADDRESS_TYPES: + case SCTP_PARAM_STATE_COOKIE: + case SCTP_PARAM_HEARTBEAT_INFO: + case SCTP_PARAM_UNRECOGNIZED_PARAMETERS: + case SCTP_PARAM_ECN_CAPABLE: + break; + + case SCTP_PARAM_HOST_NAME_ADDRESS: + /* Tell the peer, we won't support this param. */ + return sctp_process_hn_param(asoc, param, chunk, err_chunk); + default: + SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n", + ntohs(param.p->type), cid); + return sctp_process_unk_param(asoc, param, chunk, err_chunk); + + break; + } + return retval; +} + +/* Verify the INIT packet before we process it. */ +int sctp_verify_init(const struct sctp_association *asoc, + sctp_cid_t cid, + sctp_init_chunk_t *peer_init, + sctp_chunk_t *chunk, + sctp_chunk_t **errp) +{ + union sctp_params param; + int has_cookie = 0; + + /* Verify stream values are non-zero. */ + if ((0 == peer_init->init_hdr.num_outbound_streams) || + (0 == peer_init->init_hdr.num_inbound_streams)) { + + sctp_process_inv_mandatory(asoc, chunk, errp); + return 0; + } + + /* Check for missing mandatory parameters. */ + sctp_walk_params(param, peer_init, init_hdr.params) { + + if (SCTP_PARAM_STATE_COOKIE == param.p->type) + has_cookie = 1; + + } /* for (loop through all parameters) */ + + /* The only missing mandatory param possible today is + * the state cookie for an INIT-ACK chunk. + */ + if ((SCTP_CID_INIT_ACK == cid) && !has_cookie) { + sctp_process_missing_param(asoc, SCTP_PARAM_STATE_COOKIE, + chunk, errp); + return 0; + } + + /* Find unrecognized parameters. */ + + sctp_walk_params(param, peer_init, init_hdr.params) { + + if (!sctp_verify_param(asoc, param, cid, chunk, errp)) + return 0; + + } /* for (loop through all parameters) */ + + return 1; +} + +/* Unpack the parameters in an INIT packet into an association. + * Returns 0 on failure, else success. + * FIXME: This is an association method. + */ +int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid, + const union sctp_addr *peer_addr, + sctp_init_chunk_t *peer_init, int gfp) +{ + union sctp_params param; + struct sctp_transport *transport; + struct list_head *pos, *temp; + char *cookie; + + /* We must include the address that the INIT packet came from. + * This is the only address that matters for an INIT packet. + * When processing a COOKIE ECHO, we retrieve the from address + * of the INIT from the cookie. + */ + + /* This implementation defaults to making the first transport + * added as the primary transport. The source address seems to + * be a a better choice than any of the embedded addresses. + */ + if (peer_addr) + if(!sctp_assoc_add_peer(asoc, peer_addr, gfp)) + goto nomem; + + /* Process the initialization parameters. */ + + sctp_walk_params(param, peer_init, init_hdr.params) { + + if (!sctp_process_param(asoc, param, peer_addr, gfp)) + goto clean_up; + } + + /* The fixed INIT headers are always in network byte + * order. + */ + asoc->peer.i.init_tag = + ntohl(peer_init->init_hdr.init_tag); + asoc->peer.i.a_rwnd = + ntohl(peer_init->init_hdr.a_rwnd); + asoc->peer.i.num_outbound_streams = + ntohs(peer_init->init_hdr.num_outbound_streams); + asoc->peer.i.num_inbound_streams = + ntohs(peer_init->init_hdr.num_inbound_streams); + asoc->peer.i.initial_tsn = + ntohl(peer_init->init_hdr.initial_tsn); + + /* Apply the upper bounds for output streams based on peer's + * number of inbound streams. + */ + if (asoc->c.sinit_num_ostreams > + ntohs(peer_init->init_hdr.num_inbound_streams)) { + asoc->c.sinit_num_ostreams = + ntohs(peer_init->init_hdr.num_inbound_streams); + } + + if (asoc->c.sinit_max_instreams > + ntohs(peer_init->init_hdr.num_outbound_streams)) { + asoc->c.sinit_max_instreams = + ntohs(peer_init->init_hdr.num_outbound_streams); + } + + /* Copy Initiation tag from INIT to VT_peer in cookie. */ + asoc->c.peer_vtag = asoc->peer.i.init_tag; + + /* Peer Rwnd : Current calculated value of the peer's rwnd. */ + asoc->peer.rwnd = asoc->peer.i.a_rwnd; + + /* Copy cookie in case we need to resend COOKIE-ECHO. */ + cookie = asoc->peer.cookie; + if (cookie) { + asoc->peer.cookie = kmalloc(asoc->peer.cookie_len, gfp); + if (!asoc->peer.cookie) + goto clean_up; + memcpy(asoc->peer.cookie, cookie, asoc->peer.cookie_len); + } + + /* RFC 2960 7.2.1 The initial value of ssthresh MAY be arbitrarily + * high (for example, implementations MAY use the size of the receiver + * advertised window). + */ + list_for_each(pos, &asoc->peer.transport_addr_list) { + transport = list_entry(pos, struct sctp_transport, transports); + transport->ssthresh = asoc->peer.i.a_rwnd; + } + + /* Set up the TSN tracking pieces. */ + sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_SIZE, + asoc->peer.i.initial_tsn); + + /* RFC 2960 6.5 Stream Identifier and Stream Sequence Number + * + * The stream sequence number in all the streams shall start + * from 0 when the association is established. Also, when the + * stream sequence number reaches the value 65535 the next + * stream sequence number shall be set to 0. + */ + + /* Allocate storage for the negotiated streams. */ + asoc->ssnmap = sctp_ssnmap_new(asoc->peer.i.num_outbound_streams, + asoc->c.sinit_num_ostreams, gfp); + if (!asoc->ssnmap) + goto nomem_ssnmap; + + /* ADDIP Section 4.1 ASCONF Chunk Procedures + * + * When an endpoint has an ASCONF signaled change to be sent to the + * remote endpoint it should do the following: + * ... + * A2) A serial number should be assigned to the Chunk. The serial + * number should be a monotonically increasing number. All serial + * numbers are defined to be initialized at the start of the + * association to the same value as the Initial TSN. + */ + asoc->peer.addip_serial = asoc->peer.i.initial_tsn - 1; + return 1; + +nomem_ssnmap: +clean_up: + /* Release the transport structures. */ + list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { + transport = list_entry(pos, struct sctp_transport, transports); + list_del(pos); + sctp_transport_free(transport); + } +nomem: + return 0; +} + + +/* Update asoc with the option described in param. + * + * RFC2960 3.3.2.1 Optional/Variable Length Parameters in INIT + * + * asoc is the association to update. + * param is the variable length parameter to use for update. + * cid tells us if this is an INIT, INIT ACK or COOKIE ECHO. + * If the current packet is an INIT we want to minimize the amount of + * work we do. In particular, we should not build transport + * structures for the addresses. + */ +int sctp_process_param(struct sctp_association *asoc, union sctp_params param, + const union sctp_addr *peer_addr, int gfp) +{ + union sctp_addr addr; + int i; + __u16 sat; + int retval = 1; + sctp_scope_t scope; + time_t stale; + + /* We maintain all INIT parameters in network byte order all the + * time. This allows us to not worry about whether the parameters + * came from a fresh INIT, and INIT ACK, or were stored in a cookie. + */ + switch (param.p->type) { + case SCTP_PARAM_IPV6_ADDRESS: + if( PF_INET6 != asoc->base.sk->family) + break; + /* Fall through. */ + case SCTP_PARAM_IPV4_ADDRESS: + sctp_param2sockaddr(&addr, param.addr, asoc->peer.port, 0); + scope = sctp_scope(peer_addr); + if (sctp_in_scope(&addr, scope)) + if (!sctp_assoc_add_peer(asoc, &addr, gfp)) + return 0; + break; + + case SCTP_PARAM_COOKIE_PRESERVATIVE: + if (!sctp_proto.cookie_preserve_enable) + break; + + stale = ntohl(param.life->lifespan_increment); + + /* Suggested Cookie Life span increment's unit is msec, + * (1/1000sec). + */ + asoc->cookie_life.tv_sec += stale / 1000; + asoc->cookie_life.tv_usec += (stale % 1000) * 1000; + break; + + case SCTP_PARAM_HOST_NAME_ADDRESS: + SCTP_DEBUG_PRINTK("unimplemented SCTP_HOST_NAME_ADDRESS\n"); + break; + + case SCTP_PARAM_SUPPORTED_ADDRESS_TYPES: + /* Turn off the default values first so we'll know which + * ones are really set by the peer. + */ + asoc->peer.ipv4_address = 0; + asoc->peer.ipv6_address = 0; + + /* Cycle through address types; avoid divide by 0. */ + sat = ntohs(param.p->length) - sizeof(sctp_paramhdr_t); + if (sat) + sat /= sizeof(__u16); + + for (i = 0; i < sat; ++i) { + switch (param.sat->types[i]) { + case SCTP_PARAM_IPV4_ADDRESS: + asoc->peer.ipv4_address = 1; + break; + + case SCTP_PARAM_IPV6_ADDRESS: + asoc->peer.ipv6_address = 1; + break; + + case SCTP_PARAM_HOST_NAME_ADDRESS: + asoc->peer.hostname_address = 1; + break; + + default: /* Just ignore anything else. */ + break; + }; + } + break; + + case SCTP_PARAM_STATE_COOKIE: + asoc->peer.cookie_len = + ntohs(param.p->length) - sizeof(sctp_paramhdr_t); + asoc->peer.cookie = param.cookie->body; + break; + + case SCTP_PARAM_HEARTBEAT_INFO: + /* Would be odd to receive, but it causes no problems. */ + break; + + case SCTP_PARAM_UNRECOGNIZED_PARAMETERS: + /* Rejected during verify stage. */ + break; + + case SCTP_PARAM_ECN_CAPABLE: + asoc->peer.ecn_capable = 1; + break; + + default: + /* Any unrecognized parameters should have been caught + * and handled by sctp_verify_param() which should be + * called prior to this routine. Simply log the error + * here. + */ + SCTP_DEBUG_PRINTK("Ignoring param: %d for association %p.\n", + ntohs(param.p->type), asoc); + break; + }; + + return retval; +} + +/* Select a new verification tag. */ +__u32 sctp_generate_tag(const struct sctp_endpoint *ep) +{ + /* I believe that this random number generator complies with RFC1750. + * A tag of 0 is reserved for special cases (e.g. INIT). + */ + __u32 x; + + do { + get_random_bytes(&x, sizeof(__u32)); + } while (x == 0); + + return x; +} + +/* Select an initial TSN to send during startup. */ +__u32 sctp_generate_tsn(const struct sctp_endpoint *ep) +{ + __u32 retval; + + get_random_bytes(&retval, sizeof(__u32)); + return retval; +} + +/******************************************************************** + * 4th Level Abstractions + ********************************************************************/ + +/* Convert from an SCTP IP parameter to a union sctp_addr. */ +void sctp_param2sockaddr(union sctp_addr *addr, sctp_addr_param_t *param, + __u16 port, int iif) +{ + switch(param->v4.param_hdr.type) { + case SCTP_PARAM_IPV4_ADDRESS: + addr->v4.sin_family = AF_INET; + addr->v4.sin_port = port; + addr->v4.sin_addr.s_addr = param->v4.addr.s_addr; + break; + + case SCTP_PARAM_IPV6_ADDRESS: + addr->v6.sin6_family = AF_INET6; + addr->v6.sin6_port = port; + addr->v6.sin6_flowinfo = 0; /* BUG */ + addr->v6.sin6_addr = param->v6.addr; + addr->v6.sin6_scope_id = iif; + break; + + default: + SCTP_DEBUG_PRINTK("Illegal address type %d\n", + ntohs(param->v4.param_hdr.type)); + break; + }; +} + +/* Convert an IP address in an SCTP param into a sockaddr_in. */ +/* Returns true if a valid conversion was possible. */ +int sctp_addr2sockaddr(union sctp_params p, union sctp_addr *sa) +{ + switch (p.p->type) { + case SCTP_PARAM_IPV4_ADDRESS: + sa->v4.sin_addr = *((struct in_addr *)&p.v4->addr); + sa->v4.sin_family = AF_INET; + break; + + case SCTP_PARAM_IPV6_ADDRESS: + *((struct in6_addr *)&sa->v4.sin_addr) + = p.v6->addr; + sa->v4.sin_family = AF_INET6; + break; + + default: + return 0; + }; + + return 1; +} + +/* Convert a sockaddr_in to an IP address in an SCTP param. + * Returns len if a valid conversion was possible. + */ +int sockaddr2sctp_addr(const union sctp_addr *sa, sctp_addr_param_t *p) +{ + int len = 0; + + switch (sa->v4.sin_family) { + case AF_INET: + p->v4.param_hdr.type = SCTP_PARAM_IPV4_ADDRESS; + p->v4.param_hdr.length = ntohs(sizeof(sctp_ipv4addr_param_t)); + len = sizeof(sctp_ipv4addr_param_t); + p->v4.addr.s_addr = sa->v4.sin_addr.s_addr; + break; + + case AF_INET6: + p->v6.param_hdr.type = SCTP_PARAM_IPV6_ADDRESS; + p->v6.param_hdr.length = ntohs(sizeof(sctp_ipv6addr_param_t)); + len = sizeof(sctp_ipv6addr_param_t); + p->v6.addr = *(&sa->v6.sin6_addr); + break; + + default: + printk(KERN_WARNING "sockaddr2sctp_addr: Illegal family %d.\n", + sa->v4.sin_family); + return 0; + }; + + return len; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/sm_sideeffect.c linux-2.4.23-pre8/net/sctp/sm_sideeffect.c --- linux-2.4.22/net/sctp/sm_sideeffect.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/sm_sideeffect.c 2003-10-22 22:49:06.000000000 +0000 @@ -0,0 +1,1185 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2002 International Business Machines Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions work with the state functions in sctp_sm_statefuns.c + * to implement that state operations. These functions implement the + * steps which require modifying existing data structures. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Hui Huang + * Dajiang Zhang + * Daisy Chang + * Sridhar Samudrala + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include +#include + +/******************************************************************** + * Helper functions + ********************************************************************/ + +/* A helper function for delayed processing of INET ECN CE bit. */ +static void sctp_do_ecn_ce_work(struct sctp_association *asoc, + __u32 lowest_tsn) +{ + /* Save the TSN away for comparison when we receive CWR */ + + asoc->last_ecne_tsn = lowest_tsn; + asoc->need_ecne = 1; +} + +/* Helper function for delayed processing of SCTP ECNE chunk. */ +/* RFC 2960 Appendix A + * + * RFC 2481 details a specific bit for a sender to send in + * the header of its next outbound TCP segment to indicate to + * its peer that it has reduced its congestion window. This + * is termed the CWR bit. For SCTP the same indication is made + * by including the CWR chunk. This chunk contains one data + * element, i.e. the TSN number that was sent in the ECNE chunk. + * This element represents the lowest TSN number in the datagram + * that was originally marked with the CE bit. + */ +static sctp_chunk_t *sctp_do_ecn_ecne_work(struct sctp_association *asoc, + __u32 lowest_tsn, + sctp_chunk_t *chunk) +{ + sctp_chunk_t *repl; + + /* Our previously transmitted packet ran into some congestion + * so we should take action by reducing cwnd and ssthresh + * and then ACK our peer that we we've done so by + * sending a CWR. + */ + + /* First, try to determine if we want to actually lower + * our cwnd variables. Only lower them if the ECNE looks more + * recent than the last response. + */ + if (TSN_lt(asoc->last_cwr_tsn, lowest_tsn)) { + struct sctp_transport *transport; + + /* Find which transport's congestion variables + * need to be adjusted. + */ + transport = sctp_assoc_lookup_tsn(asoc, lowest_tsn); + + /* Update the congestion variables. */ + if (transport) + sctp_transport_lower_cwnd(transport, + SCTP_LOWER_CWND_ECNE); + asoc->last_cwr_tsn = lowest_tsn; + } + + /* Always try to quiet the other end. In case of lost CWR, + * resend last_cwr_tsn. + */ + repl = sctp_make_cwr(asoc, asoc->last_cwr_tsn, chunk); + + /* If we run out of memory, it will look like a lost CWR. We'll + * get back in sync eventually. + */ + return repl; +} + +/* Helper function to do delayed processing of ECN CWR chunk. */ +static void sctp_do_ecn_cwr_work(struct sctp_association *asoc, + __u32 lowest_tsn) +{ + /* Turn off ECNE getting auto-prepended to every outgoing + * packet + */ + asoc->need_ecne = 0; +} + +/* Generate SACK if necessary. We call this at the end of a packet. */ +int sctp_gen_sack(struct sctp_association *asoc, int force, + sctp_cmd_seq_t *commands) +{ + __u32 ctsn, max_tsn_seen; + struct sctp_chunk *sack; + int error = 0; + + if (force) + asoc->peer.sack_needed = 1; + + ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map); + max_tsn_seen = sctp_tsnmap_get_max_tsn_seen(&asoc->peer.tsn_map); + + /* From 12.2 Parameters necessary per association (i.e. the TCB): + * + * Ack State : This flag indicates if the next received packet + * : is to be responded to with a SACK. ... + * : When DATA chunks are out of order, SACK's + * : are not delayed (see Section 6). + * + * [This is actually not mentioned in Section 6, but we + * implement it here anyway. --piggy] + */ + if (max_tsn_seen != ctsn) + asoc->peer.sack_needed = 1; + + /* From 6.2 Acknowledgement on Reception of DATA Chunks: + * + * Section 4.2 of [RFC2581] SHOULD be followed. Specifically, + * an acknowledgement SHOULD be generated for at least every + * second packet (not every second DATA chunk) received, and + * SHOULD be generated within 200 ms of the arrival of any + * unacknowledged DATA chunk. ... + */ + if (!asoc->peer.sack_needed) { + /* We will need a SACK for the next packet. */ + asoc->peer.sack_needed = 1; + goto out; + } else { + if (asoc->a_rwnd > asoc->rwnd) + asoc->a_rwnd = asoc->rwnd; + sack = sctp_make_sack(asoc); + if (!sack) + goto nomem; + + asoc->peer.sack_needed = 0; + + error = sctp_outq_tail(&asoc->outqueue, sack); + + /* Stop the SACK timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_SACK)); + } +out: + return error; +nomem: + error = -ENOMEM; + return error; +} + +/* When the T3-RTX timer expires, it calls this function to create the + * relevant state machine event. + */ +void sctp_generate_t3_rtx_event(unsigned long peer) +{ + int error; + struct sctp_transport *transport = (struct sctp_transport *) peer; + struct sctp_association *asoc = transport->asoc; + + /* Check whether a task is in the sock. */ + + sctp_bh_lock_sock(asoc->base.sk); + if (sock_owned_by_user(asoc->base.sk)) { + SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __FUNCTION__); + + /* Try again later. */ + if (!mod_timer(&transport->T3_rtx_timer, jiffies + (HZ/20))) + sctp_transport_hold(transport); + goto out_unlock; + } + + /* Is this transport really dead and just waiting around for + * the timer to let go of the reference? + */ + if (transport->dead) + goto out_unlock; + + /* Run through the state machine. */ + error = sctp_do_sm(SCTP_EVENT_T_TIMEOUT, + SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_T3_RTX), + asoc->state, + asoc->ep, asoc, + transport, GFP_ATOMIC); + + if (error) + asoc->base.sk->err = -error; + +out_unlock: + sctp_bh_unlock_sock(asoc->base.sk); + sctp_transport_put(transport); +} + +/* This is a sa interface for producing timeout events. It works + * for timeouts which use the association as their parameter. + */ +static void sctp_generate_timeout_event(struct sctp_association *asoc, + sctp_event_timeout_t timeout_type) +{ + int error = 0; + + sctp_bh_lock_sock(asoc->base.sk); + if (sock_owned_by_user(asoc->base.sk)) { + SCTP_DEBUG_PRINTK("%s:Sock is busy: timer %d\n", + __FUNCTION__, + timeout_type); + + /* Try again later. */ + if (!mod_timer(&asoc->timers[timeout_type], jiffies + (HZ/20))) + sctp_association_hold(asoc); + goto out_unlock; + } + + /* Is this association really dead and just waiting around for + * the timer to let go of the reference? + */ + if (asoc->base.dead) + goto out_unlock; + + /* Run through the state machine. */ + error = sctp_do_sm(SCTP_EVENT_T_TIMEOUT, + SCTP_ST_TIMEOUT(timeout_type), + asoc->state, asoc->ep, asoc, + (void *)timeout_type, GFP_ATOMIC); + + if (error) + asoc->base.sk->err = -error; + +out_unlock: + sctp_bh_unlock_sock(asoc->base.sk); + sctp_association_put(asoc); +} + +void sctp_generate_t1_cookie_event(unsigned long data) +{ + struct sctp_association *asoc = (struct sctp_association *) data; + sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T1_COOKIE); +} + +void sctp_generate_t1_init_event(unsigned long data) +{ + struct sctp_association *asoc = (struct sctp_association *) data; + sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T1_INIT); +} + +void sctp_generate_t2_shutdown_event(unsigned long data) +{ + struct sctp_association *asoc = (struct sctp_association *) data; + sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_T2_SHUTDOWN); +} + +void sctp_generate_t5_shutdown_guard_event(unsigned long data) +{ + struct sctp_association *asoc = (struct sctp_association *)data; + sctp_generate_timeout_event(asoc, + SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD); + +} /* sctp_generate_t5_shutdown_guard_event() */ + +void sctp_generate_autoclose_event(unsigned long data) +{ + struct sctp_association *asoc = (struct sctp_association *) data; + sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_AUTOCLOSE); +} + +/* Generate a heart beat event. If the sock is busy, reschedule. Make + * sure that the transport is still valid. + */ +void sctp_generate_heartbeat_event(unsigned long data) +{ + int error = 0; + struct sctp_transport *transport = (struct sctp_transport *) data; + struct sctp_association *asoc = transport->asoc; + + sctp_bh_lock_sock(asoc->base.sk); + if (sock_owned_by_user(asoc->base.sk)) { + SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __FUNCTION__); + + /* Try again later. */ + if (!mod_timer(&transport->hb_timer, jiffies + (HZ/20))) + sctp_transport_hold(transport); + goto out_unlock; + } + + /* Is this structure just waiting around for us to actually + * get destroyed? + */ + if (transport->dead) + goto out_unlock; + + error = sctp_do_sm(SCTP_EVENT_T_TIMEOUT, + SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_HEARTBEAT), + asoc->state, asoc->ep, asoc, + transport, GFP_ATOMIC); + + if (error) + asoc->base.sk->err = -error; + +out_unlock: + sctp_bh_unlock_sock(asoc->base.sk); + sctp_transport_put(transport); +} + +/* Inject a SACK Timeout event into the state machine. */ +void sctp_generate_sack_event(unsigned long data) +{ + struct sctp_association *asoc = (struct sctp_association *) data; + sctp_generate_timeout_event(asoc, SCTP_EVENT_TIMEOUT_SACK); +} + +sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES] = { + NULL, + sctp_generate_t1_cookie_event, + sctp_generate_t1_init_event, + sctp_generate_t2_shutdown_event, + NULL, + sctp_generate_t5_shutdown_guard_event, + sctp_generate_heartbeat_event, + sctp_generate_sack_event, + sctp_generate_autoclose_event, +}; + + +/* RFC 2960 8.2 Path Failure Detection + * + * When its peer endpoint is multi-homed, an endpoint should keep a + * error counter for each of the destination transport addresses of the + * peer endpoint. + * + * Each time the T3-rtx timer expires on any address, or when a + * HEARTBEAT sent to an idle address is not acknowledged within a RTO, + * the error counter of that destination address will be incremented. + * When the value in the error counter exceeds the protocol parameter + * 'Path.Max.Retrans' of that destination address, the endpoint should + * mark the destination transport address as inactive, and a + * notification SHOULD be sent to the upper layer. + * + */ +static void sctp_do_8_2_transport_strike(struct sctp_association *asoc, + struct sctp_transport *transport) +{ + /* The check for association's overall error counter exceeding the + * threshold is done in the state function. + */ + asoc->overall_error_count++; + + if (transport->active && + (transport->error_count++ >= transport->error_threshold)) { + SCTP_DEBUG_PRINTK("transport_strike: transport " + "IP:%d.%d.%d.%d failed.\n", + NIPQUAD(transport->ipaddr.v4.sin_addr)); + sctp_assoc_control_transport(asoc, transport, + SCTP_TRANSPORT_DOWN, + SCTP_FAILED_THRESHOLD); + } + + /* E2) For the destination address for which the timer + * expires, set RTO <- RTO * 2 ("back off the timer"). The + * maximum value discussed in rule C7 above (RTO.max) may be + * used to provide an upper bound to this doubling operation. + */ + transport->rto = min((transport->rto * 2), transport->asoc->rto_max); +} + +/* Worker routine to handle INIT command failure. */ +static void sctp_cmd_init_failed(sctp_cmd_seq_t *commands, + struct sctp_association *asoc, + unsigned error) +{ + struct sctp_ulpevent *event; + + event = sctp_ulpevent_make_assoc_change(asoc,0, SCTP_CANT_STR_ASSOC, + 0, 0, 0, GFP_ATOMIC); + + if (event) + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, + SCTP_ULPEVENT(event)); + + /* SEND_FAILED sent later when cleaning up the association. */ + asoc->outqueue.error = error; + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); +} + +/* Worker routine to handle SCTP_CMD_ASSOC_FAILED. */ +static void sctp_cmd_assoc_failed(sctp_cmd_seq_t *commands, + struct sctp_association *asoc, + sctp_event_t event_type, + sctp_subtype_t subtype, + struct sctp_chunk *chunk, + unsigned error) +{ + struct sctp_ulpevent *event; + + /* Cancel any partial delivery in progress. */ + sctp_ulpq_abort_pd(&asoc->ulpq, GFP_ATOMIC); + + event = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_COMM_LOST, + (__u16)error, 0, 0, + GFP_ATOMIC); + if (event) + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, + SCTP_ULPEVENT(event)); + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + + /* SEND_FAILED sent later when cleaning up the association. */ + asoc->outqueue.error = error; + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); +} + +/* Process an init chunk (may be real INIT/INIT-ACK or an embedded INIT + * inside the cookie. In reality, this is only used for INIT-ACK processing + * since all other cases use "temporary" associations and can do all + * their work in statefuns directly. + */ +static int sctp_cmd_process_init(sctp_cmd_seq_t *commands, + struct sctp_association *asoc, + struct sctp_chunk *chunk, + sctp_init_chunk_t *peer_init, int gfp) +{ + int error; + + /* We only process the init as a sideeffect in a single + * case. This is when we process the INIT-ACK. If we + * fail during INIT processing (due to malloc problems), + * just return the error and stop processing the stack. + */ + if (!sctp_process_init(asoc, chunk->chunk_hdr->type, + sctp_source(chunk), peer_init, gfp)) + error = -ENOMEM; + else + error = 0; + + return error; +} + +/* Helper function to break out starting up of heartbeat timers. */ +static void sctp_cmd_hb_timers_start(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc) +{ + struct sctp_transport *t; + struct list_head *pos; + + /* Start a heartbeat timer for each transport on the association. + * hold a reference on the transport to make sure none of + * the needed data structures go away. + */ + list_for_each(pos, &asoc->peer.transport_addr_list) { + t = list_entry(pos, struct sctp_transport, transports); + + if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t))) + sctp_transport_hold(t); + } +} + +static void sctp_cmd_hb_timers_stop(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc) +{ + struct sctp_transport *t; + struct list_head *pos; + + /* Stop all heartbeat timers. */ + + list_for_each(pos, &asoc->peer.transport_addr_list) { + t = list_entry(pos, struct sctp_transport, transports); + if (del_timer(&t->hb_timer)) + sctp_transport_put(t); + } +} + +/* Helper function to update the heartbeat timer. */ +static void sctp_cmd_hb_timer_update(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc, + struct sctp_transport *t) +{ + /* Update the heartbeat timer. */ + if (!mod_timer(&t->hb_timer, sctp_transport_timeout(t))) + sctp_transport_hold(t); +} + +/* Helper function to handle the reception of an HEARTBEAT ACK. */ +static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc, + struct sctp_transport *t, + sctp_chunk_t *chunk) +{ + sctp_sender_hb_info_t *hbinfo; + + /* 8.3 Upon the receipt of the HEARTBEAT ACK, the sender of the + * HEARTBEAT should clear the error counter of the destination + * transport address to which the HEARTBEAT was sent. + * The association's overall error count is also cleared. + */ + t->error_count = 0; + t->asoc->overall_error_count = 0; + + /* Mark the destination transport address as active if it is not so + * marked. + */ + if (!t->active) + sctp_assoc_control_transport(asoc, t, SCTP_TRANSPORT_UP, + SCTP_HEARTBEAT_SUCCESS); + + /* The receiver of the HEARTBEAT ACK should also perform an + * RTT measurement for that destination transport address + * using the time value carried in the HEARTBEAT ACK chunk. + */ + hbinfo = (sctp_sender_hb_info_t *) chunk->skb->data; + sctp_transport_update_rto(t, (jiffies - hbinfo->sent_at)); +} + +/* Helper function to do a transport reset at the expiry of the hearbeat + * timer. + */ +static void sctp_cmd_transport_reset(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc, + struct sctp_transport *t) +{ + sctp_transport_lower_cwnd(t, SCTP_LOWER_CWND_INACTIVE); + + /* Mark one strike against a transport. */ + sctp_do_8_2_transport_strike(asoc, t); +} + +/* Helper function to process the process SACK command. */ +static int sctp_cmd_process_sack(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc, + sctp_sackhdr_t *sackh) +{ + int err; + + if (sctp_outq_sack(&asoc->outqueue, sackh)) { + /* There are no more TSNs awaiting SACK. */ + err = sctp_do_sm(SCTP_EVENT_T_OTHER, + SCTP_ST_OTHER(SCTP_EVENT_NO_PENDING_TSN), + asoc->state, asoc->ep, asoc, NULL, + GFP_ATOMIC); + } else { + /* Windows may have opened, so we need + * to check if we have DATA to transmit + */ + err = sctp_outq_flush(&asoc->outqueue, 0); + } + + return err; +} + +/* Helper function to set the timeout value for T2-SHUTDOWN timer and to set + * the transport for a shutdown chunk. + */ +static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc, + sctp_chunk_t *chunk) +{ + struct sctp_transport *t; + + t = sctp_assoc_choose_shutdown_transport(asoc); + asoc->shutdown_last_sent_to = t; + asoc->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = t->rto; + chunk->transport = t; +} + +/* Helper function to change the state of an association. */ +static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds, struct sctp_association *asoc, + sctp_state_t state) +{ + + struct sock *sk = asoc->base.sk; + struct sctp_opt *sp = sctp_sk(sk); + + asoc->state = state; + asoc->state_timestamp = jiffies; + + if (SCTP_SOCKET_TCP == sp->type) { + /* Change the sk->state of a TCP-style socket that has + * sucessfully completed a connect() call. + */ + if ((SCTP_STATE_ESTABLISHED == asoc->state) && + (SCTP_SS_CLOSED == sk->state)) + sk->state = SCTP_SS_ESTABLISHED; + + /* Set the RCV_SHUTDOWN flag when a SHUTDOWN is received. */ + if (SCTP_STATE_SHUTDOWN_RECEIVED == asoc->state) + sk->shutdown |= RCV_SHUTDOWN; + + } + + if ((SCTP_STATE_ESTABLISHED == asoc->state) || + (SCTP_STATE_CLOSED == asoc->state) || + (SCTP_STATE_SHUTDOWN_RECEIVED == asoc->state)) { + /* Wake up any processes waiting in the asoc's wait queue in + * sctp_wait_for_connect() or sctp_wait_for_sndbuf(). + */ + if (waitqueue_active(&asoc->wait)) + wake_up_interruptible(&asoc->wait); + + /* Wake up any processes waiting in the sk's sleep queue of + * a TCP-style or UDP-style peeled-off socket in + * sctp_wait_for_accept() or sctp_wait_for_packet(). + * For a UDP-style socket, the waiters are woken up by the + * notifications. + */ + if (SCTP_SOCKET_UDP != sp->type) + sk->state_change(sk); + } + +} + +/* Helper function to delete an association. */ +static void sctp_cmd_delete_tcb(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc) +{ + struct sock *sk = asoc->base.sk; + + /* If it is a non-temporary association belonging to a TCP-style + * listening socket, do not free it so that accept() can pick it + * up later. + */ + if ((SCTP_SOCKET_TCP == sctp_sk(sk)->type) && + (SCTP_SS_LISTENING == sk->state) && (!asoc->temp)) + return; + + sctp_unhash_established(asoc); + sctp_association_free(asoc); +} + +/* These three macros allow us to pull the debugging code out of the + * main flow of sctp_do_sm() to keep attention focused on the real + * functionality there. + */ +#define DEBUG_PRE \ + SCTP_DEBUG_PRINTK("sctp_do_sm prefn: " \ + "ep %p, %s, %s, asoc %p[%s], %s\n", \ + ep, sctp_evttype_tbl[event_type], \ + (*debug_fn)(subtype), asoc, \ + sctp_state_tbl[state], state_fn->name) + +#define DEBUG_POST \ + SCTP_DEBUG_PRINTK("sctp_do_sm postfn: " \ + "asoc %p, status: %s\n", \ + asoc, sctp_status_tbl[status]) + +#define DEBUG_POST_SFX \ + SCTP_DEBUG_PRINTK("sctp_do_sm post sfx: error %d, asoc %p[%s]\n", \ + error, asoc, \ + sctp_state_tbl[(asoc && sctp_id2assoc(ep->base.sk, \ + sctp_assoc2id(asoc)))?asoc->state:SCTP_STATE_CLOSED]) + +/* + * This is the master state machine processing function. + * + * If you want to understand all of lksctp, this is a + * good place to start. + */ +int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *ep, + struct sctp_association *asoc, + void *event_arg, + int gfp) +{ + sctp_cmd_seq_t commands; + sctp_sm_table_entry_t *state_fn; + sctp_disposition_t status; + int error = 0; + typedef const char *(printfn_t)(sctp_subtype_t); + + static printfn_t *table[] = { + NULL, sctp_cname, sctp_tname, sctp_oname, sctp_pname, + }; + printfn_t *debug_fn __attribute__ ((unused)) = table[event_type]; + + /* Look up the state function, run it, and then process the + * side effects. These three steps are the heart of lksctp. + */ + state_fn = sctp_sm_lookup_event(event_type, state, subtype); + + sctp_init_cmd_seq(&commands); + + DEBUG_PRE; + status = (*state_fn->fn)(ep, asoc, subtype, event_arg, &commands); + DEBUG_POST; + + error = sctp_side_effects(event_type, subtype, state, + ep, asoc, event_arg, status, + &commands, gfp); + DEBUG_POST_SFX; + + return error; +} + +#undef DEBUG_PRE +#undef DEBUG_POST + +/***************************************************************** + * This the master state function side effect processing function. + *****************************************************************/ +int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, + sctp_state_t state, + struct sctp_endpoint *ep, + struct sctp_association *asoc, + void *event_arg, + sctp_disposition_t status, + sctp_cmd_seq_t *commands, + int gfp) +{ + int error; + + /* FIXME - Most of the dispositions left today would be categorized + * as "exceptional" dispositions. For those dispositions, it + * may not be proper to run through any of the commands at all. + * For example, the command interpreter might be run only with + * disposition SCTP_DISPOSITION_CONSUME. + */ + if (0 != (error = sctp_cmd_interpreter(event_type, subtype, state, + ep, asoc, + event_arg, status, + commands, gfp))) + goto bail; + + switch (status) { + case SCTP_DISPOSITION_DISCARD: + SCTP_DEBUG_PRINTK("Ignored sctp protocol event - state %d, " + "event_type %d, event_id %d\n", + state, event_type, subtype.chunk); + break; + + case SCTP_DISPOSITION_NOMEM: + /* We ran out of memory, so we need to discard this + * packet. + */ + /* BUG--we should now recover some memory, probably by + * reneging... + */ + error = -ENOMEM; + break; + + case SCTP_DISPOSITION_DELETE_TCB: + /* This should now be a command. */ + break; + + case SCTP_DISPOSITION_CONSUME: + case SCTP_DISPOSITION_ABORT: + /* + * We should no longer have much work to do here as the + * real work has been done as explicit commands above. + */ + break; + + case SCTP_DISPOSITION_VIOLATION: + printk(KERN_ERR "sctp protocol violation state %d " + "chunkid %d\n", state, subtype.chunk); + break; + + case SCTP_DISPOSITION_NOT_IMPL: + printk(KERN_WARNING "sctp unimplemented feature in state %d, " + "event_type %d, event_id %d\n", + state, event_type, subtype.chunk); + break; + + case SCTP_DISPOSITION_BUG: + printk(KERN_ERR "sctp bug in state %d, " + "event_type %d, event_id %d\n", + state, event_type, subtype.chunk); + BUG(); + break; + + default: + printk(KERN_ERR "sctp impossible disposition %d " + "in state %d, event_type %d, event_id %d\n", + status, state, event_type, subtype.chunk); + BUG(); + break; + }; + +bail: + return error; +} + +/******************************************************************** + * 2nd Level Abstractions + ********************************************************************/ + +/* This is the side-effect interpreter. */ +int sctp_cmd_interpreter(sctp_event_t event_type, sctp_subtype_t subtype, + sctp_state_t state, struct sctp_endpoint *ep, + struct sctp_association *asoc, void *event_arg, + sctp_disposition_t status, sctp_cmd_seq_t *commands, + int gfp) +{ + int error = 0; + int force; + sctp_cmd_t *cmd; + sctp_chunk_t *new_obj; + sctp_chunk_t *chunk = NULL; + struct sctp_packet *packet; + struct list_head *pos; + struct timer_list *timer; + unsigned long timeout; + struct sctp_transport *t; + sctp_sackhdr_t sackh; + + if(SCTP_EVENT_T_TIMEOUT != event_type) + chunk = (sctp_chunk_t *) event_arg; + + /* Note: This whole file is a huge candidate for rework. + * For example, each command could either have its own handler, so + * the loop would look like: + * while (cmds) + * cmd->handle(x, y, z) + * --jgrimm + */ + while (NULL != (cmd = sctp_next_cmd(commands))) { + switch (cmd->verb) { + case SCTP_CMD_NOP: + /* Do nothing. */ + break; + + case SCTP_CMD_NEW_ASOC: + /* Register a new association. */ + asoc = cmd->obj.ptr; + /* Register with the endpoint. */ + sctp_endpoint_add_asoc(ep, asoc); + sctp_hash_established(asoc); + break; + + case SCTP_CMD_UPDATE_ASSOC: + sctp_assoc_update(asoc, cmd->obj.ptr); + break; + + case SCTP_CMD_PURGE_OUTQUEUE: + sctp_outq_teardown(&asoc->outqueue); + break; + + case SCTP_CMD_DELETE_TCB: + /* Delete the current association. */ + sctp_cmd_delete_tcb(commands, asoc); + asoc = NULL; + break; + + case SCTP_CMD_NEW_STATE: + /* Enter a new state. */ + sctp_cmd_new_state(commands, asoc, cmd->obj.state); + break; + + case SCTP_CMD_REPORT_TSN: + /* Record the arrival of a TSN. */ + sctp_tsnmap_mark(&asoc->peer.tsn_map, cmd->obj.u32); + break; + + case SCTP_CMD_GEN_SACK: + /* Generate a Selective ACK. + * The argument tells us whether to just count + * the packet and MAYBE generate a SACK, or + * force a SACK out. + */ + force = cmd->obj.i32; + error = sctp_gen_sack(asoc, force, commands); + break; + + case SCTP_CMD_PROCESS_SACK: + /* Process an inbound SACK. */ + error = sctp_cmd_process_sack(commands, asoc, + cmd->obj.ptr); + break; + + case SCTP_CMD_GEN_INIT_ACK: + /* Generate an INIT ACK chunk. */ + new_obj = sctp_make_init_ack(asoc, chunk, GFP_ATOMIC, + 0); + if (!new_obj) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(new_obj)); + break; + + case SCTP_CMD_PEER_INIT: + /* Process a unified INIT from the peer. + * Note: Only used during INIT-ACK processing. If + * there is an error just return to the outter + * layer which will bail. + */ + error = sctp_cmd_process_init(commands, asoc, chunk, + cmd->obj.ptr, gfp); + break; + + case SCTP_CMD_GEN_COOKIE_ECHO: + /* Generate a COOKIE ECHO chunk. */ + new_obj = sctp_make_cookie_echo(asoc, chunk); + if (!new_obj) { + if (cmd->obj.ptr) + sctp_free_chunk(cmd->obj.ptr); + goto nomem; + } + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(new_obj)); + + /* If there is an ERROR chunk to be sent along with + * the COOKIE_ECHO, send it, too. + */ + if (cmd->obj.ptr) + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(cmd->obj.ptr)); + break; + + case SCTP_CMD_GEN_SHUTDOWN: + /* Generate SHUTDOWN when in SHUTDOWN_SENT state. + * Reset error counts. + */ + asoc->overall_error_count = 0; + + /* Generate a SHUTDOWN chunk. */ + new_obj = sctp_make_shutdown(asoc); + if (!new_obj) + goto nomem; + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(new_obj)); + break; + + case SCTP_CMD_CHUNK_ULP: + /* Send a chunk to the sockets layer. */ + SCTP_DEBUG_PRINTK("sm_sideff: %s %p, %s %p.\n", + "chunk_up:", cmd->obj.ptr, + "ulpq:", &asoc->ulpq); + sctp_ulpq_tail_data(&asoc->ulpq, cmd->obj.ptr, + GFP_ATOMIC); + break; + + case SCTP_CMD_EVENT_ULP: + /* Send a notification to the sockets layer. */ + SCTP_DEBUG_PRINTK("sm_sideff: %s %p, %s %p.\n", + "event_up:",cmd->obj.ptr, + "ulpq:",&asoc->ulpq); + sctp_ulpq_tail_event(&asoc->ulpq, cmd->obj.ptr); + break; + + case SCTP_CMD_REPLY: + /* Send a chunk to our peer. */ + error = sctp_outq_tail(&asoc->outqueue, + cmd->obj.ptr); + break; + + case SCTP_CMD_SEND_PKT: + /* Send a full packet to our peer. */ + packet = cmd->obj.ptr; + sctp_packet_transmit(packet); + sctp_ootb_pkt_free(packet); + break; + + case SCTP_CMD_RETRAN: + /* Mark a transport for retransmission. */ + sctp_retransmit(&asoc->outqueue, cmd->obj.transport, + SCTP_RTXR_T3_RTX); + break; + + case SCTP_CMD_TRANSMIT: + /* Kick start transmission. */ + error = sctp_outq_flush(&asoc->outqueue, 0); + break; + + case SCTP_CMD_ECN_CE: + /* Do delayed CE processing. */ + sctp_do_ecn_ce_work(asoc, cmd->obj.u32); + break; + + case SCTP_CMD_ECN_ECNE: + /* Do delayed ECNE processing. */ + new_obj = sctp_do_ecn_ecne_work(asoc, cmd->obj.u32, + chunk); + if (new_obj) + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(new_obj)); + break; + + case SCTP_CMD_ECN_CWR: + /* Do delayed CWR processing. */ + sctp_do_ecn_cwr_work(asoc, cmd->obj.u32); + break; + + case SCTP_CMD_SETUP_T2: + sctp_cmd_setup_t2(commands, asoc, cmd->obj.ptr); + break; + + case SCTP_CMD_TIMER_START: + timer = &asoc->timers[cmd->obj.to]; + timeout = asoc->timeouts[cmd->obj.to]; + if (!timeout) + BUG(); + + timer->expires = jiffies + timeout; + sctp_association_hold(asoc); + add_timer(timer); + break; + + case SCTP_CMD_TIMER_RESTART: + timer = &asoc->timers[cmd->obj.to]; + timeout = asoc->timeouts[cmd->obj.to]; + if (!mod_timer(timer, jiffies + timeout)) + sctp_association_hold(asoc); + break; + + case SCTP_CMD_TIMER_STOP: + timer = &asoc->timers[cmd->obj.to]; + if (timer_pending(timer) && del_timer(timer)) + sctp_association_put(asoc); + break; + + case SCTP_CMD_INIT_RESTART: + /* Do the needed accounting and updates + * associated with restarting an initialization + * timer. + */ + asoc->counters[SCTP_COUNTER_INIT_ERROR]++; + asoc->timeouts[cmd->obj.to] *= 2; + if (asoc->timeouts[cmd->obj.to] > + asoc->max_init_timeo) { + asoc->timeouts[cmd->obj.to] = + asoc->max_init_timeo; + } + + /* If we've sent any data bundled with + * COOKIE-ECHO we need to resend. + */ + list_for_each(pos, &asoc->peer.transport_addr_list) { + t = list_entry(pos, struct sctp_transport, + transports); + sctp_retransmit_mark(&asoc->outqueue, t, 0); + } + + sctp_add_cmd_sf(commands, + SCTP_CMD_TIMER_RESTART, + SCTP_TO(cmd->obj.to)); + break; + + case SCTP_CMD_INIT_FAILED: + sctp_cmd_init_failed(commands, asoc, cmd->obj.u32); + break; + + case SCTP_CMD_ASSOC_FAILED: + sctp_cmd_assoc_failed(commands, asoc, event_type, + subtype, chunk, cmd->obj.u32); + break; + + case SCTP_CMD_COUNTER_INC: + asoc->counters[cmd->obj.counter]++; + break; + + case SCTP_CMD_COUNTER_RESET: + asoc->counters[cmd->obj.counter] = 0; + break; + + case SCTP_CMD_REPORT_DUP: + sctp_tsnmap_mark_dup(&asoc->peer.tsn_map, + cmd->obj.u32); + break; + + case SCTP_CMD_REPORT_BAD_TAG: + SCTP_DEBUG_PRINTK("vtag mismatch!\n"); + break; + + case SCTP_CMD_STRIKE: + /* Mark one strike against a transport. */ + sctp_do_8_2_transport_strike(asoc, cmd->obj.transport); + break; + + case SCTP_CMD_TRANSPORT_RESET: + t = cmd->obj.transport; + sctp_cmd_transport_reset(commands, asoc, t); + break; + + case SCTP_CMD_TRANSPORT_ON: + t = cmd->obj.transport; + sctp_cmd_transport_on(commands, asoc, t, chunk); + break; + + case SCTP_CMD_HB_TIMERS_START: + sctp_cmd_hb_timers_start(commands, asoc); + break; + + case SCTP_CMD_HB_TIMER_UPDATE: + t = cmd->obj.transport; + sctp_cmd_hb_timer_update(commands, asoc, t); + break; + + case SCTP_CMD_HB_TIMERS_STOP: + sctp_cmd_hb_timers_stop(commands, asoc); + break; + + case SCTP_CMD_REPORT_ERROR: + error = cmd->obj.error; + break; + + case SCTP_CMD_PROCESS_CTSN: + /* Dummy up a SACK for processing. */ + sackh.cum_tsn_ack = cmd->obj.u32; + sackh.a_rwnd = 0; + sackh.num_gap_ack_blocks = 0; + sackh.num_dup_tsns = 0; + sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_SACK, + SCTP_SACKH(&sackh)); + break; + + case SCTP_CMD_DISCARD_PACKET: + /* We need to discard the whole packet. */ + chunk->pdiscard = 1; + break; + + case SCTP_CMD_RTO_PENDING: + t = cmd->obj.transport; + t->rto_pending = 1; + break; + + case SCTP_CMD_PART_DELIVER: + sctp_ulpq_partial_delivery(&asoc->ulpq, cmd->obj.ptr, + GFP_ATOMIC); + break; + + case SCTP_CMD_RENEGE: + sctp_ulpq_renege(&asoc->ulpq, cmd->obj.ptr, + GFP_ATOMIC); + break; + + default: + printk(KERN_WARNING "Impossible command: %u, %p\n", + cmd->verb, cmd->obj.ptr); + break; + }; + if (error) + return error; + } + + return error; + +nomem: + error = -ENOMEM; + return error; +} + diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/sm_statefuns.c linux-2.4.23-pre8/net/sctp/sm_statefuns.c --- linux-2.4.22/net/sctp/sm_statefuns.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/sm_statefuns.c 2003-10-22 22:48:42.000000000 +0000 @@ -0,0 +1,4545 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2002 International Business Machines, Corp. + * Copyright (c) 2001-2002 Intel Corp. + * Copyright (c) 2002 Nokia Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * This is part of the SCTP Linux Kernel Reference Implementation. + * + * These are the state functions for the state machine. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Mathew Kotowsky + * Sridhar Samudrala + * Jon Grimm + * Hui Huang + * Dajiang Zhang + * Daisy Chang + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/********************************************************** + * These are the state functions for handling chunk events. + **********************************************************/ + +/* + * Process the final SHUTDOWN COMPLETE. + * + * Section: 4 (C) (diagram), 9.2 + * Upon reception of the SHUTDOWN COMPLETE chunk the endpoint will verify + * that it is in SHUTDOWN-ACK-SENT state, if it is not the chunk should be + * discarded. If the endpoint is in the SHUTDOWN-ACK-SENT state the endpoint + * should stop the T2-shutdown timer and remove all knowledge of the + * association (and thus the association enters the CLOSED state). + * + * Verification Tag: 8.5.1(C) + * C) Rules for packet carrying SHUTDOWN COMPLETE: + * ... + * - The receiver of a SHUTDOWN COMPLETE shall accept the packet if the + * Verification Tag field of the packet matches its own tag OR it is + * set to its peer's tag and the T bit is set in the Chunk Flags. + * Otherwise, the receiver MUST silently discard the packet and take + * no further action. An endpoint MUST ignore the SHUTDOWN COMPLETE if + * it is not in the SHUTDOWN-ACK-SENT state. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + struct sctp_ulpevent *ev; + + /* RFC 2960 6.10 Bundling + * + * An endpoint MUST NOT bundle INIT, INIT ACK or + * SHUTDOWN COMPLETE with any other chunks. + */ + if (!chunk->singleton) + return SCTP_DISPOSITION_VIOLATION; + + if (!sctp_vtag_verify_either(chunk, asoc)) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + /* RFC 2960 10.2 SCTP-to-ULP + * + * H) SHUTDOWN COMPLETE notification + * + * When SCTP completes the shutdown procedures (section 9.2) this + * notification is passed to the upper layer. + */ + ev = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_SHUTDOWN_COMP, + 0, 0, 0, GFP_ATOMIC); + if (!ev) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); + + /* Upon reception of the SHUTDOWN COMPLETE chunk the endpoint + * will verify that it is in SHUTDOWN-ACK-SENT state, if it is + * not the chunk should be discarded. If the endpoint is in + * the SHUTDOWN-ACK-SENT state the endpoint should stop the + * T2-shutdown timer and remove all knowledge of the + * association (and thus the association enters the CLOSED + * state). + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + + SCTP_INC_STATS(SctpShutdowns); + SCTP_DEC_STATS(SctpCurrEstab); + + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); + + return SCTP_DISPOSITION_DELETE_TCB; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Respond to a normal INIT chunk. + * We are the side that is being asked for an association. + * + * Section: 5.1 Normal Establishment of an Association, B + * B) "Z" shall respond immediately with an INIT ACK chunk. The + * destination IP address of the INIT ACK MUST be set to the source + * IP address of the INIT to which this INIT ACK is responding. In + * the response, besides filling in other parameters, "Z" must set the + * Verification Tag field to Tag_A, and also provide its own + * Verification Tag (Tag_Z) in the Initiate Tag field. + * + * Verification Tag: No checking. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_chunk_t *repl; + struct sctp_association *new_asoc; + sctp_chunk_t *err_chunk; + struct sctp_packet *packet; + sctp_unrecognized_param_t *unk_param; + struct sock *sk; + int len; + + /* 6.10 Bundling + * An endpoint MUST NOT bundle INIT, INIT ACK or + * SHUTDOWN COMPLETE with any other chunks. + */ + if (!chunk->singleton) + return SCTP_DISPOSITION_VIOLATION; + + /* If the packet is an OOTB packet which is temporarily on the + * control endpoint, respond with an ABORT. + */ + if (ep == sctp_sk((sctp_get_ctl_sock()))->ep) + return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); + + sk = ep->base.sk; + /* If the endpoint is not listening or if the number of associations + * on the TCP-style socket exceed the max backlog, respond with an + * ABORT. + */ + if ((SCTP_SS_LISTENING != sk->state) || + ((SCTP_SOCKET_TCP == sctp_sk(sk)->type) && + (sk->ack_backlog >= sk->max_ack_backlog))) + return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); + + /* Verify the INIT chunk before processing it. */ + err_chunk = NULL; + if (!sctp_verify_init(asoc, chunk->chunk_hdr->type, + (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, + &err_chunk)) { + /* This chunk contains fatal error. It is to be discarded. + * Send an ABORT, with causes if there is any. + */ + if (err_chunk) { + packet = sctp_abort_pkt_new(ep, asoc, arg, + (__u8 *)(err_chunk->chunk_hdr) + + sizeof(sctp_chunkhdr_t), + ntohs(err_chunk->chunk_hdr->length) - + sizeof(sctp_chunkhdr_t)); + + sctp_free_chunk(err_chunk); + + if (packet) { + sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, + SCTP_PACKET(packet)); + SCTP_INC_STATS(SctpOutCtrlChunks); + return SCTP_DISPOSITION_CONSUME; + } else { + return SCTP_DISPOSITION_NOMEM; + } + } else { + return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, + commands); + } + } + + /* Grab the INIT header. */ + chunk->subh.init_hdr = (sctp_inithdr_t *)chunk->skb->data; + + /* Tag the variable length parameters. */ + chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(sctp_inithdr_t)); + + new_asoc = sctp_make_temp_asoc(ep, chunk, GFP_ATOMIC); + if (!new_asoc) + goto nomem; + + /* The call, sctp_process_init(), can fail on memory allocation. */ + if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type, + sctp_source(chunk), + (sctp_init_chunk_t *)chunk->chunk_hdr, + GFP_ATOMIC)) + goto nomem_init; + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); + + /* B) "Z" shall respond immediately with an INIT ACK chunk. */ + + /* If there are errors need to be reported for unknown parameters, + * make sure to reserve enough room in the INIT ACK for them. + */ + len = 0; + if (err_chunk) + len = ntohs(err_chunk->chunk_hdr->length) - + sizeof(sctp_chunkhdr_t); + + if (sctp_assoc_set_bind_addr_from_ep(new_asoc, GFP_ATOMIC) < 0) + goto nomem_ack; + + repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len); + if (!repl) + goto nomem_ack; + + /* If there are errors need to be reported for unknown parameters, + * include them in the outgoing INIT ACK as "Unrecognized parameter" + * parameter. + */ + if (err_chunk) { + /* Get the "Unrecognized parameter" parameter(s) out of the + * ERROR chunk generated by sctp_verify_init(). Since the + * error cause code for "unknown parameter" and the + * "Unrecognized parameter" type is the same, we can + * construct the parameters in INIT ACK by copying the + * ERROR causes over. + */ + unk_param = (sctp_unrecognized_param_t *) + ((__u8 *)(err_chunk->chunk_hdr) + + sizeof(sctp_chunkhdr_t)); + /* Replace the cause code with the "Unrecognized parameter" + * parameter type. + */ + sctp_addto_chunk(repl, len, unk_param); + sctp_free_chunk(err_chunk); + } + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); + + /* + * Note: After sending out INIT ACK with the State Cookie parameter, + * "Z" MUST NOT allocate any resources, nor keep any states for the + * new association. Otherwise, "Z" will be vulnerable to resource + * attacks. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); + + return SCTP_DISPOSITION_DELETE_TCB; + +nomem_ack: + if (err_chunk) + sctp_free_chunk(err_chunk); +nomem_init: + sctp_association_free(new_asoc); +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Respond to a normal INIT ACK chunk. + * We are the side that is initiating the association. + * + * Section: 5.1 Normal Establishment of an Association, C + * C) Upon reception of the INIT ACK from "Z", "A" shall stop the T1-init + * timer and leave COOKIE-WAIT state. "A" shall then send the State + * Cookie received in the INIT ACK chunk in a COOKIE ECHO chunk, start + * the T1-cookie timer, and enter the COOKIE-ECHOED state. + * + * Note: The COOKIE ECHO chunk can be bundled with any pending outbound + * DATA chunks, but it MUST be the first chunk in the packet and + * until the COOKIE ACK is returned the sender MUST NOT send any + * other packets to the peer. + * + * Verification Tag: 3.3.3 + * If the value of the Initiate Tag in a received INIT ACK chunk is + * found to be 0, the receiver MUST treat it as an error and close the + * association by transmitting an ABORT. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_init_chunk_t *initchunk; + __u32 init_tag; + sctp_chunk_t *err_chunk; + struct sctp_packet *packet; + sctp_disposition_t ret; + + /* 6.10 Bundling + * An endpoint MUST NOT bundle INIT, INIT ACK or + * SHUTDOWN COMPLETE with any other chunks. + */ + if (!chunk->singleton) + return SCTP_DISPOSITION_VIOLATION; + + /* Grab the INIT header. */ + chunk->subh.init_hdr = (sctp_inithdr_t *) chunk->skb->data; + + init_tag = ntohl(chunk->subh.init_hdr->init_tag); + + /* Verification Tag: 3.3.3 + * If the value of the Initiate Tag in a received INIT ACK + * chunk is found to be 0, the receiver MUST treat it as an + * error and close the association by transmitting an ABORT. + */ + if (!init_tag) { + sctp_chunk_t *reply = sctp_make_abort(asoc, chunk, 0); + if (!reply) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + SCTP_INC_STATS(SctpAborteds); + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); + return SCTP_DISPOSITION_DELETE_TCB; + } + + /* Verify the INIT chunk before processing it. */ + err_chunk = NULL; + if (!sctp_verify_init(asoc, chunk->chunk_hdr->type, + (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, + &err_chunk)) { + + SCTP_INC_STATS(SctpAborteds); + + /* This chunk contains fatal error. It is to be discarded. + * Send an ABORT, with causes if there is any. + */ + if (err_chunk) { + packet = sctp_abort_pkt_new(ep, asoc, arg, + (__u8 *)(err_chunk->chunk_hdr) + + sizeof(sctp_chunkhdr_t), + ntohs(err_chunk->chunk_hdr->length) - + sizeof(sctp_chunkhdr_t)); + + sctp_free_chunk(err_chunk); + + if (packet) { + sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, + SCTP_PACKET(packet)); + SCTP_INC_STATS(SctpOutCtrlChunks); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, + SCTP_NULL()); + return SCTP_DISPOSITION_CONSUME; + } else { + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, + SCTP_NULL()); + return SCTP_DISPOSITION_NOMEM; + } + } else { + ret = sctp_sf_tabort_8_4_8(ep, asoc, type, arg, + commands); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, + SCTP_NULL()); + return ret; + } + } + + /* Tag the variable length parameters. Note that we never + * convert the parameters in an INIT chunk. + */ + chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(sctp_inithdr_t)); + + initchunk = (sctp_init_chunk_t *) chunk->chunk_hdr; + + sctp_add_cmd_sf(commands, SCTP_CMD_PEER_INIT, + SCTP_PEER_INIT(initchunk)); + + /* 5.1 C) "A" shall stop the T1-init timer and leave + * COOKIE-WAIT state. "A" shall then ... start the T1-cookie + * timer, and enter the COOKIE-ECHOED state. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT)); + sctp_add_cmd_sf(commands, SCTP_CMD_COUNTER_RESET, + SCTP_COUNTER(SCTP_COUNTER_INIT_ERROR)); + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE)); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_COOKIE_ECHOED)); + + /* 5.1 C) "A" shall then send the State Cookie received in the + * INIT ACK chunk in a COOKIE ECHO chunk, ... + */ + /* If there is any errors to report, send the ERROR chunk generated + * for unknown parameters as well. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_GEN_COOKIE_ECHO, + SCTP_CHUNK(err_chunk)); + + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Respond to a normal COOKIE ECHO chunk. + * We are the side that is being asked for an association. + * + * Section: 5.1 Normal Establishment of an Association, D + * D) Upon reception of the COOKIE ECHO chunk, Endpoint "Z" will reply + * with a COOKIE ACK chunk after building a TCB and moving to + * the ESTABLISHED state. A COOKIE ACK chunk may be bundled with + * any pending DATA chunks (and/or SACK chunks), but the COOKIE ACK + * chunk MUST be the first chunk in the packet. + * + * IMPLEMENTATION NOTE: An implementation may choose to send the + * Communication Up notification to the SCTP user upon reception + * of a valid COOKIE ECHO chunk. + * + * Verification Tag: 8.5.1 Exceptions in Verification Tag Rules + * D) Rules for packet carrying a COOKIE ECHO + * + * - When sending a COOKIE ECHO, the endpoint MUST use the value of the + * Initial Tag received in the INIT ACK. + * + * - The receiver of a COOKIE ECHO follows the procedures in Section 5. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + struct sctp_association *new_asoc; + sctp_init_chunk_t *peer_init; + sctp_chunk_t *repl; + struct sctp_ulpevent *ev; + int error = 0; + sctp_chunk_t *err_chk_p; + + /* If the packet is an OOTB packet which is temporarily on the + * control endpoint, respond with an ABORT. + */ + if (ep == sctp_sk((sctp_get_ctl_sock()))->ep) + return sctp_sf_ootb(ep, asoc, type, arg, commands); + + /* "Decode" the chunk. We have no optional parameters so we + * are in good shape. + */ + chunk->subh.cookie_hdr = + (sctp_signed_cookie_t *)chunk->skb->data; + skb_pull(chunk->skb, + ntohs(chunk->chunk_hdr->length) - sizeof(sctp_chunkhdr_t)); + + /* 5.1 D) Upon reception of the COOKIE ECHO chunk, Endpoint + * "Z" will reply with a COOKIE ACK chunk after building a TCB + * and moving to the ESTABLISHED state. + */ + new_asoc = sctp_unpack_cookie(ep, asoc, chunk, GFP_ATOMIC, &error, + &err_chk_p); + + /* FIXME: + * If the re-build failed, what is the proper error path + * from here? + * + * [We should abort the association. --piggy] + */ + if (!new_asoc) { + /* FIXME: Several errors are possible. A bad cookie should + * be silently discarded, but think about logging it too. + */ + switch (error) { + case -SCTP_IERROR_NOMEM: + goto nomem; + + case -SCTP_IERROR_STALE_COOKIE: + sctp_send_stale_cookie_err(ep, asoc, chunk, commands, + err_chk_p); + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + case -SCTP_IERROR_BAD_SIG: + default: + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + }; + } + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_ESTABLISHED)); + SCTP_INC_STATS(SctpCurrEstab); + SCTP_INC_STATS(SctpPassiveEstabs); + sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL()); + + if (new_asoc->autoclose) + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, + SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE)); + + sctp_add_cmd_sf(commands, SCTP_CMD_TRANSMIT, SCTP_NULL()); + + /* Re-build the bind address for the association is done in + * the sctp_unpack_cookie() already. + */ + /* This is a brand-new association, so these are not yet side + * effects--it is safe to run them here. + */ + peer_init = &chunk->subh.cookie_hdr->c.peer_init[0]; + + if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type, + &chunk->subh.cookie_hdr->c.peer_addr, + peer_init, GFP_ATOMIC)) + goto nomem_init; + + repl = sctp_make_cookie_ack(new_asoc, chunk); + if (!repl) + goto nomem_repl; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); + + /* RFC 2960 5.1 Normal Establishment of an Association + * + * D) IMPLEMENTATION NOTE: An implementation may choose to + * send the Communication Up notification to the SCTP user + * upon reception of a valid COOKIE ECHO chunk. + */ + ev = sctp_ulpevent_make_assoc_change(new_asoc, 0, SCTP_COMM_UP, 0, + new_asoc->c.sinit_num_ostreams, + new_asoc->c.sinit_max_instreams, + GFP_ATOMIC); + if (!ev) + goto nomem_ev; + + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); + + return SCTP_DISPOSITION_CONSUME; + +nomem_ev: + sctp_free_chunk(repl); +nomem_repl: +nomem_init: + sctp_association_free(new_asoc); +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Respond to a normal COOKIE ACK chunk. + * We are the side that is being asked for an association. + * + * RFC 2960 5.1 Normal Establishment of an Association + * + * E) Upon reception of the COOKIE ACK, endpoint "A" will move from the + * COOKIE-ECHOED state to the ESTABLISHED state, stopping the T1-cookie + * timer. It may also notify its ULP about the successful + * establishment of the association with a Communication Up + * notification (see Section 10). + * + * Verification Tag: + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_5_1E_ca(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, void *arg, + sctp_cmd_seq_t *commands) +{ + struct sctp_ulpevent *ev; + + /* RFC 2960 5.1 Normal Establishment of an Association + * + * E) Upon reception of the COOKIE ACK, endpoint "A" will move + * from the COOKIE-ECHOED state to the ESTABLISHED state, + * stopping the T1-cookie timer. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE)); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_ESTABLISHED)); + SCTP_INC_STATS(SctpCurrEstab); + SCTP_INC_STATS(SctpActiveEstabs); + sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL()); + if (asoc->autoclose) + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, + SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE)); + sctp_add_cmd_sf(commands, SCTP_CMD_TRANSMIT, SCTP_NULL()); + + /* It may also notify its ULP about the successful + * establishment of the association with a Communication Up + * notification (see Section 10). + */ + ev = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_COMM_UP, + 0, asoc->c.sinit_num_ostreams, + asoc->c.sinit_max_instreams, + GFP_ATOMIC); + + if (!ev) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); + + return SCTP_DISPOSITION_CONSUME; +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* Generate and sendout a heartbeat packet. */ +sctp_disposition_t sctp_sf_heartbeat(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + struct sctp_transport *transport = (struct sctp_transport *) arg; + sctp_chunk_t *reply; + sctp_sender_hb_info_t hbinfo; + size_t paylen = 0; + + hbinfo.param_hdr.type = SCTP_PARAM_HEARTBEAT_INFO; + hbinfo.param_hdr.length = htons(sizeof(sctp_sender_hb_info_t)); + hbinfo.daddr = transport->ipaddr; + hbinfo.sent_at = jiffies; + + /* Send a heartbeat to our peer. */ + paylen = sizeof(sctp_sender_hb_info_t); + reply = sctp_make_heartbeat(asoc, transport, &hbinfo, paylen); + if (!reply) + return SCTP_DISPOSITION_NOMEM; + + /* Set rto_pending indicating that an RTT measurement + * is started with this heartbeat chunk. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_RTO_PENDING, + SCTP_TRANSPORT(transport)); + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + return SCTP_DISPOSITION_CONSUME; +} + +/* Generate a HEARTBEAT packet on the given transport. */ +sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + struct sctp_transport *transport = (struct sctp_transport *) arg; + + if (asoc->overall_error_count >= asoc->overall_error_threshold) { + /* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */ + sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, + SCTP_U32(SCTP_ERROR_NO_ERROR)); + SCTP_INC_STATS(SctpAborteds); + SCTP_DEC_STATS(SctpCurrEstab); + return SCTP_DISPOSITION_DELETE_TCB; + } + + /* Section 3.3.5. + * The Sender-specific Heartbeat Info field should normally include + * information about the sender's current time when this HEARTBEAT + * chunk is sent and the destination transport address to which this + * HEARTBEAT is sent (see Section 8.3). + */ + + if (transport->hb_allowed) { + if (SCTP_DISPOSITION_NOMEM == + sctp_sf_heartbeat(ep, asoc, type, arg, + commands)) + return SCTP_DISPOSITION_NOMEM; + /* Set transport error counter and association error counter + * when sending heartbeat. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TRANSPORT_RESET, + SCTP_TRANSPORT(transport)); + } + sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMER_UPDATE, + SCTP_TRANSPORT(transport)); + + return SCTP_DISPOSITION_CONSUME; +} + +/* + * Process an heartbeat request. + * + * Section: 8.3 Path Heartbeat + * The receiver of the HEARTBEAT should immediately respond with a + * HEARTBEAT ACK that contains the Heartbeat Information field copied + * from the received HEARTBEAT chunk. + * + * Verification Tag: 8.5 Verification Tag [Normal verification] + * When receiving an SCTP packet, the endpoint MUST ensure that the + * value in the Verification Tag field of the received SCTP packet + * matches its own Tag. If the received Verification Tag value does not + * match the receiver's own tag value, the receiver shall silently + * discard the packet and shall not process it any further except for + * those cases listed in Section 8.5.1 below. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_beat_8_3(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_chunk_t *reply; + size_t paylen = 0; + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. If the received + * Verification Tag value does not match the receiver's own + * tag value, the receiver shall silently discard the packet... + */ + if (ntohl(chunk->sctp_hdr->vtag) != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + /* 8.3 The receiver of the HEARTBEAT should immediately + * respond with a HEARTBEAT ACK that contains the Heartbeat + * Information field copied from the received HEARTBEAT chunk. + */ + chunk->subh.hb_hdr = (sctp_heartbeathdr_t *) chunk->skb->data; + paylen = ntohs(chunk->chunk_hdr->length) - sizeof(sctp_chunkhdr_t); + skb_pull(chunk->skb, paylen); + + reply = sctp_make_heartbeat_ack(asoc, chunk, + chunk->subh.hb_hdr, paylen); + if (!reply) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Process the returning HEARTBEAT ACK. + * + * Section: 8.3 Path Heartbeat + * Upon the receipt of the HEARTBEAT ACK, the sender of the HEARTBEAT + * should clear the error counter of the destination transport + * address to which the HEARTBEAT was sent, and mark the destination + * transport address as active if it is not so marked. The endpoint may + * optionally report to the upper layer when an inactive destination + * address is marked as active due to the reception of the latest + * HEARTBEAT ACK. The receiver of the HEARTBEAT ACK must also + * clear the association overall error count as well (as defined + * in section 8.1). + * + * The receiver of the HEARTBEAT ACK should also perform an RTT + * measurement for that destination transport address using the time + * value carried in the HEARTBEAT ACK chunk. + * + * Verification Tag: 8.5 Verification Tag [Normal verification] + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + union sctp_addr from_addr; + struct sctp_transport *link; + sctp_sender_hb_info_t *hbinfo; + unsigned long max_interval; + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. ... + */ + if (ntohl(chunk->sctp_hdr->vtag) != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + hbinfo = (sctp_sender_hb_info_t *) chunk->skb->data; + from_addr = hbinfo->daddr; + link = sctp_assoc_lookup_paddr(asoc, &from_addr); + + /* This should never happen, but lets log it if so. */ + if (!link) { + printk(KERN_WARNING + "%s: Could not find address %d.%d.%d.%d\n", + __FUNCTION__, NIPQUAD(from_addr.v4.sin_addr)); + return SCTP_DISPOSITION_DISCARD; + } + + max_interval = link->hb_interval + link->rto; + + /* Check if the timestamp looks valid. */ + if (time_after(hbinfo->sent_at, jiffies) || + time_after(jiffies, hbinfo->sent_at + max_interval)) { + SCTP_DEBUG_PRINTK("%s: HEARTBEAT ACK with invalid timestamp" + "received for transport: %p\n", + __FUNCTION__, link); + return SCTP_DISPOSITION_DISCARD; + } + + /* 8.3 Upon the receipt of the HEARTBEAT ACK, the sender of + * the HEARTBEAT should clear the error counter of the + * destination transport address to which the HEARTBEAT was + * sent and mark the destination transport address as active if + * it is not so marked. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TRANSPORT_ON, SCTP_TRANSPORT(link)); + + return SCTP_DISPOSITION_CONSUME; +} + +/* Helper function to send out an abort for the restart + * condition. + */ +static int sctp_sf_send_restart_abort(union sctp_addr *ssa, + sctp_chunk_t *init, + sctp_cmd_seq_t *commands) +{ + int len; + struct sctp_packet *pkt; + sctp_addr_param_t *addrparm; + sctp_errhdr_t *errhdr; + struct sctp_endpoint *ep; + char buffer[sizeof(sctp_errhdr_t) + sizeof(sctp_addr_param_t)]; + + /* Build the error on the stack. We are way to malloc crazy + * throughout the code today. + */ + errhdr = (sctp_errhdr_t *)buffer; + addrparm = (sctp_addr_param_t *)errhdr->variable; + + /* Copy into a parm format. */ + len = sockaddr2sctp_addr(ssa, addrparm); + len += sizeof(sctp_errhdr_t); + + errhdr->cause = SCTP_ERROR_RESTART; + errhdr->length = htons(len); + + /* Assign to the control socket. */ + ep = sctp_sk((sctp_get_ctl_sock()))->ep; + + /* Association is NULL since this may be a restart attack and we + * want to send back the attacker's vtag. + */ + pkt = sctp_abort_pkt_new(ep, NULL, init, errhdr, len); + + if (!pkt) + goto out; + sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, SCTP_PACKET(pkt)); + + SCTP_INC_STATS(SctpOutCtrlChunks); + + /* Discard the rest of the inbound packet. */ + sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL()); + +out: + /* Even if there is no memory, treat as a failure so + * the packet will get dropped. + */ + return 0; +} + +/* A restart is occurring, check to make sure no new addresses + * are being added as we may be under a takeover attack. + */ +static int sctp_sf_check_restart_addrs(const struct sctp_association *new_asoc, + const struct sctp_association *asoc, + sctp_chunk_t *init, + sctp_cmd_seq_t *commands) +{ + struct sctp_transport *new_addr, *addr; + struct list_head *pos, *pos2; + int found; + + /* Implementor's Guide - Sectin 5.2.2 + * ... + * Before responding the endpoint MUST check to see if the + * unexpected INIT adds new addresses to the association. If new + * addresses are added to the association, the endpoint MUST respond + * with an ABORT.. + */ + + /* Search through all current addresses and make sure + * we aren't adding any new ones. + */ + new_addr = 0; + found = 0; + + list_for_each(pos, &new_asoc->peer.transport_addr_list) { + new_addr = list_entry(pos, struct sctp_transport, transports); + found = 0; + list_for_each(pos2, &asoc->peer.transport_addr_list) { + addr = list_entry(pos2, struct sctp_transport, + transports); + if (sctp_cmp_addr_exact(&new_addr->ipaddr, + &addr->ipaddr)) { + found = 1; + break; + } + } + if (!found) + break; + } + + /* If a new address was added, ABORT the sender. */ + if (!found && new_addr) { + sctp_sf_send_restart_abort(&new_addr->ipaddr, init, commands); + } + + /* Return success if all addresses were found. */ + return found; +} + +/* Populate the verification/tie tags based on overlapping INIT + * scenario. + * + * Note: Do not use in CLOSED or SHUTDOWN-ACK-SENT state. + */ +static void sctp_tietags_populate(struct sctp_association *new_asoc, + const struct sctp_association *asoc) +{ + switch (asoc->state) { + + /* 5.2.1 INIT received in COOKIE-WAIT or COOKIE-ECHOED State */ + + case SCTP_STATE_COOKIE_WAIT: + new_asoc->c.my_vtag = asoc->c.my_vtag; + new_asoc->c.my_ttag = asoc->c.my_vtag; + new_asoc->c.peer_ttag = 0; + break; + + case SCTP_STATE_COOKIE_ECHOED: + new_asoc->c.my_vtag = asoc->c.my_vtag; + new_asoc->c.my_ttag = asoc->c.my_vtag; + new_asoc->c.peer_ttag = asoc->c.peer_vtag; + break; + + /* 5.2.2 Unexpected INIT in States Other than CLOSED, COOKIE-ECHOED, + * COOKIE-WAIT and SHUTDOWN-ACK-SENT + */ + default: + new_asoc->c.my_ttag = asoc->c.my_vtag; + new_asoc->c.peer_ttag = asoc->c.peer_vtag; + break; + }; + + /* Other parameters for the endpoint SHOULD be copied from the + * existing parameters of the association (e.g. number of + * outbound streams) into the INIT ACK and cookie. + */ + new_asoc->rwnd = asoc->rwnd; + new_asoc->c.sinit_num_ostreams = asoc->c.sinit_num_ostreams; + new_asoc->c.sinit_max_instreams = asoc->c.sinit_max_instreams; + new_asoc->c.initial_tsn = asoc->c.initial_tsn; +} + +/* + * Compare vtag/tietag values to determine unexpected COOKIE-ECHO + * handling action. + * + * RFC 2960 5.2.4 Handle a COOKIE ECHO when a TCB exists. + * + * Returns value representing action to be taken. These action values + * correspond to Action/Description values in RFC 2960, Table 2. + */ +static char sctp_tietags_compare(struct sctp_association *new_asoc, + const struct sctp_association *asoc) +{ + /* In this case, the peer may have restarted. */ + if ((asoc->c.my_vtag != new_asoc->c.my_vtag) && + (asoc->c.peer_vtag != new_asoc->c.peer_vtag) && + (asoc->c.my_vtag == new_asoc->c.my_ttag) && + (asoc->c.peer_vtag == new_asoc->c.peer_ttag)) + return 'A'; + + /* Collision case B. */ + if ((asoc->c.my_vtag == new_asoc->c.my_vtag) && + ((asoc->c.peer_vtag != new_asoc->c.peer_vtag) || + (0 == asoc->c.peer_vtag))) { + return 'B'; + } + + /* Collision case D. */ + if ((asoc->c.my_vtag == new_asoc->c.my_vtag) && + (asoc->c.peer_vtag == new_asoc->c.peer_vtag)) + return 'D'; + + /* Collision case C. */ + if ((asoc->c.my_vtag != new_asoc->c.my_vtag) && + (asoc->c.peer_vtag == new_asoc->c.peer_vtag) && + (0 == new_asoc->c.my_ttag) && + (0 == new_asoc->c.peer_ttag)) + return 'C'; + + /* No match to any of the special cases; discard this packet. */ + return 'E'; +} + +/* Common helper routine for both duplicate and simulataneous INIT + * chunk handling. + */ +static sctp_disposition_t sctp_sf_do_unexpected_init( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, sctp_cmd_seq_t *commands) +{ + sctp_disposition_t retval; + sctp_chunk_t *chunk = arg; + sctp_chunk_t *repl; + struct sctp_association *new_asoc; + sctp_chunk_t *err_chunk; + struct sctp_packet *packet; + sctp_unrecognized_param_t *unk_param; + int len; + + /* 6.10 Bundling + * An endpoint MUST NOT bundle INIT, INIT ACK or + * SHUTDOWN COMPLETE with any other chunks. + */ + if (!chunk->singleton) + return SCTP_DISPOSITION_VIOLATION; + + /* Grab the INIT header. */ + chunk->subh.init_hdr = (sctp_inithdr_t *) chunk->skb->data; + + /* Tag the variable length parameters. */ + chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(sctp_inithdr_t)); + + /* Verify the INIT chunk before processing it. */ + err_chunk = NULL; + if (!sctp_verify_init(asoc, chunk->chunk_hdr->type, + (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, + &err_chunk)) { + /* This chunk contains fatal error. It is to be discarded. + * Send an ABORT, with causes if there is any. + */ + if (err_chunk) { + packet = sctp_abort_pkt_new(ep, asoc, arg, + (__u8 *)(err_chunk->chunk_hdr) + + sizeof(sctp_chunkhdr_t), + ntohs(err_chunk->chunk_hdr->length) - + sizeof(sctp_chunkhdr_t)); + + if (packet) { + sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, + SCTP_PACKET(packet)); + SCTP_INC_STATS(SctpOutCtrlChunks); + retval = SCTP_DISPOSITION_CONSUME; + } else { + retval = SCTP_DISPOSITION_NOMEM; + } + goto cleanup; + } else { + return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, + commands); + } + } + + /* + * Other parameters for the endpoint SHOULD be copied from the + * existing parameters of the association (e.g. number of + * outbound streams) into the INIT ACK and cookie. + * FIXME: We are copying parameters from the endpoint not the + * association. + */ + new_asoc = sctp_make_temp_asoc(ep, chunk, GFP_ATOMIC); + if (!new_asoc) + goto nomem; + + /* In the outbound INIT ACK the endpoint MUST copy its current + * Verification Tag and Peers Verification tag into a reserved + * place (local tie-tag and per tie-tag) within the state cookie. + */ + if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type, + sctp_source(chunk), + (sctp_init_chunk_t *)chunk->chunk_hdr, + GFP_ATOMIC)) { + retval = SCTP_DISPOSITION_NOMEM; + goto nomem_init; + } + + /* Make sure no new addresses are being added during the + * restart. Do not do this check for COOKIE-WAIT state, + * since there are no peer addresses to check against. + * Upon return an ABORT will have been sent if needed. + */ + if (asoc->state != SCTP_STATE_COOKIE_WAIT) { + if (!sctp_sf_check_restart_addrs(new_asoc, asoc, chunk, + commands)) { + retval = SCTP_DISPOSITION_CONSUME; + goto cleanup_asoc; + } + } + + sctp_tietags_populate(new_asoc, asoc); + + /* B) "Z" shall respond immediately with an INIT ACK chunk. */ + + /* If there are errors need to be reported for unknown parameters, + * make sure to reserve enough room in the INIT ACK for them. + */ + len = 0; + if (err_chunk) { + len = ntohs(err_chunk->chunk_hdr->length) - + sizeof(sctp_chunkhdr_t); + } + + if (sctp_assoc_set_bind_addr_from_ep(new_asoc, GFP_ATOMIC) < 0) + goto nomem; + + repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len); + if (!repl) + goto nomem; + + /* If there are errors need to be reported for unknown parameters, + * include them in the outgoing INIT ACK as "Unrecognized parameter" + * parameter. + */ + if (err_chunk) { + /* Get the "Unrecognized parameter" parameter(s) out of the + * ERROR chunk generated by sctp_verify_init(). Since the + * error cause code for "unknown parameter" and the + * "Unrecognized parameter" type is the same, we can + * construct the parameters in INIT ACK by copying the + * ERROR causes over. + */ + unk_param = (sctp_unrecognized_param_t *) + ((__u8 *)(err_chunk->chunk_hdr) + + sizeof(sctp_chunkhdr_t)); + /* Replace the cause code with the "Unrecognized parameter" + * parameter type. + */ + sctp_addto_chunk(repl, len, unk_param); + sctp_free_chunk(err_chunk); + } + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); + + /* + * Note: After sending out INIT ACK with the State Cookie parameter, + * "Z" MUST NOT allocate any resources for this new association. + * Otherwise, "Z" will be vulnerable to resource attacks. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); + retval = SCTP_DISPOSITION_CONSUME; + +cleanup: + if (err_chunk) + sctp_free_chunk(err_chunk); + return retval; +nomem: + retval = SCTP_DISPOSITION_NOMEM; + goto cleanup; +nomem_init: +cleanup_asoc: + sctp_association_free(new_asoc); + goto cleanup; +} + +/* + * Handle simultanous INIT. + * This means we started an INIT and then we got an INIT request from + * our peer. + * + * Section: 5.2.1 INIT received in COOKIE-WAIT or COOKIE-ECHOED State (Item B) + * This usually indicates an initialization collision, i.e., each + * endpoint is attempting, at about the same time, to establish an + * association with the other endpoint. + * + * Upon receipt of an INIT in the COOKIE-WAIT or COOKIE-ECHOED state, an + * endpoint MUST respond with an INIT ACK using the same parameters it + * sent in its original INIT chunk (including its Verification Tag, + * unchanged). These original parameters are combined with those from the + * newly received INIT chunk. The endpoint shall also generate a State + * Cookie with the INIT ACK. The endpoint uses the parameters sent in its + * INIT to calculate the State Cookie. + * + * After that, the endpoint MUST NOT change its state, the T1-init + * timer shall be left running and the corresponding TCB MUST NOT be + * destroyed. The normal procedures for handling State Cookies when + * a TCB exists will resolve the duplicate INITs to a single association. + * + * For an endpoint that is in the COOKIE-ECHOED state it MUST populate + * its Tie-Tags with the Tag information of itself and its peer (see + * section 5.2.2 for a description of the Tie-Tags). + * + * Verification Tag: Not explicit, but an INIT can not have a valid + * verification tag, so we skip the check. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_5_2_1_siminit(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* Call helper to do the real work for both simulataneous and + * duplicate INIT chunk handling. + */ + return sctp_sf_do_unexpected_init(ep, asoc, type, arg, commands); +} + +/* + * Handle duplicated INIT messages. These are usually delayed + * restransmissions. + * + * Section: 5.2.2 Unexpected INIT in States Other than CLOSED, + * COOKIE-ECHOED and COOKIE-WAIT + * + * Unless otherwise stated, upon reception of an unexpected INIT for + * this association, the endpoint shall generate an INIT ACK with a + * State Cookie. In the outbound INIT ACK the endpoint MUST copy its + * current Verification Tag and peer's Verification Tag into a reserved + * place within the state cookie. We shall refer to these locations as + * the Peer's-Tie-Tag and the Local-Tie-Tag. The outbound SCTP packet + * containing this INIT ACK MUST carry a Verification Tag value equal to + * the Initiation Tag found in the unexpected INIT. And the INIT ACK + * MUST contain a new Initiation Tag (randomly generated see Section + * 5.3.1). Other parameters for the endpoint SHOULD be copied from the + * existing parameters of the association (e.g. number of outbound + * streams) into the INIT ACK and cookie. + * + * After sending out the INIT ACK, the endpoint shall take no further + * actions, i.e., the existing association, including its current state, + * and the corresponding TCB MUST NOT be changed. + * + * Note: Only when a TCB exists and the association is not in a COOKIE- + * WAIT state are the Tie-Tags populated. For a normal association INIT + * (i.e. the endpoint is in a COOKIE-WAIT state), the Tie-Tags MUST be + * set to 0 (indicating that no previous TCB existed). The INIT ACK and + * State Cookie are populated as specified in section 5.2.1. + * + * Verification Tag: Not specified, but an INIT has no way of knowing + * what the verification tag could be, so we ignore it. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_5_2_2_dupinit(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* Call helper to do the real work for both simulataneous and + * duplicate INIT chunk handling. + */ + return sctp_sf_do_unexpected_init(ep, asoc, type, arg, commands); +} + + + +/* Unexpected COOKIE-ECHO handler for peer restart (Table 2, action 'A') + * + * Section 5.2.4 + * A) In this case, the peer may have restarted. + */ +static sctp_disposition_t sctp_sf_do_dupcook_a(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + sctp_chunk_t *chunk, + sctp_cmd_seq_t *commands, + struct sctp_association *new_asoc) +{ + sctp_init_chunk_t *peer_init; + struct sctp_ulpevent *ev; + sctp_chunk_t *repl; + + /* new_asoc is a brand-new association, so these are not yet + * side effects--it is safe to run them here. + */ + peer_init = &chunk->subh.cookie_hdr->c.peer_init[0]; + + if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type, + sctp_source(chunk), peer_init, + GFP_ATOMIC)) + goto nomem; + + /* Make sure no new addresses are being added during the + * restart. Though this is a pretty complicated attack + * since you'd have to get inside the cookie. + */ + if (!sctp_sf_check_restart_addrs(new_asoc, asoc, chunk, commands)) { + return SCTP_DISPOSITION_CONSUME; + } + + /* For now, fail any unsent/unacked data. Consider the optional + * choice of resending of this data. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_PURGE_OUTQUEUE, SCTP_NULL()); + + /* Update the content of current association. */ + sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc)); + + repl = sctp_make_cookie_ack(new_asoc, chunk); + if (!repl) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); + + /* Report association restart to upper layer. */ + ev = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_RESTART, 0, + new_asoc->c.sinit_num_ostreams, + new_asoc->c.sinit_max_instreams, + GFP_ATOMIC); + if (!ev) + goto nomem_ev; + + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); + return SCTP_DISPOSITION_CONSUME; + +nomem_ev: + sctp_free_chunk(repl); +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* Unexpected COOKIE-ECHO handler for setup collision (Table 2, action 'B') + * + * Section 5.2.4 + * B) In this case, both sides may be attempting to start an association + * at about the same time but the peer endpoint started its INIT + * after responding to the local endpoint's INIT + */ +/* This case represents an initialization collision. */ +static sctp_disposition_t sctp_sf_do_dupcook_b(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + sctp_chunk_t *chunk, + sctp_cmd_seq_t *commands, + struct sctp_association *new_asoc) +{ + sctp_init_chunk_t *peer_init; + struct sctp_ulpevent *ev; + sctp_chunk_t *repl; + + /* new_asoc is a brand-new association, so these are not yet + * side effects--it is safe to run them here. + */ + peer_init = &chunk->subh.cookie_hdr->c.peer_init[0]; + if (!sctp_process_init(new_asoc, chunk->chunk_hdr->type, + sctp_source(chunk), peer_init, + GFP_ATOMIC)) + goto nomem; + + /* Update the content of current association. */ + sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc)); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_ESTABLISHED)); + SCTP_INC_STATS(SctpCurrEstab); + sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL()); + + repl = sctp_make_cookie_ack(new_asoc, chunk); + if (!repl) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); + sctp_add_cmd_sf(commands, SCTP_CMD_TRANSMIT, SCTP_NULL()); + + /* RFC 2960 5.1 Normal Establishment of an Association + * + * D) IMPLEMENTATION NOTE: An implementation may choose to + * send the Communication Up notification to the SCTP user + * upon reception of a valid COOKIE ECHO chunk. + */ + ev = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_COMM_UP, 0, + new_asoc->c.sinit_num_ostreams, + new_asoc->c.sinit_max_instreams, + GFP_ATOMIC); + if (!ev) + goto nomem_ev; + + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); + return SCTP_DISPOSITION_CONSUME; + +nomem_ev: + sctp_free_chunk(repl); +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* Unexpected COOKIE-ECHO handler for setup collision (Table 2, action 'C') + * + * Section 5.2.4 + * C) In this case, the local endpoint's cookie has arrived late. + * Before it arrived, the local endpoint sent an INIT and received an + * INIT-ACK and finally sent a COOKIE ECHO with the peer's same tag + * but a new tag of its own. + */ +/* This case represents an initialization collision. */ +static sctp_disposition_t sctp_sf_do_dupcook_c(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + sctp_chunk_t *chunk, + sctp_cmd_seq_t *commands, + struct sctp_association *new_asoc) +{ + /* The cookie should be silently discarded. + * The endpoint SHOULD NOT change states and should leave + * any timers running. + */ + return SCTP_DISPOSITION_DISCARD; +} + +/* Unexpected COOKIE-ECHO handler lost chunk (Table 2, action 'D') + * + * Section 5.2.4 + * + * D) When both local and remote tags match the endpoint should always + * enter the ESTABLISHED state, if it has not already done so. + */ +/* This case represents an initialization collision. */ +static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + sctp_chunk_t *chunk, + sctp_cmd_seq_t *commands, + struct sctp_association *new_asoc) +{ + struct sctp_ulpevent *ev = NULL; + sctp_chunk_t *repl; + + /* Clarification from Implementor's Guide: + * D) When both local and remote tags match the endpoint should + * enter the ESTABLISHED state, if it is in the COOKIE-ECHOED state. + * It should stop any cookie timer that may be running and send + * a COOKIE ACK. + */ + + /* Don't accidentally move back into established state. */ + if (asoc->state < SCTP_STATE_ESTABLISHED) { + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE)); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_ESTABLISHED)); + SCTP_INC_STATS(SctpCurrEstab); + sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, + SCTP_NULL()); + + /* RFC 2960 5.1 Normal Establishment of an Association + * + * D) IMPLEMENTATION NOTE: An implementation may choose + * to send the Communication Up notification to the + * SCTP user upon reception of a valid COOKIE + * ECHO chunk. + */ + ev = sctp_ulpevent_make_assoc_change(new_asoc, 0, + SCTP_COMM_UP, 0, + new_asoc->c.sinit_num_ostreams, + new_asoc->c.sinit_max_instreams, + GFP_ATOMIC); + if (!ev) + goto nomem; + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, + SCTP_ULPEVENT(ev)); + } + sctp_add_cmd_sf(commands, SCTP_CMD_TRANSMIT, SCTP_NULL()); + + repl = sctp_make_cookie_ack(new_asoc, chunk); + if (!repl) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); + sctp_add_cmd_sf(commands, SCTP_CMD_TRANSMIT, SCTP_NULL()); + + return SCTP_DISPOSITION_CONSUME; + +nomem: + if (ev) + sctp_ulpevent_free(ev); + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Handle a duplicate COOKIE-ECHO. This usually means a cookie-carrying + * chunk was retransmitted and then delayed in the network. + * + * Section: 5.2.4 Handle a COOKIE ECHO when a TCB exists + * + * Verification Tag: None. Do cookie validation. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_disposition_t retval; + sctp_chunk_t *chunk = arg; + struct sctp_association *new_asoc; + int error = 0; + char action; + sctp_chunk_t *err_chk_p; + + /* "Decode" the chunk. We have no optional parameters so we + * are in good shape. + */ + chunk->subh.cookie_hdr = (sctp_signed_cookie_t *)chunk->skb->data; + skb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) - + sizeof(sctp_chunkhdr_t)); + + /* In RFC 2960 5.2.4 3, if both Verification Tags in the State Cookie + * of a duplicate COOKIE ECHO match the Verification Tags of the + * current association, consider the State Cookie valid even if + * the lifespan is exceeded. + */ + new_asoc = sctp_unpack_cookie(ep, asoc, chunk, GFP_ATOMIC, &error, + &err_chk_p); + + /* FIXME: + * If the re-build failed, what is the proper error path + * from here? + * + * [We should abort the association. --piggy] + */ + if (!new_asoc) { + /* FIXME: Several errors are possible. A bad cookie should + * be silently discarded, but think about logging it too. + */ + switch (error) { + case -SCTP_IERROR_NOMEM: + goto nomem; + + case -SCTP_IERROR_STALE_COOKIE: + sctp_send_stale_cookie_err(ep, asoc, chunk, commands, + err_chk_p); + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + case -SCTP_IERROR_BAD_SIG: + default: + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + }; + } + + /* Compare the tie_tag in cookie with the verification tag of + * current association. + */ + action = sctp_tietags_compare(new_asoc, asoc); + + switch (action) { + case 'A': /* Association restart. */ + retval = sctp_sf_do_dupcook_a(ep, asoc, chunk, commands, + new_asoc); + break; + + case 'B': /* Collision case B. */ + retval = sctp_sf_do_dupcook_b(ep, asoc, chunk, commands, + new_asoc); + break; + + case 'C': /* Collision case C. */ + retval = sctp_sf_do_dupcook_c(ep, asoc, chunk, commands, + new_asoc); + break; + + case 'D': /* Collision case D. */ + retval = sctp_sf_do_dupcook_d(ep, asoc, chunk, commands, + new_asoc); + break; + + default: /* Discard packet for all others. */ + retval = sctp_sf_pdiscard(ep, asoc, type, arg, commands); + break; + }; + + /* Delete the tempory new association. */ + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc)); + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); + + return retval; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Process an ABORT. (SHUTDOWN-PENDING state) + * + * See sctp_sf_do_9_1_abort(). + */ +sctp_disposition_t sctp_sf_shutdown_pending_abort( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + + if (!sctp_vtag_verify_either(chunk, asoc)) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + /* Stop the T5-shutdown guard timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); + + return sctp_sf_do_9_1_abort(ep, asoc, type, arg, commands); +} + +/* + * Process an ABORT. (SHUTDOWN-SENT state) + * + * See sctp_sf_do_9_1_abort(). + */ +sctp_disposition_t sctp_sf_shutdown_sent_abort(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + + if (!sctp_vtag_verify_either(chunk, asoc)) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + /* Stop the T2-shutdown timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + + /* Stop the T5-shutdown guard timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); + + return sctp_sf_do_9_1_abort(ep, asoc, type, arg, commands); +} + +/* + * Process an ABORT. (SHUTDOWN-ACK-SENT state) + * + * See sctp_sf_do_9_1_abort(). + */ +sctp_disposition_t sctp_sf_shutdown_ack_sent_abort( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* The same T2 timer, so we should be able to use + * common function with the SHUTDOWN-SENT state. + */ + return sctp_sf_shutdown_sent_abort(ep, asoc, type, arg, commands); +} + +/* + * Handle an Error received in COOKIE_ECHOED state. + * + * Only handle the error type of stale COOKIE Error, the other errors will + * be ignored. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_errhdr_t *err; + + err = (sctp_errhdr_t *)(chunk->skb->data); + + /* If we have gotten too many failures, give up. */ + if (1 + asoc->counters[SCTP_COUNTER_INIT_ERROR] > + asoc->max_init_attempts) { + /* INIT_FAILED will issue an ulpevent. */ + sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED, + SCTP_U32(err->cause)); + return SCTP_DISPOSITION_DELETE_TCB; + } + + /* Process the error here */ + switch (err->cause) { + case SCTP_ERROR_STALE_COOKIE: + return sctp_sf_do_5_2_6_stale(ep, asoc, type, arg, commands); + default: + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + } +} + +/* + * Handle a Stale COOKIE Error + * + * Section: 5.2.6 Handle Stale COOKIE Error + * If the association is in the COOKIE-ECHOED state, the endpoint may elect + * one of the following three alternatives. + * ... + * 3) Send a new INIT chunk to the endpoint, adding a Cookie + * Preservative parameter requesting an extension to the lifetime of + * the State Cookie. When calculating the time extension, an + * implementation SHOULD use the RTT information measured based on the + * previous COOKIE ECHO / ERROR exchange, and should add no more + * than 1 second beyond the measured RTT, due to long State Cookie + * lifetimes making the endpoint more subject to a replay attack. + * + * Verification Tag: Not explicit, but safe to ignore. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + time_t stale; + sctp_cookie_preserve_param_t bht; + sctp_errhdr_t *err; + struct list_head *pos; + struct sctp_transport *t; + sctp_chunk_t *reply; + sctp_bind_addr_t *bp; + int attempts; + + attempts = asoc->counters[SCTP_COUNTER_INIT_ERROR] + 1; + + if (attempts >= asoc->max_init_attempts) { + sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED, + SCTP_U32(SCTP_ERROR_STALE_COOKIE)); + return SCTP_DISPOSITION_DELETE_TCB; + } + + err = (sctp_errhdr_t *)(chunk->skb->data); + + /* When calculating the time extension, an implementation + * SHOULD use the RTT information measured based on the + * previous COOKIE ECHO / ERROR exchange, and should add no + * more than 1 second beyond the measured RTT, due to long + * State Cookie lifetimes making the endpoint more subject to + * a replay attack. + * Measure of Staleness's unit is usec. (1/1000000 sec) + * Suggested Cookie Life-span Increment's unit is msec. + * (1/1000 sec) + * In general, if you use the suggested cookie life, the value + * found in the field of measure of staleness should be doubled + * to give ample time to retransmit the new cookie and thus + * yield a higher probability of success on the reattempt. + */ + stale = ntohl(*(suseconds_t *)((u8 *)err + sizeof(sctp_errhdr_t))); + stale = stale << 1 / 1000; + + bht.param_hdr.type = SCTP_PARAM_COOKIE_PRESERVATIVE; + bht.param_hdr.length = htons(sizeof(bht)); + bht.lifespan_increment = htonl(stale); + + /* Build that new INIT chunk. */ + bp = (sctp_bind_addr_t *) &asoc->base.bind_addr; + reply = sctp_make_init(asoc, bp, GFP_ATOMIC, sizeof(bht)); + if (!reply) + goto nomem; + + sctp_addto_chunk(reply, sizeof(bht), &bht); + + /* Cast away the const modifier, as we want to just + * rerun it through as a sideffect. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_COUNTER_INC, + SCTP_COUNTER(SCTP_COUNTER_INIT_ERROR)); + + /* If we've sent any data bundled with COOKIE-ECHO we need to + * resend. + */ + list_for_each(pos, &asoc->peer.transport_addr_list) { + t = list_entry(pos, struct sctp_transport, transports); + sctp_add_cmd_sf(commands, SCTP_CMD_RETRAN, SCTP_TRANSPORT(t)); + } + + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE)); + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_COOKIE_WAIT)); + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT)); + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Process an ABORT. + * + * Section: 9.1 + * After checking the Verification Tag, the receiving endpoint shall + * remove the association from its record, and shall report the + * termination to its upper layer. + * + * Verification Tag: 8.5.1 Exceptions in Verification Tag Rules + * B) Rules for packet carrying ABORT: + * + * - The endpoint shall always fill in the Verification Tag field of the + * outbound packet with the destination endpoint's tag value if it + * is known. + * + * - If the ABORT is sent in response to an OOTB packet, the endpoint + * MUST follow the procedure described in Section 8.4. + * + * - The receiver MUST accept the packet if the Verification Tag + * matches either its own tag, OR the tag of its peer. Otherwise, the + * receiver MUST silently discard the packet and take no further + * action. + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + __u16 error = SCTP_ERROR_NO_ERROR; + + if (!sctp_vtag_verify_either(chunk, asoc)) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + if (chunk && (ntohs(chunk->chunk_hdr->length) >= + (sizeof(struct sctp_chunkhdr) + + sizeof(struct sctp_errhdr)))) + error = ((sctp_errhdr_t *)chunk->skb->data)->cause; + + /* ASSOC_FAILED will DELETE_TCB. */ + sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_U32(error)); + SCTP_INC_STATS(SctpAborteds); + SCTP_DEC_STATS(SctpCurrEstab); + + /* BUG? This does not look complete... */ + return SCTP_DISPOSITION_ABORT; +} + +/* + * Process an ABORT. (COOKIE-WAIT state) + * + * See sctp_sf_do_9_1_abort() above. + */ +sctp_disposition_t sctp_sf_cookie_wait_abort(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + __u16 error = SCTP_ERROR_NO_ERROR; + + if (!sctp_vtag_verify_either(chunk, asoc)) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + SCTP_INC_STATS(SctpAborteds); + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT)); + + if (chunk && (ntohs(chunk->chunk_hdr->length) >= + (sizeof(struct sctp_chunkhdr) + + sizeof(struct sctp_errhdr)))) + error = ((sctp_errhdr_t *)chunk->skb->data)->cause; + + /* CMD_INIT_FAILED will DELETE_TCB. */ + sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED, SCTP_U32(error)); + + return SCTP_DISPOSITION_ABORT; +} + +/* + * Process an ABORT. (COOKIE-ECHOED state) + * + * See sctp_sf_do_9_1_abort() above. + */ +sctp_disposition_t sctp_sf_cookie_echoed_abort(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* There is a single T1 timer, so we should be able to use + * common function with the COOKIE-WAIT state. + */ + return sctp_sf_cookie_wait_abort(ep, asoc, type, arg, commands); +} + +/* + * sctp_sf_do_9_2_shut + * + * Section: 9.2 + * Upon the reception of the SHUTDOWN, the peer endpoint shall + * - enter the SHUTDOWN-RECEIVED state, + * + * - stop accepting new data from its SCTP user + * + * - verify, by checking the Cumulative TSN Ack field of the chunk, + * that all its outstanding DATA chunks have been received by the + * SHUTDOWN sender. + * + * Once an endpoint as reached the SHUTDOWN-RECEIVED state it MUST NOT + * send a SHUTDOWN in response to a ULP request. And should discard + * subsequent SHUTDOWN chunks. + * + * If there are still outstanding DATA chunks left, the SHUTDOWN + * receiver shall continue to follow normal data transmission + * procedures defined in Section 6 until all outstanding DATA chunks + * are acknowledged; however, the SHUTDOWN receiver MUST NOT accept + * new data from its SCTP user. + * + * Verification Tag: 8.5 Verification Tag [Normal verification] + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_shutdownhdr_t *sdh; + sctp_disposition_t disposition; + + /* Convert the elaborate header. */ + sdh = (sctp_shutdownhdr_t *)chunk->skb->data; + skb_pull(chunk->skb, sizeof(sctp_shutdownhdr_t)); + chunk->subh.shutdown_hdr = sdh; + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. If the received + * Verification Tag value does not match the receiver's own + * tag value, the receiver shall silently discard the packet... + */ + if (ntohl(chunk->sctp_hdr->vtag) != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + /* Upon the reception of the SHUTDOWN, the peer endpoint shall + * - enter the SHUTDOWN-RECEIVED state, + * - stop accepting new data from its SCTP user + * + * [This is implicit in the new state.] + */ + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_SHUTDOWN_RECEIVED)); + disposition = SCTP_DISPOSITION_CONSUME; + + if (sctp_outq_is_empty(&asoc->outqueue)) { + disposition = sctp_sf_do_9_2_shutdown_ack(ep, asoc, type, + arg, commands); + } + + /* - verify, by checking the Cumulative TSN Ack field of the + * chunk, that all its outstanding DATA chunks have been + * received by the SHUTDOWN sender. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_CTSN, + SCTP_U32(chunk->subh.shutdown_hdr->cum_tsn_ack)); + return disposition; +} + +/* RFC 2960 9.2 + * If an endpoint is in SHUTDOWN-ACK-SENT state and receives an INIT chunk + * (e.g., if the SHUTDOWN COMPLETE was lost) with source and destination + * transport addresses (either in the IP addresses or in the INIT chunk) + * that belong to this association, it should discard the INIT chunk and + * retransmit the SHUTDOWN ACK chunk. + */ +sctp_disposition_t sctp_sf_do_9_2_reshutack(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = (sctp_chunk_t *) arg; + sctp_chunk_t *reply; + + reply = sctp_make_shutdown_ack(asoc, chunk); + if (NULL == reply) + goto nomem; + + /* Set the transport for the SHUTDOWN ACK chunk and the timeout for + * the T2-SHUTDOWN timer. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_SETUP_T2, SCTP_CHUNK(reply)); + + /* and restart the T2-shutdown timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + + return SCTP_DISPOSITION_CONSUME; +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * sctp_sf_do_ecn_cwr + * + * Section: Appendix A: Explicit Congestion Notification + * + * CWR: + * + * RFC 2481 details a specific bit for a sender to send in the header of + * its next outbound TCP segment to indicate to its peer that it has + * reduced its congestion window. This is termed the CWR bit. For + * SCTP the same indication is made by including the CWR chunk. + * This chunk contains one data element, i.e. the TSN number that + * was sent in the ECNE chunk. This element represents the lowest + * TSN number in the datagram that was originally marked with the + * CE bit. + * + * Verification Tag: 8.5 Verification Tag [Normal verification] + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_ecn_cwr(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_cwrhdr_t *cwr; + sctp_chunk_t *chunk = arg; + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. If the received + * Verification Tag value does not match the receiver's own + * tag value, the receiver shall silently discard the packet... + */ + if (ntohl(chunk->sctp_hdr->vtag) != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + cwr = (sctp_cwrhdr_t *) chunk->skb->data; + skb_pull(chunk->skb, sizeof(sctp_cwrhdr_t)); + + cwr->lowest_tsn = ntohl(cwr->lowest_tsn); + + /* Does this CWR ack the last sent congestion notification? */ + if (TSN_lte(asoc->last_ecne_tsn, cwr->lowest_tsn)) { + /* Stop sending ECNE. */ + sctp_add_cmd_sf(commands, + SCTP_CMD_ECN_CWR, + SCTP_U32(cwr->lowest_tsn)); + } + return SCTP_DISPOSITION_CONSUME; +} + +/* + * sctp_sf_do_ecne + * + * Section: Appendix A: Explicit Congestion Notification + * + * ECN-Echo + * + * RFC 2481 details a specific bit for a receiver to send back in its + * TCP acknowledgements to notify the sender of the Congestion + * Experienced (CE) bit having arrived from the network. For SCTP this + * same indication is made by including the ECNE chunk. This chunk + * contains one data element, i.e. the lowest TSN associated with the IP + * datagram marked with the CE bit..... + * + * Verification Tag: 8.5 Verification Tag [Normal verification] + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_ecne(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_ecnehdr_t *ecne; + sctp_chunk_t *chunk = arg; + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. If the received + * Verification Tag value does not match the receiver's own + * tag value, the receiver shall silently discard the packet... + */ + if (ntohl(chunk->sctp_hdr->vtag) != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + ecne = (sctp_ecnehdr_t *) chunk->skb->data; + skb_pull(chunk->skb, sizeof(sctp_ecnehdr_t)); + + /* If this is a newer ECNE than the last CWR packet we sent out */ + sctp_add_cmd_sf(commands, SCTP_CMD_ECN_ECNE, + SCTP_U32(ntohl(ecne->lowest_tsn))); + + return SCTP_DISPOSITION_CONSUME; +} + +/* + * Section: 6.2 Acknowledgement on Reception of DATA Chunks + * + * The SCTP endpoint MUST always acknowledge the reception of each valid + * DATA chunk. + * + * The guidelines on delayed acknowledgement algorithm specified in + * Section 4.2 of [RFC2581] SHOULD be followed. Specifically, an + * acknowledgement SHOULD be generated for at least every second packet + * (not every second DATA chunk) received, and SHOULD be generated within + * 200 ms of the arrival of any unacknowledged DATA chunk. In some + * situations it may be beneficial for an SCTP transmitter to be more + * conservative than the algorithms detailed in this document allow. + * However, an SCTP transmitter MUST NOT be more aggressive than the + * following algorithms allow. + * + * A SCTP receiver MUST NOT generate more than one SACK for every + * incoming packet, other than to update the offered window as the + * receiving application consumes new data. + * + * Verification Tag: 8.5 Verification Tag [Normal verification] + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_datahdr_t *data_hdr; + sctp_chunk_t *err; + size_t datalen; + sctp_verb_t deliver; + int tmp; + __u32 tsn; + + /* RFC 2960 8.5 Verification Tag + * + * When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. + */ + if (ntohl(chunk->sctp_hdr->vtag) != asoc->c.my_vtag) { + sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG, + SCTP_NULL()); + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + } + + data_hdr = chunk->subh.data_hdr = (sctp_datahdr_t *)chunk->skb->data; + skb_pull(chunk->skb, sizeof(sctp_datahdr_t)); + + tsn = ntohl(data_hdr->tsn); + + SCTP_DEBUG_PRINTK("eat_data: TSN 0x%x.\n", tsn); + SCTP_DEBUG_PRINTK("eat_data: skb->head %p.\n", chunk->skb->head); + + /* ASSERT: Now skb->data is really the user data. */ + + /* Process ECN based congestion. + * + * Since the chunk structure is reused for all chunks within + * a packet, we use ecn_ce_done to track if we've already + * done CE processing for this packet. + * + * We need to do ECN processing even if we plan to discard the + * chunk later. + */ + + if (!chunk->ecn_ce_done) { + chunk->ecn_ce_done = 1; + if (INET_ECN_is_ce(chunk->skb->nh.iph->tos) && + asoc->peer.ecn_capable) { + /* Do real work as sideffect. */ + sctp_add_cmd_sf(commands, SCTP_CMD_ECN_CE, + SCTP_U32(tsn)); + } + } + + tmp = sctp_tsnmap_check(&asoc->peer.tsn_map, tsn); + if (tmp < 0) { + /* The TSN is too high--silently discard the chunk and + * count on it getting retransmitted later. + */ + goto discard_noforce; + } else if (tmp > 0) { + /* This is a duplicate. Record it. */ + sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_DUP, SCTP_U32(tsn)); + goto discard_force; + } + + /* This is a new TSN. */ + + /* Discard if there is no room in the receive window. + * Actually, allow a little bit of overflow (up to a MTU). + */ + datalen = ntohs(chunk->chunk_hdr->length); + datalen -= sizeof(sctp_data_chunk_t); + + deliver = SCTP_CMD_CHUNK_ULP; + + /* Think about partial delivery. */ + if ((datalen >= asoc->rwnd) && (!asoc->ulpq.pd_mode)) { + + /* Even if we don't accept this chunk there is + * memory pressure. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_PART_DELIVER, SCTP_NULL()); + } + + /* Spill over rwnd a little bit. Note: While allowed, this spill over + * seems a bit troublesome in that frag_point varies based on + * PMTU. In cases, such as loopback, this might be a rather + * large spill over. + */ + if (asoc->rwnd_over || (datalen > asoc->rwnd + asoc->frag_point)) { + + /* If this is the next TSN, consider reneging to make + * room. Note: Playing nice with a confused sender. A + * malicious sender can still eat up all our buffer + * space and in the future we may want to detect and + * do more drastic reneging. + */ + if (sctp_tsnmap_has_gap(&asoc->peer.tsn_map) && + (sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map) + 1) == tsn) { + SCTP_DEBUG_PRINTK("Reneging for tsn:%u\n", tsn); + deliver = SCTP_CMD_RENEGE; + } else { + SCTP_DEBUG_PRINTK("Discard tsn: %u len: %Zd, " + "rwnd: %d\n", tsn, datalen, + asoc->rwnd); + goto discard_force; + } + } + + /* + * Section 3.3.10.9 No User Data (9) + * + * Cause of error + * --------------- + * No User Data: This error cause is returned to the originator of a + * DATA chunk if a received DATA chunk has no user data. + */ + if (unlikely(0 == datalen)) { + err = sctp_make_abort_no_data(asoc, chunk, tsn); + if (err) { + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(err)); + } + /* We are going to ABORT, so we might as well stop + * processing the rest of the chunks in the packet. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL()); + sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, + SCTP_U32(SCTP_ERROR_NO_DATA)); + SCTP_INC_STATS(SctpAborteds); + SCTP_DEC_STATS(SctpCurrEstab); + return SCTP_DISPOSITION_CONSUME; + } + + /* If definately accepting the DATA chunk, record its TSN, otherwise + * wait for renege processing. + */ + if (SCTP_CMD_CHUNK_ULP == deliver) + sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_TSN, SCTP_U32(tsn)); + + /* Note: Some chunks may get overcounted (if we drop) or overcounted + * if we renege and the chunk arrives again. + */ + if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) + SCTP_INC_STATS(SctpInUnorderChunks); + else + SCTP_INC_STATS(SctpInOrderChunks); + + /* RFC 2960 6.5 Stream Identifier and Stream Sequence Number + * + * If an endpoint receive a DATA chunk with an invalid stream + * identifier, it shall acknowledge the reception of the DATA chunk + * following the normal procedure, immediately send an ERROR chunk + * with cause set to "Invalid Stream Identifier" (See Section 3.3.10) + * and discard the DATA chunk. + */ + if (ntohs(data_hdr->stream) >= asoc->c.sinit_max_instreams) { + err = sctp_make_op_error(asoc, chunk, SCTP_ERROR_INV_STRM, + &data_hdr->stream, + sizeof(data_hdr->stream)); + if (err) + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(err)); + goto discard_noforce; + } + + /* Send the data up to the user. Note: Schedule the + * SCTP_CMD_CHUNK_ULP cmd before the SCTP_CMD_GEN_SACK, as the SACK + * chunk needs the updated rwnd. + */ + sctp_add_cmd_sf(commands, deliver, SCTP_CHUNK(chunk)); + + if (asoc->autoclose) { + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, + SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE)); + } + + /* If this is the last chunk in a packet, we need to count it + * toward sack generation. Note that we need to SACK every + * OTHER packet containing data chunks, EVEN IF WE DISCARD + * THEM. We elect to NOT generate SACK's if the chunk fails + * the verification tag test. + * + * RFC 2960 6.2 Acknowledgement on Reception of DATA Chunks + * + * The SCTP endpoint MUST always acknowledge the reception of + * each valid DATA chunk. + * + * The guidelines on delayed acknowledgement algorithm + * specified in Section 4.2 of [RFC2581] SHOULD be followed. + * Specifically, an acknowledgement SHOULD be generated for at + * least every second packet (not every second DATA chunk) + * received, and SHOULD be generated within 200 ms of the + * arrival of any unacknowledged DATA chunk. In some + * situations it may be beneficial for an SCTP transmitter to + * be more conservative than the algorithms detailed in this + * document allow. However, an SCTP transmitter MUST NOT be + * more aggressive than the following algorithms allow. + */ + if (chunk->end_of_packet) { + sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE()); + + /* Start the SACK timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, + SCTP_TO(SCTP_EVENT_TIMEOUT_SACK)); + } + + return SCTP_DISPOSITION_CONSUME; + +discard_force: + /* RFC 2960 6.2 Acknowledgement on Reception of DATA Chunks + * + * When a packet arrives with duplicate DATA chunk(s) and with + * no new DATA chunk(s), the endpoint MUST immediately send a + * SACK with no delay. If a packet arrives with duplicate + * DATA chunk(s) bundled with new DATA chunks, the endpoint + * MAY immediately send a SACK. Normally receipt of duplicate + * DATA chunks will occur when the original SACK chunk was lost + * and the peer's RTO has expired. The duplicate TSN number(s) + * SHOULD be reported in the SACK as duplicate. + */ + /* In our case, we split the MAY SACK advice up whether or not + * the last chunk is a duplicate.' + */ + if (chunk->end_of_packet) + sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE()); + return SCTP_DISPOSITION_DISCARD; + +discard_noforce: + if (chunk->end_of_packet) { + sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE()); + + /* Start the SACK timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, + SCTP_TO(SCTP_EVENT_TIMEOUT_SACK)); + } + return SCTP_DISPOSITION_DISCARD; +} + +/* + * sctp_sf_eat_data_fast_4_4 + * + * Section: 4 (4) + * (4) In SHUTDOWN-SENT state the endpoint MUST acknowledge any received + * DATA chunks without delay. + * + * Verification Tag: 8.5 Verification Tag [Normal verification] + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_eat_data_fast_4_4(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_datahdr_t *data_hdr; + sctp_chunk_t *err; + size_t datalen; + int tmp; + __u32 tsn; + + /* RFC 2960 8.5 Verification Tag + * + * When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. + */ + if (ntohl(chunk->sctp_hdr->vtag) != asoc->c.my_vtag) { + sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG, + SCTP_NULL()); + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + } + + data_hdr = chunk->subh.data_hdr = (sctp_datahdr_t *) chunk->skb->data; + skb_pull(chunk->skb, sizeof(sctp_datahdr_t)); + + tsn = ntohl(data_hdr->tsn); + + SCTP_DEBUG_PRINTK("eat_data: TSN 0x%x.\n", tsn); + + /* ASSERT: Now skb->data is really the user data. */ + + /* Process ECN based congestion. + * + * Since the chunk structure is reused for all chunks within + * a packet, we use ecn_ce_done to track if we've already + * done CE processing for this packet. + * + * We need to do ECN processing even if we plan to discard the + * chunk later. + */ + if (!chunk->ecn_ce_done) { + chunk->ecn_ce_done = 1; + if (INET_ECN_is_ce(chunk->skb->nh.iph->tos) && + asoc->peer.ecn_capable) { + /* Do real work as sideffect. */ + sctp_add_cmd_sf(commands, SCTP_CMD_ECN_CE, + SCTP_U32(tsn)); + } + } + + tmp = sctp_tsnmap_check(&asoc->peer.tsn_map, tsn); + if (tmp < 0) { + /* The TSN is too high--silently discard the chunk and + * count on it getting retransmitted later. + */ + goto gen_shutdown; + } else if (tmp > 0) { + /* This is a duplicate. Record it. */ + sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_DUP, SCTP_U32(tsn)); + goto gen_shutdown; + } + + /* This is a new TSN. */ + + datalen = ntohs(chunk->chunk_hdr->length); + datalen -= sizeof(sctp_data_chunk_t); + + /* + * Section 3.3.10.9 No User Data (9) + * + * Cause of error + * --------------- + * No User Data: This error cause is returned to the originator of a + * DATA chunk if a received DATA chunk has no user data. + */ + if (unlikely(0 == datalen)) { + err = sctp_make_abort_no_data(asoc, chunk, tsn); + if (err) { + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(err)); + } + /* We are going to ABORT, so we might as well stop + * processing the rest of the chunks in the packet. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL()); + sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, + SCTP_U32(SCTP_ERROR_NO_DATA)); + SCTP_INC_STATS(SctpAborteds); + SCTP_DEC_STATS(SctpCurrEstab); + return SCTP_DISPOSITION_CONSUME; + } + + /* We are accepting this DATA chunk. */ + + /* Record the fact that we have received this TSN. */ + sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_TSN, SCTP_U32(tsn)); + + if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) + SCTP_INC_STATS(SctpInUnorderChunks); + else + SCTP_INC_STATS(SctpInOrderChunks); + + /* RFC 2960 6.5 Stream Identifier and Stream Sequence Number + * + * If an endpoint receive a DATA chunk with an invalid stream + * identifier, it shall acknowledge the reception of the DATA chunk + * following the normal procedure, immediately send an ERROR chunk + * with cause set to "Invalid Stream Identifier" (See Section 3.3.10) + * and discard the DATA chunk. + */ + if (ntohs(data_hdr->stream) >= asoc->c.sinit_max_instreams) { + err = sctp_make_op_error(asoc, chunk, SCTP_ERROR_INV_STRM, + &data_hdr->stream, + sizeof(data_hdr->stream)); + if (err) { + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(err)); + } + } + + /* Go a head and force a SACK, since we are shutting down. */ +gen_shutdown: + /* Implementor's Guide. + * + * While in SHUTDOWN-SENT state, the SHUTDOWN sender MUST immediately + * respond to each received packet containing one or more DATA chunk(s) + * with a SACK, a SHUTDOWN chunk, and restart the T2-shutdown timer + */ + if (chunk->end_of_packet) { + /* We must delay the chunk creation since the cumulative + * TSN has not been updated yet. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SHUTDOWN, SCTP_NULL()); + sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE()); + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + } + return SCTP_DISPOSITION_CONSUME; +} + +/* + * Section: 6.2 Processing a Received SACK + * D) Any time a SACK arrives, the endpoint performs the following: + * + * i) If Cumulative TSN Ack is less than the Cumulative TSN Ack Point, + * then drop the SACK. Since Cumulative TSN Ack is monotonically + * increasing, a SACK whose Cumulative TSN Ack is less than the + * Cumulative TSN Ack Point indicates an out-of-order SACK. + * + * ii) Set rwnd equal to the newly received a_rwnd minus the number + * of bytes still outstanding after processing the Cumulative TSN Ack + * and the Gap Ack Blocks. + * + * iii) If the SACK is missing a TSN that was previously + * acknowledged via a Gap Ack Block (e.g., the data receiver + * reneged on the data), then mark the corresponding DATA chunk + * as available for retransmit: Mark it as missing for fast + * retransmit as described in Section 7.2.4 and if no retransmit + * timer is running for the destination address to which the DATA + * chunk was originally transmitted, then T3-rtx is started for + * that destination address. + * + * Verification Tag: 8.5 Verification Tag [Normal verification] + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_eat_sack_6_2(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_sackhdr_t *sackh; + __u32 ctsn; + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. ... + */ + if (ntohl(chunk->sctp_hdr->vtag) != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + /* Pull the SACK chunk from the data buffer */ + sackh = sctp_sm_pull_sack(chunk); + chunk->subh.sack_hdr = sackh; + ctsn = ntohl(sackh->cum_tsn_ack); + + /* i) If Cumulative TSN Ack is less than the Cumulative TSN + * Ack Point, then drop the SACK. Since Cumulative TSN + * Ack is monotonically increasing, a SACK whose + * Cumulative TSN Ack is less than the Cumulative TSN Ack + * Point indicates an out-of-order SACK. + */ + if (TSN_lt(ctsn, asoc->ctsn_ack_point)) { + SCTP_DEBUG_PRINTK("ctsn %x\n", ctsn); + SCTP_DEBUG_PRINTK("ctsn_ack_point %x\n", asoc->ctsn_ack_point); + return SCTP_DISPOSITION_DISCARD; + } + + /* Return this SACK for further processing. */ + sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_SACK, SCTP_SACKH(sackh)); + + /* Note: We do the rest of the work on the PROCESS_SACK + * sideeffect. + */ + return SCTP_DISPOSITION_CONSUME; +} + +/* + * Generate an ABORT in response to a packet. + * + * Section: 8.4 Handle "Out of the blue" Packets + * + * 8) The receiver should respond to the sender of the OOTB packet + * with an ABORT. When sending the ABORT, the receiver of the + * OOTB packet MUST fill in the Verification Tag field of the + * outbound packet with the value found in the Verification Tag + * field of the OOTB packet and set the T-bit in the Chunk Flags + * to indicate that no TCB was found. After sending this ABORT, + * the receiver of the OOTB packet shall discard the OOTB packet + * and take no further action. + * + * Verification Tag: + * + * The return value is the disposition of the chunk. +*/ +sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + struct sctp_packet *packet = NULL; + sctp_chunk_t *chunk = arg; + sctp_chunk_t *abort; + + packet = sctp_ootb_pkt_new(asoc, chunk); + + if (packet) { + /* Make an ABORT. The T bit will be set if the asoc + * is NULL. + */ + abort = sctp_make_abort(asoc, chunk, 0); + if (!abort) { + sctp_ootb_pkt_free(packet); + return SCTP_DISPOSITION_NOMEM; + } + + /* Set the skb to the belonging sock for accounting. */ + abort->skb->sk = ep->base.sk; + + sctp_packet_append_chunk(packet, abort); + + sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, + SCTP_PACKET(packet)); + + SCTP_INC_STATS(SctpOutCtrlChunks); + + return SCTP_DISPOSITION_CONSUME; + } + + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Received an ERROR chunk from peer. Generate SCTP_REMOTE_ERROR + * event as ULP notification for each cause included in the chunk. + * + * API 5.3.1.3 - SCTP_REMOTE_ERROR + * + * The return value is the disposition of the chunk. +*/ +sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + struct sctp_ulpevent *ev; + + while (chunk->chunk_end > chunk->skb->data) { + ev = sctp_ulpevent_make_remote_error(asoc, chunk, 0, + GFP_ATOMIC); + if (!ev) + goto nomem; + + if (!sctp_add_cmd(commands, SCTP_CMD_EVENT_ULP, + SCTP_ULPEVENT(ev))) { + sctp_ulpevent_free(ev); + goto nomem; + } + } + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Process an inbound SHUTDOWN ACK. + * + * From Section 9.2: + * Upon the receipt of the SHUTDOWN ACK, the SHUTDOWN sender shall + * stop the T2-shutdown timer, send a SHUTDOWN COMPLETE chunk to its + * peer, and remove all record of the association. + * + * The return value is the disposition. + */ +sctp_disposition_t sctp_sf_do_9_2_final(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + sctp_chunk_t *reply; + struct sctp_ulpevent *ev; + + /* 10.2 H) SHUTDOWN COMPLETE notification + * + * When SCTP completes the shutdown procedures (section 9.2) this + * notification is passed to the upper layer. + */ + ev = sctp_ulpevent_make_assoc_change(asoc, 0, SCTP_SHUTDOWN_COMP, + 0, 0, 0, GFP_ATOMIC); + if (!ev) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); + + /* Upon the receipt of the SHUTDOWN ACK, the SHUTDOWN sender shall + * stop the T2-shutdown timer, + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); + + /* ...send a SHUTDOWN COMPLETE chunk to its peer, */ + reply = sctp_make_shutdown_complete(asoc, chunk); + if (!reply) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + SCTP_INC_STATS(SctpShutdowns); + SCTP_DEC_STATS(SctpCurrEstab); + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + + /* ...and remove all record of the association. */ + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); + return SCTP_DISPOSITION_DELETE_TCB; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * RFC 2960, 8.4 - Handle "Out of the blue" Packets + * 5) If the packet contains a SHUTDOWN ACK chunk, the receiver should + * respond to the sender of the OOTB packet with a SHUTDOWN COMPLETE. + * When sending the SHUTDOWN COMPLETE, the receiver of the OOTB + * packet must fill in the Verification Tag field of the outbound + * packet with the Verification Tag received in the SHUTDOWN ACK and + * set the T-bit in the Chunk Flags to indicate that no TCB was + * found. Otherwise, + * + * 8) The receiver should respond to the sender of the OOTB packet with + * an ABORT. When sending the ABORT, the receiver of the OOTB packet + * MUST fill in the Verification Tag field of the outbound packet + * with the value found in the Verification Tag field of the OOTB + * packet and set the T-bit in the Chunk Flags to indicate that no + * TCB was found. After sending this ABORT, the receiver of the OOTB + * packet shall discard the OOTB packet and take no further action. + */ +sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + struct sk_buff *skb = chunk->skb; + sctp_chunkhdr_t *ch; + __u8 *ch_end; + int ootb_shut_ack = 0; + + SCTP_INC_STATS(SctpOutOfBlues); + + ch = (sctp_chunkhdr_t *) chunk->chunk_hdr; + do { + ch_end = ((__u8 *)ch) + WORD_ROUND(ntohs(ch->length)); + + if (SCTP_CID_SHUTDOWN_ACK == ch->type) + ootb_shut_ack = 1; + + ch = (sctp_chunkhdr_t *) ch_end; + } while (ch_end < skb->tail); + + if (ootb_shut_ack) + sctp_sf_shut_8_4_5(ep, asoc, type, arg, commands); + else + sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands); + + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); +} + +/* + * Handle an "Out of the blue" SHUTDOWN ACK. + * + * Section: 8.4 5) + * 5) If the packet contains a SHUTDOWN ACK chunk, the receiver should + * respond to the sender of the OOTB packet with a SHUTDOWN COMPLETE. + * When sending the SHUTDOWN COMPLETE, the receiver of the OOTB packet + * must fill in the Verification Tag field of the outbound packet with + * the Verification Tag received in the SHUTDOWN ACK and set the + * T-bit in the Chunk Flags to indicate that no TCB was found. + * + * Inputs + * (endpoint, asoc, type, arg, commands) + * + * Outputs + * (sctp_disposition_t) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + struct sctp_packet *packet = NULL; + sctp_chunk_t *chunk = arg; + sctp_chunk_t *shut; + + packet = sctp_ootb_pkt_new(asoc, chunk); + + if (packet) { + /* Make an SHUTDOWN_COMPLETE. + * The T bit will be set if the asoc is NULL. + */ + shut = sctp_make_shutdown_complete(asoc, chunk); + if (!shut) { + sctp_ootb_pkt_free(packet); + return SCTP_DISPOSITION_NOMEM; + } + + /* Set the skb to the belonging sock for accounting. */ + shut->skb->sk = ep->base.sk; + + sctp_packet_append_chunk(packet, shut); + + sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, + SCTP_PACKET(packet)); + + SCTP_INC_STATS(SctpOutCtrlChunks); + + return SCTP_DISPOSITION_CONSUME; + } + + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Handle SHUTDOWN ACK in COOKIE_ECHOED or COOKIE_WAIT state. + * + * Verification Tag: 8.5.1 E) Rules for packet carrying a SHUTDOWN ACK + * If the receiver is in COOKIE-ECHOED or COOKIE-WAIT state the + * procedures in section 8.4 SHOULD be followed, in other words it + * should be treated as an Out Of The Blue packet. + * [This means that we do NOT check the Verification Tag on these + * chunks. --piggy ] + * + */ +sctp_disposition_t sctp_sf_do_8_5_1_E_sa(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* Although we do have an association in this case, it corresponds + * to a restarted association. So the packet is treated as an OOTB + * packet and the state function that handles OOTB SHUTDOWN_ACK is + * called with a NULL association. + */ + return sctp_sf_shut_8_4_5(ep, NULL, type, arg, commands); +} + +/* + * Process an unknown chunk. + * + * Section: 3.2. Also, 2.1 in the implementor's guide. + * + * Chunk Types are encoded such that the highest-order two bits specify + * the action that must be taken if the processing endpoint does not + * recognize the Chunk Type. + * + * 00 - Stop processing this SCTP packet and discard it, do not process + * any further chunks within it. + * + * 01 - Stop processing this SCTP packet and discard it, do not process + * any further chunks within it, and report the unrecognized + * chunk in an 'Unrecognized Chunk Type'. + * + * 10 - Skip this chunk and continue processing. + * + * 11 - Skip this chunk and continue processing, but report in an ERROR + * Chunk using the 'Unrecognized Chunk Type' cause of error. + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_unk_chunk(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *unk_chunk = arg; + sctp_chunk_t *err_chunk; + sctp_chunkhdr_t *hdr; + + SCTP_DEBUG_PRINTK("Processing the unknown chunk id %d.\n", type.chunk); + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. If the received + * Verification Tag value does not match the receiver's own + * tag value, the receiver shall silently discard the packet. + */ + if (ntohl(unk_chunk->sctp_hdr->vtag) != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + switch (type.chunk & SCTP_CID_ACTION_MASK) { + case SCTP_CID_ACTION_DISCARD: + /* Discard the packet. */ + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + break; + case SCTP_CID_ACTION_DISCARD_ERR: + /* Discard the packet. */ + sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + /* Generate an ERROR chunk as response. */ + hdr = unk_chunk->chunk_hdr; + err_chunk = sctp_make_op_error(asoc, unk_chunk, + SCTP_ERROR_UNKNOWN_CHUNK, hdr, + WORD_ROUND(ntohs(hdr->length))); + if (err_chunk) { + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(err_chunk)); + } + return SCTP_DISPOSITION_CONSUME; + break; + case SCTP_CID_ACTION_SKIP: + /* Skip the chunk. */ + return SCTP_DISPOSITION_DISCARD; + break; + case SCTP_CID_ACTION_SKIP_ERR: + /* Generate an ERROR chunk as response. */ + hdr = unk_chunk->chunk_hdr; + err_chunk = sctp_make_op_error(asoc, unk_chunk, + SCTP_ERROR_UNKNOWN_CHUNK, hdr, + WORD_ROUND(ntohs(hdr->length))); + if (err_chunk) { + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, + SCTP_CHUNK(err_chunk)); + } + /* Skip the chunk. */ + return SCTP_DISPOSITION_CONSUME; + break; + default: + break; + } + + return SCTP_DISPOSITION_DISCARD; +} + +/* + * Discard the chunk. + * + * Section: 0.2, 5.2.3, 5.2.5, 5.2.6, 6.0, 8.4.6, 8.5.1c, 9.2 + * [Too numerous to mention...] + * Verification Tag: No verification needed. + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_discard_chunk(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + SCTP_DEBUG_PRINTK("Chunk %d is discarded\n", type.chunk); + return SCTP_DISPOSITION_DISCARD; +} + +/* + * Discard the whole packet. + * + * Section: 8.4 2) + * + * 2) If the OOTB packet contains an ABORT chunk, the receiver MUST + * silently discard the OOTB packet and take no further action. + * Otherwise, + * + * Verification Tag: No verification necessary + * + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_pdiscard(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL()); + + return SCTP_DISPOSITION_CONSUME; +} + +#if 0 +/* + * We did something stupid but got lucky. Namely, we sent a HEARTBEAT + * before the association was all the way up and we did NOT get an + * ABORT. + * + * Log the fact and then process normally. + * + * Section: Not specified + * Verification Tag: 8.5 Verification Tag [Normal verification] + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t lucky(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. ... + */ + if (chunk->sctp_hdr->vtag != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} +#endif /* 0 */ + +#if 0 +/* + * The other end is doing something very stupid. We'll ignore them + * after logging their idiocy. :-) + * + * Section: Not specified + * Verification Tag: 8.5 Verification Tag [Normal verification] + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t other_stupid(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + + /* 8.5 When receiving an SCTP packet, the endpoint MUST ensure + * that the value in the Verification Tag field of the + * received SCTP packet matches its own Tag. ... + */ + if (chunk->sctp_hdr->vtag != asoc->c.my_vtag) + return sctp_sf_pdiscard(ep, asoc, type, arg, commands); + + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} +#endif /* 0 */ + +/* + * The other end is violating protocol. + * + * Section: Not specified + * Verification Tag: Not specified + * Inputs + * (endpoint, asoc, chunk) + * + * Outputs + * (asoc, reply_msg, msg_up, timers, counters) + * + * We simply tag the chunk as a violation. The state machine will log + * the violation and continue. + */ +sctp_disposition_t sctp_sf_violation(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + return SCTP_DISPOSITION_VIOLATION; +} + +/*************************************************************************** + * These are the state functions for handling primitive (Section 10) events. + ***************************************************************************/ +/* + * sctp_sf_do_prm_asoc + * + * Section: 10.1 ULP-to-SCTP + * B) Associate + * + * Format: ASSOCIATE(local SCTP instance name, destination transport addr, + * outbound stream count) + * -> association id [,destination transport addr list] [,outbound stream + * count] + * + * This primitive allows the upper layer to initiate an association to a + * specific peer endpoint. + * + * The peer endpoint shall be specified by one of the transport addresses + * which defines the endpoint (see Section 1.4). If the local SCTP + * instance has not been initialized, the ASSOCIATE is considered an + * error. + * [This is not relevant for the kernel implementation since we do all + * initialization at boot time. It we hadn't initialized we wouldn't + * get anywhere near this code.] + * + * An association id, which is a local handle to the SCTP association, + * will be returned on successful establishment of the association. If + * SCTP is not able to open an SCTP association with the peer endpoint, + * an error is returned. + * [In the kernel implementation, the struct sctp_association needs to + * be created BEFORE causing this primitive to run.] + * + * Other association parameters may be returned, including the + * complete destination transport addresses of the peer as well as the + * outbound stream count of the local endpoint. One of the transport + * address from the returned destination addresses will be selected by + * the local endpoint as default primary path for sending SCTP packets + * to this peer. The returned "destination transport addr list" can + * be used by the ULP to change the default primary path or to force + * sending a packet to a specific transport address. [All of this + * stuff happens when the INIT ACK arrives. This is a NON-BLOCKING + * function.] + * + * Mandatory attributes: + * + * o local SCTP instance name - obtained from the INITIALIZE operation. + * [This is the argument asoc.] + * o destination transport addr - specified as one of the transport + * addresses of the peer endpoint with which the association is to be + * established. + * [This is asoc->peer.active_path.] + * o outbound stream count - the number of outbound streams the ULP + * would like to open towards this peer endpoint. + * [BUG: This is not currently implemented.] + * Optional attributes: + * + * None. + * + * The return value is a disposition. + */ +sctp_disposition_t sctp_sf_do_prm_asoc(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *repl; + + /* The comment below says that we enter COOKIE-WAIT AFTER + * sending the INIT, but that doesn't actually work in our + * implementation... + */ + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_COOKIE_WAIT)); + + /* RFC 2960 5.1 Normal Establishment of an Association + * + * A) "A" first sends an INIT chunk to "Z". In the INIT, "A" + * must provide its Verification Tag (Tag_A) in the Initiate + * Tag field. Tag_A SHOULD be a random number in the range of + * 1 to 4294967295 (see 5.3.1 for Tag value selection). ... + */ + + repl = sctp_make_init(asoc, &asoc->base.bind_addr, GFP_ATOMIC, 0); + if (!repl) + goto nomem; + + /* Cast away the const modifier, as we want to just + * rerun it through as a sideffect. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, + SCTP_ASOC((struct sctp_association *) asoc)); + + /* After sending the INIT, "A" starts the T1-init timer and + * enters the COOKIE-WAIT state. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT)); + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Process the SEND primitive. + * + * Section: 10.1 ULP-to-SCTP + * E) Send + * + * Format: SEND(association id, buffer address, byte count [,context] + * [,stream id] [,life time] [,destination transport address] + * [,unorder flag] [,no-bundle flag] [,payload protocol-id] ) + * -> result + * + * This is the main method to send user data via SCTP. + * + * Mandatory attributes: + * + * o association id - local handle to the SCTP association + * + * o buffer address - the location where the user message to be + * transmitted is stored; + * + * o byte count - The size of the user data in number of bytes; + * + * Optional attributes: + * + * o context - an optional 32 bit integer that will be carried in the + * sending failure notification to the ULP if the transportation of + * this User Message fails. + * + * o stream id - to indicate which stream to send the data on. If not + * specified, stream 0 will be used. + * + * o life time - specifies the life time of the user data. The user data + * will not be sent by SCTP after the life time expires. This + * parameter can be used to avoid efforts to transmit stale + * user messages. SCTP notifies the ULP if the data cannot be + * initiated to transport (i.e. sent to the destination via SCTP's + * send primitive) within the life time variable. However, the + * user data will be transmitted if SCTP has attempted to transmit a + * chunk before the life time expired. + * + * o destination transport address - specified as one of the destination + * transport addresses of the peer endpoint to which this packet + * should be sent. Whenever possible, SCTP should use this destination + * transport address for sending the packets, instead of the current + * primary path. + * + * o unorder flag - this flag, if present, indicates that the user + * would like the data delivered in an unordered fashion to the peer + * (i.e., the U flag is set to 1 on all DATA chunks carrying this + * message). + * + * o no-bundle flag - instructs SCTP not to bundle this user data with + * other outbound DATA chunks. SCTP MAY still bundle even when + * this flag is present, when faced with network congestion. + * + * o payload protocol-id - A 32 bit unsigned integer that is to be + * passed to the peer indicating the type of payload protocol data + * being transmitted. This value is passed as opaque data by SCTP. + * + * The return value is the disposition. + */ +sctp_disposition_t sctp_sf_do_prm_send(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = arg; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(chunk)); + return SCTP_DISPOSITION_CONSUME; +} + +/* + * Process the SHUTDOWN primitive. + * + * Section: 10.1: + * C) Shutdown + * + * Format: SHUTDOWN(association id) + * -> result + * + * Gracefully closes an association. Any locally queued user data + * will be delivered to the peer. The association will be terminated only + * after the peer acknowledges all the SCTP packets sent. A success code + * will be returned on successful termination of the association. If + * attempting to terminate the association results in a failure, an error + * code shall be returned. + * + * Mandatory attributes: + * + * o association id - local handle to the SCTP association + * + * Optional attributes: + * + * None. + * + * The return value is the disposition. + */ +sctp_disposition_t sctp_sf_do_9_2_prm_shutdown( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + int disposition; + + /* From 9.2 Shutdown of an Association + * Upon receipt of the SHUTDOWN primitive from its upper + * layer, the endpoint enters SHUTDOWN-PENDING state and + * remains there until all outstanding data has been + * acknowledged by its peer. The endpoint accepts no new data + * from its upper layer, but retransmits data to the far end + * if necessary to fill gaps. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_SHUTDOWN_PENDING)); + + /* sctpimpguide-05 Section 2.12.2 + * The sender of the SHUTDOWN MAY also start an overall guard timer + * 'T5-shutdown-guard' to bound the overall time for shutdown sequence. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, + SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); + + disposition = SCTP_DISPOSITION_CONSUME; + if (sctp_outq_is_empty(&asoc->outqueue)) { + disposition = sctp_sf_do_9_2_start_shutdown(ep, asoc, type, + arg, commands); + } + return disposition; +} + +/* + * Process the ABORT primitive. + * + * Section: 10.1: + * C) Abort + * + * Format: Abort(association id [, cause code]) + * -> result + * + * Ungracefully closes an association. Any locally queued user data + * will be discarded and an ABORT chunk is sent to the peer. A success code + * will be returned on successful abortion of the association. If + * attempting to abort the association results in a failure, an error + * code shall be returned. + * + * Mandatory attributes: + * + * o association id - local handle to the SCTP association + * + * Optional attributes: + * + * o cause code - reason of the abort to be passed to the peer + * + * None. + * + * The return value is the disposition. + */ +sctp_disposition_t sctp_sf_do_9_1_prm_abort( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* From 9.1 Abort of an Association + * Upon receipt of the ABORT primitive from its upper + * layer, the endpoint enters CLOSED state and + * discard all outstanding data has been + * acknowledged by its peer. The endpoint accepts no new data + * from its upper layer, but retransmits data to the far end + * if necessary to fill gaps. + */ + struct msghdr *msg = arg; + sctp_chunk_t *abort; + sctp_disposition_t retval; + + retval = SCTP_DISPOSITION_CONSUME; + + /* Generate ABORT chunk to send the peer. */ + abort = sctp_make_abort_user(asoc, NULL, msg); + if (!abort) + retval = SCTP_DISPOSITION_NOMEM; + else + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort)); + + /* Even if we can't send the ABORT due to low memory delete the + * TCB. This is a departure from our typical NOMEM handling. + */ + + /* Delete the established association. */ + sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, + SCTP_U32(SCTP_ERROR_USER_ABORT)); + + SCTP_INC_STATS(SctpAborteds); + SCTP_DEC_STATS(SctpCurrEstab); + + return retval; +} + +/* We tried an illegal operation on an association which is closed. */ +sctp_disposition_t sctp_sf_error_closed(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_ERROR, SCTP_ERROR(-EINVAL)); + return SCTP_DISPOSITION_CONSUME; +} + +/* We tried an illegal operation on an association which is shutting + * down. + */ +sctp_disposition_t sctp_sf_error_shutdown(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_ERROR, + SCTP_ERROR(-ESHUTDOWN)); + return SCTP_DISPOSITION_CONSUME; +} + +/* + * sctp_cookie_wait_prm_shutdown + * + * Section: 4 Note: 2 + * Verification Tag: + * Inputs + * (endpoint, asoc) + * + * The RFC does not explicitly address this issue, but is the route through the + * state table when someone issues a shutdown while in COOKIE_WAIT state. + * + * Outputs + * (timers) + */ +sctp_disposition_t sctp_sf_cookie_wait_prm_shutdown( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT)); + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + + SCTP_INC_STATS(SctpShutdowns); + + sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL()); + + return SCTP_DISPOSITION_DELETE_TCB; +} + +/* + * sctp_cookie_echoed_prm_shutdown + * + * Section: 4 Note: 2 + * Verification Tag: + * Inputs + * (endpoint, asoc) + * + * The RFC does not explcitly address this issue, but is the route through the + * state table when someone issues a shutdown while in COOKIE_ECHOED state. + * + * Outputs + * (timers) + */ +sctp_disposition_t sctp_sf_cookie_echoed_prm_shutdown( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, sctp_cmd_seq_t *commands) +{ + /* There is a single T1 timer, so we should be able to use + * common function with the COOKIE-WAIT state. + */ + return sctp_sf_cookie_wait_prm_shutdown(ep, asoc, type, arg, commands); +} + +/* + * sctp_sf_cookie_wait_prm_abort + * + * Section: 4 Note: 2 + * Verification Tag: + * Inputs + * (endpoint, asoc) + * + * The RFC does not explicitly address this issue, but is the route through the + * state table when someone issues an abort while in COOKIE_WAIT state. + * + * Outputs + * (timers) + */ +sctp_disposition_t sctp_sf_cookie_wait_prm_abort( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + struct msghdr *msg = arg; + sctp_chunk_t *abort; + sctp_disposition_t retval; + + /* Stop T1-init timer */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT)); + retval = SCTP_DISPOSITION_CONSUME; + + /* Generate ABORT chunk to send the peer */ + abort = sctp_make_abort_user(asoc, NULL, msg); + if (!abort) + retval = SCTP_DISPOSITION_NOMEM; + else + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort)); + + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_CLOSED)); + + SCTP_INC_STATS(SctpAborteds); + + /* Even if we can't send the ABORT due to low memory delete the + * TCB. This is a departure from our typical NOMEM handling. + */ + + /* Delete the established association. */ + sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED, + SCTP_U32(SCTP_ERROR_USER_ABORT)); + + return retval; +} + +/* + * sctp_sf_cookie_echoed_prm_abort + * + * Section: 4 Note: 3 + * Verification Tag: + * Inputs + * (endpoint, asoc) + * + * The RFC does not explcitly address this issue, but is the route through the + * state table when someone issues an abort while in COOKIE_ECHOED state. + * + * Outputs + * (timers) + */ +sctp_disposition_t sctp_sf_cookie_echoed_prm_abort( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* There is a single T1 timer, so we should be able to use + * common function with the COOKIE-WAIT state. + */ + return sctp_sf_cookie_wait_prm_abort(ep, asoc, type, arg, commands); +} + +/* + * sctp_sf_shutdown_pending_prm_abort + * + * Inputs + * (endpoint, asoc) + * + * The RFC does not explicitly address this issue, but is the route through the + * state table when someone issues an abort while in SHUTDOWN-PENDING state. + * + * Outputs + * (timers) + */ +sctp_disposition_t sctp_sf_shutdown_pending_prm_abort( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* Stop the T5-shutdown guard timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); + + return sctp_sf_do_9_1_prm_abort(ep, asoc, type, arg, commands); +} + +/* + * sctp_sf_shutdown_sent_prm_abort + * + * Inputs + * (endpoint, asoc) + * + * The RFC does not explicitly address this issue, but is the route through the + * state table when someone issues an abort while in SHUTDOWN-SENT state. + * + * Outputs + * (timers) + */ +sctp_disposition_t sctp_sf_shutdown_sent_prm_abort( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* Stop the T2-shutdown timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + + /* Stop the T5-shutdown guard timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); + + return sctp_sf_do_9_1_prm_abort(ep, asoc, type, arg, commands); +} + +/* + * sctp_sf_cookie_echoed_prm_abort + * + * Inputs + * (endpoint, asoc) + * + * The RFC does not explcitly address this issue, but is the route through the + * state table when someone issues an abort while in COOKIE_ECHOED state. + * + * Outputs + * (timers) + */ +sctp_disposition_t sctp_sf_shutdown_ack_sent_prm_abort( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + /* The same T2 timer, so we should be able to use + * common function with the SHUTDOWN-SENT state. + */ + return sctp_sf_shutdown_sent_prm_abort(ep, asoc, type, arg, commands); +} + +/* + * Process the REQUESTHEARTBEAT primitive + * + * 10.1 ULP-to-SCTP + * J) Request Heartbeat + * + * Format: REQUESTHEARTBEAT(association id, destination transport address) + * + * -> result + * + * Instructs the local endpoint to perform a HeartBeat on the specified + * destination transport address of the given association. The returned + * result should indicate whether the transmission of the HEARTBEAT + * chunk to the destination address is successful. + * + * Mandatory attributes: + * + * o association id - local handle to the SCTP association + * + * o destination transport address - the transport address of the + * association on which a heartbeat should be issued. + */ +sctp_disposition_t sctp_sf_do_prm_requestheartbeat( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + return sctp_sf_heartbeat(ep, asoc, type, (struct sctp_transport *)arg, + commands); +} + +/* + * Ignore the primitive event + * + * The return value is the disposition of the primitive. + */ +sctp_disposition_t sctp_sf_ignore_primitive( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + SCTP_DEBUG_PRINTK("Primitive type %d is ignored.\n", type.primitive); + return SCTP_DISPOSITION_DISCARD; +} + +/*************************************************************************** + * These are the state functions for the OTHER events. + ***************************************************************************/ + +/* + * Start the shutdown negotiation. + * + * From Section 9.2: + * Once all its outstanding data has been acknowledged, the endpoint + * shall send a SHUTDOWN chunk to its peer including in the Cumulative + * TSN Ack field the last sequential TSN it has received from the peer. + * It shall then start the T2-shutdown timer and enter the SHUTDOWN-SENT + * state. If the timer expires, the endpoint must re-send the SHUTDOWN + * with the updated last sequential TSN received from its peer. + * + * The return value is the disposition. + */ +sctp_disposition_t sctp_sf_do_9_2_start_shutdown( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *reply; + + /* Once all its outstanding data has been acknowledged, the + * endpoint shall send a SHUTDOWN chunk to its peer including + * in the Cumulative TSN Ack field the last sequential TSN it + * has received from the peer. + */ + reply = sctp_make_shutdown(asoc); + if (!reply) + goto nomem; + + /* Set the transport for the SHUTDOWN chunk and the timeout for the + * T2-shutdown timer. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_SETUP_T2, SCTP_CHUNK(reply)); + + /* It shall then start the T2-shutdown timer */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + + if (asoc->autoclose) + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE)); + + /* and enter the SHUTDOWN-SENT state. */ + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_SHUTDOWN_SENT)); + + /* sctp-implguide 2.10 Issues with Heartbeating and failover + * + * HEARTBEAT ... is discontinued after sending either SHUTDOWN + * or SHUTDOWN-ACK. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL()); + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Generate a SHUTDOWN ACK now that everything is SACK'd. + * + * From Section 9.2: + * + * If it has no more outstanding DATA chunks, the SHUTDOWN receiver + * shall send a SHUTDOWN ACK and start a T2-shutdown timer of its own, + * entering the SHUTDOWN-ACK-SENT state. If the timer expires, the + * endpoint must re-send the SHUTDOWN ACK. + * + * The return value is the disposition. + */ +sctp_disposition_t sctp_sf_do_9_2_shutdown_ack( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *chunk = (sctp_chunk_t *) arg; + sctp_chunk_t *reply; + + /* If it has no more outstanding DATA chunks, the SHUTDOWN receiver + * shall send a SHUTDOWN ACK ... + */ + reply = sctp_make_shutdown_ack(asoc, chunk); + if (!reply) + goto nomem; + + /* Set the transport for the SHUTDOWN ACK chunk and the timeout for + * the T2-shutdown timer. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_SETUP_T2, SCTP_CHUNK(reply)); + + /* and start/restart a T2-shutdown timer of its own, */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + + if (asoc->autoclose) + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE)); + + /* Enter the SHUTDOWN-ACK-SENT state. */ + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_SHUTDOWN_ACK_SENT)); + + /* sctp-implguide 2.10 Issues with Heartbeating and failover + * + * HEARTBEAT ... is discontinued after sending either SHUTDOWN + * or SHUTDOWN-ACK. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL()); + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* + * Ignore the event defined as other + * + * The return value is the disposition of the event. + */ +sctp_disposition_t sctp_sf_ignore_other(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + SCTP_DEBUG_PRINTK("The event other type %d is ignored\n", type.other); + return SCTP_DISPOSITION_DISCARD; +} + +/************************************************************ + * These are the state functions for handling timeout events. + ************************************************************/ + +/* + * RTX Timeout + * + * Section: 6.3.3 Handle T3-rtx Expiration + * + * Whenever the retransmission timer T3-rtx expires for a destination + * address, do the following: + * [See below] + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + struct sctp_transport *transport = arg; + + if (asoc->overall_error_count >= asoc->overall_error_threshold) { + /* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */ + sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, + SCTP_U32(SCTP_ERROR_NO_ERROR)); + SCTP_INC_STATS(SctpAborteds); + SCTP_DEC_STATS(SctpCurrEstab); + return SCTP_DISPOSITION_DELETE_TCB; + } + + /* E1) For the destination address for which the timer + * expires, adjust its ssthresh with rules defined in Section + * 7.2.3 and set the cwnd <- MTU. + */ + + /* E2) For the destination address for which the timer + * expires, set RTO <- RTO * 2 ("back off the timer"). The + * maximum value discussed in rule C7 above (RTO.max) may be + * used to provide an upper bound to this doubling operation. + */ + + /* E3) Determine how many of the earliest (i.e., lowest TSN) + * outstanding DATA chunks for the address for which the + * T3-rtx has expired will fit into a single packet, subject + * to the MTU constraint for the path corresponding to the + * destination transport address to which the retransmission + * is being sent (this may be different from the address for + * which the timer expires [see Section 6.4]). Call this + * value K. Bundle and retransmit those K DATA chunks in a + * single packet to the destination endpoint. + * + * Note: Any DATA chunks that were sent to the address for + * which the T3-rtx timer expired but did not fit in one MTU + * (rule E3 above), should be marked for retransmission and + * sent as soon as cwnd allows (normally when a SACK arrives). + */ + + /* NB: Rules E4 and F1 are implicit in R1. */ + sctp_add_cmd_sf(commands, SCTP_CMD_RETRAN, SCTP_TRANSPORT(transport)); + + /* Do some failure management (Section 8.2). */ + sctp_add_cmd_sf(commands, SCTP_CMD_STRIKE, SCTP_TRANSPORT(transport)); + + return SCTP_DISPOSITION_CONSUME; +} + +/* + * Generate delayed SACK on timeout + * + * Section: 6.2 Acknowledgement on Reception of DATA Chunks + * + * The guidelines on delayed acknowledgement algorithm specified in + * Section 4.2 of [RFC2581] SHOULD be followed. Specifically, an + * acknowledgement SHOULD be generated for at least every second packet + * (not every second DATA chunk) received, and SHOULD be generated + * within 200 ms of the arrival of any unacknowledged DATA chunk. In + * some situations it may be beneficial for an SCTP transmitter to be + * more conservative than the algorithms detailed in this document + * allow. However, an SCTP transmitter MUST NOT be more aggressive than + * the following algorithms allow. + */ +sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE()); + return SCTP_DISPOSITION_CONSUME; +} + +/* + * sctp_sf_t1_timer_expire + * + * Section: 4 Note: 2 + * Verification Tag: + * Inputs + * (endpoint, asoc) + * + * RFC 2960 Section 4 Notes + * 2) If the T1-init timer expires, the endpoint MUST retransmit INIT + * and re-start the T1-init timer without changing state. This MUST + * be repeated up to 'Max.Init.Retransmits' times. After that, the + * endpoint MUST abort the initialization process and report the + * error to SCTP user. + * + * 3) If the T1-cookie timer expires, the endpoint MUST retransmit + * COOKIE ECHO and re-start the T1-cookie timer without changing + * state. This MUST be repeated up to 'Max.Init.Retransmits' times. + * After that, the endpoint MUST abort the initialization process and + * report the error to SCTP user. + * + * Outputs + * (timers, events) + * + */ +sctp_disposition_t sctp_sf_t1_timer_expire(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *repl; + sctp_bind_addr_t *bp; + sctp_event_timeout_t timer = (sctp_event_timeout_t) arg; + int timeout; + int attempts; + + timeout = asoc->timeouts[timer]; + attempts = asoc->counters[SCTP_COUNTER_INIT_ERROR] + 1; + repl = NULL; + + SCTP_DEBUG_PRINTK("Timer T1 expired.\n"); + + if ((timeout < asoc->max_init_timeo) && + (attempts < asoc->max_init_attempts)) { + switch (timer) { + case SCTP_EVENT_TIMEOUT_T1_INIT: + bp = (sctp_bind_addr_t *) &asoc->base.bind_addr; + repl = sctp_make_init(asoc, bp, GFP_ATOMIC, 0); + break; + + case SCTP_EVENT_TIMEOUT_T1_COOKIE: + repl = sctp_make_cookie_echo(asoc, NULL); + break; + + default: + BUG(); + break; + }; + + if (!repl) + goto nomem; + + /* Issue a sideeffect to do the needed accounting. */ + sctp_add_cmd_sf(commands, SCTP_CMD_INIT_RESTART, + SCTP_TO(timer)); + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); + } else { + sctp_add_cmd_sf(commands, SCTP_CMD_INIT_FAILED, + SCTP_U32(SCTP_ERROR_NO_ERROR)); + return SCTP_DISPOSITION_DELETE_TCB; + } + + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* RFC2960 9.2 If the timer expires, the endpoint must re-send the SHUTDOWN + * with the updated last sequential TSN received from its peer. + * + * An endpoint should limit the number of retransmissions of the + * SHUTDOWN chunk to the protocol parameter 'Association.Max.Retrans'. + * If this threshold is exceeded the endpoint should destroy the TCB and + * MUST report the peer endpoint unreachable to the upper layer (and + * thus the association enters the CLOSED state). The reception of any + * packet from its peer (i.e. as the peer sends all of its queued DATA + * chunks) should clear the endpoint's retransmission count and restart + * the T2-Shutdown timer, giving its peer ample opportunity to transmit + * all of its queued DATA chunks that have not yet been sent. + */ +sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *reply = NULL; + + SCTP_DEBUG_PRINTK("Timer T2 expired.\n"); + if (asoc->overall_error_count >= asoc->overall_error_threshold) { + /* Note: CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */ + sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, + SCTP_U32(SCTP_ERROR_NO_ERROR)); + SCTP_INC_STATS(SctpAborteds); + SCTP_DEC_STATS(SctpCurrEstab); + return SCTP_DISPOSITION_DELETE_TCB; + } + + switch (asoc->state) { + case SCTP_STATE_SHUTDOWN_SENT: + reply = sctp_make_shutdown(asoc); + break; + + case SCTP_STATE_SHUTDOWN_ACK_SENT: + reply = sctp_make_shutdown_ack(asoc, NULL); + break; + + default: + BUG(); + break; + }; + + if (!reply) + goto nomem; + + /* Do some failure management (Section 8.2). */ + sctp_add_cmd_sf(commands, SCTP_CMD_STRIKE, + SCTP_TRANSPORT(asoc->shutdown_last_sent_to)); + + /* Set the transport for the SHUTDOWN/ACK chunk and the timeout for + * the T2-shutdown timer. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_SETUP_T2, SCTP_CHUNK(reply)); + + /* Restart the T2-shutdown timer. */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, + SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN)); + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + return SCTP_DISPOSITION_CONSUME; + +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* sctpimpguide-05 Section 2.12.2 + * The sender of the SHUTDOWN MAY also start an overall guard timer + * 'T5-shutdown-guard' to bound the overall time for shutdown sequence. + * At the expiration of this timer the sender SHOULD abort the association + * by sending an ABORT chunk. + */ +sctp_disposition_t sctp_sf_t5_timer_expire(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + sctp_chunk_t *reply = NULL; + + SCTP_DEBUG_PRINTK("Timer T5 expired.\n"); + + reply = sctp_make_abort(asoc, NULL, 0); + if (!reply) + goto nomem; + + sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply)); + sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, + SCTP_U32(SCTP_ERROR_NO_ERROR)); + + return SCTP_DISPOSITION_DELETE_TCB; +nomem: + return SCTP_DISPOSITION_NOMEM; +} + +/* Handle expiration of AUTOCLOSE timer. When the autoclose timer expires, + * the association is automatically closed by starting the shutdown process. + * The work that needs to be done is same as when SHUTDOWN is initiated by + * the user. So this routine looks same as sctp_sf_do_9_2_prm_shutdown(). + */ +sctp_disposition_t sctp_sf_autoclose_timer_expire( + const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + int disposition; + + /* From 9.2 Shutdown of an Association + * Upon receipt of the SHUTDOWN primitive from its upper + * layer, the endpoint enters SHUTDOWN-PENDING state and + * remains there until all outstanding data has been + * acknowledged by its peer. The endpoint accepts no new data + * from its upper layer, but retransmits data to the far end + * if necessary to fill gaps. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, + SCTP_STATE(SCTP_STATE_SHUTDOWN_PENDING)); + + /* sctpimpguide-05 Section 2.12.2 + * The sender of the SHUTDOWN MAY also start an overall guard timer + * 'T5-shutdown-guard' to bound the overall time for shutdown sequence. + */ + sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START, + SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD)); + disposition = SCTP_DISPOSITION_CONSUME; + if (sctp_outq_is_empty(&asoc->outqueue)) { + disposition = sctp_sf_do_9_2_start_shutdown(ep, asoc, type, + arg, commands); + } + return disposition; +} + +/***************************************************************************** + * These are sa state functions which could apply to all types of events. + ****************************************************************************/ + +/* + * This table entry is not implemented. + * + * Inputs + * (endpoint, asoc, chunk) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_not_impl(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + return SCTP_DISPOSITION_NOT_IMPL; +} + +/* + * This table entry represents a bug. + * + * Inputs + * (endpoint, asoc, chunk) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_bug(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + return SCTP_DISPOSITION_BUG; +} + +/* + * This table entry represents the firing of a timer in the wrong state. + * Since timer deletion cannot be guaranteed a timer 'may' end up firing + * when the association is in the wrong state. This event should + * be ignored, so as to prevent any rearming of the timer. + * + * Inputs + * (endpoint, asoc, chunk) + * + * The return value is the disposition of the chunk. + */ +sctp_disposition_t sctp_sf_timer_ignore(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_subtype_t type, + void *arg, + sctp_cmd_seq_t *commands) +{ + SCTP_DEBUG_PRINTK("Timer %d ignored.\n", type.chunk); + return SCTP_DISPOSITION_CONSUME; +} + +/******************************************************************** + * 2nd Level Abstractions + ********************************************************************/ + +/* Pull the SACK chunk based on the SACK header. */ +sctp_sackhdr_t *sctp_sm_pull_sack(sctp_chunk_t *chunk) +{ + sctp_sackhdr_t *sack; + __u16 num_blocks; + __u16 num_dup_tsns; + + /* FIXME: Protect ourselves from reading too far into + * the skb from a bogus sender. + */ + sack = (sctp_sackhdr_t *) chunk->skb->data; + skb_pull(chunk->skb, sizeof(sctp_sackhdr_t)); + + num_blocks = ntohs(sack->num_gap_ack_blocks); + num_dup_tsns = ntohs(sack->num_dup_tsns); + + skb_pull(chunk->skb, (num_blocks + num_dup_tsns) * sizeof(__u32)); + return sack; +} + +/* Create an ABORT packet to be sent as a response, with the specified + * error causes. + */ +struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + sctp_chunk_t *chunk, + const void *payload, + size_t paylen) +{ + struct sctp_packet *packet; + sctp_chunk_t *abort; + + packet = sctp_ootb_pkt_new(asoc, chunk); + + if (packet) { + /* Make an ABORT. + * The T bit will be set if the asoc is NULL. + */ + abort = sctp_make_abort(asoc, chunk, paylen); + if (!abort) { + sctp_ootb_pkt_free(packet); + return NULL; + } + /* Add specified error causes, i.e., payload, to the + * end of the chunk. + */ + sctp_addto_chunk(abort, paylen, payload); + + /* Set the skb to the belonging sock for accounting. */ + abort->skb->sk = ep->base.sk; + + sctp_packet_append_chunk(packet, abort); + + } + + return packet; +} + +/* Allocate a packet for responding in the OOTB conditions. */ +struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc, + const sctp_chunk_t *chunk) +{ + struct sctp_packet *packet; + struct sctp_transport *transport; + __u16 sport; + __u16 dport; + __u32 vtag; + + /* Get the source and destination port from the inbound packet. */ + sport = ntohs(chunk->sctp_hdr->dest); + dport = ntohs(chunk->sctp_hdr->source); + + /* The V-tag is going to be the same as the inbound packet if no + * association exists, otherwise, use the peer's vtag. + */ + if (asoc) { + vtag = asoc->peer.i.init_tag; + } else { + /* Special case the INIT as there is no vtag yet. */ + if (SCTP_CID_INIT == chunk->chunk_hdr->type) { + sctp_init_chunk_t *init; + init = (sctp_init_chunk_t *)chunk->chunk_hdr; + vtag = ntohl(init->init_hdr.init_tag); + } else { + vtag = ntohl(chunk->sctp_hdr->vtag); + } + } + + /* Make a transport for the bucket, Eliza... */ + transport = sctp_transport_new(sctp_source(chunk), GFP_ATOMIC); + + if (!transport) + goto nomem; + + /* Allocate a new packet for sending the response. */ + packet = t_new(struct sctp_packet, GFP_ATOMIC); + if (!packet) + goto nomem_packet; + + /* Cache a route for the transport with the chunk's destination as + * the source address. + */ + sctp_transport_route(transport, (union sctp_addr *)&chunk->dest, + sctp_sk(sctp_get_ctl_sock())); + + packet = sctp_packet_init(packet, transport, sport, dport); + packet = sctp_packet_config(packet, vtag, 0, NULL); + + return packet; + +nomem_packet: + sctp_transport_free(transport); +nomem: + return NULL; +} + +/* Free the packet allocated earlier for responding in the OOTB condition. */ +void sctp_ootb_pkt_free(struct sctp_packet *packet) +{ + sctp_transport_free(packet->transport); + sctp_packet_free(packet); +} + +/* Send a stale cookie error when a invalid COOKIE ECHO chunk is found */ +void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep, + const struct sctp_association *asoc, + const sctp_chunk_t *chunk, + sctp_cmd_seq_t *commands, + sctp_chunk_t *err_chunk) +{ + struct sctp_packet *packet; + + if (err_chunk) { + packet = sctp_ootb_pkt_new(asoc, chunk); + if (packet) { + /* Set the skb to the belonging sock for accounting. */ + err_chunk->skb->sk = ep->base.sk; + sctp_packet_append_chunk(packet, err_chunk); + sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, + SCTP_PACKET(packet)); + SCTP_INC_STATS(SctpOutCtrlChunks); + } else + sctp_free_chunk (err_chunk); + } +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/sm_statetable.c linux-2.4.23-pre8/net/sctp/sm_statetable.c --- linux-2.4.22/net/sctp/sm_statetable.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/sm_statetable.c 2003-10-22 22:49:08.000000000 +0000 @@ -0,0 +1,889 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * + * This file is part of the SCTP kernel reference Implementation + * + * These are the state tables for the SCTP state machine. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Hui Huang + * Daisy Chang + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include + +static sctp_sm_table_entry_t bug = { + .fn = sctp_sf_bug, + .name = "sctp_sf_bug" +}; + +#define DO_LOOKUP(_max, _type, _table) \ + if ((event_subtype._type > (_max))) { \ + printk(KERN_WARNING \ + "sctp table %p possible attack:" \ + " event %d exceeds max %d\n", \ + _table, event_subtype._type, _max); \ + return &bug; \ + } \ + return &_table[event_subtype._type][(int)state]; + +sctp_sm_table_entry_t *sctp_sm_lookup_event(sctp_event_t event_type, + sctp_state_t state, + sctp_subtype_t event_subtype) +{ + switch (event_type) { + case SCTP_EVENT_T_CHUNK: + return sctp_chunk_event_lookup(event_subtype.chunk, state); + break; + case SCTP_EVENT_T_TIMEOUT: + DO_LOOKUP(SCTP_EVENT_TIMEOUT_MAX, timeout, + timeout_event_table); + break; + + case SCTP_EVENT_T_OTHER: + DO_LOOKUP(SCTP_EVENT_OTHER_MAX, other, other_event_table); + break; + + case SCTP_EVENT_T_PRIMITIVE: + DO_LOOKUP(SCTP_EVENT_PRIMITIVE_MAX, primitive, + primitive_event_table); + break; + + default: + /* Yikes! We got an illegal event type. */ + return &bug; + }; +} + +#define TYPE_SCTP_DATA { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_eat_data_6_2, .name = "sctp_sf_eat_data_6_2"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_eat_data_6_2, .name = "sctp_sf_eat_data_6_2"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_eat_data_fast_4_4, .name = "sctp_sf_eat_data_fast_4_4"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ +} /* TYPE_SCTP_DATA */ + +#define TYPE_SCTP_INIT { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_do_5_1B_init, .name = "sctp_sf_do_5_1B_init"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_do_5_2_1_siminit, .name = "sctp_sf_do_5_2_1_siminit"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_do_5_2_1_siminit, .name = "sctp_sf_do_5_2_1_siminit"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_do_5_2_2_dupinit, .name = "sctp_sf_do_5_2_2_dupinit"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_do_9_2_reshutack, .name = "sctp_sf_do_9_2_reshutack"}, \ +} /* TYPE_SCTP_INIT */ + +#define TYPE_SCTP_INIT_ACK { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_do_5_1C_ack, .name = "sctp_sf_do_5_1C_ack"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ +} /* TYPE_SCTP_INIT_ACK */ + +#define TYPE_SCTP_SACK { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_eat_sack_6_2, .name = "sctp_sf_eat_sack_6_2"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ +} /* TYPE_SCTP_SACK */ + +#define TYPE_SCTP_HEARTBEAT { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + /* This should not happen, but we are nice. */ \ + {.fn = sctp_sf_beat_8_3, .name = "sctp_sf_beat_8_3"}, \ +} /* TYPE_SCTP_HEARTBEAT */ + +#define TYPE_SCTP_HEARTBEAT_ACK { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_backbeat_8_3, .name = "sctp_sf_backbeat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ +} /* TYPE_SCTP_HEARTBEAT_ACK */ + +#define TYPE_SCTP_ABORT { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_pdiscard, .name = "sctp_sf_pdiscard"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_cookie_wait_abort, .name = "sctp_sf_cookie_wait_abort"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_cookie_echoed_abort, \ + .name = "sctp_sf_cookie_echoed_abort"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_9_1_abort, .name = "sctp_sf_do_9_1_abort"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_shutdown_pending_abort, \ + .name = "sctp_sf_shutdown_pending_abort"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_shutdown_sent_abort, \ + .name = "sctp_sf_shutdown_sent_abort"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_do_9_1_abort, .name = "sctp_sf_do_9_1_abort"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_shutdown_ack_sent_abort, \ + .name = "sctp_sf_shutdown_ack_sent_abort"}, \ +} /* TYPE_SCTP_ABORT */ + +#define TYPE_SCTP_SHUTDOWN { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_9_2_shutdown, .name = "sctp_sf_do_9_2_shutdown"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_do_9_2_shutdown_ack, \ + .name = "sctp_sf_do_9_2_shutdown_ack"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ +} /* TYPE_SCTP_SHUTDOWN */ + +#define TYPE_SCTP_SHUTDOWN_ACK { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_do_8_5_1_E_sa, .name = "sctp_sf_do_8_5_1_E_sa"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_do_8_5_1_E_sa, .name = "sctp_sf_do_8_5_1_E_sa"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_do_9_2_final, .name = "sctp_sf_do_9_2_final"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_violation, .name = "sctp_sf_violation"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_do_9_2_final, .name = "sctp_sf_do_9_2_final"}, \ +} /* TYPE_SCTP_SHUTDOWN_ACK */ + +#define TYPE_SCTP_ERROR { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_cookie_echoed_err, .name = "sctp_sf_cookie_echoed_err"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_operr_notify, .name = "sctp_sf_operr_notify"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ +} /* TYPE_SCTP_ERROR */ + +#define TYPE_SCTP_COOKIE_ECHO { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_do_5_1D_ce, .name = "sctp_sf_do_5_1D_ce"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_do_5_2_4_dupcook, .name = "sctp_sf_do_5_2_4_dupcook"}, \ +} /* TYPE_SCTP_COOKIE_ECHO */ + +#define TYPE_SCTP_COOKIE_ACK { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_do_5_1E_ca, .name = "sctp_sf_do_5_1E_ca"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ +} /* TYPE_SCTP_COOKIE_ACK */ + +#define TYPE_SCTP_ECN_ECNE { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ +} /* TYPE_SCTP_ECN_ECNE */ + +#define TYPE_SCTP_ECN_CWR { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_do_ecn_cwr, .name = "sctp_sf_do_ecn_cwr"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ +} /* TYPE_SCTP_ECN_CWR */ + +#define TYPE_SCTP_SHUTDOWN_COMPLETE { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_do_4_C, .name = "sctp_sf_do_4_C"}, \ +} /* TYPE_SCTP_SHUTDOWN_COMPLETE */ + +/* The primary index for this table is the chunk type. + * The secondary index for this table is the state. + * + * For base protocol (RFC 2960). + */ +sctp_sm_table_entry_t chunk_event_table[SCTP_NUM_BASE_CHUNK_TYPES][SCTP_STATE_NUM_STATES] = { + TYPE_SCTP_DATA, + TYPE_SCTP_INIT, + TYPE_SCTP_INIT_ACK, + TYPE_SCTP_SACK, + TYPE_SCTP_HEARTBEAT, + TYPE_SCTP_HEARTBEAT_ACK, + TYPE_SCTP_ABORT, + TYPE_SCTP_SHUTDOWN, + TYPE_SCTP_SHUTDOWN_ACK, + TYPE_SCTP_ERROR, + TYPE_SCTP_COOKIE_ECHO, + TYPE_SCTP_COOKIE_ACK, + TYPE_SCTP_ECN_ECNE, + TYPE_SCTP_ECN_CWR, + TYPE_SCTP_SHUTDOWN_COMPLETE, +}; /* state_fn_t chunk_event_table[][] */ + +static sctp_sm_table_entry_t +chunk_event_table_asconf[SCTP_STATE_NUM_STATES] = { + /* SCTP_STATE_EMPTY */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_CLOSED */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_COOKIE_WAIT */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_COOKIE_ECHOED */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_ESTABLISHED */ + {.fn = sctp_sf_discard_chunk, + .name = "sctp_sf_discard_chunk (will be sctp_addip_do_asconf)"}, + /* SCTP_STATE_SHUTDOWN_PENDING */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_SHUTDOWN_SENT */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_SHUTDOWN_RECEIVED */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, +}; /* chunk asconf */ + +static sctp_sm_table_entry_t +chunk_event_table_asconf_ack[SCTP_STATE_NUM_STATES] = { + /* SCTP_STATE_EMPTY */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_CLOSED */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_COOKIE_WAIT */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_COOKIE_ECHOED */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_ESTABLISHED */ + {.fn = sctp_sf_discard_chunk, + .name = "sctp_sf_discard_chunk (will be sctp_addip_do_asconf_ack)"}, + /* SCTP_STATE_SHUTDOWN_PENDING */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_SHUTDOWN_SENT */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_SHUTDOWN_RECEIVED */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ + {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, +}; /* chunk asconf_ack */ + +static sctp_sm_table_entry_t +chunk_event_table_unknown[SCTP_STATE_NUM_STATES] = { + /* SCTP_STATE_EMPTY */ + {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, + /* SCTP_STATE_CLOSED */ + {.fn = sctp_sf_tabort_8_4_8, .name = "sctp_sf_tabort_8_4_8"}, + /* SCTP_STATE_COOKIE_WAIT */ + {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"}, + /* SCTP_STATE_COOKIE_ECHOED */ + {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"}, + /* SCTP_STATE_ESTABLISHED */ + {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"}, + /* SCTP_STATE_SHUTDOWN_PENDING */ + {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"}, + /* SCTP_STATE_SHUTDOWN_SENT */ + {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"}, + /* SCTP_STATE_SHUTDOWN_RECEIVED */ + {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"}, + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ + {.fn = sctp_sf_unk_chunk, .name = "sctp_sf_unk_chunk"}, +}; /* chunk unknown */ + + +#define TYPE_SCTP_PRIMITIVE_ASSOCIATE { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_do_prm_asoc, .name = "sctp_sf_do_prm_asoc"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_not_impl, .name = "sctp_sf_not_impl"}, \ +} /* TYPE_SCTP_PRIMITIVE_ASSOCIATE */ + +#define TYPE_SCTP_PRIMITIVE_SHUTDOWN { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_cookie_wait_prm_shutdown, \ + .name = "sctp_sf_cookie_wait_prm_shutdown"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_cookie_echoed_prm_shutdown, \ + .name = "sctp_sf_cookie_echoed_prm_shutdown"},\ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_9_2_prm_shutdown, \ + .name = "sctp_sf_do_9_2_prm_shutdown"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_ignore_primitive, .name = "sctp_sf_ignore_primitive"}, \ +} /* TYPE_SCTP_PRIMITIVE_SHUTDOWN */ + +#define TYPE_SCTP_PRIMITIVE_ABORT { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_cookie_wait_prm_abort, \ + .name = "sctp_sf_cookie_wait_prm_abort"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_cookie_echoed_prm_abort, \ + .name = "sctp_sf_cookie_echoed_prm_abort"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_9_1_prm_abort, \ + .name = "sctp_sf_do_9_1_prm_abort"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_shutdown_pending_prm_abort, \ + .name = "sctp_sf_shutdown_pending_prm_abort"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_shutdown_sent_prm_abort, \ + .name = "sctp_sf_shutdown_sent_prm_abort"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_do_9_1_prm_abort, \ + .name = "sctp_sf_do_9_1_prm_abort"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_shutdown_ack_sent_prm_abort, \ + .name = "sctp_sf_shutdown_ack_sent_prm_abort"}, \ +} /* TYPE_SCTP_PRIMITIVE_ABORT */ + +#define TYPE_SCTP_PRIMITIVE_SEND { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_prm_send, .name = "sctp_sf_do_prm_send"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_error_shutdown, .name = "sctp_sf_error_shutdown"}, \ +} /* TYPE_SCTP_PRIMITIVE_SEND */ + +#define TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_do_prm_requestheartbeat, \ + .name = "sctp_sf_do_prm_requestheartbeat"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_do_prm_requestheartbeat, \ + .name = "sctp_sf_do_prm_requestheartbeat"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_prm_requestheartbeat, \ + .name = "sctp_sf_do_prm_requestheartbeat"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_do_prm_requestheartbeat, \ + .name = "sctp_sf_do_prm_requestheartbeat"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_do_prm_requestheartbeat, \ + .name = "sctp_sf_do_prm_requestheartbeat"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_do_prm_requestheartbeat, \ + .name = "sctp_sf_do_prm_requestheartbeat"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_do_prm_requestheartbeat, \ + .name = "sctp_sf_do_prm_requestheartbeat"}, \ +} /* TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT */ + + +/* The primary index for this table is the primitive type. + * The secondary index for this table is the state. + */ +sctp_sm_table_entry_t primitive_event_table[SCTP_NUM_PRIMITIVE_TYPES][SCTP_STATE_NUM_STATES] = { + TYPE_SCTP_PRIMITIVE_ASSOCIATE, + TYPE_SCTP_PRIMITIVE_SHUTDOWN, + TYPE_SCTP_PRIMITIVE_ABORT, + TYPE_SCTP_PRIMITIVE_SEND, + TYPE_SCTP_PRIMITIVE_REQUESTHEARTBEAT, +}; + +#define TYPE_SCTP_OTHER_NO_PENDING_TSN { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_do_9_2_start_shutdown, \ + .name = "sctp_do_9_2_start_shutdown"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_do_9_2_shutdown_ack, \ + .name = "sctp_sf_do_9_2_shutdown_ack"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_ignore_other, .name = "sctp_sf_ignore_other"}, \ +} + +sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_STATE_NUM_STATES] = { + TYPE_SCTP_OTHER_NO_PENDING_TSN, +}; + +#define TYPE_SCTP_EVENT_TIMEOUT_NONE { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ +} + +#define TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ +} + +#define TYPE_SCTP_EVENT_TIMEOUT_T1_INIT { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_t1_timer_expire, .name = "sctp_sf_t1_timer_expire"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ +} + +#define TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_t2_timer_expire, .name = "sctp_sf_t2_timer_expire"}, \ +} + +#define TYPE_SCTP_EVENT_TIMEOUT_T3_RTX { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_do_6_3_3_rtx, .name = "sctp_sf_do_6_3_3_rtx"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ +} + +#define TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_t5_timer_expire, .name = "sctp_sf_t5_timer_expire"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ +} + +#define TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_sendbeat_8_3, .name = "sctp_sf_sendbeat_8_3"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ +} + +#define TYPE_SCTP_EVENT_TIMEOUT_SACK { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_do_6_2_sack, .name = "sctp_sf_do_6_2_sack"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ +} + +#define TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE { \ + /* SCTP_STATE_EMPTY */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_CLOSED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_WAIT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_COOKIE_ECHOED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_ESTABLISHED */ \ + {.fn = sctp_sf_autoclose_timer_expire, \ + .name = "sctp_sf_autoclose_timer_expire"}, \ + /* SCTP_STATE_SHUTDOWN_PENDING */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_RECEIVED */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ + /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \ + {.fn = sctp_sf_timer_ignore, .name = "sctp_sf_timer_ignore"}, \ +} + +sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES] = { + TYPE_SCTP_EVENT_TIMEOUT_NONE, + TYPE_SCTP_EVENT_TIMEOUT_T1_COOKIE, + TYPE_SCTP_EVENT_TIMEOUT_T1_INIT, + TYPE_SCTP_EVENT_TIMEOUT_T2_SHUTDOWN, + TYPE_SCTP_EVENT_TIMEOUT_T3_RTX, + TYPE_SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD, + TYPE_SCTP_EVENT_TIMEOUT_HEARTBEAT, + TYPE_SCTP_EVENT_TIMEOUT_SACK, + TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE, +}; + +sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, sctp_state_t state) +{ + if (state > SCTP_STATE_MAX) + return &bug; + + if (cid >= 0 && cid <= SCTP_CID_BASE_MAX) { + return &chunk_event_table[cid][state]; + } + + switch (cid) { + case SCTP_CID_ASCONF: + return &chunk_event_table_asconf[state]; + + case SCTP_CID_ASCONF_ACK: + return &chunk_event_table_asconf_ack[state]; + default: + return &chunk_event_table_unknown[state]; + } +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/socket.c linux-2.4.23-pre8/net/sctp/socket.c --- linux-2.4.22/net/sctp/socket.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/socket.c 2003-10-22 22:47:57.000000000 +0000 @@ -0,0 +1,3639 @@ +/* Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines, Corp. + * Copyright (c) 2001-2003 Intel Corp. + * Copyright (c) 2001-2002 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions interface with the sockets layer to implement the + * SCTP Extensions for the Sockets API. + * + * Note that the descriptions from the specification are USER level + * functions--this file is the functions which populate the struct proto + * for SCTP which is the BOTTOM of the sockets interface. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Narasimha Budihal + * Karl Knutson + * Jon Grimm + * Xingang Guo + * Daisy Chang + * Sridhar Samudrala + * Inaky Perez-Gonzalez + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include /* for sa_family_t */ +#include +#include + +/* WARNING: Please do not remove the SCTP_STATIC attribute to + * any of the functions below as they are used to export functions + * used by a project regression testsuite. + */ + +/* Forward declarations for internal helper functions. */ +static int sctp_writeable(struct sock *sk); +static inline int sctp_wspace(struct sctp_association *asoc); +static inline void sctp_set_owner_w(sctp_chunk_t *chunk); +static void sctp_wfree(struct sk_buff *skb); +static int sctp_wait_for_sndbuf(struct sctp_association *, long *timeo_p, + int msg_len); +static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p); +static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p); +static int sctp_wait_for_accept(struct sock *sk, long timeo); +static inline int sctp_verify_addr(struct sock *, union sctp_addr *, int); +static int sctp_bindx_add(struct sock *, struct sockaddr_storage *, int); +static int sctp_bindx_rem(struct sock *, struct sockaddr_storage *, int); +static int sctp_do_bind(struct sock *, union sctp_addr *, int); +static int sctp_autobind(struct sock *sk); +static void sctp_sock_migrate(struct sock *, struct sock *, + struct sctp_association *, sctp_socket_type_t); +static char *sctp_hmac_alg = SCTP_COOKIE_HMAC_ALG; + +/* Look up the association by its id. If this is not a UDP-style + * socket, the ID field is always ignored. + */ +struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id) +{ + struct sctp_association *asoc = NULL; + + /* If this is not a UDP-style socket, assoc id should be + * ignored. + */ + if (SCTP_SOCKET_UDP != sctp_sk(sk)->type) { + if (!list_empty(&sctp_sk(sk)->ep->asocs)) + asoc = list_entry(sctp_sk(sk)->ep->asocs.next, + struct sctp_association, asocs); + return asoc; + } + + /* First, verify that this is a kernel address. */ + if (sctp_is_valid_kaddr((unsigned long) id)) { + struct sctp_association *temp; + + /* Verify that this _is_ an sctp_association + * data structure and if so, that the socket matches. + */ + temp = (struct sctp_association *)id; + if ((SCTP_ASSOC_EYECATCHER == temp->eyecatcher) && + (temp->base.sk == sk)) + asoc = temp; + } + + return asoc; +} + +/* API 3.1.2 bind() - UDP Style Syntax + * The syntax of bind() is, + * + * ret = bind(int sd, struct sockaddr *addr, int addrlen); + * + * sd - the socket descriptor returned by socket(). + * addr - the address structure (struct sockaddr_in or struct + * sockaddr_in6 [RFC 2553]), + * addrlen - the size of the address structure. + * + * The caller should use struct sockaddr_storage described in RFC 2553 + * to represent addr for portability reason. + */ +int sctp_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) +{ + int retval = 0; + + sctp_lock_sock(sk); + + SCTP_DEBUG_PRINTK("sctp_bind(sk: %p, uaddr: %p, addr_len: %d)\n", + sk, uaddr, addr_len); + + /* Disallow binding twice. */ + if (!sctp_sk(sk)->ep->base.bind_addr.port) + retval = sctp_do_bind(sk, (union sctp_addr *)uaddr, + addr_len); + else + retval = -EINVAL; + + sctp_release_sock(sk); + + return retval; +} + +static long sctp_get_port_local(struct sock *, union sctp_addr *); + +/* Verify this is a valid sockaddr. */ +static struct sctp_af *sctp_sockaddr_af(struct sctp_opt *opt, + union sctp_addr *addr, int len) +{ + struct sctp_af *af; + + /* Check minimum size. */ + if (len < sizeof (struct sockaddr)) + return NULL; + + /* Does this PF support this AF? */ + if (!opt->pf->af_supported(addr->sa.sa_family)) + return NULL; + + /* If we get this far, af is valid. */ + af = sctp_get_af_specific(addr->sa.sa_family); + + if (len < af->sockaddr_len) + return NULL; + + return af; +} + +/* Bind a local address either to an endpoint or to an association. */ +SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) +{ + struct sctp_opt *sp = sctp_sk(sk); + struct sctp_endpoint *ep = sp->ep; + sctp_bind_addr_t *bp = &ep->base.bind_addr; + struct sctp_af *af; + unsigned short snum; + int ret = 0; + + SCTP_DEBUG_PRINTK("sctp_do_bind(sk: %p, newaddr: %p, len: %d)\n", + sk, addr, len); + + /* Common sockaddr verification. */ + af = sctp_sockaddr_af(sp, addr, len); + if (!af) + return -EINVAL; + + /* PF specific bind() address verification. */ + if (!sp->pf->bind_verify(sp, addr)) + return -EADDRNOTAVAIL; + + snum= ntohs(addr->v4.sin_port); + + SCTP_DEBUG_PRINTK("sctp_do_bind: port: %d, new port: %d\n", + bp->port, snum); + + /* We must either be unbound, or bind to the same port. */ + if (bp->port && (snum != bp->port)) { + SCTP_DEBUG_PRINTK("sctp_do_bind:" + " New port %d does not match existing port " + "%d.\n", snum, bp->port); + return -EINVAL; + } + + if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE)) + return -EACCES; + + /* Make sure we are allowed to bind here. + * The function sctp_get_port_local() does duplicate address + * detection. + */ + if ((ret = sctp_get_port_local(sk, addr))) { + if (ret == (long) sk) { + /* This endpoint has a conflicting address. */ + return -EINVAL; + } else { + return -EADDRINUSE; + } + } + + /* Refresh ephemeral port. */ + if (!snum) + snum = (sk)->num; + + /* Add the address to the bind address list. */ + sctp_local_bh_disable(); + sctp_write_lock(&ep->base.addr_lock); + + /* Use GFP_ATOMIC since BHs are disabled. */ + addr->v4.sin_port = ntohs(addr->v4.sin_port); + ret = sctp_add_bind_addr(bp, addr, GFP_ATOMIC); + addr->v4.sin_port = htons(addr->v4.sin_port); + if (!ret && !bp->port) + bp->port = snum; + sctp_write_unlock(&ep->base.addr_lock); + sctp_local_bh_enable(); + + /* Copy back into socket for getsockname() use. */ + if (!ret) { + (sk)->sport = htons((sk)->num); + af->to_sk_saddr(addr, sk); + } + + return ret; +} + +/* API 8.1 sctp_bindx() + * + * The syntax of sctp_bindx() is, + * + * ret = sctp_bindx(int sd, + * struct sockaddr_storage *addrs, + * int addrcnt, + * int flags); + * + * If sd is an IPv4 socket, the addresses passed must be IPv4 addresses. + * If the sd is an IPv6 socket, the addresses passed can either be IPv4 + * or IPv6 addresses. + * + * A single address may be specified as INADDR_ANY or IPV6_ADDR_ANY, see + * section 3.1.2 for this usage. + * + * addrs is a pointer to an array of one or more socket addresses. Each + * address is contained in a struct sockaddr_storage, so each address is + * fixed length. The caller specifies the number of addresses in the + * array with addrcnt. + * + * On success, sctp_bindx() returns 0. On failure, sctp_bindx() returns -1, + * and sets errno to the appropriate error code. [ Editor's note: need + * to fill in all error code? ] + * + * For SCTP, the port given in each socket address must be the same, or + * sctp_bindx() will fail, setting errno to EINVAL . + * + * The flags parameter is formed from the bitwise OR of zero or + * more of the following currently defined flags: + * + * SCTP_BINDX_ADD_ADDR + * SCTP_BINDX_REM_ADDR + * + * SCTP_BIND_ADD_ADDR directs SCTP to add the given addresses to the + * association, and SCTP_BIND_REM_ADDR directs SCTP to remove the given + * addresses from the association. The two flags are mutually exclusive; + * if both are given, sctp_bindx() will fail with EINVAL. A caller may not + * remove all addresses from an association; sctp_bindx() will reject such + * an attempt with EINVAL. + * + * An application can use sctp_bindx(SCTP_BINDX_ADD_ADDR) to associate + * additional addresses with an endpoint after calling bind(). Or use + * sctp_bindx(SCTP_BINDX_REM_ADDR) to remove some addresses a listening + * socket is associated with so that no new association accepted will be + * associated with those addresses. + * + * SCTP_BIND_ADD_ADDR is defined as 0, so that it becomes the default + * behavior for sctp_bindx() when no flags are given. + * + * Adding and removing addresses from a connected association is optional + * functionality. Implementations that do not support this functionality + * should return EOPNOTSUPP. + * + * NOTE: This could be integrated into sctp_setsockopt_bindx(), + * but keeping it this way makes it easier if sometime sys_bindx is + * added. + */ + +/* Unprotected by locks. Call only with socket lock sk->lock held! See + * sctp_bindx() for a lock-protected call. + */ + +static int __sctp_bindx(struct sock *sk, struct sockaddr_storage *addrs, + int addrcnt, int flags) +{ + int retval = 0; + + SCTP_DEBUG_PRINTK("__sctp_bindx(sk: %p, addrs: %p, addrcnt: %d, " + "flags: %s)\n", sk, addrs, addrcnt, + (BINDX_ADD_ADDR == flags) ? "ADD" : + ((BINDX_REM_ADDR == flags) ? "REM" : "BOGUS")); + + switch (flags) { + case BINDX_ADD_ADDR: + retval = sctp_bindx_add(sk, addrs, addrcnt); + break; + + case BINDX_REM_ADDR: + retval = sctp_bindx_rem(sk, addrs, addrcnt); + break; + + default: + retval = -EINVAL; + break; + }; + + return retval; +} + +/* BINDX with locks. + * + * NOTE: Currently unused at all ... + */ +int sctp_bindx(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt, + int flags) +{ + int retval; + + sctp_lock_sock(sk); + retval = __sctp_bindx(sk, addrs, addrcnt, flags); + sctp_release_sock(sk); + + return retval; +} + +/* Add a list of addresses as bind addresses to local endpoint or + * association. + * + * Basically run through each address specified in the addrs/addrcnt + * array/length pair, determine if it is IPv6 or IPv4 and call + * sctp_do_bind() on it. + * + * If any of them fails, then the operation will be reversed and the + * ones that were added will be removed. + * + * Only __sctp_bindx() is supposed to call this function. + */ +int sctp_bindx_add(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt) +{ + int cnt; + int retval = 0; + int addr_len; + + SCTP_DEBUG_PRINTK("sctp_bindx_add (sk: %p, addrs: %p, addrcnt: %d)\n", + sk, addrs, addrcnt); + + for (cnt = 0; cnt < addrcnt; cnt++) { + /* The list may contain either IPv4 or IPv6 address; + * determine the address length for walking thru the list. + */ + switch (((struct sockaddr *)&addrs[cnt])->sa_family) { + case AF_INET: + addr_len = sizeof(struct sockaddr_in); + break; + + case AF_INET6: + addr_len = sizeof(struct sockaddr_in6); + break; + + default: + retval = -EINVAL; + goto err_bindx_add; + }; + + retval = sctp_do_bind(sk, (union sctp_addr *)&addrs[cnt], + addr_len); + +err_bindx_add: + if (retval < 0) { + /* Failed. Cleanup the ones that has been added */ + if (cnt > 0) + sctp_bindx_rem(sk, addrs, cnt); + return retval; + } + } + + /* Notify the peer(s), assuming we have (an) association(s). + * FIXME: for UDP, we have a 1-1-many mapping amongst sk, ep and asoc, + * so we don't have to do much work on locating associations. + * + * However, when the separation of ep and asoc kicks in, especially + * for TCP style connection, it becomes n-1-n mapping. We will need + * to do more fine work. Until then, hold my peace. + * --xguo + * + * Really, I don't think that will be a problem. The bind() + * call on a socket will either know the endpoint + * (e.g. TCP-style listen()ing socket, or UDP-style socket), + * or exactly one association. The former case is EXACTLY + * what we have now. In the former case we know the + * association already. --piggy + * + * This code will be working on either a UDP style or a TCP style + * socket, or say either an endpoint or an association. The socket + * type verification code need to be added later before calling the + * ADDIP code. + * --daisy + */ + +#if CONFIG_IP_SCTP_ADDIP + /* Add these addresses to all associations on this endpoint. */ + if (retval >= 0) { + struct list_head *pos; + struct sctp_endpoint *ep; + struct sctp_association *asoc; + ep = sctp_sk(sk)->ep; + + list_for_each(pos, &ep->asocs) { + asoc = list_entry(pos, struct sctp_association, asocs); + + sctp_addip_addr_config(asoc, + SCTP_PARAM_ADD_IP, + addrs, addrcnt); + } + } +#endif + + return retval; +} + +/* Remove a list of addresses from bind addresses list. Do not remove the + * last address. + * + * Basically run through each address specified in the addrs/addrcnt + * array/length pair, determine if it is IPv6 or IPv4 and call + * sctp_del_bind() on it. + * + * If any of them fails, then the operation will be reversed and the + * ones that were removed will be added back. + * + * At least one address has to be left; if only one address is + * available, the operation will return -EBUSY. + * + * Only __sctp_bindx() is supposed to call this function. + */ +int sctp_bindx_rem(struct sock *sk, struct sockaddr_storage *addrs, int addrcnt) +{ + struct sctp_opt *sp = sctp_sk(sk); + struct sctp_endpoint *ep = sp->ep; + int cnt; + sctp_bind_addr_t *bp = &ep->base.bind_addr; + int retval = 0; + union sctp_addr saveaddr; + + SCTP_DEBUG_PRINTK("sctp_bindx_rem (sk: %p, addrs: %p, addrcnt: %d)\n", + sk, addrs, addrcnt); + + for (cnt = 0; cnt < addrcnt; cnt++) { + /* If there is only one bind address, there is nothing more + * to be removed (we need at least one address here). + */ + if (list_empty(&bp->address_list)) { + retval = -EBUSY; + goto err_bindx_rem; + } + + /* The list may contain either IPv4 or IPv6 address; + * determine the address length for walking thru the list. + */ + switch (((struct sockaddr *)&addrs[cnt])->sa_family) { + case AF_INET: + saveaddr = *((union sctp_addr *) + &addrs[cnt]); + saveaddr.v4.sin_port = ntohs(saveaddr.v4.sin_port); + /* Verify the port. */ + if (saveaddr.v4.sin_port != bp->port) { + retval = -EINVAL; + goto err_bindx_rem; + } + break; + + case AF_INET6: + saveaddr = *((union sctp_addr *) + &addrs[cnt]); + saveaddr.v6.sin6_port = + ntohs(saveaddr.v6.sin6_port); + /* verify the port */ + if (saveaddr.v6.sin6_port != bp->port) { + retval = -EINVAL; + goto err_bindx_rem; + } + break; + + default: + retval = -EINVAL; + goto err_bindx_rem; + }; + + /* FIXME - There is probably a need to check if sk->saddr and + * sk->rcv_addr are currently set to one of the addresses to + * be removed. This is something which needs to be looked into + * when we are fixing the outstanding issues with multi-homing + * socket routing and failover schemes. Refer to comments in + * sctp_do_bind(). -daisy + */ + sctp_local_bh_disable(); + sctp_write_lock(&ep->base.addr_lock); + + retval = sctp_del_bind_addr(bp, &saveaddr); + + sctp_write_unlock(&ep->base.addr_lock); + sctp_local_bh_enable(); + +err_bindx_rem: + if (retval < 0) { + /* Failed. Add the ones that has been removed back */ + if (cnt > 0) + sctp_bindx_add(sk, addrs, cnt); + return retval; + } + } + + /* + * This code will be working on either a UDP style or a TCP style + * socket, * or say either an endpoint or an association. The socket + * type verification code need to be added later before calling the + * ADDIP code. + * --daisy + */ +#if CONFIG_IP_SCTP_ADDIP + /* Remove these addresses from all associations on this endpoint. */ + if (retval >= 0) { + struct list_head *pos; + struct sctp_endpoint *ep; + struct sctp_association *asoc; + + ep = sctp_sk(sk)->ep; + list_for_each(pos, &ep->asocs) { + asoc = list_entry(pos, struct sctp_association, asocs); + sctp_addip_addr_config(asoc, SCTP_PARAM_DEL_IP, + addrs, addrcnt); + } + } +#endif + return retval; +} + +/* Helper for tunneling sys_bindx() requests through sctp_setsockopt() + * + * Basically do nothing but copying the addresses from user to kernel + * land and invoking sctp_bindx on the sk. This is used for tunneling + * the sctp_bindx() [sys_bindx()] request through sctp_setsockopt() + * from userspace. + * + * Note I don't use move_addr_to_kernel(): the reason is we would be + * iterating over an array of struct sockaddr_storage passing always + * what we know is a good size (sizeof (struct sock...)), so it is + * pointless. Instead check the whole area for read access and copy + * it. + * + * We don't use copy_from_user() for optimization: we first do the + * sanity checks (buffer size -fast- and access check-healthy + * pointer); if all of those succeed, then we can alloc the memory + * (expensive operation) needed to copy the data to kernel. Then we do + * the copying without checking the user space area + * (__copy_from_user()). + * + * On exit there is no need to do sockfd_put(), sys_setsockopt() does + * it. + * + * sk The sk of the socket + * addrs The pointer to the addresses in user land + * addrssize Size of the addrs buffer + * op Operation to perform (add or remove, see the flags of + * sctp_bindx) + * + * Returns 0 if ok, <0 errno code on error. + */ +SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk, + struct sockaddr_storage *addrs, + int addrssize, int op) +{ + struct sockaddr_storage *kaddrs; + int err; + size_t addrcnt; + + SCTP_DEBUG_PRINTK("sctp_do_setsocktopt_bindx: sk %p addrs %p" + " addrssize %d opt %d\n", sk, addrs, addrssize, op); + + /* Do we have an integer number of structs sockaddr_storage? */ + if (unlikely(addrssize <= 0 || + addrssize % sizeof(struct sockaddr_storage) != 0)) + return -EINVAL; + + /* Check the user passed a healthy pointer. */ + if (unlikely(!access_ok(VERIFY_READ, addrs, addrssize))) + return -EFAULT; + + /* Alloc space for the address array in kernel memory. */ + kaddrs = (struct sockaddr_storage *) kmalloc(addrssize, GFP_KERNEL); + if (unlikely(!kaddrs)) + return -ENOMEM; + + if (copy_from_user(kaddrs, addrs, addrssize)) { + kfree(kaddrs); + return -EFAULT; + } + + addrcnt = addrssize / sizeof(struct sockaddr_storage); + err = __sctp_bindx(sk, kaddrs, addrcnt, op); /* Do the work. */ + kfree(kaddrs); + + return err; +} + +/* API 3.1.4 close() - UDP Style Syntax + * Applications use close() to perform graceful shutdown (as described in + * Section 10.1 of [SCTP]) on ALL the associations currently represented + * by a UDP-style socket. + * + * The syntax is + * + * ret = close(int sd); + * + * sd - the socket descriptor of the associations to be closed. + * + * To gracefully shutdown a specific association represented by the + * UDP-style socket, an application should use the sendmsg() call, + * passing no user data, but including the appropriate flag in the + * ancillary data (see Section xxxx). + * + * If sd in the close() call is a branched-off socket representing only + * one association, the shutdown is performed on that association only. + */ +SCTP_STATIC void sctp_close(struct sock *sk, long timeout) +{ + struct sctp_endpoint *ep; + struct sctp_association *asoc; + struct list_head *pos, *temp; + + SCTP_DEBUG_PRINTK("sctp_close(sk: 0x%p...)\n", sk); + + sctp_lock_sock(sk); + sk->shutdown = SHUTDOWN_MASK; + + ep = sctp_sk(sk)->ep; + + /* Walk all associations on a socket, not on an endpoint. */ + list_for_each_safe(pos, temp, &ep->asocs) { + asoc = list_entry(pos, struct sctp_association, asocs); + + /* A closed association can still be in the list if it + * belongs to a TCP-style listening socket that is not + * yet accepted. + */ + if ((SCTP_SOCKET_TCP == sctp_sk(sk)->type) && + (SCTP_STATE_CLOSED == asoc->state)) { + sctp_unhash_established(asoc); + sctp_association_free(asoc); + } else + sctp_primitive_SHUTDOWN(asoc, NULL); + } + + /* Clean up any skbs sitting on the receive queue. */ + skb_queue_purge(&sk->receive_queue); + skb_queue_purge(&sctp_sk(sk)->pd_lobby); + + /* This will run the backlog queue. */ + sctp_release_sock(sk); + + /* Supposedly, no process has access to the socket, but + * the net layers still may. + */ + sctp_local_bh_disable(); + sctp_bh_lock_sock(sk); + + /* Hold the sock, since inet_sock_release() will put sock_put() + * and we have just a little more cleanup. + */ + sock_hold(sk); + inet_sock_release(sk); + + sctp_bh_unlock_sock(sk); + sctp_local_bh_enable(); + + sock_put(sk); + + SCTP_DBG_OBJCNT_DEC(sock); +} + +/* Handle EPIPE error. */ +static int sctp_error(struct sock *sk, int flags, int err) +{ + if (err == -EPIPE) + err = sock_error(sk) ? : -EPIPE; + if (err == -EPIPE && !(flags & MSG_NOSIGNAL)) + send_sig(SIGPIPE, current, 0); + return err; +} + +/* API 3.1.3 sendmsg() - UDP Style Syntax + * + * An application uses sendmsg() and recvmsg() calls to transmit data to + * and receive data from its peer. + * + * ssize_t sendmsg(int socket, const struct msghdr *message, + * int flags); + * + * socket - the socket descriptor of the endpoint. + * message - pointer to the msghdr structure which contains a single + * user message and possibly some ancillary data. + * + * See Section 5 for complete description of the data + * structures. + * + * flags - flags sent or received with the user message, see Section + * 5 for complete description of the flags. + * + * Note: This function could use a rewrite especially when explicit + * connect support comes in. + */ +/* BUG: We do not implement the equivalent of wait_for_tcp_memory(). */ + +SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *, sctp_cmsgs_t *); + +SCTP_STATIC int sctp_sendmsg(struct sock *sk, struct msghdr *msg, int msg_len) +{ + struct sctp_opt *sp; + struct sctp_endpoint *ep; + struct sctp_association *new_asoc=NULL, *asoc=NULL; + struct sctp_transport *transport; + sctp_chunk_t *chunk = NULL; + union sctp_addr to; + struct sockaddr *msg_name = NULL; + struct sctp_sndrcvinfo default_sinfo = { 0 }; + struct sctp_sndrcvinfo *sinfo; + struct sctp_initmsg *sinit; + sctp_assoc_t associd = NULL; + sctp_cmsgs_t cmsgs = { 0 }; + int err; + sctp_scope_t scope; + long timeo; + __u16 sinfo_flags = 0; + struct sk_buff_head chunks; + int msg_flags = msg->msg_flags; + + SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %d)\n", + sk, msg, msg_len); + + err = 0; + sp = sctp_sk(sk); + ep = sp->ep; + + SCTP_DEBUG_PRINTK("Using endpoint: %s.\n", ep->debug_name); + + if ((SCTP_SOCKET_TCP == sp->type) && + (SCTP_SS_ESTABLISHED != sk->state)) { + err = -EPIPE; + goto out_nounlock; + } + + /* Parse out the SCTP CMSGs. */ + err = sctp_msghdr_parse(msg, &cmsgs); + + if (err) { + SCTP_DEBUG_PRINTK("msghdr parse err = %x\n", err); + goto out_nounlock; + } + + /* Fetch the destination address for this packet. This + * address only selects the association--it is not necessarily + * the address we will send to. + * For a peeled-off socket, msg_name is ignored. + */ + if ((SCTP_SOCKET_UDP_HIGH_BANDWIDTH != sp->type) && msg->msg_name) { + int msg_namelen = msg->msg_namelen; + + err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name, + msg_namelen); + if (err) + return err; + + if (msg_namelen > sizeof(to)) + msg_namelen = sizeof(to); + memcpy(&to, msg->msg_name, msg_namelen); + SCTP_DEBUG_PRINTK("Just memcpy'd. msg_name is " + "0x%x:%u.\n", + to.v4.sin_addr.s_addr, to.v4.sin_port); + + to.v4.sin_port = ntohs(to.v4.sin_port); + msg_name = msg->msg_name; + } + + sinfo = cmsgs.info; + sinit = cmsgs.init; + + /* Did the user specify SNDRCVINFO? */ + if (sinfo) { + sinfo_flags = sinfo->sinfo_flags; + associd = sinfo->sinfo_assoc_id; + } + + SCTP_DEBUG_PRINTK("msg_len: %Zd, sinfo_flags: 0x%x\n", + msg_len, sinfo_flags); + + /* If MSG_EOF is set, no data can be sent. Disallow sending zero + * length messages when MSG_EOF|MSG_ABORT is not set. + * If MSG_ABORT is set, the message length could be non zero with + * the msg_iov set to the user abort reason. + */ + if (((sinfo_flags & MSG_EOF) && (msg_len > 0)) || + (!(sinfo_flags & (MSG_EOF|MSG_ABORT)) && (msg_len == 0))) { + err = -EINVAL; + goto out_nounlock; + } + + sctp_lock_sock(sk); + + transport = NULL; + + SCTP_DEBUG_PRINTK("About to look up association.\n"); + + /* If a msg_name has been specified, assume this is to be used. */ + if (msg_name) { + /* Look for a matching association on the endpoint. */ + asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport); + if (!asoc) { + /* If we could not find a matching association on the + * endpoint, make sure that there is no peeled-off + * association on another socket. + */ + if (sctp_endpoint_is_peeled_off(ep, &to)) { + err = -EADDRNOTAVAIL; + goto out_unlock; + } + } + } else { + asoc = sctp_id2assoc(sk, associd); + if (!asoc) { + err = -EINVAL; + goto out_unlock; + } + } + + if (asoc) { + SCTP_DEBUG_PRINTK("Just looked up association: " + "%s. \n", asoc->debug_name); + + /* We cannot send a message on a TCP-style SCTP_SS_ESTABLISHED + * socket that has an association in CLOSED state. This can + * happen when an accepted socket has an association that is + * already CLOSED. + */ + if ((SCTP_STATE_CLOSED == asoc->state) && + (SCTP_SOCKET_TCP == sp->type)) { + err = -EPIPE; + goto out_unlock; + } + + if (sinfo_flags & MSG_EOF) { + SCTP_DEBUG_PRINTK("Shutting down association: %p\n", + asoc); + sctp_primitive_SHUTDOWN(asoc, NULL); + err = 0; + goto out_unlock; + } + if (sinfo_flags & MSG_ABORT) { + SCTP_DEBUG_PRINTK("Aborting association: %p\n", asoc); + sctp_primitive_ABORT(asoc, msg); + err = 0; + goto out_unlock; + } + } + + /* Do we need to create the association? */ + if (!asoc) { + SCTP_DEBUG_PRINTK("There is no association yet.\n"); + + /* Check for invalid stream against the stream counts, + * either the default or the user specified stream counts. + */ + if (sinfo) { + if (!sinit || (sinit && !sinit->sinit_num_ostreams)) { + /* Check against the defaults. */ + if (sinfo->sinfo_stream >= + sp->initmsg.sinit_num_ostreams) { + err = -EINVAL; + goto out_unlock; + } + } else { + /* Check against the requested. */ + if (sinfo->sinfo_stream >= + sinit->sinit_num_ostreams) { + err = -EINVAL; + goto out_unlock; + } + } + } + + /* + * API 3.1.2 bind() - UDP Style Syntax + * If a bind() or sctp_bindx() is not called prior to a + * sendmsg() call that initiates a new association, the + * system picks an ephemeral port and will choose an address + * set equivalent to binding with a wildcard address. + */ + if (!ep->base.bind_addr.port) { + if (sctp_autobind(sk)) { + err = -EAGAIN; + goto out_unlock; + } + } + + scope = sctp_scope(&to); + new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); + if (!new_asoc) { + err = -ENOMEM; + goto out_unlock; + } + asoc = new_asoc; + + /* If the SCTP_INIT ancillary data is specified, set all + * the association init values accordingly. + */ + if (sinit) { + if (sinit->sinit_num_ostreams) { + asoc->c.sinit_num_ostreams = + sinit->sinit_num_ostreams; + } + if (sinit->sinit_max_instreams) { + asoc->c.sinit_max_instreams = + sinit->sinit_max_instreams; + } + if (sinit->sinit_max_attempts) { + asoc->max_init_attempts + = sinit->sinit_max_attempts; + } + if (sinit->sinit_max_init_timeo) { + asoc->max_init_timeo + = sinit->sinit_max_init_timeo * HZ; + } + } + + /* Prime the peer's transport structures. */ + transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL); + if (!transport) { + err = -ENOMEM; + goto out_free; + } + err = sctp_assoc_set_bind_addr_from_ep(asoc, GFP_KERNEL); + if (err < 0) { + err = -ENOMEM; + goto out_free; + } + } + + /* ASSERT: we have a valid association at this point. */ + SCTP_DEBUG_PRINTK("We have a valid association.\n"); + + if (!sinfo) { + /* If the user didn't specify SNDRCVINFO, make up one with + * some defaults. + */ + default_sinfo.sinfo_stream = asoc->defaults.stream; + default_sinfo.sinfo_flags = asoc->defaults.flags; + default_sinfo.sinfo_ppid = asoc->defaults.ppid; + default_sinfo.sinfo_context = asoc->defaults.context; + default_sinfo.sinfo_timetolive = asoc->defaults.timetolive; + default_sinfo.sinfo_assoc_id = sctp_assoc2id(asoc); + sinfo = &default_sinfo; + } + + /* API 7.1.7, the sndbuf size per association bounds the + * maximum size of data that can be sent in a single send call. + */ + if (msg_len > sk->sndbuf) { + err = -EMSGSIZE; + goto out_free; + } + + /* If fragmentation is disabled and the message length exceeds the + * association fragmentation point, return EMSGSIZE. The I-D + * does not specify what this error is, but this looks like + * a great fit. + */ + if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) { + err = -EMSGSIZE; + goto out_free; + } + + if (sinfo) { + /* Check for invalid stream. */ + if (sinfo->sinfo_stream >= asoc->c.sinit_num_ostreams) { + err = -EINVAL; + goto out_free; + } + } + + timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); + if (!sctp_wspace(asoc)) { + err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); + if (err) + goto out_free; + } + + /* Break the message into multiple chunks of maximum size. */ + skb_queue_head_init(&chunks); + err = sctp_datachunks_from_user(asoc, sinfo, msg, msg_len, &chunks); + if (err) + goto out_free; + + /* Auto-connect, if we aren't connected already. */ + if (SCTP_STATE_CLOSED == asoc->state) { + err = sctp_primitive_ASSOCIATE(asoc, NULL); + if (err < 0) + goto out_free; + SCTP_DEBUG_PRINTK("We associated primitively.\n"); + } + + /* Now send the (possibly) fragmented message. */ + while ((chunk = (sctp_chunk_t *)__skb_dequeue(&chunks))) { + + /* Do accounting for the write space. */ + sctp_set_owner_w(chunk); + + /* This flag, in the UDP model, requests the SCTP stack to + * override the primary destination address with the + * address found with the sendto/sendmsg call. + */ + if (sinfo_flags & MSG_ADDR_OVER) { + if (!msg->msg_name) { + err = -EINVAL; + goto out_free; + } + chunk->transport = sctp_assoc_lookup_paddr(asoc, &to); + if (!chunk->transport) { + err = -EINVAL; + goto out_free; + } + } + + /* Send it to the lower layers. */ + sctp_primitive_SEND(asoc, chunk); + SCTP_DEBUG_PRINTK("We sent primitively.\n"); + } + + if (!err) { + err = msg_len; + goto out_unlock; + } + /* If we are already past ASSOCIATE, the lower + * layers are responsible for association cleanup. + */ + goto out_free_chunk; + +out_free: + if (new_asoc) + sctp_association_free(asoc); + +out_free_chunk: + if (chunk) + sctp_free_chunk(chunk); + +out_unlock: + sctp_release_sock(sk); + +out_nounlock: + return sctp_error(sk, msg_flags, err); + +#if 0 +do_sock_err: + if (msg_len) + err = msg_len; + else + err = sock_error(sk); + goto out; + +do_interrupted: + if (msg_len) + err = msg_len; + goto out; +#endif /* 0 */ +} + +/* This is an extended version of skb_pull() that removes the data from the + * start of a skb even when data is spread across the list of skb's in the + * frag_list. len specifies the total amount of data that needs to be removed. + * when 'len' bytes could be removed from the skb, it returns 0. + * If 'len' exceeds the total skb length, it returns the no. of bytes that + * could not be removed. + */ +static int sctp_skb_pull(struct sk_buff *skb, int len) +{ + struct sk_buff *list; + int skb_len = skb_headlen(skb); + int rlen; + + if (len <= skb_len) { + __skb_pull(skb, len); + return 0; + } + len -= skb_len; + __skb_pull(skb, skb_len); + + for (list = skb_shinfo(skb)->frag_list; list; list = list->next) { + rlen = sctp_skb_pull(list, len); + skb->len -= (len-rlen); + skb->data_len -= (len-rlen); + + if (!rlen) + return 0; + + len = rlen; + } + + return len; +} + +/* API 3.1.3 recvmsg() - UDP Style Syntax + * + * ssize_t recvmsg(int socket, struct msghdr *message, + * int flags); + * + * socket - the socket descriptor of the endpoint. + * message - pointer to the msghdr structure which contains a single + * user message and possibly some ancillary data. + * + * See Section 5 for complete description of the data + * structures. + * + * flags - flags sent or received with the user message, see Section + * 5 for complete description of the flags. + */ +static struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *); + +SCTP_STATIC int sctp_recvmsg(struct sock *sk, struct msghdr *msg, int len, + int noblock, int flags, int *addr_len) +{ + struct sctp_ulpevent *event = NULL; + struct sctp_opt *sp = sctp_sk(sk); + struct sk_buff *skb; + int copied; + int err = 0; + int skb_len; + + SCTP_DEBUG_PRINTK("sctp_recvmsg(%s: %p, %s: %p, %s: %d, %s: %d, %s: " + "0x%x, %s: %p)\n", "sk", sk, "msghdr", msg, + "len", len, "knoblauch", noblock, + "flags", flags, "addr_len", addr_len); + + sctp_lock_sock(sk); + + if ((SCTP_SOCKET_TCP == sp->type) && + (SCTP_SS_ESTABLISHED != sk->state)) { + err = -ENOTCONN; + goto out; + } + + skb = sctp_skb_recv_datagram(sk, flags, noblock, &err); + if (!skb) + goto out; + + /* Get the total length of the skb including any skb's in the + * frag_list. + */ + skb_len = skb->len; + + copied = skb_len; + if (copied > len) + copied = len; + + err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); + + event = sctp_skb2event(skb); + + if (err) + goto out_free; + + sock_recv_timestamp(msg, sk, skb); + if (sctp_ulpevent_is_notification(event)) { + msg->msg_flags |= MSG_NOTIFICATION; + sp->pf->event_msgname(event, msg->msg_name, addr_len); + } else { + sp->pf->skb_msgname(skb, msg->msg_name, addr_len); + } + + /* Check if we allow SCTP_SNDRCVINFO. */ + if (sp->subscribe.sctp_data_io_event) + sctp_ulpevent_read_sndrcvinfo(event, msg); +#if 0 + /* FIXME: we should be calling IP/IPv6 layers. */ + if (sk->protinfo.af_inet.cmsg_flags) + ip_cmsg_recv(msg, skb); +#endif + + err = copied; + + /* If skb's length exceeds the user's buffer, update the skb and + * push it back to the receive_queue so that the next call to + * recvmsg() will return the remaining data. Don't set MSG_EOR. + */ + if (skb_len > copied) { + msg->msg_flags &= ~MSG_EOR; + if (flags & MSG_PEEK) + goto out_free; + sctp_skb_pull(skb, copied); + skb_queue_head(&sk->receive_queue, skb); + + /* When only partial message is copied to the user, increase + * rwnd by that amount. If all the data in the skb is read, + * rwnd is updated when the skb's destructor is called via + * sctp_ulpevent_free(). + */ + sctp_assoc_rwnd_increase(event->event_asoc, copied); + goto out; + } else if ((event->msg_flags & MSG_NOTIFICATION) || + (event->msg_flags & MSG_EOR)) + msg->msg_flags |= MSG_EOR; + else + msg->msg_flags &= ~MSG_EOR; + +out_free: + sctp_ulpevent_free(event); /* Free the skb. */ +out: + sctp_release_sock(sk); + return err; +} + +static int sctp_setsockopt_disable_fragments(struct sock *sk, + char *optval, int optlen) +{ + int val; + + if (optlen < sizeof(int)) + return -EINVAL; + + if (get_user(val, (int *)optval)) + return -EFAULT; + + sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1; + + return 0; +} + +static int sctp_setsockopt_events(struct sock *sk, char *optval, + int optlen) +{ + if (optlen != sizeof(struct sctp_event_subscribe)) + return -EINVAL; + if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen)) + return -EFAULT; + return 0; +} + +static int sctp_setsockopt_autoclose(struct sock *sk, char *optval, + int optlen) +{ + struct sctp_opt *sp = sctp_sk(sk); + + /* Applicable to UDP-style socket only */ + if (SCTP_SOCKET_TCP == sp->type) + return -EOPNOTSUPP; + if (optlen != sizeof(int)) + return -EINVAL; + if (copy_from_user(&sp->autoclose, optval, optlen)) + return -EFAULT; + + sp->ep->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = sp->autoclose * HZ; + return 0; +} + +static int sctp_setsockopt_peer_addr_params(struct sock *sk, + char *optval, int optlen) +{ + struct sctp_paddrparams params; + struct sctp_association *asoc; + union sctp_addr *addr; + struct sctp_transport *trans; + int error; + + if (optlen != sizeof(struct sctp_paddrparams)) + return -EINVAL; + if (copy_from_user(¶ms, optval, optlen)) + return -EFAULT; + + asoc = sctp_id2assoc(sk, params.spp_assoc_id); + if (!asoc) + return -EINVAL; + + addr = (union sctp_addr *) &(params.spp_address); + + trans = sctp_assoc_lookup_paddr(asoc, addr); + if (!trans) + return -ENOENT; + + /* Applications can enable or disable heartbeats for any peer address + * of an association, modify an address's heartbeat interval, force a + * heartbeat to be sent immediately, and adjust the address's maximum + * number of retransmissions sent before an address is considered + * unreachable. + * + * The value of the heartbeat interval, in milliseconds. A value of + * UINT32_MAX (4294967295), when modifying the parameter, specifies + * that a heartbeat should be sent immediately to the peer address, + * and the current interval should remain unchanged. + */ + if (0xffffffff == params.spp_hbinterval) { + error = sctp_primitive_REQUESTHEARTBEAT (asoc, trans); + if (error) + return error; + } else { + /* The value of the heartbeat interval, in milliseconds. A value of 0, + * when modifying the parameter, specifies that the heartbeat on this + * address should be disabled. + */ + if (params.spp_hbinterval) { + trans->hb_allowed = 1; + trans->hb_interval = params.spp_hbinterval * HZ / 1000; + } else + trans->hb_allowed = 0; + } + + /* spp_pathmaxrxt contains the maximum number of retransmissions + * before this address shall be considered unreachable. + */ + trans->error_threshold = params.spp_pathmaxrxt; + + return 0; +} + +static int sctp_setsockopt_initmsg(struct sock *sk, char *optval, int optlen) +{ + if (optlen != sizeof(struct sctp_initmsg)) + return -EINVAL; + if (copy_from_user(&sctp_sk(sk)->initmsg, optval, optlen)) + return -EFAULT; + return 0; +} + +/* + * 7.1.15 Set default send parameters (SET_DEFAULT_SEND_PARAM) + * + * Applications that wish to use the sendto() system call may wish to + * specify a default set of parameters that would normally be supplied + * through the inclusion of ancillary data. This socket option allows + * such an application to set the default sctp_sndrcvinfo structure. + * The application that wishes to use this socket option simply passes + * in to this call the sctp_sndrcvinfo structure defined in Section + * 5.2.2) The input parameters accepted by this call include + * sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context, + * sinfo_timetolive. The user must provide the sinfo_assoc_id field in + * to this call if the caller is using the UDP model. + */ +static int sctp_setsockopt_default_send_param(struct sock *sk, + char *optval, int optlen) +{ + struct sctp_sndrcvinfo info; + struct sctp_association *asoc; + + if (optlen != sizeof(struct sctp_sndrcvinfo)) + return -EINVAL; + if (copy_from_user(&info, optval, optlen)) + return -EFAULT; + + asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); + if (!asoc) + return -EINVAL; + + asoc->defaults.stream = info.sinfo_stream; + asoc->defaults.flags = info.sinfo_flags; + asoc->defaults.ppid = info.sinfo_ppid; + asoc->defaults.context = info.sinfo_context; + asoc->defaults.timetolive = info.sinfo_timetolive; + return 0; +} + +/* 7.1.10 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR) + * + * Requests that the local SCTP stack use the enclosed peer address as + * the association primary. The enclosed address must be one of the + * association peer's addresses. + */ +static int sctp_setsockopt_peer_prim(struct sock *sk, char *optval, int optlen) +{ + struct sctp_setpeerprim prim; + struct sctp_association *asoc; + union sctp_addr *addr; + struct sctp_transport *trans; + + if (optlen != sizeof(struct sctp_setpeerprim)) + return -EINVAL; + + if (copy_from_user(&prim, optval, sizeof(struct sctp_setpeerprim))) + return -EFAULT; + + asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); + if (!asoc) + return -EINVAL; + + /* Find the requested address. */ + addr = (union sctp_addr *) &(prim.sspp_addr); + + trans = sctp_assoc_lookup_paddr(asoc, addr); + if (!trans) + return -ENOENT; + + sctp_assoc_set_primary(asoc, trans); + + return 0; +} + +/* + * + * 7.1.5 SCTP_NODELAY + * + * Turn on/off any Nagle-like algorithm. This means that packets are + * generally sent as soon as possible and no unnecessary delays are + * introduced, at the cost of more packets in the network. Expects an + * integer boolean flag. + */ +static int sctp_setsockopt_nodelay(struct sock *sk, char *optval, + int optlen) +{ + __u8 val; + + if (optlen < sizeof(__u8)) + return -EINVAL; + if (get_user(val, (__u8 *)optval)) + return -EFAULT; + + sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1; + return 0; +} + +/* API 6.2 setsockopt(), getsockopt() + * + * Applications use setsockopt() and getsockopt() to set or retrieve + * socket options. Socket options are used to change the default + * behavior of sockets calls. They are described in Section 7. + * + * The syntax is: + * + * ret = getsockopt(int sd, int level, int optname, void *optval, + * int *optlen); + * ret = setsockopt(int sd, int level, int optname, const void *optval, + * int optlen); + * + * sd - the socket descript. + * level - set to IPPROTO_SCTP for all SCTP options. + * optname - the option name. + * optval - the buffer to store the value of the option. + * optlen - the size of the buffer. + */ +SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname, + char *optval, int optlen) +{ + int retval = 0; + char *tmp; + + SCTP_DEBUG_PRINTK("sctp_setsockopt(sk: %p... optname: %d)\n", + sk, optname); + + /* I can hardly begin to describe how wrong this is. This is + * so broken as to be worse than useless. The API draft + * REALLY is NOT helpful here... I am not convinced that the + * semantics of setsockopt() with a level OTHER THAN SOL_SCTP + * are at all well-founded. + */ + if (level != SOL_SCTP) { + struct sctp_af *af = sctp_sk(sk)->pf->af; + retval = af->setsockopt(sk, level, optname, optval, optlen); + goto out_nounlock; + } + + sctp_lock_sock(sk); + + switch (optname) { + case SCTP_SOCKOPT_DEBUG_NAME: + /* BUG! we don't ever seem to free this memory. --jgrimm */ + if (NULL == (tmp = kmalloc(optlen + 1, GFP_KERNEL))) { + retval = -ENOMEM; + goto out_unlock; + } + + if (copy_from_user(tmp, optval, optlen)) { + retval = -EFAULT; + goto out_unlock; + } + tmp[optlen] = '\000'; + sctp_sk(sk)->ep->debug_name = tmp; + break; + + case SCTP_SOCKOPT_BINDX_ADD: + /* 'optlen' is the size of the addresses buffer. */ + retval = sctp_setsockopt_bindx(sk, (struct sockaddr_storage *) + optval, optlen, BINDX_ADD_ADDR); + break; + + case SCTP_SOCKOPT_BINDX_REM: + /* 'optlen' is the size of the addresses buffer. */ + retval = sctp_setsockopt_bindx(sk, (struct sockaddr_storage *) + optval, optlen, BINDX_REM_ADDR); + break; + + case SCTP_DISABLE_FRAGMENTS: + retval = sctp_setsockopt_disable_fragments(sk, optval, optlen); + break; + + case SCTP_SET_EVENTS: + retval = sctp_setsockopt_events(sk, optval, optlen); + break; + + case SCTP_AUTOCLOSE: + retval = sctp_setsockopt_autoclose(sk, optval, optlen); + break; + + case SCTP_SET_PEER_ADDR_PARAMS: + retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); + break; + + case SCTP_INITMSG: + retval = sctp_setsockopt_initmsg(sk, optval, optlen); + break; + + case SCTP_SET_DEFAULT_SEND_PARAM: + retval = sctp_setsockopt_default_send_param(sk, optval, + optlen); + break; + + case SCTP_SET_PEER_PRIMARY_ADDR: + retval = sctp_setsockopt_peer_prim(sk, optval, optlen); + break; + + case SCTP_NODELAY: + retval = sctp_setsockopt_nodelay(sk, optval, optlen); + break; + + default: + retval = -ENOPROTOOPT; + break; + }; + +out_unlock: + sctp_release_sock(sk); + +out_nounlock: + return retval; +} + +/* API 3.1.6 connect() - UDP Style Syntax + * + * An application may use the connect() call in the UDP model to initiate an + * association without sending data. + * + * The syntax is: + * + * ret = connect(int sd, const struct sockaddr *nam, socklen_t len); + * + * sd: the socket descriptor to have a new association added to. + * + * nam: the address structure (either struct sockaddr_in or struct + * sockaddr_in6 defined in RFC2553 [7]). + * + * len: the size of the address. + */ +SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *uaddr, + int addr_len) +{ + struct sctp_opt *sp; + struct sctp_endpoint *ep; + struct sctp_association *asoc; + struct sctp_transport *transport; + union sctp_addr to; + struct sctp_af *af; + sctp_scope_t scope; + long timeo; + int err = 0; + + sctp_lock_sock(sk); + + SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d)\n", + __FUNCTION__, sk, uaddr, addr_len); + + sp = sctp_sk(sk); + ep = sp->ep; + + /* connect() cannot be done on a socket that is already in ESTABLISHED + * state - UDP-style peeled off socket or a TCP-style socket that + * is already connected. + * It cannot be done even on a TCP-style listening socket. + */ + if ((SCTP_SS_ESTABLISHED == sk->state) || + ((SCTP_SOCKET_TCP == sp->type) && + (SCTP_SS_LISTENING == sk->state))) { + err = -EISCONN; + goto out_unlock; + } + + err = sctp_verify_addr(sk, (union sctp_addr *)uaddr, addr_len); + if (err) + goto out_unlock; + + if (addr_len > sizeof(to)) + addr_len = sizeof(to); + memcpy(&to, uaddr, addr_len); + to.v4.sin_port = ntohs(to.v4.sin_port); + + asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport); + if (asoc) { + if (asoc->state >= SCTP_STATE_ESTABLISHED) + err = -EISCONN; + else + err = -EALREADY; + goto out_unlock; + } + + /* If we could not find a matching association on the endpoint, + * make sure that there is no peeled-off association matching the + * peer address even on another socket. + */ + if (sctp_endpoint_is_peeled_off(ep, &to)) { + err = -EADDRNOTAVAIL; + goto out_unlock; + } + + /* If a bind() or sctp_bindx() is not called prior to a connect() + * call, the system picks an ephemeral port and will choose an address + * set equivalent to binding with a wildcard address. + */ + if (!ep->base.bind_addr.port) { + if (sctp_autobind(sk)) { + err = -EAGAIN; + goto out_unlock; + } + } + + scope = sctp_scope(&to); + asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); + if (!asoc) { + err = -ENOMEM; + goto out_unlock; + } + + /* Prime the peer's transport structures. */ + transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL); + if (!transport) { + sctp_association_free(asoc); + goto out_unlock; + } + err = sctp_assoc_set_bind_addr_from_ep(asoc, GFP_KERNEL); + if (err < 0) { + sctp_association_free(asoc); + goto out_unlock; + } + + err = sctp_primitive_ASSOCIATE(asoc, NULL); + if (err < 0) { + sctp_association_free(asoc); + goto out_unlock; + } + + /* Initialize sk's dport and daddr for getpeername() */ + (sk)->dport = htons(asoc->peer.port); + af = sctp_get_af_specific(to.sa.sa_family); + af->to_sk_daddr(&to, sk); + + timeo = sock_sndtimeo(sk, sk->socket->file->f_flags & O_NONBLOCK); + err = sctp_wait_for_connect(asoc, &timeo); + +out_unlock: + sctp_release_sock(sk); + + return err; +} + +/* FIXME: Write comments. */ +SCTP_STATIC int sctp_disconnect(struct sock *sk, int flags) +{ + return -EOPNOTSUPP; /* STUB */ +} + +/* 4.1.4 accept() - TCP Style Syntax + * + * Applications use accept() call to remove an established SCTP + * association from the accept queue of the endpoint. A new socket + * descriptor will be returned from accept() to represent the newly + * formed association. + */ +SCTP_STATIC struct sock *sctp_accept(struct sock *sk, int flags, int *err) +{ + struct sctp_opt *sp; + struct sctp_endpoint *ep; + struct sock *newsk = NULL; + struct sctp_association *asoc; + long timeo; + int error = 0; + + sctp_lock_sock(sk); + + sp = sctp_sk(sk); + ep = sp->ep; + + if (SCTP_SOCKET_TCP != sp->type) { + error = -EOPNOTSUPP; + goto out; + } + + if (SCTP_SS_LISTENING != sk->state) { + error = -EINVAL; + goto out; + } + + timeo = sock_rcvtimeo(sk, sk->socket->file->f_flags & O_NONBLOCK); + + error = sctp_wait_for_accept(sk, timeo); + if (error) + goto out; + + /* We treat the list of associations on the endpoint as the accept + * queue and pick the first association on the list. + */ + asoc = list_entry(ep->asocs.next, struct sctp_association, asocs); + + newsk = sp->pf->create_accept_sk(sk, asoc); + if (!newsk) { + error = -ENOMEM; + goto out; + } + + /* Populate the fields of the newsk from the oldsk and migrate the + * asoc to the newsk. + */ + sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP); + +out: + sctp_release_sock(sk); + *err = error; + return newsk; +} + +/* The SCTP ioctl handler. */ +SCTP_STATIC int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg) +{ + return -ENOIOCTLCMD; +} + +/* This is the function which gets called during socket creation to + * initialized the SCTP-specific portion of the sock. + * The sock structure should already be zero-filled memory. + */ +SCTP_STATIC int sctp_init_sock(struct sock *sk) +{ + struct sctp_endpoint *ep; + struct sctp_protocol *proto; + struct sctp_opt *sp; + + SCTP_DEBUG_PRINTK("sctp_init_sock(sk: %p)\n", sk); + + proto = sctp_get_protocol(); + + sp = sctp_sk(sk); + + /* Initialize the SCTP per socket area. */ + switch (sk->type) { + case SOCK_SEQPACKET: + sp->type = SCTP_SOCKET_UDP; + break; + case SOCK_STREAM: + sp->type = SCTP_SOCKET_TCP; + break; + default: + return -ESOCKTNOSUPPORT; + } + + /* FIXME: The next draft (04) of the SCTP Sockets Extensions + * should include a socket option for manipulating these + * message parameters (and a few others). + */ + sp->default_stream = 0; + sp->default_ppid = 0; + + /* Initialize default setup parameters. These parameters + * can be modified with the SCTP_INITMSG socket option or + * overridden by the SCTP_INIT CMSG. + */ + sp->initmsg.sinit_num_ostreams = proto->max_outstreams; + sp->initmsg.sinit_max_instreams = proto->max_instreams; + sp->initmsg.sinit_max_attempts = proto->max_retrans_init; + sp->initmsg.sinit_max_init_timeo = proto->rto_max / HZ; + + /* Initialize default RTO related parameters. These parameters can + * be modified for with the SCTP_RTOINFO socket option. + * FIXME: These are not used yet. + */ + sp->rtoinfo.srto_initial = proto->rto_initial; + sp->rtoinfo.srto_max = proto->rto_max; + sp->rtoinfo.srto_min = proto->rto_min; + + /* Initialize default event subscriptions. + * the struct sock is initialized to zero, so only + * enable the events needed. By default, UDP-style + * sockets enable io and association change notifications. + */ + if (SCTP_SOCKET_UDP == sp->type) { + sp->subscribe.sctp_data_io_event = 1; + sp->subscribe.sctp_association_event = 1; + } + + /* Default Peer Address Parameters. These defaults can + * be modified via SCTP_SET_PEER_ADDR_PARAMS + */ + sp->paddrparam.spp_hbinterval = proto->hb_interval / HZ; + sp->paddrparam.spp_pathmaxrxt = proto->max_retrans_path; + + /* If enabled no SCTP message fragmentation will be performed. + * Configure through SCTP_DISABLE_FRAGMENTS socket option. + */ + sp->disable_fragments = 0; + + /* Turn on/off any Nagle-like algorithm. */ + sp->nodelay = 1; + + /* Auto-close idle associations after the configured + * number of seconds. A value of 0 disables this + * feature. Configure through the SCTP_AUTOCLOSE socket option, + * for UDP-style sockets only. + */ + sp->autoclose = 0; + sp->pf = sctp_get_pf_specific(sk->family); + + /* Control variables for partial data delivery. */ + sp->pd_mode = 0; + skb_queue_head_init(&sp->pd_lobby); + + /* Create a per socket endpoint structure. Even if we + * change the data structure relationships, this may still + * be useful for storing pre-connect address information. + */ + ep = sctp_endpoint_new(sk, GFP_KERNEL); + if (!ep) + return -ENOMEM; + + sp->ep = ep; + sp->hmac = NULL; + + SCTP_DBG_OBJCNT_INC(sock); + return 0; +} + +/* Cleanup any SCTP per socket resources. */ +SCTP_STATIC int sctp_destroy_sock(struct sock *sk) +{ + struct sctp_endpoint *ep; + + SCTP_DEBUG_PRINTK("sctp_destroy_sock(sk: %p)\n", sk); + + /* Release our hold on the endpoint. */ + ep = sctp_sk(sk)->ep; + sctp_endpoint_free(ep); + + return 0; +} + +/* API 4.1.7 shutdown() - TCP Style Syntax + * int shutdown(int socket, int how); + * + * sd - the socket descriptor of the association to be closed. + * how - Specifies the type of shutdown. The values are + * as follows: + * SHUT_RD + * Disables further receive operations. No SCTP + * protocol action is taken. + * SHUT_WR + * Disables further send operations, and initiates + * the SCTP shutdown sequence. + * SHUT_RDWR + * Disables further send and receive operations + * and initiates the SCTP shutdown sequence. + */ +SCTP_STATIC void sctp_shutdown(struct sock *sk, int how) +{ + struct sctp_endpoint *ep; + struct sctp_association *asoc; + + if (SCTP_SOCKET_TCP != sctp_sk(sk)->type) + return; + + if (how & SEND_SHUTDOWN) { + ep = sctp_sk(sk)->ep; + if (!list_empty(&ep->asocs)) { + asoc = list_entry(ep->asocs.next, + struct sctp_association, asocs); + sctp_primitive_SHUTDOWN(asoc, NULL); + } + } +} + +/* 7.2.1 Association Status (SCTP_STATUS) + + * Applications can retrieve current status information about an + * association, including association state, peer receiver window size, + * number of unacked data chunks, and number of data chunks pending + * receipt. This information is read-only. + */ +static int sctp_getsockopt_sctp_status(struct sock *sk, int len, char *optval, + int *optlen) +{ + struct sctp_status status; + struct sctp_association *asoc = NULL; + struct sctp_transport *transport; + sctp_assoc_t associd; + int retval = 0; + + if (len != sizeof(status)) { + retval = -EINVAL; + goto out; + } + + if (copy_from_user(&status, optval, sizeof(status))) { + retval = -EFAULT; + goto out; + } + + associd = status.sstat_assoc_id; + asoc = sctp_id2assoc(sk, associd); + if (!asoc) { + retval = -EINVAL; + goto out; + } + + transport = asoc->peer.primary_path; + + status.sstat_assoc_id = sctp_assoc2id(asoc); + status.sstat_state = asoc->state; + status.sstat_rwnd = asoc->peer.rwnd; + status.sstat_unackdata = asoc->unack_data; + status.sstat_penddata = asoc->peer.tsn_map.pending_data; + status.sstat_instrms = asoc->c.sinit_max_instreams; + status.sstat_outstrms = asoc->c.sinit_num_ostreams; + status.sstat_fragmentation_point = asoc->frag_point; + status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc); + memcpy(&status.sstat_primary.spinfo_address, + &(transport->ipaddr), sizeof(union sctp_addr)); + status.sstat_primary.spinfo_state = transport->active; + status.sstat_primary.spinfo_cwnd = transport->cwnd; + status.sstat_primary.spinfo_srtt = transport->srtt; + status.sstat_primary.spinfo_rto = transport->rto; + status.sstat_primary.spinfo_mtu = transport->pmtu; + + if (put_user(len, optlen)) { + retval = -EFAULT; + goto out; + } + + SCTP_DEBUG_PRINTK("sctp_getsockopt_sctp_status(%d): %d %d %p\n", + len, status.sstat_state, status.sstat_rwnd, + status.sstat_assoc_id); + + if (copy_to_user(optval, &status, len)) { + retval = -EFAULT; + goto out; + } + +out: + return (retval); +} + +static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, + char *optval, int *optlen) +{ + int val; + + if (len < sizeof(int)) + return -EINVAL; + + len = sizeof(int); + val = (sctp_sk(sk)->disable_fragments == 1); + if (put_user(len, optlen)) + return -EFAULT; + if (copy_to_user(optval, &val, len)) + return -EFAULT; + return 0; +} + +static int sctp_getsockopt_set_events(struct sock *sk, int len, char *optval, int *optlen) +{ + if (len != sizeof(struct sctp_event_subscribe)) + return -EINVAL; + if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) + return -EFAULT; + return 0; +} + +static int sctp_getsockopt_autoclose(struct sock *sk, int len, char *optval, int *optlen) +{ + /* Applicable to UDP-style socket only */ + if (SCTP_SOCKET_TCP == sctp_sk(sk)->type) + return -EOPNOTSUPP; + if (len != sizeof(int)) + return -EINVAL; + if (copy_to_user(optval, &sctp_sk(sk)->autoclose, len)) + return -EFAULT; + return 0; +} + +/* Helper routine to branch off an association to a new socket. */ +SCTP_STATIC int sctp_do_peeloff(struct sctp_association *asoc, + struct socket **sockp) +{ + struct sock *sk = asoc->base.sk; + struct socket *sock; + int err = 0; + + /* An association cannot be branched off from an already peeled-off + * socket, nor is this supported for tcp style sockets. + */ + if (SCTP_SOCKET_UDP != sctp_sk(sk)->type) + return -EINVAL; + + /* Create a new socket. */ + err = sock_create(sk->family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock); + if (err < 0) + return err; + + /* Populate the fields of the newsk from the oldsk and migrate the + * asoc to the newsk. + */ + sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH); + *sockp = sock; + + return err; +} + +static int sctp_getsockopt_peeloff(struct sock *sk, int len, char *optval, int *optlen) +{ + sctp_peeloff_arg_t peeloff; + struct socket *newsock; + int retval = 0; + struct sctp_association *asoc; + + if (len != sizeof(sctp_peeloff_arg_t)) + return -EINVAL; + if (copy_from_user(&peeloff, optval, len)) + return -EFAULT; + + asoc = sctp_id2assoc(sk, peeloff.associd); + if (!asoc) { + retval = -EINVAL; + goto out; + } + + SCTP_DEBUG_PRINTK("%s: sk: %p asoc: %p\n", __FUNCTION__, sk, asoc); + + retval = sctp_do_peeloff(asoc, &newsock); + if (retval < 0) + goto out; + + /* Map the socket to an unused fd that can be returned to the user. */ + retval = sock_map_fd(newsock); + if (retval < 0) { + sock_release(newsock); + goto out; + } + + SCTP_DEBUG_PRINTK("%s: sk: %p asoc: %p newsk: %p sd: %d\n", + __FUNCTION__, sk, asoc, newsock->sk, retval); + + /* Return the fd mapped to the new socket. */ + peeloff.sd = retval; + if (copy_to_user(optval, &peeloff, len)) + retval = -EFAULT; + +out: + return retval; +} + +static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len, + char *optval, int *optlen) +{ + struct sctp_paddrparams params; + struct sctp_association *asoc; + union sctp_addr *addr; + struct sctp_transport *trans; + + if (len != sizeof(struct sctp_paddrparams)) + return -EINVAL; + if (copy_from_user(¶ms, optval, *optlen)) + return -EFAULT; + + asoc = sctp_id2assoc(sk, params.spp_assoc_id); + if (!asoc) + return -EINVAL; + + addr = (union sctp_addr *) &(params.spp_address); + + trans = sctp_assoc_lookup_paddr(asoc, addr); + if (!trans) + return -ENOENT; + + /* The value of the heartbeat interval, in milliseconds. A value of 0, + * when modifying the parameter, specifies that the heartbeat on this + * address should be disabled. + */ + if (!trans->hb_allowed) + params.spp_hbinterval = 0; + else + params.spp_hbinterval = trans->hb_interval * 1000 / HZ; + + /* spp_pathmaxrxt contains the maximum number of retransmissions + * before this address shall be considered unreachable. + */ + params.spp_pathmaxrxt = trans->error_threshold; + + if (copy_to_user(optval, ¶ms, len)) + return -EFAULT; + *optlen = len; + + return 0; +} + +static int sctp_getsockopt_initmsg(struct sock *sk, int len, char *optval, int *optlen) +{ + if (len != sizeof(struct sctp_initmsg)) + return -EINVAL; + if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len)) + return -EFAULT; + return 0; +} + +static int sctp_getsockopt_peer_addrs_num(struct sock *sk, int len, + char *optval, int *optlen) +{ + sctp_assoc_t id; + struct sctp_association *asoc; + struct list_head *pos; + int cnt = 0; + + if (len != sizeof(sctp_assoc_t)) + return -EINVAL; + + if (copy_from_user(&id, optval, sizeof(sctp_assoc_t))) + return -EFAULT; + + /* + * For UDP-style sockets, id specifies the association to query. + */ + asoc = sctp_id2assoc(sk, id); + if (!asoc) + return -EINVAL; + + list_for_each(pos, &asoc->peer.transport_addr_list) { + cnt ++; + } + if (copy_to_user(optval, &cnt, sizeof(int))) + return -EFAULT; + + return 0; +} + +static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, + char *optval, int *optlen) +{ + struct sctp_association *asoc; + struct list_head *pos; + int cnt = 0; + struct sctp_getaddrs getaddrs; + struct sctp_transport *from; + struct sockaddr_storage *to; + + if (len != sizeof(struct sctp_getaddrs)) + return -EINVAL; + + if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs))) + return -EFAULT; + + if (getaddrs.addr_num <= 0) return -EINVAL; + /* + * For UDP-style sockets, id specifies the association to query. + */ + asoc = sctp_id2assoc(sk, getaddrs.assoc_id); + if (!asoc) + return -EINVAL; + + to = getaddrs.addrs; + list_for_each(pos, &asoc->peer.transport_addr_list) { + from = list_entry(pos, struct sctp_transport, transports); + if (copy_to_user(to, &from->ipaddr, sizeof(from->ipaddr))) + return -EFAULT; + to ++; + cnt ++; + if (cnt >= getaddrs.addr_num) break; + } + getaddrs.addr_num = cnt; + if (copy_to_user(optval, &getaddrs, sizeof(struct sctp_getaddrs))) + return -EFAULT; + + return 0; +} + +static int sctp_getsockopt_local_addrs_num(struct sock *sk, int len, + char *optval, int *optlen) +{ + sctp_assoc_t id; + sctp_bind_addr_t *bp; + struct sctp_association *asoc; + struct list_head *pos; + int cnt = 0; + + if (len != sizeof(sctp_assoc_t)) + return -EINVAL; + + if (copy_from_user(&id, optval, sizeof(sctp_assoc_t))) + return -EFAULT; + + /* + * For UDP-style sockets, id specifies the association to query. + * If the id field is set to the value '0' then the locally bound + * addresses are returned without regard to any particular + * association. + */ + if (0 == id) { + bp = &sctp_sk(sk)->ep->base.bind_addr; + } else { + asoc = sctp_id2assoc(sk, id); + if (!asoc) + return -EINVAL; + bp = &asoc->base.bind_addr; + } + + list_for_each(pos, &bp->address_list) { + cnt ++; + } + if (copy_to_user(optval, &cnt, sizeof(int))) + return -EFAULT; + + return 0; +} + +static int sctp_getsockopt_local_addrs(struct sock *sk, int len, + char *optval, int *optlen) +{ + sctp_bind_addr_t *bp; + struct sctp_association *asoc; + struct list_head *pos; + int cnt = 0; + struct sctp_getaddrs getaddrs; + struct sockaddr_storage_list *from; + struct sockaddr_storage *to; + + if (len != sizeof(struct sctp_getaddrs)) + return -EINVAL; + + if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs))) + return -EFAULT; + + if (getaddrs.addr_num <= 0) return -EINVAL; + /* + * For UDP-style sockets, id specifies the association to query. + * If the id field is set to the value '0' then the locally bound + * addresses are returned without regard to any particular + * association. + */ + if (0 == getaddrs.assoc_id) { + bp = &sctp_sk(sk)->ep->base.bind_addr; + } else { + asoc = sctp_id2assoc(sk, getaddrs.assoc_id); + if (!asoc) + return -EINVAL; + bp = &asoc->base.bind_addr; + } + + to = getaddrs.addrs; + list_for_each(pos, &bp->address_list) { + from = list_entry(pos, + struct sockaddr_storage_list, + list); + if (copy_to_user(to, &from->a, sizeof(from->a))) + return -EFAULT; + to ++; + cnt ++; + if (cnt >= getaddrs.addr_num) break; + } + getaddrs.addr_num = cnt; + if (copy_to_user(optval, &getaddrs, sizeof(struct sctp_getaddrs))) + return -EFAULT; + + return 0; +} + +/* 7.1.10 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR) + * + * Requests that the local SCTP stack use the enclosed peer address as + * the association primary. The enclosed address must be one of the + * association peer's addresses. + */ +static int sctp_getsockopt_peer_prim(struct sock *sk, int len, + char *optval, int *optlen) +{ + struct sctp_setpeerprim prim; + struct sctp_association *asoc; + + if (len != sizeof(struct sctp_setpeerprim)) + return -EINVAL; + + if (copy_from_user(&prim, optval, sizeof(struct sctp_setpeerprim))) + return -EFAULT; + + asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); + if (!asoc) + return -EINVAL; + + if (!asoc->peer.primary_path) + return -ENOTCONN; + + memcpy(&prim.sspp_addr, &asoc->peer.primary_path->ipaddr, + sizeof(union sctp_addr)); + + if (copy_to_user(optval, &prim, sizeof(struct sctp_setpeerprim))) + return -EFAULT; + + return 0; +} + +/* + * + * 7.1.15 Set default send parameters (SET_DEFAULT_SEND_PARAM) + * + * Applications that wish to use the sendto() system call may wish to + * specify a default set of parameters that would normally be supplied + * through the inclusion of ancillary data. This socket option allows + * such an application to set the default sctp_sndrcvinfo structure. + * The application that wishes to use this socket option simply passes + * in to this call the sctp_sndrcvinfo structure defined in Section + * 5.2.2) The input parameters accepted by this call include + * sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context, + * sinfo_timetolive. The user must provide the sinfo_assoc_id field in + * to this call if the caller is using the UDP model. + * + * For getsockopt, it get the default sctp_sndrcvinfo structure. + */ +static int sctp_getsockopt_default_send_param(struct sock *sk, + int len, char *optval, int *optlen) +{ + struct sctp_sndrcvinfo info; + struct sctp_association *asoc; + + if (len != sizeof(struct sctp_sndrcvinfo)) + return -EINVAL; + if (copy_from_user(&info, optval, sizeof(struct sctp_sndrcvinfo))) + return -EFAULT; + + asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); + if (!asoc) + return -EINVAL; + + info.sinfo_stream = asoc->defaults.stream; + info.sinfo_flags = asoc->defaults.flags; + info.sinfo_ppid = asoc->defaults.ppid; + info.sinfo_context = asoc->defaults.context; + info.sinfo_timetolive = asoc->defaults.timetolive; + + if (copy_to_user(optval, &info, sizeof(struct sctp_sndrcvinfo))) + return -EFAULT; + + return 0; +} + +/* + * + * 7.1.5 SCTP_NODELAY + * + * Turn on/off any Nagle-like algorithm. This means that packets are + * generally sent as soon as possible and no unnecessary delays are + * introduced, at the cost of more packets in the network. Expects an + * integer boolean flag. + */ + +static int sctp_getsockopt_nodelay(struct sock *sk, int len, + char *optval, int *optlen) +{ + __u8 val; + + if (len < sizeof(__u8)) + return -EINVAL; + + len = sizeof(__u8); + val = (sctp_sk(sk)->nodelay == 1); + if (put_user(len, optlen)) + return -EFAULT; + if (copy_to_user(optval, &val, len)) + return -EFAULT; + return 0; +} + +SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname, + char *optval, int *optlen) +{ + int retval = 0; + int len; + + SCTP_DEBUG_PRINTK("sctp_getsockopt(sk: %p, ...)\n", sk); + + /* I can hardly begin to describe how wrong this is. This is + * so broken as to be worse than useless. The API draft + * REALLY is NOT helpful here... I am not convinced that the + * semantics of getsockopt() with a level OTHER THAN SOL_SCTP + * are at all well-founded. + */ + if (level != SOL_SCTP) { + struct sctp_af *af = sctp_sk(sk)->pf->af; + + retval = af->getsockopt(sk, level, optname, optval, optlen); + return retval; + } + + if (get_user(len, optlen)) + return -EFAULT; + + sctp_lock_sock(sk); + + switch (optname) { + case SCTP_STATUS: + retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen); + break; + case SCTP_DISABLE_FRAGMENTS: + retval = sctp_getsockopt_disable_fragments(sk, len, optval, + optlen); + break; + case SCTP_SET_EVENTS: + retval = sctp_getsockopt_set_events(sk, len, optval, optlen); + break; + case SCTP_AUTOCLOSE: + retval = sctp_getsockopt_autoclose(sk, len, optval, optlen); + break; + case SCTP_SOCKOPT_PEELOFF: + retval = sctp_getsockopt_peeloff(sk, len, optval, optlen); + break; + case SCTP_GET_PEER_ADDR_PARAMS: + retval = sctp_getsockopt_peer_addr_params(sk, len, optval, + optlen); + break; + case SCTP_INITMSG: + retval = sctp_getsockopt_initmsg(sk, len, optval, optlen); + break; + case SCTP_GET_PEER_ADDRS_NUM: + retval = sctp_getsockopt_peer_addrs_num(sk, len, optval, + optlen); + break; + case SCTP_GET_LOCAL_ADDRS_NUM: + retval = sctp_getsockopt_local_addrs_num(sk, len, optval, + optlen); + break; + case SCTP_GET_PEER_ADDRS: + retval = sctp_getsockopt_peer_addrs(sk, len, optval, + optlen); + break; + case SCTP_GET_LOCAL_ADDRS: + retval = sctp_getsockopt_local_addrs(sk, len, optval, + optlen); + break; + case SCTP_SET_DEFAULT_SEND_PARAM: + retval = sctp_getsockopt_default_send_param(sk, len, + optval, optlen); + break; + case SCTP_SET_PEER_PRIMARY_ADDR: + retval = sctp_getsockopt_peer_prim(sk, len, optval, optlen); + break; + case SCTP_NODELAY: + retval = sctp_getsockopt_nodelay(sk, len, optval, optlen); + break; + default: + retval = -ENOPROTOOPT; + break; + }; + + sctp_release_sock(sk); + return retval; +} + +static void sctp_hash(struct sock *sk) +{ + /* STUB */ +} + +static void sctp_unhash(struct sock *sk) +{ + /* STUB */ +} + +/* Check if port is acceptable. Possibly find first available port. + * + * The port hash table (contained in the 'global' SCTP protocol storage + * returned by struct sctp_protocol *sctp_get_protocol()). The hash + * table is an array of 4096 lists (sctp_bind_hashbucket_t). Each + * list (the list number is the port number hashed out, so as you + * would expect from a hash function, all the ports in a given list have + * such a number that hashes out to the same list number; you were + * expecting that, right?); so each list has a set of ports, with a + * link to the socket (struct sock) that uses it, the port number and + * a fastreuse flag (FIXME: NPI ipg). + */ +static sctp_bind_bucket_t *sctp_bucket_create(sctp_bind_hashbucket_t *head, + unsigned short snum); +static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr) +{ + sctp_bind_hashbucket_t *head; /* hash list */ + sctp_bind_bucket_t *pp; /* hash list port iterator */ + struct sctp_protocol *sctp = sctp_get_protocol(); + unsigned short snum; + int ret; + + /* NOTE: Remember to put this back to net order. */ + addr->v4.sin_port = ntohs(addr->v4.sin_port); + snum = addr->v4.sin_port; + + SCTP_DEBUG_PRINTK("sctp_get_port() begins, snum=%d\n", snum); + + sctp_local_bh_disable(); + + if (snum == 0) { + /* Search for an available port. + * + * 'sctp->port_rover' was the last port assigned, so + * we start to search from 'sctp->port_rover + + * 1'. What we do is first check if port 'rover' is + * already in the hash table; if not, we use that; if + * it is, we try next. + */ + int low = sysctl_local_port_range[0]; + int high = sysctl_local_port_range[1]; + int remaining = (high - low) + 1; + int rover; + int index; + + sctp_spin_lock(&sctp->port_alloc_lock); + rover = sctp->port_rover; + do { + rover++; + if ((rover < low) || (rover > high)) + rover = low; + index = sctp_phashfn(rover); + head = &sctp->port_hashtable[index]; + sctp_spin_lock(&head->lock); + for (pp = head->chain; pp; pp = pp->next) + if (pp->port == rover) + goto next; + break; + next: + sctp_spin_unlock(&head->lock); + } while (--remaining > 0); + sctp->port_rover = rover; + sctp_spin_unlock(&sctp->port_alloc_lock); + + /* Exhausted local port range during search? */ + ret = 1; + if (remaining <= 0) + goto fail; + + /* OK, here is the one we will use. HEAD (the port + * hash table list entry) is non-NULL and we hold it's + * mutex. + */ + snum = rover; + pp = NULL; + } else { + /* We are given an specific port number; we verify + * that it is not being used. If it is used, we will + * exahust the search in the hash list corresponding + * to the port number (snum) - we detect that with the + * port iterator, pp being NULL. + */ + head = &sctp->port_hashtable[sctp_phashfn(snum)]; + sctp_spin_lock(&head->lock); + for (pp = head->chain; pp; pp = pp->next) { + if (pp->port == snum) + break; + } + } + + + if (pp && pp->sk) { + /* We had a port hash table hit - there is an + * available port (pp != NULL) and it is being + * used by other socket (pp->sk != NULL); that other + * socket is going to be sk2. + */ + int sk_reuse = sk->reuse; + struct sock *sk2 = pp->sk; + + SCTP_DEBUG_PRINTK("sctp_get_port() found a " + "possible match\n"); + if (pp->fastreuse != 0 && sk->reuse != 0) + goto success; + + /* Run through the list of sockets bound to the port + * (pp->port) [via the pointers bind_next and + * bind_pprev in the struct sock *sk2 (pp->sk)]. On each one, + * we get the endpoint they describe and run through + * the endpoint's list of IP (v4 or v6) addresses, + * comparing each of the addresses with the address of + * the socket sk. If we find a match, then that means + * that this port/socket (sk) combination are already + * in an endpoint. + */ + for ( ; sk2 != NULL; sk2 = sk2->bind_next) { + struct sctp_endpoint *ep2; + ep2 = sctp_sk(sk2)->ep; + + if (sk_reuse && sk2->reuse) + continue; + + if (sctp_bind_addr_match(&ep2->base.bind_addr, addr, + sctp_sk(sk))) + goto found; + } + + found: + /* If we found a conflict, fail. */ + if (sk2 != NULL) { + ret = (long) sk2; + goto fail_unlock; + } + SCTP_DEBUG_PRINTK("sctp_get_port(): Found a match\n"); + } + + /* If there was a hash table miss, create a new port. */ + ret = 1; + + if (!pp && !(pp = sctp_bucket_create(head, snum))) + goto fail_unlock; + + /* In either case (hit or miss), make sure fastreuse is 1 only + * if sk->reuse is too (that is, if the caller requested + * SO_REUSEADDR on this socket -sk-). + */ + if (!pp->sk) + pp->fastreuse = sk->reuse ? 1 : 0; + else if (pp->fastreuse && sk->reuse == 0) + pp->fastreuse = 0; + + /* We are set, so fill up all the data in the hash table + * entry, tie the socket list information with the rest of the + * sockets FIXME: Blurry, NPI (ipg). + */ +success: + (sk)->num = snum; + if (sk->prev == NULL) { + if ((sk->bind_next = pp->sk) != NULL) + pp->sk->bind_pprev = &sk->bind_next; + pp->sk = sk; + sk->bind_pprev = &pp->sk; + sk->prev = (struct sock *) pp; + } + ret = 0; + +fail_unlock: + sctp_spin_unlock(&head->lock); + +fail: + sctp_local_bh_enable(); + + SCTP_DEBUG_PRINTK("sctp_get_port() ends, ret=%d\n", ret); + addr->v4.sin_port = htons(addr->v4.sin_port); + return ret; +} + +/* Assign a 'snum' port to the socket. If snum == 0, an ephemeral + * port is requested. + */ +static int sctp_get_port(struct sock *sk, unsigned short snum) +{ + long ret; + union sctp_addr addr; + struct sctp_af *af = sctp_sk(sk)->pf->af; + + /* Set up a dummy address struct from the sk. */ + af->from_sk(&addr, sk); + addr.v4.sin_port = htons(snum); + + /* Note: sk->num gets filled in if ephemeral port request. */ + ret = sctp_get_port_local(sk, &addr); + + return (ret ? 1 : 0); +} + +/* + * 3.1.3 listen() - UDP Style Syntax + * + * By default, new associations are not accepted for UDP style sockets. + * An application uses listen() to mark a socket as being able to + * accept new associations. + */ +SCTP_STATIC int sctp_seqpacket_listen(struct sock *sk, int backlog) +{ + struct sctp_opt *sp = sctp_sk(sk); + struct sctp_endpoint *ep = sp->ep; + + /* Only UDP style sockets that are not peeled off are allowed to + * listen(). + */ + if (SCTP_SOCKET_UDP != sp->type) + return -EINVAL; + + if (sk->state == SCTP_SS_LISTENING) + return 0; + + /* + * If a bind() or sctp_bindx() is not called prior to a listen() + * call that allows new associations to be accepted, the system + * picks an ephemeral port and will choose an address set equivalent + * to binding with a wildcard address. + * + * This is not currently spelled out in the SCTP sockets + * extensions draft, but follows the practice as seen in TCP + * sockets. + */ + if (!ep->base.bind_addr.port) { + if (sctp_autobind(sk)) + return -EAGAIN; + } + sk->state = SCTP_SS_LISTENING; + sctp_hash_endpoint(ep); + return 0; +} + +/* + * 4.1.3 listen() - TCP Style Syntax + * + * Applications uses listen() to ready the SCTP endpoint for accepting + * inbound associations. + */ +SCTP_STATIC int sctp_stream_listen(struct sock *sk, int backlog) +{ + struct sctp_opt *sp = sctp_sk(sk); + struct sctp_endpoint *ep = sp->ep; + + if (sk->state == SCTP_SS_LISTENING) + return 0; + + /* + * If a bind() or sctp_bindx() is not called prior to a listen() + * call that allows new associations to be accepted, the system + * picks an ephemeral port and will choose an address set equivalent + * to binding with a wildcard address. + * + * This is not currently spelled out in the SCTP sockets + * extensions draft, but follows the practice as seen in TCP + * sockets. + */ + if (!ep->base.bind_addr.port) { + if (sctp_autobind(sk)) + return -EAGAIN; + } + sk->state = SCTP_SS_LISTENING; + sk->max_ack_backlog = backlog; + sctp_hash_endpoint(ep); + return 0; +} + +/* + * Move a socket to LISTENING state. + */ +int sctp_inet_listen(struct socket *sock, int backlog) +{ + struct sock *sk = sock->sk; + struct crypto_tfm *tfm=NULL; + int err = -EINVAL; + + if (unlikely(backlog < 0)) + goto out; + + sctp_lock_sock(sk); + + if (sock->state != SS_UNCONNECTED) + goto out; + + /* Allocate HMAC for generating cookie. */ + if (sctp_hmac_alg) { + tfm = sctp_crypto_alloc_tfm(sctp_hmac_alg, 0); + if (!tfm) { + err = -ENOSYS; + goto out; + } + } + + switch (sock->type) { + case SOCK_SEQPACKET: + err = sctp_seqpacket_listen(sk, backlog); + break; + case SOCK_STREAM: + err = sctp_stream_listen(sk, backlog); + break; + default: + break; + }; + if (err) + goto cleanup; + + /* Store away the transform reference. */ + sctp_sk(sk)->hmac = tfm; +out: + sctp_release_sock(sk); + return err; +cleanup: + if (tfm) + sctp_crypto_free_tfm(tfm); + goto out; +} + +/* + * This function is done by modeling the current datagram_poll() and the + * tcp_poll(). Note that, based on these implementations, we don't + * lock the socket in this function, even though it seems that, + * ideally, locking or some other mechanisms can be used to ensure + * the integrity of the counters (sndbuf and wmem_queued) used + * in this place. We assume that we don't need locks either until proven + * otherwise. + * + * Another thing to note is that we include the Async I/O support + * here, again, by modeling the current TCP/UDP code. We don't have + * a good way to test with it yet. + */ +unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait) +{ + struct sock *sk = sock->sk; + unsigned int mask; + + poll_wait(file, sk->sleep, wait); + mask = 0; + + /* Is there any exceptional events? */ + if (sk->err || !skb_queue_empty(&sk->error_queue)) + mask |= POLLERR; + if (sk->shutdown == SHUTDOWN_MASK) + mask |= POLLHUP; + + /* Is it readable? Reconsider this code with TCP-style support. */ + if (!skb_queue_empty(&sk->receive_queue) || + (sk->shutdown & RCV_SHUTDOWN)) + mask |= POLLIN | POLLRDNORM; + + /* + * FIXME: We need to set SCTP_SS_DISCONNECTING for TCP-style and + * peeled off sockets. Additionally, TCP-style needs to consider + * other establishment conditions. + */ + if (SCTP_SOCKET_UDP != sctp_sk(sk)->type) { + /* The association is going away. */ + if (SCTP_SS_DISCONNECTING == sk->state) + mask |= POLLHUP; + /* The association is either gone or not ready. */ + if (SCTP_SS_CLOSED == sk->state) + return mask; + } + + /* Is it writable? */ + if (sctp_writeable(sk)) { + mask |= POLLOUT | POLLWRNORM; + } else { + set_bit(SOCK_ASYNC_NOSPACE, &sk->socket->flags); + /* + * Since the socket is not locked, the buffer + * might be made available after the writeable check and + * before the bit is set. This could cause a lost I/O + * signal. tcp_poll() has a race breaker for this race + * condition. Based on their implementation, we put + * in the following code to cover it as well. + */ + if (sctp_writeable(sk)) + mask |= POLLOUT | POLLWRNORM; + } + return mask; +} + +/******************************************************************** + * 2nd Level Abstractions + ********************************************************************/ + +static sctp_bind_bucket_t *sctp_bucket_create(sctp_bind_hashbucket_t *head, unsigned short snum) +{ + sctp_bind_bucket_t *pp; + + SCTP_DEBUG_PRINTK( "sctp_bucket_create() begins, snum=%d\n", snum); + pp = kmalloc(sizeof(sctp_bind_bucket_t), GFP_ATOMIC); + if (pp) { + pp->port = snum; + pp->fastreuse = 0; + pp->sk = NULL; + if ((pp->next = head->chain) != NULL) + pp->next->pprev = &pp->next; + head->chain = pp; + pp->pprev = &head->chain; + } + SCTP_DEBUG_PRINTK("sctp_bucket_create() ends, pp=%p\n", pp); + return pp; +} + +/* FIXME: Comments! */ +static __inline__ void __sctp_put_port(struct sock *sk) +{ + struct sctp_protocol *sctp_proto = sctp_get_protocol(); + sctp_bind_hashbucket_t *head = + &sctp_proto->port_hashtable[sctp_phashfn((sk)->num)]; + sctp_bind_bucket_t *pp; + + sctp_spin_lock(&head->lock); + pp = (sctp_bind_bucket_t *) sk->prev; + if (sk->bind_next) + sk->bind_next->bind_pprev = sk->bind_pprev; + *(sk->bind_pprev) = sk->bind_next; + sk->prev = NULL; + (sk)->num = 0; + if (pp->sk) { + if (pp->next) + pp->next->pprev = pp->pprev; + *(pp->pprev) = pp->next; + kfree(pp); + } + sctp_spin_unlock(&head->lock); +} + +void sctp_put_port(struct sock *sk) +{ + sctp_local_bh_disable(); + __sctp_put_port(sk); + sctp_local_bh_enable(); +} + +/* + * The system picks an ephemeral port and choose an address set equivalent + * to binding with a wildcard address. + * One of those addresses will be the primary address for the association. + * This automatically enables the multihoming capability of SCTP. + */ +static int sctp_autobind(struct sock *sk) +{ + union sctp_addr autoaddr; + struct sctp_af *af; + unsigned short port; + + /* Initialize a local sockaddr structure to INADDR_ANY. */ + af = sctp_sk(sk)->pf->af; + + port = htons((sk)->num); + af->inaddr_any(&autoaddr, port); + + return sctp_do_bind(sk, &autoaddr, af->sockaddr_len); +} + +/* Parse out IPPROTO_SCTP CMSG headers. Perform only minimal validation. + * + * From RFC 2292 + * 4.2 The cmsghdr Structure * + * + * When ancillary data is sent or received, any number of ancillary data + * objects can be specified by the msg_control and msg_controllen members of + * the msghdr structure, because each object is preceded by + * a cmsghdr structure defining the object's length (the cmsg_len member). + * Historically Berkeley-derived implementations have passed only one object + * at a time, but this API allows multiple objects to be + * passed in a single call to sendmsg() or recvmsg(). The following example + * shows two ancillary data objects in a control buffer. + * + * |<--------------------------- msg_controllen -------------------------->| + * | | + * + * |<----- ancillary data object ----->|<----- ancillary data object ----->| + * + * |<---------- CMSG_SPACE() --------->|<---------- CMSG_SPACE() --------->| + * | | | + * + * |<---------- cmsg_len ---------->| |<--------- cmsg_len ----------->| | + * + * |<--------- CMSG_LEN() --------->| |<-------- CMSG_LEN() ---------->| | + * | | | | | + * + * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+ + * |cmsg_|cmsg_|cmsg_|XX| |XX|cmsg_|cmsg_|cmsg_|XX| |XX| + * + * |len |level|type |XX|cmsg_data[]|XX|len |level|type |XX|cmsg_data[]|XX| + * + * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+ + * ^ + * | + * + * msg_control + * points here + */ +SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *msg, + sctp_cmsgs_t *cmsgs) +{ + struct cmsghdr *cmsg; + + for (cmsg = CMSG_FIRSTHDR(msg); + cmsg != NULL; + cmsg = CMSG_NXTHDR((struct msghdr*)msg, cmsg)) { + /* Check for minimum length. The SCM code has this check. */ + if (cmsg->cmsg_len < sizeof(struct cmsghdr) || + (unsigned long)(((char*)cmsg - (char*)msg->msg_control) + + cmsg->cmsg_len) > msg->msg_controllen) { + return -EINVAL; + } + + /* Should we parse this header or ignore? */ + if (cmsg->cmsg_level != IPPROTO_SCTP) + continue; + + /* Strictly check lengths following example in SCM code. */ + switch (cmsg->cmsg_type) { + case SCTP_INIT: + /* SCTP Socket API Extension + * 5.2.1 SCTP Initiation Structure (SCTP_INIT) + * + * This cmsghdr structure provides information for + * initializing new SCTP associations with sendmsg(). + * The SCTP_INITMSG socket option uses this same data + * structure. This structure is not used for + * recvmsg(). + * + * cmsg_level cmsg_type cmsg_data[] + * ------------ ------------ ---------------------- + * IPPROTO_SCTP SCTP_INIT struct sctp_initmsg + */ + if (cmsg->cmsg_len != + CMSG_LEN(sizeof(struct sctp_initmsg))) + return -EINVAL; + cmsgs->init = (struct sctp_initmsg *)CMSG_DATA(cmsg); + break; + + case SCTP_SNDRCV: + /* SCTP Socket API Extension + * 5.2.2 SCTP Header Information Structure(SCTP_SNDRCV) + * + * This cmsghdr structure specifies SCTP options for + * sendmsg() and describes SCTP header information + * about a received message through recvmsg(). + * + * cmsg_level cmsg_type cmsg_data[] + * ------------ ------------ ---------------------- + * IPPROTO_SCTP SCTP_SNDRCV struct sctp_sndrcvinfo + */ + if (cmsg->cmsg_len != + CMSG_LEN(sizeof(struct sctp_sndrcvinfo))) + return -EINVAL; + + cmsgs->info = + (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); + + /* Minimally, validate the sinfo_flags. */ + if (cmsgs->info->sinfo_flags & + ~(MSG_UNORDERED | MSG_ADDR_OVER | + MSG_ABORT | MSG_EOF)) + return -EINVAL; + break; + + default: + return -EINVAL; + }; + } + return 0; +} + +/* + * Wait for a packet.. + * Note: This function is the same function as in core/datagram.c + * with a few modifications to make lksctp work. + */ +static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p) +{ + int error; + DECLARE_WAITQUEUE(wait, current); + + __set_current_state(TASK_INTERRUPTIBLE); + add_wait_queue_exclusive(sk->sleep, &wait); + + /* Socket errors? */ + error = sock_error(sk); + if (error) + goto out; + + if (!skb_queue_empty(&sk->receive_queue)) + goto ready; + + /* Socket shut down? */ + if (sk->shutdown & RCV_SHUTDOWN) + goto out; + + /* Sequenced packets can come disconnected. If so we report the + * problem. + */ + error = -ENOTCONN; + + /* Is there a good reason to think that we may receive some data? */ + if ((list_empty(&sctp_sk(sk)->ep->asocs)) && + (sk->state != SCTP_SS_LISTENING)) + goto out; + + /* Handle signals. */ + if (signal_pending(current)) + goto interrupted; + + /* Let another process have a go. Since we are going to sleep + * anyway. Note: This may cause odd behaviors if the message + * does not fit in the user's buffer, but this seems to be the + * only way to honor MSG_DONTWAIT realistically. + */ + sctp_release_sock(sk); + *timeo_p = schedule_timeout(*timeo_p); + sctp_lock_sock(sk); + +ready: + remove_wait_queue(sk->sleep, &wait); + __set_current_state(TASK_RUNNING); + return 0; + +interrupted: + error = sock_intr_errno(*timeo_p); + +out: + remove_wait_queue(sk->sleep, &wait); + __set_current_state(TASK_RUNNING); + *err = error; + return error; +} + +/* Receive a datagram. + * Note: This is pretty much the same routine as in core/datagram.c + * with a few changes to make lksctp work. + */ +static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, + int noblock, int *err) +{ + int error; + struct sk_buff *skb; + long timeo; + + /* Caller is allowed not to check sk->err before calling. */ + error = sock_error(sk); + if (error) + goto no_packet; + + timeo = sock_rcvtimeo(sk, noblock); + + SCTP_DEBUG_PRINTK("Timeout: timeo: %ld, MAX: %ld.\n", + timeo, MAX_SCHEDULE_TIMEOUT); + + do { + /* Again only user level code calls this function, + * so nothing interrupt level + * will suddenly eat the receive_queue. + * + * Look at current nfs client by the way... + * However, this function was corrent in any case. 8) + */ + if (flags & MSG_PEEK) { + unsigned long cpu_flags; + + sctp_spin_lock_irqsave(&sk->receive_queue.lock, + cpu_flags); + skb = skb_peek(&sk->receive_queue); + if (skb) + atomic_inc(&skb->users); + sctp_spin_unlock_irqrestore(&sk->receive_queue.lock, + cpu_flags); + } else { + skb = skb_dequeue(&sk->receive_queue); + } + + if (skb) + return skb; + + if (sk->shutdown & RCV_SHUTDOWN) + break; + + /* User doesn't want to wait. */ + error = -EAGAIN; + if (!timeo) + goto no_packet; + } while (sctp_wait_for_packet(sk, err, &timeo) == 0); + + return NULL; + +no_packet: + *err = error; + return NULL; +} + +/* Verify that this is a valid address. */ +static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr, + int len) +{ + struct sctp_af *af; + + /* Verify basic sockaddr. */ + af = sctp_sockaddr_af(sctp_sk(sk), addr, len); + if (!af) + return -EINVAL; + + /* Is this a valid SCTP address? */ + if (!af->addr_valid(addr)) + return -EINVAL; + + if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr))) + return -EINVAL; + + return 0; +} + +/* Get the sndbuf space available at the time on the association. */ +static inline int sctp_wspace(struct sctp_association *asoc) +{ + struct sock *sk = asoc->base.sk; + int amt = 0; + + amt = sk->sndbuf - asoc->sndbuf_used; + if (amt < 0) + amt = 0; + return amt; +} + +/* Increment the used sndbuf space count of the corresponding association by + * the size of the outgoing data chunk. + * Also, set the skb destructor for sndbuf accounting later. + * + * Since it is always 1-1 between chunk and skb, and also a new skb is always + * allocated for chunk bundling in sctp_packet_transmit(), we can use the + * destructor in the data chunk skb for the purpose of the sndbuf space + * tracking. + */ +static inline void sctp_set_owner_w(sctp_chunk_t *chunk) +{ + struct sctp_association *asoc = chunk->asoc; + struct sock *sk = asoc->base.sk; + + /* The sndbuf space is tracked per association. */ + sctp_association_hold(asoc); + + chunk->skb->destructor = sctp_wfree; + /* Save the chunk pointer in skb for sctp_wfree to use later. */ + *((sctp_chunk_t **)(chunk->skb->cb)) = chunk; + + asoc->sndbuf_used += SCTP_DATA_SNDSIZE(chunk); + sk->wmem_queued += SCTP_DATA_SNDSIZE(chunk); +} + +/* If sndbuf has changed, wake up per association sndbuf waiters. */ +static void __sctp_write_space(struct sctp_association *asoc) +{ + struct sock *sk = asoc->base.sk; + struct socket *sock = sk->socket; + + if ((sctp_wspace(asoc) > 0) && sock) { + if (waitqueue_active(&asoc->wait)) + wake_up_interruptible(&asoc->wait); + + if (sctp_writeable(sk)) { + if (sk->sleep && waitqueue_active(sk->sleep)) + wake_up_interruptible(sk->sleep); + + /* Note that we try to include the Async I/O support + * here by modeling from the current TCP/UDP code. + * We have not tested with it yet. + */ + if (sock->fasync_list && + !(sk->shutdown & SEND_SHUTDOWN)) + sock_wake_async(sock, 2, POLL_OUT); + } + } +} + +/* Do accounting for the sndbuf space. + * Decrement the used sndbuf space of the corresponding association by the + * data size which was just transmitted(freed). + */ +static void sctp_wfree(struct sk_buff *skb) +{ + struct sctp_association *asoc; + sctp_chunk_t *chunk; + struct sock *sk; + + /* Get the saved chunk pointer. */ + chunk = *((sctp_chunk_t **)(skb->cb)); + asoc = chunk->asoc; + sk = asoc->base.sk; + asoc->sndbuf_used -= SCTP_DATA_SNDSIZE(chunk); + sk->wmem_queued -= SCTP_DATA_SNDSIZE(chunk); + __sctp_write_space(asoc); + + sctp_association_put(asoc); +} + +/* Helper function to wait for space in the sndbuf. */ +static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, + int msg_len) +{ + struct sock *sk = asoc->base.sk; + int err = 0; + long current_timeo = *timeo_p; + DECLARE_WAITQUEUE(wait, current); + + SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%d\n", + asoc, (long)(*timeo_p), msg_len); + + /* Wait on the association specific sndbuf space. */ + add_wait_queue_exclusive(&asoc->wait, &wait); + + /* Increment the association's refcnt. */ + sctp_association_hold(asoc); + for (;;) { + set_current_state(TASK_INTERRUPTIBLE); + if (!*timeo_p) + goto do_nonblock; + if (sk->err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || + asoc->base.dead) + goto do_error; + if (signal_pending(current)) + goto do_interrupted; + if (msg_len <= sctp_wspace(asoc)) + break; + + /* Let another process have a go. Since we are going + * to sleep anyway. + */ + sctp_release_sock(sk); + current_timeo = schedule_timeout(current_timeo); + sctp_lock_sock(sk); + + *timeo_p = current_timeo; + } + +out: + remove_wait_queue(&asoc->wait, &wait); + + /* Release the association's refcnt. */ + sctp_association_put(asoc); + + __set_current_state(TASK_RUNNING); + return err; + +do_error: + err = -EPIPE; + goto out; + +do_interrupted: + err = sock_intr_errno(*timeo_p); + goto out; + +do_nonblock: + err = -EAGAIN; + goto out; +} + +/* If socket sndbuf has changed, wake up all per association waiters. */ +void sctp_write_space(struct sock *sk) +{ + struct sctp_association *asoc; + struct list_head *pos; + + /* Wake up the tasks in each wait queue. */ + list_for_each(pos, &((sctp_sk(sk))->ep->asocs)) { + asoc = list_entry(pos, struct sctp_association, asocs); + __sctp_write_space(asoc); + } +} + +/* Is there any sndbuf space available on the socket? + * + * Note that wmem_queued is the sum of the send buffers on all of the + * associations on the same socket. For a UDP-style socket with + * multiple associations, it is possible for it to be "unwriteable" + * prematurely. I assume that this is acceptable because + * a premature "unwriteable" is better than an accidental "writeable" which + * would cause an unwanted block under certain circumstances. For the 1-1 + * UDP-style sockets or TCP-style sockets, this code should work. + * - Daisy + */ +static int sctp_writeable(struct sock *sk) +{ + int amt = 0; + + amt = sk->sndbuf - sk->wmem_queued; + if (amt < 0) + amt = 0; + return amt; +} + +/* Wait for an association to go into ESTABLISHED state. If timeout is 0, + * returns immediately with EINPROGRESS. + */ +static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p) +{ + struct sock *sk = asoc->base.sk; + int err = 0; + long current_timeo = *timeo_p; + DECLARE_WAITQUEUE(wait, current); + + SCTP_DEBUG_PRINTK("%s: asoc=%p, timeo=%ld\n", __FUNCTION__, asoc, + (long)(*timeo_p)); + + add_wait_queue_exclusive(&asoc->wait, &wait); + + /* Increment the association's refcnt. */ + sctp_association_hold(asoc); + + for (;;) { + __set_current_state(TASK_INTERRUPTIBLE); + if (!*timeo_p) + goto do_nonblock; + if (sk->shutdown & RCV_SHUTDOWN) + break; + if (sk->err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || + asoc->base.dead) + goto do_error; + if (signal_pending(current)) + goto do_interrupted; + + if (asoc->state == SCTP_STATE_ESTABLISHED) + break; + + /* Let another process have a go. Since we are going + * to sleep anyway. + */ + sctp_release_sock(sk); + current_timeo = schedule_timeout(current_timeo); + sctp_lock_sock(sk); + + *timeo_p = current_timeo; + } + +out: + remove_wait_queue(&asoc->wait, &wait); + + /* Release the association's refcnt. */ + sctp_association_put(asoc); + + __set_current_state(TASK_RUNNING); + + return err; + +do_error: + err = -ECONNREFUSED; + goto out; + +do_interrupted: + err = sock_intr_errno(*timeo_p); + goto out; + +do_nonblock: + err = -EINPROGRESS; + goto out; +} + +static int sctp_wait_for_accept(struct sock *sk, long timeo) +{ + struct sctp_endpoint *ep; + int err = 0; + DECLARE_WAITQUEUE(wait, current); + + ep = sctp_sk(sk)->ep; + + add_wait_queue_exclusive(sk->sleep, &wait); + + for (;;) { + __set_current_state(TASK_INTERRUPTIBLE); + if (list_empty(&ep->asocs)) { + sctp_release_sock(sk); + timeo = schedule_timeout(timeo); + sctp_lock_sock(sk); + } + + err = -EINVAL; + if (sk->state != SCTP_SS_LISTENING) + break; + + err = 0; + if (!list_empty(&ep->asocs)) + break; + + err = sock_intr_errno(timeo); + if (signal_pending(current)) + break; + + err = -EAGAIN; + if (!timeo) + break; + } + + remove_wait_queue(sk->sleep, &wait); + __set_current_state(TASK_RUNNING); + + return err; +} + +/* Populate the fields of the newsk from the oldsk and migrate the assoc + * and its messages to the newsk. + */ +static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, + struct sctp_association *assoc, + sctp_socket_type_t type) +{ + struct sctp_opt *oldsp = sctp_sk(oldsk); + struct sctp_opt *newsp = sctp_sk(newsk); + struct sctp_endpoint *newep = newsp->ep; + struct sk_buff *skb, *tmp; + struct sctp_ulpevent *event; + + /* Migrate socket buffer sizes and all the socket level options to the + * new socket. + */ + newsk->sndbuf = oldsk->sndbuf; + newsk->rcvbuf = oldsk->rcvbuf; + *newsp = *oldsp; + + /* Restore the ep value that was overwritten with the above structure + * copy. + */ + newsp->ep = newep; + newsp->hmac = NULL; + + /* Move any messages in the old socket's receive queue that are for the + * peeled off association to the new socket's receive queue. + */ + sctp_skb_for_each(skb, &oldsk->receive_queue, tmp) { + event = sctp_skb2event(skb); + if (event->event_asoc == assoc) { + __skb_unlink(skb, skb->list); + __skb_queue_tail(&newsk->receive_queue, skb); + } + } + + /* Clean up any messages pending delivery due to partial + * delivery. Three cases: + * 1) No partial deliver; no work. + * 2) Peeling off partial delivery; keep pd_lobby in new pd_lobby. + * 3) Peeling off non-partial delivery; move pd_lobby to recieve_queue. + */ + skb_queue_head_init(&newsp->pd_lobby); + sctp_sk(newsk)->pd_mode = assoc->ulpq.pd_mode;; + + if (sctp_sk(oldsk)->pd_mode) { + struct sk_buff_head *queue; + + /* Decide which queue to move pd_lobby skbs to. */ + if (assoc->ulpq.pd_mode) { + queue = &newsp->pd_lobby; + } else + queue = &newsk->receive_queue; + + /* Walk through the pd_lobby, looking for skbs that + * need moved to the new socket. + */ + sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) { + event = sctp_skb2event(skb); + if (event->event_asoc == assoc) { + __skb_unlink(skb, skb->list); + __skb_queue_tail(queue, skb); + } + } + + /* Clear up any skbs waiting for the partial + * delivery to finish. + */ + if (assoc->ulpq.pd_mode) + sctp_clear_pd(oldsk); + + } + + /* Set the type of socket to indicate that it is peeled off from the + * original UDP-style socket or created with the accept() call on a + * TCP-style socket.. + */ + newsp->type = type; + + /* Migrate the association to the new socket. */ + sctp_assoc_migrate(assoc, newsk); + + newsk->state = SCTP_SS_ESTABLISHED; +} + +/* This proto struct describes the ULP interface for SCTP. */ +struct proto sctp_prot = { + .name = "SCTP", + .close = sctp_close, + .connect = sctp_connect, + .disconnect = sctp_disconnect, + .accept = sctp_accept, + .ioctl = sctp_ioctl, + .init = sctp_init_sock, + .destroy = sctp_destroy_sock, + .shutdown = sctp_shutdown, + .setsockopt = sctp_setsockopt, + .getsockopt = sctp_getsockopt, + .sendmsg = sctp_sendmsg, + .recvmsg = sctp_recvmsg, + .bind = sctp_bind, + .backlog_rcv = sctp_backlog_rcv, + .hash = sctp_hash, + .unhash = sctp_unhash, + .get_port = sctp_get_port, +}; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/ssnmap.c linux-2.4.23-pre8/net/sctp/ssnmap.c --- linux-2.4.22/net/sctp/ssnmap.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/ssnmap.c 2003-10-22 22:48:15.000000000 +0000 @@ -0,0 +1,113 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 2003 International Business Machines, Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions manipulate sctp SSN tracker. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Jon Grimm + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include + + +/* Storage size needed for map includes 2 headers and then the + * specific needs of in or out streams. + */ +static inline size_t sctp_ssnmap_size(__u16 in, __u16 out) +{ + return sizeof(struct sctp_ssnmap) + (in + out) * sizeof(__u16); +} + + +/* Create a new sctp_ssnmap. + * Allocate room to store at least 'len' contiguous TSNs. + */ +struct sctp_ssnmap *sctp_ssnmap_new(__u16 in, __u16 out, int gfp) +{ + struct sctp_ssnmap *retval; + + retval = kmalloc(sctp_ssnmap_size(in, out), gfp); + + if (!retval) + goto fail; + + if (!sctp_ssnmap_init(retval, in, out)) + goto fail_map; + + retval->malloced = 1; + SCTP_DBG_OBJCNT_INC(ssnmap); + + return retval; + +fail_map: + kfree(retval); +fail: + return NULL; +} + + +/* Initialize a block of memory as a ssnmap. */ +struct sctp_ssnmap *sctp_ssnmap_init(struct sctp_ssnmap *map, __u16 in, + __u16 out) +{ + memset(map, 0x00, sctp_ssnmap_size(in, out)); + + /* Start 'in' stream just after the map header. */ + map->in.ssn = (__u16 *)&map[1]; + map->in.len = in; + + /* Start 'out' stream just after 'in'. */ + map->out.ssn = &map->in.ssn[in]; + map->out.len = out; + + return map; +} + +/* Clear out the ssnmap streams. */ +void sctp_ssnmap_clear(struct sctp_ssnmap *map) +{ + size_t size; + + size = (map->in.len + map->out.len) * sizeof(__u16); + memset(map->in.ssn, 0x00, size); +} + +/* Dispose of a ssnmap. */ +void sctp_ssnmap_free(struct sctp_ssnmap *map) +{ + if (map && map->malloced) { + kfree(map); + SCTP_DBG_OBJCNT_DEC(ssnmap); + } +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/sysctl.c linux-2.4.23-pre8/net/sctp/sysctl.c --- linux-2.4.22/net/sctp/sysctl.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/sysctl.c 2003-10-22 22:47:54.000000000 +0000 @@ -0,0 +1,187 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 2002 International Business Machines Corp. + * Copyright (c) 2002 Intel Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * Sysctl related interfaces for SCTP. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Mingqin Liu + * Jon Grimm + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include + +extern struct sctp_protocol sctp_proto; + +static ctl_table sctp_table[] = { + { + .ctl_name = NET_SCTP_RTO_INITIAL, + .procname = "rto_initial", + .data = &sctp_proto.rto_initial, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies + }, + { + .ctl_name = NET_SCTP_RTO_MIN, + .procname = "rto_min", + .data = &sctp_proto.rto_min, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies + }, + { + .ctl_name = NET_SCTP_RTO_MAX, + .procname = "rto_max", + .data = &sctp_proto.rto_max, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies + }, + { + .ctl_name = NET_SCTP_VALID_COOKIE_LIFE, + .procname = "valid_cookie_life", + .data = &sctp_proto.valid_cookie_life, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies + }, + { + .ctl_name = NET_SCTP_MAX_BURST, + .procname = "max_burst", + .data = &sctp_proto.max_burst, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec + }, + { + .ctl_name = NET_SCTP_ASSOCIATION_MAX_RETRANS, + .procname = "association_max_retrans", + .data = &sctp_proto.max_retrans_association, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec + }, + { + .ctl_name = NET_SCTP_PATH_MAX_RETRANS, + .procname = "path_max_retrans", + .data = &sctp_proto.max_retrans_path, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec + }, + { + .ctl_name = NET_SCTP_MAX_INIT_RETRANSMITS, + .procname = "max_init_retransmits", + .data = &sctp_proto.max_retrans_init, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec + }, + { + .ctl_name = NET_SCTP_HB_INTERVAL, + .procname = "hb_interval", + .data = &sctp_proto.hb_interval, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies + }, + { + .ctl_name = NET_SCTP_PRESERVE_ENABLE, + .procname = "cookie_preserve_enable", + .data = &sctp_proto.cookie_preserve_enable, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies + }, + { + .ctl_name = NET_SCTP_RTO_ALPHA, + .procname = "rto_alpha_exp_divisor", + .data = &sctp_proto.rto_alpha, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec + }, + { + .ctl_name = NET_SCTP_RTO_BETA, + .procname = "rto_beta_exp_divisor", + .data = &sctp_proto.rto_beta, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec + }, + { .ctl_name = 0 } +}; + +static ctl_table sctp_net_table[] = { + { + .ctl_name = NET_SCTP, + .procname = "sctp", + .maxlen = 0, + .mode = 0555, + .child = sctp_table + }, + { .ctl_name = 0 } +}; + +static ctl_table sctp_root_table[] = { + { + .ctl_name = CTL_NET, + .procname = "net", + .maxlen = 0, + .mode = 0555, + .child = sctp_net_table + }, + { .ctl_name = 0 } +}; + +static struct ctl_table_header * sctp_sysctl_header; + +/* Sysctl registration. */ +void sctp_sysctl_register(void) +{ + sctp_sysctl_header = register_sysctl_table(sctp_root_table, 0); +} + +/* Sysctl deregistration. */ +void sctp_sysctl_unregister(void) +{ + unregister_sysctl_table(sctp_sysctl_header); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/transport.c linux-2.4.23-pre8/net/sctp/transport.c --- linux-2.4.22/net/sctp/transport.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/transport.c 2003-10-22 22:48:56.000000000 +0000 @@ -0,0 +1,500 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * This file is part of the SCTP kernel reference Implementation + * + * This module provides the abstraction for an SCTP tranport representing + * a remote transport address. For local transport addresses, we just use + * union sctp_addr. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Karl Knutson + * Jon Grimm + * Xingang Guo + * Hui Huang + * Sridhar Samudrala + * Ardelle Fan + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include + +/* 1st Level Abstractions. */ + +/* Allocate and initialize a new transport. */ +struct sctp_transport *sctp_transport_new(const union sctp_addr *addr, int gfp) +{ + struct sctp_transport *transport; + + transport = t_new(struct sctp_transport, gfp); + if (!transport) + goto fail; + + if (!sctp_transport_init(transport, addr, gfp)) + goto fail_init; + + transport->malloced = 1; + SCTP_DBG_OBJCNT_INC(transport); + + return transport; + +fail_init: + kfree(transport); + +fail: + return NULL; +} + +/* Initialize a new transport from provided memory. */ +struct sctp_transport *sctp_transport_init(struct sctp_transport *peer, + const union sctp_addr *addr, + int gfp) +{ + struct sctp_protocol *proto = sctp_get_protocol(); + + /* Copy in the address. */ + peer->ipaddr = *addr; + peer->af_specific = sctp_get_af_specific(addr->sa.sa_family); + peer->asoc = NULL; + + peer->dst = NULL; + memset(&peer->saddr, 0, sizeof(union sctp_addr)); + + /* From 6.3.1 RTO Calculation: + * + * C1) Until an RTT measurement has been made for a packet sent to the + * given destination transport address, set RTO to the protocol + * parameter 'RTO.Initial'. + */ + peer->rtt = 0; + peer->rto = proto->rto_initial; + peer->rttvar = 0; + peer->srtt = 0; + peer->rto_pending = 0; + + peer->last_time_heard = jiffies; + peer->last_time_used = jiffies; + peer->last_time_ecne_reduced = jiffies; + + peer->active = 1; + peer->hb_allowed = 0; + + /* Initialize the default path max_retrans. */ + peer->max_retrans = proto->max_retrans_path; + peer->error_threshold = 0; + peer->error_count = 0; + + peer->debug_name = "unnamedtransport"; + + INIT_LIST_HEAD(&peer->transmitted); + INIT_LIST_HEAD(&peer->send_ready); + INIT_LIST_HEAD(&peer->transports); + + /* Set up the retransmission timer. */ + init_timer(&peer->T3_rtx_timer); + peer->T3_rtx_timer.function = sctp_generate_t3_rtx_event; + peer->T3_rtx_timer.data = (unsigned long)peer; + + /* Set up the heartbeat timer. */ + init_timer(&peer->hb_timer); + peer->hb_interval = SCTP_DEFAULT_TIMEOUT_HEARTBEAT; + peer->hb_timer.function = sctp_generate_heartbeat_event; + peer->hb_timer.data = (unsigned long)peer; + + atomic_set(&peer->refcnt, 1); + peer->dead = 0; + + peer->malloced = 0; + return peer; +} + +/* This transport is no longer needed. Free up if possible, or + * delay until it last reference count. + */ +void sctp_transport_free(struct sctp_transport *transport) +{ + transport->dead = 1; + + /* Try to delete the heartbeat timer. */ + if (del_timer(&transport->hb_timer)) + sctp_transport_put(transport); + + sctp_transport_put(transport); +} + +/* Destroy the transport data structure. + * Assumes there are no more users of this structure. + */ +void sctp_transport_destroy(struct sctp_transport *transport) +{ + SCTP_ASSERT(transport->dead, "Transport is not dead", return); + + if (transport->asoc) + sctp_association_put(transport->asoc); + + dst_release(transport->dst); + kfree(transport); + SCTP_DBG_OBJCNT_DEC(transport); +} + +/* Start T3_rtx timer if it is not already running and update the heartbeat + * timer. This routine is called every time a DATA chunk is sent. + */ +void sctp_transport_reset_timers(struct sctp_transport *transport) +{ + /* RFC 2960 6.3.2 Retransmission Timer Rules + * + * R1) Every time a DATA chunk is sent to any address(including a + * retransmission), if the T3-rtx timer of that address is not running + * start it running so that it will expire after the RTO of that + * address. + */ + + if (!timer_pending(&transport->T3_rtx_timer)) + if (!mod_timer(&transport->T3_rtx_timer, + jiffies + transport->rto)) + sctp_transport_hold(transport); + + /* When a data chunk is sent, reset the heartbeat interval. */ + if (!mod_timer(&transport->hb_timer, + sctp_transport_timeout(transport))) + sctp_transport_hold(transport); +} + +/* This transport has been assigned to an association. + * Initialize fields from the association or from the sock itself. + * Register the reference count in the association. + */ +void sctp_transport_set_owner(struct sctp_transport *transport, + struct sctp_association *asoc) +{ + transport->asoc = asoc; + sctp_association_hold(asoc); +} + +/* Initialize the pmtu of a transport. */ +void sctp_transport_pmtu(struct sctp_transport *transport) +{ + struct dst_entry *dst; + + dst = transport->af_specific->get_dst(NULL, &transport->ipaddr, NULL); + + if (dst) { + transport->pmtu = dst_pmtu(dst); + dst_release(dst); + } else + transport->pmtu = SCTP_DEFAULT_MAXSEGMENT; +} + +/* Caches the dst entry and source address for a transport's destination + * address. + */ +void sctp_transport_route(struct sctp_transport *transport, + union sctp_addr *saddr, struct sctp_opt *opt) +{ + struct sctp_association *asoc = transport->asoc; + struct sctp_af *af = transport->af_specific; + union sctp_addr *daddr = &transport->ipaddr; + struct dst_entry *dst; + + dst = af->get_dst(asoc, daddr, saddr); + + if (saddr) + memcpy(&transport->saddr, saddr, sizeof(union sctp_addr)); + else + af->get_saddr(asoc, dst, daddr, &transport->saddr); + + transport->dst = dst; + if (dst) { + transport->pmtu = dst_pmtu(dst); + + /* Initialize sk->rcv_saddr, if the transport is the + * association's active path for getsockname(). + */ + if (asoc && (transport == asoc->peer.active_path)) + af->to_sk_saddr(&transport->saddr, asoc->base.sk); + } else + transport->pmtu = SCTP_DEFAULT_MAXSEGMENT; +} + +/* Hold a reference to a transport. */ +void sctp_transport_hold(struct sctp_transport *transport) +{ + atomic_inc(&transport->refcnt); +} + +/* Release a reference to a transport and clean up + * if there are no more references. + */ +void sctp_transport_put(struct sctp_transport *transport) +{ + if (atomic_dec_and_test(&transport->refcnt)) + sctp_transport_destroy(transport); +} + +/* Update transport's RTO based on the newly calculated RTT. */ +void sctp_transport_update_rto(struct sctp_transport *tp, __u32 rtt) +{ + struct sctp_protocol *proto = sctp_get_protocol(); + + /* Check for valid transport. */ + SCTP_ASSERT(tp, "NULL transport", return); + + /* We should not be doing any RTO updates unless rto_pending is set. */ + SCTP_ASSERT(tp->rto_pending, "rto_pending not set", return); + + if (tp->rttvar || tp->srtt) { + /* 6.3.1 C3) When a new RTT measurement R' is made, set + * RTTVAR <- (1 - RTO.Beta) * RTTVAR + RTO.Beta * |SRTT - R'| + * SRTT <- (1 - RTO.Alpha) * SRTT + RTO.Alpha * R' + */ + + /* Note: The above algorithm has been rewritten to + * express rto_beta and rto_alpha as inverse powers + * of two. + * For example, assuming the default value of RTO.Alpha of + * 1/8, rto_alpha would be expressed as 3. + */ + tp->rttvar = tp->rttvar - (tp->rttvar >> proto->rto_beta) + + ((abs(tp->srtt - rtt)) >> proto->rto_beta); + tp->srtt = tp->srtt - (tp->srtt >> proto->rto_alpha) + + (rtt >> proto->rto_alpha); + } else { + /* 6.3.1 C2) When the first RTT measurement R is made, set + * SRTT <- R, RTTVAR <- R/2. + */ + tp->srtt = rtt; + tp->rttvar = rtt >> 1; + } + + /* 6.3.1 G1) Whenever RTTVAR is computed, if RTTVAR = 0, then + * adjust RTTVAR <- G, where G is the CLOCK GRANULARITY. + */ + if (tp->rttvar == 0) + tp->rttvar = SCTP_CLOCK_GRANULARITY; + + /* 6.3.1 C3) After the computation, update RTO <- SRTT + 4 * RTTVAR. */ + tp->rto = tp->srtt + (tp->rttvar << 2); + + /* 6.3.1 C6) Whenever RTO is computed, if it is less than RTO.Min + * seconds then it is rounded up to RTO.Min seconds. + */ + if (tp->rto < tp->asoc->rto_min) + tp->rto = tp->asoc->rto_min; + + /* 6.3.1 C7) A maximum value may be placed on RTO provided it is + * at least RTO.max seconds. + */ + if (tp->rto > tp->asoc->rto_max) + tp->rto = tp->asoc->rto_max; + + tp->rtt = rtt; + + /* Reset rto_pending so that a new RTT measurement is started when a + * new data chunk is sent. + */ + tp->rto_pending = 0; + + SCTP_DEBUG_PRINTK("%s: transport: %p, rtt: %d, srtt: %d " + "rttvar: %d, rto: %d\n", __FUNCTION__, + tp, rtt, tp->srtt, tp->rttvar, tp->rto); +} + +/* This routine updates the transport's cwnd and partial_bytes_acked + * parameters based on the bytes acked in the received SACK. + */ +void sctp_transport_raise_cwnd(struct sctp_transport *transport, + __u32 sack_ctsn, __u32 bytes_acked) +{ + __u32 cwnd, ssthresh, flight_size, pba, pmtu; + + cwnd = transport->cwnd; + flight_size = transport->flight_size; + + /* The appropriate cwnd increase algorithm is performed if, and only + * if the cumulative TSN has advanced and the congestion window is + * being fully utilized. + */ + if ((transport->asoc->ctsn_ack_point >= sack_ctsn) || + (flight_size < cwnd)) + return; + + ssthresh = transport->ssthresh; + pba = transport->partial_bytes_acked; + pmtu = transport->asoc->pmtu; + + if (cwnd <= ssthresh) { + /* RFC 2960 7.2.1, sctpimpguide-05 2.14.2 When cwnd is less + * than or equal to ssthresh an SCTP endpoint MUST use the + * slow start algorithm to increase cwnd only if the current + * congestion window is being fully utilized and an incoming + * SACK advances the Cumulative TSN Ack Point. Only when these + * two conditions are met can the cwnd be increased otherwise + * the cwnd MUST not be increased. If these conditions are met + * then cwnd MUST be increased by at most the lesser of + * 1) the total size of the previously outstanding DATA + * chunk(s) acknowledged, and 2) the destination's path MTU. + */ + if (bytes_acked > pmtu) + cwnd += pmtu; + else + cwnd += bytes_acked; + SCTP_DEBUG_PRINTK("%s: SLOW START: transport: %p, " + "bytes_acked: %d, cwnd: %d, ssthresh: %d, " + "flight_size: %d, pba: %d\n", + __FUNCTION__, + transport, bytes_acked, cwnd, + ssthresh, flight_size, pba); + } else { + /* RFC 2960 7.2.2 Whenever cwnd is greater than ssthresh, + * upon each SACK arrival that advances the Cumulative TSN Ack + * Point, increase partial_bytes_acked by the total number of + * bytes of all new chunks acknowledged in that SACK including + * chunks acknowledged by the new Cumulative TSN Ack and by + * Gap Ack Blocks. + * + * When partial_bytes_acked is equal to or greater than cwnd + * and before the arrival of the SACK the sender had cwnd or + * more bytes of data outstanding (i.e., before arrival of the + * SACK, flightsize was greater than or equal to cwnd), + * increase cwnd by MTU, and reset partial_bytes_acked to + * (partial_bytes_acked - cwnd). + */ + pba += bytes_acked; + if (pba >= cwnd) { + cwnd += pmtu; + pba = ((cwnd < pba) ? (pba - cwnd) : 0); + } + SCTP_DEBUG_PRINTK("%s: CONGESTION AVOIDANCE: " + "transport: %p, bytes_acked: %d, cwnd: %d, " + "ssthresh: %d, flight_size: %d, pba: %d\n", + __FUNCTION__, + transport, bytes_acked, cwnd, + ssthresh, flight_size, pba); + } + + transport->cwnd = cwnd; + transport->partial_bytes_acked = pba; +} + +/* This routine is used to lower the transport's cwnd when congestion is + * detected. + */ +void sctp_transport_lower_cwnd(struct sctp_transport *transport, + sctp_lower_cwnd_t reason) +{ + switch (reason) { + case SCTP_LOWER_CWND_T3_RTX: + /* RFC 2960 Section 7.2.3, sctpimpguide-05 Section 2.9.2 + * When the T3-rtx timer expires on an address, SCTP should + * perform slow start by: + * ssthresh = max(cwnd/2, 2*MTU) + * cwnd = 1*MTU + * partial_bytes_acked = 0 + */ + transport->ssthresh = max(transport->cwnd/2, + 2*transport->asoc->pmtu); + transport->cwnd = transport->asoc->pmtu; + break; + + case SCTP_LOWER_CWND_FAST_RTX: + /* RFC 2960 7.2.4 Adjust the ssthresh and cwnd of the + * destination address(es) to which the missing DATA chunks + * were last sent, according to the formula described in + * Section 7.2.3. + * + * RFC 2960 7.2.3, sctpimpguide-05 2.9.2 Upon detection of + * packet losses from SACK (see Section 7.2.4), An endpoint + * should do the following: + * ssthresh = max(cwnd/2, 2*MTU) + * cwnd = ssthresh + * partial_bytes_acked = 0 + */ + transport->ssthresh = max(transport->cwnd/2, + 2*transport->asoc->pmtu); + transport->cwnd = transport->ssthresh; + break; + + case SCTP_LOWER_CWND_ECNE: + /* RFC 2481 Section 6.1.2. + * If the sender receives an ECN-Echo ACK packet + * then the sender knows that congestion was encountered in the + * network on the path from the sender to the receiver. The + * indication of congestion should be treated just as a + * congestion loss in non-ECN Capable TCP. That is, the TCP + * source halves the congestion window "cwnd" and reduces the + * slow start threshold "ssthresh". + * A critical condition is that TCP does not react to + * congestion indications more than once every window of + * data (or more loosely more than once every round-trip time). + */ + if ((jiffies - transport->last_time_ecne_reduced) > + transport->rtt) { + transport->ssthresh = max(transport->cwnd/2, + 2*transport->asoc->pmtu); + transport->cwnd = transport->ssthresh; + transport->last_time_ecne_reduced = jiffies; + } + break; + + case SCTP_LOWER_CWND_INACTIVE: + /* RFC 2960 Section 7.2.1, sctpimpguide-05 Section 2.14.2 + * When the association does not transmit data on a given + * transport address within an RTO, the cwnd of the transport + * address should be adjusted to 2*MTU. + * NOTE: Although the draft recommends that this check needs + * to be done every RTO interval, we do it every hearbeat + * interval. + */ + if ((jiffies - transport->last_time_used) > transport->rto) + transport->cwnd = 2*transport->asoc->pmtu; + break; + }; + + transport->partial_bytes_acked = 0; + SCTP_DEBUG_PRINTK("%s: transport: %p reason: %d cwnd: " + "%d ssthresh: %d\n", __FUNCTION__, + transport, reason, + transport->cwnd, transport->ssthresh); +} + +/* What is the next timeout value for this transport? */ +unsigned long sctp_transport_timeout(struct sctp_transport *t) +{ + unsigned long timeout; + timeout = t->hb_interval + t->rto + sctp_jitter(t->rto); + timeout += jiffies; + return timeout; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/tsnmap.c linux-2.4.23-pre8/net/sctp/tsnmap.c --- linux-2.4.22/net/sctp/tsnmap.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/tsnmap.c 2003-10-22 22:47:39.000000000 +0000 @@ -0,0 +1,406 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * + * This file is part of the SCTP kernel reference Implementation + * + * These functions manipulate sctp tsn mapping array. + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * La Monte H.P. Yarroll + * Jon Grimm + * Karl Knutson + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include + +static void sctp_tsnmap_update(struct sctp_tsnmap *map); +static void sctp_tsnmap_update_pending_data(struct sctp_tsnmap *map); +static void sctp_tsnmap_find_gap_ack(__u8 *map, __u16 off, + __u16 len, __u16 base, + int *started, __u16 *start, + int *ended, __u16 *end); + +/* Create a new sctp_tsnmap. + * Allocate room to store at least 'len' contiguous TSNs. + */ +struct sctp_tsnmap *sctp_tsnmap_new(__u16 len, __u32 initial_tsn, int gfp) +{ + struct sctp_tsnmap *retval; + + retval = kmalloc(sizeof(struct sctp_tsnmap) + + sctp_tsnmap_storage_size(len), gfp); + if (!retval) + goto fail; + + if (!sctp_tsnmap_init(retval, len, initial_tsn)) + goto fail_map; + retval->malloced = 1; + return retval; + +fail_map: + kfree(retval); +fail: + return NULL; +} + +/* Initialize a block of memory as a tsnmap. */ +struct sctp_tsnmap *sctp_tsnmap_init(struct sctp_tsnmap *map, __u16 len, + __u32 initial_tsn) +{ + map->tsn_map = map->raw_map; + map->overflow_map = map->tsn_map + len; + map->len = len; + + /* Clear out a TSN ack status. */ + memset(map->tsn_map, 0x00, map->len + map->len); + + /* Keep track of TSNs represented by tsn_map. */ + map->base_tsn = initial_tsn; + map->overflow_tsn = initial_tsn + map->len; + map->cumulative_tsn_ack_point = initial_tsn - 1; + map->max_tsn_seen = map->cumulative_tsn_ack_point; + map->malloced = 0; + map->pending_data = 0; + map->num_dup_tsns = 0; + + return map; +} + +/* Test the tracking state of this TSN. + * Returns: + * 0 if the TSN has not yet been seen + * >0 if the TSN has been seen (duplicate) + * <0 if the TSN is invalid (too large to track) + */ +int sctp_tsnmap_check(const struct sctp_tsnmap *map, __u32 tsn) +{ + __s32 gap; + int dup; + + /* Calculate the index into the mapping arrays. */ + gap = tsn - map->base_tsn; + + /* Verify that we can hold this TSN. */ + if (gap >= (/* base */ map->len + /* overflow */ map->len)) { + dup = -1; + goto out; + } + + /* Honk if we've already seen this TSN. + * We have three cases: + * 1. The TSN is ancient or belongs to a previous tsn_map. + * 2. The TSN is already marked in the tsn_map. + * 3. The TSN is already marked in the tsn_map_overflow. + */ + if (gap < 0 || + (gap < map->len && map->tsn_map[gap]) || + (gap >= map->len && map->overflow_map[gap - map->len])) + dup = 1; + else + dup = 0; + +out: + return dup; +} + +/* Is there a gap in the TSN map? */ +int sctp_tsnmap_has_gap(const struct sctp_tsnmap *map) +{ + int has_gap; + + has_gap = (map->cumulative_tsn_ack_point != map->max_tsn_seen); + return has_gap; +} + +/* Mark this TSN as seen. */ +void sctp_tsnmap_mark(struct sctp_tsnmap *map, __u32 tsn) +{ + __s32 gap; + + /* Vacuously mark any TSN which precedes the map base or + * exceeds the end of the map. + */ + if (TSN_lt(tsn, map->base_tsn)) + return; + if (!TSN_lt(tsn, map->base_tsn + map->len + map->len)) + return; + + /* Bump the max. */ + if (TSN_lt(map->max_tsn_seen, tsn)) + map->max_tsn_seen = tsn; + + /* Assert: TSN is in range. */ + gap = tsn - map->base_tsn; + + /* Mark the TSN as received. */ + if (gap < map->len) + map->tsn_map[gap]++; + else + map->overflow_map[gap - map->len]++; + + /* Go fixup any internal TSN mapping variables including + * cumulative_tsn_ack_point. + */ + sctp_tsnmap_update(map); +} + +void sctp_tsnmap_report_dup(struct sctp_tsnmap *map, __u32 tsn) +{ +} + +/* Retrieve the Cumulative TSN Ack Point. */ +__u32 sctp_tsnmap_get_ctsn(const struct sctp_tsnmap *map) +{ + return map->cumulative_tsn_ack_point; +} + +/* Retrieve the highest TSN we've seen. */ +__u32 sctp_tsnmap_get_max_tsn_seen(const struct sctp_tsnmap *map) +{ + return map->max_tsn_seen; +} + +/* Dispose of a tsnmap. */ +void sctp_tsnmap_free(struct sctp_tsnmap *map) +{ + if (map->malloced) + kfree(map); +} + +/* Initialize a Gap Ack Block iterator from memory being provided. */ +void sctp_tsnmap_iter_init(const struct sctp_tsnmap *map, + struct sctp_tsnmap_iter *iter) +{ + /* Only start looking one past the Cumulative TSN Ack Point. */ + iter->start = map->cumulative_tsn_ack_point + 1; +} + +/* Get the next Gap Ack Blocks. Returns 0 if there was not another block + * to get. + */ +int sctp_tsnmap_next_gap_ack(const struct sctp_tsnmap *map, + struct sctp_tsnmap_iter *iter, __u16 *start, __u16 *end) +{ + int started, ended; + __u16 _start, _end, offset; + + /* We haven't found a gap yet. */ + started = ended = 0; + + /* Search the first mapping array. */ + if (iter->start - map->base_tsn < map->len) { + + offset = iter->start - map->base_tsn; + sctp_tsnmap_find_gap_ack(map->tsn_map, offset, map->len, 0, + &started, &_start, &ended, &_end); + } + + /* Do we need to check the overflow map? */ + if (!ended) { + /* Fix up where we'd like to start searching in the + * overflow map. + */ + if (iter->start - map->base_tsn < map->len) + offset = 0; + else + offset = iter->start - map->base_tsn - map->len; + + /* Search the overflow map. */ + sctp_tsnmap_find_gap_ack(map->overflow_map, + offset, + map->len, + map->len, + &started, &_start, + &ended, &_end); + } + + /* The Gap Ack Block happens to end at the end of the + * overflow map. + */ + if (started && !ended) { + ended++; + _end = map->len + map->len - 1; + } + + /* If we found a Gap Ack Block, return the start and end and + * bump the iterator forward. + */ + if (ended) { + /* Fix up the start and end based on the + * Cumulative TSN Ack offset into the map. + */ + int gap = map->cumulative_tsn_ack_point - + map->base_tsn; + + *start = _start - gap; + *end = _end - gap; + + /* Move the iterator forward. */ + iter->start = map->cumulative_tsn_ack_point + *end + 1; + } + + return ended; +} + +/******************************************************************** + * 2nd Level Abstractions + ********************************************************************/ + +/* This private helper function updates the tsnmap buffers and + * the Cumulative TSN Ack Point. + */ +static void sctp_tsnmap_update(struct sctp_tsnmap *map) +{ + __u32 ctsn; + + ctsn = map->cumulative_tsn_ack_point; + do { + ctsn++; + if (ctsn == map->overflow_tsn) { + /* Now tsn_map must have been all '1's, + * so we swap the map and check the overflow table + */ + __u8 *tmp = map->tsn_map; + memset(tmp, 0, map->len); + map->tsn_map = map->overflow_map; + map->overflow_map = tmp; + + /* Update the tsn_map boundaries. */ + map->base_tsn += map->len; + map->overflow_tsn += map->len; + } + } while (map->tsn_map[ctsn - map->base_tsn]); + + map->cumulative_tsn_ack_point = ctsn - 1; /* Back up one. */ + sctp_tsnmap_update_pending_data(map); +} + +static void sctp_tsnmap_update_pending_data(struct sctp_tsnmap *map) +{ + __u32 cum_tsn = map->cumulative_tsn_ack_point; + __u32 max_tsn = map->max_tsn_seen; + __u32 base_tsn = map->base_tsn; + __u16 pending_data; + __s32 gap, start, end, i; + + pending_data = max_tsn - cum_tsn; + gap = max_tsn - base_tsn; + + if (gap <= 0 || gap >= (map->len + map->len)) + goto out; + + start = ((cum_tsn >= base_tsn) ? (cum_tsn - base_tsn + 1) : 0); + end = ((gap > map->len ) ? map->len : gap + 1); + + for (i = start; i < end; i++) { + if (map->tsn_map[i]) + pending_data--; + } + + if (gap >= map->len) { + start = 0; + end = gap - map->len + 1; + for (i = start; i < end; i++) { + if (map->overflow_map[i]) + pending_data--; + } + } + +out: + map->pending_data = pending_data; +} + +/* This is a private helper for finding Gap Ack Blocks. It searches a + * single array for the start and end of a Gap Ack Block. + * + * The flags "started" and "ended" tell is if we found the beginning + * or (respectively) the end of a Gap Ack Block. + */ +static void sctp_tsnmap_find_gap_ack(__u8 *map, __u16 off, + __u16 len, __u16 base, + int *started, __u16 *start, + int *ended, __u16 *end) +{ + int i = off; + + /* Look through the entire array, but break out + * early if we have found the end of the Gap Ack Block. + */ + + /* Look for the start. */ + if (!(*started)) { + for (; i < len; i++) { + if (map[i]) { + (*started)++; + *start = base + i; + break; + } + } + } + + /* Look for the end. */ + if (*started) { + /* We have found the start, let's find the + * end. If we find the end, break out. + */ + for (; i < len; i++) { + if (!map[i]) { + (*ended)++; + *end = base + i - 1; + break; + } + } + } +} + +/* Renege that we have seen a TSN. */ +void sctp_tsnmap_renege(struct sctp_tsnmap *map, __u32 tsn) +{ + __s32 gap; + + if (TSN_lt(tsn, map->base_tsn)) + return; + if (!TSN_lt(tsn, map->base_tsn + map->len + map->len)) + return; + + /* Assert: TSN is in range. */ + gap = tsn - map->base_tsn; + + /* Pretend we never saw the TSN. */ + if (gap < map->len) + map->tsn_map[gap] = 0; + else + map->overflow_map[gap - map->len] = 0; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/ulpevent.c linux-2.4.23-pre8/net/sctp/ulpevent.c --- linux-2.4.22/net/sctp/ulpevent.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/ulpevent.c 2003-10-22 22:49:11.000000000 +0000 @@ -0,0 +1,883 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * These functions manipulate an sctp event. The struct ulpevent is used + * to carry notifications and data to the ULP (sockets). + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Jon Grimm + * La Monte H.P. Yarroll + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include + +static void sctp_ulpevent_set_owner_r(struct sk_buff *skb, + struct sctp_association *asoc); +static void sctp_ulpevent_set_owner(struct sk_buff *skb, + const struct sctp_association *asoc); + +/* Create a new sctp_ulpevent. */ +struct sctp_ulpevent *sctp_ulpevent_new(int size, int msg_flags, int gfp) +{ + struct sctp_ulpevent *event; + struct sk_buff *skb; + + skb = alloc_skb(size, gfp); + if (!skb) + goto fail; + + event = sctp_skb2event(skb); + event = sctp_ulpevent_init(event, msg_flags); + if (!event) + goto fail_init; + return event; + +fail_init: + kfree_skb(skb); +fail: + return NULL; +} + +/* Initialize an ULP event from an given skb. */ +struct sctp_ulpevent *sctp_ulpevent_init(struct sctp_ulpevent *event, + int msg_flags) +{ + memset(event, sizeof(struct sctp_ulpevent), 0x00); + event->msg_flags = msg_flags; + return event; +} + +/* Dispose of an event. */ +void sctp_ulpevent_free(struct sctp_ulpevent *event) +{ + kfree_skb(sctp_event2skb(event)); +} + +/* Is this a MSG_NOTIFICATION? */ +int sctp_ulpevent_is_notification(const struct sctp_ulpevent *event) +{ + return MSG_NOTIFICATION == (event->msg_flags & MSG_NOTIFICATION); +} + +/* Create and initialize an SCTP_ASSOC_CHANGE event. + * + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * Communication notifications inform the ULP that an SCTP association + * has either begun or ended. The identifier for a new association is + * provided by this notification. + * + * Note: There is no field checking here. If a field is unused it will be + * zero'd out. + */ +struct sctp_ulpevent *sctp_ulpevent_make_assoc_change( + const struct sctp_association *asoc, + __u16 flags, __u16 state, __u16 error, __u16 outbound, + __u16 inbound, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_assoc_change *sac; + struct sk_buff *skb; + + event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change), + MSG_NOTIFICATION, gfp); + if (!event) + goto fail; + skb = sctp_event2skb(event); + sac = (struct sctp_assoc_change *) + skb_put(skb, sizeof(struct sctp_assoc_change)); + + /* Socket Extensions for SCTP + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * sac_type: + * It should be SCTP_ASSOC_CHANGE. + */ + sac->sac_type = SCTP_ASSOC_CHANGE; + + /* Socket Extensions for SCTP + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * sac_state: 32 bits (signed integer) + * This field holds one of a number of values that communicate the + * event that happened to the association. + */ + sac->sac_state = state; + + /* Socket Extensions for SCTP + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * sac_flags: 16 bits (unsigned integer) + * Currently unused. + */ + sac->sac_flags = 0; + + /* Socket Extensions for SCTP + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * sac_length: sizeof (__u32) + * This field is the total length of the notification data, including + * the notification header. + */ + sac->sac_length = sizeof(struct sctp_assoc_change); + + /* Socket Extensions for SCTP + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * sac_error: 32 bits (signed integer) + * + * If the state was reached due to a error condition (e.g. + * COMMUNICATION_LOST) any relevant error information is available in + * this field. This corresponds to the protocol error codes defined in + * [SCTP]. + */ + sac->sac_error = error; + + /* Socket Extensions for SCTP + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * sac_outbound_streams: 16 bits (unsigned integer) + * sac_inbound_streams: 16 bits (unsigned integer) + * + * The maximum number of streams allowed in each direction are + * available in sac_outbound_streams and sac_inbound streams. + */ + sac->sac_outbound_streams = outbound; + sac->sac_inbound_streams = inbound; + + /* Socket Extensions for SCTP + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * sac_assoc_id: sizeof (sctp_assoc_t) + * + * The association id field, holds the identifier for the association. + * All notifications for a given association have the same association + * identifier. For TCP style socket, this field is ignored. + */ + sctp_ulpevent_set_owner(skb, asoc); + sac->sac_assoc_id = sctp_assoc2id(asoc); + + return event; + +fail: + return NULL; +} + +/* Create and initialize an SCTP_PEER_ADDR_CHANGE event. + * + * Socket Extensions for SCTP - draft-01 + * 5.3.1.2 SCTP_PEER_ADDR_CHANGE + * + * When a destination address on a multi-homed peer encounters a change + * an interface details event is sent. + */ +struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change( + const struct sctp_association *asoc, + const struct sockaddr_storage *aaddr, + int flags, int state, int error, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_paddr_change *spc; + struct sk_buff *skb; + + event = sctp_ulpevent_new(sizeof(struct sctp_paddr_change), + MSG_NOTIFICATION, gfp); + if (!event) + goto fail; + + skb = sctp_event2skb(event); + spc = (struct sctp_paddr_change *) + skb_put(skb, sizeof(struct sctp_paddr_change)); + + /* Sockets API Extensions for SCTP + * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE + * + * spc_type: + * + * It should be SCTP_PEER_ADDR_CHANGE. + */ + spc->spc_type = SCTP_PEER_ADDR_CHANGE; + + /* Sockets API Extensions for SCTP + * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE + * + * spc_length: sizeof (__u32) + * + * This field is the total length of the notification data, including + * the notification header. + */ + spc->spc_length = sizeof(struct sctp_paddr_change); + + /* Sockets API Extensions for SCTP + * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE + * + * spc_flags: 16 bits (unsigned integer) + * Currently unused. + */ + spc->spc_flags = 0; + + /* Sockets API Extensions for SCTP + * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE + * + * spc_state: 32 bits (signed integer) + * + * This field holds one of a number of values that communicate the + * event that happened to the address. + */ + spc->spc_state = state; + + /* Sockets API Extensions for SCTP + * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE + * + * spc_error: 32 bits (signed integer) + * + * If the state was reached due to any error condition (e.g. + * ADDRESS_UNREACHABLE) any relevant error information is available in + * this field. + */ + spc->spc_error = error; + + /* Socket Extensions for SCTP + * 5.3.1.1 SCTP_ASSOC_CHANGE + * + * spc_assoc_id: sizeof (sctp_assoc_t) + * + * The association id field, holds the identifier for the association. + * All notifications for a given association have the same association + * identifier. For TCP style socket, this field is ignored. + */ + sctp_ulpevent_set_owner(skb, asoc); + spc->spc_assoc_id = sctp_assoc2id(asoc); + + /* Sockets API Extensions for SCTP + * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE + * + * spc_aaddr: sizeof (struct sockaddr_storage) + * + * The affected address field, holds the remote peer's address that is + * encountering the change of state. + */ + memcpy(&spc->spc_aaddr, aaddr, sizeof(struct sockaddr_storage)); + + return event; + +fail: + return NULL; +} + +/* Create and initialize an SCTP_REMOTE_ERROR notification. + * + * Note: This assumes that the chunk->skb->data already points to the + * operation error payload. + * + * Socket Extensions for SCTP - draft-01 + * 5.3.1.3 SCTP_REMOTE_ERROR + * + * A remote peer may send an Operational Error message to its peer. + * This message indicates a variety of error conditions on an + * association. The entire error TLV as it appears on the wire is + * included in a SCTP_REMOTE_ERROR event. Please refer to the SCTP + * specification [SCTP] and any extensions for a list of possible + * error formats. + */ +struct sctp_ulpevent *sctp_ulpevent_make_remote_error( + const struct sctp_association *asoc, sctp_chunk_t *chunk, + __u16 flags, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_remote_error *sre; + struct sk_buff *skb; + sctp_errhdr_t *ch; + __u16 cause; + int elen; + + ch = (sctp_errhdr_t *)(chunk->skb->data); + cause = ch->cause; + elen = ntohs(ch->length) - sizeof(sctp_errhdr_t); + + /* Pull off the ERROR header. */ + skb_pull(chunk->skb, sizeof(sctp_errhdr_t)); + + /* Copy the skb to a new skb with room for us to prepend + * notification with. + */ + skb = skb_copy_expand(chunk->skb, + sizeof(struct sctp_remote_error), /* headroom */ + 0, /* tailroom */ + gfp); + + /* Pull off the rest of the cause TLV from the chunk. */ + skb_pull(chunk->skb, elen); + if (!skb) + goto fail; + + /* Embed the event fields inside the cloned skb. */ + event = sctp_skb2event(skb); + event = sctp_ulpevent_init(event, MSG_NOTIFICATION); + + if (!event) + goto fail; + + sre = (struct sctp_remote_error *) + skb_push(skb, sizeof(struct sctp_remote_error)); + + /* Trim the buffer to the right length. */ + skb_trim(skb, sizeof(struct sctp_remote_error) + elen); + + /* Socket Extensions for SCTP + * 5.3.1.3 SCTP_REMOTE_ERROR + * + * sre_type: + * It should be SCTP_REMOTE_ERROR. + */ + sre->sre_type = SCTP_REMOTE_ERROR; + + /* + * Socket Extensions for SCTP + * 5.3.1.3 SCTP_REMOTE_ERROR + * + * sre_flags: 16 bits (unsigned integer) + * Currently unused. + */ + sre->sre_flags = 0; + + /* Socket Extensions for SCTP + * 5.3.1.3 SCTP_REMOTE_ERROR + * + * sre_length: sizeof (__u32) + * + * This field is the total length of the notification data, + * including the notification header. + */ + sre->sre_length = skb->len; + + /* Socket Extensions for SCTP + * 5.3.1.3 SCTP_REMOTE_ERROR + * + * sre_error: 16 bits (unsigned integer) + * This value represents one of the Operational Error causes defined in + * the SCTP specification, in network byte order. + */ + sre->sre_error = cause; + + /* Socket Extensions for SCTP + * 5.3.1.3 SCTP_REMOTE_ERROR + * + * sre_assoc_id: sizeof (sctp_assoc_t) + * + * The association id field, holds the identifier for the association. + * All notifications for a given association have the same association + * identifier. For TCP style socket, this field is ignored. + */ + skb = sctp_event2skb(event); + sctp_ulpevent_set_owner(skb, asoc); + sre->sre_assoc_id = sctp_assoc2id(asoc); + + return event; + +fail: + return NULL; +} + +/* Create and initialize a SCTP_SEND_FAILED notification. + * + * Socket Extensions for SCTP - draft-01 + * 5.3.1.4 SCTP_SEND_FAILED + */ +struct sctp_ulpevent *sctp_ulpevent_make_send_failed( + const struct sctp_association *asoc, sctp_chunk_t *chunk, + __u16 flags, __u32 error, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_send_failed *ssf; + struct sk_buff *skb; + + /* Make skb with more room so we can prepend notification. */ + skb = skb_copy_expand(chunk->skb, + sizeof(struct sctp_send_failed), /* headroom */ + 0, /* tailroom */ + gfp); + if (!skb) + goto fail; + + /* Pull off the common chunk header and DATA header. */ + skb_pull(skb, sizeof(sctp_data_chunk_t)); + + /* Embed the event fields inside the cloned skb. */ + event = sctp_skb2event(skb); + event = sctp_ulpevent_init(event, MSG_NOTIFICATION); + if (!event) + goto fail; + + ssf = (struct sctp_send_failed *) + skb_push(skb, sizeof(struct sctp_send_failed)); + + /* Socket Extensions for SCTP + * 5.3.1.4 SCTP_SEND_FAILED + * + * ssf_type: + * It should be SCTP_SEND_FAILED. + */ + ssf->ssf_type = SCTP_SEND_FAILED; + + /* Socket Extensions for SCTP + * 5.3.1.4 SCTP_SEND_FAILED + * + * ssf_flags: 16 bits (unsigned integer) + * The flag value will take one of the following values + * + * SCTP_DATA_UNSENT - Indicates that the data was never put on + * the wire. + * + * SCTP_DATA_SENT - Indicates that the data was put on the wire. + * Note that this does not necessarily mean that the + * data was (or was not) successfully delivered. + */ + ssf->ssf_flags = flags; + + /* Socket Extensions for SCTP + * 5.3.1.4 SCTP_SEND_FAILED + * + * ssf_length: sizeof (__u32) + * This field is the total length of the notification data, including + * the notification header. + */ + ssf->ssf_length = skb->len; + + /* Socket Extensions for SCTP + * 5.3.1.4 SCTP_SEND_FAILED + * + * ssf_error: 16 bits (unsigned integer) + * This value represents the reason why the send failed, and if set, + * will be a SCTP protocol error code as defined in [SCTP] section + * 3.3.10. + */ + ssf->ssf_error = error; + + /* Socket Extensions for SCTP + * 5.3.1.4 SCTP_SEND_FAILED + * + * ssf_info: sizeof (struct sctp_sndrcvinfo) + * The original send information associated with the undelivered + * message. + */ + memcpy(&ssf->ssf_info, &chunk->sinfo, sizeof(struct sctp_sndrcvinfo)); + + /* Socket Extensions for SCTP + * 5.3.1.4 SCTP_SEND_FAILED + * + * ssf_assoc_id: sizeof (sctp_assoc_t) + * The association id field, sf_assoc_id, holds the identifier for the + * association. All notifications for a given association have the + * same association identifier. For TCP style socket, this field is + * ignored. + */ + skb = sctp_event2skb(event); + sctp_ulpevent_set_owner(skb, asoc); + ssf->ssf_assoc_id = sctp_assoc2id(asoc); + return event; + +fail: + return NULL; +} + +/* Create and initialize a SCTP_SHUTDOWN_EVENT notification. + * + * Socket Extensions for SCTP - draft-01 + * 5.3.1.5 SCTP_SHUTDOWN_EVENT + */ +struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event( + const struct sctp_association *asoc, + __u16 flags, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_shutdown_event *sse; + struct sk_buff *skb; + + event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change), + MSG_NOTIFICATION, gfp); + if (!event) + goto fail; + + skb = sctp_event2skb(event); + sse = (struct sctp_shutdown_event *) + skb_put(skb, sizeof(struct sctp_shutdown_event)); + + /* Socket Extensions for SCTP + * 5.3.1.5 SCTP_SHUTDOWN_EVENT + * + * sse_type + * It should be SCTP_SHUTDOWN_EVENT + */ + sse->sse_type = SCTP_SHUTDOWN_EVENT; + + /* Socket Extensions for SCTP + * 5.3.1.5 SCTP_SHUTDOWN_EVENT + * + * sse_flags: 16 bits (unsigned integer) + * Currently unused. + */ + sse->sse_flags = 0; + + /* Socket Extensions for SCTP + * 5.3.1.5 SCTP_SHUTDOWN_EVENT + * + * sse_length: sizeof (__u32) + * This field is the total length of the notification data, including + * the notification header. + */ + sse->sse_length = sizeof(struct sctp_shutdown_event); + + /* Socket Extensions for SCTP + * 5.3.1.5 SCTP_SHUTDOWN_EVENT + * + * sse_assoc_id: sizeof (sctp_assoc_t) + * The association id field, holds the identifier for the association. + * All notifications for a given association have the same association + * identifier. For TCP style socket, this field is ignored. + */ + sctp_ulpevent_set_owner(skb, asoc); + sse->sse_assoc_id = sctp_assoc2id(asoc); + + return event; + +fail: + return NULL; +} + +/* A message has been received. Package this message as a notification + * to pass it to the upper layers. Go ahead and calculate the sndrcvinfo + * even if filtered out later. + * + * Socket Extensions for SCTP + * 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) + */ +struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc, + sctp_chunk_t *chunk, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_sndrcvinfo *info; + struct sk_buff *skb, *list; + size_t padding, len; + + /* Clone the original skb, sharing the data. */ + skb = skb_clone(chunk->skb, gfp); + if (!skb) + goto fail; + + /* First calculate the padding, so we don't inadvertently + * pass up the wrong length to the user. + * + * RFC 2960 - Section 3.2 Chunk Field Descriptions + * + * The total length of a chunk(including Type, Length and Value fields) + * MUST be a multiple of 4 bytes. If the length of the chunk is not a + * multiple of 4 bytes, the sender MUST pad the chunk with all zero + * bytes and this padding is not included in the chunk length field. + * The sender should never pad with more than 3 bytes. The receiver + * MUST ignore the padding bytes. + */ + len = ntohs(chunk->chunk_hdr->length); + padding = WORD_ROUND(len) - len; + + /* Fixup cloned skb with just this chunks data. */ + skb_trim(skb, chunk->chunk_end - padding - skb->data); + + /* Set up a destructor to do rwnd accounting. */ + sctp_ulpevent_set_owner_r(skb, asoc); + + /* Embed the event fields inside the cloned skb. */ + event = sctp_skb2event(skb); + + /* Initialize event with flags 0. */ + event = sctp_ulpevent_init(event, 0); + if (!event) + goto fail_init; + + event->iif = sctp_chunk_iif(chunk); + /* Note: Not clearing the entire event struct as + * this is just a fragment of the real event. However, + * we still need to do rwnd accounting. + */ + for (list = skb_shinfo(skb)->frag_list; list; list = list->next) + sctp_ulpevent_set_owner_r(list, asoc); + + info = (struct sctp_sndrcvinfo *) &event->sndrcvinfo; + + /* Sockets API Extensions for SCTP + * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) + * + * sinfo_stream: 16 bits (unsigned integer) + * + * For recvmsg() the SCTP stack places the message's stream number in + * this value. + */ + info->sinfo_stream = ntohs(chunk->subh.data_hdr->stream); + + /* Sockets API Extensions for SCTP + * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) + * + * sinfo_ssn: 16 bits (unsigned integer) + * + * For recvmsg() this value contains the stream sequence number that + * the remote endpoint placed in the DATA chunk. For fragmented + * messages this is the same number for all deliveries of the message + * (if more than one recvmsg() is needed to read the message). + */ + info->sinfo_ssn = ntohs(chunk->subh.data_hdr->ssn); + + /* Sockets API Extensions for SCTP + * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) + * + * sinfo_ppid: 32 bits (unsigned integer) + * + * In recvmsg() this value is + * the same information that was passed by the upper layer in the peer + * application. Please note that byte order issues are NOT accounted + * for and this information is passed opaquely by the SCTP stack from + * one end to the other. + */ + info->sinfo_ppid = ntohl(chunk->subh.data_hdr->ppid); + + /* Sockets API Extensions for SCTP + * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) + * + * sinfo_flags: 16 bits (unsigned integer) + * + * This field may contain any of the following flags and is composed of + * a bitwise OR of these values. + * + * recvmsg() flags: + * + * MSG_UNORDERED - This flag is present when the message was sent + * non-ordered. + */ + if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) { + info->sinfo_flags |= MSG_UNORDERED; + + /* sinfo_cumtsn: 32 bit (unsigned integer) + * + * This field will hold the current cumulative TSN as + * known by the underlying SCTP layer. Note this field is + * ignored when sending and only valid for a receive + * operation when sinfo_flags are set to MSG_UNORDERED. + */ + info->sinfo_cumtsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map); + } + + /* Note: For reassembly, we need to have the fragmentation bits. + * For now, merge these into the msg_flags, since those bit + * possitions are not used. + */ + event->msg_flags |= chunk->chunk_hdr->flags; + + /* With 04 draft, tsn moves into sndrcvinfo. */ + info->sinfo_tsn = ntohl(chunk->subh.data_hdr->tsn); + + /* Context is not used on receive. */ + info->sinfo_context = 0; + + /* Sockets API Extensions for SCTP + * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV) + * + * sinfo_assoc_id: sizeof (sctp_assoc_t) + * + * The association handle field, sinfo_assoc_id, holds the identifier + * for the association announced in the COMMUNICATION_UP notification. + * All notifications for a given association have the same identifier. + * Ignored for TCP-style sockets. + */ + info->sinfo_assoc_id = sctp_assoc2id(asoc); + + return event; + +fail_init: + kfree_skb(skb); + +fail: + return NULL; +} + +/* Create a partial delivery related event. + * + * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT + * + * When a reciever is engaged in a partial delivery of a + * message this notification will be used to inidicate + * various events. + */ +struct sctp_ulpevent *sctp_ulpevent_make_pdapi( + const struct sctp_association *asoc, __u32 indication, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_rcv_pdapi_event *pd; + struct sk_buff *skb; + + event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change), + MSG_NOTIFICATION, gfp); + if (!event) + goto fail; + + skb = sctp_event2skb(event); + pd = (struct sctp_rcv_pdapi_event *) + skb_put(skb, sizeof(struct sctp_rcv_pdapi_event)); + + /* pdapi_type + * It should be SCTP_PARTIAL_DELIVERY_EVENT + * + * pdapi_flags: 16 bits (unsigned integer) + * Currently unused. + */ + pd->pdapi_type = SCTP_PARTIAL_DELIVERY_EVENT; + pd->pdapi_flags = 0; + + /* pdapi_length: 32 bits (unsigned integer) + * + * This field is the total length of the notification data, including + * the notification header. It will generally be sizeof (struct + * sctp_rcv_pdapi_event). + */ + pd->pdapi_length = sizeof(struct sctp_rcv_pdapi_event); + + /* pdapi_indication: 32 bits (unsigned integer) + * + * This field holds the indication being sent to the application. + */ + pd->pdapi_indication = indication; + + /* pdapi_assoc_id: sizeof (sctp_assoc_t) + * + * The association id field, holds the identifier for the association. + */ + pd->pdapi_assoc_id = sctp_assoc2id(asoc); + + return event; +fail: + return NULL; +} + +/* Return the notification type, assuming this is a notification + * event. + */ +__u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event) +{ + union sctp_notification *notification; + struct sk_buff *skb; + + skb = sctp_event2skb((struct sctp_ulpevent *)event); + notification = (union sctp_notification *) skb->data; + return notification->h.sn_type; +} + +/* Copy out the sndrcvinfo into a msghdr. */ +void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event, + struct msghdr *msghdr) +{ + if (!sctp_ulpevent_is_notification(event)) { + put_cmsg(msghdr, IPPROTO_SCTP, SCTP_SNDRCV, + sizeof(struct sctp_sndrcvinfo), + (void *) &event->sndrcvinfo); + } +} + +/* Do accounting for bytes just read by user. */ +static void sctp_rcvmsg_rfree(struct sk_buff *skb) +{ + struct sctp_association *asoc; + struct sctp_ulpevent *event; + + /* Current stack structures assume that the rcv buffer is + * per socket. For UDP style sockets this is not true as + * multiple associations may be on a single UDP-style socket. + * Use the local private area of the skb to track the owning + * association. + */ + event = sctp_skb2event(skb); + asoc = event->event_asoc; + sctp_assoc_rwnd_increase(asoc, skb_headlen(skb)); + sctp_association_put(asoc); +} + +/* Charge receive window for bytes received. */ +static void sctp_ulpevent_set_owner_r(struct sk_buff *skb, + struct sctp_association *asoc) +{ + struct sctp_ulpevent *event; + + /* The current stack structures assume that the rcv buffer is + * per socket. For UDP-style sockets this is not true as + * multiple associations may be on a single UDP-style socket. + * We use the local private area of the skb to track the owning + * association. + */ + sctp_association_hold(asoc); + skb->sk = asoc->base.sk; + event = sctp_skb2event(skb); + event->event_asoc = asoc; + + skb->destructor = sctp_rcvmsg_rfree; + + sctp_assoc_rwnd_decrease(asoc, skb_headlen(skb)); +} + +/* A simple destructor to give up the reference to the association. */ +static void sctp_ulpevent_rfree(struct sk_buff *skb) +{ + struct sctp_ulpevent *event; + + event = sctp_skb2event(skb); + sctp_association_put(event->event_asoc); +} + +/* Hold the association in case the msg_name needs read out of + * the association. + */ +static void sctp_ulpevent_set_owner(struct sk_buff *skb, + const struct sctp_association *asoc) +{ + struct sctp_ulpevent *event; + + /* Cast away the const, as we are just wanting to + * bump the reference count. + */ + sctp_association_hold((struct sctp_association *)asoc); + skb->sk = asoc->base.sk; + event = sctp_skb2event(skb); + event->event_asoc = (struct sctp_association *)asoc; + skb->destructor = sctp_ulpevent_rfree; +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sctp/ulpqueue.c linux-2.4.23-pre8/net/sctp/ulpqueue.c --- linux-2.4.22/net/sctp/ulpqueue.c 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/net/sctp/ulpqueue.c 2003-10-22 22:47:27.000000000 +0000 @@ -0,0 +1,820 @@ +/* SCTP kernel reference Implementation + * Copyright (c) 1999-2000 Cisco, Inc. + * Copyright (c) 1999-2001 Motorola, Inc. + * Copyright (c) 2001-2003 International Business Machines, Corp. + * Copyright (c) 2001 Intel Corp. + * Copyright (c) 2001 Nokia, Inc. + * Copyright (c) 2001 La Monte H.P. Yarroll + * + * This abstraction carries sctp events to the ULP (sockets). + * + * The SCTP reference implementation 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. + * + * The SCTP reference implementation 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 GNU CC; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Please send any bug reports or fixes you make to the + * email address(es): + * lksctp developers + * + * Or submit a bug report through the following website: + * http://www.sf.net/projects/lksctp + * + * Written or modified by: + * Jon Grimm + * La Monte H.P. Yarroll + * Sridhar Samudrala + * + * Any bugs reported given to us we will try to fix... any fixes shared will + * be incorporated into the next SCTP release. + */ + +#include +#include +#include +#include +#include +#include + +/* Forward declarations for internal helpers. */ +static inline struct sctp_ulpevent * sctp_ulpq_reasm(struct sctp_ulpq *ulpq, + struct sctp_ulpevent *); +static inline struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *, + struct sctp_ulpevent *); + +/* 1st Level Abstractions */ + +/* Create a new ULP queue. */ +struct sctp_ulpq *sctp_ulpq_new(struct sctp_association *asoc, int gfp) +{ + struct sctp_ulpq *ulpq; + + ulpq = kmalloc(sizeof(struct sctp_ulpq), gfp); + if (!ulpq) + goto fail; + if (!sctp_ulpq_init(ulpq, asoc)) + goto fail_init; + ulpq->malloced = 1; + return ulpq; + +fail_init: + kfree(ulpq); +fail: + return NULL; +} + +/* Initialize a ULP queue from a block of memory. */ +struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *ulpq, + struct sctp_association *asoc) +{ + memset(ulpq, sizeof(struct sctp_ulpq), 0x00); + + ulpq->asoc = asoc; + skb_queue_head_init(&ulpq->reasm); + skb_queue_head_init(&ulpq->lobby); + ulpq->pd_mode = 0; + ulpq->malloced = 0; + + return ulpq; +} + + +/* Flush the reassembly and ordering queues. */ +void sctp_ulpq_flush(struct sctp_ulpq *ulpq) +{ + struct sk_buff *skb; + struct sctp_ulpevent *event; + + while ((skb = __skb_dequeue(&ulpq->lobby))) { + event = sctp_skb2event(skb); + sctp_ulpevent_free(event); + } + + while ((skb = __skb_dequeue(&ulpq->reasm))) { + event = sctp_skb2event(skb); + sctp_ulpevent_free(event); + } + +} + +/* Dispose of a ulpqueue. */ +void sctp_ulpq_free(struct sctp_ulpq *ulpq) +{ + sctp_ulpq_flush(ulpq); + if (ulpq->malloced) + kfree(ulpq); +} + +/* Process an incoming DATA chunk. */ +int sctp_ulpq_tail_data(struct sctp_ulpq *ulpq, sctp_chunk_t *chunk, + int gfp) +{ + struct sk_buff_head temp; + sctp_data_chunk_t *hdr; + struct sctp_ulpevent *event; + + hdr = (sctp_data_chunk_t *) chunk->chunk_hdr; + + /* Create an event from the incoming chunk. */ + event = sctp_ulpevent_make_rcvmsg(chunk->asoc, chunk, gfp); + if (!event) + return -ENOMEM; + + /* Do reassembly if needed. */ + event = sctp_ulpq_reasm(ulpq, event); + + /* Do ordering if needed. */ + if ((event) && (event->msg_flags & MSG_EOR)){ + /* Create a temporary list to collect chunks on. */ + skb_queue_head_init(&temp); + __skb_queue_tail(&temp, sctp_event2skb(event)); + + event = sctp_ulpq_order(ulpq, event); + } + + /* Send event to the ULP. */ + if (event) + sctp_ulpq_tail_event(ulpq, event); + + return 0; +} + +/* Add a new event for propagation to the ULP. */ +/* Clear the partial delivery mode for this socket. Note: This + * assumes that no association is currently in partial delivery mode. + */ +int sctp_clear_pd(struct sock *sk) +{ + struct sctp_opt *sp; + sp = sctp_sk(sk); + + sp->pd_mode = 0; + if (!skb_queue_empty(&sp->pd_lobby)) { + struct list_head *list; + sctp_skb_list_tail(&sp->pd_lobby, &sk->receive_queue); + list = (struct list_head *)&sctp_sk(sk)->pd_lobby; + INIT_LIST_HEAD(list); + return 1; + } + return 0; +} + +/* Clear the pd_mode and restart any pending messages waiting for delivery. */ +static int sctp_ulpq_clear_pd(struct sctp_ulpq *ulpq) +{ + ulpq->pd_mode = 0; + return sctp_clear_pd(ulpq->asoc->base.sk); +} + + + +int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event) +{ + struct sock *sk = ulpq->asoc->base.sk; + struct sk_buff_head *queue; + int clear_pd = 0; + + /* If the socket is just going to throw this away, do not + * even try to deliver it. + */ + if ((sk->dead) || (sk->shutdown & RCV_SHUTDOWN)) + goto out_free; + + /* Check if the user wishes to receive this event. */ + if (!sctp_ulpevent_is_enabled(event, &sctp_sk(sk)->subscribe)) + goto out_free; + + /* If we are in partial delivery mode, post to the lobby until + * partial delivery is cleared, unless, of course _this_ is + * the association the cause of the partial delivery. + */ + + if (!sctp_sk(sk)->pd_mode) { + queue = &sk->receive_queue; + } else if (ulpq->pd_mode) { + if (event->msg_flags & MSG_NOTIFICATION) + queue = &sctp_sk(sk)->pd_lobby; + else { + clear_pd = event->msg_flags & MSG_EOR; + queue = &sk->receive_queue; + } + } else + queue = &sctp_sk(sk)->pd_lobby; + + + /* If we are harvesting multiple skbs they will be + * collected on a list. + */ + if (sctp_event2skb(event)->list) + sctp_skb_list_tail(sctp_event2skb(event)->list, queue); + else + __skb_queue_tail(queue, sctp_event2skb(event)); + + /* Did we just complete partial delivery and need to get + * rolling again? Move pending data to the receive + * queue. + */ + if (clear_pd) + sctp_ulpq_clear_pd(ulpq); + + if (queue == &sk->receive_queue) + sk->data_ready(sk, 0); + return 1; + +out_free: + if (sctp_event2skb(event)->list) + skb_queue_purge(sctp_event2skb(event)->list); + else + kfree_skb(sctp_event2skb(event)); + return 0; +} + +/* 2nd Level Abstractions */ + +/* Helper function to store chunks that need to be reassembled. */ +static inline void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq, + struct sctp_ulpevent *event) +{ + struct sk_buff *pos; + struct sctp_ulpevent *cevent; + __u32 tsn, ctsn; + + tsn = event->sndrcvinfo.sinfo_tsn; + + /* See if it belongs at the end. */ + pos = skb_peek_tail(&ulpq->reasm); + if (!pos) { + __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); + return; + } + + /* Short circuit just dropping it at the end. */ + cevent = sctp_skb2event(pos); + ctsn = cevent->sndrcvinfo.sinfo_tsn; + if (TSN_lt(ctsn, tsn)) { + __skb_queue_tail(&ulpq->reasm, sctp_event2skb(event)); + return; + } + + /* Find the right place in this list. We store them by TSN. */ + skb_queue_walk(&ulpq->reasm, pos) { + cevent = sctp_skb2event(pos); + ctsn = cevent->sndrcvinfo.sinfo_tsn; + + if (TSN_lt(tsn, ctsn)) + break; + } + + /* Insert before pos. */ + __skb_insert(sctp_event2skb(event), pos->prev, pos, &ulpq->reasm); + +} + +/* Helper function to return an event corresponding to the reassembled + * datagram. + * This routine creates a re-assembled skb given the first and last skb's + * as stored in the reassembly queue. The skb's may be non-linear if the sctp + * payload was fragmented on the way and ip had to reassemble them. + * We add the rest of skb's to the first skb's fraglist. + */ +static inline struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff *f_frag, struct sk_buff *l_frag) +{ + struct sk_buff *pos; + struct sctp_ulpevent *event; + struct sk_buff *pnext, *last; + struct sk_buff *list = skb_shinfo(f_frag)->frag_list; + + /* Store the pointer to the 2nd skb */ + if (f_frag == l_frag) + pos = NULL; + else + pos = f_frag->next; + + /* Get the last skb in the f_frag's frag_list if present. */ + for (last = list; list; last = list, list = list->next); + + /* Add the list of remaining fragments to the first fragments + * frag_list. + */ + if (last) + last->next = pos; + else + skb_shinfo(f_frag)->frag_list = pos; + + /* Remove the first fragment from the reassembly queue. */ + __skb_unlink(f_frag, f_frag->list); + while (pos) { + + pnext = pos->next; + + /* Update the len and data_len fields of the first fragment. */ + f_frag->len += pos->len; + f_frag->data_len += pos->len; + + /* Remove the fragment from the reassembly queue. */ + __skb_unlink(pos, pos->list); + + /* Break if we have reached the last fragment. */ + if (pos == l_frag) + break; + + pos->next = pnext; + pos = pnext; + }; + + event = sctp_skb2event(f_frag); + SCTP_INC_STATS(SctpReasmUsrMsgs); + + return event; +} + + +/* Helper function to check if an incoming chunk has filled up the last + * missing fragment in a SCTP datagram and return the corresponding event. + */ +static inline struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ulpq) +{ + struct sk_buff *pos; + struct sctp_ulpevent *cevent; + struct sk_buff *first_frag = NULL; + __u32 ctsn, next_tsn; + struct sctp_ulpevent *retval = NULL; + + /* Initialized to 0 just to avoid compiler warning message. Will + * never be used with this value. It is referenced only after it + * is set when we find the first fragment of a message. + */ + next_tsn = 0; + + /* The chunks are held in the reasm queue sorted by TSN. + * Walk through the queue sequentially and look for a sequence of + * fragmented chunks that complete a datagram. + * 'first_frag' and next_tsn are reset when we find a chunk which + * is the first fragment of a datagram. Once these 2 fields are set + * we expect to find the remaining middle fragments and the last + * fragment in order. If not, first_frag is reset to NULL and we + * start the next pass when we find another first fragment. + */ + skb_queue_walk(&ulpq->reasm, pos) { + cevent = sctp_skb2event(pos); + ctsn = cevent->sndrcvinfo.sinfo_tsn; + + switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) { + case SCTP_DATA_FIRST_FRAG: + first_frag = pos; + next_tsn = ctsn + 1; + break; + + case SCTP_DATA_MIDDLE_FRAG: + if ((first_frag) && (ctsn == next_tsn)) + next_tsn++; + else + first_frag = NULL; + break; + + case SCTP_DATA_LAST_FRAG: + if (first_frag && (ctsn == next_tsn)) + goto found; + else + first_frag = NULL; + break; + }; + + } +done: + return retval; +found: + retval = sctp_make_reassembled_event(first_frag, pos); + if (retval) + retval->msg_flags |= MSG_EOR; + goto done; +} + +/* Retrieve the next set of fragments of a partial message. */ +static inline struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq *ulpq) +{ + struct sk_buff *pos, *last_frag, *first_frag; + struct sctp_ulpevent *cevent; + __u32 ctsn, next_tsn; + int is_last; + struct sctp_ulpevent *retval; + + /* The chunks are held in the reasm queue sorted by TSN. + * Walk through the queue sequentially and look for the first + * sequence of fragmented chunks. + */ + + if (skb_queue_empty(&ulpq->reasm)) + return NULL; + + last_frag = first_frag = NULL; + retval = NULL; + next_tsn = 0; + is_last = 0; + + skb_queue_walk(&ulpq->reasm, pos) { + cevent = sctp_skb2event(pos); + ctsn = cevent->sndrcvinfo.sinfo_tsn; + + switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) { + case SCTP_DATA_MIDDLE_FRAG: + if (!first_frag) { + first_frag = pos; + next_tsn = ctsn + 1; + last_frag = pos; + } else if (next_tsn == ctsn) + next_tsn++; + else + goto done; + break; + case SCTP_DATA_LAST_FRAG: + if (!first_frag) + first_frag = pos; + else if (ctsn != next_tsn) + goto done; + last_frag = pos; + is_last = 1; + goto done; + default: + return NULL; + }; + } + + /* We have the reassembled event. There is no need to look + * further. + */ +done: + retval = sctp_make_reassembled_event(first_frag, last_frag); + if (retval && is_last) + retval->msg_flags |= MSG_EOR; + + return retval; +} + + +/* Helper function to reassemble chunks. Hold chunks on the reasm queue that + * need reassembling. + */ +static inline struct sctp_ulpevent *sctp_ulpq_reasm(struct sctp_ulpq *ulpq, + struct sctp_ulpevent *event) +{ + struct sctp_ulpevent *retval = NULL; + + /* Check if this is part of a fragmented message. */ + if (SCTP_DATA_NOT_FRAG == (event->msg_flags & SCTP_DATA_FRAG_MASK)) { + event->msg_flags |= MSG_EOR; + return event; + } + + sctp_ulpq_store_reasm(ulpq, event); + if (!ulpq->pd_mode) + retval = sctp_ulpq_retrieve_reassembled(ulpq); + else { + __u32 ctsn, ctsnap; + + /* Do not even bother unless this is the next tsn to + * be delivered. + */ + ctsn = event->sndrcvinfo.sinfo_tsn; + ctsnap = sctp_tsnmap_get_ctsn(&ulpq->asoc->peer.tsn_map); + if (TSN_lte(ctsn, ctsnap)) + retval = sctp_ulpq_retrieve_partial(ulpq); + } + + return retval; +} + +/* Retrieve the first part (sequential fragments) for partial delivery. */ +static inline struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *ulpq) +{ + struct sk_buff *pos, *last_frag, *first_frag; + struct sctp_ulpevent *cevent; + __u32 ctsn, next_tsn; + struct sctp_ulpevent *retval; + + /* The chunks are held in the reasm queue sorted by TSN. + * Walk through the queue sequentially and look for a sequence of + * fragmented chunks that start a datagram. + */ + + if (skb_queue_empty(&ulpq->reasm)) + return NULL; + + last_frag = first_frag = NULL; + retval = NULL; + next_tsn = 0; + + skb_queue_walk(&ulpq->reasm, pos) { + cevent = sctp_skb2event(pos); + ctsn = cevent->sndrcvinfo.sinfo_tsn; + + switch (cevent->msg_flags & SCTP_DATA_FRAG_MASK) { + case SCTP_DATA_FIRST_FRAG: + if (!first_frag) { + first_frag = pos; + next_tsn = ctsn + 1; + last_frag = pos; + } else + goto done; + break; + + case SCTP_DATA_MIDDLE_FRAG: + if (!first_frag) + return NULL; + if (ctsn == next_tsn) { + next_tsn++; + last_frag = pos; + } else + goto done; + break; + default: + return NULL; + }; + } + + /* We have the reassembled event. There is no need to look + * further. + */ +done: + retval = sctp_make_reassembled_event(first_frag, last_frag); + return retval; +} + +/* Helper function to gather skbs that have possibly become + * ordered by an an incoming chunk. + */ +static inline void sctp_ulpq_retrieve_ordered(struct sctp_ulpq *ulpq, + struct sctp_ulpevent *event) +{ + struct sk_buff *pos, *tmp; + struct sctp_ulpevent *cevent; + struct sctp_stream *in; + __u16 sid, csid; + __u16 ssn, cssn; + + sid = event->sndrcvinfo.sinfo_stream; + ssn = event->sndrcvinfo.sinfo_ssn; + in = &ulpq->asoc->ssnmap->in; + + /* We are holding the chunks by stream, by SSN. */ + sctp_skb_for_each(pos, &ulpq->lobby, tmp) { + cevent = sctp_skb2event(pos); + csid = cevent->sndrcvinfo.sinfo_stream; + cssn = cevent->sndrcvinfo.sinfo_ssn; + + /* Have we gone too far? */ + if (csid > sid) + break; + + /* Have we not gone far enough? */ + if (csid < sid) + continue; + + if (cssn != sctp_ssn_peek(in, sid)) + break; + + /* Found it, so mark in the ssnmap. */ + sctp_ssn_next(in, sid); + + __skb_unlink(pos, pos->list); + + /* Attach all gathered skbs to the event. */ + __skb_queue_tail(sctp_event2skb(event)->list, pos); + } +} + +/* Helper function to store chunks needing ordering. */ +static inline void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq, + struct sctp_ulpevent *event) +{ + struct sk_buff *pos; + struct sctp_ulpevent *cevent; + __u16 sid, csid; + __u16 ssn, cssn; + + pos = skb_peek_tail(&ulpq->lobby); + if (!pos) { + __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); + return; + } + + sid = event->sndrcvinfo.sinfo_stream; + ssn = event->sndrcvinfo.sinfo_ssn; + + cevent = sctp_skb2event(pos); + csid = cevent->sndrcvinfo.sinfo_stream; + cssn = cevent->sndrcvinfo.sinfo_ssn; + if (sid > csid) { + __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); + return; + } + + if ((sid == csid) && SSN_lt(cssn, ssn)) { + __skb_queue_tail(&ulpq->lobby, sctp_event2skb(event)); + return; + } + + /* Find the right place in this list. We store them by + * stream ID and then by SSN. + */ + skb_queue_walk(&ulpq->lobby, pos) { + cevent = sctp_skb2event(pos); + csid = cevent->sndrcvinfo.sinfo_stream; + cssn = cevent->sndrcvinfo.sinfo_ssn; + + if (csid > sid) + break; + if (csid == sid && SSN_lt(ssn, cssn)) + break; + } + + + /* Insert before pos. */ + __skb_insert(sctp_event2skb(event), pos->prev, pos, &ulpq->lobby); + +} + +static inline struct sctp_ulpevent *sctp_ulpq_order(struct sctp_ulpq *ulpq, + struct sctp_ulpevent *event) +{ + __u16 sid, ssn; + struct sctp_stream *in; + + /* Check if this message needs ordering. */ + if (SCTP_DATA_UNORDERED & event->msg_flags) + return event; + + /* Note: The stream ID must be verified before this routine. */ + sid = event->sndrcvinfo.sinfo_stream; + ssn = event->sndrcvinfo.sinfo_ssn; + in = &ulpq->asoc->ssnmap->in; + + /* Is this the expected SSN for this stream ID? */ + if (ssn != sctp_ssn_peek(in, sid)) { + /* We've received something out of order, so find where it + * needs to be placed. We order by stream and then by SSN. + */ + sctp_ulpq_store_ordered(ulpq, event); + return NULL; + } + + /* Mark that the next chunk has been found. */ + sctp_ssn_next(in, sid); + + /* Go find any other chunks that were waiting for + * ordering. + */ + sctp_ulpq_retrieve_ordered(ulpq, event); + + return event; +} + +/* Renege 'needed' bytes from the ordering queue. */ +static __u16 sctp_ulpq_renege_order(struct sctp_ulpq *ulpq, __u16 needed) +{ + __u16 freed = 0; + __u32 tsn; + struct sk_buff *skb; + struct sctp_ulpevent *event; + struct sctp_tsnmap *tsnmap; + + tsnmap = &ulpq->asoc->peer.tsn_map; + + while ((skb = __skb_dequeue_tail(&ulpq->lobby))) { + freed += skb_headlen(skb); + event = sctp_skb2event(skb); + tsn = event->sndrcvinfo.sinfo_tsn; + + sctp_ulpevent_free(event); + sctp_tsnmap_renege(tsnmap, tsn); + if (freed >= needed) + return freed; + } + + return freed; +} + +/* Renege 'needed' bytes from the reassembly queue. */ +static __u16 sctp_ulpq_renege_frags(struct sctp_ulpq *ulpq, __u16 needed) +{ + __u16 freed = 0; + __u32 tsn; + struct sk_buff *skb; + struct sctp_ulpevent *event; + struct sctp_tsnmap *tsnmap; + + tsnmap = &ulpq->asoc->peer.tsn_map; + + /* Walk backwards through the list, reneges the newest tsns. */ + while ((skb = __skb_dequeue_tail(&ulpq->reasm))) { + freed += skb_headlen(skb); + event = sctp_skb2event(skb); + tsn = event->sndrcvinfo.sinfo_tsn; + + sctp_ulpevent_free(event); + sctp_tsnmap_renege(tsnmap, tsn); + if (freed >= needed) + return freed; + } + + return freed; +} + +/* Partial deliver the first message as there is pressure on rwnd. */ +void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq, + struct sctp_chunk *chunk, int gfp) +{ + struct sctp_ulpevent *event; + struct sctp_association *asoc; + + asoc = ulpq->asoc; + + /* Are we already in partial delivery mode? */ + if (!sctp_sk(asoc->base.sk)->pd_mode) { + + /* Is partial delivery possible? */ + event = sctp_ulpq_retrieve_first(ulpq); + /* Send event to the ULP. */ + if (event) { + sctp_ulpq_tail_event(ulpq, event); + sctp_sk(asoc->base.sk)->pd_mode = 1; + ulpq->pd_mode = 1; + return; + } + } +} + +/* Renege some packets to make room for an incoming chunk. */ +void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, + int gfp) +{ + struct sctp_association *asoc; + __u16 needed, freed; + + asoc = ulpq->asoc; + + if (chunk) { + needed = ntohs(chunk->chunk_hdr->length); + needed -= sizeof(sctp_data_chunk_t); + } else + needed = SCTP_DEFAULT_MAXWINDOW; + + freed = 0; + + if (skb_queue_empty(&asoc->base.sk->receive_queue)) { + freed = sctp_ulpq_renege_order(ulpq, needed); + if (freed < needed) { + freed += sctp_ulpq_renege_frags(ulpq, needed - freed); + } + } + /* If able to free enough room, accept this chunk. */ + if (chunk && (freed >= needed)) { + __u32 tsn; + tsn = ntohl(chunk->subh.data_hdr->tsn); + sctp_tsnmap_mark(&asoc->peer.tsn_map, tsn); + sctp_ulpq_tail_data(ulpq, chunk, gfp); + + sctp_ulpq_partial_delivery(ulpq, chunk, gfp); + } + + return; +} + + + +/* Notify the application if an association is aborted and in + * partial delivery mode. Send up any pending received messages. + */ +void sctp_ulpq_abort_pd(struct sctp_ulpq *ulpq, int gfp) +{ + struct sctp_ulpevent *ev = NULL; + struct sock *sk; + + if (!ulpq->pd_mode) + return; + + sk = ulpq->asoc->base.sk; + if (sctp_ulpevent_type_enabled(SCTP_PARTIAL_DELIVERY_EVENT, + &sctp_sk(sk)->subscribe)) + ev = sctp_ulpevent_make_pdapi(ulpq->asoc, + SCTP_PARTIAL_DELIVERY_ABORTED, + gfp); + if (ev) + __skb_queue_tail(&sk->receive_queue, sctp_event2skb(ev)); + + /* If there is data waiting, send it up the socket now. */ + if (sctp_ulpq_clear_pd(ulpq) || ev) + sk->data_ready(sk, 0); +} diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/socket.c linux-2.4.23-pre8/net/socket.c --- linux-2.4.22/net/socket.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/socket.c 2003-10-22 22:48:29.000000000 +0000 @@ -325,7 +325,7 @@ * but we take care of internal coherence yet. */ -static int sock_map_fd(struct socket *sock) +int sock_map_fd(struct socket *sock) { int fd; struct qstr this; diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sunrpc/clnt.c linux-2.4.23-pre8/net/sunrpc/clnt.c --- linux-2.4.22/net/sunrpc/clnt.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/sunrpc/clnt.c 2003-10-22 22:48:31.000000000 +0000 @@ -921,6 +921,24 @@ switch ((n = ntohl(*p++))) { case RPC_SUCCESS: return p; + case RPC_PROG_UNAVAIL: + printk(KERN_WARNING "RPC: call_verify: program %u is unsupported by server %s\n", + (unsigned int)task->tk_client->cl_prog, + task->tk_client->cl_server); + goto out_eio; + case RPC_PROG_MISMATCH: + printk(KERN_WARNING "RPC: call_verify: program %u, version %u unsupported by server %s\n", + (unsigned int)task->tk_client->cl_prog, + (unsigned int)task->tk_client->cl_vers, + task->tk_client->cl_server); + goto out_eio; + case RPC_PROC_UNAVAIL: + printk(KERN_WARNING "RPC: call_verify: proc %u unsupported by program %u, version %u on server %s\n", + (unsigned int)task->tk_msg.rpc_proc, + (unsigned int)task->tk_client->cl_prog, + (unsigned int)task->tk_client->cl_vers, + task->tk_client->cl_server); + goto out_eio; case RPC_GARBAGE_ARGS: break; /* retry */ default: @@ -938,6 +956,7 @@ return NULL; } printk(KERN_WARNING "RPC: garbage, exit EIO\n"); +out_eio: rpc_exit(task, -EIO); return NULL; } diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sunrpc/svcsock.c linux-2.4.23-pre8/net/sunrpc/svcsock.c --- linux-2.4.22/net/sunrpc/svcsock.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/sunrpc/svcsock.c 2003-10-22 22:47:42.000000000 +0000 @@ -120,6 +120,8 @@ if (!(svsk->sk_flags & ( (1<sk_flags)) + return; spin_lock_bh(&serv->sv_lock); @@ -315,6 +317,9 @@ struct svc_sock *svsk = rqstp->rq_sock; struct socket *sock = svsk->sk_sock; struct msghdr msg; + char buffer[CMSG_SPACE(sizeof(struct in_pktinfo))]; + struct cmsghdr *cmh = (struct cmsghdr *)buffer; + struct in_pktinfo *pki = (struct in_pktinfo *)CMSG_DATA(cmh); int i, buflen, len; for (i = buflen = 0; i < nr; i++) @@ -324,8 +329,18 @@ msg.msg_namelen = sizeof(rqstp->rq_addr); msg.msg_iov = iov; msg.msg_iovlen = nr; - msg.msg_control = NULL; - msg.msg_controllen = 0; + if (rqstp->rq_prot == IPPROTO_UDP) { + msg.msg_control = cmh; + msg.msg_controllen = sizeof(buffer); + cmh->cmsg_len = CMSG_LEN(sizeof(*pki)); + cmh->cmsg_level = SOL_IP; + cmh->cmsg_type = IP_PKTINFO; + pki->ipi_ifindex = 0; + pki->ipi_spec_dst.s_addr = rqstp->rq_daddr; + } else { + msg.msg_control = NULL; + msg.msg_controllen = 0; + } /* This was MSG_DONTWAIT, but I now want it to wait. * The only thing that it would wait for is memory and @@ -529,6 +544,7 @@ rqstp->rq_addr.sin_family = AF_INET; rqstp->rq_addr.sin_port = skb->h.uh->source; rqstp->rq_addr.sin_addr.s_addr = skb->nh.iph->saddr; + rqstp->rq_daddr = skb->nh.iph->daddr; if (serv->sv_stats) serv->sv_stats->netudpcnt++; @@ -930,6 +946,9 @@ bufp->iov[0].iov_len = bufp->len << 2; bufp->base[0] = htonl(0x80000000|((bufp->len << 2) - 4)); + if (test_bit(SK_DEAD, &rqstp->rq_sock->sk_flags)) + return -ENOTCONN; + sent = svc_sendto(rqstp, bufp->iov, bufp->nriov); if (sent != bufp->len<<2) { printk(KERN_NOTICE "rpc-srv/tcp: %s: sent only %d bytes of %d - shutting down socket\n", @@ -1277,6 +1296,9 @@ dprintk("svc: svc_delete_socket(%p)\n", svsk); + if (test_and_set_bit(SK_DEAD, &svsk->sk_flags)) + return ; + serv = svsk->sk_server; sk = svsk->sk_sk; @@ -1293,8 +1315,6 @@ list_del(&svsk->sk_ready); - set_bit(SK_DEAD, &svsk->sk_flags); - if (!svsk->sk_inuse) { spin_unlock_bh(&serv->sv_lock); sock_release(svsk->sk_sock); diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sunrpc/timer.c linux-2.4.23-pre8/net/sunrpc/timer.c --- linux-2.4.22/net/sunrpc/timer.c 2002-11-28 23:53:16.000000000 +0000 +++ linux-2.4.23-pre8/net/sunrpc/timer.c 2003-10-22 22:48:28.000000000 +0000 @@ -8,7 +8,7 @@ #define RPC_RTO_MAX (60*HZ) #define RPC_RTO_INIT (HZ/5) -#define RPC_RTO_MIN (2) +#define RPC_RTO_MIN (HZ/10) void rpc_init_rtt(struct rpc_rtt *rt, long timeo) @@ -22,7 +22,7 @@ rt->srtt[i] = t; rt->sdrtt[i] = RPC_RTO_INIT; } - atomic_set(&rt->ntimeouts, 0); + memset(rt->ntimeouts, 0, sizeof(rt->ntimeouts)); } void diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/net/sunrpc/xprt.c linux-2.4.23-pre8/net/sunrpc/xprt.c --- linux-2.4.22/net/sunrpc/xprt.c 2003-08-25 11:44:44.000000000 +0000 +++ linux-2.4.23-pre8/net/sunrpc/xprt.c 2003-10-22 22:49:10.000000000 +0000 @@ -138,18 +138,21 @@ static int __xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task) { + struct rpc_rqst *req = task->tk_rqstp; if (!xprt->snd_task) { if (xprt->nocong || __xprt_get_cong(xprt, task)) { xprt->snd_task = task; - if (task->tk_rqstp) - task->tk_rqstp->rq_bytes_sent = 0; + if (req) { + req->rq_bytes_sent = 0; + req->rq_ntrans++; + } } } if (xprt->snd_task != task) { dprintk("RPC: %4d TCP write queue full\n", task->tk_pid); task->tk_timeout = 0; task->tk_status = -EAGAIN; - if (task->tk_rqstp && task->tk_rqstp->rq_nresend) + if (req && req->rq_ntrans) rpc_sleep_on(&xprt->resend, task, NULL, NULL); else rpc_sleep_on(&xprt->sending, task, NULL, NULL); @@ -183,9 +186,12 @@ return; } if (xprt->nocong || __xprt_get_cong(xprt, task)) { + struct rpc_rqst *req = task->tk_rqstp; xprt->snd_task = task; - if (task->tk_rqstp) - task->tk_rqstp->rq_bytes_sent = 0; + if (req) { + req->rq_bytes_sent = 0; + req->rq_ntrans++; + } } } @@ -590,14 +596,14 @@ /* Adjust congestion window */ if (!xprt->nocong) { + int timer = rpcproc_timer(clnt, task->tk_msg.rpc_proc); xprt_adjust_cwnd(xprt, copied); __xprt_put_cong(xprt, req); - if (!req->rq_nresend) { - int timer = rpcproc_timer(clnt, task->tk_msg.rpc_proc); + if (req->rq_ntrans == 1) { if (timer) rpc_update_rtt(&clnt->cl_rtt, timer, (long)jiffies - req->rq_xtime); } - rpc_clear_timeo(&clnt->cl_rtt); + rpc_set_timeo(&clnt->cl_rtt, timer, req->rq_ntrans - 1); } #ifdef RPC_PROFILE @@ -1063,7 +1069,7 @@ goto out; xprt_adjust_cwnd(req->rq_xprt, -ETIMEDOUT); - req->rq_nresend++; + __xprt_put_cong(xprt, req); dprintk("RPC: %4d xprt_timer (%s request)\n", task->tk_pid, req ? "pending" : "backlogged"); @@ -1217,8 +1223,9 @@ spin_lock_bh(&xprt->sock_lock); /* Set the task's receive timeout value */ if (!xprt->nocong) { - task->tk_timeout = rpc_calc_rto(&clnt->cl_rtt, - rpcproc_timer(clnt, task->tk_msg.rpc_proc)); + int timer = rpcproc_timer(clnt, task->tk_msg.rpc_proc); + task->tk_timeout = rpc_calc_rto(&clnt->cl_rtt, timer); + task->tk_timeout <<= rpc_ntimeo(&clnt->cl_rtt, timer); task->tk_timeout <<= clnt->cl_timeout.to_retries - req->rq_timeout.to_retries; if (task->tk_timeout > req->rq_timeout.to_maxval) diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.22/scripts/mkuboot.sh linux-2.4.23-pre8/scripts/mkuboot.sh --- linux-2.4.22/scripts/mkuboot.sh 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.4.23-pre8/scripts/mkuboot.sh 2003-10-22 22:49:21.000000000 +0000 @@ -0,0 +1,16 @@ +#!/bin/bash + +# +# Build U-Boot image when `mkimage' tool is available. +# + +MKIMAGE=$(type -path mkimage) + +if [ -z "${MKIMAGE}" ]; then + # Doesn't exist + echo '"mkimage" command not found - U-Boot images will not be built' >&2 + exit 0; +fi + +# Call "mkimage" to create U-Boot image +${MKIMAGE} "$@"